diff --git a/bitwarden-mobile.sln b/bitwarden-mobile.sln
index 3d74bd7c6..d43ad8cc3 100644
--- a/bitwarden-mobile.sln
+++ b/bitwarden-mobile.sln
@@ -44,6 +44,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Common", "test\Common\Commo
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Core.Test", "test\Core.Test\Core.Test.csproj", "{8AE548D9-A567-4E97-995E-93EC7DB0FDE0}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "iOS.Safari", "src\iOS.Safari\iOS.Safari.csproj", "{7CE47211-43D4-4BBB-BB16-82A8A337ECE7}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Ad-Hoc|Any CPU = Ad-Hoc|Any CPU
@@ -414,6 +416,36 @@ Global
{8AE548D9-A567-4E97-995E-93EC7DB0FDE0}.Release|iPhone.Build.0 = Release|Any CPU
{8AE548D9-A567-4E97-995E-93EC7DB0FDE0}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
{8AE548D9-A567-4E97-995E-93EC7DB0FDE0}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
+ {7CE47211-43D4-4BBB-BB16-82A8A337ECE7}.Ad-Hoc|Any CPU.ActiveCfg = Release|iPhone
+ {7CE47211-43D4-4BBB-BB16-82A8A337ECE7}.Ad-Hoc|Any CPU.Build.0 = Release|iPhone
+ {7CE47211-43D4-4BBB-BB16-82A8A337ECE7}.Ad-Hoc|iPhone.ActiveCfg = Release|iPhone
+ {7CE47211-43D4-4BBB-BB16-82A8A337ECE7}.Ad-Hoc|iPhone.Build.0 = Release|iPhone
+ {7CE47211-43D4-4BBB-BB16-82A8A337ECE7}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|iPhone
+ {7CE47211-43D4-4BBB-BB16-82A8A337ECE7}.Ad-Hoc|iPhoneSimulator.Build.0 = Release|iPhone
+ {7CE47211-43D4-4BBB-BB16-82A8A337ECE7}.AppStore|Any CPU.ActiveCfg = Release|iPhone
+ {7CE47211-43D4-4BBB-BB16-82A8A337ECE7}.AppStore|Any CPU.Build.0 = Release|iPhone
+ {7CE47211-43D4-4BBB-BB16-82A8A337ECE7}.AppStore|iPhone.ActiveCfg = Release|iPhone
+ {7CE47211-43D4-4BBB-BB16-82A8A337ECE7}.AppStore|iPhone.Build.0 = Release|iPhone
+ {7CE47211-43D4-4BBB-BB16-82A8A337ECE7}.AppStore|iPhoneSimulator.ActiveCfg = Release|iPhone
+ {7CE47211-43D4-4BBB-BB16-82A8A337ECE7}.AppStore|iPhoneSimulator.Build.0 = Release|iPhone
+ {7CE47211-43D4-4BBB-BB16-82A8A337ECE7}.Debug|Any CPU.ActiveCfg = Debug|iPhone
+ {7CE47211-43D4-4BBB-BB16-82A8A337ECE7}.Debug|Any CPU.Build.0 = Debug|iPhone
+ {7CE47211-43D4-4BBB-BB16-82A8A337ECE7}.Debug|iPhone.ActiveCfg = Debug|iPhone
+ {7CE47211-43D4-4BBB-BB16-82A8A337ECE7}.Debug|iPhone.Build.0 = Debug|iPhone
+ {7CE47211-43D4-4BBB-BB16-82A8A337ECE7}.Debug|iPhoneSimulator.ActiveCfg = Debug|iPhoneSimulator
+ {7CE47211-43D4-4BBB-BB16-82A8A337ECE7}.Debug|iPhoneSimulator.Build.0 = Debug|iPhoneSimulator
+ {7CE47211-43D4-4BBB-BB16-82A8A337ECE7}.FDroid|Any CPU.ActiveCfg = Release|iPhone
+ {7CE47211-43D4-4BBB-BB16-82A8A337ECE7}.FDroid|Any CPU.Build.0 = Release|iPhone
+ {7CE47211-43D4-4BBB-BB16-82A8A337ECE7}.FDroid|iPhone.ActiveCfg = Release|iPhone
+ {7CE47211-43D4-4BBB-BB16-82A8A337ECE7}.FDroid|iPhone.Build.0 = Release|iPhone
+ {7CE47211-43D4-4BBB-BB16-82A8A337ECE7}.FDroid|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator
+ {7CE47211-43D4-4BBB-BB16-82A8A337ECE7}.FDroid|iPhoneSimulator.Build.0 = Release|iPhoneSimulator
+ {7CE47211-43D4-4BBB-BB16-82A8A337ECE7}.Release|Any CPU.ActiveCfg = Release|iPhone
+ {7CE47211-43D4-4BBB-BB16-82A8A337ECE7}.Release|Any CPU.Build.0 = Release|iPhone
+ {7CE47211-43D4-4BBB-BB16-82A8A337ECE7}.Release|iPhone.ActiveCfg = Release|iPhone
+ {7CE47211-43D4-4BBB-BB16-82A8A337ECE7}.Release|iPhone.Build.0 = Release|iPhone
+ {7CE47211-43D4-4BBB-BB16-82A8A337ECE7}.Release|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator
+ {7CE47211-43D4-4BBB-BB16-82A8A337ECE7}.Release|iPhoneSimulator.Build.0 = Release|iPhoneSimulator
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -431,6 +463,7 @@ Global
{8A3ECD75-3EC8-4CB3-B3A2-A73A724C279A} = {D10CA4A9-F866-40E1-B658-F69051236C71}
{4085B0A5-12A9-4993-B8B8-4ACE72E62E39} = {8904C536-C67D-420F-9971-51B26574C3AA}
{8AE548D9-A567-4E97-995E-93EC7DB0FDE0} = {8904C536-C67D-420F-9971-51B26574C3AA}
+ {7CE47211-43D4-4BBB-BB16-82A8A337ECE7} = {D10CA4A9-F866-40E1-B658-F69051236C71}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {7D436EA3-8B7E-45D2-8D14-0730BD2E0410}
diff --git a/src/iOS.Safari/ActionViewController.cs b/src/iOS.Safari/ActionViewController.cs
new file mode 100644
index 000000000..fd8843e9c
--- /dev/null
+++ b/src/iOS.Safari/ActionViewController.cs
@@ -0,0 +1,73 @@
+using System;
+
+using MobileCoreServices;
+using Foundation;
+using UIKit;
+
+namespace iOS.Safari
+{
+ public partial class ActionViewController : UIViewController
+ {
+ protected ActionViewController(IntPtr handle) : base(handle)
+ {
+ // Note: this .ctor should not contain any initialization logic.
+ }
+
+ public override void DidReceiveMemoryWarning()
+ {
+ // Releases the view if it doesn't have a superview.
+ base.DidReceiveMemoryWarning();
+
+ // Release any cached data, images, etc that aren't in use.
+ }
+
+ public override void ViewDidLoad()
+ {
+ base.ViewDidLoad();
+
+ // Get the item[s] we're handling from the extension context.
+
+ // For example, look for an image and place it into an image view.
+ // Replace this with something appropriate for the type[s] your extension supports.
+ bool imageFound = false;
+
+ foreach (var item in ExtensionContext.InputItems)
+ {
+ foreach (var itemProvider in item.Attachments)
+ {
+ if (itemProvider.HasItemConformingTo(UTType.Image))
+ {
+ // This is an image. We'll load it, then place it in our image view.
+ itemProvider.LoadItem(UTType.Image, null, delegate (NSObject image, NSError error)
+ {
+ var url = image as NSUrl;
+ if (url != null)
+ {
+ NSOperationQueue.MainQueue.AddOperation(delegate
+ {
+ imageView.Image = UIImage.LoadFromData(NSData.FromUrl(url));
+ });
+ }
+ });
+
+ imageFound = true;
+ break;
+ }
+ }
+
+ if (imageFound)
+ {
+ // We only handle one image, so stop looking for more.
+ break;
+ }
+ }
+ }
+
+ partial void DoneClicked(NSObject sender)
+ {
+ // Return any edited content to the host app.
+ // This template doesn't do anything, so we just echo the passed-in items.
+ ExtensionContext.CompleteRequest(ExtensionContext.InputItems, null);
+ }
+ }
+}
diff --git a/src/iOS.Safari/ActionViewController.designer.cs b/src/iOS.Safari/ActionViewController.designer.cs
new file mode 100644
index 000000000..7a17090c7
--- /dev/null
+++ b/src/iOS.Safari/ActionViewController.designer.cs
@@ -0,0 +1,24 @@
+//
+// This file has been generated automatically by MonoDevelop to store outlets and
+// actions made in the Xcode designer. If it is removed, they will be lost.
+// Manual changes to this file may not be handled correctly.
+//
+using Foundation;
+
+namespace iOS.Safari
+{
+ [Register("ActionViewController")]
+ partial class ActionViewController
+ {
+ [Outlet]
+ UIKit.UIImageView imageView { get; set; }
+
+ [Action("DoneClicked:")]
+ partial void DoneClicked(Foundation.NSObject sender);
+
+ void ReleaseDesignerOutlets()
+ {
+ }
+ }
+}
+
diff --git a/src/iOS.Safari/Entitlements.plist b/src/iOS.Safari/Entitlements.plist
new file mode 100644
index 000000000..9ae599370
--- /dev/null
+++ b/src/iOS.Safari/Entitlements.plist
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/src/iOS.Safari/Info.plist b/src/iOS.Safari/Info.plist
new file mode 100644
index 000000000..de53969d0
--- /dev/null
+++ b/src/iOS.Safari/Info.plist
@@ -0,0 +1,31 @@
+
+
+
+
+ CFBundleDisplayName
+ iOS.Safari
+ CFBundleName
+ iOS.Safari
+ CFBundleIdentifier
+ com.8bit.bitwarden.iOS-Safari
+ CFBundleDevelopmentRegion
+ en
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundlePackageType
+ XPC!
+ CFBundleShortVersionString
+ 2.14.3
+ CFBundleVersion
+ 1
+ MinimumOSVersion
+ 15.0
+ NSExtension
+
+ NSExtensionPointIdentifier
+ com.apple.Safari.web-extension
+ NSExtensionPrincipalClass
+ SafariWebExtensionHandler
+
+
+
diff --git a/src/iOS.Safari/Resources/_locales/az/messages.json b/src/iOS.Safari/Resources/_locales/az/messages.json
new file mode 100644
index 000000000..163030b35
--- /dev/null
+++ b/src/iOS.Safari/Resources/_locales/az/messages.json
@@ -0,0 +1,1817 @@
+{
+ "appName": {
+ "message": "Bitwarden"
+ },
+ "extName": {
+ "message": "Bitwarden - Ödənişsiz Parol Meneceri",
+ "description": "Extension name, MUST be less than 40 characters (Safari restriction)"
+ },
+ "extDesc": {
+ "message": "Bütün cihazlarınız üçün təhlükəsiz və ödənişsiz bir parol meneceri.",
+ "description": "Extension description"
+ },
+ "loginOrCreateNewAccount": {
+ "message": "Təhlükəsiz anbarınıza müraciət etmək üçün giriş edin və ya yeni bir hesab yaradın."
+ },
+ "createAccount": {
+ "message": "Hesab yarat"
+ },
+ "login": {
+ "message": "Giriş et"
+ },
+ "enterpriseSingleSignOn": {
+ "message": "Müəssisə üçün tək daxil olma"
+ },
+ "cancel": {
+ "message": "İmtina"
+ },
+ "close": {
+ "message": "Bağla"
+ },
+ "submit": {
+ "message": "Göndər"
+ },
+ "emailAddress": {
+ "message": "E-poçt ünvanı"
+ },
+ "masterPass": {
+ "message": "Ana parol"
+ },
+ "masterPassDesc": {
+ "message": "Ana parol, anbarınıza müraciət etmək üçün istifadə edəcəyiniz paroldur. Ana parolu yadda saxlamaq çox vacibdir. Unutsanız, parolu bərpa etməyin heç bir yolu yoxdur."
+ },
+ "masterPassHintDesc": {
+ "message": "Ana parol məsləhəti, unutduğunuz parolunuzu xatırlamağınıza kömək edir."
+ },
+ "reTypeMasterPass": {
+ "message": "Ana parolu yenidən yaz"
+ },
+ "masterPassHint": {
+ "message": "Ana parol məsləhəti (ixtiyari)"
+ },
+ "tab": {
+ "message": "Vərəq"
+ },
+ "myVault": {
+ "message": "Anbarım"
+ },
+ "tools": {
+ "message": "Alətlər"
+ },
+ "settings": {
+ "message": "Tənzimləmələr"
+ },
+ "currentTab": {
+ "message": "Hazırkı vərəq"
+ },
+ "copyPassword": {
+ "message": "Parolu kopyala"
+ },
+ "copyNote": {
+ "message": "Qeydi kopyala"
+ },
+ "copyUri": {
+ "message": "URI-ni kopyala"
+ },
+ "copyUsername": {
+ "message": "İstifadəçi adını kopyala"
+ },
+ "copyNumber": {
+ "message": "Nömrəni kopyala"
+ },
+ "copySecurityCode": {
+ "message": "Təhlükəsizlik kodunu kopyala"
+ },
+ "autoFill": {
+ "message": "Avto-doldurma"
+ },
+ "generatePasswordCopied": {
+ "message": "Parol yarat (kopyalandı)"
+ },
+ "copyElementIdentifier": {
+ "message": "Özəl sahə adını kopyala"
+ },
+ "noMatchingLogins": {
+ "message": "Uyğun gələn hesab yoxdur."
+ },
+ "vaultLocked": {
+ "message": "Anbar kilidlənib."
+ },
+ "vaultLoggedOut": {
+ "message": "Anbardan çıxış edildi."
+ },
+ "autoFillInfo": {
+ "message": "Hazırkı səyyah vərəqi üçün avto-doldurulacaq giriş məlumatları yoxdur."
+ },
+ "addLogin": {
+ "message": "Hesab əlavə et"
+ },
+ "addItem": {
+ "message": "Element əlavə et"
+ },
+ "passwordHint": {
+ "message": "Parol məsləhəti"
+ },
+ "enterEmailToGetHint": {
+ "message": "Ana parol məsləhətini alacağınız hesabınızın e-poçt ünvanını daxil edin."
+ },
+ "getMasterPasswordHint": {
+ "message": "Ana parol üçün məsləhət alın"
+ },
+ "continue": {
+ "message": "Davam"
+ },
+ "verificationCode": {
+ "message": "Təsdiqləmə kodu"
+ },
+ "account": {
+ "message": "Hesab"
+ },
+ "changeMasterPassword": {
+ "message": "Ana parolu dəyişdir"
+ },
+ "fingerprintPhrase": {
+ "message": "Barmaq izi ifadəsi",
+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
+ },
+ "yourAccountsFingerprint": {
+ "message": "Hesabınızın barmaq izi ifadəsi",
+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
+ },
+ "twoStepLogin": {
+ "message": "İki mərhələli giriş"
+ },
+ "logOut": {
+ "message": "Çıxış"
+ },
+ "about": {
+ "message": "Haqqında"
+ },
+ "version": {
+ "message": "Versiya"
+ },
+ "save": {
+ "message": "Saxla"
+ },
+ "move": {
+ "message": "Daşı"
+ },
+ "addFolder": {
+ "message": "Qovluq əlavə et"
+ },
+ "name": {
+ "message": "Ad"
+ },
+ "editFolder": {
+ "message": "Qovluğa düzəliş et"
+ },
+ "deleteFolder": {
+ "message": "Qovluğu sil"
+ },
+ "folders": {
+ "message": "Qovluqlar"
+ },
+ "noFolders": {
+ "message": "Siyahılanacaq heç bir qovluq yoxdur."
+ },
+ "helpFeedback": {
+ "message": "Kömək və əks əlaqə"
+ },
+ "sync": {
+ "message": "Eyniləşdirmə"
+ },
+ "syncVaultNow": {
+ "message": "Anbarı indi eyniləşdir"
+ },
+ "lastSync": {
+ "message": "Son eyniləşdirmə:"
+ },
+ "passGen": {
+ "message": "Parol yaradıcı"
+ },
+ "generator": {
+ "message": "Yaradıcı",
+ "description": "Short for 'Password Generator'."
+ },
+ "passGenInfo": {
+ "message": "Hesablarınız üçün avtomatik olaraq güclü, unikal parollar yaradın."
+ },
+ "bitWebVault": {
+ "message": "Bitwarden veb anbarı"
+ },
+ "importItems": {
+ "message": "Elementləri idxal et"
+ },
+ "select": {
+ "message": "Seçin"
+ },
+ "generatePassword": {
+ "message": "Parol yarat"
+ },
+ "regeneratePassword": {
+ "message": "Parolu yenidən yarat"
+ },
+ "options": {
+ "message": "Seçimlər"
+ },
+ "length": {
+ "message": "Uzunluq"
+ },
+ "numWords": {
+ "message": "Söz sayı"
+ },
+ "wordSeparator": {
+ "message": "Söz ayırıcı"
+ },
+ "capitalize": {
+ "message": "İlk hərfi böyük yaz",
+ "description": "Make the first letter of a work uppercase."
+ },
+ "includeNumber": {
+ "message": "Rəqəm əlavə et"
+ },
+ "minNumbers": {
+ "message": "Minimum rəqəm"
+ },
+ "minSpecial": {
+ "message": "Minimum simvol"
+ },
+ "avoidAmbChar": {
+ "message": "Anlaşılmaz simvollardan çəkinin"
+ },
+ "searchVault": {
+ "message": "Anbarda axtar"
+ },
+ "edit": {
+ "message": "Düzəliş et"
+ },
+ "view": {
+ "message": "Bax"
+ },
+ "noItemsInList": {
+ "message": "Siyahılanacaq heç bir element yoxdur."
+ },
+ "itemInformation": {
+ "message": "Element məlumatları"
+ },
+ "username": {
+ "message": "İstifadəçi adı"
+ },
+ "password": {
+ "message": "Parol"
+ },
+ "passphrase": {
+ "message": "Uzun ifadə"
+ },
+ "favorite": {
+ "message": "Sevimli"
+ },
+ "notes": {
+ "message": "Qeydlər"
+ },
+ "note": {
+ "message": "Qeyd"
+ },
+ "editItem": {
+ "message": "Elementə düzəliş et"
+ },
+ "folder": {
+ "message": "Qovluq"
+ },
+ "deleteItem": {
+ "message": "Elementi sil"
+ },
+ "viewItem": {
+ "message": "Elementə bax"
+ },
+ "launch": {
+ "message": "Başlat"
+ },
+ "website": {
+ "message": "Veb sayt"
+ },
+ "toggleVisibility": {
+ "message": "Görünməni aç/bağla"
+ },
+ "manage": {
+ "message": "İdarə et"
+ },
+ "other": {
+ "message": "Digər"
+ },
+ "rateExtension": {
+ "message": "Genişləndirməni qiymətləndir"
+ },
+ "rateExtensionDesc": {
+ "message": "Gözəl bir rəy ilə bizə dəstək ola bilərsiniz!"
+ },
+ "browserNotSupportClipboard": {
+ "message": "Veb səyyahınız lövhəyə kopyalamağı dəstəkləmir. Əvəzində əllə kopyalayın."
+ },
+ "verifyMasterPassword": {
+ "message": "Ana parolu təsdiqlə"
+ },
+ "yourVaultIsLocked": {
+ "message": "Anbarınız kilidlənib. Davam etmək üçün ana parolunuzu təsdiqləyin."
+ },
+ "unlock": {
+ "message": "Kilidi aç"
+ },
+ "loggedInAsOn": {
+ "message": "$HOSTNAME$ üzərində $EMAIL$ kimi giriş edildi.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "name@example.com"
+ },
+ "hostname": {
+ "content": "$2",
+ "example": "bitwarden.com"
+ }
+ }
+ },
+ "invalidMasterPassword": {
+ "message": "Etibarsız ana parol"
+ },
+ "vaultTimeout": {
+ "message": "Anbara müraciət bitəcək"
+ },
+ "lockNow": {
+ "message": "İndi kilidlə"
+ },
+ "immediately": {
+ "message": "Dərhal"
+ },
+ "tenSeconds": {
+ "message": "10 saniyə"
+ },
+ "twentySeconds": {
+ "message": "20 saniyə"
+ },
+ "thirtySeconds": {
+ "message": "30 saniyə"
+ },
+ "oneMinute": {
+ "message": "1 dəqiqə"
+ },
+ "twoMinutes": {
+ "message": "2 dəqiqə"
+ },
+ "fiveMinutes": {
+ "message": "5 dəqiqə"
+ },
+ "fifteenMinutes": {
+ "message": "15 dəqiqə"
+ },
+ "thirtyMinutes": {
+ "message": "30 dəqiqə"
+ },
+ "oneHour": {
+ "message": "1 saat"
+ },
+ "fourHours": {
+ "message": "4 saat"
+ },
+ "onLocked": {
+ "message": "Sistem kilidlənəndə"
+ },
+ "onRestart": {
+ "message": "Səyyah yenidən başladılanda"
+ },
+ "never": {
+ "message": "Heç vaxt"
+ },
+ "security": {
+ "message": "Təhlükəsizlik"
+ },
+ "errorOccurred": {
+ "message": "Bir xəta baş verdi"
+ },
+ "emailRequired": {
+ "message": "E-poçt ünvanı lazımdır."
+ },
+ "invalidEmail": {
+ "message": "Etibarsız e-poçt ünvanı."
+ },
+ "masterPassRequired": {
+ "message": "Ana parol lazımdır."
+ },
+ "masterPassLength": {
+ "message": "Ana parol ən azı 8 simvol uzunluğunda olmalıdır."
+ },
+ "masterPassDoesntMatch": {
+ "message": "Ana parol təsdiqləməsi uyğun gəlmir."
+ },
+ "newAccountCreated": {
+ "message": "Yeni hesabınız yaradıldı! İndi giriş edə bilərsiniz."
+ },
+ "masterPassSent": {
+ "message": "Ana parol məsləhətini ehtiva edən bir e-poçt göndərdik."
+ },
+ "verificationCodeRequired": {
+ "message": "Təsdiq kodu lazımdır."
+ },
+ "valueCopied": {
+ "message": "$VALUE$ kopyalandı",
+ "description": "Value has been copied to the clipboard.",
+ "placeholders": {
+ "value": {
+ "content": "$1",
+ "example": "Password"
+ }
+ }
+ },
+ "autofillError": {
+ "message": "Bu səhifədə seçilən element avto-doldurulmur. Əvəzində məlumatları kopyalayıb yapışdırın."
+ },
+ "loggedOut": {
+ "message": "Çıxış edildi"
+ },
+ "loginExpired": {
+ "message": "Seansın müddəti bitdi."
+ },
+ "logOutConfirmation": {
+ "message": "Çıxış etmək istədiyinizə əminsiniz?"
+ },
+ "yes": {
+ "message": "Bəli"
+ },
+ "no": {
+ "message": "Xeyr"
+ },
+ "unexpectedError": {
+ "message": "Gözlənilməz bir səhv baş verdi"
+ },
+ "nameRequired": {
+ "message": "Ad lazımdır."
+ },
+ "addedFolder": {
+ "message": "Qovluq əlavə edildi"
+ },
+ "changeMasterPass": {
+ "message": "Ana parolu dəyişdir"
+ },
+ "changeMasterPasswordConfirmation": {
+ "message": "Ana parolunuzu bitwarden.com veb anbarında dəyişdirə bilərsiniz. İndi saytı ziyarət etmək istəyirsiniz?"
+ },
+ "twoStepLoginConfirmation": {
+ "message": "İki mərhələli giriş, təhlükəsizlik açarı, kimlik təsdiqləyici tətbiq, SMS, telefon zəngi və ya e-poçt kimi digər cihazlarla girişinizi təsdiqləməyinizi tələb edərək hesabınızı daha da təhlükəsiz edir. İki mərhələli giriş, bitwarden.com veb anbarında fəallaşdırıla bilər. Veb saytı indi ziyarət etmək istəyirsiniz?"
+ },
+ "editedFolder": {
+ "message": "Qovluğa düzəliş edildi"
+ },
+ "deleteFolderConfirmation": {
+ "message": "Bu qovluğu silmək istədiyinizə əminsiniz?"
+ },
+ "deletedFolder": {
+ "message": "Qovluq silindi"
+ },
+ "gettingStartedTutorial": {
+ "message": "Başlanğıc təlimatı"
+ },
+ "gettingStartedTutorialVideo": {
+ "message": "Səyyah genişləndirməsindən necə daha yaxşı faydalanmağı öyrənmək üçün başlanğıc təlimatına baxa bilərsiniz."
+ },
+ "syncingComplete": {
+ "message": "Eyniləşdirmə tamamlandı"
+ },
+ "syncingFailed": {
+ "message": "Uğursuz eyniləşdirmə"
+ },
+ "passwordCopied": {
+ "message": "Parol kopyalandı"
+ },
+ "uri": {
+ "message": "URI"
+ },
+ "uriPosition": {
+ "message": "URI $POSITION$",
+ "description": "A listing of URIs. Ex: URI 1, URI 2, URI 3, etc.",
+ "placeholders": {
+ "position": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "newUri": {
+ "message": "Yeni URI"
+ },
+ "addedItem": {
+ "message": "Element əlavə edildi"
+ },
+ "editedItem": {
+ "message": "Elementə düzəliş edildi"
+ },
+ "deleteItemConfirmation": {
+ "message": "Həqiqətən tullantı qutusuna göndərmək istəyirsiniz?"
+ },
+ "deletedItem": {
+ "message": "Element tullantı qutusuna göndərildi"
+ },
+ "overwritePassword": {
+ "message": "Parolun üzərinə yaz"
+ },
+ "overwritePasswordConfirmation": {
+ "message": "Hazırkı parolun üzərinə yazmaq istədiyinizə əminsiniz?"
+ },
+ "searchFolder": {
+ "message": "Qovluq axtar"
+ },
+ "searchCollection": {
+ "message": "Kolleksiya axtar"
+ },
+ "searchType": {
+ "message": "Axtarış növü"
+ },
+ "noneFolder": {
+ "message": "Qovluq yoxdur",
+ "description": "This is the folder for uncategorized items"
+ },
+ "disableAddLoginNotification": {
+ "message": "\"Hesab əlavə et\" bildirişini sıradan çıxart"
+ },
+ "addLoginNotificationDesc": {
+ "message": "\"Hesab əlavə et bildirişi\", ilk dəfə giriş edəndə yeni giriş məlumatlarını anbarda saxlamaq istəyib-istəmədiyinizi avtomatik olaraq soruşur."
+ },
+ "dontShowCardsCurrentTab": {
+ "message": "Vərəq səhifəsində kartları göstərmə"
+ },
+ "dontShowCardsCurrentTabDesc": {
+ "message": "Anbarınızdakı kart elementləri, avto-doldurma müraciətini asanlaşdırmaq üçün \"Hazırkı vərəq\" səhifəsində siyahılanır."
+ },
+ "dontShowIdentitiesCurrentTab": {
+ "message": "Vərəq səhifəsində kimlikləri göstərmə"
+ },
+ "dontShowIdentitiesCurrentTabDesc": {
+ "message": "Anbarınızdakı kimlik elementləri, avto-doldurma müraciətini asanlaşdırmaq üçün \"Hazırkı vərəq\" səhifəsində siyahılanır."
+ },
+ "clearClipboard": {
+ "message": "Lövhəni təmizlə",
+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
+ },
+ "clearClipboardDesc": {
+ "message": "Kopyalanmış dəyərləri lövhədən avtomatik təmizlə.",
+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
+ },
+ "notificationAddDesc": {
+ "message": "Bitwarden sizin üçün bu parolu xatırlasın?"
+ },
+ "notificationAddSave": {
+ "message": "Bəli, indi saxla"
+ },
+ "notificationNeverSave": {
+ "message": "Bu veb sayt üçüm heç vaxt"
+ },
+ "disableChangedPasswordNotification": {
+ "message": "\"Parol dəyişdirildi\" bildirişini sıradan çıxart"
+ },
+ "disableChangedPasswordNotificationDesc": {
+ "message": "\"Parol dəyişdirildi bildirişi\", bir veb saytında parolu dəyişdirdiyinizi aşkarlayanda, anbarınızda qeyd etdiyiniz parolu yeniləməyinizi avtomatik olaraq soruşur."
+ },
+ "notificationChangeDesc": {
+ "message": "Bu parolu \"Bitwarden\"də yeniləmək istəyirsiniz?"
+ },
+ "notificationChangeSave": {
+ "message": "Bəli, indi yenilə"
+ },
+ "disableContextMenuItem": {
+ "message": "Kontekst menyu seçimlərini sıradan çıxart"
+ },
+ "disableContextMenuItemDesc": {
+ "message": "Kontekst menyu seçimləri, hazırkı vərəqinizdə veb sayt üçün parol yaratma və giriş etmə əməliyyatlarına cəld müraciəti təmin edir."
+ },
+ "defaultUriMatchDetection": {
+ "message": "İlkin URI uyğunluq aşkarlaması",
+ "description": "Default URI match detection for auto-fill."
+ },
+ "defaultUriMatchDetectionDesc": {
+ "message": "Avto-doldurma kimi əməliyyatları icra edərkən giriş etmə prosesi üçün URI uyğunluq aşkarlamasının ilkin yolunu seçin."
+ },
+ "theme": {
+ "message": "Tema"
+ },
+ "themeDesc": {
+ "message": "Tətbiqin rəng temasını dəyişdirin."
+ },
+ "dark": {
+ "message": "Tünd",
+ "description": "Dark color"
+ },
+ "light": {
+ "message": "Açıq",
+ "description": "Light color"
+ },
+ "solarizedDark": {
+ "message": "Günəşli tünd",
+ "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated."
+ },
+ "exportVault": {
+ "message": "Anbarı ixrac et"
+ },
+ "fileFormat": {
+ "message": "Fayl formatı"
+ },
+ "warning": {
+ "message": "XƏBƏRDARLIQ",
+ "description": "WARNING (should stay in capitalized letters if the language permits)"
+ },
+ "confirmVaultExport": {
+ "message": "Anbarın ixracını təsdiqləyin"
+ },
+ "exportWarningDesc": {
+ "message": "Bu ixrac faylındakı anbar verilənləriniz şifrələnməmiş formatdadır. İxrac edilən faylı saxlamamalı və etibarsız yollarla (e-poçt kimi) göndərməməlisiniz. Bu faylı işiniz bitdikdən sonra dərhal silin."
+ },
+ "encExportKeyWarningDesc": {
+ "message": "Bu ixrac faylı, hesabınızın şifrələmə açarını istifadə edərək verilənlərinizi şifrələyir. Hesabınızın şifrələmə açarını döndərsəniz, bu ixrac faylının şifrəsini aça bilməyəcəyiniz üçün yenidən ixrac etməli olacaqsınız."
+ },
+ "encExportAccountWarningDesc": {
+ "message": "Hesab şifrələmə açarları, hər Bitwarden istifadəçi hesabı üçün unikaldır, buna görə də şifrələnmiş bir ixracı, fərqli bir hesaba idxal edə bilməzsiniz."
+ },
+ "exportMasterPassword": {
+ "message": "Anbar verilənlərinizi ixrac etmək üçün ana parolunuzu daxil edin."
+ },
+ "shared": {
+ "message": "Paylaşılan"
+ },
+ "learnOrg": {
+ "message": "Təşkilatlar barədə daha ətraflı"
+ },
+ "learnOrgConfirmation": {
+ "message": "Bitwarden, bir təşkilat hesabı istifadə edərək anbar elementlərinizi başqaları ilə paylaşmağınıza icazə verər. Daha ətraflı məlumat üçün bitwarden.com saytını ziyarət etmək istəyirsiniz?"
+ },
+ "moveToOrganization": {
+ "message": "Təşkilata daşı"
+ },
+ "share": {
+ "message": "Paylaş"
+ },
+ "movedItemToOrg": {
+ "message": "$ITEMNAME$ $ORGNAME$ şirkətinə daşındı",
+ "placeholders": {
+ "itemname": {
+ "content": "$1",
+ "example": "Secret Item"
+ },
+ "orgname": {
+ "content": "$2",
+ "example": "Company Name"
+ }
+ }
+ },
+ "moveToOrgDesc": {
+ "message": "Bu elementi daşımaq istədiyiniz təşkilatı seçin. Bir təşkilata daşımaq, elementin sahibliyini də həmin təşkilata daşıyacaq. Daşıdıqdan sonra bu elementə birbaşa sahibliyiniz olmayacaq."
+ },
+ "learnMore": {
+ "message": "Daha ətraflı"
+ },
+ "authenticatorKeyTotp": {
+ "message": "Kimlik təsdiqləyici açarı (TOTP)"
+ },
+ "verificationCodeTotp": {
+ "message": "Təsdiqləmə kodu (TOTP)"
+ },
+ "copyVerificationCode": {
+ "message": "Təsdiqləmə kodunu kopyala"
+ },
+ "attachments": {
+ "message": "Qoşmalar"
+ },
+ "deleteAttachment": {
+ "message": "Qoşmanı sil"
+ },
+ "deleteAttachmentConfirmation": {
+ "message": "Bu qoşmanı silmək istədiyinizə əminsiniz?"
+ },
+ "deletedAttachment": {
+ "message": "Qoşma silindi"
+ },
+ "newAttachment": {
+ "message": "Yeni qoşma əlavə et"
+ },
+ "noAttachments": {
+ "message": "Qoşma yoxdur."
+ },
+ "attachmentSaved": {
+ "message": "Qoşma saxlanıldı."
+ },
+ "file": {
+ "message": "Fayl"
+ },
+ "selectFile": {
+ "message": "Fayl seçin."
+ },
+ "maxFileSize": {
+ "message": "Maksimal fayl həcmi 500 MB-dır"
+ },
+ "featureUnavailable": {
+ "message": "Özəllik əlçatmazdır"
+ },
+ "updateKey": {
+ "message": "Şifrələmə açarınızı yeniləyənə qədər bu özəlliyi istifadə edə bilməzsiniz."
+ },
+ "premiumMembership": {
+ "message": "Premium üzvlük"
+ },
+ "premiumManage": {
+ "message": "Üzvlüyü idarə edin"
+ },
+ "premiumManageAlert": {
+ "message": "Üzvlüyünüzü bitwarden.com veb anbarında idarə edə bilərsiniz. İndi saytı ziyarət etmək istəyirsiniz?"
+ },
+ "premiumRefresh": {
+ "message": "Üzvlüyü təzələ"
+ },
+ "premiumNotCurrentMember": {
+ "message": "Hazırda premium bir üzvlüyünüz yoxdur"
+ },
+ "premiumSignUpAndGet": {
+ "message": "Premium üzvlük üçün qeydiyyatdan keçin və bunları əldə edin:"
+ },
+ "ppremiumSignUpStorage": {
+ "message": "Fayl qoşmaları üçün 1 GB şifrələnmiş saxlama sahəsi"
+ },
+ "ppremiumSignUpTwoStep": {
+ "message": "YubiKey, FIDO U2F və Duo kimi iki mərhələli giriş seçimləri"
+ },
+ "ppremiumSignUpReports": {
+ "message": "Anbarınızın təhlükəsiyini təmin etmək üçün parol gigiyenası, hesab sağlamlığı və verilənlərin pozulması hesabatları."
+ },
+ "ppremiumSignUpTotp": {
+ "message": "Anbarınızdakı hesablar üçün TOTP təsdiqləmə kodu (2FA) yaradıcısı."
+ },
+ "ppremiumSignUpSupport": {
+ "message": "Prioritet müştəri dəstəyi."
+ },
+ "ppremiumSignUpFuture": {
+ "message": "Bütün gələcək premium özəlliklər. Daha çoxu tezliklə!"
+ },
+ "premiumPurchase": {
+ "message": "Premium satın al"
+ },
+ "premiumPurchaseAlert": {
+ "message": "Premium üzvlüyü bitwarden.com veb anbarında satın ala bilərsiniz. İndi saytı ziyarət etmək istəyirsiniz?"
+ },
+ "premiumCurrentMember": {
+ "message": "Premium üzvsünüz!"
+ },
+ "premiumCurrentMemberThanks": {
+ "message": "Bitwarden-i dəstəklədiyiniz üçün təşəkkürlər!"
+ },
+ "premiumPrice": {
+ "message": "Hamısı sadəcə ildə $PRICE$!",
+ "placeholders": {
+ "price": {
+ "content": "$1",
+ "example": "$10"
+ }
+ }
+ },
+ "refreshComplete": {
+ "message": "Təzələmə tamamlandı"
+ },
+ "disableAutoTotpCopy": {
+ "message": "Avtomatik TOTP kopyalamasını sıradan çıxart"
+ },
+ "disableAutoTotpCopyDesc": {
+ "message": "Hesabınıza əlavə edilən kimlik təsdiqləyici açarı varsa, giriş məlumatları avto-doldurulanda TOTP təsdiqləmə kodu da avtomatik olaraq lövhəyə kopyalanacaq."
+ },
+ "disableAutoBiometricsPrompt": {
+ "message": "Açılışda biometrik üçün soruşma"
+ },
+ "premiumRequired": {
+ "message": "Premium üzvlük lazımdır"
+ },
+ "premiumRequiredDesc": {
+ "message": "Bu özəlliyi istifadə etmək üçün premium üzvlük lazımdır."
+ },
+ "enterVerificationCodeApp": {
+ "message": "Kimlik təsdiqləyici tətbiqindən 6 rəqəmli təsdiqləmə kodunu daxil edin."
+ },
+ "enterVerificationCodeEmail": {
+ "message": "$EMAIL$ ünvanına göndərilən e-poçtdakı 6 rəqəmli təsdiqləmə kodunu daxil edin.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "example@gmail.com"
+ }
+ }
+ },
+ "verificationCodeEmailSent": {
+ "message": "Təsdiqləmə poçtu $EMAIL$ ünvanına göndərildi.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "example@gmail.com"
+ }
+ }
+ },
+ "rememberMe": {
+ "message": "Məni xatırla"
+ },
+ "sendVerificationCodeEmailAgain": {
+ "message": "Təsdiqləmə kodu olan e-poçtu yenidən göndər"
+ },
+ "useAnotherTwoStepMethod": {
+ "message": "Başqa bir iki mərhələli giriş metodu istifadə edin"
+ },
+ "insertYubiKey": {
+ "message": "\"YubiKey\"i kompüterinizin USB portuna taxın, daha sonra düyməsinə toxunun."
+ },
+ "insertU2f": {
+ "message": "Təhlükəsizlik açarını kompüterinizin USB portun taxın. Düyməsi varsa toxunun."
+ },
+ "webAuthnNewTab": {
+ "message": "WebAuthn 2FA təsdiqləməsini başladın. Yeni bir vərəq açmaq üçün aşağıdakı düyməyə klikləyin və yeni vərəqdəki təlimatları izləyin."
+ },
+ "webAuthnNewTabOpen": {
+ "message": "Yeni vərəq aç"
+ },
+ "webAuthnAuthenticate": {
+ "message": "WebAuthn təsdiqləmə"
+ },
+ "loginUnavailable": {
+ "message": "Giriş edilə bilmir"
+ },
+ "noTwoStepProviders": {
+ "message": "Bu hesabın iki mərhələli giriş özəlliyi fəaldır, ancaq, konfiqurasiya edilmiş iki mərhələli təchizatçıların heç biri bu səyyah tərəfindən dəstəklənmir."
+ },
+ "noTwoStepProviders2": {
+ "message": "Zəhmət olmasa (Chrome kimi) dəstəklənən bir veb səyyah istifadə edin və/və ya veb səyyahlara (kimlik təsdiqləyici tətbiq kimi) daha yaxşı dəstəklənən təchizatçılar əlavə edin."
+ },
+ "twoStepOptions": {
+ "message": "İki mərhələli giriş seçimləri"
+ },
+ "recoveryCodeDesc": {
+ "message": "İki mərhələli təsdiqləmə təchizatçılarına müraciəti itirmisiniz? Bərpa kodunuzu istifadə edərək hesabınızdakı bütün iki mərhələli təchizatçıları sıradan çıxara bilərsiniz."
+ },
+ "recoveryCodeTitle": {
+ "message": "Bərpa kodu"
+ },
+ "authenticatorAppTitle": {
+ "message": "Kimlik təsdiqləyici tətbiqi"
+ },
+ "authenticatorAppDesc": {
+ "message": "Vaxt əsaslı təsdiqləmə kodları yaratmaq üçün (Authy və ya Google Authenticator kimi) kimlik təsdiqləyici tətbiq istifadə edin.",
+ "description": "'Authy' and 'Google Authenticator' are product names and should not be translated."
+ },
+ "yubiKeyTitle": {
+ "message": "YubiKey OTP təhlükəsizlik açarı"
+ },
+ "yubiKeyDesc": {
+ "message": "Hesabınıza müraciət etmək üçün bir YubiKey istifadə edin. YubiKey 4, 4 Nano, 4C və NEO cihazları ilə işləyir."
+ },
+ "duoDesc": {
+ "message": "Duo Security ilə təsdiqləmək üçün Duo Mobile tətbiqi, SMS, telefon zəngi və ya U2F təhlükəsizlik açarını istifadə edin.",
+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
+ },
+ "duoOrganizationDesc": {
+ "message": "Təşkilatınızını Duo Security ilə təsdiqləmək üçün Duo Mobile tətbiqi, SMS, telefon zəngi və ya U2F təhlükəsizlik açarını istifadə edin.",
+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
+ },
+ "webAuthnTitle": {
+ "message": "FIDO2 WebAuthn"
+ },
+ "webAuthnDesc": {
+ "message": "Hesabınıza müraciət etmək üçün hər hansısa bir WebAuthn fəallaşdırılan təhlükəsizlik açarı istifadə edin."
+ },
+ "emailTitle": {
+ "message": "E-poçt"
+ },
+ "emailDesc": {
+ "message": "Təsdiqləmə kodları e-poçt ünvanınıza göndəriləcək."
+ },
+ "selfHostedEnvironment": {
+ "message": "Öz-özünə sahiblik edən mühit"
+ },
+ "selfHostedEnvironmentFooter": {
+ "message": "Öz-özünə sahiblik edən Bitwarden quraşdırmasının baza URL-sini müəyyənləşdirin."
+ },
+ "customEnvironment": {
+ "message": "Özəl mühit"
+ },
+ "customEnvironmentFooter": {
+ "message": "Qabaqcıl istifadəçilər üçündür. Hər xidmətin baza URL-sini müstəqil olaraq müəyyənləşdirə bilərsiniz."
+ },
+ "baseUrl": {
+ "message": "Server URL-si"
+ },
+ "apiUrl": {
+ "message": "API server URL-si"
+ },
+ "webVaultUrl": {
+ "message": "Veb anbar server URL-si"
+ },
+ "identityUrl": {
+ "message": "Kimlik server URL-si"
+ },
+ "notificationsUrl": {
+ "message": "Bildiriş server URL-si"
+ },
+ "iconsUrl": {
+ "message": "Nişan server URL-si"
+ },
+ "environmentSaved": {
+ "message": "Mühit URL-ləri saxlanıldı."
+ },
+ "enableAutoFillOnPageLoad": {
+ "message": "Səhifə yüklənəndə avto-doldurmanı fəallaşdır"
+ },
+ "enableAutoFillOnPageLoadDesc": {
+ "message": "Giriş formu aşkarlananda, səhifə yüklənən zaman formu avto-doldurma icra edilsin."
+ },
+ "experimentalFeature": {
+ "message": "Bu, hazırda təcrübi bir özəllikdir. İstifadə zamanı riski sizə aiddir."
+ },
+ "defaultAutoFillOnPageLoad": {
+ "message": "Giriş məlumatları üçün ilkin avto-doldurma tənzimləməsi"
+ },
+ "defaultAutoFillOnPageLoadDesc": {
+ "message": "\"Səhifə yüklənəndə avto-doldur\"u fəal etdikdən sonra, fərdi giriş elementləri üçün özəlliyi fəallaşdıra və ya sıradan çıxarda bilərsiniz. Bu ayrı-ayrı konfiqurasiya edilməmiş giriş elementləri üçün ilkin tənzimləmədir."
+ },
+ "itemAutoFillOnPageLoad": {
+ "message": "Səhifə yüklənəndə avto-doldur (Seçimlərdə fəallaşdırılıbsa)"
+ },
+ "autoFillOnPageLoadUseDefault": {
+ "message": "İlkin tənzimləməni istifadə et"
+ },
+ "autoFillOnPageLoadYes": {
+ "message": "Səhifə yüklənəndə avto-doldur"
+ },
+ "autoFillOnPageLoadNo": {
+ "message": "Səhifə yüklənəndə avto-doldurma"
+ },
+ "commandOpenPopup": {
+ "message": "Anbar açılan pəncərədə aç"
+ },
+ "commandOpenSidebar": {
+ "message": "Anbar yan sətirdə aç"
+ },
+ "commandAutofillDesc": {
+ "message": "Hazırkı veb sayt üçün son istifadə edilən giriş məlumatlarını avto-doldur"
+ },
+ "commandGeneratePasswordDesc": {
+ "message": "Təsadüfi yeni bir parol yarat və lövhəyə kopyala"
+ },
+ "commandLockVaultDesc": {
+ "message": "Anbarı kilidlə"
+ },
+ "privateModeMessage": {
+ "message": "Təəssüf ki, bu pəncərə səyyahın gizli rejimində əlçatan deyil."
+ },
+ "customFields": {
+ "message": "Özəl sahələr"
+ },
+ "copyValue": {
+ "message": "Dəyəri kopyala"
+ },
+ "value": {
+ "message": "Dəyər"
+ },
+ "newCustomField": {
+ "message": "Yeni özəl sahə"
+ },
+ "dragToSort": {
+ "message": "Sıralamaq üçün sürüşdürün"
+ },
+ "cfTypeText": {
+ "message": "Mətn"
+ },
+ "cfTypeHidden": {
+ "message": "Gizli"
+ },
+ "cfTypeBoolean": {
+ "message": "Boolean"
+ },
+ "popup2faCloseMessage": {
+ "message": "Təsdiqləmə kodunu alacağınız e-poçtu yoxlamaq üçün bu pəncərə xaricində bir yerə klikləsəniz bu pəncərə bağlanacaq. Bu pəncərənin bağlanmaması üçün yeni bir pəncərədə açmaq istəyirsiniz?"
+ },
+ "popupU2fCloseMessage": {
+ "message": "Bu səyyah bu açılan pəncərədə U2F tələblərini emal edə bilmir. U2F istifadə edərək giriş etmək üçün bu açılan pəncərəni yeni bir pəncərədə açmaq istəyirsiniz?"
+ },
+ "disableFavicon": {
+ "message": "Veb sayt nişanlarını sıradan çıxart"
+ },
+ "disableFaviconDesc": {
+ "message": "Veb sayt nişanları, anbarınızda hər bir giriş elementinin yanında tanımağınıza kömək edən bir təsvir təqdim edir."
+ },
+ "disableBadgeCounter": {
+ "message": "Nişan sayğacını sıradan çıxart"
+ },
+ "disableBadgeCounterDesc": {
+ "message": "Nişan sayğacı, anbarınızdakı hazırkı səhifə üçün neçə dəfə giriş etdiyinizi göstərir."
+ },
+ "cardholderName": {
+ "message": "Kart sahibinin adı"
+ },
+ "number": {
+ "message": "Nömrə"
+ },
+ "brand": {
+ "message": "Brend"
+ },
+ "expirationMonth": {
+ "message": "Son istifadə ayı"
+ },
+ "expirationYear": {
+ "message": "Son istifadə ili"
+ },
+ "expiration": {
+ "message": "Bitmə vaxtı"
+ },
+ "january": {
+ "message": "Yanvar"
+ },
+ "february": {
+ "message": "Fevral"
+ },
+ "march": {
+ "message": "Mart"
+ },
+ "april": {
+ "message": "Aprel"
+ },
+ "may": {
+ "message": "May"
+ },
+ "june": {
+ "message": "İyun"
+ },
+ "july": {
+ "message": "İyul"
+ },
+ "august": {
+ "message": "Avqust"
+ },
+ "september": {
+ "message": "Sentyabr"
+ },
+ "october": {
+ "message": "Oktyabr"
+ },
+ "november": {
+ "message": "Noyabr"
+ },
+ "december": {
+ "message": "Dekabr"
+ },
+ "securityCode": {
+ "message": "Təhlükəsizlik kodu"
+ },
+ "ex": {
+ "message": "məs."
+ },
+ "title": {
+ "message": "Başlıq"
+ },
+ "mr": {
+ "message": "Cənab"
+ },
+ "mrs": {
+ "message": "Xanım"
+ },
+ "ms": {
+ "message": "Hörmətli"
+ },
+ "dr": {
+ "message": "Dr"
+ },
+ "firstName": {
+ "message": "Ad"
+ },
+ "middleName": {
+ "message": "Orta ad"
+ },
+ "lastName": {
+ "message": "Soyad"
+ },
+ "identityName": {
+ "message": "Kimlik adı"
+ },
+ "company": {
+ "message": "Şirkət"
+ },
+ "ssn": {
+ "message": "Sosial təhlükəsizlik nömrəsi"
+ },
+ "passportNumber": {
+ "message": "Pasport nömrəsi"
+ },
+ "licenseNumber": {
+ "message": "Lisenziya nömrəsi"
+ },
+ "email": {
+ "message": "E-poçt"
+ },
+ "phone": {
+ "message": "Telefon"
+ },
+ "address": {
+ "message": "Ünvan"
+ },
+ "address1": {
+ "message": "Ünvan 1"
+ },
+ "address2": {
+ "message": "Ünvan 2"
+ },
+ "address3": {
+ "message": "Ünvan 3"
+ },
+ "cityTown": {
+ "message": "Şəhər/Rayon"
+ },
+ "stateProvince": {
+ "message": "Ölkə/Əyalət"
+ },
+ "zipPostalCode": {
+ "message": "Zip/ Poçt kodu"
+ },
+ "country": {
+ "message": "Ölkə"
+ },
+ "type": {
+ "message": "Növ"
+ },
+ "typeLogin": {
+ "message": "Giriş"
+ },
+ "typeLogins": {
+ "message": "Girişlər"
+ },
+ "typeSecureNote": {
+ "message": "Təhlükəsizlik qeydi"
+ },
+ "typeCard": {
+ "message": "Kart"
+ },
+ "typeIdentity": {
+ "message": "Kimlik"
+ },
+ "passwordHistory": {
+ "message": "Parol tarixçəsi"
+ },
+ "back": {
+ "message": "Geri"
+ },
+ "collections": {
+ "message": "Kolleksiyalar"
+ },
+ "favorites": {
+ "message": "Sevimlilər"
+ },
+ "popOutNewWindow": {
+ "message": "Yeni bir pəncərədə aç"
+ },
+ "refresh": {
+ "message": "Təzələ"
+ },
+ "cards": {
+ "message": "Kartlar"
+ },
+ "identities": {
+ "message": "Kimliklər"
+ },
+ "logins": {
+ "message": "Girişlər"
+ },
+ "secureNotes": {
+ "message": "Təhlükəsizlik qeydləri"
+ },
+ "clear": {
+ "message": "Təmizlə",
+ "description": "To clear something out. example: To clear browser history."
+ },
+ "checkPassword": {
+ "message": "Parolunuzun oğurlanıb oğurlanmadığını yoxlayın."
+ },
+ "passwordExposed": {
+ "message": "Bu parol, məlumat pozuntularında $VALUE$ dəfə üzə çıxıb. Dəyişdirməyi məsləhət görürük.",
+ "placeholders": {
+ "value": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "passwordSafe": {
+ "message": "Bu parol, məlumat pozuntularında qeydə alınmayıb. Rahatlıqla istifadə edə bilərsiniz."
+ },
+ "baseDomain": {
+ "message": "Baza domeni"
+ },
+ "host": {
+ "message": "Host",
+ "description": "A URL's host value. For example, the host of https://sub.domain.com:443 is 'sub.domain.com:443'."
+ },
+ "exact": {
+ "message": "Tam"
+ },
+ "startsWith": {
+ "message": "Başlayır"
+ },
+ "regEx": {
+ "message": "Müntəzəm ifadə",
+ "description": "A programming term, also known as 'RegEx'."
+ },
+ "matchDetection": {
+ "message": "Uyğunluq aşkarlaması",
+ "description": "URI match detection for auto-fill."
+ },
+ "defaultMatchDetection": {
+ "message": "İlkin uyğunluq aşkarlaması",
+ "description": "Default URI match detection for auto-fill."
+ },
+ "toggleOptions": {
+ "message": "Seçimləri aç/bağla"
+ },
+ "toggleCurrentUris": {
+ "message": "Hazırkı URI-ləri aç/bağla",
+ "description": "Toggle the display of the URIs of the currently open tabs in the browser."
+ },
+ "currentUri": {
+ "message": "Hazırkı URI",
+ "description": "The URI of one of the current open tabs in the browser."
+ },
+ "organization": {
+ "message": "Təşkilat",
+ "description": "An entity of multiple related people (ex. a team or business organization)."
+ },
+ "types": {
+ "message": "Növlər"
+ },
+ "allItems": {
+ "message": "Bütün elementlər"
+ },
+ "noPasswordsInList": {
+ "message": "Siyahılanacaq heç bir parol yoxdur."
+ },
+ "remove": {
+ "message": "Çıxart"
+ },
+ "default": {
+ "message": "İlkin"
+ },
+ "dateUpdated": {
+ "message": "Yeniləndi",
+ "description": "ex. Date this item was updated"
+ },
+ "datePasswordUpdated": {
+ "message": "Parol yeniləndi",
+ "description": "ex. Date this password was updated"
+ },
+ "neverLockWarning": {
+ "message": "\"Heç vaxt\" seçimini istifadə etmək istədiyinizə əminsiniz? Kilid seçimini \"Heç vaxt\" olaraq tənzimləsəniz, anbarınızın şifrələmə açarı cihazınızda saxlanılacaq. Bu seçimi istifadə etsəniz, cihazınızı daha yaxşı mühafizə etməlisiniz."
+ },
+ "noOrganizationsList": {
+ "message": "Heç bir təşkilata aid deyilsiniz. Təşkilatlar, elementlərinizi digər istifadəçilərlə təhlükəsiz şəkildə paylaşmağınızı təmin edir."
+ },
+ "noCollectionsInList": {
+ "message": "Siyahılanacaq heç bir kolleksiya yoxdur."
+ },
+ "ownership": {
+ "message": "Sahiblik"
+ },
+ "whoOwnsThisItem": {
+ "message": "Bu elementin sahibi kimdir?"
+ },
+ "strong": {
+ "message": "Güclü",
+ "description": "ex. A strong password. Scale: Weak -> Good -> Strong"
+ },
+ "good": {
+ "message": "Yaxşı",
+ "description": "ex. A good password. Scale: Weak -> Good -> Strong"
+ },
+ "weak": {
+ "message": "Zəif",
+ "description": "ex. A weak password. Scale: Weak -> Good -> Strong"
+ },
+ "weakMasterPassword": {
+ "message": "Zəif ana parol"
+ },
+ "weakMasterPasswordDesc": {
+ "message": "Seçdiyiniz ana parol zəifdir. Bitwarden hesabınızı daha yaxşı qorumaq üçün güclü bir ana parol (və ya uzun ifadə) istifadə etməlisiniz. Bu ana parol istifadə etmək istədiyinizə əminsiniz?"
+ },
+ "pin": {
+ "message": "PIN",
+ "description": "PIN code. Ex. The short code (often numeric) that you use to unlock a device."
+ },
+ "unlockWithPin": {
+ "message": "PIN ilə kilidi açın"
+ },
+ "setYourPinCode": {
+ "message": "Bitwarden-in kilidini açmaq üçün PIN kod tənzimləyin. Hər tətbiqdən tam çıxış edəndə PIN tənzimləmələriniz sıfırlanacaq."
+ },
+ "pinRequired": {
+ "message": "PIN kod lazımdır."
+ },
+ "invalidPin": {
+ "message": "Etibarsız PIN kod."
+ },
+ "verifyPin": {
+ "message": "PIN-i təsdiqlə"
+ },
+ "yourVaultIsLockedPinCode": {
+ "message": "Anbarınız kilidlənib. Davam etmək üçün PIN kodunuzu təsdiqləyin."
+ },
+ "unlockWithBiometrics": {
+ "message": "Biometriklərlə kilidi açın"
+ },
+ "awaitDesktop": {
+ "message": "Masaüstündən təsdiq gözlənilir"
+ },
+ "awaitDesktopDesc": {
+ "message": "Səyyah üçün biometrikləri fəallaşdırmaq üçün zəhmət olmasa Bitwarden masaüstü tətbiqində biometrik istifadəsini təsdiqləyin."
+ },
+ "lockWithMasterPassOnRestart": {
+ "message": "Səyyah yenidən başladılanda ana parol ilə kilidlə"
+ },
+ "selectOneCollection": {
+ "message": "Ən azı bir kolleksiya seçməlisiniz."
+ },
+ "cloneItem": {
+ "message": "Elementi klonla"
+ },
+ "clone": {
+ "message": "Klonla"
+ },
+ "passwordGeneratorPolicyInEffect": {
+ "message": "Bir və ya daha çox təşkilat siyasətləri yaradıcı seçimlərinizə təsir edir."
+ },
+ "vaultTimeoutAction": {
+ "message": "Anbara müraciət vaxtının bitmə əməliyyatı"
+ },
+ "lock": {
+ "message": "Kilidlə",
+ "description": "Verb form: to make secure or inaccesible by"
+ },
+ "trash": {
+ "message": "Tullantı qutusu",
+ "description": "Noun: a special folder to hold deleted items"
+ },
+ "searchTrash": {
+ "message": "Tullantı qutusunda axtar"
+ },
+ "permanentlyDeleteItem": {
+ "message": "Elementi birdəfəlik sil"
+ },
+ "permanentlyDeleteItemConfirmation": {
+ "message": "Bu elementi birdəfəlik silmək istədiyinizə əminsiniz?"
+ },
+ "permanentlyDeletedItem": {
+ "message": "Element birdəfəlik silindi"
+ },
+ "restoreItem": {
+ "message": "Elementi bərpa et"
+ },
+ "restoreItemConfirmation": {
+ "message": "Elementi bərpa etmək istədiyinizə əminsiniz?"
+ },
+ "restoredItem": {
+ "message": "Element bərpa edildi"
+ },
+ "vaultTimeoutLogOutConfirmation": {
+ "message": "Çıxış edəndə, anbarınıza bütün müraciətiniz dayanacaq və vaxt bitməsindən sonra onlayn kimlik təsdiqləməsi tələb olunacaq. Bu tənzimləməni istifadə etmək istədiyinizə əminsiniz?"
+ },
+ "vaultTimeoutLogOutConfirmationTitle": {
+ "message": "Vaxt bitmə əməliyyat təsdiqi"
+ },
+ "autoFillAndSave": {
+ "message": "Avto-doldur və saxla"
+ },
+ "autoFillSuccessAndSavedUri": {
+ "message": "Element avto-dolduruldu və URI saxlanıldı"
+ },
+ "autoFillSuccess": {
+ "message": "Element avto-dolduruldu"
+ },
+ "setMasterPassword": {
+ "message": "Ana parolu tənzimlə"
+ },
+ "masterPasswordPolicyInEffect": {
+ "message": "Bir və ya daha çox təşkilat siyasəti, aşağıdakı tələbləri qarşılamaq üçün ana parolunuzu tələb edir:"
+ },
+ "policyInEffectMinComplexity": {
+ "message": "Minimum mürəkkəblik xalı: $SCORE$",
+ "placeholders": {
+ "score": {
+ "content": "$1",
+ "example": "4"
+ }
+ }
+ },
+ "policyInEffectMinLength": {
+ "message": "Minimum uzunluq: $LENGTH$",
+ "placeholders": {
+ "length": {
+ "content": "$1",
+ "example": "14"
+ }
+ }
+ },
+ "policyInEffectUppercase": {
+ "message": "Bir və ya daha çox böyük hərf ehtiva etməlidir"
+ },
+ "policyInEffectLowercase": {
+ "message": "Bir və ya daha çox kiçik hərf ehtiva etməlidir"
+ },
+ "policyInEffectNumbers": {
+ "message": "Bir və ya daha çox rəqəm ehtiva etməlidir"
+ },
+ "policyInEffectSpecial": {
+ "message": "Bu özəl simvollardan biri və ya daha çoxunu ehtiva etməlidir: $CHARS$",
+ "placeholders": {
+ "chars": {
+ "content": "$1",
+ "example": "!@#$%^&*"
+ }
+ }
+ },
+ "masterPasswordPolicyRequirementsNotMet": {
+ "message": "Yeni ana parolunuz siyasət tələblərini qarşılamır."
+ },
+ "acceptPolicies": {
+ "message": "Bu qutunu işarələyərək aşağıdakılarla razılaşırsınız:"
+ },
+ "acceptPoliciesError": {
+ "message": "Xidmət Şərtləri və Gizlilik Siyasəti qəbul edilməyib."
+ },
+ "termsOfService": {
+ "message": "Xidmət Şərtləri"
+ },
+ "privacyPolicy": {
+ "message": "Gizlilik Siyasəti"
+ },
+ "hintEqualsPassword": {
+ "message": "Parol məsləhəti, parolunuzla eyni ola bilməz."
+ },
+ "ok": {
+ "message": "Oldu"
+ },
+ "desktopSyncVerificationTitle": {
+ "message": "Masaüstü eyniləşdirmə təsdiqləməsi"
+ },
+ "desktopIntegrationVerificationText": {
+ "message": "Zəhmət olmasa masaüstü tətbiqin bu barmaq izini gördüyünü təsdiqləyin:"
+ },
+ "desktopIntegrationDisabledTitle": {
+ "message": "Səyyah inteqrasiyası fəal deyil"
+ },
+ "desktopIntegrationDisabledDesc": {
+ "message": "Səyyah inteqrasiyası Bitwarden masaüstü tətbiqində fəal deyil. Zəhmət olmasa masaüstü tətbiqinin tənzimləmələrində fəallaşdırın."
+ },
+ "startDesktopTitle": {
+ "message": "Bitwarden masaüstü tətbiqini başlat"
+ },
+ "startDesktopDesc": {
+ "message": "Bu funksiyanın istifadə edilə bilməsi üçün Bitwarden masaüstü tətbiqi başladılmalıdır."
+ },
+ "errorEnableBiometricTitle": {
+ "message": "Biometriklər fəallaşdırıla bilmədi"
+ },
+ "errorEnableBiometricDesc": {
+ "message": "Əməliyyat, masaüstü tətbiqi tərəfindən ləğv edildi"
+ },
+ "nativeMessagingInvalidEncryptionDesc": {
+ "message": "Masaüstü tətbiqi, təhlükəsiz rabitə kanalını qüvvədən saldı. Bu əməliyyatı yenidən icra edin"
+ },
+ "nativeMessagingInvalidEncryptionTitle": {
+ "message": "Masaüstü rabitə əlaqəsi kəsildi"
+ },
+ "nativeMessagingWrongUserDesc": {
+ "message": "Masaüstü tətbiqdə fərqli bir hesabla giriş edilib. Hər iki tətbiqin eyni hesabla giriş etdiyinə əmin olun."
+ },
+ "nativeMessagingWrongUserTitle": {
+ "message": "Hesablar uyğunlaşmır"
+ },
+ "biometricsNotEnabledTitle": {
+ "message": "Biometriklə fəal deyil"
+ },
+ "biometricsNotEnabledDesc": {
+ "message": "Səyyah biometrikləri, əvvəlcə tənzimləmələrdə masaüstü biometriklərinin fəallaşdırılmasını tələb edir."
+ },
+ "biometricsNotSupportedTitle": {
+ "message": "Biometriklər dəstəklənmir"
+ },
+ "biometricsNotSupportedDesc": {
+ "message": "Səyyah biometrikləri bu cihazda dəstəklənmir"
+ },
+ "nativeMessaginPermissionErrorTitle": {
+ "message": "İcazə verilmədi"
+ },
+ "nativeMessaginPermissionErrorDesc": {
+ "message": "Bitwarden masaüstü tətbiqi ilə əlaqə qurma icazəsi olmadan, səyyah genişləndirməsində biometrikləri təmin edə bilmərik. Zəhmət olmasa yenidən sınayın."
+ },
+ "nativeMessaginPermissionSidebarTitle": {
+ "message": "İcazə tələb xətası"
+ },
+ "nativeMessaginPermissionSidebarDesc": {
+ "message": "Bu əməliyyatı yan sətirdən edə bilməzsiniz. Zəhmət olmasa açılan pəncərədə yenidən cəhd edin."
+ },
+ "personalOwnershipSubmitError": {
+ "message": "Müəssisə Siyasətinə görə, elementləri şəxsi anbarınızda saxlamağınız məhdudlaşdırılıb. Sahiblik seçimini təşkilat olaraq dəyişdirin və mövcud kolleksiyalar arasından seçim edin."
+ },
+ "personalOwnershipPolicyInEffect": {
+ "message": "Bir təşkilat siyasəti, sahiblik seçimlərinizə təsir edir."
+ },
+ "excludedDomains": {
+ "message": "İstisna edilən domenlər"
+ },
+ "excludedDomainsDesc": {
+ "message": "Bitwarden bu domenlər üçün giriş təfsilatlarını saxlamağı soruşmayacaq. Dəyişikliklərin təsirli olması üçün səhifəni təzələməlisiniz."
+ },
+ "excludedDomainsInvalidDomain": {
+ "message": "$DOMAIN$ etibarlı bir domen deyil",
+ "placeholders": {
+ "domain": {
+ "content": "$1",
+ "example": "googlecom"
+ }
+ }
+ },
+ "send": {
+ "message": "Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "searchSends": {
+ "message": "\"Send\"ləri axtar",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "addSend": {
+ "message": "\"Send\" əlavə et",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTypeText": {
+ "message": "Mətn"
+ },
+ "sendTypeFile": {
+ "message": "Fayl"
+ },
+ "allSends": {
+ "message": "Bütün \"Send\"lər",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "maxAccessCountReached": {
+ "message": "Maksimal müraciət sayına çatıldı"
+ },
+ "expired": {
+ "message": "Müddəti bitib"
+ },
+ "pendingDeletion": {
+ "message": "Silinməsi gözlənilir"
+ },
+ "passwordProtected": {
+ "message": "Parolla qorunan"
+ },
+ "copySendLink": {
+ "message": "\"Send\" bağlantısını kopyala",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "removePassword": {
+ "message": "Parolu çıxart"
+ },
+ "delete": {
+ "message": "Sil"
+ },
+ "removedPassword": {
+ "message": "Parol çıxarıldı"
+ },
+ "deletedSend": {
+ "message": "Send silindi",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendLink": {
+ "message": "\"Send\" bağlantısı",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "disabled": {
+ "message": "Sıradan çıxarıldı"
+ },
+ "removePasswordConfirmation": {
+ "message": "Parolu çıxartmaq istədiyinizə əminsiniz?"
+ },
+ "deleteSend": {
+ "message": "\"Send\"i sil",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "deleteSendConfirmation": {
+ "message": "Bu \"Send\"i silmək istədiyinizə əminsiniz?",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "editSend": {
+ "message": "\"Send\"ə düzəliş et",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTypeHeader": {
+ "message": "\"Send\"in növü nədir?",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendNameDesc": {
+ "message": "Bu \"Send\"i açıqlayan bir ad.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendFileDesc": {
+ "message": "Göndərmək istədiyiniz fayl."
+ },
+ "deletionDate": {
+ "message": "Silinmə tarixi"
+ },
+ "deletionDateDesc": {
+ "message": "\"Send\" göstərilən tarix və saatda birdəfəlik silinəcək.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "expirationDate": {
+ "message": "Bitmə tarixi"
+ },
+ "expirationDateDesc": {
+ "message": "Əgər tənzimlənsə, göstərilən tarix və vaxtda \"Send\"ə müraciət başa çatacaq.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "oneDay": {
+ "message": "1 gün"
+ },
+ "days": {
+ "message": "$DAYS$ gün",
+ "placeholders": {
+ "days": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "custom": {
+ "message": "Özəl"
+ },
+ "maximumAccessCount": {
+ "message": "Maksimal müraciət sayı"
+ },
+ "maximumAccessCountDesc": {
+ "message": "Əgər tənzimlənsə, istifadəçilər maksimal müraciət sayına çatdıqdan sonra bu \"Send\"ə müraciət edə bilməyəcək.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendPasswordDesc": {
+ "message": "İstəyinizə görə istifadəçilərdən bu \"Send\"ə müraciət edərkən parol tələb edə bilərsiniz.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendNotesDesc": {
+ "message": "Bu \"Send\" ilə bağlı gizli qeydlər.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendDisableDesc": {
+ "message": "Heç kimin müraciət edə bilməməsi üçün bu \"Send\"i sıradan çıxart.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendShareDesc": {
+ "message": "Saxladıqdan sonra \"Send\"in bağlantısını lövhəyə kopyala.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTextDesc": {
+ "message": "Göndərmək istədiyiniz mətn"
+ },
+ "sendHideText": {
+ "message": "Bu \"Send\"in mətnini ilkin olaraq gizlət",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "currentAccessCount": {
+ "message": "Hazırkı müraciət sayı"
+ },
+ "createSend": {
+ "message": "Yeni \"Send\" yarat",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "newPassword": {
+ "message": "Yeni parol"
+ },
+ "sendDisabled": {
+ "message": "Send sıradan çıxarıldı",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendDisabledWarning": {
+ "message": "Müəssisə siyasətinə görə, yalnız mövcud \"Send\"i silə bilərsiniz.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "createdSend": {
+ "message": "Send yaradıldı",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "editedSend": {
+ "message": "\"Send\"ə düzəliş edildi",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendLinuxChromiumFileWarning": {
+ "message": "Fayl seçmək üçün (mümkünsə) genişləndirməni yan sətirdə açın və ya bu bannerə klikləyərək yeni bir pəncərədə açın."
+ },
+ "sendFirefoxFileWarning": {
+ "message": "Firefox istifadə edərək fayl seçmək üçün genişləndirməni yan sətirdə açın və ya bu bannerə klikləyərək yeni bir pəncərədə açın."
+ },
+ "sendSafariFileWarning": {
+ "message": "Safari istifadə edərək fayl seçmək üçün bu bannerə klikləyərək yeni bir pəncərədə açın."
+ },
+ "sendFileCalloutHeader": {
+ "message": "Başlamazdan əvvəl"
+ },
+ "sendFirefoxCustomDatePopoutMessage1": {
+ "message": "Təqvim stilində tarix seçici istifadə etmək üçün",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read '**To use a calendar style date picker ** click here to pop out your window.'"
+ },
+ "sendFirefoxCustomDatePopoutMessage2": {
+ "message": "bura klikləyin",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker **click here** to pop out your window.'"
+ },
+ "sendFirefoxCustomDatePopoutMessage3": {
+ "message": "yeni bir pəncərə açın.",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker click here **to pop out your window.**'"
+ },
+ "expirationDateIsInvalid": {
+ "message": "Göstərilən son istifadə tarixi etibarsızdır."
+ },
+ "deletionDateIsInvalid": {
+ "message": "Göstərilən silinmə tarixi etibarsızdır."
+ },
+ "expirationDateAndTimeRequired": {
+ "message": "Son istifadə tarixi və vaxtı lazımdır."
+ },
+ "deletionDateAndTimeRequired": {
+ "message": "Silinmə tarixi və vaxtı lazımdır."
+ },
+ "dateParsingError": {
+ "message": "Silinmə və son istifadə tarixlərini saxlayarkən xəta baş verdi."
+ },
+ "hideEmail": {
+ "message": "E-poçt ünvanımı alıcılardan gizlət."
+ },
+ "sendOptionsPolicyInEffect": {
+ "message": "Bir və ya daha çox təşkilat siyasətləri \"Send\" seçimlərinizə təsir edir."
+ },
+ "passwordPrompt": {
+ "message": "Ana parolu təkrar soruş"
+ },
+ "passwordConfirmation": {
+ "message": "Ana parol təsdiqi"
+ },
+ "passwordConfirmationDesc": {
+ "message": "Bu əməliyyat qorumalıdır, davam etmək üçün zəhmət olmasa kimliyinizi təsdiqləmək üçün ana parolunuzu təkrar daxil edin."
+ },
+ "emailVerificationRequired": {
+ "message": "E-poçt təsdiqləməsi tələb olunur"
+ },
+ "emailVerificationRequiredDesc": {
+ "message": "Bu özəlliyi istifadə etmək üçün e-poçtunuzu təsdiqləməlisiniz. E-poçtunuzu veb anbarında təsdiqləyə bilərsiniz."
+ },
+ "updatedMasterPassword": {
+ "message": "Yenilənmiş ana parol"
+ },
+ "updateMasterPassword": {
+ "message": "Ana parolu yenilə"
+ },
+ "updateMasterPasswordWarning": {
+ "message": "Ana parolunuz təzəlikcə təşkilatınızdakı bir administrator tərəfindən dəyişdirildi. Anbara müraciət üçün indi yeniləməlisiniz. Davam etsəniz, hazırkı seansdan çıxış etmiş və təkrar giriş etməli olacaqsınız. Digər cihazlardakı aktiv seanslar bir saata qədər aktiv qalmağa davam edə bilər."
+ },
+ "resetPasswordPolicyAutoEnroll": {
+ "message": "Avtomatik qeydiyyat"
+ },
+ "resetPasswordAutoEnrollInviteWarning": {
+ "message": "Bu təşkilat, sizi \"parol sıfırlama\"da avtomatik olaraq qeydiyyata alan müəssisə siyasətinə sahibdir. Qeydiyyat, təşkilat administratorlarına ana parolunuzu dəyişdirmə icazəsi verəcək."
+ },
+ "selectFolder": {
+ "message": "Qovluq seçin..."
+ },
+ "ssoCompleteRegistration": {
+ "message": "SSO ilə giriş prosesini tamamlamaq üçün zəhmət olmasa anbarınıza müraciət etmək və onu qorumaq üçün bir ana parol tənzimləyin."
+ },
+ "hours": {
+ "message": "Saat"
+ },
+ "minutes": {
+ "message": "Dəqiqə"
+ },
+ "vaultTimeoutPolicyInEffect": {
+ "message": "Təşkilatınızın siyasətləri, anbarınızın vaxt bitişinə təsir edir. Anbar vaxt bitişi üçün icazə verilən maksimum vaxt $HOURS$ saat $MINUTES$ dəqiqədir",
+ "placeholders": {
+ "hours": {
+ "content": "$1",
+ "example": "5"
+ },
+ "minutes": {
+ "content": "$2",
+ "example": "5"
+ }
+ }
+ },
+ "vaultTimeoutToLarge": {
+ "message": "Anbar vaxt bitişi, təşkilatınız tərəfindən tənzimlənən məhdudiyyətləri aşır."
+ },
+ "vaultExportDisabled": {
+ "message": "Anbar ixracı sıradan çıxarıldı"
+ },
+ "personalVaultExportPolicyInEffect": {
+ "message": "Bir və ya daha çox təşkilat siyasəti, fərdi anbarınızı ixrac etməyinizin qarşısını alır."
+ },
+ "copyCustomFieldNameInvalidElement": {
+ "message": "Etibarlı form elementi müəyyənləşdirilə bilmir. Bunun əvəzinə HTML-i nəzərdən keçirməyi sınayın."
+ },
+ "copyCustomFieldNameNotUnique": {
+ "message": "Unikal identifikator tapılmadı."
+ }
+}
diff --git a/src/iOS.Safari/Resources/_locales/be/messages.json b/src/iOS.Safari/Resources/_locales/be/messages.json
new file mode 100644
index 000000000..848ba30c4
--- /dev/null
+++ b/src/iOS.Safari/Resources/_locales/be/messages.json
@@ -0,0 +1,1817 @@
+{
+ "appName": {
+ "message": "Bitwarden"
+ },
+ "extName": {
+ "message": "Bitwarden – бясплатны менеджар пароляў",
+ "description": "Extension name, MUST be less than 40 characters (Safari restriction)"
+ },
+ "extDesc": {
+ "message": "Бяспечны і бясплатны менеджар пароляў для ўсіх вашых прылад.",
+ "description": "Extension description"
+ },
+ "loginOrCreateNewAccount": {
+ "message": "Увайдзіце або стварыце новы ўліковы запіс для доступу да бяспечнага сховішча."
+ },
+ "createAccount": {
+ "message": "Стварыць уліковы запіс"
+ },
+ "login": {
+ "message": "Увайсці"
+ },
+ "enterpriseSingleSignOn": {
+ "message": "Адзіны ўваход у карпаратыўную сістэму (SSO)."
+ },
+ "cancel": {
+ "message": "Скасаваць"
+ },
+ "close": {
+ "message": "Закрыць"
+ },
+ "submit": {
+ "message": "Адправіць"
+ },
+ "emailAddress": {
+ "message": "Адрас эл. пошты"
+ },
+ "masterPass": {
+ "message": "Асноўны пароль"
+ },
+ "masterPassDesc": {
+ "message": "Асноўны пароль — ключ да вашага бяспечнага сховішча. Ён вельмі важны, таму не забывайце яго. Аднавіць асноўны пароль немагчыма."
+ },
+ "masterPassHintDesc": {
+ "message": "Падказка да асноўнага пароля можа дапамагчы вам яго ўспомніць."
+ },
+ "reTypeMasterPass": {
+ "message": "Увядзіце асноўны пароль паўторна"
+ },
+ "masterPassHint": {
+ "message": "Падказка да асноўнага пароля (неабавязкова)"
+ },
+ "tab": {
+ "message": "Укладка"
+ },
+ "myVault": {
+ "message": "Маё сховішча"
+ },
+ "tools": {
+ "message": "Інструменты"
+ },
+ "settings": {
+ "message": "Налады"
+ },
+ "currentTab": {
+ "message": "Бягучая ўкладка"
+ },
+ "copyPassword": {
+ "message": "Капіяваць пароль"
+ },
+ "copyNote": {
+ "message": "Капіяваць нататку"
+ },
+ "copyUri": {
+ "message": "Капіяваць URI"
+ },
+ "copyUsername": {
+ "message": "Капіяваць імя карыстальніка"
+ },
+ "copyNumber": {
+ "message": "Капіяваць нумар"
+ },
+ "copySecurityCode": {
+ "message": "Капіяваць код бяспекі"
+ },
+ "autoFill": {
+ "message": "Аўтазапаўненне"
+ },
+ "generatePasswordCopied": {
+ "message": "Стварыць пароль (з капіяваннем)"
+ },
+ "copyElementIdentifier": {
+ "message": "Copy Custom Field Name"
+ },
+ "noMatchingLogins": {
+ "message": "Няма падыходных уліковых даных."
+ },
+ "vaultLocked": {
+ "message": "Сховішча заблакіравана."
+ },
+ "vaultLoggedOut": {
+ "message": "Вы выйшлі са сховішча."
+ },
+ "autoFillInfo": {
+ "message": "Няма ўліковых даных, даступных для аўтазапаўнення ў бягучую ўкладку браўзера."
+ },
+ "addLogin": {
+ "message": "Дадаць ўліковыя даныя"
+ },
+ "addItem": {
+ "message": "Дадаць элемент"
+ },
+ "passwordHint": {
+ "message": "Падказка да пароля"
+ },
+ "enterEmailToGetHint": {
+ "message": "Увядзіце адрас электроннай пошты ўліковага запісу для атрымання падказкі для асноўнага пароля."
+ },
+ "getMasterPasswordHint": {
+ "message": "Атрымаць падказку для асноўнага пароля"
+ },
+ "continue": {
+ "message": "Працягнуць"
+ },
+ "verificationCode": {
+ "message": "Код праверкі"
+ },
+ "account": {
+ "message": "Уліковы запіс"
+ },
+ "changeMasterPassword": {
+ "message": "Змяніць асноўны пароль"
+ },
+ "fingerprintPhrase": {
+ "message": "Фраза адбітка пальца",
+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
+ },
+ "yourAccountsFingerprint": {
+ "message": "Фраза адбітка пальца вашага ўліковага запісу",
+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
+ },
+ "twoStepLogin": {
+ "message": "Двухэтапны ўваход"
+ },
+ "logOut": {
+ "message": "Выйсці"
+ },
+ "about": {
+ "message": "Пра Bitwarden"
+ },
+ "version": {
+ "message": "Версія"
+ },
+ "save": {
+ "message": "Захаваць"
+ },
+ "move": {
+ "message": "Перамясціць"
+ },
+ "addFolder": {
+ "message": "Дадаць папку"
+ },
+ "name": {
+ "message": "Назва"
+ },
+ "editFolder": {
+ "message": "Рэдагаваць папку"
+ },
+ "deleteFolder": {
+ "message": "Выдаліць папку"
+ },
+ "folders": {
+ "message": "Папкі"
+ },
+ "noFolders": {
+ "message": "Няма элементаў для паказу."
+ },
+ "helpFeedback": {
+ "message": "Даведка і зваротная сувязь"
+ },
+ "sync": {
+ "message": "Сінхранізаваць"
+ },
+ "syncVaultNow": {
+ "message": "Сінхранізаваць сховішча зараз"
+ },
+ "lastSync": {
+ "message": "Апошняя сінхранізацыя:"
+ },
+ "passGen": {
+ "message": "Генератар пароляў"
+ },
+ "generator": {
+ "message": "Згенерыраваць",
+ "description": "Short for 'Password Generator'."
+ },
+ "passGenInfo": {
+ "message": "Аўтаматычна ствараць моцныя, унікальныя паролі для вашых уліковых даных."
+ },
+ "bitWebVault": {
+ "message": "Вэб-сховішча Bitwarden"
+ },
+ "importItems": {
+ "message": "Імпарт элементаў"
+ },
+ "select": {
+ "message": "Выбраць"
+ },
+ "generatePassword": {
+ "message": "Стварыць пароль"
+ },
+ "regeneratePassword": {
+ "message": "Стварыць новы пароль"
+ },
+ "options": {
+ "message": "Параметры"
+ },
+ "length": {
+ "message": "Даўжыня"
+ },
+ "numWords": {
+ "message": "Колькасць слоў"
+ },
+ "wordSeparator": {
+ "message": "Раздзяляльнік слоў"
+ },
+ "capitalize": {
+ "message": "З вялікай літары",
+ "description": "Make the first letter of a work uppercase."
+ },
+ "includeNumber": {
+ "message": "Уключыць лічбу"
+ },
+ "minNumbers": {
+ "message": "Мін. колькасць лічбаў"
+ },
+ "minSpecial": {
+ "message": "Мін. колькасць сімвалаў"
+ },
+ "avoidAmbChar": {
+ "message": "Пазбягаць неадназначных сімвалаў"
+ },
+ "searchVault": {
+ "message": "Пошук у сховішчы"
+ },
+ "edit": {
+ "message": "Рэдагаваць"
+ },
+ "view": {
+ "message": "Выгляд"
+ },
+ "noItemsInList": {
+ "message": "Няма элементаў для паказу."
+ },
+ "itemInformation": {
+ "message": "Звесткі аб элеменце"
+ },
+ "username": {
+ "message": "Імя карыстальніка"
+ },
+ "password": {
+ "message": "Пароль"
+ },
+ "passphrase": {
+ "message": "Парольная фраза"
+ },
+ "favorite": {
+ "message": "Абраны"
+ },
+ "notes": {
+ "message": "Нататкі"
+ },
+ "note": {
+ "message": "Нататкі"
+ },
+ "editItem": {
+ "message": "Рэдагаванне элемента"
+ },
+ "folder": {
+ "message": "Папка"
+ },
+ "deleteItem": {
+ "message": "Выдаліць элемент"
+ },
+ "viewItem": {
+ "message": "Прагляд элемента"
+ },
+ "launch": {
+ "message": "Запусціць"
+ },
+ "website": {
+ "message": "Вэб-сайт"
+ },
+ "toggleVisibility": {
+ "message": "Пераключыць бачнасць"
+ },
+ "manage": {
+ "message": "Кіраваць"
+ },
+ "other": {
+ "message": "Iншае"
+ },
+ "rateExtension": {
+ "message": "Ацаніць пашырэнне"
+ },
+ "rateExtensionDesc": {
+ "message": "Падумайце аб тым, каб дапамагчы нам, напісаўшы добрым водгукам!"
+ },
+ "browserNotSupportClipboard": {
+ "message": "Ваш вэб-браўзер не падтрымлівае капіяванне даных у буфер абмену. Скапіюйце іх уручную."
+ },
+ "verifyMasterPassword": {
+ "message": "Праверыць асноўны пароль"
+ },
+ "yourVaultIsLocked": {
+ "message": "Ваша сховішча заблакіравана. Каб працягнуць, увядзіце асноўны пароль."
+ },
+ "unlock": {
+ "message": "Разблакіраваць"
+ },
+ "loggedInAsOn": {
+ "message": "Выкананы ўваход на $HOSTNAME$ як $EMAIL$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "name@example.com"
+ },
+ "hostname": {
+ "content": "$2",
+ "example": "bitwarden.com"
+ }
+ }
+ },
+ "invalidMasterPassword": {
+ "message": "Памылковы асноўны пароль"
+ },
+ "vaultTimeout": {
+ "message": "Тайм-аўт сховішча"
+ },
+ "lockNow": {
+ "message": "Заблакіраваць зараз"
+ },
+ "immediately": {
+ "message": "Адразу"
+ },
+ "tenSeconds": {
+ "message": "10 секунд"
+ },
+ "twentySeconds": {
+ "message": "20 секунд"
+ },
+ "thirtySeconds": {
+ "message": "30 секунд"
+ },
+ "oneMinute": {
+ "message": "1 хвіліна"
+ },
+ "twoMinutes": {
+ "message": "2 хвіліны"
+ },
+ "fiveMinutes": {
+ "message": "5 хвілін"
+ },
+ "fifteenMinutes": {
+ "message": "15 хвілін"
+ },
+ "thirtyMinutes": {
+ "message": "30 хвілін"
+ },
+ "oneHour": {
+ "message": "1 гадзіна"
+ },
+ "fourHours": {
+ "message": "4 гадзіны"
+ },
+ "onLocked": {
+ "message": "Разам з камп'ютарам"
+ },
+ "onRestart": {
+ "message": "Пры перазапуску браўзера"
+ },
+ "never": {
+ "message": "Ніколі"
+ },
+ "security": {
+ "message": "Бяспека"
+ },
+ "errorOccurred": {
+ "message": "Адбылася памылка"
+ },
+ "emailRequired": {
+ "message": "Патрабуецца адрас электроннай пошты."
+ },
+ "invalidEmail": {
+ "message": "Памылковы адрас электроннай пошты."
+ },
+ "masterPassRequired": {
+ "message": "Патрабуецца асноўны пароль."
+ },
+ "masterPassLength": {
+ "message": "Асноўны пароль павінен быць даўжынёй не менш за 8 сімвалаў."
+ },
+ "masterPassDoesntMatch": {
+ "message": "Асноўныя паролі не супадаюць."
+ },
+ "newAccountCreated": {
+ "message": "Ваш уліковы запіс створаны! Вы можаце ўвайсці."
+ },
+ "masterPassSent": {
+ "message": "Мы адправілі вам на электронную пошту падказку для асноўнага пароля."
+ },
+ "verificationCodeRequired": {
+ "message": "Патрабуецца код праверкі."
+ },
+ "valueCopied": {
+ "message": "$VALUE$ скапіяваны(-а)",
+ "description": "Value has been copied to the clipboard.",
+ "placeholders": {
+ "value": {
+ "content": "$1",
+ "example": "Password"
+ }
+ }
+ },
+ "autofillError": {
+ "message": "Не ўдаецца аўтаматычна запоўніць выбраны элемент на гэтай старонцы. Скапіюйце і ўстаўце інфармацыю ўручную."
+ },
+ "loggedOut": {
+ "message": "Вы выйшлі са сховішча"
+ },
+ "loginExpired": {
+ "message": "Скончыўся тэрмін дзеяння вашага сеансу."
+ },
+ "logOutConfirmation": {
+ "message": "Вы ўпэўнены, што хочаце выйсці?"
+ },
+ "yes": {
+ "message": "Так"
+ },
+ "no": {
+ "message": "Не"
+ },
+ "unexpectedError": {
+ "message": "Адбылася нечаканая памылка."
+ },
+ "nameRequired": {
+ "message": "Патрэбна назва."
+ },
+ "addedFolder": {
+ "message": "Папка дададзена"
+ },
+ "changeMasterPass": {
+ "message": "Змяніць асноўны пароль"
+ },
+ "changeMasterPasswordConfirmation": {
+ "message": "Вы можаце змяніць свой асноўны пароль на bitwarden.com. Перайсці на сайт зараз?"
+ },
+ "twoStepLoginConfirmation": {
+ "message": "Двухэтапны ўваход робіць ваш уліковы запіс больш бяспечным, патрабуючы пацвярджэння ўваходу на іншай прыладзе, напрыклад, ключом бяспекі, праграмай для праверкі бяспекі, SMS, тэлефонным выклікам або электроннай поштай. Двухэтапны ўваход уключаецца на bitwarden.com. Перайсці на сайт зараз?"
+ },
+ "editedFolder": {
+ "message": "Папка адрэдагавана"
+ },
+ "deleteFolderConfirmation": {
+ "message": "Вы ўпэўнены, што хочаце выдаліць гэту папку?"
+ },
+ "deletedFolder": {
+ "message": "Папка выдалена"
+ },
+ "gettingStartedTutorial": {
+ "message": "Дапаможнік па пачатку працы"
+ },
+ "gettingStartedTutorialVideo": {
+ "message": "Праглядзіце невялікі навучальны матэрыял, каб даведацца. як атрымаць максімальную аддачу ад пашырэння браўзера."
+ },
+ "syncingComplete": {
+ "message": "Сінхранізацыя завершана"
+ },
+ "syncingFailed": {
+ "message": "Памылка сінхранізацыі"
+ },
+ "passwordCopied": {
+ "message": "Пароль скапіяваны"
+ },
+ "uri": {
+ "message": "URI"
+ },
+ "uriPosition": {
+ "message": "URI $POSITION$",
+ "description": "A listing of URIs. Ex: URI 1, URI 2, URI 3, etc.",
+ "placeholders": {
+ "position": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "newUri": {
+ "message": "Новы URI"
+ },
+ "addedItem": {
+ "message": "Элемент дададзены"
+ },
+ "editedItem": {
+ "message": "Элемент адрэдагаваны"
+ },
+ "deleteItemConfirmation": {
+ "message": "Вы ўпэўнены, што хочаце выдаліць гэты элемент?"
+ },
+ "deletedItem": {
+ "message": "Выдалены элемент"
+ },
+ "overwritePassword": {
+ "message": "Перазапісаць пароль"
+ },
+ "overwritePasswordConfirmation": {
+ "message": "Вы ўпэўнены, што хочаце перазапісаць бягучы пароль?"
+ },
+ "searchFolder": {
+ "message": "Пошук у папцы"
+ },
+ "searchCollection": {
+ "message": "Пошук у калекцыі"
+ },
+ "searchType": {
+ "message": "Пошук па тыпу"
+ },
+ "noneFolder": {
+ "message": "Без папкі",
+ "description": "This is the folder for uncategorized items"
+ },
+ "disableAddLoginNotification": {
+ "message": "Адключыць апавяшчэнне аб даданні ўліковых даных"
+ },
+ "addLoginNotificationDesc": {
+ "message": "Апавяшчэнне аб даданні ўліковых даных аўтаматычна прапануе вам захаваць новыя ўліковыя даныя ў сховішчы."
+ },
+ "dontShowCardsCurrentTab": {
+ "message": "Не паказваць карткі на панэлі ўкладак"
+ },
+ "dontShowCardsCurrentTabDesc": {
+ "message": "Карткі з вашага сховішча пералічаны на 'Бягучай укладцы' для спрашчэння доступу да аўтазапаўнення."
+ },
+ "dontShowIdentitiesCurrentTab": {
+ "message": "Не показывать Пасведчанні на панэлі картак"
+ },
+ "dontShowIdentitiesCurrentTabDesc": {
+ "message": "Элементы асабістых даных з вашага сховішча пералічаны на 'Бягучай укладцы' для спрашчэння доступу да аўтазапаўнення."
+ },
+ "clearClipboard": {
+ "message": "Ачыстка буфера абмену",
+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
+ },
+ "clearClipboardDesc": {
+ "message": "Аўтаматычна ачышчаць скапіяваныя значэнні з вашага буфера абмену.",
+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
+ },
+ "notificationAddDesc": {
+ "message": "Ці павінен Bitwarden запомніць гэты пароль?"
+ },
+ "notificationAddSave": {
+ "message": "Так, захаваць зараз"
+ },
+ "notificationNeverSave": {
+ "message": "Ніколі (для гэтага сайта)"
+ },
+ "disableChangedPasswordNotification": {
+ "message": "Адключыць апавяшчэнне аб змяненні пароля"
+ },
+ "disableChangedPasswordNotificationDesc": {
+ "message": "Апавяшчэнне аб змяненні пароля аўтаматычна прапануе вам абнавіць пароль уваходу ў сховішча, калі выявіць, што вы змянілі яго на вэб-сайце."
+ },
+ "notificationChangeDesc": {
+ "message": "Вы хочаце абнавіць гэты пароль у Bitwarden?"
+ },
+ "notificationChangeSave": {
+ "message": "Так, абнавіць зараз"
+ },
+ "disableContextMenuItem": {
+ "message": "Адключыць параметры кантэкстнага меню"
+ },
+ "disableContextMenuItemDesc": {
+ "message": "Параметры кантэкстнага меню забяспечваюць хуткі доступ да генератара пароляў і ўліковых даных для сайта на бягучай укладцы."
+ },
+ "defaultUriMatchDetection": {
+ "message": "Выяўленне супадзення URI па змаўчанні",
+ "description": "Default URI match detection for auto-fill."
+ },
+ "defaultUriMatchDetectionDesc": {
+ "message": "Выберыце спосаб па змаўчанні, які выкарыстоўваецца пры вызначэнні адпаведнасці URI для ўліковых даных пры выкананні такіх дзеянняў, як аўтаматычнае запаўненне."
+ },
+ "theme": {
+ "message": "Тэма"
+ },
+ "themeDesc": {
+ "message": "Змена колеравай тэмы праграмы."
+ },
+ "dark": {
+ "message": "Цёмная",
+ "description": "Dark color"
+ },
+ "light": {
+ "message": "Светлая",
+ "description": "Light color"
+ },
+ "solarizedDark": {
+ "message": "Цёмная Solarized",
+ "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated."
+ },
+ "exportVault": {
+ "message": "Экспарт сховішча"
+ },
+ "fileFormat": {
+ "message": "Фармат файла"
+ },
+ "warning": {
+ "message": "УВАГА",
+ "description": "WARNING (should stay in capitalized letters if the language permits)"
+ },
+ "confirmVaultExport": {
+ "message": "Пацвердзіць экспарт сховішча"
+ },
+ "exportWarningDesc": {
+ "message": "Экспартуемы файл утрымлівае даныя вашага сховішча ў незашыфраваным фармаце. Яго не варта захоўваць ці адпраўляць па небяспечным каналам (напрыклад, па электроннай пошце). Выдаліце яго адразу пасля выкарыстання."
+ },
+ "encExportKeyWarningDesc": {
+ "message": "This export encrypts your data using your account's encryption key. If you ever rotate your account's encryption key you should export again since you will not be able to decrypt this export file."
+ },
+ "encExportAccountWarningDesc": {
+ "message": "Account encryption keys are unique to each Bitwarden user account, so you can't import an encrypted export into a different account."
+ },
+ "exportMasterPassword": {
+ "message": "Увядзіце ваш асноўны пароль для экспарту даных са сховішча."
+ },
+ "shared": {
+ "message": "Абагуленыя"
+ },
+ "learnOrg": {
+ "message": "Learn about Organizations"
+ },
+ "learnOrgConfirmation": {
+ "message": "Bitwarden allows you to share your vault items with others by using an organization. Would you like to visit the bitwarden.com website to learn more?"
+ },
+ "moveToOrganization": {
+ "message": "Move to Organization"
+ },
+ "share": {
+ "message": "Абагуліць"
+ },
+ "movedItemToOrg": {
+ "message": "$ITEMNAME$ moved to $ORGNAME$",
+ "placeholders": {
+ "itemname": {
+ "content": "$1",
+ "example": "Secret Item"
+ },
+ "orgname": {
+ "content": "$2",
+ "example": "Company Name"
+ }
+ }
+ },
+ "moveToOrgDesc": {
+ "message": "Choose an organization that you wish to move this item to. Moving to an organization transfers ownership of the item to that organization. You will no longer be the direct owner of this item once it has been moved."
+ },
+ "learnMore": {
+ "message": "Даведацца больш"
+ },
+ "authenticatorKeyTotp": {
+ "message": "Ключ праверкі сапраўднасці (TOTP)"
+ },
+ "verificationCodeTotp": {
+ "message": "Код праверкі (TOTP)"
+ },
+ "copyVerificationCode": {
+ "message": "Капіяваць код праверкі"
+ },
+ "attachments": {
+ "message": "Далучэнні"
+ },
+ "deleteAttachment": {
+ "message": "Выдаліць далучэнне"
+ },
+ "deleteAttachmentConfirmation": {
+ "message": "Вы ўпэўнены, што хочаце выдаліць гэта далучэнне?"
+ },
+ "deletedAttachment": {
+ "message": "Далучэнне выдалена"
+ },
+ "newAttachment": {
+ "message": "Дадаць новае далучэнне"
+ },
+ "noAttachments": {
+ "message": "Няма далучэнняў."
+ },
+ "attachmentSaved": {
+ "message": "Далучэнне захавана."
+ },
+ "file": {
+ "message": "Файл"
+ },
+ "selectFile": {
+ "message": "Выберыце файл."
+ },
+ "maxFileSize": {
+ "message": "Максімальны памер файла 500 МБ."
+ },
+ "featureUnavailable": {
+ "message": "Функцыя недаступна"
+ },
+ "updateKey": {
+ "message": "Вы не можаце выкарыстоўваць гэту функцыю, пакуль не абнавіце свой ключ шыфравання."
+ },
+ "premiumMembership": {
+ "message": "Прэміяльны статус"
+ },
+ "premiumManage": {
+ "message": "Кіраванне статусам"
+ },
+ "premiumManageAlert": {
+ "message": "Вы можаце кіраваць сваім статусам на bitwarden.com. Перайсці на сайт зараз?"
+ },
+ "premiumRefresh": {
+ "message": "Абнавіць статус"
+ },
+ "premiumNotCurrentMember": {
+ "message": "На дадзены момант у вас не прэміяльны статус."
+ },
+ "premiumSignUpAndGet": {
+ "message": "Падпішыцеся на прэміяльны статус і атрымайце:"
+ },
+ "ppremiumSignUpStorage": {
+ "message": "1 ГБ зашыфраванага сховішча для далучаных файлаў."
+ },
+ "ppremiumSignUpTwoStep": {
+ "message": "Дадатковыя варыянты двухэтапнага ўваходу, такія як YubiKey, FIDO U2F і Duo."
+ },
+ "ppremiumSignUpReports": {
+ "message": "Гігіена пароляў, здароўе ўліковага запісу і справаздачы аб уцечках даных для забеспячэння бяспекі вашага сховішча."
+ },
+ "ppremiumSignUpTotp": {
+ "message": "TOTP-генератар кодаў (2ФА) для ўліковых даных вашага сховішча."
+ },
+ "ppremiumSignUpSupport": {
+ "message": "Прыярытэтная падтрымка."
+ },
+ "ppremiumSignUpFuture": {
+ "message": "Усе будучыя функцыі прэміяльнага статусу. Іх будзе больш!"
+ },
+ "premiumPurchase": {
+ "message": "Купіць прэміяльны статус"
+ },
+ "premiumPurchaseAlert": {
+ "message": "Вы можаце купіць прэміяльны статус на bitwarden.com. Перайсці на сайт зараз?"
+ },
+ "premiumCurrentMember": {
+ "message": "У вас прэміяльны статус!"
+ },
+ "premiumCurrentMemberThanks": {
+ "message": "Дзякуем вам за падтрымку Bitwarden."
+ },
+ "premiumPrice": {
+ "message": "Усяго толькі за $PRICE$ на год!",
+ "placeholders": {
+ "price": {
+ "content": "$1",
+ "example": "$10"
+ }
+ }
+ },
+ "refreshComplete": {
+ "message": "Абнаўленне завершана"
+ },
+ "disableAutoTotpCopy": {
+ "message": "Адключыць аўтаматычнае капіяванне TOTP"
+ },
+ "disableAutoTotpCopyDesc": {
+ "message": "Калі да вашых уліковых даных прымацаваны ключ праверкі сапраўднасці, то код пацвярджэння TOTP будзе скапіяваны пры аўтазапаўненні ўліковых даных."
+ },
+ "disableAutoBiometricsPrompt": {
+ "message": "Do not prompt for biometrics on launch"
+ },
+ "premiumRequired": {
+ "message": "Патрабуецца прэміяльны статус"
+ },
+ "premiumRequiredDesc": {
+ "message": "Для выкарыстання гэтай функцыі патрабуецца прэміяльны статус."
+ },
+ "enterVerificationCodeApp": {
+ "message": "Увядзіце 6 лічбаў кода праверкі з вашай праграмы праверкі сапраўднасці."
+ },
+ "enterVerificationCodeEmail": {
+ "message": "Увядзіце 6 лічбаў кода праверкі, які быў адпраўлены на $EMAIL$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "example@gmail.com"
+ }
+ }
+ },
+ "verificationCodeEmailSent": {
+ "message": "Адпраўлены ліст для пацвярджэння $EMAIL$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "example@gmail.com"
+ }
+ }
+ },
+ "rememberMe": {
+ "message": "Запомніць мяне"
+ },
+ "sendVerificationCodeEmailAgain": {
+ "message": "Адправіць код пацвярджэння зноў"
+ },
+ "useAnotherTwoStepMethod": {
+ "message": "Выкарыстоўваць іншы метад двухэтапнага ўваходу"
+ },
+ "insertYubiKey": {
+ "message": "Устаўце ваш YubiKey ў порт USB вашага камп'ютара, затым націсніце на кнопку."
+ },
+ "insertU2f": {
+ "message": "Устаўце ваш ключ бяспекі ў порт USB вашага камп'ютара. Калі на ім ёсць кнопка, націсніце на яе."
+ },
+ "webAuthnNewTab": {
+ "message": "To start the WebAuthn 2FA verification. Click the button below to open a new tab and follow the instructions provided in the new tab."
+ },
+ "webAuthnNewTabOpen": {
+ "message": "Open new tab"
+ },
+ "webAuthnAuthenticate": {
+ "message": "Authenticate WebAuthn"
+ },
+ "loginUnavailable": {
+ "message": "Уваход недаступны"
+ },
+ "noTwoStepProviders": {
+ "message": "У гэтага ўліковага запісу ўключаны двухэтапны ўваход, аднак ні адзін з наладжаных варыянтаў не падтрымліваецца гэтым вэб-браўзерам."
+ },
+ "noTwoStepProviders2": {
+ "message": "Выкарыстоўвайце актуальны вэб-браўзер (напрыклад, Chrome) і/або дадайце дадатковыя варыянты праверкі сапраўднасці, якія падтрымліваюцца ў вэб-браўзерах (напрыклад, праграма для праверкі сапраўднасці)."
+ },
+ "twoStepOptions": {
+ "message": "Параметры двухэтапнага ўваходу"
+ },
+ "recoveryCodeDesc": {
+ "message": "Згубілі доступ да ўсіх варыянтаў двухэтапнага ўваходу? Скарыстайцеся кодам аднаўлення, каб адключыць двухэтапны ўваход для вашага ўліковага запісу."
+ },
+ "recoveryCodeTitle": {
+ "message": "Код аднаўлення"
+ },
+ "authenticatorAppTitle": {
+ "message": "Праграма праверкі сапраўднасці"
+ },
+ "authenticatorAppDesc": {
+ "message": "Выкарыстоўвайце праграму для праверкі сапраўднасці (напрыклад, Authy або Google Authenticator) для стварэння кодаў праверкі на аснове часу.",
+ "description": "'Authy' and 'Google Authenticator' are product names and should not be translated."
+ },
+ "yubiKeyTitle": {
+ "message": "Ключ бяспекі YubiKey OTP"
+ },
+ "yubiKeyDesc": {
+ "message": "Выкарыстоўвайце YubiKey для доступу да вашага ўліковага запісу. Працуе з прыладамі YubiKey серый 4, 5 і NEO."
+ },
+ "duoDesc": {
+ "message": "Пацвярдзіце з дапамогай Duo Security, выкарыстоўваючы праграму Duo Mobile, SMS, тэлефонны выклік або ключ бяспекі.",
+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
+ },
+ "duoOrganizationDesc": {
+ "message": "Пацвярдзіце з дапамогай Duo Security для вашай арганізацыі, выкарыстоўваючы праграму Duo Mobile, SMS, тэлефонны выклік або ключ бяспекі.",
+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
+ },
+ "webAuthnTitle": {
+ "message": "FIDO2 WebAuthn"
+ },
+ "webAuthnDesc": {
+ "message": "Use any WebAuthn enabled security key to access your account."
+ },
+ "emailTitle": {
+ "message": "Электронная пошта"
+ },
+ "emailDesc": {
+ "message": "Коды пацвярджэння будуць адпраўлены вам па электроннай пошце."
+ },
+ "selfHostedEnvironment": {
+ "message": "Асяроддзе ўласнага хостынгу"
+ },
+ "selfHostedEnvironmentFooter": {
+ "message": "Увядзіце асноўны URL-адрас на вашым серверы."
+ },
+ "customEnvironment": {
+ "message": "Налады асяроддзя"
+ },
+ "customEnvironmentFooter": {
+ "message": "Для вопытных карыстальнікаў. Можна ўвесці URL-адрасы асобна для кжонай службы."
+ },
+ "baseUrl": {
+ "message": "URL-адрас сервера"
+ },
+ "apiUrl": {
+ "message": "API URL-адраса сервера"
+ },
+ "webVaultUrl": {
+ "message": "URL-адрас сервера вэб-сховішча"
+ },
+ "identityUrl": {
+ "message": "URL-адрас сервера ідэнтыфікацыі"
+ },
+ "notificationsUrl": {
+ "message": "URL-адрас сервера апавяшчэнняў"
+ },
+ "iconsUrl": {
+ "message": "URL-адрас сервера значкоў"
+ },
+ "environmentSaved": {
+ "message": "URL-адрас сервера асяроддзя захаваны."
+ },
+ "enableAutoFillOnPageLoad": {
+ "message": "Уключыць аўтазапаўненне пры загрузцы старонкі"
+ },
+ "enableAutoFillOnPageLoadDesc": {
+ "message": "Пры выяўленні формы ўваходу выконваецца аўтазапаўненне падчас загрузкі вэб-старонкі."
+ },
+ "experimentalFeature": {
+ "message": "Гэта эксперыментальная функцыя. Выкарыстоўвайце на свой страх і рызыку."
+ },
+ "defaultAutoFillOnPageLoad": {
+ "message": "Default autofill setting for login items"
+ },
+ "defaultAutoFillOnPageLoadDesc": {
+ "message": "After enabling Auto-fill on Page Load, you can enable or disable the feature for individual login items. This is the default setting for login items that are not separately configured."
+ },
+ "itemAutoFillOnPageLoad": {
+ "message": "Auto-fill on Page Load (if enabled in Options)"
+ },
+ "autoFillOnPageLoadUseDefault": {
+ "message": "Use default setting"
+ },
+ "autoFillOnPageLoadYes": {
+ "message": "Auto-fill on page load"
+ },
+ "autoFillOnPageLoadNo": {
+ "message": "Do not auto-fill on page load"
+ },
+ "commandOpenPopup": {
+ "message": "Адкрыць сховішча ва ўсплывальным акне"
+ },
+ "commandOpenSidebar": {
+ "message": "Адкрыць сховішча ў бакавой панэлі"
+ },
+ "commandAutofillDesc": {
+ "message": "Аўтазапаўненне апошніх скарыстаных уліковых даных для бягучага вэб-сайта."
+ },
+ "commandGeneratePasswordDesc": {
+ "message": "Стварыць і капіяваць новы выпадковы парольу буфер абмену."
+ },
+ "commandLockVaultDesc": {
+ "message": "Заблакіраваць сховішча"
+ },
+ "privateModeMessage": {
+ "message": "На жаль, гэта акно недаступна ў прыватным акне гэтага браўзара."
+ },
+ "customFields": {
+ "message": "Карыстальніцкія палі"
+ },
+ "copyValue": {
+ "message": "Капіяваць значэнне"
+ },
+ "value": {
+ "message": "Значэнне"
+ },
+ "newCustomField": {
+ "message": "Новае карыстальніцкае поле"
+ },
+ "dragToSort": {
+ "message": "Перацягніце для сартавання"
+ },
+ "cfTypeText": {
+ "message": "Тэкст"
+ },
+ "cfTypeHidden": {
+ "message": "Схавана"
+ },
+ "cfTypeBoolean": {
+ "message": "Лагічнае"
+ },
+ "popup2faCloseMessage": {
+ "message": "Націск за межамі гэтага акна для прагляду кода праверкі з электроннай пошты прывядзе да яго закрыцця. Адкрыць bitwarden у новым акне?"
+ },
+ "popupU2fCloseMessage": {
+ "message": "Гэты браўзар не можа апрацоўваць запыты U2F у гэтым усплывальным акне. Вы хочаце адкрыць гэта ўсплывальнае акно ў новым акне, каб мець магчымасць увайсці ў сістэму, выкарыстоўваючы U2F?"
+ },
+ "disableFavicon": {
+ "message": "Адключыць значкі вэб-сайтаў"
+ },
+ "disableFaviconDesc": {
+ "message": "Значкі вэб-сайтаў паказваюцца з кожным элементам у вашым сховішчы."
+ },
+ "disableBadgeCounter": {
+ "message": "Disable Badge Counter"
+ },
+ "disableBadgeCounterDesc": {
+ "message": "Badge counter indicates how many logins you have for the current page in your vault."
+ },
+ "cardholderName": {
+ "message": "Імя ўладальніка карткі"
+ },
+ "number": {
+ "message": "Нумар"
+ },
+ "brand": {
+ "message": "Тып карткі"
+ },
+ "expirationMonth": {
+ "message": "Месяц заканчэння"
+ },
+ "expirationYear": {
+ "message": "Год заканчэння"
+ },
+ "expiration": {
+ "message": "Тэрмін дзеяння"
+ },
+ "january": {
+ "message": "Студзень"
+ },
+ "february": {
+ "message": "Люты"
+ },
+ "march": {
+ "message": "Сакавік"
+ },
+ "april": {
+ "message": "Красавік"
+ },
+ "may": {
+ "message": "Май"
+ },
+ "june": {
+ "message": "Чэрвень"
+ },
+ "july": {
+ "message": "Ліпень"
+ },
+ "august": {
+ "message": "Жнівень"
+ },
+ "september": {
+ "message": "Верасень"
+ },
+ "october": {
+ "message": "Кастрычнік"
+ },
+ "november": {
+ "message": "Лістапад"
+ },
+ "december": {
+ "message": "Снежань"
+ },
+ "securityCode": {
+ "message": "Код бяспекі"
+ },
+ "ex": {
+ "message": "напр."
+ },
+ "title": {
+ "message": "Зварот"
+ },
+ "mr": {
+ "message": "С-р"
+ },
+ "mrs": {
+ "message": "С-ня"
+ },
+ "ms": {
+ "message": "Пані"
+ },
+ "dr": {
+ "message": "Док."
+ },
+ "firstName": {
+ "message": "Імя"
+ },
+ "middleName": {
+ "message": "Імя па бацьку"
+ },
+ "lastName": {
+ "message": "Прозвішча"
+ },
+ "identityName": {
+ "message": "Імя"
+ },
+ "company": {
+ "message": "Кампанія"
+ },
+ "ssn": {
+ "message": "Нумар сацыяльнага страхавання"
+ },
+ "passportNumber": {
+ "message": "Нумар пашпарта"
+ },
+ "licenseNumber": {
+ "message": "Нумар ліцэнзіі"
+ },
+ "email": {
+ "message": "Электронная пошта"
+ },
+ "phone": {
+ "message": "Тэлефон"
+ },
+ "address": {
+ "message": "Адрас"
+ },
+ "address1": {
+ "message": "Радок адрасу 1"
+ },
+ "address2": {
+ "message": "Радок адрасу 2"
+ },
+ "address3": {
+ "message": "Радок адрасу 3"
+ },
+ "cityTown": {
+ "message": "Горад / Пасёлак"
+ },
+ "stateProvince": {
+ "message": "Рэгіён / Вобласць"
+ },
+ "zipPostalCode": {
+ "message": "Паштовы індэкс"
+ },
+ "country": {
+ "message": "Краіна"
+ },
+ "type": {
+ "message": "Тып"
+ },
+ "typeLogin": {
+ "message": "Уліковыя даныя"
+ },
+ "typeLogins": {
+ "message": "Уліковыя даныя"
+ },
+ "typeSecureNote": {
+ "message": "Бяспечныя нататкі"
+ },
+ "typeCard": {
+ "message": "Картка"
+ },
+ "typeIdentity": {
+ "message": "Пасведчанне"
+ },
+ "passwordHistory": {
+ "message": "Гісторыя пароляў"
+ },
+ "back": {
+ "message": "Назад"
+ },
+ "collections": {
+ "message": "Калекцыі"
+ },
+ "favorites": {
+ "message": "Абраныя"
+ },
+ "popOutNewWindow": {
+ "message": "Перайсці ў новае акно"
+ },
+ "refresh": {
+ "message": "Абнавiць"
+ },
+ "cards": {
+ "message": "Карткі"
+ },
+ "identities": {
+ "message": "Пасведчанні"
+ },
+ "logins": {
+ "message": "Уліковыя даныя"
+ },
+ "secureNotes": {
+ "message": "Бяспечныя нататкі"
+ },
+ "clear": {
+ "message": "Ачысціць",
+ "description": "To clear something out. example: To clear browser history."
+ },
+ "checkPassword": {
+ "message": "Праверце, ці не скампраметаваны пароль."
+ },
+ "passwordExposed": {
+ "message": "Гэты пароль быў скампраметаваны $VALUE$ раз(-ы/-оў). Вы павінны змяніць яго.",
+ "placeholders": {
+ "value": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "passwordSafe": {
+ "message": "Гэты пароль не быў знойдзены ў вядомых базах уцечак. Можна працягваць яго выкарыстоўваць."
+ },
+ "baseDomain": {
+ "message": "Асноўны дамен"
+ },
+ "host": {
+ "message": "Хост",
+ "description": "A URL's host value. For example, the host of https://sub.domain.com:443 is 'sub.domain.com:443'."
+ },
+ "exact": {
+ "message": "Дакладна"
+ },
+ "startsWith": {
+ "message": "Пачынаецца з"
+ },
+ "regEx": {
+ "message": "Рэгулярны выраз",
+ "description": "A programming term, also known as 'RegEx'."
+ },
+ "matchDetection": {
+ "message": "Выяўленне супадзенняў",
+ "description": "URI match detection for auto-fill."
+ },
+ "defaultMatchDetection": {
+ "message": "Метад выяўлення па змаўчанні",
+ "description": "Default URI match detection for auto-fill."
+ },
+ "toggleOptions": {
+ "message": "Пераключыць параметры"
+ },
+ "toggleCurrentUris": {
+ "message": "Уключыць бягучыя URI укладак",
+ "description": "Toggle the display of the URIs of the currently open tabs in the browser."
+ },
+ "currentUri": {
+ "message": "Бягучы URI укладкі",
+ "description": "The URI of one of the current open tabs in the browser."
+ },
+ "organization": {
+ "message": "Арганізацыя",
+ "description": "An entity of multiple related people (ex. a team or business organization)."
+ },
+ "types": {
+ "message": "Тыпы"
+ },
+ "allItems": {
+ "message": "Усе элементы"
+ },
+ "noPasswordsInList": {
+ "message": "Няма пароляў для паказу."
+ },
+ "remove": {
+ "message": "Выдаліць"
+ },
+ "default": {
+ "message": "Па змаўчанні"
+ },
+ "dateUpdated": {
+ "message": "Абноўлена",
+ "description": "ex. Date this item was updated"
+ },
+ "datePasswordUpdated": {
+ "message": "Пароль абноўлены",
+ "description": "ex. Date this password was updated"
+ },
+ "neverLockWarning": {
+ "message": "Вы ўпэўнены, што хочаце адключыць блакіроўку сховішча? У гэтым выпадку ключ шыфравання вашага сховішча будзе захаваны на вашай прыладзе. Адключаючы блакіроўку, вы павінны пераканацца, што ваша прылада надзейна абаронена."
+ },
+ "noOrganizationsList": {
+ "message": "Вы не з'яўляецеся членам якой-небудзь арганізацыі. Арганізацыі дазваляюць бяспечна абменьвацца элементамі з іншымі карыстальнікамі."
+ },
+ "noCollectionsInList": {
+ "message": "Няма калекцый для паказу."
+ },
+ "ownership": {
+ "message": "Уладальнік"
+ },
+ "whoOwnsThisItem": {
+ "message": "Каму належыць гэты элемент?"
+ },
+ "strong": {
+ "message": "Моцны",
+ "description": "ex. A strong password. Scale: Weak -> Good -> Strong"
+ },
+ "good": {
+ "message": "Добры",
+ "description": "ex. A good password. Scale: Weak -> Good -> Strong"
+ },
+ "weak": {
+ "message": "Слабы",
+ "description": "ex. A weak password. Scale: Weak -> Good -> Strong"
+ },
+ "weakMasterPassword": {
+ "message": "Слабы асноўны пароль"
+ },
+ "weakMasterPasswordDesc": {
+ "message": "Асноўны пароль, выбраны вамі, з'яўляецца слабым. Для належнай абароны ўліковага запісу Bitwarden, вы павінны выкарыстоўваць моцны асноўны пароль (або парольную фразу). Вы ўпэўнены, што хочаце выкарыстоўваць гэты асноўны пароль?"
+ },
+ "pin": {
+ "message": "PIN-код",
+ "description": "PIN code. Ex. The short code (often numeric) that you use to unlock a device."
+ },
+ "unlockWithPin": {
+ "message": "Разблакіраваць PIN-кодам"
+ },
+ "setYourPinCode": {
+ "message": "Задайце PIN-код для разблакіроўкі Bitwarden. Налады PIN-кода будуць скінуты, калі вы калі-небудзь цалкам выйдзеце з праграмы."
+ },
+ "pinRequired": {
+ "message": "Патрабуецца PIN-код."
+ },
+ "invalidPin": {
+ "message": "Памылковы PIN-код."
+ },
+ "verifyPin": {
+ "message": "Праверыць PIN-код"
+ },
+ "yourVaultIsLockedPinCode": {
+ "message": "Ваша сховішча заблакіравана. Каб працягнуць, увядзіце PIN-код."
+ },
+ "unlockWithBiometrics": {
+ "message": "Unlock with biometrics"
+ },
+ "awaitDesktop": {
+ "message": "Awaiting confirmation from desktop"
+ },
+ "awaitDesktopDesc": {
+ "message": "Please confirm using biometrics in the Bitwarden Desktop application to enable biometrics for browser."
+ },
+ "lockWithMasterPassOnRestart": {
+ "message": "Блакіраваць асноўным паролем пры перазапуску браўзера"
+ },
+ "selectOneCollection": {
+ "message": "Вы павінны выбраць прынамсі адну калекцыю."
+ },
+ "cloneItem": {
+ "message": "Кланіраваць элемент"
+ },
+ "clone": {
+ "message": "Кланіраваць"
+ },
+ "passwordGeneratorPolicyInEffect": {
+ "message": "На налады генератара ўплываюць адна або некалькі палітык арганізацый."
+ },
+ "vaultTimeoutAction": {
+ "message": "Дзеянне пры тайм-аўце"
+ },
+ "lock": {
+ "message": "Заблакіраваць",
+ "description": "Verb form: to make secure or inaccesible by"
+ },
+ "trash": {
+ "message": "Сметніца",
+ "description": "Noun: a special folder to hold deleted items"
+ },
+ "searchTrash": {
+ "message": "Пошук у сметніцы"
+ },
+ "permanentlyDeleteItem": {
+ "message": "Выдаліць назаўсёды"
+ },
+ "permanentlyDeleteItemConfirmation": {
+ "message": "Вы ўпэўнены, што хочаце назаўсёды выдаліць гэты элемент?"
+ },
+ "permanentlyDeletedItem": {
+ "message": "Выдаленны назаўсёды элемент"
+ },
+ "restoreItem": {
+ "message": "Аднавіць элемент"
+ },
+ "restoreItemConfirmation": {
+ "message": "Вы сапраўды жадаеце аднавіць гэты элемент?"
+ },
+ "restoredItem": {
+ "message": "Элемент адноўлены"
+ },
+ "vaultTimeoutLogOutConfirmation": {
+ "message": "Выхад з сістэмы выдаліць доступ да сховішча і спатрабуе праверку сапраўднасці анлайн па заканчэнні перыяду чакання. Вы сапраўды жадаеце ўключыць гэтую наладу?"
+ },
+ "vaultTimeoutLogOutConfirmationTitle": {
+ "message": "Пацвярджэнне дзеяння для тайм-аута"
+ },
+ "autoFillAndSave": {
+ "message": "Запоўніць і захаваць"
+ },
+ "autoFillSuccessAndSavedUri": {
+ "message": "Аўтазапоўнены элемент і захаваны URI"
+ },
+ "autoFillSuccess": {
+ "message": "Аўтазапоўнены элемент"
+ },
+ "setMasterPassword": {
+ "message": "Задаць асноўны пароль"
+ },
+ "masterPasswordPolicyInEffect": {
+ "message": "Згодна з адной або некалькімі палітыкамі арганізацыі неабходна, каб ваш асноўны пароль адказваў наступным патрабаванням:"
+ },
+ "policyInEffectMinComplexity": {
+ "message": "Мінімальны ўзровень складанасці $SCORE$",
+ "placeholders": {
+ "score": {
+ "content": "$1",
+ "example": "4"
+ }
+ }
+ },
+ "policyInEffectMinLength": {
+ "message": "Мінімальная даўжыня $LENGTH$",
+ "placeholders": {
+ "length": {
+ "content": "$1",
+ "example": "14"
+ }
+ }
+ },
+ "policyInEffectUppercase": {
+ "message": "Уключыць адну ці больш прапісных літар"
+ },
+ "policyInEffectLowercase": {
+ "message": "Уключыць адну ці больш малых літар"
+ },
+ "policyInEffectNumbers": {
+ "message": "Уключыць адну ці больш лічбаў"
+ },
+ "policyInEffectSpecial": {
+ "message": "Уключаць хаця б адзін з наступных спецыяльных сімвалаў $CHARS$",
+ "placeholders": {
+ "chars": {
+ "content": "$1",
+ "example": "!@#$%^&*"
+ }
+ }
+ },
+ "masterPasswordPolicyRequirementsNotMet": {
+ "message": "Ваш новы асноўны пароль не адпавядае патрабаванням палітыкі арганізацыі."
+ },
+ "acceptPolicies": {
+ "message": "Ставіўшы гэты сцяжок вы пагаджаецеся з наступным:"
+ },
+ "acceptPoliciesError": {
+ "message": "Умовы выкарыстання і Палітыка прыватнасці не былі пацверджаны."
+ },
+ "termsOfService": {
+ "message": "Умовы выкарыстання"
+ },
+ "privacyPolicy": {
+ "message": "Палітыка прыватнасці"
+ },
+ "hintEqualsPassword": {
+ "message": "Your password hint cannot be the same as your password."
+ },
+ "ok": {
+ "message": "ОК"
+ },
+ "desktopSyncVerificationTitle": {
+ "message": "Desktop sync verification"
+ },
+ "desktopIntegrationVerificationText": {
+ "message": "Please verify that the desktop application shows this fingerprint: "
+ },
+ "desktopIntegrationDisabledTitle": {
+ "message": "Browser integration is not enabled"
+ },
+ "desktopIntegrationDisabledDesc": {
+ "message": "Browser integration is not enabled in the Bitwarden Desktop application. Please enable it in the settings within the desktop application."
+ },
+ "startDesktopTitle": {
+ "message": "Start the Bitwarden Desktop application"
+ },
+ "startDesktopDesc": {
+ "message": "The Bitwarden Desktop application needs to be started before this function can be used."
+ },
+ "errorEnableBiometricTitle": {
+ "message": "Unable to enable biometrics"
+ },
+ "errorEnableBiometricDesc": {
+ "message": "Action was canceled by the desktop application"
+ },
+ "nativeMessagingInvalidEncryptionDesc": {
+ "message": "Desktop application invalidated the secure communication channel. Please retry this operation"
+ },
+ "nativeMessagingInvalidEncryptionTitle": {
+ "message": "Desktop communication interrupted"
+ },
+ "nativeMessagingWrongUserDesc": {
+ "message": "The desktop application is logged into a different account. Please ensure both applications are logged into the same account."
+ },
+ "nativeMessagingWrongUserTitle": {
+ "message": "Account missmatch"
+ },
+ "biometricsNotEnabledTitle": {
+ "message": "Biometrics not enabled"
+ },
+ "biometricsNotEnabledDesc": {
+ "message": "Browser biometrics requires desktop biometric to be enabled in the settings first."
+ },
+ "biometricsNotSupportedTitle": {
+ "message": "Biometrics not supported"
+ },
+ "biometricsNotSupportedDesc": {
+ "message": "Browser biometrics is not supported on this device."
+ },
+ "nativeMessaginPermissionErrorTitle": {
+ "message": "Permission not provided"
+ },
+ "nativeMessaginPermissionErrorDesc": {
+ "message": "Without permission to communicate with the Bitwarden Desktop Application we cannot provide biometrics in the browser extension. Please try again."
+ },
+ "nativeMessaginPermissionSidebarTitle": {
+ "message": "Permission request error"
+ },
+ "nativeMessaginPermissionSidebarDesc": {
+ "message": "This action cannot be done in the sidebar, please retry the action in the popup or popout."
+ },
+ "personalOwnershipSubmitError": {
+ "message": "Due to an Enterprise Policy, you are restricted from saving items to your personal vault. Change the Ownership option to an organization and choose from available Collections."
+ },
+ "personalOwnershipPolicyInEffect": {
+ "message": "An organization policy is affecting your ownership options."
+ },
+ "excludedDomains": {
+ "message": "Excluded Domains"
+ },
+ "excludedDomainsDesc": {
+ "message": "Bitwarden will not ask to save login details for these domains. You must refresh the page for changes to take effect."
+ },
+ "excludedDomainsInvalidDomain": {
+ "message": "$DOMAIN$ is not a valid domain",
+ "placeholders": {
+ "domain": {
+ "content": "$1",
+ "example": "googlecom"
+ }
+ }
+ },
+ "send": {
+ "message": "Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "searchSends": {
+ "message": "Search Sends",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "addSend": {
+ "message": "Add Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTypeText": {
+ "message": "Text"
+ },
+ "sendTypeFile": {
+ "message": "File"
+ },
+ "allSends": {
+ "message": "All Sends",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "maxAccessCountReached": {
+ "message": "Max access count reached"
+ },
+ "expired": {
+ "message": "Expired"
+ },
+ "pendingDeletion": {
+ "message": "Pending deletion"
+ },
+ "passwordProtected": {
+ "message": "Password protected"
+ },
+ "copySendLink": {
+ "message": "Copy Send link",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "removePassword": {
+ "message": "Remove Password"
+ },
+ "delete": {
+ "message": "Delete"
+ },
+ "removedPassword": {
+ "message": "Removed Password"
+ },
+ "deletedSend": {
+ "message": "Deleted Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendLink": {
+ "message": "Send link",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "disabled": {
+ "message": "Disabled"
+ },
+ "removePasswordConfirmation": {
+ "message": "Are you sure you want to remove the password?"
+ },
+ "deleteSend": {
+ "message": "Delete Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "deleteSendConfirmation": {
+ "message": "Are you sure you want to delete this Send?",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "editSend": {
+ "message": "Edit Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTypeHeader": {
+ "message": "What type of Send is this?",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendNameDesc": {
+ "message": "A friendly name to describe this Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendFileDesc": {
+ "message": "The file you want to send."
+ },
+ "deletionDate": {
+ "message": "Deletion Date"
+ },
+ "deletionDateDesc": {
+ "message": "The Send will be permanently deleted on the specified date and time.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "expirationDate": {
+ "message": "Expiration Date"
+ },
+ "expirationDateDesc": {
+ "message": "If set, access to this Send will expire on the specified date and time.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "oneDay": {
+ "message": "1 day"
+ },
+ "days": {
+ "message": "$DAYS$ days",
+ "placeholders": {
+ "days": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "custom": {
+ "message": "Custom"
+ },
+ "maximumAccessCount": {
+ "message": "Maximum Access Count"
+ },
+ "maximumAccessCountDesc": {
+ "message": "If set, users will no longer be able to access this Send once the maximum access count is reached.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendPasswordDesc": {
+ "message": "Optionally require a password for users to access this Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendNotesDesc": {
+ "message": "Private notes about this Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendDisableDesc": {
+ "message": "Disable this Send so that no one can access it.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendShareDesc": {
+ "message": "Copy this Send's link to clipboard upon save.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTextDesc": {
+ "message": "The text you want to send."
+ },
+ "sendHideText": {
+ "message": "Hide this Send's text by default.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "currentAccessCount": {
+ "message": "Current Access Count"
+ },
+ "createSend": {
+ "message": "Create New Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "newPassword": {
+ "message": "New Password"
+ },
+ "sendDisabled": {
+ "message": "Send Disabled",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendDisabledWarning": {
+ "message": "Due to an enterprise policy, you are only able to delete an existing Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "createdSend": {
+ "message": "Created Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "editedSend": {
+ "message": "Edited Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendLinuxChromiumFileWarning": {
+ "message": "In order to choose a file, open the extension in the sidebar (if possible) or pop out to a new window by clicking this banner."
+ },
+ "sendFirefoxFileWarning": {
+ "message": "In order to choose a file using Firefox, open the extension in the sidebar or pop out to a new window by clicking this banner."
+ },
+ "sendSafariFileWarning": {
+ "message": "In order to choose a file using Safari, pop out to a new window by clicking this banner."
+ },
+ "sendFileCalloutHeader": {
+ "message": "Before you start"
+ },
+ "sendFirefoxCustomDatePopoutMessage1": {
+ "message": "To use a calendar style date picker",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read '**To use a calendar style date picker ** click here to pop out your window.'"
+ },
+ "sendFirefoxCustomDatePopoutMessage2": {
+ "message": "click here",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker **click here** to pop out your window.'"
+ },
+ "sendFirefoxCustomDatePopoutMessage3": {
+ "message": "to pop out your window.",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker click here **to pop out your window.**'"
+ },
+ "expirationDateIsInvalid": {
+ "message": "The expiration date provided is not valid."
+ },
+ "deletionDateIsInvalid": {
+ "message": "The deletion date provided is not valid."
+ },
+ "expirationDateAndTimeRequired": {
+ "message": "An expiration date and time are required."
+ },
+ "deletionDateAndTimeRequired": {
+ "message": "A deletion date and time are required."
+ },
+ "dateParsingError": {
+ "message": "There was an error saving your deletion and expiration dates."
+ },
+ "hideEmail": {
+ "message": "Hide my email address from recipients."
+ },
+ "sendOptionsPolicyInEffect": {
+ "message": "One or more organization policies are affecting your Send options."
+ },
+ "passwordPrompt": {
+ "message": "Master password re-prompt"
+ },
+ "passwordConfirmation": {
+ "message": "Master password confirmation"
+ },
+ "passwordConfirmationDesc": {
+ "message": "This action is protected. To continue, please re-enter your master password to verify your identity."
+ },
+ "emailVerificationRequired": {
+ "message": "Email Verification Required"
+ },
+ "emailVerificationRequiredDesc": {
+ "message": "You must verify your email to use this feature. You can verify your email in the web vault."
+ },
+ "updatedMasterPassword": {
+ "message": "Updated Master Password"
+ },
+ "updateMasterPassword": {
+ "message": "Update Master Password"
+ },
+ "updateMasterPasswordWarning": {
+ "message": "Your Master Password was recently changed by an administrator in your organization. In order to access the vault, you must update it now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour."
+ },
+ "resetPasswordPolicyAutoEnroll": {
+ "message": "Automatic Enrollment"
+ },
+ "resetPasswordAutoEnrollInviteWarning": {
+ "message": "This organization has an enterprise policy that will automatically enroll you in password reset. Enrollment will allow organization administrators to change your master password."
+ },
+ "selectFolder": {
+ "message": "Select folder..."
+ },
+ "ssoCompleteRegistration": {
+ "message": "In order to complete logging in with SSO, please set a master password to access and protect your vault."
+ },
+ "hours": {
+ "message": "Hours"
+ },
+ "minutes": {
+ "message": "Minutes"
+ },
+ "vaultTimeoutPolicyInEffect": {
+ "message": "Your organization policies are affecting your vault timeout. Maximum allowed Vault Timeout is $HOURS$ hour(s) and $MINUTES$ minute(s)",
+ "placeholders": {
+ "hours": {
+ "content": "$1",
+ "example": "5"
+ },
+ "minutes": {
+ "content": "$2",
+ "example": "5"
+ }
+ }
+ },
+ "vaultTimeoutToLarge": {
+ "message": "Your vault timeout exceeds the restrictions set by your organization."
+ },
+ "vaultExportDisabled": {
+ "message": "Vault Export Disabled"
+ },
+ "personalVaultExportPolicyInEffect": {
+ "message": "One or more organization policies prevents you from exporting your personal vault."
+ },
+ "copyCustomFieldNameInvalidElement": {
+ "message": "Unable to identify a valid form element. Try inspecting the HTML instead."
+ },
+ "copyCustomFieldNameNotUnique": {
+ "message": "No unique identifier found."
+ }
+}
diff --git a/src/iOS.Safari/Resources/_locales/bg/messages.json b/src/iOS.Safari/Resources/_locales/bg/messages.json
new file mode 100644
index 000000000..a0961221c
--- /dev/null
+++ b/src/iOS.Safari/Resources/_locales/bg/messages.json
@@ -0,0 +1,1817 @@
+{
+ "appName": {
+ "message": "Битуорден (Bitwarden)"
+ },
+ "extName": {
+ "message": "Bitwarden",
+ "description": "Extension name, MUST be less than 40 characters (Safari restriction)"
+ },
+ "extDesc": {
+ "message": "Безопасно и безплатно управление за всичките ви устройства.",
+ "description": "Extension description"
+ },
+ "loginOrCreateNewAccount": {
+ "message": "Впишете се или създайте нов абонамент, за да достъпите защитен трезор."
+ },
+ "createAccount": {
+ "message": "Създаване на абонамент"
+ },
+ "login": {
+ "message": "Вписване"
+ },
+ "enterpriseSingleSignOn": {
+ "message": "Еднократна идентификация (SSO)"
+ },
+ "cancel": {
+ "message": "Отказ"
+ },
+ "close": {
+ "message": "Затваряне"
+ },
+ "submit": {
+ "message": "Подаване"
+ },
+ "emailAddress": {
+ "message": "Е-поща"
+ },
+ "masterPass": {
+ "message": "Главна парола"
+ },
+ "masterPassDesc": {
+ "message": "Главната парола се използва за достъп до трезора ви. Запомнете я добре, защото възстановяването ѝ е абсолютно невъзможно."
+ },
+ "masterPassHintDesc": {
+ "message": "Ако сте забравили главната парола, то подсказването може да ви помогне да си я припомните."
+ },
+ "reTypeMasterPass": {
+ "message": "Въведете пак главната парола"
+ },
+ "masterPassHint": {
+ "message": "Подсказване за главната парола (по избор)"
+ },
+ "tab": {
+ "message": "Раздел"
+ },
+ "myVault": {
+ "message": "Моят трезор"
+ },
+ "tools": {
+ "message": "Средства"
+ },
+ "settings": {
+ "message": "Настройки"
+ },
+ "currentTab": {
+ "message": "Текущ раздел"
+ },
+ "copyPassword": {
+ "message": "Копиране на паролата"
+ },
+ "copyNote": {
+ "message": "Копиране на бележката"
+ },
+ "copyUri": {
+ "message": "Копиране на адреса"
+ },
+ "copyUsername": {
+ "message": "Копиране на потребителското име"
+ },
+ "copyNumber": {
+ "message": "Копиране на номера"
+ },
+ "copySecurityCode": {
+ "message": "Копиране на кода да сигурност"
+ },
+ "autoFill": {
+ "message": "Автоматично дописване"
+ },
+ "generatePasswordCopied": {
+ "message": "Генериране на парола (копирана)"
+ },
+ "copyElementIdentifier": {
+ "message": "Копиране на името на допълнителното поле"
+ },
+ "noMatchingLogins": {
+ "message": "Няма съвпадащи записи."
+ },
+ "vaultLocked": {
+ "message": "Трезорът е заключен."
+ },
+ "vaultLoggedOut": {
+ "message": "Излезли сте от трезора."
+ },
+ "autoFillInfo": {
+ "message": "В текущия раздел няма записи, които да бъдат попълнени."
+ },
+ "addLogin": {
+ "message": "Добавяне на запис"
+ },
+ "addItem": {
+ "message": "Добавяне на елемент"
+ },
+ "passwordHint": {
+ "message": "Подсказка за паролата"
+ },
+ "enterEmailToGetHint": {
+ "message": "Въведете адреса на имейла си, за да получите подсказка за главната си парола."
+ },
+ "getMasterPasswordHint": {
+ "message": "Подсказка за главната парола"
+ },
+ "continue": {
+ "message": "Продължаване"
+ },
+ "verificationCode": {
+ "message": "Код за потвърждаване"
+ },
+ "account": {
+ "message": "Регистрация"
+ },
+ "changeMasterPassword": {
+ "message": "Промяна на главната парола"
+ },
+ "fingerprintPhrase": {
+ "message": "Уникална фраза",
+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
+ },
+ "yourAccountsFingerprint": {
+ "message": "Уникална фраза, идентифицираща абонамента ви",
+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
+ },
+ "twoStepLogin": {
+ "message": "Двустепенно удостоверяване"
+ },
+ "logOut": {
+ "message": "Отписване"
+ },
+ "about": {
+ "message": "Относно"
+ },
+ "version": {
+ "message": "Версия"
+ },
+ "save": {
+ "message": "Запазване"
+ },
+ "move": {
+ "message": "Преместване"
+ },
+ "addFolder": {
+ "message": "Добавяне на папка"
+ },
+ "name": {
+ "message": "Име"
+ },
+ "editFolder": {
+ "message": "Редактиране на папка"
+ },
+ "deleteFolder": {
+ "message": "Изтриване на папка"
+ },
+ "folders": {
+ "message": "Папки"
+ },
+ "noFolders": {
+ "message": "Няма папки за показване."
+ },
+ "helpFeedback": {
+ "message": "Помощ и обратна връзка"
+ },
+ "sync": {
+ "message": "Синхронизиране"
+ },
+ "syncVaultNow": {
+ "message": "Синхронизиране сега"
+ },
+ "lastSync": {
+ "message": "Последно синхронизиране:"
+ },
+ "passGen": {
+ "message": "Генератор на пароли"
+ },
+ "generator": {
+ "message": "Генератор",
+ "description": "Short for 'Password Generator'."
+ },
+ "passGenInfo": {
+ "message": "Автоматично създаване на силни и неповторими пароли."
+ },
+ "bitWebVault": {
+ "message": "Уебтрезорът на Bitwarden"
+ },
+ "importItems": {
+ "message": "Внасяне на елементи"
+ },
+ "select": {
+ "message": "Избор"
+ },
+ "generatePassword": {
+ "message": "Генериране на парола"
+ },
+ "regeneratePassword": {
+ "message": "Регенериране на паролата"
+ },
+ "options": {
+ "message": "Опции"
+ },
+ "length": {
+ "message": "Дължина"
+ },
+ "numWords": {
+ "message": "Брой думи"
+ },
+ "wordSeparator": {
+ "message": "Разделител за думи"
+ },
+ "capitalize": {
+ "message": "Главни букви",
+ "description": "Make the first letter of a work uppercase."
+ },
+ "includeNumber": {
+ "message": "И цифри"
+ },
+ "minNumbers": {
+ "message": "Минимален брой цифри"
+ },
+ "minSpecial": {
+ "message": "Минимален брой специални знаци"
+ },
+ "avoidAmbChar": {
+ "message": "Без нееднозначни знаци"
+ },
+ "searchVault": {
+ "message": "Търсене в трезора"
+ },
+ "edit": {
+ "message": "Редактиране"
+ },
+ "view": {
+ "message": "Преглед"
+ },
+ "noItemsInList": {
+ "message": "Няма елементи за показване."
+ },
+ "itemInformation": {
+ "message": "Сведения за елемента"
+ },
+ "username": {
+ "message": "Потребителско име"
+ },
+ "password": {
+ "message": "Парола"
+ },
+ "passphrase": {
+ "message": "Парола за преминаване"
+ },
+ "favorite": {
+ "message": "Любими"
+ },
+ "notes": {
+ "message": "Бележки"
+ },
+ "note": {
+ "message": "Бележка"
+ },
+ "editItem": {
+ "message": "Редактиране на елемента"
+ },
+ "folder": {
+ "message": "Папка"
+ },
+ "deleteItem": {
+ "message": "Изтриване на елемента"
+ },
+ "viewItem": {
+ "message": "Преглед на елемента"
+ },
+ "launch": {
+ "message": "Пускане"
+ },
+ "website": {
+ "message": "Сайт"
+ },
+ "toggleVisibility": {
+ "message": "Превключване на видимостта"
+ },
+ "manage": {
+ "message": "Управление"
+ },
+ "other": {
+ "message": "Други"
+ },
+ "rateExtension": {
+ "message": "Оценяване на разширението"
+ },
+ "rateExtensionDesc": {
+ "message": "Молим да ни помогнете, като оставите положителен отзив!"
+ },
+ "browserNotSupportClipboard": {
+ "message": "Браузърът не поддържа копиране в буфера, затова копирайте на ръка."
+ },
+ "verifyMasterPassword": {
+ "message": "Потвърждаване на главната парола"
+ },
+ "yourVaultIsLocked": {
+ "message": "Трезорът е заключен — въведете главната си парола, за да продължите."
+ },
+ "unlock": {
+ "message": "Отключване"
+ },
+ "loggedInAsOn": {
+ "message": "Влезли сте като $EMAIL$ в $HOSTNAME$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "name@example.com"
+ },
+ "hostname": {
+ "content": "$2",
+ "example": "bitwarden.com"
+ }
+ }
+ },
+ "invalidMasterPassword": {
+ "message": "Грешна главна парола"
+ },
+ "vaultTimeout": {
+ "message": "Време за достъп"
+ },
+ "lockNow": {
+ "message": "Заключване сега"
+ },
+ "immediately": {
+ "message": "Незабавно"
+ },
+ "tenSeconds": {
+ "message": "10 секунди"
+ },
+ "twentySeconds": {
+ "message": "20 секунди"
+ },
+ "thirtySeconds": {
+ "message": "30 секунди"
+ },
+ "oneMinute": {
+ "message": "1 минута"
+ },
+ "twoMinutes": {
+ "message": "2 минути"
+ },
+ "fiveMinutes": {
+ "message": "5 минути"
+ },
+ "fifteenMinutes": {
+ "message": "15 минути"
+ },
+ "thirtyMinutes": {
+ "message": "30 минути"
+ },
+ "oneHour": {
+ "message": "1 час"
+ },
+ "fourHours": {
+ "message": "4 часа"
+ },
+ "onLocked": {
+ "message": "При заключване на системата"
+ },
+ "onRestart": {
+ "message": "При повторно пускане на четеца"
+ },
+ "never": {
+ "message": "Никога"
+ },
+ "security": {
+ "message": "Сигурност"
+ },
+ "errorOccurred": {
+ "message": "Възникна грешка"
+ },
+ "emailRequired": {
+ "message": "Електронната поща е задължителна."
+ },
+ "invalidEmail": {
+ "message": "Недействителна електронна поща."
+ },
+ "masterPassRequired": {
+ "message": "Главната парола е задължителна."
+ },
+ "masterPassLength": {
+ "message": "Главната парола трябва да съдържа поне 8 знака."
+ },
+ "masterPassDoesntMatch": {
+ "message": "Главната парола и потвърждението ѝ не съвпадат."
+ },
+ "newAccountCreated": {
+ "message": "Абонаментът ви бе създаден. Вече можете да се впишете."
+ },
+ "masterPassSent": {
+ "message": "Изпратихме ви писмо с подсказка за главната ви парола."
+ },
+ "verificationCodeRequired": {
+ "message": "Кодът за потвърждение е задължителен."
+ },
+ "valueCopied": {
+ "message": "$VALUE$ — копирано",
+ "description": "Value has been copied to the clipboard.",
+ "placeholders": {
+ "value": {
+ "content": "$1",
+ "example": "Password"
+ }
+ }
+ },
+ "autofillError": {
+ "message": "Неуспешно автоматично попълване. Вместо това копирайте и поставете данните."
+ },
+ "loggedOut": {
+ "message": "Бяхте отписани"
+ },
+ "loginExpired": {
+ "message": "Сесията ви изтече."
+ },
+ "logOutConfirmation": {
+ "message": "Сигурни ли сте, че искате да се отпишете?"
+ },
+ "yes": {
+ "message": "Да"
+ },
+ "no": {
+ "message": "Не"
+ },
+ "unexpectedError": {
+ "message": "Възникна неочаквана грешка."
+ },
+ "nameRequired": {
+ "message": "Изисква се име."
+ },
+ "addedFolder": {
+ "message": "Добавена папка"
+ },
+ "changeMasterPass": {
+ "message": "Промяна на главната парола"
+ },
+ "changeMasterPasswordConfirmation": {
+ "message": "Главната парола на трезор може да се промени чрез сайта bitwarden.com. Искате ли да го посетите?"
+ },
+ "twoStepLoginConfirmation": {
+ "message": "Двустепенното вписване защитава регистрацията ви, като ви кара да потвърдите влизането си чрез устройство-ключ, приложение за удостоверение, мобилно съобщение, телефонно обаждане или електронна поща. Двустепенното вписване може да се включи чрез сайта bitwarden.com. Искате ли да го посетите?"
+ },
+ "editedFolder": {
+ "message": "Редактирана папка"
+ },
+ "deleteFolderConfirmation": {
+ "message": "Сигурни ли сте, че искате да изтриете тази папка?"
+ },
+ "deletedFolder": {
+ "message": "Изтрита папка"
+ },
+ "gettingStartedTutorial": {
+ "message": "Въведение"
+ },
+ "gettingStartedTutorialVideo": {
+ "message": "Изгледайте въведението, за да извлечете максимална полза от разширението Bitwarden."
+ },
+ "syncingComplete": {
+ "message": "Синхронизацията завърши"
+ },
+ "syncingFailed": {
+ "message": "Неуспешно синхронизиране"
+ },
+ "passwordCopied": {
+ "message": "Копирана парола"
+ },
+ "uri": {
+ "message": "Адрес"
+ },
+ "uriPosition": {
+ "message": "Адрес $POSITION$",
+ "description": "A listing of URIs. Ex: URI 1, URI 2, URI 3, etc.",
+ "placeholders": {
+ "position": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "newUri": {
+ "message": "Нов адрес"
+ },
+ "addedItem": {
+ "message": "Елементът е добавен"
+ },
+ "editedItem": {
+ "message": "Елементът е редактиран"
+ },
+ "deleteItemConfirmation": {
+ "message": "Наистина ли искате да изтриете елемента?"
+ },
+ "deletedItem": {
+ "message": "Елементът е изтрит"
+ },
+ "overwritePassword": {
+ "message": "Презаписване на паролата"
+ },
+ "overwritePasswordConfirmation": {
+ "message": "Наистина ли искате да презапишете текущата парола?"
+ },
+ "searchFolder": {
+ "message": "Търсене в папката"
+ },
+ "searchCollection": {
+ "message": "Търсене в колекцията"
+ },
+ "searchType": {
+ "message": "Търсене по вид"
+ },
+ "noneFolder": {
+ "message": "Няма папка",
+ "description": "This is the folder for uncategorized items"
+ },
+ "disableAddLoginNotification": {
+ "message": "Без известия за запазване на регистрации"
+ },
+ "addLoginNotificationDesc": {
+ "message": "Известията за запазване на регистрации автоматично ви подканят да запазите новите регистрации в трезора при първото ви вписване в тях."
+ },
+ "dontShowCardsCurrentTab": {
+ "message": "Без карти в основния прозорец"
+ },
+ "dontShowCardsCurrentTabDesc": {
+ "message": "Скриване на записите за платежните карти, които обичайно се извеждат в основния прозорец за лесно въвеждане."
+ },
+ "dontShowIdentitiesCurrentTab": {
+ "message": "Без самоличности в основния прозорец"
+ },
+ "dontShowIdentitiesCurrentTabDesc": {
+ "message": "Скриване на записите за самоличност, които обичайно се извеждат в основния прозорец за лесно въвеждане."
+ },
+ "clearClipboard": {
+ "message": "Изчистване на буфера",
+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
+ },
+ "clearClipboardDesc": {
+ "message": "Автоматично изчистване на буфера след поставяне на стойността.",
+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
+ },
+ "notificationAddDesc": {
+ "message": "Искате ли тази парола да бъде запазена?"
+ },
+ "notificationAddSave": {
+ "message": "Да, нека се запише сега"
+ },
+ "notificationNeverSave": {
+ "message": "Никога за този сайт"
+ },
+ "disableChangedPasswordNotification": {
+ "message": "Без известия за обновяване на регистрации"
+ },
+ "disableChangedPasswordNotificationDesc": {
+ "message": "Известията за обновяване на регистрации автоматично ви подканят да запазите променените регистрации в трезора при засичането на промяната."
+ },
+ "notificationChangeDesc": {
+ "message": "Да се обнови ли паролата в Bitwarden?"
+ },
+ "notificationChangeSave": {
+ "message": "Да, нека се обнови сега"
+ },
+ "disableContextMenuItem": {
+ "message": "Без добавки към контекстното меню"
+ },
+ "disableContextMenuItemDesc": {
+ "message": "Добавките към контекстното меню позволяват бърз достъп до данните за сайтовете в текущия раздел, както и създаването на нова парола."
+ },
+ "defaultUriMatchDetection": {
+ "message": "Стандартно засичане на адреси",
+ "description": "Default URI match detection for auto-fill."
+ },
+ "defaultUriMatchDetectionDesc": {
+ "message": "Какъв да е начинът, по който да се засича съответствие на адреса за автоматичното попълване на данните."
+ },
+ "theme": {
+ "message": "Облик"
+ },
+ "themeDesc": {
+ "message": "Промяна на цветовия облик на програмата."
+ },
+ "dark": {
+ "message": "Тъмен",
+ "description": "Dark color"
+ },
+ "light": {
+ "message": "Светъл",
+ "description": "Light color"
+ },
+ "solarizedDark": {
+ "message": "Преекспонирано тъмен",
+ "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated."
+ },
+ "exportVault": {
+ "message": "Изнасяне на трезора"
+ },
+ "fileFormat": {
+ "message": "Формат на файла"
+ },
+ "warning": {
+ "message": "ВНИМАНИЕ",
+ "description": "WARNING (should stay in capitalized letters if the language permits)"
+ },
+ "confirmVaultExport": {
+ "message": "Потвърждаване на изнасянето на трезора"
+ },
+ "exportWarningDesc": {
+ "message": "Данните от трезора ви ще се изнесат в незащитен формат. Не го пращайте по незащитени канали като е-поща. Изтрийте файла незабавно след като свършите работата си с него."
+ },
+ "encExportKeyWarningDesc": {
+ "message": "При изнасяне данните се шифрират с ключа ви. Ако го смените, ще трябва наново да ги изнесете, защото няма да може да дешифрирате настоящия файл."
+ },
+ "encExportAccountWarningDesc": {
+ "message": "Ключовете за шифриране са уникални за всеки потребител, затова не може да внесете шифрирани данни от един потребител в регистрацията на друг."
+ },
+ "exportMasterPassword": {
+ "message": "Въведете главната парола, за да изнесете данните."
+ },
+ "shared": {
+ "message": "Споделено"
+ },
+ "learnOrg": {
+ "message": "Разберете повече за организациите"
+ },
+ "learnOrgConfirmation": {
+ "message": "Битуорден позволява да споделяте части от трезора си чрез използването на организация. Искате ли да научите повече от сайта bitwarden.com?"
+ },
+ "moveToOrganization": {
+ "message": "Преместване в организация"
+ },
+ "share": {
+ "message": "Споделяне"
+ },
+ "movedItemToOrg": {
+ "message": "$ITEMNAME$ се премести в $ORGNAME$",
+ "placeholders": {
+ "itemname": {
+ "content": "$1",
+ "example": "Secret Item"
+ },
+ "orgname": {
+ "content": "$2",
+ "example": "Company Name"
+ }
+ }
+ },
+ "moveToOrgDesc": {
+ "message": "Изберете организацията, в която искате да преместите записа. Преместването прехвърля собствеността му към новата организация. След това няма вече директно да го притежавате."
+ },
+ "learnMore": {
+ "message": "Научете повече"
+ },
+ "authenticatorKeyTotp": {
+ "message": "Удостоверителен ключ (TOTP)"
+ },
+ "verificationCodeTotp": {
+ "message": "Код за потвърждаване (TOTP)"
+ },
+ "copyVerificationCode": {
+ "message": "Копиране на кода за потвърждаване"
+ },
+ "attachments": {
+ "message": "Прикачвания"
+ },
+ "deleteAttachment": {
+ "message": "Изтриване на прикачения файл"
+ },
+ "deleteAttachmentConfirmation": {
+ "message": "Сигурни ли сте, че искате да изтриете прикачения файл?"
+ },
+ "deletedAttachment": {
+ "message": "Прикаченият файл е изтрит"
+ },
+ "newAttachment": {
+ "message": "Прикачване на файл"
+ },
+ "noAttachments": {
+ "message": "Няма прикачени файлове."
+ },
+ "attachmentSaved": {
+ "message": "Прикаченият файл е запазен."
+ },
+ "file": {
+ "message": "Файл"
+ },
+ "selectFile": {
+ "message": "Изберете файл."
+ },
+ "maxFileSize": {
+ "message": "Големината на файла е най-много 500 MB."
+ },
+ "featureUnavailable": {
+ "message": "Функцията е недостъпна"
+ },
+ "updateKey": {
+ "message": "Трябва да обновите шифриращия си ключ, за да използвате тази възможност."
+ },
+ "premiumMembership": {
+ "message": "Платен абонамент"
+ },
+ "premiumManage": {
+ "message": "Управление на абонамента"
+ },
+ "premiumManageAlert": {
+ "message": "Можете да управлявате абонамента си през сайта bitwarden.com. Искате ли да го посетите сега?"
+ },
+ "premiumRefresh": {
+ "message": "Опресняване на абонамента"
+ },
+ "premiumNotCurrentMember": {
+ "message": "В момента ползвате безплатен абонамент."
+ },
+ "premiumSignUpAndGet": {
+ "message": "Платеният абонамент дава следните предимства:"
+ },
+ "ppremiumSignUpStorage": {
+ "message": "1 GB пространство за файлове, които се шифрират."
+ },
+ "ppremiumSignUpTwoStep": {
+ "message": "Двустепенно удостоверяване чрез YubiKey, FIDO U2F и Duo."
+ },
+ "ppremiumSignUpReports": {
+ "message": "Проверки в списъците с публикувани пароли, проверка на регистрациите и доклади за пробивите в сигурността, което спомага трезорът ви да е допълнително защитен."
+ },
+ "ppremiumSignUpTotp": {
+ "message": "Генериране на временни, еднократни кодове за двустепенно удостоверяване за регистрациите в трезора."
+ },
+ "ppremiumSignUpSupport": {
+ "message": "Приоритетна поддръжка."
+ },
+ "ppremiumSignUpFuture": {
+ "message": "Всички бъдещи функции на платения абонамент! Предстои въвеждането на още!"
+ },
+ "premiumPurchase": {
+ "message": "Покупка на платен абонамент"
+ },
+ "premiumPurchaseAlert": {
+ "message": "Може да платите абонамента си през сайта bitwarden.com. Искате ли да го посетите сега?"
+ },
+ "premiumCurrentMember": {
+ "message": "Честито, ползвате платен абонамент!"
+ },
+ "premiumCurrentMemberThanks": {
+ "message": "Благодарим ви за подкрепата на Bitwarden."
+ },
+ "premiumPrice": {
+ "message": "И това само за $PRICE$ на година!",
+ "placeholders": {
+ "price": {
+ "content": "$1",
+ "example": "$10"
+ }
+ }
+ },
+ "refreshComplete": {
+ "message": "Абонаментът е опреснен"
+ },
+ "disableAutoTotpCopy": {
+ "message": "Без автоматично копиране на временни, еднократни пароли"
+ },
+ "disableAutoTotpCopyDesc": {
+ "message": "Ако регистрацията използва и удостоверителен ключ, временният, еднократен код се копира в буфера при всяко автоматично попълване на формуляра."
+ },
+ "disableAutoBiometricsPrompt": {
+ "message": "Да не се изискват биометрични данни при стартиране"
+ },
+ "premiumRequired": {
+ "message": "Изисква се платен абонамент"
+ },
+ "premiumRequiredDesc": {
+ "message": "За да се възползвате от тази възможност, трябва да ползвате платен абонамент."
+ },
+ "enterVerificationCodeApp": {
+ "message": "Въведете шестцифрения код за потвърждение от приложението за удостоверяване."
+ },
+ "enterVerificationCodeEmail": {
+ "message": "Въведете шестцифрения код за потвърждение, който е бил изпратен на $EMAIL$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "example@gmail.com"
+ }
+ }
+ },
+ "verificationCodeEmailSent": {
+ "message": "Писмото за потвърждение е изпратено на $EMAIL$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "example@gmail.com"
+ }
+ }
+ },
+ "rememberMe": {
+ "message": "Запомняне"
+ },
+ "sendVerificationCodeEmailAgain": {
+ "message": "Повторно изпращане на писмото за потвърждение"
+ },
+ "useAnotherTwoStepMethod": {
+ "message": "Използвайте друг начин на двустепенно удостоверяване"
+ },
+ "insertYubiKey": {
+ "message": "Поставете устройството на YubiKey в USB порт на компютъра и натиснете бутона на устройството."
+ },
+ "insertU2f": {
+ "message": "Поставете устройството за удостоверяване в USB порт на компютъра. Ако на устройството има бутон, натиснете го."
+ },
+ "webAuthnNewTab": {
+ "message": "Продължаване на двустепенното удостоверяване чрез WebAuthn в новия раздел."
+ },
+ "webAuthnNewTabOpen": {
+ "message": "Отваряне на нов раздел"
+ },
+ "webAuthnAuthenticate": {
+ "message": "Идентификация WebAuthn"
+ },
+ "loginUnavailable": {
+ "message": "Записът липсва"
+ },
+ "noTwoStepProviders": {
+ "message": "Регистрацията е защитена с двустепенно удостоверяване, но никой от настроените доставчици на удостоверяване не се поддържа от този браузър."
+ },
+ "noTwoStepProviders2": {
+ "message": "Пробвайте с поддържан уеб браузър (като Chrome или Firefox) и други доставчици на удостоверяване, които се поддържат от браузърите (като специални програми за удостоверяване)."
+ },
+ "twoStepOptions": {
+ "message": "Настройки на двустепенното удостоверяване"
+ },
+ "recoveryCodeDesc": {
+ "message": "Ако сте загубили достъп до двустепенното удостоверяване, може да използвате код за възстановяване, за да изключите двустепенното удостоверяване в абонамента си."
+ },
+ "recoveryCodeTitle": {
+ "message": "Код за възстановяване"
+ },
+ "authenticatorAppTitle": {
+ "message": "Приложение за удостоверяване"
+ },
+ "authenticatorAppDesc": {
+ "message": "Използвайте приложение за удостоверяване (като Authy или Google Authenticator) за генерирането на временни кодове за потвърждение.",
+ "description": "'Authy' and 'Google Authenticator' are product names and should not be translated."
+ },
+ "yubiKeyTitle": {
+ "message": "Устройство YubiKey OTP"
+ },
+ "yubiKeyDesc": {
+ "message": "Използвайте устройство на YubiKey, за да влезете в абонамента си. Поддържат се моделите YubiKey 4, 4 Nano, 4C и NEO."
+ },
+ "duoDesc": {
+ "message": "Удостоверяване чрез Duo Security, с ползване на приложението Duo Mobile, SMS, телефонен разговор или устройство U2F.",
+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
+ },
+ "duoOrganizationDesc": {
+ "message": "Удостоверяване чрез Duo Security за организацията ви, с ползване на приложението Duo Mobile, SMS, телефонен разговор или устройство U2F.",
+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
+ },
+ "webAuthnTitle": {
+ "message": "FIDO2 WebAuthn"
+ },
+ "webAuthnDesc": {
+ "message": "Използвайте всяко устройство, поддържащо WebAuthn, за да влезете в абонамента си."
+ },
+ "emailTitle": {
+ "message": "Електронна поща"
+ },
+ "emailDesc": {
+ "message": "Кодовете за потвърждение ще ви бъдат пратени по е-поща."
+ },
+ "selfHostedEnvironment": {
+ "message": "Собствена среда"
+ },
+ "selfHostedEnvironmentFooter": {
+ "message": "Укажете базовия адрес за собствената ви инсталирана среда на Bitwarden."
+ },
+ "customEnvironment": {
+ "message": "Специална среда"
+ },
+ "customEnvironmentFooter": {
+ "message": "За специални случаи. Може да укажете основните адреси на всяка ползвана услуга поотделно."
+ },
+ "baseUrl": {
+ "message": "Адрес на сървъра"
+ },
+ "apiUrl": {
+ "message": "Адрес на ППИ-сървъра"
+ },
+ "webVaultUrl": {
+ "message": "Адрес на сървъра с трезора в уеб"
+ },
+ "identityUrl": {
+ "message": "Адрес на сървъра със самоличности"
+ },
+ "notificationsUrl": {
+ "message": "Адрес на сървъра за уведомления"
+ },
+ "iconsUrl": {
+ "message": "Адрес на сървъра с иконки"
+ },
+ "environmentSaved": {
+ "message": "Средата с адресите е запазена."
+ },
+ "enableAutoFillOnPageLoad": {
+ "message": "Включване на автоматичното попълване"
+ },
+ "enableAutoFillOnPageLoadDesc": {
+ "message": "При засичане на формуляр за вписване при зареждането на уеб страницата автоматично да се попълват данните на съответстващата регистрация."
+ },
+ "experimentalFeature": {
+ "message": "Това все още е в експериментална фаза, ползвате го на собствена глава."
+ },
+ "defaultAutoFillOnPageLoad": {
+ "message": "Стандартна настройка за автоматичното попълване"
+ },
+ "defaultAutoFillOnPageLoadDesc": {
+ "message": "Ако включите автоматичното попълване при зареждане на страница, след това можете да включвате или изключвате тази функционалност за всеки отделен запис. Това ще бъде стандартният начин на работа за записите, за които не е настроено допълнително."
+ },
+ "itemAutoFillOnPageLoad": {
+ "message": "Автоматично попълване при зареждане на страницата (ако е включено в настройките)"
+ },
+ "autoFillOnPageLoadUseDefault": {
+ "message": "Използване на стандартната настройка"
+ },
+ "autoFillOnPageLoadYes": {
+ "message": "Автоматично попълване при зареждане на страницата"
+ },
+ "autoFillOnPageLoadNo": {
+ "message": "Без автоматично попълване при зареждане на страницата"
+ },
+ "commandOpenPopup": {
+ "message": "Отваряне на трезора в изскачащ прозорец"
+ },
+ "commandOpenSidebar": {
+ "message": "Отваряне на трезора в страничната лента"
+ },
+ "commandAutofillDesc": {
+ "message": "Автоматично попълване на последно използвания запис в текущия сайт."
+ },
+ "commandGeneratePasswordDesc": {
+ "message": "Създаване и копиране на нова случайна парола в буфера."
+ },
+ "commandLockVaultDesc": {
+ "message": "Заключване на трезора"
+ },
+ "privateModeMessage": {
+ "message": "За жалост този прозорец не може да се ползва в изолирани раздели на браузъра ви."
+ },
+ "customFields": {
+ "message": "Допълнителни полета"
+ },
+ "copyValue": {
+ "message": "Копиране на стойността"
+ },
+ "value": {
+ "message": "Стойност"
+ },
+ "newCustomField": {
+ "message": "Ново допълнително поле"
+ },
+ "dragToSort": {
+ "message": "Подредба чрез влачене"
+ },
+ "cfTypeText": {
+ "message": "Текст"
+ },
+ "cfTypeHidden": {
+ "message": "Скрито"
+ },
+ "cfTypeBoolean": {
+ "message": "Булево"
+ },
+ "popup2faCloseMessage": {
+ "message": "Ако натиснете бутон на мишката извън изскочилия прозорец за кода за потвърждение, същият този прозорец ще се затвори. Искате ли проверката да се извърши в нормален прозорец, който не се затваря толкова лесно?"
+ },
+ "popupU2fCloseMessage": {
+ "message": "Този браузър не поддържа заявки чрез U2F в такъв изскачащ прозорец. Искате ли да се отвори нов прозорец, за да може да се впишете чрез U2F?"
+ },
+ "disableFavicon": {
+ "message": "Без иконки на сайтовете"
+ },
+ "disableFaviconDesc": {
+ "message": "Иконките на сайтовете са разпознаваемо изображение за всеки запис в трезора."
+ },
+ "disableBadgeCounter": {
+ "message": "Изключване на значката с брояч"
+ },
+ "disableBadgeCounterDesc": {
+ "message": "Значката с брояч показва колко варианта за вписване имате в трезора си за текущата страница."
+ },
+ "cardholderName": {
+ "message": "Име на притежателя на картата"
+ },
+ "number": {
+ "message": "Номер"
+ },
+ "brand": {
+ "message": "Вид"
+ },
+ "expirationMonth": {
+ "message": "Месец на изтичане"
+ },
+ "expirationYear": {
+ "message": "Година на изтичане"
+ },
+ "expiration": {
+ "message": "Изтичане"
+ },
+ "january": {
+ "message": "януари"
+ },
+ "february": {
+ "message": "февруари"
+ },
+ "march": {
+ "message": "март"
+ },
+ "april": {
+ "message": "април"
+ },
+ "may": {
+ "message": "май"
+ },
+ "june": {
+ "message": "юни"
+ },
+ "july": {
+ "message": "юли"
+ },
+ "august": {
+ "message": "август"
+ },
+ "september": {
+ "message": "септември"
+ },
+ "october": {
+ "message": "октомври"
+ },
+ "november": {
+ "message": "ноември"
+ },
+ "december": {
+ "message": "декември"
+ },
+ "securityCode": {
+ "message": "Код за сигурност"
+ },
+ "ex": {
+ "message": "напр."
+ },
+ "title": {
+ "message": "Заглавие"
+ },
+ "mr": {
+ "message": "Г-н"
+ },
+ "mrs": {
+ "message": "Г-жа"
+ },
+ "ms": {
+ "message": "Г-ца"
+ },
+ "dr": {
+ "message": "Д-р"
+ },
+ "firstName": {
+ "message": "Собствено име"
+ },
+ "middleName": {
+ "message": "Презиме"
+ },
+ "lastName": {
+ "message": "Фамилно име"
+ },
+ "identityName": {
+ "message": "Име на самоличността"
+ },
+ "company": {
+ "message": "Фирма"
+ },
+ "ssn": {
+ "message": "№ на осигуровката"
+ },
+ "passportNumber": {
+ "message": "№ на паспорта"
+ },
+ "licenseNumber": {
+ "message": "№ на лиценза"
+ },
+ "email": {
+ "message": "Електронна поща"
+ },
+ "phone": {
+ "message": "Телефон"
+ },
+ "address": {
+ "message": "Адрес"
+ },
+ "address1": {
+ "message": "Адрес 1"
+ },
+ "address2": {
+ "message": "Адрес 2"
+ },
+ "address3": {
+ "message": "Адрес 3"
+ },
+ "cityTown": {
+ "message": "Населено място"
+ },
+ "stateProvince": {
+ "message": "Област / щат / провинция"
+ },
+ "zipPostalCode": {
+ "message": "Пощенски код"
+ },
+ "country": {
+ "message": "Държава"
+ },
+ "type": {
+ "message": "Вид"
+ },
+ "typeLogin": {
+ "message": "Запис"
+ },
+ "typeLogins": {
+ "message": "Записи"
+ },
+ "typeSecureNote": {
+ "message": "Защитена бележка"
+ },
+ "typeCard": {
+ "message": "Карта"
+ },
+ "typeIdentity": {
+ "message": "Самоличност"
+ },
+ "passwordHistory": {
+ "message": "Хронология на паролата"
+ },
+ "back": {
+ "message": "Назад"
+ },
+ "collections": {
+ "message": "Колекции"
+ },
+ "favorites": {
+ "message": "Любими"
+ },
+ "popOutNewWindow": {
+ "message": "Отваряне в нов прозорец"
+ },
+ "refresh": {
+ "message": "Опресняване"
+ },
+ "cards": {
+ "message": "Карти"
+ },
+ "identities": {
+ "message": "Самоличности"
+ },
+ "logins": {
+ "message": "Записи"
+ },
+ "secureNotes": {
+ "message": "Защитени бележки"
+ },
+ "clear": {
+ "message": "Изчистване",
+ "description": "To clear something out. example: To clear browser history."
+ },
+ "checkPassword": {
+ "message": "Проверка дали паролата е разкрита."
+ },
+ "passwordExposed": {
+ "message": "Паролата е била разкрита поне $VALUE$ път/и в пробиви. Непременно я сменете.",
+ "placeholders": {
+ "value": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "passwordSafe": {
+ "message": "Паролата не е била разкрита в известните пробиви. Засега ползването ѝ изглежда безопасно."
+ },
+ "baseDomain": {
+ "message": "Основен домейн"
+ },
+ "host": {
+ "message": "Сървър",
+ "description": "A URL's host value. For example, the host of https://sub.domain.com:443 is 'sub.domain.com:443'."
+ },
+ "exact": {
+ "message": "Точно"
+ },
+ "startsWith": {
+ "message": "Започва с"
+ },
+ "regEx": {
+ "message": "Регулярен израз",
+ "description": "A programming term, also known as 'RegEx'."
+ },
+ "matchDetection": {
+ "message": "Откриване на съвпадения",
+ "description": "URI match detection for auto-fill."
+ },
+ "defaultMatchDetection": {
+ "message": "Стандартно откриване на съвпадения",
+ "description": "Default URI match detection for auto-fill."
+ },
+ "toggleOptions": {
+ "message": "Настройки на превключване"
+ },
+ "toggleCurrentUris": {
+ "message": "Превключване на текущите адреси",
+ "description": "Toggle the display of the URIs of the currently open tabs in the browser."
+ },
+ "currentUri": {
+ "message": "Текущ адрес",
+ "description": "The URI of one of the current open tabs in the browser."
+ },
+ "organization": {
+ "message": "Организация",
+ "description": "An entity of multiple related people (ex. a team or business organization)."
+ },
+ "types": {
+ "message": "Видове"
+ },
+ "allItems": {
+ "message": "Всички елементи"
+ },
+ "noPasswordsInList": {
+ "message": "Няма пароли за показване."
+ },
+ "remove": {
+ "message": "Премахване"
+ },
+ "default": {
+ "message": "Стандартно"
+ },
+ "dateUpdated": {
+ "message": "Обновено",
+ "description": "ex. Date this item was updated"
+ },
+ "datePasswordUpdated": {
+ "message": "Обновена парола",
+ "description": "ex. Date this password was updated"
+ },
+ "neverLockWarning": {
+ "message": "Уверени ли сте, че искате да зададете стойност „Никога“? Това води до съхранение на шифриращия ключ за трезора във устройството ви. Ако използвате тази възможност, е много важно да имате надлежна защита на устройството си."
+ },
+ "noOrganizationsList": {
+ "message": "Не сте член на никоя организация. Организациите позволяват да споделяте записи с други потребители по защитен начин."
+ },
+ "noCollectionsInList": {
+ "message": "Няма колекции за показване."
+ },
+ "ownership": {
+ "message": "Собственост"
+ },
+ "whoOwnsThisItem": {
+ "message": "Кой притежава този запис?"
+ },
+ "strong": {
+ "message": "Силна",
+ "description": "ex. A strong password. Scale: Weak -> Good -> Strong"
+ },
+ "good": {
+ "message": "Добра",
+ "description": "ex. A good password. Scale: Weak -> Good -> Strong"
+ },
+ "weak": {
+ "message": "Слаба",
+ "description": "ex. A weak password. Scale: Weak -> Good -> Strong"
+ },
+ "weakMasterPassword": {
+ "message": "Слаба главна парола"
+ },
+ "weakMasterPasswordDesc": {
+ "message": "Зададената главна парола е твърде слаба. Главната парола трябва да е силна. Добре е да ползвате цяла фраза за парола, за да защитите данните в трезора в Bitwarden. Уверени ли сте, че искате да ползвате слаба парола?"
+ },
+ "pin": {
+ "message": "ПИН",
+ "description": "PIN code. Ex. The short code (often numeric) that you use to unlock a device."
+ },
+ "unlockWithPin": {
+ "message": "Отключване с ПИН"
+ },
+ "setYourPinCode": {
+ "message": "Задайте ПИН за отключване на Bitwarden. Настройките за ПИН се изчистват при всяко пълно излизане от програмата."
+ },
+ "pinRequired": {
+ "message": "Необходим е ПИН."
+ },
+ "invalidPin": {
+ "message": "Неправилен ПИН."
+ },
+ "verifyPin": {
+ "message": "Потвърждаване на ПИН"
+ },
+ "yourVaultIsLockedPinCode": {
+ "message": "Трезорът е заключен. Въведете своя ПИН, за да продължите."
+ },
+ "unlockWithBiometrics": {
+ "message": "Отключване с биометрични данни"
+ },
+ "awaitDesktop": {
+ "message": "Чака се потвърждение от самостоятелното приложение"
+ },
+ "awaitDesktopDesc": {
+ "message": "За да включите потвърждаване с биометрични данни в браузъра, потвърдете ползването им в самостоятелното приложение."
+ },
+ "lockWithMasterPassOnRestart": {
+ "message": "Заключване с главната парола при повторно пускане на браузъра"
+ },
+ "selectOneCollection": {
+ "message": "Изберете поне една колекция."
+ },
+ "cloneItem": {
+ "message": "Дублирате на елемент"
+ },
+ "clone": {
+ "message": "Клониране"
+ },
+ "passwordGeneratorPolicyInEffect": {
+ "message": "Поне една политика на организация влияе на настройките на генерирането на паролите."
+ },
+ "vaultTimeoutAction": {
+ "message": "Действие при изтичане на времето"
+ },
+ "lock": {
+ "message": "Заключване",
+ "description": "Verb form: to make secure or inaccesible by"
+ },
+ "trash": {
+ "message": "Кошче",
+ "description": "Noun: a special folder to hold deleted items"
+ },
+ "searchTrash": {
+ "message": "Търсене в кошчето"
+ },
+ "permanentlyDeleteItem": {
+ "message": "Окончателно изтриване на запис"
+ },
+ "permanentlyDeleteItemConfirmation": {
+ "message": "Сигурни ли сте, че искате да изтриете записа окончателно?"
+ },
+ "permanentlyDeletedItem": {
+ "message": "Записът е изтрит окончателно"
+ },
+ "restoreItem": {
+ "message": "Възстановяване на запис"
+ },
+ "restoreItemConfirmation": {
+ "message": "Сигурни ли сте, че искате да възстановите записа?"
+ },
+ "restoredItem": {
+ "message": "Записът е възстановен"
+ },
+ "vaultTimeoutLogOutConfirmation": {
+ "message": "Излизането от трезора изцяло спира достъпа до него след изтичане на времето. Ще ви се наложи отново да се идентифицирате, за да го достъпите. Сигурни ли сте, че искате това действие?"
+ },
+ "vaultTimeoutLogOutConfirmationTitle": {
+ "message": "Потвърждаване на действието"
+ },
+ "autoFillAndSave": {
+ "message": "Дописване и обновяване"
+ },
+ "autoFillSuccessAndSavedUri": {
+ "message": "Автоматично дописан запис и адрес"
+ },
+ "autoFillSuccess": {
+ "message": "Автоматично дописан запис"
+ },
+ "setMasterPassword": {
+ "message": "Задаване на главна парола"
+ },
+ "masterPasswordPolicyInEffect": {
+ "message": "Поне една политика на организация има следните изисквания към главната ви парола:"
+ },
+ "policyInEffectMinComplexity": {
+ "message": "Минимална сложност от $SCORE$",
+ "placeholders": {
+ "score": {
+ "content": "$1",
+ "example": "4"
+ }
+ }
+ },
+ "policyInEffectMinLength": {
+ "message": "Минимална дължина: $LENGTH$",
+ "placeholders": {
+ "length": {
+ "content": "$1",
+ "example": "14"
+ }
+ }
+ },
+ "policyInEffectUppercase": {
+ "message": "Поне една главна буква"
+ },
+ "policyInEffectLowercase": {
+ "message": "Поне една малка буква"
+ },
+ "policyInEffectNumbers": {
+ "message": "Поне една цифра"
+ },
+ "policyInEffectSpecial": {
+ "message": "Поне един от следните специални знаци: $CHARS$",
+ "placeholders": {
+ "chars": {
+ "content": "$1",
+ "example": "!@#$%^&*"
+ }
+ }
+ },
+ "masterPasswordPolicyRequirementsNotMet": {
+ "message": "Паролата ви не отговаря на политиките."
+ },
+ "acceptPolicies": {
+ "message": "Чрез тази отметка вие се съгласявате със следното:"
+ },
+ "acceptPoliciesError": {
+ "message": "Условията за използване и политиката за поверителност не бяха приети."
+ },
+ "termsOfService": {
+ "message": "Общи условия"
+ },
+ "privacyPolicy": {
+ "message": "Политика за поверителност"
+ },
+ "hintEqualsPassword": {
+ "message": "Подсказването за паролата не може да съвпада с нея."
+ },
+ "ok": {
+ "message": "Добре"
+ },
+ "desktopSyncVerificationTitle": {
+ "message": "Потвърждаване на синхронизацията на самостоятелното приложение"
+ },
+ "desktopIntegrationVerificationText": {
+ "message": "Уверете се, че самостоятелното приложение показва следния идентификатор:"
+ },
+ "desktopIntegrationDisabledTitle": {
+ "message": "Интеграцията с браузър е изключена"
+ },
+ "desktopIntegrationDisabledDesc": {
+ "message": "Интеграцията с браузъри не е включена в самостоятелното приложение на Битуорден. Включете я в неговите настройки."
+ },
+ "startDesktopTitle": {
+ "message": "Стартиране на самостоятелното приложение на Битуорден"
+ },
+ "startDesktopDesc": {
+ "message": "Трябва да стартирате самостоятелното приложение на Битуорден, преди да ползвате тази функционалност."
+ },
+ "errorEnableBiometricTitle": {
+ "message": "Потвърждаването с биометрични данни не може да се включи"
+ },
+ "errorEnableBiometricDesc": {
+ "message": "Действието е отменено от самостоятелното приложение"
+ },
+ "nativeMessagingInvalidEncryptionDesc": {
+ "message": "Самостоятелното приложение прекъсна надеждния канал за връзка. Пробвайте отново"
+ },
+ "nativeMessagingInvalidEncryptionTitle": {
+ "message": "Връзката със самостоятелното приложение е нарушена"
+ },
+ "nativeMessagingWrongUserDesc": {
+ "message": "В момента самостоятелното приложение е с регистрация на различен потребител. За да работят заедно, двете приложения трябва да ползват една и съща регистрация."
+ },
+ "nativeMessagingWrongUserTitle": {
+ "message": "Регистрациите са различни"
+ },
+ "biometricsNotEnabledTitle": {
+ "message": "Потвърждаването с биометрични данни не е включено"
+ },
+ "biometricsNotEnabledDesc": {
+ "message": "Потвърждаването с биометрични данни в браузъра изисква включването включването им в настройките за самостоятелното приложение."
+ },
+ "biometricsNotSupportedTitle": {
+ "message": "Потвърждаването с биометрични данни не се поддържа"
+ },
+ "biometricsNotSupportedDesc": {
+ "message": "Устройството не поддържа потвърждаване с биометрични данни."
+ },
+ "nativeMessaginPermissionErrorTitle": {
+ "message": "Правото не е дадено"
+ },
+ "nativeMessaginPermissionErrorDesc": {
+ "message": "Разширението за браузъра не може да осигури потвърждаване с биометрични данни, когато липсва право за връзка със самостоятелното приложение. Пробвайте отново."
+ },
+ "nativeMessaginPermissionSidebarTitle": {
+ "message": "Необходимо е разрешение"
+ },
+ "nativeMessaginPermissionSidebarDesc": {
+ "message": "Това действие не може да бъде извършено в страничната лента, опитайте отново в изскачащ прозорец."
+ },
+ "personalOwnershipSubmitError": {
+ "message": "Заради някоя политика за голяма организация не може да запазвате елементи в собствения си трезор. Променете собствеността да е на организация и изберете от наличните колекции."
+ },
+ "personalOwnershipPolicyInEffect": {
+ "message": "Политика от някоя организация влияе на вариантите за собственост."
+ },
+ "excludedDomains": {
+ "message": "Изключени домейни"
+ },
+ "excludedDomainsDesc": {
+ "message": "Битуорден няма да пита дали да запазва данните за вход в тези сайтове. За да влезе правилото в сила, презаредете страницата."
+ },
+ "excludedDomainsInvalidDomain": {
+ "message": "$DOMAIN$ не е валиден домейн",
+ "placeholders": {
+ "domain": {
+ "content": "$1",
+ "example": "googlecom"
+ }
+ }
+ },
+ "send": {
+ "message": "Изпращане",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "searchSends": {
+ "message": "Търсене в изпратените",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "addSend": {
+ "message": "Добавяне на изпращане",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTypeText": {
+ "message": "Текст"
+ },
+ "sendTypeFile": {
+ "message": "Файл"
+ },
+ "allSends": {
+ "message": "Всички изпращания",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "maxAccessCountReached": {
+ "message": "Достигнат е максималният брой достъпвания"
+ },
+ "expired": {
+ "message": "Изтекъл"
+ },
+ "pendingDeletion": {
+ "message": "Предстои изтриване"
+ },
+ "passwordProtected": {
+ "message": "Защита с парола"
+ },
+ "copySendLink": {
+ "message": "Копиране на връзката към изпратеното",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "removePassword": {
+ "message": "Премахване на парола"
+ },
+ "delete": {
+ "message": "Изтриване"
+ },
+ "removedPassword": {
+ "message": "Паролата е премахната"
+ },
+ "deletedSend": {
+ "message": "Изтрито изпращане",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendLink": {
+ "message": "Изпращане на връзката",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "disabled": {
+ "message": "Изключено"
+ },
+ "removePasswordConfirmation": {
+ "message": "Сигурни ли сте, че искате да премахнете паролата?"
+ },
+ "deleteSend": {
+ "message": "Изтриване на изпращане",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "deleteSendConfirmation": {
+ "message": "Сигурни ли сте, че искате да изтриете това изпращане?",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "editSend": {
+ "message": "Редактиране на изпращане",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTypeHeader": {
+ "message": "Вид на изпратеното",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendNameDesc": {
+ "message": "Описателно име за това изпращане.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendFileDesc": {
+ "message": "Файл за изпращане."
+ },
+ "deletionDate": {
+ "message": "Дата на изтриване"
+ },
+ "deletionDateDesc": {
+ "message": "Изпращането ще бъде окончателно изтрито на зададената дата и време.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "expirationDate": {
+ "message": "Срок на валидност"
+ },
+ "expirationDateDesc": {
+ "message": "При задаване — това изпращане ще се изключи на зададената дата и време.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "oneDay": {
+ "message": "1 ден"
+ },
+ "days": {
+ "message": "$DAYS$ ден/дни",
+ "placeholders": {
+ "days": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "custom": {
+ "message": "По избор"
+ },
+ "maximumAccessCount": {
+ "message": "Максимален брой достъпвания."
+ },
+ "maximumAccessCountDesc": {
+ "message": "При задаване — това изпращане ще се изключи след определен брой достъпвания.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendPasswordDesc": {
+ "message": "Изискване на парола за достъп до това изпращане.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendNotesDesc": {
+ "message": "Скрити бележки за това изпращане.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendDisableDesc": {
+ "message": "Пълно спиране на това изпращане — никой няма да има достъп.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendShareDesc": {
+ "message": "Копиране на връзката към това изпращане при запазването му.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTextDesc": {
+ "message": "Текст за изпращане."
+ },
+ "sendHideText": {
+ "message": "Стандартно текстът на това изпращане да се крие.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "currentAccessCount": {
+ "message": "Текущ брой на достъпванията"
+ },
+ "createSend": {
+ "message": "Създаване на изпращане",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "newPassword": {
+ "message": "Нова парола"
+ },
+ "sendDisabled": {
+ "message": "Изпращането е изключено",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendDisabledWarning": {
+ "message": "Поради политика на организация, може само да изтривате съществуващи изпращания.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "createdSend": {
+ "message": "Създадено изпращане",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "editedSend": {
+ "message": "Редактирано изпращане",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendLinuxChromiumFileWarning": {
+ "message": "За да изберете файл, отворете разширението в страничната лента (ако е възможно) или в нов прозорец, като натиснете това съобщение."
+ },
+ "sendFirefoxFileWarning": {
+ "message": "За да изберете файл във Firefox, отворете разширението в страничната лента или в нов прозорец, като натиснете това съобщение."
+ },
+ "sendSafariFileWarning": {
+ "message": "За да изберете файл в Safari, отворете разширението в нов прозорец, като натиснете това съобщение."
+ },
+ "sendFileCalloutHeader": {
+ "message": "Преди да почнете"
+ },
+ "sendFirefoxCustomDatePopoutMessage1": {
+ "message": "За избор на дата от каландар",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read '**To use a calendar style date picker ** click here to pop out your window.'"
+ },
+ "sendFirefoxCustomDatePopoutMessage2": {
+ "message": "натиснете тук",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker **click here** to pop out your window.'"
+ },
+ "sendFirefoxCustomDatePopoutMessage3": {
+ "message": "за изскачащ прозорец.",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker click here **to pop out your window.**'"
+ },
+ "expirationDateIsInvalid": {
+ "message": "Неправилна дата на валидност."
+ },
+ "deletionDateIsInvalid": {
+ "message": "Неправилна дата на изтриване."
+ },
+ "expirationDateAndTimeRequired": {
+ "message": "Необходими са дата и време на валидност."
+ },
+ "deletionDateAndTimeRequired": {
+ "message": "Необходима е дата на изтриване."
+ },
+ "dateParsingError": {
+ "message": "Грешка при запазване на датата на валидност и изтриване."
+ },
+ "hideEmail": {
+ "message": "Скриване на е-пощата ми от получателите."
+ },
+ "sendOptionsPolicyInEffect": {
+ "message": "Поне една политика на организация влияе на настройките за изпращане."
+ },
+ "passwordPrompt": {
+ "message": "Повторно запитване за главната парола"
+ },
+ "passwordConfirmation": {
+ "message": "Потвърждение на главната парола"
+ },
+ "passwordConfirmationDesc": {
+ "message": "Това действие е защитено. За да продължите, въведете отново главната си парола, за да потвърдите самоличността си."
+ },
+ "emailVerificationRequired": {
+ "message": "Изисква се потвърждение на е-пощата"
+ },
+ "emailVerificationRequiredDesc": {
+ "message": "Трябва да потвърдите е-пощата си, за да използвате тази функционалност. Можете да го направите в уеб-трезора."
+ },
+ "updatedMasterPassword": {
+ "message": "Главната парола е променена"
+ },
+ "updateMasterPassword": {
+ "message": "Промяна на главната парола"
+ },
+ "updateMasterPasswordWarning": {
+ "message": "Вашата главна парола наскоро е била сменена от администратор в организацията Ви. За да получите достъп до трезора, трябва първо да я промените. Това означава, че ще бъдете отписан(а) от текущата си сесия и ще трябва да се впишете отново. Активните сесии на други устройства може да продължат да бъдат активни още един час."
+ },
+ "resetPasswordPolicyAutoEnroll": {
+ "message": "Автоматично включване"
+ },
+ "resetPasswordAutoEnrollInviteWarning": {
+ "message": "Тази организация включва автоматично новите си потребители в смяната на пароли. Това означава, че администраторите на организацията ще могат да променят главната Ви парола."
+ },
+ "selectFolder": {
+ "message": "Избиране на папка..."
+ },
+ "ssoCompleteRegistration": {
+ "message": "За да завършите настройките за еднократна идентификация, трябва да зададете главна парола за трезора."
+ },
+ "hours": {
+ "message": "Hours"
+ },
+ "minutes": {
+ "message": "Minutes"
+ },
+ "vaultTimeoutPolicyInEffect": {
+ "message": "Настройките на организацията Ви влияят върху времето за достъп до трезора Ви. Максималното разрешено време за достъп е $HOURS$ час(а) и $MINUTES$ минути",
+ "placeholders": {
+ "hours": {
+ "content": "$1",
+ "example": "5"
+ },
+ "minutes": {
+ "content": "$2",
+ "example": "5"
+ }
+ }
+ },
+ "vaultTimeoutToLarge": {
+ "message": "Времето за достъп до трезора Ви превишава ограничението, определено от организацията Ви."
+ },
+ "vaultExportDisabled": {
+ "message": "Изнасянето на трезора е изключено"
+ },
+ "personalVaultExportPolicyInEffect": {
+ "message": "Една или повече от настройките на организацията Ви не позволяват да изнасяте личния си трезор."
+ },
+ "copyCustomFieldNameInvalidElement": {
+ "message": "Не може да бъде открит подходящ елемент от формуляр. Опитайте да инспектирате кода на HTML."
+ },
+ "copyCustomFieldNameNotUnique": {
+ "message": "Няма намерен уникален идентификатор."
+ }
+}
diff --git a/src/iOS.Safari/Resources/_locales/bn/messages.json b/src/iOS.Safari/Resources/_locales/bn/messages.json
new file mode 100644
index 000000000..7bca93eec
--- /dev/null
+++ b/src/iOS.Safari/Resources/_locales/bn/messages.json
@@ -0,0 +1,1817 @@
+{
+ "appName": {
+ "message": "Bitwarden"
+ },
+ "extName": {
+ "message": "Bitwarden",
+ "description": "Extension name, MUST be less than 40 characters (Safari restriction)"
+ },
+ "extDesc": {
+ "message": "আপনার সমস্ত ডিভাইসের জন্য একটি সুরক্ষিত এবং বিনামূল্যের পাসওয়ার্ড ব্যবস্থাপক।",
+ "description": "Extension description"
+ },
+ "loginOrCreateNewAccount": {
+ "message": "আপনার সুরক্ষিত ভল্টে প্রবেশ করতে লগ ইন করুন অথবা একটি নতুন অ্যাকাউন্ট তৈরি করুন।"
+ },
+ "createAccount": {
+ "message": "অ্যাকাউন্ট তৈরি করুন"
+ },
+ "login": {
+ "message": "প্রবেশ করুন"
+ },
+ "enterpriseSingleSignOn": {
+ "message": "এন্টারপ্রাইজ একক সাইন-অন"
+ },
+ "cancel": {
+ "message": "বাতিল"
+ },
+ "close": {
+ "message": "বন্ধ করুন"
+ },
+ "submit": {
+ "message": "জমা দিন"
+ },
+ "emailAddress": {
+ "message": "ইমেইল ঠিকানা"
+ },
+ "masterPass": {
+ "message": "মূল পাসওয়ার্ড"
+ },
+ "masterPassDesc": {
+ "message": "মূল পাসওয়ার্ড হল সেই পাসওয়ার্ডটি যা আপনি নিজের ভল্ট ব্যাবহার করতে ব্যবহার করেন। এটি খুব গুরুত্বপূর্ণ যে আপনি নিজের মূল পাসওয়ার্ডটি ভুলে যাবেন না। আপনি যদি ভুলে গিয়ে থাকেন তবে পাসওয়ার্ডটি পুনরুদ্ধার করার কোনও উপায় নেই।"
+ },
+ "masterPassHintDesc": {
+ "message": "যদি আপনি আপনার পাসওয়ার্ড ভুলে যান তাহলে একটি মূল পাসওয়ার্ডের ইঙ্গিতটি আপনাকে মনে করাতে সাহায্য করতে পারে।"
+ },
+ "reTypeMasterPass": {
+ "message": "পুনরায় মূল পাসওয়ার্ডটি লিখুন"
+ },
+ "masterPassHint": {
+ "message": "মূল পাসওয়ার্ড ইঙ্গিত (ঐচ্ছিক)"
+ },
+ "tab": {
+ "message": "ট্যাব"
+ },
+ "myVault": {
+ "message": "আমার ভল্ট"
+ },
+ "tools": {
+ "message": "সরঞ্জামসমূহ"
+ },
+ "settings": {
+ "message": "সেটিংস"
+ },
+ "currentTab": {
+ "message": "বর্তমান ট্যাব"
+ },
+ "copyPassword": {
+ "message": "পাসওয়ার্ড অনুলিপিত করুন"
+ },
+ "copyNote": {
+ "message": "নোট অনুলিপিত করুন"
+ },
+ "copyUri": {
+ "message": "URI অনুলিপিত করুন"
+ },
+ "copyUsername": {
+ "message": "ব্যবহারকারীর নাম অনুলিপিত করুন"
+ },
+ "copyNumber": {
+ "message": "নম্বর অনুলিপিত করুন"
+ },
+ "copySecurityCode": {
+ "message": "সুরক্ষা কোড অনুলিপিত করুন"
+ },
+ "autoFill": {
+ "message": "স্বতঃপূরণ"
+ },
+ "generatePasswordCopied": {
+ "message": "পাসওয়ার্ড তৈরি করুন (অনুলিপিকৃত)"
+ },
+ "copyElementIdentifier": {
+ "message": "Copy Custom Field Name"
+ },
+ "noMatchingLogins": {
+ "message": "কোনও মিলত লগইন নেই।"
+ },
+ "vaultLocked": {
+ "message": "ভল্ট লক করা আছে।"
+ },
+ "vaultLoggedOut": {
+ "message": "ভল্ট লগ আউট হয়েছে।"
+ },
+ "autoFillInfo": {
+ "message": "বর্তমান ব্রাউজার ট্যাবের জন্য স্বয়ংক্রিয় পূরণের কোনও লগইন উপলব্ধ নেই।"
+ },
+ "addLogin": {
+ "message": "একটি লগইন জুড়ুন "
+ },
+ "addItem": {
+ "message": "বস্তু জুড়ুন"
+ },
+ "passwordHint": {
+ "message": "পাসওয়ার্ড ইঙ্গিত"
+ },
+ "enterEmailToGetHint": {
+ "message": "আপনার মূল পাসওয়ার্ডের ইঙ্গিতটি পেতে আপনার অ্যাকাউন্টের ইমেল ঠিকানা প্রবেশ করুন।"
+ },
+ "getMasterPasswordHint": {
+ "message": "মূল পাসওয়ার্ডের ইঙ্গিত পান"
+ },
+ "continue": {
+ "message": "অবিরত"
+ },
+ "verificationCode": {
+ "message": "যাচাইকরণ কোড"
+ },
+ "account": {
+ "message": "অ্যাকাউন্ট"
+ },
+ "changeMasterPassword": {
+ "message": "মূল পাসওয়ার্ড পরিবর্তন"
+ },
+ "fingerprintPhrase": {
+ "message": "ফিঙ্গারপ্রিন্ট ফ্রেজ",
+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
+ },
+ "yourAccountsFingerprint": {
+ "message": "আপনার অ্যাকাউন্টের ফিঙ্গারপ্রিন্ট ফ্রেজ",
+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
+ },
+ "twoStepLogin": {
+ "message": "দ্বি-পদক্ষেপের লগইন"
+ },
+ "logOut": {
+ "message": "লগ আউট"
+ },
+ "about": {
+ "message": "সম্বন্ধে"
+ },
+ "version": {
+ "message": "সংস্করণ"
+ },
+ "save": {
+ "message": "সংরক্ষণ"
+ },
+ "move": {
+ "message": "Move"
+ },
+ "addFolder": {
+ "message": "ফোল্ডার জুড়ুন"
+ },
+ "name": {
+ "message": "নাম"
+ },
+ "editFolder": {
+ "message": "ফোল্ডার সম্পাদনা"
+ },
+ "deleteFolder": {
+ "message": "ফোল্ডার মুছুন"
+ },
+ "folders": {
+ "message": "ফোল্ডারসমূহ"
+ },
+ "noFolders": {
+ "message": "তালিকার জন্য কোনও ফোল্ডার নেই।"
+ },
+ "helpFeedback": {
+ "message": "সহায়তা এবং প্রতিক্রিয়া"
+ },
+ "sync": {
+ "message": "সিঙ্ক"
+ },
+ "syncVaultNow": {
+ "message": "এখনই ভল্ট সিঙ্ক করুন"
+ },
+ "lastSync": {
+ "message": "শেষ সিঙ্ক:"
+ },
+ "passGen": {
+ "message": "পাসওয়ার্ড উৎপাদক"
+ },
+ "generator": {
+ "message": "উৎপাদক",
+ "description": "Short for 'Password Generator'."
+ },
+ "passGenInfo": {
+ "message": "আপনার লগইনগুলির জন্য স্বয়ংক্রিয়ভাবে শক্তিশালী, অদ্বিতীয় পাসওয়ার্ড তৈরি করুন।"
+ },
+ "bitWebVault": {
+ "message": "Bitwarden ওয়েব ভল্ট"
+ },
+ "importItems": {
+ "message": "বস্তু আমদানি"
+ },
+ "select": {
+ "message": "নির্বাচন করুন"
+ },
+ "generatePassword": {
+ "message": "পাসওয়ার্ড তৈরি করুন"
+ },
+ "regeneratePassword": {
+ "message": "পাসওয়ার্ড পুনঃতৈরি করুন"
+ },
+ "options": {
+ "message": "বিকল্পসমূহ"
+ },
+ "length": {
+ "message": "দৈর্ঘ্য"
+ },
+ "numWords": {
+ "message": "শব্দের সংখ্যা"
+ },
+ "wordSeparator": {
+ "message": "শব্দ বিভাজক"
+ },
+ "capitalize": {
+ "message": "বড় হাতের করুন",
+ "description": "Make the first letter of a work uppercase."
+ },
+ "includeNumber": {
+ "message": "নম্বর অন্তর্ভুক্ত করুন"
+ },
+ "minNumbers": {
+ "message": "সর্বনিম্ন সংখ্যা"
+ },
+ "minSpecial": {
+ "message": "ন্যূনতম বিশেষ"
+ },
+ "avoidAmbChar": {
+ "message": "অস্পষ্ট বর্ণগুলি এড়িয়ে চলুন"
+ },
+ "searchVault": {
+ "message": "ভল্ট খুঁজুন"
+ },
+ "edit": {
+ "message": "সম্পাদনা"
+ },
+ "view": {
+ "message": "দেখুন"
+ },
+ "noItemsInList": {
+ "message": "তালিকার জন্য কোনও বস্তু নেই।"
+ },
+ "itemInformation": {
+ "message": "বস্তু তথ্য"
+ },
+ "username": {
+ "message": "ব্যবহারকারীর নাম"
+ },
+ "password": {
+ "message": "পাসওয়ার্ড"
+ },
+ "passphrase": {
+ "message": "পাসফ্রেজ"
+ },
+ "favorite": {
+ "message": "প্রিয়"
+ },
+ "notes": {
+ "message": "নোট"
+ },
+ "note": {
+ "message": "নোট"
+ },
+ "editItem": {
+ "message": "বস্তু সম্পাদনা"
+ },
+ "folder": {
+ "message": "ফোল্ডার"
+ },
+ "deleteItem": {
+ "message": "বস্তু মুছুন"
+ },
+ "viewItem": {
+ "message": "বস্তু দেখুন"
+ },
+ "launch": {
+ "message": "শুরু"
+ },
+ "website": {
+ "message": "ওয়েবসাইট"
+ },
+ "toggleVisibility": {
+ "message": "দৃশ্যমানতা টগল করুন"
+ },
+ "manage": {
+ "message": "পরিচালনা"
+ },
+ "other": {
+ "message": "অন্যান্য"
+ },
+ "rateExtension": {
+ "message": "এক্সটেনশনটি মূল্যায়ন করুন"
+ },
+ "rateExtensionDesc": {
+ "message": "দয়া করে একটি ভাল পর্যালোচনার মাধ্যমে সাহায্য করতে আমাদের বিবেচনা করুন!"
+ },
+ "browserNotSupportClipboard": {
+ "message": "আপনার ওয়েব ব্রাউজার সহজে ক্লিপবোর্ড অনুলিপি সমর্থন করে না। পরিবর্তে এটি নিজেই অনুলিপি করুন।"
+ },
+ "verifyMasterPassword": {
+ "message": "মূল পাসওয়ার্ড যাচাইকরণ"
+ },
+ "yourVaultIsLocked": {
+ "message": "আপনার ভল্ট লক করা আছে। চালিয়ে যেতে আপনার মূল পাসওয়ার্ডটি যাচাই করান।"
+ },
+ "unlock": {
+ "message": "আনলক"
+ },
+ "loggedInAsOn": {
+ "message": "$HOSTNAME$ এ $EMAIL$ হিসাবে লগ ইনকৃত",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "name@example.com"
+ },
+ "hostname": {
+ "content": "$2",
+ "example": "bitwarden.com"
+ }
+ }
+ },
+ "invalidMasterPassword": {
+ "message": "অবৈধ মূল পাসওয়ার্ড"
+ },
+ "vaultTimeout": {
+ "message": "ভল্টের সময়সীমা"
+ },
+ "lockNow": {
+ "message": "এখনই লক করুন"
+ },
+ "immediately": {
+ "message": "সঙ্গে সঙ্গে"
+ },
+ "tenSeconds": {
+ "message": "১০ সেকেন্ড"
+ },
+ "twentySeconds": {
+ "message": "২০ সেকেন্ড"
+ },
+ "thirtySeconds": {
+ "message": "৩০ সেকেন্ড"
+ },
+ "oneMinute": {
+ "message": "১ মিনিট"
+ },
+ "twoMinutes": {
+ "message": "২ মিনিট"
+ },
+ "fiveMinutes": {
+ "message": "৫ মিনিট"
+ },
+ "fifteenMinutes": {
+ "message": "১৫ মিনিট"
+ },
+ "thirtyMinutes": {
+ "message": "৩০ মিনিট"
+ },
+ "oneHour": {
+ "message": "১ ঘণ্টা"
+ },
+ "fourHours": {
+ "message": "৪ ঘন্টা"
+ },
+ "onLocked": {
+ "message": "সিস্টেম লকে"
+ },
+ "onRestart": {
+ "message": "ব্রাউজার পুনঃসূচনাই"
+ },
+ "never": {
+ "message": "কখনই না"
+ },
+ "security": {
+ "message": "নিরাপত্তা"
+ },
+ "errorOccurred": {
+ "message": "একটি ত্রুটি উৎপন্ন হয়েছে"
+ },
+ "emailRequired": {
+ "message": "ইমেইল ঠিকানা প্রয়োজন।"
+ },
+ "invalidEmail": {
+ "message": "অকার্যকর ইমেইল ঠিকানা।"
+ },
+ "masterPassRequired": {
+ "message": "মূল পাসওয়ার্ড প্রয়োজন।"
+ },
+ "masterPassLength": {
+ "message": "মূল পাসওয়ার্ড কমপক্ষে ৮ অক্ষর দীর্ঘ হওয়া উচিত।"
+ },
+ "masterPassDoesntMatch": {
+ "message": "মূল পাসওয়ার্ড নিশ্চিতকরণ মেলেনি।"
+ },
+ "newAccountCreated": {
+ "message": "আপনার নতুন অ্যাকাউন্ট তৈরি করা হয়েছে! আপনি এখন প্রবেশ করতে পারেন।"
+ },
+ "masterPassSent": {
+ "message": "আমরা আপনাকে আপনার মূল পাসওয়ার্ডের ইঙ্গিত সহ একটি ইমেল প্রেরণ করেছি।"
+ },
+ "verificationCodeRequired": {
+ "message": "যাচাইকরণ কোড প্রয়োজন।"
+ },
+ "valueCopied": {
+ "message": "$VALUE$ অনুলিপিত",
+ "description": "Value has been copied to the clipboard.",
+ "placeholders": {
+ "value": {
+ "content": "$1",
+ "example": "Password"
+ }
+ }
+ },
+ "autofillError": {
+ "message": "এই পৃষ্ঠায় নির্বাচিত বস্তুটি স্বতঃপূর্ণে অক্ষম। পরিবর্তে তথ্যটি অনুলিপিত করুন এবং আটকান।"
+ },
+ "loggedOut": {
+ "message": "প্রস্থানকৃত"
+ },
+ "loginExpired": {
+ "message": "আপনার লগইন মাত্রকালটির মেয়াদ শেষ হয়ে গেছে।"
+ },
+ "logOutConfirmation": {
+ "message": "আপনি লগ আউট করতে চান?"
+ },
+ "yes": {
+ "message": "হ্যাঁ"
+ },
+ "no": {
+ "message": "না"
+ },
+ "unexpectedError": {
+ "message": "একটি অপ্রত্যাশিত ত্রুটি ঘটেছে।"
+ },
+ "nameRequired": {
+ "message": "নাম প্রয়োজন।"
+ },
+ "addedFolder": {
+ "message": "ফোল্ডার জোড়া হয়েছে"
+ },
+ "changeMasterPass": {
+ "message": "মূল পাসওয়ার্ড পরিবর্তন"
+ },
+ "changeMasterPasswordConfirmation": {
+ "message": "আপনি bitwarden.com ওয়েব ভল্ট থেকে মূল পাসওয়ার্ডটি পরিবর্তন করতে পারেন। আপনি কি এখনই ওয়েবসাইটটি দেখতে চান?"
+ },
+ "twoStepLoginConfirmation": {
+ "message": "দ্বি-পদক্ষেপ লগইন অন্য ডিভাইসে আপনার লগইনটি যাচাই করার জন্য সিকিউরিটি কী, প্রমাণীকরণকারী অ্যাপ্লিকেশন, এসএমএস, ফোন কল বা ই-মেইল ব্যাবহারের মাধ্যমে আপনার অ্যাকাউন্টকে আরও সুরক্ষিত করে। bitwarden.com ওয়েব ভল্টে দ্বি-পদক্ষেপের লগইন সক্ষম করা যাবে। আপনি কি এখনই ওয়েবসাইটটি দেখতে চান?"
+ },
+ "editedFolder": {
+ "message": "ফোল্ডার সম্পাদিত"
+ },
+ "deleteFolderConfirmation": {
+ "message": "আপনি কি নিশ্চিত যে এই ফোল্ডারটি মুছতে চান?"
+ },
+ "deletedFolder": {
+ "message": "ফোল্ডার মোছা হয়েছে"
+ },
+ "gettingStartedTutorial": {
+ "message": "শুরু করার গৃহশিক্ষা"
+ },
+ "gettingStartedTutorialVideo": {
+ "message": "ব্রাউজার এক্সটেনশান থেকে কীভাবে সর্বাধিক লাভবান হতে পারবেন তা জানতে আমাদের শুরু করার গৃহশিক্ষাটি দেখুন"
+ },
+ "syncingComplete": {
+ "message": "সিঙ্কিং সম্পন্ন"
+ },
+ "syncingFailed": {
+ "message": "সিঙ্কিঙ্গে ব্যর্থ"
+ },
+ "passwordCopied": {
+ "message": "পাসওয়ার্ড অনুলিপিত"
+ },
+ "uri": {
+ "message": "URI"
+ },
+ "uriPosition": {
+ "message": "URI $POSITION$",
+ "description": "A listing of URIs. Ex: URI 1, URI 2, URI 3, etc.",
+ "placeholders": {
+ "position": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "newUri": {
+ "message": "নতুন URI"
+ },
+ "addedItem": {
+ "message": "বস্তু যোগ করা হয়েছে"
+ },
+ "editedItem": {
+ "message": "সম্পাদিত বস্তু"
+ },
+ "deleteItemConfirmation": {
+ "message": "আপনি কি সত্যিই আবর্জনাতে পাঠাতে চান?"
+ },
+ "deletedItem": {
+ "message": "বস্তুতটি আবর্জনাতে পাঠানো হয়েছে"
+ },
+ "overwritePassword": {
+ "message": "ওভাররাইট পাসওয়ার্ড"
+ },
+ "overwritePasswordConfirmation": {
+ "message": "আপনি কি নিশ্চিত যে আপনি বর্তমান পাসওয়ার্ডটি ওভাররাইট করতে চান?"
+ },
+ "searchFolder": {
+ "message": "ফোল্ডার অনুসন্ধান"
+ },
+ "searchCollection": {
+ "message": "সংগ্রহ অনুসন্ধান"
+ },
+ "searchType": {
+ "message": "অনুসন্ধানের ধরন"
+ },
+ "noneFolder": {
+ "message": "কোন ফোল্ডার নেই",
+ "description": "This is the folder for uncategorized items"
+ },
+ "disableAddLoginNotification": {
+ "message": "লগইন যোগ করুন বিজ্ঞপ্তি অক্ষম করুন"
+ },
+ "addLoginNotificationDesc": {
+ "message": "\"লগইন যোগ করুন বিজ্ঞপ্তি\" স্বয়ংক্রিয়ভাবে আপনই যখনই প্রথমবারের জন্য লগ ইন করেন তখন আপনার ভল্টে নতুন লগইনগুলি সংরক্ষণ করতে অনুরোধ জানায়।"
+ },
+ "dontShowCardsCurrentTab": {
+ "message": "ট্যাব পৃষ্ঠায় কার্ডগুলি দেখাবেন না"
+ },
+ "dontShowCardsCurrentTabDesc": {
+ "message": "আপনার ভল্ট থেকে কার্ড বস্তুগুলি সহজেই স্বতঃপূরণের জন্য 'বর্তমান ট্যাব' পৃষ্ঠাতে তালিকাভুক্ত করা হয়েছে।"
+ },
+ "dontShowIdentitiesCurrentTab": {
+ "message": "ট্যাব পৃষ্ঠায় পরিচয় দেখাবেন না"
+ },
+ "dontShowIdentitiesCurrentTabDesc": {
+ "message": "আপনার ভল্ট থেকে পরিচিতি বস্তুগুলি সহজেই স্বতঃপূরণের জন্য 'বর্তমান ট্যাব' পৃষ্ঠাতে তালিকাভুক্ত করা হয়েছে।"
+ },
+ "clearClipboard": {
+ "message": "ক্লিপবোর্ড পরিষ্কার",
+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
+ },
+ "clearClipboardDesc": {
+ "message": "আপনার ক্লিপবোর্ড থেকে অনুলিপিত মানগুলি স্বয়ংক্রিয়ভাবে সাফ করে।",
+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
+ },
+ "notificationAddDesc": {
+ "message": "Bitwarden আপনার জন্য এই পাসওয়ার্ডটি মনে রাখবে?"
+ },
+ "notificationAddSave": {
+ "message": "হ্যাঁ, এখনই সংরক্ষণ করুন"
+ },
+ "notificationNeverSave": {
+ "message": "এই ওয়েবসাইটের জন্য কখনই না"
+ },
+ "disableChangedPasswordNotification": {
+ "message": "পাসওয়ার্ড পরিবর্তন বিজ্ঞপ্তি অক্ষম করুন"
+ },
+ "disableChangedPasswordNotificationDesc": {
+ "message": "\"পাসওয়ার্ড পরিবর্তন বিজ্ঞপ্তি\" স্বয়ংক্রিয়ভাবে আপনাকে আপনার ভল্টে একটি লগইনের পাসওয়ার্ড হালনাগাদ করার অনুরোধ জানায় যখনই কোনও ওয়েবসাইটে আপনি এটি পরিবর্তন করেছেন তা সনাক্ত করে।"
+ },
+ "notificationChangeDesc": {
+ "message": "আপনি কি এই পাসওয়ার্ডটি Bitwarden এ হালনাগাদ করতে চান?"
+ },
+ "notificationChangeSave": {
+ "message": "হ্যাঁ, এখনই হালনাগাদ করুন"
+ },
+ "disableContextMenuItem": {
+ "message": "প্রসঙ্গ মেনু বিকল্পগুলি অক্ষম করুন"
+ },
+ "disableContextMenuItemDesc": {
+ "message": "প্রসঙ্গ মেনু বিকল্পগুলি আপনার বর্তমান ট্যাবের ওয়েবসাইটটির জন্য পাসওয়ার্ড তৈরি এবং লগিনগুলি দ্রুত সরবরাহ করে।"
+ },
+ "defaultUriMatchDetection": {
+ "message": "পূর্ব-নির্ধারিত URI মিল সনাক্তকরণ",
+ "description": "Default URI match detection for auto-fill."
+ },
+ "defaultUriMatchDetectionDesc": {
+ "message": "স্বতঃপূরণের মতো ক্রিয়া সম্পাদন করার সময় লগইনগুলির জন্য URI মিল সনাক্তকরণ যে পূর্ব-নির্ধারিত পদ্ধতিতে পরিচালনা করা হবে তা চয়ন করুন।"
+ },
+ "theme": {
+ "message": "থিম"
+ },
+ "themeDesc": {
+ "message": "অ্যাপ্লিকেশনটির রং থিম পরিবর্তন।"
+ },
+ "dark": {
+ "message": "অন্ধকার",
+ "description": "Dark color"
+ },
+ "light": {
+ "message": "উজ্জ্বল",
+ "description": "Light color"
+ },
+ "solarizedDark": {
+ "message": "Solarized Dark",
+ "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated."
+ },
+ "exportVault": {
+ "message": "ভল্ট রফতানি"
+ },
+ "fileFormat": {
+ "message": "ফাইলের ধরণ"
+ },
+ "warning": {
+ "message": "সতর্কতা",
+ "description": "WARNING (should stay in capitalized letters if the language permits)"
+ },
+ "confirmVaultExport": {
+ "message": "ভল্ট রফতানির নিশ্চয়তা দিন"
+ },
+ "exportWarningDesc": {
+ "message": "এই রফতানীতে একটি বিনা-এনক্রিপ্টেড করা বিন্যাসে আপনার ভল্ট তথ্য রয়েছে। আপনার রফতানিকৃত হওয়া ফাইল নিরাপত্তাহীন চ্যানেলগুলির মাধ্যমে (যেমন ইমেল) সংরক্ষণ বা প্রেরণ করা উচিত নয়। আপনি এটি ব্যবহার করে কাজ শেষ করার পর সাথে সাথে মুছে ফেলুন।"
+ },
+ "encExportKeyWarningDesc": {
+ "message": "This export encrypts your data using your account's encryption key. If you ever rotate your account's encryption key you should export again since you will not be able to decrypt this export file."
+ },
+ "encExportAccountWarningDesc": {
+ "message": "Account encryption keys are unique to each Bitwarden user account, so you can't import an encrypted export into a different account."
+ },
+ "exportMasterPassword": {
+ "message": "আপনার ভল্ট তথ্য রফতানি করতে আপনার মূল পাসওয়ার্ডটি দিন।"
+ },
+ "shared": {
+ "message": "ভাগকৃত"
+ },
+ "learnOrg": {
+ "message": "Learn about Organizations"
+ },
+ "learnOrgConfirmation": {
+ "message": "Bitwarden allows you to share your vault items with others by using an organization. Would you like to visit the bitwarden.com website to learn more?"
+ },
+ "moveToOrganization": {
+ "message": "Move to Organization"
+ },
+ "share": {
+ "message": "ভাগ করুন"
+ },
+ "movedItemToOrg": {
+ "message": "$ITEMNAME$ moved to $ORGNAME$",
+ "placeholders": {
+ "itemname": {
+ "content": "$1",
+ "example": "Secret Item"
+ },
+ "orgname": {
+ "content": "$2",
+ "example": "Company Name"
+ }
+ }
+ },
+ "moveToOrgDesc": {
+ "message": "Choose an organization that you wish to move this item to. Moving to an organization transfers ownership of the item to that organization. You will no longer be the direct owner of this item once it has been moved."
+ },
+ "learnMore": {
+ "message": "আরও জানুন"
+ },
+ "authenticatorKeyTotp": {
+ "message": "প্রমাণীকরণকারী কী (TOTP)"
+ },
+ "verificationCodeTotp": {
+ "message": "যাচাইকরণ কোড (TOTP)"
+ },
+ "copyVerificationCode": {
+ "message": "যাচাইকরণ কোড অনুলিপিত করুন"
+ },
+ "attachments": {
+ "message": "সংযুক্তি"
+ },
+ "deleteAttachment": {
+ "message": "সংযুক্তি মুছুন"
+ },
+ "deleteAttachmentConfirmation": {
+ "message": "আপনি কি এই সংযুক্তিটি মোছার বিষয়ে নিশ্চিত?"
+ },
+ "deletedAttachment": {
+ "message": "সংযুক্তি মোছা হয়েছে"
+ },
+ "newAttachment": {
+ "message": "নতুন সংযুক্তি যুক্ত করুন"
+ },
+ "noAttachments": {
+ "message": "সংযুক্তি নেই।"
+ },
+ "attachmentSaved": {
+ "message": "সংযুক্তিটি সংরক্ষণ করা হয়েছে।"
+ },
+ "file": {
+ "message": "ফাইল"
+ },
+ "selectFile": {
+ "message": "একটি ফাইল নির্বাচন করুন।"
+ },
+ "maxFileSize": {
+ "message": "সর্বোচ্চ ফাইলের আকার ১০০ এমবি।"
+ },
+ "featureUnavailable": {
+ "message": "বৈশিষ্ট্য অনুপলব্ধ"
+ },
+ "updateKey": {
+ "message": "আপনি আপনার এনক্রিপশন কী হালনাগাদ না করা পর্যন্ত এই বৈশিষ্ট্যটি ব্যবহার করতে পারবেন না।"
+ },
+ "premiumMembership": {
+ "message": "প্রিমিয়াম সদস্য"
+ },
+ "premiumManage": {
+ "message": "সদস্যতা পরিচালনা"
+ },
+ "premiumManageAlert": {
+ "message": "আপনি bitwarden.com ওয়েব ভল্টে আপনার সদস্যপদ পরিচালনা করতে পারেন। আপনি কি এখনই ওয়েবসাইটটি দেখতে চান?"
+ },
+ "premiumRefresh": {
+ "message": "সদস্যতা সতেজ করুন"
+ },
+ "premiumNotCurrentMember": {
+ "message": "আপনি বর্তমানে প্রিমিয়াম সদস্য নন।"
+ },
+ "premiumSignUpAndGet": {
+ "message": "প্রিমিয়াম সদস্যতার জন্য সাইন আপ করুন এবং পান:"
+ },
+ "ppremiumSignUpStorage": {
+ "message": "ফাইল সংযুক্তির জন্য ১ জিবি এনক্রিপ্টেড স্থান।"
+ },
+ "ppremiumSignUpTwoStep": {
+ "message": "YubiKey, FIDO U2F, ও Duo এর মতো অতিরিক্ত দ্বি-পদক্ষেপ লগইন বিকল্পগুলি।"
+ },
+ "ppremiumSignUpReports": {
+ "message": "আপনার ভল্টটি সুরক্ষিত রাখতে পাসওয়ার্ড স্বাস্থ্যকরন, অ্যাকাউন্ট স্বাস্থ্য এবং ডেটা লঙ্ঘনের প্রতিবেদন।"
+ },
+ "ppremiumSignUpTotp": {
+ "message": "আপনার ভল্টে লগইনগুলির জন্য TOTP যাচাইকরণ কোড (2FA) উৎপাদক।"
+ },
+ "ppremiumSignUpSupport": {
+ "message": "অগ্রাধিকার গ্রাহক সমর্থন।"
+ },
+ "ppremiumSignUpFuture": {
+ "message": "ভবিষ্যতের সমস্ত প্রিমিয়াম বৈশিষ্ট্য। আরও শীঘ্রই আসছে!"
+ },
+ "premiumPurchase": {
+ "message": "প্রিমিয়াম কিনুন"
+ },
+ "premiumPurchaseAlert": {
+ "message": "আপনি bitwarden.com ওয়েব ভল্টে প্রিমিয়াম সদস্যতা কিনতে পারেন। আপনি কি এখনই ওয়েবসাইটটি দেখতে চান?"
+ },
+ "premiumCurrentMember": {
+ "message": "আপনি প্রিমিয়াম সদস্য!"
+ },
+ "premiumCurrentMemberThanks": {
+ "message": "Bitwarden কে সমর্থন করার জন্য আপনাকে ধন্যবাদ।"
+ },
+ "premiumPrice": {
+ "message": "সমস্ত মাত্র $PRICE$ / বছরের জন্য!",
+ "placeholders": {
+ "price": {
+ "content": "$1",
+ "example": "$10"
+ }
+ }
+ },
+ "refreshComplete": {
+ "message": "পুনঃসতেজ সম্পূর্ণ"
+ },
+ "disableAutoTotpCopy": {
+ "message": "স্বয়ংক্রিয় TOTP অনুলিপি অক্ষম করুন"
+ },
+ "disableAutoTotpCopyDesc": {
+ "message": "যদি আপনার লগইনের সাথে একটি প্রমাণীকরণ কী থাকে, আপনি যখনই লগইনটি স্বতঃপূরণ করেন তবে TOTP যাচাইকরণ কোডটি স্বয়ংক্রিয়ভাবে আপনার ক্লিপবোর্ডে অনুলিপিত করা হয়।"
+ },
+ "disableAutoBiometricsPrompt": {
+ "message": "Do not prompt for biometrics on launch"
+ },
+ "premiumRequired": {
+ "message": "প্রিমিয়াম আবশ্যক"
+ },
+ "premiumRequiredDesc": {
+ "message": "এই বৈশিষ্ট্যটি ব্যবহার করতে একটি প্রিমিয়াম সদস্যতার প্রয়োজন।"
+ },
+ "enterVerificationCodeApp": {
+ "message": "আপনার প্রমাণীকরণকারী অ্যাপ থেকে ৬ সংখ্যার যাচাইকরণ কোডটি প্রবেশ করুন।"
+ },
+ "enterVerificationCodeEmail": {
+ "message": "$EMAIL$ এ ইমেইল করা ৬ সংখ্যার যাচাই কোডটি প্রবেশ করুন।",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "example@gmail.com"
+ }
+ }
+ },
+ "verificationCodeEmailSent": {
+ "message": "$EMAIL$ এ যাচাইকরণ ইমেইল প্রেরণ করা হয়েছে।",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "example@gmail.com"
+ }
+ }
+ },
+ "rememberMe": {
+ "message": "আমাকে মনে রাখবেন"
+ },
+ "sendVerificationCodeEmailAgain": {
+ "message": "আবার যাচাইকরণ কোড ইমেইলে প্রেরণ করুন"
+ },
+ "useAnotherTwoStepMethod": {
+ "message": "অন্য দ্বি-পদক্ষেপ প্রবেশ পদ্ধতি ব্যবহার করুন"
+ },
+ "insertYubiKey": {
+ "message": "আপনার কম্পিউটারের ইউএসবি পোর্টে আপনার YubiKey ঢোকান, তারপরে তার বোতামটি স্পর্শ করুন।"
+ },
+ "insertU2f": {
+ "message": "আপনার কম্পিউটারের ইউএসবি পোর্টে আপনার সুরক্ষা কী ঢোকান। এটিতে যদি একটি বোতাম থাকে তবে তা স্পর্শ করুন।"
+ },
+ "webAuthnNewTab": {
+ "message": "To start the WebAuthn 2FA verification. Click the button below to open a new tab and follow the instructions provided in the new tab."
+ },
+ "webAuthnNewTabOpen": {
+ "message": "Open new tab"
+ },
+ "webAuthnAuthenticate": {
+ "message": "Authenticate WebAuthn"
+ },
+ "loginUnavailable": {
+ "message": "লগইন অনুপলব্ধ"
+ },
+ "noTwoStepProviders": {
+ "message": "এই অ্যাকাউন্টে দ্বি-পদক্ষেপ লগইন সক্ষম রয়েছে, তবে কনফিগারকৃত দ্বি-পদক্ষেপ সরবরাহকারীদের কোনওটিই এই ওয়েব ব্রাউজার দ্বারা সমর্থিত নয়।"
+ },
+ "noTwoStepProviders2": {
+ "message": "দয়া করে একটি সমর্থিত ওয়েব ব্রাউজার ব্যবহার করুন (যেমন ক্রোম) এবং/অথবা অতিরিক্ত সরবরাহকারী যুক্ত করুন যা ওয়েব ব্রাউজারগুলিতে আরও ভাল সমর্থিত (যেমন একটি প্রমাণীকরণকারী অ্যাপ)।"
+ },
+ "twoStepOptions": {
+ "message": "দ্বি-পদক্ষেপ লগইন বিকল্প"
+ },
+ "recoveryCodeDesc": {
+ "message": "আপনার সমস্ত দ্বি-গুণক সরবরাহকারীদের অ্যাক্সেস হারিয়েছেন? আপনার অ্যাকাউন্ট থেকে সমস্ত দ্বি-গুণক সরবরাহকারীদের অক্ষম করতে আপনার পুনরুদ্ধার কোডটি ব্যবহার করুন।"
+ },
+ "recoveryCodeTitle": {
+ "message": "পুনরুদ্ধার কোড"
+ },
+ "authenticatorAppTitle": {
+ "message": "প্রমাণীকরণকারী অ্যাপ"
+ },
+ "authenticatorAppDesc": {
+ "message": "সময় ভিত্তিক যাচাইকরণ কোড উৎপন্ন করতে একটি প্রমাণীকরণকারী অ্যাপ্লিকেশন (যেমন Authy বা Google Authenticator) ব্যবহার করুন।",
+ "description": "'Authy' and 'Google Authenticator' are product names and should not be translated."
+ },
+ "yubiKeyTitle": {
+ "message": "YubiKey OTP সুরক্ষা কী"
+ },
+ "yubiKeyDesc": {
+ "message": "আপনার অ্যাকাউন্ট ব্যাবহার করতে একটি YubiKey ব্যবহার করুন। YubiKey 4, 4 Nano, 4C, এবং NEO ডিভাইসগুলির সাথে কাজ করে।"
+ },
+ "duoDesc": {
+ "message": "Duo Mobile app, এসএমএস, ফোন কল, বা U2F সুরক্ষা কী ব্যবহার করে Duo Security এর মাধ্যমে যাচাই করুন।",
+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
+ },
+ "duoOrganizationDesc": {
+ "message": "Duo Mobile app, এসএমএস, ফোন কল, বা U2F সুরক্ষা কী ব্যবহার করে আপনার সংস্থার জন্য Duo Security এর মাধ্যমে যাচাই করুন।",
+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
+ },
+ "webAuthnTitle": {
+ "message": "FIDO2 WebAuthn"
+ },
+ "webAuthnDesc": {
+ "message": "Use any WebAuthn enabled security key to access your account."
+ },
+ "emailTitle": {
+ "message": "ই-মেইল"
+ },
+ "emailDesc": {
+ "message": "যাচাই কোডগুলি আপনাকে ই-মেইল করা হবে।"
+ },
+ "selfHostedEnvironment": {
+ "message": "স্ব-হোস্টকৃত পরিবেশ"
+ },
+ "selfHostedEnvironmentFooter": {
+ "message": "আপনার অন-প্রাঙ্গনে হোস্টকৃত Bitwarden ইনস্টলেশনটির বেস URL উল্লেখ করুন।"
+ },
+ "customEnvironment": {
+ "message": "পছন্দসই পরিবেশ"
+ },
+ "customEnvironmentFooter": {
+ "message": "উন্নত ব্যবহারকারীদের জন্য। আপনি স্বতন্ত্রভাবে প্রতিটি পরিষেবার মূল URL নির্দিষ্ট করতে পারেন।"
+ },
+ "baseUrl": {
+ "message": "সার্ভার URL"
+ },
+ "apiUrl": {
+ "message": "এপিআই সার্ভার URL"
+ },
+ "webVaultUrl": {
+ "message": "ওয়েব ভল্ট সার্ভার URL"
+ },
+ "identityUrl": {
+ "message": "পরিচয় সার্ভার URL"
+ },
+ "notificationsUrl": {
+ "message": "বিজ্ঞপ্তি সার্ভার URL"
+ },
+ "iconsUrl": {
+ "message": "আইকন সার্ভার URL"
+ },
+ "environmentSaved": {
+ "message": "পরিবেশের URL গুলি সংরক্ষণ করা হয়েছে।"
+ },
+ "enableAutoFillOnPageLoad": {
+ "message": "পৃষ্ঠা লোডে স্বতঃপূরণ সক্ষম করুন"
+ },
+ "enableAutoFillOnPageLoadDesc": {
+ "message": "যদি কোনও লগইন ফর্ম সনাক্ত হয়, ওয়েব পৃষ্ঠাটি লোড হওয়ার পরে স্বয়ংক্রিয়ভাবে স্বতঃপূরণ করুন।"
+ },
+ "experimentalFeature": {
+ "message": "এটি বর্তমানে একটি পরীক্ষামূলক বৈশিষ্ট্য। আপনার নিজ ঝুঁকিতে ব্যবহার করুন।"
+ },
+ "defaultAutoFillOnPageLoad": {
+ "message": "Default autofill setting for login items"
+ },
+ "defaultAutoFillOnPageLoadDesc": {
+ "message": "After enabling Auto-fill on Page Load, you can enable or disable the feature for individual login items. This is the default setting for login items that are not separately configured."
+ },
+ "itemAutoFillOnPageLoad": {
+ "message": "Auto-fill on Page Load (if enabled in Options)"
+ },
+ "autoFillOnPageLoadUseDefault": {
+ "message": "Use default setting"
+ },
+ "autoFillOnPageLoadYes": {
+ "message": "Auto-fill on page load"
+ },
+ "autoFillOnPageLoadNo": {
+ "message": "Do not auto-fill on page load"
+ },
+ "commandOpenPopup": {
+ "message": "ভল্ট পপআপ খুলুন"
+ },
+ "commandOpenSidebar": {
+ "message": "সাইডবারে ভল্ট খুলুন"
+ },
+ "commandAutofillDesc": {
+ "message": "বর্তমান ওয়েবসাইটটির জন্য সর্বশেষ ব্যবহৃত লগইনটি স্বতঃপূরণ করুন"
+ },
+ "commandGeneratePasswordDesc": {
+ "message": "ক্লিপবোর্ডে একটি নতুন এলোমেলো পাসওয়ার্ড তৈরি এবং অনুলিপিত করুন"
+ },
+ "commandLockVaultDesc": {
+ "message": "ভল্ট লক করুন"
+ },
+ "privateModeMessage": {
+ "message": "দুর্ভাগ্যক্রমে এই উইন্ডোটি এই ব্রাউজারের জন্য ব্যক্তিগত মোডে উপলব্ধ নয়।"
+ },
+ "customFields": {
+ "message": "পছন্দসই ক্ষেত্র"
+ },
+ "copyValue": {
+ "message": "মান অনুলিপিত করুন"
+ },
+ "value": {
+ "message": "মান"
+ },
+ "newCustomField": {
+ "message": "নতুন পছন্দসই ক্ষেত্র"
+ },
+ "dragToSort": {
+ "message": "বাছাই করতে টানুন"
+ },
+ "cfTypeText": {
+ "message": "পাঠ্য"
+ },
+ "cfTypeHidden": {
+ "message": "লুকায়িত"
+ },
+ "cfTypeBoolean": {
+ "message": "বুলিয়ান"
+ },
+ "popup2faCloseMessage": {
+ "message": "আপনার যাচাইকরণ কোডটির জন্য আপনার ইমেলটি পরীক্ষা করতে পপআপ উইন্ডোটির বাইরে ক্লিক করলে এই পপআপটি বন্ধ হয়ে যাবে। আপনি কি এই পপআপটি একটি নতুন উইন্ডোতে খুলতে চান যাতে এটি বন্ধ না হয়?"
+ },
+ "popupU2fCloseMessage": {
+ "message": "ব্রাউজারটি এই পপআপ উইন্ডোতে U2F অনুরোধগুলি প্রক্রিয়া করতে পারে না। আপনি কি এই পপআপটি একটি নতুন উইন্ডোতে খুলতে চান যাতে আপনি U2F ব্যবহার করে লগ ইন করতে পারেন?"
+ },
+ "disableFavicon": {
+ "message": "ওয়েবসাইট আইকন অক্ষম করুন"
+ },
+ "disableFaviconDesc": {
+ "message": "ওয়েবসাইট আইকনগুলি আপনার ভল্টের প্রতিটি লগইন বস্তুর পাশে একটি পরিচয়যোগ্য চিত্র সরবরাহ করে।"
+ },
+ "disableBadgeCounter": {
+ "message": "Disable Badge Counter"
+ },
+ "disableBadgeCounterDesc": {
+ "message": "Badge counter indicates how many logins you have for the current page in your vault."
+ },
+ "cardholderName": {
+ "message": "কার্ডধারীর নাম"
+ },
+ "number": {
+ "message": "নম্বর"
+ },
+ "brand": {
+ "message": "ব্র্যান্ড"
+ },
+ "expirationMonth": {
+ "message": "মেয়াদোত্তীর্ণ মাস"
+ },
+ "expirationYear": {
+ "message": "মেয়াদোত্তীর্ণ বছর"
+ },
+ "expiration": {
+ "message": "মেয়াদোত্তীর্ণতা"
+ },
+ "january": {
+ "message": "জানুয়ারী"
+ },
+ "february": {
+ "message": "ফেব্রুয়ারী"
+ },
+ "march": {
+ "message": "মার্চ"
+ },
+ "april": {
+ "message": "এপ্রিল"
+ },
+ "may": {
+ "message": "মে"
+ },
+ "june": {
+ "message": "জুন"
+ },
+ "july": {
+ "message": "জুলাই"
+ },
+ "august": {
+ "message": "আগস্ট"
+ },
+ "september": {
+ "message": "সেপ্টেম্বর"
+ },
+ "october": {
+ "message": "অক্টোবর"
+ },
+ "november": {
+ "message": "নভেম্বর"
+ },
+ "december": {
+ "message": "ডিসেম্বর"
+ },
+ "securityCode": {
+ "message": "নিরাপত্তা কোড"
+ },
+ "ex": {
+ "message": "উদাহরণ"
+ },
+ "title": {
+ "message": "শিরোনাম"
+ },
+ "mr": {
+ "message": "জনাব"
+ },
+ "mrs": {
+ "message": "জনাবা"
+ },
+ "ms": {
+ "message": "জনাবা"
+ },
+ "dr": {
+ "message": "ডাঃ"
+ },
+ "firstName": {
+ "message": "নামের প্রথমাংশ"
+ },
+ "middleName": {
+ "message": "নামের মধ্যাংশ"
+ },
+ "lastName": {
+ "message": "নামের শেষাংশ"
+ },
+ "identityName": {
+ "message": "পরিচয়ের নাম"
+ },
+ "company": {
+ "message": "প্রতিষ্ঠান"
+ },
+ "ssn": {
+ "message": "সামাজিক সুরক্ষা নম্বর"
+ },
+ "passportNumber": {
+ "message": "পাসপোর্ট নম্বর"
+ },
+ "licenseNumber": {
+ "message": "লাইসেন্স নম্বর"
+ },
+ "email": {
+ "message": "ই-মেইল"
+ },
+ "phone": {
+ "message": "ফোন"
+ },
+ "address": {
+ "message": "ঠিকানা"
+ },
+ "address1": {
+ "message": "ঠিকানা ১"
+ },
+ "address2": {
+ "message": "ঠিকানা ২"
+ },
+ "address3": {
+ "message": "ঠিকানা ৩"
+ },
+ "cityTown": {
+ "message": "শহর"
+ },
+ "stateProvince": {
+ "message": "রাজ্য / প্রদেশ"
+ },
+ "zipPostalCode": {
+ "message": "জিপ / ডাক কোড"
+ },
+ "country": {
+ "message": "দেশ"
+ },
+ "type": {
+ "message": "ধরন"
+ },
+ "typeLogin": {
+ "message": "লগইন"
+ },
+ "typeLogins": {
+ "message": "লগিনগুলি"
+ },
+ "typeSecureNote": {
+ "message": "সুরক্ষিত নোট"
+ },
+ "typeCard": {
+ "message": "কার্ড"
+ },
+ "typeIdentity": {
+ "message": "পরিচয়"
+ },
+ "passwordHistory": {
+ "message": "পাসওয়ার্ড ইতিহাস"
+ },
+ "back": {
+ "message": "পেছন"
+ },
+ "collections": {
+ "message": "সংগ্রহ"
+ },
+ "favorites": {
+ "message": "প্রিয়গুলো"
+ },
+ "popOutNewWindow": {
+ "message": "একটি নতুন উইন্ডোতে পপ আউট"
+ },
+ "refresh": {
+ "message": "পুনঃসতেজ"
+ },
+ "cards": {
+ "message": "কার্ডগুলো"
+ },
+ "identities": {
+ "message": "পরিচয়"
+ },
+ "logins": {
+ "message": "লগিনগুলি"
+ },
+ "secureNotes": {
+ "message": "সুরক্ষিত নোট"
+ },
+ "clear": {
+ "message": "পরিষ্কার",
+ "description": "To clear something out. example: To clear browser history."
+ },
+ "checkPassword": {
+ "message": "পাসওয়ার্ড উন্মুক্ত হয়েছে কিনা তা পরীক্ষা করুন।"
+ },
+ "passwordExposed": {
+ "message": "ডেটা লঙ্ঘনে এই পাসওয়ার্ডটি $VALUE$ সময় (গুলি) উন্মুক্ত করা হয়েছে। আপনার এটি পরিবর্তন করা উচিত।",
+ "placeholders": {
+ "value": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "passwordSafe": {
+ "message": "এই পাসওয়ার্ডটি কোনও পরিচিত তথ্য লঙ্ঘনে পাওয়া যায় নি। এটি ব্যবহার করা নিরাপদ হওয়া উচিত।"
+ },
+ "baseDomain": {
+ "message": "ভিত্তি ডোমেইন"
+ },
+ "host": {
+ "message": "নিয়ন্ত্রণকর্তা",
+ "description": "A URL's host value. For example, the host of https://sub.domain.com:443 is 'sub.domain.com:443'."
+ },
+ "exact": {
+ "message": "হুবহু"
+ },
+ "startsWith": {
+ "message": "শুরু করুন"
+ },
+ "regEx": {
+ "message": "নিয়মিত অভিব্যাক্তি",
+ "description": "A programming term, also known as 'RegEx'."
+ },
+ "matchDetection": {
+ "message": "মিল সনাক্তকরণ",
+ "description": "URI match detection for auto-fill."
+ },
+ "defaultMatchDetection": {
+ "message": "পূর্ব-নির্ধারিত মিল সনাক্তকরণ",
+ "description": "Default URI match detection for auto-fill."
+ },
+ "toggleOptions": {
+ "message": "বিকল্পগুলি টগল করুন"
+ },
+ "toggleCurrentUris": {
+ "message": "বর্তমান URIs টগল করুন",
+ "description": "Toggle the display of the URIs of the currently open tabs in the browser."
+ },
+ "currentUri": {
+ "message": "বর্তমান URI",
+ "description": "The URI of one of the current open tabs in the browser."
+ },
+ "organization": {
+ "message": "সংগঠন",
+ "description": "An entity of multiple related people (ex. a team or business organization)."
+ },
+ "types": {
+ "message": "প্রকার"
+ },
+ "allItems": {
+ "message": "সকল বস্তু"
+ },
+ "noPasswordsInList": {
+ "message": "তালিকার জন্য কোনও পাসওয়ার্ড নেই।"
+ },
+ "remove": {
+ "message": "সরান"
+ },
+ "default": {
+ "message": "পূর্ব-নির্ধারিত"
+ },
+ "dateUpdated": {
+ "message": "হালনাগাদকৃত",
+ "description": "ex. Date this item was updated"
+ },
+ "datePasswordUpdated": {
+ "message": "পাসওয়ার্ড হালনাগাদকৃত",
+ "description": "ex. Date this password was updated"
+ },
+ "neverLockWarning": {
+ "message": "আপনি কি নিশ্চিত যে \"কখনই না\" বিকল্পটি ব্যবহার করবেন? আপনার লক বিকল্পগুলি \"কখনই না\" এ সেট করার ফলে আপনার ডিভাইসে ভল্টের এনক্রিপশন কী সঞ্চয় করা হবে। আপনি যদি এই বিকল্পটি ব্যবহার করেন তবে আপনার ডিভাইসটি সঠিকভাবে সুরক্ষিত রাখা নিশ্চিত করা উচিত।"
+ },
+ "noOrganizationsList": {
+ "message": "আপনি কোনও সংস্থার অন্তর্ভুক্ত নন। সংগঠনগুলি আপনাকে নিরাপদে অন্য ব্যবহারকারীর সাথে বস্তুসমূহ ভাগ করে নেওয়ার অনুমতি দেয়।"
+ },
+ "noCollectionsInList": {
+ "message": "তালিকার জন্য কোনও সংগ্রহ নেই।"
+ },
+ "ownership": {
+ "message": "মালিকানা"
+ },
+ "whoOwnsThisItem": {
+ "message": "এই বস্তুটির মালিক কে?"
+ },
+ "strong": {
+ "message": "শক্তিশালী",
+ "description": "ex. A strong password. Scale: Weak -> Good -> Strong"
+ },
+ "good": {
+ "message": "ভাল",
+ "description": "ex. A good password. Scale: Weak -> Good -> Strong"
+ },
+ "weak": {
+ "message": "দুর্বল",
+ "description": "ex. A weak password. Scale: Weak -> Good -> Strong"
+ },
+ "weakMasterPassword": {
+ "message": "দুর্বল মূল পাসওয়ার্ড"
+ },
+ "weakMasterPasswordDesc": {
+ "message": "আপনার চয়নকৃত মূল পাসওয়ার্ডটি দুর্বল। আপনার Bitwarden অ্যাকাউন্টটি সঠিকভাবে সুরক্ষিত করার জন্য আপনার একটি শক্তিশালী মূল পাসওয়ার্ড (বা একটি পাসফ্রেজ) ব্যবহার করা উচিত। আপনি কি নিশ্চিত যে এই মূল পাসওয়ার্ডটি ব্যবহার করতে চান?"
+ },
+ "pin": {
+ "message": "পিন",
+ "description": "PIN code. Ex. The short code (often numeric) that you use to unlock a device."
+ },
+ "unlockWithPin": {
+ "message": "পিন দিয়ে আনলক"
+ },
+ "setYourPinCode": {
+ "message": "Bitwarden আনলক করার জন্য আপনার পিন কোডটি সেট করুন। আপনি যদি অ্যাপ্লিকেশনটি থেকে পুরোপুরি লগ আউট করেন তবে আপনার পিন সেটিংস রিসেট করা হবে।"
+ },
+ "pinRequired": {
+ "message": "পিন কোড প্রয়োজন।"
+ },
+ "invalidPin": {
+ "message": "অবৈধ পিন কোড।"
+ },
+ "verifyPin": {
+ "message": "পিন যাচাই করুন"
+ },
+ "yourVaultIsLockedPinCode": {
+ "message": "আপনার ভল্ট লক করা আছে। চালিয়ে যেতে আপনার পিন কোড যাচাই করান।"
+ },
+ "unlockWithBiometrics": {
+ "message": "বায়োমেট্রিক্স দিয়ে আনলক করুন"
+ },
+ "awaitDesktop": {
+ "message": "ডেস্কটপ থেকে নিশ্চিতকরণের অপেক্ষায়"
+ },
+ "awaitDesktopDesc": {
+ "message": "ব্রাউজারের জন্য বায়োমেট্রিক্স সক্ষম করতে দয়া করে Bitwarden ডেস্কটপ অ্যাপ্লিকেশনটিতে বায়োমেট্রিক্স ব্যবহার সক্ষম করুন।"
+ },
+ "lockWithMasterPassOnRestart": {
+ "message": "ব্রাউজার পুনরারম্ভতে মূল পাসওয়ার্ড দিয়ে লক করুন"
+ },
+ "selectOneCollection": {
+ "message": "কমপক্ষে একটি সংগ্রহ নির্বাচন করুন।"
+ },
+ "cloneItem": {
+ "message": "বস্তুটি নকল করুন"
+ },
+ "clone": {
+ "message": "নকল"
+ },
+ "passwordGeneratorPolicyInEffect": {
+ "message": "এক বা একাধিক সংস্থার নীতিগুলি আপনার উৎপাদকের সেটিংসকে প্রভাবিত করছে।"
+ },
+ "vaultTimeoutAction": {
+ "message": "ভল্টের সময়সীমা কর্ম"
+ },
+ "lock": {
+ "message": "লক",
+ "description": "Verb form: to make secure or inaccesible by"
+ },
+ "trash": {
+ "message": "আবর্জনা",
+ "description": "Noun: a special folder to hold deleted items"
+ },
+ "searchTrash": {
+ "message": "আবর্জনাতে খুঁজুন"
+ },
+ "permanentlyDeleteItem": {
+ "message": "স্থায়ীভাবে বস্তু মুছুন"
+ },
+ "permanentlyDeleteItemConfirmation": {
+ "message": "আপনি কি নিশ্চিত এই বস্তুটি স্থায়ীভাবে মুছতে চান?"
+ },
+ "permanentlyDeletedItem": {
+ "message": "বস্তুটি স্থায়ীভাবে মুছে ফেলা হয়েছে"
+ },
+ "restoreItem": {
+ "message": "বস্তু পুনরুদ্ধার"
+ },
+ "restoreItemConfirmation": {
+ "message": "আপনি কি নিশ্চিত যে আপনি এই বস্তুটি পুনরুদ্ধার করতে চান?"
+ },
+ "restoredItem": {
+ "message": "বস্তু পুনরুদ্ধারকৃত"
+ },
+ "vaultTimeoutLogOutConfirmation": {
+ "message": "লগ আউট করা আপনার ভল্টের সমস্ত অ্যাক্সেস সরিয়ে ফেলবে এবং সময়সীমার পরে অনলাইন প্রমাণীকরণের প্রয়োজন। আপনি কি নিশ্চিত যে এই সেটিংটি ব্যবহার করবেন?"
+ },
+ "vaultTimeoutLogOutConfirmationTitle": {
+ "message": "সময়সীমা কর্ম নিশ্চিতকরণ"
+ },
+ "autoFillAndSave": {
+ "message": "স্বতঃপূরণ ও সংরক্ষণ"
+ },
+ "autoFillSuccessAndSavedUri": {
+ "message": "স্বতঃপূরণকৃত বস্তু ও সংরক্ষিত URI"
+ },
+ "autoFillSuccess": {
+ "message": "স্বতঃপূরণকৃত বস্তু"
+ },
+ "setMasterPassword": {
+ "message": "মূল পাসওয়ার্ড ধার্য করুন"
+ },
+ "masterPasswordPolicyInEffect": {
+ "message": "এক বা একাধিক সংস্থার নীতিগুলির কারণে নিম্নলিখিত প্রয়োজনসমূহ মূল পাসওয়ার্ডের পূরণ করা প্রয়োজন:"
+ },
+ "policyInEffectMinComplexity": {
+ "message": "$SCORE$ এর সর্বনিম্ন জটিলতার স্কোর",
+ "placeholders": {
+ "score": {
+ "content": "$1",
+ "example": "4"
+ }
+ }
+ },
+ "policyInEffectMinLength": {
+ "message": "$LENGTH$ এর সর্বনিম্ন দৈর্ঘ্য",
+ "placeholders": {
+ "length": {
+ "content": "$1",
+ "example": "14"
+ }
+ }
+ },
+ "policyInEffectUppercase": {
+ "message": "এক বা একাধিক বড় হাতের অক্ষর রয়েছে"
+ },
+ "policyInEffectLowercase": {
+ "message": "এক বা একাধিক ছোট হাতের অক্ষর রয়েছে"
+ },
+ "policyInEffectNumbers": {
+ "message": "এক বা একাধিক সংখ্যা রয়েছে"
+ },
+ "policyInEffectSpecial": {
+ "message": "নিম্নলিখিত বিশেষ অক্ষরগুলির একটি বা একাধিক রয়েছে $CHARS$",
+ "placeholders": {
+ "chars": {
+ "content": "$1",
+ "example": "!@#$%^&*"
+ }
+ }
+ },
+ "masterPasswordPolicyRequirementsNotMet": {
+ "message": "আপনার নতুন মূল পাসওয়ার্ড নীতির প্রয়োজনীয়তা পূরণ করে না।"
+ },
+ "acceptPolicies": {
+ "message": "এই বাক্সটি টিক করে আপনি নিম্নলিখিতগুলিতে সম্মত হন:"
+ },
+ "acceptPoliciesError": {
+ "message": "পরিষেবার শর্তাদি এবং গোপনীয়তা নীতি স্বীকার করা হয়নি।"
+ },
+ "termsOfService": {
+ "message": "সেবা পাবার শর্ত"
+ },
+ "privacyPolicy": {
+ "message": "গোপনীয়তা নীতি"
+ },
+ "hintEqualsPassword": {
+ "message": "আপনার পাসওয়ার্ডের ইঙ্গিতটি আপনার পাসওয়ার্ড হতে পারবে না।"
+ },
+ "ok": {
+ "message": "ঠিক আছে"
+ },
+ "desktopSyncVerificationTitle": {
+ "message": "ডেস্কটপ সিঙ্ক যাচাইকরণ"
+ },
+ "desktopIntegrationVerificationText": {
+ "message": "ডেস্কটপ অ্যাপ্লিকেশন এই আঙুলের ছাপ প্রদর্শন করে কিনা তা যাচাই করুন:"
+ },
+ "desktopIntegrationDisabledTitle": {
+ "message": "ব্রাউজার একীকরণ সক্ষম নেই"
+ },
+ "desktopIntegrationDisabledDesc": {
+ "message": "Bitwarden ডেস্কটপ অ্যাপ্লিকেশনটিতে ব্রাউজার ইন্টিগ্রেশন সক্ষম নেই। ডেস্কটপ অ্যাপ্লিকেশন মধ্যে সেটিংস এ দয়া করে এটি সক্ষম করুন।"
+ },
+ "startDesktopTitle": {
+ "message": "Bitwarden ডেস্কটপ অ্যাপ্লিকেশন শুরু করুন"
+ },
+ "startDesktopDesc": {
+ "message": "এই ক্রিয়াকলাপ ব্যবহার করার পূর্বে Bitwarden ডেস্কটপ অ্যাপ্লিকেশনটি শুরু করা দরকার।"
+ },
+ "errorEnableBiometricTitle": {
+ "message": "বায়োমেট্রিক্স সক্ষম করতে অক্ষম"
+ },
+ "errorEnableBiometricDesc": {
+ "message": "ডেস্কটপ অ্যাপ্লিকেশন দ্বারা কর্মটি বাতিলকৃত"
+ },
+ "nativeMessagingInvalidEncryptionDesc": {
+ "message": "ডেস্কটপ অ্যাপ্লিকেশনটি সুরক্ষিত যোগাযোগ চ্যানেলকে অবৈধ করেছে। দয়া করে এই ক্রিয়াটি আবার চেষ্টা করুন"
+ },
+ "nativeMessagingInvalidEncryptionTitle": {
+ "message": "ডেস্কটপ যোগাযোগ ব্যাহত"
+ },
+ "nativeMessagingWrongUserDesc": {
+ "message": "ডেস্কটপ অ্যাপ্লিকেশনটি একটি ভিন্ন অ্যাকাউন্টে লগইনকৃত। উভয় অ্যাপ্লিকেশন একই অ্যাকাউন্টে লগ ইন করা রয়েছে কিনা তা নিশ্চিত করুন।"
+ },
+ "nativeMessagingWrongUserTitle": {
+ "message": "অ্যাকাউন্ট মেলেনি"
+ },
+ "biometricsNotEnabledTitle": {
+ "message": "বায়োমেট্রিকস সক্ষম নেই"
+ },
+ "biometricsNotEnabledDesc": {
+ "message": "ব্রাউজার বায়োমেট্রিক্সের জন্য প্রথমে সেটিংসে ডেস্কটপ বায়োমেট্রিক সক্ষম করা প্রয়োজন।"
+ },
+ "biometricsNotSupportedTitle": {
+ "message": "বায়োমেট্রিক্স অসমর্থিত"
+ },
+ "biometricsNotSupportedDesc": {
+ "message": "ব্রাউজার বায়োমেট্রিক্স এই ডিভাইসে সমর্থিত নয়।"
+ },
+ "nativeMessaginPermissionErrorTitle": {
+ "message": "অনুমতি দেওয়া হয়নি"
+ },
+ "nativeMessaginPermissionErrorDesc": {
+ "message": "Bitwarden ডেস্কটপ অ্যাপ্লিকেশনটির সাথে যোগাযোগের অনুমতি ছাড়াই আমরা ব্রাউজার এক্সটেনশনে বায়োমেট্রিক সরবরাহ করতে পারি না। অনুগ্রহপূর্বক আবার চেষ্টা করুন।"
+ },
+ "nativeMessaginPermissionSidebarTitle": {
+ "message": "Permission request error"
+ },
+ "nativeMessaginPermissionSidebarDesc": {
+ "message": "This action cannot be done in the sidebar, please retry the action in the popup or popout."
+ },
+ "personalOwnershipSubmitError": {
+ "message": "একটি এন্টারপ্রাইজ নীতির কারণে, আপনি আপনার ব্যক্তিগত ভল্টে বস্তুসমূহ সংরক্ষণ করা থেকে সীমাবদ্ধ। একটি প্রতিষ্ঠানের মালিকানা বিকল্পটি পরিবর্তন করুন এবং উপলভ্য সংগ্রহগুলি থেকে চয়ন করুন।"
+ },
+ "personalOwnershipPolicyInEffect": {
+ "message": "একটি প্রতিষ্ঠানের নীতি আপনার মালিকানা বিকল্পগুলিকে প্রভাবিত করছে।"
+ },
+ "excludedDomains": {
+ "message": "Excluded Domains"
+ },
+ "excludedDomainsDesc": {
+ "message": "Bitwarden will not ask to save login details for these domains. You must refresh the page for changes to take effect."
+ },
+ "excludedDomainsInvalidDomain": {
+ "message": "$DOMAIN$ is not a valid domain",
+ "placeholders": {
+ "domain": {
+ "content": "$1",
+ "example": "googlecom"
+ }
+ }
+ },
+ "send": {
+ "message": "Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "searchSends": {
+ "message": "Search Sends",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "addSend": {
+ "message": "Add Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTypeText": {
+ "message": "Text"
+ },
+ "sendTypeFile": {
+ "message": "File"
+ },
+ "allSends": {
+ "message": "All Sends",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "maxAccessCountReached": {
+ "message": "Max access count reached"
+ },
+ "expired": {
+ "message": "Expired"
+ },
+ "pendingDeletion": {
+ "message": "Pending deletion"
+ },
+ "passwordProtected": {
+ "message": "Password protected"
+ },
+ "copySendLink": {
+ "message": "Copy Send link",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "removePassword": {
+ "message": "Remove Password"
+ },
+ "delete": {
+ "message": "Delete"
+ },
+ "removedPassword": {
+ "message": "Removed Password"
+ },
+ "deletedSend": {
+ "message": "Deleted Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendLink": {
+ "message": "Send link",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "disabled": {
+ "message": "Disabled"
+ },
+ "removePasswordConfirmation": {
+ "message": "Are you sure you want to remove the password?"
+ },
+ "deleteSend": {
+ "message": "Delete Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "deleteSendConfirmation": {
+ "message": "Are you sure you want to delete this Send?",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "editSend": {
+ "message": "Edit Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTypeHeader": {
+ "message": "What type of Send is this?",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendNameDesc": {
+ "message": "A friendly name to describe this Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendFileDesc": {
+ "message": "The file you want to send."
+ },
+ "deletionDate": {
+ "message": "Deletion Date"
+ },
+ "deletionDateDesc": {
+ "message": "The Send will be permanently deleted on the specified date and time.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "expirationDate": {
+ "message": "Expiration Date"
+ },
+ "expirationDateDesc": {
+ "message": "If set, access to this Send will expire on the specified date and time.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "oneDay": {
+ "message": "1 day"
+ },
+ "days": {
+ "message": "$DAYS$ days",
+ "placeholders": {
+ "days": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "custom": {
+ "message": "Custom"
+ },
+ "maximumAccessCount": {
+ "message": "Maximum Access Count"
+ },
+ "maximumAccessCountDesc": {
+ "message": "If set, users will no longer be able to access this Send once the maximum access count is reached.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendPasswordDesc": {
+ "message": "Optionally require a password for users to access this Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendNotesDesc": {
+ "message": "Private notes about this Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendDisableDesc": {
+ "message": "Disable this Send so that no one can access it.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendShareDesc": {
+ "message": "Copy this Send's link to clipboard upon save.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTextDesc": {
+ "message": "The text you want to send."
+ },
+ "sendHideText": {
+ "message": "Hide this Send's text by default.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "currentAccessCount": {
+ "message": "Current Access Count"
+ },
+ "createSend": {
+ "message": "Create New Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "newPassword": {
+ "message": "New Password"
+ },
+ "sendDisabled": {
+ "message": "Send Disabled",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendDisabledWarning": {
+ "message": "Due to an enterprise policy, you are only able to delete an existing Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "createdSend": {
+ "message": "Created Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "editedSend": {
+ "message": "Edited Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendLinuxChromiumFileWarning": {
+ "message": "In order to choose a file, open the extension in the sidebar (if possible) or pop out to a new window by clicking this banner."
+ },
+ "sendFirefoxFileWarning": {
+ "message": "In order to choose a file using Firefox, open the extension in the sidebar or pop out to a new window by clicking this banner."
+ },
+ "sendSafariFileWarning": {
+ "message": "In order to choose a file using Safari, pop out to a new window by clicking this banner."
+ },
+ "sendFileCalloutHeader": {
+ "message": "Before you start"
+ },
+ "sendFirefoxCustomDatePopoutMessage1": {
+ "message": "To use a calendar style date picker",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read '**To use a calendar style date picker ** click here to pop out your window.'"
+ },
+ "sendFirefoxCustomDatePopoutMessage2": {
+ "message": "click here",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker **click here** to pop out your window.'"
+ },
+ "sendFirefoxCustomDatePopoutMessage3": {
+ "message": "to pop out your window.",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker click here **to pop out your window.**'"
+ },
+ "expirationDateIsInvalid": {
+ "message": "The expiration date provided is not valid."
+ },
+ "deletionDateIsInvalid": {
+ "message": "The deletion date provided is not valid."
+ },
+ "expirationDateAndTimeRequired": {
+ "message": "An expiration date and time are required."
+ },
+ "deletionDateAndTimeRequired": {
+ "message": "A deletion date and time are required."
+ },
+ "dateParsingError": {
+ "message": "There was an error saving your deletion and expiration dates."
+ },
+ "hideEmail": {
+ "message": "Hide my email address from recipients."
+ },
+ "sendOptionsPolicyInEffect": {
+ "message": "One or more organization policies are affecting your Send options."
+ },
+ "passwordPrompt": {
+ "message": "Master password re-prompt"
+ },
+ "passwordConfirmation": {
+ "message": "Master password confirmation"
+ },
+ "passwordConfirmationDesc": {
+ "message": "This action is protected. To continue, please re-enter your master password to verify your identity."
+ },
+ "emailVerificationRequired": {
+ "message": "Email Verification Required"
+ },
+ "emailVerificationRequiredDesc": {
+ "message": "You must verify your email to use this feature. You can verify your email in the web vault."
+ },
+ "updatedMasterPassword": {
+ "message": "Updated Master Password"
+ },
+ "updateMasterPassword": {
+ "message": "Update Master Password"
+ },
+ "updateMasterPasswordWarning": {
+ "message": "Your Master Password was recently changed by an administrator in your organization. In order to access the vault, you must update it now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour."
+ },
+ "resetPasswordPolicyAutoEnroll": {
+ "message": "Automatic Enrollment"
+ },
+ "resetPasswordAutoEnrollInviteWarning": {
+ "message": "This organization has an enterprise policy that will automatically enroll you in password reset. Enrollment will allow organization administrators to change your master password."
+ },
+ "selectFolder": {
+ "message": "Select folder..."
+ },
+ "ssoCompleteRegistration": {
+ "message": "In order to complete logging in with SSO, please set a master password to access and protect your vault."
+ },
+ "hours": {
+ "message": "Hours"
+ },
+ "minutes": {
+ "message": "Minutes"
+ },
+ "vaultTimeoutPolicyInEffect": {
+ "message": "Your organization policies are affecting your vault timeout. Maximum allowed Vault Timeout is $HOURS$ hour(s) and $MINUTES$ minute(s)",
+ "placeholders": {
+ "hours": {
+ "content": "$1",
+ "example": "5"
+ },
+ "minutes": {
+ "content": "$2",
+ "example": "5"
+ }
+ }
+ },
+ "vaultTimeoutToLarge": {
+ "message": "Your vault timeout exceeds the restrictions set by your organization."
+ },
+ "vaultExportDisabled": {
+ "message": "Vault Export Disabled"
+ },
+ "personalVaultExportPolicyInEffect": {
+ "message": "One or more organization policies prevents you from exporting your personal vault."
+ },
+ "copyCustomFieldNameInvalidElement": {
+ "message": "Unable to identify a valid form element. Try inspecting the HTML instead."
+ },
+ "copyCustomFieldNameNotUnique": {
+ "message": "No unique identifier found."
+ }
+}
diff --git a/src/iOS.Safari/Resources/_locales/ca/messages.json b/src/iOS.Safari/Resources/_locales/ca/messages.json
new file mode 100644
index 000000000..99ea25bdc
--- /dev/null
+++ b/src/iOS.Safari/Resources/_locales/ca/messages.json
@@ -0,0 +1,1817 @@
+{
+ "appName": {
+ "message": "Bitwarden"
+ },
+ "extName": {
+ "message": "Bitwarden",
+ "description": "Extension name, MUST be less than 40 characters (Safari restriction)"
+ },
+ "extDesc": {
+ "message": "Administrador de contrasenyes segur i gratuït per a tots els vostres dispositius.",
+ "description": "Extension description"
+ },
+ "loginOrCreateNewAccount": {
+ "message": "Inicieu sessió o creeu un compte nou per accedir a la caixa forta."
+ },
+ "createAccount": {
+ "message": "Crea un compte"
+ },
+ "login": {
+ "message": "Inicia sessió"
+ },
+ "enterpriseSingleSignOn": {
+ "message": "Inici de sessió únic d'empresa"
+ },
+ "cancel": {
+ "message": "Cancel·la"
+ },
+ "close": {
+ "message": "Tanca"
+ },
+ "submit": {
+ "message": "Envia"
+ },
+ "emailAddress": {
+ "message": "Adreça electrònica"
+ },
+ "masterPass": {
+ "message": "Contrasenya mestra"
+ },
+ "masterPassDesc": {
+ "message": "La contrasenya mestra és la que utilitzeu per accedir a la vostra caixa forta. És molt important que no la oblideu. No hi ha manera de recuperar-la en cas de perdre-la."
+ },
+ "masterPassHintDesc": {
+ "message": "Una pista de contrasenya mestra us pot ajudar a recordar-la si l'oblideu."
+ },
+ "reTypeMasterPass": {
+ "message": "Torneu a escriure la contrasenya mestra"
+ },
+ "masterPassHint": {
+ "message": "Suggeriment de la contrasenya mestra (opcional)"
+ },
+ "tab": {
+ "message": "Pestanya"
+ },
+ "myVault": {
+ "message": "La meua caixa forta"
+ },
+ "tools": {
+ "message": "Eines"
+ },
+ "settings": {
+ "message": "Configuració"
+ },
+ "currentTab": {
+ "message": "Pestanya actual"
+ },
+ "copyPassword": {
+ "message": "Copia contrasenya"
+ },
+ "copyNote": {
+ "message": "Copia nota"
+ },
+ "copyUri": {
+ "message": "Copia URI"
+ },
+ "copyUsername": {
+ "message": "Copia el nom d'usuari"
+ },
+ "copyNumber": {
+ "message": "Copia el número"
+ },
+ "copySecurityCode": {
+ "message": "Copia el codi de seguretat"
+ },
+ "autoFill": {
+ "message": "Emplenament automàtic"
+ },
+ "generatePasswordCopied": {
+ "message": "Genera contrasenya (copiada)"
+ },
+ "copyElementIdentifier": {
+ "message": "Copy Custom Field Name"
+ },
+ "noMatchingLogins": {
+ "message": "No hi ha inicis de sessió coincidents."
+ },
+ "vaultLocked": {
+ "message": "La caixa forta està bloquejada."
+ },
+ "vaultLoggedOut": {
+ "message": "La caixa forta està desconnectada."
+ },
+ "autoFillInfo": {
+ "message": "No hi ha cap inici de sessió disponible per omplir automàticament la pestanya del navegador actual."
+ },
+ "addLogin": {
+ "message": "Afegeix un inici de sessió"
+ },
+ "addItem": {
+ "message": "Afegeix element"
+ },
+ "passwordHint": {
+ "message": "Pista de la contrasenya"
+ },
+ "enterEmailToGetHint": {
+ "message": "Introduïu l'adreça electrònica del vostre compte per rebre la contrasenya mestra."
+ },
+ "getMasterPasswordHint": {
+ "message": "Obteniu la pista de la contrasenya mestra"
+ },
+ "continue": {
+ "message": "Continua"
+ },
+ "verificationCode": {
+ "message": "Codi de verificació"
+ },
+ "account": {
+ "message": "Compte"
+ },
+ "changeMasterPassword": {
+ "message": "Canvia la contrasenya mestra"
+ },
+ "fingerprintPhrase": {
+ "message": "Frase d'empremta digital",
+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
+ },
+ "yourAccountsFingerprint": {
+ "message": "Frase d'empremta digital del vostre compte",
+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
+ },
+ "twoStepLogin": {
+ "message": "Inici de sessió en dues passes"
+ },
+ "logOut": {
+ "message": "Tanca la sessió"
+ },
+ "about": {
+ "message": "Quant a"
+ },
+ "version": {
+ "message": "Versió"
+ },
+ "save": {
+ "message": "Guarda"
+ },
+ "move": {
+ "message": "Desplaça"
+ },
+ "addFolder": {
+ "message": "Afegeix carpeta"
+ },
+ "name": {
+ "message": "Nom"
+ },
+ "editFolder": {
+ "message": "Edita la carpeta"
+ },
+ "deleteFolder": {
+ "message": "Suprimeix carpeta"
+ },
+ "folders": {
+ "message": "Carpetes"
+ },
+ "noFolders": {
+ "message": "No hi ha cap carpeta a llistar."
+ },
+ "helpFeedback": {
+ "message": "Ajuda i comentaris"
+ },
+ "sync": {
+ "message": "Sincronització"
+ },
+ "syncVaultNow": {
+ "message": "Sincronitza la caixa forta ara"
+ },
+ "lastSync": {
+ "message": "Última sincronització:"
+ },
+ "passGen": {
+ "message": "Generador de contrasenyes"
+ },
+ "generator": {
+ "message": "Generador",
+ "description": "Short for 'Password Generator'."
+ },
+ "passGenInfo": {
+ "message": "Genera automàticament contrasenyes fortes i úniques per als vostres inicis de sessió."
+ },
+ "bitWebVault": {
+ "message": "Caixa forta web de Bitwarden"
+ },
+ "importItems": {
+ "message": "Importa elements"
+ },
+ "select": {
+ "message": "Selecciona"
+ },
+ "generatePassword": {
+ "message": "Genera contrasenya"
+ },
+ "regeneratePassword": {
+ "message": "Regenera contrasenya"
+ },
+ "options": {
+ "message": "Opcions"
+ },
+ "length": {
+ "message": "Longitud"
+ },
+ "numWords": {
+ "message": "Nombre de paraules"
+ },
+ "wordSeparator": {
+ "message": "Separador de paraules"
+ },
+ "capitalize": {
+ "message": "Majúscules inicials",
+ "description": "Make the first letter of a work uppercase."
+ },
+ "includeNumber": {
+ "message": "Inclou número"
+ },
+ "minNumbers": {
+ "message": "Mínim de caràcters númerics"
+ },
+ "minSpecial": {
+ "message": "Mínim de caràcters especials"
+ },
+ "avoidAmbChar": {
+ "message": "Eviteu caràcters ambigus"
+ },
+ "searchVault": {
+ "message": "Cerca en la caixa forta"
+ },
+ "edit": {
+ "message": "Edita"
+ },
+ "view": {
+ "message": "Visualitza"
+ },
+ "noItemsInList": {
+ "message": "No hi ha cap element a llistar."
+ },
+ "itemInformation": {
+ "message": "Informació de l'element"
+ },
+ "username": {
+ "message": "Nom d'usuari"
+ },
+ "password": {
+ "message": "Contrasenya"
+ },
+ "passphrase": {
+ "message": "Frase de pas"
+ },
+ "favorite": {
+ "message": "Preferit"
+ },
+ "notes": {
+ "message": "Notes"
+ },
+ "note": {
+ "message": "Nota"
+ },
+ "editItem": {
+ "message": "Edita l'element"
+ },
+ "folder": {
+ "message": "Carpeta"
+ },
+ "deleteItem": {
+ "message": "Suprimeix element"
+ },
+ "viewItem": {
+ "message": "Mostra element"
+ },
+ "launch": {
+ "message": "Inicia"
+ },
+ "website": {
+ "message": "Lloc web"
+ },
+ "toggleVisibility": {
+ "message": "Commuta la visibilitat"
+ },
+ "manage": {
+ "message": "Administra"
+ },
+ "other": {
+ "message": "Altres"
+ },
+ "rateExtension": {
+ "message": "Valora aquesta extensió"
+ },
+ "rateExtensionDesc": {
+ "message": "Considereu ajudar-nos amb una bona valoració!"
+ },
+ "browserNotSupportClipboard": {
+ "message": "El vostre navegador web no admet la còpia fàcil del porta-retalls. Copieu-ho manualment."
+ },
+ "verifyMasterPassword": {
+ "message": "Verifica la contrasenya mestra"
+ },
+ "yourVaultIsLocked": {
+ "message": "La caixa forta està bloquejada. Comproveu la contrasenya mestra per continuar."
+ },
+ "unlock": {
+ "message": "Desbloqueja"
+ },
+ "loggedInAsOn": {
+ "message": "Heu iniciat sessió com a $EMAIL$ en $HOSTNAME$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "name@example.com"
+ },
+ "hostname": {
+ "content": "$2",
+ "example": "bitwarden.com"
+ }
+ }
+ },
+ "invalidMasterPassword": {
+ "message": "Contrasenya mestra no vàlida"
+ },
+ "vaultTimeout": {
+ "message": "Temps d'espera de la caixa forta"
+ },
+ "lockNow": {
+ "message": "Bloqueja ara"
+ },
+ "immediately": {
+ "message": "Immediatament"
+ },
+ "tenSeconds": {
+ "message": "10 segons"
+ },
+ "twentySeconds": {
+ "message": "20 segons"
+ },
+ "thirtySeconds": {
+ "message": "30 segons"
+ },
+ "oneMinute": {
+ "message": "1 minut"
+ },
+ "twoMinutes": {
+ "message": "2 minuts"
+ },
+ "fiveMinutes": {
+ "message": "5 Minuts"
+ },
+ "fifteenMinutes": {
+ "message": "15 minuts"
+ },
+ "thirtyMinutes": {
+ "message": "30 minuts"
+ },
+ "oneHour": {
+ "message": "1 hora"
+ },
+ "fourHours": {
+ "message": "4 hores"
+ },
+ "onLocked": {
+ "message": "En bloquejar el sistema"
+ },
+ "onRestart": {
+ "message": "En reiniciar el navegador"
+ },
+ "never": {
+ "message": "Mai"
+ },
+ "security": {
+ "message": "Seguretat"
+ },
+ "errorOccurred": {
+ "message": "S'ha produït un error"
+ },
+ "emailRequired": {
+ "message": "L'adreça de correu electrònic és obligatoria."
+ },
+ "invalidEmail": {
+ "message": "L'adreça de correu electrònic no és vàlida."
+ },
+ "masterPassRequired": {
+ "message": "La contrasenya mestra és obligatòria."
+ },
+ "masterPassLength": {
+ "message": "La contrasenya mestra ha de contenir almenys 8 caràcters."
+ },
+ "masterPassDoesntMatch": {
+ "message": "La confirmació de la contrasenya mestra no coincideix."
+ },
+ "newAccountCreated": {
+ "message": "El vostre compte s'ha creat correctament. Ara ja podeu iniciar sessió."
+ },
+ "masterPassSent": {
+ "message": "Hem enviat un correu electrònic amb la vostra contrasenya mestra."
+ },
+ "verificationCodeRequired": {
+ "message": "El codi de verificació és obligatori."
+ },
+ "valueCopied": {
+ "message": "S'ha copiat $VALUE$",
+ "description": "Value has been copied to the clipboard.",
+ "placeholders": {
+ "value": {
+ "content": "$1",
+ "example": "Password"
+ }
+ }
+ },
+ "autofillError": {
+ "message": "No es pot omplir automàticament l'element seleccionat en aquesta pàgina. Com a alternativa, copieu i enganxeu la informació."
+ },
+ "loggedOut": {
+ "message": "Sessió tancada"
+ },
+ "loginExpired": {
+ "message": "La vostra sessió ha caducat."
+ },
+ "logOutConfirmation": {
+ "message": "Segur que voleu tancar la sessió?"
+ },
+ "yes": {
+ "message": "Sí"
+ },
+ "no": {
+ "message": "No"
+ },
+ "unexpectedError": {
+ "message": "S'ha produït un error inesperat."
+ },
+ "nameRequired": {
+ "message": "El nom és obligatori."
+ },
+ "addedFolder": {
+ "message": "Carpeta afegida"
+ },
+ "changeMasterPass": {
+ "message": "Canvia la contrasenya mestra"
+ },
+ "changeMasterPasswordConfirmation": {
+ "message": "Podeu canviar la contrasenya mestra a la caixa forta web de bitwarden.com. Voleu visitar el lloc web ara?"
+ },
+ "twoStepLoginConfirmation": {
+ "message": "L'inici de sessió en dues passes fa que el vostre compte siga més segur, ja que obliga a verificar el vostre inici de sessió amb un altre dispositiu, com ara una clau de seguretat, una aplicació autenticadora, un SMS, una trucada telefònica o un correu electrònic. Es pot habilitar l'inici de sessió en dues passes a la caixa forta web de bitwarden.com. Voleu visitar el lloc web ara?"
+ },
+ "editedFolder": {
+ "message": "Carpeta editada"
+ },
+ "deleteFolderConfirmation": {
+ "message": "Esteu segur que voleu suprimir aquesta carpeta?"
+ },
+ "deletedFolder": {
+ "message": "Carpeta suprimida"
+ },
+ "gettingStartedTutorial": {
+ "message": "Tutorial d'introducció"
+ },
+ "gettingStartedTutorialVideo": {
+ "message": "Mireu el nostre tutorial sobre com aprendre a aprofitar al màxim l'extensió del navegador."
+ },
+ "syncingComplete": {
+ "message": "S'ha completat la sincronització"
+ },
+ "syncingFailed": {
+ "message": "Ha fallat la sincronització"
+ },
+ "passwordCopied": {
+ "message": "S'ha copiat la contrasenya"
+ },
+ "uri": {
+ "message": "URI"
+ },
+ "uriPosition": {
+ "message": "URI $POSITION$",
+ "description": "A listing of URIs. Ex: URI 1, URI 2, URI 3, etc.",
+ "placeholders": {
+ "position": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "newUri": {
+ "message": "Nova URI"
+ },
+ "addedItem": {
+ "message": "Element afegit"
+ },
+ "editedItem": {
+ "message": "Element editat"
+ },
+ "deleteItemConfirmation": {
+ "message": "Esteu segur que voleu suprimir aquest element?"
+ },
+ "deletedItem": {
+ "message": "Element suprimit"
+ },
+ "overwritePassword": {
+ "message": "Sobreescriu la contrasenya"
+ },
+ "overwritePasswordConfirmation": {
+ "message": "Esteu segur que voleu sobreescriure la contrasenya actual?"
+ },
+ "searchFolder": {
+ "message": "Cerca la carpeta"
+ },
+ "searchCollection": {
+ "message": "Cerca la col·lecció"
+ },
+ "searchType": {
+ "message": "Cerca el tipus"
+ },
+ "noneFolder": {
+ "message": "Cap carpeta",
+ "description": "This is the folder for uncategorized items"
+ },
+ "disableAddLoginNotification": {
+ "message": "Deshabilita la notificació per afegir inicis de sessió"
+ },
+ "addLoginNotificationDesc": {
+ "message": "La \"Notificació per afegir inicis de sessió\" demana automàticament que guardeu els nous inicis de sessió a la vostra caixa forta quan inicieu la sessió per primera vegada."
+ },
+ "dontShowCardsCurrentTab": {
+ "message": "No mostres les targetes a la pàgina de la pestanya"
+ },
+ "dontShowCardsCurrentTabDesc": {
+ "message": "Els elements de targeta de la vostra caixa forta es detallen a la pàgina \"Fitxa actual\" per obtenir un fàcil accés amb l'emplenat automàtic."
+ },
+ "dontShowIdentitiesCurrentTab": {
+ "message": "No mostres les identitats a la pàgina de la pestanya"
+ },
+ "dontShowIdentitiesCurrentTabDesc": {
+ "message": "Els elements d'identitat de la vostra caixa forta es detallen a la pàgina \"Fitxa actual\" per obtenir un fàcil accés amb l'emplenat automàtic."
+ },
+ "clearClipboard": {
+ "message": "Neteja el porta-retalls",
+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
+ },
+ "clearClipboardDesc": {
+ "message": "Esborra automàticament els valors copiats del porta-retalls.",
+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
+ },
+ "notificationAddDesc": {
+ "message": "Bitwarden ha de recordar aquesta contrasenya per a vosaltres?"
+ },
+ "notificationAddSave": {
+ "message": "Sí, guarda-la ara"
+ },
+ "notificationNeverSave": {
+ "message": "Mai per a aquest lloc"
+ },
+ "disableChangedPasswordNotification": {
+ "message": "Deshabilita la notificació de contrasenya modificada"
+ },
+ "disableChangedPasswordNotificationDesc": {
+ "message": "La \"Notificació de contrasenya modificada\" us demanarà automàticament que actualitzeu la contrasenya d'inici de sessió a la vostra caixa forta cada vegada que detecte que s'ha canviat en un lloc web."
+ },
+ "notificationChangeDesc": {
+ "message": "Voleu actualitzar aquesta contrasenya a Bitwarden?"
+ },
+ "notificationChangeSave": {
+ "message": "Sí, actualitza-la ara"
+ },
+ "disableContextMenuItem": {
+ "message": "Inhabilita opcions del menú contextual"
+ },
+ "disableContextMenuItemDesc": {
+ "message": "Les opcions del menú contextual proporcionen accés ràpid a la generació de contrasenyes i inici de sessió al lloc web en la vostra pestanya actual."
+ },
+ "defaultUriMatchDetection": {
+ "message": "Detecció de coincidències URI per defecte",
+ "description": "Default URI match detection for auto-fill."
+ },
+ "defaultUriMatchDetectionDesc": {
+ "message": "Trieu la manera predeterminada en que es gestiona la detecció de coincidència d'URI per als inicis de sessió en realitzar accions com l'emplenament automàtic."
+ },
+ "theme": {
+ "message": "Tema"
+ },
+ "themeDesc": {
+ "message": "Canvia el color del tema de l'aplicació."
+ },
+ "dark": {
+ "message": "Fosc",
+ "description": "Dark color"
+ },
+ "light": {
+ "message": "Clar",
+ "description": "Light color"
+ },
+ "solarizedDark": {
+ "message": "Solaritzat fosc",
+ "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated."
+ },
+ "exportVault": {
+ "message": "Exporta caixa forta"
+ },
+ "fileFormat": {
+ "message": "Format de fitxer"
+ },
+ "warning": {
+ "message": "ADVERTIMENT",
+ "description": "WARNING (should stay in capitalized letters if the language permits)"
+ },
+ "confirmVaultExport": {
+ "message": "Confirma l'exportació de la Caixa forta"
+ },
+ "exportWarningDesc": {
+ "message": "Aquesta exportació conté les dades de la vostra caixa forta en un format no xifrat. No hauríeu d'emmagatzemar o enviar el fitxer exportat a través de canals no segurs (com ara el correu electrònic). Elimineu-lo immediatament després d'haver acabat d'usar-lo."
+ },
+ "encExportKeyWarningDesc": {
+ "message": "Aquesta exportació xifra les vostres dades mitjançant la clau de xifratge del vostre compte. Si alguna vegada gireu eixa clau, hauríeu d'exportar de nou, ja que no podreu desxifrar aquest fitxer d'exportació."
+ },
+ "encExportAccountWarningDesc": {
+ "message": "Les claus de xifratge són exclusives de cada compte d'usuari Bitwarden, de manera que no podeu importar una exportació xifrada a un compte diferent."
+ },
+ "exportMasterPassword": {
+ "message": "Introduïu la contrasenya mestra per exportar les dades de la caixa forta."
+ },
+ "shared": {
+ "message": "Compartit"
+ },
+ "learnOrg": {
+ "message": "Més informació sobre les organitzacions"
+ },
+ "learnOrgConfirmation": {
+ "message": "Bitwarden us permet compartir els elements de la vostra caixa forta amb altres usuaris mitjançant una organització. Voleu visitar el lloc web de bitwarden.com per obtenir més informació?"
+ },
+ "moveToOrganization": {
+ "message": "Desplaça a l'organització"
+ },
+ "share": {
+ "message": "Comparteix"
+ },
+ "movedItemToOrg": {
+ "message": "$ITEMNAME$ desplaçat a $ORGNAME$",
+ "placeholders": {
+ "itemname": {
+ "content": "$1",
+ "example": "Secret Item"
+ },
+ "orgname": {
+ "content": "$2",
+ "example": "Company Name"
+ }
+ }
+ },
+ "moveToOrgDesc": {
+ "message": "Trieu una organització a la qual vulgueu desplaçar aquest element. El trasllat a una organització transfereix la propietat de l'element a aquesta organització. Ja no sereu el propietari directe d'aquest element una vegada s'haja mogut."
+ },
+ "learnMore": {
+ "message": "Més informació"
+ },
+ "authenticatorKeyTotp": {
+ "message": "Clau d'autenticació (TOTP)"
+ },
+ "verificationCodeTotp": {
+ "message": "Codi de verificació (TOTP)"
+ },
+ "copyVerificationCode": {
+ "message": "Copia el codi de verificació"
+ },
+ "attachments": {
+ "message": "Adjunts"
+ },
+ "deleteAttachment": {
+ "message": "Suprimeix l'adjunt"
+ },
+ "deleteAttachmentConfirmation": {
+ "message": "Esteu segur que voleu suprimir aquest adjunt?"
+ },
+ "deletedAttachment": {
+ "message": "Adjunt suprimit"
+ },
+ "newAttachment": {
+ "message": "Afegeix un adjunt nou"
+ },
+ "noAttachments": {
+ "message": "No hi ha cap adjunt."
+ },
+ "attachmentSaved": {
+ "message": "S'ha guardat el fitxer adjunt."
+ },
+ "file": {
+ "message": "Fitxer"
+ },
+ "selectFile": {
+ "message": "Seleccioneu un fitxer."
+ },
+ "maxFileSize": {
+ "message": "La mida màxima del fitxer és de 500 MB."
+ },
+ "featureUnavailable": {
+ "message": "Característica no disponible"
+ },
+ "updateKey": {
+ "message": "No podeu utilitzar aquesta característica fins que actualitzeu la vostra clau de xifratge."
+ },
+ "premiumMembership": {
+ "message": "Subscripció Premium"
+ },
+ "premiumManage": {
+ "message": "Administra la subscripció"
+ },
+ "premiumManageAlert": {
+ "message": "Podeu administrar la vostra subscripció a la caixa forta web de bitwarden.com. Voleu visitar el lloc web ara?"
+ },
+ "premiumRefresh": {
+ "message": "Actualitza la subscripció"
+ },
+ "premiumNotCurrentMember": {
+ "message": "No sou actualment un membre premium."
+ },
+ "premiumSignUpAndGet": {
+ "message": "Inscriviu-vos per una subscripció premium i obteniu:"
+ },
+ "ppremiumSignUpStorage": {
+ "message": "1 GB d'emmagatzematge xifrat per als fitxers adjunts."
+ },
+ "ppremiumSignUpTwoStep": {
+ "message": "Opcions addicionals d'inici de sessió en dues passes com ara YubiKey, FIDO U2F i Duo."
+ },
+ "ppremiumSignUpReports": {
+ "message": "Requisits d'higiene de la contrasenya, salut del compte i informe d'infraccions de dades per mantenir la seguretat de la vostra caixa forta."
+ },
+ "ppremiumSignUpTotp": {
+ "message": "Generador de codi de verificació TOTP (2FA) per a inici de sessió a la vostra caixa forta."
+ },
+ "ppremiumSignUpSupport": {
+ "message": "Prioritat d'atenció al client."
+ },
+ "ppremiumSignUpFuture": {
+ "message": "Totes les funcions premium futures. Aviat, més!"
+ },
+ "premiumPurchase": {
+ "message": "Compra Premium"
+ },
+ "premiumPurchaseAlert": {
+ "message": "Podeu comprar la vostra subscripció a la caixa forta web de bitwarden.com. Voleu visitar el lloc web ara?"
+ },
+ "premiumCurrentMember": {
+ "message": "Sou un membre premium!"
+ },
+ "premiumCurrentMemberThanks": {
+ "message": "Gràcies per donar suport a Bitwarden."
+ },
+ "premiumPrice": {
+ "message": "Tot per només $PRICE$ / any!",
+ "placeholders": {
+ "price": {
+ "content": "$1",
+ "example": "$10"
+ }
+ }
+ },
+ "refreshComplete": {
+ "message": "Actualització completa"
+ },
+ "disableAutoTotpCopy": {
+ "message": "Deshabilita la còpia TOTP automàtica"
+ },
+ "disableAutoTotpCopyDesc": {
+ "message": "Si el vostre inici de sessió té una clau d'autenticació associada, el codi de verificació TOTP es copiarà al vostre porta-retalls quan s'òmpliga automàticament l'inici de sessió."
+ },
+ "disableAutoBiometricsPrompt": {
+ "message": "Do not prompt for biometrics on launch"
+ },
+ "premiumRequired": {
+ "message": "Premium requerit"
+ },
+ "premiumRequiredDesc": {
+ "message": "Cal una subscripció premium per utilitzar aquesta característica."
+ },
+ "enterVerificationCodeApp": {
+ "message": "Introduïu el codi de verificació de 6 dígits de l'aplicació autenticadora."
+ },
+ "enterVerificationCodeEmail": {
+ "message": "Introduïu el codi de verificació de 6 dígits que s'ha enviat per correu electrònic a $EMAIL$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "example@gmail.com"
+ }
+ }
+ },
+ "verificationCodeEmailSent": {
+ "message": "Correu electrònic de verificació enviat a $EMAIL$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "example@gmail.com"
+ }
+ }
+ },
+ "rememberMe": {
+ "message": "Recorda'm"
+ },
+ "sendVerificationCodeEmailAgain": {
+ "message": "Envia el codi de verificació altra vegada"
+ },
+ "useAnotherTwoStepMethod": {
+ "message": "Utilitzeu un altre mètode d'inici de sessió en dues passes"
+ },
+ "insertYubiKey": {
+ "message": "Introduïu la vostra YubiKey al port USB de l'ordinador i, a continuació, premeu el seu botó."
+ },
+ "insertU2f": {
+ "message": "Introduïu la vostra clau de seguretat al port USB de l'ordinador. Si té un botó, premeu-lo."
+ },
+ "webAuthnNewTab": {
+ "message": "\nPer iniciar la verificació de WebAuthn 2FA. Feu clic al botó següent per obrir una pestanya nova i seguiu les instruccions d'aquesta."
+ },
+ "webAuthnNewTabOpen": {
+ "message": "Obri una pestanya nova"
+ },
+ "webAuthnAuthenticate": {
+ "message": "Autenticar WebAuthn"
+ },
+ "loginUnavailable": {
+ "message": "Inici de sessió no disponible"
+ },
+ "noTwoStepProviders": {
+ "message": "Aquest compte té habilitat l'inici de sessió en dues passes, però aquest navegador web no admet cap dels dos proveïdors configurats."
+ },
+ "noTwoStepProviders2": {
+ "message": "Utilitzeu un navegador web compatible (com ara Chrome) o afegiu proveïdors addicionals que siguen compatibles amb tots els navegadors web (com una aplicació d'autenticació)."
+ },
+ "twoStepOptions": {
+ "message": "Opcions d'inici de sessió en dues passes"
+ },
+ "recoveryCodeDesc": {
+ "message": "Heu perdut l'accés a tots els vostres proveïdors de dos factors? Utilitzeu el vostre codi de recuperació per desactivar tots els proveïdors de dos factors del vostre compte."
+ },
+ "recoveryCodeTitle": {
+ "message": "Codi de recuperació"
+ },
+ "authenticatorAppTitle": {
+ "message": "Aplicació autenticadora"
+ },
+ "authenticatorAppDesc": {
+ "message": "Utilitzeu una aplicació autenticadora (com Authy o Google Authenticator) per generar codis de verificació basats en el temps.",
+ "description": "'Authy' and 'Google Authenticator' are product names and should not be translated."
+ },
+ "yubiKeyTitle": {
+ "message": "Clau de seguretat OTP de YubiKey"
+ },
+ "yubiKeyDesc": {
+ "message": "Utilitzeu una YubiKey per accedir al vostre compte. Funciona amb els dispositius YubiKey 4, 4 Nano, 4C i NEO."
+ },
+ "duoDesc": {
+ "message": "Verifiqueu amb Duo Security mitjançant l'aplicació Duo Mobile, SMS, trucada telefònica o clau de seguretat U2F.",
+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
+ },
+ "duoOrganizationDesc": {
+ "message": "Verifiqueu amb Duo Security per a la vostra organització mitjançant l'aplicació Duo Mobile, SMS, trucada telefònica o clau de seguretat U2F.",
+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
+ },
+ "webAuthnTitle": {
+ "message": "FIDO2 WebAuthn"
+ },
+ "webAuthnDesc": {
+ "message": "Utilitzeu qualsevol clau de seguretat habilitada per WebAuthn per accedir al vostre compte."
+ },
+ "emailTitle": {
+ "message": "Correu electrònic"
+ },
+ "emailDesc": {
+ "message": "Els codis de verificació els rebreu per correu electrònic."
+ },
+ "selfHostedEnvironment": {
+ "message": "Entorn d'allotjament propi"
+ },
+ "selfHostedEnvironmentFooter": {
+ "message": "Especifiqueu l'URL base de la vostra instal·lació de Bitwarden allotjada en un entorn propi."
+ },
+ "customEnvironment": {
+ "message": "Entorn personalitzat"
+ },
+ "customEnvironmentFooter": {
+ "message": "Per a usuaris avançats. Podeu especificar l'URL base de cada servei independentment."
+ },
+ "baseUrl": {
+ "message": "URL del servidor"
+ },
+ "apiUrl": {
+ "message": "URL del servidor API"
+ },
+ "webVaultUrl": {
+ "message": "URL del servidor de la caixa forta web"
+ },
+ "identityUrl": {
+ "message": "URL del servidor d'identitat"
+ },
+ "notificationsUrl": {
+ "message": "URL del servidor de notificacions"
+ },
+ "iconsUrl": {
+ "message": "URL del servidor d'icones"
+ },
+ "environmentSaved": {
+ "message": "S'han guardat les URL de l'entorn."
+ },
+ "enableAutoFillOnPageLoad": {
+ "message": "Habilita l'emplenament automàtic en carregar la pàgina"
+ },
+ "enableAutoFillOnPageLoadDesc": {
+ "message": "Si es detecta un formulari d'inici de sessió, es realitza automàticament un emplenament automàtic quan es carrega la pàgina web."
+ },
+ "experimentalFeature": {
+ "message": "Actualment és una característica experimental. Utilitzeu sota el vostre propi risc."
+ },
+ "defaultAutoFillOnPageLoad": {
+ "message": "Configuració per defecte d'emplenament automàtic per als elements d'inici de sessió"
+ },
+ "defaultAutoFillOnPageLoadDesc": {
+ "message": "Després d'habilitar l'emplenament automàtic a la càrrega de la pàgina, podeu habilitar o inhabilitar la característica per a elements d'inici de sessió individuals. Aquesta és la configuració per defecte per als elements d'inici de sessió que no estan configurats per separat."
+ },
+ "itemAutoFillOnPageLoad": {
+ "message": "Emplenament automàtic a la càrrega de la pàgina (si està habilitat a Opcions)"
+ },
+ "autoFillOnPageLoadUseDefault": {
+ "message": "Utilitza la configuració per defecte"
+ },
+ "autoFillOnPageLoadYes": {
+ "message": "Emplenament automàtic a la càrrega de la pàgina"
+ },
+ "autoFillOnPageLoadNo": {
+ "message": "No s'emplena automàticament a la càrrega de la pàgina"
+ },
+ "commandOpenPopup": {
+ "message": "Obri l'emergent de la caixa forta"
+ },
+ "commandOpenSidebar": {
+ "message": "Obri la caixa forta a la barra lateral"
+ },
+ "commandAutofillDesc": {
+ "message": "Ompliu automàticament amb l'últim accés utilitzat per al lloc web actual."
+ },
+ "commandGeneratePasswordDesc": {
+ "message": "Genera i copia una nova contrasenya aleatòria al porta-retalls."
+ },
+ "commandLockVaultDesc": {
+ "message": "Tanca la caixa forta"
+ },
+ "privateModeMessage": {
+ "message": "Malauradament, aquesta finestra no està disponible en el mode privat d'aquest navegador."
+ },
+ "customFields": {
+ "message": "Camps personalitzats"
+ },
+ "copyValue": {
+ "message": "Copia el valor"
+ },
+ "value": {
+ "message": "Valor"
+ },
+ "newCustomField": {
+ "message": "Camp nou personalitzat"
+ },
+ "dragToSort": {
+ "message": "Arrossega per ordenar"
+ },
+ "cfTypeText": {
+ "message": "Text"
+ },
+ "cfTypeHidden": {
+ "message": "Amagat"
+ },
+ "cfTypeBoolean": {
+ "message": "Booleà"
+ },
+ "popup2faCloseMessage": {
+ "message": "Si feu clic a l'exterior de la finestra emergent per comprovar el vostre correu electrònic amb el codi de verificació, es tancarà aquesta finestra. Voleu obrir aquesta finestra emergent en una finestra nova perquè no es tanque?"
+ },
+ "popupU2fCloseMessage": {
+ "message": "Aquest navegador no pot processar sol·licituds U2F en aquesta finestra emergent. Voleu obrir l'emergent en una finestra nova per poder iniciar la sessió mitjançant U2F?"
+ },
+ "disableFavicon": {
+ "message": "Deshabilitar icones del lloc web"
+ },
+ "disableFaviconDesc": {
+ "message": "Les icones del lloc web proporcionen una imatge que es pot reconèixer al costat de cada element d'inici de sessió a la vostra caixa forta."
+ },
+ "disableBadgeCounter": {
+ "message": "Deshabilita el comptador d'insígnies"
+ },
+ "disableBadgeCounterDesc": {
+ "message": "El comptador d’insígnies indica quants inicis de sessió teniu de la pàgina actual en la vostra caixa forta."
+ },
+ "cardholderName": {
+ "message": "Nom del titular de la targeta"
+ },
+ "number": {
+ "message": "Número"
+ },
+ "brand": {
+ "message": "Marca"
+ },
+ "expirationMonth": {
+ "message": "Mes de venciment"
+ },
+ "expirationYear": {
+ "message": "Any de venciment"
+ },
+ "expiration": {
+ "message": "Caducitat"
+ },
+ "january": {
+ "message": "Gener"
+ },
+ "february": {
+ "message": "Febrer"
+ },
+ "march": {
+ "message": "Març"
+ },
+ "april": {
+ "message": "Abril"
+ },
+ "may": {
+ "message": "Maig"
+ },
+ "june": {
+ "message": "Juny"
+ },
+ "july": {
+ "message": "Juliol"
+ },
+ "august": {
+ "message": "Agost"
+ },
+ "september": {
+ "message": "Setembre"
+ },
+ "october": {
+ "message": "Octubre"
+ },
+ "november": {
+ "message": "Novembre"
+ },
+ "december": {
+ "message": "Desembre"
+ },
+ "securityCode": {
+ "message": "Codi de seguretat"
+ },
+ "ex": {
+ "message": "ex."
+ },
+ "title": {
+ "message": "Títol"
+ },
+ "mr": {
+ "message": "Sr."
+ },
+ "mrs": {
+ "message": "Sra."
+ },
+ "ms": {
+ "message": "Srta."
+ },
+ "dr": {
+ "message": "Dr."
+ },
+ "firstName": {
+ "message": "Nom"
+ },
+ "middleName": {
+ "message": "Segon nom"
+ },
+ "lastName": {
+ "message": "Cognoms"
+ },
+ "identityName": {
+ "message": "Nom d'identitat"
+ },
+ "company": {
+ "message": "Empresa"
+ },
+ "ssn": {
+ "message": "Número de la Seguretat Social"
+ },
+ "passportNumber": {
+ "message": "Número de passaport"
+ },
+ "licenseNumber": {
+ "message": "Número de llicència"
+ },
+ "email": {
+ "message": "Correu electrònic"
+ },
+ "phone": {
+ "message": "Telèfon"
+ },
+ "address": {
+ "message": "Adreça"
+ },
+ "address1": {
+ "message": "Adreça 1"
+ },
+ "address2": {
+ "message": "Adreça 2"
+ },
+ "address3": {
+ "message": "Adreça 3"
+ },
+ "cityTown": {
+ "message": "Localitat"
+ },
+ "stateProvince": {
+ "message": "Estat/província"
+ },
+ "zipPostalCode": {
+ "message": "Codi postal"
+ },
+ "country": {
+ "message": "País"
+ },
+ "type": {
+ "message": "Tipus"
+ },
+ "typeLogin": {
+ "message": "Inici de sessió"
+ },
+ "typeLogins": {
+ "message": "Inicis de sessió"
+ },
+ "typeSecureNote": {
+ "message": "Nota segura"
+ },
+ "typeCard": {
+ "message": "Targeta"
+ },
+ "typeIdentity": {
+ "message": "Identitat"
+ },
+ "passwordHistory": {
+ "message": "Historial de les contrasenyes"
+ },
+ "back": {
+ "message": "Arrere"
+ },
+ "collections": {
+ "message": "Col·leccions"
+ },
+ "favorites": {
+ "message": "Preferits"
+ },
+ "popOutNewWindow": {
+ "message": "Obri en una finestra nova"
+ },
+ "refresh": {
+ "message": "Actualitza"
+ },
+ "cards": {
+ "message": "Targetes"
+ },
+ "identities": {
+ "message": "Identitats"
+ },
+ "logins": {
+ "message": "Inicis de sessió"
+ },
+ "secureNotes": {
+ "message": "Notes segures"
+ },
+ "clear": {
+ "message": "Esborra",
+ "description": "To clear something out. example: To clear browser history."
+ },
+ "checkPassword": {
+ "message": "Comprova si la contrasenya ha estat exposada."
+ },
+ "passwordExposed": {
+ "message": "Aquesta contrasenya ha estat exposada $VALUE$ vegades en errors de seguretat de dades. Heu de canviar-la.",
+ "placeholders": {
+ "value": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "passwordSafe": {
+ "message": "Aquesta contrasenya no s'ha trobat en cap filtració de dades coneguda. Hauries de poder utilitzar-la de manera segura."
+ },
+ "baseDomain": {
+ "message": "Domini base"
+ },
+ "host": {
+ "message": "Amfitrió",
+ "description": "A URL's host value. For example, the host of https://sub.domain.com:443 is 'sub.domain.com:443'."
+ },
+ "exact": {
+ "message": "Exacte"
+ },
+ "startsWith": {
+ "message": "Comença amb"
+ },
+ "regEx": {
+ "message": "Expressió regular",
+ "description": "A programming term, also known as 'RegEx'."
+ },
+ "matchDetection": {
+ "message": "Detecció de coincidències",
+ "description": "URI match detection for auto-fill."
+ },
+ "defaultMatchDetection": {
+ "message": "Detecció de coincidències per defecte",
+ "description": "Default URI match detection for auto-fill."
+ },
+ "toggleOptions": {
+ "message": "Commuta opcions"
+ },
+ "toggleCurrentUris": {
+ "message": "Commuta URI actuals",
+ "description": "Toggle the display of the URIs of the currently open tabs in the browser."
+ },
+ "currentUri": {
+ "message": "URI actual",
+ "description": "The URI of one of the current open tabs in the browser."
+ },
+ "organization": {
+ "message": "Organització",
+ "description": "An entity of multiple related people (ex. a team or business organization)."
+ },
+ "types": {
+ "message": "Tipus"
+ },
+ "allItems": {
+ "message": "Tots els elements"
+ },
+ "noPasswordsInList": {
+ "message": "No hi ha cap contrasenya a llistar."
+ },
+ "remove": {
+ "message": "Suprimeix"
+ },
+ "default": {
+ "message": "Per defecte"
+ },
+ "dateUpdated": {
+ "message": "Actualitzat",
+ "description": "ex. Date this item was updated"
+ },
+ "datePasswordUpdated": {
+ "message": "Contrasenya actualitzada",
+ "description": "ex. Date this password was updated"
+ },
+ "neverLockWarning": {
+ "message": "Esteu segur que voleu utilitzar l'opció \"Mai\"? En configurar les opcions de bloqueig a \"Mai\" s'emmagatzema la clau de xifratge de la vostra caixa forta al vostre dispositiu. Si utilitzeu aquesta opció, heu d'assegurar-vos que conserveu el dispositiu degudament protegit."
+ },
+ "noOrganizationsList": {
+ "message": "No pertanyeu a cap organització. Les organitzacions permeten compartir elements amb seguretat amb altres usuaris."
+ },
+ "noCollectionsInList": {
+ "message": "No hi ha cap col·lecció a llistar."
+ },
+ "ownership": {
+ "message": "Propietat"
+ },
+ "whoOwnsThisItem": {
+ "message": "Qui és propietari d'aquest element?"
+ },
+ "strong": {
+ "message": "Forta",
+ "description": "ex. A strong password. Scale: Weak -> Good -> Strong"
+ },
+ "good": {
+ "message": "Bona",
+ "description": "ex. A good password. Scale: Weak -> Good -> Strong"
+ },
+ "weak": {
+ "message": "Poc segura",
+ "description": "ex. A weak password. Scale: Weak -> Good -> Strong"
+ },
+ "weakMasterPassword": {
+ "message": "Contrasenya mestra poc segura"
+ },
+ "weakMasterPasswordDesc": {
+ "message": "La contrasenya mestra que heu triat és poc segura. Heu d'utilitzar una contrasenya mestra segura (o una frase de pas) per protegir correctament el vostre compte de Bitwarden. Esteu segur que voleu utilitzar aquesta contrasenya mestra?"
+ },
+ "pin": {
+ "message": "PIN",
+ "description": "PIN code. Ex. The short code (often numeric) that you use to unlock a device."
+ },
+ "unlockWithPin": {
+ "message": "Desbloqueja amb codi PIN"
+ },
+ "setYourPinCode": {
+ "message": "Configureu el vostre codi PIN per desbloquejar Bitwarden. La configuració del PIN es restablirà si tanqueu la sessió definitivament."
+ },
+ "pinRequired": {
+ "message": "Es necessita el codi PIN."
+ },
+ "invalidPin": {
+ "message": "El codi PIN no és vàlid."
+ },
+ "verifyPin": {
+ "message": "Verifica el PIN"
+ },
+ "yourVaultIsLockedPinCode": {
+ "message": "La caixa forta està bloquejada. Verifiqueu El codi PIN per continuar."
+ },
+ "unlockWithBiometrics": {
+ "message": "Desbloqueja amb biomètrica"
+ },
+ "awaitDesktop": {
+ "message": "S’espera confirmació des de l’escriptori"
+ },
+ "awaitDesktopDesc": {
+ "message": "Confirmeu que utilitzeu la biomètrica a l'aplicació Bitwarden Desktop per habilitar la biomètrica per al navegador."
+ },
+ "lockWithMasterPassOnRestart": {
+ "message": "Bloqueja amb la contrasenya mestra en reiniciar el navegador"
+ },
+ "selectOneCollection": {
+ "message": "Heu d'escollir com a mínim una col·lecció."
+ },
+ "cloneItem": {
+ "message": "Clona l'element"
+ },
+ "clone": {
+ "message": "Clona"
+ },
+ "passwordGeneratorPolicyInEffect": {
+ "message": "Una o més polítiques d’organització afecten la configuració del generador."
+ },
+ "vaultTimeoutAction": {
+ "message": "Acció del temps d'espera de la caixa forta"
+ },
+ "lock": {
+ "message": "Bloqueja",
+ "description": "Verb form: to make secure or inaccesible by"
+ },
+ "trash": {
+ "message": "Paperera",
+ "description": "Noun: a special folder to hold deleted items"
+ },
+ "searchTrash": {
+ "message": "Cerca a la paperera"
+ },
+ "permanentlyDeleteItem": {
+ "message": "Element suprimit definitivament"
+ },
+ "permanentlyDeleteItemConfirmation": {
+ "message": "Esteu segur que voleu suprimir aquest element definitivament?"
+ },
+ "permanentlyDeletedItem": {
+ "message": "Element suprimit definitivament"
+ },
+ "restoreItem": {
+ "message": "Restaura l'element"
+ },
+ "restoreItemConfirmation": {
+ "message": "Esteu segur que voleu restaurar aquest element?"
+ },
+ "restoredItem": {
+ "message": "Element restaurat"
+ },
+ "vaultTimeoutLogOutConfirmation": {
+ "message": "En tancar la sessió s'eliminarà tot l'accés a la vostra caixa forta i es requerirà una autenticació en línia després del període de temps d'espera. Esteu segur que voleu utilitzar aquesta configuració?"
+ },
+ "vaultTimeoutLogOutConfirmationTitle": {
+ "message": "Confirmació de l’acció de temps d'espera de la caixa forta"
+ },
+ "autoFillAndSave": {
+ "message": "Ompli automàticament i guarda"
+ },
+ "autoFillSuccessAndSavedUri": {
+ "message": "Element emplenat automàticament i URI guardat"
+ },
+ "autoFillSuccess": {
+ "message": "Element emplenat automàticament "
+ },
+ "setMasterPassword": {
+ "message": "Estableix la contrasenya mestra"
+ },
+ "masterPasswordPolicyInEffect": {
+ "message": "Una o més polítiques d’organització requereixen que la vostra contrasenya principal complisca els requisits següents:"
+ },
+ "policyInEffectMinComplexity": {
+ "message": "Puntuació mínima de complexitat de $SCORE$",
+ "placeholders": {
+ "score": {
+ "content": "$1",
+ "example": "4"
+ }
+ }
+ },
+ "policyInEffectMinLength": {
+ "message": "Longitud mínima de $LENGTH$",
+ "placeholders": {
+ "length": {
+ "content": "$1",
+ "example": "14"
+ }
+ }
+ },
+ "policyInEffectUppercase": {
+ "message": "Conté un o més caràcters en majúscula"
+ },
+ "policyInEffectLowercase": {
+ "message": "Conté un o més caràcters en minúscula"
+ },
+ "policyInEffectNumbers": {
+ "message": "Conté un o més números"
+ },
+ "policyInEffectSpecial": {
+ "message": "Conté un o més dels següents caràcters especials $CHARS$",
+ "placeholders": {
+ "chars": {
+ "content": "$1",
+ "example": "!@#$%^&*"
+ }
+ }
+ },
+ "masterPasswordPolicyRequirementsNotMet": {
+ "message": "La nova contrasenya principal no compleix els requisits de la política."
+ },
+ "acceptPolicies": {
+ "message": "Si activeu aquesta casella, indiqueu que esteu d’acord amb el següent:"
+ },
+ "acceptPoliciesError": {
+ "message": "No s’han reconegut les condicions del servei i la declaració de privadesa."
+ },
+ "termsOfService": {
+ "message": "Condicions del servei"
+ },
+ "privacyPolicy": {
+ "message": "Declaració de privadesa"
+ },
+ "hintEqualsPassword": {
+ "message": "El vostre suggeriment de contrasenya no pot ser el mateix que la vostra contrasenya."
+ },
+ "ok": {
+ "message": "D’acord"
+ },
+ "desktopSyncVerificationTitle": {
+ "message": "Verificació de sincronització d'escriptori"
+ },
+ "desktopIntegrationVerificationText": {
+ "message": "Verifiqueu que l'aplicació d'escriptori mostre aquesta empremta digital:"
+ },
+ "desktopIntegrationDisabledTitle": {
+ "message": "La integració en el navegador no està habilitada"
+ },
+ "desktopIntegrationDisabledDesc": {
+ "message": "La integració del navegador no està habilitada a l'aplicació Bitwarden Desktop. Activeu-la a la configuració de l'aplicació d'escriptori."
+ },
+ "startDesktopTitle": {
+ "message": "Inicia l'aplicació Bitwarden Desktop"
+ },
+ "startDesktopDesc": {
+ "message": "Per poder utilitzar aquesta funció, cal iniciar l'aplicació Bitwarden Desktop."
+ },
+ "errorEnableBiometricTitle": {
+ "message": "No es pot habilitar la biomètrica"
+ },
+ "errorEnableBiometricDesc": {
+ "message": "L'aplicació d'escriptori ha cancel·lat l'acció"
+ },
+ "nativeMessagingInvalidEncryptionDesc": {
+ "message": "L'aplicació d'escriptori ha invalidat el canal de comunicació segur. Torneu a provar aquesta operació"
+ },
+ "nativeMessagingInvalidEncryptionTitle": {
+ "message": "S'ha interromput la comunicació d'escriptori"
+ },
+ "nativeMessagingWrongUserDesc": {
+ "message": "L'aplicació d'escriptori està iniciada en un compte diferent. Assegureu-vos que totes dues aplicacions estiguen connectades al mateix compte."
+ },
+ "nativeMessagingWrongUserTitle": {
+ "message": "El compte no coincideix"
+ },
+ "biometricsNotEnabledTitle": {
+ "message": "La biomètrica no està habilitada"
+ },
+ "biometricsNotEnabledDesc": {
+ "message": "La biometria del navegador primer necessita habilitar la biomètrica d’escriptori a la configuració."
+ },
+ "biometricsNotSupportedTitle": {
+ "message": "La biomètrica no és compatible"
+ },
+ "biometricsNotSupportedDesc": {
+ "message": "La biometria del navegador no és compatible amb aquest dispositiu."
+ },
+ "nativeMessaginPermissionErrorTitle": {
+ "message": "No s'ha proporcionat el permís"
+ },
+ "nativeMessaginPermissionErrorDesc": {
+ "message": "Sense permís per comunicar-nos amb l’aplicació d’escriptori Bitwarden, no podem proporcionar dades biomètriques a l’extensió del navegador. Torneu-ho a provar."
+ },
+ "nativeMessaginPermissionSidebarTitle": {
+ "message": "Error de sol·licitud de permís"
+ },
+ "nativeMessaginPermissionSidebarDesc": {
+ "message": "Aquesta acció no es pot fer a la barra lateral, torneu-ho a provar a la finestra emergent o l'emergent."
+ },
+ "personalOwnershipSubmitError": {
+ "message": "A causa d'una política empresarial, no podeu guardar elements a la vostra caixa forta personal. Canvieu l'opció Propietat en organització i trieu entre les col·leccions disponibles."
+ },
+ "personalOwnershipPolicyInEffect": {
+ "message": "Una política d’organització afecta les vostres opcions de propietat."
+ },
+ "excludedDomains": {
+ "message": "Dominis exclosos"
+ },
+ "excludedDomainsDesc": {
+ "message": "Bitwarden no demanarà que es guarden les dades d’inici de sessió d’aquests dominis. Heu d'actualitzar la pàgina perquè els canvis tinguen efecte."
+ },
+ "excludedDomainsInvalidDomain": {
+ "message": "$DOMAIN$ no és un domini vàlid",
+ "placeholders": {
+ "domain": {
+ "content": "$1",
+ "example": "googlecom"
+ }
+ }
+ },
+ "send": {
+ "message": "Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "searchSends": {
+ "message": "Cerca Sends",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "addSend": {
+ "message": "Afig Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTypeText": {
+ "message": "Text"
+ },
+ "sendTypeFile": {
+ "message": "Fitxer"
+ },
+ "allSends": {
+ "message": "Tots els Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "maxAccessCountReached": {
+ "message": "S'ha assolit el recompte màxim d'accesos"
+ },
+ "expired": {
+ "message": "Caducat"
+ },
+ "pendingDeletion": {
+ "message": "Pendent de supressió"
+ },
+ "passwordProtected": {
+ "message": "Protegit amb contrasenya"
+ },
+ "copySendLink": {
+ "message": "Copia l'enllaç Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "removePassword": {
+ "message": "Suprimeix la contrasenya"
+ },
+ "delete": {
+ "message": "Suprimeix"
+ },
+ "removedPassword": {
+ "message": "Contrasenya suprimida"
+ },
+ "deletedSend": {
+ "message": "Send suprimit",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendLink": {
+ "message": "Enllaç Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "disabled": {
+ "message": "Deshabilitat"
+ },
+ "removePasswordConfirmation": {
+ "message": "Esteu segur que voleu suprimir la contrasenya?"
+ },
+ "deleteSend": {
+ "message": "Suprimeix el Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "deleteSendConfirmation": {
+ "message": "Esteu segur que voleu suprimir aquest Send?",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "editSend": {
+ "message": "Edita Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTypeHeader": {
+ "message": "Quin tipus de Send és aquest?",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendNameDesc": {
+ "message": "Un nom apropiat per descriure aquest Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendFileDesc": {
+ "message": "El fitxer que voleu enviar."
+ },
+ "deletionDate": {
+ "message": "Data de supressió"
+ },
+ "deletionDateDesc": {
+ "message": "L'enviament se suprimirà permanentment a la data i hora especificades.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "expirationDate": {
+ "message": "Data de caducitat"
+ },
+ "expirationDateDesc": {
+ "message": "Si s'estableix, l'accés a aquest enviament caducarà en la data i hora especificades.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "oneDay": {
+ "message": "1 dia"
+ },
+ "days": {
+ "message": "$DAYS$ dies",
+ "placeholders": {
+ "days": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "custom": {
+ "message": "Personalitzat"
+ },
+ "maximumAccessCount": {
+ "message": "Recompte màxim d'accessos"
+ },
+ "maximumAccessCountDesc": {
+ "message": "Si s’estableix, els usuaris ja no podran accedir a aquest Send una vegada s’assolisca el nombre màxim d’accessos.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendPasswordDesc": {
+ "message": "Opcionalment, necessiteu una contrasenya perquè els usuaris accedisquen a aquest Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendNotesDesc": {
+ "message": "Notes privades sobre aquest Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendDisableDesc": {
+ "message": "Desactiveu aquest Send perquè ningú no hi puga accedir.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendShareDesc": {
+ "message": "Copieu l'enllaç d'aquest Send al porta-retalls després de guardar-lo.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTextDesc": {
+ "message": "El text que voleu enviar."
+ },
+ "sendHideText": {
+ "message": "Amaga el text d'aquest Send per defecte.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "currentAccessCount": {
+ "message": "Recompte d’accessos actual"
+ },
+ "createSend": {
+ "message": "Crea un nou Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "newPassword": {
+ "message": "Contrasenya nova"
+ },
+ "sendDisabled": {
+ "message": "Send desactivat",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendDisabledWarning": {
+ "message": "A causa d'una política empresarial, només podeu suprimir un Send existent.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "createdSend": {
+ "message": "Send creat",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "editedSend": {
+ "message": "Send editat",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendLinuxChromiumFileWarning": {
+ "message": "Per triar un fitxer, obriu l'extensió a la barra lateral (si és possible) o eixiu a una finestra nova fent clic a aquest bàner."
+ },
+ "sendFirefoxFileWarning": {
+ "message": "Per triar un fitxer mitjançant Firefox, obriu l'extensió a la barra lateral o bé apareixerà a una finestra nova fent clic a aquest bàner."
+ },
+ "sendSafariFileWarning": {
+ "message": "Per triar un fitxer mitjançant Safari, eixiu a una finestra nova fent clic en aquest bàner."
+ },
+ "sendFileCalloutHeader": {
+ "message": "Abans de començar"
+ },
+ "sendFirefoxCustomDatePopoutMessage1": {
+ "message": "Per utilitzar un selector de dates d'estil calendari",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read '**To use a calendar style date picker ** click here to pop out your window.'"
+ },
+ "sendFirefoxCustomDatePopoutMessage2": {
+ "message": "feu clic ací",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker **click here** to pop out your window.'"
+ },
+ "sendFirefoxCustomDatePopoutMessage3": {
+ "message": "per eixir de la finestra.",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker click here **to pop out your window.**'"
+ },
+ "expirationDateIsInvalid": {
+ "message": "La data de caducitat proporcionada no és vàlida."
+ },
+ "deletionDateIsInvalid": {
+ "message": "La data de supressió proporcionada no és vàlida."
+ },
+ "expirationDateAndTimeRequired": {
+ "message": "Requereix una data i hora de caducitat."
+ },
+ "deletionDateAndTimeRequired": {
+ "message": "Requereix una data i hora de supressió."
+ },
+ "dateParsingError": {
+ "message": "S'ha produït un error en guardar les dates de supressió i caducitat."
+ },
+ "hideEmail": {
+ "message": "Amagueu la meua adreça de correu electrònic als destinataris."
+ },
+ "sendOptionsPolicyInEffect": {
+ "message": "Una o més polítiques d'organització afecten les vostres opcions del Send."
+ },
+ "passwordPrompt": {
+ "message": "Sol·licitud de la contrasenya mestra"
+ },
+ "passwordConfirmation": {
+ "message": "Confirmació de la contrasenya mestra"
+ },
+ "passwordConfirmationDesc": {
+ "message": "Aquesta acció està protegida. Per continuar, torneu a introduir la contrasenya principal per verificar la vostra identitat."
+ },
+ "emailVerificationRequired": {
+ "message": "Es requereix verificació del correu electrònic"
+ },
+ "emailVerificationRequiredDesc": {
+ "message": "Heu de verificar el correu electrònic per utilitzar aquesta característica. Podeu verificar el vostre correu electrònic a la caixa forta web."
+ },
+ "updatedMasterPassword": {
+ "message": "Updated Master Password"
+ },
+ "updateMasterPassword": {
+ "message": "Update Master Password"
+ },
+ "updateMasterPasswordWarning": {
+ "message": "Your Master Password was recently changed by an administrator in your organization. In order to access the vault, you must update it now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour."
+ },
+ "resetPasswordPolicyAutoEnroll": {
+ "message": "Automatic Enrollment"
+ },
+ "resetPasswordAutoEnrollInviteWarning": {
+ "message": "This organization has an enterprise policy that will automatically enroll you in password reset. Enrollment will allow organization administrators to change your master password."
+ },
+ "selectFolder": {
+ "message": "Select folder..."
+ },
+ "ssoCompleteRegistration": {
+ "message": "In order to complete logging in with SSO, please set a master password to access and protect your vault."
+ },
+ "hours": {
+ "message": "Hours"
+ },
+ "minutes": {
+ "message": "Minutes"
+ },
+ "vaultTimeoutPolicyInEffect": {
+ "message": "Your organization policies are affecting your vault timeout. Maximum allowed Vault Timeout is $HOURS$ hour(s) and $MINUTES$ minute(s)",
+ "placeholders": {
+ "hours": {
+ "content": "$1",
+ "example": "5"
+ },
+ "minutes": {
+ "content": "$2",
+ "example": "5"
+ }
+ }
+ },
+ "vaultTimeoutToLarge": {
+ "message": "Your vault timeout exceeds the restrictions set by your organization."
+ },
+ "vaultExportDisabled": {
+ "message": "Vault Export Disabled"
+ },
+ "personalVaultExportPolicyInEffect": {
+ "message": "One or more organization policies prevents you from exporting your personal vault."
+ },
+ "copyCustomFieldNameInvalidElement": {
+ "message": "Unable to identify a valid form element. Try inspecting the HTML instead."
+ },
+ "copyCustomFieldNameNotUnique": {
+ "message": "No unique identifier found."
+ }
+}
diff --git a/src/iOS.Safari/Resources/_locales/cs/messages.json b/src/iOS.Safari/Resources/_locales/cs/messages.json
new file mode 100644
index 000000000..616fb837b
--- /dev/null
+++ b/src/iOS.Safari/Resources/_locales/cs/messages.json
@@ -0,0 +1,1817 @@
+{
+ "appName": {
+ "message": "Bitwarden"
+ },
+ "extName": {
+ "message": "Bitwarden – Bezplatný správce hesel",
+ "description": "Extension name, MUST be less than 40 characters (Safari restriction)"
+ },
+ "extDesc": {
+ "message": "Bezpečný a bezplatný správce hesel pro všechna vaše zařízení.",
+ "description": "Extension description"
+ },
+ "loginOrCreateNewAccount": {
+ "message": "Pro přístup do vašeho bezpečného trezoru se přihlašte nebo si vytvořte nový účet."
+ },
+ "createAccount": {
+ "message": "Vytvořit účet"
+ },
+ "login": {
+ "message": "Přihlásit se"
+ },
+ "enterpriseSingleSignOn": {
+ "message": "Jednotné podnikové přihlášení"
+ },
+ "cancel": {
+ "message": "Zrušit"
+ },
+ "close": {
+ "message": "Zavřít"
+ },
+ "submit": {
+ "message": "Potvrdit"
+ },
+ "emailAddress": {
+ "message": "E-mailová adresa"
+ },
+ "masterPass": {
+ "message": "Hlavní heslo"
+ },
+ "masterPassDesc": {
+ "message": "Hlavní heslo je heslo, které používáte k přístupu do vašeho trezoru. Je velmi důležité, abyste jej nezapomněli. Neexistuje totiž žádný způsob, jak heslo obnovit v případě, že jste na něj zapomněli."
+ },
+ "masterPassHintDesc": {
+ "message": "Nápověda k hlavnímu heslu vám pomůže zapamatovat si heslo, pokud ho zapomenete."
+ },
+ "reTypeMasterPass": {
+ "message": "Znovu zadejte hlavní heslo"
+ },
+ "masterPassHint": {
+ "message": "Nápověda k hlavnímu heslu (volitelné)"
+ },
+ "tab": {
+ "message": "Karta"
+ },
+ "myVault": {
+ "message": "Můj trezor"
+ },
+ "tools": {
+ "message": "Nástroje"
+ },
+ "settings": {
+ "message": "Nastavení"
+ },
+ "currentTab": {
+ "message": "Aktuální karta"
+ },
+ "copyPassword": {
+ "message": "Kopírovat heslo"
+ },
+ "copyNote": {
+ "message": "Kopírovat poznámku"
+ },
+ "copyUri": {
+ "message": "Kopírovat URI"
+ },
+ "copyUsername": {
+ "message": "Kopírovat uživatelské jméno"
+ },
+ "copyNumber": {
+ "message": "Kopírovat číslo"
+ },
+ "copySecurityCode": {
+ "message": "Kopírovat bezpečnostní kód"
+ },
+ "autoFill": {
+ "message": "Automatické vyplnění"
+ },
+ "generatePasswordCopied": {
+ "message": "Vygenerovat heslo a zkopírovat do schránky"
+ },
+ "copyElementIdentifier": {
+ "message": "Kopírovat název vlastního pole"
+ },
+ "noMatchingLogins": {
+ "message": "Žádné odpovídající přihlašovací údaje."
+ },
+ "vaultLocked": {
+ "message": "Trezor je zamknutý."
+ },
+ "vaultLoggedOut": {
+ "message": "Byli jste odhlášeni."
+ },
+ "autoFillInfo": {
+ "message": "Pro aktuální stránku neexistují žádné přihlašovací údaje."
+ },
+ "addLogin": {
+ "message": "Přidat přihlašovací údaje"
+ },
+ "addItem": {
+ "message": "Přidat položku"
+ },
+ "passwordHint": {
+ "message": "Nápověda k heslu"
+ },
+ "enterEmailToGetHint": {
+ "message": "Zadejte e-mailovou adresu pro zaslání nápovědy k hlavnímu heslu."
+ },
+ "getMasterPasswordHint": {
+ "message": "Zaslat nápovědu k hlavnímu heslu"
+ },
+ "continue": {
+ "message": "Pokračovat"
+ },
+ "verificationCode": {
+ "message": "Ověřovací kód"
+ },
+ "account": {
+ "message": "Účet"
+ },
+ "changeMasterPassword": {
+ "message": "Změnit hlavní heslo"
+ },
+ "fingerprintPhrase": {
+ "message": "Fráze otisku prstu",
+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
+ },
+ "yourAccountsFingerprint": {
+ "message": "Fráze otisku prstu vašeho účtu",
+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
+ },
+ "twoStepLogin": {
+ "message": "Dvoufázové přihlášení"
+ },
+ "logOut": {
+ "message": "Odhlásit se"
+ },
+ "about": {
+ "message": "O rozšíření"
+ },
+ "version": {
+ "message": "Verze"
+ },
+ "save": {
+ "message": "Uložit"
+ },
+ "move": {
+ "message": "Přesunout"
+ },
+ "addFolder": {
+ "message": "Přidat složku"
+ },
+ "name": {
+ "message": "Název"
+ },
+ "editFolder": {
+ "message": "Upravit složku"
+ },
+ "deleteFolder": {
+ "message": "Smazat složku"
+ },
+ "folders": {
+ "message": "Složky"
+ },
+ "noFolders": {
+ "message": "Nejsou k dispozici žádné složky."
+ },
+ "helpFeedback": {
+ "message": "Nápověda a zpětná vazba"
+ },
+ "sync": {
+ "message": "Synchronizace"
+ },
+ "syncVaultNow": {
+ "message": "Synchronizovat nyní"
+ },
+ "lastSync": {
+ "message": "Poslední synchronizace:"
+ },
+ "passGen": {
+ "message": "Generátor hesla"
+ },
+ "generator": {
+ "message": "Generátor",
+ "description": "Short for 'Password Generator'."
+ },
+ "passGenInfo": {
+ "message": "Vygenerujte si silné a unikátní heslo pro přihlašovací údaje."
+ },
+ "bitWebVault": {
+ "message": "Webová aplikace"
+ },
+ "importItems": {
+ "message": "Importovat položky"
+ },
+ "select": {
+ "message": "Vybrat"
+ },
+ "generatePassword": {
+ "message": "Vygenerovat heslo"
+ },
+ "regeneratePassword": {
+ "message": "Vygenerovat další heslo"
+ },
+ "options": {
+ "message": "Možnosti"
+ },
+ "length": {
+ "message": "Délka"
+ },
+ "numWords": {
+ "message": "Počet slov"
+ },
+ "wordSeparator": {
+ "message": "Oddělovač slov"
+ },
+ "capitalize": {
+ "message": "Velká písmena na začátku slova",
+ "description": "Make the first letter of a work uppercase."
+ },
+ "includeNumber": {
+ "message": "Zahrnout číslo"
+ },
+ "minNumbers": {
+ "message": "Minimální počet čísel"
+ },
+ "minSpecial": {
+ "message": "Minimální počet speciálních znaků"
+ },
+ "avoidAmbChar": {
+ "message": "Nepoužít zaměnitelné znaky"
+ },
+ "searchVault": {
+ "message": "Vyhledat v trezoru"
+ },
+ "edit": {
+ "message": "Upravit"
+ },
+ "view": {
+ "message": "Zobrazit"
+ },
+ "noItemsInList": {
+ "message": "Žádné položky k zobrazení."
+ },
+ "itemInformation": {
+ "message": "Informace o položce"
+ },
+ "username": {
+ "message": "Uživatelské jméno"
+ },
+ "password": {
+ "message": "Heslo"
+ },
+ "passphrase": {
+ "message": "Heslová fráze"
+ },
+ "favorite": {
+ "message": "Oblíbené"
+ },
+ "notes": {
+ "message": "Poznámky"
+ },
+ "note": {
+ "message": "Poznámka"
+ },
+ "editItem": {
+ "message": "Upravit položku"
+ },
+ "folder": {
+ "message": "Složka"
+ },
+ "deleteItem": {
+ "message": "Smazat položku"
+ },
+ "viewItem": {
+ "message": "Zobrazit položku"
+ },
+ "launch": {
+ "message": "Spustit"
+ },
+ "website": {
+ "message": "Webová stránka"
+ },
+ "toggleVisibility": {
+ "message": "Přepnout viditelnost"
+ },
+ "manage": {
+ "message": "Správa"
+ },
+ "other": {
+ "message": "Ostatní"
+ },
+ "rateExtension": {
+ "message": "Ohodnotit rozšíření"
+ },
+ "rateExtensionDesc": {
+ "message": "Pomozte nám napsáním dobré recenze!"
+ },
+ "browserNotSupportClipboard": {
+ "message": "Váš webový prohlížeč nepodporuje automatické kopírování do schránky. Musíte ho zkopírovat ručně."
+ },
+ "verifyMasterPassword": {
+ "message": "Ověření hlavního hesla"
+ },
+ "yourVaultIsLocked": {
+ "message": "Váš trezor je uzamčen. Pro pokračování musíte zadat hlavní heslo."
+ },
+ "unlock": {
+ "message": "Odemknout"
+ },
+ "loggedInAsOn": {
+ "message": "Přihlášen jako $EMAIL$ na $HOSTNAME$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "name@example.com"
+ },
+ "hostname": {
+ "content": "$2",
+ "example": "bitwarden.com"
+ }
+ }
+ },
+ "invalidMasterPassword": {
+ "message": "Chybné hlavní heslo"
+ },
+ "vaultTimeout": {
+ "message": "Časový limit trezoru"
+ },
+ "lockNow": {
+ "message": "Zamknout nyní"
+ },
+ "immediately": {
+ "message": "Okamžitě"
+ },
+ "tenSeconds": {
+ "message": "10 sekund"
+ },
+ "twentySeconds": {
+ "message": "20 sekund"
+ },
+ "thirtySeconds": {
+ "message": "30 sekund"
+ },
+ "oneMinute": {
+ "message": "Po 1 minutě"
+ },
+ "twoMinutes": {
+ "message": "2 minuty"
+ },
+ "fiveMinutes": {
+ "message": "Po 5 minutách"
+ },
+ "fifteenMinutes": {
+ "message": "Po 15 minutách"
+ },
+ "thirtyMinutes": {
+ "message": "Po 30 minutách"
+ },
+ "oneHour": {
+ "message": "Po 1 hodině"
+ },
+ "fourHours": {
+ "message": "Po 4 hodinách"
+ },
+ "onLocked": {
+ "message": "Při uzamknutí systému"
+ },
+ "onRestart": {
+ "message": "Při restartu prohlížeče"
+ },
+ "never": {
+ "message": "Nikdy"
+ },
+ "security": {
+ "message": "Zabezpečení"
+ },
+ "errorOccurred": {
+ "message": "Došlo k chybě"
+ },
+ "emailRequired": {
+ "message": "E-mailová adresa je povinná."
+ },
+ "invalidEmail": {
+ "message": "Neplatná e-mailová adresa."
+ },
+ "masterPassRequired": {
+ "message": "Hlavní heslo je povinné."
+ },
+ "masterPassLength": {
+ "message": "Hlavní heslo musí obsahovat alespoň 8 znaků."
+ },
+ "masterPassDoesntMatch": {
+ "message": "Potvrzení hlavního hesla se neshoduje."
+ },
+ "newAccountCreated": {
+ "message": "Váš účet byl vytvořen! Můžete se přihlásit."
+ },
+ "masterPassSent": {
+ "message": "Poslali jsme vám e-mail s nápovědou k hlavnímu heslu."
+ },
+ "verificationCodeRequired": {
+ "message": "Ověřovací kód je povinný."
+ },
+ "valueCopied": {
+ "message": "Zkopírováno: $VALUE$",
+ "description": "Value has been copied to the clipboard.",
+ "placeholders": {
+ "value": {
+ "content": "$1",
+ "example": "Password"
+ }
+ }
+ },
+ "autofillError": {
+ "message": "Vybrané přihlašovací údaje nelze na této stránce automaticky vyplnit. Zkopírujte a vložte své přihlašovací údaje ručně."
+ },
+ "loggedOut": {
+ "message": "Odhlášení"
+ },
+ "loginExpired": {
+ "message": "Platnost přihlášení vypršela."
+ },
+ "logOutConfirmation": {
+ "message": "Opravdu se chcete odhlásit?"
+ },
+ "yes": {
+ "message": "Ano"
+ },
+ "no": {
+ "message": "Ne"
+ },
+ "unexpectedError": {
+ "message": "Došlo k neznámé chybě."
+ },
+ "nameRequired": {
+ "message": "Název je povinný."
+ },
+ "addedFolder": {
+ "message": "Složka byla přidána"
+ },
+ "changeMasterPass": {
+ "message": "Změnit hlavní heslo"
+ },
+ "changeMasterPasswordConfirmation": {
+ "message": "Hlavní heslo si můžete změnit na webové stránce bitwarden.com. Chcete tuto stránku nyní otevřít?"
+ },
+ "twoStepLoginConfirmation": {
+ "message": "Dvoufázové přihlášení činí váš účet mnohem bezpečnějším díky nutnosti po každém úspěšném přihlášení zadat ověřovací kód získaný z aplikace, SMS, e-mailu nebo telefonního hovoru. Dvoufázové přihlášení lze aktivovat na webové stránce bitwarden.com. Chcete tuto stránku nyní otevřít?"
+ },
+ "editedFolder": {
+ "message": "Složka byla upravena"
+ },
+ "deleteFolderConfirmation": {
+ "message": "Opravdu chcete tuto složku smazat?"
+ },
+ "deletedFolder": {
+ "message": "Složka byla smazána"
+ },
+ "gettingStartedTutorial": {
+ "message": "Průvodce pro začátečníky"
+ },
+ "gettingStartedTutorialVideo": {
+ "message": "Podívejte se na našeho průvodce pro začátečníky a zjistěte, jak používat naše rozšíření prohlížeče."
+ },
+ "syncingComplete": {
+ "message": "Synchronizace je dokončena"
+ },
+ "syncingFailed": {
+ "message": "Synchronizace selhala"
+ },
+ "passwordCopied": {
+ "message": "Heslo bylo zkopírováno"
+ },
+ "uri": {
+ "message": "URI"
+ },
+ "uriPosition": {
+ "message": "URI $POSITION$",
+ "description": "A listing of URIs. Ex: URI 1, URI 2, URI 3, etc.",
+ "placeholders": {
+ "position": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "newUri": {
+ "message": "Nová URI"
+ },
+ "addedItem": {
+ "message": "Položka byla přidána"
+ },
+ "editedItem": {
+ "message": "Položka byla upravena"
+ },
+ "deleteItemConfirmation": {
+ "message": "Opravdu chcete položku přesunout do koše?"
+ },
+ "deletedItem": {
+ "message": "Položka byla přesunuta do koše"
+ },
+ "overwritePassword": {
+ "message": "Přepsat heslo"
+ },
+ "overwritePasswordConfirmation": {
+ "message": "Opravdu chcete přepsat aktuální heslo?"
+ },
+ "searchFolder": {
+ "message": "Vyhledat ve složce"
+ },
+ "searchCollection": {
+ "message": "Vyledat v kolekci"
+ },
+ "searchType": {
+ "message": "Typ hledání"
+ },
+ "noneFolder": {
+ "message": "Žádná složka",
+ "description": "This is the folder for uncategorized items"
+ },
+ "disableAddLoginNotification": {
+ "message": "Vypnout oznámení Přidat přihlašovací údaje"
+ },
+ "addLoginNotificationDesc": {
+ "message": "Oznámení „Přidat přihlašovací údaje“ automaticky vyzve k uložení přihlašovacích údajů do trezoru, pokud se s nimi přihlašujete poprvé."
+ },
+ "dontShowCardsCurrentTab": {
+ "message": "Nezobrazovat karty na stránce Karta"
+ },
+ "dontShowCardsCurrentTabDesc": {
+ "message": "Položky karet jsou zobrazovány na stránce „Karta“ pro usnadnění automatického vyplňování."
+ },
+ "dontShowIdentitiesCurrentTab": {
+ "message": "Nezobrazovat identity na stránce Karta"
+ },
+ "dontShowIdentitiesCurrentTabDesc": {
+ "message": "Položky identit jsou zobrazovány na stránce „Karta“ pro usnadnění automatického vyplňování."
+ },
+ "clearClipboard": {
+ "message": "Vyčistit schránku",
+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
+ },
+ "clearClipboardDesc": {
+ "message": "Automaticky vymazat zkopírované hodnoty z vaší schránky.",
+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
+ },
+ "notificationAddDesc": {
+ "message": "Má si pro vás Bitwarden toto heslo pamatovat?"
+ },
+ "notificationAddSave": {
+ "message": "Ano, uložit nyní"
+ },
+ "notificationNeverSave": {
+ "message": "Nikdy pro tuto stránku"
+ },
+ "disableChangedPasswordNotification": {
+ "message": "Vypnout oznámení o změněném heslu"
+ },
+ "disableChangedPasswordNotificationDesc": {
+ "message": "„Oznámení o změněném heslu“ vás automaticky požádá o potvrzení uložení aktualizovaného hesla v případě, že aplikace rozpozná vámi provedenou změnu hesla na webu."
+ },
+ "notificationChangeDesc": {
+ "message": "Chcete aktualizovat toto heslo v Bitwarden?"
+ },
+ "notificationChangeSave": {
+ "message": "Ano, aktualizovat"
+ },
+ "disableContextMenuItem": {
+ "message": "Vypnout kontextové menu"
+ },
+ "disableContextMenuItemDesc": {
+ "message": "Kontextové menu poskytuje rychlý přístup k automatickému vyplnění, zkopírování nebo vygenerování přihlašovacích údajů pro aktuální stránku."
+ },
+ "defaultUriMatchDetection": {
+ "message": "Výchozí zjišťování shody URI",
+ "description": "Default URI match detection for auto-fill."
+ },
+ "defaultUriMatchDetectionDesc": {
+ "message": "Vyberte výchozí způsob, jakým se detekuje shoda URI přihlašovacích údajů. Používá se například pro automatické vyplňování."
+ },
+ "theme": {
+ "message": "Motiv"
+ },
+ "themeDesc": {
+ "message": "Změna barevného motivu aplikace."
+ },
+ "dark": {
+ "message": "Tmavý",
+ "description": "Dark color"
+ },
+ "light": {
+ "message": "Světlý",
+ "description": "Light color"
+ },
+ "solarizedDark": {
+ "message": "Tmavý – Solarized",
+ "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated."
+ },
+ "exportVault": {
+ "message": "Exportovat trezor"
+ },
+ "fileFormat": {
+ "message": "Formát souboru"
+ },
+ "warning": {
+ "message": "VAROVÁNÍ",
+ "description": "WARNING (should stay in capitalized letters if the language permits)"
+ },
+ "confirmVaultExport": {
+ "message": "Potvrdit export trezoru"
+ },
+ "exportWarningDesc": {
+ "message": "Tento export obsahuje data vašeho trezoru v nezašifrovaném formátu. Soubor exportu byste neměli ukládat ani odesílat přes nezabezpečené kanály (např. e-mailem). Odstraňte jej okamžitě po jeho použití."
+ },
+ "encExportKeyWarningDesc": {
+ "message": "Tento export zašifruje vaše data pomocí šifrovacího klíče vašeho účtu. Pokud někdy změníte šifrovací klíč vašeho účtu, měli by jste vyexportovat data znovu, protože tento exportovaný soubor nebudete moci dešifrovat."
+ },
+ "encExportAccountWarningDesc": {
+ "message": "Šifrovací klíče účtu jsou pro každý uživatelský účet Bitwarden jedinečné, takže nelze importovat šifrovaný export do jiného účtu."
+ },
+ "exportMasterPassword": {
+ "message": "Zadejte své hlavní heslo pro export dat."
+ },
+ "shared": {
+ "message": "Sdílené"
+ },
+ "learnOrg": {
+ "message": "Zjistěte více o organizacích"
+ },
+ "learnOrgConfirmation": {
+ "message": "Bitwarden umožňuje sdílet vaše položky v trezoru s ostatními prostřednictvím organizace. Chcete přejít na bitwarden.com a dozvědět se více?"
+ },
+ "moveToOrganization": {
+ "message": "Přesunout do organizace"
+ },
+ "share": {
+ "message": "Sdílet"
+ },
+ "movedItemToOrg": {
+ "message": "$ITEMNAME$ přesunut do $ORGNAME$",
+ "placeholders": {
+ "itemname": {
+ "content": "$1",
+ "example": "Secret Item"
+ },
+ "orgname": {
+ "content": "$2",
+ "example": "Company Name"
+ }
+ }
+ },
+ "moveToOrgDesc": {
+ "message": "Vyberte organizaci, do které chcete tuto položku přesunout. Přesun do organizace převede vlastnictví položky této organizaci. Po přesunutí této položky již nebudete přímým vlastníkem této položky."
+ },
+ "learnMore": {
+ "message": "Dozvědět se více"
+ },
+ "authenticatorKeyTotp": {
+ "message": "Autentizační klíč (TOTP)"
+ },
+ "verificationCodeTotp": {
+ "message": "Ověřovací kód (TOTP)"
+ },
+ "copyVerificationCode": {
+ "message": "Zkopírovat ověřovací kód"
+ },
+ "attachments": {
+ "message": "Přílohy"
+ },
+ "deleteAttachment": {
+ "message": "Smazat přílohu"
+ },
+ "deleteAttachmentConfirmation": {
+ "message": "Opravdu chcete tuto přílohu smazat?"
+ },
+ "deletedAttachment": {
+ "message": "Příloha byla smazána"
+ },
+ "newAttachment": {
+ "message": "Přidat přílohu"
+ },
+ "noAttachments": {
+ "message": "Žádné přílohy."
+ },
+ "attachmentSaved": {
+ "message": "Příloha byla uložena"
+ },
+ "file": {
+ "message": "Soubor"
+ },
+ "selectFile": {
+ "message": "Vybrat soubor."
+ },
+ "maxFileSize": {
+ "message": "Maximální velikost souboru je 500 MB."
+ },
+ "featureUnavailable": {
+ "message": "Funkce není dostupná"
+ },
+ "updateKey": {
+ "message": "Tuto funkci nemůžete použít dokud neaktualizujete svůj šifrovací klíč."
+ },
+ "premiumMembership": {
+ "message": "Prémiové členství"
+ },
+ "premiumManage": {
+ "message": "Spravovat členství"
+ },
+ "premiumManageAlert": {
+ "message": "Své členství můžete spravovat na webové stránce bitwarden.com. Chcete tuto stránku nyní otevřít?"
+ },
+ "premiumRefresh": {
+ "message": "Obnovit členství"
+ },
+ "premiumNotCurrentMember": {
+ "message": "Momentálně nejste prémiovým členem."
+ },
+ "premiumSignUpAndGet": {
+ "message": "Přihlaste se k prémiovému členství a získejte:"
+ },
+ "ppremiumSignUpStorage": {
+ "message": "1 GB šifrovaného úložiště pro přílohy."
+ },
+ "ppremiumSignUpTwoStep": {
+ "message": "Další možnosti dvoufázového přihlášení, jako je například YubiKey, FIDO U2F a Duo."
+ },
+ "ppremiumSignUpReports": {
+ "message": "Reporty o hygieně vašich hesel, zdraví účtu a narušeních bezpečnosti."
+ },
+ "ppremiumSignUpTotp": {
+ "message": "Generátor TOTP kódu dvoufázového přihlašování (2FA) pro přihlašovací údaje ve vašem trezoru."
+ },
+ "ppremiumSignUpSupport": {
+ "message": "Prioritní zákaznickou podporu."
+ },
+ "ppremiumSignUpFuture": {
+ "message": "Všechny budoucí prémiové funkce. Více již brzy!"
+ },
+ "premiumPurchase": {
+ "message": "Zakoupit prémiové členství"
+ },
+ "premiumPurchaseAlert": {
+ "message": "Prémiové členství můžete zakoupit na webové stránce bitwarden.com. Chcete tuto stránku nyní otevřít?"
+ },
+ "premiumCurrentMember": {
+ "message": "Jste prémiovým členem!"
+ },
+ "premiumCurrentMemberThanks": {
+ "message": "Děkujeme za podporu Bitwarden."
+ },
+ "premiumPrice": {
+ "message": "Vše jen za %price% ročně!",
+ "placeholders": {
+ "price": {
+ "content": "$1",
+ "example": "$10"
+ }
+ }
+ },
+ "refreshComplete": {
+ "message": "Obnova je dokončena"
+ },
+ "disableAutoTotpCopy": {
+ "message": "Vypnout automatické kopírování kódu TOTP"
+ },
+ "disableAutoTotpCopyDesc": {
+ "message": "Pokud mají vaše přihlašovací údaje přidán autentizační klíč pro TOTP, vygenerovaný ověřovací kód (TOTP) se automaticky zkopíruje do schránky při každém automatickém vyplnění přihlašovacích údajů."
+ },
+ "disableAutoBiometricsPrompt": {
+ "message": "Neptat se na biometriku při spuštění."
+ },
+ "premiumRequired": {
+ "message": "Vyžaduje prémiové členství"
+ },
+ "premiumRequiredDesc": {
+ "message": "Pro použití této funkce je potřebné prémiové členství."
+ },
+ "enterVerificationCodeApp": {
+ "message": "Zadejte 6místný kód z ověřovací aplikace."
+ },
+ "enterVerificationCodeEmail": {
+ "message": "Zadejte 6místný kód z e-mailu, který byl zaslán na $EMAIL$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "example@gmail.com"
+ }
+ }
+ },
+ "verificationCodeEmailSent": {
+ "message": "Ověřovací e-mail byl zaslán na $EMAIL$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "example@gmail.com"
+ }
+ }
+ },
+ "rememberMe": {
+ "message": "Pamatuj si mě"
+ },
+ "sendVerificationCodeEmailAgain": {
+ "message": "Znovu zaslat ověřovací kód na e-mail"
+ },
+ "useAnotherTwoStepMethod": {
+ "message": "Použít jinou metodu dvoufázového přihlášení"
+ },
+ "insertYubiKey": {
+ "message": "Vložte YubiKey do USB portu vašeho počítače a stiskněte jeho tlačítko."
+ },
+ "insertU2f": {
+ "message": "Vložte svůj bezpečnostní klíč do USB portu vašeho počítače a pokud má tlačítko, tak jej stiskněte."
+ },
+ "webAuthnNewTab": {
+ "message": "Pokračujte v ověřování WebAuthn 2FA na nové kartě."
+ },
+ "webAuthnNewTabOpen": {
+ "message": "Otevřít novou kartu"
+ },
+ "webAuthnAuthenticate": {
+ "message": "Ověřit WebAuthn"
+ },
+ "loginUnavailable": {
+ "message": "Přihlášení není dostupné"
+ },
+ "noTwoStepProviders": {
+ "message": "Tento účet má zapnuté dvoufázové ověřování, ale žádný z nastavených poskytovalů dvoufázového přihlášení není v tomto prohlížeči podporován."
+ },
+ "noTwoStepProviders2": {
+ "message": "Použijte prosím podporovaný webový prohlížeč (například Chrome) a přidejte další poskytovatele, kteří lépe podporují více různých webových prohlížečích (jako například ověřovací aplikace)."
+ },
+ "twoStepOptions": {
+ "message": "Možnosti dvoufázového přihlášení"
+ },
+ "recoveryCodeDesc": {
+ "message": "Ztratili jste přístup ke všem nastaveným poskytovatelům dvoufázového přihlášení? Použijte obnovovací kód pro vypnutí dvoufázového přihlášení."
+ },
+ "recoveryCodeTitle": {
+ "message": "Kód pro obnovení"
+ },
+ "authenticatorAppTitle": {
+ "message": "Ověřovací aplikace"
+ },
+ "authenticatorAppDesc": {
+ "message": "Použijte ověřovací aplikaci (jako je Authy nebo Google Authenticator) pro generování časově omezených kódů.",
+ "description": "'Authy' and 'Google Authenticator' are product names and should not be translated."
+ },
+ "yubiKeyTitle": {
+ "message": "YubiKey OTP bezpečnostní klíč"
+ },
+ "yubiKeyDesc": {
+ "message": "Použít YubiKey pro přístup k vašemu trezoru. Podporuje YubiKey 4, 4 Nano, 4C a NEO zařízení."
+ },
+ "duoDesc": {
+ "message": "Ověřit pomocí Duo Security prostřednictvím aplikace Duo Mobile, SMS, telefonního hovoru nebo U2F bezpečnostního kódu.",
+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
+ },
+ "duoOrganizationDesc": {
+ "message": "Ověřit pomocí Duo Security pro vaši organizaci prostřednictvím aplikace Duo Mobile, SMS, telefonního hovoru nebo U2F bezpečnostního kódu.",
+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
+ },
+ "webAuthnTitle": {
+ "message": "FIDO2 WebAuthn"
+ },
+ "webAuthnDesc": {
+ "message": "Použijte jakýkoliv WebAuthn bezpečnostní klíč pro přístup k vašemu účtu."
+ },
+ "emailTitle": {
+ "message": "E-mail"
+ },
+ "emailDesc": {
+ "message": "Ověřovací kódy vám budou zaslány e-mailem."
+ },
+ "selfHostedEnvironment": {
+ "message": "Vlastnoručně hostované prostředí"
+ },
+ "selfHostedEnvironmentFooter": {
+ "message": "Zadejte základní URL adresu vlastnoručně hostované aplikace Bitwarden."
+ },
+ "customEnvironment": {
+ "message": "Vlastní prostředí"
+ },
+ "customEnvironmentFooter": {
+ "message": "Pro pokročilé uživatele. Můžete zadat základní URL adresu každé služby zvlášť."
+ },
+ "baseUrl": {
+ "message": "URL serveru"
+ },
+ "apiUrl": {
+ "message": "URL serveru API"
+ },
+ "webVaultUrl": {
+ "message": "URL serveru webového trezoru"
+ },
+ "identityUrl": {
+ "message": "URL serveru identity"
+ },
+ "notificationsUrl": {
+ "message": "URL serveru pro oznámení"
+ },
+ "iconsUrl": {
+ "message": "URL serveru ikonek"
+ },
+ "environmentSaved": {
+ "message": "URL adresy vlastního prostředí byly uloženy"
+ },
+ "enableAutoFillOnPageLoad": {
+ "message": "Automaticky vyplnit údaje při načtení stránky"
+ },
+ "enableAutoFillOnPageLoadDesc": {
+ "message": "Pokud je zjištěn přihlašovací formulář, automaticky se při načítání webové stránky vyplní přihlašovací údaje."
+ },
+ "experimentalFeature": {
+ "message": "Toto je momentálně experimentální funkce. Použijte na vlastní riziko."
+ },
+ "defaultAutoFillOnPageLoad": {
+ "message": "Výchozí nastavení automatického vyplňování pro položky přihlášení"
+ },
+ "defaultAutoFillOnPageLoadDesc": {
+ "message": "Po povolení automatického vyplňování při načtení stránky můžete tuto funkci povolit nebo zakázat pro jednotlivé položky přihlášení. Toto je výchozí nastavení pro položky přihlášení, které nejsou samostatně konfigurovány."
+ },
+ "itemAutoFillOnPageLoad": {
+ "message": "Automatické vyplnění při načtení stránky (pokud je povoleno v nastavení)"
+ },
+ "autoFillOnPageLoadUseDefault": {
+ "message": "Použít výchozí nastavení"
+ },
+ "autoFillOnPageLoadYes": {
+ "message": "Automatické vyplnění při načtení stránky"
+ },
+ "autoFillOnPageLoadNo": {
+ "message": "Nevyplňovat automaticky při načtení stránky"
+ },
+ "commandOpenPopup": {
+ "message": "Otevřít vyskakovací okno trezoru"
+ },
+ "commandOpenSidebar": {
+ "message": "Otevřít trezor v postranním panelu"
+ },
+ "commandAutofillDesc": {
+ "message": "Automaticky vyplnit poslední použité přihlašovací údaje pro tuto stránku."
+ },
+ "commandGeneratePasswordDesc": {
+ "message": "Vygenerovat a zkopírovat nové náhodné heslo do schránky."
+ },
+ "commandLockVaultDesc": {
+ "message": "Zamknout trezor"
+ },
+ "privateModeMessage": {
+ "message": "Bohužel toto okno není v tomto prohlížeči k dispozici v soukromém režimu."
+ },
+ "customFields": {
+ "message": "Vlastní pole"
+ },
+ "copyValue": {
+ "message": "Zkopírovat hodnotu"
+ },
+ "value": {
+ "message": "Hodnota"
+ },
+ "newCustomField": {
+ "message": "Nové vlastní pole"
+ },
+ "dragToSort": {
+ "message": "Přetáhnutím seřadíte"
+ },
+ "cfTypeText": {
+ "message": "Text"
+ },
+ "cfTypeHidden": {
+ "message": "Skryté"
+ },
+ "cfTypeBoolean": {
+ "message": "Ano/Ne"
+ },
+ "popup2faCloseMessage": {
+ "message": "Klepnutím mimo vyskakovací okno při zjišťování ověřovacího kódu zaslaného na e-mail bude vyskakovací okno zavřeno. Chcete otevřít toto vyskakovací okno v novém okně, aby se nezavřelo?"
+ },
+ "popupU2fCloseMessage": {
+ "message": "Tento prohlížeč nemůže zpracovat U2F požadavky ve vyskakovacím okně. Chcete otevřít toto vyskakovací okno v novém okně, abyste se mohli přihlásit pomocí U2F?"
+ },
+ "disableFavicon": {
+ "message": "Vypnout ikonky webových stránek"
+ },
+ "disableFaviconDesc": {
+ "message": "Ikonky webových stránek zobrazí snadno rozeznatelný obrázek vedle každé položky ve vašem trezoru."
+ },
+ "disableBadgeCounter": {
+ "message": "Nezobrazovat počet přihlašovacích údajů"
+ },
+ "disableBadgeCounterDesc": {
+ "message": "Počítadlo zobrazuje, kolik přihlašovacích údajů máte pro aktuální stránku ve svém trezoru."
+ },
+ "cardholderName": {
+ "message": "Jméno držitele karty"
+ },
+ "number": {
+ "message": "Číslo"
+ },
+ "brand": {
+ "message": "Značka"
+ },
+ "expirationMonth": {
+ "message": "Měsíc expirace"
+ },
+ "expirationYear": {
+ "message": "Rok expirace"
+ },
+ "expiration": {
+ "message": "Expirace"
+ },
+ "january": {
+ "message": "Leden"
+ },
+ "february": {
+ "message": "Únor"
+ },
+ "march": {
+ "message": "Březen"
+ },
+ "april": {
+ "message": "Duben"
+ },
+ "may": {
+ "message": "Květen"
+ },
+ "june": {
+ "message": "Červen"
+ },
+ "july": {
+ "message": "Červenec"
+ },
+ "august": {
+ "message": "Srpen"
+ },
+ "september": {
+ "message": "Září"
+ },
+ "october": {
+ "message": "Říjen"
+ },
+ "november": {
+ "message": "Listopad"
+ },
+ "december": {
+ "message": "Prosinec"
+ },
+ "securityCode": {
+ "message": "Bezpečnostní kód"
+ },
+ "ex": {
+ "message": "např."
+ },
+ "title": {
+ "message": "Oslovení"
+ },
+ "mr": {
+ "message": "Pan"
+ },
+ "mrs": {
+ "message": "Paní"
+ },
+ "ms": {
+ "message": "Slečna"
+ },
+ "dr": {
+ "message": "MUDr"
+ },
+ "firstName": {
+ "message": "Jméno"
+ },
+ "middleName": {
+ "message": "Druhé jméno"
+ },
+ "lastName": {
+ "message": "Příjmení"
+ },
+ "identityName": {
+ "message": "Název identity"
+ },
+ "company": {
+ "message": "Firma"
+ },
+ "ssn": {
+ "message": "Číslo sociálního pojištění"
+ },
+ "passportNumber": {
+ "message": "Číslo cestovního pasu"
+ },
+ "licenseNumber": {
+ "message": "Číslo dokladu totožnosti"
+ },
+ "email": {
+ "message": "E-mail"
+ },
+ "phone": {
+ "message": "Telefon"
+ },
+ "address": {
+ "message": "Adresa"
+ },
+ "address1": {
+ "message": "Adresa 1"
+ },
+ "address2": {
+ "message": "Adresa 2"
+ },
+ "address3": {
+ "message": "Adresa 3"
+ },
+ "cityTown": {
+ "message": "Město"
+ },
+ "stateProvince": {
+ "message": "Kraj / Provincie"
+ },
+ "zipPostalCode": {
+ "message": "PSČ"
+ },
+ "country": {
+ "message": "Stát"
+ },
+ "type": {
+ "message": "Typ"
+ },
+ "typeLogin": {
+ "message": "Přihlašovací údaje"
+ },
+ "typeLogins": {
+ "message": "Přihlašovací údaje"
+ },
+ "typeSecureNote": {
+ "message": "Poznámka"
+ },
+ "typeCard": {
+ "message": "Karta"
+ },
+ "typeIdentity": {
+ "message": "Identita"
+ },
+ "passwordHistory": {
+ "message": "Historie hesel"
+ },
+ "back": {
+ "message": "Zpět"
+ },
+ "collections": {
+ "message": "Kolekce"
+ },
+ "favorites": {
+ "message": "Oblíbené"
+ },
+ "popOutNewWindow": {
+ "message": "Otevřít v novém okně"
+ },
+ "refresh": {
+ "message": "Obnovit"
+ },
+ "cards": {
+ "message": "Karty"
+ },
+ "identities": {
+ "message": "Identity"
+ },
+ "logins": {
+ "message": "Přihlašovací údaje"
+ },
+ "secureNotes": {
+ "message": "Poznámky"
+ },
+ "clear": {
+ "message": "Vymazat",
+ "description": "To clear something out. example: To clear browser history."
+ },
+ "checkPassword": {
+ "message": "Zkontrolujte, zda nedošlo k úniku hesla."
+ },
+ "passwordExposed": {
+ "message": "K úniku tohoto hesla došlo celkem $VALUE$x. Měli byste jej změnit.",
+ "placeholders": {
+ "value": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "passwordSafe": {
+ "message": " V žádném ze známých případů nedošlo k úniku tohoto hesla. Mělo by být bezpečné používat jej i nadále."
+ },
+ "baseDomain": {
+ "message": "Základní doména"
+ },
+ "host": {
+ "message": "Host",
+ "description": "A URL's host value. For example, the host of https://sub.domain.com:443 is 'sub.domain.com:443'."
+ },
+ "exact": {
+ "message": "Přesně"
+ },
+ "startsWith": {
+ "message": "Začíná na"
+ },
+ "regEx": {
+ "message": "Regulární výraz",
+ "description": "A programming term, also known as 'RegEx'."
+ },
+ "matchDetection": {
+ "message": "Zjišťování shody",
+ "description": "URI match detection for auto-fill."
+ },
+ "defaultMatchDetection": {
+ "message": "Výchozí",
+ "description": "Default URI match detection for auto-fill."
+ },
+ "toggleOptions": {
+ "message": "Přepnout možnosti"
+ },
+ "toggleCurrentUris": {
+ "message": "Přepnout zobrazení aktuálních URI",
+ "description": "Toggle the display of the URIs of the currently open tabs in the browser."
+ },
+ "currentUri": {
+ "message": "Aktuální URI",
+ "description": "The URI of one of the current open tabs in the browser."
+ },
+ "organization": {
+ "message": "Organizace",
+ "description": "An entity of multiple related people (ex. a team or business organization)."
+ },
+ "types": {
+ "message": "Typy"
+ },
+ "allItems": {
+ "message": "Všechny položky"
+ },
+ "noPasswordsInList": {
+ "message": "Nejsou k dispozici žádná hesla."
+ },
+ "remove": {
+ "message": "Smazat"
+ },
+ "default": {
+ "message": "Výchozí"
+ },
+ "dateUpdated": {
+ "message": "Změněno",
+ "description": "ex. Date this item was updated"
+ },
+ "datePasswordUpdated": {
+ "message": "Heslo bylo změněno",
+ "description": "ex. Date this password was updated"
+ },
+ "neverLockWarning": {
+ "message": "Opravdu chcete použít možnost „Nikdy“? Nastavením možností uzamčení na „Nikdy“ bude šifrovací klíč k trezoru uložen přímo ve vašem zařízení. Pokud tuto možnost použijete, měli byste vaše zařízení řádně zabezpečit a chránit."
+ },
+ "noOrganizationsList": {
+ "message": "Nepatříte do žádné organizace. Organizace umožňují bezpečné sdílení položek s ostatními uživateli."
+ },
+ "noCollectionsInList": {
+ "message": "Žádné kolekce k zobrazení."
+ },
+ "ownership": {
+ "message": "Vlastnictví"
+ },
+ "whoOwnsThisItem": {
+ "message": "Kdo vlastní tuto položku?"
+ },
+ "strong": {
+ "message": "Silné",
+ "description": "ex. A strong password. Scale: Weak -> Good -> Strong"
+ },
+ "good": {
+ "message": "Dobré",
+ "description": "ex. A good password. Scale: Weak -> Good -> Strong"
+ },
+ "weak": {
+ "message": "Slabé",
+ "description": "ex. A weak password. Scale: Weak -> Good -> Strong"
+ },
+ "weakMasterPassword": {
+ "message": "Slabé hlavní heslo"
+ },
+ "weakMasterPasswordDesc": {
+ "message": "Zvolené hlavní heslo je slabé. Pro správnou ochranu účtu Bitwarden byste měli použít silné hlavní heslo (nebo heslovou frázi). Opravdu chcete toto heslo použít?"
+ },
+ "pin": {
+ "message": "PIN",
+ "description": "PIN code. Ex. The short code (often numeric) that you use to unlock a device."
+ },
+ "unlockWithPin": {
+ "message": "Odemknout pomocí PIN"
+ },
+ "setYourPinCode": {
+ "message": "Nastavte svůj PIN kód pro odemknutí trezoru. Pokud se zcela odhlásíte z aplikace bude váš současný PIN bude resetován."
+ },
+ "pinRequired": {
+ "message": "PIN kód je vyžadován."
+ },
+ "invalidPin": {
+ "message": "Neplatný PIN kód."
+ },
+ "verifyPin": {
+ "message": "Ověřit PIN"
+ },
+ "yourVaultIsLockedPinCode": {
+ "message": "Váš trezor je uzamčen. Pro pokračování musíte zadat PIN."
+ },
+ "unlockWithBiometrics": {
+ "message": "Odemknout pomocí biometrie"
+ },
+ "awaitDesktop": {
+ "message": "Čeká se na potvrzení z aplikace v počítači"
+ },
+ "awaitDesktopDesc": {
+ "message": "Prosím potvrďte použití biometrie v desktopové Bitwarden aplikaci, pro povolení biometrie v prohlížeči."
+ },
+ "lockWithMasterPassOnRestart": {
+ "message": "Zamknout trezor při restartu prohlížeče pomocí hlavního hesla"
+ },
+ "selectOneCollection": {
+ "message": "Musíte vybrat alespoň jednu kolekci."
+ },
+ "cloneItem": {
+ "message": "Duplikovat položku"
+ },
+ "clone": {
+ "message": "Duplikovat"
+ },
+ "passwordGeneratorPolicyInEffect": {
+ "message": "Jedna nebo více zásad organizace ovlivňují nastavení generátoru."
+ },
+ "vaultTimeoutAction": {
+ "message": "Akce při vypršení časového limitu"
+ },
+ "lock": {
+ "message": "Zamknout",
+ "description": "Verb form: to make secure or inaccesible by"
+ },
+ "trash": {
+ "message": "Koš",
+ "description": "Noun: a special folder to hold deleted items"
+ },
+ "searchTrash": {
+ "message": "Hledat v koši"
+ },
+ "permanentlyDeleteItem": {
+ "message": "Trvale smazat položku"
+ },
+ "permanentlyDeleteItemConfirmation": {
+ "message": "Opravdu chcete tuto položku trvale smazat?"
+ },
+ "permanentlyDeletedItem": {
+ "message": "Položka byla trvale smazána"
+ },
+ "restoreItem": {
+ "message": "Obnovit položku"
+ },
+ "restoreItemConfirmation": {
+ "message": "Opravdu chcete tuto položku obnovit?"
+ },
+ "restoredItem": {
+ "message": "Položka byla obnovena"
+ },
+ "vaultTimeoutLogOutConfirmation": {
+ "message": "Po vypršení časového limitu dojde k odhlášení. Přístup k trezoru bude odebrán a pro opětovné přihlášení bude vyžadováno online ověření. Opravdu chcete použít toto nastavení?"
+ },
+ "vaultTimeoutLogOutConfirmationTitle": {
+ "message": "Potvrzení akce při vypršení časového limitu"
+ },
+ "autoFillAndSave": {
+ "message": "Automaticky vyplnit a uložit"
+ },
+ "autoFillSuccessAndSavedUri": {
+ "message": "Položka byla automaticky vyplněna a uloženo URI"
+ },
+ "autoFillSuccess": {
+ "message": "Položka byla automaticky vyplněna"
+ },
+ "setMasterPassword": {
+ "message": "Nastavit hlavní heslo"
+ },
+ "masterPasswordPolicyInEffect": {
+ "message": "Jedna nebo více zásad organizace vyžaduje, aby hlavní heslo splňovalo následující požadavky:"
+ },
+ "policyInEffectMinComplexity": {
+ "message": "Minimální skóre složitosti $SCORE$",
+ "placeholders": {
+ "score": {
+ "content": "$1",
+ "example": "4"
+ }
+ }
+ },
+ "policyInEffectMinLength": {
+ "message": "Minimální délka $LENGTH$",
+ "placeholders": {
+ "length": {
+ "content": "$1",
+ "example": "14"
+ }
+ }
+ },
+ "policyInEffectUppercase": {
+ "message": "Obsahuje jedno nebo více velkých písmen"
+ },
+ "policyInEffectLowercase": {
+ "message": "Obsahuje jedno nebo více malých písmen"
+ },
+ "policyInEffectNumbers": {
+ "message": "Obsahuje jednu nebo více číslic"
+ },
+ "policyInEffectSpecial": {
+ "message": "Obsahuje jeden nebo více následujících speciálních znaků: $CHARS$",
+ "placeholders": {
+ "chars": {
+ "content": "$1",
+ "example": "!@#$%^&*"
+ }
+ }
+ },
+ "masterPasswordPolicyRequirementsNotMet": {
+ "message": "Vaše nové hlavní heslo nesplňuje požadavky zásad organizace."
+ },
+ "acceptPolicies": {
+ "message": "Zaškrtnutím tohoto políčka souhlasím s následujícím:"
+ },
+ "acceptPoliciesError": {
+ "message": "Podmínky použití a zásady ochrany osobních údajů nebyly odsouhlaseny."
+ },
+ "termsOfService": {
+ "message": "Podmínky použití"
+ },
+ "privacyPolicy": {
+ "message": "Zásady ochrany osobních údajů"
+ },
+ "hintEqualsPassword": {
+ "message": "Nápověda k vašemu heslu nemůže být stejná jako vaše heslo."
+ },
+ "ok": {
+ "message": "OK"
+ },
+ "desktopSyncVerificationTitle": {
+ "message": "Ověření synchronizace s desktopovou aplikací"
+ },
+ "desktopIntegrationVerificationText": {
+ "message": "Ověřte, zda desktopová aplikace zobrazuje tento otisk: "
+ },
+ "desktopIntegrationDisabledTitle": {
+ "message": "Integrace prohlížeče není povolena"
+ },
+ "desktopIntegrationDisabledDesc": {
+ "message": "Integrace prohlížeče není povolena v aplikaci Bitwarden. Povolte ji prosím v nastavení v aplikaci pro počítač."
+ },
+ "startDesktopTitle": {
+ "message": "Spustit aplikaci Bitwarden"
+ },
+ "startDesktopDesc": {
+ "message": "Počítačová aplikace Bitwarden musí být spuštěna před použitím této funkce."
+ },
+ "errorEnableBiometricTitle": {
+ "message": "Nelze povolit biometrii"
+ },
+ "errorEnableBiometricDesc": {
+ "message": "Akce byla zrušena aplikací pro počítač"
+ },
+ "nativeMessagingInvalidEncryptionDesc": {
+ "message": "Aplikace pro počítač zrušila platnost zabezpečeného komunikačního kanálu. Zkuste to prosím znovu"
+ },
+ "nativeMessagingInvalidEncryptionTitle": {
+ "message": "Komunikace s počítačovou aplikací přerušena"
+ },
+ "nativeMessagingWrongUserDesc": {
+ "message": "Počítačová aplikace je přihlášena k jinému účtu. Ujistěte se, že jsou obě aplikace přihlášeny ke stejnému účtu."
+ },
+ "nativeMessagingWrongUserTitle": {
+ "message": "Neshoda účtu"
+ },
+ "biometricsNotEnabledTitle": {
+ "message": "Biometrie není povolena"
+ },
+ "biometricsNotEnabledDesc": {
+ "message": "Biometrické prvky v prohlížeči vyžadují, aby v nastavení počítačové aplikace byla povolena biometrie."
+ },
+ "biometricsNotSupportedTitle": {
+ "message": "Biometrie není podporována"
+ },
+ "biometricsNotSupportedDesc": {
+ "message": "Biometrie v prohlížeči není na tomto zařízení podporována."
+ },
+ "nativeMessaginPermissionErrorTitle": {
+ "message": "Oprávnění nebylo uděleno"
+ },
+ "nativeMessaginPermissionErrorDesc": {
+ "message": "Bez oprávnění ke komunikaci s počítačovou aplikací Bitwarden nelze v rozšíření prohlížeče používat biometrické údaje. Zkuste to prosím znovu."
+ },
+ "nativeMessaginPermissionSidebarTitle": {
+ "message": "Žádost o oprávnění selhala"
+ },
+ "nativeMessaginPermissionSidebarDesc": {
+ "message": "Tuto akci nelze provést v postranním panelu, prosím zkuste akci znovu v novém okně."
+ },
+ "personalOwnershipSubmitError": {
+ "message": "Z důvodu zásad organizace nemůžete ukládat položky do svého osobního trezoru. Změňte vlastnictví položky na organizaci a poté si vyberte z dostupných kolekcí."
+ },
+ "personalOwnershipPolicyInEffect": {
+ "message": "Zásady organizace ovlivňují možnosti vlastnictví."
+ },
+ "excludedDomains": {
+ "message": "Vyloučené domény"
+ },
+ "excludedDomainsDesc": {
+ "message": "Bitwarden nebude žádat o uložení přihlašovacích údajů pro tyto domény. Aby se změny projevily, musíte stránku obnovit."
+ },
+ "excludedDomainsInvalidDomain": {
+ "message": "$DOMAIN$ není platná doména",
+ "placeholders": {
+ "domain": {
+ "content": "$1",
+ "example": "googlecom"
+ }
+ }
+ },
+ "send": {
+ "message": "Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "searchSends": {
+ "message": "Hledat Sends",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "addSend": {
+ "message": "Přidat Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTypeText": {
+ "message": "Text"
+ },
+ "sendTypeFile": {
+ "message": "Soubor"
+ },
+ "allSends": {
+ "message": "Všechny Sends",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "maxAccessCountReached": {
+ "message": "Dosažen maximální počet přístupů"
+ },
+ "expired": {
+ "message": "Vypršela platnost"
+ },
+ "pendingDeletion": {
+ "message": "Čeká na smazání"
+ },
+ "passwordProtected": {
+ "message": "Chráněno heslem"
+ },
+ "copySendLink": {
+ "message": "Zkopírovat odkaz Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "removePassword": {
+ "message": "Odstranit heslo"
+ },
+ "delete": {
+ "message": "Smazat"
+ },
+ "removedPassword": {
+ "message": "Odstraněné heslo"
+ },
+ "deletedSend": {
+ "message": "Smazaný Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendLink": {
+ "message": "Odkaz tohoto Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "disabled": {
+ "message": "Zakázáno"
+ },
+ "removePasswordConfirmation": {
+ "message": "Jste si jisti, že chcete odstranit heslo?"
+ },
+ "deleteSend": {
+ "message": "Smazat Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "deleteSendConfirmation": {
+ "message": "Jste si jisti, že chcete odstranit tento Send?",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "editSend": {
+ "message": "Upravit Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTypeHeader": {
+ "message": "Jakého typu je tento Send?",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendNameDesc": {
+ "message": "Přátelský název pro popis tohoto Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendFileDesc": {
+ "message": "Soubor, který chcete odeslat."
+ },
+ "deletionDate": {
+ "message": "Datum odstranění"
+ },
+ "deletionDateDesc": {
+ "message": "Tento Send bude trvale smazán v určený datum a čas.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "expirationDate": {
+ "message": "Datum vypršení platnosti"
+ },
+ "expirationDateDesc": {
+ "message": "Je-li nastaveno, přístup k tomuto Send vyprší v daný datum a čas.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "oneDay": {
+ "message": "1 den"
+ },
+ "days": {
+ "message": "$DAYS$ dní",
+ "placeholders": {
+ "days": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "custom": {
+ "message": "Vlastní"
+ },
+ "maximumAccessCount": {
+ "message": "Maximální počet přístupů"
+ },
+ "maximumAccessCountDesc": {
+ "message": "Je-li nastaveno, uživatelé již nebudou mít přístup k tomuto Send, jakmile bude dosaženo maximálního počtu přístupů.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendPasswordDesc": {
+ "message": "Volitelně vyžadovat heslo pro přístup k tomuto Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendNotesDesc": {
+ "message": "Soukromé poznámky o tomto Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendDisableDesc": {
+ "message": "Vypnout tento Send, díky čemuž k němu nebude moci nikdo přistoupit.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendShareDesc": {
+ "message": "Zkopírovat odkaz pro sdílení tohoto Send po uložení.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTextDesc": {
+ "message": "Text, který chcete odeslat."
+ },
+ "sendHideText": {
+ "message": "Skrýt ve výchozím stavu text tohoto Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "currentAccessCount": {
+ "message": "Počet aktuálních přístupů"
+ },
+ "createSend": {
+ "message": "Vytvořit nový Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "newPassword": {
+ "message": "Nové heslo"
+ },
+ "sendDisabled": {
+ "message": "Send deaktivován",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendDisabledWarning": {
+ "message": "Kvůli firemním pravidlům můžete odstranit pouze existující Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "createdSend": {
+ "message": "Send vytvořen",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "editedSend": {
+ "message": "Send upraven",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendLinuxChromiumFileWarning": {
+ "message": "Chcete-li vybrat soubor, otevřete rozšíření v postranním panelu (pokud je to možné) nebo jej otevřete v novém okně kliknutím na tento banner."
+ },
+ "sendFirefoxFileWarning": {
+ "message": "Chcete-li vybrat soubor pomocí prohlížeče Firefox, otevřete rozšíření v postranním panelu (pokud je to možné) nebo jej otevřete v novém okně kliknutím na tento banner."
+ },
+ "sendSafariFileWarning": {
+ "message": "Chcete-li vybrat soubor pomocí prohlížeče Safari, otevřete nové okno kliknutím na tento banner."
+ },
+ "sendFileCalloutHeader": {
+ "message": "Než začnete"
+ },
+ "sendFirefoxCustomDatePopoutMessage1": {
+ "message": "Chcete-li použít k výběru data styl kalendáře",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read '**To use a calendar style date picker ** click here to pop out your window.'"
+ },
+ "sendFirefoxCustomDatePopoutMessage2": {
+ "message": "klikněte zde",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker **click here** to pop out your window.'"
+ },
+ "sendFirefoxCustomDatePopoutMessage3": {
+ "message": "pro zobrazení okna.",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker click here **to pop out your window.**'"
+ },
+ "expirationDateIsInvalid": {
+ "message": "Uvedené datum vypršení platnosti není platné."
+ },
+ "deletionDateIsInvalid": {
+ "message": "Uvedené datum odstranění není platné."
+ },
+ "expirationDateAndTimeRequired": {
+ "message": "Je vyžadován datum a čas vypršení platnosti."
+ },
+ "deletionDateAndTimeRequired": {
+ "message": "Je vyžadován datum a čas odstranění."
+ },
+ "dateParsingError": {
+ "message": "Došlo k chybě při ukládání data odstranění a vypršení platnosti."
+ },
+ "hideEmail": {
+ "message": "Skrýt mou e-mailovou adresu před příjemci."
+ },
+ "sendOptionsPolicyInEffect": {
+ "message": "Jedna nebo více zásad organizace ovlivňuje nastavení Send."
+ },
+ "passwordPrompt": {
+ "message": "Zeptat se znovu na hlavní heslo"
+ },
+ "passwordConfirmation": {
+ "message": "Potvrzení hlavního hesla"
+ },
+ "passwordConfirmationDesc": {
+ "message": "Tato akce je chráněna. Chcete-li pokračovat, zadejte znovu vaše hlavní heslo, abychom ověřili vaší totožnost."
+ },
+ "emailVerificationRequired": {
+ "message": "Je vyžadováno ověření emailu"
+ },
+ "emailVerificationRequiredDesc": {
+ "message": "Abyste mohli tuto funkci používat, musíte ověřit svůj e-mail. Svůj e-mail můžete ověřit ve webovém trezoru."
+ },
+ "updatedMasterPassword": {
+ "message": "Updated Master Password"
+ },
+ "updateMasterPassword": {
+ "message": "Změnit hlavní heslo"
+ },
+ "updateMasterPasswordWarning": {
+ "message": "Administrátor v organizaci nedávno změnil vaše hlavní heslo. Pro přístup k trezoru jej nyní musíte změnit. Pokračování vás odhlásí z vaší aktuální relace a bude nutné se znovu přihlásit. Aktivní relace na jiných zařízeních mohou zůstat aktivní až po dobu jedné hodiny."
+ },
+ "resetPasswordPolicyAutoEnroll": {
+ "message": "Automatic Enrollment"
+ },
+ "resetPasswordAutoEnrollInviteWarning": {
+ "message": "Tato organizace má podnikové zásady, které vás automaticky zaregistrují k obnovení hesla. Registrace umožní správcům organizace změnit vaše hlavní heslo."
+ },
+ "selectFolder": {
+ "message": "Select folder..."
+ },
+ "ssoCompleteRegistration": {
+ "message": "In order to complete logging in with SSO, please set a master password to access and protect your vault."
+ },
+ "hours": {
+ "message": "Hours"
+ },
+ "minutes": {
+ "message": "Minutes"
+ },
+ "vaultTimeoutPolicyInEffect": {
+ "message": "Your organization policies are affecting your vault timeout. Maximum allowed Vault Timeout is $HOURS$ hour(s) and $MINUTES$ minute(s)",
+ "placeholders": {
+ "hours": {
+ "content": "$1",
+ "example": "5"
+ },
+ "minutes": {
+ "content": "$2",
+ "example": "5"
+ }
+ }
+ },
+ "vaultTimeoutToLarge": {
+ "message": "Your vault timeout exceeds the restrictions set by your organization."
+ },
+ "vaultExportDisabled": {
+ "message": "Vault Export Disabled"
+ },
+ "personalVaultExportPolicyInEffect": {
+ "message": "One or more organization policies prevents you from exporting your personal vault."
+ },
+ "copyCustomFieldNameInvalidElement": {
+ "message": "Unable to identify a valid form element. Try inspecting the HTML instead."
+ },
+ "copyCustomFieldNameNotUnique": {
+ "message": "No unique identifier found."
+ }
+}
diff --git a/src/iOS.Safari/Resources/_locales/da/messages.json b/src/iOS.Safari/Resources/_locales/da/messages.json
new file mode 100644
index 000000000..8df959bc1
--- /dev/null
+++ b/src/iOS.Safari/Resources/_locales/da/messages.json
@@ -0,0 +1,1817 @@
+{
+ "appName": {
+ "message": "Bitwarden"
+ },
+ "extName": {
+ "message": "Bitwarden - Gratis adgangskodemanager",
+ "description": "Extension name, MUST be less than 40 characters (Safari restriction)"
+ },
+ "extDesc": {
+ "message": "En sikker og gratis adgangskodemanager til alle dine enheder.",
+ "description": "Extension description"
+ },
+ "loginOrCreateNewAccount": {
+ "message": "Log ind eller opret en ny konto for at få adgang til din sikre boks."
+ },
+ "createAccount": {
+ "message": "Opret konto"
+ },
+ "login": {
+ "message": "Log ind"
+ },
+ "enterpriseSingleSignOn": {
+ "message": "Virksomheds Single Sign On"
+ },
+ "cancel": {
+ "message": "Annullér"
+ },
+ "close": {
+ "message": "Luk"
+ },
+ "submit": {
+ "message": "Bekræft"
+ },
+ "emailAddress": {
+ "message": "E-mailadresse"
+ },
+ "masterPass": {
+ "message": "Hovedadgangskode"
+ },
+ "masterPassDesc": {
+ "message": "Hovedadgangskoden er den adgangskode, du bruger til at få adgang til din boks. Det er meget vigtigt, at du ikke glemmer din hovedadgangskode. Der er ingen måde hvorpå koden kan genoprettes, i tilfælde af at du glemmer den."
+ },
+ "masterPassHintDesc": {
+ "message": "Et tip til hovedadgangskoden kan hjælpe dig med at huske din adgangskode, hvis du glemmer den."
+ },
+ "reTypeMasterPass": {
+ "message": "Bekræft hovedadgangskode"
+ },
+ "masterPassHint": {
+ "message": "Hovedadgangskodetip (valgfrit)"
+ },
+ "tab": {
+ "message": "Fane"
+ },
+ "myVault": {
+ "message": "Min boks"
+ },
+ "tools": {
+ "message": "Værktøjer"
+ },
+ "settings": {
+ "message": "Indstillinger"
+ },
+ "currentTab": {
+ "message": "Aktuel fane"
+ },
+ "copyPassword": {
+ "message": "Kopiér adgangskode"
+ },
+ "copyNote": {
+ "message": "Kopiér notat"
+ },
+ "copyUri": {
+ "message": "Kopiér URI"
+ },
+ "copyUsername": {
+ "message": "Kopiér brugernavn"
+ },
+ "copyNumber": {
+ "message": "Kopiér nummer"
+ },
+ "copySecurityCode": {
+ "message": "Kopiér sikkerhedskode"
+ },
+ "autoFill": {
+ "message": "Auto-udfyld"
+ },
+ "generatePasswordCopied": {
+ "message": "Generér adgangskode (kopieret)"
+ },
+ "copyElementIdentifier": {
+ "message": "Kopier Brugerdefineret Feltnavn"
+ },
+ "noMatchingLogins": {
+ "message": "Ingen matchende logins."
+ },
+ "vaultLocked": {
+ "message": "Boksen er låst."
+ },
+ "vaultLoggedOut": {
+ "message": "Boksen er logget ud."
+ },
+ "autoFillInfo": {
+ "message": "Der findes ingen login til at auto-udfylde i den nuværende browserfane."
+ },
+ "addLogin": {
+ "message": "Tilføj et login"
+ },
+ "addItem": {
+ "message": "Tilføj element"
+ },
+ "passwordHint": {
+ "message": "Adgangskodetip"
+ },
+ "enterEmailToGetHint": {
+ "message": "Indtast din kontos e-mailadresse for at modtage dit hovedadgangskodetip."
+ },
+ "getMasterPasswordHint": {
+ "message": "Få hovedadgangskodetip"
+ },
+ "continue": {
+ "message": "Forsæt"
+ },
+ "verificationCode": {
+ "message": "Bekræftelseskode"
+ },
+ "account": {
+ "message": "Konto"
+ },
+ "changeMasterPassword": {
+ "message": "Skift hovedadgangskode"
+ },
+ "fingerprintPhrase": {
+ "message": "Fingeraftrykssætning",
+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
+ },
+ "yourAccountsFingerprint": {
+ "message": "Din kontos fingeraftrykssætning",
+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
+ },
+ "twoStepLogin": {
+ "message": "To-trins login"
+ },
+ "logOut": {
+ "message": "Log ud"
+ },
+ "about": {
+ "message": "Om"
+ },
+ "version": {
+ "message": "Version"
+ },
+ "save": {
+ "message": "Gem"
+ },
+ "move": {
+ "message": "Flyt"
+ },
+ "addFolder": {
+ "message": "Tilføj mappe"
+ },
+ "name": {
+ "message": "Navn"
+ },
+ "editFolder": {
+ "message": "Redigér mappe"
+ },
+ "deleteFolder": {
+ "message": "Slet mappe"
+ },
+ "folders": {
+ "message": "Mapper"
+ },
+ "noFolders": {
+ "message": "Der er ingen mapper at vise."
+ },
+ "helpFeedback": {
+ "message": "Hjælp & feedback"
+ },
+ "sync": {
+ "message": "Synkronisér"
+ },
+ "syncVaultNow": {
+ "message": "Synkronisér boks nu"
+ },
+ "lastSync": {
+ "message": "Seneste synkronisering:"
+ },
+ "passGen": {
+ "message": "Adgangskodegenerator"
+ },
+ "generator": {
+ "message": "Generator",
+ "description": "Short for 'Password Generator'."
+ },
+ "passGenInfo": {
+ "message": "Opret automatisk stærke, unikke adgangskoder til dine logins."
+ },
+ "bitWebVault": {
+ "message": "Bitwarden web-boks"
+ },
+ "importItems": {
+ "message": "Importér elementer"
+ },
+ "select": {
+ "message": "Vælg"
+ },
+ "generatePassword": {
+ "message": "Generér adgangskode"
+ },
+ "regeneratePassword": {
+ "message": "Regenerér adgangskode"
+ },
+ "options": {
+ "message": "Indstillinger"
+ },
+ "length": {
+ "message": "Længde"
+ },
+ "numWords": {
+ "message": "Antal ord"
+ },
+ "wordSeparator": {
+ "message": "Ordseparator"
+ },
+ "capitalize": {
+ "message": "Stort begyndelsesbogstav",
+ "description": "Make the first letter of a work uppercase."
+ },
+ "includeNumber": {
+ "message": "Inkludér ciffer"
+ },
+ "minNumbers": {
+ "message": "Mindste antal cifre"
+ },
+ "minSpecial": {
+ "message": "Mindste antal specialtegn"
+ },
+ "avoidAmbChar": {
+ "message": "Undgå tvetydige tegn"
+ },
+ "searchVault": {
+ "message": "Søg i boks"
+ },
+ "edit": {
+ "message": "Redigér"
+ },
+ "view": {
+ "message": "Vis"
+ },
+ "noItemsInList": {
+ "message": "Der er ingen elementer at vise."
+ },
+ "itemInformation": {
+ "message": "Elementinformation"
+ },
+ "username": {
+ "message": "Brugernavn"
+ },
+ "password": {
+ "message": "Adgangskode"
+ },
+ "passphrase": {
+ "message": "Adgangssætning"
+ },
+ "favorite": {
+ "message": "Favorit"
+ },
+ "notes": {
+ "message": "Notater"
+ },
+ "note": {
+ "message": "Notat"
+ },
+ "editItem": {
+ "message": "Redigér element"
+ },
+ "folder": {
+ "message": "Mappe"
+ },
+ "deleteItem": {
+ "message": "Slet element"
+ },
+ "viewItem": {
+ "message": "Vis element"
+ },
+ "launch": {
+ "message": "Start"
+ },
+ "website": {
+ "message": "Hjemmeside"
+ },
+ "toggleVisibility": {
+ "message": "Slå synlighed til/fra"
+ },
+ "manage": {
+ "message": "Håndtér"
+ },
+ "other": {
+ "message": "Andre"
+ },
+ "rateExtension": {
+ "message": "Bedøm udvidelsen"
+ },
+ "rateExtensionDesc": {
+ "message": "Overvej om du vil hjælpe os med en god anmeldelse!"
+ },
+ "browserNotSupportClipboard": {
+ "message": "Din webbrowser understøtter ikke udklipsholder kopiering. Kopiér det manuelt i stedet."
+ },
+ "verifyMasterPassword": {
+ "message": "Bekræft hovedadgangskode"
+ },
+ "yourVaultIsLocked": {
+ "message": "Din boks er låst. Bekræft din hovedadgangskode for at fortsætte."
+ },
+ "unlock": {
+ "message": "Lås op"
+ },
+ "loggedInAsOn": {
+ "message": "Logget ind som $EMAIL$ på $HOSTNAME$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "name@example.com"
+ },
+ "hostname": {
+ "content": "$2",
+ "example": "bitwarden.com"
+ }
+ }
+ },
+ "invalidMasterPassword": {
+ "message": "Ugyldig hovedadgangskode"
+ },
+ "vaultTimeout": {
+ "message": "Boks timeout"
+ },
+ "lockNow": {
+ "message": "Lås nu"
+ },
+ "immediately": {
+ "message": "Straks"
+ },
+ "tenSeconds": {
+ "message": "10 sekunder"
+ },
+ "twentySeconds": {
+ "message": "20 sekunder"
+ },
+ "thirtySeconds": {
+ "message": "30 sekunder"
+ },
+ "oneMinute": {
+ "message": "1 minut"
+ },
+ "twoMinutes": {
+ "message": "2 minutter"
+ },
+ "fiveMinutes": {
+ "message": "5 minutter"
+ },
+ "fifteenMinutes": {
+ "message": "15 minutter"
+ },
+ "thirtyMinutes": {
+ "message": "30 minutter"
+ },
+ "oneHour": {
+ "message": "1 time"
+ },
+ "fourHours": {
+ "message": "4 timer"
+ },
+ "onLocked": {
+ "message": "Når systemet låses"
+ },
+ "onRestart": {
+ "message": "Ved genstart af browseren"
+ },
+ "never": {
+ "message": "Aldrig"
+ },
+ "security": {
+ "message": "Sikkerhed"
+ },
+ "errorOccurred": {
+ "message": "Der er opstået en fejl"
+ },
+ "emailRequired": {
+ "message": "E-mailadresse er påkrævet."
+ },
+ "invalidEmail": {
+ "message": "Ugyldig e-mailadresse."
+ },
+ "masterPassRequired": {
+ "message": "Hovedadgangskode er påkrævet."
+ },
+ "masterPassLength": {
+ "message": "Hovedadgangskoden skal være på mindst 8 tegn."
+ },
+ "masterPassDoesntMatch": {
+ "message": "De to adgangskoder matcher ikke."
+ },
+ "newAccountCreated": {
+ "message": "Din nye konto er oprettet! Du kan nu logge ind."
+ },
+ "masterPassSent": {
+ "message": "Vi har sendt dig en e-mail med dit hovedadgangskodetip."
+ },
+ "verificationCodeRequired": {
+ "message": "Bekræftelseskode er påkrævet."
+ },
+ "valueCopied": {
+ "message": "$VALUE$ kopieret",
+ "description": "Value has been copied to the clipboard.",
+ "placeholders": {
+ "value": {
+ "content": "$1",
+ "example": "Password"
+ }
+ }
+ },
+ "autofillError": {
+ "message": "Ikke i stand til at auto-udfylde det valgte element på denne side. Kopiér og indsæt dataene i stedet for."
+ },
+ "loggedOut": {
+ "message": "Logget ud"
+ },
+ "loginExpired": {
+ "message": "Din login-session er udløbet."
+ },
+ "logOutConfirmation": {
+ "message": "Er du sikker på, du vil logge ud?"
+ },
+ "yes": {
+ "message": "Ja"
+ },
+ "no": {
+ "message": "Nej"
+ },
+ "unexpectedError": {
+ "message": "Der opstod en uventet fejl."
+ },
+ "nameRequired": {
+ "message": "Navn er påkrævet."
+ },
+ "addedFolder": {
+ "message": "Tilføjede mappe"
+ },
+ "changeMasterPass": {
+ "message": "Skift hovedadgangskode"
+ },
+ "changeMasterPasswordConfirmation": {
+ "message": "Du kan ændre din hovedadgangskode i bitwarden.com web-boksen. Vil du besøge hjemmesiden nu?"
+ },
+ "twoStepLoginConfirmation": {
+ "message": "To-trins login gør din konto mere sikker ved at kræve, at du verificerer dit login med en anden enhed, med en sikkerhedsnøgle, autentificerings app, SMS, telefonopkald eller e-mail. To-trins login kan aktiveres i bitwarden.com web-boksen. Vil du besøge hjemmesiden nu?"
+ },
+ "editedFolder": {
+ "message": "Redigerede mappe"
+ },
+ "deleteFolderConfirmation": {
+ "message": "Er du sikker på du vil slette denne mappe?"
+ },
+ "deletedFolder": {
+ "message": "Slettede mappe"
+ },
+ "gettingStartedTutorial": {
+ "message": "Sådan kommer du i gang"
+ },
+ "gettingStartedTutorialVideo": {
+ "message": "Se vores introduktion for at lære hvordan du får mest ud af browser-udvidelsen."
+ },
+ "syncingComplete": {
+ "message": "Synkronisering fuldført"
+ },
+ "syncingFailed": {
+ "message": "Synkronisering mislykkedes"
+ },
+ "passwordCopied": {
+ "message": "Adgangskode kopieret"
+ },
+ "uri": {
+ "message": "URI"
+ },
+ "uriPosition": {
+ "message": "URI $POSITION$",
+ "description": "A listing of URIs. Ex: URI 1, URI 2, URI 3, etc.",
+ "placeholders": {
+ "position": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "newUri": {
+ "message": "Ny URI"
+ },
+ "addedItem": {
+ "message": "Tilføjede element"
+ },
+ "editedItem": {
+ "message": "Redigerede element"
+ },
+ "deleteItemConfirmation": {
+ "message": "Er du sikker på, at du sende til papirkurven?"
+ },
+ "deletedItem": {
+ "message": "Element sendt til papirkurven"
+ },
+ "overwritePassword": {
+ "message": "Overskriv adgangskode"
+ },
+ "overwritePasswordConfirmation": {
+ "message": "Er du sikker på, at du vil overskrive den aktuelle adgangskode?"
+ },
+ "searchFolder": {
+ "message": "Søg mappe"
+ },
+ "searchCollection": {
+ "message": "Søg samling"
+ },
+ "searchType": {
+ "message": "Søgetype"
+ },
+ "noneFolder": {
+ "message": "Ingen mappe",
+ "description": "This is the folder for uncategorized items"
+ },
+ "disableAddLoginNotification": {
+ "message": "Deaktivér Tilføj login notifikation"
+ },
+ "addLoginNotificationDesc": {
+ "message": "\"Tilføj login notifikation\" spørger dig automatisk om du vil gemme nye logins til din boks, når du logger ind med dem for første gang."
+ },
+ "dontShowCardsCurrentTab": {
+ "message": "Vis ikke kort på fanebladet"
+ },
+ "dontShowCardsCurrentTabDesc": {
+ "message": "Kort fra din boks er vist på siden 'Aktuel fane' for nem adgang til automatisk udfyldning."
+ },
+ "dontShowIdentitiesCurrentTab": {
+ "message": "Vis ikke identiteter på fanebladet"
+ },
+ "dontShowIdentitiesCurrentTabDesc": {
+ "message": "Identiteter fra din boks er vist på siden 'Aktuel fane' for nem adgang til automatisk udfyldning."
+ },
+ "clearClipboard": {
+ "message": "Ryd udklipsholder",
+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
+ },
+ "clearClipboardDesc": {
+ "message": "Fjern automatisk kopierede data fra din udklipsholder.",
+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
+ },
+ "notificationAddDesc": {
+ "message": "Skal Bitwarden huske denne adgangskode for dig?"
+ },
+ "notificationAddSave": {
+ "message": "Ja, gem nu"
+ },
+ "notificationNeverSave": {
+ "message": "Aldrig for denne hjemmeside"
+ },
+ "disableChangedPasswordNotification": {
+ "message": "Deaktivér besked om ændret adgangskode"
+ },
+ "disableChangedPasswordNotificationDesc": {
+ "message": "\"Besked om ændret adgangskode\" beder dig automatisk om at opdatere en adgangskode i din boks, når det opdager, at du har ændret den på en hjemmeside."
+ },
+ "notificationChangeDesc": {
+ "message": "Vil du opdatere denne adgangskode i Bitwarden?"
+ },
+ "notificationChangeSave": {
+ "message": "Ja, opdatér nu"
+ },
+ "disableContextMenuItem": {
+ "message": "Deaktivér Kontekst-menu valgmuligheder"
+ },
+ "disableContextMenuItemDesc": {
+ "message": "Kontekst-menu valgmuligheder giver hurtig adgang til adgangskode generering og login til hjemmesiden i din aktuelle fane."
+ },
+ "defaultUriMatchDetection": {
+ "message": "Standard URI matchmetode",
+ "description": "Default URI match detection for auto-fill."
+ },
+ "defaultUriMatchDetectionDesc": {
+ "message": "Vælg den standard måde, som URI matchmetode håndteres til logins, når du udfører handlinger som f.eks. Auto-udfyld."
+ },
+ "theme": {
+ "message": "Tema"
+ },
+ "themeDesc": {
+ "message": "Skift applikationens farvetema."
+ },
+ "dark": {
+ "message": "Mørk",
+ "description": "Dark color"
+ },
+ "light": {
+ "message": "Lys",
+ "description": "Light color"
+ },
+ "solarizedDark": {
+ "message": "Solariseret mørk",
+ "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated."
+ },
+ "exportVault": {
+ "message": "Eksportér boks"
+ },
+ "fileFormat": {
+ "message": "Filformat"
+ },
+ "warning": {
+ "message": "ADVARSEL",
+ "description": "WARNING (should stay in capitalized letters if the language permits)"
+ },
+ "confirmVaultExport": {
+ "message": "Bekræft eksport af boks"
+ },
+ "exportWarningDesc": {
+ "message": "Denne eksport indeholder dine boksdata i ukrypteret form. Du bør ikke gemme eller sende den eksporterede fil over usikre kanaler (f.eks. e-mail). Slet den straks efter at du er færdig med at bruge den."
+ },
+ "encExportKeyWarningDesc": {
+ "message": "Denne eksport krypterer dine data vha. din kontos krypteringsnøgle. Roterer du på et tidspunkt denne kontokrypteringsnøgle, skal du eksportere igen, da du ikke vil kunne dekryptere denne eksportfil."
+ },
+ "encExportAccountWarningDesc": {
+ "message": "Kontokrypteringsnøgler er unikke for hver Bitwarden-brugerkonto, så du kan ikke importere en krypteret eksport til en anden konto."
+ },
+ "exportMasterPassword": {
+ "message": "Indtast din hovedadgangskode for at eksportere dine data fra boksen."
+ },
+ "shared": {
+ "message": "Delt"
+ },
+ "learnOrg": {
+ "message": "Få mere at vide om organisationer"
+ },
+ "learnOrgConfirmation": {
+ "message": "Bitwarden giver dig mulighed for at dele elementer i din boks med andre ved hjælp af en organisation. Vil du besøge bitwarden.com-webstedet for at få mere at vide?"
+ },
+ "moveToOrganization": {
+ "message": "Flyt til organisation"
+ },
+ "share": {
+ "message": "Del"
+ },
+ "movedItemToOrg": {
+ "message": "$ITEMNAME$ flyttet til $ORGNAME$",
+ "placeholders": {
+ "itemname": {
+ "content": "$1",
+ "example": "Secret Item"
+ },
+ "orgname": {
+ "content": "$2",
+ "example": "Company Name"
+ }
+ }
+ },
+ "moveToOrgDesc": {
+ "message": "Vælg den organisation, som du vil flytte dette emne til. Flytning overfører ejerskab af emnet til organisationen, og du vil efter flytningen ikke længere være den direkte ejer af emnet."
+ },
+ "learnMore": {
+ "message": "Lær mere"
+ },
+ "authenticatorKeyTotp": {
+ "message": "Autentificeringsnøgle (TOTP)"
+ },
+ "verificationCodeTotp": {
+ "message": "Bekræftelseskode (TOTP)"
+ },
+ "copyVerificationCode": {
+ "message": "Kopiér bekræftelseskoden"
+ },
+ "attachments": {
+ "message": "Vedhæftninger"
+ },
+ "deleteAttachment": {
+ "message": "Slet vedhæftning"
+ },
+ "deleteAttachmentConfirmation": {
+ "message": "Er du sikker på du vil slette denne vedhæftning?"
+ },
+ "deletedAttachment": {
+ "message": "Slettet vedhæftning"
+ },
+ "newAttachment": {
+ "message": "Tilføj ny vedhæftning"
+ },
+ "noAttachments": {
+ "message": "Ingen vedhæftninger."
+ },
+ "attachmentSaved": {
+ "message": "Vedhæftningen er blevet gemt."
+ },
+ "file": {
+ "message": "Fil"
+ },
+ "selectFile": {
+ "message": "Vælg en fil."
+ },
+ "maxFileSize": {
+ "message": "Maksimum filstørrelse er 500 MB."
+ },
+ "featureUnavailable": {
+ "message": "Funktion ikke tilgængelig"
+ },
+ "updateKey": {
+ "message": "Du kan ikke bruge denne funktion, før du opdaterer din krypteringsnøgle."
+ },
+ "premiumMembership": {
+ "message": "Premium-medlemskab"
+ },
+ "premiumManage": {
+ "message": "Håndtér medlemsskab"
+ },
+ "premiumManageAlert": {
+ "message": "Du kan håndtere dit medlemskab i bitwarden.com web-boksen. Vil du besøge hjemmesiden nu?"
+ },
+ "premiumRefresh": {
+ "message": "Opdatér medlemskab"
+ },
+ "premiumNotCurrentMember": {
+ "message": "Du er i øjeblikket ikke premium-medlem."
+ },
+ "premiumSignUpAndGet": {
+ "message": "Tilmeld dig et premium-medlemskab og få:"
+ },
+ "ppremiumSignUpStorage": {
+ "message": "1 GB krypteret lager til vedhæftede filer."
+ },
+ "ppremiumSignUpTwoStep": {
+ "message": "Yderligere to-trins login muligheder såsom YubiKey, FIDO U2F og Duo."
+ },
+ "ppremiumSignUpReports": {
+ "message": "Adgangskodehygiejne, kontosundhed og rapporter om datalæk til at holde din boks sikker."
+ },
+ "ppremiumSignUpTotp": {
+ "message": "TOTP verifikationskode (2FA) generator til logins i din boks."
+ },
+ "ppremiumSignUpSupport": {
+ "message": "Prioriteret kundeservice."
+ },
+ "ppremiumSignUpFuture": {
+ "message": "Alle fremtidige premium-funktioner. Mere kommer snart!"
+ },
+ "premiumPurchase": {
+ "message": "Køb premium"
+ },
+ "premiumPurchaseAlert": {
+ "message": "Du kan købe premium-medlemskab i bitwarden.com web-boksen. Vil du besøge hjemmesiden nu?"
+ },
+ "premiumCurrentMember": {
+ "message": "Du er premium-medlem!"
+ },
+ "premiumCurrentMemberThanks": {
+ "message": "Tak fordi du støtter Bitwarden."
+ },
+ "premiumPrice": {
+ "message": "Alt dette for kun $PRICE$ /år!",
+ "placeholders": {
+ "price": {
+ "content": "$1",
+ "example": "$10"
+ }
+ }
+ },
+ "refreshComplete": {
+ "message": "Opdatering færdig"
+ },
+ "disableAutoTotpCopy": {
+ "message": "Deaktivér Automatisk TOTP kopi"
+ },
+ "disableAutoTotpCopyDesc": {
+ "message": "Hvis dit login har en autentificeringsnøgle tilknyttet, kopieres TOTP verifikationskoden automatisk til din udklipsholder når du auto-udfylder login."
+ },
+ "disableAutoBiometricsPrompt": {
+ "message": "Bed ikke om biometri ved start"
+ },
+ "premiumRequired": {
+ "message": "Premium påkrævet"
+ },
+ "premiumRequiredDesc": {
+ "message": "Premium-medlemskab kræves for at anvende denne funktion."
+ },
+ "enterVerificationCodeApp": {
+ "message": "Indtast den 6-cifrede verifikationskode fra din autentificerings-app."
+ },
+ "enterVerificationCodeEmail": {
+ "message": "Indtast den 6-cifrede verifikationskode, der blev sendt til $EMAIL$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "example@gmail.com"
+ }
+ }
+ },
+ "verificationCodeEmailSent": {
+ "message": "Bekræftelsesmail sendt til $EMAIL$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "example@gmail.com"
+ }
+ }
+ },
+ "rememberMe": {
+ "message": "Husk mig"
+ },
+ "sendVerificationCodeEmailAgain": {
+ "message": "Send verifikationskode-email igen"
+ },
+ "useAnotherTwoStepMethod": {
+ "message": "Brug en anden to-trins login metode"
+ },
+ "insertYubiKey": {
+ "message": "Indsæt din YubiKey i din computers USB-port, og tryk derefter på dens knap."
+ },
+ "insertU2f": {
+ "message": "Indsæt din sikkerhedsnøgle i din computers USB-port. Hvis den har en knap, tryk på den."
+ },
+ "webAuthnNewTab": {
+ "message": "For at starte WebAuthn 2FA-verifikationen. Klik på knappen nedenfor for at åbne en ny fane og følg instruktionerne i den nye fane."
+ },
+ "webAuthnNewTabOpen": {
+ "message": "Åbn ny fane"
+ },
+ "webAuthnAuthenticate": {
+ "message": "Godkend WebAuthn"
+ },
+ "loginUnavailable": {
+ "message": "Login ikke tilgængelig"
+ },
+ "noTwoStepProviders": {
+ "message": "Denne konto har to-trins login aktiveret, men ingen af de konfigurerede to-trins udbydere understøttes af denne webbrowser."
+ },
+ "noTwoStepProviders2": {
+ "message": "Du skal bruge en understøttet webbrowser (såsom Chrome) og/eller tilføje ekstra udbydere, der understøttes bedre på tværs af webbrowsere (f.eks. en autentificering app)."
+ },
+ "twoStepOptions": {
+ "message": "To-trins login muligheder"
+ },
+ "recoveryCodeDesc": {
+ "message": "Mistet adgang til alle dine to-faktor-udbydere? Brug din genoprettelseskode til at deaktivere alle to-faktor udbydere på din konto."
+ },
+ "recoveryCodeTitle": {
+ "message": "Gendannelseskode"
+ },
+ "authenticatorAppTitle": {
+ "message": "Autentificerings-app"
+ },
+ "authenticatorAppDesc": {
+ "message": "Brug en autentificerings app (f.eks. Authy eller Google Autentificering) til at generere tidsbaserede bekræftelseskoder.",
+ "description": "'Authy' and 'Google Authenticator' are product names and should not be translated."
+ },
+ "yubiKeyTitle": {
+ "message": "YubiKey OTP sikkerhedsnøgle"
+ },
+ "yubiKeyDesc": {
+ "message": "Brug en YubiKey til at få adgang til din konto. Virker med YubiKey 4, 4 Nano, 4C og NEO enheder."
+ },
+ "duoDesc": {
+ "message": "Bekræft med Duo sikkerhed ved hjælp af Duo Mobile app, SMS, telefonopkald eller U2F sikkerhedsnøgle.",
+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
+ },
+ "duoOrganizationDesc": {
+ "message": "Bekræft med Duo sikkerhed for din organisation ved hjælp af Duo Mobile app, SMS, telefonopkald eller U2F sikkerhedsnøgle.",
+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
+ },
+ "webAuthnTitle": {
+ "message": "FIDO2 WebAuthn"
+ },
+ "webAuthnDesc": {
+ "message": "Brug en hvilken som helst WebAuthn-aktiveret sikkerhedsnøgle til at få adgang til din konto."
+ },
+ "emailTitle": {
+ "message": "E-mail"
+ },
+ "emailDesc": {
+ "message": "Bekræftelseskoder vil blive e-mailet til dig."
+ },
+ "selfHostedEnvironment": {
+ "message": "Selv-hosted miljø"
+ },
+ "selfHostedEnvironmentFooter": {
+ "message": "Angiv grund-URL'en i din lokal-hostede Bitwarden-installation."
+ },
+ "customEnvironment": {
+ "message": "Brugerdefineret miljø"
+ },
+ "customEnvironmentFooter": {
+ "message": "Til avancerede brugere. Du kan angive grund-URL'en for hver service uafhængigt."
+ },
+ "baseUrl": {
+ "message": "Server URL"
+ },
+ "apiUrl": {
+ "message": "API server URL"
+ },
+ "webVaultUrl": {
+ "message": "Web-boks server URL"
+ },
+ "identityUrl": {
+ "message": "Identitets-server URL"
+ },
+ "notificationsUrl": {
+ "message": "Meddelelsesserver URL"
+ },
+ "iconsUrl": {
+ "message": "Ikonserver URL"
+ },
+ "environmentSaved": {
+ "message": "Miljøets URLs er blevet gemt."
+ },
+ "enableAutoFillOnPageLoad": {
+ "message": "Aktivér Auto-udfyld ved sideindlæsning"
+ },
+ "enableAutoFillOnPageLoadDesc": {
+ "message": "Hvis en login-formular er opdaget, så udfør automatisk en auto-udfyld når hjemmesiden indlæses."
+ },
+ "experimentalFeature": {
+ "message": "Dette er i øjeblikket en eksperimentel funktion. Brug på egen risiko."
+ },
+ "defaultAutoFillOnPageLoad": {
+ "message": "Standardindstilling for autofyld for loginelementer"
+ },
+ "defaultAutoFillOnPageLoadDesc": {
+ "message": "Når du har aktiveret auto-udfyldning ved sideindlæsning, kan du aktivere eller deaktivere funktionen for individuelle loginelementer. Dette er standardindstillingen for loginelementer, der ikke er konfigureret separat."
+ },
+ "itemAutoFillOnPageLoad": {
+ "message": "Auto-udfyld ved sideindlæsning (hvis aktiveret i Indstillinger)"
+ },
+ "autoFillOnPageLoadUseDefault": {
+ "message": "Anvend standardindstilling"
+ },
+ "autoFillOnPageLoadYes": {
+ "message": "Auto-udfyld ved sideindlæsning"
+ },
+ "autoFillOnPageLoadNo": {
+ "message": "Auto-udfyld ikke ved sideindlæsning"
+ },
+ "commandOpenPopup": {
+ "message": "Åbn boks popup"
+ },
+ "commandOpenSidebar": {
+ "message": "Åbn boks i sidebjælken"
+ },
+ "commandAutofillDesc": {
+ "message": "Auto-udfyld det sidste anvendte login for den aktuelle hjemmeside"
+ },
+ "commandGeneratePasswordDesc": {
+ "message": "Generér en ny tilfældig adgangskode og kopiér den til udklipsholderen"
+ },
+ "commandLockVaultDesc": {
+ "message": "Lås boksen"
+ },
+ "privateModeMessage": {
+ "message": "Desværre er dette vindue ikke tilgængelig i privat modus i denne browser."
+ },
+ "customFields": {
+ "message": "Brugerdefinerede felter"
+ },
+ "copyValue": {
+ "message": "Kopiér værdi"
+ },
+ "value": {
+ "message": "Værdi"
+ },
+ "newCustomField": {
+ "message": "Nyt brugerdefineret felt"
+ },
+ "dragToSort": {
+ "message": "Træk for at sortere"
+ },
+ "cfTypeText": {
+ "message": "Tekst"
+ },
+ "cfTypeHidden": {
+ "message": "Skjult"
+ },
+ "cfTypeBoolean": {
+ "message": "Boolsk"
+ },
+ "popup2faCloseMessage": {
+ "message": "Ved at klikke uden for pop-up-vinduet for at tjekke din e-mail for din bekræftelseskode vil få denne popup til at lukke. Vil du åbne denne popup i et nyt vindue, så det ikke lukker?"
+ },
+ "popupU2fCloseMessage": {
+ "message": "Denne browser kan ikke behandle U2F-anmodninger i dette popup-vindue. Vil du åbne denne popup i et nyt vindue, så du kan logge ind ved hjælp af U2F?"
+ },
+ "disableFavicon": {
+ "message": "Slå webikoner fra"
+ },
+ "disableFaviconDesc": {
+ "message": "Webikoner vises som et genkendeligt billede ved siden af hvert loginelement i din boks."
+ },
+ "disableBadgeCounter": {
+ "message": "Deaktivér Badge-tæller"
+ },
+ "disableBadgeCounterDesc": {
+ "message": "Badge-tæller angiver, hvor mange logins du har for den aktuelle side i din boks."
+ },
+ "cardholderName": {
+ "message": "Kortindehaverens navn"
+ },
+ "number": {
+ "message": "Nummer"
+ },
+ "brand": {
+ "message": "Type"
+ },
+ "expirationMonth": {
+ "message": "Udløbsmåned"
+ },
+ "expirationYear": {
+ "message": "Udløbsår"
+ },
+ "expiration": {
+ "message": "Udløb"
+ },
+ "january": {
+ "message": "Januar"
+ },
+ "february": {
+ "message": "Februar"
+ },
+ "march": {
+ "message": "Marts"
+ },
+ "april": {
+ "message": "April"
+ },
+ "may": {
+ "message": "Maj"
+ },
+ "june": {
+ "message": "Juni"
+ },
+ "july": {
+ "message": "Juli"
+ },
+ "august": {
+ "message": "August"
+ },
+ "september": {
+ "message": "September"
+ },
+ "october": {
+ "message": "Oktober"
+ },
+ "november": {
+ "message": "November"
+ },
+ "december": {
+ "message": "December"
+ },
+ "securityCode": {
+ "message": "Sikkerhedskode"
+ },
+ "ex": {
+ "message": "eks."
+ },
+ "title": {
+ "message": "Titel"
+ },
+ "mr": {
+ "message": "Hr"
+ },
+ "mrs": {
+ "message": "Fru"
+ },
+ "ms": {
+ "message": "Frk"
+ },
+ "dr": {
+ "message": "Dr"
+ },
+ "firstName": {
+ "message": "Fornavn"
+ },
+ "middleName": {
+ "message": "Mellemnavn"
+ },
+ "lastName": {
+ "message": "Efternavn"
+ },
+ "identityName": {
+ "message": "Identitetsnavn"
+ },
+ "company": {
+ "message": "Virksomhed"
+ },
+ "ssn": {
+ "message": "CPR-nummer"
+ },
+ "passportNumber": {
+ "message": "Pasnummer"
+ },
+ "licenseNumber": {
+ "message": "Kørekortnummer"
+ },
+ "email": {
+ "message": "E-mail"
+ },
+ "phone": {
+ "message": "Telefon"
+ },
+ "address": {
+ "message": "Adresse"
+ },
+ "address1": {
+ "message": "Adresse 1"
+ },
+ "address2": {
+ "message": "Adresse 2"
+ },
+ "address3": {
+ "message": "Adresse 3"
+ },
+ "cityTown": {
+ "message": "By"
+ },
+ "stateProvince": {
+ "message": "Region"
+ },
+ "zipPostalCode": {
+ "message": "Postnummer"
+ },
+ "country": {
+ "message": "Land"
+ },
+ "type": {
+ "message": "Type"
+ },
+ "typeLogin": {
+ "message": "Login"
+ },
+ "typeLogins": {
+ "message": "Logins"
+ },
+ "typeSecureNote": {
+ "message": "Sikret notat"
+ },
+ "typeCard": {
+ "message": "Kort"
+ },
+ "typeIdentity": {
+ "message": "Identitet"
+ },
+ "passwordHistory": {
+ "message": "Adgangskodehistorik"
+ },
+ "back": {
+ "message": "Tilbage"
+ },
+ "collections": {
+ "message": "Samlinger"
+ },
+ "favorites": {
+ "message": "Favoritter"
+ },
+ "popOutNewWindow": {
+ "message": "Åbn i et nyt vindue"
+ },
+ "refresh": {
+ "message": "Opdater"
+ },
+ "cards": {
+ "message": "Kort"
+ },
+ "identities": {
+ "message": "Identiteter"
+ },
+ "logins": {
+ "message": "Logins"
+ },
+ "secureNotes": {
+ "message": "Sikre notater"
+ },
+ "clear": {
+ "message": "Ryd",
+ "description": "To clear something out. example: To clear browser history."
+ },
+ "checkPassword": {
+ "message": "Undersøg om adgangskoden er blevet afsløret."
+ },
+ "passwordExposed": {
+ "message": "Denne adgangskode er blevet afsløret $VALUE$ gang(e) i datalæk. Du burde skifte den.",
+ "placeholders": {
+ "value": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "passwordSafe": {
+ "message": "Denne adgangskode er ikke fundet i nogen kendte datalæk. Den burde være sikker at bruge."
+ },
+ "baseDomain": {
+ "message": "Grund-domæne"
+ },
+ "host": {
+ "message": "Vært",
+ "description": "A URL's host value. For example, the host of https://sub.domain.com:443 is 'sub.domain.com:443'."
+ },
+ "exact": {
+ "message": "Nøjagtig"
+ },
+ "startsWith": {
+ "message": "Begynder med"
+ },
+ "regEx": {
+ "message": "Regulært udtryk",
+ "description": "A programming term, also known as 'RegEx'."
+ },
+ "matchDetection": {
+ "message": "Matchmetode",
+ "description": "URI match detection for auto-fill."
+ },
+ "defaultMatchDetection": {
+ "message": "Standard matchmetode",
+ "description": "Default URI match detection for auto-fill."
+ },
+ "toggleOptions": {
+ "message": "Skift indstillinger"
+ },
+ "toggleCurrentUris": {
+ "message": "Skift aktuelle URI'er",
+ "description": "Toggle the display of the URIs of the currently open tabs in the browser."
+ },
+ "currentUri": {
+ "message": "Aktuel URI",
+ "description": "The URI of one of the current open tabs in the browser."
+ },
+ "organization": {
+ "message": "Organisation",
+ "description": "An entity of multiple related people (ex. a team or business organization)."
+ },
+ "types": {
+ "message": "Typer"
+ },
+ "allItems": {
+ "message": "Alle elementer"
+ },
+ "noPasswordsInList": {
+ "message": "Der er ingen kodeord at vise."
+ },
+ "remove": {
+ "message": "Fjern"
+ },
+ "default": {
+ "message": "Standard"
+ },
+ "dateUpdated": {
+ "message": "Opdateret",
+ "description": "ex. Date this item was updated"
+ },
+ "datePasswordUpdated": {
+ "message": "Adgangskode opdateret",
+ "description": "ex. Date this password was updated"
+ },
+ "neverLockWarning": {
+ "message": "Er du sikker på, at du vil bruge indstillingen \"Aldrig\"? Hvis du sætter dine låseindstillinger til \"Aldrig\" gemmes din boks krypteringsnøgle på din enhed. Hvis du bruger denne indstilling, skal du sikre dig, at du holder din enhed ordentligt beskyttet."
+ },
+ "noOrganizationsList": {
+ "message": "Du tilhører ikke nogen organisationer. Organisationer giver dig mulighed for at dele elementer med andre brugere på en sikker måde."
+ },
+ "noCollectionsInList": {
+ "message": "Der er ingen samlinger at vise."
+ },
+ "ownership": {
+ "message": "Ejerskab"
+ },
+ "whoOwnsThisItem": {
+ "message": "Hvem ejer dette element?"
+ },
+ "strong": {
+ "message": "Stærk",
+ "description": "ex. A strong password. Scale: Weak -> Good -> Strong"
+ },
+ "good": {
+ "message": "God",
+ "description": "ex. A good password. Scale: Weak -> Good -> Strong"
+ },
+ "weak": {
+ "message": "Svag",
+ "description": "ex. A weak password. Scale: Weak -> Good -> Strong"
+ },
+ "weakMasterPassword": {
+ "message": "Svag hovedadgangskode"
+ },
+ "weakMasterPasswordDesc": {
+ "message": "Hovedadgangskoden du har valgt er svag. Du skal bruge en stærk hovedadgangskode (eller en adgangssætning) for at beskytte din Bitwarden-konto korrekt. Er du sikker på, at du vil bruge denne hovedadgangskode?"
+ },
+ "pin": {
+ "message": "Pinkode",
+ "description": "PIN code. Ex. The short code (often numeric) that you use to unlock a device."
+ },
+ "unlockWithPin": {
+ "message": "Lås op med pinkode"
+ },
+ "setYourPinCode": {
+ "message": "Indstil din pinkode til at låse Bitwarden op. Dine pin-indstillinger nulstilles, hvis du nogensinde logger helt ud af programmet."
+ },
+ "pinRequired": {
+ "message": "Pinkode er påkrævet."
+ },
+ "invalidPin": {
+ "message": "Ugyldig pinkode."
+ },
+ "verifyPin": {
+ "message": "Bekræft pinkode"
+ },
+ "yourVaultIsLockedPinCode": {
+ "message": "Din boks er låst. Bekræft din pinkode for at fortsætte."
+ },
+ "unlockWithBiometrics": {
+ "message": "Lås op med biometri"
+ },
+ "awaitDesktop": {
+ "message": "Afventer bekræftelse fra skrivebordet"
+ },
+ "awaitDesktopDesc": {
+ "message": "Bekræft venligst brug af biometri i Bitwarden skrivebordsapplikationen for at aktivere biometri for browseren."
+ },
+ "lockWithMasterPassOnRestart": {
+ "message": "Lås med hovedadgangskode ved genstart af browseren"
+ },
+ "selectOneCollection": {
+ "message": "Du skal vælge minimum én samling."
+ },
+ "cloneItem": {
+ "message": "Klon element"
+ },
+ "clone": {
+ "message": "Klon"
+ },
+ "passwordGeneratorPolicyInEffect": {
+ "message": "Én eller flere organisationspolitikker påvirker dine generatorindstillinger."
+ },
+ "vaultTimeoutAction": {
+ "message": "Boks timeout-handling"
+ },
+ "lock": {
+ "message": "Lås",
+ "description": "Verb form: to make secure or inaccesible by"
+ },
+ "trash": {
+ "message": "Papirkurv",
+ "description": "Noun: a special folder to hold deleted items"
+ },
+ "searchTrash": {
+ "message": "Søg i papirkurven"
+ },
+ "permanentlyDeleteItem": {
+ "message": "Slet element permanent"
+ },
+ "permanentlyDeleteItemConfirmation": {
+ "message": "Er du sikker på, at du vil slette dette element permanent?"
+ },
+ "permanentlyDeletedItem": {
+ "message": "Element slettet permanent"
+ },
+ "restoreItem": {
+ "message": "Gendan element"
+ },
+ "restoreItemConfirmation": {
+ "message": "Er du sikker på, at du vil gendanne dette element?"
+ },
+ "restoredItem": {
+ "message": "Element gendannet"
+ },
+ "vaultTimeoutLogOutConfirmation": {
+ "message": "Ved at logge ud fjernes al adgang til din boks og kræver online-godkendelse efter timeout-perioden. Er du sikker på, at du vil bruge denne indstilling?"
+ },
+ "vaultTimeoutLogOutConfirmationTitle": {
+ "message": "Bekræft timeout-handling"
+ },
+ "autoFillAndSave": {
+ "message": "Autoudfyld og gem"
+ },
+ "autoFillSuccessAndSavedUri": {
+ "message": "Autoudfyldte element og URI gemt"
+ },
+ "autoFillSuccess": {
+ "message": "Autoudfyldte element"
+ },
+ "setMasterPassword": {
+ "message": "Indstil hovedadgangskode"
+ },
+ "masterPasswordPolicyInEffect": {
+ "message": "Én eller flere organisationspolitikker kræver, at din hovedadgangskode opfylder flg. krav:"
+ },
+ "policyInEffectMinComplexity": {
+ "message": "Minimum kompleksitetsscore på $SCORE$",
+ "placeholders": {
+ "score": {
+ "content": "$1",
+ "example": "4"
+ }
+ }
+ },
+ "policyInEffectMinLength": {
+ "message": "Minimumslængde på $LENGTH$",
+ "placeholders": {
+ "length": {
+ "content": "$1",
+ "example": "14"
+ }
+ }
+ },
+ "policyInEffectUppercase": {
+ "message": "Indeholder ét eller flere store bogstaver"
+ },
+ "policyInEffectLowercase": {
+ "message": "Indeholder ét eller flere små bogstaver"
+ },
+ "policyInEffectNumbers": {
+ "message": "Indeholder ét eller flere cifre"
+ },
+ "policyInEffectSpecial": {
+ "message": "Indeholder ét eller flere af følgende specialtegn $CHARS$",
+ "placeholders": {
+ "chars": {
+ "content": "$1",
+ "example": "!@#$%^&*"
+ }
+ }
+ },
+ "masterPasswordPolicyRequirementsNotMet": {
+ "message": "Din nye hovedadgangskode opfylder ikke politikkravene."
+ },
+ "acceptPolicies": {
+ "message": "Ved at markere dette felt accepterer du følgende:"
+ },
+ "acceptPoliciesError": {
+ "message": "Servicevilkår og fortrolighedspolitik er ikke blevet bekræftet."
+ },
+ "termsOfService": {
+ "message": "Servicevilkår"
+ },
+ "privacyPolicy": {
+ "message": "Fortrolighedspolitik"
+ },
+ "hintEqualsPassword": {
+ "message": "Dit adgangskodetip kan ikke være det samme som din adgangskode."
+ },
+ "ok": {
+ "message": "Ok"
+ },
+ "desktopSyncVerificationTitle": {
+ "message": "Verifikation af skrivebordssynkronisering"
+ },
+ "desktopIntegrationVerificationText": {
+ "message": "Bekræft venligst at skrivebordsprogrammet viser dette fingeraftryk: "
+ },
+ "desktopIntegrationDisabledTitle": {
+ "message": "Browserintegration er ikke aktiveret"
+ },
+ "desktopIntegrationDisabledDesc": {
+ "message": "Browserintegration er ikke aktiveret i Bitwarden skrivebordsapplikationen. Aktivér det i indstillingerne i skrivebordsprogrammet."
+ },
+ "startDesktopTitle": {
+ "message": "Start Bitwarden skrivebordsapplikationen"
+ },
+ "startDesktopDesc": {
+ "message": "Bitwarden skrivebordsapplikationen skal startes, før denne funktion kan bruges."
+ },
+ "errorEnableBiometricTitle": {
+ "message": "Kan ikke aktivere biometri"
+ },
+ "errorEnableBiometricDesc": {
+ "message": "Handlingen blev annulleret af skrivebordsprogrammet"
+ },
+ "nativeMessagingInvalidEncryptionDesc": {
+ "message": "Skrivebordsapplikation ugyldiggjorde den sikre kommunikationskanal. Prøv denne handling igen"
+ },
+ "nativeMessagingInvalidEncryptionTitle": {
+ "message": "Skrivebordskommunikation afbrudt"
+ },
+ "nativeMessagingWrongUserDesc": {
+ "message": "Skrivebordsapplikationen er logget ind på en anden konto. Sørg for, at begge applikationer er logget ind på den samme konto."
+ },
+ "nativeMessagingWrongUserTitle": {
+ "message": "Konto mismatch"
+ },
+ "biometricsNotEnabledTitle": {
+ "message": "Biometri ikke aktiveret"
+ },
+ "biometricsNotEnabledDesc": {
+ "message": "Browserbiometri kræver, at desktop-biometri er aktiveret i indstillingerne først."
+ },
+ "biometricsNotSupportedTitle": {
+ "message": "Biometri ikke understøttet"
+ },
+ "biometricsNotSupportedDesc": {
+ "message": "Browserbiometri understøttes ikke på denne enhed."
+ },
+ "nativeMessaginPermissionErrorTitle": {
+ "message": "Tilladelse ikke givet"
+ },
+ "nativeMessaginPermissionErrorDesc": {
+ "message": "Uden tilladelse til at kommunikere med Bitwarden skrivebordsapplikationen kan vi ikke levere biometri i browserudvidelsen. Prøv igen."
+ },
+ "nativeMessaginPermissionSidebarTitle": {
+ "message": "Fejl ved anmodning om tilladelse"
+ },
+ "nativeMessaginPermissionSidebarDesc": {
+ "message": "Denne handling kan ikke udføres i sidebjælken, prøv handlingen igen i popup tilstand eller i et nyt vindue."
+ },
+ "personalOwnershipSubmitError": {
+ "message": "På grund af en virksomhedspolitik er du begrænset til at gemme elementer i din personlige boks. Skift ejerskabsindstillingen til en organisation, og vælg blandt de tilgængelige samlinger."
+ },
+ "personalOwnershipPolicyInEffect": {
+ "message": "En organisationspolitik påvirker dine ejerskabsmuligheder."
+ },
+ "excludedDomains": {
+ "message": "Ekskluderede domæner"
+ },
+ "excludedDomainsDesc": {
+ "message": "Bitwarden vil ikke bede om at gemme login-detaljer for disse domæner. Du skal opdatere siden for at ændringerne kan træde i kraft."
+ },
+ "excludedDomainsInvalidDomain": {
+ "message": "$DOMAIN$ er ikke et gyldigt domæne",
+ "placeholders": {
+ "domain": {
+ "content": "$1",
+ "example": "googlecom"
+ }
+ }
+ },
+ "send": {
+ "message": "Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "searchSends": {
+ "message": "Søg i Sends",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "addSend": {
+ "message": "Tilføj Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTypeText": {
+ "message": "Tekst"
+ },
+ "sendTypeFile": {
+ "message": "Fil"
+ },
+ "allSends": {
+ "message": "Alle Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "maxAccessCountReached": {
+ "message": "Maksimalt adgangsantal nået"
+ },
+ "expired": {
+ "message": "Udløbet"
+ },
+ "pendingDeletion": {
+ "message": "Afventer sletning"
+ },
+ "passwordProtected": {
+ "message": "Kodeordsbeskyttet"
+ },
+ "copySendLink": {
+ "message": "Kopiér Send link",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "removePassword": {
+ "message": "Fjern adgangskode"
+ },
+ "delete": {
+ "message": "Slet"
+ },
+ "removedPassword": {
+ "message": "Adgangskode fjernet"
+ },
+ "deletedSend": {
+ "message": "Send slettet",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendLink": {
+ "message": "Send link",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "disabled": {
+ "message": "Deaktiveret"
+ },
+ "removePasswordConfirmation": {
+ "message": "Er du sikker på, at du vil fjerne adgangskoden?"
+ },
+ "deleteSend": {
+ "message": "Slet Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "deleteSendConfirmation": {
+ "message": "Er du sikker på, at du vil slette denne Send?",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "editSend": {
+ "message": "Redigér Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTypeHeader": {
+ "message": "Hvilken type Send er denne?",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendNameDesc": {
+ "message": "Et venligt navn til at beskrive denne Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendFileDesc": {
+ "message": "Den fil, du vil sende."
+ },
+ "deletionDate": {
+ "message": "Sletningsdato"
+ },
+ "deletionDateDesc": {
+ "message": "Send'en slettes permanent på den angivne dato og tid.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "expirationDate": {
+ "message": "Udløbsdato"
+ },
+ "expirationDateDesc": {
+ "message": "Hvis angivet, vil adgangen til denne Send udløbe på den angivne dato og tidspunkt.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "oneDay": {
+ "message": "1 dag"
+ },
+ "days": {
+ "message": "$DAYS$ dage",
+ "placeholders": {
+ "days": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "custom": {
+ "message": "Tilpasset"
+ },
+ "maximumAccessCount": {
+ "message": "Maksimalt antal tilgange"
+ },
+ "maximumAccessCountDesc": {
+ "message": "Hvis opsat, vil brugere ikke længere kunne tilgå denne Send, når det maksimale adgangsantal er nået.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendPasswordDesc": {
+ "message": "Valgfrit brugeradgangskodekrav for at tilgå denne Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendNotesDesc": {
+ "message": "Private notater om denne Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendDisableDesc": {
+ "message": "Deaktivér denne Send, så ingen kan tilgå den.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendShareDesc": {
+ "message": "Kopiér denne Sends link til udklipsholderen når du gemmer.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTextDesc": {
+ "message": "Den tekst, du vil sende."
+ },
+ "sendHideText": {
+ "message": "Skjul denne Sends tekst som standard.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "currentAccessCount": {
+ "message": "Aktuelt antal tilgange"
+ },
+ "createSend": {
+ "message": "Opret ny Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "newPassword": {
+ "message": "Ny adgangskode"
+ },
+ "sendDisabled": {
+ "message": "Send deaktiveret",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendDisabledWarning": {
+ "message": "Du kan grundet en virksomhedspolitik kun slette en eksisterende Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "createdSend": {
+ "message": "Send oprettet",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "editedSend": {
+ "message": "Send opdateret",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendLinuxChromiumFileWarning": {
+ "message": "For at vælge en fil, åben udvidelsen i sidepanelet (om muligt) eller pop ud til et nyt vindue ved at klikke på dette banner."
+ },
+ "sendFirefoxFileWarning": {
+ "message": "For at vælge en fil i Firefox skal du flytte udvidelsen til sidepanelet eller åbne i et nyt vindue ved at klikke på dette banner."
+ },
+ "sendSafariFileWarning": {
+ "message": "For at vælge en fil i Safari skal du åbne i et nyt vindue ved at klikke på dette banner."
+ },
+ "sendFileCalloutHeader": {
+ "message": "Før du starter"
+ },
+ "sendFirefoxCustomDatePopoutMessage1": {
+ "message": "For at bruge en datovælger i kalenderstil skal du",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read '**To use a calendar style date picker ** click here to pop out your window.'"
+ },
+ "sendFirefoxCustomDatePopoutMessage2": {
+ "message": "klikke her",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker **click here** to pop out your window.'"
+ },
+ "sendFirefoxCustomDatePopoutMessage3": {
+ "message": "for at åbne dit vindue.",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker click here **to pop out your window.**'"
+ },
+ "expirationDateIsInvalid": {
+ "message": "Den angivne udløbsdato er ikke gyldig."
+ },
+ "deletionDateIsInvalid": {
+ "message": "Den angivne sletningsdato er ikke gyldig."
+ },
+ "expirationDateAndTimeRequired": {
+ "message": "Der kræves en udløbsdato og -tid."
+ },
+ "deletionDateAndTimeRequired": {
+ "message": "En sletningsdato og -tid er påkrævet."
+ },
+ "dateParsingError": {
+ "message": "Der opstod en fejl under forsøget på at gemme dine sletnings- og udløbsdatoer."
+ },
+ "hideEmail": {
+ "message": "Skjul min e-mailadresse for modtagere."
+ },
+ "sendOptionsPolicyInEffect": {
+ "message": "Én eller flere organisationspolitikker påvirker dine Send-valgmuligheder."
+ },
+ "passwordPrompt": {
+ "message": "Genanmodning om hovedadgangskode"
+ },
+ "passwordConfirmation": {
+ "message": "Bekræftelse af hovedadgangskode"
+ },
+ "passwordConfirmationDesc": {
+ "message": "Denne handling er beskyttet. For at fortsætte, indtast venligst din hovedadgangskode igen for at bekræfte din identitet."
+ },
+ "emailVerificationRequired": {
+ "message": "E-mailbekræftelse kræves"
+ },
+ "emailVerificationRequiredDesc": {
+ "message": "Du skal bekræfte din e-mail for at bruge denne funktion. Du kan bekræfte din e-mail i web-boksen."
+ },
+ "updatedMasterPassword": {
+ "message": "Hovedadgangskode opdateret"
+ },
+ "updateMasterPassword": {
+ "message": "Opdatér hovedadgangskode"
+ },
+ "updateMasterPasswordWarning": {
+ "message": "Your Master Password was recently changed by an administrator in your organization. In order to access the vault, you must update it now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour."
+ },
+ "resetPasswordPolicyAutoEnroll": {
+ "message": "Automatisk Indskrivning"
+ },
+ "resetPasswordAutoEnrollInviteWarning": {
+ "message": "This organization has an enterprise policy that will automatically enroll you in password reset. Enrollment will allow organization administrators to change your master password."
+ },
+ "selectFolder": {
+ "message": "Vælg mappe..."
+ },
+ "ssoCompleteRegistration": {
+ "message": "In order to complete logging in with SSO, please set a master password to access and protect your vault."
+ },
+ "hours": {
+ "message": "Timer"
+ },
+ "minutes": {
+ "message": "Minutter"
+ },
+ "vaultTimeoutPolicyInEffect": {
+ "message": "Your organization policies are affecting your vault timeout. Maximum allowed Vault Timeout is $HOURS$ hour(s) and $MINUTES$ minute(s)",
+ "placeholders": {
+ "hours": {
+ "content": "$1",
+ "example": "5"
+ },
+ "minutes": {
+ "content": "$2",
+ "example": "5"
+ }
+ }
+ },
+ "vaultTimeoutToLarge": {
+ "message": "Your vault timeout exceeds the restrictions set by your organization."
+ },
+ "vaultExportDisabled": {
+ "message": "Vault Export Disabled"
+ },
+ "personalVaultExportPolicyInEffect": {
+ "message": "One or more organization policies prevents you from exporting your personal vault."
+ },
+ "copyCustomFieldNameInvalidElement": {
+ "message": "Unable to identify a valid form element. Try inspecting the HTML instead."
+ },
+ "copyCustomFieldNameNotUnique": {
+ "message": "Ingen entydig identifikator fundet."
+ }
+}
diff --git a/src/iOS.Safari/Resources/_locales/de/messages.json b/src/iOS.Safari/Resources/_locales/de/messages.json
new file mode 100644
index 000000000..c77ec5f0e
--- /dev/null
+++ b/src/iOS.Safari/Resources/_locales/de/messages.json
@@ -0,0 +1,1817 @@
+{
+ "appName": {
+ "message": "Bitwarden"
+ },
+ "extName": {
+ "message": "Bitwarden - Kostenloser Passwortmanager",
+ "description": "Extension name, MUST be less than 40 characters (Safari restriction)"
+ },
+ "extDesc": {
+ "message": "Bitwarden ist ein sicherer und kostenloser Passwortmanager für all Ihre Geräte.",
+ "description": "Extension description"
+ },
+ "loginOrCreateNewAccount": {
+ "message": "Du musst dich anmelden oder einen neuen Account erstellen, um auf den Tresor zugreifen zu können."
+ },
+ "createAccount": {
+ "message": "Konto erstellen"
+ },
+ "login": {
+ "message": "Anmelden"
+ },
+ "enterpriseSingleSignOn": {
+ "message": "Enterprise Single Sign-On"
+ },
+ "cancel": {
+ "message": "Abbrechen"
+ },
+ "close": {
+ "message": "Schließen"
+ },
+ "submit": {
+ "message": "Absenden"
+ },
+ "emailAddress": {
+ "message": "E-Mail Adresse"
+ },
+ "masterPass": {
+ "message": "Master-Passwort"
+ },
+ "masterPassDesc": {
+ "message": "Das Master-Passwort wird verwendet, um den Tresor zu öffnen. Es ist sehr wichtig, dass du das Passwort nicht vergisst, da es keine Möglichkeit gibt es zurückzusetzen."
+ },
+ "masterPassHintDesc": {
+ "message": "Ein Master-Passwort-Hinweis kann dir helfen, dich an das Passwort zu erinnern, solltest du es vergessen."
+ },
+ "reTypeMasterPass": {
+ "message": "Master-Passwort wiederholen"
+ },
+ "masterPassHint": {
+ "message": "Master-Passwort-Hinweis (optional)"
+ },
+ "tab": {
+ "message": "Tab"
+ },
+ "myVault": {
+ "message": "Mein Tresor"
+ },
+ "tools": {
+ "message": "Werkzeuge"
+ },
+ "settings": {
+ "message": "Einstellungen"
+ },
+ "currentTab": {
+ "message": "Aktueller Tab"
+ },
+ "copyPassword": {
+ "message": "Passwort kopieren"
+ },
+ "copyNote": {
+ "message": "Notiz kopieren"
+ },
+ "copyUri": {
+ "message": "URI kopieren"
+ },
+ "copyUsername": {
+ "message": "Nutzernamen Kopieren"
+ },
+ "copyNumber": {
+ "message": "Nummer kopieren"
+ },
+ "copySecurityCode": {
+ "message": "Sicherheitscode kopieren"
+ },
+ "autoFill": {
+ "message": "Auto-Ausfüllen"
+ },
+ "generatePasswordCopied": {
+ "message": "Passwort generieren (kopiert)"
+ },
+ "copyElementIdentifier": {
+ "message": "Benutzerdefinierten Feldnamen kopieren"
+ },
+ "noMatchingLogins": {
+ "message": "Keine passenden Zugangsdaten."
+ },
+ "vaultLocked": {
+ "message": "Der Tresor ist gesperrt."
+ },
+ "vaultLoggedOut": {
+ "message": "Der Tresor ist ausgeloggt."
+ },
+ "autoFillInfo": {
+ "message": "Für den aktuellen Browser-Tab gibt es keine passenden Zugangsdaten, welche automatisch ausgefüllt werden können."
+ },
+ "addLogin": {
+ "message": "Zugangsdaten hinzufügen"
+ },
+ "addItem": {
+ "message": "Neuer Eintrag"
+ },
+ "passwordHint": {
+ "message": "Passwort-Hinweis"
+ },
+ "enterEmailToGetHint": {
+ "message": "Gib die E-Mail-Adresse deines Kontos ein, um den Hinweis für dein Master-Passwort zu erhalten."
+ },
+ "getMasterPasswordHint": {
+ "message": "Hinweis zum Masterpasswort erhalten"
+ },
+ "continue": {
+ "message": "Weiter"
+ },
+ "verificationCode": {
+ "message": "Verifizierungscode"
+ },
+ "account": {
+ "message": "Konto"
+ },
+ "changeMasterPassword": {
+ "message": "Master-Passwort ändern"
+ },
+ "fingerprintPhrase": {
+ "message": "Prüfschlüssel",
+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
+ },
+ "yourAccountsFingerprint": {
+ "message": "Prüfschlüssel für deinen Account",
+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
+ },
+ "twoStepLogin": {
+ "message": "Zwei-Faktor Authentifizierung"
+ },
+ "logOut": {
+ "message": "Abmelden"
+ },
+ "about": {
+ "message": "Über uns"
+ },
+ "version": {
+ "message": "Version"
+ },
+ "save": {
+ "message": "Speichern"
+ },
+ "move": {
+ "message": "Verschieben"
+ },
+ "addFolder": {
+ "message": "Ordner hinzufügen"
+ },
+ "name": {
+ "message": "Name"
+ },
+ "editFolder": {
+ "message": "Ordner bearbeiten"
+ },
+ "deleteFolder": {
+ "message": "Ordner löschen"
+ },
+ "folders": {
+ "message": "Ordner"
+ },
+ "noFolders": {
+ "message": "Es gibt keine Ordner zum Anzeigen."
+ },
+ "helpFeedback": {
+ "message": "Hilfe & Feedback"
+ },
+ "sync": {
+ "message": "Synchronisierung"
+ },
+ "syncVaultNow": {
+ "message": "Tresor jetzt synchronisieren"
+ },
+ "lastSync": {
+ "message": "Letzte Synchronisation:"
+ },
+ "passGen": {
+ "message": "Passwort-Generator"
+ },
+ "generator": {
+ "message": "Generator",
+ "description": "Short for 'Password Generator'."
+ },
+ "passGenInfo": {
+ "message": "Generiert automatisch ein starkes und einzigartiges Passwort."
+ },
+ "bitWebVault": {
+ "message": "Bitwarden Web-Tresor"
+ },
+ "importItems": {
+ "message": "Einträge importieren"
+ },
+ "select": {
+ "message": "Auswählen"
+ },
+ "generatePassword": {
+ "message": "Passwort generieren"
+ },
+ "regeneratePassword": {
+ "message": "Password neu generieren"
+ },
+ "options": {
+ "message": "Optionen"
+ },
+ "length": {
+ "message": "Länge"
+ },
+ "numWords": {
+ "message": "Anzahl der Wörter"
+ },
+ "wordSeparator": {
+ "message": "Trennzeichen"
+ },
+ "capitalize": {
+ "message": "Großschreiben",
+ "description": "Make the first letter of a work uppercase."
+ },
+ "includeNumber": {
+ "message": "Ziffer hinzufügen"
+ },
+ "minNumbers": {
+ "message": "Mindestanzahl Zahlen"
+ },
+ "minSpecial": {
+ "message": "Mindestanzahl Sonderzeichen"
+ },
+ "avoidAmbChar": {
+ "message": "Mehrdeutige Zeichen vermeiden"
+ },
+ "searchVault": {
+ "message": "Tresor durchsuchen"
+ },
+ "edit": {
+ "message": "Bearbeiten"
+ },
+ "view": {
+ "message": "Anzeigen"
+ },
+ "noItemsInList": {
+ "message": "Keine Einträge zum Anzeigen vorhanden."
+ },
+ "itemInformation": {
+ "message": "Eintrags-Information"
+ },
+ "username": {
+ "message": "Nutzername"
+ },
+ "password": {
+ "message": "Passwort"
+ },
+ "passphrase": {
+ "message": "Passphrase"
+ },
+ "favorite": {
+ "message": "Favoriten"
+ },
+ "notes": {
+ "message": "Notizen"
+ },
+ "note": {
+ "message": "Notiz"
+ },
+ "editItem": {
+ "message": "Eintrag bearbeiten"
+ },
+ "folder": {
+ "message": "Ordner"
+ },
+ "deleteItem": {
+ "message": "Eintrag löschen"
+ },
+ "viewItem": {
+ "message": "Eintrag anzeigen"
+ },
+ "launch": {
+ "message": "Öffnen"
+ },
+ "website": {
+ "message": "Webseite"
+ },
+ "toggleVisibility": {
+ "message": "Sichtbarkeit umschalten"
+ },
+ "manage": {
+ "message": "Verwalten"
+ },
+ "other": {
+ "message": "Sonstige"
+ },
+ "rateExtension": {
+ "message": "Bewerte die Erweiterung"
+ },
+ "rateExtensionDesc": {
+ "message": "Wir würden uns freuen, wenn du uns mit einer positiven Bewertung helfen könntest!"
+ },
+ "browserNotSupportClipboard": {
+ "message": "Den Browser unterstützt das einfache Kopieren nicht. Bitte kopiere es manuell."
+ },
+ "verifyMasterPassword": {
+ "message": "Master-Passwort verifizieren"
+ },
+ "yourVaultIsLocked": {
+ "message": "Dein Tresor ist gesperrt. Überprüfe dein Master-Passwort um fortzufahren."
+ },
+ "unlock": {
+ "message": "Entsperren"
+ },
+ "loggedInAsOn": {
+ "message": "Eingeloggt als $EMAIL$ auf $HOSTNAME$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "name@example.com"
+ },
+ "hostname": {
+ "content": "$2",
+ "example": "bitwarden.com"
+ }
+ }
+ },
+ "invalidMasterPassword": {
+ "message": "Ungültiges Master-Passwort"
+ },
+ "vaultTimeout": {
+ "message": "Tresor-Timeout"
+ },
+ "lockNow": {
+ "message": "Jetzt sperren"
+ },
+ "immediately": {
+ "message": "Sofort"
+ },
+ "tenSeconds": {
+ "message": "10 Sekunden"
+ },
+ "twentySeconds": {
+ "message": "20 Sekunden"
+ },
+ "thirtySeconds": {
+ "message": "30 Sekunden"
+ },
+ "oneMinute": {
+ "message": "1 Minute"
+ },
+ "twoMinutes": {
+ "message": "2 Minuten"
+ },
+ "fiveMinutes": {
+ "message": "5 Minuten"
+ },
+ "fifteenMinutes": {
+ "message": "15 Minuten"
+ },
+ "thirtyMinutes": {
+ "message": "30 Minuten"
+ },
+ "oneHour": {
+ "message": "1 Stunde"
+ },
+ "fourHours": {
+ "message": "4 Stunde"
+ },
+ "onLocked": {
+ "message": "Wenn System gesperrt"
+ },
+ "onRestart": {
+ "message": "Bei Browser-Neustart"
+ },
+ "never": {
+ "message": "Nie"
+ },
+ "security": {
+ "message": "Sicherheit"
+ },
+ "errorOccurred": {
+ "message": "Ein Fehler ist aufgetaucht"
+ },
+ "emailRequired": {
+ "message": "Die E-Mail Adresse wird benötigt."
+ },
+ "invalidEmail": {
+ "message": "Ungültige E-Mail Adresse."
+ },
+ "masterPassRequired": {
+ "message": "Das Master-Passwort wird benötigt."
+ },
+ "masterPassLength": {
+ "message": "Das Master-Passwort muss mindestens 8 Zeichen lang sein."
+ },
+ "masterPassDoesntMatch": {
+ "message": "Die Master-Passwort-Wiederholung stimmt nicht überein."
+ },
+ "newAccountCreated": {
+ "message": "Dein neues Konto wurde erstellt! Du kannst dich jetzt anmelden."
+ },
+ "masterPassSent": {
+ "message": "Wir haben dir eine E-Mail mit dem Master-Passwort-Hinweis geschickt."
+ },
+ "verificationCodeRequired": {
+ "message": "Verifizierungscode wird benötigt."
+ },
+ "valueCopied": {
+ "message": "$VALUE$ kopiert",
+ "description": "Value has been copied to the clipboard.",
+ "placeholders": {
+ "value": {
+ "content": "$1",
+ "example": "Password"
+ }
+ }
+ },
+ "autofillError": {
+ "message": "Die Felder dieser Seite konnten nicht automatisch ausgefüllt werden. Bitte Nutzernamen und/oder Passwort manuell kopieren."
+ },
+ "loggedOut": {
+ "message": "Ausgeloggt"
+ },
+ "loginExpired": {
+ "message": "Ihre Login-Sitzung ist abgelaufen."
+ },
+ "logOutConfirmation": {
+ "message": "Bist du sicher, dass du dich abmelden willst?"
+ },
+ "yes": {
+ "message": "Ja"
+ },
+ "no": {
+ "message": "Nein"
+ },
+ "unexpectedError": {
+ "message": "Ein unerwarteter Fehler ist aufgetreten."
+ },
+ "nameRequired": {
+ "message": "Der Name wird benötigt."
+ },
+ "addedFolder": {
+ "message": "Ordner hinzugefügt"
+ },
+ "changeMasterPass": {
+ "message": "Master-Passwort ändern"
+ },
+ "changeMasterPasswordConfirmation": {
+ "message": "Du kannst dein Master-Passwort im Bitwarden.com Web-Tresor ändern. Möchtest du die Seite jetzt öffnen?"
+ },
+ "twoStepLoginConfirmation": {
+ "message": "Mit der Zwei-Faktor Authentifizierung wird dein Account zusätzlich abgesichert, da jede Anmeldung durch einen Sicherheitscode, eine Authentifizierungs-App, SMS, einen Anruf oder eine E-Mail verifiziert werden muss. Die Zwei-Faktor Authentifizierung kann im Bitwarden.com Web-Tresor aktiviert werden. Möchtest du die Seite jetzt öffnen?"
+ },
+ "editedFolder": {
+ "message": "Ordner bearbeitet"
+ },
+ "deleteFolderConfirmation": {
+ "message": "Soll dieser Ordner wirklich gelöscht werden?"
+ },
+ "deletedFolder": {
+ "message": "Ordner gelöscht"
+ },
+ "gettingStartedTutorial": {
+ "message": "Erste Schritte Anleitung"
+ },
+ "gettingStartedTutorialVideo": {
+ "message": "Sieh dir unser Tutorial an, um hilfreiche Tipps zum Umgang mit der Browser-Erweiterung zu erfahren."
+ },
+ "syncingComplete": {
+ "message": "Synchronisierung abgeschlossen"
+ },
+ "syncingFailed": {
+ "message": "Synchronisierung fehlgeschlagen"
+ },
+ "passwordCopied": {
+ "message": "Passwort kopiert"
+ },
+ "uri": {
+ "message": "URI"
+ },
+ "uriPosition": {
+ "message": "URI $POSITION$",
+ "description": "A listing of URIs. Ex: URI 1, URI 2, URI 3, etc.",
+ "placeholders": {
+ "position": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "newUri": {
+ "message": "Neue URL"
+ },
+ "addedItem": {
+ "message": "Neuer Eintrag"
+ },
+ "editedItem": {
+ "message": "Eintrag bearbeitet"
+ },
+ "deleteItemConfirmation": {
+ "message": "Soll dieser Eintrag wirklich in den Papierkorb verschoben werden?"
+ },
+ "deletedItem": {
+ "message": "Eintrag in Papierkorb verschoben"
+ },
+ "overwritePassword": {
+ "message": "Passwort ersetzen"
+ },
+ "overwritePasswordConfirmation": {
+ "message": "Sind Sie sicher, dass Sie das aktuelle Passwort ersetzen möchten?"
+ },
+ "searchFolder": {
+ "message": "Ordner durchsuchen"
+ },
+ "searchCollection": {
+ "message": "Sammlung durchsuchen"
+ },
+ "searchType": {
+ "message": "Suchmodus"
+ },
+ "noneFolder": {
+ "message": "Kein Ordner",
+ "description": "This is the folder for uncategorized items"
+ },
+ "disableAddLoginNotification": {
+ "message": "\"Login hinzufügen\" Benachrichtigung deaktivieren"
+ },
+ "addLoginNotificationDesc": {
+ "message": "Die \"Login hinzufügen\" Benachrichtigung fragt dich automatisch ob du neue Zugangsdaten im Tresor speichern möchtest wenn du dich zum ersten mal mit ihnen anmeldest."
+ },
+ "dontShowCardsCurrentTab": {
+ "message": "Zeige keine Karten auf der Tab Seite"
+ },
+ "dontShowCardsCurrentTabDesc": {
+ "message": "Karten Daten aus deinem Tresors werden unter 'Tab' aufgeführt um automatisches ausfüllen zu vereinfachen."
+ },
+ "dontShowIdentitiesCurrentTab": {
+ "message": "Zeige keine Identitäten auf der Tab Seite"
+ },
+ "dontShowIdentitiesCurrentTabDesc": {
+ "message": "Identitäts Daten aus deinem Tresors werden unter 'Tab' aufgeführt um automatisches ausfüllen zu vereinfachen."
+ },
+ "clearClipboard": {
+ "message": "Zwischenablage leeren",
+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
+ },
+ "clearClipboardDesc": {
+ "message": "Kopierten Inhalt automatisch aus der Zwischenablage löschen.",
+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
+ },
+ "notificationAddDesc": {
+ "message": "Soll Bitwarden sich dieses Passwort merken?"
+ },
+ "notificationAddSave": {
+ "message": "Ja, jetzt speichern"
+ },
+ "notificationNeverSave": {
+ "message": "Niemals für diese Webseite"
+ },
+ "disableChangedPasswordNotification": {
+ "message": "Passwort geändert Benachrichtigung deaktivieren"
+ },
+ "disableChangedPasswordNotificationDesc": {
+ "message": "Die \"Passwort geändert Benachrichtigung\" fragt automatisch nach, ein Passwort in deinem Tressor zu aktualisieren, sobald erkannt wurde das du es auf einer Webseite geändert hast."
+ },
+ "notificationChangeDesc": {
+ "message": "Möchtest du dieses Passwort in Bitwarden aktualisieren?"
+ },
+ "notificationChangeSave": {
+ "message": "Ja, jetzt aktualisieren"
+ },
+ "disableContextMenuItem": {
+ "message": "Kontextmenü-Optionen deaktivieren"
+ },
+ "disableContextMenuItemDesc": {
+ "message": "Kontextmenü-Optionen bieten schnellen Zugriff auf die Passwortgenerierung und Zugangsdaten für die Webseite in Ihrem aktuellen Tab."
+ },
+ "defaultUriMatchDetection": {
+ "message": "Standard-URI-Match-Erkennung",
+ "description": "Default URI match detection for auto-fill."
+ },
+ "defaultUriMatchDetectionDesc": {
+ "message": "Wähle die Standardmethode, mit der die URI-Match-Erkennung für Anmeldungen bei Aktionen wie dem automatischen Ausfüllen behandelt wird."
+ },
+ "theme": {
+ "message": "Design"
+ },
+ "themeDesc": {
+ "message": "Ändere das Farbschema der Anwendung."
+ },
+ "dark": {
+ "message": "Dunkel",
+ "description": "Dark color"
+ },
+ "light": {
+ "message": "Hell",
+ "description": "Light color"
+ },
+ "solarizedDark": {
+ "message": "Solarized Dark",
+ "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated."
+ },
+ "exportVault": {
+ "message": "Tresor exportieren"
+ },
+ "fileFormat": {
+ "message": "Dateiformat"
+ },
+ "warning": {
+ "message": "ACHTUNG",
+ "description": "WARNING (should stay in capitalized letters if the language permits)"
+ },
+ "confirmVaultExport": {
+ "message": "Tresor-Export bestätigen"
+ },
+ "exportWarningDesc": {
+ "message": "Dieser Export enthält deine unverschlüsselten Daten im Csv-Format. Du solltest sie nicht speichern oder über unsichere Kanäle (z. B. E-Mail) senden. Lösche sie sofort nach ihrer Verwendung."
+ },
+ "encExportKeyWarningDesc": {
+ "message": "Dieser Export verschlüsselt deine Daten mit dem Verschlüsselungscode deines Kontos. Falls du deinen Verschlüsselungscode erneuerst, solltest du den Export erneut durchführen, da du die zuvor erstellte Datei ansonsten nicht mehr entschlüsseln kannst."
+ },
+ "encExportAccountWarningDesc": {
+ "message": "Die Verschlüsselungscodes eines Kontos sind für jedes Bitwarden Benutzerkonto einzigartig, deshalb kannst du keinen verschlüsselten Export in ein anderes Konto importieren."
+ },
+ "exportMasterPassword": {
+ "message": "Gib das Masterpasswort ein, um deine Tresordaten zu exportieren."
+ },
+ "shared": {
+ "message": "Geteilt"
+ },
+ "learnOrg": {
+ "message": "Erfahre mehr über Organisationen"
+ },
+ "learnOrgConfirmation": {
+ "message": "Bitwarden erlaubt es dir, deine Tresor-Einträge mit anderen zu teilen, wenn du eine Organisation verwendest. Möchtest du bitwarden.com besuchen, um mehr zu erfahren?"
+ },
+ "moveToOrganization": {
+ "message": "In Organisation verschieben"
+ },
+ "share": {
+ "message": "Teilen"
+ },
+ "movedItemToOrg": {
+ "message": "$ITEMNAME$ verschoben nach $ORGNAME$",
+ "placeholders": {
+ "itemname": {
+ "content": "$1",
+ "example": "Secret Item"
+ },
+ "orgname": {
+ "content": "$2",
+ "example": "Company Name"
+ }
+ }
+ },
+ "moveToOrgDesc": {
+ "message": "Wähle eine Organisation aus, in die du diesen Eintrag verschieben möchtest. Das Verschieben in eine Organisation überträgt das Eigentum an diese Organisation. Du bist nicht mehr der direkte Besitzer dieses Eintrags, sobald er verschoben wurde."
+ },
+ "learnMore": {
+ "message": "Erfahre mehr"
+ },
+ "authenticatorKeyTotp": {
+ "message": "Authenticator Schlüssel (TOTP)"
+ },
+ "verificationCodeTotp": {
+ "message": "Verifizierungscode (TOTP)"
+ },
+ "copyVerificationCode": {
+ "message": "Kopiere Verifizierungscode"
+ },
+ "attachments": {
+ "message": "Anhänge"
+ },
+ "deleteAttachment": {
+ "message": "Anhang löschen"
+ },
+ "deleteAttachmentConfirmation": {
+ "message": "Möchtest du diesen Anhang wirklich löschen?"
+ },
+ "deletedAttachment": {
+ "message": "Gelöschter Anhang"
+ },
+ "newAttachment": {
+ "message": "Anhang hinzufügen"
+ },
+ "noAttachments": {
+ "message": "Keine Anhänge."
+ },
+ "attachmentSaved": {
+ "message": "Der Anhang wurde gespeichert."
+ },
+ "file": {
+ "message": "Datei"
+ },
+ "selectFile": {
+ "message": "Wähle eine Datei."
+ },
+ "maxFileSize": {
+ "message": "Die maximale Dateigröße beträgt 500 MB."
+ },
+ "featureUnavailable": {
+ "message": "Funktion nicht verfügbar"
+ },
+ "updateKey": {
+ "message": "Du kannst diese Funktion nicht nutzen, solange du deinen Verschlüsselungsschlüssel nicht aktualisiert hast."
+ },
+ "premiumMembership": {
+ "message": "Premium-Mitgliedschaft"
+ },
+ "premiumManage": {
+ "message": "Mitgliedschaft verwalten"
+ },
+ "premiumManageAlert": {
+ "message": "Du kannst deine Mitgliedschaft im Bitwarden.com Webtresor verwalten. Möchtest du die Seite jetzt aufrufen?"
+ },
+ "premiumRefresh": {
+ "message": "Mitgliedschaft erneuern"
+ },
+ "premiumNotCurrentMember": {
+ "message": "Du hast derzeit keine Premium-Mitgliedschaft."
+ },
+ "premiumSignUpAndGet": {
+ "message": "Werde Premium-Mitglied und erhalte dafür:"
+ },
+ "ppremiumSignUpStorage": {
+ "message": "1 GB verschlüsselter Speicherplatz für Dateianhänge."
+ },
+ "ppremiumSignUpTwoStep": {
+ "message": "Zusätzliche Zweifaktor-Anmeldung über YubiKey, FIDO U2F, und Duo."
+ },
+ "ppremiumSignUpReports": {
+ "message": "Berichte über Kennworthygiene, Kontostatus und Datenschutzverletzungen, um deinen Tresor sicher zu halten."
+ },
+ "ppremiumSignUpTotp": {
+ "message": "TOTP Prüfcode (2FA) Generator für Anmeldungen in Ihrem Tresor."
+ },
+ "ppremiumSignUpSupport": {
+ "message": "Vorrangiger Kunden-Support."
+ },
+ "ppremiumSignUpFuture": {
+ "message": "Alle zukünftigen Premium-Features. Mehr in Kürze!"
+ },
+ "premiumPurchase": {
+ "message": "Premium-Mitgliedschaft kaufen"
+ },
+ "premiumPurchaseAlert": {
+ "message": "Du kannst deine Premium-Mitgliedschaft im Bitwarden.com Web-Tresor kaufen. Möchtest du die Webseite jetzt besuchen?"
+ },
+ "premiumCurrentMember": {
+ "message": "Du bist jetzt Premium-Mitglied!"
+ },
+ "premiumCurrentMemberThanks": {
+ "message": "Vielen Dank, dass du Bitwarden unterstützt."
+ },
+ "premiumPrice": {
+ "message": "Das alles für %price% pro Jahr!",
+ "placeholders": {
+ "price": {
+ "content": "$1",
+ "example": "$10"
+ }
+ }
+ },
+ "refreshComplete": {
+ "message": "Aktualisierung abgeschlossen"
+ },
+ "disableAutoTotpCopy": {
+ "message": "Automatisches TOTP Kopieren deaktivieren"
+ },
+ "disableAutoTotpCopyDesc": {
+ "message": "Ist ein Authentifizierungsschlüssel mit deinen Zugangsdaten verknüpft, wird der TOTP Bestätigungscode automatisch in die Zwischenablage kopiert, wenn du die Zugangsdaten einfügen lässt."
+ },
+ "disableAutoBiometricsPrompt": {
+ "message": "Beim Start nicht nach biometrischen Daten fragen"
+ },
+ "premiumRequired": {
+ "message": "Premium-Mitgliedschaft wird benötigt"
+ },
+ "premiumRequiredDesc": {
+ "message": "Eine Premium-Mitgliedschaft ist für diese Funktion notwendig."
+ },
+ "enterVerificationCodeApp": {
+ "message": "Gib den 6-stelligen Verifizierungscode aus deiner Authenticator App ein."
+ },
+ "enterVerificationCodeEmail": {
+ "message": "Gib den 6-stelligen Bestätigungscode ein, der an $EMAIL$ gesendet wurde.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "example@gmail.com"
+ }
+ }
+ },
+ "verificationCodeEmailSent": {
+ "message": "Verifizierungsmail wurde an $EMAIL$ gesendet.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "example@gmail.com"
+ }
+ }
+ },
+ "rememberMe": {
+ "message": "Angemeldet bleiben"
+ },
+ "sendVerificationCodeEmailAgain": {
+ "message": "E-Mail mit Bestätigungscode erneut versenden"
+ },
+ "useAnotherTwoStepMethod": {
+ "message": "Verwende eine andere zweistufige Login-Methode"
+ },
+ "insertYubiKey": {
+ "message": "Stecke deinen YubiKey in den USB-Port Ihres Computers, dann berühre den Button."
+ },
+ "insertU2f": {
+ "message": "Stecke deinen Sicherheitsschlüssel in den USB-Port deines Computers. Falls ein Knopf vorhanden ist, berühre diesen."
+ },
+ "webAuthnNewTab": {
+ "message": "Um die WebAuthn 2FA Verifizierung zu starten, klicke auf die Schaltfläche unten, um einen neuen Tab zu öffnen und folge den Anweisungen, die im neuen Tab angezeigt werden."
+ },
+ "webAuthnNewTabOpen": {
+ "message": "Neuen Tab öffnen"
+ },
+ "webAuthnAuthenticate": {
+ "message": "Authentifiziere WebAuthn"
+ },
+ "loginUnavailable": {
+ "message": "Login nicht verfügbar"
+ },
+ "noTwoStepProviders": {
+ "message": "Dieses Konto hat eine aktive Zwei-Faktor Authentifizierung, allerdings wird keiner der konfigurierten Zwei-Faktor Anbieter von diesem Browser unterstützt."
+ },
+ "noTwoStepProviders2": {
+ "message": "Bitte benutze einen unterstützten Browser (z.B. Chrome) und / oder füge zusätzliche Anbieter hinzu, die von mehr Browsern unterstützt werden (wie eine Authentifizierungs-App)."
+ },
+ "twoStepOptions": {
+ "message": "Optionen für Zwei-Faktor Authentifizierung"
+ },
+ "recoveryCodeDesc": {
+ "message": "Zugang zu allen Zwei-Faktor Anbietern verloren? Benutze deinen Wiederherstellungscode, um alle Zwei-Faktor Anbieter in deinem Konto zu deaktivieren."
+ },
+ "recoveryCodeTitle": {
+ "message": "Wiederherstellungscode"
+ },
+ "authenticatorAppTitle": {
+ "message": "Authentifizierungs-App"
+ },
+ "authenticatorAppDesc": {
+ "message": "Verwende eine Authentifizierungs-App (wie zum Beispiel Authy oder Google Authenticator), um zeitbasierte Verifizierungscodes zu generieren.",
+ "description": "'Authy' and 'Google Authenticator' are product names and should not be translated."
+ },
+ "yubiKeyTitle": {
+ "message": "YubiKey OTP Sicherheitsschlüssel"
+ },
+ "yubiKeyDesc": {
+ "message": "Verwende einen YubiKey um auf dein Konto zuzugreifen. Funtioniert mit YubiKey 4, Nano 4, 4C und NEO Geräten."
+ },
+ "duoDesc": {
+ "message": "Verifiziere mit Duo Security, indem du die Duo Mobile App, SMS, Anrufe oder U2F Sicherheitsschlüssel benutzt.",
+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
+ },
+ "duoOrganizationDesc": {
+ "message": "Nutze Duo Security um dich mit der Duo Mobile App, SMS, per Anruf oder U2F Security Key bei deiner Organisation zu verifizieren.",
+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
+ },
+ "webAuthnTitle": {
+ "message": "FIDO2 WebAuthn"
+ },
+ "webAuthnDesc": {
+ "message": "Benutze einen WebAuthn-kompatiblen Sicherheitsschlüssel, um auf dein Konto zuzugreifen."
+ },
+ "emailTitle": {
+ "message": "E-Mail"
+ },
+ "emailDesc": {
+ "message": "Bestätigungscodes werden Ihnen per E-Mail zugesandt."
+ },
+ "selfHostedEnvironment": {
+ "message": "Selbstgehostete Umgebung"
+ },
+ "selfHostedEnvironmentFooter": {
+ "message": "Bitte gib die Basis-URL deiner selbst gehosteten Bitwarden-Installation an."
+ },
+ "customEnvironment": {
+ "message": "Benutzerdefinierte Umgebung"
+ },
+ "customEnvironmentFooter": {
+ "message": "Für fortgeschrittene Benutzer. Du kannst die Basis-URL der jeweiligen Dienste unabhängig voneinander festlegen."
+ },
+ "baseUrl": {
+ "message": "Server URL"
+ },
+ "apiUrl": {
+ "message": "API Server URL"
+ },
+ "webVaultUrl": {
+ "message": "Web-Tresor Server URL"
+ },
+ "identityUrl": {
+ "message": "URL des Identitätsservers"
+ },
+ "notificationsUrl": {
+ "message": "URL des Benachrichtigungsserver"
+ },
+ "iconsUrl": {
+ "message": "Icons Server URL"
+ },
+ "environmentSaved": {
+ "message": "Die URLs der Umgebung wurden gespeichert."
+ },
+ "enableAutoFillOnPageLoad": {
+ "message": "Auto-Ausfüllen beim Seitenladen aktivieren"
+ },
+ "enableAutoFillOnPageLoadDesc": {
+ "message": "Wenn eine Zugangsmaske erkannt wird, füge automatisch die Zugangsdaten ein während die Webseite lädt."
+ },
+ "experimentalFeature": {
+ "message": "Dies ist derzeit ein experimentelles Feature. Verwendung auf eigene Gefahr."
+ },
+ "defaultAutoFillOnPageLoad": {
+ "message": "Standard Auto-Ausfüllen Einstellung für Login-Einträge"
+ },
+ "defaultAutoFillOnPageLoadDesc": {
+ "message": "Nachdem du das automatische Ausfüllen beim Laden der Seite aktiviert hast, kannst du die Funktion für einzelne Login-Einträge aktivieren oder deaktivieren. Dies ist die Standardeinstellung für Login-Einträge, die nicht separat konfiguriert wurden."
+ },
+ "itemAutoFillOnPageLoad": {
+ "message": "Automatisches Ausfüllen beim Laden der Seite (wenn in Optionen aktiviert)"
+ },
+ "autoFillOnPageLoadUseDefault": {
+ "message": "Nutze Standardeinstellung"
+ },
+ "autoFillOnPageLoadYes": {
+ "message": "Automatisches Ausfüllen beim Laden der Seite"
+ },
+ "autoFillOnPageLoadNo": {
+ "message": "Kein automatisches Ausfüllen beim Laden der Seite"
+ },
+ "commandOpenPopup": {
+ "message": "Tresor-Popup öffnen"
+ },
+ "commandOpenSidebar": {
+ "message": "Tresor in der Seitenleiste öffnen"
+ },
+ "commandAutofillDesc": {
+ "message": "Die zuletzt verwendeten Zugangsdaten für die aktuelle Website automatisch ausfüllen lassen"
+ },
+ "commandGeneratePasswordDesc": {
+ "message": "Ein neues zufälliges Passwort generieren und in die Zwischenablage kopieren"
+ },
+ "commandLockVaultDesc": {
+ "message": "Den Tresor sperren"
+ },
+ "privateModeMessage": {
+ "message": "Leider ist dieses Fenster nicht im privaten Modus für diesen Browser verfügbar."
+ },
+ "customFields": {
+ "message": "Benutzerdefinierte Felder"
+ },
+ "copyValue": {
+ "message": "Wert kopieren"
+ },
+ "value": {
+ "message": "Inhalt"
+ },
+ "newCustomField": {
+ "message": "Neues benutzerdefiniertes Feld"
+ },
+ "dragToSort": {
+ "message": "Zum Sortieren ziehen"
+ },
+ "cfTypeText": {
+ "message": "Text"
+ },
+ "cfTypeHidden": {
+ "message": "Versteckt"
+ },
+ "cfTypeBoolean": {
+ "message": "Ja/Nein"
+ },
+ "popup2faCloseMessage": {
+ "message": "Dieses Pop-up Fenster wird geschlossen, wenn du außerhalb des Fensters klickst um in deinen E-Mails nach dem Verifizierungscode zu suchen. Möchtest du, dass dieses Pop-up in einem separaten Fenster geöffnet wird, damit es nicht geschlossen wird?"
+ },
+ "popupU2fCloseMessage": {
+ "message": "Dieser Browser kann U2F-Anfragen in diesem Popup-Fenster nicht verarbeiten. Möchtest du dieses Popup in einem neuen Fenster öffnen, damit du dich mit U2F anmelden kannst?"
+ },
+ "disableFavicon": {
+ "message": "Icons der Website deaktivieren"
+ },
+ "disableFaviconDesc": {
+ "message": "Website-Symbole zeigen ein erkennbares Bild neben jedem Login in deinem Tresor."
+ },
+ "disableBadgeCounter": {
+ "message": "Badge-Zähler deaktivieren"
+ },
+ "disableBadgeCounterDesc": {
+ "message": "Der Badge-Zähler zeigt an, wie viele Zugangsdaten du für die aktuelle Seite in deinem Tresor hast."
+ },
+ "cardholderName": {
+ "message": "Name des Karteninhabers"
+ },
+ "number": {
+ "message": "Nummer"
+ },
+ "brand": {
+ "message": "Marke"
+ },
+ "expirationMonth": {
+ "message": "Ablaufmonat"
+ },
+ "expirationYear": {
+ "message": "Ablaufjahr"
+ },
+ "expiration": {
+ "message": "Gültig bis"
+ },
+ "january": {
+ "message": "Januar"
+ },
+ "february": {
+ "message": "Februar"
+ },
+ "march": {
+ "message": "März"
+ },
+ "april": {
+ "message": "April"
+ },
+ "may": {
+ "message": "Mai"
+ },
+ "june": {
+ "message": "Juni"
+ },
+ "july": {
+ "message": "Juli"
+ },
+ "august": {
+ "message": "August"
+ },
+ "september": {
+ "message": "September"
+ },
+ "october": {
+ "message": "Oktober"
+ },
+ "november": {
+ "message": "November"
+ },
+ "december": {
+ "message": "Dezember"
+ },
+ "securityCode": {
+ "message": "Sicherheitscode"
+ },
+ "ex": {
+ "message": "Bsp."
+ },
+ "title": {
+ "message": "Titel"
+ },
+ "mr": {
+ "message": "Herr"
+ },
+ "mrs": {
+ "message": "Frau"
+ },
+ "ms": {
+ "message": "Frau"
+ },
+ "dr": {
+ "message": "Dr."
+ },
+ "firstName": {
+ "message": "Vorname"
+ },
+ "middleName": {
+ "message": "Zweiter Vorname"
+ },
+ "lastName": {
+ "message": "Nachname"
+ },
+ "identityName": {
+ "message": "Identitätsname"
+ },
+ "company": {
+ "message": "Firma"
+ },
+ "ssn": {
+ "message": "Sozialversicherungsnummer"
+ },
+ "passportNumber": {
+ "message": "Reisepassnummer"
+ },
+ "licenseNumber": {
+ "message": "Führerscheinnummer"
+ },
+ "email": {
+ "message": "E-Mail"
+ },
+ "phone": {
+ "message": "Telefon"
+ },
+ "address": {
+ "message": "Adresse"
+ },
+ "address1": {
+ "message": "Adresse 1"
+ },
+ "address2": {
+ "message": "Adresse 2"
+ },
+ "address3": {
+ "message": "Adresse 3"
+ },
+ "cityTown": {
+ "message": "Stadt oder Ort"
+ },
+ "stateProvince": {
+ "message": "Bundesland"
+ },
+ "zipPostalCode": {
+ "message": "Postleitzahl"
+ },
+ "country": {
+ "message": "Land"
+ },
+ "type": {
+ "message": "Typ"
+ },
+ "typeLogin": {
+ "message": "Zugangsdaten"
+ },
+ "typeLogins": {
+ "message": "Zugangsdaten"
+ },
+ "typeSecureNote": {
+ "message": "Sichere Notiz"
+ },
+ "typeCard": {
+ "message": "Karte"
+ },
+ "typeIdentity": {
+ "message": "Identität"
+ },
+ "passwordHistory": {
+ "message": "Kennwort-Historie"
+ },
+ "back": {
+ "message": "Zurück"
+ },
+ "collections": {
+ "message": "Sammlungen"
+ },
+ "favorites": {
+ "message": "Favoriten"
+ },
+ "popOutNewWindow": {
+ "message": "In einem neuen Fenster öffnen"
+ },
+ "refresh": {
+ "message": "Aktualisieren"
+ },
+ "cards": {
+ "message": "Karten"
+ },
+ "identities": {
+ "message": "Identitäten"
+ },
+ "logins": {
+ "message": "Zugangsdaten"
+ },
+ "secureNotes": {
+ "message": "Sichere Notiz"
+ },
+ "clear": {
+ "message": "Löschen",
+ "description": "To clear something out. example: To clear browser history."
+ },
+ "checkPassword": {
+ "message": "Überprüfe ob dein Kennwort kompromittiert ist."
+ },
+ "passwordExposed": {
+ "message": "Dieses Passwort wurde $VALUE$ mal in öffentlichen Passwortdatenbanken gefunden. Du solltest es ändern.",
+ "placeholders": {
+ "value": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "passwordSafe": {
+ "message": "Dieses Kennwort wurde in keinen bekannten Datensätzen gefunden. Es sollte sicher sein."
+ },
+ "baseDomain": {
+ "message": "Basis-Domäne"
+ },
+ "host": {
+ "message": "Server",
+ "description": "A URL's host value. For example, the host of https://sub.domain.com:443 is 'sub.domain.com:443'."
+ },
+ "exact": {
+ "message": "Exakt"
+ },
+ "startsWith": {
+ "message": "Beginnt mit"
+ },
+ "regEx": {
+ "message": "Regulärer Ausdruck",
+ "description": "A programming term, also known as 'RegEx'."
+ },
+ "matchDetection": {
+ "message": "Match-Erkennung",
+ "description": "URI match detection for auto-fill."
+ },
+ "defaultMatchDetection": {
+ "message": "Standard-Match-Erkennung",
+ "description": "Default URI match detection for auto-fill."
+ },
+ "toggleOptions": {
+ "message": "Umschaltoptionen"
+ },
+ "toggleCurrentUris": {
+ "message": "Aktuelle URIs ändern",
+ "description": "Toggle the display of the URIs of the currently open tabs in the browser."
+ },
+ "currentUri": {
+ "message": "Aktuelle URI",
+ "description": "The URI of one of the current open tabs in the browser."
+ },
+ "organization": {
+ "message": "Organisation",
+ "description": "An entity of multiple related people (ex. a team or business organization)."
+ },
+ "types": {
+ "message": "Typen"
+ },
+ "allItems": {
+ "message": "Alle Einträge"
+ },
+ "noPasswordsInList": {
+ "message": "Keine Einträge zum Anzeigen vorhanden."
+ },
+ "remove": {
+ "message": "Entfernen"
+ },
+ "default": {
+ "message": "Standard"
+ },
+ "dateUpdated": {
+ "message": "Aktualisiert",
+ "description": "ex. Date this item was updated"
+ },
+ "datePasswordUpdated": {
+ "message": "Passwort aktualisiert",
+ "description": "ex. Date this password was updated"
+ },
+ "neverLockWarning": {
+ "message": "Bist du sicher, dass dein Tresor nicht automatisch gesperrt werden soll? Dadurch wird der Verschlüsselungsschlüssel auf dem Gerät gespeichert. Wenn du diese Option verwendest, solltest du darauf achten, dass dein Gerät ausreichend geschützt ist."
+ },
+ "noOrganizationsList": {
+ "message": "Du bist kein Mitglied einer Organisation. Organisationen erlauben es dir Passwörter sicher mit anderen Nutzern zu teilen."
+ },
+ "noCollectionsInList": {
+ "message": "Keine Sammlungen vorhanden."
+ },
+ "ownership": {
+ "message": "Besitzer"
+ },
+ "whoOwnsThisItem": {
+ "message": "Wem gehört dieser Eintrag?"
+ },
+ "strong": {
+ "message": "Stark",
+ "description": "ex. A strong password. Scale: Weak -> Good -> Strong"
+ },
+ "good": {
+ "message": "Gut",
+ "description": "ex. A good password. Scale: Weak -> Good -> Strong"
+ },
+ "weak": {
+ "message": "Schwach",
+ "description": "ex. A weak password. Scale: Weak -> Good -> Strong"
+ },
+ "weakMasterPassword": {
+ "message": "Schwaches Master-Passwort"
+ },
+ "weakMasterPasswordDesc": {
+ "message": "Das Haupt-Passwort, das du gewählt hast ist schwach. Du solltest ein starkes Haupt-Passwort auswählen, um dein Bitwarden-Konto richtig zu schützen. Bist du sicher, dass du dieses Haupt-Passwort verwenden sollen?"
+ },
+ "pin": {
+ "message": "PIN",
+ "description": "PIN code. Ex. The short code (often numeric) that you use to unlock a device."
+ },
+ "unlockWithPin": {
+ "message": "Mit PIN-Code entsperren"
+ },
+ "setYourPinCode": {
+ "message": "Gebe deinen PIN-Code für das Entsperren von Bitwarden ein. Deine PIN-Einstellungen werden zurückgesetzt, wenn du dich vollständig von der Anwendung abmeldest."
+ },
+ "pinRequired": {
+ "message": "PIN-Code ist erforderlich."
+ },
+ "invalidPin": {
+ "message": "Ungültiger PIN-Code."
+ },
+ "verifyPin": {
+ "message": "PIN bestätigen"
+ },
+ "yourVaultIsLockedPinCode": {
+ "message": "Dein Tresor ist gesperrt. Gebe deinen PIN-Code ein um fortzufahren."
+ },
+ "unlockWithBiometrics": {
+ "message": "Mit Biometrie entsperren"
+ },
+ "awaitDesktop": {
+ "message": "Warte auf Bestätigung vom Desktop"
+ },
+ "awaitDesktopDesc": {
+ "message": "Bitte bestätige die Verwendung von Biometrie in der Bitwarden Desktop-Anwendung, um Biometrie für den Browser zu aktivieren."
+ },
+ "lockWithMasterPassOnRestart": {
+ "message": "Bei Neustart des Browsers mit Master-Passwort sperren"
+ },
+ "selectOneCollection": {
+ "message": "Sie müssen mindestens eine Sammlung auswählen."
+ },
+ "cloneItem": {
+ "message": "Eintrag duplizieren"
+ },
+ "clone": {
+ "message": "Duplizieren"
+ },
+ "passwordGeneratorPolicyInEffect": {
+ "message": "Eine oder mehrere Organisationsrichtlinien beeinflussen deine Generator-Einstellungen."
+ },
+ "vaultTimeoutAction": {
+ "message": "Aktion bei Tresor-Timeout"
+ },
+ "lock": {
+ "message": "Sperren",
+ "description": "Verb form: to make secure or inaccesible by"
+ },
+ "trash": {
+ "message": "Papierkorb",
+ "description": "Noun: a special folder to hold deleted items"
+ },
+ "searchTrash": {
+ "message": "Papierkorb durchsuchen"
+ },
+ "permanentlyDeleteItem": {
+ "message": "Eintrag dauerhaft löschen"
+ },
+ "permanentlyDeleteItemConfirmation": {
+ "message": "Soll dieser Eintrag wirklich dauerhaft gelöscht werden?"
+ },
+ "permanentlyDeletedItem": {
+ "message": "Eintrag dauerhaft gelöscht"
+ },
+ "restoreItem": {
+ "message": "Eintrag wiederherstellen"
+ },
+ "restoreItemConfirmation": {
+ "message": "Soll dieser Eintrag wirklich wiederhergestellt werden?"
+ },
+ "restoredItem": {
+ "message": "Eintrag wiederhergestellt"
+ },
+ "vaultTimeoutLogOutConfirmation": {
+ "message": "Nach dem Ausloggen verlierest du jeglichen Zugriff auf deinen Tresor und es ist nach Ablauf der Timeout-Zeit eine Online-Authentifizierung erforderlich. Bist du sicher, dass du diese Einstellung nutzen möchten?"
+ },
+ "vaultTimeoutLogOutConfirmationTitle": {
+ "message": "Bestätigung der Timeout-Aktion"
+ },
+ "autoFillAndSave": {
+ "message": "Automatisch ausfüllen und speichern"
+ },
+ "autoFillSuccessAndSavedUri": {
+ "message": "Automatisch ausgefüllter Eintrag und gespeicherte URI"
+ },
+ "autoFillSuccess": {
+ "message": "Automatisch ausgefüllter Eintrag"
+ },
+ "setMasterPassword": {
+ "message": "Masterpasswort festlegen"
+ },
+ "masterPasswordPolicyInEffect": {
+ "message": "Eine oder mehrere Organisationsrichtlinien erfordern, dass dein Masterpasswort die folgenden Anforderungen erfüllt:"
+ },
+ "policyInEffectMinComplexity": {
+ "message": "Kleinster Komplexitätsgrad von $SCORE$",
+ "placeholders": {
+ "score": {
+ "content": "$1",
+ "example": "4"
+ }
+ }
+ },
+ "policyInEffectMinLength": {
+ "message": "Mindestlänge von $LENGTH$",
+ "placeholders": {
+ "length": {
+ "content": "$1",
+ "example": "14"
+ }
+ }
+ },
+ "policyInEffectUppercase": {
+ "message": "Enthält einen oder mehrere Großbuchstaben"
+ },
+ "policyInEffectLowercase": {
+ "message": "Enthält einen oder mehrere Kleinbuchstaben"
+ },
+ "policyInEffectNumbers": {
+ "message": "Enthält eine oder mehrere Zahlen"
+ },
+ "policyInEffectSpecial": {
+ "message": "Enthält eines oder mehrere der folgenden Sonderzeichen $CHARS$",
+ "placeholders": {
+ "chars": {
+ "content": "$1",
+ "example": "!@#$%^&*"
+ }
+ }
+ },
+ "masterPasswordPolicyRequirementsNotMet": {
+ "message": "Ihr neues Master-Passwort entspricht nicht den Anforderungen der Richtlinie."
+ },
+ "acceptPolicies": {
+ "message": "Durch Anwählen dieses Kästchens erklären Sie sich mit folgendem einverstanden:"
+ },
+ "acceptPoliciesError": {
+ "message": "Die Nutzungsbedingungen und Datenschutzerklärung wurden nicht akzeptiert."
+ },
+ "termsOfService": {
+ "message": "Nutzungsbedingungen"
+ },
+ "privacyPolicy": {
+ "message": "Datenschutzbestimmungen"
+ },
+ "hintEqualsPassword": {
+ "message": "Dein Passwort-Hinweis darf nicht identisch mit deinem Passwort sein."
+ },
+ "ok": {
+ "message": "Ok"
+ },
+ "desktopSyncVerificationTitle": {
+ "message": "Desktop-Sync-Überprüfung"
+ },
+ "desktopIntegrationVerificationText": {
+ "message": "Bitte bestätigen Sie, dass die Desktop-Anwendung diesen Prüfschlüssel anzeigt: "
+ },
+ "desktopIntegrationDisabledTitle": {
+ "message": "Browser-Einbindung ist nicht aktiviert"
+ },
+ "desktopIntegrationDisabledDesc": {
+ "message": "Die Browser-Einbindung ist in der Bitwarden Desktop-Anwendung nicht aktiviert. Bitte aktiviere diese in den Einstellungen innerhalb der Desktop-Anwendung."
+ },
+ "startDesktopTitle": {
+ "message": "Bitwarden Desktop-Anwendung starten"
+ },
+ "startDesktopDesc": {
+ "message": "Die Bitwarden Desktop-Anwendung muss gestartet werden, bevor diese Funktion verwendet werden kann."
+ },
+ "errorEnableBiometricTitle": {
+ "message": "Biometrie kann nicht aktiviert werden"
+ },
+ "errorEnableBiometricDesc": {
+ "message": "Die Aktion wurde von der Desktop-Anwendung abgebrochen"
+ },
+ "nativeMessagingInvalidEncryptionDesc": {
+ "message": "Die Desktop-Anwendung hat den sicheren Kommunikationskanal für ungültig erklärt. Bitte starte den Vorgang erneut"
+ },
+ "nativeMessagingInvalidEncryptionTitle": {
+ "message": "Desktop-Kommunikation unterbrochen"
+ },
+ "nativeMessagingWrongUserDesc": {
+ "message": "Die Desktop-Anwendung ist in ein anderes Konto eingeloggt. Bitte stelle sicher, dass beide Anwendungen mit demselben Konto angemeldet sind."
+ },
+ "nativeMessagingWrongUserTitle": {
+ "message": "Konten stimmen nicht überein"
+ },
+ "biometricsNotEnabledTitle": {
+ "message": "Biometrie ist nicht aktiviert"
+ },
+ "biometricsNotEnabledDesc": {
+ "message": "Biometrie im Browser setzt voraus, dass Biometrie zuerst in den Einstellungen der Desktop-Anwendung aktiviert ist."
+ },
+ "biometricsNotSupportedTitle": {
+ "message": "Biometrie wird nicht unterstützt"
+ },
+ "biometricsNotSupportedDesc": {
+ "message": "Biometrie im Browser wird auf diesem Gerät nicht unterstützt."
+ },
+ "nativeMessaginPermissionErrorTitle": {
+ "message": "Berechtigung nicht erteilt"
+ },
+ "nativeMessaginPermissionErrorDesc": {
+ "message": "Ohne die Berechtigung zur Kommunikation mit der Bitwarden Desktop-Anwendung können wir keine Biometrie in der Browser-Erweiterung anbieten. Bitte versuche es erneut."
+ },
+ "nativeMessaginPermissionSidebarTitle": {
+ "message": "Fehler bei der Berechtigungsanfrage"
+ },
+ "nativeMessaginPermissionSidebarDesc": {
+ "message": "Diese Aktion kann in der Sidebar nicht durchgeführt werden, bitte versuche die Aktion im Popup oder Popout erneut auszuführen."
+ },
+ "personalOwnershipSubmitError": {
+ "message": "Aufgrund einer Unternehmensrichtlinie darfst du keine Einträge in deinem persönlichen Tresor speichern. Ändere die Eigentümer-Option in eine Organisation und wähle aus den verfügbaren Sammlungen."
+ },
+ "personalOwnershipPolicyInEffect": {
+ "message": "Eine Organisationsrichtlinie beeinflusst deine Eigentümer-Optionen."
+ },
+ "excludedDomains": {
+ "message": "Ausgeschlossene Domänen"
+ },
+ "excludedDomainsDesc": {
+ "message": "Bitwarden wird keine Login-Daten für diese Domäne speichern. Du musst die Seite aktualisieren, damit die Änderungen wirksam werden."
+ },
+ "excludedDomainsInvalidDomain": {
+ "message": "$DOMAIN$ ist keine gültige Domäne",
+ "placeholders": {
+ "domain": {
+ "content": "$1",
+ "example": "googlecom"
+ }
+ }
+ },
+ "send": {
+ "message": "Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "searchSends": {
+ "message": "Sends suchen",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "addSend": {
+ "message": "Send hinzufügen",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTypeText": {
+ "message": "Text"
+ },
+ "sendTypeFile": {
+ "message": "Datei"
+ },
+ "allSends": {
+ "message": "Alle Sends",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "maxAccessCountReached": {
+ "message": "Maximale Zugriffsanzahl erreicht"
+ },
+ "expired": {
+ "message": "Abgelaufen"
+ },
+ "pendingDeletion": {
+ "message": "Ausstehende Löschung"
+ },
+ "passwordProtected": {
+ "message": "Passwortgeschützt"
+ },
+ "copySendLink": {
+ "message": "Send-Link kopieren",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "removePassword": {
+ "message": "Passwort entfernen"
+ },
+ "delete": {
+ "message": "Löschen"
+ },
+ "removedPassword": {
+ "message": "Passwort entfernt"
+ },
+ "deletedSend": {
+ "message": "Send gelöscht",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendLink": {
+ "message": "Send-Link",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "disabled": {
+ "message": "Deaktiviert"
+ },
+ "removePasswordConfirmation": {
+ "message": "Bist du sicher, dass du dieses Passwort entfernen möchtest?"
+ },
+ "deleteSend": {
+ "message": "Send löschen",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "deleteSendConfirmation": {
+ "message": "Bist du sicher, dass du dieses Send löschen möchtest?",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "editSend": {
+ "message": "Send bearbeiten",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTypeHeader": {
+ "message": "Welche Art von Send ist das?",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendNameDesc": {
+ "message": "Ein eigener Name, um dieses Send zu beschreiben.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendFileDesc": {
+ "message": "Die Datei, die du senden möchtest."
+ },
+ "deletionDate": {
+ "message": "Löschdatum"
+ },
+ "deletionDateDesc": {
+ "message": "Das Send wird am angegebenen Datum zur angegebenen Uhrzeit dauerhaft gelöscht.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "expirationDate": {
+ "message": "Ablaufdatum"
+ },
+ "expirationDateDesc": {
+ "message": "Falls aktiviert, verfällt der Zugriff auf dieses Send am angegebenen Datum zur angegebenen Uhrzeit.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "oneDay": {
+ "message": "1 Tag"
+ },
+ "days": {
+ "message": "$DAYS$ Tage",
+ "placeholders": {
+ "days": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "custom": {
+ "message": "Benutzerdefiniert"
+ },
+ "maximumAccessCount": {
+ "message": "Maximale Zugriffsanzahl"
+ },
+ "maximumAccessCountDesc": {
+ "message": "Falls aktiviert, können Benutzer nicht mehr auf dieses Send zugreifen, sobald die maximale Zugriffsanzahl erreicht ist.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendPasswordDesc": {
+ "message": "Optional ein Passwort verlangen, damit Benutzer auf dieses Send zugreifen können.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendNotesDesc": {
+ "message": "Private Notizen zu diesem Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendDisableDesc": {
+ "message": "Dieses Send deaktivieren, damit niemand darauf zugreifen kann.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendShareDesc": {
+ "message": "Kopiere den Send-Link beim Speichern in die Zwischenablage.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTextDesc": {
+ "message": "Der Text, den du senden möchtest."
+ },
+ "sendHideText": {
+ "message": "Send-Text standardmäßig ausblenden.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "currentAccessCount": {
+ "message": "Aktuelle Zugriffsanzahl"
+ },
+ "createSend": {
+ "message": "Neues Send erstellen",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "newPassword": {
+ "message": "Neues Passwort"
+ },
+ "sendDisabled": {
+ "message": "Send deaktiviert",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendDisabledWarning": {
+ "message": "Aufgrund einer Unternehmensrichtlinie kannst du nur ein bestehendes Send löschen.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "createdSend": {
+ "message": "Send erstellt",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "editedSend": {
+ "message": "Bearbeitetes Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendLinuxChromiumFileWarning": {
+ "message": "Um eine Datei auszuwählen, öffne die Erweiterung in der Sidebar (falls möglich) oder öffne sie in einem neuem Fenster, indem du auf dieses Banner klickst."
+ },
+ "sendFirefoxFileWarning": {
+ "message": "Um eine Datei mit Firefox auszuwählen, öffne die Erweiterung in der Sidebar oder öffne ein neues Fenster, indem du auf dieses Banner klickst."
+ },
+ "sendSafariFileWarning": {
+ "message": "Um eine Datei mit Safari auszuwählen, öffne ein neues Fenster, indem du auf dieses Banner klickst."
+ },
+ "sendFileCalloutHeader": {
+ "message": "Bevor du beginnst"
+ },
+ "sendFirefoxCustomDatePopoutMessage1": {
+ "message": "Um einen Kalender-Datumsauswahl zu verwenden",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read '**To use a calendar style date picker ** click here to pop out your window.'"
+ },
+ "sendFirefoxCustomDatePopoutMessage2": {
+ "message": "hier klicken",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker **click here** to pop out your window.'"
+ },
+ "sendFirefoxCustomDatePopoutMessage3": {
+ "message": "zum Öffnen in einem neuen Fenster.",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker click here **to pop out your window.**'"
+ },
+ "expirationDateIsInvalid": {
+ "message": "Das angegebene Verfallsdatum ist nicht gültig."
+ },
+ "deletionDateIsInvalid": {
+ "message": "Das angegebene Löschdatum ist nicht gültig."
+ },
+ "expirationDateAndTimeRequired": {
+ "message": "Ein Verfallsdatum und eine Zeit sind erforderlich."
+ },
+ "deletionDateAndTimeRequired": {
+ "message": "Ein Löschdatum und eine Zeit sind erforderlich."
+ },
+ "dateParsingError": {
+ "message": "Es gab einen Fehler beim Speichern deiner Lösch- und Verfallsdaten."
+ },
+ "hideEmail": {
+ "message": "Meine E-Mail-Adresse vor den Empfängern ausblenden."
+ },
+ "sendOptionsPolicyInEffect": {
+ "message": "Eine oder mehrere Organisationsrichtlinien beeinflussen deine Send Einstellungen."
+ },
+ "passwordPrompt": {
+ "message": "Master-Passwort erneut abfragen"
+ },
+ "passwordConfirmation": {
+ "message": "Master-Passwort bestätigen"
+ },
+ "passwordConfirmationDesc": {
+ "message": "Diese Aktion ist geschützt. Um fortzufahren, gib bitte dein Master-Passwort erneut ein, um deine Identität zu bestätigen."
+ },
+ "emailVerificationRequired": {
+ "message": "E-Mail-Verifizierung erforderlich"
+ },
+ "emailVerificationRequiredDesc": {
+ "message": "Du musst deine E-Mail Adresse verifizieren, um diese Funktion nutzen zu können. Du kannst deine E-Mail im Web-Tresor verifizieren."
+ },
+ "updatedMasterPassword": {
+ "message": "Master-Passwort aktualisiert"
+ },
+ "updateMasterPassword": {
+ "message": "Master-Passwort aktualisieren"
+ },
+ "updateMasterPasswordWarning": {
+ "message": "Dein Master-Passwort wurde kürzlich von einem Administrator Ihrer Organisation geändert. Um auf den Tresor zuzugreifen, musst du es jetzt aktualisieren. Wenn du fortfährst, wirst du aus der aktuellen Sitzung abgemeldet, eine erneute Anmeldung wird erforderlich. Aktive Sitzungen auf anderen Geräten können bis zu einer Stunde weiterhin aktiv bleiben."
+ },
+ "resetPasswordPolicyAutoEnroll": {
+ "message": "Automatische Registrierung"
+ },
+ "resetPasswordAutoEnrollInviteWarning": {
+ "message": "Diese Organisation hat eine Unternehmensrichtlinie, die dich automatisch zum Zurücksetzen deines Passworts registriert. Die Registrierung wird es Administratoren der Organisation erlauben, dein Master-Passwort zu ändern."
+ },
+ "selectFolder": {
+ "message": "Ordner auswählen..."
+ },
+ "ssoCompleteRegistration": {
+ "message": "Um die Anmeldung über SSO abzuschließen, lege bitte ein Master-Passwort fest, um auf deinen Tresor zuzugreifen und ihn zu schützen."
+ },
+ "hours": {
+ "message": "Stunden"
+ },
+ "minutes": {
+ "message": "Minuten"
+ },
+ "vaultTimeoutPolicyInEffect": {
+ "message": "Deine Unternehmensrichtlinien beeinflussen dein Tresor-Timeout. Das maximal zulässige Tresor-Timeout ist $HOURS$ Stunde(n) und $MINUTES$ Minute(n)",
+ "placeholders": {
+ "hours": {
+ "content": "$1",
+ "example": "5"
+ },
+ "minutes": {
+ "content": "$2",
+ "example": "5"
+ }
+ }
+ },
+ "vaultTimeoutToLarge": {
+ "message": "Dein Tresor-Timeout überschreitet die von deinem Unternehmen festgelegten Beschränkungen."
+ },
+ "vaultExportDisabled": {
+ "message": "Tresor-Export deaktiviert"
+ },
+ "personalVaultExportPolicyInEffect": {
+ "message": "Eine oder mehrere Unternehmensrichtlinien hindern dich daran, deinen persönlichen Tresor zu exportieren."
+ },
+ "copyCustomFieldNameInvalidElement": {
+ "message": "Es konnte kein gültiges Formularelement identifiziert werden. Versuche stattdessen das HTML zu untersuchen."
+ },
+ "copyCustomFieldNameNotUnique": {
+ "message": "Keine eindeutige Kennung gefunden."
+ }
+}
diff --git a/src/iOS.Safari/Resources/_locales/el/messages.json b/src/iOS.Safari/Resources/_locales/el/messages.json
new file mode 100644
index 000000000..87089eafd
--- /dev/null
+++ b/src/iOS.Safari/Resources/_locales/el/messages.json
@@ -0,0 +1,1817 @@
+{
+ "appName": {
+ "message": "Bitwarden"
+ },
+ "extName": {
+ "message": "Bitwarden - Δωρεάν Διαχειριστής Κωδικών",
+ "description": "Extension name, MUST be less than 40 characters (Safari restriction)"
+ },
+ "extDesc": {
+ "message": "Ένας ασφαλής και δωρεάν διαχειριστής κωδικών, για όλες σας τις συσκευές.",
+ "description": "Extension description"
+ },
+ "loginOrCreateNewAccount": {
+ "message": "Συνδεθείτε ή δημιουργήστε ένα νέο λογαριασμό για να αποκτήσετε πρόσβαση στο ασφαλές vault σας."
+ },
+ "createAccount": {
+ "message": "Δημιουργία Λογαριασμού"
+ },
+ "login": {
+ "message": "Σύνδεση"
+ },
+ "enterpriseSingleSignOn": {
+ "message": "Ενιαία είσοδος για επιχειρήσεις"
+ },
+ "cancel": {
+ "message": "Ακύρωση"
+ },
+ "close": {
+ "message": "Κλείσιμο"
+ },
+ "submit": {
+ "message": "Υποβολή"
+ },
+ "emailAddress": {
+ "message": "Διεύθυνση Email"
+ },
+ "masterPass": {
+ "message": "Κύριος κωδικός"
+ },
+ "masterPassDesc": {
+ "message": "Ο κύριος κωδικός είναι ο κωδικός που χρησιμοποιείτε για την πρόσβαση στο vault σας. Είναι πολύ σημαντικό να μην ξεχάσετε τον κύριο κωδικό. Δεν υπάρχει τρόπος να ανακτήσετε τον κωδικό σε περίπτωση που τον ξεχάσετε."
+ },
+ "masterPassHintDesc": {
+ "message": "Η υπόδειξη του κύριου κωδικού μπορεί να σας βοηθήσει να θυμηθείτε τον κωδικό σας, σε περίπτωση που τον ξεχάσετε."
+ },
+ "reTypeMasterPass": {
+ "message": "Εισάγετε Ξανά τον Κύριο Κωδικό σας"
+ },
+ "masterPassHint": {
+ "message": "Υπόδειξη Κύριου Κωδικού (προαιρετικό)"
+ },
+ "tab": {
+ "message": "Καρτέλα"
+ },
+ "myVault": {
+ "message": "Το Vault μου"
+ },
+ "tools": {
+ "message": "Εργαλεία"
+ },
+ "settings": {
+ "message": "Ρυθμίσεις"
+ },
+ "currentTab": {
+ "message": "Τρέχουσα Καρτέλα"
+ },
+ "copyPassword": {
+ "message": "Αντιγραφή Κωδικού"
+ },
+ "copyNote": {
+ "message": "Αντιγραφή Σημείωσης"
+ },
+ "copyUri": {
+ "message": "Αντιγραφή URI"
+ },
+ "copyUsername": {
+ "message": "Αντιγραφή Ονόματος Χρήστη"
+ },
+ "copyNumber": {
+ "message": "Αντιγραφή Αριθμού"
+ },
+ "copySecurityCode": {
+ "message": "Αντιγραφή Κωδικού Ασφαλείας"
+ },
+ "autoFill": {
+ "message": "Αυτόματη συμπλήρωση"
+ },
+ "generatePasswordCopied": {
+ "message": "Δημιουργία Κωδικού (αντιγράφηκε)"
+ },
+ "copyElementIdentifier": {
+ "message": "Αντιγραφή ονόματος προσαρμοσμένου πεδίου"
+ },
+ "noMatchingLogins": {
+ "message": "Δεν υπάρχουν αντιστοιχίσεις σύνδεσης."
+ },
+ "vaultLocked": {
+ "message": "Το Vault είναι κλειδωμένο."
+ },
+ "vaultLoggedOut": {
+ "message": "Το Vault έχει αποσυνδεθεί."
+ },
+ "autoFillInfo": {
+ "message": "Δεν υπάρχουν διαθέσιμες συνδέσεις για την αυτόματη συμπλήρωση, στην τρέχουσα καρτέλα του προγράμματος περιήγησης."
+ },
+ "addLogin": {
+ "message": "Προσθήκη Στοιχείων Σύνδεσης"
+ },
+ "addItem": {
+ "message": "Προσθήκη Αντικειμένου"
+ },
+ "passwordHint": {
+ "message": "Υπόδειξη Κωδικού"
+ },
+ "enterEmailToGetHint": {
+ "message": "Εισαγάγετε τη διεύθυνση email του λογαριασμού σας, για να λάβετε την υπόδειξη του κύριου κωδικού."
+ },
+ "getMasterPasswordHint": {
+ "message": "Λήψη υπόδειξης κύριου κωδικού"
+ },
+ "continue": {
+ "message": "Συνέχεια"
+ },
+ "verificationCode": {
+ "message": "Κωδικός Επαλήθευσης"
+ },
+ "account": {
+ "message": "Λογαριασμός"
+ },
+ "changeMasterPassword": {
+ "message": "Αλλαγή Κύριου Κωδικού"
+ },
+ "fingerprintPhrase": {
+ "message": "Φράση Δακτυλικών Αποτυπωμάτων",
+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
+ },
+ "yourAccountsFingerprint": {
+ "message": "Η Φράση δακτυλικών αποτυπωμάτων του λογαριασμού σας",
+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
+ },
+ "twoStepLogin": {
+ "message": "Σύνδεση σε δύο βήματα"
+ },
+ "logOut": {
+ "message": "Αποσύνδεση"
+ },
+ "about": {
+ "message": "Σχετικά"
+ },
+ "version": {
+ "message": "Έκδοση"
+ },
+ "save": {
+ "message": "Αποθήκευση"
+ },
+ "move": {
+ "message": "Μετακίνηση"
+ },
+ "addFolder": {
+ "message": "Προσθήκη Φακέλου"
+ },
+ "name": {
+ "message": "Όνομα"
+ },
+ "editFolder": {
+ "message": "Επεξεργασία Φακέλου"
+ },
+ "deleteFolder": {
+ "message": "Διαγραφή Φακέλου"
+ },
+ "folders": {
+ "message": "Φάκελοι"
+ },
+ "noFolders": {
+ "message": "Δεν υπάρχουν φάκελοι προς εμφάνιση."
+ },
+ "helpFeedback": {
+ "message": "Βοήθεια & Σχόλια"
+ },
+ "sync": {
+ "message": "Συγχρονισμός"
+ },
+ "syncVaultNow": {
+ "message": "Συγχρονισμός λίστας"
+ },
+ "lastSync": {
+ "message": "Τελευταίος συγχρονισμός:"
+ },
+ "passGen": {
+ "message": "Γεννήτρια Κωδικού"
+ },
+ "generator": {
+ "message": "Γεννήτρια",
+ "description": "Short for 'Password Generator'."
+ },
+ "passGenInfo": {
+ "message": "Δημιουργήστε αυτόματα ισχυρούς και μοναδικούς κωδικούς πρόσβασης για τις συνδέσεις σας."
+ },
+ "bitWebVault": {
+ "message": "Bitwarden Web Vault"
+ },
+ "importItems": {
+ "message": "Εισαγωγή στοιχείων"
+ },
+ "select": {
+ "message": "Επιλογή"
+ },
+ "generatePassword": {
+ "message": "Δημιουργία Κωδικού"
+ },
+ "regeneratePassword": {
+ "message": "Επαναδημιουργία Κωδικού"
+ },
+ "options": {
+ "message": "Επιλογές"
+ },
+ "length": {
+ "message": "Μήκος"
+ },
+ "numWords": {
+ "message": "Αριθμός Λέξεων"
+ },
+ "wordSeparator": {
+ "message": "Διαχωριστής Λέξεων"
+ },
+ "capitalize": {
+ "message": "Κεφαλαία",
+ "description": "Make the first letter of a work uppercase."
+ },
+ "includeNumber": {
+ "message": "Συμπερίληψη Αριθμών"
+ },
+ "minNumbers": {
+ "message": "Ελάχιστα Αριθμητικά Ψηφία"
+ },
+ "minSpecial": {
+ "message": "Ελάχιστο Ειδικών Χαρακτήρων"
+ },
+ "avoidAmbChar": {
+ "message": "Αποφυγή Αμφιλεγόμενων Χαρακτήρων"
+ },
+ "searchVault": {
+ "message": "Αναζήτηση στο vault"
+ },
+ "edit": {
+ "message": "Επεξεργασία"
+ },
+ "view": {
+ "message": "Προβολή"
+ },
+ "noItemsInList": {
+ "message": "Δεν υπάρχουν στοιχεία στη λίστα."
+ },
+ "itemInformation": {
+ "message": "Πληροφορίες Αντικειμένου"
+ },
+ "username": {
+ "message": "Όνομα Χρήστη"
+ },
+ "password": {
+ "message": "Κωδικός"
+ },
+ "passphrase": {
+ "message": "Συνθηματικό"
+ },
+ "favorite": {
+ "message": "Αγαπημένο"
+ },
+ "notes": {
+ "message": "Σημειώσεις"
+ },
+ "note": {
+ "message": "Σημείωση"
+ },
+ "editItem": {
+ "message": "Επεξεργασία Αντικειμένου"
+ },
+ "folder": {
+ "message": "Φάκελος"
+ },
+ "deleteItem": {
+ "message": "Διαγραφή Στοιχείου"
+ },
+ "viewItem": {
+ "message": "Προβολή Αντικειμένου"
+ },
+ "launch": {
+ "message": "Εκκίνηση"
+ },
+ "website": {
+ "message": "Ιστοσελίδα"
+ },
+ "toggleVisibility": {
+ "message": "Εναλλαγή Ορατότητας"
+ },
+ "manage": {
+ "message": "Διαχείριση"
+ },
+ "other": {
+ "message": "Άλλες"
+ },
+ "rateExtension": {
+ "message": "Βαθμολογήστε την επέκταση"
+ },
+ "rateExtensionDesc": {
+ "message": "Παρακαλούμε σκεφτείτε να μας βοηθήσετε με μια καλή κριτική!"
+ },
+ "browserNotSupportClipboard": {
+ "message": "Το πρόγραμμα περιήγησης ιστού δεν υποστηρίζει εύκολη αντιγραφή πρόχειρου. Αντιγράψτε το με το χέρι αντ'αυτού."
+ },
+ "verifyMasterPassword": {
+ "message": "Επαλήθευση Κύριου Κωδικού"
+ },
+ "yourVaultIsLocked": {
+ "message": "Το vault σας είναι κλειδωμένο. Επαληθεύστε τον κύριο κωδικό πρόσβασης για να συνεχίσετε."
+ },
+ "unlock": {
+ "message": "Ξεκλείδωμα"
+ },
+ "loggedInAsOn": {
+ "message": "Συνδεθήκατε ως $EMAIL$ στο $HOSTNAME$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "name@example.com"
+ },
+ "hostname": {
+ "content": "$2",
+ "example": "bitwarden.com"
+ }
+ }
+ },
+ "invalidMasterPassword": {
+ "message": "Μη έγκυρος κύριος κωδικός πρόσβασης"
+ },
+ "vaultTimeout": {
+ "message": "Χρόνος Λήξης Vault"
+ },
+ "lockNow": {
+ "message": "Κλείδωμα Τώρα"
+ },
+ "immediately": {
+ "message": "Άμεσα"
+ },
+ "tenSeconds": {
+ "message": "10 δευτερόλεπτα"
+ },
+ "twentySeconds": {
+ "message": "20 δευτερόλεπτα"
+ },
+ "thirtySeconds": {
+ "message": "30 δευτερόλεπτα"
+ },
+ "oneMinute": {
+ "message": "1 λεπτό"
+ },
+ "twoMinutes": {
+ "message": "2 λεπτά"
+ },
+ "fiveMinutes": {
+ "message": "5 λεπτά"
+ },
+ "fifteenMinutes": {
+ "message": "15 λεπτά"
+ },
+ "thirtyMinutes": {
+ "message": "30 λεπτά"
+ },
+ "oneHour": {
+ "message": "1 ώρα"
+ },
+ "fourHours": {
+ "message": "4 ώρες"
+ },
+ "onLocked": {
+ "message": "Κατά το Κλείδωμα Συστήματος"
+ },
+ "onRestart": {
+ "message": "Κατά την Επανεκκίνηση του Browser"
+ },
+ "never": {
+ "message": "Ποτέ"
+ },
+ "security": {
+ "message": "Ασφάλεια"
+ },
+ "errorOccurred": {
+ "message": "Παρουσιάστηκε σφάλμα"
+ },
+ "emailRequired": {
+ "message": "Απαιτείται διεύθυνση e-mail."
+ },
+ "invalidEmail": {
+ "message": "Μη έγκυρη διεύθυνση e-mail."
+ },
+ "masterPassRequired": {
+ "message": "Απαιτείται κύριος κωδικός πρόσβασης."
+ },
+ "masterPassLength": {
+ "message": "Ο κύριος κωδικός πρέπει να έχει μήκος τουλάχιστον 8 χαρακτήρες."
+ },
+ "masterPassDoesntMatch": {
+ "message": "Η επιβεβαίωση κύριου κωδικού δεν ταιριάζει."
+ },
+ "newAccountCreated": {
+ "message": "Ο λογαριασμός σας έχει δημιουργηθεί! Τώρα μπορείτε να συνδεθείτε."
+ },
+ "masterPassSent": {
+ "message": "Σας στείλαμε ένα email με την υπόδειξη του κύριου κωδικού."
+ },
+ "verificationCodeRequired": {
+ "message": "Απαιτείται ο κωδικός επαλήθευσης."
+ },
+ "valueCopied": {
+ "message": "$VALUE$ αντιγράφηκε",
+ "description": "Value has been copied to the clipboard.",
+ "placeholders": {
+ "value": {
+ "content": "$1",
+ "example": "Password"
+ }
+ }
+ },
+ "autofillError": {
+ "message": "Δεν είναι δυνατή η αυτόματη συμπλήρωση του επιλεγμένου στοιχείου σε αυτήν τη σελίδα. Αντιγράψτε και επικολλήστε τις πληροφορίες."
+ },
+ "loggedOut": {
+ "message": "Αποσυνδεθήκατε"
+ },
+ "loginExpired": {
+ "message": "Η περίοδος σύνδεσης σας έχει λήξει."
+ },
+ "logOutConfirmation": {
+ "message": "Είστε βέβαιοι ότι θέλετε να αποσυνδεθείτε;"
+ },
+ "yes": {
+ "message": "Ναι"
+ },
+ "no": {
+ "message": "Όχι"
+ },
+ "unexpectedError": {
+ "message": "Παρουσιάστηκε ένα μη αναμενόμενο σφάλμα."
+ },
+ "nameRequired": {
+ "message": "Απαιτείται όνομα."
+ },
+ "addedFolder": {
+ "message": "Προστέθηκε φάκελος"
+ },
+ "changeMasterPass": {
+ "message": "Αλλαγή Κύριου Κωδικού"
+ },
+ "changeMasterPasswordConfirmation": {
+ "message": "Μπορείτε να αλλάξετε τον κύριο κωδικό στο bitwarden.com. Θέλετε να επισκεφθείτε την ιστοσελίδα τώρα;"
+ },
+ "twoStepLoginConfirmation": {
+ "message": "Η σύνδεση σε δύο βήματα καθιστά πιο ασφαλή τον λογαριασμό σας, απαιτώντας να επαληθεύσετε τα στοιχεία σας με μια άλλη συσκευή, όπως κλειδί ασφαλείας, εφαρμογή επαλήθευσης, μήνυμα SMS, τηλεφωνική κλήση ή email. Μπορείτε να ενεργοποιήσετε τη σύνδεση σε δύο βήματα στο bitwarden.com. Θέλετε να επισκεφθείτε την ιστοσελίδα τώρα;"
+ },
+ "editedFolder": {
+ "message": "Επεξεργασμένος φάκελος"
+ },
+ "deleteFolderConfirmation": {
+ "message": "Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτόν το φάκελο;"
+ },
+ "deletedFolder": {
+ "message": "Διεγραμμένος φάκελος"
+ },
+ "gettingStartedTutorial": {
+ "message": "Οδηγός Εκμάθησης"
+ },
+ "gettingStartedTutorialVideo": {
+ "message": "Παρακολουθήστε τον οδηγό εκμάθησης μας, για να μάθετε πώς μπορείτε να αξιοποιήσετε στο έπακρο την επέκταση του προγράμματος περιήγησης."
+ },
+ "syncingComplete": {
+ "message": "Ο συγχρονισμός ολοκληρώθηκε"
+ },
+ "syncingFailed": {
+ "message": "Ο συγχρονισμός απέτυχε"
+ },
+ "passwordCopied": {
+ "message": "Ο κωδικός αντιγράφηκε"
+ },
+ "uri": {
+ "message": "URI"
+ },
+ "uriPosition": {
+ "message": "URI $POSITION$",
+ "description": "A listing of URIs. Ex: URI 1, URI 2, URI 3, etc.",
+ "placeholders": {
+ "position": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "newUri": {
+ "message": "Νέο URI"
+ },
+ "addedItem": {
+ "message": "Προστέθηκε στοιχείο"
+ },
+ "editedItem": {
+ "message": "Επεξεργασμένο στοιχείο"
+ },
+ "deleteItemConfirmation": {
+ "message": "Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτό το στοιχείο;"
+ },
+ "deletedItem": {
+ "message": "Διαγραμμένο στοιχείο"
+ },
+ "overwritePassword": {
+ "message": "Αντικατάσταση Κωδικού Πρόσβασης"
+ },
+ "overwritePasswordConfirmation": {
+ "message": "Είστε βέβαιοι ότι θέλετε να αντικαταστήσετε τον τρέχον κωδικό πρόσβασης;"
+ },
+ "searchFolder": {
+ "message": "Αναζήτηση σε φάκελο"
+ },
+ "searchCollection": {
+ "message": "Αναζήτηση στη συλλογή"
+ },
+ "searchType": {
+ "message": "Τύπος αναζήτησης"
+ },
+ "noneFolder": {
+ "message": "Χωρίς Φάκελο",
+ "description": "This is the folder for uncategorized items"
+ },
+ "disableAddLoginNotification": {
+ "message": "Απενεργοποιήστε την Προσθήκη Ειδοποίησης Σύνδεσης"
+ },
+ "addLoginNotificationDesc": {
+ "message": "Η \"Προσθήκη Ειδοποίησης Σύνδεσης\" σας προτρέπει αυτόματα να αποθηκεύσετε νέες συνδέσεις στο vault σας κάθε φορά που θα συνδεθείτε για πρώτη φορά."
+ },
+ "dontShowCardsCurrentTab": {
+ "message": "Να μην Εμφανίζονται Κάρτες στη Σελίδα Καρτέλας"
+ },
+ "dontShowCardsCurrentTabDesc": {
+ "message": "Τα στοιχεία καρτών από το vault σας παρατίθενται στη σελίδα \"Τρέχουσα καρτέλα\" για εύκολη πρόσβαση με αυτόματη συμπλήρωση."
+ },
+ "dontShowIdentitiesCurrentTab": {
+ "message": "Να μην εμφανίζονται ταυτότητες στην καρτέλα"
+ },
+ "dontShowIdentitiesCurrentTabDesc": {
+ "message": "Στοιχεία ταυτότητας από το vault σας, παρατίθενται στη σελίδα \"Τρέχουσα καρτέλα\" για εύκολη πρόσβαση με αυτόματη συμπλήρωση."
+ },
+ "clearClipboard": {
+ "message": "Εκκαθάριση Πρόχειρου",
+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
+ },
+ "clearClipboardDesc": {
+ "message": "Αυτόματη εκκαθάριση αντιγραμμένων τιμών προχείρου.",
+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
+ },
+ "notificationAddDesc": {
+ "message": "Πρέπει το Bitwarden να θυμάται αυτόν τον κωδικό πρόσβασης για εσάς;"
+ },
+ "notificationAddSave": {
+ "message": "Ναι, Αποθήκευση Τώρα"
+ },
+ "notificationNeverSave": {
+ "message": "Ποτέ για αυτή την ιστοσελίδα"
+ },
+ "disableChangedPasswordNotification": {
+ "message": "Απενεργοποίηση ειδοποίησης αλλαγής κωδικού πρόσβασης"
+ },
+ "disableChangedPasswordNotificationDesc": {
+ "message": "Η \"Ειδοποίηση Αλλαγής Κωδικού\" σας ζητά αυτόματα να ενημερώσετε τον κωδικό πρόσβασης του εισερχόμενου στο vault σας κάθε φορά που εντοπίζει ότι το έχετε αλλάξει σε έναν ιστότοπο."
+ },
+ "notificationChangeDesc": {
+ "message": "Θέλετε να ενημερώσετε αυτό τον κωδικό στο Bitwarden ;"
+ },
+ "notificationChangeSave": {
+ "message": "Ναι, Ενημέρωση Τώρα"
+ },
+ "disableContextMenuItem": {
+ "message": "Απενεργοποιήστε τις Επιλογές του Μενού Περιβάλλοντος"
+ },
+ "disableContextMenuItemDesc": {
+ "message": "Οι επιλογές του μενού περιβάλλοντος παρέχουν γρήγορη πρόσβαση στην δημιουργία και σύνδεση κωδικών πρόσβασης για τον ιστότοπο στην τρέχουσα καρτέλα."
+ },
+ "defaultUriMatchDetection": {
+ "message": "Προεπιλεγμένη ανίχνευση αντιστοιχίας URI",
+ "description": "Default URI match detection for auto-fill."
+ },
+ "defaultUriMatchDetectionDesc": {
+ "message": "Επιλέξτε τον προκαθορισμένο τρόπο με τον οποίο αντιμετωπίζεται η ανίχνευση αντιστοίχισης URI για τις συνδέσεις κατά την εκτέλεση ενεργειών όπως η αυτόματη συμπλήρωση."
+ },
+ "theme": {
+ "message": "Θέμα"
+ },
+ "themeDesc": {
+ "message": "Αλλαγή χρώματος θέματος εφαρμογής."
+ },
+ "dark": {
+ "message": "Σκοτεινό",
+ "description": "Dark color"
+ },
+ "light": {
+ "message": "Φωτεινό",
+ "description": "Light color"
+ },
+ "solarizedDark": {
+ "message": "Solarized Σκούρο",
+ "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated."
+ },
+ "exportVault": {
+ "message": "Εξαγωγή Vault"
+ },
+ "fileFormat": {
+ "message": "Μορφή Αρχείου"
+ },
+ "warning": {
+ "message": "ΠΡΟΕΙΔΟΠΟΙΗΣΗ",
+ "description": "WARNING (should stay in capitalized letters if the language permits)"
+ },
+ "confirmVaultExport": {
+ "message": "Επιβεβαίωση εξαγωγής Vault"
+ },
+ "exportWarningDesc": {
+ "message": "Αυτή η εξαγωγή περιέχει τα δεδομένα σε μη κρυπτογραφημένη μορφή. Δεν πρέπει να αποθηκεύετε ή να στείλετε το εξαγόμενο αρχείο μέσω μη ασφαλών τρόπων (όπως μέσω email). Διαγράψτε το αμέσως μόλις τελειώσετε με τη χρήση του."
+ },
+ "encExportKeyWarningDesc": {
+ "message": "Αυτή η εξαγωγή κρυπτογραφεί τα δεδομένα σας χρησιμοποιώντας το κλειδί κρυπτογράφησης του λογαριασμού σας. Εάν ποτέ περιστρέψετε το κλειδί κρυπτογράφησης του λογαριασμού σας, θα πρέπει να κάνετε εξαγωγή ξανά, καθώς δεν θα μπορείτε να αποκρυπτογραφήσετε αυτό το αρχείο εξαγωγής."
+ },
+ "encExportAccountWarningDesc": {
+ "message": "Τα κλειδιά κρυπτογράφησης λογαριασμού είναι μοναδικά για κάθε λογαριασμό χρήστη Bitwarden, οπότε δεν μπορείτε να εισάγετε μια κρυπτογραφημένη εξαγωγή σε διαφορετικό λογαριασμό."
+ },
+ "exportMasterPassword": {
+ "message": "Πληκτρολογήστε τον κύριο κωδικό για εξαγωγή δεδομένων vault."
+ },
+ "shared": {
+ "message": "Κοινοποιήθηκε"
+ },
+ "learnOrg": {
+ "message": "Μάθετε για τους Οργανισμούς"
+ },
+ "learnOrgConfirmation": {
+ "message": "Το Bitwarden επιτρέπει να μοιράζεστε τα στοιχεία του vault σας με άλλους χρησιμοποιώντας ένα λογαριασμό οργανισμού. Θέλετε να επισκεφθείτε την ιστοσελίδα bitwarden.com για να μάθετε περισσότερα;"
+ },
+ "moveToOrganization": {
+ "message": "Μετακίνηση στον Οργανισμό"
+ },
+ "share": {
+ "message": "Κοινοποίηση"
+ },
+ "movedItemToOrg": {
+ "message": "$ITEMNAME$ μετακινήθηκε στο $ORGNAME$",
+ "placeholders": {
+ "itemname": {
+ "content": "$1",
+ "example": "Secret Item"
+ },
+ "orgname": {
+ "content": "$2",
+ "example": "Company Name"
+ }
+ }
+ },
+ "moveToOrgDesc": {
+ "message": "Επιλέξτε έναν οργανισμό στον οποίο θέλετε να μετακινήσετε αυτό το στοιχείο. Η μετακίνηση σε έναν οργανισμό μεταβιβάζει την ιδιοκτησία του στοιχείου σε αυτό τον οργανισμό. Δεν θα είστε πλέον ο άμεσος ιδιοκτήτης αυτού του στοιχείου μόλις το μετακινήσετε."
+ },
+ "learnMore": {
+ "message": "Μάθετε περισσότερα"
+ },
+ "authenticatorKeyTotp": {
+ "message": "Κλειδί επαλήθευσης (TOTP)"
+ },
+ "verificationCodeTotp": {
+ "message": "Κωδικός Επαλήθευσης (TOTP)"
+ },
+ "copyVerificationCode": {
+ "message": "Αντιγραφή Κωδικού Επαλήθευσης"
+ },
+ "attachments": {
+ "message": "Συνημμένα"
+ },
+ "deleteAttachment": {
+ "message": "Διαγραφή συννημένου"
+ },
+ "deleteAttachmentConfirmation": {
+ "message": "Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτό το συννημένο;"
+ },
+ "deletedAttachment": {
+ "message": "Το συνημμένο διαγράφηκε"
+ },
+ "newAttachment": {
+ "message": "Προσθήκη Νέου Συνημμένου"
+ },
+ "noAttachments": {
+ "message": "Χωρίς συνημμένα."
+ },
+ "attachmentSaved": {
+ "message": "Το συννημένο έχει αποθηκευτεί."
+ },
+ "file": {
+ "message": "Αρχείο"
+ },
+ "selectFile": {
+ "message": "Επιλέξτε ένα αρχείο."
+ },
+ "maxFileSize": {
+ "message": "Το μέγιστο μέγεθος αρχείου είναι 500 MB."
+ },
+ "featureUnavailable": {
+ "message": "Μη Διαθέσιμο Χαρακτηριστικό"
+ },
+ "updateKey": {
+ "message": "Δεν μπορείτε να χρησιμοποιήσετε αυτήν τη λειτουργία μέχρι να ενημερώσετε το κλειδί κρυπτογράφησης."
+ },
+ "premiumMembership": {
+ "message": "Συνδρομή Premium"
+ },
+ "premiumManage": {
+ "message": "Διαχείριση Συνδρομής"
+ },
+ "premiumManageAlert": {
+ "message": "Μπορείτε να διαχειριστείτε την ιδιότητά σας ως μέλος στο bitwarden.com web vault. Θέλετε να επισκεφθείτε την ιστοσελίδα τώρα;"
+ },
+ "premiumRefresh": {
+ "message": "Ανανέωση Συνδρομής"
+ },
+ "premiumNotCurrentMember": {
+ "message": "Δεν είστε premium μέλος."
+ },
+ "premiumSignUpAndGet": {
+ "message": "Εγγραφείτε για μια premium συνδρομή και λάβετε:"
+ },
+ "ppremiumSignUpStorage": {
+ "message": "1 GB κρυπτογραφημένο αποθηκευτικό χώρο για συνημμένα αρχεία."
+ },
+ "ppremiumSignUpTwoStep": {
+ "message": "Πρόσθετες επιλογές σύνδεσης δύο βημάτων, όπως το YubiKey, το FIDO U2F και το Duo."
+ },
+ "ppremiumSignUpReports": {
+ "message": "Ασφάλεια κωδικών, υγεία λογαριασμού και αναφορές παραβίασης δεδομένων για να διατηρήσετε ασφαλές το vault σας."
+ },
+ "ppremiumSignUpTotp": {
+ "message": "Δημιουργία TOTP κωδικού επαλήθευσης (2FA), για συνδέσεις στο vault σας."
+ },
+ "ppremiumSignUpSupport": {
+ "message": "Προτεραιότητα υποστήριξης πελατών."
+ },
+ "ppremiumSignUpFuture": {
+ "message": "Όλα τα μελλοντικά χαρακτηριστικά premium. Έρχονται περισσότερα σύντομα!"
+ },
+ "premiumPurchase": {
+ "message": "Αγορά Premium έκδοσης"
+ },
+ "premiumPurchaseAlert": {
+ "message": "Μπορείτε να αγοράσετε συνδρομή premium στο bitwarden.com web vault. Θέλετε να επισκεφθείτε την ιστοσελίδα τώρα;"
+ },
+ "premiumCurrentMember": {
+ "message": "Είστε ένα premium μέλος!"
+ },
+ "premiumCurrentMemberThanks": {
+ "message": "Ευχαριστούμε που υποστηρίζετε το Bitwarden."
+ },
+ "premiumPrice": {
+ "message": "Όλα για μόνο $PRICE$ /έτος!",
+ "placeholders": {
+ "price": {
+ "content": "$1",
+ "example": "$10"
+ }
+ }
+ },
+ "refreshComplete": {
+ "message": "Επιτυχής ανανέωση"
+ },
+ "disableAutoTotpCopy": {
+ "message": "Απενεργοποίηση Aυτόματης Aντιγραφής TOTP"
+ },
+ "disableAutoTotpCopyDesc": {
+ "message": "Εάν η σύνδεση έχει συνημμένο κάποιο κλειδί επαλήθευσης, ο κωδικός επαλήθευσης TOTP αντιγράφεται αυτόματα στο πρόχειρο κάθε φορά που συμπληρώνετε αυτόματα τα στοιχεία σύνδεσης."
+ },
+ "disableAutoBiometricsPrompt": {
+ "message": "Μην ζητάτε βιομετρικά στοιχεία κατά την εκκίνηση"
+ },
+ "premiumRequired": {
+ "message": "Απαιτείται Έκδοση Premium"
+ },
+ "premiumRequiredDesc": {
+ "message": "Για να χρησιμοποιήσετε αυτή τη λειτουργία, απαιτείται η έκδοση premium."
+ },
+ "enterVerificationCodeApp": {
+ "message": "Εισάγετε τον 6ψήφιο κωδικό από την εφαρμογή επαλήθευσης."
+ },
+ "enterVerificationCodeEmail": {
+ "message": "Εισάγετε τον 6ψήφιο κωδικό επαλήθευσης τον οποίο λάβατε στο $EMAIL$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "example@gmail.com"
+ }
+ }
+ },
+ "verificationCodeEmailSent": {
+ "message": "Εστάλη email επαλήθευσης στο $EMAIL$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "example@gmail.com"
+ }
+ }
+ },
+ "rememberMe": {
+ "message": "Να με θυμάσαι"
+ },
+ "sendVerificationCodeEmailAgain": {
+ "message": "Αποστολή email κωδικού επαλήθευσης ξανά"
+ },
+ "useAnotherTwoStepMethod": {
+ "message": "Χρήση άλλης μεθόδου σύνδεσης δύο παραγόντων"
+ },
+ "insertYubiKey": {
+ "message": "Τοποθετήστε το YubiKey στη θύρα USB του υπολογιστή σας και έπειτα κάντε κλικ στο κουμπί του."
+ },
+ "insertU2f": {
+ "message": "Εισάγετε το κλειδί ασφαλείας στη θύρα USB του υπολογιστή σας. Αν έχει κουμπί, πατήστε το."
+ },
+ "webAuthnNewTab": {
+ "message": "Συνεχίστε την επαλήθευση WebAuthn 2FA στη νέα καρτέλα."
+ },
+ "webAuthnNewTabOpen": {
+ "message": "Άνοιγμα νέας καρτέλας"
+ },
+ "webAuthnAuthenticate": {
+ "message": "Ταυτοποίηση WebAuthn"
+ },
+ "loginUnavailable": {
+ "message": "Σύνδεση μη Διαθέσιμη"
+ },
+ "noTwoStepProviders": {
+ "message": "Αυτός ο λογαριασμός έχει ενεργοποιημένη τη σύνδεση σε δύο βήματα, ωστόσο, κανένας από τους διαμορφωμένους παροχείς δύο βημάτων δεν υποστηρίζεται από αυτό το πρόγραμμα περιήγησης."
+ },
+ "noTwoStepProviders2": {
+ "message": "Παρακαλούμε χρησιμοποιήστε ένα υποστηριζόμενο πρόγραμμα περιήγησης (όπως το Chrome) και/ή προσθέστε επιπλέον ή/και προσθέστε άλλους παρόχους που υποστηρίζονται καλύτερα σε προγράμματα περιήγησης (όπως μια εφαρμογή επαλήθευσης)."
+ },
+ "twoStepOptions": {
+ "message": "Επιλογές σύνδεσης δύο παραγόντων"
+ },
+ "recoveryCodeDesc": {
+ "message": "Έχετε χάσει την πρόσβαση σε όλους τους παρόχους δύο παραγόντων; Χρησιμοποιήστε τον κωδικό ανάκτησης για να απενεργοποιήσετε όλους τους παρόχους δύο παραγόντων από το λογαριασμό σας."
+ },
+ "recoveryCodeTitle": {
+ "message": "Κωδικός Ανάκτησης"
+ },
+ "authenticatorAppTitle": {
+ "message": "Εφαρμογή Επαλήθευσης Ταυτότητας"
+ },
+ "authenticatorAppDesc": {
+ "message": "Χρησιμοποιήστε μια εφαρμογή επαλήθευσης (όπως το Authy ή Google Authenticator) για να δημιουργήσει κωδικούς επαλήθευσης με χρόνικο περιορισμό.",
+ "description": "'Authy' and 'Google Authenticator' are product names and should not be translated."
+ },
+ "yubiKeyTitle": {
+ "message": "Κλειδί ασφαλείας YubiKey OTP"
+ },
+ "yubiKeyDesc": {
+ "message": "Χρησιμοποιήστε ένα YubiKey για να αποκτήσετε πρόσβαση στο λογαριασμό σας. Λειτουργεί με συσκευές σειράς YubiKey 4, 4 Nano, 4C και συσκευές NEO."
+ },
+ "duoDesc": {
+ "message": "Επαληθεύστε με το Duo Security χρησιμοποιώντας την εφαρμογή Duo Mobile, μηνύματα SMS, τηλεφωνική κλήση ή κλειδί ασφαλείας U2F.",
+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
+ },
+ "duoOrganizationDesc": {
+ "message": "Επαληθεύστε με το Duo Security για τον οργανισμό σας χρησιμοποιώντας την εφαρμογή Duo Mobile, μηνύματα SMS, τηλεφωνική κλήση ή κλειδί ασφαλείας U2F.",
+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
+ },
+ "webAuthnTitle": {
+ "message": "FIDO2 WebAuthn"
+ },
+ "webAuthnDesc": {
+ "message": "Χρησιμοποιήστε οποιοδήποτε κλειδί ασφαλείας WebAuthn για να αποκτήσετε πρόσβαση στο λογαριασμό σας."
+ },
+ "emailTitle": {
+ "message": "Email"
+ },
+ "emailDesc": {
+ "message": "Οι κωδικοί επαλήθευσης θα σας αποσταλούν μέσω ηλεκτρονικού ταχυδρομείου."
+ },
+ "selfHostedEnvironment": {
+ "message": "Αυτο-φιλοξενούμενο περιβάλλον"
+ },
+ "selfHostedEnvironmentFooter": {
+ "message": "Καθορίστε τη βασική διεύθυνση URL, της εγκατάστασης του Bitwarden που φιλοξενείται στο χώρο σας."
+ },
+ "customEnvironment": {
+ "message": "Προσαρμοσμένο περιβάλλον"
+ },
+ "customEnvironmentFooter": {
+ "message": "Για προχωρημένους χρήστες. Μπορείτε να ορίσετε ανεξάρτητα τη βασική διεύθυνση URL κάθε υπηρεσίας."
+ },
+ "baseUrl": {
+ "message": "URL Διακομιστή"
+ },
+ "apiUrl": {
+ "message": "URL Διακομιστή API"
+ },
+ "webVaultUrl": {
+ "message": "Web Vault Server URL"
+ },
+ "identityUrl": {
+ "message": "URL Ταυτότητας Διακομιστή"
+ },
+ "notificationsUrl": {
+ "message": "Ειδοποιήσεις Διεύθυνσης URL Διακομιστή"
+ },
+ "iconsUrl": {
+ "message": "Εικονίδια διακομιστή URL"
+ },
+ "environmentSaved": {
+ "message": "Οι διευθύνσεις URL περιβάλλοντος έχουν αποθηκευτεί."
+ },
+ "enableAutoFillOnPageLoad": {
+ "message": "Ενεργοποίηση αυτόματης συμπλήρωσης κατά την φόρτωση της σελίδας"
+ },
+ "enableAutoFillOnPageLoadDesc": {
+ "message": "Εάν εντοπιστεί μια φόρμα σύνδεσης, πραγματοποιείται αυτόματα μια αυτόματη συμπλήρωση όταν φορτώνεται η ιστοσελίδα."
+ },
+ "experimentalFeature": {
+ "message": "Αυτή είναι μια πειραματική λειτουργία. Χρησιμοποιήστε το με δική σας ευθύνη."
+ },
+ "defaultAutoFillOnPageLoad": {
+ "message": "Προεπιλεγμένη ρύθμιση αυτόματης συμπλήρωσης για στοιχεία σύνδεσης"
+ },
+ "defaultAutoFillOnPageLoadDesc": {
+ "message": "Αφού ενεργοποιήσετε την αυτόματη συμπλήρωση κατά τη Φόρτωση Σελίδας, μπορείτε να ενεργοποιήσετε ή να απενεργοποιήσετε τη λειτουργία για μεμονωμένα στοιχεία σύνδεσης. Αυτή είναι η προεπιλεγμένη ρύθμιση για στοιχεία σύνδεσης που δεν έχουν ρυθμιστεί ξεχωριστά."
+ },
+ "itemAutoFillOnPageLoad": {
+ "message": "Αυτόματη συμπλήρωση της Φόρτισης Σελίδας (αν είναι ενεργοποιημένη στις Επιλογές)"
+ },
+ "autoFillOnPageLoadUseDefault": {
+ "message": "Χρήση προεπιλεγμένης ρύθμισης"
+ },
+ "autoFillOnPageLoadYes": {
+ "message": "Αυτόματη συμπλήρωση κατά την φόρτωση της σελίδας"
+ },
+ "autoFillOnPageLoadNo": {
+ "message": "Μη αυτόματη συμπλήρωση κατά τη φόρτωση της σελίδας"
+ },
+ "commandOpenPopup": {
+ "message": "Άνοιγμα αναδυόμενου vault"
+ },
+ "commandOpenSidebar": {
+ "message": "Άνοιγμα αναδυόμενου vault στην πλευρική μπάρα"
+ },
+ "commandAutofillDesc": {
+ "message": "Αυτόματη συμπλήρωση της τελευταίας χρησιμοποιούμενης σύνδεσης για αυτόν τον ιστότοπο"
+ },
+ "commandGeneratePasswordDesc": {
+ "message": "Δημιουργήστε και αντιγράψτε έναν νέο τυχαίο κωδικό πρόσβασης στο πρόχειρο"
+ },
+ "commandLockVaultDesc": {
+ "message": "Κλειδώστε το vault"
+ },
+ "privateModeMessage": {
+ "message": "Δυστυχώς, αυτό το παράθυρο δεν είναι διαθέσιμο σε ιδιωτική λειτουργία για αυτό το πρόγραμμα περιήγησης."
+ },
+ "customFields": {
+ "message": "Προσαρμοσμένα Πεδία"
+ },
+ "copyValue": {
+ "message": "Αντιγραφή Τιμής"
+ },
+ "value": {
+ "message": "Τιμή"
+ },
+ "newCustomField": {
+ "message": "Νέο Προσαρμοσμένο Πεδίο"
+ },
+ "dragToSort": {
+ "message": "Σύρετε για ταξινόμηση"
+ },
+ "cfTypeText": {
+ "message": "Κείμενο"
+ },
+ "cfTypeHidden": {
+ "message": "Κρυφό"
+ },
+ "cfTypeBoolean": {
+ "message": "Δυαδικό"
+ },
+ "popup2faCloseMessage": {
+ "message": "Εάν κάνετε κλικ έξω από το αναδυόμενο παράθυρο για να ελέγξετε το email για κωδικό επαλήθευσης, το αναδυόμενο παράθυρο θα κλείσει. Θέλετε να ανοίξετε αυτό το αναδυόμενο σε νέο παράθυρο ώστε να μην κλείνει;"
+ },
+ "popupU2fCloseMessage": {
+ "message": "Αυτό το πρόγραμμα περιήγησης δεν μπορεί να επεξεργαστεί αιτήματα του U2F σε αυτό το αναδυόμενο παράθυρο. Θέλετε να ανοίξετε το αναδυόμενο σε νέο παράθυρο, ώστε να μπορείτε να συνδεθείτε χρησιμοποιώντας U2F;"
+ },
+ "disableFavicon": {
+ "message": "Απενεργοποίηση Εικονιδίων Ιστοσελίδας"
+ },
+ "disableFaviconDesc": {
+ "message": "Τα εικονίδια ιστοσελίδων παρέχουν μια αναγνωρίσιμη εικόνα δίπλα σε κάθε στοιχείο σύνδεσης της λίστας σας."
+ },
+ "disableBadgeCounter": {
+ "message": "Απενεργοποίηση Μετρητή Σημάτων"
+ },
+ "disableBadgeCounterDesc": {
+ "message": "Ο μετρητής εμβλημάτων δείχνει πόσες συνδέσεις έχετε για την τρέχουσα σελίδα στο vault σας."
+ },
+ "cardholderName": {
+ "message": "Όνομα κατόχου της κάρτας"
+ },
+ "number": {
+ "message": "Αριθμός"
+ },
+ "brand": {
+ "message": "Επωνυμία"
+ },
+ "expirationMonth": {
+ "message": "Μήνας Λήξης"
+ },
+ "expirationYear": {
+ "message": "Έτος λήξης"
+ },
+ "expiration": {
+ "message": "Λήξη"
+ },
+ "january": {
+ "message": "Ιανουάριος"
+ },
+ "february": {
+ "message": "Φεβρουάριος"
+ },
+ "march": {
+ "message": "Μάρτιος"
+ },
+ "april": {
+ "message": "Απρίλιος"
+ },
+ "may": {
+ "message": "Μάιος"
+ },
+ "june": {
+ "message": "Ιούνιος"
+ },
+ "july": {
+ "message": "Ιούλιος"
+ },
+ "august": {
+ "message": "Αύγουστος"
+ },
+ "september": {
+ "message": "Σεπτέμβριος"
+ },
+ "october": {
+ "message": "Οκτώβριος"
+ },
+ "november": {
+ "message": "Νοέμβριος"
+ },
+ "december": {
+ "message": "Δεκέμβριος"
+ },
+ "securityCode": {
+ "message": "Κωδικός Ασφαλείας"
+ },
+ "ex": {
+ "message": "πχ."
+ },
+ "title": {
+ "message": "Τίτλος"
+ },
+ "mr": {
+ "message": "Κος"
+ },
+ "mrs": {
+ "message": "Κα"
+ },
+ "ms": {
+ "message": "Κα"
+ },
+ "dr": {
+ "message": "Dr"
+ },
+ "firstName": {
+ "message": "Όνομα"
+ },
+ "middleName": {
+ "message": "Μεσαίο όνομα"
+ },
+ "lastName": {
+ "message": "Επίθετο"
+ },
+ "identityName": {
+ "message": "Όνομα Ταυτότητας"
+ },
+ "company": {
+ "message": "Εταιρεία"
+ },
+ "ssn": {
+ "message": "ΑΜΚΑ"
+ },
+ "passportNumber": {
+ "message": "Αριθμός Διαβατηρίου"
+ },
+ "licenseNumber": {
+ "message": "Αριθμός Άδειας"
+ },
+ "email": {
+ "message": "Email"
+ },
+ "phone": {
+ "message": "Τηλέφωνο"
+ },
+ "address": {
+ "message": "Διεύθυνση"
+ },
+ "address1": {
+ "message": "Διεύθυνση 1"
+ },
+ "address2": {
+ "message": "Διεύθυνση 2"
+ },
+ "address3": {
+ "message": "Διεύθυνση 3"
+ },
+ "cityTown": {
+ "message": "Πόλη / Κωμόπολη"
+ },
+ "stateProvince": {
+ "message": "Περιοχή / Νομός"
+ },
+ "zipPostalCode": {
+ "message": "Ταχυδρομικός Κώδικας"
+ },
+ "country": {
+ "message": "Χώρα"
+ },
+ "type": {
+ "message": "Τύπος"
+ },
+ "typeLogin": {
+ "message": "Σύνδεση"
+ },
+ "typeLogins": {
+ "message": "Συνδέσεις"
+ },
+ "typeSecureNote": {
+ "message": "Ασφαλής Σημείωση"
+ },
+ "typeCard": {
+ "message": "Κάρτα"
+ },
+ "typeIdentity": {
+ "message": "Ταυτότητα"
+ },
+ "passwordHistory": {
+ "message": "Ιστορικό Κωδικού"
+ },
+ "back": {
+ "message": "Πίσω"
+ },
+ "collections": {
+ "message": "Συλλογές"
+ },
+ "favorites": {
+ "message": "Αγαπημένα"
+ },
+ "popOutNewWindow": {
+ "message": "Αναδύεται σε ένα νέο παράθυρο"
+ },
+ "refresh": {
+ "message": "Ανανέωση"
+ },
+ "cards": {
+ "message": "Κάρτες"
+ },
+ "identities": {
+ "message": "Ταυτότητες"
+ },
+ "logins": {
+ "message": "Συνδέσεις"
+ },
+ "secureNotes": {
+ "message": "Ασφαλείς Σημειώσεις"
+ },
+ "clear": {
+ "message": "Εκκαθάριση",
+ "description": "To clear something out. example: To clear browser history."
+ },
+ "checkPassword": {
+ "message": "Ελέγξτε εάν ο κωδικός έχει εκτεθεί."
+ },
+ "passwordExposed": {
+ "message": "Αυτός ο κωδικός έχει εκτεθεί $VALUE$ φορά (ές) σε διαρροές δεδομένων. Πρέπει να τον αλλάξετε.",
+ "placeholders": {
+ "value": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "passwordSafe": {
+ "message": "Αυτός ο κωδικός δεν βρέθηκε σε κάποια γνωστή διαρροή δεδομένων. Θα πρέπει να είναι ασφαλής για χρήση."
+ },
+ "baseDomain": {
+ "message": "Βασικός τομέας"
+ },
+ "host": {
+ "message": "Διακομιστής",
+ "description": "A URL's host value. For example, the host of https://sub.domain.com:443 is 'sub.domain.com:443'."
+ },
+ "exact": {
+ "message": "Ακριβής"
+ },
+ "startsWith": {
+ "message": "Έναρξη με"
+ },
+ "regEx": {
+ "message": "Κανονική έκφραση",
+ "description": "A programming term, also known as 'RegEx'."
+ },
+ "matchDetection": {
+ "message": "Εντοπισμός Αντιστοίχισης",
+ "description": "URI match detection for auto-fill."
+ },
+ "defaultMatchDetection": {
+ "message": "Προεπιλεγμένος εντοπισμός αντιστοίχισης",
+ "description": "Default URI match detection for auto-fill."
+ },
+ "toggleOptions": {
+ "message": "Επιλογές Εναλλαγής"
+ },
+ "toggleCurrentUris": {
+ "message": "Εναλλαγή τρεχόντων URI",
+ "description": "Toggle the display of the URIs of the currently open tabs in the browser."
+ },
+ "currentUri": {
+ "message": "Τρεχόν URI",
+ "description": "The URI of one of the current open tabs in the browser."
+ },
+ "organization": {
+ "message": "Οργανισμός",
+ "description": "An entity of multiple related people (ex. a team or business organization)."
+ },
+ "types": {
+ "message": "Τύποι"
+ },
+ "allItems": {
+ "message": "Όλα τα στοιχεία"
+ },
+ "noPasswordsInList": {
+ "message": "Δεν υπάρχουν κωδικοί στη λίστα."
+ },
+ "remove": {
+ "message": "Αφαίρεση"
+ },
+ "default": {
+ "message": "Προεπιλογή"
+ },
+ "dateUpdated": {
+ "message": "Ενημερώθηκε",
+ "description": "ex. Date this item was updated"
+ },
+ "datePasswordUpdated": {
+ "message": "Ο Κωδικός Ενημερώθηκε",
+ "description": "ex. Date this password was updated"
+ },
+ "neverLockWarning": {
+ "message": "Είστε βέβαιοι ότι θέλετε να χρησιμοποιήσετε την επιλογή \"Ποτέ\"; Ο ορισμός των επιλογών κλειδώματος σε \"Ποτέ\" αποθηκεύει το κλειδί κρυπτογράφησης του vault στη συσκευή σας. Εάν χρησιμοποιήσετε αυτήν την επιλογή, θα πρέπει να διασφαλίσετε ότι θα διατηρείτε τη συσκευή σας σωστά προστατευμένη."
+ },
+ "noOrganizationsList": {
+ "message": "Δεν συμμετέχετε σε κάποιον οργανισμό. Οι οργανισμοί επιτρέπουν την ασφαλή κοινοποίηση στοιχείων με άλλους χρήστες."
+ },
+ "noCollectionsInList": {
+ "message": "Δεν υπάρχουν στοιχεία για εμφάνιση."
+ },
+ "ownership": {
+ "message": "Ιδιοκτησία"
+ },
+ "whoOwnsThisItem": {
+ "message": "Ποιος κατέχει αυτό το στοιχείο;"
+ },
+ "strong": {
+ "message": "Ισχυρός",
+ "description": "ex. A strong password. Scale: Weak -> Good -> Strong"
+ },
+ "good": {
+ "message": "Καλός",
+ "description": "ex. A good password. Scale: Weak -> Good -> Strong"
+ },
+ "weak": {
+ "message": "Αδύναμος",
+ "description": "ex. A weak password. Scale: Weak -> Good -> Strong"
+ },
+ "weakMasterPassword": {
+ "message": "Αδύναμος Κύριος Κωδικός"
+ },
+ "weakMasterPasswordDesc": {
+ "message": "Ο κύριος κωδικός που έχετε επιλέξει είναι αδύναμος. Θα πρέπει να χρησιμοποιήσετε έναν ισχυρό κύριο κωδικό (ή μια φράση) για την κατάλληλη προστασία του λογαριασμού Bitwarden. Είστε βέβαιοι ότι θέλετε να χρησιμοποιήσετε αυτόν τον κύριο κωδικό;"
+ },
+ "pin": {
+ "message": "PIN",
+ "description": "PIN code. Ex. The short code (often numeric) that you use to unlock a device."
+ },
+ "unlockWithPin": {
+ "message": "Ξεκλείδωμα με PIN"
+ },
+ "setYourPinCode": {
+ "message": "Ορίστε τον κωδικό PIN για να ξεκλειδώσετε το Bitwarden. Οι ρυθμίσεις PIN θα επαναρυθμιστούν αν αποσυνδεθείτε πλήρως από την εφαρμογή."
+ },
+ "pinRequired": {
+ "message": "Απαιτείται κωδικός PIN."
+ },
+ "invalidPin": {
+ "message": "Μη έγκυρος κωδικός PIN."
+ },
+ "verifyPin": {
+ "message": "Επαλήθευση PIN"
+ },
+ "yourVaultIsLockedPinCode": {
+ "message": "Το vault σας είναι κλειδωμένο. Επαληθεύστε τον κωδικό PIN για να συνεχίσετε."
+ },
+ "unlockWithBiometrics": {
+ "message": "Ξεκλείδωμα με βιομετρικά στοιχεία"
+ },
+ "awaitDesktop": {
+ "message": "Αναμονή επιβεβαίωσης από την επιφάνεια εργασίας"
+ },
+ "awaitDesktopDesc": {
+ "message": "Παρακαλώ επιβεβαιώστε τη χρήση βιομετρικών στοιχείων στην εφαρμογή Bitwarden Desktop για να ενεργοποιήσετε τα βιομετρικά στοιχεία για το πρόγραμμα περιήγησης."
+ },
+ "lockWithMasterPassOnRestart": {
+ "message": "Κλείδωμα με κύριο κωδικό πρόσβασης στην επανεκκίνηση του προγράμματος περιήγησης"
+ },
+ "selectOneCollection": {
+ "message": "Πρέπει να επιλέξετε τουλάχιστον μία συλλογή."
+ },
+ "cloneItem": {
+ "message": "Κλώνος Αντικειμένου"
+ },
+ "clone": {
+ "message": "Κλώνος"
+ },
+ "passwordGeneratorPolicyInEffect": {
+ "message": "Μία ή περισσότερες πολιτικές του οργανισμού επηρεάζουν τις ρυθμίσεις της γεννήτριας."
+ },
+ "vaultTimeoutAction": {
+ "message": "Ενέργεια Χρόνου Λήξης Vault"
+ },
+ "lock": {
+ "message": "Κλείδωμα",
+ "description": "Verb form: to make secure or inaccesible by"
+ },
+ "trash": {
+ "message": "Κάδος Απορριμάτων",
+ "description": "Noun: a special folder to hold deleted items"
+ },
+ "searchTrash": {
+ "message": "Αναζήτηση Κάδου"
+ },
+ "permanentlyDeleteItem": {
+ "message": "Μόνιμη Διαγραφή Αντικειμένου"
+ },
+ "permanentlyDeleteItemConfirmation": {
+ "message": "Είστε βέβαιοι ότι θέλετε να διαγράψετε μόνιμα αυτό το στοιχείο;"
+ },
+ "permanentlyDeletedItem": {
+ "message": "Μόνιμα Διεγραμμένο Στοιχείο"
+ },
+ "restoreItem": {
+ "message": "Ανάκτηση Στοιχείου"
+ },
+ "restoreItemConfirmation": {
+ "message": "Είστε βέβαιοι ότι θέλετε να ανακτήσετε αυτό το στοιχείο;"
+ },
+ "restoredItem": {
+ "message": "Στοιχείο που έχει Ανακτηθεί"
+ },
+ "vaultTimeoutLogOutConfirmation": {
+ "message": "Η αποσύνδεση θα καταργήσει όλη την πρόσβαση στο vault σας και απαιτεί online έλεγχο ταυτότητας μετά το χρονικό όριο λήξης. Είστε βέβαιοι ότι θέλετε να χρησιμοποιήσετε αυτήν τη ρύθμιση;"
+ },
+ "vaultTimeoutLogOutConfirmationTitle": {
+ "message": "Επιβεβαίωση Ενέργειας Χρονικού Ορίου"
+ },
+ "autoFillAndSave": {
+ "message": "Αυτόματη συμπλήρωση και αποθήκευση"
+ },
+ "autoFillSuccessAndSavedUri": {
+ "message": "Αυτόματη συμπλήρωση στοιχείου και αποθηκευμένο URI"
+ },
+ "autoFillSuccess": {
+ "message": "Αυτόματη συμπλήρωση αντικειμένου"
+ },
+ "setMasterPassword": {
+ "message": "Ορισμός Κύριου Κωδικού"
+ },
+ "masterPasswordPolicyInEffect": {
+ "message": "Σε μία ή περισσότερες πολιτικές του οργανισμού απαιτείται ο κύριος κωδικός να πληρεί τις ακόλουθες απαιτήσεις:"
+ },
+ "policyInEffectMinComplexity": {
+ "message": "Ελάχιστος βαθμός πολυπλοκότητας: $SCORE$",
+ "placeholders": {
+ "score": {
+ "content": "$1",
+ "example": "4"
+ }
+ }
+ },
+ "policyInEffectMinLength": {
+ "message": "Ελάχιστο μήκος: $LENGTH$",
+ "placeholders": {
+ "length": {
+ "content": "$1",
+ "example": "14"
+ }
+ }
+ },
+ "policyInEffectUppercase": {
+ "message": "Να περιέχει έναν ή περισσότερους κεφαλαίους χαρακτήρες"
+ },
+ "policyInEffectLowercase": {
+ "message": "Να περιέχει έναν ή περισσότερους πεζούς χαρακτήρες"
+ },
+ "policyInEffectNumbers": {
+ "message": "Να περιέχει έναν ή περισσότερους αριθμούς"
+ },
+ "policyInEffectSpecial": {
+ "message": "Να περιέχει έναν ή περισσότερους από τους ακόλουθους ειδικούς χαρακτήρες $CHARS$",
+ "placeholders": {
+ "chars": {
+ "content": "$1",
+ "example": "!@#$%^&*"
+ }
+ }
+ },
+ "masterPasswordPolicyRequirementsNotMet": {
+ "message": "Ο νέος κύριος κωδικός δεν πληροί τις απαιτήσεις πολιτικής."
+ },
+ "acceptPolicies": {
+ "message": "Επιλέγοντας αυτό το πλαίσιο, συμφωνείτε με τα εξής:"
+ },
+ "acceptPoliciesError": {
+ "message": "Οι Όροι Παροχής Υπηρεσιών και η Πολιτική Απορρήτου δεν έχουν αναγνωριστεί."
+ },
+ "termsOfService": {
+ "message": "Όροι Χρήσης"
+ },
+ "privacyPolicy": {
+ "message": "Πολιτική Απορρήτου"
+ },
+ "hintEqualsPassword": {
+ "message": "Η υπόδειξη κωδικού πρόσβασης, δεν μπορεί να είναι η ίδια με τον κωδικό πρόσβασης σας."
+ },
+ "ok": {
+ "message": "Οκ"
+ },
+ "desktopSyncVerificationTitle": {
+ "message": "Επιβεβαίωση συγχρονισμού επιφάνειας εργασίας"
+ },
+ "desktopIntegrationVerificationText": {
+ "message": "Παρακαλώ επιβεβαιώστε ότι η εφαρμογή επιφάνειας εργασίας εμφανίζει αυτό το αποτύπωμα: "
+ },
+ "desktopIntegrationDisabledTitle": {
+ "message": "Η ενσωμάτωση του περιηγητή δεν είναι ενεργοποιημένη"
+ },
+ "desktopIntegrationDisabledDesc": {
+ "message": "Η ενσωμάτωση του προγράμματος περιήγησης δεν είναι ενεργοποιημένη στην εφαρμογή Bitwarden Desktop. Παρακαλώ ενεργοποιήστε την στις ρυθμίσεις της εφαρμογής desktop."
+ },
+ "startDesktopTitle": {
+ "message": "Ξεκινήστε την εφαρμογή Bitwarden Επιφάνεια εργασίας"
+ },
+ "startDesktopDesc": {
+ "message": "Η εφαρμογή Bitwarden Desktop πρέπει να ξεκινήσει για να μπορεί να χρησιμοποιηθεί αυτή η λειτουργία."
+ },
+ "errorEnableBiometricTitle": {
+ "message": "Αδυναμία ενεργοποίησης βιομετρικών στοιχείων"
+ },
+ "errorEnableBiometricDesc": {
+ "message": "Η ενέργεια ακυρώθηκε από την εφαρμογή επιφάνειας εργασίας"
+ },
+ "nativeMessagingInvalidEncryptionDesc": {
+ "message": "Η εφαρμογή επιφάνειας εργασίας ακυρώνει το ασφαλές κανάλι επικοινωνίας. Παρακαλώ δοκιμάστε ξανά αυτή τη λειτουργία"
+ },
+ "nativeMessagingInvalidEncryptionTitle": {
+ "message": "Η επικοινωνία επιφάνειας εργασίας διακόπηκε"
+ },
+ "nativeMessagingWrongUserDesc": {
+ "message": "Η εφαρμογή επιφάνειας εργασίας είναι συνδεδεμένη σε διαφορετικό λογαριασμό. Παρακαλώ βεβαιωθείτε ότι και οι δύο εφαρμογές είναι συνδεδεμένες στον ίδιο λογαριασμό."
+ },
+ "nativeMessagingWrongUserTitle": {
+ "message": "Απόρριψη λογαριασμού"
+ },
+ "biometricsNotEnabledTitle": {
+ "message": "Η βιομετρική δεν είναι ενεργοποιημένη"
+ },
+ "biometricsNotEnabledDesc": {
+ "message": "Τα βιομετρικά στοιχεία του προγράμματος περιήγησης απαιτούν την ενεργοποίηση της βιομετρικής επιφάνειας εργασίας στις ρυθμίσεις πρώτα."
+ },
+ "biometricsNotSupportedTitle": {
+ "message": "Δεν υποστηρίζεται η βιομετρική"
+ },
+ "biometricsNotSupportedDesc": {
+ "message": "Τα βιομετρικά στοιχεία του προγράμματος περιήγησης δεν υποστηρίζονται σε αυτήν τη συσκευή."
+ },
+ "nativeMessaginPermissionErrorTitle": {
+ "message": "Δεν Έχει Χορηγηθεί Άδεια"
+ },
+ "nativeMessaginPermissionErrorDesc": {
+ "message": "Χωρίς άδεια επικοινωνίας με την εφαρμογή Bitwarden Desktop δεν μπορούμε να παρέχουμε βιομετρικά στοιχεία στην επέκταση του προγράμματος περιήγησης. Παρακαλώ δοκιμάστε ξανά."
+ },
+ "nativeMessaginPermissionSidebarTitle": {
+ "message": "Σφάλμα αιτήματος άδειας"
+ },
+ "nativeMessaginPermissionSidebarDesc": {
+ "message": "Αυτή η ενέργεια δεν μπορεί να γίνει στην πλαϊνή μπάρα, δοκιμάστε ξανά την ενέργεια στο αναδυόμενο παράθυρο ή αναδυόμενο παράθυρο."
+ },
+ "personalOwnershipSubmitError": {
+ "message": "Λόγω μιας Πολιτικής Επιχειρήσεων, δεν επιτρέπεται η αποθήκευση στοιχείων στο προσωπικό σας vault. Αλλάξτε την επιλογή Ιδιοκτησίας σε έναν οργανισμό και επιλέξτε από τις διαθέσιμες Συλλογές."
+ },
+ "personalOwnershipPolicyInEffect": {
+ "message": "Μια πολιτική του οργανισμού, επηρεάζει τις επιλογές ιδιοκτησίας σας."
+ },
+ "excludedDomains": {
+ "message": "Εξαιρούμενοι Τομείς"
+ },
+ "excludedDomainsDesc": {
+ "message": "Το Bitwarden δεν θα ζητήσει να αποθηκεύσετε τα στοιχεία σύνδεσης για αυτούς τους τομείς. Πρέπει να ανανεώσετε τη σελίδα για να τεθούν σε ισχύ οι αλλαγές."
+ },
+ "excludedDomainsInvalidDomain": {
+ "message": "Το $DOMAIN$ δεν είναι έγκυρος τομέας",
+ "placeholders": {
+ "domain": {
+ "content": "$1",
+ "example": "googlecom"
+ }
+ }
+ },
+ "send": {
+ "message": "Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "searchSends": {
+ "message": "Αναζήτηση Sends",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "addSend": {
+ "message": "Προσθήκη Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTypeText": {
+ "message": "Κείμενο"
+ },
+ "sendTypeFile": {
+ "message": "Αρχείο"
+ },
+ "allSends": {
+ "message": "Όλα τα Sends",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "maxAccessCountReached": {
+ "message": "Φτάσατε στον μέγιστο αριθμό πρόσβασης"
+ },
+ "expired": {
+ "message": "Έληξε"
+ },
+ "pendingDeletion": {
+ "message": "Εκκρεμεί διαγραφή"
+ },
+ "passwordProtected": {
+ "message": "Προστατευμένο με κωδικό"
+ },
+ "copySendLink": {
+ "message": "Αντιγραφή συνδέσμου Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "removePassword": {
+ "message": "Αφαίρεση Κωδικού"
+ },
+ "delete": {
+ "message": "Διαγραφή"
+ },
+ "removedPassword": {
+ "message": "Καταργήθηκε ο Κωδικός Πρόσβασης"
+ },
+ "deletedSend": {
+ "message": "Το Send Διαγράφηκε",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendLink": {
+ "message": "Σύνδεσμος Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "disabled": {
+ "message": "Απενεργοποιημένο"
+ },
+ "removePasswordConfirmation": {
+ "message": "Είστε βέβαιοι ότι θέλετε να καταργήσετε τον κωδικό πρόσβασης;"
+ },
+ "deleteSend": {
+ "message": "Διαγραφή Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "deleteSendConfirmation": {
+ "message": "Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτό το Send;",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "editSend": {
+ "message": "Επεξεργασία Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTypeHeader": {
+ "message": "Τι είδους Send είναι αυτό;",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendNameDesc": {
+ "message": "Ένα φιλικό όνομα για την περιγραφή αυτού του Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendFileDesc": {
+ "message": "Το αρχείο που θέλετε να στείλετε."
+ },
+ "deletionDate": {
+ "message": "Ημερομηνία Διαγραφής"
+ },
+ "deletionDateDesc": {
+ "message": "Το Send θα διαγραφεί οριστικά την καθορισμένη ημερομηνία και ώρα.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "expirationDate": {
+ "message": "Ημερομηνία Λήξης"
+ },
+ "expirationDateDesc": {
+ "message": "Εάν οριστεί, η πρόσβαση σε αυτό το Send θα λήξει την καθορισμένη ημερομηνία και ώρα.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "oneDay": {
+ "message": "1 ημέρα"
+ },
+ "days": {
+ "message": "$DAYS$ ημέρες",
+ "placeholders": {
+ "days": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "custom": {
+ "message": "Προσαρμοσμένο"
+ },
+ "maximumAccessCount": {
+ "message": "Μέγιστος Αριθμός Πρόσβασης"
+ },
+ "maximumAccessCountDesc": {
+ "message": "Εάν οριστεί, οι χρήστες δεν θα μπορούν πλέον να έχουν πρόσβαση σε αυτό το send μόλις επιτευχθεί ο μέγιστος αριθμός πρόσβασης.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendPasswordDesc": {
+ "message": "Προαιρετικά απαιτείται κωδικός πρόσβασης για τους χρήστες για να έχουν πρόσβαση σε αυτό το Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendNotesDesc": {
+ "message": "Ιδιωτικές σημειώσεις σχετικά με αυτό το Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendDisableDesc": {
+ "message": "Απενεργοποιήστε αυτό το Send έτσι ώστε κανείς να μην μπορεί να έχει πρόσβαση σε αυτό.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendShareDesc": {
+ "message": "Αντιγραφή του συνδέσμου για αυτό το Send στο πρόχειρο κατά την αποθήκευση.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTextDesc": {
+ "message": "Το κείμενο που θέλετε να στείλετε."
+ },
+ "sendHideText": {
+ "message": "Απόκρυψη του κειμένου αυτού του Send από προεπιλογή.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "currentAccessCount": {
+ "message": "Τρέχων Αριθμός Πρόσβασης"
+ },
+ "createSend": {
+ "message": "Δημιουργία Νέου Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "newPassword": {
+ "message": "Νέος Κωδικός Πρόσβασης"
+ },
+ "sendDisabled": {
+ "message": "Το Send Απενεργοποιήθηκε",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendDisabledWarning": {
+ "message": "Λόγω μιας επιχειρηματικής πολιτικής, είστε σε θέση να διαγράψετε μόνο ένα υπάρχον Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "createdSend": {
+ "message": "Το Send Δημιουργήθηκε",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "editedSend": {
+ "message": "Το Send Επεξεργάστηκε",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendLinuxChromiumFileWarning": {
+ "message": "Για να επιλέξετε ένα αρχείο, ανοίξτε την επέκταση στην πλαϊνή μπάρα (αν είναι δυνατόν) ή βγείτε σε ένα νέο παράθυρο κάνοντας κλικ σε αυτή τη διαφήμιση."
+ },
+ "sendFirefoxFileWarning": {
+ "message": "Για να επιλέξετε ένα αρχείο χρησιμοποιώντας τον Firefox, ανοίξτε την επέκταση στην πλαϊνή μπάρα ή βγείτε σε ένα νέο παράθυρο κάνοντας κλικ σε αυτή τη διαφήμιση."
+ },
+ "sendSafariFileWarning": {
+ "message": "Για να επιλέξετε ένα αρχείο χρησιμοποιώντας το Safari, βγαίνετε σε ένα νέο παράθυρο κάνοντας κλικ σε αυτή τη διαφήμιση."
+ },
+ "sendFileCalloutHeader": {
+ "message": "Πριν ξεκινήσετε"
+ },
+ "sendFirefoxCustomDatePopoutMessage1": {
+ "message": "Για να χρησιμοποιήσετε έναν επιλογέα ημερομηνίας στυλ ημερολογίου",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read '**To use a calendar style date picker ** click here to pop out your window.'"
+ },
+ "sendFirefoxCustomDatePopoutMessage2": {
+ "message": "κάντε κλικ εδώ",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker **click here** to pop out your window.'"
+ },
+ "sendFirefoxCustomDatePopoutMessage3": {
+ "message": "για να βγεις από το παράθυρο.",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker click here **to pop out your window.**'"
+ },
+ "expirationDateIsInvalid": {
+ "message": "Η ημερομηνία λήξης που δόθηκε δεν είναι έγκυρη."
+ },
+ "deletionDateIsInvalid": {
+ "message": "Η ημερομηνία διαγραφής που δόθηκε δεν είναι έγκυρη."
+ },
+ "expirationDateAndTimeRequired": {
+ "message": "Απαιτείται ημερομηνία και ώρα λήξης."
+ },
+ "deletionDateAndTimeRequired": {
+ "message": "Απαιτείται ημερομηνία και ώρα διαγραφής."
+ },
+ "dateParsingError": {
+ "message": "Παρουσιάστηκε σφάλμα κατά την αποθήκευση των ημερομηνιών διαγραφής και λήξης."
+ },
+ "hideEmail": {
+ "message": "Απόκρυψη της διεύθυνσης email μου από τους παραλήπτες."
+ },
+ "sendOptionsPolicyInEffect": {
+ "message": "Μία ή περισσότερες οργανωτικές πολιτικές επηρεάζουν τις επιλογές send σας."
+ },
+ "passwordPrompt": {
+ "message": "Προτροπή νέου κωδικού πρόσβασης"
+ },
+ "passwordConfirmation": {
+ "message": "Επιβεβαίωση κύριου κωδικού πρόσβασης"
+ },
+ "passwordConfirmationDesc": {
+ "message": "Αυτή η ενέργεια προστατεύεται. Για να συνεχίσετε, πληκτρολογήστε ξανά τον κύριο κωδικό πρόσβασης για να επαληθεύσετε την ταυτότητά σας."
+ },
+ "emailVerificationRequired": {
+ "message": "Απαιτείται Επαλήθευση Email"
+ },
+ "emailVerificationRequiredDesc": {
+ "message": "Πρέπει να επαληθεύσετε το email σας για να χρησιμοποιήσετε αυτή τη δυνατότητα. Μπορείτε να επαληθεύσετε το email σας στο web vault."
+ },
+ "updatedMasterPassword": {
+ "message": "Ενημερώθηκε ο κύριος κωδικός πρόσβασης"
+ },
+ "updateMasterPassword": {
+ "message": "Ενημερώστε τον κύριο κωδικό πρόσβασης"
+ },
+ "updateMasterPasswordWarning": {
+ "message": "Ο Κύριος Κωδικός Πρόσβασής σας άλλαξε πρόσφατα από διαχειριστή στον οργανισμό σας. Για να αποκτήσετε πρόσβαση στο vault, πρέπει να τον ενημερώσετε τώρα. Η διαδικασία θα σας αποσυνδέσει από την τρέχουσα συνεδρία σας, απαιτώντας από εσάς να συνδεθείτε ξανά. Οι ενεργές συνεδρίες σε άλλες συσκευές ενδέχεται να συνεχίσουν να είναι ενεργές για μία ώρα."
+ },
+ "resetPasswordPolicyAutoEnroll": {
+ "message": "Αυτόματη Εγγραφή"
+ },
+ "resetPasswordAutoEnrollInviteWarning": {
+ "message": "Αυτός ο οργανισμός έχει μια επιχειρηματική πολιτική που θα σας εγγράψει αυτόματα στην επαναφορά κωδικού. Η εγγραφή θα επιτρέψει στους διαχειριστές του οργανισμού να αλλάξουν τον κύριο κωδικό πρόσβασης σας."
+ },
+ "selectFolder": {
+ "message": "Επιλέξτε φάκελο..."
+ },
+ "ssoCompleteRegistration": {
+ "message": "Για να ολοκληρώσετε τη σύνδεση με SSO, ορίστε έναν κύριο κωδικό πρόσβασης για πρόσβαση και προστασία του vault σας."
+ },
+ "hours": {
+ "message": "Ώρες"
+ },
+ "minutes": {
+ "message": "Λεπτά"
+ },
+ "vaultTimeoutPolicyInEffect": {
+ "message": "Οι πολιτικές του οργανισμού σας επηρεάζουν το χρονικό όριο vault σας. Το μέγιστο επιτρεπόμενο Χρονικό όριο Vault είναι $HOURS$ ώρα(ες) και $MINUTES$ λεπτό(ά)",
+ "placeholders": {
+ "hours": {
+ "content": "$1",
+ "example": "5"
+ },
+ "minutes": {
+ "content": "$2",
+ "example": "5"
+ }
+ }
+ },
+ "vaultTimeoutToLarge": {
+ "message": "Το χρονικό όριο του vault σας υπερβαίνει τους περιορισμούς που έχει ορίσει ο οργανισμός σας."
+ },
+ "vaultExportDisabled": {
+ "message": "Εξαγωγή vault Απενεργοποιημένη"
+ },
+ "personalVaultExportPolicyInEffect": {
+ "message": "Μία ή περισσότερες οργανωτικές πολιτικές σας αποτρέπει από την εξαγωγή του προσωπικού vault."
+ },
+ "copyCustomFieldNameInvalidElement": {
+ "message": "Δεν είναι δυνατή η αναγνώριση ενός έγκυρου στοιχείου φόρμας. Δοκιμάστε να επιθεωρήσετε τον κώδικα HTML."
+ },
+ "copyCustomFieldNameNotUnique": {
+ "message": "Δε βρέθηκε μοναδικό αναγνωριστικό."
+ }
+}
diff --git a/src/iOS.Safari/Resources/_locales/en/messages.json b/src/iOS.Safari/Resources/_locales/en/messages.json
new file mode 100644
index 000000000..f2853be84
--- /dev/null
+++ b/src/iOS.Safari/Resources/_locales/en/messages.json
@@ -0,0 +1,1825 @@
+{
+ "appName": {
+ "message": "Bitwarden"
+ },
+ "extName": {
+ "message": "Bitwarden - Free Password Manager",
+ "description": "Extension name, MUST be less than 40 characters (Safari restriction)"
+ },
+ "extDesc": {
+ "message": "A secure and free password manager for all of your devices.",
+ "description": "Extension description"
+ },
+ "loginOrCreateNewAccount": {
+ "message": "Log in or create a new account to access your secure vault."
+ },
+ "createAccount": {
+ "message": "Create Account"
+ },
+ "login": {
+ "message": "Log In"
+ },
+ "enterpriseSingleSignOn": {
+ "message": "Enterprise Single Sign-On"
+ },
+ "cancel": {
+ "message": "Cancel"
+ },
+ "close": {
+ "message": "Close"
+ },
+ "submit": {
+ "message": "Submit"
+ },
+ "emailAddress": {
+ "message": "Email Address"
+ },
+ "masterPass": {
+ "message": "Master Password"
+ },
+ "masterPassDesc": {
+ "message": "The master password is the password you use to access your vault. It is very important that you do not forget your master password. There is no way to recover the password in the event that you forget it."
+ },
+ "masterPassHintDesc": {
+ "message": "A master password hint can help you remember your password if you forget it."
+ },
+ "reTypeMasterPass": {
+ "message": "Re-type Master Password"
+ },
+ "masterPassHint": {
+ "message": "Master Password Hint (optional)"
+ },
+ "tab": {
+ "message": "Tab"
+ },
+ "myVault": {
+ "message": "My Vault"
+ },
+ "tools": {
+ "message": "Tools"
+ },
+ "settings": {
+ "message": "Settings"
+ },
+ "currentTab": {
+ "message": "Current Tab"
+ },
+ "copyPassword": {
+ "message": "Copy Password"
+ },
+ "copyNote": {
+ "message": "Copy Note"
+ },
+ "copyUri": {
+ "message": "Copy URI"
+ },
+ "copyUsername": {
+ "message": "Copy Username"
+ },
+ "copyNumber": {
+ "message": "Copy Number"
+ },
+ "copySecurityCode": {
+ "message": "Copy Security Code"
+ },
+ "autoFill": {
+ "message": "Auto-fill"
+ },
+ "generatePasswordCopied": {
+ "message": "Generate Password (copied)"
+ },
+ "copyElementIdentifier": {
+ "message": "Copy Custom Field Name"
+ },
+ "noMatchingLogins": {
+ "message": "No matching logins."
+ },
+ "vaultLocked": {
+ "message": "Vault is locked."
+ },
+ "vaultLoggedOut": {
+ "message": "Vault is logged out."
+ },
+ "autoFillInfo": {
+ "message": "There are no logins available to auto-fill for the current browser tab."
+ },
+ "addLogin": {
+ "message": "Add a Login"
+ },
+ "addItem": {
+ "message": "Add Item"
+ },
+ "passwordHint": {
+ "message": "Password Hint"
+ },
+ "enterEmailToGetHint": {
+ "message": "Enter your account email address to receive your master password hint."
+ },
+ "getMasterPasswordHint": {
+ "message": "Get master password hint"
+ },
+ "continue": {
+ "message": "Continue"
+ },
+ "verificationCode": {
+ "message": "Verification Code"
+ },
+ "account": {
+ "message": "Account"
+ },
+ "changeMasterPassword": {
+ "message": "Change Master Password"
+ },
+ "fingerprintPhrase": {
+ "message": "Fingerprint Phrase",
+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
+ },
+ "yourAccountsFingerprint": {
+ "message": "Your account's fingerprint phrase",
+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
+ },
+ "twoStepLogin": {
+ "message": "Two-step Login"
+ },
+ "logOut": {
+ "message": "Log Out"
+ },
+ "about": {
+ "message": "About"
+ },
+ "version": {
+ "message": "Version"
+ },
+ "save": {
+ "message": "Save"
+ },
+ "move": {
+ "message": "Move"
+ },
+ "addFolder": {
+ "message": "Add Folder"
+ },
+ "name": {
+ "message": "Name"
+ },
+ "editFolder": {
+ "message": "Edit Folder"
+ },
+ "deleteFolder": {
+ "message": "Delete Folder"
+ },
+ "folders": {
+ "message": "Folders"
+ },
+ "noFolders": {
+ "message": "There are no folders to list."
+ },
+ "helpFeedback": {
+ "message": "Help & Feedback"
+ },
+ "sync": {
+ "message": "Sync"
+ },
+ "syncVaultNow": {
+ "message": "Sync Vault Now"
+ },
+ "lastSync": {
+ "message": "Last Sync:"
+ },
+ "passGen": {
+ "message": "Password Generator"
+ },
+ "generator": {
+ "message": "Generator",
+ "description": "Short for 'Password Generator'."
+ },
+ "passGenInfo": {
+ "message": "Automatically generate strong, unique passwords for your logins."
+ },
+ "bitWebVault": {
+ "message": "Bitwarden Web Vault"
+ },
+ "importItems": {
+ "message": "Import Items"
+ },
+ "select": {
+ "message": "Select"
+ },
+ "generatePassword": {
+ "message": "Generate Password"
+ },
+ "regeneratePassword": {
+ "message": "Regenerate Password"
+ },
+ "options": {
+ "message": "Options"
+ },
+ "length": {
+ "message": "Length"
+ },
+ "numWords": {
+ "message": "Number of Words"
+ },
+ "wordSeparator": {
+ "message": "Word Separator"
+ },
+ "capitalize": {
+ "message": "Capitalize",
+ "description": "Make the first letter of a work uppercase."
+ },
+ "includeNumber": {
+ "message": "Include Number"
+ },
+ "minNumbers": {
+ "message": "Minimum Numbers"
+ },
+ "minSpecial": {
+ "message": "Minimum Special"
+ },
+ "avoidAmbChar": {
+ "message": "Avoid Ambiguous Characters"
+ },
+ "searchVault": {
+ "message": "Search vault"
+ },
+ "edit": {
+ "message": "Edit"
+ },
+ "view": {
+ "message": "View"
+ },
+ "noItemsInList": {
+ "message": "There are no items to list."
+ },
+ "itemInformation": {
+ "message": "Item Information"
+ },
+ "username": {
+ "message": "Username"
+ },
+ "password": {
+ "message": "Password"
+ },
+ "passphrase": {
+ "message": "Passphrase"
+ },
+ "favorite": {
+ "message": "Favorite"
+ },
+ "notes": {
+ "message": "Notes"
+ },
+ "note": {
+ "message": "Note"
+ },
+ "editItem": {
+ "message": "Edit Item"
+ },
+ "folder": {
+ "message": "Folder"
+ },
+ "deleteItem": {
+ "message": "Delete Item"
+ },
+ "viewItem": {
+ "message": "View Item"
+ },
+ "launch": {
+ "message": "Launch"
+ },
+ "website": {
+ "message": "Website"
+ },
+ "toggleVisibility": {
+ "message": "Toggle Visibility"
+ },
+ "manage": {
+ "message": "Manage"
+ },
+ "other": {
+ "message": "Other"
+ },
+ "rateExtension": {
+ "message": "Rate the Extension"
+ },
+ "rateExtensionDesc": {
+ "message": "Please consider helping us out with a good review!"
+ },
+ "browserNotSupportClipboard": {
+ "message": "Your web browser does not support easy clipboard copying. Copy it manually instead."
+ },
+ "verifyMasterPassword": {
+ "message": "Verify Master Password"
+ },
+ "yourVaultIsLocked": {
+ "message": "Your vault is locked. Verify your master password to continue."
+ },
+ "unlock": {
+ "message": "Unlock"
+ },
+ "loggedInAsOn": {
+ "message": "Logged in as $EMAIL$ on $HOSTNAME$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "name@example.com"
+ },
+ "hostname": {
+ "content": "$2",
+ "example": "bitwarden.com"
+ }
+ }
+ },
+ "invalidMasterPassword": {
+ "message": "Invalid master password"
+ },
+ "vaultTimeout": {
+ "message": "Vault Timeout"
+ },
+ "lockNow": {
+ "message": "Lock Now"
+ },
+ "immediately": {
+ "message": "Immediately"
+ },
+ "tenSeconds": {
+ "message": "10 seconds"
+ },
+ "twentySeconds": {
+ "message": "20 seconds"
+ },
+ "thirtySeconds": {
+ "message": "30 seconds"
+ },
+ "oneMinute": {
+ "message": "1 minute"
+ },
+ "twoMinutes": {
+ "message": "2 minutes"
+ },
+ "fiveMinutes": {
+ "message": "5 minutes"
+ },
+ "fifteenMinutes": {
+ "message": "15 minutes"
+ },
+ "thirtyMinutes": {
+ "message": "30 minutes"
+ },
+ "oneHour": {
+ "message": "1 hour"
+ },
+ "fourHours": {
+ "message": "4 hours"
+ },
+ "onLocked": {
+ "message": "On System Lock"
+ },
+ "onRestart": {
+ "message": "On Browser Restart"
+ },
+ "never": {
+ "message": "Never"
+ },
+ "security": {
+ "message": "Security"
+ },
+ "errorOccurred": {
+ "message": "An error has occurred"
+ },
+ "emailRequired": {
+ "message": "Email address is required."
+ },
+ "invalidEmail": {
+ "message": "Invalid email address."
+ },
+ "masterPassRequired": {
+ "message": "Master password is required."
+ },
+ "masterPassLength": {
+ "message": "Master password must be at least 8 characters long."
+ },
+ "masterPassDoesntMatch": {
+ "message": "Master password confirmation does not match."
+ },
+ "newAccountCreated": {
+ "message": "Your new account has been created! You may now log in."
+ },
+ "masterPassSent": {
+ "message": "We've sent you an email with your master password hint."
+ },
+ "verificationCodeRequired": {
+ "message": "Verification code is required."
+ },
+ "valueCopied": {
+ "message": "$VALUE$ copied",
+ "description": "Value has been copied to the clipboard.",
+ "placeholders": {
+ "value": {
+ "content": "$1",
+ "example": "Password"
+ }
+ }
+ },
+ "autofillError": {
+ "message": "Unable to auto-fill the selected item on this page. Copy and paste the information instead."
+ },
+ "loggedOut": {
+ "message": "Logged out"
+ },
+ "loginExpired": {
+ "message": "Your login session has expired."
+ },
+ "logOutConfirmation": {
+ "message": "Are you sure you want to log out?"
+ },
+ "yes": {
+ "message": "Yes"
+ },
+ "no": {
+ "message": "No"
+ },
+ "unexpectedError": {
+ "message": "An unexpected error has occurred."
+ },
+ "nameRequired": {
+ "message": "Name is required."
+ },
+ "addedFolder": {
+ "message": "Added folder"
+ },
+ "changeMasterPass": {
+ "message": "Change Master Password"
+ },
+ "changeMasterPasswordConfirmation": {
+ "message": "You can change your master password on the bitwarden.com web vault. Do you want to visit the website now?"
+ },
+ "twoStepLoginConfirmation": {
+ "message": "Two-step login makes your account more secure by requiring you to verify your login with another device such as a security key, authenticator app, SMS, phone call, or email. Two-step login can be enabled on the bitwarden.com web vault. Do you want to visit the website now?"
+ },
+ "editedFolder": {
+ "message": "Edited folder"
+ },
+ "deleteFolderConfirmation": {
+ "message": "Are you sure you want to delete this folder?"
+ },
+ "deletedFolder": {
+ "message": "Deleted folder"
+ },
+ "gettingStartedTutorial": {
+ "message": "Getting Started Tutorial"
+ },
+ "gettingStartedTutorialVideo": {
+ "message": "Watch our getting started tutorial to learn how to get the most out of the browser extension."
+ },
+ "syncingComplete": {
+ "message": "Syncing complete"
+ },
+ "syncingFailed": {
+ "message": "Syncing failed"
+ },
+ "passwordCopied": {
+ "message": "Password copied"
+ },
+ "uri": {
+ "message": "URI"
+ },
+ "uriPosition": {
+ "message": "URI $POSITION$",
+ "description": "A listing of URIs. Ex: URI 1, URI 2, URI 3, etc.",
+ "placeholders": {
+ "position": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "newUri": {
+ "message": "New URI"
+ },
+ "addedItem": {
+ "message": "Added item"
+ },
+ "editedItem": {
+ "message": "Edited item"
+ },
+ "deleteItemConfirmation": {
+ "message": "Do you really want to send to the trash?"
+ },
+ "deletedItem": {
+ "message": "Sent item to trash"
+ },
+ "overwritePassword": {
+ "message": "Overwrite Password"
+ },
+ "overwritePasswordConfirmation": {
+ "message": "Are you sure you want to overwrite the current password?"
+ },
+ "searchFolder": {
+ "message": "Search folder"
+ },
+ "searchCollection": {
+ "message": "Search collection"
+ },
+ "searchType": {
+ "message": "Search type"
+ },
+ "noneFolder": {
+ "message": "No Folder",
+ "description": "This is the folder for uncategorized items"
+ },
+ "disableAddLoginNotification": {
+ "message": "Disable Add Login Notification"
+ },
+ "addLoginNotificationDesc": {
+ "message": "The \"Add Login Notification\" automatically prompts you to save new logins to your vault whenever you log into them for the first time."
+ },
+ "dontShowCardsCurrentTab": {
+ "message": "Don't Show Cards on Tab Page"
+ },
+ "dontShowCardsCurrentTabDesc": {
+ "message": "Card items from your vault are listed on the 'Current Tab' page for easy auto-fill access."
+ },
+ "dontShowIdentitiesCurrentTab": {
+ "message": "Don't Show Identities on Tab Page"
+ },
+ "dontShowIdentitiesCurrentTabDesc": {
+ "message": "Identity items from your vault are listed on the 'Current Tab' page for easy auto-fill access."
+ },
+ "clearClipboard": {
+ "message": "Clear Clipboard",
+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
+ },
+ "clearClipboardDesc": {
+ "message": "Automatically clear copied values from your clipboard.",
+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
+ },
+ "notificationAddDesc": {
+ "message": "Should Bitwarden remember this password for you?"
+ },
+ "notificationAddSave": {
+ "message": "Save"
+ },
+ "disableChangedPasswordNotification": {
+ "message": "Disable Changed Password Notification"
+ },
+ "disableChangedPasswordNotificationDesc": {
+ "message": "The \"Changed Password Notification\" automatically prompts you to update a login's password in your vault whenever it detects that you have changed it on a website."
+ },
+ "notificationChangeDesc": {
+ "message": "Do you want to update this password in Bitwarden?"
+ },
+ "notificationChangeSave": {
+ "message": "Update"
+ },
+ "disableContextMenuItem": {
+ "message": "Disable Context Menu Options"
+ },
+ "disableContextMenuItemDesc": {
+ "message": "Context menu options provide quick access to password generation and logins for the website in your current tab."
+ },
+ "defaultUriMatchDetection": {
+ "message": "Default URI Match Detection",
+ "description": "Default URI match detection for auto-fill."
+ },
+ "defaultUriMatchDetectionDesc": {
+ "message": "Choose the default way that URI match detection is handled for logins when performing actions such as auto-fill."
+ },
+ "theme": {
+ "message": "Theme"
+ },
+ "themeDesc": {
+ "message": "Change the application's color theme."
+ },
+ "dark": {
+ "message": "Dark",
+ "description": "Dark color"
+ },
+ "light": {
+ "message": "Light",
+ "description": "Light color"
+ },
+ "solarizedDark": {
+ "message": "Solarized Dark",
+ "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated."
+ },
+ "exportVault": {
+ "message": "Export Vault"
+ },
+ "fileFormat": {
+ "message": "File Format"
+ },
+ "warning": {
+ "message": "WARNING",
+ "description": "WARNING (should stay in capitalized letters if the language permits)"
+ },
+ "confirmVaultExport": {
+ "message": "Confirm Vault Export"
+ },
+ "exportWarningDesc": {
+ "message": "This export contains your vault data in an unencrypted format. You should not store or send the exported file over unsecure channels (such as email). Delete it immediately after you are done using it."
+ },
+ "encExportKeyWarningDesc": {
+ "message": "This export encrypts your data using your account's encryption key. If you ever rotate your account's encryption key you should export again since you will not be able to decrypt this export file."
+ },
+ "encExportAccountWarningDesc": {
+ "message": "Account encryption keys are unique to each Bitwarden user account, so you can't import an encrypted export into a different account."
+ },
+ "exportMasterPassword": {
+ "message": "Enter your master password to export your vault data."
+ },
+ "shared": {
+ "message": "Shared"
+ },
+ "learnOrg": {
+ "message": "Learn about Organizations"
+ },
+ "learnOrgConfirmation": {
+ "message": "Bitwarden allows you to share your vault items with others by using an organization. Would you like to visit the bitwarden.com website to learn more?"
+ },
+ "moveToOrganization": {
+ "message": "Move to Organization"
+ },
+ "share": {
+ "message": "Share"
+ },
+ "movedItemToOrg": {
+ "message": "$ITEMNAME$ moved to $ORGNAME$",
+ "placeholders": {
+ "itemname": {
+ "content": "$1",
+ "example": "Secret Item"
+ },
+ "orgname": {
+ "content": "$2",
+ "example": "Company Name"
+ }
+ }
+ },
+ "moveToOrgDesc": {
+ "message": "Choose an organization that you wish to move this item to. Moving to an organization transfers ownership of the item to that organization. You will no longer be the direct owner of this item once it has been moved."
+ },
+ "learnMore": {
+ "message": "Learn more"
+ },
+ "authenticatorKeyTotp": {
+ "message": "Authenticator Key (TOTP)"
+ },
+ "verificationCodeTotp": {
+ "message": "Verification Code (TOTP)"
+ },
+ "copyVerificationCode": {
+ "message": "Copy Verification Code"
+ },
+ "attachments": {
+ "message": "Attachments"
+ },
+ "deleteAttachment": {
+ "message": "Delete attachment"
+ },
+ "deleteAttachmentConfirmation": {
+ "message": "Are you sure you want to delete this attachment?"
+ },
+ "deletedAttachment": {
+ "message": "Deleted attachment"
+ },
+ "newAttachment": {
+ "message": "Add New Attachment"
+ },
+ "noAttachments": {
+ "message": "No attachments."
+ },
+ "attachmentSaved": {
+ "message": "The attachment has been saved."
+ },
+ "file": {
+ "message": "File"
+ },
+ "selectFile": {
+ "message": "Select a file."
+ },
+ "maxFileSize": {
+ "message": "Maximum file size is 500 MB."
+ },
+ "featureUnavailable": {
+ "message": "Feature Unavailable"
+ },
+ "updateKey": {
+ "message": "You cannot use this feature until you update your encryption key."
+ },
+ "premiumMembership": {
+ "message": "Premium Membership"
+ },
+ "premiumManage": {
+ "message": "Manage Membership"
+ },
+ "premiumManageAlert": {
+ "message": "You can manage your membership on the bitwarden.com web vault. Do you want to visit the website now?"
+ },
+ "premiumRefresh": {
+ "message": "Refresh Membership"
+ },
+ "premiumNotCurrentMember": {
+ "message": "You are not currently a premium member."
+ },
+ "premiumSignUpAndGet": {
+ "message": "Sign up for a premium membership and get:"
+ },
+ "ppremiumSignUpStorage": {
+ "message": "1 GB encrypted storage for file attachments."
+ },
+ "ppremiumSignUpTwoStep": {
+ "message": "Additional two-step login options such as YubiKey, FIDO U2F, and Duo."
+ },
+ "ppremiumSignUpReports": {
+ "message": "Password hygiene, account health, and data breach reports to keep your vault safe."
+ },
+ "ppremiumSignUpTotp": {
+ "message": "TOTP verification code (2FA) generator for logins in your vault."
+ },
+ "ppremiumSignUpSupport": {
+ "message": "Priority customer support."
+ },
+ "ppremiumSignUpFuture": {
+ "message": "All future premium features. More coming soon!"
+ },
+ "premiumPurchase": {
+ "message": "Purchase Premium"
+ },
+ "premiumPurchaseAlert": {
+ "message": "You can purchase premium membership on the bitwarden.com web vault. Do you want to visit the website now?"
+ },
+ "premiumCurrentMember": {
+ "message": "You are a premium member!"
+ },
+ "premiumCurrentMemberThanks": {
+ "message": "Thank you for supporting Bitwarden."
+ },
+ "premiumPrice": {
+ "message": "All for just $PRICE$ /year!",
+ "placeholders": {
+ "price": {
+ "content": "$1",
+ "example": "$10"
+ }
+ }
+ },
+ "refreshComplete": {
+ "message": "Refresh complete"
+ },
+ "disableAutoTotpCopy": {
+ "message": "Disable Automatic TOTP Copy"
+ },
+ "disableAutoTotpCopyDesc": {
+ "message": "If your login has an authenticator key attached to it, the TOTP verification code is automatically copied to your clipboard whenever you auto-fill the login."
+ },
+ "disableAutoBiometricsPrompt": {
+ "message": "Do not prompt for biometrics on launch"
+ },
+ "premiumRequired": {
+ "message": "Premium Required"
+ },
+ "premiumRequiredDesc": {
+ "message": "A premium membership is required to use this feature."
+ },
+ "enterVerificationCodeApp": {
+ "message": "Enter the 6 digit verification code from your authenticator app."
+ },
+ "enterVerificationCodeEmail": {
+ "message": "Enter the 6 digit verification code that was emailed to $EMAIL$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "example@gmail.com"
+ }
+ }
+ },
+ "verificationCodeEmailSent": {
+ "message": "Verification email sent to $EMAIL$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "example@gmail.com"
+ }
+ }
+ },
+ "rememberMe": {
+ "message": "Remember me"
+ },
+ "sendVerificationCodeEmailAgain": {
+ "message": "Send verification code email again"
+ },
+ "useAnotherTwoStepMethod": {
+ "message": "Use another two-step login method"
+ },
+ "insertYubiKey": {
+ "message": "Insert your YubiKey into your computer's USB port, then touch its button."
+ },
+ "insertU2f": {
+ "message": "Insert your security key into your computer's USB port. If it has a button, touch it."
+ },
+ "webAuthnNewTab": {
+ "message": "To start the WebAuthn 2FA verification. Click the button below to open a new tab and follow the instructions provided in the new tab."
+ },
+ "webAuthnNewTabOpen": {
+ "message": "Open new tab"
+ },
+ "webAuthnAuthenticate": {
+ "message": "Authenticate WebAuthn"
+ },
+ "loginUnavailable": {
+ "message": "Login Unavailable"
+ },
+ "noTwoStepProviders": {
+ "message": "This account has two-step login enabled, however, none of the configured two-step providers are supported by this web browser."
+ },
+ "noTwoStepProviders2": {
+ "message": "Please use a supported web browser (such as Chrome) and/or add additional providers that are better supported across web browsers (such as an authenticator app)."
+ },
+ "twoStepOptions": {
+ "message": "Two-step Login Options"
+ },
+ "recoveryCodeDesc": {
+ "message": "Lost access to all of your two-factor providers? Use your recovery code to disable all two-factor providers from your account."
+ },
+ "recoveryCodeTitle": {
+ "message": "Recovery Code"
+ },
+ "authenticatorAppTitle": {
+ "message": "Authenticator App"
+ },
+ "authenticatorAppDesc": {
+ "message": "Use an authenticator app (such as Authy or Google Authenticator) to generate time-based verification codes.",
+ "description": "'Authy' and 'Google Authenticator' are product names and should not be translated."
+ },
+ "yubiKeyTitle": {
+ "message": "YubiKey OTP Security Key"
+ },
+ "yubiKeyDesc": {
+ "message": "Use a YubiKey to access your account. Works with YubiKey 4, 4 Nano, 4C, and NEO devices."
+ },
+ "duoDesc": {
+ "message": "Verify with Duo Security using the Duo Mobile app, SMS, phone call, or U2F security key.",
+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
+ },
+ "duoOrganizationDesc": {
+ "message": "Verify with Duo Security for your organization using the Duo Mobile app, SMS, phone call, or U2F security key.",
+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
+ },
+ "webAuthnTitle": {
+ "message": "FIDO2 WebAuthn"
+ },
+ "webAuthnDesc": {
+ "message": "Use any WebAuthn enabled security key to access your account."
+ },
+ "emailTitle": {
+ "message": "Email"
+ },
+ "emailDesc": {
+ "message": "Verification codes will be emailed to you."
+ },
+ "selfHostedEnvironment": {
+ "message": "Self-hosted Environment"
+ },
+ "selfHostedEnvironmentFooter": {
+ "message": "Specify the base URL of your on-premises hosted Bitwarden installation."
+ },
+ "customEnvironment": {
+ "message": "Custom Environment"
+ },
+ "customEnvironmentFooter": {
+ "message": "For advanced users. You can specify the base URL of each service independently."
+ },
+ "baseUrl": {
+ "message": "Server URL"
+ },
+ "apiUrl": {
+ "message": "API Server URL"
+ },
+ "webVaultUrl": {
+ "message": "Web Vault Server URL"
+ },
+ "identityUrl": {
+ "message": "Identity Server URL"
+ },
+ "notificationsUrl": {
+ "message": "Notifications Server URL"
+ },
+ "iconsUrl": {
+ "message": "Icons Server URL"
+ },
+ "environmentSaved": {
+ "message": "The environment URLs have been saved."
+ },
+ "enableAutoFillOnPageLoad": {
+ "message": "Enable Auto-fill on Page Load"
+ },
+ "enableAutoFillOnPageLoadDesc": {
+ "message": "If a login form is detected, automatically perform an auto-fill when the web page loads."
+ },
+ "experimentalFeature": {
+ "message": "This is currently an experimental feature. Use at your own risk."
+ },
+ "defaultAutoFillOnPageLoad": {
+ "message": "Default autofill setting for login items"
+ },
+ "defaultAutoFillOnPageLoadDesc": {
+ "message": "After enabling Auto-fill on Page Load, you can enable or disable the feature for individual login items. This is the default setting for login items that are not separately configured."
+ },
+ "itemAutoFillOnPageLoad": {
+ "message": "Auto-fill on Page Load (if enabled in Options)"
+ },
+ "autoFillOnPageLoadUseDefault": {
+ "message": "Use default setting"
+ },
+ "autoFillOnPageLoadYes": {
+ "message": "Auto-fill on page load"
+ },
+ "autoFillOnPageLoadNo": {
+ "message": "Do not auto-fill on page load"
+ },
+ "commandOpenPopup": {
+ "message": "Open vault popup"
+ },
+ "commandOpenSidebar": {
+ "message": "Open vault in sidebar"
+ },
+ "commandAutofillDesc": {
+ "message": "Auto-fill the last used login for the current website"
+ },
+ "commandGeneratePasswordDesc": {
+ "message": "Generate and copy a new random password to the clipboard"
+ },
+ "commandLockVaultDesc": {
+ "message": "Lock the vault"
+ },
+ "privateModeMessage": {
+ "message": "Unfortunately this window is not available in private mode for this browser."
+ },
+ "customFields": {
+ "message": "Custom Fields"
+ },
+ "copyValue": {
+ "message": "Copy Value"
+ },
+ "value": {
+ "message": "Value"
+ },
+ "newCustomField": {
+ "message": "New Custom Field"
+ },
+ "dragToSort": {
+ "message": "Drag to sort"
+ },
+ "cfTypeText": {
+ "message": "Text"
+ },
+ "cfTypeHidden": {
+ "message": "Hidden"
+ },
+ "cfTypeBoolean": {
+ "message": "Boolean"
+ },
+ "cfTypeLinked": {
+ "message": "Linked",
+ "description": "This describes a field that is 'linked' (tied) to another field."
+ },
+ "linkedValue": {
+ "message": "Linked value",
+ "description": "This describes a value that is 'linked' (tied) to another value."
+ },
+ "popup2faCloseMessage": {
+ "message": "Clicking outside the popup window to check your email for your verification code will cause this popup to close. Do you want to open this popup in a new window so that it does not close?"
+ },
+ "popupU2fCloseMessage": {
+ "message": "This browser cannot process U2F requests in this popup window. Do you want to open this popup in a new window so that you can log in using U2F?"
+ },
+ "disableFavicon": {
+ "message": "Disable Website Icons"
+ },
+ "disableFaviconDesc": {
+ "message": "Website Icons provide a recognizable image next to each login item in your vault."
+ },
+ "disableBadgeCounter": {
+ "message": "Disable Badge Counter"
+ },
+ "disableBadgeCounterDesc": {
+ "message": "Badge counter indicates how many logins you have for the current page in your vault."
+ },
+ "cardholderName": {
+ "message": "Cardholder Name"
+ },
+ "number": {
+ "message": "Number"
+ },
+ "brand": {
+ "message": "Brand"
+ },
+ "expirationMonth": {
+ "message": "Expiration Month"
+ },
+ "expirationYear": {
+ "message": "Expiration Year"
+ },
+ "expiration": {
+ "message": "Expiration"
+ },
+ "january": {
+ "message": "January"
+ },
+ "february": {
+ "message": "February"
+ },
+ "march": {
+ "message": "March"
+ },
+ "april": {
+ "message": "April"
+ },
+ "may": {
+ "message": "May"
+ },
+ "june": {
+ "message": "June"
+ },
+ "july": {
+ "message": "July"
+ },
+ "august": {
+ "message": "August"
+ },
+ "september": {
+ "message": "September"
+ },
+ "october": {
+ "message": "October"
+ },
+ "november": {
+ "message": "November"
+ },
+ "december": {
+ "message": "December"
+ },
+ "securityCode": {
+ "message": "Security Code"
+ },
+ "ex": {
+ "message": "ex."
+ },
+ "title": {
+ "message": "Title"
+ },
+ "mr": {
+ "message": "Mr"
+ },
+ "mrs": {
+ "message": "Mrs"
+ },
+ "ms": {
+ "message": "Ms"
+ },
+ "dr": {
+ "message": "Dr"
+ },
+ "firstName": {
+ "message": "First Name"
+ },
+ "middleName": {
+ "message": "Middle Name"
+ },
+ "lastName": {
+ "message": "Last Name"
+ },
+ "fullName": {
+ "message": "Full Name"
+ },
+ "identityName": {
+ "message": "Identity Name"
+ },
+ "company": {
+ "message": "Company"
+ },
+ "ssn": {
+ "message": "Social Security Number"
+ },
+ "passportNumber": {
+ "message": "Passport Number"
+ },
+ "licenseNumber": {
+ "message": "License Number"
+ },
+ "email": {
+ "message": "Email"
+ },
+ "phone": {
+ "message": "Phone"
+ },
+ "address": {
+ "message": "Address"
+ },
+ "address1": {
+ "message": "Address 1"
+ },
+ "address2": {
+ "message": "Address 2"
+ },
+ "address3": {
+ "message": "Address 3"
+ },
+ "cityTown": {
+ "message": "City / Town"
+ },
+ "stateProvince": {
+ "message": "State / Province"
+ },
+ "zipPostalCode": {
+ "message": "Zip / Postal Code"
+ },
+ "country": {
+ "message": "Country"
+ },
+ "type": {
+ "message": "Type"
+ },
+ "typeLogin": {
+ "message": "Login"
+ },
+ "typeLogins": {
+ "message": "Logins"
+ },
+ "typeSecureNote": {
+ "message": "Secure Note"
+ },
+ "typeCard": {
+ "message": "Card"
+ },
+ "typeIdentity": {
+ "message": "Identity"
+ },
+ "passwordHistory": {
+ "message": "Password History"
+ },
+ "back": {
+ "message": "Back"
+ },
+ "collections": {
+ "message": "Collections"
+ },
+ "favorites": {
+ "message": "Favorites"
+ },
+ "popOutNewWindow": {
+ "message": "Pop out to a new window"
+ },
+ "refresh": {
+ "message": "Refresh"
+ },
+ "cards": {
+ "message": "Cards"
+ },
+ "identities": {
+ "message": "Identities"
+ },
+ "logins": {
+ "message": "Logins"
+ },
+ "secureNotes": {
+ "message": "Secure Notes"
+ },
+ "clear": {
+ "message": "Clear",
+ "description": "To clear something out. example: To clear browser history."
+ },
+ "checkPassword": {
+ "message": "Check if password has been exposed."
+ },
+ "passwordExposed": {
+ "message": "This password has been exposed $VALUE$ time(s) in data breaches. You should change it.",
+ "placeholders": {
+ "value": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "passwordSafe": {
+ "message": "This password was not found in any known data breaches. It should be safe to use."
+ },
+ "baseDomain": {
+ "message": "Base domain"
+ },
+ "host": {
+ "message": "Host",
+ "description": "A URL's host value. For example, the host of https://sub.domain.com:443 is 'sub.domain.com:443'."
+ },
+ "exact": {
+ "message": "Exact"
+ },
+ "startsWith": {
+ "message": "Starts with"
+ },
+ "regEx": {
+ "message": "Regular expression",
+ "description": "A programming term, also known as 'RegEx'."
+ },
+ "matchDetection": {
+ "message": "Match Detection",
+ "description": "URI match detection for auto-fill."
+ },
+ "defaultMatchDetection": {
+ "message": "Default match detection",
+ "description": "Default URI match detection for auto-fill."
+ },
+ "toggleOptions": {
+ "message": "Toggle Options"
+ },
+ "toggleCurrentUris": {
+ "message": "Toggle Current URIs",
+ "description": "Toggle the display of the URIs of the currently open tabs in the browser."
+ },
+ "currentUri": {
+ "message": "Current URI",
+ "description": "The URI of one of the current open tabs in the browser."
+ },
+ "organization": {
+ "message": "Organization",
+ "description": "An entity of multiple related people (ex. a team or business organization)."
+ },
+ "types": {
+ "message": "Types"
+ },
+ "allItems": {
+ "message": "All Items"
+ },
+ "noPasswordsInList": {
+ "message": "There are no passwords to list."
+ },
+ "remove": {
+ "message": "Remove"
+ },
+ "default": {
+ "message": "Default"
+ },
+ "dateUpdated": {
+ "message": "Updated",
+ "description": "ex. Date this item was updated"
+ },
+ "datePasswordUpdated": {
+ "message": "Password Updated",
+ "description": "ex. Date this password was updated"
+ },
+ "neverLockWarning": {
+ "message": "Are you sure you want to use the \"Never\" option? Setting your lock options to \"Never\" stores your vault's encryption key on your device. If you use this option you should ensure that you keep your device properly protected."
+ },
+ "noOrganizationsList": {
+ "message": "You do not belong to any organizations. Organizations allow you to securely share items with other users."
+ },
+ "noCollectionsInList": {
+ "message": "There are no collections to list."
+ },
+ "ownership": {
+ "message": "Ownership"
+ },
+ "whoOwnsThisItem": {
+ "message": "Who owns this item?"
+ },
+ "strong": {
+ "message": "Strong",
+ "description": "ex. A strong password. Scale: Weak -> Good -> Strong"
+ },
+ "good": {
+ "message": "Good",
+ "description": "ex. A good password. Scale: Weak -> Good -> Strong"
+ },
+ "weak": {
+ "message": "Weak",
+ "description": "ex. A weak password. Scale: Weak -> Good -> Strong"
+ },
+ "weakMasterPassword": {
+ "message": "Weak Master Password"
+ },
+ "weakMasterPasswordDesc": {
+ "message": "The master password you have chosen is weak. You should use a strong master password (or a passphrase) to properly protect your Bitwarden account. Are you sure you want to use this master password?"
+ },
+ "pin": {
+ "message": "PIN",
+ "description": "PIN code. Ex. The short code (often numeric) that you use to unlock a device."
+ },
+ "unlockWithPin": {
+ "message": "Unlock with PIN"
+ },
+ "setYourPinCode": {
+ "message": "Set your PIN code for unlocking Bitwarden. Your PIN settings will be reset if you ever fully log out of the application."
+ },
+ "pinRequired": {
+ "message": "PIN code is required."
+ },
+ "invalidPin": {
+ "message": "Invalid PIN code."
+ },
+ "verifyPin": {
+ "message": "Verify PIN"
+ },
+ "yourVaultIsLockedPinCode": {
+ "message": "Your vault is locked. Verify your PIN code to continue."
+ },
+ "unlockWithBiometrics": {
+ "message": "Unlock with biometrics"
+ },
+ "awaitDesktop": {
+ "message": "Awaiting confirmation from desktop"
+ },
+ "awaitDesktopDesc": {
+ "message": "Please confirm using biometrics in the Bitwarden Desktop application to enable biometrics for browser."
+ },
+ "lockWithMasterPassOnRestart": {
+ "message": "Lock with master password on browser restart"
+ },
+ "selectOneCollection": {
+ "message": "You must select at least one collection."
+ },
+ "cloneItem": {
+ "message": "Clone Item"
+ },
+ "clone": {
+ "message": "Clone"
+ },
+ "passwordGeneratorPolicyInEffect": {
+ "message": "One or more organization policies are affecting your generator settings."
+ },
+ "vaultTimeoutAction": {
+ "message": "Vault Timeout Action"
+ },
+ "lock": {
+ "message": "Lock",
+ "description": "Verb form: to make secure or inaccesible by"
+ },
+ "trash": {
+ "message": "Trash",
+ "description": "Noun: a special folder to hold deleted items"
+ },
+ "searchTrash": {
+ "message": "Search trash"
+ },
+ "permanentlyDeleteItem": {
+ "message": "Permanently Delete Item"
+ },
+ "permanentlyDeleteItemConfirmation": {
+ "message": "Are you sure you want to permanently delete this item?"
+ },
+ "permanentlyDeletedItem": {
+ "message": "Permanently Deleted item"
+ },
+ "restoreItem": {
+ "message": "Restore Item"
+ },
+ "restoreItemConfirmation": {
+ "message": "Are you sure you want to restore this item?"
+ },
+ "restoredItem": {
+ "message": "Restored Item"
+ },
+ "vaultTimeoutLogOutConfirmation": {
+ "message": "Logging out will remove all access to your vault and requires online authentication after the timeout period. Are you sure you want to use this setting?"
+ },
+ "vaultTimeoutLogOutConfirmationTitle": {
+ "message": "Timeout Action Confirmation"
+ },
+ "autoFillAndSave": {
+ "message": "Auto-fill and Save"
+ },
+ "autoFillSuccessAndSavedUri": {
+ "message": "Auto-filled Item and Saved URI"
+ },
+ "autoFillSuccess": {
+ "message": "Auto-filled Item"
+ },
+ "setMasterPassword": {
+ "message": "Set Master Password"
+ },
+ "masterPasswordPolicyInEffect": {
+ "message": "One or more organization policies require your master password to meet the following requirements:"
+ },
+ "policyInEffectMinComplexity": {
+ "message": "Minimum complexity score of $SCORE$",
+ "placeholders": {
+ "score": {
+ "content": "$1",
+ "example": "4"
+ }
+ }
+ },
+ "policyInEffectMinLength": {
+ "message": "Minimum length of $LENGTH$",
+ "placeholders": {
+ "length": {
+ "content": "$1",
+ "example": "14"
+ }
+ }
+ },
+ "policyInEffectUppercase": {
+ "message": "Contain one or more uppercase characters"
+ },
+ "policyInEffectLowercase": {
+ "message": "Contain one or more lowercase characters"
+ },
+ "policyInEffectNumbers": {
+ "message": "Contain one or more numbers"
+ },
+ "policyInEffectSpecial": {
+ "message": "Contain one or more of the following special characters $CHARS$",
+ "placeholders": {
+ "chars": {
+ "content": "$1",
+ "example": "!@#$%^&*"
+ }
+ }
+ },
+ "masterPasswordPolicyRequirementsNotMet": {
+ "message": "Your new master password does not meet the policy requirements."
+ },
+ "acceptPolicies": {
+ "message": "By checking this box you agree to the following:"
+ },
+ "acceptPoliciesError": {
+ "message": "Terms of Service and Privacy Policy have not been acknowledged."
+ },
+ "termsOfService": {
+ "message": "Terms of Service"
+ },
+ "privacyPolicy": {
+ "message": "Privacy Policy"
+ },
+ "hintEqualsPassword": {
+ "message": "Your password hint cannot be the same as your password."
+ },
+ "ok": {
+ "message": "Ok"
+ },
+ "desktopSyncVerificationTitle": {
+ "message": "Desktop sync verification"
+ },
+ "desktopIntegrationVerificationText": {
+ "message": "Please verify that the desktop application shows this fingerprint: "
+ },
+ "desktopIntegrationDisabledTitle": {
+ "message": "Browser integration is not enabled"
+ },
+ "desktopIntegrationDisabledDesc": {
+ "message": "Browser integration is not enabled in the Bitwarden Desktop application. Please enable it in the settings within the desktop application."
+ },
+ "startDesktopTitle": {
+ "message": "Start the Bitwarden Desktop application"
+ },
+ "startDesktopDesc": {
+ "message": "The Bitwarden Desktop application needs to be started before this function can be used."
+ },
+ "errorEnableBiometricTitle": {
+ "message": "Unable to enable biometrics"
+ },
+ "errorEnableBiometricDesc": {
+ "message": "Action was canceled by the desktop application"
+ },
+ "nativeMessagingInvalidEncryptionDesc": {
+ "message": "Desktop application invalidated the secure communication channel. Please retry this operation"
+ },
+ "nativeMessagingInvalidEncryptionTitle": {
+ "message": "Desktop communication interrupted"
+ },
+ "nativeMessagingWrongUserDesc": {
+ "message": "The desktop application is logged into a different account. Please ensure both applications are logged into the same account."
+ },
+ "nativeMessagingWrongUserTitle": {
+ "message": "Account missmatch"
+ },
+ "biometricsNotEnabledTitle": {
+ "message": "Biometrics not enabled"
+ },
+ "biometricsNotEnabledDesc": {
+ "message": "Browser biometrics requires desktop biometric to be enabled in the settings first."
+ },
+ "biometricsNotSupportedTitle": {
+ "message": "Biometrics not supported"
+ },
+ "biometricsNotSupportedDesc": {
+ "message": "Browser biometrics is not supported on this device."
+ },
+ "nativeMessaginPermissionErrorTitle": {
+ "message": "Permission not provided"
+ },
+ "nativeMessaginPermissionErrorDesc": {
+ "message": "Without permission to communicate with the Bitwarden Desktop Application we cannot provide biometrics in the browser extension. Please try again."
+ },
+ "nativeMessaginPermissionSidebarTitle": {
+ "message": "Permission request error"
+ },
+ "nativeMessaginPermissionSidebarDesc": {
+ "message": "This action cannot be done in the sidebar, please retry the action in the popup or popout."
+ },
+ "personalOwnershipSubmitError": {
+ "message": "Due to an Enterprise Policy, you are restricted from saving items to your personal vault. Change the Ownership option to an organization and choose from available Collections."
+ },
+ "personalOwnershipPolicyInEffect": {
+ "message": "An organization policy is affecting your ownership options."
+ },
+ "excludedDomains": {
+ "message": "Excluded Domains"
+ },
+ "excludedDomainsDesc": {
+ "message": "Bitwarden will not ask to save login details for these domains. You must refresh the page for changes to take effect."
+ },
+ "excludedDomainsInvalidDomain": {
+ "message": "$DOMAIN$ is not a valid domain",
+ "placeholders": {
+ "domain": {
+ "content": "$1",
+ "example": "googlecom"
+ }
+ }
+ },
+ "send": {
+ "message": "Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "searchSends": {
+ "message": "Search Sends",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "addSend": {
+ "message": "Add Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTypeText": {
+ "message": "Text"
+ },
+ "sendTypeFile": {
+ "message": "File"
+ },
+ "allSends": {
+ "message": "All Sends",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "maxAccessCountReached": {
+ "message": "Max access count reached"
+ },
+ "expired": {
+ "message": "Expired"
+ },
+ "pendingDeletion": {
+ "message": "Pending deletion"
+ },
+ "passwordProtected": {
+ "message": "Password protected"
+ },
+ "copySendLink": {
+ "message": "Copy Send link",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "removePassword": {
+ "message": "Remove Password"
+ },
+ "delete": {
+ "message": "Delete"
+ },
+ "removedPassword": {
+ "message": "Removed Password"
+ },
+ "deletedSend": {
+ "message": "Deleted Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendLink": {
+ "message": "Send link",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "disabled": {
+ "message": "Disabled"
+ },
+ "removePasswordConfirmation": {
+ "message": "Are you sure you want to remove the password?"
+ },
+ "deleteSend": {
+ "message": "Delete Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "deleteSendConfirmation": {
+ "message": "Are you sure you want to delete this Send?",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "editSend": {
+ "message": "Edit Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTypeHeader": {
+ "message": "What type of Send is this?",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendNameDesc": {
+ "message": "A friendly name to describe this Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendFileDesc": {
+ "message": "The file you want to send."
+ },
+ "deletionDate": {
+ "message": "Deletion Date"
+ },
+ "deletionDateDesc": {
+ "message": "The Send will be permanently deleted on the specified date and time.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "expirationDate": {
+ "message": "Expiration Date"
+ },
+ "expirationDateDesc": {
+ "message": "If set, access to this Send will expire on the specified date and time.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "oneDay": {
+ "message": "1 day"
+ },
+ "days": {
+ "message": "$DAYS$ days",
+ "placeholders": {
+ "days": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "custom": {
+ "message": "Custom"
+ },
+ "maximumAccessCount": {
+ "message": "Maximum Access Count"
+ },
+ "maximumAccessCountDesc": {
+ "message": "If set, users will no longer be able to access this Send once the maximum access count is reached.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendPasswordDesc": {
+ "message": "Optionally require a password for users to access this Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendNotesDesc": {
+ "message": "Private notes about this Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendDisableDesc": {
+ "message": "Disable this Send so that no one can access it.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendShareDesc": {
+ "message": "Copy this Send's link to clipboard upon save.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTextDesc": {
+ "message": "The text you want to send."
+ },
+ "sendHideText": {
+ "message": "Hide this Send's text by default.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "currentAccessCount": {
+ "message": "Current Access Count"
+ },
+ "createSend": {
+ "message": "Create New Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "newPassword": {
+ "message": "New Password"
+ },
+ "sendDisabled": {
+ "message": "Send Disabled",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendDisabledWarning": {
+ "message": "Due to an enterprise policy, you are only able to delete an existing Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "createdSend": {
+ "message": "Created Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "editedSend": {
+ "message": "Edited Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendLinuxChromiumFileWarning": {
+ "message": "In order to choose a file, open the extension in the sidebar (if possible) or pop out to a new window by clicking this banner."
+ },
+ "sendFirefoxFileWarning": {
+ "message": "In order to choose a file using Firefox, open the extension in the sidebar or pop out to a new window by clicking this banner."
+ },
+ "sendSafariFileWarning": {
+ "message": "In order to choose a file using Safari, pop out to a new window by clicking this banner."
+ },
+ "sendFileCalloutHeader": {
+ "message": "Before you start"
+ },
+ "sendFirefoxCustomDatePopoutMessage1": {
+ "message": "To use a calendar style date picker",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read '**To use a calendar style date picker ** click here to pop out your window.'"
+ },
+ "sendFirefoxCustomDatePopoutMessage2": {
+ "message": "click here",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker **click here** to pop out your window.'"
+ },
+ "sendFirefoxCustomDatePopoutMessage3": {
+ "message": "to pop out your window.",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker click here **to pop out your window.**'"
+ },
+ "expirationDateIsInvalid": {
+ "message": "The expiration date provided is not valid."
+ },
+ "deletionDateIsInvalid": {
+ "message": "The deletion date provided is not valid."
+ },
+ "expirationDateAndTimeRequired": {
+ "message": "An expiration date and time are required."
+ },
+ "deletionDateAndTimeRequired": {
+ "message": "A deletion date and time are required."
+ },
+ "dateParsingError": {
+ "message": "There was an error saving your deletion and expiration dates."
+ },
+ "hideEmail": {
+ "message": "Hide my email address from recipients."
+ },
+ "sendOptionsPolicyInEffect": {
+ "message": "One or more organization policies are affecting your Send options."
+ },
+ "passwordPrompt": {
+ "message": "Master password re-prompt"
+ },
+ "passwordConfirmation": {
+ "message": "Master password confirmation"
+ },
+ "passwordConfirmationDesc": {
+ "message": "This action is protected. To continue, please re-enter your master password to verify your identity."
+ },
+ "emailVerificationRequired": {
+ "message": "Email Verification Required"
+ },
+ "emailVerificationRequiredDesc": {
+ "message": "You must verify your email to use this feature. You can verify your email in the web vault."
+ },
+ "updatedMasterPassword": {
+ "message": "Updated Master Password"
+ },
+ "updateMasterPassword": {
+ "message": "Update Master Password"
+ },
+ "updateMasterPasswordWarning": {
+ "message": "Your Master Password was recently changed by an administrator in your organization. In order to access the vault, you must update it now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour."
+ },
+ "resetPasswordPolicyAutoEnroll": {
+ "message": "Automatic Enrollment"
+ },
+ "resetPasswordAutoEnrollInviteWarning": {
+ "message": "This organization has an enterprise policy that will automatically enroll you in password reset. Enrollment will allow organization administrators to change your master password."
+ },
+ "selectFolder": {
+ "message": "Select folder..."
+ },
+ "ssoCompleteRegistration": {
+ "message": "In order to complete logging in with SSO, please set a master password to access and protect your vault."
+ },
+ "hours": {
+ "message": "Hours"
+ },
+ "minutes": {
+ "message": "Minutes"
+ },
+ "vaultTimeoutPolicyInEffect": {
+ "message": "Your organization policies are affecting your vault timeout. Maximum allowed Vault Timeout is $HOURS$ hour(s) and $MINUTES$ minute(s)",
+ "placeholders": {
+ "hours": {
+ "content": "$1",
+ "example": "5"
+ },
+ "minutes": {
+ "content": "$2",
+ "example": "5"
+ }
+ }
+ },
+ "vaultTimeoutToLarge": {
+ "message": "Your vault timeout exceeds the restrictions set by your organization."
+ },
+ "vaultExportDisabled": {
+ "message": "Vault Export Disabled"
+ },
+ "personalVaultExportPolicyInEffect": {
+ "message": "One or more organization policies prevents you from exporting your personal vault."
+ },
+ "copyCustomFieldNameInvalidElement": {
+ "message": "Unable to identify a valid form element. Try inspecting the HTML instead."
+ },
+ "copyCustomFieldNameNotUnique": {
+ "message": "No unique identifier found."
+ }
+}
diff --git a/src/iOS.Safari/Resources/_locales/en_GB/messages.json b/src/iOS.Safari/Resources/_locales/en_GB/messages.json
new file mode 100644
index 000000000..b573e401c
--- /dev/null
+++ b/src/iOS.Safari/Resources/_locales/en_GB/messages.json
@@ -0,0 +1,1817 @@
+{
+ "appName": {
+ "message": "Bitwarden"
+ },
+ "extName": {
+ "message": "Bitwarden - Free Password Manager",
+ "description": "Extension name, MUST be less than 40 characters (Safari restriction)"
+ },
+ "extDesc": {
+ "message": "A secure and free password manager for all of your devices.",
+ "description": "Extension description"
+ },
+ "loginOrCreateNewAccount": {
+ "message": "Log in or create a new account to access your secure vault."
+ },
+ "createAccount": {
+ "message": "Create account"
+ },
+ "login": {
+ "message": "Log in"
+ },
+ "enterpriseSingleSignOn": {
+ "message": "Enterprise single sign-on"
+ },
+ "cancel": {
+ "message": "Cancel"
+ },
+ "close": {
+ "message": "Close"
+ },
+ "submit": {
+ "message": "Submit"
+ },
+ "emailAddress": {
+ "message": "Email address"
+ },
+ "masterPass": {
+ "message": "Master password"
+ },
+ "masterPassDesc": {
+ "message": "The master password is the password you use to access your vault. It is very important that you do not forget your master password. There is no way to recover the password in the event that you forget it."
+ },
+ "masterPassHintDesc": {
+ "message": "A master password hint can help you remember your password if you forget it."
+ },
+ "reTypeMasterPass": {
+ "message": "Re-type master password"
+ },
+ "masterPassHint": {
+ "message": "Master password hint (optional)"
+ },
+ "tab": {
+ "message": "Tab"
+ },
+ "myVault": {
+ "message": "My vault"
+ },
+ "tools": {
+ "message": "Tools"
+ },
+ "settings": {
+ "message": "Settings"
+ },
+ "currentTab": {
+ "message": "Current tab"
+ },
+ "copyPassword": {
+ "message": "Copy password"
+ },
+ "copyNote": {
+ "message": "Copy note"
+ },
+ "copyUri": {
+ "message": "Copy URI"
+ },
+ "copyUsername": {
+ "message": "Copy username"
+ },
+ "copyNumber": {
+ "message": "Copy number"
+ },
+ "copySecurityCode": {
+ "message": "Copy security code"
+ },
+ "autoFill": {
+ "message": "Auto-fill"
+ },
+ "generatePasswordCopied": {
+ "message": "Generate password (copied)"
+ },
+ "copyElementIdentifier": {
+ "message": "Copy Custom Field Name"
+ },
+ "noMatchingLogins": {
+ "message": "No matching logins."
+ },
+ "vaultLocked": {
+ "message": "Vault is locked."
+ },
+ "vaultLoggedOut": {
+ "message": "Vault is logged out."
+ },
+ "autoFillInfo": {
+ "message": "There are no logins available to auto-fill for the current browser tab."
+ },
+ "addLogin": {
+ "message": "Add a login"
+ },
+ "addItem": {
+ "message": "Add item"
+ },
+ "passwordHint": {
+ "message": "Password hint"
+ },
+ "enterEmailToGetHint": {
+ "message": "Enter your account email address to receive your master password hint."
+ },
+ "getMasterPasswordHint": {
+ "message": "Get master password hint"
+ },
+ "continue": {
+ "message": "Continue"
+ },
+ "verificationCode": {
+ "message": "Verification code"
+ },
+ "account": {
+ "message": "Account"
+ },
+ "changeMasterPassword": {
+ "message": "Change master password"
+ },
+ "fingerprintPhrase": {
+ "message": "Fingerprint phrase",
+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
+ },
+ "yourAccountsFingerprint": {
+ "message": "Your account's fingerprint phrase",
+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
+ },
+ "twoStepLogin": {
+ "message": "Two-step login"
+ },
+ "logOut": {
+ "message": "Log out"
+ },
+ "about": {
+ "message": "About"
+ },
+ "version": {
+ "message": "Version"
+ },
+ "save": {
+ "message": "Save"
+ },
+ "move": {
+ "message": "Move"
+ },
+ "addFolder": {
+ "message": "Add folder"
+ },
+ "name": {
+ "message": "Name"
+ },
+ "editFolder": {
+ "message": "Edit folder"
+ },
+ "deleteFolder": {
+ "message": "Delete folder"
+ },
+ "folders": {
+ "message": "Folders"
+ },
+ "noFolders": {
+ "message": "There are no folders to list."
+ },
+ "helpFeedback": {
+ "message": "Help & feedback"
+ },
+ "sync": {
+ "message": "Sync"
+ },
+ "syncVaultNow": {
+ "message": "Sync vault now"
+ },
+ "lastSync": {
+ "message": "Last sync:"
+ },
+ "passGen": {
+ "message": "Password generator"
+ },
+ "generator": {
+ "message": "Generator",
+ "description": "Short for 'Password Generator'."
+ },
+ "passGenInfo": {
+ "message": "Automatically generate strong, unique passwords for your logins."
+ },
+ "bitWebVault": {
+ "message": "Bitwarden web vault"
+ },
+ "importItems": {
+ "message": "Import items"
+ },
+ "select": {
+ "message": "Select"
+ },
+ "generatePassword": {
+ "message": "Generate password"
+ },
+ "regeneratePassword": {
+ "message": "Regenerate password"
+ },
+ "options": {
+ "message": "Options"
+ },
+ "length": {
+ "message": "Length"
+ },
+ "numWords": {
+ "message": "Number of words"
+ },
+ "wordSeparator": {
+ "message": "Word separator"
+ },
+ "capitalize": {
+ "message": "Capitalise",
+ "description": "Make the first letter of a work uppercase."
+ },
+ "includeNumber": {
+ "message": "Include number"
+ },
+ "minNumbers": {
+ "message": "Minimum numbers"
+ },
+ "minSpecial": {
+ "message": "Minimum special"
+ },
+ "avoidAmbChar": {
+ "message": "Avoid ambiguous characters"
+ },
+ "searchVault": {
+ "message": "Search vault"
+ },
+ "edit": {
+ "message": "Edit"
+ },
+ "view": {
+ "message": "View"
+ },
+ "noItemsInList": {
+ "message": "There are no items to list."
+ },
+ "itemInformation": {
+ "message": "Item information"
+ },
+ "username": {
+ "message": "Username"
+ },
+ "password": {
+ "message": "Password"
+ },
+ "passphrase": {
+ "message": "Passphrase"
+ },
+ "favorite": {
+ "message": "Favourite"
+ },
+ "notes": {
+ "message": "Notes"
+ },
+ "note": {
+ "message": "Note"
+ },
+ "editItem": {
+ "message": "Edit item"
+ },
+ "folder": {
+ "message": "Folder"
+ },
+ "deleteItem": {
+ "message": "Delete item"
+ },
+ "viewItem": {
+ "message": "View item"
+ },
+ "launch": {
+ "message": "Launch"
+ },
+ "website": {
+ "message": "Website"
+ },
+ "toggleVisibility": {
+ "message": "Toggle visibility"
+ },
+ "manage": {
+ "message": "Manage"
+ },
+ "other": {
+ "message": "Other"
+ },
+ "rateExtension": {
+ "message": "Rate the extension"
+ },
+ "rateExtensionDesc": {
+ "message": "Please consider helping us out with a good review!"
+ },
+ "browserNotSupportClipboard": {
+ "message": "Your web browser does not support easy clipboard copying. Copy it manually instead."
+ },
+ "verifyMasterPassword": {
+ "message": "Verify master password"
+ },
+ "yourVaultIsLocked": {
+ "message": "Your vault is locked. Verify your master password to continue."
+ },
+ "unlock": {
+ "message": "Unlock"
+ },
+ "loggedInAsOn": {
+ "message": "Logged in as $EMAIL$ on $HOSTNAME$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "name@example.com"
+ },
+ "hostname": {
+ "content": "$2",
+ "example": "bitwarden.com"
+ }
+ }
+ },
+ "invalidMasterPassword": {
+ "message": "Invalid master password"
+ },
+ "vaultTimeout": {
+ "message": "Vault timeout"
+ },
+ "lockNow": {
+ "message": "Lock now"
+ },
+ "immediately": {
+ "message": "Immediately"
+ },
+ "tenSeconds": {
+ "message": "10 seconds"
+ },
+ "twentySeconds": {
+ "message": "20 seconds"
+ },
+ "thirtySeconds": {
+ "message": "30 seconds"
+ },
+ "oneMinute": {
+ "message": "1 minute"
+ },
+ "twoMinutes": {
+ "message": "2 minutes"
+ },
+ "fiveMinutes": {
+ "message": "5 minutes"
+ },
+ "fifteenMinutes": {
+ "message": "15 minutes"
+ },
+ "thirtyMinutes": {
+ "message": "30 minutes"
+ },
+ "oneHour": {
+ "message": "1 hour"
+ },
+ "fourHours": {
+ "message": "4 hours"
+ },
+ "onLocked": {
+ "message": "On system lock"
+ },
+ "onRestart": {
+ "message": "On browser restart"
+ },
+ "never": {
+ "message": "Never"
+ },
+ "security": {
+ "message": "Security"
+ },
+ "errorOccurred": {
+ "message": "An error has occurred"
+ },
+ "emailRequired": {
+ "message": "Email address is required."
+ },
+ "invalidEmail": {
+ "message": "Invalid email address."
+ },
+ "masterPassRequired": {
+ "message": "Master password is required."
+ },
+ "masterPassLength": {
+ "message": "Master password must be at least 8 characters long."
+ },
+ "masterPassDoesntMatch": {
+ "message": "Master password confirmation does not match."
+ },
+ "newAccountCreated": {
+ "message": "Your new account has been created! You may now log in."
+ },
+ "masterPassSent": {
+ "message": "We've sent you an email with your master password hint."
+ },
+ "verificationCodeRequired": {
+ "message": "Verification code is required."
+ },
+ "valueCopied": {
+ "message": "$VALUE$ copied",
+ "description": "Value has been copied to the clipboard.",
+ "placeholders": {
+ "value": {
+ "content": "$1",
+ "example": "Password"
+ }
+ }
+ },
+ "autofillError": {
+ "message": "Unable to auto-fill the selected item on this page. Copy and paste the information instead."
+ },
+ "loggedOut": {
+ "message": "Logged out"
+ },
+ "loginExpired": {
+ "message": "Your login session has expired."
+ },
+ "logOutConfirmation": {
+ "message": "Are you sure you want to log out?"
+ },
+ "yes": {
+ "message": "Yes"
+ },
+ "no": {
+ "message": "No"
+ },
+ "unexpectedError": {
+ "message": "An unexpected error has occurred."
+ },
+ "nameRequired": {
+ "message": "Name is required."
+ },
+ "addedFolder": {
+ "message": "Added folder"
+ },
+ "changeMasterPass": {
+ "message": "Change master password"
+ },
+ "changeMasterPasswordConfirmation": {
+ "message": "You can change your master password on the bitwarden.com web vault. Do you want to visit the website now?"
+ },
+ "twoStepLoginConfirmation": {
+ "message": "Two-step login makes your account more secure by requiring you to verify your login with another device such as a security key, authenticator app, SMS, phone call, or email. Two-step login can be enabled on the bitwarden.com web vault. Do you want to visit the website now?"
+ },
+ "editedFolder": {
+ "message": "Edited folder"
+ },
+ "deleteFolderConfirmation": {
+ "message": "Are you sure you want to delete this folder?"
+ },
+ "deletedFolder": {
+ "message": "Deleted folder"
+ },
+ "gettingStartedTutorial": {
+ "message": "Getting started tutorial"
+ },
+ "gettingStartedTutorialVideo": {
+ "message": "Watch our getting started tutorial to learn how to get the most out of the browser extension."
+ },
+ "syncingComplete": {
+ "message": "Syncing complete"
+ },
+ "syncingFailed": {
+ "message": "Syncing failed"
+ },
+ "passwordCopied": {
+ "message": "Password copied"
+ },
+ "uri": {
+ "message": "URI"
+ },
+ "uriPosition": {
+ "message": "URI $POSITION$",
+ "description": "A listing of URIs. Ex: URI 1, URI 2, URI 3, etc.",
+ "placeholders": {
+ "position": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "newUri": {
+ "message": "New URI"
+ },
+ "addedItem": {
+ "message": "Added item"
+ },
+ "editedItem": {
+ "message": "Edited item"
+ },
+ "deleteItemConfirmation": {
+ "message": "Do you really want to send to the bin?"
+ },
+ "deletedItem": {
+ "message": "Sent item to bin"
+ },
+ "overwritePassword": {
+ "message": "Overwrite password"
+ },
+ "overwritePasswordConfirmation": {
+ "message": "Are you sure you want to overwrite the current password?"
+ },
+ "searchFolder": {
+ "message": "Search folder"
+ },
+ "searchCollection": {
+ "message": "Search collection"
+ },
+ "searchType": {
+ "message": "Search type"
+ },
+ "noneFolder": {
+ "message": "No folder",
+ "description": "This is the folder for uncategorized items"
+ },
+ "disableAddLoginNotification": {
+ "message": "Disable add login notification"
+ },
+ "addLoginNotificationDesc": {
+ "message": "The \"add login notification\" automatically prompts you to save new logins to your vault whenever you log into them for the first time."
+ },
+ "dontShowCardsCurrentTab": {
+ "message": "Don't show cards on tab page"
+ },
+ "dontShowCardsCurrentTabDesc": {
+ "message": "Card items from your vault are listed on the 'current tab' page for easy auto-fill access."
+ },
+ "dontShowIdentitiesCurrentTab": {
+ "message": "Don't show identities on tab page"
+ },
+ "dontShowIdentitiesCurrentTabDesc": {
+ "message": "Identity items from your vault are listed on the 'current tab' page for easy auto-fill access."
+ },
+ "clearClipboard": {
+ "message": "Clear clipboard",
+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
+ },
+ "clearClipboardDesc": {
+ "message": "Automatically clear copied values from your clipboard.",
+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
+ },
+ "notificationAddDesc": {
+ "message": "Should Bitwarden remember this password for you?"
+ },
+ "notificationAddSave": {
+ "message": "Yes, save now"
+ },
+ "notificationNeverSave": {
+ "message": "Never for this website"
+ },
+ "disableChangedPasswordNotification": {
+ "message": "Disable changed password notification"
+ },
+ "disableChangedPasswordNotificationDesc": {
+ "message": "The \"changed password notification\" automatically prompts you to update a login's password in your vault whenever it detects that you have changed it on a website."
+ },
+ "notificationChangeDesc": {
+ "message": "Do you want to update this password in Bitwarden?"
+ },
+ "notificationChangeSave": {
+ "message": "Yes, update now"
+ },
+ "disableContextMenuItem": {
+ "message": "Disable context menu options"
+ },
+ "disableContextMenuItemDesc": {
+ "message": "Context menu options provide quick access to password generation and logins for the website in your current tab."
+ },
+ "defaultUriMatchDetection": {
+ "message": "Default URI match detection",
+ "description": "Default URI match detection for auto-fill."
+ },
+ "defaultUriMatchDetectionDesc": {
+ "message": "Choose the default way that URI match detection is handled for logins when performing actions such as auto-fill."
+ },
+ "theme": {
+ "message": "Theme"
+ },
+ "themeDesc": {
+ "message": "Change the application's colour theme."
+ },
+ "dark": {
+ "message": "Dark",
+ "description": "Dark color"
+ },
+ "light": {
+ "message": "Light",
+ "description": "Light color"
+ },
+ "solarizedDark": {
+ "message": "Solarized Dark",
+ "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated."
+ },
+ "exportVault": {
+ "message": "Export vault"
+ },
+ "fileFormat": {
+ "message": "File format"
+ },
+ "warning": {
+ "message": "WARNING",
+ "description": "WARNING (should stay in capitalized letters if the language permits)"
+ },
+ "confirmVaultExport": {
+ "message": "Confirm Vault Export"
+ },
+ "exportWarningDesc": {
+ "message": "This export contains your vault data in an unencrypted format. You should not store or send the exported file over insecure channels (such as email). Delete it immediately after you are done using it."
+ },
+ "encExportKeyWarningDesc": {
+ "message": "This export encrypts your data using your account's encryption key. If you ever rotate your account's encryption key you should export again since you will not be able to decrypt this export file."
+ },
+ "encExportAccountWarningDesc": {
+ "message": "Account encryption keys are unique to each Bitwarden user account, so you can't import an encrypted export into a different account."
+ },
+ "exportMasterPassword": {
+ "message": "Enter your master password to export your vault data."
+ },
+ "shared": {
+ "message": "Shared"
+ },
+ "learnOrg": {
+ "message": "Learn about Organisations"
+ },
+ "learnOrgConfirmation": {
+ "message": "Bitwarden allows you to share your vault items with others by using an organisation. Would you like to visit the bitwarden.com website to learn more?"
+ },
+ "moveToOrganization": {
+ "message": "Move to Organisation"
+ },
+ "share": {
+ "message": "Share"
+ },
+ "movedItemToOrg": {
+ "message": "$ITEMNAME$ moved to $ORGNAME$",
+ "placeholders": {
+ "itemname": {
+ "content": "$1",
+ "example": "Secret Item"
+ },
+ "orgname": {
+ "content": "$2",
+ "example": "Company Name"
+ }
+ }
+ },
+ "moveToOrgDesc": {
+ "message": "Choose an organisation that you wish to move this item to. Moving to an organisation transfers ownership of the item to that organisation. You will no longer be the direct owner of this item once it has been moved."
+ },
+ "learnMore": {
+ "message": "Learn more"
+ },
+ "authenticatorKeyTotp": {
+ "message": "Authenticator key (TOTP)"
+ },
+ "verificationCodeTotp": {
+ "message": "Verification code (TOTP)"
+ },
+ "copyVerificationCode": {
+ "message": "Copy verification code"
+ },
+ "attachments": {
+ "message": "Attachments"
+ },
+ "deleteAttachment": {
+ "message": "Delete attachment"
+ },
+ "deleteAttachmentConfirmation": {
+ "message": "Are you sure you want to delete this attachment?"
+ },
+ "deletedAttachment": {
+ "message": "Deleted attachment"
+ },
+ "newAttachment": {
+ "message": "Add new attachment"
+ },
+ "noAttachments": {
+ "message": "No attachments."
+ },
+ "attachmentSaved": {
+ "message": "The attachment has been saved."
+ },
+ "file": {
+ "message": "File"
+ },
+ "selectFile": {
+ "message": "Select a file."
+ },
+ "maxFileSize": {
+ "message": "Maximum file size is 500 MB."
+ },
+ "featureUnavailable": {
+ "message": "Feature unavailable"
+ },
+ "updateKey": {
+ "message": "You cannot use this feature until you update your encryption key."
+ },
+ "premiumMembership": {
+ "message": "Premium membership"
+ },
+ "premiumManage": {
+ "message": "Manage membership"
+ },
+ "premiumManageAlert": {
+ "message": "You can manage your membership on the bitwarden.com web vault. Do you want to visit the website now?"
+ },
+ "premiumRefresh": {
+ "message": "Refresh membership"
+ },
+ "premiumNotCurrentMember": {
+ "message": "You are not currently a premium member."
+ },
+ "premiumSignUpAndGet": {
+ "message": "Sign up for a premium membership and get:"
+ },
+ "ppremiumSignUpStorage": {
+ "message": "1 GB encrypted storage for file attachments."
+ },
+ "ppremiumSignUpTwoStep": {
+ "message": "Additional two-step login options such as YubiKey, FIDO U2F, and Duo."
+ },
+ "ppremiumSignUpReports": {
+ "message": "Password hygiene, account health, and data breach reports to keep your vault safe."
+ },
+ "ppremiumSignUpTotp": {
+ "message": "TOTP verification code (2FA) generator for logins in your vault."
+ },
+ "ppremiumSignUpSupport": {
+ "message": "Priority customer support."
+ },
+ "ppremiumSignUpFuture": {
+ "message": "All future premium features. More coming soon!"
+ },
+ "premiumPurchase": {
+ "message": "Purchase premium"
+ },
+ "premiumPurchaseAlert": {
+ "message": "You can purchase premium membership on the bitwarden.com web vault. Do you want to visit the website now?"
+ },
+ "premiumCurrentMember": {
+ "message": "You are a premium member!"
+ },
+ "premiumCurrentMemberThanks": {
+ "message": "Thank you for supporting Bitwarden."
+ },
+ "premiumPrice": {
+ "message": "All for just $PRICE$ /year!",
+ "placeholders": {
+ "price": {
+ "content": "$1",
+ "example": "$10"
+ }
+ }
+ },
+ "refreshComplete": {
+ "message": "Refresh complete"
+ },
+ "disableAutoTotpCopy": {
+ "message": "Disable automatic TOTP copy"
+ },
+ "disableAutoTotpCopyDesc": {
+ "message": "If your login has an authenticator key attached to it, the TOTP verification code is automatically copied to your clipboard whenever you auto-fill the login."
+ },
+ "disableAutoBiometricsPrompt": {
+ "message": "Do not prompt for biometrics on launch"
+ },
+ "premiumRequired": {
+ "message": "Premium required"
+ },
+ "premiumRequiredDesc": {
+ "message": "A premium membership is required to use this feature."
+ },
+ "enterVerificationCodeApp": {
+ "message": "Enter the 6 digit verification code from your authenticator app."
+ },
+ "enterVerificationCodeEmail": {
+ "message": "Enter the 6 digit verification code that was emailed to $EMAIL$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "example@gmail.com"
+ }
+ }
+ },
+ "verificationCodeEmailSent": {
+ "message": "Verification email sent to $EMAIL$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "example@gmail.com"
+ }
+ }
+ },
+ "rememberMe": {
+ "message": "Remember me"
+ },
+ "sendVerificationCodeEmailAgain": {
+ "message": "Send verification code email again"
+ },
+ "useAnotherTwoStepMethod": {
+ "message": "Use another two-step login method"
+ },
+ "insertYubiKey": {
+ "message": "Insert your YubiKey into your computer's USB port, then touch its button."
+ },
+ "insertU2f": {
+ "message": "Insert your security key into your computer's USB port. If it has a button, touch it."
+ },
+ "webAuthnNewTab": {
+ "message": "To start the WebAuthn 2FA verification. Click the button below to open a new tab and follow the instructions provided in the new tab."
+ },
+ "webAuthnNewTabOpen": {
+ "message": "Open new tab"
+ },
+ "webAuthnAuthenticate": {
+ "message": "Authenticate WebAuthn"
+ },
+ "loginUnavailable": {
+ "message": "Login unavailable"
+ },
+ "noTwoStepProviders": {
+ "message": "This account has two-step login enabled. However, none of the configured two-step providers are supported by this web browser."
+ },
+ "noTwoStepProviders2": {
+ "message": "Please use a supported web browser (such as Chrome) and/or add additional providers that are better supported across web browsers (such as an authenticator app)."
+ },
+ "twoStepOptions": {
+ "message": "Two-step login options"
+ },
+ "recoveryCodeDesc": {
+ "message": "Lost access to all of your two-factor providers? Use your recovery code to disable all two-factor providers from your account."
+ },
+ "recoveryCodeTitle": {
+ "message": "Recovery code"
+ },
+ "authenticatorAppTitle": {
+ "message": "Authenticator app"
+ },
+ "authenticatorAppDesc": {
+ "message": "Use an authenticator app (such as Authy or Google Authenticator) to generate time-based verification codes.",
+ "description": "'Authy' and 'Google Authenticator' are product names and should not be translated."
+ },
+ "yubiKeyTitle": {
+ "message": "YubiKey OTP security key"
+ },
+ "yubiKeyDesc": {
+ "message": "Use a YubiKey to access your account. Works with YubiKey 4, 4 Nano, 4C, and NEO devices."
+ },
+ "duoDesc": {
+ "message": "Verify with Duo Security using the Duo Mobile app, SMS, phone call, or U2F security key.",
+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
+ },
+ "duoOrganizationDesc": {
+ "message": "Verify with Duo Security for your organisation using the Duo Mobile app, SMS, phone call, or U2F security key.",
+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
+ },
+ "webAuthnTitle": {
+ "message": "FIDO2 WebAuthn"
+ },
+ "webAuthnDesc": {
+ "message": "Use any WebAuthn enabled security key to access your account."
+ },
+ "emailTitle": {
+ "message": "Email"
+ },
+ "emailDesc": {
+ "message": "Verification codes will be emailed to you."
+ },
+ "selfHostedEnvironment": {
+ "message": "Self-hosted environment"
+ },
+ "selfHostedEnvironmentFooter": {
+ "message": "Specify the base URL of your on-premise hosted Bitwarden installation."
+ },
+ "customEnvironment": {
+ "message": "Custom environment"
+ },
+ "customEnvironmentFooter": {
+ "message": "For advanced users. You can specify the base URL of each service independently."
+ },
+ "baseUrl": {
+ "message": "Server URL"
+ },
+ "apiUrl": {
+ "message": "API server URL"
+ },
+ "webVaultUrl": {
+ "message": "Web vault server URL"
+ },
+ "identityUrl": {
+ "message": "Identity server URL"
+ },
+ "notificationsUrl": {
+ "message": "Notifications server URL"
+ },
+ "iconsUrl": {
+ "message": "Icons server URL"
+ },
+ "environmentSaved": {
+ "message": "The environment URLs have been saved."
+ },
+ "enableAutoFillOnPageLoad": {
+ "message": "Enable Auto-fill on Page Load"
+ },
+ "enableAutoFillOnPageLoadDesc": {
+ "message": "If a login form is detected, automatically perform an auto-fill when the web page loads."
+ },
+ "experimentalFeature": {
+ "message": "This is currently an experimental feature. Use at your own risk."
+ },
+ "defaultAutoFillOnPageLoad": {
+ "message": "Default autofill setting for login items"
+ },
+ "defaultAutoFillOnPageLoadDesc": {
+ "message": "After enabling Auto-fill on Page Load, you can enable or disable the feature for individual login items. This is the default setting for login items that are not separately configured."
+ },
+ "itemAutoFillOnPageLoad": {
+ "message": "Auto-fill on Page Load (if enabled in Options)"
+ },
+ "autoFillOnPageLoadUseDefault": {
+ "message": "Use default setting"
+ },
+ "autoFillOnPageLoadYes": {
+ "message": "Auto-fill on page load"
+ },
+ "autoFillOnPageLoadNo": {
+ "message": "Do not auto-fill on page load"
+ },
+ "commandOpenPopup": {
+ "message": "Open vault popup"
+ },
+ "commandOpenSidebar": {
+ "message": "Open vault in sidebar"
+ },
+ "commandAutofillDesc": {
+ "message": "Auto-fill the last used login for the current website."
+ },
+ "commandGeneratePasswordDesc": {
+ "message": "Generate and copy a new random password to the clipboard."
+ },
+ "commandLockVaultDesc": {
+ "message": "Lock the vault"
+ },
+ "privateModeMessage": {
+ "message": "Unfortunately this window is not available in private mode for this browser."
+ },
+ "customFields": {
+ "message": "Custom fields"
+ },
+ "copyValue": {
+ "message": "Copy value"
+ },
+ "value": {
+ "message": "Value"
+ },
+ "newCustomField": {
+ "message": "New custom field"
+ },
+ "dragToSort": {
+ "message": "Drag to sort"
+ },
+ "cfTypeText": {
+ "message": "Text"
+ },
+ "cfTypeHidden": {
+ "message": "Hidden"
+ },
+ "cfTypeBoolean": {
+ "message": "Boolean"
+ },
+ "popup2faCloseMessage": {
+ "message": "Clicking outside the popup window to check your email for your verification code will cause this popup to close. Do you want to open this popup in a new window so that it does not close?"
+ },
+ "popupU2fCloseMessage": {
+ "message": "This browser cannot process U2F requests in this pop-up window. Do you want to open this pop-up in a new window so that you can log in using U2F?"
+ },
+ "disableFavicon": {
+ "message": "Disable website icons"
+ },
+ "disableFaviconDesc": {
+ "message": "Website icons provide a recognisable image next to each login item in your vault."
+ },
+ "disableBadgeCounter": {
+ "message": "Disable Badge Counter"
+ },
+ "disableBadgeCounterDesc": {
+ "message": "Badge counter indicates how many logins you have for the current page in your vault."
+ },
+ "cardholderName": {
+ "message": "Cardholder name"
+ },
+ "number": {
+ "message": "Number"
+ },
+ "brand": {
+ "message": "Brand"
+ },
+ "expirationMonth": {
+ "message": "Expiration month"
+ },
+ "expirationYear": {
+ "message": "Expiration year"
+ },
+ "expiration": {
+ "message": "Expiration"
+ },
+ "january": {
+ "message": "January"
+ },
+ "february": {
+ "message": "February"
+ },
+ "march": {
+ "message": "March"
+ },
+ "april": {
+ "message": "April"
+ },
+ "may": {
+ "message": "May"
+ },
+ "june": {
+ "message": "June"
+ },
+ "july": {
+ "message": "July"
+ },
+ "august": {
+ "message": "August"
+ },
+ "september": {
+ "message": "September"
+ },
+ "october": {
+ "message": "October"
+ },
+ "november": {
+ "message": "November"
+ },
+ "december": {
+ "message": "December"
+ },
+ "securityCode": {
+ "message": "Security code"
+ },
+ "ex": {
+ "message": "e.g."
+ },
+ "title": {
+ "message": "Title"
+ },
+ "mr": {
+ "message": "Mr"
+ },
+ "mrs": {
+ "message": "Mrs"
+ },
+ "ms": {
+ "message": "Ms"
+ },
+ "dr": {
+ "message": "Dr"
+ },
+ "firstName": {
+ "message": "First name"
+ },
+ "middleName": {
+ "message": "Middle name"
+ },
+ "lastName": {
+ "message": "Last name"
+ },
+ "identityName": {
+ "message": "Identity name"
+ },
+ "company": {
+ "message": "Company"
+ },
+ "ssn": {
+ "message": "National Insurance number"
+ },
+ "passportNumber": {
+ "message": "Passport number"
+ },
+ "licenseNumber": {
+ "message": "Licence number"
+ },
+ "email": {
+ "message": "Email"
+ },
+ "phone": {
+ "message": "Phone"
+ },
+ "address": {
+ "message": "Address"
+ },
+ "address1": {
+ "message": "Address 1"
+ },
+ "address2": {
+ "message": "Address 2"
+ },
+ "address3": {
+ "message": "Address 3"
+ },
+ "cityTown": {
+ "message": "City / town"
+ },
+ "stateProvince": {
+ "message": "County"
+ },
+ "zipPostalCode": {
+ "message": "Postcode"
+ },
+ "country": {
+ "message": "Country"
+ },
+ "type": {
+ "message": "Type"
+ },
+ "typeLogin": {
+ "message": "Login"
+ },
+ "typeLogins": {
+ "message": "Logins"
+ },
+ "typeSecureNote": {
+ "message": "Secure note"
+ },
+ "typeCard": {
+ "message": "Card"
+ },
+ "typeIdentity": {
+ "message": "Identity"
+ },
+ "passwordHistory": {
+ "message": "Password history"
+ },
+ "back": {
+ "message": "Back"
+ },
+ "collections": {
+ "message": "Collections"
+ },
+ "favorites": {
+ "message": "Favourites"
+ },
+ "popOutNewWindow": {
+ "message": "Pop out to a new window"
+ },
+ "refresh": {
+ "message": "Refresh"
+ },
+ "cards": {
+ "message": "Cards"
+ },
+ "identities": {
+ "message": "Identities"
+ },
+ "logins": {
+ "message": "Logins"
+ },
+ "secureNotes": {
+ "message": "Secure notes"
+ },
+ "clear": {
+ "message": "Clear",
+ "description": "To clear something out. example: To clear browser history."
+ },
+ "checkPassword": {
+ "message": "Check if password has been exposed."
+ },
+ "passwordExposed": {
+ "message": "This password has been exposed $VALUE$ time(s) in data breaches. You should change it.",
+ "placeholders": {
+ "value": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "passwordSafe": {
+ "message": "This password was not found in any known data breaches. It should be safe to use."
+ },
+ "baseDomain": {
+ "message": "Base domain"
+ },
+ "host": {
+ "message": "Host",
+ "description": "A URL's host value. For example, the host of https://sub.domain.com:443 is 'sub.domain.com:443'."
+ },
+ "exact": {
+ "message": "Exact"
+ },
+ "startsWith": {
+ "message": "Starts with"
+ },
+ "regEx": {
+ "message": "Regular expression",
+ "description": "A programming term, also known as 'RegEx'."
+ },
+ "matchDetection": {
+ "message": "Match detection",
+ "description": "URI match detection for auto-fill."
+ },
+ "defaultMatchDetection": {
+ "message": "Default match detection",
+ "description": "Default URI match detection for auto-fill."
+ },
+ "toggleOptions": {
+ "message": "Toggle options"
+ },
+ "toggleCurrentUris": {
+ "message": "Toggle current URIs",
+ "description": "Toggle the display of the URIs of the currently open tabs in the browser."
+ },
+ "currentUri": {
+ "message": "Current URI",
+ "description": "The URI of one of the current open tabs in the browser."
+ },
+ "organization": {
+ "message": "Organisation",
+ "description": "An entity of multiple related people (ex. a team or business organization)."
+ },
+ "types": {
+ "message": "Types"
+ },
+ "allItems": {
+ "message": "All items"
+ },
+ "noPasswordsInList": {
+ "message": "There are no passwords to list."
+ },
+ "remove": {
+ "message": "Remove"
+ },
+ "default": {
+ "message": "Default"
+ },
+ "dateUpdated": {
+ "message": "Updated",
+ "description": "ex. Date this item was updated"
+ },
+ "datePasswordUpdated": {
+ "message": "Password updated",
+ "description": "ex. Date this password was updated"
+ },
+ "neverLockWarning": {
+ "message": "Are you sure you want to use the \"Never\" option? Setting your lock options to \"Never\" stores your vault's encryption key on your device. If you use this option you should ensure that you keep your device properly protected."
+ },
+ "noOrganizationsList": {
+ "message": "You do not belong to any organisations. Organisations allow you to securely share items with other users."
+ },
+ "noCollectionsInList": {
+ "message": "There are no collections to list."
+ },
+ "ownership": {
+ "message": "Ownership"
+ },
+ "whoOwnsThisItem": {
+ "message": "Who owns this item?"
+ },
+ "strong": {
+ "message": "Strong",
+ "description": "ex. A strong password. Scale: Weak -> Good -> Strong"
+ },
+ "good": {
+ "message": "Good",
+ "description": "ex. A good password. Scale: Weak -> Good -> Strong"
+ },
+ "weak": {
+ "message": "Weak",
+ "description": "ex. A weak password. Scale: Weak -> Good -> Strong"
+ },
+ "weakMasterPassword": {
+ "message": "Weak master password"
+ },
+ "weakMasterPasswordDesc": {
+ "message": "The master password you have chosen is weak. You should use a strong master password (or a passphrase) to properly protect your Bitwarden account. Are you sure you want to use this master password?"
+ },
+ "pin": {
+ "message": "PIN",
+ "description": "PIN code. Ex. The short code (often numeric) that you use to unlock a device."
+ },
+ "unlockWithPin": {
+ "message": "Unlock with PIN"
+ },
+ "setYourPinCode": {
+ "message": "Set your PIN code for unlocking Bitwarden. Your PIN settings will be reset if you ever fully log out of the application."
+ },
+ "pinRequired": {
+ "message": "PIN code is required."
+ },
+ "invalidPin": {
+ "message": "Invalid PIN code."
+ },
+ "verifyPin": {
+ "message": "Verify PIN"
+ },
+ "yourVaultIsLockedPinCode": {
+ "message": "Your vault is locked. Verify your PIN code to continue."
+ },
+ "unlockWithBiometrics": {
+ "message": "Unlock with biometrics"
+ },
+ "awaitDesktop": {
+ "message": "Awaiting confirmation from desktop"
+ },
+ "awaitDesktopDesc": {
+ "message": "Please confirm using biometrics in the Bitwarden Desktop application to enable biometrics for browser."
+ },
+ "lockWithMasterPassOnRestart": {
+ "message": "Lock with master password on browser restart"
+ },
+ "selectOneCollection": {
+ "message": "You must select at least one collection."
+ },
+ "cloneItem": {
+ "message": "Clone item"
+ },
+ "clone": {
+ "message": "Clone"
+ },
+ "passwordGeneratorPolicyInEffect": {
+ "message": "One or more organisation policies are affecting your generator settings."
+ },
+ "vaultTimeoutAction": {
+ "message": "Vault timeout action"
+ },
+ "lock": {
+ "message": "Lock",
+ "description": "Verb form: to make secure or inaccesible by"
+ },
+ "trash": {
+ "message": "Bin",
+ "description": "Noun: a special folder to hold deleted items"
+ },
+ "searchTrash": {
+ "message": "Search bin"
+ },
+ "permanentlyDeleteItem": {
+ "message": "Permanently delete item"
+ },
+ "permanentlyDeleteItemConfirmation": {
+ "message": "Are you sure you want to permanently delete this item?"
+ },
+ "permanentlyDeletedItem": {
+ "message": "Permanently deleted item"
+ },
+ "restoreItem": {
+ "message": "Restore item"
+ },
+ "restoreItemConfirmation": {
+ "message": "Are you sure you want to restore this item?"
+ },
+ "restoredItem": {
+ "message": "Restored item"
+ },
+ "vaultTimeoutLogOutConfirmation": {
+ "message": "Logging out will remove all access to your vault and requires online authentication after the timeout period. Are you sure you want to use this setting?"
+ },
+ "vaultTimeoutLogOutConfirmationTitle": {
+ "message": "Timeout action confirmation"
+ },
+ "autoFillAndSave": {
+ "message": "Auto-fill and save"
+ },
+ "autoFillSuccessAndSavedUri": {
+ "message": "Auto-filled item and saved URI"
+ },
+ "autoFillSuccess": {
+ "message": "Auto-filled item"
+ },
+ "setMasterPassword": {
+ "message": "Set master password"
+ },
+ "masterPasswordPolicyInEffect": {
+ "message": "One or more organisation policies require your master password to meet the following requirements:"
+ },
+ "policyInEffectMinComplexity": {
+ "message": "Minimum complexity score of $SCORE$",
+ "placeholders": {
+ "score": {
+ "content": "$1",
+ "example": "4"
+ }
+ }
+ },
+ "policyInEffectMinLength": {
+ "message": "Minimum length of $LENGTH$",
+ "placeholders": {
+ "length": {
+ "content": "$1",
+ "example": "14"
+ }
+ }
+ },
+ "policyInEffectUppercase": {
+ "message": "Contain one or more uppercase characters"
+ },
+ "policyInEffectLowercase": {
+ "message": "Contain one or more lowercase characters"
+ },
+ "policyInEffectNumbers": {
+ "message": "Contain one or more numbers"
+ },
+ "policyInEffectSpecial": {
+ "message": "Contain one or more of the following special characters $CHARS$",
+ "placeholders": {
+ "chars": {
+ "content": "$1",
+ "example": "!@#$%^&*"
+ }
+ }
+ },
+ "masterPasswordPolicyRequirementsNotMet": {
+ "message": "Your new master password does not meet the policy requirements."
+ },
+ "acceptPolicies": {
+ "message": "By checking this box you agree to the following:"
+ },
+ "acceptPoliciesError": {
+ "message": "Terms of service and privacy policy have not been acknowledged."
+ },
+ "termsOfService": {
+ "message": "Terms of service"
+ },
+ "privacyPolicy": {
+ "message": "Privacy policy"
+ },
+ "hintEqualsPassword": {
+ "message": "Your password hint cannot be the same as your password."
+ },
+ "ok": {
+ "message": "OK"
+ },
+ "desktopSyncVerificationTitle": {
+ "message": "Desktop sync verification"
+ },
+ "desktopIntegrationVerificationText": {
+ "message": "Please verify that the desktop application shows this fingerprint: "
+ },
+ "desktopIntegrationDisabledTitle": {
+ "message": "Browser integration is not enabled"
+ },
+ "desktopIntegrationDisabledDesc": {
+ "message": "Browser integration is not enabled in the Bitwarden Desktop application. Please enable it in the settings within the desktop application."
+ },
+ "startDesktopTitle": {
+ "message": "Start the Bitwarden Desktop application"
+ },
+ "startDesktopDesc": {
+ "message": "The Bitwarden Desktop application needs to be started before this function can be used."
+ },
+ "errorEnableBiometricTitle": {
+ "message": "Unable to enable biometrics"
+ },
+ "errorEnableBiometricDesc": {
+ "message": "Action was cancelled by the desktop application"
+ },
+ "nativeMessagingInvalidEncryptionDesc": {
+ "message": "Desktop application invalidated the secure communication channel. Please retry this operation"
+ },
+ "nativeMessagingInvalidEncryptionTitle": {
+ "message": "Desktop communication interrupted"
+ },
+ "nativeMessagingWrongUserDesc": {
+ "message": "The desktop application is logged into a different account. Please ensure both applications are logged into the same account."
+ },
+ "nativeMessagingWrongUserTitle": {
+ "message": "Account mismatch"
+ },
+ "biometricsNotEnabledTitle": {
+ "message": "Biometrics not enabled"
+ },
+ "biometricsNotEnabledDesc": {
+ "message": "Browser biometrics requires desktop biometric to be enabled in the settings first."
+ },
+ "biometricsNotSupportedTitle": {
+ "message": "Biometrics not supported"
+ },
+ "biometricsNotSupportedDesc": {
+ "message": "Browser biometrics is not supported on this device."
+ },
+ "nativeMessaginPermissionErrorTitle": {
+ "message": "Permission not provided"
+ },
+ "nativeMessaginPermissionErrorDesc": {
+ "message": "Without permission to communicate with the Bitwarden Desktop Application we cannot provide biometrics in the browser extension. Please try again."
+ },
+ "nativeMessaginPermissionSidebarTitle": {
+ "message": "Permission request error"
+ },
+ "nativeMessaginPermissionSidebarDesc": {
+ "message": "This action cannot be done in the sidebar, please retry the action in the popup or popout."
+ },
+ "personalOwnershipSubmitError": {
+ "message": "Due to an Enterprise Policy, you are restricted from saving items to your personal vault. Change the Ownership option to an organisation and choose from available Collections."
+ },
+ "personalOwnershipPolicyInEffect": {
+ "message": "An organisation policy is affecting your ownership options."
+ },
+ "excludedDomains": {
+ "message": "Excluded Domains"
+ },
+ "excludedDomainsDesc": {
+ "message": "Bitwarden will not ask to save login details for these domains. You must refresh the page for changes to take effect."
+ },
+ "excludedDomainsInvalidDomain": {
+ "message": "$DOMAIN$ is not a valid domain",
+ "placeholders": {
+ "domain": {
+ "content": "$1",
+ "example": "googlecom"
+ }
+ }
+ },
+ "send": {
+ "message": "Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "searchSends": {
+ "message": "Search Sends",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "addSend": {
+ "message": "Add Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTypeText": {
+ "message": "Text"
+ },
+ "sendTypeFile": {
+ "message": "File"
+ },
+ "allSends": {
+ "message": "All Sends",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "maxAccessCountReached": {
+ "message": "Max access count reached"
+ },
+ "expired": {
+ "message": "Expired"
+ },
+ "pendingDeletion": {
+ "message": "Pending deletion"
+ },
+ "passwordProtected": {
+ "message": "Password protected"
+ },
+ "copySendLink": {
+ "message": "Copy Send link",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "removePassword": {
+ "message": "Remove Password"
+ },
+ "delete": {
+ "message": "Delete"
+ },
+ "removedPassword": {
+ "message": "Removed Password"
+ },
+ "deletedSend": {
+ "message": "Deleted Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendLink": {
+ "message": "Send link",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "disabled": {
+ "message": "Disabled"
+ },
+ "removePasswordConfirmation": {
+ "message": "Are you sure you want to remove the password?"
+ },
+ "deleteSend": {
+ "message": "Delete Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "deleteSendConfirmation": {
+ "message": "Are you sure you want to delete this Send?",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "editSend": {
+ "message": "Edit Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTypeHeader": {
+ "message": "What type of Send is this?",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendNameDesc": {
+ "message": "A friendly name to describe this Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendFileDesc": {
+ "message": "The file you want to send."
+ },
+ "deletionDate": {
+ "message": "Deletion Date"
+ },
+ "deletionDateDesc": {
+ "message": "The Send will be permanently deleted on the specified date and time.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "expirationDate": {
+ "message": "Expiration Date"
+ },
+ "expirationDateDesc": {
+ "message": "If set, access to this Send will expire on the specified date and time.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "oneDay": {
+ "message": "1 day"
+ },
+ "days": {
+ "message": "$DAYS$ days",
+ "placeholders": {
+ "days": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "custom": {
+ "message": "Custom"
+ },
+ "maximumAccessCount": {
+ "message": "Maximum Access Count"
+ },
+ "maximumAccessCountDesc": {
+ "message": "If set, users will no longer be able to access this Send once the maximum access count is reached.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendPasswordDesc": {
+ "message": "Optionally require a password for users to access this Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendNotesDesc": {
+ "message": "Private notes about this Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendDisableDesc": {
+ "message": "Disable this Send so that no one can access it.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendShareDesc": {
+ "message": "Copy this Send's link to clipboard upon save.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTextDesc": {
+ "message": "The text you want to send."
+ },
+ "sendHideText": {
+ "message": "Hide this Send's text by default.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "currentAccessCount": {
+ "message": "Current Access Count"
+ },
+ "createSend": {
+ "message": "Create New Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "newPassword": {
+ "message": "New Password"
+ },
+ "sendDisabled": {
+ "message": "Send Disabled",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendDisabledWarning": {
+ "message": "Due to an enterprise policy, you are only able to delete an existing Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "createdSend": {
+ "message": "Created Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "editedSend": {
+ "message": "Edited Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendLinuxChromiumFileWarning": {
+ "message": "In order to choose a file, open the extension in the sidebar (if possible) or pop out to a new window by clicking this banner."
+ },
+ "sendFirefoxFileWarning": {
+ "message": "In order to choose a file using Firefox, open the extension in the sidebar or pop out to a new window by clicking this banner."
+ },
+ "sendSafariFileWarning": {
+ "message": "In order to choose a file using Safari, pop out to a new window by clicking this banner."
+ },
+ "sendFileCalloutHeader": {
+ "message": "Before you start"
+ },
+ "sendFirefoxCustomDatePopoutMessage1": {
+ "message": "To use a calendar style date picker",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read '**To use a calendar style date picker ** click here to pop out your window.'"
+ },
+ "sendFirefoxCustomDatePopoutMessage2": {
+ "message": "click here",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker **click here** to pop out your window.'"
+ },
+ "sendFirefoxCustomDatePopoutMessage3": {
+ "message": "to pop out your window.",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker click here **to pop out your window.**'"
+ },
+ "expirationDateIsInvalid": {
+ "message": "The expiration date provided is not valid."
+ },
+ "deletionDateIsInvalid": {
+ "message": "The deletion date provided is not valid."
+ },
+ "expirationDateAndTimeRequired": {
+ "message": "An expiration date and time are required."
+ },
+ "deletionDateAndTimeRequired": {
+ "message": "A deletion date and time are required."
+ },
+ "dateParsingError": {
+ "message": "There was an error saving your deletion and expiration dates."
+ },
+ "hideEmail": {
+ "message": "Hide my email address from recipients."
+ },
+ "sendOptionsPolicyInEffect": {
+ "message": "One or more organisation policies are affecting your Send options."
+ },
+ "passwordPrompt": {
+ "message": "Master password re-prompt"
+ },
+ "passwordConfirmation": {
+ "message": "Master password confirmation"
+ },
+ "passwordConfirmationDesc": {
+ "message": "This action is protected. To continue, please re-enter your master password to verify your identity."
+ },
+ "emailVerificationRequired": {
+ "message": "Email Verification Required"
+ },
+ "emailVerificationRequiredDesc": {
+ "message": "You must verify your email to use this feature. You can verify your email in the web vault."
+ },
+ "updatedMasterPassword": {
+ "message": "Updated Master Password"
+ },
+ "updateMasterPassword": {
+ "message": "Update Master Password"
+ },
+ "updateMasterPasswordWarning": {
+ "message": "Your Master Password was recently changed by an administrator in your organization. In order to access the vault, you must update it now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour."
+ },
+ "resetPasswordPolicyAutoEnroll": {
+ "message": "Automatic Enrollment"
+ },
+ "resetPasswordAutoEnrollInviteWarning": {
+ "message": "This organization has an enterprise policy that will automatically enroll you in password reset. Enrollment will allow organization administrators to change your master password."
+ },
+ "selectFolder": {
+ "message": "Select folder..."
+ },
+ "ssoCompleteRegistration": {
+ "message": "In order to complete logging in with SSO, please set a master password to access and protect your vault."
+ },
+ "hours": {
+ "message": "Hours"
+ },
+ "minutes": {
+ "message": "Minutes"
+ },
+ "vaultTimeoutPolicyInEffect": {
+ "message": "Your organization policies are affecting your vault timeout. Maximum allowed Vault Timeout is $HOURS$ hour(s) and $MINUTES$ minute(s)",
+ "placeholders": {
+ "hours": {
+ "content": "$1",
+ "example": "5"
+ },
+ "minutes": {
+ "content": "$2",
+ "example": "5"
+ }
+ }
+ },
+ "vaultTimeoutToLarge": {
+ "message": "Your vault timeout exceeds the restrictions set by your organization."
+ },
+ "vaultExportDisabled": {
+ "message": "Vault Export Disabled"
+ },
+ "personalVaultExportPolicyInEffect": {
+ "message": "One or more organization policies prevents you from exporting your personal vault."
+ },
+ "copyCustomFieldNameInvalidElement": {
+ "message": "Unable to identify a valid form element. Try inspecting the HTML instead."
+ },
+ "copyCustomFieldNameNotUnique": {
+ "message": "No unique identifier found."
+ }
+}
diff --git a/src/iOS.Safari/Resources/_locales/en_IN/messages.json b/src/iOS.Safari/Resources/_locales/en_IN/messages.json
new file mode 100644
index 000000000..d6272e372
--- /dev/null
+++ b/src/iOS.Safari/Resources/_locales/en_IN/messages.json
@@ -0,0 +1,1817 @@
+{
+ "appName": {
+ "message": "Bitwarden"
+ },
+ "extName": {
+ "message": "Bitwarden - Free Password Manager",
+ "description": "Extension name, MUST be less than 40 characters (Safari restriction)"
+ },
+ "extDesc": {
+ "message": "A secure and free password manager for all of your devices.",
+ "description": "Extension description"
+ },
+ "loginOrCreateNewAccount": {
+ "message": "Log in or create a new account to access your secure vault."
+ },
+ "createAccount": {
+ "message": "Create account"
+ },
+ "login": {
+ "message": "Log in"
+ },
+ "enterpriseSingleSignOn": {
+ "message": "Enterprise single sign-on"
+ },
+ "cancel": {
+ "message": "Cancel"
+ },
+ "close": {
+ "message": "Close"
+ },
+ "submit": {
+ "message": "Submit"
+ },
+ "emailAddress": {
+ "message": "Email address"
+ },
+ "masterPass": {
+ "message": "Master password"
+ },
+ "masterPassDesc": {
+ "message": "The master password is the password you use to access your vault. It is very important that you do not forget your master password. There is no way to recover the password in the event that you forget it."
+ },
+ "masterPassHintDesc": {
+ "message": "A master password hint can help you remember your password if you forget it."
+ },
+ "reTypeMasterPass": {
+ "message": "Re-type master password"
+ },
+ "masterPassHint": {
+ "message": "Master password hint (optional)"
+ },
+ "tab": {
+ "message": "Tab"
+ },
+ "myVault": {
+ "message": "My vault"
+ },
+ "tools": {
+ "message": "Tools"
+ },
+ "settings": {
+ "message": "Settings"
+ },
+ "currentTab": {
+ "message": "Current tab"
+ },
+ "copyPassword": {
+ "message": "Copy password"
+ },
+ "copyNote": {
+ "message": "Copy note"
+ },
+ "copyUri": {
+ "message": "Copy URI"
+ },
+ "copyUsername": {
+ "message": "Copy username"
+ },
+ "copyNumber": {
+ "message": "Copy number"
+ },
+ "copySecurityCode": {
+ "message": "Copy security code"
+ },
+ "autoFill": {
+ "message": "Auto-fill"
+ },
+ "generatePasswordCopied": {
+ "message": "Generate password (copied)"
+ },
+ "copyElementIdentifier": {
+ "message": "Copy Custom Field Name"
+ },
+ "noMatchingLogins": {
+ "message": "No matching logins."
+ },
+ "vaultLocked": {
+ "message": "Vault is locked."
+ },
+ "vaultLoggedOut": {
+ "message": "Vault is logged out."
+ },
+ "autoFillInfo": {
+ "message": "There are no logins available to auto-fill for the current browser tab."
+ },
+ "addLogin": {
+ "message": "Add a login"
+ },
+ "addItem": {
+ "message": "Add item"
+ },
+ "passwordHint": {
+ "message": "Password hint"
+ },
+ "enterEmailToGetHint": {
+ "message": "Enter your account email address to receive your master password hint."
+ },
+ "getMasterPasswordHint": {
+ "message": "Get master password hint"
+ },
+ "continue": {
+ "message": "Continue"
+ },
+ "verificationCode": {
+ "message": "Verification code"
+ },
+ "account": {
+ "message": "Account"
+ },
+ "changeMasterPassword": {
+ "message": "Change master password"
+ },
+ "fingerprintPhrase": {
+ "message": "Fingerprint phrase",
+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
+ },
+ "yourAccountsFingerprint": {
+ "message": "Your account's fingerprint phrase",
+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
+ },
+ "twoStepLogin": {
+ "message": "Two-step login"
+ },
+ "logOut": {
+ "message": "Log out"
+ },
+ "about": {
+ "message": "About"
+ },
+ "version": {
+ "message": "Version"
+ },
+ "save": {
+ "message": "Save"
+ },
+ "move": {
+ "message": "Move"
+ },
+ "addFolder": {
+ "message": "Add folder"
+ },
+ "name": {
+ "message": "Name"
+ },
+ "editFolder": {
+ "message": "Edit folder"
+ },
+ "deleteFolder": {
+ "message": "Delete folder"
+ },
+ "folders": {
+ "message": "Folders"
+ },
+ "noFolders": {
+ "message": "There are no folders to list."
+ },
+ "helpFeedback": {
+ "message": "Help & feedback"
+ },
+ "sync": {
+ "message": "Sync"
+ },
+ "syncVaultNow": {
+ "message": "Sync vault now"
+ },
+ "lastSync": {
+ "message": "Last sync:"
+ },
+ "passGen": {
+ "message": "Password generator"
+ },
+ "generator": {
+ "message": "Generator",
+ "description": "Short for 'Password Generator'."
+ },
+ "passGenInfo": {
+ "message": "Automatically generate strong, unique passwords for your logins."
+ },
+ "bitWebVault": {
+ "message": "Bitwarden web vault"
+ },
+ "importItems": {
+ "message": "Import items"
+ },
+ "select": {
+ "message": "Select"
+ },
+ "generatePassword": {
+ "message": "Generate password"
+ },
+ "regeneratePassword": {
+ "message": "Regenerate password"
+ },
+ "options": {
+ "message": "Options"
+ },
+ "length": {
+ "message": "Length"
+ },
+ "numWords": {
+ "message": "Number of words"
+ },
+ "wordSeparator": {
+ "message": "Word separator"
+ },
+ "capitalize": {
+ "message": "Capitalise",
+ "description": "Make the first letter of a work uppercase."
+ },
+ "includeNumber": {
+ "message": "Include number"
+ },
+ "minNumbers": {
+ "message": "Minimum numbers"
+ },
+ "minSpecial": {
+ "message": "Minimum special"
+ },
+ "avoidAmbChar": {
+ "message": "Avoid ambiguous characters"
+ },
+ "searchVault": {
+ "message": "Search vault"
+ },
+ "edit": {
+ "message": "Edit"
+ },
+ "view": {
+ "message": "View"
+ },
+ "noItemsInList": {
+ "message": "There are no items to list."
+ },
+ "itemInformation": {
+ "message": "Item information"
+ },
+ "username": {
+ "message": "Username"
+ },
+ "password": {
+ "message": "Password"
+ },
+ "passphrase": {
+ "message": "Passphrase"
+ },
+ "favorite": {
+ "message": "Favourite"
+ },
+ "notes": {
+ "message": "Notes"
+ },
+ "note": {
+ "message": "Note"
+ },
+ "editItem": {
+ "message": "Edit item"
+ },
+ "folder": {
+ "message": "Folder"
+ },
+ "deleteItem": {
+ "message": "Delete item"
+ },
+ "viewItem": {
+ "message": "View item"
+ },
+ "launch": {
+ "message": "Launch"
+ },
+ "website": {
+ "message": "Website"
+ },
+ "toggleVisibility": {
+ "message": "Toggle visibility"
+ },
+ "manage": {
+ "message": "Manage"
+ },
+ "other": {
+ "message": "Other"
+ },
+ "rateExtension": {
+ "message": "Rate the extension"
+ },
+ "rateExtensionDesc": {
+ "message": "Please consider helping us out with a good review!"
+ },
+ "browserNotSupportClipboard": {
+ "message": "Your web browser does not support easy clipboard copying. Copy it manually instead."
+ },
+ "verifyMasterPassword": {
+ "message": "Verify master password"
+ },
+ "yourVaultIsLocked": {
+ "message": "Your vault is locked. Verify your master password to continue."
+ },
+ "unlock": {
+ "message": "Unlock"
+ },
+ "loggedInAsOn": {
+ "message": "Logged in as $EMAIL$ on $HOSTNAME$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "name@example.com"
+ },
+ "hostname": {
+ "content": "$2",
+ "example": "bitwarden.com"
+ }
+ }
+ },
+ "invalidMasterPassword": {
+ "message": "Invalid master password"
+ },
+ "vaultTimeout": {
+ "message": "Vault timeout"
+ },
+ "lockNow": {
+ "message": "Lock now"
+ },
+ "immediately": {
+ "message": "Immediately"
+ },
+ "tenSeconds": {
+ "message": "10 seconds"
+ },
+ "twentySeconds": {
+ "message": "20 seconds"
+ },
+ "thirtySeconds": {
+ "message": "30 seconds"
+ },
+ "oneMinute": {
+ "message": "1 minute"
+ },
+ "twoMinutes": {
+ "message": "2 minutes"
+ },
+ "fiveMinutes": {
+ "message": "5 minutes"
+ },
+ "fifteenMinutes": {
+ "message": "15 minutes"
+ },
+ "thirtyMinutes": {
+ "message": "30 minutes"
+ },
+ "oneHour": {
+ "message": "1 hour"
+ },
+ "fourHours": {
+ "message": "4 hours"
+ },
+ "onLocked": {
+ "message": "On system lock"
+ },
+ "onRestart": {
+ "message": "On browser restart"
+ },
+ "never": {
+ "message": "Never"
+ },
+ "security": {
+ "message": "Security"
+ },
+ "errorOccurred": {
+ "message": "An error has occurred"
+ },
+ "emailRequired": {
+ "message": "Email address is required."
+ },
+ "invalidEmail": {
+ "message": "Invalid email address."
+ },
+ "masterPassRequired": {
+ "message": "Master password is required."
+ },
+ "masterPassLength": {
+ "message": "Master password must be at least 8 characters long."
+ },
+ "masterPassDoesntMatch": {
+ "message": "Master password confirmation does not match."
+ },
+ "newAccountCreated": {
+ "message": "Your new account has been created! You may now log in."
+ },
+ "masterPassSent": {
+ "message": "We've sent you an email with your master password hint."
+ },
+ "verificationCodeRequired": {
+ "message": "Verification code is required."
+ },
+ "valueCopied": {
+ "message": "$VALUE$ copied",
+ "description": "Value has been copied to the clipboard.",
+ "placeholders": {
+ "value": {
+ "content": "$1",
+ "example": "Password"
+ }
+ }
+ },
+ "autofillError": {
+ "message": "Unable to auto-fill the selected item on this page. Copy and paste the information instead."
+ },
+ "loggedOut": {
+ "message": "Logged out"
+ },
+ "loginExpired": {
+ "message": "Your login session has expired."
+ },
+ "logOutConfirmation": {
+ "message": "Are you sure you want to log out?"
+ },
+ "yes": {
+ "message": "Yes"
+ },
+ "no": {
+ "message": "No"
+ },
+ "unexpectedError": {
+ "message": "An unexpected error has occurred."
+ },
+ "nameRequired": {
+ "message": "Name is required."
+ },
+ "addedFolder": {
+ "message": "Added folder"
+ },
+ "changeMasterPass": {
+ "message": "Change master password"
+ },
+ "changeMasterPasswordConfirmation": {
+ "message": "You can change your master password on the bitwarden.com web vault. Do you want to visit the website now?"
+ },
+ "twoStepLoginConfirmation": {
+ "message": "Two-step login makes your account more secure by requiring you to verify your login with another device such as a security key, authenticator app, SMS, phone call, or email. Two-step login can be enabled on the bitwarden.com web vault. Do you want to visit the website now?"
+ },
+ "editedFolder": {
+ "message": "Edited folder"
+ },
+ "deleteFolderConfirmation": {
+ "message": "Are you sure you want to delete this folder?"
+ },
+ "deletedFolder": {
+ "message": "Deleted folder"
+ },
+ "gettingStartedTutorial": {
+ "message": "Getting started tutorial"
+ },
+ "gettingStartedTutorialVideo": {
+ "message": "Watch our getting started tutorial to learn how to get the most out of the browser extension."
+ },
+ "syncingComplete": {
+ "message": "Syncing complete"
+ },
+ "syncingFailed": {
+ "message": "Syncing failed"
+ },
+ "passwordCopied": {
+ "message": "Password copied"
+ },
+ "uri": {
+ "message": "URI"
+ },
+ "uriPosition": {
+ "message": "URI $POSITION$",
+ "description": "A listing of URIs. Ex: URI 1, URI 2, URI 3, etc.",
+ "placeholders": {
+ "position": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "newUri": {
+ "message": "New URI"
+ },
+ "addedItem": {
+ "message": "Added item"
+ },
+ "editedItem": {
+ "message": "Edited item"
+ },
+ "deleteItemConfirmation": {
+ "message": "Do you really want to send to the bin?"
+ },
+ "deletedItem": {
+ "message": "Sent item to bin"
+ },
+ "overwritePassword": {
+ "message": "Overwrite password"
+ },
+ "overwritePasswordConfirmation": {
+ "message": "Are you sure you want to overwrite the current password?"
+ },
+ "searchFolder": {
+ "message": "Search folder"
+ },
+ "searchCollection": {
+ "message": "Search collection"
+ },
+ "searchType": {
+ "message": "Search type"
+ },
+ "noneFolder": {
+ "message": "No folder",
+ "description": "This is the folder for uncategorized items"
+ },
+ "disableAddLoginNotification": {
+ "message": "Disable add login notification"
+ },
+ "addLoginNotificationDesc": {
+ "message": "The \"add login notification\" automatically prompts you to save new logins to your vault whenever you log into them for the first time."
+ },
+ "dontShowCardsCurrentTab": {
+ "message": "Don't show cards on tab page"
+ },
+ "dontShowCardsCurrentTabDesc": {
+ "message": "Card items from your vault are listed on the 'current tab' page for easy auto-fill access."
+ },
+ "dontShowIdentitiesCurrentTab": {
+ "message": "Don't show identities on tab page"
+ },
+ "dontShowIdentitiesCurrentTabDesc": {
+ "message": "Identity items from your vault are listed on the 'current tab' page for easy auto-fill access."
+ },
+ "clearClipboard": {
+ "message": "Clear clipboard",
+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
+ },
+ "clearClipboardDesc": {
+ "message": "Automatically clear copied values from your clipboard.",
+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
+ },
+ "notificationAddDesc": {
+ "message": "Should Bitwarden remember this password for you?"
+ },
+ "notificationAddSave": {
+ "message": "Yes, save now"
+ },
+ "notificationNeverSave": {
+ "message": "Never for this website"
+ },
+ "disableChangedPasswordNotification": {
+ "message": "Disable changed password notification"
+ },
+ "disableChangedPasswordNotificationDesc": {
+ "message": "The \"changed password notification\" automatically prompts you to update a login's password in your vault whenever it detects that you have changed it on a website."
+ },
+ "notificationChangeDesc": {
+ "message": "Do you want to update this password in Bitwarden?"
+ },
+ "notificationChangeSave": {
+ "message": "Yes, update now"
+ },
+ "disableContextMenuItem": {
+ "message": "Disable context menu options"
+ },
+ "disableContextMenuItemDesc": {
+ "message": "Context menu options provide quick access to password generation and logins for the website in your current tab."
+ },
+ "defaultUriMatchDetection": {
+ "message": "Default URI match detection",
+ "description": "Default URI match detection for auto-fill."
+ },
+ "defaultUriMatchDetectionDesc": {
+ "message": "Choose the default way that URI match detection is handled for logins when performing actions such as auto-fill."
+ },
+ "theme": {
+ "message": "Theme"
+ },
+ "themeDesc": {
+ "message": "Change the application's colour theme."
+ },
+ "dark": {
+ "message": "Dark",
+ "description": "Dark color"
+ },
+ "light": {
+ "message": "Light",
+ "description": "Light color"
+ },
+ "solarizedDark": {
+ "message": "Solarized Dark",
+ "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated."
+ },
+ "exportVault": {
+ "message": "Export vault"
+ },
+ "fileFormat": {
+ "message": "File format"
+ },
+ "warning": {
+ "message": "WARNING",
+ "description": "WARNING (should stay in capitalized letters if the language permits)"
+ },
+ "confirmVaultExport": {
+ "message": "Confirm Vault Export"
+ },
+ "exportWarningDesc": {
+ "message": "This export contains your vault data in an unencrypted format. You should not store or send the exported file over insecure channels (such as email). Delete it immediately after you are done using it."
+ },
+ "encExportKeyWarningDesc": {
+ "message": "This export encrypts your data using your account's encryption key. If you ever rotate your account's encryption key you should export again since you will not be able to decrypt this export file."
+ },
+ "encExportAccountWarningDesc": {
+ "message": "Account encryption keys are unique to each Bitwarden user account, so you can't import an encrypted export into a different account."
+ },
+ "exportMasterPassword": {
+ "message": "Enter your master password to export your vault data."
+ },
+ "shared": {
+ "message": "Shared"
+ },
+ "learnOrg": {
+ "message": "Learn about Organisations"
+ },
+ "learnOrgConfirmation": {
+ "message": "Bitwarden allows you to share your vault items with others by using an organisation. Would you like to visit the bitwarden.com website to learn more?"
+ },
+ "moveToOrganization": {
+ "message": "Move to Organisation"
+ },
+ "share": {
+ "message": "Share"
+ },
+ "movedItemToOrg": {
+ "message": "$ITEMNAME$ moved to $ORGNAME$",
+ "placeholders": {
+ "itemname": {
+ "content": "$1",
+ "example": "Secret Item"
+ },
+ "orgname": {
+ "content": "$2",
+ "example": "Company Name"
+ }
+ }
+ },
+ "moveToOrgDesc": {
+ "message": "Choose an organisation that you wish to move this item to. Moving to an organisation transfers ownership of the item to that organisation. You will no longer be the direct owner of this item once it has been moved."
+ },
+ "learnMore": {
+ "message": "Learn more"
+ },
+ "authenticatorKeyTotp": {
+ "message": "Authenticator key (TOTP)"
+ },
+ "verificationCodeTotp": {
+ "message": "Verification code (TOTP)"
+ },
+ "copyVerificationCode": {
+ "message": "Copy verification code"
+ },
+ "attachments": {
+ "message": "Attachments"
+ },
+ "deleteAttachment": {
+ "message": "Delete attachment"
+ },
+ "deleteAttachmentConfirmation": {
+ "message": "Are you sure you want to delete this attachment?"
+ },
+ "deletedAttachment": {
+ "message": "Deleted attachment"
+ },
+ "newAttachment": {
+ "message": "Add new attachment"
+ },
+ "noAttachments": {
+ "message": "No attachments."
+ },
+ "attachmentSaved": {
+ "message": "The attachment has been saved."
+ },
+ "file": {
+ "message": "File"
+ },
+ "selectFile": {
+ "message": "Select a file."
+ },
+ "maxFileSize": {
+ "message": "Maximum file size is 500 MB."
+ },
+ "featureUnavailable": {
+ "message": "Feature unavailable"
+ },
+ "updateKey": {
+ "message": "You cannot use this feature until you update your encryption key."
+ },
+ "premiumMembership": {
+ "message": "Premium membership"
+ },
+ "premiumManage": {
+ "message": "Manage membership"
+ },
+ "premiumManageAlert": {
+ "message": "You can manage your membership on the bitwarden.com web vault. Do you want to visit the website now?"
+ },
+ "premiumRefresh": {
+ "message": "Refresh membership"
+ },
+ "premiumNotCurrentMember": {
+ "message": "You are not currently a premium member."
+ },
+ "premiumSignUpAndGet": {
+ "message": "Sign up for a premium membership and get:"
+ },
+ "ppremiumSignUpStorage": {
+ "message": "1 GB encrypted storage for file attachments."
+ },
+ "ppremiumSignUpTwoStep": {
+ "message": "Additional two-step login options such as YubiKey, FIDO U2F, and Duo."
+ },
+ "ppremiumSignUpReports": {
+ "message": "Password hygiene, account health, and data breach reports to keep your vault safe."
+ },
+ "ppremiumSignUpTotp": {
+ "message": "TOTP verification code (2FA) generator for logins in your vault."
+ },
+ "ppremiumSignUpSupport": {
+ "message": "Priority customer support."
+ },
+ "ppremiumSignUpFuture": {
+ "message": "All future premium features. More coming soon!"
+ },
+ "premiumPurchase": {
+ "message": "Purchase premium"
+ },
+ "premiumPurchaseAlert": {
+ "message": "You can purchase premium membership on the bitwarden.com web vault. Do you want to visit the website now?"
+ },
+ "premiumCurrentMember": {
+ "message": "You are a premium member!"
+ },
+ "premiumCurrentMemberThanks": {
+ "message": "Thank you for supporting Bitwarden."
+ },
+ "premiumPrice": {
+ "message": "All for just $PRICE$ /year!",
+ "placeholders": {
+ "price": {
+ "content": "$1",
+ "example": "$10"
+ }
+ }
+ },
+ "refreshComplete": {
+ "message": "Refresh complete"
+ },
+ "disableAutoTotpCopy": {
+ "message": "Disable automatic TOTP copy"
+ },
+ "disableAutoTotpCopyDesc": {
+ "message": "If your login has an authenticator key attached to it, the TOTP verification code is automatically copied to your clipboard whenever you auto-fill the login."
+ },
+ "disableAutoBiometricsPrompt": {
+ "message": "Do not prompt for biometrics on launch"
+ },
+ "premiumRequired": {
+ "message": "Premium required"
+ },
+ "premiumRequiredDesc": {
+ "message": "A premium membership is required to use this feature."
+ },
+ "enterVerificationCodeApp": {
+ "message": "Enter the 6 digit verification code from your authenticator app."
+ },
+ "enterVerificationCodeEmail": {
+ "message": "Enter the 6 digit verification code that was emailed to $EMAIL$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "example@gmail.com"
+ }
+ }
+ },
+ "verificationCodeEmailSent": {
+ "message": "Verification email sent to $EMAIL$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "example@gmail.com"
+ }
+ }
+ },
+ "rememberMe": {
+ "message": "Remember me"
+ },
+ "sendVerificationCodeEmailAgain": {
+ "message": "Send verification code email again"
+ },
+ "useAnotherTwoStepMethod": {
+ "message": "Use another two-step login method"
+ },
+ "insertYubiKey": {
+ "message": "Insert your YubiKey into your computer's USB port, then touch its button."
+ },
+ "insertU2f": {
+ "message": "Insert your security key into your computer's USB port. If it has a button, touch it."
+ },
+ "webAuthnNewTab": {
+ "message": "To start the WebAuthn 2FA verification. Click the button below to open a new tab and follow the instructions provided in the new tab."
+ },
+ "webAuthnNewTabOpen": {
+ "message": "Open new tab"
+ },
+ "webAuthnAuthenticate": {
+ "message": "Authenticate WebAuthn"
+ },
+ "loginUnavailable": {
+ "message": "Login unavailable"
+ },
+ "noTwoStepProviders": {
+ "message": "This account has two-step login enabled. However, none of the configured two-step providers are supported by this web browser."
+ },
+ "noTwoStepProviders2": {
+ "message": "Please use a supported web browser (such as Chrome) and/or add additional providers that are better supported across web browsers (such as an authenticator app)."
+ },
+ "twoStepOptions": {
+ "message": "Two-step login options"
+ },
+ "recoveryCodeDesc": {
+ "message": "Lost access to all of your two-factor providers? Use your recovery code to disable all two-factor providers from your account."
+ },
+ "recoveryCodeTitle": {
+ "message": "Recovery code"
+ },
+ "authenticatorAppTitle": {
+ "message": "Authenticator app"
+ },
+ "authenticatorAppDesc": {
+ "message": "Use an authenticator app (such as Authy or Google Authenticator) to generate time-based verification codes.",
+ "description": "'Authy' and 'Google Authenticator' are product names and should not be translated."
+ },
+ "yubiKeyTitle": {
+ "message": "YubiKey OTP security key"
+ },
+ "yubiKeyDesc": {
+ "message": "Use a YubiKey to access your account. Works with YubiKey 4, 4 Nano, 4C, and NEO devices."
+ },
+ "duoDesc": {
+ "message": "Verify with Duo Security using the Duo Mobile app, SMS, phone call, or U2F security key.",
+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
+ },
+ "duoOrganizationDesc": {
+ "message": "Verify with Duo Security for your organisation using the Duo Mobile app, SMS, phone call, or U2F security key.",
+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
+ },
+ "webAuthnTitle": {
+ "message": "FIDO2 WebAuthn"
+ },
+ "webAuthnDesc": {
+ "message": "Use any WebAuthn enabled security key to access your account."
+ },
+ "emailTitle": {
+ "message": "Email"
+ },
+ "emailDesc": {
+ "message": "Verification codes will be emailed to you."
+ },
+ "selfHostedEnvironment": {
+ "message": "Self-hosted environment"
+ },
+ "selfHostedEnvironmentFooter": {
+ "message": "Specify the base URL of your on-premise hosted Bitwarden installation."
+ },
+ "customEnvironment": {
+ "message": "Custom environment"
+ },
+ "customEnvironmentFooter": {
+ "message": "For advanced users. You can specify the base URL of each service independently."
+ },
+ "baseUrl": {
+ "message": "Server URL"
+ },
+ "apiUrl": {
+ "message": "API server URL"
+ },
+ "webVaultUrl": {
+ "message": "Web vault server URL"
+ },
+ "identityUrl": {
+ "message": "Identity server URL"
+ },
+ "notificationsUrl": {
+ "message": "Notifications server URL"
+ },
+ "iconsUrl": {
+ "message": "Icons server URL"
+ },
+ "environmentSaved": {
+ "message": "The environment URLs have been saved."
+ },
+ "enableAutoFillOnPageLoad": {
+ "message": "Enable Auto-fill on Page Load"
+ },
+ "enableAutoFillOnPageLoadDesc": {
+ "message": "If a login form is detected, automatically perform an auto-fill when the web page loads."
+ },
+ "experimentalFeature": {
+ "message": "This is currently an experimental feature. Use at your own risk."
+ },
+ "defaultAutoFillOnPageLoad": {
+ "message": "Default autofill setting for login items"
+ },
+ "defaultAutoFillOnPageLoadDesc": {
+ "message": "After enabling Auto-fill on Page Load, you can enable or disable the feature for individual login items. This is the default setting for login items that are not separately configured."
+ },
+ "itemAutoFillOnPageLoad": {
+ "message": "Auto-fill on Page Load (if enabled in Options)"
+ },
+ "autoFillOnPageLoadUseDefault": {
+ "message": "Use default setting"
+ },
+ "autoFillOnPageLoadYes": {
+ "message": "Auto-fill on page load"
+ },
+ "autoFillOnPageLoadNo": {
+ "message": "Do not auto-fill on page load"
+ },
+ "commandOpenPopup": {
+ "message": "Open vault popup"
+ },
+ "commandOpenSidebar": {
+ "message": "Open vault in sidebar"
+ },
+ "commandAutofillDesc": {
+ "message": "Auto-fill the last used login for the current website."
+ },
+ "commandGeneratePasswordDesc": {
+ "message": "Generate and copy a new random password to the clipboard."
+ },
+ "commandLockVaultDesc": {
+ "message": "Lock the vault"
+ },
+ "privateModeMessage": {
+ "message": "Unfortunately this window is not available in private mode for this browser."
+ },
+ "customFields": {
+ "message": "Custom fields"
+ },
+ "copyValue": {
+ "message": "Copy value"
+ },
+ "value": {
+ "message": "Value"
+ },
+ "newCustomField": {
+ "message": "New custom field"
+ },
+ "dragToSort": {
+ "message": "Drag to sort"
+ },
+ "cfTypeText": {
+ "message": "Text"
+ },
+ "cfTypeHidden": {
+ "message": "Hidden"
+ },
+ "cfTypeBoolean": {
+ "message": "Boolean"
+ },
+ "popup2faCloseMessage": {
+ "message": "Clicking outside the popup window to check your email for your verification code will cause this popup to close. Do you want to open this popup in a new window so that it does not close?"
+ },
+ "popupU2fCloseMessage": {
+ "message": "This browser cannot process U2F requests in this pop-up window. Do you want to open this pop-up in a new window so that you can log in using U2F?"
+ },
+ "disableFavicon": {
+ "message": "Disable website icons"
+ },
+ "disableFaviconDesc": {
+ "message": "Website icons provide a recognisable image next to each login item in your vault."
+ },
+ "disableBadgeCounter": {
+ "message": "Disable Badge Counter"
+ },
+ "disableBadgeCounterDesc": {
+ "message": "Badge counter indicates how many logins you have for the current page in your vault."
+ },
+ "cardholderName": {
+ "message": "Cardholder name"
+ },
+ "number": {
+ "message": "Number"
+ },
+ "brand": {
+ "message": "Brand"
+ },
+ "expirationMonth": {
+ "message": "Expiration month"
+ },
+ "expirationYear": {
+ "message": "Expiration year"
+ },
+ "expiration": {
+ "message": "Expiration"
+ },
+ "january": {
+ "message": "January"
+ },
+ "february": {
+ "message": "February"
+ },
+ "march": {
+ "message": "March"
+ },
+ "april": {
+ "message": "April"
+ },
+ "may": {
+ "message": "May"
+ },
+ "june": {
+ "message": "June"
+ },
+ "july": {
+ "message": "July"
+ },
+ "august": {
+ "message": "August"
+ },
+ "september": {
+ "message": "September"
+ },
+ "october": {
+ "message": "October"
+ },
+ "november": {
+ "message": "November"
+ },
+ "december": {
+ "message": "December"
+ },
+ "securityCode": {
+ "message": "Security code"
+ },
+ "ex": {
+ "message": "e.g."
+ },
+ "title": {
+ "message": "Title"
+ },
+ "mr": {
+ "message": "Mr"
+ },
+ "mrs": {
+ "message": "Mrs"
+ },
+ "ms": {
+ "message": "Ms"
+ },
+ "dr": {
+ "message": "Dr"
+ },
+ "firstName": {
+ "message": "First name"
+ },
+ "middleName": {
+ "message": "Middle name"
+ },
+ "lastName": {
+ "message": "Last name"
+ },
+ "identityName": {
+ "message": "Identity name"
+ },
+ "company": {
+ "message": "Company"
+ },
+ "ssn": {
+ "message": "National Insurance number"
+ },
+ "passportNumber": {
+ "message": "Passport number"
+ },
+ "licenseNumber": {
+ "message": "Licence number"
+ },
+ "email": {
+ "message": "Email"
+ },
+ "phone": {
+ "message": "Phone"
+ },
+ "address": {
+ "message": "Address"
+ },
+ "address1": {
+ "message": "Address 1"
+ },
+ "address2": {
+ "message": "Address 2"
+ },
+ "address3": {
+ "message": "Address 3"
+ },
+ "cityTown": {
+ "message": "City / town"
+ },
+ "stateProvince": {
+ "message": "County"
+ },
+ "zipPostalCode": {
+ "message": "Postcode"
+ },
+ "country": {
+ "message": "Country"
+ },
+ "type": {
+ "message": "Type"
+ },
+ "typeLogin": {
+ "message": "Login"
+ },
+ "typeLogins": {
+ "message": "Logins"
+ },
+ "typeSecureNote": {
+ "message": "Secure note"
+ },
+ "typeCard": {
+ "message": "Card"
+ },
+ "typeIdentity": {
+ "message": "Identity"
+ },
+ "passwordHistory": {
+ "message": "Password history"
+ },
+ "back": {
+ "message": "Back"
+ },
+ "collections": {
+ "message": "Collections"
+ },
+ "favorites": {
+ "message": "Favourites"
+ },
+ "popOutNewWindow": {
+ "message": "Pop out to a new window"
+ },
+ "refresh": {
+ "message": "Refresh"
+ },
+ "cards": {
+ "message": "Cards"
+ },
+ "identities": {
+ "message": "Identities"
+ },
+ "logins": {
+ "message": "Logins"
+ },
+ "secureNotes": {
+ "message": "Secure notes"
+ },
+ "clear": {
+ "message": "Clear",
+ "description": "To clear something out. example: To clear browser history."
+ },
+ "checkPassword": {
+ "message": "Check if password has been exposed."
+ },
+ "passwordExposed": {
+ "message": "This password has been exposed $VALUE$ time(s) in data breaches. You should change it.",
+ "placeholders": {
+ "value": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "passwordSafe": {
+ "message": "This password was not found in any known data breaches. It should be safe to use."
+ },
+ "baseDomain": {
+ "message": "Base domain"
+ },
+ "host": {
+ "message": "Host",
+ "description": "A URL's host value. For example, the host of https://sub.domain.com:443 is 'sub.domain.com:443'."
+ },
+ "exact": {
+ "message": "Exact"
+ },
+ "startsWith": {
+ "message": "Starts with"
+ },
+ "regEx": {
+ "message": "Regular expression",
+ "description": "A programming term, also known as 'RegEx'."
+ },
+ "matchDetection": {
+ "message": "Match detection",
+ "description": "URI match detection for auto-fill."
+ },
+ "defaultMatchDetection": {
+ "message": "Default match detection",
+ "description": "Default URI match detection for auto-fill."
+ },
+ "toggleOptions": {
+ "message": "Toggle options"
+ },
+ "toggleCurrentUris": {
+ "message": "Toggle current URIs",
+ "description": "Toggle the display of the URIs of the currently open tabs in the browser."
+ },
+ "currentUri": {
+ "message": "Current URI",
+ "description": "The URI of one of the current open tabs in the browser."
+ },
+ "organization": {
+ "message": "Organisation",
+ "description": "An entity of multiple related people (ex. a team or business organization)."
+ },
+ "types": {
+ "message": "Types"
+ },
+ "allItems": {
+ "message": "All items"
+ },
+ "noPasswordsInList": {
+ "message": "There are no passwords to list."
+ },
+ "remove": {
+ "message": "Remove"
+ },
+ "default": {
+ "message": "Default"
+ },
+ "dateUpdated": {
+ "message": "Updated",
+ "description": "ex. Date this item was updated"
+ },
+ "datePasswordUpdated": {
+ "message": "Password updated",
+ "description": "ex. Date this password was updated"
+ },
+ "neverLockWarning": {
+ "message": "Are you sure you want to use the \"Never\" option? Setting your lock options to \"Never\" stores your vault's encryption key on your device. If you use this option you should ensure that you keep your device properly protected."
+ },
+ "noOrganizationsList": {
+ "message": "You do not belong to any organisations. Organisations allow you to securely share items with other users."
+ },
+ "noCollectionsInList": {
+ "message": "There are no collections to list."
+ },
+ "ownership": {
+ "message": "Ownership"
+ },
+ "whoOwnsThisItem": {
+ "message": "Who owns this item?"
+ },
+ "strong": {
+ "message": "Strong",
+ "description": "ex. A strong password. Scale: Weak -> Good -> Strong"
+ },
+ "good": {
+ "message": "Good",
+ "description": "ex. A good password. Scale: Weak -> Good -> Strong"
+ },
+ "weak": {
+ "message": "Weak",
+ "description": "ex. A weak password. Scale: Weak -> Good -> Strong"
+ },
+ "weakMasterPassword": {
+ "message": "Weak master password"
+ },
+ "weakMasterPasswordDesc": {
+ "message": "The master password you have chosen is weak. You should use a strong master password (or a passphrase) to properly protect your Bitwarden account. Are you sure you want to use this master password?"
+ },
+ "pin": {
+ "message": "PIN",
+ "description": "PIN code. Ex. The short code (often numeric) that you use to unlock a device."
+ },
+ "unlockWithPin": {
+ "message": "Unlock with PIN"
+ },
+ "setYourPinCode": {
+ "message": "Set your PIN code for unlocking Bitwarden. Your PIN settings will be reset if you ever fully log out of the application."
+ },
+ "pinRequired": {
+ "message": "PIN code is required."
+ },
+ "invalidPin": {
+ "message": "Invalid PIN code."
+ },
+ "verifyPin": {
+ "message": "Verify PIN"
+ },
+ "yourVaultIsLockedPinCode": {
+ "message": "Your vault is locked. Verify your PIN code to continue."
+ },
+ "unlockWithBiometrics": {
+ "message": "Unlock with biometrics"
+ },
+ "awaitDesktop": {
+ "message": "Awaiting confirmation from desktop"
+ },
+ "awaitDesktopDesc": {
+ "message": "Please confirm using biometrics in the Bitwarden Desktop application to enable biometrics for browser."
+ },
+ "lockWithMasterPassOnRestart": {
+ "message": "Lock with master password on browser restart"
+ },
+ "selectOneCollection": {
+ "message": "You must select at least one collection."
+ },
+ "cloneItem": {
+ "message": "Clone item"
+ },
+ "clone": {
+ "message": "Clone"
+ },
+ "passwordGeneratorPolicyInEffect": {
+ "message": "One or more organisation policies are affecting your generator settings."
+ },
+ "vaultTimeoutAction": {
+ "message": "Vault timeout action"
+ },
+ "lock": {
+ "message": "Lock",
+ "description": "Verb form: to make secure or inaccesible by"
+ },
+ "trash": {
+ "message": "Bin",
+ "description": "Noun: a special folder to hold deleted items"
+ },
+ "searchTrash": {
+ "message": "Search bin"
+ },
+ "permanentlyDeleteItem": {
+ "message": "Permanently delete item"
+ },
+ "permanentlyDeleteItemConfirmation": {
+ "message": "Are you sure you want to permanently delete this item?"
+ },
+ "permanentlyDeletedItem": {
+ "message": "Permanently deleted item"
+ },
+ "restoreItem": {
+ "message": "Restore item"
+ },
+ "restoreItemConfirmation": {
+ "message": "Are you sure you want to restore this item?"
+ },
+ "restoredItem": {
+ "message": "Restored item"
+ },
+ "vaultTimeoutLogOutConfirmation": {
+ "message": "Logging out will remove all access to your vault and requires online authentication after the timeout period. Are you sure you want to use this setting?"
+ },
+ "vaultTimeoutLogOutConfirmationTitle": {
+ "message": "Timeout action confirmation"
+ },
+ "autoFillAndSave": {
+ "message": "Auto-fill and save"
+ },
+ "autoFillSuccessAndSavedUri": {
+ "message": "Auto-filled item and saved URI"
+ },
+ "autoFillSuccess": {
+ "message": "Auto-filled item"
+ },
+ "setMasterPassword": {
+ "message": "Set master password"
+ },
+ "masterPasswordPolicyInEffect": {
+ "message": "One or more organisation policies require your master password to meet the following requirements:"
+ },
+ "policyInEffectMinComplexity": {
+ "message": "Minimum complexity score of $SCORE$",
+ "placeholders": {
+ "score": {
+ "content": "$1",
+ "example": "4"
+ }
+ }
+ },
+ "policyInEffectMinLength": {
+ "message": "Minimum length of $LENGTH$",
+ "placeholders": {
+ "length": {
+ "content": "$1",
+ "example": "14"
+ }
+ }
+ },
+ "policyInEffectUppercase": {
+ "message": "Contain one or more uppercase characters"
+ },
+ "policyInEffectLowercase": {
+ "message": "Contain one or more lowercase characters"
+ },
+ "policyInEffectNumbers": {
+ "message": "Contain one or more numbers"
+ },
+ "policyInEffectSpecial": {
+ "message": "Contain one or more of the following special characters $CHARS$",
+ "placeholders": {
+ "chars": {
+ "content": "$1",
+ "example": "!@#$%^&*"
+ }
+ }
+ },
+ "masterPasswordPolicyRequirementsNotMet": {
+ "message": "Your new master password does not meet the policy requirements."
+ },
+ "acceptPolicies": {
+ "message": "By checking this box you agree to the following:"
+ },
+ "acceptPoliciesError": {
+ "message": "Terms of service and privacy policy have not been acknowledged."
+ },
+ "termsOfService": {
+ "message": "Terms of service"
+ },
+ "privacyPolicy": {
+ "message": "Privacy policy"
+ },
+ "hintEqualsPassword": {
+ "message": "Your password hint cannot be the same as your password."
+ },
+ "ok": {
+ "message": "OK"
+ },
+ "desktopSyncVerificationTitle": {
+ "message": "Desktop sync verification"
+ },
+ "desktopIntegrationVerificationText": {
+ "message": "Please verify that the desktop application shows this fingerprint: "
+ },
+ "desktopIntegrationDisabledTitle": {
+ "message": "Browser integration is not enabled"
+ },
+ "desktopIntegrationDisabledDesc": {
+ "message": "Browser integration is not enabled in the Bitwarden Desktop application. Please enable it in the settings within the desktop application."
+ },
+ "startDesktopTitle": {
+ "message": "Start the Bitwarden Desktop application"
+ },
+ "startDesktopDesc": {
+ "message": "The Bitwarden Desktop application needs to be started before this function can be used."
+ },
+ "errorEnableBiometricTitle": {
+ "message": "Unable to enable biometrics"
+ },
+ "errorEnableBiometricDesc": {
+ "message": "Action was cancelled by the desktop application"
+ },
+ "nativeMessagingInvalidEncryptionDesc": {
+ "message": "Desktop application invalidated the secure communication channel. Please retry this operation"
+ },
+ "nativeMessagingInvalidEncryptionTitle": {
+ "message": "Desktop communication interrupted"
+ },
+ "nativeMessagingWrongUserDesc": {
+ "message": "The desktop application is logged into a different account. Please ensure both applications are logged into the same account."
+ },
+ "nativeMessagingWrongUserTitle": {
+ "message": "Account mismatch"
+ },
+ "biometricsNotEnabledTitle": {
+ "message": "Biometrics not enabled"
+ },
+ "biometricsNotEnabledDesc": {
+ "message": "Browser biometrics requires desktop biometric to be enabled in the settings first."
+ },
+ "biometricsNotSupportedTitle": {
+ "message": "Biometrics not supported"
+ },
+ "biometricsNotSupportedDesc": {
+ "message": "Browser biometrics is not supported on this device."
+ },
+ "nativeMessaginPermissionErrorTitle": {
+ "message": "Permission not provided"
+ },
+ "nativeMessaginPermissionErrorDesc": {
+ "message": "Without permission to communicate with the Bitwarden Desktop Application we cannot provide biometrics in the browser extension. Please try again."
+ },
+ "nativeMessaginPermissionSidebarTitle": {
+ "message": "Permission request error"
+ },
+ "nativeMessaginPermissionSidebarDesc": {
+ "message": "This action cannot be done in the sidebar, please retry the action in the popup or popout."
+ },
+ "personalOwnershipSubmitError": {
+ "message": "Due to an Enterprise Policy, you are restricted from saving items to your personal vault. Change the Ownership option to an organisation and choose from available Collections."
+ },
+ "personalOwnershipPolicyInEffect": {
+ "message": "An organisation policy is affecting your ownership options."
+ },
+ "excludedDomains": {
+ "message": "Excluded Domains"
+ },
+ "excludedDomainsDesc": {
+ "message": "Bitwarden will not ask to save login details for these domains. You must refresh the page for changes to take effect."
+ },
+ "excludedDomainsInvalidDomain": {
+ "message": "$DOMAIN$ is not a valid domain",
+ "placeholders": {
+ "domain": {
+ "content": "$1",
+ "example": "googlecom"
+ }
+ }
+ },
+ "send": {
+ "message": "Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "searchSends": {
+ "message": "Search Sends",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "addSend": {
+ "message": "Add Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTypeText": {
+ "message": "Text"
+ },
+ "sendTypeFile": {
+ "message": "File"
+ },
+ "allSends": {
+ "message": "All Sends",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "maxAccessCountReached": {
+ "message": "Max access count reached"
+ },
+ "expired": {
+ "message": "Expired"
+ },
+ "pendingDeletion": {
+ "message": "Pending deletion"
+ },
+ "passwordProtected": {
+ "message": "Password protected"
+ },
+ "copySendLink": {
+ "message": "Copy Send link",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "removePassword": {
+ "message": "Remove Password"
+ },
+ "delete": {
+ "message": "Delete"
+ },
+ "removedPassword": {
+ "message": "Removed Password"
+ },
+ "deletedSend": {
+ "message": "Deleted Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendLink": {
+ "message": "Send link",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "disabled": {
+ "message": "Disabled"
+ },
+ "removePasswordConfirmation": {
+ "message": "Are you sure you want to remove the password?"
+ },
+ "deleteSend": {
+ "message": "Delete Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "deleteSendConfirmation": {
+ "message": "Are you sure you want to delete this Send?",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "editSend": {
+ "message": "Edit Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTypeHeader": {
+ "message": "What type of Send is this?",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendNameDesc": {
+ "message": "A friendly name to describe this Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendFileDesc": {
+ "message": "The file you want to send."
+ },
+ "deletionDate": {
+ "message": "Deletion Date"
+ },
+ "deletionDateDesc": {
+ "message": "The Send will be permanently deleted on the specified date and time.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "expirationDate": {
+ "message": "Expiration Date"
+ },
+ "expirationDateDesc": {
+ "message": "If set, access to this Send will expire on the specified date and time.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "oneDay": {
+ "message": "1 day"
+ },
+ "days": {
+ "message": "$DAYS$ days",
+ "placeholders": {
+ "days": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "custom": {
+ "message": "Custom"
+ },
+ "maximumAccessCount": {
+ "message": "Maximum Access Count"
+ },
+ "maximumAccessCountDesc": {
+ "message": "If set, users will no longer be able to access this Send once the maximum access count is reached.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendPasswordDesc": {
+ "message": "Optionally require a password for users to access this Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendNotesDesc": {
+ "message": "Private notes about this Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendDisableDesc": {
+ "message": "Disable this Send so that no one can access it.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendShareDesc": {
+ "message": "Copy this Send's link to clipboard upon save.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTextDesc": {
+ "message": "The text you want to send."
+ },
+ "sendHideText": {
+ "message": "Hide this Send's text by default.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "currentAccessCount": {
+ "message": "Current Access Count"
+ },
+ "createSend": {
+ "message": "Create New Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "newPassword": {
+ "message": "New Password"
+ },
+ "sendDisabled": {
+ "message": "Send Disabled",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendDisabledWarning": {
+ "message": "Due to an enterprise policy, you are only able to delete an existing Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "createdSend": {
+ "message": "Created Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "editedSend": {
+ "message": "Edited Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendLinuxChromiumFileWarning": {
+ "message": "In order to choose a file, open the extension in the sidebar (if possible) or pop out to a new window by clicking this banner."
+ },
+ "sendFirefoxFileWarning": {
+ "message": "In order to choose a file using Firefox, open the extension in the sidebar or pop out to a new window by clicking this banner."
+ },
+ "sendSafariFileWarning": {
+ "message": "In order to choose a file using Safari, pop out to a new window by clicking this banner."
+ },
+ "sendFileCalloutHeader": {
+ "message": "Before you start"
+ },
+ "sendFirefoxCustomDatePopoutMessage1": {
+ "message": "To use a calendar style date picker",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read '**To use a calendar style date picker ** click here to pop out your window.'"
+ },
+ "sendFirefoxCustomDatePopoutMessage2": {
+ "message": "click here",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker **click here** to pop out your window.'"
+ },
+ "sendFirefoxCustomDatePopoutMessage3": {
+ "message": "to pop out your window.",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker click here **to pop out your window.**'"
+ },
+ "expirationDateIsInvalid": {
+ "message": "The expiration date provided is not valid."
+ },
+ "deletionDateIsInvalid": {
+ "message": "The deletion date provided is not valid."
+ },
+ "expirationDateAndTimeRequired": {
+ "message": "An expiration date and time are required."
+ },
+ "deletionDateAndTimeRequired": {
+ "message": "A deletion date and time are required."
+ },
+ "dateParsingError": {
+ "message": "There was an error saving your deletion and expiration dates."
+ },
+ "hideEmail": {
+ "message": "Hide my email address from recipients."
+ },
+ "sendOptionsPolicyInEffect": {
+ "message": "One or more organisation policies are affecting your Send options."
+ },
+ "passwordPrompt": {
+ "message": "Master password re-prompt"
+ },
+ "passwordConfirmation": {
+ "message": "Master password confirmation"
+ },
+ "passwordConfirmationDesc": {
+ "message": "This action is protected. To continue, please re-enter your master password to verify your identity."
+ },
+ "emailVerificationRequired": {
+ "message": "Email Verification Required"
+ },
+ "emailVerificationRequiredDesc": {
+ "message": "You must verify your email to use this feature. You can verify your email in the web vault."
+ },
+ "updatedMasterPassword": {
+ "message": "Updated Master Password"
+ },
+ "updateMasterPassword": {
+ "message": "Update Master Password"
+ },
+ "updateMasterPasswordWarning": {
+ "message": "Your Master Password was recently changed by an administrator in your organisation. In order to access the vault, you must update it now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour."
+ },
+ "resetPasswordPolicyAutoEnroll": {
+ "message": "Automatic Enrolment"
+ },
+ "resetPasswordAutoEnrollInviteWarning": {
+ "message": "This organisation has an enterprise policy that will automatically enrol you in password reset. Enrolment will allow organisation administrators to change your master password."
+ },
+ "selectFolder": {
+ "message": "Select folder..."
+ },
+ "ssoCompleteRegistration": {
+ "message": "In order to complete logging in with SSO, please set a master password to access and protect your vault."
+ },
+ "hours": {
+ "message": "Hours"
+ },
+ "minutes": {
+ "message": "Minutes"
+ },
+ "vaultTimeoutPolicyInEffect": {
+ "message": "Your organisation policies are affecting your vault timeout. Maximum allowed Vault Timeout is $HOURS$ hour(s) and $MINUTES$ minute(s)",
+ "placeholders": {
+ "hours": {
+ "content": "$1",
+ "example": "5"
+ },
+ "minutes": {
+ "content": "$2",
+ "example": "5"
+ }
+ }
+ },
+ "vaultTimeoutToLarge": {
+ "message": "Your vault timeout exceeds the restrictions set by your organisation."
+ },
+ "vaultExportDisabled": {
+ "message": "Vault Export Disabled"
+ },
+ "personalVaultExportPolicyInEffect": {
+ "message": "One or more organisation policies prevents you from exporting your personal vault."
+ },
+ "copyCustomFieldNameInvalidElement": {
+ "message": "Unable to identify a valid form element. Try inspecting the HTML instead."
+ },
+ "copyCustomFieldNameNotUnique": {
+ "message": "No unique identifier found."
+ }
+}
diff --git a/src/iOS.Safari/Resources/_locales/es/messages.json b/src/iOS.Safari/Resources/_locales/es/messages.json
new file mode 100644
index 000000000..8bbb94435
--- /dev/null
+++ b/src/iOS.Safari/Resources/_locales/es/messages.json
@@ -0,0 +1,1817 @@
+{
+ "appName": {
+ "message": "Bitwarden"
+ },
+ "extName": {
+ "message": "Bitwarden",
+ "description": "Extension name, MUST be less than 40 characters (Safari restriction)"
+ },
+ "extDesc": {
+ "message": "Bitwarden es un gestor de contraseñas seguro y gratuito para todos tus dispositivos.",
+ "description": "Extension description"
+ },
+ "loginOrCreateNewAccount": {
+ "message": "Identifícate o crea una nueva cuenta para acceder a tu caja fuerte."
+ },
+ "createAccount": {
+ "message": "Crear cuenta"
+ },
+ "login": {
+ "message": "Identificarse"
+ },
+ "enterpriseSingleSignOn": {
+ "message": "Inicio de sesión único empresarial"
+ },
+ "cancel": {
+ "message": "Cancelar"
+ },
+ "close": {
+ "message": "Cerrar"
+ },
+ "submit": {
+ "message": "Enviar"
+ },
+ "emailAddress": {
+ "message": "Correo electrónico"
+ },
+ "masterPass": {
+ "message": "Contraseña maestra"
+ },
+ "masterPassDesc": {
+ "message": "La contraseña maestra es la clave que utilizas para acceder a tu caja fuerte. Es muy importante que no olvides tu contraseña maestra. No hay forma de recuperarla si la olvidas."
+ },
+ "masterPassHintDesc": {
+ "message": "Una pista de tu contraseña maestra puede ayudarte a recordarla en caso de que la olvides."
+ },
+ "reTypeMasterPass": {
+ "message": "Vuelve a escribir tu contraseña maestra"
+ },
+ "masterPassHint": {
+ "message": "Pista de contraseña maestra (opcional)"
+ },
+ "tab": {
+ "message": "Pestaña"
+ },
+ "myVault": {
+ "message": "Mi caja fuerte"
+ },
+ "tools": {
+ "message": "Herramientas"
+ },
+ "settings": {
+ "message": "Ajustes"
+ },
+ "currentTab": {
+ "message": "Pestaña actual"
+ },
+ "copyPassword": {
+ "message": "Copiar contraseña"
+ },
+ "copyNote": {
+ "message": "Copiar nota"
+ },
+ "copyUri": {
+ "message": "Copiar URI"
+ },
+ "copyUsername": {
+ "message": "Copiar usuario"
+ },
+ "copyNumber": {
+ "message": "Copiar número"
+ },
+ "copySecurityCode": {
+ "message": "Copiar código de seguridad"
+ },
+ "autoFill": {
+ "message": "Autorellenar"
+ },
+ "generatePasswordCopied": {
+ "message": "Generar contraseña (copiada)"
+ },
+ "copyElementIdentifier": {
+ "message": "Copiar Nombre del campo personalizado"
+ },
+ "noMatchingLogins": {
+ "message": "Sin entradas coincidentes."
+ },
+ "vaultLocked": {
+ "message": "La caja fuerte está bloqueada."
+ },
+ "vaultLoggedOut": {
+ "message": "La caja fuerte está desconectada."
+ },
+ "autoFillInfo": {
+ "message": "No hay entradas disponibles para autorellenar en la pestaña actual del navegador."
+ },
+ "addLogin": {
+ "message": "Añadir entrada"
+ },
+ "addItem": {
+ "message": "Añadir elemento"
+ },
+ "passwordHint": {
+ "message": "Pista de contraseña"
+ },
+ "enterEmailToGetHint": {
+ "message": "Introduce el correo electrónico de tu cuenta para recibir la pista de tu contraseña maestra."
+ },
+ "getMasterPasswordHint": {
+ "message": "Obtener pista de la contraseña maestra"
+ },
+ "continue": {
+ "message": "Continuar"
+ },
+ "verificationCode": {
+ "message": "Código de verificación"
+ },
+ "account": {
+ "message": "Cuenta"
+ },
+ "changeMasterPassword": {
+ "message": "Cambiar contraseña maestra"
+ },
+ "fingerprintPhrase": {
+ "message": "Frase de huella digital",
+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
+ },
+ "yourAccountsFingerprint": {
+ "message": "Frase de la huella digital de su cuenta",
+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
+ },
+ "twoStepLogin": {
+ "message": "Autenticación en dos pasos"
+ },
+ "logOut": {
+ "message": "Cerrar sesión"
+ },
+ "about": {
+ "message": "Acerca de"
+ },
+ "version": {
+ "message": "Versión"
+ },
+ "save": {
+ "message": "Guardar"
+ },
+ "move": {
+ "message": "Mover"
+ },
+ "addFolder": {
+ "message": "Añadir carpeta"
+ },
+ "name": {
+ "message": "Nombre"
+ },
+ "editFolder": {
+ "message": "Editar carpeta"
+ },
+ "deleteFolder": {
+ "message": "Eliminar carpeta"
+ },
+ "folders": {
+ "message": "Carpetas"
+ },
+ "noFolders": {
+ "message": "No hay carpetas que listar."
+ },
+ "helpFeedback": {
+ "message": "Ayuda y comentarios"
+ },
+ "sync": {
+ "message": "Sincronizar"
+ },
+ "syncVaultNow": {
+ "message": "Sincronizar caja fuerte ahora"
+ },
+ "lastSync": {
+ "message": "Última sincronización:"
+ },
+ "passGen": {
+ "message": "Generador de contraseñas"
+ },
+ "generator": {
+ "message": "Generador",
+ "description": "Short for 'Password Generator'."
+ },
+ "passGenInfo": {
+ "message": "Genera automáticamente contraseñas fuertes y únicas para tus accesos."
+ },
+ "bitWebVault": {
+ "message": "Caja fuerte web de Bitwarden"
+ },
+ "importItems": {
+ "message": "Importar elementos"
+ },
+ "select": {
+ "message": "Seleccionar"
+ },
+ "generatePassword": {
+ "message": "Generar contraseña"
+ },
+ "regeneratePassword": {
+ "message": "Regenerar contraseña"
+ },
+ "options": {
+ "message": "Opciones"
+ },
+ "length": {
+ "message": "Longitud"
+ },
+ "numWords": {
+ "message": "Número de palabras"
+ },
+ "wordSeparator": {
+ "message": "Separador de palabras"
+ },
+ "capitalize": {
+ "message": "Mayúsculas iniciales",
+ "description": "Make the first letter of a work uppercase."
+ },
+ "includeNumber": {
+ "message": "Incluir número"
+ },
+ "minNumbers": {
+ "message": "Mínimo de números"
+ },
+ "minSpecial": {
+ "message": "Mínimo de caracteres especiales"
+ },
+ "avoidAmbChar": {
+ "message": "Evitar caracteres ambiguos"
+ },
+ "searchVault": {
+ "message": "Buscar en caja fuerte"
+ },
+ "edit": {
+ "message": "Editar"
+ },
+ "view": {
+ "message": "Ver"
+ },
+ "noItemsInList": {
+ "message": "No hay elementos que listar."
+ },
+ "itemInformation": {
+ "message": "Información del elemento"
+ },
+ "username": {
+ "message": "Usuario"
+ },
+ "password": {
+ "message": "Contraseña"
+ },
+ "passphrase": {
+ "message": "Frase de contraseña"
+ },
+ "favorite": {
+ "message": "Favorito"
+ },
+ "notes": {
+ "message": "Notas"
+ },
+ "note": {
+ "message": "Nota"
+ },
+ "editItem": {
+ "message": "Editar elemento"
+ },
+ "folder": {
+ "message": "Carpeta"
+ },
+ "deleteItem": {
+ "message": "Eliminar elemento"
+ },
+ "viewItem": {
+ "message": "Ver elemento"
+ },
+ "launch": {
+ "message": "Iniciar"
+ },
+ "website": {
+ "message": "Web"
+ },
+ "toggleVisibility": {
+ "message": "Alternar visibilidad"
+ },
+ "manage": {
+ "message": "Gestionar"
+ },
+ "other": {
+ "message": "Otros"
+ },
+ "rateExtension": {
+ "message": "Valora la extensión"
+ },
+ "rateExtensionDesc": {
+ "message": "¡Por favor, considera ayudarnos con una buena reseña!"
+ },
+ "browserNotSupportClipboard": {
+ "message": "Tu navegador web no soporta copiar al portapapeles facilmente. Cópialo manualmente."
+ },
+ "verifyMasterPassword": {
+ "message": "Verificar contraseña maestra"
+ },
+ "yourVaultIsLocked": {
+ "message": "Su caja fuerte está bloqueada. Verifique su contraseña maestra para continuar."
+ },
+ "unlock": {
+ "message": "Desbloquear"
+ },
+ "loggedInAsOn": {
+ "message": "Conectado como $EMAIL$ en $HOSTNAME$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "name@example.com"
+ },
+ "hostname": {
+ "content": "$2",
+ "example": "bitwarden.com"
+ }
+ }
+ },
+ "invalidMasterPassword": {
+ "message": "Contraseña maestra no válida"
+ },
+ "vaultTimeout": {
+ "message": "Tiempo de espera de la caja fuerte"
+ },
+ "lockNow": {
+ "message": "Bloquear"
+ },
+ "immediately": {
+ "message": "Inmediatamente"
+ },
+ "tenSeconds": {
+ "message": "10 segundos"
+ },
+ "twentySeconds": {
+ "message": "20 segundos"
+ },
+ "thirtySeconds": {
+ "message": "30 segundos"
+ },
+ "oneMinute": {
+ "message": "1 minuto"
+ },
+ "twoMinutes": {
+ "message": "2 minutos"
+ },
+ "fiveMinutes": {
+ "message": "5 minutos"
+ },
+ "fifteenMinutes": {
+ "message": "15 minutos"
+ },
+ "thirtyMinutes": {
+ "message": "30 minutos"
+ },
+ "oneHour": {
+ "message": "1 hora"
+ },
+ "fourHours": {
+ "message": "4 horas"
+ },
+ "onLocked": {
+ "message": "Al bloquear el sistema"
+ },
+ "onRestart": {
+ "message": "Al reiniciar el navegador"
+ },
+ "never": {
+ "message": "Nunca"
+ },
+ "security": {
+ "message": "Seguridad"
+ },
+ "errorOccurred": {
+ "message": "Ha ocurrido un error"
+ },
+ "emailRequired": {
+ "message": "Correo electrónico requerido."
+ },
+ "invalidEmail": {
+ "message": "Correo electrónico no válido."
+ },
+ "masterPassRequired": {
+ "message": "Contraseña maestra requerida."
+ },
+ "masterPassLength": {
+ "message": "La contraseña maestra debe tener al menos 8 caracteres."
+ },
+ "masterPassDoesntMatch": {
+ "message": "La confirmación de contraseña maestra no coincide."
+ },
+ "newAccountCreated": {
+ "message": "¡Tu nueva cuenta ha sido creada! Ahora puedes acceder."
+ },
+ "masterPassSent": {
+ "message": "Te hemos enviado un correo electrónico con la pista de tu contraseña maestra."
+ },
+ "verificationCodeRequired": {
+ "message": "Código de verificación requerido."
+ },
+ "valueCopied": {
+ "message": "Valor de $VALUE$ copiado",
+ "description": "Value has been copied to the clipboard.",
+ "placeholders": {
+ "value": {
+ "content": "$1",
+ "example": "Password"
+ }
+ }
+ },
+ "autofillError": {
+ "message": "No se ha podido autorellenar la entrada seleccionada en esta página. Copia/pega tu usuario y/o contraseña."
+ },
+ "loggedOut": {
+ "message": "Sesión terminada"
+ },
+ "loginExpired": {
+ "message": "Tu sesión ha expirado."
+ },
+ "logOutConfirmation": {
+ "message": "¿Estás seguro de querer cerrar la sesión?"
+ },
+ "yes": {
+ "message": "Sí"
+ },
+ "no": {
+ "message": "No"
+ },
+ "unexpectedError": {
+ "message": "Ha ocurrido un error inesperado."
+ },
+ "nameRequired": {
+ "message": "Nombre requerido."
+ },
+ "addedFolder": {
+ "message": "Carpeta añadida"
+ },
+ "changeMasterPass": {
+ "message": "Cambiar contraseña maestra"
+ },
+ "changeMasterPasswordConfirmation": {
+ "message": "Puedes cambiar tu contraseña maestra en la caja fuerte web de bitwarden.com. ¿Quieres visitar ahora el sitio web?"
+ },
+ "twoStepLoginConfirmation": {
+ "message": "La autenticación en dos pasos hace que tu cuenta sea mucho más segura, requiriendo que introduzcas un código de seguridad de una aplicación de autenticación cada vez que accedes. La autenticación en dos pasos puede ser habilitada en la caja fuerte web de bitwarden.com. ¿Quieres visitar ahora el sitio web?"
+ },
+ "editedFolder": {
+ "message": "Carpeta editada"
+ },
+ "deleteFolderConfirmation": {
+ "message": "¿Estás seguro de querer eliminar esta carpeta?"
+ },
+ "deletedFolder": {
+ "message": "Carpeta eliminada"
+ },
+ "gettingStartedTutorial": {
+ "message": "Tutorial de primeros pasos"
+ },
+ "gettingStartedTutorialVideo": {
+ "message": "Revisa nuestro tutorial de primeros pasos para aprender a sacar lo máximo de la extensión del navegador."
+ },
+ "syncingComplete": {
+ "message": "Sincronización completada"
+ },
+ "syncingFailed": {
+ "message": "Sincronización fallida"
+ },
+ "passwordCopied": {
+ "message": "Contraseña copiada"
+ },
+ "uri": {
+ "message": "URI"
+ },
+ "uriPosition": {
+ "message": "URI $POSITION$",
+ "description": "A listing of URIs. Ex: URI 1, URI 2, URI 3, etc.",
+ "placeholders": {
+ "position": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "newUri": {
+ "message": "Nueva URI"
+ },
+ "addedItem": {
+ "message": "Elemento añadido"
+ },
+ "editedItem": {
+ "message": "Elemento editado"
+ },
+ "deleteItemConfirmation": {
+ "message": "¿Seguro que quieres enviarlo a la papelera?"
+ },
+ "deletedItem": {
+ "message": "Elemento enviado a la papelera"
+ },
+ "overwritePassword": {
+ "message": "Sobreescribir contraseña"
+ },
+ "overwritePasswordConfirmation": {
+ "message": "¿Estás seguro de que quieres sobreescribir la contraseña actual?"
+ },
+ "searchFolder": {
+ "message": "Buscar carpeta"
+ },
+ "searchCollection": {
+ "message": "Buscar colección"
+ },
+ "searchType": {
+ "message": "Buscar tipo"
+ },
+ "noneFolder": {
+ "message": "Sin carpeta",
+ "description": "This is the folder for uncategorized items"
+ },
+ "disableAddLoginNotification": {
+ "message": "Deshabilitar notificación para añadir entradas"
+ },
+ "addLoginNotificationDesc": {
+ "message": "La opción \"Notificación para añadir entradas\" pregunta automáticamente si quieres guardar nuevas entradas en tu caja fuerte cuando te identificas en un sitio web por primera vez."
+ },
+ "dontShowCardsCurrentTab": {
+ "message": "No mostrar tarjetas en la pestaña"
+ },
+ "dontShowCardsCurrentTabDesc": {
+ "message": "Elementos de la tarjeta de su caja fuerte están listados en la página 'Ficha Actual' para el acceso fácil del autorellenado."
+ },
+ "dontShowIdentitiesCurrentTab": {
+ "message": "No mostrar las identidades en la página de ficha"
+ },
+ "dontShowIdentitiesCurrentTabDesc": {
+ "message": "Elementos de identidad de su caja fuerte están listados en la página 'Ficha Actual' para el acceso fácil del autorellenado."
+ },
+ "clearClipboard": {
+ "message": "Vaciar portapapeles",
+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
+ },
+ "clearClipboardDesc": {
+ "message": "Borrar automáticamente los valores copiados de su portapapeles.",
+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
+ },
+ "notificationAddDesc": {
+ "message": "¿Debería Bitwarden recordar esta contraseña por ti?"
+ },
+ "notificationAddSave": {
+ "message": "Sí, guardar ahora"
+ },
+ "notificationNeverSave": {
+ "message": "Nunca para este sitio"
+ },
+ "disableChangedPasswordNotification": {
+ "message": "Deshabilitar la notificación de cambio de contraseña"
+ },
+ "disableChangedPasswordNotificationDesc": {
+ "message": "La notificación \"Contraseña cambiada\" automáticamente te pedirá que actualices la contraseña de inicio de sesión en tu caja fuerte cuando detecte que se ha cambiado en la web."
+ },
+ "notificationChangeDesc": {
+ "message": "¿Desea actualizar esta contraseña en Bitwarden?"
+ },
+ "notificationChangeSave": {
+ "message": "Sí, actualizar ahora"
+ },
+ "disableContextMenuItem": {
+ "message": "Deshabilitar opciones del menú contextual"
+ },
+ "disableContextMenuItemDesc": {
+ "message": "Las opciones del menú contextual permiten un acceso rápido al generador de contraseñas y a las entradas para el sitio abierto en tu pestaña actual."
+ },
+ "defaultUriMatchDetection": {
+ "message": "Detección por defecto de coincidencia de URI",
+ "description": "Default URI match detection for auto-fill."
+ },
+ "defaultUriMatchDetectionDesc": {
+ "message": "Elija el método de detección por defecto de coincidencia de URI que se utilizará para acciones de inicio de sesión como autorrellenado."
+ },
+ "theme": {
+ "message": "Tema"
+ },
+ "themeDesc": {
+ "message": "Cambiar el tema de la aplicación."
+ },
+ "dark": {
+ "message": "Oscuro",
+ "description": "Dark color"
+ },
+ "light": {
+ "message": "Claro",
+ "description": "Light color"
+ },
+ "solarizedDark": {
+ "message": "Solarized Dark",
+ "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated."
+ },
+ "exportVault": {
+ "message": "Exportar caja fuerte"
+ },
+ "fileFormat": {
+ "message": "Formato de archivo"
+ },
+ "warning": {
+ "message": "ADVERTENCIA",
+ "description": "WARNING (should stay in capitalized letters if the language permits)"
+ },
+ "confirmVaultExport": {
+ "message": "Confirma la exportación de la caja fuerte"
+ },
+ "exportWarningDesc": {
+ "message": "Esta exportación contiene los datos de tu caja fuerte en un formato no cifrado. No deberías almacenar o enviar el archivo exportado por canales no seguros (como el correo electrónico). Elimínalo inmediatamente cuando termines de utilizarlo."
+ },
+ "encExportKeyWarningDesc": {
+ "message": "Esta exportación encripta tus datos utilizando la clave de encriptación de tu cuenta. Si alguna vez cambias la clave de encriptación de tu cuenta, deberás exportar de nuevo, ya que no podrás descifrar este archivo exportado."
+ },
+ "encExportAccountWarningDesc": {
+ "message": "Las claves de encriptación de las cuentas son únicas para cada cuenta de usuario de Bitwarden, por lo que no se puede importar un archivo exportado y encriptado a una cuenta diferente."
+ },
+ "exportMasterPassword": {
+ "message": "Introduce tu contraseña maestra para exportar la información de tu caja fuerte."
+ },
+ "shared": {
+ "message": "Compartido"
+ },
+ "learnOrg": {
+ "message": "Aprende sobre Organizaciones"
+ },
+ "learnOrgConfirmation": {
+ "message": "Bitwarden te permite compartir objetos de tu caja fuerte con otros usando una organización. ¿Quieres visitar el sitio web de bitwarden.com para saber más?"
+ },
+ "moveToOrganization": {
+ "message": "Mover a la Organización"
+ },
+ "share": {
+ "message": "Compartir"
+ },
+ "movedItemToOrg": {
+ "message": "$ITEMNAME$ se desplazó a $ORGNAME$",
+ "placeholders": {
+ "itemname": {
+ "content": "$1",
+ "example": "Secret Item"
+ },
+ "orgname": {
+ "content": "$2",
+ "example": "Company Name"
+ }
+ }
+ },
+ "moveToOrgDesc": {
+ "message": "Elige una organización a la que deseas mover este objeto. Moviendo a una organización transfiere la propiedad del objeto a esa organización. Ya no serás el dueño directo de este objeto una vez que haya sido movido."
+ },
+ "learnMore": {
+ "message": "Más información"
+ },
+ "authenticatorKeyTotp": {
+ "message": "Clave de autenticación (TOTP)"
+ },
+ "verificationCodeTotp": {
+ "message": "Código de verificación (TOTP)"
+ },
+ "copyVerificationCode": {
+ "message": "Copiar código de verificación"
+ },
+ "attachments": {
+ "message": "Adjuntos"
+ },
+ "deleteAttachment": {
+ "message": "Eliminar adjunto"
+ },
+ "deleteAttachmentConfirmation": {
+ "message": "¿Estás seguro de querer eliminar este adjunto?"
+ },
+ "deletedAttachment": {
+ "message": "Adjunto eliminado"
+ },
+ "newAttachment": {
+ "message": "Añadir nuevo adjunto"
+ },
+ "noAttachments": {
+ "message": "Sin adjuntos."
+ },
+ "attachmentSaved": {
+ "message": "El adjunto se ha guardado."
+ },
+ "file": {
+ "message": "Archivo"
+ },
+ "selectFile": {
+ "message": "Selecciona un archivo."
+ },
+ "maxFileSize": {
+ "message": "El tamaño máximo de archivo es de 500MB."
+ },
+ "featureUnavailable": {
+ "message": "Característica no disponible"
+ },
+ "updateKey": {
+ "message": "No puedes usar esta característica hasta que actualices tu clave de cifrado."
+ },
+ "premiumMembership": {
+ "message": "Membresía Premium"
+ },
+ "premiumManage": {
+ "message": "Gestionar membresía"
+ },
+ "premiumManageAlert": {
+ "message": "Puedes gestionar tu membresía en la caja fuerte web de bitwarden.com. ¿Quieres visitar el sitio web ahora?"
+ },
+ "premiumRefresh": {
+ "message": "Actualizar membresía"
+ },
+ "premiumNotCurrentMember": {
+ "message": "Actualmente no eres un miembro premium."
+ },
+ "premiumSignUpAndGet": {
+ "message": "Registrate como miembro Premium y obtén:"
+ },
+ "ppremiumSignUpStorage": {
+ "message": "1GB de espacio cifrado en disco para adjuntos."
+ },
+ "ppremiumSignUpTwoStep": {
+ "message": "Métodos de autenticación en dos pasos adicionales como YubiKey, FIDO U2F y Duo."
+ },
+ "ppremiumSignUpReports": {
+ "message": "Higiene de contraseña, salud de la cuenta e informes de violaciones de datos para mantener su caja fuerte segura."
+ },
+ "ppremiumSignUpTotp": {
+ "message": "Generación de códigos TOTP (2FA) para registros de tu caja fuerte."
+ },
+ "ppremiumSignUpSupport": {
+ "message": "Soporte prioritario."
+ },
+ "ppremiumSignUpFuture": {
+ "message": "Acceso a nuevas características premium en el futuro. ¡Hay más en camino!"
+ },
+ "premiumPurchase": {
+ "message": "Comprar Premium"
+ },
+ "premiumPurchaseAlert": {
+ "message": "Puedes comprar la membresía Premium en la caja fuerte web de bitwarden.com. ¿Quieres visitar el sitio web ahora?"
+ },
+ "premiumCurrentMember": {
+ "message": "¡Eres un miembro Premium!"
+ },
+ "premiumCurrentMemberThanks": {
+ "message": "Gracias por apoyar el desarrollo de Bitwarden."
+ },
+ "premiumPrice": {
+ "message": "¡Todo por solo %price% /año!",
+ "placeholders": {
+ "price": {
+ "content": "$1",
+ "example": "$10"
+ }
+ }
+ },
+ "refreshComplete": {
+ "message": "Actualización completada"
+ },
+ "disableAutoTotpCopy": {
+ "message": "Deshabilitar copiado automático de códigos TOTP"
+ },
+ "disableAutoTotpCopyDesc": {
+ "message": "Si tu entrada tiene una clave de autenticación adjunta, el código de verificación TOTP es copiado automáticamente al portapapeles cuando autorellenas una entrada."
+ },
+ "disableAutoBiometricsPrompt": {
+ "message": "No solicitar biométricos al iniciar"
+ },
+ "premiumRequired": {
+ "message": "Premium requerido"
+ },
+ "premiumRequiredDesc": {
+ "message": "Una membresía Premium es requerida para utilizar esta característica."
+ },
+ "enterVerificationCodeApp": {
+ "message": "Introduce el código de verificación de 6 dígitos de tu aplicación autenticadora."
+ },
+ "enterVerificationCodeEmail": {
+ "message": "Introduce el código de verificación de 6 dígitos que te ha sido enviado por correo electrónico",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "example@gmail.com"
+ }
+ }
+ },
+ "verificationCodeEmailSent": {
+ "message": "Correo electrónico de verificación enviado a $EMAIL$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "example@gmail.com"
+ }
+ }
+ },
+ "rememberMe": {
+ "message": "Recordarme"
+ },
+ "sendVerificationCodeEmailAgain": {
+ "message": "Reenviar código de verificación por correo electrónico"
+ },
+ "useAnotherTwoStepMethod": {
+ "message": "Utilizar otro método de autenticación en dos pasos"
+ },
+ "insertYubiKey": {
+ "message": "Inserta tu YubiKey en el puerto USB de tu equipo y posteriormente pulsa su botón."
+ },
+ "insertU2f": {
+ "message": "Inserta tu llave de seguridad en el puerto USB de tu equipo. Si tiene un botón, púlsalo."
+ },
+ "webAuthnNewTab": {
+ "message": "Para iniciar la verificación de WebAuthn 2FA. Haga clic en el botón de abajo para abrir una nueva pestaña y siga las instrucciones proporcionadas en la nueva pestaña."
+ },
+ "webAuthnNewTabOpen": {
+ "message": "Abrir nueva pestaña"
+ },
+ "webAuthnAuthenticate": {
+ "message": "Autenticar WebAuthn"
+ },
+ "loginUnavailable": {
+ "message": "Entrada no disponible"
+ },
+ "noTwoStepProviders": {
+ "message": "Esta cuenta tiene autenticación en dos pasos habilitado, pero ninguno de lo métodos configurados es soportado por este navegador web."
+ },
+ "noTwoStepProviders2": {
+ "message": "Por favor, utiliza un navegador soportado (como Chrome) y/o añade métodos de autenticación adicionales que tengan mejor soporte en diferentes navegadores web (como una aplicación de autenticación)."
+ },
+ "twoStepOptions": {
+ "message": "Opciones de la autenticación en dos pasos"
+ },
+ "recoveryCodeDesc": {
+ "message": "¿Has perdido el acceso a todos tus métodos de autenticación en dos pasos? Utiliza tu código de recuperación para deshabilitar todos los métodos de autenticación en dos pasos de tu cuenta."
+ },
+ "recoveryCodeTitle": {
+ "message": "Código de recuperación"
+ },
+ "authenticatorAppTitle": {
+ "message": "Aplicación de autenticación"
+ },
+ "authenticatorAppDesc": {
+ "message": "Utiliza una aplicación de autenticación (como Authy o Google Authenticator) para generar código de verificación basados en tiempo.",
+ "description": "'Authy' and 'Google Authenticator' are product names and should not be translated."
+ },
+ "yubiKeyTitle": {
+ "message": "Llave de seguridad YubiKey OTP"
+ },
+ "yubiKeyDesc": {
+ "message": "Usa un Yubikey para acceder a tu cuenta. Funciona con YubiKey 4, 4 Nano, 4C y dispositivos NEO."
+ },
+ "duoDesc": {
+ "message": "Verificar con Duo Security usando la aplicación Duo Mobile, SMS, llamada telefónica o llave de seguridad U2F.",
+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
+ },
+ "duoOrganizationDesc": {
+ "message": "Verificar con Duo Security para tu organización usando la aplicación Duo Mobile, SMS, llamada telefónica o llave de seguridad U2F.",
+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
+ },
+ "webAuthnTitle": {
+ "message": "FIDO2 WebAuthn"
+ },
+ "webAuthnDesc": {
+ "message": "Utilice cualquier clave de seguridad WebAuthn habilitada para acceder a su cuenta."
+ },
+ "emailTitle": {
+ "message": "Correo electrónico"
+ },
+ "emailDesc": {
+ "message": "Los códigos de verificación te serán enviados por correo electrónico."
+ },
+ "selfHostedEnvironment": {
+ "message": "Entorno de alojamiento propio"
+ },
+ "selfHostedEnvironmentFooter": {
+ "message": "Especifica la URL base de tu instalación de Bitwarden de alojamiento propio."
+ },
+ "customEnvironment": {
+ "message": "Entorno personalizado"
+ },
+ "customEnvironmentFooter": {
+ "message": "Para usuarios avanzados. Puedes especificar la URL base de cada servicio de forma independiente."
+ },
+ "baseUrl": {
+ "message": "URL del servidor"
+ },
+ "apiUrl": {
+ "message": "URL del servidor de la API"
+ },
+ "webVaultUrl": {
+ "message": "URL del servidor de la caja fuerte web"
+ },
+ "identityUrl": {
+ "message": "URL del servidor de identidad"
+ },
+ "notificationsUrl": {
+ "message": "URL del servidor de notificaciones"
+ },
+ "iconsUrl": {
+ "message": "URL del servidor de iconos"
+ },
+ "environmentSaved": {
+ "message": "Las URLs del entorno han sido guardadas."
+ },
+ "enableAutoFillOnPageLoad": {
+ "message": "Habilitar autorrellenar al cargar la página"
+ },
+ "enableAutoFillOnPageLoadDesc": {
+ "message": "Si se detecta un formulario, realizar automáticamente un autorellenado cuando la web cargue."
+ },
+ "experimentalFeature": {
+ "message": "Esta es una característica experimental. Úsala bajo tu propio riesgo."
+ },
+ "defaultAutoFillOnPageLoad": {
+ "message": "Configuración de autorrelleno por defecto para elementos de inicio de sesión"
+ },
+ "defaultAutoFillOnPageLoadDesc": {
+ "message": "Después de activar el autorelleno en Carga de página, puede activar o desactivar la función para entradas individuales. Esta es la configuración predeterminada para elementos de inicio de sesión que no están configurados por separado."
+ },
+ "itemAutoFillOnPageLoad": {
+ "message": "Auto-relleno en carga de página (si está habilitado en opciones)"
+ },
+ "autoFillOnPageLoadUseDefault": {
+ "message": "Usar configuración predeterminada"
+ },
+ "autoFillOnPageLoadYes": {
+ "message": "Autocompletar al cargar la página"
+ },
+ "autoFillOnPageLoadNo": {
+ "message": "No rellenar automáticamente al cargar la página"
+ },
+ "commandOpenPopup": {
+ "message": "Abrir ventana emergente de la caja fuerte"
+ },
+ "commandOpenSidebar": {
+ "message": "Abrir caja fuerte en la barra lateral"
+ },
+ "commandAutofillDesc": {
+ "message": "Autorrellenar la última entrada utilizada para la página actual."
+ },
+ "commandGeneratePasswordDesc": {
+ "message": "Generar y copiar una nueva contraseña aleatoria al portapapeles."
+ },
+ "commandLockVaultDesc": {
+ "message": "Bloquear la caja fuerte"
+ },
+ "privateModeMessage": {
+ "message": "Lamentablemente esta ventana no está disponible en el modo privado de este navegador."
+ },
+ "customFields": {
+ "message": "Campos personalizados"
+ },
+ "copyValue": {
+ "message": "Copiar valor"
+ },
+ "value": {
+ "message": "Valor"
+ },
+ "newCustomField": {
+ "message": "Nuevo campo personalizado"
+ },
+ "dragToSort": {
+ "message": "Arrastrar para ordenar"
+ },
+ "cfTypeText": {
+ "message": "Texto"
+ },
+ "cfTypeHidden": {
+ "message": "Oculto"
+ },
+ "cfTypeBoolean": {
+ "message": "Booleano"
+ },
+ "popup2faCloseMessage": {
+ "message": "Pulsar fuera de la ventana emergente para comprobar tu correo de verificación, hará que esta se cierre. ¿Quieres abrir esta ventana emergente en una nueva ventana para evitar su cierre?"
+ },
+ "popupU2fCloseMessage": {
+ "message": "Este navegador no puede procesar las peticiones U2F en esta ventana emergente. ¿Desea abrir esta ventana emergente en una nueva ventana para que pueda iniciar sesión usando U2F?"
+ },
+ "disableFavicon": {
+ "message": "Deshabilitar iconos del sitio web"
+ },
+ "disableFaviconDesc": {
+ "message": "Los iconos del sitio web añaden una imagen reconocible al lado de cada entrada de tu caja fuerte."
+ },
+ "disableBadgeCounter": {
+ "message": "Desactivar contador de insignias"
+ },
+ "disableBadgeCounterDesc": {
+ "message": "El contador de insinuaciones indica cuántos registros tienes para la página actual en tu bóveda."
+ },
+ "cardholderName": {
+ "message": "Nombre en la tarjeta"
+ },
+ "number": {
+ "message": "Número"
+ },
+ "brand": {
+ "message": "Marca"
+ },
+ "expirationMonth": {
+ "message": "Mes de expiración"
+ },
+ "expirationYear": {
+ "message": "Año de expiración"
+ },
+ "expiration": {
+ "message": "Expiración"
+ },
+ "january": {
+ "message": "Enero"
+ },
+ "february": {
+ "message": "Febrero"
+ },
+ "march": {
+ "message": "Marzo"
+ },
+ "april": {
+ "message": "Abril"
+ },
+ "may": {
+ "message": "Mayo"
+ },
+ "june": {
+ "message": "Junio"
+ },
+ "july": {
+ "message": "Julio"
+ },
+ "august": {
+ "message": "Agosto"
+ },
+ "september": {
+ "message": "Septiembre"
+ },
+ "october": {
+ "message": "Octubre"
+ },
+ "november": {
+ "message": "Noviembre"
+ },
+ "december": {
+ "message": "Diciembre"
+ },
+ "securityCode": {
+ "message": "Código de seguridad"
+ },
+ "ex": {
+ "message": "ej."
+ },
+ "title": {
+ "message": "Título"
+ },
+ "mr": {
+ "message": "Sr"
+ },
+ "mrs": {
+ "message": "Sra"
+ },
+ "ms": {
+ "message": "Srta"
+ },
+ "dr": {
+ "message": "Dr"
+ },
+ "firstName": {
+ "message": "Nombre"
+ },
+ "middleName": {
+ "message": "2º nombre"
+ },
+ "lastName": {
+ "message": "Apellido"
+ },
+ "identityName": {
+ "message": "Nombre de la identidad"
+ },
+ "company": {
+ "message": "Empresa"
+ },
+ "ssn": {
+ "message": "Nº de la seguridad social"
+ },
+ "passportNumber": {
+ "message": "Nº de pasaporte"
+ },
+ "licenseNumber": {
+ "message": "Nº de licencia"
+ },
+ "email": {
+ "message": "Correo electrónico"
+ },
+ "phone": {
+ "message": "Teléfono"
+ },
+ "address": {
+ "message": "Dirección"
+ },
+ "address1": {
+ "message": "Dirección 1"
+ },
+ "address2": {
+ "message": "Dirección 2"
+ },
+ "address3": {
+ "message": "Dirección 3"
+ },
+ "cityTown": {
+ "message": "Ciudad / Pueblo"
+ },
+ "stateProvince": {
+ "message": "Estado / Provincia"
+ },
+ "zipPostalCode": {
+ "message": "Código postal"
+ },
+ "country": {
+ "message": "País"
+ },
+ "type": {
+ "message": "Tipo"
+ },
+ "typeLogin": {
+ "message": "Entrada"
+ },
+ "typeLogins": {
+ "message": "Entradas"
+ },
+ "typeSecureNote": {
+ "message": "Nota segura"
+ },
+ "typeCard": {
+ "message": "Tarjeta"
+ },
+ "typeIdentity": {
+ "message": "Identidad"
+ },
+ "passwordHistory": {
+ "message": "Historial de contraseñas"
+ },
+ "back": {
+ "message": "Atrás"
+ },
+ "collections": {
+ "message": "Colecciones"
+ },
+ "favorites": {
+ "message": "Favoritos"
+ },
+ "popOutNewWindow": {
+ "message": "Abrir en una nueva ventana"
+ },
+ "refresh": {
+ "message": "Actualizar"
+ },
+ "cards": {
+ "message": "Tarjetas"
+ },
+ "identities": {
+ "message": "Identidades"
+ },
+ "logins": {
+ "message": "Entradas"
+ },
+ "secureNotes": {
+ "message": "Notas seguras"
+ },
+ "clear": {
+ "message": "Limpiar",
+ "description": "To clear something out. example: To clear browser history."
+ },
+ "checkPassword": {
+ "message": "Comprobar si la contraseña está comprometida."
+ },
+ "passwordExposed": {
+ "message": "Esta contraseña fue encontrada $VALUE$ vez/veces en filtraciones de datos. Deberías cambiarla.",
+ "placeholders": {
+ "value": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "passwordSafe": {
+ "message": "Esta contraseña no fue encontrada en ninguna filtración de datos conocida. Deberías poder utilizarla de forma segura."
+ },
+ "baseDomain": {
+ "message": "Dominio base"
+ },
+ "host": {
+ "message": "Servidor",
+ "description": "A URL's host value. For example, the host of https://sub.domain.com:443 is 'sub.domain.com:443'."
+ },
+ "exact": {
+ "message": "Exacta"
+ },
+ "startsWith": {
+ "message": "Empieza con"
+ },
+ "regEx": {
+ "message": "Expresión regular",
+ "description": "A programming term, also known as 'RegEx'."
+ },
+ "matchDetection": {
+ "message": "Tipo de detección",
+ "description": "URI match detection for auto-fill."
+ },
+ "defaultMatchDetection": {
+ "message": "Detección por defecto",
+ "description": "Default URI match detection for auto-fill."
+ },
+ "toggleOptions": {
+ "message": "Alternar opciones"
+ },
+ "toggleCurrentUris": {
+ "message": "Alternar URIs actuales",
+ "description": "Toggle the display of the URIs of the currently open tabs in the browser."
+ },
+ "currentUri": {
+ "message": "URI actual",
+ "description": "The URI of one of the current open tabs in the browser."
+ },
+ "organization": {
+ "message": "Organización",
+ "description": "An entity of multiple related people (ex. a team or business organization)."
+ },
+ "types": {
+ "message": "Tipos"
+ },
+ "allItems": {
+ "message": "Todos los elementos"
+ },
+ "noPasswordsInList": {
+ "message": "No hay contraseñas que listar."
+ },
+ "remove": {
+ "message": "Eliminar"
+ },
+ "default": {
+ "message": "Por defecto"
+ },
+ "dateUpdated": {
+ "message": "Actualizado",
+ "description": "ex. Date this item was updated"
+ },
+ "datePasswordUpdated": {
+ "message": "Contraseña actualizada",
+ "description": "ex. Date this password was updated"
+ },
+ "neverLockWarning": {
+ "message": "¿Está seguro de que quieres usar la opción \"Nunca\"? Al ajustar las opciones de bloqueo a \"Nunca\", la clave de cifrado de su caja fuerte se guardará en tu dispositivo. Si usas esta opción, asegúrate de mantener tu dispositivo debidamente protegido."
+ },
+ "noOrganizationsList": {
+ "message": "No perteneces a ninguna organización. Las organizaciones te permiten compartir elementos con otros usuarios de forma segura."
+ },
+ "noCollectionsInList": {
+ "message": "No hay colecciones que listar."
+ },
+ "ownership": {
+ "message": "Propiedad"
+ },
+ "whoOwnsThisItem": {
+ "message": "¿Quién posee este elemento?"
+ },
+ "strong": {
+ "message": "Fuerte",
+ "description": "ex. A strong password. Scale: Weak -> Good -> Strong"
+ },
+ "good": {
+ "message": "Buena",
+ "description": "ex. A good password. Scale: Weak -> Good -> Strong"
+ },
+ "weak": {
+ "message": "Débil",
+ "description": "ex. A weak password. Scale: Weak -> Good -> Strong"
+ },
+ "weakMasterPassword": {
+ "message": "Contraseña maestra débil"
+ },
+ "weakMasterPasswordDesc": {
+ "message": "La contraseña maestra que ha elegido es débil. Debe usar una contraseña maestra fuerte (o una frase de contraseña) para proteger adecuadamente su cuenta de Bitwarden. ¿Está seguro de que desea utilizar esta contraseña maestra?"
+ },
+ "pin": {
+ "message": "PIN",
+ "description": "PIN code. Ex. The short code (often numeric) that you use to unlock a device."
+ },
+ "unlockWithPin": {
+ "message": "Desbloquear con PIN"
+ },
+ "setYourPinCode": {
+ "message": "Establece tu código PIN para desbloquear Bitwarden. Tus ajustes de PIN se reiniciarán si alguna vez cierras tu sesión completamente de la aplicación."
+ },
+ "pinRequired": {
+ "message": "Código PIN requerido."
+ },
+ "invalidPin": {
+ "message": "Código PIN inválido."
+ },
+ "verifyPin": {
+ "message": "Verificar PIN"
+ },
+ "yourVaultIsLockedPinCode": {
+ "message": "Tu caja fuerte está bloqueada. Verifica tu código PIN para continuar."
+ },
+ "unlockWithBiometrics": {
+ "message": "Desbloquear con biométricos"
+ },
+ "awaitDesktop": {
+ "message": "Esperando la confirmación por parte del escritorio"
+ },
+ "awaitDesktopDesc": {
+ "message": "Por favor confirma el uso de biométricos en la aplicación de escritorio de Bitwarden para habilitar el uso de biométricos en el navegador."
+ },
+ "lockWithMasterPassOnRestart": {
+ "message": "Bloquear con contraseña maestra al reiniciar el navegador"
+ },
+ "selectOneCollection": {
+ "message": "Debes seleccionar al menos una colección."
+ },
+ "cloneItem": {
+ "message": "Clonar objeto"
+ },
+ "clone": {
+ "message": "Clonar"
+ },
+ "passwordGeneratorPolicyInEffect": {
+ "message": "Una o más políticas de la organización están afectando la configuración del generador"
+ },
+ "vaultTimeoutAction": {
+ "message": "Acción de tiempo de espera de la caja fuerte"
+ },
+ "lock": {
+ "message": "Bloquear",
+ "description": "Verb form: to make secure or inaccesible by"
+ },
+ "trash": {
+ "message": "Papelera",
+ "description": "Noun: a special folder to hold deleted items"
+ },
+ "searchTrash": {
+ "message": "Buscar en la Papelera"
+ },
+ "permanentlyDeleteItem": {
+ "message": "Eliminar elemento de forma permanente"
+ },
+ "permanentlyDeleteItemConfirmation": {
+ "message": "¿Estás seguro de eliminar de forma permanente este elemento?"
+ },
+ "permanentlyDeletedItem": {
+ "message": "Elemento eliminado de forma permanente"
+ },
+ "restoreItem": {
+ "message": "Restaurar elemento"
+ },
+ "restoreItemConfirmation": {
+ "message": "¿Estás seguro de que quieres restaurar este elemento?"
+ },
+ "restoredItem": {
+ "message": "Elemento restaurado"
+ },
+ "vaultTimeoutLogOutConfirmation": {
+ "message": "Cerrar sesión eliminará todo el acceso a tu caja fuerte y requerirá autenticación en línea después del tiempo de espera. ¿Estás seguro de que quieres usar esta configuración?"
+ },
+ "vaultTimeoutLogOutConfirmationTitle": {
+ "message": "Confirmación de la acción del tiempo de espera"
+ },
+ "autoFillAndSave": {
+ "message": "Autorellenar y guardar"
+ },
+ "autoFillSuccessAndSavedUri": {
+ "message": "Objeto autorellenado y URI guardada"
+ },
+ "autoFillSuccess": {
+ "message": "Objeto autorellenado"
+ },
+ "setMasterPassword": {
+ "message": "Establecer contraseña maestra"
+ },
+ "masterPasswordPolicyInEffect": {
+ "message": "Una o más políticas de la organización requieren que su contraseña maestra cumpla con los siguientes requisitos:"
+ },
+ "policyInEffectMinComplexity": {
+ "message": "Puntuación mínima de complejidad de $SCORE$",
+ "placeholders": {
+ "score": {
+ "content": "$1",
+ "example": "4"
+ }
+ }
+ },
+ "policyInEffectMinLength": {
+ "message": "Longitud mínima de $LENGTH$",
+ "placeholders": {
+ "length": {
+ "content": "$1",
+ "example": "14"
+ }
+ }
+ },
+ "policyInEffectUppercase": {
+ "message": "Contiene uno o más caracteres en mayúsculas"
+ },
+ "policyInEffectLowercase": {
+ "message": "Contiene uno o más caracteres en minúsculas"
+ },
+ "policyInEffectNumbers": {
+ "message": "Contiene uno o más números"
+ },
+ "policyInEffectSpecial": {
+ "message": "Contiene uno o más de los siguientes caracteres especiales $CHARS$",
+ "placeholders": {
+ "chars": {
+ "content": "$1",
+ "example": "!@#$%^&*"
+ }
+ }
+ },
+ "masterPasswordPolicyRequirementsNotMet": {
+ "message": "Su nueva contraseña maestra no cumple con los requisitos de la política."
+ },
+ "acceptPolicies": {
+ "message": "Al seleccionar esta casilla, acepta lo siguiente:"
+ },
+ "acceptPoliciesError": {
+ "message": "Todavía no has aceptado los términos del servicio y la política de privacidad."
+ },
+ "termsOfService": {
+ "message": "Términos y condiciones del servicio"
+ },
+ "privacyPolicy": {
+ "message": "Política de privacidad"
+ },
+ "hintEqualsPassword": {
+ "message": "Tu contraseña no puede ser idéntica a la pista de contraseña."
+ },
+ "ok": {
+ "message": "Ok"
+ },
+ "desktopSyncVerificationTitle": {
+ "message": "Verificación de sincronización del escritorio"
+ },
+ "desktopIntegrationVerificationText": {
+ "message": "Favor de verificar que la aplicación de escritorio muestre ésta huella:"
+ },
+ "desktopIntegrationDisabledTitle": {
+ "message": "La integración con el navegador se encuentra deshabilitada"
+ },
+ "desktopIntegrationDisabledDesc": {
+ "message": "La integración con el navegador se encuentra deshabilitada en la aplicación de escritorio de Bitwarden. Favor de habilitarla en los ajustes dentro de la aplicación de escritorio."
+ },
+ "startDesktopTitle": {
+ "message": "Inicia la aplicación de escritorio de Bitwarden"
+ },
+ "startDesktopDesc": {
+ "message": "La aplicación de escritorio de Bitwarden necesita iniciarse para poder utilizar ésta función."
+ },
+ "errorEnableBiometricTitle": {
+ "message": "No fue posible habilitar biométricos"
+ },
+ "errorEnableBiometricDesc": {
+ "message": "La acción fue cancelada por la aplicación de escritorio"
+ },
+ "nativeMessagingInvalidEncryptionDesc": {
+ "message": "La aplicación de escritorio invalidó el canal seguro de comunicación. Favor de intentar la operación nuevamente"
+ },
+ "nativeMessagingInvalidEncryptionTitle": {
+ "message": "Se ha interrumpido la comunicación con el escritorio"
+ },
+ "nativeMessagingWrongUserDesc": {
+ "message": "La aplicación de escritorio está conectada a una cuenta distinta. Favor de asegurar que ambas aplicaciones estén conectadas a la misma cuenta. "
+ },
+ "nativeMessagingWrongUserTitle": {
+ "message": "Las cuentas son distintas"
+ },
+ "biometricsNotEnabledTitle": {
+ "message": "Biometría deshabilitada"
+ },
+ "biometricsNotEnabledDesc": {
+ "message": "La biometría del navegador requiere activar primero la biometría de escritorio en los ajustes."
+ },
+ "biometricsNotSupportedTitle": {
+ "message": "No se admite la biometría"
+ },
+ "biometricsNotSupportedDesc": {
+ "message": "La biometría del navegador no es compatible con este dispositivo."
+ },
+ "nativeMessaginPermissionErrorTitle": {
+ "message": "Permiso no proporcionado"
+ },
+ "nativeMessaginPermissionErrorDesc": {
+ "message": "Sin el permiso para comunicarse con la aplicación de escritorio de Bitwarden, no podemos proporcionar datos biométricos en la extensión del navegador. Por favor, inténtalo de nuevo."
+ },
+ "nativeMessaginPermissionSidebarTitle": {
+ "message": "Error de solicitud de permiso"
+ },
+ "nativeMessaginPermissionSidebarDesc": {
+ "message": "Esta acción no se puede realizar en la barra lateral, por favor, vuelve a intentar la acción en la ventana emergente o popout."
+ },
+ "personalOwnershipSubmitError": {
+ "message": "Debido a una política de organización, tiene restringido el guardar elementos a su bóveda personal. Cambie la configuración de propietario a organización y elija entre las colecciones disponibles."
+ },
+ "personalOwnershipPolicyInEffect": {
+ "message": "Una política de organización está afectando a sus opciones de propiedad."
+ },
+ "excludedDomains": {
+ "message": "Dominios excluidos"
+ },
+ "excludedDomainsDesc": {
+ "message": "Bitwarden no pedirá que se guarden los datos de acceso para estos dominios. Debe actualizar la página para que los cambios surtan efecto."
+ },
+ "excludedDomainsInvalidDomain": {
+ "message": "$DOMAIN$ no es un dominio válido",
+ "placeholders": {
+ "domain": {
+ "content": "$1",
+ "example": "googlecom"
+ }
+ }
+ },
+ "send": {
+ "message": "Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "searchSends": {
+ "message": "Buscar Sends",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "addSend": {
+ "message": "Añadir Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTypeText": {
+ "message": "Texto"
+ },
+ "sendTypeFile": {
+ "message": "Archivo"
+ },
+ "allSends": {
+ "message": "Todos los Sends",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "maxAccessCountReached": {
+ "message": "Número máximo de accesos alcanzado"
+ },
+ "expired": {
+ "message": "Caducado"
+ },
+ "pendingDeletion": {
+ "message": "Borrado pendiente"
+ },
+ "passwordProtected": {
+ "message": "Protegido por contraseña"
+ },
+ "copySendLink": {
+ "message": "Copiar enlace Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "removePassword": {
+ "message": "Eliminar contraseña"
+ },
+ "delete": {
+ "message": "Eliminar"
+ },
+ "removedPassword": {
+ "message": "Contraseña eliminada"
+ },
+ "deletedSend": {
+ "message": "Send eliminado",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendLink": {
+ "message": "Enlace Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "disabled": {
+ "message": "Desactivado"
+ },
+ "removePasswordConfirmation": {
+ "message": "¿Está seguro que desea eliminar la contraseña?"
+ },
+ "deleteSend": {
+ "message": "Eliminar Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "deleteSendConfirmation": {
+ "message": "¿Está seguro de que desea eliminar este Send?",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "editSend": {
+ "message": "Editar Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTypeHeader": {
+ "message": "¿Qué tipo de Send es este?",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendNameDesc": {
+ "message": "Un nombre amigable para describir este Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendFileDesc": {
+ "message": "El archivo que desea enviar."
+ },
+ "deletionDate": {
+ "message": "Fecha de eliminación"
+ },
+ "deletionDateDesc": {
+ "message": "El Send se eliminará permanentemente en la fecha y hora especificadas.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "expirationDate": {
+ "message": "Fecha de caducidad"
+ },
+ "expirationDateDesc": {
+ "message": "Si se establece, el acceso a este Send caducará en la fecha y hora especificadas.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "oneDay": {
+ "message": "1 día"
+ },
+ "days": {
+ "message": "$DAYS$ días",
+ "placeholders": {
+ "days": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "custom": {
+ "message": "Personalizado"
+ },
+ "maximumAccessCount": {
+ "message": "Número máximo de accesos"
+ },
+ "maximumAccessCountDesc": {
+ "message": "Si se establece, los usuarios ya no podrán acceder a este Send una vez que se alcance el número máximo de accesos.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendPasswordDesc": {
+ "message": "Opcionalmente se requiere una contraseña para que los usuarios accedan a este Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendNotesDesc": {
+ "message": "Notas privadas sobre este Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendDisableDesc": {
+ "message": "Desactiva este Send para que nadie pueda acceder a él.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendShareDesc": {
+ "message": "Copiar el enlace del Send en el portapapeles al guardar.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTextDesc": {
+ "message": "El texto que quieres enviar."
+ },
+ "sendHideText": {
+ "message": "Ocultar el texto de este Envío por defecto.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "currentAccessCount": {
+ "message": "Número de acceso actual"
+ },
+ "createSend": {
+ "message": "Crear Envío nuevo",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "newPassword": {
+ "message": "Nueva contraseña"
+ },
+ "sendDisabled": {
+ "message": "Envío desactivado",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendDisabledWarning": {
+ "message": "Debido a una política empresarial, sólo puede eliminar el existente Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "createdSend": {
+ "message": "Envío creado",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "editedSend": {
+ "message": "Envío editado",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendLinuxChromiumFileWarning": {
+ "message": "Para elegir un archivo, abra la extensión en la barra lateral (si es posible) o salga a una nueva ventana haciendo clic en este anouncio."
+ },
+ "sendFirefoxFileWarning": {
+ "message": "Para elegir un archivo usando Firefox, abra la extensión en la barra lateral o salga a una nueva ventana haciendo clic en este anouncio."
+ },
+ "sendSafariFileWarning": {
+ "message": "Para elegir un archivo usando Safari, salga a una nueva ventana haciendo clic en este anouncio."
+ },
+ "sendFileCalloutHeader": {
+ "message": "Antes de empezar"
+ },
+ "sendFirefoxCustomDatePopoutMessage1": {
+ "message": "Para usar un selector de fechas de estilo calendario",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read '**To use a calendar style date picker ** click here to pop out your window.'"
+ },
+ "sendFirefoxCustomDatePopoutMessage2": {
+ "message": "haz click aquí",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker **click here** to pop out your window.'"
+ },
+ "sendFirefoxCustomDatePopoutMessage3": {
+ "message": "para abrir la ventana.",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker click here **to pop out your window.**'"
+ },
+ "expirationDateIsInvalid": {
+ "message": "La fecha de caducidad proporcionada no es válida."
+ },
+ "deletionDateIsInvalid": {
+ "message": "La fecha de eliminación proporcionada no es válida."
+ },
+ "expirationDateAndTimeRequired": {
+ "message": "Se requiere una fecha y hora de caducidad."
+ },
+ "deletionDateAndTimeRequired": {
+ "message": "Se requiere una fecha y hora de eliminación."
+ },
+ "dateParsingError": {
+ "message": "Hubo un error al guardar las fechas de eliminación y caducidad."
+ },
+ "hideEmail": {
+ "message": "Ocultar mi dirección de correo electrónico a los destinatarios."
+ },
+ "sendOptionsPolicyInEffect": {
+ "message": "Una o más políticas de organización están afectando sus opciones del Send."
+ },
+ "passwordPrompt": {
+ "message": "Volver a preguntar contraseña maestra"
+ },
+ "passwordConfirmation": {
+ "message": "Confirmación de contraseña maestra"
+ },
+ "passwordConfirmationDesc": {
+ "message": "Esta acción está protegida. Para continuar, vuelva a introducir su contraseña maestra para verificar su identidad."
+ },
+ "emailVerificationRequired": {
+ "message": "Verificación de correo electrónico requerida"
+ },
+ "emailVerificationRequiredDesc": {
+ "message": "Debes verificar tu correo electrónico para usar esta función. Puedes verificar tu correo electrónico en la bóveda web."
+ },
+ "updatedMasterPassword": {
+ "message": "Contraseña maestra actualizada"
+ },
+ "updateMasterPassword": {
+ "message": "Actualizar contraseña maestra"
+ },
+ "updateMasterPasswordWarning": {
+ "message": "Su contraseña maestra ha sido cambiada recientemente por un administrador de su organización. Para acceder a la caja fuerte, debe actualizarla ahora. Proceder le desconectará de su sesión actual, requiriendo que vuelva a iniciar sesión. Las sesiones activas en otros dispositivos pueden seguir estando activas durante una hora."
+ },
+ "resetPasswordPolicyAutoEnroll": {
+ "message": "Inscripción automática"
+ },
+ "resetPasswordAutoEnrollInviteWarning": {
+ "message": "Esta organización tiene una política empresarial que lo inscribirá automáticamente en el restablecimiento de contraseña. La inscripción permitirá a los administradores de la organización cambiar su contraseña maestra."
+ },
+ "selectFolder": {
+ "message": "Seleccione carpeta..."
+ },
+ "ssoCompleteRegistration": {
+ "message": "Para completar el inicio de sesión con SSO, por favor establezca una contraseña maestra para acceder y proteger su caja fuerte."
+ },
+ "hours": {
+ "message": "Horas"
+ },
+ "minutes": {
+ "message": "Minutos"
+ },
+ "vaultTimeoutPolicyInEffect": {
+ "message": "Las políticas de tu organización están afectando el tiempo de espera de tu caja fuerte. El máximo permitido de espera es de $HOURS$ hora(s) y de $MINUTES$ minuto(s)",
+ "placeholders": {
+ "hours": {
+ "content": "$1",
+ "example": "5"
+ },
+ "minutes": {
+ "content": "$2",
+ "example": "5"
+ }
+ }
+ },
+ "vaultTimeoutToLarge": {
+ "message": "El tiempo de espera de tu caja fuerte excede las restricciones establecidas por tu organización."
+ },
+ "vaultExportDisabled": {
+ "message": "Exportación de caja fuerte desactivada"
+ },
+ "personalVaultExportPolicyInEffect": {
+ "message": "Una o más políticas de organización le impiden exportar su caja fuerte personal."
+ },
+ "copyCustomFieldNameInvalidElement": {
+ "message": "No se puede identificar un elemento de formulario válido. Intenta inspeccionar el HTML en su lugar."
+ },
+ "copyCustomFieldNameNotUnique": {
+ "message": "Identificador único no encontrado."
+ }
+}
diff --git a/src/iOS.Safari/Resources/_locales/et/messages.json b/src/iOS.Safari/Resources/_locales/et/messages.json
new file mode 100644
index 000000000..6c6a21100
--- /dev/null
+++ b/src/iOS.Safari/Resources/_locales/et/messages.json
@@ -0,0 +1,1817 @@
+{
+ "appName": {
+ "message": "Bitwarden"
+ },
+ "extName": {
+ "message": "Bitwarden - Tasuta paroolihaldur",
+ "description": "Extension name, MUST be less than 40 characters (Safari restriction)"
+ },
+ "extDesc": {
+ "message": "Turvaline ja tasuta paroolihaldur kõikidele sinu seadmetele.",
+ "description": "Extension description"
+ },
+ "loginOrCreateNewAccount": {
+ "message": "Logi oma olemasolevasse kontosse sisse või loo uus konto."
+ },
+ "createAccount": {
+ "message": "Loo konto"
+ },
+ "login": {
+ "message": "Logi sisse"
+ },
+ "enterpriseSingleSignOn": {
+ "message": "Ettevõtte Single Sign-On"
+ },
+ "cancel": {
+ "message": "Tühista"
+ },
+ "close": {
+ "message": "Sulge"
+ },
+ "submit": {
+ "message": "Kinnita"
+ },
+ "emailAddress": {
+ "message": "E-posti aadress"
+ },
+ "masterPass": {
+ "message": "Ülemparool"
+ },
+ "masterPassDesc": {
+ "message": "Ülemparool on parool, millega pääsed oma kontole ligi. On äärmiselt tähtis, et ülemparool ei ununeks. Selle parooli taastamine ei ole mingil moel võimalik."
+ },
+ "masterPassHintDesc": {
+ "message": "Vihje võib abiks olla olukorras, kui oled ülemparooli unustanud."
+ },
+ "reTypeMasterPass": {
+ "message": "Sisesta ülemparool uuesti"
+ },
+ "masterPassHint": {
+ "message": "Ülemparooli vihje (ei ole kohustuslik)"
+ },
+ "tab": {
+ "message": "Kaart"
+ },
+ "myVault": {
+ "message": "Minu hoidla"
+ },
+ "tools": {
+ "message": "Tööriistad"
+ },
+ "settings": {
+ "message": "Seaded"
+ },
+ "currentTab": {
+ "message": "Praegune vahekaart"
+ },
+ "copyPassword": {
+ "message": "Kopeeri parool"
+ },
+ "copyNote": {
+ "message": "Kopeeri märkus"
+ },
+ "copyUri": {
+ "message": "Kopeeri URI"
+ },
+ "copyUsername": {
+ "message": "Kopeeri kasutajanimi"
+ },
+ "copyNumber": {
+ "message": "Kopeeri number"
+ },
+ "copySecurityCode": {
+ "message": "Kopeeri turvakood"
+ },
+ "autoFill": {
+ "message": "Automaatne täitmine"
+ },
+ "generatePasswordCopied": {
+ "message": "Genereeri parool (kopeeritakse)"
+ },
+ "copyElementIdentifier": {
+ "message": "Kopeeri kohandatud välja nimi"
+ },
+ "noMatchingLogins": {
+ "message": "Sobivaid kontoandmeid ei leitud."
+ },
+ "vaultLocked": {
+ "message": "Hoidla on lukus."
+ },
+ "vaultLoggedOut": {
+ "message": "Hoidlast on välja logitud."
+ },
+ "autoFillInfo": {
+ "message": "Selle vahekaardi automaatseks täitmiseks puuduvad kirjed."
+ },
+ "addLogin": {
+ "message": "Lisa konto andmed"
+ },
+ "addItem": {
+ "message": "Lisa kirje"
+ },
+ "passwordHint": {
+ "message": "Parooli vihje"
+ },
+ "enterEmailToGetHint": {
+ "message": "Ülemparooli vihje saamiseks sisesta oma konto e-posti aadress."
+ },
+ "getMasterPasswordHint": {
+ "message": "Tuleta ülemparool vihjega meelde"
+ },
+ "continue": {
+ "message": "Jätka"
+ },
+ "verificationCode": {
+ "message": "Kinnituskood"
+ },
+ "account": {
+ "message": "Konto"
+ },
+ "changeMasterPassword": {
+ "message": "Muuda ülemparooli"
+ },
+ "fingerprintPhrase": {
+ "message": "Sõrmejälje fraas",
+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
+ },
+ "yourAccountsFingerprint": {
+ "message": "Konto sõrmejälje fraas",
+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
+ },
+ "twoStepLogin": {
+ "message": "Kaheastmeline kinnitamine"
+ },
+ "logOut": {
+ "message": "Logi välja"
+ },
+ "about": {
+ "message": "Rakenduse info"
+ },
+ "version": {
+ "message": "Versioon"
+ },
+ "save": {
+ "message": "Salvesta"
+ },
+ "move": {
+ "message": "Teisalda"
+ },
+ "addFolder": {
+ "message": "Kausta lisamine"
+ },
+ "name": {
+ "message": "Nimi"
+ },
+ "editFolder": {
+ "message": "Muuda kausta"
+ },
+ "deleteFolder": {
+ "message": "Kustuta Kaust"
+ },
+ "folders": {
+ "message": "Kaustad"
+ },
+ "noFolders": {
+ "message": "Puuduvad kaustad, mida kuvada."
+ },
+ "helpFeedback": {
+ "message": "Abi ja tagasiside"
+ },
+ "sync": {
+ "message": "Sünkroniseeri"
+ },
+ "syncVaultNow": {
+ "message": "Sünkroniseeri hoidla"
+ },
+ "lastSync": {
+ "message": "Viimane sünkronisatsioon:"
+ },
+ "passGen": {
+ "message": "Parooli genereerimine"
+ },
+ "generator": {
+ "message": "Genereerija",
+ "description": "Short for 'Password Generator'."
+ },
+ "passGenInfo": {
+ "message": "Loo oma kontodele tugevaid ja unikaalseid paroole."
+ },
+ "bitWebVault": {
+ "message": "Bitwardeni Veebihoidla"
+ },
+ "importItems": {
+ "message": "Impordi andmed"
+ },
+ "select": {
+ "message": "Vali"
+ },
+ "generatePassword": {
+ "message": "Loo parool"
+ },
+ "regeneratePassword": {
+ "message": "Genereeri parool uuesti"
+ },
+ "options": {
+ "message": "Valikud"
+ },
+ "length": {
+ "message": "Pikkus"
+ },
+ "numWords": {
+ "message": "Sõnade arv"
+ },
+ "wordSeparator": {
+ "message": "Sõna eraldaja"
+ },
+ "capitalize": {
+ "message": "Suurtäht",
+ "description": "Make the first letter of a work uppercase."
+ },
+ "includeNumber": {
+ "message": "Lisa number"
+ },
+ "minNumbers": {
+ "message": "Vähim arv numbreid"
+ },
+ "minSpecial": {
+ "message": "Vähim arv spetsiaalmärke"
+ },
+ "avoidAmbChar": {
+ "message": "Väldi ebamääraseid kirjamärke"
+ },
+ "searchVault": {
+ "message": "Otsi hoidlast"
+ },
+ "edit": {
+ "message": "Muuda"
+ },
+ "view": {
+ "message": "Vaata"
+ },
+ "noItemsInList": {
+ "message": "Puuduvad kirjed, mida kuvada."
+ },
+ "itemInformation": {
+ "message": "Kirje andmed"
+ },
+ "username": {
+ "message": "Kasutajanimi"
+ },
+ "password": {
+ "message": "Parool"
+ },
+ "passphrase": {
+ "message": "Paroolifraas"
+ },
+ "favorite": {
+ "message": "Lemmik"
+ },
+ "notes": {
+ "message": "Märkmed"
+ },
+ "note": {
+ "message": "Märkus"
+ },
+ "editItem": {
+ "message": "Kirje muutmine"
+ },
+ "folder": {
+ "message": "Kaust"
+ },
+ "deleteItem": {
+ "message": "Kustuta kirje"
+ },
+ "viewItem": {
+ "message": "Kirje vaatamine"
+ },
+ "launch": {
+ "message": "Käivita"
+ },
+ "website": {
+ "message": "Veebileht"
+ },
+ "toggleVisibility": {
+ "message": "Näita"
+ },
+ "manage": {
+ "message": "Halda"
+ },
+ "other": {
+ "message": "Muu"
+ },
+ "rateExtension": {
+ "message": "Hinda seda laiendust"
+ },
+ "rateExtensionDesc": {
+ "message": "Soovi korral võid meid positiivse hinnanguga toetada!"
+ },
+ "browserNotSupportClipboard": {
+ "message": "Kasutatav brauser ei toeta lihtsat lõikelaua kopeerimist. Kopeeri see käsitsi."
+ },
+ "verifyMasterPassword": {
+ "message": "Autendi ülemparooliga"
+ },
+ "yourVaultIsLocked": {
+ "message": "Hoidla on lukus. Jätkamiseks sisesta ülemparool."
+ },
+ "unlock": {
+ "message": "Lukusta lahti"
+ },
+ "loggedInAsOn": {
+ "message": "Sisse logitud kontosse $EMAIL$ aadressil $HOSTNAME$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "name@example.com"
+ },
+ "hostname": {
+ "content": "$2",
+ "example": "bitwarden.com"
+ }
+ }
+ },
+ "invalidMasterPassword": {
+ "message": "Vale ülemparool"
+ },
+ "vaultTimeout": {
+ "message": "Hoidla ajalõpp"
+ },
+ "lockNow": {
+ "message": "Lukusta paroolihoidla"
+ },
+ "immediately": {
+ "message": "Koheselt"
+ },
+ "tenSeconds": {
+ "message": "10 sekundi pärast"
+ },
+ "twentySeconds": {
+ "message": "20 sekundi pärast"
+ },
+ "thirtySeconds": {
+ "message": "30 sekundi pärast"
+ },
+ "oneMinute": {
+ "message": "1 minuti pärast"
+ },
+ "twoMinutes": {
+ "message": "2 minuti pärast"
+ },
+ "fiveMinutes": {
+ "message": "5 minuti pärast"
+ },
+ "fifteenMinutes": {
+ "message": "15 minuti pärast"
+ },
+ "thirtyMinutes": {
+ "message": "30 minuti pärast"
+ },
+ "oneHour": {
+ "message": "1 tunni pärast"
+ },
+ "fourHours": {
+ "message": "4 tunni pärast"
+ },
+ "onLocked": {
+ "message": "Arvutist väljalogimisel"
+ },
+ "onRestart": {
+ "message": "Brauseri taaskäivitamisel"
+ },
+ "never": {
+ "message": "Mitte kunagi"
+ },
+ "security": {
+ "message": "Turvalisus"
+ },
+ "errorOccurred": {
+ "message": "Ilmnes viga"
+ },
+ "emailRequired": {
+ "message": "E-posti aadress on nõutud."
+ },
+ "invalidEmail": {
+ "message": "Vigane e-posti aadress."
+ },
+ "masterPassRequired": {
+ "message": "Vajalik on ülemparooli sisestamine."
+ },
+ "masterPassLength": {
+ "message": "Ülemparool peab olema vähemalt 8 tähemärgi pikkune."
+ },
+ "masterPassDoesntMatch": {
+ "message": "Ülemparoolid ei ühti."
+ },
+ "newAccountCreated": {
+ "message": "Konto on loodud! Võid nüüd sisse logida."
+ },
+ "masterPassSent": {
+ "message": "Ülemparooli vihje saadeti sinu e-postile."
+ },
+ "verificationCodeRequired": {
+ "message": "Nõutav on kinnituskood."
+ },
+ "valueCopied": {
+ "message": "$VALUE$ on kopeeritud",
+ "description": "Value has been copied to the clipboard.",
+ "placeholders": {
+ "value": {
+ "content": "$1",
+ "example": "Password"
+ }
+ }
+ },
+ "autofillError": {
+ "message": "Automaatne täitmine ebaõnnestus. Palun kopeeri informatsioon käsitsi."
+ },
+ "loggedOut": {
+ "message": "Välja logitud"
+ },
+ "loginExpired": {
+ "message": "Sessioon on aegunud."
+ },
+ "logOutConfirmation": {
+ "message": "Oled kindel, et soovid välja logida?"
+ },
+ "yes": {
+ "message": "Jah"
+ },
+ "no": {
+ "message": "Ei"
+ },
+ "unexpectedError": {
+ "message": "Tekkis ootamatu viga."
+ },
+ "nameRequired": {
+ "message": "Nimi on kohustuslik."
+ },
+ "addedFolder": {
+ "message": "Kaust on lisatud"
+ },
+ "changeMasterPass": {
+ "message": "Muuda ülemparooli"
+ },
+ "changeMasterPasswordConfirmation": {
+ "message": "Saad oma ülemparooli muuta bitwarden.com veebihoidlas. Soovid seda kohe teha?"
+ },
+ "twoStepLoginConfirmation": {
+ "message": "Kaheastmeline kinnitamine aitab konto turvalisust tõsta. Lisaks paroolile pead kontole ligipääsemiseks kinnitama sisselogimise päringu SMS-ga, telefonikõnega, autentimise rakendusega või e-postiga. Kaheastmelist kinnitust saab sisse lülitada bitwarden.com veebihoidlas. Soovid seda kohe avada?"
+ },
+ "editedFolder": {
+ "message": "Kaust on muudetud"
+ },
+ "deleteFolderConfirmation": {
+ "message": "Oled kindel, et soovid seda kausta kustutada?"
+ },
+ "deletedFolder": {
+ "message": "Kaust on kustutatud"
+ },
+ "gettingStartedTutorial": {
+ "message": "Alustamise juhend"
+ },
+ "gettingStartedTutorialVideo": {
+ "message": "Vaata meie alustamise juhendit, et brauseri lisa kohta rohkem teavet saada."
+ },
+ "syncingComplete": {
+ "message": "Sünkroniseerimine on lõpetatud"
+ },
+ "syncingFailed": {
+ "message": "Sünkroniseerimine nurjus"
+ },
+ "passwordCopied": {
+ "message": "Parool on kopeeritud"
+ },
+ "uri": {
+ "message": "URI"
+ },
+ "uriPosition": {
+ "message": "URI $POSITION$",
+ "description": "A listing of URIs. Ex: URI 1, URI 2, URI 3, etc.",
+ "placeholders": {
+ "position": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "newUri": {
+ "message": "Uus URI"
+ },
+ "addedItem": {
+ "message": "Kirje on lisatud"
+ },
+ "editedItem": {
+ "message": "Kirje on muudetud"
+ },
+ "deleteItemConfirmation": {
+ "message": "Soovid tõesti selle kirje kustutada?"
+ },
+ "deletedItem": {
+ "message": "Kirje on kustutatud"
+ },
+ "overwritePassword": {
+ "message": "Kirjuta parool üle"
+ },
+ "overwritePasswordConfirmation": {
+ "message": "Oled kindel, et soovid olemasolevat parooli üle kirjutada?"
+ },
+ "searchFolder": {
+ "message": "Otsi kausta"
+ },
+ "searchCollection": {
+ "message": "Otsi kogumikku"
+ },
+ "searchType": {
+ "message": "Otsingu tüüp"
+ },
+ "noneFolder": {
+ "message": "Kaust puudub",
+ "description": "This is the folder for uncategorized items"
+ },
+ "disableAddLoginNotification": {
+ "message": "Keela \"Lisa konto andmed\" teavitus"
+ },
+ "addLoginNotificationDesc": {
+ "message": "\"Lisa konto andmed\" teavitus ilmub pärast esimest sisselogimist ning võimaldab kontoandmeid automaatselt Bitwardenisse lisada."
+ },
+ "dontShowCardsCurrentTab": {
+ "message": "Ära kuva \"Kaart\" vaates krediitkaardi andmeid"
+ },
+ "dontShowCardsCurrentTabDesc": {
+ "message": "Krediit- ja teiste kaartide andmed kuvatakse vaikeseadena \"Kaart\" vaates, et neid oleks lihtsam sisestada."
+ },
+ "dontShowIdentitiesCurrentTab": {
+ "message": "Ära kuva \"Kaart\" vaates identiteete"
+ },
+ "dontShowIdentitiesCurrentTabDesc": {
+ "message": "Identiteediandmeid kuvatakse vaikeseadena \"Kaart\" vaates, et neid oleks lihtsam sisestada."
+ },
+ "clearClipboard": {
+ "message": "Lõikelaua sisu kustutamine",
+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
+ },
+ "clearClipboardDesc": {
+ "message": "Kustutab automaatselt lõikelauale kopeeritud sisu.",
+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
+ },
+ "notificationAddDesc": {
+ "message": "Kas bitwarden peaks seda parooli meeles pidama?"
+ },
+ "notificationAddSave": {
+ "message": "Jah, salvesta see"
+ },
+ "notificationNeverSave": {
+ "message": "Ära sellel lehel enam küsi"
+ },
+ "disableChangedPasswordNotification": {
+ "message": "Keela Muudetud parooli teavitus"
+ },
+ "disableChangedPasswordNotificationDesc": {
+ "message": "Kui mistahes veebilehel on toimunud parooli vahetamine, annab \"Muudetud parooli teavitus\" märku, et värskendaksid seda ka Bitwardeni paroolihoidlas."
+ },
+ "notificationChangeDesc": {
+ "message": "Soovid seda parooli ka Bitwardenis uuendada?"
+ },
+ "notificationChangeSave": {
+ "message": "Jah, uuenda"
+ },
+ "disableContextMenuItem": {
+ "message": "Keela parema kliki menüü valikud"
+ },
+ "disableContextMenuItemDesc": {
+ "message": "Parema kliki menüü abil saad kiiresti parooli genereerida ja konkreetse veebilehe kasutajakonto andmeid sisestada."
+ },
+ "defaultUriMatchDetection": {
+ "message": "Vaike URI sobivuse tuvastamine",
+ "description": "Default URI match detection for auto-fill."
+ },
+ "defaultUriMatchDetectionDesc": {
+ "message": "Vali vaikeviis, kuidas kirje ja URI sobivus tuvastatakse. Seda kasutatakse näiteks siis, kui lehele üritatakse automaatselt andmeid sisestada."
+ },
+ "theme": {
+ "message": "Teema"
+ },
+ "themeDesc": {
+ "message": "Muuda rakenduse värvikujundust."
+ },
+ "dark": {
+ "message": "Tume",
+ "description": "Dark color"
+ },
+ "light": {
+ "message": "Hele",
+ "description": "Light color"
+ },
+ "solarizedDark": {
+ "message": "Solarized tume",
+ "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated."
+ },
+ "exportVault": {
+ "message": "Ekspordi hoidla"
+ },
+ "fileFormat": {
+ "message": "Failivorming"
+ },
+ "warning": {
+ "message": "HOIATUS",
+ "description": "WARNING (should stay in capitalized letters if the language permits)"
+ },
+ "confirmVaultExport": {
+ "message": "Hoidla eksportimise kinnitamine"
+ },
+ "exportWarningDesc": {
+ "message": "Eksporditav fail sisaldab hoidla sisu, mis on krüpteeringuta. Seda faili ei tohiks kaua käidelda ning mitte mingil juhul ebaturvaliselt saata (näiteks e-postiga). Kustuta see koheselt pärast kasutamist."
+ },
+ "encExportKeyWarningDesc": {
+ "message": "Eksporditavate andmete krüpteerimiseks kasutatakse kontol olevat krüpteerimisvõtit. Kui sa peaksid seda krüpteerimise võtit roteerima, ei saa sa järgnevalt eksporditavaid andmeid enam dekrüpteerida."
+ },
+ "encExportAccountWarningDesc": {
+ "message": "Iga Bitwardeni kasutaja krüpteerimisvõti on unikaalne. Eksporditud andmeid ei saa importida teise Bitwardeni kasutajakontosse."
+ },
+ "exportMasterPassword": {
+ "message": "Hoidlas olevate andmete eksportimiseks on vajalik ülemparooli sisestamine."
+ },
+ "shared": {
+ "message": "Jagatud"
+ },
+ "learnOrg": {
+ "message": "Info organisatsioonide kohta"
+ },
+ "learnOrgConfirmation": {
+ "message": "Bitwarden võimaldab sul hoidla sisu teiste kasutajatega jagada, kasutades selleks organisatsiooni kontot. Soovid külastada lehekülge bitwarden.com ja selle kohta rohkem lugeda?"
+ },
+ "moveToOrganization": {
+ "message": "Teisalda organisatsiooni"
+ },
+ "share": {
+ "message": "Jaga"
+ },
+ "movedItemToOrg": {
+ "message": "$ITEMNAME$ teisaldati $ORGNAME$",
+ "placeholders": {
+ "itemname": {
+ "content": "$1",
+ "example": "Secret Item"
+ },
+ "orgname": {
+ "content": "$2",
+ "example": "Company Name"
+ }
+ }
+ },
+ "moveToOrgDesc": {
+ "message": "Vali organisatsioon, kuhu soovid seda kirjet teisaldada. Teisaldamisega saab kirje omanikuks organisatsioon. Pärast kirje teisaldamist ei ole sa enam selle otsene omanik."
+ },
+ "learnMore": {
+ "message": "Loe edasi"
+ },
+ "authenticatorKeyTotp": {
+ "message": "Autentimise võti (TOTP)"
+ },
+ "verificationCodeTotp": {
+ "message": "Kinnituskood (TOTP)"
+ },
+ "copyVerificationCode": {
+ "message": "Kopeeri kinnituskood"
+ },
+ "attachments": {
+ "message": "Manused"
+ },
+ "deleteAttachment": {
+ "message": "Kustuta manus"
+ },
+ "deleteAttachmentConfirmation": {
+ "message": "Oled kindel, et soovid manuse kustutada?"
+ },
+ "deletedAttachment": {
+ "message": "Manus on kustutatud"
+ },
+ "newAttachment": {
+ "message": "Lisa uus manus"
+ },
+ "noAttachments": {
+ "message": "Manused puuduvad."
+ },
+ "attachmentSaved": {
+ "message": "Manus on salvestatud."
+ },
+ "file": {
+ "message": "Fail"
+ },
+ "selectFile": {
+ "message": "Vali fail."
+ },
+ "maxFileSize": {
+ "message": "Maksimaalne faili suurus on 500 MB."
+ },
+ "featureUnavailable": {
+ "message": "Funktsioon pole saadaval"
+ },
+ "updateKey": {
+ "message": "Seda funktsiooni ei saa enne krüpteerimise võtme uuendamist kasutada."
+ },
+ "premiumMembership": {
+ "message": "Premium versioon"
+ },
+ "premiumManage": {
+ "message": "Halda Premium versiooni"
+ },
+ "premiumManageAlert": {
+ "message": "Saad Premium versiooni hallata bitwarden.com veebihoidlas. Soovid seda kohe teha?"
+ },
+ "premiumRefresh": {
+ "message": "Uuenda tellimust"
+ },
+ "premiumNotCurrentMember": {
+ "message": "Sa ei ole hetkel premium versiooni kasutaja."
+ },
+ "premiumSignUpAndGet": {
+ "message": "Premium versiooni lisab järgmised eelised:"
+ },
+ "ppremiumSignUpStorage": {
+ "message": "1 GB ulatuses krüpteeritud salvestusruum."
+ },
+ "ppremiumSignUpTwoStep": {
+ "message": "Lisavõimalused kaheastmeliseks kinnitamiseks, näiteks YubiKey, FIDO U2F ja Duo."
+ },
+ "ppremiumSignUpReports": {
+ "message": "Parooli hügieen, konto seisukord ja andmelekete raportid aitavad hoidlat turvalisena hoida."
+ },
+ "ppremiumSignUpTotp": {
+ "message": "TOTP kinnituskoodide (2FA) genereerija hoidlas olevatele kasutajakontodele."
+ },
+ "ppremiumSignUpSupport": {
+ "message": "Kiirema kasutajatoe."
+ },
+ "ppremiumSignUpFuture": {
+ "message": "Tulevased premium funktsioonid - tasuta!"
+ },
+ "premiumPurchase": {
+ "message": "Osta Premium"
+ },
+ "premiumPurchaseAlert": {
+ "message": "Bitwardeni premium versiooni saab osta bitwarden.com veebihoidlas. Avan veebihoidla?"
+ },
+ "premiumCurrentMember": {
+ "message": "Oled premium kasutaja!"
+ },
+ "premiumCurrentMemberThanks": {
+ "message": "Täname, et toetad Bitwardenit."
+ },
+ "premiumPrice": {
+ "message": "Kõik see ainult %price% aastas!",
+ "placeholders": {
+ "price": {
+ "content": "$1",
+ "example": "$10"
+ }
+ }
+ },
+ "refreshComplete": {
+ "message": "Uuendamine lõpetatud"
+ },
+ "disableAutoTotpCopy": {
+ "message": "Keela automaatne TOTP kopeerimine"
+ },
+ "disableAutoTotpCopyDesc": {
+ "message": "Kui sinu sisselogimise andmetele on juurde lisatud autentimise võti, kopeeritakse TOTP kood automaatse täitmise kasutamisel lõikelauale."
+ },
+ "disableAutoBiometricsPrompt": {
+ "message": "Ära küsi käivitudes biomeetrilist kinnitamist."
+ },
+ "premiumRequired": {
+ "message": "Vajalik on Premium versioon"
+ },
+ "premiumRequiredDesc": {
+ "message": "Selle funktsiooni kasutamiseks on vajalik tasulist kontot omada."
+ },
+ "enterVerificationCodeApp": {
+ "message": "Sisesta autentimise rakendusest 6 kohaline number."
+ },
+ "enterVerificationCodeEmail": {
+ "message": "Sisesta 6 kohaline number, mis saadeti e-posti aadressile",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "example@gmail.com"
+ }
+ }
+ },
+ "verificationCodeEmailSent": {
+ "message": "Kinnituskood saadeti e-posti aadressile $EMAIL$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "example@gmail.com"
+ }
+ }
+ },
+ "rememberMe": {
+ "message": "Jäta mind meelde"
+ },
+ "sendVerificationCodeEmailAgain": {
+ "message": "Saada kinnituskood uuesti e-postile"
+ },
+ "useAnotherTwoStepMethod": {
+ "message": "Kasuta teist kaheastmelist sisselogimise meetodit"
+ },
+ "insertYubiKey": {
+ "message": "Sisesta oma YubiKey arvuti USB porti ja kliki sellele nupule."
+ },
+ "insertU2f": {
+ "message": "Sisesta oma turvaline võti arvuti USB porti. Kui sellel on nupp, siis vajuta seda."
+ },
+ "webAuthnNewTab": {
+ "message": "Jätka WebAuthn 2FA kinnitamisega uuel vahelehel."
+ },
+ "webAuthnNewTabOpen": {
+ "message": "Ava uus vahekaart"
+ },
+ "webAuthnAuthenticate": {
+ "message": "WebAuthn kinnitamine"
+ },
+ "loginUnavailable": {
+ "message": "Sisselogimine ei ole saadaval"
+ },
+ "noTwoStepProviders": {
+ "message": "Sellel kontol on aktiveeritud kaheastmeline kinnitus. Siiski ei toeta konkreetne brauser ühtegi aktiveeritud kaheastmelise kinnitamise teenust."
+ },
+ "noTwoStepProviders2": {
+ "message": "Palun kasuta ühilduvat brauserit (näiteks Chrome) ja/või lisa uus kaheastmelise teenuse pakkuja, mis töötab rohkemates brauserites (näiteks mõni autentimise rakendus)."
+ },
+ "twoStepOptions": {
+ "message": "Kaheastmelise sisselogimise valikud"
+ },
+ "recoveryCodeDesc": {
+ "message": "Puudub ligipääs kaheastmelise kinnitamise teenusele? Kasuta Taastamise koodi, et kaheastmeline kinnitamine oma kontol välja lülitada."
+ },
+ "recoveryCodeTitle": {
+ "message": "Taastamise kood"
+ },
+ "authenticatorAppTitle": {
+ "message": "Autentimise rakendus"
+ },
+ "authenticatorAppDesc": {
+ "message": "Kausta autentimise rakendust (näiteks Authy või Google Authenticator), et luua ajal baseeruvaid kinnituskoode.",
+ "description": "'Authy' and 'Google Authenticator' are product names and should not be translated."
+ },
+ "yubiKeyTitle": {
+ "message": "YubiKey OTP Turvaline võti"
+ },
+ "yubiKeyDesc": {
+ "message": "Kasuta kontole ligipääsemiseks YubiKey-d. See töötab YubiKey 4, 4 Nano, 4C ja NEO seadmetega."
+ },
+ "duoDesc": {
+ "message": "Kinnita Duo Security abil, kasutades selleks Duo Mobile rakendust, SMS-i, telefonikõnet või U2F turvavõtit.",
+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
+ },
+ "duoOrganizationDesc": {
+ "message": "Kinnita organisatsiooni jaoks Duo Security abil, kasutades selleks Duo Mobile rakendust, SMS-i, telefonikõnet või U2F turvavõtit.",
+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
+ },
+ "webAuthnTitle": {
+ "message": "FIDO2 WebAuthn"
+ },
+ "webAuthnDesc": {
+ "message": "Kasuta mistahes WebAuthn toetavat turvalist võtit, et oma kontole ligi pääseda."
+ },
+ "emailTitle": {
+ "message": "E-post"
+ },
+ "emailDesc": {
+ "message": "Kinnituskoodid saadetakse e-postiga."
+ },
+ "selfHostedEnvironment": {
+ "message": "Self-hosted Environment"
+ },
+ "selfHostedEnvironmentFooter": {
+ "message": "Specify the base URL of your on-premise hosted Bitwarden installation."
+ },
+ "customEnvironment": {
+ "message": "Kohandatud keskkond"
+ },
+ "customEnvironmentFooter": {
+ "message": "For advanced users. You can specify the base URL of each service independently."
+ },
+ "baseUrl": {
+ "message": "Serveri URL"
+ },
+ "apiUrl": {
+ "message": "API serveri URL"
+ },
+ "webVaultUrl": {
+ "message": "Veebihoidla serveri URL"
+ },
+ "identityUrl": {
+ "message": "Identity Server URL"
+ },
+ "notificationsUrl": {
+ "message": "Teavitus serveri URL"
+ },
+ "iconsUrl": {
+ "message": "Ikoonide serveri URL"
+ },
+ "environmentSaved": {
+ "message": "The environment URLs have been saved."
+ },
+ "enableAutoFillOnPageLoad": {
+ "message": "Luba kontoandmete täitmine"
+ },
+ "enableAutoFillOnPageLoadDesc": {
+ "message": "Sisselogimise vormi tuvastamisel sisestatakse sinna kontoandmed automaatselt."
+ },
+ "experimentalFeature": {
+ "message": "See funktsioon on katsetusjärgus. Kasuta omal vastutusel."
+ },
+ "defaultAutoFillOnPageLoad": {
+ "message": "Vaikevalik kontoandmete täitmiseks"
+ },
+ "defaultAutoFillOnPageLoadDesc": {
+ "message": "\"Luba kontoandmete täitmine\" sisselülitamisel saad selle siiski individuaalselt iga kirje seadetes välja lülitada. See seadistus rakendub kõikidele kirjetele, mida pole eraldi konfigureeritud."
+ },
+ "itemAutoFillOnPageLoad": {
+ "message": "Luba kontoandmete täitmine (kui see on aktiveeritud)"
+ },
+ "autoFillOnPageLoadUseDefault": {
+ "message": "Kasuta vaikeseadistust"
+ },
+ "autoFillOnPageLoadYes": {
+ "message": "Täida kontoandmed lehe laadimisel"
+ },
+ "autoFillOnPageLoadNo": {
+ "message": "Ära täida kontoandmeid lehe laadimisel"
+ },
+ "commandOpenPopup": {
+ "message": "Ava hoidla uues aknas"
+ },
+ "commandOpenSidebar": {
+ "message": "Ava hoidla küljeribal"
+ },
+ "commandAutofillDesc": {
+ "message": "Sisesta lehele viimati kasutatud kontoandmed."
+ },
+ "commandGeneratePasswordDesc": {
+ "message": "Loo ja kopeeri uus juhuslikult koostatud parool lõikelauale."
+ },
+ "commandLockVaultDesc": {
+ "message": "Lukusta hoidla"
+ },
+ "privateModeMessage": {
+ "message": "Kahjuks ei toeta kasutatav brauser seda akent privaatses režiimis."
+ },
+ "customFields": {
+ "message": "Kohandatud väljad"
+ },
+ "copyValue": {
+ "message": "Kopeeri kirje"
+ },
+ "value": {
+ "message": "Väärtus"
+ },
+ "newCustomField": {
+ "message": "Uus kohandatud väli"
+ },
+ "dragToSort": {
+ "message": "Lohista sorteerimiseks"
+ },
+ "cfTypeText": {
+ "message": "Tekst"
+ },
+ "cfTypeHidden": {
+ "message": "Peidetud"
+ },
+ "cfTypeBoolean": {
+ "message": "Boolean"
+ },
+ "popup2faCloseMessage": {
+ "message": "See aken sulgub, kui klikid oma e-posti aknale, et sealt kinnituskoodi vaadata. Soovid selle hüpikakna uues aknas avada, et seda ei juhtuks?"
+ },
+ "popupU2fCloseMessage": {
+ "message": "Kasutatav brauser ei suuda selles aknas U2F päringuid töödelda. Kas avan uue akna, et saaksid U2F abil sisse logida?"
+ },
+ "disableFavicon": {
+ "message": "Keela veebilehel ikoonid"
+ },
+ "disableFaviconDesc": {
+ "message": "Ikoonid aitavad hoidlas olevaid veebilehti paremini ära tunda."
+ },
+ "disableBadgeCounter": {
+ "message": "Keela kirjete loendur"
+ },
+ "disableBadgeCounterDesc": {
+ "message": "Kirjete loendur kuvab Bitwardeni ikoonil konkreetse leheküljega seotud kirjete arvu."
+ },
+ "cardholderName": {
+ "message": "Kaardiomaniku nimi"
+ },
+ "number": {
+ "message": "Number"
+ },
+ "brand": {
+ "message": "Väljastaja"
+ },
+ "expirationMonth": {
+ "message": "Aegumise kuu"
+ },
+ "expirationYear": {
+ "message": "Aegumise aasta"
+ },
+ "expiration": {
+ "message": "Aegumine"
+ },
+ "january": {
+ "message": "Jaanuar"
+ },
+ "february": {
+ "message": "Veebruar"
+ },
+ "march": {
+ "message": "Märts"
+ },
+ "april": {
+ "message": "Aprill"
+ },
+ "may": {
+ "message": "Mai"
+ },
+ "june": {
+ "message": "Juuni"
+ },
+ "july": {
+ "message": "Juuli"
+ },
+ "august": {
+ "message": "August"
+ },
+ "september": {
+ "message": "September"
+ },
+ "october": {
+ "message": "Oktoober"
+ },
+ "november": {
+ "message": "November"
+ },
+ "december": {
+ "message": "Detsember"
+ },
+ "securityCode": {
+ "message": "Turvakood"
+ },
+ "ex": {
+ "message": "nt."
+ },
+ "title": {
+ "message": "Pealkiri"
+ },
+ "mr": {
+ "message": "Hr"
+ },
+ "mrs": {
+ "message": "Mrs"
+ },
+ "ms": {
+ "message": "Pr"
+ },
+ "dr": {
+ "message": "Dr"
+ },
+ "firstName": {
+ "message": "Eesnimi"
+ },
+ "middleName": {
+ "message": "Teine eesnimi"
+ },
+ "lastName": {
+ "message": "Perekonnanimi"
+ },
+ "identityName": {
+ "message": "Identiteedi nimi"
+ },
+ "company": {
+ "message": "Ettevõte"
+ },
+ "ssn": {
+ "message": "Isikukood"
+ },
+ "passportNumber": {
+ "message": "Passi number"
+ },
+ "licenseNumber": {
+ "message": "Litsentsi number"
+ },
+ "email": {
+ "message": "E-post"
+ },
+ "phone": {
+ "message": "Telefoninumber"
+ },
+ "address": {
+ "message": "Aadress"
+ },
+ "address1": {
+ "message": "Aadress 1"
+ },
+ "address2": {
+ "message": "Aadress 2"
+ },
+ "address3": {
+ "message": "Aadress 3"
+ },
+ "cityTown": {
+ "message": "Linn / asula"
+ },
+ "stateProvince": {
+ "message": "Maakond / vald"
+ },
+ "zipPostalCode": {
+ "message": "Postiindeks"
+ },
+ "country": {
+ "message": "Riik"
+ },
+ "type": {
+ "message": "Tüüp"
+ },
+ "typeLogin": {
+ "message": "Kasutajakonto andmed"
+ },
+ "typeLogins": {
+ "message": "Kontod"
+ },
+ "typeSecureNote": {
+ "message": "Turvaline märkus"
+ },
+ "typeCard": {
+ "message": "Pangakaart"
+ },
+ "typeIdentity": {
+ "message": "Identiteet"
+ },
+ "passwordHistory": {
+ "message": "Paroolide ajalugu"
+ },
+ "back": {
+ "message": "Tagasi"
+ },
+ "collections": {
+ "message": "Kogumikud"
+ },
+ "favorites": {
+ "message": "Lemmikud"
+ },
+ "popOutNewWindow": {
+ "message": "Ava uues aknas"
+ },
+ "refresh": {
+ "message": "Uuenda"
+ },
+ "cards": {
+ "message": "Pangakaardid"
+ },
+ "identities": {
+ "message": "Identiteedid"
+ },
+ "logins": {
+ "message": "Kontod"
+ },
+ "secureNotes": {
+ "message": "Turvalised märkmed"
+ },
+ "clear": {
+ "message": "Tühjenda",
+ "description": "To clear something out. example: To clear browser history."
+ },
+ "checkPassword": {
+ "message": "Vaata, kas parool on lekkinud."
+ },
+ "passwordExposed": {
+ "message": "See parool on erinevates andmeleketes kokku $VALUE$ korda lekkinud. Peaksid selle ära muutma.",
+ "placeholders": {
+ "value": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "passwordSafe": {
+ "message": "Seda parooli ei õnnestu andmeleketest leida. Parooli edasi kasutamine peaks olema turvaline."
+ },
+ "baseDomain": {
+ "message": "Baasdomeen"
+ },
+ "host": {
+ "message": "Host",
+ "description": "A URL's host value. For example, the host of https://sub.domain.com:443 is 'sub.domain.com:443'."
+ },
+ "exact": {
+ "message": "Täpne"
+ },
+ "startsWith": {
+ "message": "Algab"
+ },
+ "regEx": {
+ "message": "RegEx",
+ "description": "A programming term, also known as 'RegEx'."
+ },
+ "matchDetection": {
+ "message": "Sobivuse tuvastamine",
+ "description": "URI match detection for auto-fill."
+ },
+ "defaultMatchDetection": {
+ "message": "Vaike sobivuse tuvastamine",
+ "description": "Default URI match detection for auto-fill."
+ },
+ "toggleOptions": {
+ "message": "Valik sisse"
+ },
+ "toggleCurrentUris": {
+ "message": "Kuva praegused URI'd",
+ "description": "Toggle the display of the URIs of the currently open tabs in the browser."
+ },
+ "currentUri": {
+ "message": "Praegune URI",
+ "description": "The URI of one of the current open tabs in the browser."
+ },
+ "organization": {
+ "message": "Organisatsioon",
+ "description": "An entity of multiple related people (ex. a team or business organization)."
+ },
+ "types": {
+ "message": "Tüübid"
+ },
+ "allItems": {
+ "message": "Kõik kirjed"
+ },
+ "noPasswordsInList": {
+ "message": "Puuduvad paroolid, mida kuvada."
+ },
+ "remove": {
+ "message": "Eemalda"
+ },
+ "default": {
+ "message": "Vaikimisi"
+ },
+ "dateUpdated": {
+ "message": "Uuendatud",
+ "description": "ex. Date this item was updated"
+ },
+ "datePasswordUpdated": {
+ "message": "Parool on uuendatud",
+ "description": "ex. Date this password was updated"
+ },
+ "neverLockWarning": {
+ "message": "Oled kindel, et soovid kasutada valikut \"Mitte kunagi\"? Sellega talletatakse sinu hoidla krüpteerimise võtit seadme mälus. Peaksid olema väga hoolas ja kindel, et seade on ohutu ja selles ei ole pahavara."
+ },
+ "noOrganizationsList": {
+ "message": "Sa ei kuulu ühessegi organisatsiooni. Organisatsioonid võimaldavad sul kirjeid turvaliselt teiste kasutajatega jagada."
+ },
+ "noCollectionsInList": {
+ "message": "Puuduvad kollektsioonid, mida kuvada."
+ },
+ "ownership": {
+ "message": "Omanik"
+ },
+ "whoOwnsThisItem": {
+ "message": "Kes on selle kirje omanik?"
+ },
+ "strong": {
+ "message": "Tugev",
+ "description": "ex. A strong password. Scale: Weak -> Good -> Strong"
+ },
+ "good": {
+ "message": "Hea",
+ "description": "ex. A good password. Scale: Weak -> Good -> Strong"
+ },
+ "weak": {
+ "message": "Nõrk",
+ "description": "ex. A weak password. Scale: Weak -> Good -> Strong"
+ },
+ "weakMasterPassword": {
+ "message": "Nõrk ülemparool"
+ },
+ "weakMasterPasswordDesc": {
+ "message": "Valitud ülemparool on nõrk. Oma Bitwardeni konto paremaks kaitsmiseks peaksid kasutama tugevat parooli. Oled kindel, et soovid seda parooli ülemparoolina kasutada?"
+ },
+ "pin": {
+ "message": "PIN",
+ "description": "PIN code. Ex. The short code (often numeric) that you use to unlock a device."
+ },
+ "unlockWithPin": {
+ "message": "Ava PIN-iga"
+ },
+ "setYourPinCode": {
+ "message": "Määra Bitwardeni lahtilukustamiseks PIN kood. Rakendusest täielikult välja logides nullitakse ka PIN koodi seaded."
+ },
+ "pinRequired": {
+ "message": "Nõutakse PIN koodi."
+ },
+ "invalidPin": {
+ "message": "Vale PIN kood."
+ },
+ "verifyPin": {
+ "message": "Kinnita PIN koodiga"
+ },
+ "yourVaultIsLockedPinCode": {
+ "message": "Hoidla on lukus. Jätkamiseks sisesta PIN kood."
+ },
+ "unlockWithBiometrics": {
+ "message": "Ava biomeetriaga"
+ },
+ "awaitDesktop": {
+ "message": "Kinnituse ootamine töölaua rakenduselt"
+ },
+ "awaitDesktopDesc": {
+ "message": "Kinnitamiseks kasuta biomeetrilist lahtilukustamist Bitwardeni töölaua rakenduses."
+ },
+ "lockWithMasterPassOnRestart": {
+ "message": "Nõua ülemparooli, kui brauser taaskäivitatakse"
+ },
+ "selectOneCollection": {
+ "message": "Pead valima vähemalt ühe kogumiku."
+ },
+ "cloneItem": {
+ "message": "Klooni kirje"
+ },
+ "clone": {
+ "message": "Kloon"
+ },
+ "passwordGeneratorPolicyInEffect": {
+ "message": "Organisatsiooni seaded mõjutavad parooli genereerija sätteid."
+ },
+ "vaultTimeoutAction": {
+ "message": "Hoidla ajalõpu tegevus"
+ },
+ "lock": {
+ "message": "Lukusta",
+ "description": "Verb form: to make secure or inaccesible by"
+ },
+ "trash": {
+ "message": "Prügikast",
+ "description": "Noun: a special folder to hold deleted items"
+ },
+ "searchTrash": {
+ "message": "Otsi prügikastist"
+ },
+ "permanentlyDeleteItem": {
+ "message": "Kustuta kirje jäädavalt"
+ },
+ "permanentlyDeleteItemConfirmation": {
+ "message": "Oled kindel, et soovid selle kirje jäädavalt kustutada?"
+ },
+ "permanentlyDeletedItem": {
+ "message": "Kirje on jäädavalt kustutatud"
+ },
+ "restoreItem": {
+ "message": "Taasta kirje"
+ },
+ "restoreItemConfirmation": {
+ "message": "Oled kindel, et soovid selle kirje taastada?"
+ },
+ "restoredItem": {
+ "message": "Kirje on taastatud"
+ },
+ "vaultTimeoutLogOutConfirmation": {
+ "message": "Väljalogimine eemaldab hoidlale ligipääsu ning nõuab pärast ajalõpu perioodi uuesti autentimist. Oled kindel, et soovid seda valikut kasutada?"
+ },
+ "vaultTimeoutLogOutConfirmationTitle": {
+ "message": "Ajalõpu tegevuse kinnitamine"
+ },
+ "autoFillAndSave": {
+ "message": "Täida ja salvesta"
+ },
+ "autoFillSuccessAndSavedUri": {
+ "message": "Kirje täideti ja URI salvestati"
+ },
+ "autoFillSuccess": {
+ "message": "Kirje täideti"
+ },
+ "setMasterPassword": {
+ "message": "Määra ülemparool"
+ },
+ "masterPasswordPolicyInEffect": {
+ "message": "Üks või enam organisatsiooni eeskirja nõuavad, et ülemparool vastaks nendele nõudmistele:"
+ },
+ "policyInEffectMinComplexity": {
+ "message": "Minimaalne keerulisuse skoor peab olema $SCORE$",
+ "placeholders": {
+ "score": {
+ "content": "$1",
+ "example": "4"
+ }
+ }
+ },
+ "policyInEffectMinLength": {
+ "message": "Minimaalne pikkus peab olema $LENGTH$",
+ "placeholders": {
+ "length": {
+ "content": "$1",
+ "example": "14"
+ }
+ }
+ },
+ "policyInEffectUppercase": {
+ "message": "Sisaldab üht või enamat suurtähte"
+ },
+ "policyInEffectLowercase": {
+ "message": "Sisaldab üht või enamat väiketähte"
+ },
+ "policyInEffectNumbers": {
+ "message": "Sisaldab üht või rohkem numbreid"
+ },
+ "policyInEffectSpecial": {
+ "message": "Sisaldab üht või enamat järgnevatest märkidest: $CHARS$",
+ "placeholders": {
+ "chars": {
+ "content": "$1",
+ "example": "!@#$%^&*"
+ }
+ }
+ },
+ "masterPasswordPolicyRequirementsNotMet": {
+ "message": "Uus ülemparool ei vasta eeskirjades väljatoodud tingimustele."
+ },
+ "acceptPolicies": {
+ "message": "Märkeruudu markeerimisel nõustud järgnevaga:"
+ },
+ "acceptPoliciesError": {
+ "message": "Kasutustingimuste ja Privaatsuspoliitikaga pole nõustutud."
+ },
+ "termsOfService": {
+ "message": "Kasutustingimused"
+ },
+ "privacyPolicy": {
+ "message": "Privaatsuspoliitika"
+ },
+ "hintEqualsPassword": {
+ "message": "Parooli vihje ei saa olla sama mis parool ise."
+ },
+ "ok": {
+ "message": "Ok"
+ },
+ "desktopSyncVerificationTitle": {
+ "message": "Töölaua sünkroonimise kinnitamine"
+ },
+ "desktopIntegrationVerificationText": {
+ "message": "Veendu, et töölaua rakendus kuvab järgnevat sõrmejälge: "
+ },
+ "desktopIntegrationDisabledTitle": {
+ "message": "Brauseri integratsioon ei ole sisse lülitatud"
+ },
+ "desktopIntegrationDisabledDesc": {
+ "message": "Brauseri integratsioon ei ole Bitwardeni töölaua rakenduses sisse lülitatud. Palun lülita see töölaua rakenduse seadetes sisse."
+ },
+ "startDesktopTitle": {
+ "message": "Käivita Bitwardeni töölaua rakendus"
+ },
+ "startDesktopDesc": {
+ "message": "Enne selle funktsiooni sisselülitamist peab käivitama Bitwardeni töölaua rakenduse."
+ },
+ "errorEnableBiometricTitle": {
+ "message": "Biomeetria sisselülitamine nurjus"
+ },
+ "errorEnableBiometricDesc": {
+ "message": "Töölaua rakendus tühistas tegevuse"
+ },
+ "nativeMessagingInvalidEncryptionDesc": {
+ "message": "Töölaua rakendusel ei õnnestunud turvalist ühenduskanalit luua. Palun proovi uuesti"
+ },
+ "nativeMessagingInvalidEncryptionTitle": {
+ "message": "Suhtlus töölaua rakendusega katkes"
+ },
+ "nativeMessagingWrongUserDesc": {
+ "message": "Töölaua rakenduses on sisse logitud teise kasutajaga. Veendu, et oled mõlemas rakenduses sisse loginud ühe ja sama kontoga."
+ },
+ "nativeMessagingWrongUserTitle": {
+ "message": "Kontod ei ühti"
+ },
+ "biometricsNotEnabledTitle": {
+ "message": "Biomeetria ei ole sisse lülitatud"
+ },
+ "biometricsNotEnabledDesc": {
+ "message": "Biomeetria kasutamiseks brauseris peab esmalt Bitwardeni töölaua rakenduse seadetes biomeetria lubama."
+ },
+ "biometricsNotSupportedTitle": {
+ "message": "Biomeetriat ei toetata"
+ },
+ "biometricsNotSupportedDesc": {
+ "message": "Brauseri biomeetria ei ole selles seadmes toetatud"
+ },
+ "nativeMessaginPermissionErrorTitle": {
+ "message": "Luba puudub"
+ },
+ "nativeMessaginPermissionErrorDesc": {
+ "message": "Puudub luba, et suhelda Bitwardeni töölaua rakendusega. Selle tõttu ei saa brauseri lisas biomeetriat kasutada. Palun proovi uuesti."
+ },
+ "nativeMessaginPermissionSidebarTitle": {
+ "message": "Loa taotlemisel ilmnes viga"
+ },
+ "nativeMessaginPermissionSidebarDesc": {
+ "message": "Seda tegevust ei saa küljeribal sooritada. Proovi seda sooritada hüpikakna vaates."
+ },
+ "personalOwnershipSubmitError": {
+ "message": "Ettevõtte poliitika tõttu ei saa sa andmeid oma personaalsesse Hoidlasse salvestada. Vali Omanikuks organisatsioon ja vali mõni saadavaolevatest Kogumikest."
+ },
+ "personalOwnershipPolicyInEffect": {
+ "message": "Organisatsiooni poliitika on seadnud omaniku valikutele piirangu."
+ },
+ "excludedDomains": {
+ "message": "Väljajäetud domeenid"
+ },
+ "excludedDomainsDesc": {
+ "message": "Nendel domeenidel Bitwarden paroolide salvestamise valikut ei paku. Muudatuste jõustamiseks pead lehekülge värskendama."
+ },
+ "excludedDomainsInvalidDomain": {
+ "message": "$DOMAIN$ ei ole õige domeen.",
+ "placeholders": {
+ "domain": {
+ "content": "$1",
+ "example": "googlecom"
+ }
+ }
+ },
+ "send": {
+ "message": "Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "searchSends": {
+ "message": "Otsi Sende",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "addSend": {
+ "message": "Lisa Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTypeText": {
+ "message": "Tekst"
+ },
+ "sendTypeFile": {
+ "message": "Fail"
+ },
+ "allSends": {
+ "message": "Kõik Sendid",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "maxAccessCountReached": {
+ "message": "Maksimaalne ligipääsude arv on saavutatud"
+ },
+ "expired": {
+ "message": "Aegunud"
+ },
+ "pendingDeletion": {
+ "message": "Kustutamise ootel"
+ },
+ "passwordProtected": {
+ "message": "Parooliga kaitstud"
+ },
+ "copySendLink": {
+ "message": "Kopeeri Sendi link",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "removePassword": {
+ "message": "Eemalda parool"
+ },
+ "delete": {
+ "message": "Kustuta"
+ },
+ "removedPassword": {
+ "message": "Eemaldas parooli"
+ },
+ "deletedSend": {
+ "message": "Kustutas Sendi",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendLink": {
+ "message": "Sendi link",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "disabled": {
+ "message": "Keelatud"
+ },
+ "removePasswordConfirmation": {
+ "message": "Soovid kindlasti selle parooli eemaldada?"
+ },
+ "deleteSend": {
+ "message": "Kustuta Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "deleteSendConfirmation": {
+ "message": "Soovid tõesti selle Sendi kustutada?",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "editSend": {
+ "message": "Muuda Sendi",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTypeHeader": {
+ "message": "Mis tüüpi Send see on?",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendNameDesc": {
+ "message": "Sisesta Sendi nimi (kohustuslik).",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendFileDesc": {
+ "message": "Fail, mida soovid saata."
+ },
+ "deletionDate": {
+ "message": "Kustutamise kuupäev"
+ },
+ "deletionDateDesc": {
+ "message": "Send kustutatakse määratud kuupäeval ja kellaajal jäädavalt.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "expirationDate": {
+ "message": "Aegumiskuupäev"
+ },
+ "expirationDateDesc": {
+ "message": "Selle valimisel ei pääse sellele Sendile enam pärast määratud kuupäeva ligi.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "oneDay": {
+ "message": "1 päev"
+ },
+ "days": {
+ "message": "$DAYS$ päeva",
+ "placeholders": {
+ "days": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "custom": {
+ "message": "Kohandatud"
+ },
+ "maximumAccessCount": {
+ "message": "Maksimaalne ligipääsude arv"
+ },
+ "maximumAccessCountDesc": {
+ "message": "Selle valimisel ei saa kasutajad pärast maksimaalse ligipääsude arvu saavutamist sellele Sendile enam ligi.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendPasswordDesc": {
+ "message": "Soovi korral nõua parooli, millega Sendile ligi pääseb.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendNotesDesc": {
+ "message": "Privaatne märkus selle Sendi kohta.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendDisableDesc": {
+ "message": "Keela see Send, et keegi ei pääseks sellele ligi.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendShareDesc": {
+ "message": "Kopeeri Sendi salvestamisel link lõikelauale.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTextDesc": {
+ "message": "Tekst, mida soovid saata."
+ },
+ "sendHideText": {
+ "message": "Vaikeolekus peida selle Sendi tekst.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "currentAccessCount": {
+ "message": "Hetkeline ligipääsude arv"
+ },
+ "createSend": {
+ "message": "Loo uus Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "newPassword": {
+ "message": "Uus Parool"
+ },
+ "sendDisabled": {
+ "message": "Send on väljalülitatud",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendDisabledWarning": {
+ "message": "Ettevõtte poliitika kohaselt saad ainult olemasolevat Sendi kustutada.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "createdSend": {
+ "message": "Send on loodud",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "editedSend": {
+ "message": "Muudetud",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendLinuxChromiumFileWarning": {
+ "message": "Faili valimiseks ava rakendus külgribal (kui see on võimalik) või kasuta hüpikakent, klikkides sellel bänneril."
+ },
+ "sendFirefoxFileWarning": {
+ "message": "Faili valimiseks läbi Firefoxi ava Bitwardeni rakendus Firefoxi külgribal või kasuta hüpikakent (klikkides sellel bänneril)."
+ },
+ "sendSafariFileWarning": {
+ "message": "Faili valimiseks läbi Safari kasuta Bitwardeni hüpikakent (klikkides sellel bänneril)."
+ },
+ "sendFileCalloutHeader": {
+ "message": "Enne alustamist"
+ },
+ "sendFirefoxCustomDatePopoutMessage1": {
+ "message": "Kalendri stiilis kuupäeva valimiseks",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read '**To use a calendar style date picker ** click here to pop out your window.'"
+ },
+ "sendFirefoxCustomDatePopoutMessage2": {
+ "message": "kliki siia,",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker **click here** to pop out your window.'"
+ },
+ "sendFirefoxCustomDatePopoutMessage3": {
+ "message": "et avada Bitwarden uues aknas.",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker click here **to pop out your window.**'"
+ },
+ "expirationDateIsInvalid": {
+ "message": "Valitud aegumiskuupäev ei ole õige."
+ },
+ "deletionDateIsInvalid": {
+ "message": "Valitud kustutamise kuupäev ei ole õige."
+ },
+ "expirationDateAndTimeRequired": {
+ "message": "Nõutav on aegumiskuupäev ja kellaaeg."
+ },
+ "deletionDateAndTimeRequired": {
+ "message": "Nõutav on kustutamise kuupäev ja kellaaeg."
+ },
+ "dateParsingError": {
+ "message": "Kustutamis- ja aegumiskuupäevade salvestamisel ilmnes tõrge."
+ },
+ "hideEmail": {
+ "message": "Ära näita saajatele minu e-posti aadressi."
+ },
+ "sendOptionsPolicyInEffect": {
+ "message": "Organisatsiooni seaded mõjutavad sinu Sendi sätteid."
+ },
+ "passwordPrompt": {
+ "message": "Nõutav on ülemparool"
+ },
+ "passwordConfirmation": {
+ "message": "Ülemparooli kinnitamine"
+ },
+ "passwordConfirmationDesc": {
+ "message": "See tegevus on kaitstud. Jätkamiseks sisesta oma ülemparool."
+ },
+ "emailVerificationRequired": {
+ "message": "Vajalik on e-posti kinnitamine"
+ },
+ "emailVerificationRequiredDesc": {
+ "message": "Selle funktsiooni kasutamiseks pead kinnitama oma e-posti aadressi. Saad seda teha veebihoidlas."
+ },
+ "updatedMasterPassword": {
+ "message": "Uuendas ülemparooli"
+ },
+ "updateMasterPassword": {
+ "message": "Ülemparooli uuendamine"
+ },
+ "updateMasterPasswordWarning": {
+ "message": "Organisatsiooni administraator muutis hiljuti sinu ülemparooli. Hoidlale ligi pääsemiseks pead seda nüüd uuendama. Jätkates logitakse sind käimasolevast sessioonist välja, misjärel nõutakse uuesti sisselogimist. Teistes seadmetes olevad aktiivsed sessioonid jäävad aktiivseks kuni üheks tunniks."
+ },
+ "resetPasswordPolicyAutoEnroll": {
+ "message": "Automaatne liitumine"
+ },
+ "resetPasswordAutoEnrollInviteWarning": {
+ "message": "Selle organisatsiooni poliitika kohaselt liidetakse sind automaatselt ülemparooli lähtestamise funktsiooniga. Liitumisel saavad organisatsiooni administraatorid sinu ülemparooli muuta."
+ },
+ "selectFolder": {
+ "message": "Vali kaust..."
+ },
+ "ssoCompleteRegistration": {
+ "message": "SSO-ga sisselogimise kinnitamiseks tuleb määrata ülemparool. See kaitseb sinu hoidlat ning võimaldab sellele ligi pääseda."
+ },
+ "hours": {
+ "message": "Tundi"
+ },
+ "minutes": {
+ "message": "Minutit"
+ },
+ "vaultTimeoutPolicyInEffect": {
+ "message": "Organisatsiooni poliitikad mõjutavad sinu hoidla ajalõppu. Maksimaalne lubatud hoidla ajalõpp on $HOURS$ tund(i) ja $MINUTES$ minut(it)",
+ "placeholders": {
+ "hours": {
+ "content": "$1",
+ "example": "5"
+ },
+ "minutes": {
+ "content": "$2",
+ "example": "5"
+ }
+ }
+ },
+ "vaultTimeoutToLarge": {
+ "message": "Valitud hoidla ajalõpp ei ole organisatsiooni poolt määratud reeglitega kooskõlas. "
+ },
+ "vaultExportDisabled": {
+ "message": "Hoidla eksportimine on väljalülitatud"
+ },
+ "personalVaultExportPolicyInEffect": {
+ "message": "Üks või enam organisatsiooni poliitikat ei võimalda sul oma personaalset hoidlat eksportida."
+ },
+ "copyCustomFieldNameInvalidElement": {
+ "message": "Korrektset välja nime ei õnnestunud tuvastada. Proovi HTML koodi inspekteerimist."
+ },
+ "copyCustomFieldNameNotUnique": {
+ "message": "Unikaalset identifikaatorit ei leitud."
+ }
+}
diff --git a/src/iOS.Safari/Resources/_locales/fa/messages.json b/src/iOS.Safari/Resources/_locales/fa/messages.json
new file mode 100644
index 000000000..672092780
--- /dev/null
+++ b/src/iOS.Safari/Resources/_locales/fa/messages.json
@@ -0,0 +1,1817 @@
+{
+ "appName": {
+ "message": "Bitwarden"
+ },
+ "extName": {
+ "message": "Bitwarden - مدیریت کلمه عبور رایگان",
+ "description": "Extension name, MUST be less than 40 characters (Safari restriction)"
+ },
+ "extDesc": {
+ "message": "یک مدیریت کننده کلمه عبور رایگان برای تمامی دستگاههایتان.",
+ "description": "Extension description"
+ },
+ "loginOrCreateNewAccount": {
+ "message": "وارد شوید یا یک حساب کاربری بسازید تا به گاوصندوق امنتان دسترسی یابید."
+ },
+ "createAccount": {
+ "message": "ایجاد حساب کاربری"
+ },
+ "login": {
+ "message": "ورود"
+ },
+ "enterpriseSingleSignOn": {
+ "message": "ورود به سیستم پروژه"
+ },
+ "cancel": {
+ "message": "انصراف"
+ },
+ "close": {
+ "message": "بستن"
+ },
+ "submit": {
+ "message": "ثبت"
+ },
+ "emailAddress": {
+ "message": "آدرس ایمیل"
+ },
+ "masterPass": {
+ "message": "کلمه عبور اصلی"
+ },
+ "masterPassDesc": {
+ "message": "کلمه عبور اصلی کلمه عبوری است که شما برای دسترسی به گاوصندوق خود استفاده میکنید. بیاد داشتن کلمه عبور اصلی بسیار اهمیت دارد. اگر فراموشش کنید هیچ راهی برای بازگردانی آن وجود ندارد."
+ },
+ "masterPassHintDesc": {
+ "message": "راهنمای کلمه عبور اصلی می تواند در صورت فراموشی آن را بیاد بیارید."
+ },
+ "reTypeMasterPass": {
+ "message": "تایپ دوباره کلمه عبور اصلی"
+ },
+ "masterPassHint": {
+ "message": "راهنمای کلمه عبور اصلی (اختیاری)"
+ },
+ "tab": {
+ "message": "زبانه"
+ },
+ "myVault": {
+ "message": "گاوصندوق من"
+ },
+ "tools": {
+ "message": "ابزار"
+ },
+ "settings": {
+ "message": "تنظیمات"
+ },
+ "currentTab": {
+ "message": "زبانه فعلی"
+ },
+ "copyPassword": {
+ "message": "کپی رمز عبور"
+ },
+ "copyNote": {
+ "message": "کپی یادداشت"
+ },
+ "copyUri": {
+ "message": "کپی آدرس اینترنتی"
+ },
+ "copyUsername": {
+ "message": "کپی نام کاربری"
+ },
+ "copyNumber": {
+ "message": "کپی شماره"
+ },
+ "copySecurityCode": {
+ "message": "کپی کد امنیتی"
+ },
+ "autoFill": {
+ "message": "پر کردن خودکار"
+ },
+ "generatePasswordCopied": {
+ "message": "ساخت کلمه عبور (کپی شد)"
+ },
+ "copyElementIdentifier": {
+ "message": "رونوشت نام فیلد سفارشی"
+ },
+ "noMatchingLogins": {
+ "message": "ورودیها منتطبق نیست."
+ },
+ "vaultLocked": {
+ "message": "گاوصندوق قفل شد."
+ },
+ "vaultLoggedOut": {
+ "message": "گاوصندوق خارج شده است."
+ },
+ "autoFillInfo": {
+ "message": "پرکردن خودکار برای برگه فعلی مرورگر در دسترس نیست."
+ },
+ "addLogin": {
+ "message": "افزودن ورود جدید"
+ },
+ "addItem": {
+ "message": "افزودن مورد"
+ },
+ "passwordHint": {
+ "message": "راهنمای کلمه عبور"
+ },
+ "enterEmailToGetHint": {
+ "message": "برای دریافت راهنمایی کلمه عبور اصلی خود آدرس ایملیتان را وارد کنید."
+ },
+ "getMasterPasswordHint": {
+ "message": "دریافت راهنمای کلمه عبور اصلی"
+ },
+ "continue": {
+ "message": "ادامه"
+ },
+ "verificationCode": {
+ "message": "کد تایید"
+ },
+ "account": {
+ "message": "حساب"
+ },
+ "changeMasterPassword": {
+ "message": "تغییر کلمه عبور اصلی"
+ },
+ "fingerprintPhrase": {
+ "message": "عبارت اثر انگشت",
+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
+ },
+ "yourAccountsFingerprint": {
+ "message": "عبارت اثر انگشت حساب شما",
+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
+ },
+ "twoStepLogin": {
+ "message": "ورود دو مرحله ای"
+ },
+ "logOut": {
+ "message": "خروج"
+ },
+ "about": {
+ "message": "درباره ما"
+ },
+ "version": {
+ "message": "نسخه"
+ },
+ "save": {
+ "message": "ذخیره"
+ },
+ "move": {
+ "message": "انتقال"
+ },
+ "addFolder": {
+ "message": "افزودن پوشه"
+ },
+ "name": {
+ "message": "نام"
+ },
+ "editFolder": {
+ "message": "ويرايش پوشه"
+ },
+ "deleteFolder": {
+ "message": "حذف پوشه"
+ },
+ "folders": {
+ "message": "پوشه ها"
+ },
+ "noFolders": {
+ "message": "هیچ موردی برای نمایش وجود ندارد."
+ },
+ "helpFeedback": {
+ "message": "کمک و بازخورد"
+ },
+ "sync": {
+ "message": "همگام سازی"
+ },
+ "syncVaultNow": {
+ "message": "همگام سازی گاوصندوق"
+ },
+ "lastSync": {
+ "message": "آخرین همگام سازی:"
+ },
+ "passGen": {
+ "message": "تولید کلمه عبور"
+ },
+ "generator": {
+ "message": "تولید کننده",
+ "description": "Short for 'Password Generator'."
+ },
+ "passGenInfo": {
+ "message": "به طور خودکار کلمه های عبور قوی و منحصر به فرد برای ورود به سیستم خود ایجاد کنید."
+ },
+ "bitWebVault": {
+ "message": "گاوصندوق وب Bitwarden"
+ },
+ "importItems": {
+ "message": "واردن کردن موارد"
+ },
+ "select": {
+ "message": "انتخاب"
+ },
+ "generatePassword": {
+ "message": "تولید کلمه عبور"
+ },
+ "regeneratePassword": {
+ "message": "تولید مجدد کلمه عبور"
+ },
+ "options": {
+ "message": "گزینه ها"
+ },
+ "length": {
+ "message": "طول"
+ },
+ "numWords": {
+ "message": "تعداد کلمات"
+ },
+ "wordSeparator": {
+ "message": "کلمه جداکننده"
+ },
+ "capitalize": {
+ "message": "بزرگ کردن",
+ "description": "Make the first letter of a work uppercase."
+ },
+ "includeNumber": {
+ "message": "شامل عدد"
+ },
+ "minNumbers": {
+ "message": "حداقل اعداد"
+ },
+ "minSpecial": {
+ "message": "حداقل حرف خاص"
+ },
+ "avoidAmbChar": {
+ "message": "از کاراکترهای مبهم اجتناب شود"
+ },
+ "searchVault": {
+ "message": "جستجوی گاوصندوق"
+ },
+ "edit": {
+ "message": "ویرایش"
+ },
+ "view": {
+ "message": "مشاهده"
+ },
+ "noItemsInList": {
+ "message": "هیچ موردی برای نمایش وجود ندارد."
+ },
+ "itemInformation": {
+ "message": "اطلاعات مورد"
+ },
+ "username": {
+ "message": "نام کاربری"
+ },
+ "password": {
+ "message": "کلمه عبور"
+ },
+ "passphrase": {
+ "message": "کلمه عبور"
+ },
+ "favorite": {
+ "message": "مورد علاقه"
+ },
+ "notes": {
+ "message": "یادداشت ها"
+ },
+ "note": {
+ "message": "یادداشت"
+ },
+ "editItem": {
+ "message": "ویرایش مورد"
+ },
+ "folder": {
+ "message": "پوشه"
+ },
+ "deleteItem": {
+ "message": "حذف مورد"
+ },
+ "viewItem": {
+ "message": "مشاهده مورد"
+ },
+ "launch": {
+ "message": "راه اندازی"
+ },
+ "website": {
+ "message": "وب سایت"
+ },
+ "toggleVisibility": {
+ "message": "تغییر قابلیت نمایش"
+ },
+ "manage": {
+ "message": "مدیریت"
+ },
+ "other": {
+ "message": "ساير"
+ },
+ "rateExtension": {
+ "message": "به این افزونه امتیاز دهید"
+ },
+ "rateExtensionDesc": {
+ "message": "لطفاً با یک بررسی خوب به ما کمک کنید!"
+ },
+ "browserNotSupportClipboard": {
+ "message": "مرورگر شما از کپی کلیپ بورد آسان پشتیبانی نمی کند. به جای آن به صورت دستی کپی کنید."
+ },
+ "verifyMasterPassword": {
+ "message": "تایید کلمه عبور اصلی"
+ },
+ "yourVaultIsLocked": {
+ "message": "گاوصندوق شما قفل است. برای ادامه کلمه عبور اصلی خود را وارد کنید."
+ },
+ "unlock": {
+ "message": "بازکردن"
+ },
+ "loggedInAsOn": {
+ "message": "وارد شده با $EMAIL$ در $HOSTNAME$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "name@example.com"
+ },
+ "hostname": {
+ "content": "$2",
+ "example": "bitwarden.com"
+ }
+ }
+ },
+ "invalidMasterPassword": {
+ "message": "کلمه عبور اصلی نامعتبر است"
+ },
+ "vaultTimeout": {
+ "message": "متوقف شدن گاوصندوق"
+ },
+ "lockNow": {
+ "message": "الان قفل شود"
+ },
+ "immediately": {
+ "message": "بلافاصله"
+ },
+ "tenSeconds": {
+ "message": "۱۰ ثانیه"
+ },
+ "twentySeconds": {
+ "message": "۲۰ ثانیه"
+ },
+ "thirtySeconds": {
+ "message": "۳۰ ثانیه"
+ },
+ "oneMinute": {
+ "message": "۱ دقیقه"
+ },
+ "twoMinutes": {
+ "message": "۲ دقیقه"
+ },
+ "fiveMinutes": {
+ "message": "۵ دقیقه"
+ },
+ "fifteenMinutes": {
+ "message": "۱۵ دقیقه"
+ },
+ "thirtyMinutes": {
+ "message": "۳۰ دقیقه"
+ },
+ "oneHour": {
+ "message": "۱ ساعت"
+ },
+ "fourHours": {
+ "message": "4 ساعت"
+ },
+ "onLocked": {
+ "message": "هنگام قفل سیستم"
+ },
+ "onRestart": {
+ "message": "هنگام راه اندازی مجدد"
+ },
+ "never": {
+ "message": "هرگز"
+ },
+ "security": {
+ "message": "امنیت"
+ },
+ "errorOccurred": {
+ "message": "خطایی رخ داده است"
+ },
+ "emailRequired": {
+ "message": "آدرس ایمیل ضروری است."
+ },
+ "invalidEmail": {
+ "message": "آدرس ایمیل نامعتبر است."
+ },
+ "masterPassRequired": {
+ "message": "کلمه عبور اصلی ضروری است."
+ },
+ "masterPassLength": {
+ "message": "طول کلمه عبور اصلی باید حداقل ۸ کاراکتر باشد."
+ },
+ "masterPassDoesntMatch": {
+ "message": "کلمه عبور اصلی با تکرار کلمه عبور اصلی مطابقت ندارد."
+ },
+ "newAccountCreated": {
+ "message": "حساب شما ساختته شد! حالا میتوانید وارد شوید."
+ },
+ "masterPassSent": {
+ "message": "ما یک ایمیل همراه با راهنمای کلمه عبور اصلی برایتان ارسال کردیم."
+ },
+ "verificationCodeRequired": {
+ "message": "کد تایید مورد نیاز است."
+ },
+ "valueCopied": {
+ "message": " کپی شده",
+ "description": "Value has been copied to the clipboard.",
+ "placeholders": {
+ "value": {
+ "content": "$1",
+ "example": "Password"
+ }
+ }
+ },
+ "autofillError": {
+ "message": "ناتوان در پرکردن خودکار آیتم انتخاب شده در این صفحه. اطلاعات را کپی و جایگذاری کنید."
+ },
+ "loggedOut": {
+ "message": "خارج شده"
+ },
+ "loginExpired": {
+ "message": "جلسه ورود شما منقضی شده است."
+ },
+ "logOutConfirmation": {
+ "message": "آیا مطمئنید که میخواهید خارج شوید؟"
+ },
+ "yes": {
+ "message": "بله"
+ },
+ "no": {
+ "message": "خیر"
+ },
+ "unexpectedError": {
+ "message": "یک خطای غیر منتظره رخ داده است."
+ },
+ "nameRequired": {
+ "message": "نام ضروری است."
+ },
+ "addedFolder": {
+ "message": "پوشه اضافه شده"
+ },
+ "changeMasterPass": {
+ "message": "تغییر کلمه عبور اصلی"
+ },
+ "changeMasterPasswordConfirmation": {
+ "message": "شما میتوانید کلمه عبور اصلی خود را در bitwarden.com تغییر دهید. آیا میخواهید از سایت بازدید کنید؟"
+ },
+ "twoStepLoginConfirmation": {
+ "message": "ورودی دو مرحله ای باعث می شود که حساب کاربری شما با استفاده از یک دستگاه دیگر مانند کلید امنیتی، برنامه تأیید هویت، پیامک، تماس تلفنی و یا ایمیل، اعتبار خود را با ایمنی بیشتر ثابت کند. ورودی دو مرحله ای می تواند در bitwarden.com فعال شود. آیا می خواهید از سایت بازدید کنید؟"
+ },
+ "editedFolder": {
+ "message": "پوشه ویرایش شده"
+ },
+ "deleteFolderConfirmation": {
+ "message": "آیا از حذف این پوشه اطمینان دارید؟"
+ },
+ "deletedFolder": {
+ "message": "پوشه حذف شده"
+ },
+ "gettingStartedTutorial": {
+ "message": "آغاز نمودن آموزش"
+ },
+ "gettingStartedTutorialVideo": {
+ "message": "برای یادگیری بیشتر نحوه استفاده از افزونه مرورگر آموزش شروع به کار را تماشا کنید."
+ },
+ "syncingComplete": {
+ "message": "همگام سازی کامل شد"
+ },
+ "syncingFailed": {
+ "message": "همگام سازی شکست خورد"
+ },
+ "passwordCopied": {
+ "message": "کلمه عبور کپی شد"
+ },
+ "uri": {
+ "message": "نشانی اینترنتی"
+ },
+ "uriPosition": {
+ "message": "آدرس اینترنتی $POSITION$",
+ "description": "A listing of URIs. Ex: URI 1, URI 2, URI 3, etc.",
+ "placeholders": {
+ "position": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "newUri": {
+ "message": "آدرس اینترنتی جدید"
+ },
+ "addedItem": {
+ "message": "مورد افزوده شده"
+ },
+ "editedItem": {
+ "message": "مورد ویرایش شده"
+ },
+ "deleteItemConfirmation": {
+ "message": "آیا مطمئن هستید می خواهید این مورد را حذف کنید؟"
+ },
+ "deletedItem": {
+ "message": "مورد حذف شده"
+ },
+ "overwritePassword": {
+ "message": "بازنویسی کلمه عبور"
+ },
+ "overwritePasswordConfirmation": {
+ "message": "آیا از بازنویسی بر روی پسورد فعلی مطمئن هستید؟"
+ },
+ "searchFolder": {
+ "message": "جستجوی پوشه"
+ },
+ "searchCollection": {
+ "message": "جستجوی مجموعه"
+ },
+ "searchType": {
+ "message": "نوع جستجو"
+ },
+ "noneFolder": {
+ "message": "بدون پوشه",
+ "description": "This is the folder for uncategorized items"
+ },
+ "disableAddLoginNotification": {
+ "message": "غیرفعال کردن اعلانیه اضافه کردن ورودی"
+ },
+ "addLoginNotificationDesc": {
+ "message": "\"افزودن اعلانیه ورود\" به صورت خودکار از شما می خواهد هر بار که برای اولین بار وارد سیستم میشوید ورودی های جدید را در گاوصندوق خود ذخیره کنید."
+ },
+ "dontShowCardsCurrentTab": {
+ "message": "Don't Show Cards on Tab Page"
+ },
+ "dontShowCardsCurrentTabDesc": {
+ "message": "Card items from your vault are listed on the 'Current Tab' page for easy auto-fill access."
+ },
+ "dontShowIdentitiesCurrentTab": {
+ "message": "Don't Show Identities on Tab Page"
+ },
+ "dontShowIdentitiesCurrentTabDesc": {
+ "message": "Identity items from your vault are listed on the 'Current Tab' page for easy auto-fill access."
+ },
+ "clearClipboard": {
+ "message": "پاکسازی کلیپ برد",
+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
+ },
+ "clearClipboardDesc": {
+ "message": "مقدار های کپی شده را به صورت خودکار از کلیپ برد خود پاک کنید.",
+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
+ },
+ "notificationAddDesc": {
+ "message": "آیا Bitwarden باید این کلمه عبور را برایتان بخاطر بسپارد؟"
+ },
+ "notificationAddSave": {
+ "message": "بله، ذخیره کن"
+ },
+ "notificationNeverSave": {
+ "message": "برای اين سایت هرگز"
+ },
+ "disableChangedPasswordNotification": {
+ "message": "غیر فعال کردن اعلان تغییر کلمه عبور"
+ },
+ "disableChangedPasswordNotificationDesc": {
+ "message": "\"اعلانیه کلمه عبور تغییر کرده\" بصورت خودکار شما را از بروزرسانی کلمه عبور در گاوصندوق مطلع میکند هر زمان که شما آن را در یک وبسایت تغییر داده باشید."
+ },
+ "notificationChangeDesc": {
+ "message": "آیا مایل به بروزرسانی این پسورد در Bitwarden هستید؟"
+ },
+ "notificationChangeSave": {
+ "message": "بله، بروزرسانی کن"
+ },
+ "disableContextMenuItem": {
+ "message": "غیر فعال کردن گزینه های منوی متن"
+ },
+ "disableContextMenuItemDesc": {
+ "message": "گزینه های منوی متن دسترسی سریع به ساخت کلمه عبور و ورود به سیستم برای وبسایت در برگه فعلی را برای شما فراهم میکند."
+ },
+ "defaultUriMatchDetection": {
+ "message": "بازرسی تطابق URL پیشفرض",
+ "description": "Default URI match detection for auto-fill."
+ },
+ "defaultUriMatchDetectionDesc": {
+ "message": "روش پیش فرض اعمال بازرسی تطابق URL را هنگامی که عملی را مثل پر کردن خودکار انتخاب کنید."
+ },
+ "theme": {
+ "message": "پوسته"
+ },
+ "themeDesc": {
+ "message": "تغییر رنگ پوسته برنامه."
+ },
+ "dark": {
+ "message": "تاریک",
+ "description": "Dark color"
+ },
+ "light": {
+ "message": "روشن",
+ "description": "Light color"
+ },
+ "solarizedDark": {
+ "message": "تاریک خورشیدی",
+ "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated."
+ },
+ "exportVault": {
+ "message": "صادر کردن گاوصندوق"
+ },
+ "fileFormat": {
+ "message": "File Format"
+ },
+ "warning": {
+ "message": "اخطار",
+ "description": "WARNING (should stay in capitalized letters if the language permits)"
+ },
+ "confirmVaultExport": {
+ "message": "صادرات گاوصندوق را تأیید کنید"
+ },
+ "exportWarningDesc": {
+ "message": "This export contains your vault data in an unencrypted format. You should not store or send the exported file over unsecure channels (such as email). Delete it immediately after you are done using it."
+ },
+ "encExportKeyWarningDesc": {
+ "message": "این صادرات با استفاده از کلید رمزگذاری حساب شما ، اطلاعات شما را رمزگذاری می کند. اگر حتی کلید رمزگذاری حساب خود را بچرخانید ، باید دوباره صادر کنید چون قادر به رمزگشایی این پرونده صادراتی نخواهید بود."
+ },
+ "encExportAccountWarningDesc": {
+ "message": "کلیدهای رمزگذاری حساب برای هر حساب کاربری Bitwarden منحصر به فرد است ، بنابراین نمی توانید صادرات رمزگذاری شده را به حساب دیگری وارد کنید."
+ },
+ "exportMasterPassword": {
+ "message": "کلمه عبور اصلی خود را برای صادرات داده ها از گاوصندوقتان وارد کنید."
+ },
+ "shared": {
+ "message": "اشتراک گذاری شد"
+ },
+ "learnOrg": {
+ "message": "درباره سازمانها اطلاعات کسب کنید"
+ },
+ "learnOrgConfirmation": {
+ "message": "Bitwarden به شما اجازه می دهد با استفاده از یک سازمان، موارد گاوصندوق خود را با دیگران به اشتراک بگذارید. آیا مایل به بازدید از وب سایت bitwarden.com برای کسب اطلاعات بیشتر هستید؟"
+ },
+ "moveToOrganization": {
+ "message": "انتقال به سازمان"
+ },
+ "share": {
+ "message": "اشتراک گذاری"
+ },
+ "movedItemToOrg": {
+ "message": "$ITEMNAME$ منتقل شد به $ORGNAME$",
+ "placeholders": {
+ "itemname": {
+ "content": "$1",
+ "example": "Secret Item"
+ },
+ "orgname": {
+ "content": "$2",
+ "example": "Company Name"
+ }
+ }
+ },
+ "moveToOrgDesc": {
+ "message": "سازمانی را انتخاب کنید که می خواهید این مورد را به آن منتقل کنید. انتقال به یک سازمان، مالکیت مورد را به آن سازمان منتقل می کند. پس از انتقال این مورد، دیگر مالک مستقیم آن نخواهید بود."
+ },
+ "learnMore": {
+ "message": "بیشتر بدانید"
+ },
+ "authenticatorKeyTotp": {
+ "message": "کلید تأیید کننده (TOTP)"
+ },
+ "verificationCodeTotp": {
+ "message": "کد تأیید (TOTP)"
+ },
+ "copyVerificationCode": {
+ "message": "کپی کد تأیید"
+ },
+ "attachments": {
+ "message": "پیوست ها"
+ },
+ "deleteAttachment": {
+ "message": "حذف پیوست"
+ },
+ "deleteAttachmentConfirmation": {
+ "message": "آیا از پاک کردن این پیوست مطمئن هستید؟"
+ },
+ "deletedAttachment": {
+ "message": "حذف پیوست"
+ },
+ "newAttachment": {
+ "message": "افزودن پیوست جدید"
+ },
+ "noAttachments": {
+ "message": "بدون پیوست."
+ },
+ "attachmentSaved": {
+ "message": "پیوست ذخیره شد."
+ },
+ "file": {
+ "message": "فایل"
+ },
+ "selectFile": {
+ "message": "انتخاب یک فایل."
+ },
+ "maxFileSize": {
+ "message": "بیشترین حجم فایل 500 مگابایت است."
+ },
+ "featureUnavailable": {
+ "message": "ویژگی موجود نیست"
+ },
+ "updateKey": {
+ "message": "تا زمانی که کد رمزنگاری را بروز نکنید نمیتوانید از این قابلیت استفاده کنید."
+ },
+ "premiumMembership": {
+ "message": "عضویت پرمیوم"
+ },
+ "premiumManage": {
+ "message": "مدیریت عضویت"
+ },
+ "premiumManageAlert": {
+ "message": "شما میتوانید عضویت خود را در نسخه وب گاوصندوق در bitwarden.com مدیریت کنید. آیا مایل به دیدن وبسایت هستید؟"
+ },
+ "premiumRefresh": {
+ "message": "نوسازی عضویت"
+ },
+ "premiumNotCurrentMember": {
+ "message": "شما در حال حاظر کاربر پرمیوم نیستید."
+ },
+ "premiumSignUpAndGet": {
+ "message": "ثبت نام برای عضویت پرمیوم و گرفتن:"
+ },
+ "ppremiumSignUpStorage": {
+ "message": "۱ گیگابایت فضای ذخیره سازی رمزنگاری شده."
+ },
+ "ppremiumSignUpTwoStep": {
+ "message": "گزینه های ورود اضافی دو مرحله ای مانند YubiKey, FIDO U2F و Duo."
+ },
+ "ppremiumSignUpReports": {
+ "message": "بهداشت کلمه عبور، سلامت اکانت و گزارش های نقض اطلاعات تا صندوق شما امن نگه داشته شود."
+ },
+ "ppremiumSignUpTotp": {
+ "message": "تولید کننده کد تایید (2FA) از نوع TOTP برای ورود به گاوصندوقتان."
+ },
+ "ppremiumSignUpSupport": {
+ "message": "اولویت پشتیبانی از مشتری."
+ },
+ "ppremiumSignUpFuture": {
+ "message": "تمام ویژگی های پرمیوم آینده. به زودی بیشتر!"
+ },
+ "premiumPurchase": {
+ "message": "خرید پرمیوم"
+ },
+ "premiumPurchaseAlert": {
+ "message": "شما میوانید عضویت پرمیوم را از وب گاوصندوق bitwarden.com خریداری کنید. مایلید اکنون از وبسایت بازید کنید؟"
+ },
+ "premiumCurrentMember": {
+ "message": "شما یک عضو پرمیوم هستید!"
+ },
+ "premiumCurrentMemberThanks": {
+ "message": "برای حمایتتان از Bitwarden سپاسگزاریم."
+ },
+ "premiumPrice": {
+ "message": "تمامش فقط $PRICE$ در سال!",
+ "placeholders": {
+ "price": {
+ "content": "$1",
+ "example": "$10"
+ }
+ }
+ },
+ "refreshComplete": {
+ "message": "نوسازی کامل شد"
+ },
+ "disableAutoTotpCopy": {
+ "message": "غیرفعال کردن کپی خودکار TOTP"
+ },
+ "disableAutoTotpCopyDesc": {
+ "message": "اگر ورود شما دارای یک کلید تأیید کننده است که به آن متصل شده است، هر زمان که بصورت خودکار وارد سایت شوید کد تأیید TOTP به صورت خودکار به کلیپ بورد شما کپی می شود."
+ },
+ "disableAutoBiometricsPrompt": {
+ "message": "در هنگام راه اندازی، درخواست biometrics نکنید."
+ },
+ "premiumRequired": {
+ "message": "در نسخه پرمیوم کار میکند"
+ },
+ "premiumRequiredDesc": {
+ "message": "برای استفاده از این ویژگی عضویت پرمیوم لازم است."
+ },
+ "enterVerificationCodeApp": {
+ "message": "کد ۶ رقمی تایید را از برنامه تایید کننده وارد کنید."
+ },
+ "enterVerificationCodeEmail": {
+ "message": "Enter the 6 digit verification code that was emailed to",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "example@gmail.com"
+ }
+ }
+ },
+ "verificationCodeEmailSent": {
+ "message": "ایمیل تایید به $EMAIL$ ارسال شد.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "example@gmail.com"
+ }
+ }
+ },
+ "rememberMe": {
+ "message": "مرا به خاطر بسپار"
+ },
+ "sendVerificationCodeEmailAgain": {
+ "message": "ارسال دوباره ایمیل کد تایید"
+ },
+ "useAnotherTwoStepMethod": {
+ "message": "استفاده از روش ورود دو مرحله ای دیگر"
+ },
+ "insertYubiKey": {
+ "message": "YubiKey خود را وارد پورت USB رایانه کنید، بعد دکمه آن را بفشارید."
+ },
+ "insertU2f": {
+ "message": "کلید امنیتی خود را وارد پورت USB رایانه کنید، اگر دکمه ای دارد آن را بفشارید."
+ },
+ "webAuthnNewTab": {
+ "message": "تأیید WebAuthn 2FA را در برگه جدید ادامه دهید."
+ },
+ "webAuthnNewTabOpen": {
+ "message": "باز کردن زبانه جدید"
+ },
+ "webAuthnAuthenticate": {
+ "message": "تأیید اعتبار در WebAuthn"
+ },
+ "loginUnavailable": {
+ "message": "ورود به سیستم موجود نیست"
+ },
+ "noTwoStepProviders": {
+ "message": "این حساب با سیستم دو مرحله ورود فعال است، با این حال، هیچ یک از ارائه دهندگان دو مرحله ای پیکربندی شده توسط این مرورگر وب پشتیبانی نمی شوند."
+ },
+ "noTwoStepProviders2": {
+ "message": "لطفا از یک مرورگر وب پشتیبانی شده (مانند کروم) استفاده کنید و / یا ارائه دهندگان اضافی را که در مرورگر وب بهتر پشتیانی میکنند را اضافه کنید (مانند یک برنامه تأیید کننده هویت)."
+ },
+ "twoStepOptions": {
+ "message": "گزینه های ورود دو مرحله ای"
+ },
+ "recoveryCodeDesc": {
+ "message": "دسترسی به تمامی ارائه دهندگان دو مرحله ای را از دست داده اید؟ از کد بازیابی خود برای غیرفعال سازی ارائه دهندگان دو مرحله ای از حسابتان استفاده کنید."
+ },
+ "recoveryCodeTitle": {
+ "message": "کد بازیابی"
+ },
+ "authenticatorAppTitle": {
+ "message": "برنامه تأیید کننده"
+ },
+ "authenticatorAppDesc": {
+ "message": "از یک اپ تایید کننده (همانند Authy یا Google Authenticator) استفاده کنید تا کدهای تایید بر پایه زمان تولید کنید.",
+ "description": "'Authy' and 'Google Authenticator' are product names and should not be translated."
+ },
+ "yubiKeyTitle": {
+ "message": "کلید امنیت YubiKey OTP"
+ },
+ "yubiKeyDesc": {
+ "message": "از یک YubiKey برای دسترسی به حسابتان استفاده کنید. همراه با دستگاه های YubiKey 4،4 Nano، NEO کار میکند."
+ },
+ "duoDesc": {
+ "message": "تایید کنید همراه با Duo Security از اپ موبایل Dou استفاده کنید، پیامک،تماس تلفنی، یا کلید امنیتی U2F.",
+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
+ },
+ "duoOrganizationDesc": {
+ "message": "Duo Security را برای سازماندهی خود با استفاده از برنامه Duo Mobile، SMS، تماس تلفنی یا کلید امنیتی U2F تأیید کنید.",
+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
+ },
+ "webAuthnTitle": {
+ "message": "FIDO2 WebAuthn\n"
+ },
+ "webAuthnDesc": {
+ "message": "برای دسترسی به حساب خود از هر کلید امنیتی فعال شده WebAuthn استفاده کنید."
+ },
+ "emailTitle": {
+ "message": "ایمیل"
+ },
+ "emailDesc": {
+ "message": "کد تایید برایتان فرستاده می شود."
+ },
+ "selfHostedEnvironment": {
+ "message": "محیط خود میزبان"
+ },
+ "selfHostedEnvironmentFooter": {
+ "message": "آدرس اینترنتی پایه فرضی نصب Bitwarden میزبانی شده را مشخص کنید."
+ },
+ "customEnvironment": {
+ "message": "محیط های سفارشی"
+ },
+ "customEnvironmentFooter": {
+ "message": "برای کاربران پیشرفته. شما می توانید آدرس پایه هر سرویس را مستقل تعیین کنید."
+ },
+ "baseUrl": {
+ "message": "آدرس سرور"
+ },
+ "apiUrl": {
+ "message": "آدرس سرور API"
+ },
+ "webVaultUrl": {
+ "message": "آدرس سرور گاوصندوق وب"
+ },
+ "identityUrl": {
+ "message": "آدرس سرور شناسایی"
+ },
+ "notificationsUrl": {
+ "message": "اعلانهای آدرس سرور"
+ },
+ "iconsUrl": {
+ "message": "آدرس سرور آیکون ها"
+ },
+ "environmentSaved": {
+ "message": "آدرس های اینترنتی محیط ذخیره شد."
+ },
+ "enableAutoFillOnPageLoad": {
+ "message": "فعال کردن پرکردن خودکار هنگام بارگذاری صفحه"
+ },
+ "enableAutoFillOnPageLoadDesc": {
+ "message": "اگر یک فرم ورودی شناسایی شود، وقتی صفحه وب بارگذاری می شود، به صورت اتوماتیک انجام می شود."
+ },
+ "experimentalFeature": {
+ "message": "در حال حاضر این یک ویژگی آزمایشی است. با مسئولیت خود استفاده کنید."
+ },
+ "defaultAutoFillOnPageLoad": {
+ "message": "تنظیم خودکار پیش فرض برای موارد ورود به سیستم"
+ },
+ "defaultAutoFillOnPageLoadDesc": {
+ "message": "پس از فعال کردن پرکردن خودکار بارگذاری صفحه، می توانید این ویژگی را برای موارد ورود به سیستم جداگانه فعال یا غیرفعال کنید. این تنظیمات پیش فرض برای موارد ورود به سیستم است که به طور جداگانه پیکربندی نشده اند."
+ },
+ "itemAutoFillOnPageLoad": {
+ "message": "پر کردن خودکار بارگذاری صفحه (درصورت فعال بودن در گزینه ها)"
+ },
+ "autoFillOnPageLoadUseDefault": {
+ "message": "استفاده از تنظيمات پيشفرض"
+ },
+ "autoFillOnPageLoadYes": {
+ "message": "بارگذاری صفحه را به طور خودکار پر کن"
+ },
+ "autoFillOnPageLoadNo": {
+ "message": "بارگذاری صفحه را به طور خودکار پر نکن"
+ },
+ "commandOpenPopup": {
+ "message": "بازکردن پنجره گاوصندوق"
+ },
+ "commandOpenSidebar": {
+ "message": "بازکردن گاوصندوق در نوار کناری"
+ },
+ "commandAutofillDesc": {
+ "message": "آخرین ورودی مورد استفاده برای وب سایت فعلی را به صورت خودکار پر کنید."
+ },
+ "commandGeneratePasswordDesc": {
+ "message": "یک کلمه عبور تصادفی جدید ایجاد کنید و آن را در کلیپ بورد کپی کنید."
+ },
+ "commandLockVaultDesc": {
+ "message": "قفل گاوصندوق"
+ },
+ "privateModeMessage": {
+ "message": "متأسفانه این پنجره در حالت خصوصی برای این مرورگر در دسترس نیست."
+ },
+ "customFields": {
+ "message": "فیلدهای سفارشی"
+ },
+ "copyValue": {
+ "message": "کپی مقدار"
+ },
+ "value": {
+ "message": "مقدار"
+ },
+ "newCustomField": {
+ "message": "فیلد سفارشی جدید"
+ },
+ "dragToSort": {
+ "message": "برای مرتب سازی بکشید"
+ },
+ "cfTypeText": {
+ "message": "متن"
+ },
+ "cfTypeHidden": {
+ "message": "مخفی"
+ },
+ "cfTypeBoolean": {
+ "message": "بولین"
+ },
+ "popup2faCloseMessage": {
+ "message": "در خارج از پنجره پاپ آپ کلیک کنید که ایملیتان بررسی شود برای کد تأییدیه که باعث میشود این پنجره بسته شود. آیا می خواهید این پاپ آپ را در یک پنجره جدید باز کنید تا آن را نبندید؟"
+ },
+ "popupU2fCloseMessage": {
+ "message": "این مرورگر نمیتواند درخواستهای U2F را در این پنجره پاپ آپ پردازش کند. آیا می خواهید این پنجره را در یک پنجره جدید باز کنید تا بتوانید با استفاده از U2F وارد شوید؟"
+ },
+ "disableFavicon": {
+ "message": "غیرفعال سازی آیکون های وبسایت"
+ },
+ "disableFaviconDesc": {
+ "message": "آیکون های وبسایت یک تصویر قابل تشخیص در کنار هر داده ورودی ارائه میدهد."
+ },
+ "disableBadgeCounter": {
+ "message": "شمارنده نشان را غیرفعال کن"
+ },
+ "disableBadgeCounterDesc": {
+ "message": "شمارنده نشان، نشان می دهد که چه تعداد ورود به سیستم برای صفحه فعلی در گاوصندوق خود دارید."
+ },
+ "cardholderName": {
+ "message": "نام صاحب کارت"
+ },
+ "number": {
+ "message": "شماره"
+ },
+ "brand": {
+ "message": "نام تجاری"
+ },
+ "expirationMonth": {
+ "message": "ماه انقضاء"
+ },
+ "expirationYear": {
+ "message": "سال انقضاء"
+ },
+ "expiration": {
+ "message": "انقضاء"
+ },
+ "january": {
+ "message": "ژانویه"
+ },
+ "february": {
+ "message": "فوریه"
+ },
+ "march": {
+ "message": "مارس"
+ },
+ "april": {
+ "message": "آوریل"
+ },
+ "may": {
+ "message": "مِی"
+ },
+ "june": {
+ "message": "ژوئن"
+ },
+ "july": {
+ "message": "جولای"
+ },
+ "august": {
+ "message": "آگوست"
+ },
+ "september": {
+ "message": "سپتامبر"
+ },
+ "october": {
+ "message": "اکتبر"
+ },
+ "november": {
+ "message": "نوامبر"
+ },
+ "december": {
+ "message": "دسامبر"
+ },
+ "securityCode": {
+ "message": "کد امنیتی"
+ },
+ "ex": {
+ "message": "سابق."
+ },
+ "title": {
+ "message": "عنوان"
+ },
+ "mr": {
+ "message": "آقا"
+ },
+ "mrs": {
+ "message": "خانم"
+ },
+ "ms": {
+ "message": "خانم"
+ },
+ "dr": {
+ "message": "دکتر"
+ },
+ "firstName": {
+ "message": "نام"
+ },
+ "middleName": {
+ "message": "نام میانی"
+ },
+ "lastName": {
+ "message": "نام خانوادگی"
+ },
+ "identityName": {
+ "message": "نام شناسایی"
+ },
+ "company": {
+ "message": "شرکت"
+ },
+ "ssn": {
+ "message": "شماره امنیتی اجتماعی"
+ },
+ "passportNumber": {
+ "message": "شماره پاسپورت"
+ },
+ "licenseNumber": {
+ "message": "شماره مجوز"
+ },
+ "email": {
+ "message": "ایمیل"
+ },
+ "phone": {
+ "message": "تلفن"
+ },
+ "address": {
+ "message": "آدرس"
+ },
+ "address1": {
+ "message": "نشانی ۱"
+ },
+ "address2": {
+ "message": "نشانی ۲"
+ },
+ "address3": {
+ "message": "نشانی ۳"
+ },
+ "cityTown": {
+ "message": "شهر / شهرک"
+ },
+ "stateProvince": {
+ "message": "ایالت / استان"
+ },
+ "zipPostalCode": {
+ "message": "کد پستی"
+ },
+ "country": {
+ "message": "کشور"
+ },
+ "type": {
+ "message": "نوع"
+ },
+ "typeLogin": {
+ "message": "ورود"
+ },
+ "typeLogins": {
+ "message": "ورود"
+ },
+ "typeSecureNote": {
+ "message": "یادداشت امن"
+ },
+ "typeCard": {
+ "message": "کارت"
+ },
+ "typeIdentity": {
+ "message": "مشخصات"
+ },
+ "passwordHistory": {
+ "message": "تاریخچه کلمه عبور"
+ },
+ "back": {
+ "message": "بازگشت"
+ },
+ "collections": {
+ "message": "مجموعه ها"
+ },
+ "favorites": {
+ "message": "مورد علاقه"
+ },
+ "popOutNewWindow": {
+ "message": "به یک پنجره جدید پاپ بزنید"
+ },
+ "refresh": {
+ "message": "تازه کردن"
+ },
+ "cards": {
+ "message": "کارتها"
+ },
+ "identities": {
+ "message": "مشخصات"
+ },
+ "logins": {
+ "message": "ورود"
+ },
+ "secureNotes": {
+ "message": "یادداشت های امن"
+ },
+ "clear": {
+ "message": "پاک کردن",
+ "description": "To clear something out. example: To clear browser history."
+ },
+ "checkPassword": {
+ "message": "بررسی اینکه که آیا کلمه عبور افشا شده است."
+ },
+ "passwordExposed": {
+ "message": "This password has been exposed in data breaches. You should change it.",
+ "placeholders": {
+ "value": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "passwordSafe": {
+ "message": "این کلمه عبور در هیچ رخنه داده ای شناخته نشده است. باید برای امنیت از آن استفاده کنید."
+ },
+ "baseDomain": {
+ "message": "دامنه پایه"
+ },
+ "host": {
+ "message": "میزبان",
+ "description": "A URL's host value. For example, the host of https://sub.domain.com:443 is 'sub.domain.com:443'."
+ },
+ "exact": {
+ "message": "دقیق"
+ },
+ "startsWith": {
+ "message": "شروع می شود با"
+ },
+ "regEx": {
+ "message": "عبارت منظم",
+ "description": "A programming term, also known as 'RegEx'."
+ },
+ "matchDetection": {
+ "message": "بازرسی تطابق",
+ "description": "URI match detection for auto-fill."
+ },
+ "defaultMatchDetection": {
+ "message": "بازرسی تطابق پیشفرض",
+ "description": "Default URI match detection for auto-fill."
+ },
+ "toggleOptions": {
+ "message": "گزینه های تبدیل"
+ },
+ "toggleCurrentUris": {
+ "message": "تغییر وضعیت نشانی های اینترنتی فعلی",
+ "description": "Toggle the display of the URIs of the currently open tabs in the browser."
+ },
+ "currentUri": {
+ "message": "نشانی اینترنتی فعلی",
+ "description": "The URI of one of the current open tabs in the browser."
+ },
+ "organization": {
+ "message": "سازماندهی",
+ "description": "An entity of multiple related people (ex. a team or business organization)."
+ },
+ "types": {
+ "message": "انواع"
+ },
+ "allItems": {
+ "message": "تمام موارد"
+ },
+ "noPasswordsInList": {
+ "message": "هیچ کلمه عبوری در لیست وجود ندارد."
+ },
+ "remove": {
+ "message": "حذف"
+ },
+ "default": {
+ "message": "پیش فرض"
+ },
+ "dateUpdated": {
+ "message": "بروزرسانی شد",
+ "description": "ex. Date this item was updated"
+ },
+ "datePasswordUpdated": {
+ "message": "کلمه عبور بروزرسانی شد",
+ "description": "ex. Date this password was updated"
+ },
+ "neverLockWarning": {
+ "message": "آیا جدا میخواهید از گزینه \"هرگز\" استفاده کنید؟ تنظیم کردن کردن گزینه قفل به \"هرگز\" کلیدهای رمزنگاری گاوصندوقتان را بر روی دستگاه شما ذخیره خواهد کرد. اگر از این گزینه استفاده میکنید باید اطمینان داشته باشید که دستگاه شما کاملا محافظت شده است."
+ },
+ "noOrganizationsList": {
+ "message": "You do not belong to any organizations. Organizations allow you to securely share items with other users."
+ },
+ "noCollectionsInList": {
+ "message": "هیچ مجموعه ای برای لیست کردن وجود ندارد."
+ },
+ "ownership": {
+ "message": "مالکیت"
+ },
+ "whoOwnsThisItem": {
+ "message": "چه کسی مالک این مورد است؟"
+ },
+ "strong": {
+ "message": "قوی",
+ "description": "ex. A strong password. Scale: Weak -> Good -> Strong"
+ },
+ "good": {
+ "message": "خوب",
+ "description": "ex. A good password. Scale: Weak -> Good -> Strong"
+ },
+ "weak": {
+ "message": "ضعیف",
+ "description": "ex. A weak password. Scale: Weak -> Good -> Strong"
+ },
+ "weakMasterPassword": {
+ "message": "کلمه عبور اصلی ضعیف"
+ },
+ "weakMasterPasswordDesc": {
+ "message": "کلمه عبور اصلی که شما انتخاب کرده اید ضعیف است. شما باید یک کلمه عبور اصلی قوی انتخاب کنید (یا یک عبارت عبور) تا به درستی از اکانت Bitwarden خود محافظت کنید. آیا مطمئن هستید میخواهید از این کلمه عبور اصلی استفاده کنید؟ "
+ },
+ "pin": {
+ "message": "پین",
+ "description": "PIN code. Ex. The short code (often numeric) that you use to unlock a device."
+ },
+ "unlockWithPin": {
+ "message": "بازکردن با پین"
+ },
+ "setYourPinCode": {
+ "message": "پین کد خود را برای باز کردن بیت واردن خود استفاده کنید. اگر به صورت کامل از حساب خود خارج شوید تنظیمات پین شما ریست می شود."
+ },
+ "pinRequired": {
+ "message": "کد پین الزامیست."
+ },
+ "invalidPin": {
+ "message": "کد پین معتبر نیست. "
+ },
+ "verifyPin": {
+ "message": "تأیید پین"
+ },
+ "yourVaultIsLockedPinCode": {
+ "message": "گاوصندوق شما قفل شده است. برای ادامه کد پین خود را تایید کنید."
+ },
+ "unlockWithBiometrics": {
+ "message": "با استفاده از بیومتریک باز کنید"
+ },
+ "awaitDesktop": {
+ "message": "در انتظار تأیید از دسکتاپ"
+ },
+ "awaitDesktopDesc": {
+ "message": "لطفاً استفاده از بیومتریک را در برنامه دسکتاپ Bitwarden تأیید کنید تا بیومتریک را برای مرورگر فعال کنید."
+ },
+ "lockWithMasterPassOnRestart": {
+ "message": "در زمان شروع مجدد مرورگر، با رمز اصلی قفل کن"
+ },
+ "selectOneCollection": {
+ "message": "شما باید حداقل یک مجموعه را انتخاب کنید."
+ },
+ "cloneItem": {
+ "message": "مورد شبیه"
+ },
+ "clone": {
+ "message": "شبیه سازی"
+ },
+ "passwordGeneratorPolicyInEffect": {
+ "message": "یک یا چند خط مشی سازمان بر تنظیمات تولیدکننده شما تأثیر می گذارد."
+ },
+ "vaultTimeoutAction": {
+ "message": "عمل متوقف شدن گاوصندوق"
+ },
+ "lock": {
+ "message": "قفل",
+ "description": "Verb form: to make secure or inaccesible by"
+ },
+ "trash": {
+ "message": "زبالهها",
+ "description": "Noun: a special folder to hold deleted items"
+ },
+ "searchTrash": {
+ "message": "جستجوی زبالهها"
+ },
+ "permanentlyDeleteItem": {
+ "message": "حذف دائمی مورد"
+ },
+ "permanentlyDeleteItemConfirmation": {
+ "message": "آیا مطمئن هستید که می خواهید این مورد را برای همیشه حذف کنید؟"
+ },
+ "permanentlyDeletedItem": {
+ "message": "مورد برای همیشه حذف شد"
+ },
+ "restoreItem": {
+ "message": "بازیابی مورد"
+ },
+ "restoreItemConfirmation": {
+ "message": "آیا مطمئن هستید می خواهید این مورد را بازیابی کنید؟"
+ },
+ "restoredItem": {
+ "message": "مورد بازیابی شد"
+ },
+ "vaultTimeoutLogOutConfirmation": {
+ "message": "خروج از سیستم تمام دسترسی ها به گاوصندوق شما را از بین می برد و نیاز به احراز هویت آنلاین پس از مدت زمان توقف دارد. آیا مطمئن هستید که می خواهید از این تنظیمات استفاده کنید؟"
+ },
+ "vaultTimeoutLogOutConfirmationTitle": {
+ "message": "تایید عمل توقف"
+ },
+ "autoFillAndSave": {
+ "message": "پرکردن خودکار و ذخیره"
+ },
+ "autoFillSuccessAndSavedUri": {
+ "message": "مورد خودکار پر شد و آدرس اینترنتی ذخیره شد"
+ },
+ "autoFillSuccess": {
+ "message": "مورد خودکار پر شد"
+ },
+ "setMasterPassword": {
+ "message": "تنظیم کلمه عبور اصلی"
+ },
+ "masterPasswordPolicyInEffect": {
+ "message": "یک یا چند سیاست سازمانی برای تأمین شرایط زیر به کلمه عبور اصلی شما احتیاج دارد:"
+ },
+ "policyInEffectMinComplexity": {
+ "message": "حداقل نمره پیچیدگی $SCORE$",
+ "placeholders": {
+ "score": {
+ "content": "$1",
+ "example": "4"
+ }
+ }
+ },
+ "policyInEffectMinLength": {
+ "message": "حداقل طول $LENGTH$",
+ "placeholders": {
+ "length": {
+ "content": "$1",
+ "example": "14"
+ }
+ }
+ },
+ "policyInEffectUppercase": {
+ "message": "حاوی یک یا چند کاراکتر بزرگ"
+ },
+ "policyInEffectLowercase": {
+ "message": "حاوی یک یا چند کاراکتر کوچک"
+ },
+ "policyInEffectNumbers": {
+ "message": "حاوی یک یا چند عدد بیشتر"
+ },
+ "policyInEffectSpecial": {
+ "message": "حاوی یک یا چند کاراکتر خاص زیر است $CHARS$",
+ "placeholders": {
+ "chars": {
+ "content": "$1",
+ "example": "!@#$%^&*"
+ }
+ }
+ },
+ "masterPasswordPolicyRequirementsNotMet": {
+ "message": "کلمه عبور اصلی جدید شما از شرایط سیاست پپیروی نمی کند."
+ },
+ "acceptPolicies": {
+ "message": "با علامت زدن این کادر با موارد زیر موافقت می کنید:"
+ },
+ "acceptPoliciesError": {
+ "message": "شرایط خدمات و سیاست حفظ حریم خصوصی تأیید نشده است."
+ },
+ "termsOfService": {
+ "message": "شرایط استفاده از خدمات"
+ },
+ "privacyPolicy": {
+ "message": "سیاست حفظ حریم خصوصی"
+ },
+ "hintEqualsPassword": {
+ "message": "نکته کلمه عبور شما نمی تواند همان کلمه عبور شما باشد."
+ },
+ "ok": {
+ "message": "تایید"
+ },
+ "desktopSyncVerificationTitle": {
+ "message": "تأیید همگام سازی دسکتاپ"
+ },
+ "desktopIntegrationVerificationText": {
+ "message": "لطفاً تأیید کنید که برنامه دسکتاپ این اثر انگشت را نشان می دهد:"
+ },
+ "desktopIntegrationDisabledTitle": {
+ "message": "ادغام مرورگر فعال نیست"
+ },
+ "desktopIntegrationDisabledDesc": {
+ "message": "ادغام مرورگر در برنامه دسکتاپ Bitwarden فعال نیست. لطفاً آن را در تنظیمات موجود در برنامه دسکتاپ فعال کنید."
+ },
+ "startDesktopTitle": {
+ "message": "برنامه دسکتاپ Bitwarden را شروع کنید"
+ },
+ "startDesktopDesc": {
+ "message": "قبل از استفاده از این عملکرد، برنامه دسکتاپ Bitwarden باید شروع شود."
+ },
+ "errorEnableBiometricTitle": {
+ "message": "بیومتریک فعال نیست"
+ },
+ "errorEnableBiometricDesc": {
+ "message": "فعالیت توسط برنامه دسکتاپ لغو شد"
+ },
+ "nativeMessagingInvalidEncryptionDesc": {
+ "message": "برنامه دسکتاپ کانال ارتباط امن را نامعتبر کرد. لطفاً این عملیات را دوباره امتحان کنید"
+ },
+ "nativeMessagingInvalidEncryptionTitle": {
+ "message": "ارتباط دسکتاپ قطع شد"
+ },
+ "nativeMessagingWrongUserDesc": {
+ "message": "برنامه دسکتاپ به یک حساب دیگر وارد شده است. لطفاً اطمینان حاصل کنید که هر دو برنامه به یک حساب وارد شده اند."
+ },
+ "nativeMessagingWrongUserTitle": {
+ "message": "عدم تطابق حساب"
+ },
+ "biometricsNotEnabledTitle": {
+ "message": "بیومتریک فعال نیست"
+ },
+ "biometricsNotEnabledDesc": {
+ "message": "بیومتریک مرورگر ابتدا نیاز به فعالسازی بیومتریک دسکتاپ در تنظیمات دارد."
+ },
+ "biometricsNotSupportedTitle": {
+ "message": "بیومتریک پشتیبانی نمی شود"
+ },
+ "biometricsNotSupportedDesc": {
+ "message": "بیومتریک مرورگر در این دستگاه پشتیبانی نمی شود."
+ },
+ "nativeMessaginPermissionErrorTitle": {
+ "message": "مجوز ارائه نشده است"
+ },
+ "nativeMessaginPermissionErrorDesc": {
+ "message": "بدون اجازه ارتباط با برنامه دسکتاپ Bitwarden ، نمی توانیم بیومتریک را در افزونه مرورگر ارائه دهیم. لطفا دوباره تلاش کنید."
+ },
+ "nativeMessaginPermissionSidebarTitle": {
+ "message": "خطای درخواست مجوز"
+ },
+ "nativeMessaginPermissionSidebarDesc": {
+ "message": "این عمل را نمی توان در نوار کناری انجام داد، لطفاً اقدام را در پنجره بازشو یا پنجره بازخوانی کنید."
+ },
+ "personalOwnershipSubmitError": {
+ "message": "به دلیل خط مشی Enterprise ، برای ذخیره موارد در گاوصندوق شخصی خود محدود شده اید. گزینه مالکیت را به یک سازمان تغییر دهید و مجموعه های موجود را انتخاب کنید."
+ },
+ "personalOwnershipPolicyInEffect": {
+ "message": "خط مشی سازمانی بر تنظیمات مالکیت شما تأثیر می گذارد."
+ },
+ "excludedDomains": {
+ "message": "دامنه های مستثنی"
+ },
+ "excludedDomainsDesc": {
+ "message": "Bitwarden برای ذخیره جزئیات ورود به سیستم این دامنه ها سوال نمیکند. برای اینکه تغییرات اعمال شود باید صفحه را تازه کنید."
+ },
+ "excludedDomainsInvalidDomain": {
+ "message": "$DOMAIN$ دامنه معتبری نیست",
+ "placeholders": {
+ "domain": {
+ "content": "$1",
+ "example": "googlecom"
+ }
+ }
+ },
+ "send": {
+ "message": "ارسال",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "searchSends": {
+ "message": "ارسال ها را جستجو کن",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "addSend": {
+ "message": "افزودن ارسال",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTypeText": {
+ "message": "متن"
+ },
+ "sendTypeFile": {
+ "message": "فایل"
+ },
+ "allSends": {
+ "message": "همه ارسال ها",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "maxAccessCountReached": {
+ "message": "به حداکثر تعداد دسترسی رسیده است"
+ },
+ "expired": {
+ "message": "منقضی شده"
+ },
+ "pendingDeletion": {
+ "message": "در انتظار حذف"
+ },
+ "passwordProtected": {
+ "message": "محافظت شده با کلمه عبور"
+ },
+ "copySendLink": {
+ "message": "پیوند ارسال را کپی کن",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "removePassword": {
+ "message": "حذف کلمه عبور"
+ },
+ "delete": {
+ "message": "حذف"
+ },
+ "removedPassword": {
+ "message": "کلمه عبور حذف شد"
+ },
+ "deletedSend": {
+ "message": "ارسال پاک شد",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendLink": {
+ "message": "ارسال پیوند",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "disabled": {
+ "message": "غیرفعال شد"
+ },
+ "removePasswordConfirmation": {
+ "message": "مطمئنید میخواهید این کلمه عبور حذف شود؟"
+ },
+ "deleteSend": {
+ "message": "ارسال پاک شد",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "deleteSendConfirmation": {
+ "message": "آیا مطمئن هستید می خواهید این ارسال را حذف کنید؟",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "editSend": {
+ "message": "ویرایش ارسال",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTypeHeader": {
+ "message": "این چه نوع ارسالی است؟",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendNameDesc": {
+ "message": "یک نام دوستانه برای توصیف این ارسال.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendFileDesc": {
+ "message": "فایلی که می خواهید ارسال کنید."
+ },
+ "deletionDate": {
+ "message": "تاریخ حذف"
+ },
+ "deletionDateDesc": {
+ "message": "ارسال در تاریخ و ساعت مشخص شده برای همیشه حذف خواهد شد.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "expirationDate": {
+ "message": "تاريخ انقضاء"
+ },
+ "expirationDateDesc": {
+ "message": "در صورت تنظیم، دسترسی به این ارسال در تاریخ و ساعت مشخص شده منقضی می شود.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "oneDay": {
+ "message": "۱ روز"
+ },
+ "days": {
+ "message": "$DAYS$ روز",
+ "placeholders": {
+ "days": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "custom": {
+ "message": "سفارشی"
+ },
+ "maximumAccessCount": {
+ "message": "تعداد دسترسی حداکثر"
+ },
+ "maximumAccessCountDesc": {
+ "message": "در صورت تنظیم، با رسیدن به حداکثر تعداد دسترسی، کاربران دیگر نمی توانند به این ارسال دسترسی پیدا کنند.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendPasswordDesc": {
+ "message": "به صورت اختیاری برای دسترسی کاربران به این ارسال به یک کلمه عبور نیاز دارید.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendNotesDesc": {
+ "message": "یادداشت های خصوصی در مورد این ارسال.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendDisableDesc": {
+ "message": "این ارسال را غیرفعال کنید تا کسی نتواند به آن دسترسی پیدا کند.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendShareDesc": {
+ "message": "پس از ذخیره، این پیوند ارسال را به کلیپ بورد کپی کن.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTextDesc": {
+ "message": "متنی که می خواهید ارسال کنید."
+ },
+ "sendHideText": {
+ "message": "متن این ارسال را به طور پیش فرض پنهان کن.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "currentAccessCount": {
+ "message": "تعداد دسترسی فعلی"
+ },
+ "createSend": {
+ "message": "ساختن ارسال جدید",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "newPassword": {
+ "message": "کلمه عبور جدید"
+ },
+ "sendDisabled": {
+ "message": "ارسال غیرفعال شد",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendDisabledWarning": {
+ "message": "به دلیل خط مشی سازمانی، شما فقط می توانید ارسال موجود را حذف کنید.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "createdSend": {
+ "message": "ارسال جدید ساخته شد",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "editedSend": {
+ "message": "ارسال جدید ویرایش شد",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendLinuxChromiumFileWarning": {
+ "message": "برای انتخاب پرونده، پسوند را در نوار کناری باز کنید (در صورت امکان) یا با کلیک بر روی این آگهی به پنجره جدیدی باز شوید."
+ },
+ "sendFirefoxFileWarning": {
+ "message": "برای انتخاب یک فایل با استفاده از Firefox، افزونه را در نوار کناری باز کنید یا با کلیک بر روی این بنر به پنجره جدید باز شوید."
+ },
+ "sendSafariFileWarning": {
+ "message": "برای انتخاب فایلی با استفاده از Safari، با کلیک روی این بنر به پنجره جدیدی باز شوید."
+ },
+ "sendFileCalloutHeader": {
+ "message": "قبل از اینکه شروع کنی"
+ },
+ "sendFirefoxCustomDatePopoutMessage1": {
+ "message": "برای استفاده از انتخابگر تاریخ به سبک تقویم",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read '**To use a calendar style date picker ** click here to pop out your window.'"
+ },
+ "sendFirefoxCustomDatePopoutMessage2": {
+ "message": "اینجا کلیک کنید",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker **click here** to pop out your window.'"
+ },
+ "sendFirefoxCustomDatePopoutMessage3": {
+ "message": "برای خروج از پنجره خود.",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker click here **to pop out your window.**'"
+ },
+ "expirationDateIsInvalid": {
+ "message": "تاریخ انقضا ارائه شده معتبر نیست."
+ },
+ "deletionDateIsInvalid": {
+ "message": "تاریخ حذف ارائه شده معتبر نیست."
+ },
+ "expirationDateAndTimeRequired": {
+ "message": "تاریخ انقضا و زمان لازم است."
+ },
+ "deletionDateAndTimeRequired": {
+ "message": "تاریخ و زمان حذف لازم است."
+ },
+ "dateParsingError": {
+ "message": "هنگام ذخیره حذف و تاریخ انقضا شما خطایی روی داد."
+ },
+ "hideEmail": {
+ "message": "آدرس ایمیلم را از گیرندگان مخفی کن."
+ },
+ "sendOptionsPolicyInEffect": {
+ "message": "یک یا چند سیاست سازمان بر گزینه های ارسال شما تأثیر می گذارد."
+ },
+ "passwordPrompt": {
+ "message": "کلمه عبور اصلی دوباره تولید می شود"
+ },
+ "passwordConfirmation": {
+ "message": "تأیید کلمه عبور اصلی"
+ },
+ "passwordConfirmationDesc": {
+ "message": "این عمل محافظت می شود. برای ادامه، لطفاً کلمه ورود اصلی خود را دوباره وارد کنید تا هویتان را تأیید کنید."
+ },
+ "emailVerificationRequired": {
+ "message": "تایید ایمیل لازم است"
+ },
+ "emailVerificationRequiredDesc": {
+ "message": "برای استفاده از این ویژگی باید ایمیل خود را تأیید کنید. می توانید ایمیل خود را در گاوصندوق وب تأیید کنید."
+ },
+ "updatedMasterPassword": {
+ "message": "کلمه عبور اصلی بروز شد"
+ },
+ "updateMasterPassword": {
+ "message": "بروزرسانی کلمه عبور اصلی"
+ },
+ "updateMasterPasswordWarning": {
+ "message": "کلمه عبور اصلی شما اخیراً توسط سرپرست سازمانتان تغییر کرده است. برای دسترسی به گاوصندوق، باید همین حالا کلمه عبور اصلی خود را به روز کنید. در صورت ادامه، شما از نشست فعلی خود خارج می شوید و باید دوباره وارد سیستم شوید. نشست فعال در دستگاه های دیگر ممکن است تا یک ساعت همچنان فعال باقی بمانند."
+ },
+ "resetPasswordPolicyAutoEnroll": {
+ "message": "ثبت نام خودکار"
+ },
+ "resetPasswordAutoEnrollInviteWarning": {
+ "message": "این سازمان دارای خط مشی سازمانی ای است که به طور خودکار شما را در بازنشانی کلمه عبور ثبت نام می کند. این ثبت نام به مدیران سازمان اجازه می دهد تا کلمه عبور اصلی شما را تغییر دهند."
+ },
+ "selectFolder": {
+ "message": "پوشه را انتخاب کنید..."
+ },
+ "ssoCompleteRegistration": {
+ "message": "برای تکمیل ورود به سیستم با SSO ، لطفاً یک کلمه عبور اصلی برای دسترسی و محافظت از گاوصندوق خود تنظیم کنید."
+ },
+ "hours": {
+ "message": "ساعت"
+ },
+ "minutes": {
+ "message": "دقیقه"
+ },
+ "vaultTimeoutPolicyInEffect": {
+ "message": "خط مشی های سازمانتان بر مهلت زمانی گاوصندوق شما تأثیر می گذارد. حداکثر زمان مجاز گاوصندوق $HOURS$ ساعت و $MINUTES$ دقیقه است",
+ "placeholders": {
+ "hours": {
+ "content": "$1",
+ "example": "5"
+ },
+ "minutes": {
+ "content": "$2",
+ "example": "5"
+ }
+ }
+ },
+ "vaultTimeoutToLarge": {
+ "message": "مهلت زمانی شما بیش از محدودیت های تعیین شده توسط سازمانتان است."
+ },
+ "vaultExportDisabled": {
+ "message": "صادرات گاوصندوق غیرفعال شده است"
+ },
+ "personalVaultExportPolicyInEffect": {
+ "message": "یک یا چند خط مشی سازمان از صادرات گاوصندوق شخصی شما جلوگیری می کند."
+ },
+ "copyCustomFieldNameInvalidElement": {
+ "message": "شناسایی عنصر فرم معتبر امکان پذیر نیست. به جای آن سعی کنید HTML را بررسی کنید."
+ },
+ "copyCustomFieldNameNotUnique": {
+ "message": "شناسه منحصر به فردی یافت نشد."
+ }
+}
diff --git a/src/iOS.Safari/Resources/_locales/fi/messages.json b/src/iOS.Safari/Resources/_locales/fi/messages.json
new file mode 100644
index 000000000..cd112fe77
--- /dev/null
+++ b/src/iOS.Safari/Resources/_locales/fi/messages.json
@@ -0,0 +1,1817 @@
+{
+ "appName": {
+ "message": "Bitwarden"
+ },
+ "extName": {
+ "message": "Bitwarden – Ilmainen salasananhallinta",
+ "description": "Extension name, MUST be less than 40 characters (Safari restriction)"
+ },
+ "extDesc": {
+ "message": "Turvallinen ja ilmainen salasanojen hallinta kaikille laitteillesi.",
+ "description": "Extension description"
+ },
+ "loginOrCreateNewAccount": {
+ "message": "Kirjaudu sisään tai luo uusi tili päästäksesi salattuun holviisi."
+ },
+ "createAccount": {
+ "message": "Luo tili"
+ },
+ "login": {
+ "message": "Kirjaudu sisään"
+ },
+ "enterpriseSingleSignOn": {
+ "message": "Yrityksen kertakirjautuminen (SSO)"
+ },
+ "cancel": {
+ "message": "Peruuta"
+ },
+ "close": {
+ "message": "Sulje"
+ },
+ "submit": {
+ "message": "Jatka"
+ },
+ "emailAddress": {
+ "message": "Sähköpostiosoite"
+ },
+ "masterPass": {
+ "message": "Pääsalasana"
+ },
+ "masterPassDesc": {
+ "message": "Pääsalasanalla pääset käsiksi holviisi. On erittäin tärkeää, että muistat pääsalasanasi, koska sen palautus ei ole mahdollista, jos unohdat sen."
+ },
+ "masterPassHintDesc": {
+ "message": "Pääsalasanan vihje voi auttaa sinua muistamaan unohtamasi salasanan."
+ },
+ "reTypeMasterPass": {
+ "message": "Syötä pääsalasana uudelleen"
+ },
+ "masterPassHint": {
+ "message": "Pääsalasanan vihje (valinnainen)"
+ },
+ "tab": {
+ "message": "Välilehti"
+ },
+ "myVault": {
+ "message": "Oma holvi"
+ },
+ "tools": {
+ "message": "Työkalut"
+ },
+ "settings": {
+ "message": "Asetukset"
+ },
+ "currentTab": {
+ "message": "Nykyinen välilehti"
+ },
+ "copyPassword": {
+ "message": "Kopioi salasana"
+ },
+ "copyNote": {
+ "message": "Kopioi muistio"
+ },
+ "copyUri": {
+ "message": "Kopioi URI"
+ },
+ "copyUsername": {
+ "message": "Kopioi käyttäjätunnus"
+ },
+ "copyNumber": {
+ "message": "Kopioi numero"
+ },
+ "copySecurityCode": {
+ "message": "Kopioi turvakoodi"
+ },
+ "autoFill": {
+ "message": "Automaattinen täyttö"
+ },
+ "generatePasswordCopied": {
+ "message": "Luo salasana (leikepöydälle)"
+ },
+ "copyElementIdentifier": {
+ "message": "Kopioi lisäkentän nimi"
+ },
+ "noMatchingLogins": {
+ "message": "Ei tunnistettuja kirjautumistietoja."
+ },
+ "vaultLocked": {
+ "message": "Holvi on lukittu."
+ },
+ "vaultLoggedOut": {
+ "message": "Holvista on kirjauduttu ulos."
+ },
+ "autoFillInfo": {
+ "message": "Selaimen avoimelle välilehdelle ei ole automaattisesti täytettäviä kirjautumistietoja."
+ },
+ "addLogin": {
+ "message": "Lisää kirjautumistieto"
+ },
+ "addItem": {
+ "message": "Lisää kohde"
+ },
+ "passwordHint": {
+ "message": "Salasanavihje"
+ },
+ "enterEmailToGetHint": {
+ "message": "Syötä tilisi sähköpostiosoite saadaksesi pääsalasanan vihjeen."
+ },
+ "getMasterPasswordHint": {
+ "message": "Pyydä pääsalasanan vihjettä"
+ },
+ "continue": {
+ "message": "Jatka"
+ },
+ "verificationCode": {
+ "message": "Todennuskoodi"
+ },
+ "account": {
+ "message": "Käyttäjätili"
+ },
+ "changeMasterPassword": {
+ "message": "Vaihda pääsalasana"
+ },
+ "fingerprintPhrase": {
+ "message": "Tunnistelauseke",
+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
+ },
+ "yourAccountsFingerprint": {
+ "message": "Tilisi tunnistelauseke",
+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
+ },
+ "twoStepLogin": {
+ "message": "Kaksivaiheinen kirjautuminen"
+ },
+ "logOut": {
+ "message": "Kirjaudu ulos"
+ },
+ "about": {
+ "message": "Tietoja"
+ },
+ "version": {
+ "message": "Versio"
+ },
+ "save": {
+ "message": "Tallenna"
+ },
+ "move": {
+ "message": "Siirrä"
+ },
+ "addFolder": {
+ "message": "Lisää kansio"
+ },
+ "name": {
+ "message": "Nimi"
+ },
+ "editFolder": {
+ "message": "Muokkaa kansiota"
+ },
+ "deleteFolder": {
+ "message": "Poista kansio"
+ },
+ "folders": {
+ "message": "Kansiot"
+ },
+ "noFolders": {
+ "message": "Ei näytettäviä kansioita."
+ },
+ "helpFeedback": {
+ "message": "Tuki ja palaute"
+ },
+ "sync": {
+ "message": "Synkronointi"
+ },
+ "syncVaultNow": {
+ "message": "Synkronoi holvi nyt"
+ },
+ "lastSync": {
+ "message": "Viimeisin synkronointi:"
+ },
+ "passGen": {
+ "message": "Salasanageneraattori"
+ },
+ "generator": {
+ "message": "Generaattori",
+ "description": "Short for 'Password Generator'."
+ },
+ "passGenInfo": {
+ "message": "Luo kirjautumistiedoillesi automaattisesti vahvoja, ainutlaatuisia salasanoja."
+ },
+ "bitWebVault": {
+ "message": "Bitwardenin verkkoholvi"
+ },
+ "importItems": {
+ "message": "Tuo kohteita"
+ },
+ "select": {
+ "message": "Valitse"
+ },
+ "generatePassword": {
+ "message": "Luo salasana"
+ },
+ "regeneratePassword": {
+ "message": "Luo uusi salasana"
+ },
+ "options": {
+ "message": "Lisäasetukset"
+ },
+ "length": {
+ "message": "Pituus"
+ },
+ "numWords": {
+ "message": "Sanojen määrä"
+ },
+ "wordSeparator": {
+ "message": "Sanojen erotin"
+ },
+ "capitalize": {
+ "message": "Sanat isoilla alkukirjaimilla",
+ "description": "Make the first letter of a work uppercase."
+ },
+ "includeNumber": {
+ "message": "Sisällytä numero"
+ },
+ "minNumbers": {
+ "message": "Numeroita vähintään"
+ },
+ "minSpecial": {
+ "message": "Erikoismerkkejä vähintään"
+ },
+ "avoidAmbChar": {
+ "message": "Vältä epäselviä merkkejä"
+ },
+ "searchVault": {
+ "message": "Hae holvista"
+ },
+ "edit": {
+ "message": "Muokkaa"
+ },
+ "view": {
+ "message": "Näytä"
+ },
+ "noItemsInList": {
+ "message": "Ei näytettäviä kohteita."
+ },
+ "itemInformation": {
+ "message": "Kohteen tiedot"
+ },
+ "username": {
+ "message": "Käyttäjätunnus"
+ },
+ "password": {
+ "message": "Salasana"
+ },
+ "passphrase": {
+ "message": "Salauslauseke"
+ },
+ "favorite": {
+ "message": "Suosikki"
+ },
+ "notes": {
+ "message": "Merkinnät"
+ },
+ "note": {
+ "message": "Merkintä"
+ },
+ "editItem": {
+ "message": "Muokkaa kohdetta"
+ },
+ "folder": {
+ "message": "Kansio"
+ },
+ "deleteItem": {
+ "message": "Poista kohde"
+ },
+ "viewItem": {
+ "message": "Näytä kohde"
+ },
+ "launch": {
+ "message": "Avaa"
+ },
+ "website": {
+ "message": "Verkkosivusto"
+ },
+ "toggleVisibility": {
+ "message": "Näytä tai piilota"
+ },
+ "manage": {
+ "message": "Hallinta"
+ },
+ "other": {
+ "message": "Muut"
+ },
+ "rateExtension": {
+ "message": "Arvioi laajennus"
+ },
+ "rateExtensionDesc": {
+ "message": "Harkitse tukemistamme hyvällä arvostelulla!"
+ },
+ "browserNotSupportClipboard": {
+ "message": "Selaimesi ei tue helppoa leikepöydälle kopiointia. Kopioi kohde manuaalisesti."
+ },
+ "verifyMasterPassword": {
+ "message": "Vahvista pääsalasana"
+ },
+ "yourVaultIsLocked": {
+ "message": "Holvisi on lukittu. Syötä pääsalasana jatkaaksesi."
+ },
+ "unlock": {
+ "message": "Avaa"
+ },
+ "loggedInAsOn": {
+ "message": "Kirjautuneena tunnuksella $EMAIL$ palveluun $HOSTNAME$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "name@example.com"
+ },
+ "hostname": {
+ "content": "$2",
+ "example": "bitwarden.com"
+ }
+ }
+ },
+ "invalidMasterPassword": {
+ "message": "Virheellinen pääsalasana"
+ },
+ "vaultTimeout": {
+ "message": "Holvin aikakatkaisu"
+ },
+ "lockNow": {
+ "message": "Lukitse nyt"
+ },
+ "immediately": {
+ "message": "Välittömästi"
+ },
+ "tenSeconds": {
+ "message": "10 sekuntia"
+ },
+ "twentySeconds": {
+ "message": "20 sekuntia"
+ },
+ "thirtySeconds": {
+ "message": "30 sekuntia"
+ },
+ "oneMinute": {
+ "message": "1 minuutti"
+ },
+ "twoMinutes": {
+ "message": "2 minuuttia"
+ },
+ "fiveMinutes": {
+ "message": "5 minuuttia"
+ },
+ "fifteenMinutes": {
+ "message": "15 minuuttia"
+ },
+ "thirtyMinutes": {
+ "message": "30 minuuttia"
+ },
+ "oneHour": {
+ "message": "1 tunti"
+ },
+ "fourHours": {
+ "message": "4 tuntia"
+ },
+ "onLocked": {
+ "message": "Kun järjestelmän lukitaan"
+ },
+ "onRestart": {
+ "message": "Kun selain käynnistetään uudelleen"
+ },
+ "never": {
+ "message": "Ei koskaan"
+ },
+ "security": {
+ "message": "Suojaus"
+ },
+ "errorOccurred": {
+ "message": "Tapahtui virhe"
+ },
+ "emailRequired": {
+ "message": "Sähköpostiosoite vaaditaan."
+ },
+ "invalidEmail": {
+ "message": "Virheellinen sähköpostiosoite."
+ },
+ "masterPassRequired": {
+ "message": "Pääsalasana vaaditaan."
+ },
+ "masterPassLength": {
+ "message": "Pääsalasanan on oltava vähintään 8 merkkiä pitkä."
+ },
+ "masterPassDoesntMatch": {
+ "message": "Pääsalasanan vahvistus ei täsmää."
+ },
+ "newAccountCreated": {
+ "message": "Uusi käyttäjätilisi on luotu! Voit nyt kirjautua sisään."
+ },
+ "masterPassSent": {
+ "message": "Lähetimme pääsalasanasi vihjeen sähköpostitse."
+ },
+ "verificationCodeRequired": {
+ "message": "Todennuskoodi vaaditaan."
+ },
+ "valueCopied": {
+ "message": "$VALUE$ kopioitiin",
+ "description": "Value has been copied to the clipboard.",
+ "placeholders": {
+ "value": {
+ "content": "$1",
+ "example": "Password"
+ }
+ }
+ },
+ "autofillError": {
+ "message": "Valitun kohteen automaattinen täyttö tälle sivulle ei onnistu. Kopioi ja liitä tiedot sen sijaan."
+ },
+ "loggedOut": {
+ "message": "Kirjauduttu ulos"
+ },
+ "loginExpired": {
+ "message": "Kirjautumisistuntosi on erääntynyt."
+ },
+ "logOutConfirmation": {
+ "message": "Haluatko varmasti kirjautua ulos?"
+ },
+ "yes": {
+ "message": "Kyllä"
+ },
+ "no": {
+ "message": "En"
+ },
+ "unexpectedError": {
+ "message": "Tapahtui odottamaton virhe."
+ },
+ "nameRequired": {
+ "message": "Nimi vaaditaan."
+ },
+ "addedFolder": {
+ "message": "Lisättiin kansio"
+ },
+ "changeMasterPass": {
+ "message": "Vaihda pääsalasana"
+ },
+ "changeMasterPasswordConfirmation": {
+ "message": "Voit vaihtaa pääsalasanasi bitwarden.com-verkkoholvissa. Haluatko käydä sivustolla nyt?"
+ },
+ "twoStepLoginConfirmation": {
+ "message": "Kaksivaiheinen kirjautuminen tekee tilistäsi turvallisemman edellyttämällä salasanan lisäksi kirjautumisen lisätodennusta todennuslaitteen, ‑sovelluksen, tekstiviestin, puhelun tai sähköpostin avulla. Voit ottaa kaksivaiheisen kirjautumisen käyttöön bitwarden.com‑verkkoholvissa. Haluatko käydä sivustolla nyt?"
+ },
+ "editedFolder": {
+ "message": "Muokattiin kansiota"
+ },
+ "deleteFolderConfirmation": {
+ "message": "Haluatko varmasti poistaa kansion?"
+ },
+ "deletedFolder": {
+ "message": "Poistettiin kansio"
+ },
+ "gettingStartedTutorial": {
+ "message": "Aloitusopas"
+ },
+ "gettingStartedTutorialVideo": {
+ "message": "Ota selainlaajennuksesta kaikki irti katsomalla video-oppaamme."
+ },
+ "syncingComplete": {
+ "message": "Synkronointi on valmis"
+ },
+ "syncingFailed": {
+ "message": "Synkronointi epäonnistui"
+ },
+ "passwordCopied": {
+ "message": "Salasana kopioitiin"
+ },
+ "uri": {
+ "message": "URI"
+ },
+ "uriPosition": {
+ "message": "URI $POSITION$",
+ "description": "A listing of URIs. Ex: URI 1, URI 2, URI 3, etc.",
+ "placeholders": {
+ "position": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "newUri": {
+ "message": "Uusi URI"
+ },
+ "addedItem": {
+ "message": "Lisättiin kohde"
+ },
+ "editedItem": {
+ "message": "Muokattiin kohdetta"
+ },
+ "deleteItemConfirmation": {
+ "message": "Haluatko varmasti siirtää roskakoriin?"
+ },
+ "deletedItem": {
+ "message": "Siirrettiin kohde roskakoriin"
+ },
+ "overwritePassword": {
+ "message": "Korvaa salasana"
+ },
+ "overwritePasswordConfirmation": {
+ "message": "Haluatko varmasti korvata nykyisen salasanan?"
+ },
+ "searchFolder": {
+ "message": "Hae kansiosta"
+ },
+ "searchCollection": {
+ "message": "Hae kokoelmasta"
+ },
+ "searchType": {
+ "message": "Hae tyypeistä"
+ },
+ "noneFolder": {
+ "message": "Ei kansiota",
+ "description": "This is the folder for uncategorized items"
+ },
+ "disableAddLoginNotification": {
+ "message": "Älä käytä \"Lisää kirjautumistieto\" -kehotetta"
+ },
+ "addLoginNotificationDesc": {
+ "message": "\"Lisää kirjautumistieto\" -kehote kysyy, haluatko tallentaa kirjautumistiedot holviisi kun kirjaudut niillä ensimmäistä kertaa."
+ },
+ "dontShowCardsCurrentTab": {
+ "message": "Älä näytä välilehtikohtaisia korttiehdotuksia"
+ },
+ "dontShowCardsCurrentTabDesc": {
+ "message": "Holvissasi olevat kortit tunnistetaan ja näytetään selaimen avoimelle välilehdelle, jotta niiden valinta täyttöä varten on helppoa."
+ },
+ "dontShowIdentitiesCurrentTab": {
+ "message": "Älä näytä välilehtikohtaisia henkilöllisyysehdotuksia"
+ },
+ "dontShowIdentitiesCurrentTabDesc": {
+ "message": "Holvissasi olevat henkilöllisyydet tunnistetaan ja näytetään selaimen avoimelle välilehdelle, jotta niiden valinta täyttöä varten on helppoa."
+ },
+ "clearClipboard": {
+ "message": "Tyhjennä leikepöytä",
+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
+ },
+ "clearClipboardDesc": {
+ "message": "Poista kopioidut arvot leikepöydältä automaattisesti.",
+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
+ },
+ "notificationAddDesc": {
+ "message": "Haluatko, että Bitwarden muistaa salasanan puolestasi?"
+ },
+ "notificationAddSave": {
+ "message": "Kyllä, tallenna nyt"
+ },
+ "notificationNeverSave": {
+ "message": "Ei koskaan tälle sivustolle"
+ },
+ "disableChangedPasswordNotification": {
+ "message": "Älä näytä \"Salasana vaihdettu\" -ilmoitusta"
+ },
+ "disableChangedPasswordNotificationDesc": {
+ "message": "\"Salasana vaihdettu\" -ilmoitus ehdottaa holviisi tallennetun salasanan automaattista päivitystä kun se havaitsee, että olet vaihtanut sen verkkosivustolla."
+ },
+ "notificationChangeDesc": {
+ "message": "Haluatko päivittää salasanan Bitwardeniin?"
+ },
+ "notificationChangeSave": {
+ "message": "Kyllä, päivitä nyt"
+ },
+ "disableContextMenuItem": {
+ "message": "Älä käytä hiiren kakkospainikkeen pikavalikon toimintoja"
+ },
+ "disableContextMenuItemDesc": {
+ "message": "Hiiren kakkospainikkeen pikavalikon kautta pääset nopeasti käsiksi salasanojen luontiin ja nykyisellä välilehdellä avoinna olevan sivuston kirjautumisteitoihin."
+ },
+ "defaultUriMatchDetection": {
+ "message": "URI:n tunnistuksen oletustapa",
+ "description": "Default URI match detection for auto-fill."
+ },
+ "defaultUriMatchDetectionDesc": {
+ "message": "Valitse oletustapa, jolla URI tunnistetaan esimerkiksi automaattisen täytön yhteydessä."
+ },
+ "theme": {
+ "message": "Teema"
+ },
+ "themeDesc": {
+ "message": "Vaihda sovelluksen väriteemaa."
+ },
+ "dark": {
+ "message": "Tumma",
+ "description": "Dark color"
+ },
+ "light": {
+ "message": "Vaalea",
+ "description": "Light color"
+ },
+ "solarizedDark": {
+ "message": "Solarized, tumma",
+ "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated."
+ },
+ "exportVault": {
+ "message": "Vie holvi"
+ },
+ "fileFormat": {
+ "message": "Tiedostomuoto"
+ },
+ "warning": {
+ "message": "VAROITUS",
+ "description": "WARNING (should stay in capitalized letters if the language permits)"
+ },
+ "confirmVaultExport": {
+ "message": "Vahvista holvin vienti"
+ },
+ "exportWarningDesc": {
+ "message": "Tämä vienti sisältää holvisi tiedot salaamattomassa muodossa. Sinun ei tulisi säilyttää tai lähettää vietyä tiedostoa suojaamattomien kanavien (kuten sähköpostin) välityksellä. Poista se välittömästi kun sille ei enää ole käyttöä."
+ },
+ "encExportKeyWarningDesc": {
+ "message": "Tämä vienti salaa tietosi käyttäjätilisi salausavaimella. Jos joskus uudistat tilisi salausavaimen, on tiedot vietävä uudelleen, koska et voi enää purkaa nyt luodun vientitiedoston salausta."
+ },
+ "encExportAccountWarningDesc": {
+ "message": "Tilin salausavaimet ovat ainutlaatuisia jokaiselle Bitwarden-käyttäjätilille, joten et voi tuoda salattua vientitiedostoa toiselle tilille."
+ },
+ "exportMasterPassword": {
+ "message": "Syötä pääsalasana viedäksesi holvisi tiedot."
+ },
+ "shared": {
+ "message": "Jaettu"
+ },
+ "learnOrg": {
+ "message": "Lisätietoja organisaatioista"
+ },
+ "learnOrgConfirmation": {
+ "message": "Bitwardenin avulla voit jakaa holvisi sisältöä muiden kanssa organisaatiotiliä käyttäen. Haluatko lukea bitwarden.com-sivustolta lisää?"
+ },
+ "moveToOrganization": {
+ "message": "Siirrä organisaatiolle"
+ },
+ "share": {
+ "message": "Jaa"
+ },
+ "movedItemToOrg": {
+ "message": "$ITEMNAME$ siirrettiin organisaatioon $ORGNAME$",
+ "placeholders": {
+ "itemname": {
+ "content": "$1",
+ "example": "Secret Item"
+ },
+ "orgname": {
+ "content": "$2",
+ "example": "Company Name"
+ }
+ }
+ },
+ "moveToOrgDesc": {
+ "message": "Valitse organisaatio, jolle haluat siirtää kohteen. Tämä siirtää kohteen organisaation omistukseen, etkä tämän jälkeen ole enää sen suora omistaja."
+ },
+ "learnMore": {
+ "message": "Lue lisää"
+ },
+ "authenticatorKeyTotp": {
+ "message": "Todennusmenetelmän avain (TOTP)"
+ },
+ "verificationCodeTotp": {
+ "message": "Todennuskoodi (TOTP)"
+ },
+ "copyVerificationCode": {
+ "message": "Kopioi todennuskoodi"
+ },
+ "attachments": {
+ "message": "Liitteet"
+ },
+ "deleteAttachment": {
+ "message": "Poista tiedostoliite"
+ },
+ "deleteAttachmentConfirmation": {
+ "message": "Haluatko varmasti poistaa liitteen?"
+ },
+ "deletedAttachment": {
+ "message": "Poistettiin tiedostoliite"
+ },
+ "newAttachment": {
+ "message": "Lisää uusi tiedostoliite"
+ },
+ "noAttachments": {
+ "message": "Ei liitteitä."
+ },
+ "attachmentSaved": {
+ "message": "Tiedostoliite tallennettiin."
+ },
+ "file": {
+ "message": "Tiedosto"
+ },
+ "selectFile": {
+ "message": "Valitse tiedosto."
+ },
+ "maxFileSize": {
+ "message": "Tiedoston enimmäiskoko on 500 Mt."
+ },
+ "featureUnavailable": {
+ "message": "Toiminto ei ole käytettävissä"
+ },
+ "updateKey": {
+ "message": "Et voi käyttää tätä toimintoa ennen kuin päivität salausavaimesi."
+ },
+ "premiumMembership": {
+ "message": "Premium-jäsenyys"
+ },
+ "premiumManage": {
+ "message": "Hallitse jäsenyyttä"
+ },
+ "premiumManageAlert": {
+ "message": "Voit hallita jäsenyyttäsi bitwarden.com-verkkoholvissa. Haluatko käydä sivustolla nyt?"
+ },
+ "premiumRefresh": {
+ "message": "Päivitä jäsenyys"
+ },
+ "premiumNotCurrentMember": {
+ "message": "Et ole tällä hetkellä Premium-jäsen."
+ },
+ "premiumSignUpAndGet": {
+ "message": "Ryhdy Premium-jäseneksi saadaksesi:"
+ },
+ "ppremiumSignUpStorage": {
+ "message": "1 Gt salattua tallennustilaa tiedostoliitteille."
+ },
+ "ppremiumSignUpTwoStep": {
+ "message": "Muita kaksivaiheisen kirjautumisen todennusmenetelmiä kuten YubiKey, FIDO U2F ja Duo Security."
+ },
+ "ppremiumSignUpReports": {
+ "message": "Salasanahygienian, tilin terveyden ja tietovuotojen raportointitoiminnot pitävät holvisi turvassa."
+ },
+ "ppremiumSignUpTotp": {
+ "message": "Kaksivaiheisen kirjautumisen (2FA) TOTP-todennuskoodien generaattori holvisi kirjautumistiedoille."
+ },
+ "ppremiumSignUpSupport": {
+ "message": "Ensisijainen asiakastuki."
+ },
+ "ppremiumSignUpFuture": {
+ "message": "Kaikki tulossa olevat Premium-toiminnot. Lisää tulossa pian!"
+ },
+ "premiumPurchase": {
+ "message": "Osta Premium"
+ },
+ "premiumPurchaseAlert": {
+ "message": "Voit ostaa Premium-jäsenyyden bitwarden.com-verkkoholvissa. Haluatko käydä sivustolla nyt?"
+ },
+ "premiumCurrentMember": {
+ "message": "Olet Premium-jäsen!"
+ },
+ "premiumCurrentMemberThanks": {
+ "message": "Kiitos kun tuet Bitwardenia."
+ },
+ "premiumPrice": {
+ "message": "Kaikki tämä vain $PRICE$/vuosi!",
+ "placeholders": {
+ "price": {
+ "content": "$1",
+ "example": "$10"
+ }
+ }
+ },
+ "refreshComplete": {
+ "message": "Päivitys on valmis"
+ },
+ "disableAutoTotpCopy": {
+ "message": "Älä kopioi TOTP-todennuskoodeja automaattisesti"
+ },
+ "disableAutoTotpCopyDesc": {
+ "message": "Jos kirjautumistietoosi on liitetty kaksivaiheisen todennusmenetelmän avain, kopioidaan kaksivaiheisen kirjautumisen TOTP-todennuskoodi automaattisesti leikepöydälle kun suoritat kohteen automaattisen täytön."
+ },
+ "disableAutoBiometricsPrompt": {
+ "message": "Älä pyydä biometristä kirjautumista käynnistettäessä."
+ },
+ "premiumRequired": {
+ "message": "Premium vaaditaan"
+ },
+ "premiumRequiredDesc": {
+ "message": "Käyttääksesi tätä toimintoa tarvitset Premium-jäsenyyden."
+ },
+ "enterVerificationCodeApp": {
+ "message": "Syötä 6-numeroinen todennuskoodi todennussovelluksestasi."
+ },
+ "enterVerificationCodeEmail": {
+ "message": "Syötä 6-numeroinen todennuskoodi, joka lähetettiin sähköpostitse osoitteeseen $EMAIL$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "example@gmail.com"
+ }
+ }
+ },
+ "verificationCodeEmailSent": {
+ "message": "Todennussähköposti lähetettiin osoitteeseen $EMAIL$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "example@gmail.com"
+ }
+ }
+ },
+ "rememberMe": {
+ "message": "Muista minut"
+ },
+ "sendVerificationCodeEmailAgain": {
+ "message": "Lähetä todennuskoodi sähköpostitse uudelleen"
+ },
+ "useAnotherTwoStepMethod": {
+ "message": "Käytä eri kaksivaiheisen kirjautumisen todennusmenetelmää"
+ },
+ "insertYubiKey": {
+ "message": "Kytke YubiKey-todennuslaitteesi tietokoneen USB-porttiin ja paina sen painiketta."
+ },
+ "insertU2f": {
+ "message": "Kytke todennuslaitteesi tietokoneen USB-porttiin. Jos laitteessa on painike, paina sitä."
+ },
+ "webAuthnNewTab": {
+ "message": "Aloittaaksesi kaksivaiheisen WebAuthn-todennuksen, seuraa alla olevasta painikkeesta uuteen välilehteen avautuvia ohjeita."
+ },
+ "webAuthnNewTabOpen": {
+ "message": "Avaa uusi välilehti"
+ },
+ "webAuthnAuthenticate": {
+ "message": "WebAuthn-todennus"
+ },
+ "loginUnavailable": {
+ "message": "Kirjautuminen ei ole käytettävissä"
+ },
+ "noTwoStepProviders": {
+ "message": "Tilillä on käytössä kaksivaiheinen kirjautuminen, mutta tämä selain ei tue käytettävissä olevia todennusmenetelmiä."
+ },
+ "noTwoStepProviders2": {
+ "message": "Käytä tuettua selainta (kuten Chrome) ja/tai ota käyttöön laajemmin tuettu todennusmenetelmä (kuten todennussovellus)."
+ },
+ "twoStepOptions": {
+ "message": "Kaksivaiheisen kirjautumisen asetukset"
+ },
+ "recoveryCodeDesc": {
+ "message": "Etkö pysty käyttämään kaksivaiheisen kirjautumisen todennusmenetelmiäsi? Poista kaikki menetelmät käytöstä tililtäsi palautuskoodillasi."
+ },
+ "recoveryCodeTitle": {
+ "message": "Palautuskoodi"
+ },
+ "authenticatorAppTitle": {
+ "message": "Todennussovellus"
+ },
+ "authenticatorAppDesc": {
+ "message": "Käytä todennussovellusta (kuten Authy tai Google Authenticator) luodaksesi aikarajallisia todennuskoodeja.",
+ "description": "'Authy' and 'Google Authenticator' are product names and should not be translated."
+ },
+ "yubiKeyTitle": {
+ "message": "YubiKey OTP -todennuslaite"
+ },
+ "yubiKeyDesc": {
+ "message": "Käytä YubiKey-todennuslaitetta tilisi avaukseen. Toimii YubiKey 4, 4 Nano, 4C sekä NEO -laitteiden kanssa."
+ },
+ "duoDesc": {
+ "message": "Vahvista Duo Securityn avulla käyttäen Duo Mobile ‑sovellusta, tekstiviestiä, puhelua tai U2F-todennuslaitetta.",
+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
+ },
+ "duoOrganizationDesc": {
+ "message": "Vahvista organisaatiollesi Duo Securityn avulla käyttäen Duo Mobile ‑sovellusta, tekstiviestiä, puhelua tai U2F-todennuslaitetta.",
+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
+ },
+ "webAuthnTitle": {
+ "message": "FIDO2 WebAuthn"
+ },
+ "webAuthnDesc": {
+ "message": "Käytä mitä tahansa WebAuthn‑yhteensopivaa todennuslaitetta päästäksesi käsiksi tiliisi."
+ },
+ "emailTitle": {
+ "message": "Sähköposti"
+ },
+ "emailDesc": {
+ "message": "Todennuskoodit lähetetään sinulle sähköpostitse."
+ },
+ "selfHostedEnvironment": {
+ "message": "Oma palvelinympäristö"
+ },
+ "selfHostedEnvironmentFooter": {
+ "message": "Määritä omassa palvelinympäristössäsi suoritettavan Bitwarden-asennuksen pääverkkotunnus."
+ },
+ "customEnvironment": {
+ "message": "Mukautettu palvelinympäristö"
+ },
+ "customEnvironmentFooter": {
+ "message": "Edistyneille käyttäjille. Voit määrittää jokaiselle palvelulle oman pääverkkotunnuksen."
+ },
+ "baseUrl": {
+ "message": "Palvelimen URL"
+ },
+ "apiUrl": {
+ "message": "API-palvelimen URL"
+ },
+ "webVaultUrl": {
+ "message": "Verkkoholvipalvelimen URL"
+ },
+ "identityUrl": {
+ "message": "Henkilöllisyyspalvelimen URL"
+ },
+ "notificationsUrl": {
+ "message": "Ilmoituspalvelimen URL"
+ },
+ "iconsUrl": {
+ "message": "Kuvakepalvelimen URL"
+ },
+ "environmentSaved": {
+ "message": "Palvelinten URL-osoitteet tallennettiin."
+ },
+ "enableAutoFillOnPageLoad": {
+ "message": "Käytä automaattista täyttöä sivun latautuessa"
+ },
+ "enableAutoFillOnPageLoadDesc": {
+ "message": "Jos sivulla havaitaan kirjautumislomake, täytetään kirjautumistiedot automaattisesti sivua ladattaessa."
+ },
+ "experimentalFeature": {
+ "message": "Tämä on vielä kokeellinen toiminto. Käytä omalla vastuullasi."
+ },
+ "defaultAutoFillOnPageLoad": {
+ "message": "Automaattisen täytön oletusasetus kirjautumistiedoille"
+ },
+ "defaultAutoFillOnPageLoadDesc": {
+ "message": "Kun automaattinen täyttö sivun latautuessa on otettu käyttöön, voi toiminnon ottaa käyttöön tai poistaa käytöstä yksittäisille kirjautumistiedoille. Tämä on oletusarvo niille kirjautumistiedoille, joille asetusta ei erikseen ole määritetty."
+ },
+ "itemAutoFillOnPageLoad": {
+ "message": "Automaattinen täyttö sivun latautuessa (jos otettu asetuksista käyttöön)"
+ },
+ "autoFillOnPageLoadUseDefault": {
+ "message": "Käytä oletusasetusta"
+ },
+ "autoFillOnPageLoadYes": {
+ "message": "Täytä automaattisesti sivun latautuessa"
+ },
+ "autoFillOnPageLoadNo": {
+ "message": "Älä täytä automaattisesti sivun latautuessa"
+ },
+ "commandOpenPopup": {
+ "message": "Avaa holvin ponnahdusikkuna"
+ },
+ "commandOpenSidebar": {
+ "message": "Avaa holvi sivupalkissa"
+ },
+ "commandAutofillDesc": {
+ "message": "Täytä automaattisesti viimeisin nykyisellä sivustolla käytetty kirjautumistieto"
+ },
+ "commandGeneratePasswordDesc": {
+ "message": "Luo uusi satunnainen salasana ja kopioi se leikepöydälle."
+ },
+ "commandLockVaultDesc": {
+ "message": "Lukitse holvi"
+ },
+ "privateModeMessage": {
+ "message": "Valitettavasti tämä ikkuna ei ole käytettävissä tämän selaimen yksityisessä selaustilassa."
+ },
+ "customFields": {
+ "message": "Lisäkentät"
+ },
+ "copyValue": {
+ "message": "Kopioi arvo"
+ },
+ "value": {
+ "message": "Arvo"
+ },
+ "newCustomField": {
+ "message": "Uusi lisäkenttä"
+ },
+ "dragToSort": {
+ "message": "Järjestä raahaamalla"
+ },
+ "cfTypeText": {
+ "message": "Teksti"
+ },
+ "cfTypeHidden": {
+ "message": "Piilotettu"
+ },
+ "cfTypeBoolean": {
+ "message": "Totuusarvo"
+ },
+ "popup2faCloseMessage": {
+ "message": "Klikkaus ponnahdusikkunan ulkopuolelle todennuskoodin sähköpostista noutoa varten sulkee ikkunan. Haluatko avata näkymän uuteen ikkunaan, jotta se pysyy avoinna?"
+ },
+ "popupU2fCloseMessage": {
+ "message": "Tämä selain ei voi käsitellä U2F-pyyntöjä tässä ponnahdusikkunassa. Haluatko avata näkymän uuteen ikkunaan, jotta voit vahvistaa kirjautumisen U2F-todennuslaitteella?"
+ },
+ "disableFavicon": {
+ "message": "Älä näytä sivustojen kuvakkeita"
+ },
+ "disableFaviconDesc": {
+ "message": "Kirjautumistietojen vieressä näytettävät sivustojen kuvakkeet helpottavat kohteiden tunnistusta."
+ },
+ "disableBadgeCounter": {
+ "message": "Älä näytä kuvakkeen laskuria"
+ },
+ "disableBadgeCounterDesc": {
+ "message": "Kuvakkeen laskuri näyttää nykyiseen sivuun kohdistuvien kirjautumistietojen määrän holvissasi."
+ },
+ "cardholderName": {
+ "message": "Kortinhaltijan nimi"
+ },
+ "number": {
+ "message": "Numero"
+ },
+ "brand": {
+ "message": "Merkki"
+ },
+ "expirationMonth": {
+ "message": "Erääntymiskuukausi"
+ },
+ "expirationYear": {
+ "message": "Erääntymisvuosi"
+ },
+ "expiration": {
+ "message": "Erääntymisaika"
+ },
+ "january": {
+ "message": "Tammikuu"
+ },
+ "february": {
+ "message": "Helmikuu"
+ },
+ "march": {
+ "message": "Maaliskuu"
+ },
+ "april": {
+ "message": "Huhtikuu"
+ },
+ "may": {
+ "message": "Toukokuu"
+ },
+ "june": {
+ "message": "Kesäkuu"
+ },
+ "july": {
+ "message": "Heinäkuu"
+ },
+ "august": {
+ "message": "Elokuu"
+ },
+ "september": {
+ "message": "Syyskuu"
+ },
+ "october": {
+ "message": "Lokakuu"
+ },
+ "november": {
+ "message": "Marraskuu"
+ },
+ "december": {
+ "message": "Joulukuu"
+ },
+ "securityCode": {
+ "message": "Turvakoodi (CVC/CVV)"
+ },
+ "ex": {
+ "message": "esim."
+ },
+ "title": {
+ "message": "Titteli"
+ },
+ "mr": {
+ "message": "Hra"
+ },
+ "mrs": {
+ "message": "Rva"
+ },
+ "ms": {
+ "message": "Nti"
+ },
+ "dr": {
+ "message": "Tri"
+ },
+ "firstName": {
+ "message": "Etunimi"
+ },
+ "middleName": {
+ "message": "Toinen nimi"
+ },
+ "lastName": {
+ "message": "Sukunimi"
+ },
+ "identityName": {
+ "message": "Henkilöllisyyden nimi"
+ },
+ "company": {
+ "message": "Yritys"
+ },
+ "ssn": {
+ "message": "Henkilötunnus"
+ },
+ "passportNumber": {
+ "message": "Passin numero"
+ },
+ "licenseNumber": {
+ "message": "Ajokortin numero"
+ },
+ "email": {
+ "message": "Sähköposti"
+ },
+ "phone": {
+ "message": "Puhelinnumero"
+ },
+ "address": {
+ "message": "Osoite"
+ },
+ "address1": {
+ "message": "Osoite 1"
+ },
+ "address2": {
+ "message": "Osoite 2"
+ },
+ "address3": {
+ "message": "Osoite 3"
+ },
+ "cityTown": {
+ "message": "Paikkakunta"
+ },
+ "stateProvince": {
+ "message": "Osavaltio/maakunta"
+ },
+ "zipPostalCode": {
+ "message": "Postinumero"
+ },
+ "country": {
+ "message": "Maa"
+ },
+ "type": {
+ "message": "Tyyppi"
+ },
+ "typeLogin": {
+ "message": "Kirjautumistieto"
+ },
+ "typeLogins": {
+ "message": "Kirjautumistiedot"
+ },
+ "typeSecureNote": {
+ "message": "Salattu muistio"
+ },
+ "typeCard": {
+ "message": "Kortti"
+ },
+ "typeIdentity": {
+ "message": "Henkilöllisyys"
+ },
+ "passwordHistory": {
+ "message": "Salasanahistoria"
+ },
+ "back": {
+ "message": "Takaisin"
+ },
+ "collections": {
+ "message": "Kokoelmat"
+ },
+ "favorites": {
+ "message": "Suosikit"
+ },
+ "popOutNewWindow": {
+ "message": "Avaa uuteen ikkunaan"
+ },
+ "refresh": {
+ "message": "Päivitä"
+ },
+ "cards": {
+ "message": "Kortit"
+ },
+ "identities": {
+ "message": "Henkilöllisyydet"
+ },
+ "logins": {
+ "message": "Kirjautumistiedot"
+ },
+ "secureNotes": {
+ "message": "Salatut muistiot"
+ },
+ "clear": {
+ "message": "Tyhjennä",
+ "description": "To clear something out. example: To clear browser history."
+ },
+ "checkPassword": {
+ "message": "Tarkasta, onko salasana vuotanut."
+ },
+ "passwordExposed": {
+ "message": "Salasana on paljastunut $VALUE$ tietovuodossa. Se tulisi vaihtaa.",
+ "placeholders": {
+ "value": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "passwordSafe": {
+ "message": "Tätä salasanaa ei löytynyt yhdestäkään tunnetusta tietovuodosta. Sen pitäisi olla turvallinen."
+ },
+ "baseDomain": {
+ "message": "Pääverkkotunnus"
+ },
+ "host": {
+ "message": "Isäntä",
+ "description": "A URL's host value. For example, the host of https://sub.domain.com:443 is 'sub.domain.com:443'."
+ },
+ "exact": {
+ "message": "Tarkka"
+ },
+ "startsWith": {
+ "message": "Alkaa"
+ },
+ "regEx": {
+ "message": "Säännöllinen lauseke",
+ "description": "A programming term, also known as 'RegEx'."
+ },
+ "matchDetection": {
+ "message": "Tunnistustapa",
+ "description": "URI match detection for auto-fill."
+ },
+ "defaultMatchDetection": {
+ "message": "Tunnistuksen oletustapa",
+ "description": "Default URI match detection for auto-fill."
+ },
+ "toggleOptions": {
+ "message": "Näytä tai piilota asetukset"
+ },
+ "toggleCurrentUris": {
+ "message": "Näytä tai piilota nykyiset URI:t",
+ "description": "Toggle the display of the URIs of the currently open tabs in the browser."
+ },
+ "currentUri": {
+ "message": "Nykyinen URI",
+ "description": "The URI of one of the current open tabs in the browser."
+ },
+ "organization": {
+ "message": "Organisaatio",
+ "description": "An entity of multiple related people (ex. a team or business organization)."
+ },
+ "types": {
+ "message": "Tyypit"
+ },
+ "allItems": {
+ "message": "Kaikki kohteet"
+ },
+ "noPasswordsInList": {
+ "message": "Ei näytettäviä salasanoja."
+ },
+ "remove": {
+ "message": "Poista"
+ },
+ "default": {
+ "message": "Oletus"
+ },
+ "dateUpdated": {
+ "message": "Päivitetty",
+ "description": "ex. Date this item was updated"
+ },
+ "datePasswordUpdated": {
+ "message": "Salasana päivitettiin",
+ "description": "ex. Date this password was updated"
+ },
+ "neverLockWarning": {
+ "message": "Oletko varma, että haluat käyttää asetusta \"Ei koskaan\"? Tämä valinta tallentaa holvisi salausavaimen laitteellesi. Jos käytät asetusta, varmista että laitteesi on hyvin suojattu."
+ },
+ "noOrganizationsList": {
+ "message": "Et kuulu mihinkään organisaatioon. Organisaatioiden avulla voit jakaa kohteita turvallisesti muiden käyttäjien kanssa."
+ },
+ "noCollectionsInList": {
+ "message": "Ei näytettäviä kokoelmia."
+ },
+ "ownership": {
+ "message": "Omistus"
+ },
+ "whoOwnsThisItem": {
+ "message": "Kuka omistaa tämän kohteen?"
+ },
+ "strong": {
+ "message": "Vahva",
+ "description": "ex. A strong password. Scale: Weak -> Good -> Strong"
+ },
+ "good": {
+ "message": "Hyvä",
+ "description": "ex. A good password. Scale: Weak -> Good -> Strong"
+ },
+ "weak": {
+ "message": "Heikko",
+ "description": "ex. A weak password. Scale: Weak -> Good -> Strong"
+ },
+ "weakMasterPassword": {
+ "message": "Heikko pääsalasana"
+ },
+ "weakMasterPasswordDesc": {
+ "message": "Valitsemasi pääsalasana on heikko. Sinun tulisi käyttää vahvaa pääsalasanaa (tai salauslauseketta) suojataksesi Bitwarden-tilisi kunnolla. Haluatko varmasti käyttää tätä pääsalasanaa?"
+ },
+ "pin": {
+ "message": "PIN",
+ "description": "PIN code. Ex. The short code (often numeric) that you use to unlock a device."
+ },
+ "unlockWithPin": {
+ "message": "Avaa PIN-koodilla"
+ },
+ "setYourPinCode": {
+ "message": "Aseta PIN-koodi Bitwardenin avaukselle. PIN-asetukset tyhjentyvät, jos kirjaudut kokonaan ulos laajennuksesta."
+ },
+ "pinRequired": {
+ "message": "PIN-koodi vaaditaan."
+ },
+ "invalidPin": {
+ "message": "Virheellinen PIN-koodi."
+ },
+ "verifyPin": {
+ "message": "Vahvista PIN-koodi"
+ },
+ "yourVaultIsLockedPinCode": {
+ "message": "Holvisi on lukittu. Vahvista PIN-koodisi jatkaaksesi."
+ },
+ "unlockWithBiometrics": {
+ "message": "Avaa biometrialla"
+ },
+ "awaitDesktop": {
+ "message": "Odottaa vahvistusta työpöydältä"
+ },
+ "awaitDesktopDesc": {
+ "message": "Vahvista biometrian käyttö Bitwardenin työpöytäsovelluksessa käyttääksesi sitä selaimessa."
+ },
+ "lockWithMasterPassOnRestart": {
+ "message": "Lukitse pääsalasanalla kun selain käynnistetään uudelleen"
+ },
+ "selectOneCollection": {
+ "message": "Valitse ainakin yksi kokoelma."
+ },
+ "cloneItem": {
+ "message": "Kloonaa kohde"
+ },
+ "clone": {
+ "message": "Kloonaa"
+ },
+ "passwordGeneratorPolicyInEffect": {
+ "message": "Yksi tai useampi organisaatiokäytäntö vaikuttaa generaattorisi asetuksiin."
+ },
+ "vaultTimeoutAction": {
+ "message": "Holvin aikakatkaisun toiminto"
+ },
+ "lock": {
+ "message": "Lukitse",
+ "description": "Verb form: to make secure or inaccesible by"
+ },
+ "trash": {
+ "message": "Roskakori",
+ "description": "Noun: a special folder to hold deleted items"
+ },
+ "searchTrash": {
+ "message": "Hae roskakorista"
+ },
+ "permanentlyDeleteItem": {
+ "message": "Poista kohde pysyvästi"
+ },
+ "permanentlyDeleteItemConfirmation": {
+ "message": "Haluatko varmasti poistaa kohteen pysyvästi?"
+ },
+ "permanentlyDeletedItem": {
+ "message": "Poistettiin kohde pysyvästi"
+ },
+ "restoreItem": {
+ "message": "Palauta kohde"
+ },
+ "restoreItemConfirmation": {
+ "message": "Haluatko varmasti palauttaa kohteen?"
+ },
+ "restoredItem": {
+ "message": "Kohde palautettiin"
+ },
+ "vaultTimeoutLogOutConfirmation": {
+ "message": "Uloskirjautuminen estää pääsyn holviisi ja vaatii ajan umpeuduttua todennuksen internet-yhteyden välityksellä. Haluatko varmasti käyttää tätä asetusta?"
+ },
+ "vaultTimeoutLogOutConfirmationTitle": {
+ "message": "Aikakatkaisun toiminnon vahvistus"
+ },
+ "autoFillAndSave": {
+ "message": "Täytä automaattisesti ja tallenna"
+ },
+ "autoFillSuccessAndSavedUri": {
+ "message": "Kohde täytettiin automaattisesti ja URI tallennettiin"
+ },
+ "autoFillSuccess": {
+ "message": "Kohde täytettiin automaattisesti"
+ },
+ "setMasterPassword": {
+ "message": "Aseta pääsalasana"
+ },
+ "masterPasswordPolicyInEffect": {
+ "message": "Yksi tai useampi organisaatiokäytäntö edellyttää, että pääsalasanasi täyttää seuraavat vaatimukset:"
+ },
+ "policyInEffectMinComplexity": {
+ "message": "Monimutkaisuuden vähimmäispistemäärä on $SCORE$",
+ "placeholders": {
+ "score": {
+ "content": "$1",
+ "example": "4"
+ }
+ }
+ },
+ "policyInEffectMinLength": {
+ "message": "Vähimmäispituus on $LENGTH$",
+ "placeholders": {
+ "length": {
+ "content": "$1",
+ "example": "14"
+ }
+ }
+ },
+ "policyInEffectUppercase": {
+ "message": "Sisältää yhden tai useamman ison kirjaimen"
+ },
+ "policyInEffectLowercase": {
+ "message": "Sisältää yhden tai useamman pienen kirjaimen"
+ },
+ "policyInEffectNumbers": {
+ "message": "Sisältää yhden tai useamman numeron"
+ },
+ "policyInEffectSpecial": {
+ "message": "Sisältää yhden tai useamman seuraavista erikoismerkeistä $CHARS$",
+ "placeholders": {
+ "chars": {
+ "content": "$1",
+ "example": "!@#$%^&*"
+ }
+ }
+ },
+ "masterPasswordPolicyRequirementsNotMet": {
+ "message": "Uusi pääsalasanasi ei täytä käytännön määrittämiä vaatimuksia."
+ },
+ "acceptPolicies": {
+ "message": "Valitsemalla tämän ruudun hyväksyt seuraavat:"
+ },
+ "acceptPoliciesError": {
+ "message": "Käyttöehtoja ja tietosuojakäytäntöä ei ole vahvistettu."
+ },
+ "termsOfService": {
+ "message": "Käyttöehdot"
+ },
+ "privacyPolicy": {
+ "message": "Tietosuojakäytäntö"
+ },
+ "hintEqualsPassword": {
+ "message": "Salasanavihjeesi ei voi olla sama kuin salasanasi."
+ },
+ "ok": {
+ "message": "Ok"
+ },
+ "desktopSyncVerificationTitle": {
+ "message": "Työpöytäsynkronoinnin vahvistus"
+ },
+ "desktopIntegrationVerificationText": {
+ "message": "Varmista, että työpöytäsovellus näyttää tämän tunnistelausekkeen:"
+ },
+ "desktopIntegrationDisabledTitle": {
+ "message": "Selainintegrointi ei ole käytössä"
+ },
+ "desktopIntegrationDisabledDesc": {
+ "message": "Selainintegrointi ei ole käytössä Bitwardenin työpöytäsovelluksessa. Ota se käyttöön työpöytäsovelluksen asetuksista."
+ },
+ "startDesktopTitle": {
+ "message": "Käynnistä Bitwardenin työpöytäsovellus"
+ },
+ "startDesktopDesc": {
+ "message": "Bitwardenin työpöytäsovellus on käynnistettävä ennen kuin tätä toimintoa voidaan käyttää."
+ },
+ "errorEnableBiometricTitle": {
+ "message": "Biometrian käyttöönotto ei onnistu"
+ },
+ "errorEnableBiometricDesc": {
+ "message": "Toiminto peruttiin työpöytäsovelluksen toimesta"
+ },
+ "nativeMessagingInvalidEncryptionDesc": {
+ "message": "Työpöytäsovellus hyläsi suojatun viestintäväylän. Yritä toimintoa uudelleen"
+ },
+ "nativeMessagingInvalidEncryptionTitle": {
+ "message": "Työpöytäyhteys keskeytyi"
+ },
+ "nativeMessagingWrongUserDesc": {
+ "message": "Työpöytäsovellus on kirjautuneena eri tilille. Varmista, että molemmat sovellukset ovat kirjautuneet samalle tilille."
+ },
+ "nativeMessagingWrongUserTitle": {
+ "message": "Tili ei täsmää"
+ },
+ "biometricsNotEnabledTitle": {
+ "message": "Biometria ei ole käytössä"
+ },
+ "biometricsNotEnabledDesc": {
+ "message": "Käyttääksesi biometriaa selaimessa, on biometria otettava käyttöön työpöytäsovelluksen asetuksista."
+ },
+ "biometricsNotSupportedTitle": {
+ "message": "Biometriaa ei tueta"
+ },
+ "biometricsNotSupportedDesc": {
+ "message": "Selaimen biometriaa ei tueta tällä laitteella."
+ },
+ "nativeMessaginPermissionErrorTitle": {
+ "message": "Oikeutta ei myönnetty"
+ },
+ "nativeMessaginPermissionErrorDesc": {
+ "message": "Ilman oikeutta kommunikointiin Bitwardenin työpöytäseovleluksen kanssa ei biometriaa tueta selainlaajennuksessa. Yritä uudelleen."
+ },
+ "nativeMessaginPermissionSidebarTitle": {
+ "message": "Käyttöoikeuspyynnön virhe"
+ },
+ "nativeMessaginPermissionSidebarDesc": {
+ "message": "Toimintoa ei voi suorittaa sivupalkissa, yritä toimintoa uudelleen ponnahdusvalikossa tai ponnahdusikkunassa."
+ },
+ "personalOwnershipSubmitError": {
+ "message": "Yrityksen asettaman käytännön johdosta kohteiden tallennus omaan holviisi ei ole mahdollista. Muuta omistusasetus organisaatiolle ja valitse käytettävissä olevista kokoelmista."
+ },
+ "personalOwnershipPolicyInEffect": {
+ "message": "Organisaatiokäytäntö vaikuttaa omistajuusvalintoihisi."
+ },
+ "excludedDomains": {
+ "message": "Ohitettavat verkkotunnukset"
+ },
+ "excludedDomainsDesc": {
+ "message": "Bitwarden ei pyydä kirjautumistietojen tallennusta näille verkkotunnuksille. Päivitä sivu ottaaksesi muutokset käyttöön."
+ },
+ "excludedDomainsInvalidDomain": {
+ "message": "$DOMAIN$ ei ole kelvollinen verkkotunnus",
+ "placeholders": {
+ "domain": {
+ "content": "$1",
+ "example": "googlecom"
+ }
+ }
+ },
+ "send": {
+ "message": "Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "searchSends": {
+ "message": "Hae Sendeistä",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "addSend": {
+ "message": "Lisää Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTypeText": {
+ "message": "Teksti"
+ },
+ "sendTypeFile": {
+ "message": "Tiedosto"
+ },
+ "allSends": {
+ "message": "Kaikki Sendit",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "maxAccessCountReached": {
+ "message": "Käyttökertojen enimmäismäärä saavutettu"
+ },
+ "expired": {
+ "message": "Erääntynyt"
+ },
+ "pendingDeletion": {
+ "message": "Odottaa poistoa"
+ },
+ "passwordProtected": {
+ "message": "Salasanasuojattu"
+ },
+ "copySendLink": {
+ "message": "Kopioi Sendin linkki",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "removePassword": {
+ "message": "Poista salasana"
+ },
+ "delete": {
+ "message": "Poista"
+ },
+ "removedPassword": {
+ "message": "Poistettiin salasana"
+ },
+ "deletedSend": {
+ "message": "Poistettiin Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendLink": {
+ "message": "Send-linkki",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "disabled": {
+ "message": "Poistettu käytöstä"
+ },
+ "removePasswordConfirmation": {
+ "message": "Haluatko varmasti poistaa salasanan?"
+ },
+ "deleteSend": {
+ "message": "Poista Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "deleteSendConfirmation": {
+ "message": "Haluatko varmasti poistaa Sendin?",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "editSend": {
+ "message": "Muokkaa Sendiä",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTypeHeader": {
+ "message": "Minkä tyyppinen Send tämä on?",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendNameDesc": {
+ "message": "Kuvaava nimi Sendille.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendFileDesc": {
+ "message": "Tiedosto, jonka haluat lähettää."
+ },
+ "deletionDate": {
+ "message": "Poistoajankohta"
+ },
+ "deletionDateDesc": {
+ "message": "Send poistuu pysyvästi määritettynä ajankohtana.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "expirationDate": {
+ "message": "Erääntymisajankohta"
+ },
+ "expirationDateDesc": {
+ "message": "Jos määritetty, Send erääntyy määritettynä ajankohtana.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "oneDay": {
+ "message": "1 päivä"
+ },
+ "days": {
+ "message": "$DAYS$ päivää",
+ "placeholders": {
+ "days": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "custom": {
+ "message": "Mukautettu"
+ },
+ "maximumAccessCount": {
+ "message": "Käyttöoikeuksien enimmäismäärä"
+ },
+ "maximumAccessCountDesc": {
+ "message": "Jos määritetty, käyttäjät eivät voi avata Sendiä käyttökertojen enimmäismäärän täytyttyä.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendPasswordDesc": {
+ "message": "Halutessasi, vaadi käyttäjiä syöttämään salasana Sendin avaamiseksi.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendNotesDesc": {
+ "message": "Yksityiset muistiinpanot tästä Sendistä.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendDisableDesc": {
+ "message": "Poista Send käytöstä, jottei kukaan voi avata sitä.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendShareDesc": {
+ "message": "Kopioi Sendin linkki leikepöydälle tallennettaessa.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTextDesc": {
+ "message": "Teksti, jonka haluat lähettää."
+ },
+ "sendHideText": {
+ "message": "Piilota Sendin teksti oletuksena.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "currentAccessCount": {
+ "message": "Nykyinen käyttökertojen määrä"
+ },
+ "createSend": {
+ "message": "Luo uusi Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "newPassword": {
+ "message": "Uusi salasana"
+ },
+ "sendDisabled": {
+ "message": "Send on poistettu käytöstä",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendDisabledWarning": {
+ "message": "Yrityksen käytännön vuoksi voit poistaa vain olemassa olevan Sendin.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "createdSend": {
+ "message": "Luotiin Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "editedSend": {
+ "message": "Muokattiin Sendiä",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendLinuxChromiumFileWarning": {
+ "message": "Jotta voit valita tiedoston, avaa laajennus sivupalkkiin (jos mahdollista) tai erilliseen ikkunaan klikkaamalla tätä banneria."
+ },
+ "sendFirefoxFileWarning": {
+ "message": "Jotta voit valita tiedoston käyttäen Firefoxia, avaa laajennus sivupalkkiin tai erilliseen ikkunaan klikkaamalla tätä banneria."
+ },
+ "sendSafariFileWarning": {
+ "message": "Jotta voit valita tiedoston käyttäen Safaria, avaa laajennus erilliseen ikkunaan klikkaamalla tätä banneria."
+ },
+ "sendFileCalloutHeader": {
+ "message": "Ennen kuin aloitat"
+ },
+ "sendFirefoxCustomDatePopoutMessage1": {
+ "message": "Käyttääksesi kalenterityylistä päivämäärän valintaa",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read '**To use a calendar style date picker ** click here to pop out your window.'"
+ },
+ "sendFirefoxCustomDatePopoutMessage2": {
+ "message": "klikkaa tästä",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker **click here** to pop out your window.'"
+ },
+ "sendFirefoxCustomDatePopoutMessage3": {
+ "message": "erillistä valintaa varten.",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker click here **to pop out your window.**'"
+ },
+ "expirationDateIsInvalid": {
+ "message": "Määritetty erääntymismisajankohta on virheellinen."
+ },
+ "deletionDateIsInvalid": {
+ "message": "Määritetty poistoajankohta on virheellinen."
+ },
+ "expirationDateAndTimeRequired": {
+ "message": "Erääntymispäivä ja -aika vaaditaan."
+ },
+ "deletionDateAndTimeRequired": {
+ "message": "Poistopäivä ja -aika vaaditaan."
+ },
+ "dateParsingError": {
+ "message": "Tapahtui virhe tallennettaessa poisto- ja erääntymisajankohtia."
+ },
+ "hideEmail": {
+ "message": "Piilota sähköpostiosoitteeni vastaanottajilta."
+ },
+ "sendOptionsPolicyInEffect": {
+ "message": "Yksi tai useampi organisaatiokäytäntö vaikuttaa Send-asetuksiisi."
+ },
+ "passwordPrompt": {
+ "message": "Pääsalasanan uudelleenkysely"
+ },
+ "passwordConfirmation": {
+ "message": "Pääsalasanan vahvistus"
+ },
+ "passwordConfirmationDesc": {
+ "message": "Toiminto on suojattu. Jatkaaksesi, syötä pääsalasanasi uudelleen vahvistaaksesi henkilöllisyytesi."
+ },
+ "emailVerificationRequired": {
+ "message": "Sähköpostiosoitteen vahvistus vaaditaan"
+ },
+ "emailVerificationRequiredDesc": {
+ "message": "Sinun on vahvistettava sähköpostiosoitteesi käyttääksesi ominaisuutta. Voit vahvistaa osoitteesi verkkoholvissa."
+ },
+ "updatedMasterPassword": {
+ "message": "Pääsalasana on päivitetty"
+ },
+ "updateMasterPassword": {
+ "message": "Päivitä pääsalasana"
+ },
+ "updateMasterPasswordWarning": {
+ "message": "Organisaatiosi ylläpito on hiljattain vaihtanut pääsalasanasi. Käyttääksesi holvia, on sinun päivitettävä se nyt. Tämä uloskirjaa kaikki nykyiset istunnot pakottaen uudelleenkirjautumisen. Muiden laitteiden aktiiviset istunnot saattavat toimia vielä tunnin ajan."
+ },
+ "resetPasswordPolicyAutoEnroll": {
+ "message": "Automaattinen liitos"
+ },
+ "resetPasswordAutoEnrollInviteWarning": {
+ "message": "Organisaatiolla on käytäntö, joka liittää tilisi automaattisesti salasanan palautusapuun. Liitos sallii organisaation ylläpitäjien vaihtaa pääsalasanasi."
+ },
+ "selectFolder": {
+ "message": "Valitse kansio..."
+ },
+ "ssoCompleteRegistration": {
+ "message": "Kirjautuaksesi sisään käyttäen kertakirjautumista (SSO), suojaa holvisi pääsalasanalla."
+ },
+ "hours": {
+ "message": "Tuntia"
+ },
+ "minutes": {
+ "message": "Minuuttia"
+ },
+ "vaultTimeoutPolicyInEffect": {
+ "message": "Organisaatiosi käytännöt vaikuttavat holvisi aikakatkaisuun. Suurin sallittu viive on $HOURS$ tunti(a) ja $MINUTES$ minuutti(a)",
+ "placeholders": {
+ "hours": {
+ "content": "$1",
+ "example": "5"
+ },
+ "minutes": {
+ "content": "$2",
+ "example": "5"
+ }
+ }
+ },
+ "vaultTimeoutToLarge": {
+ "message": "Holvisi aikakatkaisuviive ylittää organisaatiosi asettamat rajoitukset."
+ },
+ "vaultExportDisabled": {
+ "message": "Holvin vienti on poistettu käytöstä"
+ },
+ "personalVaultExportPolicyInEffect": {
+ "message": "Yksi tai useampi organisaation käytäntö estää henkilökohtaisen holvisi viennin."
+ },
+ "copyCustomFieldNameInvalidElement": {
+ "message": "Oikeaa lomakkeen elementtiä ei tunnistettu. Yritä sen sijaan tarkistaa HTML."
+ },
+ "copyCustomFieldNameNotUnique": {
+ "message": "Yksilöllistä tunnistetta ei löytynyt."
+ }
+}
diff --git a/src/iOS.Safari/Resources/_locales/fil/messages.json b/src/iOS.Safari/Resources/_locales/fil/messages.json
new file mode 100644
index 000000000..af284dde2
--- /dev/null
+++ b/src/iOS.Safari/Resources/_locales/fil/messages.json
@@ -0,0 +1,1817 @@
+{
+ "appName": {
+ "message": "Bitwarden"
+ },
+ "extName": {
+ "message": "Bitwarden - Free Password Manager",
+ "description": "Extension name, MUST be less than 40 characters (Safari restriction)"
+ },
+ "extDesc": {
+ "message": "A secure and free password manager for all of your devices.",
+ "description": "Extension description"
+ },
+ "loginOrCreateNewAccount": {
+ "message": "Log in or create a new account to access your secure vault."
+ },
+ "createAccount": {
+ "message": "Create Account"
+ },
+ "login": {
+ "message": "Log In"
+ },
+ "enterpriseSingleSignOn": {
+ "message": "Enterprise Single Sign-On"
+ },
+ "cancel": {
+ "message": "Cancel"
+ },
+ "close": {
+ "message": "Close"
+ },
+ "submit": {
+ "message": "Submit"
+ },
+ "emailAddress": {
+ "message": "Email Address"
+ },
+ "masterPass": {
+ "message": "Master Password"
+ },
+ "masterPassDesc": {
+ "message": "The master password is the password you use to access your vault. It is very important that you do not forget your master password. There is no way to recover the password in the event that you forget it."
+ },
+ "masterPassHintDesc": {
+ "message": "A master password hint can help you remember your password if you forget it."
+ },
+ "reTypeMasterPass": {
+ "message": "Re-type Master Password"
+ },
+ "masterPassHint": {
+ "message": "Master Password Hint (optional)"
+ },
+ "tab": {
+ "message": "Tab"
+ },
+ "myVault": {
+ "message": "My Vault"
+ },
+ "tools": {
+ "message": "Tools"
+ },
+ "settings": {
+ "message": "Settings"
+ },
+ "currentTab": {
+ "message": "Current Tab"
+ },
+ "copyPassword": {
+ "message": "Copy Password"
+ },
+ "copyNote": {
+ "message": "Copy Note"
+ },
+ "copyUri": {
+ "message": "Copy URI"
+ },
+ "copyUsername": {
+ "message": "Copy Username"
+ },
+ "copyNumber": {
+ "message": "Copy Number"
+ },
+ "copySecurityCode": {
+ "message": "Copy Security Code"
+ },
+ "autoFill": {
+ "message": "Auto-fill"
+ },
+ "generatePasswordCopied": {
+ "message": "Generate Password (copied)"
+ },
+ "copyElementIdentifier": {
+ "message": "Copy Custom Field Name"
+ },
+ "noMatchingLogins": {
+ "message": "No matching logins."
+ },
+ "vaultLocked": {
+ "message": "Vault is locked."
+ },
+ "vaultLoggedOut": {
+ "message": "Vault is logged out."
+ },
+ "autoFillInfo": {
+ "message": "There are no logins available to auto-fill for the current browser tab."
+ },
+ "addLogin": {
+ "message": "Add a Login"
+ },
+ "addItem": {
+ "message": "Add Item"
+ },
+ "passwordHint": {
+ "message": "Password Hint"
+ },
+ "enterEmailToGetHint": {
+ "message": "Enter your account email address to receive your master password hint."
+ },
+ "getMasterPasswordHint": {
+ "message": "Get master password hint"
+ },
+ "continue": {
+ "message": "Continue"
+ },
+ "verificationCode": {
+ "message": "Verification Code"
+ },
+ "account": {
+ "message": "Account"
+ },
+ "changeMasterPassword": {
+ "message": "Change Master Password"
+ },
+ "fingerprintPhrase": {
+ "message": "Fingerprint Phrase",
+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
+ },
+ "yourAccountsFingerprint": {
+ "message": "Your account's fingerprint phrase",
+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
+ },
+ "twoStepLogin": {
+ "message": "Two-step Login"
+ },
+ "logOut": {
+ "message": "Log Out"
+ },
+ "about": {
+ "message": "About"
+ },
+ "version": {
+ "message": "Version"
+ },
+ "save": {
+ "message": "Save"
+ },
+ "move": {
+ "message": "Move"
+ },
+ "addFolder": {
+ "message": "Add Folder"
+ },
+ "name": {
+ "message": "Name"
+ },
+ "editFolder": {
+ "message": "Edit Folder"
+ },
+ "deleteFolder": {
+ "message": "Delete Folder"
+ },
+ "folders": {
+ "message": "Folders"
+ },
+ "noFolders": {
+ "message": "There are no folders to list."
+ },
+ "helpFeedback": {
+ "message": "Help & Feedback"
+ },
+ "sync": {
+ "message": "Sync"
+ },
+ "syncVaultNow": {
+ "message": "Sync Vault Now"
+ },
+ "lastSync": {
+ "message": "Last Sync:"
+ },
+ "passGen": {
+ "message": "Password Generator"
+ },
+ "generator": {
+ "message": "Generator",
+ "description": "Short for 'Password Generator'."
+ },
+ "passGenInfo": {
+ "message": "Automatically generate strong, unique passwords for your logins."
+ },
+ "bitWebVault": {
+ "message": "Bitwarden Web Vault"
+ },
+ "importItems": {
+ "message": "Import Items"
+ },
+ "select": {
+ "message": "Select"
+ },
+ "generatePassword": {
+ "message": "Generate Password"
+ },
+ "regeneratePassword": {
+ "message": "Regenerate Password"
+ },
+ "options": {
+ "message": "Options"
+ },
+ "length": {
+ "message": "Length"
+ },
+ "numWords": {
+ "message": "Number of Words"
+ },
+ "wordSeparator": {
+ "message": "Word Separator"
+ },
+ "capitalize": {
+ "message": "Capitalize",
+ "description": "Make the first letter of a work uppercase."
+ },
+ "includeNumber": {
+ "message": "Include Number"
+ },
+ "minNumbers": {
+ "message": "Minimum Numbers"
+ },
+ "minSpecial": {
+ "message": "Minimum Special"
+ },
+ "avoidAmbChar": {
+ "message": "Avoid Ambiguous Characters"
+ },
+ "searchVault": {
+ "message": "Search vault"
+ },
+ "edit": {
+ "message": "Edit"
+ },
+ "view": {
+ "message": "View"
+ },
+ "noItemsInList": {
+ "message": "There are no items to list."
+ },
+ "itemInformation": {
+ "message": "Item Information"
+ },
+ "username": {
+ "message": "Username"
+ },
+ "password": {
+ "message": "Password"
+ },
+ "passphrase": {
+ "message": "Passphrase"
+ },
+ "favorite": {
+ "message": "Favorite"
+ },
+ "notes": {
+ "message": "Notes"
+ },
+ "note": {
+ "message": "Note"
+ },
+ "editItem": {
+ "message": "Edit Item"
+ },
+ "folder": {
+ "message": "Folder"
+ },
+ "deleteItem": {
+ "message": "Delete Item"
+ },
+ "viewItem": {
+ "message": "View Item"
+ },
+ "launch": {
+ "message": "Launch"
+ },
+ "website": {
+ "message": "Website"
+ },
+ "toggleVisibility": {
+ "message": "Toggle Visibility"
+ },
+ "manage": {
+ "message": "Manage"
+ },
+ "other": {
+ "message": "Other"
+ },
+ "rateExtension": {
+ "message": "Rate the Extension"
+ },
+ "rateExtensionDesc": {
+ "message": "Please consider helping us out with a good review!"
+ },
+ "browserNotSupportClipboard": {
+ "message": "Your web browser does not support easy clipboard copying. Copy it manually instead."
+ },
+ "verifyMasterPassword": {
+ "message": "Verify Master Password"
+ },
+ "yourVaultIsLocked": {
+ "message": "Your vault is locked. Verify your master password to continue."
+ },
+ "unlock": {
+ "message": "Unlock"
+ },
+ "loggedInAsOn": {
+ "message": "Logged in as $EMAIL$ on $HOSTNAME$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "name@example.com"
+ },
+ "hostname": {
+ "content": "$2",
+ "example": "bitwarden.com"
+ }
+ }
+ },
+ "invalidMasterPassword": {
+ "message": "Invalid master password"
+ },
+ "vaultTimeout": {
+ "message": "Vault Timeout"
+ },
+ "lockNow": {
+ "message": "Lock Now"
+ },
+ "immediately": {
+ "message": "Immediately"
+ },
+ "tenSeconds": {
+ "message": "10 seconds"
+ },
+ "twentySeconds": {
+ "message": "20 seconds"
+ },
+ "thirtySeconds": {
+ "message": "30 seconds"
+ },
+ "oneMinute": {
+ "message": "1 minute"
+ },
+ "twoMinutes": {
+ "message": "2 minutes"
+ },
+ "fiveMinutes": {
+ "message": "5 minutes"
+ },
+ "fifteenMinutes": {
+ "message": "15 minutes"
+ },
+ "thirtyMinutes": {
+ "message": "30 minutes"
+ },
+ "oneHour": {
+ "message": "1 hour"
+ },
+ "fourHours": {
+ "message": "4 hours"
+ },
+ "onLocked": {
+ "message": "On System Lock"
+ },
+ "onRestart": {
+ "message": "On Browser Restart"
+ },
+ "never": {
+ "message": "Never"
+ },
+ "security": {
+ "message": "Security"
+ },
+ "errorOccurred": {
+ "message": "An error has occurred"
+ },
+ "emailRequired": {
+ "message": "Email address is required."
+ },
+ "invalidEmail": {
+ "message": "Invalid email address."
+ },
+ "masterPassRequired": {
+ "message": "Master password is required."
+ },
+ "masterPassLength": {
+ "message": "Master password must be at least 8 characters long."
+ },
+ "masterPassDoesntMatch": {
+ "message": "Master password confirmation does not match."
+ },
+ "newAccountCreated": {
+ "message": "Your new account has been created! You may now log in."
+ },
+ "masterPassSent": {
+ "message": "We've sent you an email with your master password hint."
+ },
+ "verificationCodeRequired": {
+ "message": "Verification code is required."
+ },
+ "valueCopied": {
+ "message": "$VALUE$ copied",
+ "description": "Value has been copied to the clipboard.",
+ "placeholders": {
+ "value": {
+ "content": "$1",
+ "example": "Password"
+ }
+ }
+ },
+ "autofillError": {
+ "message": "Unable to auto-fill the selected item on this page. Copy and paste the information instead."
+ },
+ "loggedOut": {
+ "message": "Logged out"
+ },
+ "loginExpired": {
+ "message": "Your login session has expired."
+ },
+ "logOutConfirmation": {
+ "message": "Are you sure you want to log out?"
+ },
+ "yes": {
+ "message": "Yes"
+ },
+ "no": {
+ "message": "No"
+ },
+ "unexpectedError": {
+ "message": "An unexpected error has occurred."
+ },
+ "nameRequired": {
+ "message": "Name is required."
+ },
+ "addedFolder": {
+ "message": "Added folder"
+ },
+ "changeMasterPass": {
+ "message": "Change Master Password"
+ },
+ "changeMasterPasswordConfirmation": {
+ "message": "You can change your master password on the bitwarden.com web vault. Do you want to visit the website now?"
+ },
+ "twoStepLoginConfirmation": {
+ "message": "Two-step login makes your account more secure by requiring you to verify your login with another device such as a security key, authenticator app, SMS, phone call, or email. Two-step login can be enabled on the bitwarden.com web vault. Do you want to visit the website now?"
+ },
+ "editedFolder": {
+ "message": "Edited folder"
+ },
+ "deleteFolderConfirmation": {
+ "message": "Are you sure you want to delete this folder?"
+ },
+ "deletedFolder": {
+ "message": "Deleted folder"
+ },
+ "gettingStartedTutorial": {
+ "message": "Getting Started Tutorial"
+ },
+ "gettingStartedTutorialVideo": {
+ "message": "Watch our getting started tutorial to learn how to get the most out of the browser extension."
+ },
+ "syncingComplete": {
+ "message": "Syncing complete"
+ },
+ "syncingFailed": {
+ "message": "Syncing failed"
+ },
+ "passwordCopied": {
+ "message": "Password copied"
+ },
+ "uri": {
+ "message": "URI"
+ },
+ "uriPosition": {
+ "message": "URI $POSITION$",
+ "description": "A listing of URIs. Ex: URI 1, URI 2, URI 3, etc.",
+ "placeholders": {
+ "position": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "newUri": {
+ "message": "New URI"
+ },
+ "addedItem": {
+ "message": "Added item"
+ },
+ "editedItem": {
+ "message": "Edited item"
+ },
+ "deleteItemConfirmation": {
+ "message": "Do you really want to send to the trash?"
+ },
+ "deletedItem": {
+ "message": "Sent item to trash"
+ },
+ "overwritePassword": {
+ "message": "Overwrite Password"
+ },
+ "overwritePasswordConfirmation": {
+ "message": "Are you sure you want to overwrite the current password?"
+ },
+ "searchFolder": {
+ "message": "Search folder"
+ },
+ "searchCollection": {
+ "message": "Search collection"
+ },
+ "searchType": {
+ "message": "Search type"
+ },
+ "noneFolder": {
+ "message": "No Folder",
+ "description": "This is the folder for uncategorized items"
+ },
+ "disableAddLoginNotification": {
+ "message": "Disable Add Login Notification"
+ },
+ "addLoginNotificationDesc": {
+ "message": "The \"Add Login Notification\" automatically prompts you to save new logins to your vault whenever you log into them for the first time."
+ },
+ "dontShowCardsCurrentTab": {
+ "message": "Don't Show Cards on Tab Page"
+ },
+ "dontShowCardsCurrentTabDesc": {
+ "message": "Card items from your vault are listed on the 'Current Tab' page for easy auto-fill access."
+ },
+ "dontShowIdentitiesCurrentTab": {
+ "message": "Don't Show Identities on Tab Page"
+ },
+ "dontShowIdentitiesCurrentTabDesc": {
+ "message": "Identity items from your vault are listed on the 'Current Tab' page for easy auto-fill access."
+ },
+ "clearClipboard": {
+ "message": "Clear Clipboard",
+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
+ },
+ "clearClipboardDesc": {
+ "message": "Automatically clear copied values from your clipboard.",
+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
+ },
+ "notificationAddDesc": {
+ "message": "Should Bitwarden remember this password for you?"
+ },
+ "notificationAddSave": {
+ "message": "Yes, Save Now"
+ },
+ "notificationNeverSave": {
+ "message": "Never for this website"
+ },
+ "disableChangedPasswordNotification": {
+ "message": "Disable Changed Password Notification"
+ },
+ "disableChangedPasswordNotificationDesc": {
+ "message": "The \"Changed Password Notification\" automatically prompts you to update a login's password in your vault whenever it detects that you have changed it on a website."
+ },
+ "notificationChangeDesc": {
+ "message": "Do you want to update this password in Bitwarden?"
+ },
+ "notificationChangeSave": {
+ "message": "Yes, Update Now"
+ },
+ "disableContextMenuItem": {
+ "message": "Disable Context Menu Options"
+ },
+ "disableContextMenuItemDesc": {
+ "message": "Context menu options provide quick access to password generation and logins for the website in your current tab."
+ },
+ "defaultUriMatchDetection": {
+ "message": "Default URI Match Detection",
+ "description": "Default URI match detection for auto-fill."
+ },
+ "defaultUriMatchDetectionDesc": {
+ "message": "Choose the default way that URI match detection is handled for logins when performing actions such as auto-fill."
+ },
+ "theme": {
+ "message": "Theme"
+ },
+ "themeDesc": {
+ "message": "Change the application's color theme."
+ },
+ "dark": {
+ "message": "Dark",
+ "description": "Dark color"
+ },
+ "light": {
+ "message": "Light",
+ "description": "Light color"
+ },
+ "solarizedDark": {
+ "message": "Solarized Dark",
+ "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated."
+ },
+ "exportVault": {
+ "message": "Export Vault"
+ },
+ "fileFormat": {
+ "message": "File Format"
+ },
+ "warning": {
+ "message": "WARNING",
+ "description": "WARNING (should stay in capitalized letters if the language permits)"
+ },
+ "confirmVaultExport": {
+ "message": "Confirm Vault Export"
+ },
+ "exportWarningDesc": {
+ "message": "This export contains your vault data in an unencrypted format. You should not store or send the exported file over unsecure channels (such as email). Delete it immediately after you are done using it."
+ },
+ "encExportKeyWarningDesc": {
+ "message": "This export encrypts your data using your account's encryption key. If you ever rotate your account's encryption key you should export again since you will not be able to decrypt this export file."
+ },
+ "encExportAccountWarningDesc": {
+ "message": "Account encryption keys are unique to each Bitwarden user account, so you can't import an encrypted export into a different account."
+ },
+ "exportMasterPassword": {
+ "message": "Enter your master password to export your vault data."
+ },
+ "shared": {
+ "message": "Shared"
+ },
+ "learnOrg": {
+ "message": "Learn about Organizations"
+ },
+ "learnOrgConfirmation": {
+ "message": "Bitwarden allows you to share your vault items with others by using an organization. Would you like to visit the bitwarden.com website to learn more?"
+ },
+ "moveToOrganization": {
+ "message": "Move to Organization"
+ },
+ "share": {
+ "message": "Share"
+ },
+ "movedItemToOrg": {
+ "message": "$ITEMNAME$ moved to $ORGNAME$",
+ "placeholders": {
+ "itemname": {
+ "content": "$1",
+ "example": "Secret Item"
+ },
+ "orgname": {
+ "content": "$2",
+ "example": "Company Name"
+ }
+ }
+ },
+ "moveToOrgDesc": {
+ "message": "Choose an organization that you wish to move this item to. Moving to an organization transfers ownership of the item to that organization. You will no longer be the direct owner of this item once it has been moved."
+ },
+ "learnMore": {
+ "message": "Learn more"
+ },
+ "authenticatorKeyTotp": {
+ "message": "Authenticator Key (TOTP)"
+ },
+ "verificationCodeTotp": {
+ "message": "Verification Code (TOTP)"
+ },
+ "copyVerificationCode": {
+ "message": "Copy Verification Code"
+ },
+ "attachments": {
+ "message": "Attachments"
+ },
+ "deleteAttachment": {
+ "message": "Delete attachment"
+ },
+ "deleteAttachmentConfirmation": {
+ "message": "Are you sure you want to delete this attachment?"
+ },
+ "deletedAttachment": {
+ "message": "Deleted attachment"
+ },
+ "newAttachment": {
+ "message": "Add New Attachment"
+ },
+ "noAttachments": {
+ "message": "No attachments."
+ },
+ "attachmentSaved": {
+ "message": "The attachment has been saved."
+ },
+ "file": {
+ "message": "File"
+ },
+ "selectFile": {
+ "message": "Select a file."
+ },
+ "maxFileSize": {
+ "message": "Maximum file size is 500 MB."
+ },
+ "featureUnavailable": {
+ "message": "Feature Unavailable"
+ },
+ "updateKey": {
+ "message": "You cannot use this feature until you update your encryption key."
+ },
+ "premiumMembership": {
+ "message": "Premium Membership"
+ },
+ "premiumManage": {
+ "message": "Manage Membership"
+ },
+ "premiumManageAlert": {
+ "message": "You can manage your membership on the bitwarden.com web vault. Do you want to visit the website now?"
+ },
+ "premiumRefresh": {
+ "message": "Refresh Membership"
+ },
+ "premiumNotCurrentMember": {
+ "message": "You are not currently a premium member."
+ },
+ "premiumSignUpAndGet": {
+ "message": "Sign up for a premium membership and get:"
+ },
+ "ppremiumSignUpStorage": {
+ "message": "1 GB encrypted storage for file attachments."
+ },
+ "ppremiumSignUpTwoStep": {
+ "message": "Additional two-step login options such as YubiKey, FIDO U2F, and Duo."
+ },
+ "ppremiumSignUpReports": {
+ "message": "Password hygiene, account health, and data breach reports to keep your vault safe."
+ },
+ "ppremiumSignUpTotp": {
+ "message": "TOTP verification code (2FA) generator for logins in your vault."
+ },
+ "ppremiumSignUpSupport": {
+ "message": "Priority customer support."
+ },
+ "ppremiumSignUpFuture": {
+ "message": "All future premium features. More coming soon!"
+ },
+ "premiumPurchase": {
+ "message": "Purchase Premium"
+ },
+ "premiumPurchaseAlert": {
+ "message": "You can purchase premium membership on the bitwarden.com web vault. Do you want to visit the website now?"
+ },
+ "premiumCurrentMember": {
+ "message": "You are a premium member!"
+ },
+ "premiumCurrentMemberThanks": {
+ "message": "Thank you for supporting Bitwarden."
+ },
+ "premiumPrice": {
+ "message": "All for just $PRICE$ /year!",
+ "placeholders": {
+ "price": {
+ "content": "$1",
+ "example": "$10"
+ }
+ }
+ },
+ "refreshComplete": {
+ "message": "Refresh complete"
+ },
+ "disableAutoTotpCopy": {
+ "message": "Disable Automatic TOTP Copy"
+ },
+ "disableAutoTotpCopyDesc": {
+ "message": "If your login has an authenticator key attached to it, the TOTP verification code is automatically copied to your clipboard whenever you auto-fill the login."
+ },
+ "disableAutoBiometricsPrompt": {
+ "message": "Do not prompt for biometrics on launch"
+ },
+ "premiumRequired": {
+ "message": "Premium Required"
+ },
+ "premiumRequiredDesc": {
+ "message": "A premium membership is required to use this feature."
+ },
+ "enterVerificationCodeApp": {
+ "message": "Enter the 6 digit verification code from your authenticator app."
+ },
+ "enterVerificationCodeEmail": {
+ "message": "Enter the 6 digit verification code that was emailed to $EMAIL$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "example@gmail.com"
+ }
+ }
+ },
+ "verificationCodeEmailSent": {
+ "message": "Verification email sent to $EMAIL$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "example@gmail.com"
+ }
+ }
+ },
+ "rememberMe": {
+ "message": "Remember me"
+ },
+ "sendVerificationCodeEmailAgain": {
+ "message": "Send verification code email again"
+ },
+ "useAnotherTwoStepMethod": {
+ "message": "Use another two-step login method"
+ },
+ "insertYubiKey": {
+ "message": "Insert your YubiKey into your computer's USB port, then touch its button."
+ },
+ "insertU2f": {
+ "message": "Insert your security key into your computer's USB port. If it has a button, touch it."
+ },
+ "webAuthnNewTab": {
+ "message": "To start the WebAuthn 2FA verification. Click the button below to open a new tab and follow the instructions provided in the new tab."
+ },
+ "webAuthnNewTabOpen": {
+ "message": "Open new tab"
+ },
+ "webAuthnAuthenticate": {
+ "message": "Authenticate WebAuthn"
+ },
+ "loginUnavailable": {
+ "message": "Login Unavailable"
+ },
+ "noTwoStepProviders": {
+ "message": "This account has two-step login enabled, however, none of the configured two-step providers are supported by this web browser."
+ },
+ "noTwoStepProviders2": {
+ "message": "Please use a supported web browser (such as Chrome) and/or add additional providers that are better supported across web browsers (such as an authenticator app)."
+ },
+ "twoStepOptions": {
+ "message": "Two-step Login Options"
+ },
+ "recoveryCodeDesc": {
+ "message": "Lost access to all of your two-factor providers? Use your recovery code to disable all two-factor providers from your account."
+ },
+ "recoveryCodeTitle": {
+ "message": "Recovery Code"
+ },
+ "authenticatorAppTitle": {
+ "message": "Authenticator App"
+ },
+ "authenticatorAppDesc": {
+ "message": "Use an authenticator app (such as Authy or Google Authenticator) to generate time-based verification codes.",
+ "description": "'Authy' and 'Google Authenticator' are product names and should not be translated."
+ },
+ "yubiKeyTitle": {
+ "message": "YubiKey OTP Security Key"
+ },
+ "yubiKeyDesc": {
+ "message": "Use a YubiKey to access your account. Works with YubiKey 4, 4 Nano, 4C, and NEO devices."
+ },
+ "duoDesc": {
+ "message": "Verify with Duo Security using the Duo Mobile app, SMS, phone call, or U2F security key.",
+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
+ },
+ "duoOrganizationDesc": {
+ "message": "Verify with Duo Security for your organization using the Duo Mobile app, SMS, phone call, or U2F security key.",
+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
+ },
+ "webAuthnTitle": {
+ "message": "FIDO2 WebAuthn"
+ },
+ "webAuthnDesc": {
+ "message": "Use any WebAuthn enabled security key to access your account."
+ },
+ "emailTitle": {
+ "message": "Email"
+ },
+ "emailDesc": {
+ "message": "Verification codes will be emailed to you."
+ },
+ "selfHostedEnvironment": {
+ "message": "Self-hosted Environment"
+ },
+ "selfHostedEnvironmentFooter": {
+ "message": "Specify the base URL of your on-premises hosted Bitwarden installation."
+ },
+ "customEnvironment": {
+ "message": "Custom Environment"
+ },
+ "customEnvironmentFooter": {
+ "message": "For advanced users. You can specify the base URL of each service independently."
+ },
+ "baseUrl": {
+ "message": "Server URL"
+ },
+ "apiUrl": {
+ "message": "API Server URL"
+ },
+ "webVaultUrl": {
+ "message": "Web Vault Server URL"
+ },
+ "identityUrl": {
+ "message": "Identity Server URL"
+ },
+ "notificationsUrl": {
+ "message": "Notifications Server URL"
+ },
+ "iconsUrl": {
+ "message": "Icons Server URL"
+ },
+ "environmentSaved": {
+ "message": "The environment URLs have been saved."
+ },
+ "enableAutoFillOnPageLoad": {
+ "message": "Enable Auto-fill on Page Load"
+ },
+ "enableAutoFillOnPageLoadDesc": {
+ "message": "If a login form is detected, automatically perform an auto-fill when the web page loads."
+ },
+ "experimentalFeature": {
+ "message": "This is currently an experimental feature. Use at your own risk."
+ },
+ "defaultAutoFillOnPageLoad": {
+ "message": "Default autofill setting for login items"
+ },
+ "defaultAutoFillOnPageLoadDesc": {
+ "message": "After enabling Auto-fill on Page Load, you can enable or disable the feature for individual login items. This is the default setting for login items that are not separately configured."
+ },
+ "itemAutoFillOnPageLoad": {
+ "message": "Auto-fill on Page Load (if enabled in Options)"
+ },
+ "autoFillOnPageLoadUseDefault": {
+ "message": "Use default setting"
+ },
+ "autoFillOnPageLoadYes": {
+ "message": "Auto-fill on page load"
+ },
+ "autoFillOnPageLoadNo": {
+ "message": "Do not auto-fill on page load"
+ },
+ "commandOpenPopup": {
+ "message": "Open vault popup"
+ },
+ "commandOpenSidebar": {
+ "message": "Open vault in sidebar"
+ },
+ "commandAutofillDesc": {
+ "message": "Auto-fill the last used login for the current website"
+ },
+ "commandGeneratePasswordDesc": {
+ "message": "Generate and copy a new random password to the clipboard"
+ },
+ "commandLockVaultDesc": {
+ "message": "Lock the vault"
+ },
+ "privateModeMessage": {
+ "message": "Unfortunately this window is not available in private mode for this browser."
+ },
+ "customFields": {
+ "message": "Custom Fields"
+ },
+ "copyValue": {
+ "message": "Copy Value"
+ },
+ "value": {
+ "message": "Value"
+ },
+ "newCustomField": {
+ "message": "New Custom Field"
+ },
+ "dragToSort": {
+ "message": "Drag to sort"
+ },
+ "cfTypeText": {
+ "message": "Text"
+ },
+ "cfTypeHidden": {
+ "message": "Hidden"
+ },
+ "cfTypeBoolean": {
+ "message": "Boolean"
+ },
+ "popup2faCloseMessage": {
+ "message": "Clicking outside the popup window to check your email for your verification code will cause this popup to close. Do you want to open this popup in a new window so that it does not close?"
+ },
+ "popupU2fCloseMessage": {
+ "message": "This browser cannot process U2F requests in this popup window. Do you want to open this popup in a new window so that you can log in using U2F?"
+ },
+ "disableFavicon": {
+ "message": "Disable Website Icons"
+ },
+ "disableFaviconDesc": {
+ "message": "Website Icons provide a recognizable image next to each login item in your vault."
+ },
+ "disableBadgeCounter": {
+ "message": "Disable Badge Counter"
+ },
+ "disableBadgeCounterDesc": {
+ "message": "Badge counter indicates how many logins you have for the current page in your vault."
+ },
+ "cardholderName": {
+ "message": "Cardholder Name"
+ },
+ "number": {
+ "message": "Number"
+ },
+ "brand": {
+ "message": "Brand"
+ },
+ "expirationMonth": {
+ "message": "Expiration Month"
+ },
+ "expirationYear": {
+ "message": "Expiration Year"
+ },
+ "expiration": {
+ "message": "Expiration"
+ },
+ "january": {
+ "message": "January"
+ },
+ "february": {
+ "message": "February"
+ },
+ "march": {
+ "message": "March"
+ },
+ "april": {
+ "message": "April"
+ },
+ "may": {
+ "message": "May"
+ },
+ "june": {
+ "message": "June"
+ },
+ "july": {
+ "message": "July"
+ },
+ "august": {
+ "message": "August"
+ },
+ "september": {
+ "message": "September"
+ },
+ "october": {
+ "message": "October"
+ },
+ "november": {
+ "message": "November"
+ },
+ "december": {
+ "message": "December"
+ },
+ "securityCode": {
+ "message": "Security Code"
+ },
+ "ex": {
+ "message": "ex."
+ },
+ "title": {
+ "message": "Title"
+ },
+ "mr": {
+ "message": "Mr"
+ },
+ "mrs": {
+ "message": "Mrs"
+ },
+ "ms": {
+ "message": "Ms"
+ },
+ "dr": {
+ "message": "Dr"
+ },
+ "firstName": {
+ "message": "First Name"
+ },
+ "middleName": {
+ "message": "Middle Name"
+ },
+ "lastName": {
+ "message": "Last Name"
+ },
+ "identityName": {
+ "message": "Identity Name"
+ },
+ "company": {
+ "message": "Company"
+ },
+ "ssn": {
+ "message": "Social Security Number"
+ },
+ "passportNumber": {
+ "message": "Passport Number"
+ },
+ "licenseNumber": {
+ "message": "License Number"
+ },
+ "email": {
+ "message": "Email"
+ },
+ "phone": {
+ "message": "Phone"
+ },
+ "address": {
+ "message": "Address"
+ },
+ "address1": {
+ "message": "Address 1"
+ },
+ "address2": {
+ "message": "Address 2"
+ },
+ "address3": {
+ "message": "Address 3"
+ },
+ "cityTown": {
+ "message": "City / Town"
+ },
+ "stateProvince": {
+ "message": "State / Province"
+ },
+ "zipPostalCode": {
+ "message": "Zip / Postal Code"
+ },
+ "country": {
+ "message": "Country"
+ },
+ "type": {
+ "message": "Type"
+ },
+ "typeLogin": {
+ "message": "Login"
+ },
+ "typeLogins": {
+ "message": "Logins"
+ },
+ "typeSecureNote": {
+ "message": "Secure Note"
+ },
+ "typeCard": {
+ "message": "Card"
+ },
+ "typeIdentity": {
+ "message": "Identity"
+ },
+ "passwordHistory": {
+ "message": "Password History"
+ },
+ "back": {
+ "message": "Back"
+ },
+ "collections": {
+ "message": "Collections"
+ },
+ "favorites": {
+ "message": "Favorites"
+ },
+ "popOutNewWindow": {
+ "message": "Pop out to a new window"
+ },
+ "refresh": {
+ "message": "Refresh"
+ },
+ "cards": {
+ "message": "Cards"
+ },
+ "identities": {
+ "message": "Identities"
+ },
+ "logins": {
+ "message": "Logins"
+ },
+ "secureNotes": {
+ "message": "Secure Notes"
+ },
+ "clear": {
+ "message": "Clear",
+ "description": "To clear something out. example: To clear browser history."
+ },
+ "checkPassword": {
+ "message": "Check if password has been exposed."
+ },
+ "passwordExposed": {
+ "message": "This password has been exposed $VALUE$ time(s) in data breaches. You should change it.",
+ "placeholders": {
+ "value": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "passwordSafe": {
+ "message": "This password was not found in any known data breaches. It should be safe to use."
+ },
+ "baseDomain": {
+ "message": "Base domain"
+ },
+ "host": {
+ "message": "Host",
+ "description": "A URL's host value. For example, the host of https://sub.domain.com:443 is 'sub.domain.com:443'."
+ },
+ "exact": {
+ "message": "Exact"
+ },
+ "startsWith": {
+ "message": "Starts with"
+ },
+ "regEx": {
+ "message": "Regular expression",
+ "description": "A programming term, also known as 'RegEx'."
+ },
+ "matchDetection": {
+ "message": "Match Detection",
+ "description": "URI match detection for auto-fill."
+ },
+ "defaultMatchDetection": {
+ "message": "Default match detection",
+ "description": "Default URI match detection for auto-fill."
+ },
+ "toggleOptions": {
+ "message": "Toggle Options"
+ },
+ "toggleCurrentUris": {
+ "message": "Toggle Current URIs",
+ "description": "Toggle the display of the URIs of the currently open tabs in the browser."
+ },
+ "currentUri": {
+ "message": "Current URI",
+ "description": "The URI of one of the current open tabs in the browser."
+ },
+ "organization": {
+ "message": "Organization",
+ "description": "An entity of multiple related people (ex. a team or business organization)."
+ },
+ "types": {
+ "message": "Types"
+ },
+ "allItems": {
+ "message": "All Items"
+ },
+ "noPasswordsInList": {
+ "message": "There are no passwords to list."
+ },
+ "remove": {
+ "message": "Remove"
+ },
+ "default": {
+ "message": "Default"
+ },
+ "dateUpdated": {
+ "message": "Updated",
+ "description": "ex. Date this item was updated"
+ },
+ "datePasswordUpdated": {
+ "message": "Password Updated",
+ "description": "ex. Date this password was updated"
+ },
+ "neverLockWarning": {
+ "message": "Are you sure you want to use the \"Never\" option? Setting your lock options to \"Never\" stores your vault's encryption key on your device. If you use this option you should ensure that you keep your device properly protected."
+ },
+ "noOrganizationsList": {
+ "message": "You do not belong to any organizations. Organizations allow you to securely share items with other users."
+ },
+ "noCollectionsInList": {
+ "message": "There are no collections to list."
+ },
+ "ownership": {
+ "message": "Ownership"
+ },
+ "whoOwnsThisItem": {
+ "message": "Who owns this item?"
+ },
+ "strong": {
+ "message": "Strong",
+ "description": "ex. A strong password. Scale: Weak -> Good -> Strong"
+ },
+ "good": {
+ "message": "Good",
+ "description": "ex. A good password. Scale: Weak -> Good -> Strong"
+ },
+ "weak": {
+ "message": "Weak",
+ "description": "ex. A weak password. Scale: Weak -> Good -> Strong"
+ },
+ "weakMasterPassword": {
+ "message": "Weak Master Password"
+ },
+ "weakMasterPasswordDesc": {
+ "message": "The master password you have chosen is weak. You should use a strong master password (or a passphrase) to properly protect your Bitwarden account. Are you sure you want to use this master password?"
+ },
+ "pin": {
+ "message": "PIN",
+ "description": "PIN code. Ex. The short code (often numeric) that you use to unlock a device."
+ },
+ "unlockWithPin": {
+ "message": "Unlock with PIN"
+ },
+ "setYourPinCode": {
+ "message": "Set your PIN code for unlocking Bitwarden. Your PIN settings will be reset if you ever fully log out of the application."
+ },
+ "pinRequired": {
+ "message": "PIN code is required."
+ },
+ "invalidPin": {
+ "message": "Invalid PIN code."
+ },
+ "verifyPin": {
+ "message": "Verify PIN"
+ },
+ "yourVaultIsLockedPinCode": {
+ "message": "Your vault is locked. Verify your PIN code to continue."
+ },
+ "unlockWithBiometrics": {
+ "message": "Unlock with biometrics"
+ },
+ "awaitDesktop": {
+ "message": "Awaiting confirmation from desktop"
+ },
+ "awaitDesktopDesc": {
+ "message": "Please confirm using biometrics in the Bitwarden Desktop application to enable biometrics for browser."
+ },
+ "lockWithMasterPassOnRestart": {
+ "message": "Lock with master password on browser restart"
+ },
+ "selectOneCollection": {
+ "message": "You must select at least one collection."
+ },
+ "cloneItem": {
+ "message": "Clone Item"
+ },
+ "clone": {
+ "message": "Clone"
+ },
+ "passwordGeneratorPolicyInEffect": {
+ "message": "One or more organization policies are affecting your generator settings."
+ },
+ "vaultTimeoutAction": {
+ "message": "Vault Timeout Action"
+ },
+ "lock": {
+ "message": "Lock",
+ "description": "Verb form: to make secure or inaccesible by"
+ },
+ "trash": {
+ "message": "Trash",
+ "description": "Noun: a special folder to hold deleted items"
+ },
+ "searchTrash": {
+ "message": "Search trash"
+ },
+ "permanentlyDeleteItem": {
+ "message": "Permanently Delete Item"
+ },
+ "permanentlyDeleteItemConfirmation": {
+ "message": "Are you sure you want to permanently delete this item?"
+ },
+ "permanentlyDeletedItem": {
+ "message": "Permanently Deleted item"
+ },
+ "restoreItem": {
+ "message": "Restore Item"
+ },
+ "restoreItemConfirmation": {
+ "message": "Are you sure you want to restore this item?"
+ },
+ "restoredItem": {
+ "message": "Restored Item"
+ },
+ "vaultTimeoutLogOutConfirmation": {
+ "message": "Logging out will remove all access to your vault and requires online authentication after the timeout period. Are you sure you want to use this setting?"
+ },
+ "vaultTimeoutLogOutConfirmationTitle": {
+ "message": "Timeout Action Confirmation"
+ },
+ "autoFillAndSave": {
+ "message": "Auto-fill and Save"
+ },
+ "autoFillSuccessAndSavedUri": {
+ "message": "Auto-filled Item and Saved URI"
+ },
+ "autoFillSuccess": {
+ "message": "Auto-filled Item"
+ },
+ "setMasterPassword": {
+ "message": "Set Master Password"
+ },
+ "masterPasswordPolicyInEffect": {
+ "message": "One or more organization policies require your master password to meet the following requirements:"
+ },
+ "policyInEffectMinComplexity": {
+ "message": "Minimum complexity score of $SCORE$",
+ "placeholders": {
+ "score": {
+ "content": "$1",
+ "example": "4"
+ }
+ }
+ },
+ "policyInEffectMinLength": {
+ "message": "Minimum length of $LENGTH$",
+ "placeholders": {
+ "length": {
+ "content": "$1",
+ "example": "14"
+ }
+ }
+ },
+ "policyInEffectUppercase": {
+ "message": "Contain one or more uppercase characters"
+ },
+ "policyInEffectLowercase": {
+ "message": "Contain one or more lowercase characters"
+ },
+ "policyInEffectNumbers": {
+ "message": "Contain one or more numbers"
+ },
+ "policyInEffectSpecial": {
+ "message": "Contain one or more of the following special characters $CHARS$",
+ "placeholders": {
+ "chars": {
+ "content": "$1",
+ "example": "!@#$%^&*"
+ }
+ }
+ },
+ "masterPasswordPolicyRequirementsNotMet": {
+ "message": "Your new master password does not meet the policy requirements."
+ },
+ "acceptPolicies": {
+ "message": "By checking this box you agree to the following:"
+ },
+ "acceptPoliciesError": {
+ "message": "Terms of Service and Privacy Policy have not been acknowledged."
+ },
+ "termsOfService": {
+ "message": "Terms of Service"
+ },
+ "privacyPolicy": {
+ "message": "Privacy Policy"
+ },
+ "hintEqualsPassword": {
+ "message": "Your password hint cannot be the same as your password."
+ },
+ "ok": {
+ "message": "Ok"
+ },
+ "desktopSyncVerificationTitle": {
+ "message": "Desktop sync verification"
+ },
+ "desktopIntegrationVerificationText": {
+ "message": "Please verify that the desktop application shows this fingerprint: "
+ },
+ "desktopIntegrationDisabledTitle": {
+ "message": "Browser integration is not enabled"
+ },
+ "desktopIntegrationDisabledDesc": {
+ "message": "Browser integration is not enabled in the Bitwarden Desktop application. Please enable it in the settings within the desktop application."
+ },
+ "startDesktopTitle": {
+ "message": "Start the Bitwarden Desktop application"
+ },
+ "startDesktopDesc": {
+ "message": "The Bitwarden Desktop application needs to be started before this function can be used."
+ },
+ "errorEnableBiometricTitle": {
+ "message": "Unable to enable biometrics"
+ },
+ "errorEnableBiometricDesc": {
+ "message": "Action was canceled by the desktop application"
+ },
+ "nativeMessagingInvalidEncryptionDesc": {
+ "message": "Desktop application invalidated the secure communication channel. Please retry this operation"
+ },
+ "nativeMessagingInvalidEncryptionTitle": {
+ "message": "Desktop communication interrupted"
+ },
+ "nativeMessagingWrongUserDesc": {
+ "message": "The desktop application is logged into a different account. Please ensure both applications are logged into the same account."
+ },
+ "nativeMessagingWrongUserTitle": {
+ "message": "Account missmatch"
+ },
+ "biometricsNotEnabledTitle": {
+ "message": "Biometrics not enabled"
+ },
+ "biometricsNotEnabledDesc": {
+ "message": "Browser biometrics requires desktop biometric to be enabled in the settings first."
+ },
+ "biometricsNotSupportedTitle": {
+ "message": "Biometrics not supported"
+ },
+ "biometricsNotSupportedDesc": {
+ "message": "Browser biometrics is not supported on this device."
+ },
+ "nativeMessaginPermissionErrorTitle": {
+ "message": "Permission not provided"
+ },
+ "nativeMessaginPermissionErrorDesc": {
+ "message": "Without permission to communicate with the Bitwarden Desktop Application we cannot provide biometrics in the browser extension. Please try again."
+ },
+ "nativeMessaginPermissionSidebarTitle": {
+ "message": "Permission request error"
+ },
+ "nativeMessaginPermissionSidebarDesc": {
+ "message": "This action cannot be done in the sidebar, please retry the action in the popup or popout."
+ },
+ "personalOwnershipSubmitError": {
+ "message": "Due to an Enterprise Policy, you are restricted from saving items to your personal vault. Change the Ownership option to an organization and choose from available Collections."
+ },
+ "personalOwnershipPolicyInEffect": {
+ "message": "An organization policy is affecting your ownership options."
+ },
+ "excludedDomains": {
+ "message": "Excluded Domains"
+ },
+ "excludedDomainsDesc": {
+ "message": "Bitwarden will not ask to save login details for these domains. You must refresh the page for changes to take effect."
+ },
+ "excludedDomainsInvalidDomain": {
+ "message": "$DOMAIN$ is not a valid domain",
+ "placeholders": {
+ "domain": {
+ "content": "$1",
+ "example": "googlecom"
+ }
+ }
+ },
+ "send": {
+ "message": "Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "searchSends": {
+ "message": "Search Sends",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "addSend": {
+ "message": "Add Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTypeText": {
+ "message": "Text"
+ },
+ "sendTypeFile": {
+ "message": "File"
+ },
+ "allSends": {
+ "message": "All Sends",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "maxAccessCountReached": {
+ "message": "Max access count reached"
+ },
+ "expired": {
+ "message": "Expired"
+ },
+ "pendingDeletion": {
+ "message": "Pending deletion"
+ },
+ "passwordProtected": {
+ "message": "Password protected"
+ },
+ "copySendLink": {
+ "message": "Copy Send link",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "removePassword": {
+ "message": "Remove Password"
+ },
+ "delete": {
+ "message": "Delete"
+ },
+ "removedPassword": {
+ "message": "Removed Password"
+ },
+ "deletedSend": {
+ "message": "Deleted Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendLink": {
+ "message": "Send link",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "disabled": {
+ "message": "Disabled"
+ },
+ "removePasswordConfirmation": {
+ "message": "Are you sure you want to remove the password?"
+ },
+ "deleteSend": {
+ "message": "Delete Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "deleteSendConfirmation": {
+ "message": "Are you sure you want to delete this Send?",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "editSend": {
+ "message": "Edit Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTypeHeader": {
+ "message": "What type of Send is this?",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendNameDesc": {
+ "message": "A friendly name to describe this Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendFileDesc": {
+ "message": "The file you want to send."
+ },
+ "deletionDate": {
+ "message": "Deletion Date"
+ },
+ "deletionDateDesc": {
+ "message": "The Send will be permanently deleted on the specified date and time.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "expirationDate": {
+ "message": "Expiration Date"
+ },
+ "expirationDateDesc": {
+ "message": "If set, access to this Send will expire on the specified date and time.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "oneDay": {
+ "message": "1 day"
+ },
+ "days": {
+ "message": "$DAYS$ days",
+ "placeholders": {
+ "days": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "custom": {
+ "message": "Custom"
+ },
+ "maximumAccessCount": {
+ "message": "Maximum Access Count"
+ },
+ "maximumAccessCountDesc": {
+ "message": "If set, users will no longer be able to access this Send once the maximum access count is reached.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendPasswordDesc": {
+ "message": "Optionally require a password for users to access this Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendNotesDesc": {
+ "message": "Private notes about this Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendDisableDesc": {
+ "message": "Disable this Send so that no one can access it.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendShareDesc": {
+ "message": "Copy this Send's link to clipboard upon save.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTextDesc": {
+ "message": "The text you want to send."
+ },
+ "sendHideText": {
+ "message": "Hide this Send's text by default.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "currentAccessCount": {
+ "message": "Current Access Count"
+ },
+ "createSend": {
+ "message": "Create New Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "newPassword": {
+ "message": "New Password"
+ },
+ "sendDisabled": {
+ "message": "Send Disabled",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendDisabledWarning": {
+ "message": "Due to an enterprise policy, you are only able to delete an existing Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "createdSend": {
+ "message": "Created Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "editedSend": {
+ "message": "Edited Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendLinuxChromiumFileWarning": {
+ "message": "In order to choose a file, open the extension in the sidebar (if possible) or pop out to a new window by clicking this banner."
+ },
+ "sendFirefoxFileWarning": {
+ "message": "In order to choose a file using Firefox, open the extension in the sidebar or pop out to a new window by clicking this banner."
+ },
+ "sendSafariFileWarning": {
+ "message": "In order to choose a file using Safari, pop out to a new window by clicking this banner."
+ },
+ "sendFileCalloutHeader": {
+ "message": "Before you start"
+ },
+ "sendFirefoxCustomDatePopoutMessage1": {
+ "message": "To use a calendar style date picker",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read '**To use a calendar style date picker ** click here to pop out your window.'"
+ },
+ "sendFirefoxCustomDatePopoutMessage2": {
+ "message": "click here",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker **click here** to pop out your window.'"
+ },
+ "sendFirefoxCustomDatePopoutMessage3": {
+ "message": "to pop out your window.",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker click here **to pop out your window.**'"
+ },
+ "expirationDateIsInvalid": {
+ "message": "The expiration date provided is not valid."
+ },
+ "deletionDateIsInvalid": {
+ "message": "The deletion date provided is not valid."
+ },
+ "expirationDateAndTimeRequired": {
+ "message": "An expiration date and time are required."
+ },
+ "deletionDateAndTimeRequired": {
+ "message": "A deletion date and time are required."
+ },
+ "dateParsingError": {
+ "message": "There was an error saving your deletion and expiration dates."
+ },
+ "hideEmail": {
+ "message": "Hide my email address from recipients."
+ },
+ "sendOptionsPolicyInEffect": {
+ "message": "One or more organization policies are affecting your Send options."
+ },
+ "passwordPrompt": {
+ "message": "Master password re-prompt"
+ },
+ "passwordConfirmation": {
+ "message": "Master password confirmation"
+ },
+ "passwordConfirmationDesc": {
+ "message": "This action is protected. To continue, please re-enter your master password to verify your identity."
+ },
+ "emailVerificationRequired": {
+ "message": "Email Verification Required"
+ },
+ "emailVerificationRequiredDesc": {
+ "message": "You must verify your email to use this feature. You can verify your email in the web vault."
+ },
+ "updatedMasterPassword": {
+ "message": "Updated Master Password"
+ },
+ "updateMasterPassword": {
+ "message": "Update Master Password"
+ },
+ "updateMasterPasswordWarning": {
+ "message": "Your Master Password was recently changed by an administrator in your organization. In order to access the vault, you must update it now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour."
+ },
+ "resetPasswordPolicyAutoEnroll": {
+ "message": "Automatic Enrollment"
+ },
+ "resetPasswordAutoEnrollInviteWarning": {
+ "message": "This organization has an enterprise policy that will automatically enroll you in password reset. Enrollment will allow organization administrators to change your master password."
+ },
+ "selectFolder": {
+ "message": "Select folder..."
+ },
+ "ssoCompleteRegistration": {
+ "message": "In order to complete logging in with SSO, please set a master password to access and protect your vault."
+ },
+ "hours": {
+ "message": "Hours"
+ },
+ "minutes": {
+ "message": "Minutes"
+ },
+ "vaultTimeoutPolicyInEffect": {
+ "message": "Your organization policies are affecting your vault timeout. Maximum allowed Vault Timeout is $HOURS$ hour(s) and $MINUTES$ minute(s)",
+ "placeholders": {
+ "hours": {
+ "content": "$1",
+ "example": "5"
+ },
+ "minutes": {
+ "content": "$2",
+ "example": "5"
+ }
+ }
+ },
+ "vaultTimeoutToLarge": {
+ "message": "Your vault timeout exceeds the restrictions set by your organization."
+ },
+ "vaultExportDisabled": {
+ "message": "Vault Export Disabled"
+ },
+ "personalVaultExportPolicyInEffect": {
+ "message": "One or more organization policies prevents you from exporting your personal vault."
+ },
+ "copyCustomFieldNameInvalidElement": {
+ "message": "Unable to identify a valid form element. Try inspecting the HTML instead."
+ },
+ "copyCustomFieldNameNotUnique": {
+ "message": "No unique identifier found."
+ }
+}
diff --git a/src/iOS.Safari/Resources/_locales/fr/messages.json b/src/iOS.Safari/Resources/_locales/fr/messages.json
new file mode 100644
index 000000000..d3274215a
--- /dev/null
+++ b/src/iOS.Safari/Resources/_locales/fr/messages.json
@@ -0,0 +1,1817 @@
+{
+ "appName": {
+ "message": "Bitwarden"
+ },
+ "extName": {
+ "message": "Bitwarden",
+ "description": "Extension name, MUST be less than 40 characters (Safari restriction)"
+ },
+ "extDesc": {
+ "message": "Un gestionnaire de mots de passe sécurisé et gratuit pour tous vos appareils.",
+ "description": "Extension description"
+ },
+ "loginOrCreateNewAccount": {
+ "message": "Identifiez-vous ou créez un nouveau compte pour accéder à votre coffre sécurisé."
+ },
+ "createAccount": {
+ "message": "Créer un compte"
+ },
+ "login": {
+ "message": "Se connecter"
+ },
+ "enterpriseSingleSignOn": {
+ "message": "Portail de connexion unique d'entreprise"
+ },
+ "cancel": {
+ "message": "Annuler"
+ },
+ "close": {
+ "message": "Fermer"
+ },
+ "submit": {
+ "message": "Soumettre"
+ },
+ "emailAddress": {
+ "message": "Adresse e-mail"
+ },
+ "masterPass": {
+ "message": "Mot de passe maître"
+ },
+ "masterPassDesc": {
+ "message": "Le mot de passe maître est le mot de passe que vous utilisez pour accéder à votre coffre. Il est très important de ne pas l'oublier. Il n'existe aucun moyen de le récupérer si vous le perdez."
+ },
+ "masterPassHintDesc": {
+ "message": "Un indice de mot de passe maître peut vous aider à vous rappeler de votre mot de passe en cas d'oubli."
+ },
+ "reTypeMasterPass": {
+ "message": "Saisissez à nouveau le mot de passe maître"
+ },
+ "masterPassHint": {
+ "message": "Indice du mot de passe maître (facultatif)"
+ },
+ "tab": {
+ "message": "Onglet"
+ },
+ "myVault": {
+ "message": "Mon coffre"
+ },
+ "tools": {
+ "message": "Outils"
+ },
+ "settings": {
+ "message": "Paramètres"
+ },
+ "currentTab": {
+ "message": "Onglet actif"
+ },
+ "copyPassword": {
+ "message": "Copier le mot de passe"
+ },
+ "copyNote": {
+ "message": "Copier la note"
+ },
+ "copyUri": {
+ "message": "Copier l'URI"
+ },
+ "copyUsername": {
+ "message": "Copier le nom d'utilisateur"
+ },
+ "copyNumber": {
+ "message": "Copier le numéro"
+ },
+ "copySecurityCode": {
+ "message": "Copier le code de sécurité"
+ },
+ "autoFill": {
+ "message": "Remplissage automatique"
+ },
+ "generatePasswordCopied": {
+ "message": "Générer un mot de passe (copié)"
+ },
+ "copyElementIdentifier": {
+ "message": "Copier le nom du champ personnalisé"
+ },
+ "noMatchingLogins": {
+ "message": "Aucun site correspondant."
+ },
+ "vaultLocked": {
+ "message": "Le coffre est verrouillé."
+ },
+ "vaultLoggedOut": {
+ "message": "Le coffre est déconnecté."
+ },
+ "autoFillInfo": {
+ "message": "Il n'existe aucun site disponible pour le remplissage automatique pour l'onglet actuel du navigateur."
+ },
+ "addLogin": {
+ "message": "Ajouter un identifiant"
+ },
+ "addItem": {
+ "message": "Ajouter un élément"
+ },
+ "passwordHint": {
+ "message": "Indice du mot de passe"
+ },
+ "enterEmailToGetHint": {
+ "message": "Saisissez l'adresse e-mail de votre compte pour recevoir l'indice de votre mot de passe maître."
+ },
+ "getMasterPasswordHint": {
+ "message": "Obtenir l'indice du mot de passe maître"
+ },
+ "continue": {
+ "message": "Continuer"
+ },
+ "verificationCode": {
+ "message": "Code de vérification"
+ },
+ "account": {
+ "message": "Compte"
+ },
+ "changeMasterPassword": {
+ "message": "Changer le mot de passe maître"
+ },
+ "fingerprintPhrase": {
+ "message": "Phrase d'empreinte",
+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
+ },
+ "yourAccountsFingerprint": {
+ "message": "La phrase d'empreinte de votre compte",
+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
+ },
+ "twoStepLogin": {
+ "message": "Identification en deux étapes"
+ },
+ "logOut": {
+ "message": "Se déconnecter"
+ },
+ "about": {
+ "message": "À propos"
+ },
+ "version": {
+ "message": "Version"
+ },
+ "save": {
+ "message": "Enregistrer"
+ },
+ "move": {
+ "message": "Se déplacer"
+ },
+ "addFolder": {
+ "message": "Ajouter un dossier"
+ },
+ "name": {
+ "message": "Nom"
+ },
+ "editFolder": {
+ "message": "Modifier le dossier"
+ },
+ "deleteFolder": {
+ "message": "Supprimer le dossier"
+ },
+ "folders": {
+ "message": "Dossiers"
+ },
+ "noFolders": {
+ "message": "Aucun dossier à lister."
+ },
+ "helpFeedback": {
+ "message": "Aide et commentaires"
+ },
+ "sync": {
+ "message": "Synchroniser"
+ },
+ "syncVaultNow": {
+ "message": "Synchroniser le coffre maintenant"
+ },
+ "lastSync": {
+ "message": "Dernière synchronisation :"
+ },
+ "passGen": {
+ "message": "Générateur de mot de passe"
+ },
+ "generator": {
+ "message": "Générateur",
+ "description": "Short for 'Password Generator'."
+ },
+ "passGenInfo": {
+ "message": "Générer automatiquement des mots de passe forts et uniques pour vos identifiants."
+ },
+ "bitWebVault": {
+ "message": "Coffre en ligne de Bitwarden"
+ },
+ "importItems": {
+ "message": "Importer des éléments"
+ },
+ "select": {
+ "message": "Sélectionner"
+ },
+ "generatePassword": {
+ "message": "Générer un mot de passe"
+ },
+ "regeneratePassword": {
+ "message": "Générer un nouveau mot de passe"
+ },
+ "options": {
+ "message": "Options"
+ },
+ "length": {
+ "message": "Longueur"
+ },
+ "numWords": {
+ "message": "Nombre de mots"
+ },
+ "wordSeparator": {
+ "message": "Séparateur de mots"
+ },
+ "capitalize": {
+ "message": "Mettre la première lettre de chaque mot en majuscule",
+ "description": "Make the first letter of a work uppercase."
+ },
+ "includeNumber": {
+ "message": "Inclure un chiffre"
+ },
+ "minNumbers": {
+ "message": "Nombre minimum de chiffres"
+ },
+ "minSpecial": {
+ "message": "Nombre minimum de caractères spéciaux"
+ },
+ "avoidAmbChar": {
+ "message": "Éviter les caractères ambigus"
+ },
+ "searchVault": {
+ "message": "Rechercher dans le coffre"
+ },
+ "edit": {
+ "message": "Modifier"
+ },
+ "view": {
+ "message": "Voir"
+ },
+ "noItemsInList": {
+ "message": "Aucun identifiant à afficher."
+ },
+ "itemInformation": {
+ "message": "Informations sur l'élément"
+ },
+ "username": {
+ "message": "Nom d'utilisateur"
+ },
+ "password": {
+ "message": "Mot de passe"
+ },
+ "passphrase": {
+ "message": "Phrase de passe"
+ },
+ "favorite": {
+ "message": "Favori"
+ },
+ "notes": {
+ "message": "Notes"
+ },
+ "note": {
+ "message": "Note"
+ },
+ "editItem": {
+ "message": "Modifier l'élément"
+ },
+ "folder": {
+ "message": "Dossier"
+ },
+ "deleteItem": {
+ "message": "Supprimer l'élément"
+ },
+ "viewItem": {
+ "message": "Afficher l'élément"
+ },
+ "launch": {
+ "message": "Ouvrir"
+ },
+ "website": {
+ "message": "Site web"
+ },
+ "toggleVisibility": {
+ "message": "Afficher/Masquer"
+ },
+ "manage": {
+ "message": "Gérer"
+ },
+ "other": {
+ "message": "Autre"
+ },
+ "rateExtension": {
+ "message": "Noter l'extension"
+ },
+ "rateExtensionDesc": {
+ "message": "Merci de nous aider en mettant une bonne note !"
+ },
+ "browserNotSupportClipboard": {
+ "message": "Votre navigateur web ne supporte pas la copie rapide depuis le presse-papier. Copiez-le manuellement à la place."
+ },
+ "verifyMasterPassword": {
+ "message": "Saisie du mot de passe maître"
+ },
+ "yourVaultIsLocked": {
+ "message": "Votre coffre est verrouillé. Saisissez votre mot de passe maître pour continuer."
+ },
+ "unlock": {
+ "message": "Déverrouiller"
+ },
+ "loggedInAsOn": {
+ "message": "Connecté en tant que $EMAIL$ sur $HOSTNAME$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "name@example.com"
+ },
+ "hostname": {
+ "content": "$2",
+ "example": "bitwarden.com"
+ }
+ }
+ },
+ "invalidMasterPassword": {
+ "message": "Mot de passe maître invalide"
+ },
+ "vaultTimeout": {
+ "message": "Délai d'expiration du coffre"
+ },
+ "lockNow": {
+ "message": "Verrouiller maintenant"
+ },
+ "immediately": {
+ "message": "Immédiatement"
+ },
+ "tenSeconds": {
+ "message": "10 secondes"
+ },
+ "twentySeconds": {
+ "message": "20 secondes"
+ },
+ "thirtySeconds": {
+ "message": "30 secondes"
+ },
+ "oneMinute": {
+ "message": "1 minute"
+ },
+ "twoMinutes": {
+ "message": "2 minutes"
+ },
+ "fiveMinutes": {
+ "message": "5 minutes"
+ },
+ "fifteenMinutes": {
+ "message": "15 minutes"
+ },
+ "thirtyMinutes": {
+ "message": "30 minutes"
+ },
+ "oneHour": {
+ "message": "1 heure"
+ },
+ "fourHours": {
+ "message": "4 heures"
+ },
+ "onLocked": {
+ "message": "Au verrouillage du système"
+ },
+ "onRestart": {
+ "message": "Au redémarrage du navigateur"
+ },
+ "never": {
+ "message": "Jamais"
+ },
+ "security": {
+ "message": "Sécurité"
+ },
+ "errorOccurred": {
+ "message": "Une erreur est survenue"
+ },
+ "emailRequired": {
+ "message": "L'adresse e-mail est requise."
+ },
+ "invalidEmail": {
+ "message": "Adresse e-mail invalide."
+ },
+ "masterPassRequired": {
+ "message": "Le mot de passe maître est requis."
+ },
+ "masterPassLength": {
+ "message": "Le mot de passe maître doit au moins contenir 8 caractères."
+ },
+ "masterPassDoesntMatch": {
+ "message": "La confirmation du mot de passe maître ne correspond pas."
+ },
+ "newAccountCreated": {
+ "message": "Votre nouveau compte a été créé ! Vous pouvez maintenant vous authentifier."
+ },
+ "masterPassSent": {
+ "message": "Nous vous avons envoyé un e-mail contenant votre indice de mot de passe maître."
+ },
+ "verificationCodeRequired": {
+ "message": "Le code de vérification est requis."
+ },
+ "valueCopied": {
+ "message": "$VALUE$ copié",
+ "description": "Value has been copied to the clipboard.",
+ "placeholders": {
+ "value": {
+ "content": "$1",
+ "example": "Password"
+ }
+ }
+ },
+ "autofillError": {
+ "message": "Impossible de remplir automatiquement le site sélectionné sur cette page. Copiez/collez plutôt votre nom d'utilisateur et/ou votre mot de passe."
+ },
+ "loggedOut": {
+ "message": "Déconnecté"
+ },
+ "loginExpired": {
+ "message": "Votre session a expiré."
+ },
+ "logOutConfirmation": {
+ "message": "Êtes-vous sûr de vouloir vous déconnecter ?"
+ },
+ "yes": {
+ "message": "Oui"
+ },
+ "no": {
+ "message": "Non"
+ },
+ "unexpectedError": {
+ "message": "Une erreur inattendue est survenue."
+ },
+ "nameRequired": {
+ "message": "Le nom est requis."
+ },
+ "addedFolder": {
+ "message": "Dossier ajouté"
+ },
+ "changeMasterPass": {
+ "message": "Modifier le mot de passe maître"
+ },
+ "changeMasterPasswordConfirmation": {
+ "message": "Vous pouvez modifier votre mot de passe maître depuis le coffre web sur bitwarden.com. Souhaitez-vous visiter le site maintenant ?"
+ },
+ "twoStepLoginConfirmation": {
+ "message": "L'identification en deux étapes sécurise davantage votre compte en vous demandant à chaque connexion de saisir un code de sécurité obtenu depuis un autre appareil, via une clé de sécurité, une application d'authentification, un SMS, un appel téléphonique, ou un e-mail. L'identification en deux étapes peut être activée depuis le coffre web sur bitwarden.com. Voulez-vous vous visiter le site web maintenant ?"
+ },
+ "editedFolder": {
+ "message": "Dossier modifié"
+ },
+ "deleteFolderConfirmation": {
+ "message": "Êtes-vous sûr de vouloir supprimer ce dossier ?"
+ },
+ "deletedFolder": {
+ "message": "Dossier supprimé"
+ },
+ "gettingStartedTutorial": {
+ "message": "Tutoriel"
+ },
+ "gettingStartedTutorialVideo": {
+ "message": "Regardez notre didacticiel pour savoir comment parfaitement utiliser l'extension du navigateur."
+ },
+ "syncingComplete": {
+ "message": "Synchronisation terminée"
+ },
+ "syncingFailed": {
+ "message": "Échec de la synchronisation"
+ },
+ "passwordCopied": {
+ "message": "Mot de passe copié"
+ },
+ "uri": {
+ "message": "URI"
+ },
+ "uriPosition": {
+ "message": "URI $POSITION$",
+ "description": "A listing of URIs. Ex: URI 1, URI 2, URI 3, etc.",
+ "placeholders": {
+ "position": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "newUri": {
+ "message": "Nouvel URI"
+ },
+ "addedItem": {
+ "message": "Identifiant ajouté"
+ },
+ "editedItem": {
+ "message": "Identifiant modifié"
+ },
+ "deleteItemConfirmation": {
+ "message": "Êtes-vous sûr de vouloir supprimer cet identifiant ?"
+ },
+ "deletedItem": {
+ "message": "L'élément a été envoyé dans la corbeille"
+ },
+ "overwritePassword": {
+ "message": "Écraser le mot de passe"
+ },
+ "overwritePasswordConfirmation": {
+ "message": "Êtes-vous sûr de vouloir écraser le mot de passe actuel ?"
+ },
+ "searchFolder": {
+ "message": "Rechercher dans le dossier"
+ },
+ "searchCollection": {
+ "message": "Rechercher dans la collection"
+ },
+ "searchType": {
+ "message": "Rechercher dans le type"
+ },
+ "noneFolder": {
+ "message": "Aucun dossier",
+ "description": "This is the folder for uncategorized items"
+ },
+ "disableAddLoginNotification": {
+ "message": "Désactiver la notification d'ajout d'identifiant"
+ },
+ "addLoginNotificationDesc": {
+ "message": "La \"Notification de demande d'ajout d'identifiant\" apparaît automatiquement pour vous proposer d'enregistrer dans votre coffre les identifiants que vous utilisez pour la première fois."
+ },
+ "dontShowCardsCurrentTab": {
+ "message": "Ne pas afficher les cartes sur la page Onglet courant"
+ },
+ "dontShowCardsCurrentTabDesc": {
+ "message": "Les cartes stockées dans votre coffre sont listées sur la page \"Onglet courant\" pour un accès facile lors du remplissage automatique."
+ },
+ "dontShowIdentitiesCurrentTab": {
+ "message": "Ne pas afficher les identités sur la page Onglet courant"
+ },
+ "dontShowIdentitiesCurrentTabDesc": {
+ "message": "Les identités stockées dans votre coffre sont listées sur la page \"Onglet courant\" pour un accès facile lors du remplissage automatique."
+ },
+ "clearClipboard": {
+ "message": "Effacer le presse-papiers",
+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
+ },
+ "clearClipboardDesc": {
+ "message": "Effacer automatiquement de votre presse-papiers les valeurs copiées.",
+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
+ },
+ "notificationAddDesc": {
+ "message": "Est-ce que Bitwarden doit se souvenir de ce mot de passe pour vous ?"
+ },
+ "notificationAddSave": {
+ "message": "Oui, enregistrer maintenant"
+ },
+ "notificationNeverSave": {
+ "message": "Jamais pour ce site web"
+ },
+ "disableChangedPasswordNotification": {
+ "message": "Désactiver la notification de changement de mot de passe"
+ },
+ "disableChangedPasswordNotificationDesc": {
+ "message": "La \"Notification de changement de mot de passe\" vous propose automatiquement de mettre à jour un mot de passe dans votre coffre lorsqu'il est changé sur un site web."
+ },
+ "notificationChangeDesc": {
+ "message": "Souhaitez-vous mettre à jour ce mot de passe dans Bitwarden ?"
+ },
+ "notificationChangeSave": {
+ "message": "Oui, mettre à jour maintenant"
+ },
+ "disableContextMenuItem": {
+ "message": "Désactiver les options de menu contextuel"
+ },
+ "disableContextMenuItemDesc": {
+ "message": "Les options du menu contextuel permettent un accès rapide à la génération de mots de passe et aux identifiants enregistrés pour le site web de l'onglet actuel."
+ },
+ "defaultUriMatchDetection": {
+ "message": "Détection de correspondance URI par défaut",
+ "description": "Default URI match detection for auto-fill."
+ },
+ "defaultUriMatchDetectionDesc": {
+ "message": "Choisissez la manière par défaut dont la détection de correspondance URI est gérée pour les connexions lors de l'exécution d'actions telles que le remplissage automatique."
+ },
+ "theme": {
+ "message": "Thème"
+ },
+ "themeDesc": {
+ "message": "Modifier le thème de couleur de l'application."
+ },
+ "dark": {
+ "message": "Sombre",
+ "description": "Dark color"
+ },
+ "light": {
+ "message": "Clair",
+ "description": "Light color"
+ },
+ "solarizedDark": {
+ "message": "Solarized Dark",
+ "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated."
+ },
+ "exportVault": {
+ "message": "Exporter le coffre"
+ },
+ "fileFormat": {
+ "message": "Format de fichier"
+ },
+ "warning": {
+ "message": "AVERTISSEMENT",
+ "description": "WARNING (should stay in capitalized letters if the language permits)"
+ },
+ "confirmVaultExport": {
+ "message": "Confirmer l'export du coffre"
+ },
+ "exportWarningDesc": {
+ "message": "Cet export contient les données de votre coffre dans un format non chiffré. Vous ne devriez ni le stocker ni l'envoyer via des canaux non sécurisés (tel que l'e-mail). Supprimez-le immédiatement après l'avoir utilisé."
+ },
+ "encExportKeyWarningDesc": {
+ "message": "Cet export chiffre vos données en utilisant la clé de chiffrement de votre compte. Si jamais vous modifiez la clé de chiffrement de votre compte, vous devriez exporter à nouveau car vous ne pourrez pas déchiffrer ce fichier."
+ },
+ "encExportAccountWarningDesc": {
+ "message": "Les clés de chiffrement du compte sont spécifiques à chaque utilisateur Bitwarden. Vous ne pouvez donc pas importer d'export chiffré dans un compte différent."
+ },
+ "exportMasterPassword": {
+ "message": "Saisissez votre mot de passe maître pour exporter les données de votre coffre."
+ },
+ "shared": {
+ "message": "Partagé"
+ },
+ "learnOrg": {
+ "message": "En savoir plus sur les organisations"
+ },
+ "learnOrgConfirmation": {
+ "message": "Bitwarden vous permet de partager des éléments de votre coffre avec d'autres personnes en utilisant un compte d'organisation. Souhaitez-vous visiter le site web bitwarden.com pour en savoir plus ?"
+ },
+ "moveToOrganization": {
+ "message": "Déplacer vers l'organisation"
+ },
+ "share": {
+ "message": "Partager"
+ },
+ "movedItemToOrg": {
+ "message": "$ITEMNAME$ a été déplacé vers $ORGNAME$",
+ "placeholders": {
+ "itemname": {
+ "content": "$1",
+ "example": "Secret Item"
+ },
+ "orgname": {
+ "content": "$2",
+ "example": "Company Name"
+ }
+ }
+ },
+ "moveToOrgDesc": {
+ "message": "Choisissez une organisation vers laquelle vous souhaitez déplacer cet élément. Déplacer un élément vers une organisation transfère la propriété de l'élément à cette organisation. Vous ne serez plus le propriétaire direct de cet élément une fois qu'il aura été déplacé."
+ },
+ "learnMore": {
+ "message": "En savoir plus"
+ },
+ "authenticatorKeyTotp": {
+ "message": "Clé d'authentification (TOTP)"
+ },
+ "verificationCodeTotp": {
+ "message": "Code de vérification (TOTP)"
+ },
+ "copyVerificationCode": {
+ "message": "Copier le code de vérification"
+ },
+ "attachments": {
+ "message": "Pièces jointes"
+ },
+ "deleteAttachment": {
+ "message": "Supprimer la pièce jointe"
+ },
+ "deleteAttachmentConfirmation": {
+ "message": "Êtes-vous sûr de vouloir supprimer cette pièce jointe ?"
+ },
+ "deletedAttachment": {
+ "message": "Pièce jointe supprimée"
+ },
+ "newAttachment": {
+ "message": "Ajouter une nouvelle pièce jointe"
+ },
+ "noAttachments": {
+ "message": "Aucune pièce jointe."
+ },
+ "attachmentSaved": {
+ "message": "La pièce jointe a été enregistrée."
+ },
+ "file": {
+ "message": "Fichier"
+ },
+ "selectFile": {
+ "message": "Sélectionnez un fichier."
+ },
+ "maxFileSize": {
+ "message": "La taille maximale du fichier est de 500 Mo."
+ },
+ "featureUnavailable": {
+ "message": "Fonctionnalité non disponible"
+ },
+ "updateKey": {
+ "message": "Vous ne pouvez pas utiliser cette fonctionnalité avant de mettre à jour votre clé de chiffrement."
+ },
+ "premiumMembership": {
+ "message": "Adhésion Premium"
+ },
+ "premiumManage": {
+ "message": "Gérer l'adhésion"
+ },
+ "premiumManageAlert": {
+ "message": "Vous pouvez gérer votre adhésion depuis le coffre web sur bitwarden.com. Souhaitez-vous visiter le site web maintenant ?"
+ },
+ "premiumRefresh": {
+ "message": "Actualiser l'adhésion"
+ },
+ "premiumNotCurrentMember": {
+ "message": "Vous n'êtes actuellement pas un membre premium."
+ },
+ "premiumSignUpAndGet": {
+ "message": "Devenez un membre premium et obtenez :"
+ },
+ "ppremiumSignUpStorage": {
+ "message": "1 Go de stockage de fichiers chiffrés."
+ },
+ "ppremiumSignUpTwoStep": {
+ "message": "Options d'identification en deux étapes additionnelles comme YubiKey, FIDO U2F et Duo."
+ },
+ "ppremiumSignUpReports": {
+ "message": "Rapports sur l'hygiène des mots de passe, la santé des comptes et les fuites de données pour assurer la sécurité de votre coffre."
+ },
+ "ppremiumSignUpTotp": {
+ "message": "Génération d'un code de vérification TOTP (2FA) pour les identifiants de votre coffre."
+ },
+ "ppremiumSignUpSupport": {
+ "message": "Support client prioritaire."
+ },
+ "ppremiumSignUpFuture": {
+ "message": "Toutes les futures options premium. D'autres suivront prochainement !"
+ },
+ "premiumPurchase": {
+ "message": "Acheter Premium"
+ },
+ "premiumPurchaseAlert": {
+ "message": "Vous pouvez opter pour une adhésion premium depuis le coffre web sur bitwarden.com. Souhaitez-vous visiter le site web maintenant ?"
+ },
+ "premiumCurrentMember": {
+ "message": "Vous êtes un adhérent premium !"
+ },
+ "premiumCurrentMemberThanks": {
+ "message": "Merci de supporter Bitwarden."
+ },
+ "premiumPrice": {
+ "message": "Tout pour seulement $PRICE$ /an !",
+ "placeholders": {
+ "price": {
+ "content": "$1",
+ "example": "$10"
+ }
+ }
+ },
+ "refreshComplete": {
+ "message": "Actualisation terminée"
+ },
+ "disableAutoTotpCopy": {
+ "message": "Désactiver la copie automatique du TOTP"
+ },
+ "disableAutoTotpCopyDesc": {
+ "message": "Si une clé d'authentification est rattachée à votre identifiant, alors le code de vérification TOTP est automatiquement copié dans le presse-papiers lorsque vous renseignez l'identifiant."
+ },
+ "disableAutoBiometricsPrompt": {
+ "message": "Ne pas demander de biométrie au démarrage"
+ },
+ "premiumRequired": {
+ "message": "Adhésion Premium requise"
+ },
+ "premiumRequiredDesc": {
+ "message": "Une adhésion premium est requise pour utiliser cette fonctionnalité."
+ },
+ "enterVerificationCodeApp": {
+ "message": "Saisissez le code de vérification à 6 chiffres depuis votre application d'authentification."
+ },
+ "enterVerificationCodeEmail": {
+ "message": "Saisissez le code de vérification à 6 chiffres qui vous a été envoyé par e-mail à $EMAIL$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "example@gmail.com"
+ }
+ }
+ },
+ "verificationCodeEmailSent": {
+ "message": "E-mail de vérification envoyé à $EMAIL$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "example@gmail.com"
+ }
+ }
+ },
+ "rememberMe": {
+ "message": "Rester connecté"
+ },
+ "sendVerificationCodeEmailAgain": {
+ "message": "Envoyer à nouveau l'e-mail du code de vérification"
+ },
+ "useAnotherTwoStepMethod": {
+ "message": "Utiliser une autre méthode d'identification en deux étapes"
+ },
+ "insertYubiKey": {
+ "message": "Insérez votre YubiKey dans le port USB de votre ordinateur puis appuyez sur son bouton."
+ },
+ "insertU2f": {
+ "message": "Insérez votre clé de sécurité dans le port USB de votre ordinateur. S'il dispose d'un bouton, appuyez dessus."
+ },
+ "webAuthnNewTab": {
+ "message": "Pour démarrer la vérification 2FA WebAuthn, cliquez sur le bouton ci-dessous et suivez les instructions dans le nouvel onglet."
+ },
+ "webAuthnNewTabOpen": {
+ "message": "Ouvrir un nouvel onglet"
+ },
+ "webAuthnAuthenticate": {
+ "message": "Authentifier WebAuthn"
+ },
+ "loginUnavailable": {
+ "message": "Connexion impossible"
+ },
+ "noTwoStepProviders": {
+ "message": "Ce compte dispose d'une identification en deux étapes. Cependant, aucun service d'identification en deux étapes n'est supporté par ce navigateur web."
+ },
+ "noTwoStepProviders2": {
+ "message": "Merci d'utiliser un navigateur web compatible (comme Chrome) et/ou d'ajouter des services additionnels d'identification en deux étapes qui sont mieux supportés par les navigateurs web (comme par exemple une application d'authentification)."
+ },
+ "twoStepOptions": {
+ "message": "Options d'identification en deux étapes"
+ },
+ "recoveryCodeDesc": {
+ "message": "Accès perdu à tous vos services d'authentification à double facteurs ? Utilisez votre code de récupération pour désactiver tous les services de double authentifications sur votre compte."
+ },
+ "recoveryCodeTitle": {
+ "message": "Code de récupération"
+ },
+ "authenticatorAppTitle": {
+ "message": "Application d'authentification"
+ },
+ "authenticatorAppDesc": {
+ "message": "Utiliser une application d'authentification (comme Authy ou Google Authenticator) pour générer des codes de vérification basés sur le temps.",
+ "description": "'Authy' and 'Google Authenticator' are product names and should not be translated."
+ },
+ "yubiKeyTitle": {
+ "message": "Clé de sécurité YubiKey OTP"
+ },
+ "yubiKeyDesc": {
+ "message": "Utiliser une YubiKey pour accéder à votre compte. Fonctionne avec les appareils YubiKey 4, 4 Nano, 4C et NEO."
+ },
+ "duoDesc": {
+ "message": "S'authentifier avec Duo Security via l'application Duo Mobile, un SMS, un appel téléphonique, ou une clé de sécurité U2F.",
+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
+ },
+ "duoOrganizationDesc": {
+ "message": "Sécurisez votre organisation avec Duo Security à l'aide de l'application Duo Mobile, l'envoi d'un SMS, un appel vocal ou une clé de sécurité U2F.",
+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
+ },
+ "webAuthnTitle": {
+ "message": "WebAuthn FIDO2"
+ },
+ "webAuthnDesc": {
+ "message": "Utilisez n'importe quelle clé de sécurité compatible WebAuthn pour accéder à votre compte."
+ },
+ "emailTitle": {
+ "message": "E-mail"
+ },
+ "emailDesc": {
+ "message": "Les codes de vérification vont vous être envoyés par e-mail."
+ },
+ "selfHostedEnvironment": {
+ "message": "Environnement auto-hébergé"
+ },
+ "selfHostedEnvironmentFooter": {
+ "message": "Spécifiez l'URL de base de votre installation Bitwarden auto-hébergée."
+ },
+ "customEnvironment": {
+ "message": "Environnement personnalisé"
+ },
+ "customEnvironmentFooter": {
+ "message": "Pour utilisateurs avancés. Vous pouvez spécifier une URL de base indépendante pour chaque service."
+ },
+ "baseUrl": {
+ "message": "URL du serveur"
+ },
+ "apiUrl": {
+ "message": "URL du serveur de l'API"
+ },
+ "webVaultUrl": {
+ "message": "URL du serveur du coffre web"
+ },
+ "identityUrl": {
+ "message": "URL du serveur d'identification"
+ },
+ "notificationsUrl": {
+ "message": "URL du serveur de notifications"
+ },
+ "iconsUrl": {
+ "message": "URL du serveur d’icônes"
+ },
+ "environmentSaved": {
+ "message": "Les URLs d'environnement ont été enregistrées."
+ },
+ "enableAutoFillOnPageLoad": {
+ "message": "Activer le remplissage automatique au chargement de la page"
+ },
+ "enableAutoFillOnPageLoadDesc": {
+ "message": "Si un formulaire de connexion est détecté, remplir automatiquement les champs au chargement de la page web."
+ },
+ "experimentalFeature": {
+ "message": "Ceci est actuellement une fonctionnalité expérimentale. À utiliser avec prudence."
+ },
+ "defaultAutoFillOnPageLoad": {
+ "message": "Paramètre de saisie automatique par défaut pour les identifiants"
+ },
+ "defaultAutoFillOnPageLoadDesc": {
+ "message": "Après avoir activé le remplissage automatique au chargement de la page, vous pourrez activer ou désactiver la fonctionnalité pour chaque identifiant. Ceci est le paramètre par défaut pour les identifiants qui ne sont pas configurés individuellement."
+ },
+ "itemAutoFillOnPageLoad": {
+ "message": "Remplissage automatique au chargement de la page (si activé dans les options)"
+ },
+ "autoFillOnPageLoadUseDefault": {
+ "message": "Utiliser le paramètre par défaut"
+ },
+ "autoFillOnPageLoadYes": {
+ "message": "Remplissage automatique au chargement de la page"
+ },
+ "autoFillOnPageLoadNo": {
+ "message": "Ne pas remplir automatiquement au chargement de la page"
+ },
+ "commandOpenPopup": {
+ "message": "Ouvrir la popup du coffre"
+ },
+ "commandOpenSidebar": {
+ "message": "Ouvrir le coffre dans la barre latérale"
+ },
+ "commandAutofillDesc": {
+ "message": "Remplir automatiquement le dernier identifiant utilisé pour le site web actuel."
+ },
+ "commandGeneratePasswordDesc": {
+ "message": "Générer et copier un nouveau mot de passe aléatoire dans le presse-papiers."
+ },
+ "commandLockVaultDesc": {
+ "message": "Verrouiller le coffre"
+ },
+ "privateModeMessage": {
+ "message": "Malheureusement cette fenêtre n'est pas disponible en navigation privée pour ce navigateur."
+ },
+ "customFields": {
+ "message": "Champs personnalisés"
+ },
+ "copyValue": {
+ "message": "Copier la valeur"
+ },
+ "value": {
+ "message": "Valeur"
+ },
+ "newCustomField": {
+ "message": "Nouveau champ personnalisé"
+ },
+ "dragToSort": {
+ "message": "Glissez pour trier"
+ },
+ "cfTypeText": {
+ "message": "Texte"
+ },
+ "cfTypeHidden": {
+ "message": "Masqué"
+ },
+ "cfTypeBoolean": {
+ "message": "Booléen"
+ },
+ "popup2faCloseMessage": {
+ "message": "Le fait de cliquer à l'extérieur de la fenêtre pop-up pour vérifier votre e-mail avec votre code de vérification fermera cette pop-up. Voulez-vous ouvrir cette pop-up dans une nouvelle fenêtre pour qu'elle ne soit pas fermée ?"
+ },
+ "popupU2fCloseMessage": {
+ "message": "Ce navigateur ne peut pas traiter les requêtes U2F dans cette popup. Voulez-vous ouvrir cette popup dans une nouvelle fenêtre pour que vous puissiez vous connecter en utilisant U2F ?"
+ },
+ "disableFavicon": {
+ "message": "Désactiver les icônes des sites web"
+ },
+ "disableFaviconDesc": {
+ "message": "Les icônes des sites web permettent d'avoir une icône reconnaissable à côté de chaque identifiant dans votre coffre."
+ },
+ "disableBadgeCounter": {
+ "message": "Désactiver le compteur de badge"
+ },
+ "disableBadgeCounterDesc": {
+ "message": "Le compteur de badge indique le nombre d'identifiants vous avez pour la page actuelle dans votre coffre."
+ },
+ "cardholderName": {
+ "message": "Nom du titulaire de la carte"
+ },
+ "number": {
+ "message": "Numéro"
+ },
+ "brand": {
+ "message": "Réseau de paiement"
+ },
+ "expirationMonth": {
+ "message": "Mois d'expiration"
+ },
+ "expirationYear": {
+ "message": "Année d'expiration"
+ },
+ "expiration": {
+ "message": "Expiration"
+ },
+ "january": {
+ "message": "Janvier"
+ },
+ "february": {
+ "message": "Février"
+ },
+ "march": {
+ "message": "Mars"
+ },
+ "april": {
+ "message": "Avril"
+ },
+ "may": {
+ "message": "Mai"
+ },
+ "june": {
+ "message": "Juin"
+ },
+ "july": {
+ "message": "Juillet"
+ },
+ "august": {
+ "message": "Août"
+ },
+ "september": {
+ "message": "Septembre"
+ },
+ "october": {
+ "message": "Octobre"
+ },
+ "november": {
+ "message": "Novembre"
+ },
+ "december": {
+ "message": "Décembre"
+ },
+ "securityCode": {
+ "message": "Code de sécurité"
+ },
+ "ex": {
+ "message": "ex."
+ },
+ "title": {
+ "message": "Titre"
+ },
+ "mr": {
+ "message": "M."
+ },
+ "mrs": {
+ "message": "Mme"
+ },
+ "ms": {
+ "message": "Mlle"
+ },
+ "dr": {
+ "message": "Dr"
+ },
+ "firstName": {
+ "message": "Prénom"
+ },
+ "middleName": {
+ "message": "Deuxième prénom"
+ },
+ "lastName": {
+ "message": "Nom"
+ },
+ "identityName": {
+ "message": "Identité"
+ },
+ "company": {
+ "message": "Société"
+ },
+ "ssn": {
+ "message": "Numéro de sécurité sociale"
+ },
+ "passportNumber": {
+ "message": "Numéro de passeport"
+ },
+ "licenseNumber": {
+ "message": "Numéro de permis"
+ },
+ "email": {
+ "message": "E-mail"
+ },
+ "phone": {
+ "message": "Téléphone"
+ },
+ "address": {
+ "message": "Adresse"
+ },
+ "address1": {
+ "message": "Adresse 1"
+ },
+ "address2": {
+ "message": "Adresse 2"
+ },
+ "address3": {
+ "message": "Adresse 3"
+ },
+ "cityTown": {
+ "message": "Ville"
+ },
+ "stateProvince": {
+ "message": "État / Région"
+ },
+ "zipPostalCode": {
+ "message": "Code postal"
+ },
+ "country": {
+ "message": "Pays"
+ },
+ "type": {
+ "message": "Type"
+ },
+ "typeLogin": {
+ "message": "Identifiant"
+ },
+ "typeLogins": {
+ "message": "Identifiants"
+ },
+ "typeSecureNote": {
+ "message": "Note sécurisée"
+ },
+ "typeCard": {
+ "message": "Carte de paiement"
+ },
+ "typeIdentity": {
+ "message": "Identité"
+ },
+ "passwordHistory": {
+ "message": "Historique des mots de passe"
+ },
+ "back": {
+ "message": "Retour"
+ },
+ "collections": {
+ "message": "Collections"
+ },
+ "favorites": {
+ "message": "Favoris"
+ },
+ "popOutNewWindow": {
+ "message": "Ouvrir dans une nouvelle fenêtre"
+ },
+ "refresh": {
+ "message": "Actualiser"
+ },
+ "cards": {
+ "message": "Cartes de paiement"
+ },
+ "identities": {
+ "message": "Identités"
+ },
+ "logins": {
+ "message": "Identifiants"
+ },
+ "secureNotes": {
+ "message": "Notes sécurisées"
+ },
+ "clear": {
+ "message": "Effacer",
+ "description": "To clear something out. example: To clear browser history."
+ },
+ "checkPassword": {
+ "message": "Vérifier si le mot de passe a été exposé."
+ },
+ "passwordExposed": {
+ "message": "Ce mot de passe a été exposé $VALUE$ fois dans des fuites de données. Vous devriez le changer.",
+ "placeholders": {
+ "value": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "passwordSafe": {
+ "message": "Ce mot de passe n'a été trouvé dans aucune fuite de données connue. Il semble sécurisé."
+ },
+ "baseDomain": {
+ "message": "Domaine de base"
+ },
+ "host": {
+ "message": "Hôte",
+ "description": "A URL's host value. For example, the host of https://sub.domain.com:443 is 'sub.domain.com:443'."
+ },
+ "exact": {
+ "message": "Exact"
+ },
+ "startsWith": {
+ "message": "Commence par"
+ },
+ "regEx": {
+ "message": "Expression régulière",
+ "description": "A programming term, also known as 'RegEx'."
+ },
+ "matchDetection": {
+ "message": "Détection de correspondance",
+ "description": "URI match detection for auto-fill."
+ },
+ "defaultMatchDetection": {
+ "message": "Détection de correspondance par défaut",
+ "description": "Default URI match detection for auto-fill."
+ },
+ "toggleOptions": {
+ "message": "Afficher/masquer les options"
+ },
+ "toggleCurrentUris": {
+ "message": "Afficher/masquer les URIs actuels",
+ "description": "Toggle the display of the URIs of the currently open tabs in the browser."
+ },
+ "currentUri": {
+ "message": "URI actuel",
+ "description": "The URI of one of the current open tabs in the browser."
+ },
+ "organization": {
+ "message": "Organisation",
+ "description": "An entity of multiple related people (ex. a team or business organization)."
+ },
+ "types": {
+ "message": "Types"
+ },
+ "allItems": {
+ "message": "Tous les éléments"
+ },
+ "noPasswordsInList": {
+ "message": "Aucun mot de passe à afficher."
+ },
+ "remove": {
+ "message": "Supprimer"
+ },
+ "default": {
+ "message": "Par défaut"
+ },
+ "dateUpdated": {
+ "message": "Mis à jour",
+ "description": "ex. Date this item was updated"
+ },
+ "datePasswordUpdated": {
+ "message": "Mot de passe mis à jour",
+ "description": "ex. Date this password was updated"
+ },
+ "neverLockWarning": {
+ "message": "Êtes-vous sûr de vouloir utiliser l'option \"Jamais\" ? Définir le verrouillage sur \"Jamais\" stocke la clé de chiffrement de votre coffre sur votre appareil. Si vous utilisez cette option, vous devez vous assurer de correctement protéger votre appareil."
+ },
+ "noOrganizationsList": {
+ "message": "Vous ne faites partie d'aucune organisation. Les organisations vous permettent de partager des éléments de façon sécurisée avec d'autres utilisateurs."
+ },
+ "noCollectionsInList": {
+ "message": "Aucune collection à afficher."
+ },
+ "ownership": {
+ "message": "Propriété"
+ },
+ "whoOwnsThisItem": {
+ "message": "À qui appartient cet élément ?"
+ },
+ "strong": {
+ "message": "Fort",
+ "description": "ex. A strong password. Scale: Weak -> Good -> Strong"
+ },
+ "good": {
+ "message": "Suffisant",
+ "description": "ex. A good password. Scale: Weak -> Good -> Strong"
+ },
+ "weak": {
+ "message": "Faible",
+ "description": "ex. A weak password. Scale: Weak -> Good -> Strong"
+ },
+ "weakMasterPassword": {
+ "message": "Mot de passe maître faible"
+ },
+ "weakMasterPasswordDesc": {
+ "message": "Le mot de passe maître que vous avez choisi est faible. Vous devriez utiliser un mot de passe (ou une phrase de passe) fort(e) pour protéger correctement votre compte Bitwarden. Êtes-vous sûr de vouloir utiliser ce mot de passe maître ?"
+ },
+ "pin": {
+ "message": "Code PIN",
+ "description": "PIN code. Ex. The short code (often numeric) that you use to unlock a device."
+ },
+ "unlockWithPin": {
+ "message": "Déverrouiller avec un code PIN"
+ },
+ "setYourPinCode": {
+ "message": "Définissez votre code PIN pour déverrouiller Bitwarden. Les paramètres relatifs à votre code PIN seront réinitialisés si vous vous déconnectez complètement de l'application."
+ },
+ "pinRequired": {
+ "message": "Le code PIN est requis."
+ },
+ "invalidPin": {
+ "message": "Code PIN invalide."
+ },
+ "verifyPin": {
+ "message": "Saisie du code PIN"
+ },
+ "yourVaultIsLockedPinCode": {
+ "message": "Votre coffre est verrouillé. Saisissez votre code PIN pour continuer."
+ },
+ "unlockWithBiometrics": {
+ "message": "Déverrouiller par biométrie"
+ },
+ "awaitDesktop": {
+ "message": "En attente de confirmation de l'application de bureau"
+ },
+ "awaitDesktopDesc": {
+ "message": "Veuillez confirmer l'utilisation de la biométrie dans l'application Bitwarden de bureau pour activer la biométrie dans le navigateur."
+ },
+ "lockWithMasterPassOnRestart": {
+ "message": "Verrouiller avec le mot de passe maître lors du redémarrage du navigateur."
+ },
+ "selectOneCollection": {
+ "message": "Vous devez sélectionner au moins une collection."
+ },
+ "cloneItem": {
+ "message": "Cloner l’élément"
+ },
+ "clone": {
+ "message": "Cloner"
+ },
+ "passwordGeneratorPolicyInEffect": {
+ "message": "Une ou plusieurs politiques d'organisation affectent les paramètres de votre générateur."
+ },
+ "vaultTimeoutAction": {
+ "message": "Action lors de l'expiration du délai du coffre"
+ },
+ "lock": {
+ "message": "Verrouiller",
+ "description": "Verb form: to make secure or inaccesible by"
+ },
+ "trash": {
+ "message": "Corbeille",
+ "description": "Noun: a special folder to hold deleted items"
+ },
+ "searchTrash": {
+ "message": "Rechercher dans la corbeille"
+ },
+ "permanentlyDeleteItem": {
+ "message": "Supprimer définitivement l'élément"
+ },
+ "permanentlyDeleteItemConfirmation": {
+ "message": "Êtes-vous sûr de vouloir supprimer définitivement cet élément ?"
+ },
+ "permanentlyDeletedItem": {
+ "message": "Élément supprimé définitivement"
+ },
+ "restoreItem": {
+ "message": "Restaurer l'élément"
+ },
+ "restoreItemConfirmation": {
+ "message": "Êtes-vous sûr de vouloir restaurer cet élément ?"
+ },
+ "restoredItem": {
+ "message": "Élément restauré"
+ },
+ "vaultTimeoutLogOutConfirmation": {
+ "message": "La déconnexion supprimera tous les accès à votre coffre et nécessite une authentification en ligne après la période d'expiration. Êtes-vous sûr de vouloir utiliser ce paramètre?"
+ },
+ "vaultTimeoutLogOutConfirmationTitle": {
+ "message": "Confirmation de l'action lors de l'expiration du délai"
+ },
+ "autoFillAndSave": {
+ "message": "Remplir automatiquement et enregistrer"
+ },
+ "autoFillSuccessAndSavedUri": {
+ "message": "Élément rempli automatiquement et URI sauvegardée"
+ },
+ "autoFillSuccess": {
+ "message": "Élément rempli automatiquement"
+ },
+ "setMasterPassword": {
+ "message": "Définir le mot de passe maître"
+ },
+ "masterPasswordPolicyInEffect": {
+ "message": "Une ou plusieurs politiques de l'organisation exigent que votre mot de passe maître réponde aux exigences suivantes :"
+ },
+ "policyInEffectMinComplexity": {
+ "message": "Score de complexité minimum de $SCORE$",
+ "placeholders": {
+ "score": {
+ "content": "$1",
+ "example": "4"
+ }
+ }
+ },
+ "policyInEffectMinLength": {
+ "message": "Longueur minimale de $LENGTH$",
+ "placeholders": {
+ "length": {
+ "content": "$1",
+ "example": "14"
+ }
+ }
+ },
+ "policyInEffectUppercase": {
+ "message": "Contenir une ou plusieurs majuscules"
+ },
+ "policyInEffectLowercase": {
+ "message": "Contenir une ou plusieurs minuscules"
+ },
+ "policyInEffectNumbers": {
+ "message": "Contenir un ou plusieurs chiffres"
+ },
+ "policyInEffectSpecial": {
+ "message": "Contenir un ou plusieurs des caractères spéciaux suivants $CHARS$",
+ "placeholders": {
+ "chars": {
+ "content": "$1",
+ "example": "!@#$%^&*"
+ }
+ }
+ },
+ "masterPasswordPolicyRequirementsNotMet": {
+ "message": "Votre nouveau mot de passe maître ne répond pas aux exigences de la politique."
+ },
+ "acceptPolicies": {
+ "message": "En cochant cette case, vous acceptez les éléments suivants :"
+ },
+ "acceptPoliciesError": {
+ "message": "Les conditions d'utilisation et la politique de confidentialité n'ont pas été acceptées."
+ },
+ "termsOfService": {
+ "message": "Conditions d'utilisation"
+ },
+ "privacyPolicy": {
+ "message": "Politique de confidentialité"
+ },
+ "hintEqualsPassword": {
+ "message": "Votre indice de mot de passe ne peut pas être identique à votre mot de passe."
+ },
+ "ok": {
+ "message": "Ok"
+ },
+ "desktopSyncVerificationTitle": {
+ "message": "Vérification de la synchronisation avec l'application de bureau"
+ },
+ "desktopIntegrationVerificationText": {
+ "message": "Veuillez vérifier que l'application de bureau affiche cette phrase d'empreinte : "
+ },
+ "desktopIntegrationDisabledTitle": {
+ "message": "L'intégration avec le navigateur n'est pas activée"
+ },
+ "desktopIntegrationDisabledDesc": {
+ "message": "L'intégration avec le navigateur n'est pas activée dans l'application de bureau Bitwarden. Veuillez l'activer dans les paramètres de l'application de bureau."
+ },
+ "startDesktopTitle": {
+ "message": "Démarrer l'application de bureau Bitwarden."
+ },
+ "startDesktopDesc": {
+ "message": "L'application de bureau Bitwarden doit être démarrée avant que cette fonction puisse être utilisée."
+ },
+ "errorEnableBiometricTitle": {
+ "message": "Impossible d'activer la biométrie"
+ },
+ "errorEnableBiometricDesc": {
+ "message": "L'action a été annulée par l'application de bureau"
+ },
+ "nativeMessagingInvalidEncryptionDesc": {
+ "message": "L'application de bureau a invalidé le canal de communication sécurisé. Veuillez réessayer cette opération"
+ },
+ "nativeMessagingInvalidEncryptionTitle": {
+ "message": "Communication interrompue avec l'application de bureau"
+ },
+ "nativeMessagingWrongUserDesc": {
+ "message": "L'application de bureau est connectée à un autre compte. Veuillez vous assurer que les deux applications sont connectées au même compte."
+ },
+ "nativeMessagingWrongUserTitle": {
+ "message": "Erreur de correspondance entre les comptes"
+ },
+ "biometricsNotEnabledTitle": {
+ "message": "Le déverrouillage biométrique n'est pas activé"
+ },
+ "biometricsNotEnabledDesc": {
+ "message": "Les options de biométrie dans le navigateur nécessitent au préalable l'activation des options de biométrie dans l'application de bureau."
+ },
+ "biometricsNotSupportedTitle": {
+ "message": "Le déverrouillage biométrique n'est pas pris en charge"
+ },
+ "biometricsNotSupportedDesc": {
+ "message": "Le déverrouillage biométrique dans le navigateur n’est pas pris en charge sur cet appareil"
+ },
+ "nativeMessaginPermissionErrorTitle": {
+ "message": "Permission non accordée"
+ },
+ "nativeMessaginPermissionErrorDesc": {
+ "message": "Sans la permission de communiquer avec l'application de bureau Bitwarden, nous ne pouvons pas activer le déverrouillage biométrique dans l'extension navigateur. Veuillez réessayer."
+ },
+ "nativeMessaginPermissionSidebarTitle": {
+ "message": "Erreur de demande de permission"
+ },
+ "nativeMessaginPermissionSidebarDesc": {
+ "message": "Cette action ne peut pas être effectuée dans la barre latérale, veuillez réessayer l'action dans la popup ou la nouvelle fenêtre."
+ },
+ "personalOwnershipSubmitError": {
+ "message": "En raison d'une politique d'entreprise, il vous est interdit d'enregistrer des éléments dans votre coffre personnel. Sélectionnez une organisation dans l'option Propriété et choisissez parmi les collections disponibles."
+ },
+ "personalOwnershipPolicyInEffect": {
+ "message": "Une politique d'organisation affecte vos options de propriété."
+ },
+ "excludedDomains": {
+ "message": "Domaines exclus"
+ },
+ "excludedDomainsDesc": {
+ "message": "Bitwarden ne proposera pas d'enregistrer les informations de connexion pour ces domaines. Vous devez actualiser la page pour que les modifications prennent effet."
+ },
+ "excludedDomainsInvalidDomain": {
+ "message": "$DOMAIN$ n'est pas un domaine valide",
+ "placeholders": {
+ "domain": {
+ "content": "$1",
+ "example": "googlecom"
+ }
+ }
+ },
+ "send": {
+ "message": "Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "searchSends": {
+ "message": "Rechercher dans les Sends",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "addSend": {
+ "message": "Ajouter un Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTypeText": {
+ "message": "Texte"
+ },
+ "sendTypeFile": {
+ "message": "Fichier"
+ },
+ "allSends": {
+ "message": "Tous les Sends",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "maxAccessCountReached": {
+ "message": "Nombre maximum d'accès atteint"
+ },
+ "expired": {
+ "message": "Expiré"
+ },
+ "pendingDeletion": {
+ "message": "En attente de suppression"
+ },
+ "passwordProtected": {
+ "message": "Protégé par un mot de passe"
+ },
+ "copySendLink": {
+ "message": "Copier le lien du Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "removePassword": {
+ "message": "Supprimer le mot de passe"
+ },
+ "delete": {
+ "message": "Supprimer"
+ },
+ "removedPassword": {
+ "message": "Mot de passe supprimé"
+ },
+ "deletedSend": {
+ "message": "Send supprimé",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendLink": {
+ "message": "Lien du Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "disabled": {
+ "message": "Désactivé"
+ },
+ "removePasswordConfirmation": {
+ "message": "Êtes-vous sûr de vouloir supprimer le mot de passe ?"
+ },
+ "deleteSend": {
+ "message": "Supprimer le Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "deleteSendConfirmation": {
+ "message": "Êtes-vous sûr de vouloir supprimer ce Send ?",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "editSend": {
+ "message": "Modifier le Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTypeHeader": {
+ "message": "De quel type de Send s'agit-il ?",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendNameDesc": {
+ "message": "Un nom convivial pour décrire ce Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendFileDesc": {
+ "message": "Le fichier que vous voulez envoyer."
+ },
+ "deletionDate": {
+ "message": "Date de suppression"
+ },
+ "deletionDateDesc": {
+ "message": "Le Send sera définitivement supprimé à la date et heure spécifiées.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "expirationDate": {
+ "message": "Date d'expiration"
+ },
+ "expirationDateDesc": {
+ "message": "Si défini, l'accès à ce Send expirera à la date et heure spécifiées.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "oneDay": {
+ "message": "1 jour"
+ },
+ "days": {
+ "message": "$DAYS$ jours",
+ "placeholders": {
+ "days": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "custom": {
+ "message": "Personnalisé"
+ },
+ "maximumAccessCount": {
+ "message": "Nombre maximum d'accès"
+ },
+ "maximumAccessCountDesc": {
+ "message": "Si défini, les utilisateurs ne seront plus en mesure d'accéder à ce Send une fois que le nombre maximum d'accès sera atteint.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendPasswordDesc": {
+ "message": "Vous pouvez, si vous le souhaitez, exiger un mot de passe pour accéder à ce Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendNotesDesc": {
+ "message": "Notes privées à propos de ce Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendDisableDesc": {
+ "message": "Désactiver ce Send pour que personne ne puisse y accéder.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendShareDesc": {
+ "message": "Copier dans le presse-papiers le lien de ce Send lors de l'enregistrement.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTextDesc": {
+ "message": "Le texte que vous voulez envoyer."
+ },
+ "sendHideText": {
+ "message": "Cacher par défaut le texte de ce Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "currentAccessCount": {
+ "message": "Nombre d'accès actuel"
+ },
+ "createSend": {
+ "message": "Créer un nouveau Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "newPassword": {
+ "message": "Nouveau mot de passe"
+ },
+ "sendDisabled": {
+ "message": "Send désactivé",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendDisabledWarning": {
+ "message": "En raison d'une politique d'entreprise, vous ne pouvez que supprimer un Send existant.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "createdSend": {
+ "message": "Send créé",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "editedSend": {
+ "message": "Send modifié",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendLinuxChromiumFileWarning": {
+ "message": "Pour choisir un fichier, ouvrez l'extension dans la barre latérale (si possible) ou ouvrez une nouvelle fenêtre en cliquant sur cette bannière."
+ },
+ "sendFirefoxFileWarning": {
+ "message": "Afin de choisir un fichier en utilisant Firefox, ouvrez l'extension dans la barre latérale ou ouvrez une nouvelle fenêtre en cliquant sur cette bannière."
+ },
+ "sendSafariFileWarning": {
+ "message": "Pour choisir un fichier avec Safari, ouvrez une nouvelle fenêtre en cliquant sur cette bannière."
+ },
+ "sendFileCalloutHeader": {
+ "message": "Avant de commencer"
+ },
+ "sendFirefoxCustomDatePopoutMessage1": {
+ "message": "Pour utiliser un sélecteur de date en forme de calendrier,",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read '**To use a calendar style date picker ** click here to pop out your window.'"
+ },
+ "sendFirefoxCustomDatePopoutMessage2": {
+ "message": "cliquez ici",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker **click here** to pop out your window.'"
+ },
+ "sendFirefoxCustomDatePopoutMessage3": {
+ "message": "pour ouvrir une nouvelle fenêtre.",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker click here **to pop out your window.**'"
+ },
+ "expirationDateIsInvalid": {
+ "message": "La date d'expiration indiquée n'est pas valide."
+ },
+ "deletionDateIsInvalid": {
+ "message": "La date de suppression indiquée n'est pas valide."
+ },
+ "expirationDateAndTimeRequired": {
+ "message": "Une date et une heure d'expiration sont requises."
+ },
+ "deletionDateAndTimeRequired": {
+ "message": "Une date et une heure de suppression sont requises."
+ },
+ "dateParsingError": {
+ "message": "Une erreur s'est produite lors de l'enregistrement de vos dates de suppression et d'expiration."
+ },
+ "hideEmail": {
+ "message": "Cacher mon adresse e-mail aux destinataires."
+ },
+ "sendOptionsPolicyInEffect": {
+ "message": "Une ou plusieurs politiques d'organisation affectent vos options Send."
+ },
+ "passwordPrompt": {
+ "message": "Ressaisie du mot de passe maître"
+ },
+ "passwordConfirmation": {
+ "message": "Confirmation du mot de passe maître"
+ },
+ "passwordConfirmationDesc": {
+ "message": "Cette action est protégée. Pour continuer, veuillez ressaisir votre mot de passe maître pour vérifier votre identité."
+ },
+ "emailVerificationRequired": {
+ "message": "Vérification de l'adresse e-mail nécessaire"
+ },
+ "emailVerificationRequiredDesc": {
+ "message": "Vous devez vérifier votre adresse e-mail pour utiliser cette fonctionnalité. Vous pouvez vérifier votre adresse e-mail dans le coffre web."
+ },
+ "updatedMasterPassword": {
+ "message": "Mot de passe maître mis à jour"
+ },
+ "updateMasterPassword": {
+ "message": "Mettre à jour le mot de passe maître"
+ },
+ "updateMasterPasswordWarning": {
+ "message": "Votre mot de passe maître a récemment été modifié par un administrateur de votre organisation. Pour pouvoir accéder au coffre-fort, vous devez mettre à jour votre mot de passe maître maintenant. Poursuivre vous déconnectera de votre session actuelle, vous obligeant à vous reconnecter. Les sessions actives sur d'autres appareils peuvent rester actives jusqu'à une heure."
+ },
+ "resetPasswordPolicyAutoEnroll": {
+ "message": "Inscription automatique"
+ },
+ "resetPasswordAutoEnrollInviteWarning": {
+ "message": "Cette organisation a une politique d'entreprise qui vous inscrira automatiquement à la réinitialisation du mot de passe. L'inscription permettra aux administrateurs de l'organisation de changer votre mot de passe maître."
+ },
+ "selectFolder": {
+ "message": "Sélectionnez un dossier..."
+ },
+ "ssoCompleteRegistration": {
+ "message": "Afin de terminer la connexion avec SSO, veuillez définir un mot de passe maître pour accéder à votre coffre-fort et le protéger."
+ },
+ "hours": {
+ "message": "heures"
+ },
+ "minutes": {
+ "message": "minutes"
+ },
+ "vaultTimeoutPolicyInEffect": {
+ "message": "Les politiques de votre organisation affectent le délai d'expiration de votre coffre-fort. Le délai d'expiration maximal autorisé est de $HOURS$ heure(s) et $MINUTES$ minute(s).",
+ "placeholders": {
+ "hours": {
+ "content": "$1",
+ "example": "5"
+ },
+ "minutes": {
+ "content": "$2",
+ "example": "5"
+ }
+ }
+ },
+ "vaultTimeoutToLarge": {
+ "message": "Le délai d'expiration de votre coffre-fort dépasse la restriction définie par votre organisation."
+ },
+ "vaultExportDisabled": {
+ "message": "Exportation du coffre-fort désactivée"
+ },
+ "personalVaultExportPolicyInEffect": {
+ "message": "Une ou plusieurs politiques d'entreprise vous empêchent d'exporter votre coffre-fort personnel."
+ },
+ "copyCustomFieldNameInvalidElement": {
+ "message": "Un élément de formulaire valide n'a pu être identifié. Essayez plutôt d'inspecter le HTML."
+ },
+ "copyCustomFieldNameNotUnique": {
+ "message": "Aucun identifiant unique trouvé."
+ }
+}
diff --git a/src/iOS.Safari/Resources/_locales/he/messages.json b/src/iOS.Safari/Resources/_locales/he/messages.json
new file mode 100644
index 000000000..0eefa7de0
--- /dev/null
+++ b/src/iOS.Safari/Resources/_locales/he/messages.json
@@ -0,0 +1,1817 @@
+{
+ "appName": {
+ "message": "Bitwarden"
+ },
+ "extName": {
+ "message": "Bitwarden - מנהל סיסמאות חינמי",
+ "description": "Extension name, MUST be less than 40 characters (Safari restriction)"
+ },
+ "extDesc": {
+ "message": "מנהל סיסמאות חינמי ומאובטח עבור כל המכשירים שלך.",
+ "description": "Extension description"
+ },
+ "loginOrCreateNewAccount": {
+ "message": "צור חשבון חדש או התחבר כדי לגשת לכספת המאובטחת שלך."
+ },
+ "createAccount": {
+ "message": "צור חשבון"
+ },
+ "login": {
+ "message": "התחבר"
+ },
+ "enterpriseSingleSignOn": {
+ "message": "כניסה אחודה ארגונית"
+ },
+ "cancel": {
+ "message": "בטל"
+ },
+ "close": {
+ "message": "סגור"
+ },
+ "submit": {
+ "message": "שלח"
+ },
+ "emailAddress": {
+ "message": "כתובת אימייל"
+ },
+ "masterPass": {
+ "message": "סיסמה ראשית"
+ },
+ "masterPassDesc": {
+ "message": "הסיסמה הראשית היא הסיסמה שבאמצעותה תיגש לכספת שלך. חשוב מאוד שלא תשכח את הסיסמה הזו. אין שום דרך לשחזר אותה במקרה ושכחת אותה."
+ },
+ "masterPassHintDesc": {
+ "message": "ניתן להשתמש ברמז לסיסמה הראשית אם שכחת אותה."
+ },
+ "reTypeMasterPass": {
+ "message": "הקלד שוב סיסמה ראשית"
+ },
+ "masterPassHint": {
+ "message": "רמז לסיסמה ראשית (אופציונאלי)"
+ },
+ "tab": {
+ "message": "לשונית"
+ },
+ "myVault": {
+ "message": "הכספת שלי"
+ },
+ "tools": {
+ "message": "כלים"
+ },
+ "settings": {
+ "message": "הגדרות"
+ },
+ "currentTab": {
+ "message": "לשונית נוכחית"
+ },
+ "copyPassword": {
+ "message": "העתק סיסמה"
+ },
+ "copyNote": {
+ "message": "העתק פתק"
+ },
+ "copyUri": {
+ "message": "העתק שורת כתובת"
+ },
+ "copyUsername": {
+ "message": "העתק שם משתמש"
+ },
+ "copyNumber": {
+ "message": "העתק מספר"
+ },
+ "copySecurityCode": {
+ "message": "העתק קוד אבטחה"
+ },
+ "autoFill": {
+ "message": "השלמה אוטומטית"
+ },
+ "generatePasswordCopied": {
+ "message": "צור סיסמה חדשה (והעתק לזיכרון)"
+ },
+ "copyElementIdentifier": {
+ "message": "Copy Custom Field Name"
+ },
+ "noMatchingLogins": {
+ "message": "לא נמצאו פרטי כניסה תואמים."
+ },
+ "vaultLocked": {
+ "message": "הכספת נעולה."
+ },
+ "vaultLoggedOut": {
+ "message": "בוצעה יציאה מהכספת."
+ },
+ "autoFillInfo": {
+ "message": "לא נמצאו פרטי כניסה להשלמה אוטומטית בלשונית הנוכחית בדפדפן."
+ },
+ "addLogin": {
+ "message": "הוסף פרטי כניסה"
+ },
+ "addItem": {
+ "message": "הוסף פריט"
+ },
+ "passwordHint": {
+ "message": "רמז לסיסמה"
+ },
+ "enterEmailToGetHint": {
+ "message": "הכנס את פרטי האימייל שלך לקבלת רמז עבור הסיסמה הראשית."
+ },
+ "getMasterPasswordHint": {
+ "message": "הצג את הרמז לסיסמה הראשית"
+ },
+ "continue": {
+ "message": "המשך"
+ },
+ "verificationCode": {
+ "message": "קוד אימות"
+ },
+ "account": {
+ "message": "חשבון"
+ },
+ "changeMasterPassword": {
+ "message": "החלף סיסמה ראשית"
+ },
+ "fingerprintPhrase": {
+ "message": "סיסמת טביעת אצבע",
+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
+ },
+ "yourAccountsFingerprint": {
+ "message": "הסיסמה של טביעת האצבעות בחשבון שלך",
+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
+ },
+ "twoStepLogin": {
+ "message": "התחברות בשני-שלבים"
+ },
+ "logOut": {
+ "message": "התנתק"
+ },
+ "about": {
+ "message": "אודות"
+ },
+ "version": {
+ "message": "גירסה"
+ },
+ "save": {
+ "message": "שמור"
+ },
+ "move": {
+ "message": "Move"
+ },
+ "addFolder": {
+ "message": "הוסף תיקייה"
+ },
+ "name": {
+ "message": "שם"
+ },
+ "editFolder": {
+ "message": "ערוך תיקייה"
+ },
+ "deleteFolder": {
+ "message": "מחק תיקייה"
+ },
+ "folders": {
+ "message": "תיקיות"
+ },
+ "noFolders": {
+ "message": "אין תיקיות להצגה."
+ },
+ "helpFeedback": {
+ "message": "עזרה ומשוב"
+ },
+ "sync": {
+ "message": "סנכרן"
+ },
+ "syncVaultNow": {
+ "message": "סנכרן את הכספת עכשיו"
+ },
+ "lastSync": {
+ "message": "סנכרון אחרון:"
+ },
+ "passGen": {
+ "message": "יוצר הסיסמאות"
+ },
+ "generator": {
+ "message": "מייצר",
+ "description": "Short for 'Password Generator'."
+ },
+ "passGenInfo": {
+ "message": "צור אוטומטית סיסמאות חזקות ויחודיות עבור פרטי הכניסה שלך."
+ },
+ "bitWebVault": {
+ "message": "כספת באתר Bitwarden"
+ },
+ "importItems": {
+ "message": "יבא פריטים"
+ },
+ "select": {
+ "message": "בחר"
+ },
+ "generatePassword": {
+ "message": "צור סיסמה"
+ },
+ "regeneratePassword": {
+ "message": "צור סיסמה חדשה"
+ },
+ "options": {
+ "message": "אפשרויות"
+ },
+ "length": {
+ "message": "אורך"
+ },
+ "numWords": {
+ "message": "מספר מילים"
+ },
+ "wordSeparator": {
+ "message": "מפריד מילים"
+ },
+ "capitalize": {
+ "message": "הפוך אותיות ראשונות לאותיות גדולות",
+ "description": "Make the first letter of a work uppercase."
+ },
+ "includeNumber": {
+ "message": "כלול מספרים"
+ },
+ "minNumbers": {
+ "message": "מינימום ספרות"
+ },
+ "minSpecial": {
+ "message": "מינימום תוים מיוחדים"
+ },
+ "avoidAmbChar": {
+ "message": "המנע מאותיות ותוים דומים"
+ },
+ "searchVault": {
+ "message": "חיפוש בכספת"
+ },
+ "edit": {
+ "message": "ערוך"
+ },
+ "view": {
+ "message": "הצג"
+ },
+ "noItemsInList": {
+ "message": "אין פריטים להצגה."
+ },
+ "itemInformation": {
+ "message": "מידע על הפריט"
+ },
+ "username": {
+ "message": "שם משתמש"
+ },
+ "password": {
+ "message": "סיסמה"
+ },
+ "passphrase": {
+ "message": "משפט סיסמה"
+ },
+ "favorite": {
+ "message": "מועדף"
+ },
+ "notes": {
+ "message": "הערות"
+ },
+ "note": {
+ "message": "הערה"
+ },
+ "editItem": {
+ "message": "ערוך פריט"
+ },
+ "folder": {
+ "message": "תיקייה"
+ },
+ "deleteItem": {
+ "message": "מחק פריט"
+ },
+ "viewItem": {
+ "message": "צפה בפריט"
+ },
+ "launch": {
+ "message": "הפעל"
+ },
+ "website": {
+ "message": "אתר"
+ },
+ "toggleVisibility": {
+ "message": "הצג או הסתר"
+ },
+ "manage": {
+ "message": "נהל"
+ },
+ "other": {
+ "message": "אחר"
+ },
+ "rateExtension": {
+ "message": "דירוג הרחבה"
+ },
+ "rateExtensionDesc": {
+ "message": "אם נהנית מהתוכנה, בבקשה דרג את התוכנה וכתוב דירוג עם חוות דעת טובה!"
+ },
+ "browserNotSupportClipboard": {
+ "message": "הדפדפן שלך לא תומך בהעתקה ללוח. אנא העתק בצורה ידנית."
+ },
+ "verifyMasterPassword": {
+ "message": "אמת סיסמה ראשית"
+ },
+ "yourVaultIsLocked": {
+ "message": "הכספת שלך נעולה. הזן את הסיסמה הראשית שלך כדי להמשיך."
+ },
+ "unlock": {
+ "message": "בטל נעילה"
+ },
+ "loggedInAsOn": {
+ "message": "מחובר כ $EMAIL$ באתר $HOSTNAME$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "name@example.com"
+ },
+ "hostname": {
+ "content": "$2",
+ "example": "bitwarden.com"
+ }
+ }
+ },
+ "invalidMasterPassword": {
+ "message": "סיסמה ראשית שגויה"
+ },
+ "vaultTimeout": {
+ "message": "משך זמן מירבי עבור חיבור לכספת"
+ },
+ "lockNow": {
+ "message": "נעל עכשיו"
+ },
+ "immediately": {
+ "message": "באופן מיידי"
+ },
+ "tenSeconds": {
+ "message": "10 שניות"
+ },
+ "twentySeconds": {
+ "message": "20 שניות"
+ },
+ "thirtySeconds": {
+ "message": "30 שניות"
+ },
+ "oneMinute": {
+ "message": "דקה"
+ },
+ "twoMinutes": {
+ "message": "2 דקות"
+ },
+ "fiveMinutes": {
+ "message": "5 דקות"
+ },
+ "fifteenMinutes": {
+ "message": "15 דקות"
+ },
+ "thirtyMinutes": {
+ "message": "30 דקות"
+ },
+ "oneHour": {
+ "message": "שעה"
+ },
+ "fourHours": {
+ "message": "4 שעות"
+ },
+ "onLocked": {
+ "message": "בזמן נעילת המערכת"
+ },
+ "onRestart": {
+ "message": "בהפעלת הדפדפן מחדש"
+ },
+ "never": {
+ "message": "לעולם לא"
+ },
+ "security": {
+ "message": "אבטחה"
+ },
+ "errorOccurred": {
+ "message": "אירעה שגיאה"
+ },
+ "emailRequired": {
+ "message": "נדרשת כתובת אימייל."
+ },
+ "invalidEmail": {
+ "message": "כתובת אימייל לא תקינה."
+ },
+ "masterPassRequired": {
+ "message": "יש להזין את הסיסמה הראשית."
+ },
+ "masterPassLength": {
+ "message": "הסיסמה הראשית חייבת להיות לפחות באורך 8 תווים."
+ },
+ "masterPassDoesntMatch": {
+ "message": "שדה אימות סיסמה ראשית לא תואם."
+ },
+ "newAccountCreated": {
+ "message": "החשבון שלך נוצר בהצלחה! כעת ניתן להכנס למערכת."
+ },
+ "masterPassSent": {
+ "message": "שלחנו לך אימייל עם רמז לסיסמה הראשית."
+ },
+ "verificationCodeRequired": {
+ "message": "נדרש קוד אימות."
+ },
+ "valueCopied": {
+ "message": "השדה $VALUE$ הועתק לזיכרון",
+ "description": "Value has been copied to the clipboard.",
+ "placeholders": {
+ "value": {
+ "content": "$1",
+ "example": "Password"
+ }
+ }
+ },
+ "autofillError": {
+ "message": "לא הצלחנו לבצע פעולת השלמה האוטומטית בעמוד זה. אנא העתק והדבק את המידע הנחוץ בצורה ידנית."
+ },
+ "loggedOut": {
+ "message": "בוצעה יציאה"
+ },
+ "loginExpired": {
+ "message": "תוקף החיבור שלך הסתיים."
+ },
+ "logOutConfirmation": {
+ "message": "האם אתה בטוח שברצונך להתנתק?"
+ },
+ "yes": {
+ "message": "כן"
+ },
+ "no": {
+ "message": "לא"
+ },
+ "unexpectedError": {
+ "message": "אירעה שגיאה לא צפויה."
+ },
+ "nameRequired": {
+ "message": "דרוש שם."
+ },
+ "addedFolder": {
+ "message": "נוספה תיקייה"
+ },
+ "changeMasterPass": {
+ "message": "החלף סיסמה ראשית"
+ },
+ "changeMasterPasswordConfirmation": {
+ "message": "באפשרותך לשנות את הסיסמה הראשית שלך דרך הכספת באתר bitwarden.com. האם ברצונך לפתוח את האתר כעת?"
+ },
+ "twoStepLoginConfirmation": {
+ "message": "התחברות בשני-שלבים הופכת את החשבון שלך למאובטח יותר בכך שאתה נדרש לוודא בכל כניסה בעזרת מכשיר אחר כדוגמת מפתח אבטחה, תוכנת אימות, SMS, שיחת טלפון, או אימייל. ניתן להפעיל את \"התחברות בשני-שלבים\" בכספת שבאתר bitwarden.com. האם ברצונך לפתוח את האתר כעת?"
+ },
+ "editedFolder": {
+ "message": "תיקייה שנערכה"
+ },
+ "deleteFolderConfirmation": {
+ "message": "האם אתה בטוח שברצונך למחוק את התיקייה?"
+ },
+ "deletedFolder": {
+ "message": "תיקייה שנמחקה"
+ },
+ "gettingStartedTutorial": {
+ "message": "מדריך שימוש ראשוני"
+ },
+ "gettingStartedTutorialVideo": {
+ "message": "צפה במדריך השימוש הראשוני כדי ללמוד איך לנצל את המקסימום שהתוסף לדפדפן יכול להציע."
+ },
+ "syncingComplete": {
+ "message": "הסינכרון הושלם"
+ },
+ "syncingFailed": {
+ "message": "הסינכרון נכשל"
+ },
+ "passwordCopied": {
+ "message": "הסיסמה הועתקה"
+ },
+ "uri": {
+ "message": "כתובת"
+ },
+ "uriPosition": {
+ "message": "כתובת $POSITION$",
+ "description": "A listing of URIs. Ex: URI 1, URI 2, URI 3, etc.",
+ "placeholders": {
+ "position": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "newUri": {
+ "message": "כתובת חדשה"
+ },
+ "addedItem": {
+ "message": "פריט שהתווסף"
+ },
+ "editedItem": {
+ "message": "פריט שנערך"
+ },
+ "deleteItemConfirmation": {
+ "message": "האם אתה בטוח שברצונך למחוק פריט זה?"
+ },
+ "deletedItem": {
+ "message": "פריט נשלח לסל המחזור"
+ },
+ "overwritePassword": {
+ "message": "דרוס סיסמה"
+ },
+ "overwritePasswordConfirmation": {
+ "message": "האם אתה בטוח שברצונך לדרוס את הסיסמה הנוכחית?"
+ },
+ "searchFolder": {
+ "message": "חפש תיקייה"
+ },
+ "searchCollection": {
+ "message": "חפש אוסף"
+ },
+ "searchType": {
+ "message": "חפש סוג"
+ },
+ "noneFolder": {
+ "message": "ללא תיקייה",
+ "description": "This is the folder for uncategorized items"
+ },
+ "disableAddLoginNotification": {
+ "message": "בטל את ההודעה \"שמור פרטי כניסה\""
+ },
+ "addLoginNotificationDesc": {
+ "message": "ההודעה \"שמור פרטי כניסה\" מופיעה בכל פעם שתכנס לאתר חדש בפעם הראשונה."
+ },
+ "dontShowCardsCurrentTab": {
+ "message": "אל תציג כרטיסים העמוד הלשונית"
+ },
+ "dontShowCardsCurrentTabDesc": {
+ "message": "פרטי כרטיס מהכספת שלך מופיעים בעמוד 'הלשונית הנוכחית' לגישה קלה להשלמה האוטומטית."
+ },
+ "dontShowIdentitiesCurrentTab": {
+ "message": "אל תציג זהויות בעמוד הלשונית"
+ },
+ "dontShowIdentitiesCurrentTabDesc": {
+ "message": "פרטי זהות מהכספת שלך מופיעים בעמוד 'הלשונית הנוכחית' לגישה קלה להשלמה האוטומטית."
+ },
+ "clearClipboard": {
+ "message": "נקה לוח העתקות",
+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
+ },
+ "clearClipboardDesc": {
+ "message": "נקה אוטומטית ערכים שהועתקו ללוח ההעתקות (clipboard).",
+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
+ },
+ "notificationAddDesc": {
+ "message": "האם ברצונך שתוכנת Bitwarden תזכור סיסמה זו עבורך?"
+ },
+ "notificationAddSave": {
+ "message": "כן, שמור עכשיו"
+ },
+ "notificationNeverSave": {
+ "message": "אף פעם עבור אתר זה"
+ },
+ "disableChangedPasswordNotification": {
+ "message": "בטל התראת \"סיסמה שונתה\""
+ },
+ "disableChangedPasswordNotificationDesc": {
+ "message": "ההתראה \"סיסמה שונתה\" תופיע בכל פעם שהמערכת מזהה שינוי בסיסמה באתר אם פרטי הכניסה הקודמים שמורים שבכספת."
+ },
+ "notificationChangeDesc": {
+ "message": "האם ברצונך לעדכן את הסיסמה הזו בתוכנת Bitwarden?"
+ },
+ "notificationChangeSave": {
+ "message": "כן, עדכן עכשיו"
+ },
+ "disableContextMenuItem": {
+ "message": "בטל את אפשרויות תפריט ההקשר"
+ },
+ "disableContextMenuItemDesc": {
+ "message": "אפשרויות תפריט ההקשר מספקים גישה מהירה ליצירת סיסמאות חדשות ולפרטי כניסה לאתר עבור הלשונית הנוכחית בדפדפן."
+ },
+ "defaultUriMatchDetection": {
+ "message": "ברירת מחדל לזיהוי התאמת כתובות",
+ "description": "Default URI match detection for auto-fill."
+ },
+ "defaultUriMatchDetectionDesc": {
+ "message": "בחר את שיטת ברירת המחדל עבור זיהוי התאמת כתובות כשמבצעים פעולות השלמה אוטומטית."
+ },
+ "theme": {
+ "message": "ערכת נושא"
+ },
+ "themeDesc": {
+ "message": "שנה את ערכת הצבע של האפליקציה."
+ },
+ "dark": {
+ "message": "כהה",
+ "description": "Dark color"
+ },
+ "light": {
+ "message": "בהיר",
+ "description": "Light color"
+ },
+ "solarizedDark": {
+ "message": "Solarized Dark",
+ "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated."
+ },
+ "exportVault": {
+ "message": "יצוא כספת"
+ },
+ "fileFormat": {
+ "message": "פורמט קובץ"
+ },
+ "warning": {
+ "message": "אזהרה",
+ "description": "WARNING (should stay in capitalized letters if the language permits)"
+ },
+ "confirmVaultExport": {
+ "message": "אישור ייצוא כספת"
+ },
+ "exportWarningDesc": {
+ "message": "הקובץ מכיל את פרטי הכספת שלך בפורמט לא מוצפן. מומלץ להעביר את הקובץ רק בדרכים מוצפנות, ומאוד לא מומלץ לשמור או לשלוח את הקובץ הזה בדרכים לא מוצפנות (כדוגמת סתם אימייל). מחק את הקובץ מיד לאחר שסיימת את השימוש בו."
+ },
+ "encExportKeyWarningDesc": {
+ "message": "ייצוא זה מצפין את המידע שלך באמצעות שימוש במפתח ההצפנה של חשבונך. אם אי-פעם תבצע החלפה (רוטציה) למפתח ההצפנה של חשבונך, עליך לבצע ייצוא זה שוב אחרת לא תוכל לפענח קובץ ייצוא זה."
+ },
+ "encExportAccountWarningDesc": {
+ "message": "Account encryption keys are unique to each Bitwarden user account, so you can't import an encrypted export into a different account."
+ },
+ "exportMasterPassword": {
+ "message": "הזן את הסיסמה הראשית שלך עבור יצוא המידע מהכספת."
+ },
+ "shared": {
+ "message": "משותף"
+ },
+ "learnOrg": {
+ "message": "Learn about Organizations"
+ },
+ "learnOrgConfirmation": {
+ "message": "Bitwarden allows you to share your vault items with others by using an organization. Would you like to visit the bitwarden.com website to learn more?"
+ },
+ "moveToOrganization": {
+ "message": "Move to Organization"
+ },
+ "share": {
+ "message": "שתף"
+ },
+ "movedItemToOrg": {
+ "message": "$ITEMNAME$ הועבר ל- $ORGNAME$",
+ "placeholders": {
+ "itemname": {
+ "content": "$1",
+ "example": "Secret Item"
+ },
+ "orgname": {
+ "content": "$2",
+ "example": "Company Name"
+ }
+ }
+ },
+ "moveToOrgDesc": {
+ "message": "Choose an organization that you wish to move this item to. Moving to an organization transfers ownership of the item to that organization. You will no longer be the direct owner of this item once it has been moved."
+ },
+ "learnMore": {
+ "message": "למידע נוסף"
+ },
+ "authenticatorKeyTotp": {
+ "message": "מפתח אימות (TOTP)"
+ },
+ "verificationCodeTotp": {
+ "message": "קוד אימות (TOTP)"
+ },
+ "copyVerificationCode": {
+ "message": "העתק קוד אימות"
+ },
+ "attachments": {
+ "message": "קבצים מצורפים"
+ },
+ "deleteAttachment": {
+ "message": "מחק קובץ מצורף"
+ },
+ "deleteAttachmentConfirmation": {
+ "message": "האם אתה בטוח שברצונך למחוק קובץ מצורף זה?"
+ },
+ "deletedAttachment": {
+ "message": "קובץ מצורף שנמחק"
+ },
+ "newAttachment": {
+ "message": "צרף קובץ חדש"
+ },
+ "noAttachments": {
+ "message": "אין קבצים מצורפים."
+ },
+ "attachmentSaved": {
+ "message": "הקובץ המצורף נשמר."
+ },
+ "file": {
+ "message": "קובץ"
+ },
+ "selectFile": {
+ "message": "בחר קובץ."
+ },
+ "maxFileSize": {
+ "message": "גודל הקובץ המירבי הוא 500 מגה."
+ },
+ "featureUnavailable": {
+ "message": "יכולת זו לא זמינה"
+ },
+ "updateKey": {
+ "message": "לא ניתן להשתמש ביכולת זו עד שתעדכן את מפתח ההצפנה שלך."
+ },
+ "premiumMembership": {
+ "message": "חשבון פרימיום"
+ },
+ "premiumManage": {
+ "message": "נהל חשבון"
+ },
+ "premiumManageAlert": {
+ "message": "באפשרותך לנהל את החשבון שלך דרך הכספת באתר bitwarden.com. האם ברצונך לפתוח את האתר כעת?"
+ },
+ "premiumRefresh": {
+ "message": "רענן פרטי חשבון"
+ },
+ "premiumNotCurrentMember": {
+ "message": "חשבונך אינו חשבון פרמיום כרגע."
+ },
+ "premiumSignUpAndGet": {
+ "message": "צור חשבון פרמיום לשנה, וקבל:"
+ },
+ "ppremiumSignUpStorage": {
+ "message": "1 ג'יגה של מקום אחסון עבור קבצים מצורפים."
+ },
+ "ppremiumSignUpTwoStep": {
+ "message": "אפשרויות כניסה דו שלבית מתקדמות כמו YubiKey, FIDO U2F, וגם Duo."
+ },
+ "ppremiumSignUpReports": {
+ "message": "היגיינת סיסמאות, מצב בריאות החשבון, ודיווחים מעודכנים על פרצות חדשות בכדי לשמור על הכספת שלך בטוחה."
+ },
+ "ppremiumSignUpTotp": {
+ "message": "מייצר קודי אימות TOTP עבור כניסות דו-שלביות (2FA) בכספת שלך."
+ },
+ "ppremiumSignUpSupport": {
+ "message": "קדימות בתמיכה הטכנית."
+ },
+ "ppremiumSignUpFuture": {
+ "message": "כל יכולות הפרימיום העתידיות שנפתח. עוד יכולות מגיעות בקרוב!"
+ },
+ "premiumPurchase": {
+ "message": "רכוש פרימיום"
+ },
+ "premiumPurchaseAlert": {
+ "message": "באפשרותך לרכוש מנוי פרימיום בכספת באתר bitwarden.com. האם ברצונך לפתוח את האתר כעת?"
+ },
+ "premiumCurrentMember": {
+ "message": "אתה מנוי פרימיום!"
+ },
+ "premiumCurrentMemberThanks": {
+ "message": "תודה על תמיכתך בBitwarden."
+ },
+ "premiumPrice": {
+ "message": "הכל רק ב$PRICE$ לשנה!",
+ "placeholders": {
+ "price": {
+ "content": "$1",
+ "example": "$10"
+ }
+ }
+ },
+ "refreshComplete": {
+ "message": "הרענון הושלם"
+ },
+ "disableAutoTotpCopy": {
+ "message": "בטל העתקה אוטומטית של קוד TOTP"
+ },
+ "disableAutoTotpCopyDesc": {
+ "message": "אם פרטי הכניסה שלך מקושרים לאפליקציית אימות, קוד האימות TOTP מועתק אוטומטית ללוח שלך ברגע שמתבצעת ההשלמה האוטומטית לטופס הכניסה."
+ },
+ "disableAutoBiometricsPrompt": {
+ "message": "Do not prompt for biometrics on launch"
+ },
+ "premiumRequired": {
+ "message": "נדרש חשבון פרימיום"
+ },
+ "premiumRequiredDesc": {
+ "message": "בכדי להשתמש ביכולת זו יש צורך בחשבון פרימיום."
+ },
+ "enterVerificationCodeApp": {
+ "message": "הכנס את קוד האימות בן 6 הספרות מאפליקציית האימות שלך."
+ },
+ "enterVerificationCodeEmail": {
+ "message": "הכנס את קוד האימות בן 6 הספרות שנשלח ל-$EMAIL$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "example@gmail.com"
+ }
+ }
+ },
+ "verificationCodeEmailSent": {
+ "message": "מייל אימות נשלח לכתובת $EMAIL$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "example@gmail.com"
+ }
+ }
+ },
+ "rememberMe": {
+ "message": "זכור אותי"
+ },
+ "sendVerificationCodeEmailAgain": {
+ "message": "שלח שוב קוד אימות לאימייל"
+ },
+ "useAnotherTwoStepMethod": {
+ "message": "השתמש בשיטה אחרת עבור כניסה דו שלבית"
+ },
+ "insertYubiKey": {
+ "message": "הכנס את ה-YubiKey אל כניסת ה-USB במחשבך, ואז גע בכפתור שלו."
+ },
+ "insertU2f": {
+ "message": "הכנס את מפתח האבטחה שלך אל כניסת ה-USB במחשבך. אם יש לו כפתור, לחץ עליו."
+ },
+ "webAuthnNewTab": {
+ "message": "To start the WebAuthn 2FA verification. Click the button below to open a new tab and follow the instructions provided in the new tab."
+ },
+ "webAuthnNewTabOpen": {
+ "message": "Open new tab"
+ },
+ "webAuthnAuthenticate": {
+ "message": "Authenticate WebAuthn"
+ },
+ "loginUnavailable": {
+ "message": "פרטי כניסה לא זמינים"
+ },
+ "noTwoStepProviders": {
+ "message": "כניסה דו-שלבית פעילה בחשבון זה, אך אף אחד מספקי הכניסה הדו-שלבית לא נתמכים בדפדפן זה."
+ },
+ "noTwoStepProviders2": {
+ "message": "אנא השתמש בדפדפן נתמך (כמו לדוגמא Chrome) ו\\או הוסף ספק כניסה דו-שלבית הנתמך בדפדפן זה (כמו לדוגמא אפליקצית אימות)."
+ },
+ "twoStepOptions": {
+ "message": "אפשרויות כניסה דו שלבית"
+ },
+ "recoveryCodeDesc": {
+ "message": "איבדת גישה לכל ספקי האימות הדו-שלבי שלך? השתמש בקוד השחזור בכדי לבטל את כל ספקי האימות הדו-שלבי דרך החשבון שלך."
+ },
+ "recoveryCodeTitle": {
+ "message": "קוד שחזור"
+ },
+ "authenticatorAppTitle": {
+ "message": "אפליקציית אימות"
+ },
+ "authenticatorAppDesc": {
+ "message": "השתמש באפליקצית אימות (כמו לדוגמא Authy או Google Authenticator) לייצור סיסמאות אימות מבוססות זמן.",
+ "description": "'Authy' and 'Google Authenticator' are product names and should not be translated."
+ },
+ "yubiKeyTitle": {
+ "message": "מפתח אבטחה OTP של YubiKey"
+ },
+ "yubiKeyDesc": {
+ "message": "השתמש בYubiKey עבור גישה לחשבון שלך. עובד עם YubiKey בגירסאות 4, 4C, 4Nano, ומכשירי NEO."
+ },
+ "duoDesc": {
+ "message": "בצע אימות מול Duo Security באמצעות אפליקצית Duo לפלאפון, SMS, שיחת טלפון, או מפתח אבטחה U2F.",
+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
+ },
+ "duoOrganizationDesc": {
+ "message": "בצע אימות מול Duo Security עבור הארגון שלך באמצעות אפליקצית Duo לפלאפון, SMS, שיחת טלפון, או מפתח אבטחה U2F.",
+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
+ },
+ "webAuthnTitle": {
+ "message": "FIDO2 WebAuthn"
+ },
+ "webAuthnDesc": {
+ "message": "Use any WebAuthn enabled security key to access your account."
+ },
+ "emailTitle": {
+ "message": "אימייל"
+ },
+ "emailDesc": {
+ "message": "קודי אימות ישלחו לאימייל שלך."
+ },
+ "selfHostedEnvironment": {
+ "message": "סביבה על שרתים מקומיים"
+ },
+ "selfHostedEnvironmentFooter": {
+ "message": "הזן את כתובת השרת המקומי של Bitwarden."
+ },
+ "customEnvironment": {
+ "message": "סביבה מותאמת אישית"
+ },
+ "customEnvironmentFooter": {
+ "message": "למשתמשים מתקדמים. באפשרותך לציין את כתובת השרת עבור כל שירות בנפרד."
+ },
+ "baseUrl": {
+ "message": "כתובת שרת"
+ },
+ "apiUrl": {
+ "message": "כתובת שרת הAPI"
+ },
+ "webVaultUrl": {
+ "message": "כתובת שרת הכספת"
+ },
+ "identityUrl": {
+ "message": "כתובת שרת הזהות"
+ },
+ "notificationsUrl": {
+ "message": "כתובת שרת הודעות"
+ },
+ "iconsUrl": {
+ "message": "כתובת שרת אייקונים"
+ },
+ "environmentSaved": {
+ "message": "כתובות הסביבה נשמרו."
+ },
+ "enableAutoFillOnPageLoad": {
+ "message": "הפעל השלמה אוטומטית בזמן טעינת העמוד"
+ },
+ "enableAutoFillOnPageLoadDesc": {
+ "message": "אם זוהה טופס כניסה, בצע אוטומטית מילוי-אוטומטי כשהעמוד נטען."
+ },
+ "experimentalFeature": {
+ "message": "זוהי אופציה נסיונית. השימוש באופציה זו על אחריותך."
+ },
+ "defaultAutoFillOnPageLoad": {
+ "message": "הגדרת ברירת מחדל למילוי אוטומטי של פרטי התחברות"
+ },
+ "defaultAutoFillOnPageLoadDesc": {
+ "message": "לאחר הפעלת מילוי אוטומטי של פרטים בעת טעינת דפים, אפשר להפעיל או לכבות את האפשרות לפרטי התחברות ספציפיים. זו הגדרת ברירת המחדל לפרטי התחברות שלא הוגדרו בנפרד."
+ },
+ "itemAutoFillOnPageLoad": {
+ "message": "מילוי אוטומטי בעת טעינת דפים (אם מופעל בהגדרות)"
+ },
+ "autoFillOnPageLoadUseDefault": {
+ "message": "שימוש בהגדרות ברירת המחדל"
+ },
+ "autoFillOnPageLoadYes": {
+ "message": "מילוי אוטומטי אחרי טעינת דפים"
+ },
+ "autoFillOnPageLoadNo": {
+ "message": "Do not auto-fill on page load"
+ },
+ "commandOpenPopup": {
+ "message": "פתיחת כספת בחלונית צפה"
+ },
+ "commandOpenSidebar": {
+ "message": "פתיחת כספת בסרגל צד"
+ },
+ "commandAutofillDesc": {
+ "message": "השתמש בהשלמה-האוטומטית האחרונה שבוצעה באתר זה."
+ },
+ "commandGeneratePasswordDesc": {
+ "message": "צור והעתק סיסמה רנדומלית חדשה."
+ },
+ "commandLockVaultDesc": {
+ "message": "נעל את הכספת"
+ },
+ "privateModeMessage": {
+ "message": "לצערנו חלון זה אינו זמין במצב גלישה פרטית בדפדפן זה."
+ },
+ "customFields": {
+ "message": "שדות מותאמים אישית"
+ },
+ "copyValue": {
+ "message": "העתק ערך"
+ },
+ "value": {
+ "message": "ערך"
+ },
+ "newCustomField": {
+ "message": "שדה מותאם אישית חדש"
+ },
+ "dragToSort": {
+ "message": "גרור כדי למיין"
+ },
+ "cfTypeText": {
+ "message": "טקסט"
+ },
+ "cfTypeHidden": {
+ "message": "מוסתר"
+ },
+ "cfTypeBoolean": {
+ "message": "אמת או שקר"
+ },
+ "popup2faCloseMessage": {
+ "message": "לחיצה מחוץ לחלונית הצפה שנפתחה בכדי לבדוק את פרטי האימות תגרום לחלונית שנפתחה, להסגר. האם ברצונך להציג את המידע בחלון שאינו נסגר?"
+ },
+ "popupU2fCloseMessage": {
+ "message": "דפדפן זה לא יכול לעבד בקשות U2F בחלון צף זה. האם ברצונך לפתוח את החלון הצף כחלון חדש רגיל כדי שתוכל להכנס באמצעות U2F?"
+ },
+ "disableFavicon": {
+ "message": "בטל אייקונים של האתר"
+ },
+ "disableFaviconDesc": {
+ "message": "יכולת הצג אייקונים-של-האתר מאפשרת הצגה של תמונה או אייקון מוכר ליד פרטי הכניסה שבכספת שלך."
+ },
+ "disableBadgeCounter": {
+ "message": "Disable Badge Counter"
+ },
+ "disableBadgeCounterDesc": {
+ "message": "Badge counter indicates how many logins you have for the current page in your vault."
+ },
+ "cardholderName": {
+ "message": "שם בעל הכרטיס"
+ },
+ "number": {
+ "message": "מספר"
+ },
+ "brand": {
+ "message": "מותג"
+ },
+ "expirationMonth": {
+ "message": "תוקף אשראי - חודש"
+ },
+ "expirationYear": {
+ "message": "תוקף אשראי - שנה"
+ },
+ "expiration": {
+ "message": "תוקף"
+ },
+ "january": {
+ "message": "ינואר"
+ },
+ "february": {
+ "message": "פברואר"
+ },
+ "march": {
+ "message": "מרץ"
+ },
+ "april": {
+ "message": "אפריל"
+ },
+ "may": {
+ "message": "מאי"
+ },
+ "june": {
+ "message": "יוני"
+ },
+ "july": {
+ "message": "יולי"
+ },
+ "august": {
+ "message": "אוגוסט"
+ },
+ "september": {
+ "message": "ספטמבר"
+ },
+ "october": {
+ "message": "אוקטובר"
+ },
+ "november": {
+ "message": "נובמבר"
+ },
+ "december": {
+ "message": "דצמבר"
+ },
+ "securityCode": {
+ "message": "קוד אבטחה"
+ },
+ "ex": {
+ "message": "לדוגמא"
+ },
+ "title": {
+ "message": "תואר"
+ },
+ "mr": {
+ "message": "מר"
+ },
+ "mrs": {
+ "message": "גברת"
+ },
+ "ms": {
+ "message": "העלמה"
+ },
+ "dr": {
+ "message": "דוקטור"
+ },
+ "firstName": {
+ "message": "שם פרטי"
+ },
+ "middleName": {
+ "message": "שם אמצעי"
+ },
+ "lastName": {
+ "message": "שם משפחה"
+ },
+ "identityName": {
+ "message": "שם זהות"
+ },
+ "company": {
+ "message": "חברה"
+ },
+ "ssn": {
+ "message": "מספר ביטוח לאומי"
+ },
+ "passportNumber": {
+ "message": "מספר דרכון"
+ },
+ "licenseNumber": {
+ "message": "מספר רשיון"
+ },
+ "email": {
+ "message": "אימייל"
+ },
+ "phone": {
+ "message": "טלפון"
+ },
+ "address": {
+ "message": "כתובת"
+ },
+ "address1": {
+ "message": "כתובת 1"
+ },
+ "address2": {
+ "message": "כתובת 2"
+ },
+ "address3": {
+ "message": "כתובת 3"
+ },
+ "cityTown": {
+ "message": "עיר \\ יישוב"
+ },
+ "stateProvince": {
+ "message": "מדינה \\ מחוז"
+ },
+ "zipPostalCode": {
+ "message": "מיקוד"
+ },
+ "country": {
+ "message": "מדינה"
+ },
+ "type": {
+ "message": "סוג"
+ },
+ "typeLogin": {
+ "message": "פרטי התחברות"
+ },
+ "typeLogins": {
+ "message": "פרטי התחברות"
+ },
+ "typeSecureNote": {
+ "message": "פתק מאובטח"
+ },
+ "typeCard": {
+ "message": "כרטיס"
+ },
+ "typeIdentity": {
+ "message": "זהות"
+ },
+ "passwordHistory": {
+ "message": "היסטוריית סיסמאות"
+ },
+ "back": {
+ "message": "הקודם"
+ },
+ "collections": {
+ "message": "אוספים"
+ },
+ "favorites": {
+ "message": "מועדפים"
+ },
+ "popOutNewWindow": {
+ "message": "פתח כחלון חדש"
+ },
+ "refresh": {
+ "message": "רענן"
+ },
+ "cards": {
+ "message": "כרטיסים"
+ },
+ "identities": {
+ "message": "זהויות"
+ },
+ "logins": {
+ "message": "פרטי התחברות"
+ },
+ "secureNotes": {
+ "message": "פתקים מאובטחים"
+ },
+ "clear": {
+ "message": "נקה",
+ "description": "To clear something out. example: To clear browser history."
+ },
+ "checkPassword": {
+ "message": "בדוק אם הסיסמה נחשפה."
+ },
+ "passwordExposed": {
+ "message": "סיסמה זו נחשפה $VALUE$ פעמים בפירצות אבטחה. עליך להחליף אותה.",
+ "placeholders": {
+ "value": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "passwordSafe": {
+ "message": "סיסמה זו לא נמצאה בפירצות אבטחה ידועות. ניתן להמשיך להשתמש בה בבטחה."
+ },
+ "baseDomain": {
+ "message": "שם בסיס הדומיין"
+ },
+ "host": {
+ "message": "שרת",
+ "description": "A URL's host value. For example, the host of https://sub.domain.com:443 is 'sub.domain.com:443'."
+ },
+ "exact": {
+ "message": "מדויק"
+ },
+ "startsWith": {
+ "message": "מתחיל עם"
+ },
+ "regEx": {
+ "message": "ביטוי רגולרי",
+ "description": "A programming term, also known as 'RegEx'."
+ },
+ "matchDetection": {
+ "message": "זיהוי התאמה",
+ "description": "URI match detection for auto-fill."
+ },
+ "defaultMatchDetection": {
+ "message": "ברירת מחדל לזיהוי התאמות",
+ "description": "Default URI match detection for auto-fill."
+ },
+ "toggleOptions": {
+ "message": "הצגה\\הסתרה של אפשרויות"
+ },
+ "toggleCurrentUris": {
+ "message": "שנה מצב הצגת כתובות URI",
+ "description": "Toggle the display of the URIs of the currently open tabs in the browser."
+ },
+ "currentUri": {
+ "message": "כתובת מלאה נוכחית",
+ "description": "The URI of one of the current open tabs in the browser."
+ },
+ "organization": {
+ "message": "ארגון",
+ "description": "An entity of multiple related people (ex. a team or business organization)."
+ },
+ "types": {
+ "message": "סוגים"
+ },
+ "allItems": {
+ "message": "כל הפריטים"
+ },
+ "noPasswordsInList": {
+ "message": "אין סיסמאות להצגה ברשימה."
+ },
+ "remove": {
+ "message": "הסר"
+ },
+ "default": {
+ "message": "ברירת מחדל"
+ },
+ "dateUpdated": {
+ "message": "עודכן",
+ "description": "ex. Date this item was updated"
+ },
+ "datePasswordUpdated": {
+ "message": "הסיסמה עודכנה",
+ "description": "ex. Date this password was updated"
+ },
+ "neverLockWarning": {
+ "message": "האם אתה בטוח שברצונך להשתמש באפשרות \"אף פעם לא\"? במצב זה הסיסמה לכספת שלך תשמר על המכשיר שלך. אם תשתמש באפשרות זו עליך לעשות הכל כדי לוודא כי המכשיר מאובטח כראוי."
+ },
+ "noOrganizationsList": {
+ "message": "אינך משויך לארגון. ניתן לשתף באופן מאובטח פריטים רק עם משתמשים אחרים בתוך ארגון."
+ },
+ "noCollectionsInList": {
+ "message": "אין אוספים להצגה ברשימה."
+ },
+ "ownership": {
+ "message": "בעלות"
+ },
+ "whoOwnsThisItem": {
+ "message": "מי הבעלים של פריט הזה?"
+ },
+ "strong": {
+ "message": "חזקה",
+ "description": "ex. A strong password. Scale: Weak -> Good -> Strong"
+ },
+ "good": {
+ "message": "טובה",
+ "description": "ex. A good password. Scale: Weak -> Good -> Strong"
+ },
+ "weak": {
+ "message": "חלשה",
+ "description": "ex. A weak password. Scale: Weak -> Good -> Strong"
+ },
+ "weakMasterPassword": {
+ "message": "סיסמה ראשית חלשה"
+ },
+ "weakMasterPasswordDesc": {
+ "message": "הסיסמה הראשית שבחרת חלשה מאוד. עליך לבחור סיסמה חזקה יותר (או להשתמש במשפט במקום מילה אחת) בכדי לאבטח את החשבון שלך. האם אתה בטוח שברצונך להשתמש בסיסמה ראשית זו?"
+ },
+ "pin": {
+ "message": "קוד PIN",
+ "description": "PIN code. Ex. The short code (often numeric) that you use to unlock a device."
+ },
+ "unlockWithPin": {
+ "message": "בטל נעילה עם קוד PIN"
+ },
+ "setYourPinCode": {
+ "message": "קבע קוד PIN לביטול נעילת Bitwarden. הגדרות הPIN יאופסו אם תבצע יציאה מהתוכנה."
+ },
+ "pinRequired": {
+ "message": "נדרש קוד PIN."
+ },
+ "invalidPin": {
+ "message": "קוד PIN לא תקין."
+ },
+ "verifyPin": {
+ "message": "אמת PIN"
+ },
+ "yourVaultIsLockedPinCode": {
+ "message": "הכספת שלך נעולה. הזן את קוד הPIN שלך כדי להמשיך."
+ },
+ "unlockWithBiometrics": {
+ "message": "פתח נעילה עם זיהוי ביומטרי"
+ },
+ "awaitDesktop": {
+ "message": "ממתין לאישור משולחן העבודה"
+ },
+ "awaitDesktopDesc": {
+ "message": "אנא אשר בעזרת אמצעים ביומטרים באפליקציית Bitwarden של שולחן העבודה בכדי לאפשר אמצעים ביומטריים בדפדפן."
+ },
+ "lockWithMasterPassOnRestart": {
+ "message": "נעל בעזרת הסיסמה הראשית בהפעלת הדפדפן מחדש"
+ },
+ "selectOneCollection": {
+ "message": "עליך לבחור לפחות אוסף אחד."
+ },
+ "cloneItem": {
+ "message": "שכפול פריט"
+ },
+ "clone": {
+ "message": "שכפול"
+ },
+ "passwordGeneratorPolicyInEffect": {
+ "message": "מדיניות ארגונית אחת או יותר משפיעה על הגדרות המחולל שלך."
+ },
+ "vaultTimeoutAction": {
+ "message": "פעולה לביצוע בכספת בתום זמן החיבור"
+ },
+ "lock": {
+ "message": "נעילה",
+ "description": "Verb form: to make secure or inaccesible by"
+ },
+ "trash": {
+ "message": "סל המחזור",
+ "description": "Noun: a special folder to hold deleted items"
+ },
+ "searchTrash": {
+ "message": "חפש בסל המחזור"
+ },
+ "permanentlyDeleteItem": {
+ "message": "מחק לצמיתות פריט שנבחר"
+ },
+ "permanentlyDeleteItemConfirmation": {
+ "message": "האם אתה בטוח שברצונך למחוק את הפריט הזה?"
+ },
+ "permanentlyDeletedItem": {
+ "message": "פריט שנמחק לצמיתות"
+ },
+ "restoreItem": {
+ "message": "שחזר פריט"
+ },
+ "restoreItemConfirmation": {
+ "message": "האם אתה בטוח שברצונך לשחזר פריט זה?"
+ },
+ "restoredItem": {
+ "message": "פריט ששוחזר"
+ },
+ "vaultTimeoutLogOutConfirmation": {
+ "message": "יציאה מהחשבון תסיר את כל הגישה לכספת ויידרש אימות מקוון לאחר משך הזמן שהוקצב. האם אתה בטוח שברצונך להשתמש בהגדרה זו?"
+ },
+ "vaultTimeoutLogOutConfirmationTitle": {
+ "message": "אישור פעולת אימות לאחר חוסר פעילות"
+ },
+ "autoFillAndSave": {
+ "message": "בצע השלמה אוטומטית ושמור"
+ },
+ "autoFillSuccessAndSavedUri": {
+ "message": "בוצעה השלמה אוטומטית והכתובת נשמרה"
+ },
+ "autoFillSuccess": {
+ "message": "בוצעה השלמה אוטומטית"
+ },
+ "setMasterPassword": {
+ "message": "הגדר סיסמה ראשית"
+ },
+ "masterPasswordPolicyInEffect": {
+ "message": "אחד או יותר מאילוצי המדיניות של הארגון דורשים שהסיסמה הראשית שלך תעמוד בדרישות הבאות:"
+ },
+ "policyInEffectMinComplexity": {
+ "message": "ניקוד מורכבות הסיסמה צריך להיות לפחות {0}",
+ "placeholders": {
+ "score": {
+ "content": "$1",
+ "example": "4"
+ }
+ }
+ },
+ "policyInEffectMinLength": {
+ "message": "אורך מינימלי של $LENGTH$",
+ "placeholders": {
+ "length": {
+ "content": "$1",
+ "example": "14"
+ }
+ }
+ },
+ "policyInEffectUppercase": {
+ "message": "מכילה אות גדולה אחת או יותר"
+ },
+ "policyInEffectLowercase": {
+ "message": "מכילה אות קטנה אחת או יותר"
+ },
+ "policyInEffectNumbers": {
+ "message": "מכילה ספרה אחת או יותר"
+ },
+ "policyInEffectSpecial": {
+ "message": "מכילה תו אחד או יותר מהתווים הבאים: {0}",
+ "placeholders": {
+ "chars": {
+ "content": "$1",
+ "example": "!@#$%^&*"
+ }
+ }
+ },
+ "masterPasswordPolicyRequirementsNotMet": {
+ "message": "הסיסמה הראשית החדשה השלך לא עומדת בדרישות המדיניות."
+ },
+ "acceptPolicies": {
+ "message": "סימון תיבה זו מהווה את הסכמתך לתנאים הבאים:"
+ },
+ "acceptPoliciesError": {
+ "message": "תנאי השירות ומדיניות הפרטיות לא אושרו."
+ },
+ "termsOfService": {
+ "message": "תנאי השירות"
+ },
+ "privacyPolicy": {
+ "message": "מדיניות הפרטיות"
+ },
+ "hintEqualsPassword": {
+ "message": "רמז הסיסמה שלך לא יכול להיות זהה לסיסמה שלך."
+ },
+ "ok": {
+ "message": "אישור"
+ },
+ "desktopSyncVerificationTitle": {
+ "message": "אימות סנכרון מול שולחן העבודה"
+ },
+ "desktopIntegrationVerificationText": {
+ "message": "אנא ודא כי אפליקציית שולחן העבודה שלך מציגה את טביעת האצבע הזו: "
+ },
+ "desktopIntegrationDisabledTitle": {
+ "message": "אינטגרציית הדפדפן לא מופעלת"
+ },
+ "desktopIntegrationDisabledDesc": {
+ "message": "אינטגרציית הדפדפן לא מופעלת באפליקציית Bitwarden בשולחן העבודה. אנא אפשר זאת בהגדרות האפליקציה."
+ },
+ "startDesktopTitle": {
+ "message": "הפעל את אפליקציית Bitwarden בשולחן העבודה"
+ },
+ "startDesktopDesc": {
+ "message": "יש להפעיל את אפליקציית Bitwarden בשולחן העבודה בכדי להשתמש בפונקציה זו."
+ },
+ "errorEnableBiometricTitle": {
+ "message": "לא ניתן להפעיל זיהוי ביומטרי"
+ },
+ "errorEnableBiometricDesc": {
+ "message": "הפעולה בוטלה על ידי אפליקציית שולחן העבודה"
+ },
+ "nativeMessagingInvalidEncryptionDesc": {
+ "message": "אפליקציית שולחן העבודה דחתה את ערוץ התקשורת המאובטח. אנא נסה שנית."
+ },
+ "nativeMessagingInvalidEncryptionTitle": {
+ "message": "התקשורת מול אפליקציית שולחן העבודה נקטעה"
+ },
+ "nativeMessagingWrongUserDesc": {
+ "message": "המשתמש המחובר לאפליקציית שולחן העבודה שונה מהמשתמש המחובר לאפליקציה בדפדפן. אנא ודא כי אותו משתמש מחובר לשתי האפליקציות."
+ },
+ "nativeMessagingWrongUserTitle": {
+ "message": "חוסר התאמה בין חשבונות"
+ },
+ "biometricsNotEnabledTitle": {
+ "message": "אמצעי זיהוי ביומטרים לא מאופשרים"
+ },
+ "biometricsNotEnabledDesc": {
+ "message": "בכדי להשתמש באמצעים ביומטרים בדפדפן יש לאפשר תכונה זו באפליקציה בשולחן העבודה."
+ },
+ "biometricsNotSupportedTitle": {
+ "message": "אמצעי זיהוי ביומטרים לא נתמכים"
+ },
+ "biometricsNotSupportedDesc": {
+ "message": "מכשיר זה לא תומך בזיהוי ביומטרי בדפדפן."
+ },
+ "nativeMessaginPermissionErrorTitle": {
+ "message": "הרשאה לא סופקה"
+ },
+ "nativeMessaginPermissionErrorDesc": {
+ "message": "ללא הרשאות לתקשר עם אפליקציית שולחן העבודה אין באפשרותנו לספק תמיכה באמצעים ביומטריים בדפדפן. אנא נסה שוב."
+ },
+ "nativeMessaginPermissionSidebarTitle": {
+ "message": "Permission request error"
+ },
+ "nativeMessaginPermissionSidebarDesc": {
+ "message": "This action cannot be done in the sidebar, please retry the action in the popup or popout."
+ },
+ "personalOwnershipSubmitError": {
+ "message": "מדיניות הארגון מונעת ממך לשמור פריטים בכספת האישית. שנה את אפשרות הבעלות לארגוניות ובחר מתוך האוספים הזמינים."
+ },
+ "personalOwnershipPolicyInEffect": {
+ "message": "מדיניות ארגונית משפיעה על אפשרויות הבעלות שלך."
+ },
+ "excludedDomains": {
+ "message": "Excluded Domains"
+ },
+ "excludedDomainsDesc": {
+ "message": "Bitwarden will not ask to save login details for these domains. You must refresh the page for changes to take effect."
+ },
+ "excludedDomainsInvalidDomain": {
+ "message": "$DOMAIN$ is not a valid domain",
+ "placeholders": {
+ "domain": {
+ "content": "$1",
+ "example": "googlecom"
+ }
+ }
+ },
+ "send": {
+ "message": "Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "searchSends": {
+ "message": "Search Sends",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "addSend": {
+ "message": "Add Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTypeText": {
+ "message": "Text"
+ },
+ "sendTypeFile": {
+ "message": "File"
+ },
+ "allSends": {
+ "message": "All Sends",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "maxAccessCountReached": {
+ "message": "Max access count reached"
+ },
+ "expired": {
+ "message": "Expired"
+ },
+ "pendingDeletion": {
+ "message": "Pending deletion"
+ },
+ "passwordProtected": {
+ "message": "Password protected"
+ },
+ "copySendLink": {
+ "message": "Copy Send link",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "removePassword": {
+ "message": "Remove Password"
+ },
+ "delete": {
+ "message": "Delete"
+ },
+ "removedPassword": {
+ "message": "Removed Password"
+ },
+ "deletedSend": {
+ "message": "Deleted Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendLink": {
+ "message": "Send link",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "disabled": {
+ "message": "Disabled"
+ },
+ "removePasswordConfirmation": {
+ "message": "Are you sure you want to remove the password?"
+ },
+ "deleteSend": {
+ "message": "Delete Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "deleteSendConfirmation": {
+ "message": "Are you sure you want to delete this Send?",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "editSend": {
+ "message": "Edit Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTypeHeader": {
+ "message": "What type of Send is this?",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendNameDesc": {
+ "message": "A friendly name to describe this Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendFileDesc": {
+ "message": "The file you want to send."
+ },
+ "deletionDate": {
+ "message": "Deletion Date"
+ },
+ "deletionDateDesc": {
+ "message": "The Send will be permanently deleted on the specified date and time.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "expirationDate": {
+ "message": "Expiration Date"
+ },
+ "expirationDateDesc": {
+ "message": "If set, access to this Send will expire on the specified date and time.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "oneDay": {
+ "message": "1 day"
+ },
+ "days": {
+ "message": "$DAYS$ days",
+ "placeholders": {
+ "days": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "custom": {
+ "message": "Custom"
+ },
+ "maximumAccessCount": {
+ "message": "Maximum Access Count"
+ },
+ "maximumAccessCountDesc": {
+ "message": "If set, users will no longer be able to access this Send once the maximum access count is reached.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendPasswordDesc": {
+ "message": "Optionally require a password for users to access this Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendNotesDesc": {
+ "message": "Private notes about this Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendDisableDesc": {
+ "message": "Disable this Send so that no one can access it.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendShareDesc": {
+ "message": "Copy this Send's link to clipboard upon save.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTextDesc": {
+ "message": "The text you want to send."
+ },
+ "sendHideText": {
+ "message": "Hide this Send's text by default.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "currentAccessCount": {
+ "message": "Current Access Count"
+ },
+ "createSend": {
+ "message": "Create New Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "newPassword": {
+ "message": "New Password"
+ },
+ "sendDisabled": {
+ "message": "Send Disabled",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendDisabledWarning": {
+ "message": "Due to an enterprise policy, you are only able to delete an existing Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "createdSend": {
+ "message": "Created Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "editedSend": {
+ "message": "Edited Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendLinuxChromiumFileWarning": {
+ "message": "In order to choose a file, open the extension in the sidebar (if possible) or pop out to a new window by clicking this banner."
+ },
+ "sendFirefoxFileWarning": {
+ "message": "In order to choose a file using Firefox, open the extension in the sidebar or pop out to a new window by clicking this banner."
+ },
+ "sendSafariFileWarning": {
+ "message": "In order to choose a file using Safari, pop out to a new window by clicking this banner."
+ },
+ "sendFileCalloutHeader": {
+ "message": "Before you start"
+ },
+ "sendFirefoxCustomDatePopoutMessage1": {
+ "message": "To use a calendar style date picker",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read '**To use a calendar style date picker ** click here to pop out your window.'"
+ },
+ "sendFirefoxCustomDatePopoutMessage2": {
+ "message": "click here",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker **click here** to pop out your window.'"
+ },
+ "sendFirefoxCustomDatePopoutMessage3": {
+ "message": "to pop out your window.",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker click here **to pop out your window.**'"
+ },
+ "expirationDateIsInvalid": {
+ "message": "The expiration date provided is not valid."
+ },
+ "deletionDateIsInvalid": {
+ "message": "The deletion date provided is not valid."
+ },
+ "expirationDateAndTimeRequired": {
+ "message": "An expiration date and time are required."
+ },
+ "deletionDateAndTimeRequired": {
+ "message": "A deletion date and time are required."
+ },
+ "dateParsingError": {
+ "message": "There was an error saving your deletion and expiration dates."
+ },
+ "hideEmail": {
+ "message": "Hide my email address from recipients."
+ },
+ "sendOptionsPolicyInEffect": {
+ "message": "One or more organization policies are affecting your Send options."
+ },
+ "passwordPrompt": {
+ "message": "Master password re-prompt"
+ },
+ "passwordConfirmation": {
+ "message": "Master password confirmation"
+ },
+ "passwordConfirmationDesc": {
+ "message": "This action is protected. To continue, please re-enter your master password to verify your identity."
+ },
+ "emailVerificationRequired": {
+ "message": "Email Verification Required"
+ },
+ "emailVerificationRequiredDesc": {
+ "message": "You must verify your email to use this feature. You can verify your email in the web vault."
+ },
+ "updatedMasterPassword": {
+ "message": "Updated Master Password"
+ },
+ "updateMasterPassword": {
+ "message": "Update Master Password"
+ },
+ "updateMasterPasswordWarning": {
+ "message": "Your Master Password was recently changed by an administrator in your organization. In order to access the vault, you must update it now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour."
+ },
+ "resetPasswordPolicyAutoEnroll": {
+ "message": "Automatic Enrollment"
+ },
+ "resetPasswordAutoEnrollInviteWarning": {
+ "message": "This organization has an enterprise policy that will automatically enroll you in password reset. Enrollment will allow organization administrators to change your master password."
+ },
+ "selectFolder": {
+ "message": "Select folder..."
+ },
+ "ssoCompleteRegistration": {
+ "message": "In order to complete logging in with SSO, please set a master password to access and protect your vault."
+ },
+ "hours": {
+ "message": "Hours"
+ },
+ "minutes": {
+ "message": "Minutes"
+ },
+ "vaultTimeoutPolicyInEffect": {
+ "message": "Your organization policies are affecting your vault timeout. Maximum allowed Vault Timeout is $HOURS$ hour(s) and $MINUTES$ minute(s)",
+ "placeholders": {
+ "hours": {
+ "content": "$1",
+ "example": "5"
+ },
+ "minutes": {
+ "content": "$2",
+ "example": "5"
+ }
+ }
+ },
+ "vaultTimeoutToLarge": {
+ "message": "Your vault timeout exceeds the restrictions set by your organization."
+ },
+ "vaultExportDisabled": {
+ "message": "Vault Export Disabled"
+ },
+ "personalVaultExportPolicyInEffect": {
+ "message": "One or more organization policies prevents you from exporting your personal vault."
+ },
+ "copyCustomFieldNameInvalidElement": {
+ "message": "Unable to identify a valid form element. Try inspecting the HTML instead."
+ },
+ "copyCustomFieldNameNotUnique": {
+ "message": "No unique identifier found."
+ }
+}
diff --git a/src/iOS.Safari/Resources/_locales/hi/messages.json b/src/iOS.Safari/Resources/_locales/hi/messages.json
new file mode 100644
index 000000000..d3c5492d2
--- /dev/null
+++ b/src/iOS.Safari/Resources/_locales/hi/messages.json
@@ -0,0 +1,1817 @@
+{
+ "appName": {
+ "message": "bitwarden"
+ },
+ "extName": {
+ "message": "Bitwarden",
+ "description": "Extension name, MUST be less than 40 characters (Safari restriction)"
+ },
+ "extDesc": {
+ "message": "bitwarden is a secure and free password manager for all of your devices.",
+ "description": "Extension description"
+ },
+ "loginOrCreateNewAccount": {
+ "message": "अपनी सुरक्षित तिजोरी में प्रवेश करने के लिए नया खाता बनाएं या लॉग इन करें।"
+ },
+ "createAccount": {
+ "message": "Create Account"
+ },
+ "login": {
+ "message": "Log In"
+ },
+ "enterpriseSingleSignOn": {
+ "message": "उद्यम एकल साइन-ऑन"
+ },
+ "cancel": {
+ "message": "रद्द करें"
+ },
+ "close": {
+ "message": "बंद करें"
+ },
+ "submit": {
+ "message": "जमा करें"
+ },
+ "emailAddress": {
+ "message": "Email Address"
+ },
+ "masterPass": {
+ "message": "Master Password"
+ },
+ "masterPassDesc": {
+ "message": "मास्टर पासवर्ड वह पासवर्ड है जो तिजोरी में प्रवेश के लिए प्रयोग होता है। आप मास्टर पासवर्ड ना भूले, यह अतिआवश्यक है। भूलने की अवस्था में पासवर्ड को दोबारा पाना संभव नहीं होगा।"
+ },
+ "masterPassHintDesc": {
+ "message": "मास्टर पासवर्ड संकेत आपको भूल जाने की अवस्था में पासवर्ड को याद करने में सहायता करता है।"
+ },
+ "reTypeMasterPass": {
+ "message": "Re-type Master Password"
+ },
+ "masterPassHint": {
+ "message": "Master Password Hint (optional)"
+ },
+ "tab": {
+ "message": "टैब"
+ },
+ "myVault": {
+ "message": "My Vault"
+ },
+ "tools": {
+ "message": "उपकरण"
+ },
+ "settings": {
+ "message": "सेटिंग्स"
+ },
+ "currentTab": {
+ "message": "Current Tab"
+ },
+ "copyPassword": {
+ "message": "Copy Password"
+ },
+ "copyNote": {
+ "message": "Copy Note"
+ },
+ "copyUri": {
+ "message": "URI को कॉपी करें"
+ },
+ "copyUsername": {
+ "message": "Copy Username"
+ },
+ "copyNumber": {
+ "message": "Copy Number"
+ },
+ "copySecurityCode": {
+ "message": "Copy Security Code"
+ },
+ "autoFill": {
+ "message": "स्वत:भरण"
+ },
+ "generatePasswordCopied": {
+ "message": "Generate Password (copied)"
+ },
+ "copyElementIdentifier": {
+ "message": "Copy Custom Field Name"
+ },
+ "noMatchingLogins": {
+ "message": "कोई मेल-मिला लॉगिन नहीं |"
+ },
+ "vaultLocked": {
+ "message": "तिजोरी बंद है |"
+ },
+ "vaultLoggedOut": {
+ "message": "तिजोरी को लॉग आउट किया गया ।"
+ },
+ "autoFillInfo": {
+ "message": "इस ब्राउज़र टैब के लिए स्वत: भरण लॉगिन उपलब्ध नहीं है।"
+ },
+ "addLogin": {
+ "message": "Add a Login"
+ },
+ "addItem": {
+ "message": "Add Item"
+ },
+ "passwordHint": {
+ "message": "Password Hint"
+ },
+ "enterEmailToGetHint": {
+ "message": "अपने मास्टर पासवर्ड संकेत प्राप्त करने के लिए अपने खाते का ईमेल पता दर्ज करें।"
+ },
+ "getMasterPasswordHint": {
+ "message": "मास्टर पासवर्ड संकेत प्राप्त करें"
+ },
+ "continue": {
+ "message": "जारी रखें"
+ },
+ "verificationCode": {
+ "message": "Verification Code"
+ },
+ "account": {
+ "message": "खाता"
+ },
+ "changeMasterPassword": {
+ "message": "Change Master Password"
+ },
+ "fingerprintPhrase": {
+ "message": "Fingerprint Phrase",
+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
+ },
+ "yourAccountsFingerprint": {
+ "message": "आपके खाते का फिंगरप्रिंट वाक्यांश",
+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
+ },
+ "twoStepLogin": {
+ "message": "Two-step Login"
+ },
+ "logOut": {
+ "message": "Log Out"
+ },
+ "about": {
+ "message": "जानकारी"
+ },
+ "version": {
+ "message": "संस्करण"
+ },
+ "save": {
+ "message": "सेव करें"
+ },
+ "move": {
+ "message": "ले जाएं"
+ },
+ "addFolder": {
+ "message": "Add Folder"
+ },
+ "name": {
+ "message": "नाम"
+ },
+ "editFolder": {
+ "message": "Edit Folder"
+ },
+ "deleteFolder": {
+ "message": "Delete Folder"
+ },
+ "folders": {
+ "message": "फ़ोल्डर्स"
+ },
+ "noFolders": {
+ "message": "सूचीबद्ध करने के लिए कोई फ़ोल्डर नहीं हैं।"
+ },
+ "helpFeedback": {
+ "message": "Help & Feedback"
+ },
+ "sync": {
+ "message": "सिंक"
+ },
+ "syncVaultNow": {
+ "message": "Sync Vault Now"
+ },
+ "lastSync": {
+ "message": "Last Sync:"
+ },
+ "passGen": {
+ "message": "Password Generator"
+ },
+ "generator": {
+ "message": "उत्पन्न करें!",
+ "description": "Short for 'Password Generator'."
+ },
+ "passGenInfo": {
+ "message": "स्वचालित रूप से अपने लॉगिन के लिए मजबूत, अद्वितीय पासवर्ड उत्पन्न करते हैं।"
+ },
+ "bitWebVault": {
+ "message": "bitwarden Web Vault"
+ },
+ "importItems": {
+ "message": "Import Items"
+ },
+ "select": {
+ "message": "चयन करें"
+ },
+ "generatePassword": {
+ "message": "Generate Password"
+ },
+ "regeneratePassword": {
+ "message": "Regenerate Password"
+ },
+ "options": {
+ "message": "विकल्प"
+ },
+ "length": {
+ "message": "लंबाई"
+ },
+ "numWords": {
+ "message": "Number of Words"
+ },
+ "wordSeparator": {
+ "message": "Word Separator"
+ },
+ "capitalize": {
+ "message": "कैपिटलाइज़ करें",
+ "description": "Make the first letter of a work uppercase."
+ },
+ "includeNumber": {
+ "message": "नंबर शामिल करें"
+ },
+ "minNumbers": {
+ "message": "Minimum Numbers"
+ },
+ "minSpecial": {
+ "message": "Minimum Special"
+ },
+ "avoidAmbChar": {
+ "message": "Avoid Ambiguous Characters"
+ },
+ "searchVault": {
+ "message": "वॉल्ट खोजे"
+ },
+ "edit": {
+ "message": "संपादन करें"
+ },
+ "view": {
+ "message": "देखें"
+ },
+ "noItemsInList": {
+ "message": "सूचीबद्ध करने के लिए कोई आइटम नहीं हैं।"
+ },
+ "itemInformation": {
+ "message": "Item Information"
+ },
+ "username": {
+ "message": "उपयोगकर्ता नाम"
+ },
+ "password": {
+ "message": "पासवर्ड"
+ },
+ "passphrase": {
+ "message": "पासफ़्रेज़"
+ },
+ "favorite": {
+ "message": "Favorite"
+ },
+ "notes": {
+ "message": "नोट्स"
+ },
+ "note": {
+ "message": "नोट:"
+ },
+ "editItem": {
+ "message": "Edit Item"
+ },
+ "folder": {
+ "message": "फ़ोल्डर"
+ },
+ "deleteItem": {
+ "message": "Delete Item"
+ },
+ "viewItem": {
+ "message": "View Item"
+ },
+ "launch": {
+ "message": "खोलें"
+ },
+ "website": {
+ "message": "वेबसाइट"
+ },
+ "toggleVisibility": {
+ "message": "Toggle Visibility"
+ },
+ "manage": {
+ "message": "प्रबंधित करना"
+ },
+ "other": {
+ "message": "अन्य"
+ },
+ "rateExtension": {
+ "message": "Rate the Extension"
+ },
+ "rateExtensionDesc": {
+ "message": "कृपया एक अच्छी समीक्षा के साथ हमारी मदत करने पर विचार करें!"
+ },
+ "browserNotSupportClipboard": {
+ "message": "आपका वेब ब्राउज़र आसान क्लिपबोर्ड कॉपीिंग का समर्थन नहीं करता है। इसके बजाय इसे मैन्युअल रूप से कॉपी करें।"
+ },
+ "verifyMasterPassword": {
+ "message": "Verify Master Password"
+ },
+ "yourVaultIsLocked": {
+ "message": "आपकी वॉल्ट लॉक हो गई है। जारी रखने के लिए अपने मास्टर पासवर्ड को सत्यापित करें।"
+ },
+ "unlock": {
+ "message": "ताला खोलें"
+ },
+ "loggedInAsOn": {
+ "message": "पर के रूप में लॉग इन किया ।",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "name@example.com"
+ },
+ "hostname": {
+ "content": "$2",
+ "example": "bitwarden.com"
+ }
+ }
+ },
+ "invalidMasterPassword": {
+ "message": "अमान्य मास्टर पासवर्ड"
+ },
+ "vaultTimeout": {
+ "message": "वॉल्ट मध्यांतर"
+ },
+ "lockNow": {
+ "message": "Lock Now"
+ },
+ "immediately": {
+ "message": "तत्काल"
+ },
+ "tenSeconds": {
+ "message": "10 सेकंड"
+ },
+ "twentySeconds": {
+ "message": "20 सेकंड"
+ },
+ "thirtySeconds": {
+ "message": "30 सेकंड"
+ },
+ "oneMinute": {
+ "message": "1 मिनट"
+ },
+ "twoMinutes": {
+ "message": "2 मिनट"
+ },
+ "fiveMinutes": {
+ "message": "5 मिनट"
+ },
+ "fifteenMinutes": {
+ "message": "15 मिनट"
+ },
+ "thirtyMinutes": {
+ "message": "30 मिनट"
+ },
+ "oneHour": {
+ "message": "1 घंटा"
+ },
+ "fourHours": {
+ "message": "4 घंटे"
+ },
+ "onLocked": {
+ "message": "On Locked"
+ },
+ "onRestart": {
+ "message": "On Restart"
+ },
+ "never": {
+ "message": "कभी नहीं"
+ },
+ "security": {
+ "message": "सुरक्षा"
+ },
+ "errorOccurred": {
+ "message": "कोई ग़लती हुई।"
+ },
+ "emailRequired": {
+ "message": "ई-मेल पते की आवश्यकता है।"
+ },
+ "invalidEmail": {
+ "message": "अमान्य ई-मेल |"
+ },
+ "masterPassRequired": {
+ "message": "मास्टर पासवर्ड की आवश्यकता है।"
+ },
+ "masterPassLength": {
+ "message": "मास्टर पासवर्ड कम से कम 8 अक्षर लंबे होने चाहिए।"
+ },
+ "masterPassDoesntMatch": {
+ "message": "मास्टर पासवर्ड पुष्टि मेल नहीं खाती है।"
+ },
+ "newAccountCreated": {
+ "message": "आपका नया खाता बनाया गया है! अब आप लॉग इन कर सकते हैं।"
+ },
+ "masterPassSent": {
+ "message": "हमने आपको अपने मास्टर पासवर्ड संकेत के साथ एक ईमेल भेजा है।"
+ },
+ "verificationCodeRequired": {
+ "message": "सत्यापन टोकन आवश्यक है"
+ },
+ "valueCopied": {
+ "message": " copied",
+ "description": "Value has been copied to the clipboard.",
+ "placeholders": {
+ "value": {
+ "content": "$1",
+ "example": "Password"
+ }
+ }
+ },
+ "autofillError": {
+ "message": "Unable to auto-fill the selected login on this page. Copy/paste your username and/or password instead."
+ },
+ "loggedOut": {
+ "message": "लॉग आउट"
+ },
+ "loginExpired": {
+ "message": "अपने लॉगिन सत्र समाप्त हो गया है।"
+ },
+ "logOutConfirmation": {
+ "message": "क्या आप वाकई लॉग आउट करना चाहते हैं?"
+ },
+ "yes": {
+ "message": "हाँ"
+ },
+ "no": {
+ "message": "नहीं"
+ },
+ "unexpectedError": {
+ "message": "An unexpected error has occured."
+ },
+ "nameRequired": {
+ "message": "नाम आवश्यक है"
+ },
+ "addedFolder": {
+ "message": "जोड़ा गया फ़ोल्डर"
+ },
+ "changeMasterPass": {
+ "message": "Change Master Password"
+ },
+ "changeMasterPasswordConfirmation": {
+ "message": "आप वेब वॉल्ट bitwarden.com पर अपना मास्टर पासवर्ड बदल सकते हैं।क्या आप अब वेबसाइट पर जाना चाहते हैं?"
+ },
+ "twoStepLoginConfirmation": {
+ "message": "Two-step login makes your account more secure by requiring you to enter a security code from an authenticator app whenever you log in. Two-step login can be enabled on the bitwarden.com web vault. Do you want to visit the website now?"
+ },
+ "editedFolder": {
+ "message": "Edited Folder"
+ },
+ "deleteFolderConfirmation": {
+ "message": "क्या आप वाकई इस फ़ोल्डर को हटाना चाहते हैं?"
+ },
+ "deletedFolder": {
+ "message": "हटाए गए फ़ोल्डर"
+ },
+ "gettingStartedTutorial": {
+ "message": "Getting Started Tutorial"
+ },
+ "gettingStartedTutorialVideo": {
+ "message": "ब्राउज़र एक्सटेंशन का सबसे अधिक जानने के लिए हमारे शुरू ट्यूटोरियल देखें।"
+ },
+ "syncingComplete": {
+ "message": "सिंकिंग पूर्ण"
+ },
+ "syncingFailed": {
+ "message": "सिंकिंग असफल।"
+ },
+ "passwordCopied": {
+ "message": "कूटशब्द की नकल हुइ"
+ },
+ "uri": {
+ "message": "यूआरआइ"
+ },
+ "uriPosition": {
+ "message": "URI $POSITION$",
+ "description": "A listing of URIs. Ex: URI 1, URI 2, URI 3, etc.",
+ "placeholders": {
+ "position": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "newUri": {
+ "message": "नया URI"
+ },
+ "addedItem": {
+ "message": "जोड़ा गया आइटम"
+ },
+ "editedItem": {
+ "message": "संपादित आइटम "
+ },
+ "deleteItemConfirmation": {
+ "message": "क्या आप वास्तव में थ्रैश में भेजना चाहते हैं?"
+ },
+ "deletedItem": {
+ "message": "थ्रैश में भेजे"
+ },
+ "overwritePassword": {
+ "message": "Overwrite Password"
+ },
+ "overwritePasswordConfirmation": {
+ "message": "क्या आप सुनिश्चित हैं कि आप वर्तमान पासवर्ड को ओवरराइट करना चाहते हैं?"
+ },
+ "searchFolder": {
+ "message": "फोल्डर में खोजें"
+ },
+ "searchCollection": {
+ "message": "श्रेणी खोजें"
+ },
+ "searchType": {
+ "message": "तलाश की विधि"
+ },
+ "noneFolder": {
+ "message": "No Folder",
+ "description": "This is the folder for uncategorized items"
+ },
+ "disableAddLoginNotification": {
+ "message": "Disable Add Login Notification"
+ },
+ "addLoginNotificationDesc": {
+ "message": "The \"Add Login Notification\" automatically prompts you to save new logins to your vault whenever you log into them for the first time."
+ },
+ "dontShowCardsCurrentTab": {
+ "message": "Don't Show Cards on Tab Page"
+ },
+ "dontShowCardsCurrentTabDesc": {
+ "message": "Card items from your vault are listed on the 'Current Tab' page for easy auto-fill access."
+ },
+ "dontShowIdentitiesCurrentTab": {
+ "message": "Don't Show Identities on Tab Page"
+ },
+ "dontShowIdentitiesCurrentTabDesc": {
+ "message": "Identity items from your vault are listed on the 'Current Tab' page for easy auto-fill access."
+ },
+ "clearClipboard": {
+ "message": "क्लिपबोर्ड खाली करें",
+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
+ },
+ "clearClipboardDesc": {
+ "message": "स्वचालित रूप से अपने क्लिपबोर्ड से कॉपी की गई मानों को साफ़ करें।",
+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
+ },
+ "notificationAddDesc": {
+ "message": "Should bitwarden remember this password for you?"
+ },
+ "notificationAddSave": {
+ "message": "Yes, Save Now"
+ },
+ "notificationNeverSave": {
+ "message": "इस वेबसाइट के लिए कभी नहीं"
+ },
+ "disableChangedPasswordNotification": {
+ "message": "Disable Changed Password Notification"
+ },
+ "disableChangedPasswordNotificationDesc": {
+ "message": "The \"Changed Password Notification\" automatically prompts you to update a login's password in your vault whenever it detects that you have changed it on a website."
+ },
+ "notificationChangeDesc": {
+ "message": "क्या आप बिटवर्डन में इस पासवर्ड को अपडेट करना चाहते हैं?"
+ },
+ "notificationChangeSave": {
+ "message": "Yes, Update Now"
+ },
+ "disableContextMenuItem": {
+ "message": "Disable Context Menu Options"
+ },
+ "disableContextMenuItemDesc": {
+ "message": "संदर्भ मेनू विकल्प आपके वर्तमान टैब में वेबसाइट के लिए पासवर्ड जनरेशन और लॉगिन तक त्वरित पहुंच प्रदान करते हैं।"
+ },
+ "defaultUriMatchDetection": {
+ "message": "डिफॉल्ट URI मैच डिटेक्शन",
+ "description": "Default URI match detection for auto-fill."
+ },
+ "defaultUriMatchDetectionDesc": {
+ "message": "ऑटो-फिल जैसे कार्यों को करते समय लॉगिन के लिए URI मैच डिटेक्शन को संभाले जाने का डिफ़ॉल्ट तरीका चुनें। "
+ },
+ "theme": {
+ "message": "थीम"
+ },
+ "themeDesc": {
+ "message": "Change the application's color theme."
+ },
+ "dark": {
+ "message": "अंधेरा",
+ "description": "Dark color"
+ },
+ "light": {
+ "message": "प्रकाश",
+ "description": "Light color"
+ },
+ "solarizedDark": {
+ "message": "सौरीकृत अंधेरा",
+ "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated."
+ },
+ "exportVault": {
+ "message": "Export Vault"
+ },
+ "fileFormat": {
+ "message": "File Format"
+ },
+ "warning": {
+ "message": "चेतावनी",
+ "description": "WARNING (should stay in capitalized letters if the language permits)"
+ },
+ "confirmVaultExport": {
+ "message": "वॉल्ट निर्यात की पुष्टि करें"
+ },
+ "exportWarningDesc": {
+ "message": "This export contains your vault data in an unencrypted format. You should not store or send the exported file over unsecure channels (such as email). Delete it immediately after you are done using it."
+ },
+ "encExportKeyWarningDesc": {
+ "message": "यह आपके खाते की एन्क्रिप्शन कुंजी का उपयोग करके आपके डेटा को एन्क्रिप्ट करता है।यदि आप कभी भी अपने खाते की एन्क्रिप्शन कुंजी को खोते हैं तो आपको फिर से निर्यात करना चाहिए क्योंकि आप इस निर्यात फ़ाइल को डिक्रिप्ट करने में सक्षम नहीं होंगे।"
+ },
+ "encExportAccountWarningDesc": {
+ "message": "खाता एन्क्रिप्शन कुंजी प्रत्येक बिटवर्डन उपयोगकर्ता खाते के लिए अद्वितीय हैं, इसलिए आप एन्क्रिप्टेड निर्यात को किसी अन्य खाते में आयात नहीं कर सकते हैं।"
+ },
+ "exportMasterPassword": {
+ "message": "अपने वॉल्ट डेटा को निर्यात करने के लिए अपना मास्टर पासवर्ड दर्ज करें।"
+ },
+ "shared": {
+ "message": "साझा किया गया"
+ },
+ "learnOrg": {
+ "message": "संगठनों के बारे में जानें"
+ },
+ "learnOrgConfirmation": {
+ "message": "बिटवर्डन आपको एक संगठन का उपयोग करके अपनी तिजोरी वस्तुओं को दूसरों के साथ साझा करने की अनुमति देता है।क्या आप अधिक जानने के लिए bitwarden.com वेबसाइट पर जाना चाहेंगे?"
+ },
+ "moveToOrganization": {
+ "message": "संगठन में ले जाएँ"
+ },
+ "share": {
+ "message": "शेयर करें"
+ },
+ "movedItemToOrg": {
+ "message": "$ITEMNAME$ $ORGNAME$ गया ",
+ "placeholders": {
+ "itemname": {
+ "content": "$1",
+ "example": "Secret Item"
+ },
+ "orgname": {
+ "content": "$2",
+ "example": "Company Name"
+ }
+ }
+ },
+ "moveToOrgDesc": {
+ "message": "एक संगठन चुनें जिसे आप इस आइटम को स्थानांतरित करना चाहते हैं।किसी संगठन में जाने से उस संगठन को आइटम का स्वामित्व हस्तांतरित होता है।एक बार इसे स्थानांतरित करने के बाद आप अब इस आइटम के प्रत्यक्ष स्वामी नहीं होंगे।"
+ },
+ "learnMore": {
+ "message": "अधिक जानें"
+ },
+ "authenticatorKeyTotp": {
+ "message": "Authenticator Key (TOTP)"
+ },
+ "verificationCodeTotp": {
+ "message": "Verification Code (TOTP)"
+ },
+ "copyVerificationCode": {
+ "message": "Copy Verification Code"
+ },
+ "attachments": {
+ "message": "अटॅचमेंट्स"
+ },
+ "deleteAttachment": {
+ "message": "अटैचमेंट हटाएं"
+ },
+ "deleteAttachmentConfirmation": {
+ "message": "क्या आप वाकई इस अटैचमेंट को हटाना चाहते हैं?"
+ },
+ "deletedAttachment": {
+ "message": "हटाए गए अटैचमेंट"
+ },
+ "newAttachment": {
+ "message": "Add New Attachment"
+ },
+ "noAttachments": {
+ "message": "कोई अटैचमेंट नहीं।"
+ },
+ "attachmentSaved": {
+ "message": "अटैचमेंट बच गया है।"
+ },
+ "file": {
+ "message": "फ़ाइल"
+ },
+ "selectFile": {
+ "message": "फ़ाइल का चयन करें।"
+ },
+ "maxFileSize": {
+ "message": "अधिकतम फाइल आकार 500 MB है।"
+ },
+ "featureUnavailable": {
+ "message": "Feature Unavailable"
+ },
+ "updateKey": {
+ "message": "जब तक आप अपनी एन्क्रिप्शन कुंजी को अपडेट नहीं करते, तब तक आप इस सुविधा का उपयोग नहीं कर सकते हैं।"
+ },
+ "premiumMembership": {
+ "message": "Premium Membership"
+ },
+ "premiumManage": {
+ "message": "Manage Membership"
+ },
+ "premiumManageAlert": {
+ "message": "आप वेब वॉल्ट bitwarden.com पर अपनी सदस्यता का प्रबंधन कर सकते हैं।क्या आप अब वेबसाइट पर जाना चाहते हैं?"
+ },
+ "premiumRefresh": {
+ "message": "Refresh Membership"
+ },
+ "premiumNotCurrentMember": {
+ "message": "आप वर्तमान में प्रीमियम सदस्य नहीं हैं।"
+ },
+ "premiumSignUpAndGet": {
+ "message": "प्रीमियम सदस्यता के लिए साइन अप करें और प्राप्त करें:"
+ },
+ "ppremiumSignUpStorage": {
+ "message": "1 GB of encrypted file storage."
+ },
+ "ppremiumSignUpTwoStep": {
+ "message": "अतिरिक्त दो-चरण लॉगिन विकल्प जैसे YubiKey, FIDO U2F, और डुओ।"
+ },
+ "ppremiumSignUpReports": {
+ "message": "अपनी वॉल्ट को सुरक्षित रखने के लिए पासवर्ड स्वच्छता, खाता स्वास्थ्य और डेटा उल्लंघन रिपोर्ट।"
+ },
+ "ppremiumSignUpTotp": {
+ "message": "अपनी तिजोरी में लॉगिन के लिए TOTP सत्यापन कोड (2FA) जनरेटर।"
+ },
+ "ppremiumSignUpSupport": {
+ "message": "प्राथमिकता ग्राहक सहायता"
+ },
+ "ppremiumSignUpFuture": {
+ "message": "भविष्य के सभी प्रीमियम फीचर्स। और जल्द ही आ रहा है!"
+ },
+ "premiumPurchase": {
+ "message": "Purchase Premium"
+ },
+ "premiumPurchaseAlert": {
+ "message": "आप bitwarden.com वेब वॉल्ट पर प्रीमियम सदस्यता खरीद सकते हैं।क्या आप अब वेबसाइट पर जाना चाहते हैं?"
+ },
+ "premiumCurrentMember": {
+ "message": "आप एक प्रीमियम सदस्य हैं!"
+ },
+ "premiumCurrentMemberThanks": {
+ "message": "Thank you for supporting bitwarden."
+ },
+ "premiumPrice": {
+ "message": "All for just %price% /year!",
+ "placeholders": {
+ "price": {
+ "content": "$1",
+ "example": "$10"
+ }
+ }
+ },
+ "refreshComplete": {
+ "message": "ताज़ा पूरा"
+ },
+ "disableAutoTotpCopy": {
+ "message": "Disable Automatic TOTP Copy"
+ },
+ "disableAutoTotpCopyDesc": {
+ "message": "यदि आपके लॉगिन में एक प्रमाणक कुंजी जुड़ी हुई है, तो जब भी आप लॉगिन को ऑटो-फिल करते हैं तो TOTP सत्यापन कोड स्वचालित रूप से आपके क्लिपबोर्ड पर कॉपी किया जाता है।"
+ },
+ "disableAutoBiometricsPrompt": {
+ "message": "Do not prompt for biometrics on launch"
+ },
+ "premiumRequired": {
+ "message": "Premium Required"
+ },
+ "premiumRequiredDesc": {
+ "message": "इस सुविधा का उपयोग करने के लिए प्रीमियम सदस्यता की आवश्यकता होती है।"
+ },
+ "enterVerificationCodeApp": {
+ "message": "अपने ऑथेंटिकेटर ऐप से 6 डिजिट वेरिफिकेशन कोड डालें।"
+ },
+ "enterVerificationCodeEmail": {
+ "message": "Enter the 6 digit verification code that was emailed to",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "example@gmail.com"
+ }
+ }
+ },
+ "verificationCodeEmailSent": {
+ "message": "ईमेल $EMAIL$ को भेजा गया।",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "example@gmail.com"
+ }
+ }
+ },
+ "rememberMe": {
+ "message": "मुझे याद रखें"
+ },
+ "sendVerificationCodeEmailAgain": {
+ "message": "फिर से सत्यापन कोड ईमेल भेजें"
+ },
+ "useAnotherTwoStepMethod": {
+ "message": "एक और दो-चरण लॉगिन विधि का उपयोग करें"
+ },
+ "insertYubiKey": {
+ "message": "अपने कंप्यूटर के यूएसबी पोर्ट में अपने YubiKey डालें, फिर इसके बटन को स्पर्श करें।"
+ },
+ "insertU2f": {
+ "message": "अपने कंप्यूटर के यूएसबी पोर्ट में अपनी सुरक्षा कुंजी डालें। अगर इसमें कोई बटन है तो उसे टच करें।\n"
+ },
+ "webAuthnNewTab": {
+ "message": "वेबऑथन 2FA सत्यापन शुरू करने के लिए। एक नया टैब खोलने के लिए नीचे दिए गए बटन पर क्लिक करें और नए टैब में दिए गए निर्देशों का पालन करें।"
+ },
+ "webAuthnNewTabOpen": {
+ "message": "नया टैब खोलें"
+ },
+ "webAuthnAuthenticate": {
+ "message": "वेबऑथन प्रमाणित करें"
+ },
+ "loginUnavailable": {
+ "message": "Login Unavailable"
+ },
+ "noTwoStepProviders": {
+ "message": "This account has two-step login enabled, however, none of the configured two-step providers are supported by this web browser."
+ },
+ "noTwoStepProviders2": {
+ "message": "कृपया एक समर्थित वेब ब्राउज़र (जैसे क्रोम) और/या अतिरिक्त प्रदाताओं का उपयोग करें जो वेब ब्राउज़र (जैसे एक प्रमाणक ऐप) में बेहतर समर्थित हैं।"
+ },
+ "twoStepOptions": {
+ "message": "Two-step Login Options"
+ },
+ "recoveryCodeDesc": {
+ "message": "अपने दो कारक प्रदाताओं के सभी के लिए उपयोग खो दिया है? अपने खाते से सभी दो-कारक प्रदाताओं को अक्षम करने के लिए अपने रिकवरी कोड का उपयोग करें।"
+ },
+ "recoveryCodeTitle": {
+ "message": "Recovery Code"
+ },
+ "authenticatorAppTitle": {
+ "message": "Authenticator App"
+ },
+ "authenticatorAppDesc": {
+ "message": "समय-आधारित सत्यापन कोड उत्पन्न करने के लिए एक प्रमाणक ऐप (जैसे Authy या Google Authenticator) का उपयोग करें।",
+ "description": "'Authy' and 'Google Authenticator' are product names and should not be translated."
+ },
+ "yubiKeyTitle": {
+ "message": "YubiKey OTP Security Key"
+ },
+ "yubiKeyDesc": {
+ "message": "अपने खाते तक पहुंचने के लिए YubiKey का उपयोग करें। YubiKey 4, 4 नैनो, 4C, और NEO उपकरणों के साथ काम करता है।"
+ },
+ "duoDesc": {
+ "message": "डुओ मोबाइल ऐप, एसएमएस, फोन कॉल या U2F सुरक्षा कुंजी का उपयोग करके डुओ सिक्योरिटी के साथ सत्यापित करें।",
+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
+ },
+ "duoOrganizationDesc": {
+ "message": "Verify with Duo Security for your organization using the Duo Mobile app, SMS, phone call, or U2F security key.",
+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
+ },
+ "webAuthnTitle": {
+ "message": "FIDO2 वेबऑथन"
+ },
+ "webAuthnDesc": {
+ "message": "अपने खाते तक पहुंचने के लिए किसी भी WebAuthn सक्षम सुरक्षा कुंजी का उपयोग करें।"
+ },
+ "emailTitle": {
+ "message": "ईमेल"
+ },
+ "emailDesc": {
+ "message": "सत्यापन कोड आपको ईमेल किए जाएंगे।"
+ },
+ "selfHostedEnvironment": {
+ "message": "Self-hosted Environment"
+ },
+ "selfHostedEnvironmentFooter": {
+ "message": "Specify the base URL of your on-premise hosted bitwarden installation."
+ },
+ "customEnvironment": {
+ "message": "Custom Environment"
+ },
+ "customEnvironmentFooter": {
+ "message": "उन्नत उपयोगकर्ताओं के लिए। आप स्वतंत्र रूप से प्रत्येक सेवा का आधार URL निर्दिष्ट कर सकते हैं।"
+ },
+ "baseUrl": {
+ "message": "सर्वर URL"
+ },
+ "apiUrl": {
+ "message": "API Server URL"
+ },
+ "webVaultUrl": {
+ "message": "Web Vault Server URL"
+ },
+ "identityUrl": {
+ "message": "Identity Server URL"
+ },
+ "notificationsUrl": {
+ "message": "Notifications Server URL"
+ },
+ "iconsUrl": {
+ "message": "Icons Server URL"
+ },
+ "environmentSaved": {
+ "message": "पर्यावरण URL को बचाया गया है।"
+ },
+ "enableAutoFillOnPageLoad": {
+ "message": "Enable Auto-fill On Page Load."
+ },
+ "enableAutoFillOnPageLoadDesc": {
+ "message": "यदि लॉगिन फॉर्म का पता चलता है, तो वेब पेज लोड होने पर स्वचालित रूप से ऑटो-फिल करें।"
+ },
+ "experimentalFeature": {
+ "message": "यह वर्तमान में एक प्रयोगात्मक विशेषता है। अपने जोखिम पर उपयोग करें।"
+ },
+ "defaultAutoFillOnPageLoad": {
+ "message": "लॉगिन आइटम के लिए डिफ़ॉल्ट ऑटोफिल सेटिंग"
+ },
+ "defaultAutoFillOnPageLoadDesc": {
+ "message": "पेज लोड पर ऑटो-फिल को सक्षम करने के बाद, आप व्यक्तिगत लॉगिन आइटम के लिए सुविधा को सक्षम या अक्षम कर सकते हैं।यह लॉगिन आइटम के लिए डिफ़ॉल्ट सेटिंग है जो अलग से कॉन्फ़िगर नहीं हैं।"
+ },
+ "itemAutoFillOnPageLoad": {
+ "message": "पेज लोड पर ऑटो-भरें (यदि विकल्पों में सक्षम हैं)"
+ },
+ "autoFillOnPageLoadUseDefault": {
+ "message": "डिफ़ॉल्ट सेटिंग का उपयोग करें"
+ },
+ "autoFillOnPageLoadYes": {
+ "message": "पेज लोड पर ऑटो भरें"
+ },
+ "autoFillOnPageLoadNo": {
+ "message": "पेज लोड पर ऑटो-फिल न करें"
+ },
+ "commandOpenPopup": {
+ "message": "ओपन वॉल्ट पॉपअप"
+ },
+ "commandOpenSidebar": {
+ "message": "साइडबार में वॉल्ट खोले"
+ },
+ "commandAutofillDesc": {
+ "message": "Auto-fill the last used login for the current website."
+ },
+ "commandGeneratePasswordDesc": {
+ "message": "Generate and copy a new random password to the clipboard."
+ },
+ "commandLockVaultDesc": {
+ "message": "वॉल्ट लॉक करें"
+ },
+ "privateModeMessage": {
+ "message": "दुर्भाग्य से यह विंडो इस ब्राउज़र के लिए निजी मोड में उपलब्ध नहीं है।"
+ },
+ "customFields": {
+ "message": "Custom Fields"
+ },
+ "copyValue": {
+ "message": "Copy Value"
+ },
+ "value": {
+ "message": "मूल्य"
+ },
+ "newCustomField": {
+ "message": "New Custom Field"
+ },
+ "dragToSort": {
+ "message": "सॉर्ट करने के लिए ड्रैग करें"
+ },
+ "cfTypeText": {
+ "message": "शब्द"
+ },
+ "cfTypeHidden": {
+ "message": "छुपा हुआ"
+ },
+ "cfTypeBoolean": {
+ "message": "बूलियन"
+ },
+ "popup2faCloseMessage": {
+ "message": "अपने सत्यापन कोड के लिए अपने ईमेल की जांच करने के लिए पॉपअप विंडो के बाहर क्लिक करने से यह पॉपअप बंद हो जाएगा।क्या आप इस पॉपअप को एक नई विंडो में खोलना चाहते हैं ताकि यह बंद न हो?"
+ },
+ "popupU2fCloseMessage": {
+ "message": "यह ब्राउज़र इस पॉपअप विंडो में U2F अनुरोधों को संसाधित नहीं कर सकता है।क्या आप इस पॉपअप को एक नई विंडो में खोलना चाहते हैं ताकि आप U2F का उपयोग करके लॉग इन कर सकें?"
+ },
+ "disableFavicon": {
+ "message": "Disable Website Icons"
+ },
+ "disableFaviconDesc": {
+ "message": "Website Icons provides a recognizable icon next to each login item in your vault."
+ },
+ "disableBadgeCounter": {
+ "message": "बैज काउंटर को अक्षम कर दो"
+ },
+ "disableBadgeCounterDesc": {
+ "message": "बैज काउंटर निर्देश करता है कि आपके वॉल्ट में वर्तमान पृष्ठ के लिए आपके पास कितने लॉगिन हैं।"
+ },
+ "cardholderName": {
+ "message": "Cardholder Name"
+ },
+ "number": {
+ "message": "संख्या"
+ },
+ "brand": {
+ "message": "ब्रांड"
+ },
+ "expirationMonth": {
+ "message": "Expiration Month"
+ },
+ "expirationYear": {
+ "message": "Expiration Year"
+ },
+ "expiration": {
+ "message": "समय सीमा समाप्ति"
+ },
+ "january": {
+ "message": "जनवरी"
+ },
+ "february": {
+ "message": "फरवरी"
+ },
+ "march": {
+ "message": "मार्च"
+ },
+ "april": {
+ "message": "अप्रैल"
+ },
+ "may": {
+ "message": "मई"
+ },
+ "june": {
+ "message": "जून"
+ },
+ "july": {
+ "message": "जुलाई"
+ },
+ "august": {
+ "message": "अगस्त"
+ },
+ "september": {
+ "message": "सितम्बर"
+ },
+ "october": {
+ "message": "अक्टूबर"
+ },
+ "november": {
+ "message": "नवंबर"
+ },
+ "december": {
+ "message": "दिसंबर"
+ },
+ "securityCode": {
+ "message": "Security Code"
+ },
+ "ex": {
+ "message": "ex."
+ },
+ "title": {
+ "message": "शीर्षक"
+ },
+ "mr": {
+ "message": "श्री"
+ },
+ "mrs": {
+ "message": "श्रीमती"
+ },
+ "ms": {
+ "message": "श्रीमती"
+ },
+ "dr": {
+ "message": "डॉ"
+ },
+ "firstName": {
+ "message": "First Name"
+ },
+ "middleName": {
+ "message": "Middle Name"
+ },
+ "lastName": {
+ "message": "Last Name"
+ },
+ "identityName": {
+ "message": "Identity Name"
+ },
+ "company": {
+ "message": "कंपनी"
+ },
+ "ssn": {
+ "message": "Social Security Number"
+ },
+ "passportNumber": {
+ "message": "Passport Number"
+ },
+ "licenseNumber": {
+ "message": "License Number"
+ },
+ "email": {
+ "message": "ईमेल"
+ },
+ "phone": {
+ "message": "फोन"
+ },
+ "address": {
+ "message": "पता"
+ },
+ "address1": {
+ "message": "पता 1"
+ },
+ "address2": {
+ "message": "पता 2"
+ },
+ "address3": {
+ "message": "पता 3"
+ },
+ "cityTown": {
+ "message": "City / Town"
+ },
+ "stateProvince": {
+ "message": "State / Province"
+ },
+ "zipPostalCode": {
+ "message": "Zip / Postal Code"
+ },
+ "country": {
+ "message": "देश"
+ },
+ "type": {
+ "message": "प्रकार"
+ },
+ "typeLogin": {
+ "message": "लॉग इन"
+ },
+ "typeLogins": {
+ "message": "लॉग इन"
+ },
+ "typeSecureNote": {
+ "message": "Secure Note"
+ },
+ "typeCard": {
+ "message": "कार्ड"
+ },
+ "typeIdentity": {
+ "message": "पहचान"
+ },
+ "passwordHistory": {
+ "message": "पासवर्ड इतिहास"
+ },
+ "back": {
+ "message": "वापस जाएं"
+ },
+ "collections": {
+ "message": "संग्रह"
+ },
+ "favorites": {
+ "message": "Favorites"
+ },
+ "popOutNewWindow": {
+ "message": "एक नई विंडो के लिए पॉप आउट करें"
+ },
+ "refresh": {
+ "message": "रीफ्रेश करें"
+ },
+ "cards": {
+ "message": "कार्ड्स"
+ },
+ "identities": {
+ "message": "पहचान"
+ },
+ "logins": {
+ "message": "लॉग इन"
+ },
+ "secureNotes": {
+ "message": "Secure Notes"
+ },
+ "clear": {
+ "message": "खाली करें",
+ "description": "To clear something out. example: To clear browser history."
+ },
+ "checkPassword": {
+ "message": "चेक करें कि पासवर्ड सामने आ गया है या नहीं।"
+ },
+ "passwordExposed": {
+ "message": "This password has been exposed in data breaches. You should change it.",
+ "placeholders": {
+ "value": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "passwordSafe": {
+ "message": "यह पासवर्ड किसी भी ज्ञात डेटा उल्लंघनों में नहीं पाया गया था।इसका उपयोग करना सुरक्षित होना चाहिए।"
+ },
+ "baseDomain": {
+ "message": "बेस डोमेन"
+ },
+ "host": {
+ "message": "मेजबान",
+ "description": "A URL's host value. For example, the host of https://sub.domain.com:443 is 'sub.domain.com:443'."
+ },
+ "exact": {
+ "message": "सटीक"
+ },
+ "startsWith": {
+ "message": "इससे शुरू होता है"
+ },
+ "regEx": {
+ "message": "नियमित अभिव्यक्ति",
+ "description": "A programming term, also known as 'RegEx'."
+ },
+ "matchDetection": {
+ "message": "Match Detection",
+ "description": "URI match detection for auto-fill."
+ },
+ "defaultMatchDetection": {
+ "message": "डिफॉल्ट मैच डिटेक्शन",
+ "description": "Default URI match detection for auto-fill."
+ },
+ "toggleOptions": {
+ "message": "Toggle Options"
+ },
+ "toggleCurrentUris": {
+ "message": "वर्तमान URI's को टॉगल करें",
+ "description": "Toggle the display of the URIs of the currently open tabs in the browser."
+ },
+ "currentUri": {
+ "message": "वर्तमान URI",
+ "description": "The URI of one of the current open tabs in the browser."
+ },
+ "organization": {
+ "message": "Organization",
+ "description": "An entity of multiple related people (ex. a team or business organization)."
+ },
+ "types": {
+ "message": "प्रकार"
+ },
+ "allItems": {
+ "message": "All Items"
+ },
+ "noPasswordsInList": {
+ "message": "सूची के लिए कोई पासवर्ड नहीं हैं।"
+ },
+ "remove": {
+ "message": "हटाएं"
+ },
+ "default": {
+ "message": "डिफॉल्ट"
+ },
+ "dateUpdated": {
+ "message": "अपडेट किया गया",
+ "description": "ex. Date this item was updated"
+ },
+ "datePasswordUpdated": {
+ "message": "Password Updated",
+ "description": "ex. Date this password was updated"
+ },
+ "neverLockWarning": {
+ "message": "क्या आप सुनिश्चित हैं कि आप \"कभी नहीं\" विकल्प का उपयोग करना चाहते हैं?\"कभी नहीं\" के लिए अपने लॉक विकल्प को सेट करना आपके डिवाइस पर आपकी वॉल्ट की एन्क्रिप्शन कुंजी को स्टोर करता है। यदि आप इस विकल्प का उपयोग करते हैं तो आपको यह सुनिश्चित करना चाहिए कि आप अपने डिवाइस को ठीक से सुरक्षित रखें।"
+ },
+ "noOrganizationsList": {
+ "message": "You do not belong to any organizations. Organizations allow you to securely share items with other users."
+ },
+ "noCollectionsInList": {
+ "message": "सूची में कोई संग्रह नहीं है।"
+ },
+ "ownership": {
+ "message": "मालिकी"
+ },
+ "whoOwnsThisItem": {
+ "message": "इस आइटम का मालिक कौन है?"
+ },
+ "strong": {
+ "message": "मजबूत",
+ "description": "ex. A strong password. Scale: Weak -> Good -> Strong"
+ },
+ "good": {
+ "message": "अच्छा",
+ "description": "ex. A good password. Scale: Weak -> Good -> Strong"
+ },
+ "weak": {
+ "message": "कमजोर",
+ "description": "ex. A weak password. Scale: Weak -> Good -> Strong"
+ },
+ "weakMasterPassword": {
+ "message": "Weak Master Password"
+ },
+ "weakMasterPasswordDesc": {
+ "message": "आपके द्वारा चुना गया मास्टर पासवर्ड कमजोर है। आपको अपने बिटवर्डन खाते की ठीक से सुरक्षा के लिए एक मजबूत मास्टर पासवर्ड (या पासवाफ्रेज़) का उपयोग करना चाहिए।क्या आप सुनिश्चित हैं कि आप इस मास्टर पासवर्ड का उपयोग करना चाहते हैं?"
+ },
+ "pin": {
+ "message": "पिन",
+ "description": "PIN code. Ex. The short code (often numeric) that you use to unlock a device."
+ },
+ "unlockWithPin": {
+ "message": "पिन से अनलॉक करें "
+ },
+ "setYourPinCode": {
+ "message": "बिटवर्डन को अनलॉक करने के लिए अपना पिन कोड सेट करें यदि आप कभी भी आवेदन से पूरी तरह लॉग आउट करते हैं तो आपकी पिन सेटिंग्स रीसेट हो जाएंगी।"
+ },
+ "pinRequired": {
+ "message": "पिन-कोड आवश्यक है |"
+ },
+ "invalidPin": {
+ "message": "अमान्य पिन कोड।"
+ },
+ "verifyPin": {
+ "message": "पिन की पुष्टि करें"
+ },
+ "yourVaultIsLockedPinCode": {
+ "message": "आपकी वॉल्ट लॉक हो गई है। जारी रखने के लिए अपने पिन कोड को सत्यापित करें।"
+ },
+ "unlockWithBiometrics": {
+ "message": "बायोमेट्रिक्स का उपयोग कर अनलॉक करें"
+ },
+ "awaitDesktop": {
+ "message": "डेस्कटॉप से पुष्टि का इंतजार"
+ },
+ "awaitDesktopDesc": {
+ "message": "ब्राउज़र के लिए बॉयोमीट्रिक्स सक्षम करने के लिए Bitwarden डेस्कटॉप आवेदन में बॉयोमीट्रिक्स का उपयोग कर पुष्टि करें।"
+ },
+ "lockWithMasterPassOnRestart": {
+ "message": "ब्राउज़र पुनः आरंभ करने पर मास्टर पासवर्ड के साथ लॉक करें"
+ },
+ "selectOneCollection": {
+ "message": "आपको कम से कम एक संग्रह का चयन करना होगा।"
+ },
+ "cloneItem": {
+ "message": "क्लोन आइटम"
+ },
+ "clone": {
+ "message": "क्लोन"
+ },
+ "passwordGeneratorPolicyInEffect": {
+ "message": "एक या एक से अधिक संगठन नीतियां आपकी जनरेटर सेटिंग को प्रभावित कर रही हैं।"
+ },
+ "vaultTimeoutAction": {
+ "message": "वॉल्ट मध्यांतर कार्रवाई"
+ },
+ "lock": {
+ "message": "लॉक",
+ "description": "Verb form: to make secure or inaccesible by"
+ },
+ "trash": {
+ "message": "थ्रैश",
+ "description": "Noun: a special folder to hold deleted items"
+ },
+ "searchTrash": {
+ "message": "थ्रैश में खोजें"
+ },
+ "permanentlyDeleteItem": {
+ "message": "स्थायी रूप से आइटम हटाएं"
+ },
+ "permanentlyDeleteItemConfirmation": {
+ "message": "क्या आप सुनिश्चित हैं कि आप इस आइटम को स्थायी रूप से हटाना चाहते हैं?"
+ },
+ "permanentlyDeletedItem": {
+ "message": "स्थायी रूप से आइटम हटाएं"
+ },
+ "restoreItem": {
+ "message": "आइटम बहाल करें"
+ },
+ "restoreItemConfirmation": {
+ "message": "क्या आप सुनिश्चित हैं कि आप इस आइटम को बहाल करना चाहते हैं?"
+ },
+ "restoredItem": {
+ "message": "बहाल आइटम"
+ },
+ "vaultTimeoutLogOutConfirmation": {
+ "message": "लॉग आउट करने से वॉल्टमें प्रवेश संभव नहीं होगा और समय समाप्त होने के बाद ऑनलाइन प्रमाणीकरण की आश्यकता होगी। आप इस सेटिंग्स को प्रयोग करने के लिए विश्वस्त हैं?"
+ },
+ "vaultTimeoutLogOutConfirmationTitle": {
+ "message": "मध्यांतर कार्रवाई की पुष्टि"
+ },
+ "autoFillAndSave": {
+ "message": "ऑटो फिल और सेव"
+ },
+ "autoFillSuccessAndSavedUri": {
+ "message": "ऑटो फिल आइटम और सेव URI"
+ },
+ "autoFillSuccess": {
+ "message": "ऑटो फिल आइटम"
+ },
+ "setMasterPassword": {
+ "message": "मास्टर पासवर्ड सेट करें"
+ },
+ "masterPasswordPolicyInEffect": {
+ "message": "एक या एक से अधिक संगठन नीतियों को निम्नलिखित आवश्यकताओं को पूरा करने के लिए आपके मास्टर पासवर्ड की आवश्यकता होती है:"
+ },
+ "policyInEffectMinComplexity": {
+ "message": "$SCORE$ का न्यूनतम जटिलता स्कोर",
+ "placeholders": {
+ "score": {
+ "content": "$1",
+ "example": "4"
+ }
+ }
+ },
+ "policyInEffectMinLength": {
+ "message": "$LENGTH$ की न्यूनतम लंबाई",
+ "placeholders": {
+ "length": {
+ "content": "$1",
+ "example": "14"
+ }
+ }
+ },
+ "policyInEffectUppercase": {
+ "message": "एक या एक से अधिक ऊपरी अक्षर रखे"
+ },
+ "policyInEffectLowercase": {
+ "message": "एक या एक से अधिक लोअरकेस अक्षर रखे"
+ },
+ "policyInEffectNumbers": {
+ "message": "एक या अधिक संख्या रखे"
+ },
+ "policyInEffectSpecial": {
+ "message": "निम्नलिखित विशेष पात्रों में से एक या अधिक शामिल रखे $CHARS$",
+ "placeholders": {
+ "chars": {
+ "content": "$1",
+ "example": "!@#$%^&*"
+ }
+ }
+ },
+ "masterPasswordPolicyRequirementsNotMet": {
+ "message": "आपका नया मास्टर पासवर्ड पॉलिसी आवश्यकताओं को पूरा नहीं करता है।"
+ },
+ "acceptPolicies": {
+ "message": "इस बॉक्स की जांच करके आप निम्नलिखित से सहमत हैं:"
+ },
+ "acceptPoliciesError": {
+ "message": "सेवा और गोपनीयता नीति की शर्तों को स्वीकार नहीं किया गया है ।"
+ },
+ "termsOfService": {
+ "message": "सेवा की शर्तें"
+ },
+ "privacyPolicy": {
+ "message": "प्राइवेसी पोलिसी"
+ },
+ "hintEqualsPassword": {
+ "message": "आपका पासवर्ड संकेत आपके पासवर्ड के समान नहीं हो सकता है।"
+ },
+ "ok": {
+ "message": "ठीक है"
+ },
+ "desktopSyncVerificationTitle": {
+ "message": "डेस्कटॉप सिंक सत्यापन"
+ },
+ "desktopIntegrationVerificationText": {
+ "message": "कृपया सत्यापित करें कि डेस्कटॉप एप्लिकेशन इस फिंगरप्रिंट को दिखाता है:"
+ },
+ "desktopIntegrationDisabledTitle": {
+ "message": "ब्राउज़र एकीकरण सक्षम नहीं है"
+ },
+ "desktopIntegrationDisabledDesc": {
+ "message": "ब्राउज़र एकीकरण बिटवर्डन डेस्कटॉप एप्लिकेशन में सक्षम नहीं है।कृपया इसे डेस्कटॉप एप्लिकेशन के भीतर सेटिंग्स में सक्षम करें।"
+ },
+ "startDesktopTitle": {
+ "message": "बिटवर्डन डेस्कटॉप एप्लिकेशन शुरू करें"
+ },
+ "startDesktopDesc": {
+ "message": "इस फ़ंक्शन का उपयोग करने से पहले बिटवर्डन डेस्कटॉप एप्लिकेशन को शुरू करने की आवश्यकता है।"
+ },
+ "errorEnableBiometricTitle": {
+ "message": "बॉयोमीट्रिक्स सक्षम करने में असमर्थ"
+ },
+ "errorEnableBiometricDesc": {
+ "message": "डेस्कटॉप एप्लिकेशन द्वारा कार्रवाई रद्द कर दी गई थी"
+ },
+ "nativeMessagingInvalidEncryptionDesc": {
+ "message": "डेस्कटॉप एप्लिकेशन ने सुरक्षित संचार चैनल को अमान्य कर दिया। कृपया इस ऑपरेशन को फिर से प्रयास करें"
+ },
+ "nativeMessagingInvalidEncryptionTitle": {
+ "message": "डेस्कटॉप संचार बाधित"
+ },
+ "nativeMessagingWrongUserDesc": {
+ "message": "डेस्कटॉप एप्लिकेशन को एक अलग खाते में लॉग इन किया जाता है। कृपया सुनिश्चित करें कि दोनों आवेदन एक ही खाते में लॉग इन किए गए हैं।"
+ },
+ "nativeMessagingWrongUserTitle": {
+ "message": "खाता गलत मैच"
+ },
+ "biometricsNotEnabledTitle": {
+ "message": "बॉयोमीट्रिक्स सक्षम नहीं है"
+ },
+ "biometricsNotEnabledDesc": {
+ "message": "ब्राउज़र बॉयोमीट्रिक्स पहले सेटिंग्स में सक्षम होने के लिए डेस्कटॉप बॉयोमीट्रिक की आवश्यकता है ।"
+ },
+ "biometricsNotSupportedTitle": {
+ "message": "बॉयोमीट्रिक्स सक्षम नहीं है"
+ },
+ "biometricsNotSupportedDesc": {
+ "message": "ब्राउज़र बॉयोमीट्रिक्स इस डिवाइस पर समर्थित नहीं है।"
+ },
+ "nativeMessaginPermissionErrorTitle": {
+ "message": "अनुमति नहीं दी गयी है"
+ },
+ "nativeMessaginPermissionErrorDesc": {
+ "message": "बिटवर्डन डेस्कटॉप एप्लिकेशन के साथ संवाद करने की अनुमति के बिना हम ब्राउज़र एक्सटेंशन में बॉयोमीट्रिक्स प्रदान नहीं कर सकते हैं।कृपया फिर से प्रयास करें।"
+ },
+ "nativeMessaginPermissionSidebarTitle": {
+ "message": "अनुमति अनुरोध त्रुटि"
+ },
+ "nativeMessaginPermissionSidebarDesc": {
+ "message": "यह क्रिया साइडबार में नहीं की जा सकती है, कृपया पॉपअप या पॉपआउट में कार्रवाई का फिर से प्रयास करें।"
+ },
+ "personalOwnershipSubmitError": {
+ "message": "एंटरप्राइज पॉलिसी के कारण, आप अपनी व्यक्तिगत वॉल्ट में वस्तुओं को सहेजने से प्रतिबंधित हैं।किसी संगठन के स्वामित्व विकल्प को बदलें और उपलब्ध संग्रहों में से चुनें।"
+ },
+ "personalOwnershipPolicyInEffect": {
+ "message": "एक संगठन नीति आपके स्वामित्व विकल्पों को प्रभावित कर रही है।"
+ },
+ "excludedDomains": {
+ "message": "बहिष्कृत डोमेन"
+ },
+ "excludedDomainsDesc": {
+ "message": "बिटवर्डन इन डोमेन के लिए लॉगिन विवरण सहेजने के लिए नहीं कहेगा।परिवर्तनों को प्रभावी बनाने के लिए आपको पृष्ठ को ताज़ा करना होगा |"
+ },
+ "excludedDomainsInvalidDomain": {
+ "message": "$DOMAIN $ एक वैध डोमेन नहीं है",
+ "placeholders": {
+ "domain": {
+ "content": "$1",
+ "example": "googlecom"
+ }
+ }
+ },
+ "send": {
+ "message": "भेजें",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "searchSends": {
+ "message": "Sends मे खोजे",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "addSend": {
+ "message": "Send जोड़ें",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTypeText": {
+ "message": "शब्द"
+ },
+ "sendTypeFile": {
+ "message": "फ़ाइल"
+ },
+ "allSends": {
+ "message": "सभी Sends",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "maxAccessCountReached": {
+ "message": "मैक्स एक्सेस काउंट पहुंच गया है"
+ },
+ "expired": {
+ "message": " गतावधिक"
+ },
+ "pendingDeletion": {
+ "message": "हटाना लंबित"
+ },
+ "passwordProtected": {
+ "message": "पासवर्ड सुरक्षित है"
+ },
+ "copySendLink": {
+ "message": "कॉपी Send लिंक",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "removePassword": {
+ "message": "पासवर्ड हटाएं"
+ },
+ "delete": {
+ "message": "हटाएं"
+ },
+ "removedPassword": {
+ "message": "पासवर्ड हटाएं"
+ },
+ "deletedSend": {
+ "message": " Send हटाए गए",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendLink": {
+ "message": "Send लिंक",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "disabled": {
+ "message": "अक्षम"
+ },
+ "removePasswordConfirmation": {
+ "message": "क्या आप सयमुच पासवर्ड हटाना चाहते हैं?"
+ },
+ "deleteSend": {
+ "message": " Send हटाए",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "deleteSendConfirmation": {
+ "message": "क्या आप वाकई इस Send को मिटाना चाहते हैं?",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "editSend": {
+ "message": "एडिट Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTypeHeader": {
+ "message": "यह किस प्रकार का सेंड है?",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendNameDesc": {
+ "message": "इस सेंड का वर्णन करने के लिए एक दोस्ताना नाम।",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendFileDesc": {
+ "message": "वह फाइल जो आप सेंड करना चाहते हैं।"
+ },
+ "deletionDate": {
+ "message": "हटाने की तारीख"
+ },
+ "deletionDateDesc": {
+ "message": " यह सेंड निर्धारित तिथि और समय पर स्थायी रूप से हटा दिया जाएगा।",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "expirationDate": {
+ "message": "समाप्ति तिथि"
+ },
+ "expirationDateDesc": {
+ "message": "यदि सेट किया जाता है, तो यह सेंड निर्दिष्ट तिथि और समय पर समाप्त हो जाएगा।",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "oneDay": {
+ "message": "1 दिन"
+ },
+ "days": {
+ "message": "#DAYS# दिन",
+ "placeholders": {
+ "days": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "custom": {
+ "message": "कस्टम"
+ },
+ "maximumAccessCount": {
+ "message": "अधिकतम एक्सेस काउंट"
+ },
+ "maximumAccessCountDesc": {
+ "message": "यदि सेट किया जाता है, तो अधिकतम एक्सेस काउंट तक पहुंचने के बाद उपयोगकर्ता अब इस सेंड को एक्सेस नहीं कर पाएंगे।",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendPasswordDesc": {
+ "message": "वैकल्पिक रूप से उपयोगकर्ताओं को इस सेंड तक पहुंचने के लिए पासवर्ड की आवश्यकता होगी।",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendNotesDesc": {
+ "message": "इस सेंड के बारे में निजी नोट्स।",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendDisableDesc": {
+ "message": "इस सेंड को अक्षम करें ताकि कोई भी इसे एक्सेस न कर सके।",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendShareDesc": {
+ "message": "सेव पर क्लिपबोर्ड पर इस सेंड के लिंक को कॉपी करें।",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTextDesc": {
+ "message": "वह टेक्स्ट जो आप सेंड करना चाहते हैं।"
+ },
+ "sendHideText": {
+ "message": "इस सेंड के टेक्स्ट को डिफ़ॉल्ट रूप से छिपाएं।",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "currentAccessCount": {
+ "message": "वर्तमान एक्सेस काउंट"
+ },
+ "createSend": {
+ "message": "नया सेंड बनाएं",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "newPassword": {
+ "message": "नया पासवर्ड"
+ },
+ "sendDisabled": {
+ "message": "सेंड अक्षम",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendDisabledWarning": {
+ "message": "एक उद्यम नीति के कारण, आप केवल मौजूदा सेंड को हटाने में सक्षम हैं।",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "createdSend": {
+ "message": "नया सेंड बनाया गया",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "editedSend": {
+ "message": "सेंड एडिट किया गया",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendLinuxChromiumFileWarning": {
+ "message": "फ़ाइल चुनने के लिए, साइडबार (यदि संभव हो) में एक्सटेंशन खोलें या इस बैनर पर क्लिक करके एक नई विंडो को पॉप आउट करें।"
+ },
+ "sendFirefoxFileWarning": {
+ "message": "फ़ायरफ़ॉक्स का उपयोग करके फ़ाइल चुनने के लिए, साइडबार में एक्सटेंशन खोलें या इस बैनर पर क्लिक करके एक नई विंडो को पॉप आउट करें।"
+ },
+ "sendSafariFileWarning": {
+ "message": "सफारी का उपयोग करके फ़ाइल चुनने के लिए, इस बैनर पर क्लिक करके एक नई विंडो को पॉप आउट करें।"
+ },
+ "sendFileCalloutHeader": {
+ "message": "शुरू करने से पहले"
+ },
+ "sendFirefoxCustomDatePopoutMessage1": {
+ "message": "कैलेंडर शैली तिथि बीनने वाले का उपयोग करने के लिए",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read '**To use a calendar style date picker ** click here to pop out your window.'"
+ },
+ "sendFirefoxCustomDatePopoutMessage2": {
+ "message": "यहां क्लिक करें",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker **click here** to pop out your window.'"
+ },
+ "sendFirefoxCustomDatePopoutMessage3": {
+ "message": "अपनी विंडो पॉप आउट करने के लिए यहां क्लिक करें।",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker click here **to pop out your window.**'"
+ },
+ "expirationDateIsInvalid": {
+ "message": "प्रदान की गई समाप्ति तिथि मान्य नहीं है।"
+ },
+ "deletionDateIsInvalid": {
+ "message": "प्रदान की गई विलोपन तिथि मान्य नहीं है।"
+ },
+ "expirationDateAndTimeRequired": {
+ "message": "एक समाप्ति तिथि और समय की आवश्यकता है।"
+ },
+ "deletionDateAndTimeRequired": {
+ "message": "एक विलोपन तिथि और समय की आवश्यकता है।"
+ },
+ "dateParsingError": {
+ "message": "आपके विलोपन और समाप्ति तिथियों को सहेजने में एक त्रुटि थी।"
+ },
+ "hideEmail": {
+ "message": "प्राप्तकर्ताओं से मेरा ईमेल पता छिपाएं।"
+ },
+ "sendOptionsPolicyInEffect": {
+ "message": "एक या एक से अधिक संगठन नीतियां आपके सेंड विकल्पों को प्रभावित कर रही हैं।"
+ },
+ "passwordPrompt": {
+ "message": "मास्टर पासवर्ड रि-प्रॉम्प्ट"
+ },
+ "passwordConfirmation": {
+ "message": "मास्टर पासवर्ड पुष्टि"
+ },
+ "passwordConfirmationDesc": {
+ "message": "यह क्रिया सुरक्षित है। जारी रखने के लिए, कृपया अपनी पहचान सत्यापित करने के लिए अपना मास्टर पासवर्ड फिर से दर्ज करें।"
+ },
+ "emailVerificationRequired": {
+ "message": "ईमेल सत्यापन आवश्यक है"
+ },
+ "emailVerificationRequiredDesc": {
+ "message": "इस सुविधा का उपयोग करने के लिए आपको अपने ईमेल को सत्यापित करना होगा। आप वेब वॉल्ट में अपने ईमेल को सत्यापित कर सकते हैं।"
+ },
+ "updatedMasterPassword": {
+ "message": "Updated Master Password"
+ },
+ "updateMasterPassword": {
+ "message": "Update Master Password"
+ },
+ "updateMasterPasswordWarning": {
+ "message": "Your Master Password was recently changed by an administrator in your organization. In order to access the vault, you must update it now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour."
+ },
+ "resetPasswordPolicyAutoEnroll": {
+ "message": "Automatic Enrollment"
+ },
+ "resetPasswordAutoEnrollInviteWarning": {
+ "message": "This organization has an enterprise policy that will automatically enroll you in password reset. Enrollment will allow organization administrators to change your master password."
+ },
+ "selectFolder": {
+ "message": "Select folder..."
+ },
+ "ssoCompleteRegistration": {
+ "message": "In order to complete logging in with SSO, please set a master password to access and protect your vault."
+ },
+ "hours": {
+ "message": "Hours"
+ },
+ "minutes": {
+ "message": "Minutes"
+ },
+ "vaultTimeoutPolicyInEffect": {
+ "message": "Your organization policies are affecting your vault timeout. Maximum allowed Vault Timeout is $HOURS$ hour(s) and $MINUTES$ minute(s)",
+ "placeholders": {
+ "hours": {
+ "content": "$1",
+ "example": "5"
+ },
+ "minutes": {
+ "content": "$2",
+ "example": "5"
+ }
+ }
+ },
+ "vaultTimeoutToLarge": {
+ "message": "Your vault timeout exceeds the restrictions set by your organization."
+ },
+ "vaultExportDisabled": {
+ "message": "Vault Export Disabled"
+ },
+ "personalVaultExportPolicyInEffect": {
+ "message": "One or more organization policies prevents you from exporting your personal vault."
+ },
+ "copyCustomFieldNameInvalidElement": {
+ "message": "Unable to identify a valid form element. Try inspecting the HTML instead."
+ },
+ "copyCustomFieldNameNotUnique": {
+ "message": "No unique identifier found."
+ }
+}
diff --git a/src/iOS.Safari/Resources/_locales/hr/messages.json b/src/iOS.Safari/Resources/_locales/hr/messages.json
new file mode 100644
index 000000000..47159eeaf
--- /dev/null
+++ b/src/iOS.Safari/Resources/_locales/hr/messages.json
@@ -0,0 +1,1817 @@
+{
+ "appName": {
+ "message": "Bitwarden"
+ },
+ "extName": {
+ "message": "Bitwarden - besplatni upravitelj lozinki",
+ "description": "Extension name, MUST be less than 40 characters (Safari restriction)"
+ },
+ "extDesc": {
+ "message": "Bitwarden je siguran i besplatan upravitelj lozinki za sve tvoje uređaje.",
+ "description": "Extension description"
+ },
+ "loginOrCreateNewAccount": {
+ "message": "Prijavi se ili stvori novi račun za pristup svojem sigurnom trezoru."
+ },
+ "createAccount": {
+ "message": "Stvori račun"
+ },
+ "login": {
+ "message": "Prijava"
+ },
+ "enterpriseSingleSignOn": {
+ "message": "Jedinstvena prijava na razini tvrtke (SSO)"
+ },
+ "cancel": {
+ "message": "Odustani"
+ },
+ "close": {
+ "message": "Zatvori"
+ },
+ "submit": {
+ "message": "Pošalji"
+ },
+ "emailAddress": {
+ "message": "Adresa e-pošte"
+ },
+ "masterPass": {
+ "message": "Glavna lozinka"
+ },
+ "masterPassDesc": {
+ "message": "Glavnu lozinku koristiš za pristup svom trezoru. Vrlo je važno da ne zaboraviš glavnu lozinku. Ne postoji način za oporavak lozinke u slučaju da ju zaboraviš."
+ },
+ "masterPassHintDesc": {
+ "message": "Podsjetnik glavne lozinke ti može pomoći da se prisjetiš svoje lozinke ako ju zaboraviš."
+ },
+ "reTypeMasterPass": {
+ "message": "Ponovno upiši glavnu lozinku"
+ },
+ "masterPassHint": {
+ "message": "Podsjetnik glavne lozinke (neobavezno)"
+ },
+ "tab": {
+ "message": "Kartica"
+ },
+ "myVault": {
+ "message": "Moj trezor"
+ },
+ "tools": {
+ "message": "Alati"
+ },
+ "settings": {
+ "message": "Postavke"
+ },
+ "currentTab": {
+ "message": "Trenutna kartica"
+ },
+ "copyPassword": {
+ "message": "Kopiraj lozinku"
+ },
+ "copyNote": {
+ "message": "Kopiraj bilješku"
+ },
+ "copyUri": {
+ "message": "Kopiraj URI"
+ },
+ "copyUsername": {
+ "message": "Kopiraj korisničko ime"
+ },
+ "copyNumber": {
+ "message": "Kopiraj broj"
+ },
+ "copySecurityCode": {
+ "message": "Kopiraj kontrolni broj"
+ },
+ "autoFill": {
+ "message": "Auto-ispuna"
+ },
+ "generatePasswordCopied": {
+ "message": "Generiraj lozinku (i kopiraj)"
+ },
+ "copyElementIdentifier": {
+ "message": "Kopiranje prilagođenog naziva polja"
+ },
+ "noMatchingLogins": {
+ "message": "Nema podudarajućih prijava."
+ },
+ "vaultLocked": {
+ "message": "Trezor je zaključan."
+ },
+ "vaultLoggedOut": {
+ "message": "Trezor je odjavljen."
+ },
+ "autoFillInfo": {
+ "message": "Nema dostupnih prijava za auto-ispunu na web stranici u ovoj kartici."
+ },
+ "addLogin": {
+ "message": "Dodaj prijavu"
+ },
+ "addItem": {
+ "message": "Dodaj stavku"
+ },
+ "passwordHint": {
+ "message": "Podsjetnik za lozinku"
+ },
+ "enterEmailToGetHint": {
+ "message": "Unesi adresu e-pošte svog računa za primitak podsjetnika glavne lozinke."
+ },
+ "getMasterPasswordHint": {
+ "message": "Slanje podsjetnika glavne lozinke"
+ },
+ "continue": {
+ "message": "Nastavi"
+ },
+ "verificationCode": {
+ "message": "Kôd za provjeru"
+ },
+ "account": {
+ "message": "Račun"
+ },
+ "changeMasterPassword": {
+ "message": "Promjeni glavnu lozinku"
+ },
+ "fingerprintPhrase": {
+ "message": "Jedinstvena fraza",
+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
+ },
+ "yourAccountsFingerprint": {
+ "message": "Jedinstvena fraza tvog računa",
+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
+ },
+ "twoStepLogin": {
+ "message": "Prijava u dva koraka"
+ },
+ "logOut": {
+ "message": "Odjavi se"
+ },
+ "about": {
+ "message": "O aplikaciji"
+ },
+ "version": {
+ "message": "Verzija"
+ },
+ "save": {
+ "message": "Spremi"
+ },
+ "move": {
+ "message": "Premjesti"
+ },
+ "addFolder": {
+ "message": "Dodaj mapu"
+ },
+ "name": {
+ "message": "Naziv"
+ },
+ "editFolder": {
+ "message": "Uredi mapu"
+ },
+ "deleteFolder": {
+ "message": "Izbriši mapu"
+ },
+ "folders": {
+ "message": "Mape"
+ },
+ "noFolders": {
+ "message": "Nema mapa na popisu."
+ },
+ "helpFeedback": {
+ "message": "Pomoć i povratne informacije"
+ },
+ "sync": {
+ "message": "Sinkronizacija"
+ },
+ "syncVaultNow": {
+ "message": "Odmah sinkroniziraj trezor"
+ },
+ "lastSync": {
+ "message": "Posljednja sinkronizacija:"
+ },
+ "passGen": {
+ "message": "Generator lozinki"
+ },
+ "generator": {
+ "message": "Generator",
+ "description": "Short for 'Password Generator'."
+ },
+ "passGenInfo": {
+ "message": "Automatski generiraj jake, jedinstvene lozinke."
+ },
+ "bitWebVault": {
+ "message": "Bitwarden Web trezor"
+ },
+ "importItems": {
+ "message": "Uvoz stavki"
+ },
+ "select": {
+ "message": "Odaberi"
+ },
+ "generatePassword": {
+ "message": "Generiraj lozinku"
+ },
+ "regeneratePassword": {
+ "message": "Ponovno generiraj lozinku"
+ },
+ "options": {
+ "message": "Opcije"
+ },
+ "length": {
+ "message": "Duljina"
+ },
+ "numWords": {
+ "message": "Broj riječi"
+ },
+ "wordSeparator": {
+ "message": "Razdjelitelj riječi"
+ },
+ "capitalize": {
+ "message": "Prva slova velika",
+ "description": "Make the first letter of a work uppercase."
+ },
+ "includeNumber": {
+ "message": "Uključi broj"
+ },
+ "minNumbers": {
+ "message": "Najmanje brojeva"
+ },
+ "minSpecial": {
+ "message": "Najmanje specijalnih"
+ },
+ "avoidAmbChar": {
+ "message": "Izbjegavaj dvosmislene znakove"
+ },
+ "searchVault": {
+ "message": "Pretraži trezor"
+ },
+ "edit": {
+ "message": "Uredi"
+ },
+ "view": {
+ "message": "Prikaz"
+ },
+ "noItemsInList": {
+ "message": "Nema stavki za prikaz."
+ },
+ "itemInformation": {
+ "message": "Informacije o stavci"
+ },
+ "username": {
+ "message": "Korisničko ime"
+ },
+ "password": {
+ "message": "Lozinka"
+ },
+ "passphrase": {
+ "message": "Frazna lozinka"
+ },
+ "favorite": {
+ "message": "Favorit"
+ },
+ "notes": {
+ "message": "Bilješke"
+ },
+ "note": {
+ "message": "Bilješka"
+ },
+ "editItem": {
+ "message": "Uredi stavku"
+ },
+ "folder": {
+ "message": "Mapa"
+ },
+ "deleteItem": {
+ "message": "Izbriši stavku"
+ },
+ "viewItem": {
+ "message": "Prikaz stavke"
+ },
+ "launch": {
+ "message": "Pokreni"
+ },
+ "website": {
+ "message": "Web stranica"
+ },
+ "toggleVisibility": {
+ "message": "Prikaži/Sakrij"
+ },
+ "manage": {
+ "message": "Upravljanje"
+ },
+ "other": {
+ "message": "Ostalo"
+ },
+ "rateExtension": {
+ "message": "Ocijeni proširenje"
+ },
+ "rateExtensionDesc": {
+ "message": "Razmotri da nam pomogneš dobrom recenzijom!"
+ },
+ "browserNotSupportClipboard": {
+ "message": "Web preglednik ne podržava jednostavno kopiranje međuspremnika. Umjesto toga ručno kopirajte."
+ },
+ "verifyMasterPassword": {
+ "message": "Potvrdi glavnu lozinku"
+ },
+ "yourVaultIsLocked": {
+ "message": "Tvoj trezor je zaključan. Potvrdi glavnu lozinku za nastavak."
+ },
+ "unlock": {
+ "message": "Otključaj"
+ },
+ "loggedInAsOn": {
+ "message": "Korisnički račun: $EMAIL$ na $HOSTNAME$",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "name@example.com"
+ },
+ "hostname": {
+ "content": "$2",
+ "example": "bitwarden.com"
+ }
+ }
+ },
+ "invalidMasterPassword": {
+ "message": "Neispravna glavna lozinka"
+ },
+ "vaultTimeout": {
+ "message": "Istek trezora"
+ },
+ "lockNow": {
+ "message": "Zaključaj sada"
+ },
+ "immediately": {
+ "message": "Odmah"
+ },
+ "tenSeconds": {
+ "message": "10 sekundi"
+ },
+ "twentySeconds": {
+ "message": "20 sekundi"
+ },
+ "thirtySeconds": {
+ "message": "30 sekundi"
+ },
+ "oneMinute": {
+ "message": "1 minuta"
+ },
+ "twoMinutes": {
+ "message": "2 minute"
+ },
+ "fiveMinutes": {
+ "message": "5 minuta"
+ },
+ "fifteenMinutes": {
+ "message": "15 minuta"
+ },
+ "thirtyMinutes": {
+ "message": "30 minuta"
+ },
+ "oneHour": {
+ "message": "1 sat"
+ },
+ "fourHours": {
+ "message": "4 sata"
+ },
+ "onLocked": {
+ "message": "Pri zaključavanju sustava"
+ },
+ "onRestart": {
+ "message": "Pri pokretanju preglednika"
+ },
+ "never": {
+ "message": "Nikad"
+ },
+ "security": {
+ "message": "Sigurnost"
+ },
+ "errorOccurred": {
+ "message": "Došlo je do pogreške"
+ },
+ "emailRequired": {
+ "message": "Adresa e-pošte je obavezna."
+ },
+ "invalidEmail": {
+ "message": "Neispravna adresa e-pošte."
+ },
+ "masterPassRequired": {
+ "message": "Potrebna je glavna lozinka."
+ },
+ "masterPassLength": {
+ "message": "Glavna lozinka mora imati najmanje 8 znakova."
+ },
+ "masterPassDoesntMatch": {
+ "message": "Potvrda glavne lozinke se ne podudara."
+ },
+ "newAccountCreated": {
+ "message": "Tvoj novi račun je kreiran! Sada se možeš prijaviti."
+ },
+ "masterPassSent": {
+ "message": "Poslali smo e-poštu s podsjetnikom glavne lozinke."
+ },
+ "verificationCodeRequired": {
+ "message": "Potvrdni kôd je obavezan."
+ },
+ "valueCopied": {
+ "message": " kopirano",
+ "description": "Value has been copied to the clipboard.",
+ "placeholders": {
+ "value": {
+ "content": "$1",
+ "example": "Password"
+ }
+ }
+ },
+ "autofillError": {
+ "message": "Nije moguće auto-ispuniti odabranu prijavu na ovoj stranici. Umjesto toga kopiraj/zalijepi podatke."
+ },
+ "loggedOut": {
+ "message": "Odjavljen"
+ },
+ "loginExpired": {
+ "message": "Sesija je istekla."
+ },
+ "logOutConfirmation": {
+ "message": "Sigurno se želiš odjaviti?"
+ },
+ "yes": {
+ "message": "Da"
+ },
+ "no": {
+ "message": "Ne"
+ },
+ "unexpectedError": {
+ "message": "Došlo je do neočekivane pogreške."
+ },
+ "nameRequired": {
+ "message": "Ime je obavezno."
+ },
+ "addedFolder": {
+ "message": "Mapa dodana"
+ },
+ "changeMasterPass": {
+ "message": "Promjeni glavnu lozinku"
+ },
+ "changeMasterPasswordConfirmation": {
+ "message": "Svoju glavnu lozinku možeš promijeniti na web trezoru. Želiš li sada posjetiti bitwarden.com?"
+ },
+ "twoStepLoginConfirmation": {
+ "message": "Prijava u dva koraka čini tvoj račun još sigurnijim tako što će zahtijevati da potvrdiš prijavu putem drugog uređaja kao što je sigurnosni ključ, autentifikatorske aplikacije, SMS-om, pozivom ili e-poštom. Prijavu u dva koraka možeš omogućiti na web trezoru. Želiš li sada posjetiti bitwarden.com?"
+ },
+ "editedFolder": {
+ "message": "Uređena mapa"
+ },
+ "deleteFolderConfirmation": {
+ "message": "Sigurno želiš izbrisati ovu mapu?"
+ },
+ "deletedFolder": {
+ "message": "Mapa izbrisana"
+ },
+ "gettingStartedTutorial": {
+ "message": "Priručnik za početak rada"
+ },
+ "gettingStartedTutorialVideo": {
+ "message": "Pogledaj naš početni vodič za savjete kako najbolje iskoristiti proširenje preglednika."
+ },
+ "syncingComplete": {
+ "message": "Sinkronizacija dovršena"
+ },
+ "syncingFailed": {
+ "message": "Sinkronizacija nije uspjela"
+ },
+ "passwordCopied": {
+ "message": "Lozinka kopirana"
+ },
+ "uri": {
+ "message": "URI"
+ },
+ "uriPosition": {
+ "message": "URI $POSITION$",
+ "description": "A listing of URIs. Ex: URI 1, URI 2, URI 3, etc.",
+ "placeholders": {
+ "position": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "newUri": {
+ "message": "Novi URI"
+ },
+ "addedItem": {
+ "message": "Stavka dodana"
+ },
+ "editedItem": {
+ "message": "Stavka izmijenjena"
+ },
+ "deleteItemConfirmation": {
+ "message": "Želiš li zaista poslati u smeće?"
+ },
+ "deletedItem": {
+ "message": "Stavka poslana u smeće"
+ },
+ "overwritePassword": {
+ "message": "Prebriši lozinku"
+ },
+ "overwritePasswordConfirmation": {
+ "message": "Sigurno želiš prebrisati trenutnu lozinku?"
+ },
+ "searchFolder": {
+ "message": "Mapa pretraživanja"
+ },
+ "searchCollection": {
+ "message": "Pretraživanje zbirke"
+ },
+ "searchType": {
+ "message": "Tip pretrage"
+ },
+ "noneFolder": {
+ "message": "Nema mape",
+ "description": "This is the folder for uncategorized items"
+ },
+ "disableAddLoginNotification": {
+ "message": "Onemogući upit za dodavanje prijave"
+ },
+ "addLoginNotificationDesc": {
+ "message": "Upit za dodavanje prijave pojavljuje se kada se otkrije prva prijava na neko web mjesto. Bitwarden će te pitatati želiš li uneseno korisničko ime i lozinku spremiti u svoj trezor."
+ },
+ "dontShowCardsCurrentTab": {
+ "message": "Ne prikazuj platne kartice"
+ },
+ "dontShowCardsCurrentTabDesc": {
+ "message": "Ne prikazuje Platne kartice iz tvog trezora prilikom prikaza stavki dostupnih za jednostavnu auto-ispunu."
+ },
+ "dontShowIdentitiesCurrentTab": {
+ "message": "Ne prikazuj Identitete"
+ },
+ "dontShowIdentitiesCurrentTabDesc": {
+ "message": "Ne prikazuje Identitete iz tvog trezora prilikom prikaza stavki dostupnih za jednostavnu auto-ispunu."
+ },
+ "clearClipboard": {
+ "message": "Očisti međuspremnik",
+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
+ },
+ "clearClipboardDesc": {
+ "message": "Automatski očisti kopirane vrijednosti iz međuspremnika.",
+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
+ },
+ "notificationAddDesc": {
+ "message": "Treba li Bitwarden zapamtiti ovu lozinku?"
+ },
+ "notificationAddSave": {
+ "message": "Da, spremi sad"
+ },
+ "notificationNeverSave": {
+ "message": "Ne pitaj više za ovu stranicu"
+ },
+ "disableChangedPasswordNotification": {
+ "message": "Onemogući upit za spremanje ažurirane lozinke"
+ },
+ "disableChangedPasswordNotificationDesc": {
+ "message": "Upit za spremanje ažurirane lozinke pojavljuje se kada se otkrije da je na nekoj web stranici unesena lozinka drugačija od one spremljene u trezoru. Bitwarden će te pitatati želiš li ažurirati lozinku u trezoru."
+ },
+ "notificationChangeDesc": {
+ "message": "Želiš li ovu lozinku ažurirati u Bitwarden-u?"
+ },
+ "notificationChangeSave": {
+ "message": "Da, ažuriraj sada"
+ },
+ "disableContextMenuItem": {
+ "message": "Onemogući kontekstualni izbornik u pregledniku"
+ },
+ "disableContextMenuItemDesc": {
+ "message": "Kontekstualni izbornik omogućuje brzi pristup korisničkim imenima i lozinkama, kao i generiranje i kopiranje generirane lozinke jednim klikom."
+ },
+ "defaultUriMatchDetection": {
+ "message": "Zadano otkrivanje URI podudaranja",
+ "description": "Default URI match detection for auto-fill."
+ },
+ "defaultUriMatchDetectionDesc": {
+ "message": "Odaberi zadani način na koji će se riješavati otkrivanje URI-ja za prijavu pri izvođenju radnji kao što je auto-ispuna."
+ },
+ "theme": {
+ "message": "Tema"
+ },
+ "themeDesc": {
+ "message": "Promijeni temu boja."
+ },
+ "dark": {
+ "message": "Tamna",
+ "description": "Dark color"
+ },
+ "light": {
+ "message": "Svijetla",
+ "description": "Light color"
+ },
+ "solarizedDark": {
+ "message": "Solarizirana Tamna",
+ "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated."
+ },
+ "exportVault": {
+ "message": "Izvezi trezor"
+ },
+ "fileFormat": {
+ "message": "Format datoteke"
+ },
+ "warning": {
+ "message": "UPOZORENJE",
+ "description": "WARNING (should stay in capitalized letters if the language permits)"
+ },
+ "confirmVaultExport": {
+ "message": "Potvrdi izvoz trezora"
+ },
+ "exportWarningDesc": {
+ "message": "Ovaj izvoz sadrži podatke trezora u nešifriranom obliku! Izvezenu datoteku se ne bi smjelo pohranjivati ili slati putem nesigurnih kanala (npr. e-poštom). Izbriši ju odmah nakon završetka korištenja."
+ },
+ "encExportKeyWarningDesc": {
+ "message": "Ovaj izvoz šifrira tvoje podatke koristeći ključ za šifriranje. Promijeniš li naknadno ključ za šifriranje, potrebno je ponovno napraviti izvoz jer nećeš moći dešifrirati ovu izvezenu datoteku."
+ },
+ "encExportAccountWarningDesc": {
+ "message": "Ključ za šifriranje jedinstven je za svakog Bitwarden korisnika, kako bi se šifrirani izvoz mogao uvesti u drugi korisnički račun."
+ },
+ "exportMasterPassword": {
+ "message": "Unesi glavnu lozinku za izvoz podataka iz trezora."
+ },
+ "shared": {
+ "message": "Dijeljeno"
+ },
+ "learnOrg": {
+ "message": "Više o organizacijama"
+ },
+ "learnOrgConfirmation": {
+ "message": "Bitwarden omogućuje dijeljenje trezora s drugima pomoću organizacijskog računa. Želiš li sada posjetiti bitwarden.com za više informacija?"
+ },
+ "moveToOrganization": {
+ "message": "Premjesti u organizaciju"
+ },
+ "share": {
+ "message": "Podijeli"
+ },
+ "movedItemToOrg": {
+ "message": "$ITEMNAME$ premješteno u $ORGNAME$",
+ "placeholders": {
+ "itemname": {
+ "content": "$1",
+ "example": "Secret Item"
+ },
+ "orgname": {
+ "content": "$2",
+ "example": "Company Name"
+ }
+ }
+ },
+ "moveToOrgDesc": {
+ "message": "Odaberi organizaciju u koju želiš premjestiti ovu stavku. Premještanje prenosi vlasništvo stavke na organizaciju. Nakon premještanja više nećeš biti izravni vlasnik ove stavke."
+ },
+ "learnMore": {
+ "message": "Saznaj više"
+ },
+ "authenticatorKeyTotp": {
+ "message": "Ključ autentifikatora (TOTP)"
+ },
+ "verificationCodeTotp": {
+ "message": "Kôd za provjeru (TOTP)"
+ },
+ "copyVerificationCode": {
+ "message": "Kopiraj kôd za provjeru"
+ },
+ "attachments": {
+ "message": "Privitci"
+ },
+ "deleteAttachment": {
+ "message": "Izbriši privitak"
+ },
+ "deleteAttachmentConfirmation": {
+ "message": "Sigurno želiš izbrisati ovaj privitak?"
+ },
+ "deletedAttachment": {
+ "message": "Izbrisani privitak"
+ },
+ "newAttachment": {
+ "message": "Dodaj novi privitak"
+ },
+ "noAttachments": {
+ "message": "Nema privitaka."
+ },
+ "attachmentSaved": {
+ "message": "Privitak je spremljen."
+ },
+ "file": {
+ "message": "Datoteka"
+ },
+ "selectFile": {
+ "message": "Odaberi datoteku."
+ },
+ "maxFileSize": {
+ "message": "Najveća veličina datoteke je 500 MB."
+ },
+ "featureUnavailable": {
+ "message": "Značajka nije dostupna"
+ },
+ "updateKey": {
+ "message": "Ne možeš koristiti ovu značajku prije nego ažuriraš ključ za šifriranje."
+ },
+ "premiumMembership": {
+ "message": "Premium članstvo"
+ },
+ "premiumManage": {
+ "message": "Upravljaj članstvom"
+ },
+ "premiumManageAlert": {
+ "message": "Svojim članstvom možeš upravljati na web trezoru. Želiš li sada posjetiti bitwarden.com?"
+ },
+ "premiumRefresh": {
+ "message": "Osvježi status članstva"
+ },
+ "premiumNotCurrentMember": {
+ "message": "Trenutno nisi premium član."
+ },
+ "premiumSignUpAndGet": {
+ "message": "Prijavi se za premium članstvo, čime dobivaš:"
+ },
+ "ppremiumSignUpStorage": {
+ "message": "1 GB šifriranog prostora za pohranu podataka."
+ },
+ "ppremiumSignUpTwoStep": {
+ "message": "Dodatne mogućnosti za prijavu u dva koraka kao što su YubiKey, FIDO U2F i Duo."
+ },
+ "ppremiumSignUpReports": {
+ "message": "Higijenu lozinki, zdravlje računa i izvještaje o krađi podatak radi zaštite svojeg trezora."
+ },
+ "ppremiumSignUpTotp": {
+ "message": "Generator TOTP kontrolnog koda (2FA) za prijave u tvom trezoru."
+ },
+ "ppremiumSignUpSupport": {
+ "message": "Prioritetnu korisničku podršku."
+ },
+ "ppremiumSignUpFuture": {
+ "message": "Sve buduće premium značajke. Uskoro više!"
+ },
+ "premiumPurchase": {
+ "message": "Kupi premium članstvo"
+ },
+ "premiumPurchaseAlert": {
+ "message": "Možeš kupiti premium članstvo na web trezoru. Želiš li sada posjetiti bitwarden.com?"
+ },
+ "premiumCurrentMember": {
+ "message": "Ti si premium član!"
+ },
+ "premiumCurrentMemberThanks": {
+ "message": "Hvala ti što podupireš Bitwarden."
+ },
+ "premiumPrice": {
+ "message": "Sve za samo $PRICE$ /godišnje!",
+ "placeholders": {
+ "price": {
+ "content": "$1",
+ "example": "$10"
+ }
+ }
+ },
+ "refreshComplete": {
+ "message": "Osvježavanje završeno"
+ },
+ "disableAutoTotpCopy": {
+ "message": "Onemogući automatsko kopiranje TOTP"
+ },
+ "disableAutoTotpCopyDesc": {
+ "message": "Ako se za prijavu koristi dvostruka autentifikacija, TOTP kontrolni kôd se automatski kopira u međuspremnik nakon auto-ispune korisničkog imena i lozinke."
+ },
+ "disableAutoBiometricsPrompt": {
+ "message": "Ne traži biometriju pri pokretanju"
+ },
+ "premiumRequired": {
+ "message": "Potrebno premium članstvo"
+ },
+ "premiumRequiredDesc": {
+ "message": "Za korištenje ove značajke potrebno je premium članstvo."
+ },
+ "enterVerificationCodeApp": {
+ "message": "Unesi 6-znamenkasti kontrolni kôd iz autentifikatorske aplikacije."
+ },
+ "enterVerificationCodeEmail": {
+ "message": "Unesi 6-znamenkasti kontrolni kôd poslan e-poštom na $EMAIL$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "example@gmail.com"
+ }
+ }
+ },
+ "verificationCodeEmailSent": {
+ "message": "E-pošta za potvrdu poslana je na $EMAIL$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "example@gmail.com"
+ }
+ }
+ },
+ "rememberMe": {
+ "message": "Zapamti me"
+ },
+ "sendVerificationCodeEmailAgain": {
+ "message": "Ponovno slanje kontrolnog koda e-poštom"
+ },
+ "useAnotherTwoStepMethod": {
+ "message": "Koristiti drugi način prijave u dva koraka"
+ },
+ "insertYubiKey": {
+ "message": "Umetni svoj YubiKey u USB priključak računala, a zatim dodirni njegovu tipku."
+ },
+ "insertU2f": {
+ "message": "Umetni svoj sigurnosni ključ u USB priključak računala. Ako ima tipku, dodirni ju."
+ },
+ "webAuthnNewTab": {
+ "message": "Nastavi na WebAuthn 2FA verifikaciju u novoj kartici."
+ },
+ "webAuthnNewTabOpen": {
+ "message": "Otvori novu karticu"
+ },
+ "webAuthnAuthenticate": {
+ "message": "Ovjeri WebAuthn"
+ },
+ "loginUnavailable": {
+ "message": "Prijava nije dostupna"
+ },
+ "noTwoStepProviders": {
+ "message": "Ovaj račun ima omogućenu prijavu u dva koraka, međutim ovaj web preglednik ne podržava niti jednog konfiguriranog pružatelja prijave u dva koraka."
+ },
+ "noTwoStepProviders2": {
+ "message": "Koristi podržani web-preglednik (npr. Chrome) i/ili dodaj dodatne usluge koje su bolje podržane u web preglednicima (npr. aplikacija Autentifikator)."
+ },
+ "twoStepOptions": {
+ "message": "Mogućnosti prijave u dva koraka"
+ },
+ "recoveryCodeDesc": {
+ "message": "Izgubljen je pristup uređaju za dvostruku autentifikaciju? Koristi svoj kôd za oporavak za onemogućavanje svih pružatelja usluga dvostruke autentifikacije na tvojem računu."
+ },
+ "recoveryCodeTitle": {
+ "message": "Kôd za oporavak"
+ },
+ "authenticatorAppTitle": {
+ "message": "Autentifikatorska aplikacija"
+ },
+ "authenticatorAppDesc": {
+ "message": "Koristi autentifikatorsku aplikaciju (npr. Authy ili Google Authentifikator) za generiranje kontrolnih kodova.",
+ "description": "'Authy' and 'Google Authenticator' are product names and should not be translated."
+ },
+ "yubiKeyTitle": {
+ "message": "YubiKey OTP sigurnosni ključ"
+ },
+ "yubiKeyDesc": {
+ "message": "Koristi YubiKey za pristup svojem računu. Radi s YubiKey 4, 4 Nano, 4C i NEO uređajima."
+ },
+ "duoDesc": {
+ "message": "Potvrdi s Duo Security pomoću aplikacije Duo Mobile, SMS-om, telefonskim pozivom ili U2F sigurnosnim ključem.",
+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
+ },
+ "duoOrganizationDesc": {
+ "message": "Potvrdi s Duo Security za svoju organizaciju pomoću aplikacije Duo Mobile, SMS-om, telefonskim pozivom ili U2F sigurnosnim ključem.",
+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
+ },
+ "webAuthnTitle": {
+ "message": "FIDO2 WebAuthn"
+ },
+ "webAuthnDesc": {
+ "message": "Koristi WebAuthn sigurnosni ključ za pristup svojem računu."
+ },
+ "emailTitle": {
+ "message": "E-pošta"
+ },
+ "emailDesc": {
+ "message": "Verifikacijski kodovi će biti poslani e-poštom."
+ },
+ "selfHostedEnvironment": {
+ "message": "Vlastito hosting okruženje"
+ },
+ "selfHostedEnvironmentFooter": {
+ "message": "Navedi osnovni URL svoje lokalno smještene Bitwarden instalacije."
+ },
+ "customEnvironment": {
+ "message": "Prilagođeno okruženje"
+ },
+ "customEnvironmentFooter": {
+ "message": "Za napredne korisnike. Samostalno možeš odrediti osnovni URL svake usluge."
+ },
+ "baseUrl": {
+ "message": "URL poslužitelja"
+ },
+ "apiUrl": {
+ "message": "URL API poslužitelja"
+ },
+ "webVaultUrl": {
+ "message": "URL poslužitelja web trezora"
+ },
+ "identityUrl": {
+ "message": "URL id poslužitelja"
+ },
+ "notificationsUrl": {
+ "message": "URL poslužitelja obavijesti"
+ },
+ "iconsUrl": {
+ "message": "URL poslužitelja ikona"
+ },
+ "environmentSaved": {
+ "message": "URL-ovi okoline su spremljeni."
+ },
+ "enableAutoFillOnPageLoad": {
+ "message": "Omogući auto-ispunu nakon učitavanja stranice"
+ },
+ "enableAutoFillOnPageLoadDesc": {
+ "message": "Ako se otkrije obrazac za prijavu, samostalno auto-ispuni kada se web stranica učita."
+ },
+ "experimentalFeature": {
+ "message": "Ovo je trenutno eksperimentalna značajka. Koristi na vlastitu odgovornost."
+ },
+ "defaultAutoFillOnPageLoad": {
+ "message": "Zadana postvaka Auto-ispune za prijave"
+ },
+ "defaultAutoFillOnPageLoadDesc": {
+ "message": "Nakon omogućavanja Auto-ispune kod učitavanja stranice, moguće je uključiti/isključiti ovu značajku za svaku pojedinu prijavu. Ovo je zadana postavka za prijave koje nisu pojedinčano određene."
+ },
+ "itemAutoFillOnPageLoad": {
+ "message": "Auto-ispuna kod učitavanja stranice (ako je uključeno u Postavkama)"
+ },
+ "autoFillOnPageLoadUseDefault": {
+ "message": "Koristi zadane postavke"
+ },
+ "autoFillOnPageLoadYes": {
+ "message": "Auto-ispuna kod učitavanja"
+ },
+ "autoFillOnPageLoadNo": {
+ "message": "Ne koristi Auto-ispunu kod učitavanja"
+ },
+ "commandOpenPopup": {
+ "message": "Otvori iskočni prozor trezora"
+ },
+ "commandOpenSidebar": {
+ "message": "Otvori trezor u bočnoj traci"
+ },
+ "commandAutofillDesc": {
+ "message": "Auto-ispuni zadnju korištenu prijavu za trenutnu web stranicu."
+ },
+ "commandGeneratePasswordDesc": {
+ "message": "Generiraj i kopiraj novu nasumičnu lozinku u međuspremnik."
+ },
+ "commandLockVaultDesc": {
+ "message": "Zaključaj trezor"
+ },
+ "privateModeMessage": {
+ "message": "Nažalost, ovaj prozor nije dostupan u privatnom načinu ovog preglednika."
+ },
+ "customFields": {
+ "message": "Prilagođena polja"
+ },
+ "copyValue": {
+ "message": "Kopiraj vrijednost"
+ },
+ "value": {
+ "message": "Vrijednost"
+ },
+ "newCustomField": {
+ "message": "Novo prilagođeno polje"
+ },
+ "dragToSort": {
+ "message": "Povuci za sortiranje"
+ },
+ "cfTypeText": {
+ "message": "Tekst"
+ },
+ "cfTypeHidden": {
+ "message": "Skriveno"
+ },
+ "cfTypeBoolean": {
+ "message": "Boolean"
+ },
+ "popup2faCloseMessage": {
+ "message": "Ako klikneš izvan iskočnog prozora, za provjeru kontrolnog kôda iz e-pošte, on će se zatvoriti. Želiš li ovaj iskočni prozor otvoriti u novom prozoru kako se ne bi zatvorio?"
+ },
+ "popupU2fCloseMessage": {
+ "message": "Ovaj preglednik ne može obraditi U2F zahtjeve u ovom iskočnom prozoru. Želiš li otvoriti ovaj iskočni prozor u novom prozoru za prijavu putem U2F?"
+ },
+ "disableFavicon": {
+ "message": "Onemogući ikone web mjesta"
+ },
+ "disableFaviconDesc": {
+ "message": "Prepoznatljive ikone web mjesta prikazuju se pored prijava u tvom trezoru."
+ },
+ "disableBadgeCounter": {
+ "message": "Onemogući brojač znački"
+ },
+ "disableBadgeCounterDesc": {
+ "message": "Brojač znački prikazuje koliko u tvojem trezoru ima spremljenih prijava za trenutnu stranicu."
+ },
+ "cardholderName": {
+ "message": "Vlasnik kartice"
+ },
+ "number": {
+ "message": "Broj"
+ },
+ "brand": {
+ "message": "Vrsta kartice"
+ },
+ "expirationMonth": {
+ "message": "Mjesec isteka"
+ },
+ "expirationYear": {
+ "message": "Godina isteka"
+ },
+ "expiration": {
+ "message": "Istek"
+ },
+ "january": {
+ "message": "siječanj"
+ },
+ "february": {
+ "message": "veljača"
+ },
+ "march": {
+ "message": "ožujak"
+ },
+ "april": {
+ "message": "travanj"
+ },
+ "may": {
+ "message": "svibanj"
+ },
+ "june": {
+ "message": "lipanj"
+ },
+ "july": {
+ "message": "srpanj"
+ },
+ "august": {
+ "message": "kolovoz"
+ },
+ "september": {
+ "message": "rujan"
+ },
+ "october": {
+ "message": "listopad"
+ },
+ "november": {
+ "message": "studeni"
+ },
+ "december": {
+ "message": "prosinac"
+ },
+ "securityCode": {
+ "message": "Kontrolni broj"
+ },
+ "ex": {
+ "message": "npr."
+ },
+ "title": {
+ "message": "Titula"
+ },
+ "mr": {
+ "message": "g."
+ },
+ "mrs": {
+ "message": "gđa."
+ },
+ "ms": {
+ "message": "gđica."
+ },
+ "dr": {
+ "message": "dr."
+ },
+ "firstName": {
+ "message": "Ime"
+ },
+ "middleName": {
+ "message": "Srednje ime"
+ },
+ "lastName": {
+ "message": "Prezime"
+ },
+ "identityName": {
+ "message": "Ime identiteta"
+ },
+ "company": {
+ "message": "Tvrtka"
+ },
+ "ssn": {
+ "message": "Broj socijalnog osiguranja"
+ },
+ "passportNumber": {
+ "message": "Broj putovnice"
+ },
+ "licenseNumber": {
+ "message": "Broj vozačke dozvole"
+ },
+ "email": {
+ "message": "E-pošta"
+ },
+ "phone": {
+ "message": "Telefon"
+ },
+ "address": {
+ "message": "Adresa"
+ },
+ "address1": {
+ "message": "Adresa 1"
+ },
+ "address2": {
+ "message": "Adresa 2"
+ },
+ "address3": {
+ "message": "Adresa 3"
+ },
+ "cityTown": {
+ "message": "Grad / Mjesto"
+ },
+ "stateProvince": {
+ "message": "Država / Pokrajina"
+ },
+ "zipPostalCode": {
+ "message": "Poštanski broj"
+ },
+ "country": {
+ "message": "Zemlja"
+ },
+ "type": {
+ "message": "Vrsta"
+ },
+ "typeLogin": {
+ "message": "Prijava"
+ },
+ "typeLogins": {
+ "message": "Prijave"
+ },
+ "typeSecureNote": {
+ "message": "Sigurna bilješka"
+ },
+ "typeCard": {
+ "message": "Platna kartica"
+ },
+ "typeIdentity": {
+ "message": "Identitet"
+ },
+ "passwordHistory": {
+ "message": "Povijest"
+ },
+ "back": {
+ "message": "Natrag"
+ },
+ "collections": {
+ "message": "Zbirke"
+ },
+ "favorites": {
+ "message": "Favoriti"
+ },
+ "popOutNewWindow": {
+ "message": "Otvori u novom prozoru"
+ },
+ "refresh": {
+ "message": "Osvježi"
+ },
+ "cards": {
+ "message": "Platne kartice"
+ },
+ "identities": {
+ "message": "Identiteti"
+ },
+ "logins": {
+ "message": "Prijave"
+ },
+ "secureNotes": {
+ "message": "Sigurne bilješke"
+ },
+ "clear": {
+ "message": "Očisti",
+ "description": "To clear something out. example: To clear browser history."
+ },
+ "checkPassword": {
+ "message": "Provjeri je li lozinka bila ukradena."
+ },
+ "passwordExposed": {
+ "message": "Ova lozinka je otkrivena $VALUE$ put(a) prilikom krađe podataka. Trebalo bi ju promijeniti.",
+ "placeholders": {
+ "value": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "passwordSafe": {
+ "message": "Lozinka nije pronađena niti u jednoj krađi podataka. Sigurna je za korištenje."
+ },
+ "baseDomain": {
+ "message": "Primarna domena"
+ },
+ "host": {
+ "message": "Host",
+ "description": "A URL's host value. For example, the host of https://sub.domain.com:443 is 'sub.domain.com:443'."
+ },
+ "exact": {
+ "message": "Točno"
+ },
+ "startsWith": {
+ "message": "Počinje s"
+ },
+ "regEx": {
+ "message": "Regularni izraz",
+ "description": "A programming term, also known as 'RegEx'."
+ },
+ "matchDetection": {
+ "message": "Otkrivanje podudaranja",
+ "description": "URI match detection for auto-fill."
+ },
+ "defaultMatchDetection": {
+ "message": "Zadano otkrivanje podudaranja",
+ "description": "Default URI match detection for auto-fill."
+ },
+ "toggleOptions": {
+ "message": "Uključi/isključi opcije"
+ },
+ "toggleCurrentUris": {
+ "message": "Uključi/Isključi trenutne URI",
+ "description": "Toggle the display of the URIs of the currently open tabs in the browser."
+ },
+ "currentUri": {
+ "message": "Trenutni URI",
+ "description": "The URI of one of the current open tabs in the browser."
+ },
+ "organization": {
+ "message": "Organizacija",
+ "description": "An entity of multiple related people (ex. a team or business organization)."
+ },
+ "types": {
+ "message": "Vrste"
+ },
+ "allItems": {
+ "message": "Sve stavke"
+ },
+ "noPasswordsInList": {
+ "message": "Nema lozinki na popisu."
+ },
+ "remove": {
+ "message": "Ukloni"
+ },
+ "default": {
+ "message": "Zadano"
+ },
+ "dateUpdated": {
+ "message": "Ažurirano",
+ "description": "ex. Date this item was updated"
+ },
+ "datePasswordUpdated": {
+ "message": "Lozinka ažurirana",
+ "description": "ex. Date this password was updated"
+ },
+ "neverLockWarning": {
+ "message": "Sigurno želiš koristiti opciju „Nikada”? Postavljanje opcija zaključavanja na „Nikada” pohranjuje šifru tvojeg trezora na tvom uređaju. Ako koristiš ovu opciju, trebali bi osigurati da je uređaj pravilno zaštićen."
+ },
+ "noOrganizationsList": {
+ "message": "Ne pripadaš niti jednoj organizaciji. Organizacije omogućuju sigurno dijeljenje stavki s drugim korisnicima."
+ },
+ "noCollectionsInList": {
+ "message": "Nema zbirki za prikaz."
+ },
+ "ownership": {
+ "message": "Vlasništvo"
+ },
+ "whoOwnsThisItem": {
+ "message": "Tko je vlasnik ove stavke?"
+ },
+ "strong": {
+ "message": "Jaka",
+ "description": "ex. A strong password. Scale: Weak -> Good -> Strong"
+ },
+ "good": {
+ "message": "Dobra",
+ "description": "ex. A good password. Scale: Weak -> Good -> Strong"
+ },
+ "weak": {
+ "message": "Slaba",
+ "description": "ex. A weak password. Scale: Weak -> Good -> Strong"
+ },
+ "weakMasterPassword": {
+ "message": "Slaba glavna lozinka"
+ },
+ "weakMasterPasswordDesc": {
+ "message": "Odabrana glavna lozinka je slaba. Trebaš koristiti jaču glavnu lozinku (ili frazu) kako bi tvoj Bitwarden račun bio pravilno zaštićen. Sigurno želiš koristiti ovakvu, slabu glavnu lozinku?"
+ },
+ "pin": {
+ "message": "PIN",
+ "description": "PIN code. Ex. The short code (often numeric) that you use to unlock a device."
+ },
+ "unlockWithPin": {
+ "message": "Otključaj PIN-om"
+ },
+ "setYourPinCode": {
+ "message": "Postavi svoj PIN kôd za otključavanje Bitwardena. Postavke PIN-a se resetiraju ako se potpuno odjaviš iz aplikacije."
+ },
+ "pinRequired": {
+ "message": "Potreban je PIN."
+ },
+ "invalidPin": {
+ "message": "Nerispravan PIN."
+ },
+ "verifyPin": {
+ "message": "Potvrdi PIN"
+ },
+ "yourVaultIsLockedPinCode": {
+ "message": "Tvoj trezor je zaključan. Potvrdi PIN-om za nastavak."
+ },
+ "unlockWithBiometrics": {
+ "message": "Otključaj biometrijom"
+ },
+ "awaitDesktop": {
+ "message": "Čekanje potvrde iz desktop aplikacije"
+ },
+ "awaitDesktopDesc": {
+ "message": "Potvrdi korištenje biometrije u Bitwarden desktop aplikaciji za korištenje biometrije u pregledniku."
+ },
+ "lockWithMasterPassOnRestart": {
+ "message": "Zaključaj glavnom lozinkom kod svakog pokretanja preglednika"
+ },
+ "selectOneCollection": {
+ "message": "Moraš odabrati barem jednu zbirku."
+ },
+ "cloneItem": {
+ "message": "Kloniraj stavku"
+ },
+ "clone": {
+ "message": "Kloniraj"
+ },
+ "passwordGeneratorPolicyInEffect": {
+ "message": "Jedno ili više pravila organizacije utječe na postavke generatora."
+ },
+ "vaultTimeoutAction": {
+ "message": "Nakon isteka trezora"
+ },
+ "lock": {
+ "message": "Zaključaj",
+ "description": "Verb form: to make secure or inaccesible by"
+ },
+ "trash": {
+ "message": "Smeće",
+ "description": "Noun: a special folder to hold deleted items"
+ },
+ "searchTrash": {
+ "message": "Pretraži smeće"
+ },
+ "permanentlyDeleteItem": {
+ "message": "Trajno izbriši stavku"
+ },
+ "permanentlyDeleteItemConfirmation": {
+ "message": "Želiš li zaista trajno izbrisati ovu stavku?"
+ },
+ "permanentlyDeletedItem": {
+ "message": "Trajno izbrisana stavka"
+ },
+ "restoreItem": {
+ "message": "Vrati stavku"
+ },
+ "restoreItemConfirmation": {
+ "message": "Sigurno želiš vratiti ovu stavku?"
+ },
+ "restoredItem": {
+ "message": "Stavka vraćena"
+ },
+ "vaultTimeoutLogOutConfirmation": {
+ "message": "Odjava će ukloniti pristup tvom trezoru i zahtijevati mrežnu potvrdu identiteta nakon isteka vremenske neaktivnosti. Sigurno želiš koristiti ovu postavku?"
+ },
+ "vaultTimeoutLogOutConfirmationTitle": {
+ "message": "Potvrda akcije vremenske neaktivnosti"
+ },
+ "autoFillAndSave": {
+ "message": "Auto-ispuni i spremi"
+ },
+ "autoFillSuccessAndSavedUri": {
+ "message": "Auto-ispunjena stavka i spremanje URI"
+ },
+ "autoFillSuccess": {
+ "message": "Auto-ispunjena stavka"
+ },
+ "setMasterPassword": {
+ "message": "Postavi glavnu lozinku"
+ },
+ "masterPasswordPolicyInEffect": {
+ "message": "Jedno ili više pravila organizacije zahtijeva da tvoja glavna lozinka ispunjava sljedeće uvjete:"
+ },
+ "policyInEffectMinComplexity": {
+ "message": "Minimalna ocjena složenosti od $SCORE$",
+ "placeholders": {
+ "score": {
+ "content": "$1",
+ "example": "4"
+ }
+ }
+ },
+ "policyInEffectMinLength": {
+ "message": "Duljina najmanje $LENGTH$",
+ "placeholders": {
+ "length": {
+ "content": "$1",
+ "example": "14"
+ }
+ }
+ },
+ "policyInEffectUppercase": {
+ "message": "Sadrži jedno ili više velikih slova"
+ },
+ "policyInEffectLowercase": {
+ "message": "Sadrži jedno ili više malih slova"
+ },
+ "policyInEffectNumbers": {
+ "message": "Sadrži jedan ili više brojeva"
+ },
+ "policyInEffectSpecial": {
+ "message": "Sadrži jedan ili više sljedećih posebnih znakova: $CHARS$",
+ "placeholders": {
+ "chars": {
+ "content": "$1",
+ "example": "!@#$%^&*"
+ }
+ }
+ },
+ "masterPasswordPolicyRequirementsNotMet": {
+ "message": "Tvoja nova glavna lozinka ne ispunjava zahtjeve."
+ },
+ "acceptPolicies": {
+ "message": "Označavanjem ove kućice slažete se sa sljedećim:"
+ },
+ "acceptPoliciesError": {
+ "message": "Uvjeti korištenja i Pravila privatnosti nisu prihvaćeni."
+ },
+ "termsOfService": {
+ "message": "Uvjeti korištenja"
+ },
+ "privacyPolicy": {
+ "message": "Pravila privatnosti"
+ },
+ "hintEqualsPassword": {
+ "message": "Podsjetnik za lozinku ne može biti isti kao lozinka."
+ },
+ "ok": {
+ "message": "U redu"
+ },
+ "desktopSyncVerificationTitle": {
+ "message": "Potvrda desktop sinkronizacije"
+ },
+ "desktopIntegrationVerificationText": {
+ "message": "Provjeri da desktop aplikacija prikazuje ovaj otisak:"
+ },
+ "desktopIntegrationDisabledTitle": {
+ "message": "Integracija s preglednikom nije omogućena"
+ },
+ "desktopIntegrationDisabledDesc": {
+ "message": "Integracija s preglednikom nije omogućena u Bitwarden desktop aplikaciji. Omogući integraciju u postavkama desktop aplikacije."
+ },
+ "startDesktopTitle": {
+ "message": "Pokreni Bitwarden dekstop aplikaciju"
+ },
+ "startDesktopDesc": {
+ "message": "Bitwarden desktop aplikacija mora biti pokrenuta prije korištenja ove funkcije."
+ },
+ "errorEnableBiometricTitle": {
+ "message": "Nije moguće omogućiti biometriju"
+ },
+ "errorEnableBiometricDesc": {
+ "message": "Desktop aplikacija je poništila akciju"
+ },
+ "nativeMessagingInvalidEncryptionDesc": {
+ "message": "Desktop aplikacija je onemogućila sigurni komunikacijski kanal. Molimo, pokušaj ponovno."
+ },
+ "nativeMessagingInvalidEncryptionTitle": {
+ "message": "Desktop komunikacija prekinuta"
+ },
+ "nativeMessagingWrongUserDesc": {
+ "message": "Desktop aplikacija je prijavljena, ali s drugim korisničkim računom. Provjeri da obje aplikacije koriste isti korisnički račun."
+ },
+ "nativeMessagingWrongUserTitle": {
+ "message": "Pogrešan korisnički račun"
+ },
+ "biometricsNotEnabledTitle": {
+ "message": "Biometrija nije omogućena"
+ },
+ "biometricsNotEnabledDesc": {
+ "message": "Biometrija preglednika zahtijeva prethodno omogućenu biometriju u Bitwarden desktop aplikaciji."
+ },
+ "biometricsNotSupportedTitle": {
+ "message": "Biometrija nije podržana"
+ },
+ "biometricsNotSupportedDesc": {
+ "message": "Biometrija preglednika nije podržana na ovom uređaju."
+ },
+ "nativeMessaginPermissionErrorTitle": {
+ "message": "Dopuštenje nije dano"
+ },
+ "nativeMessaginPermissionErrorDesc": {
+ "message": "Bez odobrenja za komunikaciju s Bitwarden Desktop aplikacijom nije moguće korištenje biometrije u proširenju preglednika."
+ },
+ "nativeMessaginPermissionSidebarTitle": {
+ "message": "Greška zahtjeva dozvole"
+ },
+ "nativeMessaginPermissionSidebarDesc": {
+ "message": "Ovu ranju nije moguće napraviti u bočnom meniju. Pokušaj ponovno u iskočnom prozoru."
+ },
+ "personalOwnershipSubmitError": {
+ "message": "Pravila tvrtke onemogućuju spremanje stavki u osobni trezor. Promijeni vlasništvo stavke na tvrtku i odaberi dostupnu Zbirku."
+ },
+ "personalOwnershipPolicyInEffect": {
+ "message": "Pravila organizacije utječu na tvoje mogućnosti vlasništva. "
+ },
+ "excludedDomains": {
+ "message": "Izuzete domene"
+ },
+ "excludedDomainsDesc": {
+ "message": "Bitwarden neće pitati treba li spremiti prijavne podatke za ove domene. Za primjenu promjena, potrebno je osvježiti stranicu."
+ },
+ "excludedDomainsInvalidDomain": {
+ "message": "$DOMAIN$ nije valjana domena",
+ "placeholders": {
+ "domain": {
+ "content": "$1",
+ "example": "googlecom"
+ }
+ }
+ },
+ "send": {
+ "message": "Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "searchSends": {
+ "message": "Pretraži Sendove",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "addSend": {
+ "message": "Dodaj Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTypeText": {
+ "message": "Tekst"
+ },
+ "sendTypeFile": {
+ "message": "Datoteka"
+ },
+ "allSends": {
+ "message": "Svi Sendovi",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "maxAccessCountReached": {
+ "message": "Dostignut najveći broj pristupanja"
+ },
+ "expired": {
+ "message": "Isteklo"
+ },
+ "pendingDeletion": {
+ "message": "Čeka brisanje"
+ },
+ "passwordProtected": {
+ "message": "Zaštićeno lozinkom"
+ },
+ "copySendLink": {
+ "message": "Kopiraj vezu na Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "removePassword": {
+ "message": "Ukloni lozinku"
+ },
+ "delete": {
+ "message": "Izbriši"
+ },
+ "removedPassword": {
+ "message": "Lozinka uklonjena"
+ },
+ "deletedSend": {
+ "message": "Send izbrisan",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendLink": {
+ "message": "Veza na Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "disabled": {
+ "message": "Onemogućeno"
+ },
+ "removePasswordConfirmation": {
+ "message": "Sigurno želiš ukloniti lozinku?"
+ },
+ "deleteSend": {
+ "message": "Izbriši Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "deleteSendConfirmation": {
+ "message": "Sigurno želiš izbrisati ovaj Send?",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "editSend": {
+ "message": "Uredi Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTypeHeader": {
+ "message": "Koja je ovo vrsta Senda?",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendNameDesc": {
+ "message": "Nadimak za ovaj Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendFileDesc": {
+ "message": "Datoteka koju želiš poslati"
+ },
+ "deletionDate": {
+ "message": "Obriši za"
+ },
+ "deletionDateDesc": {
+ "message": "Send će nakon navedenog vremena biti trajno izbrisan.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "expirationDate": {
+ "message": "Vremenski ograničeni pristup"
+ },
+ "expirationDateDesc": {
+ "message": "Pristup ovom Sendu neće biti moguć nakon navednog roka.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "oneDay": {
+ "message": "1 dan"
+ },
+ "days": {
+ "message": "$DAYS$ dana",
+ "placeholders": {
+ "days": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "custom": {
+ "message": "Prilagođeno"
+ },
+ "maximumAccessCount": {
+ "message": "Ograničeni broj pristupanja"
+ },
+ "maximumAccessCountDesc": {
+ "message": "Ako je određen, ovom Sendu će se moći pristupiti samo ograničeni broj puta.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendPasswordDesc": {
+ "message": "Neobavezno zahtijevaj korisnika lozinku za pristup ovom Sendu.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendNotesDesc": {
+ "message": "Privatne bilješke o Sendu.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendDisableDesc": {
+ "message": "Onemogući ovaj Send da mu nitko ne može pristupiti.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendShareDesc": {
+ "message": "Kopiraj vezu na Send nakon spremanja",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTextDesc": {
+ "message": "Tekst kojeg želiš poslati"
+ },
+ "sendHideText": {
+ "message": "Sakrij tekst ovog Senda.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "currentAccessCount": {
+ "message": "Trenutni broj pristupanja"
+ },
+ "createSend": {
+ "message": "Stvori novi Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "newPassword": {
+ "message": "Nova lozinka"
+ },
+ "sendDisabled": {
+ "message": "Send onemogućen",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendDisabledWarning": {
+ "message": "Pravila tvrtke omogućuju brisanje samo postojećeg Senda",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "createdSend": {
+ "message": "Send stvoren",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "editedSend": {
+ "message": "Send uređen",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendLinuxChromiumFileWarning": {
+ "message": "Za odabir datoteke, otvori proširenje u bočnoj traci (ako je moguće) ili u iskočnom prozoru klikom na ovu poruku."
+ },
+ "sendFirefoxFileWarning": {
+ "message": "Za odabir datoteke u Firefoxu, otvori proširenje u bočnoj traci ili otvori iskočni prozor klikom na ovau poruku."
+ },
+ "sendSafariFileWarning": {
+ "message": "Za odabir datoteke u Safariju, otvori iskočni prozor klikom na ovu poruku."
+ },
+ "sendFileCalloutHeader": {
+ "message": "Prije početka"
+ },
+ "sendFirefoxCustomDatePopoutMessage1": {
+ "message": "Biranje datuma na kalendaru",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read '**To use a calendar style date picker ** click here to pop out your window.'"
+ },
+ "sendFirefoxCustomDatePopoutMessage2": {
+ "message": "klikni ovjde",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker **click here** to pop out your window.'"
+ },
+ "sendFirefoxCustomDatePopoutMessage3": {
+ "message": "za iskočni prozor",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker click here **to pop out your window.**'"
+ },
+ "expirationDateIsInvalid": {
+ "message": "Navedeni rok isteka nije valjan."
+ },
+ "deletionDateIsInvalid": {
+ "message": "Navedeni datum brisanja nije valjan."
+ },
+ "expirationDateAndTimeRequired": {
+ "message": "Potrebno je unijeti datum i vrijeme isteka."
+ },
+ "deletionDateAndTimeRequired": {
+ "message": "Potrebno je unijeti datum i vrijeme brisanja."
+ },
+ "dateParsingError": {
+ "message": "Došlo je do greške kod spremanja vaših datuma isteka i brisanja."
+ },
+ "hideEmail": {
+ "message": "Sakrij moju adresu e-pošte od primatelja."
+ },
+ "sendOptionsPolicyInEffect": {
+ "message": "Jedno ili više pravila organizacije utječe na postavke Senda."
+ },
+ "passwordPrompt": {
+ "message": "Ponovno zatraži glavnu lozinku"
+ },
+ "passwordConfirmation": {
+ "message": "Potvrda glavne lozinke"
+ },
+ "passwordConfirmationDesc": {
+ "message": "Ova radnja je zaštićena. Za nastavak i potvrdu identiteta, unesi svoju glavnu lozinku."
+ },
+ "emailVerificationRequired": {
+ "message": "Potrebna je potvrda e-pošte"
+ },
+ "emailVerificationRequiredDesc": {
+ "message": "Moraš ovjeriti svoju e-poštu u mrežnom trezoru za koritšenje ove značajke."
+ },
+ "updatedMasterPassword": {
+ "message": "Glavna lozinka ažurirana"
+ },
+ "updateMasterPassword": {
+ "message": "Ažuriraj glavnu lozinku"
+ },
+ "updateMasterPasswordWarning": {
+ "message": "Tvoju glavnu lozinku je nedavno promijenio administrator tvoje organizacije. Za pristup trezoru, potrebno je ažurirati glavnu lozinku, što će te odjaviti iz trenutne sesije, te ćeš se morati ponovno prijaviti. Aktivne sesije na drugim uređajima mogu ostati aktivne još sat vremena."
+ },
+ "resetPasswordPolicyAutoEnroll": {
+ "message": "Automatsko učlanjenje"
+ },
+ "resetPasswordAutoEnrollInviteWarning": {
+ "message": "Pravilo ove organizacija automatski će te učlaniti u ponovno postavljanje lozinke. Učlanjenje će omogućiti administratorima organizacije promjenu tvoje glavne lozinke."
+ },
+ "selectFolder": {
+ "message": "Odaberi mapu..."
+ },
+ "ssoCompleteRegistration": {
+ "message": "Za dovršetak jedinstvene prijave na razini tvrtke (SSO), postavi glavnu lozinku za pristup i zaštitu tvog trezora."
+ },
+ "hours": {
+ "message": "sat(i)"
+ },
+ "minutes": {
+ "message": "minuta"
+ },
+ "vaultTimeoutPolicyInEffect": {
+ "message": "Pravilo tvoje organizacije utječe na istek trezora. Najveće dozvoljeno vrijeme isteka je $HOURS$:$MINUTES$ h.",
+ "placeholders": {
+ "hours": {
+ "content": "$1",
+ "example": "5"
+ },
+ "minutes": {
+ "content": "$2",
+ "example": "5"
+ }
+ }
+ },
+ "vaultTimeoutToLarge": {
+ "message": "Vrijeme isteka premašuje ograničenje koju je postavila tvoja organizacija."
+ },
+ "vaultExportDisabled": {
+ "message": "Izvoz trezora onemogućen"
+ },
+ "personalVaultExportPolicyInEffect": {
+ "message": "Jedno ili više pravila organizacija onemogućuje izvoz osobnog trezora. "
+ },
+ "copyCustomFieldNameInvalidElement": {
+ "message": "Nije moguće identificirati valjani element formulara. Pokušaj provjeriti HTML."
+ },
+ "copyCustomFieldNameNotUnique": {
+ "message": "Nije nađen jedinstveni identifikator."
+ }
+}
diff --git a/src/iOS.Safari/Resources/_locales/hu/messages.json b/src/iOS.Safari/Resources/_locales/hu/messages.json
new file mode 100644
index 000000000..564f0a273
--- /dev/null
+++ b/src/iOS.Safari/Resources/_locales/hu/messages.json
@@ -0,0 +1,1817 @@
+{
+ "appName": {
+ "message": "Bitwarden"
+ },
+ "extName": {
+ "message": "Bitwarden - Ingyenes jelszókezelő",
+ "description": "Extension name, MUST be less than 40 characters (Safari restriction)"
+ },
+ "extDesc": {
+ "message": "Egy biztonságos és ingyenes jelszókezelő az összes eszközre.",
+ "description": "Extension description"
+ },
+ "loginOrCreateNewAccount": {
+ "message": "Bejelentkezés vagy új fiók létrehozása a biztonsági széf eléréséhez."
+ },
+ "createAccount": {
+ "message": "Fiók létrehozása"
+ },
+ "login": {
+ "message": "Bejelentkezés"
+ },
+ "enterpriseSingleSignOn": {
+ "message": "Vállalati önálló bejelentkezés"
+ },
+ "cancel": {
+ "message": "Mégse"
+ },
+ "close": {
+ "message": "Bezár"
+ },
+ "submit": {
+ "message": "Beküld"
+ },
+ "emailAddress": {
+ "message": "Email cím"
+ },
+ "masterPass": {
+ "message": "Mesterjelszó"
+ },
+ "masterPassDesc": {
+ "message": "A mesterjelszó az a jelszó amit a széfed eléréséhez fogsz használni. Nagyon fontos, hogy ne felejtsd el a mesterjelszavad, mivel nincs lehetőséged visszaállítani még ha elfejeted is."
+ },
+ "masterPassHintDesc": {
+ "message": "A mesterjelszó emlékeztető segíthet emlékezni a jelszavadra ha elfejetetted volna."
+ },
+ "reTypeMasterPass": {
+ "message": "A mesterjelszó ismételt begépelése"
+ },
+ "masterPassHint": {
+ "message": "Mesterjelszó emlékeztető (nem kötelező)"
+ },
+ "tab": {
+ "message": "Fül"
+ },
+ "myVault": {
+ "message": "Saját széf"
+ },
+ "tools": {
+ "message": "Eszközök"
+ },
+ "settings": {
+ "message": "Beállítások"
+ },
+ "currentTab": {
+ "message": "Jelenlegi fül"
+ },
+ "copyPassword": {
+ "message": "Jelszó másolása"
+ },
+ "copyNote": {
+ "message": "Jegyzet másolása"
+ },
+ "copyUri": {
+ "message": "URI másolása"
+ },
+ "copyUsername": {
+ "message": "Felhasználónév másolása"
+ },
+ "copyNumber": {
+ "message": "Szám másolása"
+ },
+ "copySecurityCode": {
+ "message": "Biztonsági kód másolása"
+ },
+ "autoFill": {
+ "message": "Automatikus kitöltés"
+ },
+ "generatePasswordCopied": {
+ "message": "Jelszó generálás (másolt)"
+ },
+ "copyElementIdentifier": {
+ "message": "Egyedi mezőnév másolása"
+ },
+ "noMatchingLogins": {
+ "message": "Nincsenek egyező bejelentkezések."
+ },
+ "vaultLocked": {
+ "message": "A széf zárolva van."
+ },
+ "vaultLoggedOut": {
+ "message": "A széf kijelentkezésre került."
+ },
+ "autoFillInfo": {
+ "message": "Nincsenek elérhető bejelentkezések ehhez a fülhöz ezért az automatikus kitöltés nem működik."
+ },
+ "addLogin": {
+ "message": "Bejelentkezés hozzáadása"
+ },
+ "addItem": {
+ "message": "Elem hozzáadása"
+ },
+ "passwordHint": {
+ "message": "Jelszó emlékeztető"
+ },
+ "enterEmailToGetHint": {
+ "message": "Írd be a felhasználóhoz kötött e-mail címed, hogy megkapd a mesterjelszó emlékeztetőt."
+ },
+ "getMasterPasswordHint": {
+ "message": "Kérj mesterjelszó emlékeztetőt"
+ },
+ "continue": {
+ "message": "Folytatás"
+ },
+ "verificationCode": {
+ "message": "Ellenőrző kód"
+ },
+ "account": {
+ "message": "Felhasználó"
+ },
+ "changeMasterPassword": {
+ "message": "Mesterjelszó módosítása"
+ },
+ "fingerprintPhrase": {
+ "message": "Ujjlenyomat kifejezés",
+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
+ },
+ "yourAccountsFingerprint": {
+ "message": "Fiók ujjlenyomat kifejezés",
+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
+ },
+ "twoStepLogin": {
+ "message": "Kétlépcsős bejelentkezés"
+ },
+ "logOut": {
+ "message": "Kijelentkezés"
+ },
+ "about": {
+ "message": "Névjegy"
+ },
+ "version": {
+ "message": "Verzió"
+ },
+ "save": {
+ "message": "Mentés"
+ },
+ "move": {
+ "message": "Áthelyezés"
+ },
+ "addFolder": {
+ "message": "Mappa hozzáadása"
+ },
+ "name": {
+ "message": "Név"
+ },
+ "editFolder": {
+ "message": "Mappa szerkesztése"
+ },
+ "deleteFolder": {
+ "message": "Mappa törlése"
+ },
+ "folders": {
+ "message": "Mappák"
+ },
+ "noFolders": {
+ "message": "Nincsenek megjeleníthető mappák."
+ },
+ "helpFeedback": {
+ "message": "Súgó és visszajelzés"
+ },
+ "sync": {
+ "message": "Szinkronizálás"
+ },
+ "syncVaultNow": {
+ "message": "Széf szinkronizálása most"
+ },
+ "lastSync": {
+ "message": "Utolsó szinkronizálás:"
+ },
+ "passGen": {
+ "message": "Jelszó generátor"
+ },
+ "generator": {
+ "message": "Generátor",
+ "description": "Short for 'Password Generator'."
+ },
+ "passGenInfo": {
+ "message": "Automatikusan létrehoz erős, egyedi jelszavakat a bejelentkezéseidhez."
+ },
+ "bitWebVault": {
+ "message": "Bitwarden webes széf"
+ },
+ "importItems": {
+ "message": "Elemek importálása"
+ },
+ "select": {
+ "message": "Kiválaszt"
+ },
+ "generatePassword": {
+ "message": "Jelszó generálása"
+ },
+ "regeneratePassword": {
+ "message": "Jelszó újragenerálása"
+ },
+ "options": {
+ "message": "Beállítások"
+ },
+ "length": {
+ "message": "Hossz"
+ },
+ "numWords": {
+ "message": "Szavak száma"
+ },
+ "wordSeparator": {
+ "message": "Szó elválasztó"
+ },
+ "capitalize": {
+ "message": "Nagy kezdőbetű",
+ "description": "Make the first letter of a work uppercase."
+ },
+ "includeNumber": {
+ "message": "Szám is"
+ },
+ "minNumbers": {
+ "message": "Minimális szám"
+ },
+ "minSpecial": {
+ "message": "Minimális speciális"
+ },
+ "avoidAmbChar": {
+ "message": "Félreérthető karakterek mellőzése"
+ },
+ "searchVault": {
+ "message": "Keresés a széfben"
+ },
+ "edit": {
+ "message": "Szerkesztés"
+ },
+ "view": {
+ "message": "Nézet"
+ },
+ "noItemsInList": {
+ "message": "Nincsenek megjeleníthető tételek."
+ },
+ "itemInformation": {
+ "message": "Elem információ"
+ },
+ "username": {
+ "message": "Felhasználónév"
+ },
+ "password": {
+ "message": "Jelszó"
+ },
+ "passphrase": {
+ "message": "Kulcskifejezés"
+ },
+ "favorite": {
+ "message": "Kedvenc"
+ },
+ "notes": {
+ "message": "Jegyzetek"
+ },
+ "note": {
+ "message": "Jegyzet"
+ },
+ "editItem": {
+ "message": "Elem szerkesztése"
+ },
+ "folder": {
+ "message": "Mappa"
+ },
+ "deleteItem": {
+ "message": "Elem törlése"
+ },
+ "viewItem": {
+ "message": "Elem megtekintése"
+ },
+ "launch": {
+ "message": "Indítás"
+ },
+ "website": {
+ "message": "Weboldal"
+ },
+ "toggleVisibility": {
+ "message": "Láthatóság váltása"
+ },
+ "manage": {
+ "message": "Kezelés"
+ },
+ "other": {
+ "message": "Egyéb"
+ },
+ "rateExtension": {
+ "message": "Bővítmény értékelése"
+ },
+ "rateExtensionDesc": {
+ "message": "Kérlek, fontold meg egy jó értékelés hagyását, ezzel segítve nekünk!"
+ },
+ "browserNotSupportClipboard": {
+ "message": "A webböngésződ nem támogat könnyű vágólap másolást. Másold manuálisan inkább."
+ },
+ "verifyMasterPassword": {
+ "message": "Mesterjelszó ellenőrzése"
+ },
+ "yourVaultIsLocked": {
+ "message": "A széf zárolásra került. A folytatáshoz meg kell adni a mesterjelszót."
+ },
+ "unlock": {
+ "message": "Feloldás"
+ },
+ "loggedInAsOn": {
+ "message": "Bejelentkezve mint $EMAIL$ $HOSTNAME$ webhelyen.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "name@example.com"
+ },
+ "hostname": {
+ "content": "$2",
+ "example": "bitwarden.com"
+ }
+ }
+ },
+ "invalidMasterPassword": {
+ "message": "Hibás mesterjelszó"
+ },
+ "vaultTimeout": {
+ "message": "Széf időkifutás"
+ },
+ "lockNow": {
+ "message": "Zárolás most"
+ },
+ "immediately": {
+ "message": "Azonnal"
+ },
+ "tenSeconds": {
+ "message": "10 másodperc"
+ },
+ "twentySeconds": {
+ "message": "20 másodperc"
+ },
+ "thirtySeconds": {
+ "message": "30 másodperc"
+ },
+ "oneMinute": {
+ "message": "1 perc"
+ },
+ "twoMinutes": {
+ "message": "2 perc"
+ },
+ "fiveMinutes": {
+ "message": "5 perc"
+ },
+ "fifteenMinutes": {
+ "message": "15 perc"
+ },
+ "thirtyMinutes": {
+ "message": "30 perc"
+ },
+ "oneHour": {
+ "message": "1 óra"
+ },
+ "fourHours": {
+ "message": "4 óra"
+ },
+ "onLocked": {
+ "message": "Rendszerzároláskor"
+ },
+ "onRestart": {
+ "message": "Böngésző újraindításkor"
+ },
+ "never": {
+ "message": "Soha"
+ },
+ "security": {
+ "message": "Biztonság"
+ },
+ "errorOccurred": {
+ "message": "Hiba történt."
+ },
+ "emailRequired": {
+ "message": "E-mail cím megadása kötelező."
+ },
+ "invalidEmail": {
+ "message": "Érvénytelen email cím."
+ },
+ "masterPassRequired": {
+ "message": "Mesterjelszó megadása kötelező."
+ },
+ "masterPassLength": {
+ "message": "Mesterjelszónak legalább 8 karakter hosszúnak kell lennie."
+ },
+ "masterPassDoesntMatch": {
+ "message": "A megadott két jelszó nem egyezik meg."
+ },
+ "newAccountCreated": {
+ "message": "Felhasználódat létrehoztuk. Most már be tudsz jelentkezni."
+ },
+ "masterPassSent": {
+ "message": "Elküldtünk neked egy mesterjelszó emlékeztetődet tartalmazó E-mailt."
+ },
+ "verificationCodeRequired": {
+ "message": "Ellenőrző kód szükséges."
+ },
+ "valueCopied": {
+ "message": "$VALUE$ másolásra került.",
+ "description": "Value has been copied to the clipboard.",
+ "placeholders": {
+ "value": {
+ "content": "$1",
+ "example": "Password"
+ }
+ }
+ },
+ "autofillError": {
+ "message": "Nem sikerült automatikusan kitölteni a bejelentkezést ezen a weboldalon. Helyette másold/illeszt be a felhasználóneved és/vagy a jelszavadat."
+ },
+ "loggedOut": {
+ "message": "Kijelentkezett"
+ },
+ "loginExpired": {
+ "message": "Bejelentkezési munkamenete lejárt."
+ },
+ "logOutConfirmation": {
+ "message": "Biztos benne, hogy ki szeretnél jelentkezni?"
+ },
+ "yes": {
+ "message": "Igen"
+ },
+ "no": {
+ "message": "Nem"
+ },
+ "unexpectedError": {
+ "message": "Váratlan hiba történt."
+ },
+ "nameRequired": {
+ "message": "Név megadása kötelező."
+ },
+ "addedFolder": {
+ "message": "Hozzáadott mappa"
+ },
+ "changeMasterPass": {
+ "message": "Mesterjelszó módosítása"
+ },
+ "changeMasterPasswordConfirmation": {
+ "message": "Mesterjelszavadat a bitwarden.com webes széfén tudod megváltoztatni. Szeretnéd meglátogatni a most a weboldalt?"
+ },
+ "twoStepLoginConfirmation": {
+ "message": "A kétlépcsős bejelentkezés biztonságosabbá teszi a felhasználódat azáltal, hogy ellenőrizned kell a bejelentkezésedet egy másik készülékkel mint például biztonsági kulcs, hitelesítő alkalmazás, SMS, telefon hívás vagy e-mail. Kétlépcsős bejelentkezést a bitwarden.com webes széfén tudod megváltoztatni. Szeretnéd meglátogatni a most a weboldalt?"
+ },
+ "editedFolder": {
+ "message": "A mappa módosításra került."
+ },
+ "deleteFolderConfirmation": {
+ "message": "Biztos, hogy törölni akarod ezt a mappát?"
+ },
+ "deletedFolder": {
+ "message": "Törölt mappa"
+ },
+ "gettingStartedTutorial": {
+ "message": "Kezdeti ismertető"
+ },
+ "gettingStartedTutorialVideo": {
+ "message": "Nézd meg az első lépések oktatóprogramunkat, hogy megtanuld, hogyan hozd ki a legtöbbet a böngésző kiterjesztésből."
+ },
+ "syncingComplete": {
+ "message": "Szinkronizálás befejezve"
+ },
+ "syncingFailed": {
+ "message": "Sikertelen szinkronizálás"
+ },
+ "passwordCopied": {
+ "message": "Jelszó másolva"
+ },
+ "uri": {
+ "message": "URI"
+ },
+ "uriPosition": {
+ "message": "URI $POSITION$",
+ "description": "A listing of URIs. Ex: URI 1, URI 2, URI 3, etc.",
+ "placeholders": {
+ "position": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "newUri": {
+ "message": "Új URI"
+ },
+ "addedItem": {
+ "message": "Elem hozzáadva"
+ },
+ "editedItem": {
+ "message": "Elem szerkesztve"
+ },
+ "deleteItemConfirmation": {
+ "message": "Biztosan törlésre kerüljön ezt az elem?"
+ },
+ "deletedItem": {
+ "message": "Az elem törlésre került."
+ },
+ "overwritePassword": {
+ "message": "Jelszó felülírása"
+ },
+ "overwritePasswordConfirmation": {
+ "message": "Biztosan felül akarod írni a jelenlegi jelszavad?"
+ },
+ "searchFolder": {
+ "message": "Mappa keresése"
+ },
+ "searchCollection": {
+ "message": "Gyűjtemény keresése"
+ },
+ "searchType": {
+ "message": "Típus keresése"
+ },
+ "noneFolder": {
+ "message": "Nincs mappa",
+ "description": "This is the folder for uncategorized items"
+ },
+ "disableAddLoginNotification": {
+ "message": "Bejelentkezés értesítés hozzáadás letiltása"
+ },
+ "addLoginNotificationDesc": {
+ "message": "A \"Bejelentkezés értesítés hozzáadása\" automatikusan felajánlja a bejelentkezés széfbe mentését az első bejelentkezéskor."
+ },
+ "dontShowCardsCurrentTab": {
+ "message": "A kártyák ne jelenjenek meg a fül oldalon"
+ },
+ "dontShowCardsCurrentTabDesc": {
+ "message": "A széf kártyaelemei az 'Aktuális fül' oldalon jelennek meg a könnyű automatikus kitöltéshez."
+ },
+ "dontShowIdentitiesCurrentTab": {
+ "message": "A személyazonosságok ne jelenjenek meg a Fül oldalon"
+ },
+ "dontShowIdentitiesCurrentTabDesc": {
+ "message": "A széf személyazonosság elemei az 'Aktuális fül' oldalon jelennek meg a könnyű automatikus kitöltéshez."
+ },
+ "clearClipboard": {
+ "message": "Vágólap ürítése",
+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
+ },
+ "clearClipboardDesc": {
+ "message": "Automatikusan törli a vágólapra másolt értékeket.",
+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
+ },
+ "notificationAddDesc": {
+ "message": "A Bitwarden megjegyezze ezt a jelszót?"
+ },
+ "notificationAddSave": {
+ "message": "Igen, mentés most"
+ },
+ "notificationNeverSave": {
+ "message": "Ezen az weboldalon soha"
+ },
+ "disableChangedPasswordNotification": {
+ "message": "Megváltozott jelszó értesítés letiltása"
+ },
+ "disableChangedPasswordNotificationDesc": {
+ "message": "A \"Megváltozott jelszó értesítés\" automatikusan felajánlja a bejelentkezési jelszó frissítését a széfben, ha annak megváltoztatását érzékeli a webhelyen."
+ },
+ "notificationChangeDesc": {
+ "message": "Frissítésre kerüljön a jelszó a Bitwardenben?"
+ },
+ "notificationChangeSave": {
+ "message": "Igen, frissítés most"
+ },
+ "disableContextMenuItem": {
+ "message": "Helyi menüopciók kikapcsolása"
+ },
+ "disableContextMenuItemDesc": {
+ "message": "Helyi menü opciók gyors hozzáférést biztosít jelszó generáláshoz és bejelentkezésekhez a weboldalhoz amin éppen vagy."
+ },
+ "defaultUriMatchDetection": {
+ "message": "Alapértelmezett URI egyezés érzékelés",
+ "description": "Default URI match detection for auto-fill."
+ },
+ "defaultUriMatchDetectionDesc": {
+ "message": "Az URI egyezés érzékelés alapértelmezett módjának kiválasztása a bejelentkezéseknél olyan műveletek esetében mint az automatikus kitöltés."
+ },
+ "theme": {
+ "message": "Téma"
+ },
+ "themeDesc": {
+ "message": "Az alkalmazás színtémájának megváltoztatása."
+ },
+ "dark": {
+ "message": "Sötét",
+ "description": "Dark color"
+ },
+ "light": {
+ "message": "Világos",
+ "description": "Light color"
+ },
+ "solarizedDark": {
+ "message": "Szolarizált sötét",
+ "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated."
+ },
+ "exportVault": {
+ "message": "Széf exportálása"
+ },
+ "fileFormat": {
+ "message": "Fájlformátum"
+ },
+ "warning": {
+ "message": "FIGYELEM",
+ "description": "WARNING (should stay in capitalized letters if the language permits)"
+ },
+ "confirmVaultExport": {
+ "message": "Széf exportálás megerősítése"
+ },
+ "exportWarningDesc": {
+ "message": "Ez az exportálás titkosítás nélkül tartalmazza a széfadatokat. Nem célszerű az exportált fájlt nem biztonságos csatornákon tárolni és tovább küldeni (például emailben). A felhasználás után erősen ajánlott a törlés."
+ },
+ "encExportKeyWarningDesc": {
+ "message": "Ez az exportálás titkosítja az adatokat a fiók titkosítási kulcsával. Ha valaha a diók forgatási kulcsa más lesz, akkor újra exportálni kell, mert nem lehet visszafejteni ezt az exportálási fájlt."
+ },
+ "encExportAccountWarningDesc": {
+ "message": "A fiók titkosítási kulcsai minden Bitwarden felhasználói fiókhoz egyediek, ezért nem importálhatunk titkosított exportálást egy másik fiókba."
+ },
+ "exportMasterPassword": {
+ "message": "Add meg a jelszavad a széf adataid exportálásához."
+ },
+ "shared": {
+ "message": "Megosztott"
+ },
+ "learnOrg": {
+ "message": "Információ szervezetekről"
+ },
+ "learnOrgConfirmation": {
+ "message": "A Bitwarden lehetővé teszi a tároló elemeinek megosztását másokkal egy szervezet használatával. Szeretnénk ellátogatni a bitwarden.com webhelyre további információkét?"
+ },
+ "moveToOrganization": {
+ "message": "Áthelyezés szervezethez"
+ },
+ "share": {
+ "message": "Megosztás"
+ },
+ "movedItemToOrg": {
+ "message": "$ITEMNAME$ átkerült $ORGNAME$ szervezethez",
+ "placeholders": {
+ "itemname": {
+ "content": "$1",
+ "example": "Secret Item"
+ },
+ "orgname": {
+ "content": "$2",
+ "example": "Company Name"
+ }
+ }
+ },
+ "moveToOrgDesc": {
+ "message": "Válasszunk egy szervezetet, ahová áthelyezni szeretnénk ezt az elemet. A szervezetbe áthelyezés átruházza az elem tulajdonjogát az adott szervezetre. Az áthelyezés után többé nem leszünk az elem közvetlen tulajdonosa."
+ },
+ "learnMore": {
+ "message": "Tudjon meg többet"
+ },
+ "authenticatorKeyTotp": {
+ "message": "Hitelesítő kulcs (egyszeri időalapú)"
+ },
+ "verificationCodeTotp": {
+ "message": "Ellenőrző kód (egyszeri időalapú)"
+ },
+ "copyVerificationCode": {
+ "message": "Ellenőrző kód másolása"
+ },
+ "attachments": {
+ "message": "Mellékletek"
+ },
+ "deleteAttachment": {
+ "message": "Mellékletek törlése"
+ },
+ "deleteAttachmentConfirmation": {
+ "message": "Biztos törölni akarod ezt a mellékletet?"
+ },
+ "deletedAttachment": {
+ "message": "Mellékletek törlése"
+ },
+ "newAttachment": {
+ "message": "Új melléklet hozzáadása"
+ },
+ "noAttachments": {
+ "message": "Nincsenek mellékletek."
+ },
+ "attachmentSaved": {
+ "message": "A melléklet mentésre került."
+ },
+ "file": {
+ "message": "Fájl"
+ },
+ "selectFile": {
+ "message": "Válassz ki egy fájlt."
+ },
+ "maxFileSize": {
+ "message": "A naximális fájlméret 500 MB."
+ },
+ "featureUnavailable": {
+ "message": "Ez a funkció nem érhető el."
+ },
+ "updateKey": {
+ "message": "Ez a funkció nem használható, amíg nem frissíted a titkosítási kulcsod."
+ },
+ "premiumMembership": {
+ "message": "Prémium tagság"
+ },
+ "premiumManage": {
+ "message": "Tagság kezelése"
+ },
+ "premiumManageAlert": {
+ "message": "Prémium tagságod a bitwarden.com webes széfén tudod kezelni. Szeretnéd meglátogatni a most a weboldalt?"
+ },
+ "premiumRefresh": {
+ "message": "Tagság frissítése"
+ },
+ "premiumNotCurrentMember": {
+ "message": "Pillanatnyilag nem vagy prémium tag."
+ },
+ "premiumSignUpAndGet": {
+ "message": "Regisztrálj prémium tagságra az alábbi funkciókért:"
+ },
+ "ppremiumSignUpStorage": {
+ "message": "1 GB titkosított tárhely a fájlmellékleteknek."
+ },
+ "ppremiumSignUpTwoStep": {
+ "message": "További két lépcsős bejelentkezés lehetőségek, mint például YubiKey, FIDO U2F és Duo."
+ },
+ "ppremiumSignUpReports": {
+ "message": "Jelszó higiénia, fiók biztonság és adatszivárgási jelentések a széf biztonsága érdekében."
+ },
+ "ppremiumSignUpTotp": {
+ "message": "TOTP ellenőrző kód (2FA) generátor a széfedben lévő bejelentkezésekhez."
+ },
+ "ppremiumSignUpSupport": {
+ "message": "Kiemelt ügyfélszolgálati."
+ },
+ "ppremiumSignUpFuture": {
+ "message": "Minden jövőbeli prémium funkció. Hamarosan jön még több!"
+ },
+ "premiumPurchase": {
+ "message": "Prémium funkció megvásárlása"
+ },
+ "premiumPurchaseAlert": {
+ "message": "Prémium tagságot a bitwarden.com webes széfén tudsz venni. Szeretnéd meglátogatni a most a weboldalt?"
+ },
+ "premiumCurrentMember": {
+ "message": "Te egy prémium tag vagy!"
+ },
+ "premiumCurrentMemberThanks": {
+ "message": "Köszönjük a Bitwarden támogatását."
+ },
+ "premiumPrice": {
+ "message": "Mindez csak $PRICE$ /év.",
+ "placeholders": {
+ "price": {
+ "content": "$1",
+ "example": "$10"
+ }
+ }
+ },
+ "refreshComplete": {
+ "message": "Frissítés megtörtént"
+ },
+ "disableAutoTotpCopy": {
+ "message": "Egyszeri jelszó automatikus másolás tiltása"
+ },
+ "disableAutoTotpCopyDesc": {
+ "message": "Ha a bejelentkezésedhez csatolva van egy hitelesítő kód, a TOTP ellenőrző kód automatikusan másolva lesz a vágólapodra bejelentkezésed automatikus kitöltése esetén."
+ },
+ "disableAutoBiometricsPrompt": {
+ "message": "Nincs biometrika kérés indításkor"
+ },
+ "premiumRequired": {
+ "message": "Prémium funkció szükséges"
+ },
+ "premiumRequiredDesc": {
+ "message": "Prémium tagság szükséges ennek a funkciónak eléréséhez."
+ },
+ "enterVerificationCodeApp": {
+ "message": "Add meg a 6 számjegyű ellenőrző kódot a hitelesítő alkalmazásodból."
+ },
+ "enterVerificationCodeEmail": {
+ "message": "$EMAIL$ email címre elküldött 6 számjegyű ellenőrző kód megadása.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "example@gmail.com"
+ }
+ }
+ },
+ "verificationCodeEmailSent": {
+ "message": "Az ellenőrző kód elküldésre került $EMAIL$ email címre.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "example@gmail.com"
+ }
+ }
+ },
+ "rememberMe": {
+ "message": "Emlékezz rám"
+ },
+ "sendVerificationCodeEmailAgain": {
+ "message": "Megerősítő kód e-mail újra küldése"
+ },
+ "useAnotherTwoStepMethod": {
+ "message": "Más két lépcsős bejelentkezés használata"
+ },
+ "insertYubiKey": {
+ "message": "Illeszd be a YubiKey-t a számítógéped egyik USB portjába, majd nyomd meg a gombját."
+ },
+ "insertU2f": {
+ "message": "Illesz be biztonsági kulcsod a számítógéped egyik USB portjába. Ha van rajta egy gomb, nyomd le."
+ },
+ "webAuthnNewTab": {
+ "message": "A WebAuthn 2FA ellenőrzés folytatása az új fülön."
+ },
+ "webAuthnNewTabOpen": {
+ "message": "Új fül megnyitása"
+ },
+ "webAuthnAuthenticate": {
+ "message": "WebAutn hitelesítés"
+ },
+ "loginUnavailable": {
+ "message": "A bejelentkezés nem érhető el."
+ },
+ "noTwoStepProviders": {
+ "message": "Ezen a fiókon kétlépcsős bejelentkezés van engedélyezve, de ez az eszköz nem támogatja egyik beállított kétlépcsős szolgáltatót sem."
+ },
+ "noTwoStepProviders2": {
+ "message": "Kérlek használj támogatott böngészőt (mint például a Chrome) és/vagy adj hozzá jobban támogatott szolgáltatásokat melyek jobban támogatottak más böngészőkben is (mint például egy hitelesítő alkalmazás)."
+ },
+ "twoStepOptions": {
+ "message": "Kétlépcsős bejelentkezés opciók"
+ },
+ "recoveryCodeDesc": {
+ "message": "Elvesztetted a hozzáférésed az összes kétlépcsős szolgáltatásodhoz? Használd a visszaállítókódod a kétlépcsős kiszolgálok kikapcsolásához a felhasználódon."
+ },
+ "recoveryCodeTitle": {
+ "message": "Helyreállító kód"
+ },
+ "authenticatorAppTitle": {
+ "message": "Hitelesítő alkalmazás"
+ },
+ "authenticatorAppDesc": {
+ "message": "Használj egy másik alkalmazást (mint például az Authy vagy a Google Authenticator) idő alapú ellenőrzőkód generálásához.",
+ "description": "'Authy' and 'Google Authenticator' are product names and should not be translated."
+ },
+ "yubiKeyTitle": {
+ "message": "YubiKey OTP biztonsági kulcs"
+ },
+ "yubiKeyDesc": {
+ "message": "Használj egy YubiKey-t, hogy hozzá férhess a felhasználódhoz. Működik a YubiKey 4, 4 Nano, 4C, és NEO eszközökkel."
+ },
+ "duoDesc": {
+ "message": "Ellenőrizd Duo Security-val a Duo Mobile alkalmazás, SMS, telefon hívás vagy U2F biztonsági kulcs segítségével.",
+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
+ },
+ "duoOrganizationDesc": {
+ "message": "Ellenőrzés szervezeti Duo Security segítségével a Duo Mobile alkalmazás, SMS, telefonhívás vagy U2F biztonsági kulcs használatával.",
+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
+ },
+ "webAuthnTitle": {
+ "message": "FIDO2 WebAuthn"
+ },
+ "webAuthnDesc": {
+ "message": "Használjunk bármilyen WebAuthn engedélyezett biztonsági kulcsot a saját fiók eléréséhez."
+ },
+ "emailTitle": {
+ "message": "E-mail"
+ },
+ "emailDesc": {
+ "message": "Ellenőrző kódok el lesznek e-mailbe küldve neked."
+ },
+ "selfHostedEnvironment": {
+ "message": "Saját üzemeltetésű környezet"
+ },
+ "selfHostedEnvironmentFooter": {
+ "message": "A helyileg működtetett Bitwarden telepítés alap webcímének megadása."
+ },
+ "customEnvironment": {
+ "message": "Egyedi környezet"
+ },
+ "customEnvironmentFooter": {
+ "message": "Haladó felhasználóknak. Minden egyes szolgáltatás alap URL-jét külön megadhatod."
+ },
+ "baseUrl": {
+ "message": "Szerver URL"
+ },
+ "apiUrl": {
+ "message": "API szerver webcím"
+ },
+ "webVaultUrl": {
+ "message": "Webes széf szerver webcím"
+ },
+ "identityUrl": {
+ "message": "Személyazonosság szerver webcím"
+ },
+ "notificationsUrl": {
+ "message": "Értesítési szerver webcím"
+ },
+ "iconsUrl": {
+ "message": "Ikonok szerver webcím"
+ },
+ "environmentSaved": {
+ "message": "A környezet URL-ek mentésre kerültek."
+ },
+ "enableAutoFillOnPageLoad": {
+ "message": "Automatikus kitöltés engedélyezése oldal betöltéskor"
+ },
+ "enableAutoFillOnPageLoadDesc": {
+ "message": "Ha egy bejelentkezési űrlap észlelésre került, automatikusan töltse ki az adatokat az oldal betöltésekor."
+ },
+ "experimentalFeature": {
+ "message": "Ez jelenleg egy kísérleti funkció. Csak saját felelősségedre használd."
+ },
+ "defaultAutoFillOnPageLoad": {
+ "message": "Alapértelmezett beállítások bejelentkezési elemekhez"
+ },
+ "defaultAutoFillOnPageLoadDesc": {
+ "message": "Az Automatikus kitöltés engedélyezése az oldalbetöltéskor engedélyezheti vagy letilthatja a funkciót az egyes bejelentkezési elemeknél. Ez az alapértelmezett beállítás a bejelentkezési elemeknéll, amelyek nincsenek külön konfigurálva."
+ },
+ "itemAutoFillOnPageLoad": {
+ "message": "Automatikus kitöltés oldal betöltésnél (Ha engedélyezett az opcióknál)"
+ },
+ "autoFillOnPageLoadUseDefault": {
+ "message": "Alapbeállítások használata"
+ },
+ "autoFillOnPageLoadYes": {
+ "message": "Automatikus kitöltés oldalbetöltésnél"
+ },
+ "autoFillOnPageLoadNo": {
+ "message": "Nincs automatikus kitöltés oldalbetöltéskor"
+ },
+ "commandOpenPopup": {
+ "message": "Széf megnyitása ablakban"
+ },
+ "commandOpenSidebar": {
+ "message": "Széf megnyitása oldalsávon"
+ },
+ "commandAutofillDesc": {
+ "message": "Az aktuális webhelynél az utoljára használt bejelentkezés automatikus kitöltése."
+ },
+ "commandGeneratePasswordDesc": {
+ "message": "Új véletlenszerű jelszó generálása ás másolása a vágólapra."
+ },
+ "commandLockVaultDesc": {
+ "message": "A széf zárolása"
+ },
+ "privateModeMessage": {
+ "message": "Ebben a böngészőben ez az ablak sajnos nem érhető el privát módban."
+ },
+ "customFields": {
+ "message": "Egyedi mezők"
+ },
+ "copyValue": {
+ "message": "Érték másolása"
+ },
+ "value": {
+ "message": "Érték"
+ },
+ "newCustomField": {
+ "message": "Új egyedi mező"
+ },
+ "dragToSort": {
+ "message": "Húzás a rendezéshez"
+ },
+ "cfTypeText": {
+ "message": "Szöveg"
+ },
+ "cfTypeHidden": {
+ "message": "Rejtett"
+ },
+ "cfTypeBoolean": {
+ "message": "Boolean (Logikai)"
+ },
+ "popup2faCloseMessage": {
+ "message": "Az ellenőrző kódot tartalmazó email egy olyan felugró ablakban nyílik meg, mely a mellette levő területre kattinva bezáródik. Szeretnéd az emailt egy olyan ablakban megnyitni, ami nem záródhat így be?"
+ },
+ "popupU2fCloseMessage": {
+ "message": "Ez a böngésző nem dolgozza fel az U2F kéréseket ebben a felbukkanó ablakban. Szeretnénk megnyitni a felbukkanó ablakot új böngészőablakban az U2F segítségével történő bejelentkezéshez?"
+ },
+ "disableFavicon": {
+ "message": "Webhely ikonok letiltása"
+ },
+ "disableFaviconDesc": {
+ "message": "A webhelyek ikonjai felismerhető ikonként jelennek meg a széf összes eleme mellett."
+ },
+ "disableBadgeCounter": {
+ "message": "Számláló jelvény letiltása"
+ },
+ "disableBadgeCounterDesc": {
+ "message": "A jelvényszámláló jelzi az aktuális oldalhoz a bejelentkezések számát a stárolóban."
+ },
+ "cardholderName": {
+ "message": "Kártyatulajdonos neve"
+ },
+ "number": {
+ "message": "Szám"
+ },
+ "brand": {
+ "message": "Márka"
+ },
+ "expirationMonth": {
+ "message": "Lejárati hónap"
+ },
+ "expirationYear": {
+ "message": "Lejárati év"
+ },
+ "expiration": {
+ "message": "Lejárat"
+ },
+ "january": {
+ "message": "Január"
+ },
+ "february": {
+ "message": "Február"
+ },
+ "march": {
+ "message": "Március"
+ },
+ "april": {
+ "message": "Április"
+ },
+ "may": {
+ "message": "Május"
+ },
+ "june": {
+ "message": "Június"
+ },
+ "july": {
+ "message": "Július"
+ },
+ "august": {
+ "message": "Augusztus"
+ },
+ "september": {
+ "message": "Szeptember"
+ },
+ "october": {
+ "message": "Október"
+ },
+ "november": {
+ "message": "November"
+ },
+ "december": {
+ "message": "December"
+ },
+ "securityCode": {
+ "message": "Biztonsági kód"
+ },
+ "ex": {
+ "message": "példa:"
+ },
+ "title": {
+ "message": "Titulus"
+ },
+ "mr": {
+ "message": "Úr"
+ },
+ "mrs": {
+ "message": "Asszony"
+ },
+ "ms": {
+ "message": "Kisasszony"
+ },
+ "dr": {
+ "message": "Dr"
+ },
+ "firstName": {
+ "message": "Személynév"
+ },
+ "middleName": {
+ "message": "Középső név"
+ },
+ "lastName": {
+ "message": "Családnév"
+ },
+ "identityName": {
+ "message": "Személyazonosság megnevezés"
+ },
+ "company": {
+ "message": "Cég"
+ },
+ "ssn": {
+ "message": "Társadalombiztosítási szám"
+ },
+ "passportNumber": {
+ "message": "Útlevélszám"
+ },
+ "licenseNumber": {
+ "message": "Vezetői engedély száma"
+ },
+ "email": {
+ "message": "E-mail"
+ },
+ "phone": {
+ "message": "Telefonszám"
+ },
+ "address": {
+ "message": "Lakcím"
+ },
+ "address1": {
+ "message": "Cím 1"
+ },
+ "address2": {
+ "message": "Cím 2"
+ },
+ "address3": {
+ "message": "Cím 3"
+ },
+ "cityTown": {
+ "message": "Település"
+ },
+ "stateProvince": {
+ "message": "Állam/Megye"
+ },
+ "zipPostalCode": {
+ "message": "Irányítószám"
+ },
+ "country": {
+ "message": "Ország"
+ },
+ "type": {
+ "message": "Típus"
+ },
+ "typeLogin": {
+ "message": "Bejelentkezés"
+ },
+ "typeLogins": {
+ "message": "Bejelentkezések"
+ },
+ "typeSecureNote": {
+ "message": "Biztonságos jegyzet"
+ },
+ "typeCard": {
+ "message": "Kártya"
+ },
+ "typeIdentity": {
+ "message": "Személyazonosság"
+ },
+ "passwordHistory": {
+ "message": "Jelszó előzmények"
+ },
+ "back": {
+ "message": "Vissza"
+ },
+ "collections": {
+ "message": "Gyűjtemények"
+ },
+ "favorites": {
+ "message": "Kedvencek"
+ },
+ "popOutNewWindow": {
+ "message": "Megnyitás új böngészőablakban"
+ },
+ "refresh": {
+ "message": "Frissítés"
+ },
+ "cards": {
+ "message": "Kártyák"
+ },
+ "identities": {
+ "message": "Személyazonosságok"
+ },
+ "logins": {
+ "message": "Bejelentkezések"
+ },
+ "secureNotes": {
+ "message": "Biztonságos jegyzetek"
+ },
+ "clear": {
+ "message": "Kiürítés",
+ "description": "To clear something out. example: To clear browser history."
+ },
+ "checkPassword": {
+ "message": "A jelszóvédelemi állapot ellenőrzése."
+ },
+ "passwordExposed": {
+ "message": "Ez a jelszó már $VALUE$ alkalommal volt kitéve az adatszivárgásnak. Célszerű megváltoztatni.",
+ "placeholders": {
+ "value": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "passwordSafe": {
+ "message": "Ez a jelszó nem található egyetlen ismert adatszivárgásban sem. Biztonságos a használata."
+ },
+ "baseDomain": {
+ "message": "Alap domain"
+ },
+ "host": {
+ "message": "Kiszolgáló",
+ "description": "A URL's host value. For example, the host of https://sub.domain.com:443 is 'sub.domain.com:443'."
+ },
+ "exact": {
+ "message": "Pontos"
+ },
+ "startsWith": {
+ "message": "Ezzel kezdődik:"
+ },
+ "regEx": {
+ "message": "Reguláris kifejezés",
+ "description": "A programming term, also known as 'RegEx'."
+ },
+ "matchDetection": {
+ "message": "Találat érzékelés",
+ "description": "URI match detection for auto-fill."
+ },
+ "defaultMatchDetection": {
+ "message": "Alapértelmezett találat érzékelés",
+ "description": "Default URI match detection for auto-fill."
+ },
+ "toggleOptions": {
+ "message": "Opciók megnyitása"
+ },
+ "toggleCurrentUris": {
+ "message": "Aktuális URI elemek váltása",
+ "description": "Toggle the display of the URIs of the currently open tabs in the browser."
+ },
+ "currentUri": {
+ "message": "Aktuális URI",
+ "description": "The URI of one of the current open tabs in the browser."
+ },
+ "organization": {
+ "message": "Szervezet",
+ "description": "An entity of multiple related people (ex. a team or business organization)."
+ },
+ "types": {
+ "message": "Típusok"
+ },
+ "allItems": {
+ "message": "Összes elem"
+ },
+ "noPasswordsInList": {
+ "message": "Nincsenek listázható jelszavak."
+ },
+ "remove": {
+ "message": "Eltávolítás"
+ },
+ "default": {
+ "message": "Alapértelmezett"
+ },
+ "dateUpdated": {
+ "message": "A frissítés megtörtént.",
+ "description": "ex. Date this item was updated"
+ },
+ "datePasswordUpdated": {
+ "message": "A jelszó frissítésre került.",
+ "description": "ex. Date this password was updated"
+ },
+ "neverLockWarning": {
+ "message": "Biztosan szeretnénk használni a \"Soha\" opciót? A zárolási opciók \"Soha\" értékre állítása a széf titkosítási kulcsát az eszközön tárolja. Ennek az opciónak a használatakor célszerű az eszköz megfelelő védettségét biztosítani."
+ },
+ "noOrganizationsList": {
+ "message": "Még nem tartozunk egyik szervezethez sem. A szervezetek lehetővé teszik az elemek megosztását más felhasználókkal."
+ },
+ "noCollectionsInList": {
+ "message": "Nincsenek megjeleníthető gyűjtemények."
+ },
+ "ownership": {
+ "message": "Tulajdonjog"
+ },
+ "whoOwnsThisItem": {
+ "message": "Ki tulajdonolja ezt az elemet?"
+ },
+ "strong": {
+ "message": "Erős",
+ "description": "ex. A strong password. Scale: Weak -> Good -> Strong"
+ },
+ "good": {
+ "message": "Jó",
+ "description": "ex. A good password. Scale: Weak -> Good -> Strong"
+ },
+ "weak": {
+ "message": "Gyenge",
+ "description": "ex. A weak password. Scale: Weak -> Good -> Strong"
+ },
+ "weakMasterPassword": {
+ "message": "Gyenge mesterjelszó"
+ },
+ "weakMasterPasswordDesc": {
+ "message": "A választott mesterjelszó gyenge. Erős jelszót (vagy kifejezést) kell használni a Bitwarden fiók megfelelő védelme érdekében. Biztosan ezt a mesterjelszót szeretnénk használni?"
+ },
+ "pin": {
+ "message": "Pinkód",
+ "description": "PIN code. Ex. The short code (often numeric) that you use to unlock a device."
+ },
+ "unlockWithPin": {
+ "message": "Felnyitás pinkóddal"
+ },
+ "setYourPinCode": {
+ "message": "A pinkód beállítása a Bitwarden feloldásához. A pinkód beállítás alaphelyzetbe kerül, ha teljesen kijelentkezünk az alkalmazásból."
+ },
+ "pinRequired": {
+ "message": "A pinkód szükséges."
+ },
+ "invalidPin": {
+ "message": "A pinkód érvénytelen."
+ },
+ "verifyPin": {
+ "message": "Pinkód ellenőrzése"
+ },
+ "yourVaultIsLockedPinCode": {
+ "message": "A széf zárolásra került. A folytatáshoz meg kell adni a pinkódot."
+ },
+ "unlockWithBiometrics": {
+ "message": "Biometrikus feloldás"
+ },
+ "awaitDesktop": {
+ "message": "Várakozás megerősítésre az asztali alkalmazásból"
+ },
+ "awaitDesktopDesc": {
+ "message": "Erősítsük meg a biometrikus adatok használatát a Bitwarden asztali alkalmazásban a biometrikus adatok engedélyezéséhez a böngészőben."
+ },
+ "lockWithMasterPassOnRestart": {
+ "message": "Lezárás mesterjelszóval a böngésző újraindításakor"
+ },
+ "selectOneCollection": {
+ "message": "Legalább egy gyűjteményt ki kell választani."
+ },
+ "cloneItem": {
+ "message": "Tétel klónozása"
+ },
+ "clone": {
+ "message": "Klónozás"
+ },
+ "passwordGeneratorPolicyInEffect": {
+ "message": "Egy vagy több szervezeti szabály érinti a generátor beállításokat."
+ },
+ "vaultTimeoutAction": {
+ "message": "Széf időkifutás művelet"
+ },
+ "lock": {
+ "message": "Lezárás",
+ "description": "Verb form: to make secure or inaccesible by"
+ },
+ "trash": {
+ "message": "Lomtár",
+ "description": "Noun: a special folder to hold deleted items"
+ },
+ "searchTrash": {
+ "message": "Keresés a lomtárban"
+ },
+ "permanentlyDeleteItem": {
+ "message": "Az elem végleges törlése"
+ },
+ "permanentlyDeleteItemConfirmation": {
+ "message": "Biztosan véglegesen törlésre kerüljön ez az elem?"
+ },
+ "permanentlyDeletedItem": {
+ "message": "Véglegesen törölt elem"
+ },
+ "restoreItem": {
+ "message": "Elem visszaállítása"
+ },
+ "restoreItemConfirmation": {
+ "message": "Biztosan visszaállításra kerüljön ezt az elem?"
+ },
+ "restoredItem": {
+ "message": "Visszaállított elem"
+ },
+ "vaultTimeoutLogOutConfirmation": {
+ "message": "Kijelentkezve az összes széf elérés eltávolításra kerül és webes hitelesítésre van szükség az időkifutás után. Biztosan szeretnénk használni ezt a beállítást?"
+ },
+ "vaultTimeoutLogOutConfirmationTitle": {
+ "message": "Időkifutás művelet megerősítés"
+ },
+ "autoFillAndSave": {
+ "message": "Automatikus kitöltés és mentés"
+ },
+ "autoFillSuccessAndSavedUri": {
+ "message": "Automatikusan kitöltött elem és mentett URI"
+ },
+ "autoFillSuccess": {
+ "message": "Automatikusan kitöltött elem"
+ },
+ "setMasterPassword": {
+ "message": "Mesterjelszó beállítása"
+ },
+ "masterPasswordPolicyInEffect": {
+ "message": "Egy vagy több szervezeti rendszabályhoz mesterjelszó szükséges a következő követelmények megfeleléséhez:"
+ },
+ "policyInEffectMinComplexity": {
+ "message": "Minimális összetettségi pontszám $SCORE$ értékhez",
+ "placeholders": {
+ "score": {
+ "content": "$1",
+ "example": "4"
+ }
+ }
+ },
+ "policyInEffectMinLength": {
+ "message": "Minimális hossz $LENGTH$ értékből",
+ "placeholders": {
+ "length": {
+ "content": "$1",
+ "example": "14"
+ }
+ }
+ },
+ "policyInEffectUppercase": {
+ "message": "Egy vagy több nagybetűs karaktert tartalmaz"
+ },
+ "policyInEffectLowercase": {
+ "message": "Egy vagy több kisbetűs karaktert tartalmaz"
+ },
+ "policyInEffectNumbers": {
+ "message": "Egy vagy több számot tartalmaz"
+ },
+ "policyInEffectSpecial": {
+ "message": "$CHARS$ speciális karakterekből egyet vagy többet tartalmaz",
+ "placeholders": {
+ "chars": {
+ "content": "$1",
+ "example": "!@#$%^&*"
+ }
+ }
+ },
+ "masterPasswordPolicyRequirementsNotMet": {
+ "message": "Az új mesterjelszó nem felel meg a szabály követelményeknek."
+ },
+ "acceptPolicies": {
+ "message": "A doboz bejelölésével elfogadjuk a következőket:"
+ },
+ "acceptPoliciesError": {
+ "message": "A szolgáltatási feltételeket és az adatvédelmi irányelveket nem vették figyelembe."
+ },
+ "termsOfService": {
+ "message": "Szolgáltatási feltételek"
+ },
+ "privacyPolicy": {
+ "message": "Adatvédelem"
+ },
+ "hintEqualsPassword": {
+ "message": "A jelszavas tipp nem lehet azonos a jelszóval."
+ },
+ "ok": {
+ "message": "Ok"
+ },
+ "desktopSyncVerificationTitle": {
+ "message": "Asztali szinkronizálás ellenőrzés"
+ },
+ "desktopIntegrationVerificationText": {
+ "message": "Ellenőrizzük, hogy az asztali alkalmazás megjeleníti-e ezt az ujjlenyomatot: "
+ },
+ "desktopIntegrationDisabledTitle": {
+ "message": "A böngésző integráció nem engedélyezett."
+ },
+ "desktopIntegrationDisabledDesc": {
+ "message": "A böngésző integráció nincs engedélyezve a Bitwarden asztali alkalmazásban. Engedélyezzük az asztali alkalmazás beállításai között."
+ },
+ "startDesktopTitle": {
+ "message": "A Bitwarden asztali alkalmazás indítása"
+ },
+ "startDesktopDesc": {
+ "message": "A funkció használatához el kell indítani a Bitwarden asztali alkalmazást."
+ },
+ "errorEnableBiometricTitle": {
+ "message": "Nem lehet engedélyezni a biometrikus adatokat."
+ },
+ "errorEnableBiometricDesc": {
+ "message": "A műveletet az asztali alkalmazás törölte."
+ },
+ "nativeMessagingInvalidEncryptionDesc": {
+ "message": "Az asztali alkalmazás érvénytelenítette a biztonságos kommunikációs csatornát. Próbálkozzunk újra ezzel a művelettel"
+ },
+ "nativeMessagingInvalidEncryptionTitle": {
+ "message": "Az asztali kommunikáció megszakadt."
+ },
+ "nativeMessagingWrongUserDesc": {
+ "message": "Az asztali alkalmazás egy másik fiókba van bejelentkezve. Ellenőrizzük, hogy mindkét alkalmazást azonos fiókba van bejelentkezve."
+ },
+ "nativeMessagingWrongUserTitle": {
+ "message": "A fiók nem egyezik."
+ },
+ "biometricsNotEnabledTitle": {
+ "message": "A biometrikus adatok nincsenek engedélyezve."
+ },
+ "biometricsNotEnabledDesc": {
+ "message": "A böngésző biometrikus adataihoz először az asztali biometrikus adatokat kell engedélyezni a beállításokban."
+ },
+ "biometricsNotSupportedTitle": {
+ "message": "A biometrikus adatok nem támogatottak."
+ },
+ "biometricsNotSupportedDesc": {
+ "message": "A böngésző biometrikus adatait ez az eszköz nem támogatja."
+ },
+ "nativeMessaginPermissionErrorTitle": {
+ "message": "A jogosultság nincs megadva."
+ },
+ "nativeMessaginPermissionErrorDesc": {
+ "message": "A Bitwarden Desktop alkalmazással való kommunikáció engedélye nélkül nem adhatunk meg biometrikus adatokat a böngésző kiterjesztésében. Próbáljuk újra."
+ },
+ "nativeMessaginPermissionSidebarTitle": {
+ "message": "Engedélykérési hiba történt."
+ },
+ "nativeMessaginPermissionSidebarDesc": {
+ "message": "Ez a művelet nem hajtható végre az oldalsávon. Próbáljuk meg újra a műveletet a felbukkanó ablakban."
+ },
+ "personalOwnershipSubmitError": {
+ "message": "Egy vállalati házirend miatt korlátozásra került az elemek személyes tárolóba történő mentése. Módosítsuk a Tulajdon opciót egy szervezetre és válasszunk az elérhető gyűjtemények közül."
+ },
+ "personalOwnershipPolicyInEffect": {
+ "message": "A szervezeti házirend befolyásolja a tulajdonosi opciókat."
+ },
+ "excludedDomains": {
+ "message": "Kizárt domainek"
+ },
+ "excludedDomainsDesc": {
+ "message": "A Bitwarden nem fogja kérni a domainek bejelentkezési adatainak mentését. A változások életbe lépéséhez frissíteni kell az oldalt."
+ },
+ "excludedDomainsInvalidDomain": {
+ "message": "$DOMAIN$ nem érvényes domain.",
+ "placeholders": {
+ "domain": {
+ "content": "$1",
+ "example": "googlecom"
+ }
+ }
+ },
+ "send": {
+ "message": "Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "searchSends": {
+ "message": "Send keresése",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "addSend": {
+ "message": "Send hozzáadása",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTypeText": {
+ "message": "Szöveg"
+ },
+ "sendTypeFile": {
+ "message": "Fájl"
+ },
+ "allSends": {
+ "message": "Összes Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "maxAccessCountReached": {
+ "message": "A maximális hozzáférések száma elérésre került."
+ },
+ "expired": {
+ "message": "Lejárt"
+ },
+ "pendingDeletion": {
+ "message": "Függőben lévő törlés"
+ },
+ "passwordProtected": {
+ "message": "Jelszóval védett"
+ },
+ "copySendLink": {
+ "message": "Send hivatkozás másolása",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "removePassword": {
+ "message": "Jelszó eltávolítása"
+ },
+ "delete": {
+ "message": "Törlés"
+ },
+ "removedPassword": {
+ "message": "A jelszó eltávolításra került."
+ },
+ "deletedSend": {
+ "message": "A Send törlésre került.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendLink": {
+ "message": "Send hivatkozás",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "disabled": {
+ "message": "Letiltva"
+ },
+ "removePasswordConfirmation": {
+ "message": "Biztosan eltávolításra kerüljön ez a jelszó?"
+ },
+ "deleteSend": {
+ "message": "Send törlése",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "deleteSendConfirmation": {
+ "message": "Biztosan törlésre kerüljön ez a Send?",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "editSend": {
+ "message": "Send szerkesztése",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTypeHeader": {
+ "message": "Milyen típusú ez a Send?",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendNameDesc": {
+ "message": "Barátságos név a Send leírására.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendFileDesc": {
+ "message": "A küldendő fájl."
+ },
+ "deletionDate": {
+ "message": "Törlési dátum"
+ },
+ "deletionDateDesc": {
+ "message": "A Send véglegesen törölve lesz a meghatározott időpontban.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "expirationDate": {
+ "message": "Lejárati dátum"
+ },
+ "expirationDateDesc": {
+ "message": "Amennyiben be van állítva, a hozzáférés ehhez a Sendhez a meghatározott időpontban lejár",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "oneDay": {
+ "message": "1 nap"
+ },
+ "days": {
+ "message": "$DAYS$ nap",
+ "placeholders": {
+ "days": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "custom": {
+ "message": "Egyedi"
+ },
+ "maximumAccessCount": {
+ "message": "Maximális elérési szám"
+ },
+ "maximumAccessCountDesc": {
+ "message": "Beállítva a Küldés elérhetetlen lesz a meghatározott hozzáférések számának elérése után.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendPasswordDesc": {
+ "message": "Opcionálisan megadhatunk egy jelszót a felhasználók számára a Küldés eléréséhez. ",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendNotesDesc": {
+ "message": "Személyes megjegyzések erről a Küldésről.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendDisableDesc": {
+ "message": "A Send letiltásával senki nem férhet hozzá.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendShareDesc": {
+ "message": "Mentéskor másoljuk a Küldés hivatkozását a vágólapra.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTextDesc": {
+ "message": "A küldendő fájl."
+ },
+ "sendHideText": {
+ "message": "Alapértelmezés szerint elrejti a Küldés szövegét.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "currentAccessCount": {
+ "message": "Aktuális elérési szám"
+ },
+ "createSend": {
+ "message": "Új küldés létrehozása",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "newPassword": {
+ "message": "Új jelszó"
+ },
+ "sendDisabled": {
+ "message": "A Send kikapcsolásra került",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendDisabledWarning": {
+ "message": "A vállalati házirend miatt csak egy meglévő Send törölhető.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "createdSend": {
+ "message": "A Send létrejött.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "editedSend": {
+ "message": "A Send szerkesztésre került",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendLinuxChromiumFileWarning": {
+ "message": "A fájl kiválasztásához nyissuk meg a kiterjesztést az oldalsávon (ha lehetséges) vagy kattintsunk erre a sávra új ablak felbukkanásához."
+ },
+ "sendFirefoxFileWarning": {
+ "message": "Firefox esetén nyissuk meg a bővítményt az oldalsávon vafy erre a hirdetőtáblára kattintva új felbukkanó ablak nyílik meg."
+ },
+ "sendSafariFileWarning": {
+ "message": "A fájl kiválasztásához Safariban kattintsunk erre a hirdetőtáblára kattintva új ablak nyílik meg."
+ },
+ "sendFileCalloutHeader": {
+ "message": "Mielőtt belevágnánk"
+ },
+ "sendFirefoxCustomDatePopoutMessage1": {
+ "message": "Naptár-stílusú dátumválasztáshoz",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read '**To use a calendar style date picker ** click here to pop out your window.'"
+ },
+ "sendFirefoxCustomDatePopoutMessage2": {
+ "message": "kattintás ide",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker **click here** to pop out your window.'"
+ },
+ "sendFirefoxCustomDatePopoutMessage3": {
+ "message": "az ablak megnyitásához",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker click here **to pop out your window.**'"
+ },
+ "expirationDateIsInvalid": {
+ "message": "A megadott lejárati idő nem érvényes."
+ },
+ "deletionDateIsInvalid": {
+ "message": "A megadott törlési dátum nem érvényes."
+ },
+ "expirationDateAndTimeRequired": {
+ "message": "Lejárati dátum és idő megadása szükséges."
+ },
+ "deletionDateAndTimeRequired": {
+ "message": "Törlési dátum és idő megadása szükséges."
+ },
+ "dateParsingError": {
+ "message": "Hiba történt a törlési és a lejárati dátum mentésekor."
+ },
+ "hideEmail": {
+ "message": "Saját email cím elrejtése a címzettek elől."
+ },
+ "sendOptionsPolicyInEffect": {
+ "message": "Egy vagy több szervezeti szabály érinti a Send opciókat."
+ },
+ "passwordPrompt": {
+ "message": "Mesterjelszó ismételt megadás"
+ },
+ "passwordConfirmation": {
+ "message": "Mesterjelszó megerősítése"
+ },
+ "passwordConfirmationDesc": {
+ "message": "Ez a művelet védett. A folytatásért ismételten meg kell adni a mesterjelszőt az személyazonosság ellenőrzéséhez."
+ },
+ "emailVerificationRequired": {
+ "message": "Email hitelesítés szükséges"
+ },
+ "emailVerificationRequiredDesc": {
+ "message": "A funkció használatához igazolni kell email címet. Az email cím a webtárban ellenőrizhető."
+ },
+ "updatedMasterPassword": {
+ "message": "A mesterjelszó frissítésre került."
+ },
+ "updateMasterPassword": {
+ "message": "Mesterjelszó frissítése"
+ },
+ "updateMasterPasswordWarning": {
+ "message": "A szervezet egyik adminisztrátora nemrég megváltoztatta a mesterjelszót. A széf eléréséhez most frissíteni kell a mesterjelszót. Továbblépéskor kijelentkezés történik a jelenlegi munkamenetből és újra be kell jelentkezni. Ha van aktív munkamenet más eszközön, az még legfeljebb egy óráig aktív maradhat."
+ },
+ "resetPasswordPolicyAutoEnroll": {
+ "message": "Automatikus regisztráció"
+ },
+ "resetPasswordAutoEnrollInviteWarning": {
+ "message": "Ennek a szervezetnek van egy vállalati házirendje, amely automatikusan regisztrál a jelszó alaphelyzetbe állítására. A regisztráció lehetővé teszi a szervezet adminisztrátorainak a mesterjelszó megváltoztatását."
+ },
+ "selectFolder": {
+ "message": "Mappa választása..."
+ },
+ "ssoCompleteRegistration": {
+ "message": "Az SSO-val történő bejelentkezés befejezéséhez mesterjelszót kell beállítani a széf eléréséhez és védelméhez."
+ },
+ "hours": {
+ "message": "Óra"
+ },
+ "minutes": {
+ "message": "Perc"
+ },
+ "vaultTimeoutPolicyInEffect": {
+ "message": "A szervezeti házirendek hatással vannak a széf időkorlátjára. A széf időkorlátja legfeljebb $HOURS$ óra és $MINUTES$ perc lehet.",
+ "placeholders": {
+ "hours": {
+ "content": "$1",
+ "example": "5"
+ },
+ "minutes": {
+ "content": "$2",
+ "example": "5"
+ }
+ }
+ },
+ "vaultTimeoutToLarge": {
+ "message": "A széf időkorlátja túllépi a szervezet által beállított korlátozást."
+ },
+ "vaultExportDisabled": {
+ "message": "A széf exportálás nem engedélyezett."
+ },
+ "personalVaultExportPolicyInEffect": {
+ "message": "Egy vagy több szervezeti házirend tiltja a személyes széf exportálását."
+ },
+ "copyCustomFieldNameInvalidElement": {
+ "message": "Nem lehet azonosítani egy érvényes űrlapelemet. Ehelyett próbáljuk meg ellenőrizni a HTML -t."
+ },
+ "copyCustomFieldNameNotUnique": {
+ "message": "Nincs egyedi azonosító."
+ }
+}
diff --git a/src/iOS.Safari/Resources/_locales/id/messages.json b/src/iOS.Safari/Resources/_locales/id/messages.json
new file mode 100644
index 000000000..2050c09ea
--- /dev/null
+++ b/src/iOS.Safari/Resources/_locales/id/messages.json
@@ -0,0 +1,1817 @@
+{
+ "appName": {
+ "message": "Bitwarden"
+ },
+ "extName": {
+ "message": "Bitwarden - Pengelola Sandi Gratis",
+ "description": "Extension name, MUST be less than 40 characters (Safari restriction)"
+ },
+ "extDesc": {
+ "message": "Bitwarden adalah sebuah pengelola sandi yang aman dan gratis untuk semua perangkat Anda.",
+ "description": "Extension description"
+ },
+ "loginOrCreateNewAccount": {
+ "message": "Masuk atau buat akun baru untuk mengakses brankas Anda."
+ },
+ "createAccount": {
+ "message": "Buat Akun"
+ },
+ "login": {
+ "message": "Masuk"
+ },
+ "enterpriseSingleSignOn": {
+ "message": "Sistem Masuk Tunggal Perusahaan"
+ },
+ "cancel": {
+ "message": "Batal"
+ },
+ "close": {
+ "message": "Tutup"
+ },
+ "submit": {
+ "message": "Kirim"
+ },
+ "emailAddress": {
+ "message": "Alamat Email"
+ },
+ "masterPass": {
+ "message": "Sandi Utama"
+ },
+ "masterPassDesc": {
+ "message": "Kata sandi utama adalah kata sandi yang Anda gunakan untuk mengakses brankas Anda. Sangat penting bahwa Anda tidak lupa kata sandi utama Anda. Tidak ada cara untuk memulihkan kata sandi jika Anda melupakannya."
+ },
+ "masterPassHintDesc": {
+ "message": "Petunjuk kata sandi utama dapat membantu Anda mengingat kata sandi Anda jika Anda melupakannya."
+ },
+ "reTypeMasterPass": {
+ "message": "Ketik ulang Kata Sandi Utama"
+ },
+ "masterPassHint": {
+ "message": "Petunjuk Kata Sandi Utama (pilihan)"
+ },
+ "tab": {
+ "message": "Tab"
+ },
+ "myVault": {
+ "message": "Brankas Saya"
+ },
+ "tools": {
+ "message": "Alat"
+ },
+ "settings": {
+ "message": "Setelan"
+ },
+ "currentTab": {
+ "message": "Tab Saat Ini"
+ },
+ "copyPassword": {
+ "message": "Salin Kata Sandi"
+ },
+ "copyNote": {
+ "message": "Salin Catatan"
+ },
+ "copyUri": {
+ "message": "Salin URI"
+ },
+ "copyUsername": {
+ "message": "Salin Nama Pengguna"
+ },
+ "copyNumber": {
+ "message": "Salin Angka"
+ },
+ "copySecurityCode": {
+ "message": "Salin Kode Keamanan"
+ },
+ "autoFill": {
+ "message": "Isi otomatis"
+ },
+ "generatePasswordCopied": {
+ "message": "Membuat Kata Sandi (tersalin)"
+ },
+ "copyElementIdentifier": {
+ "message": "Copy Custom Field Name"
+ },
+ "noMatchingLogins": {
+ "message": "Tidak ada info masuk yang cocok."
+ },
+ "vaultLocked": {
+ "message": "Brankas terkunci."
+ },
+ "vaultLoggedOut": {
+ "message": "Brankas terkunci."
+ },
+ "autoFillInfo": {
+ "message": "Tidak ada info masuk yang tersedia untuk mengisi secara otomatis tab peramban saat ini."
+ },
+ "addLogin": {
+ "message": "Tambah Info Masuk"
+ },
+ "addItem": {
+ "message": "Tambah Item"
+ },
+ "passwordHint": {
+ "message": "Petunjuk Kata Sandi"
+ },
+ "enterEmailToGetHint": {
+ "message": "Masukkan email akun Anda untuk menerima pentunjuk sandi utama Anda."
+ },
+ "getMasterPasswordHint": {
+ "message": "Dapatkan petunjuk sandi utama"
+ },
+ "continue": {
+ "message": "Lanjutkan"
+ },
+ "verificationCode": {
+ "message": "Kode Verifikasi"
+ },
+ "account": {
+ "message": "Akun"
+ },
+ "changeMasterPassword": {
+ "message": "Ubah Kata Sandi Utama"
+ },
+ "fingerprintPhrase": {
+ "message": "Frasa Sidik Jari",
+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
+ },
+ "yourAccountsFingerprint": {
+ "message": "Frasa sidik jari akun Anda",
+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
+ },
+ "twoStepLogin": {
+ "message": "Info masuk dua langkah"
+ },
+ "logOut": {
+ "message": "Keluar"
+ },
+ "about": {
+ "message": "Tentang"
+ },
+ "version": {
+ "message": "Versi"
+ },
+ "save": {
+ "message": "Simpan"
+ },
+ "move": {
+ "message": "Pindah"
+ },
+ "addFolder": {
+ "message": "Tambah Folder"
+ },
+ "name": {
+ "message": "Nama"
+ },
+ "editFolder": {
+ "message": "Sunting Folder"
+ },
+ "deleteFolder": {
+ "message": "Hapus Folder"
+ },
+ "folders": {
+ "message": "Folder"
+ },
+ "noFolders": {
+ "message": "Tidak ada folder yang dapat dicantumkan."
+ },
+ "helpFeedback": {
+ "message": "Bantuan & Umpan Balik"
+ },
+ "sync": {
+ "message": "Sinkronisasi"
+ },
+ "syncVaultNow": {
+ "message": "Sinkronkan Brankas Sekarang"
+ },
+ "lastSync": {
+ "message": "Sinkronisasi Terakhir:"
+ },
+ "passGen": {
+ "message": "Pembuat Kata Sandi"
+ },
+ "generator": {
+ "message": "Pembuat Sandi",
+ "description": "Short for 'Password Generator'."
+ },
+ "passGenInfo": {
+ "message": "Secara otomatis membuat sandi yang kuat dan unik untuk info masuk Anda."
+ },
+ "bitWebVault": {
+ "message": "Brankas Web Bitwarden"
+ },
+ "importItems": {
+ "message": "Impor Item"
+ },
+ "select": {
+ "message": "Pilih"
+ },
+ "generatePassword": {
+ "message": "Buat Kata Sandi"
+ },
+ "regeneratePassword": {
+ "message": "Buat Ulang Kata Sandi"
+ },
+ "options": {
+ "message": "Pilihan"
+ },
+ "length": {
+ "message": "Panjang"
+ },
+ "numWords": {
+ "message": "Jumlah Kata"
+ },
+ "wordSeparator": {
+ "message": "Pemisah Kata"
+ },
+ "capitalize": {
+ "message": "Huruf Besar",
+ "description": "Make the first letter of a work uppercase."
+ },
+ "includeNumber": {
+ "message": "Sertakan Angka"
+ },
+ "minNumbers": {
+ "message": "Angka Minimum"
+ },
+ "minSpecial": {
+ "message": "Spesial Minimum"
+ },
+ "avoidAmbChar": {
+ "message": "Hindari Karakter Ambigu"
+ },
+ "searchVault": {
+ "message": "Cari brankas"
+ },
+ "edit": {
+ "message": "Edit"
+ },
+ "view": {
+ "message": "Tampilan"
+ },
+ "noItemsInList": {
+ "message": "Tidak ada item yang dapat dicantumkan."
+ },
+ "itemInformation": {
+ "message": "Informasi Item"
+ },
+ "username": {
+ "message": "Nama Pengguna"
+ },
+ "password": {
+ "message": "Kata Sandi"
+ },
+ "passphrase": {
+ "message": "Frasa Sandi"
+ },
+ "favorite": {
+ "message": "Favorit"
+ },
+ "notes": {
+ "message": "Catatan"
+ },
+ "note": {
+ "message": "Catatan"
+ },
+ "editItem": {
+ "message": "Sunting Item"
+ },
+ "folder": {
+ "message": "Folder"
+ },
+ "deleteItem": {
+ "message": "Hapus Item"
+ },
+ "viewItem": {
+ "message": "Lihat Item"
+ },
+ "launch": {
+ "message": "Luncurkan"
+ },
+ "website": {
+ "message": "Situs Web"
+ },
+ "toggleVisibility": {
+ "message": "Ubah Visibilitas"
+ },
+ "manage": {
+ "message": "Kelola"
+ },
+ "other": {
+ "message": "Lainnya"
+ },
+ "rateExtension": {
+ "message": "Nilai Ekstensi"
+ },
+ "rateExtensionDesc": {
+ "message": "Mohon pertimbangkan membantu kami dengan ulasan yang baik!"
+ },
+ "browserNotSupportClipboard": {
+ "message": "Peramban Anda tidak mendukung menyalin clipboard dengan mudah. Salin secara manual."
+ },
+ "verifyMasterPassword": {
+ "message": "Verifikasi Kata Sandi Utama"
+ },
+ "yourVaultIsLocked": {
+ "message": "Brankas Anda terkunci. Verifikasi kata sandi utama Anda untuk melanjutkan."
+ },
+ "unlock": {
+ "message": "Buka Kunci"
+ },
+ "loggedInAsOn": {
+ "message": "Telah masuk sebagai $EMAIL$ di $HOSTNAME$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "name@example.com"
+ },
+ "hostname": {
+ "content": "$2",
+ "example": "bitwarden.com"
+ }
+ }
+ },
+ "invalidMasterPassword": {
+ "message": "Sandi utama tidak valid"
+ },
+ "vaultTimeout": {
+ "message": "Batas Waktu Brankas"
+ },
+ "lockNow": {
+ "message": "Kunci Sekarang"
+ },
+ "immediately": {
+ "message": "Segera"
+ },
+ "tenSeconds": {
+ "message": "10 detik"
+ },
+ "twentySeconds": {
+ "message": "20 detik"
+ },
+ "thirtySeconds": {
+ "message": "30 detik"
+ },
+ "oneMinute": {
+ "message": "1 menit"
+ },
+ "twoMinutes": {
+ "message": "2 menit"
+ },
+ "fiveMinutes": {
+ "message": "5 menit"
+ },
+ "fifteenMinutes": {
+ "message": "15 menit"
+ },
+ "thirtyMinutes": {
+ "message": "30 menit"
+ },
+ "oneHour": {
+ "message": "1 jam"
+ },
+ "fourHours": {
+ "message": "4 jam"
+ },
+ "onLocked": {
+ "message": "Saat Komputer Terkunci"
+ },
+ "onRestart": {
+ "message": "Saat Peramban Dimulai Ulang"
+ },
+ "never": {
+ "message": "Jangan pernah"
+ },
+ "security": {
+ "message": "Keamanan"
+ },
+ "errorOccurred": {
+ "message": "Terjadi kesalahan"
+ },
+ "emailRequired": {
+ "message": "Alamat email diperlukan."
+ },
+ "invalidEmail": {
+ "message": "Alamat email tidak valid."
+ },
+ "masterPassRequired": {
+ "message": "Sandi utama diperlukan."
+ },
+ "masterPassLength": {
+ "message": "Kata sandi utama sedikitnya harus 8 karakter."
+ },
+ "masterPassDoesntMatch": {
+ "message": "Konfirmasi sandi utama tidak cocok."
+ },
+ "newAccountCreated": {
+ "message": "Akun baru Anda telah dibuat! Sekarang Anda bisa masuk."
+ },
+ "masterPassSent": {
+ "message": "Kami telah mengirimi Anda email dengan petunjuk sandi utama Anda."
+ },
+ "verificationCodeRequired": {
+ "message": "Kode verifikasi diperlukan."
+ },
+ "valueCopied": {
+ "message": "$VALUE$ disalin",
+ "description": "Value has been copied to the clipboard.",
+ "placeholders": {
+ "value": {
+ "content": "$1",
+ "example": "Password"
+ }
+ }
+ },
+ "autofillError": {
+ "message": "Tidak dapat mengisi otomatis item yang dipilih pada laman ini. Salin dan tempel informasinya sebagai gantinya."
+ },
+ "loggedOut": {
+ "message": "Keluar"
+ },
+ "loginExpired": {
+ "message": "Sesi masuk Anda telah berakhir."
+ },
+ "logOutConfirmation": {
+ "message": "Anda yakin ingin keluar?"
+ },
+ "yes": {
+ "message": "Ya"
+ },
+ "no": {
+ "message": "Tidak"
+ },
+ "unexpectedError": {
+ "message": "Terjadi kesalahan yang tak diduga."
+ },
+ "nameRequired": {
+ "message": "Nama diperlukan."
+ },
+ "addedFolder": {
+ "message": "Tambah Folder"
+ },
+ "changeMasterPass": {
+ "message": "Ubah Kata Sandi Utama"
+ },
+ "changeMasterPasswordConfirmation": {
+ "message": "Anda dapat mengubah kata sandi utama Anda di brankas web bitwarden.com. Anda ingin mengunjungi situs web sekarang?"
+ },
+ "twoStepLoginConfirmation": {
+ "message": "Info masuk dua langkah membuat akun Anda lebih aman dengan mengharuskan Anda memverifikasi info masuk Anda dengan peranti lain seperti kode keamanan, aplikasi autentikasi, SMK, panggilan telepon, atau email. Info masuk dua langkah dapat diaktifkan di brankas web bitwarden.com. Anda ingin mengunjungi situs web sekarang?"
+ },
+ "editedFolder": {
+ "message": "Folder yang disunting"
+ },
+ "deleteFolderConfirmation": {
+ "message": "Anda yakin Anda ingin menghapus folder ini?"
+ },
+ "deletedFolder": {
+ "message": "Folder dihapus"
+ },
+ "gettingStartedTutorial": {
+ "message": "Tutorial Perkenalan"
+ },
+ "gettingStartedTutorialVideo": {
+ "message": "Lihat tutorial perkenalan kami untuk mempelajari bagaimana mendapatkan hasil maksimal dari ekstensi peramban."
+ },
+ "syncingComplete": {
+ "message": "Sinkronisasi selesai"
+ },
+ "syncingFailed": {
+ "message": "Gagal menyinkronkan"
+ },
+ "passwordCopied": {
+ "message": "Sandi disalin"
+ },
+ "uri": {
+ "message": "URI"
+ },
+ "uriPosition": {
+ "message": "URI $POSITION$",
+ "description": "A listing of URIs. Ex: URI 1, URI 2, URI 3, etc.",
+ "placeholders": {
+ "position": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "newUri": {
+ "message": "URl Baru"
+ },
+ "addedItem": {
+ "message": "Item yang Ditambahkan"
+ },
+ "editedItem": {
+ "message": "Item yang Diedit"
+ },
+ "deleteItemConfirmation": {
+ "message": "Apakah Anda yakin ingin menghapus item ini?"
+ },
+ "deletedItem": {
+ "message": "Item yang dihapus"
+ },
+ "overwritePassword": {
+ "message": "Timpa Kata Sandi"
+ },
+ "overwritePasswordConfirmation": {
+ "message": "Anda yakin ingin menimpa sandi saat ini?"
+ },
+ "searchFolder": {
+ "message": "Cari folder"
+ },
+ "searchCollection": {
+ "message": "Cari koleksi"
+ },
+ "searchType": {
+ "message": "Jenis pencarian"
+ },
+ "noneFolder": {
+ "message": "Tidak Ada Folder",
+ "description": "This is the folder for uncategorized items"
+ },
+ "disableAddLoginNotification": {
+ "message": "Nonaktifkan Notifikasi Penambahan Info Masuk"
+ },
+ "addLoginNotificationDesc": {
+ "message": "\"Notifikasi Penambahan Info Masuk\" secara otomatis akan meminta Anda untuk menyimpan info masuk baru ke brankas Anda saat Anda masuk untuk pertama kalinya."
+ },
+ "dontShowCardsCurrentTab": {
+ "message": "Jangan Tampilkan Kartu pada Laman Tab"
+ },
+ "dontShowCardsCurrentTabDesc": {
+ "message": "Item kartu dari brankas Anda akan ditampilkan pada laman 'Tab' untuk mempermudah akses isi-otomatis."
+ },
+ "dontShowIdentitiesCurrentTab": {
+ "message": "Jangan Tampilkan Identitas pada Laman Tab"
+ },
+ "dontShowIdentitiesCurrentTabDesc": {
+ "message": "Item identitas dari brankas Anda akan ditampilkan pada laman 'Tab' untuk mempermudah akses isi-otomatis."
+ },
+ "clearClipboard": {
+ "message": "Hapus Papan Klip",
+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
+ },
+ "clearClipboardDesc": {
+ "message": "Secara otomatis menghapus konten yang disalin dari papan klip Anda.",
+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
+ },
+ "notificationAddDesc": {
+ "message": "Haruskah Bitwarden mengingat sandi ini untuk Anda?"
+ },
+ "notificationAddSave": {
+ "message": "Iya, Simpan Sekarang"
+ },
+ "notificationNeverSave": {
+ "message": "Jangan pernah untuk situs ini"
+ },
+ "disableChangedPasswordNotification": {
+ "message": "Nonaktifkan Notifikasi Perubahan Kata Sandi"
+ },
+ "disableChangedPasswordNotificationDesc": {
+ "message": "\"Notifikasi Perubahan Kata Sandi\" secara otomatis akan meminta Anda untuk memperbarui kata sandi info masuk di brankas Anda ketika mendeteksi bahwa Anda telah mengubahnya lewat situs web."
+ },
+ "notificationChangeDesc": {
+ "message": "Apakah Anda ingin memperbarui kata sandi ini di Bitwarden?"
+ },
+ "notificationChangeSave": {
+ "message": "Iya, Perbarui Sekarang"
+ },
+ "disableContextMenuItem": {
+ "message": "Nonaktifkan Opsi Menu Konteks"
+ },
+ "disableContextMenuItemDesc": {
+ "message": "Pilihan menu konteks menyediakan akses cepat ke pembuat sandi dan info masuk untuk situs web di tab Anda saat ini."
+ },
+ "defaultUriMatchDetection": {
+ "message": "Deteksi Kecocokan URI Bawaan",
+ "description": "Default URI match detection for auto-fill."
+ },
+ "defaultUriMatchDetectionDesc": {
+ "message": "Pilih cara bawaan penanganan pencocokan URI untuk masuk saat melakukan tindakan seperti isi-otomatis."
+ },
+ "theme": {
+ "message": "Tema"
+ },
+ "themeDesc": {
+ "message": "Ubah tema warna aplikasi."
+ },
+ "dark": {
+ "message": "Gelap",
+ "description": "Dark color"
+ },
+ "light": {
+ "message": "Terang",
+ "description": "Light color"
+ },
+ "solarizedDark": {
+ "message": "Gelap Solarized",
+ "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated."
+ },
+ "exportVault": {
+ "message": "Ekspor Brankas"
+ },
+ "fileFormat": {
+ "message": "Format Berkas"
+ },
+ "warning": {
+ "message": "PERINGATAN",
+ "description": "WARNING (should stay in capitalized letters if the language permits)"
+ },
+ "confirmVaultExport": {
+ "message": "Konfirmasi Ekspor Brankas"
+ },
+ "exportWarningDesc": {
+ "message": "Berkas ekspor ini berisi data brankas Anda dalam format tidak terenkripsi. Jangan pernah menyimpan atau mengirim berkas ini melalui kanal tidak aman (seperti surel). Segera hapus setelah Anda selesai menggunakannya."
+ },
+ "encExportKeyWarningDesc": {
+ "message": "Ekspor ini mengenkripsi data Anda menggunakan kunci enkripsi akun Anda. Jika Anda pernah merotasi kunci enkripsi akun Anda, Anda harus mengekspor lagi karena Anda tidak akan dapat mendekripsi file ekspor ini."
+ },
+ "encExportAccountWarningDesc": {
+ "message": "Kunci enkripsi akun unik untuk setiap akun pengguna Bitwarden, jadi Anda tidak dapat mengimpor ekspor terenkripsi ke akun lain."
+ },
+ "exportMasterPassword": {
+ "message": "Masukkan sandi utama Anda untuk mengekspor data brankas Anda."
+ },
+ "shared": {
+ "message": "Dibagikan"
+ },
+ "learnOrg": {
+ "message": "Pelajari tentang Organisasi"
+ },
+ "learnOrgConfirmation": {
+ "message": "Bitwarden memungkinkan Anda berbagi item brankas Anda dengan orang lain menggunakan organisasi. Maukah Anda mengunjungi laman bitwarden.com untuk mempelajari lebih lanjut?"
+ },
+ "moveToOrganization": {
+ "message": "Pindah ke Organisasi"
+ },
+ "share": {
+ "message": "Bagikan"
+ },
+ "movedItemToOrg": {
+ "message": "$ITEMNAME$ pindah ke $ORGNAME$",
+ "placeholders": {
+ "itemname": {
+ "content": "$1",
+ "example": "Secret Item"
+ },
+ "orgname": {
+ "content": "$2",
+ "example": "Company Name"
+ }
+ }
+ },
+ "moveToOrgDesc": {
+ "message": "Pilihlah sebuah organisasi yang Anda ingin memindahkan item ini. Memindahkan bearti memberikan kepemilikan kepada organisasi tersebut. Anda tidak akan lagi menjadi pemilik item ini."
+ },
+ "learnMore": {
+ "message": "Pelajari lebih lanjut"
+ },
+ "authenticatorKeyTotp": {
+ "message": "Kunci Otentikasi (TOTP)"
+ },
+ "verificationCodeTotp": {
+ "message": "Kode Verifikasi (TOTP)"
+ },
+ "copyVerificationCode": {
+ "message": "Salin Kode Verifikasi"
+ },
+ "attachments": {
+ "message": "Lampiran"
+ },
+ "deleteAttachment": {
+ "message": "Hapus lampiran"
+ },
+ "deleteAttachmentConfirmation": {
+ "message": "Anda yakin ingin menghapus lampiran ini?"
+ },
+ "deletedAttachment": {
+ "message": "Lampiran dihapus"
+ },
+ "newAttachment": {
+ "message": "Tambah Lampiran Baru"
+ },
+ "noAttachments": {
+ "message": "Tidak ada lampiran."
+ },
+ "attachmentSaved": {
+ "message": "Lampiran telah disimpan."
+ },
+ "file": {
+ "message": "Berkas"
+ },
+ "selectFile": {
+ "message": "Pilih berkas."
+ },
+ "maxFileSize": {
+ "message": "Ukuran berkas maksimal adalah 500 MB."
+ },
+ "featureUnavailable": {
+ "message": "Fitur Tidak Tersedia"
+ },
+ "updateKey": {
+ "message": "Anda tidak dapat menggunakan fitur ini sampai Anda memperbarui kunci enkripsi Anda."
+ },
+ "premiumMembership": {
+ "message": "Keanggotaan Premium"
+ },
+ "premiumManage": {
+ "message": "Kelola Keanggotaan"
+ },
+ "premiumManageAlert": {
+ "message": "Anda dapat mengelola keanggotaan Anda di brankas web bitwarden.com. Anda ingin mengunjungi situs web sekarang?"
+ },
+ "premiumRefresh": {
+ "message": "Segarkan Keanggotaan"
+ },
+ "premiumNotCurrentMember": {
+ "message": "Anda saat ini bukan anggota premium."
+ },
+ "premiumSignUpAndGet": {
+ "message": "Daftar untuk keanggotaan premium dan mendapatkan:"
+ },
+ "ppremiumSignUpStorage": {
+ "message": "1 GB penyimpanan berkas yang dienkripsi."
+ },
+ "ppremiumSignUpTwoStep": {
+ "message": "Pilihan info masuk dua langkah tambahan seperti YubiKey, FIDO U2F, dan Duo."
+ },
+ "ppremiumSignUpReports": {
+ "message": "Kebersihan kata sandi, kesehatan akun, dan laporan kebocoran data untuk tetap menjaga keamanan brankas Anda."
+ },
+ "ppremiumSignUpTotp": {
+ "message": "Pembuat kode verifikasi TOTP (2FA) untuk masuk di brankas anda."
+ },
+ "ppremiumSignUpSupport": {
+ "message": "Dukungan pelanggan prioritas."
+ },
+ "ppremiumSignUpFuture": {
+ "message": "Semua fitur-fitur premium masa depan. Akan segera tiba!"
+ },
+ "premiumPurchase": {
+ "message": "Beli Keanggotaan Premium"
+ },
+ "premiumPurchaseAlert": {
+ "message": "Anda dapat membeli keanggotaan premium di brankas web bitwarden.com. Anda ingin mengunjungi situs web sekarang?"
+ },
+ "premiumCurrentMember": {
+ "message": "Anda adalah anggota premium!"
+ },
+ "premiumCurrentMemberThanks": {
+ "message": "Terima kasih telah mendukung Bitwarden."
+ },
+ "premiumPrice": {
+ "message": "Semua itu hanya $PRICE$ /tahun!",
+ "placeholders": {
+ "price": {
+ "content": "$1",
+ "example": "$10"
+ }
+ }
+ },
+ "refreshComplete": {
+ "message": "Penyegaran selesai"
+ },
+ "disableAutoTotpCopy": {
+ "message": "Nonaktifkan Penyalinan Otomatis TOTP"
+ },
+ "disableAutoTotpCopyDesc": {
+ "message": "Jika info masuk Anda memiliki kunci autentikasi yang menyertainya, kode verifikasi TOTP akan disalin secara otomatis ke clipboard Anda setiap kali Anda mengisi info masuk secara otomatis."
+ },
+ "disableAutoBiometricsPrompt": {
+ "message": "Do not prompt for biometrics on launch"
+ },
+ "premiumRequired": {
+ "message": "Membutuhkan Keanggotaan Premium"
+ },
+ "premiumRequiredDesc": {
+ "message": "Keanggotaan premium diperlukan untuk menggunakan fitur ini."
+ },
+ "enterVerificationCodeApp": {
+ "message": "Masukkan 6 digit kode verifikasi dari aplikasi autentikasi Anda."
+ },
+ "enterVerificationCodeEmail": {
+ "message": "Masukkan 6 digit kode verifikasi yang dikirim melalui email ke $EMAIL$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "example@gmail.com"
+ }
+ }
+ },
+ "verificationCodeEmailSent": {
+ "message": "Surel verifikasi telah dikirim ke $EMAIL$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "example@gmail.com"
+ }
+ }
+ },
+ "rememberMe": {
+ "message": "Ingat saya"
+ },
+ "sendVerificationCodeEmailAgain": {
+ "message": "Kirim ulang email kode verifikasi"
+ },
+ "useAnotherTwoStepMethod": {
+ "message": "Gunakan metode masuk dua langkah lainnya"
+ },
+ "insertYubiKey": {
+ "message": "Masukkan YubiKey Anda ke port USB komputer Anda, lalu sentuh tombolnya."
+ },
+ "insertU2f": {
+ "message": "Masukkan kunci keamanan ke port USB komputer Anda. Jika ada tombolnya, tekanlah."
+ },
+ "webAuthnNewTab": {
+ "message": "Untuk memulai verifikasi 2FA WebAuthn. Klik tombol di bawah untuk membuka tab baru dan ikuti instruksi yang diberikan."
+ },
+ "webAuthnNewTabOpen": {
+ "message": "Buka tab baru"
+ },
+ "webAuthnAuthenticate": {
+ "message": "Autentikasi dengan WebAuthn."
+ },
+ "loginUnavailable": {
+ "message": "Info Masuk Tidak Tersedia"
+ },
+ "noTwoStepProviders": {
+ "message": "Akun ini mengaktifkan info masuk dua langkah, namun, tidak satupun dari penyedia dua langkah yang dikonfigurasi didukung oleh peramban web ini."
+ },
+ "noTwoStepProviders2": {
+ "message": "Silakan gunakan peramban web yang didukung (seperti Chrome) dan/atau tambahkan penyedia tambahan yang didukung di semua peramban web (seperti aplikasi autentikasi)."
+ },
+ "twoStepOptions": {
+ "message": "Opsi Info Masuk Dua Langkah"
+ },
+ "recoveryCodeDesc": {
+ "message": "Kehilangan akses ke semua penyedia dua faktor Anda? Gunakan kode pemulihan untuk menonaktifkan semua penyedia dua faktor dari akun Anda."
+ },
+ "recoveryCodeTitle": {
+ "message": "Kode Pemulihan"
+ },
+ "authenticatorAppTitle": {
+ "message": "Aplikasi Otentikasi"
+ },
+ "authenticatorAppDesc": {
+ "message": "Gunakan aplikasi autentikasi (seperti Authy atau Google Authenticator) untuk menghasilkan kode verifikasi berbasis waktu.",
+ "description": "'Authy' and 'Google Authenticator' are product names and should not be translated."
+ },
+ "yubiKeyTitle": {
+ "message": "Kunci Keamanan OTP YubiKey"
+ },
+ "yubiKeyDesc": {
+ "message": "Gunakan YubiKey untuk mengakses akun Anda. Bekerja dengan YubiKey 4, 4 Nano, 4C, dan peranti NEO."
+ },
+ "duoDesc": {
+ "message": "Verifikasi dengan Duo Security menggunakan aplikasi Duo Mobile, SMS, panggilan telepon, atau kunci keamanan U2F.",
+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
+ },
+ "duoOrganizationDesc": {
+ "message": "Verifikasi dengan Duo Security untuk organisasi Anda menggunakan aplikasi Duo Mobile, SMS, panggilan telepon, atau kunci keamanan U2F.",
+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
+ },
+ "webAuthnTitle": {
+ "message": "FIDO2 WebAuthn"
+ },
+ "webAuthnDesc": {
+ "message": "Gunakan kunci yang mendukung WebAUthn untuk mengakses akun anda."
+ },
+ "emailTitle": {
+ "message": "Email"
+ },
+ "emailDesc": {
+ "message": "Kode verifikasi akan dikirim via email kepada Anda."
+ },
+ "selfHostedEnvironment": {
+ "message": "Lingkungan Penyedia Personal"
+ },
+ "selfHostedEnvironmentFooter": {
+ "message": "Tetapkan URL dasar penyedia personal pemasangan Bitwarden Anda."
+ },
+ "customEnvironment": {
+ "message": "Lingkungan Khusus"
+ },
+ "customEnvironmentFooter": {
+ "message": "Untuk pengguna tingkat lanjut. Anda bisa menentukan basis dari URL masing-masing layanan secara independen."
+ },
+ "baseUrl": {
+ "message": "URL Server"
+ },
+ "apiUrl": {
+ "message": "URL Server API"
+ },
+ "webVaultUrl": {
+ "message": "URL Server Brankas Web"
+ },
+ "identityUrl": {
+ "message": "URL Server Identitas"
+ },
+ "notificationsUrl": {
+ "message": "URL Server Notifikasi"
+ },
+ "iconsUrl": {
+ "message": "URL Server Ikon"
+ },
+ "environmentSaved": {
+ "message": "URL dari semua lingkungan telah disimpan."
+ },
+ "enableAutoFillOnPageLoad": {
+ "message": "Aktifkan Isi-Otomatis Saat Memuat Laman"
+ },
+ "enableAutoFillOnPageLoadDesc": {
+ "message": "Jika formulir info masuk terdeteksi, secara otomatis melakukan pengisian otomatis ketika memuat laman web."
+ },
+ "experimentalFeature": {
+ "message": "Fitur ini saat ini adalah fitur eksperimental. Gunakan dengan risiko Anda sendiri."
+ },
+ "defaultAutoFillOnPageLoad": {
+ "message": "Konfigurasi autofill standard untuk item login."
+ },
+ "defaultAutoFillOnPageLoadDesc": {
+ "message": "Setelah mengaktifkan Auto-Fill waktu website terbuka, kamu dapat mengaktifkan atau meng-nonaktifkan feature ini untuk setiap item. Ini adalah konfigurasi standard untuk item yang tidak dikonfigurasi terpisah."
+ },
+ "itemAutoFillOnPageLoad": {
+ "message": "Auto-fill waktu website terbuka (Jika diaktifkan di Options)"
+ },
+ "autoFillOnPageLoadUseDefault": {
+ "message": "Gunakan pengaturan baku"
+ },
+ "autoFillOnPageLoadYes": {
+ "message": "Auto-Fill ketika website baru terbuka"
+ },
+ "autoFillOnPageLoadNo": {
+ "message": "Jangan Auto-Fill ketika website baru terbuka"
+ },
+ "commandOpenPopup": {
+ "message": "Buka popup brankas"
+ },
+ "commandOpenSidebar": {
+ "message": "Buka brankas di bilah samping"
+ },
+ "commandAutofillDesc": {
+ "message": "Isi otomatis info masuk yang digunakan terakhir untuk situs ini"
+ },
+ "commandGeneratePasswordDesc": {
+ "message": "Buat dan salin kata sandi acak baru ke papan klip."
+ },
+ "commandLockVaultDesc": {
+ "message": "Kunci brankas"
+ },
+ "privateModeMessage": {
+ "message": "Sayangnya jendela ini tidak tersedia di mode pribadi untuk peramban ini."
+ },
+ "customFields": {
+ "message": "Ruas Khusus"
+ },
+ "copyValue": {
+ "message": "Salin Nilai"
+ },
+ "value": {
+ "message": "Nilai"
+ },
+ "newCustomField": {
+ "message": "Ruas Khusus Baru"
+ },
+ "dragToSort": {
+ "message": "Seret untuk mengurutkan"
+ },
+ "cfTypeText": {
+ "message": "Teks"
+ },
+ "cfTypeHidden": {
+ "message": "Tersembunyi"
+ },
+ "cfTypeBoolean": {
+ "message": "Boolean"
+ },
+ "popup2faCloseMessage": {
+ "message": "Tindakan klik diluar jendela popup untuk memeriksa kode verifikasi di dalam surel Anda akan menyebabkan popup ini ditutup. Apakah Anda ingin membuka popup ini di jendela baru sehingga terus tetap terbuka?"
+ },
+ "popupU2fCloseMessage": {
+ "message": "Peramban ini tidak bisa memproses permintaan U2F di jendela popup ini. Apakah Anda ingin membuka popup ini di jendela baru sehingga Anda dapat masuk menggunakan U2F?"
+ },
+ "disableFavicon": {
+ "message": "Nonaktifkan Ikon Situs Web"
+ },
+ "disableFaviconDesc": {
+ "message": "Ikon Situs Web menyediakan gambar yang mudah dikenali di sebelah item info masuk di dalam brankas Anda."
+ },
+ "disableBadgeCounter": {
+ "message": "Matikan angka penghitung "
+ },
+ "disableBadgeCounterDesc": {
+ "message": "Angka penghitung menandakan jumlah login yang kamu punya untuk website saat ini yang ada di dalam vault kamu."
+ },
+ "cardholderName": {
+ "message": "Nama Pemegang Kartu"
+ },
+ "number": {
+ "message": "Nomor"
+ },
+ "brand": {
+ "message": "Merek"
+ },
+ "expirationMonth": {
+ "message": "Bulan Kedaluwarsa"
+ },
+ "expirationYear": {
+ "message": "Tahun Kedaluwarsa"
+ },
+ "expiration": {
+ "message": "Masa Berlaku"
+ },
+ "january": {
+ "message": "Januari"
+ },
+ "february": {
+ "message": "Februari"
+ },
+ "march": {
+ "message": "Maret"
+ },
+ "april": {
+ "message": "April"
+ },
+ "may": {
+ "message": "Mei"
+ },
+ "june": {
+ "message": "Juni"
+ },
+ "july": {
+ "message": "Juli"
+ },
+ "august": {
+ "message": "Agustus"
+ },
+ "september": {
+ "message": "September"
+ },
+ "october": {
+ "message": "Oktober"
+ },
+ "november": {
+ "message": "November"
+ },
+ "december": {
+ "message": "Desember"
+ },
+ "securityCode": {
+ "message": "Kode Keamanan"
+ },
+ "ex": {
+ "message": "mis."
+ },
+ "title": {
+ "message": "Panggilan"
+ },
+ "mr": {
+ "message": "Tuan"
+ },
+ "mrs": {
+ "message": "Nyonya"
+ },
+ "ms": {
+ "message": "Nona"
+ },
+ "dr": {
+ "message": "Dr"
+ },
+ "firstName": {
+ "message": "Nama Depan"
+ },
+ "middleName": {
+ "message": "Nama Tengah"
+ },
+ "lastName": {
+ "message": "Nama Belakang"
+ },
+ "identityName": {
+ "message": "Nama Identitas"
+ },
+ "company": {
+ "message": "Perusahaan"
+ },
+ "ssn": {
+ "message": "Nomor Jaminan Sosial"
+ },
+ "passportNumber": {
+ "message": "Nomor Paspor"
+ },
+ "licenseNumber": {
+ "message": "Nomor Lisensi"
+ },
+ "email": {
+ "message": "Email"
+ },
+ "phone": {
+ "message": "Telepon"
+ },
+ "address": {
+ "message": "Alamat"
+ },
+ "address1": {
+ "message": "Alamat 1"
+ },
+ "address2": {
+ "message": "Alamat 2"
+ },
+ "address3": {
+ "message": "Alamat 3"
+ },
+ "cityTown": {
+ "message": "Kota / Kabupaten"
+ },
+ "stateProvince": {
+ "message": "Negara Bagian / Provinsi"
+ },
+ "zipPostalCode": {
+ "message": "Kode Pos"
+ },
+ "country": {
+ "message": "Negara"
+ },
+ "type": {
+ "message": "Tipe"
+ },
+ "typeLogin": {
+ "message": "Info Masuk"
+ },
+ "typeLogins": {
+ "message": "Info Masuk"
+ },
+ "typeSecureNote": {
+ "message": "Catatan Aman"
+ },
+ "typeCard": {
+ "message": "Kartu"
+ },
+ "typeIdentity": {
+ "message": "Identitas"
+ },
+ "passwordHistory": {
+ "message": "Riwayat Kata Sandi"
+ },
+ "back": {
+ "message": "Kembali"
+ },
+ "collections": {
+ "message": "Koleksi"
+ },
+ "favorites": {
+ "message": "Favorit"
+ },
+ "popOutNewWindow": {
+ "message": "Buka di jendela baru"
+ },
+ "refresh": {
+ "message": "Segarkan"
+ },
+ "cards": {
+ "message": "Kartu"
+ },
+ "identities": {
+ "message": "Identitas"
+ },
+ "logins": {
+ "message": "Info Masuk"
+ },
+ "secureNotes": {
+ "message": "Catatan Aman"
+ },
+ "clear": {
+ "message": "Bersihkan",
+ "description": "To clear something out. example: To clear browser history."
+ },
+ "checkPassword": {
+ "message": "Periksa jika kata sandi telah terekspos."
+ },
+ "passwordExposed": {
+ "message": "Kata sandi ini telah terekspos $VALUE$ kali dalam insiden kebocoran data. Anda harus memperbaruinya.",
+ "placeholders": {
+ "value": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "passwordSafe": {
+ "message": "Kata sandi ini tidak ditemukan dalam insiden kebocoran data yang ada. Kata sandi tersebut seharusnya aman untuk digunakan."
+ },
+ "baseDomain": {
+ "message": "Domain basis"
+ },
+ "host": {
+ "message": "Hos",
+ "description": "A URL's host value. For example, the host of https://sub.domain.com:443 is 'sub.domain.com:443'."
+ },
+ "exact": {
+ "message": "Tepat"
+ },
+ "startsWith": {
+ "message": "Mulai dengan"
+ },
+ "regEx": {
+ "message": "Ekspresi umum",
+ "description": "A programming term, also known as 'RegEx'."
+ },
+ "matchDetection": {
+ "message": "Deteksi Kecocokan",
+ "description": "URI match detection for auto-fill."
+ },
+ "defaultMatchDetection": {
+ "message": "Deteksi kecocokan standar",
+ "description": "Default URI match detection for auto-fill."
+ },
+ "toggleOptions": {
+ "message": "Ubah Opsi"
+ },
+ "toggleCurrentUris": {
+ "message": "Alihkan URI Saat Ini",
+ "description": "Toggle the display of the URIs of the currently open tabs in the browser."
+ },
+ "currentUri": {
+ "message": "URI Saat Ini",
+ "description": "The URI of one of the current open tabs in the browser."
+ },
+ "organization": {
+ "message": "Organisasi",
+ "description": "An entity of multiple related people (ex. a team or business organization)."
+ },
+ "types": {
+ "message": "Tipe"
+ },
+ "allItems": {
+ "message": "Semua Item"
+ },
+ "noPasswordsInList": {
+ "message": "Tidak ada sandi yang dapat dicantumkan."
+ },
+ "remove": {
+ "message": "Hapus"
+ },
+ "default": {
+ "message": "Bawaan"
+ },
+ "dateUpdated": {
+ "message": "Diperbarui",
+ "description": "ex. Date this item was updated"
+ },
+ "datePasswordUpdated": {
+ "message": "Kata Sandi Diperbarui",
+ "description": "ex. Date this password was updated"
+ },
+ "neverLockWarning": {
+ "message": "Apakah Anda yakin ingin menggunakan opsi \"Jangan Pernah\"? Mengatur opsi penguncian ke \"Jangan Pernah\" akan menyimpan kunci enkripsi brankas Anda di dalam perangkat. Jika Anda menggunakan opsi ini, Anda harus pastikan perangkat Anda dilindungi dengan baik."
+ },
+ "noOrganizationsList": {
+ "message": "Anda tidak tergabung dalam organisasi apapun. Organisasi memungkinkan Anda secara aman berbagi item dengan pengguna lainnya."
+ },
+ "noCollectionsInList": {
+ "message": "Tidak ada koleksi untuk ditampilkan."
+ },
+ "ownership": {
+ "message": "Kepemilikan"
+ },
+ "whoOwnsThisItem": {
+ "message": "Siapa pemilik item ini?"
+ },
+ "strong": {
+ "message": "Kuat",
+ "description": "ex. A strong password. Scale: Weak -> Good -> Strong"
+ },
+ "good": {
+ "message": "Baik",
+ "description": "ex. A good password. Scale: Weak -> Good -> Strong"
+ },
+ "weak": {
+ "message": "Lemah",
+ "description": "ex. A weak password. Scale: Weak -> Good -> Strong"
+ },
+ "weakMasterPassword": {
+ "message": "Kata Sandi Utama Lemah"
+ },
+ "weakMasterPasswordDesc": {
+ "message": "Kata sandi utama yang Anda pilih itu lemah. Anda harus menggunakan kata sandi yang kuat (atau frasa sandi) untuk melindungi akun Bitwarden Anda. Apakah Anda yakin ingin menggunakan kata sandi ini?"
+ },
+ "pin": {
+ "message": "PIN",
+ "description": "PIN code. Ex. The short code (often numeric) that you use to unlock a device."
+ },
+ "unlockWithPin": {
+ "message": "Buka kunci dengan PIN"
+ },
+ "setYourPinCode": {
+ "message": "Setel kode PIN Anda untuk membuka kunci Bitwarden. Pengaturan PIN Anda akan diatur ulang jika Anda pernah keluar sepenuhnya dari aplikasi."
+ },
+ "pinRequired": {
+ "message": "Membutuhkan kode PIN."
+ },
+ "invalidPin": {
+ "message": "Kode PIN tidak valid."
+ },
+ "verifyPin": {
+ "message": "Verifikasi PIN"
+ },
+ "yourVaultIsLockedPinCode": {
+ "message": "Brankas Anda terkunci. Verifikasi kode PIN Anda untuk melanjutkan."
+ },
+ "unlockWithBiometrics": {
+ "message": "Buka kunci dengan biometrik"
+ },
+ "awaitDesktop": {
+ "message": "Menunggu konfirmasi dari desktop"
+ },
+ "awaitDesktopDesc": {
+ "message": "Silakan konfirmasi menggunakan biometrik di aplikasi Bitwarden Desktop untuk mengaktifkan biometrik untuk peramban."
+ },
+ "lockWithMasterPassOnRestart": {
+ "message": "Kunci dengan kata sandi utama saat peramban dimulai ulang"
+ },
+ "selectOneCollection": {
+ "message": "Anda harus memilih setidaknya satu koleksi."
+ },
+ "cloneItem": {
+ "message": "Duplikat Item"
+ },
+ "clone": {
+ "message": "Duplikat"
+ },
+ "passwordGeneratorPolicyInEffect": {
+ "message": "Satu atau lebih kebijakan organisasi mempengaruhi pengaturan pembuat sandi Anda."
+ },
+ "vaultTimeoutAction": {
+ "message": "Tindakan Batas Waktu Brankas"
+ },
+ "lock": {
+ "message": "Kunci",
+ "description": "Verb form: to make secure or inaccesible by"
+ },
+ "trash": {
+ "message": "Sampah",
+ "description": "Noun: a special folder to hold deleted items"
+ },
+ "searchTrash": {
+ "message": "Cari di sampah"
+ },
+ "permanentlyDeleteItem": {
+ "message": "Hapus Item Secara Permanen"
+ },
+ "permanentlyDeleteItemConfirmation": {
+ "message": "Apakah Anda yakin ingin menghapus item ini secara permanen?"
+ },
+ "permanentlyDeletedItem": {
+ "message": "Hapus Item Secara Permanen"
+ },
+ "restoreItem": {
+ "message": "Pulihkan Item"
+ },
+ "restoreItemConfirmation": {
+ "message": "Apakah Anda yakin ingin memulihkan item ini?"
+ },
+ "restoredItem": {
+ "message": "Item Yang Dipulihkan"
+ },
+ "vaultTimeoutLogOutConfirmation": {
+ "message": "Keluar akan menghapus semua akses ke brankas Anda dan membutuhkan otentikasi daring setelah periode batas waktu tertentu. Apakah Anda yakin ingin menggunakan pengaturan ini?"
+ },
+ "vaultTimeoutLogOutConfirmationTitle": {
+ "message": "Konfirmasi Tindakan Batas Waktu"
+ },
+ "autoFillAndSave": {
+ "message": "Isi Otomatis dan Simpan"
+ },
+ "autoFillSuccessAndSavedUri": {
+ "message": "Item yang Diisi Otomatis dan URI Tersimpan"
+ },
+ "autoFillSuccess": {
+ "message": "Item Terisi Otomatis"
+ },
+ "setMasterPassword": {
+ "message": "Atur Kata Sandi Utama"
+ },
+ "masterPasswordPolicyInEffect": {
+ "message": "Satu atau lebih kebijakan organisasi membutuhkan kata sandi utama Anda untuk memenuhi persyaratan berikut:"
+ },
+ "policyInEffectMinComplexity": {
+ "message": "Skor kompleksitas minimum $SCORE$",
+ "placeholders": {
+ "score": {
+ "content": "$1",
+ "example": "4"
+ }
+ }
+ },
+ "policyInEffectMinLength": {
+ "message": "Panjang minimum $LENGTH$",
+ "placeholders": {
+ "length": {
+ "content": "$1",
+ "example": "14"
+ }
+ }
+ },
+ "policyInEffectUppercase": {
+ "message": "Berisi satu atau lebih karakter huruf besar"
+ },
+ "policyInEffectLowercase": {
+ "message": "Berisi satu atau lebih karakter huruf kecil"
+ },
+ "policyInEffectNumbers": {
+ "message": "Berisi satu atau lebih angka"
+ },
+ "policyInEffectSpecial": {
+ "message": "Berisi satu atau lebih karakter khusus berikut $CHARS$",
+ "placeholders": {
+ "chars": {
+ "content": "$1",
+ "example": "!@#$%^&*"
+ }
+ }
+ },
+ "masterPasswordPolicyRequirementsNotMet": {
+ "message": "Kata sandi utama Anda yang baru tidak memenuhi persyaratan kebijakan."
+ },
+ "acceptPolicies": {
+ "message": "Dengan mencentang kotak ini, Anda menyetujui yang berikut:"
+ },
+ "acceptPoliciesError": {
+ "message": "Persyaratan Layanan dan Kebijakan Privasi belum disetujui."
+ },
+ "termsOfService": {
+ "message": "Persyaratan Layanan"
+ },
+ "privacyPolicy": {
+ "message": "Kebijakan Privasi"
+ },
+ "hintEqualsPassword": {
+ "message": "Petunjuk kata sandi Anda tidak boleh sama dengan kata sandi Anda."
+ },
+ "ok": {
+ "message": "Oke"
+ },
+ "desktopSyncVerificationTitle": {
+ "message": "Verifikasi sinkronisasi desktop"
+ },
+ "desktopIntegrationVerificationText": {
+ "message": "Harap verifikasi bahwa aplikasi desktop menampilkan sidik jari ini: "
+ },
+ "desktopIntegrationDisabledTitle": {
+ "message": "Integrasi peramban tidak diaktifkan"
+ },
+ "desktopIntegrationDisabledDesc": {
+ "message": "Integrasi peramban tidak diaktifkan di aplikasi Desktop Bitwarden. Silakan aktifkan di pengaturan di dalam aplikasi desktop."
+ },
+ "startDesktopTitle": {
+ "message": "Jalankan aplikasi Desktop Bitwarden"
+ },
+ "startDesktopDesc": {
+ "message": "Aplikasi Desktop Bitwarden harus dijalankan sebelum fungsi ini bisa digunakan."
+ },
+ "errorEnableBiometricTitle": {
+ "message": "Tidak bisa mengaktifkan biometrik"
+ },
+ "errorEnableBiometricDesc": {
+ "message": "Tindakan dibatalkan oleh aplikasi desktop"
+ },
+ "nativeMessagingInvalidEncryptionDesc": {
+ "message": "Aplikasi desktop membatalkan saluran komunikasi aman. Silakan coba lagi proses ini"
+ },
+ "nativeMessagingInvalidEncryptionTitle": {
+ "message": "Komunikasi desktop terputus"
+ },
+ "nativeMessagingWrongUserDesc": {
+ "message": "Aplikasi desktop masuk ke akun yang berbeda. Harap pastikan kedua aplikasi masuk ke akun yang sama."
+ },
+ "nativeMessagingWrongUserTitle": {
+ "message": "Akun tidak cocok"
+ },
+ "biometricsNotEnabledTitle": {
+ "message": "Biometrik tidak diaktifkan"
+ },
+ "biometricsNotEnabledDesc": {
+ "message": "Biometrik peramban mengharuskan biometrik desktop diaktifkan di pengaturan terlebih dahulu."
+ },
+ "biometricsNotSupportedTitle": {
+ "message": "Biometrik tidak didukung"
+ },
+ "biometricsNotSupportedDesc": {
+ "message": "Biometrik peramban tidak didukung di perangkat ini."
+ },
+ "nativeMessaginPermissionErrorTitle": {
+ "message": "Izin tidak diberikan"
+ },
+ "nativeMessaginPermissionErrorDesc": {
+ "message": "Tanpa adanya izin untuk berkomunikasi dengan Aplikasi Desktop Bitwarden kami tidak bisa menyediakan fitur biometrik di dalam ekstensi peramban. Silakan coba lagi."
+ },
+ "nativeMessaginPermissionSidebarTitle": {
+ "message": "Kesalahan permintaan izin"
+ },
+ "nativeMessaginPermissionSidebarDesc": {
+ "message": "Tindakan ini tidak dapat dilakukan di sidebar, coba lagi tindakan di pop-up atau pop-out."
+ },
+ "personalOwnershipSubmitError": {
+ "message": "Karena Kebijakan Perusahaan, Anda dilarang menyimpan item ke brankas personal Anda. Ubah opsi Kepemilikan ke organisasi dan pilih dari Koleksi yang tersedia."
+ },
+ "personalOwnershipPolicyInEffect": {
+ "message": "Kebijakan organisasi memengaruhi opsi kepemilikan Anda."
+ },
+ "excludedDomains": {
+ "message": "Domain yang Dikecualikan"
+ },
+ "excludedDomainsDesc": {
+ "message": "Bitwarden tidak akan meminta untuk menyimpan detail login untuk domain ini. Anda harus menyegarkan halaman agar perubahan diterapkan."
+ },
+ "excludedDomainsInvalidDomain": {
+ "message": "$DOMAIN$ bukan domain yang valid",
+ "placeholders": {
+ "domain": {
+ "content": "$1",
+ "example": "googlecom"
+ }
+ }
+ },
+ "send": {
+ "message": "Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "searchSends": {
+ "message": "Pencarian Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "addSend": {
+ "message": "Tambahkan Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTypeText": {
+ "message": "Teks"
+ },
+ "sendTypeFile": {
+ "message": "Berkas"
+ },
+ "allSends": {
+ "message": "Semua Sends",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "maxAccessCountReached": {
+ "message": "Jumlah akses maksimum tercapai"
+ },
+ "expired": {
+ "message": "Kedaluwarsa"
+ },
+ "pendingDeletion": {
+ "message": "Penghapusan menunggu keputusan"
+ },
+ "passwordProtected": {
+ "message": "Dilindungi kata sandi"
+ },
+ "copySendLink": {
+ "message": "Salin tautan Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "removePassword": {
+ "message": "Hapus Kata Sandi"
+ },
+ "delete": {
+ "message": "Hapus"
+ },
+ "removedPassword": {
+ "message": "Kata Sandi yang Dihapus"
+ },
+ "deletedSend": {
+ "message": "Send Dihapus",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendLink": {
+ "message": "Tautan Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "disabled": {
+ "message": "Dinonaktifkan"
+ },
+ "removePasswordConfirmation": {
+ "message": "Anda yakin ingin menghapus kata sandi?"
+ },
+ "deleteSend": {
+ "message": "Hapus Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "deleteSendConfirmation": {
+ "message": "Anda yakin ingin menghapus Send ini?",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "editSend": {
+ "message": "Edit Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTypeHeader": {
+ "message": "Jenis Send apakah ini?",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendNameDesc": {
+ "message": "Nama yang bersahabat untuk menggambarkan Send ini.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendFileDesc": {
+ "message": "File yang ingin Anda kirim."
+ },
+ "deletionDate": {
+ "message": "Tanggal Penghapusan"
+ },
+ "deletionDateDesc": {
+ "message": "Send akan dihapus secara permanen pada tanggal dan waktu yang ditentukan.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "expirationDate": {
+ "message": "Tanggal habis tempo"
+ },
+ "expirationDateDesc": {
+ "message": "Jika disetel, akses ke Send ini akan berakhir pada tanggal dan waktu yang ditentukan.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "oneDay": {
+ "message": "1 hari"
+ },
+ "days": {
+ "message": "$DAYS$ hari",
+ "placeholders": {
+ "days": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "custom": {
+ "message": "Kustom"
+ },
+ "maximumAccessCount": {
+ "message": "Hitungan Akses Maksimum"
+ },
+ "maximumAccessCountDesc": {
+ "message": "Jika disetel, pengguna tidak dapat lagi mengakses Send ini setelah jumlah akses maksimum tercapai.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendPasswordDesc": {
+ "message": "Secara opsional, minta kata sandi bagi pengguna untuk mengakses Send ini.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendNotesDesc": {
+ "message": "Catatan pribadi tentang Send ini.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendDisableDesc": {
+ "message": "Nonaktifkan Send ini sehingga tidak ada yang dapat mengaksesnya.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendShareDesc": {
+ "message": "Salin tautan Send ini ke papan klip setelah disimpan.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTextDesc": {
+ "message": "Teks yang ingin Anda kirim."
+ },
+ "sendHideText": {
+ "message": "Sembunyikan teks Send ini secara default.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "currentAccessCount": {
+ "message": "Hitungan Akses Saat Ini"
+ },
+ "createSend": {
+ "message": "Buat Send Baru",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "newPassword": {
+ "message": "Kata Sandi baru"
+ },
+ "sendDisabled": {
+ "message": "Send Dinonaktifkan",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendDisabledWarning": {
+ "message": "Karena kebijakan perusahaan, Anda hanya dapat menghapus Send yang sudah ada.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "createdSend": {
+ "message": "Send Dibuat ",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "editedSend": {
+ "message": "Send diedit",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendLinuxChromiumFileWarning": {
+ "message": "Untuk memilih file ini, buka Extension di sidebar (jika memungkinkan) atau keluarkan menjadi window baru dengan menekan gambar ini."
+ },
+ "sendFirefoxFileWarning": {
+ "message": "Untuk memilih file menggunakan Firefox, buka ekstensi di sidebar atau keluar ke jendela baru dengan mengklik banner ini."
+ },
+ "sendSafariFileWarning": {
+ "message": "Untuk memilih file menggunakan Safari, keluar ke jendela baru dengan mengklik spanduk ini."
+ },
+ "sendFileCalloutHeader": {
+ "message": "Sebelum kamu memulai"
+ },
+ "sendFirefoxCustomDatePopoutMessage1": {
+ "message": "Untuk menggunakan pemilih tanggal gaya kalender",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read '**To use a calendar style date picker ** click here to pop out your window.'"
+ },
+ "sendFirefoxCustomDatePopoutMessage2": {
+ "message": "klik disini",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker **click here** to pop out your window.'"
+ },
+ "sendFirefoxCustomDatePopoutMessage3": {
+ "message": "untuk memunculkan jendela Anda.",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker click here **to pop out your window.**'"
+ },
+ "expirationDateIsInvalid": {
+ "message": "Tanggal kedaluwarsa yang diberikan tidak valid."
+ },
+ "deletionDateIsInvalid": {
+ "message": "Tanggal penghapusan yang diberikan tidak valid."
+ },
+ "expirationDateAndTimeRequired": {
+ "message": "Diperlukan tanggal dan waktu kedaluwarsa."
+ },
+ "deletionDateAndTimeRequired": {
+ "message": "Tanggal dan waktu penghapusan diperlukan."
+ },
+ "dateParsingError": {
+ "message": "Terjadi kesalahan saat menyimpan tanggal penghapusan dan kedaluwarsa Anda."
+ },
+ "hideEmail": {
+ "message": "Sembunyikan alamat surel dari penerima."
+ },
+ "sendOptionsPolicyInEffect": {
+ "message": "Satu atau lebih kebijakan organisasi mempengaruhi pengaturan feature Send anda."
+ },
+ "passwordPrompt": {
+ "message": "Master password ditanyakan kembali"
+ },
+ "passwordConfirmation": {
+ "message": "Konfirmasi sandi utama"
+ },
+ "passwordConfirmationDesc": {
+ "message": "Aksi ini terproteksi. Untuk melanjutkan, masukkan kembali sandi utama Anda untuk verifikasi identitas."
+ },
+ "emailVerificationRequired": {
+ "message": "Verifikasi Email Diperlukan"
+ },
+ "emailVerificationRequiredDesc": {
+ "message": "Anda harus memverifikasi email Anda untuk menggunakan fitur ini. Anda dapat memverifikasi email Anda di brankas web."
+ },
+ "updatedMasterPassword": {
+ "message": "Updated Master Password"
+ },
+ "updateMasterPassword": {
+ "message": "Update Master Password"
+ },
+ "updateMasterPasswordWarning": {
+ "message": "Your Master Password was recently changed by an administrator in your organization. In order to access the vault, you must update it now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour."
+ },
+ "resetPasswordPolicyAutoEnroll": {
+ "message": "Automatic Enrollment"
+ },
+ "resetPasswordAutoEnrollInviteWarning": {
+ "message": "This organization has an enterprise policy that will automatically enroll you in password reset. Enrollment will allow organization administrators to change your master password."
+ },
+ "selectFolder": {
+ "message": "Select folder..."
+ },
+ "ssoCompleteRegistration": {
+ "message": "In order to complete logging in with SSO, please set a master password to access and protect your vault."
+ },
+ "hours": {
+ "message": "Hours"
+ },
+ "minutes": {
+ "message": "Minutes"
+ },
+ "vaultTimeoutPolicyInEffect": {
+ "message": "Your organization policies are affecting your vault timeout. Maximum allowed Vault Timeout is $HOURS$ hour(s) and $MINUTES$ minute(s)",
+ "placeholders": {
+ "hours": {
+ "content": "$1",
+ "example": "5"
+ },
+ "minutes": {
+ "content": "$2",
+ "example": "5"
+ }
+ }
+ },
+ "vaultTimeoutToLarge": {
+ "message": "Your vault timeout exceeds the restrictions set by your organization."
+ },
+ "vaultExportDisabled": {
+ "message": "Vault Export Disabled"
+ },
+ "personalVaultExportPolicyInEffect": {
+ "message": "One or more organization policies prevents you from exporting your personal vault."
+ },
+ "copyCustomFieldNameInvalidElement": {
+ "message": "Unable to identify a valid form element. Try inspecting the HTML instead."
+ },
+ "copyCustomFieldNameNotUnique": {
+ "message": "No unique identifier found."
+ }
+}
diff --git a/src/iOS.Safari/Resources/_locales/it/messages.json b/src/iOS.Safari/Resources/_locales/it/messages.json
new file mode 100644
index 000000000..577c9e338
--- /dev/null
+++ b/src/iOS.Safari/Resources/_locales/it/messages.json
@@ -0,0 +1,1817 @@
+{
+ "appName": {
+ "message": "Bitwarden"
+ },
+ "extName": {
+ "message": "Bitwarden - Gestore di password gratuito",
+ "description": "Extension name, MUST be less than 40 characters (Safari restriction)"
+ },
+ "extDesc": {
+ "message": "Un gestore di password sicuro e gratuito per tutti i tuoi dispositivi.",
+ "description": "Extension description"
+ },
+ "loginOrCreateNewAccount": {
+ "message": "Accedi o crea un nuovo account per accedere alla tua cassaforte."
+ },
+ "createAccount": {
+ "message": "Crea account"
+ },
+ "login": {
+ "message": "Accedi"
+ },
+ "enterpriseSingleSignOn": {
+ "message": "Single Sign-On aziendale"
+ },
+ "cancel": {
+ "message": "Annulla"
+ },
+ "close": {
+ "message": "Chiudi"
+ },
+ "submit": {
+ "message": "Invia"
+ },
+ "emailAddress": {
+ "message": "Indirizzo email"
+ },
+ "masterPass": {
+ "message": "Password principale"
+ },
+ "masterPassDesc": {
+ "message": "La password principale è la password che utilizzi per accedere alla tua cassaforte. È molto importante che tu non la dimentichi. Non c'è modo di recuperare questa password nel caso che tu la dimenticassi."
+ },
+ "masterPassHintDesc": {
+ "message": "Un suggerimento per la password principale può aiutarti a ricordarla nel caso la dimenticassi."
+ },
+ "reTypeMasterPass": {
+ "message": "Ri-digita la tua password principale"
+ },
+ "masterPassHint": {
+ "message": "Suggerimento password principale (facoltativo)"
+ },
+ "tab": {
+ "message": "Scheda"
+ },
+ "myVault": {
+ "message": "Cassaforte"
+ },
+ "tools": {
+ "message": "Strumenti"
+ },
+ "settings": {
+ "message": "Impostazioni"
+ },
+ "currentTab": {
+ "message": "Scheda attuale"
+ },
+ "copyPassword": {
+ "message": "Copia password"
+ },
+ "copyNote": {
+ "message": "Copia nota"
+ },
+ "copyUri": {
+ "message": "Copia URI"
+ },
+ "copyUsername": {
+ "message": "Copia nome utente"
+ },
+ "copyNumber": {
+ "message": "Copia numero"
+ },
+ "copySecurityCode": {
+ "message": "Copia codice di sicurezza"
+ },
+ "autoFill": {
+ "message": "Auto-riempimento"
+ },
+ "generatePasswordCopied": {
+ "message": "Genera password (copiata)"
+ },
+ "copyElementIdentifier": {
+ "message": "Copia nome campo personalizzato"
+ },
+ "noMatchingLogins": {
+ "message": "Nessun login corrispondente."
+ },
+ "vaultLocked": {
+ "message": "La cassaforte è bloccata."
+ },
+ "vaultLoggedOut": {
+ "message": "La cassaforte è bloccata."
+ },
+ "autoFillInfo": {
+ "message": "Non ci sono login disponibili per completare la scheda attuale del browser."
+ },
+ "addLogin": {
+ "message": "Aggiungi un login"
+ },
+ "addItem": {
+ "message": "Aggiungi elemento"
+ },
+ "passwordHint": {
+ "message": "Suggerimento password"
+ },
+ "enterEmailToGetHint": {
+ "message": "Inserisci l'indirizzo email del tuo account per ricevere il suggerimento della password principale."
+ },
+ "getMasterPasswordHint": {
+ "message": "Ottieni il suggerimento della password principale"
+ },
+ "continue": {
+ "message": "Continua"
+ },
+ "verificationCode": {
+ "message": "Codice di verifica"
+ },
+ "account": {
+ "message": "Account"
+ },
+ "changeMasterPassword": {
+ "message": "Modifica password principale"
+ },
+ "fingerprintPhrase": {
+ "message": "Frase impronta",
+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
+ },
+ "yourAccountsFingerprint": {
+ "message": "Frase impronta dell'account",
+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
+ },
+ "twoStepLogin": {
+ "message": "Verifica in due passaggi"
+ },
+ "logOut": {
+ "message": "Esci"
+ },
+ "about": {
+ "message": "Informazioni"
+ },
+ "version": {
+ "message": "Versione"
+ },
+ "save": {
+ "message": "Salva"
+ },
+ "move": {
+ "message": "Sposta"
+ },
+ "addFolder": {
+ "message": "Aggiungi cartella"
+ },
+ "name": {
+ "message": "Nome"
+ },
+ "editFolder": {
+ "message": "Modifica cartella"
+ },
+ "deleteFolder": {
+ "message": "Elimina cartella"
+ },
+ "folders": {
+ "message": "Cartelle"
+ },
+ "noFolders": {
+ "message": "Non ci sono cartelle da elencare."
+ },
+ "helpFeedback": {
+ "message": "Aiuto e segnalazioni"
+ },
+ "sync": {
+ "message": "Sincronizza"
+ },
+ "syncVaultNow": {
+ "message": "Sincronizza ora la cassaforte"
+ },
+ "lastSync": {
+ "message": "Ultima sincronizzazione:"
+ },
+ "passGen": {
+ "message": "Generatore di password"
+ },
+ "generator": {
+ "message": "Generatore",
+ "description": "Short for 'Password Generator'."
+ },
+ "passGenInfo": {
+ "message": "Genera automaticamente password complesse e uniche per i tuoi login."
+ },
+ "bitWebVault": {
+ "message": "Cassaforte web di Bitwarden"
+ },
+ "importItems": {
+ "message": "Importa elementi"
+ },
+ "select": {
+ "message": "Seleziona"
+ },
+ "generatePassword": {
+ "message": "Genera password"
+ },
+ "regeneratePassword": {
+ "message": "Rigenera password"
+ },
+ "options": {
+ "message": "Opzioni"
+ },
+ "length": {
+ "message": "Lunghezza"
+ },
+ "numWords": {
+ "message": "Numero di parole"
+ },
+ "wordSeparator": {
+ "message": "Separatore parole"
+ },
+ "capitalize": {
+ "message": "Rendi maiuscolo",
+ "description": "Make the first letter of a work uppercase."
+ },
+ "includeNumber": {
+ "message": "Includi numero"
+ },
+ "minNumbers": {
+ "message": "Minimo di numeri"
+ },
+ "minSpecial": {
+ "message": "Minimo di speciali"
+ },
+ "avoidAmbChar": {
+ "message": "Evita caratteri ambigui"
+ },
+ "searchVault": {
+ "message": "Cerca nella cassaforte"
+ },
+ "edit": {
+ "message": "Modifica"
+ },
+ "view": {
+ "message": "Visualizza"
+ },
+ "noItemsInList": {
+ "message": "Non ci sono elementi da elencare."
+ },
+ "itemInformation": {
+ "message": "Informazioni sull'elemento"
+ },
+ "username": {
+ "message": "Nome utente"
+ },
+ "password": {
+ "message": "Password"
+ },
+ "passphrase": {
+ "message": "Frase segreta"
+ },
+ "favorite": {
+ "message": "Preferito"
+ },
+ "notes": {
+ "message": "Note"
+ },
+ "note": {
+ "message": "Nota"
+ },
+ "editItem": {
+ "message": "Modifica elemento"
+ },
+ "folder": {
+ "message": "Cartella"
+ },
+ "deleteItem": {
+ "message": "Elimina elemento"
+ },
+ "viewItem": {
+ "message": "Visualizza elemento"
+ },
+ "launch": {
+ "message": "Avvia"
+ },
+ "website": {
+ "message": "Sito web"
+ },
+ "toggleVisibility": {
+ "message": "Mostra/Nascondi"
+ },
+ "manage": {
+ "message": "Gestisci"
+ },
+ "other": {
+ "message": "Altro"
+ },
+ "rateExtension": {
+ "message": "Valuta l'estensione"
+ },
+ "rateExtensionDesc": {
+ "message": "Prendi in considerazione l'idea di lasciarci una buona recensione!"
+ },
+ "browserNotSupportClipboard": {
+ "message": "Il tuo browser non supporta la copia dagli appunti. Copiala manualmente."
+ },
+ "verifyMasterPassword": {
+ "message": "Verifica password principale"
+ },
+ "yourVaultIsLocked": {
+ "message": "La tua cassaforte è bloccata. Inserisci la tua password principale per continuare."
+ },
+ "unlock": {
+ "message": "Sblocca"
+ },
+ "loggedInAsOn": {
+ "message": "Accesso effettuato come $EMAIL$ su $HOSTNAME$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "name@example.com"
+ },
+ "hostname": {
+ "content": "$2",
+ "example": "bitwarden.com"
+ }
+ }
+ },
+ "invalidMasterPassword": {
+ "message": "Password principale errata"
+ },
+ "vaultTimeout": {
+ "message": "Timeout cassaforte"
+ },
+ "lockNow": {
+ "message": "Blocca ora"
+ },
+ "immediately": {
+ "message": "Immediatamente"
+ },
+ "tenSeconds": {
+ "message": "10 secondi"
+ },
+ "twentySeconds": {
+ "message": "20 secondi"
+ },
+ "thirtySeconds": {
+ "message": "30 secondi"
+ },
+ "oneMinute": {
+ "message": "1 minuto"
+ },
+ "twoMinutes": {
+ "message": "2 minuti"
+ },
+ "fiveMinutes": {
+ "message": "5 minuti"
+ },
+ "fifteenMinutes": {
+ "message": "15 minuti"
+ },
+ "thirtyMinutes": {
+ "message": "30 minuti"
+ },
+ "oneHour": {
+ "message": "1 ora"
+ },
+ "fourHours": {
+ "message": "4 ore"
+ },
+ "onLocked": {
+ "message": "Al blocco del computer"
+ },
+ "onRestart": {
+ "message": "Al riavvio del browser"
+ },
+ "never": {
+ "message": "Mai"
+ },
+ "security": {
+ "message": "Sicurezza"
+ },
+ "errorOccurred": {
+ "message": "Si è verificato un errore"
+ },
+ "emailRequired": {
+ "message": "L'indirizzo email è obbligatorio."
+ },
+ "invalidEmail": {
+ "message": "Indirizzo email non valido."
+ },
+ "masterPassRequired": {
+ "message": "La password principale è obbligatoria."
+ },
+ "masterPassLength": {
+ "message": "La password principale deve essere lunga almeno 8 caratteri."
+ },
+ "masterPassDoesntMatch": {
+ "message": "La conferma della password principale non corrisponde."
+ },
+ "newAccountCreated": {
+ "message": "Il tuo nuovo account è stato creato! Ora puoi eseguire l'accesso."
+ },
+ "masterPassSent": {
+ "message": "Ti abbiamo inviato una email con il tuo suggerimento per la password principale."
+ },
+ "verificationCodeRequired": {
+ "message": "Il codice di verifica è obbligatorio."
+ },
+ "valueCopied": {
+ "message": "$VALUE$ copiato",
+ "description": "Value has been copied to the clipboard.",
+ "placeholders": {
+ "value": {
+ "content": "$1",
+ "example": "Password"
+ }
+ }
+ },
+ "autofillError": {
+ "message": "Impossibile completare automaticamente il login selezionato per questa pagina. Copia e incolla manualmente le tue credenziali."
+ },
+ "loggedOut": {
+ "message": "Disconnesso"
+ },
+ "loginExpired": {
+ "message": "La tua sessione è scaduta."
+ },
+ "logOutConfirmation": {
+ "message": "Sei sicuro di volerti disconnettere?"
+ },
+ "yes": {
+ "message": "Sì"
+ },
+ "no": {
+ "message": "No"
+ },
+ "unexpectedError": {
+ "message": "Si è verificato un errore imprevisto."
+ },
+ "nameRequired": {
+ "message": "Il nome è obbligatorio."
+ },
+ "addedFolder": {
+ "message": "Cartella aggiunta"
+ },
+ "changeMasterPass": {
+ "message": "Modifica password principale"
+ },
+ "changeMasterPasswordConfirmation": {
+ "message": "Puoi cambiare la tua password principale sulla cassaforte online di bitwarden.com. Vuoi visitare ora il sito?"
+ },
+ "twoStepLoginConfirmation": {
+ "message": "L'autenticazione in due passaggi rende il tuo account più sicuro richiedendo di verificare il login con un altro dispositivo come una chiave di sicurezza, applicazione di autenticazione, SMS, telefonata o email. Può essere abilitata sulla cassaforte online di bitwarden.com. Vuoi visitare il sito ora?"
+ },
+ "editedFolder": {
+ "message": "Cartella modificata"
+ },
+ "deleteFolderConfirmation": {
+ "message": "Sei sicuro di voler modificare questa cartella?"
+ },
+ "deletedFolder": {
+ "message": "Cartella eliminata"
+ },
+ "gettingStartedTutorial": {
+ "message": "Guida per iniziare"
+ },
+ "gettingStartedTutorialVideo": {
+ "message": "Guarda il nostro tutorial iniziale per capire come ottenere il massimo dall'estensione del browser."
+ },
+ "syncingComplete": {
+ "message": "Sincronizzazione completata"
+ },
+ "syncingFailed": {
+ "message": "Sincronizzazione non riuscita"
+ },
+ "passwordCopied": {
+ "message": "Password copiata"
+ },
+ "uri": {
+ "message": "URI"
+ },
+ "uriPosition": {
+ "message": "URI $POSITION$",
+ "description": "A listing of URIs. Ex: URI 1, URI 2, URI 3, etc.",
+ "placeholders": {
+ "position": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "newUri": {
+ "message": "Nuovo URI"
+ },
+ "addedItem": {
+ "message": "Elemento aggiunto"
+ },
+ "editedItem": {
+ "message": "Elemento modificato"
+ },
+ "deleteItemConfirmation": {
+ "message": "Sei sicuro di voler cestinare questo elemento?"
+ },
+ "deletedItem": {
+ "message": "Elemento cestinato"
+ },
+ "overwritePassword": {
+ "message": "Sovrascrivi password"
+ },
+ "overwritePasswordConfirmation": {
+ "message": "Sei sicuro di voler sovrascrivere la password corrente?"
+ },
+ "searchFolder": {
+ "message": "Cerca nella cartella"
+ },
+ "searchCollection": {
+ "message": "Cerca nella raccolta"
+ },
+ "searchType": {
+ "message": "Cerca tipo"
+ },
+ "noneFolder": {
+ "message": "Nessuna cartella",
+ "description": "This is the folder for uncategorized items"
+ },
+ "disableAddLoginNotification": {
+ "message": "Disabilita notifica di aggiunta login"
+ },
+ "addLoginNotificationDesc": {
+ "message": "\"Aggiungi notifica di login\" richiede automaticamente di salvare i nuovi login nella tua cassaforte ogni volta che accedi per la prima volta."
+ },
+ "dontShowCardsCurrentTab": {
+ "message": "Non mostrare le carte nella pagina delle schede"
+ },
+ "dontShowCardsCurrentTabDesc": {
+ "message": "I dati della carta dalla tua cassaforte sono elencati nella sezione \"Scheda attuale\" per facilitare il riempimento automatico."
+ },
+ "dontShowIdentitiesCurrentTab": {
+ "message": "Non mostrare le identità nella pagina delle schede"
+ },
+ "dontShowIdentitiesCurrentTabDesc": {
+ "message": "Le identità della tua cassaforte sono elencati nella sezione \"Scheda attuale\" per facilitare il completamento automatico."
+ },
+ "clearClipboard": {
+ "message": "Cancella appunti",
+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
+ },
+ "clearClipboardDesc": {
+ "message": "Cancella automaticamente dagli appunti i valori copiati.",
+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
+ },
+ "notificationAddDesc": {
+ "message": "Vuoi che Bitwarden ricordi questa password per te?"
+ },
+ "notificationAddSave": {
+ "message": "Sì, salva ora"
+ },
+ "notificationNeverSave": {
+ "message": "Mai per questo sito"
+ },
+ "disableChangedPasswordNotification": {
+ "message": "Disabilita notifica di modifica delle password"
+ },
+ "disableChangedPasswordNotificationDesc": {
+ "message": "La \"notifica di cambio password\" chiede automaticamente di aggiornare la password di un account della cassaforte ogni qualvolta viene rilevata una modifica su un sito web."
+ },
+ "notificationChangeDesc": {
+ "message": "Vuoi aggiornare questa password in Bitwarden?"
+ },
+ "notificationChangeSave": {
+ "message": "Sì, aggiorna ora"
+ },
+ "disableContextMenuItem": {
+ "message": "Disabilita integrazione del menu contestuale"
+ },
+ "disableContextMenuItemDesc": {
+ "message": "Le opzioni del menu contestuale forniscono accesso rapido alla generazione di password e ai login per il sito web nella scheda corrente."
+ },
+ "defaultUriMatchDetection": {
+ "message": "Rilevamento corrispondenza URI predefinito",
+ "description": "Default URI match detection for auto-fill."
+ },
+ "defaultUriMatchDetectionDesc": {
+ "message": "Scegli il modo predefinito in cui il rilevamento della corrispondenza URI viene gestito per gli accessi quando si eseguono azioni come il riempimento automatico."
+ },
+ "theme": {
+ "message": "Tema"
+ },
+ "themeDesc": {
+ "message": "Cambia lo schema di colori dell'applicazione."
+ },
+ "dark": {
+ "message": "Scuro",
+ "description": "Dark color"
+ },
+ "light": {
+ "message": "Chiaro",
+ "description": "Light color"
+ },
+ "solarizedDark": {
+ "message": "Solarizzato scuro",
+ "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated."
+ },
+ "exportVault": {
+ "message": "Esporta cassaforte"
+ },
+ "fileFormat": {
+ "message": "Formato file"
+ },
+ "warning": {
+ "message": "ATTENZIONE",
+ "description": "WARNING (should stay in capitalized letters if the language permits)"
+ },
+ "confirmVaultExport": {
+ "message": "Conferma esportazione della cassaforte"
+ },
+ "exportWarningDesc": {
+ "message": "Questa esportazione contiene i dati della tua cassaforte in un formato non cifrato. Non salvare o inviare il file esportato su canali non protetti (come la posta elettronica). Eliminalo immediatamente dopo l'utilizzo."
+ },
+ "encExportKeyWarningDesc": {
+ "message": "Questa esportazione cifra i tuoi dati utilizzando la chiave di cifratura del tuo account. Se cambi la chiave di cifratura del tuo account, non sarai più in grado di decifrare il file esportato e sarà necessario eseguire una nuova esportazione."
+ },
+ "encExportAccountWarningDesc": {
+ "message": "Le chiavi di cifratura dell'account sono uniche per ogni account utente Bitwarden, quindi non è possibile importare un'esportazione cifrata in un account diverso."
+ },
+ "exportMasterPassword": {
+ "message": "Inserisci la tua password principale per esportare i dati della tua cassaforte."
+ },
+ "shared": {
+ "message": "Condiviso"
+ },
+ "learnOrg": {
+ "message": "Scopri le organizzazioni"
+ },
+ "learnOrgConfirmation": {
+ "message": "Bitwarden ti permette di condividere gli elementi della tua cassaforte con altri usando un'organizzazione. Vuoi visitare il sito bitwarden.com per saperne di più?"
+ },
+ "moveToOrganization": {
+ "message": "Sposta in organizzazione"
+ },
+ "share": {
+ "message": "Condividi"
+ },
+ "movedItemToOrg": {
+ "message": "$ITEMNAME$ spostato in $ORGNAME$",
+ "placeholders": {
+ "itemname": {
+ "content": "$1",
+ "example": "Secret Item"
+ },
+ "orgname": {
+ "content": "$2",
+ "example": "Company Name"
+ }
+ }
+ },
+ "moveToOrgDesc": {
+ "message": "Scegli un'organizzazione in cui desideri spostare questo elemento. Spostare in un'organizzazione trasferisce la proprietà dell'elemento all'organizzazione. Non sarai più il proprietario diretto di questo elemento una volta spostato."
+ },
+ "learnMore": {
+ "message": "Per saperne di più"
+ },
+ "authenticatorKeyTotp": {
+ "message": "Chiave di autenticazione (TOTP)"
+ },
+ "verificationCodeTotp": {
+ "message": "Codice di verifica (TOTP)"
+ },
+ "copyVerificationCode": {
+ "message": "Copia codice di verifica"
+ },
+ "attachments": {
+ "message": "Allegati"
+ },
+ "deleteAttachment": {
+ "message": "Elimina allegato"
+ },
+ "deleteAttachmentConfirmation": {
+ "message": "Sei sicuro di voler eliminare questo allegato?"
+ },
+ "deletedAttachment": {
+ "message": "Allegato eliminato"
+ },
+ "newAttachment": {
+ "message": "Aggiungi Nuovo Allegato"
+ },
+ "noAttachments": {
+ "message": "Nessun allegato."
+ },
+ "attachmentSaved": {
+ "message": "L'allegato è stato salvato."
+ },
+ "file": {
+ "message": "File"
+ },
+ "selectFile": {
+ "message": "Seleziona un file."
+ },
+ "maxFileSize": {
+ "message": "La dimensione massima del file è 500 MB."
+ },
+ "featureUnavailable": {
+ "message": "Funzione non disponibile"
+ },
+ "updateKey": {
+ "message": "Non puoi utilizzare questa funzione finché non aggiorni la tua chiave di cifratura."
+ },
+ "premiumMembership": {
+ "message": "Abbonamento Premium"
+ },
+ "premiumManage": {
+ "message": "Gestisci abbonamento"
+ },
+ "premiumManageAlert": {
+ "message": "Puoi gestire il tuo abbonamento premium online su bitwarden.com. Vuoi visitare ora il sito?"
+ },
+ "premiumRefresh": {
+ "message": "Aggiorna abbonamento"
+ },
+ "premiumNotCurrentMember": {
+ "message": "Al momento non sei un membro premium."
+ },
+ "premiumSignUpAndGet": {
+ "message": "Iscriviti a un abbonamento premium e ottieni:"
+ },
+ "ppremiumSignUpStorage": {
+ "message": "1 GB di spazio di archiviazione cifrato per gli allegati."
+ },
+ "ppremiumSignUpTwoStep": {
+ "message": "Opzioni addizionali di login in due passaggi come YubiKey, FIDO U2F, e Duo."
+ },
+ "ppremiumSignUpReports": {
+ "message": "Sicurezza delle password, integrità dell'account e resoconti sulla violazione di dati per mantenere sicura la tua cassaforte."
+ },
+ "ppremiumSignUpTotp": {
+ "message": "Generatore di codice di verifica TOTP (2FA) per i login nella tua cassaforte."
+ },
+ "ppremiumSignUpSupport": {
+ "message": "Supporto clienti prioritario."
+ },
+ "ppremiumSignUpFuture": {
+ "message": "Tutte le funzioni Premium future. Nuove in arrivo!"
+ },
+ "premiumPurchase": {
+ "message": "Acquista Premium"
+ },
+ "premiumPurchaseAlert": {
+ "message": "Puoi acquistare il tuo abbonamento premium online su bitwarden.com. Vuoi visitare ora il sito?"
+ },
+ "premiumCurrentMember": {
+ "message": "Sei un membro premium!"
+ },
+ "premiumCurrentMemberThanks": {
+ "message": "Grazie per il tuo supporto a Bitwarden."
+ },
+ "premiumPrice": {
+ "message": "Il tutto per soli $PRICE$ all'anno!",
+ "placeholders": {
+ "price": {
+ "content": "$1",
+ "example": "$10"
+ }
+ }
+ },
+ "refreshComplete": {
+ "message": "Aggiornamento completato"
+ },
+ "disableAutoTotpCopy": {
+ "message": "Disattiva copia TOTP automatica"
+ },
+ "disableAutoTotpCopyDesc": {
+ "message": "Se il tuo login ha un autenticatore collegato, il codice ti verifica TOTP è automaticamente copiato negli appunti ogni volta che auto-completi il login."
+ },
+ "disableAutoBiometricsPrompt": {
+ "message": "Non richiedere dati biometrici all'avvio"
+ },
+ "premiumRequired": {
+ "message": "Premium richiesto"
+ },
+ "premiumRequiredDesc": {
+ "message": "Un abbonamento premium è richiesto per utilizzare questa funzionalità."
+ },
+ "enterVerificationCodeApp": {
+ "message": "Inserisci il codice di verifica a 6 cifre dalla tua applicazione di autenticazione."
+ },
+ "enterVerificationCodeEmail": {
+ "message": "Inserisci il codice di verifica a 6 cifrato inviato a $EMAIL$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "example@gmail.com"
+ }
+ }
+ },
+ "verificationCodeEmailSent": {
+ "message": "L'email di verifica è stata inviata all'indirizzo $EMAIL$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "example@gmail.com"
+ }
+ }
+ },
+ "rememberMe": {
+ "message": "Ricordami"
+ },
+ "sendVerificationCodeEmailAgain": {
+ "message": "Invia nuovamente l'email con il codice di verifica"
+ },
+ "useAnotherTwoStepMethod": {
+ "message": "Usa un altro metodo di login in due passaggi"
+ },
+ "insertYubiKey": {
+ "message": "Inserisci la tua YubiKey nella porta USB del computer, poi premi il suo pulsante."
+ },
+ "insertU2f": {
+ "message": "Inserisci la tua chiave di sicurezza nella porta USB del tuo computer. Se dispone di un pulsante, premilo."
+ },
+ "webAuthnNewTab": {
+ "message": "Continua la verifica di WebAuthn 2FA nella nuova scheda."
+ },
+ "webAuthnNewTabOpen": {
+ "message": "Apri nuova scheda"
+ },
+ "webAuthnAuthenticate": {
+ "message": "Autenticazione WebAutn"
+ },
+ "loginUnavailable": {
+ "message": "Login non disponibile"
+ },
+ "noTwoStepProviders": {
+ "message": "Questo account ha abilitato il login in due passaggi, ma nessuno dei provider configurati è supportato da questo browser web."
+ },
+ "noTwoStepProviders2": {
+ "message": "Utilizzare un browser web supportato (come Chrome) e/o aggiungere altri provider che sono supportati meglio da tutti i browser web (ad esempio un'applicazione di autenticazione)."
+ },
+ "twoStepOptions": {
+ "message": "Opzioni di login in due passaggi"
+ },
+ "recoveryCodeDesc": {
+ "message": "Hai perso l'accesso a tutti i tuoi provider a due passaggi? Usa il tuo codice di recupero per disattivarli dal tuo account."
+ },
+ "recoveryCodeTitle": {
+ "message": "Codice di recupero"
+ },
+ "authenticatorAppTitle": {
+ "message": "Applicazione di autenticazione"
+ },
+ "authenticatorAppDesc": {
+ "message": "Usa un'applicazione di autenticazione (come Authy o Google Authenticator) per generare codici di verifica a tempo.",
+ "description": "'Authy' and 'Google Authenticator' are product names and should not be translated."
+ },
+ "yubiKeyTitle": {
+ "message": "Chiave di sicurezza YubiKey OTP"
+ },
+ "yubiKeyDesc": {
+ "message": "Usa YubiKey per accedere al tuo account. Funziona con YubiKey 4, 4 Nano, 4C, e dispositivi NEO."
+ },
+ "duoDesc": {
+ "message": "Verifica con Duo Security usando l'applicazione Duo Mobile, SMS, chiamata telefonica, o chiave di sicurezza U2F.",
+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
+ },
+ "duoOrganizationDesc": {
+ "message": "Verifica con Duo Security per la tua azienda usando l'applicazione Duo Mobile, SMS, chiamata telefonica, o chiave di sicurezza U2F.",
+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
+ },
+ "webAuthnTitle": {
+ "message": "FIDO2 WebAuthn"
+ },
+ "webAuthnDesc": {
+ "message": "Usa qualsiasi chiave di sicurezza abilitata WebAuthn per accedere al tuo account."
+ },
+ "emailTitle": {
+ "message": "Email"
+ },
+ "emailDesc": {
+ "message": "I codici di verifica ti saranno inviati per email."
+ },
+ "selfHostedEnvironment": {
+ "message": "Ambiente self-hosted"
+ },
+ "selfHostedEnvironmentFooter": {
+ "message": "Specifica l'URL principale della tua installazione Bitwarden self-hosted."
+ },
+ "customEnvironment": {
+ "message": "Ambiente personalizzato"
+ },
+ "customEnvironmentFooter": {
+ "message": "Per utenti avanzati. Puoi specificare l'URL principale di ogni servizio indipendentemente."
+ },
+ "baseUrl": {
+ "message": "URL del server"
+ },
+ "apiUrl": {
+ "message": "URL del server API"
+ },
+ "webVaultUrl": {
+ "message": "URL della cassaforte web"
+ },
+ "identityUrl": {
+ "message": "URL del server di identità"
+ },
+ "notificationsUrl": {
+ "message": "URL del server delle notifiche"
+ },
+ "iconsUrl": {
+ "message": "URL del server di icone"
+ },
+ "environmentSaved": {
+ "message": "Gli URL dell'ambiente sono stati salvati."
+ },
+ "enableAutoFillOnPageLoad": {
+ "message": "Abilita l'auto-completamento al caricamento della pagina"
+ },
+ "enableAutoFillOnPageLoadDesc": {
+ "message": "Se viene rilevato un modulo di accesso, effettua un auto-completamento quando la pagina web si carica."
+ },
+ "experimentalFeature": {
+ "message": "Al momento questa funzionalità è sperimentale. Usala a tuo rischio e pericolo."
+ },
+ "defaultAutoFillOnPageLoad": {
+ "message": "Impostazioni di completamento automatico predefinito per i login"
+ },
+ "defaultAutoFillOnPageLoadDesc": {
+ "message": "Dopo aver abilitato il completamento automatico al caricamento della pagina, è possibile abilitare o disabilitare la funzione per singoli login. Questa è l'impostazione predefinita per i login che non sono configurati separatamente."
+ },
+ "itemAutoFillOnPageLoad": {
+ "message": "Autocompletamento al caricamento della pagina (se abilitato nelle opzioni)"
+ },
+ "autoFillOnPageLoadUseDefault": {
+ "message": "Usa impostazione predefinita"
+ },
+ "autoFillOnPageLoadYes": {
+ "message": "Autocompletamento al caricamento della pagina"
+ },
+ "autoFillOnPageLoadNo": {
+ "message": "Non completare automaticamente al caricamento della pagina"
+ },
+ "commandOpenPopup": {
+ "message": "Apri popup cassaforte"
+ },
+ "commandOpenSidebar": {
+ "message": "Apri la cassaforte nella barra laterale"
+ },
+ "commandAutofillDesc": {
+ "message": "Auto-completa con l'ultimo accesso utilizzato sul sito corrente"
+ },
+ "commandGeneratePasswordDesc": {
+ "message": "Genera e copia una nuova password casuale negli appunti"
+ },
+ "commandLockVaultDesc": {
+ "message": "Blocca la cassaforte"
+ },
+ "privateModeMessage": {
+ "message": "Purtroppo questa finestra non è disponibile nella modalità anonima per questo browser."
+ },
+ "customFields": {
+ "message": "Campi personalizzati"
+ },
+ "copyValue": {
+ "message": "Copia valore"
+ },
+ "value": {
+ "message": "Valore"
+ },
+ "newCustomField": {
+ "message": "Nuovo campo personalizzato"
+ },
+ "dragToSort": {
+ "message": "Trascina per ordinare"
+ },
+ "cfTypeText": {
+ "message": "Testo"
+ },
+ "cfTypeHidden": {
+ "message": "Nascosto"
+ },
+ "cfTypeBoolean": {
+ "message": "Booleano"
+ },
+ "popup2faCloseMessage": {
+ "message": "Facendo clic all'esterno della finestra popup per controllare la mail con il codice di verifica chiuderà la finestra di popup. Vuoi aprire questo popup in una nuova finestra?"
+ },
+ "popupU2fCloseMessage": {
+ "message": "Questo browser non può elaborare richieste U2F in questa finestra a comparsa. Vuoi aprire questo popup in una nuova finestra in modo da poter accedere usando U2F?"
+ },
+ "disableFavicon": {
+ "message": "Disabilita icone dei siti web"
+ },
+ "disableFaviconDesc": {
+ "message": "Le icone del sito web forniscono un'immagine riconoscibile accanto a ogni elemento di login della tua cassaforte."
+ },
+ "disableBadgeCounter": {
+ "message": "Disabilita contatore delle occorrenze"
+ },
+ "disableBadgeCounterDesc": {
+ "message": "Il contatore delle occorrenze indica quanti accessi hai per la pagina corrente nella tua cassaforte."
+ },
+ "cardholderName": {
+ "message": "Titolare della carta"
+ },
+ "number": {
+ "message": "Numero"
+ },
+ "brand": {
+ "message": "Marca"
+ },
+ "expirationMonth": {
+ "message": "Mese di scadenza"
+ },
+ "expirationYear": {
+ "message": "Anno di scadenza"
+ },
+ "expiration": {
+ "message": "Scadenza"
+ },
+ "january": {
+ "message": "Gennaio"
+ },
+ "february": {
+ "message": "Febbraio"
+ },
+ "march": {
+ "message": "Marzo"
+ },
+ "april": {
+ "message": "Aprile"
+ },
+ "may": {
+ "message": "Maggio"
+ },
+ "june": {
+ "message": "Giugno"
+ },
+ "july": {
+ "message": "Luglio"
+ },
+ "august": {
+ "message": "Agosto"
+ },
+ "september": {
+ "message": "Settembre"
+ },
+ "october": {
+ "message": "Ottobre"
+ },
+ "november": {
+ "message": "Novembre"
+ },
+ "december": {
+ "message": "Dicembre"
+ },
+ "securityCode": {
+ "message": "Codice di sicurezza"
+ },
+ "ex": {
+ "message": "es."
+ },
+ "title": {
+ "message": "Titolo"
+ },
+ "mr": {
+ "message": "Sig"
+ },
+ "mrs": {
+ "message": "Sig.ra"
+ },
+ "ms": {
+ "message": "Sig.ra"
+ },
+ "dr": {
+ "message": "Dottore"
+ },
+ "firstName": {
+ "message": "Nome"
+ },
+ "middleName": {
+ "message": "Secondo nome"
+ },
+ "lastName": {
+ "message": "Cognome"
+ },
+ "identityName": {
+ "message": "Nome dell'identità"
+ },
+ "company": {
+ "message": "Azienda"
+ },
+ "ssn": {
+ "message": "Codice fiscale/Previdenza sociale"
+ },
+ "passportNumber": {
+ "message": "Numero del passaporto"
+ },
+ "licenseNumber": {
+ "message": "Numero della patente"
+ },
+ "email": {
+ "message": "Email"
+ },
+ "phone": {
+ "message": "Telefono"
+ },
+ "address": {
+ "message": "Indirizzo"
+ },
+ "address1": {
+ "message": "Indirizzo 1"
+ },
+ "address2": {
+ "message": "Indirizzo 2"
+ },
+ "address3": {
+ "message": "Indirizzo 3"
+ },
+ "cityTown": {
+ "message": "Città / Comune"
+ },
+ "stateProvince": {
+ "message": "Stato / Provincia"
+ },
+ "zipPostalCode": {
+ "message": "CAP"
+ },
+ "country": {
+ "message": "Nazione"
+ },
+ "type": {
+ "message": "Tipo"
+ },
+ "typeLogin": {
+ "message": "Login"
+ },
+ "typeLogins": {
+ "message": "Login"
+ },
+ "typeSecureNote": {
+ "message": "Nota sicura"
+ },
+ "typeCard": {
+ "message": "Carta"
+ },
+ "typeIdentity": {
+ "message": "Identità"
+ },
+ "passwordHistory": {
+ "message": "Cronologia delle password"
+ },
+ "back": {
+ "message": "Indietro"
+ },
+ "collections": {
+ "message": "Raccolte"
+ },
+ "favorites": {
+ "message": "Preferiti"
+ },
+ "popOutNewWindow": {
+ "message": "Apri in una nuova finestra"
+ },
+ "refresh": {
+ "message": "Aggiorna"
+ },
+ "cards": {
+ "message": "Carte"
+ },
+ "identities": {
+ "message": "Identità"
+ },
+ "logins": {
+ "message": "Login"
+ },
+ "secureNotes": {
+ "message": "Note sicure"
+ },
+ "clear": {
+ "message": "Cancella",
+ "description": "To clear something out. example: To clear browser history."
+ },
+ "checkPassword": {
+ "message": "Verifica se la password è stata esposta."
+ },
+ "passwordExposed": {
+ "message": "Questa password è presente $VALUE$ volta/e in database di violazioni. Dovresti cambiarla.",
+ "placeholders": {
+ "value": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "passwordSafe": {
+ "message": "Questa password non è stata trovata in database di violazioni noti. Dovrebbe essere sicura da usare."
+ },
+ "baseDomain": {
+ "message": "Dominio di base"
+ },
+ "host": {
+ "message": "Host",
+ "description": "A URL's host value. For example, the host of https://sub.domain.com:443 is 'sub.domain.com:443'."
+ },
+ "exact": {
+ "message": "Esatto"
+ },
+ "startsWith": {
+ "message": "Inizia con"
+ },
+ "regEx": {
+ "message": "Espressione regolare",
+ "description": "A programming term, also known as 'RegEx'."
+ },
+ "matchDetection": {
+ "message": "Rilevamento di corrispondenza",
+ "description": "URI match detection for auto-fill."
+ },
+ "defaultMatchDetection": {
+ "message": "Rilevamento di corrispondenza predefinito",
+ "description": "Default URI match detection for auto-fill."
+ },
+ "toggleOptions": {
+ "message": "Attiva/Disattiva opzioni"
+ },
+ "toggleCurrentUris": {
+ "message": "Mostra/Nascondi URI attuale",
+ "description": "Toggle the display of the URIs of the currently open tabs in the browser."
+ },
+ "currentUri": {
+ "message": "URI attuale",
+ "description": "The URI of one of the current open tabs in the browser."
+ },
+ "organization": {
+ "message": "Organizzazione",
+ "description": "An entity of multiple related people (ex. a team or business organization)."
+ },
+ "types": {
+ "message": "Tipi"
+ },
+ "allItems": {
+ "message": "Tutti gli elementi"
+ },
+ "noPasswordsInList": {
+ "message": "Non ci sono password da elencare."
+ },
+ "remove": {
+ "message": "Rimuovi"
+ },
+ "default": {
+ "message": "Predefinito"
+ },
+ "dateUpdated": {
+ "message": "Aggiornato",
+ "description": "ex. Date this item was updated"
+ },
+ "datePasswordUpdated": {
+ "message": "Password aggiornata",
+ "description": "ex. Date this password was updated"
+ },
+ "neverLockWarning": {
+ "message": "Sei sicuro di voler usare l'opzione \"Mai\"? Impostando le opzioni di blocco su \"Mai\", la chiave di cifratura della cassaforte sarà salvata sul tuo dispositivo. Se utilizzi questa opzione, assicurati di mantenere il dispositivo adeguatamente protetto."
+ },
+ "noOrganizationsList": {
+ "message": "Non appartieni ad alcuna organizzazione. Le organizzazioni ti consentono di condividere oggetti in modo sicuro con altri utenti."
+ },
+ "noCollectionsInList": {
+ "message": "Nessuna raccolta da elencare."
+ },
+ "ownership": {
+ "message": "Proprietà"
+ },
+ "whoOwnsThisItem": {
+ "message": "A chi appartiene questo elemento?"
+ },
+ "strong": {
+ "message": "Forte",
+ "description": "ex. A strong password. Scale: Weak -> Good -> Strong"
+ },
+ "good": {
+ "message": "Buona",
+ "description": "ex. A good password. Scale: Weak -> Good -> Strong"
+ },
+ "weak": {
+ "message": "Debole",
+ "description": "ex. A weak password. Scale: Weak -> Good -> Strong"
+ },
+ "weakMasterPassword": {
+ "message": "Password principale debole"
+ },
+ "weakMasterPasswordDesc": {
+ "message": "La password principale che hai scelto è debole. È necessario utilizzare una password principale forte (o una frase segreta) per proteggere adeguatamente il tuo account Bitwarden. Sei sicuro di voler utilizzare questa password principale?"
+ },
+ "pin": {
+ "message": "PIN",
+ "description": "PIN code. Ex. The short code (often numeric) that you use to unlock a device."
+ },
+ "unlockWithPin": {
+ "message": "Sblocca con PIN"
+ },
+ "setYourPinCode": {
+ "message": "Imposta il tuo codice PIN per sbloccare Bitwarden. Le impostazioni PIN saranno reimpostate se eseguirai una disconnessione completa dall'applicazione."
+ },
+ "pinRequired": {
+ "message": "È richiesto il PIN."
+ },
+ "invalidPin": {
+ "message": "Codice PIN non valido."
+ },
+ "verifyPin": {
+ "message": "Verifica PIN"
+ },
+ "yourVaultIsLockedPinCode": {
+ "message": "La tua cassaforte è bloccata. Inserisci il tuo codice PIN per continuare."
+ },
+ "unlockWithBiometrics": {
+ "message": "Sblocca con i dati biometrici"
+ },
+ "awaitDesktop": {
+ "message": "In attesa di conferma dal desktop"
+ },
+ "awaitDesktopDesc": {
+ "message": "Conferma utilizzando l'autenticazione biometrica nell'applicazione Bitwarden Desktop per abilitare l'autenticazione biometrica per il browser."
+ },
+ "lockWithMasterPassOnRestart": {
+ "message": "Blocca con la password principale al riavvio del browser"
+ },
+ "selectOneCollection": {
+ "message": "Devi selezionare almeno una raccolta."
+ },
+ "cloneItem": {
+ "message": "Clona elemento"
+ },
+ "clone": {
+ "message": "Clona"
+ },
+ "passwordGeneratorPolicyInEffect": {
+ "message": "Una o più policy dell'organizzazione controllano le impostazioni del tuo generatore."
+ },
+ "vaultTimeoutAction": {
+ "message": "Azione timeout cassaforte"
+ },
+ "lock": {
+ "message": "Blocca",
+ "description": "Verb form: to make secure or inaccesible by"
+ },
+ "trash": {
+ "message": "Cestino",
+ "description": "Noun: a special folder to hold deleted items"
+ },
+ "searchTrash": {
+ "message": "Cerca nel cestino"
+ },
+ "permanentlyDeleteItem": {
+ "message": "Elimina definitivamente l'elemento"
+ },
+ "permanentlyDeleteItemConfirmation": {
+ "message": "Sei sicuro di voler eliminare definitivamente questo elemento?"
+ },
+ "permanentlyDeletedItem": {
+ "message": "Elemento eliminato definitivamente"
+ },
+ "restoreItem": {
+ "message": "Ripristina elemento"
+ },
+ "restoreItemConfirmation": {
+ "message": "Sei sicuro di voler ripristinare questo elemento?"
+ },
+ "restoredItem": {
+ "message": "Elemento ripristinato"
+ },
+ "vaultTimeoutLogOutConfirmation": {
+ "message": "La disconnessione rimuove tutti gli accessi alla cassaforte e richiede l'autenticazione online dopo il periodo di timeout. Sei sicuro di voler utilizzare questa impostazione?"
+ },
+ "vaultTimeoutLogOutConfirmationTitle": {
+ "message": "Conferma azione di timeout"
+ },
+ "autoFillAndSave": {
+ "message": "Riempi automaticamente e salva"
+ },
+ "autoFillSuccessAndSavedUri": {
+ "message": "Elemento riempito automaticamente e URI salvato"
+ },
+ "autoFillSuccess": {
+ "message": "Elemento riempito automaticamente"
+ },
+ "setMasterPassword": {
+ "message": "Imposta la password principale"
+ },
+ "masterPasswordPolicyInEffect": {
+ "message": "La password principale deve avere i seguenti requisiti, stabiliti da una o più regole dell'organizzazione:"
+ },
+ "policyInEffectMinComplexity": {
+ "message": "Punteggio minimo di complessità di $SCORE$",
+ "placeholders": {
+ "score": {
+ "content": "$1",
+ "example": "4"
+ }
+ }
+ },
+ "policyInEffectMinLength": {
+ "message": "Lunghezza minima di $LENGTH$",
+ "placeholders": {
+ "length": {
+ "content": "$1",
+ "example": "14"
+ }
+ }
+ },
+ "policyInEffectUppercase": {
+ "message": "Contiene almeno un carattere maiuscolo"
+ },
+ "policyInEffectLowercase": {
+ "message": "Contiene almeno un carattere minuscolo"
+ },
+ "policyInEffectNumbers": {
+ "message": "Contiene almeno una cifra"
+ },
+ "policyInEffectSpecial": {
+ "message": "Contiene almeno uno dei seguenti caratteri speciali $CHARS$",
+ "placeholders": {
+ "chars": {
+ "content": "$1",
+ "example": "!@#$%^&*"
+ }
+ }
+ },
+ "masterPasswordPolicyRequirementsNotMet": {
+ "message": "La tua nuova password principale non soddisfa i requisiti di sicurezza."
+ },
+ "acceptPolicies": {
+ "message": "Selezionando la casella accetti quanto segue:"
+ },
+ "acceptPoliciesError": {
+ "message": "I termini di servizio e l'informativa sulla privacy non sono stati accettati."
+ },
+ "termsOfService": {
+ "message": "Termini del servizio"
+ },
+ "privacyPolicy": {
+ "message": "Informativa sulla privacy"
+ },
+ "hintEqualsPassword": {
+ "message": "Il suggerimento della password non può essere uguale alla password."
+ },
+ "ok": {
+ "message": "Ok"
+ },
+ "desktopSyncVerificationTitle": {
+ "message": "Verifica sincronizzazione desktop"
+ },
+ "desktopIntegrationVerificationText": {
+ "message": "Verifica che l'applicazione desktop mostri questa impronta digitale: "
+ },
+ "desktopIntegrationDisabledTitle": {
+ "message": "L'integrazione del browser non è abilitata"
+ },
+ "desktopIntegrationDisabledDesc": {
+ "message": "L'integrazione del browser non è abilitata nell'applicazione Bitwarden Desktop. Attivala nelle impostazioni all'interno dell'applicazione desktop."
+ },
+ "startDesktopTitle": {
+ "message": "Avvia l'applicazione desktop Bitwarden"
+ },
+ "startDesktopDesc": {
+ "message": "L'applicazione Bitwarden Desktop deve essere avviata prima che questa funzione possa essere utilizzata."
+ },
+ "errorEnableBiometricTitle": {
+ "message": "Impossibile abilitare l'autenticazione biometrica"
+ },
+ "errorEnableBiometricDesc": {
+ "message": "L'azione è stata annullata dall'applicazione desktop"
+ },
+ "nativeMessagingInvalidEncryptionDesc": {
+ "message": "L'applicazione desktop ha invalidato il canale di comunicazione sicuro. Ritenta l'operazione"
+ },
+ "nativeMessagingInvalidEncryptionTitle": {
+ "message": "Comunicazione desktop interrotta"
+ },
+ "nativeMessagingWrongUserDesc": {
+ "message": "L'applicazione desktop è collegata a un account diverso. Assicurati che entrambe le applicazioni siano collegate allo stesso account."
+ },
+ "nativeMessagingWrongUserTitle": {
+ "message": "Account non corrispondente"
+ },
+ "biometricsNotEnabledTitle": {
+ "message": "Autenticazione biometrica non abilitata"
+ },
+ "biometricsNotEnabledDesc": {
+ "message": "L'autenticazione biometrica del browser richiede che l'autenticazione biometrica del desktop sia prima abilitata nelle impostazioni."
+ },
+ "biometricsNotSupportedTitle": {
+ "message": "Autenticazione biometrica non supportata"
+ },
+ "biometricsNotSupportedDesc": {
+ "message": "L'autenticazione biometrica del browser non è supportata su questo dispositivo."
+ },
+ "nativeMessaginPermissionErrorTitle": {
+ "message": "Permesso non fornito"
+ },
+ "nativeMessaginPermissionErrorDesc": {
+ "message": "Senza l'autorizzazione per comunicare con l'applicazione Bitwarden Desktop non è possibile fornire l'autenticazione biometrica nell'estensione del browser. Riprova di nuovo."
+ },
+ "nativeMessaginPermissionSidebarTitle": {
+ "message": "Errore richiesta di autorizzazione"
+ },
+ "nativeMessaginPermissionSidebarDesc": {
+ "message": "Questa azione non può essere eseguita nella barra laterale, riprova l'azione nel popup o nella finestra."
+ },
+ "personalOwnershipSubmitError": {
+ "message": "A causa di una policy aziendale, non è possibile salvare elementi nella tua cassaforte personale. Cambia l'opzione proprietà in un'organizzazione e scegli tra le raccolte disponibili."
+ },
+ "personalOwnershipPolicyInEffect": {
+ "message": "Una policy dell'organizzazione controlla le opzioni di proprietà."
+ },
+ "excludedDomains": {
+ "message": "Domini esclusi"
+ },
+ "excludedDomainsDesc": {
+ "message": "Bitwarden non chiederà di salvare i dettagli di accesso per questi domini. È necessario aggiornare la pagina perché le modifiche abbiano effetto."
+ },
+ "excludedDomainsInvalidDomain": {
+ "message": "$DOMAIN$ non è un dominio valido",
+ "placeholders": {
+ "domain": {
+ "content": "$1",
+ "example": "googlecom"
+ }
+ }
+ },
+ "send": {
+ "message": "Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "searchSends": {
+ "message": "Cerca Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "addSend": {
+ "message": "Aggiungi Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTypeText": {
+ "message": "Testo"
+ },
+ "sendTypeFile": {
+ "message": "File"
+ },
+ "allSends": {
+ "message": "Tutti i Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "maxAccessCountReached": {
+ "message": "Numero massimo di accessi raggiunto"
+ },
+ "expired": {
+ "message": "Scaduto"
+ },
+ "pendingDeletion": {
+ "message": "In attesa di eliminazione"
+ },
+ "passwordProtected": {
+ "message": "Protetto da password"
+ },
+ "copySendLink": {
+ "message": "Copia collegamento del Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "removePassword": {
+ "message": "Rimuovi password"
+ },
+ "delete": {
+ "message": "Elimina"
+ },
+ "removedPassword": {
+ "message": "Password rimossa"
+ },
+ "deletedSend": {
+ "message": "Send eliminato",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendLink": {
+ "message": "Collegamento del Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "disabled": {
+ "message": "Disabilitato"
+ },
+ "removePasswordConfirmation": {
+ "message": "Sei sicuro di voler rimuovere la password?"
+ },
+ "deleteSend": {
+ "message": "Elimina Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "deleteSendConfirmation": {
+ "message": "Sei sicuro di voler eliminare questo Send?",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "editSend": {
+ "message": "Modifica Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTypeHeader": {
+ "message": "Di quale tipo di Send si tratta?",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendNameDesc": {
+ "message": "Un nome intuitivo per descrivere questo Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendFileDesc": {
+ "message": "Il file da inviare."
+ },
+ "deletionDate": {
+ "message": "Data di eliminazione"
+ },
+ "deletionDateDesc": {
+ "message": "Il Send sarà definitivamente eliminato alla data e ora specificate.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "expirationDate": {
+ "message": "Data di scadenza"
+ },
+ "expirationDateDesc": {
+ "message": "Se impostato, l'accesso a questo Send scadrà alla data e all'ora specificate.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "oneDay": {
+ "message": "1 giorno"
+ },
+ "days": {
+ "message": "$DAYS$ giorni",
+ "placeholders": {
+ "days": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "custom": {
+ "message": "Personalizzato"
+ },
+ "maximumAccessCount": {
+ "message": "Numero massimo di accessi"
+ },
+ "maximumAccessCountDesc": {
+ "message": "Se impostata, gli utenti non saranno più in grado di accedere a questo Send una volta raggiunto il numero massimo di accessi.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendPasswordDesc": {
+ "message": "Facoltativamente, richiedi una password agli utenti per accedere al Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendNotesDesc": {
+ "message": "Note private sul Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendDisableDesc": {
+ "message": "Disabilita il Send per renderlo inaccessibile.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendShareDesc": {
+ "message": "Copia il collegamento del Send negli appunti dopo aver salvato.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTextDesc": {
+ "message": "Il testo che vuoi inviare."
+ },
+ "sendHideText": {
+ "message": "Nascondi il testo di questo Send in modo predefinito.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "currentAccessCount": {
+ "message": "Numero di accessi attuale"
+ },
+ "createSend": {
+ "message": "Crea nuovo Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "newPassword": {
+ "message": "Nuova password"
+ },
+ "sendDisabled": {
+ "message": "Send disabilitato",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendDisabledWarning": {
+ "message": "A causa di una policy aziendale, è possibile eliminare solo un Send esistente.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "createdSend": {
+ "message": "Send creato",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "editedSend": {
+ "message": "Send modificato",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendLinuxChromiumFileWarning": {
+ "message": "Per scegliere un file, apri l'estensione nella barra laterale (se possibile) o apri una nuova finestra facendo clic su questo banner."
+ },
+ "sendFirefoxFileWarning": {
+ "message": "Per scegliere un file utilizzando Firefox, apri l'estensione nella barra laterale o apri una nuova finestra facendo clic sul banner."
+ },
+ "sendSafariFileWarning": {
+ "message": "Per scegliere un file utilizzando Safari, apri una nuova finestra facendo clic sul banner."
+ },
+ "sendFileCalloutHeader": {
+ "message": "Prima di iniziare"
+ },
+ "sendFirefoxCustomDatePopoutMessage1": {
+ "message": "Per usare un selettore di date stile calendario",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read '**To use a calendar style date picker ** click here to pop out your window.'"
+ },
+ "sendFirefoxCustomDatePopoutMessage2": {
+ "message": "fai clic qui",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker **click here** to pop out your window.'"
+ },
+ "sendFirefoxCustomDatePopoutMessage3": {
+ "message": "per aprire la finestra.",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker click here **to pop out your window.**'"
+ },
+ "expirationDateIsInvalid": {
+ "message": "La data di scadenza fornita non è valida."
+ },
+ "deletionDateIsInvalid": {
+ "message": "La data di eliminazione fornita non è valida."
+ },
+ "expirationDateAndTimeRequired": {
+ "message": "È necessario inserire data e ora di scadenza."
+ },
+ "deletionDateAndTimeRequired": {
+ "message": "È necessario inserire data e ora di eliminazione."
+ },
+ "dateParsingError": {
+ "message": "Si è verificato un errore durante il salvataggio delle date di eliminazione e scadenza."
+ },
+ "hideEmail": {
+ "message": "Nascondi il mio indirizzo email dai destinatari."
+ },
+ "sendOptionsPolicyInEffect": {
+ "message": "Una o più policy dell'organizzazione influenzano le opzioni dei Send."
+ },
+ "passwordPrompt": {
+ "message": "Nuova richiesta della password principale"
+ },
+ "passwordConfirmation": {
+ "message": "Conferma della password principale"
+ },
+ "passwordConfirmationDesc": {
+ "message": "Questa azione è protetta. Per continuare, inserisci nuovamente la tua password principale per verificare la tua identità."
+ },
+ "emailVerificationRequired": {
+ "message": "Verifica email richiesta"
+ },
+ "emailVerificationRequiredDesc": {
+ "message": "Devi verificare la tua email per utilizzare questa funzionalità. Puoi verificare la tua email nella cassaforte web."
+ },
+ "updatedMasterPassword": {
+ "message": "Password principale aggiornata"
+ },
+ "updateMasterPassword": {
+ "message": "Aggiorna password principale"
+ },
+ "updateMasterPasswordWarning": {
+ "message": "La tua password principale è stata recentemente modificata da un amministratore nella tua organizzazione. Per accedere alla cassaforte, aggiorna ora la password. Procedendo sarai disconnesso dalla sessione attuale e ti sarà richiesto di effettuare nuovamente l'accesso. Le sessioni attive su altri dispositivi potrebbero continuare a rimanere attive per un massimo di un'ora."
+ },
+ "resetPasswordPolicyAutoEnroll": {
+ "message": "Iscrizione automatica"
+ },
+ "resetPasswordAutoEnrollInviteWarning": {
+ "message": "Questa organizzazione ha una policy aziendale che ti iscriverà automaticamente al ripristino della password. Ciò permetterà agli amministratori dell'organizzazione di cambiare la tua password principale."
+ },
+ "selectFolder": {
+ "message": "Seleziona cartella..."
+ },
+ "ssoCompleteRegistration": {
+ "message": "Per completare l'accesso con SSO, imposta una password principale per accedere e proteggere la cassaforte."
+ },
+ "hours": {
+ "message": "Ore"
+ },
+ "minutes": {
+ "message": "Minuti"
+ },
+ "vaultTimeoutPolicyInEffect": {
+ "message": "Le policy dell'organizzazione stanno influenzando il timeout della tua cassaforte. Il tempo massimo consentito è di $HOURS$ ore e $MINUTES$ minuti",
+ "placeholders": {
+ "hours": {
+ "content": "$1",
+ "example": "5"
+ },
+ "minutes": {
+ "content": "$2",
+ "example": "5"
+ }
+ }
+ },
+ "vaultTimeoutToLarge": {
+ "message": "Il timeout della tua cassaforte supera i limiti impostati dalla tua organizzazione."
+ },
+ "vaultExportDisabled": {
+ "message": "Esportazione cassaforte disabilitata"
+ },
+ "personalVaultExportPolicyInEffect": {
+ "message": "Una o più policy dell'organizzazione ti impediscono di esportare la tua cassaforte personale."
+ },
+ "copyCustomFieldNameInvalidElement": {
+ "message": "Impossibile identificare un elemento del form valido. Prova a ispezionare l'HTML."
+ },
+ "copyCustomFieldNameNotUnique": {
+ "message": "Nessun identificatore univoco trovato."
+ }
+}
diff --git a/src/iOS.Safari/Resources/_locales/ja/messages.json b/src/iOS.Safari/Resources/_locales/ja/messages.json
new file mode 100644
index 000000000..8834cb2f3
--- /dev/null
+++ b/src/iOS.Safari/Resources/_locales/ja/messages.json
@@ -0,0 +1,1817 @@
+{
+ "appName": {
+ "message": "Bitwarden"
+ },
+ "extName": {
+ "message": "Bitwarden - 無料パスワードマネージャー",
+ "description": "Extension name, MUST be less than 40 characters (Safari restriction)"
+ },
+ "extDesc": {
+ "message": "Bitwarden はあらゆる端末で使える、安全な無料パスワードマネージャーです。",
+ "description": "Extension description"
+ },
+ "loginOrCreateNewAccount": {
+ "message": "安全なデータ保管庫へアクセスするためにログインまたはアカウントを作成してください。"
+ },
+ "createAccount": {
+ "message": "アカウントの作成"
+ },
+ "login": {
+ "message": "ログイン"
+ },
+ "enterpriseSingleSignOn": {
+ "message": "組織のシングルサインオン"
+ },
+ "cancel": {
+ "message": "キャンセル"
+ },
+ "close": {
+ "message": "閉じる"
+ },
+ "submit": {
+ "message": "送信"
+ },
+ "emailAddress": {
+ "message": "メールアドレス"
+ },
+ "masterPass": {
+ "message": "マスターパスワード"
+ },
+ "masterPassDesc": {
+ "message": "マスターパスワードは、パスワード保管庫へのアクセスに使用するパスワードです。あなたのマスターパスワードを忘れないように注意してください。忘れた場合、パスワードを回復する方法はありません。"
+ },
+ "masterPassHintDesc": {
+ "message": "マスターパスワードのヒントは、パスワードを忘れた場合に役立ちます。"
+ },
+ "reTypeMasterPass": {
+ "message": "新しいパスワードを再入力"
+ },
+ "masterPassHint": {
+ "message": "マスターパスワードのヒント (省略可能)"
+ },
+ "tab": {
+ "message": "タブ"
+ },
+ "myVault": {
+ "message": "保管庫"
+ },
+ "tools": {
+ "message": "ツール"
+ },
+ "settings": {
+ "message": "設定"
+ },
+ "currentTab": {
+ "message": "現在のタブ"
+ },
+ "copyPassword": {
+ "message": "パスワードをコピー"
+ },
+ "copyNote": {
+ "message": "メモをコピー"
+ },
+ "copyUri": {
+ "message": "URI をコピー"
+ },
+ "copyUsername": {
+ "message": "ユーザー名をコピー"
+ },
+ "copyNumber": {
+ "message": "番号のコピー"
+ },
+ "copySecurityCode": {
+ "message": "セキュリティコードをコピー"
+ },
+ "autoFill": {
+ "message": "自動入力"
+ },
+ "generatePasswordCopied": {
+ "message": "パスワードを生成 (コピー)"
+ },
+ "copyElementIdentifier": {
+ "message": "カスタムフィールド名をコピー"
+ },
+ "noMatchingLogins": {
+ "message": "一致するログインがありません。"
+ },
+ "vaultLocked": {
+ "message": "保管庫がロックされています。"
+ },
+ "vaultLoggedOut": {
+ "message": "保管庫はログアウトされています。"
+ },
+ "autoFillInfo": {
+ "message": "現在のブラウザタブに自動入力するログイン情報はありません。"
+ },
+ "addLogin": {
+ "message": "ログイン情報を追加"
+ },
+ "addItem": {
+ "message": "アイテムの追加"
+ },
+ "passwordHint": {
+ "message": "パスワードのヒント"
+ },
+ "enterEmailToGetHint": {
+ "message": "マスターパスワードのヒントを受信するアカウントのメールアドレスを入力してください。"
+ },
+ "getMasterPasswordHint": {
+ "message": "マスターパスワードのヒントを取得する"
+ },
+ "continue": {
+ "message": "続ける"
+ },
+ "verificationCode": {
+ "message": "認証コード"
+ },
+ "account": {
+ "message": "アカウント"
+ },
+ "changeMasterPassword": {
+ "message": "マスターパスワードの変更"
+ },
+ "fingerprintPhrase": {
+ "message": "パスフレーズ",
+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
+ },
+ "yourAccountsFingerprint": {
+ "message": "アカウントのパスフレーズ",
+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
+ },
+ "twoStepLogin": {
+ "message": "2段階認証"
+ },
+ "logOut": {
+ "message": "ログアウト"
+ },
+ "about": {
+ "message": "アプリについて"
+ },
+ "version": {
+ "message": "バージョン"
+ },
+ "save": {
+ "message": "保存"
+ },
+ "move": {
+ "message": "移動"
+ },
+ "addFolder": {
+ "message": "フォルダーを追加"
+ },
+ "name": {
+ "message": "名前"
+ },
+ "editFolder": {
+ "message": "フォルダーを編集"
+ },
+ "deleteFolder": {
+ "message": "フォルダーを削除"
+ },
+ "folders": {
+ "message": "フォルダー"
+ },
+ "noFolders": {
+ "message": "一覧表示するフォルダーはありません。"
+ },
+ "helpFeedback": {
+ "message": "ヘルプ&フィードバック"
+ },
+ "sync": {
+ "message": "同期"
+ },
+ "syncVaultNow": {
+ "message": "保管庫を同期する"
+ },
+ "lastSync": {
+ "message": "前回の同期:"
+ },
+ "passGen": {
+ "message": "パスワード生成ツール"
+ },
+ "generator": {
+ "message": "パス生成",
+ "description": "Short for 'Password Generator'."
+ },
+ "passGenInfo": {
+ "message": "ログインのために強固なユニークパスワードを自動的に生成します。"
+ },
+ "bitWebVault": {
+ "message": "Bitwarden ウェブ保管庫"
+ },
+ "importItems": {
+ "message": "アイテムのインポート"
+ },
+ "select": {
+ "message": "選択"
+ },
+ "generatePassword": {
+ "message": "パスワードの自動生成"
+ },
+ "regeneratePassword": {
+ "message": "パスワードの再生成"
+ },
+ "options": {
+ "message": "オプション"
+ },
+ "length": {
+ "message": "長さ"
+ },
+ "numWords": {
+ "message": "単語数"
+ },
+ "wordSeparator": {
+ "message": "単語の区切り"
+ },
+ "capitalize": {
+ "message": "先頭を大文字",
+ "description": "Make the first letter of a work uppercase."
+ },
+ "includeNumber": {
+ "message": "数字を含む"
+ },
+ "minNumbers": {
+ "message": "数字の最小数"
+ },
+ "minSpecial": {
+ "message": "記号の最小数"
+ },
+ "avoidAmbChar": {
+ "message": "あいまいな文字を省く"
+ },
+ "searchVault": {
+ "message": "保管庫を検索"
+ },
+ "edit": {
+ "message": "編集"
+ },
+ "view": {
+ "message": "表示"
+ },
+ "noItemsInList": {
+ "message": "表示するアイテムがありません"
+ },
+ "itemInformation": {
+ "message": "アイテム情報"
+ },
+ "username": {
+ "message": "ユーザ名"
+ },
+ "password": {
+ "message": "パスワード"
+ },
+ "passphrase": {
+ "message": "パスフレーズ"
+ },
+ "favorite": {
+ "message": "お気に入り"
+ },
+ "notes": {
+ "message": "メモ"
+ },
+ "note": {
+ "message": "メモ"
+ },
+ "editItem": {
+ "message": "アイテムの編集"
+ },
+ "folder": {
+ "message": "フォルダー"
+ },
+ "deleteItem": {
+ "message": "アイテムの削除"
+ },
+ "viewItem": {
+ "message": "アイテムの表示"
+ },
+ "launch": {
+ "message": "開く"
+ },
+ "website": {
+ "message": "ウェブサイト"
+ },
+ "toggleVisibility": {
+ "message": "表示切り替え"
+ },
+ "manage": {
+ "message": "管理"
+ },
+ "other": {
+ "message": "その他"
+ },
+ "rateExtension": {
+ "message": "拡張機能の評価"
+ },
+ "rateExtensionDesc": {
+ "message": "良いレビューで私たちを助けてください!"
+ },
+ "browserNotSupportClipboard": {
+ "message": "お使いのブラウザはクリップボードへのコピーに対応していません。手動でコピーしてください"
+ },
+ "verifyMasterPassword": {
+ "message": "マスターパスワードの確認"
+ },
+ "yourVaultIsLocked": {
+ "message": "保管庫がロックされています。開くにはマスターパスワードを入力してください。"
+ },
+ "unlock": {
+ "message": "ロック解除"
+ },
+ "loggedInAsOn": {
+ "message": "$HOSTNAME$ の $EMAIL$ としてログインしました。",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "name@example.com"
+ },
+ "hostname": {
+ "content": "$2",
+ "example": "bitwarden.com"
+ }
+ }
+ },
+ "invalidMasterPassword": {
+ "message": "マスターパスワードが間違っています"
+ },
+ "vaultTimeout": {
+ "message": "保管庫のタイムアウト"
+ },
+ "lockNow": {
+ "message": "今すぐロック"
+ },
+ "immediately": {
+ "message": "すぐに"
+ },
+ "tenSeconds": {
+ "message": "10秒"
+ },
+ "twentySeconds": {
+ "message": "20秒"
+ },
+ "thirtySeconds": {
+ "message": "30秒"
+ },
+ "oneMinute": {
+ "message": "1分"
+ },
+ "twoMinutes": {
+ "message": "2分"
+ },
+ "fiveMinutes": {
+ "message": "5分"
+ },
+ "fifteenMinutes": {
+ "message": "15分"
+ },
+ "thirtyMinutes": {
+ "message": "30分"
+ },
+ "oneHour": {
+ "message": "1時間"
+ },
+ "fourHours": {
+ "message": "4時間"
+ },
+ "onLocked": {
+ "message": "ロック時"
+ },
+ "onRestart": {
+ "message": "ブラウザ再起動時"
+ },
+ "never": {
+ "message": "なし"
+ },
+ "security": {
+ "message": "セキュリティ"
+ },
+ "errorOccurred": {
+ "message": "エラーが発生しました"
+ },
+ "emailRequired": {
+ "message": "Eメールアドレスは必須項目です。"
+ },
+ "invalidEmail": {
+ "message": "無効なEメールアドレスです。"
+ },
+ "masterPassRequired": {
+ "message": "マスターパスワードは必須です。"
+ },
+ "masterPassLength": {
+ "message": "マスターパスワードは、少なくとも8文字以上で設定してください。"
+ },
+ "masterPassDoesntMatch": {
+ "message": "マスターパスワードが一致しません。"
+ },
+ "newAccountCreated": {
+ "message": "新しいアカウントを作成しました!今すぐログインできます。"
+ },
+ "masterPassSent": {
+ "message": "あなたのマスターパスワードのヒントを記載したメールを送信しました。"
+ },
+ "verificationCodeRequired": {
+ "message": "認証コードは必須項目です。"
+ },
+ "valueCopied": {
+ "message": "$VALUE$ をコピーしました",
+ "description": "Value has been copied to the clipboard.",
+ "placeholders": {
+ "value": {
+ "content": "$1",
+ "example": "Password"
+ }
+ }
+ },
+ "autofillError": {
+ "message": "選択したアイテムをこのページで自動入力できませんでした。コピーして貼り付けてください。"
+ },
+ "loggedOut": {
+ "message": "ログアウトしました"
+ },
+ "loginExpired": {
+ "message": "ログインセッションの有効期限が切れています。"
+ },
+ "logOutConfirmation": {
+ "message": "ログアウトしてもよろしいですか?"
+ },
+ "yes": {
+ "message": "はい"
+ },
+ "no": {
+ "message": "いいえ"
+ },
+ "unexpectedError": {
+ "message": "予期せぬエラーが発生しました。"
+ },
+ "nameRequired": {
+ "message": "名前は必須項目です。"
+ },
+ "addedFolder": {
+ "message": "フォルダーを追加しました"
+ },
+ "changeMasterPass": {
+ "message": "マスターパスワードの変更"
+ },
+ "changeMasterPasswordConfirmation": {
+ "message": "マスターパスワードは bitwarden.com ウェブ保管庫で変更できます。ウェブサイトを開きますか?"
+ },
+ "twoStepLoginConfirmation": {
+ "message": "2段階認証を使うと、ログイン時にセキュリティキーや認証アプリ、SMS、電話やメールでの認証を必要にすることでアカウントをさらに安全に出来ます。2段階認証は bitwarden.com ウェブ保管庫で有効化できます。ウェブサイトを開きますか?"
+ },
+ "editedFolder": {
+ "message": "フォルダーを編集しました"
+ },
+ "deleteFolderConfirmation": {
+ "message": "フォルダーを削除しますか?"
+ },
+ "deletedFolder": {
+ "message": "フォルダーを削除しました"
+ },
+ "gettingStartedTutorial": {
+ "message": "使い方のチュートリアル"
+ },
+ "gettingStartedTutorialVideo": {
+ "message": "ブラウザの拡張機能を最大限に活用するための方法を学習できる、チュートリアルを見てください。"
+ },
+ "syncingComplete": {
+ "message": "同期が完了しました"
+ },
+ "syncingFailed": {
+ "message": "同期に失敗しました"
+ },
+ "passwordCopied": {
+ "message": "パスワードをコピーしました"
+ },
+ "uri": {
+ "message": "URI"
+ },
+ "uriPosition": {
+ "message": "URI $POSITION$",
+ "description": "A listing of URIs. Ex: URI 1, URI 2, URI 3, etc.",
+ "placeholders": {
+ "position": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "newUri": {
+ "message": "新しい URI"
+ },
+ "addedItem": {
+ "message": "追加しました"
+ },
+ "editedItem": {
+ "message": "編集しました"
+ },
+ "deleteItemConfirmation": {
+ "message": "このアイテムを削除しますか?"
+ },
+ "deletedItem": {
+ "message": "削除済みのアイテム"
+ },
+ "overwritePassword": {
+ "message": "パスワードを上書き"
+ },
+ "overwritePasswordConfirmation": {
+ "message": "現在のパスワードを上書きしてよろしいですか?"
+ },
+ "searchFolder": {
+ "message": "フォルダーの検索"
+ },
+ "searchCollection": {
+ "message": "コレクションの検索"
+ },
+ "searchType": {
+ "message": "検索の種類"
+ },
+ "noneFolder": {
+ "message": "フォルダーなし",
+ "description": "This is the folder for uncategorized items"
+ },
+ "disableAddLoginNotification": {
+ "message": "ログイン情報追加の通知を無効化"
+ },
+ "addLoginNotificationDesc": {
+ "message": "初めてログインしたとき保管庫にログイン情報を保存するよう「ログイン情報を追加」通知を自動的に表示します。"
+ },
+ "dontShowCardsCurrentTab": {
+ "message": "タブページにカードを表示しない"
+ },
+ "dontShowCardsCurrentTabDesc": {
+ "message": "保管庫にあるカードアイテムは自動入力しやすいよう「タブ」に表示されます。"
+ },
+ "dontShowIdentitiesCurrentTab": {
+ "message": "タブページに ID を表示しない"
+ },
+ "dontShowIdentitiesCurrentTabDesc": {
+ "message": "保管庫にある ID アイテムは自動入力しやすいよう「タブ」に表示されます。"
+ },
+ "clearClipboard": {
+ "message": "クリップボードの消去",
+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
+ },
+ "clearClipboardDesc": {
+ "message": "選択した時間が経過した後、自動的にクリップボードを消去します。",
+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
+ },
+ "notificationAddDesc": {
+ "message": "このパスワードを Bitwarden に保存しますか?"
+ },
+ "notificationAddSave": {
+ "message": "保存する"
+ },
+ "notificationNeverSave": {
+ "message": "このサイトではしない"
+ },
+ "disableChangedPasswordNotification": {
+ "message": "パスワードの変更通知を無効化"
+ },
+ "disableChangedPasswordNotificationDesc": {
+ "message": "ウェブサイトでパスワードを変更したことを検出したとき、保管庫のパスワードを更新するために自動的に「パスワードの変更通知」を表示します。"
+ },
+ "notificationChangeDesc": {
+ "message": "Bitwarden でこのパスワードを更新しますか?"
+ },
+ "notificationChangeSave": {
+ "message": "今すぐ更新する"
+ },
+ "disableContextMenuItem": {
+ "message": "コンテキストメニューオプションを無効化"
+ },
+ "disableContextMenuItemDesc": {
+ "message": "コンテキストメニューのオプションで、現在のタブのウェブサイトのログイン情報やパスワード生成に素早くアクセスできます。"
+ },
+ "defaultUriMatchDetection": {
+ "message": "デフォルトの URI 一致検出方法",
+ "description": "Default URI match detection for auto-fill."
+ },
+ "defaultUriMatchDetectionDesc": {
+ "message": "自動入力などのアクションをする時に、デフォルトでどの方法で URI の一致を検出するか選択します。"
+ },
+ "theme": {
+ "message": "テーマ"
+ },
+ "themeDesc": {
+ "message": "アプリのテーマカラーを変更します。"
+ },
+ "dark": {
+ "message": "ダーク",
+ "description": "Dark color"
+ },
+ "light": {
+ "message": "ライト",
+ "description": "Light color"
+ },
+ "solarizedDark": {
+ "message": "Solarized ダーク",
+ "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated."
+ },
+ "exportVault": {
+ "message": "保管庫のエクスポート"
+ },
+ "fileFormat": {
+ "message": "ファイル形式"
+ },
+ "warning": {
+ "message": "警告",
+ "description": "WARNING (should stay in capitalized letters if the language permits)"
+ },
+ "confirmVaultExport": {
+ "message": "保管庫のエクスポートの確認"
+ },
+ "exportWarningDesc": {
+ "message": "このエクスポートデータは暗号化されていない形式の保管庫データを含んでいます。メールなどのセキュリティ保護されていない方法で共有したり保管したりしないでください。使用した後はすぐに削除してください。"
+ },
+ "encExportKeyWarningDesc": {
+ "message": "このエクスポートは、アカウントの暗号化キーを使用してデータを暗号化します。 暗号化キーをローテーションした場合は、このエクスポートファイルを復号することはできなくなるため、もう一度エクスポートする必要があります。"
+ },
+ "encExportAccountWarningDesc": {
+ "message": "アカウント暗号化キーは各 Bitwarden ユーザーアカウントに固有であるため、暗号化されたエクスポートを別のアカウントにインポートすることはできません。"
+ },
+ "exportMasterPassword": {
+ "message": "保管庫のデータをエクスポートするにはマスターパスワードを入力してください。"
+ },
+ "shared": {
+ "message": "共有"
+ },
+ "learnOrg": {
+ "message": "組織について学ぶ"
+ },
+ "learnOrgConfirmation": {
+ "message": "Bitwarden は組織を使って保管庫アイテムを他の人と共有することができます。詳細は bitwarden.com ウェブサイトをご覧ください。"
+ },
+ "moveToOrganization": {
+ "message": "組織に移動"
+ },
+ "share": {
+ "message": "共有"
+ },
+ "movedItemToOrg": {
+ "message": "$ITEMNAME$ を $ORGNAME$ に移動しました",
+ "placeholders": {
+ "itemname": {
+ "content": "$1",
+ "example": "Secret Item"
+ },
+ "orgname": {
+ "content": "$2",
+ "example": "Company Name"
+ }
+ }
+ },
+ "moveToOrgDesc": {
+ "message": "このアイテムを移動する組織を選択してください。組織に移動すると、アイテムの所有権がその組織に移行します。 このアイテムが移動された後、あなたはこのアイテムの直接の所有者にはなりません。"
+ },
+ "learnMore": {
+ "message": "さらに詳しく"
+ },
+ "authenticatorKeyTotp": {
+ "message": "認証キー (TOTP)"
+ },
+ "verificationCodeTotp": {
+ "message": "認証コード (TOTP)"
+ },
+ "copyVerificationCode": {
+ "message": "認証コードのコピー"
+ },
+ "attachments": {
+ "message": "添付ファイル"
+ },
+ "deleteAttachment": {
+ "message": "添付ファイルの削除"
+ },
+ "deleteAttachmentConfirmation": {
+ "message": "この添付ファイルを削除してよろしいですか?"
+ },
+ "deletedAttachment": {
+ "message": "削除された添付ファイル"
+ },
+ "newAttachment": {
+ "message": "添付ファイルの追加"
+ },
+ "noAttachments": {
+ "message": "添付ファイルなし"
+ },
+ "attachmentSaved": {
+ "message": "添付ファイルを保存しました。"
+ },
+ "file": {
+ "message": "ファイル"
+ },
+ "selectFile": {
+ "message": "ファイルを選択してください。"
+ },
+ "maxFileSize": {
+ "message": "最大ファイルサイズ: 500 MB"
+ },
+ "featureUnavailable": {
+ "message": "サービスが利用できません"
+ },
+ "updateKey": {
+ "message": "暗号キーを更新するまでこの機能は使用できません。"
+ },
+ "premiumMembership": {
+ "message": "プレミアム会員"
+ },
+ "premiumManage": {
+ "message": "会員情報の管理"
+ },
+ "premiumManageAlert": {
+ "message": "会員情報は bitwarden.com ウェブ保管庫で管理できます。ウェブサイトを開きますか?"
+ },
+ "premiumRefresh": {
+ "message": "会員情報の更新"
+ },
+ "premiumNotCurrentMember": {
+ "message": "あなたは現在プレミアム会員ではありません。"
+ },
+ "premiumSignUpAndGet": {
+ "message": "プレミアム会員に登録すると以下の特典を得られます:"
+ },
+ "ppremiumSignUpStorage": {
+ "message": "1GB の暗号化されたファイルストレージ"
+ },
+ "ppremiumSignUpTwoStep": {
+ "message": "YubiKey、FIDO U2F、Duoなどの追加の2段階認証ログインオプション"
+ },
+ "ppremiumSignUpReports": {
+ "message": "保管庫を安全に保つための、パスワードやアカウントの健全性、データ侵害に関するレポート"
+ },
+ "ppremiumSignUpTotp": {
+ "message": "保管庫内での2段階認証コード生成"
+ },
+ "ppremiumSignUpSupport": {
+ "message": "優先カスタマーサポート"
+ },
+ "ppremiumSignUpFuture": {
+ "message": "将来のプレミアム機能すべて(詳細は近日公開予定!)"
+ },
+ "premiumPurchase": {
+ "message": "プレミアム会員に加入"
+ },
+ "premiumPurchaseAlert": {
+ "message": "プレミアム会員権は bitwarden.com ウェブ保管庫で購入できます。ウェブサイトを開きますか?"
+ },
+ "premiumCurrentMember": {
+ "message": "あなたはプレミアム会員です!"
+ },
+ "premiumCurrentMemberThanks": {
+ "message": "Bitwarden を支援いただき、ありがとうございます。"
+ },
+ "premiumPrice": {
+ "message": "全部でなんと$PRICE$/年だけ!",
+ "placeholders": {
+ "price": {
+ "content": "$1",
+ "example": "$10"
+ }
+ }
+ },
+ "refreshComplete": {
+ "message": "更新完了"
+ },
+ "disableAutoTotpCopy": {
+ "message": "認証コードの自動コピーを無効化"
+ },
+ "disableAutoTotpCopyDesc": {
+ "message": "ログイン情報に認証キーが添付されている場合、自動入力した時に認証コードが自動的にクリップボードへコピーされます。"
+ },
+ "disableAutoBiometricsPrompt": {
+ "message": "起動時に生体認証のプロンプトを表示しない"
+ },
+ "premiumRequired": {
+ "message": "プレミアム会員専用"
+ },
+ "premiumRequiredDesc": {
+ "message": "この機能を使うにはプレミアム会員になってください。"
+ },
+ "enterVerificationCodeApp": {
+ "message": "認証アプリに表示された6桁の認証コードを入力してください。"
+ },
+ "enterVerificationCodeEmail": {
+ "message": "$EMAIL$に送信された6桁の認証コードを入力してください。",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "example@gmail.com"
+ }
+ }
+ },
+ "verificationCodeEmailSent": {
+ "message": "$EMAIL$に認証コードを送信しました。",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "example@gmail.com"
+ }
+ }
+ },
+ "rememberMe": {
+ "message": "情報を保存する"
+ },
+ "sendVerificationCodeEmailAgain": {
+ "message": "確認コードをメールで再送"
+ },
+ "useAnotherTwoStepMethod": {
+ "message": "他の2段階認証方法を使用"
+ },
+ "insertYubiKey": {
+ "message": " YubiKey を USB ポートに挿入し、ボタンをタッチしてください。"
+ },
+ "insertU2f": {
+ "message": "セキュリティキーを USB ポートに挿入し、ボタンがある場合はボタンをタッチしてください。"
+ },
+ "webAuthnNewTab": {
+ "message": "WebAuthn 2FA 認証を開始するには、下のボタンをクリックして新しいタブを開き、新しいタブの指示に従ってください。"
+ },
+ "webAuthnNewTabOpen": {
+ "message": "新しいタブを開く"
+ },
+ "webAuthnAuthenticate": {
+ "message": "WebAuthn の認証"
+ },
+ "loginUnavailable": {
+ "message": "ログインできません。"
+ },
+ "noTwoStepProviders": {
+ "message": "このアカウントは2段階認証が有効ですが、このブラウザに対応した2段階認証プロパイダが一つも設定されていません。"
+ },
+ "noTwoStepProviders2": {
+ "message": "Chrome などの対応したブラウザを使うか、より幅広い端末に対応した認証プロパイダを追加してください。"
+ },
+ "twoStepOptions": {
+ "message": "2段階認証オプション"
+ },
+ "recoveryCodeDesc": {
+ "message": "すべての2段階認証プロパイダにアクセスできなくなったときは、リカバリーコードを使用するとアカウントの2段階認証を無効化できます。"
+ },
+ "recoveryCodeTitle": {
+ "message": "リカバリーコード"
+ },
+ "authenticatorAppTitle": {
+ "message": "認証アプリ"
+ },
+ "authenticatorAppDesc": {
+ "message": "Authy や Google 認証システムなどの認証アプリで時限式の認証コードを生成してください。",
+ "description": "'Authy' and 'Google Authenticator' are product names and should not be translated."
+ },
+ "yubiKeyTitle": {
+ "message": "YubiKey OTP セキュリティキー"
+ },
+ "yubiKeyDesc": {
+ "message": "YubiKey を使ってアカウントにアクセスできます。 YubiKey 4、4 Nano、4C、NEOに対応しています。"
+ },
+ "duoDesc": {
+ "message": "Duo Mobile アプリや SMS、電話や U2F セキュリティキーを使って Duo Security で認証します。",
+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
+ },
+ "duoOrganizationDesc": {
+ "message": "組織の Duo Security を Duo Mobile アプリや SMS、電話、U2F セキュリティーキーを使用して認証します。",
+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
+ },
+ "webAuthnTitle": {
+ "message": "FIDO2 WebAuthn"
+ },
+ "webAuthnDesc": {
+ "message": "アカウントにアクセスするに WebAuthn 対応のセキュリティキーを使用します。"
+ },
+ "emailTitle": {
+ "message": "メールアドレス"
+ },
+ "emailDesc": {
+ "message": "確認コードをメールにお送りします。"
+ },
+ "selfHostedEnvironment": {
+ "message": "セルフホスティング環境"
+ },
+ "selfHostedEnvironmentFooter": {
+ "message": "セルフホスティングしている Bitwarden のベース URL を指定してください。"
+ },
+ "customEnvironment": {
+ "message": "カスタム環境"
+ },
+ "customEnvironmentFooter": {
+ "message": "上級者向けです。各サービスのベース URL を個別に指定できます。"
+ },
+ "baseUrl": {
+ "message": "サーバー URL"
+ },
+ "apiUrl": {
+ "message": "API サーバー URL"
+ },
+ "webVaultUrl": {
+ "message": "ウェブ保管庫サーバー URL"
+ },
+ "identityUrl": {
+ "message": "ID サーバー URL"
+ },
+ "notificationsUrl": {
+ "message": "通知サーバー URL"
+ },
+ "iconsUrl": {
+ "message": "アイコンのサーバー URL"
+ },
+ "environmentSaved": {
+ "message": "環境 URL を保存しました。"
+ },
+ "enableAutoFillOnPageLoad": {
+ "message": "ページ読み込み時の自動入力を有効化"
+ },
+ "enableAutoFillOnPageLoadDesc": {
+ "message": "ページ読み込み時にログインフォームを検出したとき、ログイン情報を自動入力します。"
+ },
+ "experimentalFeature": {
+ "message": "これは現在、実験的な機能です。自己責任で使用してください。"
+ },
+ "defaultAutoFillOnPageLoad": {
+ "message": "ログインアイテムのデフォルトの自動入力設定"
+ },
+ "defaultAutoFillOnPageLoadDesc": {
+ "message": "ページ読み込み時に自動入力を有効にすると、個々のログインアイテムの機能を有効または無効にできます。 これは個別に設定されていないログインアイテムに適用されるデフォルト設定です。"
+ },
+ "itemAutoFillOnPageLoad": {
+ "message": "ページ読み込み時に自動入力する (オプションで有効な場合)"
+ },
+ "autoFillOnPageLoadUseDefault": {
+ "message": "デフォルト設定を使用"
+ },
+ "autoFillOnPageLoadYes": {
+ "message": "ページ読み込み時に自動入力する"
+ },
+ "autoFillOnPageLoadNo": {
+ "message": "ページ読み込み時に自動入力しない"
+ },
+ "commandOpenPopup": {
+ "message": "ポップアップで保管庫を開く"
+ },
+ "commandOpenSidebar": {
+ "message": "サイドバーで保管庫を開く"
+ },
+ "commandAutofillDesc": {
+ "message": "現在のウェブサイトで前回使用されたログイン情報を自動入力します。"
+ },
+ "commandGeneratePasswordDesc": {
+ "message": "ランダムなパスワードを生成してクリップボードにコピーします。"
+ },
+ "commandLockVaultDesc": {
+ "message": "保管庫をロック"
+ },
+ "privateModeMessage": {
+ "message": "このウインドウはこのブラウザのプライベートモードでは使用できません。"
+ },
+ "customFields": {
+ "message": "カスタムフィールド"
+ },
+ "copyValue": {
+ "message": "値のコピー"
+ },
+ "value": {
+ "message": "値"
+ },
+ "newCustomField": {
+ "message": "新規カスタムフィールド"
+ },
+ "dragToSort": {
+ "message": "ドラッグして並べ替え"
+ },
+ "cfTypeText": {
+ "message": "テキスト"
+ },
+ "cfTypeHidden": {
+ "message": "非表示"
+ },
+ "cfTypeBoolean": {
+ "message": "真偽値"
+ },
+ "popup2faCloseMessage": {
+ "message": "認証コードを確認するためにポップアップの外をクリックすると、このポップアップが閉じてしまいます。閉じてしまわないよう、新しいウインドウでこのポップアップを開きますか?"
+ },
+ "popupU2fCloseMessage": {
+ "message": "このブラウザーでは U2F 要求をポップアップウインドウでは実行できません。U2F でログインできるよう、新しいウインドウで開き直しますか?"
+ },
+ "disableFavicon": {
+ "message": "ウェブサイトアイコンの無効化"
+ },
+ "disableFaviconDesc": {
+ "message": "保管庫のアイテム毎にウェブサイトのアイコンを表示します。"
+ },
+ "disableBadgeCounter": {
+ "message": "バッジカウンターを無効化"
+ },
+ "disableBadgeCounterDesc": {
+ "message": "保管庫にある、現在のページのログイン情報をバッジカウンターで表示します。"
+ },
+ "cardholderName": {
+ "message": "カードの名義人名"
+ },
+ "number": {
+ "message": "番号"
+ },
+ "brand": {
+ "message": "ブランド"
+ },
+ "expirationMonth": {
+ "message": "有効期限月"
+ },
+ "expirationYear": {
+ "message": "有効期限年"
+ },
+ "expiration": {
+ "message": "有効期限"
+ },
+ "january": {
+ "message": "1月"
+ },
+ "february": {
+ "message": "2月"
+ },
+ "march": {
+ "message": "3月"
+ },
+ "april": {
+ "message": "4月"
+ },
+ "may": {
+ "message": "5月"
+ },
+ "june": {
+ "message": "6月"
+ },
+ "july": {
+ "message": "7月"
+ },
+ "august": {
+ "message": "8月"
+ },
+ "september": {
+ "message": "9月"
+ },
+ "october": {
+ "message": "10月"
+ },
+ "november": {
+ "message": "11月"
+ },
+ "december": {
+ "message": "12月"
+ },
+ "securityCode": {
+ "message": "セキュリティコード"
+ },
+ "ex": {
+ "message": "例:"
+ },
+ "title": {
+ "message": "敬称"
+ },
+ "mr": {
+ "message": "Mr"
+ },
+ "mrs": {
+ "message": "Mrs"
+ },
+ "ms": {
+ "message": "Ms"
+ },
+ "dr": {
+ "message": "Dr"
+ },
+ "firstName": {
+ "message": "名"
+ },
+ "middleName": {
+ "message": "ミドルネーム"
+ },
+ "lastName": {
+ "message": "姓"
+ },
+ "identityName": {
+ "message": "固有名"
+ },
+ "company": {
+ "message": "会社名"
+ },
+ "ssn": {
+ "message": "社会保障番号"
+ },
+ "passportNumber": {
+ "message": "パスポート番号"
+ },
+ "licenseNumber": {
+ "message": "免許証番号"
+ },
+ "email": {
+ "message": "メールアドレス"
+ },
+ "phone": {
+ "message": "電話番号"
+ },
+ "address": {
+ "message": "住所"
+ },
+ "address1": {
+ "message": "住所 1"
+ },
+ "address2": {
+ "message": "住所 2"
+ },
+ "address3": {
+ "message": "住所 3"
+ },
+ "cityTown": {
+ "message": "市町村"
+ },
+ "stateProvince": {
+ "message": "都道府県"
+ },
+ "zipPostalCode": {
+ "message": "郵便番号"
+ },
+ "country": {
+ "message": "国"
+ },
+ "type": {
+ "message": "タイプ"
+ },
+ "typeLogin": {
+ "message": "ログイン"
+ },
+ "typeLogins": {
+ "message": "ログイン"
+ },
+ "typeSecureNote": {
+ "message": "セキュアメモ"
+ },
+ "typeCard": {
+ "message": "カード"
+ },
+ "typeIdentity": {
+ "message": "ID"
+ },
+ "passwordHistory": {
+ "message": "パスワードの履歴"
+ },
+ "back": {
+ "message": "戻る"
+ },
+ "collections": {
+ "message": "コレクション"
+ },
+ "favorites": {
+ "message": "お気に入り"
+ },
+ "popOutNewWindow": {
+ "message": "新しいウインドウで開く"
+ },
+ "refresh": {
+ "message": "更新"
+ },
+ "cards": {
+ "message": "カード"
+ },
+ "identities": {
+ "message": "ID"
+ },
+ "logins": {
+ "message": "ログイン"
+ },
+ "secureNotes": {
+ "message": "セキュアメモ"
+ },
+ "clear": {
+ "message": "消去する",
+ "description": "To clear something out. example: To clear browser history."
+ },
+ "checkPassword": {
+ "message": "パスワードが漏洩していないか確認する"
+ },
+ "passwordExposed": {
+ "message": "このパスワードは過去に$VALUE$回漏洩したことがあるため、変更するべきです。",
+ "placeholders": {
+ "value": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "passwordSafe": {
+ "message": "このパスワードは過去に漏洩したデータ内にはないため、安全であると思われます。"
+ },
+ "baseDomain": {
+ "message": "ベースドメイン"
+ },
+ "host": {
+ "message": "ホスト",
+ "description": "A URL's host value. For example, the host of https://sub.domain.com:443 is 'sub.domain.com:443'."
+ },
+ "exact": {
+ "message": "完全一致"
+ },
+ "startsWith": {
+ "message": "前方一致"
+ },
+ "regEx": {
+ "message": "正規表現",
+ "description": "A programming term, also known as 'RegEx'."
+ },
+ "matchDetection": {
+ "message": "一致検出方法",
+ "description": "URI match detection for auto-fill."
+ },
+ "defaultMatchDetection": {
+ "message": "デフォルトの一致検出方法",
+ "description": "Default URI match detection for auto-fill."
+ },
+ "toggleOptions": {
+ "message": "オプションの切り替え"
+ },
+ "toggleCurrentUris": {
+ "message": "現在の URI を切り替え",
+ "description": "Toggle the display of the URIs of the currently open tabs in the browser."
+ },
+ "currentUri": {
+ "message": "現在の URI",
+ "description": "The URI of one of the current open tabs in the browser."
+ },
+ "organization": {
+ "message": "組織",
+ "description": "An entity of multiple related people (ex. a team or business organization)."
+ },
+ "types": {
+ "message": "種類"
+ },
+ "allItems": {
+ "message": "全てのアイテム"
+ },
+ "noPasswordsInList": {
+ "message": "表示するパスワードがありません"
+ },
+ "remove": {
+ "message": "削除"
+ },
+ "default": {
+ "message": "デフォルト"
+ },
+ "dateUpdated": {
+ "message": "更新日",
+ "description": "ex. Date this item was updated"
+ },
+ "datePasswordUpdated": {
+ "message": "パスワード更新日",
+ "description": "ex. Date this password was updated"
+ },
+ "neverLockWarning": {
+ "message": "ロックオプションを「なし」に設定してもよろしいですか? ロックオプションを「なし」に設定すると、保管庫の暗号化キーが端末に保存されます。 このオプションを使用する場合は、端末を適切に保護しておく必要があります。"
+ },
+ "noOrganizationsList": {
+ "message": "あなたはどの組織にも属していません。組織では他のユーザーとアイテムを安全に共有できます。"
+ },
+ "noCollectionsInList": {
+ "message": "表示するコレクションがありません"
+ },
+ "ownership": {
+ "message": "所有者"
+ },
+ "whoOwnsThisItem": {
+ "message": "このアイテムは誰が所有していますか?"
+ },
+ "strong": {
+ "message": "強力",
+ "description": "ex. A strong password. Scale: Weak -> Good -> Strong"
+ },
+ "good": {
+ "message": "良好",
+ "description": "ex. A good password. Scale: Weak -> Good -> Strong"
+ },
+ "weak": {
+ "message": "脆弱",
+ "description": "ex. A weak password. Scale: Weak -> Good -> Strong"
+ },
+ "weakMasterPassword": {
+ "message": "脆弱なマスターパスワード"
+ },
+ "weakMasterPasswordDesc": {
+ "message": "設定されたマスターパスワードの強度は脆弱です。Bitwarden アカウントを適切に保護するために、強力なマスターパスワード(またはパスフレーズ)を使用すべきです。本当にこのマスターパスワードを使用しますか?"
+ },
+ "pin": {
+ "message": "PIN",
+ "description": "PIN code. Ex. The short code (often numeric) that you use to unlock a device."
+ },
+ "unlockWithPin": {
+ "message": "PIN でロック解除"
+ },
+ "setYourPinCode": {
+ "message": "Bitwarden のロックを解除するための PIN コードを設定します。アプリから完全にログアウトすると、PIN 設定はリセットされます。"
+ },
+ "pinRequired": {
+ "message": "PIN コードが必要です。"
+ },
+ "invalidPin": {
+ "message": "PIN コードが間違っています。"
+ },
+ "verifyPin": {
+ "message": "PIN の確認"
+ },
+ "yourVaultIsLockedPinCode": {
+ "message": "保管庫がロックされています。PIN コードで認証してください。"
+ },
+ "unlockWithBiometrics": {
+ "message": "生体認証でロック解除"
+ },
+ "awaitDesktop": {
+ "message": "デスクトップからの確認待ち"
+ },
+ "awaitDesktopDesc": {
+ "message": "ブラウザの生体認証を有効にするには、Bitwarden デスクトップアプリの生体認証を使用してください。"
+ },
+ "lockWithMasterPassOnRestart": {
+ "message": "ブラウザー再起動時にマスターパスワードでロック"
+ },
+ "selectOneCollection": {
+ "message": "最低でも一つのコレクションを選んでください。"
+ },
+ "cloneItem": {
+ "message": "アイテムを複製"
+ },
+ "clone": {
+ "message": "複製"
+ },
+ "passwordGeneratorPolicyInEffect": {
+ "message": "一つ以上の組織のポリシーがパスワード生成の設定に影響しています。"
+ },
+ "vaultTimeoutAction": {
+ "message": "保管庫タイムアウト時のアクション"
+ },
+ "lock": {
+ "message": "ロック",
+ "description": "Verb form: to make secure or inaccesible by"
+ },
+ "trash": {
+ "message": "ごみ箱",
+ "description": "Noun: a special folder to hold deleted items"
+ },
+ "searchTrash": {
+ "message": "ごみ箱を検索"
+ },
+ "permanentlyDeleteItem": {
+ "message": "アイテムを完全に削除"
+ },
+ "permanentlyDeleteItemConfirmation": {
+ "message": "このアイテムを完全に削除してもよろしいですか?"
+ },
+ "permanentlyDeletedItem": {
+ "message": "完全に削除されたアイテム"
+ },
+ "restoreItem": {
+ "message": "アイテムをリストア"
+ },
+ "restoreItemConfirmation": {
+ "message": "このアイテムをリストアしますか?"
+ },
+ "restoredItem": {
+ "message": "リストアされたアイテム"
+ },
+ "vaultTimeoutLogOutConfirmation": {
+ "message": "ログアウトすると保管庫へのすべてのアクセスが制限され、タイムアウト期間後にオンライン認証が必要になります。 この設定を使用してもよろしいですか?"
+ },
+ "vaultTimeoutLogOutConfirmationTitle": {
+ "message": "タイムアウトアクションの確認"
+ },
+ "autoFillAndSave": {
+ "message": "自動入力して保存"
+ },
+ "autoFillSuccessAndSavedUri": {
+ "message": "アイテムを自動入力して URI を保存しました"
+ },
+ "autoFillSuccess": {
+ "message": "アイテムを自動入力しました"
+ },
+ "setMasterPassword": {
+ "message": "マスターパスワードを設定"
+ },
+ "masterPasswordPolicyInEffect": {
+ "message": "組織が求めるマスターパスワードの要件:"
+ },
+ "policyInEffectMinComplexity": {
+ "message": "複雑度は最低$SCORE$",
+ "placeholders": {
+ "score": {
+ "content": "$1",
+ "example": "4"
+ }
+ }
+ },
+ "policyInEffectMinLength": {
+ "message": "長さは最低$LENGTH$",
+ "placeholders": {
+ "length": {
+ "content": "$1",
+ "example": "14"
+ }
+ }
+ },
+ "policyInEffectUppercase": {
+ "message": "大文字が最低1つ必要"
+ },
+ "policyInEffectLowercase": {
+ "message": "小文字が最低1つ必要"
+ },
+ "policyInEffectNumbers": {
+ "message": "数字が最低1つ必要"
+ },
+ "policyInEffectSpecial": {
+ "message": "次の記号から1つ以上:$CHARS$",
+ "placeholders": {
+ "chars": {
+ "content": "$1",
+ "example": "!@#$%^&*"
+ }
+ }
+ },
+ "masterPasswordPolicyRequirementsNotMet": {
+ "message": "新しいマスターパスワードは最低要件を満たしていません。"
+ },
+ "acceptPolicies": {
+ "message": "以下に同意しチェックします:"
+ },
+ "acceptPoliciesError": {
+ "message": "利用規約とプライバシーポリシーを確認してください。"
+ },
+ "termsOfService": {
+ "message": "サービス利用規約"
+ },
+ "privacyPolicy": {
+ "message": "プライバシーポリシー"
+ },
+ "hintEqualsPassword": {
+ "message": "パスワードのヒントをパスワードと同じにすることはできません。"
+ },
+ "ok": {
+ "message": "OK"
+ },
+ "desktopSyncVerificationTitle": {
+ "message": "デスクトップ同期の検証"
+ },
+ "desktopIntegrationVerificationText": {
+ "message": "デスクトップアプリにこの指紋が表示されていることを確認してください: "
+ },
+ "desktopIntegrationDisabledTitle": {
+ "message": "ブラウザ統合が有効になっていません"
+ },
+ "desktopIntegrationDisabledDesc": {
+ "message": "Bitwarden デスクトップアプリでブラウザ統合が有効になっていません。デスクトップアプリの設定で有効にしてください。"
+ },
+ "startDesktopTitle": {
+ "message": "Bitwarden デスクトップアプリを起動"
+ },
+ "startDesktopDesc": {
+ "message": "この機能を使用するには、Bitwarden デスクトップアプリを起動してください。"
+ },
+ "errorEnableBiometricTitle": {
+ "message": "生体認証を有効にできません"
+ },
+ "errorEnableBiometricDesc": {
+ "message": "デスクトップアプリによってアクションがキャンセルされました"
+ },
+ "nativeMessagingInvalidEncryptionDesc": {
+ "message": "デスクトップアプリが安全な通信チャネルを無効にしました。操作をやり直してください。"
+ },
+ "nativeMessagingInvalidEncryptionTitle": {
+ "message": "デスクトップ通信が中断されました"
+ },
+ "nativeMessagingWrongUserDesc": {
+ "message": "デスクトップアプリは別のアカウントにログインしています。両方のアプリが同じアカウントにログインしているか確認してください。"
+ },
+ "nativeMessagingWrongUserTitle": {
+ "message": "アカウントが一致しません"
+ },
+ "biometricsNotEnabledTitle": {
+ "message": "生体認証が有効になっていません"
+ },
+ "biometricsNotEnabledDesc": {
+ "message": "ブラウザ生体認証を利用するには、まず設定でデスクトップ生体認証を有効にする必要があります。"
+ },
+ "biometricsNotSupportedTitle": {
+ "message": "生体認証に対応していません"
+ },
+ "biometricsNotSupportedDesc": {
+ "message": "このデバイスではブラウザの生体認証に対応していません。"
+ },
+ "nativeMessaginPermissionErrorTitle": {
+ "message": "権限が提供されていません"
+ },
+ "nativeMessaginPermissionErrorDesc": {
+ "message": "Bitwarden デスクトップアプリとの通信許可がなければ、ブラウザ拡張機能で生体認証を利用できません。もう一度やり直してください。"
+ },
+ "nativeMessaginPermissionSidebarTitle": {
+ "message": "権限リクエストエラー"
+ },
+ "nativeMessaginPermissionSidebarDesc": {
+ "message": "この操作はサイドバーでは行えません。ポップアップまたはポップアウトでやり直してください。"
+ },
+ "personalOwnershipSubmitError": {
+ "message": "組織のポリシーにより、個人の保管庫へのアイテムの保存が制限されています。 所有権を組織に変更し、利用可能なコレクションから選択してください。"
+ },
+ "personalOwnershipPolicyInEffect": {
+ "message": "組織のポリシーが所有者のオプションに影響を与えています。"
+ },
+ "excludedDomains": {
+ "message": "除外するドメイン"
+ },
+ "excludedDomainsDesc": {
+ "message": "Bitwarden はこれらのドメインのログイン情報を保存するよう尋ねません。変更を有効にするにはページを更新する必要があります。"
+ },
+ "excludedDomainsInvalidDomain": {
+ "message": "$DOMAIN$ は有効なドメインではありません",
+ "placeholders": {
+ "domain": {
+ "content": "$1",
+ "example": "googlecom"
+ }
+ }
+ },
+ "send": {
+ "message": "Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "searchSends": {
+ "message": "Send を検索",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "addSend": {
+ "message": "Send を追加",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTypeText": {
+ "message": "テキスト"
+ },
+ "sendTypeFile": {
+ "message": "ファイル"
+ },
+ "allSends": {
+ "message": "すべての Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "maxAccessCountReached": {
+ "message": "最大アクセス数に達しました"
+ },
+ "expired": {
+ "message": "有効期限切れ"
+ },
+ "pendingDeletion": {
+ "message": "削除の保留中"
+ },
+ "passwordProtected": {
+ "message": "パスワード保護あり"
+ },
+ "copySendLink": {
+ "message": "Send リンクをコピー",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "removePassword": {
+ "message": "パスワードを削除"
+ },
+ "delete": {
+ "message": "削除"
+ },
+ "removedPassword": {
+ "message": "パスワードを削除"
+ },
+ "deletedSend": {
+ "message": "削除した Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendLink": {
+ "message": "Send リンク",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "disabled": {
+ "message": "無効"
+ },
+ "removePasswordConfirmation": {
+ "message": "パスワードを削除してもよろしいですか?"
+ },
+ "deleteSend": {
+ "message": "Send を削除",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "deleteSendConfirmation": {
+ "message": "この Send を削除してもよろしいですか?",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "editSend": {
+ "message": "Send を編集",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTypeHeader": {
+ "message": "この Send の種類は何ですか?",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendNameDesc": {
+ "message": "この Send を説明するわかりやすい名前",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendFileDesc": {
+ "message": "送信するファイル"
+ },
+ "deletionDate": {
+ "message": "削除日時"
+ },
+ "deletionDateDesc": {
+ "message": "Send は指定された日時に完全に削除されます。",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "expirationDate": {
+ "message": "有効期限"
+ },
+ "expirationDateDesc": {
+ "message": "設定されている場合、この Send へのアクセスは指定された日時に失効します。",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "oneDay": {
+ "message": "1日"
+ },
+ "days": {
+ "message": "$DAYS$日",
+ "placeholders": {
+ "days": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "custom": {
+ "message": "カスタム"
+ },
+ "maximumAccessCount": {
+ "message": "最大アクセス数"
+ },
+ "maximumAccessCountDesc": {
+ "message": "設定されている場合、最大アクセス数に達するとユーザーはこの Send にアクセスできなくなります。",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendPasswordDesc": {
+ "message": "必要に応じて、ユーザーがこの Send にアクセスするためのパスワードを要求します。",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendNotesDesc": {
+ "message": "この Send に関するプライベートメモ",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendDisableDesc": {
+ "message": "誰もアクセスできないように、この Send を無効にする",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendShareDesc": {
+ "message": "保存時にこの Send のリンクをクリップボードにコピーする",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTextDesc": {
+ "message": "送信したいテキスト"
+ },
+ "sendHideText": {
+ "message": "この Send のテキストをデフォルトで非表示にする",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "currentAccessCount": {
+ "message": "現在のアクセス数"
+ },
+ "createSend": {
+ "message": "新しい Send を作成",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "newPassword": {
+ "message": "新しいパスワード"
+ },
+ "sendDisabled": {
+ "message": "Send 無効",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendDisabledWarning": {
+ "message": "組織のポリシーにより、既存の Send のみを削除できます。",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "createdSend": {
+ "message": "作成した Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "editedSend": {
+ "message": "編集済みの Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendLinuxChromiumFileWarning": {
+ "message": "ファイルを選択するには、可能な場合サイドバーで拡張子を開くか、このバナーをクリックして新しいウィンドウにポップアップしてください。"
+ },
+ "sendFirefoxFileWarning": {
+ "message": "Firefox を使用してファイルを選択するには、サイドバーで開くか、このバナーをクリックして新しいウィンドウで開いてください。"
+ },
+ "sendSafariFileWarning": {
+ "message": "Safari を使用してファイルを選択するには、このバナーをクリックして新しいウィンドウで開いてください。"
+ },
+ "sendFileCalloutHeader": {
+ "message": "はじめる前に"
+ },
+ "sendFirefoxCustomDatePopoutMessage1": {
+ "message": "カレンダースタイルの日付ピッカーを使用するには",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read '**To use a calendar style date picker ** click here to pop out your window.'"
+ },
+ "sendFirefoxCustomDatePopoutMessage2": {
+ "message": "こちらをクリック",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker **click here** to pop out your window.'"
+ },
+ "sendFirefoxCustomDatePopoutMessage3": {
+ "message": "してください。",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker click here **to pop out your window.**'"
+ },
+ "expirationDateIsInvalid": {
+ "message": "入力された有効期限は正しくありません。"
+ },
+ "deletionDateIsInvalid": {
+ "message": "入力された削除日時は正しくありません。"
+ },
+ "expirationDateAndTimeRequired": {
+ "message": "有効期限は必須です。"
+ },
+ "deletionDateAndTimeRequired": {
+ "message": "削除日時は必須です。"
+ },
+ "dateParsingError": {
+ "message": "削除と有効期限の保存中にエラーが発生しました。"
+ },
+ "hideEmail": {
+ "message": "メールアドレスを受信者に表示しない"
+ },
+ "sendOptionsPolicyInEffect": {
+ "message": "一つ以上の組織ポリシーが Send の設定に影響しています。"
+ },
+ "passwordPrompt": {
+ "message": "マスターパスワードの再要求"
+ },
+ "passwordConfirmation": {
+ "message": "マスターパスワードの確認"
+ },
+ "passwordConfirmationDesc": {
+ "message": "この操作は保護されています。続行するには、確認のためにマスターパスワードを再入力してください。"
+ },
+ "emailVerificationRequired": {
+ "message": "メールアドレスの確認が必要です"
+ },
+ "emailVerificationRequiredDesc": {
+ "message": "この機能を使用するにはメールアドレスを確認する必要があります。ウェブ保管庫でメールアドレスを確認できます。"
+ },
+ "updatedMasterPassword": {
+ "message": "マスターパスワードを更新しました"
+ },
+ "updateMasterPassword": {
+ "message": "マスターパスワードを更新しました"
+ },
+ "updateMasterPasswordWarning": {
+ "message": "マスターパスワードは最近組織の管理者によって変更されました。保管庫にアクセスするには、今すぐ更新する必要があります。 続行すると現在のセッションからログアウトし、再度ログインする必要があります。 他のデバイスでのアクティブなセッションは、最大1時間アクティブになり続けることがあります。"
+ },
+ "resetPasswordPolicyAutoEnroll": {
+ "message": "自動登録"
+ },
+ "resetPasswordAutoEnrollInviteWarning": {
+ "message": "この組織には自動的にパスワードリセットに登録するポリシーがあります。登録すると、組織の管理者はマスターパスワードを変更できます。"
+ },
+ "selectFolder": {
+ "message": "フォルダーを選択..."
+ },
+ "ssoCompleteRegistration": {
+ "message": "SSO ログインを完了するには、保管庫にアクセス・保護するためのマスターパスワードを設定してください。"
+ },
+ "hours": {
+ "message": "時間"
+ },
+ "minutes": {
+ "message": "分"
+ },
+ "vaultTimeoutPolicyInEffect": {
+ "message": "あなたの組織ポリシーは保管庫のタイムアウトに影響を与えています。最大保管庫のタイムアウト時間は $HOURS$ 時間 $MINUTES$ 分です。",
+ "placeholders": {
+ "hours": {
+ "content": "$1",
+ "example": "5"
+ },
+ "minutes": {
+ "content": "$2",
+ "example": "5"
+ }
+ }
+ },
+ "vaultTimeoutToLarge": {
+ "message": "保管庫のタイムアウトが組織によって設定された制限を超えています。"
+ },
+ "vaultExportDisabled": {
+ "message": "保管庫のエクスポートは無効です"
+ },
+ "personalVaultExportPolicyInEffect": {
+ "message": "1 つまたは複数の組織ポリシーにより、個人の保管庫をエクスポートできません。"
+ },
+ "copyCustomFieldNameInvalidElement": {
+ "message": "有効なフォーム要素を識別できませんでした。代わりに HTML を調べてみてください。"
+ },
+ "copyCustomFieldNameNotUnique": {
+ "message": "一意の識別子が見つかりませんでした。"
+ }
+}
diff --git a/src/iOS.Safari/Resources/_locales/ka/messages.json b/src/iOS.Safari/Resources/_locales/ka/messages.json
new file mode 100644
index 000000000..e7d488183
--- /dev/null
+++ b/src/iOS.Safari/Resources/_locales/ka/messages.json
@@ -0,0 +1,1817 @@
+{
+ "appName": {
+ "message": "Bitwarden"
+ },
+ "extName": {
+ "message": "Bitwarden - Free Password Manager",
+ "description": "Extension name, MUST be less than 40 characters (Safari restriction)"
+ },
+ "extDesc": {
+ "message": "A secure and free password manager for all of your devices.",
+ "description": "Extension description"
+ },
+ "loginOrCreateNewAccount": {
+ "message": "Log in or create a new account to access your secure vault."
+ },
+ "createAccount": {
+ "message": "Create Account"
+ },
+ "login": {
+ "message": "Log In"
+ },
+ "enterpriseSingleSignOn": {
+ "message": "Enterprise Single Sign-On"
+ },
+ "cancel": {
+ "message": "გაუქმება"
+ },
+ "close": {
+ "message": "დახურვა"
+ },
+ "submit": {
+ "message": "დადასტურება"
+ },
+ "emailAddress": {
+ "message": "ელ-ფოსტა"
+ },
+ "masterPass": {
+ "message": "Master Password"
+ },
+ "masterPassDesc": {
+ "message": "The master password is the password you use to access your vault. It is very important that you do not forget your master password. There is no way to recover the password in the event that you forget it."
+ },
+ "masterPassHintDesc": {
+ "message": "A master password hint can help you remember your password if you forget it."
+ },
+ "reTypeMasterPass": {
+ "message": "Re-type Master Password"
+ },
+ "masterPassHint": {
+ "message": "Master Password Hint (optional)"
+ },
+ "tab": {
+ "message": "Tab"
+ },
+ "myVault": {
+ "message": "My Vault"
+ },
+ "tools": {
+ "message": "ხელსაწყოები"
+ },
+ "settings": {
+ "message": "პარამეტრები"
+ },
+ "currentTab": {
+ "message": "Current Tab"
+ },
+ "copyPassword": {
+ "message": "Copy Password"
+ },
+ "copyNote": {
+ "message": "Copy Note"
+ },
+ "copyUri": {
+ "message": "Copy URI"
+ },
+ "copyUsername": {
+ "message": "Copy Username"
+ },
+ "copyNumber": {
+ "message": "Copy Number"
+ },
+ "copySecurityCode": {
+ "message": "Copy Security Code"
+ },
+ "autoFill": {
+ "message": "თვითშევსება"
+ },
+ "generatePasswordCopied": {
+ "message": "Generate Password (copied)"
+ },
+ "copyElementIdentifier": {
+ "message": "Copy Custom Field Name"
+ },
+ "noMatchingLogins": {
+ "message": "No matching logins."
+ },
+ "vaultLocked": {
+ "message": "Vault is locked."
+ },
+ "vaultLoggedOut": {
+ "message": "Vault is logged out."
+ },
+ "autoFillInfo": {
+ "message": "There are no logins available to auto-fill for the current browser tab."
+ },
+ "addLogin": {
+ "message": "Add a Login"
+ },
+ "addItem": {
+ "message": "Add Item"
+ },
+ "passwordHint": {
+ "message": "Password Hint"
+ },
+ "enterEmailToGetHint": {
+ "message": "Enter your account email address to receive your master password hint."
+ },
+ "getMasterPasswordHint": {
+ "message": "Get master password hint"
+ },
+ "continue": {
+ "message": "გაგრძელება"
+ },
+ "verificationCode": {
+ "message": "Verification Code"
+ },
+ "account": {
+ "message": "ანგარიში"
+ },
+ "changeMasterPassword": {
+ "message": "Change Master Password"
+ },
+ "fingerprintPhrase": {
+ "message": "Fingerprint Phrase",
+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
+ },
+ "yourAccountsFingerprint": {
+ "message": "Your account's fingerprint phrase",
+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
+ },
+ "twoStepLogin": {
+ "message": "Two-step Login"
+ },
+ "logOut": {
+ "message": "გამოსვლა"
+ },
+ "about": {
+ "message": "შესახებ"
+ },
+ "version": {
+ "message": "ვერსია"
+ },
+ "save": {
+ "message": "შენახვა"
+ },
+ "move": {
+ "message": "Move"
+ },
+ "addFolder": {
+ "message": "Add Folder"
+ },
+ "name": {
+ "message": "Name"
+ },
+ "editFolder": {
+ "message": "Edit Folder"
+ },
+ "deleteFolder": {
+ "message": "Delete Folder"
+ },
+ "folders": {
+ "message": "Folders"
+ },
+ "noFolders": {
+ "message": "There are no folders to list."
+ },
+ "helpFeedback": {
+ "message": "Help & Feedback"
+ },
+ "sync": {
+ "message": "Sync"
+ },
+ "syncVaultNow": {
+ "message": "Sync Vault Now"
+ },
+ "lastSync": {
+ "message": "Last Sync:"
+ },
+ "passGen": {
+ "message": "Password Generator"
+ },
+ "generator": {
+ "message": "Generator",
+ "description": "Short for 'Password Generator'."
+ },
+ "passGenInfo": {
+ "message": "Automatically generate strong, unique passwords for your logins."
+ },
+ "bitWebVault": {
+ "message": "Bitwarden Web Vault"
+ },
+ "importItems": {
+ "message": "Import Items"
+ },
+ "select": {
+ "message": "მონიშვნა"
+ },
+ "generatePassword": {
+ "message": "Generate Password"
+ },
+ "regeneratePassword": {
+ "message": "Regenerate Password"
+ },
+ "options": {
+ "message": "პარამეტრები"
+ },
+ "length": {
+ "message": "სიგრძე"
+ },
+ "numWords": {
+ "message": "სიტყვათა რაოდენობა"
+ },
+ "wordSeparator": {
+ "message": "Word Separator"
+ },
+ "capitalize": {
+ "message": "დიდი ასოთი აღნიშვნა",
+ "description": "Make the first letter of a work uppercase."
+ },
+ "includeNumber": {
+ "message": "Include Number"
+ },
+ "minNumbers": {
+ "message": "Minimum Numbers"
+ },
+ "minSpecial": {
+ "message": "Minimum Special"
+ },
+ "avoidAmbChar": {
+ "message": "Avoid Ambiguous Characters"
+ },
+ "searchVault": {
+ "message": "Search vault"
+ },
+ "edit": {
+ "message": "Edit"
+ },
+ "view": {
+ "message": "View"
+ },
+ "noItemsInList": {
+ "message": "There are no items to list."
+ },
+ "itemInformation": {
+ "message": "Item Information"
+ },
+ "username": {
+ "message": "Username"
+ },
+ "password": {
+ "message": "პაროლი"
+ },
+ "passphrase": {
+ "message": "Passphrase"
+ },
+ "favorite": {
+ "message": "რჩეული"
+ },
+ "notes": {
+ "message": "Notes"
+ },
+ "note": {
+ "message": "Note"
+ },
+ "editItem": {
+ "message": "Edit Item"
+ },
+ "folder": {
+ "message": "Folder"
+ },
+ "deleteItem": {
+ "message": "Delete Item"
+ },
+ "viewItem": {
+ "message": "View Item"
+ },
+ "launch": {
+ "message": "Launch"
+ },
+ "website": {
+ "message": "ვებგვერდი"
+ },
+ "toggleVisibility": {
+ "message": "Toggle Visibility"
+ },
+ "manage": {
+ "message": "Manage"
+ },
+ "other": {
+ "message": "სხვა"
+ },
+ "rateExtension": {
+ "message": "Rate the Extension"
+ },
+ "rateExtensionDesc": {
+ "message": "Please consider helping us out with a good review!"
+ },
+ "browserNotSupportClipboard": {
+ "message": "Your web browser does not support easy clipboard copying. Copy it manually instead."
+ },
+ "verifyMasterPassword": {
+ "message": "Verify Master Password"
+ },
+ "yourVaultIsLocked": {
+ "message": "Your vault is locked. Verify your master password to continue."
+ },
+ "unlock": {
+ "message": "გახსნა"
+ },
+ "loggedInAsOn": {
+ "message": "Logged in as $EMAIL$ on $HOSTNAME$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "name@example.com"
+ },
+ "hostname": {
+ "content": "$2",
+ "example": "bitwarden.com"
+ }
+ }
+ },
+ "invalidMasterPassword": {
+ "message": "Invalid master password"
+ },
+ "vaultTimeout": {
+ "message": "Vault Timeout"
+ },
+ "lockNow": {
+ "message": "Lock Now"
+ },
+ "immediately": {
+ "message": "დაუყონებლივ"
+ },
+ "tenSeconds": {
+ "message": "10 წამი"
+ },
+ "twentySeconds": {
+ "message": "20 წამი"
+ },
+ "thirtySeconds": {
+ "message": "30 წამი"
+ },
+ "oneMinute": {
+ "message": "1 წუთი"
+ },
+ "twoMinutes": {
+ "message": "2 წუთი"
+ },
+ "fiveMinutes": {
+ "message": "5 minutes"
+ },
+ "fifteenMinutes": {
+ "message": "15 minutes"
+ },
+ "thirtyMinutes": {
+ "message": "30 minutes"
+ },
+ "oneHour": {
+ "message": "1 hour"
+ },
+ "fourHours": {
+ "message": "4 hours"
+ },
+ "onLocked": {
+ "message": "On System Lock"
+ },
+ "onRestart": {
+ "message": "On Browser Restart"
+ },
+ "never": {
+ "message": "Never"
+ },
+ "security": {
+ "message": "Security"
+ },
+ "errorOccurred": {
+ "message": "An error has occurred"
+ },
+ "emailRequired": {
+ "message": "Email address is required."
+ },
+ "invalidEmail": {
+ "message": "Invalid email address."
+ },
+ "masterPassRequired": {
+ "message": "Master password is required."
+ },
+ "masterPassLength": {
+ "message": "Master password must be at least 8 characters long."
+ },
+ "masterPassDoesntMatch": {
+ "message": "Master password confirmation does not match."
+ },
+ "newAccountCreated": {
+ "message": "Your new account has been created! You may now log in."
+ },
+ "masterPassSent": {
+ "message": "We've sent you an email with your master password hint."
+ },
+ "verificationCodeRequired": {
+ "message": "Verification code is required."
+ },
+ "valueCopied": {
+ "message": "$VALUE$ copied",
+ "description": "Value has been copied to the clipboard.",
+ "placeholders": {
+ "value": {
+ "content": "$1",
+ "example": "Password"
+ }
+ }
+ },
+ "autofillError": {
+ "message": "Unable to auto-fill the selected item on this page. Copy and paste the information instead."
+ },
+ "loggedOut": {
+ "message": "Logged out"
+ },
+ "loginExpired": {
+ "message": "Your login session has expired."
+ },
+ "logOutConfirmation": {
+ "message": "Are you sure you want to log out?"
+ },
+ "yes": {
+ "message": "Yes"
+ },
+ "no": {
+ "message": "არა"
+ },
+ "unexpectedError": {
+ "message": "An unexpected error has occurred."
+ },
+ "nameRequired": {
+ "message": "სახელი სავალდებულოა."
+ },
+ "addedFolder": {
+ "message": "Added folder"
+ },
+ "changeMasterPass": {
+ "message": "Change Master Password"
+ },
+ "changeMasterPasswordConfirmation": {
+ "message": "You can change your master password on the bitwarden.com web vault. Do you want to visit the website now?"
+ },
+ "twoStepLoginConfirmation": {
+ "message": "Two-step login makes your account more secure by requiring you to verify your login with another device such as a security key, authenticator app, SMS, phone call, or email. Two-step login can be enabled on the bitwarden.com web vault. Do you want to visit the website now?"
+ },
+ "editedFolder": {
+ "message": "Edited folder"
+ },
+ "deleteFolderConfirmation": {
+ "message": "Are you sure you want to delete this folder?"
+ },
+ "deletedFolder": {
+ "message": "Deleted folder"
+ },
+ "gettingStartedTutorial": {
+ "message": "Getting Started Tutorial"
+ },
+ "gettingStartedTutorialVideo": {
+ "message": "Watch our getting started tutorial to learn how to get the most out of the browser extension."
+ },
+ "syncingComplete": {
+ "message": "Syncing complete"
+ },
+ "syncingFailed": {
+ "message": "Syncing failed"
+ },
+ "passwordCopied": {
+ "message": "Password copied"
+ },
+ "uri": {
+ "message": "URI"
+ },
+ "uriPosition": {
+ "message": "URI $POSITION$",
+ "description": "A listing of URIs. Ex: URI 1, URI 2, URI 3, etc.",
+ "placeholders": {
+ "position": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "newUri": {
+ "message": "New URI"
+ },
+ "addedItem": {
+ "message": "Added item"
+ },
+ "editedItem": {
+ "message": "Edited item"
+ },
+ "deleteItemConfirmation": {
+ "message": "Do you really want to send to the trash?"
+ },
+ "deletedItem": {
+ "message": "Sent item to trash"
+ },
+ "overwritePassword": {
+ "message": "Overwrite Password"
+ },
+ "overwritePasswordConfirmation": {
+ "message": "Are you sure you want to overwrite the current password?"
+ },
+ "searchFolder": {
+ "message": "Search folder"
+ },
+ "searchCollection": {
+ "message": "Search collection"
+ },
+ "searchType": {
+ "message": "Search type"
+ },
+ "noneFolder": {
+ "message": "No Folder",
+ "description": "This is the folder for uncategorized items"
+ },
+ "disableAddLoginNotification": {
+ "message": "Disable Add Login Notification"
+ },
+ "addLoginNotificationDesc": {
+ "message": "The \"Add Login Notification\" automatically prompts you to save new logins to your vault whenever you log into them for the first time."
+ },
+ "dontShowCardsCurrentTab": {
+ "message": "Don't Show Cards on Tab Page"
+ },
+ "dontShowCardsCurrentTabDesc": {
+ "message": "Card items from your vault are listed on the 'Current Tab' page for easy auto-fill access."
+ },
+ "dontShowIdentitiesCurrentTab": {
+ "message": "Don't Show Identities on Tab Page"
+ },
+ "dontShowIdentitiesCurrentTabDesc": {
+ "message": "Identity items from your vault are listed on the 'Current Tab' page for easy auto-fill access."
+ },
+ "clearClipboard": {
+ "message": "Clear Clipboard",
+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
+ },
+ "clearClipboardDesc": {
+ "message": "Automatically clear copied values from your clipboard.",
+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
+ },
+ "notificationAddDesc": {
+ "message": "Should Bitwarden remember this password for you?"
+ },
+ "notificationAddSave": {
+ "message": "Yes, Save Now"
+ },
+ "notificationNeverSave": {
+ "message": "Never for this website"
+ },
+ "disableChangedPasswordNotification": {
+ "message": "Disable Changed Password Notification"
+ },
+ "disableChangedPasswordNotificationDesc": {
+ "message": "The \"Changed Password Notification\" automatically prompts you to update a login's password in your vault whenever it detects that you have changed it on a website."
+ },
+ "notificationChangeDesc": {
+ "message": "Do you want to update this password in Bitwarden?"
+ },
+ "notificationChangeSave": {
+ "message": "Yes, Update Now"
+ },
+ "disableContextMenuItem": {
+ "message": "Disable Context Menu Options"
+ },
+ "disableContextMenuItemDesc": {
+ "message": "Context menu options provide quick access to password generation and logins for the website in your current tab."
+ },
+ "defaultUriMatchDetection": {
+ "message": "Default URI Match Detection",
+ "description": "Default URI match detection for auto-fill."
+ },
+ "defaultUriMatchDetectionDesc": {
+ "message": "Choose the default way that URI match detection is handled for logins when performing actions such as auto-fill."
+ },
+ "theme": {
+ "message": "Theme"
+ },
+ "themeDesc": {
+ "message": "Change the application's color theme."
+ },
+ "dark": {
+ "message": "Dark",
+ "description": "Dark color"
+ },
+ "light": {
+ "message": "Light",
+ "description": "Light color"
+ },
+ "solarizedDark": {
+ "message": "Solarized Dark",
+ "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated."
+ },
+ "exportVault": {
+ "message": "Export Vault"
+ },
+ "fileFormat": {
+ "message": "File Format"
+ },
+ "warning": {
+ "message": "WARNING",
+ "description": "WARNING (should stay in capitalized letters if the language permits)"
+ },
+ "confirmVaultExport": {
+ "message": "Confirm Vault Export"
+ },
+ "exportWarningDesc": {
+ "message": "This export contains your vault data in an unencrypted format. You should not store or send the exported file over unsecure channels (such as email). Delete it immediately after you are done using it."
+ },
+ "encExportKeyWarningDesc": {
+ "message": "This export encrypts your data using your account's encryption key. If you ever rotate your account's encryption key you should export again since you will not be able to decrypt this export file."
+ },
+ "encExportAccountWarningDesc": {
+ "message": "Account encryption keys are unique to each Bitwarden user account, so you can't import an encrypted export into a different account."
+ },
+ "exportMasterPassword": {
+ "message": "Enter your master password to export your vault data."
+ },
+ "shared": {
+ "message": "Shared"
+ },
+ "learnOrg": {
+ "message": "Learn about Organizations"
+ },
+ "learnOrgConfirmation": {
+ "message": "Bitwarden allows you to share your vault items with others by using an organization. Would you like to visit the bitwarden.com website to learn more?"
+ },
+ "moveToOrganization": {
+ "message": "Move to Organization"
+ },
+ "share": {
+ "message": "Share"
+ },
+ "movedItemToOrg": {
+ "message": "$ITEMNAME$ moved to $ORGNAME$",
+ "placeholders": {
+ "itemname": {
+ "content": "$1",
+ "example": "Secret Item"
+ },
+ "orgname": {
+ "content": "$2",
+ "example": "Company Name"
+ }
+ }
+ },
+ "moveToOrgDesc": {
+ "message": "Choose an organization that you wish to move this item to. Moving to an organization transfers ownership of the item to that organization. You will no longer be the direct owner of this item once it has been moved."
+ },
+ "learnMore": {
+ "message": "Learn more"
+ },
+ "authenticatorKeyTotp": {
+ "message": "Authenticator Key (TOTP)"
+ },
+ "verificationCodeTotp": {
+ "message": "Verification Code (TOTP)"
+ },
+ "copyVerificationCode": {
+ "message": "Copy Verification Code"
+ },
+ "attachments": {
+ "message": "Attachments"
+ },
+ "deleteAttachment": {
+ "message": "Delete attachment"
+ },
+ "deleteAttachmentConfirmation": {
+ "message": "Are you sure you want to delete this attachment?"
+ },
+ "deletedAttachment": {
+ "message": "Deleted attachment"
+ },
+ "newAttachment": {
+ "message": "Add New Attachment"
+ },
+ "noAttachments": {
+ "message": "No attachments."
+ },
+ "attachmentSaved": {
+ "message": "The attachment has been saved."
+ },
+ "file": {
+ "message": "File"
+ },
+ "selectFile": {
+ "message": "Select a file."
+ },
+ "maxFileSize": {
+ "message": "Maximum file size is 500 MB."
+ },
+ "featureUnavailable": {
+ "message": "Feature Unavailable"
+ },
+ "updateKey": {
+ "message": "You cannot use this feature until you update your encryption key."
+ },
+ "premiumMembership": {
+ "message": "Premium Membership"
+ },
+ "premiumManage": {
+ "message": "Manage Membership"
+ },
+ "premiumManageAlert": {
+ "message": "You can manage your membership on the bitwarden.com web vault. Do you want to visit the website now?"
+ },
+ "premiumRefresh": {
+ "message": "Refresh Membership"
+ },
+ "premiumNotCurrentMember": {
+ "message": "You are not currently a premium member."
+ },
+ "premiumSignUpAndGet": {
+ "message": "Sign up for a premium membership and get:"
+ },
+ "ppremiumSignUpStorage": {
+ "message": "1 GB encrypted storage for file attachments."
+ },
+ "ppremiumSignUpTwoStep": {
+ "message": "Additional two-step login options such as YubiKey, FIDO U2F, and Duo."
+ },
+ "ppremiumSignUpReports": {
+ "message": "Password hygiene, account health, and data breach reports to keep your vault safe."
+ },
+ "ppremiumSignUpTotp": {
+ "message": "TOTP verification code (2FA) generator for logins in your vault."
+ },
+ "ppremiumSignUpSupport": {
+ "message": "Priority customer support."
+ },
+ "ppremiumSignUpFuture": {
+ "message": "All future premium features. More coming soon!"
+ },
+ "premiumPurchase": {
+ "message": "Purchase Premium"
+ },
+ "premiumPurchaseAlert": {
+ "message": "You can purchase premium membership on the bitwarden.com web vault. Do you want to visit the website now?"
+ },
+ "premiumCurrentMember": {
+ "message": "You are a premium member!"
+ },
+ "premiumCurrentMemberThanks": {
+ "message": "Thank you for supporting Bitwarden."
+ },
+ "premiumPrice": {
+ "message": "All for just $PRICE$ /year!",
+ "placeholders": {
+ "price": {
+ "content": "$1",
+ "example": "$10"
+ }
+ }
+ },
+ "refreshComplete": {
+ "message": "Refresh complete"
+ },
+ "disableAutoTotpCopy": {
+ "message": "Disable Automatic TOTP Copy"
+ },
+ "disableAutoTotpCopyDesc": {
+ "message": "If your login has an authenticator key attached to it, the TOTP verification code is automatically copied to your clipboard whenever you auto-fill the login."
+ },
+ "disableAutoBiometricsPrompt": {
+ "message": "Do not prompt for biometrics on launch"
+ },
+ "premiumRequired": {
+ "message": "Premium Required"
+ },
+ "premiumRequiredDesc": {
+ "message": "A premium membership is required to use this feature."
+ },
+ "enterVerificationCodeApp": {
+ "message": "Enter the 6 digit verification code from your authenticator app."
+ },
+ "enterVerificationCodeEmail": {
+ "message": "Enter the 6 digit verification code that was emailed to $EMAIL$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "example@gmail.com"
+ }
+ }
+ },
+ "verificationCodeEmailSent": {
+ "message": "Verification email sent to $EMAIL$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "example@gmail.com"
+ }
+ }
+ },
+ "rememberMe": {
+ "message": "Remember me"
+ },
+ "sendVerificationCodeEmailAgain": {
+ "message": "Send verification code email again"
+ },
+ "useAnotherTwoStepMethod": {
+ "message": "Use another two-step login method"
+ },
+ "insertYubiKey": {
+ "message": "Insert your YubiKey into your computer's USB port, then touch its button."
+ },
+ "insertU2f": {
+ "message": "Insert your security key into your computer's USB port. If it has a button, touch it."
+ },
+ "webAuthnNewTab": {
+ "message": "To start the WebAuthn 2FA verification. Click the button below to open a new tab and follow the instructions provided in the new tab."
+ },
+ "webAuthnNewTabOpen": {
+ "message": "Open new tab"
+ },
+ "webAuthnAuthenticate": {
+ "message": "Authenticate WebAuthn"
+ },
+ "loginUnavailable": {
+ "message": "Login Unavailable"
+ },
+ "noTwoStepProviders": {
+ "message": "This account has two-step login enabled, however, none of the configured two-step providers are supported by this web browser."
+ },
+ "noTwoStepProviders2": {
+ "message": "Please use a supported web browser (such as Chrome) and/or add additional providers that are better supported across web browsers (such as an authenticator app)."
+ },
+ "twoStepOptions": {
+ "message": "Two-step Login Options"
+ },
+ "recoveryCodeDesc": {
+ "message": "Lost access to all of your two-factor providers? Use your recovery code to disable all two-factor providers from your account."
+ },
+ "recoveryCodeTitle": {
+ "message": "Recovery Code"
+ },
+ "authenticatorAppTitle": {
+ "message": "Authenticator App"
+ },
+ "authenticatorAppDesc": {
+ "message": "Use an authenticator app (such as Authy or Google Authenticator) to generate time-based verification codes.",
+ "description": "'Authy' and 'Google Authenticator' are product names and should not be translated."
+ },
+ "yubiKeyTitle": {
+ "message": "YubiKey OTP Security Key"
+ },
+ "yubiKeyDesc": {
+ "message": "Use a YubiKey to access your account. Works with YubiKey 4, 4 Nano, 4C, and NEO devices."
+ },
+ "duoDesc": {
+ "message": "Verify with Duo Security using the Duo Mobile app, SMS, phone call, or U2F security key.",
+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
+ },
+ "duoOrganizationDesc": {
+ "message": "Verify with Duo Security for your organization using the Duo Mobile app, SMS, phone call, or U2F security key.",
+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
+ },
+ "webAuthnTitle": {
+ "message": "FIDO2 WebAuthn"
+ },
+ "webAuthnDesc": {
+ "message": "Use any WebAuthn enabled security key to access your account."
+ },
+ "emailTitle": {
+ "message": "Email"
+ },
+ "emailDesc": {
+ "message": "Verification codes will be emailed to you."
+ },
+ "selfHostedEnvironment": {
+ "message": "Self-hosted Environment"
+ },
+ "selfHostedEnvironmentFooter": {
+ "message": "Specify the base URL of your on-premises hosted Bitwarden installation."
+ },
+ "customEnvironment": {
+ "message": "Custom Environment"
+ },
+ "customEnvironmentFooter": {
+ "message": "For advanced users. You can specify the base URL of each service independently."
+ },
+ "baseUrl": {
+ "message": "Server URL"
+ },
+ "apiUrl": {
+ "message": "API Server URL"
+ },
+ "webVaultUrl": {
+ "message": "Web Vault Server URL"
+ },
+ "identityUrl": {
+ "message": "Identity Server URL"
+ },
+ "notificationsUrl": {
+ "message": "Notifications Server URL"
+ },
+ "iconsUrl": {
+ "message": "Icons Server URL"
+ },
+ "environmentSaved": {
+ "message": "The environment URLs have been saved."
+ },
+ "enableAutoFillOnPageLoad": {
+ "message": "Enable Auto-fill on Page Load"
+ },
+ "enableAutoFillOnPageLoadDesc": {
+ "message": "If a login form is detected, automatically perform an auto-fill when the web page loads."
+ },
+ "experimentalFeature": {
+ "message": "This is currently an experimental feature. Use at your own risk."
+ },
+ "defaultAutoFillOnPageLoad": {
+ "message": "Default autofill setting for login items"
+ },
+ "defaultAutoFillOnPageLoadDesc": {
+ "message": "After enabling Auto-fill on Page Load, you can enable or disable the feature for individual login items. This is the default setting for login items that are not separately configured."
+ },
+ "itemAutoFillOnPageLoad": {
+ "message": "Auto-fill on Page Load (if enabled in Options)"
+ },
+ "autoFillOnPageLoadUseDefault": {
+ "message": "Use default setting"
+ },
+ "autoFillOnPageLoadYes": {
+ "message": "Auto-fill on page load"
+ },
+ "autoFillOnPageLoadNo": {
+ "message": "Do not auto-fill on page load"
+ },
+ "commandOpenPopup": {
+ "message": "Open vault popup"
+ },
+ "commandOpenSidebar": {
+ "message": "Open vault in sidebar"
+ },
+ "commandAutofillDesc": {
+ "message": "Auto-fill the last used login for the current website"
+ },
+ "commandGeneratePasswordDesc": {
+ "message": "Generate and copy a new random password to the clipboard"
+ },
+ "commandLockVaultDesc": {
+ "message": "Lock the vault"
+ },
+ "privateModeMessage": {
+ "message": "Unfortunately this window is not available in private mode for this browser."
+ },
+ "customFields": {
+ "message": "Custom Fields"
+ },
+ "copyValue": {
+ "message": "Copy Value"
+ },
+ "value": {
+ "message": "Value"
+ },
+ "newCustomField": {
+ "message": "New Custom Field"
+ },
+ "dragToSort": {
+ "message": "Drag to sort"
+ },
+ "cfTypeText": {
+ "message": "Text"
+ },
+ "cfTypeHidden": {
+ "message": "Hidden"
+ },
+ "cfTypeBoolean": {
+ "message": "Boolean"
+ },
+ "popup2faCloseMessage": {
+ "message": "Clicking outside the popup window to check your email for your verification code will cause this popup to close. Do you want to open this popup in a new window so that it does not close?"
+ },
+ "popupU2fCloseMessage": {
+ "message": "This browser cannot process U2F requests in this popup window. Do you want to open this popup in a new window so that you can log in using U2F?"
+ },
+ "disableFavicon": {
+ "message": "Disable Website Icons"
+ },
+ "disableFaviconDesc": {
+ "message": "Website Icons provide a recognizable image next to each login item in your vault."
+ },
+ "disableBadgeCounter": {
+ "message": "Disable Badge Counter"
+ },
+ "disableBadgeCounterDesc": {
+ "message": "Badge counter indicates how many logins you have for the current page in your vault."
+ },
+ "cardholderName": {
+ "message": "Cardholder Name"
+ },
+ "number": {
+ "message": "Number"
+ },
+ "brand": {
+ "message": "Brand"
+ },
+ "expirationMonth": {
+ "message": "Expiration Month"
+ },
+ "expirationYear": {
+ "message": "Expiration Year"
+ },
+ "expiration": {
+ "message": "Expiration"
+ },
+ "january": {
+ "message": "January"
+ },
+ "february": {
+ "message": "February"
+ },
+ "march": {
+ "message": "March"
+ },
+ "april": {
+ "message": "April"
+ },
+ "may": {
+ "message": "May"
+ },
+ "june": {
+ "message": "June"
+ },
+ "july": {
+ "message": "July"
+ },
+ "august": {
+ "message": "August"
+ },
+ "september": {
+ "message": "September"
+ },
+ "october": {
+ "message": "October"
+ },
+ "november": {
+ "message": "November"
+ },
+ "december": {
+ "message": "December"
+ },
+ "securityCode": {
+ "message": "Security Code"
+ },
+ "ex": {
+ "message": "ex."
+ },
+ "title": {
+ "message": "Title"
+ },
+ "mr": {
+ "message": "Mr"
+ },
+ "mrs": {
+ "message": "Mrs"
+ },
+ "ms": {
+ "message": "Ms"
+ },
+ "dr": {
+ "message": "Dr"
+ },
+ "firstName": {
+ "message": "First Name"
+ },
+ "middleName": {
+ "message": "Middle Name"
+ },
+ "lastName": {
+ "message": "Last Name"
+ },
+ "identityName": {
+ "message": "Identity Name"
+ },
+ "company": {
+ "message": "Company"
+ },
+ "ssn": {
+ "message": "Social Security Number"
+ },
+ "passportNumber": {
+ "message": "Passport Number"
+ },
+ "licenseNumber": {
+ "message": "License Number"
+ },
+ "email": {
+ "message": "Email"
+ },
+ "phone": {
+ "message": "Phone"
+ },
+ "address": {
+ "message": "Address"
+ },
+ "address1": {
+ "message": "Address 1"
+ },
+ "address2": {
+ "message": "Address 2"
+ },
+ "address3": {
+ "message": "Address 3"
+ },
+ "cityTown": {
+ "message": "City / Town"
+ },
+ "stateProvince": {
+ "message": "State / Province"
+ },
+ "zipPostalCode": {
+ "message": "Zip / Postal Code"
+ },
+ "country": {
+ "message": "Country"
+ },
+ "type": {
+ "message": "Type"
+ },
+ "typeLogin": {
+ "message": "Login"
+ },
+ "typeLogins": {
+ "message": "Logins"
+ },
+ "typeSecureNote": {
+ "message": "Secure Note"
+ },
+ "typeCard": {
+ "message": "Card"
+ },
+ "typeIdentity": {
+ "message": "Identity"
+ },
+ "passwordHistory": {
+ "message": "Password History"
+ },
+ "back": {
+ "message": "Back"
+ },
+ "collections": {
+ "message": "Collections"
+ },
+ "favorites": {
+ "message": "Favorites"
+ },
+ "popOutNewWindow": {
+ "message": "Pop out to a new window"
+ },
+ "refresh": {
+ "message": "Refresh"
+ },
+ "cards": {
+ "message": "Cards"
+ },
+ "identities": {
+ "message": "Identities"
+ },
+ "logins": {
+ "message": "Logins"
+ },
+ "secureNotes": {
+ "message": "Secure Notes"
+ },
+ "clear": {
+ "message": "Clear",
+ "description": "To clear something out. example: To clear browser history."
+ },
+ "checkPassword": {
+ "message": "Check if password has been exposed."
+ },
+ "passwordExposed": {
+ "message": "This password has been exposed $VALUE$ time(s) in data breaches. You should change it.",
+ "placeholders": {
+ "value": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "passwordSafe": {
+ "message": "This password was not found in any known data breaches. It should be safe to use."
+ },
+ "baseDomain": {
+ "message": "Base domain"
+ },
+ "host": {
+ "message": "Host",
+ "description": "A URL's host value. For example, the host of https://sub.domain.com:443 is 'sub.domain.com:443'."
+ },
+ "exact": {
+ "message": "Exact"
+ },
+ "startsWith": {
+ "message": "Starts with"
+ },
+ "regEx": {
+ "message": "Regular expression",
+ "description": "A programming term, also known as 'RegEx'."
+ },
+ "matchDetection": {
+ "message": "Match Detection",
+ "description": "URI match detection for auto-fill."
+ },
+ "defaultMatchDetection": {
+ "message": "Default match detection",
+ "description": "Default URI match detection for auto-fill."
+ },
+ "toggleOptions": {
+ "message": "Toggle Options"
+ },
+ "toggleCurrentUris": {
+ "message": "Toggle Current URIs",
+ "description": "Toggle the display of the URIs of the currently open tabs in the browser."
+ },
+ "currentUri": {
+ "message": "Current URI",
+ "description": "The URI of one of the current open tabs in the browser."
+ },
+ "organization": {
+ "message": "Organization",
+ "description": "An entity of multiple related people (ex. a team or business organization)."
+ },
+ "types": {
+ "message": "Types"
+ },
+ "allItems": {
+ "message": "All Items"
+ },
+ "noPasswordsInList": {
+ "message": "There are no passwords to list."
+ },
+ "remove": {
+ "message": "Remove"
+ },
+ "default": {
+ "message": "Default"
+ },
+ "dateUpdated": {
+ "message": "Updated",
+ "description": "ex. Date this item was updated"
+ },
+ "datePasswordUpdated": {
+ "message": "Password Updated",
+ "description": "ex. Date this password was updated"
+ },
+ "neverLockWarning": {
+ "message": "Are you sure you want to use the \"Never\" option? Setting your lock options to \"Never\" stores your vault's encryption key on your device. If you use this option you should ensure that you keep your device properly protected."
+ },
+ "noOrganizationsList": {
+ "message": "You do not belong to any organizations. Organizations allow you to securely share items with other users."
+ },
+ "noCollectionsInList": {
+ "message": "There are no collections to list."
+ },
+ "ownership": {
+ "message": "Ownership"
+ },
+ "whoOwnsThisItem": {
+ "message": "Who owns this item?"
+ },
+ "strong": {
+ "message": "Strong",
+ "description": "ex. A strong password. Scale: Weak -> Good -> Strong"
+ },
+ "good": {
+ "message": "Good",
+ "description": "ex. A good password. Scale: Weak -> Good -> Strong"
+ },
+ "weak": {
+ "message": "Weak",
+ "description": "ex. A weak password. Scale: Weak -> Good -> Strong"
+ },
+ "weakMasterPassword": {
+ "message": "Weak Master Password"
+ },
+ "weakMasterPasswordDesc": {
+ "message": "The master password you have chosen is weak. You should use a strong master password (or a passphrase) to properly protect your Bitwarden account. Are you sure you want to use this master password?"
+ },
+ "pin": {
+ "message": "PIN",
+ "description": "PIN code. Ex. The short code (often numeric) that you use to unlock a device."
+ },
+ "unlockWithPin": {
+ "message": "Unlock with PIN"
+ },
+ "setYourPinCode": {
+ "message": "Set your PIN code for unlocking Bitwarden. Your PIN settings will be reset if you ever fully log out of the application."
+ },
+ "pinRequired": {
+ "message": "PIN code is required."
+ },
+ "invalidPin": {
+ "message": "Invalid PIN code."
+ },
+ "verifyPin": {
+ "message": "Verify PIN"
+ },
+ "yourVaultIsLockedPinCode": {
+ "message": "Your vault is locked. Verify your PIN code to continue."
+ },
+ "unlockWithBiometrics": {
+ "message": "Unlock with biometrics"
+ },
+ "awaitDesktop": {
+ "message": "Awaiting confirmation from desktop"
+ },
+ "awaitDesktopDesc": {
+ "message": "Please confirm using biometrics in the Bitwarden Desktop application to enable biometrics for browser."
+ },
+ "lockWithMasterPassOnRestart": {
+ "message": "Lock with master password on browser restart"
+ },
+ "selectOneCollection": {
+ "message": "You must select at least one collection."
+ },
+ "cloneItem": {
+ "message": "Clone Item"
+ },
+ "clone": {
+ "message": "Clone"
+ },
+ "passwordGeneratorPolicyInEffect": {
+ "message": "One or more organization policies are affecting your generator settings."
+ },
+ "vaultTimeoutAction": {
+ "message": "Vault Timeout Action"
+ },
+ "lock": {
+ "message": "Lock",
+ "description": "Verb form: to make secure or inaccesible by"
+ },
+ "trash": {
+ "message": "Trash",
+ "description": "Noun: a special folder to hold deleted items"
+ },
+ "searchTrash": {
+ "message": "Search trash"
+ },
+ "permanentlyDeleteItem": {
+ "message": "Permanently Delete Item"
+ },
+ "permanentlyDeleteItemConfirmation": {
+ "message": "Are you sure you want to permanently delete this item?"
+ },
+ "permanentlyDeletedItem": {
+ "message": "Permanently Deleted item"
+ },
+ "restoreItem": {
+ "message": "Restore Item"
+ },
+ "restoreItemConfirmation": {
+ "message": "Are you sure you want to restore this item?"
+ },
+ "restoredItem": {
+ "message": "Restored Item"
+ },
+ "vaultTimeoutLogOutConfirmation": {
+ "message": "Logging out will remove all access to your vault and requires online authentication after the timeout period. Are you sure you want to use this setting?"
+ },
+ "vaultTimeoutLogOutConfirmationTitle": {
+ "message": "Timeout Action Confirmation"
+ },
+ "autoFillAndSave": {
+ "message": "Auto-fill and Save"
+ },
+ "autoFillSuccessAndSavedUri": {
+ "message": "Auto-filled Item and Saved URI"
+ },
+ "autoFillSuccess": {
+ "message": "Auto-filled Item"
+ },
+ "setMasterPassword": {
+ "message": "Set Master Password"
+ },
+ "masterPasswordPolicyInEffect": {
+ "message": "One or more organization policies require your master password to meet the following requirements:"
+ },
+ "policyInEffectMinComplexity": {
+ "message": "Minimum complexity score of $SCORE$",
+ "placeholders": {
+ "score": {
+ "content": "$1",
+ "example": "4"
+ }
+ }
+ },
+ "policyInEffectMinLength": {
+ "message": "Minimum length of $LENGTH$",
+ "placeholders": {
+ "length": {
+ "content": "$1",
+ "example": "14"
+ }
+ }
+ },
+ "policyInEffectUppercase": {
+ "message": "Contain one or more uppercase characters"
+ },
+ "policyInEffectLowercase": {
+ "message": "Contain one or more lowercase characters"
+ },
+ "policyInEffectNumbers": {
+ "message": "Contain one or more numbers"
+ },
+ "policyInEffectSpecial": {
+ "message": "Contain one or more of the following special characters $CHARS$",
+ "placeholders": {
+ "chars": {
+ "content": "$1",
+ "example": "!@#$%^&*"
+ }
+ }
+ },
+ "masterPasswordPolicyRequirementsNotMet": {
+ "message": "Your new master password does not meet the policy requirements."
+ },
+ "acceptPolicies": {
+ "message": "By checking this box you agree to the following:"
+ },
+ "acceptPoliciesError": {
+ "message": "Terms of Service and Privacy Policy have not been acknowledged."
+ },
+ "termsOfService": {
+ "message": "Terms of Service"
+ },
+ "privacyPolicy": {
+ "message": "Privacy Policy"
+ },
+ "hintEqualsPassword": {
+ "message": "Your password hint cannot be the same as your password."
+ },
+ "ok": {
+ "message": "Ok"
+ },
+ "desktopSyncVerificationTitle": {
+ "message": "Desktop sync verification"
+ },
+ "desktopIntegrationVerificationText": {
+ "message": "Please verify that the desktop application shows this fingerprint: "
+ },
+ "desktopIntegrationDisabledTitle": {
+ "message": "Browser integration is not enabled"
+ },
+ "desktopIntegrationDisabledDesc": {
+ "message": "Browser integration is not enabled in the Bitwarden Desktop application. Please enable it in the settings within the desktop application."
+ },
+ "startDesktopTitle": {
+ "message": "Start the Bitwarden Desktop application"
+ },
+ "startDesktopDesc": {
+ "message": "The Bitwarden Desktop application needs to be started before this function can be used."
+ },
+ "errorEnableBiometricTitle": {
+ "message": "Unable to enable biometrics"
+ },
+ "errorEnableBiometricDesc": {
+ "message": "Action was canceled by the desktop application"
+ },
+ "nativeMessagingInvalidEncryptionDesc": {
+ "message": "Desktop application invalidated the secure communication channel. Please retry this operation"
+ },
+ "nativeMessagingInvalidEncryptionTitle": {
+ "message": "Desktop communication interrupted"
+ },
+ "nativeMessagingWrongUserDesc": {
+ "message": "The desktop application is logged into a different account. Please ensure both applications are logged into the same account."
+ },
+ "nativeMessagingWrongUserTitle": {
+ "message": "Account missmatch"
+ },
+ "biometricsNotEnabledTitle": {
+ "message": "Biometrics not enabled"
+ },
+ "biometricsNotEnabledDesc": {
+ "message": "Browser biometrics requires desktop biometric to be enabled in the settings first."
+ },
+ "biometricsNotSupportedTitle": {
+ "message": "Biometrics not supported"
+ },
+ "biometricsNotSupportedDesc": {
+ "message": "Browser biometrics is not supported on this device."
+ },
+ "nativeMessaginPermissionErrorTitle": {
+ "message": "Permission not provided"
+ },
+ "nativeMessaginPermissionErrorDesc": {
+ "message": "Without permission to communicate with the Bitwarden Desktop Application we cannot provide biometrics in the browser extension. Please try again."
+ },
+ "nativeMessaginPermissionSidebarTitle": {
+ "message": "Permission request error"
+ },
+ "nativeMessaginPermissionSidebarDesc": {
+ "message": "This action cannot be done in the sidebar, please retry the action in the popup or popout."
+ },
+ "personalOwnershipSubmitError": {
+ "message": "Due to an Enterprise Policy, you are restricted from saving items to your personal vault. Change the Ownership option to an organization and choose from available Collections."
+ },
+ "personalOwnershipPolicyInEffect": {
+ "message": "An organization policy is affecting your ownership options."
+ },
+ "excludedDomains": {
+ "message": "Excluded Domains"
+ },
+ "excludedDomainsDesc": {
+ "message": "Bitwarden will not ask to save login details for these domains. You must refresh the page for changes to take effect."
+ },
+ "excludedDomainsInvalidDomain": {
+ "message": "$DOMAIN$ is not a valid domain",
+ "placeholders": {
+ "domain": {
+ "content": "$1",
+ "example": "googlecom"
+ }
+ }
+ },
+ "send": {
+ "message": "Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "searchSends": {
+ "message": "Search Sends",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "addSend": {
+ "message": "Add Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTypeText": {
+ "message": "Text"
+ },
+ "sendTypeFile": {
+ "message": "File"
+ },
+ "allSends": {
+ "message": "All Sends",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "maxAccessCountReached": {
+ "message": "Max access count reached"
+ },
+ "expired": {
+ "message": "Expired"
+ },
+ "pendingDeletion": {
+ "message": "Pending deletion"
+ },
+ "passwordProtected": {
+ "message": "Password protected"
+ },
+ "copySendLink": {
+ "message": "Copy Send link",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "removePassword": {
+ "message": "Remove Password"
+ },
+ "delete": {
+ "message": "Delete"
+ },
+ "removedPassword": {
+ "message": "Removed Password"
+ },
+ "deletedSend": {
+ "message": "Deleted Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendLink": {
+ "message": "Send link",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "disabled": {
+ "message": "Disabled"
+ },
+ "removePasswordConfirmation": {
+ "message": "Are you sure you want to remove the password?"
+ },
+ "deleteSend": {
+ "message": "Delete Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "deleteSendConfirmation": {
+ "message": "Are you sure you want to delete this Send?",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "editSend": {
+ "message": "Edit Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTypeHeader": {
+ "message": "What type of Send is this?",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendNameDesc": {
+ "message": "A friendly name to describe this Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendFileDesc": {
+ "message": "The file you want to send."
+ },
+ "deletionDate": {
+ "message": "Deletion Date"
+ },
+ "deletionDateDesc": {
+ "message": "The Send will be permanently deleted on the specified date and time.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "expirationDate": {
+ "message": "Expiration Date"
+ },
+ "expirationDateDesc": {
+ "message": "If set, access to this Send will expire on the specified date and time.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "oneDay": {
+ "message": "1 day"
+ },
+ "days": {
+ "message": "$DAYS$ days",
+ "placeholders": {
+ "days": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "custom": {
+ "message": "Custom"
+ },
+ "maximumAccessCount": {
+ "message": "Maximum Access Count"
+ },
+ "maximumAccessCountDesc": {
+ "message": "If set, users will no longer be able to access this Send once the maximum access count is reached.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendPasswordDesc": {
+ "message": "Optionally require a password for users to access this Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendNotesDesc": {
+ "message": "Private notes about this Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendDisableDesc": {
+ "message": "Disable this Send so that no one can access it.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendShareDesc": {
+ "message": "Copy this Send's link to clipboard upon save.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTextDesc": {
+ "message": "The text you want to send."
+ },
+ "sendHideText": {
+ "message": "Hide this Send's text by default.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "currentAccessCount": {
+ "message": "Current Access Count"
+ },
+ "createSend": {
+ "message": "Create New Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "newPassword": {
+ "message": "New Password"
+ },
+ "sendDisabled": {
+ "message": "Send Disabled",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendDisabledWarning": {
+ "message": "Due to an enterprise policy, you are only able to delete an existing Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "createdSend": {
+ "message": "Created Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "editedSend": {
+ "message": "Edited Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendLinuxChromiumFileWarning": {
+ "message": "In order to choose a file, open the extension in the sidebar (if possible) or pop out to a new window by clicking this banner."
+ },
+ "sendFirefoxFileWarning": {
+ "message": "In order to choose a file using Firefox, open the extension in the sidebar or pop out to a new window by clicking this banner."
+ },
+ "sendSafariFileWarning": {
+ "message": "In order to choose a file using Safari, pop out to a new window by clicking this banner."
+ },
+ "sendFileCalloutHeader": {
+ "message": "Before you start"
+ },
+ "sendFirefoxCustomDatePopoutMessage1": {
+ "message": "To use a calendar style date picker",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read '**To use a calendar style date picker ** click here to pop out your window.'"
+ },
+ "sendFirefoxCustomDatePopoutMessage2": {
+ "message": "click here",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker **click here** to pop out your window.'"
+ },
+ "sendFirefoxCustomDatePopoutMessage3": {
+ "message": "to pop out your window.",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker click here **to pop out your window.**'"
+ },
+ "expirationDateIsInvalid": {
+ "message": "The expiration date provided is not valid."
+ },
+ "deletionDateIsInvalid": {
+ "message": "The deletion date provided is not valid."
+ },
+ "expirationDateAndTimeRequired": {
+ "message": "An expiration date and time are required."
+ },
+ "deletionDateAndTimeRequired": {
+ "message": "A deletion date and time are required."
+ },
+ "dateParsingError": {
+ "message": "There was an error saving your deletion and expiration dates."
+ },
+ "hideEmail": {
+ "message": "Hide my email address from recipients."
+ },
+ "sendOptionsPolicyInEffect": {
+ "message": "One or more organization policies are affecting your Send options."
+ },
+ "passwordPrompt": {
+ "message": "Master password re-prompt"
+ },
+ "passwordConfirmation": {
+ "message": "Master password confirmation"
+ },
+ "passwordConfirmationDesc": {
+ "message": "This action is protected. To continue, please re-enter your master password to verify your identity."
+ },
+ "emailVerificationRequired": {
+ "message": "Email Verification Required"
+ },
+ "emailVerificationRequiredDesc": {
+ "message": "You must verify your email to use this feature. You can verify your email in the web vault."
+ },
+ "updatedMasterPassword": {
+ "message": "Updated Master Password"
+ },
+ "updateMasterPassword": {
+ "message": "Update Master Password"
+ },
+ "updateMasterPasswordWarning": {
+ "message": "Your Master Password was recently changed by an administrator in your organization. In order to access the vault, you must update it now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour."
+ },
+ "resetPasswordPolicyAutoEnroll": {
+ "message": "Automatic Enrollment"
+ },
+ "resetPasswordAutoEnrollInviteWarning": {
+ "message": "This organization has an enterprise policy that will automatically enroll you in password reset. Enrollment will allow organization administrators to change your master password."
+ },
+ "selectFolder": {
+ "message": "Select folder..."
+ },
+ "ssoCompleteRegistration": {
+ "message": "In order to complete logging in with SSO, please set a master password to access and protect your vault."
+ },
+ "hours": {
+ "message": "Hours"
+ },
+ "minutes": {
+ "message": "Minutes"
+ },
+ "vaultTimeoutPolicyInEffect": {
+ "message": "Your organization policies are affecting your vault timeout. Maximum allowed Vault Timeout is $HOURS$ hour(s) and $MINUTES$ minute(s)",
+ "placeholders": {
+ "hours": {
+ "content": "$1",
+ "example": "5"
+ },
+ "minutes": {
+ "content": "$2",
+ "example": "5"
+ }
+ }
+ },
+ "vaultTimeoutToLarge": {
+ "message": "Your vault timeout exceeds the restrictions set by your organization."
+ },
+ "vaultExportDisabled": {
+ "message": "Vault Export Disabled"
+ },
+ "personalVaultExportPolicyInEffect": {
+ "message": "One or more organization policies prevents you from exporting your personal vault."
+ },
+ "copyCustomFieldNameInvalidElement": {
+ "message": "Unable to identify a valid form element. Try inspecting the HTML instead."
+ },
+ "copyCustomFieldNameNotUnique": {
+ "message": "No unique identifier found."
+ }
+}
diff --git a/src/iOS.Safari/Resources/_locales/kn/messages.json b/src/iOS.Safari/Resources/_locales/kn/messages.json
new file mode 100644
index 000000000..7cfeb06b1
--- /dev/null
+++ b/src/iOS.Safari/Resources/_locales/kn/messages.json
@@ -0,0 +1,1817 @@
+{
+ "appName": {
+ "message": "ಬಿಟ್ವಾರ್ಡೆನ್"
+ },
+ "extName": {
+ "message": "ಬಿಟ್ವಾರ್ಡೆನ್ - ಉಚಿತ ಪಾಸ್ವರ್ಡ್ ನಿರ್ವಾಹಕ",
+ "description": "Extension name, MUST be less than 40 characters (Safari restriction)"
+ },
+ "extDesc": {
+ "message": "ನಿಮ್ಮ ಎಲ್ಲಾ ಸಾಧನಗಳಿಗೆ ಸುರಕ್ಷಿತ ಮತ್ತು ಉಚಿತ ಪಾಸ್ವರ್ಡ್ ನಿರ್ವಾಹಕ.",
+ "description": "Extension description"
+ },
+ "loginOrCreateNewAccount": {
+ "message": "ನಿಮ್ಮ ಸುರಕ್ಷಿತ ವಾಲ್ಟ್ ಅನ್ನು ಪ್ರವೇಶಿಸಲು ಲಾಗ್ ಇನ್ ಮಾಡಿ ಅಥವಾ ಹೊಸ ಖಾತೆಯನ್ನು ರಚಿಸಿ."
+ },
+ "createAccount": {
+ "message": "ಖಾತೆ ತೆರೆ"
+ },
+ "login": {
+ "message": "ಲಾಗಿನ್"
+ },
+ "enterpriseSingleSignOn": {
+ "message": "ಎಂಟರ್ಪ್ರೈಸ್ ಏಕ ಸೈನ್-ಆನ್"
+ },
+ "cancel": {
+ "message": "ರದ್ದು"
+ },
+ "close": {
+ "message": "ಮುಚ್ಚಿ"
+ },
+ "submit": {
+ "message": "ಒಪ್ಪಿಸು"
+ },
+ "emailAddress": {
+ "message": "ಇಮೇಲ್ ವಿಳಾಸ"
+ },
+ "masterPass": {
+ "message": "ಮಾಸ್ಟರ್ ಪಾಸ್ವರ್ಡ್"
+ },
+ "masterPassDesc": {
+ "message": "ನಿಮ್ಮ ವಾಲ್ಟ್ ಅನ್ನು ಪ್ರವೇಶಿಸಲು ನೀವು ಬಳಸುವ ಪಾಸ್ವರ್ಡ್ ಮಾಸ್ಟರ್ ಪಾಸ್ವರ್ಡ್ ಆಗಿದೆ. ನಿಮ್ಮ ಮಾಸ್ಟರ್ ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ನೀವು ಮರೆಯದಿರುವುದು ಬಹಳ ಮುಖ್ಯ. ನೀವು ಅದನ್ನು ಮರೆತ ಸಂದರ್ಭದಲ್ಲಿ ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ಮರುಪಡೆಯಲು ಯಾವುದೇ ಮಾರ್ಗವಿಲ್ಲ."
+ },
+ "masterPassHintDesc": {
+ "message": "ನಿಮ್ಮ ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ನೀವು ಮರೆತರೆ ಅದನ್ನು ನೆನಪಿಟ್ಟುಕೊಳ್ಳಲು ಮಾಸ್ಟರ್ ಪಾಸ್ವರ್ಡ್ ಸುಳಿವು ನಿಮಗೆ ಸಹಾಯ ಮಾಡುತ್ತದೆ."
+ },
+ "reTypeMasterPass": {
+ "message": "ಮಾಸ್ಟರ್ ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ಮರು-ಟೈಪ್ ಮಾಡಿ"
+ },
+ "masterPassHint": {
+ "message": "ಮಾಸ್ಟರ್ ಪಾಸ್ವರ್ಡ್ ಸುಳಿವು (ಐಚ್ಛಿಕ)"
+ },
+ "tab": {
+ "message": "ಟ್ಯಾಬ್"
+ },
+ "myVault": {
+ "message": "ನನ್ನ ವಾಲ್ಟ್"
+ },
+ "tools": {
+ "message": "ಉಪಕರಣ"
+ },
+ "settings": {
+ "message": "ಸೆಟ್ಟಿಂಗ್ಗಳು\n"
+ },
+ "currentTab": {
+ "message": "ಪ್ರಸ್ತುತ ಟ್ಯಾಬ್"
+ },
+ "copyPassword": {
+ "message": "ಪಾಸ್ವರ್ಡ್ ನಕಲಿಸಿ"
+ },
+ "copyNote": {
+ "message": "ಟಿಪ್ಪಣಿ ನಕಲಿಸಿ"
+ },
+ "copyUri": {
+ "message": "URI ಅನ್ನು ನಕಲಿಸಿ"
+ },
+ "copyUsername": {
+ "message": "ಬಳಕೆಹೆಸರು ನಕಲಿಸು"
+ },
+ "copyNumber": {
+ "message": "ನಕಲು ಸಂಖ್ಯೆ"
+ },
+ "copySecurityCode": {
+ "message": "ಭದ್ರತಾ ಕೋಡ್ ಅನ್ನು ನಕಲಿಸಿ"
+ },
+ "autoFill": {
+ "message": "ಸ್ವಯಂ ಭರ್ತಿ"
+ },
+ "generatePasswordCopied": {
+ "message": "ಪಾಸ್ವರ್ಡ್ ರಚಿಸಿ (ನಕಲಿಸಲಾಗಿದೆ)"
+ },
+ "copyElementIdentifier": {
+ "message": "Copy Custom Field Name"
+ },
+ "noMatchingLogins": {
+ "message": "ಹೊಂದಾಣಿಕೆಯ ಲಾಗಿನ್ಗಳು ಇಲ್ಲ."
+ },
+ "vaultLocked": {
+ "message": "ವಾಲ್ಟ್ ಲಾಕ್ ಆಗಿದೆ."
+ },
+ "vaultLoggedOut": {
+ "message": "ವಾಲ್ಟ್ ಲಾಗ್ ಔಟ್ ಆಗಿದೆ."
+ },
+ "autoFillInfo": {
+ "message": "ಪ್ರಸ್ತುತ ಬ್ರೌಸರ್ ಟ್ಯಾಬ್ಗಾಗಿ ಸ್ವಯಂ ಭರ್ತಿ ಮಾಡಲು ಯಾವುದೇ ಲಾಗಿನ್ಗಳು ಲಭ್ಯವಿಲ್ಲ."
+ },
+ "addLogin": {
+ "message": "ಲಾಗಿನ್ ಸೇರಿಸಿ"
+ },
+ "addItem": {
+ "message": "ಐಟಂ ಸೇರಿಸಿ"
+ },
+ "passwordHint": {
+ "message": "ಪಾಸ್ವರ್ಡ್ ಸುಳಿವು"
+ },
+ "enterEmailToGetHint": {
+ "message": "ವಿಸ್ತರಣೆಯನ್ನು ಪ್ರಾರಂಭಿಸಲು ಮೆನುವಿನಲ್ಲಿರುವ ಬಿಟ್ವಾರ್ಡೆನ್ ಐಕಾನ್ ಟ್ಯಾಪ್ ಮಾಡಿ."
+ },
+ "getMasterPasswordHint": {
+ "message": "ಮಾಸ್ಟರ್ ಪಾಸ್ವರ್ಡ್ ಸುಳಿವನ್ನು ಪಡೆಯಿರಿ"
+ },
+ "continue": {
+ "message": "ಮುಂದುವರಿಸಿ"
+ },
+ "verificationCode": {
+ "message": "ಪರಿಶೀಲನಾ ಕೋಡ್ಗಳು"
+ },
+ "account": {
+ "message": "ಖಾತೆ"
+ },
+ "changeMasterPassword": {
+ "message": "ಮಾಸ್ಟರ್ ಪಾಸ್ವರ್ಡ್ ಬದಲಾಯಿಸಿ"
+ },
+ "fingerprintPhrase": {
+ "message": "ಫಿಂಗರ್ಪ್ರಿಂಟ್ ಫ್ರೇಸ್",
+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
+ },
+ "yourAccountsFingerprint": {
+ "message": "ನಿಮ್ಮ ಖಾತೆಯ ಫಿಂಗರ್ಪ್ರಿಂಟ್ ನುಡಿಗಟ್ಟು",
+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
+ },
+ "twoStepLogin": {
+ "message": "ಎರಡು ಹಂತದ ಲಾಗಿನ್"
+ },
+ "logOut": {
+ "message": "ಲಾಗ್ ಔಟ್"
+ },
+ "about": {
+ "message": "ಬಗ್ಗೆ"
+ },
+ "version": {
+ "message": "ಆವೃತ್ತಿ"
+ },
+ "save": {
+ "message": "ಉಳಿಸಿ"
+ },
+ "move": {
+ "message": "ಸರಿಸಿ"
+ },
+ "addFolder": {
+ "message": "ಫೋಲ್ಡರ್ ಸೇರಿಸಿ"
+ },
+ "name": {
+ "message": "ಹೆಸರು"
+ },
+ "editFolder": {
+ "message": "ಫೋಲ್ಡರ್ ಸಂಪಾದಿಸಿ"
+ },
+ "deleteFolder": {
+ "message": "ಫೋಲ್ಡರ್ ಅಳಿಸಿ"
+ },
+ "folders": {
+ "message": "ಫೋಲ್ಡರ್ಗಳು"
+ },
+ "noFolders": {
+ "message": "ಪಟ್ಟಿ ಮಾಡಲು ಯಾವುದೇ ಫೋಲ್ಡರ್ಗಳಿಲ್ಲ."
+ },
+ "helpFeedback": {
+ "message": "ಸಹಾಯ ಪ್ರತಿಕ್ರಿಯೆ\n"
+ },
+ "sync": {
+ "message": "ಸಿಂಕ್"
+ },
+ "syncVaultNow": {
+ "message": "ವಾಲ್ಟ್ ಅನ್ನು ಈಗ ಸಿಂಕ್ ಮಾಡಿ"
+ },
+ "lastSync": {
+ "message": "ಕೊನೆಯ ಸಿಂಕ್"
+ },
+ "passGen": {
+ "message": "ಪಾಸ್ವರ್ಡ್ ಜನರೇಟರ್"
+ },
+ "generator": {
+ "message": "ಜನರೇಟರ್",
+ "description": "Short for 'Password Generator'."
+ },
+ "passGenInfo": {
+ "message": "ನಿಮ್ಮ ಲಾಗಿನ್ಗಳಿಗಾಗಿ ಬಲವಾದ, ಅನನ್ಯ ಪಾಸ್ವರ್ಡ್ಗಳನ್ನು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ರಚಿಸಿ."
+ },
+ "bitWebVault": {
+ "message": "ಬಿಟ್ವಾರ್ಡೆನ್ ವೆಬ್ ವಾಲ್ಟ್"
+ },
+ "importItems": {
+ "message": "ವಸ್ತುಗಳನ್ನು ಆಮದು ಮಾಡಿ"
+ },
+ "select": {
+ "message": "ಆಯ್ಕೆಮಾಡಿ"
+ },
+ "generatePassword": {
+ "message": "ಪಾಸ್ವರ್ಡ್ ರಚಿಸಿ"
+ },
+ "regeneratePassword": {
+ "message": "ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ಪುನರುತ್ಪಾದಿಸಿ"
+ },
+ "options": {
+ "message": "ಆಯ್ಕೆಗಳು"
+ },
+ "length": {
+ "message": "ಉದ್ದ"
+ },
+ "numWords": {
+ "message": "ಪದಗಳ ಸಂಖ್ಯೆ"
+ },
+ "wordSeparator": {
+ "message": "ಪದ ವಿಭಜಕ"
+ },
+ "capitalize": {
+ "message": "ದೊಡ್ಡಕ್ಷರ ಮಾಡಿ",
+ "description": "Make the first letter of a work uppercase."
+ },
+ "includeNumber": {
+ "message": "ಸಂಖ್ಯೆಯನ್ನು ಸೇರಿಸಿ"
+ },
+ "minNumbers": {
+ "message": "ಕನಿಷ್ಠ ಸಂಖ್ಯೆಗಳು"
+ },
+ "minSpecial": {
+ "message": "ಕನಿಷ್ಠ ವಿಶೇಷ"
+ },
+ "avoidAmbChar": {
+ "message": "ಅಸ್ಪಷ್ಟ ಅಕ್ಷರಗಳನ್ನು ತಪ್ಪಿಸಿ"
+ },
+ "searchVault": {
+ "message": "ವಾಲ್ಟ್ ಹುಡುಕಿ"
+ },
+ "edit": {
+ "message": "ಎಡಿಟ್"
+ },
+ "view": {
+ "message": "ವೀಕ್ಷಣೆ"
+ },
+ "noItemsInList": {
+ "message": "ಪಟ್ಟಿ ಮಾಡಲು ಯಾವುದೇ ಐಟಂಗಳಿಲ್ಲ."
+ },
+ "itemInformation": {
+ "message": "ಐಟಂ ಮಾಹಿತಿ"
+ },
+ "username": {
+ "message": "ಬಳಕೆದಾರ ಹೆಸರು"
+ },
+ "password": {
+ "message": "ಪಾಸ್ವರ್ಡ್"
+ },
+ "passphrase": {
+ "message": "ಪಾಸ್ಫ್ರೇಸ್"
+ },
+ "favorite": {
+ "message": "ಮೆಚ್ಚಿನ"
+ },
+ "notes": {
+ "message": "ಟಿಪ್ಪಣಿಗಳು"
+ },
+ "note": {
+ "message": "ಟಿಪ್ಪಣಿ"
+ },
+ "editItem": {
+ "message": "ವಸ್ತುಗಳನ್ನು ಸಂಪಾದಿಸಿ"
+ },
+ "folder": {
+ "message": "ಫೋಲ್ಡರ್"
+ },
+ "deleteItem": {
+ "message": "ಐಟಂ ಅಳಿಸಿ"
+ },
+ "viewItem": {
+ "message": "ಐಟಂ ವೀಕ್ಷಿಸಿ"
+ },
+ "launch": {
+ "message": "ಶುರು"
+ },
+ "website": {
+ "message": "ಜಾಲತಾಣ"
+ },
+ "toggleVisibility": {
+ "message": "ಗೋಚರತೆಯನ್ನು ಟಾಗಲ್ ಮಾಡಿ"
+ },
+ "manage": {
+ "message": "ವ್ಯವಸ್ಥಾಪಕ"
+ },
+ "other": {
+ "message": "ಇತರೆ"
+ },
+ "rateExtension": {
+ "message": "ವಿಸ್ತರಣೆಯನ್ನು ರೇಟ್ ಮಾಡಿ"
+ },
+ "rateExtensionDesc": {
+ "message": "ಉತ್ತಮ ವಿಮರ್ಶೆಯೊಂದಿಗೆ ನಮಗೆ ಸಹಾಯ ಮಾಡಲು ದಯವಿಟ್ಟು ಪರಿಗಣಿಸಿ!"
+ },
+ "browserNotSupportClipboard": {
+ "message": "ನಿಮ್ಮ ವೆಬ್ ಬ್ರೌಸರ್ ಸುಲಭವಾದ ಕ್ಲಿಪ್ಬೋರ್ಡ್ ನಕಲು ಮಾಡುವುದನ್ನು ಬೆಂಬಲಿಸುವುದಿಲ್ಲ. ಬದಲಿಗೆ ಅದನ್ನು ಹಸ್ತಚಾಲಿತವಾಗಿ ನಕಲಿಸಿ."
+ },
+ "verifyMasterPassword": {
+ "message": "ಮಾಸ್ಟರ್ ಪಾಸ್ವರ್ಡ್ ಪರಿಶೀಲಿಸಿ"
+ },
+ "yourVaultIsLocked": {
+ "message": "ನಿಮ್ಮ ವಾಲ್ಟ್ ಲಾಕ್ ಆಗಿದೆ. ಮುಂದುವರೆಯಲು ನಿಮ್ಮ ಮಾಸ್ಟರ್ ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ಪರಿಶೀಲಿಸಿ."
+ },
+ "unlock": {
+ "message": "ಅನ್ಲಾಕ್ ಮಾಡಿ"
+ },
+ "loggedInAsOn": {
+ "message": "$HOSTNAME$ನಲ್ಲಿ $EMAIL$ಆಗಿ ಲಾಗ್ ಇನ್ ಮಾಡಲಾಗಿದೆ.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "name@example.com"
+ },
+ "hostname": {
+ "content": "$2",
+ "example": "bitwarden.com"
+ }
+ }
+ },
+ "invalidMasterPassword": {
+ "message": "ಅಮಾನ್ಯ ಮಾಸ್ಟರ್ ಪಾಸ್ವರ್ಡ್"
+ },
+ "vaultTimeout": {
+ "message": "ವಾಲ್ಟ್ ಕಾಲಾವಧಿ"
+ },
+ "lockNow": {
+ "message": "ಈಗ ಲಾಕ್ ಮಾಡಿ"
+ },
+ "immediately": {
+ "message": "ತಕ್ಷಣ"
+ },
+ "tenSeconds": {
+ "message": "೧೦ ಕ್ಷಣ"
+ },
+ "twentySeconds": {
+ "message": "೨0 ಸೆಕೆಂಡುಗಳು"
+ },
+ "thirtySeconds": {
+ "message": "೩೦ ಕ್ಷಣ"
+ },
+ "oneMinute": {
+ "message": "೧ ನಿಮಿಷ"
+ },
+ "twoMinutes": {
+ "message": "೨ ನಿಮಿಷಗಳು"
+ },
+ "fiveMinutes": {
+ "message": "೫ ನಿಮಿಷಗಳು"
+ },
+ "fifteenMinutes": {
+ "message": "೧೫ ನಿಮಿಷಗಳು"
+ },
+ "thirtyMinutes": {
+ "message": "30 ನಿಮಿಷಗಳು"
+ },
+ "oneHour": {
+ "message": "೧ ಗಂಟೆ"
+ },
+ "fourHours": {
+ "message": "೪ ಗಂಟೆಗಳು"
+ },
+ "onLocked": {
+ "message": "ಸಿಸ್ಟಮ್ ಲಾಕ್ನಲ್ಲಿ"
+ },
+ "onRestart": {
+ "message": "ಬ್ರೌಸರ್ ಮರುಪ್ರಾರಂಭದಲ್ಲಿ"
+ },
+ "never": {
+ "message": "ಇಲ್ಲವೇ ಇಲ್ಲ"
+ },
+ "security": {
+ "message": "ಭದ್ರತೆ"
+ },
+ "errorOccurred": {
+ "message": "ದೋಷ ಸಂಭವಿಸಿದೆ"
+ },
+ "emailRequired": {
+ "message": "ಇಮೇಲ್ ವಿಳಾಸದ ಅಗತ್ಯವಿದೆ."
+ },
+ "invalidEmail": {
+ "message": "ಅಮಾನ್ಯ ಇಮೇಲ್ ವಿಳಾಸ."
+ },
+ "masterPassRequired": {
+ "message": "ಮಾಸ್ಟರ್ ಪಾಸ್ವರ್ಡ್ ಅಗತ್ಯವಿದೆ."
+ },
+ "masterPassLength": {
+ "message": "ಮಾಸ್ಟರ್ ಪಾಸ್ವರ್ಡ್ ಕನಿಷ್ಠ 8 ಅಕ್ಷರಗಳಷ್ಟು ಉದ್ದವಾಗಿರಬೇಕು."
+ },
+ "masterPassDoesntMatch": {
+ "message": "ಮಾಸ್ಟರ್ ಪಾಸ್ವರ್ಡ್ ದೃಢೀಕರಣವು ಹೊಂದಿಕೆಯಾಗುವುದಿಲ್ಲ."
+ },
+ "newAccountCreated": {
+ "message": "ನಿಮ್ಮ ಹೊಸ ಖಾತೆಯನ್ನು ರಚಿಸಲಾಗಿದೆ! ನೀವು ಈಗ ಲಾಗ್ ಇನ್ ಮಾಡಬಹುದು."
+ },
+ "masterPassSent": {
+ "message": "ನಿಮ್ಮ ಮಾಸ್ಟರ್ ಪಾಸ್ವರ್ಡ್ ಸುಳಿವಿನೊಂದಿಗೆ ನಾವು ನಿಮಗೆ ಇಮೇಲ್ ಕಳುಹಿಸಿದ್ದೇವೆ."
+ },
+ "verificationCodeRequired": {
+ "message": "ಪರಿಶೀಲನೆ ಕೋಡ್ ಅಗತ್ಯವಿದೆ."
+ },
+ "valueCopied": {
+ "message": "$VALUE$ ನಕಲಿಸಲಾಗಿದೆ",
+ "description": "Value has been copied to the clipboard.",
+ "placeholders": {
+ "value": {
+ "content": "$1",
+ "example": "Password"
+ }
+ }
+ },
+ "autofillError": {
+ "message": "ಈ ಪುಟದಲ್ಲಿ ಆಯ್ದ ಐಟಂ ಅನ್ನು ಸ್ವಯಂ ಭರ್ತಿ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ. ಬದಲಿಗೆ ಮಾಹಿತಿಯನ್ನು ನಕಲಿಸಿ ಮತ್ತು ಅಂಟಿಸಿ."
+ },
+ "loggedOut": {
+ "message": "ಲಾಗ್ ಔಟ್"
+ },
+ "loginExpired": {
+ "message": "ನಿಮ್ಮ ಲಾಗಿನ್ ಸೆಷನ್ ಅವಧಿ ಮೀರಿದೆ."
+ },
+ "logOutConfirmation": {
+ "message": "ಲಾಗ್ ಔಟ್ ಮಾಡಲು ನೀವು ಖಚಿತವಾಗಿ ಬಯಸುವಿರಾ?"
+ },
+ "yes": {
+ "message": "ಹೌದು"
+ },
+ "no": {
+ "message": "ಇಲ್ಲ"
+ },
+ "unexpectedError": {
+ "message": "ಅನಿರೀಕ್ಷಿತ ದೋಷ ಸಂಭವಿಸಿದೆ."
+ },
+ "nameRequired": {
+ "message": "ಹೆಸರೊಂದು ಅಗತ್ಯವಿದೆ."
+ },
+ "addedFolder": {
+ "message": "ಫೋಲ್ಡರ್ ಸೇರಿಸಿ"
+ },
+ "changeMasterPass": {
+ "message": "ಮಾಸ್ಟರ್ ಪಾಸ್ವರ್ಡ್ ಬದಲಾಯಿಸಿ"
+ },
+ "changeMasterPasswordConfirmation": {
+ "message": "ನಿಮ್ಮ ಮಾಸ್ಟರ್ ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ನೀವು bitwarden.com ವೆಬ್ ವಾಲ್ಟ್ನಲ್ಲಿ ಬದಲಾಯಿಸಬಹುದು. ನೀವು ಈಗ ವೆಬ್ಸೈಟ್ಗೆ ಭೇಟಿ ನೀಡಲು ಬಯಸುವಿರಾ?"
+ },
+ "twoStepLoginConfirmation": {
+ "message": "ಭದ್ರತಾ ಕೀ, ದೃಢೀಕರಣ ಅಪ್ಲಿಕೇಶನ್, ಎಸ್ಎಂಎಸ್, ಫೋನ್ ಕರೆ ಅಥವಾ ಇಮೇಲ್ನಂತಹ ಮತ್ತೊಂದು ಸಾಧನದೊಂದಿಗೆ ನಿಮ್ಮ ಲಾಗಿನ್ ಅನ್ನು ಪರಿಶೀಲಿಸುವ ಅಗತ್ಯವಿರುವ ಎರಡು ಹಂತದ ಲಾಗಿನ್ ನಿಮ್ಮ ಖಾತೆಯನ್ನು ಹೆಚ್ಚು ಸುರಕ್ಷಿತಗೊಳಿಸುತ್ತದೆ. ಬಿಟ್ವಾರ್ಡೆನ್.ಕಾಮ್ ವೆಬ್ ವಾಲ್ಟ್ನಲ್ಲಿ ಎರಡು-ಹಂತದ ಲಾಗಿನ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಬಹುದು. ನೀವು ಈಗ ವೆಬ್ಸೈಟ್ಗೆ ಭೇಟಿ ನೀಡಲು ಬಯಸುವಿರಾ?"
+ },
+ "editedFolder": {
+ "message": "ಫೋಲ್ಡರ್ ತಿದ್ದಲಾಗಿದೆ"
+ },
+ "deleteFolderConfirmation": {
+ "message": "ನೀವು ಈ ಕಡತಕೋಶವನ್ನು ಖಚಿತವಾಗಿಯೂ ಅಳಿಸಬಯಸುವಿರಾ?"
+ },
+ "deletedFolder": {
+ "message": "ಫೋಲ್ಡರ್ ಅಳಿಸಿ"
+ },
+ "gettingStartedTutorial": {
+ "message": "ಟ್ಯುಟೋರಿಯಲ್ ಪ್ರಾರಂಭಿಸುವುದು"
+ },
+ "gettingStartedTutorialVideo": {
+ "message": "ಬ್ರೌಸರ್ ವಿಸ್ತರಣೆಯಿಂದ ಹೆಚ್ಚಿನದನ್ನು ಪಡೆಯುವುದು ಹೇಗೆ ಎಂದು ತಿಳಿಯಲು ನಮ್ಮ ಪ್ರಾರಂಭಿಕ ಟ್ಯುಟೋರಿಯಲ್ ವೀಕ್ಷಿಸಿ."
+ },
+ "syncingComplete": {
+ "message": "ಒಡವಾಗುನಂಟು ಪೂರ್ಣಗೊಂಡಿದೆ"
+ },
+ "syncingFailed": {
+ "message": "ಸಿಂಕ್ ವಿಫಲಗೊಂಡಿದೆ"
+ },
+ "passwordCopied": {
+ "message": "ಪಾಸ್ವರ್ಡ್ ನಕಲಿಸಲಾಗಿದೆ"
+ },
+ "uri": {
+ "message": "URI"
+ },
+ "uriPosition": {
+ "message": "ಯುಆರ್ಐ $POSITION$",
+ "description": "A listing of URIs. Ex: URI 1, URI 2, URI 3, etc.",
+ "placeholders": {
+ "position": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "newUri": {
+ "message": "ಹೊಸ ಯುಆರ್ಐ"
+ },
+ "addedItem": {
+ "message": "ಐಟಂ ಸೇರಿಸಲಾಗಿದೆ"
+ },
+ "editedItem": {
+ "message": "ಐಟಂ ಸಂಪಾದಿಸಲಾಗಿದೆ"
+ },
+ "deleteItemConfirmation": {
+ "message": "ನೀವು ನಿಜವಾಗಿಯೂ ಅನುಪಯುಕ್ತಕ್ಕೆ ಕಳುಹಿಸಲು ಬಯಸುವಿರಾ?"
+ },
+ "deletedItem": {
+ "message": "ಐಟಂ ಅನ್ನು ಅನುಪಯುಕ್ತಕ್ಕೆ ಕಳುಹಿಸಲಾಗಿದೆ"
+ },
+ "overwritePassword": {
+ "message": "ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ಬದಲಿಸಿ"
+ },
+ "overwritePasswordConfirmation": {
+ "message": "ಪ್ರಸ್ತುತ ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ತಿದ್ದಿಬರೆಯಲು ನೀವು ಖಚಿತವಾಗಿ ಬಯಸುವಿರಾ?"
+ },
+ "searchFolder": {
+ "message": "ಫೋಲ್ಡರ್ ಹುಡುಕಿ"
+ },
+ "searchCollection": {
+ "message": "ಸಂಗ್ರಹಣೆ ಹುಡುಕಿ"
+ },
+ "searchType": {
+ "message": "ಹುಡುಕಾಟ ಪ್ರಕಾರ"
+ },
+ "noneFolder": {
+ "message": "ಫೋಲ್ಡರ್ ಇಲ್ಲ",
+ "description": "This is the folder for uncategorized items"
+ },
+ "disableAddLoginNotification": {
+ "message": "ಲಾಗಿನ್ ಅಧಿಸೂಚನೆಯನ್ನು ಸೇರಿಸಿ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ"
+ },
+ "addLoginNotificationDesc": {
+ "message": "\"ಲಾಗಿನ್ ಅಧಿಸೂಚನೆಯನ್ನು ಸೇರಿಸಿ\" ನೀವು ಮೊದಲ ಬಾರಿಗೆ ಪ್ರವೇಶಿಸಿದಾಗಲೆಲ್ಲಾ ಹೊಸ ಲಾಗಿನ್ಗಳನ್ನು ನಿಮ್ಮ ವಾಲ್ಟ್ಗೆ ಉಳಿಸಲು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಕೇಳುತ್ತದೆ."
+ },
+ "dontShowCardsCurrentTab": {
+ "message": "ಟ್ಯಾಬ್ ಪುಟದಲ್ಲಿ ಕಾರ್ಡ್ಗಳನ್ನು ತೋರಿಸಬೇಡಿ"
+ },
+ "dontShowCardsCurrentTabDesc": {
+ "message": "ಸ್ವಯಂ-ಭರ್ತಿ ಸುಲಭ ಪ್ರವೇಶಕ್ಕಾಗಿ ನಿಮ್ಮ ವಾಲ್ಟ್ನಿಂದ ಕಾರ್ಡ್ ವಸ್ತುಗಳನ್ನು 'ಪ್ರಸ್ತುತ ಟ್ಯಾಬ್' ಪುಟದಲ್ಲಿ ಪಟ್ಟಿ ಮಾಡಲಾಗಿದೆ."
+ },
+ "dontShowIdentitiesCurrentTab": {
+ "message": "ಟ್ಯಾಬ್ ಪುಟದಲ್ಲಿ ಗುರುತುಗಳನ್ನು ತೋರಿಸಬೇಡಿ"
+ },
+ "dontShowIdentitiesCurrentTabDesc": {
+ "message": "ಸ್ವಯಂ-ಭರ್ತಿ ಸುಲಭ ಪ್ರವೇಶಕ್ಕಾಗಿ ನಿಮ್ಮ ವಾಲ್ಟ್ನಿಂದ ಗುರುತಿನ ವಸ್ತುಗಳನ್ನು 'ಪ್ರಸ್ತುತ ಟ್ಯಾಬ್' ಪುಟದಲ್ಲಿ ಪಟ್ಟಿ ಮಾಡಲಾಗಿದೆ."
+ },
+ "clearClipboard": {
+ "message": "ಕ್ಲಿಪ್ಬೋರ್ಡ್ ತೆರವುಗೊಳಿಸಿ",
+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
+ },
+ "clearClipboardDesc": {
+ "message": "ನಿಮ್ಮ ಕ್ಲಿಪ್ಬೋರ್ಡ್ನಿಂದ ನಕಲಿಸಿದ ಮೌಲ್ಯಗಳನ್ನು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ತೆರವುಗೊಳಿಸಿ.",
+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
+ },
+ "notificationAddDesc": {
+ "message": "ನಿಮಗಾಗಿ ಈ ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ಬಿಟ್ವಾರ್ಡನ್ ನೆನಪಿಸಿಕೊಳ್ಳಬೇಕೇ?"
+ },
+ "notificationAddSave": {
+ "message": "ಹೌದು, ಈಗ ಉಳಿಸಿ"
+ },
+ "notificationNeverSave": {
+ "message": "ಈ ವೆಬ್ಸೈಟ್ಗೆ ಎಂದಿಗೂ ಇಲ್ಲ"
+ },
+ "disableChangedPasswordNotification": {
+ "message": "ಬದಲಾವಣೆ ಪಾಸ್ವರ್ಡ್ ಅಧಿಸೂಚನೆಯನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ"
+ },
+ "disableChangedPasswordNotificationDesc": {
+ "message": "\"ಬದಲಾಯಿಸಿದ ಪಾಸ್ವರ್ಡ್ ಅಧಿಸೂಚನೆ\" ಸ್ವಯಂಚಾಲಿತವಾಗಿ ನಿಮ್ಮ ಉತ್ತೇಜಿಸುವ ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ನೀವು ವೆಬ್ಸೈಟ್ನಲ್ಲಿ ಬದಲಿಸಿದೆ ಎಂದು ಪತ್ತೆಹಚ್ಚಿದಾಗ ನಿಮ್ಮ ವಾಲ್ಟ್ನಲ್ಲಿ ಲಾಗಿನ್ ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ನವೀಕರಿಸಲು ನಿಮ್ಮನ್ನು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಅಪೇಕ್ಷಿಸುತ್ತದೆ."
+ },
+ "notificationChangeDesc": {
+ "message": "ಈ ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ಬಿಟ್ವರ್ಡ್ನಲ್ಲಿ ನವೀಕರಿಸಲು ನೀವು ಬಯಸುತ್ತೀರಾ?"
+ },
+ "notificationChangeSave": {
+ "message": "ಹೌದು, ಈಗ ನವೀಕರಿಸಿ"
+ },
+ "disableContextMenuItem": {
+ "message": "ಸನ್ನಿವೇಶ ಮೆನು ಆಯ್ಕೆಗಳನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ"
+ },
+ "disableContextMenuItemDesc": {
+ "message": "ಸನ್ನಿವೇಶ ಮೆನು ಆಯ್ಕೆಗಳು ನಿಮ್ಮ ಪ್ರಸ್ತುತ ಟ್ಯಾಬ್ನಲ್ಲಿ ವೆಬ್ಸೈಟ್ಗೆ ಪಾಸ್ವರ್ಡ್ ಪೀಳಿಗೆಯ ಮತ್ತು ಲಾಗಿನ್ಗಳಿಗೆ ತ್ವರಿತ ಪ್ರವೇಶವನ್ನು ಒದಗಿಸುತ್ತದೆ."
+ },
+ "defaultUriMatchDetection": {
+ "message": "ಡೀಫಾಲ್ಟ್ ಯುಆರ್ಐ ಹೊಂದಾಣಿಕೆ ಪತ್ತೆ",
+ "description": "Default URI match detection for auto-fill."
+ },
+ "defaultUriMatchDetectionDesc": {
+ "message": "ಸ್ವಯಂ ಭರ್ತಿಯಂತಹ ಕ್ರಿಯೆಗಳನ್ನು ನಿರ್ವಹಿಸುವಾಗ ಲಾಗಿನ್ಗಳಿಗಾಗಿ URI ಹೊಂದಾಣಿಕೆ ಪತ್ತೆಹಚ್ಚುವಿಕೆಯನ್ನು ನಿರ್ವಹಿಸುವ ಪೂರ್ವನಿಯೋಜಿತ ಮಾರ್ಗವನ್ನು ಆರಿಸಿ."
+ },
+ "theme": {
+ "message": "ಥೀಮ್ಸ್"
+ },
+ "themeDesc": {
+ "message": "ಅಪ್ಲಿಕೇಶನ್ನ ಬಣ್ಣ ಥೀಮ್ ಅನ್ನು ಬದಲಾಯಿಸಿ."
+ },
+ "dark": {
+ "message": "ಡಾರ್ಕ್",
+ "description": "Dark color"
+ },
+ "light": {
+ "message": "ಬೆಳಕು",
+ "description": "Light color"
+ },
+ "solarizedDark": {
+ "message": "ಡಾರ್ಕ್ ಸೌರ",
+ "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated."
+ },
+ "exportVault": {
+ "message": "ರಫ್ತು ವಾಲ್ಟ್"
+ },
+ "fileFormat": {
+ "message": "ಕಡತದ ಮಾದರಿ"
+ },
+ "warning": {
+ "message": "ಎಚ್ಚರಿಕೆ",
+ "description": "WARNING (should stay in capitalized letters if the language permits)"
+ },
+ "confirmVaultExport": {
+ "message": "ವಾಲ್ಟ್ ರಫ್ತು ಖಚಿತಪಡಿಸಿ"
+ },
+ "exportWarningDesc": {
+ "message": "ಈ ರಫ್ತು ನಿಮ್ಮ ವಾಲ್ಟ್ ಡೇಟಾವನ್ನು ಎನ್ಕ್ರಿಪ್ಟ್ ಮಾಡದ ಸ್ವರೂಪದಲ್ಲಿ ಒಳಗೊಂಡಿದೆ. ನೀವು ರಫ್ತು ಮಾಡಿದ ಫೈಲ್ ಅನ್ನು ಅಸುರಕ್ಷಿತ ಚಾನಲ್ಗಳಲ್ಲಿ (ಇಮೇಲ್ ನಂತಹ) ಸಂಗ್ರಹಿಸಬಾರದು ಅಥವಾ ಕಳುಹಿಸಬಾರದು. ನೀವು ಅದನ್ನು ಬಳಸಿದ ನಂತರ ಅದನ್ನು ಅಳಿಸಿ."
+ },
+ "encExportKeyWarningDesc": {
+ "message": "ಈ ರಫ್ತು ನಿಮ್ಮ ಖಾತೆಯ ಎನ್ಕ್ರಿಪ್ಶನ್ ಕೀಲಿಯನ್ನು ಬಳಸಿಕೊಂಡು ನಿಮ್ಮ ಡೇಟಾವನ್ನು ಎನ್ಕ್ರಿಪ್ಟ್ ಮಾಡುತ್ತದೆ. ನಿಮ್ಮ ಖಾತೆಯ ಎನ್ಕ್ರಿಪ್ಶನ್ ಕೀಲಿಯನ್ನು ನೀವು ಎಂದಾದರೂ ತಿರುಗಿಸಿದರೆ ನೀವು ಈ ರಫ್ತು ಫೈಲ್ ಅನ್ನು ಡೀಕ್ರಿಪ್ಟ್ ಮಾಡಲು ಸಾಧ್ಯವಾಗದ ಕಾರಣ ನೀವು ಮತ್ತೆ ರಫ್ತು ಮಾಡಬೇಕು."
+ },
+ "encExportAccountWarningDesc": {
+ "message": "ಖಾತೆ ಎನ್ಕ್ರಿಪ್ಶನ್ ಕೀಗಳು ಪ್ರತಿ ಬಿಟ್ವಾರ್ಡೆನ್ ಬಳಕೆದಾರ ಖಾತೆಗೆ ಅನನ್ಯವಾಗಿವೆ, ಆದ್ದರಿಂದ ನೀವು ಎನ್ಕ್ರಿಪ್ಟ್ ಮಾಡಿದ ರಫ್ತು ಬೇರೆ ಖಾತೆಗೆ ಆಮದು ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ."
+ },
+ "exportMasterPassword": {
+ "message": "ನಿಮ್ಮ ವಾಲ್ಟ್ ಡೇಟಾವನ್ನು ರಫ್ತು ಮಾಡಲು ನಿಮ್ಮ ಮಾಸ್ಟರ್ ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ನಮೂದಿಸಿ."
+ },
+ "shared": {
+ "message": "ಹಂಚಿಕೊಳ್ಳಲಾಗಿದೆ"
+ },
+ "learnOrg": {
+ "message": "ಸಂಘಟನೆಗಳ ಬಗ್ಗೆ ತಿಳಿಯಿರಿ"
+ },
+ "learnOrgConfirmation": {
+ "message": "ಸಂಸ್ಥೆಯೊಂದನ್ನು ಬಳಸಿಕೊಂಡು ನಿಮ್ಮ ಚಾವಣಿ ವಸ್ತುಗಳನ್ನು ಇತರರೊಂದಿಗೆ ಹಂಚಿಕೊಳ್ಳಲು ಬಿಟ್ವರ್ಡ್ಗಳು ನಿಮ್ಮನ್ನು ಅನುಮತಿಸುತ್ತದೆ. ನೀವು ಇನ್ನಷ್ಟು ತಿಳಿಯಲು Bitwarden.com ವೆಬ್ಸೈಟ್ಗೆ ಭೇಟಿ ನೀಡಲು ಬಯಸುವಿರಾ?"
+ },
+ "moveToOrganization": {
+ "message": "ಸಂಸ್ಥೆಗೆ ಸರಿಸಿ"
+ },
+ "share": {
+ "message": "ಹಂಚಿಕೊಳ್ಳಿ"
+ },
+ "movedItemToOrg": {
+ "message": "$ITEMNAME$ ಅನ್ನು $ORGNAME$ ಗೆ ಸರಿಸಲಾಗಿದೆ",
+ "placeholders": {
+ "itemname": {
+ "content": "$1",
+ "example": "Secret Item"
+ },
+ "orgname": {
+ "content": "$2",
+ "example": "Company Name"
+ }
+ }
+ },
+ "moveToOrgDesc": {
+ "message": "ಈ ಐಟಂ ಅನ್ನು ಸರಿಸಲು ನೀವು ಬಯಸುವ ಸಂಸ್ಥೆಯನ್ನು ಆರಿಸಿ. ಸಂಸ್ಥೆಗೆ ಹೋಗುವುದರಿಂದ ವಸ್ತುವಿನ ಮಾಲೀಕತ್ವವನ್ನು ಆ ಸಂಸ್ಥೆಗೆ ವರ್ಗಾಯಿಸುತ್ತದೆ. ಈ ಐಟಂ ಅನ್ನು ಸರಿಸಿದ ನಂತರ ನೀವು ಇನ್ನು ಮುಂದೆ ಅದರ ನೇರ ಮಾಲೀಕರಾಗಿರುವುದಿಲ್ಲ."
+ },
+ "learnMore": {
+ "message": "ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ"
+ },
+ "authenticatorKeyTotp": {
+ "message": "ದೃಢೀಕರಣ ಕೀ (TOTP)"
+ },
+ "verificationCodeTotp": {
+ "message": "ಪರಿಶೀಲನಾ ಕೋಡ್ಗಳು"
+ },
+ "copyVerificationCode": {
+ "message": "ಪರಿಶೀಲನೆ ಕೋಡ್ ನಕಲಿಸಿ"
+ },
+ "attachments": {
+ "message": "ಲಗತ್ತುಗಳು"
+ },
+ "deleteAttachment": {
+ "message": "ಲಗತ್ತನ್ನು ಅಳಿಸಿ"
+ },
+ "deleteAttachmentConfirmation": {
+ "message": "ಈ ಲಗತ್ತನ್ನು ಅಳಿಸಲು ನೀವು ಖಚಿತವಾಗಿ ಬಯಸುವಿರಾ?"
+ },
+ "deletedAttachment": {
+ "message": "ಲಗತ್ತು ಅಳಿಸಲಾಗಿದೆ"
+ },
+ "newAttachment": {
+ "message": "ಹೊಸ ಲಗತ್ತನ್ನು ಸೇರಿಸಿ"
+ },
+ "noAttachments": {
+ "message": "ಲಗತ್ತುಗಳಿಲ್ಲ."
+ },
+ "attachmentSaved": {
+ "message": "ಲಗತ್ತನ್ನು ಉಳಿಸಲಾಗಿದೆ."
+ },
+ "file": {
+ "message": "ಫೈಲ್"
+ },
+ "selectFile": {
+ "message": "ಕಡತವನ್ನು ಆಯ್ಕೆಮಾಡು."
+ },
+ "maxFileSize": {
+ "message": "ಗರಿಷ್ಠ ಫೈಲ್ ಗಾತ್ರ 500 ಎಂಬಿ."
+ },
+ "featureUnavailable": {
+ "message": "ವೈಶಿಷ್ಟ್ಯ ಲಭ್ಯವಿಲ್ಲ"
+ },
+ "updateKey": {
+ "message": "ನಿಮ್ಮ ಎನ್ಕ್ರಿಪ್ಶನ್ ಕೀಲಿಯನ್ನು ನವೀಕರಿಸುವವರೆಗೆ ನೀವು ಈ ವೈಶಿಷ್ಟ್ಯವನ್ನು ಬಳಸಲಾಗುವುದಿಲ್ಲ."
+ },
+ "premiumMembership": {
+ "message": "ಪ್ರೀಮಿಯಂ ಸದಸ್ಯತ್ವ"
+ },
+ "premiumManage": {
+ "message": "ಸದಸ್ಯತ್ವವನ್ನು ನಿರ್ವಹಿಸಿ"
+ },
+ "premiumManageAlert": {
+ "message": "ನಿಮ್ಮ ಸದಸ್ಯತ್ವವನ್ನು ನೀವು bitwarden.com ವೆಬ್ ವಾಲ್ಟ್ನಲ್ಲಿ ನಿರ್ವಹಿಸಬಹುದು. ನೀವು ಈಗ ವೆಬ್ಸೈಟ್ಗೆ ಭೇಟಿ ನೀಡಲು ಬಯಸುವಿರಾ?"
+ },
+ "premiumRefresh": {
+ "message": "ಸದಸ್ಯತ್ವವನ್ನು ರಿಫ್ರೆಶ್ ಮಾಡಿ"
+ },
+ "premiumNotCurrentMember": {
+ "message": "ನೀವು ಪ್ರಸ್ತುತ ಪ್ರೀಮಿಯಂ ಸದಸ್ಯರಲ್ಲ."
+ },
+ "premiumSignUpAndGet": {
+ "message": "ಪ್ರೀಮಿಯಂ ಸದಸ್ಯತ್ವಕ್ಕಾಗಿ ಸೈನ್ ಅಪ್ ಮಾಡಿ ಮತ್ತು ಪಡೆಯಿರಿ:"
+ },
+ "ppremiumSignUpStorage": {
+ "message": "ಫೈಲ್ ಲಗತ್ತುಗಳಿಗಾಗಿ 1 ಜಿಬಿ ಎನ್ಕ್ರಿಪ್ಟ್ ಮಾಡಿದ ಸಂಗ್ರಹ."
+ },
+ "ppremiumSignUpTwoStep": {
+ "message": "ಹೆಚ್ಚುವರಿ ಎರಡು-ಹಂತದ ಲಾಗಿನ್ ಆಯ್ಕೆಗಳಾದ ಯೂಬಿಕೆ, ಎಫ್ಐಡಿಒ ಯು 2 ಎಫ್, ಮತ್ತು ಡ್ಯುವೋ."
+ },
+ "ppremiumSignUpReports": {
+ "message": "ನಿಮ್ಮ ವಾಲ್ಟ್ ಅನ್ನು ಸುರಕ್ಷಿತವಾಗಿರಿಸಲು ಪಾಸ್ವರ್ಡ್ ನೈರ್ಮಲ್ಯ, ಖಾತೆ ಆರೋಗ್ಯ ಮತ್ತು ಡೇಟಾ ಉಲ್ಲಂಘನೆ ವರದಿಗಳು."
+ },
+ "ppremiumSignUpTotp": {
+ "message": "ನಿಮ್ಮ ವಾಲ್ಟ್ನಲ್ಲಿನ ಲಾಗಿನ್ಗಳಿಗಾಗಿ TOTP ಪರಿಶೀಲನಾ ಕೋಡ್ (2FA) ಜನರೇಟರ್."
+ },
+ "ppremiumSignUpSupport": {
+ "message": "ಆದ್ಯತೆಯ ಗ್ರಾಹಕ ಬೆಂಬಲ."
+ },
+ "ppremiumSignUpFuture": {
+ "message": "ಎಲ್ಲಾ ಭವಿಷ್ಯದ ಪ್ರೀಮಿಯಂ ವೈಶಿಷ್ಟ್ಯಗಳು. ಹೆಚ್ಚು ಶೀಘ್ರದಲ್ಲೇ ಬರಲಿದೆ!"
+ },
+ "premiumPurchase": {
+ "message": "ಪ್ರೀಮಿಯಂ ಖರೀದಿಸಿ"
+ },
+ "premiumPurchaseAlert": {
+ "message": "ನೀವು ಬಿಟ್ವಾರ್ಡೆನ್.ಕಾಮ್ ವೆಬ್ ವಾಲ್ಟ್ನಲ್ಲಿ ಪ್ರೀಮಿಯಂ ಸದಸ್ಯತ್ವವನ್ನು ಖರೀದಿಸಬಹುದು. ನೀವು ಈಗ ವೆಬ್ಸೈಟ್ಗೆ ಭೇಟಿ ನೀಡಲು ಬಯಸುವಿರಾ?"
+ },
+ "premiumCurrentMember": {
+ "message": "ನೀವು ಪ್ರೀಮಿಯಂ ಸದಸ್ಯರಾಗಿದ್ದೀರಿ!"
+ },
+ "premiumCurrentMemberThanks": {
+ "message": "ಬಿಟ್ವಾರ್ಡೆನ್ ಅವರನ್ನು ಬೆಂಬಲಿಸಿದ್ದಕ್ಕಾಗಿ ಧನ್ಯವಾದಗಳು."
+ },
+ "premiumPrice": {
+ "message": "ಎಲ್ಲವೂ ಕೇವಲ $PRICE$ / ವರ್ಷಕ್ಕೆ!",
+ "placeholders": {
+ "price": {
+ "content": "$1",
+ "example": "$10"
+ }
+ }
+ },
+ "refreshComplete": {
+ "message": "ರಿಫ್ರೆಶ್ ಪೂರ್ಣಗೊಂಡಿದೆ"
+ },
+ "disableAutoTotpCopy": {
+ "message": "ಸ್ವಯಂಚಾಲಿತ TOTP ನಕಲನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ"
+ },
+ "disableAutoTotpCopyDesc": {
+ "message": "ನಿಮ್ಮ ಲಾಗಿನ್ಗೆ ದೃಢೀಕರಣ ಕೀಲಿಯನ್ನು ಲಗತ್ತಿಸಿದ್ದರೆ, ನೀವು ಲಾಗಿನ್ ಅನ್ನು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಭರ್ತಿ ಮಾಡಿದಾಗಲೆಲ್ಲಾ TOTP ಪರಿಶೀಲನಾ ಕೋಡ್ ನಿಮ್ಮ ಕ್ಲಿಪ್ಬೋರ್ಡ್ಗೆ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ನಕಲಿಸಲ್ಪಡುತ್ತದೆ."
+ },
+ "disableAutoBiometricsPrompt": {
+ "message": "Do not prompt for biometrics on launch"
+ },
+ "premiumRequired": {
+ "message": "ಪ್ರೀಮಿಯಂ ಅಗತ್ಯವಿದೆ"
+ },
+ "premiumRequiredDesc": {
+ "message": "ಈ ವೈಶಿಷ್ಟ್ಯವನ್ನು ಬಳಸಲು ಪ್ರೀಮಿಯಂ ಸದಸ್ಯತ್ವ ಅಗತ್ಯವಿದೆ."
+ },
+ "enterVerificationCodeApp": {
+ "message": "ನಿಮ್ಮ ದೃಢೀಕರಣ ಅಪ್ಲಿಕೇಶನ್ನಿಂದ 6 ಅಂಕಿಯ ಪರಿಶೀಲನಾ ಕೋಡ್ ಅನ್ನು ನಮೂದಿಸಿ."
+ },
+ "enterVerificationCodeEmail": {
+ "message": "$EMAIL$ಗೆ ಇಮೇಲ್ ಮಾಡಲಾದ 6 ಅಂಕಿಯ ಪರಿಶೀಲನಾ ಕೋಡ್ ಅನ್ನು ನಮೂದಿಸಿ.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "example@gmail.com"
+ }
+ }
+ },
+ "verificationCodeEmailSent": {
+ "message": "ಪರಿಶೀಲನೆ ಇಮೇಲ್ $EMAIL$ ಗೆ ಕಳುಹಿಸಲಾಗಿದೆ.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "example@gmail.com"
+ }
+ }
+ },
+ "rememberMe": {
+ "message": "ನನ್ನನ್ನು ನೆನಪಿನಲ್ಲಿ ಇಡು"
+ },
+ "sendVerificationCodeEmailAgain": {
+ "message": "ಪರಿಶೀಲನೆ ಕೋಡ್ ಇಮೇಲ್ ಅನ್ನು ಮತ್ತೆ ಕಳುಹಿಸಿ"
+ },
+ "useAnotherTwoStepMethod": {
+ "message": "ಮತ್ತೊಂದು ಎರಡು-ಹಂತದ ಲಾಗಿನ್ ವಿಧಾನವನ್ನು ಬಳಸಿ"
+ },
+ "insertYubiKey": {
+ "message": "ನಿಮ್ಮ ಯುಬಿಕಿಯನ್ನು ನಿಮ್ಮ ಕಂಪ್ಯೂಟರ್ನ ಯುಎಸ್ಬಿ ಪೋರ್ಟ್ಗೆ ಸೇರಿಸಿ, ನಂತರ ಅದರ ಗುಂಡಿಯನ್ನು ಸ್ಪರ್ಶಿಸಿ."
+ },
+ "insertU2f": {
+ "message": "ನಿಮ್ಮ ಕಂಪ್ಯೂಟರ್ನ ಯುಎಸ್ಬಿ ಪೋರ್ಟ್ಗೆ ನಿಮ್ಮ ಭದ್ರತಾ ಕೀಲಿಯನ್ನು ಸೇರಿಸಿ. ಅದು ಬಟನ್ ಹೊಂದಿದ್ದರೆ, ಅದನ್ನು ಸ್ಪರ್ಶಿಸಿ."
+ },
+ "webAuthnNewTab": {
+ "message": "WebAuthn 2FA ಪರಿಶೀಲನೆಯನ್ನು ಪ್ರಾರಂಭಿಸಲು. ಹೊಸ ಟ್ಯಾಬ್ ತೆರೆಯಲು ಕೆಳಗಿನ ಬಟನ್ ಕ್ಲಿಕ್ ಮಾಡಿ ಮತ್ತು ಹೊಸ ಟ್ಯಾಬ್ನಲ್ಲಿ ಒದಗಿಸಲಾದ ಸೂಚನೆಗಳನ್ನು ಅನುಸರಿಸಿ."
+ },
+ "webAuthnNewTabOpen": {
+ "message": "ಹೊಸ ಟ್ಯಾಬ್ ತೆರೆಯಿರಿ"
+ },
+ "webAuthnAuthenticate": {
+ "message": "WebAuthn ಅನ್ನು ಪ್ರಮಾಣಿಕರಿಸು"
+ },
+ "loginUnavailable": {
+ "message": "ಲಾಗಿನ್ ಲಭ್ಯವಿಲ್ಲ"
+ },
+ "noTwoStepProviders": {
+ "message": "ಈ ಖಾತೆಯು ಎರಡು-ಹಂತದ ಲಾಗಿನ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿದೆ, ಆದಾಗ್ಯೂ, ಕಾನ್ಫಿಗರ್ ಮಾಡಲಾದ ಎರಡು-ಹಂತದ ಪೂರೈಕೆದಾರರಲ್ಲಿ ಯಾರೂ ಈ ವೆಬ್ ಬ್ರೌಸರ್ನಿಂದ ಬೆಂಬಲಿತವಾಗಿಲ್ಲ."
+ },
+ "noTwoStepProviders2": {
+ "message": "ದಯವಿಟ್ಟು ಬೆಂಬಲಿತ ವೆಬ್ ಬ್ರೌಸರ್ ಅನ್ನು ಬಳಸಿ (Chrome ನಂತಹ) ಮತ್ತು / ಅಥವಾ ವೆಬ್ ಬ್ರೌಸರ್ಗಳಲ್ಲಿ (ದೃ hentic ೀಕರಣ ಅಪ್ಲಿಕೇಶನ್ನಂತಹ) ಉತ್ತಮವಾಗಿ ಬೆಂಬಲಿತವಾದ ಹೆಚ್ಚುವರಿ ಪೂರೈಕೆದಾರರನ್ನು ಸೇರಿಸಿ."
+ },
+ "twoStepOptions": {
+ "message": "ಎರಡು ಹಂತದ ಲಾಗಿನ್ ಆಯ್ಕೆಗಳು"
+ },
+ "recoveryCodeDesc": {
+ "message": "ನಿಮ್ಮ ಎಲ್ಲಾ ಎರಡು ಅಂಶ ಪೂರೈಕೆದಾರರಿಗೆ ಪ್ರವೇಶವನ್ನು ಕಳೆದುಕೊಂಡಿದ್ದೀರಾ? ನಿಮ್ಮ ಖಾತೆಯಿಂದ ಎಲ್ಲಾ ಎರಡು ಅಂಶ ಪೂರೈಕೆದಾರರನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲು ನಿಮ್ಮ ಮರುಪಡೆಯುವಿಕೆ ಕೋಡ್ ಬಳಸಿ."
+ },
+ "recoveryCodeTitle": {
+ "message": "ಮರುಪಡೆಯುವಿಕೆ ಕೋಡ್"
+ },
+ "authenticatorAppTitle": {
+ "message": "ದೃಢೀಕರಣ ಅಪ್ಲಿಕೇಶನ್"
+ },
+ "authenticatorAppDesc": {
+ "message": "ಸಮಯ ಆಧಾರಿತ ಪರಿಶೀಲನಾ ಕೋಡ್ಗಳನ್ನು ರಚಿಸಲು ದೃಢೀಕರಣ ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ಬಳಸಿ (ಆಥಿ ಅಥವಾ ಗೂಗಲ್ ಅಥೆಂಟಿಕೇಟರ್).",
+ "description": "'Authy' and 'Google Authenticator' are product names and should not be translated."
+ },
+ "yubiKeyTitle": {
+ "message": "ಯುಬಿಕೆ ಒಟಿಪಿ ಭದ್ರತಾ ಕೀ"
+ },
+ "yubiKeyDesc": {
+ "message": "ನಿಮ್ಮ ಖಾತೆಯನ್ನು ಪ್ರವೇಶಿಸಲು ಯುಬಿಕೆ ಬಳಸಿ. ಯುಬಿಕೆ 4, 4 ನ್ಯಾನೋ, 4 ಸಿ ಮತ್ತು ಎನ್ಇಒ ಸಾಧನಗಳೊಂದಿಗೆ ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತದೆ."
+ },
+ "duoDesc": {
+ "message": "ಡ್ಯುಯೊ ಮೊಬೈಲ್ ಅಪ್ಲಿಕೇಶನ್, ಎಸ್ಎಂಎಸ್, ಫೋನ್ ಕರೆ ಅಥವಾ ಯು 2 ಎಫ್ ಭದ್ರತಾ ಕೀಲಿಯನ್ನು ಬಳಸಿಕೊಂಡು ಡ್ಯುಯೊ ಸೆಕ್ಯುರಿಟಿಯೊಂದಿಗೆ ಪರಿಶೀಲಿಸಿ.",
+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
+ },
+ "duoOrganizationDesc": {
+ "message": "ಡ್ಯುಯೊ ಮೊಬೈಲ್ ಅಪ್ಲಿಕೇಶನ್, ಎಸ್ಎಂಎಸ್, ಫೋನ್ ಕರೆ ಅಥವಾ ಯು 2 ಎಫ್ ಭದ್ರತಾ ಕೀಲಿಯನ್ನು ಬಳಸಿಕೊಂಡು ನಿಮ್ಮ ಸಂಸ್ಥೆಗಾಗಿ ಡ್ಯುಯೊ ಸೆಕ್ಯುರಿಟಿಯೊಂದಿಗೆ ಪರಿಶೀಲಿಸಿ.",
+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
+ },
+ "webAuthnTitle": {
+ "message": "FIDO2 WebAuthn"
+ },
+ "webAuthnDesc": {
+ "message": "ನಿಮ್ಮ ಖಾತೆಯನ್ನು ಪ್ರವೇಶಿಸಲು ಯಾವುದೇ ವೆಬ್ಆಥ್ನ್ ಸಕ್ರಿಯಗೊಳಿಸಿದ ಭದ್ರತಾ ಕೀಲಿಯನ್ನು ಬಳಸಿ."
+ },
+ "emailTitle": {
+ "message": "ಇಮೇಲ್"
+ },
+ "emailDesc": {
+ "message": "ಪರಿಶೀಲನೆ ಕೋಡ್ಗಳನ್ನು ನಿಮಗೆ ಇಮೇಲ್ ಮಾಡಲಾಗುತ್ತದೆ."
+ },
+ "selfHostedEnvironment": {
+ "message": "ಸ್ವಯಂ ಆತಿಥೇಯ ಪರಿಸರ"
+ },
+ "selfHostedEnvironmentFooter": {
+ "message": "ನಿಮ್ಮ ಆನ್-ಪ್ರಮೇಯ ಹೋಸ್ಟ್ ಮಾಡಿದ ಬಿಟ್ವಾರ್ಡೆನ್ ಸ್ಥಾಪನೆಯ ಮೂಲ URL ಅನ್ನು ನಿರ್ದಿಷ್ಟಪಡಿಸಿ."
+ },
+ "customEnvironment": {
+ "message": "ಕಸ್ಟಮ್ ಪರಿಸರ"
+ },
+ "customEnvironmentFooter": {
+ "message": "ಸುಧಾರಿತ ಬಳಕೆದಾರರಿಗಾಗಿ. ನೀವು ಪ್ರತಿ ಸೇವೆಯ ಮೂಲ URL ಅನ್ನು ಸ್ವತಂತ್ರವಾಗಿ ನಿರ್ದಿಷ್ಟಪಡಿಸಬಹುದು."
+ },
+ "baseUrl": {
+ "message": "ಸರ್ವರ್ URL"
+ },
+ "apiUrl": {
+ "message": "API ಸರ್ವರ್ URL"
+ },
+ "webVaultUrl": {
+ "message": "ವೆಬ್ ವಾಲ್ಟ್ ಸರ್ವರ್ URL"
+ },
+ "identityUrl": {
+ "message": "ಗುರುತಿನ ಸರ್ವರ್ URL"
+ },
+ "notificationsUrl": {
+ "message": "ಅಧಿಸೂಚನೆಗಳು ಸರ್ವರ್ URL"
+ },
+ "iconsUrl": {
+ "message": "ಚಿಹ್ನೆಗಳು ಸರ್ವರ್ URL"
+ },
+ "environmentSaved": {
+ "message": "ಪರಿಸರ URL ಗಳನ್ನು ಉಳಿಸಲಾಗಿದೆ."
+ },
+ "enableAutoFillOnPageLoad": {
+ "message": "ಪುಟ ಲೋಡ್ನಲ್ಲಿ ಸ್ವಯಂ ಭರ್ತಿ ಸಕ್ರಿಯಗೊಳಿಸಿ"
+ },
+ "enableAutoFillOnPageLoadDesc": {
+ "message": "ಲಾಗಿನ್ ಫಾರ್ಮ್ ಪತ್ತೆಯಾದಲ್ಲಿ, ವೆಬ್ ಪುಟ ಲೋಡ್ ಆಗುವಾಗ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಸ್ವಯಂ ಭರ್ತಿ ಮಾಡಿ."
+ },
+ "experimentalFeature": {
+ "message": "ಇದು ಪ್ರಸ್ತುತ ಪ್ರಾಯೋಗಿಕ ಲಕ್ಷಣವಾಗಿದೆ. ನಿಮ್ಮ ಸ್ವಂತ ಅಪಾಯದಲ್ಲಿ ಬಳಸಿ."
+ },
+ "defaultAutoFillOnPageLoad": {
+ "message": "ಲಾಗಿನ್ ಐಟಂಗಳಿಗಾಗಿ ಡೀಫಾಲ್ಟ್ ಆಟೋಫಿಲ್ ಸೆಟ್ಟಿಂಗ್"
+ },
+ "defaultAutoFillOnPageLoadDesc": {
+ "message": "ಪುಟ ಲೋಡ್ನಲ್ಲಿ ಸ್ವಯಂ-ಭರ್ತಿ ಸಕ್ರಿಯಗೊಳಿಸಿದ ನಂತರ, ನೀವು ವೈಯಕ್ತಿಕ ಲಾಗಿನ್ ಐಟಂಗಳಿಗಾಗಿ ವೈಶಿಷ್ಟ್ಯವನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಬಹುದು ಅಥವಾ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಬಹುದು. ಪ್ರತ್ಯೇಕವಾಗಿ ಕಾನ್ಫಿಗರ್ ಮಾಡದ ಲಾಗಿನ್ ಐಟಂಗಳ ಡೀಫಾಲ್ಟ್ ಸೆಟ್ಟಿಂಗ್ ಇದು."
+ },
+ "itemAutoFillOnPageLoad": {
+ "message": "ಪುಟ ಲೋಡ್ನಲ್ಲಿ ಸ್ವಯಂ ಭರ್ತಿ (ಆಯ್ಕೆಗಳಲ್ಲಿ ಸಕ್ರಿಯಗೊಳಿಸಿದ್ದರೆ)"
+ },
+ "autoFillOnPageLoadUseDefault": {
+ "message": "ಡೀಫಾಲ್ಟ್ ಸೆಟ್ಟಿಂಗ್ ಬಳಸಿ"
+ },
+ "autoFillOnPageLoadYes": {
+ "message": "ಪುಟ ಲೋಡ್ನಲ್ಲಿ ಸ್ವಯಂ ಭರ್ತಿ"
+ },
+ "autoFillOnPageLoadNo": {
+ "message": "ಪುಟ ಲೋಡ್ನಲ್ಲಿ ಸ್ವಯಂ ಭರ್ತಿ ಮಾಡಬೇಡಿ"
+ },
+ "commandOpenPopup": {
+ "message": "ವಾಲ್ಟ್ ಪಾಪ್ಅಪ್ ತೆರೆಯಿರಿ"
+ },
+ "commandOpenSidebar": {
+ "message": "ಸೈಡ್ಬಾರ್ನಲ್ಲಿ ವಾಲ್ಟ್ ತೆರೆಯಿರಿ"
+ },
+ "commandAutofillDesc": {
+ "message": "ಪ್ರಸ್ತುತ ವೆಬ್ಸೈಟ್ಗಾಗಿ ಕೊನೆಯದಾಗಿ ಬಳಸಿದ ಲಾಗಿನ್ ಅನ್ನು ಸ್ವಯಂ ಭರ್ತಿ ಮಾಡಿ"
+ },
+ "commandGeneratePasswordDesc": {
+ "message": "ಕ್ಲಿಪ್ಬೋರ್ಡ್ಗೆ ಹೊಸ ಯಾದೃಚ್ಛಿಕ ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ರಚಿಸಿ ಮತ್ತು ನಕಲಿಸಿ"
+ },
+ "commandLockVaultDesc": {
+ "message": "ವಾಲ್ಟ್ ಅನ್ನು ಲಾಕ್ ಮಾಡಿ"
+ },
+ "privateModeMessage": {
+ "message": "ದುರದೃಷ್ಟವಶಾತ್ ಈ ವಿಂಡೋ ಈ ಬ್ರೌಸರ್ಗಾಗಿ ಖಾಸಗಿ ಮೋಡ್ನಲ್ಲಿ ಲಭ್ಯವಿಲ್ಲ."
+ },
+ "customFields": {
+ "message": "ಕಸ್ಟಮ್ ಕ್ಷೇತ್ರಗಳು"
+ },
+ "copyValue": {
+ "message": "ಮೌಲ್ಯವನ್ನು ನಕಲಿಸಿ"
+ },
+ "value": {
+ "message": "ಮೌಲ್ಯ"
+ },
+ "newCustomField": {
+ "message": "ಹೊಸ ಕಸ್ಟಮ್ ಕ್ಷೇತ್ರ"
+ },
+ "dragToSort": {
+ "message": "ವಿಂಗಡಿಸಲು ಎಳೆಯಿರಿ"
+ },
+ "cfTypeText": {
+ "message": "ಪಠ್ಯ"
+ },
+ "cfTypeHidden": {
+ "message": "ಮರೆಮಾಡಲಾಗಿದೆ"
+ },
+ "cfTypeBoolean": {
+ "message": "ಬೂಲಿಯನ್"
+ },
+ "popup2faCloseMessage": {
+ "message": "ನಿಮ್ಮ ಪರಿಶೀಲನಾ ಕೋಡ್ಗಾಗಿ ನಿಮ್ಮ ಇಮೇಲ್ ಪರಿಶೀಲಿಸಲು ಪಾಪ್ಅಪ್ ವಿಂಡೋದ ಹೊರಗೆ ಕ್ಲಿಕ್ ಮಾಡುವುದರಿಂದ ಈ ಪಾಪ್ಅಪ್ ಮುಚ್ಚಲ್ಪಡುತ್ತದೆ. ಈ ಪಾಪ್ಅಪ್ ಅನ್ನು ಮುಚ್ಚದಿರುವಂತೆ ಹೊಸ ವಿಂಡೋದಲ್ಲಿ ತೆರೆಯಲು ನೀವು ಬಯಸುವಿರಾ?"
+ },
+ "popupU2fCloseMessage": {
+ "message": "ಈ ಬ್ರೌಸರ್ ಈ ಪಾಪ್ಅಪ್ ವಿಂಡೋದಲ್ಲಿ ಯು 2 ಎಫ್ ವಿನಂತಿಗಳನ್ನು ಪ್ರಕ್ರಿಯೆಗೊಳಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ. ಈ ಪಾಪ್ಅಪ್ ಅನ್ನು ಹೊಸ ವಿಂಡೋದಲ್ಲಿ ತೆರೆಯಲು ನೀವು ಬಯಸುವಿರಾ, ಇದರಿಂದ ನೀವು ಯು 2 ಎಫ್ ಬಳಸಿ ಲಾಗ್ ಇನ್ ಆಗಬಹುದು."
+ },
+ "disableFavicon": {
+ "message": "ವೆಬ್ಸೈಟ್ ಚಿಹ್ನೆಗಳನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ"
+ },
+ "disableFaviconDesc": {
+ "message": "ವೆಬ್ಸೈಟ್ ಐಕಾನ್ಗಳು ನಿಮ್ಮ ವಾಲ್ಟ್ನಲ್ಲಿರುವ ಪ್ರತಿ ಲಾಗಿನ್ ಐಟಂನ ಪಕ್ಕದಲ್ಲಿ ಗುರುತಿಸಬಹುದಾದ ಚಿತ್ರವನ್ನು ಒದಗಿಸುತ್ತದೆ."
+ },
+ "disableBadgeCounter": {
+ "message": "ಬ್ಯಾಡ್ಜ್ ಕೌಂಟರ್ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ"
+ },
+ "disableBadgeCounterDesc": {
+ "message": "ನಿಮ್ಮ ವಾಲ್ಟ್ನಲ್ಲಿ ಪ್ರಸ್ತುತ ಪುಟಕ್ಕಾಗಿ ನೀವು ಎಷ್ಟು ಲಾಗಿನ್ಗಳನ್ನು ಹೊಂದಿದ್ದೀರಿ ಎಂದು ಬ್ಯಾಡ್ಜ್ ಕೌಂಟರ್ ಸೂಚಿಸುತ್ತದೆ."
+ },
+ "cardholderName": {
+ "message": "ಕಾರ್ಡುದಾರನ ಹೆಸರು"
+ },
+ "number": {
+ "message": "ಸಂಖ್ಯೆ"
+ },
+ "brand": {
+ "message": "ಬ್ರ್ಯಾಂಡ್"
+ },
+ "expirationMonth": {
+ "message": "ಮುಕ್ತಾಯ ತಿಂಗಳು"
+ },
+ "expirationYear": {
+ "message": "ಮುಕ್ತಾಯ ವರ್ಷ"
+ },
+ "expiration": {
+ "message": "ಮುಕ್ತಾಯ"
+ },
+ "january": {
+ "message": "ಜನವರಿ"
+ },
+ "february": {
+ "message": "ಫೆಬ್ರವರಿ"
+ },
+ "march": {
+ "message": "ಮಾರ್ಚ್"
+ },
+ "april": {
+ "message": "ಏಪ್ರಿಲ್"
+ },
+ "may": {
+ "message": "ಮೇ"
+ },
+ "june": {
+ "message": "ಜೂನ್"
+ },
+ "july": {
+ "message": "ಜುಲೈ"
+ },
+ "august": {
+ "message": "ಆಗಸ್ಟ್"
+ },
+ "september": {
+ "message": "ಸೆಪ್ಟೆಂಬರ್"
+ },
+ "october": {
+ "message": "ಅಕ್ಟೋಬರ್"
+ },
+ "november": {
+ "message": "ನವೆಂಬರ್"
+ },
+ "december": {
+ "message": "ಡಿಸೆಂಬರ್"
+ },
+ "securityCode": {
+ "message": "ಭದ್ರತಾ ಕೋಡ್ "
+ },
+ "ex": {
+ "message": "ಉದಾಹರಣೆ"
+ },
+ "title": {
+ "message": "ಶೀರ್ಷಿಕೆ"
+ },
+ "mr": {
+ "message": "ಶ್ರೀ"
+ },
+ "mrs": {
+ "message": "ಶ್ರೀಮತಿ"
+ },
+ "ms": {
+ "message": "ಎಂ.ಎಸ್"
+ },
+ "dr": {
+ "message": "Dr"
+ },
+ "firstName": {
+ "message": "ಮೊದಲ ಹೆಸರು"
+ },
+ "middleName": {
+ "message": "ಮಧ್ಯದ ಹೆಸರು"
+ },
+ "lastName": {
+ "message": "ಕೊನೆ ಹೆಸರು"
+ },
+ "identityName": {
+ "message": "ಹೆಸರು ಗುರುತು"
+ },
+ "company": {
+ "message": "ಕಂಪನಿ"
+ },
+ "ssn": {
+ "message": "ಸಾಮಾಜಿಕ ಭದ್ರತೆ ಸಂಖ್ಯೆ"
+ },
+ "passportNumber": {
+ "message": "ಪಾಸ್ಪೋರ್ಟ್ ಸಂಖ್ಯೆ"
+ },
+ "licenseNumber": {
+ "message": "ಪರವಾನಗಿ ಸಂಖ್ಯೆ"
+ },
+ "email": {
+ "message": "ಇಮೇಲ್"
+ },
+ "phone": {
+ "message": "ಫೋನ್"
+ },
+ "address": {
+ "message": "ವಿಳಾಸ "
+ },
+ "address1": {
+ "message": "ವಿಳಾಸ 1"
+ },
+ "address2": {
+ "message": "ವಿಳಾಸ 2"
+ },
+ "address3": {
+ "message": "ವಿಳಾಸ 3"
+ },
+ "cityTown": {
+ "message": "ನಗರ / ಪಟ್ಟಣ"
+ },
+ "stateProvince": {
+ "message": "ರಾಜ್ಯ / ಪ್ರಾಂತ್ಯ"
+ },
+ "zipPostalCode": {
+ "message": "ಪಿನ್ / ಅಂಚೆ ಕೋಡ್"
+ },
+ "country": {
+ "message": "ದೇಶ"
+ },
+ "type": {
+ "message": "ಪ್ರಕಾರ"
+ },
+ "typeLogin": {
+ "message": "ಲಾಗಿನ್"
+ },
+ "typeLogins": {
+ "message": "ಲಾಗಿನ್ಸ್"
+ },
+ "typeSecureNote": {
+ "message": "ಸುರಕ್ಷಿತ ಟಿಪ್ಪಣಿ"
+ },
+ "typeCard": {
+ "message": "ಕಾರ್ಡ್"
+ },
+ "typeIdentity": {
+ "message": "ಗುರುತಿಸುವಿಕೆ"
+ },
+ "passwordHistory": {
+ "message": "ಪಾಸ್ವರ್ಡ್ ಇತಿಹಾಸ"
+ },
+ "back": {
+ "message": "ಹಿಂದಕ್ಕೆ"
+ },
+ "collections": {
+ "message": "ಸಂಗ್ರಹಣೆಗಳು"
+ },
+ "favorites": {
+ "message": "ಮೆಚ್ಚುಗೆಗಳು"
+ },
+ "popOutNewWindow": {
+ "message": "ಹೊಸ ವಿಂಡೋಗೆ ಪಾಪ್ ಔಟ್ ಮಾಡಿ"
+ },
+ "refresh": {
+ "message": "ಹೊಸತಾಗಿಸಿ"
+ },
+ "cards": {
+ "message": "ಕಾರ್ಡ್ಗಳು"
+ },
+ "identities": {
+ "message": "ಗುರುತುಗಳು"
+ },
+ "logins": {
+ "message": "ಲಾಗಿನ್ಸ್"
+ },
+ "secureNotes": {
+ "message": "ಸುರಕ್ಷಿತ ಟಿಪ್ಪಣಿಗಳು"
+ },
+ "clear": {
+ "message": "ಕ್ಲಿಯರ್",
+ "description": "To clear something out. example: To clear browser history."
+ },
+ "checkPassword": {
+ "message": "ಪಾಸ್ವರ್ಡ್ ಬಹಿರಂಗಗೊಂಡಿದೆಯೇ ಎಂದು ಪರಿಶೀಲಿಸಿ."
+ },
+ "passwordExposed": {
+ "message": "ಈ ಗುಪ್ತಪದವು ಡೇಟಾ ಉಲ್ಲಂಘನೆಯಲ್ಲಿ $VALUE$ ಮೌಲ್ಯವನ್ನು (ಗಳು) ಬಹಿರಂಗಪಡಿಸಲಾಗಿದೆ. ನೀವು ಅದನ್ನು ಬದಲಾಯಿಸಬೇಕು.",
+ "placeholders": {
+ "value": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "passwordSafe": {
+ "message": "ತಿಳಿದಿರುವ ಯಾವುದೇ ಡೇಟಾ ಉಲ್ಲಂಘನೆಗಳಲ್ಲಿ ಈ ಪಾಸ್ವರ್ಡ್ ಕಂಡುಬಂದಿಲ್ಲ. ಅದನ್ನು ಬಳಸಲು ಸುರಕ್ಷಿತವಾಗಿರಬೇಕು."
+ },
+ "baseDomain": {
+ "message": "ಮೂಲ ಡೊಮೇನ್"
+ },
+ "host": {
+ "message": "ಅತಿಥೆಯ",
+ "description": "A URL's host value. For example, the host of https://sub.domain.com:443 is 'sub.domain.com:443'."
+ },
+ "exact": {
+ "message": "ನಿಖರವಾಗಿ"
+ },
+ "startsWith": {
+ "message": "ಇದರೊಂದಿಗೆ ಪ್ರಾರಂಭವಾಗುತ್ತದೆ"
+ },
+ "regEx": {
+ "message": "ನಿಯಮಿತ ಅಭಿವ್ಯಕ್ತಿ",
+ "description": "A programming term, also known as 'RegEx'."
+ },
+ "matchDetection": {
+ "message": "ಹೊಂದಾಣಿಕೆ ಪತ್ತೆ",
+ "description": "URI match detection for auto-fill."
+ },
+ "defaultMatchDetection": {
+ "message": "ಡೀಫಾಲ್ಟ್ ಪಂದ್ಯ ಪತ್ತೆ",
+ "description": "Default URI match detection for auto-fill."
+ },
+ "toggleOptions": {
+ "message": "ಟಾಗಲ್ ಆಯ್ಕೆಗಳು"
+ },
+ "toggleCurrentUris": {
+ "message": "ಪ್ರಸ್ತುತ URI ಗಳನ್ನು ಟಾಗಲ್ ಮಾಡಿ",
+ "description": "Toggle the display of the URIs of the currently open tabs in the browser."
+ },
+ "currentUri": {
+ "message": "ಪ್ರಸ್ತುತ URI",
+ "description": "The URI of one of the current open tabs in the browser."
+ },
+ "organization": {
+ "message": "ಸಂಸ್ಥೆ",
+ "description": "An entity of multiple related people (ex. a team or business organization)."
+ },
+ "types": {
+ "message": "ರೀತಿಯ"
+ },
+ "allItems": {
+ "message": "ಎಲ್ಲಾ ವಸ್ತುಗಳು"
+ },
+ "noPasswordsInList": {
+ "message": "ಪಟ್ಟಿ ಮಾಡಲು ಯಾವುದೇ ಪಾಸ್ವರ್ಡ್ಗಳು ಇಲ್ಲ."
+ },
+ "remove": {
+ "message": "ತೆಗೆ"
+ },
+ "default": {
+ "message": "ಡಿಫಾಲ್ಟ್"
+ },
+ "dateUpdated": {
+ "message": "ಅಪ್ಡೇಟ್",
+ "description": "ex. Date this item was updated"
+ },
+ "datePasswordUpdated": {
+ "message": "ಪಾಸ್ವರ್ಡ್ ನವೀಕರಿಸಲಾಗಿದೆ",
+ "description": "ex. Date this password was updated"
+ },
+ "neverLockWarning": {
+ "message": "ನೀವು \"ನೆವರ್\" ಆಯ್ಕೆಯನ್ನು ಬಳಸಲು ಬಯಸುತ್ತೀರಾ? ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ನಿಮ್ಮ ವಾಲ್ಟ್ನ ಎನ್ಕ್ರಿಪ್ಶನ್ ಕೀಲಿಯನ್ನು \"ಎಂದಿಗೂ\" ಸಂಗ್ರಹಿಸಲು ನಿಮ್ಮ ಲಾಕ್ ಆಯ್ಕೆಗಳನ್ನು ಹೊಂದಿಸಿ. ನೀವು ಈ ಆಯ್ಕೆಯನ್ನು ಬಳಸಿದರೆ ನಿಮ್ಮ ಸಾಧನವನ್ನು ಸರಿಯಾಗಿ ರಕ್ಷಿಸಲಾಗಿದೆ ಎಂದು ನೀವು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಬೇಕು."
+ },
+ "noOrganizationsList": {
+ "message": "ನೀವು ಯಾವುದೇ ಸಂಸ್ಥೆಗಳಿಗೆ ಸೇರಿಲ್ಲ. ಇತರ ಬಳಕೆದಾರರೊಂದಿಗೆ ವಸ್ತುಗಳನ್ನು ಸುರಕ್ಷಿತವಾಗಿ ಹಂಚಿಕೊಳ್ಳಲು ಸಂಘಟನೆಗಳು ನಿಮಗೆ ಅವಕಾಶ ನೀಡುತ್ತವೆ."
+ },
+ "noCollectionsInList": {
+ "message": "ಪಟ್ಟಿ ಮಾಡಲು ಯಾವುದೇ ಸಂಗ್ರಹಗಳಿಲ್ಲ."
+ },
+ "ownership": {
+ "message": "ಮಾಲೀಕತ್ವ"
+ },
+ "whoOwnsThisItem": {
+ "message": "ಈ ಐಟಂ ಅನ್ನು ಯಾರು ಹೊಂದಿದ್ದಾರೆ?"
+ },
+ "strong": {
+ "message": "ಬಲಶಾಲಿ",
+ "description": "ex. A strong password. Scale: Weak -> Good -> Strong"
+ },
+ "good": {
+ "message": "ಒಳ್ಳೆಯ",
+ "description": "ex. A good password. Scale: Weak -> Good -> Strong"
+ },
+ "weak": {
+ "message": "ದುರ್ಬಲ",
+ "description": "ex. A weak password. Scale: Weak -> Good -> Strong"
+ },
+ "weakMasterPassword": {
+ "message": "ದುರ್ಬಲ ಮಾಸ್ಟರ್ ಪಾಸ್ವರ್ಡ್"
+ },
+ "weakMasterPasswordDesc": {
+ "message": "ನೀವು ಆಯ್ಕೆ ಮಾಡಿದ ಮಾಸ್ಟರ್ ಪಾಸ್ವರ್ಡ್ ದುರ್ಬಲವಾಗಿದೆ. ನಿಮ್ಮ ಬಿಟ್ವರ್ಡ್ ಖಾತೆಯನ್ನು ಸರಿಯಾಗಿ ರಕ್ಷಿಸಲು ನೀವು ಬಲವಾದ ಮಾಸ್ಟರ್ ಪಾಸ್ವರ್ಡ್ (ಅಥವಾ ಪಾಸ್ಫ್ರೇಸ್) ಅನ್ನು ಬಳಸಬೇಕು. ಈ ಮಾಸ್ಟರ್ ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ನೀವು ಬಳಸಲು ಬಯಸುತ್ತೀರಾ?"
+ },
+ "pin": {
+ "message": "ಪಿನ್",
+ "description": "PIN code. Ex. The short code (often numeric) that you use to unlock a device."
+ },
+ "unlockWithPin": {
+ "message": "ಪಿನ್ನೊಂದಿಗೆ ಅನ್ಲಾಕ್ ಮಾಡಿ"
+ },
+ "setYourPinCode": {
+ "message": "ಬಿಟ್ವಾರ್ಡೆನ್ ಅನ್ಲಾಕ್ ಮಾಡಲು ನಿಮ್ಮ ಪಿನ್ ಕೋಡ್ ಅನ್ನು ಹೊಂದಿಸಿ. ನೀವು ಎಂದಾದರೂ ಅಪ್ಲಿಕೇಶನ್ನಿಂದ ಸಂಪೂರ್ಣವಾಗಿ ಲಾಗ್ out ಟ್ ಆಗಿದ್ದರೆ ನಿಮ್ಮ ಪಿನ್ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ಮರುಹೊಂದಿಸಲಾಗುತ್ತದೆ."
+ },
+ "pinRequired": {
+ "message": "ಪಿನ್ ಕೋಡ್ ಅಗತ್ಯವಿದೆ."
+ },
+ "invalidPin": {
+ "message": "ಅಮಾನ್ಯ ಪಿನ್ ಕೋಡ್."
+ },
+ "verifyPin": {
+ "message": "ಪಿನ್ ಪರಿಶೀಲಿಸಿ"
+ },
+ "yourVaultIsLockedPinCode": {
+ "message": "ನಿಮ್ಮ ವಾಲ್ಟ್ ಲಾಕ್ ಆಗಿದೆ. ಮುಂದುವರೆಯಲು ನಿಮ್ಮ ಪಿನ್ ಕೋಡ್ ಪರಿಶೀಲಿಸಿ."
+ },
+ "unlockWithBiometrics": {
+ "message": "ಬಯೋಮೆಟ್ರಿಕ್ಸ್ನೊಂದಿಗೆ ಅನ್ಲಾಕ್ ಮಾಡಿ"
+ },
+ "awaitDesktop": {
+ "message": "ಡೆಸ್ಕ್ಟಾಪ್ನಿಂದ ದೃಢೀಕರಣಕ್ಕಾಗಿ ಕಾಯಲಾಗುತ್ತಿದೆ"
+ },
+ "awaitDesktopDesc": {
+ "message": "ಬ್ರೌಸರ್ಗಾಗಿ ಬಯೋಮೆಟ್ರಿಕ್ಸ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲು ದಯವಿಟ್ಟು ಬಿಟ್ವಾರ್ಡೆನ್ ಡೆಸ್ಕ್ಟಾಪ್ ಅಪ್ಲಿಕೇಶನ್ನಲ್ಲಿ ಬಯೋಮೆಟ್ರಿಕ್ಸ್ ಬಳಸುವುದನ್ನು ಖಚಿತಪಡಿಸಿ."
+ },
+ "lockWithMasterPassOnRestart": {
+ "message": "ಬ್ರೌಸರ್ ಮರುಪ್ರಾರಂಭದಲ್ಲಿ ಮಾಸ್ಟರ್ ಪಾಸ್ವರ್ಡ್ನೊಂದಿಗೆ ಲಾಕ್ ಮಾಡಿ"
+ },
+ "selectOneCollection": {
+ "message": "ನೀವು ಕನಿಷ್ಠ ಒಂದು ಸಂಗ್ರಹವನ್ನು ಆರಿಸಬೇಕು."
+ },
+ "cloneItem": {
+ "message": "ಕ್ಲೋನ್ ಐಟಂ"
+ },
+ "clone": {
+ "message": "ಕ್ಲೋನ್"
+ },
+ "passwordGeneratorPolicyInEffect": {
+ "message": "ಒಂದು ಅಥವಾ ಹೆಚ್ಚಿನ ಸಂಸ್ಥೆ ನೀತಿಗಳು ನಿಮ್ಮ ಜನರೇಟರ್ ಸೆಟ್ಟಿಂಗ್ಗಳ ಮೇಲೆ ಪರಿಣಾಮ ಬೀರುತ್ತವೆ"
+ },
+ "vaultTimeoutAction": {
+ "message": "ವಾಲ್ಟ್ ಸಮಯ ಮೀರುವ ಕ್ರಿಯೆ"
+ },
+ "lock": {
+ "message": "ಲಾಕ್",
+ "description": "Verb form: to make secure or inaccesible by"
+ },
+ "trash": {
+ "message": "ಅನುಪಯುಕ್ತ",
+ "description": "Noun: a special folder to hold deleted items"
+ },
+ "searchTrash": {
+ "message": "ಅನುಪಯುಕ್ತವನ್ನು ಹುಡುಕಿ"
+ },
+ "permanentlyDeleteItem": {
+ "message": "ಐಟಂ ಅನ್ನು ಶಾಶ್ವತವಾಗಿ ಅಳಿಸಿ"
+ },
+ "permanentlyDeleteItemConfirmation": {
+ "message": "ಈ ಐಟಂ ಅನ್ನು ಶಾಶ್ವತವಾಗಿ ಅಳಿಸಲು ನೀವು ಖಚಿತವಾಗಿ ಬಯಸುವಿರಾ?"
+ },
+ "permanentlyDeletedItem": {
+ "message": "ಶಾಶ್ವತವಾಗಿ ಅಳಿಸಲಾದ ಐಟಂ"
+ },
+ "restoreItem": {
+ "message": "ಐಟಂ ಅನ್ನು ಮರುಸ್ಥಾಪಿಸಿ"
+ },
+ "restoreItemConfirmation": {
+ "message": "ಈ ಐಟಂ ಅನ್ನು ಮರುಸ್ಥಾಪಿಸಲು ನೀವು ಖಚಿತವಾಗಿ ಬಯಸುವಿರಾ?"
+ },
+ "restoredItem": {
+ "message": "ಐಟಂ ಅನ್ನು ಮರುಸ್ಥಾಪಿಸಲಾಗಿದೆ"
+ },
+ "vaultTimeoutLogOutConfirmation": {
+ "message": "ಲಾಗ್ out ಟ್ ಆಗುವುದರಿಂದ ನಿಮ್ಮ ವಾಲ್ಟ್ನ ಎಲ್ಲಾ ಪ್ರವೇಶವನ್ನು ತೆಗೆದುಹಾಕುತ್ತದೆ ಮತ್ತು ಕಾಲಾವಧಿ ಅವಧಿಯ ನಂತರ ಆನ್ಲೈನ್ ದೃ hentic ೀಕರಣದ ಅಗತ್ಯವಿದೆ. ಈ ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ಬಳಸಲು ನೀವು ಖಚಿತವಾಗಿ ಬಯಸುವಿರಾ?"
+ },
+ "vaultTimeoutLogOutConfirmationTitle": {
+ "message": "ಕಾಲಾವಧಿ ಕ್ರಿಯೆಯ ದೃಢೀಕರಣ"
+ },
+ "autoFillAndSave": {
+ "message": "ಸ್ವಯಂ ಭರ್ತಿ ಮತ್ತು ಉಳಿಸಿ"
+ },
+ "autoFillSuccessAndSavedUri": {
+ "message": "ಸ್ವಯಂ ತುಂಬಿದ ಐಟಂ ಮತ್ತು ಉಳಿಸಿದ ಯುಆರ್ಐ"
+ },
+ "autoFillSuccess": {
+ "message": "ಸ್ವಯಂ ತುಂಬಿದ ಐಟಂ"
+ },
+ "setMasterPassword": {
+ "message": "ಮಾಸ್ಟರ್ ಪಾಸ್ವರ್ಡ್ ಹೊಂದಿಸಿ"
+ },
+ "masterPasswordPolicyInEffect": {
+ "message": "ಒಂದು ಅಥವಾ ಹೆಚ್ಚಿನ ಸಂಸ್ಥೆ ನೀತಿಗಳಿಗೆ ಈ ಕೆಳಗಿನ ಅವಶ್ಯಕತೆಗಳನ್ನು ಪೂರೈಸಲು ನಿಮ್ಮ ಮಾಸ್ಟರ್ ಪಾಸ್ವರ್ಡ್ ಅಗತ್ಯವಿದೆ:"
+ },
+ "policyInEffectMinComplexity": {
+ "message": "$SCORE$ ನ ಕನಿಷ್ಠ ಸಂಕೀರ್ಣತೆಯ ಸ್ಕೋರ್",
+ "placeholders": {
+ "score": {
+ "content": "$1",
+ "example": "4"
+ }
+ }
+ },
+ "policyInEffectMinLength": {
+ "message": "$LENGTH$ನ ಕನಿಷ್ಠ ಉದ್ದ",
+ "placeholders": {
+ "length": {
+ "content": "$1",
+ "example": "14"
+ }
+ }
+ },
+ "policyInEffectUppercase": {
+ "message": "ಒಂದು ಅಥವಾ ಹೆಚ್ಚಿನ ದೊಡ್ಡಕ್ಷರಗಳನ್ನು ಹೊಂದಿರುತ್ತದೆ"
+ },
+ "policyInEffectLowercase": {
+ "message": "ಒಂದು ಅಥವಾ ಹೆಚ್ಚಿನ ಸಣ್ಣ ಅಕ್ಷರಗಳನ್ನು ಹೊಂದಿರುತ್ತದೆ"
+ },
+ "policyInEffectNumbers": {
+ "message": "ಒಂದು ಅಥವಾ ಹೆಚ್ಚಿನ ಸಂಖ್ಯೆಗಳನ್ನು ಹೊಂದಿರುತ್ತದೆ"
+ },
+ "policyInEffectSpecial": {
+ "message": "ಕೆಳಗಿನ ಒಂದು ಅಥವಾ ಹೆಚ್ಚಿನ ವಿಶೇಷ ಅಕ್ಷರಗಳನ್ನು ಒಳಗೊಂಡಿರುತ್ತದೆ: $CHARS$",
+ "placeholders": {
+ "chars": {
+ "content": "$1",
+ "example": "!@#$%^&*"
+ }
+ }
+ },
+ "masterPasswordPolicyRequirementsNotMet": {
+ "message": "ನಿಮ್ಮ ಹೊಸ ಮಾಸ್ಟರ್ ಪಾಸ್ವರ್ಡ್ ನೀತಿಯ ಅವಶ್ಯಕತೆಗಳನ್ನು ಪೂರೈಸುವುದಿಲ್ಲ."
+ },
+ "acceptPolicies": {
+ "message": "ಈ ಪೆಟ್ಟಿಗೆಯನ್ನು ಪರಿಶೀಲಿಸುವ ಮೂಲಕ ನೀವು ಈ ಕೆಳಗಿನವುಗಳನ್ನು ಒಪ್ಪುತ್ತೀರಿ:"
+ },
+ "acceptPoliciesError": {
+ "message": "ಸೇವಾ ನಿಯಮಗಳು ಮತ್ತು ಗೌಪ್ಯತೆ ನೀತಿಯನ್ನು ಅಂಗೀಕರಿಸಲಾಗಿಲ್ಲ."
+ },
+ "termsOfService": {
+ "message": "ಸೇವಾ ನಿಯಮಗಳು"
+ },
+ "privacyPolicy": {
+ "message": "ಗೌಪ್ಯತಾ ನೀತಿ"
+ },
+ "hintEqualsPassword": {
+ "message": "ನಿಮ್ಮ ಪಾಸ್ವರ್ಡ್ ಸುಳಿವು ನಿಮ್ಮ ಪಾಸ್ವರ್ಡ್ನಂತೆಯೇ ಇರಬಾರದು."
+ },
+ "ok": {
+ "message": "ಸರಿ"
+ },
+ "desktopSyncVerificationTitle": {
+ "message": "ಡೆಸ್ಕ್ಟಾಪ್ ಸಿಂಕ್ ಪರಿಶೀಲನೆ"
+ },
+ "desktopIntegrationVerificationText": {
+ "message": "ಡೆಸ್ಕ್ಟಾಪ್ ಅಪ್ಲಿಕೇಶನ್ ಈ ಫಿಂಗರ್ಪ್ರಿಂಟ್ ಅನ್ನು ತೋರಿಸುತ್ತದೆ ಎಂಬುದನ್ನು ದಯವಿಟ್ಟು ಪರಿಶೀಲಿಸಿ:"
+ },
+ "desktopIntegrationDisabledTitle": {
+ "message": "ಬ್ರೌಸರ್ ಏಕೀಕರಣವನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿಲ್ಲ"
+ },
+ "desktopIntegrationDisabledDesc": {
+ "message": "ಬಿಟ್ವಾರ್ಡೆನ್ ಡೆಸ್ಕ್ಟಾಪ್ ಅಪ್ಲಿಕೇಶನ್ನಲ್ಲಿ ಬ್ರೌಸರ್ ಏಕೀಕರಣವನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿಲ್ಲ. ದಯವಿಟ್ಟು ಅದನ್ನು ಡೆಸ್ಕ್ಟಾಪ್ ಅಪ್ಲಿಕೇಶನ್ನಲ್ಲಿನ ಸೆಟ್ಟಿಂಗ್ಗಳಲ್ಲಿ ಸಕ್ರಿಯಗೊಳಿಸಿ."
+ },
+ "startDesktopTitle": {
+ "message": "ಬಿಟ್ವಾರ್ಡೆನ್ ಡೆಸ್ಕ್ಟಾಪ್ ಅಪ್ಲಿಕೇಶನ್ ಪ್ರಾರಂಭಿಸಿ"
+ },
+ "startDesktopDesc": {
+ "message": "ಈ ಕಾರ್ಯವನ್ನು ಬಳಸುವ ಮೊದಲು ಬಿಟ್ವಾರ್ಡೆನ್ ಡೆಸ್ಕ್ಟಾಪ್ ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ಪ್ರಾರಂಭಿಸಬೇಕಾಗಿದೆ."
+ },
+ "errorEnableBiometricTitle": {
+ "message": "ಬಯೋಮೆಟ್ರಿಕ್ಸ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ"
+ },
+ "errorEnableBiometricDesc": {
+ "message": "ಕ್ರಮವನ್ನು ಡೆಸ್ಕ್ಟಾಪ್ ಅಪ್ಲಿಕೇಶನ್ ರದ್ದುಗೊಳಿಸಲಾಯಿತು"
+ },
+ "nativeMessagingInvalidEncryptionDesc": {
+ "message": "Desktop application invalidated the secure communication channel. Please retry this operation\n"
+ },
+ "nativeMessagingInvalidEncryptionTitle": {
+ "message": "ಡೆಸ್ಕ್ಟಾಪ್ ಸಂವಹನ ಅಡಚಣೆ"
+ },
+ "nativeMessagingWrongUserDesc": {
+ "message": "ಡೆಸ್ಕ್ಟಾಪ್ ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ಬೇರೆ ಖಾತೆಗೆ ಲಾಗ್ ಮಾಡಲಾಗಿದೆ. ಎರಡೂ ಅಪ್ಲಿಕೇಶನ್ಗಳು ಒಂದೇ ಖಾತೆಗೆ ಲಾಗ್ ಇನ್ ಆಗಿವೆ ಎಂದು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಿ."
+ },
+ "nativeMessagingWrongUserTitle": {
+ "message": "ಖಾತೆ ಹೊಂದಿಕೆಯಾಗುವುದಿಲ್ಲ"
+ },
+ "biometricsNotEnabledTitle": {
+ "message": "ಬಯೊಮಿಟ್ರಿಕ್ಸ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿಲ್ಲ"
+ },
+ "biometricsNotEnabledDesc": {
+ "message": "ಬ್ರೌಸರ್ ಬಯೋಮೆಟ್ರಿಕ್ಸ್ ಮೊದಲು ಸೆಟ್ಟಿಂಗ್ಗಳಲ್ಲಿ ಡೆಸ್ಕ್ಟಾಪ್ ಬಯೋಮೆಟ್ರಿಕ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಬೇಕಾಗುತ್ತದೆ."
+ },
+ "biometricsNotSupportedTitle": {
+ "message": "ಬಯೋಮೆಟ್ರಿಕ್ಸ್ ಬೆಂಬಲಿಸುವುದಿಲ್ಲ"
+ },
+ "biometricsNotSupportedDesc": {
+ "message": "ಬ್ರೌಸರ್ ಬಯೋಮೆಟ್ರಿಕ್ಸ್ ಈ ಸಾಧನದಲ್ಲಿ ಬೆಂಬಲಿಸುವುದಿಲ್ಲ."
+ },
+ "nativeMessaginPermissionErrorTitle": {
+ "message": "ಅನುಮತಿ ಒದಗಿಸಲಾಗಿಲ್ಲ"
+ },
+ "nativeMessaginPermissionErrorDesc": {
+ "message": "ಬಿಟ್ವರ್ಡ್ ಡೆಸ್ಕ್ಟಾಪ್ ಅಪ್ಲಿಕೇಶನ್ನೊಂದಿಗೆ ಸಂವಹನ ಮಾಡಲು ಅನುಮತಿಯಿಲ್ಲದೆ ನಾವು ಬ್ರೌಸರ್ ವಿಸ್ತರಣೆಯಲ್ಲಿ ಬಯೋಮೆಟ್ರಿಕ್ಸ್ ಅನ್ನು ಒದಗಿಸುವುದಿಲ್ಲ. ದಯವಿಟ್ಟು ಪುನಃ ಪ್ರಯತ್ನಿಸಿ."
+ },
+ "nativeMessaginPermissionSidebarTitle": {
+ "message": "ಅನುಮತಿ ವಿನಂತಿ ದೋಷ"
+ },
+ "nativeMessaginPermissionSidebarDesc": {
+ "message": "ಈ ಕ್ರಿಯೆಯನ್ನು ಸೈಡ್ಬಾರ್ನಲ್ಲಿ ಮಾಡಲಾಗುವುದಿಲ್ಲ, ದಯವಿಟ್ಟು ಪಾಪ್ಅಪ್ ಅಥವಾ ಪಾಪ್ಔಟ್ನಲ್ಲಿ ಕ್ರಿಯೆಯನ್ನು ಮರುಪ್ರಯತ್ನಿಸಿ."
+ },
+ "personalOwnershipSubmitError": {
+ "message": "Due to an Enterprise Policy, you are restricted from saving items to your personal vault. Change the Ownership option to an organization and choose from available Collections."
+ },
+ "personalOwnershipPolicyInEffect": {
+ "message": "ಸಂಸ್ಥೆಯ ನೀತಿಯು ನಿಮ್ಮ ಮಾಲೀಕತ್ವದ ಆಯ್ಕೆಗಳ ಮೇಲೆ ಪರಿಣಾಮ ಬೀರುತ್ತಿದೆ."
+ },
+ "excludedDomains": {
+ "message": "ಹೊರತುಪಡಿಸಿದ ಡೊಮೇನ್ಗಳು"
+ },
+ "excludedDomainsDesc": {
+ "message": "ಬಿಟ್ವಾರ್ಡ್ ಈ ಡೊಮೇನ್ಗಳಿಗಾಗಿ ಲಾಗಿನ್ ವಿವರಗಳನ್ನು ಉಳಿಸಲು ಕೇಳುವುದಿಲ್ಲ. ಬದಲಾವಣೆಗಳನ್ನು ಜಾರಿಗೆ ತರಲು ನೀವು ಪುಟವನ್ನು ರಿಫ್ರೆಶ್ ಮಾಡಬೇಕು."
+ },
+ "excludedDomainsInvalidDomain": {
+ "message": "$DOMAIN$ ಮಾನ್ಯವಾದ ಡೊಮೇನ್ ಅಲ್ಲ",
+ "placeholders": {
+ "domain": {
+ "content": "$1",
+ "example": "googlecom"
+ }
+ }
+ },
+ "send": {
+ "message": "ಕಳುಹಿಸಿ",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "searchSends": {
+ "message": "ಹುಡುಕಾಟ ಕಳುಹಿಸುತ್ತದೆ",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "addSend": {
+ "message": "ಕಳುಹಿಸು ಸೇರಿಸಿ",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTypeText": {
+ "message": "ಪಠ್ಯ"
+ },
+ "sendTypeFile": {
+ "message": "ಫೈಲ್"
+ },
+ "allSends": {
+ "message": "ಎಲ್ಲಾ ಕಳುಹಿಸುತ್ತದೆ",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "maxAccessCountReached": {
+ "message": "ಗರಿಷ್ಠ ಪ್ರವೇಶ ಎಣಿಕೆ ತಲುಪಿದೆ"
+ },
+ "expired": {
+ "message": "ಅವಧಿ ಮೀರಿದೆ"
+ },
+ "pendingDeletion": {
+ "message": "ಅಳಿಸುವಿಕೆ ಬಾಕಿ ಉಳಿದಿದೆ"
+ },
+ "passwordProtected": {
+ "message": "ಪಾಸ್ವರ್ಡ್ ರಕ್ಷಿತ"
+ },
+ "copySendLink": {
+ "message": "ಲಿಂಕ್ ಕಳುಹಿಸಿ",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "removePassword": {
+ "message": "ಪಾಸ್ವರ್ಡ್ ತೆಗೆದುಹಾಕಿ"
+ },
+ "delete": {
+ "message": "ಅಳಿಸು"
+ },
+ "removedPassword": {
+ "message": "ತೆಗೆದುಹಾಕಲಾದ ಪಾಸ್ವರ್ಡ್"
+ },
+ "deletedSend": {
+ "message": "ಅಳಿಸಿದ ಕಳುಹಿಸಲಾಗಿದೆ",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendLink": {
+ "message": "ಲಿಂಕ್ ಕಳುಹಿಸಿ",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "disabled": {
+ "message": "ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ"
+ },
+ "removePasswordConfirmation": {
+ "message": "ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ತೆಗೆದುಹಾಕಲು ನೀವು ಖಚಿತವಾಗಿ ಬಯಸುವಿರಾ?"
+ },
+ "deleteSend": {
+ "message": "ಅಳಿಸಿ ಕಳುಹಿಸಿ",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "deleteSendConfirmation": {
+ "message": "ಈ ಕಳುಹಿಸುವಿಕೆಯನ್ನು ಅಳಿಸಲು ನೀವು ಖಚಿತವಾಗಿ ಬಯಸುವಿರಾ?",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "editSend": {
+ "message": "ಕಳುಹಿಸು ಸಂಪಾದಿಸಿ",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTypeHeader": {
+ "message": "ಇದು ಯಾವ ರೀತಿಯ ಕಳುಹಿಸುತ್ತದೆ?",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendNameDesc": {
+ "message": "ಇದನ್ನು ಕಳುಹಿಸಲು ವಿವರಿಸಲು ಸ್ನೇಹಪರ ಹೆಸರು.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendFileDesc": {
+ "message": "ನೀವು ಕಳುಹಿಸಲು ಬಯಸುವ ಫೈಲ್."
+ },
+ "deletionDate": {
+ "message": "ಅಳಿಸುವ ದಿನಾಂಕ"
+ },
+ "deletionDateDesc": {
+ "message": "ಕಳುಹಿಸಿದ ದಿನಾಂಕ ಮತ್ತು ಸಮಯದ ಮೇಲೆ ಕಳುಹಿಸುವಿಕೆಯನ್ನು ಶಾಶ್ವತವಾಗಿ ಅಳಿಸಲಾಗುತ್ತದೆ.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "expirationDate": {
+ "message": "ಮುಕ್ತಾಯ ದಿನಾಂಕ"
+ },
+ "expirationDateDesc": {
+ "message": "ಹೊಂದಿಸಿದ್ದರೆ, ಈ ಕಳುಹಿಸುವಿಕೆಯ ಪ್ರವೇಶವು ನಿಗದಿತ ದಿನಾಂಕ ಮತ್ತು ಸಮಯದ ಮೇಲೆ ಮುಕ್ತಾಯಗೊಳ್ಳುತ್ತದೆ.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "oneDay": {
+ "message": "1 ದಿನ"
+ },
+ "days": {
+ "message": "$DAYS$ ದಿನಗಳು",
+ "placeholders": {
+ "days": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "custom": {
+ "message": "ಕಸ್ಟಮ್"
+ },
+ "maximumAccessCount": {
+ "message": "ಗರಿಷ್ಠ ಪ್ರವೇಶ ಎಣಿಕೆ"
+ },
+ "maximumAccessCountDesc": {
+ "message": "ಹೊಂದಿಸಿದ್ದರೆ, ಗರಿಷ್ಠ ಪ್ರವೇಶ ಎಣಿಕೆ ತಲುಪಿದ ನಂತರ ಬಳಕೆದಾರರಿಗೆ ಈ ಕಳುಹಿಸುವಿಕೆಯನ್ನು ಪ್ರವೇಶಿಸಲು ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendPasswordDesc": {
+ "message": "ಈ ಕಳುಹಿಸುವಿಕೆಯನ್ನು ಪ್ರವೇಶಿಸಲು ಬಳಕೆದಾರರಿಗೆ ಪಾಸ್ವರ್ಡ್ ಐಚ್ ಗತ್ಯವಿದೆ.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendNotesDesc": {
+ "message": "ಈ ಕಳುಹಿಸುವ ಬಗ್ಗೆ ಖಾಸಗಿ ಟಿಪ್ಪಣಿಗಳು.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendDisableDesc": {
+ "message": "ಇದನ್ನು ಕಳುಹಿಸುವುದನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ ಇದರಿಂದ ಯಾರೂ ಅದನ್ನು ಪ್ರವೇಶಿಸಲಾಗುವುದಿಲ್ಲ.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendShareDesc": {
+ "message": "ಉಳಿಸಿದ ನಂತರ ಈ ಕಳುಹಿಸುವ ಲಿಂಕ್ ಅನ್ನು ಕ್ಲಿಪ್ಬೋರ್ಡ್ಗೆ ನಕಲಿಸಿ.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTextDesc": {
+ "message": "ನೀವು ಕಳುಹಿಸಲು ಬಯಸುವ ಪಠ್ಯ."
+ },
+ "sendHideText": {
+ "message": "ಪೂರ್ವನಿಯೋಜಿತವಾಗಿ ಈ ಕಳುಹಿಸುವ ಪಠ್ಯವನ್ನು ಮರೆಮಾಡಿ.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "currentAccessCount": {
+ "message": "ಪ್ರಸ್ತುತ ಪ್ರವೇಶ ಎಣಿಕೆ"
+ },
+ "createSend": {
+ "message": "ಹೊಸ ಕಳುಹಿಸುವಿಕೆಯನ್ನು ರಚಿಸಿ",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "newPassword": {
+ "message": "ಹೊಸ ಪಾಸ್ವರ್ಡ್"
+ },
+ "sendDisabled": {
+ "message": "ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ ಕಳುಹಿಸಿ",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendDisabledWarning": {
+ "message": "Due to an enterprise policy, you are only able to delete an existing Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "createdSend": {
+ "message": "ಕಳುಹಿಸು ರಚಿಸಲಾಗಿದೆ",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "editedSend": {
+ "message": "ಕಳುಹಿಸಿದ ಸಂಪಾದನೆ",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendLinuxChromiumFileWarning": {
+ "message": "ಫೈಲ್ ಅನ್ನು ಆಯ್ಕೆ ಮಾಡಲು, ಸೈಡ್ಬಾರ್ನಲ್ಲಿ ವಿಸ್ತರಣೆಯನ್ನು ತೆರೆಯಿರಿ (ಸಾಧ್ಯವಾದರೆ) ಅಥವಾ ಈ ಬ್ಯಾನರ್ ಕ್ಲಿಕ್ ಮಾಡುವ ಮೂಲಕ ಹೊಸ ವಿಂಡೋಗೆ ಪಾಪ್ಔಟ್ ಮಾಡಿ."
+ },
+ "sendFirefoxFileWarning": {
+ "message": "ಫೈರ್ಫಾಕ್ಸ್ ಬಳಸಿ ಫೈಲ್ ಆಯ್ಕೆ ಮಾಡಲು, ಸೈಡ್ಬಾರ್ನಲ್ಲಿ ವಿಸ್ತರಣೆಯನ್ನು ತೆರೆಯಿರಿ ಅಥವಾ ಈ ಬ್ಯಾನರ್ ಕ್ಲಿಕ್ ಮಾಡುವ ಮೂಲಕ ಹೊಸ ವಿಂಡೋಗೆ ಪಾಪ್ಔಟ್ ಮಾಡಿ."
+ },
+ "sendSafariFileWarning": {
+ "message": "ಸಫಾರಿ ಬಳಸಿ ಫೈಲ್ ಆಯ್ಕೆ ಮಾಡಲು, ಈ ಬ್ಯಾನರ್ ಕ್ಲಿಕ್ ಮಾಡುವ ಮೂಲಕ ಹೊಸ ವಿಂಡೋಗೆ ಪಾಪ್ಔಟ್ ಮಾಡಿ."
+ },
+ "sendFileCalloutHeader": {
+ "message": "ನೀವು ಪ್ರಾರಂಭಿಸುವ ಮೊದಲು"
+ },
+ "sendFirefoxCustomDatePopoutMessage1": {
+ "message": "ಕ್ಯಾಲೆಂಡರ್ ಶೈಲಿಯ ದಿನಾಂಕ ಆಯ್ದುಕೊಳ್ಳುವಿಕೆಯನ್ನು ಬಳಸಲು",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read '**To use a calendar style date picker ** click here to pop out your window.'"
+ },
+ "sendFirefoxCustomDatePopoutMessage2": {
+ "message": "ಕ್ಲಿಕ್ ಮಾಡಿ",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker **click here** to pop out your window.'"
+ },
+ "sendFirefoxCustomDatePopoutMessage3": {
+ "message": "ನಿಮ್ಮ ವಿಂಡೋವನ್ನು ಪಾಪ್ಔಟ್ ಮಾಡಲು.",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker click here **to pop out your window.**'"
+ },
+ "expirationDateIsInvalid": {
+ "message": "ಒದಗಿಸಿದ ಮುಕ್ತಾಯ ದಿನಾಂಕವು ಮಾನ್ಯವಾಗಿಲ್ಲ."
+ },
+ "deletionDateIsInvalid": {
+ "message": "ಒದಗಿಸಿದ ಅಳಿಸುವ ದಿನಾಂಕವು ಮಾನ್ಯವಾಗಿಲ್ಲ."
+ },
+ "expirationDateAndTimeRequired": {
+ "message": "ಮುಕ್ತಾಯ ದಿನಾಂಕ ಮತ್ತು ಸಮಯ ಅಗತ್ಯವಿದೆ."
+ },
+ "deletionDateAndTimeRequired": {
+ "message": "ಅಳಿಸುವ ದಿನಾಂಕ ಮತ್ತು ಸಮಯ ಅಗತ್ಯವಿದೆ."
+ },
+ "dateParsingError": {
+ "message": "ನಿಮ್ಮ ಅಳಿಸುವಿಕೆ ಮತ್ತು ಮುಕ್ತಾಯ ದಿನಾಂಕಗಳನ್ನು ಉಳಿಸುವಲ್ಲಿ ದೋಷ ಕಂಡುಬಂದಿದೆ."
+ },
+ "hideEmail": {
+ "message": "ಸ್ವೀಕರಿಸುವವರಿಂದ ನನ್ನ ಇಮೇಲ್ ವಿಳಾಸವನ್ನು ಮರೆಮಾಡಿ."
+ },
+ "sendOptionsPolicyInEffect": {
+ "message": "ಒಂದು ಅಥವಾ ಹೆಚ್ಚಿನ ಸಂಸ್ಥೆಯ ನೀತಿಗಳು ನಿಮ್ಮ ಕಳುಹಿಸುವ ಆಯ್ಕೆಗಳ ಮೇಲೆ ಪರಿಣಾಮ ಬೀರುತ್ತವೆ."
+ },
+ "passwordPrompt": {
+ "message": "ಮಾಸ್ಟರ್ ಪಾಸ್ವರ್ಡ್ ಮರು-ಪ್ರಾಂಪ್ಟ್"
+ },
+ "passwordConfirmation": {
+ "message": "ಮಾಸ್ಟರ್ ಪಾಸ್ವರ್ಡ್ ದೃಢೀಕರಣ"
+ },
+ "passwordConfirmationDesc": {
+ "message": "ಮುಂದುವರಿಯಲು ಈ ಕ್ರಿಯೆಯನ್ನು ರಕ್ಷಿಸಲಾಗಿದೆ, ದಯವಿಟ್ಟು ನಿಮ್ಮ ಗುರುತನ್ನು ಪರಿಶೀಲಿಸಲು ನಿಮ್ಮ ಮಾಸ್ಟರ್ ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ಮರು ನಮೂದಿಸಿ."
+ },
+ "emailVerificationRequired": {
+ "message": "ಇಮೇಲ್ ಪರಿಶೀಲನೆ ಅಗತ್ಯವಿದೆ"
+ },
+ "emailVerificationRequiredDesc": {
+ "message": "ಈ ವೈಶಿಷ್ಟ್ಯವನ್ನು ಬಳಸಲು ನಿಮ್ಮ ಇಮೇಲ್ ಅನ್ನು ನೀವು ಪರಿಶೀಲಿಸಬೇಕು. ವೆಬ್ ವಾಲ್ಟ್ನಲ್ಲಿ ನಿಮ್ಮ ಇಮೇಲ್ ಅನ್ನು ನೀವು ಪರಿಶೀಲಿಸಬಹುದು."
+ },
+ "updatedMasterPassword": {
+ "message": "Updated Master Password"
+ },
+ "updateMasterPassword": {
+ "message": "Update Master Password"
+ },
+ "updateMasterPasswordWarning": {
+ "message": "Your Master Password was recently changed by an administrator in your organization. In order to access the vault, you must update it now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour."
+ },
+ "resetPasswordPolicyAutoEnroll": {
+ "message": "Automatic Enrollment"
+ },
+ "resetPasswordAutoEnrollInviteWarning": {
+ "message": "This organization has an enterprise policy that will automatically enroll you in password reset. Enrollment will allow organization administrators to change your master password."
+ },
+ "selectFolder": {
+ "message": "Select folder..."
+ },
+ "ssoCompleteRegistration": {
+ "message": "In order to complete logging in with SSO, please set a master password to access and protect your vault."
+ },
+ "hours": {
+ "message": "Hours"
+ },
+ "minutes": {
+ "message": "Minutes"
+ },
+ "vaultTimeoutPolicyInEffect": {
+ "message": "Your organization policies are affecting your vault timeout. Maximum allowed Vault Timeout is $HOURS$ hour(s) and $MINUTES$ minute(s)",
+ "placeholders": {
+ "hours": {
+ "content": "$1",
+ "example": "5"
+ },
+ "minutes": {
+ "content": "$2",
+ "example": "5"
+ }
+ }
+ },
+ "vaultTimeoutToLarge": {
+ "message": "Your vault timeout exceeds the restrictions set by your organization."
+ },
+ "vaultExportDisabled": {
+ "message": "Vault Export Disabled"
+ },
+ "personalVaultExportPolicyInEffect": {
+ "message": "One or more organization policies prevents you from exporting your personal vault."
+ },
+ "copyCustomFieldNameInvalidElement": {
+ "message": "Unable to identify a valid form element. Try inspecting the HTML instead."
+ },
+ "copyCustomFieldNameNotUnique": {
+ "message": "No unique identifier found."
+ }
+}
diff --git a/src/iOS.Safari/Resources/_locales/ko/messages.json b/src/iOS.Safari/Resources/_locales/ko/messages.json
new file mode 100644
index 000000000..08b99e4b1
--- /dev/null
+++ b/src/iOS.Safari/Resources/_locales/ko/messages.json
@@ -0,0 +1,1817 @@
+{
+ "appName": {
+ "message": "Bitwarden"
+ },
+ "extName": {
+ "message": "Bitwarden - 무료 비밀번호 관리자",
+ "description": "Extension name, MUST be less than 40 characters (Safari restriction)"
+ },
+ "extDesc": {
+ "message": "당신의 모든 기기에서 사용할 수 있는, 안전한 무료 비밀번호 관리자입니다.",
+ "description": "Extension description"
+ },
+ "loginOrCreateNewAccount": {
+ "message": "안전 보관함에 접근하려면 로그인하거나 새 계정을 만드세요."
+ },
+ "createAccount": {
+ "message": "계정 만들기"
+ },
+ "login": {
+ "message": "로그인"
+ },
+ "enterpriseSingleSignOn": {
+ "message": "엔터프라이즈 통합 인증 (SSO)"
+ },
+ "cancel": {
+ "message": "취소"
+ },
+ "close": {
+ "message": "닫기"
+ },
+ "submit": {
+ "message": "보내기"
+ },
+ "emailAddress": {
+ "message": "이메일 주소"
+ },
+ "masterPass": {
+ "message": "마스터 비밀번호"
+ },
+ "masterPassDesc": {
+ "message": "마스터 비밀번호는 보관함을 열 때 필요한 비밀번호입니다. 절대 마스터 비밀번호를 잊어버리지 마세요. 잊어버리면 복구할 수 있는 방법이 없습니다."
+ },
+ "masterPassHintDesc": {
+ "message": "마스터 비밀번호 힌트는 마스터 비밀번호를 잊었을 때 도움이 될 수 있습니다."
+ },
+ "reTypeMasterPass": {
+ "message": "마스터 비밀번호 다시 입력"
+ },
+ "masterPassHint": {
+ "message": "마스터 비밀번호 힌트 (선택)"
+ },
+ "tab": {
+ "message": "탭"
+ },
+ "myVault": {
+ "message": "내 보관함"
+ },
+ "tools": {
+ "message": "도구"
+ },
+ "settings": {
+ "message": "설정"
+ },
+ "currentTab": {
+ "message": "현재 탭"
+ },
+ "copyPassword": {
+ "message": "비밀번호 복사"
+ },
+ "copyNote": {
+ "message": "메모 복사"
+ },
+ "copyUri": {
+ "message": "URI 복사"
+ },
+ "copyUsername": {
+ "message": "사용자 이름 복사"
+ },
+ "copyNumber": {
+ "message": "번호 복사"
+ },
+ "copySecurityCode": {
+ "message": "보안 코드 복사"
+ },
+ "autoFill": {
+ "message": "자동 완성"
+ },
+ "generatePasswordCopied": {
+ "message": "비밀번호 생성 및 클립보드에 복사"
+ },
+ "copyElementIdentifier": {
+ "message": "사용자 지정 필드 이름 복사"
+ },
+ "noMatchingLogins": {
+ "message": "사용할 수 있는 로그인이 없습니다."
+ },
+ "vaultLocked": {
+ "message": "보관함이 잠겨 있습니다."
+ },
+ "vaultLoggedOut": {
+ "message": "보관함이 잠겼습니다."
+ },
+ "autoFillInfo": {
+ "message": "이 탭의 자동 완성에 사용할 수 있는 로그인이 없습니다."
+ },
+ "addLogin": {
+ "message": "로그인 추가"
+ },
+ "addItem": {
+ "message": "항목 추가"
+ },
+ "passwordHint": {
+ "message": "비밀번호 힌트"
+ },
+ "enterEmailToGetHint": {
+ "message": "마스터 비밀번호 힌트를 받으려면 계정의 이메일 주소를 입력하세요."
+ },
+ "getMasterPasswordHint": {
+ "message": "마스터 비밀번호 힌트 얻기"
+ },
+ "continue": {
+ "message": "계속"
+ },
+ "verificationCode": {
+ "message": "인증 코드"
+ },
+ "account": {
+ "message": "계정"
+ },
+ "changeMasterPassword": {
+ "message": "마스터 비밀번호 변경"
+ },
+ "fingerprintPhrase": {
+ "message": "지문 구절",
+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
+ },
+ "yourAccountsFingerprint": {
+ "message": "계정 지문 구절",
+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
+ },
+ "twoStepLogin": {
+ "message": "2단계 인증"
+ },
+ "logOut": {
+ "message": "로그아웃"
+ },
+ "about": {
+ "message": "정보"
+ },
+ "version": {
+ "message": "버전"
+ },
+ "save": {
+ "message": "저장"
+ },
+ "move": {
+ "message": "이동"
+ },
+ "addFolder": {
+ "message": "폴더 추가"
+ },
+ "name": {
+ "message": "이름"
+ },
+ "editFolder": {
+ "message": "폴더 편집"
+ },
+ "deleteFolder": {
+ "message": "폴더 삭제"
+ },
+ "folders": {
+ "message": "폴더"
+ },
+ "noFolders": {
+ "message": "폴더가 없습니다."
+ },
+ "helpFeedback": {
+ "message": "도움말 및 의견"
+ },
+ "sync": {
+ "message": "동기화"
+ },
+ "syncVaultNow": {
+ "message": "지금 보관함 동기화"
+ },
+ "lastSync": {
+ "message": "마지막 동기화:"
+ },
+ "passGen": {
+ "message": "비밀번호 생성기"
+ },
+ "generator": {
+ "message": "생성기",
+ "description": "Short for 'Password Generator'."
+ },
+ "passGenInfo": {
+ "message": "유일무이하고 강력한 비밀번호를 자동으로 생성합니다."
+ },
+ "bitWebVault": {
+ "message": "Bitwarden 웹 보관함"
+ },
+ "importItems": {
+ "message": "항목 가져오기"
+ },
+ "select": {
+ "message": "선택"
+ },
+ "generatePassword": {
+ "message": "비밀번호 생성"
+ },
+ "regeneratePassword": {
+ "message": "비밀번호 재생성"
+ },
+ "options": {
+ "message": "옵션"
+ },
+ "length": {
+ "message": "길이"
+ },
+ "numWords": {
+ "message": "단어 수"
+ },
+ "wordSeparator": {
+ "message": "구분 기호"
+ },
+ "capitalize": {
+ "message": "첫 글자를 대문자로",
+ "description": "Make the first letter of a work uppercase."
+ },
+ "includeNumber": {
+ "message": "숫자 포함"
+ },
+ "minNumbers": {
+ "message": "숫자 최소 개수"
+ },
+ "minSpecial": {
+ "message": "특수 문자 최소 개수"
+ },
+ "avoidAmbChar": {
+ "message": "모호한 문자 사용 안 함"
+ },
+ "searchVault": {
+ "message": "보관함 검색"
+ },
+ "edit": {
+ "message": "편집"
+ },
+ "view": {
+ "message": "보기"
+ },
+ "noItemsInList": {
+ "message": "항목이 없습니다."
+ },
+ "itemInformation": {
+ "message": "항목 정보"
+ },
+ "username": {
+ "message": "사용자 이름"
+ },
+ "password": {
+ "message": "비밀번호"
+ },
+ "passphrase": {
+ "message": "패스프레이즈"
+ },
+ "favorite": {
+ "message": "즐겨찾기"
+ },
+ "notes": {
+ "message": "메모"
+ },
+ "note": {
+ "message": "메모"
+ },
+ "editItem": {
+ "message": "항목 편집"
+ },
+ "folder": {
+ "message": "폴더"
+ },
+ "deleteItem": {
+ "message": "항목 삭제"
+ },
+ "viewItem": {
+ "message": "항목 보기"
+ },
+ "launch": {
+ "message": "열기"
+ },
+ "website": {
+ "message": "웹 사이트"
+ },
+ "toggleVisibility": {
+ "message": "표시 전환"
+ },
+ "manage": {
+ "message": "관리"
+ },
+ "other": {
+ "message": "기타"
+ },
+ "rateExtension": {
+ "message": "확장 프로그램 평가"
+ },
+ "rateExtensionDesc": {
+ "message": "좋은 리뷰를 남겨 저희를 도와주세요!"
+ },
+ "browserNotSupportClipboard": {
+ "message": "사용하고 있는 웹 브라우저가 쉬운 클립보드 복사를 지원하지 않습니다. 직접 복사하세요."
+ },
+ "verifyMasterPassword": {
+ "message": "마스터 비밀번호 확인"
+ },
+ "yourVaultIsLocked": {
+ "message": "보관함이 잠겨 있습니다. 마스터 비밀번호를 입력하여 계속하세요."
+ },
+ "unlock": {
+ "message": "잠금 해제"
+ },
+ "loggedInAsOn": {
+ "message": "$HOSTNAME$ 에 $EMAIL$ 로 로그인했습니다.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "name@example.com"
+ },
+ "hostname": {
+ "content": "$2",
+ "example": "bitwarden.com"
+ }
+ }
+ },
+ "invalidMasterPassword": {
+ "message": "잘못된 마스터 비밀번호"
+ },
+ "vaultTimeout": {
+ "message": "보관함 시간 제한"
+ },
+ "lockNow": {
+ "message": "지금 잠그기"
+ },
+ "immediately": {
+ "message": "즉시"
+ },
+ "tenSeconds": {
+ "message": "10초"
+ },
+ "twentySeconds": {
+ "message": "20초"
+ },
+ "thirtySeconds": {
+ "message": "30초"
+ },
+ "oneMinute": {
+ "message": "1분"
+ },
+ "twoMinutes": {
+ "message": "2분"
+ },
+ "fiveMinutes": {
+ "message": "5분"
+ },
+ "fifteenMinutes": {
+ "message": "15분"
+ },
+ "thirtyMinutes": {
+ "message": "30분"
+ },
+ "oneHour": {
+ "message": "1시간"
+ },
+ "fourHours": {
+ "message": "4시간"
+ },
+ "onLocked": {
+ "message": "시스템 잠금 시"
+ },
+ "onRestart": {
+ "message": "브라우저 다시 시작 시"
+ },
+ "never": {
+ "message": "잠그지 않음"
+ },
+ "security": {
+ "message": "보안"
+ },
+ "errorOccurred": {
+ "message": "오류가 발생했습니다"
+ },
+ "emailRequired": {
+ "message": "이메일은 반드시 입력해야 합니다."
+ },
+ "invalidEmail": {
+ "message": "잘못된 이메일 주소입니다."
+ },
+ "masterPassRequired": {
+ "message": "마스터 비밀번호는 반드시 입력해야 합니다."
+ },
+ "masterPassLength": {
+ "message": "마스터 비밀번호는 최소 8자 이상이어야 합니다."
+ },
+ "masterPassDoesntMatch": {
+ "message": "마스터 비밀번호 확인과 마스터 비밀번호가 일치하지 않습니다."
+ },
+ "newAccountCreated": {
+ "message": "계정 생성이 완료되었습니다! 이제 로그인하실 수 있습니다."
+ },
+ "masterPassSent": {
+ "message": "마스터 비밀번호 힌트가 담긴 이메일을 보냈습니다."
+ },
+ "verificationCodeRequired": {
+ "message": "인증 코드는 반드시 입력해야 합니다."
+ },
+ "valueCopied": {
+ "message": "$VALUE$를 클립보드에 복사함",
+ "description": "Value has been copied to the clipboard.",
+ "placeholders": {
+ "value": {
+ "content": "$1",
+ "example": "Password"
+ }
+ }
+ },
+ "autofillError": {
+ "message": "선택한 항목을 이 페이지에서 자동 완성할 수 없습니다. 대신 정보를 직접 복사 / 붙여넣기하여 사용하십시오."
+ },
+ "loggedOut": {
+ "message": "로그아웃됨"
+ },
+ "loginExpired": {
+ "message": "로그인 세션이 만료되었습니다."
+ },
+ "logOutConfirmation": {
+ "message": "정말 로그아웃하시겠습니까?"
+ },
+ "yes": {
+ "message": "예"
+ },
+ "no": {
+ "message": "아니오"
+ },
+ "unexpectedError": {
+ "message": "예기치 못한 오류가 발생했습니다."
+ },
+ "nameRequired": {
+ "message": "이름은 반드시 입력해야 합니다."
+ },
+ "addedFolder": {
+ "message": "폴더 추가함"
+ },
+ "changeMasterPass": {
+ "message": "마스터 비밀번호 변경"
+ },
+ "changeMasterPasswordConfirmation": {
+ "message": "bitwarden.com 웹 보관함에서 마스터 비밀번호를 바꿀 수 있습니다. 지금 웹 사이트를 방문하시겠습니까?"
+ },
+ "twoStepLoginConfirmation": {
+ "message": "2단계 인증은 보안 키, 인증 앱, SMS, 전화 통화 등의 다른 기기로 사용자의 로그인 시도를 검증하여 사용자의 계정을 더욱 안전하게 만듭니다. 2단계 인증은 bitwarden.com 웹 보관함에서 활성화할 수 있습니다. 지금 웹 사이트를 방문하시겠습니까?"
+ },
+ "editedFolder": {
+ "message": "폴더 편집함"
+ },
+ "deleteFolderConfirmation": {
+ "message": "정말 이 폴더를 삭제하시겠습니까?"
+ },
+ "deletedFolder": {
+ "message": "폴더 삭제함"
+ },
+ "gettingStartedTutorial": {
+ "message": "시작하기 튜토리얼"
+ },
+ "gettingStartedTutorialVideo": {
+ "message": "브라우저 확장 프로그램을 최대한 활용하는 방법을 알아보려면 시작하기 튜토리얼을 확인하세요."
+ },
+ "syncingComplete": {
+ "message": "동기화 완료"
+ },
+ "syncingFailed": {
+ "message": "동기화 실패"
+ },
+ "passwordCopied": {
+ "message": "비밀번호를 클립보드에 복사함"
+ },
+ "uri": {
+ "message": "URI"
+ },
+ "uriPosition": {
+ "message": "URI $POSITION$",
+ "description": "A listing of URIs. Ex: URI 1, URI 2, URI 3, etc.",
+ "placeholders": {
+ "position": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "newUri": {
+ "message": "새 URI"
+ },
+ "addedItem": {
+ "message": "항목 추가함"
+ },
+ "editedItem": {
+ "message": "항목 편집함"
+ },
+ "deleteItemConfirmation": {
+ "message": "정말로 휴지통으로 이동시킬까요?"
+ },
+ "deletedItem": {
+ "message": "항목 삭제함"
+ },
+ "overwritePassword": {
+ "message": "비밀번호 덮어쓰기"
+ },
+ "overwritePasswordConfirmation": {
+ "message": "정말 현재 비밀번호를 덮어쓰시겠습니까?"
+ },
+ "searchFolder": {
+ "message": "폴더 검색"
+ },
+ "searchCollection": {
+ "message": "컬렉션 검색"
+ },
+ "searchType": {
+ "message": "검색 유형"
+ },
+ "noneFolder": {
+ "message": "폴더 없음",
+ "description": "This is the folder for uncategorized items"
+ },
+ "disableAddLoginNotification": {
+ "message": "로그인 추가 알림 사용 안 함"
+ },
+ "addLoginNotificationDesc": {
+ "message": "\"로그인 추가 알림\"을 사용하면 새 로그인을 사용할 때마다 보관함에 그 로그인을 추가할 것인지 물어봅니다."
+ },
+ "dontShowCardsCurrentTab": {
+ "message": "탭 페이지에 카드 표시 안 함"
+ },
+ "dontShowCardsCurrentTabDesc": {
+ "message": "보관함의 카드 항목은 쉽게 자동 완성할 수 있게끔 '현재 탭' 페이지에 나열되어 있습니다."
+ },
+ "dontShowIdentitiesCurrentTab": {
+ "message": "탭 페이지에 신원 표시 안 함"
+ },
+ "dontShowIdentitiesCurrentTabDesc": {
+ "message": "보관함의 신원 항목은 쉽게 자동 완성할 수 있게끔 '현재 탭' 페이지에 나열되어 있습니다."
+ },
+ "clearClipboard": {
+ "message": "클립보드 비우기",
+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
+ },
+ "clearClipboardDesc": {
+ "message": "자동으로 클립보드에 복사된 값을 제거합니다.",
+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
+ },
+ "notificationAddDesc": {
+ "message": "Bitwarden이 이 비밀번호를 기억하도록 하시겠습니까?"
+ },
+ "notificationAddSave": {
+ "message": "예, 지금 저장하겠습니다."
+ },
+ "notificationNeverSave": {
+ "message": "이 사이트에는 사용 안 함"
+ },
+ "disableChangedPasswordNotification": {
+ "message": "비밀번호 변경 알림 사용 안 함"
+ },
+ "disableChangedPasswordNotificationDesc": {
+ "message": "\"비밀번호 변경 알림\"을 사용하면 사용자가 웹 사이트에서 비밀번호를 변경했을 경우, 보관함에 저장된 비밀번호를 업데이트할 것인지 자동으로 물어봅니다."
+ },
+ "notificationChangeDesc": {
+ "message": "Bitwarden에 저장되어 있는 비밀번호를 이 비밀번호로 변경하시겠습니까?"
+ },
+ "notificationChangeSave": {
+ "message": "예, 지금 변경하겠습니다."
+ },
+ "disableContextMenuItem": {
+ "message": "오른쪽 클릭 메뉴 옵션 사용 안 함"
+ },
+ "disableContextMenuItemDesc": {
+ "message": "오른쪽 클릭 메뉴 옵션을 사용하면 비밀번호 생성이나 현재 탭 웹 사이트의 로그인에 빠르게 접근할 수 있습니다."
+ },
+ "defaultUriMatchDetection": {
+ "message": "기본 URI 일치 인식",
+ "description": "Default URI match detection for auto-fill."
+ },
+ "defaultUriMatchDetectionDesc": {
+ "message": "자동 완성 등의 작업에서 각 로그인 항목의 URI 일치 감지를 처리할 기본 방법을 선택하세요."
+ },
+ "theme": {
+ "message": "테마"
+ },
+ "themeDesc": {
+ "message": "애플리케이션의 색상 테마를 변경합니다."
+ },
+ "dark": {
+ "message": "어두운 테마",
+ "description": "Dark color"
+ },
+ "light": {
+ "message": "밝은 테마",
+ "description": "Light color"
+ },
+ "solarizedDark": {
+ "message": "Solarized Dark",
+ "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated."
+ },
+ "exportVault": {
+ "message": "보관함 내보내기"
+ },
+ "fileFormat": {
+ "message": "파일 형식"
+ },
+ "warning": {
+ "message": "경고",
+ "description": "WARNING (should stay in capitalized letters if the language permits)"
+ },
+ "confirmVaultExport": {
+ "message": "보관함 내보내기 확인"
+ },
+ "exportWarningDesc": {
+ "message": "내보내기는 보관함 데이터가 암호화되지 않은 형식으로 포함됩니다. 내보낸 파일을 안전하지 않은 채널(예: 이메일)을 통해 저장하거나 보내지 마십시오. 사용이 끝난 후에는 즉시 삭제하십시오."
+ },
+ "encExportKeyWarningDesc": {
+ "message": "이 내보내기는 계정의 암호화 키를 사용하여 데이터를 암호화합니다. 추후 계정의 암호화 키를 교체할 경우 다시 내보내기를 진행해야 합니다. 그러지 않을 경우 이 내보내기 파일을 해독할 수 없게 됩니다."
+ },
+ "encExportAccountWarningDesc": {
+ "message": "모든 Bitwarden 사용자 계정은 고유한 계정 암호화 키를 가지고 있습니다. 따라서, 다른 계정에서는 암호화된 내보내기를 가져올 수 없습니다."
+ },
+ "exportMasterPassword": {
+ "message": "보관함 데이터를 내보내려면 마스터 비밀번호를 입력하세요."
+ },
+ "shared": {
+ "message": "공유됨"
+ },
+ "learnOrg": {
+ "message": "조직에 대해 알아보기"
+ },
+ "learnOrgConfirmation": {
+ "message": "Bitwarden은 조직용 계정을 사용하면 사용자의 보관함을 타인에게 공유할 수 있습니다. bitwarden.com 웹 사이트를 방문하여 더 자세히 알아보시겠습니까?"
+ },
+ "moveToOrganization": {
+ "message": "조직으로 이동하기"
+ },
+ "share": {
+ "message": "공유"
+ },
+ "movedItemToOrg": {
+ "message": "$ITEMNAME$이(가) $ORGNAME$(으)로 이동됨",
+ "placeholders": {
+ "itemname": {
+ "content": "$1",
+ "example": "Secret Item"
+ },
+ "orgname": {
+ "content": "$2",
+ "example": "Company Name"
+ }
+ }
+ },
+ "moveToOrgDesc": {
+ "message": "이 항목을 이동할 조직을 선택하십시오. 항목이 조직으로 이동되면 소유권이 조직으로 이전됩니다. 일단 이동되면, 더는 이동된 항목의 직접적인 소유자가 아니게 됩니다."
+ },
+ "learnMore": {
+ "message": "더 알아보기"
+ },
+ "authenticatorKeyTotp": {
+ "message": "인증 키 (TOTP)"
+ },
+ "verificationCodeTotp": {
+ "message": "인증 코드 (TOTP)"
+ },
+ "copyVerificationCode": {
+ "message": "인증 코드 복사"
+ },
+ "attachments": {
+ "message": "첨부 파일"
+ },
+ "deleteAttachment": {
+ "message": "첨부 파일 삭제"
+ },
+ "deleteAttachmentConfirmation": {
+ "message": "정말 이 첨부 파일을 삭제하시겠습니까?"
+ },
+ "deletedAttachment": {
+ "message": "첨부 파일 삭제함"
+ },
+ "newAttachment": {
+ "message": "새 첨부 파일 추가"
+ },
+ "noAttachments": {
+ "message": "첨부 파일이 없습니다."
+ },
+ "attachmentSaved": {
+ "message": "첨부 파일을 저장했습니다."
+ },
+ "file": {
+ "message": "파일"
+ },
+ "selectFile": {
+ "message": "파일을 선택하세요."
+ },
+ "maxFileSize": {
+ "message": "최대 파일 크기는 500MB입니다."
+ },
+ "featureUnavailable": {
+ "message": "기능 사용할 수 없음"
+ },
+ "updateKey": {
+ "message": "이 기능을 사용하려면 암호화 키를 업데이트해야 합니다."
+ },
+ "premiumMembership": {
+ "message": "프리미엄 멤버십"
+ },
+ "premiumManage": {
+ "message": "멤버십 관리"
+ },
+ "premiumManageAlert": {
+ "message": "bitwarden.com 웹 보관함에서 멤버십을 관리할 수 있습니다. 지금 웹 사이트를 방문하시겠습니까?"
+ },
+ "premiumRefresh": {
+ "message": "멤버십 새로 고침"
+ },
+ "premiumNotCurrentMember": {
+ "message": "프리미엄 사용자가 아닙니다."
+ },
+ "premiumSignUpAndGet": {
+ "message": "프리미엄 멤버십에 가입하면 얻을 수 있는 것:"
+ },
+ "ppremiumSignUpStorage": {
+ "message": "1GB의 암호화된 파일 저장소."
+ },
+ "ppremiumSignUpTwoStep": {
+ "message": "YubiKey나 FIDO U2F, Duo 등의 추가적인 2단계 인증 옵션."
+ },
+ "ppremiumSignUpReports": {
+ "message": "보관함을 안전하게 유지하기 위한 암호 위생, 계정 상태, 데이터 유출 보고서"
+ },
+ "ppremiumSignUpTotp": {
+ "message": "보관함에 등록된 로그인 항목을 위한 TOTP 인증 코드(2FA) 생성기."
+ },
+ "ppremiumSignUpSupport": {
+ "message": "고객 지원 우선 순위 제공."
+ },
+ "ppremiumSignUpFuture": {
+ "message": "앞으로 추가될 모든 프리미엄 기능을 사용할 수 있습니다. 기대하세요!"
+ },
+ "premiumPurchase": {
+ "message": "프리미엄 멤버십 구입"
+ },
+ "premiumPurchaseAlert": {
+ "message": "bitwarden.com 웹 보관함에서 프리미엄 멤버십을 구입할 수 있습니다. 지금 웹 사이트를 방문하시겠습니까?"
+ },
+ "premiumCurrentMember": {
+ "message": "프리미엄 사용자입니다!"
+ },
+ "premiumCurrentMemberThanks": {
+ "message": "Bitwarden을 지원해 주셔서 감사합니다."
+ },
+ "premiumPrice": {
+ "message": "이 모든 기능을 연 $PRICE$에 이용하실 수 있습니다!",
+ "placeholders": {
+ "price": {
+ "content": "$1",
+ "example": "$10"
+ }
+ }
+ },
+ "refreshComplete": {
+ "message": "새로 고침 완료"
+ },
+ "disableAutoTotpCopy": {
+ "message": "TOTP 자동 복사 사용 안 함"
+ },
+ "disableAutoTotpCopyDesc": {
+ "message": "로그인에 인증 키가 연결되어 있을 경우, 그 로그인을 자동 완성할 때마다 TOTP 인증 코드가 클립보드에 자동으로 복사됩니다."
+ },
+ "disableAutoBiometricsPrompt": {
+ "message": "시작할 때 생체 인증 요구하지 않음"
+ },
+ "premiumRequired": {
+ "message": "프리미엄 멤버십 필요"
+ },
+ "premiumRequiredDesc": {
+ "message": "이 기능을 사용하려면 프리미엄 멤버십이 필요합니다."
+ },
+ "enterVerificationCodeApp": {
+ "message": "인증 앱에서 6자리 인증 코드를 입력하세요."
+ },
+ "enterVerificationCodeEmail": {
+ "message": "$EMAIL$ 주소로 전송된 6자리 인증 코드를 입력하세요.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "example@gmail.com"
+ }
+ }
+ },
+ "verificationCodeEmailSent": {
+ "message": "$EMAIL$ 주소로 인증 이메일을 보냈습니다.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "example@gmail.com"
+ }
+ }
+ },
+ "rememberMe": {
+ "message": "기억하기"
+ },
+ "sendVerificationCodeEmailAgain": {
+ "message": "인증 코드 이메일 다시 보내기"
+ },
+ "useAnotherTwoStepMethod": {
+ "message": "다른 2단계 인증 사용"
+ },
+ "insertYubiKey": {
+ "message": "YubiKey를 컴퓨터의 USB 포트에 삽입하고 이 버튼을 누르세요."
+ },
+ "insertU2f": {
+ "message": "보안 키를 컴퓨터의 USB 포트에 삽입하고 버튼이 있는 경우 누르세요."
+ },
+ "webAuthnNewTab": {
+ "message": "새 탭에서 WebAuthn 2단계 인증을 계속하세요."
+ },
+ "webAuthnNewTabOpen": {
+ "message": "새 탭 열기"
+ },
+ "webAuthnAuthenticate": {
+ "message": "WebAuthn 인증"
+ },
+ "loginUnavailable": {
+ "message": "로그인 불가능"
+ },
+ "noTwoStepProviders": {
+ "message": "이 계정은 2단계 인증을 사용합니다. 그러나 설정된 2단계 인증 중 이 웹 브라우저에서 지원하는 방식이 없습니다."
+ },
+ "noTwoStepProviders2": {
+ "message": "지원하는 웹 브라우저(Chrome 등)를 사용하거나 더 많은 브라우저를 지원하는 2단계 인증 방식(인증 앱 등)을 추가하세요."
+ },
+ "twoStepOptions": {
+ "message": "2단계 인증 옵션"
+ },
+ "recoveryCodeDesc": {
+ "message": "모든 2단계 인증을 사용할 수 없는 상황인가요? 복구 코드를 사용하여 계정의 모든 2단계 인증을 비활성화할 수 있습니다."
+ },
+ "recoveryCodeTitle": {
+ "message": "복구 코드"
+ },
+ "authenticatorAppTitle": {
+ "message": "인증 앱"
+ },
+ "authenticatorAppDesc": {
+ "message": "인증 앱(Authy, Google OTP 등)을 통하여 일회용 인증 코드를 생성합니다.",
+ "description": "'Authy' and 'Google Authenticator' are product names and should not be translated."
+ },
+ "yubiKeyTitle": {
+ "message": "YubiKey OTP 보안 키"
+ },
+ "yubiKeyDesc": {
+ "message": "YubiKey를 사용하여 사용자의 계정에 접근합니다. YubiKey 4, 4 Nano, 4C 및 NEO 기기를 사용할 수 있습니다."
+ },
+ "duoDesc": {
+ "message": "Duo Mobile 앱, SMS, 전화 통화를 사용한 Duo Security 또는 U2F 보안 키를 사용하여 인증하세요.",
+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
+ },
+ "duoOrganizationDesc": {
+ "message": "Duo Mobile 앱, SMS, 전화 통화를 사용한 조직용 Duo Security 또는 U2F 보안 키를 사용하여 인증하세요.",
+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
+ },
+ "webAuthnTitle": {
+ "message": "FIDO2 WebAuthn"
+ },
+ "webAuthnDesc": {
+ "message": "WebAuthn이 활성화된 보안 키를 사용하여 계정에 접근하세요."
+ },
+ "emailTitle": {
+ "message": "이메일"
+ },
+ "emailDesc": {
+ "message": "인증 코드가 담긴 이메일을 다시 보냅니다."
+ },
+ "selfHostedEnvironment": {
+ "message": "자체 호스팅 환경"
+ },
+ "selfHostedEnvironmentFooter": {
+ "message": "온-프레미스 Bitwarden이 호스팅되고 있는 서버의 기본 URL을 지정하세요."
+ },
+ "customEnvironment": {
+ "message": "사용자 지정 환경"
+ },
+ "customEnvironmentFooter": {
+ "message": "고급 사용자 전용 설정입니다. 각 서비스의 기본 URL을 개별적으로 지정할 수 있습니다."
+ },
+ "baseUrl": {
+ "message": "서버 URL"
+ },
+ "apiUrl": {
+ "message": "API 서버 URL"
+ },
+ "webVaultUrl": {
+ "message": "웹 보관함 서버 URL"
+ },
+ "identityUrl": {
+ "message": "ID 서버 URL"
+ },
+ "notificationsUrl": {
+ "message": "알림 서버 URL"
+ },
+ "iconsUrl": {
+ "message": "아이콘 서버 URL"
+ },
+ "environmentSaved": {
+ "message": "환경 URL 값을 저장했습니다."
+ },
+ "enableAutoFillOnPageLoad": {
+ "message": "페이지 로드 시 자동 완성 사용"
+ },
+ "enableAutoFillOnPageLoadDesc": {
+ "message": "로그인 양식을 감지하면 웹 페이지 로드 시 자동 완성을 자동으로 수행합니다."
+ },
+ "experimentalFeature": {
+ "message": "현재 실험 중인 기능입니다. 위험을 감수하여 사용하세요."
+ },
+ "defaultAutoFillOnPageLoad": {
+ "message": "로그인 항목에 대한 기본 자동 완성 설정"
+ },
+ "defaultAutoFillOnPageLoadDesc": {
+ "message": "페이지 로드 시 자동 완성을 켠 뒤에는 각 로그인 항목별로 이 기능을 켜거나 끌 수 있습니다. 이 옵션은 해당 기능을 개별적으로 구성하지 않은 항목에 사용되는 기본 설정값입니다."
+ },
+ "itemAutoFillOnPageLoad": {
+ "message": "페이지 로드 시 자동 완성 (옵션에서 켜져 있을 경우)"
+ },
+ "autoFillOnPageLoadUseDefault": {
+ "message": "기본 설정 사용"
+ },
+ "autoFillOnPageLoadYes": {
+ "message": "페이지 로드 시 자동 완성"
+ },
+ "autoFillOnPageLoadNo": {
+ "message": "페이지 로드 시 자동 완성 안 함"
+ },
+ "commandOpenPopup": {
+ "message": "보관함 팝업 열기"
+ },
+ "commandOpenSidebar": {
+ "message": "사이드바에서 보관함 열기"
+ },
+ "commandAutofillDesc": {
+ "message": "현재 웹사이트에서 최근에 사용했던 로그인을 자동 완성합니다."
+ },
+ "commandGeneratePasswordDesc": {
+ "message": "새 무작위 비밀번호를 만들고 클립보드에 복사합니다."
+ },
+ "commandLockVaultDesc": {
+ "message": "보관함 잠그기"
+ },
+ "privateModeMessage": {
+ "message": "죄송합니다. 이 브라우저에서는 시크릿 창에서 이 창을 사용할 수 없습니다."
+ },
+ "customFields": {
+ "message": "사용자 지정 필드"
+ },
+ "copyValue": {
+ "message": "값 복사"
+ },
+ "value": {
+ "message": "값"
+ },
+ "newCustomField": {
+ "message": "새 사용자 지정 필드"
+ },
+ "dragToSort": {
+ "message": "드래그하여 정렬"
+ },
+ "cfTypeText": {
+ "message": "텍스트"
+ },
+ "cfTypeHidden": {
+ "message": "숨김"
+ },
+ "cfTypeBoolean": {
+ "message": "참 / 거짓"
+ },
+ "popup2faCloseMessage": {
+ "message": "인증 코드가 담긴 이메일을 확인하기 위해 팝업 창의 바깥쪽을 누르면 이 팝업이 닫힙니다. 팝업 창이 닫히는 것을 방지하기 위해 이 팝업을 새 창에서 다시 여시겠습니까?"
+ },
+ "popupU2fCloseMessage": {
+ "message": "이 브라우저의 팝업 창에서는 U2F 요청을 처리할 수 없습니다. U2F로 로그인할 수 있도록 이 창을 새 창에서 여시겠습니까?"
+ },
+ "disableFavicon": {
+ "message": "웹 사이트 아이콘 사용 안 함"
+ },
+ "disableFaviconDesc": {
+ "message": "웹 사이트 아이콘을 사용하면 보관함 각 항목 옆에 이미지를 보여줍니다."
+ },
+ "disableBadgeCounter": {
+ "message": "배지에 개수 표시 사용 안 함"
+ },
+ "disableBadgeCounterDesc": {
+ "message": "배지에는 보관함에 등록된 현재 페이지에 대한 로그인의 개수가 표시됩니다."
+ },
+ "cardholderName": {
+ "message": "카드 소유자 이름"
+ },
+ "number": {
+ "message": "번호"
+ },
+ "brand": {
+ "message": "브랜드"
+ },
+ "expirationMonth": {
+ "message": "만료 월"
+ },
+ "expirationYear": {
+ "message": "만료 연도"
+ },
+ "expiration": {
+ "message": "만료"
+ },
+ "january": {
+ "message": "1월"
+ },
+ "february": {
+ "message": "2월"
+ },
+ "march": {
+ "message": "3월"
+ },
+ "april": {
+ "message": "4월"
+ },
+ "may": {
+ "message": "5월"
+ },
+ "june": {
+ "message": "6월"
+ },
+ "july": {
+ "message": "7월"
+ },
+ "august": {
+ "message": "8월"
+ },
+ "september": {
+ "message": "9월"
+ },
+ "october": {
+ "message": "10월"
+ },
+ "november": {
+ "message": "11월"
+ },
+ "december": {
+ "message": "12월"
+ },
+ "securityCode": {
+ "message": "보안 코드"
+ },
+ "ex": {
+ "message": "예)"
+ },
+ "title": {
+ "message": "제목"
+ },
+ "mr": {
+ "message": "Mr"
+ },
+ "mrs": {
+ "message": "Mrs"
+ },
+ "ms": {
+ "message": "Ms"
+ },
+ "dr": {
+ "message": "Dr"
+ },
+ "firstName": {
+ "message": "이름"
+ },
+ "middleName": {
+ "message": "가운데 이름"
+ },
+ "lastName": {
+ "message": "성"
+ },
+ "identityName": {
+ "message": "ID 이름"
+ },
+ "company": {
+ "message": "회사"
+ },
+ "ssn": {
+ "message": "주민등록번호"
+ },
+ "passportNumber": {
+ "message": "여권 번호"
+ },
+ "licenseNumber": {
+ "message": "면허 번호"
+ },
+ "email": {
+ "message": "이메일"
+ },
+ "phone": {
+ "message": "전화번호"
+ },
+ "address": {
+ "message": "주소"
+ },
+ "address1": {
+ "message": "주소 1"
+ },
+ "address2": {
+ "message": "주소 2"
+ },
+ "address3": {
+ "message": "주소 3"
+ },
+ "cityTown": {
+ "message": "읍 / 면 / 동"
+ },
+ "stateProvince": {
+ "message": "시 / 도"
+ },
+ "zipPostalCode": {
+ "message": "우편번호"
+ },
+ "country": {
+ "message": "국가"
+ },
+ "type": {
+ "message": "유형"
+ },
+ "typeLogin": {
+ "message": "로그인"
+ },
+ "typeLogins": {
+ "message": "로그인"
+ },
+ "typeSecureNote": {
+ "message": "보안 메모"
+ },
+ "typeCard": {
+ "message": "카드"
+ },
+ "typeIdentity": {
+ "message": "신원"
+ },
+ "passwordHistory": {
+ "message": "비밀번호 변경 기록"
+ },
+ "back": {
+ "message": "뒤로"
+ },
+ "collections": {
+ "message": "컬렉션"
+ },
+ "favorites": {
+ "message": "즐겨찾기"
+ },
+ "popOutNewWindow": {
+ "message": "새 창에서 보기"
+ },
+ "refresh": {
+ "message": "새로 고침"
+ },
+ "cards": {
+ "message": "카드"
+ },
+ "identities": {
+ "message": "신원"
+ },
+ "logins": {
+ "message": "로그인"
+ },
+ "secureNotes": {
+ "message": "보안 메모"
+ },
+ "clear": {
+ "message": "삭제",
+ "description": "To clear something out. example: To clear browser history."
+ },
+ "checkPassword": {
+ "message": "비밀번호가 노출되었는지 확인합니다."
+ },
+ "passwordExposed": {
+ "message": "이 비밀번호는 데이터 유출에 $VALUE$회 노출되었습니다. 비밀번호를 변경하는 것이 좋습니다.",
+ "placeholders": {
+ "value": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "passwordSafe": {
+ "message": "이 비밀번호는 데이터 유출 목록에 없습니다. 사용하기에 안전한 비밀번호입니다."
+ },
+ "baseDomain": {
+ "message": "기본 도메인"
+ },
+ "host": {
+ "message": "호스트",
+ "description": "A URL's host value. For example, the host of https://sub.domain.com:443 is 'sub.domain.com:443'."
+ },
+ "exact": {
+ "message": "정확히 일치"
+ },
+ "startsWith": {
+ "message": "...으로 시작"
+ },
+ "regEx": {
+ "message": "정규 표현식",
+ "description": "A programming term, also known as 'RegEx'."
+ },
+ "matchDetection": {
+ "message": "일치 인식",
+ "description": "URI match detection for auto-fill."
+ },
+ "defaultMatchDetection": {
+ "message": "기본 일치 인식",
+ "description": "Default URI match detection for auto-fill."
+ },
+ "toggleOptions": {
+ "message": "표시 / 숨기기"
+ },
+ "toggleCurrentUris": {
+ "message": "현재 URI 전환",
+ "description": "Toggle the display of the URIs of the currently open tabs in the browser."
+ },
+ "currentUri": {
+ "message": "현재 URI",
+ "description": "The URI of one of the current open tabs in the browser."
+ },
+ "organization": {
+ "message": "조직",
+ "description": "An entity of multiple related people (ex. a team or business organization)."
+ },
+ "types": {
+ "message": "유형"
+ },
+ "allItems": {
+ "message": "모든 항목"
+ },
+ "noPasswordsInList": {
+ "message": "비밀번호가 없습니다."
+ },
+ "remove": {
+ "message": "제거"
+ },
+ "default": {
+ "message": "기본값"
+ },
+ "dateUpdated": {
+ "message": "업데이트됨",
+ "description": "ex. Date this item was updated"
+ },
+ "datePasswordUpdated": {
+ "message": "비밀번호 업데이트됨",
+ "description": "ex. Date this password was updated"
+ },
+ "neverLockWarning": {
+ "message": "정말 \"잠그지 않음\" 옵션을 사용하시겠습니까? 잠금 옵션을 \"잠그지 않음\"으로 설정하면 사용자 보관함의 암호화 키를 사용자의 기기에 보관합니다. 이 옵션을 사용하기 전에 사용자의 기기가 잘 보호되어 있는 상태인지 확인하십시오."
+ },
+ "noOrganizationsList": {
+ "message": "속해 있는 조직이 없습니다. 조직에 속하면 다른 사용자들과 항목을 안전하게 공유할 수 있습니다."
+ },
+ "noCollectionsInList": {
+ "message": "컬렉션이 없습니다."
+ },
+ "ownership": {
+ "message": "소유자"
+ },
+ "whoOwnsThisItem": {
+ "message": "이 항목의 소유자는 누구입니까?"
+ },
+ "strong": {
+ "message": "강함",
+ "description": "ex. A strong password. Scale: Weak -> Good -> Strong"
+ },
+ "good": {
+ "message": "좋음",
+ "description": "ex. A good password. Scale: Weak -> Good -> Strong"
+ },
+ "weak": {
+ "message": "취약",
+ "description": "ex. A weak password. Scale: Weak -> Good -> Strong"
+ },
+ "weakMasterPassword": {
+ "message": "취약한 마스터 비밀번호"
+ },
+ "weakMasterPasswordDesc": {
+ "message": "선택한 마스터 비밀번호는 취약합니다. Bitwarden 계정을 확실히 보호하려면 강력한 마스터 비밀번호(혹은 패스프레이즈)를 사용해야 합니다. 정말 이 마스터 비밀번호를 사용하시겠습니까?"
+ },
+ "pin": {
+ "message": "PIN",
+ "description": "PIN code. Ex. The short code (often numeric) that you use to unlock a device."
+ },
+ "unlockWithPin": {
+ "message": "PIN 코드를 사용하여 잠금 해제"
+ },
+ "setYourPinCode": {
+ "message": "Bitwarden 잠금해제에 사용될 PIN 코드를 설정합니다. 이 애플리케이션에서 완전히 로그아웃할 경우 PIN 설정이 초기화됩니다."
+ },
+ "pinRequired": {
+ "message": "PIN 코드가 필요합니다."
+ },
+ "invalidPin": {
+ "message": "잘못된 PIN 코드입니다."
+ },
+ "verifyPin": {
+ "message": "PIN 확인"
+ },
+ "yourVaultIsLockedPinCode": {
+ "message": "보관함이 잠겨 있습니다. PIN 코드를 입력하여 계속하세요."
+ },
+ "unlockWithBiometrics": {
+ "message": "생체 인식을 사용하여 잠금 해제"
+ },
+ "awaitDesktop": {
+ "message": "데스크톱으로부터의 확인을 대기 중"
+ },
+ "awaitDesktopDesc": {
+ "message": "브라우저 생체 인식을 사용하기 위해서는 Bitwarden 데스크톱 앱에서 생체 인식을 이용하여 승인해주세요."
+ },
+ "lockWithMasterPassOnRestart": {
+ "message": "브라우저 다시 시작 시 마스터 비밀번호로 잠금"
+ },
+ "selectOneCollection": {
+ "message": "반드시 하나 이상의 컬렉션을 선택해야 합니다."
+ },
+ "cloneItem": {
+ "message": "항목 복제"
+ },
+ "clone": {
+ "message": "복제"
+ },
+ "passwordGeneratorPolicyInEffect": {
+ "message": "하나 이상의 단체 정책이 생성기 규칙에 영항을 미치고 있습니다."
+ },
+ "vaultTimeoutAction": {
+ "message": "보관함 시간 제한 초과시 동작"
+ },
+ "lock": {
+ "message": "잠금",
+ "description": "Verb form: to make secure or inaccesible by"
+ },
+ "trash": {
+ "message": "휴지통",
+ "description": "Noun: a special folder to hold deleted items"
+ },
+ "searchTrash": {
+ "message": "휴지통 검색"
+ },
+ "permanentlyDeleteItem": {
+ "message": "영구적으로 항목 삭제"
+ },
+ "permanentlyDeleteItemConfirmation": {
+ "message": "정말로 이 항목을 영구적으로 삭제하시겠습니까?"
+ },
+ "permanentlyDeletedItem": {
+ "message": "영구적으로 삭제된 항목"
+ },
+ "restoreItem": {
+ "message": "항목 복원"
+ },
+ "restoreItemConfirmation": {
+ "message": "정말 이 항목을 복원하시겠습니까?"
+ },
+ "restoredItem": {
+ "message": "복원된 항목"
+ },
+ "vaultTimeoutLogOutConfirmation": {
+ "message": "로그아웃하면 보관함에 대한 모든 접근이 제거되며 시간 제한을 초과하면 온라인 인증을 요구합니다. 정말로 이 설정을 사용하시겠습니까?"
+ },
+ "vaultTimeoutLogOutConfirmationTitle": {
+ "message": "시간 제한 초과시 동작 확인"
+ },
+ "autoFillAndSave": {
+ "message": "자동 완성 및 저장"
+ },
+ "autoFillSuccessAndSavedUri": {
+ "message": "항목을 자동 완성하고 URI를 저장함"
+ },
+ "autoFillSuccess": {
+ "message": "항목을 자동 완성함"
+ },
+ "setMasterPassword": {
+ "message": "마스터 비밀번호 설정"
+ },
+ "masterPasswordPolicyInEffect": {
+ "message": "하나 이상의 단체 정책이 마스터 비밀번호가 다음 사항을 따르도록 요구합니다:"
+ },
+ "policyInEffectMinComplexity": {
+ "message": "최소 복잡도 점수 $SCORE$",
+ "placeholders": {
+ "score": {
+ "content": "$1",
+ "example": "4"
+ }
+ }
+ },
+ "policyInEffectMinLength": {
+ "message": "최소 길이 $LENGTH$",
+ "placeholders": {
+ "length": {
+ "content": "$1",
+ "example": "14"
+ }
+ }
+ },
+ "policyInEffectUppercase": {
+ "message": "하나 이상의 대문자 포함"
+ },
+ "policyInEffectLowercase": {
+ "message": "하나 이상의 소문자 포함"
+ },
+ "policyInEffectNumbers": {
+ "message": "하나 이상의 숫자 포함"
+ },
+ "policyInEffectSpecial": {
+ "message": "하나 이상의 특수문자 포함 $CHARS$",
+ "placeholders": {
+ "chars": {
+ "content": "$1",
+ "example": "!@#$%^&*"
+ }
+ }
+ },
+ "masterPasswordPolicyRequirementsNotMet": {
+ "message": "새 마스터 비밀번호가 정책 요구 사항을 따르지 않습니다."
+ },
+ "acceptPolicies": {
+ "message": "이 박스를 체크하면 다음에 동의하는 것으로 간주됩니다:"
+ },
+ "acceptPoliciesError": {
+ "message": "서비스 약관 및 개인 정보 보호 정책을 확인하지 않았습니다."
+ },
+ "termsOfService": {
+ "message": "서비스 약관"
+ },
+ "privacyPolicy": {
+ "message": "개인 정보 보호 정책"
+ },
+ "hintEqualsPassword": {
+ "message": "비밀번호 힌트는 비밀번호와 같을 수 없습니다."
+ },
+ "ok": {
+ "message": "확인"
+ },
+ "desktopSyncVerificationTitle": {
+ "message": "데스크톱과의 동기화 인증"
+ },
+ "desktopIntegrationVerificationText": {
+ "message": "데스크톱 앱이 다음 지문 구절을 표시하는지 확인해주세요:"
+ },
+ "desktopIntegrationDisabledTitle": {
+ "message": "브라우저와 연결이 활성화되지 않았습니다"
+ },
+ "desktopIntegrationDisabledDesc": {
+ "message": "브라우저와 연결이 Bitwarden 데스크톱 앱에서 활성화되지 않았습니다. 데스크톱 앱의 설정에서 브라우저와 연결을 활성화해주세요."
+ },
+ "startDesktopTitle": {
+ "message": "Bitwarden 데스크톱 앱을 실행하세요"
+ },
+ "startDesktopDesc": {
+ "message": "이 기능을 사용하기 위해서는 Bitwarden 데스크톱 앱이 먼저 실행되어 있어야 합니다."
+ },
+ "errorEnableBiometricTitle": {
+ "message": "생체 인식을 활성화할 수 없음"
+ },
+ "errorEnableBiometricDesc": {
+ "message": "데스크톱 앱에서 작업이 취소되었습니다"
+ },
+ "nativeMessagingInvalidEncryptionDesc": {
+ "message": "데스크톱 앱에서 이 보안 통신 채널을 무효화했습니다. 다시 시도해 주세요."
+ },
+ "nativeMessagingInvalidEncryptionTitle": {
+ "message": "데스크톱과의 통신이 중단됨"
+ },
+ "nativeMessagingWrongUserDesc": {
+ "message": "데스크톱 앱에 다른 계정으로 로그인된 상태입니다. 두 앱에 같은 계정으로 로그인되어 있는지 확인해주세요."
+ },
+ "nativeMessagingWrongUserTitle": {
+ "message": "계정이 일치하지 않음"
+ },
+ "biometricsNotEnabledTitle": {
+ "message": "생체 인식이 활성화되지 않음"
+ },
+ "biometricsNotEnabledDesc": {
+ "message": "브라우저에서 생체 인식을 사용하기 위해서는 설정에서 데스크톱 생체 인식을 먼저 활성화해야 합니다."
+ },
+ "biometricsNotSupportedTitle": {
+ "message": "생체 인식이 지원되지 않음"
+ },
+ "biometricsNotSupportedDesc": {
+ "message": "이 기기에서는 생체 인식이 지원되지 않습니다."
+ },
+ "nativeMessaginPermissionErrorTitle": {
+ "message": "권한이 부여되지 않음"
+ },
+ "nativeMessaginPermissionErrorDesc": {
+ "message": "Bitwarden 데스크톱 앱과 통신할 권한이 부여되지 않은 상태에서는 브라우저 확장 프로그램에서 생체 인식을 사용할 수 없습니다. 다시 시도해 주세요."
+ },
+ "nativeMessaginPermissionSidebarTitle": {
+ "message": "권한 요청 오류"
+ },
+ "nativeMessaginPermissionSidebarDesc": {
+ "message": "사이드바에서는 이 동작을 수행할 수 없습니다. 팝업 혹은 새 창으로 열고 다시 시도해 주세요."
+ },
+ "personalOwnershipSubmitError": {
+ "message": "엔터프라이즈 정책으로 인해 개인 보관함에 항목을 저장할 수 없습니다. 조직에서 소유권 설정을 변경한 다음, 사용 가능한 컬렉션 중에서 선택해주세요."
+ },
+ "personalOwnershipPolicyInEffect": {
+ "message": "조직의 정책이 소유권 설정에 영향을 미치고 있습니다."
+ },
+ "excludedDomains": {
+ "message": "제외된 도메인"
+ },
+ "excludedDomainsDesc": {
+ "message": "Bitwarden은 이 도메인들에 대해 로그인 정보를 저장할 것인지 묻지 않습니다. 페이지를 새로고침해야 변경된 내용이 적용됩니다."
+ },
+ "excludedDomainsInvalidDomain": {
+ "message": "$DOMAIN$ 도메인은 유효한 도메인이 아닙니다.",
+ "placeholders": {
+ "domain": {
+ "content": "$1",
+ "example": "googlecom"
+ }
+ }
+ },
+ "send": {
+ "message": "Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "searchSends": {
+ "message": "Send 검색",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "addSend": {
+ "message": "Send 추가",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTypeText": {
+ "message": "텍스트"
+ },
+ "sendTypeFile": {
+ "message": "파일"
+ },
+ "allSends": {
+ "message": "모든 Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "maxAccessCountReached": {
+ "message": "최대 접근 횟수 도달"
+ },
+ "expired": {
+ "message": "만료됨"
+ },
+ "pendingDeletion": {
+ "message": "삭제 대기 중"
+ },
+ "passwordProtected": {
+ "message": "비밀번호로 보호됨"
+ },
+ "copySendLink": {
+ "message": "Send 링크 복사",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "removePassword": {
+ "message": "비밀번호 제거"
+ },
+ "delete": {
+ "message": "삭제"
+ },
+ "removedPassword": {
+ "message": "비밀번호 제거함"
+ },
+ "deletedSend": {
+ "message": "Send 삭제함",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendLink": {
+ "message": "링크 보내기",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "disabled": {
+ "message": "비활성화됨"
+ },
+ "removePasswordConfirmation": {
+ "message": "비밀번호를 제거하시겠습니까?"
+ },
+ "deleteSend": {
+ "message": "Send 삭제",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "deleteSendConfirmation": {
+ "message": "정말 이 Send를 삭제하시겠습니까?",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "editSend": {
+ "message": "Send 편집",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTypeHeader": {
+ "message": "어떤 유형의 Send인가요?",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendNameDesc": {
+ "message": "이 Send의 이름",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendFileDesc": {
+ "message": "전송하려는 파일"
+ },
+ "deletionDate": {
+ "message": "삭제 날짜"
+ },
+ "deletionDateDesc": {
+ "message": "이 Send가 정해진 일시에 영구적으로 삭제됩니다.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "expirationDate": {
+ "message": "만료 날짜"
+ },
+ "expirationDateDesc": {
+ "message": "설정할 경우, 이 Send에 대한 접근 권한이 정해진 일시에 만료됩니다.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "oneDay": {
+ "message": "1일"
+ },
+ "days": {
+ "message": "$DAYS$일",
+ "placeholders": {
+ "days": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "custom": {
+ "message": "사용자 지정"
+ },
+ "maximumAccessCount": {
+ "message": "최대 접근 횟수"
+ },
+ "maximumAccessCountDesc": {
+ "message": "설정할 경우, 최대 접근 횟수에 도달할 때 이 Send에 접근할 수 없게 됩니다.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendPasswordDesc": {
+ "message": "이 Send에 접근하기 위해 암호를 입력하도록 선택적으로 요구합니다.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendNotesDesc": {
+ "message": "이 Send에 대한 비공개 메모",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendDisableDesc": {
+ "message": "이 Send를 비활성화하여 아무도 접근할 수 없게 합니다.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendShareDesc": {
+ "message": "저장할 때 이 Send의 링크를 클립보드에 복사합니다.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTextDesc": {
+ "message": "전송하려는 텍스트"
+ },
+ "sendHideText": {
+ "message": "이 Send의 텍스트를 기본적으로 숨김",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "currentAccessCount": {
+ "message": "현재 접근 횟수"
+ },
+ "createSend": {
+ "message": "새 Send 생성",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "newPassword": {
+ "message": "새 비밀번호"
+ },
+ "sendDisabled": {
+ "message": "Send 비활성화됨",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendDisabledWarning": {
+ "message": "엔터프라이즈 정책으로 인해 이미 생성된 Send를 삭제하는 것만 허용됩니다.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "createdSend": {
+ "message": "Send 생성함",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "editedSend": {
+ "message": "Send 수정함",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendLinuxChromiumFileWarning": {
+ "message": "파일을 선택하려면 이 배너를 클릭하여 확장 프로그램을 사이드바에서 열거나, 불가능한 경우 새 창에서 여세요."
+ },
+ "sendFirefoxFileWarning": {
+ "message": "Firefox에서 파일을 선택할 경우, 이 배너를 클릭하여 확장 프로그램을 사이드바 혹은 새 창에서 여세요."
+ },
+ "sendSafariFileWarning": {
+ "message": "Safari에서 파일을 선택할 경우, 이 배너를 클릭하여 확장 프로그램을 새 창에서 여세요."
+ },
+ "sendFileCalloutHeader": {
+ "message": "시작하기 전에"
+ },
+ "sendFirefoxCustomDatePopoutMessage1": {
+ "message": "달력을 보고 날짜를 선택하려면",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read '**To use a calendar style date picker ** click here to pop out your window.'"
+ },
+ "sendFirefoxCustomDatePopoutMessage2": {
+ "message": "여기를 클릭하여",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker **click here** to pop out your window.'"
+ },
+ "sendFirefoxCustomDatePopoutMessage3": {
+ "message": "확장 프로그램을 새 창에서 여세요.",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker click here **to pop out your window.**'"
+ },
+ "expirationDateIsInvalid": {
+ "message": "제공된 만료 날짜가 유효하지 않습니다."
+ },
+ "deletionDateIsInvalid": {
+ "message": "제공된 삭제 날짜가 유효하지 않습니다."
+ },
+ "expirationDateAndTimeRequired": {
+ "message": "만료 날짜와 시간은 반드시 입력해야 합니다."
+ },
+ "deletionDateAndTimeRequired": {
+ "message": "삭제 날짜와 시간은 반드시 입력해야 합니다."
+ },
+ "dateParsingError": {
+ "message": "삭제 날짜와 만료 날짜를 저장하는 도중 오류가 발생했습니다."
+ },
+ "hideEmail": {
+ "message": "받는 사람으로부터 나의 이메일 주소 숨기기"
+ },
+ "sendOptionsPolicyInEffect": {
+ "message": "하나 이상의 단체 정책이 Send 설정에 영향을 미치고 있습니다."
+ },
+ "passwordPrompt": {
+ "message": "마스터 비밀번호 재확인"
+ },
+ "passwordConfirmation": {
+ "message": "마스터 비밀번호 확인"
+ },
+ "passwordConfirmationDesc": {
+ "message": "이 작업은 보호되어 있습니다. 계속하려면 마스터 비밀번호를 입력하여 신원을 인증하세요."
+ },
+ "emailVerificationRequired": {
+ "message": "이메일 인증 필요함"
+ },
+ "emailVerificationRequiredDesc": {
+ "message": "이 기능을 사용하려면 이메일 인증이 필요합니다. 웹 보관함에서 이메일을 인증할 수 있습니다."
+ },
+ "updatedMasterPassword": {
+ "message": "마스터 비밀번호 변경됨"
+ },
+ "updateMasterPassword": {
+ "message": "마스터 비밀번호 변경"
+ },
+ "updateMasterPasswordWarning": {
+ "message": "최근에 조직 관리자가 마스터 비밀번호를 변경했습니다. 보관함에 액세스하려면 지금 업데이트해야 합니다. 계속하면 현재 세션에서 로그아웃되며 다시 로그인해야 합니다. 다른 장치의 활성 세션은 최대 1시간 동안 계속 활성 상태로 유지될 수 있습니다."
+ },
+ "resetPasswordPolicyAutoEnroll": {
+ "message": "자동 등록"
+ },
+ "resetPasswordAutoEnrollInviteWarning": {
+ "message": "이 조직에는 자동으로 비밀번호 재설정에 등록하는 기업 정책이 있습니다. 등록하면 조직 관리자가 마스터 암호를 변경할 수 있습니다."
+ },
+ "selectFolder": {
+ "message": "폴더 선택..."
+ },
+ "ssoCompleteRegistration": {
+ "message": "SSO 로그인을 하기 위해서 보관함에 접근하고 보호할 수 있도록 마스터 비밀번호를 설정해주세요."
+ },
+ "hours": {
+ "message": "시"
+ },
+ "minutes": {
+ "message": "분"
+ },
+ "vaultTimeoutPolicyInEffect": {
+ "message": "조직 정책이 보관함 제한 시간에 영향을 미치고 있습니다. 최대 허용 보관함 제한 시간은 $HOURS$시간 $MINUTES$분입니다",
+ "placeholders": {
+ "hours": {
+ "content": "$1",
+ "example": "5"
+ },
+ "minutes": {
+ "content": "$2",
+ "example": "5"
+ }
+ }
+ },
+ "vaultTimeoutToLarge": {
+ "message": "볼트 제한 시간이 조직에서 설정한 제한을 초과합니다."
+ },
+ "vaultExportDisabled": {
+ "message": "보관함 내보내기 비활성화됨"
+ },
+ "personalVaultExportPolicyInEffect": {
+ "message": "하나 이상의 조직 정책이 개인 보관함을 내보내는 것을 제한하고 있습니다."
+ },
+ "copyCustomFieldNameInvalidElement": {
+ "message": "유효한 양식 요소를 식별하지 못했습니다. 대신 HTML을 검사해 보세요."
+ },
+ "copyCustomFieldNameNotUnique": {
+ "message": "고유 식별자를 찾을 수 없습니다."
+ }
+}
diff --git a/src/iOS.Safari/Resources/_locales/lt/messages.json b/src/iOS.Safari/Resources/_locales/lt/messages.json
new file mode 100644
index 000000000..f0c1a9268
--- /dev/null
+++ b/src/iOS.Safari/Resources/_locales/lt/messages.json
@@ -0,0 +1,1817 @@
+{
+ "appName": {
+ "message": "Bitwarden"
+ },
+ "extName": {
+ "message": "Bitwarden",
+ "description": "Extension name, MUST be less than 40 characters (Safari restriction)"
+ },
+ "extDesc": {
+ "message": "Saugi ir nemokama slaptažodžių tvarkyklė visiems įrenginiams.",
+ "description": "Extension description"
+ },
+ "loginOrCreateNewAccount": {
+ "message": "Prisijunkite arba sukurkite naują paskyrą, kad galėtumėte pasiekti saugyklą."
+ },
+ "createAccount": {
+ "message": "Sukurti paskyrą"
+ },
+ "login": {
+ "message": "Prisijungti"
+ },
+ "enterpriseSingleSignOn": {
+ "message": "Enterprise Single Sign-On"
+ },
+ "cancel": {
+ "message": "Atšaukti"
+ },
+ "close": {
+ "message": "Uždaryti"
+ },
+ "submit": {
+ "message": "Išsaugoti"
+ },
+ "emailAddress": {
+ "message": "El. paštas"
+ },
+ "masterPass": {
+ "message": "Pagrindinis slaptažodis"
+ },
+ "masterPassDesc": {
+ "message": "Pagrindinis slaptažodis yra slaptažodis, kurį naudojate norėdami pasiekti savo saugyklą. Labai svarbu nepamiršti pagrindinio slaptažodžio. Negalėsite atkurti slaptažodį, jei jį pamiršote."
+ },
+ "masterPassHintDesc": {
+ "message": "Pagrindinio slaptažodžio užuomina gali padėti prisiminti slaptažodį, jei jį pamiršite."
+ },
+ "reTypeMasterPass": {
+ "message": "Pakartokite pagrindinį slaptažodį"
+ },
+ "masterPassHint": {
+ "message": " Pagrindinio slaptažodžio užuomina (neprivaloma)"
+ },
+ "tab": {
+ "message": "Skirtukas"
+ },
+ "myVault": {
+ "message": "Saugykla"
+ },
+ "tools": {
+ "message": "Įrankiai"
+ },
+ "settings": {
+ "message": "Nustatymai"
+ },
+ "currentTab": {
+ "message": "Dabartinis skirtukas"
+ },
+ "copyPassword": {
+ "message": "Kopijuoti slaptažodį"
+ },
+ "copyNote": {
+ "message": "Kopijuoti pastabas"
+ },
+ "copyUri": {
+ "message": "Kopijuoti nuorodą"
+ },
+ "copyUsername": {
+ "message": "Kopijuoti vartotojo vardą"
+ },
+ "copyNumber": {
+ "message": "Kopijuoti numerį"
+ },
+ "copySecurityCode": {
+ "message": "Kopijuoti saugos kodą"
+ },
+ "autoFill": {
+ "message": "Automatinis užpildymas"
+ },
+ "generatePasswordCopied": {
+ "message": "Kurti slaptažodį (paruoštas įterpti)"
+ },
+ "copyElementIdentifier": {
+ "message": "Copy Custom Field Name"
+ },
+ "noMatchingLogins": {
+ "message": "Nėra atitinkančių prisijungimų."
+ },
+ "vaultLocked": {
+ "message": "Saugykla užrakinta."
+ },
+ "vaultLoggedOut": {
+ "message": "Atsijungta nuo saugyklos."
+ },
+ "autoFillInfo": {
+ "message": "Nėra galimų prisijungimų prie dabartinio naršyklės skirtuko."
+ },
+ "addLogin": {
+ "message": "Pridėti prisijungimą"
+ },
+ "addItem": {
+ "message": "Pridėti elementą"
+ },
+ "passwordHint": {
+ "message": "Slaptažodžio užuomina"
+ },
+ "enterEmailToGetHint": {
+ "message": "Įveskite savo paskyros el. pašto adresą, kad gautumėte pagrindinio slaptažodžio užuominą."
+ },
+ "getMasterPasswordHint": {
+ "message": "Gauti pagrindinio slaptažodžio užuominą"
+ },
+ "continue": {
+ "message": "Tęsti"
+ },
+ "verificationCode": {
+ "message": "Patvirtinimo kodas"
+ },
+ "account": {
+ "message": "Paskyra"
+ },
+ "changeMasterPassword": {
+ "message": "Keisti pagrindinį slaptažodį"
+ },
+ "fingerprintPhrase": {
+ "message": "Dalijimosi slaptažodis",
+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
+ },
+ "yourAccountsFingerprint": {
+ "message": "Jūsų paskiros dalijimosi slaptažodis",
+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
+ },
+ "twoStepLogin": {
+ "message": "Dviejų žingsnių prisijungimas"
+ },
+ "logOut": {
+ "message": "Atsijungti"
+ },
+ "about": {
+ "message": "Apie"
+ },
+ "version": {
+ "message": "Versija"
+ },
+ "save": {
+ "message": "Išsaugoti"
+ },
+ "move": {
+ "message": "Perkelti"
+ },
+ "addFolder": {
+ "message": "Pridėti katalogą"
+ },
+ "name": {
+ "message": "Pavadinimas"
+ },
+ "editFolder": {
+ "message": "Redaguoti aplanką"
+ },
+ "deleteFolder": {
+ "message": "Šalinti katalogą"
+ },
+ "folders": {
+ "message": "Aplankai"
+ },
+ "noFolders": {
+ "message": "Aplankų nėra"
+ },
+ "helpFeedback": {
+ "message": "Pagalba ir atsiliepimai"
+ },
+ "sync": {
+ "message": "Sinchronizuoti"
+ },
+ "syncVaultNow": {
+ "message": "Sinchronizuoti saugyklą dabar"
+ },
+ "lastSync": {
+ "message": "Sinchronizuota:"
+ },
+ "passGen": {
+ "message": "Slaptažodžių generatorius"
+ },
+ "generator": {
+ "message": "Generatorius",
+ "description": "Short for 'Password Generator'."
+ },
+ "passGenInfo": {
+ "message": "Automatiškai sukurkite patikimus, unikalius slaptažodžius."
+ },
+ "bitWebVault": {
+ "message": "„Bitwarden“ žiniatinklio saugykla"
+ },
+ "importItems": {
+ "message": "Importuoti duomenis"
+ },
+ "select": {
+ "message": "Pasirinkti"
+ },
+ "generatePassword": {
+ "message": "Kurti slaptažodį"
+ },
+ "regeneratePassword": {
+ "message": "Perkurti slaptažodį"
+ },
+ "options": {
+ "message": "Pasirinkimai"
+ },
+ "length": {
+ "message": "Ilgis"
+ },
+ "numWords": {
+ "message": "Žodžių skaičius"
+ },
+ "wordSeparator": {
+ "message": "Žodžių skirtukas"
+ },
+ "capitalize": {
+ "message": "Pradėti didžiosiomis",
+ "description": "Make the first letter of a work uppercase."
+ },
+ "includeNumber": {
+ "message": "Įtraukti skaičius"
+ },
+ "minNumbers": {
+ "message": "Mažiausiai skaičių"
+ },
+ "minSpecial": {
+ "message": "Mažiausiai simbolių"
+ },
+ "avoidAmbChar": {
+ "message": "Vengti dviprasmiškų simbolių"
+ },
+ "searchVault": {
+ "message": "Ieškoti saugykloje"
+ },
+ "edit": {
+ "message": "Keisti"
+ },
+ "view": {
+ "message": "Peržiūrėti"
+ },
+ "noItemsInList": {
+ "message": "Nėra rodytinų elementų."
+ },
+ "itemInformation": {
+ "message": "Informacija"
+ },
+ "username": {
+ "message": "Vartotojo vardas"
+ },
+ "password": {
+ "message": "Slaptažodis"
+ },
+ "passphrase": {
+ "message": "Slaptafrazė"
+ },
+ "favorite": {
+ "message": "Mėgstamas"
+ },
+ "notes": {
+ "message": "Pastabos"
+ },
+ "note": {
+ "message": "Pastaba"
+ },
+ "editItem": {
+ "message": "Redaguoti elementą"
+ },
+ "folder": {
+ "message": "Aplankas"
+ },
+ "deleteItem": {
+ "message": "Trinti elementą"
+ },
+ "viewItem": {
+ "message": "Peržiūrėti elementą"
+ },
+ "launch": {
+ "message": "Paleisti"
+ },
+ "website": {
+ "message": "Tinklapis"
+ },
+ "toggleVisibility": {
+ "message": "Perjungti matomumą"
+ },
+ "manage": {
+ "message": "Tvarkyti"
+ },
+ "other": {
+ "message": "Kita"
+ },
+ "rateExtension": {
+ "message": "Įvertinkite šį plėtinį"
+ },
+ "rateExtensionDesc": {
+ "message": "Apsvarstykite galimybę mums padėti palikdami gerą atsiliepimą!"
+ },
+ "browserNotSupportClipboard": {
+ "message": "Jūsų žiniatinklio naršyklė nepalaiko automatinio kopijavimo. Vietoj to nukopijuokite rankiniu būdu."
+ },
+ "verifyMasterPassword": {
+ "message": "Patikrinkite pagrindinį slaptažodį"
+ },
+ "yourVaultIsLocked": {
+ "message": "Jūsų saugykla užrakinta. Norėdami tęsti, patikrinkite pagrindinį slaptažodį."
+ },
+ "unlock": {
+ "message": "Atrakinti"
+ },
+ "loggedInAsOn": {
+ "message": "Prisijungta prie $HOSTNAME$ kaip $EMAIL$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "name@example.com"
+ },
+ "hostname": {
+ "content": "$2",
+ "example": "bitwarden.com"
+ }
+ }
+ },
+ "invalidMasterPassword": {
+ "message": "Neteisingas pagrindinis slaptažodis"
+ },
+ "vaultTimeout": {
+ "message": "Atsijungta nuo saugyklos"
+ },
+ "lockNow": {
+ "message": "Užrakinti dabar"
+ },
+ "immediately": {
+ "message": "Nedelsiant"
+ },
+ "tenSeconds": {
+ "message": "10 sekundžių"
+ },
+ "twentySeconds": {
+ "message": "20 sekundžių"
+ },
+ "thirtySeconds": {
+ "message": "30 sekundžių"
+ },
+ "oneMinute": {
+ "message": "1 minutę"
+ },
+ "twoMinutes": {
+ "message": "2 minučių"
+ },
+ "fiveMinutes": {
+ "message": "5 minučių"
+ },
+ "fifteenMinutes": {
+ "message": "15 minučių"
+ },
+ "thirtyMinutes": {
+ "message": "30 minučių"
+ },
+ "oneHour": {
+ "message": "1 valandos"
+ },
+ "fourHours": {
+ "message": "4 valandų"
+ },
+ "onLocked": {
+ "message": "Užrakinant sistemą"
+ },
+ "onRestart": {
+ "message": "Paleidus iš naujo naršyklę"
+ },
+ "never": {
+ "message": "Niekada"
+ },
+ "security": {
+ "message": "Apsauga"
+ },
+ "errorOccurred": {
+ "message": "Įvyko klaida"
+ },
+ "emailRequired": {
+ "message": "Reikalingas el. pašto adresas."
+ },
+ "invalidEmail": {
+ "message": "Klaidingas el. pašto adresas."
+ },
+ "masterPassRequired": {
+ "message": "Būtinas pagrindinis slaptažodis."
+ },
+ "masterPassLength": {
+ "message": "Pagrindinis slaptažodis turi būti bent 8 simbolių ilgio."
+ },
+ "masterPassDoesntMatch": {
+ "message": "Pagrindinio slaptažodžio patvirtinimas nesutampa."
+ },
+ "newAccountCreated": {
+ "message": "Jūsų paskyra sukurta! Galite prisijungti."
+ },
+ "masterPassSent": {
+ "message": "Išsiuntėme jums el. laišką su pagrindinio slaptažodžio užuomina."
+ },
+ "verificationCodeRequired": {
+ "message": "Būtinas patvirtinimo kodas."
+ },
+ "valueCopied": {
+ "message": "Nukopijuota $VALUE$",
+ "description": "Value has been copied to the clipboard.",
+ "placeholders": {
+ "value": {
+ "content": "$1",
+ "example": "Password"
+ }
+ }
+ },
+ "autofillError": {
+ "message": "Nepavyko automatiškai užpildyti pasirinkto elemento šiame puslapyje. Nukopijuokite ir įklijuokite informaciją."
+ },
+ "loggedOut": {
+ "message": "Atsijungta"
+ },
+ "loginExpired": {
+ "message": "Sesijos laikas baigėsi."
+ },
+ "logOutConfirmation": {
+ "message": "Ar tikrai norite atsijungti?"
+ },
+ "yes": {
+ "message": "Taip"
+ },
+ "no": {
+ "message": "Ne"
+ },
+ "unexpectedError": {
+ "message": "Įvyko netikėta klaida."
+ },
+ "nameRequired": {
+ "message": "Pavadinimas yra būtinas."
+ },
+ "addedFolder": {
+ "message": "Katalogas pridėtas"
+ },
+ "changeMasterPass": {
+ "message": "Keisti pagrindinį slaptažodį"
+ },
+ "changeMasterPasswordConfirmation": {
+ "message": "Pagrindinį slaptažodį galite pakeisti bitwarden.com žiniatinklio saugykloje. Ar norite dabar apsilankyti svetainėje?"
+ },
+ "twoStepLoginConfirmation": {
+ "message": "Prisijungus dviem veiksmais, jūsų paskyra tampa saugesnė, reikalaujant patvirtinti prisijungimą naudojant kitą įrenginį, pvz., Saugos raktą, autentifikavimo programą, SMS, telefono skambutį ar el. Paštą. Dviejų žingsnių prisijungimą galima įjungti „bitwarden.com“ interneto saugykloje. Ar norite dabar apsilankyti svetainėje?"
+ },
+ "editedFolder": {
+ "message": "Katalogas atnaujintas"
+ },
+ "deleteFolderConfirmation": {
+ "message": "Ar tikrai norite ištrinti šį aplanką?"
+ },
+ "deletedFolder": {
+ "message": "Katalogas ištrintas"
+ },
+ "gettingStartedTutorial": {
+ "message": "Apmokymai"
+ },
+ "gettingStartedTutorialVideo": {
+ "message": "Peržiūrėkite aomokymus, kad sužinotumėte, kaip išnaudoti visas naršyklės plėtinio galimybes."
+ },
+ "syncingComplete": {
+ "message": "Sinchronizacija baigta"
+ },
+ "syncingFailed": {
+ "message": "Sinchronizuoti nepavyko"
+ },
+ "passwordCopied": {
+ "message": "Slaptažodis nukopijuotas"
+ },
+ "uri": {
+ "message": "URI"
+ },
+ "uriPosition": {
+ "message": "URI $POSITION$",
+ "description": "A listing of URIs. Ex: URI 1, URI 2, URI 3, etc.",
+ "placeholders": {
+ "position": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "newUri": {
+ "message": "Naujas URI"
+ },
+ "addedItem": {
+ "message": "Pridėtas elementas"
+ },
+ "editedItem": {
+ "message": "Redaguotas elementas"
+ },
+ "deleteItemConfirmation": {
+ "message": "Ar tikrai norite perkelti į šiukšlinę?"
+ },
+ "deletedItem": {
+ "message": "Elementas perkeltas į šiukšlinę"
+ },
+ "overwritePassword": {
+ "message": "Perrašyti slaptažodį"
+ },
+ "overwritePasswordConfirmation": {
+ "message": "Ar tikrai norite perrašyti dabartinį slaptažodį?"
+ },
+ "searchFolder": {
+ "message": "Ieškoti aplanke"
+ },
+ "searchCollection": {
+ "message": "Ieškoti rinkinio"
+ },
+ "searchType": {
+ "message": "Ieškoti tipo"
+ },
+ "noneFolder": {
+ "message": "Be aplanko",
+ "description": "This is the folder for uncategorized items"
+ },
+ "disableAddLoginNotification": {
+ "message": "Išjungti Pridėti prisijungimą pranešimą"
+ },
+ "addLoginNotificationDesc": {
+ "message": "Prisijungimo pridėjimo pranešimas automatiškai Jūs paragina išsaugoti naujus prisijungimus Jūsų saugykloje, kuomet prisijungiate pirmą kartą."
+ },
+ "dontShowCardsCurrentTab": {
+ "message": "Don't Show Cards on Tab Page"
+ },
+ "dontShowCardsCurrentTabDesc": {
+ "message": "Card items from your vault are listed on the 'Current Tab' page for easy auto-fill access."
+ },
+ "dontShowIdentitiesCurrentTab": {
+ "message": "Don't Show Identities on Tab Page"
+ },
+ "dontShowIdentitiesCurrentTabDesc": {
+ "message": "Identity items from your vault are listed on the 'Current Tab' page for easy auto-fill access."
+ },
+ "clearClipboard": {
+ "message": "Išvalyti iškarpinę",
+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
+ },
+ "clearClipboardDesc": {
+ "message": "Automatically clear copied values from your clipboard.",
+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
+ },
+ "notificationAddDesc": {
+ "message": "Should Bitwarden remember this password for you?"
+ },
+ "notificationAddSave": {
+ "message": "Taip, išsaugoti dabar"
+ },
+ "notificationNeverSave": {
+ "message": "Niekada šiai interneto svetainei"
+ },
+ "disableChangedPasswordNotification": {
+ "message": "Disable Changed Password Notification"
+ },
+ "disableChangedPasswordNotificationDesc": {
+ "message": "The \"Changed Password Notification\" automatically prompts you to update a login's password in your vault whenever it detects that you have changed it on a website."
+ },
+ "notificationChangeDesc": {
+ "message": "Do you want to update this password in Bitwarden?"
+ },
+ "notificationChangeSave": {
+ "message": "Taip, atnaujinti dabar"
+ },
+ "disableContextMenuItem": {
+ "message": "Disable Context Menu Options"
+ },
+ "disableContextMenuItemDesc": {
+ "message": "Context menu options provide quick access to password generation and logins for the website in your current tab."
+ },
+ "defaultUriMatchDetection": {
+ "message": "Default URI Match Detection",
+ "description": "Default URI match detection for auto-fill."
+ },
+ "defaultUriMatchDetectionDesc": {
+ "message": "Choose the default way that URI match detection is handled for logins when performing actions such as auto-fill."
+ },
+ "theme": {
+ "message": "Tema"
+ },
+ "themeDesc": {
+ "message": "Pakeisti programos spalvos temą"
+ },
+ "dark": {
+ "message": "Tamsi",
+ "description": "Dark color"
+ },
+ "light": {
+ "message": "Šviesi",
+ "description": "Light color"
+ },
+ "solarizedDark": {
+ "message": "Solarized Dark",
+ "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated."
+ },
+ "exportVault": {
+ "message": "Eksportuoti saugyklą"
+ },
+ "fileFormat": {
+ "message": "Failo formatas"
+ },
+ "warning": {
+ "message": "ĮSPĖJIMAS",
+ "description": "WARNING (should stay in capitalized letters if the language permits)"
+ },
+ "confirmVaultExport": {
+ "message": "Patvirtinti saugyklos eksportą"
+ },
+ "exportWarningDesc": {
+ "message": "This export contains your vault data in an unencrypted format. You should not store or send the exported file over unsecure channels (such as email). Delete it immediately after you are done using it."
+ },
+ "encExportKeyWarningDesc": {
+ "message": "This export encrypts your data using your account's encryption key. If you ever rotate your account's encryption key you should export again since you will not be able to decrypt this export file."
+ },
+ "encExportAccountWarningDesc": {
+ "message": "Account encryption keys are unique to each Bitwarden user account, so you can't import an encrypted export into a different account."
+ },
+ "exportMasterPassword": {
+ "message": "Enter your master password to export your vault data."
+ },
+ "shared": {
+ "message": "Pasidalinti"
+ },
+ "learnOrg": {
+ "message": "Sužinoti apie organizacijas"
+ },
+ "learnOrgConfirmation": {
+ "message": "Bitwarden allows you to share your vault items with others by using an organization. Would you like to visit the bitwarden.com website to learn more?"
+ },
+ "moveToOrganization": {
+ "message": "Move to Organization"
+ },
+ "share": {
+ "message": "Share"
+ },
+ "movedItemToOrg": {
+ "message": "$ITEMNAME$ moved to $ORGNAME$",
+ "placeholders": {
+ "itemname": {
+ "content": "$1",
+ "example": "Secret Item"
+ },
+ "orgname": {
+ "content": "$2",
+ "example": "Company Name"
+ }
+ }
+ },
+ "moveToOrgDesc": {
+ "message": "Choose an organization that you wish to move this item to. Moving to an organization transfers ownership of the item to that organization. You will no longer be the direct owner of this item once it has been moved."
+ },
+ "learnMore": {
+ "message": "Learn more"
+ },
+ "authenticatorKeyTotp": {
+ "message": "Authenticator Key (TOTP)"
+ },
+ "verificationCodeTotp": {
+ "message": "Verification Code (TOTP)"
+ },
+ "copyVerificationCode": {
+ "message": "Copy Verification Code"
+ },
+ "attachments": {
+ "message": "Attachments"
+ },
+ "deleteAttachment": {
+ "message": "Delete attachment"
+ },
+ "deleteAttachmentConfirmation": {
+ "message": "Are you sure you want to delete this attachment?"
+ },
+ "deletedAttachment": {
+ "message": "Deleted attachment"
+ },
+ "newAttachment": {
+ "message": "Add New Attachment"
+ },
+ "noAttachments": {
+ "message": "No attachments."
+ },
+ "attachmentSaved": {
+ "message": "The attachment has been saved."
+ },
+ "file": {
+ "message": "File"
+ },
+ "selectFile": {
+ "message": "Select a file."
+ },
+ "maxFileSize": {
+ "message": "Maximum file size is 500 MB."
+ },
+ "featureUnavailable": {
+ "message": "Feature Unavailable"
+ },
+ "updateKey": {
+ "message": "You cannot use this feature until you update your encryption key."
+ },
+ "premiumMembership": {
+ "message": "Premium Membership"
+ },
+ "premiumManage": {
+ "message": "Manage Membership"
+ },
+ "premiumManageAlert": {
+ "message": "You can manage your membership on the bitwarden.com web vault. Do you want to visit the website now?"
+ },
+ "premiumRefresh": {
+ "message": "Refresh Membership"
+ },
+ "premiumNotCurrentMember": {
+ "message": "You are not currently a premium member."
+ },
+ "premiumSignUpAndGet": {
+ "message": "Sign up for a premium membership and get:"
+ },
+ "ppremiumSignUpStorage": {
+ "message": "1 GB encrypted storage for file attachments."
+ },
+ "ppremiumSignUpTwoStep": {
+ "message": "Additional two-step login options such as YubiKey, FIDO U2F, and Duo."
+ },
+ "ppremiumSignUpReports": {
+ "message": "Password hygiene, account health, and data breach reports to keep your vault safe."
+ },
+ "ppremiumSignUpTotp": {
+ "message": "TOTP verification code (2FA) generator for logins in your vault."
+ },
+ "ppremiumSignUpSupport": {
+ "message": "Priority customer support."
+ },
+ "ppremiumSignUpFuture": {
+ "message": "All future premium features. More coming soon!"
+ },
+ "premiumPurchase": {
+ "message": "Purchase Premium"
+ },
+ "premiumPurchaseAlert": {
+ "message": "You can purchase premium membership on the bitwarden.com web vault. Do you want to visit the website now?"
+ },
+ "premiumCurrentMember": {
+ "message": "You are a premium member!"
+ },
+ "premiumCurrentMemberThanks": {
+ "message": "Thank you for supporting Bitwarden."
+ },
+ "premiumPrice": {
+ "message": "All for just $PRICE$ /year!",
+ "placeholders": {
+ "price": {
+ "content": "$1",
+ "example": "$10"
+ }
+ }
+ },
+ "refreshComplete": {
+ "message": "Atnaujinimas įvykdytas"
+ },
+ "disableAutoTotpCopy": {
+ "message": "Disable Automatic TOTP Copy"
+ },
+ "disableAutoTotpCopyDesc": {
+ "message": "If your login has an authenticator key attached to it, the TOTP verification code is automatically copied to your clipboard whenever you auto-fill the login."
+ },
+ "disableAutoBiometricsPrompt": {
+ "message": "Do not prompt for biometrics on launch"
+ },
+ "premiumRequired": {
+ "message": "Premium Required"
+ },
+ "premiumRequiredDesc": {
+ "message": "A premium membership is required to use this feature."
+ },
+ "enterVerificationCodeApp": {
+ "message": "Enter the 6 digit verification code from your authenticator app."
+ },
+ "enterVerificationCodeEmail": {
+ "message": "Enter the 6 digit verification code that was emailed to $EMAIL$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "example@gmail.com"
+ }
+ }
+ },
+ "verificationCodeEmailSent": {
+ "message": "Verification email sent to $EMAIL$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "example@gmail.com"
+ }
+ }
+ },
+ "rememberMe": {
+ "message": "Prisiminti mane"
+ },
+ "sendVerificationCodeEmailAgain": {
+ "message": "Send verification code email again"
+ },
+ "useAnotherTwoStepMethod": {
+ "message": "Use another two-step login method"
+ },
+ "insertYubiKey": {
+ "message": "Insert your YubiKey into your computer's USB port, then touch its button."
+ },
+ "insertU2f": {
+ "message": "Insert your security key into your computer's USB port. If it has a button, touch it."
+ },
+ "webAuthnNewTab": {
+ "message": "To start the WebAuthn 2FA verification. Click the button below to open a new tab and follow the instructions provided in the new tab."
+ },
+ "webAuthnNewTabOpen": {
+ "message": "Atidaryti naują skirtuką"
+ },
+ "webAuthnAuthenticate": {
+ "message": "Authenticate WebAuthn"
+ },
+ "loginUnavailable": {
+ "message": "Login Unavailable"
+ },
+ "noTwoStepProviders": {
+ "message": "This account has two-step login enabled, however, none of the configured two-step providers are supported by this web browser."
+ },
+ "noTwoStepProviders2": {
+ "message": "Please use a supported web browser (such as Chrome) and/or add additional providers that are better supported across web browsers (such as an authenticator app)."
+ },
+ "twoStepOptions": {
+ "message": "Two-step Login Options"
+ },
+ "recoveryCodeDesc": {
+ "message": "Lost access to all of your two-factor providers? Use your recovery code to disable all two-factor providers from your account."
+ },
+ "recoveryCodeTitle": {
+ "message": "Recovery Code"
+ },
+ "authenticatorAppTitle": {
+ "message": "Authenticator App"
+ },
+ "authenticatorAppDesc": {
+ "message": "Use an authenticator app (such as Authy or Google Authenticator) to generate time-based verification codes.",
+ "description": "'Authy' and 'Google Authenticator' are product names and should not be translated."
+ },
+ "yubiKeyTitle": {
+ "message": "YubiKey OTP Security Key"
+ },
+ "yubiKeyDesc": {
+ "message": "Use a YubiKey to access your account. Works with YubiKey 4, 4 Nano, 4C, and NEO devices."
+ },
+ "duoDesc": {
+ "message": "Verify with Duo Security using the Duo Mobile app, SMS, phone call, or U2F security key.",
+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
+ },
+ "duoOrganizationDesc": {
+ "message": "Verify with Duo Security for your organization using the Duo Mobile app, SMS, phone call, or U2F security key.",
+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
+ },
+ "webAuthnTitle": {
+ "message": "FIDO2 WebAuthn"
+ },
+ "webAuthnDesc": {
+ "message": "Use any WebAuthn enabled security key to access your account."
+ },
+ "emailTitle": {
+ "message": "El. paštas"
+ },
+ "emailDesc": {
+ "message": "Verification codes will be emailed to you."
+ },
+ "selfHostedEnvironment": {
+ "message": "Self-hosted Environment"
+ },
+ "selfHostedEnvironmentFooter": {
+ "message": "Specify the base URL of your on-premises hosted Bitwarden installation."
+ },
+ "customEnvironment": {
+ "message": "Custom Environment"
+ },
+ "customEnvironmentFooter": {
+ "message": "For advanced users. You can specify the base URL of each service independently."
+ },
+ "baseUrl": {
+ "message": "Serverio URL"
+ },
+ "apiUrl": {
+ "message": "API Server URL"
+ },
+ "webVaultUrl": {
+ "message": "Web Vault Server URL"
+ },
+ "identityUrl": {
+ "message": "Identity Server URL"
+ },
+ "notificationsUrl": {
+ "message": "Notifications Server URL"
+ },
+ "iconsUrl": {
+ "message": "Icons Server URL"
+ },
+ "environmentSaved": {
+ "message": "The environment URLs have been saved."
+ },
+ "enableAutoFillOnPageLoad": {
+ "message": "Enable Auto-fill on Page Load"
+ },
+ "enableAutoFillOnPageLoadDesc": {
+ "message": "If a login form is detected, automatically perform an auto-fill when the web page loads."
+ },
+ "experimentalFeature": {
+ "message": "This is currently an experimental feature. Use at your own risk."
+ },
+ "defaultAutoFillOnPageLoad": {
+ "message": "Default autofill setting for login items"
+ },
+ "defaultAutoFillOnPageLoadDesc": {
+ "message": "After enabling Auto-fill on Page Load, you can enable or disable the feature for individual login items. This is the default setting for login items that are not separately configured."
+ },
+ "itemAutoFillOnPageLoad": {
+ "message": "Auto-fill on Page Load (if enabled in Options)"
+ },
+ "autoFillOnPageLoadUseDefault": {
+ "message": "Use default setting"
+ },
+ "autoFillOnPageLoadYes": {
+ "message": "Auto-fill on page load"
+ },
+ "autoFillOnPageLoadNo": {
+ "message": "Do not auto-fill on page load"
+ },
+ "commandOpenPopup": {
+ "message": "Open vault popup"
+ },
+ "commandOpenSidebar": {
+ "message": "Open vault in sidebar"
+ },
+ "commandAutofillDesc": {
+ "message": "Auto-fill the last used login for the current website"
+ },
+ "commandGeneratePasswordDesc": {
+ "message": "Generate and copy a new random password to the clipboard"
+ },
+ "commandLockVaultDesc": {
+ "message": "Lock the vault"
+ },
+ "privateModeMessage": {
+ "message": "Unfortunately this window is not available in private mode for this browser."
+ },
+ "customFields": {
+ "message": "Custom Fields"
+ },
+ "copyValue": {
+ "message": "Copy Value"
+ },
+ "value": {
+ "message": "Value"
+ },
+ "newCustomField": {
+ "message": "New Custom Field"
+ },
+ "dragToSort": {
+ "message": "Drag to sort"
+ },
+ "cfTypeText": {
+ "message": "Text"
+ },
+ "cfTypeHidden": {
+ "message": "Hidden"
+ },
+ "cfTypeBoolean": {
+ "message": "Boolean"
+ },
+ "popup2faCloseMessage": {
+ "message": "Clicking outside the popup window to check your email for your verification code will cause this popup to close. Do you want to open this popup in a new window so that it does not close?"
+ },
+ "popupU2fCloseMessage": {
+ "message": "This browser cannot process U2F requests in this popup window. Do you want to open this popup in a new window so that you can log in using U2F?"
+ },
+ "disableFavicon": {
+ "message": "Disable Website Icons"
+ },
+ "disableFaviconDesc": {
+ "message": "Website Icons provide a recognizable image next to each login item in your vault."
+ },
+ "disableBadgeCounter": {
+ "message": "Disable Badge Counter"
+ },
+ "disableBadgeCounterDesc": {
+ "message": "Badge counter indicates how many logins you have for the current page in your vault."
+ },
+ "cardholderName": {
+ "message": "Cardholder Name"
+ },
+ "number": {
+ "message": "Number"
+ },
+ "brand": {
+ "message": "Brand"
+ },
+ "expirationMonth": {
+ "message": "Expiration Month"
+ },
+ "expirationYear": {
+ "message": "Expiration Year"
+ },
+ "expiration": {
+ "message": "Expiration"
+ },
+ "january": {
+ "message": "January"
+ },
+ "february": {
+ "message": "February"
+ },
+ "march": {
+ "message": "March"
+ },
+ "april": {
+ "message": "April"
+ },
+ "may": {
+ "message": "May"
+ },
+ "june": {
+ "message": "June"
+ },
+ "july": {
+ "message": "July"
+ },
+ "august": {
+ "message": "August"
+ },
+ "september": {
+ "message": "September"
+ },
+ "october": {
+ "message": "October"
+ },
+ "november": {
+ "message": "November"
+ },
+ "december": {
+ "message": "December"
+ },
+ "securityCode": {
+ "message": "Security Code"
+ },
+ "ex": {
+ "message": "ex."
+ },
+ "title": {
+ "message": "Title"
+ },
+ "mr": {
+ "message": "Mr"
+ },
+ "mrs": {
+ "message": "Mrs"
+ },
+ "ms": {
+ "message": "Ms"
+ },
+ "dr": {
+ "message": "Dr"
+ },
+ "firstName": {
+ "message": "First Name"
+ },
+ "middleName": {
+ "message": "Middle Name"
+ },
+ "lastName": {
+ "message": "Last Name"
+ },
+ "identityName": {
+ "message": "Identity Name"
+ },
+ "company": {
+ "message": "Company"
+ },
+ "ssn": {
+ "message": "Social Security Number"
+ },
+ "passportNumber": {
+ "message": "Passport Number"
+ },
+ "licenseNumber": {
+ "message": "License Number"
+ },
+ "email": {
+ "message": "Email"
+ },
+ "phone": {
+ "message": "Phone"
+ },
+ "address": {
+ "message": "Address"
+ },
+ "address1": {
+ "message": "Address 1"
+ },
+ "address2": {
+ "message": "Address 2"
+ },
+ "address3": {
+ "message": "Address 3"
+ },
+ "cityTown": {
+ "message": "City / Town"
+ },
+ "stateProvince": {
+ "message": "State / Province"
+ },
+ "zipPostalCode": {
+ "message": "Zip / Postal Code"
+ },
+ "country": {
+ "message": "Country"
+ },
+ "type": {
+ "message": "Type"
+ },
+ "typeLogin": {
+ "message": "Login"
+ },
+ "typeLogins": {
+ "message": "Logins"
+ },
+ "typeSecureNote": {
+ "message": "Secure Note"
+ },
+ "typeCard": {
+ "message": "Card"
+ },
+ "typeIdentity": {
+ "message": "Identity"
+ },
+ "passwordHistory": {
+ "message": "Password History"
+ },
+ "back": {
+ "message": "Back"
+ },
+ "collections": {
+ "message": "Collections"
+ },
+ "favorites": {
+ "message": "Favorites"
+ },
+ "popOutNewWindow": {
+ "message": "Pop out to a new window"
+ },
+ "refresh": {
+ "message": "Refresh"
+ },
+ "cards": {
+ "message": "Cards"
+ },
+ "identities": {
+ "message": "Identities"
+ },
+ "logins": {
+ "message": "Logins"
+ },
+ "secureNotes": {
+ "message": "Secure Notes"
+ },
+ "clear": {
+ "message": "Clear",
+ "description": "To clear something out. example: To clear browser history."
+ },
+ "checkPassword": {
+ "message": "Check if password has been exposed."
+ },
+ "passwordExposed": {
+ "message": "This password has been exposed $VALUE$ time(s) in data breaches. You should change it.",
+ "placeholders": {
+ "value": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "passwordSafe": {
+ "message": "This password was not found in any known data breaches. It should be safe to use."
+ },
+ "baseDomain": {
+ "message": "Base domain"
+ },
+ "host": {
+ "message": "Host",
+ "description": "A URL's host value. For example, the host of https://sub.domain.com:443 is 'sub.domain.com:443'."
+ },
+ "exact": {
+ "message": "Exact"
+ },
+ "startsWith": {
+ "message": "Starts with"
+ },
+ "regEx": {
+ "message": "Regular expression",
+ "description": "A programming term, also known as 'RegEx'."
+ },
+ "matchDetection": {
+ "message": "Match Detection",
+ "description": "URI match detection for auto-fill."
+ },
+ "defaultMatchDetection": {
+ "message": "Default match detection",
+ "description": "Default URI match detection for auto-fill."
+ },
+ "toggleOptions": {
+ "message": "Toggle Options"
+ },
+ "toggleCurrentUris": {
+ "message": "Toggle Current URIs",
+ "description": "Toggle the display of the URIs of the currently open tabs in the browser."
+ },
+ "currentUri": {
+ "message": "Current URI",
+ "description": "The URI of one of the current open tabs in the browser."
+ },
+ "organization": {
+ "message": "Organization",
+ "description": "An entity of multiple related people (ex. a team or business organization)."
+ },
+ "types": {
+ "message": "Types"
+ },
+ "allItems": {
+ "message": "All Items"
+ },
+ "noPasswordsInList": {
+ "message": "There are no passwords to list."
+ },
+ "remove": {
+ "message": "Remove"
+ },
+ "default": {
+ "message": "Default"
+ },
+ "dateUpdated": {
+ "message": "Updated",
+ "description": "ex. Date this item was updated"
+ },
+ "datePasswordUpdated": {
+ "message": "Password Updated",
+ "description": "ex. Date this password was updated"
+ },
+ "neverLockWarning": {
+ "message": "Are you sure you want to use the \"Never\" option? Setting your lock options to \"Never\" stores your vault's encryption key on your device. If you use this option you should ensure that you keep your device properly protected."
+ },
+ "noOrganizationsList": {
+ "message": "You do not belong to any organizations. Organizations allow you to securely share items with other users."
+ },
+ "noCollectionsInList": {
+ "message": "There are no collections to list."
+ },
+ "ownership": {
+ "message": "Ownership"
+ },
+ "whoOwnsThisItem": {
+ "message": "Who owns this item?"
+ },
+ "strong": {
+ "message": "Strong",
+ "description": "ex. A strong password. Scale: Weak -> Good -> Strong"
+ },
+ "good": {
+ "message": "Good",
+ "description": "ex. A good password. Scale: Weak -> Good -> Strong"
+ },
+ "weak": {
+ "message": "Weak",
+ "description": "ex. A weak password. Scale: Weak -> Good -> Strong"
+ },
+ "weakMasterPassword": {
+ "message": "Weak Master Password"
+ },
+ "weakMasterPasswordDesc": {
+ "message": "The master password you have chosen is weak. You should use a strong master password (or a passphrase) to properly protect your Bitwarden account. Are you sure you want to use this master password?"
+ },
+ "pin": {
+ "message": "PIN",
+ "description": "PIN code. Ex. The short code (often numeric) that you use to unlock a device."
+ },
+ "unlockWithPin": {
+ "message": "Unlock with PIN"
+ },
+ "setYourPinCode": {
+ "message": "Set your PIN code for unlocking Bitwarden. Your PIN settings will be reset if you ever fully log out of the application."
+ },
+ "pinRequired": {
+ "message": "PIN code is required."
+ },
+ "invalidPin": {
+ "message": "Invalid PIN code."
+ },
+ "verifyPin": {
+ "message": "Verify PIN"
+ },
+ "yourVaultIsLockedPinCode": {
+ "message": "Your vault is locked. Verify your PIN code to continue."
+ },
+ "unlockWithBiometrics": {
+ "message": "Unlock with biometrics"
+ },
+ "awaitDesktop": {
+ "message": "Awaiting confirmation from desktop"
+ },
+ "awaitDesktopDesc": {
+ "message": "Please confirm using biometrics in the Bitwarden Desktop application to enable biometrics for browser."
+ },
+ "lockWithMasterPassOnRestart": {
+ "message": "Lock with master password on browser restart"
+ },
+ "selectOneCollection": {
+ "message": "You must select at least one collection."
+ },
+ "cloneItem": {
+ "message": "Clone Item"
+ },
+ "clone": {
+ "message": "Clone"
+ },
+ "passwordGeneratorPolicyInEffect": {
+ "message": "One or more organization policies are affecting your generator settings."
+ },
+ "vaultTimeoutAction": {
+ "message": "Vault Timeout Action"
+ },
+ "lock": {
+ "message": "Lock",
+ "description": "Verb form: to make secure or inaccesible by"
+ },
+ "trash": {
+ "message": "Trash",
+ "description": "Noun: a special folder to hold deleted items"
+ },
+ "searchTrash": {
+ "message": "Search trash"
+ },
+ "permanentlyDeleteItem": {
+ "message": "Permanently Delete Item"
+ },
+ "permanentlyDeleteItemConfirmation": {
+ "message": "Are you sure you want to permanently delete this item?"
+ },
+ "permanentlyDeletedItem": {
+ "message": "Permanently Deleted item"
+ },
+ "restoreItem": {
+ "message": "Restore Item"
+ },
+ "restoreItemConfirmation": {
+ "message": "Are you sure you want to restore this item?"
+ },
+ "restoredItem": {
+ "message": "Restored Item"
+ },
+ "vaultTimeoutLogOutConfirmation": {
+ "message": "Logging out will remove all access to your vault and requires online authentication after the timeout period. Are you sure you want to use this setting?"
+ },
+ "vaultTimeoutLogOutConfirmationTitle": {
+ "message": "Timeout Action Confirmation"
+ },
+ "autoFillAndSave": {
+ "message": "Auto-fill and Save"
+ },
+ "autoFillSuccessAndSavedUri": {
+ "message": "Auto-filled Item and Saved URI"
+ },
+ "autoFillSuccess": {
+ "message": "Auto-filled Item"
+ },
+ "setMasterPassword": {
+ "message": "Set Master Password"
+ },
+ "masterPasswordPolicyInEffect": {
+ "message": "One or more organization policies require your master password to meet the following requirements:"
+ },
+ "policyInEffectMinComplexity": {
+ "message": "Minimum complexity score of $SCORE$",
+ "placeholders": {
+ "score": {
+ "content": "$1",
+ "example": "4"
+ }
+ }
+ },
+ "policyInEffectMinLength": {
+ "message": "Minimum length of $LENGTH$",
+ "placeholders": {
+ "length": {
+ "content": "$1",
+ "example": "14"
+ }
+ }
+ },
+ "policyInEffectUppercase": {
+ "message": "Contain one or more uppercase characters"
+ },
+ "policyInEffectLowercase": {
+ "message": "Contain one or more lowercase characters"
+ },
+ "policyInEffectNumbers": {
+ "message": "Contain one or more numbers"
+ },
+ "policyInEffectSpecial": {
+ "message": "Contain one or more of the following special characters $CHARS$",
+ "placeholders": {
+ "chars": {
+ "content": "$1",
+ "example": "!@#$%^&*"
+ }
+ }
+ },
+ "masterPasswordPolicyRequirementsNotMet": {
+ "message": "Your new master password does not meet the policy requirements."
+ },
+ "acceptPolicies": {
+ "message": "By checking this box you agree to the following:"
+ },
+ "acceptPoliciesError": {
+ "message": "Terms of Service and Privacy Policy have not been acknowledged."
+ },
+ "termsOfService": {
+ "message": "Terms of Service"
+ },
+ "privacyPolicy": {
+ "message": "Privacy Policy"
+ },
+ "hintEqualsPassword": {
+ "message": "Your password hint cannot be the same as your password."
+ },
+ "ok": {
+ "message": "Ok"
+ },
+ "desktopSyncVerificationTitle": {
+ "message": "Desktop sync verification"
+ },
+ "desktopIntegrationVerificationText": {
+ "message": "Please verify that the desktop application shows this fingerprint: "
+ },
+ "desktopIntegrationDisabledTitle": {
+ "message": "Browser integration is not enabled"
+ },
+ "desktopIntegrationDisabledDesc": {
+ "message": "Browser integration is not enabled in the Bitwarden Desktop application. Please enable it in the settings within the desktop application."
+ },
+ "startDesktopTitle": {
+ "message": "Start the Bitwarden Desktop application"
+ },
+ "startDesktopDesc": {
+ "message": "The Bitwarden Desktop application needs to be started before this function can be used."
+ },
+ "errorEnableBiometricTitle": {
+ "message": "Unable to enable biometrics"
+ },
+ "errorEnableBiometricDesc": {
+ "message": "Action was canceled by the desktop application"
+ },
+ "nativeMessagingInvalidEncryptionDesc": {
+ "message": "Desktop application invalidated the secure communication channel. Please retry this operation"
+ },
+ "nativeMessagingInvalidEncryptionTitle": {
+ "message": "Desktop communication interrupted"
+ },
+ "nativeMessagingWrongUserDesc": {
+ "message": "The desktop application is logged into a different account. Please ensure both applications are logged into the same account."
+ },
+ "nativeMessagingWrongUserTitle": {
+ "message": "Account missmatch"
+ },
+ "biometricsNotEnabledTitle": {
+ "message": "Biometrics not enabled"
+ },
+ "biometricsNotEnabledDesc": {
+ "message": "Browser biometrics requires desktop biometric to be enabled in the settings first."
+ },
+ "biometricsNotSupportedTitle": {
+ "message": "Biometrics not supported"
+ },
+ "biometricsNotSupportedDesc": {
+ "message": "Browser biometrics is not supported on this device."
+ },
+ "nativeMessaginPermissionErrorTitle": {
+ "message": "Permission not provided"
+ },
+ "nativeMessaginPermissionErrorDesc": {
+ "message": "Without permission to communicate with the Bitwarden Desktop Application we cannot provide biometrics in the browser extension. Please try again."
+ },
+ "nativeMessaginPermissionSidebarTitle": {
+ "message": "Permission request error"
+ },
+ "nativeMessaginPermissionSidebarDesc": {
+ "message": "This action cannot be done in the sidebar, please retry the action in the popup or popout."
+ },
+ "personalOwnershipSubmitError": {
+ "message": "Due to an Enterprise Policy, you are restricted from saving items to your personal vault. Change the Ownership option to an organization and choose from available Collections."
+ },
+ "personalOwnershipPolicyInEffect": {
+ "message": "An organization policy is affecting your ownership options."
+ },
+ "excludedDomains": {
+ "message": "Excluded Domains"
+ },
+ "excludedDomainsDesc": {
+ "message": "Bitwarden will not ask to save login details for these domains. You must refresh the page for changes to take effect."
+ },
+ "excludedDomainsInvalidDomain": {
+ "message": "$DOMAIN$ is not a valid domain",
+ "placeholders": {
+ "domain": {
+ "content": "$1",
+ "example": "googlecom"
+ }
+ }
+ },
+ "send": {
+ "message": "Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "searchSends": {
+ "message": "Search Sends",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "addSend": {
+ "message": "Add Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTypeText": {
+ "message": "Text"
+ },
+ "sendTypeFile": {
+ "message": "File"
+ },
+ "allSends": {
+ "message": "All Sends",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "maxAccessCountReached": {
+ "message": "Max access count reached"
+ },
+ "expired": {
+ "message": "Expired"
+ },
+ "pendingDeletion": {
+ "message": "Pending deletion"
+ },
+ "passwordProtected": {
+ "message": "Password protected"
+ },
+ "copySendLink": {
+ "message": "Copy Send link",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "removePassword": {
+ "message": "Remove Password"
+ },
+ "delete": {
+ "message": "Delete"
+ },
+ "removedPassword": {
+ "message": "Removed Password"
+ },
+ "deletedSend": {
+ "message": "Deleted Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendLink": {
+ "message": "Send link",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "disabled": {
+ "message": "Disabled"
+ },
+ "removePasswordConfirmation": {
+ "message": "Are you sure you want to remove the password?"
+ },
+ "deleteSend": {
+ "message": "Delete Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "deleteSendConfirmation": {
+ "message": "Are you sure you want to delete this Send?",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "editSend": {
+ "message": "Edit Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTypeHeader": {
+ "message": "What type of Send is this?",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendNameDesc": {
+ "message": "A friendly name to describe this Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendFileDesc": {
+ "message": "The file you want to send."
+ },
+ "deletionDate": {
+ "message": "Deletion Date"
+ },
+ "deletionDateDesc": {
+ "message": "The Send will be permanently deleted on the specified date and time.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "expirationDate": {
+ "message": "Expiration Date"
+ },
+ "expirationDateDesc": {
+ "message": "If set, access to this Send will expire on the specified date and time.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "oneDay": {
+ "message": "1 day"
+ },
+ "days": {
+ "message": "$DAYS$ days",
+ "placeholders": {
+ "days": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "custom": {
+ "message": "Custom"
+ },
+ "maximumAccessCount": {
+ "message": "Maximum Access Count"
+ },
+ "maximumAccessCountDesc": {
+ "message": "If set, users will no longer be able to access this Send once the maximum access count is reached.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendPasswordDesc": {
+ "message": "Optionally require a password for users to access this Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendNotesDesc": {
+ "message": "Private notes about this Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendDisableDesc": {
+ "message": "Disable this Send so that no one can access it.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendShareDesc": {
+ "message": "Copy this Send's link to clipboard upon save.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTextDesc": {
+ "message": "The text you want to send."
+ },
+ "sendHideText": {
+ "message": "Hide this Send's text by default.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "currentAccessCount": {
+ "message": "Current Access Count"
+ },
+ "createSend": {
+ "message": "Create New Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "newPassword": {
+ "message": "New Password"
+ },
+ "sendDisabled": {
+ "message": "Send Disabled",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendDisabledWarning": {
+ "message": "Due to an enterprise policy, you are only able to delete an existing Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "createdSend": {
+ "message": "Created Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "editedSend": {
+ "message": "Edited Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendLinuxChromiumFileWarning": {
+ "message": "In order to choose a file, open the extension in the sidebar (if possible) or pop out to a new window by clicking this banner."
+ },
+ "sendFirefoxFileWarning": {
+ "message": "In order to choose a file using Firefox, open the extension in the sidebar or pop out to a new window by clicking this banner."
+ },
+ "sendSafariFileWarning": {
+ "message": "In order to choose a file using Safari, pop out to a new window by clicking this banner."
+ },
+ "sendFileCalloutHeader": {
+ "message": "Before you start"
+ },
+ "sendFirefoxCustomDatePopoutMessage1": {
+ "message": "To use a calendar style date picker",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read '**To use a calendar style date picker ** click here to pop out your window.'"
+ },
+ "sendFirefoxCustomDatePopoutMessage2": {
+ "message": "click here",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker **click here** to pop out your window.'"
+ },
+ "sendFirefoxCustomDatePopoutMessage3": {
+ "message": "to pop out your window.",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker click here **to pop out your window.**'"
+ },
+ "expirationDateIsInvalid": {
+ "message": "The expiration date provided is not valid."
+ },
+ "deletionDateIsInvalid": {
+ "message": "The deletion date provided is not valid."
+ },
+ "expirationDateAndTimeRequired": {
+ "message": "An expiration date and time are required."
+ },
+ "deletionDateAndTimeRequired": {
+ "message": "A deletion date and time are required."
+ },
+ "dateParsingError": {
+ "message": "There was an error saving your deletion and expiration dates."
+ },
+ "hideEmail": {
+ "message": "Hide my email address from recipients."
+ },
+ "sendOptionsPolicyInEffect": {
+ "message": "One or more organization policies are affecting your Send options."
+ },
+ "passwordPrompt": {
+ "message": "Master password re-prompt"
+ },
+ "passwordConfirmation": {
+ "message": "Master password confirmation"
+ },
+ "passwordConfirmationDesc": {
+ "message": "This action is protected. To continue, please re-enter your master password to verify your identity."
+ },
+ "emailVerificationRequired": {
+ "message": "Email Verification Required"
+ },
+ "emailVerificationRequiredDesc": {
+ "message": "You must verify your email to use this feature. You can verify your email in the web vault."
+ },
+ "updatedMasterPassword": {
+ "message": "Updated Master Password"
+ },
+ "updateMasterPassword": {
+ "message": "Update Master Password"
+ },
+ "updateMasterPasswordWarning": {
+ "message": "Your Master Password was recently changed by an administrator in your organization. In order to access the vault, you must update it now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour."
+ },
+ "resetPasswordPolicyAutoEnroll": {
+ "message": "Automatic Enrollment"
+ },
+ "resetPasswordAutoEnrollInviteWarning": {
+ "message": "This organization has an enterprise policy that will automatically enroll you in password reset. Enrollment will allow organization administrators to change your master password."
+ },
+ "selectFolder": {
+ "message": "Select folder..."
+ },
+ "ssoCompleteRegistration": {
+ "message": "In order to complete logging in with SSO, please set a master password to access and protect your vault."
+ },
+ "hours": {
+ "message": "Hours"
+ },
+ "minutes": {
+ "message": "Minutes"
+ },
+ "vaultTimeoutPolicyInEffect": {
+ "message": "Your organization policies are affecting your vault timeout. Maximum allowed Vault Timeout is $HOURS$ hour(s) and $MINUTES$ minute(s)",
+ "placeholders": {
+ "hours": {
+ "content": "$1",
+ "example": "5"
+ },
+ "minutes": {
+ "content": "$2",
+ "example": "5"
+ }
+ }
+ },
+ "vaultTimeoutToLarge": {
+ "message": "Your vault timeout exceeds the restrictions set by your organization."
+ },
+ "vaultExportDisabled": {
+ "message": "Vault Export Disabled"
+ },
+ "personalVaultExportPolicyInEffect": {
+ "message": "One or more organization policies prevents you from exporting your personal vault."
+ },
+ "copyCustomFieldNameInvalidElement": {
+ "message": "Unable to identify a valid form element. Try inspecting the HTML instead."
+ },
+ "copyCustomFieldNameNotUnique": {
+ "message": "No unique identifier found."
+ }
+}
diff --git a/src/iOS.Safari/Resources/_locales/lv/messages.json b/src/iOS.Safari/Resources/_locales/lv/messages.json
new file mode 100644
index 000000000..1614d2500
--- /dev/null
+++ b/src/iOS.Safari/Resources/_locales/lv/messages.json
@@ -0,0 +1,1817 @@
+{
+ "appName": {
+ "message": "Bitwarden"
+ },
+ "extName": {
+ "message": "Bitwarden",
+ "description": "Extension name, MUST be less than 40 characters (Safari restriction)"
+ },
+ "extDesc": {
+ "message": "Drošs bezmaksas paroļu pārvaldnieks visām Tavām ierīcēm.",
+ "description": "Extension description"
+ },
+ "loginOrCreateNewAccount": {
+ "message": "Pieraksties vai izveido jaunu kontu, lai piekļūtu drošajai glabātavai!"
+ },
+ "createAccount": {
+ "message": "Izveidot kontu"
+ },
+ "login": {
+ "message": "Pierakstīties"
+ },
+ "enterpriseSingleSignOn": {
+ "message": "Uzņēmuma vienotā pierakstīšanās"
+ },
+ "cancel": {
+ "message": "Atcelt"
+ },
+ "close": {
+ "message": "Aizvērt"
+ },
+ "submit": {
+ "message": "Iesniegt"
+ },
+ "emailAddress": {
+ "message": "E-pasta adrese"
+ },
+ "masterPass": {
+ "message": "Galvenā parole"
+ },
+ "masterPassDesc": {
+ "message": "Galvenā parole ir parole, kas tiek izmantota, lai piekļūtu glabātavai. Ir ļoti svarīgi, ka tā netiek aizmirsta, jo tādā gadījumā to nav iespējams atgūt."
+ },
+ "masterPassHintDesc": {
+ "message": "Galvenās paroles norāde var palīdzēt atcerēties paroli, ja tā ir aizmirsta."
+ },
+ "reTypeMasterPass": {
+ "message": "Atkārtoti ievadīt galveno paroli "
+ },
+ "masterPassHint": {
+ "message": "Galvenās paroles norāde (nav nepieciešama)"
+ },
+ "tab": {
+ "message": "Cilne"
+ },
+ "myVault": {
+ "message": "Mana glabātava"
+ },
+ "tools": {
+ "message": "Rīki"
+ },
+ "settings": {
+ "message": "Iestatījumi"
+ },
+ "currentTab": {
+ "message": "Pašreizējā cilne"
+ },
+ "copyPassword": {
+ "message": "Ievietot paroli starpliktuvē"
+ },
+ "copyNote": {
+ "message": "Ievietot piezīmi starpliktuvē"
+ },
+ "copyUri": {
+ "message": "Ievietot URI starpliktuvē"
+ },
+ "copyUsername": {
+ "message": "Ievietot lietotājvārdu starpliktuvē"
+ },
+ "copyNumber": {
+ "message": "Ievietot numuru starpliktuvē"
+ },
+ "copySecurityCode": {
+ "message": "Ievietot drošības kodu starpliktuvē"
+ },
+ "autoFill": {
+ "message": "Automātiskā aizpilde"
+ },
+ "generatePasswordCopied": {
+ "message": "Veidot paroli (ievietota starpliktuvē)"
+ },
+ "copyElementIdentifier": {
+ "message": "Copy Custom Field Name"
+ },
+ "noMatchingLogins": {
+ "message": "Nav atbilstošu pierakstīšanās vienumu."
+ },
+ "vaultLocked": {
+ "message": "Glabātava ir slēgta."
+ },
+ "vaultLoggedOut": {
+ "message": "Izrakstījies no glabātavas."
+ },
+ "autoFillInfo": {
+ "message": "Nav pierakstīšanās vienumu, kurus automātiski ievadīt pašreizējā pārlūka cilnē."
+ },
+ "addLogin": {
+ "message": "Pievienot pierakstīšanās vienumu"
+ },
+ "addItem": {
+ "message": "Pievienot vienumu"
+ },
+ "passwordHint": {
+ "message": "Paroles norāde"
+ },
+ "enterEmailToGetHint": {
+ "message": "Norādīt konta e-pasta adresi, lai saņemtu galvenās paroles norādi."
+ },
+ "getMasterPasswordHint": {
+ "message": "Saņemt galvenās paroles norādi"
+ },
+ "continue": {
+ "message": "Turpināt"
+ },
+ "verificationCode": {
+ "message": "Apstiprināšanas kods"
+ },
+ "account": {
+ "message": "Konts"
+ },
+ "changeMasterPassword": {
+ "message": "Mainīt galveno paroli"
+ },
+ "fingerprintPhrase": {
+ "message": "Atpazīšanas vārdkopa",
+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
+ },
+ "yourAccountsFingerprint": {
+ "message": "Konta atpazīšanas vārdkopa",
+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
+ },
+ "twoStepLogin": {
+ "message": "Divpakāpju pierakstīšanās"
+ },
+ "logOut": {
+ "message": "Izrakstīties"
+ },
+ "about": {
+ "message": "Par"
+ },
+ "version": {
+ "message": "Laidiens"
+ },
+ "save": {
+ "message": "Saglabāt"
+ },
+ "move": {
+ "message": "Pārvietot"
+ },
+ "addFolder": {
+ "message": "Pievienot mapi"
+ },
+ "name": {
+ "message": "Nosaukums"
+ },
+ "editFolder": {
+ "message": "Labot mapi"
+ },
+ "deleteFolder": {
+ "message": "Dzēst mapi"
+ },
+ "folders": {
+ "message": "Mapes"
+ },
+ "noFolders": {
+ "message": "Nav parādāmu mapju."
+ },
+ "helpFeedback": {
+ "message": "Palīdzība un atsauksmes"
+ },
+ "sync": {
+ "message": "Sinhronizēt"
+ },
+ "syncVaultNow": {
+ "message": "Sinhronizēt glabātavu"
+ },
+ "lastSync": {
+ "message": "Pēdējā sinhronizācija:"
+ },
+ "passGen": {
+ "message": "Paroļu veidotājs"
+ },
+ "generator": {
+ "message": "Veidotājs",
+ "description": "Short for 'Password Generator'."
+ },
+ "passGenInfo": {
+ "message": "Automātiski veido spēcīgas, neatkārtojamas paroles visiem pierakstīšanās vienumiem. "
+ },
+ "bitWebVault": {
+ "message": "Bitwarden tīmekļa glabātava"
+ },
+ "importItems": {
+ "message": "Ievietot vienumus"
+ },
+ "select": {
+ "message": "Atlasīt"
+ },
+ "generatePassword": {
+ "message": "Veidot paroli"
+ },
+ "regeneratePassword": {
+ "message": "Pārizveidot paroli"
+ },
+ "options": {
+ "message": "Iespējas"
+ },
+ "length": {
+ "message": "Garums"
+ },
+ "numWords": {
+ "message": "Vārdu skaits"
+ },
+ "wordSeparator": {
+ "message": "Vārdu atdalītājs"
+ },
+ "capitalize": {
+ "message": "Izmantot lielos sākumburtus",
+ "description": "Make the first letter of a work uppercase."
+ },
+ "includeNumber": {
+ "message": "Iekļaut ciparu"
+ },
+ "minNumbers": {
+ "message": "Mazākais pieļaujamais ciparu skaits"
+ },
+ "minSpecial": {
+ "message": "Mazākais pieļaujamais īpašo rakstzīmju skaits"
+ },
+ "avoidAmbChar": {
+ "message": "Izvairīties no viegli sajaucamām rakstzīmēm"
+ },
+ "searchVault": {
+ "message": "Meklēt glabātavā"
+ },
+ "edit": {
+ "message": "Labot"
+ },
+ "view": {
+ "message": "Skatīt"
+ },
+ "noItemsInList": {
+ "message": "Nav vienumu, ko parādīt."
+ },
+ "itemInformation": {
+ "message": "Vienuma informācija"
+ },
+ "username": {
+ "message": "Lietotājvārds"
+ },
+ "password": {
+ "message": "Parole"
+ },
+ "passphrase": {
+ "message": "Paroles vārdkopa"
+ },
+ "favorite": {
+ "message": "Izlasē"
+ },
+ "notes": {
+ "message": "Piezīmes"
+ },
+ "note": {
+ "message": "Piezīme"
+ },
+ "editItem": {
+ "message": "Labot vienumu"
+ },
+ "folder": {
+ "message": "Mape"
+ },
+ "deleteItem": {
+ "message": "Izdzēst vienumu"
+ },
+ "viewItem": {
+ "message": "Skatīt vienumu"
+ },
+ "launch": {
+ "message": "Palaist"
+ },
+ "website": {
+ "message": "Tīmekļa vietne"
+ },
+ "toggleVisibility": {
+ "message": "Pārslēgt redzamību"
+ },
+ "manage": {
+ "message": "Pārvaldīt"
+ },
+ "other": {
+ "message": "Cits"
+ },
+ "rateExtension": {
+ "message": "Novērtēt paplašinājumu"
+ },
+ "rateExtensionDesc": {
+ "message": "Lūdzu, apsver palīdzēt mums ar labu atsauksmi!"
+ },
+ "browserNotSupportClipboard": {
+ "message": "Tavs tīmekļa pārlūks neatbalsta vienkāršu starpliktuves kopēšanu. Nokopē to pašrocīgi!"
+ },
+ "verifyMasterPassword": {
+ "message": "Apstiprināt galveno paroli"
+ },
+ "yourVaultIsLocked": {
+ "message": "Glabātava ir slēgta. Nepieciešams norādīt galveno paroli, lai turpinātu."
+ },
+ "unlock": {
+ "message": "Atslēgt"
+ },
+ "loggedInAsOn": {
+ "message": "Pierakstījies $HOSTNAME$ kā $EMAIL$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "name@example.com"
+ },
+ "hostname": {
+ "content": "$2",
+ "example": "bitwarden.com"
+ }
+ }
+ },
+ "invalidMasterPassword": {
+ "message": "Nederīga galvenā parole"
+ },
+ "vaultTimeout": {
+ "message": "Glabātavas noildze"
+ },
+ "lockNow": {
+ "message": "Aizslēgt"
+ },
+ "immediately": {
+ "message": "Nekavējoties"
+ },
+ "tenSeconds": {
+ "message": "10 sekundes"
+ },
+ "twentySeconds": {
+ "message": "20 sekundes"
+ },
+ "thirtySeconds": {
+ "message": "30 sekundes"
+ },
+ "oneMinute": {
+ "message": "1 minūte"
+ },
+ "twoMinutes": {
+ "message": "2 minūtes"
+ },
+ "fiveMinutes": {
+ "message": "5 minūtes"
+ },
+ "fifteenMinutes": {
+ "message": "15 minūtes"
+ },
+ "thirtyMinutes": {
+ "message": "30 minūtes"
+ },
+ "oneHour": {
+ "message": "1 stunda"
+ },
+ "fourHours": {
+ "message": "4 stundas"
+ },
+ "onLocked": {
+ "message": "Pēc sistēmas aizslēgšanas"
+ },
+ "onRestart": {
+ "message": "Pēc pārlūka pārsāknēšanas"
+ },
+ "never": {
+ "message": "Nekad"
+ },
+ "security": {
+ "message": "Drošība"
+ },
+ "errorOccurred": {
+ "message": "Radusies kļūda"
+ },
+ "emailRequired": {
+ "message": "E-pasta adrese ir nepieciešama."
+ },
+ "invalidEmail": {
+ "message": "Nederīga e-pasta adrese."
+ },
+ "masterPassRequired": {
+ "message": "Galvenā parole ir nepieciešama."
+ },
+ "masterPassLength": {
+ "message": "Galvenajai parolei ir jābūt vismaz 8 rakstzīmes garai."
+ },
+ "masterPassDoesntMatch": {
+ "message": "Galvenās paroles apstiprinājums nesakrīt."
+ },
+ "newAccountCreated": {
+ "message": "Tavs jaunais konts ir izveidots. Tagad Tu vari pierakstīties."
+ },
+ "masterPassSent": {
+ "message": "Mēs nosūtījām galvenās paroles norādi e-pastā."
+ },
+ "verificationCodeRequired": {
+ "message": "Apstiprinājuma kods ir nepieciešams."
+ },
+ "valueCopied": {
+ "message": "$VALUE$ ievietota starpliktuvē",
+ "description": "Value has been copied to the clipboard.",
+ "placeholders": {
+ "value": {
+ "content": "$1",
+ "example": "Password"
+ }
+ }
+ },
+ "autofillError": {
+ "message": "Neizdevās automātiski aizpildīt izvēlēto vienumu šajā lapā. Tā vietā kopē un ielīmē to! "
+ },
+ "loggedOut": {
+ "message": "Izrakstījies"
+ },
+ "loginExpired": {
+ "message": "Pierakstīšanās sesija ir beigusies."
+ },
+ "logOutConfirmation": {
+ "message": "Vai tiešām izrakstīties?"
+ },
+ "yes": {
+ "message": "Jā"
+ },
+ "no": {
+ "message": "Nē"
+ },
+ "unexpectedError": {
+ "message": "Ir radusies neparedzēta kļūda."
+ },
+ "nameRequired": {
+ "message": "Nosaukums ir nepieciešams."
+ },
+ "addedFolder": {
+ "message": "Pievienoja mapi"
+ },
+ "changeMasterPass": {
+ "message": "Mainīt galveno paroli"
+ },
+ "changeMasterPasswordConfirmation": {
+ "message": "Galveno paroli ir iespējams mainīt bitwarden.com tīmekļa glabātavā. Vai apmeklēt tīmekļa vietni?"
+ },
+ "twoStepLoginConfirmation": {
+ "message": "Divpakāpju pieslēgšanās padara kontu krietni drošāku, pieprasot apstiprināt pierakstīšanos ar tādu citu ierīču vai pakalpojumu starpniecību kā drošības atslēga, autentificētāja lietotne, īsziņa, tālruņa zvans vai e-pasts. Divpakāpju pierakstīšanos var iespējot bitwarden.com tīmekļa glabātavā. Vai apmeklēt tīmekļa vietni?"
+ },
+ "editedFolder": {
+ "message": "Mape labota"
+ },
+ "deleteFolderConfirmation": {
+ "message": "Vai tiešām izdzēst šo mapi?"
+ },
+ "deletedFolder": {
+ "message": "Mape izdzēsta"
+ },
+ "gettingStartedTutorial": {
+ "message": "Uzsākšanas pamācība"
+ },
+ "gettingStartedTutorialVideo": {
+ "message": "Noskaties mūsu uzsākšanas pamācību, lai uzzinātu, kā iegūt vislielāko labumu no pārlūka paplašinājuma."
+ },
+ "syncingComplete": {
+ "message": "Sinhronizācija pabeigta"
+ },
+ "syncingFailed": {
+ "message": "Sinhronizācija neizdevās"
+ },
+ "passwordCopied": {
+ "message": "Parole ievietota starpliktuvē"
+ },
+ "uri": {
+ "message": "URI"
+ },
+ "uriPosition": {
+ "message": "URI $POSITION$",
+ "description": "A listing of URIs. Ex: URI 1, URI 2, URI 3, etc.",
+ "placeholders": {
+ "position": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "newUri": {
+ "message": "Jauns URI"
+ },
+ "addedItem": {
+ "message": "Vienums pievienots"
+ },
+ "editedItem": {
+ "message": "Vienums labots"
+ },
+ "deleteItemConfirmation": {
+ "message": "Vai tiešām pārvietot vienumu uz atkritni?"
+ },
+ "deletedItem": {
+ "message": "Vienums pārvietots uz atkritni"
+ },
+ "overwritePassword": {
+ "message": "Pārrakstīt paroli"
+ },
+ "overwritePasswordConfirmation": {
+ "message": "Vai tiešām pārrakstīt esošo paroli?"
+ },
+ "searchFolder": {
+ "message": "Meklēt mapē"
+ },
+ "searchCollection": {
+ "message": "Meklēt krājumā"
+ },
+ "searchType": {
+ "message": "Meklēšanas veids"
+ },
+ "noneFolder": {
+ "message": "Nav mapes",
+ "description": "This is the folder for uncategorized items"
+ },
+ "disableAddLoginNotification": {
+ "message": "Atspējot piekļuves vienumu pievienošanas paziņojumu"
+ },
+ "addLoginNotificationDesc": {
+ "message": "Iestatījums \"Piekļuves vienumu pievienošanas paziņojumi\" piedāvā saglabāt jaunus pieslēgšanās ierakstus, kad vien tie tiek izmantoti pirmo reizi ierakstoties."
+ },
+ "dontShowCardsCurrentTab": {
+ "message": "Nerādīt kartes cilnes lapā"
+ },
+ "dontShowCardsCurrentTabDesc": {
+ "message": "Glabātavas karšu vienumi tiek attēloti 'Pašreizējā cilne' lapā vieglai piekļūšanai automātiskajai aizpildīšanai."
+ },
+ "dontShowIdentitiesCurrentTab": {
+ "message": "Nerādīt identitātes cilnes pārskatā"
+ },
+ "dontShowIdentitiesCurrentTabDesc": {
+ "message": "Glabātavas identitātes vienumi tiek attēloti 'Pašreizējā cilne' lapā vieglai piekļūšanai automātiskajai aizpildīšanai."
+ },
+ "clearClipboard": {
+ "message": "Notīrīt starpliktuvi",
+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
+ },
+ "clearClipboardDesc": {
+ "message": "Automātiski noņemt kopētās vērtības no starpliktuves.",
+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
+ },
+ "notificationAddDesc": {
+ "message": "Vai Bitwarden atcerēties šo paroli?"
+ },
+ "notificationAddSave": {
+ "message": "Jā, saglabāt"
+ },
+ "notificationNeverSave": {
+ "message": "Nekad šai tīmekļa vietnei"
+ },
+ "disableChangedPasswordNotification": {
+ "message": "Atspējot mainītas paroles paziņojumu"
+ },
+ "disableChangedPasswordNotificationDesc": {
+ "message": "\"Mainītas paroles paziņojums\" vaicā atjaunināt pieteikšanās vienuma paroli glabātavā, kad vien tiek noteikts, ka tā ir mainīta tīmekļa vietnē."
+ },
+ "notificationChangeDesc": {
+ "message": "Vai atjaunināt šo paroli Bitwarden?"
+ },
+ "notificationChangeSave": {
+ "message": "Jā, atjaunināt"
+ },
+ "disableContextMenuItem": {
+ "message": "Atspējot konteksta izvēlnes iespējas"
+ },
+ "disableContextMenuItemDesc": {
+ "message": "Konteksta izvēlnes iespējas piedāvā ātru piekļūšanu paroļu veidošanai un tīmekļa vietnes pieteikšanās vienumiem pašreizējā cilnē."
+ },
+ "defaultUriMatchDetection": {
+ "message": "Noklusējuma URI atbilstības noteikšana",
+ "description": "Default URI match detection for auto-fill."
+ },
+ "defaultUriMatchDetectionDesc": {
+ "message": "Izvēlēties noklusējuma veidu, kādā URI atbilstības noteikšana tiek apstrādāta, kad tiek veiktas tādas darbības kā automātiska aizpildīšana."
+ },
+ "theme": {
+ "message": "Izskats"
+ },
+ "themeDesc": {
+ "message": "Mainīt lietotnes izskata krāsas."
+ },
+ "dark": {
+ "message": "Tumšs",
+ "description": "Dark color"
+ },
+ "light": {
+ "message": "Gaišs",
+ "description": "Light color"
+ },
+ "solarizedDark": {
+ "message": "Tumšs Solarized",
+ "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated."
+ },
+ "exportVault": {
+ "message": "Izdot glabātavas saturu"
+ },
+ "fileFormat": {
+ "message": "Datnes veids"
+ },
+ "warning": {
+ "message": "UZMANĪBU",
+ "description": "WARNING (should stay in capitalized letters if the language permits)"
+ },
+ "confirmVaultExport": {
+ "message": "Apstiprināt glabātavas satura izdošanu"
+ },
+ "exportWarningDesc": {
+ "message": "Šī datu izdošana satur glabātavas datus nešifrētā veidā. Izdoto datni nevajadzētu glabāt vai sūtīt nedrošos veidos (piemēram, e-pastā). Izdzēst to uzreiz pēc izmantošanas."
+ },
+ "encExportKeyWarningDesc": {
+ "message": "Šī izvade šifrē datus ar konta šifrēšanas atslēgu. Ja tā jebkad tiks mainīta, izvadi vajadzētu veikt vēlreiz, jo vairs nebūs iespējams atšifrēt šo datni."
+ },
+ "encExportAccountWarningDesc": {
+ "message": "Katram kontam ir neatkārtojamas šifrēšanas atslēgas, tādēļ nav iespējams ievietot šifrētas izdošanas datnes saturu citā kontā."
+ },
+ "exportMasterPassword": {
+ "message": "Ievadīt galveno paroli, lai izdotu glabātavas datus."
+ },
+ "shared": {
+ "message": "Kopīgots"
+ },
+ "learnOrg": {
+ "message": "Uzzināt par apvienībām"
+ },
+ "learnOrgConfirmation": {
+ "message": "Bitwarden nodrošina iespēju kopīgot glabātavas vienumus ar citiem, kad tiek izmantota apvienība. Vai apmeklēt bitwarden.com tīmekļa vietni, lai uzzinātu vairāk?"
+ },
+ "moveToOrganization": {
+ "message": "Pārvietot uz apvienību"
+ },
+ "share": {
+ "message": "Kopīgot"
+ },
+ "movedItemToOrg": {
+ "message": "$ITEMNAME$ pārvietots uz $ORGNAME$",
+ "placeholders": {
+ "itemname": {
+ "content": "$1",
+ "example": "Secret Item"
+ },
+ "orgname": {
+ "content": "$2",
+ "example": "Company Name"
+ }
+ }
+ },
+ "moveToOrgDesc": {
+ "message": "Izvēlies apvienību, uz kuru pārvietot šo vienumu. Pārvietošana nodod šī vienuma piederību apvienībai. Tu vairs nebūsi šī vienuma tiešais īpašnieks pēc tā pārvietošanas."
+ },
+ "learnMore": {
+ "message": "Uzzināt vairāk"
+ },
+ "authenticatorKeyTotp": {
+ "message": "Autentificētāja atslēga (TOTP)"
+ },
+ "verificationCodeTotp": {
+ "message": "Apstiprinājuma kods (TOTP)"
+ },
+ "copyVerificationCode": {
+ "message": "Ievietot apstiprinājuma kodu starpliktuvē"
+ },
+ "attachments": {
+ "message": "Pielikumi"
+ },
+ "deleteAttachment": {
+ "message": "Izdzēst pielikumu"
+ },
+ "deleteAttachmentConfirmation": {
+ "message": "Vai tiešām izdzēst šo pielikumu?"
+ },
+ "deletedAttachment": {
+ "message": "Pielikums izdzēsts"
+ },
+ "newAttachment": {
+ "message": "Pievienot Jaunu Pielikumu"
+ },
+ "noAttachments": {
+ "message": "Nav pielikumu."
+ },
+ "attachmentSaved": {
+ "message": "Pielikums tika saglabāts."
+ },
+ "file": {
+ "message": "Datne"
+ },
+ "selectFile": {
+ "message": "Atlasīt datni."
+ },
+ "maxFileSize": {
+ "message": "Lielākais pieļaujamais datnes izmērs ir 500 MB."
+ },
+ "featureUnavailable": {
+ "message": "Iespēja nav pieejama"
+ },
+ "updateKey": {
+ "message": "Jūs nevarat izmantot šo funkciju līdz jūs atjaunojat savu šifrēšanas atslēgu."
+ },
+ "premiumMembership": {
+ "message": "Premium dalība"
+ },
+ "premiumManage": {
+ "message": "Pārvaldīt dalību"
+ },
+ "premiumManageAlert": {
+ "message": "Dalību ir iespējams pārvaldīt bitwarden.com tīmekļa glabātavā. Vai apmeklēt tīmekļa vietni?"
+ },
+ "premiumRefresh": {
+ "message": "Atjaunot dalību"
+ },
+ "premiumNotCurrentMember": {
+ "message": "Tu pašlaik neesi Premium dalībnieks."
+ },
+ "premiumSignUpAndGet": {
+ "message": "Piesakies Premium dalībai un saņem:"
+ },
+ "ppremiumSignUpStorage": {
+ "message": "1 GB šifrētas krātuves datņu pielikumiem."
+ },
+ "ppremiumSignUpTwoStep": {
+ "message": "Tādas papildus divpakāpju pierakstīšanās iespējas kā YubiKey, FIDO U2F un Duo."
+ },
+ "ppremiumSignUpReports": {
+ "message": "Paroļu higiēnas, kontu veselības un datu pārkāpumu pārskati, lai uzturētu glabātavu drošu."
+ },
+ "ppremiumSignUpTotp": {
+ "message": "TOTP apstiprinājuma kodu (2FA) veidotājs piekļuves ierakstiem glabātavā."
+ },
+ "ppremiumSignUpSupport": {
+ "message": "Priekšrocīgs lietotāju atbalsts."
+ },
+ "ppremiumSignUpFuture": {
+ "message": "Visas nākotnes Premium iespējas. Vairāk drīzumā!"
+ },
+ "premiumPurchase": {
+ "message": "Iegādāties Premium"
+ },
+ "premiumPurchaseAlert": {
+ "message": "Premium dalību ir iespējams iegādāties bitwarden.com tīmekļa glabātavā. Vai apmeklēt tīmekļa vietni?"
+ },
+ "premiumCurrentMember": {
+ "message": "Tu esi Premium dalībnieks!"
+ },
+ "premiumCurrentMemberThanks": {
+ "message": "Paldies, ka atbalsti Bitwarden!"
+ },
+ "premiumPrice": {
+ "message": "Viss par tikai $PRICE$ gadā!",
+ "placeholders": {
+ "price": {
+ "content": "$1",
+ "example": "$10"
+ }
+ }
+ },
+ "refreshComplete": {
+ "message": "Atsvaidzināšana pabeigta"
+ },
+ "disableAutoTotpCopy": {
+ "message": "Atspējot automātisku TOTP ievietošanu starpliktuvē"
+ },
+ "disableAutoTotpCopyDesc": {
+ "message": "Ja pierakstīšanās datiem ir pievienota autentificētāja atslēga, TOTP apstiprinājuma kods tiks automātiski pārkopēts uz starpliktuvi, kad vien tiks automātiski aizpildīta pierakstīšanās veidne."
+ },
+ "disableAutoBiometricsPrompt": {
+ "message": "Do not prompt for biometrics on launch"
+ },
+ "premiumRequired": {
+ "message": "Nepieciešams Premium"
+ },
+ "premiumRequiredDesc": {
+ "message": "Ir nepieciešama Premium dalība, lai izmantotu šo iespēju."
+ },
+ "enterVerificationCodeApp": {
+ "message": "Ievadi 6 ciparu apstiprinājuma kodu no autentificētāja lietotnes!"
+ },
+ "enterVerificationCodeEmail": {
+ "message": "Ievadi 6 ciparu apstiprinājuma kodu, kas tika nosūtīts uz $EMAIL$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "example@gmail.com"
+ }
+ }
+ },
+ "verificationCodeEmailSent": {
+ "message": "E-pasts apstiprināšanai nosūtīts uz $EMAIL$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "example@gmail.com"
+ }
+ }
+ },
+ "rememberMe": {
+ "message": "Atcerēties mani"
+ },
+ "sendVerificationCodeEmailAgain": {
+ "message": "Sūtīt apstiprinājuma koda e-pastu vēlreiz"
+ },
+ "useAnotherTwoStepMethod": {
+ "message": "Izmantot citu divpakāpju pierakstīšanās veidu"
+ },
+ "insertYubiKey": {
+ "message": "Ievieto savu YubiKey datora USB ligzdā un pieskaries tā pogai!"
+ },
+ "insertU2f": {
+ "message": "Ievieto savu drošības atslēgu datora USB ligzdā! Ja tai ir poga, pieskaries tai!"
+ },
+ "webAuthnNewTab": {
+ "message": "Turpināt WebAuthn 2FA apstiprināšanu jaunā cilnē."
+ },
+ "webAuthnNewTabOpen": {
+ "message": "Atvērt jaunu cilni"
+ },
+ "webAuthnAuthenticate": {
+ "message": "Autentificēt WebAuthn"
+ },
+ "loginUnavailable": {
+ "message": "Pierakstīšanās nav pieejama"
+ },
+ "noTwoStepProviders": {
+ "message": "Šim kontam ir iespējota divpakāpju pierakstīšanās, bet šajā pārlūkā netiek atbalstīts neviens no uzstādītajiem divpakāpju pārbaudes nodrošinātājiem."
+ },
+ "noTwoStepProviders2": {
+ "message": "Lūgums izmantot atbalstītu tīmekļa pārlūku (piemēram Chrome) un/vai pievienot papildus nodrošinātājus, kas tiek labāk atbalstīti dažādos pārlūkos (piemēram autentificētāja lietotni)."
+ },
+ "twoStepOptions": {
+ "message": "Divpakāpju pierakstīšanās iespējas"
+ },
+ "recoveryCodeDesc": {
+ "message": "Zaudēta piekļuve visiem divpakāpju nodrošinātājiem? Izmanto atkopšanas kodus, lai atspējotu visus sava konta divpakāpju nodrošinātājus!"
+ },
+ "recoveryCodeTitle": {
+ "message": "Atgūšanas kods"
+ },
+ "authenticatorAppTitle": {
+ "message": "Autentificētāja lietotne"
+ },
+ "authenticatorAppDesc": {
+ "message": "Izmanto autentificētāja lietotni (piemēram, Authy vai Google autentifikators), lai izveidotu laikā balstītus apstiprinājuma kodus!",
+ "description": "'Authy' and 'Google Authenticator' are product names and should not be translated."
+ },
+ "yubiKeyTitle": {
+ "message": "YubiKey OTP drošības atslēga"
+ },
+ "yubiKeyDesc": {
+ "message": "Izmanto YubiKey, lai piekļūtu savam kontam! Darbojas ar YubiKey 4, 4 Nano, 4C un NEO ierīcēm."
+ },
+ "duoDesc": {
+ "message": "Apstiprini ar Duo Security, izmantojot Duo Mobile lietotni, īsziņu, tālruņa zvanu vai U2F drošības atslēgu!",
+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
+ },
+ "duoOrganizationDesc": {
+ "message": "Apstiprini ar Duo Security savā apvienībā, izmantojot Duo Mobile lietotni, īsziņu, tālruņa zvanu vai U2F drošības atslēgu!",
+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
+ },
+ "webAuthnTitle": {
+ "message": "FIDO2 WebAuthn"
+ },
+ "webAuthnDesc": {
+ "message": "Izmantot jebkuru WebAuthn atbalstošu drošības atslēgu, lai piekļūtu kontam."
+ },
+ "emailTitle": {
+ "message": "E-pasts"
+ },
+ "emailDesc": {
+ "message": "Apstiprinājuma kodi tiks nosūtīti e-pastā."
+ },
+ "selfHostedEnvironment": {
+ "message": "Pašuzturēta vide"
+ },
+ "selfHostedEnvironmentFooter": {
+ "message": "Norādīt pašuzstādīta Bitwarden pamata URL."
+ },
+ "customEnvironment": {
+ "message": "Pielāgota vide"
+ },
+ "customEnvironmentFooter": {
+ "message": "Pieredzējušiem lietotājiem. Ir iespējams norādīt URL katram pakalpojumam atsevišķi."
+ },
+ "baseUrl": {
+ "message": "Servera URL"
+ },
+ "apiUrl": {
+ "message": "API servera URL"
+ },
+ "webVaultUrl": {
+ "message": "Tīmekļa glabātavas servera URL"
+ },
+ "identityUrl": {
+ "message": "Identitātes servera URL"
+ },
+ "notificationsUrl": {
+ "message": "Paziņojumu servera URL"
+ },
+ "iconsUrl": {
+ "message": "Ikonu servera URL"
+ },
+ "environmentSaved": {
+ "message": "Vides URL ir saglabāti."
+ },
+ "enableAutoFillOnPageLoad": {
+ "message": "Iespējot aizpildīšanu lapas ielādes brīdī"
+ },
+ "enableAutoFillOnPageLoadDesc": {
+ "message": "Ja tiek noteikta pieslēgšanās veidne, tā tiks aizpildīta lapas ielādes brīdī."
+ },
+ "experimentalFeature": {
+ "message": "Šī iespēja pašlaik ir izmēģināšanā. Izmantošanas atbildība ir katra paša pārziņā. "
+ },
+ "defaultAutoFillOnPageLoad": {
+ "message": "Noklusējuma automātiskās aizpildes iestatījums pierakstīšanās vienumiem"
+ },
+ "defaultAutoFillOnPageLoadDesc": {
+ "message": "Pēc automātiskās aizpildes lapas ielādes brīdī iespējošanas šo iespēju var ieslēgt vai izslēgt atsevišķiem pierakstīšanās vienumiem. Šis ir noklusējuma iestatījums visiem ierakstiem, kuriem nav norādīts šis uzstādījums."
+ },
+ "itemAutoFillOnPageLoad": {
+ "message": "Automātiski aizpildīt lapas ielādes brīdī (ja iespējots iestatījumos)"
+ },
+ "autoFillOnPageLoadUseDefault": {
+ "message": "Izmantot noklusējuma iestatījumu"
+ },
+ "autoFillOnPageLoadYes": {
+ "message": "Automātiski aizpildīt lapas ielādes brīdī"
+ },
+ "autoFillOnPageLoadNo": {
+ "message": "Neaizpildīt lapas ielādes brīdī"
+ },
+ "commandOpenPopup": {
+ "message": "Atvērt glabātavas uznirstošo logu"
+ },
+ "commandOpenSidebar": {
+ "message": "Atvērt glabātavu sānu joslā"
+ },
+ "commandAutofillDesc": {
+ "message": "Automātiski aizpildīt ar iepriekš izmantoto pierakstīšanās vienumu pašreizējā tīmekļa vietnē"
+ },
+ "commandGeneratePasswordDesc": {
+ "message": "Izveidot jaunu nejaušu paroli un ievietot to starpliktuvē"
+ },
+ "commandLockVaultDesc": {
+ "message": "Aizslēgt glabātavu"
+ },
+ "privateModeMessage": {
+ "message": "Diemžēl šis logs nav pieejams privātajā režīmā šajā pārlūkā."
+ },
+ "customFields": {
+ "message": "Pielāgoti lauki"
+ },
+ "copyValue": {
+ "message": "Ievietot vērtību starpliktuvē"
+ },
+ "value": {
+ "message": "Vērtība"
+ },
+ "newCustomField": {
+ "message": "Jauns pielāgotais lauks"
+ },
+ "dragToSort": {
+ "message": "Vilkt, lai kārtotu"
+ },
+ "cfTypeText": {
+ "message": "Teksts"
+ },
+ "cfTypeHidden": {
+ "message": "Paslēpts"
+ },
+ "cfTypeBoolean": {
+ "message": "Patiesuma vērtība"
+ },
+ "popup2faCloseMessage": {
+ "message": "Klikšķināšana ārpus uznirstošā loga, lai apskatītu e-pastā apstiprinājuma kodu, to aizvērs. Vai atvērt to atsevišķā logā, lai tas netiktu aizvērts?"
+ },
+ "popupU2fCloseMessage": {
+ "message": "Šis pārlūks nevar apstrādāt U2F pieprasījumus šajā uznirstošajā logā. Vai atvērt to atsevišķā logā, lai varētu pierakstīties, izmantojot U2F?"
+ },
+ "disableFavicon": {
+ "message": "Atspējot tīmekļa vietņu ikonas"
+ },
+ "disableFaviconDesc": {
+ "message": "Tīmekļa vietņu ikonas nodrošina atpazīstamu attēlu pie katra glabātavas pieteikšanās vienuma."
+ },
+ "disableBadgeCounter": {
+ "message": "Atspējot skaitītāja nozīmīti"
+ },
+ "disableBadgeCounterDesc": {
+ "message": "Skaitītāja nozīmīte norāda, cik pierakstīšanās vienumu pašreizējai lapai ir atrodami glabātavā."
+ },
+ "cardholderName": {
+ "message": "Kartes īpašnieka vārds"
+ },
+ "number": {
+ "message": "Numurs"
+ },
+ "brand": {
+ "message": "Zīmols"
+ },
+ "expirationMonth": {
+ "message": "Derīguma mēnesis"
+ },
+ "expirationYear": {
+ "message": "Derīguma gads"
+ },
+ "expiration": {
+ "message": "Derīgums"
+ },
+ "january": {
+ "message": "Janvāris"
+ },
+ "february": {
+ "message": "Februāris"
+ },
+ "march": {
+ "message": "Marts"
+ },
+ "april": {
+ "message": "Aprīlis"
+ },
+ "may": {
+ "message": "Maijs"
+ },
+ "june": {
+ "message": "Jūnijs"
+ },
+ "july": {
+ "message": "Jūlijs"
+ },
+ "august": {
+ "message": "Augusts"
+ },
+ "september": {
+ "message": "Septembris"
+ },
+ "october": {
+ "message": "Oktobris"
+ },
+ "november": {
+ "message": "Novembris"
+ },
+ "december": {
+ "message": "Decembris"
+ },
+ "securityCode": {
+ "message": "Drošības kods"
+ },
+ "ex": {
+ "message": "piem."
+ },
+ "title": {
+ "message": "Uzruna"
+ },
+ "mr": {
+ "message": "K-gs"
+ },
+ "mrs": {
+ "message": "K-dze"
+ },
+ "ms": {
+ "message": "Jk-dze"
+ },
+ "dr": {
+ "message": "Dr."
+ },
+ "firstName": {
+ "message": "Vārds"
+ },
+ "middleName": {
+ "message": "Citi vārdi"
+ },
+ "lastName": {
+ "message": "Uzvārds"
+ },
+ "identityName": {
+ "message": "Identitātes nosaukums"
+ },
+ "company": {
+ "message": "Uzņēmums"
+ },
+ "ssn": {
+ "message": "Personas kods"
+ },
+ "passportNumber": {
+ "message": "Pases numurs"
+ },
+ "licenseNumber": {
+ "message": "Autovadītāja apliecības numurs"
+ },
+ "email": {
+ "message": "E-pasts"
+ },
+ "phone": {
+ "message": "Tālrunis"
+ },
+ "address": {
+ "message": "Adrese"
+ },
+ "address1": {
+ "message": "Adrese 1"
+ },
+ "address2": {
+ "message": "Adrese 2"
+ },
+ "address3": {
+ "message": "Adrese 3"
+ },
+ "cityTown": {
+ "message": "Pilsēta / ciems"
+ },
+ "stateProvince": {
+ "message": "Novads / pagasts"
+ },
+ "zipPostalCode": {
+ "message": "Pasta indekss"
+ },
+ "country": {
+ "message": "Valsts"
+ },
+ "type": {
+ "message": "Veids"
+ },
+ "typeLogin": {
+ "message": "Pierakstīšanās vienums"
+ },
+ "typeLogins": {
+ "message": "Pierakstīšanās vienumi"
+ },
+ "typeSecureNote": {
+ "message": "Droša piezīme"
+ },
+ "typeCard": {
+ "message": "Karte"
+ },
+ "typeIdentity": {
+ "message": "Identitāte"
+ },
+ "passwordHistory": {
+ "message": "Paroļu vēsture"
+ },
+ "back": {
+ "message": "Atpakaļ"
+ },
+ "collections": {
+ "message": "Krājumi"
+ },
+ "favorites": {
+ "message": "Izlase"
+ },
+ "popOutNewWindow": {
+ "message": "Atvērt atsevišķā logā"
+ },
+ "refresh": {
+ "message": "Atsvaidzināt"
+ },
+ "cards": {
+ "message": "Kartes"
+ },
+ "identities": {
+ "message": "Identitātes"
+ },
+ "logins": {
+ "message": "Pierakstīšanās vienumi"
+ },
+ "secureNotes": {
+ "message": "Drošās piezīmes"
+ },
+ "clear": {
+ "message": "Notīrīt",
+ "description": "To clear something out. example: To clear browser history."
+ },
+ "checkPassword": {
+ "message": "Pārbaudīt, vai parole ir bijusi nopludināta."
+ },
+ "passwordExposed": {
+ "message": "Šī parole datu pārkāpumos ir atklāta $VALUE$ reizi(es). To vajag mainīt.",
+ "placeholders": {
+ "value": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "passwordSafe": {
+ "message": "Šī parole netika atrasta nevienā no zināmajiem datu pārkāpumiem. Tai vajadzētu būt droši izmantojamai."
+ },
+ "baseDomain": {
+ "message": "Pamata domēns"
+ },
+ "host": {
+ "message": "Saimniekdators",
+ "description": "A URL's host value. For example, the host of https://sub.domain.com:443 is 'sub.domain.com:443'."
+ },
+ "exact": {
+ "message": "Tiešs"
+ },
+ "startsWith": {
+ "message": "Sākas ar"
+ },
+ "regEx": {
+ "message": "Regulārā izteiksme",
+ "description": "A programming term, also known as 'RegEx'."
+ },
+ "matchDetection": {
+ "message": "Atbilstības noteikšana",
+ "description": "URI match detection for auto-fill."
+ },
+ "defaultMatchDetection": {
+ "message": "Noklusētā atbilstības noteikšana",
+ "description": "Default URI match detection for auto-fill."
+ },
+ "toggleOptions": {
+ "message": "Pārslēgt iespējas"
+ },
+ "toggleCurrentUris": {
+ "message": "Pārslēgt pašreizējos URI",
+ "description": "Toggle the display of the URIs of the currently open tabs in the browser."
+ },
+ "currentUri": {
+ "message": "Pašreizējais URI",
+ "description": "The URI of one of the current open tabs in the browser."
+ },
+ "organization": {
+ "message": "Apvienība",
+ "description": "An entity of multiple related people (ex. a team or business organization)."
+ },
+ "types": {
+ "message": "Veidi"
+ },
+ "allItems": {
+ "message": "Visi vienumi"
+ },
+ "noPasswordsInList": {
+ "message": "Nav paroļu, ko parādīt."
+ },
+ "remove": {
+ "message": "Noņemt"
+ },
+ "default": {
+ "message": "Noklusējums"
+ },
+ "dateUpdated": {
+ "message": "Atjaunināts",
+ "description": "ex. Date this item was updated"
+ },
+ "datePasswordUpdated": {
+ "message": "Parole atjaunināta",
+ "description": "ex. Date this password was updated"
+ },
+ "neverLockWarning": {
+ "message": "Vai tiešām izmantot uzstādījumu \"Nekad\"? Uzstādot aizslēgšanas iespēju uz \"Nekad\", šifrēšanas atslēga tiek glabāta ierīcē. Ja šī iespēja tiek izmantota, jāpārliecinās, ka ierīce tiek pienācīgi aizsargāta."
+ },
+ "noOrganizationsList": {
+ "message": "Tu neesi iekļauts nevienā apvienībā. Apvienības sniedz iespēju droši kopīgot vienumus ar citiem lietotājiem."
+ },
+ "noCollectionsInList": {
+ "message": "Nav krājumu, ko parādīt."
+ },
+ "ownership": {
+ "message": "Īpašumtiesības"
+ },
+ "whoOwnsThisItem": {
+ "message": "Kam pieder šis vienums?"
+ },
+ "strong": {
+ "message": "Spēcīga",
+ "description": "ex. A strong password. Scale: Weak -> Good -> Strong"
+ },
+ "good": {
+ "message": "Laba",
+ "description": "ex. A good password. Scale: Weak -> Good -> Strong"
+ },
+ "weak": {
+ "message": "Vāja",
+ "description": "ex. A weak password. Scale: Weak -> Good -> Strong"
+ },
+ "weakMasterPassword": {
+ "message": "Vāja galvenā parole"
+ },
+ "weakMasterPasswordDesc": {
+ "message": "Jūsu izvēlētā galvenā parole ir vāja. Jums vajadzētu izmantot drošu galveno paroli (vai paroles vārdkopu), lai pienācīgi aizsargātu savu Bitwarden kontu. Vai tiešām vēlaties izmantot šo galveno paroli?"
+ },
+ "pin": {
+ "message": "PIN",
+ "description": "PIN code. Ex. The short code (often numeric) that you use to unlock a device."
+ },
+ "unlockWithPin": {
+ "message": "Atslēgt ar PIN"
+ },
+ "setYourPinCode": {
+ "message": "Uzstādīt PIN kodu Bitwarden atslēgšanai. PIN iestatījumi tiks atiestatīti, ja jebkad tiks veikta pilnīga izrakstīšanās no lietotnes."
+ },
+ "pinRequired": {
+ "message": "Ir nepieciešams PIN kods."
+ },
+ "invalidPin": {
+ "message": "Nederīgs PIN kods."
+ },
+ "verifyPin": {
+ "message": "Apstiprināt PIN"
+ },
+ "yourVaultIsLockedPinCode": {
+ "message": "Glabātava ir slēgta. Nepieciešams norādīt PIN kodu, lai turpinātu."
+ },
+ "unlockWithBiometrics": {
+ "message": "Atslēgt ar biometriju"
+ },
+ "awaitDesktop": {
+ "message": "Tiek gaidīts apstiprinājums no darbvirsmas"
+ },
+ "awaitDesktopDesc": {
+ "message": "Lūgums apstiprināt ar biometriju Bitwarden darbvirsmas lietotnē, lai iespējotu biometriju pārlūkā."
+ },
+ "lockWithMasterPassOnRestart": {
+ "message": "Aizslēgt ar galveno paroli pēc pārlūka atsāknēšanas"
+ },
+ "selectOneCollection": {
+ "message": "Ir jāizvēlas vismaz viens krājums."
+ },
+ "cloneItem": {
+ "message": "Pavairot vienumu"
+ },
+ "clone": {
+ "message": "Pavairot"
+ },
+ "passwordGeneratorPolicyInEffect": {
+ "message": "Viens vai vairāki apvienības nosacījumi ietekmē veidotāja iestatījumus."
+ },
+ "vaultTimeoutAction": {
+ "message": "Glabātavas noildzes darbība"
+ },
+ "lock": {
+ "message": "Slēgt",
+ "description": "Verb form: to make secure or inaccesible by"
+ },
+ "trash": {
+ "message": "Atkritne",
+ "description": "Noun: a special folder to hold deleted items"
+ },
+ "searchTrash": {
+ "message": "Meklēt atkritnē"
+ },
+ "permanentlyDeleteItem": {
+ "message": "Neatgriezeniski izdzēst vienumu"
+ },
+ "permanentlyDeleteItemConfirmation": {
+ "message": "Vai tiešām neatgriezeniski izdzēst šo vienumu?"
+ },
+ "permanentlyDeletedItem": {
+ "message": "Vienums ir neatgriezeniski izdzēsts"
+ },
+ "restoreItem": {
+ "message": "Atjaunot vienumu"
+ },
+ "restoreItemConfirmation": {
+ "message": "Jūs tiešām atjaunot šo vienumu?"
+ },
+ "restoredItem": {
+ "message": "Vienums atjaunots"
+ },
+ "vaultTimeoutLogOutConfirmation": {
+ "message": "Izrakstīšanās noņems visu piekļuvi glabātavai un pieprasīs tiešsaistes pieteikšanos pēc noildzes laika. Vai tiešām izmantot šo iestatījumu?"
+ },
+ "vaultTimeoutLogOutConfirmationTitle": {
+ "message": "Noildzes darbības apstiprināšana"
+ },
+ "autoFillAndSave": {
+ "message": "Automātiski aizpildīt un saglabāt"
+ },
+ "autoFillSuccessAndSavedUri": {
+ "message": "Automātiski aizpildīts vienums un saglabāts URI"
+ },
+ "autoFillSuccess": {
+ "message": "Automātiski aizpildīts vienums"
+ },
+ "setMasterPassword": {
+ "message": "Uzstādīt galveno paroli"
+ },
+ "masterPasswordPolicyInEffect": {
+ "message": "Viena vai vairākas apvienības nosacījumos ir norādīts, lai galvenā parole atbilst šādām prasībām:"
+ },
+ "policyInEffectMinComplexity": {
+ "message": "Mazākais pieļaujamais sarežģītības novērtējums ir $SCORE$",
+ "placeholders": {
+ "score": {
+ "content": "$1",
+ "example": "4"
+ }
+ }
+ },
+ "policyInEffectMinLength": {
+ "message": "Mazākais pieļaujamais garums ir $LENGTH$",
+ "placeholders": {
+ "length": {
+ "content": "$1",
+ "example": "14"
+ }
+ }
+ },
+ "policyInEffectUppercase": {
+ "message": "Satur vienu vai vairākus lielos burtus"
+ },
+ "policyInEffectLowercase": {
+ "message": "Satur vienu vai vairākus mazos burtus"
+ },
+ "policyInEffectNumbers": {
+ "message": "Satur vienu vai vairākus skaitļus"
+ },
+ "policyInEffectSpecial": {
+ "message": "Satur vienu vai vairākas no šīm īpašajām rakstzīmēm: $CHARS$",
+ "placeholders": {
+ "chars": {
+ "content": "$1",
+ "example": "!@#$%^&*"
+ }
+ }
+ },
+ "masterPasswordPolicyRequirementsNotMet": {
+ "message": "Jaunā galvenā parole neatbilst nosacījumu prasībām."
+ },
+ "acceptPolicies": {
+ "message": "Atzīmējot šo rūtiņu, Tu piekrīti sekojošajam:"
+ },
+ "acceptPoliciesError": {
+ "message": "Nav pieņemti izmantošanas nosacījumi un privātuma politika."
+ },
+ "termsOfService": {
+ "message": "Izmantošanas nosacījumi"
+ },
+ "privacyPolicy": {
+ "message": "Privātuma nosacījumi"
+ },
+ "hintEqualsPassword": {
+ "message": "Paroles norāde nedrīkst būt tāda pati kā parole."
+ },
+ "ok": {
+ "message": "Labi"
+ },
+ "desktopSyncVerificationTitle": {
+ "message": "Darbvirsmas sinhronizācijas apstiprinājums"
+ },
+ "desktopIntegrationVerificationText": {
+ "message": "Lūgumus pārliecināties, ka darbvirsmas lietotne rāda šo atpazīšanas vārdkopu:"
+ },
+ "desktopIntegrationDisabledTitle": {
+ "message": "Savienojums ar pārlūku nav iespējots"
+ },
+ "desktopIntegrationDisabledDesc": {
+ "message": "Savienojums ar pārlūku nav iespējots Bitwarden darbvirsmas lietotnē. Lūgums iespējot to darbvirsmas lietotnes iestatījumos."
+ },
+ "startDesktopTitle": {
+ "message": "Palaist Bitwarden darbvirsmas lietotni"
+ },
+ "startDesktopDesc": {
+ "message": "Bitwarden darbvirsmas lietotnei ir jābūt sāknētai, pirms šī iespēja var tikt izmantota."
+ },
+ "errorEnableBiometricTitle": {
+ "message": "Nevar iespējot biometriju"
+ },
+ "errorEnableBiometricDesc": {
+ "message": "Darbvirsmas lietotne atcēla darbību"
+ },
+ "nativeMessagingInvalidEncryptionDesc": {
+ "message": "Darbvirsmas lietotne drošo saziņas avotu padarīja par nederīgu. Lūgums atkārtot šo darbību"
+ },
+ "nativeMessagingInvalidEncryptionTitle": {
+ "message": "Darbvirsmas saziņa tika pārtraukta"
+ },
+ "nativeMessagingWrongUserDesc": {
+ "message": "Darbvirsmas lietotne ir pierakstījusies atšķirīgā kontā. Lūgums nodrošināt, ka abas lietotnes ir pierakstījušās vienam un tam pašam kontam."
+ },
+ "nativeMessagingWrongUserTitle": {
+ "message": "Konta nesaderība"
+ },
+ "biometricsNotEnabledTitle": {
+ "message": "Biometrija nav iespējota"
+ },
+ "biometricsNotEnabledDesc": {
+ "message": "Vispirms ir nepieciešams iespējot biometriju darbvirsmas iestatījumos, lai to varētu izmantot pārlūkā."
+ },
+ "biometricsNotSupportedTitle": {
+ "message": "Biometrija nav nodrošināta"
+ },
+ "biometricsNotSupportedDesc": {
+ "message": "Šajā ierīcē netiek atbalstīta pārlūka biometrija."
+ },
+ "nativeMessaginPermissionErrorTitle": {
+ "message": "Atļauja nav nodrošināta"
+ },
+ "nativeMessaginPermissionErrorDesc": {
+ "message": "Bez atļaujas sazināties ar Bitwarden darbvirsmas lietotni mēs nevaram nodrošināt biometriju pārlūka paplašinājumā. Lūgums mēģināt vēlreiz."
+ },
+ "nativeMessaginPermissionSidebarTitle": {
+ "message": "Atļaujas pieprasījuma kļūda"
+ },
+ "nativeMessaginPermissionSidebarDesc": {
+ "message": "Šī darbība nav izpildāma sānjoslā, tāpēc lūgums mēģināt to veikt uznirstošajā vai izlecošajā logā."
+ },
+ "personalOwnershipSubmitError": {
+ "message": "Uzņēmuma nosacījumi liedz saglabāt vienumus privātajā glabātavā. Norādi piederību apvienībai un izvēlies kādu no pieejamajiem krājumiem."
+ },
+ "personalOwnershipPolicyInEffect": {
+ "message": "Apvienības nosacījumi ietekmē Tavas īpašumtiesību iespējas."
+ },
+ "excludedDomains": {
+ "message": "Izņēmuma domēni"
+ },
+ "excludedDomainsDesc": {
+ "message": "Bitwarden nevaicās saglabāt pierakstīšanās datus šiem domēniem. Ir jāpārlādē lapa, lai izmaiņas iedarbotos."
+ },
+ "excludedDomainsInvalidDomain": {
+ "message": "$DOMAIN$ nav derīgs domēns",
+ "placeholders": {
+ "domain": {
+ "content": "$1",
+ "example": "googlecom"
+ }
+ }
+ },
+ "send": {
+ "message": "\"Send\"",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "searchSends": {
+ "message": "Meklēt \"Send\"",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "addSend": {
+ "message": "Pievienot \"Send'",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTypeText": {
+ "message": "Teksts"
+ },
+ "sendTypeFile": {
+ "message": "Datne"
+ },
+ "allSends": {
+ "message": "Visi \"Send\"",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "maxAccessCountReached": {
+ "message": "Sasniegts lielākais pieļaujamais piekļuvju skaits"
+ },
+ "expired": {
+ "message": "Beidzies izmantošanas laiks"
+ },
+ "pendingDeletion": {
+ "message": "Gaida dzēšanu"
+ },
+ "passwordProtected": {
+ "message": "Aizsargāts ar paroli"
+ },
+ "copySendLink": {
+ "message": "Ievietot \"Send\" saiti starpliktuvē",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "removePassword": {
+ "message": "Noņemt paroli"
+ },
+ "delete": {
+ "message": "Dzēst"
+ },
+ "removedPassword": {
+ "message": "Parole noņemta"
+ },
+ "deletedSend": {
+ "message": "\"Send\" izdzēsts",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendLink": {
+ "message": "\"Send\" saite",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "disabled": {
+ "message": "Atspējots"
+ },
+ "removePasswordConfirmation": {
+ "message": "Vai tiešām noņemt paroli?"
+ },
+ "deleteSend": {
+ "message": "Dzēst \"Send\"",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "deleteSendConfirmation": {
+ "message": "Vai tiešām izdzēst šo \"Send\"?",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "editSend": {
+ "message": "Labot \"Send\"",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTypeHeader": {
+ "message": "Kāds veids ir šim \"Send\"?",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendNameDesc": {
+ "message": "Lasāms nosaukums, kas apraksta šo \"Send\".",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendFileDesc": {
+ "message": "Datne, kuru ir vēlme nosūtīt."
+ },
+ "deletionDate": {
+ "message": "Dzēšanas datums"
+ },
+ "deletionDateDesc": {
+ "message": "\"Send\" tiks pastāvīgi izdzēsts norādītajā dienā un laikā.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "expirationDate": {
+ "message": "Derīguma beigu datums"
+ },
+ "expirationDateDesc": {
+ "message": "Ja uzstādīts, piekļuve šim \"Send\" beigsies norādītajā dienā un laikā.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "oneDay": {
+ "message": "1 diena"
+ },
+ "days": {
+ "message": "$DAYS$ dienas",
+ "placeholders": {
+ "days": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "custom": {
+ "message": "Pielāgots"
+ },
+ "maximumAccessCount": {
+ "message": "Lielākais pieļaujamais piekļuvju skaits"
+ },
+ "maximumAccessCountDesc": {
+ "message": "Ja uzstādīts, lietotāji nevarēs piekļūt šim \"Send\", kad tiks sasniegts lielākais pieļaujamais piekļūšanas reižu skaits.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendPasswordDesc": {
+ "message": "Pēc izvēles pieprasīt lietotājiem paroli, lai viņi varētu piekļūt šim \"Send\".",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendNotesDesc": {
+ "message": "Personīgās piezīmes par šo \"Send\".",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendDisableDesc": {
+ "message": "Atspējot šo \"Send\", lai neviens tam nevarētu piekļūt.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendShareDesc": {
+ "message": "Saglabājot ievietot šī \"Send\" saiti starpliktuvē.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTextDesc": {
+ "message": "Teksts, kuru ir vēlme nosūtīt."
+ },
+ "sendHideText": {
+ "message": "Pēc noklusējuma paslēpt šī \"Send\" tekstu.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "currentAccessCount": {
+ "message": "Pašreizējais piekļuvju skaits"
+ },
+ "createSend": {
+ "message": "Izveidot jaunu \"Send\"",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "newPassword": {
+ "message": "Jauna parole"
+ },
+ "sendDisabled": {
+ "message": "\"Send\" atspējots",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendDisabledWarning": {
+ "message": "Uzņēmuma nosacījumu kopas dēļ ir tikai iespējams dzēst esošu \"Send\".",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "createdSend": {
+ "message": "\"Send\" izveidots",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "editedSend": {
+ "message": "\"Send\" labots",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendLinuxChromiumFileWarning": {
+ "message": "Lai izvēlētos datni, paplašinājums ir jāatver sānjoslā (ja iespējams) vai atsevišķā logā, klikšķinot uz šī paziņojuma."
+ },
+ "sendFirefoxFileWarning": {
+ "message": "Lai izvēlētos datni, ja tiek izmantots Firefox, paplašinājums ir jāatver sānjoslā vai atsevišķā logā, klikšķinot uz šī paziņojuma."
+ },
+ "sendSafariFileWarning": {
+ "message": "Lai izvēlētos datni, ja tiek izmantots Safari, paplašinājums ir jāatver jaunā logā, klikšķinot uz šī paziņojuma."
+ },
+ "sendFileCalloutHeader": {
+ "message": "Pirms sākt"
+ },
+ "sendFirefoxCustomDatePopoutMessage1": {
+ "message": "Lai izmantotu kalendāra veida datumu atlasītāju,",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read '**To use a calendar style date picker ** click here to pop out your window.'"
+ },
+ "sendFirefoxCustomDatePopoutMessage2": {
+ "message": "klikšķināt šeit,",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker **click here** to pop out your window.'"
+ },
+ "sendFirefoxCustomDatePopoutMessage3": {
+ "message": "lai atvērtu jaunā logā.",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker click here **to pop out your window.**'"
+ },
+ "expirationDateIsInvalid": {
+ "message": "Norādītais derīguma beigu datums nav derīgs."
+ },
+ "deletionDateIsInvalid": {
+ "message": "Norādītais dzēšanas datums nav derīgs."
+ },
+ "expirationDateAndTimeRequired": {
+ "message": "Ir jānorāda derīguma beigu datums un laiks."
+ },
+ "deletionDateAndTimeRequired": {
+ "message": "Ir jānorāda dzēšanas datums un laiks."
+ },
+ "dateParsingError": {
+ "message": "Atgadījusies kļūda dzēšanas un derīguma beigu datumu saglabāšanā."
+ },
+ "hideEmail": {
+ "message": "Slēpt e-pasta adresi no saņēmējiem."
+ },
+ "sendOptionsPolicyInEffect": {
+ "message": "Viens vai vairāki apvienības nosacījumi ietekmē \"Send\" iestatījumus."
+ },
+ "passwordPrompt": {
+ "message": "Galvenās paroles pārvaicāšana"
+ },
+ "passwordConfirmation": {
+ "message": "Galvenās paroles apstiprināšana"
+ },
+ "passwordConfirmationDesc": {
+ "message": "Šī darbība ir aizsargāta. Lai turpinātu, ir jāievada galvenā parole, lai apstiprinātu identitāti."
+ },
+ "emailVerificationRequired": {
+ "message": "Nepieciešama e-pasta adreses apstiprināšana"
+ },
+ "emailVerificationRequiredDesc": {
+ "message": "Ir nepieciešams apstiprināt e-pasta adresi, lai būtu iespējams izmantot šo iespēju. To var izdarīt tīmekļa glabātavā."
+ },
+ "updatedMasterPassword": {
+ "message": "Updated Master Password"
+ },
+ "updateMasterPassword": {
+ "message": "Update Master Password"
+ },
+ "updateMasterPasswordWarning": {
+ "message": "Your Master Password was recently changed by an administrator in your organization. In order to access the vault, you must update it now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour."
+ },
+ "resetPasswordPolicyAutoEnroll": {
+ "message": "Automatic Enrollment"
+ },
+ "resetPasswordAutoEnrollInviteWarning": {
+ "message": "This organization has an enterprise policy that will automatically enroll you in password reset. Enrollment will allow organization administrators to change your master password."
+ },
+ "selectFolder": {
+ "message": "Select folder..."
+ },
+ "ssoCompleteRegistration": {
+ "message": "In order to complete logging in with SSO, please set a master password to access and protect your vault."
+ },
+ "hours": {
+ "message": "Hours"
+ },
+ "minutes": {
+ "message": "Minutes"
+ },
+ "vaultTimeoutPolicyInEffect": {
+ "message": "Your organization policies are affecting your vault timeout. Maximum allowed Vault Timeout is $HOURS$ hour(s) and $MINUTES$ minute(s)",
+ "placeholders": {
+ "hours": {
+ "content": "$1",
+ "example": "5"
+ },
+ "minutes": {
+ "content": "$2",
+ "example": "5"
+ }
+ }
+ },
+ "vaultTimeoutToLarge": {
+ "message": "Your vault timeout exceeds the restrictions set by your organization."
+ },
+ "vaultExportDisabled": {
+ "message": "Vault Export Disabled"
+ },
+ "personalVaultExportPolicyInEffect": {
+ "message": "One or more organization policies prevents you from exporting your personal vault."
+ },
+ "copyCustomFieldNameInvalidElement": {
+ "message": "Unable to identify a valid form element. Try inspecting the HTML instead."
+ },
+ "copyCustomFieldNameNotUnique": {
+ "message": "No unique identifier found."
+ }
+}
diff --git a/src/iOS.Safari/Resources/_locales/ml/messages.json b/src/iOS.Safari/Resources/_locales/ml/messages.json
new file mode 100644
index 000000000..284040a07
--- /dev/null
+++ b/src/iOS.Safari/Resources/_locales/ml/messages.json
@@ -0,0 +1,1817 @@
+{
+ "appName": {
+ "message": "Bitwarden"
+ },
+ "extName": {
+ "message": "Bitwarden - സൗജന്യ പാസ്സ്വേഡ് മാനേജർ ",
+ "description": "Extension name, MUST be less than 40 characters (Safari restriction)"
+ },
+ "extDesc": {
+ "message": "നിങ്ങളുടെ എല്ലാ ഉപകരണങ്ങൾക്കും സുരക്ഷിതവും സൗജന്യവുമായ പാസ്വേഡ് മാനേജർ.",
+ "description": "Extension description"
+ },
+ "loginOrCreateNewAccount": {
+ "message": "നിങ്ങളുടെ സുരക്ഷിത വാൾട്ടിലേക്കു പ്രവേശിക്കാൻ ലോഗിൻ ചെയ്യുക അല്ലെങ്കിൽ ഒരു പുതിയ അക്കൗണ്ട് സൃഷ്ടിക്കുക."
+ },
+ "createAccount": {
+ "message": "അക്കൗണ്ട് സൃഷ്ടിക്കുക"
+ },
+ "login": {
+ "message": "ലോഗിൻ"
+ },
+ "enterpriseSingleSignOn": {
+ "message": "എന്റർപ്രൈസ് സിംഗിൾ സൈൻ-ഓൺ"
+ },
+ "cancel": {
+ "message": "റദ്ദാക്കുക"
+ },
+ "close": {
+ "message": "അടയ്ക്കുക"
+ },
+ "submit": {
+ "message": "സമർപ്പിക്കുക"
+ },
+ "emailAddress": {
+ "message": "ഈ - മെയില് വിലാസം"
+ },
+ "masterPass": {
+ "message": "പ്രാഥമിക പാസ്വേഡ്"
+ },
+ "masterPassDesc": {
+ "message": "നിങ്ങളുടെ വാൾട്ടിലേക്ക് പ്രവേശിക്കാൻ ഉപയോഗിക്കുന്ന പാസ്വേഡാണ് പ്രാഥമിക പാസ്വേഡ്. നിങ്ങളുടെ മാസ്റ്റർ പാസ്വേഡ് മറക്കാതിരിക്കുക എന്നത് വളരെ പ്രധാനമാണ്. നിങ്ങൾ പാസ്വേഡ് മറന്ന സാഹചര്യത്തിൽ, പാസ്വേഡ് വീണ്ടെടുക്കാൻ ഒരു മാർഗവുമില്ല."
+ },
+ "masterPassHintDesc": {
+ "message": "നിങ്ങളുടെ പാസ്വേഡ് മറന്നാൽ അത് ഓർമ്മിക്കാൻ ഒരു പ്രാഥമിക പാസ്വേഡ് സൂചന സഹായിക്കും."
+ },
+ "reTypeMasterPass": {
+ "message": "പ്രാഥമിക പാസ്വേഡ് വീണ്ടും ടൈപ്പ് ചെയ്യുക"
+ },
+ "masterPassHint": {
+ "message": "പ്രാഥമിക പാസ്വേഡ് സൂചന (ഇഷ്ടാനുസൃതമായ)"
+ },
+ "tab": {
+ "message": "ടാബ് "
+ },
+ "myVault": {
+ "message": "എൻ്റെ വാൾട് "
+ },
+ "tools": {
+ "message": "ഉപകരണങ്ങള്"
+ },
+ "settings": {
+ "message": "ക്രമീകരണങ്ങള്"
+ },
+ "currentTab": {
+ "message": "നിലവിലെ ടാബ്"
+ },
+ "copyPassword": {
+ "message": "പാസ്വേഡ് പകർത്തുക"
+ },
+ "copyNote": {
+ "message": "കുറിപ്പ് പകർത്തുക"
+ },
+ "copyUri": {
+ "message": "URI പകർത്തുക"
+ },
+ "copyUsername": {
+ "message": "ഉപയോക്തൃനാമം പകർത്തുക"
+ },
+ "copyNumber": {
+ "message": "അക്കം പകർത്തുക"
+ },
+ "copySecurityCode": {
+ "message": "സുരക്ഷാ കോഡ് പകർത്തുക"
+ },
+ "autoFill": {
+ "message": "ഓട്ടോഫിൽ"
+ },
+ "generatePasswordCopied": {
+ "message": "പാസ്വേഡ് സൃഷ്ടിക്കുക (പകർത്തുക )"
+ },
+ "copyElementIdentifier": {
+ "message": "Copy Custom Field Name"
+ },
+ "noMatchingLogins": {
+ "message": "പൊരുത്തപ്പെടുന്ന ലോഗിനുകളൊന്നുമില്ല."
+ },
+ "vaultLocked": {
+ "message": "വാൾട് പൂട്ടിയിരിക്കുന്നു "
+ },
+ "vaultLoggedOut": {
+ "message": "വാൾട് ലോഗ് ഔട്ട് ചെയ്തിരിക്കുന്നു "
+ },
+ "autoFillInfo": {
+ "message": "നിലവിലെ ബ്രൌസർ ടാബിന് ഓട്ടോഫിൽ ചെയ്യാൻ പ്രവേശനങ്ങൾ ലഭ്യമല്ല."
+ },
+ "addLogin": {
+ "message": "പ്രവേശനം ചേർക്കുക"
+ },
+ "addItem": {
+ "message": " ഇനം ചേർക്കുക"
+ },
+ "passwordHint": {
+ "message": "പാസ്സ്വേഡ് സൂചനാ"
+ },
+ "enterEmailToGetHint": {
+ "message": "നിങ്ങളുടെ പ്രാഥമിക പാസ്വേഡ് സൂചന ലഭിക്കുന്നതിന് നിങ്ങളുടെ അക്കൗണ്ട് ഇമെയിൽ വിലാസം നൽകുക."
+ },
+ "getMasterPasswordHint": {
+ "message": "പ്രാഥമിക പാസ്വേഡ് സൂചന നേടുക"
+ },
+ "continue": {
+ "message": "തുടരുക"
+ },
+ "verificationCode": {
+ "message": "പരിശോധിച്ചുറപ്പിക്കൽ കോഡ്"
+ },
+ "account": {
+ "message": "അക്കൗണ്ട്"
+ },
+ "changeMasterPassword": {
+ "message": "പ്രാഥമിക പാസ്വേഡ് മാറ്റുക"
+ },
+ "fingerprintPhrase": {
+ "message": "ഫിംഗർപ്രിന്റ് ഫ്രേസ്",
+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
+ },
+ "yourAccountsFingerprint": {
+ "message": "നിങ്ങളുടെ അക്കൗണ്ടിന്റെ ഫിംഗർപ്രിന്റ് ഫ്രേസ്",
+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
+ },
+ "twoStepLogin": {
+ "message": "രണ്ട്-ഘട്ട ലോഗിൻ"
+ },
+ "logOut": {
+ "message": "ലോഗ് ഔട്ട്"
+ },
+ "about": {
+ "message": "ഇതിനെ കുറിച്ച്"
+ },
+ "version": {
+ "message": "വേർഷൻ "
+ },
+ "save": {
+ "message": "സംരക്ഷിക്കുക"
+ },
+ "move": {
+ "message": "Move"
+ },
+ "addFolder": {
+ "message": "ഫോൾഡർ ചേർക്കുക"
+ },
+ "name": {
+ "message": "പേര്"
+ },
+ "editFolder": {
+ "message": "ഫോൾഡർ തിരുത്തുക"
+ },
+ "deleteFolder": {
+ "message": "ഫോൾഡർ ഇല്ലാതാക്കുക"
+ },
+ "folders": {
+ "message": "ഫോൾഡറുകൾ"
+ },
+ "noFolders": {
+ "message": "പ്രദർശിപ്പിക്കാൻ ഫോൾഡറുകളൊന്നുമില്ല."
+ },
+ "helpFeedback": {
+ "message": "സഹായവും അഭിപ്രായവും"
+ },
+ "sync": {
+ "message": "സമന്വയിപ്പിക്കുക"
+ },
+ "syncVaultNow": {
+ "message": "വാൾട് ഇപ്പോൾ സമന്വയിപ്പിക്കുക"
+ },
+ "lastSync": {
+ "message": "അവസാന സമന്വയം:"
+ },
+ "passGen": {
+ "message": "പാസ്സ്വേഡ് സൃഷ്ടാവ്"
+ },
+ "generator": {
+ "message": "സ്രഷ്ടാവ്",
+ "description": "Short for 'Password Generator'."
+ },
+ "passGenInfo": {
+ "message": "യാന്ത്രികമായി ശക്തമായ പാസ്സ്വേർഡുകൾ നിങ്ങളുടെ ലോഗിന് വേണ്ടി നിർമിക്കുക "
+ },
+ "bitWebVault": {
+ "message": "Bitwarden വെബ് വാൾട് "
+ },
+ "importItems": {
+ "message": "ഇനങ്ങൾ ഇമ്പോർട് ചെയ്യുക"
+ },
+ "select": {
+ "message": "തിരഞ്ഞെടുക്കുക"
+ },
+ "generatePassword": {
+ "message": "പാസ്വേഡ് സൃഷ്ടിക്കുക"
+ },
+ "regeneratePassword": {
+ "message": "പാസ്സ്വേഡ് വീണ്ടും സൃഷ്ടിക്കുക"
+ },
+ "options": {
+ "message": "ഓപ്ഷനുകൾ"
+ },
+ "length": {
+ "message": "നീളം"
+ },
+ "numWords": {
+ "message": "വാക്കുകളുടെ എണ്ണം"
+ },
+ "wordSeparator": {
+ "message": "വേര്പെടുത്തുക"
+ },
+ "capitalize": {
+ "message": "വലിയഅക്ഷരമാകുക",
+ "description": "Make the first letter of a work uppercase."
+ },
+ "includeNumber": {
+ "message": "നമ്പർ ഉൾപ്പെടുത്തുക"
+ },
+ "minNumbers": {
+ "message": "കുറഞ്ഞ സംഖ്യകൾ"
+ },
+ "minSpecial": {
+ "message": "കുറഞ്ഞ പ്രത്യേക പ്രതീകങ്ങൾ"
+ },
+ "avoidAmbChar": {
+ "message": "അവ്യക്തമായ പ്രതീകങ്ങൾ ഒഴിവാക്കുക"
+ },
+ "searchVault": {
+ "message": "വാൾട് തിരയുക"
+ },
+ "edit": {
+ "message": "തിരുത്തുക"
+ },
+ "view": {
+ "message": "കാണുക"
+ },
+ "noItemsInList": {
+ "message": "പ്രദർശിപ്പിക്കാൻ ഇനങ്ങളൊന്നുമില്ല."
+ },
+ "itemInformation": {
+ "message": "വിവരം"
+ },
+ "username": {
+ "message": "ഉപയോക്തൃനാമം"
+ },
+ "password": {
+ "message": "പാസ്സ്വേഡ്"
+ },
+ "passphrase": {
+ "message": "രഹസ്യ വാചകം"
+ },
+ "favorite": {
+ "message": "പ്രിയങ്കരം"
+ },
+ "notes": {
+ "message": "കുറിപ്പുകൾ"
+ },
+ "note": {
+ "message": "കുറിപ്പ്"
+ },
+ "editItem": {
+ "message": "ഇനം തിരുത്തുക"
+ },
+ "folder": {
+ "message": "ഫോൾഡർ"
+ },
+ "deleteItem": {
+ "message": "ഇനം ഇല്ലാതാക്കുക "
+ },
+ "viewItem": {
+ "message": "ഇനം കാണുക"
+ },
+ "launch": {
+ "message": "തുറക്കുക"
+ },
+ "website": {
+ "message": "വെബ്സൈറ്റ്"
+ },
+ "toggleVisibility": {
+ "message": "ദൃശ്യപരത ടോഗിൾ ചെയ്യുക"
+ },
+ "manage": {
+ "message": "നിയന്ത്രിക്കുക"
+ },
+ "other": {
+ "message": "മറ്റുള്ളവ"
+ },
+ "rateExtension": {
+ "message": "എക്സ്റ്റൻഷൻ റേറ്റ് ചെയ്യുക "
+ },
+ "rateExtensionDesc": {
+ "message": "ഒരു നല്ല അവലോകനത്തിന് ഞങ്ങളെ സഹായിക്കുന്നത് പരിഗണിക്കുക!"
+ },
+ "browserNotSupportClipboard": {
+ "message": "നിങ്ങളുടെ ബ്രൌസർ എളുപ്പമുള്ള ക്ലിപ്പ്ബോർഡ് പകർത്തൽ പിന്തുണയ്ക്കത്തില്ല. പകരം അത് സ്വമേധയാ പകർക്കുക ."
+ },
+ "verifyMasterPassword": {
+ "message": "പ്രാഥമിക പാസ്വേഡ് സ്ഥിരീകരിക്കുക"
+ },
+ "yourVaultIsLocked": {
+ "message": "തങ്ങളുടെ വാൾട് പൂട്ടിയിരിക്കുന്നു. തുടരുന്നതിന് നിങ്ങളുടെ പ്രാഥമിക പാസ്വേഡ് പരിശോധിക്കുക."
+ },
+ "unlock": {
+ "message": "അൺലോക്ക്"
+ },
+ "loggedInAsOn": {
+ "message": "$HOSTNAME$ൽ$EMAIL$ലോഗിൻ ചെയ്തിരിക്കുന്നു.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "name@example.com"
+ },
+ "hostname": {
+ "content": "$2",
+ "example": "bitwarden.com"
+ }
+ }
+ },
+ "invalidMasterPassword": {
+ "message": "അസാധുവായ പ്രാഥമിക പാസ്വേഡ്"
+ },
+ "vaultTimeout": {
+ "message": "വാൾട് ടൈംഔട്ട്"
+ },
+ "lockNow": {
+ "message": "ഇപ്പോൾ ലോക്കുചെയ്യുക"
+ },
+ "immediately": {
+ "message": "ഉടന്തന്നെ"
+ },
+ "tenSeconds": {
+ "message": "10 സെക്കൻഡ്"
+ },
+ "twentySeconds": {
+ "message": "20 സെക്കന്റുകള്"
+ },
+ "thirtySeconds": {
+ "message": "30 സെക്കൻഡ്"
+ },
+ "oneMinute": {
+ "message": "1 മിനിറ്റ്"
+ },
+ "twoMinutes": {
+ "message": "2 മിനിറ്റ്"
+ },
+ "fiveMinutes": {
+ "message": "5 മിനിറ്റ്"
+ },
+ "fifteenMinutes": {
+ "message": "15 മിനിറ്റ്"
+ },
+ "thirtyMinutes": {
+ "message": "30 മിനിറ്റ്"
+ },
+ "oneHour": {
+ "message": "1 മണിക്കൂർ"
+ },
+ "fourHours": {
+ "message": "4 മണിക്കൂർ"
+ },
+ "onLocked": {
+ "message": "സിസ്റ്റം ലോക്കിൽ"
+ },
+ "onRestart": {
+ "message": "ബ്രൌസർ പുനരാരംഭിക്കുമ്പോൾ"
+ },
+ "never": {
+ "message": "ഒരിക്കലും വേണ്ട"
+ },
+ "security": {
+ "message": "സുരക്ഷ"
+ },
+ "errorOccurred": {
+ "message": "ഒരു പിഴവ് സംഭവിച്ചിരിക്കുന്നു"
+ },
+ "emailRequired": {
+ "message": "ഇമെയിൽ അഡ്രസ്സ് നിരബന്ധമാണ്."
+ },
+ "invalidEmail": {
+ "message": "അസാധുവായ ഇമെയിൽ."
+ },
+ "masterPassRequired": {
+ "message": "പ്രാഥമിക പാസ്വേഡ് നിർബന്ധമാണ്."
+ },
+ "masterPassLength": {
+ "message": "പ്രാഥമിക പാസ്വേഡിന് കുറഞ്ഞത് 8 പ്രതീകങ്ങളെങ്കിലും ദൈർഘ്യമുണ്ടായിരിക്കണം."
+ },
+ "masterPassDoesntMatch": {
+ "message": "പ്രാഥമിക പാസ്വേഡ് സ്ഥിരീകരണം പൊരുത്തപ്പെടുന്നില്ല."
+ },
+ "newAccountCreated": {
+ "message": "തങ്ങളുടെ അക്കൗണ്ട് സൃഷ്ടിക്കപ്പെട്ടു! ഇനി താങ്കൾക്ക് ലോഗിൻ ചെയ്യാം."
+ },
+ "masterPassSent": {
+ "message": "നിങ്ങളുടെ പ്രാഥമിക പാസ്വേഡ് സൂചനയുള്ള ഒരു ഇമെയിൽ ഞങ്ങൾ നിങ്ങൾക്ക് അയച്ചു."
+ },
+ "verificationCodeRequired": {
+ "message": "പരിശോധിച്ചുറപ്പിക്കൽ കോഡ് ആവശ്യമാണ്."
+ },
+ "valueCopied": {
+ "message": "$VALUE$ പകർത്തി",
+ "description": "Value has been copied to the clipboard.",
+ "placeholders": {
+ "value": {
+ "content": "$1",
+ "example": "Password"
+ }
+ }
+ },
+ "autofillError": {
+ "message": "ഈ പേജിൽ തിരഞ്ഞെടുത്ത ഇനം യാന്ത്രികമായി പൂരിപ്പിക്കാൻ കഴിയില്ല. പകരം വിവരങ്ങൾ പകർത്തി ഒട്ടിക്കുക."
+ },
+ "loggedOut": {
+ "message": "ലോഗേഡ് ഔട്ട്"
+ },
+ "loginExpired": {
+ "message": "നിങ്ങളുടെ പ്രവർത്തന സമയം കഴിഞ്ഞിരിക്കുന്നു."
+ },
+ "logOutConfirmation": {
+ "message": "നിങ്ങൾക്ക് ലോഗ് ഔട്ട് ചെയ്യണമെന്ന് ഉറപ്പാണോ?"
+ },
+ "yes": {
+ "message": "ശരി"
+ },
+ "no": {
+ "message": "തെറ്റ്"
+ },
+ "unexpectedError": {
+ "message": "ഒരു അപ്രതീക്ഷിത പിശക് സംഭവിച്ചു."
+ },
+ "nameRequired": {
+ "message": "പേര് നിർബന്ധമാണ്."
+ },
+ "addedFolder": {
+ "message": "ചേർക്കപ്പെട്ട ഫോൾഡർ"
+ },
+ "changeMasterPass": {
+ "message": "പ്രാഥമിക പാസ്വേഡ് മാറ്റുക"
+ },
+ "changeMasterPasswordConfirmation": {
+ "message": "തങ്ങൾക്കു ബിറ്റ് വാർഡൻ വെബ് വാൾട്ടിൽ പ്രാഥമിക പാസ്വേഡ് മാറ്റാൻ സാധിക്കും.വെബ്സൈറ്റ് ഇപ്പോൾ സന്ദർശിക്കാൻ ആഗ്രഹിക്കുന്നുവോ?"
+ },
+ "twoStepLoginConfirmation": {
+ "message": "സുരക്ഷാ കീ, ഓതന്റിക്കേറ്റർ അപ്ലിക്കേഷൻ, SMS, ഫോൺ കോൾ അല്ലെങ്കിൽ ഇമെയിൽ പോലുള്ള മറ്റൊരു ഉപകരണം ഉപയോഗിച്ച് തങ്ങളുടെ ലോഗിൻ സ്ഥിരീകരിക്കാൻ ആവശ്യപ്പെടുന്നതിലൂടെ രണ്ട്-ഘട്ട ലോഗിൻ തങ്ങളുടെ അക്കൗണ്ടിനെ കൂടുതൽ സുരക്ഷിതമാക്കുന്നു. bitwarden.com വെബ് വാൾട്ടിൽ രണ്ട്-ഘട്ട ലോഗിൻ പ്രവർത്തനക്ഷമമാക്കാനാകും.തങ്ങള്ക്കു ഇപ്പോൾ വെബ്സൈറ്റ് സന്ദർശിക്കാൻ ആഗ്രഹമുണ്ടോ?"
+ },
+ "editedFolder": {
+ "message": "തിരുത്തിയ ഫോൾഡർ"
+ },
+ "deleteFolderConfirmation": {
+ "message": "ഈ ഫോൾഡർ ഇല്ലാതാക്കാൻ നിങ്ങൾ ആഗ്രഹിക്കുന്നുണ്ടോ?"
+ },
+ "deletedFolder": {
+ "message": "ഇല്ലാതാക്കിയ ഫോൾഡർ"
+ },
+ "gettingStartedTutorial": {
+ "message": "എക്സ്റ്റൻഷൻ ഉപയോഗിയ്ക്കാൻ പരിചയപ്പെടുക"
+ },
+ "gettingStartedTutorialVideo": {
+ "message": "ബ്രൗസർ എക്സ്റ്റൻഷൻ എങ്ങനെ പരമാവധി പ്രയോജനപ്പെടുത്താമെന്ന് മനസിലാക്കാൻ ഞങ്ങളുടെ ആരംഭ ട്യൂട്ടോറിയൽ കാണുക."
+ },
+ "syncingComplete": {
+ "message": "സിങ്ക് പൂർത്തിയായി"
+ },
+ "syncingFailed": {
+ "message": "സിങ്ക് ചെയ്യാൻ പരാജയപെട്ടു"
+ },
+ "passwordCopied": {
+ "message": "പാസ്സ്വേഡ് പകർത്തി"
+ },
+ "uri": {
+ "message": "URI"
+ },
+ "uriPosition": {
+ "message": "URI $POSITION$",
+ "description": "A listing of URIs. Ex: URI 1, URI 2, URI 3, etc.",
+ "placeholders": {
+ "position": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "newUri": {
+ "message": "പുതിയ URI"
+ },
+ "addedItem": {
+ "message": "ചേർക്കപ്പെട്ട ഇനം"
+ },
+ "editedItem": {
+ "message": "തിരുത്തപ്പെട്ട ഇനം"
+ },
+ "deleteItemConfirmation": {
+ "message": "ഈ ഇനം ഇല്ലാതാക്കാൻ നിങ്ങൾ ആഗ്രഹിക്കുന്നുണ്ടോ?"
+ },
+ "deletedItem": {
+ "message": "ഇനം ട്രാഷിലേക്ക് അയച്ചു"
+ },
+ "overwritePassword": {
+ "message": "പാസ്വേഡ് പുനരാലേഖനം ചെയ്യുക"
+ },
+ "overwritePasswordConfirmation": {
+ "message": "നിലവിലെ പാസ്വേഡ് പുനരാലേഖനം ചെയ്യണമെന്ന് നിങ്ങൾക്ക് ഉറപ്പാണോ?"
+ },
+ "searchFolder": {
+ "message": "ഫോൾഡറുകൾ തിരയുക"
+ },
+ "searchCollection": {
+ "message": "കളക്ഷൻസ് തിരയുക "
+ },
+ "searchType": {
+ "message": "തരം തിരയുന്നു"
+ },
+ "noneFolder": {
+ "message": "ഫോൾഡറിൽ ഉൾപ്പെടാത്ത",
+ "description": "This is the folder for uncategorized items"
+ },
+ "disableAddLoginNotification": {
+ "message": "പ്രവേശനം ചേർക്കുക എന്ന അറിയിപ്പ് പ്രവർത്തനരഹിതമാക്കുക"
+ },
+ "addLoginNotificationDesc": {
+ "message": "നിങ്ങൾ ആദ്യമായി സൈറ്റിൽ പ്രവേശിക്കുമ്പോൾ നിങ്ങളുടെ വാൾട്ടിലേക്കു തനിയെ പ്രവേശനം ഉൾപെടുത്താൻ \"പ്രവേശനം ചേർക്കുക എന്ന അറിയിപ്പ്\" ആവശ്യപ്പെടും."
+ },
+ "dontShowCardsCurrentTab": {
+ "message": "ടാബ് പേജിൽ കാർഡുകൾ കാണിക്കരുത്"
+ },
+ "dontShowCardsCurrentTabDesc": {
+ "message": "സ്വപ്രേരിതമായി പൂരിപ്പിക്കുന്നതിന് നിങ്ങളുടെ നിലവറയിൽ നിന്നുള്ള കാർഡ് ഇനങ്ങൾ 'നിലവിലെ ടാബ്' പേജിൽ പട്ടികപ്പെടുത്തിയിട്ടുണ്ട്."
+ },
+ "dontShowIdentitiesCurrentTab": {
+ "message": "ടാബ് പേജിൽ ഐഡന്റിറ്റികൾ കാണിക്കരുത്"
+ },
+ "dontShowIdentitiesCurrentTabDesc": {
+ "message": "സ്വയമേവ എളുപ്പത്തിൽ പൂരിപ്പിക്കുന്നതിന് നിങ്ങളുടെ നിലവറയിൽ നിന്നുള്ള ഐഡന്റിറ്റി ഇനങ്ങൾ 'നിലവിലെ ടാബ്' പേജിൽ പട്ടികപ്പെടുത്തിയിട്ടുണ്ട്."
+ },
+ "clearClipboard": {
+ "message": "ക്ലിപ്ബോര്ഡ് മായ്ക്കുക",
+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
+ },
+ "clearClipboardDesc": {
+ "message": "നിങ്ങളുടെ ക്ലിപ്പ്ബോർഡിൽ നിന്ന് പകർത്തിയ മൂല്യങ്ങൾ യാന്ത്രികമായി മായ്ക്കുക.",
+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
+ },
+ "notificationAddDesc": {
+ "message": "നിങ്ങൾക്കായി ഈ പാസ്വേഡ് ബിറ്റ്വർഡൻ ഓർത്തിരിക്കണോ?"
+ },
+ "notificationAddSave": {
+ "message": "ശരി, ഇപ്പോൾ സംരക്ഷിക്കുക"
+ },
+ "notificationNeverSave": {
+ "message": "ഈ വെബ്സൈറ്റിനായി ഒരിക്കലും"
+ },
+ "disableChangedPasswordNotification": {
+ "message": "മാറ്റിയ പാസ്വേഡ് അറിയിപ്പ് പ്രവർത്തനരഹിതമാക്കുക"
+ },
+ "disableChangedPasswordNotificationDesc": {
+ "message": "ഒരു വെബ്സൈറ്റിൽ നിങ്ങൾ അത് മാറ്റിയതായി കണ്ടെത്തുമ്പോഴെല്ലാം നിങ്ങളുടെ നിലവറയിൽ ഒരു ലോഗിൻ പാസ്വേഡ് അപ്ഡേറ്റുചെയ്യാൻ \"മാറ്റിയ പാസ്വേഡ് അറിയിപ്പ്\" യാന്ത്രികമായി ആവശ്യപ്പെടുന്നു."
+ },
+ "notificationChangeDesc": {
+ "message": "ബിറ്റ്വാർഡനിൽ ഈ പാസ്വേഡ് അപ്ഡേറ്റ് ചെയ്യാൻ നിങ്ങൾ ആഗ്രഹിക്കുന്നുണ്ടോ?"
+ },
+ "notificationChangeSave": {
+ "message": "ശരി, ഇപ്പോൾ അപ്ഡേറ്റ് ചെയ്യുക"
+ },
+ "disableContextMenuItem": {
+ "message": "സന്ദർഭ മെനു ഓപ്ഷനുകൾ അപ്രാപ്തമാക്കുക"
+ },
+ "disableContextMenuItemDesc": {
+ "message": "നിങ്ങളുടെ നിലവിലെ ടാബിലെ വെബ്സൈറ്റിനായുള്ള പാസ്വേഡ് ജനറേഷനിലേക്കും ലോഗിനുകളിലേക്കും സന്ദർഭ മെനു ഓപ്ഷനുകൾ ദ്രുത പ്രവേശനം നൽകുന്നു."
+ },
+ "defaultUriMatchDetection": {
+ "message": "സാധാരണ URI പൊരുത്തം കണ്ടെത്തൽ",
+ "description": "Default URI match detection for auto-fill."
+ },
+ "defaultUriMatchDetectionDesc": {
+ "message": "യാന്ത്രിക പൂരിപ്പിക്കൽ പോലുള്ള പ്രവർത്തനങ്ങൾ നടത്തുമ്പോൾ ലോഗിനുകൾക്കായി യുആർഐ മാച്ച് ഡിറ്റക്ഷൻ കൈകാര്യം ചെയ്യുന്ന സ്ഥിരസ്ഥിതി മാർഗം തിരഞ്ഞെടുക്കുക."
+ },
+ "theme": {
+ "message": "തീം"
+ },
+ "themeDesc": {
+ "message": "അപ്ലിക്കേഷന്റെ തീമും വർണ്ണങ്ങളും മാറ്റുക."
+ },
+ "dark": {
+ "message": "ഇരുണ്ടത്",
+ "description": "Dark color"
+ },
+ "light": {
+ "message": "ലൈറ്റ്",
+ "description": "Light color"
+ },
+ "solarizedDark": {
+ "message": "Solarized Dark",
+ "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated."
+ },
+ "exportVault": {
+ "message": "വാൾട് എക്സ്പോർട്"
+ },
+ "fileFormat": {
+ "message": "ഫയൽ ഫോർമാറ്റ്"
+ },
+ "warning": {
+ "message": "മുന്നറിയിപ്പ്",
+ "description": "WARNING (should stay in capitalized letters if the language permits)"
+ },
+ "confirmVaultExport": {
+ "message": "Confirm Vault Export"
+ },
+ "exportWarningDesc": {
+ "message": "ഈ എക്സ്പോർട്ടിൽ എൻക്രിപ്റ്റ് ചെയ്യാത്ത ഫോർമാറ്റിൽ നിങ്ങളുടെ വാൾട് ഡാറ്റ അടങ്ങിയിരിക്കുന്നു. എക്സ്പോർട് ചെയ്ത ഫയൽ സുരക്ഷിതമല്ലാത്ത ചാനലുകളിൽ (ഇമെയിൽ പോലുള്ളവ) നിങ്ങൾ സംഭരിക്കുകയോ അയയ്ക്കുകയോ ചെയ്യരുത്. നിങ്ങൾ ഇത് ഉപയോഗിച്ചുകഴിഞ്ഞാലുടൻ അത് മായ്ച്ചുകളയണം."
+ },
+ "encExportKeyWarningDesc": {
+ "message": "This export encrypts your data using your account's encryption key. If you ever rotate your account's encryption key you should export again since you will not be able to decrypt this export file."
+ },
+ "encExportAccountWarningDesc": {
+ "message": "Account encryption keys are unique to each Bitwarden user account, so you can't import an encrypted export into a different account."
+ },
+ "exportMasterPassword": {
+ "message": "നിങ്ങളുടെ വാൾട് ഡാറ്റ എക്സ്പോർട്ടുചെയ്യാൻ പ്രാഥമിക പാസ്വേഡ് നൽകുക."
+ },
+ "shared": {
+ "message": "പങ്കിട്ടവ"
+ },
+ "learnOrg": {
+ "message": "Learn about Organizations"
+ },
+ "learnOrgConfirmation": {
+ "message": "Bitwarden allows you to share your vault items with others by using an organization. Would you like to visit the bitwarden.com website to learn more?"
+ },
+ "moveToOrganization": {
+ "message": "Move to Organization"
+ },
+ "share": {
+ "message": "പങ്കിടുക"
+ },
+ "movedItemToOrg": {
+ "message": "$ITEMNAME$ moved to $ORGNAME$",
+ "placeholders": {
+ "itemname": {
+ "content": "$1",
+ "example": "Secret Item"
+ },
+ "orgname": {
+ "content": "$2",
+ "example": "Company Name"
+ }
+ }
+ },
+ "moveToOrgDesc": {
+ "message": "Choose an organization that you wish to move this item to. Moving to an organization transfers ownership of the item to that organization. You will no longer be the direct owner of this item once it has been moved."
+ },
+ "learnMore": {
+ "message": "കൂടുതലറിവ് നേടുക"
+ },
+ "authenticatorKeyTotp": {
+ "message": "ഓതന്റിക്കേറ്റർ കീ (TOTP)"
+ },
+ "verificationCodeTotp": {
+ "message": "സ്ഥിരീകരണ കോഡ് (TOTP)"
+ },
+ "copyVerificationCode": {
+ "message": "സ്ഥിരീകരണ കോഡ് പകർത്തുക "
+ },
+ "attachments": {
+ "message": "അറ്റാച്ചുമെന്റുകൾ"
+ },
+ "deleteAttachment": {
+ "message": "അറ്റാച്ചുമെന്റ് ഇല്ലാതാക്കുക"
+ },
+ "deleteAttachmentConfirmation": {
+ "message": "ഈ അറ്റാച്ചുമെന്റ് ഇല്ലാതാക്കാൻ നിങ്ങൾ ആഗ്രഹിക്കുന്നുണ്ടോ?"
+ },
+ "deletedAttachment": {
+ "message": "മായ്ച്ച അറ്റാച്ചുമെന്റ്"
+ },
+ "newAttachment": {
+ "message": "പുതിയ അറ്റാച്ചുമെന്റ് ചേർക്കുക"
+ },
+ "noAttachments": {
+ "message": "അറ്റാച്ചുമെന്റുകൾ ഇല്ല."
+ },
+ "attachmentSaved": {
+ "message": "അറ്റാച്ചുമെന്റ് സംരക്ഷിച്ചു."
+ },
+ "file": {
+ "message": "ഫയൽ"
+ },
+ "selectFile": {
+ "message": "ഒരു ഫയൽ തിരഞ്ഞെടുക്കുക"
+ },
+ "maxFileSize": {
+ "message": "പരമാവധി ഫയൽ വലുപ്പം 500 MB ആണ്."
+ },
+ "featureUnavailable": {
+ "message": "സവിശേഷത ലഭ്യമല്ല"
+ },
+ "updateKey": {
+ "message": "നിങ്ങളുടെ എൻക്രിപ്ഷൻ കീ അപ്ഡേറ്റ് ചെയ്യുന്നതുവരെ നിങ്ങൾക്ക് ഈ സവിശേഷത ഉപയോഗിക്കാൻ കഴിയില്ല."
+ },
+ "premiumMembership": {
+ "message": "പ്രീമിയം അംഗത്വം"
+ },
+ "premiumManage": {
+ "message": "അംഗത്വം നിയന്ത്രിക്കുക"
+ },
+ "premiumManageAlert": {
+ "message": "നിങ്ങളുടെ അംഗത്വം bitwarden.com വെബ് വാൾട്ടിൽ മാനേജുചെയ്യാൻ കഴിയും. തങ്ങൾക്ക് ഇപ്പോൾ വെബ്സൈറ്റ് സന്ദർശിക്കാൻ ആഗ്രഹമുണ്ടോ?"
+ },
+ "premiumRefresh": {
+ "message": "അംഗത്വം റിഫ്രഷ് ചെയ്യുക"
+ },
+ "premiumNotCurrentMember": {
+ "message": "നിങ്ങൾ നിലവിൽ ഒരു പ്രീമിയം അംഗമല്ല."
+ },
+ "premiumSignUpAndGet": {
+ "message": "ഒരു പ്രീമിയം അംഗത്വത്തിനായി സൈൻ അപ്പ് ചെയ്ത് നേടുക:"
+ },
+ "ppremiumSignUpStorage": {
+ "message": "ഫയൽ അറ്റാച്ചുമെന്റുകൾക്കായി 1 ജിബി എൻക്രിപ്റ്റുചെയ്ത സംഭരണം."
+ },
+ "ppremiumSignUpTwoStep": {
+ "message": "രണ്ട്-ഘട്ട പ്രവേശന ഓപ്ഷനുകളായ Yubikey, FIDO U2F, Duo."
+ },
+ "ppremiumSignUpReports": {
+ "message": "നിങ്ങളുടെ വാൾട് സൂക്ഷിക്കുന്നതിന്. പാസ്വേഡ് ശുചിത്വം, അക്കൗണ്ട് ആരോഗ്യം, ഡാറ്റ ലംഘന റിപ്പോർട്ടുകൾ."
+ },
+ "ppremiumSignUpTotp": {
+ "message": "നിങ്ങളുടെ വാൾട്ടിലെ പ്രവേശനങ്ങൾക്കായി TOTP പരിശോധന കോഡ് (2FA) സൃഷ്ടാവ്."
+ },
+ "ppremiumSignUpSupport": {
+ "message": "മുൻഗണന ഉപഭോക്തൃ പിന്തുണ."
+ },
+ "ppremiumSignUpFuture": {
+ "message": "ഭാവിയിലെ എല്ലാ പ്രീമിയം സവിശേഷതകളും. കൂടുതൽ ഉടനെ വരുന്നു !"
+ },
+ "premiumPurchase": {
+ "message": "പ്രീമിയം വാങ്ങുക"
+ },
+ "premiumPurchaseAlert": {
+ "message": "നിങ്ങൾക്ക് bitwarden.com വെബ് വാൾട്ടിൽ പ്രീമിയം അംഗത്വം വാങ്ങാം. നിങ്ങൾക്ക് ഇപ്പോൾ വെബ്സൈറ്റ് സന്ദർശിക്കാൻ ആഗ്രഹമുണ്ടോ?"
+ },
+ "premiumCurrentMember": {
+ "message": "തങ്ങൾ ഒരു പ്രീമിയം അംഗമാണ്!"
+ },
+ "premiumCurrentMemberThanks": {
+ "message": "Bitwardenനെ പിന്തുണച്ചതിന് നന്ദി."
+ },
+ "premiumPrice": {
+ "message": "എല്ലാം വെറും $PRICE$/ വർഷത്തേക്ക്!",
+ "placeholders": {
+ "price": {
+ "content": "$1",
+ "example": "$10"
+ }
+ }
+ },
+ "refreshComplete": {
+ "message": "റിഫ്രഷ് പൂർത്തിയായി"
+ },
+ "disableAutoTotpCopy": {
+ "message": "ഓട്ടോമാറ്റിക് TOTP പകർപ്പ് പ്രവർത്തനരഹിതമാക്കുക"
+ },
+ "disableAutoTotpCopyDesc": {
+ "message": "നിങ്ങളുടെ പ്രവേശനം ഒരു ഓതന്റിക്കേറ്റർ കീയുമായി ബന്ധപെടുത്തിയട്ടുടെങ്കിൽ, പ്രവേശനം ഓട്ടോഫിൽ ചെയ്യുമ്പോഴെല്ലാം TOTP സ്ഥിരീകരണ കോഡ് നിങ്ങളുടെ ക്ലിപ്ബോർഡിൽ ഓട്ടോമാറ്റിക്കയായി പകർത്തപ്പെടും."
+ },
+ "disableAutoBiometricsPrompt": {
+ "message": "Do not prompt for biometrics on launch"
+ },
+ "premiumRequired": {
+ "message": "പ്രീമിയം അംഗത്വം ആവശ്യമാണ്"
+ },
+ "premiumRequiredDesc": {
+ "message": "ഈ സവിശേഷത ഉപയോഗിക്കുന്നതിന് പ്രീമിയം അംഗത്വം ആവശ്യമാണ്."
+ },
+ "enterVerificationCodeApp": {
+ "message": "നിങ്ങളുടെ ഓതന്റിക്കേറ്റർ അപ്ലിക്കേഷനിൽ നിന്ന് 6 അക്ക സ്ഥിരീകരണ കോഡ് നൽകുക."
+ },
+ "enterVerificationCodeEmail": {
+ "message": "$EMAIL$ൽ ഇമെയിൽ ചെയ്ത 6 അക്ക സ്ഥിരീകരണ കോഡ് നൽകുക",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "example@gmail.com"
+ }
+ }
+ },
+ "verificationCodeEmailSent": {
+ "message": "സ്ഥിരീകരണ ഇമെയിൽ $EMAIL$ ലേക്ക് അയച്ചു.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "example@gmail.com"
+ }
+ }
+ },
+ "rememberMe": {
+ "message": "എന്നെ ഓർക്കുക"
+ },
+ "sendVerificationCodeEmailAgain": {
+ "message": "സ്ഥിരീകരണ കോഡ് ഇമെയിൽ വഴി അയയ്ക്കുക"
+ },
+ "useAnotherTwoStepMethod": {
+ "message": "മറ്റൊരു രണ്ട് ഘട്ട ലോഗിൻ രീതി ഉപയോഗിക്കുക"
+ },
+ "insertYubiKey": {
+ "message": "നിങ്ങളുടെ കമ്പ്യൂട്ടറിന്റെ യുഎസ്ബി പോർട്ടിലേക്ക് യുബിക്കി ഇടുക, തുടർന്ന് അതിന്റെ ബട്ടൺ അമർത്തുക."
+ },
+ "insertU2f": {
+ "message": "നിങ്ങളുടെ കമ്പ്യൂട്ടറിന്റെ യുഎസ്ബി പോർട്ടിൽ സുരക്ഷാ കീ ഇടുക. അതിന് ഒരു ബട്ടൺ ഉണ്ടെങ്കിൽ അത് അമർത്തുക."
+ },
+ "webAuthnNewTab": {
+ "message": "To start the WebAuthn 2FA verification. Click the button below to open a new tab and follow the instructions provided in the new tab."
+ },
+ "webAuthnNewTabOpen": {
+ "message": "Open new tab"
+ },
+ "webAuthnAuthenticate": {
+ "message": "Authenticate WebAuthn"
+ },
+ "loginUnavailable": {
+ "message": "പ്രവേശനം ലഭ്യമല്ല"
+ },
+ "noTwoStepProviders": {
+ "message": "ഈ അക്കൗണ്ടിന് രണ്ട്-ഘട്ട പ്രവേശനം പ്രാപ്തമാക്കിയിട്ടുണ്ട്, എന്നിരുന്നാലും, ക്രമീകരിച്ച രണ്ട്-ഘട്ട ദാതാക്കളെയൊന്നും ഈ ഉപകരണം പിന്തുണയ്ക്കുന്നില്ല."
+ },
+ "noTwoStepProviders2": {
+ "message": "മികച്ച പിന്തുണയുള്ള, കൂടുതൽ ദാതാക്കളെ ദയവായി ചേർക്കുക (ഒരു ഓതന്റിക്കേറ്റർ അപ്ലിക്കേഷൻ പോലുള്ളവ)."
+ },
+ "twoStepOptions": {
+ "message": "രണ്ട്-ഘട്ട പ്രവേശനം ഓപ്ഷനുകൾ"
+ },
+ "recoveryCodeDesc": {
+ "message": "നിങ്ങളുടെ രണ്ട്-ഘടക ദാതാക്കളിലേക്കുള്ള ആക്സസ്സ് നഷ്ടപ്പെട്ടോ? നിങ്ങളുടെ അക്കൗണ്ടിൽ നിന്ന് രണ്ട്-ഘടക ദാതാക്കളെ പ്രവർത്തനരഹിതമാക്കാൻ നിങ്ങളുടെ റിക്കവറി കോഡ് ഉപയോഗിക്കുക."
+ },
+ "recoveryCodeTitle": {
+ "message": "റിക്കവറി കോഡ്"
+ },
+ "authenticatorAppTitle": {
+ "message": "ഓതന്റിക്കേറ്റർ ആപ്പ്"
+ },
+ "authenticatorAppDesc": {
+ "message": "സമയ-അടിസ്ഥാന പരിശോധന കോഡുകൾ സൃഷ്ടിക്കുന്നതിന് ഒരു ഓതന്റിക്കേറ്റർ അപ്ലിക്കേഷൻ (ഓത്തി അല്ലെങ്കിൽ Google ഓതന്റിക്കേറ്റർ പോലുള്ളവ) ഉപയോഗിക്കുക.",
+ "description": "'Authy' and 'Google Authenticator' are product names and should not be translated."
+ },
+ "yubiKeyTitle": {
+ "message": "YubiKey OTP സുരക്ഷാ കീ"
+ },
+ "yubiKeyDesc": {
+ "message": "നിങ്ങളുടെ അക്കൗണ്ട് ആക്സസ് ചെയ്യുന്നതിന് ഒരു യൂബിക്കി ഉപയോഗിക്കുക. YubiKey 4, 4 Nano, 4C, NEO ഉപകരണങ്ങളിൽ പ്രവർത്തിക്കുന്നു."
+ },
+ "duoDesc": {
+ "message": "Duo Mobile അപ്ലിക്കേഷൻ, എസ്എംഎസ്, ഫോൺ കോൾ അല്ലെങ്കിൽ യു 2 എഫ് സുരക്ഷാ കീ ഉപയോഗിച്ച് Duoസെക്യൂരിറ്റി ഉപയോഗിച്ച് പരിശോധിക്കുക.",
+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
+ },
+ "duoOrganizationDesc": {
+ "message": "Duo Mobile, എസ്എംഎസ്, ഫോൺ കോൾ അല്ലെങ്കിൽ യു 2 എഫ് സുരക്ഷാ കീ ഉപയോഗിച്ച് നിങ്ങളുടെ ഓർഗനൈസേഷനെ ഡ്യുവോ സെക്യൂരിറ്റി ഉപയോഗിച്ച് പരിശോധിക്കുക.",
+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
+ },
+ "webAuthnTitle": {
+ "message": "FIDO2 WebAuthn"
+ },
+ "webAuthnDesc": {
+ "message": "Use any WebAuthn enabled security key to access your account."
+ },
+ "emailTitle": {
+ "message": "ഇമെയിൽ"
+ },
+ "emailDesc": {
+ "message": "സ്ഥിരീകരണ കോഡുകൾ നിങ്ങൾക്ക് ഇമെയിൽ ചെയ്യും."
+ },
+ "selfHostedEnvironment": {
+ "message": "സ്വയം ഹോസ്റ്റുചെയ്ത എൻവിയോണ്മെന്റ്"
+ },
+ "selfHostedEnvironmentFooter": {
+ "message": "തങ്ങളുടെ പരിസരത്ത് ചെയ്യുന്ന ബിറ്റ് വാർഡൻ ഇൻസ്റ്റാളേഷന്റെ അടിസ്ഥാന URL വ്യക്തമാക്കുക."
+ },
+ "customEnvironment": {
+ "message": "ഇഷ്ടാനുസൃത എൻവിയോണ്മെന്റ്"
+ },
+ "customEnvironmentFooter": {
+ "message": "വിപുലമായ ഉപയോക്താക്കൾക്കായി. ഓരോ സേവനത്തിന്റെയും അടിസ്ഥാന URL നിങ്ങൾക്ക് സ്വതന്ത്രമായി വ്യക്തമാക്കാൻ കഴിയും."
+ },
+ "baseUrl": {
+ "message": "സെർവർ URL"
+ },
+ "apiUrl": {
+ "message": "API സെർവർ URL"
+ },
+ "webVaultUrl": {
+ "message": "വെബ് വാൾട് സെർവർ URL"
+ },
+ "identityUrl": {
+ "message": "ഐഡന്റിറ്റി സെർവർ URL"
+ },
+ "notificationsUrl": {
+ "message": "API സെർവർ URL"
+ },
+ "iconsUrl": {
+ "message": "ഐക്കണുകളുടെ സെർവർ URL"
+ },
+ "environmentSaved": {
+ "message": "എന്വിയാണമെന്റ് URL സംരക്ഷിച്ചു."
+ },
+ "enableAutoFillOnPageLoad": {
+ "message": "പേജ് ലോഡിൽ യാന്ത്രിക-പൂരിപ്പിക്കൽ പ്രവർത്തനക്ഷമമാക്കുക"
+ },
+ "enableAutoFillOnPageLoadDesc": {
+ "message": "ഒരു ലോഗിൻ ഫോം കണ്ടെത്തിയാൽ, വെബ് പേജ് ലോഡുചെയ്യുമ്പോൾ യാന്ത്രികമായി ഒരു സ്വയം പൂരിപ്പിക്കൽ നടത്തുക."
+ },
+ "experimentalFeature": {
+ "message": "ഇത് നിലവിൽ ഒരു പരീക്ഷണാത്മക സവിശേഷതയാണ്. നിങ്ങളുടെ സ്വന്തം ഉത്തരവാദിത്വത്തിൽ ഉപയോഗിക്കുക."
+ },
+ "defaultAutoFillOnPageLoad": {
+ "message": "Default autofill setting for login items"
+ },
+ "defaultAutoFillOnPageLoadDesc": {
+ "message": "After enabling Auto-fill on Page Load, you can enable or disable the feature for individual login items. This is the default setting for login items that are not separately configured."
+ },
+ "itemAutoFillOnPageLoad": {
+ "message": "Auto-fill on Page Load (if enabled in Options)"
+ },
+ "autoFillOnPageLoadUseDefault": {
+ "message": "Use default setting"
+ },
+ "autoFillOnPageLoadYes": {
+ "message": "Auto-fill on page load"
+ },
+ "autoFillOnPageLoadNo": {
+ "message": "Do not auto-fill on page load"
+ },
+ "commandOpenPopup": {
+ "message": "വോൾട്ട് പോപ്പ്അപ്പ് തുറക്കുക"
+ },
+ "commandOpenSidebar": {
+ "message": "വാൾട് സൈഡ്ബാറിൽ തുറക്കുക"
+ },
+ "commandAutofillDesc": {
+ "message": "നിലവിലെ വെബ്സൈറ്റിനായി അവസാനമായി ഉപയോഗിച്ച ലോഗിൻ യാന്ത്രികമായി പൂരിപ്പിക്കുക"
+ },
+ "commandGeneratePasswordDesc": {
+ "message": "ക്ലിപ്പ്ബോർഡിലേക്ക് ഒരു പുതിയ റാൻഡം പാസ്വേഡ് സൃഷ്ടിച്ച് പകർത്തുക"
+ },
+ "commandLockVaultDesc": {
+ "message": "നിലവറ പൂട്ടുക"
+ },
+ "privateModeMessage": {
+ "message": "നിർഭാഗ്യവശാൽ ഈ വിൻഡോ ബ്രൗസറിന്റെ സ്വകാര്യ മോഡിൽ ലഭ്യമല്ല."
+ },
+ "customFields": {
+ "message": "ഇഷ്ടാനുസൃത ഫീൽഡുകൾ"
+ },
+ "copyValue": {
+ "message": "മൂല്യം പകർത്തുക"
+ },
+ "value": {
+ "message": "മൂല്യം"
+ },
+ "newCustomField": {
+ "message": "പുതിയ ഇഷ്ടാനുസൃത ഫീൽഡ്"
+ },
+ "dragToSort": {
+ "message": "അടുക്കാൻ വലിച്ചിടുക"
+ },
+ "cfTypeText": {
+ "message": "വാചകം"
+ },
+ "cfTypeHidden": {
+ "message": "മറച്ചത്"
+ },
+ "cfTypeBoolean": {
+ "message": "ബൂളിയൻ"
+ },
+ "popup2faCloseMessage": {
+ "message": "നിങ്ങളുടെ സ്ഥിരീകരണ കോഡിനായി നിങ്ങളുടെ ഇമെയിൽ പരിശോധിക്കുന്നതിന് പോപ്പ്അപ്പ് വിൻഡോയ്ക്ക് പുറത്ത് ക്ലിക്കുചെയ്യുന്നത് ഈ പോപ്പ്അപ്പ് അടയ്ക്കുന്നതിന് കാരണമാകും. ഈ പോപ്പ്അപ്പ് അടയ്ക്കാത്തവിധം ഒരു പുതിയ വിൻഡോയിൽ തുറക്കാൻ നിങ്ങൾ താൽപ്പര്യപ്പെടുന്നോ?"
+ },
+ "popupU2fCloseMessage": {
+ "message": "ഈ ബ്ര pop സറിന് ഈ പോപ്പ്അപ്പ് വിൻഡോയിൽ U2F അഭ്യർത്ഥനകൾ പ്രോസസ്സ് ചെയ്യാൻ കഴിയില്ല. യു 2 എഫ് ഉപയോഗിച്ച് ലോഗിൻ ചെയ്യാൻ ഈ പോപ്പ്അപ്പ് ഒരു പുതിയ വിൻഡോയിൽ തുറക്കാൻ നിങ്ങൾ ആഗ്രഹിക്കുന്നുണ്ടോ?"
+ },
+ "disableFavicon": {
+ "message": "വെബ്സൈറ്റ് ഐക്കണുകൾ പ്രവർത്തനരഹിതമാക്കുക"
+ },
+ "disableFaviconDesc": {
+ "message": "വെബ്സൈറ്റ് ഐക്കണുകൾ തങ്ങളുടെ വാൾട്ടിലെ ലോഗിൻ ഇന്നതിന്റ്റെ അടുത്തായി തിരിച്ചറിയുന്ന ഒരു ചിത്രം ഉൾപ്പെടുത്തുന്നു."
+ },
+ "disableBadgeCounter": {
+ "message": "Disable Badge Counter"
+ },
+ "disableBadgeCounterDesc": {
+ "message": "Badge counter indicates how many logins you have for the current page in your vault."
+ },
+ "cardholderName": {
+ "message": "കാർഡ് ഉടമയുടെ പേര്"
+ },
+ "number": {
+ "message": "നമ്പർ"
+ },
+ "brand": {
+ "message": "ബ്രാൻഡ്"
+ },
+ "expirationMonth": {
+ "message": "കാലാവതി കഴിയുന്ന മാസം"
+ },
+ "expirationYear": {
+ "message": "കാലാവതി കഴിയുന്ന വർഷം"
+ },
+ "expiration": {
+ "message": "കാലഹരണപ്പെടൽ"
+ },
+ "january": {
+ "message": "ജനുവരി"
+ },
+ "february": {
+ "message": "ഫെബ്രുവരി"
+ },
+ "march": {
+ "message": "മാർച്ച്"
+ },
+ "april": {
+ "message": "ഏപ്രിൽ"
+ },
+ "may": {
+ "message": "മെയ്"
+ },
+ "june": {
+ "message": "ജൂണ്"
+ },
+ "july": {
+ "message": "ജൂലൈ"
+ },
+ "august": {
+ "message": "ഓഗസ്റ്റ്"
+ },
+ "september": {
+ "message": "സെപ്റ്റംബർ"
+ },
+ "october": {
+ "message": "ഒക്ടോബര്"
+ },
+ "november": {
+ "message": "നവംബർ"
+ },
+ "december": {
+ "message": "ഡിസംബർ"
+ },
+ "securityCode": {
+ "message": "സുരക്ഷാ കോഡ്"
+ },
+ "ex": {
+ "message": "ഉദാഹരണം."
+ },
+ "title": {
+ "message": "ശീർഷകം"
+ },
+ "mr": {
+ "message": "ശ്രീ"
+ },
+ "mrs": {
+ "message": "ശ്രിമതി"
+ },
+ "ms": {
+ "message": "കുമാരി"
+ },
+ "dr": {
+ "message": "ഡോ"
+ },
+ "firstName": {
+ "message": "പേരിന്റെ ആദ്യഭാഗം"
+ },
+ "middleName": {
+ "message": "മധ്യ നാമം"
+ },
+ "lastName": {
+ "message": "പേരിന്റെ അവസാന ഭാഗം"
+ },
+ "identityName": {
+ "message": "ഐഡന്റിറ്റിയുടെ പേര്"
+ },
+ "company": {
+ "message": "കമ്പനി"
+ },
+ "ssn": {
+ "message": "സാമൂഹിക സുരക്ഷാ നമ്പർ"
+ },
+ "passportNumber": {
+ "message": "പാസ്പോർട്ട് നമ്പർ"
+ },
+ "licenseNumber": {
+ "message": "ലൈസൻസ് നമ്പർ"
+ },
+ "email": {
+ "message": "ഇമെയിൽ"
+ },
+ "phone": {
+ "message": "ഫോൺ"
+ },
+ "address": {
+ "message": "മേൽവിലാസം"
+ },
+ "address1": {
+ "message": "മേൽവിലാസം 1"
+ },
+ "address2": {
+ "message": "മേൽവിലാസം 2"
+ },
+ "address3": {
+ "message": "മേൽവിലാസം 3"
+ },
+ "cityTown": {
+ "message": "നഗരം / പട്ടണം"
+ },
+ "stateProvince": {
+ "message": "സംസ്ഥാനം/ ദേശം"
+ },
+ "zipPostalCode": {
+ "message": "പിൻകോഡ്"
+ },
+ "country": {
+ "message": "രാജ്യം"
+ },
+ "type": {
+ "message": "തരം"
+ },
+ "typeLogin": {
+ "message": "പ്രവേശനം"
+ },
+ "typeLogins": {
+ "message": "പ്രവേശനങ്ങൾ"
+ },
+ "typeSecureNote": {
+ "message": "സുരക്ഷിത കുറിപ്പ്"
+ },
+ "typeCard": {
+ "message": "കാർഡ്"
+ },
+ "typeIdentity": {
+ "message": "ഐഡന്റിറ്റി"
+ },
+ "passwordHistory": {
+ "message": "പാസ്സ്വേഡ് നാൾവഴി"
+ },
+ "back": {
+ "message": "പുറകോട്ട്"
+ },
+ "collections": {
+ "message": "കളക്ഷൻസ്"
+ },
+ "favorites": {
+ "message": "പ്രിയങ്കരങ്ങള്"
+ },
+ "popOutNewWindow": {
+ "message": "ഒരു പുതിയ വിൻഡോയിലേക്ക് പോപ്പ് out ട്ട് ചെയ്യുക"
+ },
+ "refresh": {
+ "message": "റിഫ്രഷ് ചെയ്യുക"
+ },
+ "cards": {
+ "message": "കാർഡുകൾ"
+ },
+ "identities": {
+ "message": "തിരിച്ചറിയലുകൾ"
+ },
+ "logins": {
+ "message": "പ്രവേശനങ്ങൾ"
+ },
+ "secureNotes": {
+ "message": "സുരക്ഷാ കുറിപ്പുകൾ"
+ },
+ "clear": {
+ "message": "മായ്ക്കുക",
+ "description": "To clear something out. example: To clear browser history."
+ },
+ "checkPassword": {
+ "message": "പാസ്സ്വേർഡ് ചോർന്നോ എന്ന് നോക്കുക."
+ },
+ "passwordExposed": {
+ "message": "ഈ പാസ്വേഡ് $VALUE$ ലംഘനങ്ങളിൽ ചോർന്നു. തങ്ങൾ ഇത് മാറ്റണം.",
+ "placeholders": {
+ "value": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "passwordSafe": {
+ "message": "അറിയപ്പെടുന്ന ഡാറ്റാ ലംഘനങ്ങളിൽ ഈ പാസ്വേഡ് കണ്ടെത്തിയില്ല. ഇത് ഉപയോഗിക്കുന്നത് സുരക്ഷിതമായിരിക്കും."
+ },
+ "baseDomain": {
+ "message": "അടിസ്ഥാന ഡൊമെയ്ൻ"
+ },
+ "host": {
+ "message": "ഹോസ്റ്റ്",
+ "description": "A URL's host value. For example, the host of https://sub.domain.com:443 is 'sub.domain.com:443'."
+ },
+ "exact": {
+ "message": "കൃത്യമായി"
+ },
+ "startsWith": {
+ "message": "തുടങ്ങുന്നത്"
+ },
+ "regEx": {
+ "message": "പതിവ് പദപ്രയോഗം",
+ "description": "A programming term, also known as 'RegEx'."
+ },
+ "matchDetection": {
+ "message": "പൊരുത്തം കണ്ടെത്തൽ",
+ "description": "URI match detection for auto-fill."
+ },
+ "defaultMatchDetection": {
+ "message": "സ്ഥിരസ്ഥിതി പൊരുത്ത കണ്ടെത്തൽ",
+ "description": "Default URI match detection for auto-fill."
+ },
+ "toggleOptions": {
+ "message": "ഓപ്ഷനുകൾ ടോഗിൾ ചെയ്യുക"
+ },
+ "toggleCurrentUris": {
+ "message": "നിലവിലെ URIകൾ ടോഗിൾ ചെയ്യുക",
+ "description": "Toggle the display of the URIs of the currently open tabs in the browser."
+ },
+ "currentUri": {
+ "message": "നിലവിലെ URI",
+ "description": "The URI of one of the current open tabs in the browser."
+ },
+ "organization": {
+ "message": "സംഘടന",
+ "description": "An entity of multiple related people (ex. a team or business organization)."
+ },
+ "types": {
+ "message": "തരങ്ങൾ"
+ },
+ "allItems": {
+ "message": "എല്ലാ ഇനങ്ങൾ"
+ },
+ "noPasswordsInList": {
+ "message": "പ്രദർശിപ്പിക്കാൻ പാസ്സ്വേഡുകൾ ഒന്നും ഇല്ല."
+ },
+ "remove": {
+ "message": "നീക്കുക"
+ },
+ "default": {
+ "message": "സ്ഥിരസ്ഥിതി"
+ },
+ "dateUpdated": {
+ "message": "പുതുക്കി",
+ "description": "ex. Date this item was updated"
+ },
+ "datePasswordUpdated": {
+ "message": "പാസ്സ്വേഡ് പുതുക്കി",
+ "description": "ex. Date this password was updated"
+ },
+ "neverLockWarning": {
+ "message": "\"ഒരിക്കലും\" ഓപ്ഷൻ ഉപയോഗിക്കാൻ നിങ്ങൾ ആഗ്രഹിക്കുന്നുണ്ടോ? നിങ്ങളുടെ ലോക്ക് ഓപ്ഷനുകൾ \"ഒരിക്കലും\" എന്ന് സജ്ജമാക്കുന്നത് നിങ്ങളുടെ ഉപകരണത്തിൽ നിലവറയുടെ എൻക്രിപ്ഷൻ കീ സംഭരിക്കുന്നു. നിങ്ങൾ ഈ ഓപ്ഷൻ ഉപയോഗിക്കുകയാണെങ്കിൽ, നിങ്ങളുടെ ഉപകരണം ശരിയായി പരിരക്ഷിച്ചിട്ടുണ്ടെന്ന് ഉറപ്പാക്കണം."
+ },
+ "noOrganizationsList": {
+ "message": "താങ്കൾ ഒരു സംഘടനയുടെയും അംഗമല്ല. മറ്റ് ഉപയോക്താക്കളുമായി ഇനങ്ങൾ സുരക്ഷിതമായി പങ്കിടാൻ ഓർഗനൈസേഷനുകൾ നിങ്ങളെ അനുവദിക്കുന്നു."
+ },
+ "noCollectionsInList": {
+ "message": "പ്രദർശിപ്പിക്കാൻ കളക്ഷൻസ് ഒന്നും ഇല്ല."
+ },
+ "ownership": {
+ "message": "ഉടമസ്ഥാവകാശം"
+ },
+ "whoOwnsThisItem": {
+ "message": "ഈ ഇനം ആരുടേതാണ്?"
+ },
+ "strong": {
+ "message": "ശക്തമാണ്",
+ "description": "ex. A strong password. Scale: Weak -> Good -> Strong"
+ },
+ "good": {
+ "message": "നല്ലതാണ്",
+ "description": "ex. A good password. Scale: Weak -> Good -> Strong"
+ },
+ "weak": {
+ "message": "ദുർബലമാണ്",
+ "description": "ex. A weak password. Scale: Weak -> Good -> Strong"
+ },
+ "weakMasterPassword": {
+ "message": "ദുർബലമായ പ്രാഥമിക പാസ്വേഡ്"
+ },
+ "weakMasterPasswordDesc": {
+ "message": "നിങ്ങൾ തിരഞ്ഞെടുത്ത പ്രാഥമിക പാസ്വേഡ് ദുർബലമാണ്. നിങ്ങളുടെ Bitwarden അക്കൗണ്ട് ശരിയായി സുരക്ഷിതമാക്കാൻ നിങ്ങൾ ഒരു ശക്തമായ മാസ്റ്റർ പാസ്വേഡ് (അല്ലെങ്കിൽ ഒരു പാസ്ഫ്രേസ്) ഉപയോഗിക്കണം. ഈ മാസ്റ്റർ പാസ്വേഡ് ഉപയോഗിക്കാൻ നിങ്ങൾ ആഗ്രഹിക്കുന്നുണ്ടോ?"
+ },
+ "pin": {
+ "message": "പിൻ",
+ "description": "PIN code. Ex. The short code (often numeric) that you use to unlock a device."
+ },
+ "unlockWithPin": {
+ "message": "പിൻ ഉപയോഗിച്ച് അൺലോക്കുചെയ്യുക"
+ },
+ "setYourPinCode": {
+ "message": "Bitwarden അൺലോക്കുചെയ്യുന്നതിന് തങ്ങളുടെ പിൻ കോഡ് സജ്ജമാക്കുക. തങ്ങൾ എപ്പോഴെങ്കിലും അപ്ലിക്കേഷനിൽ നിന്ന് പൂർണ്ണമായി ലോഗ് ഔട്ട് ചെയ്യുകയാണെങ്കിൽ, പിൻ ക്രമീകരണങ്ങൾ പുനസജ്ജമാക്കും."
+ },
+ "pinRequired": {
+ "message": "പിൻ കോഡ് നിർബന്ധമാണ്."
+ },
+ "invalidPin": {
+ "message": " പിൻ കോഡ് അസാധുവാണ്."
+ },
+ "verifyPin": {
+ "message": "പിൻ സ്ഥിരീകരിക്കുക"
+ },
+ "yourVaultIsLockedPinCode": {
+ "message": "നിങ്ങളുടെ വാൾട് പൂട്ടിയിരിക്കുന്നു. തുടരാൻ പിൻ കോഡ് സ്ഥിരീകരിക്കുക."
+ },
+ "unlockWithBiometrics": {
+ "message": "Unlock with biometrics"
+ },
+ "awaitDesktop": {
+ "message": "Awaiting confirmation from desktop"
+ },
+ "awaitDesktopDesc": {
+ "message": "Please confirm using biometrics in the Bitwarden Desktop application to enable biometrics for browser."
+ },
+ "lockWithMasterPassOnRestart": {
+ "message": "ബ്രൌസർ പുനരാരംഭത്തിൽ പ്രാഥമിക പാസ്വേഡ് ഉപയോഗിച്ച് ലോക്ക് ചെയ്യുക"
+ },
+ "selectOneCollection": {
+ "message": "നിങ്ങൾ ഒരു കളക്ഷനെങ്കിലും തിരഞ്ഞെടുക്കണം."
+ },
+ "cloneItem": {
+ "message": "ഇനം ക്ലോൺ ചെയ്യുക"
+ },
+ "clone": {
+ "message": "ക്ലോൺ"
+ },
+ "passwordGeneratorPolicyInEffect": {
+ "message": "ഒന്നോ അതിലധികമോ സംഘടന നയങ്ങൾ നിങ്ങളുടെ പാസ്സ്വേഡ് സൃഷ്ടാവിൻ്റെ ക്രമീകരണങ്ങളെ ബാധിക്കുന്നു"
+ },
+ "vaultTimeoutAction": {
+ "message": "വാൾട് ടൈം ഔട്ട് ആക്ഷൻ"
+ },
+ "lock": {
+ "message": "പൂട്ടുക",
+ "description": "Verb form: to make secure or inaccesible by"
+ },
+ "trash": {
+ "message": "ട്രാഷ്",
+ "description": "Noun: a special folder to hold deleted items"
+ },
+ "searchTrash": {
+ "message": "ട്രാഷ് തിരയുന്നു"
+ },
+ "permanentlyDeleteItem": {
+ "message": "ഇനം ശാശ്വതമായി ഇല്ലാതാക്കുക"
+ },
+ "permanentlyDeleteItemConfirmation": {
+ "message": "ഈ ഇനം ശാശ്വതമായി ഇല്ലാതാക്കാൻ നിങ്ങൾ ആഗ്രഹിക്കുന്നുണ്ടോ?"
+ },
+ "permanentlyDeletedItem": {
+ "message": "ശാശ്വതമായി ഇല്ലാതാക്കിയ ഇനം"
+ },
+ "restoreItem": {
+ "message": "ഇനം വീണ്ടെടുക്കുക "
+ },
+ "restoreItemConfirmation": {
+ "message": "ഈ ഇനം വീണ്ടെടുക്കണമെന്ന് ഉറപ്പാണോ?"
+ },
+ "restoredItem": {
+ "message": "വീണ്ടെടുത്ത ഇനം"
+ },
+ "vaultTimeoutLogOutConfirmation": {
+ "message": "ലോഗൗട്ട് ചെയ്യുകയാണെങ്കിൽ തങ്ങളുടെ വാൾട്ടിലേക്കുള്ള എല്ലാ ആക്സസും നീക്കംചെയ്യും. കാലയളവിനുശേഷം ഓൺലൈൻ ഓതന്റിക്കേറ്റർ ആവശ്യമാണ്. ഈ ക്രമീകരണം ഉപയോഗിക്കാൻ നിങ്ങൾ ആഗ്രഹിക്കുന്നുണ്ടോ?"
+ },
+ "vaultTimeoutLogOutConfirmationTitle": {
+ "message": "ടൈംഔട് ആക്ഷൻ സ്ഥിരീകരണം"
+ },
+ "autoFillAndSave": {
+ "message": "യാന്ത്രികമായി പൂരിപ്പിച്ച് സംരക്ഷിക്കുക"
+ },
+ "autoFillSuccessAndSavedUri": {
+ "message": "യാന്ത്രികമായി പൂരിപ്പിച്ച ഇനവും സംരക്ഷിച്ച URI"
+ },
+ "autoFillSuccess": {
+ "message": "യാന്ത്രികമായി പൂരിപ്പിച്ച ഇനം"
+ },
+ "setMasterPassword": {
+ "message": "പ്രാഥമിക പാസ്വേഡ് സജ്ജമാക്കുക"
+ },
+ "masterPasswordPolicyInEffect": {
+ "message": "ഒന്നോ അതിലധികമോ ഓർഗനൈസേഷൻ നയങ്ങൾക്ക് ഇനിപ്പറയുന്ന ആവശ്യകതകൾ നിറവേറ്റുന്നതിന് നിങ്ങളുടെ മാസ്റ്റർ പാസ്വേഡ് ആവശ്യമാണ്:"
+ },
+ "policyInEffectMinComplexity": {
+ "message": "സങ്കീർണ്ണതയുടെ കുറഞ്ഞ സ്കോർ$SCORE$",
+ "placeholders": {
+ "score": {
+ "content": "$1",
+ "example": "4"
+ }
+ }
+ },
+ "policyInEffectMinLength": {
+ "message": "കുറഞ്ഞ ദൈർഘ്യം $LENGTH$",
+ "placeholders": {
+ "length": {
+ "content": "$1",
+ "example": "14"
+ }
+ }
+ },
+ "policyInEffectUppercase": {
+ "message": "ഒന്നോ അതിലധികമോ വലിയക്ഷരങ്ങൾ അടങ്ങിയിരിക്കുന്ന"
+ },
+ "policyInEffectLowercase": {
+ "message": "ഒന്നോ അതിലധികമോ ചെറിയക്ഷരങ്ങൾ അടങ്ങിയിരിക്കുന്ന"
+ },
+ "policyInEffectNumbers": {
+ "message": "ഒന്നോ അതിലധികമോ അക്കങ്ങൾ അടങ്ങിയിരിക്കുന്ന"
+ },
+ "policyInEffectSpecial": {
+ "message": "ഇനിപ്പറയുന്ന ഒന്നോ അതിലധികമോ പ്രത്യേക പ്രതീകങ്ങൾ അടങ്ങിയിരിക്കണം:$CHARS$",
+ "placeholders": {
+ "chars": {
+ "content": "$1",
+ "example": "!@#$%^&*"
+ }
+ }
+ },
+ "masterPasswordPolicyRequirementsNotMet": {
+ "message": "നിങ്ങളുടെ പുതിയ മാസ്റ്റർ പാസ്വേഡ് നയ ആവശ്യകതകൾ നിറവേറ്റുന്നില്ല."
+ },
+ "acceptPolicies": {
+ "message": "ഈ ബോക്സ് ചെക്കുചെയ്യുന്നതിലൂടെ നിങ്ങൾ ഇനിപ്പറയുന്നവ അംഗീകരിക്കുന്നു:"
+ },
+ "acceptPoliciesError": {
+ "message": "സേവന നിബന്ധനകളും സ്വകാര്യതാ നയവും അംഗീകരിച്ചിട്ടില്ല."
+ },
+ "termsOfService": {
+ "message": "സേവന നിബന്ധനകൾ"
+ },
+ "privacyPolicy": {
+ "message": "സ്വകാര്യതാനയം"
+ },
+ "hintEqualsPassword": {
+ "message": "Your password hint cannot be the same as your password."
+ },
+ "ok": {
+ "message": "Ok"
+ },
+ "desktopSyncVerificationTitle": {
+ "message": "Desktop sync verification"
+ },
+ "desktopIntegrationVerificationText": {
+ "message": "Please verify that the desktop application shows this fingerprint: "
+ },
+ "desktopIntegrationDisabledTitle": {
+ "message": "Browser integration is not enabled"
+ },
+ "desktopIntegrationDisabledDesc": {
+ "message": "Browser integration is not enabled in the Bitwarden Desktop application. Please enable it in the settings within the desktop application."
+ },
+ "startDesktopTitle": {
+ "message": "Start the Bitwarden Desktop application"
+ },
+ "startDesktopDesc": {
+ "message": "The Bitwarden Desktop application needs to be started before this function can be used."
+ },
+ "errorEnableBiometricTitle": {
+ "message": "Unable to enable biometrics"
+ },
+ "errorEnableBiometricDesc": {
+ "message": "Action was canceled by the desktop application"
+ },
+ "nativeMessagingInvalidEncryptionDesc": {
+ "message": "Desktop application invalidated the secure communication channel. Please retry this operation"
+ },
+ "nativeMessagingInvalidEncryptionTitle": {
+ "message": "Desktop communication interrupted"
+ },
+ "nativeMessagingWrongUserDesc": {
+ "message": "The desktop application is logged into a different account. Please ensure both applications are logged into the same account."
+ },
+ "nativeMessagingWrongUserTitle": {
+ "message": "Account missmatch"
+ },
+ "biometricsNotEnabledTitle": {
+ "message": "Biometrics not enabled"
+ },
+ "biometricsNotEnabledDesc": {
+ "message": "Browser biometrics requires desktop biometric to be enabled in the settings first."
+ },
+ "biometricsNotSupportedTitle": {
+ "message": "Biometrics not supported"
+ },
+ "biometricsNotSupportedDesc": {
+ "message": "Browser biometrics is not supported on this device."
+ },
+ "nativeMessaginPermissionErrorTitle": {
+ "message": "Permission not provided"
+ },
+ "nativeMessaginPermissionErrorDesc": {
+ "message": "Without permission to communicate with the Bitwarden Desktop Application we cannot provide biometrics in the browser extension. Please try again."
+ },
+ "nativeMessaginPermissionSidebarTitle": {
+ "message": "Permission request error"
+ },
+ "nativeMessaginPermissionSidebarDesc": {
+ "message": "This action cannot be done in the sidebar, please retry the action in the popup or popout."
+ },
+ "personalOwnershipSubmitError": {
+ "message": "Due to an Enterprise Policy, you are restricted from saving items to your personal vault. Change the Ownership option to an organization and choose from available Collections."
+ },
+ "personalOwnershipPolicyInEffect": {
+ "message": "An organization policy is affecting your ownership options."
+ },
+ "excludedDomains": {
+ "message": "Excluded Domains"
+ },
+ "excludedDomainsDesc": {
+ "message": "Bitwarden will not ask to save login details for these domains. You must refresh the page for changes to take effect."
+ },
+ "excludedDomainsInvalidDomain": {
+ "message": "$DOMAIN$ is not a valid domain",
+ "placeholders": {
+ "domain": {
+ "content": "$1",
+ "example": "googlecom"
+ }
+ }
+ },
+ "send": {
+ "message": "Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "searchSends": {
+ "message": "Search Sends",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "addSend": {
+ "message": "Add Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTypeText": {
+ "message": "Text"
+ },
+ "sendTypeFile": {
+ "message": "File"
+ },
+ "allSends": {
+ "message": "All Sends",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "maxAccessCountReached": {
+ "message": "Max access count reached"
+ },
+ "expired": {
+ "message": "Expired"
+ },
+ "pendingDeletion": {
+ "message": "Pending deletion"
+ },
+ "passwordProtected": {
+ "message": "Password protected"
+ },
+ "copySendLink": {
+ "message": "Copy Send link",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "removePassword": {
+ "message": "Remove Password"
+ },
+ "delete": {
+ "message": "Delete"
+ },
+ "removedPassword": {
+ "message": "Removed Password"
+ },
+ "deletedSend": {
+ "message": "Deleted Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendLink": {
+ "message": "Send link",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "disabled": {
+ "message": "Disabled"
+ },
+ "removePasswordConfirmation": {
+ "message": "Are you sure you want to remove the password?"
+ },
+ "deleteSend": {
+ "message": "Delete Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "deleteSendConfirmation": {
+ "message": "Are you sure you want to delete this Send?",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "editSend": {
+ "message": "Edit Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTypeHeader": {
+ "message": "What type of Send is this?",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendNameDesc": {
+ "message": "A friendly name to describe this Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendFileDesc": {
+ "message": "The file you want to send."
+ },
+ "deletionDate": {
+ "message": "Deletion Date"
+ },
+ "deletionDateDesc": {
+ "message": "The Send will be permanently deleted on the specified date and time.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "expirationDate": {
+ "message": "Expiration Date"
+ },
+ "expirationDateDesc": {
+ "message": "If set, access to this Send will expire on the specified date and time.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "oneDay": {
+ "message": "1 day"
+ },
+ "days": {
+ "message": "$DAYS$ days",
+ "placeholders": {
+ "days": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "custom": {
+ "message": "Custom"
+ },
+ "maximumAccessCount": {
+ "message": "Maximum Access Count"
+ },
+ "maximumAccessCountDesc": {
+ "message": "If set, users will no longer be able to access this Send once the maximum access count is reached.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendPasswordDesc": {
+ "message": "Optionally require a password for users to access this Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendNotesDesc": {
+ "message": "Private notes about this Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendDisableDesc": {
+ "message": "Disable this Send so that no one can access it.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendShareDesc": {
+ "message": "Copy this Send's link to clipboard upon save.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTextDesc": {
+ "message": "The text you want to send."
+ },
+ "sendHideText": {
+ "message": "Hide this Send's text by default.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "currentAccessCount": {
+ "message": "Current Access Count"
+ },
+ "createSend": {
+ "message": "Create New Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "newPassword": {
+ "message": "New Password"
+ },
+ "sendDisabled": {
+ "message": "Send Disabled",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendDisabledWarning": {
+ "message": "Due to an enterprise policy, you are only able to delete an existing Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "createdSend": {
+ "message": "Created Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "editedSend": {
+ "message": "Edited Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendLinuxChromiumFileWarning": {
+ "message": "In order to choose a file, open the extension in the sidebar (if possible) or pop out to a new window by clicking this banner."
+ },
+ "sendFirefoxFileWarning": {
+ "message": "In order to choose a file using Firefox, open the extension in the sidebar or pop out to a new window by clicking this banner."
+ },
+ "sendSafariFileWarning": {
+ "message": "In order to choose a file using Safari, pop out to a new window by clicking this banner."
+ },
+ "sendFileCalloutHeader": {
+ "message": "Before you start"
+ },
+ "sendFirefoxCustomDatePopoutMessage1": {
+ "message": "To use a calendar style date picker",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read '**To use a calendar style date picker ** click here to pop out your window.'"
+ },
+ "sendFirefoxCustomDatePopoutMessage2": {
+ "message": "click here",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker **click here** to pop out your window.'"
+ },
+ "sendFirefoxCustomDatePopoutMessage3": {
+ "message": "to pop out your window.",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker click here **to pop out your window.**'"
+ },
+ "expirationDateIsInvalid": {
+ "message": "The expiration date provided is not valid."
+ },
+ "deletionDateIsInvalid": {
+ "message": "The deletion date provided is not valid."
+ },
+ "expirationDateAndTimeRequired": {
+ "message": "An expiration date and time are required."
+ },
+ "deletionDateAndTimeRequired": {
+ "message": "A deletion date and time are required."
+ },
+ "dateParsingError": {
+ "message": "There was an error saving your deletion and expiration dates."
+ },
+ "hideEmail": {
+ "message": "Hide my email address from recipients."
+ },
+ "sendOptionsPolicyInEffect": {
+ "message": "One or more organization policies are affecting your Send options."
+ },
+ "passwordPrompt": {
+ "message": "Master password re-prompt"
+ },
+ "passwordConfirmation": {
+ "message": "Master password confirmation"
+ },
+ "passwordConfirmationDesc": {
+ "message": "This action is protected. To continue, please re-enter your master password to verify your identity."
+ },
+ "emailVerificationRequired": {
+ "message": "Email Verification Required"
+ },
+ "emailVerificationRequiredDesc": {
+ "message": "You must verify your email to use this feature. You can verify your email in the web vault."
+ },
+ "updatedMasterPassword": {
+ "message": "Updated Master Password"
+ },
+ "updateMasterPassword": {
+ "message": "Update Master Password"
+ },
+ "updateMasterPasswordWarning": {
+ "message": "Your Master Password was recently changed by an administrator in your organization. In order to access the vault, you must update it now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour."
+ },
+ "resetPasswordPolicyAutoEnroll": {
+ "message": "Automatic Enrollment"
+ },
+ "resetPasswordAutoEnrollInviteWarning": {
+ "message": "This organization has an enterprise policy that will automatically enroll you in password reset. Enrollment will allow organization administrators to change your master password."
+ },
+ "selectFolder": {
+ "message": "Select folder..."
+ },
+ "ssoCompleteRegistration": {
+ "message": "In order to complete logging in with SSO, please set a master password to access and protect your vault."
+ },
+ "hours": {
+ "message": "Hours"
+ },
+ "minutes": {
+ "message": "Minutes"
+ },
+ "vaultTimeoutPolicyInEffect": {
+ "message": "Your organization policies are affecting your vault timeout. Maximum allowed Vault Timeout is $HOURS$ hour(s) and $MINUTES$ minute(s)",
+ "placeholders": {
+ "hours": {
+ "content": "$1",
+ "example": "5"
+ },
+ "minutes": {
+ "content": "$2",
+ "example": "5"
+ }
+ }
+ },
+ "vaultTimeoutToLarge": {
+ "message": "Your vault timeout exceeds the restrictions set by your organization."
+ },
+ "vaultExportDisabled": {
+ "message": "Vault Export Disabled"
+ },
+ "personalVaultExportPolicyInEffect": {
+ "message": "One or more organization policies prevents you from exporting your personal vault."
+ },
+ "copyCustomFieldNameInvalidElement": {
+ "message": "Unable to identify a valid form element. Try inspecting the HTML instead."
+ },
+ "copyCustomFieldNameNotUnique": {
+ "message": "No unique identifier found."
+ }
+}
diff --git a/src/iOS.Safari/Resources/_locales/nb/messages.json b/src/iOS.Safari/Resources/_locales/nb/messages.json
new file mode 100644
index 000000000..d364fbd59
--- /dev/null
+++ b/src/iOS.Safari/Resources/_locales/nb/messages.json
@@ -0,0 +1,1817 @@
+{
+ "appName": {
+ "message": "Bitwarden"
+ },
+ "extName": {
+ "message": "Bitwarden — Fri passordbehandling",
+ "description": "Extension name, MUST be less than 40 characters (Safari restriction)"
+ },
+ "extDesc": {
+ "message": "Bitwarden er en sikker og fri passordbehandler for alle dine PCer og mobiler.",
+ "description": "Extension description"
+ },
+ "loginOrCreateNewAccount": {
+ "message": "Logg på eller opprett en ny konto for å få tilgang til ditt sikre hvelv."
+ },
+ "createAccount": {
+ "message": "Opprett en konto"
+ },
+ "login": {
+ "message": "Logg inn"
+ },
+ "enterpriseSingleSignOn": {
+ "message": "Bedriftsinnlogging (SSO)"
+ },
+ "cancel": {
+ "message": "Lukk"
+ },
+ "close": {
+ "message": "Lukk"
+ },
+ "submit": {
+ "message": "Send inn"
+ },
+ "emailAddress": {
+ "message": "E-postadresse"
+ },
+ "masterPass": {
+ "message": "Hovedpassord"
+ },
+ "masterPassDesc": {
+ "message": "Superpassordet er passordet du bruker for å få tilgang til hvelvet ditt. Det er veldig viktig at du aldri glemmer ditt superpassord. Det er ingen måter å få tilbake passordet på dersom du noensinne skulle klare å glemme det."
+ },
+ "masterPassHintDesc": {
+ "message": "Et hint for superpassordet kan hjelpe deg med å huske på passordet dersom du skulle glemme det."
+ },
+ "reTypeMasterPass": {
+ "message": "Skriv inn hovedpassordet på nytt"
+ },
+ "masterPassHint": {
+ "message": "Et hint for hovedpassordet (valgfritt)"
+ },
+ "tab": {
+ "message": "Fane"
+ },
+ "myVault": {
+ "message": "Mitt hvelv"
+ },
+ "tools": {
+ "message": "Verktøy"
+ },
+ "settings": {
+ "message": "Innstillinger"
+ },
+ "currentTab": {
+ "message": "Nåværende fane"
+ },
+ "copyPassword": {
+ "message": "Kopier passordet"
+ },
+ "copyNote": {
+ "message": "Kopier notatet"
+ },
+ "copyUri": {
+ "message": "Kopier URIen"
+ },
+ "copyUsername": {
+ "message": "Kopier brukernavnet"
+ },
+ "copyNumber": {
+ "message": "Kopier nummeret"
+ },
+ "copySecurityCode": {
+ "message": "Kopier sikkerhetskoden"
+ },
+ "autoFill": {
+ "message": "Auto-utfylling"
+ },
+ "generatePasswordCopied": {
+ "message": "Generer et passord (kopiert)"
+ },
+ "copyElementIdentifier": {
+ "message": "Copy Custom Field Name"
+ },
+ "noMatchingLogins": {
+ "message": "Ingen samsvarende innlogginger."
+ },
+ "vaultLocked": {
+ "message": "Hvelvet er låst."
+ },
+ "vaultLoggedOut": {
+ "message": "Hvelvet er logget ut."
+ },
+ "autoFillInfo": {
+ "message": "Det er ingen tilgjengelige innlogginger å auto-utfylle med i den nåværende nettleserfanen."
+ },
+ "addLogin": {
+ "message": "Legg til en innlogging"
+ },
+ "addItem": {
+ "message": "Legg til en gjenstand"
+ },
+ "passwordHint": {
+ "message": "Passordhint"
+ },
+ "enterEmailToGetHint": {
+ "message": "Skriv inn din kontos E-postadresse for å motta hintet til ditt superpassord."
+ },
+ "getMasterPasswordHint": {
+ "message": "Få et hint om superpassordet"
+ },
+ "continue": {
+ "message": "Fortsett"
+ },
+ "verificationCode": {
+ "message": "Verifiseringskode"
+ },
+ "account": {
+ "message": "Konto"
+ },
+ "changeMasterPassword": {
+ "message": "Endre hovedpassordet"
+ },
+ "fingerprintPhrase": {
+ "message": "Fingeravtrykksfrase",
+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
+ },
+ "yourAccountsFingerprint": {
+ "message": "Din kontos fingeravtrykksfrase",
+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
+ },
+ "twoStepLogin": {
+ "message": "2-trinnsinnlogging"
+ },
+ "logOut": {
+ "message": "Logg ut"
+ },
+ "about": {
+ "message": "Om"
+ },
+ "version": {
+ "message": "Versjon"
+ },
+ "save": {
+ "message": "Lagre"
+ },
+ "move": {
+ "message": "Flytt"
+ },
+ "addFolder": {
+ "message": "Legg til en mappe"
+ },
+ "name": {
+ "message": "Navn"
+ },
+ "editFolder": {
+ "message": "Rediger mappen"
+ },
+ "deleteFolder": {
+ "message": "Slett mappen"
+ },
+ "folders": {
+ "message": "Mapper"
+ },
+ "noFolders": {
+ "message": "Det er ingen mapper å liste opp."
+ },
+ "helpFeedback": {
+ "message": "Hjelp og tilbakemelding"
+ },
+ "sync": {
+ "message": "Synkroniser"
+ },
+ "syncVaultNow": {
+ "message": "Synkroniser hvelvet nå"
+ },
+ "lastSync": {
+ "message": "Forrige synkronisering:"
+ },
+ "passGen": {
+ "message": "Passordgenerator"
+ },
+ "generator": {
+ "message": "Generator",
+ "description": "Short for 'Password Generator'."
+ },
+ "passGenInfo": {
+ "message": "Generer automatisk sterke og unike passord for dine innlogginger."
+ },
+ "bitWebVault": {
+ "message": "Bitwarden netthvelv"
+ },
+ "importItems": {
+ "message": "Importer gjenstander"
+ },
+ "select": {
+ "message": "Velg"
+ },
+ "generatePassword": {
+ "message": "Generer et passord"
+ },
+ "regeneratePassword": {
+ "message": "Omgenerer et passord"
+ },
+ "options": {
+ "message": "Alternativer"
+ },
+ "length": {
+ "message": "Lengde"
+ },
+ "numWords": {
+ "message": "Antall ord"
+ },
+ "wordSeparator": {
+ "message": "Ordadskiller"
+ },
+ "capitalize": {
+ "message": "Stor forbokstav",
+ "description": "Make the first letter of a work uppercase."
+ },
+ "includeNumber": {
+ "message": "Inkluder nummer"
+ },
+ "minNumbers": {
+ "message": "Minste antall numre"
+ },
+ "minSpecial": {
+ "message": "Minste antall spesialtegn"
+ },
+ "avoidAmbChar": {
+ "message": "Unngå tvetydige tegn"
+ },
+ "searchVault": {
+ "message": "Søk i hvelvet"
+ },
+ "edit": {
+ "message": "Rediger"
+ },
+ "view": {
+ "message": "Vis"
+ },
+ "noItemsInList": {
+ "message": "Det er ingen gjenstander å liste opp."
+ },
+ "itemInformation": {
+ "message": "Gjenstandsinformasjon"
+ },
+ "username": {
+ "message": "Brukernavn"
+ },
+ "password": {
+ "message": "Passord"
+ },
+ "passphrase": {
+ "message": "Passfrase"
+ },
+ "favorite": {
+ "message": "Favoritt"
+ },
+ "notes": {
+ "message": "Notater"
+ },
+ "note": {
+ "message": "Notat"
+ },
+ "editItem": {
+ "message": "Rediger objektet"
+ },
+ "folder": {
+ "message": "Mappe"
+ },
+ "deleteItem": {
+ "message": "Slett objektet"
+ },
+ "viewItem": {
+ "message": "Vis objektet"
+ },
+ "launch": {
+ "message": "Åpne"
+ },
+ "website": {
+ "message": "Nettsted"
+ },
+ "toggleVisibility": {
+ "message": "Juster synlighet"
+ },
+ "manage": {
+ "message": "Behandle"
+ },
+ "other": {
+ "message": "Annet"
+ },
+ "rateExtension": {
+ "message": "Gi denne utvidelsen en vurdering"
+ },
+ "rateExtensionDesc": {
+ "message": "Tenk gjerne på om du vil skrive en anmeldelse om oss!"
+ },
+ "browserNotSupportClipboard": {
+ "message": "Nettleseren din støtter ikke kopiering til utklippstavlen på noe enkelt vis. Prøv å kopiere det manuelt i stedet."
+ },
+ "verifyMasterPassword": {
+ "message": "Verifiser hovedpassordet"
+ },
+ "yourVaultIsLocked": {
+ "message": "Hvelvet ditt er låst. Kontroller hovedpassordet ditt for å fortsette."
+ },
+ "unlock": {
+ "message": "Lås opp"
+ },
+ "loggedInAsOn": {
+ "message": "Logget inn som $EMAIL$ på $HOSTNAME$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "name@example.com"
+ },
+ "hostname": {
+ "content": "$2",
+ "example": "bitwarden.com"
+ }
+ }
+ },
+ "invalidMasterPassword": {
+ "message": "Ugyldig superpassord"
+ },
+ "vaultTimeout": {
+ "message": "Tidsavbrudd i hvelvet"
+ },
+ "lockNow": {
+ "message": "Lås nå"
+ },
+ "immediately": {
+ "message": "Umiddelbart"
+ },
+ "tenSeconds": {
+ "message": "10 sekunder"
+ },
+ "twentySeconds": {
+ "message": "20 sekunder"
+ },
+ "thirtySeconds": {
+ "message": "30 sekunder"
+ },
+ "oneMinute": {
+ "message": "1 minutt"
+ },
+ "twoMinutes": {
+ "message": "2 minutter"
+ },
+ "fiveMinutes": {
+ "message": "5 minutter"
+ },
+ "fifteenMinutes": {
+ "message": "15 minutter"
+ },
+ "thirtyMinutes": {
+ "message": "30 minutter"
+ },
+ "oneHour": {
+ "message": "1 time"
+ },
+ "fourHours": {
+ "message": "4 timer"
+ },
+ "onLocked": {
+ "message": "Ved maskinlåsing"
+ },
+ "onRestart": {
+ "message": "Ved nettleseromstart"
+ },
+ "never": {
+ "message": "Aldri"
+ },
+ "security": {
+ "message": "Sikkerhet"
+ },
+ "errorOccurred": {
+ "message": "En feil har oppstått"
+ },
+ "emailRequired": {
+ "message": "E-postadressen er påkrevd."
+ },
+ "invalidEmail": {
+ "message": "Ugyldig E-postadresse."
+ },
+ "masterPassRequired": {
+ "message": "Superpassordet er påkrevd."
+ },
+ "masterPassLength": {
+ "message": "Superpassordet må være ≥8 tegn lang."
+ },
+ "masterPassDoesntMatch": {
+ "message": "Superpassord-bekreftelsen er ikke samsvarende."
+ },
+ "newAccountCreated": {
+ "message": "Din nye konto har blitt opprettet! Du kan nå logge på."
+ },
+ "masterPassSent": {
+ "message": "Vi har sendt deg en E-post med hintet til superpassordet."
+ },
+ "verificationCodeRequired": {
+ "message": "En verifiseringskode er påkrevd."
+ },
+ "valueCopied": {
+ "message": "$VALUE$ er kopiert",
+ "description": "Value has been copied to the clipboard.",
+ "placeholders": {
+ "value": {
+ "content": "$1",
+ "example": "Password"
+ }
+ }
+ },
+ "autofillError": {
+ "message": "Klarte ikke å auto-utfylle den valgte gjenstanden på denne siden. Kopier og lim inn informasjonen i stedet."
+ },
+ "loggedOut": {
+ "message": "Logget av"
+ },
+ "loginExpired": {
+ "message": "Din innloggingsøkt har utløpt."
+ },
+ "logOutConfirmation": {
+ "message": "Er du sikker på at du vil logge av?"
+ },
+ "yes": {
+ "message": "Ja"
+ },
+ "no": {
+ "message": "Nei"
+ },
+ "unexpectedError": {
+ "message": "En uventet feil har oppstått."
+ },
+ "nameRequired": {
+ "message": "Et navn er påkrevd."
+ },
+ "addedFolder": {
+ "message": "La til en mappe"
+ },
+ "changeMasterPass": {
+ "message": "Endre hovedpassordet"
+ },
+ "changeMasterPasswordConfirmation": {
+ "message": "Du kan endre superpassordet ditt på bitwarden.net-netthvelvet. Vil du besøke det nettstedet nå?"
+ },
+ "twoStepLoginConfirmation": {
+ "message": "2-trinnsinnlogging gjør kontoen din mer sikker, ved å kreve at du verifiserer din innlogging med en annen enhet, f.eks. en autentiseringsapp, SMS, E-post, telefonsamtale, eller sikkerhetsnøkkel. 2-trinnsinnlogging kan aktiveres på bitwarden.com-netthvelvet. Vil du besøke den nettsiden nå?"
+ },
+ "editedFolder": {
+ "message": "Redigerte mappen"
+ },
+ "deleteFolderConfirmation": {
+ "message": "Er du sikker på at du vil slette denne mappen?"
+ },
+ "deletedFolder": {
+ "message": "Slettet mappen"
+ },
+ "gettingStartedTutorial": {
+ "message": "Opplæring om å sette i gang"
+ },
+ "gettingStartedTutorialVideo": {
+ "message": "Se vår opplæringsvideo for å lære hvordan man får mest mulig ut av nettleserutvidelsen."
+ },
+ "syncingComplete": {
+ "message": "Synkronisering fullført"
+ },
+ "syncingFailed": {
+ "message": "Synkronisering mislyktes"
+ },
+ "passwordCopied": {
+ "message": "Passordet er kopiert"
+ },
+ "uri": {
+ "message": "URI"
+ },
+ "uriPosition": {
+ "message": "URI $POSITION$",
+ "description": "A listing of URIs. Ex: URI 1, URI 2, URI 3, etc.",
+ "placeholders": {
+ "position": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "newUri": {
+ "message": "Ny URI"
+ },
+ "addedItem": {
+ "message": "La til gjenstanden"
+ },
+ "editedItem": {
+ "message": "Redigerte gjenstanden"
+ },
+ "deleteItemConfirmation": {
+ "message": "Er du sikker på at du vil slette dette objektet?"
+ },
+ "deletedItem": {
+ "message": "Slettet objektet"
+ },
+ "overwritePassword": {
+ "message": "Overskriv passordet"
+ },
+ "overwritePasswordConfirmation": {
+ "message": "Er du sikker på at du vil overskrive det nåværende passordet?"
+ },
+ "searchFolder": {
+ "message": "Søk i mappe"
+ },
+ "searchCollection": {
+ "message": "Søk i samling"
+ },
+ "searchType": {
+ "message": "Søketype"
+ },
+ "noneFolder": {
+ "message": "Ingen mappe",
+ "description": "This is the folder for uncategorized items"
+ },
+ "disableAddLoginNotification": {
+ "message": "Deaktiver «Legg til innlogging»-beskjedene"
+ },
+ "addLoginNotificationDesc": {
+ "message": "\"Legg til innlogging\"-beskjeden ber deg automatisk om å lagre nye innlogginger til hvelvet ditt hver gang du logger på dem for første gang."
+ },
+ "dontShowCardsCurrentTab": {
+ "message": "Ikke vis kort på fanesiden"
+ },
+ "dontShowCardsCurrentTabDesc": {
+ "message": "Kortene fra hvelvet ditt er listet opp på «Nåværende fane»-siden for enkel tilgang til autoutfylling."
+ },
+ "dontShowIdentitiesCurrentTab": {
+ "message": "Ikke vis identiteter på fanesiden"
+ },
+ "dontShowIdentitiesCurrentTabDesc": {
+ "message": "Identitetene fra hvelvet ditt er listet opp på «Nåværende fane»-siden for enkel autoutfyllingstilgang."
+ },
+ "clearClipboard": {
+ "message": "Tøm utklippstavlen",
+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
+ },
+ "clearClipboardDesc": {
+ "message": "Slett automatisk kopierte verdier fra utklippstavlen.",
+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
+ },
+ "notificationAddDesc": {
+ "message": "Skal Bitwarden huske på dette passordet for deg?"
+ },
+ "notificationAddSave": {
+ "message": "Ja, lagre nå"
+ },
+ "notificationNeverSave": {
+ "message": "Aldri for dette nettstedet"
+ },
+ "disableChangedPasswordNotification": {
+ "message": "Deaktiver beskjeder om passordendringer"
+ },
+ "disableChangedPasswordNotificationDesc": {
+ "message": "«Endret passord»-beskjeden spør deg automatisk om å oppdatere et innloggingspassord i hvelvet ditt, dersom den oppdager at du har endret det på et nettsted."
+ },
+ "notificationChangeDesc": {
+ "message": "Vil du oppdatere dette passordet i Bitwarden?"
+ },
+ "notificationChangeSave": {
+ "message": "Ja, oppdater nå"
+ },
+ "disableContextMenuItem": {
+ "message": "Deaktiver sammenhengsmeny-innstillinger"
+ },
+ "disableContextMenuItemDesc": {
+ "message": "Sammenhengsmeny-alternativer sørger for rask tilgang til passordgenerering og innlogginger for nettstedet i din nåværende fane."
+ },
+ "defaultUriMatchDetection": {
+ "message": "Standard URI-samsvarsgjenkjenning",
+ "description": "Default URI match detection for auto-fill."
+ },
+ "defaultUriMatchDetectionDesc": {
+ "message": "Velg standardmåten for å håndtere URI-samsvarsgjenkjenning for pålogginger ved f. eks. auto-utfylling."
+ },
+ "theme": {
+ "message": "Tema"
+ },
+ "themeDesc": {
+ "message": "Endre appens fargetema."
+ },
+ "dark": {
+ "message": "Mørkt",
+ "description": "Dark color"
+ },
+ "light": {
+ "message": "Lyst",
+ "description": "Light color"
+ },
+ "solarizedDark": {
+ "message": "Solarisert mørk",
+ "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated."
+ },
+ "exportVault": {
+ "message": "Eksporter hvelvet"
+ },
+ "fileFormat": {
+ "message": "Filformat"
+ },
+ "warning": {
+ "message": "ADVARSEL",
+ "description": "WARNING (should stay in capitalized letters if the language permits)"
+ },
+ "confirmVaultExport": {
+ "message": "Bekreft eksport av hvelvet"
+ },
+ "exportWarningDesc": {
+ "message": "Eksporten inneholder dine hvelvdataer i et ukryptert format. Du burde ikke lagre eller sende den eksporterte filen over usikre tjenester (f.eks. E-post). Slett det umiddelbart etter at du er ferdig med å bruke dem."
+ },
+ "encExportKeyWarningDesc": {
+ "message": "Denne eksporten krypterer dataene dine ved hjelp av kontoen din sin krypteringsnøkkel. Hvis du noen gang endrer krypteringsnøkkelen til kontoen din, bør du eksportere dataene igjen, ettersom du da ikke vil kunne dekryptere denne eksportfilen."
+ },
+ "encExportAccountWarningDesc": {
+ "message": "Kontokrypteringsnøkler er unike for hver Bitwarden sin brukerkonto, og du kan ikke importere en kryptert eksport til en annen konto."
+ },
+ "exportMasterPassword": {
+ "message": "Skriv inn ditt superpassord for å eksportere dine hvelvdataer."
+ },
+ "shared": {
+ "message": "Delt"
+ },
+ "learnOrg": {
+ "message": "Lær om organisasjoner"
+ },
+ "learnOrgConfirmation": {
+ "message": "Bitwarden lar deg dele dine hvelvgjenstander med andre ved å bruke en organisasjon. Vil du besøke bitwarden.com-nettstedet for å lære mer?"
+ },
+ "moveToOrganization": {
+ "message": "Flytt til organisasjon"
+ },
+ "share": {
+ "message": "Del"
+ },
+ "movedItemToOrg": {
+ "message": "$ITEMNAME$ flyttet til $ORGNAME$",
+ "placeholders": {
+ "itemname": {
+ "content": "$1",
+ "example": "Secret Item"
+ },
+ "orgname": {
+ "content": "$2",
+ "example": "Company Name"
+ }
+ }
+ },
+ "moveToOrgDesc": {
+ "message": "Velg en organisasjon som du ønsker å flytte denne gjenstanden til. Flytting til en organisasjon overfører eierskap til den aktuelle organisasjonen. Du vil ikke lenger være den direkte eieren av denne varen når den er flyttet."
+ },
+ "learnMore": {
+ "message": "Lær mer"
+ },
+ "authenticatorKeyTotp": {
+ "message": "Autentiseringsnøkkel (TOTP)"
+ },
+ "verificationCodeTotp": {
+ "message": "Verifiseringskode (TOTP)"
+ },
+ "copyVerificationCode": {
+ "message": "Kopier verifiseringskoden"
+ },
+ "attachments": {
+ "message": "Vedlegg"
+ },
+ "deleteAttachment": {
+ "message": "Slett vedlegget"
+ },
+ "deleteAttachmentConfirmation": {
+ "message": "Er du sikker på at du vil slette dette vedlegget?"
+ },
+ "deletedAttachment": {
+ "message": "Slettet vedlegget"
+ },
+ "newAttachment": {
+ "message": "Legg til et nytt vedlegg"
+ },
+ "noAttachments": {
+ "message": "Ingen vedlegg."
+ },
+ "attachmentSaved": {
+ "message": "Vedlegget har blitt lagret."
+ },
+ "file": {
+ "message": "Fil"
+ },
+ "selectFile": {
+ "message": "Velg en fil."
+ },
+ "maxFileSize": {
+ "message": "Den maksimale filstørrelsen er 500 MB."
+ },
+ "featureUnavailable": {
+ "message": "Egenskapen er utilgjengelig"
+ },
+ "updateKey": {
+ "message": "Du kan ikke bruke denne funksjonen før du oppdaterer krypteringsnøkkelen din."
+ },
+ "premiumMembership": {
+ "message": "Premium-medlemskap"
+ },
+ "premiumManage": {
+ "message": "Behandle medlemsskapet"
+ },
+ "premiumManageAlert": {
+ "message": "Du kan behandle medlemskapet ditt på bitwarden.net-netthvelvet. Vil du besøke det nettstedet nå?"
+ },
+ "premiumRefresh": {
+ "message": "Oppdater medlemskapet"
+ },
+ "premiumNotCurrentMember": {
+ "message": "Du er ikke for øyeblikket et Premium-medlem."
+ },
+ "premiumSignUpAndGet": {
+ "message": "Skriv deg opp på et Premium-medlemskap og få:"
+ },
+ "ppremiumSignUpStorage": {
+ "message": "1 GB med kryptert fillagring for filvedlegg."
+ },
+ "ppremiumSignUpTwoStep": {
+ "message": "Ytterligere 2-trinnsinnloggingsmuligheter, slik som YubiKey, FIDO U2F, og Duo."
+ },
+ "ppremiumSignUpReports": {
+ "message": "Passordhygiene, kontohelse, og databruddsrapporter som holder hvelvet ditt trygt."
+ },
+ "ppremiumSignUpTotp": {
+ "message": "TOTP-verifiseringskodegenerator (2FA) for innlogginger i ditt hvelv."
+ },
+ "ppremiumSignUpSupport": {
+ "message": "Prioritert kundestøtte."
+ },
+ "ppremiumSignUpFuture": {
+ "message": "Alle fremtidige Premium-egenskaper. Mere er planlagt snart!"
+ },
+ "premiumPurchase": {
+ "message": "Kjøp Premium"
+ },
+ "premiumPurchaseAlert": {
+ "message": "Du kan kjøpe et Premium-medlemskap på bitwarden.net-netthvelvet. Vil du besøke det nettstedet nå?"
+ },
+ "premiumCurrentMember": {
+ "message": "Du er et Premium-medlem!"
+ },
+ "premiumCurrentMemberThanks": {
+ "message": "Takk for at du støtter Bitwarden."
+ },
+ "premiumPrice": {
+ "message": "Og alt det for %price%/år!",
+ "placeholders": {
+ "price": {
+ "content": "$1",
+ "example": "$10"
+ }
+ }
+ },
+ "refreshComplete": {
+ "message": "Oppfriskning fullført"
+ },
+ "disableAutoTotpCopy": {
+ "message": "Deaktiver automatisk TOTP-kopiering"
+ },
+ "disableAutoTotpCopyDesc": {
+ "message": "Dersom din innlogging har en autentiseringsnøkkel knyttet til den, blir TOTP-verifiseringskoden automatisk kopiert til utklippstavlen din når enn du auto-utfyller innloggingen."
+ },
+ "disableAutoBiometricsPrompt": {
+ "message": "Do not prompt for biometrics on launch"
+ },
+ "premiumRequired": {
+ "message": "Premium er påkrevd"
+ },
+ "premiumRequiredDesc": {
+ "message": "Et Premium-medlemskap er påkrevd for å bruke denne funksjonen."
+ },
+ "enterVerificationCodeApp": {
+ "message": "Skriv inn den 6-sifrede verifiseringskoden som står på din autentiseringsapp."
+ },
+ "enterVerificationCodeEmail": {
+ "message": "Skriv inn den 6-sifrede verifiseringskoden som ble sendt til",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "example@gmail.com"
+ }
+ }
+ },
+ "verificationCodeEmailSent": {
+ "message": "En verifiserings-E-post har blitt sendt til $EMAIL$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "example@gmail.com"
+ }
+ }
+ },
+ "rememberMe": {
+ "message": "Husk på meg"
+ },
+ "sendVerificationCodeEmailAgain": {
+ "message": "Send E-posten med verifiseringskoden på nytt"
+ },
+ "useAnotherTwoStepMethod": {
+ "message": "Bruk en annen 2-trinnsinnloggingsmetode"
+ },
+ "insertYubiKey": {
+ "message": "Sett inn din YubiKey i din datamaskins USB-uttak, og så trykk på dens knapp."
+ },
+ "insertU2f": {
+ "message": "Sett din sikkerhetsnøkkel inn i din datamaskins USB-uttak. Dersom den har en knapp, trykk på den."
+ },
+ "webAuthnNewTab": {
+ "message": "For å starte WebAuthn 2FA bekreftelsen. Klikk på knappen nedenfor for å åpne en ny fane og følge instruksene som er gitt i den nye fanen."
+ },
+ "webAuthnNewTabOpen": {
+ "message": "Åpne ny fane"
+ },
+ "webAuthnAuthenticate": {
+ "message": "Autentiser WebAuthn"
+ },
+ "loginUnavailable": {
+ "message": "Innloggingen er utilgjengelig"
+ },
+ "noTwoStepProviders": {
+ "message": "Denne kontoen har aktivert 2-trinnsinnlogging, men ingen av de oppsatte 2-trinnsleverandørene er støttet av denne nettleseren."
+ },
+ "noTwoStepProviders2": {
+ "message": "Vennligst bruk en støttet nettleser (f.eks. Chrome) og/eller legg til flere leverandører som er bedre støttet mellom flere nettlesere (slik som en autentiseringsapp)."
+ },
+ "twoStepOptions": {
+ "message": "Alternativer for 2-trinnsinnlogging"
+ },
+ "recoveryCodeDesc": {
+ "message": "Har du mistet tilgang til alle dine 2-trinnsleverandører? Bruk din gjenopprettingskode til å fjerne alle 2-trinnsleverandører fra din konto."
+ },
+ "recoveryCodeTitle": {
+ "message": "Gjenopprettingskode"
+ },
+ "authenticatorAppTitle": {
+ "message": "Autentiseringsapp"
+ },
+ "authenticatorAppDesc": {
+ "message": "Bruk en autentiseringsapp (f.eks. Authy eller Google Authenticator) for å generere tidsbegrensede verifiseringskoder.",
+ "description": "'Authy' and 'Google Authenticator' are product names and should not be translated."
+ },
+ "yubiKeyTitle": {
+ "message": "YubiKey OTP-sikkerhetsnøkkel"
+ },
+ "yubiKeyDesc": {
+ "message": "Bruk en YubiKey for å få tilgang til kontoen din. Virker med enheter av typene YubiKey 4, 4 Nano, 4C, og NEO."
+ },
+ "duoDesc": {
+ "message": "Verifiser med Duo Security gjennom Duo Mobile-appen, SMS, telefonsamtale, eller en U2F-sikkerhetsnøkkel.",
+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
+ },
+ "duoOrganizationDesc": {
+ "message": "Verifiser med Duo Security for din organisasjon gjennom Duo Mobile-appen, SMS, telefonsamtale, eller en U2F-sikkerhetsnøkkel.",
+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
+ },
+ "webAuthnTitle": {
+ "message": "FIDO2 WebAuthn"
+ },
+ "webAuthnDesc": {
+ "message": "Bruk en hvilken som helst WebAuthn aktivert sikkerhetsnøkkel til å få tilgang til kontoen din."
+ },
+ "emailTitle": {
+ "message": "E-post"
+ },
+ "emailDesc": {
+ "message": "Verifiseringskoder vil bli sendt til deg med E-post."
+ },
+ "selfHostedEnvironment": {
+ "message": "Selvbetjent miljø"
+ },
+ "selfHostedEnvironmentFooter": {
+ "message": "Spesifiser grunn-nettadressen til din selvbetjente Bitwarden-installasjon."
+ },
+ "customEnvironment": {
+ "message": "Tilpasset miljø"
+ },
+ "customEnvironmentFooter": {
+ "message": "For avanserte brukere. Du kan bestemme grunn-nettadressen til hver tjeneste separat."
+ },
+ "baseUrl": {
+ "message": "Tjener-nettadresse"
+ },
+ "apiUrl": {
+ "message": "API-tjenernettadresse"
+ },
+ "webVaultUrl": {
+ "message": "Netthvelvets tjenernettadresse"
+ },
+ "identityUrl": {
+ "message": "Identitetstjenerens nettadresse"
+ },
+ "notificationsUrl": {
+ "message": "Varslingstjenerens URL"
+ },
+ "iconsUrl": {
+ "message": "Ikonenes tjenernettadresse"
+ },
+ "environmentSaved": {
+ "message": "Miljø-nettadressene har blitt lagret."
+ },
+ "enableAutoFillOnPageLoad": {
+ "message": "Aktiver auto-utfylling ved sideinnlastning"
+ },
+ "enableAutoFillOnPageLoadDesc": {
+ "message": "Dersom et innloggingskjema blir oppdaget, utfør automatisk en auto-utfylling når nettstedet lastes inn."
+ },
+ "experimentalFeature": {
+ "message": "Dette er for øyeblikket en eksperimentell egenskap. Bruk det på din egen risiko."
+ },
+ "defaultAutoFillOnPageLoad": {
+ "message": "Standard autofyll innstilling for innloggingselementer"
+ },
+ "defaultAutoFillOnPageLoadDesc": {
+ "message": "Etter aktivering av auto-utfylling på sidelasser, kan du aktivere eller deaktivere funksjonen for individuelle innloggingselementer. Dette er standardinnstillingen for innloggingselementer som ikke er satt opp separat."
+ },
+ "itemAutoFillOnPageLoad": {
+ "message": "Auto-utfyll på sideinnlastning (hvis aktivert i Alternativer)"
+ },
+ "autoFillOnPageLoadUseDefault": {
+ "message": "Bruk standardinnstillinger"
+ },
+ "autoFillOnPageLoadYes": {
+ "message": "Auto-utfyll ved innlasting av side"
+ },
+ "autoFillOnPageLoadNo": {
+ "message": "Ikke fyll automatisk når du laster inn siden"
+ },
+ "commandOpenPopup": {
+ "message": "Åpne hvelv-vindu"
+ },
+ "commandOpenSidebar": {
+ "message": "Åpne hvelv i sidepanelet"
+ },
+ "commandAutofillDesc": {
+ "message": "Auto-utfyll den senest brukte innloggingen til den nåværende nettsiden."
+ },
+ "commandGeneratePasswordDesc": {
+ "message": "Generer og kopier et nytt tilfeldig passord til utklippstavlen."
+ },
+ "commandLockVaultDesc": {
+ "message": "Lås hvelvet"
+ },
+ "privateModeMessage": {
+ "message": "Dessverre er dette vinduet ikke tilgjengelig i privat modus for denne nettleseren."
+ },
+ "customFields": {
+ "message": "Tilpassede felter"
+ },
+ "copyValue": {
+ "message": "Kopier verdien"
+ },
+ "value": {
+ "message": "Verdi"
+ },
+ "newCustomField": {
+ "message": "Nytt egendefinert felt"
+ },
+ "dragToSort": {
+ "message": "Dra for å sortere"
+ },
+ "cfTypeText": {
+ "message": "Tekst"
+ },
+ "cfTypeHidden": {
+ "message": "Skjult"
+ },
+ "cfTypeBoolean": {
+ "message": "Boolsk verdi"
+ },
+ "popup2faCloseMessage": {
+ "message": "Å klikke utenfor dette oppsprettsvinduet for å sjekke E-postinnboksen din for en verifiseringskoden, vil lukke denne oppspretten. Vil du åpne oppsprettet i et nytt vindu sånn at den ikke lukkes?"
+ },
+ "popupU2fCloseMessage": {
+ "message": "Denne nettleseren kan ikke behandle U2F-forespørsler i dette popup-vinduet. Vil du åpne denne popupen i et nytt vindu, slik at du kan logge deg på med U2F?"
+ },
+ "disableFavicon": {
+ "message": "Skru av nettstedsikoner"
+ },
+ "disableFaviconDesc": {
+ "message": "Nettstedsikoner sørger for et gjenkjennelig bilde ved siden av hver innloggingsgjenstand i hvelvet ditt."
+ },
+ "disableBadgeCounter": {
+ "message": "Deaktiver Badge Teller"
+ },
+ "disableBadgeCounterDesc": {
+ "message": "Bade-teller indikerer hvor mange innlogginger du har for den nåværende siden i hvelvet ditt."
+ },
+ "cardholderName": {
+ "message": "Kortholderens navn"
+ },
+ "number": {
+ "message": "Nummer"
+ },
+ "brand": {
+ "message": "Merke"
+ },
+ "expirationMonth": {
+ "message": "Utløpsmåned"
+ },
+ "expirationYear": {
+ "message": "Utløpsår"
+ },
+ "expiration": {
+ "message": "Utløp"
+ },
+ "january": {
+ "message": "Januar"
+ },
+ "february": {
+ "message": "Februar"
+ },
+ "march": {
+ "message": "Mars"
+ },
+ "april": {
+ "message": "April"
+ },
+ "may": {
+ "message": "Mai"
+ },
+ "june": {
+ "message": "Juni"
+ },
+ "july": {
+ "message": "Juli"
+ },
+ "august": {
+ "message": "August"
+ },
+ "september": {
+ "message": "September"
+ },
+ "october": {
+ "message": "Oktober"
+ },
+ "november": {
+ "message": "November"
+ },
+ "december": {
+ "message": "Desember"
+ },
+ "securityCode": {
+ "message": "Sikkerhetskode"
+ },
+ "ex": {
+ "message": "f.eks."
+ },
+ "title": {
+ "message": "Tittel"
+ },
+ "mr": {
+ "message": "Herr"
+ },
+ "mrs": {
+ "message": "Fru"
+ },
+ "ms": {
+ "message": "Frøken"
+ },
+ "dr": {
+ "message": "Dr."
+ },
+ "firstName": {
+ "message": "Fornavn"
+ },
+ "middleName": {
+ "message": "Mellomnavn"
+ },
+ "lastName": {
+ "message": "Etternavn"
+ },
+ "identityName": {
+ "message": "Identitetsnavn"
+ },
+ "company": {
+ "message": "Firma"
+ },
+ "ssn": {
+ "message": "Personnummer"
+ },
+ "passportNumber": {
+ "message": "Passnummer"
+ },
+ "licenseNumber": {
+ "message": "Lisensnummer"
+ },
+ "email": {
+ "message": "E-post"
+ },
+ "phone": {
+ "message": "Telefon"
+ },
+ "address": {
+ "message": "Adresse"
+ },
+ "address1": {
+ "message": "Adresse 1"
+ },
+ "address2": {
+ "message": "Adresse 2"
+ },
+ "address3": {
+ "message": "Adresse 3"
+ },
+ "cityTown": {
+ "message": "By / Tettsted"
+ },
+ "stateProvince": {
+ "message": "Fylke / Region"
+ },
+ "zipPostalCode": {
+ "message": "Postnummer"
+ },
+ "country": {
+ "message": "Land"
+ },
+ "type": {
+ "message": "Type"
+ },
+ "typeLogin": {
+ "message": "Innlogging"
+ },
+ "typeLogins": {
+ "message": "Innlogginger"
+ },
+ "typeSecureNote": {
+ "message": "Sikker notis"
+ },
+ "typeCard": {
+ "message": "Kort"
+ },
+ "typeIdentity": {
+ "message": "Identitet"
+ },
+ "passwordHistory": {
+ "message": "Passordhistorikk"
+ },
+ "back": {
+ "message": "Tilbake"
+ },
+ "collections": {
+ "message": "Samlinger"
+ },
+ "favorites": {
+ "message": "Favoritter"
+ },
+ "popOutNewWindow": {
+ "message": "Vis i et nytt vindu"
+ },
+ "refresh": {
+ "message": "Oppfrisk"
+ },
+ "cards": {
+ "message": "Kort"
+ },
+ "identities": {
+ "message": "Identiteter"
+ },
+ "logins": {
+ "message": "Innlogginger"
+ },
+ "secureNotes": {
+ "message": "Sikre notiser"
+ },
+ "clear": {
+ "message": "Tøm",
+ "description": "To clear something out. example: To clear browser history."
+ },
+ "checkPassword": {
+ "message": "Sjekk om passordet har blitt utsatt."
+ },
+ "passwordExposed": {
+ "message": "Dette passordet har blitt utsatt $VALUE$ gang(er) i et databrudd. Du burde endre det.",
+ "placeholders": {
+ "value": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "passwordSafe": {
+ "message": "Dette passordet ble ikke funnet i noen kjente databrudd. Det burde være trygt å bruke."
+ },
+ "baseDomain": {
+ "message": "Grunndomene"
+ },
+ "host": {
+ "message": "Vert",
+ "description": "A URL's host value. For example, the host of https://sub.domain.com:443 is 'sub.domain.com:443'."
+ },
+ "exact": {
+ "message": "Nøyaktig"
+ },
+ "startsWith": {
+ "message": "Starter med"
+ },
+ "regEx": {
+ "message": "Regulært uttrykk",
+ "description": "A programming term, also known as 'RegEx'."
+ },
+ "matchDetection": {
+ "message": "Match-gjenkjenning",
+ "description": "URI match detection for auto-fill."
+ },
+ "defaultMatchDetection": {
+ "message": "Standard match-gjenkjenning",
+ "description": "Default URI match detection for auto-fill."
+ },
+ "toggleOptions": {
+ "message": "Skru av/på innstillinger"
+ },
+ "toggleCurrentUris": {
+ "message": "Veksle nåværende URI-er",
+ "description": "Toggle the display of the URIs of the currently open tabs in the browser."
+ },
+ "currentUri": {
+ "message": "Gjeldende URI",
+ "description": "The URI of one of the current open tabs in the browser."
+ },
+ "organization": {
+ "message": "Organisasjon",
+ "description": "An entity of multiple related people (ex. a team or business organization)."
+ },
+ "types": {
+ "message": "Typer"
+ },
+ "allItems": {
+ "message": "Alle objekter"
+ },
+ "noPasswordsInList": {
+ "message": "Det er ingen passord å liste opp."
+ },
+ "remove": {
+ "message": "Fjern"
+ },
+ "default": {
+ "message": "Standard"
+ },
+ "dateUpdated": {
+ "message": "Oppdatert den",
+ "description": "ex. Date this item was updated"
+ },
+ "datePasswordUpdated": {
+ "message": "Passordet ble oppdatert den",
+ "description": "ex. Date this password was updated"
+ },
+ "neverLockWarning": {
+ "message": "Er du sikker på at du vil bruke alternativet «Aldri»? Ved å angi låsemulighetene til «Aldri» lagres hvelvets krypteringsnøkkel på enheten. Hvis du bruker dette alternativet, bør du sørge for at du holder enheten forsvarlig beskyttet."
+ },
+ "noOrganizationsList": {
+ "message": "Du tilhører ikke noen organisasjoner. Organisasjoner gjør det mulig for deg å sikkert dele objekter med andre brukere."
+ },
+ "noCollectionsInList": {
+ "message": "Det er ingen samlinger å liste opp."
+ },
+ "ownership": {
+ "message": "Eierskap"
+ },
+ "whoOwnsThisItem": {
+ "message": "Hvem eier dette elementet?"
+ },
+ "strong": {
+ "message": "Sterkt",
+ "description": "ex. A strong password. Scale: Weak -> Good -> Strong"
+ },
+ "good": {
+ "message": "Bra",
+ "description": "ex. A good password. Scale: Weak -> Good -> Strong"
+ },
+ "weak": {
+ "message": "Svakt",
+ "description": "ex. A weak password. Scale: Weak -> Good -> Strong"
+ },
+ "weakMasterPassword": {
+ "message": "Svakt hovedpassord"
+ },
+ "weakMasterPasswordDesc": {
+ "message": "Superpassordet du har valgt er svakt. Du bør bruke et sterkt superpassord (eller en passordfrase) for å sikre Bitwarden-kontoen din på en forsvarlig måte. Er du sikker på at du vil bruke dette superpassordet?"
+ },
+ "pin": {
+ "message": "PIN",
+ "description": "PIN code. Ex. The short code (often numeric) that you use to unlock a device."
+ },
+ "unlockWithPin": {
+ "message": "Lås opp med PIN-kode"
+ },
+ "setYourPinCode": {
+ "message": "Angi PIN-koden din for å låse opp Bitwarden. PIN-innstillingene tilbakestilles hvis du logger deg helt ut av programmet."
+ },
+ "pinRequired": {
+ "message": "PIN-kode er påkrevd."
+ },
+ "invalidPin": {
+ "message": "Ugyldig PIN-kode."
+ },
+ "verifyPin": {
+ "message": "Verifiser PIN-koden"
+ },
+ "yourVaultIsLockedPinCode": {
+ "message": "Hvelvet ditt er låst. Kontroller PIN-koden din for å fortsette."
+ },
+ "unlockWithBiometrics": {
+ "message": "Lås opp med biometri"
+ },
+ "awaitDesktop": {
+ "message": "Venter på bekreftelse fra skrivebordsprogrammet"
+ },
+ "awaitDesktopDesc": {
+ "message": "Bekreft bruk av biometri i Bitwardens skrivebordsprogram for å aktivere biometri for nettleseren."
+ },
+ "lockWithMasterPassOnRestart": {
+ "message": "Lås med hovedpassordet når du starter nettleseren på nytt"
+ },
+ "selectOneCollection": {
+ "message": "Du må velge minst én samling."
+ },
+ "cloneItem": {
+ "message": "Klon objektet"
+ },
+ "clone": {
+ "message": "Klon"
+ },
+ "passwordGeneratorPolicyInEffect": {
+ "message": "En eller flere av organisasjonens vilkår påvirker generatorinnstillingene dine."
+ },
+ "vaultTimeoutAction": {
+ "message": "Handling ved tidsavbrudd i hvelvet"
+ },
+ "lock": {
+ "message": "Lås",
+ "description": "Verb form: to make secure or inaccesible by"
+ },
+ "trash": {
+ "message": "Papirkurv",
+ "description": "Noun: a special folder to hold deleted items"
+ },
+ "searchTrash": {
+ "message": "Søk i papirkurven"
+ },
+ "permanentlyDeleteItem": {
+ "message": "Slett objektet permanent"
+ },
+ "permanentlyDeleteItemConfirmation": {
+ "message": "Er du sikker på at du vil slette dette objektet permanent?"
+ },
+ "permanentlyDeletedItem": {
+ "message": "Slettet objektet permanent"
+ },
+ "restoreItem": {
+ "message": "Gjenopprett objekt"
+ },
+ "restoreItemConfirmation": {
+ "message": "Er du sikker på at du vil gjenopprette dette objektet?"
+ },
+ "restoredItem": {
+ "message": "Gjenopprettet objekt"
+ },
+ "vaultTimeoutLogOutConfirmation": {
+ "message": "Hvis du logger ut, fjerner du all tilgang til hvelvet ditt og krever online godkjenning etter tidsavbrudd. Er du sikker på at du vil bruke denne innstillingen?"
+ },
+ "vaultTimeoutLogOutConfirmationTitle": {
+ "message": "Bekreftelse på handling ved tidsavbrudd"
+ },
+ "autoFillAndSave": {
+ "message": "Autofyll og lagre"
+ },
+ "autoFillSuccessAndSavedUri": {
+ "message": "Autoutfylt objekt og lagret URI"
+ },
+ "autoFillSuccess": {
+ "message": "Autoutfylt gjenstand"
+ },
+ "setMasterPassword": {
+ "message": "Angi hovedpassord"
+ },
+ "masterPasswordPolicyInEffect": {
+ "message": "Ett eller flere av organisasjonens vilkår krever at hovedpassordet oppfyller følgende krav:"
+ },
+ "policyInEffectMinComplexity": {
+ "message": "Minimumspoengsum for kompleksistet er $SCORE$",
+ "placeholders": {
+ "score": {
+ "content": "$1",
+ "example": "4"
+ }
+ }
+ },
+ "policyInEffectMinLength": {
+ "message": "Minimumslengde på $LENGTH$",
+ "placeholders": {
+ "length": {
+ "content": "$1",
+ "example": "14"
+ }
+ }
+ },
+ "policyInEffectUppercase": {
+ "message": "Inneholde én eller flere store bokstaver"
+ },
+ "policyInEffectLowercase": {
+ "message": "Inneholde én eller flere små bokstaver"
+ },
+ "policyInEffectNumbers": {
+ "message": "Inneholde ett eller flere tall"
+ },
+ "policyInEffectSpecial": {
+ "message": "Inneholde ett eller flere av følgende spesialtegn $CHARS$",
+ "placeholders": {
+ "chars": {
+ "content": "$1",
+ "example": "!@#$%^&*"
+ }
+ }
+ },
+ "masterPasswordPolicyRequirementsNotMet": {
+ "message": "Det nye hovedpassordet ditt oppfyller ikke vilkårene."
+ },
+ "acceptPolicies": {
+ "message": "Ved å merke av denne boksen sier du deg enig i følgende:"
+ },
+ "acceptPoliciesError": {
+ "message": "Vilkårene for bruk og personvernerklæring er ikke akseptert."
+ },
+ "termsOfService": {
+ "message": "Vilkår for bruk"
+ },
+ "privacyPolicy": {
+ "message": "Personvernerklæring"
+ },
+ "hintEqualsPassword": {
+ "message": "Passordhintet ditt kan ikke være det samme som passordet ditt."
+ },
+ "ok": {
+ "message": "Ok"
+ },
+ "desktopSyncVerificationTitle": {
+ "message": "Verifisering av skrivebordssynkronisering"
+ },
+ "desktopIntegrationVerificationText": {
+ "message": "Kontroller at skrivebordsprogrammet viser dette fingeravtrykket:"
+ },
+ "desktopIntegrationDisabledTitle": {
+ "message": "Nettleserintegrasjon er ikke aktivert"
+ },
+ "desktopIntegrationDisabledDesc": {
+ "message": "Nettleserintegrasjon er ikke aktivert i Bitwardens skrivebordsprogram. Du kan aktiver integrasjonen i innstillingene for skrivebordsprogrammet."
+ },
+ "startDesktopTitle": {
+ "message": "Start Bitwardens skrivebordsprogram."
+ },
+ "startDesktopDesc": {
+ "message": "Bitwardens skrivebordsprogram må startes før denne funksjonen kan brukes."
+ },
+ "errorEnableBiometricTitle": {
+ "message": "Kunne ikke aktivere biometrier"
+ },
+ "errorEnableBiometricDesc": {
+ "message": "Handlingen ble avbrutt av skrivebordsprogrammet"
+ },
+ "nativeMessagingInvalidEncryptionDesc": {
+ "message": "Skrivebordsprogrammet ugyldiggjorde den sikre kommunikasjonskanalen. Prøv igjen"
+ },
+ "nativeMessagingInvalidEncryptionTitle": {
+ "message": "Kommunikasjon med skrivebordsprogrammet er avbrutt"
+ },
+ "nativeMessagingWrongUserDesc": {
+ "message": "Skrivebordsprogrammet er innlogget på en annen konto. Kontroller at både nettleserutvidelsen og skrivebordsprogrammet er innlogget på den samme kontoen."
+ },
+ "nativeMessagingWrongUserTitle": {
+ "message": "Kontoen eksisterer ikke"
+ },
+ "biometricsNotEnabledTitle": {
+ "message": "Biometri ikke aktivert"
+ },
+ "biometricsNotEnabledDesc": {
+ "message": "Biometri i nettleserutvidelsen krever først aktivering i innstillinger i skrivebordsprogrammet."
+ },
+ "biometricsNotSupportedTitle": {
+ "message": "Biometri støttes ikke"
+ },
+ "biometricsNotSupportedDesc": {
+ "message": "Biometri i nettleseren støttes ikke på denne enheten."
+ },
+ "nativeMessaginPermissionErrorTitle": {
+ "message": "Tillatelse er ikke gitt"
+ },
+ "nativeMessaginPermissionErrorDesc": {
+ "message": "Uten tillatelse til å kommunisere med Bitwardens skrivebordsprogram kan vi ikke tilgjengeligjøre biometri i nettleserutvidelsen. Prøv igjen."
+ },
+ "nativeMessaginPermissionSidebarTitle": {
+ "message": "Feil ved forespørsel om tillatelse"
+ },
+ "nativeMessaginPermissionSidebarDesc": {
+ "message": "Denne handlingen kan ikke gjøres i sidestolpen, prøv på nytt i sprettoppvinduet eller popvindu."
+ },
+ "personalOwnershipSubmitError": {
+ "message": "På grunn av bedrifsretningslinjer er du begrenset fra å lagre objekter til ditt personlige hvelv. Endre alternativ for eierskap til en organisasjon og velg blant tilgjengelige samlinger."
+ },
+ "personalOwnershipPolicyInEffect": {
+ "message": "En bedriftsretningslinje påvirker dine eierskapsinnstillinger."
+ },
+ "excludedDomains": {
+ "message": "Ekskluderte domener"
+ },
+ "excludedDomainsDesc": {
+ "message": "Bitwarden vil ikke be om å lagre innloggingsdetaljer for disse domenene. Du må oppdatere siden for at endringene skal tre i kraft."
+ },
+ "excludedDomainsInvalidDomain": {
+ "message": "$DOMAIN$ er ikke et gyldig domene",
+ "placeholders": {
+ "domain": {
+ "content": "$1",
+ "example": "googlecom"
+ }
+ }
+ },
+ "send": {
+ "message": "Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "searchSends": {
+ "message": "Søk i Send-ene",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "addSend": {
+ "message": "Legg til Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTypeText": {
+ "message": "Tekst"
+ },
+ "sendTypeFile": {
+ "message": "Fil"
+ },
+ "allSends": {
+ "message": "Alle Send-er",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "maxAccessCountReached": {
+ "message": "Maksimalt antall tilganger nådd"
+ },
+ "expired": {
+ "message": "Utløpt"
+ },
+ "pendingDeletion": {
+ "message": "Venter på sletting"
+ },
+ "passwordProtected": {
+ "message": "Passord beskyttet"
+ },
+ "copySendLink": {
+ "message": "Kopier Send-lenke",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "removePassword": {
+ "message": "Fjern passord"
+ },
+ "delete": {
+ "message": "Slett"
+ },
+ "removedPassword": {
+ "message": "Fjernet passord"
+ },
+ "deletedSend": {
+ "message": "Slettet Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendLink": {
+ "message": "Send lenke",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "disabled": {
+ "message": "Deaktivert"
+ },
+ "removePasswordConfirmation": {
+ "message": "Er du sikker på at du vil fjerne passordet?"
+ },
+ "deleteSend": {
+ "message": "Slett Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "deleteSendConfirmation": {
+ "message": "Er du sikker på at du vil slette denne Send-en?",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "editSend": {
+ "message": "Rediger Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTypeHeader": {
+ "message": "Hvilken type Send er dette?",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendNameDesc": {
+ "message": "Et vennlig navn for å beskrive dette Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendFileDesc": {
+ "message": "Filen du vil send."
+ },
+ "deletionDate": {
+ "message": "Dato for sletting"
+ },
+ "deletionDateDesc": {
+ "message": "Send-en vil bli slettet permanent på den angitte dato og klokkeslett.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "expirationDate": {
+ "message": "Utløpsdato"
+ },
+ "expirationDateDesc": {
+ "message": "Hvis satt, vil tilgang til denne Send gå ut på angitt dato og klokkeslett.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "oneDay": {
+ "message": "1 dag"
+ },
+ "days": {
+ "message": "$DAYS$ dager",
+ "placeholders": {
+ "days": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "custom": {
+ "message": "Egendefinert"
+ },
+ "maximumAccessCount": {
+ "message": "Maksimal antall tilganger"
+ },
+ "maximumAccessCountDesc": {
+ "message": "Hvis satt, vil ikke brukere lenger ha tilgang til dette Send når maksimal antall tilgang er nådd.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendPasswordDesc": {
+ "message": "Eventuelt krever et passord for brukere å få tilgang til denne Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendNotesDesc": {
+ "message": "Private notater om denne Send-en.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendDisableDesc": {
+ "message": "Deaktiver denne Send-en, slik at ingen får tilgang til den.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendShareDesc": {
+ "message": "Copy this Send's link to clipboard upon save.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTextDesc": {
+ "message": "Teksten du ønsker å sende."
+ },
+ "sendHideText": {
+ "message": "Hide this Send's text by default.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "currentAccessCount": {
+ "message": "Current Access Count"
+ },
+ "createSend": {
+ "message": "Create New Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "newPassword": {
+ "message": "Nytt passord"
+ },
+ "sendDisabled": {
+ "message": "Send Disabled",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendDisabledWarning": {
+ "message": "På grunn av en virksomhetsregel kan du kun slette en eksisterende Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "createdSend": {
+ "message": "Opprettet Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "editedSend": {
+ "message": "Redigerte Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendLinuxChromiumFileWarning": {
+ "message": "For å velge en fil, åpne utvidelsen i sidepanelet (hvis mulig) eller poppe ut til et nytt vindu ved å klikke på dette banneret."
+ },
+ "sendFirefoxFileWarning": {
+ "message": "For å velge en fil med Firefox må du åpne utvidelsen i sidestolpen eller sprette ut til et nytt vindu ved å klikke på dette banneret."
+ },
+ "sendSafariFileWarning": {
+ "message": "For å velge en fil med Safari, popp ut i et nytt vindu ved å klikke på dette banneret."
+ },
+ "sendFileCalloutHeader": {
+ "message": "Før du starter"
+ },
+ "sendFirefoxCustomDatePopoutMessage1": {
+ "message": "Hvis du vil bruke en kalenderstil-datovelger",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read '**To use a calendar style date picker ** click here to pop out your window.'"
+ },
+ "sendFirefoxCustomDatePopoutMessage2": {
+ "message": "kilkk her",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker **click here** to pop out your window.'"
+ },
+ "sendFirefoxCustomDatePopoutMessage3": {
+ "message": "å pope ut vinduet.",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker click here **to pop out your window.**'"
+ },
+ "expirationDateIsInvalid": {
+ "message": "Utløpsdatoen angitt er ikke gyldig."
+ },
+ "deletionDateIsInvalid": {
+ "message": "Slettingsdatoen som er gitt er ikke gyldig."
+ },
+ "expirationDateAndTimeRequired": {
+ "message": "Utløps dato og tid er påkrevd."
+ },
+ "deletionDateAndTimeRequired": {
+ "message": "Det kreves en slettingsdato og -tid."
+ },
+ "dateParsingError": {
+ "message": "Det oppstod en feil ved lagring av slettingen og utløpsdatoene."
+ },
+ "hideEmail": {
+ "message": "Skjul min e-postadresse fra mottakere."
+ },
+ "sendOptionsPolicyInEffect": {
+ "message": "En eller flere av organisasjons retningslinjer påvirker generatorinnstillingene dine."
+ },
+ "passwordPrompt": {
+ "message": "Forespørsel om hovedpassord på nytt"
+ },
+ "passwordConfirmation": {
+ "message": "Superpassord bekreftelse"
+ },
+ "passwordConfirmationDesc": {
+ "message": "Denne handlingen er beskyttet. For å fortsette, skriv inn superpassordet på nytt for å bekrefte identiteten din."
+ },
+ "emailVerificationRequired": {
+ "message": "E-postbekreftelse kreves"
+ },
+ "emailVerificationRequiredDesc": {
+ "message": "Du må bekrefte e-posten din for å bruke denne funksjonen. Du kan bekrefte e-postadressen din i netthvelvet."
+ },
+ "updatedMasterPassword": {
+ "message": "Updated Master Password"
+ },
+ "updateMasterPassword": {
+ "message": "Update Master Password"
+ },
+ "updateMasterPasswordWarning": {
+ "message": "Your Master Password was recently changed by an administrator in your organization. In order to access the vault, you must update it now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour."
+ },
+ "resetPasswordPolicyAutoEnroll": {
+ "message": "Automatic Enrollment"
+ },
+ "resetPasswordAutoEnrollInviteWarning": {
+ "message": "This organization has an enterprise policy that will automatically enroll you in password reset. Enrollment will allow organization administrators to change your master password."
+ },
+ "selectFolder": {
+ "message": "Select folder..."
+ },
+ "ssoCompleteRegistration": {
+ "message": "In order to complete logging in with SSO, please set a master password to access and protect your vault."
+ },
+ "hours": {
+ "message": "Hours"
+ },
+ "minutes": {
+ "message": "Minutes"
+ },
+ "vaultTimeoutPolicyInEffect": {
+ "message": "Your organization policies are affecting your vault timeout. Maximum allowed Vault Timeout is $HOURS$ hour(s) and $MINUTES$ minute(s)",
+ "placeholders": {
+ "hours": {
+ "content": "$1",
+ "example": "5"
+ },
+ "minutes": {
+ "content": "$2",
+ "example": "5"
+ }
+ }
+ },
+ "vaultTimeoutToLarge": {
+ "message": "Your vault timeout exceeds the restrictions set by your organization."
+ },
+ "vaultExportDisabled": {
+ "message": "Vault Export Disabled"
+ },
+ "personalVaultExportPolicyInEffect": {
+ "message": "One or more organization policies prevents you from exporting your personal vault."
+ },
+ "copyCustomFieldNameInvalidElement": {
+ "message": "Unable to identify a valid form element. Try inspecting the HTML instead."
+ },
+ "copyCustomFieldNameNotUnique": {
+ "message": "No unique identifier found."
+ }
+}
diff --git a/src/iOS.Safari/Resources/_locales/nl/messages.json b/src/iOS.Safari/Resources/_locales/nl/messages.json
new file mode 100644
index 000000000..0d7f62d8b
--- /dev/null
+++ b/src/iOS.Safari/Resources/_locales/nl/messages.json
@@ -0,0 +1,1817 @@
+{
+ "appName": {
+ "message": "Bitwarden"
+ },
+ "extName": {
+ "message": "Bitwarden - Gratis wachtwoordbeheer",
+ "description": "Extension name, MUST be less than 40 characters (Safari restriction)"
+ },
+ "extDesc": {
+ "message": "Een veilige en gratis oplossing voor wachtwoordbeheer voor al je apparaten.",
+ "description": "Extension description"
+ },
+ "loginOrCreateNewAccount": {
+ "message": "Log in of maak een nieuw account aan om toegang te krijgen tot je beveiligde kluis."
+ },
+ "createAccount": {
+ "message": "Account aanmaken"
+ },
+ "login": {
+ "message": "Inloggen"
+ },
+ "enterpriseSingleSignOn": {
+ "message": "Enterprise Single Sign-On"
+ },
+ "cancel": {
+ "message": "Annuleren"
+ },
+ "close": {
+ "message": "Sluiten"
+ },
+ "submit": {
+ "message": "Versturen"
+ },
+ "emailAddress": {
+ "message": "E-mailadres"
+ },
+ "masterPass": {
+ "message": "Hoofdwachtwoord"
+ },
+ "masterPassDesc": {
+ "message": "Het hoofdwachtwoord is het wachtwoord waarmee je toegang krijgt tot je beveiligde kluis. Het is belangrijk dat je het hoofdwachtwoord niet vergeet, want er is geen manier om het te herstellen."
+ },
+ "masterPassHintDesc": {
+ "message": "Een hoofdwachtwoordhint kan je helpen je wachtwoord te herinneren als je het vergeten bent."
+ },
+ "reTypeMasterPass": {
+ "message": "Hoofdwachtwoord opnieuw invoeren"
+ },
+ "masterPassHint": {
+ "message": "Hoofdwachtwoordhint (optioneel)"
+ },
+ "tab": {
+ "message": "Tab"
+ },
+ "myVault": {
+ "message": "Mijn kluis"
+ },
+ "tools": {
+ "message": "Gereedschap"
+ },
+ "settings": {
+ "message": "Instellingen"
+ },
+ "currentTab": {
+ "message": "Huidige tab"
+ },
+ "copyPassword": {
+ "message": "Wachtwoord kopiëren"
+ },
+ "copyNote": {
+ "message": "Notitie kopiëren"
+ },
+ "copyUri": {
+ "message": "URI kopiëren"
+ },
+ "copyUsername": {
+ "message": "Gebruikersnaam kopiëren"
+ },
+ "copyNumber": {
+ "message": "Nummer kopiëren"
+ },
+ "copySecurityCode": {
+ "message": "Beveiligingscode kopiëren"
+ },
+ "autoFill": {
+ "message": "Auto-invullen"
+ },
+ "generatePasswordCopied": {
+ "message": "Wachtwoord genereren (op klembord)"
+ },
+ "copyElementIdentifier": {
+ "message": "Aangepaste veldnaam kopiëren"
+ },
+ "noMatchingLogins": {
+ "message": "Geen overeenkomstige logins."
+ },
+ "vaultLocked": {
+ "message": "Kluis is vergrendeld."
+ },
+ "vaultLoggedOut": {
+ "message": "Kluis is uitgelogd."
+ },
+ "autoFillInfo": {
+ "message": "Er zijn geen logins beschikbaar om op het huidige browser-tabblad in te vullen."
+ },
+ "addLogin": {
+ "message": "Login toevoegen"
+ },
+ "addItem": {
+ "message": "Item toevoegen"
+ },
+ "passwordHint": {
+ "message": "Wachtwoordhint"
+ },
+ "enterEmailToGetHint": {
+ "message": "Voer het e-mailadres van je account in om je hoofdwachtwoordhint te ontvangen."
+ },
+ "getMasterPasswordHint": {
+ "message": "Hoofdwachtwoordhint opvragen"
+ },
+ "continue": {
+ "message": "Doorgaan"
+ },
+ "verificationCode": {
+ "message": "Verificatiecode"
+ },
+ "account": {
+ "message": "Account"
+ },
+ "changeMasterPassword": {
+ "message": "Hoofdwachtwoord wijzigen"
+ },
+ "fingerprintPhrase": {
+ "message": "Vingerafdrukzin",
+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
+ },
+ "yourAccountsFingerprint": {
+ "message": "Vingerafdrukzin van je account",
+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
+ },
+ "twoStepLogin": {
+ "message": "Tweestapsaanmelding"
+ },
+ "logOut": {
+ "message": "Uitloggen"
+ },
+ "about": {
+ "message": "Over"
+ },
+ "version": {
+ "message": "Versie"
+ },
+ "save": {
+ "message": "Opslaan"
+ },
+ "move": {
+ "message": "Verplaatsen"
+ },
+ "addFolder": {
+ "message": "Map toevoegen"
+ },
+ "name": {
+ "message": "Naam"
+ },
+ "editFolder": {
+ "message": "Map bewerken"
+ },
+ "deleteFolder": {
+ "message": "Map verwijderen"
+ },
+ "folders": {
+ "message": "Mappen"
+ },
+ "noFolders": {
+ "message": "Er zijn geen mappen om weer te geven."
+ },
+ "helpFeedback": {
+ "message": "Hulp en reacties"
+ },
+ "sync": {
+ "message": "Synchroniseren"
+ },
+ "syncVaultNow": {
+ "message": "Kluis nu synchroniseren"
+ },
+ "lastSync": {
+ "message": "Laatste synchronisatie:"
+ },
+ "passGen": {
+ "message": "Wachtwoordgenerator"
+ },
+ "generator": {
+ "message": "Generator",
+ "description": "Short for 'Password Generator'."
+ },
+ "passGenInfo": {
+ "message": "Automatisch sterke, unieke wachtwoorden voor je logins genereren."
+ },
+ "bitWebVault": {
+ "message": "Bitwarden Webkluis"
+ },
+ "importItems": {
+ "message": "Items importeren"
+ },
+ "select": {
+ "message": "Selecteren"
+ },
+ "generatePassword": {
+ "message": "Wachtwoord genereren"
+ },
+ "regeneratePassword": {
+ "message": "Opnieuw genereren"
+ },
+ "options": {
+ "message": "Opties"
+ },
+ "length": {
+ "message": "Lengte"
+ },
+ "numWords": {
+ "message": "Aantal woorden"
+ },
+ "wordSeparator": {
+ "message": "Scheidingsteken"
+ },
+ "capitalize": {
+ "message": "Beginhoofdletters",
+ "description": "Make the first letter of a work uppercase."
+ },
+ "includeNumber": {
+ "message": "Cijfer toevoegen"
+ },
+ "minNumbers": {
+ "message": "Minimum aantal cijfers"
+ },
+ "minSpecial": {
+ "message": "Minimum aantal speciale tekens"
+ },
+ "avoidAmbChar": {
+ "message": "Dubbelzinnige tekens vermijden"
+ },
+ "searchVault": {
+ "message": "Kluis doorzoeken"
+ },
+ "edit": {
+ "message": "Bewerken"
+ },
+ "view": {
+ "message": "Weergeven"
+ },
+ "noItemsInList": {
+ "message": "Er zijn geen items om weer te geven."
+ },
+ "itemInformation": {
+ "message": "Item"
+ },
+ "username": {
+ "message": "Gebruikersnaam"
+ },
+ "password": {
+ "message": "Wachtwoord"
+ },
+ "passphrase": {
+ "message": "Wachtwoordzin"
+ },
+ "favorite": {
+ "message": "Favoriet"
+ },
+ "notes": {
+ "message": "Notities"
+ },
+ "note": {
+ "message": "Notitie"
+ },
+ "editItem": {
+ "message": "Item bewerken"
+ },
+ "folder": {
+ "message": "Map"
+ },
+ "deleteItem": {
+ "message": "Item verwijderen"
+ },
+ "viewItem": {
+ "message": "Item weergeven"
+ },
+ "launch": {
+ "message": "Starten"
+ },
+ "website": {
+ "message": "Website"
+ },
+ "toggleVisibility": {
+ "message": "Zichtbaarheid wisselen"
+ },
+ "manage": {
+ "message": "Beheren"
+ },
+ "other": {
+ "message": "Overig"
+ },
+ "rateExtension": {
+ "message": "Deze extensie beoordelen"
+ },
+ "rateExtensionDesc": {
+ "message": "Je kunt ons helpen door een goede recensie achter te laten!"
+ },
+ "browserNotSupportClipboard": {
+ "message": "Je webbrowser ondersteunt kopiëren naar plakbord niet. Kopieer handmatig."
+ },
+ "verifyMasterPassword": {
+ "message": "Hoofdwachtwoord invoeren"
+ },
+ "yourVaultIsLocked": {
+ "message": "Je kluis is vergrendeld. Voer je hoofdwachtwoord in om door te gaan."
+ },
+ "unlock": {
+ "message": "Ontgrendelen"
+ },
+ "loggedInAsOn": {
+ "message": "Aangemeld als $EMAIL$ op $HOSTNAME$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "name@example.com"
+ },
+ "hostname": {
+ "content": "$2",
+ "example": "bitwarden.com"
+ }
+ }
+ },
+ "invalidMasterPassword": {
+ "message": "Ongeldig hoofdwachtwoord"
+ },
+ "vaultTimeout": {
+ "message": "Time-out van de kluis"
+ },
+ "lockNow": {
+ "message": "Nu vergrendelen"
+ },
+ "immediately": {
+ "message": "Onmiddellijk"
+ },
+ "tenSeconds": {
+ "message": "10 seconden"
+ },
+ "twentySeconds": {
+ "message": "20 seconden"
+ },
+ "thirtySeconds": {
+ "message": "30 seconden"
+ },
+ "oneMinute": {
+ "message": "1 minuut"
+ },
+ "twoMinutes": {
+ "message": "2 minuten"
+ },
+ "fiveMinutes": {
+ "message": "5 minuten"
+ },
+ "fifteenMinutes": {
+ "message": "15 minuten"
+ },
+ "thirtyMinutes": {
+ "message": "30 minuten"
+ },
+ "oneHour": {
+ "message": "1 uur"
+ },
+ "fourHours": {
+ "message": "4 uur"
+ },
+ "onLocked": {
+ "message": "Bij systeemvergrendeling"
+ },
+ "onRestart": {
+ "message": "Bij herstart van de browser"
+ },
+ "never": {
+ "message": "Nooit"
+ },
+ "security": {
+ "message": "Beveiliging"
+ },
+ "errorOccurred": {
+ "message": "Er is een fout opgetreden"
+ },
+ "emailRequired": {
+ "message": "E-mailadres is vereist."
+ },
+ "invalidEmail": {
+ "message": "Ongeldig e-mailadres."
+ },
+ "masterPassRequired": {
+ "message": "Hoofdwachtwoord is vereist."
+ },
+ "masterPassLength": {
+ "message": "Hoofdwachtwoord moet minstens 8 tekens lang zijn."
+ },
+ "masterPassDoesntMatch": {
+ "message": "De hoofdwachtwoorden komen niet overeen."
+ },
+ "newAccountCreated": {
+ "message": "Je nieuwe account is aangemaakt! Je kunt nu inloggen."
+ },
+ "masterPassSent": {
+ "message": "We hebben je een e-mail gestuurd met je hoofdwachtwoordhint."
+ },
+ "verificationCodeRequired": {
+ "message": "Verificatiecode is vereist."
+ },
+ "valueCopied": {
+ "message": "$VALUE$ gekopieerd",
+ "description": "Value has been copied to the clipboard.",
+ "placeholders": {
+ "value": {
+ "content": "$1",
+ "example": "Password"
+ }
+ }
+ },
+ "autofillError": {
+ "message": "Automatisch invullen mislukt; kopieer en plak je inloggegevens handmatig."
+ },
+ "loggedOut": {
+ "message": "Uitgelogd"
+ },
+ "loginExpired": {
+ "message": "Je inlogsessie is verlopen."
+ },
+ "logOutConfirmation": {
+ "message": "Weet je zeker dat je wilt uitloggen?"
+ },
+ "yes": {
+ "message": "Ja"
+ },
+ "no": {
+ "message": "Nee"
+ },
+ "unexpectedError": {
+ "message": "Er is een onverwachte fout opgetreden."
+ },
+ "nameRequired": {
+ "message": "Naam is vereist."
+ },
+ "addedFolder": {
+ "message": "Map is toegevoegd"
+ },
+ "changeMasterPass": {
+ "message": "Hoofdwachtwoord wijzigen"
+ },
+ "changeMasterPasswordConfirmation": {
+ "message": "Je kunt je hoofdwachtwoord wijzigen in de kluis op bitwarden.com. Wil je de website nu bezoeken?"
+ },
+ "twoStepLoginConfirmation": {
+ "message": "Tweestapsaanmelding beschermt je account door je inlogpoging te bevestigen met een ander apparaat zoals een beveiligingscode, authenticatie-app, SMS, spraakoproep of e-mail. Je kunt Tweestapsaanmelding inschakelen in de webkluis op bitwarden.com. Wil je de website nu bezoeken?"
+ },
+ "editedFolder": {
+ "message": "Map is bewerkt"
+ },
+ "deleteFolderConfirmation": {
+ "message": "Weet je zeker dat je deze map wilt verwijderen?"
+ },
+ "deletedFolder": {
+ "message": "Map is verwijderd"
+ },
+ "gettingStartedTutorial": {
+ "message": "Aan-de-slag-handleiding"
+ },
+ "gettingStartedTutorialVideo": {
+ "message": "Bekijk onze aan-de-slag-handleiding om te leren hoe je het meeste haalt uit de browserextensie."
+ },
+ "syncingComplete": {
+ "message": "Synchronisatie voltooid"
+ },
+ "syncingFailed": {
+ "message": "Synchronisatie mislukt"
+ },
+ "passwordCopied": {
+ "message": "Wachtwoord gekopieerd"
+ },
+ "uri": {
+ "message": "URI"
+ },
+ "uriPosition": {
+ "message": "URI $POSITION$",
+ "description": "A listing of URIs. Ex: URI 1, URI 2, URI 3, etc.",
+ "placeholders": {
+ "position": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "newUri": {
+ "message": "Nieuwe URI"
+ },
+ "addedItem": {
+ "message": "Item is toegevoegd"
+ },
+ "editedItem": {
+ "message": "Item is bewerkt"
+ },
+ "deleteItemConfirmation": {
+ "message": "Weet je zeker dat je dit naar de prullenbak wilt verplaatsen?"
+ },
+ "deletedItem": {
+ "message": "Item is verwijderd"
+ },
+ "overwritePassword": {
+ "message": "Wachtwoord overschrijven"
+ },
+ "overwritePasswordConfirmation": {
+ "message": "Weet je zeker dat je het huidige wachtwoord wilt overschrijven?"
+ },
+ "searchFolder": {
+ "message": "Map doorzoeken"
+ },
+ "searchCollection": {
+ "message": "Verzameling doorzoeken"
+ },
+ "searchType": {
+ "message": "Categorie doorzoeken"
+ },
+ "noneFolder": {
+ "message": "Geen map",
+ "description": "This is the folder for uncategorized items"
+ },
+ "disableAddLoginNotification": {
+ "message": "Melding bij nieuwe login uitschakelen"
+ },
+ "addLoginNotificationDesc": {
+ "message": "\"Melding bij nieuwe login\" vraagt automatisch om nieuwe sites in de kluis op te slaan wanneer je ergens voor de eerste keer inlogt."
+ },
+ "dontShowCardsCurrentTab": {
+ "message": "Kaarten verbergen op tab"
+ },
+ "dontShowCardsCurrentTabDesc": {
+ "message": "Kaartitems uit je kluis staan op de pagina 'Huidige Tab' om automatisch invullen te vereenvoudigen."
+ },
+ "dontShowIdentitiesCurrentTab": {
+ "message": "Identiteiten verbergen op tab"
+ },
+ "dontShowIdentitiesCurrentTabDesc": {
+ "message": "Identiteitsitems uit je kluis staan op de pagina 'Huidige Tab' om automatisch invullen te vereenvoudigen."
+ },
+ "clearClipboard": {
+ "message": "Klembord wissen",
+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
+ },
+ "clearClipboardDesc": {
+ "message": "Gekopieerde waarden automatisch van het klembord wissen.",
+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
+ },
+ "notificationAddDesc": {
+ "message": "Moet Bitwarden dit wachtwoord voor je onthouden?"
+ },
+ "notificationAddSave": {
+ "message": "Ja, nu opslaan"
+ },
+ "notificationNeverSave": {
+ "message": "Nooit voor deze website"
+ },
+ "disableChangedPasswordNotification": {
+ "message": "Melding gewijzigd wachtwoord uitschakelen"
+ },
+ "disableChangedPasswordNotificationDesc": {
+ "message": "De \"Melding gewijzigd wachtwoord\" stelt automatisch voor om een wachtwoord in je kluis bij te werken wanneer het op een website is gewijzigd."
+ },
+ "notificationChangeDesc": {
+ "message": "Wilt je dit wachtwoord in Bitwarden bijwerken?"
+ },
+ "notificationChangeSave": {
+ "message": "Ja, nu bijwerken"
+ },
+ "disableContextMenuItem": {
+ "message": "Contextmenu-opties uitschakelen"
+ },
+ "disableContextMenuItemDesc": {
+ "message": "Contextmenu-opties bieden snelle toegang tot de wachtwoordgenerator en logins voor de website in de huidige tab."
+ },
+ "defaultUriMatchDetection": {
+ "message": "Standaard URI-overeenkomstdetectie",
+ "description": "Default URI match detection for auto-fill."
+ },
+ "defaultUriMatchDetectionDesc": {
+ "message": "Kies de standaardmethode voor detectie van URI-overeenkomsten voor logins bij acties, zoals automatisch invullen."
+ },
+ "theme": {
+ "message": "Thema"
+ },
+ "themeDesc": {
+ "message": "Het kleurenthema van de toepassing wijzigen."
+ },
+ "dark": {
+ "message": "Donker",
+ "description": "Dark color"
+ },
+ "light": {
+ "message": "Licht",
+ "description": "Light color"
+ },
+ "solarizedDark": {
+ "message": "Overbelicht donker",
+ "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated."
+ },
+ "exportVault": {
+ "message": "Kluis exporteren"
+ },
+ "fileFormat": {
+ "message": "Bestandsindeling"
+ },
+ "warning": {
+ "message": "WAARSCHUWING",
+ "description": "WARNING (should stay in capitalized letters if the language permits)"
+ },
+ "confirmVaultExport": {
+ "message": "Kluisexport bevestigen"
+ },
+ "exportWarningDesc": {
+ "message": "Deze export bevat jouw kluisgegevens in een niet-versleutelde opmaak. Je moet het geëxporteerde bestand niet opslaan of verzenden over onbeveiligde kanalen (zoals e-mail). Verwijder het exportbestand direct na gebruik."
+ },
+ "encExportKeyWarningDesc": {
+ "message": "Deze export versleutelt je gegevens met de encryptiesleutel van je account. Als je je encryptiesleutel verandert moet je opnieuw exporteren, omdat je deze export dan niet meer kunt ontcijferen."
+ },
+ "encExportAccountWarningDesc": {
+ "message": "Encryptiesleutels zijn uniek voor elk Bitwarden-gebruikersaccount. Je kunt een versleutelde export dus niet in een ander account importeren."
+ },
+ "exportMasterPassword": {
+ "message": "Voer je hoofdwachtwoord in om de kluisgegevens te exporteren."
+ },
+ "shared": {
+ "message": "Gedeeld"
+ },
+ "learnOrg": {
+ "message": "Meer over organisaties"
+ },
+ "learnOrgConfirmation": {
+ "message": "Door een organisatie te gebruiken in Bitwarden kun je kluis-items delen met anderen. Wil je de website van bitwarden.com bezoeken voor meer informatie?"
+ },
+ "moveToOrganization": {
+ "message": "Naar organisatie verplaatsen"
+ },
+ "share": {
+ "message": "Delen"
+ },
+ "movedItemToOrg": {
+ "message": "$ITEMNAME$ verplaatst naar $ORGNAME$",
+ "placeholders": {
+ "itemname": {
+ "content": "$1",
+ "example": "Secret Item"
+ },
+ "orgname": {
+ "content": "$2",
+ "example": "Company Name"
+ }
+ }
+ },
+ "moveToOrgDesc": {
+ "message": "Kies een organisatie waarnaar je dit item wilt verplaatsen. Door het verplaatsen krijgt de organisatie de eigendomsrechten van het item. Je bent niet langer de directe eigenaar meer van het item als het is verplaatst."
+ },
+ "learnMore": {
+ "message": "Meer informatie"
+ },
+ "authenticatorKeyTotp": {
+ "message": "Authenticatiecode (TOTP)"
+ },
+ "verificationCodeTotp": {
+ "message": "Verificatiecode (TOTP)"
+ },
+ "copyVerificationCode": {
+ "message": "Verificatiecode kopiëren"
+ },
+ "attachments": {
+ "message": "Bijlagen"
+ },
+ "deleteAttachment": {
+ "message": "Bijlage verwijderen"
+ },
+ "deleteAttachmentConfirmation": {
+ "message": "Weet je zeker dat je deze bijlage wilt verwijderen?"
+ },
+ "deletedAttachment": {
+ "message": "Bijlage is verwijderd"
+ },
+ "newAttachment": {
+ "message": "Nieuwe bijlage toevoegen"
+ },
+ "noAttachments": {
+ "message": "Geen bijlagen."
+ },
+ "attachmentSaved": {
+ "message": "De bijlage is opgeslagen."
+ },
+ "file": {
+ "message": "Bestand"
+ },
+ "selectFile": {
+ "message": "Selecteer een bestand."
+ },
+ "maxFileSize": {
+ "message": "Maximale bestandsgrootte is 500 MB."
+ },
+ "featureUnavailable": {
+ "message": "Functionaliteit niet beschikbaar"
+ },
+ "updateKey": {
+ "message": "Je kunt deze functie pas gebruiken als je je encryptiesleutel bijwerkt."
+ },
+ "premiumMembership": {
+ "message": "Premium-abonnement"
+ },
+ "premiumManage": {
+ "message": "Abonnement beheren"
+ },
+ "premiumManageAlert": {
+ "message": "Je kunt je abonnement aanpassen in de webkluis op bitwarden.com. Wil je de website nu bezoeken?"
+ },
+ "premiumRefresh": {
+ "message": "Abonnement vernieuwen"
+ },
+ "premiumNotCurrentMember": {
+ "message": "Je bent momenteel geen Premium-lid."
+ },
+ "premiumSignUpAndGet": {
+ "message": "Meld je aan voor een Premium-abonnement en krijg:"
+ },
+ "ppremiumSignUpStorage": {
+ "message": "1 GB versleutelde opslag voor bijlagen."
+ },
+ "ppremiumSignUpTwoStep": {
+ "message": "Extra opties voor tweestapsaanmelding zoals YubiKey, FIDO U2F en Duo."
+ },
+ "ppremiumSignUpReports": {
+ "message": "Wachtwoordhygiëne, gezondheid van je account en datalekken om je kluis veilig te houden."
+ },
+ "ppremiumSignUpTotp": {
+ "message": "TOTP-verificatiecodegenerator (2FA) voor logins in uw kluis."
+ },
+ "ppremiumSignUpSupport": {
+ "message": "Klantondersteuning met hoge prioriteit."
+ },
+ "ppremiumSignUpFuture": {
+ "message": "Alle toekomstige Premium-functionaliteiten. Binnenkort meer!"
+ },
+ "premiumPurchase": {
+ "message": "Premium aanschaffen"
+ },
+ "premiumPurchaseAlert": {
+ "message": "Je kunt een Premium-abonnement aanschaffen in de webkluis op bitwarden.com. Wil je de website nu bezoeken?"
+ },
+ "premiumCurrentMember": {
+ "message": "Je bent Premium-lid!"
+ },
+ "premiumCurrentMemberThanks": {
+ "message": "Bedankt voor het ondersteunen van Bitwarden."
+ },
+ "premiumPrice": {
+ "message": "Dit alles voor slechts $PRICE$ per jaar!",
+ "placeholders": {
+ "price": {
+ "content": "$1",
+ "example": "$10"
+ }
+ }
+ },
+ "refreshComplete": {
+ "message": "Bijwerken voltooid"
+ },
+ "disableAutoTotpCopy": {
+ "message": "TOTP automatisch kopiëren uitschakelen"
+ },
+ "disableAutoTotpCopyDesc": {
+ "message": "Als je login gekoppeld is met een authenticatiecode, wordt de TOTP-verificatiecode automatisch naar het klembord gekopieerd bij het automatisch invullen van de login."
+ },
+ "disableAutoBiometricsPrompt": {
+ "message": "Bij opstarten niet om biometrisch ontgrendelen vragen"
+ },
+ "premiumRequired": {
+ "message": "Premium is vereist"
+ },
+ "premiumRequiredDesc": {
+ "message": "Je hebt een Premium-abonnement nodig om deze functie te gebruiken."
+ },
+ "enterVerificationCodeApp": {
+ "message": "Voer de 6-cijferige verificatiecode uit je authenticatie-app in."
+ },
+ "enterVerificationCodeEmail": {
+ "message": "Voer de 6-cijferige verificatiecode in die via e-mail is verstuurd naar $EMAIL$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "example@gmail.com"
+ }
+ }
+ },
+ "verificationCodeEmailSent": {
+ "message": "E-mail met verificatiecode is verzonden naar $EMAIL$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "example@gmail.com"
+ }
+ }
+ },
+ "rememberMe": {
+ "message": "Mijn gegevens onthouden"
+ },
+ "sendVerificationCodeEmailAgain": {
+ "message": "E-mail met verificatiecode opnieuw versturen"
+ },
+ "useAnotherTwoStepMethod": {
+ "message": "Gebruik een andere methode voor tweestapsaanmelding"
+ },
+ "insertYubiKey": {
+ "message": "Plaats je YubiKey in de USB-poort van je computer en druk op de knop."
+ },
+ "insertU2f": {
+ "message": "Plaats je beveilingssleutel in de USB-poort van je computer. Als het een knop heeft, druk deze dan in."
+ },
+ "webAuthnNewTab": {
+ "message": "Ga door met WebAuthn 2FA-verificatie in de nieuwe tab."
+ },
+ "webAuthnNewTabOpen": {
+ "message": "Nieuwe tab openen"
+ },
+ "webAuthnAuthenticate": {
+ "message": "Authenticeer WebAuthn"
+ },
+ "loginUnavailable": {
+ "message": "Login niet beschikbaar"
+ },
+ "noTwoStepProviders": {
+ "message": "Dit account heeft tweestapsaanmelding ingeschakeld, maar deze webbrowser ondersteunt geen van de geconfigureerde aanbieders."
+ },
+ "noTwoStepProviders2": {
+ "message": "Gebruik een ondersteunde webbrowser (zoals Chrome) en/of voeg extra aanbieders toe die beter worden ondersteund in webbrowsers (zoals een authenticator-app)."
+ },
+ "twoStepOptions": {
+ "message": "Opties voor tweestapsaanmelding"
+ },
+ "recoveryCodeDesc": {
+ "message": "Ben je de toegang tot al je tweestapsaanbieders verloren? Gebruik dan je herstelcode om alle tweestapsaanbieders op je account uit te schakelen."
+ },
+ "recoveryCodeTitle": {
+ "message": "Herstelcode"
+ },
+ "authenticatorAppTitle": {
+ "message": "Authenticatie-app"
+ },
+ "authenticatorAppDesc": {
+ "message": "Gebruik een authenticatie-app (zoals Authy of Google Authenticator) om tijdgebaseerde authenticatiecodes te genereren.",
+ "description": "'Authy' and 'Google Authenticator' are product names and should not be translated."
+ },
+ "yubiKeyTitle": {
+ "message": "YubiKey OTP-beveiligingssleutel"
+ },
+ "yubiKeyDesc": {
+ "message": "Gebruik een YubiKey om toegang te krijgen tot uw account. Werkt met YubiKey 4, 4 Nano, 4C en Neo-apparaten."
+ },
+ "duoDesc": {
+ "message": "Verificatie met Duo Security middels de Duo Mobile-app, sms, spraakoproep of een U2F-beveiligingssleutel.",
+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
+ },
+ "duoOrganizationDesc": {
+ "message": "Verificatie met Duo Security middels de Duo Mobile-app, sms, spraakoproep of een U2F-beveiligingssleutel.",
+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
+ },
+ "webAuthnTitle": {
+ "message": "FIDO2 WebAuthn"
+ },
+ "webAuthnDesc": {
+ "message": "Gebruik een WebAuthn-beveilingssleutel om toegang te krijgen tot je account."
+ },
+ "emailTitle": {
+ "message": "E-mail"
+ },
+ "emailDesc": {
+ "message": "Je ontvangt verificatiecodes via e-mail."
+ },
+ "selfHostedEnvironment": {
+ "message": "Zelfgehoste omgeving"
+ },
+ "selfHostedEnvironmentFooter": {
+ "message": "Geef de basis-URL van jouw zelfgehoste Bitwarden-installatie."
+ },
+ "customEnvironment": {
+ "message": "Aangepaste omgeving"
+ },
+ "customEnvironmentFooter": {
+ "message": "Voor gevorderde gebruikers. Je kunt de basis-URL van elke dienst afzonderlijk instellen."
+ },
+ "baseUrl": {
+ "message": "Server-URL"
+ },
+ "apiUrl": {
+ "message": "API server-URL"
+ },
+ "webVaultUrl": {
+ "message": "Webkluis server-URL"
+ },
+ "identityUrl": {
+ "message": "Identiteitsserver-URL"
+ },
+ "notificationsUrl": {
+ "message": "Meldingenserver-URL"
+ },
+ "iconsUrl": {
+ "message": "Pictogrammenserver-URL"
+ },
+ "environmentSaved": {
+ "message": "De omgeving-URL's zijn opgeslagen."
+ },
+ "enableAutoFillOnPageLoad": {
+ "message": "Automatisch invullen bij laden van pagina"
+ },
+ "enableAutoFillOnPageLoadDesc": {
+ "message": "Als een inlogformulier wordt gedetecteerd, dan worden de inloggegevens automatisch ingevuld."
+ },
+ "experimentalFeature": {
+ "message": "Dit is momenteel een experimentele functie; gebruik hiervan is op eigen risico."
+ },
+ "defaultAutoFillOnPageLoad": {
+ "message": "Standaardinstelling voor automatisch invullen login-items"
+ },
+ "defaultAutoFillOnPageLoadDesc": {
+ "message": "Na het inschakelen van Automatisch invullen bij laden van pagina, kun je de functie voor individuele inlogitems in- of uitschakelen. Dit is de standaardinstelling voor inlogitems die niet afzonderlijk zijn geconfigureerd."
+ },
+ "itemAutoFillOnPageLoad": {
+ "message": "Automatisch invullen bij laden van pagina (als ingeschakeld in Opties)"
+ },
+ "autoFillOnPageLoadUseDefault": {
+ "message": "Standaardinstelling gebruiken"
+ },
+ "autoFillOnPageLoadYes": {
+ "message": "Automatisch invullen bij laden van pagina"
+ },
+ "autoFillOnPageLoadNo": {
+ "message": "Niet Automatisch invullen bij laden van pagina"
+ },
+ "commandOpenPopup": {
+ "message": "Open kluis in pop-up"
+ },
+ "commandOpenSidebar": {
+ "message": "Open kluis in zijbalk"
+ },
+ "commandAutofillDesc": {
+ "message": "Vul automatisch de laatst gebruikte login in voor de huidige website"
+ },
+ "commandGeneratePasswordDesc": {
+ "message": "Genereer en kopieer een nieuw willekeurig wachtwoord naar het klembord."
+ },
+ "commandLockVaultDesc": {
+ "message": "Kluis vergrendelen"
+ },
+ "privateModeMessage": {
+ "message": "Dit scherm is helaas niet beschikbaar in het privévenster van deze browser."
+ },
+ "customFields": {
+ "message": "Aangepaste velden"
+ },
+ "copyValue": {
+ "message": "Waarde kopiëren"
+ },
+ "value": {
+ "message": "Waarde"
+ },
+ "newCustomField": {
+ "message": "Nieuw aangepast veld"
+ },
+ "dragToSort": {
+ "message": "Slepen om te sorteren"
+ },
+ "cfTypeText": {
+ "message": "Tekst"
+ },
+ "cfTypeHidden": {
+ "message": "Verborgen"
+ },
+ "cfTypeBoolean": {
+ "message": "Boolean"
+ },
+ "popup2faCloseMessage": {
+ "message": "Als je buiten het pop-upvenster klikt om je e-mail te controleren op een verificatiecode, dan zal de pop-up sluiten. Wil je het pop-upvenster openen in een nieuw scherm, zodat het niet wordt gesloten?"
+ },
+ "popupU2fCloseMessage": {
+ "message": "Deze browser kan U2F-verzoeken niet verwerken in dit popupvenster. Wilt je deze pop-up openen in een nieuw venster zodat je kunt inloggen met U2F?"
+ },
+ "disableFavicon": {
+ "message": "Websitepictogrammen uitschakelen"
+ },
+ "disableFaviconDesc": {
+ "message": "Websitepictogrammen geven een herkenbare afbeelding naast elk item in je kluis weer."
+ },
+ "disableBadgeCounter": {
+ "message": "Badgeteller uitschakelen"
+ },
+ "disableBadgeCounterDesc": {
+ "message": "De badgeteller geeft aan hoeveel logins je in je kluis hebt voor de huidige pagina."
+ },
+ "cardholderName": {
+ "message": "Naam kaarthouder"
+ },
+ "number": {
+ "message": "Kaartummer"
+ },
+ "brand": {
+ "message": "Merk"
+ },
+ "expirationMonth": {
+ "message": "Vervalmaand"
+ },
+ "expirationYear": {
+ "message": "Vervaljaar"
+ },
+ "expiration": {
+ "message": "Vervaldatum"
+ },
+ "january": {
+ "message": "januari"
+ },
+ "february": {
+ "message": "februari"
+ },
+ "march": {
+ "message": "maart"
+ },
+ "april": {
+ "message": "april"
+ },
+ "may": {
+ "message": "mei"
+ },
+ "june": {
+ "message": "juni"
+ },
+ "july": {
+ "message": "juli"
+ },
+ "august": {
+ "message": "augustus"
+ },
+ "september": {
+ "message": "september"
+ },
+ "october": {
+ "message": "oktober"
+ },
+ "november": {
+ "message": "november"
+ },
+ "december": {
+ "message": "december"
+ },
+ "securityCode": {
+ "message": "Beveiligingscode"
+ },
+ "ex": {
+ "message": "bijv."
+ },
+ "title": {
+ "message": "Aanhef"
+ },
+ "mr": {
+ "message": "Dhr."
+ },
+ "mrs": {
+ "message": "Mevr."
+ },
+ "ms": {
+ "message": "Mej."
+ },
+ "dr": {
+ "message": "Dr."
+ },
+ "firstName": {
+ "message": "Voornaam"
+ },
+ "middleName": {
+ "message": "Tweede naam"
+ },
+ "lastName": {
+ "message": "Achternaam"
+ },
+ "identityName": {
+ "message": "Identiteitsnaam"
+ },
+ "company": {
+ "message": "Bedrijf"
+ },
+ "ssn": {
+ "message": "Burgerservicenummer"
+ },
+ "passportNumber": {
+ "message": "Paspoortnummer"
+ },
+ "licenseNumber": {
+ "message": "Rijbewijsnummer"
+ },
+ "email": {
+ "message": "E-mailadres"
+ },
+ "phone": {
+ "message": "Telefoonnummer"
+ },
+ "address": {
+ "message": "Adres"
+ },
+ "address1": {
+ "message": "Adres 1"
+ },
+ "address2": {
+ "message": "Adres 2"
+ },
+ "address3": {
+ "message": "Adres 3"
+ },
+ "cityTown": {
+ "message": "Stad / gemeente"
+ },
+ "stateProvince": {
+ "message": "Staat / provincie"
+ },
+ "zipPostalCode": {
+ "message": "Postcode"
+ },
+ "country": {
+ "message": "Land"
+ },
+ "type": {
+ "message": "Categorie"
+ },
+ "typeLogin": {
+ "message": "Login"
+ },
+ "typeLogins": {
+ "message": "Logins"
+ },
+ "typeSecureNote": {
+ "message": "Veilige notitie"
+ },
+ "typeCard": {
+ "message": "Kaart"
+ },
+ "typeIdentity": {
+ "message": "Identiteit"
+ },
+ "passwordHistory": {
+ "message": "Geschiedenis"
+ },
+ "back": {
+ "message": "Terug"
+ },
+ "collections": {
+ "message": "Verzamelingen"
+ },
+ "favorites": {
+ "message": "Favorieten"
+ },
+ "popOutNewWindow": {
+ "message": "Openen in een nieuw venster"
+ },
+ "refresh": {
+ "message": "Verversen"
+ },
+ "cards": {
+ "message": "Kaarten"
+ },
+ "identities": {
+ "message": "Identiteiten"
+ },
+ "logins": {
+ "message": "Logins"
+ },
+ "secureNotes": {
+ "message": "Veilige notities"
+ },
+ "clear": {
+ "message": "Wissen",
+ "description": "To clear something out. example: To clear browser history."
+ },
+ "checkPassword": {
+ "message": "Controleer of wachtwoord is gelekt."
+ },
+ "passwordExposed": {
+ "message": "Dit wachtwoord is $VALUE$ keer gelekt. Je zou het moeten veranderen.",
+ "placeholders": {
+ "value": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "passwordSafe": {
+ "message": "Dit wachtwoord is niet gevonden in bekende gegevenslekken. Het kan veilig gebruikt worden."
+ },
+ "baseDomain": {
+ "message": "Basisdomein"
+ },
+ "host": {
+ "message": "Hostnaam",
+ "description": "A URL's host value. For example, the host of https://sub.domain.com:443 is 'sub.domain.com:443'."
+ },
+ "exact": {
+ "message": "Exact"
+ },
+ "startsWith": {
+ "message": "Begint met"
+ },
+ "regEx": {
+ "message": "Reguliere expressie",
+ "description": "A programming term, also known as 'RegEx'."
+ },
+ "matchDetection": {
+ "message": "Overeenkomstdetectie",
+ "description": "URI match detection for auto-fill."
+ },
+ "defaultMatchDetection": {
+ "message": "Standaard overeenkomstdetectie",
+ "description": "Default URI match detection for auto-fill."
+ },
+ "toggleOptions": {
+ "message": "Opties schakelen"
+ },
+ "toggleCurrentUris": {
+ "message": "Huidige URI's wisselen",
+ "description": "Toggle the display of the URIs of the currently open tabs in the browser."
+ },
+ "currentUri": {
+ "message": "Huidige URI",
+ "description": "The URI of one of the current open tabs in the browser."
+ },
+ "organization": {
+ "message": "Organisatie",
+ "description": "An entity of multiple related people (ex. a team or business organization)."
+ },
+ "types": {
+ "message": "Categorieën"
+ },
+ "allItems": {
+ "message": "Alle items"
+ },
+ "noPasswordsInList": {
+ "message": "Er zijn geen wachtwoorden om weer te geven."
+ },
+ "remove": {
+ "message": "Verwijderen"
+ },
+ "default": {
+ "message": "Standaard"
+ },
+ "dateUpdated": {
+ "message": "Bijgewerkt",
+ "description": "ex. Date this item was updated"
+ },
+ "datePasswordUpdated": {
+ "message": "Wachtwoord bijgewerkt",
+ "description": "ex. Date this password was updated"
+ },
+ "neverLockWarning": {
+ "message": "Weet je zeker dat je de optie \"Nooit\" wilt gebruiken? Met de vergrendelingsoptie \"Nooit\" wordt de coderingssleutel van je kluis op je apparaat bewaard. Als je deze optie gebruikt, moet je ervoor zorgen dat je je apparaat naar behoren beschermt."
+ },
+ "noOrganizationsList": {
+ "message": "Je behoort niet tot een organisatie. Via organisaties deel je je items veilig met andere gebruikers."
+ },
+ "noCollectionsInList": {
+ "message": "Er zijn geen verzamelingen om weer te geven."
+ },
+ "ownership": {
+ "message": "Eigendom"
+ },
+ "whoOwnsThisItem": {
+ "message": "Wie is eigenaar van dit item?"
+ },
+ "strong": {
+ "message": "Sterk",
+ "description": "ex. A strong password. Scale: Weak -> Good -> Strong"
+ },
+ "good": {
+ "message": "Goed",
+ "description": "ex. A good password. Scale: Weak -> Good -> Strong"
+ },
+ "weak": {
+ "message": "Zwak",
+ "description": "ex. A weak password. Scale: Weak -> Good -> Strong"
+ },
+ "weakMasterPassword": {
+ "message": "Zwak hoofdwachtwoord"
+ },
+ "weakMasterPasswordDesc": {
+ "message": "Je hebt een zwak hoofdwachtwoord gekozen. Gebruik een sterk hoofdwachtwoord (of wachtwoordzin) om jouw Bitwarden-account goed te beschermen. Weet je zeker dat je dit hoofdwachtwoord wilt gebruiken?"
+ },
+ "pin": {
+ "message": "PIN-code",
+ "description": "PIN code. Ex. The short code (often numeric) that you use to unlock a device."
+ },
+ "unlockWithPin": {
+ "message": "Ontgrendelen met PIN"
+ },
+ "setYourPinCode": {
+ "message": "Stel je PIN-code in voor het ontgrendelen van Bitwarden. Je PIN-code wordt opnieuw ingesteld als je je ooit volledig afmeldt bij de applicatie."
+ },
+ "pinRequired": {
+ "message": "PIN-code is vereist."
+ },
+ "invalidPin": {
+ "message": "Ongeldige PIN-code."
+ },
+ "verifyPin": {
+ "message": "PIN-code invoeren"
+ },
+ "yourVaultIsLockedPinCode": {
+ "message": "Je kluis is vergrendeld. Voer je PIN-code in om door te gaan."
+ },
+ "unlockWithBiometrics": {
+ "message": "Biometrisch ontgrendelen"
+ },
+ "awaitDesktop": {
+ "message": "Wacht op bevestiging van de desktop"
+ },
+ "awaitDesktopDesc": {
+ "message": "Bevestig het gebruik van biometrie in de Bitwarden-desktopapplicatie om biometrie voor de browser in te schakelen."
+ },
+ "lockWithMasterPassOnRestart": {
+ "message": "Vergrendelen met hoofdwachtwoord bij herstart browser"
+ },
+ "selectOneCollection": {
+ "message": "Je moet tenminste één verzameling selecteren."
+ },
+ "cloneItem": {
+ "message": "Item dupliceren"
+ },
+ "clone": {
+ "message": "Dupliceren"
+ },
+ "passwordGeneratorPolicyInEffect": {
+ "message": "Een of meer organisatiebeleidseisen heeft invloed op de instellingen van je generator."
+ },
+ "vaultTimeoutAction": {
+ "message": "Actie bij time-out"
+ },
+ "lock": {
+ "message": "Vergrendelen",
+ "description": "Verb form: to make secure or inaccesible by"
+ },
+ "trash": {
+ "message": "Prullenbak",
+ "description": "Noun: a special folder to hold deleted items"
+ },
+ "searchTrash": {
+ "message": "Prullenbak doorzoeken"
+ },
+ "permanentlyDeleteItem": {
+ "message": "Item definitief verwijderen"
+ },
+ "permanentlyDeleteItemConfirmation": {
+ "message": "Weet je zeker dat je dit item definitief wilt verwijderen?"
+ },
+ "permanentlyDeletedItem": {
+ "message": "Definitief verwijderd item"
+ },
+ "restoreItem": {
+ "message": "Item herstellen"
+ },
+ "restoreItemConfirmation": {
+ "message": "Weet je zeker dat je dit item wilt herstellen?"
+ },
+ "restoredItem": {
+ "message": "Hersteld item"
+ },
+ "vaultTimeoutLogOutConfirmation": {
+ "message": "Uitloggen ontneemt je de toegang tot je kluis en vereist online authenticatie na een periode van time-out. Weet je zeker dat je deze instelling wilt gebruiken?"
+ },
+ "vaultTimeoutLogOutConfirmationTitle": {
+ "message": "Bevestiging actie bij time-out"
+ },
+ "autoFillAndSave": {
+ "message": "Automatisch invullen en opslaan"
+ },
+ "autoFillSuccessAndSavedUri": {
+ "message": "Automatisch gevuld item en opgeslagen URI"
+ },
+ "autoFillSuccess": {
+ "message": "Automatisch gevuld item"
+ },
+ "setMasterPassword": {
+ "message": "Hoofdwachtwoord instellen"
+ },
+ "masterPasswordPolicyInEffect": {
+ "message": "Een of meer organisatiebeleidseisen verlangen dat je hoofdwachtwoord voldoet aan:"
+ },
+ "policyInEffectMinComplexity": {
+ "message": "Minimale complexiteitsscore van $SCORE$",
+ "placeholders": {
+ "score": {
+ "content": "$1",
+ "example": "4"
+ }
+ }
+ },
+ "policyInEffectMinLength": {
+ "message": "Minimale lengte van $LENGTH$",
+ "placeholders": {
+ "length": {
+ "content": "$1",
+ "example": "14"
+ }
+ }
+ },
+ "policyInEffectUppercase": {
+ "message": "Bevat een of meer hoofdletters"
+ },
+ "policyInEffectLowercase": {
+ "message": "Bevat een of meer kleine letters"
+ },
+ "policyInEffectNumbers": {
+ "message": "Bevat een of meer cijfers"
+ },
+ "policyInEffectSpecial": {
+ "message": "Bevat een of meer van de volgende speciale tekens $CHARS$",
+ "placeholders": {
+ "chars": {
+ "content": "$1",
+ "example": "!@#$%^&*"
+ }
+ }
+ },
+ "masterPasswordPolicyRequirementsNotMet": {
+ "message": "Je nieuwe hoofdwachtwoord voldoet niet aan de beleidseisen."
+ },
+ "acceptPolicies": {
+ "message": "Door dit vakje aan te vinken, ga je akkoord met het volgende:"
+ },
+ "acceptPoliciesError": {
+ "message": "Algemene voorwaarden en privacybeleid zijn nog niet erkend."
+ },
+ "termsOfService": {
+ "message": "Algemene voorwaarden"
+ },
+ "privacyPolicy": {
+ "message": "Privacybeleid"
+ },
+ "hintEqualsPassword": {
+ "message": "Je wachtwoordhint moet anders zijn dan je wachtwoord."
+ },
+ "ok": {
+ "message": "Ok"
+ },
+ "desktopSyncVerificationTitle": {
+ "message": "Desktopsynchronisatieverificatie"
+ },
+ "desktopIntegrationVerificationText": {
+ "message": "Controleer of de desktopapplicatie deze vingerafdruk weergeeft: "
+ },
+ "desktopIntegrationDisabledTitle": {
+ "message": "Browserintegratie is niet ingeschakeld"
+ },
+ "desktopIntegrationDisabledDesc": {
+ "message": "Browserintegratie is niet ingeschakeld in de Bitwarden-desktopapplicatie. Schakel deze optie in de instellingen binnen de desktop-applicatie in."
+ },
+ "startDesktopTitle": {
+ "message": "Bitwarden-desktopapplicatie opstarten"
+ },
+ "startDesktopDesc": {
+ "message": "Je moet de Bitwarden-desktopapplicatie starten om deze functie te gebruiken."
+ },
+ "errorEnableBiometricTitle": {
+ "message": "Kon biometrie niet inschakelen"
+ },
+ "errorEnableBiometricDesc": {
+ "message": "Actie is geannuleerd door de desktopapplicatie"
+ },
+ "nativeMessagingInvalidEncryptionDesc": {
+ "message": "De desktopapplicatie heeft het beveiligde communicatiekanaal ongeldig verklaard. Probeer het opnieuw"
+ },
+ "nativeMessagingInvalidEncryptionTitle": {
+ "message": "Desktopcommunicatie onderbroken"
+ },
+ "nativeMessagingWrongUserDesc": {
+ "message": "De desktopapplicatie is aangemeld bij een ander account. Zorg ervoor dat beide applicaties op hetzelfde account zijn aangemeld."
+ },
+ "nativeMessagingWrongUserTitle": {
+ "message": "Accounts komt niet overeen"
+ },
+ "biometricsNotEnabledTitle": {
+ "message": "Biometrie niet ingeschakeld"
+ },
+ "biometricsNotEnabledDesc": {
+ "message": "Voor browserbiometrie moet je eerst desktopbiometrie inschakelen in de instellingen."
+ },
+ "biometricsNotSupportedTitle": {
+ "message": "Biometrie niet ondersteund"
+ },
+ "biometricsNotSupportedDesc": {
+ "message": "Dit apparaat ondersteunt geen browserbiometrie."
+ },
+ "nativeMessaginPermissionErrorTitle": {
+ "message": "Toestemming niet verleend"
+ },
+ "nativeMessaginPermissionErrorDesc": {
+ "message": "Zonder toestemming om te communiceren met de Bitwarden Desktop-applicatie, kunnen we biometrisch inloggen in de browserextensie niet leveren. Probeer het opnieuw."
+ },
+ "nativeMessaginPermissionSidebarTitle": {
+ "message": "Fout bij toestemmingsaanvraag"
+ },
+ "nativeMessaginPermissionSidebarDesc": {
+ "message": "Deze actie kan niet worden uitgevoerd in de zijbalk, probeer de actie opnieuw in de pop-up of pop-out."
+ },
+ "personalOwnershipSubmitError": {
+ "message": "Wegens bedrijfsbeleid mag je geen wachtwoorden opslaan in je persoonlijke kluis. Verander het eigenaarschap naar een organisatie en kies uit een van de beschikbare collecties."
+ },
+ "personalOwnershipPolicyInEffect": {
+ "message": "Een organisatiebeleid heeft invloed op je eigendomsopties."
+ },
+ "excludedDomains": {
+ "message": "Uitgesloten domeinen"
+ },
+ "excludedDomainsDesc": {
+ "message": "Bitwarden zal voor deze domeinen niet vragen om inloggegevens op te slaan. Je moet de pagina vernieuwen om de wijzigingen toe te passen."
+ },
+ "excludedDomainsInvalidDomain": {
+ "message": "$DOMAIN$ is geen geldig domein",
+ "placeholders": {
+ "domain": {
+ "content": "$1",
+ "example": "googlecom"
+ }
+ }
+ },
+ "send": {
+ "message": "Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "searchSends": {
+ "message": "Sends zoeken",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "addSend": {
+ "message": "Send toevoegen",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTypeText": {
+ "message": "Tekst"
+ },
+ "sendTypeFile": {
+ "message": "Bestand"
+ },
+ "allSends": {
+ "message": "Alle Sends",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "maxAccessCountReached": {
+ "message": "Maximum aantal keren benaderd"
+ },
+ "expired": {
+ "message": "Verlopen"
+ },
+ "pendingDeletion": {
+ "message": "Wordt verwijderd"
+ },
+ "passwordProtected": {
+ "message": "Beveiligd met wachtwoord"
+ },
+ "copySendLink": {
+ "message": "Send-link kopiëren",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "removePassword": {
+ "message": "Wachtwoord verwijderen"
+ },
+ "delete": {
+ "message": "Verwijderen"
+ },
+ "removedPassword": {
+ "message": "Verwijderd wachtwoord"
+ },
+ "deletedSend": {
+ "message": "Verwijderde Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendLink": {
+ "message": "Send-link",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "disabled": {
+ "message": "Uitgeschakeld"
+ },
+ "removePasswordConfirmation": {
+ "message": "Weet je zeker dat je het wachtwoord wilt verwijderen?"
+ },
+ "deleteSend": {
+ "message": "Send verwijderen",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "deleteSendConfirmation": {
+ "message": "Weet je zeker dat je deze Send wilt verwijderen?",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "editSend": {
+ "message": "Send bewerken",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTypeHeader": {
+ "message": "Wat voor soort Send is dit?",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendNameDesc": {
+ "message": "Een vriendelijke naam om deze Send te beschrijven.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendFileDesc": {
+ "message": "Het bestand dat je wilt versturen."
+ },
+ "deletionDate": {
+ "message": "Verwijderingsdatum"
+ },
+ "deletionDateDesc": {
+ "message": "Deze Send wordt op de aangegeven datum en tijd definitief verwijderd.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "expirationDate": {
+ "message": "Vervaldatum"
+ },
+ "expirationDateDesc": {
+ "message": "Als dit is ingesteld verloopt deze Send op een specifieke datum en tijd.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "oneDay": {
+ "message": "1 dag"
+ },
+ "days": {
+ "message": "$DAYS$ dagen",
+ "placeholders": {
+ "days": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "custom": {
+ "message": "Aangepast"
+ },
+ "maximumAccessCount": {
+ "message": "Maximum toegangsaantal"
+ },
+ "maximumAccessCountDesc": {
+ "message": "Als dit is ingesteld kunnen gebruikers deze Send niet meer benaderen zodra het maximale aantal toegang is bereikt.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendPasswordDesc": {
+ "message": "Vereis optioneel een wachtwoord voor gebruikers om toegang te krijgen tot deze Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendNotesDesc": {
+ "message": "Privénotities over deze Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendDisableDesc": {
+ "message": "Schakel deze Send uit zodat niemand hem kan benaderen.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendShareDesc": {
+ "message": "Kopieer de link van deze Send bij het opslaan naar het klembord.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTextDesc": {
+ "message": "De tekst die je wilt versturen."
+ },
+ "sendHideText": {
+ "message": "De tekst van deze Send standaard verbergen.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "currentAccessCount": {
+ "message": "Huidige toegangsaantal"
+ },
+ "createSend": {
+ "message": "Nieuwe Send aanmaken",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "newPassword": {
+ "message": "Nieuw wachtwoord"
+ },
+ "sendDisabled": {
+ "message": "Send uitgeschakeld",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendDisabledWarning": {
+ "message": "Als gevolg van een ondernemingsbeleid kun je alleen een bestaande Send verwijderen.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "createdSend": {
+ "message": "Send aangemaakt",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "editedSend": {
+ "message": "Send bewerkt",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendLinuxChromiumFileWarning": {
+ "message": "Om een bestand te kiezen open je de extensie in de zijbalk (indien mogelijk) of pop-out naar een nieuw venster door op deze banner te klikken."
+ },
+ "sendFirefoxFileWarning": {
+ "message": "Om een bestand te kiezen met Firefox, open je de extensie in de zijbalk of als pop-up in een nieuw venster door op deze banner te klikken."
+ },
+ "sendSafariFileWarning": {
+ "message": "Om een bestand te kiezen met Safari, open je een nieuw pop-up-venster door op deze banner te klikken."
+ },
+ "sendFileCalloutHeader": {
+ "message": "Voor je begint"
+ },
+ "sendFirefoxCustomDatePopoutMessage1": {
+ "message": "Om een datumkiezer in kalenderstijl te gebruiken",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read '**To use a calendar style date picker ** click here to pop out your window.'"
+ },
+ "sendFirefoxCustomDatePopoutMessage2": {
+ "message": "klik hier",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker **click here** to pop out your window.'"
+ },
+ "sendFirefoxCustomDatePopoutMessage3": {
+ "message": "om een pop-up te openen.",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker click here **to pop out your window.**'"
+ },
+ "expirationDateIsInvalid": {
+ "message": "De opgegeven vervaldatum is niet geldig."
+ },
+ "deletionDateIsInvalid": {
+ "message": "De opgegeven verwijderdatum is niet geldig."
+ },
+ "expirationDateAndTimeRequired": {
+ "message": "Een vervaldatum en -tijd zijn vereist."
+ },
+ "deletionDateAndTimeRequired": {
+ "message": "Een verwijderingsdatum en -tijd zijn vereist."
+ },
+ "dateParsingError": {
+ "message": "Er is een fout opgetreden bij het opslaan van je verwijder- en vervaldatum."
+ },
+ "hideEmail": {
+ "message": "Verberg mijn e-mailadres voor ontvangers."
+ },
+ "sendOptionsPolicyInEffect": {
+ "message": "Een of meer organisatiebeleidseisen heeft invloed op de mogelijkheden van je Send."
+ },
+ "passwordPrompt": {
+ "message": "Hoofdwachtwoord opnieuw vragen"
+ },
+ "passwordConfirmation": {
+ "message": "Hoofdwachtwoord bevestigen"
+ },
+ "passwordConfirmationDesc": {
+ "message": "Deze actie is beveiligd. Voer je hoofdwachtwoord opnieuw in om je identiteit vast te stellen en door te gaan."
+ },
+ "emailVerificationRequired": {
+ "message": "E-mailverificatie vereist"
+ },
+ "emailVerificationRequiredDesc": {
+ "message": "Je moet je e-mailadres verifiëren om deze functie te gebruiken. Je kunt je e-mailadres verifiëren in de kluis."
+ },
+ "updatedMasterPassword": {
+ "message": "Hoofdwachtwoord bijgewerkt"
+ },
+ "updateMasterPassword": {
+ "message": "Hoofdwachtwoord bijgewerken"
+ },
+ "updateMasterPasswordWarning": {
+ "message": "Je hoofdwachtwoord is onlangs veranderd door een beheerder in jouw organisatie. Om toegang te krijgen tot de kluis, moet je deze nu bijwerken. Doorgaan zal je huidige sessie uitloggen, waarna je opnieuw moet inloggen. Actieve sessies op andere apparaten blijven mogelijk nog een uur actief."
+ },
+ "resetPasswordPolicyAutoEnroll": {
+ "message": "Automatische inschrijving"
+ },
+ "resetPasswordAutoEnrollInviteWarning": {
+ "message": "Deze organisatie heeft een ondernemingsbeleid dat je automatisch inschrijft bij het resetten van je wachtwoord. Inschrijving stelt organisatiebeheerders in staat om je hoofdwachtwoord te wijzigen."
+ },
+ "selectFolder": {
+ "message": "Map selecteren..."
+ },
+ "ssoCompleteRegistration": {
+ "message": "Voor het inloggen met SSO moet je een hoofdwachtwoord instellen voor toegang tot en bescherming van je kluis."
+ },
+ "hours": {
+ "message": "Uren"
+ },
+ "minutes": {
+ "message": "Minuten"
+ },
+ "vaultTimeoutPolicyInEffect": {
+ "message": "Het beleid van je organisatie heeft invloed op de time-out van je kluis. De maximaal toegestane Kluis Time-out is $HOURS$ uur en $MINUTES$ minuten",
+ "placeholders": {
+ "hours": {
+ "content": "$1",
+ "example": "5"
+ },
+ "minutes": {
+ "content": "$2",
+ "example": "5"
+ }
+ }
+ },
+ "vaultTimeoutToLarge": {
+ "message": "Je kluis time-out is hoger dan het maximum van jouw organisatie."
+ },
+ "vaultExportDisabled": {
+ "message": "Kluis exporteren uitgeschakeld"
+ },
+ "personalVaultExportPolicyInEffect": {
+ "message": "Organisatiebeleid voorkomt dat je je persoonlijke kluis exporteert."
+ },
+ "copyCustomFieldNameInvalidElement": {
+ "message": "Kan geen geldig formulierelement identificeren. Probeer in plaats daarvan de HTML te inspecteren."
+ },
+ "copyCustomFieldNameNotUnique": {
+ "message": "Geen unieke id gevonden."
+ }
+}
diff --git a/src/iOS.Safari/Resources/_locales/nn/messages.json b/src/iOS.Safari/Resources/_locales/nn/messages.json
new file mode 100644
index 000000000..af284dde2
--- /dev/null
+++ b/src/iOS.Safari/Resources/_locales/nn/messages.json
@@ -0,0 +1,1817 @@
+{
+ "appName": {
+ "message": "Bitwarden"
+ },
+ "extName": {
+ "message": "Bitwarden - Free Password Manager",
+ "description": "Extension name, MUST be less than 40 characters (Safari restriction)"
+ },
+ "extDesc": {
+ "message": "A secure and free password manager for all of your devices.",
+ "description": "Extension description"
+ },
+ "loginOrCreateNewAccount": {
+ "message": "Log in or create a new account to access your secure vault."
+ },
+ "createAccount": {
+ "message": "Create Account"
+ },
+ "login": {
+ "message": "Log In"
+ },
+ "enterpriseSingleSignOn": {
+ "message": "Enterprise Single Sign-On"
+ },
+ "cancel": {
+ "message": "Cancel"
+ },
+ "close": {
+ "message": "Close"
+ },
+ "submit": {
+ "message": "Submit"
+ },
+ "emailAddress": {
+ "message": "Email Address"
+ },
+ "masterPass": {
+ "message": "Master Password"
+ },
+ "masterPassDesc": {
+ "message": "The master password is the password you use to access your vault. It is very important that you do not forget your master password. There is no way to recover the password in the event that you forget it."
+ },
+ "masterPassHintDesc": {
+ "message": "A master password hint can help you remember your password if you forget it."
+ },
+ "reTypeMasterPass": {
+ "message": "Re-type Master Password"
+ },
+ "masterPassHint": {
+ "message": "Master Password Hint (optional)"
+ },
+ "tab": {
+ "message": "Tab"
+ },
+ "myVault": {
+ "message": "My Vault"
+ },
+ "tools": {
+ "message": "Tools"
+ },
+ "settings": {
+ "message": "Settings"
+ },
+ "currentTab": {
+ "message": "Current Tab"
+ },
+ "copyPassword": {
+ "message": "Copy Password"
+ },
+ "copyNote": {
+ "message": "Copy Note"
+ },
+ "copyUri": {
+ "message": "Copy URI"
+ },
+ "copyUsername": {
+ "message": "Copy Username"
+ },
+ "copyNumber": {
+ "message": "Copy Number"
+ },
+ "copySecurityCode": {
+ "message": "Copy Security Code"
+ },
+ "autoFill": {
+ "message": "Auto-fill"
+ },
+ "generatePasswordCopied": {
+ "message": "Generate Password (copied)"
+ },
+ "copyElementIdentifier": {
+ "message": "Copy Custom Field Name"
+ },
+ "noMatchingLogins": {
+ "message": "No matching logins."
+ },
+ "vaultLocked": {
+ "message": "Vault is locked."
+ },
+ "vaultLoggedOut": {
+ "message": "Vault is logged out."
+ },
+ "autoFillInfo": {
+ "message": "There are no logins available to auto-fill for the current browser tab."
+ },
+ "addLogin": {
+ "message": "Add a Login"
+ },
+ "addItem": {
+ "message": "Add Item"
+ },
+ "passwordHint": {
+ "message": "Password Hint"
+ },
+ "enterEmailToGetHint": {
+ "message": "Enter your account email address to receive your master password hint."
+ },
+ "getMasterPasswordHint": {
+ "message": "Get master password hint"
+ },
+ "continue": {
+ "message": "Continue"
+ },
+ "verificationCode": {
+ "message": "Verification Code"
+ },
+ "account": {
+ "message": "Account"
+ },
+ "changeMasterPassword": {
+ "message": "Change Master Password"
+ },
+ "fingerprintPhrase": {
+ "message": "Fingerprint Phrase",
+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
+ },
+ "yourAccountsFingerprint": {
+ "message": "Your account's fingerprint phrase",
+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
+ },
+ "twoStepLogin": {
+ "message": "Two-step Login"
+ },
+ "logOut": {
+ "message": "Log Out"
+ },
+ "about": {
+ "message": "About"
+ },
+ "version": {
+ "message": "Version"
+ },
+ "save": {
+ "message": "Save"
+ },
+ "move": {
+ "message": "Move"
+ },
+ "addFolder": {
+ "message": "Add Folder"
+ },
+ "name": {
+ "message": "Name"
+ },
+ "editFolder": {
+ "message": "Edit Folder"
+ },
+ "deleteFolder": {
+ "message": "Delete Folder"
+ },
+ "folders": {
+ "message": "Folders"
+ },
+ "noFolders": {
+ "message": "There are no folders to list."
+ },
+ "helpFeedback": {
+ "message": "Help & Feedback"
+ },
+ "sync": {
+ "message": "Sync"
+ },
+ "syncVaultNow": {
+ "message": "Sync Vault Now"
+ },
+ "lastSync": {
+ "message": "Last Sync:"
+ },
+ "passGen": {
+ "message": "Password Generator"
+ },
+ "generator": {
+ "message": "Generator",
+ "description": "Short for 'Password Generator'."
+ },
+ "passGenInfo": {
+ "message": "Automatically generate strong, unique passwords for your logins."
+ },
+ "bitWebVault": {
+ "message": "Bitwarden Web Vault"
+ },
+ "importItems": {
+ "message": "Import Items"
+ },
+ "select": {
+ "message": "Select"
+ },
+ "generatePassword": {
+ "message": "Generate Password"
+ },
+ "regeneratePassword": {
+ "message": "Regenerate Password"
+ },
+ "options": {
+ "message": "Options"
+ },
+ "length": {
+ "message": "Length"
+ },
+ "numWords": {
+ "message": "Number of Words"
+ },
+ "wordSeparator": {
+ "message": "Word Separator"
+ },
+ "capitalize": {
+ "message": "Capitalize",
+ "description": "Make the first letter of a work uppercase."
+ },
+ "includeNumber": {
+ "message": "Include Number"
+ },
+ "minNumbers": {
+ "message": "Minimum Numbers"
+ },
+ "minSpecial": {
+ "message": "Minimum Special"
+ },
+ "avoidAmbChar": {
+ "message": "Avoid Ambiguous Characters"
+ },
+ "searchVault": {
+ "message": "Search vault"
+ },
+ "edit": {
+ "message": "Edit"
+ },
+ "view": {
+ "message": "View"
+ },
+ "noItemsInList": {
+ "message": "There are no items to list."
+ },
+ "itemInformation": {
+ "message": "Item Information"
+ },
+ "username": {
+ "message": "Username"
+ },
+ "password": {
+ "message": "Password"
+ },
+ "passphrase": {
+ "message": "Passphrase"
+ },
+ "favorite": {
+ "message": "Favorite"
+ },
+ "notes": {
+ "message": "Notes"
+ },
+ "note": {
+ "message": "Note"
+ },
+ "editItem": {
+ "message": "Edit Item"
+ },
+ "folder": {
+ "message": "Folder"
+ },
+ "deleteItem": {
+ "message": "Delete Item"
+ },
+ "viewItem": {
+ "message": "View Item"
+ },
+ "launch": {
+ "message": "Launch"
+ },
+ "website": {
+ "message": "Website"
+ },
+ "toggleVisibility": {
+ "message": "Toggle Visibility"
+ },
+ "manage": {
+ "message": "Manage"
+ },
+ "other": {
+ "message": "Other"
+ },
+ "rateExtension": {
+ "message": "Rate the Extension"
+ },
+ "rateExtensionDesc": {
+ "message": "Please consider helping us out with a good review!"
+ },
+ "browserNotSupportClipboard": {
+ "message": "Your web browser does not support easy clipboard copying. Copy it manually instead."
+ },
+ "verifyMasterPassword": {
+ "message": "Verify Master Password"
+ },
+ "yourVaultIsLocked": {
+ "message": "Your vault is locked. Verify your master password to continue."
+ },
+ "unlock": {
+ "message": "Unlock"
+ },
+ "loggedInAsOn": {
+ "message": "Logged in as $EMAIL$ on $HOSTNAME$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "name@example.com"
+ },
+ "hostname": {
+ "content": "$2",
+ "example": "bitwarden.com"
+ }
+ }
+ },
+ "invalidMasterPassword": {
+ "message": "Invalid master password"
+ },
+ "vaultTimeout": {
+ "message": "Vault Timeout"
+ },
+ "lockNow": {
+ "message": "Lock Now"
+ },
+ "immediately": {
+ "message": "Immediately"
+ },
+ "tenSeconds": {
+ "message": "10 seconds"
+ },
+ "twentySeconds": {
+ "message": "20 seconds"
+ },
+ "thirtySeconds": {
+ "message": "30 seconds"
+ },
+ "oneMinute": {
+ "message": "1 minute"
+ },
+ "twoMinutes": {
+ "message": "2 minutes"
+ },
+ "fiveMinutes": {
+ "message": "5 minutes"
+ },
+ "fifteenMinutes": {
+ "message": "15 minutes"
+ },
+ "thirtyMinutes": {
+ "message": "30 minutes"
+ },
+ "oneHour": {
+ "message": "1 hour"
+ },
+ "fourHours": {
+ "message": "4 hours"
+ },
+ "onLocked": {
+ "message": "On System Lock"
+ },
+ "onRestart": {
+ "message": "On Browser Restart"
+ },
+ "never": {
+ "message": "Never"
+ },
+ "security": {
+ "message": "Security"
+ },
+ "errorOccurred": {
+ "message": "An error has occurred"
+ },
+ "emailRequired": {
+ "message": "Email address is required."
+ },
+ "invalidEmail": {
+ "message": "Invalid email address."
+ },
+ "masterPassRequired": {
+ "message": "Master password is required."
+ },
+ "masterPassLength": {
+ "message": "Master password must be at least 8 characters long."
+ },
+ "masterPassDoesntMatch": {
+ "message": "Master password confirmation does not match."
+ },
+ "newAccountCreated": {
+ "message": "Your new account has been created! You may now log in."
+ },
+ "masterPassSent": {
+ "message": "We've sent you an email with your master password hint."
+ },
+ "verificationCodeRequired": {
+ "message": "Verification code is required."
+ },
+ "valueCopied": {
+ "message": "$VALUE$ copied",
+ "description": "Value has been copied to the clipboard.",
+ "placeholders": {
+ "value": {
+ "content": "$1",
+ "example": "Password"
+ }
+ }
+ },
+ "autofillError": {
+ "message": "Unable to auto-fill the selected item on this page. Copy and paste the information instead."
+ },
+ "loggedOut": {
+ "message": "Logged out"
+ },
+ "loginExpired": {
+ "message": "Your login session has expired."
+ },
+ "logOutConfirmation": {
+ "message": "Are you sure you want to log out?"
+ },
+ "yes": {
+ "message": "Yes"
+ },
+ "no": {
+ "message": "No"
+ },
+ "unexpectedError": {
+ "message": "An unexpected error has occurred."
+ },
+ "nameRequired": {
+ "message": "Name is required."
+ },
+ "addedFolder": {
+ "message": "Added folder"
+ },
+ "changeMasterPass": {
+ "message": "Change Master Password"
+ },
+ "changeMasterPasswordConfirmation": {
+ "message": "You can change your master password on the bitwarden.com web vault. Do you want to visit the website now?"
+ },
+ "twoStepLoginConfirmation": {
+ "message": "Two-step login makes your account more secure by requiring you to verify your login with another device such as a security key, authenticator app, SMS, phone call, or email. Two-step login can be enabled on the bitwarden.com web vault. Do you want to visit the website now?"
+ },
+ "editedFolder": {
+ "message": "Edited folder"
+ },
+ "deleteFolderConfirmation": {
+ "message": "Are you sure you want to delete this folder?"
+ },
+ "deletedFolder": {
+ "message": "Deleted folder"
+ },
+ "gettingStartedTutorial": {
+ "message": "Getting Started Tutorial"
+ },
+ "gettingStartedTutorialVideo": {
+ "message": "Watch our getting started tutorial to learn how to get the most out of the browser extension."
+ },
+ "syncingComplete": {
+ "message": "Syncing complete"
+ },
+ "syncingFailed": {
+ "message": "Syncing failed"
+ },
+ "passwordCopied": {
+ "message": "Password copied"
+ },
+ "uri": {
+ "message": "URI"
+ },
+ "uriPosition": {
+ "message": "URI $POSITION$",
+ "description": "A listing of URIs. Ex: URI 1, URI 2, URI 3, etc.",
+ "placeholders": {
+ "position": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "newUri": {
+ "message": "New URI"
+ },
+ "addedItem": {
+ "message": "Added item"
+ },
+ "editedItem": {
+ "message": "Edited item"
+ },
+ "deleteItemConfirmation": {
+ "message": "Do you really want to send to the trash?"
+ },
+ "deletedItem": {
+ "message": "Sent item to trash"
+ },
+ "overwritePassword": {
+ "message": "Overwrite Password"
+ },
+ "overwritePasswordConfirmation": {
+ "message": "Are you sure you want to overwrite the current password?"
+ },
+ "searchFolder": {
+ "message": "Search folder"
+ },
+ "searchCollection": {
+ "message": "Search collection"
+ },
+ "searchType": {
+ "message": "Search type"
+ },
+ "noneFolder": {
+ "message": "No Folder",
+ "description": "This is the folder for uncategorized items"
+ },
+ "disableAddLoginNotification": {
+ "message": "Disable Add Login Notification"
+ },
+ "addLoginNotificationDesc": {
+ "message": "The \"Add Login Notification\" automatically prompts you to save new logins to your vault whenever you log into them for the first time."
+ },
+ "dontShowCardsCurrentTab": {
+ "message": "Don't Show Cards on Tab Page"
+ },
+ "dontShowCardsCurrentTabDesc": {
+ "message": "Card items from your vault are listed on the 'Current Tab' page for easy auto-fill access."
+ },
+ "dontShowIdentitiesCurrentTab": {
+ "message": "Don't Show Identities on Tab Page"
+ },
+ "dontShowIdentitiesCurrentTabDesc": {
+ "message": "Identity items from your vault are listed on the 'Current Tab' page for easy auto-fill access."
+ },
+ "clearClipboard": {
+ "message": "Clear Clipboard",
+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
+ },
+ "clearClipboardDesc": {
+ "message": "Automatically clear copied values from your clipboard.",
+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
+ },
+ "notificationAddDesc": {
+ "message": "Should Bitwarden remember this password for you?"
+ },
+ "notificationAddSave": {
+ "message": "Yes, Save Now"
+ },
+ "notificationNeverSave": {
+ "message": "Never for this website"
+ },
+ "disableChangedPasswordNotification": {
+ "message": "Disable Changed Password Notification"
+ },
+ "disableChangedPasswordNotificationDesc": {
+ "message": "The \"Changed Password Notification\" automatically prompts you to update a login's password in your vault whenever it detects that you have changed it on a website."
+ },
+ "notificationChangeDesc": {
+ "message": "Do you want to update this password in Bitwarden?"
+ },
+ "notificationChangeSave": {
+ "message": "Yes, Update Now"
+ },
+ "disableContextMenuItem": {
+ "message": "Disable Context Menu Options"
+ },
+ "disableContextMenuItemDesc": {
+ "message": "Context menu options provide quick access to password generation and logins for the website in your current tab."
+ },
+ "defaultUriMatchDetection": {
+ "message": "Default URI Match Detection",
+ "description": "Default URI match detection for auto-fill."
+ },
+ "defaultUriMatchDetectionDesc": {
+ "message": "Choose the default way that URI match detection is handled for logins when performing actions such as auto-fill."
+ },
+ "theme": {
+ "message": "Theme"
+ },
+ "themeDesc": {
+ "message": "Change the application's color theme."
+ },
+ "dark": {
+ "message": "Dark",
+ "description": "Dark color"
+ },
+ "light": {
+ "message": "Light",
+ "description": "Light color"
+ },
+ "solarizedDark": {
+ "message": "Solarized Dark",
+ "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated."
+ },
+ "exportVault": {
+ "message": "Export Vault"
+ },
+ "fileFormat": {
+ "message": "File Format"
+ },
+ "warning": {
+ "message": "WARNING",
+ "description": "WARNING (should stay in capitalized letters if the language permits)"
+ },
+ "confirmVaultExport": {
+ "message": "Confirm Vault Export"
+ },
+ "exportWarningDesc": {
+ "message": "This export contains your vault data in an unencrypted format. You should not store or send the exported file over unsecure channels (such as email). Delete it immediately after you are done using it."
+ },
+ "encExportKeyWarningDesc": {
+ "message": "This export encrypts your data using your account's encryption key. If you ever rotate your account's encryption key you should export again since you will not be able to decrypt this export file."
+ },
+ "encExportAccountWarningDesc": {
+ "message": "Account encryption keys are unique to each Bitwarden user account, so you can't import an encrypted export into a different account."
+ },
+ "exportMasterPassword": {
+ "message": "Enter your master password to export your vault data."
+ },
+ "shared": {
+ "message": "Shared"
+ },
+ "learnOrg": {
+ "message": "Learn about Organizations"
+ },
+ "learnOrgConfirmation": {
+ "message": "Bitwarden allows you to share your vault items with others by using an organization. Would you like to visit the bitwarden.com website to learn more?"
+ },
+ "moveToOrganization": {
+ "message": "Move to Organization"
+ },
+ "share": {
+ "message": "Share"
+ },
+ "movedItemToOrg": {
+ "message": "$ITEMNAME$ moved to $ORGNAME$",
+ "placeholders": {
+ "itemname": {
+ "content": "$1",
+ "example": "Secret Item"
+ },
+ "orgname": {
+ "content": "$2",
+ "example": "Company Name"
+ }
+ }
+ },
+ "moveToOrgDesc": {
+ "message": "Choose an organization that you wish to move this item to. Moving to an organization transfers ownership of the item to that organization. You will no longer be the direct owner of this item once it has been moved."
+ },
+ "learnMore": {
+ "message": "Learn more"
+ },
+ "authenticatorKeyTotp": {
+ "message": "Authenticator Key (TOTP)"
+ },
+ "verificationCodeTotp": {
+ "message": "Verification Code (TOTP)"
+ },
+ "copyVerificationCode": {
+ "message": "Copy Verification Code"
+ },
+ "attachments": {
+ "message": "Attachments"
+ },
+ "deleteAttachment": {
+ "message": "Delete attachment"
+ },
+ "deleteAttachmentConfirmation": {
+ "message": "Are you sure you want to delete this attachment?"
+ },
+ "deletedAttachment": {
+ "message": "Deleted attachment"
+ },
+ "newAttachment": {
+ "message": "Add New Attachment"
+ },
+ "noAttachments": {
+ "message": "No attachments."
+ },
+ "attachmentSaved": {
+ "message": "The attachment has been saved."
+ },
+ "file": {
+ "message": "File"
+ },
+ "selectFile": {
+ "message": "Select a file."
+ },
+ "maxFileSize": {
+ "message": "Maximum file size is 500 MB."
+ },
+ "featureUnavailable": {
+ "message": "Feature Unavailable"
+ },
+ "updateKey": {
+ "message": "You cannot use this feature until you update your encryption key."
+ },
+ "premiumMembership": {
+ "message": "Premium Membership"
+ },
+ "premiumManage": {
+ "message": "Manage Membership"
+ },
+ "premiumManageAlert": {
+ "message": "You can manage your membership on the bitwarden.com web vault. Do you want to visit the website now?"
+ },
+ "premiumRefresh": {
+ "message": "Refresh Membership"
+ },
+ "premiumNotCurrentMember": {
+ "message": "You are not currently a premium member."
+ },
+ "premiumSignUpAndGet": {
+ "message": "Sign up for a premium membership and get:"
+ },
+ "ppremiumSignUpStorage": {
+ "message": "1 GB encrypted storage for file attachments."
+ },
+ "ppremiumSignUpTwoStep": {
+ "message": "Additional two-step login options such as YubiKey, FIDO U2F, and Duo."
+ },
+ "ppremiumSignUpReports": {
+ "message": "Password hygiene, account health, and data breach reports to keep your vault safe."
+ },
+ "ppremiumSignUpTotp": {
+ "message": "TOTP verification code (2FA) generator for logins in your vault."
+ },
+ "ppremiumSignUpSupport": {
+ "message": "Priority customer support."
+ },
+ "ppremiumSignUpFuture": {
+ "message": "All future premium features. More coming soon!"
+ },
+ "premiumPurchase": {
+ "message": "Purchase Premium"
+ },
+ "premiumPurchaseAlert": {
+ "message": "You can purchase premium membership on the bitwarden.com web vault. Do you want to visit the website now?"
+ },
+ "premiumCurrentMember": {
+ "message": "You are a premium member!"
+ },
+ "premiumCurrentMemberThanks": {
+ "message": "Thank you for supporting Bitwarden."
+ },
+ "premiumPrice": {
+ "message": "All for just $PRICE$ /year!",
+ "placeholders": {
+ "price": {
+ "content": "$1",
+ "example": "$10"
+ }
+ }
+ },
+ "refreshComplete": {
+ "message": "Refresh complete"
+ },
+ "disableAutoTotpCopy": {
+ "message": "Disable Automatic TOTP Copy"
+ },
+ "disableAutoTotpCopyDesc": {
+ "message": "If your login has an authenticator key attached to it, the TOTP verification code is automatically copied to your clipboard whenever you auto-fill the login."
+ },
+ "disableAutoBiometricsPrompt": {
+ "message": "Do not prompt for biometrics on launch"
+ },
+ "premiumRequired": {
+ "message": "Premium Required"
+ },
+ "premiumRequiredDesc": {
+ "message": "A premium membership is required to use this feature."
+ },
+ "enterVerificationCodeApp": {
+ "message": "Enter the 6 digit verification code from your authenticator app."
+ },
+ "enterVerificationCodeEmail": {
+ "message": "Enter the 6 digit verification code that was emailed to $EMAIL$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "example@gmail.com"
+ }
+ }
+ },
+ "verificationCodeEmailSent": {
+ "message": "Verification email sent to $EMAIL$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "example@gmail.com"
+ }
+ }
+ },
+ "rememberMe": {
+ "message": "Remember me"
+ },
+ "sendVerificationCodeEmailAgain": {
+ "message": "Send verification code email again"
+ },
+ "useAnotherTwoStepMethod": {
+ "message": "Use another two-step login method"
+ },
+ "insertYubiKey": {
+ "message": "Insert your YubiKey into your computer's USB port, then touch its button."
+ },
+ "insertU2f": {
+ "message": "Insert your security key into your computer's USB port. If it has a button, touch it."
+ },
+ "webAuthnNewTab": {
+ "message": "To start the WebAuthn 2FA verification. Click the button below to open a new tab and follow the instructions provided in the new tab."
+ },
+ "webAuthnNewTabOpen": {
+ "message": "Open new tab"
+ },
+ "webAuthnAuthenticate": {
+ "message": "Authenticate WebAuthn"
+ },
+ "loginUnavailable": {
+ "message": "Login Unavailable"
+ },
+ "noTwoStepProviders": {
+ "message": "This account has two-step login enabled, however, none of the configured two-step providers are supported by this web browser."
+ },
+ "noTwoStepProviders2": {
+ "message": "Please use a supported web browser (such as Chrome) and/or add additional providers that are better supported across web browsers (such as an authenticator app)."
+ },
+ "twoStepOptions": {
+ "message": "Two-step Login Options"
+ },
+ "recoveryCodeDesc": {
+ "message": "Lost access to all of your two-factor providers? Use your recovery code to disable all two-factor providers from your account."
+ },
+ "recoveryCodeTitle": {
+ "message": "Recovery Code"
+ },
+ "authenticatorAppTitle": {
+ "message": "Authenticator App"
+ },
+ "authenticatorAppDesc": {
+ "message": "Use an authenticator app (such as Authy or Google Authenticator) to generate time-based verification codes.",
+ "description": "'Authy' and 'Google Authenticator' are product names and should not be translated."
+ },
+ "yubiKeyTitle": {
+ "message": "YubiKey OTP Security Key"
+ },
+ "yubiKeyDesc": {
+ "message": "Use a YubiKey to access your account. Works with YubiKey 4, 4 Nano, 4C, and NEO devices."
+ },
+ "duoDesc": {
+ "message": "Verify with Duo Security using the Duo Mobile app, SMS, phone call, or U2F security key.",
+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
+ },
+ "duoOrganizationDesc": {
+ "message": "Verify with Duo Security for your organization using the Duo Mobile app, SMS, phone call, or U2F security key.",
+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
+ },
+ "webAuthnTitle": {
+ "message": "FIDO2 WebAuthn"
+ },
+ "webAuthnDesc": {
+ "message": "Use any WebAuthn enabled security key to access your account."
+ },
+ "emailTitle": {
+ "message": "Email"
+ },
+ "emailDesc": {
+ "message": "Verification codes will be emailed to you."
+ },
+ "selfHostedEnvironment": {
+ "message": "Self-hosted Environment"
+ },
+ "selfHostedEnvironmentFooter": {
+ "message": "Specify the base URL of your on-premises hosted Bitwarden installation."
+ },
+ "customEnvironment": {
+ "message": "Custom Environment"
+ },
+ "customEnvironmentFooter": {
+ "message": "For advanced users. You can specify the base URL of each service independently."
+ },
+ "baseUrl": {
+ "message": "Server URL"
+ },
+ "apiUrl": {
+ "message": "API Server URL"
+ },
+ "webVaultUrl": {
+ "message": "Web Vault Server URL"
+ },
+ "identityUrl": {
+ "message": "Identity Server URL"
+ },
+ "notificationsUrl": {
+ "message": "Notifications Server URL"
+ },
+ "iconsUrl": {
+ "message": "Icons Server URL"
+ },
+ "environmentSaved": {
+ "message": "The environment URLs have been saved."
+ },
+ "enableAutoFillOnPageLoad": {
+ "message": "Enable Auto-fill on Page Load"
+ },
+ "enableAutoFillOnPageLoadDesc": {
+ "message": "If a login form is detected, automatically perform an auto-fill when the web page loads."
+ },
+ "experimentalFeature": {
+ "message": "This is currently an experimental feature. Use at your own risk."
+ },
+ "defaultAutoFillOnPageLoad": {
+ "message": "Default autofill setting for login items"
+ },
+ "defaultAutoFillOnPageLoadDesc": {
+ "message": "After enabling Auto-fill on Page Load, you can enable or disable the feature for individual login items. This is the default setting for login items that are not separately configured."
+ },
+ "itemAutoFillOnPageLoad": {
+ "message": "Auto-fill on Page Load (if enabled in Options)"
+ },
+ "autoFillOnPageLoadUseDefault": {
+ "message": "Use default setting"
+ },
+ "autoFillOnPageLoadYes": {
+ "message": "Auto-fill on page load"
+ },
+ "autoFillOnPageLoadNo": {
+ "message": "Do not auto-fill on page load"
+ },
+ "commandOpenPopup": {
+ "message": "Open vault popup"
+ },
+ "commandOpenSidebar": {
+ "message": "Open vault in sidebar"
+ },
+ "commandAutofillDesc": {
+ "message": "Auto-fill the last used login for the current website"
+ },
+ "commandGeneratePasswordDesc": {
+ "message": "Generate and copy a new random password to the clipboard"
+ },
+ "commandLockVaultDesc": {
+ "message": "Lock the vault"
+ },
+ "privateModeMessage": {
+ "message": "Unfortunately this window is not available in private mode for this browser."
+ },
+ "customFields": {
+ "message": "Custom Fields"
+ },
+ "copyValue": {
+ "message": "Copy Value"
+ },
+ "value": {
+ "message": "Value"
+ },
+ "newCustomField": {
+ "message": "New Custom Field"
+ },
+ "dragToSort": {
+ "message": "Drag to sort"
+ },
+ "cfTypeText": {
+ "message": "Text"
+ },
+ "cfTypeHidden": {
+ "message": "Hidden"
+ },
+ "cfTypeBoolean": {
+ "message": "Boolean"
+ },
+ "popup2faCloseMessage": {
+ "message": "Clicking outside the popup window to check your email for your verification code will cause this popup to close. Do you want to open this popup in a new window so that it does not close?"
+ },
+ "popupU2fCloseMessage": {
+ "message": "This browser cannot process U2F requests in this popup window. Do you want to open this popup in a new window so that you can log in using U2F?"
+ },
+ "disableFavicon": {
+ "message": "Disable Website Icons"
+ },
+ "disableFaviconDesc": {
+ "message": "Website Icons provide a recognizable image next to each login item in your vault."
+ },
+ "disableBadgeCounter": {
+ "message": "Disable Badge Counter"
+ },
+ "disableBadgeCounterDesc": {
+ "message": "Badge counter indicates how many logins you have for the current page in your vault."
+ },
+ "cardholderName": {
+ "message": "Cardholder Name"
+ },
+ "number": {
+ "message": "Number"
+ },
+ "brand": {
+ "message": "Brand"
+ },
+ "expirationMonth": {
+ "message": "Expiration Month"
+ },
+ "expirationYear": {
+ "message": "Expiration Year"
+ },
+ "expiration": {
+ "message": "Expiration"
+ },
+ "january": {
+ "message": "January"
+ },
+ "february": {
+ "message": "February"
+ },
+ "march": {
+ "message": "March"
+ },
+ "april": {
+ "message": "April"
+ },
+ "may": {
+ "message": "May"
+ },
+ "june": {
+ "message": "June"
+ },
+ "july": {
+ "message": "July"
+ },
+ "august": {
+ "message": "August"
+ },
+ "september": {
+ "message": "September"
+ },
+ "october": {
+ "message": "October"
+ },
+ "november": {
+ "message": "November"
+ },
+ "december": {
+ "message": "December"
+ },
+ "securityCode": {
+ "message": "Security Code"
+ },
+ "ex": {
+ "message": "ex."
+ },
+ "title": {
+ "message": "Title"
+ },
+ "mr": {
+ "message": "Mr"
+ },
+ "mrs": {
+ "message": "Mrs"
+ },
+ "ms": {
+ "message": "Ms"
+ },
+ "dr": {
+ "message": "Dr"
+ },
+ "firstName": {
+ "message": "First Name"
+ },
+ "middleName": {
+ "message": "Middle Name"
+ },
+ "lastName": {
+ "message": "Last Name"
+ },
+ "identityName": {
+ "message": "Identity Name"
+ },
+ "company": {
+ "message": "Company"
+ },
+ "ssn": {
+ "message": "Social Security Number"
+ },
+ "passportNumber": {
+ "message": "Passport Number"
+ },
+ "licenseNumber": {
+ "message": "License Number"
+ },
+ "email": {
+ "message": "Email"
+ },
+ "phone": {
+ "message": "Phone"
+ },
+ "address": {
+ "message": "Address"
+ },
+ "address1": {
+ "message": "Address 1"
+ },
+ "address2": {
+ "message": "Address 2"
+ },
+ "address3": {
+ "message": "Address 3"
+ },
+ "cityTown": {
+ "message": "City / Town"
+ },
+ "stateProvince": {
+ "message": "State / Province"
+ },
+ "zipPostalCode": {
+ "message": "Zip / Postal Code"
+ },
+ "country": {
+ "message": "Country"
+ },
+ "type": {
+ "message": "Type"
+ },
+ "typeLogin": {
+ "message": "Login"
+ },
+ "typeLogins": {
+ "message": "Logins"
+ },
+ "typeSecureNote": {
+ "message": "Secure Note"
+ },
+ "typeCard": {
+ "message": "Card"
+ },
+ "typeIdentity": {
+ "message": "Identity"
+ },
+ "passwordHistory": {
+ "message": "Password History"
+ },
+ "back": {
+ "message": "Back"
+ },
+ "collections": {
+ "message": "Collections"
+ },
+ "favorites": {
+ "message": "Favorites"
+ },
+ "popOutNewWindow": {
+ "message": "Pop out to a new window"
+ },
+ "refresh": {
+ "message": "Refresh"
+ },
+ "cards": {
+ "message": "Cards"
+ },
+ "identities": {
+ "message": "Identities"
+ },
+ "logins": {
+ "message": "Logins"
+ },
+ "secureNotes": {
+ "message": "Secure Notes"
+ },
+ "clear": {
+ "message": "Clear",
+ "description": "To clear something out. example: To clear browser history."
+ },
+ "checkPassword": {
+ "message": "Check if password has been exposed."
+ },
+ "passwordExposed": {
+ "message": "This password has been exposed $VALUE$ time(s) in data breaches. You should change it.",
+ "placeholders": {
+ "value": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "passwordSafe": {
+ "message": "This password was not found in any known data breaches. It should be safe to use."
+ },
+ "baseDomain": {
+ "message": "Base domain"
+ },
+ "host": {
+ "message": "Host",
+ "description": "A URL's host value. For example, the host of https://sub.domain.com:443 is 'sub.domain.com:443'."
+ },
+ "exact": {
+ "message": "Exact"
+ },
+ "startsWith": {
+ "message": "Starts with"
+ },
+ "regEx": {
+ "message": "Regular expression",
+ "description": "A programming term, also known as 'RegEx'."
+ },
+ "matchDetection": {
+ "message": "Match Detection",
+ "description": "URI match detection for auto-fill."
+ },
+ "defaultMatchDetection": {
+ "message": "Default match detection",
+ "description": "Default URI match detection for auto-fill."
+ },
+ "toggleOptions": {
+ "message": "Toggle Options"
+ },
+ "toggleCurrentUris": {
+ "message": "Toggle Current URIs",
+ "description": "Toggle the display of the URIs of the currently open tabs in the browser."
+ },
+ "currentUri": {
+ "message": "Current URI",
+ "description": "The URI of one of the current open tabs in the browser."
+ },
+ "organization": {
+ "message": "Organization",
+ "description": "An entity of multiple related people (ex. a team or business organization)."
+ },
+ "types": {
+ "message": "Types"
+ },
+ "allItems": {
+ "message": "All Items"
+ },
+ "noPasswordsInList": {
+ "message": "There are no passwords to list."
+ },
+ "remove": {
+ "message": "Remove"
+ },
+ "default": {
+ "message": "Default"
+ },
+ "dateUpdated": {
+ "message": "Updated",
+ "description": "ex. Date this item was updated"
+ },
+ "datePasswordUpdated": {
+ "message": "Password Updated",
+ "description": "ex. Date this password was updated"
+ },
+ "neverLockWarning": {
+ "message": "Are you sure you want to use the \"Never\" option? Setting your lock options to \"Never\" stores your vault's encryption key on your device. If you use this option you should ensure that you keep your device properly protected."
+ },
+ "noOrganizationsList": {
+ "message": "You do not belong to any organizations. Organizations allow you to securely share items with other users."
+ },
+ "noCollectionsInList": {
+ "message": "There are no collections to list."
+ },
+ "ownership": {
+ "message": "Ownership"
+ },
+ "whoOwnsThisItem": {
+ "message": "Who owns this item?"
+ },
+ "strong": {
+ "message": "Strong",
+ "description": "ex. A strong password. Scale: Weak -> Good -> Strong"
+ },
+ "good": {
+ "message": "Good",
+ "description": "ex. A good password. Scale: Weak -> Good -> Strong"
+ },
+ "weak": {
+ "message": "Weak",
+ "description": "ex. A weak password. Scale: Weak -> Good -> Strong"
+ },
+ "weakMasterPassword": {
+ "message": "Weak Master Password"
+ },
+ "weakMasterPasswordDesc": {
+ "message": "The master password you have chosen is weak. You should use a strong master password (or a passphrase) to properly protect your Bitwarden account. Are you sure you want to use this master password?"
+ },
+ "pin": {
+ "message": "PIN",
+ "description": "PIN code. Ex. The short code (often numeric) that you use to unlock a device."
+ },
+ "unlockWithPin": {
+ "message": "Unlock with PIN"
+ },
+ "setYourPinCode": {
+ "message": "Set your PIN code for unlocking Bitwarden. Your PIN settings will be reset if you ever fully log out of the application."
+ },
+ "pinRequired": {
+ "message": "PIN code is required."
+ },
+ "invalidPin": {
+ "message": "Invalid PIN code."
+ },
+ "verifyPin": {
+ "message": "Verify PIN"
+ },
+ "yourVaultIsLockedPinCode": {
+ "message": "Your vault is locked. Verify your PIN code to continue."
+ },
+ "unlockWithBiometrics": {
+ "message": "Unlock with biometrics"
+ },
+ "awaitDesktop": {
+ "message": "Awaiting confirmation from desktop"
+ },
+ "awaitDesktopDesc": {
+ "message": "Please confirm using biometrics in the Bitwarden Desktop application to enable biometrics for browser."
+ },
+ "lockWithMasterPassOnRestart": {
+ "message": "Lock with master password on browser restart"
+ },
+ "selectOneCollection": {
+ "message": "You must select at least one collection."
+ },
+ "cloneItem": {
+ "message": "Clone Item"
+ },
+ "clone": {
+ "message": "Clone"
+ },
+ "passwordGeneratorPolicyInEffect": {
+ "message": "One or more organization policies are affecting your generator settings."
+ },
+ "vaultTimeoutAction": {
+ "message": "Vault Timeout Action"
+ },
+ "lock": {
+ "message": "Lock",
+ "description": "Verb form: to make secure or inaccesible by"
+ },
+ "trash": {
+ "message": "Trash",
+ "description": "Noun: a special folder to hold deleted items"
+ },
+ "searchTrash": {
+ "message": "Search trash"
+ },
+ "permanentlyDeleteItem": {
+ "message": "Permanently Delete Item"
+ },
+ "permanentlyDeleteItemConfirmation": {
+ "message": "Are you sure you want to permanently delete this item?"
+ },
+ "permanentlyDeletedItem": {
+ "message": "Permanently Deleted item"
+ },
+ "restoreItem": {
+ "message": "Restore Item"
+ },
+ "restoreItemConfirmation": {
+ "message": "Are you sure you want to restore this item?"
+ },
+ "restoredItem": {
+ "message": "Restored Item"
+ },
+ "vaultTimeoutLogOutConfirmation": {
+ "message": "Logging out will remove all access to your vault and requires online authentication after the timeout period. Are you sure you want to use this setting?"
+ },
+ "vaultTimeoutLogOutConfirmationTitle": {
+ "message": "Timeout Action Confirmation"
+ },
+ "autoFillAndSave": {
+ "message": "Auto-fill and Save"
+ },
+ "autoFillSuccessAndSavedUri": {
+ "message": "Auto-filled Item and Saved URI"
+ },
+ "autoFillSuccess": {
+ "message": "Auto-filled Item"
+ },
+ "setMasterPassword": {
+ "message": "Set Master Password"
+ },
+ "masterPasswordPolicyInEffect": {
+ "message": "One or more organization policies require your master password to meet the following requirements:"
+ },
+ "policyInEffectMinComplexity": {
+ "message": "Minimum complexity score of $SCORE$",
+ "placeholders": {
+ "score": {
+ "content": "$1",
+ "example": "4"
+ }
+ }
+ },
+ "policyInEffectMinLength": {
+ "message": "Minimum length of $LENGTH$",
+ "placeholders": {
+ "length": {
+ "content": "$1",
+ "example": "14"
+ }
+ }
+ },
+ "policyInEffectUppercase": {
+ "message": "Contain one or more uppercase characters"
+ },
+ "policyInEffectLowercase": {
+ "message": "Contain one or more lowercase characters"
+ },
+ "policyInEffectNumbers": {
+ "message": "Contain one or more numbers"
+ },
+ "policyInEffectSpecial": {
+ "message": "Contain one or more of the following special characters $CHARS$",
+ "placeholders": {
+ "chars": {
+ "content": "$1",
+ "example": "!@#$%^&*"
+ }
+ }
+ },
+ "masterPasswordPolicyRequirementsNotMet": {
+ "message": "Your new master password does not meet the policy requirements."
+ },
+ "acceptPolicies": {
+ "message": "By checking this box you agree to the following:"
+ },
+ "acceptPoliciesError": {
+ "message": "Terms of Service and Privacy Policy have not been acknowledged."
+ },
+ "termsOfService": {
+ "message": "Terms of Service"
+ },
+ "privacyPolicy": {
+ "message": "Privacy Policy"
+ },
+ "hintEqualsPassword": {
+ "message": "Your password hint cannot be the same as your password."
+ },
+ "ok": {
+ "message": "Ok"
+ },
+ "desktopSyncVerificationTitle": {
+ "message": "Desktop sync verification"
+ },
+ "desktopIntegrationVerificationText": {
+ "message": "Please verify that the desktop application shows this fingerprint: "
+ },
+ "desktopIntegrationDisabledTitle": {
+ "message": "Browser integration is not enabled"
+ },
+ "desktopIntegrationDisabledDesc": {
+ "message": "Browser integration is not enabled in the Bitwarden Desktop application. Please enable it in the settings within the desktop application."
+ },
+ "startDesktopTitle": {
+ "message": "Start the Bitwarden Desktop application"
+ },
+ "startDesktopDesc": {
+ "message": "The Bitwarden Desktop application needs to be started before this function can be used."
+ },
+ "errorEnableBiometricTitle": {
+ "message": "Unable to enable biometrics"
+ },
+ "errorEnableBiometricDesc": {
+ "message": "Action was canceled by the desktop application"
+ },
+ "nativeMessagingInvalidEncryptionDesc": {
+ "message": "Desktop application invalidated the secure communication channel. Please retry this operation"
+ },
+ "nativeMessagingInvalidEncryptionTitle": {
+ "message": "Desktop communication interrupted"
+ },
+ "nativeMessagingWrongUserDesc": {
+ "message": "The desktop application is logged into a different account. Please ensure both applications are logged into the same account."
+ },
+ "nativeMessagingWrongUserTitle": {
+ "message": "Account missmatch"
+ },
+ "biometricsNotEnabledTitle": {
+ "message": "Biometrics not enabled"
+ },
+ "biometricsNotEnabledDesc": {
+ "message": "Browser biometrics requires desktop biometric to be enabled in the settings first."
+ },
+ "biometricsNotSupportedTitle": {
+ "message": "Biometrics not supported"
+ },
+ "biometricsNotSupportedDesc": {
+ "message": "Browser biometrics is not supported on this device."
+ },
+ "nativeMessaginPermissionErrorTitle": {
+ "message": "Permission not provided"
+ },
+ "nativeMessaginPermissionErrorDesc": {
+ "message": "Without permission to communicate with the Bitwarden Desktop Application we cannot provide biometrics in the browser extension. Please try again."
+ },
+ "nativeMessaginPermissionSidebarTitle": {
+ "message": "Permission request error"
+ },
+ "nativeMessaginPermissionSidebarDesc": {
+ "message": "This action cannot be done in the sidebar, please retry the action in the popup or popout."
+ },
+ "personalOwnershipSubmitError": {
+ "message": "Due to an Enterprise Policy, you are restricted from saving items to your personal vault. Change the Ownership option to an organization and choose from available Collections."
+ },
+ "personalOwnershipPolicyInEffect": {
+ "message": "An organization policy is affecting your ownership options."
+ },
+ "excludedDomains": {
+ "message": "Excluded Domains"
+ },
+ "excludedDomainsDesc": {
+ "message": "Bitwarden will not ask to save login details for these domains. You must refresh the page for changes to take effect."
+ },
+ "excludedDomainsInvalidDomain": {
+ "message": "$DOMAIN$ is not a valid domain",
+ "placeholders": {
+ "domain": {
+ "content": "$1",
+ "example": "googlecom"
+ }
+ }
+ },
+ "send": {
+ "message": "Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "searchSends": {
+ "message": "Search Sends",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "addSend": {
+ "message": "Add Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTypeText": {
+ "message": "Text"
+ },
+ "sendTypeFile": {
+ "message": "File"
+ },
+ "allSends": {
+ "message": "All Sends",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "maxAccessCountReached": {
+ "message": "Max access count reached"
+ },
+ "expired": {
+ "message": "Expired"
+ },
+ "pendingDeletion": {
+ "message": "Pending deletion"
+ },
+ "passwordProtected": {
+ "message": "Password protected"
+ },
+ "copySendLink": {
+ "message": "Copy Send link",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "removePassword": {
+ "message": "Remove Password"
+ },
+ "delete": {
+ "message": "Delete"
+ },
+ "removedPassword": {
+ "message": "Removed Password"
+ },
+ "deletedSend": {
+ "message": "Deleted Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendLink": {
+ "message": "Send link",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "disabled": {
+ "message": "Disabled"
+ },
+ "removePasswordConfirmation": {
+ "message": "Are you sure you want to remove the password?"
+ },
+ "deleteSend": {
+ "message": "Delete Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "deleteSendConfirmation": {
+ "message": "Are you sure you want to delete this Send?",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "editSend": {
+ "message": "Edit Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTypeHeader": {
+ "message": "What type of Send is this?",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendNameDesc": {
+ "message": "A friendly name to describe this Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendFileDesc": {
+ "message": "The file you want to send."
+ },
+ "deletionDate": {
+ "message": "Deletion Date"
+ },
+ "deletionDateDesc": {
+ "message": "The Send will be permanently deleted on the specified date and time.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "expirationDate": {
+ "message": "Expiration Date"
+ },
+ "expirationDateDesc": {
+ "message": "If set, access to this Send will expire on the specified date and time.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "oneDay": {
+ "message": "1 day"
+ },
+ "days": {
+ "message": "$DAYS$ days",
+ "placeholders": {
+ "days": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "custom": {
+ "message": "Custom"
+ },
+ "maximumAccessCount": {
+ "message": "Maximum Access Count"
+ },
+ "maximumAccessCountDesc": {
+ "message": "If set, users will no longer be able to access this Send once the maximum access count is reached.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendPasswordDesc": {
+ "message": "Optionally require a password for users to access this Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendNotesDesc": {
+ "message": "Private notes about this Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendDisableDesc": {
+ "message": "Disable this Send so that no one can access it.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendShareDesc": {
+ "message": "Copy this Send's link to clipboard upon save.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTextDesc": {
+ "message": "The text you want to send."
+ },
+ "sendHideText": {
+ "message": "Hide this Send's text by default.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "currentAccessCount": {
+ "message": "Current Access Count"
+ },
+ "createSend": {
+ "message": "Create New Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "newPassword": {
+ "message": "New Password"
+ },
+ "sendDisabled": {
+ "message": "Send Disabled",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendDisabledWarning": {
+ "message": "Due to an enterprise policy, you are only able to delete an existing Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "createdSend": {
+ "message": "Created Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "editedSend": {
+ "message": "Edited Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendLinuxChromiumFileWarning": {
+ "message": "In order to choose a file, open the extension in the sidebar (if possible) or pop out to a new window by clicking this banner."
+ },
+ "sendFirefoxFileWarning": {
+ "message": "In order to choose a file using Firefox, open the extension in the sidebar or pop out to a new window by clicking this banner."
+ },
+ "sendSafariFileWarning": {
+ "message": "In order to choose a file using Safari, pop out to a new window by clicking this banner."
+ },
+ "sendFileCalloutHeader": {
+ "message": "Before you start"
+ },
+ "sendFirefoxCustomDatePopoutMessage1": {
+ "message": "To use a calendar style date picker",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read '**To use a calendar style date picker ** click here to pop out your window.'"
+ },
+ "sendFirefoxCustomDatePopoutMessage2": {
+ "message": "click here",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker **click here** to pop out your window.'"
+ },
+ "sendFirefoxCustomDatePopoutMessage3": {
+ "message": "to pop out your window.",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker click here **to pop out your window.**'"
+ },
+ "expirationDateIsInvalid": {
+ "message": "The expiration date provided is not valid."
+ },
+ "deletionDateIsInvalid": {
+ "message": "The deletion date provided is not valid."
+ },
+ "expirationDateAndTimeRequired": {
+ "message": "An expiration date and time are required."
+ },
+ "deletionDateAndTimeRequired": {
+ "message": "A deletion date and time are required."
+ },
+ "dateParsingError": {
+ "message": "There was an error saving your deletion and expiration dates."
+ },
+ "hideEmail": {
+ "message": "Hide my email address from recipients."
+ },
+ "sendOptionsPolicyInEffect": {
+ "message": "One or more organization policies are affecting your Send options."
+ },
+ "passwordPrompt": {
+ "message": "Master password re-prompt"
+ },
+ "passwordConfirmation": {
+ "message": "Master password confirmation"
+ },
+ "passwordConfirmationDesc": {
+ "message": "This action is protected. To continue, please re-enter your master password to verify your identity."
+ },
+ "emailVerificationRequired": {
+ "message": "Email Verification Required"
+ },
+ "emailVerificationRequiredDesc": {
+ "message": "You must verify your email to use this feature. You can verify your email in the web vault."
+ },
+ "updatedMasterPassword": {
+ "message": "Updated Master Password"
+ },
+ "updateMasterPassword": {
+ "message": "Update Master Password"
+ },
+ "updateMasterPasswordWarning": {
+ "message": "Your Master Password was recently changed by an administrator in your organization. In order to access the vault, you must update it now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour."
+ },
+ "resetPasswordPolicyAutoEnroll": {
+ "message": "Automatic Enrollment"
+ },
+ "resetPasswordAutoEnrollInviteWarning": {
+ "message": "This organization has an enterprise policy that will automatically enroll you in password reset. Enrollment will allow organization administrators to change your master password."
+ },
+ "selectFolder": {
+ "message": "Select folder..."
+ },
+ "ssoCompleteRegistration": {
+ "message": "In order to complete logging in with SSO, please set a master password to access and protect your vault."
+ },
+ "hours": {
+ "message": "Hours"
+ },
+ "minutes": {
+ "message": "Minutes"
+ },
+ "vaultTimeoutPolicyInEffect": {
+ "message": "Your organization policies are affecting your vault timeout. Maximum allowed Vault Timeout is $HOURS$ hour(s) and $MINUTES$ minute(s)",
+ "placeholders": {
+ "hours": {
+ "content": "$1",
+ "example": "5"
+ },
+ "minutes": {
+ "content": "$2",
+ "example": "5"
+ }
+ }
+ },
+ "vaultTimeoutToLarge": {
+ "message": "Your vault timeout exceeds the restrictions set by your organization."
+ },
+ "vaultExportDisabled": {
+ "message": "Vault Export Disabled"
+ },
+ "personalVaultExportPolicyInEffect": {
+ "message": "One or more organization policies prevents you from exporting your personal vault."
+ },
+ "copyCustomFieldNameInvalidElement": {
+ "message": "Unable to identify a valid form element. Try inspecting the HTML instead."
+ },
+ "copyCustomFieldNameNotUnique": {
+ "message": "No unique identifier found."
+ }
+}
diff --git a/src/iOS.Safari/Resources/_locales/pl/messages.json b/src/iOS.Safari/Resources/_locales/pl/messages.json
new file mode 100644
index 000000000..37cc1c0a5
--- /dev/null
+++ b/src/iOS.Safari/Resources/_locales/pl/messages.json
@@ -0,0 +1,1817 @@
+{
+ "appName": {
+ "message": "Bitwarden"
+ },
+ "extName": {
+ "message": "Bitwarden - darmowy menedżer haseł",
+ "description": "Extension name, MUST be less than 40 characters (Safari restriction)"
+ },
+ "extDesc": {
+ "message": "Bezpieczny i darmowy menedżer haseł dla wszystkich Twoich urządzeń.",
+ "description": "Extension description"
+ },
+ "loginOrCreateNewAccount": {
+ "message": "Zaloguj się lub utwórz nowe konto, aby uzyskać dostęp do Twojego bezpiecznego sejfu."
+ },
+ "createAccount": {
+ "message": "Utwórz konto"
+ },
+ "login": {
+ "message": "Zaloguj się"
+ },
+ "enterpriseSingleSignOn": {
+ "message": "Logowanie jednokrotne"
+ },
+ "cancel": {
+ "message": "Anuluj"
+ },
+ "close": {
+ "message": "Zamknij"
+ },
+ "submit": {
+ "message": "Wyślij"
+ },
+ "emailAddress": {
+ "message": "Adres e-mail"
+ },
+ "masterPass": {
+ "message": "Hasło główne"
+ },
+ "masterPassDesc": {
+ "message": "Hasło główne zapewnia dostęp do sejfu. To bardzo ważne, aby je pamiętać, ponieważ zapomnianego hasła nie będzie można odzyskać."
+ },
+ "masterPassHintDesc": {
+ "message": "Podpowiedź do hasła głównego może pomóc Ci przypomnieć hasło, jeśli je zapomnisz."
+ },
+ "reTypeMasterPass": {
+ "message": "Wpisz ponownie hasło główne"
+ },
+ "masterPassHint": {
+ "message": "Podpowiedź do hasła głównego (opcjonalnie)"
+ },
+ "tab": {
+ "message": "Karta"
+ },
+ "myVault": {
+ "message": "Mój sejf"
+ },
+ "tools": {
+ "message": "Narzędzia"
+ },
+ "settings": {
+ "message": "Ustawienia"
+ },
+ "currentTab": {
+ "message": "Obecna karta"
+ },
+ "copyPassword": {
+ "message": "Kopiuj hasło"
+ },
+ "copyNote": {
+ "message": "Kopiuj notatkę"
+ },
+ "copyUri": {
+ "message": "Kopiuj URI"
+ },
+ "copyUsername": {
+ "message": "Kopiuj nazwę użytkownika"
+ },
+ "copyNumber": {
+ "message": "Kopiuj numer"
+ },
+ "copySecurityCode": {
+ "message": "Kopiuj kod zabezpieczający"
+ },
+ "autoFill": {
+ "message": "Autouzupełnianie"
+ },
+ "generatePasswordCopied": {
+ "message": "Generuj hasło (do schowka)"
+ },
+ "copyElementIdentifier": {
+ "message": "Kopiuj nazwę pola niestandardowego"
+ },
+ "noMatchingLogins": {
+ "message": "Brak pasujących danych logowania."
+ },
+ "vaultLocked": {
+ "message": "Sejf jest zablokowany."
+ },
+ "vaultLoggedOut": {
+ "message": "Wylogowano z sejfu."
+ },
+ "autoFillInfo": {
+ "message": "Brak dostępnych danych logowania do autouzupełnienia dla obecnej karty przeglądarki."
+ },
+ "addLogin": {
+ "message": "Dodaj dane logowania"
+ },
+ "addItem": {
+ "message": "Dodaj element"
+ },
+ "passwordHint": {
+ "message": "Podpowiedź do hasła"
+ },
+ "enterEmailToGetHint": {
+ "message": "Wpisz adres e-mail powiązany z kontem, aby otrzymać podpowiedź do hasła głównego."
+ },
+ "getMasterPasswordHint": {
+ "message": "Uzyskaj podpowiedź do hasła głównego"
+ },
+ "continue": {
+ "message": "Kontynuuj"
+ },
+ "verificationCode": {
+ "message": "Kod weryfikacyjny"
+ },
+ "account": {
+ "message": "Konto"
+ },
+ "changeMasterPassword": {
+ "message": "Zmień hasło główne"
+ },
+ "fingerprintPhrase": {
+ "message": "Unikalny identyfikator konta",
+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
+ },
+ "yourAccountsFingerprint": {
+ "message": "Unikalny identyfikator Twojego konta",
+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
+ },
+ "twoStepLogin": {
+ "message": "Logowanie dwustopniowe"
+ },
+ "logOut": {
+ "message": "Wyloguj się"
+ },
+ "about": {
+ "message": "O aplikacji"
+ },
+ "version": {
+ "message": "Wersja"
+ },
+ "save": {
+ "message": "Zapisz"
+ },
+ "move": {
+ "message": "Przenieś"
+ },
+ "addFolder": {
+ "message": "Dodaj folder"
+ },
+ "name": {
+ "message": "Nazwa"
+ },
+ "editFolder": {
+ "message": "Edytuj folder"
+ },
+ "deleteFolder": {
+ "message": "Usuń folder"
+ },
+ "folders": {
+ "message": "Foldery"
+ },
+ "noFolders": {
+ "message": "Brak folderów do wyświetlenia."
+ },
+ "helpFeedback": {
+ "message": "Pomoc i opinie"
+ },
+ "sync": {
+ "message": "Synchronizacja"
+ },
+ "syncVaultNow": {
+ "message": "Synchronizuj sejf"
+ },
+ "lastSync": {
+ "message": "Ostatnia synchronizacja:"
+ },
+ "passGen": {
+ "message": "Generator hasła"
+ },
+ "generator": {
+ "message": "Generator",
+ "description": "Short for 'Password Generator'."
+ },
+ "passGenInfo": {
+ "message": "Automatycznie wygeneruj silne, unikatowe hasła dla swoich loginów."
+ },
+ "bitWebVault": {
+ "message": "Sejf internetowy Bitwarden"
+ },
+ "importItems": {
+ "message": "Importuj elementy"
+ },
+ "select": {
+ "message": "Wybierz"
+ },
+ "generatePassword": {
+ "message": "Generuj hasło"
+ },
+ "regeneratePassword": {
+ "message": "Wygeneruj hasło ponownie"
+ },
+ "options": {
+ "message": "Opcje"
+ },
+ "length": {
+ "message": "Długość"
+ },
+ "numWords": {
+ "message": "Liczba słów"
+ },
+ "wordSeparator": {
+ "message": "Separator słów"
+ },
+ "capitalize": {
+ "message": "Wielkie litery",
+ "description": "Make the first letter of a work uppercase."
+ },
+ "includeNumber": {
+ "message": "Uwzględnij cyfry"
+ },
+ "minNumbers": {
+ "message": "Minimalna liczba cyfr"
+ },
+ "minSpecial": {
+ "message": "Minimalna liczba znaków specjalnych"
+ },
+ "avoidAmbChar": {
+ "message": "Unikaj niejednoznacznych znaków"
+ },
+ "searchVault": {
+ "message": "Szukaj w sejfie"
+ },
+ "edit": {
+ "message": "Edytuj"
+ },
+ "view": {
+ "message": "Zobacz"
+ },
+ "noItemsInList": {
+ "message": "Brak elementów."
+ },
+ "itemInformation": {
+ "message": "Informacje o elemencie"
+ },
+ "username": {
+ "message": "Nazwa użytkownika"
+ },
+ "password": {
+ "message": "Hasło"
+ },
+ "passphrase": {
+ "message": "Hasło wyrazowe"
+ },
+ "favorite": {
+ "message": "Ulubione"
+ },
+ "notes": {
+ "message": "Notatki"
+ },
+ "note": {
+ "message": "Notatka"
+ },
+ "editItem": {
+ "message": "Edytuj element"
+ },
+ "folder": {
+ "message": "Folder"
+ },
+ "deleteItem": {
+ "message": "Usuń element"
+ },
+ "viewItem": {
+ "message": "Zobacz element"
+ },
+ "launch": {
+ "message": "Uruchom"
+ },
+ "website": {
+ "message": "Strona"
+ },
+ "toggleVisibility": {
+ "message": "Pokaż / Ukryj"
+ },
+ "manage": {
+ "message": "Zarządzaj"
+ },
+ "other": {
+ "message": "Inne"
+ },
+ "rateExtension": {
+ "message": "Oceń rozszerzenie"
+ },
+ "rateExtensionDesc": {
+ "message": "Wesprzyj nas pozytywną opinią!"
+ },
+ "browserNotSupportClipboard": {
+ "message": "Przeglądarka nie obsługuje łatwego kopiowania schowka. Skopiuj element ręcznie."
+ },
+ "verifyMasterPassword": {
+ "message": "Zweryfikuj hasło główne"
+ },
+ "yourVaultIsLocked": {
+ "message": "Sejf jest zablokowany. Wpisz hasło główne, aby kontynuować."
+ },
+ "unlock": {
+ "message": "Odblokuj"
+ },
+ "loggedInAsOn": {
+ "message": "Zalogowano jako $EMAIL$ do $HOSTNAME$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "name@example.com"
+ },
+ "hostname": {
+ "content": "$2",
+ "example": "bitwarden.com"
+ }
+ }
+ },
+ "invalidMasterPassword": {
+ "message": "Hasło główne jest nieprawidłowe"
+ },
+ "vaultTimeout": {
+ "message": "Blokowanie sejfu"
+ },
+ "lockNow": {
+ "message": "Zablokuj"
+ },
+ "immediately": {
+ "message": "Natychmiast"
+ },
+ "tenSeconds": {
+ "message": "10 sekund"
+ },
+ "twentySeconds": {
+ "message": "20 sekund"
+ },
+ "thirtySeconds": {
+ "message": "30 sekund"
+ },
+ "oneMinute": {
+ "message": "1 minuta"
+ },
+ "twoMinutes": {
+ "message": "2 minuty"
+ },
+ "fiveMinutes": {
+ "message": "5 minut"
+ },
+ "fifteenMinutes": {
+ "message": "15 minut"
+ },
+ "thirtyMinutes": {
+ "message": "30 minut"
+ },
+ "oneHour": {
+ "message": "1 godzina"
+ },
+ "fourHours": {
+ "message": "4 godziny"
+ },
+ "onLocked": {
+ "message": "Po zablokowaniu komputera"
+ },
+ "onRestart": {
+ "message": "Po restarcie przeglądarki"
+ },
+ "never": {
+ "message": "Nigdy"
+ },
+ "security": {
+ "message": "Zabezpieczenia"
+ },
+ "errorOccurred": {
+ "message": "Wystąpił błąd"
+ },
+ "emailRequired": {
+ "message": "Adres e-mail jest wymagany."
+ },
+ "invalidEmail": {
+ "message": "Adres e-mail jest nieprawidłowy."
+ },
+ "masterPassRequired": {
+ "message": "Hasło główne jest wymagane."
+ },
+ "masterPassLength": {
+ "message": "Hasło główne musi zawierać co najmniej 8 znaków."
+ },
+ "masterPassDoesntMatch": {
+ "message": "Hasła nie pasują do siebie."
+ },
+ "newAccountCreated": {
+ "message": "Konto zostało utworzone! Teraz możesz się zalogować."
+ },
+ "masterPassSent": {
+ "message": "Wysłaliśmy Tobie wiadomość e-mail z podpowiedzią do hasła głównego."
+ },
+ "verificationCodeRequired": {
+ "message": "Kod weryfikacyjny jest wymagany."
+ },
+ "valueCopied": {
+ "message": "Skopiowano $VALUE$",
+ "description": "Value has been copied to the clipboard.",
+ "placeholders": {
+ "value": {
+ "content": "$1",
+ "example": "Password"
+ }
+ }
+ },
+ "autofillError": {
+ "message": "Nie można zastosować autouzupełnienia na tej stronie. Skopiuj i wklej informacje ręcznie."
+ },
+ "loggedOut": {
+ "message": "Wylogowano"
+ },
+ "loginExpired": {
+ "message": "Twoja sesja wygasła."
+ },
+ "logOutConfirmation": {
+ "message": "Czy na pewno chcesz się wylogować?"
+ },
+ "yes": {
+ "message": "Tak"
+ },
+ "no": {
+ "message": "Nie"
+ },
+ "unexpectedError": {
+ "message": "Wystąpił nieoczekiwany błąd."
+ },
+ "nameRequired": {
+ "message": "Nazwa jest wymagana."
+ },
+ "addedFolder": {
+ "message": "Folder został dodany"
+ },
+ "changeMasterPass": {
+ "message": "Zmień hasło główne"
+ },
+ "changeMasterPasswordConfirmation": {
+ "message": "Hasło główne możesz zmienić na stronie sejfu bitwarden.com. Czy chcesz przejść do tej strony?"
+ },
+ "twoStepLoginConfirmation": {
+ "message": "Logowanie dwustopniowe sprawia, że konto jest bardziej bezpieczne poprzez wymuszenie potwierdzenia logowania z innego urządzenia, takiego jak z klucza bezpieczeństwa, aplikacji uwierzytelniającej, wiadomości SMS, telefonu lub adresu e-mail. Logowanie dwustopniowe możesz włączyć w sejfie internetowym bitwarden.com. Czy chcesz przejść do tej strony?"
+ },
+ "editedFolder": {
+ "message": "Folder został zaktualizowany"
+ },
+ "deleteFolderConfirmation": {
+ "message": "Czy na pewno chcesz usunąć ten folder?"
+ },
+ "deletedFolder": {
+ "message": "Folder został usunięty"
+ },
+ "gettingStartedTutorial": {
+ "message": "Samouczek"
+ },
+ "gettingStartedTutorialVideo": {
+ "message": "Obejrzyj samouczek, aby dowiedzieć się, jak najlepiej wykorzystać rozszerzenie przeglądarki."
+ },
+ "syncingComplete": {
+ "message": "Synchronizacja została zakończona"
+ },
+ "syncingFailed": {
+ "message": "Synchronizacja nie powiodła się"
+ },
+ "passwordCopied": {
+ "message": "Hasło zostało skopiowane"
+ },
+ "uri": {
+ "message": "URI"
+ },
+ "uriPosition": {
+ "message": "URI $POSITION$",
+ "description": "A listing of URIs. Ex: URI 1, URI 2, URI 3, etc.",
+ "placeholders": {
+ "position": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "newUri": {
+ "message": "Nowy URI"
+ },
+ "addedItem": {
+ "message": "Element został dodany"
+ },
+ "editedItem": {
+ "message": "Element został zaktualizowany"
+ },
+ "deleteItemConfirmation": {
+ "message": "Czy na pewno chcesz to usunąć?"
+ },
+ "deletedItem": {
+ "message": "Element został przeniesiony do kosza"
+ },
+ "overwritePassword": {
+ "message": "Zastąp hasło"
+ },
+ "overwritePasswordConfirmation": {
+ "message": "Czy na pewno chcesz zastąpić obecne hasło?"
+ },
+ "searchFolder": {
+ "message": "Szukaj w folderze"
+ },
+ "searchCollection": {
+ "message": "Szukaj w kolekcji"
+ },
+ "searchType": {
+ "message": "Szukaj elementu"
+ },
+ "noneFolder": {
+ "message": "Nieprzypisane",
+ "description": "This is the folder for uncategorized items"
+ },
+ "disableAddLoginNotification": {
+ "message": "Wyłącz powiadomienia automatycznego logowania"
+ },
+ "addLoginNotificationDesc": {
+ "message": "\"Dodaj powiadomienia logowania\" automatycznie wyświetla monit o zapisanie nowych danych logowania do sejfu przy każdym pierwszym logowaniu."
+ },
+ "dontShowCardsCurrentTab": {
+ "message": "Nie pokazuj kart w zakładce \"Obecna karta\""
+ },
+ "dontShowCardsCurrentTabDesc": {
+ "message": "Karty zapisane w sejfie są wyświetlane w zakładce \"Obecna karta\"."
+ },
+ "dontShowIdentitiesCurrentTab": {
+ "message": "Nie pokazuj tożsamości w zakładce \"Obecna karta\""
+ },
+ "dontShowIdentitiesCurrentTabDesc": {
+ "message": "Tożsamości zapisane w sejfie są wyświetlane w zakładce \"Obecna karta\"."
+ },
+ "clearClipboard": {
+ "message": "Wyczyść schowek",
+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
+ },
+ "clearClipboardDesc": {
+ "message": "Automatycznie wyczyść skopiowaną wartość ze schowka.",
+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
+ },
+ "notificationAddDesc": {
+ "message": "Czy Bitwarden powinien zapisać dla Ciebie to hasło?"
+ },
+ "notificationAddSave": {
+ "message": "Tak, zapisz"
+ },
+ "notificationNeverSave": {
+ "message": "Nigdy dla tej strony"
+ },
+ "disableChangedPasswordNotification": {
+ "message": "Wyłącz powiadomienie o zmianie hasła"
+ },
+ "disableChangedPasswordNotificationDesc": {
+ "message": "\"Powiadomienie o zmianie hasła\" automatycznie zapyta Cię o zaktualizowanie hasła w sejfie za każdym razem, gdy wykryje zmianę hasła na danej stronie."
+ },
+ "notificationChangeDesc": {
+ "message": "Czy chcesz zaktualizować to hasło w Bitwarden?"
+ },
+ "notificationChangeSave": {
+ "message": "Tak, aktualizuj"
+ },
+ "disableContextMenuItem": {
+ "message": "Wyłącz opcje menu kontekstowego"
+ },
+ "disableContextMenuItemDesc": {
+ "message": "Opcje menu kontekstowego zapewniają szybki dostęp do generowania haseł oraz do danych logowania dla obecnej karty."
+ },
+ "defaultUriMatchDetection": {
+ "message": "Domyślne wykrywanie dopasowania",
+ "description": "Default URI match detection for auto-fill."
+ },
+ "defaultUriMatchDetectionDesc": {
+ "message": "Wybierz domyślny sposób wykrywania dopasowania adresów dla czynności takich jak autouzupełnianie."
+ },
+ "theme": {
+ "message": "Motyw"
+ },
+ "themeDesc": {
+ "message": "Zmień motyw kolorystyczny aplikacji."
+ },
+ "dark": {
+ "message": "Ciemny",
+ "description": "Dark color"
+ },
+ "light": {
+ "message": "Jasny",
+ "description": "Light color"
+ },
+ "solarizedDark": {
+ "message": "Solarized Dark",
+ "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated."
+ },
+ "exportVault": {
+ "message": "Eksportuj sejf"
+ },
+ "fileFormat": {
+ "message": "Format pliku"
+ },
+ "warning": {
+ "message": "UWAGA",
+ "description": "WARNING (should stay in capitalized letters if the language permits)"
+ },
+ "confirmVaultExport": {
+ "message": "Potwierdź eksportowanie sejfu"
+ },
+ "exportWarningDesc": {
+ "message": "Plik zawiera dane sejfu w niezaszyfrowanym formacie. Nie powinieneś go przechowywać, ani przesyłać poprzez niezabezpieczone kanały (takie jak poczta e-mail). Skasuj go natychmiast po użyciu."
+ },
+ "encExportKeyWarningDesc": {
+ "message": "Dane eksportu zostaną zaszyfrowane za pomocą klucza szyfrowania konta. Jeśli kiedykolwiek zmienisz ten klucz, wyeksportuj dane ponownie, ponieważ nie będziesz w stanie odszyfrować tego pliku."
+ },
+ "encExportAccountWarningDesc": {
+ "message": "Klucze szyfrowania konta są unikalne dla każdego użytkownika Bitwarden, więc nie możesz zaimportować zaszyfrowanego pliku eksportu na inne konto."
+ },
+ "exportMasterPassword": {
+ "message": "Wpisz hasło główne, aby wyeksportować dane z sejfu."
+ },
+ "shared": {
+ "message": "Udostępnione"
+ },
+ "learnOrg": {
+ "message": "Dowiedz się więcej o organizacjach"
+ },
+ "learnOrgConfirmation": {
+ "message": "Bitwarden pozwala na udostępnianie zawartości sejfu innym osobom za pośrednictwem organizacji. Czy chcesz odwiedzić stronę bitwarden.com, aby dowiedzieć się więcej?"
+ },
+ "moveToOrganization": {
+ "message": "Przenieś do organizacji"
+ },
+ "share": {
+ "message": "Udostępnij"
+ },
+ "movedItemToOrg": {
+ "message": "Element $ITEMNAME$ został przeniesiony do organizacji $ORGNAME$",
+ "placeholders": {
+ "itemname": {
+ "content": "$1",
+ "example": "Secret Item"
+ },
+ "orgname": {
+ "content": "$2",
+ "example": "Company Name"
+ }
+ }
+ },
+ "moveToOrgDesc": {
+ "message": "Wybierz organizację, do której chcesz przenieść ten element. Ta czynność spowoduje utratę własności elementu i przenosi te uprawnienia do organizacji."
+ },
+ "learnMore": {
+ "message": "Dowiedz się więcej"
+ },
+ "authenticatorKeyTotp": {
+ "message": "Klucz uwierzytelniający (TOTP)"
+ },
+ "verificationCodeTotp": {
+ "message": "Kod weryfikacyjny (TOTP)"
+ },
+ "copyVerificationCode": {
+ "message": "Kopiuj kod weryfikacyjny"
+ },
+ "attachments": {
+ "message": "Załączniki"
+ },
+ "deleteAttachment": {
+ "message": "Usuń załącznik"
+ },
+ "deleteAttachmentConfirmation": {
+ "message": "Czy na pewno chcesz usunąć ten załącznik?"
+ },
+ "deletedAttachment": {
+ "message": "Załącznik został usunięty"
+ },
+ "newAttachment": {
+ "message": "Dodaj załącznik"
+ },
+ "noAttachments": {
+ "message": "Brak załączników."
+ },
+ "attachmentSaved": {
+ "message": "Załącznik został zapisany."
+ },
+ "file": {
+ "message": "Plik"
+ },
+ "selectFile": {
+ "message": "Wybierz plik."
+ },
+ "maxFileSize": {
+ "message": "Maksymalny rozmiar pliku to 500 MB."
+ },
+ "featureUnavailable": {
+ "message": "Funkcja jest niedostępna"
+ },
+ "updateKey": {
+ "message": "Nie możesz używać tej funkcji, dopóki nie zaktualizujesz klucza szyfrowania."
+ },
+ "premiumMembership": {
+ "message": "Konto Premium"
+ },
+ "premiumManage": {
+ "message": "Zarządzaj kontem Premium"
+ },
+ "premiumManageAlert": {
+ "message": "Kontem Premium możesz zarządzać na stronie sejfu bitwarden.com. Czy chcesz otworzyć tę stronę?"
+ },
+ "premiumRefresh": {
+ "message": "Odśwież konto Premium"
+ },
+ "premiumNotCurrentMember": {
+ "message": "Nie posiadasz obecnie konta Premium."
+ },
+ "premiumSignUpAndGet": {
+ "message": "Zarejestruj konto Premium, aby otrzymać:"
+ },
+ "ppremiumSignUpStorage": {
+ "message": "1 GB miejsca na zaszyfrowane załączniki."
+ },
+ "ppremiumSignUpTwoStep": {
+ "message": "Dodatkowe opcje logowania dwustopniowego, takie jak klucze YubiKey, FIDO U2F oraz Duo."
+ },
+ "ppremiumSignUpReports": {
+ "message": "Raporty bezpieczeństwa haseł, stanu konta i raporty wycieków danych, aby Twoje dane były bezpieczne."
+ },
+ "ppremiumSignUpTotp": {
+ "message": "Generator kodów weryfikacyjnych TOTP (2FA) dla danych logowania w Twoim sejfie."
+ },
+ "ppremiumSignUpSupport": {
+ "message": "Priorytetowe wsparcie klienta."
+ },
+ "ppremiumSignUpFuture": {
+ "message": "Wszystkie przyszłe funkcje premium. Więcej już wkrótce!"
+ },
+ "premiumPurchase": {
+ "message": "Kup konto Premium"
+ },
+ "premiumPurchaseAlert": {
+ "message": "Konto Premium możesz zakupić na stronie sejfu bitwarden.com. Czy chcesz otworzyć tę stronę?"
+ },
+ "premiumCurrentMember": {
+ "message": "Posiadasz konto Premium!"
+ },
+ "premiumCurrentMemberThanks": {
+ "message": "Dziękujemy za wspieranie Bitwarden."
+ },
+ "premiumPrice": {
+ "message": "Wszystko to jedynie za $PRICE$ /rok!",
+ "placeholders": {
+ "price": {
+ "content": "$1",
+ "example": "$10"
+ }
+ }
+ },
+ "refreshComplete": {
+ "message": "Odświeżanie zostało zakończone"
+ },
+ "disableAutoTotpCopy": {
+ "message": "Wyłącz automatyczne kopiowanie kodu TOTP"
+ },
+ "disableAutoTotpCopyDesc": {
+ "message": "Jeśli dane logowania posiadają dołączony klucz uwierzytelniający TOTP, kod weryfikacyjny jest automatycznie kopiowany do schowka przy każdym autouzupełnianiu danych logowania."
+ },
+ "disableAutoBiometricsPrompt": {
+ "message": "Nie pytaj o autoryzację biometryczną podczas uruchamiania."
+ },
+ "premiumRequired": {
+ "message": "Konto Premium jest wymagane"
+ },
+ "premiumRequiredDesc": {
+ "message": "Konto Premium jest wymagane, aby skorzystać z tej funkcji."
+ },
+ "enterVerificationCodeApp": {
+ "message": "Wpisz 6-cyfrowy kod weryfikacyjny z aplikacji uwierzytelniającej."
+ },
+ "enterVerificationCodeEmail": {
+ "message": "Wpisz 6-cyfrowy kod weryfikacyjny, który został przesłany na adres $EMAIL$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "example@gmail.com"
+ }
+ }
+ },
+ "verificationCodeEmailSent": {
+ "message": "Kod weryfikacyjny został wysłany na adres $EMAIL$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "example@gmail.com"
+ }
+ }
+ },
+ "rememberMe": {
+ "message": "Zapamiętaj mnie"
+ },
+ "sendVerificationCodeEmailAgain": {
+ "message": "Wyślij ponownie wiadomość z kodem weryfikacyjnym"
+ },
+ "useAnotherTwoStepMethod": {
+ "message": "Użyj innej metody logowania dwustopniowego"
+ },
+ "insertYubiKey": {
+ "message": "Włóż klucz YubiKey do portu USB komputera, a następnie dotknij jego przycisku."
+ },
+ "insertU2f": {
+ "message": "Włóż klucz bezpieczeństwa do portu USB komputera. Jeśli klucz posiada przycisk, dotknij go."
+ },
+ "webAuthnNewTab": {
+ "message": "Kontynuuj logowanie dwustopniowe WebAuthn w nowej karcie."
+ },
+ "webAuthnNewTabOpen": {
+ "message": "Otwórz nową kartę"
+ },
+ "webAuthnAuthenticate": {
+ "message": "Uwierzytelnianie WebAuthn"
+ },
+ "loginUnavailable": {
+ "message": "Logowanie jest niedostępne"
+ },
+ "noTwoStepProviders": {
+ "message": "Konto posiada włączoną opcję logowania dwustopniowego, jednak ta przeglądarka nie wspiera żadnego ze skonfigurowanych mechanizmów autoryzacji dwustopniowej."
+ },
+ "noTwoStepProviders2": {
+ "message": "Proszę użyć obsługiwanej przeglądarki (takiej jak Chrome) i/lub dodać dodatkowych dostawców, którzy są lepiej wspierani przez przeglądarki internetowe (np. aplikacja uwierzytelniająca)."
+ },
+ "twoStepOptions": {
+ "message": "Opcje logowania dwustopniowego"
+ },
+ "recoveryCodeDesc": {
+ "message": "Utraciłeś dostęp do wszystkich swoich mechanizmów dwustopniowego logowania? Użyj kodów odzyskiwania, aby wyłączyć dwustopniowe logowanie na Twoim koncie."
+ },
+ "recoveryCodeTitle": {
+ "message": "Kod odzyskiwania"
+ },
+ "authenticatorAppTitle": {
+ "message": "Aplikacja uwierzytelniająca"
+ },
+ "authenticatorAppDesc": {
+ "message": "Użyj aplikacji mobilnej (np. Authy lub Google Authenticator) do generowania czasowych kodów weryfikacyjnych.",
+ "description": "'Authy' and 'Google Authenticator' are product names and should not be translated."
+ },
+ "yubiKeyTitle": {
+ "message": "Klucz bezpieczeństwa YubiKey OTP"
+ },
+ "yubiKeyDesc": {
+ "message": "Użyj YubiKey jako metody dostępu do konta. Działa z YubiKey 4, 4 Nano, 4C i urządzeniami NEO."
+ },
+ "duoDesc": {
+ "message": "Weryfikacja z użyciem Duo Security poprzez aplikację Duo Mobile, SMS, połączenie telefoniczne lub klucz bezpieczeństwa U2F.",
+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
+ },
+ "duoOrganizationDesc": {
+ "message": "Weryfikacja dostępu do Twojej organizacji z użyciem Duo Security poprzez aplikację Duo Mobile, SMS, połączenie telefoniczne lub klucz bezpieczeństwa U2F.",
+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
+ },
+ "webAuthnTitle": {
+ "message": "FIDO2 WebAuthn"
+ },
+ "webAuthnDesc": {
+ "message": "Użyj dowolnego klucza bezpieczeństwa WebAuthn, aby uzyskać dostęp do swojego konta."
+ },
+ "emailTitle": {
+ "message": "Adres e-mail"
+ },
+ "emailDesc": {
+ "message": "Kody weryfikacyjne zostaną wysłane do Ciebie wiadomością e-mail."
+ },
+ "selfHostedEnvironment": {
+ "message": "Samodzielnie hostowane środowisko"
+ },
+ "selfHostedEnvironmentFooter": {
+ "message": "Wpisz podstawowy adres URL hostowanej instalacji Bitwarden."
+ },
+ "customEnvironment": {
+ "message": "Niestandardowe środowisko"
+ },
+ "customEnvironmentFooter": {
+ "message": "Dla zaawansowanych użytkowników. Możesz wpisać podstawowy adres URL niezależnie dla każdej usługi."
+ },
+ "baseUrl": {
+ "message": "Adres URL serwera"
+ },
+ "apiUrl": {
+ "message": "Adres URL serwera interfejsu API"
+ },
+ "webVaultUrl": {
+ "message": "Adres URL serwera sejfu internetowego"
+ },
+ "identityUrl": {
+ "message": "Adres URL serwera tożsamości"
+ },
+ "notificationsUrl": {
+ "message": "Adres URL serwera powiadomień"
+ },
+ "iconsUrl": {
+ "message": "Adres URL serwera ikon"
+ },
+ "environmentSaved": {
+ "message": "Adresy URL środowiska zostały zapisane."
+ },
+ "enableAutoFillOnPageLoad": {
+ "message": "Włącz autouzupełnianie po załadowaniu strony"
+ },
+ "enableAutoFillOnPageLoadDesc": {
+ "message": "Jeśli zostanie wykryty formularz logowania, automatycznie uzupełnij dane logowania po załadowaniu strony."
+ },
+ "experimentalFeature": {
+ "message": "Obecnie jest to funkcja eksperymentalna. Używaj na własne ryzyko."
+ },
+ "defaultAutoFillOnPageLoad": {
+ "message": "Domyślne ustawienie autouzupełniania"
+ },
+ "defaultAutoFillOnPageLoadDesc": {
+ "message": "Po włączeniu autouzupełnianiu po załadowaniu strony, możesz włączyć lub wyłączyć tę funkcję dla poszczególnych wpisów."
+ },
+ "itemAutoFillOnPageLoad": {
+ "message": "Automatycznie uzupełniaj po załadowaniu strony (jeśli włączono w opcjach)"
+ },
+ "autoFillOnPageLoadUseDefault": {
+ "message": "Użyj domyślnego ustawienia"
+ },
+ "autoFillOnPageLoadYes": {
+ "message": "Automatycznie uzupełniaj po załadowaniu strony"
+ },
+ "autoFillOnPageLoadNo": {
+ "message": "Nie uzupełniaj automatycznie po załadowaniu strony"
+ },
+ "commandOpenPopup": {
+ "message": "Otwórz sejf w oknie"
+ },
+ "commandOpenSidebar": {
+ "message": "Otwórz sejf na pasku bocznym"
+ },
+ "commandAutofillDesc": {
+ "message": "Autouzupełnianie korzysta z ostatnio używanych danych logowania na tej stronie."
+ },
+ "commandGeneratePasswordDesc": {
+ "message": "Wygeneruj nowe losowe hasło i skopiuj je do schowka."
+ },
+ "commandLockVaultDesc": {
+ "message": "Zablokuj sejf"
+ },
+ "privateModeMessage": {
+ "message": "Niestety to okno nie jest dostępne w trybie prywatnym tej przeglądarki."
+ },
+ "customFields": {
+ "message": "Pola niestandardowe"
+ },
+ "copyValue": {
+ "message": "Kopiuj wartość"
+ },
+ "value": {
+ "message": "Wartość"
+ },
+ "newCustomField": {
+ "message": "Nowe pole niestandardowe"
+ },
+ "dragToSort": {
+ "message": "Przeciągnij, aby posortować"
+ },
+ "cfTypeText": {
+ "message": "Tekst"
+ },
+ "cfTypeHidden": {
+ "message": "Pole maskowane"
+ },
+ "cfTypeBoolean": {
+ "message": "Wartość logiczna"
+ },
+ "popup2faCloseMessage": {
+ "message": "Kliknięcie poza okno, w celu sprawdzenia wiadomość z kodem weryfikacyjnym spowoduje, że zostanie ono zamknięte. Czy chcesz otworzyć nowe okno tak, aby się nie zamknęło?"
+ },
+ "popupU2fCloseMessage": {
+ "message": "Ta przeglądarka nie może przetworzyć żądania U2F w tym oknie. Czy chcesz otworzyć nowe okno przeglądarki, aby zalogować się przy pomocy klucza U2F?"
+ },
+ "disableFavicon": {
+ "message": "Wyłącz ikony stron"
+ },
+ "disableFaviconDesc": {
+ "message": "Wyświetlaj rozpoznawalną ikonę serwisu obok danych logowania w sejfie."
+ },
+ "disableBadgeCounter": {
+ "message": "Wyłącz licznik logowań"
+ },
+ "disableBadgeCounterDesc": {
+ "message": "Licznik informuje, ile razy zalogowałeś się na obecnej stronie w sejfie."
+ },
+ "cardholderName": {
+ "message": "Właściciel karty"
+ },
+ "number": {
+ "message": "Numer"
+ },
+ "brand": {
+ "message": "Wydawca"
+ },
+ "expirationMonth": {
+ "message": "Miesiąc wygaśnięcia"
+ },
+ "expirationYear": {
+ "message": "Rok wygaśnięcia"
+ },
+ "expiration": {
+ "message": "Data wygaśnięcia"
+ },
+ "january": {
+ "message": "Styczeń"
+ },
+ "february": {
+ "message": "Luty"
+ },
+ "march": {
+ "message": "Marzec"
+ },
+ "april": {
+ "message": "Kwiecień"
+ },
+ "may": {
+ "message": "Maj"
+ },
+ "june": {
+ "message": "Czerwiec"
+ },
+ "july": {
+ "message": "Lipiec"
+ },
+ "august": {
+ "message": "Sierpień"
+ },
+ "september": {
+ "message": "September"
+ },
+ "october": {
+ "message": "Październik"
+ },
+ "november": {
+ "message": "Listopad"
+ },
+ "december": {
+ "message": "Grudzień"
+ },
+ "securityCode": {
+ "message": "Kod zabezpieczający"
+ },
+ "ex": {
+ "message": "np."
+ },
+ "title": {
+ "message": "Tytuł"
+ },
+ "mr": {
+ "message": "Pan"
+ },
+ "mrs": {
+ "message": "Mrs"
+ },
+ "ms": {
+ "message": "Pani"
+ },
+ "dr": {
+ "message": "Doktor"
+ },
+ "firstName": {
+ "message": "Imię"
+ },
+ "middleName": {
+ "message": "Drugie imię"
+ },
+ "lastName": {
+ "message": "Nazwisko"
+ },
+ "identityName": {
+ "message": "Nazwa profilu"
+ },
+ "company": {
+ "message": "Firma"
+ },
+ "ssn": {
+ "message": "Numer PESEL"
+ },
+ "passportNumber": {
+ "message": "Numer paszportu"
+ },
+ "licenseNumber": {
+ "message": "Numer prawa jazdy"
+ },
+ "email": {
+ "message": "Adres e-mail"
+ },
+ "phone": {
+ "message": "Telefon"
+ },
+ "address": {
+ "message": "Adres"
+ },
+ "address1": {
+ "message": "Adres 1"
+ },
+ "address2": {
+ "message": "Adres 2"
+ },
+ "address3": {
+ "message": "Adres 3"
+ },
+ "cityTown": {
+ "message": "Miasto"
+ },
+ "stateProvince": {
+ "message": "Województwo"
+ },
+ "zipPostalCode": {
+ "message": "Kod pocztowy"
+ },
+ "country": {
+ "message": "Kraj"
+ },
+ "type": {
+ "message": "Rodzaj"
+ },
+ "typeLogin": {
+ "message": "Dane logowania"
+ },
+ "typeLogins": {
+ "message": "Dane logowania"
+ },
+ "typeSecureNote": {
+ "message": "Bezpieczna notatka"
+ },
+ "typeCard": {
+ "message": "Karta"
+ },
+ "typeIdentity": {
+ "message": "Tożsamość"
+ },
+ "passwordHistory": {
+ "message": "Historia haseł"
+ },
+ "back": {
+ "message": "Powrót"
+ },
+ "collections": {
+ "message": "Kolekcje"
+ },
+ "favorites": {
+ "message": "Ulubione"
+ },
+ "popOutNewWindow": {
+ "message": "Wyświetl w nowym oknie"
+ },
+ "refresh": {
+ "message": "Odśwież"
+ },
+ "cards": {
+ "message": "Karty"
+ },
+ "identities": {
+ "message": "Tożsamości"
+ },
+ "logins": {
+ "message": "Dane logowania"
+ },
+ "secureNotes": {
+ "message": "Bezpieczne notatki"
+ },
+ "clear": {
+ "message": "Wyczyść",
+ "description": "To clear something out. example: To clear browser history."
+ },
+ "checkPassword": {
+ "message": "Sprawdź, czy hasło zostało ujawnione."
+ },
+ "passwordExposed": {
+ "message": "To hasło znajduje się w $VALUE$ wykradzionej(ych) bazie(ach) danych. Należy je zmienić.",
+ "placeholders": {
+ "value": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "passwordSafe": {
+ "message": "To hasło nie znajduje się w żadnej znanej wykradzionej bazie danych. Powinno być bezpieczne."
+ },
+ "baseDomain": {
+ "message": "Domena podstawowa"
+ },
+ "host": {
+ "message": "Host",
+ "description": "A URL's host value. For example, the host of https://sub.domain.com:443 is 'sub.domain.com:443'."
+ },
+ "exact": {
+ "message": "Dokładnie"
+ },
+ "startsWith": {
+ "message": "Rozpoczyna się od"
+ },
+ "regEx": {
+ "message": "Wyrażenie regularne",
+ "description": "A programming term, also known as 'RegEx'."
+ },
+ "matchDetection": {
+ "message": "Wykrywanie dopasowania",
+ "description": "URI match detection for auto-fill."
+ },
+ "defaultMatchDetection": {
+ "message": "Domyślne wykrywanie dopasowania",
+ "description": "Default URI match detection for auto-fill."
+ },
+ "toggleOptions": {
+ "message": "Zmień opcje"
+ },
+ "toggleCurrentUris": {
+ "message": "Przełącz obecny URI",
+ "description": "Toggle the display of the URIs of the currently open tabs in the browser."
+ },
+ "currentUri": {
+ "message": "Obecny URI",
+ "description": "The URI of one of the current open tabs in the browser."
+ },
+ "organization": {
+ "message": "Organizacja",
+ "description": "An entity of multiple related people (ex. a team or business organization)."
+ },
+ "types": {
+ "message": "Rodzaje"
+ },
+ "allItems": {
+ "message": "Wszystkie elementy"
+ },
+ "noPasswordsInList": {
+ "message": "Brak haseł."
+ },
+ "remove": {
+ "message": "Usuń"
+ },
+ "default": {
+ "message": "Domyślny"
+ },
+ "dateUpdated": {
+ "message": "Zaktualizowano",
+ "description": "ex. Date this item was updated"
+ },
+ "datePasswordUpdated": {
+ "message": "Aktualizacja hasła",
+ "description": "ex. Date this password was updated"
+ },
+ "neverLockWarning": {
+ "message": "Czy na pewno chcesz użyć opcji \"Nigdy\"? Ustawienie opcji blokady na \"Nigdy\" przechowuje klucz szyfrowania Twojego sejfu na urządzeniu. Jeśli używasz tej opcji upewnij się, że odpowiednio zabezpieczasz swoje urządzenie."
+ },
+ "noOrganizationsList": {
+ "message": "Nie należysz do żadnej organizacji. Organizacje pozwalają na bezpieczne udostępnianie elementów innym użytkownikom."
+ },
+ "noCollectionsInList": {
+ "message": "Brak kolekcji do wyświetlenia."
+ },
+ "ownership": {
+ "message": "Właściciel"
+ },
+ "whoOwnsThisItem": {
+ "message": "Kto jest właścicielem tego elementu?"
+ },
+ "strong": {
+ "message": "Silne",
+ "description": "ex. A strong password. Scale: Weak -> Good -> Strong"
+ },
+ "good": {
+ "message": "Dobre",
+ "description": "ex. A good password. Scale: Weak -> Good -> Strong"
+ },
+ "weak": {
+ "message": "Słabe",
+ "description": "ex. A weak password. Scale: Weak -> Good -> Strong"
+ },
+ "weakMasterPassword": {
+ "message": "Słabe hasło główne"
+ },
+ "weakMasterPasswordDesc": {
+ "message": "Wybrane przez Ciebie hasło główne jest słabe. Powinieneś użyć silniejszego hasła (lub frazy), aby właściwie chronić swoje konto Bitwarden. Czy na pewno chcesz użyć tego hasła głównego?"
+ },
+ "pin": {
+ "message": "Kod PIN",
+ "description": "PIN code. Ex. The short code (often numeric) that you use to unlock a device."
+ },
+ "unlockWithPin": {
+ "message": "Odblokuj kodem PIN"
+ },
+ "setYourPinCode": {
+ "message": "Ustaw kod PIN do odblokowywania aplikacji Bitwarden. Ustawienia odblokowywania kodem PIN zostaną zresetowane po wylogowaniu."
+ },
+ "pinRequired": {
+ "message": "Kod PIN jest wymagany."
+ },
+ "invalidPin": {
+ "message": "Kod PIN jest nieprawidłowy."
+ },
+ "verifyPin": {
+ "message": "Zweryfikuj kod PIN"
+ },
+ "yourVaultIsLockedPinCode": {
+ "message": "Sejf jest zablokowany. Wpisz kod PIN, aby kontynuować."
+ },
+ "unlockWithBiometrics": {
+ "message": "Odblokuj danymi biometrycznymi"
+ },
+ "awaitDesktop": {
+ "message": "Oczekiwanie na potwierdzenie z aplikacji desktopowej"
+ },
+ "awaitDesktopDesc": {
+ "message": "Włącz dane biometryczne w aplikacji desktopowej Bitwarden, aby włączyć tę samą funkcję w przeglądarce."
+ },
+ "lockWithMasterPassOnRestart": {
+ "message": "Zablokuj hasłem głównym po uruchomieniu przeglądarki"
+ },
+ "selectOneCollection": {
+ "message": "Musisz wybrać co najmniej jedną kolekcję."
+ },
+ "cloneItem": {
+ "message": "Klonuj element"
+ },
+ "clone": {
+ "message": "Klonuj"
+ },
+ "passwordGeneratorPolicyInEffect": {
+ "message": "Co najmniej jedna zasada organizacji wpływa na ustawienia generatora."
+ },
+ "vaultTimeoutAction": {
+ "message": "Sposób blokowania sejfu"
+ },
+ "lock": {
+ "message": "Zablokuj",
+ "description": "Verb form: to make secure or inaccesible by"
+ },
+ "trash": {
+ "message": "Kosz",
+ "description": "Noun: a special folder to hold deleted items"
+ },
+ "searchTrash": {
+ "message": "Szukaj w koszu"
+ },
+ "permanentlyDeleteItem": {
+ "message": "Usuń trwale element"
+ },
+ "permanentlyDeleteItemConfirmation": {
+ "message": "Czy na pewno chcesz usunąć trwale ten element?"
+ },
+ "permanentlyDeletedItem": {
+ "message": "Element został trwale usunięty"
+ },
+ "restoreItem": {
+ "message": "Przywróć element"
+ },
+ "restoreItemConfirmation": {
+ "message": "Czy na pewno chcesz przywrócić ten element?"
+ },
+ "restoredItem": {
+ "message": "Element został przywrócony"
+ },
+ "vaultTimeoutLogOutConfirmation": {
+ "message": "Po wylogowaniu się z sejfu musisz ponownie zalogować się, aby uzyskać do niego dostęp. Czy na pewno chcesz użyć tego ustawienia?"
+ },
+ "vaultTimeoutLogOutConfirmationTitle": {
+ "message": "Potwierdź sposób blokowania sejfu"
+ },
+ "autoFillAndSave": {
+ "message": "Automatycznie uzupełnij i zapisz"
+ },
+ "autoFillSuccessAndSavedUri": {
+ "message": "URI został zapisany i automatycznie uzupełniony"
+ },
+ "autoFillSuccess": {
+ "message": "Element został automatycznie uzupełniony"
+ },
+ "setMasterPassword": {
+ "message": "Ustaw hasło główne"
+ },
+ "masterPasswordPolicyInEffect": {
+ "message": "Co najmniej jedna zasada organizacji wymaga, aby hasło główne spełniało następujące wymagania:"
+ },
+ "policyInEffectMinComplexity": {
+ "message": "Minimalny poziom złożoności wynosi $SCORE$",
+ "placeholders": {
+ "score": {
+ "content": "$1",
+ "example": "4"
+ }
+ }
+ },
+ "policyInEffectMinLength": {
+ "message": "Minimalna długość wynosi $LENGTH$",
+ "placeholders": {
+ "length": {
+ "content": "$1",
+ "example": "14"
+ }
+ }
+ },
+ "policyInEffectUppercase": {
+ "message": "Zawiera co najmniej jedną wielką literę"
+ },
+ "policyInEffectLowercase": {
+ "message": "Zawiera co najmniej jedną małą literę"
+ },
+ "policyInEffectNumbers": {
+ "message": "Zawiera co najmniej jedną cyfrę"
+ },
+ "policyInEffectSpecial": {
+ "message": "Zawiera co najmniej jeden następujący znak specjalny $CHARS$",
+ "placeholders": {
+ "chars": {
+ "content": "$1",
+ "example": "!@#$%^&*"
+ }
+ }
+ },
+ "masterPasswordPolicyRequirementsNotMet": {
+ "message": "Nowe hasło główne nie spełnia wymaganych zasad."
+ },
+ "acceptPolicies": {
+ "message": "Zaznaczając tę opcję, akceptujesz:"
+ },
+ "acceptPoliciesError": {
+ "message": "Nie zaakceptowałeś regulaminu i polityki prywatności."
+ },
+ "termsOfService": {
+ "message": "Regulamin"
+ },
+ "privacyPolicy": {
+ "message": "Polityka prywatności"
+ },
+ "hintEqualsPassword": {
+ "message": "Podpowiedź do hasła nie może być taka sama jak hasło."
+ },
+ "ok": {
+ "message": "Ok"
+ },
+ "desktopSyncVerificationTitle": {
+ "message": "Weryfikacja synchronizacji z aplikacją desktopową"
+ },
+ "desktopIntegrationVerificationText": {
+ "message": "Zweryfikuj aplikację desktopową z wyświetlonym identyfikatorem: "
+ },
+ "desktopIntegrationDisabledTitle": {
+ "message": "Połączenie z przeglądarką jest wyłączone"
+ },
+ "desktopIntegrationDisabledDesc": {
+ "message": "Połączenie z przeglądarką jest wyłączone. Włącz funkcję w ustawieniach aplikacji desktopowej Bitwarden."
+ },
+ "startDesktopTitle": {
+ "message": "Uruchom aplikację desktopową Bitwarden"
+ },
+ "startDesktopDesc": {
+ "message": "Aplikacja desktopowa Bitwarden, przed użyciem tej funkcji, musi zostać ponownie uruchomiona."
+ },
+ "errorEnableBiometricTitle": {
+ "message": "Nie można włączyć danych biometrycznych"
+ },
+ "errorEnableBiometricDesc": {
+ "message": "Operacja została anulowana przez aplikację desktopową"
+ },
+ "nativeMessagingInvalidEncryptionDesc": {
+ "message": "Aplikacja desktopowa unieważniła bezpieczny kanał komunikacji. Spróbuj ponownie wykonać tę operację"
+ },
+ "nativeMessagingInvalidEncryptionTitle": {
+ "message": "Komunikacja z aplikacją desktopową została przerwana"
+ },
+ "nativeMessagingWrongUserDesc": {
+ "message": "W aplikacji desktopowej jesteś zalogowany na inne konto. Upewnij się, że w obu aplikacjach jesteś zalogowany na to same konto."
+ },
+ "nativeMessagingWrongUserTitle": {
+ "message": "Konto jest niezgodne"
+ },
+ "biometricsNotEnabledTitle": {
+ "message": "Dane biometryczne są wyłączone"
+ },
+ "biometricsNotEnabledDesc": {
+ "message": "Aby włączyć dane biometryczne w przeglądarce, musisz włączyć tę samą funkcję w ustawianiach aplikacji desktopowej."
+ },
+ "biometricsNotSupportedTitle": {
+ "message": "Dane biometryczne nie są obsługiwane"
+ },
+ "biometricsNotSupportedDesc": {
+ "message": "Dane biometryczne przeglądarki nie są obsługiwane na tym urządzeniu."
+ },
+ "nativeMessaginPermissionErrorTitle": {
+ "message": "Uprawnienie nie zostało przyznane"
+ },
+ "nativeMessaginPermissionErrorDesc": {
+ "message": "Bez uprawnienia do komunikowania się z aplikacją desktopową Bitwarden nie możemy dostarczyć obsługi danych biometrycznych w rozszerzeniu przeglądarki. Spróbuj ponownie."
+ },
+ "nativeMessaginPermissionSidebarTitle": {
+ "message": "Wystąpił błąd żądania uprawnienia"
+ },
+ "nativeMessaginPermissionSidebarDesc": {
+ "message": "Ta operacja nie może zostać wykonana na pasku bocznym. Spróbuj ponownie w nowym oknie."
+ },
+ "personalOwnershipSubmitError": {
+ "message": "Ze względu na zasadę przedsiębiorstwa, nie możesz zapisywać elementów w osobistym sejfie. Zmień właściciela elementu na organizację i wybierz jedną z dostępnych kolekcji."
+ },
+ "personalOwnershipPolicyInEffect": {
+ "message": "Zasada organizacji ma wpływ na opcję własności elementów."
+ },
+ "excludedDomains": {
+ "message": "Wykluczone domeny"
+ },
+ "excludedDomainsDesc": {
+ "message": "Aplikacja Bitwarden nie będzie proponować zapisywania danych logowania dla tych domen. Musisz odświeżyć stronę, aby zastosowywać zmiany."
+ },
+ "excludedDomainsInvalidDomain": {
+ "message": "$DOMAIN$ nie jest prawidłową nazwą domeny",
+ "placeholders": {
+ "domain": {
+ "content": "$1",
+ "example": "googlecom"
+ }
+ }
+ },
+ "send": {
+ "message": "Wyślij",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "searchSends": {
+ "message": "Szukaj w wysyłkach",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "addSend": {
+ "message": "Dodaj wysyłkę",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTypeText": {
+ "message": "Tekst"
+ },
+ "sendTypeFile": {
+ "message": "Plik"
+ },
+ "allSends": {
+ "message": "Wszystkie wysyłki",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "maxAccessCountReached": {
+ "message": "Maksymalna liczba dostępów została osiągnięta"
+ },
+ "expired": {
+ "message": "Wygasła"
+ },
+ "pendingDeletion": {
+ "message": "Oczekiwanie na usunięcie"
+ },
+ "passwordProtected": {
+ "message": "Chroniona hasłem"
+ },
+ "copySendLink": {
+ "message": "Kopiuj link wysyłki",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "removePassword": {
+ "message": "Usuń hasło"
+ },
+ "delete": {
+ "message": "Usuń"
+ },
+ "removedPassword": {
+ "message": "Hasło zostało usunięte"
+ },
+ "deletedSend": {
+ "message": "Wysyłka została usunięta",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendLink": {
+ "message": "Link wysyłki",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "disabled": {
+ "message": "Wyłączona"
+ },
+ "removePasswordConfirmation": {
+ "message": "Czy na pewno chcesz usunąć hasło?"
+ },
+ "deleteSend": {
+ "message": "Usuń wysyłkę",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "deleteSendConfirmation": {
+ "message": "Czy na pewno chcesz usunąć tę wysyłkę?",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "editSend": {
+ "message": "Edytuj wysyłkę",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTypeHeader": {
+ "message": "Jakiego typu jest to wysyłka?",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendNameDesc": {
+ "message": "Nazwa wysyłki.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendFileDesc": {
+ "message": "Plik, który chcesz wysłać."
+ },
+ "deletionDate": {
+ "message": "Data usunięcia"
+ },
+ "deletionDateDesc": {
+ "message": "Wysyłka zostanie trwale usunięta w określonym czasie.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "expirationDate": {
+ "message": "Data wygaśnięcia"
+ },
+ "expirationDateDesc": {
+ "message": "Jeśli funkcja jest włączona, dostęp do wysyłki wygaśnie po określonym czasie.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "oneDay": {
+ "message": "1 dzień"
+ },
+ "days": {
+ "message": "$DAYS$ dni",
+ "placeholders": {
+ "days": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "custom": {
+ "message": "Niestandardowa"
+ },
+ "maximumAccessCount": {
+ "message": "Maksymalna liczba dostępów"
+ },
+ "maximumAccessCountDesc": {
+ "message": "Jeśli funkcja jest włączona, po osiągnięciu maksymalnej liczby dostępów, użytkownicy nie będą mieli dostępu do tej wysyłki.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendPasswordDesc": {
+ "message": "Opcjonalne hasło dla użytkownika, aby uzyskać dostęp do wysyłki.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendNotesDesc": {
+ "message": "Prywatne notatki o tej wysyłce.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendDisableDesc": {
+ "message": "Wyłącz wysyłkę, aby nikt nie miał do niej dostępu.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendShareDesc": {
+ "message": "Po zapisaniu wysyłki, skopiuj link do schowka.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTextDesc": {
+ "message": "Tekst, który chcesz wysłać."
+ },
+ "sendHideText": {
+ "message": "Ukryj domyślnie tekst wysyłki.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "currentAccessCount": {
+ "message": "Obecna liczba dostępów"
+ },
+ "createSend": {
+ "message": "Utwórz nową wysyłkę",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "newPassword": {
+ "message": "Nowe hasło"
+ },
+ "sendDisabled": {
+ "message": "Wysyłka została wyłączona",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendDisabledWarning": {
+ "message": "Ze względu na zasadę przedsiębiorstwa, tylko Ty możesz usunąć obecną wysyłkę.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "createdSend": {
+ "message": "Wysyłka została utworzona",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "editedSend": {
+ "message": "Wysyłka została zaktualizowana",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendLinuxChromiumFileWarning": {
+ "message": "Aby wybrać plik, otwórz rozszerzenie na pasku bocznym (jeśli to możliwe) lub w nowym oknie."
+ },
+ "sendFirefoxFileWarning": {
+ "message": "Aby wybrać plik za pomocą przeglądarki Firefox, otwórz rozszerzenie w nowym oknie."
+ },
+ "sendSafariFileWarning": {
+ "message": "Aby wybrać plik za pomocą przeglądarki Safari, otwórz rozszerzenie w nowym oknie."
+ },
+ "sendFileCalloutHeader": {
+ "message": "Zanim zaczniesz"
+ },
+ "sendFirefoxCustomDatePopoutMessage1": {
+ "message": "Aby wybrać datę, ",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read '**To use a calendar style date picker ** click here to pop out your window.'"
+ },
+ "sendFirefoxCustomDatePopoutMessage2": {
+ "message": "kliknij tutaj",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker **click here** to pop out your window.'"
+ },
+ "sendFirefoxCustomDatePopoutMessage3": {
+ "message": "w celu otwarcia rozszerzenia w oknie.",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker click here **to pop out your window.**'"
+ },
+ "expirationDateIsInvalid": {
+ "message": "Data wygaśnięcia nie jest prawidłowa."
+ },
+ "deletionDateIsInvalid": {
+ "message": "Data usunięcia nie jest prawidłowa."
+ },
+ "expirationDateAndTimeRequired": {
+ "message": "Data i czas wygaśnięcia są wymagane."
+ },
+ "deletionDateAndTimeRequired": {
+ "message": "Data i czas usunięcia są wymagane."
+ },
+ "dateParsingError": {
+ "message": "Wystąpił błąd podczas zapisywania dat usunięcia i wygaśnięcia."
+ },
+ "hideEmail": {
+ "message": "Ukryj mój adres e-mail przed odbiorcami."
+ },
+ "sendOptionsPolicyInEffect": {
+ "message": "Co najmniej jedna zasada organizacji wpływa na ustawienia wysyłek."
+ },
+ "passwordPrompt": {
+ "message": "Powtórz hasło główne"
+ },
+ "passwordConfirmation": {
+ "message": "Potwierdź hasło główne"
+ },
+ "passwordConfirmationDesc": {
+ "message": "Ta operacja jest chroniona. Aby kontynuować, wpisz ponownie hasło główne."
+ },
+ "emailVerificationRequired": {
+ "message": "Weryfikacja adresu e-mail jest wymagana"
+ },
+ "emailVerificationRequiredDesc": {
+ "message": "Musisz zweryfikować adres e-mail, aby korzystać z tej funkcji. Adres możesz zweryfikować w sejfie internetowym."
+ },
+ "updatedMasterPassword": {
+ "message": "Hasło główne zostało zaktualizowane"
+ },
+ "updateMasterPassword": {
+ "message": "Zaktualizuj hasło główne"
+ },
+ "updateMasterPasswordWarning": {
+ "message": "Hasło główne zostało zmienione przez administratora Twojej organizacji. Musisz je zaktualizować, aby uzyskać dostęp do sejfu. Ta czynność spowoduje wylogowanie z bieżącej sesji, przez co konieczne będzie ponowne zalogowanie się. Aktywne sesje na innych urządzeniach mogą pozostać aktywne przez maksymalnie godzinę."
+ },
+ "resetPasswordPolicyAutoEnroll": {
+ "message": "Automatyczne rejestrowanie użytkowników do resetowania hasła"
+ },
+ "resetPasswordAutoEnrollInviteWarning": {
+ "message": "Ta organizacja posługuje się zasadą, która automatycznie rejestruje użytkowników do resetowania hasła. Rejestracja umożliwia administratorom organizacji zmianę Twojego hasła głównego."
+ },
+ "selectFolder": {
+ "message": "Wybierz folder..."
+ },
+ "ssoCompleteRegistration": {
+ "message": "W celu zakończenia jednokrotnego logowania SSO, ustaw hasło główne, aby uzyskać dostęp do sejfu."
+ },
+ "hours": {
+ "message": "Godziny"
+ },
+ "minutes": {
+ "message": "Minuty"
+ },
+ "vaultTimeoutPolicyInEffect": {
+ "message": "Zasady organizacji mają wpływ czas blokowania sejfu. Maksymalny dozwolony czas wynosi $HOURS$ godz. i $MINUTES$ min.",
+ "placeholders": {
+ "hours": {
+ "content": "$1",
+ "example": "5"
+ },
+ "minutes": {
+ "content": "$2",
+ "example": "5"
+ }
+ }
+ },
+ "vaultTimeoutToLarge": {
+ "message": "Czas blokowania sejfu przekracza limit określony przez organizację."
+ },
+ "vaultExportDisabled": {
+ "message": "Eksportowanie sejfu zostało wyłączone"
+ },
+ "personalVaultExportPolicyInEffect": {
+ "message": "Co najmniej jedna zasada organizacji uniemożliwia wyeksportowanie Twojego sejfu."
+ },
+ "copyCustomFieldNameInvalidElement": {
+ "message": "Nie można zidentyfikować poprawnego elementu formularza. Spróbuj sprawdzić kod HTML."
+ },
+ "copyCustomFieldNameNotUnique": {
+ "message": "Nie znaleziono unikatowego identyfikatora."
+ }
+}
diff --git a/src/iOS.Safari/Resources/_locales/pt_BR/messages.json b/src/iOS.Safari/Resources/_locales/pt_BR/messages.json
new file mode 100644
index 000000000..5fab5abae
--- /dev/null
+++ b/src/iOS.Safari/Resources/_locales/pt_BR/messages.json
@@ -0,0 +1,1817 @@
+{
+ "appName": {
+ "message": "Bitwarden"
+ },
+ "extName": {
+ "message": "Bitwarden",
+ "description": "Extension name, MUST be less than 40 characters (Safari restriction)"
+ },
+ "extDesc": {
+ "message": "Um gerenciador de senhas seguro e gratuito para todos os seus dispositivos.",
+ "description": "Extension description"
+ },
+ "loginOrCreateNewAccount": {
+ "message": "Inicie a sessão ou crie uma nova conta para acessar seu cofre seguro."
+ },
+ "createAccount": {
+ "message": "Criar Conta"
+ },
+ "login": {
+ "message": "Iniciar Sessão"
+ },
+ "enterpriseSingleSignOn": {
+ "message": "Iniciar Sessão Empresarial Única"
+ },
+ "cancel": {
+ "message": "Cancelar"
+ },
+ "close": {
+ "message": "Fechar"
+ },
+ "submit": {
+ "message": "Enviar"
+ },
+ "emailAddress": {
+ "message": "Endereço de E-mail"
+ },
+ "masterPass": {
+ "message": "Senha Mestra"
+ },
+ "masterPassDesc": {
+ "message": "A senha mestra é a senha que você usa para acessar o seu cofre. É muito importante que você não esqueça sua senha mestra. Não há maneira de recuperar a senha caso você se esqueça."
+ },
+ "masterPassHintDesc": {
+ "message": "Uma dica de senha mestra pode ajudá-lo(a) a lembrá-lo(a) caso você esqueça."
+ },
+ "reTypeMasterPass": {
+ "message": "Digite Novamente a Senha Mestra"
+ },
+ "masterPassHint": {
+ "message": "Dica de Senha Mestra (opcional)"
+ },
+ "tab": {
+ "message": "Aba"
+ },
+ "myVault": {
+ "message": "Meu Cofre"
+ },
+ "tools": {
+ "message": "Ferramentas"
+ },
+ "settings": {
+ "message": "Configurações"
+ },
+ "currentTab": {
+ "message": "Aba Atual"
+ },
+ "copyPassword": {
+ "message": "Copiar Senha"
+ },
+ "copyNote": {
+ "message": "Copiar Nota"
+ },
+ "copyUri": {
+ "message": "Copiar URI"
+ },
+ "copyUsername": {
+ "message": "Copiar Nome de Usuário"
+ },
+ "copyNumber": {
+ "message": "Copiar Número"
+ },
+ "copySecurityCode": {
+ "message": "Copiar Código de Segurança"
+ },
+ "autoFill": {
+ "message": "Autopreencher"
+ },
+ "generatePasswordCopied": {
+ "message": "Gerar Senha (copiada)"
+ },
+ "copyElementIdentifier": {
+ "message": "Copiar Nome do Campo Personalizado"
+ },
+ "noMatchingLogins": {
+ "message": "Sem credenciais correspondentes."
+ },
+ "vaultLocked": {
+ "message": "O cofre está trancado."
+ },
+ "vaultLoggedOut": {
+ "message": "O cofre foi fechado."
+ },
+ "autoFillInfo": {
+ "message": "Não há credenciais disponíveis para autopreenchimento para a aba do navegador atual."
+ },
+ "addLogin": {
+ "message": "Adicionar uma Credencial"
+ },
+ "addItem": {
+ "message": "Adicionar Item"
+ },
+ "passwordHint": {
+ "message": "Dica da Senha"
+ },
+ "enterEmailToGetHint": {
+ "message": "Insira o seu endereço de e-mail para receber a dica da sua senha mestra."
+ },
+ "getMasterPasswordHint": {
+ "message": "Obter dica da senha mestra"
+ },
+ "continue": {
+ "message": "Continuar"
+ },
+ "verificationCode": {
+ "message": "Código de Verificação"
+ },
+ "account": {
+ "message": "Conta"
+ },
+ "changeMasterPassword": {
+ "message": "Alterar Senha Mestra"
+ },
+ "fingerprintPhrase": {
+ "message": "Frase de Biometria",
+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
+ },
+ "yourAccountsFingerprint": {
+ "message": "A sua frase biométrica",
+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
+ },
+ "twoStepLogin": {
+ "message": "Login em Duas Etapas"
+ },
+ "logOut": {
+ "message": "Encerrar Sessão"
+ },
+ "about": {
+ "message": "Sobre"
+ },
+ "version": {
+ "message": "Versão"
+ },
+ "save": {
+ "message": "Salvar"
+ },
+ "move": {
+ "message": "Mover"
+ },
+ "addFolder": {
+ "message": "Adicionar Pasta"
+ },
+ "name": {
+ "message": "Nome"
+ },
+ "editFolder": {
+ "message": "Editar Pasta"
+ },
+ "deleteFolder": {
+ "message": "Excluir Pasta"
+ },
+ "folders": {
+ "message": "Pastas"
+ },
+ "noFolders": {
+ "message": "Não existem pastas para listar."
+ },
+ "helpFeedback": {
+ "message": "Ajuda & Feedback"
+ },
+ "sync": {
+ "message": "Sincronizar"
+ },
+ "syncVaultNow": {
+ "message": "Sincronizar Cofre Agora"
+ },
+ "lastSync": {
+ "message": "Última Sincronização:"
+ },
+ "passGen": {
+ "message": "Gerador de Senha"
+ },
+ "generator": {
+ "message": "Gerador",
+ "description": "Short for 'Password Generator'."
+ },
+ "passGenInfo": {
+ "message": "Gere automaticamente senhas fortes e únicas para as suas credenciais."
+ },
+ "bitWebVault": {
+ "message": "Cofre Web do Bitwarden"
+ },
+ "importItems": {
+ "message": "Importar Itens"
+ },
+ "select": {
+ "message": "Selecionar"
+ },
+ "generatePassword": {
+ "message": "Gerar Senha"
+ },
+ "regeneratePassword": {
+ "message": "Gerar Nova Senha"
+ },
+ "options": {
+ "message": "Opções"
+ },
+ "length": {
+ "message": "Comprimento"
+ },
+ "numWords": {
+ "message": "Número de Palavras"
+ },
+ "wordSeparator": {
+ "message": "Separador de Palavra"
+ },
+ "capitalize": {
+ "message": "Iniciais em Maiúsculas",
+ "description": "Make the first letter of a work uppercase."
+ },
+ "includeNumber": {
+ "message": "Incluir Número"
+ },
+ "minNumbers": {
+ "message": "Mínimo de Números"
+ },
+ "minSpecial": {
+ "message": "Mínimo Especial"
+ },
+ "avoidAmbChar": {
+ "message": "Evitar Caracteres Ambíguos"
+ },
+ "searchVault": {
+ "message": "Pesquisar no Cofre"
+ },
+ "edit": {
+ "message": "Editar"
+ },
+ "view": {
+ "message": "Ver"
+ },
+ "noItemsInList": {
+ "message": "Não há itens para listar."
+ },
+ "itemInformation": {
+ "message": "Informação do Item"
+ },
+ "username": {
+ "message": "Nome de Usuário"
+ },
+ "password": {
+ "message": "Senha"
+ },
+ "passphrase": {
+ "message": "Frase Secreta"
+ },
+ "favorite": {
+ "message": "Favorito"
+ },
+ "notes": {
+ "message": "Notas"
+ },
+ "note": {
+ "message": "Nota"
+ },
+ "editItem": {
+ "message": "Editar Item"
+ },
+ "folder": {
+ "message": "Pasta"
+ },
+ "deleteItem": {
+ "message": "Excluir Item"
+ },
+ "viewItem": {
+ "message": "Visualizar Item"
+ },
+ "launch": {
+ "message": "Abrir"
+ },
+ "website": {
+ "message": "Site"
+ },
+ "toggleVisibility": {
+ "message": "Alternar Visibilidade"
+ },
+ "manage": {
+ "message": "Gerenciar"
+ },
+ "other": {
+ "message": "Outros"
+ },
+ "rateExtension": {
+ "message": "Avaliar a Extensão"
+ },
+ "rateExtensionDesc": {
+ "message": "Por favor considere ajudar-nos com uma boa avaliação!"
+ },
+ "browserNotSupportClipboard": {
+ "message": "O seu navegador web não suporta cópia para a área de transferência. Em alternativa, copie manualmente."
+ },
+ "verifyMasterPassword": {
+ "message": "Verificar Senha Mestra"
+ },
+ "yourVaultIsLocked": {
+ "message": "O seu cofre está bloqueado. Verifique a sua senha mestra para continuar."
+ },
+ "unlock": {
+ "message": "Desbloquear"
+ },
+ "loggedInAsOn": {
+ "message": "Entrou como $EMAIL$ em $HOSTNAME$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "name@example.com"
+ },
+ "hostname": {
+ "content": "$2",
+ "example": "bitwarden.com"
+ }
+ }
+ },
+ "invalidMasterPassword": {
+ "message": "Senha mestra inválida"
+ },
+ "vaultTimeout": {
+ "message": "Tempo limite do cofre."
+ },
+ "lockNow": {
+ "message": "Bloquear Agora"
+ },
+ "immediately": {
+ "message": "Imediatamente"
+ },
+ "tenSeconds": {
+ "message": "10 segundos"
+ },
+ "twentySeconds": {
+ "message": "20 segundos"
+ },
+ "thirtySeconds": {
+ "message": "30 segundos"
+ },
+ "oneMinute": {
+ "message": "1 minuto"
+ },
+ "twoMinutes": {
+ "message": "2 minutos"
+ },
+ "fiveMinutes": {
+ "message": "5 minutos"
+ },
+ "fifteenMinutes": {
+ "message": "15 minutos"
+ },
+ "thirtyMinutes": {
+ "message": "30 minutos"
+ },
+ "oneHour": {
+ "message": "1 hora"
+ },
+ "fourHours": {
+ "message": "4 horas"
+ },
+ "onLocked": {
+ "message": "Quando o Sistema for Bloqueado"
+ },
+ "onRestart": {
+ "message": "Ao Reiniciar"
+ },
+ "never": {
+ "message": "Nunca"
+ },
+ "security": {
+ "message": "Segurança"
+ },
+ "errorOccurred": {
+ "message": "Ocorreu um erro"
+ },
+ "emailRequired": {
+ "message": "O endereço de e-mail é obrigatório."
+ },
+ "invalidEmail": {
+ "message": "Endereço de e-mail inválido."
+ },
+ "masterPassRequired": {
+ "message": "A senha mestra é obrigatória."
+ },
+ "masterPassLength": {
+ "message": "A senha mestra deve ter pelo menos 8 caracteres."
+ },
+ "masterPassDoesntMatch": {
+ "message": "A confirmação da senha mestra não corresponde."
+ },
+ "newAccountCreated": {
+ "message": "A sua nova conta foi criada! Agora você pode iniciar a sessão."
+ },
+ "masterPassSent": {
+ "message": "Enviamos um e-mail com a dica da sua senha mestra."
+ },
+ "verificationCodeRequired": {
+ "message": "O código de verificação é necessário."
+ },
+ "valueCopied": {
+ "message": " copiado",
+ "description": "Value has been copied to the clipboard.",
+ "placeholders": {
+ "value": {
+ "content": "$1",
+ "example": "Password"
+ }
+ }
+ },
+ "autofillError": {
+ "message": "Não é possível autopreencher o item selecionado nesta página. Em alternativa, copie e cole a informação."
+ },
+ "loggedOut": {
+ "message": "Sessão encerrada"
+ },
+ "loginExpired": {
+ "message": "A sua sessão expirou."
+ },
+ "logOutConfirmation": {
+ "message": "Você tem certeza que deseja sair?"
+ },
+ "yes": {
+ "message": "Sim"
+ },
+ "no": {
+ "message": "Não"
+ },
+ "unexpectedError": {
+ "message": "Ocorreu um erro inesperado."
+ },
+ "nameRequired": {
+ "message": "O nome é necessário."
+ },
+ "addedFolder": {
+ "message": "Pasta adicionada"
+ },
+ "changeMasterPass": {
+ "message": "Alterar Senha Mestra"
+ },
+ "changeMasterPasswordConfirmation": {
+ "message": "Você pode alterar a sua senha mestra no cofre web em bitwarden.com. Você deseja visitar o site agora?"
+ },
+ "twoStepLoginConfirmation": {
+ "message": "O login em duas etapas torna a sua conta mais segura ao exigir que você verifique seu login com outro dispositivo como uma chave de segurança, aplicativo de autenticação, SMS, ligação telefônica, ou e-mail. O login em duas etapas pode ser ativado no cofre web em bitwarden.com. Você deseja visitar o site agora?"
+ },
+ "editedFolder": {
+ "message": "Pasta Editada"
+ },
+ "deleteFolderConfirmation": {
+ "message": "Você tem certeza que deseja excluir esta pasta?"
+ },
+ "deletedFolder": {
+ "message": "Pasta excluída"
+ },
+ "gettingStartedTutorial": {
+ "message": "Tutorial de Introdução"
+ },
+ "gettingStartedTutorialVideo": {
+ "message": "Assista o nosso tutorial de introdução e saiba como tirar o máximo de proveito da extensão de navegador."
+ },
+ "syncingComplete": {
+ "message": "Sincronização completa"
+ },
+ "syncingFailed": {
+ "message": "A Sincronização falhou"
+ },
+ "passwordCopied": {
+ "message": "Senha copiada"
+ },
+ "uri": {
+ "message": "URL"
+ },
+ "uriPosition": {
+ "message": "URI $POSITION$",
+ "description": "A listing of URIs. Ex: URI 1, URI 2, URI 3, etc.",
+ "placeholders": {
+ "position": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "newUri": {
+ "message": "Novo URI"
+ },
+ "addedItem": {
+ "message": "Item adicionado"
+ },
+ "editedItem": {
+ "message": "Item editado"
+ },
+ "deleteItemConfirmation": {
+ "message": "Tem certeza de que pretende apagar este item?"
+ },
+ "deletedItem": {
+ "message": "Enviar item para lixeira"
+ },
+ "overwritePassword": {
+ "message": "Sobrescrever Senha"
+ },
+ "overwritePasswordConfirmation": {
+ "message": "Você tem certeza que deseja substituir a senha atual?"
+ },
+ "searchFolder": {
+ "message": "Pesquisar pasta"
+ },
+ "searchCollection": {
+ "message": "Pesquisar coleção"
+ },
+ "searchType": {
+ "message": "Pesquisar tipo"
+ },
+ "noneFolder": {
+ "message": "Nenhuma Pasta",
+ "description": "This is the folder for uncategorized items"
+ },
+ "disableAddLoginNotification": {
+ "message": "Desativar Notificação de Adicionar Credencial"
+ },
+ "addLoginNotificationDesc": {
+ "message": "A \"Notificação de Adicionar Login\" pede para salvar automaticamente novas logins para o seu cofre quando você inicia uma sessão em um site pela primeira vez."
+ },
+ "dontShowCardsCurrentTab": {
+ "message": "Não Mostrar Cartões na Página \"Aba\""
+ },
+ "dontShowCardsCurrentTabDesc": {
+ "message": "Os itens de cartão do seu cofre estão listados na página \"Aba Atual\" para facilitar o acesso ao preenchimento automático."
+ },
+ "dontShowIdentitiesCurrentTab": {
+ "message": "Não Mostrar Identidades na Página \"Aba\""
+ },
+ "dontShowIdentitiesCurrentTabDesc": {
+ "message": "Os itens de identidade do seu cofre estão listados na página \"Aba Atual\" para facilitar o acesso ao preenchimento automático."
+ },
+ "clearClipboard": {
+ "message": "Limpar Área de Transferência",
+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
+ },
+ "clearClipboardDesc": {
+ "message": "Limpar automaticamente os valores copiados da sua área de transferência.",
+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
+ },
+ "notificationAddDesc": {
+ "message": "O Bitwarden deve lembrar esta senha para você?"
+ },
+ "notificationAddSave": {
+ "message": "Sim, Salvar Agora"
+ },
+ "notificationNeverSave": {
+ "message": "Nunca para este site"
+ },
+ "disableChangedPasswordNotification": {
+ "message": "Desativar Notificação de Alteração da Senha"
+ },
+ "disableChangedPasswordNotificationDesc": {
+ "message": "A \"Notificação de Alteração da Senha\" solicita automaticamente que você atualize a senha de uma credencial no seu cofre quando detecta que você a alterou em um site."
+ },
+ "notificationChangeDesc": {
+ "message": "Você quer atualizar esta senha no Bitwarden?"
+ },
+ "notificationChangeSave": {
+ "message": "Sim, Atualizar Agora"
+ },
+ "disableContextMenuItem": {
+ "message": "Desativar Opções do Menu de Contexto"
+ },
+ "disableContextMenuItemDesc": {
+ "message": "As opções do menu de contexto providenciam acesso rápido à geração de senha e credenciais para o site na sua aba atual."
+ },
+ "defaultUriMatchDetection": {
+ "message": "Detecção de Correspondência de URI Padrão",
+ "description": "Default URI match detection for auto-fill."
+ },
+ "defaultUriMatchDetectionDesc": {
+ "message": "Escolha a maneira padrão pela qual a detecção de correspondência de URI é manipulada para logins ao executar ações como preenchimento automático."
+ },
+ "theme": {
+ "message": "Tema"
+ },
+ "themeDesc": {
+ "message": "Altere o tema de cores do aplicativo."
+ },
+ "dark": {
+ "message": "Escuro",
+ "description": "Dark color"
+ },
+ "light": {
+ "message": "Claro",
+ "description": "Light color"
+ },
+ "solarizedDark": {
+ "message": "Escuro Solarizado",
+ "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated."
+ },
+ "exportVault": {
+ "message": "Exportar Cofre"
+ },
+ "fileFormat": {
+ "message": "Formato do Arquivo"
+ },
+ "warning": {
+ "message": "AVISO",
+ "description": "WARNING (should stay in capitalized letters if the language permits)"
+ },
+ "confirmVaultExport": {
+ "message": "Confirmar Exportação do Cofre"
+ },
+ "exportWarningDesc": {
+ "message": "Esta exportação contém os dados do seu cofre em um formato não criptografado. Você não deve armazenar ou enviar o arquivo exportado por canais inseguros (como e-mail). Exclua o arquivo imediatamente após terminar de usá-lo."
+ },
+ "encExportKeyWarningDesc": {
+ "message": "Esta exportação criptografa seus dados usando a chave de criptografia da sua conta. Se você rotacionar a chave de criptografia da sua conta, você deve exportar novamente, já que você não será capaz de descriptografar este arquivo de exportação."
+ },
+ "encExportAccountWarningDesc": {
+ "message": "Chaves de criptografia da conta são únicas para cada conta de usuário do Bitwarden, então você não pode importar uma exportação criptografada para uma conta diferente."
+ },
+ "exportMasterPassword": {
+ "message": "Insira a sua senha mestra para exportar os dados do seu cofre."
+ },
+ "shared": {
+ "message": "Compartilhado"
+ },
+ "learnOrg": {
+ "message": "Aprenda mais sobre as Organizações"
+ },
+ "learnOrgConfirmation": {
+ "message": "O Bitwarden permite compartilhar os seus itens do cofre com outros ao utilizar uma organização. Gostaria de visitar o site bitwarden.com para saber mais?"
+ },
+ "moveToOrganization": {
+ "message": "Mover para a Organização"
+ },
+ "share": {
+ "message": "Compartilhar"
+ },
+ "movedItemToOrg": {
+ "message": "$ITEMNAME$ movido para $ORGNAME$",
+ "placeholders": {
+ "itemname": {
+ "content": "$1",
+ "example": "Secret Item"
+ },
+ "orgname": {
+ "content": "$2",
+ "example": "Company Name"
+ }
+ }
+ },
+ "moveToOrgDesc": {
+ "message": "Escolha uma organização para a qual deseja mover este item. Mudar para uma organização transfere a propriedade do item para essa organização. Você não será mais o proprietário direto deste item depois que ele for movido."
+ },
+ "learnMore": {
+ "message": "Saber mais"
+ },
+ "authenticatorKeyTotp": {
+ "message": "Chave de Autenticação (TOTP)"
+ },
+ "verificationCodeTotp": {
+ "message": "Código de Verificação (TOTP)"
+ },
+ "copyVerificationCode": {
+ "message": "Copiar Código de Verificação"
+ },
+ "attachments": {
+ "message": "Anexos"
+ },
+ "deleteAttachment": {
+ "message": "Excluir anexo"
+ },
+ "deleteAttachmentConfirmation": {
+ "message": "Tem a certeza de que deseja excluir este anexo?"
+ },
+ "deletedAttachment": {
+ "message": "Anexo excluído"
+ },
+ "newAttachment": {
+ "message": "Adicionar Novo Anexo"
+ },
+ "noAttachments": {
+ "message": "Sem anexos."
+ },
+ "attachmentSaved": {
+ "message": "O anexo foi salvo."
+ },
+ "file": {
+ "message": "Arquivo"
+ },
+ "selectFile": {
+ "message": "Selecione um arquivo."
+ },
+ "maxFileSize": {
+ "message": "O tamanho máximo do arquivo é de 500 MB."
+ },
+ "featureUnavailable": {
+ "message": "Recurso Indisponível"
+ },
+ "updateKey": {
+ "message": "Você não pode usar este recurso, até você atualizar sua chave de criptografia."
+ },
+ "premiumMembership": {
+ "message": "Assinatura Premium"
+ },
+ "premiumManage": {
+ "message": "Gerenciar Plano"
+ },
+ "premiumManageAlert": {
+ "message": "Você pode gerenciar a sua assinatura premium no cofre web em bitwarden.com. Você deseja visitar o site agora?"
+ },
+ "premiumRefresh": {
+ "message": "Atualizar Assinatura"
+ },
+ "premiumNotCurrentMember": {
+ "message": "Você não é um membro premium atualmente."
+ },
+ "premiumSignUpAndGet": {
+ "message": "Registre-se para uma assinatura premium e obtenha:"
+ },
+ "ppremiumSignUpStorage": {
+ "message": "1 GB de armazenamento de arquivos encriptados."
+ },
+ "ppremiumSignUpTwoStep": {
+ "message": "Opções de autenticação de duas etapas adicionais como YubiKey, FIDO U2F, e Duo."
+ },
+ "ppremiumSignUpReports": {
+ "message": "Higiene de senha, saúde da conta, e relatórios sobre violação de dados para manter o seu cofre seguro."
+ },
+ "ppremiumSignUpTotp": {
+ "message": "Gerador de códigos de verificação TOTP (2FA) para credenciais no seu cofre."
+ },
+ "ppremiumSignUpSupport": {
+ "message": "Prioridade no suporte ao cliente."
+ },
+ "ppremiumSignUpFuture": {
+ "message": "Todos os recursos premium no futuro. Mais em breve!"
+ },
+ "premiumPurchase": {
+ "message": "Comprar Premium"
+ },
+ "premiumPurchaseAlert": {
+ "message": "Você pode comprar a assinatura premium no cofre web em bitwarden.com. Você deseja visitar o site agora?"
+ },
+ "premiumCurrentMember": {
+ "message": "Você é um membro premium!"
+ },
+ "premiumCurrentMemberThanks": {
+ "message": "Obrigado por apoiar o Bitwarden."
+ },
+ "premiumPrice": {
+ "message": "Tudo por apenas %price% /ano!",
+ "placeholders": {
+ "price": {
+ "content": "$1",
+ "example": "$10"
+ }
+ }
+ },
+ "refreshComplete": {
+ "message": "Atualização completa"
+ },
+ "disableAutoTotpCopy": {
+ "message": "Desativar Cópia Automática de TOTP"
+ },
+ "disableAutoTotpCopyDesc": {
+ "message": "Se a sua credencial tiver uma chave de autenticação anexada, o código de verificação TOTP será copiado automaticamente para a área de transferência quando preencher automaticamente a credencial."
+ },
+ "disableAutoBiometricsPrompt": {
+ "message": "Não solicitar por biometria na inicialização."
+ },
+ "premiumRequired": {
+ "message": "Requer Assinatura Premium"
+ },
+ "premiumRequiredDesc": {
+ "message": "Uma conta premium é necessária para usar esse recurso."
+ },
+ "enterVerificationCodeApp": {
+ "message": "Insira o código de verificação de 6 dígitos do seu aplicativo de autenticação."
+ },
+ "enterVerificationCodeEmail": {
+ "message": "Insira o código de verificação de 6 dígitos que foi enviado por e-mail para $EMAIL$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "example@gmail.com"
+ }
+ }
+ },
+ "verificationCodeEmailSent": {
+ "message": "E-mail de verificação enviado para $EMAIL$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "example@gmail.com"
+ }
+ }
+ },
+ "rememberMe": {
+ "message": "Lembrar de mim"
+ },
+ "sendVerificationCodeEmailAgain": {
+ "message": "Enviar código de verificação para o e-mail novamente"
+ },
+ "useAnotherTwoStepMethod": {
+ "message": "Utilizar outro método de verificação em duas etapas"
+ },
+ "insertYubiKey": {
+ "message": "Insira a sua YubiKey na porta USB do seu computador, e depois toque no botão da mesma."
+ },
+ "insertU2f": {
+ "message": "Insira a sua chave de segurança na porta USB do seu computador. Se ele tiver um botão, toque nele."
+ },
+ "webAuthnNewTab": {
+ "message": "Continue a verificação de 2FA WebAuthn na nova aba."
+ },
+ "webAuthnNewTabOpen": {
+ "message": "Abrir nova aba"
+ },
+ "webAuthnAuthenticate": {
+ "message": "Autenticar WebAuthn"
+ },
+ "loginUnavailable": {
+ "message": "Sessão Indisponível"
+ },
+ "noTwoStepProviders": {
+ "message": "Esta conta tem a verificação em duas etapas ativado, no entanto, nenhum dos provedores de verificação em duas etapas configurados são suportados por este navegador web."
+ },
+ "noTwoStepProviders2": {
+ "message": "Por favor utilize um navegador web suportado (tal como o Chrome) e/ou inclua provedores adicionais que são melhor suportados entre navegadores web (tal como uma aplicativo de autenticação)."
+ },
+ "twoStepOptions": {
+ "message": "Opções de Login em Duas Etapas"
+ },
+ "recoveryCodeDesc": {
+ "message": "Perdeu o acesso a todos os seus provedores de duas etapas? Utilize o seu código de recuperação para desativar todos os provedores de duas etapas da sua conta."
+ },
+ "recoveryCodeTitle": {
+ "message": "Código de Recuperação"
+ },
+ "authenticatorAppTitle": {
+ "message": "Aplicativo de Autenticação"
+ },
+ "authenticatorAppDesc": {
+ "message": "Utilize um aplicativo de autenticação (tal como Authy ou Google Authenticator) para gerar códigos de verificação baseados no tempo.",
+ "description": "'Authy' and 'Google Authenticator' are product names and should not be translated."
+ },
+ "yubiKeyTitle": {
+ "message": "Chave de Segurança YubiKey OTP"
+ },
+ "yubiKeyDesc": {
+ "message": "Utilize uma YubiKey para acessar a sua conta. Funciona com YubiKey 4, 4 Nano, 4C, e dispositivos NEO."
+ },
+ "duoDesc": {
+ "message": "Verifique com o Duo Security utilizando o aplicativo Duo Mobile, SMS, chamada telefônica, ou chave de segurança U2F.",
+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
+ },
+ "duoOrganizationDesc": {
+ "message": "Verifique com o Duo Security utilizando o aplicativo Duo Mobile, SMS, chamada telefônica, ou chave de segurança U2F.",
+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
+ },
+ "webAuthnTitle": {
+ "message": "FIDO2 WebAuthn"
+ },
+ "webAuthnDesc": {
+ "message": "Utilize qualquer chave de segurança ativada por WebAuthn para acessar a sua conta."
+ },
+ "emailTitle": {
+ "message": "E-mail"
+ },
+ "emailDesc": {
+ "message": "Os códigos de verificação vão ser enviados por e-mail para você."
+ },
+ "selfHostedEnvironment": {
+ "message": "Ambiente Auto-hospedado"
+ },
+ "selfHostedEnvironmentFooter": {
+ "message": "Especifique a URL de base da sua instalação local do Bitwarden."
+ },
+ "customEnvironment": {
+ "message": "Ambiente Personalizado"
+ },
+ "customEnvironmentFooter": {
+ "message": "Para usuários avançados. Você pode especificar a URL de base de cada serviço independentemente."
+ },
+ "baseUrl": {
+ "message": "URL do Servidor"
+ },
+ "apiUrl": {
+ "message": "URL do Servidor da API"
+ },
+ "webVaultUrl": {
+ "message": "URL do Servidor do Cofre Web"
+ },
+ "identityUrl": {
+ "message": "URL do Servidor de Identidade"
+ },
+ "notificationsUrl": {
+ "message": "URL do Servidor de Notificações"
+ },
+ "iconsUrl": {
+ "message": "URL do Servidor de Ícones"
+ },
+ "environmentSaved": {
+ "message": "As URLs do ambiente foram salvas."
+ },
+ "enableAutoFillOnPageLoad": {
+ "message": "Habilitar o Auto-preencher ao Carregar a Página"
+ },
+ "enableAutoFillOnPageLoadDesc": {
+ "message": "Se um formulário de login for detectado, realize automaticamente um autopreenchimento quando a página web carregar."
+ },
+ "experimentalFeature": {
+ "message": "Atualmente, este é um recurso experimental. Utilize por sua conta e risco."
+ },
+ "defaultAutoFillOnPageLoad": {
+ "message": "Configuração de autopreenchimento padrão para itens de credenciais"
+ },
+ "defaultAutoFillOnPageLoadDesc": {
+ "message": "Depois de habilitar o Auto-preenchimento ao carregar a página, você pode habilitar ou desabilitar o recurso para itens de credenciais individuais. Esta é a configuração padrão para itens de credenciais que não são configurados separadamente."
+ },
+ "itemAutoFillOnPageLoad": {
+ "message": "Auto-preencher no Carregamento da Página (se ativado nas Opções)"
+ },
+ "autoFillOnPageLoadUseDefault": {
+ "message": "Usar configuração padrão"
+ },
+ "autoFillOnPageLoadYes": {
+ "message": "Auto-preencher ao carregar a página"
+ },
+ "autoFillOnPageLoadNo": {
+ "message": "Não auto-preencher ao carregar a página"
+ },
+ "commandOpenPopup": {
+ "message": "Abrir pop-up do cofre"
+ },
+ "commandOpenSidebar": {
+ "message": "Abrir cofre na barra lateral"
+ },
+ "commandAutofillDesc": {
+ "message": "Autopreencher o último login utilizado para o site atual."
+ },
+ "commandGeneratePasswordDesc": {
+ "message": "Gerar e copiar uma nova senha aleatória para a área de transferência."
+ },
+ "commandLockVaultDesc": {
+ "message": "Bloquear o cofre"
+ },
+ "privateModeMessage": {
+ "message": "Infelizmente esta janela não está disponível no modo privado para este navegador."
+ },
+ "customFields": {
+ "message": "Campos Personalizados"
+ },
+ "copyValue": {
+ "message": "Copiar Valor"
+ },
+ "value": {
+ "message": "Valor"
+ },
+ "newCustomField": {
+ "message": "Novo Campo Personalizado"
+ },
+ "dragToSort": {
+ "message": "Arrastar para ordenar"
+ },
+ "cfTypeText": {
+ "message": "Texto"
+ },
+ "cfTypeHidden": {
+ "message": "Ocultado"
+ },
+ "cfTypeBoolean": {
+ "message": "Booleano"
+ },
+ "popup2faCloseMessage": {
+ "message": "Ao clicar fora da janela de pop-up para verificar seu e-mail para o seu código de verificação fará com que este pop-up feche. Você deseja abrir este pop-up em uma nova janela para que ele não seja fechado?"
+ },
+ "popupU2fCloseMessage": {
+ "message": "Este navegador não pode processar requisições U2F nesta janela popup. Você quer abrir este popup em uma nova janela para que você possa entrar usando U2F?"
+ },
+ "disableFavicon": {
+ "message": "Desativar Ícones de Site"
+ },
+ "disableFaviconDesc": {
+ "message": "O ícone do site fornece um ícone reconhecível ao lado de cada credencial no seu cofre."
+ },
+ "disableBadgeCounter": {
+ "message": "Desativar Contador de Emblemas"
+ },
+ "disableBadgeCounterDesc": {
+ "message": "O contador de emblemas indica a quantidade de credenciais que você tem para a página atual no seu cofre."
+ },
+ "cardholderName": {
+ "message": "Titular do Cartão"
+ },
+ "number": {
+ "message": "Número"
+ },
+ "brand": {
+ "message": "Bandeira"
+ },
+ "expirationMonth": {
+ "message": "Mês de Vencimento"
+ },
+ "expirationYear": {
+ "message": "Ano de Vencimento"
+ },
+ "expiration": {
+ "message": "Vencimento"
+ },
+ "january": {
+ "message": "Janeiro"
+ },
+ "february": {
+ "message": "Fevereiro"
+ },
+ "march": {
+ "message": "Março"
+ },
+ "april": {
+ "message": "Abril"
+ },
+ "may": {
+ "message": "Maio"
+ },
+ "june": {
+ "message": "Junho"
+ },
+ "july": {
+ "message": "Julho"
+ },
+ "august": {
+ "message": "Agosto"
+ },
+ "september": {
+ "message": "Setembro"
+ },
+ "october": {
+ "message": "Outubro"
+ },
+ "november": {
+ "message": "Novembro"
+ },
+ "december": {
+ "message": "Dezembro"
+ },
+ "securityCode": {
+ "message": "Código de Segurança"
+ },
+ "ex": {
+ "message": "ex."
+ },
+ "title": {
+ "message": "Título"
+ },
+ "mr": {
+ "message": "Sr"
+ },
+ "mrs": {
+ "message": "Sra"
+ },
+ "ms": {
+ "message": "Sra"
+ },
+ "dr": {
+ "message": "Dr"
+ },
+ "firstName": {
+ "message": "Primeiro Nome"
+ },
+ "middleName": {
+ "message": "Nome do Meio"
+ },
+ "lastName": {
+ "message": "Sobrenome"
+ },
+ "identityName": {
+ "message": "Nome de Identidade"
+ },
+ "company": {
+ "message": "Empresa"
+ },
+ "ssn": {
+ "message": "Cadastro de Pessoas Físicas (CPF)"
+ },
+ "passportNumber": {
+ "message": "Número do Passaporte"
+ },
+ "licenseNumber": {
+ "message": "Número da Licença"
+ },
+ "email": {
+ "message": "E-mail"
+ },
+ "phone": {
+ "message": "Telefone"
+ },
+ "address": {
+ "message": "Endereço"
+ },
+ "address1": {
+ "message": "Endereço 1"
+ },
+ "address2": {
+ "message": "Endereço 2"
+ },
+ "address3": {
+ "message": "Endereço 3"
+ },
+ "cityTown": {
+ "message": "Cidade / Localidade"
+ },
+ "stateProvince": {
+ "message": "Estado / Província"
+ },
+ "zipPostalCode": {
+ "message": "CEP / Código Postal"
+ },
+ "country": {
+ "message": "País"
+ },
+ "type": {
+ "message": "Tipo"
+ },
+ "typeLogin": {
+ "message": "Credencial"
+ },
+ "typeLogins": {
+ "message": "Credenciais"
+ },
+ "typeSecureNote": {
+ "message": "Nota Segura"
+ },
+ "typeCard": {
+ "message": "Cartão"
+ },
+ "typeIdentity": {
+ "message": "Identidade"
+ },
+ "passwordHistory": {
+ "message": "Histórico de Senha"
+ },
+ "back": {
+ "message": "Voltar"
+ },
+ "collections": {
+ "message": "Coleções"
+ },
+ "favorites": {
+ "message": "Favoritos"
+ },
+ "popOutNewWindow": {
+ "message": "Abrir em uma nova janela"
+ },
+ "refresh": {
+ "message": "Atualizar"
+ },
+ "cards": {
+ "message": "Cartões"
+ },
+ "identities": {
+ "message": "Identidades"
+ },
+ "logins": {
+ "message": "Credenciais"
+ },
+ "secureNotes": {
+ "message": "Notas Seguras"
+ },
+ "clear": {
+ "message": "Limpar",
+ "description": "To clear something out. example: To clear browser history."
+ },
+ "checkPassword": {
+ "message": "Verifique se a senha foi exposta."
+ },
+ "passwordExposed": {
+ "message": "Esta senha foi exposta $VALUE$ vez(es) em violações de dados. Você deve alterá-la.",
+ "placeholders": {
+ "value": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "passwordSafe": {
+ "message": "Esta senha não foi encontrada em violações de dados conhecidas. Deve ser seguro de usar."
+ },
+ "baseDomain": {
+ "message": "Domínio de base"
+ },
+ "host": {
+ "message": "Servidor",
+ "description": "A URL's host value. For example, the host of https://sub.domain.com:443 is 'sub.domain.com:443'."
+ },
+ "exact": {
+ "message": "Exato"
+ },
+ "startsWith": {
+ "message": "Começa com"
+ },
+ "regEx": {
+ "message": "Expressão regular",
+ "description": "A programming term, also known as 'RegEx'."
+ },
+ "matchDetection": {
+ "message": "Detecção de Correspondência",
+ "description": "URI match detection for auto-fill."
+ },
+ "defaultMatchDetection": {
+ "message": "Detecção de correspondência padrão",
+ "description": "Default URI match detection for auto-fill."
+ },
+ "toggleOptions": {
+ "message": "Alternar Opções"
+ },
+ "toggleCurrentUris": {
+ "message": "Alternar URIs atuais",
+ "description": "Toggle the display of the URIs of the currently open tabs in the browser."
+ },
+ "currentUri": {
+ "message": "URI atual",
+ "description": "The URI of one of the current open tabs in the browser."
+ },
+ "organization": {
+ "message": "Organização",
+ "description": "An entity of multiple related people (ex. a team or business organization)."
+ },
+ "types": {
+ "message": "Tipos"
+ },
+ "allItems": {
+ "message": "Todos os Itens"
+ },
+ "noPasswordsInList": {
+ "message": "Não existem senhas para listar."
+ },
+ "remove": {
+ "message": "Remover"
+ },
+ "default": {
+ "message": "Padrão"
+ },
+ "dateUpdated": {
+ "message": "Atualizado",
+ "description": "ex. Date this item was updated"
+ },
+ "datePasswordUpdated": {
+ "message": "Senha Atualizada",
+ "description": "ex. Date this password was updated"
+ },
+ "neverLockWarning": {
+ "message": "Você tem certeza que deseja usar a opção \"Nunca\"? Definir suas opções de bloqueio para \"Nunca\" armazena a chave de criptografia do seu cofre no seu dispositivo. Se você usar esta opção, você deve garantir que irá manter o seu dispositivo devidamente protegido."
+ },
+ "noOrganizationsList": {
+ "message": "Você pertence a nenhuma organização. As organizações permitem que você compartilhe itens em segurança com outros usuários."
+ },
+ "noCollectionsInList": {
+ "message": "Não há coleções para listar."
+ },
+ "ownership": {
+ "message": "Propriedade"
+ },
+ "whoOwnsThisItem": {
+ "message": "Quem possui este item?"
+ },
+ "strong": {
+ "message": "Forte",
+ "description": "ex. A strong password. Scale: Weak -> Good -> Strong"
+ },
+ "good": {
+ "message": "Boa",
+ "description": "ex. A good password. Scale: Weak -> Good -> Strong"
+ },
+ "weak": {
+ "message": "Fraca",
+ "description": "ex. A weak password. Scale: Weak -> Good -> Strong"
+ },
+ "weakMasterPassword": {
+ "message": "Senha Mestra Fraca"
+ },
+ "weakMasterPasswordDesc": {
+ "message": "A senha mestra que você selecionou está fraca. Você deve usar uma senha mestra forte (ou uma frase-passe) para proteger a sua conta Bitwarden adequadamente. Tem certeza que deseja usar esta senha mestra?"
+ },
+ "pin": {
+ "message": "PIN",
+ "description": "PIN code. Ex. The short code (often numeric) that you use to unlock a device."
+ },
+ "unlockWithPin": {
+ "message": "Desbloquear com o PIN"
+ },
+ "setYourPinCode": {
+ "message": "Defina o seu código PIN para desbloquear o Bitwarden. Suas configurações de PIN serão redefinidas se alguma vez você encerrar completamente toda a sessão do aplicativo."
+ },
+ "pinRequired": {
+ "message": "O código PIN é necessário."
+ },
+ "invalidPin": {
+ "message": "Código PIN inválido."
+ },
+ "verifyPin": {
+ "message": "Verificar PIN"
+ },
+ "yourVaultIsLockedPinCode": {
+ "message": "O seu cofre está bloqueado. Verifique o seu PIN para continuar."
+ },
+ "unlockWithBiometrics": {
+ "message": "Desbloquear com a biometria"
+ },
+ "awaitDesktop": {
+ "message": "Aguardando confirmação do desktop"
+ },
+ "awaitDesktopDesc": {
+ "message": "Por favor, confirme o uso de dados biométricos no aplicativo Bitwarden Desktop para habilitar os dados biométricos para o navegador."
+ },
+ "lockWithMasterPassOnRestart": {
+ "message": "Bloquear com senha mestra ao reiniciar o navegador"
+ },
+ "selectOneCollection": {
+ "message": "Você deve selecionar pelo menos uma coleção."
+ },
+ "cloneItem": {
+ "message": "Clonar Item"
+ },
+ "clone": {
+ "message": "Clonar"
+ },
+ "passwordGeneratorPolicyInEffect": {
+ "message": "Uma ou mais políticas da organização estão afetando as suas configurações do gerador."
+ },
+ "vaultTimeoutAction": {
+ "message": "Ação de Tempo Limite do Cofre"
+ },
+ "lock": {
+ "message": "Bloquear",
+ "description": "Verb form: to make secure or inaccesible by"
+ },
+ "trash": {
+ "message": "Lixeira",
+ "description": "Noun: a special folder to hold deleted items"
+ },
+ "searchTrash": {
+ "message": "Pesquisar na lixeira"
+ },
+ "permanentlyDeleteItem": {
+ "message": "Excluir o Item Permanentemente"
+ },
+ "permanentlyDeleteItemConfirmation": {
+ "message": "Você tem certeza que deseja excluir permanentemente esse item?"
+ },
+ "permanentlyDeletedItem": {
+ "message": "Item Permanentemente Excluído"
+ },
+ "restoreItem": {
+ "message": "Restaurar Item"
+ },
+ "restoreItemConfirmation": {
+ "message": "Você tem certeza que deseja restaurar esse item?"
+ },
+ "restoredItem": {
+ "message": "Item Restaurado"
+ },
+ "vaultTimeoutLogOutConfirmation": {
+ "message": "Sair irá remover todo o acesso ao seu cofre e requer autenticação online após o período de tempo limite. Tem certeza de que deseja usar esta configuração?"
+ },
+ "vaultTimeoutLogOutConfirmationTitle": {
+ "message": "Confirmação de Ação de Tempo Limite"
+ },
+ "autoFillAndSave": {
+ "message": "Autopreencher e Salvar"
+ },
+ "autoFillSuccessAndSavedUri": {
+ "message": "Item Auto-Preenchido e URI Salvo"
+ },
+ "autoFillSuccess": {
+ "message": "Item Auto-Preenchido"
+ },
+ "setMasterPassword": {
+ "message": "Definir Senha Mestra"
+ },
+ "masterPasswordPolicyInEffect": {
+ "message": "Uma ou mais políticas da organização exigem que a sua senha mestra cumpra aos seguintes requisitos:"
+ },
+ "policyInEffectMinComplexity": {
+ "message": "Pontuação mínima de complexidade de $SCORE$",
+ "placeholders": {
+ "score": {
+ "content": "$1",
+ "example": "4"
+ }
+ }
+ },
+ "policyInEffectMinLength": {
+ "message": "Comprimento mínimo de $LENGTH$",
+ "placeholders": {
+ "length": {
+ "content": "$1",
+ "example": "14"
+ }
+ }
+ },
+ "policyInEffectUppercase": {
+ "message": "Contém um ou mais caracteres em maiúsculo"
+ },
+ "policyInEffectLowercase": {
+ "message": "Contém um ou mais caracteres em minúsculo"
+ },
+ "policyInEffectNumbers": {
+ "message": "Contém um ou mais números"
+ },
+ "policyInEffectSpecial": {
+ "message": "Contém um ou mais dos seguintes caracteres especiais $CHARS$",
+ "placeholders": {
+ "chars": {
+ "content": "$1",
+ "example": "!@#$%^&*"
+ }
+ }
+ },
+ "masterPasswordPolicyRequirementsNotMet": {
+ "message": "A sua nova senha mestra não cumpre aos requisitos da política."
+ },
+ "acceptPolicies": {
+ "message": "Ao marcar esta caixa, você concorda com o seguinte:"
+ },
+ "acceptPoliciesError": {
+ "message": "Os Termos de Serviço e a Política de Privacidade não foram reconhecidos."
+ },
+ "termsOfService": {
+ "message": "Termos de Serviço"
+ },
+ "privacyPolicy": {
+ "message": "Política de Privacidade"
+ },
+ "hintEqualsPassword": {
+ "message": "Sua dica de senha senha não pode ser a mesma que a sua senha."
+ },
+ "ok": {
+ "message": "Ok"
+ },
+ "desktopSyncVerificationTitle": {
+ "message": "Verificação de sincronização do Desktop"
+ },
+ "desktopIntegrationVerificationText": {
+ "message": "Por favor, verifique se o aplicativo desktop mostra esta impressão digital: "
+ },
+ "desktopIntegrationDisabledTitle": {
+ "message": "A integração com o navegador não está ativada"
+ },
+ "desktopIntegrationDisabledDesc": {
+ "message": "A integração com o navegador não está habilitada no aplicativo Bitwarden Desktop. Por favor, habilite-a nas configurações do aplicativo desktop."
+ },
+ "startDesktopTitle": {
+ "message": "Iniciar o aplicativo Bitwarden Desktop"
+ },
+ "startDesktopDesc": {
+ "message": "O aplicativo Bitwarden Desktop precisa ser iniciado antes que esta função possa ser usada."
+ },
+ "errorEnableBiometricTitle": {
+ "message": "Não foi possível ativar os dados biométricos"
+ },
+ "errorEnableBiometricDesc": {
+ "message": "Ação foi cancelada pelo desktop"
+ },
+ "nativeMessagingInvalidEncryptionDesc": {
+ "message": "O aplicativo desktop invalidou o canal de comunicação seguro. Por favor, tente esta operação novamente"
+ },
+ "nativeMessagingInvalidEncryptionTitle": {
+ "message": "Comunicação com o desktop interrompida"
+ },
+ "nativeMessagingWrongUserDesc": {
+ "message": "O aplicativo de desktop está conectado em uma conta diferente. Por favor, certifique-se de que ambos os aplicativos estejam conectados na mesma conta."
+ },
+ "nativeMessagingWrongUserTitle": {
+ "message": "A conta não confere"
+ },
+ "biometricsNotEnabledTitle": {
+ "message": "Biometria não habilitada"
+ },
+ "biometricsNotEnabledDesc": {
+ "message": "A biometria com o navegador requer que a biometria de desktop seja ativada nas configurações primeiro."
+ },
+ "biometricsNotSupportedTitle": {
+ "message": "Biometria não suportada"
+ },
+ "biometricsNotSupportedDesc": {
+ "message": "A biometria com o navegador não é suportada neste dispositivo."
+ },
+ "nativeMessaginPermissionErrorTitle": {
+ "message": "Permissão não fornecida"
+ },
+ "nativeMessaginPermissionErrorDesc": {
+ "message": "Sem permissão para nos comunicar com o aplicativo Bitwarden Desktop, não podemos fornecer dados biométricos na extensão do navegador. Por favor, tente novamente."
+ },
+ "nativeMessaginPermissionSidebarTitle": {
+ "message": "Erro ao solicitar permissão"
+ },
+ "nativeMessaginPermissionSidebarDesc": {
+ "message": "Esta ação não pode ser feita na barra lateral. Por favor, tente novamente no popup ou popout."
+ },
+ "personalOwnershipSubmitError": {
+ "message": "Devido a uma Política Empresarial, você está restrito de salvar itens para seu cofre pessoal. Altere a opção de Propriedade para uma organização e escolha entre as Coleções disponíveis."
+ },
+ "personalOwnershipPolicyInEffect": {
+ "message": "Uma política de organização está afetando suas opções de propriedade."
+ },
+ "excludedDomains": {
+ "message": "Domínios Excluídos"
+ },
+ "excludedDomainsDesc": {
+ "message": "O Bitwarden não irá pedir para salvar os detalhes de login para estes domínios. Você deve atualizar a página para que as alterações entrem em vigor."
+ },
+ "excludedDomainsInvalidDomain": {
+ "message": "$DOMAIN$ não é um domínio válido",
+ "placeholders": {
+ "domain": {
+ "content": "$1",
+ "example": "googlecom"
+ }
+ }
+ },
+ "send": {
+ "message": "Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "searchSends": {
+ "message": "Pesquisar Sends",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "addSend": {
+ "message": "Adicionar Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTypeText": {
+ "message": "Texto"
+ },
+ "sendTypeFile": {
+ "message": "Arquivo"
+ },
+ "allSends": {
+ "message": "Todos os Sends",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "maxAccessCountReached": {
+ "message": "Número máximo de acessos atingido"
+ },
+ "expired": {
+ "message": "Expirado"
+ },
+ "pendingDeletion": {
+ "message": "Exclusão pendente"
+ },
+ "passwordProtected": {
+ "message": "Protegido por senha"
+ },
+ "copySendLink": {
+ "message": "Copiar link do Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "removePassword": {
+ "message": "Remover Senha"
+ },
+ "delete": {
+ "message": "Excluir"
+ },
+ "removedPassword": {
+ "message": "Senha Removida"
+ },
+ "deletedSend": {
+ "message": "Send Excluído",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendLink": {
+ "message": "Link do Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "disabled": {
+ "message": "Desativado"
+ },
+ "removePasswordConfirmation": {
+ "message": "Você tem certeza que deseja remover a senha?"
+ },
+ "deleteSend": {
+ "message": "Excluir Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "deleteSendConfirmation": {
+ "message": "Você tem certeza que deseja excluir este Send?",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "editSend": {
+ "message": "Editar Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTypeHeader": {
+ "message": "Que tipo de Send é este?",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendNameDesc": {
+ "message": "Um nome amigável para descrever este Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendFileDesc": {
+ "message": "O arquivo que você deseja enviar."
+ },
+ "deletionDate": {
+ "message": "Data de Exclusão"
+ },
+ "deletionDateDesc": {
+ "message": "O Send será eliminado permanentemente na data e hora especificadas.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "expirationDate": {
+ "message": "Data de Validade"
+ },
+ "expirationDateDesc": {
+ "message": "Se definido, o acesso a este Send expirará na data e hora especificadas.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "oneDay": {
+ "message": "1 dia"
+ },
+ "days": {
+ "message": "$DAYS$ dias",
+ "placeholders": {
+ "days": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "custom": {
+ "message": "Personalizado"
+ },
+ "maximumAccessCount": {
+ "message": "Contagem Máxima de Acessos"
+ },
+ "maximumAccessCountDesc": {
+ "message": "Se atribuído, usuários não poderão mais acessar este Send assim que o número máximo de acessos for atingido.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendPasswordDesc": {
+ "message": "Opcionalmente exigir uma senha para os usuários acessarem este Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendNotesDesc": {
+ "message": "Notas privadas sobre esse Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendDisableDesc": {
+ "message": "Desabilite este Send para que ninguém possa acessá-lo.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendShareDesc": {
+ "message": "Copiar o link deste Send para área de transferência após salvar.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTextDesc": {
+ "message": "O texto que você deseja enviar."
+ },
+ "sendHideText": {
+ "message": "Ocultar o texto deste Send por padrão.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "currentAccessCount": {
+ "message": "Contagem Atual de Acessos"
+ },
+ "createSend": {
+ "message": "Criar Novo Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "newPassword": {
+ "message": "Nova Senha"
+ },
+ "sendDisabled": {
+ "message": "Send Desabilitado",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendDisabledWarning": {
+ "message": "Devido a uma política corporativa, você só é capaz de excluir um Send existente.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "createdSend": {
+ "message": "Send Criado",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "editedSend": {
+ "message": "Send Editado",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendLinuxChromiumFileWarning": {
+ "message": "Para escolher um arquivo, abra a extensão na barra lateral (se possível), ou abra uma nova janela clicando neste banner."
+ },
+ "sendFirefoxFileWarning": {
+ "message": "Para escolher um arquivo usando o Firefox, abra a extensão na barra lateral ou abra uma nova janela clicando neste banner."
+ },
+ "sendSafariFileWarning": {
+ "message": "Para escolher um arquivo usando o Safari, abra uma nova janela clicando neste banner."
+ },
+ "sendFileCalloutHeader": {
+ "message": "Antes de começar"
+ },
+ "sendFirefoxCustomDatePopoutMessage1": {
+ "message": "Para usar um seletor de data no estilo calendário",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read '**To use a calendar style date picker ** click here to pop out your window.'"
+ },
+ "sendFirefoxCustomDatePopoutMessage2": {
+ "message": "clique aqui",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker **click here** to pop out your window.'"
+ },
+ "sendFirefoxCustomDatePopoutMessage3": {
+ "message": "para abrir a sua janela.",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker click here **to pop out your window.**'"
+ },
+ "expirationDateIsInvalid": {
+ "message": "A data de validade fornecida não é válida."
+ },
+ "deletionDateIsInvalid": {
+ "message": "A data de exclusão fornecida não é válida."
+ },
+ "expirationDateAndTimeRequired": {
+ "message": "Uma data e hora de expiração são obrigatórias."
+ },
+ "deletionDateAndTimeRequired": {
+ "message": "Uma data e hora de exclusão são obrigatórias."
+ },
+ "dateParsingError": {
+ "message": "Ocorreu um erro ao salvar as suas datas de exclusão e validade."
+ },
+ "hideEmail": {
+ "message": "Ocultar meu endereço de e-mail dos destinatários."
+ },
+ "sendOptionsPolicyInEffect": {
+ "message": "Uma ou mais políticas da organização estão afetando as suas opções de Send."
+ },
+ "passwordPrompt": {
+ "message": "Solicitação nova de senha mestra"
+ },
+ "passwordConfirmation": {
+ "message": "Confirmação de senha mestra"
+ },
+ "passwordConfirmationDesc": {
+ "message": "Esta ação está protegida. Para continuar, por favor, reinsira a sua senha mestra para verificar sua identidade."
+ },
+ "emailVerificationRequired": {
+ "message": "Verificação de E-mail Necessária"
+ },
+ "emailVerificationRequiredDesc": {
+ "message": "Você precisa verificar o seu e-mail para usar este recurso. Você pode verificar seu e-mail no cofre web."
+ },
+ "updatedMasterPassword": {
+ "message": "Senha Mestra Atualizada"
+ },
+ "updateMasterPassword": {
+ "message": "Atualizar Senha Mestra"
+ },
+ "updateMasterPasswordWarning": {
+ "message": "Sua Senha Mestra foi alterada recentemente por um administrador de sua organização. Para acessar o cofre, você precisa atualizá-la agora. O processo desconectará você da sessão atual, exigindo que você inicie a sessão novamente. Sessões ativas em outros dispositivos podem continuar ativas por até uma hora."
+ },
+ "resetPasswordPolicyAutoEnroll": {
+ "message": "Inscrição Automática"
+ },
+ "resetPasswordAutoEnrollInviteWarning": {
+ "message": "Esta organização possui uma política empresarial que irá inscrevê-lo automaticamente na redefinição de senha. A inscrição permitirá que os administradores da organização alterem sua senha mestra."
+ },
+ "selectFolder": {
+ "message": "Selecionar pasta..."
+ },
+ "ssoCompleteRegistration": {
+ "message": "Para concluir o login com o SSO, defina uma senha mestra para acessar e proteger o seu cofre."
+ },
+ "hours": {
+ "message": "Horas"
+ },
+ "minutes": {
+ "message": "Minutos"
+ },
+ "vaultTimeoutPolicyInEffect": {
+ "message": "As políticas da sua organização estão afetando o tempo limite do seu cofre. O Tempo Limite Máximo permitido do Cofre é $HOURS$ hora(s) e $MINUTES$ minuto(s)",
+ "placeholders": {
+ "hours": {
+ "content": "$1",
+ "example": "5"
+ },
+ "minutes": {
+ "content": "$2",
+ "example": "5"
+ }
+ }
+ },
+ "vaultTimeoutToLarge": {
+ "message": "O tempo limite do seu cofre excede as restrições definidas por sua organização."
+ },
+ "vaultExportDisabled": {
+ "message": "Exportação de Cofre Desabilitada"
+ },
+ "personalVaultExportPolicyInEffect": {
+ "message": "Uma ou mais políticas da organização impdem que você exporte seu cofre pessoal."
+ },
+ "copyCustomFieldNameInvalidElement": {
+ "message": "Não foi possível identificar um elemento de formulário válido. Em vez disso, tente inspecionar o HTML."
+ },
+ "copyCustomFieldNameNotUnique": {
+ "message": "Nenhum identificador exclusivo encontrado."
+ }
+}
diff --git a/src/iOS.Safari/Resources/_locales/pt_PT/messages.json b/src/iOS.Safari/Resources/_locales/pt_PT/messages.json
new file mode 100644
index 000000000..407c1933a
--- /dev/null
+++ b/src/iOS.Safari/Resources/_locales/pt_PT/messages.json
@@ -0,0 +1,1817 @@
+{
+ "appName": {
+ "message": "Bitwarden"
+ },
+ "extName": {
+ "message": "Bitwarden",
+ "description": "Extension name, MUST be less than 40 characters (Safari restriction)"
+ },
+ "extDesc": {
+ "message": "Um gestor de palavras-passe seguro e gratuito para todos os seus dispositivos.",
+ "description": "Extension description"
+ },
+ "loginOrCreateNewAccount": {
+ "message": "Inicie sessão ou crie uma nova conta para aceder ao seu cofre seguro."
+ },
+ "createAccount": {
+ "message": "Criar conta"
+ },
+ "login": {
+ "message": "Iniciar sessão"
+ },
+ "enterpriseSingleSignOn": {
+ "message": "Início de Sessão Único da Empresa"
+ },
+ "cancel": {
+ "message": "Cancelar"
+ },
+ "close": {
+ "message": "Fechar"
+ },
+ "submit": {
+ "message": "Submeter"
+ },
+ "emailAddress": {
+ "message": "Endereço de email"
+ },
+ "masterPass": {
+ "message": "Palavra-passe mestra"
+ },
+ "masterPassDesc": {
+ "message": "A palavra-passe mestra é a palavra-passe que utiliza para aceder ao seu cofre. É muito importante que não se esqueça da sua palavra-passe mestra. Não existe maneira de recuperar a palavra-passe no caso de a esquecer."
+ },
+ "masterPassHintDesc": {
+ "message": "Uma dica da palavra-passe mestra pode ajudar a lembrar-se da sua palavra-passe se a esquecer."
+ },
+ "reTypeMasterPass": {
+ "message": "Reescreva a palavra-passe mestra"
+ },
+ "masterPassHint": {
+ "message": "Dica da palavra-passe mestra (opcional)"
+ },
+ "tab": {
+ "message": "Separador"
+ },
+ "myVault": {
+ "message": "Meu cofre"
+ },
+ "tools": {
+ "message": "Ferramentas"
+ },
+ "settings": {
+ "message": "Definições"
+ },
+ "currentTab": {
+ "message": "Separador atual"
+ },
+ "copyPassword": {
+ "message": "Copiar palavra-passe"
+ },
+ "copyNote": {
+ "message": "Copiar nota"
+ },
+ "copyUri": {
+ "message": "Copiar URI"
+ },
+ "copyUsername": {
+ "message": "Copiar nome de utilizador"
+ },
+ "copyNumber": {
+ "message": "Copiar número"
+ },
+ "copySecurityCode": {
+ "message": "Copiar código de segurança"
+ },
+ "autoFill": {
+ "message": "Auto-preencher"
+ },
+ "generatePasswordCopied": {
+ "message": "Gerar palavra-passe (copiada)"
+ },
+ "copyElementIdentifier": {
+ "message": "Copy Custom Field Name"
+ },
+ "noMatchingLogins": {
+ "message": "Sem credencias correspondidas."
+ },
+ "vaultLocked": {
+ "message": "O cofre está bloqueado."
+ },
+ "vaultLoggedOut": {
+ "message": "Sessão terminada no cofre."
+ },
+ "autoFillInfo": {
+ "message": "Não existem credenciais disponíveis para auto-preencher para o separador de navegador atual."
+ },
+ "addLogin": {
+ "message": "Adicionar uma credencial"
+ },
+ "addItem": {
+ "message": "Adicionar item"
+ },
+ "passwordHint": {
+ "message": "Dica da palavra-passe"
+ },
+ "enterEmailToGetHint": {
+ "message": "Introduza o endereço de email da sua conta para receber a dica da sua palavra-passe mestra."
+ },
+ "getMasterPasswordHint": {
+ "message": "Obter dica da palavra-passe mestra"
+ },
+ "continue": {
+ "message": "Continuar"
+ },
+ "verificationCode": {
+ "message": "Código de verificação"
+ },
+ "account": {
+ "message": "Conta"
+ },
+ "changeMasterPassword": {
+ "message": "Alterar palavra-passe mestra"
+ },
+ "fingerprintPhrase": {
+ "message": "Frase de impressão digital",
+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
+ },
+ "yourAccountsFingerprint": {
+ "message": "A frase de impressão digital da sua conta",
+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
+ },
+ "twoStepLogin": {
+ "message": "Início de sessão de dois passos"
+ },
+ "logOut": {
+ "message": "Terminar sessão"
+ },
+ "about": {
+ "message": "Acerca"
+ },
+ "version": {
+ "message": "Versão"
+ },
+ "save": {
+ "message": "Guardar"
+ },
+ "move": {
+ "message": "Move"
+ },
+ "addFolder": {
+ "message": "Adicionar pasta"
+ },
+ "name": {
+ "message": "Nome"
+ },
+ "editFolder": {
+ "message": "Editar pasta"
+ },
+ "deleteFolder": {
+ "message": "Eliminar pasta"
+ },
+ "folders": {
+ "message": "Pastas"
+ },
+ "noFolders": {
+ "message": "Não existem pastas para listar."
+ },
+ "helpFeedback": {
+ "message": "Ajuda e feedback"
+ },
+ "sync": {
+ "message": "Sincronizar"
+ },
+ "syncVaultNow": {
+ "message": "Sincronizar cofre agora"
+ },
+ "lastSync": {
+ "message": "Última sincronização:"
+ },
+ "passGen": {
+ "message": "Gerador de palavras-passe"
+ },
+ "generator": {
+ "message": "Gerador",
+ "description": "Short for 'Password Generator'."
+ },
+ "passGenInfo": {
+ "message": "Gera automaticamente palavras-passe fortes e únicas para as suas credenciais."
+ },
+ "bitWebVault": {
+ "message": "Cofre Web Bitwarden"
+ },
+ "importItems": {
+ "message": "Importar itens"
+ },
+ "select": {
+ "message": "Selecionar"
+ },
+ "generatePassword": {
+ "message": "Gerar palavra-passe"
+ },
+ "regeneratePassword": {
+ "message": "Regenerar palavra-passe"
+ },
+ "options": {
+ "message": "Opções"
+ },
+ "length": {
+ "message": "Comprimento"
+ },
+ "numWords": {
+ "message": "Número de palavras"
+ },
+ "wordSeparator": {
+ "message": "Separador de palavras"
+ },
+ "capitalize": {
+ "message": "Capitalizar",
+ "description": "Make the first letter of a work uppercase."
+ },
+ "includeNumber": {
+ "message": "Incluir número"
+ },
+ "minNumbers": {
+ "message": "Números mínimos"
+ },
+ "minSpecial": {
+ "message": "Especiais mínimos"
+ },
+ "avoidAmbChar": {
+ "message": "Evitar caracteres ambíguos"
+ },
+ "searchVault": {
+ "message": "Pesquisar cofre"
+ },
+ "edit": {
+ "message": "Editar"
+ },
+ "view": {
+ "message": "Ver"
+ },
+ "noItemsInList": {
+ "message": "Não existem itens para listar."
+ },
+ "itemInformation": {
+ "message": "Informação do item"
+ },
+ "username": {
+ "message": "Nome de utilizador"
+ },
+ "password": {
+ "message": "Palavra-passe"
+ },
+ "passphrase": {
+ "message": "Frase-passe"
+ },
+ "favorite": {
+ "message": "Favorito"
+ },
+ "notes": {
+ "message": "Notas"
+ },
+ "note": {
+ "message": "Nota"
+ },
+ "editItem": {
+ "message": "Editar item"
+ },
+ "folder": {
+ "message": "Pasta"
+ },
+ "deleteItem": {
+ "message": "Eliminar item"
+ },
+ "viewItem": {
+ "message": "Ver item"
+ },
+ "launch": {
+ "message": "Iniciar"
+ },
+ "website": {
+ "message": "Website"
+ },
+ "toggleVisibility": {
+ "message": "Alternar visibilidade"
+ },
+ "manage": {
+ "message": "Gerir"
+ },
+ "other": {
+ "message": "Outros"
+ },
+ "rateExtension": {
+ "message": "Avaliar a extensão"
+ },
+ "rateExtensionDesc": {
+ "message": "Por favor considere ajudar-nos com uma boa análise!"
+ },
+ "browserNotSupportClipboard": {
+ "message": "O seu navegador web não suporta cópia fácil da área de transferência. Em alternativa, copie manualmente."
+ },
+ "verifyMasterPassword": {
+ "message": "Verificar palavra-passe mestra"
+ },
+ "yourVaultIsLocked": {
+ "message": "O seu cofre está bloqueado. Verifique a sua palavra-passe mestra para continuar."
+ },
+ "unlock": {
+ "message": "Desbloquear"
+ },
+ "loggedInAsOn": {
+ "message": "Sessão iniciada como $EMAIL$ em $HOSTNAME$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "name@example.com"
+ },
+ "hostname": {
+ "content": "$2",
+ "example": "bitwarden.com"
+ }
+ }
+ },
+ "invalidMasterPassword": {
+ "message": "Palavra-passe mestra inválida"
+ },
+ "vaultTimeout": {
+ "message": "Expiração do cofre"
+ },
+ "lockNow": {
+ "message": "Bloquear agora"
+ },
+ "immediately": {
+ "message": "Imediatamente"
+ },
+ "tenSeconds": {
+ "message": "10 segundos"
+ },
+ "twentySeconds": {
+ "message": "20 segundos"
+ },
+ "thirtySeconds": {
+ "message": "30 segundos"
+ },
+ "oneMinute": {
+ "message": "1 minuto"
+ },
+ "twoMinutes": {
+ "message": "2 minutos"
+ },
+ "fiveMinutes": {
+ "message": "5 minutos"
+ },
+ "fifteenMinutes": {
+ "message": "15 minutos"
+ },
+ "thirtyMinutes": {
+ "message": "30 minutos"
+ },
+ "oneHour": {
+ "message": "1 hora"
+ },
+ "fourHours": {
+ "message": "4 horas"
+ },
+ "onLocked": {
+ "message": "Quando o sistema está bloqueado"
+ },
+ "onRestart": {
+ "message": "Quando reiniciar o navegador"
+ },
+ "never": {
+ "message": "Nunca"
+ },
+ "security": {
+ "message": "Segurança"
+ },
+ "errorOccurred": {
+ "message": "Ocorreu um erro"
+ },
+ "emailRequired": {
+ "message": "O endereço de email é requerido."
+ },
+ "invalidEmail": {
+ "message": "Endereço de email inválido."
+ },
+ "masterPassRequired": {
+ "message": "A palavra-passe mestra é requerida."
+ },
+ "masterPassLength": {
+ "message": "A palavra-passe mestra tem de ter pelo menos 8 caracteres."
+ },
+ "masterPassDoesntMatch": {
+ "message": "A confirmação da palavra-passe mestra não corresponde."
+ },
+ "newAccountCreated": {
+ "message": "A sua nova conta foi criada! Agora pode iniciar sessão."
+ },
+ "masterPassSent": {
+ "message": "Enviámos-lhe um email com a dica da sua palavra-passe mestra."
+ },
+ "verificationCodeRequired": {
+ "message": "O código de verificação é requerido."
+ },
+ "valueCopied": {
+ "message": "$VALUE$ copiado(a)",
+ "description": "Value has been copied to the clipboard.",
+ "placeholders": {
+ "value": {
+ "content": "$1",
+ "example": "Password"
+ }
+ }
+ },
+ "autofillError": {
+ "message": "Não é possível auto-preencher o item selecionado nesta página. Em alternativa, copie e cole a informação."
+ },
+ "loggedOut": {
+ "message": "Sessão terminada"
+ },
+ "loginExpired": {
+ "message": "A sua sessão expirou."
+ },
+ "logOutConfirmation": {
+ "message": "Tem a certeza de que pretende terminar sessão?"
+ },
+ "yes": {
+ "message": "Sim"
+ },
+ "no": {
+ "message": "Não"
+ },
+ "unexpectedError": {
+ "message": "Ocorreu um erro inesperado."
+ },
+ "nameRequired": {
+ "message": "O nome é requerido."
+ },
+ "addedFolder": {
+ "message": "Pasta adicionada"
+ },
+ "changeMasterPass": {
+ "message": "Alterar palavra-passe mestra"
+ },
+ "changeMasterPasswordConfirmation": {
+ "message": "Pode alterar a sua palavra-passe mestra no cofre web bitwarden.com. Pretende visitar o website agora?"
+ },
+ "twoStepLoginConfirmation": {
+ "message": "O início de sessão de dois passos torna a sua conta mais segura ao requerer que verifique o seu início de sessão com outro dispositivo como uma chave de segurança, aplicação de autenticação, SMS, chamada telefónica, ou email. O início de sessão de dois passos pode ser ativado no cofre web bitwarden.com. Pretende visitar o website agora?"
+ },
+ "editedFolder": {
+ "message": "Pasta editada"
+ },
+ "deleteFolderConfirmation": {
+ "message": "Tem a certeza de que pretende eliminar esta pasta?"
+ },
+ "deletedFolder": {
+ "message": "Pasta eliminada"
+ },
+ "gettingStartedTutorial": {
+ "message": "Tutorial de introdução"
+ },
+ "gettingStartedTutorialVideo": {
+ "message": "Veja o nosso tutorial de introdução e saiba como tirar o máximo partido da extensão de navegador."
+ },
+ "syncingComplete": {
+ "message": "Sincronização completada"
+ },
+ "syncingFailed": {
+ "message": "Sincronização falhada"
+ },
+ "passwordCopied": {
+ "message": "Palavra-passe copiada"
+ },
+ "uri": {
+ "message": "URI"
+ },
+ "uriPosition": {
+ "message": "URI $POSITION$",
+ "description": "A listing of URIs. Ex: URI 1, URI 2, URI 3, etc.",
+ "placeholders": {
+ "position": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "newUri": {
+ "message": "Novo URI"
+ },
+ "addedItem": {
+ "message": "Item adicionado"
+ },
+ "editedItem": {
+ "message": "Item editado"
+ },
+ "deleteItemConfirmation": {
+ "message": "Tem a certeza de que pretende apagar este item?"
+ },
+ "deletedItem": {
+ "message": "Item enviado para o lixo"
+ },
+ "overwritePassword": {
+ "message": "Sobreescrever palavra-passe"
+ },
+ "overwritePasswordConfirmation": {
+ "message": "Tem a certeza de que pretende sobreescrever a palavra-passe atual?"
+ },
+ "searchFolder": {
+ "message": "Pesquisar pasta"
+ },
+ "searchCollection": {
+ "message": "Pesquisar coleção"
+ },
+ "searchType": {
+ "message": "Pesquisar tipo"
+ },
+ "noneFolder": {
+ "message": "Nenhuma pasta",
+ "description": "This is the folder for uncategorized items"
+ },
+ "disableAddLoginNotification": {
+ "message": "Desativar notificação de adicionar credencial"
+ },
+ "addLoginNotificationDesc": {
+ "message": "A \"notificação de adicionar credencial\" solicita-lhe automaticamente a guardar novas credenciais para o seu cofre quando inicia sessão nas mesmas pela primeira vez."
+ },
+ "dontShowCardsCurrentTab": {
+ "message": "Não mostrar cartões na página do separador"
+ },
+ "dontShowCardsCurrentTabDesc": {
+ "message": "Os itens de cartões do seu cofre estão listados na página 'Separador atual' para acesso de auto-preenchimento fácil."
+ },
+ "dontShowIdentitiesCurrentTab": {
+ "message": "Não mostrar identidades na página do separador"
+ },
+ "dontShowIdentitiesCurrentTabDesc": {
+ "message": "Os itens de identidades do seu cofre estão listados na página 'Separador atual' para acesso de auto-preenchimento fácil."
+ },
+ "clearClipboard": {
+ "message": "Limpar área de transferência",
+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
+ },
+ "clearClipboardDesc": {
+ "message": "Limpar automaticamente valores copiados da sua área de transferência.",
+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
+ },
+ "notificationAddDesc": {
+ "message": "Deve o Bitwarden memorizar esta palavra-passe para si?"
+ },
+ "notificationAddSave": {
+ "message": "Sim, guardar agora"
+ },
+ "notificationNeverSave": {
+ "message": "Nunca para este site"
+ },
+ "disableChangedPasswordNotification": {
+ "message": "Desativar notificação de palavra-passe alterada"
+ },
+ "disableChangedPasswordNotificationDesc": {
+ "message": "A \"notificação de palavra-passe alterada\" solicita-lhe automaticamente para atualizar a palavra-passe de uma credencial no seu cofre quando deteta que a alterou num website."
+ },
+ "notificationChangeDesc": {
+ "message": "Pretende atualizar esta palavra-passe no Bitwarden?"
+ },
+ "notificationChangeSave": {
+ "message": "Sim, atualizar agora"
+ },
+ "disableContextMenuItem": {
+ "message": "Desativar opções do menu de contexto"
+ },
+ "disableContextMenuItemDesc": {
+ "message": "As opções do menu de contexto providenciam acesso rápido à geração de palavras-passe e credenciais para o website no seu separador atual."
+ },
+ "defaultUriMatchDetection": {
+ "message": "Deteção de correspondência de URI predefinida",
+ "description": "Default URI match detection for auto-fill."
+ },
+ "defaultUriMatchDetectionDesc": {
+ "message": "Escolha a maneira predefinida pela qual a deteção de correspondência de URI é manuseada para credenciais ao realizar ações como auto-preenchimento."
+ },
+ "theme": {
+ "message": "Tema"
+ },
+ "themeDesc": {
+ "message": "Altere o tema de cor da aplicação."
+ },
+ "dark": {
+ "message": "Escuro",
+ "description": "Dark color"
+ },
+ "light": {
+ "message": "Claro",
+ "description": "Light color"
+ },
+ "solarizedDark": {
+ "message": "Solarized Dark",
+ "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated."
+ },
+ "exportVault": {
+ "message": "Exportar cofre"
+ },
+ "fileFormat": {
+ "message": "Formato do ficheiro"
+ },
+ "warning": {
+ "message": "AVISO",
+ "description": "WARNING (should stay in capitalized letters if the language permits)"
+ },
+ "confirmVaultExport": {
+ "message": "Confirm Vault Export"
+ },
+ "exportWarningDesc": {
+ "message": "Esta exportação contém os seus dados do cofre num formato desencriptado. Não deve armazenar ou enviar o ficheiro exportado através de canais inseguros (como email). Apague-a imediatamente após a utilizar."
+ },
+ "encExportKeyWarningDesc": {
+ "message": "This export encrypts your data using your account's encryption key. If you ever rotate your account's encryption key you should export again since you will not be able to decrypt this export file."
+ },
+ "encExportAccountWarningDesc": {
+ "message": "Account encryption keys are unique to each Bitwarden user account, so you can't import an encrypted export into a different account."
+ },
+ "exportMasterPassword": {
+ "message": "Introduza a sua palavra-passe mestra para exportar os dados do seu cofre."
+ },
+ "shared": {
+ "message": "Partilhado"
+ },
+ "learnOrg": {
+ "message": "Learn about Organizations"
+ },
+ "learnOrgConfirmation": {
+ "message": "Bitwarden allows you to share your vault items with others by using an organization. Would you like to visit the bitwarden.com website to learn more?"
+ },
+ "moveToOrganization": {
+ "message": "Move to Organization"
+ },
+ "share": {
+ "message": "Partilhar"
+ },
+ "movedItemToOrg": {
+ "message": "$ITEMNAME$ moved to $ORGNAME$",
+ "placeholders": {
+ "itemname": {
+ "content": "$1",
+ "example": "Secret Item"
+ },
+ "orgname": {
+ "content": "$2",
+ "example": "Company Name"
+ }
+ }
+ },
+ "moveToOrgDesc": {
+ "message": "Choose an organization that you wish to move this item to. Moving to an organization transfers ownership of the item to that organization. You will no longer be the direct owner of this item once it has been moved."
+ },
+ "learnMore": {
+ "message": "Saber mais"
+ },
+ "authenticatorKeyTotp": {
+ "message": "Chave de autenticador (TOTP)"
+ },
+ "verificationCodeTotp": {
+ "message": "Código de verificação (TOTP)"
+ },
+ "copyVerificationCode": {
+ "message": "Copiar código de verificação"
+ },
+ "attachments": {
+ "message": "Anexos"
+ },
+ "deleteAttachment": {
+ "message": "Eliminar anexo"
+ },
+ "deleteAttachmentConfirmation": {
+ "message": "Tem a certeza de que deseja eliminar este anexo?"
+ },
+ "deletedAttachment": {
+ "message": "Anexo eliminado"
+ },
+ "newAttachment": {
+ "message": "Adicionar novo anexo"
+ },
+ "noAttachments": {
+ "message": "Sem anexos."
+ },
+ "attachmentSaved": {
+ "message": "O anexo foi guardado."
+ },
+ "file": {
+ "message": "Ficheiro"
+ },
+ "selectFile": {
+ "message": "Selecione um ficheiro."
+ },
+ "maxFileSize": {
+ "message": "O tamanho máximo do ficheiro é de 500 MB."
+ },
+ "featureUnavailable": {
+ "message": "Funcionalidade indisponível"
+ },
+ "updateKey": {
+ "message": "Não pode utilizar esta funcionalidade até atualizar a sua chave de encriptação."
+ },
+ "premiumMembership": {
+ "message": "Adesão Premium"
+ },
+ "premiumManage": {
+ "message": "Gerir adesão"
+ },
+ "premiumManageAlert": {
+ "message": "Pode gerir a sua adesão premium no cofre web bitwarden.com. Pretende visitar o website agora?"
+ },
+ "premiumRefresh": {
+ "message": "Atualizar adesão"
+ },
+ "premiumNotCurrentMember": {
+ "message": "Não é atualmente um membro premium."
+ },
+ "premiumSignUpAndGet": {
+ "message": "Registe-se para uma adesão premium e obtenha:"
+ },
+ "ppremiumSignUpStorage": {
+ "message": "1 GB de armazenamento encriptado para anexos de ficheiros."
+ },
+ "ppremiumSignUpTwoStep": {
+ "message": "Opções de início de sessão de dois passos adicionais como YubiKey, FIDO U2F, e Duo."
+ },
+ "ppremiumSignUpReports": {
+ "message": "Higiene de palavras-passe, saúde das contas, e relatórios de brechas de dados para manter o seu cofre seguro."
+ },
+ "ppremiumSignUpTotp": {
+ "message": "Gerador de códigos de verificação TOTP (2FA) para credenciais no seu cofre."
+ },
+ "ppremiumSignUpSupport": {
+ "message": "Prioridade no apoio ao cliente."
+ },
+ "ppremiumSignUpFuture": {
+ "message": "Todas as funcionalidades premium futuras. Mais a chegar brevemente!"
+ },
+ "premiumPurchase": {
+ "message": "Comprar Premium"
+ },
+ "premiumPurchaseAlert": {
+ "message": "Pode comprar adesão premium no cofre web bitwarden.com. Pretende visitar o website agora?"
+ },
+ "premiumCurrentMember": {
+ "message": "É um membro premium!"
+ },
+ "premiumCurrentMemberThanks": {
+ "message": "Obrigado por apoiar o Bitwarden."
+ },
+ "premiumPrice": {
+ "message": "Tudo por apenas $PRICE$ /ano!",
+ "placeholders": {
+ "price": {
+ "content": "$1",
+ "example": "$10"
+ }
+ }
+ },
+ "refreshComplete": {
+ "message": "Atualização completada"
+ },
+ "disableAutoTotpCopy": {
+ "message": "Desativar cópia automática de TOTP"
+ },
+ "disableAutoTotpCopyDesc": {
+ "message": "Se a sua credencial tem uma chave de autenticador anexada à mesma, o código de verificação TOTP é copiado automaticamente para a sua área de transferência quando quer que auto-preencha a credencial."
+ },
+ "disableAutoBiometricsPrompt": {
+ "message": "Do not prompt for biometrics on launch"
+ },
+ "premiumRequired": {
+ "message": "Premium requerido"
+ },
+ "premiumRequiredDesc": {
+ "message": "É requerida uma adesão premium para utilizar esta funcionalidade."
+ },
+ "enterVerificationCodeApp": {
+ "message": "Introduza o código de verificação de 6 dígitos da sua aplicação de autenticador."
+ },
+ "enterVerificationCodeEmail": {
+ "message": "Introduza o código de verificação de 6 dígitos que foi enviado por email para $EMAIL$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "example@gmail.com"
+ }
+ }
+ },
+ "verificationCodeEmailSent": {
+ "message": "Email de verificação enviado para $EMAIL$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "example@gmail.com"
+ }
+ }
+ },
+ "rememberMe": {
+ "message": "Memorizar-me"
+ },
+ "sendVerificationCodeEmailAgain": {
+ "message": "Enviar código de verificação novamente"
+ },
+ "useAnotherTwoStepMethod": {
+ "message": "Utilizar outro método de início de sessão de dois passos"
+ },
+ "insertYubiKey": {
+ "message": "Introduza a sua YubiKey na porta USB do seu computador, depois toque no botão da mesma."
+ },
+ "insertU2f": {
+ "message": "Introduza a sua chave de segurança na porta USB do seu computador. Se tiver um botão, toque no mesmo."
+ },
+ "webAuthnNewTab": {
+ "message": "To start the WebAuthn 2FA verification. Click the button below to open a new tab and follow the instructions provided in the new tab."
+ },
+ "webAuthnNewTabOpen": {
+ "message": "Open new tab"
+ },
+ "webAuthnAuthenticate": {
+ "message": "Authenticate WebAuthn"
+ },
+ "loginUnavailable": {
+ "message": "Início de sessão indisponível"
+ },
+ "noTwoStepProviders": {
+ "message": "Esta conta tem o início de sessão de dois passos ativado, no entanto, nenhum dos provedores de início de sessão de dois passos configurados são suportados por este navegador web."
+ },
+ "noTwoStepProviders2": {
+ "message": "Por favor utilize um navegador web suportado (tal como o Chrome) e/ou adicione provedores adicionais que são melhor suportados entre navegadores web (tal como uma aplicação de autenticador)."
+ },
+ "twoStepOptions": {
+ "message": "Opções de início de sessão de dois passos"
+ },
+ "recoveryCodeDesc": {
+ "message": "Perdeu o acesso a todos os seus provedores de dois passos? Utilize o seu código de recuperação para desativar todos os provedores de dois passos da sua conta."
+ },
+ "recoveryCodeTitle": {
+ "message": "Código de recuperação"
+ },
+ "authenticatorAppTitle": {
+ "message": "Aplicação de autenticador"
+ },
+ "authenticatorAppDesc": {
+ "message": "Utilize uma aplicação de autenticador (tal como Authy ou Google Authenticator) para gerar códigos de verificação baseados na hora.",
+ "description": "'Authy' and 'Google Authenticator' are product names and should not be translated."
+ },
+ "yubiKeyTitle": {
+ "message": "Chave de segurança YubiKey OTP"
+ },
+ "yubiKeyDesc": {
+ "message": "Utilize uma YubiKey para aceder à sua conta. Funciona com YubiKey 4, 4 Nano, 4C, e dispositivos NEO."
+ },
+ "duoDesc": {
+ "message": "Verifique com Duo Security utilizando a aplicação Duo Mobile, SMS, chamada telefónica, ou chave de segurança U2F.",
+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
+ },
+ "duoOrganizationDesc": {
+ "message": "Verifique com Duo Security para a sua organização utilizando a aplicação Duo Mobile, SMS, chamada telefónica, ou chave de segurança U2F.",
+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
+ },
+ "webAuthnTitle": {
+ "message": "FIDO2 WebAuthn"
+ },
+ "webAuthnDesc": {
+ "message": "Use any WebAuthn enabled security key to access your account."
+ },
+ "emailTitle": {
+ "message": "Email"
+ },
+ "emailDesc": {
+ "message": "Os códigos de verificação vão ser enviados para si."
+ },
+ "selfHostedEnvironment": {
+ "message": "Ambiente auto-hospedado"
+ },
+ "selfHostedEnvironmentFooter": {
+ "message": "Especifique o URL de base da sua instalação local do Bitwarden alojada nas suas premissas."
+ },
+ "customEnvironment": {
+ "message": "Ambiente personalizado"
+ },
+ "customEnvironmentFooter": {
+ "message": "Para utilizadores avançados. Pode especificar o URL de base de cada serviço independentemente."
+ },
+ "baseUrl": {
+ "message": "URL do servidor"
+ },
+ "apiUrl": {
+ "message": "URL do servidor da API"
+ },
+ "webVaultUrl": {
+ "message": "URL do servidor do cofre web"
+ },
+ "identityUrl": {
+ "message": "URL do servidor de identidade"
+ },
+ "notificationsUrl": {
+ "message": "URL do servidor de notificações"
+ },
+ "iconsUrl": {
+ "message": "URL do servidor de ícones"
+ },
+ "environmentSaved": {
+ "message": "Os URLs de ambiente foram guardados."
+ },
+ "enableAutoFillOnPageLoad": {
+ "message": "Ativar auto-preenchimento no carregar da página"
+ },
+ "enableAutoFillOnPageLoadDesc": {
+ "message": "Se um formulário de início de sessão for detetado, realizar automaticamente um auto-preenchimento quando a página web carregar."
+ },
+ "experimentalFeature": {
+ "message": "Esta é atualmente uma funcionalidade experimental. Utilize por sua conta e risco."
+ },
+ "defaultAutoFillOnPageLoad": {
+ "message": "Default autofill setting for login items"
+ },
+ "defaultAutoFillOnPageLoadDesc": {
+ "message": "After enabling Auto-fill on Page Load, you can enable or disable the feature for individual login items. This is the default setting for login items that are not separately configured."
+ },
+ "itemAutoFillOnPageLoad": {
+ "message": "Auto-fill on Page Load (if enabled in Options)"
+ },
+ "autoFillOnPageLoadUseDefault": {
+ "message": "Use default setting"
+ },
+ "autoFillOnPageLoadYes": {
+ "message": "Auto-fill on page load"
+ },
+ "autoFillOnPageLoadNo": {
+ "message": "Do not auto-fill on page load"
+ },
+ "commandOpenPopup": {
+ "message": "Abrir popup do cofre"
+ },
+ "commandOpenSidebar": {
+ "message": "Abrir cofre na barra lateral"
+ },
+ "commandAutofillDesc": {
+ "message": "Auto-preencher o último início de sessão utilizado para o website atual"
+ },
+ "commandGeneratePasswordDesc": {
+ "message": "Gerar e copiar uma nova palavra-passe aleatória para a área de transferência"
+ },
+ "commandLockVaultDesc": {
+ "message": "Bloquear o cofre"
+ },
+ "privateModeMessage": {
+ "message": "Infelizmente esta janela não está disponível no modo privado para este navegador."
+ },
+ "customFields": {
+ "message": "Campos personalizados"
+ },
+ "copyValue": {
+ "message": "Copiar valor"
+ },
+ "value": {
+ "message": "Valor"
+ },
+ "newCustomField": {
+ "message": "Novo campo personalizado"
+ },
+ "dragToSort": {
+ "message": "Arraste para ordenar"
+ },
+ "cfTypeText": {
+ "message": "Texto"
+ },
+ "cfTypeHidden": {
+ "message": "Ocultado"
+ },
+ "cfTypeBoolean": {
+ "message": "Booleano"
+ },
+ "popup2faCloseMessage": {
+ "message": "Clicar fora da janela popup para verificar o seu email pelo código de verificação irá causar com que este popup feche. Deseja abrir este popup numa nova janela para que este não se feche?"
+ },
+ "popupU2fCloseMessage": {
+ "message": "Este navegador não pode processar solicitações U2F nesta janela popup. Pretende abrir este popup numa nova janela para que inicie sessão utilizando U2F?"
+ },
+ "disableFavicon": {
+ "message": "Desativar ícones de websites"
+ },
+ "disableFaviconDesc": {
+ "message": "Os ícones de websites providenciam uma imagem reconhecível ao lado de cada item de credencial no seu cofre."
+ },
+ "disableBadgeCounter": {
+ "message": "Disable Badge Counter"
+ },
+ "disableBadgeCounterDesc": {
+ "message": "Badge counter indicates how many logins you have for the current page in your vault."
+ },
+ "cardholderName": {
+ "message": "Titular do cartão"
+ },
+ "number": {
+ "message": "Número"
+ },
+ "brand": {
+ "message": "Marca"
+ },
+ "expirationMonth": {
+ "message": "Mês de expiração"
+ },
+ "expirationYear": {
+ "message": "Ano de expiração"
+ },
+ "expiration": {
+ "message": "Expiração"
+ },
+ "january": {
+ "message": "Janeiro"
+ },
+ "february": {
+ "message": "Fevereiro"
+ },
+ "march": {
+ "message": "Março"
+ },
+ "april": {
+ "message": "Abril"
+ },
+ "may": {
+ "message": "Maio"
+ },
+ "june": {
+ "message": "Junho"
+ },
+ "july": {
+ "message": "Julho"
+ },
+ "august": {
+ "message": "Agosto"
+ },
+ "september": {
+ "message": "Setembro"
+ },
+ "october": {
+ "message": "Outubro"
+ },
+ "november": {
+ "message": "Novembro"
+ },
+ "december": {
+ "message": "Dezembro"
+ },
+ "securityCode": {
+ "message": "Código de segurança"
+ },
+ "ex": {
+ "message": "ex."
+ },
+ "title": {
+ "message": "Título"
+ },
+ "mr": {
+ "message": "Sr"
+ },
+ "mrs": {
+ "message": "Sra"
+ },
+ "ms": {
+ "message": "Sra"
+ },
+ "dr": {
+ "message": "Dr"
+ },
+ "firstName": {
+ "message": "Primeiro nome"
+ },
+ "middleName": {
+ "message": "Nome do meio"
+ },
+ "lastName": {
+ "message": "Último nome"
+ },
+ "identityName": {
+ "message": "Nome de identidade"
+ },
+ "company": {
+ "message": "Empresa"
+ },
+ "ssn": {
+ "message": "Número de segurança social"
+ },
+ "passportNumber": {
+ "message": "Número do passaporte"
+ },
+ "licenseNumber": {
+ "message": "Número da licença"
+ },
+ "email": {
+ "message": "Email"
+ },
+ "phone": {
+ "message": "Telefone"
+ },
+ "address": {
+ "message": "Endereço"
+ },
+ "address1": {
+ "message": "Endereço 1"
+ },
+ "address2": {
+ "message": "Endereço 2"
+ },
+ "address3": {
+ "message": "Endereço 3"
+ },
+ "cityTown": {
+ "message": "Cidade / localidade"
+ },
+ "stateProvince": {
+ "message": "Estado / província"
+ },
+ "zipPostalCode": {
+ "message": "Código postal"
+ },
+ "country": {
+ "message": "País"
+ },
+ "type": {
+ "message": "Tipo"
+ },
+ "typeLogin": {
+ "message": "Credencial"
+ },
+ "typeLogins": {
+ "message": "Credenciais"
+ },
+ "typeSecureNote": {
+ "message": "Nota segura"
+ },
+ "typeCard": {
+ "message": "Cartão"
+ },
+ "typeIdentity": {
+ "message": "Identidade"
+ },
+ "passwordHistory": {
+ "message": "Histórico de palavras-passe"
+ },
+ "back": {
+ "message": "Retroceder"
+ },
+ "collections": {
+ "message": "Coleções"
+ },
+ "favorites": {
+ "message": "Favoritos"
+ },
+ "popOutNewWindow": {
+ "message": "Enviar para uma nova janela"
+ },
+ "refresh": {
+ "message": "Atualizar"
+ },
+ "cards": {
+ "message": "Cartões"
+ },
+ "identities": {
+ "message": "Identidades"
+ },
+ "logins": {
+ "message": "Credenciais"
+ },
+ "secureNotes": {
+ "message": "Notas seguras"
+ },
+ "clear": {
+ "message": "Limpar",
+ "description": "To clear something out. example: To clear browser history."
+ },
+ "checkPassword": {
+ "message": "Verifica se a palavra-passe foi exposta."
+ },
+ "passwordExposed": {
+ "message": "Esta palavra-passe foi exposta $VALUE$ vez(es) em brechas de dados. Deve alterá-la.",
+ "placeholders": {
+ "value": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "passwordSafe": {
+ "message": "Esta palavra-passe não foi encontrada em nenhuma brecha de dados conhecida. Esta deve ser segura de utilizar."
+ },
+ "baseDomain": {
+ "message": "Domínio base"
+ },
+ "host": {
+ "message": "Servidor",
+ "description": "A URL's host value. For example, the host of https://sub.domain.com:443 is 'sub.domain.com:443'."
+ },
+ "exact": {
+ "message": "Exato"
+ },
+ "startsWith": {
+ "message": "Começa por"
+ },
+ "regEx": {
+ "message": "Expressão regular",
+ "description": "A programming term, also known as 'RegEx'."
+ },
+ "matchDetection": {
+ "message": "Deteção de correspondência",
+ "description": "URI match detection for auto-fill."
+ },
+ "defaultMatchDetection": {
+ "message": "Deteção de correspondência predefinida",
+ "description": "Default URI match detection for auto-fill."
+ },
+ "toggleOptions": {
+ "message": "Alternar opções"
+ },
+ "toggleCurrentUris": {
+ "message": "Alternar URIs atuais",
+ "description": "Toggle the display of the URIs of the currently open tabs in the browser."
+ },
+ "currentUri": {
+ "message": "URI atual",
+ "description": "The URI of one of the current open tabs in the browser."
+ },
+ "organization": {
+ "message": "Organização",
+ "description": "An entity of multiple related people (ex. a team or business organization)."
+ },
+ "types": {
+ "message": "Tipos"
+ },
+ "allItems": {
+ "message": "Todos os itens"
+ },
+ "noPasswordsInList": {
+ "message": "Não existem palavras-passe para listar."
+ },
+ "remove": {
+ "message": "Remover"
+ },
+ "default": {
+ "message": "Predefinido"
+ },
+ "dateUpdated": {
+ "message": "Atualizado",
+ "description": "ex. Date this item was updated"
+ },
+ "datePasswordUpdated": {
+ "message": "Palavra passe atualizada",
+ "description": "ex. Date this password was updated"
+ },
+ "neverLockWarning": {
+ "message": "Tem a certeza de que pretende utilizar a opção \"Nunca\"? Definir as suas opções de bloqueio para \"Nunca\" armazena a chave de encriptação do seu cofre no seu dispositivo. Se utilizar esta opção deve assegurar-se de que mantém o seu dispositivo devidamente protegido."
+ },
+ "noOrganizationsList": {
+ "message": "Você não pertence a nenhuma organização. Organizações permitem-lhe partilhar itens em segurança com outros utilizadores."
+ },
+ "noCollectionsInList": {
+ "message": "Não existem coleções para listar."
+ },
+ "ownership": {
+ "message": "Propriedade"
+ },
+ "whoOwnsThisItem": {
+ "message": "Quem é o proprietário deste item?"
+ },
+ "strong": {
+ "message": "Forte",
+ "description": "ex. A strong password. Scale: Weak -> Good -> Strong"
+ },
+ "good": {
+ "message": "Boa",
+ "description": "ex. A good password. Scale: Weak -> Good -> Strong"
+ },
+ "weak": {
+ "message": "Fraca",
+ "description": "ex. A weak password. Scale: Weak -> Good -> Strong"
+ },
+ "weakMasterPassword": {
+ "message": "Palavra-passe mestra fraca"
+ },
+ "weakMasterPasswordDesc": {
+ "message": "A palavra-passe mestra que escolheu é fraca. Deve utilizar uma palavra-passe mestra forte (ou uma frase-passe) para proteger adequadamente a sua conta Bitwarden. Tem a certeza de que pretende utilizar esta palavra-passe mestra?"
+ },
+ "pin": {
+ "message": "PIN",
+ "description": "PIN code. Ex. The short code (often numeric) that you use to unlock a device."
+ },
+ "unlockWithPin": {
+ "message": "Desbloquear com PIN"
+ },
+ "setYourPinCode": {
+ "message": "Defina o seu código PIN para desbloquear o Bitwarden. As suas definições PIN serão redefinidas se terminar sessão completamente da aplicação."
+ },
+ "pinRequired": {
+ "message": "O código PIN é requerido."
+ },
+ "invalidPin": {
+ "message": "Código PIN inválido."
+ },
+ "verifyPin": {
+ "message": "Verificar PIN"
+ },
+ "yourVaultIsLockedPinCode": {
+ "message": "O seu cofre está bloqueado. Verifique o seu PIN para continuar."
+ },
+ "unlockWithBiometrics": {
+ "message": "Unlock with biometrics"
+ },
+ "awaitDesktop": {
+ "message": "Awaiting confirmation from desktop"
+ },
+ "awaitDesktopDesc": {
+ "message": "Please confirm using biometrics in the Bitwarden Desktop application to enable biometrics for browser."
+ },
+ "lockWithMasterPassOnRestart": {
+ "message": "Bloquear com palavra-passe mestra quando reiniciar o navegador"
+ },
+ "selectOneCollection": {
+ "message": "Tem de selecionar pelo menos uma coleção."
+ },
+ "cloneItem": {
+ "message": "Clonar item"
+ },
+ "clone": {
+ "message": "Clonar"
+ },
+ "passwordGeneratorPolicyInEffect": {
+ "message": "Uma ou mais políticas de organização estão a afetar as suas definições do gerador."
+ },
+ "vaultTimeoutAction": {
+ "message": "Ação de expiração do cofre"
+ },
+ "lock": {
+ "message": "Bloquear",
+ "description": "Verb form: to make secure or inaccesible by"
+ },
+ "trash": {
+ "message": "Lixo",
+ "description": "Noun: a special folder to hold deleted items"
+ },
+ "searchTrash": {
+ "message": "Pesquisar lixo"
+ },
+ "permanentlyDeleteItem": {
+ "message": "Eliminar item permanentemente"
+ },
+ "permanentlyDeleteItemConfirmation": {
+ "message": "Tem a certeza de que pretende eliminar este item permanentemente?"
+ },
+ "permanentlyDeletedItem": {
+ "message": "Item eliminado permanentemente"
+ },
+ "restoreItem": {
+ "message": "Restaurar item"
+ },
+ "restoreItemConfirmation": {
+ "message": "Tem a certeza de que pretende restaurar este item?"
+ },
+ "restoredItem": {
+ "message": "Item restaurado"
+ },
+ "vaultTimeoutLogOutConfirmation": {
+ "message": "Terminar sessão irá remover todos os acessos ao seu cofre e requer autenticação online após o período de expiração. Tem a certeza de que pretende utilizar esta definição?"
+ },
+ "vaultTimeoutLogOutConfirmationTitle": {
+ "message": "Confirmação de expiração do cofre"
+ },
+ "autoFillAndSave": {
+ "message": "Auto-preencher e guardar"
+ },
+ "autoFillSuccessAndSavedUri": {
+ "message": "Item auto-preenchido e URI guardado"
+ },
+ "autoFillSuccess": {
+ "message": "Item auto-preenchido"
+ },
+ "setMasterPassword": {
+ "message": "Definir palavra-passe mestra"
+ },
+ "masterPasswordPolicyInEffect": {
+ "message": "Uma ou mais políticas da organização requerem que a sua palavra-passe mestra cumpra aos seguintes requisitos:"
+ },
+ "policyInEffectMinComplexity": {
+ "message": "Pontuação mínima de complexidade de $SCORE$",
+ "placeholders": {
+ "score": {
+ "content": "$1",
+ "example": "4"
+ }
+ }
+ },
+ "policyInEffectMinLength": {
+ "message": "Comprimento mínimo de $LENGTH$",
+ "placeholders": {
+ "length": {
+ "content": "$1",
+ "example": "14"
+ }
+ }
+ },
+ "policyInEffectUppercase": {
+ "message": "Contém um ou mais caracteres em maiúsculas"
+ },
+ "policyInEffectLowercase": {
+ "message": "Contém um ou mais caracteres em minúsculas"
+ },
+ "policyInEffectNumbers": {
+ "message": "Contém um ou mais números"
+ },
+ "policyInEffectSpecial": {
+ "message": "Contém um ou mais dos seguintes caracteres especiais $CHARS$",
+ "placeholders": {
+ "chars": {
+ "content": "$1",
+ "example": "!@#$%^&*"
+ }
+ }
+ },
+ "masterPasswordPolicyRequirementsNotMet": {
+ "message": "A sua nova palavra-passe mestra não cumpre os requisitos da política."
+ },
+ "acceptPolicies": {
+ "message": "Ao marcar esta caixa concorda com o seguinte:"
+ },
+ "acceptPoliciesError": {
+ "message": "Os Termos de Serviço e a Política de Privacidade não foram aceites."
+ },
+ "termsOfService": {
+ "message": "Termos de serviço"
+ },
+ "privacyPolicy": {
+ "message": "Política de privacidade"
+ },
+ "hintEqualsPassword": {
+ "message": "Your password hint cannot be the same as your password."
+ },
+ "ok": {
+ "message": "Ok"
+ },
+ "desktopSyncVerificationTitle": {
+ "message": "Desktop sync verification"
+ },
+ "desktopIntegrationVerificationText": {
+ "message": "Please verify that the desktop application shows this fingerprint: "
+ },
+ "desktopIntegrationDisabledTitle": {
+ "message": "Browser integration is not enabled"
+ },
+ "desktopIntegrationDisabledDesc": {
+ "message": "Browser integration is not enabled in the Bitwarden Desktop application. Please enable it in the settings within the desktop application."
+ },
+ "startDesktopTitle": {
+ "message": "Start the Bitwarden Desktop application"
+ },
+ "startDesktopDesc": {
+ "message": "The Bitwarden Desktop application needs to be started before this function can be used."
+ },
+ "errorEnableBiometricTitle": {
+ "message": "Unable to enable biometrics"
+ },
+ "errorEnableBiometricDesc": {
+ "message": "Action was canceled by the desktop application"
+ },
+ "nativeMessagingInvalidEncryptionDesc": {
+ "message": "Desktop application invalidated the secure communication channel. Please retry this operation"
+ },
+ "nativeMessagingInvalidEncryptionTitle": {
+ "message": "Desktop communication interrupted"
+ },
+ "nativeMessagingWrongUserDesc": {
+ "message": "The desktop application is logged into a different account. Please ensure both applications are logged into the same account."
+ },
+ "nativeMessagingWrongUserTitle": {
+ "message": "Account missmatch"
+ },
+ "biometricsNotEnabledTitle": {
+ "message": "Biometrics not enabled"
+ },
+ "biometricsNotEnabledDesc": {
+ "message": "Browser biometrics requires desktop biometric to be enabled in the settings first."
+ },
+ "biometricsNotSupportedTitle": {
+ "message": "Biometrics not supported"
+ },
+ "biometricsNotSupportedDesc": {
+ "message": "Browser biometrics is not supported on this device."
+ },
+ "nativeMessaginPermissionErrorTitle": {
+ "message": "Permission not provided"
+ },
+ "nativeMessaginPermissionErrorDesc": {
+ "message": "Without permission to communicate with the Bitwarden Desktop Application we cannot provide biometrics in the browser extension. Please try again."
+ },
+ "nativeMessaginPermissionSidebarTitle": {
+ "message": "Permission request error"
+ },
+ "nativeMessaginPermissionSidebarDesc": {
+ "message": "This action cannot be done in the sidebar, please retry the action in the popup or popout."
+ },
+ "personalOwnershipSubmitError": {
+ "message": "Due to an Enterprise Policy, you are restricted from saving items to your personal vault. Change the Ownership option to an organization and choose from available Collections."
+ },
+ "personalOwnershipPolicyInEffect": {
+ "message": "An organization policy is affecting your ownership options."
+ },
+ "excludedDomains": {
+ "message": "Excluded Domains"
+ },
+ "excludedDomainsDesc": {
+ "message": "Bitwarden will not ask to save login details for these domains. You must refresh the page for changes to take effect."
+ },
+ "excludedDomainsInvalidDomain": {
+ "message": "$DOMAIN$ não é um domínio válido",
+ "placeholders": {
+ "domain": {
+ "content": "$1",
+ "example": "googlecom"
+ }
+ }
+ },
+ "send": {
+ "message": "Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "searchSends": {
+ "message": "Search Sends",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "addSend": {
+ "message": "Add Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTypeText": {
+ "message": "Texto"
+ },
+ "sendTypeFile": {
+ "message": "Ficheiro"
+ },
+ "allSends": {
+ "message": "All Sends",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "maxAccessCountReached": {
+ "message": "Max access count reached"
+ },
+ "expired": {
+ "message": "Expired"
+ },
+ "pendingDeletion": {
+ "message": "Pending deletion"
+ },
+ "passwordProtected": {
+ "message": "Password protected"
+ },
+ "copySendLink": {
+ "message": "Copiar Send link",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "removePassword": {
+ "message": "Remover palavra-passe"
+ },
+ "delete": {
+ "message": "Eliminar"
+ },
+ "removedPassword": {
+ "message": "Palavra-passe removida"
+ },
+ "deletedSend": {
+ "message": "Deleted Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendLink": {
+ "message": "Send link",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "disabled": {
+ "message": "Disabled"
+ },
+ "removePasswordConfirmation": {
+ "message": "Are you sure you want to remove the password?"
+ },
+ "deleteSend": {
+ "message": "Delete Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "deleteSendConfirmation": {
+ "message": "Are you sure you want to delete this Send?",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "editSend": {
+ "message": "Edit Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTypeHeader": {
+ "message": "What type of Send is this?",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendNameDesc": {
+ "message": "A friendly name to describe this Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendFileDesc": {
+ "message": "The file you want to send."
+ },
+ "deletionDate": {
+ "message": "Deletion Date"
+ },
+ "deletionDateDesc": {
+ "message": "The Send will be permanently deleted on the specified date and time.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "expirationDate": {
+ "message": "Expiration Date"
+ },
+ "expirationDateDesc": {
+ "message": "If set, access to this Send will expire on the specified date and time.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "oneDay": {
+ "message": "1 day"
+ },
+ "days": {
+ "message": "$DAYS$ days",
+ "placeholders": {
+ "days": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "custom": {
+ "message": "Custom"
+ },
+ "maximumAccessCount": {
+ "message": "Maximum Access Count"
+ },
+ "maximumAccessCountDesc": {
+ "message": "If set, users will no longer be able to access this Send once the maximum access count is reached.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendPasswordDesc": {
+ "message": "Optionally require a password for users to access this Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendNotesDesc": {
+ "message": "Private notes about this Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendDisableDesc": {
+ "message": "Disable this Send so that no one can access it.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendShareDesc": {
+ "message": "Copy this Send's link to clipboard upon save.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTextDesc": {
+ "message": "The text you want to send."
+ },
+ "sendHideText": {
+ "message": "Hide this Send's text by default.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "currentAccessCount": {
+ "message": "Current Access Count"
+ },
+ "createSend": {
+ "message": "Create New Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "newPassword": {
+ "message": "New Password"
+ },
+ "sendDisabled": {
+ "message": "Send Disabled",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendDisabledWarning": {
+ "message": "Due to an enterprise policy, you are only able to delete an existing Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "createdSend": {
+ "message": "Created Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "editedSend": {
+ "message": "Edited Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendLinuxChromiumFileWarning": {
+ "message": "In order to choose a file, open the extension in the sidebar (if possible) or pop out to a new window by clicking this banner."
+ },
+ "sendFirefoxFileWarning": {
+ "message": "In order to choose a file using Firefox, open the extension in the sidebar or pop out to a new window by clicking this banner."
+ },
+ "sendSafariFileWarning": {
+ "message": "In order to choose a file using Safari, pop out to a new window by clicking this banner."
+ },
+ "sendFileCalloutHeader": {
+ "message": "Before you start"
+ },
+ "sendFirefoxCustomDatePopoutMessage1": {
+ "message": "To use a calendar style date picker",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read '**To use a calendar style date picker ** click here to pop out your window.'"
+ },
+ "sendFirefoxCustomDatePopoutMessage2": {
+ "message": "click here",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker **click here** to pop out your window.'"
+ },
+ "sendFirefoxCustomDatePopoutMessage3": {
+ "message": "to pop out your window.",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker click here **to pop out your window.**'"
+ },
+ "expirationDateIsInvalid": {
+ "message": "The expiration date provided is not valid."
+ },
+ "deletionDateIsInvalid": {
+ "message": "The deletion date provided is not valid."
+ },
+ "expirationDateAndTimeRequired": {
+ "message": "An expiration date and time are required."
+ },
+ "deletionDateAndTimeRequired": {
+ "message": "A deletion date and time are required."
+ },
+ "dateParsingError": {
+ "message": "There was an error saving your deletion and expiration dates."
+ },
+ "hideEmail": {
+ "message": "Hide my email address from recipients."
+ },
+ "sendOptionsPolicyInEffect": {
+ "message": "One or more organization policies are affecting your Send options."
+ },
+ "passwordPrompt": {
+ "message": "Master password re-prompt"
+ },
+ "passwordConfirmation": {
+ "message": "Master password confirmation"
+ },
+ "passwordConfirmationDesc": {
+ "message": "This action is protected. To continue, please re-enter your master password to verify your identity."
+ },
+ "emailVerificationRequired": {
+ "message": "Email Verification Required"
+ },
+ "emailVerificationRequiredDesc": {
+ "message": "You must verify your email to use this feature. You can verify your email in the web vault."
+ },
+ "updatedMasterPassword": {
+ "message": "Updated Master Password"
+ },
+ "updateMasterPassword": {
+ "message": "Update Master Password"
+ },
+ "updateMasterPasswordWarning": {
+ "message": "Your Master Password was recently changed by an administrator in your organization. In order to access the vault, you must update it now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour."
+ },
+ "resetPasswordPolicyAutoEnroll": {
+ "message": "Automatic Enrollment"
+ },
+ "resetPasswordAutoEnrollInviteWarning": {
+ "message": "This organization has an enterprise policy that will automatically enroll you in password reset. Enrollment will allow organization administrators to change your master password."
+ },
+ "selectFolder": {
+ "message": "Select folder..."
+ },
+ "ssoCompleteRegistration": {
+ "message": "In order to complete logging in with SSO, please set a master password to access and protect your vault."
+ },
+ "hours": {
+ "message": "Hours"
+ },
+ "minutes": {
+ "message": "Minutes"
+ },
+ "vaultTimeoutPolicyInEffect": {
+ "message": "Your organization policies are affecting your vault timeout. Maximum allowed Vault Timeout is $HOURS$ hour(s) and $MINUTES$ minute(s)",
+ "placeholders": {
+ "hours": {
+ "content": "$1",
+ "example": "5"
+ },
+ "minutes": {
+ "content": "$2",
+ "example": "5"
+ }
+ }
+ },
+ "vaultTimeoutToLarge": {
+ "message": "Your vault timeout exceeds the restrictions set by your organization."
+ },
+ "vaultExportDisabled": {
+ "message": "Vault Export Disabled"
+ },
+ "personalVaultExportPolicyInEffect": {
+ "message": "One or more organization policies prevents you from exporting your personal vault."
+ },
+ "copyCustomFieldNameInvalidElement": {
+ "message": "Unable to identify a valid form element. Try inspecting the HTML instead."
+ },
+ "copyCustomFieldNameNotUnique": {
+ "message": "No unique identifier found."
+ }
+}
diff --git a/src/iOS.Safari/Resources/_locales/ro/messages.json b/src/iOS.Safari/Resources/_locales/ro/messages.json
new file mode 100644
index 000000000..8ca64001a
--- /dev/null
+++ b/src/iOS.Safari/Resources/_locales/ro/messages.json
@@ -0,0 +1,1817 @@
+{
+ "appName": {
+ "message": "Bitwarden"
+ },
+ "extName": {
+ "message": "Bitwarden - Manager de parole gratuit",
+ "description": "Extension name, MUST be less than 40 characters (Safari restriction)"
+ },
+ "extDesc": {
+ "message": "Un manager de parole sigur și gratuit pentru toate dispozitivele dvs.",
+ "description": "Extension description"
+ },
+ "loginOrCreateNewAccount": {
+ "message": "Autentificați-vă sau creați un cont nou pentru a accesa seiful dvs. securizat."
+ },
+ "createAccount": {
+ "message": "Creare cont"
+ },
+ "login": {
+ "message": "Autentificare"
+ },
+ "enterpriseSingleSignOn": {
+ "message": "Conectare unică organizație (SSO)"
+ },
+ "cancel": {
+ "message": "Anulare"
+ },
+ "close": {
+ "message": "Închidere"
+ },
+ "submit": {
+ "message": "Trimitere"
+ },
+ "emailAddress": {
+ "message": "Adresă de e-mail"
+ },
+ "masterPass": {
+ "message": "Parolă principală"
+ },
+ "masterPassDesc": {
+ "message": "Parola principală este parola pe care o utilizați pentru a vă accesa seiful. Este foarte important să nu uitați această parolă. Nu există nicio modalitate de a recupera parola în cazul în care ați uitat-o."
+ },
+ "masterPassHintDesc": {
+ "message": "Un indiciu pentru parola principală vă poate ajuta să v-o reamintiți dacă o uitați."
+ },
+ "reTypeMasterPass": {
+ "message": "Reintroducere parolă principală"
+ },
+ "masterPassHint": {
+ "message": "Indiciu pentru parola principală (opțional)"
+ },
+ "tab": {
+ "message": "Filă"
+ },
+ "myVault": {
+ "message": "Seiful meu"
+ },
+ "tools": {
+ "message": "Unelte"
+ },
+ "settings": {
+ "message": "Setări"
+ },
+ "currentTab": {
+ "message": "Fila curentă"
+ },
+ "copyPassword": {
+ "message": "Copiere parolă"
+ },
+ "copyNote": {
+ "message": "Copiere notă"
+ },
+ "copyUri": {
+ "message": "Copiere URL"
+ },
+ "copyUsername": {
+ "message": "Copiere nume utilizator"
+ },
+ "copyNumber": {
+ "message": "Copiere număr"
+ },
+ "copySecurityCode": {
+ "message": "Copiere cod de securitate"
+ },
+ "autoFill": {
+ "message": "Auto-completare"
+ },
+ "generatePasswordCopied": {
+ "message": "Generare parolă (s-a copiat)"
+ },
+ "copyElementIdentifier": {
+ "message": "Copy Custom Field Name"
+ },
+ "noMatchingLogins": {
+ "message": "Nu există potrivire de autentificări."
+ },
+ "vaultLocked": {
+ "message": "Seiful este blocat."
+ },
+ "vaultLoggedOut": {
+ "message": "Seiful este deconectat."
+ },
+ "autoFillInfo": {
+ "message": "Nu sunt disponibile autentificări pentru auto-completare în fila curentă a browserului."
+ },
+ "addLogin": {
+ "message": "Adăugare autentificare"
+ },
+ "addItem": {
+ "message": "Adăugare articol"
+ },
+ "passwordHint": {
+ "message": "Indiciu parolă"
+ },
+ "enterEmailToGetHint": {
+ "message": "Adresa de e-mail a contului pentru primirea indiciului parolei principale."
+ },
+ "getMasterPasswordHint": {
+ "message": "Obținere indiciu parolă principală"
+ },
+ "continue": {
+ "message": "Continuare"
+ },
+ "verificationCode": {
+ "message": "Cod de verificare"
+ },
+ "account": {
+ "message": "Cont"
+ },
+ "changeMasterPassword": {
+ "message": "Schimbare parolă principală"
+ },
+ "fingerprintPhrase": {
+ "message": "Frază amprentă",
+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
+ },
+ "yourAccountsFingerprint": {
+ "message": "Fraza amprentă a contului dvs.",
+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
+ },
+ "twoStepLogin": {
+ "message": "Autentificare în două etape"
+ },
+ "logOut": {
+ "message": "Deconectare"
+ },
+ "about": {
+ "message": "Despre"
+ },
+ "version": {
+ "message": "Versiune"
+ },
+ "save": {
+ "message": "Salvare"
+ },
+ "move": {
+ "message": "Mutare"
+ },
+ "addFolder": {
+ "message": "Adăugare dosar"
+ },
+ "name": {
+ "message": "Denumire"
+ },
+ "editFolder": {
+ "message": "Editare dosar"
+ },
+ "deleteFolder": {
+ "message": "Ștergere dosar"
+ },
+ "folders": {
+ "message": "Dosare"
+ },
+ "noFolders": {
+ "message": "Nu există niciun dosar de afișat."
+ },
+ "helpFeedback": {
+ "message": "Ajutor și feedback"
+ },
+ "sync": {
+ "message": "Sincronizare"
+ },
+ "syncVaultNow": {
+ "message": "Sincronizare seif acum"
+ },
+ "lastSync": {
+ "message": "Ultima sincronizare:"
+ },
+ "passGen": {
+ "message": "Generator de parole"
+ },
+ "generator": {
+ "message": "Generator",
+ "description": "Short for 'Password Generator'."
+ },
+ "passGenInfo": {
+ "message": "Generează automat parole unice și puternice pentru autentificările dvs."
+ },
+ "bitWebVault": {
+ "message": "Seif web Bitwarden"
+ },
+ "importItems": {
+ "message": "Import elemente"
+ },
+ "select": {
+ "message": "Selectare"
+ },
+ "generatePassword": {
+ "message": "Generare parolă"
+ },
+ "regeneratePassword": {
+ "message": "Regenerare parolă"
+ },
+ "options": {
+ "message": "Opțiuni"
+ },
+ "length": {
+ "message": "Lungime"
+ },
+ "numWords": {
+ "message": "Număr de cuvinte"
+ },
+ "wordSeparator": {
+ "message": "Separator de cuvinte"
+ },
+ "capitalize": {
+ "message": "Se folosesc majuscule inițiale",
+ "description": "Make the first letter of a work uppercase."
+ },
+ "includeNumber": {
+ "message": "Se includ cifre"
+ },
+ "minNumbers": {
+ "message": "Minimum de cifre"
+ },
+ "minSpecial": {
+ "message": "Minim de caractere speciale"
+ },
+ "avoidAmbChar": {
+ "message": "Se evită caracterele ambigue"
+ },
+ "searchVault": {
+ "message": "Căutare în seif"
+ },
+ "edit": {
+ "message": "Editare"
+ },
+ "view": {
+ "message": "Afișare"
+ },
+ "noItemsInList": {
+ "message": "Nu există niciun articol de afișat."
+ },
+ "itemInformation": {
+ "message": "Informații de autentificare"
+ },
+ "username": {
+ "message": "Nume utilizator"
+ },
+ "password": {
+ "message": "Parolă"
+ },
+ "passphrase": {
+ "message": "Frază de acces"
+ },
+ "favorite": {
+ "message": "Favorit"
+ },
+ "notes": {
+ "message": "Note"
+ },
+ "note": {
+ "message": "Notă"
+ },
+ "editItem": {
+ "message": "Editare articol"
+ },
+ "folder": {
+ "message": "Dosar"
+ },
+ "deleteItem": {
+ "message": "Ștergere articol"
+ },
+ "viewItem": {
+ "message": "Afișare articol"
+ },
+ "launch": {
+ "message": "Lansare"
+ },
+ "website": {
+ "message": "Sait web"
+ },
+ "toggleVisibility": {
+ "message": "Comutare vizibilitate"
+ },
+ "manage": {
+ "message": "Gestionare"
+ },
+ "other": {
+ "message": "Altele"
+ },
+ "rateExtension": {
+ "message": "Evaluare extensie"
+ },
+ "rateExtensionDesc": {
+ "message": "Vă rugăm să luați în considerare să ne ajutați cu o recenzie bună!"
+ },
+ "browserNotSupportClipboard": {
+ "message": "Browserul dvs. nu acceptă copierea în clipboard. Transcrieți datele manual."
+ },
+ "verifyMasterPassword": {
+ "message": "Verificare parolă principală"
+ },
+ "yourVaultIsLocked": {
+ "message": "Seiful dvs. este blocat. Verificați parola principală pentru a continua."
+ },
+ "unlock": {
+ "message": "Deblocare"
+ },
+ "loggedInAsOn": {
+ "message": "Autentificat ca $EMAIL$ în $HOSTNAME$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "name@example.com"
+ },
+ "hostname": {
+ "content": "$2",
+ "example": "bitwarden.com"
+ }
+ }
+ },
+ "invalidMasterPassword": {
+ "message": "Parolă principală incorectă"
+ },
+ "vaultTimeout": {
+ "message": "Expirare seif"
+ },
+ "lockNow": {
+ "message": "Blocare imediată"
+ },
+ "immediately": {
+ "message": "Imediat"
+ },
+ "tenSeconds": {
+ "message": "10 secunde"
+ },
+ "twentySeconds": {
+ "message": "20 de secunde"
+ },
+ "thirtySeconds": {
+ "message": "30 de secunde"
+ },
+ "oneMinute": {
+ "message": "1 minut"
+ },
+ "twoMinutes": {
+ "message": "2 minute"
+ },
+ "fiveMinutes": {
+ "message": "5 minute"
+ },
+ "fifteenMinutes": {
+ "message": "15 minute"
+ },
+ "thirtyMinutes": {
+ "message": "30 de minute"
+ },
+ "oneHour": {
+ "message": "1 oră"
+ },
+ "fourHours": {
+ "message": "4 ore"
+ },
+ "onLocked": {
+ "message": "La blocarea dispozitivului"
+ },
+ "onRestart": {
+ "message": "La repornirea browserului"
+ },
+ "never": {
+ "message": "Niciodată"
+ },
+ "security": {
+ "message": "Securitate"
+ },
+ "errorOccurred": {
+ "message": "S-a produs o eroare"
+ },
+ "emailRequired": {
+ "message": "Este necesară adresa de e-mail."
+ },
+ "invalidEmail": {
+ "message": "Adresă de e-mail greșită."
+ },
+ "masterPassRequired": {
+ "message": "Este necesară parola principală."
+ },
+ "masterPassLength": {
+ "message": "Parola principală trebuie să conțină minimum 8 caractere."
+ },
+ "masterPassDoesntMatch": {
+ "message": "Parola principală și confirmarea ei nu coincid!"
+ },
+ "newAccountCreated": {
+ "message": "Noul dvs. cont a fost creat! Acum vă puteți autentifica."
+ },
+ "masterPassSent": {
+ "message": "V-am trimis un e-mail cu indiciul parolei principale."
+ },
+ "verificationCodeRequired": {
+ "message": "Este necesar codul de verificare."
+ },
+ "valueCopied": {
+ "message": " $VALUE$ s-a copiat",
+ "description": "Value has been copied to the clipboard.",
+ "placeholders": {
+ "value": {
+ "content": "$1",
+ "example": "Password"
+ }
+ }
+ },
+ "autofillError": {
+ "message": "Nu se pot auto-completa datele de conectare pentru această pagină. În schimb, puteți copia și lipi aceste date."
+ },
+ "loggedOut": {
+ "message": "Deconectat"
+ },
+ "loginExpired": {
+ "message": "Sesiunea de autentificare a expirat."
+ },
+ "logOutConfirmation": {
+ "message": "Sigur doriți să vă deconectați?"
+ },
+ "yes": {
+ "message": "Da"
+ },
+ "no": {
+ "message": "Nu"
+ },
+ "unexpectedError": {
+ "message": "A survenit o eroare neașteptată."
+ },
+ "nameRequired": {
+ "message": "Numele utilizator este obligatoriu."
+ },
+ "addedFolder": {
+ "message": "Dosar adăugat"
+ },
+ "changeMasterPass": {
+ "message": "Schimbare parolă principală"
+ },
+ "changeMasterPasswordConfirmation": {
+ "message": "Puteți modifica parola principală în seiful web bitwarden.com. Doriți să vizitați saitul acum?"
+ },
+ "twoStepLoginConfirmation": {
+ "message": "Autentificarea în două etape întărește siguranța contului dvs. prin solicitarea unei confirmări de autentificare cu un alt dispozitiv, cum ar fi: o cheie de securitate, o aplicație de autentificare, un SMS, un apel telefonic sau un e-mail. Autentificarea în două etape poate fi activată în seiful web bitwarden.com. Doriți să vizitați saitul acum?"
+ },
+ "editedFolder": {
+ "message": "Dosar editat"
+ },
+ "deleteFolderConfirmation": {
+ "message": "Sigur doriți să ștergeți dosarul?"
+ },
+ "deletedFolder": {
+ "message": "Dosar șters"
+ },
+ "gettingStartedTutorial": {
+ "message": "Tutorial introductiv"
+ },
+ "gettingStartedTutorialVideo": {
+ "message": "Urmăriți tutorialul nostru pentru a afla cum să beneficiați cât mai mult de această extensie a browserului."
+ },
+ "syncingComplete": {
+ "message": "Sincronizare completă"
+ },
+ "syncingFailed": {
+ "message": "Sincronizare eșuată"
+ },
+ "passwordCopied": {
+ "message": "Parola s-a copiat"
+ },
+ "uri": {
+ "message": "URI"
+ },
+ "uriPosition": {
+ "message": "URI $POSITION$",
+ "description": "A listing of URIs. Ex: URI 1, URI 2, URI 3, etc.",
+ "placeholders": {
+ "position": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "newUri": {
+ "message": "URI nou"
+ },
+ "addedItem": {
+ "message": "Articol adăugat"
+ },
+ "editedItem": {
+ "message": "Articol editat"
+ },
+ "deleteItemConfirmation": {
+ "message": "Sigur doriți să trimiteți în coșul de reciclare?"
+ },
+ "deletedItem": {
+ "message": "Articolul a fost trimis în coșul de reciclare"
+ },
+ "overwritePassword": {
+ "message": "Modificare parolă"
+ },
+ "overwritePasswordConfirmation": {
+ "message": "Sigur doriți să modificați parola curentă?"
+ },
+ "searchFolder": {
+ "message": "Căutare în dosar"
+ },
+ "searchCollection": {
+ "message": "Căutare în colecție"
+ },
+ "searchType": {
+ "message": "Căutare în tipuri"
+ },
+ "noneFolder": {
+ "message": "Fără dosar",
+ "description": "This is the folder for uncategorized items"
+ },
+ "disableAddLoginNotification": {
+ "message": "Dezactivare \"Notificare de adăugare a autentificărilor\""
+ },
+ "addLoginNotificationDesc": {
+ "message": "\"Notificarea de adăugare a autentificării\" vă solicită automat salvarea noilor conturi în seif de fiecare dată când vă conectați la ele pentru prima dată."
+ },
+ "dontShowCardsCurrentTab": {
+ "message": "Nu se afișează carduri în pagina filei curente"
+ },
+ "dontShowCardsCurrentTabDesc": {
+ "message": "Informațiile de tip card din seiful dvs. sunt afișate în pagina din \"Fila curentă\" pentru acces ușor la auto-completare."
+ },
+ "dontShowIdentitiesCurrentTab": {
+ "message": "Nu se afișează identități în pagina filei curente"
+ },
+ "dontShowIdentitiesCurrentTabDesc": {
+ "message": "Informațiile de tip identitate din seiful dvs. sunt afișate în pagina din \"Fila curentă\" pentru acces ușor la auto-completare."
+ },
+ "clearClipboard": {
+ "message": "Golire clipboard",
+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
+ },
+ "clearClipboardDesc": {
+ "message": "Șterge automat valorile copiate din clipboard.",
+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
+ },
+ "notificationAddDesc": {
+ "message": "Ar trebui ca Bitwarden să memoreze această parolă pentru dvs.?"
+ },
+ "notificationAddSave": {
+ "message": "Da, salvează acum"
+ },
+ "notificationNeverSave": {
+ "message": "Niciodată pentru acest sait"
+ },
+ "disableChangedPasswordNotification": {
+ "message": "Dezactivare notificare de modificare a parolei"
+ },
+ "disableChangedPasswordNotificationDesc": {
+ "message": "\"Notificarea de modificare a parolei\" vă propune automat să actualizați o parolă din seif oricând se detectează că ați modificat-o pe un sait."
+ },
+ "notificationChangeDesc": {
+ "message": "Doriți să actualizați această parolă în Bitwarden?"
+ },
+ "notificationChangeSave": {
+ "message": "Da, actualizează acum"
+ },
+ "disableContextMenuItem": {
+ "message": "Dezactivare opțiuni meniu contextual"
+ },
+ "disableContextMenuItemDesc": {
+ "message": "Opțiunile din meniul contextual oferă acces rapid la generarea de parole și la autentificările pentru saitul web din fila curentă."
+ },
+ "defaultUriMatchDetection": {
+ "message": "Detectare de potrivire URI implicită",
+ "description": "Default URI match detection for auto-fill."
+ },
+ "defaultUriMatchDetectionDesc": {
+ "message": "Alege modul implicit de gestionare a detectării de potrivire URI pentru conectări când se efectuează acțiuni precum auto-completarea."
+ },
+ "theme": {
+ "message": "Temă"
+ },
+ "themeDesc": {
+ "message": "Schimbă tema de culori a aplicației."
+ },
+ "dark": {
+ "message": "Întunecat",
+ "description": "Dark color"
+ },
+ "light": {
+ "message": "Luminos",
+ "description": "Light color"
+ },
+ "solarizedDark": {
+ "message": "Întuneric solarizat",
+ "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated."
+ },
+ "exportVault": {
+ "message": "Export seif"
+ },
+ "fileFormat": {
+ "message": "Format fișier"
+ },
+ "warning": {
+ "message": "AVERTISMENT",
+ "description": "WARNING (should stay in capitalized letters if the language permits)"
+ },
+ "confirmVaultExport": {
+ "message": "Confirmare export seif"
+ },
+ "exportWarningDesc": {
+ "message": "Acest export conține datele dvs. din seif în format necriptat. Nu ar trebui să stocați sau să trimiteți fișierul pe canale nesecurizate (cum ar fi e-mail). Ștergeți-l imediat după ce nu îl mai folosiți."
+ },
+ "encExportKeyWarningDesc": {
+ "message": "Acest export criptează datele, utilizând cheia de criptare a contului. Dacă revocați vreodată cheia de criptare a contului dvs., ar trebui să exportați din nou, deoarece nu veți putea decripta acest fișier de export."
+ },
+ "encExportAccountWarningDesc": {
+ "message": "Cheile de criptare a contului sunt unice fiecărui cont de utilizator Bitwarden, astfel încât nu puteți importa un export criptat într-un cont diferit."
+ },
+ "exportMasterPassword": {
+ "message": "Introduceți parola principală pentru a exporta datele din seif."
+ },
+ "shared": {
+ "message": "Partajat"
+ },
+ "learnOrg": {
+ "message": "Aflați despre organizații"
+ },
+ "learnOrgConfirmation": {
+ "message": "Bitwarden vă permite să vă partajați articolele seifului cu alte persoane utilizând o organizație. Doriți să vizitați site-ul bitwarden.com pentru a afla mai multe?"
+ },
+ "moveToOrganization": {
+ "message": "Mutare la organizație"
+ },
+ "share": {
+ "message": "Partajare"
+ },
+ "movedItemToOrg": {
+ "message": "$ITEMNAME$ mutat la $ORGNAME$",
+ "placeholders": {
+ "itemname": {
+ "content": "$1",
+ "example": "Secret Item"
+ },
+ "orgname": {
+ "content": "$2",
+ "example": "Company Name"
+ }
+ }
+ },
+ "moveToOrgDesc": {
+ "message": "Alegeți o organizație la care doriți să mutați acest articol. Mutarea într-o organizație transferă proprietatea asupra articolului către organizația respectivă. Nu veți mai fi proprietarul direct al acestui articol odată ce a fost mutat."
+ },
+ "learnMore": {
+ "message": "Aflați mai multe"
+ },
+ "authenticatorKeyTotp": {
+ "message": "Cheie autentificare (TOTP)"
+ },
+ "verificationCodeTotp": {
+ "message": "Cod de verificare (TOTP)"
+ },
+ "copyVerificationCode": {
+ "message": "Copiere cod de verificare"
+ },
+ "attachments": {
+ "message": "Atașamente"
+ },
+ "deleteAttachment": {
+ "message": "Ștergere atașament"
+ },
+ "deleteAttachmentConfirmation": {
+ "message": "Sigur doriți să ștergeți acest atașament?"
+ },
+ "deletedAttachment": {
+ "message": "Atașament șters"
+ },
+ "newAttachment": {
+ "message": "Adăugare atașament nou"
+ },
+ "noAttachments": {
+ "message": "Niciun atașament."
+ },
+ "attachmentSaved": {
+ "message": "Atașamentul a fost salvat."
+ },
+ "file": {
+ "message": "Fișier"
+ },
+ "selectFile": {
+ "message": "Selectare fișier."
+ },
+ "maxFileSize": {
+ "message": "Mărimea maximă a fișierului este de 500 MB."
+ },
+ "featureUnavailable": {
+ "message": "Caracteristică indisponibilă"
+ },
+ "updateKey": {
+ "message": "Nu puteți utiliza această caracteristică înainte de a actualiza cheia de criptare."
+ },
+ "premiumMembership": {
+ "message": "Membru Premium"
+ },
+ "premiumManage": {
+ "message": "Gestionare statut de membru"
+ },
+ "premiumManageAlert": {
+ "message": "Vă puteți gestiona statutul de membru pe saitul web bitwarden.com. Doriți să vizitați saitul acum?"
+ },
+ "premiumRefresh": {
+ "message": "Actualizare statut de membru"
+ },
+ "premiumNotCurrentMember": {
+ "message": "În prezent nu sunteți un membru Premium."
+ },
+ "premiumSignUpAndGet": {
+ "message": "Înscrieți-vă pentru statutul de membru Premium și obțineți:"
+ },
+ "ppremiumSignUpStorage": {
+ "message": "1 GB spațiu de stocare criptat pentru atașamente de fișiere."
+ },
+ "ppremiumSignUpTwoStep": {
+ "message": "Opțiuni adiționale de conectare în două etape, cum ar fi YubiKey, FIDO U2F și Duo."
+ },
+ "ppremiumSignUpReports": {
+ "message": "Rapoarte privind igiena parolelor, sănătatea contului și breșele de date pentru a vă păstra seiful în siguranță."
+ },
+ "ppremiumSignUpTotp": {
+ "message": "Generator de cod de verificare TOTP (2FA) pentru autentificările din seif."
+ },
+ "ppremiumSignUpSupport": {
+ "message": "Asistență prioritară pentru clienți."
+ },
+ "ppremiumSignUpFuture": {
+ "message": "Toate caracteristicile Premium viitoare. Mai multe în curând!"
+ },
+ "premiumPurchase": {
+ "message": "Achiziționare abonament Premium"
+ },
+ "premiumPurchaseAlert": {
+ "message": "Puteți achiziționa un abonament premium pe saitul web bitwarden.com. Doriți să vizitați saitul acum?"
+ },
+ "premiumCurrentMember": {
+ "message": "Sunteți un membru Premium!"
+ },
+ "premiumCurrentMemberThanks": {
+ "message": "Vă mulțumim pentru susținerea Bitwarden."
+ },
+ "premiumPrice": {
+ "message": "Totul pentru doar %price% /an!",
+ "placeholders": {
+ "price": {
+ "content": "$1",
+ "example": "$10"
+ }
+ }
+ },
+ "refreshComplete": {
+ "message": "Actualizare completă"
+ },
+ "disableAutoTotpCopy": {
+ "message": "Dezactivare copiere automată a codului TOTP"
+ },
+ "disableAutoTotpCopyDesc": {
+ "message": "Dacă autentificarea dvs. are o cheie atașată, codul de verificare TOTP este copiat în clipboard de fiecare dată când efectuați auto-completarea datelor de conectare."
+ },
+ "disableAutoBiometricsPrompt": {
+ "message": "Do not prompt for biometrics on launch"
+ },
+ "premiumRequired": {
+ "message": "Este necesară versiunea Premium"
+ },
+ "premiumRequiredDesc": {
+ "message": "Este necesar statutul de membru Premium pentru a utiliza această caracteristică."
+ },
+ "enterVerificationCodeApp": {
+ "message": "Introducere cod de verificare din 6 cifre din aplicația de autentificare."
+ },
+ "enterVerificationCodeEmail": {
+ "message": "Introducere cod de verificare din 6 cifre care a fost trimis prin e-mail la $EMAIL$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "example@gmail.com"
+ }
+ }
+ },
+ "verificationCodeEmailSent": {
+ "message": "E-mailul de verificare a fost trimis la $EMAIL$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "example@gmail.com"
+ }
+ }
+ },
+ "rememberMe": {
+ "message": "Memorare autentificare"
+ },
+ "sendVerificationCodeEmailAgain": {
+ "message": "Retrimitere e-mail cu codul de verificare"
+ },
+ "useAnotherTwoStepMethod": {
+ "message": "Utilizare de metodă diferită de autentificare în două etape"
+ },
+ "insertYubiKey": {
+ "message": "Introduceți YubiKey în portul USB al calculatorului apoi apăsați butonul acestuia."
+ },
+ "insertU2f": {
+ "message": "Introduceți cheia de securitate în portul USB al computerului. Dacă are un buton, apăsați-l."
+ },
+ "webAuthnNewTab": {
+ "message": "Pentru a începe verificarea WebAuthn 2FA. Faceți clic pe butonul de mai jos pentru a deschide o filă nouă și urmați instrucțiunile furnizate în filă nouă."
+ },
+ "webAuthnNewTabOpen": {
+ "message": "Deschideți o filă nouă"
+ },
+ "webAuthnAuthenticate": {
+ "message": "Autentificare WebAuthn"
+ },
+ "loginUnavailable": {
+ "message": "Conectare indisponibilă"
+ },
+ "noTwoStepProviders": {
+ "message": "Acest cont are activată autentificarea în două etape, dar niciunul dintre furnizorii configurați pentru aceasta nu este acceptat de acest browser web."
+ },
+ "noTwoStepProviders2": {
+ "message": "Utilizați un browser acceptat (cum ar fi Chrome) și/sau adăugați furnizori suplimentari mai bine susținuți de browserele web (cum ar fi o aplicație de autentificare)."
+ },
+ "twoStepOptions": {
+ "message": "Opțiuni de autentificare în două etape"
+ },
+ "recoveryCodeDesc": {
+ "message": "Ați pierdut accesul la toți furnizorii de autentificare în două etape? Utilizați codul de recuperare pentru a dezactiva toți acești furnizori din contul dvs."
+ },
+ "recoveryCodeTitle": {
+ "message": "Cod de recuperare"
+ },
+ "authenticatorAppTitle": {
+ "message": "Aplicație de autentificare"
+ },
+ "authenticatorAppDesc": {
+ "message": "Utilizați o aplicație de autentificare (cum ar fi Authy sau Google Authenticator) pentru a genera codurile de verificare bazate pe timp.",
+ "description": "'Authy' and 'Google Authenticator' are product names and should not be translated."
+ },
+ "yubiKeyTitle": {
+ "message": "Cheie de securitate YubiKey OTP"
+ },
+ "yubiKeyDesc": {
+ "message": "Utilizați YubiKey pentru a accesa contul dvs. Funcționează cu dispozitivele YubiKey 4, 4 Nano, 4C și NEO."
+ },
+ "duoDesc": {
+ "message": "Verificați cu Duo Security utilizând aplicația Duo Mobile, SMS, apel telefonic sau cheia de securitate U2F.",
+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
+ },
+ "duoOrganizationDesc": {
+ "message": "Verificați cu Duo Security pentru organizația dvs. utilizând aplicația Duo Mobile, SMS, apel telefonic sau cheia de securitate U2F.",
+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
+ },
+ "webAuthnTitle": {
+ "message": "FIDO2 WebAuthn"
+ },
+ "webAuthnDesc": {
+ "message": "Utilizați orice cheie de securitate activată WebAuthn pentru a vă accesa contul."
+ },
+ "emailTitle": {
+ "message": "E-mail"
+ },
+ "emailDesc": {
+ "message": "Codurile de verificare vor fi trimise prin e-mail."
+ },
+ "selfHostedEnvironment": {
+ "message": "Mediu de găzduire personal"
+ },
+ "selfHostedEnvironmentFooter": {
+ "message": "Specificați URL-ul de bază al implementări Bitwarden găzduită local."
+ },
+ "customEnvironment": {
+ "message": "Mediu personalizat"
+ },
+ "customEnvironmentFooter": {
+ "message": "Pentru utilizatorii avansați. Puteți specifica URL-ul de bază al fiecărui serviciu în mod independent."
+ },
+ "baseUrl": {
+ "message": "URL server"
+ },
+ "apiUrl": {
+ "message": "URL server API"
+ },
+ "webVaultUrl": {
+ "message": "URL server seif Web"
+ },
+ "identityUrl": {
+ "message": "URL server de identificare"
+ },
+ "notificationsUrl": {
+ "message": "URL server de notificări"
+ },
+ "iconsUrl": {
+ "message": "URL server de iconuri"
+ },
+ "environmentSaved": {
+ "message": "URL-urile mediului au fost salvate."
+ },
+ "enableAutoFillOnPageLoad": {
+ "message": "Activare auto-completare la încărcarea paginii"
+ },
+ "enableAutoFillOnPageLoadDesc": {
+ "message": "Dacă este detectat un formular de autentificare, se efectuează automat o completare a acestuia la încărcarea paginii."
+ },
+ "experimentalFeature": {
+ "message": "În acest moment, aceasta funcțiune este experimentală. O puteți folosi pe propria răspundere."
+ },
+ "defaultAutoFillOnPageLoad": {
+ "message": "Setarea implicită de completare automată pentru articole de conectare"
+ },
+ "defaultAutoFillOnPageLoadDesc": {
+ "message": "După activarea completării automate la încărcarea paginii, puteți activa sau dezactiva funcția pentru elementele de conectare individuale. Aceasta este setarea implicită pentru articolele de conectare care nu sunt configurate separat."
+ },
+ "itemAutoFillOnPageLoad": {
+ "message": "Completare automată la încărcarea paginii (dacă este activată în opțiuni)"
+ },
+ "autoFillOnPageLoadUseDefault": {
+ "message": "Utilizați setarea implicită"
+ },
+ "autoFillOnPageLoadYes": {
+ "message": "Completare automată la încărcarea paginii"
+ },
+ "autoFillOnPageLoadNo": {
+ "message": "Nu completați automat la încărcarea paginii"
+ },
+ "commandOpenPopup": {
+ "message": "Deschidere seif pop-up"
+ },
+ "commandOpenSidebar": {
+ "message": "Deschidere seif în bara laterală"
+ },
+ "commandAutofillDesc": {
+ "message": "Auto-completare a ultimei autentificări utilizate pe saitul web curent"
+ },
+ "commandGeneratePasswordDesc": {
+ "message": "Generare parolă aleatorie și copiere în clipboard"
+ },
+ "commandLockVaultDesc": {
+ "message": "Blocare seif"
+ },
+ "privateModeMessage": {
+ "message": "Din păcate, această fereastră nu este disponibilă în modul privat pentru acest browser."
+ },
+ "customFields": {
+ "message": "Câmpuri particularizate"
+ },
+ "copyValue": {
+ "message": "Copiere valoare"
+ },
+ "value": {
+ "message": "Valoare"
+ },
+ "newCustomField": {
+ "message": "Câmp nou particularizat"
+ },
+ "dragToSort": {
+ "message": "Tragere pentru sortare"
+ },
+ "cfTypeText": {
+ "message": "Text"
+ },
+ "cfTypeHidden": {
+ "message": "Ascuns"
+ },
+ "cfTypeBoolean": {
+ "message": "Valoare logică"
+ },
+ "popup2faCloseMessage": {
+ "message": "Dând clic în afara ferestrei pop-up pentru a vă verifica e-mailul pentru codul de verificare, aceasta se va închide. Doriți să deschideți acest pop-up într-o fereastră nouă, astfel încât aceasta să nu se închidă?"
+ },
+ "popupU2fCloseMessage": {
+ "message": "Acest browser nu poate procesa cererile U2F în această fereastră pop-up. Doriți să deschideți acest pop-up într-o fereastră nouă, astfel încât să vă puteți conecta utilizând U2F?"
+ },
+ "disableFavicon": {
+ "message": "Dezactivare iconuri sait"
+ },
+ "disableFaviconDesc": {
+ "message": "Iconurile saiturilor oferă o imagine identificabilă lângă fiecare element de conectare din seiful dvs."
+ },
+ "disableBadgeCounter": {
+ "message": "Dezactivați contorul de insigne"
+ },
+ "disableBadgeCounterDesc": {
+ "message": "Contorul de insigne arată câte conectări aveți în seiful dvs. pentru pagina curentă."
+ },
+ "cardholderName": {
+ "message": "Deținător card"
+ },
+ "number": {
+ "message": "Număr card"
+ },
+ "brand": {
+ "message": "Tip card"
+ },
+ "expirationMonth": {
+ "message": "Luna expirării"
+ },
+ "expirationYear": {
+ "message": "Anul expirării"
+ },
+ "expiration": {
+ "message": "Expirare"
+ },
+ "january": {
+ "message": "ianuarie"
+ },
+ "february": {
+ "message": "februarie"
+ },
+ "march": {
+ "message": "martie"
+ },
+ "april": {
+ "message": "aprilie"
+ },
+ "may": {
+ "message": "mai"
+ },
+ "june": {
+ "message": "iunie"
+ },
+ "july": {
+ "message": "iulie"
+ },
+ "august": {
+ "message": "august"
+ },
+ "september": {
+ "message": "septembrie"
+ },
+ "october": {
+ "message": "octombrie"
+ },
+ "november": {
+ "message": "noiembrie"
+ },
+ "december": {
+ "message": "decembrie"
+ },
+ "securityCode": {
+ "message": "Cod de securitate (CVV/CVC)"
+ },
+ "ex": {
+ "message": "ex."
+ },
+ "title": {
+ "message": "Titlu"
+ },
+ "mr": {
+ "message": "Dl"
+ },
+ "mrs": {
+ "message": "Dna"
+ },
+ "ms": {
+ "message": "Dra"
+ },
+ "dr": {
+ "message": "Dr."
+ },
+ "firstName": {
+ "message": "Prenume"
+ },
+ "middleName": {
+ "message": "Al doilea prenume"
+ },
+ "lastName": {
+ "message": "Nume"
+ },
+ "identityName": {
+ "message": "Identitate"
+ },
+ "company": {
+ "message": "Companie"
+ },
+ "ssn": {
+ "message": "Cod Numeric Personal"
+ },
+ "passportNumber": {
+ "message": "Număr CI / Pașaport"
+ },
+ "licenseNumber": {
+ "message": "Număr licență"
+ },
+ "email": {
+ "message": "E-mail"
+ },
+ "phone": {
+ "message": "Telefon"
+ },
+ "address": {
+ "message": "Adresă"
+ },
+ "address1": {
+ "message": "Adresă 1"
+ },
+ "address2": {
+ "message": "Adresă 2"
+ },
+ "address3": {
+ "message": "Adresă 3"
+ },
+ "cityTown": {
+ "message": "Localitate"
+ },
+ "stateProvince": {
+ "message": "Județ"
+ },
+ "zipPostalCode": {
+ "message": "Cod poștal"
+ },
+ "country": {
+ "message": "Țară"
+ },
+ "type": {
+ "message": "Tip"
+ },
+ "typeLogin": {
+ "message": "Conectare"
+ },
+ "typeLogins": {
+ "message": "Conectări"
+ },
+ "typeSecureNote": {
+ "message": "Notă protejată"
+ },
+ "typeCard": {
+ "message": "Card"
+ },
+ "typeIdentity": {
+ "message": "Identitate"
+ },
+ "passwordHistory": {
+ "message": "Istoric parole"
+ },
+ "back": {
+ "message": "Înapoi"
+ },
+ "collections": {
+ "message": "Colecții"
+ },
+ "favorites": {
+ "message": "Favorite"
+ },
+ "popOutNewWindow": {
+ "message": "Deschidere într-o fereastră nouă"
+ },
+ "refresh": {
+ "message": "Reîmprospătare"
+ },
+ "cards": {
+ "message": "Carduri"
+ },
+ "identities": {
+ "message": "Identități"
+ },
+ "logins": {
+ "message": "Conectări"
+ },
+ "secureNotes": {
+ "message": "Note protejate"
+ },
+ "clear": {
+ "message": "Ștergere",
+ "description": "To clear something out. example: To clear browser history."
+ },
+ "checkPassword": {
+ "message": "Verificați dacă parola a fost dezvăluită."
+ },
+ "passwordExposed": {
+ "message": "Această parolă a fost dezvăluită de $VALUE$ ori în breșe de date. Ar trebui să o schimbați.",
+ "placeholders": {
+ "value": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "passwordSafe": {
+ "message": "Aceasta parola nu a fost găsită în nicio breșă de date cunoscută. Ar trebui să fie sigură de utilizat."
+ },
+ "baseDomain": {
+ "message": "Domeniu de bază"
+ },
+ "host": {
+ "message": "Gazdă",
+ "description": "A URL's host value. For example, the host of https://sub.domain.com:443 is 'sub.domain.com:443'."
+ },
+ "exact": {
+ "message": "Exact"
+ },
+ "startsWith": {
+ "message": "Începe cu"
+ },
+ "regEx": {
+ "message": "Expresie regulată",
+ "description": "A programming term, also known as 'RegEx'."
+ },
+ "matchDetection": {
+ "message": "Detectare de potrivire",
+ "description": "URI match detection for auto-fill."
+ },
+ "defaultMatchDetection": {
+ "message": "Detectare de potrivire implicită",
+ "description": "Default URI match detection for auto-fill."
+ },
+ "toggleOptions": {
+ "message": "Activare/dezactivare opțiuni"
+ },
+ "toggleCurrentUris": {
+ "message": "Comutare URI-uri curente",
+ "description": "Toggle the display of the URIs of the currently open tabs in the browser."
+ },
+ "currentUri": {
+ "message": "URI curent",
+ "description": "The URI of one of the current open tabs in the browser."
+ },
+ "organization": {
+ "message": "Organizație",
+ "description": "An entity of multiple related people (ex. a team or business organization)."
+ },
+ "types": {
+ "message": "Tipuri"
+ },
+ "allItems": {
+ "message": "Toate elementele"
+ },
+ "noPasswordsInList": {
+ "message": "Nicio parolă de afișat."
+ },
+ "remove": {
+ "message": "Ștergere"
+ },
+ "default": {
+ "message": "Implicit"
+ },
+ "dateUpdated": {
+ "message": "S-a actualizat",
+ "description": "ex. Date this item was updated"
+ },
+ "datePasswordUpdated": {
+ "message": "Parola s-a actualizat",
+ "description": "ex. Date this password was updated"
+ },
+ "neverLockWarning": {
+ "message": "Sigur doriți să utilizați opțiunea \"Niciodată\"? Setarea opțiunii de blocare pe \"Niciodată\" vă salvează cheia de criptare pe dispozitiv. Dacă utilizați această opțiune ar trebui să vă asigurați că vă păstrați dispozitivul protejat corespunzător."
+ },
+ "noOrganizationsList": {
+ "message": "Nu aparțineți niciunei organizații. Organizațiile vă permit să partajați în siguranță articole cu alți utilizatori."
+ },
+ "noCollectionsInList": {
+ "message": "Nu există nicio colecție de afișat."
+ },
+ "ownership": {
+ "message": "Proprietar"
+ },
+ "whoOwnsThisItem": {
+ "message": "Cine deține acest element?"
+ },
+ "strong": {
+ "message": "Puternică",
+ "description": "ex. A strong password. Scale: Weak -> Good -> Strong"
+ },
+ "good": {
+ "message": "Bună",
+ "description": "ex. A good password. Scale: Weak -> Good -> Strong"
+ },
+ "weak": {
+ "message": "Slabă",
+ "description": "ex. A weak password. Scale: Weak -> Good -> Strong"
+ },
+ "weakMasterPassword": {
+ "message": "Parolă principală slabă"
+ },
+ "weakMasterPasswordDesc": {
+ "message": "Parola principală aleasă este slabă. Ar trebui să folosiți o parolă principală (sau o frază de acces) puternică pentru a vă proteja corespunzător contul Bitwarden. Sigur doriți să folosiți această parolă principală?"
+ },
+ "pin": {
+ "message": "PIN",
+ "description": "PIN code. Ex. The short code (often numeric) that you use to unlock a device."
+ },
+ "unlockWithPin": {
+ "message": "Deblocare cu codul PIN"
+ },
+ "setYourPinCode": {
+ "message": "Stabiliți codul PIN de deblocare Bitwarden. Setările codului PIN vor fi reinițializate dacă vă deconectați vreodată din aplicație."
+ },
+ "pinRequired": {
+ "message": "Codul PIN este necesar."
+ },
+ "invalidPin": {
+ "message": "Codul PIN este invalid."
+ },
+ "verifyPin": {
+ "message": "Verificare cod PIN"
+ },
+ "yourVaultIsLockedPinCode": {
+ "message": "Seiful dvs. este blocat. Verificați codul PIN pentru a continua."
+ },
+ "unlockWithBiometrics": {
+ "message": "Deblocare folosind biometria"
+ },
+ "awaitDesktop": {
+ "message": "Se așteaptă confirmarea de la desktop"
+ },
+ "awaitDesktopDesc": {
+ "message": "Vă rugăm să confirmați utilizarea biometriei în aplicația Bitwarden Desktop pentru a activa biometria pentru browser."
+ },
+ "lockWithMasterPassOnRestart": {
+ "message": "Blocare cu parola principală la repornirea browserului"
+ },
+ "selectOneCollection": {
+ "message": "Trebuie să selectați cel puțin o colecție."
+ },
+ "cloneItem": {
+ "message": "Clonare articol"
+ },
+ "clone": {
+ "message": "Clonare"
+ },
+ "passwordGeneratorPolicyInEffect": {
+ "message": "Una sau mai multe politici organizaționale vă afectează setările generatorului."
+ },
+ "vaultTimeoutAction": {
+ "message": "Acțiune la expirarea seifului"
+ },
+ "lock": {
+ "message": "Blocare",
+ "description": "Verb form: to make secure or inaccesible by"
+ },
+ "trash": {
+ "message": "Coș de reciclare",
+ "description": "Noun: a special folder to hold deleted items"
+ },
+ "searchTrash": {
+ "message": "Căutare în coșul de reciclare"
+ },
+ "permanentlyDeleteItem": {
+ "message": "Ștergere definitivă a articolului"
+ },
+ "permanentlyDeleteItemConfirmation": {
+ "message": "Sigur doriți să ștergeți definitiv acest articol?"
+ },
+ "permanentlyDeletedItem": {
+ "message": "Articolul a fost șters definitiv"
+ },
+ "restoreItem": {
+ "message": "Restabilire articol"
+ },
+ "restoreItemConfirmation": {
+ "message": "Sigur doriți să restabiliți acest articol?"
+ },
+ "restoredItem": {
+ "message": "Articol restabilit"
+ },
+ "vaultTimeoutLogOutConfirmation": {
+ "message": "După expirare, accesul la seiful dvs. va fi restricționat și va fi necesară autentificarea online. Sigur doriți să utilizați această setare?"
+ },
+ "vaultTimeoutLogOutConfirmationTitle": {
+ "message": "Confirmare acțiune la expirare"
+ },
+ "autoFillAndSave": {
+ "message": "Auto-completare și Salvare"
+ },
+ "autoFillSuccessAndSavedUri": {
+ "message": "Articolul s-a completat automat și URl-ul s-a salvat"
+ },
+ "autoFillSuccess": {
+ "message": "Articolul s-a completat automat"
+ },
+ "setMasterPassword": {
+ "message": "Setare parolă principală"
+ },
+ "masterPasswordPolicyInEffect": {
+ "message": "Una sau mai multe politici ale organizației necesită ca parola principală să îndeplinească următoarele cerințe:"
+ },
+ "policyInEffectMinComplexity": {
+ "message": "Scor minim de complexitate de $SCORE$",
+ "placeholders": {
+ "score": {
+ "content": "$1",
+ "example": "4"
+ }
+ }
+ },
+ "policyInEffectMinLength": {
+ "message": "Lungime minimă de $LENGTH$",
+ "placeholders": {
+ "length": {
+ "content": "$1",
+ "example": "14"
+ }
+ }
+ },
+ "policyInEffectUppercase": {
+ "message": "Unul sau mai multe caractere majuscule"
+ },
+ "policyInEffectLowercase": {
+ "message": "Unul sau mai multe caractere minuscule"
+ },
+ "policyInEffectNumbers": {
+ "message": "Una sau mai multe cifre"
+ },
+ "policyInEffectSpecial": {
+ "message": "Unul sau mai multe din următoarele caractere: $CHARS$",
+ "placeholders": {
+ "chars": {
+ "content": "$1",
+ "example": "!@#$%^&*"
+ }
+ }
+ },
+ "masterPasswordPolicyRequirementsNotMet": {
+ "message": "Noua dvs. parolă principală nu îndeplinește cerințele politicii."
+ },
+ "acceptPolicies": {
+ "message": "Dacă bifați această casetă sunteți de acord cu următoarele:"
+ },
+ "acceptPoliciesError": {
+ "message": "Termenii de utilizare și Politica de confidențialitate nu au fost recunoscute."
+ },
+ "termsOfService": {
+ "message": "Termeni de utilizare"
+ },
+ "privacyPolicy": {
+ "message": "Politică de confidențialitate"
+ },
+ "hintEqualsPassword": {
+ "message": "Indiciul dvs. de parolă nu poate fi același cu parola dvs."
+ },
+ "ok": {
+ "message": "Ok"
+ },
+ "desktopSyncVerificationTitle": {
+ "message": "Verificare sincronizare desktop"
+ },
+ "desktopIntegrationVerificationText": {
+ "message": "Verificați dacă aplicația desktop afișează această amprentă digitală:"
+ },
+ "desktopIntegrationDisabledTitle": {
+ "message": "Integrarea browserului nu este activată"
+ },
+ "desktopIntegrationDisabledDesc": {
+ "message": "Integrarea browserului nu este activată în aplicația Bitwarden Desktop. Vă rugăm să o activați în setările din aplicația desktop."
+ },
+ "startDesktopTitle": {
+ "message": "Porniți aplicația Bitwarden Desktop"
+ },
+ "startDesktopDesc": {
+ "message": "Aplicația Bitwarden Desktop trebuie pornită înainte de a putea utiliza această funcție."
+ },
+ "errorEnableBiometricTitle": {
+ "message": "Nu se poate activa biometria"
+ },
+ "errorEnableBiometricDesc": {
+ "message": "Acțiunea a fost anulată de aplicația desktop"
+ },
+ "nativeMessagingInvalidEncryptionDesc": {
+ "message": "Aplicația desktop a invalidat canalul de comunicare securizată. Reîncercați această operație"
+ },
+ "nativeMessagingInvalidEncryptionTitle": {
+ "message": "Comunicare desktop întreruptă"
+ },
+ "nativeMessagingWrongUserDesc": {
+ "message": "Aplicația desktop este conectată la un alt cont. Vă rugăm să vă asigurați că ambele aplicații sunt înregistrate în același cont."
+ },
+ "nativeMessagingWrongUserTitle": {
+ "message": "Eroare de cont"
+ },
+ "biometricsNotEnabledTitle": {
+ "message": "Biometria nu a fost activată"
+ },
+ "biometricsNotEnabledDesc": {
+ "message": "Biometria browserului necesită activarea mai întâi a biometriei de pe desktop în setări."
+ },
+ "biometricsNotSupportedTitle": {
+ "message": "Biometria nu este acceptată"
+ },
+ "biometricsNotSupportedDesc": {
+ "message": "Biometria browserului nu este acceptată pe acest dispozitiv."
+ },
+ "nativeMessaginPermissionErrorTitle": {
+ "message": "Permisiunea nu a fost furnizată"
+ },
+ "nativeMessaginPermissionErrorDesc": {
+ "message": "Fără permisiunea de comunicare cu aplicația Bitwarden Desktop nu putem furniza date biometrice în extensia browserului. Încercați din nou."
+ },
+ "nativeMessaginPermissionSidebarTitle": {
+ "message": "Eroare solicitare permisiune"
+ },
+ "nativeMessaginPermissionSidebarDesc": {
+ "message": "Această acțiune nu se poate efectua în bara laterală, vă rugăm să reîncercați acțiunea în fereastra pop-up sau popup."
+ },
+ "personalOwnershipSubmitError": {
+ "message": "Datorită unei politici pentru întreprinderi, vă este restricționată salvarea de elemente în seiful dvs. personal. Schimbați opțiunea de proprietate la o organizație și alegeți dintre colecțiile disponibile."
+ },
+ "personalOwnershipPolicyInEffect": {
+ "message": "O politică de organizație vă afectează opțiunile de proprietate."
+ },
+ "excludedDomains": {
+ "message": "Domenii excluse"
+ },
+ "excludedDomainsDesc": {
+ "message": "Bitwarden nu va cere să salveze detaliile de conectare pentru aceste domenii. Trebuie să reîmprospătați pagina pentru ca modificările să intre în vigoare."
+ },
+ "excludedDomainsInvalidDomain": {
+ "message": "$DOMAIN$ nu este un domeniu valid",
+ "placeholders": {
+ "domain": {
+ "content": "$1",
+ "example": "googlecom"
+ }
+ }
+ },
+ "send": {
+ "message": "Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "searchSends": {
+ "message": "Căutare Send-uri",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "addSend": {
+ "message": "Adăugare Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTypeText": {
+ "message": "Text"
+ },
+ "sendTypeFile": {
+ "message": "Fișier"
+ },
+ "allSends": {
+ "message": "Toate Send-urile",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "maxAccessCountReached": {
+ "message": "S-a atins numărul maxim de accesări"
+ },
+ "expired": {
+ "message": "Expirat"
+ },
+ "pendingDeletion": {
+ "message": "Ștergere în așteptare"
+ },
+ "passwordProtected": {
+ "message": "Protejat cu parolă"
+ },
+ "copySendLink": {
+ "message": "Copiere link Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "removePassword": {
+ "message": "Eliminare parolă"
+ },
+ "delete": {
+ "message": "Ștergere"
+ },
+ "removedPassword": {
+ "message": "Parola a fost eliminată"
+ },
+ "deletedSend": {
+ "message": "Send-ul a fost șters",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendLink": {
+ "message": "Link Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "disabled": {
+ "message": "Dezactivat"
+ },
+ "removePasswordConfirmation": {
+ "message": "Sigur doriți să eliminați parola?"
+ },
+ "deleteSend": {
+ "message": "Ștergere Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "deleteSendConfirmation": {
+ "message": "Sigur doriți să ștergeți acest Send?",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "editSend": {
+ "message": "Editare Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTypeHeader": {
+ "message": "Ce fel de Send este acesta?",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendNameDesc": {
+ "message": "Un nume prietenos pentru a descrie acest Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendFileDesc": {
+ "message": "Fișierul pe care doriți să-l trimiteți."
+ },
+ "deletionDate": {
+ "message": "Data ștergerii"
+ },
+ "deletionDateDesc": {
+ "message": "Send-ul va fi șters definitiv la data și ora specificate.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "expirationDate": {
+ "message": "Data expirării"
+ },
+ "expirationDateDesc": {
+ "message": "Dacă este setat, accesul la acest Send va expira la data și ora specificate.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "oneDay": {
+ "message": "1 zi"
+ },
+ "days": {
+ "message": "$DAYS$ zile",
+ "placeholders": {
+ "days": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "custom": {
+ "message": "Personalizat"
+ },
+ "maximumAccessCount": {
+ "message": "Număr maxim de accesări"
+ },
+ "maximumAccessCountDesc": {
+ "message": "Dacă este setată, utilizatorii nu vor mai putea accesa acest Send după atingerea numărului maxim de accesării.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendPasswordDesc": {
+ "message": "Opțional, este necesară o parolă pentru ca utilizatorii să acceseze acest Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendNotesDesc": {
+ "message": "Note private despre acest Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendDisableDesc": {
+ "message": "Dezactivează acest Send astfel încât nimeni să nu-l poată accesa.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendShareDesc": {
+ "message": "Copiază acest link de Send în clipboard la salvare.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTextDesc": {
+ "message": "Textul pe care doriți să-l trimiteți."
+ },
+ "sendHideText": {
+ "message": "Ascunde în mod implicit textul acestui Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "currentAccessCount": {
+ "message": "Număr actual de accesări"
+ },
+ "createSend": {
+ "message": "Creare de nou Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "newPassword": {
+ "message": "Parolă nouă"
+ },
+ "sendDisabled": {
+ "message": "Send dezactivat",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendDisabledWarning": {
+ "message": "Datorită unei politici de întreprindere, puteți șterge numai un Send existent.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "createdSend": {
+ "message": "Send creat",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "editedSend": {
+ "message": "Send editat",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendLinuxChromiumFileWarning": {
+ "message": "Pentru a alege un fișier, deschideți extensia în bara laterală (dacă este posibil) sau deschideți-o într-o fereastră nouă, făcând clic pe acest banner."
+ },
+ "sendFirefoxFileWarning": {
+ "message": "Pentru a alege un fișier folosind Firefox, deschideți extensia din bara laterală sau deschideți o fereastră nouă făcând clic pe acest banner."
+ },
+ "sendSafariFileWarning": {
+ "message": "Pentru a alege un fișier folosind Safari, deschideți o fereastră nouă făcând clic pe acest banner."
+ },
+ "sendFileCalloutHeader": {
+ "message": "Înainte de a începe"
+ },
+ "sendFirefoxCustomDatePopoutMessage1": {
+ "message": "Pentru a utiliza un selector de date în stil calendar,",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read '**To use a calendar style date picker ** click here to pop out your window.'"
+ },
+ "sendFirefoxCustomDatePopoutMessage2": {
+ "message": "faceți clic aici",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker **click here** to pop out your window.'"
+ },
+ "sendFirefoxCustomDatePopoutMessage3": {
+ "message": "pentru ca fereastra dvs să apară.",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker click here **to pop out your window.**'"
+ },
+ "expirationDateIsInvalid": {
+ "message": "Data de expirare furnizată nu este validă."
+ },
+ "deletionDateIsInvalid": {
+ "message": "Data de ștergere furnizată nu este validă."
+ },
+ "expirationDateAndTimeRequired": {
+ "message": "Sunt necesare o dată și o oră de expirare."
+ },
+ "deletionDateAndTimeRequired": {
+ "message": "Sunt necesare o dată și o oră de ștergere."
+ },
+ "dateParsingError": {
+ "message": "A survenit o eroare la salvarea datelor de ștergere și de expirare."
+ },
+ "hideEmail": {
+ "message": "Ascundeți adresa mea de e-mail de la destinatari."
+ },
+ "sendOptionsPolicyInEffect": {
+ "message": "Una sau mai multe politici organizaționale vă afectează opțiunile Send-ului."
+ },
+ "passwordPrompt": {
+ "message": "Re-solicitare parolă principală"
+ },
+ "passwordConfirmation": {
+ "message": "Confirmare parolă principală"
+ },
+ "passwordConfirmationDesc": {
+ "message": "Această acțiune este protejată. Pentru a continua, vă rugăm să reintroduceți parola principală pentru a vă verifica identitatea."
+ },
+ "emailVerificationRequired": {
+ "message": "Este necesară verificarea adresei de e-mail"
+ },
+ "emailVerificationRequiredDesc": {
+ "message": "Trebuie să vă verificați e-mailul pentru a utiliza această caracteristică. Puteți verifica e-mailul în seiful web."
+ },
+ "updatedMasterPassword": {
+ "message": "Updated Master Password"
+ },
+ "updateMasterPassword": {
+ "message": "Update Master Password"
+ },
+ "updateMasterPasswordWarning": {
+ "message": "Your Master Password was recently changed by an administrator in your organization. In order to access the vault, you must update it now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour."
+ },
+ "resetPasswordPolicyAutoEnroll": {
+ "message": "Automatic Enrollment"
+ },
+ "resetPasswordAutoEnrollInviteWarning": {
+ "message": "This organization has an enterprise policy that will automatically enroll you in password reset. Enrollment will allow organization administrators to change your master password."
+ },
+ "selectFolder": {
+ "message": "Select folder..."
+ },
+ "ssoCompleteRegistration": {
+ "message": "In order to complete logging in with SSO, please set a master password to access and protect your vault."
+ },
+ "hours": {
+ "message": "Hours"
+ },
+ "minutes": {
+ "message": "Minutes"
+ },
+ "vaultTimeoutPolicyInEffect": {
+ "message": "Your organization policies are affecting your vault timeout. Maximum allowed Vault Timeout is $HOURS$ hour(s) and $MINUTES$ minute(s)",
+ "placeholders": {
+ "hours": {
+ "content": "$1",
+ "example": "5"
+ },
+ "minutes": {
+ "content": "$2",
+ "example": "5"
+ }
+ }
+ },
+ "vaultTimeoutToLarge": {
+ "message": "Your vault timeout exceeds the restrictions set by your organization."
+ },
+ "vaultExportDisabled": {
+ "message": "Vault Export Disabled"
+ },
+ "personalVaultExportPolicyInEffect": {
+ "message": "One or more organization policies prevents you from exporting your personal vault."
+ },
+ "copyCustomFieldNameInvalidElement": {
+ "message": "Unable to identify a valid form element. Try inspecting the HTML instead."
+ },
+ "copyCustomFieldNameNotUnique": {
+ "message": "No unique identifier found."
+ }
+}
diff --git a/src/iOS.Safari/Resources/_locales/ru/messages.json b/src/iOS.Safari/Resources/_locales/ru/messages.json
new file mode 100644
index 000000000..96d7380f5
--- /dev/null
+++ b/src/iOS.Safari/Resources/_locales/ru/messages.json
@@ -0,0 +1,1817 @@
+{
+ "appName": {
+ "message": "Bitwarden"
+ },
+ "extName": {
+ "message": "Bitwarden - бесплатный менеджер паролей",
+ "description": "Extension name, MUST be less than 40 characters (Safari restriction)"
+ },
+ "extDesc": {
+ "message": "Защищенный и бесплатный менеджер паролей для всех ваших устройств.",
+ "description": "Extension description"
+ },
+ "loginOrCreateNewAccount": {
+ "message": "Войдите или создайте новый аккаунт для доступа к вашему защищенному хранилищу."
+ },
+ "createAccount": {
+ "message": "Создать аккаунт"
+ },
+ "login": {
+ "message": "Войти"
+ },
+ "enterpriseSingleSignOn": {
+ "message": "Единая корпоративная авторизация (SSO)"
+ },
+ "cancel": {
+ "message": "Отмена"
+ },
+ "close": {
+ "message": "Закрыть"
+ },
+ "submit": {
+ "message": "Отправить"
+ },
+ "emailAddress": {
+ "message": "Адрес email"
+ },
+ "masterPass": {
+ "message": "Мастер-пароль"
+ },
+ "masterPassDesc": {
+ "message": "Мастер-пароль – это ключ к вашему защищенному хранилищу. Он очень важен, поэтому не забывайте его. Восстановить мастер-пароль невозможно."
+ },
+ "masterPassHintDesc": {
+ "message": "Подсказка к мастер-паролю может помочь вам его вспомнить."
+ },
+ "reTypeMasterPass": {
+ "message": "Введите мастер-пароль повторно"
+ },
+ "masterPassHint": {
+ "message": "Подсказка к мастер-паролю (необяз.)"
+ },
+ "tab": {
+ "message": "Вкладка"
+ },
+ "myVault": {
+ "message": "Хранилище"
+ },
+ "tools": {
+ "message": "Инструменты"
+ },
+ "settings": {
+ "message": "Настройки"
+ },
+ "currentTab": {
+ "message": "Текущая вкладка"
+ },
+ "copyPassword": {
+ "message": "Скопировать пароль"
+ },
+ "copyNote": {
+ "message": "Скопировать заметку"
+ },
+ "copyUri": {
+ "message": "Скопировать URI"
+ },
+ "copyUsername": {
+ "message": "Скопировать имя пользователя"
+ },
+ "copyNumber": {
+ "message": "Скопировать номер"
+ },
+ "copySecurityCode": {
+ "message": "Скопировать код безопасности"
+ },
+ "autoFill": {
+ "message": "Автозаполнение"
+ },
+ "generatePasswordCopied": {
+ "message": "Сгенерировать пароль (с копированием)"
+ },
+ "copyElementIdentifier": {
+ "message": "Скопировать название пользовательского поля"
+ },
+ "noMatchingLogins": {
+ "message": "Нет подходящих логинов."
+ },
+ "vaultLocked": {
+ "message": "Хранилище заблокировано."
+ },
+ "vaultLoggedOut": {
+ "message": "Вы вышли из хранилища."
+ },
+ "autoFillInfo": {
+ "message": "Нет доступных логинов для автозаполнения на текущей вкладке браузера."
+ },
+ "addLogin": {
+ "message": "Добавить логин"
+ },
+ "addItem": {
+ "message": "Добавить элемент"
+ },
+ "passwordHint": {
+ "message": "Подсказка к паролю"
+ },
+ "enterEmailToGetHint": {
+ "message": "Введите email аккаунта для получения подсказки к мастер-паролю."
+ },
+ "getMasterPasswordHint": {
+ "message": "Получить подсказку к мастер-паролю"
+ },
+ "continue": {
+ "message": "Продолжить"
+ },
+ "verificationCode": {
+ "message": "Код подтверждения"
+ },
+ "account": {
+ "message": "Аккаунт"
+ },
+ "changeMasterPassword": {
+ "message": "Изменить мастер-пароль"
+ },
+ "fingerprintPhrase": {
+ "message": "Фраза отпечатка",
+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
+ },
+ "yourAccountsFingerprint": {
+ "message": "Фраза отпечатка вашего аккаунта",
+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
+ },
+ "twoStepLogin": {
+ "message": "Двухфакторная аутентификация"
+ },
+ "logOut": {
+ "message": "Выйти"
+ },
+ "about": {
+ "message": "О Bitwarden"
+ },
+ "version": {
+ "message": "Версия"
+ },
+ "save": {
+ "message": "Сохранить"
+ },
+ "move": {
+ "message": "Переместить"
+ },
+ "addFolder": {
+ "message": "Добавить папку"
+ },
+ "name": {
+ "message": "Название"
+ },
+ "editFolder": {
+ "message": "Изменить папку"
+ },
+ "deleteFolder": {
+ "message": "Удалить папку"
+ },
+ "folders": {
+ "message": "Папки"
+ },
+ "noFolders": {
+ "message": "Нет папок для отображения."
+ },
+ "helpFeedback": {
+ "message": "Помощь и обратная связь"
+ },
+ "sync": {
+ "message": "Синхронизация"
+ },
+ "syncVaultNow": {
+ "message": "Синхронизировать сейчас"
+ },
+ "lastSync": {
+ "message": "Последняя синхронизация:"
+ },
+ "passGen": {
+ "message": "Генератор паролей"
+ },
+ "generator": {
+ "message": "Генератор",
+ "description": "Short for 'Password Generator'."
+ },
+ "passGenInfo": {
+ "message": "Автоматическая генерация сильных и уникальных паролей для ваших логинов."
+ },
+ "bitWebVault": {
+ "message": "Веб-хранилище Bitwarden"
+ },
+ "importItems": {
+ "message": "Импорт элементов"
+ },
+ "select": {
+ "message": "Выбрать"
+ },
+ "generatePassword": {
+ "message": "Сгенерировать пароль"
+ },
+ "regeneratePassword": {
+ "message": "Создать новый пароль"
+ },
+ "options": {
+ "message": "Опции"
+ },
+ "length": {
+ "message": "Длина"
+ },
+ "numWords": {
+ "message": "Количество слов"
+ },
+ "wordSeparator": {
+ "message": "Разделитель слов"
+ },
+ "capitalize": {
+ "message": "С заглавной буквы",
+ "description": "Make the first letter of a work uppercase."
+ },
+ "includeNumber": {
+ "message": "Добавить цифру"
+ },
+ "minNumbers": {
+ "message": "Минимум цифр"
+ },
+ "minSpecial": {
+ "message": "Минимум символов"
+ },
+ "avoidAmbChar": {
+ "message": "Избегать неоднозначных символов"
+ },
+ "searchVault": {
+ "message": "Поиск в хранилище"
+ },
+ "edit": {
+ "message": "Изменить"
+ },
+ "view": {
+ "message": "Просмотр"
+ },
+ "noItemsInList": {
+ "message": "Нет элементов для отображения."
+ },
+ "itemInformation": {
+ "message": "Информация об элементе"
+ },
+ "username": {
+ "message": "Имя пользователя"
+ },
+ "password": {
+ "message": "Пароль"
+ },
+ "passphrase": {
+ "message": "Парольная фраза"
+ },
+ "favorite": {
+ "message": "Избранный"
+ },
+ "notes": {
+ "message": "Заметки"
+ },
+ "note": {
+ "message": "Заметка"
+ },
+ "editItem": {
+ "message": "Изменение элемента"
+ },
+ "folder": {
+ "message": "Папка"
+ },
+ "deleteItem": {
+ "message": "Удалить элемент"
+ },
+ "viewItem": {
+ "message": "Просмотр элемента"
+ },
+ "launch": {
+ "message": "Перейти"
+ },
+ "website": {
+ "message": "Веб-сайт"
+ },
+ "toggleVisibility": {
+ "message": "Вкл/выкл видимость"
+ },
+ "manage": {
+ "message": "Управление"
+ },
+ "other": {
+ "message": "Прочее"
+ },
+ "rateExtension": {
+ "message": "Оценить расширение"
+ },
+ "rateExtensionDesc": {
+ "message": "Пожалуйста, подумайте о том, чтобы помочь нам хорошим отзывом!"
+ },
+ "browserNotSupportClipboard": {
+ "message": "Ваш браузер не поддерживает копирование данных в буфер обмена. Скопируйте вручную."
+ },
+ "verifyMasterPassword": {
+ "message": "Проверка мастер-пароля"
+ },
+ "yourVaultIsLocked": {
+ "message": "Ваше хранилище заблокировано. Для продолжения введите мастер-пароль."
+ },
+ "unlock": {
+ "message": "Разблокировать"
+ },
+ "loggedInAsOn": {
+ "message": "Выполнен вход на $HOSTNAME$ как $EMAIL$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "name@example.com"
+ },
+ "hostname": {
+ "content": "$2",
+ "example": "bitwarden.com"
+ }
+ }
+ },
+ "invalidMasterPassword": {
+ "message": "Неверный мастер-пароль"
+ },
+ "vaultTimeout": {
+ "message": "Тайм-аут хранилища"
+ },
+ "lockNow": {
+ "message": "Заблокировать сейчас"
+ },
+ "immediately": {
+ "message": "Немедленно"
+ },
+ "tenSeconds": {
+ "message": "10 секунд"
+ },
+ "twentySeconds": {
+ "message": "20 секунд"
+ },
+ "thirtySeconds": {
+ "message": "30 секунд"
+ },
+ "oneMinute": {
+ "message": "1 минута"
+ },
+ "twoMinutes": {
+ "message": "2 минуты"
+ },
+ "fiveMinutes": {
+ "message": "5 минут"
+ },
+ "fifteenMinutes": {
+ "message": "15 минут"
+ },
+ "thirtyMinutes": {
+ "message": "30 минут"
+ },
+ "oneHour": {
+ "message": "1 час"
+ },
+ "fourHours": {
+ "message": "4 часа"
+ },
+ "onLocked": {
+ "message": "Вместе с компьютером"
+ },
+ "onRestart": {
+ "message": "При перезапуске"
+ },
+ "never": {
+ "message": "Никогда"
+ },
+ "security": {
+ "message": "Безопасность"
+ },
+ "errorOccurred": {
+ "message": "Произошла ошибка"
+ },
+ "emailRequired": {
+ "message": "Необходимо указать email."
+ },
+ "invalidEmail": {
+ "message": "Неверный адрес email."
+ },
+ "masterPassRequired": {
+ "message": "Необходимо ввести мастер-пароль."
+ },
+ "masterPassLength": {
+ "message": "Мастер-пароль должен содержать не менее 8 символов."
+ },
+ "masterPassDoesntMatch": {
+ "message": "Мастер-пароли не совпадают."
+ },
+ "newAccountCreated": {
+ "message": "Ваш аккаунт создан! Теперь вы можете войти в систему."
+ },
+ "masterPassSent": {
+ "message": "Мы отправили вам письмо с подсказкой к мастер-паролю."
+ },
+ "verificationCodeRequired": {
+ "message": "Необходимо ввести код подтверждения."
+ },
+ "valueCopied": {
+ "message": "$VALUE$ скопировано",
+ "description": "Value has been copied to the clipboard.",
+ "placeholders": {
+ "value": {
+ "content": "$1",
+ "example": "Password"
+ }
+ }
+ },
+ "autofillError": {
+ "message": "Не удалось автоматически заполнить выбранный элемент на этой странице. Скопируйте и вставьте логин/пароль из своего хранилища."
+ },
+ "loggedOut": {
+ "message": "Вы вышли из хранилища"
+ },
+ "loginExpired": {
+ "message": "Истек срок действия вашей сессии."
+ },
+ "logOutConfirmation": {
+ "message": "Вы действительно хотите выйти?"
+ },
+ "yes": {
+ "message": "Да"
+ },
+ "no": {
+ "message": "Нет"
+ },
+ "unexpectedError": {
+ "message": "Произошла непредвиденная ошибка."
+ },
+ "nameRequired": {
+ "message": "Необходимо название."
+ },
+ "addedFolder": {
+ "message": "Папка добавлена"
+ },
+ "changeMasterPass": {
+ "message": "Изменить мастер-пароль"
+ },
+ "changeMasterPasswordConfirmation": {
+ "message": "Вы можете изменить свой мастер-пароль на bitwarden.com. Перейти на сайт сейчас?"
+ },
+ "twoStepLoginConfirmation": {
+ "message": "Двухфакторная аутентификация делает ваш аккаунт более защищенным, требуя подтверждения входа на другом устройстве, например, ключом безопасности, приложением-аутентификатором, SMS, телефонным звонком или письмом. Двухфакторная аутентификация включается на bitwarden.com. Перейти на сайт сейчас?"
+ },
+ "editedFolder": {
+ "message": "Папка отредактирована"
+ },
+ "deleteFolderConfirmation": {
+ "message": "Удалить эту папку?"
+ },
+ "deletedFolder": {
+ "message": "Папка удалена"
+ },
+ "gettingStartedTutorial": {
+ "message": "Учебник по началу работы"
+ },
+ "gettingStartedTutorialVideo": {
+ "message": "Посмотрите небольшой обучающий материал, чтобы узнать, как получить максимальную отдачу от расширения браузера."
+ },
+ "syncingComplete": {
+ "message": "Синхронизация завершена"
+ },
+ "syncingFailed": {
+ "message": "Ошибка синхронизации"
+ },
+ "passwordCopied": {
+ "message": "Пароль скопирован"
+ },
+ "uri": {
+ "message": "URI"
+ },
+ "uriPosition": {
+ "message": "URI $POSITION$",
+ "description": "A listing of URIs. Ex: URI 1, URI 2, URI 3, etc.",
+ "placeholders": {
+ "position": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "newUri": {
+ "message": "Новый URI"
+ },
+ "addedItem": {
+ "message": "Элемент добавлен"
+ },
+ "editedItem": {
+ "message": "Элемент изменен"
+ },
+ "deleteItemConfirmation": {
+ "message": "Вы действительно хотите отправить в корзину?"
+ },
+ "deletedItem": {
+ "message": "Элемент отправлен в корзину"
+ },
+ "overwritePassword": {
+ "message": "Перезаписать пароль"
+ },
+ "overwritePasswordConfirmation": {
+ "message": "Вы хотите перезаписать текущий пароль?"
+ },
+ "searchFolder": {
+ "message": "Поиск в папке"
+ },
+ "searchCollection": {
+ "message": "Поиск в коллекции"
+ },
+ "searchType": {
+ "message": "Тип поиска"
+ },
+ "noneFolder": {
+ "message": "Без папки",
+ "description": "This is the folder for uncategorized items"
+ },
+ "disableAddLoginNotification": {
+ "message": "Отключить уведомление о добавлении логина"
+ },
+ "addLoginNotificationDesc": {
+ "message": "Уведомление о добавлении логина автоматически предложит вам сохранить новые логины в хранилище."
+ },
+ "dontShowCardsCurrentTab": {
+ "message": "Не показывать карты на вкладке"
+ },
+ "dontShowCardsCurrentTabDesc": {
+ "message": "Карты из вашего хранилища перечислены на 'Текущей вкладке' для упрощения доступа к автозаполнению."
+ },
+ "dontShowIdentitiesCurrentTab": {
+ "message": "Не показывать Личности на вкладке"
+ },
+ "dontShowIdentitiesCurrentTabDesc": {
+ "message": "Личности из вашего хранилища перечислены на 'Текущей вкладке' для упрощения доступа к автозаполнению."
+ },
+ "clearClipboard": {
+ "message": "Очистка буфера обмена",
+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
+ },
+ "clearClipboardDesc": {
+ "message": "Автоматически очищать скопированные значения в вашем буфере обмена.",
+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
+ },
+ "notificationAddDesc": {
+ "message": "Должен ли Bitwarden запомнить этот пароль?"
+ },
+ "notificationAddSave": {
+ "message": "Да, сохранить"
+ },
+ "notificationNeverSave": {
+ "message": "Никогда для этого сайта"
+ },
+ "disableChangedPasswordNotification": {
+ "message": "Отключить уведомление об изменении пароля"
+ },
+ "disableChangedPasswordNotificationDesc": {
+ "message": "Уведомление об изменении пароля автоматически предложит вам обновить пароль входа в хранилище, когда обнаружит, что вы изменили его на веб-сайте."
+ },
+ "notificationChangeDesc": {
+ "message": "Обновить этот пароль в Bitwarden?"
+ },
+ "notificationChangeSave": {
+ "message": "Да, обновить"
+ },
+ "disableContextMenuItem": {
+ "message": "Отключить опции контекстного меню"
+ },
+ "disableContextMenuItemDesc": {
+ "message": "Опции контекстного меню обеспечивают быстрый доступ к генератору паролей и логинам для сайта на текущей вкладке."
+ },
+ "defaultUriMatchDetection": {
+ "message": "Обнаружение совпадения URI по умолчанию",
+ "description": "Default URI match detection for auto-fill."
+ },
+ "defaultUriMatchDetectionDesc": {
+ "message": "Выберите стандартный способ определения соответствия URI для логинов при выполнении таких действий, как автоматическое заполнение."
+ },
+ "theme": {
+ "message": "Тема"
+ },
+ "themeDesc": {
+ "message": "Изменение цветовой темы приложения."
+ },
+ "dark": {
+ "message": "Темная",
+ "description": "Dark color"
+ },
+ "light": {
+ "message": "Светлая",
+ "description": "Light color"
+ },
+ "solarizedDark": {
+ "message": "Солнечная темная",
+ "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated."
+ },
+ "exportVault": {
+ "message": "Экспорт хранилища"
+ },
+ "fileFormat": {
+ "message": "Формат файла"
+ },
+ "warning": {
+ "message": "ВНИМАНИЕ",
+ "description": "WARNING (should stay in capitalized letters if the language permits)"
+ },
+ "confirmVaultExport": {
+ "message": "Подтвердить экспорт хранилища"
+ },
+ "exportWarningDesc": {
+ "message": "Экспортируемый файл содержит данные вашего хранилища в незашифрованном формате. Его не следует хранить или отправлять по небезопасным каналам (например, по электронной почте). Удалите его сразу после использования."
+ },
+ "encExportKeyWarningDesc": {
+ "message": "При экспорте данные шифруются при помощи ключа шифрования учетной записи. Если вы решите сменить ключ шифрования, вам следует экспортировать данные повторно, поскольку вы не сможете расшифровать этот файл экспорта."
+ },
+ "encExportAccountWarningDesc": {
+ "message": "Ключи шифрования уникальны для каждой учетной записи Bitwarden, поэтому нельзя импортировать зашифрованное хранилище в другой аккаунт."
+ },
+ "exportMasterPassword": {
+ "message": "Для экспорта данных из хранилища введите мастер-пароль."
+ },
+ "shared": {
+ "message": "Общие"
+ },
+ "learnOrg": {
+ "message": "Узнать об организациях"
+ },
+ "learnOrgConfirmation": {
+ "message": "Bitwarden позволяет делиться элементами вашего хранилища с другими пользователями с помощью организации. Хотите посетить сайт bitwarden.com, чтобы узнать больше?"
+ },
+ "moveToOrganization": {
+ "message": "Переместить в организацию"
+ },
+ "share": {
+ "message": "Поделиться"
+ },
+ "movedItemToOrg": {
+ "message": "$ITEMNAME$ перемещен в $ORGNAME$",
+ "placeholders": {
+ "itemname": {
+ "content": "$1",
+ "example": "Secret Item"
+ },
+ "orgname": {
+ "content": "$2",
+ "example": "Company Name"
+ }
+ }
+ },
+ "moveToOrgDesc": {
+ "message": "Выберите организацию, в которую вы хотите переместить этот элемент. При перемещении в организацию право собственности на элемент переходит к этой организации. Вы больше не будете прямым владельцем этого элемента после его перемещения."
+ },
+ "learnMore": {
+ "message": "Подробнее"
+ },
+ "authenticatorKeyTotp": {
+ "message": "Ключ проверки подлинности (TOTP)"
+ },
+ "verificationCodeTotp": {
+ "message": "Код подтверждения (TOTP)"
+ },
+ "copyVerificationCode": {
+ "message": "Скопировать код подтверждения"
+ },
+ "attachments": {
+ "message": "Вложения"
+ },
+ "deleteAttachment": {
+ "message": "Удалить вложение"
+ },
+ "deleteAttachmentConfirmation": {
+ "message": "Вы действительно хотите удалить это вложение?"
+ },
+ "deletedAttachment": {
+ "message": "Вложение удалено"
+ },
+ "newAttachment": {
+ "message": "Добавить новое вложение"
+ },
+ "noAttachments": {
+ "message": "Без вложений."
+ },
+ "attachmentSaved": {
+ "message": "Вложение сохранено."
+ },
+ "file": {
+ "message": "Файл"
+ },
+ "selectFile": {
+ "message": "Выберите файл."
+ },
+ "maxFileSize": {
+ "message": "Максимальный размер файла 500 МБ."
+ },
+ "featureUnavailable": {
+ "message": "Функция недоступна"
+ },
+ "updateKey": {
+ "message": "Вы не можете использовать эту функцию, пока не обновите свой ключ шифрования."
+ },
+ "premiumMembership": {
+ "message": "Премиум"
+ },
+ "premiumManage": {
+ "message": "Управление Премиум"
+ },
+ "premiumManageAlert": {
+ "message": "Вы можете управлять Премиум на bitwarden.com. Перейти на сайт сейчас?"
+ },
+ "premiumRefresh": {
+ "message": "Обновить Премиум"
+ },
+ "premiumNotCurrentMember": {
+ "message": "На текущий момент у вас отсутствует Премиум."
+ },
+ "premiumSignUpAndGet": {
+ "message": "Подпишитесь на Премиум и получите:"
+ },
+ "ppremiumSignUpStorage": {
+ "message": "1 ГБ зашифрованного хранилища для вложенных файлов."
+ },
+ "ppremiumSignUpTwoStep": {
+ "message": "Дополнительные варианты двухфакторной аутентификации, такие как YubiKey, FIDO U2F и Duo."
+ },
+ "ppremiumSignUpReports": {
+ "message": "Гигиена паролей, здоровье аккаунта и отчеты об утечках данных для обеспечения безопасности вашего хранилища."
+ },
+ "ppremiumSignUpTotp": {
+ "message": "TOTP-генератор кодов (2ФА) для логинов в хранилище."
+ },
+ "ppremiumSignUpSupport": {
+ "message": "Приоритетная поддержка."
+ },
+ "ppremiumSignUpFuture": {
+ "message": "Все будущие функции Премиум. Их будет больше!"
+ },
+ "premiumPurchase": {
+ "message": "Купить Премиум"
+ },
+ "premiumPurchaseAlert": {
+ "message": "Вы можете купить Премиум на bitwarden.com. Перейти на сайт сейчас?"
+ },
+ "premiumCurrentMember": {
+ "message": "У вас есть Премиум!"
+ },
+ "premiumCurrentMemberThanks": {
+ "message": "Благодарим вас за поддержку Bitwarden."
+ },
+ "premiumPrice": {
+ "message": "Всего лишь $PRICE$ в год!",
+ "placeholders": {
+ "price": {
+ "content": "$1",
+ "example": "$10"
+ }
+ }
+ },
+ "refreshComplete": {
+ "message": "Обновление завершено"
+ },
+ "disableAutoTotpCopy": {
+ "message": "Отключить автоматическое копирование TOTP"
+ },
+ "disableAutoTotpCopyDesc": {
+ "message": "Если к вашему логину прикреплен ключ проверки подлинности, то код подтверждения TOTP будет скопирован при автозаполнении логина."
+ },
+ "disableAutoBiometricsPrompt": {
+ "message": "Не запрашивать биометрию при запуске"
+ },
+ "premiumRequired": {
+ "message": "Необходим Премиум"
+ },
+ "premiumRequiredDesc": {
+ "message": "Для использования этой функции необходим Премиум."
+ },
+ "enterVerificationCodeApp": {
+ "message": "Введите 6-значный код подтверждения из вашего приложения-аутентификатора."
+ },
+ "enterVerificationCodeEmail": {
+ "message": "Введите 6-значный код подтверждения, который был отправлен на $EMAIL$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "example@gmail.com"
+ }
+ }
+ },
+ "verificationCodeEmailSent": {
+ "message": "Отправлено письмо подтверждения на $EMAIL$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "example@gmail.com"
+ }
+ }
+ },
+ "rememberMe": {
+ "message": "Запомнить меня"
+ },
+ "sendVerificationCodeEmailAgain": {
+ "message": "Отправить код подтверждения еще раз"
+ },
+ "useAnotherTwoStepMethod": {
+ "message": "Использовать другой метод двухфакторной аутентификации"
+ },
+ "insertYubiKey": {
+ "message": "Вставьте свой YubiKey в USB-порт компьютера и нажмите его кнопку."
+ },
+ "insertU2f": {
+ "message": "Вставьте ключ безопасности в USB-порт компьютера. Если у ключа есть кнопка, нажмите ее."
+ },
+ "webAuthnNewTab": {
+ "message": "Продолжить верификацию 2ФА WebAuthn в новой вкладке."
+ },
+ "webAuthnNewTabOpen": {
+ "message": "Открыть новую вкладку"
+ },
+ "webAuthnAuthenticate": {
+ "message": "Аутентификация WebAutn"
+ },
+ "loginUnavailable": {
+ "message": "Вход недоступен"
+ },
+ "noTwoStepProviders": {
+ "message": "У этой учетной записи включена двухфакторная аутентификация, однако ни один из настроенных вариантов не поддерживается этим веб-браузером."
+ },
+ "noTwoStepProviders2": {
+ "message": "Используйте поддерживаемый веб-браузер (например, Chrome) и/или добавьте дополнительные варианты аутентификации, которые поддерживаются в веб-браузерах (например, приложение-аутентификатор)."
+ },
+ "twoStepOptions": {
+ "message": "Настройки двухфакторной аутентификации"
+ },
+ "recoveryCodeDesc": {
+ "message": "Потеряли доступ ко всем вариантам двухфакторной аутентификации? Используйте код восстановления, чтобы отключить двухфакторную аутентификацию для вашей учетной записи."
+ },
+ "recoveryCodeTitle": {
+ "message": "Код восстановления"
+ },
+ "authenticatorAppTitle": {
+ "message": "Приложение-аутентификатор"
+ },
+ "authenticatorAppDesc": {
+ "message": "Используйте приложение-аутентификатор (например, Authy или Google Authenticator) для создания кодов проверки на основе времени.",
+ "description": "'Authy' and 'Google Authenticator' are product names and should not be translated."
+ },
+ "yubiKeyTitle": {
+ "message": "Ключ безопасности YubiKey OTP"
+ },
+ "yubiKeyDesc": {
+ "message": "Используйте YubiKey для доступа к вашей учетной записи. Работает с устройствами YubiKey 4 серии, 5 серии и NEO."
+ },
+ "duoDesc": {
+ "message": "Проверьте с помощью Duo Security, используя приложение Duo Mobile, SMS, телефонный звонок или ключ безопасности U2F.",
+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
+ },
+ "duoOrganizationDesc": {
+ "message": "Подтвердите при помощи Duo Security для вашей организации, используя приложение Duo Mobile, SMS, телефонный звонок или ключ безопасности U2F.",
+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
+ },
+ "webAuthnTitle": {
+ "message": "FIDO2 WebAuthn"
+ },
+ "webAuthnDesc": {
+ "message": "Используйте любой ключ безопасности с поддержкой WebAuthn для доступа к своей учетной записи."
+ },
+ "emailTitle": {
+ "message": "Email"
+ },
+ "emailDesc": {
+ "message": "Коды подтверждения будут отправлены вам по электронной почте."
+ },
+ "selfHostedEnvironment": {
+ "message": "Среда собственного хостинга"
+ },
+ "selfHostedEnvironmentFooter": {
+ "message": "Укажите URL-адрес Bitwarden на вашем сервере."
+ },
+ "customEnvironment": {
+ "message": "Пользовательское окружение"
+ },
+ "customEnvironmentFooter": {
+ "message": "Для опытных пользователей. Можно указать URL отдельно для каждой службы."
+ },
+ "baseUrl": {
+ "message": "URL-адрес сервера"
+ },
+ "apiUrl": {
+ "message": "API URL-адреса сервера"
+ },
+ "webVaultUrl": {
+ "message": "URL-адрес сервера веб-хранилища"
+ },
+ "identityUrl": {
+ "message": "URL-адрес сервера идентификации"
+ },
+ "notificationsUrl": {
+ "message": "URL-адрес сервера уведомлений"
+ },
+ "iconsUrl": {
+ "message": "URL-адрес сервера значков"
+ },
+ "environmentSaved": {
+ "message": "URL-адреса среды сохранены."
+ },
+ "enableAutoFillOnPageLoad": {
+ "message": "Включить автозаполнение при загрузке страницы"
+ },
+ "enableAutoFillOnPageLoadDesc": {
+ "message": "При обнаружении формы входа выполняется автозаполнение во время загрузки веб-страницы."
+ },
+ "experimentalFeature": {
+ "message": "Это экспериментальная функция. Используйте на свой страх и риск."
+ },
+ "defaultAutoFillOnPageLoad": {
+ "message": "Настройка автозаполнения по умолчанию для логинов"
+ },
+ "defaultAutoFillOnPageLoadDesc": {
+ "message": "После включения автозаполнения при загрузке страницы вы можете включить или отключить эту функцию для отдельных логинов. Это настройка по умолчанию для логинов, которые не были настроены отдельно."
+ },
+ "itemAutoFillOnPageLoad": {
+ "message": "Автозаполнение при загрузке страницы (если включено в настройках)"
+ },
+ "autoFillOnPageLoadUseDefault": {
+ "message": "Использовать настройки по умолчанию"
+ },
+ "autoFillOnPageLoadYes": {
+ "message": "Автозаполнение при загрузке страницы"
+ },
+ "autoFillOnPageLoadNo": {
+ "message": "Не заполнять автоматически при загрузке страницы"
+ },
+ "commandOpenPopup": {
+ "message": "Открыть хранилище во всплывающем окне"
+ },
+ "commandOpenSidebar": {
+ "message": "Открыть хранилище в боковой панели"
+ },
+ "commandAutofillDesc": {
+ "message": "Автозаполнение последнего использованного логина для текущего веб-сайта."
+ },
+ "commandGeneratePasswordDesc": {
+ "message": "Сгенерировать и скопировать новый случайный пароль в буфер обмена."
+ },
+ "commandLockVaultDesc": {
+ "message": "Заблокировать хранилище"
+ },
+ "privateModeMessage": {
+ "message": "К сожалению, это окно недоступно в приватном режиме этого браузера."
+ },
+ "customFields": {
+ "message": "Пользовательские поля"
+ },
+ "copyValue": {
+ "message": "Скопировать значение"
+ },
+ "value": {
+ "message": "Значение"
+ },
+ "newCustomField": {
+ "message": "Новое пользовательское поле"
+ },
+ "dragToSort": {
+ "message": "Перетащите для сортировки"
+ },
+ "cfTypeText": {
+ "message": "Текстовое"
+ },
+ "cfTypeHidden": {
+ "message": "Скрытое"
+ },
+ "cfTypeBoolean": {
+ "message": "Логическое"
+ },
+ "popup2faCloseMessage": {
+ "message": "Щелчок за пределами этого окна для просмотра кода проверки из электронной почты приведет к его закрытию. Открыть bitwarden в новом окне?"
+ },
+ "popupU2fCloseMessage": {
+ "message": "Этот браузер не может обрабатывать запросы U2F в этом всплывающем окне. Вы хотите открыть это всплывающее окно в новом окне, чтобы иметь возможность войти в систему, используя U2F?"
+ },
+ "disableFavicon": {
+ "message": "Отключить значки веб-сайтов"
+ },
+ "disableFaviconDesc": {
+ "message": "Значки веб-сайтов отображаются рядом с каждым элементом в вашем хранилище."
+ },
+ "disableBadgeCounter": {
+ "message": "Отключить счетчик значка"
+ },
+ "disableBadgeCounterDesc": {
+ "message": "Счетчик значка показывает, сколько в вашем хранилище логинов для текущей страницы."
+ },
+ "cardholderName": {
+ "message": "Имя владельца карты"
+ },
+ "number": {
+ "message": "Номер"
+ },
+ "brand": {
+ "message": "Тип карты"
+ },
+ "expirationMonth": {
+ "message": "Месяц"
+ },
+ "expirationYear": {
+ "message": "Год"
+ },
+ "expiration": {
+ "message": "Срок действия"
+ },
+ "january": {
+ "message": "Январь"
+ },
+ "february": {
+ "message": "Февраль"
+ },
+ "march": {
+ "message": "Март"
+ },
+ "april": {
+ "message": "Апрель"
+ },
+ "may": {
+ "message": "Май"
+ },
+ "june": {
+ "message": "Июнь"
+ },
+ "july": {
+ "message": "Июль"
+ },
+ "august": {
+ "message": "Август"
+ },
+ "september": {
+ "message": "Сентябрь"
+ },
+ "october": {
+ "message": "Октябрь"
+ },
+ "november": {
+ "message": "Ноябрь"
+ },
+ "december": {
+ "message": "Декабрь"
+ },
+ "securityCode": {
+ "message": "Код безопасности"
+ },
+ "ex": {
+ "message": "напр."
+ },
+ "title": {
+ "message": "Обращение"
+ },
+ "mr": {
+ "message": "Г-н"
+ },
+ "mrs": {
+ "message": "Г-жа"
+ },
+ "ms": {
+ "message": "Проф."
+ },
+ "dr": {
+ "message": "Тов."
+ },
+ "firstName": {
+ "message": "Имя"
+ },
+ "middleName": {
+ "message": "Отчество"
+ },
+ "lastName": {
+ "message": "Фамилия"
+ },
+ "identityName": {
+ "message": "Имя"
+ },
+ "company": {
+ "message": "Компания"
+ },
+ "ssn": {
+ "message": "Номер социального страхования"
+ },
+ "passportNumber": {
+ "message": "Номер паспорта"
+ },
+ "licenseNumber": {
+ "message": "ИНН"
+ },
+ "email": {
+ "message": "Email"
+ },
+ "phone": {
+ "message": "Телефон"
+ },
+ "address": {
+ "message": "Адрес"
+ },
+ "address1": {
+ "message": "Строка адреса 1"
+ },
+ "address2": {
+ "message": "Строка адреса 2"
+ },
+ "address3": {
+ "message": "Строка адреса 3"
+ },
+ "cityTown": {
+ "message": "Город/Поселок"
+ },
+ "stateProvince": {
+ "message": "Регион / Область"
+ },
+ "zipPostalCode": {
+ "message": "Почтовый индекс"
+ },
+ "country": {
+ "message": "Страна"
+ },
+ "type": {
+ "message": "Тип"
+ },
+ "typeLogin": {
+ "message": "Логин"
+ },
+ "typeLogins": {
+ "message": "Логины"
+ },
+ "typeSecureNote": {
+ "message": "Защищенная заметка"
+ },
+ "typeCard": {
+ "message": "Карта"
+ },
+ "typeIdentity": {
+ "message": "Личная информация"
+ },
+ "passwordHistory": {
+ "message": "История паролей"
+ },
+ "back": {
+ "message": "Назад"
+ },
+ "collections": {
+ "message": "Коллекции"
+ },
+ "favorites": {
+ "message": "Избранные"
+ },
+ "popOutNewWindow": {
+ "message": "Перейти в новое окно"
+ },
+ "refresh": {
+ "message": "Обновить"
+ },
+ "cards": {
+ "message": "Карты"
+ },
+ "identities": {
+ "message": "Личные данные"
+ },
+ "logins": {
+ "message": "Логины"
+ },
+ "secureNotes": {
+ "message": "Защищенные заметки"
+ },
+ "clear": {
+ "message": "Очистить",
+ "description": "To clear something out. example: To clear browser history."
+ },
+ "checkPassword": {
+ "message": "Проверьте, не скомпрометирован ли пароль."
+ },
+ "passwordExposed": {
+ "message": "Этот пароль был скомпрометирован $VALUE$ раз(а). Вам следует его изменить.",
+ "placeholders": {
+ "value": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "passwordSafe": {
+ "message": "Этот пароль не обнаружен в известных базах утечек. Можно продолжать его использовать."
+ },
+ "baseDomain": {
+ "message": "Основной домен"
+ },
+ "host": {
+ "message": "Хост",
+ "description": "A URL's host value. For example, the host of https://sub.domain.com:443 is 'sub.domain.com:443'."
+ },
+ "exact": {
+ "message": "Точно"
+ },
+ "startsWith": {
+ "message": "Начинается с"
+ },
+ "regEx": {
+ "message": "Регулярное выражение",
+ "description": "A programming term, also known as 'RegEx'."
+ },
+ "matchDetection": {
+ "message": "Обнаружение совпадений",
+ "description": "URI match detection for auto-fill."
+ },
+ "defaultMatchDetection": {
+ "message": "Метод обнаружения по умолчанию",
+ "description": "Default URI match detection for auto-fill."
+ },
+ "toggleOptions": {
+ "message": "Переключить настройки"
+ },
+ "toggleCurrentUris": {
+ "message": "Переключить текущий URI",
+ "description": "Toggle the display of the URIs of the currently open tabs in the browser."
+ },
+ "currentUri": {
+ "message": "Текущий URI",
+ "description": "The URI of one of the current open tabs in the browser."
+ },
+ "organization": {
+ "message": "Организация",
+ "description": "An entity of multiple related people (ex. a team or business organization)."
+ },
+ "types": {
+ "message": "Типы элементов"
+ },
+ "allItems": {
+ "message": "Все элементы"
+ },
+ "noPasswordsInList": {
+ "message": "Нет паролей для отображения."
+ },
+ "remove": {
+ "message": "Удалить"
+ },
+ "default": {
+ "message": "По умолчанию"
+ },
+ "dateUpdated": {
+ "message": "Обновлено",
+ "description": "ex. Date this item was updated"
+ },
+ "datePasswordUpdated": {
+ "message": "Пароль обновлен",
+ "description": "ex. Date this password was updated"
+ },
+ "neverLockWarning": {
+ "message": "Вы действительно хотите отключить блокировку хранилища? В этом случае ключ шифрования вашего хранилища будет сохранен на вашем устройстве. Отключая блокировку, вы должны убедиться, что ваше устройство надежно защищено."
+ },
+ "noOrganizationsList": {
+ "message": "Вы не являетесь членом какой-либо организации. Организации позволяют безопасно обмениваться элементами с другими пользователями."
+ },
+ "noCollectionsInList": {
+ "message": "Нет коллекций для отображения."
+ },
+ "ownership": {
+ "message": "Владелец"
+ },
+ "whoOwnsThisItem": {
+ "message": "Кому принадлежит этот элемент?"
+ },
+ "strong": {
+ "message": "Сильный",
+ "description": "ex. A strong password. Scale: Weak -> Good -> Strong"
+ },
+ "good": {
+ "message": "Хороший",
+ "description": "ex. A good password. Scale: Weak -> Good -> Strong"
+ },
+ "weak": {
+ "message": "Слабый",
+ "description": "ex. A weak password. Scale: Weak -> Good -> Strong"
+ },
+ "weakMasterPassword": {
+ "message": "Слабый мастер-пароль"
+ },
+ "weakMasterPasswordDesc": {
+ "message": "Вы выбрали слабый мастер-пароль. Для надежной защиты аккаунта Bitwarden следует использовать сильный мастер-пароль (или парольную фразу). Вы действительно хотите использовать этот мастер-пароль?"
+ },
+ "pin": {
+ "message": "PIN-код",
+ "description": "PIN code. Ex. The short code (often numeric) that you use to unlock a device."
+ },
+ "unlockWithPin": {
+ "message": "Разблокировать с помощью PIN-кода"
+ },
+ "setYourPinCode": {
+ "message": "Установите PIN-код для разблокировки Bitwarden. Настройки PIN-кода будут сброшены, если вы когда-либо полностью выйдете из приложения."
+ },
+ "pinRequired": {
+ "message": "Необходим PIN-код."
+ },
+ "invalidPin": {
+ "message": "Неверный PIN-код."
+ },
+ "verifyPin": {
+ "message": "Подтвердить PIN-код"
+ },
+ "yourVaultIsLockedPinCode": {
+ "message": "Ваше хранилище заблокировано. Для продолжения введите PIN-код."
+ },
+ "unlockWithBiometrics": {
+ "message": "Разблокировать с помощью биометрии"
+ },
+ "awaitDesktop": {
+ "message": "Ожидание подтверждения с компьютера"
+ },
+ "awaitDesktopDesc": {
+ "message": "Для включения биометрии в браузере, подтвердите это в приложении Bitwarden для компьютера."
+ },
+ "lockWithMasterPassOnRestart": {
+ "message": "Блокировать мастер-паролем при перезапуске браузера"
+ },
+ "selectOneCollection": {
+ "message": "Необходимо выбрать хотя бы одну коллекцию."
+ },
+ "cloneItem": {
+ "message": "Клонировать элемент"
+ },
+ "clone": {
+ "message": "Клонировать"
+ },
+ "passwordGeneratorPolicyInEffect": {
+ "message": "На настройки генератора влияют одна или несколько политик организации."
+ },
+ "vaultTimeoutAction": {
+ "message": "Действие по тайм-ауту хранилища"
+ },
+ "lock": {
+ "message": "Заблокировать",
+ "description": "Verb form: to make secure or inaccesible by"
+ },
+ "trash": {
+ "message": "Корзина",
+ "description": "Noun: a special folder to hold deleted items"
+ },
+ "searchTrash": {
+ "message": "Поиск в корзине"
+ },
+ "permanentlyDeleteItem": {
+ "message": "Окончательно удалить элемент"
+ },
+ "permanentlyDeleteItemConfirmation": {
+ "message": "Вы уверены, что хотите окончательно удалить этот элемент?"
+ },
+ "permanentlyDeletedItem": {
+ "message": "Элемент удален навсегда"
+ },
+ "restoreItem": {
+ "message": "Восстановить элемент"
+ },
+ "restoreItemConfirmation": {
+ "message": "Вы уверены, что хотите восстановить этот элемент?"
+ },
+ "restoredItem": {
+ "message": "Элемент восстановлен"
+ },
+ "vaultTimeoutLogOutConfirmation": {
+ "message": "По истечении тайм-аута будет выполнен выход, что приведет к отмене всех прав доступа к вашему хранилищу и потребует онлайн-аутентификации. Вы уверены, что хотите использовать этот параметр?"
+ },
+ "vaultTimeoutLogOutConfirmationTitle": {
+ "message": "Подтверждение действия по тайм-ауту"
+ },
+ "autoFillAndSave": {
+ "message": "Заполнить и сохранить"
+ },
+ "autoFillSuccessAndSavedUri": {
+ "message": "Автозаполненный элемент и сохраненный URI"
+ },
+ "autoFillSuccess": {
+ "message": "Автозаполненный элемент"
+ },
+ "setMasterPassword": {
+ "message": "Задать мастер-пароль"
+ },
+ "masterPasswordPolicyInEffect": {
+ "message": "Согласно одной или нескольким политикам организации необходимо, чтобы ваш мастер-пароль отвечал следующим требованиям:"
+ },
+ "policyInEffectMinComplexity": {
+ "message": "Минимальный уровень сложности $SCORE$",
+ "placeholders": {
+ "score": {
+ "content": "$1",
+ "example": "4"
+ }
+ }
+ },
+ "policyInEffectMinLength": {
+ "message": "Минимальная длина $LENGTH$",
+ "placeholders": {
+ "length": {
+ "content": "$1",
+ "example": "14"
+ }
+ }
+ },
+ "policyInEffectUppercase": {
+ "message": "Содержать хотя бы одну заглавную букву"
+ },
+ "policyInEffectLowercase": {
+ "message": "Содержать хотя бы одну строчную букву"
+ },
+ "policyInEffectNumbers": {
+ "message": "Содержать хотя бы одну цифру"
+ },
+ "policyInEffectSpecial": {
+ "message": "Содержать хотя бы один из следующих специальных символов $CHARS$",
+ "placeholders": {
+ "chars": {
+ "content": "$1",
+ "example": "!@#$%^&*"
+ }
+ }
+ },
+ "masterPasswordPolicyRequirementsNotMet": {
+ "message": "Ваш новый мастер-пароль не соответствует требованиям политики."
+ },
+ "acceptPolicies": {
+ "message": "Отметив этот флажок, вы соглашаетесь со следующим:"
+ },
+ "acceptPoliciesError": {
+ "message": "Условия предоставления услуг и Политика конфиденциальности не были подтверждены."
+ },
+ "termsOfService": {
+ "message": "Условия предоставления услуг"
+ },
+ "privacyPolicy": {
+ "message": "Политика конфиденциальности"
+ },
+ "hintEqualsPassword": {
+ "message": "Подсказка для пароля не может совпадать с паролем."
+ },
+ "ok": {
+ "message": "Ok"
+ },
+ "desktopSyncVerificationTitle": {
+ "message": "Проверка синхронизации на компьютере"
+ },
+ "desktopIntegrationVerificationText": {
+ "message": "Пожалуйста, убедитесь, что приложение для компьютера отображает этот отпечаток: "
+ },
+ "desktopIntegrationDisabledTitle": {
+ "message": "Интеграция с браузером не включена"
+ },
+ "desktopIntegrationDisabledDesc": {
+ "message": "Пожалуйста, включите интеграцию с браузером в настройках приложения Bitwarden для компьютера."
+ },
+ "startDesktopTitle": {
+ "message": "Запустить приложение Bitwarden для компьютера"
+ },
+ "startDesktopDesc": {
+ "message": "Перед использованием этой функции необходимо запустить приложение Bitwarden для компьютера."
+ },
+ "errorEnableBiometricTitle": {
+ "message": "Не удается включить биометрию"
+ },
+ "errorEnableBiometricDesc": {
+ "message": "Действие было отменено приложением для компьютера"
+ },
+ "nativeMessagingInvalidEncryptionDesc": {
+ "message": "Приложению для компьютера не удалось создать защищенный канал подключения. Пожалуйста, попробуйте еще раз"
+ },
+ "nativeMessagingInvalidEncryptionTitle": {
+ "message": "Соединение с приложением для компьютера прервано"
+ },
+ "nativeMessagingWrongUserDesc": {
+ "message": "Приложение для компьютера авторизовано под другим аккаунтом. Необходимо чтобы оба приложения были авторизованы под одной учетной записью."
+ },
+ "nativeMessagingWrongUserTitle": {
+ "message": "Несоответствие аккаунта"
+ },
+ "biometricsNotEnabledTitle": {
+ "message": "Биометрия не включена"
+ },
+ "biometricsNotEnabledDesc": {
+ "message": "Для активации биометрии в браузере сначала необходимо включить биометрию в приложении для компьютера."
+ },
+ "biometricsNotSupportedTitle": {
+ "message": "Биометрия не поддерживается"
+ },
+ "biometricsNotSupportedDesc": {
+ "message": "Биометрия в браузере не поддерживается этом устройстве."
+ },
+ "nativeMessaginPermissionErrorTitle": {
+ "message": "Разрешение не представлено"
+ },
+ "nativeMessaginPermissionErrorDesc": {
+ "message": "Без разрешения на взаимодействие с Bitwarden для компьютера биометрия в расширении браузера работать не сможет. Попробуйте еще раз."
+ },
+ "nativeMessaginPermissionSidebarTitle": {
+ "message": "Ошибка при запросе разрешения"
+ },
+ "nativeMessaginPermissionSidebarDesc": {
+ "message": "Это действие невозможно выполнить в боковой панели. Попробуйте снова в всплывающем или отдельном окне."
+ },
+ "personalOwnershipSubmitError": {
+ "message": "В соответствии с корпоративной политикой вам запрещено сохранять элементы в личном хранилище. Измените владельца на организацию и выберите из доступных Коллекций."
+ },
+ "personalOwnershipPolicyInEffect": {
+ "message": "Политика организации влияет на ваши варианты владения."
+ },
+ "excludedDomains": {
+ "message": "Исключенные домены"
+ },
+ "excludedDomainsDesc": {
+ "message": "Bitwarden не будет предлагать сохранить логины для этих доменов. Для вступления изменений в силу необходимо обновить страницу."
+ },
+ "excludedDomainsInvalidDomain": {
+ "message": "$DOMAIN$ – некорректно указанный домен",
+ "placeholders": {
+ "domain": {
+ "content": "$1",
+ "example": "googlecom"
+ }
+ }
+ },
+ "send": {
+ "message": "Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "searchSends": {
+ "message": "Поиск Send’ов",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "addSend": {
+ "message": "Добавить Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTypeText": {
+ "message": "Текст"
+ },
+ "sendTypeFile": {
+ "message": "Файл"
+ },
+ "allSends": {
+ "message": "Все Send’ы",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "maxAccessCountReached": {
+ "message": "Достигнут максимум обращений"
+ },
+ "expired": {
+ "message": "Срок истек"
+ },
+ "pendingDeletion": {
+ "message": "Ожидание удаления"
+ },
+ "passwordProtected": {
+ "message": "Защищено паролем"
+ },
+ "copySendLink": {
+ "message": "Скопировать ссылку на Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "removePassword": {
+ "message": "Удалить пароль"
+ },
+ "delete": {
+ "message": "Удалить"
+ },
+ "removedPassword": {
+ "message": "Пароль удален"
+ },
+ "deletedSend": {
+ "message": "Удаленная Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendLink": {
+ "message": "Ссылка на Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "disabled": {
+ "message": "Отключено"
+ },
+ "removePasswordConfirmation": {
+ "message": "Вы уверены, что хотите удалить пароль?"
+ },
+ "deleteSend": {
+ "message": "Удалить Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "deleteSendConfirmation": {
+ "message": "Вы действительно хотите удалить эту Send?",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "editSend": {
+ "message": "Изменить Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTypeHeader": {
+ "message": "Выберите тип Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendNameDesc": {
+ "message": "Понятное имя для описания этой Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendFileDesc": {
+ "message": "Файл, который вы хотите отправить."
+ },
+ "deletionDate": {
+ "message": "Срок удаления"
+ },
+ "deletionDateDesc": {
+ "message": "Эта Send будет окончательно удалена в указанные дату и время.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "expirationDate": {
+ "message": "Срок истечения"
+ },
+ "expirationDateDesc": {
+ "message": "Если задано, доступ к этой Send истечет в указанные дату и время.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "oneDay": {
+ "message": "1 день"
+ },
+ "days": {
+ "message": "$DAYS$ дн.",
+ "placeholders": {
+ "days": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "custom": {
+ "message": "Пользовательский"
+ },
+ "maximumAccessCount": {
+ "message": "Максимум обращений"
+ },
+ "maximumAccessCountDesc": {
+ "message": "Если задано, пользователи больше не смогут получить доступ к этой Send, как только будет достигнуто максимальное количество обращений.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendPasswordDesc": {
+ "message": "По возможности запрашивать у пользователей пароль для доступа к этой Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendNotesDesc": {
+ "message": "Личные заметки об этой Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendDisableDesc": {
+ "message": "Отключить эту Send, чтобы никто не мог получить к ней доступ.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendShareDesc": {
+ "message": "Скопировать ссылку на эту Send в буфер обмена после сохранения.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTextDesc": {
+ "message": "Текст, который вы хотите отправить."
+ },
+ "sendHideText": {
+ "message": "Скрыть текст этой Send по умолчанию.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "currentAccessCount": {
+ "message": "Текущих обращений"
+ },
+ "createSend": {
+ "message": "Создание новой Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "newPassword": {
+ "message": "Новый пароль"
+ },
+ "sendDisabled": {
+ "message": "Send отключена",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendDisabledWarning": {
+ "message": "В соответствии с корпоративной политикой вы можете удалить только существующую Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "createdSend": {
+ "message": "Созданная Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "editedSend": {
+ "message": "Измененная Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendLinuxChromiumFileWarning": {
+ "message": "Для выбора файла откройте расширение в боковой панели (если возможно) или перейдите в новое окно, нажав на этот баннер."
+ },
+ "sendFirefoxFileWarning": {
+ "message": "Для выбора файла с помощью Firefox, откройте расширение в боковой панели или перейдите в новое окно, нажав на этот баннер."
+ },
+ "sendSafariFileWarning": {
+ "message": "Для выбора файла с помощью Safari, перейдите в новое окно, нажав на этот баннер."
+ },
+ "sendFileCalloutHeader": {
+ "message": "Перед тем, как начать"
+ },
+ "sendFirefoxCustomDatePopoutMessage1": {
+ "message": "Для использования календарного стиля выбора даты,",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read '**To use a calendar style date picker ** click here to pop out your window.'"
+ },
+ "sendFirefoxCustomDatePopoutMessage2": {
+ "message": "нажмите здесь",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker **click here** to pop out your window.'"
+ },
+ "sendFirefoxCustomDatePopoutMessage3": {
+ "message": "для открытия в новом окне.",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker click here **to pop out your window.**'"
+ },
+ "expirationDateIsInvalid": {
+ "message": "Срок истечения указан некорректно."
+ },
+ "deletionDateIsInvalid": {
+ "message": "Срок удаления указан некорректно."
+ },
+ "expirationDateAndTimeRequired": {
+ "message": "Необходимо указать дату и время срока истечения."
+ },
+ "deletionDateAndTimeRequired": {
+ "message": "Необходимо указать дату и время срока удаления."
+ },
+ "dateParsingError": {
+ "message": "Произошла ошибка при сохранении данных о сроках удаления и истечения."
+ },
+ "hideEmail": {
+ "message": "Скрыть мой адрес email от получателей."
+ },
+ "sendOptionsPolicyInEffect": {
+ "message": "На параметры Send влияют одна или несколько политик организации."
+ },
+ "passwordPrompt": {
+ "message": "Повторный запрос мастер-пароля"
+ },
+ "passwordConfirmation": {
+ "message": "Подтверждение мастер-пароля"
+ },
+ "passwordConfirmationDesc": {
+ "message": "Это действие защищено. Для продолжения введите свой мастер-пароль, чтобы подтвердить свою личность."
+ },
+ "emailVerificationRequired": {
+ "message": "Требуется подтверждение электронной почты"
+ },
+ "emailVerificationRequiredDesc": {
+ "message": "Для использования этой функции необходимо подтвердить ваш email. Вы можете это сделать в веб-хранилище."
+ },
+ "updatedMasterPassword": {
+ "message": "Мастер-пароль обновлен"
+ },
+ "updateMasterPassword": {
+ "message": "Обновить мастер-пароль"
+ },
+ "updateMasterPasswordWarning": {
+ "message": "Мастер-пароль недавно был изменен администратором вашей организации. Чтобы получить доступ к хранилищу, вы должны обновить его сейчас. В результате текущая сессия будет завершена, потребуется повторный вход. Активные сессии на других устройствах могут оставаться активными в течение одного часа."
+ },
+ "resetPasswordPolicyAutoEnroll": {
+ "message": "Автоматическая регистрация"
+ },
+ "resetPasswordAutoEnrollInviteWarning": {
+ "message": "В этой организации действует корпоративная политика, которая автоматически зарегистрирует вас на сброс пароля. Регистрация позволит администраторам организации изменить ваш мастер-пароль."
+ },
+ "selectFolder": {
+ "message": "Выберите папку..."
+ },
+ "ssoCompleteRegistration": {
+ "message": "Для завершения процесса авторизации при помощи SSO, установите мастер-пароль для доступа к вашему хранилищу и его защиты."
+ },
+ "hours": {
+ "message": "Час."
+ },
+ "minutes": {
+ "message": "Мин."
+ },
+ "vaultTimeoutPolicyInEffect": {
+ "message": "Политики вашей организации влияют на тайм-аут хранилища. Максимально допустимый тайм-аут хранилища составляет $HOURS$ час. и $MINUTES$ мин.",
+ "placeholders": {
+ "hours": {
+ "content": "$1",
+ "example": "5"
+ },
+ "minutes": {
+ "content": "$2",
+ "example": "5"
+ }
+ }
+ },
+ "vaultTimeoutToLarge": {
+ "message": "Время ожидания превышает ограничения, установленные вашей организацией."
+ },
+ "vaultExportDisabled": {
+ "message": "Экспорт хранилища отключен"
+ },
+ "personalVaultExportPolicyInEffect": {
+ "message": "Экспорт вашего личного хранилища запрещен одной или несколькими политиками организации."
+ },
+ "copyCustomFieldNameInvalidElement": {
+ "message": "Невозможно определить элемент формы. Попробуйте вместо этого проверить HTML."
+ },
+ "copyCustomFieldNameNotUnique": {
+ "message": "Уникальный идентификатор не найден."
+ }
+}
diff --git a/src/iOS.Safari/Resources/_locales/si/messages.json b/src/iOS.Safari/Resources/_locales/si/messages.json
new file mode 100644
index 000000000..b789731e7
--- /dev/null
+++ b/src/iOS.Safari/Resources/_locales/si/messages.json
@@ -0,0 +1,1817 @@
+{
+ "appName": {
+ "message": "බිට්වාඩන්"
+ },
+ "extName": {
+ "message": "Bitwarden - Free Password Manager",
+ "description": "Extension name, MUST be less than 40 characters (Safari restriction)"
+ },
+ "extDesc": {
+ "message": "A secure and free password manager for all of your devices.",
+ "description": "Extension description"
+ },
+ "loginOrCreateNewAccount": {
+ "message": "Log in or create a new account to access your secure vault."
+ },
+ "createAccount": {
+ "message": "ගිණුමක් නිර්මාණය කරන්න"
+ },
+ "login": {
+ "message": "පිවිසෙන්න"
+ },
+ "enterpriseSingleSignOn": {
+ "message": "Enterprise Single Sign-On"
+ },
+ "cancel": {
+ "message": "අවලංගු කරන්න"
+ },
+ "close": {
+ "message": "වසන්න"
+ },
+ "submit": {
+ "message": "Submit"
+ },
+ "emailAddress": {
+ "message": "වි-තැපැල් ලිපිනය"
+ },
+ "masterPass": {
+ "message": "Master Password"
+ },
+ "masterPassDesc": {
+ "message": "The master password is the password you use to access your vault. It is very important that you do not forget your master password. There is no way to recover the password in the event that you forget it."
+ },
+ "masterPassHintDesc": {
+ "message": "A master password hint can help you remember your password if you forget it."
+ },
+ "reTypeMasterPass": {
+ "message": "Re-type Master Password"
+ },
+ "masterPassHint": {
+ "message": "Master Password Hint (optional)"
+ },
+ "tab": {
+ "message": "Tab"
+ },
+ "myVault": {
+ "message": "My Vault"
+ },
+ "tools": {
+ "message": "මෙවලම්"
+ },
+ "settings": {
+ "message": "සැකසුම්"
+ },
+ "currentTab": {
+ "message": "Current Tab"
+ },
+ "copyPassword": {
+ "message": "මුරපදය පිටපත් කරන්න"
+ },
+ "copyNote": {
+ "message": "සටහන පිටපත් කරන්න"
+ },
+ "copyUri": {
+ "message": "Copy URI"
+ },
+ "copyUsername": {
+ "message": "පරිශීලකනාමය පිටපත් කරන්න"
+ },
+ "copyNumber": {
+ "message": "අංකය පිටපත් කරන්න"
+ },
+ "copySecurityCode": {
+ "message": "ආරක්ෂක කේතය පිටපත් කරන්න"
+ },
+ "autoFill": {
+ "message": "ස්වයං-පිරවීම"
+ },
+ "generatePasswordCopied": {
+ "message": "Generate Password (copied)"
+ },
+ "copyElementIdentifier": {
+ "message": "Copy Custom Field Name"
+ },
+ "noMatchingLogins": {
+ "message": "No matching logins."
+ },
+ "vaultLocked": {
+ "message": "Vault is locked."
+ },
+ "vaultLoggedOut": {
+ "message": "Vault is logged out."
+ },
+ "autoFillInfo": {
+ "message": "There are no logins available to auto-fill for the current browser tab."
+ },
+ "addLogin": {
+ "message": "පිවිසුමක් එකතු කරන්න"
+ },
+ "addItem": {
+ "message": "Add Item"
+ },
+ "passwordHint": {
+ "message": "Password Hint"
+ },
+ "enterEmailToGetHint": {
+ "message": "Enter your account email address to receive your master password hint."
+ },
+ "getMasterPasswordHint": {
+ "message": "Get master password hint"
+ },
+ "continue": {
+ "message": "ඉදිරියට"
+ },
+ "verificationCode": {
+ "message": "Verification Code"
+ },
+ "account": {
+ "message": "ගිණුම"
+ },
+ "changeMasterPassword": {
+ "message": "Change Master Password"
+ },
+ "fingerprintPhrase": {
+ "message": "Fingerprint Phrase",
+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
+ },
+ "yourAccountsFingerprint": {
+ "message": "Your account's fingerprint phrase",
+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
+ },
+ "twoStepLogin": {
+ "message": "Two-step Login"
+ },
+ "logOut": {
+ "message": "නික්මෙන්න"
+ },
+ "about": {
+ "message": "පිලිබඳව"
+ },
+ "version": {
+ "message": "අනුවාදය"
+ },
+ "save": {
+ "message": "සුරකින්න"
+ },
+ "move": {
+ "message": "Move"
+ },
+ "addFolder": {
+ "message": "බහාලුම එකතු කරන්න"
+ },
+ "name": {
+ "message": "නම"
+ },
+ "editFolder": {
+ "message": "Edit Folder"
+ },
+ "deleteFolder": {
+ "message": "Delete Folder"
+ },
+ "folders": {
+ "message": "බහාලුම්"
+ },
+ "noFolders": {
+ "message": "There are no folders to list."
+ },
+ "helpFeedback": {
+ "message": "Help & Feedback"
+ },
+ "sync": {
+ "message": "Sync"
+ },
+ "syncVaultNow": {
+ "message": "Sync Vault Now"
+ },
+ "lastSync": {
+ "message": "Last Sync:"
+ },
+ "passGen": {
+ "message": "Password Generator"
+ },
+ "generator": {
+ "message": "Generator",
+ "description": "Short for 'Password Generator'."
+ },
+ "passGenInfo": {
+ "message": "Automatically generate strong, unique passwords for your logins."
+ },
+ "bitWebVault": {
+ "message": "Bitwarden Web Vault"
+ },
+ "importItems": {
+ "message": "Import Items"
+ },
+ "select": {
+ "message": "Select"
+ },
+ "generatePassword": {
+ "message": "Generate Password"
+ },
+ "regeneratePassword": {
+ "message": "Regenerate Password"
+ },
+ "options": {
+ "message": "Options"
+ },
+ "length": {
+ "message": "Length"
+ },
+ "numWords": {
+ "message": "Number of Words"
+ },
+ "wordSeparator": {
+ "message": "Word Separator"
+ },
+ "capitalize": {
+ "message": "Capitalize",
+ "description": "Make the first letter of a work uppercase."
+ },
+ "includeNumber": {
+ "message": "Include Number"
+ },
+ "minNumbers": {
+ "message": "Minimum Numbers"
+ },
+ "minSpecial": {
+ "message": "Minimum Special"
+ },
+ "avoidAmbChar": {
+ "message": "Avoid Ambiguous Characters"
+ },
+ "searchVault": {
+ "message": "Search vault"
+ },
+ "edit": {
+ "message": "සංස්කරණය"
+ },
+ "view": {
+ "message": "View"
+ },
+ "noItemsInList": {
+ "message": "There are no items to list."
+ },
+ "itemInformation": {
+ "message": "Item Information"
+ },
+ "username": {
+ "message": "පරිශීලක නාමය"
+ },
+ "password": {
+ "message": "මුරපදය"
+ },
+ "passphrase": {
+ "message": "Passphrase"
+ },
+ "favorite": {
+ "message": "ප්රියතමය"
+ },
+ "notes": {
+ "message": "සටහන්"
+ },
+ "note": {
+ "message": "සටහන"
+ },
+ "editItem": {
+ "message": "Edit Item"
+ },
+ "folder": {
+ "message": "බහාලුම"
+ },
+ "deleteItem": {
+ "message": "Delete Item"
+ },
+ "viewItem": {
+ "message": "View Item"
+ },
+ "launch": {
+ "message": "දියත්කරන්න"
+ },
+ "website": {
+ "message": "වියමන අඩවිය"
+ },
+ "toggleVisibility": {
+ "message": "Toggle Visibility"
+ },
+ "manage": {
+ "message": "Manage"
+ },
+ "other": {
+ "message": "වෙනත්"
+ },
+ "rateExtension": {
+ "message": "Rate the Extension"
+ },
+ "rateExtensionDesc": {
+ "message": "Please consider helping us out with a good review!"
+ },
+ "browserNotSupportClipboard": {
+ "message": "Your web browser does not support easy clipboard copying. Copy it manually instead."
+ },
+ "verifyMasterPassword": {
+ "message": "Verify Master Password"
+ },
+ "yourVaultIsLocked": {
+ "message": "Your vault is locked. Verify your master password to continue."
+ },
+ "unlock": {
+ "message": "අගුලුහරින්න"
+ },
+ "loggedInAsOn": {
+ "message": "Logged in as $EMAIL$ on $HOSTNAME$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "name@example.com"
+ },
+ "hostname": {
+ "content": "$2",
+ "example": "bitwarden.com"
+ }
+ }
+ },
+ "invalidMasterPassword": {
+ "message": "Invalid master password"
+ },
+ "vaultTimeout": {
+ "message": "Vault Timeout"
+ },
+ "lockNow": {
+ "message": "දැන් අගුලුදමන්න"
+ },
+ "immediately": {
+ "message": "Immediately"
+ },
+ "tenSeconds": {
+ "message": "තත්පර 10"
+ },
+ "twentySeconds": {
+ "message": "තත්පර 20"
+ },
+ "thirtySeconds": {
+ "message": "තත්පර 30"
+ },
+ "oneMinute": {
+ "message": "විනාඩි 1"
+ },
+ "twoMinutes": {
+ "message": "විනාඩි 2"
+ },
+ "fiveMinutes": {
+ "message": "විනාඩි 5"
+ },
+ "fifteenMinutes": {
+ "message": "විනාඩි 15"
+ },
+ "thirtyMinutes": {
+ "message": "විනාඩි 30"
+ },
+ "oneHour": {
+ "message": "පැය 1"
+ },
+ "fourHours": {
+ "message": "පැය 4"
+ },
+ "onLocked": {
+ "message": "On System Lock"
+ },
+ "onRestart": {
+ "message": "On Browser Restart"
+ },
+ "never": {
+ "message": "Never"
+ },
+ "security": {
+ "message": "ආරක්ෂාව"
+ },
+ "errorOccurred": {
+ "message": "An error has occurred"
+ },
+ "emailRequired": {
+ "message": "Email address is required."
+ },
+ "invalidEmail": {
+ "message": "Invalid email address."
+ },
+ "masterPassRequired": {
+ "message": "Master password is required."
+ },
+ "masterPassLength": {
+ "message": "Master password must be at least 8 characters long."
+ },
+ "masterPassDoesntMatch": {
+ "message": "Master password confirmation does not match."
+ },
+ "newAccountCreated": {
+ "message": "Your new account has been created! You may now log in."
+ },
+ "masterPassSent": {
+ "message": "We've sent you an email with your master password hint."
+ },
+ "verificationCodeRequired": {
+ "message": "Verification code is required."
+ },
+ "valueCopied": {
+ "message": "$VALUE$ copied",
+ "description": "Value has been copied to the clipboard.",
+ "placeholders": {
+ "value": {
+ "content": "$1",
+ "example": "Password"
+ }
+ }
+ },
+ "autofillError": {
+ "message": "Unable to auto-fill the selected item on this page. Copy and paste the information instead."
+ },
+ "loggedOut": {
+ "message": "Logged out"
+ },
+ "loginExpired": {
+ "message": "Your login session has expired."
+ },
+ "logOutConfirmation": {
+ "message": "Are you sure you want to log out?"
+ },
+ "yes": {
+ "message": "Yes"
+ },
+ "no": {
+ "message": "No"
+ },
+ "unexpectedError": {
+ "message": "An unexpected error has occurred."
+ },
+ "nameRequired": {
+ "message": "Name is required."
+ },
+ "addedFolder": {
+ "message": "Added folder"
+ },
+ "changeMasterPass": {
+ "message": "Change Master Password"
+ },
+ "changeMasterPasswordConfirmation": {
+ "message": "You can change your master password on the bitwarden.com web vault. Do you want to visit the website now?"
+ },
+ "twoStepLoginConfirmation": {
+ "message": "Two-step login makes your account more secure by requiring you to verify your login with another device such as a security key, authenticator app, SMS, phone call, or email. Two-step login can be enabled on the bitwarden.com web vault. Do you want to visit the website now?"
+ },
+ "editedFolder": {
+ "message": "Edited folder"
+ },
+ "deleteFolderConfirmation": {
+ "message": "Are you sure you want to delete this folder?"
+ },
+ "deletedFolder": {
+ "message": "Deleted folder"
+ },
+ "gettingStartedTutorial": {
+ "message": "Getting Started Tutorial"
+ },
+ "gettingStartedTutorialVideo": {
+ "message": "Watch our getting started tutorial to learn how to get the most out of the browser extension."
+ },
+ "syncingComplete": {
+ "message": "Syncing complete"
+ },
+ "syncingFailed": {
+ "message": "Syncing failed"
+ },
+ "passwordCopied": {
+ "message": "Password copied"
+ },
+ "uri": {
+ "message": "URI"
+ },
+ "uriPosition": {
+ "message": "URI $POSITION$",
+ "description": "A listing of URIs. Ex: URI 1, URI 2, URI 3, etc.",
+ "placeholders": {
+ "position": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "newUri": {
+ "message": "New URI"
+ },
+ "addedItem": {
+ "message": "Added item"
+ },
+ "editedItem": {
+ "message": "Edited item"
+ },
+ "deleteItemConfirmation": {
+ "message": "Do you really want to send to the trash?"
+ },
+ "deletedItem": {
+ "message": "Sent item to trash"
+ },
+ "overwritePassword": {
+ "message": "Overwrite Password"
+ },
+ "overwritePasswordConfirmation": {
+ "message": "Are you sure you want to overwrite the current password?"
+ },
+ "searchFolder": {
+ "message": "බහාලුම සොයන්න"
+ },
+ "searchCollection": {
+ "message": "Search collection"
+ },
+ "searchType": {
+ "message": "Search type"
+ },
+ "noneFolder": {
+ "message": "No Folder",
+ "description": "This is the folder for uncategorized items"
+ },
+ "disableAddLoginNotification": {
+ "message": "Disable Add Login Notification"
+ },
+ "addLoginNotificationDesc": {
+ "message": "The \"Add Login Notification\" automatically prompts you to save new logins to your vault whenever you log into them for the first time."
+ },
+ "dontShowCardsCurrentTab": {
+ "message": "Don't Show Cards on Tab Page"
+ },
+ "dontShowCardsCurrentTabDesc": {
+ "message": "Card items from your vault are listed on the 'Current Tab' page for easy auto-fill access."
+ },
+ "dontShowIdentitiesCurrentTab": {
+ "message": "Don't Show Identities on Tab Page"
+ },
+ "dontShowIdentitiesCurrentTabDesc": {
+ "message": "Identity items from your vault are listed on the 'Current Tab' page for easy auto-fill access."
+ },
+ "clearClipboard": {
+ "message": "Clear Clipboard",
+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
+ },
+ "clearClipboardDesc": {
+ "message": "Automatically clear copied values from your clipboard.",
+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
+ },
+ "notificationAddDesc": {
+ "message": "Should Bitwarden remember this password for you?"
+ },
+ "notificationAddSave": {
+ "message": "ඔව්, දැන් සුරකින්න"
+ },
+ "notificationNeverSave": {
+ "message": "Never for this website"
+ },
+ "disableChangedPasswordNotification": {
+ "message": "Disable Changed Password Notification"
+ },
+ "disableChangedPasswordNotificationDesc": {
+ "message": "The \"Changed Password Notification\" automatically prompts you to update a login's password in your vault whenever it detects that you have changed it on a website."
+ },
+ "notificationChangeDesc": {
+ "message": "Do you want to update this password in Bitwarden?"
+ },
+ "notificationChangeSave": {
+ "message": "ඔව්, දැන් යාවත්කාල කරන්න"
+ },
+ "disableContextMenuItem": {
+ "message": "Disable Context Menu Options"
+ },
+ "disableContextMenuItemDesc": {
+ "message": "Context menu options provide quick access to password generation and logins for the website in your current tab."
+ },
+ "defaultUriMatchDetection": {
+ "message": "Default URI Match Detection",
+ "description": "Default URI match detection for auto-fill."
+ },
+ "defaultUriMatchDetectionDesc": {
+ "message": "Choose the default way that URI match detection is handled for logins when performing actions such as auto-fill."
+ },
+ "theme": {
+ "message": "තේමාව"
+ },
+ "themeDesc": {
+ "message": "Change the application's color theme."
+ },
+ "dark": {
+ "message": "Dark",
+ "description": "Dark color"
+ },
+ "light": {
+ "message": "Light",
+ "description": "Light color"
+ },
+ "solarizedDark": {
+ "message": "Solarized Dark",
+ "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated."
+ },
+ "exportVault": {
+ "message": "Export Vault"
+ },
+ "fileFormat": {
+ "message": "File Format"
+ },
+ "warning": {
+ "message": "අවවාදයයි",
+ "description": "WARNING (should stay in capitalized letters if the language permits)"
+ },
+ "confirmVaultExport": {
+ "message": "Confirm Vault Export"
+ },
+ "exportWarningDesc": {
+ "message": "This export contains your vault data in an unencrypted format. You should not store or send the exported file over unsecure channels (such as email). Delete it immediately after you are done using it."
+ },
+ "encExportKeyWarningDesc": {
+ "message": "This export encrypts your data using your account's encryption key. If you ever rotate your account's encryption key you should export again since you will not be able to decrypt this export file."
+ },
+ "encExportAccountWarningDesc": {
+ "message": "Account encryption keys are unique to each Bitwarden user account, so you can't import an encrypted export into a different account."
+ },
+ "exportMasterPassword": {
+ "message": "Enter your master password to export your vault data."
+ },
+ "shared": {
+ "message": "Shared"
+ },
+ "learnOrg": {
+ "message": "Learn about Organizations"
+ },
+ "learnOrgConfirmation": {
+ "message": "Bitwarden allows you to share your vault items with others by using an organization. Would you like to visit the bitwarden.com website to learn more?"
+ },
+ "moveToOrganization": {
+ "message": "Move to Organization"
+ },
+ "share": {
+ "message": "Share"
+ },
+ "movedItemToOrg": {
+ "message": "$ITEMNAME$ moved to $ORGNAME$",
+ "placeholders": {
+ "itemname": {
+ "content": "$1",
+ "example": "Secret Item"
+ },
+ "orgname": {
+ "content": "$2",
+ "example": "Company Name"
+ }
+ }
+ },
+ "moveToOrgDesc": {
+ "message": "Choose an organization that you wish to move this item to. Moving to an organization transfers ownership of the item to that organization. You will no longer be the direct owner of this item once it has been moved."
+ },
+ "learnMore": {
+ "message": "Learn more"
+ },
+ "authenticatorKeyTotp": {
+ "message": "Authenticator Key (TOTP)"
+ },
+ "verificationCodeTotp": {
+ "message": "Verification Code (TOTP)"
+ },
+ "copyVerificationCode": {
+ "message": "Copy Verification Code"
+ },
+ "attachments": {
+ "message": "Attachments"
+ },
+ "deleteAttachment": {
+ "message": "Delete attachment"
+ },
+ "deleteAttachmentConfirmation": {
+ "message": "Are you sure you want to delete this attachment?"
+ },
+ "deletedAttachment": {
+ "message": "Deleted attachment"
+ },
+ "newAttachment": {
+ "message": "Add New Attachment"
+ },
+ "noAttachments": {
+ "message": "No attachments."
+ },
+ "attachmentSaved": {
+ "message": "The attachment has been saved."
+ },
+ "file": {
+ "message": "ගොනුව"
+ },
+ "selectFile": {
+ "message": "Select a file."
+ },
+ "maxFileSize": {
+ "message": "Maximum file size is 500 MB."
+ },
+ "featureUnavailable": {
+ "message": "Feature Unavailable"
+ },
+ "updateKey": {
+ "message": "You cannot use this feature until you update your encryption key."
+ },
+ "premiumMembership": {
+ "message": "Premium Membership"
+ },
+ "premiumManage": {
+ "message": "Manage Membership"
+ },
+ "premiumManageAlert": {
+ "message": "You can manage your membership on the bitwarden.com web vault. Do you want to visit the website now?"
+ },
+ "premiumRefresh": {
+ "message": "Refresh Membership"
+ },
+ "premiumNotCurrentMember": {
+ "message": "You are not currently a premium member."
+ },
+ "premiumSignUpAndGet": {
+ "message": "Sign up for a premium membership and get:"
+ },
+ "ppremiumSignUpStorage": {
+ "message": "1 GB encrypted storage for file attachments."
+ },
+ "ppremiumSignUpTwoStep": {
+ "message": "Additional two-step login options such as YubiKey, FIDO U2F, and Duo."
+ },
+ "ppremiumSignUpReports": {
+ "message": "Password hygiene, account health, and data breach reports to keep your vault safe."
+ },
+ "ppremiumSignUpTotp": {
+ "message": "TOTP verification code (2FA) generator for logins in your vault."
+ },
+ "ppremiumSignUpSupport": {
+ "message": "Priority customer support."
+ },
+ "ppremiumSignUpFuture": {
+ "message": "All future premium features. More coming soon!"
+ },
+ "premiumPurchase": {
+ "message": "Purchase Premium"
+ },
+ "premiumPurchaseAlert": {
+ "message": "You can purchase premium membership on the bitwarden.com web vault. Do you want to visit the website now?"
+ },
+ "premiumCurrentMember": {
+ "message": "You are a premium member!"
+ },
+ "premiumCurrentMemberThanks": {
+ "message": "Thank you for supporting Bitwarden."
+ },
+ "premiumPrice": {
+ "message": "All for just $PRICE$ /year!",
+ "placeholders": {
+ "price": {
+ "content": "$1",
+ "example": "$10"
+ }
+ }
+ },
+ "refreshComplete": {
+ "message": "Refresh complete"
+ },
+ "disableAutoTotpCopy": {
+ "message": "Disable Automatic TOTP Copy"
+ },
+ "disableAutoTotpCopyDesc": {
+ "message": "If your login has an authenticator key attached to it, the TOTP verification code is automatically copied to your clipboard whenever you auto-fill the login."
+ },
+ "disableAutoBiometricsPrompt": {
+ "message": "Do not prompt for biometrics on launch"
+ },
+ "premiumRequired": {
+ "message": "Premium Required"
+ },
+ "premiumRequiredDesc": {
+ "message": "A premium membership is required to use this feature."
+ },
+ "enterVerificationCodeApp": {
+ "message": "Enter the 6 digit verification code from your authenticator app."
+ },
+ "enterVerificationCodeEmail": {
+ "message": "Enter the 6 digit verification code that was emailed to $EMAIL$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "example@gmail.com"
+ }
+ }
+ },
+ "verificationCodeEmailSent": {
+ "message": "Verification email sent to $EMAIL$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "example@gmail.com"
+ }
+ }
+ },
+ "rememberMe": {
+ "message": "Remember me"
+ },
+ "sendVerificationCodeEmailAgain": {
+ "message": "Send verification code email again"
+ },
+ "useAnotherTwoStepMethod": {
+ "message": "Use another two-step login method"
+ },
+ "insertYubiKey": {
+ "message": "Insert your YubiKey into your computer's USB port, then touch its button."
+ },
+ "insertU2f": {
+ "message": "Insert your security key into your computer's USB port. If it has a button, touch it."
+ },
+ "webAuthnNewTab": {
+ "message": "To start the WebAuthn 2FA verification. Click the button below to open a new tab and follow the instructions provided in the new tab."
+ },
+ "webAuthnNewTabOpen": {
+ "message": "Open new tab"
+ },
+ "webAuthnAuthenticate": {
+ "message": "Authenticate WebAuthn"
+ },
+ "loginUnavailable": {
+ "message": "Login Unavailable"
+ },
+ "noTwoStepProviders": {
+ "message": "This account has two-step login enabled, however, none of the configured two-step providers are supported by this web browser."
+ },
+ "noTwoStepProviders2": {
+ "message": "Please use a supported web browser (such as Chrome) and/or add additional providers that are better supported across web browsers (such as an authenticator app)."
+ },
+ "twoStepOptions": {
+ "message": "Two-step Login Options"
+ },
+ "recoveryCodeDesc": {
+ "message": "Lost access to all of your two-factor providers? Use your recovery code to disable all two-factor providers from your account."
+ },
+ "recoveryCodeTitle": {
+ "message": "Recovery Code"
+ },
+ "authenticatorAppTitle": {
+ "message": "Authenticator App"
+ },
+ "authenticatorAppDesc": {
+ "message": "Use an authenticator app (such as Authy or Google Authenticator) to generate time-based verification codes.",
+ "description": "'Authy' and 'Google Authenticator' are product names and should not be translated."
+ },
+ "yubiKeyTitle": {
+ "message": "YubiKey OTP Security Key"
+ },
+ "yubiKeyDesc": {
+ "message": "Use a YubiKey to access your account. Works with YubiKey 4, 4 Nano, 4C, and NEO devices."
+ },
+ "duoDesc": {
+ "message": "Verify with Duo Security using the Duo Mobile app, SMS, phone call, or U2F security key.",
+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
+ },
+ "duoOrganizationDesc": {
+ "message": "Verify with Duo Security for your organization using the Duo Mobile app, SMS, phone call, or U2F security key.",
+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
+ },
+ "webAuthnTitle": {
+ "message": "FIDO2 WebAuthn"
+ },
+ "webAuthnDesc": {
+ "message": "Use any WebAuthn enabled security key to access your account."
+ },
+ "emailTitle": {
+ "message": "Email"
+ },
+ "emailDesc": {
+ "message": "Verification codes will be emailed to you."
+ },
+ "selfHostedEnvironment": {
+ "message": "Self-hosted Environment"
+ },
+ "selfHostedEnvironmentFooter": {
+ "message": "Specify the base URL of your on-premises hosted Bitwarden installation."
+ },
+ "customEnvironment": {
+ "message": "Custom Environment"
+ },
+ "customEnvironmentFooter": {
+ "message": "For advanced users. You can specify the base URL of each service independently."
+ },
+ "baseUrl": {
+ "message": "Server URL"
+ },
+ "apiUrl": {
+ "message": "API Server URL"
+ },
+ "webVaultUrl": {
+ "message": "Web Vault Server URL"
+ },
+ "identityUrl": {
+ "message": "Identity Server URL"
+ },
+ "notificationsUrl": {
+ "message": "Notifications Server URL"
+ },
+ "iconsUrl": {
+ "message": "Icons Server URL"
+ },
+ "environmentSaved": {
+ "message": "The environment URLs have been saved."
+ },
+ "enableAutoFillOnPageLoad": {
+ "message": "Enable Auto-fill on Page Load"
+ },
+ "enableAutoFillOnPageLoadDesc": {
+ "message": "If a login form is detected, automatically perform an auto-fill when the web page loads."
+ },
+ "experimentalFeature": {
+ "message": "This is currently an experimental feature. Use at your own risk."
+ },
+ "defaultAutoFillOnPageLoad": {
+ "message": "Default autofill setting for login items"
+ },
+ "defaultAutoFillOnPageLoadDesc": {
+ "message": "After enabling Auto-fill on Page Load, you can enable or disable the feature for individual login items. This is the default setting for login items that are not separately configured."
+ },
+ "itemAutoFillOnPageLoad": {
+ "message": "Auto-fill on Page Load (if enabled in Options)"
+ },
+ "autoFillOnPageLoadUseDefault": {
+ "message": "Use default setting"
+ },
+ "autoFillOnPageLoadYes": {
+ "message": "Auto-fill on page load"
+ },
+ "autoFillOnPageLoadNo": {
+ "message": "Do not auto-fill on page load"
+ },
+ "commandOpenPopup": {
+ "message": "Open vault popup"
+ },
+ "commandOpenSidebar": {
+ "message": "Open vault in sidebar"
+ },
+ "commandAutofillDesc": {
+ "message": "Auto-fill the last used login for the current website"
+ },
+ "commandGeneratePasswordDesc": {
+ "message": "Generate and copy a new random password to the clipboard"
+ },
+ "commandLockVaultDesc": {
+ "message": "Lock the vault"
+ },
+ "privateModeMessage": {
+ "message": "Unfortunately this window is not available in private mode for this browser."
+ },
+ "customFields": {
+ "message": "Custom Fields"
+ },
+ "copyValue": {
+ "message": "Copy Value"
+ },
+ "value": {
+ "message": "Value"
+ },
+ "newCustomField": {
+ "message": "New Custom Field"
+ },
+ "dragToSort": {
+ "message": "Drag to sort"
+ },
+ "cfTypeText": {
+ "message": "Text"
+ },
+ "cfTypeHidden": {
+ "message": "Hidden"
+ },
+ "cfTypeBoolean": {
+ "message": "Boolean"
+ },
+ "popup2faCloseMessage": {
+ "message": "Clicking outside the popup window to check your email for your verification code will cause this popup to close. Do you want to open this popup in a new window so that it does not close?"
+ },
+ "popupU2fCloseMessage": {
+ "message": "This browser cannot process U2F requests in this popup window. Do you want to open this popup in a new window so that you can log in using U2F?"
+ },
+ "disableFavicon": {
+ "message": "Disable Website Icons"
+ },
+ "disableFaviconDesc": {
+ "message": "Website Icons provide a recognizable image next to each login item in your vault."
+ },
+ "disableBadgeCounter": {
+ "message": "Disable Badge Counter"
+ },
+ "disableBadgeCounterDesc": {
+ "message": "Badge counter indicates how many logins you have for the current page in your vault."
+ },
+ "cardholderName": {
+ "message": "Cardholder Name"
+ },
+ "number": {
+ "message": "Number"
+ },
+ "brand": {
+ "message": "Brand"
+ },
+ "expirationMonth": {
+ "message": "Expiration Month"
+ },
+ "expirationYear": {
+ "message": "Expiration Year"
+ },
+ "expiration": {
+ "message": "Expiration"
+ },
+ "january": {
+ "message": "දුරුතු"
+ },
+ "february": {
+ "message": "නවම්"
+ },
+ "march": {
+ "message": "මැදින්"
+ },
+ "april": {
+ "message": "බක්"
+ },
+ "may": {
+ "message": "වෙසක්"
+ },
+ "june": {
+ "message": "පොසොන්"
+ },
+ "july": {
+ "message": "ඇසළ"
+ },
+ "august": {
+ "message": "නිකිණි"
+ },
+ "september": {
+ "message": "බිනර"
+ },
+ "october": {
+ "message": "වප්"
+ },
+ "november": {
+ "message": "ඉල්"
+ },
+ "december": {
+ "message": "උඳුවප්"
+ },
+ "securityCode": {
+ "message": "Security Code"
+ },
+ "ex": {
+ "message": "ex."
+ },
+ "title": {
+ "message": "Title"
+ },
+ "mr": {
+ "message": "Mr"
+ },
+ "mrs": {
+ "message": "Mrs"
+ },
+ "ms": {
+ "message": "Ms"
+ },
+ "dr": {
+ "message": "Dr"
+ },
+ "firstName": {
+ "message": "First Name"
+ },
+ "middleName": {
+ "message": "Middle Name"
+ },
+ "lastName": {
+ "message": "Last Name"
+ },
+ "identityName": {
+ "message": "Identity Name"
+ },
+ "company": {
+ "message": "Company"
+ },
+ "ssn": {
+ "message": "Social Security Number"
+ },
+ "passportNumber": {
+ "message": "Passport Number"
+ },
+ "licenseNumber": {
+ "message": "License Number"
+ },
+ "email": {
+ "message": "Email"
+ },
+ "phone": {
+ "message": "Phone"
+ },
+ "address": {
+ "message": "Address"
+ },
+ "address1": {
+ "message": "Address 1"
+ },
+ "address2": {
+ "message": "Address 2"
+ },
+ "address3": {
+ "message": "Address 3"
+ },
+ "cityTown": {
+ "message": "City / Town"
+ },
+ "stateProvince": {
+ "message": "State / Province"
+ },
+ "zipPostalCode": {
+ "message": "Zip / Postal Code"
+ },
+ "country": {
+ "message": "Country"
+ },
+ "type": {
+ "message": "Type"
+ },
+ "typeLogin": {
+ "message": "Login"
+ },
+ "typeLogins": {
+ "message": "Logins"
+ },
+ "typeSecureNote": {
+ "message": "Secure Note"
+ },
+ "typeCard": {
+ "message": "Card"
+ },
+ "typeIdentity": {
+ "message": "Identity"
+ },
+ "passwordHistory": {
+ "message": "Password History"
+ },
+ "back": {
+ "message": "Back"
+ },
+ "collections": {
+ "message": "Collections"
+ },
+ "favorites": {
+ "message": "Favorites"
+ },
+ "popOutNewWindow": {
+ "message": "Pop out to a new window"
+ },
+ "refresh": {
+ "message": "Refresh"
+ },
+ "cards": {
+ "message": "Cards"
+ },
+ "identities": {
+ "message": "Identities"
+ },
+ "logins": {
+ "message": "Logins"
+ },
+ "secureNotes": {
+ "message": "Secure Notes"
+ },
+ "clear": {
+ "message": "Clear",
+ "description": "To clear something out. example: To clear browser history."
+ },
+ "checkPassword": {
+ "message": "Check if password has been exposed."
+ },
+ "passwordExposed": {
+ "message": "This password has been exposed $VALUE$ time(s) in data breaches. You should change it.",
+ "placeholders": {
+ "value": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "passwordSafe": {
+ "message": "This password was not found in any known data breaches. It should be safe to use."
+ },
+ "baseDomain": {
+ "message": "Base domain"
+ },
+ "host": {
+ "message": "Host",
+ "description": "A URL's host value. For example, the host of https://sub.domain.com:443 is 'sub.domain.com:443'."
+ },
+ "exact": {
+ "message": "Exact"
+ },
+ "startsWith": {
+ "message": "Starts with"
+ },
+ "regEx": {
+ "message": "Regular expression",
+ "description": "A programming term, also known as 'RegEx'."
+ },
+ "matchDetection": {
+ "message": "Match Detection",
+ "description": "URI match detection for auto-fill."
+ },
+ "defaultMatchDetection": {
+ "message": "Default match detection",
+ "description": "Default URI match detection for auto-fill."
+ },
+ "toggleOptions": {
+ "message": "Toggle Options"
+ },
+ "toggleCurrentUris": {
+ "message": "Toggle Current URIs",
+ "description": "Toggle the display of the URIs of the currently open tabs in the browser."
+ },
+ "currentUri": {
+ "message": "Current URI",
+ "description": "The URI of one of the current open tabs in the browser."
+ },
+ "organization": {
+ "message": "Organization",
+ "description": "An entity of multiple related people (ex. a team or business organization)."
+ },
+ "types": {
+ "message": "Types"
+ },
+ "allItems": {
+ "message": "All Items"
+ },
+ "noPasswordsInList": {
+ "message": "There are no passwords to list."
+ },
+ "remove": {
+ "message": "Remove"
+ },
+ "default": {
+ "message": "Default"
+ },
+ "dateUpdated": {
+ "message": "Updated",
+ "description": "ex. Date this item was updated"
+ },
+ "datePasswordUpdated": {
+ "message": "Password Updated",
+ "description": "ex. Date this password was updated"
+ },
+ "neverLockWarning": {
+ "message": "Are you sure you want to use the \"Never\" option? Setting your lock options to \"Never\" stores your vault's encryption key on your device. If you use this option you should ensure that you keep your device properly protected."
+ },
+ "noOrganizationsList": {
+ "message": "You do not belong to any organizations. Organizations allow you to securely share items with other users."
+ },
+ "noCollectionsInList": {
+ "message": "There are no collections to list."
+ },
+ "ownership": {
+ "message": "Ownership"
+ },
+ "whoOwnsThisItem": {
+ "message": "Who owns this item?"
+ },
+ "strong": {
+ "message": "Strong",
+ "description": "ex. A strong password. Scale: Weak -> Good -> Strong"
+ },
+ "good": {
+ "message": "Good",
+ "description": "ex. A good password. Scale: Weak -> Good -> Strong"
+ },
+ "weak": {
+ "message": "Weak",
+ "description": "ex. A weak password. Scale: Weak -> Good -> Strong"
+ },
+ "weakMasterPassword": {
+ "message": "Weak Master Password"
+ },
+ "weakMasterPasswordDesc": {
+ "message": "The master password you have chosen is weak. You should use a strong master password (or a passphrase) to properly protect your Bitwarden account. Are you sure you want to use this master password?"
+ },
+ "pin": {
+ "message": "PIN",
+ "description": "PIN code. Ex. The short code (often numeric) that you use to unlock a device."
+ },
+ "unlockWithPin": {
+ "message": "Unlock with PIN"
+ },
+ "setYourPinCode": {
+ "message": "Set your PIN code for unlocking Bitwarden. Your PIN settings will be reset if you ever fully log out of the application."
+ },
+ "pinRequired": {
+ "message": "PIN code is required."
+ },
+ "invalidPin": {
+ "message": "Invalid PIN code."
+ },
+ "verifyPin": {
+ "message": "Verify PIN"
+ },
+ "yourVaultIsLockedPinCode": {
+ "message": "Your vault is locked. Verify your PIN code to continue."
+ },
+ "unlockWithBiometrics": {
+ "message": "Unlock with biometrics"
+ },
+ "awaitDesktop": {
+ "message": "Awaiting confirmation from desktop"
+ },
+ "awaitDesktopDesc": {
+ "message": "Please confirm using biometrics in the Bitwarden Desktop application to enable biometrics for browser."
+ },
+ "lockWithMasterPassOnRestart": {
+ "message": "Lock with master password on browser restart"
+ },
+ "selectOneCollection": {
+ "message": "You must select at least one collection."
+ },
+ "cloneItem": {
+ "message": "Clone Item"
+ },
+ "clone": {
+ "message": "Clone"
+ },
+ "passwordGeneratorPolicyInEffect": {
+ "message": "One or more organization policies are affecting your generator settings."
+ },
+ "vaultTimeoutAction": {
+ "message": "Vault Timeout Action"
+ },
+ "lock": {
+ "message": "Lock",
+ "description": "Verb form: to make secure or inaccesible by"
+ },
+ "trash": {
+ "message": "Trash",
+ "description": "Noun: a special folder to hold deleted items"
+ },
+ "searchTrash": {
+ "message": "Search trash"
+ },
+ "permanentlyDeleteItem": {
+ "message": "Permanently Delete Item"
+ },
+ "permanentlyDeleteItemConfirmation": {
+ "message": "Are you sure you want to permanently delete this item?"
+ },
+ "permanentlyDeletedItem": {
+ "message": "Permanently Deleted item"
+ },
+ "restoreItem": {
+ "message": "Restore Item"
+ },
+ "restoreItemConfirmation": {
+ "message": "Are you sure you want to restore this item?"
+ },
+ "restoredItem": {
+ "message": "Restored Item"
+ },
+ "vaultTimeoutLogOutConfirmation": {
+ "message": "Logging out will remove all access to your vault and requires online authentication after the timeout period. Are you sure you want to use this setting?"
+ },
+ "vaultTimeoutLogOutConfirmationTitle": {
+ "message": "Timeout Action Confirmation"
+ },
+ "autoFillAndSave": {
+ "message": "Auto-fill and Save"
+ },
+ "autoFillSuccessAndSavedUri": {
+ "message": "Auto-filled Item and Saved URI"
+ },
+ "autoFillSuccess": {
+ "message": "Auto-filled Item"
+ },
+ "setMasterPassword": {
+ "message": "Set Master Password"
+ },
+ "masterPasswordPolicyInEffect": {
+ "message": "One or more organization policies require your master password to meet the following requirements:"
+ },
+ "policyInEffectMinComplexity": {
+ "message": "Minimum complexity score of $SCORE$",
+ "placeholders": {
+ "score": {
+ "content": "$1",
+ "example": "4"
+ }
+ }
+ },
+ "policyInEffectMinLength": {
+ "message": "Minimum length of $LENGTH$",
+ "placeholders": {
+ "length": {
+ "content": "$1",
+ "example": "14"
+ }
+ }
+ },
+ "policyInEffectUppercase": {
+ "message": "Contain one or more uppercase characters"
+ },
+ "policyInEffectLowercase": {
+ "message": "Contain one or more lowercase characters"
+ },
+ "policyInEffectNumbers": {
+ "message": "Contain one or more numbers"
+ },
+ "policyInEffectSpecial": {
+ "message": "Contain one or more of the following special characters $CHARS$",
+ "placeholders": {
+ "chars": {
+ "content": "$1",
+ "example": "!@#$%^&*"
+ }
+ }
+ },
+ "masterPasswordPolicyRequirementsNotMet": {
+ "message": "Your new master password does not meet the policy requirements."
+ },
+ "acceptPolicies": {
+ "message": "By checking this box you agree to the following:"
+ },
+ "acceptPoliciesError": {
+ "message": "Terms of Service and Privacy Policy have not been acknowledged."
+ },
+ "termsOfService": {
+ "message": "Terms of Service"
+ },
+ "privacyPolicy": {
+ "message": "Privacy Policy"
+ },
+ "hintEqualsPassword": {
+ "message": "Your password hint cannot be the same as your password."
+ },
+ "ok": {
+ "message": "Ok"
+ },
+ "desktopSyncVerificationTitle": {
+ "message": "Desktop sync verification"
+ },
+ "desktopIntegrationVerificationText": {
+ "message": "Please verify that the desktop application shows this fingerprint: "
+ },
+ "desktopIntegrationDisabledTitle": {
+ "message": "Browser integration is not enabled"
+ },
+ "desktopIntegrationDisabledDesc": {
+ "message": "Browser integration is not enabled in the Bitwarden Desktop application. Please enable it in the settings within the desktop application."
+ },
+ "startDesktopTitle": {
+ "message": "Start the Bitwarden Desktop application"
+ },
+ "startDesktopDesc": {
+ "message": "The Bitwarden Desktop application needs to be started before this function can be used."
+ },
+ "errorEnableBiometricTitle": {
+ "message": "Unable to enable biometrics"
+ },
+ "errorEnableBiometricDesc": {
+ "message": "Action was canceled by the desktop application"
+ },
+ "nativeMessagingInvalidEncryptionDesc": {
+ "message": "Desktop application invalidated the secure communication channel. Please retry this operation"
+ },
+ "nativeMessagingInvalidEncryptionTitle": {
+ "message": "Desktop communication interrupted"
+ },
+ "nativeMessagingWrongUserDesc": {
+ "message": "The desktop application is logged into a different account. Please ensure both applications are logged into the same account."
+ },
+ "nativeMessagingWrongUserTitle": {
+ "message": "Account missmatch"
+ },
+ "biometricsNotEnabledTitle": {
+ "message": "Biometrics not enabled"
+ },
+ "biometricsNotEnabledDesc": {
+ "message": "Browser biometrics requires desktop biometric to be enabled in the settings first."
+ },
+ "biometricsNotSupportedTitle": {
+ "message": "Biometrics not supported"
+ },
+ "biometricsNotSupportedDesc": {
+ "message": "Browser biometrics is not supported on this device."
+ },
+ "nativeMessaginPermissionErrorTitle": {
+ "message": "Permission not provided"
+ },
+ "nativeMessaginPermissionErrorDesc": {
+ "message": "Without permission to communicate with the Bitwarden Desktop Application we cannot provide biometrics in the browser extension. Please try again."
+ },
+ "nativeMessaginPermissionSidebarTitle": {
+ "message": "Permission request error"
+ },
+ "nativeMessaginPermissionSidebarDesc": {
+ "message": "This action cannot be done in the sidebar, please retry the action in the popup or popout."
+ },
+ "personalOwnershipSubmitError": {
+ "message": "Due to an Enterprise Policy, you are restricted from saving items to your personal vault. Change the Ownership option to an organization and choose from available Collections."
+ },
+ "personalOwnershipPolicyInEffect": {
+ "message": "An organization policy is affecting your ownership options."
+ },
+ "excludedDomains": {
+ "message": "Excluded Domains"
+ },
+ "excludedDomainsDesc": {
+ "message": "Bitwarden will not ask to save login details for these domains. You must refresh the page for changes to take effect."
+ },
+ "excludedDomainsInvalidDomain": {
+ "message": "$DOMAIN$ is not a valid domain",
+ "placeholders": {
+ "domain": {
+ "content": "$1",
+ "example": "googlecom"
+ }
+ }
+ },
+ "send": {
+ "message": "Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "searchSends": {
+ "message": "Search Sends",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "addSend": {
+ "message": "Add Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTypeText": {
+ "message": "Text"
+ },
+ "sendTypeFile": {
+ "message": "File"
+ },
+ "allSends": {
+ "message": "All Sends",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "maxAccessCountReached": {
+ "message": "Max access count reached"
+ },
+ "expired": {
+ "message": "Expired"
+ },
+ "pendingDeletion": {
+ "message": "Pending deletion"
+ },
+ "passwordProtected": {
+ "message": "Password protected"
+ },
+ "copySendLink": {
+ "message": "Copy Send link",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "removePassword": {
+ "message": "Remove Password"
+ },
+ "delete": {
+ "message": "Delete"
+ },
+ "removedPassword": {
+ "message": "Removed Password"
+ },
+ "deletedSend": {
+ "message": "Deleted Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendLink": {
+ "message": "Send link",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "disabled": {
+ "message": "Disabled"
+ },
+ "removePasswordConfirmation": {
+ "message": "Are you sure you want to remove the password?"
+ },
+ "deleteSend": {
+ "message": "Delete Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "deleteSendConfirmation": {
+ "message": "Are you sure you want to delete this Send?",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "editSend": {
+ "message": "Edit Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTypeHeader": {
+ "message": "What type of Send is this?",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendNameDesc": {
+ "message": "A friendly name to describe this Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendFileDesc": {
+ "message": "The file you want to send."
+ },
+ "deletionDate": {
+ "message": "Deletion Date"
+ },
+ "deletionDateDesc": {
+ "message": "The Send will be permanently deleted on the specified date and time.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "expirationDate": {
+ "message": "Expiration Date"
+ },
+ "expirationDateDesc": {
+ "message": "If set, access to this Send will expire on the specified date and time.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "oneDay": {
+ "message": "1 day"
+ },
+ "days": {
+ "message": "$DAYS$ days",
+ "placeholders": {
+ "days": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "custom": {
+ "message": "Custom"
+ },
+ "maximumAccessCount": {
+ "message": "Maximum Access Count"
+ },
+ "maximumAccessCountDesc": {
+ "message": "If set, users will no longer be able to access this Send once the maximum access count is reached.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendPasswordDesc": {
+ "message": "Optionally require a password for users to access this Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendNotesDesc": {
+ "message": "Private notes about this Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendDisableDesc": {
+ "message": "Disable this Send so that no one can access it.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendShareDesc": {
+ "message": "Copy this Send's link to clipboard upon save.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTextDesc": {
+ "message": "The text you want to send."
+ },
+ "sendHideText": {
+ "message": "Hide this Send's text by default.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "currentAccessCount": {
+ "message": "Current Access Count"
+ },
+ "createSend": {
+ "message": "Create New Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "newPassword": {
+ "message": "New Password"
+ },
+ "sendDisabled": {
+ "message": "Send Disabled",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendDisabledWarning": {
+ "message": "Due to an enterprise policy, you are only able to delete an existing Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "createdSend": {
+ "message": "Created Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "editedSend": {
+ "message": "Edited Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendLinuxChromiumFileWarning": {
+ "message": "In order to choose a file, open the extension in the sidebar (if possible) or pop out to a new window by clicking this banner."
+ },
+ "sendFirefoxFileWarning": {
+ "message": "In order to choose a file using Firefox, open the extension in the sidebar or pop out to a new window by clicking this banner."
+ },
+ "sendSafariFileWarning": {
+ "message": "In order to choose a file using Safari, pop out to a new window by clicking this banner."
+ },
+ "sendFileCalloutHeader": {
+ "message": "Before you start"
+ },
+ "sendFirefoxCustomDatePopoutMessage1": {
+ "message": "To use a calendar style date picker",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read '**To use a calendar style date picker ** click here to pop out your window.'"
+ },
+ "sendFirefoxCustomDatePopoutMessage2": {
+ "message": "click here",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker **click here** to pop out your window.'"
+ },
+ "sendFirefoxCustomDatePopoutMessage3": {
+ "message": "to pop out your window.",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker click here **to pop out your window.**'"
+ },
+ "expirationDateIsInvalid": {
+ "message": "The expiration date provided is not valid."
+ },
+ "deletionDateIsInvalid": {
+ "message": "The deletion date provided is not valid."
+ },
+ "expirationDateAndTimeRequired": {
+ "message": "An expiration date and time are required."
+ },
+ "deletionDateAndTimeRequired": {
+ "message": "A deletion date and time are required."
+ },
+ "dateParsingError": {
+ "message": "There was an error saving your deletion and expiration dates."
+ },
+ "hideEmail": {
+ "message": "Hide my email address from recipients."
+ },
+ "sendOptionsPolicyInEffect": {
+ "message": "One or more organization policies are affecting your Send options."
+ },
+ "passwordPrompt": {
+ "message": "Master password re-prompt"
+ },
+ "passwordConfirmation": {
+ "message": "Master password confirmation"
+ },
+ "passwordConfirmationDesc": {
+ "message": "This action is protected. To continue, please re-enter your master password to verify your identity."
+ },
+ "emailVerificationRequired": {
+ "message": "Email Verification Required"
+ },
+ "emailVerificationRequiredDesc": {
+ "message": "You must verify your email to use this feature. You can verify your email in the web vault."
+ },
+ "updatedMasterPassword": {
+ "message": "Updated Master Password"
+ },
+ "updateMasterPassword": {
+ "message": "Update Master Password"
+ },
+ "updateMasterPasswordWarning": {
+ "message": "Your Master Password was recently changed by an administrator in your organization. In order to access the vault, you must update it now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour."
+ },
+ "resetPasswordPolicyAutoEnroll": {
+ "message": "Automatic Enrollment"
+ },
+ "resetPasswordAutoEnrollInviteWarning": {
+ "message": "This organization has an enterprise policy that will automatically enroll you in password reset. Enrollment will allow organization administrators to change your master password."
+ },
+ "selectFolder": {
+ "message": "Select folder..."
+ },
+ "ssoCompleteRegistration": {
+ "message": "In order to complete logging in with SSO, please set a master password to access and protect your vault."
+ },
+ "hours": {
+ "message": "Hours"
+ },
+ "minutes": {
+ "message": "Minutes"
+ },
+ "vaultTimeoutPolicyInEffect": {
+ "message": "Your organization policies are affecting your vault timeout. Maximum allowed Vault Timeout is $HOURS$ hour(s) and $MINUTES$ minute(s)",
+ "placeholders": {
+ "hours": {
+ "content": "$1",
+ "example": "5"
+ },
+ "minutes": {
+ "content": "$2",
+ "example": "5"
+ }
+ }
+ },
+ "vaultTimeoutToLarge": {
+ "message": "Your vault timeout exceeds the restrictions set by your organization."
+ },
+ "vaultExportDisabled": {
+ "message": "Vault Export Disabled"
+ },
+ "personalVaultExportPolicyInEffect": {
+ "message": "One or more organization policies prevents you from exporting your personal vault."
+ },
+ "copyCustomFieldNameInvalidElement": {
+ "message": "Unable to identify a valid form element. Try inspecting the HTML instead."
+ },
+ "copyCustomFieldNameNotUnique": {
+ "message": "No unique identifier found."
+ }
+}
diff --git a/src/iOS.Safari/Resources/_locales/sk/messages.json b/src/iOS.Safari/Resources/_locales/sk/messages.json
new file mode 100644
index 000000000..35e288004
--- /dev/null
+++ b/src/iOS.Safari/Resources/_locales/sk/messages.json
@@ -0,0 +1,1817 @@
+{
+ "appName": {
+ "message": "Bitwarden"
+ },
+ "extName": {
+ "message": "Bitwarden - Bezplatný správca hesiel",
+ "description": "Extension name, MUST be less than 40 characters (Safari restriction)"
+ },
+ "extDesc": {
+ "message": "bitwarden je bezpečný a bezplatný správca hesiel pre všetky vaše zariadenia.",
+ "description": "Extension description"
+ },
+ "loginOrCreateNewAccount": {
+ "message": "Prihláste sa, alebo vytvorte nový účet pre prístup k vášmu bezpečnému trezoru."
+ },
+ "createAccount": {
+ "message": "Vytvoriť účet"
+ },
+ "login": {
+ "message": "Prihlásiť sa"
+ },
+ "enterpriseSingleSignOn": {
+ "message": "Prihlásenie cez prihlasovací formulár spoločnosti (SSO)"
+ },
+ "cancel": {
+ "message": "Zrušiť"
+ },
+ "close": {
+ "message": "Zavrieť"
+ },
+ "submit": {
+ "message": "Potvrdiť"
+ },
+ "emailAddress": {
+ "message": "Emailová adresa"
+ },
+ "masterPass": {
+ "message": "Hlavné heslo"
+ },
+ "masterPassDesc": {
+ "message": "Hlavné heslo je heslo, ktoré použijete na prístup k svojmu trezoru. Je veľmi dôležité, aby ste svoje hlavné heslo nezabudli. Neexistuje možnosť, ako heslo obnoviť v prípade, že ho zabudnete."
+ },
+ "masterPassHintDesc": {
+ "message": "Nápoveda k hlavnému heslu vám môže pomôcť spomenúť si na heslo, ak ho zabudnete."
+ },
+ "reTypeMasterPass": {
+ "message": "Znovu zadajte hlavné heslo"
+ },
+ "masterPassHint": {
+ "message": "Nápoveda k hlavnému heslu (voliteľné)"
+ },
+ "tab": {
+ "message": "Karta"
+ },
+ "myVault": {
+ "message": "Môj trezor"
+ },
+ "tools": {
+ "message": "Nástroje"
+ },
+ "settings": {
+ "message": "Nastavenia"
+ },
+ "currentTab": {
+ "message": "Aktuálna karta"
+ },
+ "copyPassword": {
+ "message": "Kopírovať heslo"
+ },
+ "copyNote": {
+ "message": "Kopírovať poznámku"
+ },
+ "copyUri": {
+ "message": "Kopírovať URI"
+ },
+ "copyUsername": {
+ "message": "Kopírovať používateľské meno"
+ },
+ "copyNumber": {
+ "message": "Kopírovať číslo"
+ },
+ "copySecurityCode": {
+ "message": "Kopírovať bezpečnostný kód"
+ },
+ "autoFill": {
+ "message": "Automatické vypĺňanie"
+ },
+ "generatePasswordCopied": {
+ "message": "Vygenerovať heslo (skopírované)"
+ },
+ "copyElementIdentifier": {
+ "message": "Kopírovať názov vlastného poľa"
+ },
+ "noMatchingLogins": {
+ "message": "Žiadne zodpovedajúce prihlasovacie údaje."
+ },
+ "vaultLocked": {
+ "message": "Trezor je zamknutý."
+ },
+ "vaultLoggedOut": {
+ "message": "Trezor je odhlásený"
+ },
+ "autoFillInfo": {
+ "message": "Nie sú prístupné žiadne prihlasovacie údaje na automatické vyplnenie pre aktuálnu kartu."
+ },
+ "addLogin": {
+ "message": "Pridať prihlasovacie údaje"
+ },
+ "addItem": {
+ "message": "Pridať položku"
+ },
+ "passwordHint": {
+ "message": "Nápoveda k heslu"
+ },
+ "enterEmailToGetHint": {
+ "message": "Zadajte emailovú adresu na zaslanie nápovedy pre vaše hlavné heslo."
+ },
+ "getMasterPasswordHint": {
+ "message": "Získať nápovedu k hlavnému heslu"
+ },
+ "continue": {
+ "message": "Pokračovať"
+ },
+ "verificationCode": {
+ "message": "Overovací kód"
+ },
+ "account": {
+ "message": "Účet"
+ },
+ "changeMasterPassword": {
+ "message": "Zmeniť hlavné heslo"
+ },
+ "fingerprintPhrase": {
+ "message": "Fráza odtlačku",
+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
+ },
+ "yourAccountsFingerprint": {
+ "message": "Fráza odtlačku vášho účtu",
+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
+ },
+ "twoStepLogin": {
+ "message": "Dvojstupňové prihlásenie"
+ },
+ "logOut": {
+ "message": "Odhlásiť sa"
+ },
+ "about": {
+ "message": "O aplikácii"
+ },
+ "version": {
+ "message": "Verzia"
+ },
+ "save": {
+ "message": "Uložiť"
+ },
+ "move": {
+ "message": "Presunúť"
+ },
+ "addFolder": {
+ "message": "Pridať priečinok"
+ },
+ "name": {
+ "message": "Meno"
+ },
+ "editFolder": {
+ "message": "Upraviť priečinok"
+ },
+ "deleteFolder": {
+ "message": "Odstrániť priečinok"
+ },
+ "folders": {
+ "message": "Priečinky"
+ },
+ "noFolders": {
+ "message": "V zozname sa nenachádzajú žiadne priečinky."
+ },
+ "helpFeedback": {
+ "message": "Pomoc a spätná väzba"
+ },
+ "sync": {
+ "message": "Synchronizácia"
+ },
+ "syncVaultNow": {
+ "message": "Synchronizovať trezor teraz"
+ },
+ "lastSync": {
+ "message": "Posledná synchronizácia:"
+ },
+ "passGen": {
+ "message": "Generátor hesla"
+ },
+ "generator": {
+ "message": "Generátor",
+ "description": "Short for 'Password Generator'."
+ },
+ "passGenInfo": {
+ "message": "Automaticky generovať silné a unikátne heslá k prihlasovacím údajom."
+ },
+ "bitWebVault": {
+ "message": "Webový trezor Bitwarden"
+ },
+ "importItems": {
+ "message": "Importovať položky"
+ },
+ "select": {
+ "message": "Vybrať"
+ },
+ "generatePassword": {
+ "message": "Generovať heslo"
+ },
+ "regeneratePassword": {
+ "message": "Vygenerovať nové heslo"
+ },
+ "options": {
+ "message": "Možnosti"
+ },
+ "length": {
+ "message": "Dĺžka"
+ },
+ "numWords": {
+ "message": "Počet slov"
+ },
+ "wordSeparator": {
+ "message": "Oddeľovač slov"
+ },
+ "capitalize": {
+ "message": "Prvé písmeno veľkým",
+ "description": "Make the first letter of a work uppercase."
+ },
+ "includeNumber": {
+ "message": "Zahrnúť číslo"
+ },
+ "minNumbers": {
+ "message": "Minimum číslic"
+ },
+ "minSpecial": {
+ "message": "Minimum špec. znakov"
+ },
+ "avoidAmbChar": {
+ "message": "Vyhnúť sa zameniteľným znakom"
+ },
+ "searchVault": {
+ "message": "Prehľadávať trezor"
+ },
+ "edit": {
+ "message": "Upraviť"
+ },
+ "view": {
+ "message": "Zobraziť"
+ },
+ "noItemsInList": {
+ "message": "Neexistujú žiadne položky na zobrazenie."
+ },
+ "itemInformation": {
+ "message": "Informácie o položke"
+ },
+ "username": {
+ "message": "Používateľské meno"
+ },
+ "password": {
+ "message": "Heslo"
+ },
+ "passphrase": {
+ "message": "Heslo"
+ },
+ "favorite": {
+ "message": "Obľúbené"
+ },
+ "notes": {
+ "message": "Poznámky"
+ },
+ "note": {
+ "message": "Poznámka"
+ },
+ "editItem": {
+ "message": "Upraviť položku"
+ },
+ "folder": {
+ "message": "Priečinok"
+ },
+ "deleteItem": {
+ "message": "Zmazať položku"
+ },
+ "viewItem": {
+ "message": "Zobraziť položku"
+ },
+ "launch": {
+ "message": "Spustiť"
+ },
+ "website": {
+ "message": "Webstránka"
+ },
+ "toggleVisibility": {
+ "message": "Prepnúť viditeľnosť"
+ },
+ "manage": {
+ "message": "Spravovať"
+ },
+ "other": {
+ "message": "Ostatné"
+ },
+ "rateExtension": {
+ "message": "Ohodnotiť rozšírenie"
+ },
+ "rateExtensionDesc": {
+ "message": "Prosíme, zvážte napísanie pozitívnej recenzie!"
+ },
+ "browserNotSupportClipboard": {
+ "message": "Váš webový prehliadač nepodporuje automatické kopírovanie do schránky. Kopírujte manuálne."
+ },
+ "verifyMasterPassword": {
+ "message": "Overenie hlavného hesla"
+ },
+ "yourVaultIsLocked": {
+ "message": "Váš trezor je uzamknutý. Overte sa hlavným heslom ak chcete pokračovať."
+ },
+ "unlock": {
+ "message": "Odomknúť"
+ },
+ "loggedInAsOn": {
+ "message": "Prihlásený ako $EMAIL$ na $HOSTNAME$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "name@example.com"
+ },
+ "hostname": {
+ "content": "$2",
+ "example": "bitwarden.com"
+ }
+ }
+ },
+ "invalidMasterPassword": {
+ "message": "Neplatné hlavné heslo"
+ },
+ "vaultTimeout": {
+ "message": "Časový limit pre trezor vypršal"
+ },
+ "lockNow": {
+ "message": "Uzamknúť teraz"
+ },
+ "immediately": {
+ "message": "Okamžite"
+ },
+ "tenSeconds": {
+ "message": "10 sekúnd"
+ },
+ "twentySeconds": {
+ "message": "20 sekúnd"
+ },
+ "thirtySeconds": {
+ "message": "30 sekúnd"
+ },
+ "oneMinute": {
+ "message": "1 minúta"
+ },
+ "twoMinutes": {
+ "message": "2 minúty"
+ },
+ "fiveMinutes": {
+ "message": "5 minút"
+ },
+ "fifteenMinutes": {
+ "message": "15 minút"
+ },
+ "thirtyMinutes": {
+ "message": "30 minút"
+ },
+ "oneHour": {
+ "message": "1 hodina"
+ },
+ "fourHours": {
+ "message": "4 hodiny"
+ },
+ "onLocked": {
+ "message": "Pri uzamknutí"
+ },
+ "onRestart": {
+ "message": "Po reštarte"
+ },
+ "never": {
+ "message": "Nikdy"
+ },
+ "security": {
+ "message": "Zabezpečenie"
+ },
+ "errorOccurred": {
+ "message": "Vyskytla sa chyba"
+ },
+ "emailRequired": {
+ "message": "Emailová adresa je povinná."
+ },
+ "invalidEmail": {
+ "message": "Neplatná emailová adresa."
+ },
+ "masterPassRequired": {
+ "message": "Hlavné heslo je povinné."
+ },
+ "masterPassLength": {
+ "message": "Hlavné heslo musí obsahovať aspoň 8 znakov."
+ },
+ "masterPassDoesntMatch": {
+ "message": "Potvrdenie hlavného hesla sa nezhoduje."
+ },
+ "newAccountCreated": {
+ "message": "Váš nový účet bol vytvorený! Teraz sa môžete prihlásiť."
+ },
+ "masterPassSent": {
+ "message": "Poslali sme vám email s nápovedou k hlavnému heslu."
+ },
+ "verificationCodeRequired": {
+ "message": "Overovací kód je povinný."
+ },
+ "valueCopied": {
+ "message": " skopírované",
+ "description": "Value has been copied to the clipboard.",
+ "placeholders": {
+ "value": {
+ "content": "$1",
+ "example": "Password"
+ }
+ }
+ },
+ "autofillError": {
+ "message": "Na tejto stránke sa nedajú automaticky vyplniť prihlasovacie údaje. Namiesto toho skopírujte/vložte prihlasovacie údaje manuálne."
+ },
+ "loggedOut": {
+ "message": "Odhlásený"
+ },
+ "loginExpired": {
+ "message": "Vaša relácia vypršala."
+ },
+ "logOutConfirmation": {
+ "message": "Naozaj sa chcete odhlásiť?"
+ },
+ "yes": {
+ "message": "Áno"
+ },
+ "no": {
+ "message": "Nie"
+ },
+ "unexpectedError": {
+ "message": "Vyskytla sa neočakávaná chyba."
+ },
+ "nameRequired": {
+ "message": "Meno je povinné."
+ },
+ "addedFolder": {
+ "message": "Pridaný priečinok"
+ },
+ "changeMasterPass": {
+ "message": "Zmeniť hlavné heslo"
+ },
+ "changeMasterPasswordConfirmation": {
+ "message": "Teraz si môžete zmeniť svoje hlavné heslo vo webovom trezore bitwarden.com. Chcete navštíviť túto stránku teraz?"
+ },
+ "twoStepLoginConfirmation": {
+ "message": "Dvojstupňové prihlasovanie robí váš účet bezpečnejším vďaka vyžadovaniu bezpečnostného kódu z overovacej aplikácie vždy, keď sa prihlásite. Dvojstupňové prihlasovanie môžete povoliť vo webovom trezore bitwarden.com. Chcete navštíviť túto stránku teraz?"
+ },
+ "editedFolder": {
+ "message": "Priečinok upravený"
+ },
+ "deleteFolderConfirmation": {
+ "message": "Naozaj chcete odstrániť tento priečinok?"
+ },
+ "deletedFolder": {
+ "message": "Odstránený priečinok"
+ },
+ "gettingStartedTutorial": {
+ "message": "Začiatočnícka príručka"
+ },
+ "gettingStartedTutorialVideo": {
+ "message": "Sledujte našu začiatočnícku príručku, aby ste sa naučili, ako získať maximum z nášho rozšírenia prehliadača."
+ },
+ "syncingComplete": {
+ "message": "Synchronizácia kompletná"
+ },
+ "syncingFailed": {
+ "message": "Synchronizácia zlyhala"
+ },
+ "passwordCopied": {
+ "message": "Heslo skopírované"
+ },
+ "uri": {
+ "message": "URI"
+ },
+ "uriPosition": {
+ "message": "URI $POSITION$",
+ "description": "A listing of URIs. Ex: URI 1, URI 2, URI 3, etc.",
+ "placeholders": {
+ "position": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "newUri": {
+ "message": "Nové URI"
+ },
+ "addedItem": {
+ "message": "Položka pridaná"
+ },
+ "editedItem": {
+ "message": "Položka upravená"
+ },
+ "deleteItemConfirmation": {
+ "message": "Naozaj chcete odstrániť túto položku?"
+ },
+ "deletedItem": {
+ "message": "Položka odstránená do koša"
+ },
+ "overwritePassword": {
+ "message": "Prepísať heslo"
+ },
+ "overwritePasswordConfirmation": {
+ "message": "Naozaj chcete prepísať aktuálne heslo?"
+ },
+ "searchFolder": {
+ "message": "Prehľadávať priečinok"
+ },
+ "searchCollection": {
+ "message": "Vyhľadať zbierku"
+ },
+ "searchType": {
+ "message": "Typ vyhľadávania"
+ },
+ "noneFolder": {
+ "message": "Žiadny priečinok",
+ "description": "This is the folder for uncategorized items"
+ },
+ "disableAddLoginNotification": {
+ "message": "Vypnúť notifikáciu Pridať prihlasovacie údaje"
+ },
+ "addLoginNotificationDesc": {
+ "message": "\"Notifikácia Pridať prihlasovacie údaje\" vás automaticky upozorní na uloženie nových údajov do vášho trezoru vždy, keď sa s nimi prihlasujete poprvýkrát."
+ },
+ "dontShowCardsCurrentTab": {
+ "message": "Nezobrazovať platobné karty na stránke \"Aktuálna karta\""
+ },
+ "dontShowCardsCurrentTabDesc": {
+ "message": "Položky kariet sa zobrazujú na stránke „Aktuálna karta“ pre ľahšie automatické vypĺňanie."
+ },
+ "dontShowIdentitiesCurrentTab": {
+ "message": "Nezobrazovať identity na stránke Karta"
+ },
+ "dontShowIdentitiesCurrentTabDesc": {
+ "message": "Identity z vášho trezoru sa zobrazujú na stránke \"Aktuálna karta\" pre ľahké automatické vypĺňanie."
+ },
+ "clearClipboard": {
+ "message": "Vymazať schránku",
+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
+ },
+ "clearClipboardDesc": {
+ "message": "Automaticky vymazať skopírované hodnoty zo schránky.",
+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
+ },
+ "notificationAddDesc": {
+ "message": "Má si pre vás Bitwarden zapamätať toto heslo?"
+ },
+ "notificationAddSave": {
+ "message": "Áno, uložiť teraz"
+ },
+ "notificationNeverSave": {
+ "message": "Nikdy pre túto stránku"
+ },
+ "disableChangedPasswordNotification": {
+ "message": "Vypnúť oznámenie o zmene hesla"
+ },
+ "disableChangedPasswordNotificationDesc": {
+ "message": "Oznámenie o zmene hesla sa vás automaticky opýta na aktualizáciu prihlasovacích údajov vo vašom trezore vždy, keď zistí, že ste ho zmenili na stránke."
+ },
+ "notificationChangeDesc": {
+ "message": "Chcete aktualizovať toto heslo v Bitwarden?"
+ },
+ "notificationChangeSave": {
+ "message": "Áno, aktualizovať"
+ },
+ "disableContextMenuItem": {
+ "message": "Vypnúť možnosti kontextového menu"
+ },
+ "disableContextMenuItemDesc": {
+ "message": "Možnosti kontextového menu ponúkajú rýchly prístup k prihlasovacím údajom a generovaniu hesiel pre stránku vo vašej aktuálnej karte."
+ },
+ "defaultUriMatchDetection": {
+ "message": "Predvolené mapovanie",
+ "description": "Default URI match detection for auto-fill."
+ },
+ "defaultUriMatchDetectionDesc": {
+ "message": "Vyberte si predvolený spôsob mapovania, ktorý bude použitý pre prihlasovacie údaje pri využití funkcí ako je napríklad automatické vypĺňanie hesiel."
+ },
+ "theme": {
+ "message": "Motív"
+ },
+ "themeDesc": {
+ "message": "Zmeniť motív aplikácie."
+ },
+ "dark": {
+ "message": "Tmavý",
+ "description": "Dark color"
+ },
+ "light": {
+ "message": "Svetlý",
+ "description": "Light color"
+ },
+ "solarizedDark": {
+ "message": "Tmavá – Solarized",
+ "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated."
+ },
+ "exportVault": {
+ "message": "Export trezoru"
+ },
+ "fileFormat": {
+ "message": "Formát Súboru"
+ },
+ "warning": {
+ "message": "UPOZORNENIE",
+ "description": "WARNING (should stay in capitalized letters if the language permits)"
+ },
+ "confirmVaultExport": {
+ "message": "Potvrdiť export trezoru"
+ },
+ "exportWarningDesc": {
+ "message": "Tento export obsahuje vaše dáta v nešifrovanom formáte. Nemali by ste ich ukladať, ani posielať cez nezabezpečené kanály (napr. email). Okamžite ho odstráňte, keď ho prestanete používať."
+ },
+ "encExportKeyWarningDesc": {
+ "message": "Tento export zašifruje vaše údaje pomocou šifrovacieho kľúča vášho účtu. Ak niekedy budete rotovať šifrovací kľúč svojho účtu, mali by ste exportovať znova, pretože nebudete môcť dešifrovať tento exportovaný súbor."
+ },
+ "encExportAccountWarningDesc": {
+ "message": "Šifrovacie kľúče účtu sú jedinečné pre každý používateľský účet Bitwarden, takže nemôžete importovať šifrovaný export do iného účtu."
+ },
+ "exportMasterPassword": {
+ "message": "Zadajte vaše hlavné heslo pre export údajov trezoru."
+ },
+ "shared": {
+ "message": "Zdieľané"
+ },
+ "learnOrg": {
+ "message": "Zistiť viac o organizáciách"
+ },
+ "learnOrgConfirmation": {
+ "message": "Bitwarden vám umožňuje zdieľať vaše položky trezora s ostatnými pomocou organizácie. Chcete navštíviť webovú stránku bitwarden.com a dozvedieť sa viac?"
+ },
+ "moveToOrganization": {
+ "message": "Presunúť do organizácie"
+ },
+ "share": {
+ "message": "Zdieľať"
+ },
+ "movedItemToOrg": {
+ "message": "$ITEMNAME$ presunuté do $ORGNAME$",
+ "placeholders": {
+ "itemname": {
+ "content": "$1",
+ "example": "Secret Item"
+ },
+ "orgname": {
+ "content": "$2",
+ "example": "Company Name"
+ }
+ }
+ },
+ "moveToOrgDesc": {
+ "message": "Vyberte organizáciu, do ktorej chcete presunúť túto položku. Presunom do organizácie sa vlastníctvo položky prenáša na túto organizáciu. Po presunutí už nebudete priamym vlastníkom danej položky."
+ },
+ "learnMore": {
+ "message": "Zistiť viac"
+ },
+ "authenticatorKeyTotp": {
+ "message": "Kľúč overovateľa (TOTP)"
+ },
+ "verificationCodeTotp": {
+ "message": "Overovací kód (TOTP)"
+ },
+ "copyVerificationCode": {
+ "message": "Kopírovať overovací kód"
+ },
+ "attachments": {
+ "message": "Prílohy"
+ },
+ "deleteAttachment": {
+ "message": "Odstrániť prílohu"
+ },
+ "deleteAttachmentConfirmation": {
+ "message": "Naozaj chcete odstrániť túto prílohu?"
+ },
+ "deletedAttachment": {
+ "message": "Odstránená príloha"
+ },
+ "newAttachment": {
+ "message": "Pridať novú prílohu"
+ },
+ "noAttachments": {
+ "message": "Žiadne prílohy."
+ },
+ "attachmentSaved": {
+ "message": "Príloha bola uložená."
+ },
+ "file": {
+ "message": "Súbor"
+ },
+ "selectFile": {
+ "message": "Vybrať súbor."
+ },
+ "maxFileSize": {
+ "message": "Maximálna veľkosť súboru je 500 MB."
+ },
+ "featureUnavailable": {
+ "message": "Funkcia nie je k dispozícii"
+ },
+ "updateKey": {
+ "message": "Túto funkciu nemožno použiť, pokým neaktualizujete svoj šifrovací kľúč."
+ },
+ "premiumMembership": {
+ "message": "Prémiové členstvo"
+ },
+ "premiumManage": {
+ "message": "Spravovať členstvo"
+ },
+ "premiumManageAlert": {
+ "message": "Svoje členstvo môžete spravovať vo webovom trezore bitwarden.com. Chcete navštíviť túto stránku teraz?"
+ },
+ "premiumRefresh": {
+ "message": "Obnoviť členstvo"
+ },
+ "premiumNotCurrentMember": {
+ "message": "Momentálne nie ste prémiovým členom."
+ },
+ "premiumSignUpAndGet": {
+ "message": "Zaregistrujte sa pre prémiové členstvo a získajte:"
+ },
+ "ppremiumSignUpStorage": {
+ "message": "1 GB šifrovaného úložiska."
+ },
+ "ppremiumSignUpTwoStep": {
+ "message": "Ďalšie možnosti dvojstupňového prihlásenia ako YubiKey, FIDO U2F a Duo."
+ },
+ "ppremiumSignUpReports": {
+ "message": "Správy o sile hesla, zabezpečení účtov a únikoch dát ktoré vám pomôžu udržať vaše kontá v bezpečí."
+ },
+ "ppremiumSignUpTotp": {
+ "message": "Generátor TOTP verifikačného kódu (2FA) pre prihlásenie do vášho trezora."
+ },
+ "ppremiumSignUpSupport": {
+ "message": "Prioritná zákaznícka podpora."
+ },
+ "ppremiumSignUpFuture": {
+ "message": "Všetky budúce prémiové funkcie. Viac už čoskoro!"
+ },
+ "premiumPurchase": {
+ "message": "Zakúpiť Prémiový účet"
+ },
+ "premiumPurchaseAlert": {
+ "message": "Svoje prémiové členstvo môžete zakúpiť vo webovom trezore bitwarden.com. Chcete navštíviť túto stránku teraz?"
+ },
+ "premiumCurrentMember": {
+ "message": "Ste prémiovým členom!"
+ },
+ "premiumCurrentMemberThanks": {
+ "message": "Ďakujeme, že podporujete Bitwarden."
+ },
+ "premiumPrice": {
+ "message": "Všetko len za %price% /rok!",
+ "placeholders": {
+ "price": {
+ "content": "$1",
+ "example": "$10"
+ }
+ }
+ },
+ "refreshComplete": {
+ "message": "Obnova kompletná"
+ },
+ "disableAutoTotpCopy": {
+ "message": "Vypnúť automatické kopírovanie TOTP"
+ },
+ "disableAutoTotpCopyDesc": {
+ "message": "Ak je kľúč overovateľa spojený s vašim prihlásením, TOTP verifikačný kód bude automaticky skopírovaný do schránky vždy, keď použijete automatické vypĺňanie."
+ },
+ "disableAutoBiometricsPrompt": {
+ "message": "Pri spustení nevyžadovať biometrické údaje"
+ },
+ "premiumRequired": {
+ "message": "Vyžaduje prémiový účet"
+ },
+ "premiumRequiredDesc": {
+ "message": "Pre použitie tejto funkcie je potrebné prémiové členstvo."
+ },
+ "enterVerificationCodeApp": {
+ "message": "Zadajte 6-miestny verifikačný kód z vašej overovacej aplikácie."
+ },
+ "enterVerificationCodeEmail": {
+ "message": "Zadajte 6-miestny verifikačný kód, ktorý vám bol zaslaný emailom",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "example@gmail.com"
+ }
+ }
+ },
+ "verificationCodeEmailSent": {
+ "message": "Overovací e-mail odoslaný na $EMAIL$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "example@gmail.com"
+ }
+ }
+ },
+ "rememberMe": {
+ "message": "Zapamätať si ma"
+ },
+ "sendVerificationCodeEmailAgain": {
+ "message": "Znovu zaslať overovací kód emailom"
+ },
+ "useAnotherTwoStepMethod": {
+ "message": "Použiť inú dvojstupňovú metódu prihlásenia"
+ },
+ "insertYubiKey": {
+ "message": "Vložte váš YubiKey do USB portu počítača a stlačte jeho tlačidlo."
+ },
+ "insertU2f": {
+ "message": "Vložte váš bezpečnostný kľúč do USB portu počítača. Ak má tlačidlo, stlačte ho."
+ },
+ "webAuthnNewTab": {
+ "message": "V overovaní cez WebAuthn 2FA pokračujte na ďalšej záložke."
+ },
+ "webAuthnNewTabOpen": {
+ "message": "Otvoriť v novej karte"
+ },
+ "webAuthnAuthenticate": {
+ "message": "Overiť cez WebAuthn"
+ },
+ "loginUnavailable": {
+ "message": "Prihlasovací údaj nedostupný"
+ },
+ "noTwoStepProviders": {
+ "message": "Tento účet má povolené dvojstupňové prihlásenie, ale žiadny z nakonfigurovaných poskytovateľov nie je podporovaný týmto prehliadačom."
+ },
+ "noTwoStepProviders2": {
+ "message": "Prosím, použite podporovaný prehliadač (napríklad Chrome) a/alebo pridajte iných poskytovateľov, ktorí sú lepšie podporovaní prehliadačmi (ako napríklad overovacia aplikácia)."
+ },
+ "twoStepOptions": {
+ "message": "Možnosti dvojstupňového prihlásenia"
+ },
+ "recoveryCodeDesc": {
+ "message": "Stratili ste prístup ku všetkým vašim dvojstupňovým poskytovateľom? Použite váš záchranný kód pre vypnutie všetkých poskytovateľov vo vašom účte."
+ },
+ "recoveryCodeTitle": {
+ "message": "Záchranný kód"
+ },
+ "authenticatorAppTitle": {
+ "message": "Overovacia aplikácia"
+ },
+ "authenticatorAppDesc": {
+ "message": "Použite overovaciu aplikáciu (napríklad Authy alebo Google Authenticator) na generovanie časovo obmedzených overovacích kódov.",
+ "description": "'Authy' and 'Google Authenticator' are product names and should not be translated."
+ },
+ "yubiKeyTitle": {
+ "message": "YubiKey OTP bezpečnostný kľúč"
+ },
+ "yubiKeyDesc": {
+ "message": "Použiť YubiKey pre prístup k vášmu účtu. Pracuje s YubiKey 4, 4 Nano, 4C a s NEO zariadeniami."
+ },
+ "duoDesc": {
+ "message": "Overiť s Duo Security použitím Duo Mobile aplikácie, SMS, telefonátu alebo U2F bezpečnostným kľúčom.",
+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
+ },
+ "duoOrganizationDesc": {
+ "message": "Overiť s Duo Security vašej organizácie použitím Duo Mobile aplikácie, SMS, telefonátu alebo U2F bezpečnostným kľúčom.",
+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
+ },
+ "webAuthnTitle": {
+ "message": "FIDO2 WebAuthn"
+ },
+ "webAuthnDesc": {
+ "message": "Použiť akýkoľvek WebAuthn bezpečnostný kľúč pre prístup k vášmu účtu."
+ },
+ "emailTitle": {
+ "message": "Email"
+ },
+ "emailDesc": {
+ "message": "Verifikačné kódy vám budú zaslané emailom."
+ },
+ "selfHostedEnvironment": {
+ "message": "Sebou hosťované prostredie"
+ },
+ "selfHostedEnvironmentFooter": {
+ "message": "Zadajte základnú URL adresu lokálne hosťovanej inštalácie Bitwarden."
+ },
+ "customEnvironment": {
+ "message": "Vlastné prostredie"
+ },
+ "customEnvironmentFooter": {
+ "message": "Pre pokročilých používateľov. Môžete špecifikovať základnú URL pre každú službu nezávisle."
+ },
+ "baseUrl": {
+ "message": "URL servera"
+ },
+ "apiUrl": {
+ "message": "URL API servera"
+ },
+ "webVaultUrl": {
+ "message": "URL servera webového trezora"
+ },
+ "identityUrl": {
+ "message": "URL servera identít"
+ },
+ "notificationsUrl": {
+ "message": "URL adresa servera pre oznámenia"
+ },
+ "iconsUrl": {
+ "message": "URL servera ikôn"
+ },
+ "environmentSaved": {
+ "message": "URL prostredia boli uložené."
+ },
+ "enableAutoFillOnPageLoad": {
+ "message": "Povoliť automatické vypĺňanie pri načítaní stránky"
+ },
+ "enableAutoFillOnPageLoadDesc": {
+ "message": "Ak je prihlasovací formulár detegovaný, automaticky vykonať vypĺňanie pri načítaní stránky."
+ },
+ "experimentalFeature": {
+ "message": "Toto je zatiaľ experimentálna funkcia. Použite na vlastné riziko."
+ },
+ "defaultAutoFillOnPageLoad": {
+ "message": "Predvolené nastavenie automatického vypĺňania pre prihlasovacie položky"
+ },
+ "defaultAutoFillOnPageLoadDesc": {
+ "message": "Po zapnutí funkcie Automatické vypĺňanie pri načítaní stránky môžete túto funkciu zapnúť alebo vypnúť pre jednotlivé položky prihlásenia. Toto je predvolené nastavenie pre prihlasovacie položky, ktoré nie sú samostatne nakonfigurované."
+ },
+ "itemAutoFillOnPageLoad": {
+ "message": "Automatické vypĺňanie pri načítaní stránky (ak je povolené v možnostiach)"
+ },
+ "autoFillOnPageLoadUseDefault": {
+ "message": "Pôvodné nastavenia"
+ },
+ "autoFillOnPageLoadYes": {
+ "message": "Automatické vypĺňanie pri načítaní stránky"
+ },
+ "autoFillOnPageLoadNo": {
+ "message": "Nevypĺňať automaticky pri načítaní stránky"
+ },
+ "commandOpenPopup": {
+ "message": "Otvoriť vyskakovacie okno trezora"
+ },
+ "commandOpenSidebar": {
+ "message": "Otvoriť trezor v bočnom paneli"
+ },
+ "commandAutofillDesc": {
+ "message": "Automaticky vyplniť naposledy použité prihlasovacie údaje pre túto stránku"
+ },
+ "commandGeneratePasswordDesc": {
+ "message": "Vygenerovať a skopírovať nové náhodné heslo do schránky"
+ },
+ "commandLockVaultDesc": {
+ "message": "Zamknúť trezor"
+ },
+ "privateModeMessage": {
+ "message": "Bohužiaľ, toto okno nie je dostupné v privátnom režime prehliadača."
+ },
+ "customFields": {
+ "message": "Vlastné polia"
+ },
+ "copyValue": {
+ "message": "Kopírovať hodnotu"
+ },
+ "value": {
+ "message": "Hodnota"
+ },
+ "newCustomField": {
+ "message": "Nové vlastné pole"
+ },
+ "dragToSort": {
+ "message": "Zoradiť presúvaním"
+ },
+ "cfTypeText": {
+ "message": "Text"
+ },
+ "cfTypeHidden": {
+ "message": "Skryté"
+ },
+ "cfTypeBoolean": {
+ "message": "Boolean"
+ },
+ "popup2faCloseMessage": {
+ "message": "Kliknutie mimo popup okna na prezretie vášho emailu pre overovací kód spôsobí zavretie tohto popupu. Chcete otvoriť tento popup v novom okne tak, aby sa nezavrel?"
+ },
+ "popupU2fCloseMessage": {
+ "message": "Tento prehliadač nedokáže spracovať U2F požiadavku v popup okne. Chcete ho otvoriť v novom okne aby ste sa mohli prihlásiť pomocou U2F?"
+ },
+ "disableFavicon": {
+ "message": "Nezobrazovať ikony stránok"
+ },
+ "disableFaviconDesc": {
+ "message": "Ikony stránok poskytujú rozoznateľný obrázok vedľa každého prihlasovacieho údaju vo webovom trezore."
+ },
+ "disableBadgeCounter": {
+ "message": "Zakázať počítadlo na ikone"
+ },
+ "disableBadgeCounterDesc": {
+ "message": "Zakáže počítadlo na ikone, ktoré zobrazuje počet prihlasovacích údajov v trezore pre aktuálnu stránku."
+ },
+ "cardholderName": {
+ "message": "Meno vlastníka karty"
+ },
+ "number": {
+ "message": "Číslo"
+ },
+ "brand": {
+ "message": "Značka"
+ },
+ "expirationMonth": {
+ "message": "Mesiac expirácie"
+ },
+ "expirationYear": {
+ "message": "Rok expirácie"
+ },
+ "expiration": {
+ "message": "Expirácia"
+ },
+ "january": {
+ "message": "Január"
+ },
+ "february": {
+ "message": "Február"
+ },
+ "march": {
+ "message": "Marec"
+ },
+ "april": {
+ "message": "Apríl"
+ },
+ "may": {
+ "message": "Máj"
+ },
+ "june": {
+ "message": "Jún"
+ },
+ "july": {
+ "message": "Júl"
+ },
+ "august": {
+ "message": "August"
+ },
+ "september": {
+ "message": "September"
+ },
+ "october": {
+ "message": "Október"
+ },
+ "november": {
+ "message": "November"
+ },
+ "december": {
+ "message": "December"
+ },
+ "securityCode": {
+ "message": "Bezpečnostný kód"
+ },
+ "ex": {
+ "message": "napr."
+ },
+ "title": {
+ "message": "Oslovenie"
+ },
+ "mr": {
+ "message": "Pán"
+ },
+ "mrs": {
+ "message": "Pani"
+ },
+ "ms": {
+ "message": "Slečna"
+ },
+ "dr": {
+ "message": "Dr"
+ },
+ "firstName": {
+ "message": "Krstné meno"
+ },
+ "middleName": {
+ "message": "Druhé meno"
+ },
+ "lastName": {
+ "message": "Priezvisko"
+ },
+ "identityName": {
+ "message": "Názov identity"
+ },
+ "company": {
+ "message": "Spoločnosť"
+ },
+ "ssn": {
+ "message": "Číslo poistenca sociálnej poisťovne"
+ },
+ "passportNumber": {
+ "message": "Číslo pasu"
+ },
+ "licenseNumber": {
+ "message": "Číslo vodičského preukazu"
+ },
+ "email": {
+ "message": "Email"
+ },
+ "phone": {
+ "message": "Telefón"
+ },
+ "address": {
+ "message": "Adresa"
+ },
+ "address1": {
+ "message": "Adresa 1"
+ },
+ "address2": {
+ "message": "Adresa 2"
+ },
+ "address3": {
+ "message": "Adresa 3"
+ },
+ "cityTown": {
+ "message": "Mesto"
+ },
+ "stateProvince": {
+ "message": "Región"
+ },
+ "zipPostalCode": {
+ "message": "PSČ"
+ },
+ "country": {
+ "message": "Krajina"
+ },
+ "type": {
+ "message": "Typ"
+ },
+ "typeLogin": {
+ "message": "Prihlásenie"
+ },
+ "typeLogins": {
+ "message": "Prihlasovacie údaje"
+ },
+ "typeSecureNote": {
+ "message": "Zabezpečená poznámka"
+ },
+ "typeCard": {
+ "message": "Karta"
+ },
+ "typeIdentity": {
+ "message": "Identita"
+ },
+ "passwordHistory": {
+ "message": "História hesla"
+ },
+ "back": {
+ "message": "Späť"
+ },
+ "collections": {
+ "message": "Zbierky"
+ },
+ "favorites": {
+ "message": "Obľúbené"
+ },
+ "popOutNewWindow": {
+ "message": "Otvoriť v novom okne"
+ },
+ "refresh": {
+ "message": "Obnoviť"
+ },
+ "cards": {
+ "message": "Karty"
+ },
+ "identities": {
+ "message": "Identity"
+ },
+ "logins": {
+ "message": "Prihlasovacie údaje"
+ },
+ "secureNotes": {
+ "message": "Zabezpečené poznámky"
+ },
+ "clear": {
+ "message": "Vyčistiť",
+ "description": "To clear something out. example: To clear browser history."
+ },
+ "checkPassword": {
+ "message": "Overiť či došlo k úniku hesla."
+ },
+ "passwordExposed": {
+ "message": "Toto heslo uniklo $VALUE$ krát. Mali by ste ho zmeniť.",
+ "placeholders": {
+ "value": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "passwordSafe": {
+ "message": "Heslo nebolo nájdene v žiadnom úniku dát. Malo by byť bezpečné."
+ },
+ "baseDomain": {
+ "message": "Základná doména"
+ },
+ "host": {
+ "message": "Hostiteľ",
+ "description": "A URL's host value. For example, the host of https://sub.domain.com:443 is 'sub.domain.com:443'."
+ },
+ "exact": {
+ "message": "Presný"
+ },
+ "startsWith": {
+ "message": "Začína na"
+ },
+ "regEx": {
+ "message": "Regulárny výraz",
+ "description": "A programming term, also known as 'RegEx'."
+ },
+ "matchDetection": {
+ "message": "Spôsob mapovania",
+ "description": "URI match detection for auto-fill."
+ },
+ "defaultMatchDetection": {
+ "message": "Predvolené mapovanie",
+ "description": "Default URI match detection for auto-fill."
+ },
+ "toggleOptions": {
+ "message": "Voľby prepínača"
+ },
+ "toggleCurrentUris": {
+ "message": "Prepnúť zobrazovanie aktuálnej URI",
+ "description": "Toggle the display of the URIs of the currently open tabs in the browser."
+ },
+ "currentUri": {
+ "message": "Aktuálna URI",
+ "description": "The URI of one of the current open tabs in the browser."
+ },
+ "organization": {
+ "message": "Organizácia",
+ "description": "An entity of multiple related people (ex. a team or business organization)."
+ },
+ "types": {
+ "message": "Typy"
+ },
+ "allItems": {
+ "message": "Všetky položky"
+ },
+ "noPasswordsInList": {
+ "message": "Neboli nájdené žiadne heslá."
+ },
+ "remove": {
+ "message": "Odstrániť"
+ },
+ "default": {
+ "message": "Predvolené"
+ },
+ "dateUpdated": {
+ "message": "Aktualizované",
+ "description": "ex. Date this item was updated"
+ },
+ "datePasswordUpdated": {
+ "message": "Heslo bolo aktualizované",
+ "description": "ex. Date this password was updated"
+ },
+ "neverLockWarning": {
+ "message": "Ste si istí, že chcete použiť možnosť \"Nikdy\"? Táto predvoľba ukladá šifrovací kľúč od trezora priamo na zariadení. Ak použijete túto možnosť, mali by ste svoje zariadenie náležite zabezpečiť."
+ },
+ "noOrganizationsList": {
+ "message": "Nie ste členom žiadnej organizácie. Organizácie umožňujú bezpečne zdieľať položky s ostatnými používateľmi."
+ },
+ "noCollectionsInList": {
+ "message": "Neexistujú žiadne zbierky na zobrazenie."
+ },
+ "ownership": {
+ "message": "Vlastníctvo"
+ },
+ "whoOwnsThisItem": {
+ "message": "Kto vlastní túto položku?"
+ },
+ "strong": {
+ "message": "Silné",
+ "description": "ex. A strong password. Scale: Weak -> Good -> Strong"
+ },
+ "good": {
+ "message": "Dobré",
+ "description": "ex. A good password. Scale: Weak -> Good -> Strong"
+ },
+ "weak": {
+ "message": "Slabé",
+ "description": "ex. A weak password. Scale: Weak -> Good -> Strong"
+ },
+ "weakMasterPassword": {
+ "message": "Slabé hlavné heslo"
+ },
+ "weakMasterPasswordDesc": {
+ "message": "Hlavné heslo, ktoré ste zadali, je slabé. Mali by ste použiť silné heslo (alebo frázu), aby ste spoľahlivo ochránili váš Bitwarden účet. Naozaj chcete použiť toto heslo?"
+ },
+ "pin": {
+ "message": "PIN",
+ "description": "PIN code. Ex. The short code (often numeric) that you use to unlock a device."
+ },
+ "unlockWithPin": {
+ "message": "Odomknúť s PIN"
+ },
+ "setYourPinCode": {
+ "message": "Nastaviť kód PIN na odomykanie Bitwardenu. Nastavenie PIN sa vynuluje, ak sa úplne odhlásite z aplikácie."
+ },
+ "pinRequired": {
+ "message": "Kód PIN je povinný."
+ },
+ "invalidPin": {
+ "message": "Neplatný PIN kód."
+ },
+ "verifyPin": {
+ "message": "Overiť PIN"
+ },
+ "yourVaultIsLockedPinCode": {
+ "message": "Váš trezor je uzamknutý. Overte sa PIN kódom ak chcete pokračovať."
+ },
+ "unlockWithBiometrics": {
+ "message": "Odomknúť pomocou biometrie"
+ },
+ "awaitDesktop": {
+ "message": "Čaká sa na potvrdenie z desktopu"
+ },
+ "awaitDesktopDesc": {
+ "message": "Ak chcete povoliť biometriu pre prehliadač, potvrďte použitie biometrie v aplikácii Bitwarden Desktop."
+ },
+ "lockWithMasterPassOnRestart": {
+ "message": "Pri reštarte prehliadača zamknúť s hlavným heslom"
+ },
+ "selectOneCollection": {
+ "message": "Musíte vybrať aspoň jednu zbierku."
+ },
+ "cloneItem": {
+ "message": "Klonovať položku"
+ },
+ "clone": {
+ "message": "Klonovať"
+ },
+ "passwordGeneratorPolicyInEffect": {
+ "message": "Jedno alebo viac nastavení organizácie ovplyvňujú vaše nastavenia generátora."
+ },
+ "vaultTimeoutAction": {
+ "message": "Akcia pri vypršaní času pre trezor"
+ },
+ "lock": {
+ "message": "Uzamknúť",
+ "description": "Verb form: to make secure or inaccesible by"
+ },
+ "trash": {
+ "message": "Kôš",
+ "description": "Noun: a special folder to hold deleted items"
+ },
+ "searchTrash": {
+ "message": "Hľadať v koši"
+ },
+ "permanentlyDeleteItem": {
+ "message": "Natrvalo odstrániť položku"
+ },
+ "permanentlyDeleteItemConfirmation": {
+ "message": "Naozaj chcete narvalo odstrániť túto položku?"
+ },
+ "permanentlyDeletedItem": {
+ "message": "Natrvalo odstrániť položku"
+ },
+ "restoreItem": {
+ "message": "Obnoviť položku"
+ },
+ "restoreItemConfirmation": {
+ "message": "Naozaj chcete obnoviť túto položku?"
+ },
+ "restoredItem": {
+ "message": "Obnovená položka"
+ },
+ "vaultTimeoutLogOutConfirmation": {
+ "message": "Odhlásenie bude vyžadovať online prihlásenie po vypršaní časového limitu. Naozaj chcete použiť toto nastavenie?"
+ },
+ "vaultTimeoutLogOutConfirmationTitle": {
+ "message": "Potvrdenie akcie pre vypršaný časový limit"
+ },
+ "autoFillAndSave": {
+ "message": "Auto-vyplniť a Uložiť"
+ },
+ "autoFillSuccessAndSavedUri": {
+ "message": "Automatické vypĺnenie a uloženie úspešné"
+ },
+ "autoFillSuccess": {
+ "message": "Automaticky vyplnené"
+ },
+ "setMasterPassword": {
+ "message": "Nastaviť hlavné heslo"
+ },
+ "masterPasswordPolicyInEffect": {
+ "message": "Jedno alebo viac pravidiel organizácie požadujú aby vaše hlavné heslo spĺňalo nasledujúce požiadavky:"
+ },
+ "policyInEffectMinComplexity": {
+ "message": "Minimálna úroveň zložitosti $SCORE$",
+ "placeholders": {
+ "score": {
+ "content": "$1",
+ "example": "4"
+ }
+ }
+ },
+ "policyInEffectMinLength": {
+ "message": "Minimálna dĺžka $LENGTH$",
+ "placeholders": {
+ "length": {
+ "content": "$1",
+ "example": "14"
+ }
+ }
+ },
+ "policyInEffectUppercase": {
+ "message": "Obsahuje aspoň jedno veľké písmeno"
+ },
+ "policyInEffectLowercase": {
+ "message": "Obsahuje aspoň jedno malé písmeno"
+ },
+ "policyInEffectNumbers": {
+ "message": "Obsahuje aspoň jednu číslicu"
+ },
+ "policyInEffectSpecial": {
+ "message": "Obsahuje aspoň jeden z následujúcich špeciálnych znakov $CHARS$",
+ "placeholders": {
+ "chars": {
+ "content": "$1",
+ "example": "!@#$%^&*"
+ }
+ }
+ },
+ "masterPasswordPolicyRequirementsNotMet": {
+ "message": "Vaše nové heslo nespĺňa pravidlá."
+ },
+ "acceptPolicies": {
+ "message": "Označením tohto políčka súhlasíte s nasledovným:"
+ },
+ "acceptPoliciesError": {
+ "message": "Neboli akceptované Podmienky používania a zásady Ochrany osobných údajov."
+ },
+ "termsOfService": {
+ "message": "Podmienky používania"
+ },
+ "privacyPolicy": {
+ "message": "Zásady ochrany osobných údajov"
+ },
+ "hintEqualsPassword": {
+ "message": "Nápoveda pre heslo nemôže byť rovnaká ako heslo."
+ },
+ "ok": {
+ "message": "Ok"
+ },
+ "desktopSyncVerificationTitle": {
+ "message": "Overenie synchronizácie desktopu"
+ },
+ "desktopIntegrationVerificationText": {
+ "message": "Prosím, overte, že desktopová aplikácia zobrazuje tento odtlačok: "
+ },
+ "desktopIntegrationDisabledTitle": {
+ "message": "Integrácia v prehliadači nie je povolená"
+ },
+ "desktopIntegrationDisabledDesc": {
+ "message": "Integrácia v prehliadači nie je povolená v aplikácii Bitwarden Desktop. Prosím, povoľte ju v nastaveniach desktopovej aplikácie."
+ },
+ "startDesktopTitle": {
+ "message": "Spustiť desktopovú aplikáciu Bitwarden Desktop"
+ },
+ "startDesktopDesc": {
+ "message": "Aplikácia Bitwarden Desktop musí byť pred použitím tejto funkcie spustená."
+ },
+ "errorEnableBiometricTitle": {
+ "message": "Nie je môžné povoliť biometriu"
+ },
+ "errorEnableBiometricDesc": {
+ "message": "Akcia bola zrušená desktopovou aplikáciou"
+ },
+ "nativeMessagingInvalidEncryptionDesc": {
+ "message": "Desktopová aplikácia pre počítač zneplatnila zabezpečený komunikačný kanál. Skúste túto operáciu znova"
+ },
+ "nativeMessagingInvalidEncryptionTitle": {
+ "message": "Komunikácia s desktopom prerušená"
+ },
+ "nativeMessagingWrongUserDesc": {
+ "message": "Táto desktopová aplikácia je prihlásená do iného účtu. Zaistite, aby boli obe aplikácie prihlásené do rovnakého účtu."
+ },
+ "nativeMessagingWrongUserTitle": {
+ "message": "Nezhoda účtu"
+ },
+ "biometricsNotEnabledTitle": {
+ "message": "Biometria nie je povolená"
+ },
+ "biometricsNotEnabledDesc": {
+ "message": "Biometria v prehliadači vyžaduje, aby bola povolená biometria v desktopovej aplikácii."
+ },
+ "biometricsNotSupportedTitle": {
+ "message": "Biometria nie je podporovaná"
+ },
+ "biometricsNotSupportedDesc": {
+ "message": "Biometria v prehliadači nie je podporovaná na tomto zariadení."
+ },
+ "nativeMessaginPermissionErrorTitle": {
+ "message": "Povolenie nebolo udelené"
+ },
+ "nativeMessaginPermissionErrorDesc": {
+ "message": "Bez oprávnenia komunikovať s aplikáciou Bitwarden Desktop nemôžeme poskytnúť biometriu v rozšírení prehliadača. Skúste to znova."
+ },
+ "nativeMessaginPermissionSidebarTitle": {
+ "message": "Chyba žiadosti o povolenie"
+ },
+ "nativeMessaginPermissionSidebarDesc": {
+ "message": "Túto akciu nie je možné vykonať na bočnom paneli. Skúste to znova vo vyskakovacom alebo samostatnom okne."
+ },
+ "personalOwnershipSubmitError": {
+ "message": "Z dôvodu podnikovej politiky máte obmedzené ukladanie položiek do osobného trezora. Zmeňte možnosť vlastníctvo na organizáciu a vyberte si z dostupných zbierok."
+ },
+ "personalOwnershipPolicyInEffect": {
+ "message": "Politika organizácie ovplyvňuje vaše možnosti vlastníctva."
+ },
+ "excludedDomains": {
+ "message": "Vylúčené domény"
+ },
+ "excludedDomainsDesc": {
+ "message": "Bitwarden nebude požadovať ukladanie prihlasovacích údajov pre tieto domény. Aby sa zmeny prejavili, musíte stránku obnoviť."
+ },
+ "excludedDomainsInvalidDomain": {
+ "message": "$DOMAIN$ nie je platná doména",
+ "placeholders": {
+ "domain": {
+ "content": "$1",
+ "example": "googlecom"
+ }
+ }
+ },
+ "send": {
+ "message": "Odoslať",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "searchSends": {
+ "message": "Hľadať Sends",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "addSend": {
+ "message": "Pridať Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTypeText": {
+ "message": "Text"
+ },
+ "sendTypeFile": {
+ "message": "Súbor"
+ },
+ "allSends": {
+ "message": "Všetky Sends",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "maxAccessCountReached": {
+ "message": "Bol dosiahnutý maximálny počet prístupov"
+ },
+ "expired": {
+ "message": "Expirované"
+ },
+ "pendingDeletion": {
+ "message": "Čakajúce odstránenie"
+ },
+ "passwordProtected": {
+ "message": "Chránené heslom"
+ },
+ "copySendLink": {
+ "message": "Kopírovať odkaz na Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "removePassword": {
+ "message": "Odstrániť heslo"
+ },
+ "delete": {
+ "message": "Odstrániť"
+ },
+ "removedPassword": {
+ "message": "Heslo odstránené"
+ },
+ "deletedSend": {
+ "message": "Odstrániť Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendLink": {
+ "message": "Odkaz na Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "disabled": {
+ "message": "Zakázané"
+ },
+ "removePasswordConfirmation": {
+ "message": "Ste si istý, že chcete odstrániť heslo?"
+ },
+ "deleteSend": {
+ "message": "Odstrániť Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "deleteSendConfirmation": {
+ "message": "Ste si istý, že chcete odstrániť Send?",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "editSend": {
+ "message": "Upraviť Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTypeHeader": {
+ "message": "Aký typ Sendu to je?",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendNameDesc": {
+ "message": "Priateľský názov pre popísanie tohto Sendu.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendFileDesc": {
+ "message": "Súbor, ktorý chcete odoslať."
+ },
+ "deletionDate": {
+ "message": "Dátum odstránenia"
+ },
+ "deletionDateDesc": {
+ "message": "Send bude natrvalo odstránený v zadaný dátum a čas.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "expirationDate": {
+ "message": "Dátum exspirácie"
+ },
+ "expirationDateDesc": {
+ "message": "Ak je nastavené, prístup k tomuto Sendu vyprší v zadaný dátum a čas.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "oneDay": {
+ "message": "1 deň"
+ },
+ "days": {
+ "message": "$DAYS$ dní",
+ "placeholders": {
+ "days": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "custom": {
+ "message": "Vlastné"
+ },
+ "maximumAccessCount": {
+ "message": "Maximálny počet prístupov"
+ },
+ "maximumAccessCountDesc": {
+ "message": "Ak je nastavené, používatelia už nebudú mať prístup k tomuto Sendu po dosiahnutí maximálneho počtu prístupov.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendPasswordDesc": {
+ "message": "Voliteľne môžete vyžadovať heslo pre používateľov na prístup k tomuto Sendu.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendNotesDesc": {
+ "message": "Zabezpečená poznámka o tomto Sende.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendDisableDesc": {
+ "message": "Vypnúť tento Send, aby k nemu nikto nemal prístup.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendShareDesc": {
+ "message": "Pri uložení kopírovať odkaz na Send do schránky.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTextDesc": {
+ "message": "Text, ktorý chcete odoslať."
+ },
+ "sendHideText": {
+ "message": "Predvolene skryť text tohto Sendu.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "currentAccessCount": {
+ "message": "Súčasný počet prístupov"
+ },
+ "createSend": {
+ "message": "Vytvoriť nový Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "newPassword": {
+ "message": "Nové heslo"
+ },
+ "sendDisabled": {
+ "message": "Send zakázaný",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendDisabledWarning": {
+ "message": "Z dôvodu podnikovej politiky môžete odstrániť iba existujúci Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "createdSend": {
+ "message": "Send vytvorený",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "editedSend": {
+ "message": "Send upravený",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendLinuxChromiumFileWarning": {
+ "message": "Ak chcete zvoliť súbor, otvorte rozšírenie v bočnom paneli (ak je to možné) alebo kliknite do tohto okna kliknutím na tento banner."
+ },
+ "sendFirefoxFileWarning": {
+ "message": "Ak chcete zvoliť súbor pomocou prehliadača Firefox, otvorte rozšírenie v bočnom paneli alebo kliknite do tohto okna kliknutím na tento banner."
+ },
+ "sendSafariFileWarning": {
+ "message": "Ak chcete zvoliť súbor pomocou Safari, kliknite na tento banner a otvorte nové okno."
+ },
+ "sendFileCalloutHeader": {
+ "message": "Skôr než začnete"
+ },
+ "sendFirefoxCustomDatePopoutMessage1": {
+ "message": "Ak chcete použiť pre výber dátumu štýl kalendára",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read '**To use a calendar style date picker ** click here to pop out your window.'"
+ },
+ "sendFirefoxCustomDatePopoutMessage2": {
+ "message": "kliknite sem",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker **click here** to pop out your window.'"
+ },
+ "sendFirefoxCustomDatePopoutMessage3": {
+ "message": "a vysunie sa.",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker click here **to pop out your window.**'"
+ },
+ "expirationDateIsInvalid": {
+ "message": "Uvedený dátum exspirácie nie je platný."
+ },
+ "deletionDateIsInvalid": {
+ "message": "Uvedený dátum odstránenia nie je platný."
+ },
+ "expirationDateAndTimeRequired": {
+ "message": "Vyžaduje sa dátum a čas vypršania platnosti."
+ },
+ "deletionDateAndTimeRequired": {
+ "message": "Vyžaduje sa dátum a čas odstránenia."
+ },
+ "dateParsingError": {
+ "message": "Pri ukladaní dátumov odstránenia a vypršania platnosti sa vyskytla chyba."
+ },
+ "hideEmail": {
+ "message": "Skryť moju emailovú adresu pred príjemcami."
+ },
+ "sendOptionsPolicyInEffect": {
+ "message": "Jedno alebo viac pravidiel organizácie ovplyvňujú vaše možnosti funkcie Send."
+ },
+ "passwordPrompt": {
+ "message": "Znova zadajte hlavné heslo"
+ },
+ "passwordConfirmation": {
+ "message": "Potvrdenie hlavného hesla"
+ },
+ "passwordConfirmationDesc": {
+ "message": "Táto akcia je chránená. Ak chcete pokračovať, znova zadajte hlavné heslo a overte svoju totožnosť."
+ },
+ "emailVerificationRequired": {
+ "message": "Vyžaduje sa overenie e-mailu"
+ },
+ "emailVerificationRequiredDesc": {
+ "message": "Na použitie tejto funkcie musíte overiť svoj e-mail. Svoj e-mail môžete overiť vo webovom trezore."
+ },
+ "updatedMasterPassword": {
+ "message": "Hlavné heslo aktualizované"
+ },
+ "updateMasterPassword": {
+ "message": "Aktualizovať hlavné heslo"
+ },
+ "updateMasterPasswordWarning": {
+ "message": "Vaše hlavné heslo nedávno zmenil správca vo vašej organizácii. Ak chcete získať prístup k trezoru, musíte ho teraz aktualizovať. Pokračovaním sa odhlásite z aktuálnej relácie a budete sa musieť znova prihlásiť. Aktívne relácie na iných zariadeniach môžu zostať aktívne až jednu hodinu."
+ },
+ "resetPasswordPolicyAutoEnroll": {
+ "message": "Automatická registrácia"
+ },
+ "resetPasswordAutoEnrollInviteWarning": {
+ "message": "Táto organizácia má podnikovú politiku, ktorá vás automaticky zaregistruje na obnovenia hesla. Registrácia umožní správcom organizácie zmeniť vaše hlavné heslo."
+ },
+ "selectFolder": {
+ "message": "Vybrať priečinok..."
+ },
+ "ssoCompleteRegistration": {
+ "message": "Aby ste dokončili nastavenie prihlasovacieho portálu (SSO), prosím nastavte hlavné heslo na prístup a ochranu vášho trezora."
+ },
+ "hours": {
+ "message": "Hodiny"
+ },
+ "minutes": {
+ "message": "Minúty"
+ },
+ "vaultTimeoutPolicyInEffect": {
+ "message": "Zásady vašej organizácie ovplyvňujú časový limit trezoru. Maximálny povolený časový limit trezoru je $HOURS$ h a $MINUTES$ m",
+ "placeholders": {
+ "hours": {
+ "content": "$1",
+ "example": "5"
+ },
+ "minutes": {
+ "content": "$2",
+ "example": "5"
+ }
+ }
+ },
+ "vaultTimeoutToLarge": {
+ "message": "Časový limit vášho trezora prekračuje obmedzenia nastavené vašou organizáciou."
+ },
+ "vaultExportDisabled": {
+ "message": "Export trezoru je zakázaný"
+ },
+ "personalVaultExportPolicyInEffect": {
+ "message": "Jedna alebo viacero zásad organizácie vám bráni exportovať váš osobný trezor."
+ },
+ "copyCustomFieldNameInvalidElement": {
+ "message": "Nie je možné identifikovať platný prvok formulára. Skúste namiesto toho preskúmať HTML."
+ },
+ "copyCustomFieldNameNotUnique": {
+ "message": "Nenašiel sa žiadny jedinečný identifikátor."
+ }
+}
diff --git a/src/iOS.Safari/Resources/_locales/sl/messages.json b/src/iOS.Safari/Resources/_locales/sl/messages.json
new file mode 100644
index 000000000..919d25976
--- /dev/null
+++ b/src/iOS.Safari/Resources/_locales/sl/messages.json
@@ -0,0 +1,1817 @@
+{
+ "appName": {
+ "message": "Bitwarden"
+ },
+ "extName": {
+ "message": "Bitwarden - Brezplačen upravitelj gesel",
+ "description": "Extension name, MUST be less than 40 characters (Safari restriction)"
+ },
+ "extDesc": {
+ "message": "Varen in brezplačen upravitelj gesel za vse vaše naprave.",
+ "description": "Extension description"
+ },
+ "loginOrCreateNewAccount": {
+ "message": "Prijavite se ali ustvarite nov račun za dostop do vašega varnega trezorja."
+ },
+ "createAccount": {
+ "message": "Ustvari račun"
+ },
+ "login": {
+ "message": "Prijavi se"
+ },
+ "enterpriseSingleSignOn": {
+ "message": "Enkratna podjetniška prijava."
+ },
+ "cancel": {
+ "message": "Prekliči"
+ },
+ "close": {
+ "message": "Zapri"
+ },
+ "submit": {
+ "message": "Pošlji"
+ },
+ "emailAddress": {
+ "message": "Elektronski naslov"
+ },
+ "masterPass": {
+ "message": "Glavno geslo"
+ },
+ "masterPassDesc": {
+ "message": "Glavno geslo je geslo, ki ga uporabljate za dostop do vašega trezorja. Zelo pomembno je, da ne pozabite vaše glavno geslo. Gesla ni mogoče obnoviti v primeru, če ga pozabite."
+ },
+ "masterPassHintDesc": {
+ "message": "Namig glavnega gesla vam lahko pomaga, da se spomnite vašega gesla, če ga pozabite."
+ },
+ "reTypeMasterPass": {
+ "message": "Ponovno vnesite glavno geslo"
+ },
+ "masterPassHint": {
+ "message": "Namig za glavno geslo (neobvezno)"
+ },
+ "tab": {
+ "message": "Zavihek"
+ },
+ "myVault": {
+ "message": "Moj trezor"
+ },
+ "tools": {
+ "message": "Orodja"
+ },
+ "settings": {
+ "message": "Nastavitve"
+ },
+ "currentTab": {
+ "message": "Trenutni zavihek"
+ },
+ "copyPassword": {
+ "message": "Kopiraj geslo"
+ },
+ "copyNote": {
+ "message": "Kopiraj opombo"
+ },
+ "copyUri": {
+ "message": "Kopiraj URL"
+ },
+ "copyUsername": {
+ "message": "Kopiraj uporabniško ime"
+ },
+ "copyNumber": {
+ "message": "Kopiraj številko"
+ },
+ "copySecurityCode": {
+ "message": "Kopiraj varnostno kodo"
+ },
+ "autoFill": {
+ "message": "samodejno zapolni"
+ },
+ "generatePasswordCopied": {
+ "message": "Generiraj geslo (kopirano)"
+ },
+ "copyElementIdentifier": {
+ "message": "Copy Custom Field Name"
+ },
+ "noMatchingLogins": {
+ "message": "Nobenih ujemajočih prijav."
+ },
+ "vaultLocked": {
+ "message": "Trezor je zaklenjen."
+ },
+ "vaultLoggedOut": {
+ "message": "Trezor je odjavljen."
+ },
+ "autoFillInfo": {
+ "message": "Nobene prijave ni na voljo za auto-izpolnitev za trenutni zavihek."
+ },
+ "addLogin": {
+ "message": "Dodaj prijavo"
+ },
+ "addItem": {
+ "message": "Dodal element"
+ },
+ "passwordHint": {
+ "message": "Namig za geslo"
+ },
+ "enterEmailToGetHint": {
+ "message": "Vnesite epoštni naslov vašega računa, da prejmete namig za vaše glavno geslo."
+ },
+ "getMasterPasswordHint": {
+ "message": "Pridobi namig za glavno geslo"
+ },
+ "continue": {
+ "message": "Nadaljuj"
+ },
+ "verificationCode": {
+ "message": "Verifikacijska koda"
+ },
+ "account": {
+ "message": "Račun"
+ },
+ "changeMasterPassword": {
+ "message": "Spremeni glavno geslo"
+ },
+ "fingerprintPhrase": {
+ "message": "Fingerprint fraza",
+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
+ },
+ "yourAccountsFingerprint": {
+ "message": "Fingerprint fraza vašega računa",
+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
+ },
+ "twoStepLogin": {
+ "message": "Prijava v dveh korakih"
+ },
+ "logOut": {
+ "message": "Odjava"
+ },
+ "about": {
+ "message": "O programu"
+ },
+ "version": {
+ "message": "Različica"
+ },
+ "save": {
+ "message": "Shrani"
+ },
+ "move": {
+ "message": "Premakni"
+ },
+ "addFolder": {
+ "message": "Dodaj mapo"
+ },
+ "name": {
+ "message": "Naziv"
+ },
+ "editFolder": {
+ "message": "Uredi mapo"
+ },
+ "deleteFolder": {
+ "message": "Izbriši mapo"
+ },
+ "folders": {
+ "message": "Mape"
+ },
+ "noFolders": {
+ "message": "Ni map za prikazat."
+ },
+ "helpFeedback": {
+ "message": "Pomoč in povratne informacije"
+ },
+ "sync": {
+ "message": "Sinhronizacija"
+ },
+ "syncVaultNow": {
+ "message": "Sinhroniziraj trezor zdaj"
+ },
+ "lastSync": {
+ "message": "Zadnja sinhronizacija:"
+ },
+ "passGen": {
+ "message": "Generator gesel"
+ },
+ "generator": {
+ "message": "Generator",
+ "description": "Short for 'Password Generator'."
+ },
+ "passGenInfo": {
+ "message": "Avtomatično generiraj močna, edinstvena gesla za vaše prijave."
+ },
+ "bitWebVault": {
+ "message": "Bitwarden spletni trezor"
+ },
+ "importItems": {
+ "message": "Uvozi predmete"
+ },
+ "select": {
+ "message": "Izberi"
+ },
+ "generatePassword": {
+ "message": "Generiraj geslo"
+ },
+ "regeneratePassword": {
+ "message": "Regeneriraj geslo"
+ },
+ "options": {
+ "message": "Možnosti"
+ },
+ "length": {
+ "message": "Dolžina"
+ },
+ "numWords": {
+ "message": "Število besed"
+ },
+ "wordSeparator": {
+ "message": "Ločilo besed"
+ },
+ "capitalize": {
+ "message": "Velika začetnica",
+ "description": "Make the first letter of a work uppercase."
+ },
+ "includeNumber": {
+ "message": "Vključi številko"
+ },
+ "minNumbers": {
+ "message": "Minimalno števil"
+ },
+ "minSpecial": {
+ "message": "Minimalno posebnih znakov"
+ },
+ "avoidAmbChar": {
+ "message": "Izogibaj se dvoumnim znakom"
+ },
+ "searchVault": {
+ "message": "Išči v trezorju"
+ },
+ "edit": {
+ "message": "Uredi"
+ },
+ "view": {
+ "message": "Pogled"
+ },
+ "noItemsInList": {
+ "message": "Ni predmetov za prikazat."
+ },
+ "itemInformation": {
+ "message": "Informacije o izdelku"
+ },
+ "username": {
+ "message": "Uporabniško ime"
+ },
+ "password": {
+ "message": "Geslo"
+ },
+ "passphrase": {
+ "message": "Parafraza"
+ },
+ "favorite": {
+ "message": "Priljubljeni"
+ },
+ "notes": {
+ "message": "Opombe"
+ },
+ "note": {
+ "message": "Opomba"
+ },
+ "editItem": {
+ "message": "Uredi vnos"
+ },
+ "folder": {
+ "message": "Mapa"
+ },
+ "deleteItem": {
+ "message": "Izbiši vnos"
+ },
+ "viewItem": {
+ "message": "Ogled vnosa"
+ },
+ "launch": {
+ "message": "Zaženi"
+ },
+ "website": {
+ "message": "Spletna stran"
+ },
+ "toggleVisibility": {
+ "message": "Preklopi vidljivost"
+ },
+ "manage": {
+ "message": "Upravljaj"
+ },
+ "other": {
+ "message": "Drugo"
+ },
+ "rateExtension": {
+ "message": "Ocenite to razširitev"
+ },
+ "rateExtensionDesc": {
+ "message": "Premislite če nam želite pomagati z dobro oceno!"
+ },
+ "browserNotSupportClipboard": {
+ "message": "Vaš spletni brskalnik ne podpira enostavno kopiranje odložišča. Kopirajte ročno."
+ },
+ "verifyMasterPassword": {
+ "message": "Potrdite glavno geslo"
+ },
+ "yourVaultIsLocked": {
+ "message": "Vaš trezor je zaklenjen. Potrdite vaše glavno geslo za nadaljevanje."
+ },
+ "unlock": {
+ "message": "Odkleni"
+ },
+ "loggedInAsOn": {
+ "message": "Prijavljeni kot $EMAIL$ na $HOSTNAME$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "name@example.com"
+ },
+ "hostname": {
+ "content": "$2",
+ "example": "bitwarden.com"
+ }
+ }
+ },
+ "invalidMasterPassword": {
+ "message": "Napačno glavno geslo"
+ },
+ "vaultTimeout": {
+ "message": "Časovna omejitev trezorja"
+ },
+ "lockNow": {
+ "message": "Zakleni zdaj"
+ },
+ "immediately": {
+ "message": "Takoj"
+ },
+ "tenSeconds": {
+ "message": "10 sekund"
+ },
+ "twentySeconds": {
+ "message": "20 sekund"
+ },
+ "thirtySeconds": {
+ "message": "30 sekund"
+ },
+ "oneMinute": {
+ "message": "1 minuta"
+ },
+ "twoMinutes": {
+ "message": "2 minuti"
+ },
+ "fiveMinutes": {
+ "message": "5 minut"
+ },
+ "fifteenMinutes": {
+ "message": "15 minut"
+ },
+ "thirtyMinutes": {
+ "message": "30 minut"
+ },
+ "oneHour": {
+ "message": "1 ura"
+ },
+ "fourHours": {
+ "message": "4 ure"
+ },
+ "onLocked": {
+ "message": "Ob sistemskem zaklepu"
+ },
+ "onRestart": {
+ "message": "Ob ponovnem zagonu spletnega brskalnika"
+ },
+ "never": {
+ "message": "Nikoli"
+ },
+ "security": {
+ "message": "Varnost"
+ },
+ "errorOccurred": {
+ "message": "Prišlo je do napake"
+ },
+ "emailRequired": {
+ "message": "Epoštni naslov je obvezen."
+ },
+ "invalidEmail": {
+ "message": "Neveljaven epoštni naslov."
+ },
+ "masterPassRequired": {
+ "message": "Glavno geslo je obvezno."
+ },
+ "masterPassLength": {
+ "message": "Glavno geslo mora biti dolgo najmanj 8 znakov."
+ },
+ "masterPassDoesntMatch": {
+ "message": "Potrditev glavnega gesla se ne ujema."
+ },
+ "newAccountCreated": {
+ "message": "Vaš nov račun je bil ustvarjen! Sedaj se lahko prijavite."
+ },
+ "masterPassSent": {
+ "message": "Poslali smo vam epoštno spročilo z namigom za vaše glavno geslo."
+ },
+ "verificationCodeRequired": {
+ "message": "Verifikacijska koda je obvezna."
+ },
+ "valueCopied": {
+ "message": "$VALUE$ kopirano",
+ "description": "Value has been copied to the clipboard.",
+ "placeholders": {
+ "value": {
+ "content": "$1",
+ "example": "Password"
+ }
+ }
+ },
+ "autofillError": {
+ "message": "Ni mogoče avto-izpolniti izbrazno prijavo na tej spletni strani. Namesto tega kopirajte in prilepite podatke."
+ },
+ "loggedOut": {
+ "message": "Odjavljen"
+ },
+ "loginExpired": {
+ "message": "Vaša seja je potekla."
+ },
+ "logOutConfirmation": {
+ "message": "Ste prepričani, da se želite odjaviti?"
+ },
+ "yes": {
+ "message": "Da"
+ },
+ "no": {
+ "message": "Ne"
+ },
+ "unexpectedError": {
+ "message": "Prišlo je do nepričakovane napake."
+ },
+ "nameRequired": {
+ "message": "Ime je obvezno."
+ },
+ "addedFolder": {
+ "message": "Dodana mapa"
+ },
+ "changeMasterPass": {
+ "message": "Spremeni glavno geslo"
+ },
+ "changeMasterPasswordConfirmation": {
+ "message": "Svoje glavno geslo lahko spremenite v bitwarden.com spletnem trezorju. Želite obiskati spletno stran zdaj?"
+ },
+ "twoStepLoginConfirmation": {
+ "message": "Two-step login makes your account more secure by requiring you to verify your login with another device such as a security key, authenticator app, SMS, phone call, or email. Two-step login can be enabled on the bitwarden.com web vault. Do you want to visit the website now?"
+ },
+ "editedFolder": {
+ "message": "Urejena mapa"
+ },
+ "deleteFolderConfirmation": {
+ "message": "Ste prepričani, da želite izbrisati to mapo?"
+ },
+ "deletedFolder": {
+ "message": "Izbrisana mapa"
+ },
+ "gettingStartedTutorial": {
+ "message": "Getting Started Tutorial"
+ },
+ "gettingStartedTutorialVideo": {
+ "message": "Watch our getting started tutorial to learn how to get the most out of the browser extension."
+ },
+ "syncingComplete": {
+ "message": "Sinhronizacija končana"
+ },
+ "syncingFailed": {
+ "message": "Sinhronizacija ni uspela"
+ },
+ "passwordCopied": {
+ "message": "Geslo je bilo kopirano"
+ },
+ "uri": {
+ "message": "URL"
+ },
+ "uriPosition": {
+ "message": "URI $POSITION$",
+ "description": "A listing of URIs. Ex: URI 1, URI 2, URI 3, etc.",
+ "placeholders": {
+ "position": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "newUri": {
+ "message": "Nov URL"
+ },
+ "addedItem": {
+ "message": "Dodan vnos"
+ },
+ "editedItem": {
+ "message": "Urejen vnos"
+ },
+ "deleteItemConfirmation": {
+ "message": "Ali ste prepričani, da želite izbrisati?"
+ },
+ "deletedItem": {
+ "message": "Pošlji vnos v smeti"
+ },
+ "overwritePassword": {
+ "message": "Prepiši geslo"
+ },
+ "overwritePasswordConfirmation": {
+ "message": "Ali ste prepričani, da želite prepisati vaše trenutno geslo?"
+ },
+ "searchFolder": {
+ "message": "Preišči mapo"
+ },
+ "searchCollection": {
+ "message": "Preišči zbirko"
+ },
+ "searchType": {
+ "message": "Search type"
+ },
+ "noneFolder": {
+ "message": "Brez mape",
+ "description": "This is the folder for uncategorized items"
+ },
+ "disableAddLoginNotification": {
+ "message": "Disable Add Login Notification"
+ },
+ "addLoginNotificationDesc": {
+ "message": "The \"Add Login Notification\" automatically prompts you to save new logins to your vault whenever you log into them for the first time."
+ },
+ "dontShowCardsCurrentTab": {
+ "message": "Don't Show Cards on Tab Page"
+ },
+ "dontShowCardsCurrentTabDesc": {
+ "message": "Card items from your vault are listed on the 'Current Tab' page for easy auto-fill access."
+ },
+ "dontShowIdentitiesCurrentTab": {
+ "message": "Ne prikazuj identitete"
+ },
+ "dontShowIdentitiesCurrentTabDesc": {
+ "message": "Identity items from your vault are listed on the 'Current Tab' page for easy auto-fill access."
+ },
+ "clearClipboard": {
+ "message": "Počisti odložišče",
+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
+ },
+ "clearClipboardDesc": {
+ "message": "Automatically clear copied values from your clipboard.",
+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
+ },
+ "notificationAddDesc": {
+ "message": "Should Bitwarden remember this password for you?"
+ },
+ "notificationAddSave": {
+ "message": "Da, shrani zdaj"
+ },
+ "notificationNeverSave": {
+ "message": "Nikoli za to stran"
+ },
+ "disableChangedPasswordNotification": {
+ "message": "Disable Changed Password Notification"
+ },
+ "disableChangedPasswordNotificationDesc": {
+ "message": "The \"Changed Password Notification\" automatically prompts you to update a login's password in your vault whenever it detects that you have changed it on a website."
+ },
+ "notificationChangeDesc": {
+ "message": "Do you want to update this password in Bitwarden?"
+ },
+ "notificationChangeSave": {
+ "message": "Da, posodobi zdaj"
+ },
+ "disableContextMenuItem": {
+ "message": "Disable Context Menu Options"
+ },
+ "disableContextMenuItemDesc": {
+ "message": "Context menu options provide quick access to password generation and logins for the website in your current tab."
+ },
+ "defaultUriMatchDetection": {
+ "message": "Default URI Match Detection",
+ "description": "Default URI match detection for auto-fill."
+ },
+ "defaultUriMatchDetectionDesc": {
+ "message": "Choose the default way that URI match detection is handled for logins when performing actions such as auto-fill."
+ },
+ "theme": {
+ "message": "Tema"
+ },
+ "themeDesc": {
+ "message": "Spremeni temo aplikacije."
+ },
+ "dark": {
+ "message": "Temno",
+ "description": "Dark color"
+ },
+ "light": {
+ "message": "Svetlo",
+ "description": "Light color"
+ },
+ "solarizedDark": {
+ "message": "Solarized Dark",
+ "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated."
+ },
+ "exportVault": {
+ "message": "Izvoz trezorja"
+ },
+ "fileFormat": {
+ "message": "Format datoteke"
+ },
+ "warning": {
+ "message": "OPOZORILO",
+ "description": "WARNING (should stay in capitalized letters if the language permits)"
+ },
+ "confirmVaultExport": {
+ "message": "Potrdite izvoz trezorja"
+ },
+ "exportWarningDesc": {
+ "message": "This export contains your vault data in an unencrypted format. You should not store or send the exported file over unsecure channels (such as email). Delete it immediately after you are done using it."
+ },
+ "encExportKeyWarningDesc": {
+ "message": "Ta izvoz šifrira vaše podatke z uporabo ključa za šifriranje. Če boste kdaj zamenjali ključ za šifriranje, je potrebno, da ponovno naredite izvoz, ker ne boste mogli dešifrirati to izvoženo datoteko."
+ },
+ "encExportAccountWarningDesc": {
+ "message": "Ključ za šifriranje je edinstven za vsak Bitwarden račun, zato ni mogoče da se uvozi šifrirana datoteka v drugi račun."
+ },
+ "exportMasterPassword": {
+ "message": "Vnesite vaše glavno geslo za izvoz podatkov iz vašega trezorja."
+ },
+ "shared": {
+ "message": "V skupni rabi"
+ },
+ "learnOrg": {
+ "message": "Learn about Organizations"
+ },
+ "learnOrgConfirmation": {
+ "message": "Bitwarden allows you to share your vault items with others by using an organization. Would you like to visit the bitwarden.com website to learn more?"
+ },
+ "moveToOrganization": {
+ "message": "Move to Organization"
+ },
+ "share": {
+ "message": "Deli"
+ },
+ "movedItemToOrg": {
+ "message": "$ITEMNAME$ moved to $ORGNAME$",
+ "placeholders": {
+ "itemname": {
+ "content": "$1",
+ "example": "Secret Item"
+ },
+ "orgname": {
+ "content": "$2",
+ "example": "Company Name"
+ }
+ }
+ },
+ "moveToOrgDesc": {
+ "message": "Choose an organization that you wish to move this item to. Moving to an organization transfers ownership of the item to that organization. You will no longer be the direct owner of this item once it has been moved."
+ },
+ "learnMore": {
+ "message": "Več o tem"
+ },
+ "authenticatorKeyTotp": {
+ "message": "Ključ avtentikatorja (TOTP)"
+ },
+ "verificationCodeTotp": {
+ "message": "Verifikacijska koda (TOTP)"
+ },
+ "copyVerificationCode": {
+ "message": "Kopiraj verifikacijsko kodo"
+ },
+ "attachments": {
+ "message": "Priponke"
+ },
+ "deleteAttachment": {
+ "message": "Izbriši priponke"
+ },
+ "deleteAttachmentConfirmation": {
+ "message": "Ste prepričani, da želite izbrisati to priponko?"
+ },
+ "deletedAttachment": {
+ "message": "Izbrisana priponka"
+ },
+ "newAttachment": {
+ "message": "Dodaj novo priponko"
+ },
+ "noAttachments": {
+ "message": "Ni priponk."
+ },
+ "attachmentSaved": {
+ "message": "Priponka je bila shranjena."
+ },
+ "file": {
+ "message": "Datoteka"
+ },
+ "selectFile": {
+ "message": "Izberite datoteko."
+ },
+ "maxFileSize": {
+ "message": "Največja velikost datoteke je 500 MB."
+ },
+ "featureUnavailable": {
+ "message": "Funkcija ni na voljo."
+ },
+ "updateKey": {
+ "message": "Ne morete koristiti to funkcijo dokler ne posodobite vaš ključ za šifriranje."
+ },
+ "premiumMembership": {
+ "message": "Premium članstvo"
+ },
+ "premiumManage": {
+ "message": "Upravljanje članstva"
+ },
+ "premiumManageAlert": {
+ "message": "S svojim članstvom lahko upravljate na bitwarden.com spletnem trezorju. Želite obiskati spletno stran zdaj?"
+ },
+ "premiumRefresh": {
+ "message": "Osvežite članstvo"
+ },
+ "premiumNotCurrentMember": {
+ "message": "Trenutno niste premium član."
+ },
+ "premiumSignUpAndGet": {
+ "message": "Prijavite se za premium članstvo in dobite:"
+ },
+ "ppremiumSignUpStorage": {
+ "message": "1 GB šifriranog prostora za shrambo podatkov."
+ },
+ "ppremiumSignUpTwoStep": {
+ "message": "Dodatne možnosti za prijavo v dveh korakih kot so YubiKey, FIDO U2F in Duo."
+ },
+ "ppremiumSignUpReports": {
+ "message": "Higiena gesel, zdravje računa in poročila o kraji podatkov, da lahko ohranite vaš trezor varen."
+ },
+ "ppremiumSignUpTotp": {
+ "message": "TOTP verifikacijska koda (2FA) generator za prijave v vašem trezorju."
+ },
+ "ppremiumSignUpSupport": {
+ "message": "Prioritetna podpora strankam."
+ },
+ "ppremiumSignUpFuture": {
+ "message": "Vse bodoče premium ugodnosti. Kmalu še več!"
+ },
+ "premiumPurchase": {
+ "message": "Kupite premium članstvo"
+ },
+ "premiumPurchaseAlert": {
+ "message": "Premium članstvo lahko kupite na bitwarden.com spletnem trezoju. Želite obiskati spletno stran zdaj?"
+ },
+ "premiumCurrentMember": {
+ "message": "Ste premium član!"
+ },
+ "premiumCurrentMemberThanks": {
+ "message": "Hvala da podpirate Bitwarden."
+ },
+ "premiumPrice": {
+ "message": "Vse za samo $PRICE$ /leto!",
+ "placeholders": {
+ "price": {
+ "content": "$1",
+ "example": "$10"
+ }
+ }
+ },
+ "refreshComplete": {
+ "message": "Osveževanje zaključeno"
+ },
+ "disableAutoTotpCopy": {
+ "message": "Onemogočite avtomatsko kopiranje TOTP"
+ },
+ "disableAutoTotpCopyDesc": {
+ "message": "Če za prijavo uporabljate avtentikacijski ključ je TOTP verifikacijska koda avtomatično kopirana v vaše odložišče kadarkoli avto-izpolnite prijavo."
+ },
+ "disableAutoBiometricsPrompt": {
+ "message": "Do not prompt for biometrics on launch"
+ },
+ "premiumRequired": {
+ "message": "Premium članstvo je potrebno"
+ },
+ "premiumRequiredDesc": {
+ "message": "Premium članstvo je potrebno za uporabo te funkcije."
+ },
+ "enterVerificationCodeApp": {
+ "message": "Vnesite 6-mestno verifikacijsko kodo iz vaše verifikacijske aplikacije."
+ },
+ "enterVerificationCodeEmail": {
+ "message": "Vnesite 6-mestno verifikacijsko kodo, ki vam je bila poslana na $EMAIL$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "example@gmail.com"
+ }
+ }
+ },
+ "verificationCodeEmailSent": {
+ "message": "Verification email sent to $EMAIL$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "example@gmail.com"
+ }
+ }
+ },
+ "rememberMe": {
+ "message": "Zapomni si me"
+ },
+ "sendVerificationCodeEmailAgain": {
+ "message": "Ponovno pošlji verifikacijsko kodo na email"
+ },
+ "useAnotherTwoStepMethod": {
+ "message": "Uporabi drugi način prijave v dveh korakih"
+ },
+ "insertYubiKey": {
+ "message": "Priključi svoj YubiKey v USB priključek, nato pa pritisni na njegovo tipko."
+ },
+ "insertU2f": {
+ "message": "Priključi svoj varnostni ključ v USB priključek. Če ima tipko, se jo dotaknite."
+ },
+ "webAuthnNewTab": {
+ "message": "To start the WebAuthn 2FA verification. Click the button below to open a new tab and follow the instructions provided in the new tab."
+ },
+ "webAuthnNewTabOpen": {
+ "message": "Open new tab"
+ },
+ "webAuthnAuthenticate": {
+ "message": "Authenticate WebAuthn"
+ },
+ "loginUnavailable": {
+ "message": "Prijava ni na voljo"
+ },
+ "noTwoStepProviders": {
+ "message": "Ta račun ima omogočemo prijavo v dveh korakih, ampak, nobena izmed konfiguriranih prijav v dveh korakih ni podprta v teb spletnem brskalniku."
+ },
+ "noTwoStepProviders2": {
+ "message": "Please use a supported web browser (such as Chrome) and/or add additional providers that are better supported across web browsers (such as an authenticator app)."
+ },
+ "twoStepOptions": {
+ "message": "Two-step Login Options"
+ },
+ "recoveryCodeDesc": {
+ "message": "Lost access to all of your two-factor providers? Use your recovery code to disable all two-factor providers from your account."
+ },
+ "recoveryCodeTitle": {
+ "message": "Koda za obnovitev"
+ },
+ "authenticatorAppTitle": {
+ "message": "Aplikacija za avtentikacijo"
+ },
+ "authenticatorAppDesc": {
+ "message": "Use an authenticator app (such as Authy or Google Authenticator) to generate time-based verification codes.",
+ "description": "'Authy' and 'Google Authenticator' are product names and should not be translated."
+ },
+ "yubiKeyTitle": {
+ "message": "YubiKey OTP Security Key"
+ },
+ "yubiKeyDesc": {
+ "message": "Use a YubiKey to access your account. Works with YubiKey 4, 4 Nano, 4C, and NEO devices."
+ },
+ "duoDesc": {
+ "message": "Verify with Duo Security using the Duo Mobile app, SMS, phone call, or U2F security key.",
+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
+ },
+ "duoOrganizationDesc": {
+ "message": "Verify with Duo Security for your organization using the Duo Mobile app, SMS, phone call, or U2F security key.",
+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
+ },
+ "webAuthnTitle": {
+ "message": "FIDO2 WebAuthn"
+ },
+ "webAuthnDesc": {
+ "message": "Use any WebAuthn enabled security key to access your account."
+ },
+ "emailTitle": {
+ "message": "E-pošta"
+ },
+ "emailDesc": {
+ "message": "Potrditvene kode vam bodo posredovane po e-pošti."
+ },
+ "selfHostedEnvironment": {
+ "message": "Self-hosted Environment"
+ },
+ "selfHostedEnvironmentFooter": {
+ "message": "Specify the base URL of your on-premises hosted Bitwarden installation."
+ },
+ "customEnvironment": {
+ "message": "Custom Environment"
+ },
+ "customEnvironmentFooter": {
+ "message": "For advanced users. You can specify the base URL of each service independently."
+ },
+ "baseUrl": {
+ "message": "URL naslov strežnika"
+ },
+ "apiUrl": {
+ "message": "URL naslov API strežnika"
+ },
+ "webVaultUrl": {
+ "message": "Web Vault Server URL"
+ },
+ "identityUrl": {
+ "message": "Identity Server URL"
+ },
+ "notificationsUrl": {
+ "message": "Notifications Server URL"
+ },
+ "iconsUrl": {
+ "message": "Icons Server URL"
+ },
+ "environmentSaved": {
+ "message": "The environment URLs have been saved."
+ },
+ "enableAutoFillOnPageLoad": {
+ "message": "Enable Auto-fill on Page Load"
+ },
+ "enableAutoFillOnPageLoadDesc": {
+ "message": "If a login form is detected, automatically perform an auto-fill when the web page loads."
+ },
+ "experimentalFeature": {
+ "message": "This is currently an experimental feature. Use at your own risk."
+ },
+ "defaultAutoFillOnPageLoad": {
+ "message": "Default autofill setting for login items"
+ },
+ "defaultAutoFillOnPageLoadDesc": {
+ "message": "After enabling Auto-fill on Page Load, you can enable or disable the feature for individual login items. This is the default setting for login items that are not separately configured."
+ },
+ "itemAutoFillOnPageLoad": {
+ "message": "Auto-fill on Page Load (if enabled in Options)"
+ },
+ "autoFillOnPageLoadUseDefault": {
+ "message": "Uporabi privzete nastavitve"
+ },
+ "autoFillOnPageLoadYes": {
+ "message": "Auto-fill on page load"
+ },
+ "autoFillOnPageLoadNo": {
+ "message": "Do not auto-fill on page load"
+ },
+ "commandOpenPopup": {
+ "message": "Open vault popup"
+ },
+ "commandOpenSidebar": {
+ "message": "Open vault in sidebar"
+ },
+ "commandAutofillDesc": {
+ "message": "Auto-fill the last used login for the current website"
+ },
+ "commandGeneratePasswordDesc": {
+ "message": "Generate and copy a new random password to the clipboard"
+ },
+ "commandLockVaultDesc": {
+ "message": "Lock the vault"
+ },
+ "privateModeMessage": {
+ "message": "Unfortunately this window is not available in private mode for this browser."
+ },
+ "customFields": {
+ "message": "Custom Fields"
+ },
+ "copyValue": {
+ "message": "Copy Value"
+ },
+ "value": {
+ "message": "Value"
+ },
+ "newCustomField": {
+ "message": "New Custom Field"
+ },
+ "dragToSort": {
+ "message": "Drag to sort"
+ },
+ "cfTypeText": {
+ "message": "Besedilo"
+ },
+ "cfTypeHidden": {
+ "message": "Skrito"
+ },
+ "cfTypeBoolean": {
+ "message": "Boolean"
+ },
+ "popup2faCloseMessage": {
+ "message": "Če kliknete izven pojavnega okna, da preverite vašo epošto za vašo verifikacijsko kodo, bo to povročilo, da se je pojavno okno zapre. Želite odpreti to pojavno okno v novem oknu, tako, da se ne bo zaprlo?"
+ },
+ "popupU2fCloseMessage": {
+ "message": "Ta spletni brskalnik ne more obdelati U2F zahteve v tem pojavnem oknu. Želite odpreti to pojavno okno v novem oknu, tako, da se lahko prijavite z U2F?"
+ },
+ "disableFavicon": {
+ "message": "Onemogoči ikone spletnih mest"
+ },
+ "disableFaviconDesc": {
+ "message": "Ikone spletnih mest ponujajo prepoznavne ikone zraven prijav v vašem trezorju."
+ },
+ "disableBadgeCounter": {
+ "message": "Disable Badge Counter"
+ },
+ "disableBadgeCounterDesc": {
+ "message": "Badge counter indicates how many logins you have for the current page in your vault."
+ },
+ "cardholderName": {
+ "message": "Ime imetnika kartice"
+ },
+ "number": {
+ "message": "Številka"
+ },
+ "brand": {
+ "message": "Znamka"
+ },
+ "expirationMonth": {
+ "message": "Mesec poteka"
+ },
+ "expirationYear": {
+ "message": "Leto poteka"
+ },
+ "expiration": {
+ "message": "Potek"
+ },
+ "january": {
+ "message": "Januar"
+ },
+ "february": {
+ "message": "Februar"
+ },
+ "march": {
+ "message": "Marec"
+ },
+ "april": {
+ "message": "April"
+ },
+ "may": {
+ "message": "Maj"
+ },
+ "june": {
+ "message": "Junij"
+ },
+ "july": {
+ "message": "Julij"
+ },
+ "august": {
+ "message": "Avgust"
+ },
+ "september": {
+ "message": "September"
+ },
+ "october": {
+ "message": "Oktober"
+ },
+ "november": {
+ "message": "November"
+ },
+ "december": {
+ "message": "December"
+ },
+ "securityCode": {
+ "message": "Varnostna koda"
+ },
+ "ex": {
+ "message": "npr."
+ },
+ "title": {
+ "message": "Naziv"
+ },
+ "mr": {
+ "message": "G."
+ },
+ "mrs": {
+ "message": "Ga."
+ },
+ "ms": {
+ "message": "Gdč."
+ },
+ "dr": {
+ "message": "Dr."
+ },
+ "firstName": {
+ "message": "Ime"
+ },
+ "middleName": {
+ "message": "Srednje ime"
+ },
+ "lastName": {
+ "message": "Priimek"
+ },
+ "identityName": {
+ "message": "Ime identitete"
+ },
+ "company": {
+ "message": "Podjetje"
+ },
+ "ssn": {
+ "message": "EMŠO"
+ },
+ "passportNumber": {
+ "message": "Številka potnega lista"
+ },
+ "licenseNumber": {
+ "message": "Številka vozniškega dovoljenja"
+ },
+ "email": {
+ "message": "E-pošta"
+ },
+ "phone": {
+ "message": "Telefon"
+ },
+ "address": {
+ "message": "Naslov"
+ },
+ "address1": {
+ "message": "Naslov 1"
+ },
+ "address2": {
+ "message": "Naslov 2"
+ },
+ "address3": {
+ "message": "Naslov 3"
+ },
+ "cityTown": {
+ "message": "Mesto / Naselje"
+ },
+ "stateProvince": {
+ "message": "Država / Regija"
+ },
+ "zipPostalCode": {
+ "message": "Poštna številka"
+ },
+ "country": {
+ "message": "Država"
+ },
+ "type": {
+ "message": "Vrsta"
+ },
+ "typeLogin": {
+ "message": "Prijava"
+ },
+ "typeLogins": {
+ "message": "Prijave"
+ },
+ "typeSecureNote": {
+ "message": "Secure Note"
+ },
+ "typeCard": {
+ "message": "Card"
+ },
+ "typeIdentity": {
+ "message": "Identity"
+ },
+ "passwordHistory": {
+ "message": "Password History"
+ },
+ "back": {
+ "message": "Back"
+ },
+ "collections": {
+ "message": "Collections"
+ },
+ "favorites": {
+ "message": "Priljubljeno"
+ },
+ "popOutNewWindow": {
+ "message": "Pop out to a new window"
+ },
+ "refresh": {
+ "message": "Osveži"
+ },
+ "cards": {
+ "message": "Plačilne kartice"
+ },
+ "identities": {
+ "message": "Identitete"
+ },
+ "logins": {
+ "message": "Prijave"
+ },
+ "secureNotes": {
+ "message": "Secure Notes"
+ },
+ "clear": {
+ "message": "Počisti",
+ "description": "To clear something out. example: To clear browser history."
+ },
+ "checkPassword": {
+ "message": "Check if password has been exposed."
+ },
+ "passwordExposed": {
+ "message": "This password has been exposed $VALUE$ time(s) in data breaches. You should change it.",
+ "placeholders": {
+ "value": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "passwordSafe": {
+ "message": "This password was not found in any known data breaches. It should be safe to use."
+ },
+ "baseDomain": {
+ "message": "Base domain"
+ },
+ "host": {
+ "message": "Host",
+ "description": "A URL's host value. For example, the host of https://sub.domain.com:443 is 'sub.domain.com:443'."
+ },
+ "exact": {
+ "message": "Exact"
+ },
+ "startsWith": {
+ "message": "Starts with"
+ },
+ "regEx": {
+ "message": "Regular expression",
+ "description": "A programming term, also known as 'RegEx'."
+ },
+ "matchDetection": {
+ "message": "Match Detection",
+ "description": "URI match detection for auto-fill."
+ },
+ "defaultMatchDetection": {
+ "message": "Default match detection",
+ "description": "Default URI match detection for auto-fill."
+ },
+ "toggleOptions": {
+ "message": "Toggle Options"
+ },
+ "toggleCurrentUris": {
+ "message": "Toggle Current URIs",
+ "description": "Toggle the display of the URIs of the currently open tabs in the browser."
+ },
+ "currentUri": {
+ "message": "Current URI",
+ "description": "The URI of one of the current open tabs in the browser."
+ },
+ "organization": {
+ "message": "Organization",
+ "description": "An entity of multiple related people (ex. a team or business organization)."
+ },
+ "types": {
+ "message": "Types"
+ },
+ "allItems": {
+ "message": "All Items"
+ },
+ "noPasswordsInList": {
+ "message": "There are no passwords to list."
+ },
+ "remove": {
+ "message": "Remove"
+ },
+ "default": {
+ "message": "Default"
+ },
+ "dateUpdated": {
+ "message": "Updated",
+ "description": "ex. Date this item was updated"
+ },
+ "datePasswordUpdated": {
+ "message": "Password Updated",
+ "description": "ex. Date this password was updated"
+ },
+ "neverLockWarning": {
+ "message": "Are you sure you want to use the \"Never\" option? Setting your lock options to \"Never\" stores your vault's encryption key on your device. If you use this option you should ensure that you keep your device properly protected."
+ },
+ "noOrganizationsList": {
+ "message": "You do not belong to any organizations. Organizations allow you to securely share items with other users."
+ },
+ "noCollectionsInList": {
+ "message": "There are no collections to list."
+ },
+ "ownership": {
+ "message": "Ownership"
+ },
+ "whoOwnsThisItem": {
+ "message": "Who owns this item?"
+ },
+ "strong": {
+ "message": "Strong",
+ "description": "ex. A strong password. Scale: Weak -> Good -> Strong"
+ },
+ "good": {
+ "message": "Good",
+ "description": "ex. A good password. Scale: Weak -> Good -> Strong"
+ },
+ "weak": {
+ "message": "Weak",
+ "description": "ex. A weak password. Scale: Weak -> Good -> Strong"
+ },
+ "weakMasterPassword": {
+ "message": "Weak Master Password"
+ },
+ "weakMasterPasswordDesc": {
+ "message": "The master password you have chosen is weak. You should use a strong master password (or a passphrase) to properly protect your Bitwarden account. Are you sure you want to use this master password?"
+ },
+ "pin": {
+ "message": "PIN",
+ "description": "PIN code. Ex. The short code (often numeric) that you use to unlock a device."
+ },
+ "unlockWithPin": {
+ "message": "Unlock with PIN"
+ },
+ "setYourPinCode": {
+ "message": "Set your PIN code for unlocking Bitwarden. Your PIN settings will be reset if you ever fully log out of the application."
+ },
+ "pinRequired": {
+ "message": "PIN code is required."
+ },
+ "invalidPin": {
+ "message": "Invalid PIN code."
+ },
+ "verifyPin": {
+ "message": "Verify PIN"
+ },
+ "yourVaultIsLockedPinCode": {
+ "message": "Your vault is locked. Verify your PIN code to continue."
+ },
+ "unlockWithBiometrics": {
+ "message": "Unlock with biometrics"
+ },
+ "awaitDesktop": {
+ "message": "Awaiting confirmation from desktop"
+ },
+ "awaitDesktopDesc": {
+ "message": "Please confirm using biometrics in the Bitwarden Desktop application to enable biometrics for browser."
+ },
+ "lockWithMasterPassOnRestart": {
+ "message": "Lock with master password on browser restart"
+ },
+ "selectOneCollection": {
+ "message": "You must select at least one collection."
+ },
+ "cloneItem": {
+ "message": "Clone Item"
+ },
+ "clone": {
+ "message": "Clone"
+ },
+ "passwordGeneratorPolicyInEffect": {
+ "message": "One or more organization policies are affecting your generator settings."
+ },
+ "vaultTimeoutAction": {
+ "message": "Vault Timeout Action"
+ },
+ "lock": {
+ "message": "Lock",
+ "description": "Verb form: to make secure or inaccesible by"
+ },
+ "trash": {
+ "message": "Trash",
+ "description": "Noun: a special folder to hold deleted items"
+ },
+ "searchTrash": {
+ "message": "Search trash"
+ },
+ "permanentlyDeleteItem": {
+ "message": "Permanently Delete Item"
+ },
+ "permanentlyDeleteItemConfirmation": {
+ "message": "Are you sure you want to permanently delete this item?"
+ },
+ "permanentlyDeletedItem": {
+ "message": "Permanently Deleted item"
+ },
+ "restoreItem": {
+ "message": "Restore Item"
+ },
+ "restoreItemConfirmation": {
+ "message": "Are you sure you want to restore this item?"
+ },
+ "restoredItem": {
+ "message": "Restored Item"
+ },
+ "vaultTimeoutLogOutConfirmation": {
+ "message": "Logging out will remove all access to your vault and requires online authentication after the timeout period. Are you sure you want to use this setting?"
+ },
+ "vaultTimeoutLogOutConfirmationTitle": {
+ "message": "Timeout Action Confirmation"
+ },
+ "autoFillAndSave": {
+ "message": "Auto-fill and Save"
+ },
+ "autoFillSuccessAndSavedUri": {
+ "message": "Auto-filled Item and Saved URI"
+ },
+ "autoFillSuccess": {
+ "message": "Auto-filled Item"
+ },
+ "setMasterPassword": {
+ "message": "Set Master Password"
+ },
+ "masterPasswordPolicyInEffect": {
+ "message": "One or more organization policies require your master password to meet the following requirements:"
+ },
+ "policyInEffectMinComplexity": {
+ "message": "Minimum complexity score of $SCORE$",
+ "placeholders": {
+ "score": {
+ "content": "$1",
+ "example": "4"
+ }
+ }
+ },
+ "policyInEffectMinLength": {
+ "message": "Minimum length of $LENGTH$",
+ "placeholders": {
+ "length": {
+ "content": "$1",
+ "example": "14"
+ }
+ }
+ },
+ "policyInEffectUppercase": {
+ "message": "Contain one or more uppercase characters"
+ },
+ "policyInEffectLowercase": {
+ "message": "Contain one or more lowercase characters"
+ },
+ "policyInEffectNumbers": {
+ "message": "Contain one or more numbers"
+ },
+ "policyInEffectSpecial": {
+ "message": "Contain one or more of the following special characters $CHARS$",
+ "placeholders": {
+ "chars": {
+ "content": "$1",
+ "example": "!@#$%^&*"
+ }
+ }
+ },
+ "masterPasswordPolicyRequirementsNotMet": {
+ "message": "Your new master password does not meet the policy requirements."
+ },
+ "acceptPolicies": {
+ "message": "By checking this box you agree to the following:"
+ },
+ "acceptPoliciesError": {
+ "message": "Terms of Service and Privacy Policy have not been acknowledged."
+ },
+ "termsOfService": {
+ "message": "Terms of Service"
+ },
+ "privacyPolicy": {
+ "message": "Privacy Policy"
+ },
+ "hintEqualsPassword": {
+ "message": "Your password hint cannot be the same as your password."
+ },
+ "ok": {
+ "message": "Ok"
+ },
+ "desktopSyncVerificationTitle": {
+ "message": "Desktop sync verification"
+ },
+ "desktopIntegrationVerificationText": {
+ "message": "Please verify that the desktop application shows this fingerprint: "
+ },
+ "desktopIntegrationDisabledTitle": {
+ "message": "Browser integration is not enabled"
+ },
+ "desktopIntegrationDisabledDesc": {
+ "message": "Browser integration is not enabled in the Bitwarden Desktop application. Please enable it in the settings within the desktop application."
+ },
+ "startDesktopTitle": {
+ "message": "Start the Bitwarden Desktop application"
+ },
+ "startDesktopDesc": {
+ "message": "The Bitwarden Desktop application needs to be started before this function can be used."
+ },
+ "errorEnableBiometricTitle": {
+ "message": "Unable to enable biometrics"
+ },
+ "errorEnableBiometricDesc": {
+ "message": "Action was canceled by the desktop application"
+ },
+ "nativeMessagingInvalidEncryptionDesc": {
+ "message": "Desktop application invalidated the secure communication channel. Please retry this operation"
+ },
+ "nativeMessagingInvalidEncryptionTitle": {
+ "message": "Desktop communication interrupted"
+ },
+ "nativeMessagingWrongUserDesc": {
+ "message": "The desktop application is logged into a different account. Please ensure both applications are logged into the same account."
+ },
+ "nativeMessagingWrongUserTitle": {
+ "message": "Account missmatch"
+ },
+ "biometricsNotEnabledTitle": {
+ "message": "Biometrics not enabled"
+ },
+ "biometricsNotEnabledDesc": {
+ "message": "Browser biometrics requires desktop biometric to be enabled in the settings first."
+ },
+ "biometricsNotSupportedTitle": {
+ "message": "Biometrics not supported"
+ },
+ "biometricsNotSupportedDesc": {
+ "message": "Browser biometrics is not supported on this device."
+ },
+ "nativeMessaginPermissionErrorTitle": {
+ "message": "Permission not provided"
+ },
+ "nativeMessaginPermissionErrorDesc": {
+ "message": "Without permission to communicate with the Bitwarden Desktop Application we cannot provide biometrics in the browser extension. Please try again."
+ },
+ "nativeMessaginPermissionSidebarTitle": {
+ "message": "Permission request error"
+ },
+ "nativeMessaginPermissionSidebarDesc": {
+ "message": "This action cannot be done in the sidebar, please retry the action in the popup or popout."
+ },
+ "personalOwnershipSubmitError": {
+ "message": "Due to an Enterprise Policy, you are restricted from saving items to your personal vault. Change the Ownership option to an organization and choose from available Collections."
+ },
+ "personalOwnershipPolicyInEffect": {
+ "message": "An organization policy is affecting your ownership options."
+ },
+ "excludedDomains": {
+ "message": "Excluded Domains"
+ },
+ "excludedDomainsDesc": {
+ "message": "Bitwarden will not ask to save login details for these domains. You must refresh the page for changes to take effect."
+ },
+ "excludedDomainsInvalidDomain": {
+ "message": "$DOMAIN$ is not a valid domain",
+ "placeholders": {
+ "domain": {
+ "content": "$1",
+ "example": "googlecom"
+ }
+ }
+ },
+ "send": {
+ "message": "Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "searchSends": {
+ "message": "Search Sends",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "addSend": {
+ "message": "Add Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTypeText": {
+ "message": "Text"
+ },
+ "sendTypeFile": {
+ "message": "File"
+ },
+ "allSends": {
+ "message": "All Sends",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "maxAccessCountReached": {
+ "message": "Max access count reached"
+ },
+ "expired": {
+ "message": "Expired"
+ },
+ "pendingDeletion": {
+ "message": "Pending deletion"
+ },
+ "passwordProtected": {
+ "message": "Password protected"
+ },
+ "copySendLink": {
+ "message": "Copy Send link",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "removePassword": {
+ "message": "Remove Password"
+ },
+ "delete": {
+ "message": "Delete"
+ },
+ "removedPassword": {
+ "message": "Removed Password"
+ },
+ "deletedSend": {
+ "message": "Deleted Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendLink": {
+ "message": "Send link",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "disabled": {
+ "message": "Disabled"
+ },
+ "removePasswordConfirmation": {
+ "message": "Are you sure you want to remove the password?"
+ },
+ "deleteSend": {
+ "message": "Delete Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "deleteSendConfirmation": {
+ "message": "Are you sure you want to delete this Send?",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "editSend": {
+ "message": "Edit Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTypeHeader": {
+ "message": "What type of Send is this?",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendNameDesc": {
+ "message": "A friendly name to describe this Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendFileDesc": {
+ "message": "The file you want to send."
+ },
+ "deletionDate": {
+ "message": "Deletion Date"
+ },
+ "deletionDateDesc": {
+ "message": "The Send will be permanently deleted on the specified date and time.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "expirationDate": {
+ "message": "Expiration Date"
+ },
+ "expirationDateDesc": {
+ "message": "If set, access to this Send will expire on the specified date and time.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "oneDay": {
+ "message": "1 day"
+ },
+ "days": {
+ "message": "$DAYS$ days",
+ "placeholders": {
+ "days": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "custom": {
+ "message": "Custom"
+ },
+ "maximumAccessCount": {
+ "message": "Maximum Access Count"
+ },
+ "maximumAccessCountDesc": {
+ "message": "If set, users will no longer be able to access this Send once the maximum access count is reached.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendPasswordDesc": {
+ "message": "Optionally require a password for users to access this Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendNotesDesc": {
+ "message": "Private notes about this Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendDisableDesc": {
+ "message": "Disable this Send so that no one can access it.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendShareDesc": {
+ "message": "Copy this Send's link to clipboard upon save.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTextDesc": {
+ "message": "The text you want to send."
+ },
+ "sendHideText": {
+ "message": "Hide this Send's text by default.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "currentAccessCount": {
+ "message": "Current Access Count"
+ },
+ "createSend": {
+ "message": "Create New Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "newPassword": {
+ "message": "New Password"
+ },
+ "sendDisabled": {
+ "message": "Send Disabled",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendDisabledWarning": {
+ "message": "Due to an enterprise policy, you are only able to delete an existing Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "createdSend": {
+ "message": "Created Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "editedSend": {
+ "message": "Edited Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendLinuxChromiumFileWarning": {
+ "message": "In order to choose a file, open the extension in the sidebar (if possible) or pop out to a new window by clicking this banner."
+ },
+ "sendFirefoxFileWarning": {
+ "message": "In order to choose a file using Firefox, open the extension in the sidebar or pop out to a new window by clicking this banner."
+ },
+ "sendSafariFileWarning": {
+ "message": "In order to choose a file using Safari, pop out to a new window by clicking this banner."
+ },
+ "sendFileCalloutHeader": {
+ "message": "Before you start"
+ },
+ "sendFirefoxCustomDatePopoutMessage1": {
+ "message": "To use a calendar style date picker",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read '**To use a calendar style date picker ** click here to pop out your window.'"
+ },
+ "sendFirefoxCustomDatePopoutMessage2": {
+ "message": "click here",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker **click here** to pop out your window.'"
+ },
+ "sendFirefoxCustomDatePopoutMessage3": {
+ "message": "to pop out your window.",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker click here **to pop out your window.**'"
+ },
+ "expirationDateIsInvalid": {
+ "message": "The expiration date provided is not valid."
+ },
+ "deletionDateIsInvalid": {
+ "message": "The deletion date provided is not valid."
+ },
+ "expirationDateAndTimeRequired": {
+ "message": "An expiration date and time are required."
+ },
+ "deletionDateAndTimeRequired": {
+ "message": "A deletion date and time are required."
+ },
+ "dateParsingError": {
+ "message": "There was an error saving your deletion and expiration dates."
+ },
+ "hideEmail": {
+ "message": "Hide my email address from recipients."
+ },
+ "sendOptionsPolicyInEffect": {
+ "message": "One or more organization policies are affecting your Send options."
+ },
+ "passwordPrompt": {
+ "message": "Master password re-prompt"
+ },
+ "passwordConfirmation": {
+ "message": "Master password confirmation"
+ },
+ "passwordConfirmationDesc": {
+ "message": "This action is protected. To continue, please re-enter your master password to verify your identity."
+ },
+ "emailVerificationRequired": {
+ "message": "Email Verification Required"
+ },
+ "emailVerificationRequiredDesc": {
+ "message": "You must verify your email to use this feature. You can verify your email in the web vault."
+ },
+ "updatedMasterPassword": {
+ "message": "Updated Master Password"
+ },
+ "updateMasterPassword": {
+ "message": "Update Master Password"
+ },
+ "updateMasterPasswordWarning": {
+ "message": "Your Master Password was recently changed by an administrator in your organization. In order to access the vault, you must update it now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour."
+ },
+ "resetPasswordPolicyAutoEnroll": {
+ "message": "Automatic Enrollment"
+ },
+ "resetPasswordAutoEnrollInviteWarning": {
+ "message": "This organization has an enterprise policy that will automatically enroll you in password reset. Enrollment will allow organization administrators to change your master password."
+ },
+ "selectFolder": {
+ "message": "Select folder..."
+ },
+ "ssoCompleteRegistration": {
+ "message": "In order to complete logging in with SSO, please set a master password to access and protect your vault."
+ },
+ "hours": {
+ "message": "Hours"
+ },
+ "minutes": {
+ "message": "Minutes"
+ },
+ "vaultTimeoutPolicyInEffect": {
+ "message": "Your organization policies are affecting your vault timeout. Maximum allowed Vault Timeout is $HOURS$ hour(s) and $MINUTES$ minute(s)",
+ "placeholders": {
+ "hours": {
+ "content": "$1",
+ "example": "5"
+ },
+ "minutes": {
+ "content": "$2",
+ "example": "5"
+ }
+ }
+ },
+ "vaultTimeoutToLarge": {
+ "message": "Your vault timeout exceeds the restrictions set by your organization."
+ },
+ "vaultExportDisabled": {
+ "message": "Vault Export Disabled"
+ },
+ "personalVaultExportPolicyInEffect": {
+ "message": "One or more organization policies prevents you from exporting your personal vault."
+ },
+ "copyCustomFieldNameInvalidElement": {
+ "message": "Unable to identify a valid form element. Try inspecting the HTML instead."
+ },
+ "copyCustomFieldNameNotUnique": {
+ "message": "No unique identifier found."
+ }
+}
diff --git a/src/iOS.Safari/Resources/_locales/sr/messages.json b/src/iOS.Safari/Resources/_locales/sr/messages.json
new file mode 100644
index 000000000..f76a7b755
--- /dev/null
+++ b/src/iOS.Safari/Resources/_locales/sr/messages.json
@@ -0,0 +1,1817 @@
+{
+ "appName": {
+ "message": "Bitwarden"
+ },
+ "extName": {
+ "message": "Bitwarden - Бесплатни Менаџер Лозинке",
+ "description": "Extension name, MUST be less than 40 characters (Safari restriction)"
+ },
+ "extDesc": {
+ "message": "Сигурни и бесплатни менаџер лозинке за сва Ваша уређаја.",
+ "description": "Extension description"
+ },
+ "loginOrCreateNewAccount": {
+ "message": "Пријавите се или креирајте нови налог за приступ Сефу."
+ },
+ "createAccount": {
+ "message": "Креирај налог"
+ },
+ "login": {
+ "message": "Пријавите се"
+ },
+ "enterpriseSingleSignOn": {
+ "message": "Enterprise Једна Пријава"
+ },
+ "cancel": {
+ "message": "Откажи"
+ },
+ "close": {
+ "message": "Затвори"
+ },
+ "submit": {
+ "message": "Пошаљи"
+ },
+ "emailAddress": {
+ "message": "Адреса е-поште"
+ },
+ "masterPass": {
+ "message": "Главна Лозинка"
+ },
+ "masterPassDesc": {
+ "message": "Главна Лозинка је лозинка коју користите за приступ Вашем сефу. Врло је важно да је не заборавите. Не постоји начин да повратите лозинку у случају да је заборавите."
+ },
+ "masterPassHintDesc": {
+ "message": "Савет Главне Лозинке може да Вам помогне да се је потсетите ако је заборавите."
+ },
+ "reTypeMasterPass": {
+ "message": "Поновити Главну Лозинку"
+ },
+ "masterPassHint": {
+ "message": "Савет Главне Лозинке (опционо)"
+ },
+ "tab": {
+ "message": "Језичак"
+ },
+ "myVault": {
+ "message": "Мој Сеф"
+ },
+ "tools": {
+ "message": "Алатке"
+ },
+ "settings": {
+ "message": "Подешавања"
+ },
+ "currentTab": {
+ "message": "Тренутни језичак"
+ },
+ "copyPassword": {
+ "message": "Копирај лозинку"
+ },
+ "copyNote": {
+ "message": "Копирај белешку"
+ },
+ "copyUri": {
+ "message": "Копирај УРЛ"
+ },
+ "copyUsername": {
+ "message": "Копирај име"
+ },
+ "copyNumber": {
+ "message": "Копирај број"
+ },
+ "copySecurityCode": {
+ "message": "Копирај сигурносни код"
+ },
+ "autoFill": {
+ "message": "Ауто-пуњење"
+ },
+ "generatePasswordCopied": {
+ "message": "Генериши Лозинку (копирано)"
+ },
+ "copyElementIdentifier": {
+ "message": "Copy Custom Field Name"
+ },
+ "noMatchingLogins": {
+ "message": "Нема одговарајућих пријављивање."
+ },
+ "vaultLocked": {
+ "message": "Сеф је блокиран."
+ },
+ "vaultLoggedOut": {
+ "message": "Одјављени сте од сефа."
+ },
+ "autoFillInfo": {
+ "message": "Нема доступне пријаве за ауто-пуњење за тренутни језичак прегледача."
+ },
+ "addLogin": {
+ "message": "Додај Пријаву"
+ },
+ "addItem": {
+ "message": "Додај ставку"
+ },
+ "passwordHint": {
+ "message": "Помоћ за лозинку"
+ },
+ "enterEmailToGetHint": {
+ "message": "Унесите Ваш имејл да би добили савет за Вашу Главну Лозинку."
+ },
+ "getMasterPasswordHint": {
+ "message": "Добити савет за Главну Лозинку"
+ },
+ "continue": {
+ "message": "Настави"
+ },
+ "verificationCode": {
+ "message": "Верификациони код"
+ },
+ "account": {
+ "message": "Налог"
+ },
+ "changeMasterPassword": {
+ "message": "Промени главну лозинку"
+ },
+ "fingerprintPhrase": {
+ "message": "Сигурносна Фраза Сефа",
+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
+ },
+ "yourAccountsFingerprint": {
+ "message": "Ваша Сигурносна Фраза Сефа",
+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
+ },
+ "twoStepLogin": {
+ "message": "Дво-коракна лозинка"
+ },
+ "logOut": {
+ "message": "Одјави се"
+ },
+ "about": {
+ "message": "О апликацији"
+ },
+ "version": {
+ "message": "Верзија"
+ },
+ "save": {
+ "message": "Сачувај"
+ },
+ "move": {
+ "message": "Премести"
+ },
+ "addFolder": {
+ "message": "Додај фасциклу"
+ },
+ "name": {
+ "message": "Име"
+ },
+ "editFolder": {
+ "message": "Уреди фасциклу"
+ },
+ "deleteFolder": {
+ "message": "Избриши фасциклу"
+ },
+ "folders": {
+ "message": "Фасцикле"
+ },
+ "noFolders": {
+ "message": "Нема фасцикле у листи."
+ },
+ "helpFeedback": {
+ "message": "Помоћ и подршка"
+ },
+ "sync": {
+ "message": "Синхронизација"
+ },
+ "syncVaultNow": {
+ "message": "Одмах синхронизуј сеф"
+ },
+ "lastSync": {
+ "message": "Задња синронизација:"
+ },
+ "passGen": {
+ "message": "Генератор Лозинке"
+ },
+ "generator": {
+ "message": "Генератор",
+ "description": "Short for 'Password Generator'."
+ },
+ "passGenInfo": {
+ "message": "Аутоматски генеришите јаке, јединствене лозинке за ваше пријаве."
+ },
+ "bitWebVault": {
+ "message": "Bitwarden Интернет Сеф"
+ },
+ "importItems": {
+ "message": "Увоз ставки"
+ },
+ "select": {
+ "message": "Изабери"
+ },
+ "generatePassword": {
+ "message": "Генерисање лозинке"
+ },
+ "regeneratePassword": {
+ "message": "Поново генериши лозинку"
+ },
+ "options": {
+ "message": "Опције"
+ },
+ "length": {
+ "message": "Дужина"
+ },
+ "numWords": {
+ "message": "Број речи"
+ },
+ "wordSeparator": {
+ "message": "Одвајач речи"
+ },
+ "capitalize": {
+ "message": "Прво слово велико",
+ "description": "Make the first letter of a work uppercase."
+ },
+ "includeNumber": {
+ "message": "Убаци број"
+ },
+ "minNumbers": {
+ "message": "Минимално Бројева"
+ },
+ "minSpecial": {
+ "message": "Минимално Специјално"
+ },
+ "avoidAmbChar": {
+ "message": "Избегавај двосмислене карактере"
+ },
+ "searchVault": {
+ "message": "Претражи сеф"
+ },
+ "edit": {
+ "message": "Уреди"
+ },
+ "view": {
+ "message": "Приказ"
+ },
+ "noItemsInList": {
+ "message": "Нама ставке у листи."
+ },
+ "itemInformation": {
+ "message": "Инфо о ставци"
+ },
+ "username": {
+ "message": "Корисничко име"
+ },
+ "password": {
+ "message": "Лозинка"
+ },
+ "passphrase": {
+ "message": "Фраза лозинка"
+ },
+ "favorite": {
+ "message": "Омиљено"
+ },
+ "notes": {
+ "message": "Белешке"
+ },
+ "note": {
+ "message": "Белешка"
+ },
+ "editItem": {
+ "message": "Уреди ставку"
+ },
+ "folder": {
+ "message": "Фасцикла"
+ },
+ "deleteItem": {
+ "message": "Обриши ставку"
+ },
+ "viewItem": {
+ "message": "Види ставку"
+ },
+ "launch": {
+ "message": "Отвори"
+ },
+ "website": {
+ "message": "Веб сајт"
+ },
+ "toggleVisibility": {
+ "message": "Пребаци видљивост"
+ },
+ "manage": {
+ "message": "Управљати"
+ },
+ "other": {
+ "message": "Остало"
+ },
+ "rateExtension": {
+ "message": "Оцени овај додатак"
+ },
+ "rateExtensionDesc": {
+ "message": "Молимо вас да размотрите да нам помогнете уз добру оцену!"
+ },
+ "browserNotSupportClipboard": {
+ "message": "Ваш прегледач не подржава једноставно копирање оставе. Уместо тога копирајте га ручно."
+ },
+ "verifyMasterPassword": {
+ "message": "Верификујте Главну Лозинку"
+ },
+ "yourVaultIsLocked": {
+ "message": "Сеф је блокиран. Унесите главну лозинку за наставак."
+ },
+ "unlock": {
+ "message": "Откључај"
+ },
+ "loggedInAsOn": {
+ "message": "Пријављено са $EMAIL$ на $HOSTNAME$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "name@example.com"
+ },
+ "hostname": {
+ "content": "$2",
+ "example": "bitwarden.com"
+ }
+ }
+ },
+ "invalidMasterPassword": {
+ "message": "Погрешна главна лозинка"
+ },
+ "vaultTimeout": {
+ "message": "Тајмаут сефа"
+ },
+ "lockNow": {
+ "message": "Закључај одмах"
+ },
+ "immediately": {
+ "message": "Одмах"
+ },
+ "tenSeconds": {
+ "message": "10 секунди"
+ },
+ "twentySeconds": {
+ "message": "20 секунди"
+ },
+ "thirtySeconds": {
+ "message": "30 секунди"
+ },
+ "oneMinute": {
+ "message": "1 минут"
+ },
+ "twoMinutes": {
+ "message": "2 минута"
+ },
+ "fiveMinutes": {
+ "message": "5 минута"
+ },
+ "fifteenMinutes": {
+ "message": "15 минута"
+ },
+ "thirtyMinutes": {
+ "message": "30 минута"
+ },
+ "oneHour": {
+ "message": "1 сат"
+ },
+ "fourHours": {
+ "message": "4 сата"
+ },
+ "onLocked": {
+ "message": "На блокирање система"
+ },
+ "onRestart": {
+ "message": "На покретање прегледача"
+ },
+ "never": {
+ "message": "Никада"
+ },
+ "security": {
+ "message": "Сигурност"
+ },
+ "errorOccurred": {
+ "message": "Дошло је до грешке!"
+ },
+ "emailRequired": {
+ "message": "Имејл је неопходан."
+ },
+ "invalidEmail": {
+ "message": "Неисправан имејл."
+ },
+ "masterPassRequired": {
+ "message": "Главна Лозинка је неопходна."
+ },
+ "masterPassLength": {
+ "message": "Главна Лозинка треба имати бар 8 знака."
+ },
+ "masterPassDoesntMatch": {
+ "message": "Потврђена Главна Лозинка се не подудара."
+ },
+ "newAccountCreated": {
+ "message": "Ваш налог је креиран! Сада се можте пријавити."
+ },
+ "masterPassSent": {
+ "message": "Послали смо Вам поруку са саветом главне лозинке."
+ },
+ "verificationCodeRequired": {
+ "message": "Верификациони код је обавезан."
+ },
+ "valueCopied": {
+ "message": "$VALUE$ копиран(а/о)",
+ "description": "Value has been copied to the clipboard.",
+ "placeholders": {
+ "value": {
+ "content": "$1",
+ "example": "Password"
+ }
+ }
+ },
+ "autofillError": {
+ "message": "Није могуће ауто-пуњење одабране ставке на овој страници. Уместо тога копирајте и налепите информације."
+ },
+ "loggedOut": {
+ "message": "Одјављено"
+ },
+ "loginExpired": {
+ "message": "Ваша сесија је истекла."
+ },
+ "logOutConfirmation": {
+ "message": "Заиста желите да се одјавите?"
+ },
+ "yes": {
+ "message": "Да"
+ },
+ "no": {
+ "message": "Не"
+ },
+ "unexpectedError": {
+ "message": "Дошло је до неочекиване грешке."
+ },
+ "nameRequired": {
+ "message": "Име је неопходно."
+ },
+ "addedFolder": {
+ "message": "Фасцикла додата"
+ },
+ "changeMasterPass": {
+ "message": "Промени главну лозинку"
+ },
+ "changeMasterPasswordConfirmation": {
+ "message": "Можете променити главну лозинку у Вашем сефу на bitwarden.com. Да ли желите да посетите веб страницу сада?"
+ },
+ "twoStepLoginConfirmation": {
+ "message": "Пријава у два корака чини ваш рачун сигурнијим захтевом да верификујете своје податке помоћу другог уређаја, као што су безбедносни кључ, апликација, СМС-а, телефонски позив или имејл. Пријављивање у два корака може се омогућити на веб сефу. Да ли желите да посетите веб страницу сада?"
+ },
+ "editedFolder": {
+ "message": "Фасцикла измењена"
+ },
+ "deleteFolderConfirmation": {
+ "message": "Сигурно обрисати ову фасциклу?"
+ },
+ "deletedFolder": {
+ "message": "Фасцикла обрисана"
+ },
+ "gettingStartedTutorial": {
+ "message": "Туторијал"
+ },
+ "gettingStartedTutorialVideo": {
+ "message": "Погледајте наш туторијал да бисте сазнали како да максимално искористите додатак прегледача."
+ },
+ "syncingComplete": {
+ "message": "Синхронизација је завршена"
+ },
+ "syncingFailed": {
+ "message": "Синхронизација није успела"
+ },
+ "passwordCopied": {
+ "message": "Лозинка копирана"
+ },
+ "uri": {
+ "message": "Линк"
+ },
+ "uriPosition": {
+ "message": "Линк $POSITION$",
+ "description": "A listing of URIs. Ex: URI 1, URI 2, URI 3, etc.",
+ "placeholders": {
+ "position": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "newUri": {
+ "message": "Нови линк"
+ },
+ "addedItem": {
+ "message": "Ставка додата"
+ },
+ "editedItem": {
+ "message": "Ставка уређена"
+ },
+ "deleteItemConfirmation": {
+ "message": "Сигурно избрисати ову ставку?"
+ },
+ "deletedItem": {
+ "message": "Ставка послата у Отпад"
+ },
+ "overwritePassword": {
+ "message": "Препиши лозинку"
+ },
+ "overwritePasswordConfirmation": {
+ "message": "Сигурно преписати тренутну лозинку?"
+ },
+ "searchFolder": {
+ "message": "Претражи фасцикли"
+ },
+ "searchCollection": {
+ "message": "Претражи колекцију"
+ },
+ "searchType": {
+ "message": "Тип претраге"
+ },
+ "noneFolder": {
+ "message": "Без фасцикле",
+ "description": "This is the folder for uncategorized items"
+ },
+ "disableAddLoginNotification": {
+ "message": "Онемогући обавештење Додај Пријаву"
+ },
+ "addLoginNotificationDesc": {
+ "message": "„Нотификације Додај Лозинку“ аутоматски тражи да сачувате нове пријаве у сефу кад год се први пут пријавите на њих."
+ },
+ "dontShowCardsCurrentTab": {
+ "message": "Не приказуј кредитне картице на страници"
+ },
+ "dontShowCardsCurrentTabDesc": {
+ "message": "Ставке кредитне картице из вашег сефа наведене су на страници „Тренутна картица“ ради једноставног приступа аутоматског попуњавања."
+ },
+ "dontShowIdentitiesCurrentTab": {
+ "message": "Не приказуј идентитете на страници"
+ },
+ "dontShowIdentitiesCurrentTabDesc": {
+ "message": "Идентитет из вашег сефа наведене су на страници „Тренутна картица“ ради једноставног приступа аутоматског попуњавања."
+ },
+ "clearClipboard": {
+ "message": "Обриши оставу",
+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
+ },
+ "clearClipboardDesc": {
+ "message": "Аутоматски обришите копиране вредности из оставе.",
+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
+ },
+ "notificationAddDesc": {
+ "message": "Да ли Bitwarden треба да запамти ову лозинку?"
+ },
+ "notificationAddSave": {
+ "message": "Да, сачувај сада"
+ },
+ "notificationNeverSave": {
+ "message": "Никада за овај сајт"
+ },
+ "disableChangedPasswordNotification": {
+ "message": "Угаси Нотификацију Промењена Лозинка"
+ },
+ "disableChangedPasswordNotificationDesc": {
+ "message": "„Нотификација Промењена Лозинка“ аутоматски тражи да ажурирате лозинку за пријављивање у сефу сваки пут када открије да сте је променили на веб сајту."
+ },
+ "notificationChangeDesc": {
+ "message": "Да се ажурира ова лозинка у Bitwarden?"
+ },
+ "notificationChangeSave": {
+ "message": "Да, ажурирај сада"
+ },
+ "disableContextMenuItem": {
+ "message": "Угаси контекстуални мени"
+ },
+ "disableContextMenuItemDesc": {
+ "message": "Опције контекстуалног менија пружају брз приступ генерисању лозинки и пријавама за веб сајту на вашом тренутном језичку."
+ },
+ "defaultUriMatchDetection": {
+ "message": "Стандардно налажење УРЛ",
+ "description": "Default URI match detection for auto-fill."
+ },
+ "defaultUriMatchDetectionDesc": {
+ "message": "Изаберите подразумевани начин на који се поступа са откривањем УРЛ за пријаве приликом извођења радњи као што је ауто-попуњавање."
+ },
+ "theme": {
+ "message": "Тема"
+ },
+ "themeDesc": {
+ "message": "Промени боје апликације"
+ },
+ "dark": {
+ "message": "Тамна",
+ "description": "Dark color"
+ },
+ "light": {
+ "message": "Светла",
+ "description": "Light color"
+ },
+ "solarizedDark": {
+ "message": "Solarized црно",
+ "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated."
+ },
+ "exportVault": {
+ "message": "Извоз сефа"
+ },
+ "fileFormat": {
+ "message": "Формат датотеке"
+ },
+ "warning": {
+ "message": "УПОЗОРЕЊЕ",
+ "description": "WARNING (should stay in capitalized letters if the language permits)"
+ },
+ "confirmVaultExport": {
+ "message": "Потврдите извоз сефа"
+ },
+ "exportWarningDesc": {
+ "message": "Овај извоз садржи податке сефа у нешифрираном формату. Не бисте смели да сачувате или шаљете извезену датотеку преко несигурних канала (као што је имејл). Избришите датотеку одмах након што завршите са коришћењем."
+ },
+ "encExportKeyWarningDesc": {
+ "message": "Овај извоз шифрује податке користећи кључ за шифровање вашег налога. Ако икада промените кључ за шифровање свог налога, требало би да поново извезете, јер нећете моћи да дешифрујете овај извоз."
+ },
+ "encExportAccountWarningDesc": {
+ "message": "Кључеви за шифровање налога јединствени су за сваки кориснички рачун Bitwarden-а, тако да не можете да увезете шифровани извоз на други налог."
+ },
+ "exportMasterPassword": {
+ "message": "Унети главну лозинку за извоз сефа."
+ },
+ "shared": {
+ "message": "Дељено"
+ },
+ "learnOrg": {
+ "message": "Сазнајте о организацијама"
+ },
+ "learnOrgConfirmation": {
+ "message": "Bitwarden вам омогућава да делите сефса елемената другима користећи организацију. Да ли желите да посетите веб локацију bitwarden.com да бисте сазнали више?"
+ },
+ "moveToOrganization": {
+ "message": "Прмести у организацију"
+ },
+ "share": {
+ "message": "Подели"
+ },
+ "movedItemToOrg": {
+ "message": "$ITEMNAME$ премештен у $ORGNAME$",
+ "placeholders": {
+ "itemname": {
+ "content": "$1",
+ "example": "Secret Item"
+ },
+ "orgname": {
+ "content": "$2",
+ "example": "Company Name"
+ }
+ }
+ },
+ "moveToOrgDesc": {
+ "message": "Изаберите организацију коју желите да преместите овај предмет. Прелазак на организацију преноси власништво над ставком у ту организацију. Више нећете бити директни власник ове ставке након што је премештена."
+ },
+ "learnMore": {
+ "message": "Сазнај више"
+ },
+ "authenticatorKeyTotp": {
+ "message": "Једнократни код"
+ },
+ "verificationCodeTotp": {
+ "message": "Једнократни код"
+ },
+ "copyVerificationCode": {
+ "message": "Копирај верификациони код"
+ },
+ "attachments": {
+ "message": "Прилози"
+ },
+ "deleteAttachment": {
+ "message": "Обриши прилог"
+ },
+ "deleteAttachmentConfirmation": {
+ "message": "Сигурно обрисати овај прилог?"
+ },
+ "deletedAttachment": {
+ "message": "Избрисани прилози"
+ },
+ "newAttachment": {
+ "message": "Додај нови прилог"
+ },
+ "noAttachments": {
+ "message": "Без прилога."
+ },
+ "attachmentSaved": {
+ "message": "Прилог је сачуван."
+ },
+ "file": {
+ "message": "Датотека"
+ },
+ "selectFile": {
+ "message": "Изабери датотеку."
+ },
+ "maxFileSize": {
+ "message": "Максимална величина је 500МБ."
+ },
+ "featureUnavailable": {
+ "message": "Функција је недоступна"
+ },
+ "updateKey": {
+ "message": "Не можете да користите ову способност док не промените Ваш кључ за шифровање."
+ },
+ "premiumMembership": {
+ "message": "Премијум чланство"
+ },
+ "premiumManage": {
+ "message": "Управљање чланством"
+ },
+ "premiumManageAlert": {
+ "message": "Можете менаџирати Вашу претплату на bitwarden.com. Да ли желите да посетите веб сајт сада?"
+ },
+ "premiumRefresh": {
+ "message": "Освежите чланство"
+ },
+ "premiumNotCurrentMember": {
+ "message": "Тренутно нисте премијум члан."
+ },
+ "premiumSignUpAndGet": {
+ "message": "Пријавите се за премијум чланство и добијте:"
+ },
+ "ppremiumSignUpStorage": {
+ "message": "1ГБ шифровано складиште за прилоге."
+ },
+ "ppremiumSignUpTwoStep": {
+ "message": "Додатне опције пријаве у два корака као што су YubiKey, FIDO U2F, и Duo."
+ },
+ "ppremiumSignUpReports": {
+ "message": "Извештаји о хигијени лозинки, здравственом стању налога и кршењу података да бисте заштитили сеф."
+ },
+ "ppremiumSignUpTotp": {
+ "message": "Генератор једнократног кода (2FA) за пријаве из сефа."
+ },
+ "ppremiumSignUpSupport": {
+ "message": "Приоритетна корисничка подршка."
+ },
+ "ppremiumSignUpFuture": {
+ "message": "Све будуће премијум функције. Више долазе ускоро!"
+ },
+ "premiumPurchase": {
+ "message": "Купити премијум"
+ },
+ "premiumPurchaseAlert": {
+ "message": "Можете купити премијум претплату на bitwarden.com. Да ли желите да посетите веб сајт сада?"
+ },
+ "premiumCurrentMember": {
+ "message": "Ви сте премијум члан!"
+ },
+ "premiumCurrentMemberThanks": {
+ "message": "Хвала Вам за подршку Bitwarden-а."
+ },
+ "premiumPrice": {
+ "message": "Све за само $PRICE$ годишње!",
+ "placeholders": {
+ "price": {
+ "content": "$1",
+ "example": "$10"
+ }
+ }
+ },
+ "refreshComplete": {
+ "message": "Освежавање је завршено"
+ },
+ "disableAutoTotpCopy": {
+ "message": "Угаси аутоматско копирање једнократног кода"
+ },
+ "disableAutoTotpCopyDesc": {
+ "message": "Ако је за вашу пријаву приложен аутентификациони кључ, једнократни код се аутоматски копира у вашој остави кад год ауто-попуните пријаву."
+ },
+ "disableAutoBiometricsPrompt": {
+ "message": "Do not prompt for biometrics on launch"
+ },
+ "premiumRequired": {
+ "message": "Потребан Премијум"
+ },
+ "premiumRequiredDesc": {
+ "message": "Премијум је потребно за употребу ове способности."
+ },
+ "enterVerificationCodeApp": {
+ "message": "Унесите шестоцифрени верификациони код из апликације за утврђивање аутентичности."
+ },
+ "enterVerificationCodeEmail": {
+ "message": "Унесите шестоцифрени верификациони код који је послан на $EMAIL$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "example@gmail.com"
+ }
+ }
+ },
+ "verificationCodeEmailSent": {
+ "message": "Провера имејла послата на $EMAIL$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "example@gmail.com"
+ }
+ }
+ },
+ "rememberMe": {
+ "message": "Запамти ме"
+ },
+ "sendVerificationCodeEmailAgain": {
+ "message": "Поново послати верификациони код на имејл"
+ },
+ "useAnotherTwoStepMethod": {
+ "message": "Користите другу методу пријављивања у два корака"
+ },
+ "insertYubiKey": {
+ "message": "Убаците свој YubiKey у УСБ порт рачунара, а затим додирните његово дугме."
+ },
+ "insertU2f": {
+ "message": "Убаците свој сигурносни кључ у УСБ порт рачунара, и ако има дугме , додирните га."
+ },
+ "webAuthnNewTab": {
+ "message": "Наставите WebAuthn 2FA верификација у новом језичку."
+ },
+ "webAuthnNewTabOpen": {
+ "message": "Отвори нови језичак "
+ },
+ "webAuthnAuthenticate": {
+ "message": "WebAutn аутентификација"
+ },
+ "loginUnavailable": {
+ "message": "Пријава недоступна"
+ },
+ "noTwoStepProviders": {
+ "message": "Овај налог има омогућено пријављивање у два корака, међутим овај веб прегледач не подржава ниједног од конфигурисаних добављача."
+ },
+ "noTwoStepProviders2": {
+ "message": "Користите подржани веб прегледач (као што је Chrome) и/или додајте додатне добављаче који су боље подржани у веб прегледачима (као што је апликација за аутентификацију)."
+ },
+ "twoStepOptions": {
+ "message": "Опције дво-коракне пријаве"
+ },
+ "recoveryCodeDesc": {
+ "message": "Изгубили сте приступ свим својим двофакторским добављачима? Употребите код за опоравак да онемогућите све двофакторске добављаче из налога."
+ },
+ "recoveryCodeTitle": {
+ "message": "Шифра за опоравак"
+ },
+ "authenticatorAppTitle": {
+ "message": "Апликација Аутентификатор"
+ },
+ "authenticatorAppDesc": {
+ "message": "Користите апликацију за аутентификацију (као што је Authy или Google Authenticator) за генерисање верификационих кодова.",
+ "description": "'Authy' and 'Google Authenticator' are product names and should not be translated."
+ },
+ "yubiKeyTitle": {
+ "message": "YubiKey OTP сигурносни кључ"
+ },
+ "yubiKeyDesc": {
+ "message": "Користите YubiKey за приступ налогу. Ради са YubiKey 4, 4 Nano, 4C, и NEO уређаје."
+ },
+ "duoDesc": {
+ "message": "Провери са Duo Security користећи Duo Mobile апликацију, СМС, телефонски позив, или U2F кључ.",
+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
+ },
+ "duoOrganizationDesc": {
+ "message": "Провери са Duo Security за вашу организацију користећи Duo Mobile апликацију, СМС, телефонски позив, или U2F кључ.",
+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
+ },
+ "webAuthnTitle": {
+ "message": "FIDO2 WebAuthn"
+ },
+ "webAuthnDesc": {
+ "message": "Користите било који WebAuthn сигурносни кључ за присту налога."
+ },
+ "emailTitle": {
+ "message": "Е-пошта"
+ },
+ "emailDesc": {
+ "message": "Верификациони кодови ће вам бити послати имејлом."
+ },
+ "selfHostedEnvironment": {
+ "message": "Самостално окружење"
+ },
+ "selfHostedEnvironmentFooter": {
+ "message": "Наведите основни УРЛ вашег локалног инсталиране Bitwarden инсталације."
+ },
+ "customEnvironment": {
+ "message": "Прилагођено окружење"
+ },
+ "customEnvironmentFooter": {
+ "message": "За напредне кориснике. Можете да одредите независно основни УРЛ сваког сервиса."
+ },
+ "baseUrl": {
+ "message": "УРЛ Сервера"
+ },
+ "apiUrl": {
+ "message": "УРЛ АПИ Сервера"
+ },
+ "webVaultUrl": {
+ "message": "УРЛ сервера Сефа"
+ },
+ "identityUrl": {
+ "message": "УРЛ сервера идентитета"
+ },
+ "notificationsUrl": {
+ "message": "УРЛ сервера нотификације"
+ },
+ "iconsUrl": {
+ "message": "УРЛ сервера иконице"
+ },
+ "environmentSaved": {
+ "message": "УРЛ адресе окружења су сачуване."
+ },
+ "enableAutoFillOnPageLoad": {
+ "message": "Омогући Ауто-пуни на учитавање странице"
+ },
+ "enableAutoFillOnPageLoadDesc": {
+ "message": "Ако се открије образац за пријаву, извршите аутоматско попуњавање када се веб страница учита."
+ },
+ "experimentalFeature": {
+ "message": "Ово је тренутно експериментална способност. Користите на властиту одговорност."
+ },
+ "defaultAutoFillOnPageLoad": {
+ "message": "Подразумевано подешавање аутопуњења за пријаве"
+ },
+ "defaultAutoFillOnPageLoadDesc": {
+ "message": "Након што омогућите ауто-пуњење странице, можете омогућити или онемогућити функцију за појединачне ставке за пријаву. Ово је подразумевана поставка за ставке за пријаву која нису различито конфигурисана."
+ },
+ "itemAutoFillOnPageLoad": {
+ "message": "Ауто-пуњење на учитавање странице (ако омогућено у опцијама)"
+ },
+ "autoFillOnPageLoadUseDefault": {
+ "message": "Користи подразумевано подешавање"
+ },
+ "autoFillOnPageLoadYes": {
+ "message": "Ауто-пуњење на учитавање странице"
+ },
+ "autoFillOnPageLoadNo": {
+ "message": "Не ауто-пуни на учитавање странице"
+ },
+ "commandOpenPopup": {
+ "message": "Отвори попап сефа"
+ },
+ "commandOpenSidebar": {
+ "message": "Отвори сеф у бочну траку"
+ },
+ "commandAutofillDesc": {
+ "message": "Ауто-пуни последњу коришћену пријаву за тренутну веб страницу"
+ },
+ "commandGeneratePasswordDesc": {
+ "message": "Генеришите и копирајте нову случајну лозинку у остави"
+ },
+ "commandLockVaultDesc": {
+ "message": "Закључај сеф"
+ },
+ "privateModeMessage": {
+ "message": "Нажалост, овај прозор није доступан у приватном режиму за овај прегледач."
+ },
+ "customFields": {
+ "message": "Прилагођена Поља"
+ },
+ "copyValue": {
+ "message": "Копирај вредност"
+ },
+ "value": {
+ "message": "Вредност"
+ },
+ "newCustomField": {
+ "message": "Ново прилагођено поље"
+ },
+ "dragToSort": {
+ "message": "Превуците за сортирање"
+ },
+ "cfTypeText": {
+ "message": "Текст"
+ },
+ "cfTypeHidden": {
+ "message": "Сакривено"
+ },
+ "cfTypeBoolean": {
+ "message": "Булове"
+ },
+ "popup2faCloseMessage": {
+ "message": "Ако кликнете изван искачућег прозора да бисте проверили имејл за верификациони код, овај прозор ће се затворити. Да ли желите да отворите овај прозор у новом прозору да се не би затворио?"
+ },
+ "popupU2fCloseMessage": {
+ "message": "Овај прегледач не може да обрађује U2F захтеве у овом искачућем прозору. Да ли желите да отворите овај искачући прозор у новом прозору како бисте могли да се пријавите користећи U2F?"
+ },
+ "disableFavicon": {
+ "message": "Угаси иконице сајта"
+ },
+ "disableFaviconDesc": {
+ "message": "Иконе веб сајта пружају препознатљиву слику поред сваке пријаву у сефу."
+ },
+ "disableBadgeCounter": {
+ "message": "Онемогући бројач на иконицу"
+ },
+ "disableBadgeCounterDesc": {
+ "message": "Бројач иконице указује колико пријава имате за тренутну страницу у вашем сефу."
+ },
+ "cardholderName": {
+ "message": "Име Власника Картице"
+ },
+ "number": {
+ "message": "Број"
+ },
+ "brand": {
+ "message": "Произвођач"
+ },
+ "expirationMonth": {
+ "message": "Месец истека"
+ },
+ "expirationYear": {
+ "message": "Година истека"
+ },
+ "expiration": {
+ "message": "Истек"
+ },
+ "january": {
+ "message": "Јануар"
+ },
+ "february": {
+ "message": "Фебруар"
+ },
+ "march": {
+ "message": "Mart"
+ },
+ "april": {
+ "message": "Април"
+ },
+ "may": {
+ "message": "Мај"
+ },
+ "june": {
+ "message": "Јун"
+ },
+ "july": {
+ "message": "Јул"
+ },
+ "august": {
+ "message": "Август"
+ },
+ "september": {
+ "message": "Септембар"
+ },
+ "october": {
+ "message": "Октобар"
+ },
+ "november": {
+ "message": "Новембар"
+ },
+ "december": {
+ "message": "Децембар"
+ },
+ "securityCode": {
+ "message": "Сигурносни код"
+ },
+ "ex": {
+ "message": "нпр."
+ },
+ "title": {
+ "message": "Наслов"
+ },
+ "mr": {
+ "message": "Г."
+ },
+ "mrs": {
+ "message": "Гђц."
+ },
+ "ms": {
+ "message": "Гђа."
+ },
+ "dr": {
+ "message": "Др"
+ },
+ "firstName": {
+ "message": "Име"
+ },
+ "middleName": {
+ "message": "Средње име"
+ },
+ "lastName": {
+ "message": "Презиме"
+ },
+ "identityName": {
+ "message": "Име идентитета"
+ },
+ "company": {
+ "message": "Предузеће"
+ },
+ "ssn": {
+ "message": "Број социјалног осигурања"
+ },
+ "passportNumber": {
+ "message": "Број пасоша"
+ },
+ "licenseNumber": {
+ "message": "Број возачке дозволе"
+ },
+ "email": {
+ "message": "Имејл"
+ },
+ "phone": {
+ "message": "Телефон"
+ },
+ "address": {
+ "message": "Адреса"
+ },
+ "address1": {
+ "message": "Адреса 1"
+ },
+ "address2": {
+ "message": "Адреса 2"
+ },
+ "address3": {
+ "message": "Адреса 3"
+ },
+ "cityTown": {
+ "message": "Град"
+ },
+ "stateProvince": {
+ "message": "Држава / покрајина"
+ },
+ "zipPostalCode": {
+ "message": "Поштански број"
+ },
+ "country": {
+ "message": "Земља"
+ },
+ "type": {
+ "message": "Тип"
+ },
+ "typeLogin": {
+ "message": "Пријава"
+ },
+ "typeLogins": {
+ "message": "Пријаве"
+ },
+ "typeSecureNote": {
+ "message": "Сигурносна белешка"
+ },
+ "typeCard": {
+ "message": "Кредитна Картица"
+ },
+ "typeIdentity": {
+ "message": "Идентитет"
+ },
+ "passwordHistory": {
+ "message": "Историја Лозинке"
+ },
+ "back": {
+ "message": "Назад"
+ },
+ "collections": {
+ "message": "Колекције"
+ },
+ "favorites": {
+ "message": "Омиљени"
+ },
+ "popOutNewWindow": {
+ "message": "Отворите у нови прозор"
+ },
+ "refresh": {
+ "message": "Освежи"
+ },
+ "cards": {
+ "message": "Кредитне Картице"
+ },
+ "identities": {
+ "message": "Идентитети"
+ },
+ "logins": {
+ "message": "Пријаве"
+ },
+ "secureNotes": {
+ "message": "Сигурносне белешке"
+ },
+ "clear": {
+ "message": "Очисти",
+ "description": "To clear something out. example: To clear browser history."
+ },
+ "checkPassword": {
+ "message": "Проверите да ли је лозинка изложена."
+ },
+ "passwordExposed": {
+ "message": "Ова лозинка је изложена $VALUE$ пута. Требали би да је промените.",
+ "placeholders": {
+ "value": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "passwordSafe": {
+ "message": "Ова лозинка није никада изложена. Треба да је сигурна за употребу."
+ },
+ "baseDomain": {
+ "message": "Главни домен"
+ },
+ "host": {
+ "message": "Хост",
+ "description": "A URL's host value. For example, the host of https://sub.domain.com:443 is 'sub.domain.com:443'."
+ },
+ "exact": {
+ "message": "Тачно"
+ },
+ "startsWith": {
+ "message": "Почиње са"
+ },
+ "regEx": {
+ "message": "Регуларни израз",
+ "description": "A programming term, also known as 'RegEx'."
+ },
+ "matchDetection": {
+ "message": "Налажење УРЛ",
+ "description": "URI match detection for auto-fill."
+ },
+ "defaultMatchDetection": {
+ "message": "Стандардно налажење вење",
+ "description": "Default URI match detection for auto-fill."
+ },
+ "toggleOptions": {
+ "message": "Пребацити опције"
+ },
+ "toggleCurrentUris": {
+ "message": "Укључи/искључи тренутне УРЛ",
+ "description": "Toggle the display of the URIs of the currently open tabs in the browser."
+ },
+ "currentUri": {
+ "message": "Тренутни УРЛ",
+ "description": "The URI of one of the current open tabs in the browser."
+ },
+ "organization": {
+ "message": "Организација",
+ "description": "An entity of multiple related people (ex. a team or business organization)."
+ },
+ "types": {
+ "message": "Врсте"
+ },
+ "allItems": {
+ "message": "Све ставке"
+ },
+ "noPasswordsInList": {
+ "message": "Нама лозинке у листи."
+ },
+ "remove": {
+ "message": "Уклони"
+ },
+ "default": {
+ "message": "Подразумевано"
+ },
+ "dateUpdated": {
+ "message": "Промењено",
+ "description": "ex. Date this item was updated"
+ },
+ "datePasswordUpdated": {
+ "message": "Лозинка ажурирана",
+ "description": "ex. Date this password was updated"
+ },
+ "neverLockWarning": {
+ "message": "Да ли сте сигурни да желите да користите опцију „Никад“? Ако поставите опције закључавања на „Никада“, на вашем уређају се чува кључ за шифровање сефа. Ако користите ову опцију, осигурајте да је уређај правилно заштићен."
+ },
+ "noOrganizationsList": {
+ "message": "Не припадате ниједној организацији. Организације вам омогућавају да безбедно делите ставке са другим корисницима."
+ },
+ "noCollectionsInList": {
+ "message": "Нема колекције у листи."
+ },
+ "ownership": {
+ "message": "Власништво"
+ },
+ "whoOwnsThisItem": {
+ "message": "Ко је власник ове ставке?"
+ },
+ "strong": {
+ "message": "Јако",
+ "description": "ex. A strong password. Scale: Weak -> Good -> Strong"
+ },
+ "good": {
+ "message": "Добро",
+ "description": "ex. A good password. Scale: Weak -> Good -> Strong"
+ },
+ "weak": {
+ "message": "Слабо",
+ "description": "ex. A weak password. Scale: Weak -> Good -> Strong"
+ },
+ "weakMasterPassword": {
+ "message": "Слаба Главна Лозинка"
+ },
+ "weakMasterPasswordDesc": {
+ "message": "Главна лозинка коју сте одабрали је слаба. Требали бисте користити јаку главну лозинку (или фразу лозинке) да бисте правилно заштитили свој налог. Да ли сте сигурни да желите да користите ову главну лозинку?"
+ },
+ "pin": {
+ "message": "ПИН",
+ "description": "PIN code. Ex. The short code (often numeric) that you use to unlock a device."
+ },
+ "unlockWithPin": {
+ "message": "Откључај са ПИН"
+ },
+ "setYourPinCode": {
+ "message": "Поставите свој ПИН код за откључавање Bitwarden-а. Поставке ПИН-а ће се ресетовати ако се икада потпуно одјавите из апликације."
+ },
+ "pinRequired": {
+ "message": "ПИН је обавезан."
+ },
+ "invalidPin": {
+ "message": "Погрешан ПИН код."
+ },
+ "verifyPin": {
+ "message": "Верификујте PIN"
+ },
+ "yourVaultIsLockedPinCode": {
+ "message": "Сеф је блокиран. Проверити ПИН код за наставак."
+ },
+ "unlockWithBiometrics": {
+ "message": "Откључавајте помоћу биометрије"
+ },
+ "awaitDesktop": {
+ "message": "Чекање потврде са десктопа"
+ },
+ "awaitDesktopDesc": {
+ "message": "Потврдити са биометриком у Bitwarden Desktop апликацији да би упалили биометрику у претраживачу."
+ },
+ "lockWithMasterPassOnRestart": {
+ "message": "Закључајте са главном лозинком при поновном покретању прегледача"
+ },
+ "selectOneCollection": {
+ "message": "Морате одабрати макар једну колекцију."
+ },
+ "cloneItem": {
+ "message": "Клонирај ставку"
+ },
+ "clone": {
+ "message": "Клонирај"
+ },
+ "passwordGeneratorPolicyInEffect": {
+ "message": "Једна или више смерница организације утичу на поставке вашег генератора."
+ },
+ "vaultTimeoutAction": {
+ "message": "Акција на тајмаут сефа"
+ },
+ "lock": {
+ "message": "Закључај",
+ "description": "Verb form: to make secure or inaccesible by"
+ },
+ "trash": {
+ "message": "Отпад",
+ "description": "Noun: a special folder to hold deleted items"
+ },
+ "searchTrash": {
+ "message": "Тражи отпад"
+ },
+ "permanentlyDeleteItem": {
+ "message": "Трајно избрисати ставку"
+ },
+ "permanentlyDeleteItemConfirmation": {
+ "message": "Да ли сте сигурни да желите да трајно избришете ову ставку?"
+ },
+ "permanentlyDeletedItem": {
+ "message": "Трајно избрисати ставку"
+ },
+ "restoreItem": {
+ "message": "Врати ставку"
+ },
+ "restoreItemConfirmation": {
+ "message": "Да ли сте сигурни да желите да вратите ову ставку?"
+ },
+ "restoredItem": {
+ "message": "Ставка враћена"
+ },
+ "vaultTimeoutLogOutConfirmation": {
+ "message": "Одјава ће уклонити сваки приступ вашем сефу и захтева мрежну потврду идентитета након истека тајмаута. Да ли сте сигурни да желите да користите ову поставку?"
+ },
+ "vaultTimeoutLogOutConfirmationTitle": {
+ "message": "Потврда акције тајмаута"
+ },
+ "autoFillAndSave": {
+ "message": "Ауто-пуни и Сачувај"
+ },
+ "autoFillSuccessAndSavedUri": {
+ "message": "Ауто-пуњена ставка и сачуван УРЛ"
+ },
+ "autoFillSuccess": {
+ "message": "Ставка ауто-попуњена"
+ },
+ "setMasterPassword": {
+ "message": "Постави Главну Лозинку"
+ },
+ "masterPasswordPolicyInEffect": {
+ "message": "Једна или више смерница организације захтевају да ваша главна лозинка да би испуњавали следеће захтеве:"
+ },
+ "policyInEffectMinComplexity": {
+ "message": "Оцена минималне сложености од $SCORE$",
+ "placeholders": {
+ "score": {
+ "content": "$1",
+ "example": "4"
+ }
+ }
+ },
+ "policyInEffectMinLength": {
+ "message": "Минимална дужина од $LENGTH$",
+ "placeholders": {
+ "length": {
+ "content": "$1",
+ "example": "14"
+ }
+ }
+ },
+ "policyInEffectUppercase": {
+ "message": "Садржи један или више великих слова"
+ },
+ "policyInEffectLowercase": {
+ "message": "Садржи један или више малих слова"
+ },
+ "policyInEffectNumbers": {
+ "message": "Садрже један или више бројева"
+ },
+ "policyInEffectSpecial": {
+ "message": "Садрже један или више бројева ових специјалних слова $CHARS$",
+ "placeholders": {
+ "chars": {
+ "content": "$1",
+ "example": "!@#$%^&*"
+ }
+ }
+ },
+ "masterPasswordPolicyRequirementsNotMet": {
+ "message": "Ваша нова главна лозинка не испуњава захтеве смерница."
+ },
+ "acceptPolicies": {
+ "message": "Означавањем овог поља пристајете на следеће:"
+ },
+ "acceptPoliciesError": {
+ "message": "Услови услуге и Политика приватности нису признати."
+ },
+ "termsOfService": {
+ "message": "Услови коришћења услуге"
+ },
+ "privacyPolicy": {
+ "message": "Политика приватности"
+ },
+ "hintEqualsPassword": {
+ "message": "Ваша помоћ за лозинку не може да буде иста као лозинка."
+ },
+ "ok": {
+ "message": "У реду"
+ },
+ "desktopSyncVerificationTitle": {
+ "message": "Провера синх Desktop-а"
+ },
+ "desktopIntegrationVerificationText": {
+ "message": "Проверите да десктоп апликација показује овај отисак: "
+ },
+ "desktopIntegrationDisabledTitle": {
+ "message": "Интеграција претраживача није омогућена"
+ },
+ "desktopIntegrationDisabledDesc": {
+ "message": "Интеграција претраживача није омогућена у Bitwarden Desktop. Омогућите је у подешавања из Bitwarden Desktop апликације."
+ },
+ "startDesktopTitle": {
+ "message": "Покрени Bitwarden Desktop апликацију"
+ },
+ "startDesktopDesc": {
+ "message": "Bitwarden Desktop апликација треба да се покрене пре употребе ове функције."
+ },
+ "errorEnableBiometricTitle": {
+ "message": "Погрешно омогућавање биометрике"
+ },
+ "errorEnableBiometricDesc": {
+ "message": "Desktop апликација је поништила акцију"
+ },
+ "nativeMessagingInvalidEncryptionDesc": {
+ "message": "Desktop апликација је онемогућила безбедни комуникациони канал. Поновите ову операцију"
+ },
+ "nativeMessagingInvalidEncryptionTitle": {
+ "message": "Desktop комуникација прекинута"
+ },
+ "nativeMessagingWrongUserDesc": {
+ "message": "Desktop апликација је пријављена на други налог. Проверите да су обе апликације са истим налогом."
+ },
+ "nativeMessagingWrongUserTitle": {
+ "message": "Неподударање налога"
+ },
+ "biometricsNotEnabledTitle": {
+ "message": "Биометрија није омогућена"
+ },
+ "biometricsNotEnabledDesc": {
+ "message": "Биометрија прегледача захтева да у поставкама прво буде омогућена биометрија desktop-а."
+ },
+ "biometricsNotSupportedTitle": {
+ "message": "Биометрија није подржана"
+ },
+ "biometricsNotSupportedDesc": {
+ "message": "Биометрија прегледача није подржана на овом уређају."
+ },
+ "nativeMessaginPermissionErrorTitle": {
+ "message": "Дозвола није дата"
+ },
+ "nativeMessaginPermissionErrorDesc": {
+ "message": "Без дозволе за комуникацију са Bitwarden Desktop апликацијом, не можемо пружити биометријске податке у екстензији прегледача. Молим вас, покушајте поново."
+ },
+ "nativeMessaginPermissionSidebarTitle": {
+ "message": "Грешка у захтеву за дозволу"
+ },
+ "nativeMessaginPermissionSidebarDesc": {
+ "message": "Ову радњу није могуће извршити на бочној траци, покушајте поново у искачућем прозору."
+ },
+ "personalOwnershipSubmitError": {
+ "message": "Због смерница за предузећа, ограничено вам је чување предмета у вашем личном трезору. Промените опцију власништва у организацију и изаберите из доступних колекција."
+ },
+ "personalOwnershipPolicyInEffect": {
+ "message": "Политика организације утичу на ваше могућности власништва."
+ },
+ "excludedDomains": {
+ "message": "Изузети домени"
+ },
+ "excludedDomainsDesc": {
+ "message": "Bitwarden неће тражити да сачува податке за пријављивање за ове домене. Морате освежити страницу да би промене ступиле на снагу."
+ },
+ "excludedDomainsInvalidDomain": {
+ "message": "$DOMAIN$ није важећи домен",
+ "placeholders": {
+ "domain": {
+ "content": "$1",
+ "example": "googlecom"
+ }
+ }
+ },
+ "send": {
+ "message": "Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "searchSends": {
+ "message": "Тражи „Send“",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "addSend": {
+ "message": "Додај „Send“",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTypeText": {
+ "message": "Текст"
+ },
+ "sendTypeFile": {
+ "message": "Датотека"
+ },
+ "allSends": {
+ "message": "Све „Send“",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "maxAccessCountReached": {
+ "message": "Достигнут максималан број приступа"
+ },
+ "expired": {
+ "message": "Истекло"
+ },
+ "pendingDeletion": {
+ "message": "Брисање на чекању"
+ },
+ "passwordProtected": {
+ "message": "Заштићено лозинком"
+ },
+ "copySendLink": {
+ "message": "Копирај УРЛ „Send“",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "removePassword": {
+ "message": "Уклони лозинку"
+ },
+ "delete": {
+ "message": "Обриши"
+ },
+ "removedPassword": {
+ "message": "Лозинка укљоњена"
+ },
+ "deletedSend": {
+ "message": "„Send“ обрисано",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendLink": {
+ "message": "УРЛ „Send“",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "disabled": {
+ "message": "Онемогућено"
+ },
+ "removePasswordConfirmation": {
+ "message": "Да ли сте сигурни да желите уклонити лозинку?"
+ },
+ "deleteSend": {
+ "message": "Избриши „Send“",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "deleteSendConfirmation": {
+ "message": "Сигурно избрисати овај „Send“?",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "editSend": {
+ "message": "Уреди „Send“",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTypeHeader": {
+ "message": "Који је ово тип „Send“-a?",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendNameDesc": {
+ "message": "Име да се опише овај „Send“.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendFileDesc": {
+ "message": "Датотека коју желиш да пошаљеш."
+ },
+ "deletionDate": {
+ "message": "Брисање после"
+ },
+ "deletionDateDesc": {
+ "message": "„Send“ ће бити трајно избрисан наведеног датума и времена.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "expirationDate": {
+ "message": "Рок употребе"
+ },
+ "expirationDateDesc": {
+ "message": "Ако је постављено, приступ овом „Send“ истиче на наведени датум и време.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "oneDay": {
+ "message": "1 дан"
+ },
+ "days": {
+ "message": "$DAYS$ дана",
+ "placeholders": {
+ "days": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "custom": {
+ "message": "Друго"
+ },
+ "maximumAccessCount": {
+ "message": "Максималан број приступа"
+ },
+ "maximumAccessCountDesc": {
+ "message": "Ако је постављено, корисници више неће моћи да приступе овом „Send“ када се достигне максимални број приступа.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendPasswordDesc": {
+ "message": "Опционално захтевајте лозинку за приступ корисницима „Send“-у.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendNotesDesc": {
+ "message": "Приватне белешке о овом „Send“.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendDisableDesc": {
+ "message": "Онемогућите овај „Send“ да нико не би могао да му приступи.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendShareDesc": {
+ "message": "После сачувавања, копирај овај „Send“ УРЛ у остави.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTextDesc": {
+ "message": "Текст који желиш да пошаљеш."
+ },
+ "sendHideText": {
+ "message": "Подразумевано сакриј овај „Send“ текст.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "currentAccessCount": {
+ "message": "Тренутни број приступа"
+ },
+ "createSend": {
+ "message": "Креирај ново „Send“",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "newPassword": {
+ "message": "Нова лозинка"
+ },
+ "sendDisabled": {
+ "message": "„Send“ онемогућено",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendDisabledWarning": {
+ "message": "Због полисе компаније, можеш само да бришеш постојећа слања.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "createdSend": {
+ "message": "Креирано слање",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "editedSend": {
+ "message": "Измењено слање",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendLinuxChromiumFileWarning": {
+ "message": "Да бисте изабрали датотеку, отворите екстензију на бочној траци (ако могуће) или отворите у нови прозор кликом на овај банер."
+ },
+ "sendFirefoxFileWarning": {
+ "message": "Да бисте изабрали датотеку са Firefox-ом, отворите екстензију на бочној траци или отворите у нови прозор кликом на овај банер."
+ },
+ "sendSafariFileWarning": {
+ "message": "Да бисте изабрали датотеку са Safari-ом, отворите у нови прозор кликом на овај банер."
+ },
+ "sendFileCalloutHeader": {
+ "message": "Пре него што почнеш"
+ },
+ "sendFirefoxCustomDatePopoutMessage1": {
+ "message": "Да би користио бирање датума кроз календар",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read '**To use a calendar style date picker ** click here to pop out your window.'"
+ },
+ "sendFirefoxCustomDatePopoutMessage2": {
+ "message": "кликните овде",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker **click here** to pop out your window.'"
+ },
+ "sendFirefoxCustomDatePopoutMessage3": {
+ "message": "да би отворили ван ваш прозор.",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker click here **to pop out your window.**'"
+ },
+ "expirationDateIsInvalid": {
+ "message": "Наведени датум истицања није исправан."
+ },
+ "deletionDateIsInvalid": {
+ "message": "Наведени датум брисања није исправан."
+ },
+ "expirationDateAndTimeRequired": {
+ "message": "Неопходни су датум и време истицања."
+ },
+ "deletionDateAndTimeRequired": {
+ "message": "Неопходни су датум и време брисања."
+ },
+ "dateParsingError": {
+ "message": "Појавила се грешка при снимању датума брисања и истицања."
+ },
+ "hideEmail": {
+ "message": "Сакриј моју е-адресу од примаоца."
+ },
+ "sendOptionsPolicyInEffect": {
+ "message": "Једна или више смерница организације утичу на опције „Send“-а."
+ },
+ "passwordPrompt": {
+ "message": "Поновно тражење главне лозинке"
+ },
+ "passwordConfirmation": {
+ "message": "Потврда главне лозинке"
+ },
+ "passwordConfirmationDesc": {
+ "message": "Ова акција је заштићена. Да бисте наставили, поново унесите своју главну лозинку да бисте проверили идентитет."
+ },
+ "emailVerificationRequired": {
+ "message": "Потребна је верификација е-поште"
+ },
+ "emailVerificationRequiredDesc": {
+ "message": "Морате да проверите е-пошту да бисте користили ову функцију. Можете да проверите е-пошту у веб сефу."
+ },
+ "updatedMasterPassword": {
+ "message": "Updated Master Password"
+ },
+ "updateMasterPassword": {
+ "message": "Update Master Password"
+ },
+ "updateMasterPasswordWarning": {
+ "message": "Your Master Password was recently changed by an administrator in your organization. In order to access the vault, you must update it now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour."
+ },
+ "resetPasswordPolicyAutoEnroll": {
+ "message": "Automatic Enrollment"
+ },
+ "resetPasswordAutoEnrollInviteWarning": {
+ "message": "This organization has an enterprise policy that will automatically enroll you in password reset. Enrollment will allow organization administrators to change your master password."
+ },
+ "selectFolder": {
+ "message": "Select folder..."
+ },
+ "ssoCompleteRegistration": {
+ "message": "In order to complete logging in with SSO, please set a master password to access and protect your vault."
+ },
+ "hours": {
+ "message": "Hours"
+ },
+ "minutes": {
+ "message": "Minutes"
+ },
+ "vaultTimeoutPolicyInEffect": {
+ "message": "Your organization policies are affecting your vault timeout. Maximum allowed Vault Timeout is $HOURS$ hour(s) and $MINUTES$ minute(s)",
+ "placeholders": {
+ "hours": {
+ "content": "$1",
+ "example": "5"
+ },
+ "minutes": {
+ "content": "$2",
+ "example": "5"
+ }
+ }
+ },
+ "vaultTimeoutToLarge": {
+ "message": "Your vault timeout exceeds the restrictions set by your organization."
+ },
+ "vaultExportDisabled": {
+ "message": "Vault Export Disabled"
+ },
+ "personalVaultExportPolicyInEffect": {
+ "message": "One or more organization policies prevents you from exporting your personal vault."
+ },
+ "copyCustomFieldNameInvalidElement": {
+ "message": "Unable to identify a valid form element. Try inspecting the HTML instead."
+ },
+ "copyCustomFieldNameNotUnique": {
+ "message": "No unique identifier found."
+ }
+}
diff --git a/src/iOS.Safari/Resources/_locales/sv/messages.json b/src/iOS.Safari/Resources/_locales/sv/messages.json
new file mode 100644
index 000000000..77857a8fa
--- /dev/null
+++ b/src/iOS.Safari/Resources/_locales/sv/messages.json
@@ -0,0 +1,1817 @@
+{
+ "appName": {
+ "message": "Bitwarden"
+ },
+ "extName": {
+ "message": "Bitwarden - Gratis lösenordshanterare",
+ "description": "Extension name, MUST be less than 40 characters (Safari restriction)"
+ },
+ "extDesc": {
+ "message": "Bitwarden är en säker och gratis lösenordshanterare för alla dina enheter.",
+ "description": "Extension description"
+ },
+ "loginOrCreateNewAccount": {
+ "message": "Logga in eller skapa ett nytt konto för att komma åt dina lösenord."
+ },
+ "createAccount": {
+ "message": "Skapa konto"
+ },
+ "login": {
+ "message": "Logga in"
+ },
+ "enterpriseSingleSignOn": {
+ "message": "Single Sign-On för företag"
+ },
+ "cancel": {
+ "message": "Avbryt"
+ },
+ "close": {
+ "message": "Stäng"
+ },
+ "submit": {
+ "message": "Skicka"
+ },
+ "emailAddress": {
+ "message": "E-postadress"
+ },
+ "masterPass": {
+ "message": "Huvudlösenord"
+ },
+ "masterPassDesc": {
+ "message": "Huvudlösenordet är det lösenord som du använder för att komma åt ditt valv. Det är väldigt viktigt att du inte glömmer bort ditt huvudlösenord, eftersom det inte går att återställa lösenordet om du skulle glömma bort det."
+ },
+ "masterPassHintDesc": {
+ "message": "En huvudlösenordsledtråd kan hjälpa dig att komma ihåg ditt lösenord om du glömmer bort det."
+ },
+ "reTypeMasterPass": {
+ "message": "Ange huvudlösenordet igen"
+ },
+ "masterPassHint": {
+ "message": "Huvudlösenordsledtråd (frivillig)"
+ },
+ "tab": {
+ "message": "Flik"
+ },
+ "myVault": {
+ "message": "Mitt valv"
+ },
+ "tools": {
+ "message": "Verktyg"
+ },
+ "settings": {
+ "message": "Inställningar"
+ },
+ "currentTab": {
+ "message": "Nuvarande flik"
+ },
+ "copyPassword": {
+ "message": "Kopiera lösenord"
+ },
+ "copyNote": {
+ "message": "Kopiera anteckning"
+ },
+ "copyUri": {
+ "message": "Kopiera URI"
+ },
+ "copyUsername": {
+ "message": "Kopiera användarnamn"
+ },
+ "copyNumber": {
+ "message": "Kopiera nummer"
+ },
+ "copySecurityCode": {
+ "message": "Kopiera säkerhetskod"
+ },
+ "autoFill": {
+ "message": "Fyll i automatiskt"
+ },
+ "generatePasswordCopied": {
+ "message": "Skapa lösenord (kopierad)"
+ },
+ "copyElementIdentifier": {
+ "message": "Copy Custom Field Name"
+ },
+ "noMatchingLogins": {
+ "message": "Inga matchande inloggningar."
+ },
+ "vaultLocked": {
+ "message": "Valvet är låst."
+ },
+ "vaultLoggedOut": {
+ "message": "Valvet är utloggat."
+ },
+ "autoFillInfo": {
+ "message": "Det finns inga inloggningar tillgängliga för automatisk ifyllnad på den nuvarande fliken."
+ },
+ "addLogin": {
+ "message": "Lägg till en inloggning"
+ },
+ "addItem": {
+ "message": "Lägg till objekt"
+ },
+ "passwordHint": {
+ "message": "Lösenordsledtråd"
+ },
+ "enterEmailToGetHint": {
+ "message": "Ange din e-postadress för att hämta din huvudlösenordsledtråd."
+ },
+ "getMasterPasswordHint": {
+ "message": "Hämta huvudlösenordsledtråd"
+ },
+ "continue": {
+ "message": "Fortsätt"
+ },
+ "verificationCode": {
+ "message": "Verifieringskod"
+ },
+ "account": {
+ "message": "Konto"
+ },
+ "changeMasterPassword": {
+ "message": "Ändra huvudlösenord"
+ },
+ "fingerprintPhrase": {
+ "message": "Fingeravtrycksfras",
+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
+ },
+ "yourAccountsFingerprint": {
+ "message": "Ditt kontos fingeravtrycksfras",
+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
+ },
+ "twoStepLogin": {
+ "message": "Tvåstegsverifiering"
+ },
+ "logOut": {
+ "message": "Logga ut"
+ },
+ "about": {
+ "message": "Om"
+ },
+ "version": {
+ "message": "Version"
+ },
+ "save": {
+ "message": "Spara"
+ },
+ "move": {
+ "message": "Flytta"
+ },
+ "addFolder": {
+ "message": "Skapa mapp"
+ },
+ "name": {
+ "message": "Namn"
+ },
+ "editFolder": {
+ "message": "Redigera mapp"
+ },
+ "deleteFolder": {
+ "message": "Radera mapp"
+ },
+ "folders": {
+ "message": "Mappar"
+ },
+ "noFolders": {
+ "message": "Det finns inga mappar att lista."
+ },
+ "helpFeedback": {
+ "message": "Hjälp & Feedback"
+ },
+ "sync": {
+ "message": "Synkronisera"
+ },
+ "syncVaultNow": {
+ "message": "Synkronisera valvet nu"
+ },
+ "lastSync": {
+ "message": "Senaste synkronisering:"
+ },
+ "passGen": {
+ "message": "Lösenordsgenerator"
+ },
+ "generator": {
+ "message": "Generator",
+ "description": "Short for 'Password Generator'."
+ },
+ "passGenInfo": {
+ "message": "Skapa starka och unika lösenord automatiskt för dina inloggningar."
+ },
+ "bitWebVault": {
+ "message": "Bitwardens webbvalv"
+ },
+ "importItems": {
+ "message": "Importera objekt"
+ },
+ "select": {
+ "message": "Välj"
+ },
+ "generatePassword": {
+ "message": "Skapa lösenord"
+ },
+ "regeneratePassword": {
+ "message": "Skapa nytt lösenord"
+ },
+ "options": {
+ "message": "Alternativ"
+ },
+ "length": {
+ "message": "Längd"
+ },
+ "numWords": {
+ "message": "Antal ord"
+ },
+ "wordSeparator": {
+ "message": "Ordseparator"
+ },
+ "capitalize": {
+ "message": "Versalisera",
+ "description": "Make the first letter of a work uppercase."
+ },
+ "includeNumber": {
+ "message": "Inkludera siffra"
+ },
+ "minNumbers": {
+ "message": "Minst antal nummer"
+ },
+ "minSpecial": {
+ "message": "Minst antal speciella tecken"
+ },
+ "avoidAmbChar": {
+ "message": "Undvik mångtydiga tecken"
+ },
+ "searchVault": {
+ "message": "Sök i valvet"
+ },
+ "edit": {
+ "message": "Redigera"
+ },
+ "view": {
+ "message": "Visa"
+ },
+ "noItemsInList": {
+ "message": "Det finns inga objekt att visa."
+ },
+ "itemInformation": {
+ "message": "Objektinformation"
+ },
+ "username": {
+ "message": "Användarnamn"
+ },
+ "password": {
+ "message": "Lösenord"
+ },
+ "passphrase": {
+ "message": "Lösenordsfras"
+ },
+ "favorite": {
+ "message": "Favorit"
+ },
+ "notes": {
+ "message": "Anteckningar"
+ },
+ "note": {
+ "message": "Anteckning"
+ },
+ "editItem": {
+ "message": "Redigera objekt"
+ },
+ "folder": {
+ "message": "Mapp"
+ },
+ "deleteItem": {
+ "message": "Radera objekt"
+ },
+ "viewItem": {
+ "message": "Visa objekt"
+ },
+ "launch": {
+ "message": "Öppna"
+ },
+ "website": {
+ "message": "Webbsida"
+ },
+ "toggleVisibility": {
+ "message": "Växla synlighet"
+ },
+ "manage": {
+ "message": "Hantera"
+ },
+ "other": {
+ "message": "Annat"
+ },
+ "rateExtension": {
+ "message": "Betygsätt tillägget"
+ },
+ "rateExtensionDesc": {
+ "message": "Överväg gärna att hjälpa oss genom att ge oss en bra recension!"
+ },
+ "browserNotSupportClipboard": {
+ "message": "Din webbläsare har inte stöd för att enkelt kopiera till urklipp. Kopiera till urklipp manuellt istället."
+ },
+ "verifyMasterPassword": {
+ "message": "Verifiera huvudlösenord"
+ },
+ "yourVaultIsLocked": {
+ "message": "Valvet är låst. Kontrollera ditt huvudlösenord för att fortsätta."
+ },
+ "unlock": {
+ "message": "Lås upp"
+ },
+ "loggedInAsOn": {
+ "message": "Inloggad som $EMAIL$ på $HOSTNAME$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "name@example.com"
+ },
+ "hostname": {
+ "content": "$2",
+ "example": "bitwarden.com"
+ }
+ }
+ },
+ "invalidMasterPassword": {
+ "message": "Felaktigt huvudlösenord"
+ },
+ "vaultTimeout": {
+ "message": "Valvets tidsgräns"
+ },
+ "lockNow": {
+ "message": "Lås nu"
+ },
+ "immediately": {
+ "message": "Omedelbart"
+ },
+ "tenSeconds": {
+ "message": "10 sekunder"
+ },
+ "twentySeconds": {
+ "message": "20 sekunder"
+ },
+ "thirtySeconds": {
+ "message": "30 sekunder"
+ },
+ "oneMinute": {
+ "message": "1 minut"
+ },
+ "twoMinutes": {
+ "message": "2 minuter"
+ },
+ "fiveMinutes": {
+ "message": "5 minuter"
+ },
+ "fifteenMinutes": {
+ "message": "15 minuter"
+ },
+ "thirtyMinutes": {
+ "message": "30 minuter"
+ },
+ "oneHour": {
+ "message": "1 timme"
+ },
+ "fourHours": {
+ "message": "4 timmar"
+ },
+ "onLocked": {
+ "message": "Vid låsning av datorn"
+ },
+ "onRestart": {
+ "message": "Vid omstart"
+ },
+ "never": {
+ "message": "Aldrig"
+ },
+ "security": {
+ "message": "Säkerhet"
+ },
+ "errorOccurred": {
+ "message": "Ett fel har uppstått"
+ },
+ "emailRequired": {
+ "message": "E-postadress krävs."
+ },
+ "invalidEmail": {
+ "message": "Ogiltig e-postadress."
+ },
+ "masterPassRequired": {
+ "message": "Huvudlösenord krävs."
+ },
+ "masterPassLength": {
+ "message": "Huvudlösenordet måste vara minst 8 tecken långt."
+ },
+ "masterPassDoesntMatch": {
+ "message": "Bekräftelsen för huvudlösenordet stämde ej."
+ },
+ "newAccountCreated": {
+ "message": "Ditt nya konto har blivit skapat! Du kan nu logga in."
+ },
+ "masterPassSent": {
+ "message": "Vi har skickat ett mejl till dig med din huvudlösenordsledtråd."
+ },
+ "verificationCodeRequired": {
+ "message": "Verifieringskod krävs."
+ },
+ "valueCopied": {
+ "message": "$VALUE$ kopierat",
+ "description": "Value has been copied to the clipboard.",
+ "placeholders": {
+ "value": {
+ "content": "$1",
+ "example": "Password"
+ }
+ }
+ },
+ "autofillError": {
+ "message": "Kunde inte automatiskt fylla i det valda objektet på den här webbsidan. Klipp/klistra informationen istället."
+ },
+ "loggedOut": {
+ "message": "Loggade ut"
+ },
+ "loginExpired": {
+ "message": "Din inloggningssession har utgått."
+ },
+ "logOutConfirmation": {
+ "message": "Är du säker på att du vill logga ut?"
+ },
+ "yes": {
+ "message": "Ja"
+ },
+ "no": {
+ "message": "Nej"
+ },
+ "unexpectedError": {
+ "message": "Ett okänt fel har inträffat."
+ },
+ "nameRequired": {
+ "message": "Namn krävs."
+ },
+ "addedFolder": {
+ "message": "Skapade mapp"
+ },
+ "changeMasterPass": {
+ "message": "Ändra huvudlösenord"
+ },
+ "changeMasterPasswordConfirmation": {
+ "message": "Du kan ändra ditt huvudlösenord på bitwardens webbvalv. Vill du besöka webbplatsen nu?"
+ },
+ "twoStepLoginConfirmation": {
+ "message": "Tvåstegsverifiering gör ditt konto säkrare genom att kräva att du verifierar din inloggning med en annan enhet, till exempel genom en säkerhetsnyckel, autentiseringsapp, SMS, telefonsamtal eller mejl. Tvåstegsverifiering kan aktiveras på bitwardens webbvalv. Vill du besöka webbplatsen nu?"
+ },
+ "editedFolder": {
+ "message": "Ändrade mapp"
+ },
+ "deleteFolderConfirmation": {
+ "message": "Är du säker på att du vill ta bort den här mappen?"
+ },
+ "deletedFolder": {
+ "message": "Tog bort mapp"
+ },
+ "gettingStartedTutorial": {
+ "message": "Komma igång - Handledning"
+ },
+ "gettingStartedTutorialVideo": {
+ "message": "Titta på vår 'Komma igång - Handledning'-video för att lära dig hur du får ut det mesta av webbläsartillägget."
+ },
+ "syncingComplete": {
+ "message": "Synkronisering genomförd"
+ },
+ "syncingFailed": {
+ "message": "Synkroniseringen misslyckades"
+ },
+ "passwordCopied": {
+ "message": "Lösenord kopierat"
+ },
+ "uri": {
+ "message": "URI (länk)"
+ },
+ "uriPosition": {
+ "message": "URI $POSITION$",
+ "description": "A listing of URIs. Ex: URI 1, URI 2, URI 3, etc.",
+ "placeholders": {
+ "position": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "newUri": {
+ "message": "Ny URI"
+ },
+ "addedItem": {
+ "message": "Skapade objekt"
+ },
+ "editedItem": {
+ "message": "Ändrade objekt"
+ },
+ "deleteItemConfirmation": {
+ "message": "Är du säker på att du vill radera detta objekt?"
+ },
+ "deletedItem": {
+ "message": "Raderade objekt"
+ },
+ "overwritePassword": {
+ "message": "Skriv över lösenord"
+ },
+ "overwritePasswordConfirmation": {
+ "message": "Är du säker på att du vill skriva över det nuvarande lösenordet?"
+ },
+ "searchFolder": {
+ "message": "Sök i mapp"
+ },
+ "searchCollection": {
+ "message": "Sök i samling"
+ },
+ "searchType": {
+ "message": "Sök efter typ"
+ },
+ "noneFolder": {
+ "message": "Ingen mapp",
+ "description": "This is the folder for uncategorized items"
+ },
+ "disableAddLoginNotification": {
+ "message": "Inaktivera aviseringar för nya inloggningar"
+ },
+ "addLoginNotificationDesc": {
+ "message": "Aviseringar för nya inloggningar frågar dig om du vill lägga till en inloggning automatiskt till ditt valv, när du använder en inloggning som inte redan finns i ditt valv."
+ },
+ "dontShowCardsCurrentTab": {
+ "message": "Visa inte kort på fliksida"
+ },
+ "dontShowCardsCurrentTabDesc": {
+ "message": "Kortobjekt från ditt valv listas på 'nuvarande flik'-sidan för enkel automatisk ifyllnad."
+ },
+ "dontShowIdentitiesCurrentTab": {
+ "message": "Visa inte identiteter på fliksidan"
+ },
+ "dontShowIdentitiesCurrentTabDesc": {
+ "message": "Identitetsobjekt från ditt valv listas på 'nuvarande flik'-sidan för enkel automatisk ifyllnad."
+ },
+ "clearClipboard": {
+ "message": "Rensa urklipp",
+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
+ },
+ "clearClipboardDesc": {
+ "message": "Rensa automatiskt kopierade värden från urklipp.",
+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
+ },
+ "notificationAddDesc": {
+ "message": "Ska Bitwarden komma ihåg det här lösenordet åt dig?"
+ },
+ "notificationAddSave": {
+ "message": "Ja, spara nu"
+ },
+ "notificationNeverSave": {
+ "message": "Aldrig för denna webbplats"
+ },
+ "disableChangedPasswordNotification": {
+ "message": "Inaktivera notifikation för ändrade lösenord"
+ },
+ "disableChangedPasswordNotificationDesc": {
+ "message": "”Notifikation för ändrade lösenord” uppmanar dig automatiskt att uppdatera ett lösenord i ditt valv när den upptäcker att du har ändrat det på en webbplats."
+ },
+ "notificationChangeDesc": {
+ "message": "Vill du uppdatera det här lösenordet i Bitwarden?"
+ },
+ "notificationChangeSave": {
+ "message": "Ja, uppdatera nu"
+ },
+ "disableContextMenuItem": {
+ "message": "Inaktivera innehållsmenyn"
+ },
+ "disableContextMenuItemDesc": {
+ "message": "Innehållsmenyn (högerklick) ger dig snabbare åtkomst för att skapa ett slumpmässigt lösenord, och för att fylla i en inloggning i den nuvarande fliken."
+ },
+ "defaultUriMatchDetection": {
+ "message": "Standardmatchning för URI",
+ "description": "Default URI match detection for auto-fill."
+ },
+ "defaultUriMatchDetectionDesc": {
+ "message": "Välj standardalternativet för hur matchning av URI är hanterat för inloggningar när du utför operationer såsom automatisk ifyllnad."
+ },
+ "theme": {
+ "message": "Tema"
+ },
+ "themeDesc": {
+ "message": "Ändra programmets färgtema."
+ },
+ "dark": {
+ "message": "Mörkt",
+ "description": "Dark color"
+ },
+ "light": {
+ "message": "Ljust",
+ "description": "Light color"
+ },
+ "solarizedDark": {
+ "message": "Solarized Dark",
+ "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated."
+ },
+ "exportVault": {
+ "message": "Exportera valv"
+ },
+ "fileFormat": {
+ "message": "Filformat"
+ },
+ "warning": {
+ "message": "VARNING",
+ "description": "WARNING (should stay in capitalized letters if the language permits)"
+ },
+ "confirmVaultExport": {
+ "message": "Bekräfta export av valv"
+ },
+ "exportWarningDesc": {
+ "message": "Den här exporten innehåller ditt valvs okrypterade data i .csv-format. Du bör inte lagra eller skicka filen över osäkra anslutningar (genom t.ex. mejl). Radera filen efter du är färdig med den."
+ },
+ "encExportKeyWarningDesc": {
+ "message": "Denna export krypterar dina data med kontots krypteringsnyckel. Om du någonsin roterar kontots krypteringsnyckel bör du exportera igen eftersom du inte kommer att kunna dekryptera denna exportfil."
+ },
+ "encExportAccountWarningDesc": {
+ "message": "Kypteringsnycklar är unika för varje Bitwarden-konto, så du kan inte importera en krypterad export till ett annat konto."
+ },
+ "exportMasterPassword": {
+ "message": "Ange ditt huvudlösenord för att exportera ditt valv."
+ },
+ "shared": {
+ "message": "Delad"
+ },
+ "learnOrg": {
+ "message": "Lär dig om organisationer"
+ },
+ "learnOrgConfirmation": {
+ "message": "Bitwarden gör det möjligt för dig att objekt i valvet med andra genom att använda en organisation. Vill du besöka bitwarden.com för att lära dig mer?"
+ },
+ "moveToOrganization": {
+ "message": "Flytta till organisation"
+ },
+ "share": {
+ "message": "Dela"
+ },
+ "movedItemToOrg": {
+ "message": "$ITEMNAME$ flyttades till $ORGNAME$",
+ "placeholders": {
+ "itemname": {
+ "content": "$1",
+ "example": "Secret Item"
+ },
+ "orgname": {
+ "content": "$2",
+ "example": "Company Name"
+ }
+ }
+ },
+ "moveToOrgDesc": {
+ "message": "Välj en organisation som du vill flytta detta objektet till. Flytt till en organisation överför ägandet av objektet till den organisationen. Du kommer inte längre att vara direkt ägare till detta objekt när det har flyttats."
+ },
+ "learnMore": {
+ "message": "Läs mer"
+ },
+ "authenticatorKeyTotp": {
+ "message": "Autentiseringsnyckel (TOTP)"
+ },
+ "verificationCodeTotp": {
+ "message": "Verifieringskod (TOTP)"
+ },
+ "copyVerificationCode": {
+ "message": "Kopiera verifieringskod"
+ },
+ "attachments": {
+ "message": "Bifogade filer"
+ },
+ "deleteAttachment": {
+ "message": "Ta bort bilaga"
+ },
+ "deleteAttachmentConfirmation": {
+ "message": "Är du säker på att du vill ta bort bilagan?"
+ },
+ "deletedAttachment": {
+ "message": "Tog bort bilaga"
+ },
+ "newAttachment": {
+ "message": "Bifoga ny fil"
+ },
+ "noAttachments": {
+ "message": "Inga bilagor."
+ },
+ "attachmentSaved": {
+ "message": "Den bifogade filen har sparats."
+ },
+ "file": {
+ "message": "Fil"
+ },
+ "selectFile": {
+ "message": "Välj en fil."
+ },
+ "maxFileSize": {
+ "message": "Filen får vara maximalt 500 MB."
+ },
+ "featureUnavailable": {
+ "message": "Funktionen är inte tillgänglig"
+ },
+ "updateKey": {
+ "message": "Du kan inte använda denna funktion förrän du uppdaterar din krypteringsnyckel."
+ },
+ "premiumMembership": {
+ "message": "Premium-medlemskap"
+ },
+ "premiumManage": {
+ "message": "Hantera medlemskap"
+ },
+ "premiumManageAlert": {
+ "message": "Du kan hantera ditt medlemskap på bitwardens webbvalv. Vill du besöka webbplatsen nu?"
+ },
+ "premiumRefresh": {
+ "message": "Uppdatera medlemskap"
+ },
+ "premiumNotCurrentMember": {
+ "message": "Du är för närvarande inte en premium-medlem."
+ },
+ "premiumSignUpAndGet": {
+ "message": "Registrera dig för ett premium-medlemskap och få:"
+ },
+ "ppremiumSignUpStorage": {
+ "message": "1 GB lagring av krypterade filer."
+ },
+ "ppremiumSignUpTwoStep": {
+ "message": "Ytterligare alternativ för tvåstegsverifiering såsom YubiKey, FIDO U2F och Duo."
+ },
+ "ppremiumSignUpReports": {
+ "message": "Lösenordshygien, kontohälsa och dataintrångsrapporter för att hålla ditt valv säkert."
+ },
+ "ppremiumSignUpTotp": {
+ "message": "TOTP verifieringskod-generator (2FA) för inloggningar i ditt valv."
+ },
+ "ppremiumSignUpSupport": {
+ "message": "Prioriterad kundsupport."
+ },
+ "ppremiumSignUpFuture": {
+ "message": "Alla framtida premium-funktioner. Mer kommer snart!"
+ },
+ "premiumPurchase": {
+ "message": "Köp Premium"
+ },
+ "premiumPurchaseAlert": {
+ "message": "Du kan köpa premium-medlemskap på bitwardens webbvalv. Vill du besöka webbplatsen nu?"
+ },
+ "premiumCurrentMember": {
+ "message": "Du är en premium-medlem!"
+ },
+ "premiumCurrentMemberThanks": {
+ "message": "Tack för att du stödjer Bitwarden."
+ },
+ "premiumPrice": {
+ "message": "Allt för endast $PRICE$/år!",
+ "placeholders": {
+ "price": {
+ "content": "$1",
+ "example": "$10"
+ }
+ }
+ },
+ "refreshComplete": {
+ "message": "Uppdatering färdig"
+ },
+ "disableAutoTotpCopy": {
+ "message": "Inaktivera automatisk TOTP-kopiering"
+ },
+ "disableAutoTotpCopyDesc": {
+ "message": "Om din inloggning har en autentiseringsnyckel kopplad till den, kommer TOTP-verifieringskoden att automatiskt kopieras till urklipp när du automatiskt fyller i inloggningen."
+ },
+ "disableAutoBiometricsPrompt": {
+ "message": "Do not prompt for biometrics on launch"
+ },
+ "premiumRequired": {
+ "message": "Premium krävs"
+ },
+ "premiumRequiredDesc": {
+ "message": "Ett premium-medlemskap krävs för att använda den här funktionen."
+ },
+ "enterVerificationCodeApp": {
+ "message": "Ange den 6-siffriga verifieringskoden från din autentiseringsapp."
+ },
+ "enterVerificationCodeEmail": {
+ "message": "Ange den 6-siffriga verifieringskoden som skickades till $EMAIL$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "example@gmail.com"
+ }
+ }
+ },
+ "verificationCodeEmailSent": {
+ "message": "Verifieringsmejl skickat till $EMAIL$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "example@gmail.com"
+ }
+ }
+ },
+ "rememberMe": {
+ "message": "Kom ihåg mig"
+ },
+ "sendVerificationCodeEmailAgain": {
+ "message": "Skicka verifieringskod-mejlet igen"
+ },
+ "useAnotherTwoStepMethod": {
+ "message": "Använd en annan inloggningsmetod för tvåstegsverifiering"
+ },
+ "insertYubiKey": {
+ "message": "Sätt i din YubiKey i en av datorns USB-portar och sätt fingret på knappen."
+ },
+ "insertU2f": {
+ "message": "Sätt i din säkerhetsnyckel i en av datorns USB-portar. Om nyckeln har en knapp, sätt fingret på den."
+ },
+ "webAuthnNewTab": {
+ "message": "För att påbörja verifieringen av WebAuthn 2FA. Klicka på knappen nedan för att öppna en ny flik och följ instruktionerna i den nya fliken."
+ },
+ "webAuthnNewTabOpen": {
+ "message": "Öppna ny flik"
+ },
+ "webAuthnAuthenticate": {
+ "message": "Autentisera WebAuthn"
+ },
+ "loginUnavailable": {
+ "message": "Inloggning inte tillgänglig"
+ },
+ "noTwoStepProviders": {
+ "message": "Detta konto har tvåstegsverifiering aktiverat, men inget av de aktiverade alternativen stöds av den här webbläsaren."
+ },
+ "noTwoStepProviders2": {
+ "message": "Vänligen använd en webbläsare som stöds (till exempel Chrome) och/eller lägg till fler alternativ som stöds bättre över webbläsare (till exempel en autentiseringsapp)."
+ },
+ "twoStepOptions": {
+ "message": "Alternativ för tvåstegsverifiering"
+ },
+ "recoveryCodeDesc": {
+ "message": "Förlorat åtkomst till alla dina tvåstegsverifierings-alternativ? Använd din återställningskod för att inaktivera tvåstegsverifiering på ditt konto."
+ },
+ "recoveryCodeTitle": {
+ "message": "Återställningskod"
+ },
+ "authenticatorAppTitle": {
+ "message": "Autentiseringsapp"
+ },
+ "authenticatorAppDesc": {
+ "message": "Använd en autentiseringsapp (till exempel Authy eller Google Authenticator) för att skapa tidsbaserade verifieringskoder.",
+ "description": "'Authy' and 'Google Authenticator' are product names and should not be translated."
+ },
+ "yubiKeyTitle": {
+ "message": "YubiKey OTP säkerhetsnyckel"
+ },
+ "yubiKeyDesc": {
+ "message": "Använd en YubiKey för att få åtkomst till ditt konto. Fungerar med YubiKey 4, 4 Nano, 4C och NEO enheter."
+ },
+ "duoDesc": {
+ "message": "Verifiera med Duo Security genom att använda Duo Mobile-appen, SMS, telefonsamtal eller en U2F säkerhetsnyckel.",
+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
+ },
+ "duoOrganizationDesc": {
+ "message": "Verifiera med Duo Security för din organisation genom att använda Duo Mobile-appen, SMS, telefonsamtal eller en U2F säkerhetsnyckel.",
+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
+ },
+ "webAuthnTitle": {
+ "message": "FIDO2 WebAuthn"
+ },
+ "webAuthnDesc": {
+ "message": "Använd en WebAuthn-aktiverad säkerhetsnyckel för att komma åt ditt konto."
+ },
+ "emailTitle": {
+ "message": "E-post"
+ },
+ "emailDesc": {
+ "message": "Verifieringskoder kommer att skickas till dig."
+ },
+ "selfHostedEnvironment": {
+ "message": "Egen-hostad miljö"
+ },
+ "selfHostedEnvironmentFooter": {
+ "message": "Ange bas-URL:en för din \"on-premise\"-hostade Bitwarden-installation."
+ },
+ "customEnvironment": {
+ "message": "Anpassad miljö"
+ },
+ "customEnvironmentFooter": {
+ "message": "För avancerade användare. Du kan ange bas-URL:en för varje tjänst oberoende av varandra."
+ },
+ "baseUrl": {
+ "message": "Server-URL"
+ },
+ "apiUrl": {
+ "message": "API server-URL"
+ },
+ "webVaultUrl": {
+ "message": "Webbvalv server-URL"
+ },
+ "identityUrl": {
+ "message": "Identitetsserver-URL"
+ },
+ "notificationsUrl": {
+ "message": "URL för notifieringsserver"
+ },
+ "iconsUrl": {
+ "message": "Ikoner Server-URL"
+ },
+ "environmentSaved": {
+ "message": "Miljö-URL:er har sparats."
+ },
+ "enableAutoFillOnPageLoad": {
+ "message": "Aktivera automatisk ifyllnad vid sidhämtning"
+ },
+ "enableAutoFillOnPageLoadDesc": {
+ "message": "Utför automatisk ifyllnad om ett inloggningsformulär upptäcks när webbsidan laddas."
+ },
+ "experimentalFeature": {
+ "message": "Detta är för närvarande en experimentell funktion. Använd på egen risk."
+ },
+ "defaultAutoFillOnPageLoad": {
+ "message": "Standardinställning för autofyll för inloggningsobjekt"
+ },
+ "defaultAutoFillOnPageLoadDesc": {
+ "message": "Efter att du har aktiverat automatisk ifyllnad vid sidhämtning kan du aktivera eller inaktivera funktionen för enskilda inloggningsobjekt. Detta är standardinställningen för inloggningsobjekt som inte är konfigurerade separat."
+ },
+ "itemAutoFillOnPageLoad": {
+ "message": "Automatisk ifyllning vid sidhämtning (om aktiverat i Alternativ)"
+ },
+ "autoFillOnPageLoadUseDefault": {
+ "message": "Använd standardinställningen"
+ },
+ "autoFillOnPageLoadYes": {
+ "message": "Fyll i automatiskt vid sidladdning"
+ },
+ "autoFillOnPageLoadNo": {
+ "message": "Fyll inte i automatiskt vid sidladdning"
+ },
+ "commandOpenPopup": {
+ "message": "Öppna valvet i ett popupfönster"
+ },
+ "commandOpenSidebar": {
+ "message": "Öppna valvet i sidofältet"
+ },
+ "commandAutofillDesc": {
+ "message": "Fyll automatiskt i den senast använda inloggningen för den aktuella webbsidan"
+ },
+ "commandGeneratePasswordDesc": {
+ "message": "Skapa och kopiera ett nytt slumpmässigt lösenord till urklipp."
+ },
+ "commandLockVaultDesc": {
+ "message": "Lås valvet"
+ },
+ "privateModeMessage": {
+ "message": "Det här fönstret är tyvärr inte tillgängligt i privat läge för denna webbläsare."
+ },
+ "customFields": {
+ "message": "Anpassade fält"
+ },
+ "copyValue": {
+ "message": "Kopiera värde"
+ },
+ "value": {
+ "message": "Värde"
+ },
+ "newCustomField": {
+ "message": "Nytt anpassat fält"
+ },
+ "dragToSort": {
+ "message": "Dra för att sortera"
+ },
+ "cfTypeText": {
+ "message": "Text"
+ },
+ "cfTypeHidden": {
+ "message": "Dold"
+ },
+ "cfTypeBoolean": {
+ "message": "Boolean"
+ },
+ "popup2faCloseMessage": {
+ "message": "Om du klickar utanför popup-fönstret för att kontrollera din email efter din verifieringskod så stängs popup-fönstret. Vill du öppna popup-fönstret i ett nytt fönster, så att det inte stängs?"
+ },
+ "popupU2fCloseMessage": {
+ "message": "Den här webbläsaren kan inte bearbeta U2F-förfrågningar i detta popup-fönster. Vill du öppna ett nytt fönster så att du kan logga in med U2F?"
+ },
+ "disableFavicon": {
+ "message": "Inaktivera webbplatsikoner"
+ },
+ "disableFaviconDesc": {
+ "message": "Webbplatsikoner ger en igenkännbar ikon bredvid varje inloggningsobjekt i ditt valv."
+ },
+ "disableBadgeCounter": {
+ "message": "Inaktivera märkesräknare"
+ },
+ "disableBadgeCounterDesc": {
+ "message": "Märkesräknare visar hur många inloggningar du har för den aktuella sidan i ditt valv."
+ },
+ "cardholderName": {
+ "message": "Kortinnehavarens namn"
+ },
+ "number": {
+ "message": "Nummer"
+ },
+ "brand": {
+ "message": "Märke"
+ },
+ "expirationMonth": {
+ "message": "Förfallomånad"
+ },
+ "expirationYear": {
+ "message": "Förfalloår"
+ },
+ "expiration": {
+ "message": "Utgång"
+ },
+ "january": {
+ "message": "Januari"
+ },
+ "february": {
+ "message": "Februari"
+ },
+ "march": {
+ "message": "Mars"
+ },
+ "april": {
+ "message": "April"
+ },
+ "may": {
+ "message": "Maj"
+ },
+ "june": {
+ "message": "Juni"
+ },
+ "july": {
+ "message": "Juli"
+ },
+ "august": {
+ "message": "Augusti"
+ },
+ "september": {
+ "message": "September"
+ },
+ "october": {
+ "message": "Oktober"
+ },
+ "november": {
+ "message": "November"
+ },
+ "december": {
+ "message": "December"
+ },
+ "securityCode": {
+ "message": "Säkerhetskod"
+ },
+ "ex": {
+ "message": "t.ex."
+ },
+ "title": {
+ "message": "Titel"
+ },
+ "mr": {
+ "message": "Herr"
+ },
+ "mrs": {
+ "message": "Fru"
+ },
+ "ms": {
+ "message": "Fröken"
+ },
+ "dr": {
+ "message": "Dr"
+ },
+ "firstName": {
+ "message": "Förnamn"
+ },
+ "middleName": {
+ "message": "Mellannamn"
+ },
+ "lastName": {
+ "message": "Efternamn"
+ },
+ "identityName": {
+ "message": "Identitetsnamn"
+ },
+ "company": {
+ "message": "Företag"
+ },
+ "ssn": {
+ "message": "Personnummer"
+ },
+ "passportNumber": {
+ "message": "Passnummer"
+ },
+ "licenseNumber": {
+ "message": "Licensnummer"
+ },
+ "email": {
+ "message": "E-post"
+ },
+ "phone": {
+ "message": "Telefon"
+ },
+ "address": {
+ "message": "Adress"
+ },
+ "address1": {
+ "message": "Adress 1"
+ },
+ "address2": {
+ "message": "Adress 2"
+ },
+ "address3": {
+ "message": "Adress 3"
+ },
+ "cityTown": {
+ "message": "Ort"
+ },
+ "stateProvince": {
+ "message": "Län"
+ },
+ "zipPostalCode": {
+ "message": "Postnummer"
+ },
+ "country": {
+ "message": "Land"
+ },
+ "type": {
+ "message": "Typ"
+ },
+ "typeLogin": {
+ "message": "Inloggning"
+ },
+ "typeLogins": {
+ "message": "Inloggningar"
+ },
+ "typeSecureNote": {
+ "message": "Säker anteckning"
+ },
+ "typeCard": {
+ "message": "Kort"
+ },
+ "typeIdentity": {
+ "message": "Identitet"
+ },
+ "passwordHistory": {
+ "message": "Lösenordshistorik"
+ },
+ "back": {
+ "message": "Tillbaka"
+ },
+ "collections": {
+ "message": "Samlingar"
+ },
+ "favorites": {
+ "message": "Favoriter"
+ },
+ "popOutNewWindow": {
+ "message": "Poppa ut till ett nytt fönster"
+ },
+ "refresh": {
+ "message": "Uppdatera"
+ },
+ "cards": {
+ "message": "Kort"
+ },
+ "identities": {
+ "message": "Identiteter"
+ },
+ "logins": {
+ "message": "Inloggningar"
+ },
+ "secureNotes": {
+ "message": "Säkra anteckningar"
+ },
+ "clear": {
+ "message": "Rensa",
+ "description": "To clear something out. example: To clear browser history."
+ },
+ "checkPassword": {
+ "message": "Kontrollera om lösenord har avslöjats."
+ },
+ "passwordExposed": {
+ "message": "Detta lösenord har avslöjats $VALUE$ gång(er) i dataintrång. Du bör ändra det.",
+ "placeholders": {
+ "value": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "passwordSafe": {
+ "message": "Detta lösenord hittades inte i något känt dataintrång. Det bör vara säkert att använda."
+ },
+ "baseDomain": {
+ "message": "Basdomän"
+ },
+ "host": {
+ "message": "Värd",
+ "description": "A URL's host value. For example, the host of https://sub.domain.com:443 is 'sub.domain.com:443'."
+ },
+ "exact": {
+ "message": "Exakt"
+ },
+ "startsWith": {
+ "message": "Börjar med"
+ },
+ "regEx": {
+ "message": "Reguljärt uttryck",
+ "description": "A programming term, also known as 'RegEx'."
+ },
+ "matchDetection": {
+ "message": "Matchning",
+ "description": "URI match detection for auto-fill."
+ },
+ "defaultMatchDetection": {
+ "message": "Standardmatchning",
+ "description": "Default URI match detection for auto-fill."
+ },
+ "toggleOptions": {
+ "message": "Växla alternativ"
+ },
+ "toggleCurrentUris": {
+ "message": "Växla nuvarande URI",
+ "description": "Toggle the display of the URIs of the currently open tabs in the browser."
+ },
+ "currentUri": {
+ "message": "Nuvarande URI",
+ "description": "The URI of one of the current open tabs in the browser."
+ },
+ "organization": {
+ "message": "Organisation",
+ "description": "An entity of multiple related people (ex. a team or business organization)."
+ },
+ "types": {
+ "message": "Typer"
+ },
+ "allItems": {
+ "message": "Alla objekt"
+ },
+ "noPasswordsInList": {
+ "message": "Det finns inga lösenord att lista."
+ },
+ "remove": {
+ "message": "Ta bort"
+ },
+ "default": {
+ "message": "Standard"
+ },
+ "dateUpdated": {
+ "message": "Uppdaterad",
+ "description": "ex. Date this item was updated"
+ },
+ "datePasswordUpdated": {
+ "message": "Lösenord uppdaterat",
+ "description": "ex. Date this password was updated"
+ },
+ "neverLockWarning": {
+ "message": "Är du säker på att du vill använda alternativet ”Aldrig”? Att ställa in låsnings-alternativet till ”Aldrig” lagrar valvets krypteringsnyckel på datorn. Om du använder det här alternativet bör du se till att du håller datorn ordentligt skyddad."
+ },
+ "noOrganizationsList": {
+ "message": "Du tillhör inte någon organisation. Organisationer möjliggör säker delning av objekt med andra användare."
+ },
+ "noCollectionsInList": {
+ "message": "Det finns inga samlingar att visa."
+ },
+ "ownership": {
+ "message": "Ägarskap"
+ },
+ "whoOwnsThisItem": {
+ "message": "Vem äger detta objekt?"
+ },
+ "strong": {
+ "message": "Starkt",
+ "description": "ex. A strong password. Scale: Weak -> Good -> Strong"
+ },
+ "good": {
+ "message": "Bra",
+ "description": "ex. A good password. Scale: Weak -> Good -> Strong"
+ },
+ "weak": {
+ "message": "Svagt",
+ "description": "ex. A weak password. Scale: Weak -> Good -> Strong"
+ },
+ "weakMasterPassword": {
+ "message": "Svagt huvudlösenord"
+ },
+ "weakMasterPasswordDesc": {
+ "message": "Huvudlösenordet du har valt är svagt. Du bör använda ett starkt huvudlösenord (eller en lösenfras) för att skydda ditt Bitwarden-konto ordentligt. Är du säker på att du vill använda detta huvudlösenord?"
+ },
+ "pin": {
+ "message": "PIN-kod",
+ "description": "PIN code. Ex. The short code (often numeric) that you use to unlock a device."
+ },
+ "unlockWithPin": {
+ "message": "Lås upp med PIN-kod"
+ },
+ "setYourPinCode": {
+ "message": "Ange en PIN-kod för att låsa upp Bitwarden. Dina PIN-inställningar återställs om du någonsin loggar ut helt från programmet."
+ },
+ "pinRequired": {
+ "message": "PIN-kod krävs."
+ },
+ "invalidPin": {
+ "message": "Ogiltig PIN-kod."
+ },
+ "verifyPin": {
+ "message": "Verifiera PIN-kod"
+ },
+ "yourVaultIsLockedPinCode": {
+ "message": "Valvet är låst. Kontrollera din PIN-kod för att fortsätta."
+ },
+ "unlockWithBiometrics": {
+ "message": "Lås upp med biometri"
+ },
+ "awaitDesktop": {
+ "message": "Väntar på bekräftelse från skrivbordsprogrammet"
+ },
+ "awaitDesktopDesc": {
+ "message": "Säkerställ att du använder biometri i Bitwardens skrivbordsprogram för att aktivera biometri för webbläsaren."
+ },
+ "lockWithMasterPassOnRestart": {
+ "message": "Lås med huvudlösenordet vid omstart av webbläsaren"
+ },
+ "selectOneCollection": {
+ "message": "Du måste markera minst en samling."
+ },
+ "cloneItem": {
+ "message": "Klona objekt"
+ },
+ "clone": {
+ "message": "Klona"
+ },
+ "passwordGeneratorPolicyInEffect": {
+ "message": "En eller flera organisationspolicyer påverkar dina generatorinställningar."
+ },
+ "vaultTimeoutAction": {
+ "message": "Åtgärd när valvets tidsgräns överskrids"
+ },
+ "lock": {
+ "message": "Lås",
+ "description": "Verb form: to make secure or inaccesible by"
+ },
+ "trash": {
+ "message": "Papperskorgen",
+ "description": "Noun: a special folder to hold deleted items"
+ },
+ "searchTrash": {
+ "message": "Sök i papperskorgen"
+ },
+ "permanentlyDeleteItem": {
+ "message": "Radera objekt permanent"
+ },
+ "permanentlyDeleteItemConfirmation": {
+ "message": "Är du säker på att du vill radera detta objekt permanent?"
+ },
+ "permanentlyDeletedItem": {
+ "message": "Raderade objekt permanent"
+ },
+ "restoreItem": {
+ "message": "Återställ objekt"
+ },
+ "restoreItemConfirmation": {
+ "message": "Är du säker på att du vill återställa detta objekt?"
+ },
+ "restoredItem": {
+ "message": "Återställde objekt"
+ },
+ "vaultTimeoutLogOutConfirmation": {
+ "message": "Genom att logga ut upphör all åtkomst till valvet och onlineautentisering krävs efter att tidsgränsen överskridits. Är du säker på att du vill använda denna inställning?"
+ },
+ "vaultTimeoutLogOutConfirmationTitle": {
+ "message": "Bekräftelse av åtgärd när valvets tidsgräns överskrids"
+ },
+ "autoFillAndSave": {
+ "message": "Fyll i automatiskt och spara"
+ },
+ "autoFillSuccessAndSavedUri": {
+ "message": "Fyllde i objektet automatiskt och sparade URI:n"
+ },
+ "autoFillSuccess": {
+ "message": "Fyllde i objektet automatiskt"
+ },
+ "setMasterPassword": {
+ "message": "Ange huvudlösenord"
+ },
+ "masterPasswordPolicyInEffect": {
+ "message": "En eller flera organisationspolicyer kräver att ditt huvudlösenord uppfyller följande krav:"
+ },
+ "policyInEffectMinComplexity": {
+ "message": "Minsta komplexitetspoäng på $SCORE$",
+ "placeholders": {
+ "score": {
+ "content": "$1",
+ "example": "4"
+ }
+ }
+ },
+ "policyInEffectMinLength": {
+ "message": "Minsta längd på $LENGTH$",
+ "placeholders": {
+ "length": {
+ "content": "$1",
+ "example": "14"
+ }
+ }
+ },
+ "policyInEffectUppercase": {
+ "message": "Innehålla en eller flera versaler"
+ },
+ "policyInEffectLowercase": {
+ "message": "Innehålla en eller flera gemener"
+ },
+ "policyInEffectNumbers": {
+ "message": "Innehålla en eller flera siffror"
+ },
+ "policyInEffectSpecial": {
+ "message": "Innehålla ett eller flera av följande specialtecken: $CHARS$",
+ "placeholders": {
+ "chars": {
+ "content": "$1",
+ "example": "!@#$%^&*"
+ }
+ }
+ },
+ "masterPasswordPolicyRequirementsNotMet": {
+ "message": "Ditt nya huvudlösenord uppfyller inte kraven i policyn."
+ },
+ "acceptPolicies": {
+ "message": "Genom att markera denna ruta godkänner du följande:"
+ },
+ "acceptPoliciesError": {
+ "message": "Användarvillkoren och Integritetspolicyn har inte accepterats."
+ },
+ "termsOfService": {
+ "message": "Användarvillkor"
+ },
+ "privacyPolicy": {
+ "message": "Integritetspolicy"
+ },
+ "hintEqualsPassword": {
+ "message": "Din lösenordsledtråd får inte vara samma som ditt lösenord."
+ },
+ "ok": {
+ "message": "OK"
+ },
+ "desktopSyncVerificationTitle": {
+ "message": "Verifiering av synkronisering med skrivbordsprogrammet"
+ },
+ "desktopIntegrationVerificationText": {
+ "message": "Vänligen bekräfta att skrivbordsprogrammet visar det här fingeravtrycket: "
+ },
+ "desktopIntegrationDisabledTitle": {
+ "message": "Webbläsarintegration är inte aktiverad"
+ },
+ "desktopIntegrationDisabledDesc": {
+ "message": "Webbläsarintegration är inte aktiverad i Bitwardens skrivbordsprogram. Aktivera det i inställningarna i skrivbordsprogrammet."
+ },
+ "startDesktopTitle": {
+ "message": "Starta Bitwardens skrivbordsprogram"
+ },
+ "startDesktopDesc": {
+ "message": "Bitwardens skrivbordsprogram måste köras innan denna funktion kan användas."
+ },
+ "errorEnableBiometricTitle": {
+ "message": "Det gick inte att aktivera biometri"
+ },
+ "errorEnableBiometricDesc": {
+ "message": "Åtgärden avbröts av skrivbordsprogrammet"
+ },
+ "nativeMessagingInvalidEncryptionDesc": {
+ "message": "Skrivbordsprogrammet ogiltigförklarade den säkra kommunikationskanalen. Försök igen"
+ },
+ "nativeMessagingInvalidEncryptionTitle": {
+ "message": "Kommunikationen med skrivbordsprogrammet avbröts"
+ },
+ "nativeMessagingWrongUserDesc": {
+ "message": "Skrivbordsprogrammet är inloggat på ett annat konto. Se till att båda applikationerna är inloggade på samma konto."
+ },
+ "nativeMessagingWrongUserTitle": {
+ "message": "Kontoavvikelse"
+ },
+ "biometricsNotEnabledTitle": {
+ "message": "Biometri är inte aktiverat"
+ },
+ "biometricsNotEnabledDesc": {
+ "message": "Biometri i webbläsaren kräver att biometri på skrivbordet aktiveras i inställningarna först."
+ },
+ "biometricsNotSupportedTitle": {
+ "message": "Biometri stöds inte"
+ },
+ "biometricsNotSupportedDesc": {
+ "message": "Biometri i webbläsaren stöds inte på den här enheten."
+ },
+ "nativeMessaginPermissionErrorTitle": {
+ "message": "Behörighet ej beviljad"
+ },
+ "nativeMessaginPermissionErrorDesc": {
+ "message": "Utan behörighet att kommunicera med Bitwardens skrivbordsprogram kan vi inte tillhandahålla biometri i webbläsartillägget. Försök igen."
+ },
+ "nativeMessaginPermissionSidebarTitle": {
+ "message": "Fel vid behörighetsbegäran"
+ },
+ "nativeMessaginPermissionSidebarDesc": {
+ "message": "Denna åtgärd kan inte utföras i sidofältet. Försök igen i popup- eller popout-fönstret."
+ },
+ "personalOwnershipSubmitError": {
+ "message": "På grund av en av företagets policyer är du begränsad från att spara objekt till ditt personliga valv. Ändra ägarskap till en organisation och välj från tillgängliga samlingar."
+ },
+ "personalOwnershipPolicyInEffect": {
+ "message": "En organisationspolicy påverkar dina ägarskapsalternativ."
+ },
+ "excludedDomains": {
+ "message": "Exkluderade domäner"
+ },
+ "excludedDomainsDesc": {
+ "message": "Bitwarden kommer inte att fråga om att få spara inloggningsuppgifter för dessa domäner. Du måste uppdatera sidan för att ändringarna ska träda i kraft."
+ },
+ "excludedDomainsInvalidDomain": {
+ "message": "$DOMAIN$ är inte en giltig domän",
+ "placeholders": {
+ "domain": {
+ "content": "$1",
+ "example": "googlecom"
+ }
+ }
+ },
+ "send": {
+ "message": "Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "searchSends": {
+ "message": "Sök försändelser",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "addSend": {
+ "message": "Lägg till Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTypeText": {
+ "message": "Text"
+ },
+ "sendTypeFile": {
+ "message": "Fil"
+ },
+ "allSends": {
+ "message": "Alla försändelser",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "maxAccessCountReached": {
+ "message": "Det maximala antalet åtkomster har uppnåtts"
+ },
+ "expired": {
+ "message": "Utgången"
+ },
+ "pendingDeletion": {
+ "message": "Väntar på radering"
+ },
+ "passwordProtected": {
+ "message": "Lösenordsskyddad"
+ },
+ "copySendLink": {
+ "message": "Kopiera försändelselänk",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "removePassword": {
+ "message": "Ta bort lösenord"
+ },
+ "delete": {
+ "message": "Radera"
+ },
+ "removedPassword": {
+ "message": "Tog bort lösenord"
+ },
+ "deletedSend": {
+ "message": "Deleted Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendLink": {
+ "message": "Försändelselänk",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "disabled": {
+ "message": "Inaktiverad"
+ },
+ "removePasswordConfirmation": {
+ "message": "Är du säker på att du vill ta bort lösenordet?"
+ },
+ "deleteSend": {
+ "message": "Radera Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "deleteSendConfirmation": {
+ "message": "Är du säker på att du vill radera denna Send?",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "editSend": {
+ "message": "Redigera Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTypeHeader": {
+ "message": "Vilken typ av försändelse är detta?",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendNameDesc": {
+ "message": "Ett användarvänligt namn för att beskriva denna försändelse.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendFileDesc": {
+ "message": "Filen du vill skicka."
+ },
+ "deletionDate": {
+ "message": "Raderingsdatum"
+ },
+ "deletionDateDesc": {
+ "message": "Försändelsen kommer att raderas permanent på angivet datum och tid.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "expirationDate": {
+ "message": "Utgångsdatum"
+ },
+ "expirationDateDesc": {
+ "message": "Om angivet kommer åtkomst till denna försändelse upphöra på på angivet datum och tid.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "oneDay": {
+ "message": "1 dag"
+ },
+ "days": {
+ "message": "$DAYS$ dagar",
+ "placeholders": {
+ "days": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "custom": {
+ "message": "Anpassad"
+ },
+ "maximumAccessCount": {
+ "message": "Maximalt antal åtkomster"
+ },
+ "maximumAccessCountDesc": {
+ "message": "Om angivet kommer användare inte längre komma åt denna försändelse när den maximala antalet åtkomster har uppnåtts.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendPasswordDesc": {
+ "message": "Kräv ett lösenord från användare innan de kommer åt denna försändelse.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendNotesDesc": {
+ "message": "Egna anteckningar om denna försändelse.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendDisableDesc": {
+ "message": "Inaktivera denna försändelse så att ingen kan komma åt den.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendShareDesc": {
+ "message": "Kopiera länken till den här försändelsen när den har sparats.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTextDesc": {
+ "message": "Texten du vill skicka."
+ },
+ "sendHideText": {
+ "message": "Dölj försändelsens text som standard.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "currentAccessCount": {
+ "message": "Nuvarande antal åtkomster"
+ },
+ "createSend": {
+ "message": "Skapa ny Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "newPassword": {
+ "message": "Nytt lösenord"
+ },
+ "sendDisabled": {
+ "message": "Send Disabled",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendDisabledWarning": {
+ "message": "På grund av en företagspolicy kan du bara radera befintliga försändelser.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "createdSend": {
+ "message": "Skapade försändelse",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "editedSend": {
+ "message": "Redigerade försändelse",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendLinuxChromiumFileWarning": {
+ "message": "För att välja en fil, öppna tillägget i sidofältet (om möjligt) eller skapa ett nytt fönster genom att klicka på denna banner."
+ },
+ "sendFirefoxFileWarning": {
+ "message": "För att välja en fil med Firefox, öppna tillägget i sidofältet eller öppna ett nytt fönster genom att klicka på denna banner."
+ },
+ "sendSafariFileWarning": {
+ "message": "För att välja en fil med Safari, öppna ett nytt fönster genom att klicka på denna banner."
+ },
+ "sendFileCalloutHeader": {
+ "message": "Innan du börjar"
+ },
+ "sendFirefoxCustomDatePopoutMessage1": {
+ "message": "För att använda en datumväljare med kalenderstil",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read '**To use a calendar style date picker ** click here to pop out your window.'"
+ },
+ "sendFirefoxCustomDatePopoutMessage2": {
+ "message": "klicka här",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker **click here** to pop out your window.'"
+ },
+ "sendFirefoxCustomDatePopoutMessage3": {
+ "message": "för att öppna ett nytt fönster.",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker click here **to pop out your window.**'"
+ },
+ "expirationDateIsInvalid": {
+ "message": "Det angivna utgångsdatumet är inte giltigt."
+ },
+ "deletionDateIsInvalid": {
+ "message": "Det angivna raderingsdatumet är inte giltigt."
+ },
+ "expirationDateAndTimeRequired": {
+ "message": "Ett utgångsdatum och tid krävs."
+ },
+ "deletionDateAndTimeRequired": {
+ "message": "Ett raderingsdatum och tid krävs."
+ },
+ "dateParsingError": {
+ "message": "Det gick inte att spara raderings- och utgångsdatum."
+ },
+ "hideEmail": {
+ "message": "Dölj min e-postadress för mottagare."
+ },
+ "sendOptionsPolicyInEffect": {
+ "message": "En eller flera organisationsriktlinjer påverkar dina Send-inställningar."
+ },
+ "passwordPrompt": {
+ "message": "Återupprepa huvudlösenord"
+ },
+ "passwordConfirmation": {
+ "message": "Bekräfta huvudlösenord"
+ },
+ "passwordConfirmationDesc": {
+ "message": "Denna åtgärd är skyddad. För att fortsätta, vänligen verifiera din identitet genom att ange ditt huvudlösenord."
+ },
+ "emailVerificationRequired": {
+ "message": "E-postverifiering krävs"
+ },
+ "emailVerificationRequiredDesc": {
+ "message": "Du måste verifiera din e-postadress för att använda den här funktionen. Du kan verifiera din e-postadress i webbvalvet."
+ },
+ "updatedMasterPassword": {
+ "message": "Updated Master Password"
+ },
+ "updateMasterPassword": {
+ "message": "Update Master Password"
+ },
+ "updateMasterPasswordWarning": {
+ "message": "Your Master Password was recently changed by an administrator in your organization. In order to access the vault, you must update it now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour."
+ },
+ "resetPasswordPolicyAutoEnroll": {
+ "message": "Automatic Enrollment"
+ },
+ "resetPasswordAutoEnrollInviteWarning": {
+ "message": "This organization has an enterprise policy that will automatically enroll you in password reset. Enrollment will allow organization administrators to change your master password."
+ },
+ "selectFolder": {
+ "message": "Välj mapp…"
+ },
+ "ssoCompleteRegistration": {
+ "message": "In order to complete logging in with SSO, please set a master password to access and protect your vault."
+ },
+ "hours": {
+ "message": "Timmar"
+ },
+ "minutes": {
+ "message": "Minuter"
+ },
+ "vaultTimeoutPolicyInEffect": {
+ "message": "Your organization policies are affecting your vault timeout. Maximum allowed Vault Timeout is $HOURS$ hour(s) and $MINUTES$ minute(s)",
+ "placeholders": {
+ "hours": {
+ "content": "$1",
+ "example": "5"
+ },
+ "minutes": {
+ "content": "$2",
+ "example": "5"
+ }
+ }
+ },
+ "vaultTimeoutToLarge": {
+ "message": "Your vault timeout exceeds the restrictions set by your organization."
+ },
+ "vaultExportDisabled": {
+ "message": "Vault Export Disabled"
+ },
+ "personalVaultExportPolicyInEffect": {
+ "message": "One or more organization policies prevents you from exporting your personal vault."
+ },
+ "copyCustomFieldNameInvalidElement": {
+ "message": "Unable to identify a valid form element. Try inspecting the HTML instead."
+ },
+ "copyCustomFieldNameNotUnique": {
+ "message": "No unique identifier found."
+ }
+}
diff --git a/src/iOS.Safari/Resources/_locales/th/messages.json b/src/iOS.Safari/Resources/_locales/th/messages.json
new file mode 100644
index 000000000..bf803640a
--- /dev/null
+++ b/src/iOS.Safari/Resources/_locales/th/messages.json
@@ -0,0 +1,1817 @@
+{
+ "appName": {
+ "message": "bitwarden"
+ },
+ "extName": {
+ "message": "bitwarden - Free Password Manager",
+ "description": "Extension name, MUST be less than 40 characters (Safari restriction)"
+ },
+ "extDesc": {
+ "message": "bitwarden is a secure and free password manager for all of your devices.",
+ "description": "Extension description"
+ },
+ "loginOrCreateNewAccount": {
+ "message": "Log in or create a new account to access your secure vault."
+ },
+ "createAccount": {
+ "message": "สร้างบัญชี"
+ },
+ "login": {
+ "message": "เข้าสู่ระบบ"
+ },
+ "enterpriseSingleSignOn": {
+ "message": "Enterprise Single Sign-On"
+ },
+ "cancel": {
+ "message": "ยกเลิก"
+ },
+ "close": {
+ "message": "ปิด"
+ },
+ "submit": {
+ "message": "ส่งข้อมูล"
+ },
+ "emailAddress": {
+ "message": "ที่อยู่อีเมล"
+ },
+ "masterPass": {
+ "message": "Master Password"
+ },
+ "masterPassDesc": {
+ "message": "The master password is the password you use to access your vault. It is very important that you do not forget your master password. There is no way to recover the password in the event that you forget it."
+ },
+ "masterPassHintDesc": {
+ "message": "A master password hint can help you remember your password if you forget it."
+ },
+ "reTypeMasterPass": {
+ "message": "Re-type Master Password"
+ },
+ "masterPassHint": {
+ "message": "Master Password Hint (optional)"
+ },
+ "tab": {
+ "message": "แท็บ"
+ },
+ "myVault": {
+ "message": "My Vault"
+ },
+ "tools": {
+ "message": "เครื่องมือ"
+ },
+ "settings": {
+ "message": "การตั้งค่า"
+ },
+ "currentTab": {
+ "message": "แท็บปัจจุบัน"
+ },
+ "copyPassword": {
+ "message": "คัดลอกรหัสผ่าน"
+ },
+ "copyNote": {
+ "message": "Copy Note"
+ },
+ "copyUri": {
+ "message": "คัดลอก URI"
+ },
+ "copyUsername": {
+ "message": "คัดลอกชื่อผู้ใช้"
+ },
+ "copyNumber": {
+ "message": "คัดลอกหมายเลข"
+ },
+ "copySecurityCode": {
+ "message": "คัดลอกรหัสรักษาความปลอดภัย"
+ },
+ "autoFill": {
+ "message": "กรอกข้อมูลอัตโนมัติ"
+ },
+ "generatePasswordCopied": {
+ "message": "Generate Password (copied)"
+ },
+ "copyElementIdentifier": {
+ "message": "Copy Custom Field Name"
+ },
+ "noMatchingLogins": {
+ "message": "No matching logins."
+ },
+ "vaultLocked": {
+ "message": "Vault is locked."
+ },
+ "vaultLoggedOut": {
+ "message": "Vault is logged out."
+ },
+ "autoFillInfo": {
+ "message": "There are no logins available to auto-fill for the current browser tab."
+ },
+ "addLogin": {
+ "message": "Add a Login"
+ },
+ "addItem": {
+ "message": "เพิ่มรายการ"
+ },
+ "passwordHint": {
+ "message": "คำใบ้รหัสผ่าน"
+ },
+ "enterEmailToGetHint": {
+ "message": "Enter your account email address to receive your master password hint."
+ },
+ "getMasterPasswordHint": {
+ "message": "Get master password hint"
+ },
+ "continue": {
+ "message": "ดำเนินการต่อไป"
+ },
+ "verificationCode": {
+ "message": "Verification Code"
+ },
+ "account": {
+ "message": "บัญชี"
+ },
+ "changeMasterPassword": {
+ "message": "Change Master Password"
+ },
+ "fingerprintPhrase": {
+ "message": "Fingerprint Phrase",
+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
+ },
+ "yourAccountsFingerprint": {
+ "message": "Your account's fingerprint phrase",
+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
+ },
+ "twoStepLogin": {
+ "message": "Two-step Login"
+ },
+ "logOut": {
+ "message": "ออกจากระบบ"
+ },
+ "about": {
+ "message": "เกี่ยวกับ"
+ },
+ "version": {
+ "message": "เวอร์ชัน"
+ },
+ "save": {
+ "message": "บันทึก"
+ },
+ "move": {
+ "message": "ย้าย"
+ },
+ "addFolder": {
+ "message": "เพิ่มโฟลเดอร์"
+ },
+ "name": {
+ "message": "ชื่อ"
+ },
+ "editFolder": {
+ "message": "แก้ไขโฟลเดอร์"
+ },
+ "deleteFolder": {
+ "message": "ลบโฟลเดอร์"
+ },
+ "folders": {
+ "message": "โฟลเดอร์"
+ },
+ "noFolders": {
+ "message": "There are no folders to list."
+ },
+ "helpFeedback": {
+ "message": "Help & Feedback"
+ },
+ "sync": {
+ "message": "ซิงค์"
+ },
+ "syncVaultNow": {
+ "message": "Sync Vault Now"
+ },
+ "lastSync": {
+ "message": "Last Sync:"
+ },
+ "passGen": {
+ "message": "Password Generator"
+ },
+ "generator": {
+ "message": "Generator",
+ "description": "Short for 'Password Generator'."
+ },
+ "passGenInfo": {
+ "message": "Automatically generate strong, unique passwords for your logins."
+ },
+ "bitWebVault": {
+ "message": "bitwarden Web Vault"
+ },
+ "importItems": {
+ "message": "Import Items"
+ },
+ "select": {
+ "message": "เลือก"
+ },
+ "generatePassword": {
+ "message": "Generate Password"
+ },
+ "regeneratePassword": {
+ "message": "Regenerate Password"
+ },
+ "options": {
+ "message": "Options"
+ },
+ "length": {
+ "message": "Length"
+ },
+ "numWords": {
+ "message": "Number of Words"
+ },
+ "wordSeparator": {
+ "message": "Word Separator"
+ },
+ "capitalize": {
+ "message": "Capitalize",
+ "description": "Make the first letter of a work uppercase."
+ },
+ "includeNumber": {
+ "message": "Include Number"
+ },
+ "minNumbers": {
+ "message": "Minimum Numbers"
+ },
+ "minSpecial": {
+ "message": "Minimum Special"
+ },
+ "avoidAmbChar": {
+ "message": "Avoid Ambiguous Characters"
+ },
+ "searchVault": {
+ "message": "Search vault"
+ },
+ "edit": {
+ "message": "Edit"
+ },
+ "view": {
+ "message": "View"
+ },
+ "noItemsInList": {
+ "message": "There are no items to list."
+ },
+ "itemInformation": {
+ "message": "Item Information"
+ },
+ "username": {
+ "message": "ชื่อผู้ใช้"
+ },
+ "password": {
+ "message": "รหัสผ่าน"
+ },
+ "passphrase": {
+ "message": "Passphrase"
+ },
+ "favorite": {
+ "message": "รายการโปรด"
+ },
+ "notes": {
+ "message": "โน้ต"
+ },
+ "note": {
+ "message": "โน้ต"
+ },
+ "editItem": {
+ "message": "แก้ไขรายการ"
+ },
+ "folder": {
+ "message": "โฟลเดอร์"
+ },
+ "deleteItem": {
+ "message": "ลบรายการ"
+ },
+ "viewItem": {
+ "message": "ดูรายการ"
+ },
+ "launch": {
+ "message": "เริ่ม"
+ },
+ "website": {
+ "message": "เว็บไซต์"
+ },
+ "toggleVisibility": {
+ "message": "Toggle Visibility"
+ },
+ "manage": {
+ "message": "จัดการ"
+ },
+ "other": {
+ "message": "อื่น ๆ"
+ },
+ "rateExtension": {
+ "message": "Rate the Extension"
+ },
+ "rateExtensionDesc": {
+ "message": "Please consider helping us out with a good review!"
+ },
+ "browserNotSupportClipboard": {
+ "message": "Your web browser does not support easy clipboard copying. Copy it manually instead."
+ },
+ "verifyMasterPassword": {
+ "message": "Verify Master Password"
+ },
+ "yourVaultIsLocked": {
+ "message": "Your vault is locked. Verify your master password to continue."
+ },
+ "unlock": {
+ "message": "ปลดล็อค"
+ },
+ "loggedInAsOn": {
+ "message": "Logged in as $EMAIL$ on $HOSTNAME$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "name@example.com"
+ },
+ "hostname": {
+ "content": "$2",
+ "example": "bitwarden.com"
+ }
+ }
+ },
+ "invalidMasterPassword": {
+ "message": "รหัสผ่านหลักไม่ถูกต้อง"
+ },
+ "vaultTimeout": {
+ "message": "Vault Timeout"
+ },
+ "lockNow": {
+ "message": "Lock Now"
+ },
+ "immediately": {
+ "message": "ทันที"
+ },
+ "tenSeconds": {
+ "message": "10 วินาที"
+ },
+ "twentySeconds": {
+ "message": "20 วินาที"
+ },
+ "thirtySeconds": {
+ "message": "30 วินาที"
+ },
+ "oneMinute": {
+ "message": "1 นาที"
+ },
+ "twoMinutes": {
+ "message": "2 นาที"
+ },
+ "fiveMinutes": {
+ "message": "5 นาที"
+ },
+ "fifteenMinutes": {
+ "message": "15 นาที"
+ },
+ "thirtyMinutes": {
+ "message": "30 นาที"
+ },
+ "oneHour": {
+ "message": "1 ชั่วโมง"
+ },
+ "fourHours": {
+ "message": "4 ชั่วโมง"
+ },
+ "onLocked": {
+ "message": "On Locked"
+ },
+ "onRestart": {
+ "message": "On Restart"
+ },
+ "never": {
+ "message": "ไม่อีกเลย"
+ },
+ "security": {
+ "message": "ความปลอดภัย"
+ },
+ "errorOccurred": {
+ "message": "An error has occurred"
+ },
+ "emailRequired": {
+ "message": "Email address is required."
+ },
+ "invalidEmail": {
+ "message": "ที่อยู่อีเมลไม่ถูกต้อง"
+ },
+ "masterPassRequired": {
+ "message": "Master password is required."
+ },
+ "masterPassLength": {
+ "message": "Master password must be at least 8 characters long."
+ },
+ "masterPassDoesntMatch": {
+ "message": "Master password confirmation does not match."
+ },
+ "newAccountCreated": {
+ "message": "Your new account has been created! You may now log in."
+ },
+ "masterPassSent": {
+ "message": "We've sent you an email with your master password hint."
+ },
+ "verificationCodeRequired": {
+ "message": "Verification code is required."
+ },
+ "valueCopied": {
+ "message": " copied",
+ "description": "Value has been copied to the clipboard.",
+ "placeholders": {
+ "value": {
+ "content": "$1",
+ "example": "Password"
+ }
+ }
+ },
+ "autofillError": {
+ "message": "Unable to auto-fill the selected login on this page. Copy/paste your username and/or password instead."
+ },
+ "loggedOut": {
+ "message": "ออกจากระบบ"
+ },
+ "loginExpired": {
+ "message": "Your login session has expired."
+ },
+ "logOutConfirmation": {
+ "message": "Are you sure you want to log out?"
+ },
+ "yes": {
+ "message": "ใช่"
+ },
+ "no": {
+ "message": "ไม่ใช่"
+ },
+ "unexpectedError": {
+ "message": "An unexpected error has occured."
+ },
+ "nameRequired": {
+ "message": "Name is required."
+ },
+ "addedFolder": {
+ "message": "Added folder"
+ },
+ "changeMasterPass": {
+ "message": "Change Master Password"
+ },
+ "changeMasterPasswordConfirmation": {
+ "message": "You can change your master password on the bitwarden.com web vault. Do you want to visit the website now?"
+ },
+ "twoStepLoginConfirmation": {
+ "message": "Two-step login makes your account more secure by requiring you to enter a security code from an authenticator app whenever you log in. Two-step login can be enabled on the bitwarden.com web vault. Do you want to visit the website now?"
+ },
+ "editedFolder": {
+ "message": "Edited Folder"
+ },
+ "deleteFolderConfirmation": {
+ "message": "Are you sure you want to delete this folder?"
+ },
+ "deletedFolder": {
+ "message": "Deleted folder"
+ },
+ "gettingStartedTutorial": {
+ "message": "Getting Started Tutorial"
+ },
+ "gettingStartedTutorialVideo": {
+ "message": "Watch our getting started tutorial to learn how to get the most out of the browser extension."
+ },
+ "syncingComplete": {
+ "message": "Syncing complete"
+ },
+ "syncingFailed": {
+ "message": "Syncing failed"
+ },
+ "passwordCopied": {
+ "message": "Password copied"
+ },
+ "uri": {
+ "message": "URI"
+ },
+ "uriPosition": {
+ "message": "URI $POSITION$",
+ "description": "A listing of URIs. Ex: URI 1, URI 2, URI 3, etc.",
+ "placeholders": {
+ "position": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "newUri": {
+ "message": "New URI"
+ },
+ "addedItem": {
+ "message": "Added item"
+ },
+ "editedItem": {
+ "message": "Edited item"
+ },
+ "deleteItemConfirmation": {
+ "message": "Do you really want to send to the trash?"
+ },
+ "deletedItem": {
+ "message": "Sent item to trash"
+ },
+ "overwritePassword": {
+ "message": "Overwrite Password"
+ },
+ "overwritePasswordConfirmation": {
+ "message": "Are you sure you want to overwrite the current password?"
+ },
+ "searchFolder": {
+ "message": "Search folder"
+ },
+ "searchCollection": {
+ "message": "Search collection"
+ },
+ "searchType": {
+ "message": "Search type"
+ },
+ "noneFolder": {
+ "message": "No Folder",
+ "description": "This is the folder for uncategorized items"
+ },
+ "disableAddLoginNotification": {
+ "message": "Disable Add Login Notification"
+ },
+ "addLoginNotificationDesc": {
+ "message": "The \"Add Login Notification\" automatically prompts you to save new logins to your vault whenever you log into them for the first time."
+ },
+ "dontShowCardsCurrentTab": {
+ "message": "Don't Show Cards on Tab Page"
+ },
+ "dontShowCardsCurrentTabDesc": {
+ "message": "Card items from your vault are listed on the 'Current Tab' page for easy auto-fill access."
+ },
+ "dontShowIdentitiesCurrentTab": {
+ "message": "Don't Show Identities on Tab Page"
+ },
+ "dontShowIdentitiesCurrentTabDesc": {
+ "message": "Identity items from your vault are listed on the 'Current Tab' page for easy auto-fill access."
+ },
+ "clearClipboard": {
+ "message": "Clear Clipboard",
+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
+ },
+ "clearClipboardDesc": {
+ "message": "Automatically clear copied values from your clipboard.",
+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
+ },
+ "notificationAddDesc": {
+ "message": "Should bitwarden remember this password for you?"
+ },
+ "notificationAddSave": {
+ "message": "Yes, Save Now"
+ },
+ "notificationNeverSave": {
+ "message": "Never for this website"
+ },
+ "disableChangedPasswordNotification": {
+ "message": "Disable Changed Password Notification"
+ },
+ "disableChangedPasswordNotificationDesc": {
+ "message": "The \"Changed Password Notification\" automatically prompts you to update a login's password in your vault whenever it detects that you have changed it on a website."
+ },
+ "notificationChangeDesc": {
+ "message": "Do you want to update this password in Bitwarden?"
+ },
+ "notificationChangeSave": {
+ "message": "Yes, Update Now"
+ },
+ "disableContextMenuItem": {
+ "message": "Disable Context Menu Options"
+ },
+ "disableContextMenuItemDesc": {
+ "message": "Context menu options provide quick access to password generation and logins for the website in your current tab."
+ },
+ "defaultUriMatchDetection": {
+ "message": "Default URI Match Detection",
+ "description": "Default URI match detection for auto-fill."
+ },
+ "defaultUriMatchDetectionDesc": {
+ "message": "Choose the default way that URI match detection is handled for logins when performing actions such as auto-fill."
+ },
+ "theme": {
+ "message": "Theme"
+ },
+ "themeDesc": {
+ "message": "Change the application's color theme."
+ },
+ "dark": {
+ "message": "Dark",
+ "description": "Dark color"
+ },
+ "light": {
+ "message": "Light",
+ "description": "Light color"
+ },
+ "solarizedDark": {
+ "message": "Solarized Dark",
+ "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated."
+ },
+ "exportVault": {
+ "message": "Export Vault"
+ },
+ "fileFormat": {
+ "message": "File Format"
+ },
+ "warning": {
+ "message": "WARNING",
+ "description": "WARNING (should stay in capitalized letters if the language permits)"
+ },
+ "confirmVaultExport": {
+ "message": "Confirm Vault Export"
+ },
+ "exportWarningDesc": {
+ "message": "This export contains your vault data in an unencrypted format. You should not store or send the exported file over unsecure channels (such as email). Delete it immediately after you are done using it."
+ },
+ "encExportKeyWarningDesc": {
+ "message": "This export encrypts your data using your account's encryption key. If you ever rotate your account's encryption key you should export again since you will not be able to decrypt this export file."
+ },
+ "encExportAccountWarningDesc": {
+ "message": "Account encryption keys are unique to each Bitwarden user account, so you can't import an encrypted export into a different account."
+ },
+ "exportMasterPassword": {
+ "message": "Enter your master password to export your vault data."
+ },
+ "shared": {
+ "message": "Shared"
+ },
+ "learnOrg": {
+ "message": "Learn about Organizations"
+ },
+ "learnOrgConfirmation": {
+ "message": "Bitwarden allows you to share your vault items with others by using an organization. Would you like to visit the bitwarden.com website to learn more?"
+ },
+ "moveToOrganization": {
+ "message": "Move to Organization"
+ },
+ "share": {
+ "message": "Share"
+ },
+ "movedItemToOrg": {
+ "message": "$ITEMNAME$ moved to $ORGNAME$",
+ "placeholders": {
+ "itemname": {
+ "content": "$1",
+ "example": "Secret Item"
+ },
+ "orgname": {
+ "content": "$2",
+ "example": "Company Name"
+ }
+ }
+ },
+ "moveToOrgDesc": {
+ "message": "Choose an organization that you wish to move this item to. Moving to an organization transfers ownership of the item to that organization. You will no longer be the direct owner of this item once it has been moved."
+ },
+ "learnMore": {
+ "message": "Learn more"
+ },
+ "authenticatorKeyTotp": {
+ "message": "Authenticator Key (TOTP)"
+ },
+ "verificationCodeTotp": {
+ "message": "Verification Code (TOTP)"
+ },
+ "copyVerificationCode": {
+ "message": "Copy Verification Code"
+ },
+ "attachments": {
+ "message": "Attachments"
+ },
+ "deleteAttachment": {
+ "message": "Delete attachment"
+ },
+ "deleteAttachmentConfirmation": {
+ "message": "Are you sure you want to delete this attachment?"
+ },
+ "deletedAttachment": {
+ "message": "Deleted attachment"
+ },
+ "newAttachment": {
+ "message": "Add New Attachment"
+ },
+ "noAttachments": {
+ "message": "No attachments."
+ },
+ "attachmentSaved": {
+ "message": "The attachment has been saved."
+ },
+ "file": {
+ "message": "File"
+ },
+ "selectFile": {
+ "message": "Select a file."
+ },
+ "maxFileSize": {
+ "message": "Maximum file size is 500 MB."
+ },
+ "featureUnavailable": {
+ "message": "Feature Unavailable"
+ },
+ "updateKey": {
+ "message": "You cannot use this feature until you update your encryption key."
+ },
+ "premiumMembership": {
+ "message": "Premium Membership"
+ },
+ "premiumManage": {
+ "message": "Manage Membership"
+ },
+ "premiumManageAlert": {
+ "message": "You can manage your membership on the bitwarden.com web vault. Do you want to visit the website now?"
+ },
+ "premiumRefresh": {
+ "message": "Refresh Membership"
+ },
+ "premiumNotCurrentMember": {
+ "message": "You are not currently a premium member."
+ },
+ "premiumSignUpAndGet": {
+ "message": "Sign up for a premium membership and get:"
+ },
+ "ppremiumSignUpStorage": {
+ "message": "1 GB of encrypted file storage."
+ },
+ "ppremiumSignUpTwoStep": {
+ "message": "Additional two-step login options such as YubiKey, FIDO U2F, and Duo."
+ },
+ "ppremiumSignUpReports": {
+ "message": "Password hygiene, account health, and data breach reports to keep your vault safe."
+ },
+ "ppremiumSignUpTotp": {
+ "message": "TOTP verification code (2FA) generator for logins in your vault."
+ },
+ "ppremiumSignUpSupport": {
+ "message": "Priority customer support."
+ },
+ "ppremiumSignUpFuture": {
+ "message": "All future premium features. More coming soon!"
+ },
+ "premiumPurchase": {
+ "message": "Purchase Premium"
+ },
+ "premiumPurchaseAlert": {
+ "message": "You can purchase premium membership on the bitwarden.com web vault. Do you want to visit the website now?"
+ },
+ "premiumCurrentMember": {
+ "message": "You are a premium member!"
+ },
+ "premiumCurrentMemberThanks": {
+ "message": "Thank you for supporting bitwarden."
+ },
+ "premiumPrice": {
+ "message": "All for just %price% /year!",
+ "placeholders": {
+ "price": {
+ "content": "$1",
+ "example": "$10"
+ }
+ }
+ },
+ "refreshComplete": {
+ "message": "Refresh complete"
+ },
+ "disableAutoTotpCopy": {
+ "message": "Disable Automatic TOTP Copy"
+ },
+ "disableAutoTotpCopyDesc": {
+ "message": "If your login has an authenticator key attached to it, the TOTP verification code is automatically copied to your clipboard whenever you auto-fill the login."
+ },
+ "disableAutoBiometricsPrompt": {
+ "message": "Do not prompt for biometrics on launch"
+ },
+ "premiumRequired": {
+ "message": "Premium Required"
+ },
+ "premiumRequiredDesc": {
+ "message": "A premium membership is required to use this feature."
+ },
+ "enterVerificationCodeApp": {
+ "message": "Enter the 6 digit verification code from your authenticator app."
+ },
+ "enterVerificationCodeEmail": {
+ "message": "Enter the 6 digit verification code that was emailed to",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "example@gmail.com"
+ }
+ }
+ },
+ "verificationCodeEmailSent": {
+ "message": "Verification email sent to $EMAIL$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "example@gmail.com"
+ }
+ }
+ },
+ "rememberMe": {
+ "message": "Remember me"
+ },
+ "sendVerificationCodeEmailAgain": {
+ "message": "Send verification code email again"
+ },
+ "useAnotherTwoStepMethod": {
+ "message": "Use another two-step login method"
+ },
+ "insertYubiKey": {
+ "message": "Insert your YubiKey into your computer's USB port, then touch its button."
+ },
+ "insertU2f": {
+ "message": "Insert your security key into your computer's USB port. If it has a button, touch it."
+ },
+ "webAuthnNewTab": {
+ "message": "To start the WebAuthn 2FA verification. Click the button below to open a new tab and follow the instructions provided in the new tab."
+ },
+ "webAuthnNewTabOpen": {
+ "message": "Open new tab"
+ },
+ "webAuthnAuthenticate": {
+ "message": "Authenticate WebAuthn"
+ },
+ "loginUnavailable": {
+ "message": "Login Unavailable"
+ },
+ "noTwoStepProviders": {
+ "message": "This account has two-step login enabled, however, none of the configured two-step providers are supported by this web browser."
+ },
+ "noTwoStepProviders2": {
+ "message": "Please use a supported web browser (such as Chrome) and/or add additional providers that are better supported across web browsers (such as an authenticator app)."
+ },
+ "twoStepOptions": {
+ "message": "Two-step Login Options"
+ },
+ "recoveryCodeDesc": {
+ "message": "Lost access to all of your two-factor providers? Use your recovery code to disable all two-factor providers from your account."
+ },
+ "recoveryCodeTitle": {
+ "message": "Recovery Code"
+ },
+ "authenticatorAppTitle": {
+ "message": "Authenticator App"
+ },
+ "authenticatorAppDesc": {
+ "message": "Use an authenticator app (such as Authy or Google Authenticator) to generate time-based verification codes.",
+ "description": "'Authy' and 'Google Authenticator' are product names and should not be translated."
+ },
+ "yubiKeyTitle": {
+ "message": "YubiKey OTP Security Key"
+ },
+ "yubiKeyDesc": {
+ "message": "Use a YubiKey to access your account. Works with YubiKey 4, 4 Nano, 4C, and NEO devices."
+ },
+ "duoDesc": {
+ "message": "Verify with Duo Security using the Duo Mobile app, SMS, phone call, or U2F security key.",
+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
+ },
+ "duoOrganizationDesc": {
+ "message": "Verify with Duo Security for your organization using the Duo Mobile app, SMS, phone call, or U2F security key.",
+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
+ },
+ "webAuthnTitle": {
+ "message": "FIDO2 WebAuthn"
+ },
+ "webAuthnDesc": {
+ "message": "Use any WebAuthn enabled security key to access your account."
+ },
+ "emailTitle": {
+ "message": "Email"
+ },
+ "emailDesc": {
+ "message": "Verification codes will be emailed to you."
+ },
+ "selfHostedEnvironment": {
+ "message": "Self-hosted Environment"
+ },
+ "selfHostedEnvironmentFooter": {
+ "message": "Specify the base URL of your on-premise hosted bitwarden installation."
+ },
+ "customEnvironment": {
+ "message": "Custom Environment"
+ },
+ "customEnvironmentFooter": {
+ "message": "For advanced users. You can specify the base URL of each service independently."
+ },
+ "baseUrl": {
+ "message": "Server URL"
+ },
+ "apiUrl": {
+ "message": "API Server URL"
+ },
+ "webVaultUrl": {
+ "message": "Web Vault Server URL"
+ },
+ "identityUrl": {
+ "message": "Identity Server URL"
+ },
+ "notificationsUrl": {
+ "message": "Notifications Server URL"
+ },
+ "iconsUrl": {
+ "message": "Icons Server URL"
+ },
+ "environmentSaved": {
+ "message": "The environment URLs have been saved."
+ },
+ "enableAutoFillOnPageLoad": {
+ "message": "Enable Auto-fill On Page Load."
+ },
+ "enableAutoFillOnPageLoadDesc": {
+ "message": "If a login form is detected, automatically perform an auto-fill when the web page loads."
+ },
+ "experimentalFeature": {
+ "message": "This is currently an experimental feature. Use at your own risk."
+ },
+ "defaultAutoFillOnPageLoad": {
+ "message": "Default autofill setting for login items"
+ },
+ "defaultAutoFillOnPageLoadDesc": {
+ "message": "After enabling Auto-fill on Page Load, you can enable or disable the feature for individual login items. This is the default setting for login items that are not separately configured."
+ },
+ "itemAutoFillOnPageLoad": {
+ "message": "Auto-fill on Page Load (if enabled in Options)"
+ },
+ "autoFillOnPageLoadUseDefault": {
+ "message": "Use default setting"
+ },
+ "autoFillOnPageLoadYes": {
+ "message": "Auto-fill on page load"
+ },
+ "autoFillOnPageLoadNo": {
+ "message": "Do not auto-fill on page load"
+ },
+ "commandOpenPopup": {
+ "message": "Open vault popup"
+ },
+ "commandOpenSidebar": {
+ "message": "Open vault in sidebar"
+ },
+ "commandAutofillDesc": {
+ "message": "Auto-fill the last used login for the current website."
+ },
+ "commandGeneratePasswordDesc": {
+ "message": "Generate and copy a new random password to the clipboard."
+ },
+ "commandLockVaultDesc": {
+ "message": "Lock the vault"
+ },
+ "privateModeMessage": {
+ "message": "Unfortunately this window is not available in private mode for this browser."
+ },
+ "customFields": {
+ "message": "Custom Fields"
+ },
+ "copyValue": {
+ "message": "Copy Value"
+ },
+ "value": {
+ "message": "Value"
+ },
+ "newCustomField": {
+ "message": "New Custom Field"
+ },
+ "dragToSort": {
+ "message": "Drag to sort"
+ },
+ "cfTypeText": {
+ "message": "Text"
+ },
+ "cfTypeHidden": {
+ "message": "Hidden"
+ },
+ "cfTypeBoolean": {
+ "message": "Boolean"
+ },
+ "popup2faCloseMessage": {
+ "message": "Clicking outside the popup window to check your email for your verification code will cause this popup to close. Do you want to open this popup in a new window so that it does not close?"
+ },
+ "popupU2fCloseMessage": {
+ "message": "This browser cannot process U2F requests in this popup window. Do you want to open this popup in a new window so that you can log in using U2F?"
+ },
+ "disableFavicon": {
+ "message": "Disable Website Icons"
+ },
+ "disableFaviconDesc": {
+ "message": "Website Icons provides a recognizable icon next to each login item in your vault."
+ },
+ "disableBadgeCounter": {
+ "message": "Disable Badge Counter"
+ },
+ "disableBadgeCounterDesc": {
+ "message": "Badge counter indicates how many logins you have for the current page in your vault."
+ },
+ "cardholderName": {
+ "message": "Cardholder Name"
+ },
+ "number": {
+ "message": "Number"
+ },
+ "brand": {
+ "message": "Brand"
+ },
+ "expirationMonth": {
+ "message": "Expiration Month"
+ },
+ "expirationYear": {
+ "message": "Expiration Year"
+ },
+ "expiration": {
+ "message": "วันหมดอายุ"
+ },
+ "january": {
+ "message": "มกราคม"
+ },
+ "february": {
+ "message": "กุมภาพันธ์"
+ },
+ "march": {
+ "message": "มีนาคม"
+ },
+ "april": {
+ "message": "เมษายน"
+ },
+ "may": {
+ "message": "พฤษภาคม"
+ },
+ "june": {
+ "message": "มิถุนายน"
+ },
+ "july": {
+ "message": "กรกฎาคม"
+ },
+ "august": {
+ "message": "สิงหาคม"
+ },
+ "september": {
+ "message": "กันยายน"
+ },
+ "october": {
+ "message": "ตุลาคม"
+ },
+ "november": {
+ "message": "พฤศจิกายน"
+ },
+ "december": {
+ "message": "ธันวาคม"
+ },
+ "securityCode": {
+ "message": "Security Code"
+ },
+ "ex": {
+ "message": "ex."
+ },
+ "title": {
+ "message": "Title"
+ },
+ "mr": {
+ "message": "Mr"
+ },
+ "mrs": {
+ "message": "Mrs"
+ },
+ "ms": {
+ "message": "Ms"
+ },
+ "dr": {
+ "message": "Dr"
+ },
+ "firstName": {
+ "message": "First Name"
+ },
+ "middleName": {
+ "message": "Middle Name"
+ },
+ "lastName": {
+ "message": "Last Name"
+ },
+ "identityName": {
+ "message": "Identity Name"
+ },
+ "company": {
+ "message": "บริษัท"
+ },
+ "ssn": {
+ "message": "หมายเลขประกันสังคม"
+ },
+ "passportNumber": {
+ "message": "หมายเลขหนังสือเดินทาง"
+ },
+ "licenseNumber": {
+ "message": "หมายเลขใบอนุญาต"
+ },
+ "email": {
+ "message": "อีเมล"
+ },
+ "phone": {
+ "message": "โทรศัพท์"
+ },
+ "address": {
+ "message": "ที่อยู่"
+ },
+ "address1": {
+ "message": "ที่อยู่ 1"
+ },
+ "address2": {
+ "message": "ที่อยู่ 2"
+ },
+ "address3": {
+ "message": "ที่อยู่ 3"
+ },
+ "cityTown": {
+ "message": "เมือง"
+ },
+ "stateProvince": {
+ "message": "รัฐ / จังหวัด"
+ },
+ "zipPostalCode": {
+ "message": "รหัสไปรษณีย์"
+ },
+ "country": {
+ "message": "ประเทศ"
+ },
+ "type": {
+ "message": "Type"
+ },
+ "typeLogin": {
+ "message": "Login"
+ },
+ "typeLogins": {
+ "message": "Logins"
+ },
+ "typeSecureNote": {
+ "message": "Secure Note"
+ },
+ "typeCard": {
+ "message": "Card"
+ },
+ "typeIdentity": {
+ "message": "Identity"
+ },
+ "passwordHistory": {
+ "message": "Password History"
+ },
+ "back": {
+ "message": "ย้อนกลับ"
+ },
+ "collections": {
+ "message": "Collections"
+ },
+ "favorites": {
+ "message": "Favorites"
+ },
+ "popOutNewWindow": {
+ "message": "Pop out to a new window"
+ },
+ "refresh": {
+ "message": "Refresh"
+ },
+ "cards": {
+ "message": "Cards"
+ },
+ "identities": {
+ "message": "Identities"
+ },
+ "logins": {
+ "message": "Logins"
+ },
+ "secureNotes": {
+ "message": "Secure Notes"
+ },
+ "clear": {
+ "message": "Clear",
+ "description": "To clear something out. example: To clear browser history."
+ },
+ "checkPassword": {
+ "message": "Check if password has been exposed."
+ },
+ "passwordExposed": {
+ "message": "This password has been exposed in data breaches. You should change it.",
+ "placeholders": {
+ "value": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "passwordSafe": {
+ "message": "This password was not found in any known data breaches. It should be safe to use."
+ },
+ "baseDomain": {
+ "message": "Base domain"
+ },
+ "host": {
+ "message": "Host",
+ "description": "A URL's host value. For example, the host of https://sub.domain.com:443 is 'sub.domain.com:443'."
+ },
+ "exact": {
+ "message": "Exact"
+ },
+ "startsWith": {
+ "message": "Starts with"
+ },
+ "regEx": {
+ "message": "Regular expression",
+ "description": "A programming term, also known as 'RegEx'."
+ },
+ "matchDetection": {
+ "message": "Match Detection",
+ "description": "URI match detection for auto-fill."
+ },
+ "defaultMatchDetection": {
+ "message": "Default match detection",
+ "description": "Default URI match detection for auto-fill."
+ },
+ "toggleOptions": {
+ "message": "Toggle Options"
+ },
+ "toggleCurrentUris": {
+ "message": "Toggle Current URIs",
+ "description": "Toggle the display of the URIs of the currently open tabs in the browser."
+ },
+ "currentUri": {
+ "message": "Current URI",
+ "description": "The URI of one of the current open tabs in the browser."
+ },
+ "organization": {
+ "message": "Organization",
+ "description": "An entity of multiple related people (ex. a team or business organization)."
+ },
+ "types": {
+ "message": "Types"
+ },
+ "allItems": {
+ "message": "All Items"
+ },
+ "noPasswordsInList": {
+ "message": "There are no passwords to list."
+ },
+ "remove": {
+ "message": "Remove"
+ },
+ "default": {
+ "message": "Default"
+ },
+ "dateUpdated": {
+ "message": "Updated",
+ "description": "ex. Date this item was updated"
+ },
+ "datePasswordUpdated": {
+ "message": "Password Updated",
+ "description": "ex. Date this password was updated"
+ },
+ "neverLockWarning": {
+ "message": "Are you sure you want to use the \"Never\" option? Setting your lock options to \"Never\" stores your vault's encryption key on your device. If you use this option you should ensure that you keep your device properly protected."
+ },
+ "noOrganizationsList": {
+ "message": "You do not belong to any organizations. Organizations allow you to securely share items with other users."
+ },
+ "noCollectionsInList": {
+ "message": "There are no collections to list."
+ },
+ "ownership": {
+ "message": "Ownership"
+ },
+ "whoOwnsThisItem": {
+ "message": "Who owns this item?"
+ },
+ "strong": {
+ "message": "Strong",
+ "description": "ex. A strong password. Scale: Weak -> Good -> Strong"
+ },
+ "good": {
+ "message": "Good",
+ "description": "ex. A good password. Scale: Weak -> Good -> Strong"
+ },
+ "weak": {
+ "message": "Weak",
+ "description": "ex. A weak password. Scale: Weak -> Good -> Strong"
+ },
+ "weakMasterPassword": {
+ "message": "Weak Master Password"
+ },
+ "weakMasterPasswordDesc": {
+ "message": "The master password you have chosen is weak. You should use a strong master password (or a passphrase) to properly protect your Bitwarden account. Are you sure you want to use this master password?"
+ },
+ "pin": {
+ "message": "PIN",
+ "description": "PIN code. Ex. The short code (often numeric) that you use to unlock a device."
+ },
+ "unlockWithPin": {
+ "message": "Unlock with PIN"
+ },
+ "setYourPinCode": {
+ "message": "Set your PIN code for unlocking Bitwarden. Your PIN settings will be reset if you ever fully log out of the application."
+ },
+ "pinRequired": {
+ "message": "PIN code is required."
+ },
+ "invalidPin": {
+ "message": "Invalid PIN code."
+ },
+ "verifyPin": {
+ "message": "Verify PIN"
+ },
+ "yourVaultIsLockedPinCode": {
+ "message": "Your vault is locked. Verify your PIN code to continue."
+ },
+ "unlockWithBiometrics": {
+ "message": "Unlock with biometrics"
+ },
+ "awaitDesktop": {
+ "message": "Awaiting confirmation from desktop"
+ },
+ "awaitDesktopDesc": {
+ "message": "Please confirm using biometrics in the Bitwarden Desktop application to enable biometrics for browser."
+ },
+ "lockWithMasterPassOnRestart": {
+ "message": "Lock with master password on browser restart"
+ },
+ "selectOneCollection": {
+ "message": "You must select at least one collection."
+ },
+ "cloneItem": {
+ "message": "Clone Item"
+ },
+ "clone": {
+ "message": "Clone"
+ },
+ "passwordGeneratorPolicyInEffect": {
+ "message": "One or more organization policies are affecting your generator settings."
+ },
+ "vaultTimeoutAction": {
+ "message": "Vault Timeout Action"
+ },
+ "lock": {
+ "message": "Lock",
+ "description": "Verb form: to make secure or inaccesible by"
+ },
+ "trash": {
+ "message": "Trash",
+ "description": "Noun: a special folder to hold deleted items"
+ },
+ "searchTrash": {
+ "message": "Search trash"
+ },
+ "permanentlyDeleteItem": {
+ "message": "Permanently Delete Item"
+ },
+ "permanentlyDeleteItemConfirmation": {
+ "message": "Are you sure you want to permanently delete this item?"
+ },
+ "permanentlyDeletedItem": {
+ "message": "Permanently Deleted item"
+ },
+ "restoreItem": {
+ "message": "Restore Item"
+ },
+ "restoreItemConfirmation": {
+ "message": "Are you sure you want to restore this item?"
+ },
+ "restoredItem": {
+ "message": "Restored Item"
+ },
+ "vaultTimeoutLogOutConfirmation": {
+ "message": "Logging out will remove all access to your vault and requires online authentication after the timeout period. Are you sure you want to use this setting?"
+ },
+ "vaultTimeoutLogOutConfirmationTitle": {
+ "message": "Timeout Action Confirmation"
+ },
+ "autoFillAndSave": {
+ "message": "Auto-fill and Save"
+ },
+ "autoFillSuccessAndSavedUri": {
+ "message": "Auto-filled Item and Saved URI"
+ },
+ "autoFillSuccess": {
+ "message": "Auto-filled Item"
+ },
+ "setMasterPassword": {
+ "message": "Set Master Password"
+ },
+ "masterPasswordPolicyInEffect": {
+ "message": "One or more organization policies require your master password to meet the following requirements:"
+ },
+ "policyInEffectMinComplexity": {
+ "message": "Minimum complexity score of $SCORE$",
+ "placeholders": {
+ "score": {
+ "content": "$1",
+ "example": "4"
+ }
+ }
+ },
+ "policyInEffectMinLength": {
+ "message": "Minimum length of $LENGTH$",
+ "placeholders": {
+ "length": {
+ "content": "$1",
+ "example": "14"
+ }
+ }
+ },
+ "policyInEffectUppercase": {
+ "message": "Contain one or more uppercase characters"
+ },
+ "policyInEffectLowercase": {
+ "message": "Contain one or more lowercase characters"
+ },
+ "policyInEffectNumbers": {
+ "message": "Contain one or more numbers"
+ },
+ "policyInEffectSpecial": {
+ "message": "Contain one or more of the following special characters $CHARS$",
+ "placeholders": {
+ "chars": {
+ "content": "$1",
+ "example": "!@#$%^&*"
+ }
+ }
+ },
+ "masterPasswordPolicyRequirementsNotMet": {
+ "message": "Your new master password does not meet the policy requirements."
+ },
+ "acceptPolicies": {
+ "message": "By checking this box you agree to the following:"
+ },
+ "acceptPoliciesError": {
+ "message": "Terms of Service and Privacy Policy have not been acknowledged."
+ },
+ "termsOfService": {
+ "message": "Terms of Service"
+ },
+ "privacyPolicy": {
+ "message": "Privacy Policy"
+ },
+ "hintEqualsPassword": {
+ "message": "Your password hint cannot be the same as your password."
+ },
+ "ok": {
+ "message": "Ok"
+ },
+ "desktopSyncVerificationTitle": {
+ "message": "Desktop sync verification"
+ },
+ "desktopIntegrationVerificationText": {
+ "message": "Please verify that the desktop application shows this fingerprint: "
+ },
+ "desktopIntegrationDisabledTitle": {
+ "message": "Browser integration is not enabled"
+ },
+ "desktopIntegrationDisabledDesc": {
+ "message": "Browser integration is not enabled in the Bitwarden Desktop application. Please enable it in the settings within the desktop application."
+ },
+ "startDesktopTitle": {
+ "message": "Start the Bitwarden Desktop application"
+ },
+ "startDesktopDesc": {
+ "message": "The Bitwarden Desktop application needs to be started before this function can be used."
+ },
+ "errorEnableBiometricTitle": {
+ "message": "Unable to enable biometrics"
+ },
+ "errorEnableBiometricDesc": {
+ "message": "Action was canceled by the desktop application"
+ },
+ "nativeMessagingInvalidEncryptionDesc": {
+ "message": "Desktop application invalidated the secure communication channel. Please retry this operation"
+ },
+ "nativeMessagingInvalidEncryptionTitle": {
+ "message": "Desktop communication interrupted"
+ },
+ "nativeMessagingWrongUserDesc": {
+ "message": "The desktop application is logged into a different account. Please ensure both applications are logged into the same account."
+ },
+ "nativeMessagingWrongUserTitle": {
+ "message": "Account missmatch"
+ },
+ "biometricsNotEnabledTitle": {
+ "message": "Biometrics not enabled"
+ },
+ "biometricsNotEnabledDesc": {
+ "message": "Browser biometrics requires desktop biometric to be enabled in the settings first."
+ },
+ "biometricsNotSupportedTitle": {
+ "message": "Biometrics not supported"
+ },
+ "biometricsNotSupportedDesc": {
+ "message": "Browser biometrics is not supported on this device."
+ },
+ "nativeMessaginPermissionErrorTitle": {
+ "message": "Permission not provided"
+ },
+ "nativeMessaginPermissionErrorDesc": {
+ "message": "Without permission to communicate with the Bitwarden Desktop Application we cannot provide biometrics in the browser extension. Please try again."
+ },
+ "nativeMessaginPermissionSidebarTitle": {
+ "message": "Permission request error"
+ },
+ "nativeMessaginPermissionSidebarDesc": {
+ "message": "This action cannot be done in the sidebar, please retry the action in the popup or popout."
+ },
+ "personalOwnershipSubmitError": {
+ "message": "Due to an Enterprise Policy, you are restricted from saving items to your personal vault. Change the Ownership option to an organization and choose from available Collections."
+ },
+ "personalOwnershipPolicyInEffect": {
+ "message": "An organization policy is affecting your ownership options."
+ },
+ "excludedDomains": {
+ "message": "Excluded Domains"
+ },
+ "excludedDomainsDesc": {
+ "message": "Bitwarden will not ask to save login details for these domains. You must refresh the page for changes to take effect."
+ },
+ "excludedDomainsInvalidDomain": {
+ "message": "$DOMAIN$ is not a valid domain",
+ "placeholders": {
+ "domain": {
+ "content": "$1",
+ "example": "googlecom"
+ }
+ }
+ },
+ "send": {
+ "message": "Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "searchSends": {
+ "message": "Search Sends",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "addSend": {
+ "message": "Add Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTypeText": {
+ "message": "Text"
+ },
+ "sendTypeFile": {
+ "message": "File"
+ },
+ "allSends": {
+ "message": "All Sends",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "maxAccessCountReached": {
+ "message": "Max access count reached"
+ },
+ "expired": {
+ "message": "Expired"
+ },
+ "pendingDeletion": {
+ "message": "Pending deletion"
+ },
+ "passwordProtected": {
+ "message": "Password protected"
+ },
+ "copySendLink": {
+ "message": "Copy Send link",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "removePassword": {
+ "message": "Remove Password"
+ },
+ "delete": {
+ "message": "Delete"
+ },
+ "removedPassword": {
+ "message": "Removed Password"
+ },
+ "deletedSend": {
+ "message": "Deleted Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendLink": {
+ "message": "Send link",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "disabled": {
+ "message": "Disabled"
+ },
+ "removePasswordConfirmation": {
+ "message": "Are you sure you want to remove the password?"
+ },
+ "deleteSend": {
+ "message": "Delete Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "deleteSendConfirmation": {
+ "message": "Are you sure you want to delete this Send?",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "editSend": {
+ "message": "Edit Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTypeHeader": {
+ "message": "What type of Send is this?",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendNameDesc": {
+ "message": "A friendly name to describe this Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendFileDesc": {
+ "message": "The file you want to send."
+ },
+ "deletionDate": {
+ "message": "Deletion Date"
+ },
+ "deletionDateDesc": {
+ "message": "The Send will be permanently deleted on the specified date and time.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "expirationDate": {
+ "message": "Expiration Date"
+ },
+ "expirationDateDesc": {
+ "message": "If set, access to this Send will expire on the specified date and time.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "oneDay": {
+ "message": "1 day"
+ },
+ "days": {
+ "message": "$DAYS$ days",
+ "placeholders": {
+ "days": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "custom": {
+ "message": "Custom"
+ },
+ "maximumAccessCount": {
+ "message": "Maximum Access Count"
+ },
+ "maximumAccessCountDesc": {
+ "message": "If set, users will no longer be able to access this Send once the maximum access count is reached.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendPasswordDesc": {
+ "message": "Optionally require a password for users to access this Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendNotesDesc": {
+ "message": "Private notes about this Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendDisableDesc": {
+ "message": "Disable this Send so that no one can access it.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendShareDesc": {
+ "message": "Copy this Send's link to clipboard upon save.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTextDesc": {
+ "message": "The text you want to send."
+ },
+ "sendHideText": {
+ "message": "Hide this Send's text by default.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "currentAccessCount": {
+ "message": "Current Access Count"
+ },
+ "createSend": {
+ "message": "Create New Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "newPassword": {
+ "message": "New Password"
+ },
+ "sendDisabled": {
+ "message": "Send Disabled",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendDisabledWarning": {
+ "message": "Due to an enterprise policy, you are only able to delete an existing Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "createdSend": {
+ "message": "Created Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "editedSend": {
+ "message": "Edited Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendLinuxChromiumFileWarning": {
+ "message": "In order to choose a file, open the extension in the sidebar (if possible) or pop out to a new window by clicking this banner."
+ },
+ "sendFirefoxFileWarning": {
+ "message": "In order to choose a file using Firefox, open the extension in the sidebar or pop out to a new window by clicking this banner."
+ },
+ "sendSafariFileWarning": {
+ "message": "In order to choose a file using Safari, pop out to a new window by clicking this banner."
+ },
+ "sendFileCalloutHeader": {
+ "message": "Before you start"
+ },
+ "sendFirefoxCustomDatePopoutMessage1": {
+ "message": "To use a calendar style date picker",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read '**To use a calendar style date picker ** click here to pop out your window.'"
+ },
+ "sendFirefoxCustomDatePopoutMessage2": {
+ "message": "click here",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker **click here** to pop out your window.'"
+ },
+ "sendFirefoxCustomDatePopoutMessage3": {
+ "message": "to pop out your window.",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker click here **to pop out your window.**'"
+ },
+ "expirationDateIsInvalid": {
+ "message": "The expiration date provided is not valid."
+ },
+ "deletionDateIsInvalid": {
+ "message": "The deletion date provided is not valid."
+ },
+ "expirationDateAndTimeRequired": {
+ "message": "An expiration date and time are required."
+ },
+ "deletionDateAndTimeRequired": {
+ "message": "A deletion date and time are required."
+ },
+ "dateParsingError": {
+ "message": "There was an error saving your deletion and expiration dates."
+ },
+ "hideEmail": {
+ "message": "Hide my email address from recipients."
+ },
+ "sendOptionsPolicyInEffect": {
+ "message": "One or more organization policies are affecting your Send options."
+ },
+ "passwordPrompt": {
+ "message": "Master password re-prompt"
+ },
+ "passwordConfirmation": {
+ "message": "Master password confirmation"
+ },
+ "passwordConfirmationDesc": {
+ "message": "This action is protected. To continue, please re-enter your master password to verify your identity."
+ },
+ "emailVerificationRequired": {
+ "message": "Email Verification Required"
+ },
+ "emailVerificationRequiredDesc": {
+ "message": "You must verify your email to use this feature. You can verify your email in the web vault."
+ },
+ "updatedMasterPassword": {
+ "message": "Updated Master Password"
+ },
+ "updateMasterPassword": {
+ "message": "Update Master Password"
+ },
+ "updateMasterPasswordWarning": {
+ "message": "Your Master Password was recently changed by an administrator in your organization. In order to access the vault, you must update it now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour."
+ },
+ "resetPasswordPolicyAutoEnroll": {
+ "message": "Automatic Enrollment"
+ },
+ "resetPasswordAutoEnrollInviteWarning": {
+ "message": "This organization has an enterprise policy that will automatically enroll you in password reset. Enrollment will allow organization administrators to change your master password."
+ },
+ "selectFolder": {
+ "message": "Select folder..."
+ },
+ "ssoCompleteRegistration": {
+ "message": "In order to complete logging in with SSO, please set a master password to access and protect your vault."
+ },
+ "hours": {
+ "message": "Hours"
+ },
+ "minutes": {
+ "message": "Minutes"
+ },
+ "vaultTimeoutPolicyInEffect": {
+ "message": "Your organization policies are affecting your vault timeout. Maximum allowed Vault Timeout is $HOURS$ hour(s) and $MINUTES$ minute(s)",
+ "placeholders": {
+ "hours": {
+ "content": "$1",
+ "example": "5"
+ },
+ "minutes": {
+ "content": "$2",
+ "example": "5"
+ }
+ }
+ },
+ "vaultTimeoutToLarge": {
+ "message": "Your vault timeout exceeds the restrictions set by your organization."
+ },
+ "vaultExportDisabled": {
+ "message": "Vault Export Disabled"
+ },
+ "personalVaultExportPolicyInEffect": {
+ "message": "One or more organization policies prevents you from exporting your personal vault."
+ },
+ "copyCustomFieldNameInvalidElement": {
+ "message": "Unable to identify a valid form element. Try inspecting the HTML instead."
+ },
+ "copyCustomFieldNameNotUnique": {
+ "message": "No unique identifier found."
+ }
+}
diff --git a/src/iOS.Safari/Resources/_locales/tr/messages.json b/src/iOS.Safari/Resources/_locales/tr/messages.json
new file mode 100644
index 000000000..6e9a4cbac
--- /dev/null
+++ b/src/iOS.Safari/Resources/_locales/tr/messages.json
@@ -0,0 +1,1817 @@
+{
+ "appName": {
+ "message": "Bitwarden"
+ },
+ "extName": {
+ "message": "Bitwarden - Ücretsiz Parola Yöneticisi",
+ "description": "Extension name, MUST be less than 40 characters (Safari restriction)"
+ },
+ "extDesc": {
+ "message": "Tüm cihazlarınız için güvenli ve ücretsiz bir parola yöneticisi.",
+ "description": "Extension description"
+ },
+ "loginOrCreateNewAccount": {
+ "message": "Güvenli kasanıza ulaşmak için giriş yapın veya yeni bir hesap oluşturun."
+ },
+ "createAccount": {
+ "message": "Hesap oluştur"
+ },
+ "login": {
+ "message": "Giriş yap"
+ },
+ "enterpriseSingleSignOn": {
+ "message": "Kurumsal tek oturum açma (SSO)"
+ },
+ "cancel": {
+ "message": "İptal"
+ },
+ "close": {
+ "message": "Kapat"
+ },
+ "submit": {
+ "message": "Gönder"
+ },
+ "emailAddress": {
+ "message": "E-posta adresi"
+ },
+ "masterPass": {
+ "message": "Ana parola"
+ },
+ "masterPassDesc": {
+ "message": "Ana parola, kasanıza ulaşmak için kullanacağınız paroladır. Ana parolanızı unutmamanız çok önemlidir. Unutursanız parolalarınızı asla kurtaramazsınız."
+ },
+ "masterPassHintDesc": {
+ "message": "Ana parolanızı unutursanız bu ipucuna bakınca size ana parolanızı hatırlatacak bir şey yazabilirsiniz."
+ },
+ "reTypeMasterPass": {
+ "message": "Ana parolayı tekrar yazın"
+ },
+ "masterPassHint": {
+ "message": "Ana Parola İpucu (isteğe bağlı)"
+ },
+ "tab": {
+ "message": "Sekme"
+ },
+ "myVault": {
+ "message": "Kasam"
+ },
+ "tools": {
+ "message": "Araçlar"
+ },
+ "settings": {
+ "message": "Ayarlar"
+ },
+ "currentTab": {
+ "message": "Geçerli sekme"
+ },
+ "copyPassword": {
+ "message": "Parolayı kopyala"
+ },
+ "copyNote": {
+ "message": "Notu kopyala"
+ },
+ "copyUri": {
+ "message": "Linki Kopyala"
+ },
+ "copyUsername": {
+ "message": "Kullanıcı adını kopyala"
+ },
+ "copyNumber": {
+ "message": "Numarayı kopyala"
+ },
+ "copySecurityCode": {
+ "message": "Güvenlik kodunu kopyala"
+ },
+ "autoFill": {
+ "message": "Otomatik doldur"
+ },
+ "generatePasswordCopied": {
+ "message": "Parola oluştur (ve kopyala)"
+ },
+ "copyElementIdentifier": {
+ "message": "Özel alan adını kopyala"
+ },
+ "noMatchingLogins": {
+ "message": "Eşleşen hesap yok."
+ },
+ "vaultLocked": {
+ "message": "Kasa kilitli."
+ },
+ "vaultLoggedOut": {
+ "message": "Kasadan çıkış yaptınız."
+ },
+ "autoFillInfo": {
+ "message": "Mevcut sekme için otomatik doldurulacak giriş bilgisi bulunmuyor."
+ },
+ "addLogin": {
+ "message": "Hesap ekle"
+ },
+ "addItem": {
+ "message": "Kayıt ekle"
+ },
+ "passwordHint": {
+ "message": "Parola ipucu"
+ },
+ "enterEmailToGetHint": {
+ "message": "Ana parola ipucunu almak için hesabınızın e-posta adresini girin."
+ },
+ "getMasterPasswordHint": {
+ "message": "Ana parola ipucunu al"
+ },
+ "continue": {
+ "message": "Devam"
+ },
+ "verificationCode": {
+ "message": "Doğrulama kodu"
+ },
+ "account": {
+ "message": "Hesap"
+ },
+ "changeMasterPassword": {
+ "message": "Ana parolayı değiştir"
+ },
+ "fingerprintPhrase": {
+ "message": "Parmak izi ifadesi",
+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
+ },
+ "yourAccountsFingerprint": {
+ "message": "Hesabınızın parmak izi ifadesi",
+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
+ },
+ "twoStepLogin": {
+ "message": "İki aşamalı giriş"
+ },
+ "logOut": {
+ "message": "Çıkış yap"
+ },
+ "about": {
+ "message": "Hakkında"
+ },
+ "version": {
+ "message": "Sürüm"
+ },
+ "save": {
+ "message": "Kaydet"
+ },
+ "move": {
+ "message": "Taşı"
+ },
+ "addFolder": {
+ "message": "Klasör ekle"
+ },
+ "name": {
+ "message": "Ad"
+ },
+ "editFolder": {
+ "message": "Klasörü düzenle"
+ },
+ "deleteFolder": {
+ "message": "Klasörü sil"
+ },
+ "folders": {
+ "message": "Klasörler"
+ },
+ "noFolders": {
+ "message": "Listelenecek klasör yok."
+ },
+ "helpFeedback": {
+ "message": "Yardım ve geribildirim"
+ },
+ "sync": {
+ "message": "Eşitle"
+ },
+ "syncVaultNow": {
+ "message": "Kasayı şimdi eşitle"
+ },
+ "lastSync": {
+ "message": "Son eşitleme:"
+ },
+ "passGen": {
+ "message": "Parola Oluşturucu"
+ },
+ "generator": {
+ "message": "Oluşturucu",
+ "description": "Short for 'Password Generator'."
+ },
+ "passGenInfo": {
+ "message": "Hesaplarınız için otomatik olarak güçlü, özgün parolalar oluşturun."
+ },
+ "bitWebVault": {
+ "message": "Bitwarden web kasası"
+ },
+ "importItems": {
+ "message": "Hesapları içe aktar"
+ },
+ "select": {
+ "message": "Seç"
+ },
+ "generatePassword": {
+ "message": "Parola oluştur"
+ },
+ "regeneratePassword": {
+ "message": "Yeni parola oluştur"
+ },
+ "options": {
+ "message": "Seçenekler"
+ },
+ "length": {
+ "message": "Uzunluk"
+ },
+ "numWords": {
+ "message": "Kelime sayısı"
+ },
+ "wordSeparator": {
+ "message": "Kelime ayracı"
+ },
+ "capitalize": {
+ "message": "Baş harfleri büyük yap",
+ "description": "Make the first letter of a work uppercase."
+ },
+ "includeNumber": {
+ "message": "Rakam ekle"
+ },
+ "minNumbers": {
+ "message": "En az rakam"
+ },
+ "minSpecial": {
+ "message": "En az özel karakter"
+ },
+ "avoidAmbChar": {
+ "message": "Okurken karışabilecek karakterleri kullanma"
+ },
+ "searchVault": {
+ "message": "Kasada ara"
+ },
+ "edit": {
+ "message": "Düzenle"
+ },
+ "view": {
+ "message": "Görüntüle"
+ },
+ "noItemsInList": {
+ "message": "Listelenecek kayıt yok."
+ },
+ "itemInformation": {
+ "message": "Hesap Bilgileri"
+ },
+ "username": {
+ "message": "Kullanıcı adı"
+ },
+ "password": {
+ "message": "Parola"
+ },
+ "passphrase": {
+ "message": "Uzun söz"
+ },
+ "favorite": {
+ "message": "Favori"
+ },
+ "notes": {
+ "message": "Notlar"
+ },
+ "note": {
+ "message": "Not"
+ },
+ "editItem": {
+ "message": "Kaydı düzenle"
+ },
+ "folder": {
+ "message": "Klasör"
+ },
+ "deleteItem": {
+ "message": "Kaydı sil"
+ },
+ "viewItem": {
+ "message": "Kaydı göster"
+ },
+ "launch": {
+ "message": "Aç"
+ },
+ "website": {
+ "message": "Web sitesi"
+ },
+ "toggleVisibility": {
+ "message": "Görünürlüğünü aç/kapat"
+ },
+ "manage": {
+ "message": "Yönet"
+ },
+ "other": {
+ "message": "Diğer"
+ },
+ "rateExtension": {
+ "message": "Uzantıyı değerlendirin"
+ },
+ "rateExtensionDesc": {
+ "message": "İyi bir yorum yazarak bizi destekleyebilirsiniz."
+ },
+ "browserNotSupportClipboard": {
+ "message": "Web tarayıcınız panoya kopyalamayı desteklemiyor. Parolayı elle kopyalayın."
+ },
+ "verifyMasterPassword": {
+ "message": "Ana parolayı doğrulayın"
+ },
+ "yourVaultIsLocked": {
+ "message": "Kasanız kilitli. Devam etmek için ana parolanızı doğrulayın."
+ },
+ "unlock": {
+ "message": "Kilidi aç"
+ },
+ "loggedInAsOn": {
+ "message": "$HOSTNAME$ üzerinde $EMAIL$ adresiyle oturum açtınız.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "name@example.com"
+ },
+ "hostname": {
+ "content": "$2",
+ "example": "bitwarden.com"
+ }
+ }
+ },
+ "invalidMasterPassword": {
+ "message": "Geçersiz ana parola"
+ },
+ "vaultTimeout": {
+ "message": "Kasa zaman aşımı"
+ },
+ "lockNow": {
+ "message": "Şimdi kilitle"
+ },
+ "immediately": {
+ "message": "Hemen"
+ },
+ "tenSeconds": {
+ "message": "10 saniye"
+ },
+ "twentySeconds": {
+ "message": "20 saniye"
+ },
+ "thirtySeconds": {
+ "message": "30 saniye"
+ },
+ "oneMinute": {
+ "message": "1 dakika"
+ },
+ "twoMinutes": {
+ "message": "2 dakika"
+ },
+ "fiveMinutes": {
+ "message": "5 dakika"
+ },
+ "fifteenMinutes": {
+ "message": "15 dakika"
+ },
+ "thirtyMinutes": {
+ "message": "30 dakika"
+ },
+ "oneHour": {
+ "message": "1 saat"
+ },
+ "fourHours": {
+ "message": "4 saat"
+ },
+ "onLocked": {
+ "message": "Sistem kilitlenince"
+ },
+ "onRestart": {
+ "message": "Tarayıcı yeniden başlatılınca"
+ },
+ "never": {
+ "message": "Asla"
+ },
+ "security": {
+ "message": "Güvenlik"
+ },
+ "errorOccurred": {
+ "message": "Bir hata oluştu"
+ },
+ "emailRequired": {
+ "message": "E-posta adresi gereklidir."
+ },
+ "invalidEmail": {
+ "message": "Geçersiz e-posta adresi."
+ },
+ "masterPassRequired": {
+ "message": "Ana parola gereklidir."
+ },
+ "masterPassLength": {
+ "message": "Ana parola en az 8 karakter uzunluğunda olmalıdır."
+ },
+ "masterPassDoesntMatch": {
+ "message": "Ana parola onayı eşleşmiyor."
+ },
+ "newAccountCreated": {
+ "message": "Yeni hesabınız oluşturuldu! Şimdi giriş yapabilirsiniz."
+ },
+ "masterPassSent": {
+ "message": "Size ana parolanızın ipucunu içeren bir e-posta gönderdik."
+ },
+ "verificationCodeRequired": {
+ "message": "Doğrulama kodu gereklidir."
+ },
+ "valueCopied": {
+ "message": "$VALUE$ kopyalandı",
+ "description": "Value has been copied to the clipboard.",
+ "placeholders": {
+ "value": {
+ "content": "$1",
+ "example": "Password"
+ }
+ }
+ },
+ "autofillError": {
+ "message": "Seçilen hesap bu sayfada otomatik olarak doldurulamadı. Lütfen bilgileri elle kopyalayıp yapıştırın."
+ },
+ "loggedOut": {
+ "message": "Çıkış yapıldı"
+ },
+ "loginExpired": {
+ "message": "Oturumunuz zaman aşımına uğradı."
+ },
+ "logOutConfirmation": {
+ "message": "Çıkış yapmak istediğinize emin misiniz?"
+ },
+ "yes": {
+ "message": "Evet"
+ },
+ "no": {
+ "message": "Hayır"
+ },
+ "unexpectedError": {
+ "message": "Beklenmedik bir hata oluştu."
+ },
+ "nameRequired": {
+ "message": "Ad gereklidir."
+ },
+ "addedFolder": {
+ "message": "Klasör eklendi"
+ },
+ "changeMasterPass": {
+ "message": "Ana parolayı değiştir"
+ },
+ "changeMasterPasswordConfirmation": {
+ "message": "Ana parolanızı bitwarden.com web kasası üzerinden değiştirebilirsiniz. Siteye gitmek ister misiniz?"
+ },
+ "twoStepLoginConfirmation": {
+ "message": "İki aşamalı giriş, hesabınıza girererken işlemi bir güvenlik anahtarı, şifrematik uygulaması, SMS, telefon araması veya e-posta gibi ek bir yöntemle doğrulamanızı isteyerek hesabınızın güvenliğini artırır. İki aşamalı giriş özelliğini bitwarden.com web kasası üzerinden etkinleştirebilirsiniz. Şimdi siteye gitmek ister misiniz?"
+ },
+ "editedFolder": {
+ "message": "Klasör düzenlendi"
+ },
+ "deleteFolderConfirmation": {
+ "message": "Bu klasörü silmek istediğinizden emin misiniz?"
+ },
+ "deletedFolder": {
+ "message": "Klasör silindi"
+ },
+ "gettingStartedTutorial": {
+ "message": "Başlangıç Rehberi"
+ },
+ "gettingStartedTutorialVideo": {
+ "message": "Tarayıcı uzantımızdan en iyi şekilde yararlanmayı öğrenmek için başlangıç eğitimimizi izleyebilirsiniz."
+ },
+ "syncingComplete": {
+ "message": "Eşitleme tamamlandı"
+ },
+ "syncingFailed": {
+ "message": "Eşitleme başarısız"
+ },
+ "passwordCopied": {
+ "message": "Parola kopyalandı"
+ },
+ "uri": {
+ "message": "URl"
+ },
+ "uriPosition": {
+ "message": "URL $POSITION$",
+ "description": "A listing of URIs. Ex: URI 1, URI 2, URI 3, etc.",
+ "placeholders": {
+ "position": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "newUri": {
+ "message": "Yeni URI"
+ },
+ "addedItem": {
+ "message": "Kayıt eklendi"
+ },
+ "editedItem": {
+ "message": "Kayıt düzenlendi"
+ },
+ "deleteItemConfirmation": {
+ "message": "Bu kaydı çöp kutusuna göndermek istediğinizden emin misiniz?"
+ },
+ "deletedItem": {
+ "message": "Kayıt çöp kutusuna gönderildi"
+ },
+ "overwritePassword": {
+ "message": "Parolanın üzerine yaz"
+ },
+ "overwritePasswordConfirmation": {
+ "message": "Mevcut parolanın üzerine kaydetmek istediğinize emin misiniz?"
+ },
+ "searchFolder": {
+ "message": "Klasörde ara"
+ },
+ "searchCollection": {
+ "message": "Koleksiyonda ara"
+ },
+ "searchType": {
+ "message": "Arama türü"
+ },
+ "noneFolder": {
+ "message": "Klasör yok",
+ "description": "This is the folder for uncategorized items"
+ },
+ "disableAddLoginNotification": {
+ "message": "\"Hesap ekle\" bildirimini kapat"
+ },
+ "addLoginNotificationDesc": {
+ "message": "\"Hesap ekle\" bildirimi, ilk kez kullandığınız hesap bilgilerini kasanıza kaydetmek isteyip istemediğinizi otomatik olarak sorar."
+ },
+ "dontShowCardsCurrentTab": {
+ "message": "Sekme sayfasında kartları gösterme"
+ },
+ "dontShowCardsCurrentTabDesc": {
+ "message": "Kasanızdaki banka/kredi kartları, otomatik doldurmayı kolaylaştırmak için \"geçerli sekme\" sayfasında listelenir."
+ },
+ "dontShowIdentitiesCurrentTab": {
+ "message": "Sekme sayfasında kimlikleri gösterme"
+ },
+ "dontShowIdentitiesCurrentTabDesc": {
+ "message": "Kasanızdaki kimlik kayıtları, otomatik doldurmayı kolaylaştırmak için \"geçerli sekme\" sayfasında listelenir."
+ },
+ "clearClipboard": {
+ "message": "Panoyu temizle",
+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
+ },
+ "clearClipboardDesc": {
+ "message": "Kopyalanan değerleri otomatik olarak panodan sil.",
+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
+ },
+ "notificationAddDesc": {
+ "message": "Bitwarden bu parolayı sizin için hatırlasın mı?"
+ },
+ "notificationAddSave": {
+ "message": "Evet, parolayı kaydet"
+ },
+ "notificationNeverSave": {
+ "message": "Bu sitede asla kaydetme"
+ },
+ "disableChangedPasswordNotification": {
+ "message": "\"Parola değiştirildi\" bildirimini kapat"
+ },
+ "disableChangedPasswordNotificationDesc": {
+ "message": "\"Parola değiştirildi\" bildirimi, bir web sitesindeki parolanızı değiştirdiğiniz algılanınca otomatik olarak kasanızda kayıtlı parolayı güncellemenizi sağlar."
+ },
+ "notificationChangeDesc": {
+ "message": "Bu parolayı Bitwarden'da güncellemek ister misiniz?"
+ },
+ "notificationChangeSave": {
+ "message": "Evet, güncelle"
+ },
+ "disableContextMenuItem": {
+ "message": "Sağ tıklama menüsünü kapat"
+ },
+ "disableContextMenuItemDesc": {
+ "message": "Sağ tıklama menüsü, parola oluşturma aracına ve açık sekmeye ait hesaplara hızlı erişim sağlar."
+ },
+ "defaultUriMatchDetection": {
+ "message": "Varsayılan URI eşleşme tespiti",
+ "description": "Default URI match detection for auto-fill."
+ },
+ "defaultUriMatchDetectionDesc": {
+ "message": "Otomatik doldurma gibi eylemler gerçekleştirilirken hesaplar için URI eşleşme tespitinin nasıl yapılacağını seçin."
+ },
+ "theme": {
+ "message": "Tema"
+ },
+ "themeDesc": {
+ "message": "Uygulamanın renk temasını değiştir."
+ },
+ "dark": {
+ "message": "Koyu",
+ "description": "Dark color"
+ },
+ "light": {
+ "message": "Açık",
+ "description": "Light color"
+ },
+ "solarizedDark": {
+ "message": "Solarized koyu",
+ "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated."
+ },
+ "exportVault": {
+ "message": "Kasayı dışa aktar"
+ },
+ "fileFormat": {
+ "message": "Dosya biçimi"
+ },
+ "warning": {
+ "message": "UYARI",
+ "description": "WARNING (should stay in capitalized letters if the language permits)"
+ },
+ "confirmVaultExport": {
+ "message": "Kasayı Dışa Aktarmayı Onayla"
+ },
+ "exportWarningDesc": {
+ "message": "Dışa aktarılan dosyadaki verileriniz şifrelenmemiş olacak. Bu dosyayı güvensiz yöntemlerle (örn. e-posta) göndermemeli ve saklamamalısınız. İşiniz bittikten sonra dosyayı hemen silin."
+ },
+ "encExportKeyWarningDesc": {
+ "message": "Dışa aktardığınız bu dosyadaki verileriniz, hesabınızın şifreleme anahtarıyla şifrelenir. Hesabınızın şifreleme anahtarını değiştirirseniz bu dosyanın şifresi çözülemez hale gelir, dolayısıyla dosyayı yeniden dışa aktarmanız gerekir."
+ },
+ "encExportAccountWarningDesc": {
+ "message": "Her Bitwarden kullanıcı hesabının hesap şifreleme anahtarları farklıdır. Yani şifrelenmiş bir dışa aktarmayı farklı bir hesapta içe aktaramazsınız."
+ },
+ "exportMasterPassword": {
+ "message": "Kasadaki verilerinizi dışa aktarmak için ana parolanızı girin."
+ },
+ "shared": {
+ "message": "Paylaşılan"
+ },
+ "learnOrg": {
+ "message": "Kuruluşlar hakkında bilgi al"
+ },
+ "learnOrgConfirmation": {
+ "message": "Bitwarden'ın kuruluş özelliğini kullanarak kasanızdaki kayıtları başkalarıyla paylaşabilirsiniz. Daha fazla bilgi için bitwarden.com sitesini ziyaret etmek ister misiniz?"
+ },
+ "moveToOrganization": {
+ "message": "Kuruluşa taşı"
+ },
+ "share": {
+ "message": "Paylaş"
+ },
+ "movedItemToOrg": {
+ "message": "$ITEMNAME$ $ORGNAME$ kuruluşuna taşındı",
+ "placeholders": {
+ "itemname": {
+ "content": "$1",
+ "example": "Secret Item"
+ },
+ "orgname": {
+ "content": "$2",
+ "example": "Company Name"
+ }
+ }
+ },
+ "moveToOrgDesc": {
+ "message": "Bu kaydı taşımak istediğiniz kuruluşu seçin. Taşıdığınız kaydın sahipliği seçtiğiniz kuruluşa aktarılacak. Artık bu kaydın doğrudan sahibi olmayacaksınız."
+ },
+ "learnMore": {
+ "message": "Daha fazla bilgi al"
+ },
+ "authenticatorKeyTotp": {
+ "message": "Kimlik doğrulama anahtarı (TOTP)"
+ },
+ "verificationCodeTotp": {
+ "message": "Doğrulama kodu (TOTP)"
+ },
+ "copyVerificationCode": {
+ "message": "Doğrulama kodunu kopyala"
+ },
+ "attachments": {
+ "message": "Ekler"
+ },
+ "deleteAttachment": {
+ "message": "Eki sil"
+ },
+ "deleteAttachmentConfirmation": {
+ "message": "Bu eki silmek istediğinize emin misiniz?"
+ },
+ "deletedAttachment": {
+ "message": "Ek silindi"
+ },
+ "newAttachment": {
+ "message": "Yeni dosya ekle"
+ },
+ "noAttachments": {
+ "message": "Ek yok."
+ },
+ "attachmentSaved": {
+ "message": "Dosya kaydedildi."
+ },
+ "file": {
+ "message": "Dosya"
+ },
+ "selectFile": {
+ "message": "Bir dosya seçin."
+ },
+ "maxFileSize": {
+ "message": "Maksimum dosya boyutu 500 MB'dir."
+ },
+ "featureUnavailable": {
+ "message": "Özellik kullanılamıyor"
+ },
+ "updateKey": {
+ "message": "Şifreleme anahtarınızı güncellemeden bu özelliği kullanamazsınız."
+ },
+ "premiumMembership": {
+ "message": "Premium üyelik"
+ },
+ "premiumManage": {
+ "message": "Üyeliğimi yönet"
+ },
+ "premiumManageAlert": {
+ "message": "Üyeliğinizi bitwarden.com web kasası üzerinden yönetebilirsiniz. Şimdi siteye gitmek ister misiniz?"
+ },
+ "premiumRefresh": {
+ "message": "Üyeliğimi yenile"
+ },
+ "premiumNotCurrentMember": {
+ "message": "Şu anda premium üye değilsiniz."
+ },
+ "premiumSignUpAndGet": {
+ "message": "Premium üye olarak sahip olacağınız avantajlar:"
+ },
+ "ppremiumSignUpStorage": {
+ "message": "Dosya ekleri için 1 GB şifrelenmiş depolama."
+ },
+ "ppremiumSignUpTwoStep": {
+ "message": "YubiKey, FIDO U2F ve Duo gibi iki aşamalı giriş seçenekleri."
+ },
+ "ppremiumSignUpReports": {
+ "message": "Kasanızı güvende tutmak için parola hijyeni, hesap sağlığı ve veri ihlali raporları."
+ },
+ "ppremiumSignUpTotp": {
+ "message": "Kasanızdaki hesaplar için TOTP doğrulama kodu (2FA) oluşturucu."
+ },
+ "ppremiumSignUpSupport": {
+ "message": "Öncelikli müşteri desteği."
+ },
+ "ppremiumSignUpFuture": {
+ "message": "Ve ileride duyuracağımız tüm premium özellikler. Daha fazlası yakında!"
+ },
+ "premiumPurchase": {
+ "message": "Premium satın al"
+ },
+ "premiumPurchaseAlert": {
+ "message": "Premium üyeliği bitwarden.com web kasası üzerinden satın alabilirsiniz. Şimdi siteye gitmek ister misiniz?"
+ },
+ "premiumCurrentMember": {
+ "message": "Premium üyesiniz!"
+ },
+ "premiumCurrentMemberThanks": {
+ "message": "Bitwarden'ı desteklediğiniz için teşekkür ederiz."
+ },
+ "premiumPrice": {
+ "message": "Bunların hepsi sadece yılda $PRICE$!",
+ "placeholders": {
+ "price": {
+ "content": "$1",
+ "example": "$10"
+ }
+ }
+ },
+ "refreshComplete": {
+ "message": "Yenileme tamamlandı"
+ },
+ "disableAutoTotpCopy": {
+ "message": "Otomatik TOTP kopyalamayı kapat"
+ },
+ "disableAutoTotpCopyDesc": {
+ "message": "Hesabınıza bağlı bir kimlik doğrulama anahtarı varsa giriş bilgilerini otomatik olarak doldurduğunuzda TOTP doğrulama kodu da otomatik olarak panonuza kopyalanır."
+ },
+ "disableAutoBiometricsPrompt": {
+ "message": "Açılışta biyometri doğrulaması isteme"
+ },
+ "premiumRequired": {
+ "message": "Premium gerekli"
+ },
+ "premiumRequiredDesc": {
+ "message": "Bu özelliği kullanmak için premium üyelik gereklidir."
+ },
+ "enterVerificationCodeApp": {
+ "message": "Kimlik doğrulama uygulamanızdaki 6 haneli doğrulama kodunu girin."
+ },
+ "enterVerificationCodeEmail": {
+ "message": "$EMAIL$ adresine e-postayla gönderdiğimiz 6 haneli doğrulama kodunu girin.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "example@gmail.com"
+ }
+ }
+ },
+ "verificationCodeEmailSent": {
+ "message": "Doğrulama e-postası $EMAIL$ adresine gönderildi.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "example@gmail.com"
+ }
+ }
+ },
+ "rememberMe": {
+ "message": "Beni hatırla"
+ },
+ "sendVerificationCodeEmailAgain": {
+ "message": "Doğrulama kodunu yeniden gönder"
+ },
+ "useAnotherTwoStepMethod": {
+ "message": "Başka bir iki aşamalı giriş yöntemini kullan"
+ },
+ "insertYubiKey": {
+ "message": "YubiKey'i bilgisayarınızın USB portuna takın, ardından düğmesine dokunun."
+ },
+ "insertU2f": {
+ "message": "Güvenlik anahtarınızı bilgisayarınızın USB portuna takın. Düğmesi varsa dokunun."
+ },
+ "webAuthnNewTab": {
+ "message": "WebAuthn iki aşamalı doğrulamayı başlatmak için aşağıdaki düğmeye tıklayın ve açılan sekmedeki yönergeleri takip edin."
+ },
+ "webAuthnNewTabOpen": {
+ "message": "Yeni sekme aç"
+ },
+ "webAuthnAuthenticate": {
+ "message": "WebAutn ile doğrula"
+ },
+ "loginUnavailable": {
+ "message": "Giriş yapılamıyor"
+ },
+ "noTwoStepProviders": {
+ "message": "Bu hesapta iki aşamalı giriş özelliği etkin ama yapılandırdığınız iki aşamalı giriş sağlayıcılarının hiçbiri bu tarayıcıyı desteklemiyor."
+ },
+ "noTwoStepProviders2": {
+ "message": "Lütfen desteklenen bir web tarayıcısı (örn. Chrome) kullanın ve/veya web tarayıcılarında daha iyi desteklenen sağlayıcılar (örn. kimlik doğrulama uygulaması) ekleyin."
+ },
+ "twoStepOptions": {
+ "message": "İki aşamalı giriş seçenekleri"
+ },
+ "recoveryCodeDesc": {
+ "message": "İki aşamalı doğrulama sağlayıcılarınıza ulaşamıyor musunuz? Kurtarma kodunuzu kullanarak hesabınızdaki tüm iki aşamalı giriş sağlayıcılarını devre dışı bırakabilirsiniz."
+ },
+ "recoveryCodeTitle": {
+ "message": "Kurtarma kodu"
+ },
+ "authenticatorAppTitle": {
+ "message": "Kimlik doğrulama uygulaması"
+ },
+ "authenticatorAppDesc": {
+ "message": "Zamana dayalı doğrulama kodları oluşturmak için kimlik doğrulama uygulaması (örn. Authy veya Google Authenticator) kullanın.",
+ "description": "'Authy' and 'Google Authenticator' are product names and should not be translated."
+ },
+ "yubiKeyTitle": {
+ "message": "YubiKey OTP güvenlik anahtarı"
+ },
+ "yubiKeyDesc": {
+ "message": "Hesabınıza erişmek için bir YubiKey kullanın. YubiKey 4, 4 Nano, 4C ve NEO cihazlarıyla çalışır."
+ },
+ "duoDesc": {
+ "message": "Duo Security ile doğrulama için Duo Mobile uygulaması, SMS, telefon araması veya U2F güvenlik anahtarını kullanın.",
+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
+ },
+ "duoOrganizationDesc": {
+ "message": "Kuruluşunuzun Duo Security doğrulaması için Duo Mobile uygulaması, SMS, telefon araması veya U2F güvenlik anahtarını kullanın.",
+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
+ },
+ "webAuthnTitle": {
+ "message": "FIDO2 WebAuthn"
+ },
+ "webAuthnDesc": {
+ "message": "Hesabınıza erişmek için WebAuthn uyumlu bir güvenlik anahtarı kullanın."
+ },
+ "emailTitle": {
+ "message": "E-posta"
+ },
+ "emailDesc": {
+ "message": "Doğrulama kodları e-posta adresinize gönderilecek."
+ },
+ "selfHostedEnvironment": {
+ "message": "Şirket içinde barındırılan ortam"
+ },
+ "selfHostedEnvironmentFooter": {
+ "message": "Kurum içinde barındırılan Bitwarden kurulumunuzun taban URL'sini belirtin."
+ },
+ "customEnvironment": {
+ "message": "Özel ortam"
+ },
+ "customEnvironmentFooter": {
+ "message": "İleri düzey kullanıcılar için. Her hizmetin taban URL'sini bağımsız olarak belirleyebilirsiniz."
+ },
+ "baseUrl": {
+ "message": "Sunucu URL'si"
+ },
+ "apiUrl": {
+ "message": "API sunucu URL'si"
+ },
+ "webVaultUrl": {
+ "message": "Web kasası sunucu URL'si"
+ },
+ "identityUrl": {
+ "message": "Kimlik sunucusu URL'si"
+ },
+ "notificationsUrl": {
+ "message": "Bildirim sunucusu URL'si"
+ },
+ "iconsUrl": {
+ "message": "Simge sunucusu URL'si"
+ },
+ "environmentSaved": {
+ "message": "Ortam URL'leri kaydedildi."
+ },
+ "enableAutoFillOnPageLoad": {
+ "message": "Sayfa yüklendiğinde otomatik doldur"
+ },
+ "enableAutoFillOnPageLoadDesc": {
+ "message": "Sayfa yüklendiğinde giriş formu tespit edilirse otomatik olarak formu doldur."
+ },
+ "experimentalFeature": {
+ "message": "Bu şu anda deneysel bir özelliktir. Kullanımı sizin sorumluluğunuzdadır."
+ },
+ "defaultAutoFillOnPageLoad": {
+ "message": "Hesaplar için varsayılan otomatik doldurma ayarı"
+ },
+ "defaultAutoFillOnPageLoadDesc": {
+ "message": "\"Sayfa yüklendiğinde otomatik doldur\"u açtıktan sonra her hesap için bu özelliği ayrı ayrı açıp kapatabilirsiniz. Bu ayar, özellikle ayarlama yapmadığınız hesaplarda kullanılacak varsayılan ayardır."
+ },
+ "itemAutoFillOnPageLoad": {
+ "message": "Sayfa yüklendiğinde otomatik doldur (seçeneklerde etkinleştirilmişse)"
+ },
+ "autoFillOnPageLoadUseDefault": {
+ "message": "Varsayılan ayarı kullan"
+ },
+ "autoFillOnPageLoadYes": {
+ "message": "Sayfa yüklendiğinde otomatik doldur"
+ },
+ "autoFillOnPageLoadNo": {
+ "message": "Sayfa yüklendiğinde otomatik doldurma"
+ },
+ "commandOpenPopup": {
+ "message": "Kasayı açılır pencerede aç"
+ },
+ "commandOpenSidebar": {
+ "message": "Kasayı kenar çubuğunda aç"
+ },
+ "commandAutofillDesc": {
+ "message": "Geçerli site için son kullanılan hesabı otomatik doldur"
+ },
+ "commandGeneratePasswordDesc": {
+ "message": "Rastgele yeni bir parola oluştur ve panoya kopyala"
+ },
+ "commandLockVaultDesc": {
+ "message": "Kasayı kilitle"
+ },
+ "privateModeMessage": {
+ "message": "Maalesef bu pencereyi bu tarayıcının gizli modunda kullanamazsınız."
+ },
+ "customFields": {
+ "message": "Özel alanlar"
+ },
+ "copyValue": {
+ "message": "Değeri kopyala"
+ },
+ "value": {
+ "message": "Değer"
+ },
+ "newCustomField": {
+ "message": "Yeni özel alan"
+ },
+ "dragToSort": {
+ "message": "Sıralamak için sürükleyin"
+ },
+ "cfTypeText": {
+ "message": "Metin"
+ },
+ "cfTypeHidden": {
+ "message": "Gizli"
+ },
+ "cfTypeBoolean": {
+ "message": "Boolean"
+ },
+ "popup2faCloseMessage": {
+ "message": "Doğrulama kodunuzu alacağınız e-postayı kontrol etmek için bu pencerenin dışında bir yere tıklarsanız bu pencere kapanacaktır. Bu pencerenin kapanmaması için yeni bir pencerede açmak ister misiniz?"
+ },
+ "popupU2fCloseMessage": {
+ "message": "Bu tarayıcı bu açılır pencerede U2F isteklerini işleyemiyor. U2F kullanarak giriş yapmak için bu açılır pencereyi yeni bir pencerede açmak ister misiniz?"
+ },
+ "disableFavicon": {
+ "message": "Site simgelerini devre dışı bırak"
+ },
+ "disableFaviconDesc": {
+ "message": "Web sitesi simgeleri, kasanızdaki her kaydın yanında o siteyi tanımanıza yardımcı olan bir resim sunar."
+ },
+ "disableBadgeCounter": {
+ "message": "Düğmedeki sayacı devre dışı bırak"
+ },
+ "disableBadgeCounterDesc": {
+ "message": "Düğmedeki sayaç, görüntülenen sayfaya ait kaç hesabınız olduğunu gösterir."
+ },
+ "cardholderName": {
+ "message": "Kart sahibinin adı"
+ },
+ "number": {
+ "message": "Numara"
+ },
+ "brand": {
+ "message": "Marka"
+ },
+ "expirationMonth": {
+ "message": "Son kullanma ayı"
+ },
+ "expirationYear": {
+ "message": "Son kullanma yılı"
+ },
+ "expiration": {
+ "message": "Son kullanma tarihi"
+ },
+ "january": {
+ "message": "Ocak"
+ },
+ "february": {
+ "message": "Şubat"
+ },
+ "march": {
+ "message": "Mart"
+ },
+ "april": {
+ "message": "Nisan"
+ },
+ "may": {
+ "message": "May"
+ },
+ "june": {
+ "message": "Haziran"
+ },
+ "july": {
+ "message": "Temmuz"
+ },
+ "august": {
+ "message": "Ağustos"
+ },
+ "september": {
+ "message": "Eylül"
+ },
+ "october": {
+ "message": "Ekim"
+ },
+ "november": {
+ "message": "Kasım"
+ },
+ "december": {
+ "message": "Aralık"
+ },
+ "securityCode": {
+ "message": "Güvenlik kodu"
+ },
+ "ex": {
+ "message": "örn."
+ },
+ "title": {
+ "message": "Unvan"
+ },
+ "mr": {
+ "message": "Bay"
+ },
+ "mrs": {
+ "message": "Mrs"
+ },
+ "ms": {
+ "message": "Ms"
+ },
+ "dr": {
+ "message": "Dr"
+ },
+ "firstName": {
+ "message": "Ad"
+ },
+ "middleName": {
+ "message": "İkinci ad"
+ },
+ "lastName": {
+ "message": "Soyad"
+ },
+ "identityName": {
+ "message": "Kimlik adı"
+ },
+ "company": {
+ "message": "Şirket"
+ },
+ "ssn": {
+ "message": "Sosyal güvenlik numarası"
+ },
+ "passportNumber": {
+ "message": "Pasaport numarası"
+ },
+ "licenseNumber": {
+ "message": "Ehliyet numarası"
+ },
+ "email": {
+ "message": "E-posta"
+ },
+ "phone": {
+ "message": "Telefon"
+ },
+ "address": {
+ "message": "Adres"
+ },
+ "address1": {
+ "message": "Adres 1"
+ },
+ "address2": {
+ "message": "Adres 2"
+ },
+ "address3": {
+ "message": "Adres 3"
+ },
+ "cityTown": {
+ "message": "İlçe"
+ },
+ "stateProvince": {
+ "message": "İl / eyalet"
+ },
+ "zipPostalCode": {
+ "message": "Posta kodu"
+ },
+ "country": {
+ "message": "Ülke"
+ },
+ "type": {
+ "message": "Tür"
+ },
+ "typeLogin": {
+ "message": "Hesap"
+ },
+ "typeLogins": {
+ "message": "Hesaplar"
+ },
+ "typeSecureNote": {
+ "message": "Güvenli not"
+ },
+ "typeCard": {
+ "message": "Kart"
+ },
+ "typeIdentity": {
+ "message": "Kimlik"
+ },
+ "passwordHistory": {
+ "message": "Parola geçmişi"
+ },
+ "back": {
+ "message": "Geri"
+ },
+ "collections": {
+ "message": "Koleksiyonlar"
+ },
+ "favorites": {
+ "message": "Favoriler"
+ },
+ "popOutNewWindow": {
+ "message": "Yeni pencerede aç"
+ },
+ "refresh": {
+ "message": "Yenile"
+ },
+ "cards": {
+ "message": "Kartlar"
+ },
+ "identities": {
+ "message": "Kimlikler"
+ },
+ "logins": {
+ "message": "Hesaplar"
+ },
+ "secureNotes": {
+ "message": "Güvenli notlar"
+ },
+ "clear": {
+ "message": "Temizle",
+ "description": "To clear something out. example: To clear browser history."
+ },
+ "checkPassword": {
+ "message": "Parolanız ele geçirilip geçirilmediğini kontrol edin."
+ },
+ "passwordExposed": {
+ "message": "Bu parola, veri ihlallerinde $VALUE$ kere açığa çıkmış. Değiştirmenizi tavsiye ederiz.",
+ "placeholders": {
+ "value": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "passwordSafe": {
+ "message": "Bilinen veri ihlallerinde bu parola bulunamadı. Güvenle kullanabilirsiniz."
+ },
+ "baseDomain": {
+ "message": "Ana alan adı"
+ },
+ "host": {
+ "message": "Sunucu",
+ "description": "A URL's host value. For example, the host of https://sub.domain.com:443 is 'sub.domain.com:443'."
+ },
+ "exact": {
+ "message": "Tam"
+ },
+ "startsWith": {
+ "message": "URI başlangıcı"
+ },
+ "regEx": {
+ "message": "Düzenli ifade",
+ "description": "A programming term, also known as 'RegEx'."
+ },
+ "matchDetection": {
+ "message": "Eşleşme tespiti",
+ "description": "URI match detection for auto-fill."
+ },
+ "defaultMatchDetection": {
+ "message": "Varsayılan eşleşme tespiti",
+ "description": "Default URI match detection for auto-fill."
+ },
+ "toggleOptions": {
+ "message": "Seçenekleri aç/kapat"
+ },
+ "toggleCurrentUris": {
+ "message": "Geçerli URI'leri aç/kapat",
+ "description": "Toggle the display of the URIs of the currently open tabs in the browser."
+ },
+ "currentUri": {
+ "message": "Geçerli URI",
+ "description": "The URI of one of the current open tabs in the browser."
+ },
+ "organization": {
+ "message": "Kuruluş",
+ "description": "An entity of multiple related people (ex. a team or business organization)."
+ },
+ "types": {
+ "message": "Türler"
+ },
+ "allItems": {
+ "message": "Tüm kayıtlar"
+ },
+ "noPasswordsInList": {
+ "message": "Listelenecek parola yok."
+ },
+ "remove": {
+ "message": "Kaldır"
+ },
+ "default": {
+ "message": "Varsayılan"
+ },
+ "dateUpdated": {
+ "message": "Güncelleme",
+ "description": "ex. Date this item was updated"
+ },
+ "datePasswordUpdated": {
+ "message": "Parola güncelleme",
+ "description": "ex. Date this password was updated"
+ },
+ "neverLockWarning": {
+ "message": "\"Asla\" seçeneğini kullanmak istediğinizden emin misiniz? Kilit seçeneğinizi \"Asla\" olarak ayarlarsanız kasanızın şifreleme anahtarı cihazınızda saklanacaktır. Bu seçeneği kullanırsanız cihazınızı çok iyi korumalısınız."
+ },
+ "noOrganizationsList": {
+ "message": "Herhangi bir kuruluşa dahil değilsiniz. Kuruluşlar, kayıtlarınızı diğer kullanıcılarla güvenli bir şekilde paylaşmanıza olanak verir."
+ },
+ "noCollectionsInList": {
+ "message": "Listelenecek koleksiyon yok."
+ },
+ "ownership": {
+ "message": "Sahip"
+ },
+ "whoOwnsThisItem": {
+ "message": "Bu öğenin sahibi kim?"
+ },
+ "strong": {
+ "message": "Güçlü",
+ "description": "ex. A strong password. Scale: Weak -> Good -> Strong"
+ },
+ "good": {
+ "message": "İyi",
+ "description": "ex. A good password. Scale: Weak -> Good -> Strong"
+ },
+ "weak": {
+ "message": "Zayıf",
+ "description": "ex. A weak password. Scale: Weak -> Good -> Strong"
+ },
+ "weakMasterPassword": {
+ "message": "Zayıf ana parola"
+ },
+ "weakMasterPasswordDesc": {
+ "message": "Seçtiğiniz ana parola zayıf. Bitwarden hesabınızı korumak için daha güçlü bir ana parola seçmenizi öneririz. Bu ana parolayı kullanmak istediğinizden emin misiniz?"
+ },
+ "pin": {
+ "message": "PIN",
+ "description": "PIN code. Ex. The short code (often numeric) that you use to unlock a device."
+ },
+ "unlockWithPin": {
+ "message": "Kilidi PIN koduyla aç"
+ },
+ "setYourPinCode": {
+ "message": "Bitwarden'ı açarken kullanacağınız PIN kodunu belirleyin. Uygulamadan tamamen çıkış yaparsanız PIN ayarlarınız sıfırlanacaktır."
+ },
+ "pinRequired": {
+ "message": "PIN kodu gerekli."
+ },
+ "invalidPin": {
+ "message": "PIN kodu geçersiz."
+ },
+ "verifyPin": {
+ "message": "PIN'i doğrula"
+ },
+ "yourVaultIsLockedPinCode": {
+ "message": "Kasanız kilitlendi. Devam etmek için PIN kodunuzu doğrulayın."
+ },
+ "unlockWithBiometrics": {
+ "message": "Kilidi biyometri ile aç"
+ },
+ "awaitDesktop": {
+ "message": "Masaüstünden onay bekleniyor"
+ },
+ "awaitDesktopDesc": {
+ "message": "Tarayıcıda biyometriyi etkinleştirmek için lütfen Bitwarden masaüstü uygulamasında biyometri kullanımını onaylayın."
+ },
+ "lockWithMasterPassOnRestart": {
+ "message": "Tarayıcı yeniden başlatıldığında ana parola ile kilitle"
+ },
+ "selectOneCollection": {
+ "message": "En az bir koleksiyon seçmelisiniz."
+ },
+ "cloneItem": {
+ "message": "Kaydı klonla"
+ },
+ "clone": {
+ "message": "Klonla"
+ },
+ "passwordGeneratorPolicyInEffect": {
+ "message": "Bir ya da daha fazla kuruluş ilkesi, oluşturucu ayarlarınızı etkiliyor."
+ },
+ "vaultTimeoutAction": {
+ "message": "Kasa zaman aşımı eylemi"
+ },
+ "lock": {
+ "message": "Kilitle",
+ "description": "Verb form: to make secure or inaccesible by"
+ },
+ "trash": {
+ "message": "Çöp kutusu",
+ "description": "Noun: a special folder to hold deleted items"
+ },
+ "searchTrash": {
+ "message": "Çöp kutusunda ara"
+ },
+ "permanentlyDeleteItem": {
+ "message": "Kaydı kalıcı olarak sil"
+ },
+ "permanentlyDeleteItemConfirmation": {
+ "message": "Bu kaydı kalıcı olarak silmek istediğinizden emin misiniz?"
+ },
+ "permanentlyDeletedItem": {
+ "message": "Kayıt kalıcı olarak silindi"
+ },
+ "restoreItem": {
+ "message": "Kaydı geri yükle"
+ },
+ "restoreItemConfirmation": {
+ "message": "Bu kaydı geri yüklemek istediğinizden emin misiniz?"
+ },
+ "restoredItem": {
+ "message": "Kayıt geri yüklendi"
+ },
+ "vaultTimeoutLogOutConfirmation": {
+ "message": "Çıkış yaptığınızda kasanıza erişiminiz tamamen sonlanacak ve zaman aşımının ardından çevrimiçi kimlik doğrulaması yapmanız gerekecek. Bu ayarı kullanmak istediğinizden emin misiniz?"
+ },
+ "vaultTimeoutLogOutConfirmationTitle": {
+ "message": "Zaman Aşımı Eylem Onayı"
+ },
+ "autoFillAndSave": {
+ "message": "Otomatik doldur ve kaydet"
+ },
+ "autoFillSuccessAndSavedUri": {
+ "message": "Kayıt otomatik dolduruldu ve URI kaydedildi"
+ },
+ "autoFillSuccess": {
+ "message": "Kayıt otomatik dolduruldu"
+ },
+ "setMasterPassword": {
+ "message": "Ana parolayı belirle"
+ },
+ "masterPasswordPolicyInEffect": {
+ "message": "Bir veya daha fazla kuruluş ilkesi gereğince ana parolanız aşağıdaki gereksinimleri karşılamalıdır:"
+ },
+ "policyInEffectMinComplexity": {
+ "message": "Minimum karmaşıklık puanı: $SCORE$",
+ "placeholders": {
+ "score": {
+ "content": "$1",
+ "example": "4"
+ }
+ }
+ },
+ "policyInEffectMinLength": {
+ "message": "Minimum uzunluk: $LENGTH$",
+ "placeholders": {
+ "length": {
+ "content": "$1",
+ "example": "14"
+ }
+ }
+ },
+ "policyInEffectUppercase": {
+ "message": "Bir veya daha fazla büyük harf içermeli"
+ },
+ "policyInEffectLowercase": {
+ "message": "Bir veya daha fazla küçük harf içermeli"
+ },
+ "policyInEffectNumbers": {
+ "message": "Bir veya daha fazla rakam içermeli"
+ },
+ "policyInEffectSpecial": {
+ "message": "Şu özel karakterlerden birini veya daha fazlasını içermeli: $CHARS$",
+ "placeholders": {
+ "chars": {
+ "content": "$1",
+ "example": "!@#$%^&*"
+ }
+ }
+ },
+ "masterPasswordPolicyRequirementsNotMet": {
+ "message": "Yeni ana parolanız ilke gereksinimlerini karşılamıyor."
+ },
+ "acceptPolicies": {
+ "message": "Bu kutuyu işaretleyerek aşağıdakileri kabul etmiş olursunuz:"
+ },
+ "acceptPoliciesError": {
+ "message": "Hizmet Koşulları ve Gizlilik Politikası kabul edilmemiş."
+ },
+ "termsOfService": {
+ "message": "Hizmet Koşulları"
+ },
+ "privacyPolicy": {
+ "message": "Gizlilik Politikası"
+ },
+ "hintEqualsPassword": {
+ "message": "Parola ipucunuz parolanızla aynı olamaz."
+ },
+ "ok": {
+ "message": "Tamam"
+ },
+ "desktopSyncVerificationTitle": {
+ "message": "Masaüstü eşitleme doğrulaması"
+ },
+ "desktopIntegrationVerificationText": {
+ "message": "Lütfen masaüstü uygulamasında bu parmak izinin göründüğünü onaylayın: "
+ },
+ "desktopIntegrationDisabledTitle": {
+ "message": "Tarayıcı entegrasyonu etkinleştirilmedi"
+ },
+ "desktopIntegrationDisabledDesc": {
+ "message": "Bitwarden masaüstü uygulamasında tarayıcı entegrasyonu etkin değil. Lütfen masaüstü uygulamasının ayarlarından tarayıcı entegrasyonunu açın."
+ },
+ "startDesktopTitle": {
+ "message": "Bitwarden masaüstü uygulamasını başlat"
+ },
+ "startDesktopDesc": {
+ "message": "Bu işlevin kullanılabilmesi için Bitwarden masaüstü uygulamasının başlatılması gerekir."
+ },
+ "errorEnableBiometricTitle": {
+ "message": "Biyometri etkinleştirilemedi"
+ },
+ "errorEnableBiometricDesc": {
+ "message": "İşlem masaüstü uygulaması tarafından iptal edildi"
+ },
+ "nativeMessagingInvalidEncryptionDesc": {
+ "message": "Masaüstü uygulaması güvenli iletişim kanalını geçersiz kıldı. Lütfen bu işlemi tekrar deneyin"
+ },
+ "nativeMessagingInvalidEncryptionTitle": {
+ "message": "Masaüstü ile iletişim kesildi"
+ },
+ "nativeMessagingWrongUserDesc": {
+ "message": "Masaüstü uygulamasında farklı bir hesaba giriş yapılmış. Lütfen her iki uygulamada da aynı hesaba giriş yapın."
+ },
+ "nativeMessagingWrongUserTitle": {
+ "message": "Hesap uyuşmazlığı"
+ },
+ "biometricsNotEnabledTitle": {
+ "message": "Biyometri etkin değil"
+ },
+ "biometricsNotEnabledDesc": {
+ "message": "Tarayıcıda biyometriyi kullanmak için önce ayarlardan masaüstü biyometrisini etkinleştirilmeniz gerekir."
+ },
+ "biometricsNotSupportedTitle": {
+ "message": "Biyometri desteklenmiyor"
+ },
+ "biometricsNotSupportedDesc": {
+ "message": "Tarayıcı biyometrisi bu cihazda desteklenmiyor."
+ },
+ "nativeMessaginPermissionErrorTitle": {
+ "message": "İzin verilmedi"
+ },
+ "nativeMessaginPermissionErrorDesc": {
+ "message": "Bitwarden masaüstü uygulamasıyla iletişim kurma iznimiz olmadan tarayıcı uzantısında biyometriyi kullanamayız. Lütfen tekrar deneyin."
+ },
+ "nativeMessaginPermissionSidebarTitle": {
+ "message": "İzin isteme hatası"
+ },
+ "nativeMessaginPermissionSidebarDesc": {
+ "message": "Bu işlemi kenar çubuğundan yapamazsınız. Lütfen açılır pencereden yapmayı deneyin."
+ },
+ "personalOwnershipSubmitError": {
+ "message": "Bir kuruluş ilkesi nedeniyle kişisel kasanıza hesap kaydetmeniz kısıtlanmış. Sahip seçeneğini bir kuruluş olarak değiştirin ve mevcut koleksiyonlar arasından seçim yapın."
+ },
+ "personalOwnershipPolicyInEffect": {
+ "message": "Bir kuruluş ilkesi sahiplik seçeneklerinizi etkiliyor."
+ },
+ "excludedDomains": {
+ "message": "Hariç tutulan alan adları"
+ },
+ "excludedDomainsDesc": {
+ "message": "Bitwarden bu alan adlarında hesaplarınızı kaydetmeyi sormayacaktır. Değişikliklerin etkili olması için sayfayı yenilemelisiniz."
+ },
+ "excludedDomainsInvalidDomain": {
+ "message": "$DOMAIN$ geçerli bir alan adı değil",
+ "placeholders": {
+ "domain": {
+ "content": "$1",
+ "example": "googlecom"
+ }
+ }
+ },
+ "send": {
+ "message": "Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "searchSends": {
+ "message": "Send'lerde ara",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "addSend": {
+ "message": "Send ekle",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTypeText": {
+ "message": "Metin"
+ },
+ "sendTypeFile": {
+ "message": "Dosya"
+ },
+ "allSends": {
+ "message": "Tüm Send'ler",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "maxAccessCountReached": {
+ "message": "Maksimum erişim sayısına ulaşıldı"
+ },
+ "expired": {
+ "message": "Süresi dolmuş"
+ },
+ "pendingDeletion": {
+ "message": "Silinmesi bekleniyor"
+ },
+ "passwordProtected": {
+ "message": "Parola korumalı"
+ },
+ "copySendLink": {
+ "message": "Send bağlantısını kopyala",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "removePassword": {
+ "message": "Parolayı kaldır"
+ },
+ "delete": {
+ "message": "Sil"
+ },
+ "removedPassword": {
+ "message": "Parola kaldırıldı"
+ },
+ "deletedSend": {
+ "message": "Send silindi",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendLink": {
+ "message": "Send bağlantısı",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "disabled": {
+ "message": "Devre dışı"
+ },
+ "removePasswordConfirmation": {
+ "message": "Parolayı kaldırmak istediğinizden emin misiniz?"
+ },
+ "deleteSend": {
+ "message": "Send'i sil",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "deleteSendConfirmation": {
+ "message": "Bu Send'i silmek istediğinizden emin misiniz?",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "editSend": {
+ "message": "Send'i düzenle",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTypeHeader": {
+ "message": "Bu ne tür bir Send?",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendNameDesc": {
+ "message": "Bu Send'i açıklayan anlaşılır bir ad",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendFileDesc": {
+ "message": "Göndermek istediğiniz dosya."
+ },
+ "deletionDate": {
+ "message": "Silinme tarihi"
+ },
+ "deletionDateDesc": {
+ "message": "Bu Send belirtilen tarih ve saatte kalıcı olacak silinecek.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "expirationDate": {
+ "message": "Son kullanma tarihi"
+ },
+ "expirationDateDesc": {
+ "message": "Bunu ayarlarsanız belirtilen tarih ve saatten sonra bu Send'e erişilemeyecektir.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "oneDay": {
+ "message": "1 gün"
+ },
+ "days": {
+ "message": "$DAYS$ gün",
+ "placeholders": {
+ "days": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "custom": {
+ "message": "Özel"
+ },
+ "maximumAccessCount": {
+ "message": "Maksimum erişim sayısı"
+ },
+ "maximumAccessCountDesc": {
+ "message": "Bunu ayarlarsanız maksimum erişim sayısına ulaşıldıktan sonra bu Send'e erişilemeyecektir.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendPasswordDesc": {
+ "message": "Kullanıcıların bu Send'e erişmek için parola girmelerini isteyebilirsiniz.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendNotesDesc": {
+ "message": "Bu Send ile ilgili özel notlar.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendDisableDesc": {
+ "message": "Kimsenin erişememesi için bu Send'i devre dışı bırak.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendShareDesc": {
+ "message": "Kaydettikten sonra bu Send'in linkini panoya kopyala.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTextDesc": {
+ "message": "Göndermek istediğiniz metin."
+ },
+ "sendHideText": {
+ "message": "Bu Send'in metnini varsayılan olarak gizle.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "currentAccessCount": {
+ "message": "Mevcut erişim sayısı"
+ },
+ "createSend": {
+ "message": "Yeni Send oluştur",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "newPassword": {
+ "message": "Yeni parola"
+ },
+ "sendDisabled": {
+ "message": "Send devre dışı",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendDisabledWarning": {
+ "message": "Bir kuruluş ilkesi nedeniyle yalnızca mevcut Send'leri silebilirsiniz.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "createdSend": {
+ "message": "Send oluşturuldu",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "editedSend": {
+ "message": "Send düzenlendi",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendLinuxChromiumFileWarning": {
+ "message": "Dosya seçmek için eklentiyi kenar çubuğunda açın (mümkünse) veya bu banner'a tıklayarak yeni bir pencerede açın."
+ },
+ "sendFirefoxFileWarning": {
+ "message": "Firefox ile dosya seçmek için eklentiyi kenar çubuğunda açın veya bu banner'a tıklayarak yeni bir pencerede açın."
+ },
+ "sendSafariFileWarning": {
+ "message": "Safari ile dosya seçmek için bu banner'a tıklayarak eklentiyi yeni bir pencerede açın."
+ },
+ "sendFileCalloutHeader": {
+ "message": "Başlamadan önce"
+ },
+ "sendFirefoxCustomDatePopoutMessage1": {
+ "message": "Takvim tarzı tarih seçiyi kullanmak için",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read '**To use a calendar style date picker ** click here to pop out your window.'"
+ },
+ "sendFirefoxCustomDatePopoutMessage2": {
+ "message": "buraya tıklayarak",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker **click here** to pop out your window.'"
+ },
+ "sendFirefoxCustomDatePopoutMessage3": {
+ "message": "yeni bir pencere açın.",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker click here **to pop out your window.**'"
+ },
+ "expirationDateIsInvalid": {
+ "message": "Belirtilen son kullanma tarihi geçersiz."
+ },
+ "deletionDateIsInvalid": {
+ "message": "Belirtilen silinme tarihi geçersiz."
+ },
+ "expirationDateAndTimeRequired": {
+ "message": "Son kullanma tarihi ve saati gereklidir."
+ },
+ "deletionDateAndTimeRequired": {
+ "message": "Silinme tarihi ve saati gereklidir."
+ },
+ "dateParsingError": {
+ "message": "Silinme ve son kullanma tarihleriniz kaydedilirken bir hata oluştu."
+ },
+ "hideEmail": {
+ "message": "E-posta adresimi alıcılardan gizle."
+ },
+ "sendOptionsPolicyInEffect": {
+ "message": "Bir veya daha fazla kuruluş ilkesi Send seçeneklerinizi etkiliyor."
+ },
+ "passwordPrompt": {
+ "message": "Ana parolayı yeniden iste"
+ },
+ "passwordConfirmation": {
+ "message": "Ana parola onayı"
+ },
+ "passwordConfirmationDesc": {
+ "message": "Bu işlem korumalıdır. İşleme devam etmek için lütfen ana parolanızı yeniden girin."
+ },
+ "emailVerificationRequired": {
+ "message": "E-posta doğrulaması gerekiyor"
+ },
+ "emailVerificationRequiredDesc": {
+ "message": "Bu özelliği kullanmak için e-postanızı doğrulamanız gerekir. E-postanızı web kasasında doğrulayabilirsiniz."
+ },
+ "updatedMasterPassword": {
+ "message": "Ana parola güncellendi"
+ },
+ "updateMasterPassword": {
+ "message": "Ana parolayı güncelle"
+ },
+ "updateMasterPasswordWarning": {
+ "message": "Ana parolanız organizasyonunuzdaki bir yönetici tarafından yakın zaman önce değiştirildi. Kasanıza erişmek için bunu güncellemeniz gereklidir. Devam ettiğinizde oturumunuz kapatılacak ve tekrardan oturum açmanız gerekecektir. Diğer cihazlardaki aktif oturumlar bir saate kadar aktif kalabilirler. "
+ },
+ "resetPasswordPolicyAutoEnroll": {
+ "message": "Otomatik Kaydolma"
+ },
+ "resetPasswordAutoEnrollInviteWarning": {
+ "message": "Bu kuruluş, sizi otomatik olarak parola sıfırlama işlemine kaydedecek bir kurumsal ilkeye sahiptir. Kayıt işlemi kuruluş yöneticilerinin ana parolanızı değiştirmesine olanak tanır."
+ },
+ "selectFolder": {
+ "message": "Klasör seç..."
+ },
+ "ssoCompleteRegistration": {
+ "message": "SSO ile girişinizi tamamlamak için lütfen kasanıza erişirken kullanacağınız ana parolayı belirleyin."
+ },
+ "hours": {
+ "message": "Saat"
+ },
+ "minutes": {
+ "message": "Dakika"
+ },
+ "vaultTimeoutPolicyInEffect": {
+ "message": "Kuruluş ilkeleriniz kasa zaman aşımınızı etkiliyor. İzin verilen maksimum Kasa Zaman Aşımı {0} saat ve {1} dakikadır",
+ "placeholders": {
+ "hours": {
+ "content": "$1",
+ "example": "5"
+ },
+ "minutes": {
+ "content": "$2",
+ "example": "5"
+ }
+ }
+ },
+ "vaultTimeoutToLarge": {
+ "message": "Kasa zaman aşımınız, kuruluşunuz tarafından belirlenen kısıtlamaları aşıyor."
+ },
+ "vaultExportDisabled": {
+ "message": "Kasayı dışa aktarma devre dışı"
+ },
+ "personalVaultExportPolicyInEffect": {
+ "message": "Bir veya daha fazla kuruluş ilkesi, kişisel kasanızı dışa aktarmanızı engelliyor."
+ },
+ "copyCustomFieldNameInvalidElement": {
+ "message": "Unable to identify a valid form element. Try inspecting the HTML instead."
+ },
+ "copyCustomFieldNameNotUnique": {
+ "message": "Benzersiz tanımlayıcı bulunamadı."
+ }
+}
diff --git a/src/iOS.Safari/Resources/_locales/uk/messages.json b/src/iOS.Safari/Resources/_locales/uk/messages.json
new file mode 100644
index 000000000..e7f193caa
--- /dev/null
+++ b/src/iOS.Safari/Resources/_locales/uk/messages.json
@@ -0,0 +1,1817 @@
+{
+ "appName": {
+ "message": "Bitwarden"
+ },
+ "extName": {
+ "message": "Bitwarden",
+ "description": "Extension name, MUST be less than 40 characters (Safari restriction)"
+ },
+ "extDesc": {
+ "message": "Bitwarden - це захищений і безкоштовний менеджер паролів для всіх ваших пристроїв.",
+ "description": "Extension description"
+ },
+ "loginOrCreateNewAccount": {
+ "message": "Для доступу до сховища увійдіть в обліковий запис, або створіть новий."
+ },
+ "createAccount": {
+ "message": "Створити обліковий запис"
+ },
+ "login": {
+ "message": "Увійти"
+ },
+ "enterpriseSingleSignOn": {
+ "message": "Єдиний корпоративний вхід (SSO)"
+ },
+ "cancel": {
+ "message": "Скасувати"
+ },
+ "close": {
+ "message": "Закрити"
+ },
+ "submit": {
+ "message": "Відправити"
+ },
+ "emailAddress": {
+ "message": "Адреса е-пошти"
+ },
+ "masterPass": {
+ "message": "Головний пароль"
+ },
+ "masterPassDesc": {
+ "message": "Головний пароль використовується для доступу до вашого сховища. Дуже важливо, щоб ви запам'ятали його. Якщо ви забудете головний пароль, його неможливо буде відновити."
+ },
+ "masterPassHintDesc": {
+ "message": "Якщо ви забудете головний пароль, підказка може допомогти вам згадати його."
+ },
+ "reTypeMasterPass": {
+ "message": "Введіть головний пароль ще раз"
+ },
+ "masterPassHint": {
+ "message": "Підказка для головного пароля (необов'язково)"
+ },
+ "tab": {
+ "message": "Вкладка"
+ },
+ "myVault": {
+ "message": "Моє сховище"
+ },
+ "tools": {
+ "message": "Інструменти"
+ },
+ "settings": {
+ "message": "Налаштування"
+ },
+ "currentTab": {
+ "message": "Поточна вкладка"
+ },
+ "copyPassword": {
+ "message": "Копіювати пароль"
+ },
+ "copyNote": {
+ "message": "Копіювати нотатку"
+ },
+ "copyUri": {
+ "message": "Копіювати URI"
+ },
+ "copyUsername": {
+ "message": "Копіювати ім'я користувача"
+ },
+ "copyNumber": {
+ "message": "Копіювати номер"
+ },
+ "copySecurityCode": {
+ "message": "Копіювати код безпеки"
+ },
+ "autoFill": {
+ "message": "Автозаповнення"
+ },
+ "generatePasswordCopied": {
+ "message": "Генерувати пароль (з копіюванням)"
+ },
+ "copyElementIdentifier": {
+ "message": "Копіювати назву власного поля"
+ },
+ "noMatchingLogins": {
+ "message": "Немає відповідних записів."
+ },
+ "vaultLocked": {
+ "message": "Сховище заблоковано."
+ },
+ "vaultLoggedOut": {
+ "message": "Ви вийшли зі сховища."
+ },
+ "autoFillInfo": {
+ "message": "Для поточної вкладки браузера немає записів автозаповнення."
+ },
+ "addLogin": {
+ "message": "Додати запис"
+ },
+ "addItem": {
+ "message": "Додати запис"
+ },
+ "passwordHint": {
+ "message": "Підказка для пароля"
+ },
+ "enterEmailToGetHint": {
+ "message": "Введіть свою адресу е-пошти, щоб отримати підказку для головного пароля."
+ },
+ "getMasterPasswordHint": {
+ "message": "Отримати підказку для головного пароля"
+ },
+ "continue": {
+ "message": "Продовжити"
+ },
+ "verificationCode": {
+ "message": "Код підтвердження"
+ },
+ "account": {
+ "message": "Обліковий запис"
+ },
+ "changeMasterPassword": {
+ "message": "Змінити головний пароль"
+ },
+ "fingerprintPhrase": {
+ "message": "Фраза відбитку",
+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
+ },
+ "yourAccountsFingerprint": {
+ "message": "Фраза відбитку вашого облікового запису",
+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
+ },
+ "twoStepLogin": {
+ "message": "Двоетапна перевірка"
+ },
+ "logOut": {
+ "message": "Вийти"
+ },
+ "about": {
+ "message": "Про розширення"
+ },
+ "version": {
+ "message": "Версія"
+ },
+ "save": {
+ "message": "Зберегти"
+ },
+ "move": {
+ "message": "Перемістити"
+ },
+ "addFolder": {
+ "message": "Додати теку"
+ },
+ "name": {
+ "message": "Назва"
+ },
+ "editFolder": {
+ "message": "Редагувати теку"
+ },
+ "deleteFolder": {
+ "message": "Видалити теку"
+ },
+ "folders": {
+ "message": "Теки"
+ },
+ "noFolders": {
+ "message": "Немає тек."
+ },
+ "helpFeedback": {
+ "message": "Допомога і зворотній зв'язок"
+ },
+ "sync": {
+ "message": "Синхронізація"
+ },
+ "syncVaultNow": {
+ "message": "Синхронізувати зараз"
+ },
+ "lastSync": {
+ "message": "Остання синхронізація:"
+ },
+ "passGen": {
+ "message": "Генератор паролів"
+ },
+ "generator": {
+ "message": "Генератор",
+ "description": "Short for 'Password Generator'."
+ },
+ "passGenInfo": {
+ "message": "Автоматичне генерування стійких, унікальних паролів."
+ },
+ "bitWebVault": {
+ "message": "Веб сховище Bitwarden"
+ },
+ "importItems": {
+ "message": "Імпорт записів"
+ },
+ "select": {
+ "message": "Обрати"
+ },
+ "generatePassword": {
+ "message": "Генерувати пароль"
+ },
+ "regeneratePassword": {
+ "message": "Генерувати новий"
+ },
+ "options": {
+ "message": "Додатково"
+ },
+ "length": {
+ "message": "Довжина"
+ },
+ "numWords": {
+ "message": "Кількість слів"
+ },
+ "wordSeparator": {
+ "message": "Розділювач слів"
+ },
+ "capitalize": {
+ "message": "Великі літери",
+ "description": "Make the first letter of a work uppercase."
+ },
+ "includeNumber": {
+ "message": "Включити число"
+ },
+ "minNumbers": {
+ "message": "Мінімум цифр"
+ },
+ "minSpecial": {
+ "message": "Мінімум спеціальних символів"
+ },
+ "avoidAmbChar": {
+ "message": "Уникати неоднозначних символів"
+ },
+ "searchVault": {
+ "message": "Пошук"
+ },
+ "edit": {
+ "message": "Змінити"
+ },
+ "view": {
+ "message": "Перегляд"
+ },
+ "noItemsInList": {
+ "message": "Немає записів."
+ },
+ "itemInformation": {
+ "message": "Інформація про запис"
+ },
+ "username": {
+ "message": "Ім'я користувача"
+ },
+ "password": {
+ "message": "Пароль"
+ },
+ "passphrase": {
+ "message": "Парольна фраза"
+ },
+ "favorite": {
+ "message": "Обране"
+ },
+ "notes": {
+ "message": "Нотатки"
+ },
+ "note": {
+ "message": "Нотатка"
+ },
+ "editItem": {
+ "message": "Зміна запису"
+ },
+ "folder": {
+ "message": "Тека"
+ },
+ "deleteItem": {
+ "message": "Видалити запис"
+ },
+ "viewItem": {
+ "message": "Перегляд запису"
+ },
+ "launch": {
+ "message": "Перейти"
+ },
+ "website": {
+ "message": "Вебсайт"
+ },
+ "toggleVisibility": {
+ "message": "Змінити видимість"
+ },
+ "manage": {
+ "message": "Керування"
+ },
+ "other": {
+ "message": "Інше"
+ },
+ "rateExtension": {
+ "message": "Оцінити розширення"
+ },
+ "rateExtensionDesc": {
+ "message": "Будь ласка, подумайте про те, щоб допомогти нам хорошим відгуком!"
+ },
+ "browserNotSupportClipboard": {
+ "message": "Ваш браузер не підтримує копіювання даних в буфер обміну. Скопіюйте вручну."
+ },
+ "verifyMasterPassword": {
+ "message": "Перевірка головного пароля"
+ },
+ "yourVaultIsLocked": {
+ "message": "Сховище заблоковано. Введіть головний пароль для продовження."
+ },
+ "unlock": {
+ "message": "Розблокувати"
+ },
+ "loggedInAsOn": {
+ "message": "Ви увійшли як $EMAIL$ на $HOSTNAME$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "name@example.com"
+ },
+ "hostname": {
+ "content": "$2",
+ "example": "bitwarden.com"
+ }
+ }
+ },
+ "invalidMasterPassword": {
+ "message": "Неправильний головний пароль"
+ },
+ "vaultTimeout": {
+ "message": "Час очікування сховища"
+ },
+ "lockNow": {
+ "message": "Заблокувати зараз"
+ },
+ "immediately": {
+ "message": "Негайно"
+ },
+ "tenSeconds": {
+ "message": "10 секунд"
+ },
+ "twentySeconds": {
+ "message": "20 секунд"
+ },
+ "thirtySeconds": {
+ "message": "30 секунд"
+ },
+ "oneMinute": {
+ "message": "1 хвилина"
+ },
+ "twoMinutes": {
+ "message": "2 хвилини"
+ },
+ "fiveMinutes": {
+ "message": "5 хвилин"
+ },
+ "fifteenMinutes": {
+ "message": "15 хвилин"
+ },
+ "thirtyMinutes": {
+ "message": "30 хвилин"
+ },
+ "oneHour": {
+ "message": "1 година"
+ },
+ "fourHours": {
+ "message": "4 години"
+ },
+ "onLocked": {
+ "message": "При блокуванні системи"
+ },
+ "onRestart": {
+ "message": "При перезапуску браузера"
+ },
+ "never": {
+ "message": "Ніколи"
+ },
+ "security": {
+ "message": "Безпека"
+ },
+ "errorOccurred": {
+ "message": "Сталася помилка"
+ },
+ "emailRequired": {
+ "message": "Необхідно вказати адресу е-пошти."
+ },
+ "invalidEmail": {
+ "message": "Неправильна адреса е-пошти."
+ },
+ "masterPassRequired": {
+ "message": "Потрібен головний пароль."
+ },
+ "masterPassLength": {
+ "message": "Довжина головного пароля повинна бути не менше 8 символів."
+ },
+ "masterPassDoesntMatch": {
+ "message": "Підтвердження головного пароля не збігається."
+ },
+ "newAccountCreated": {
+ "message": "Ваш обліковий запис створений! Тепер ви можете увійти."
+ },
+ "masterPassSent": {
+ "message": "Ми надіслали вам лист з підказкою для головного пароля."
+ },
+ "verificationCodeRequired": {
+ "message": "Потрібний код підтвердження."
+ },
+ "valueCopied": {
+ "message": "$VALUE$ скопійовано",
+ "description": "Value has been copied to the clipboard.",
+ "placeholders": {
+ "value": {
+ "content": "$1",
+ "example": "Password"
+ }
+ }
+ },
+ "autofillError": {
+ "message": "Не вдається заповнити пароль на цій сторінці. Скопіюйте і вставте ім'я користувача та/або пароль."
+ },
+ "loggedOut": {
+ "message": "Ви вийшли"
+ },
+ "loginExpired": {
+ "message": "Тривалість вашого сеансу завершилась."
+ },
+ "logOutConfirmation": {
+ "message": "Ви дійсно хочете вийти?"
+ },
+ "yes": {
+ "message": "Так"
+ },
+ "no": {
+ "message": "Ні"
+ },
+ "unexpectedError": {
+ "message": "Сталася неочікувана помилка."
+ },
+ "nameRequired": {
+ "message": "Потрібна назва."
+ },
+ "addedFolder": {
+ "message": "Додано теку"
+ },
+ "changeMasterPass": {
+ "message": "Змінити головний пароль"
+ },
+ "changeMasterPasswordConfirmation": {
+ "message": "Ви можете змінити головний пароль в сховищі на bitwarden.com. Хочете перейти на вебсайт зараз?"
+ },
+ "twoStepLoginConfirmation": {
+ "message": "Двоетапна перевірка робить ваш обліковий запис більш захищеним, вимагаючи підтвердження входу з використанням іншого пристрою, наприклад, за допомогою коду безпеки, програми авторизації, SMS, телефонного виклику, або е-пошти. Ви можете увімкнути двоетапну перевірку в сховищі на bitwarden.com. Хочете перейти на вебсайт зараз?"
+ },
+ "editedFolder": {
+ "message": "Тека змінена"
+ },
+ "deleteFolderConfirmation": {
+ "message": "Ви дійсно хочете видалити цю теку?"
+ },
+ "deletedFolder": {
+ "message": "Теку видалено"
+ },
+ "gettingStartedTutorial": {
+ "message": "Знайомство"
+ },
+ "gettingStartedTutorialVideo": {
+ "message": "Перегляньте знайомство, щоб дізнатися про можливості розширення для браузера."
+ },
+ "syncingComplete": {
+ "message": "Синхронізацію завершено"
+ },
+ "syncingFailed": {
+ "message": "Не вдалося синхронізувати"
+ },
+ "passwordCopied": {
+ "message": "Пароль скопійовано"
+ },
+ "uri": {
+ "message": "URI"
+ },
+ "uriPosition": {
+ "message": "URI $POSITION$",
+ "description": "A listing of URIs. Ex: URI 1, URI 2, URI 3, etc.",
+ "placeholders": {
+ "position": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "newUri": {
+ "message": "Новий URI"
+ },
+ "addedItem": {
+ "message": "Запис додано"
+ },
+ "editedItem": {
+ "message": "Запис змінено"
+ },
+ "deleteItemConfirmation": {
+ "message": "Ви дійсно хочете перенести до смітника?"
+ },
+ "deletedItem": {
+ "message": "Запис перенесено до смітника"
+ },
+ "overwritePassword": {
+ "message": "Перезаписати пароль"
+ },
+ "overwritePasswordConfirmation": {
+ "message": "Ви дійсно хочете перезаписати поточний пароль?"
+ },
+ "searchFolder": {
+ "message": "Пошук в теці"
+ },
+ "searchCollection": {
+ "message": "Пошук в збірках"
+ },
+ "searchType": {
+ "message": "Пошук за типом"
+ },
+ "noneFolder": {
+ "message": "Без теки",
+ "description": "This is the folder for uncategorized items"
+ },
+ "disableAddLoginNotification": {
+ "message": "Вимкнути сповіщення про новий запис"
+ },
+ "addLoginNotificationDesc": {
+ "message": "Сповіщення про додавання пароля автоматично пропонує зберегти нові паролі у вашому сховищі під час першого входу."
+ },
+ "dontShowCardsCurrentTab": {
+ "message": "Не показувати картки на вкладці"
+ },
+ "dontShowCardsCurrentTabDesc": {
+ "message": "Картки з вашого сховища показано на сторінці поточної вкладки для швидкого доступу."
+ },
+ "dontShowIdentitiesCurrentTab": {
+ "message": "Не показувати посвідчення на вкладці"
+ },
+ "dontShowIdentitiesCurrentTabDesc": {
+ "message": "Посвідчення з вашого сховища показано на сторінці поточної вкладки для швидкого доступу."
+ },
+ "clearClipboard": {
+ "message": "Очистити буфер обміну",
+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
+ },
+ "clearClipboardDesc": {
+ "message": "Автоматично очищати скопійовані значення з буфера обміну.",
+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
+ },
+ "notificationAddDesc": {
+ "message": "Чи повинен Bitwarden зберегти цей пароль?"
+ },
+ "notificationAddSave": {
+ "message": "Так, зберегти"
+ },
+ "notificationNeverSave": {
+ "message": "Ніколи для цього сайту"
+ },
+ "disableChangedPasswordNotification": {
+ "message": "Вимкнути сповіщення зміненого пароля"
+ },
+ "disableChangedPasswordNotificationDesc": {
+ "message": "Сповіщення зміненого пароля автоматично запитує вас про оновлення пароля у сховищі, коли виявлено його зміну на вебсайті."
+ },
+ "notificationChangeDesc": {
+ "message": "Ви хочете оновити цей пароль в Bitwarden?"
+ },
+ "notificationChangeSave": {
+ "message": "Так, оновити"
+ },
+ "disableContextMenuItem": {
+ "message": "Вимкнути в контекстному меню"
+ },
+ "disableContextMenuItemDesc": {
+ "message": "Можливості контекстного меню забезпечують швидкий доступ до генерування пароля й входу для вебсайту поточної вкладки."
+ },
+ "defaultUriMatchDetection": {
+ "message": "Типове виявлення збігів URI",
+ "description": "Default URI match detection for auto-fill."
+ },
+ "defaultUriMatchDetectionDesc": {
+ "message": "Оберіть типовий спосіб виявлення збігів URI для виконання автозаповнення під час входу."
+ },
+ "theme": {
+ "message": "Тема"
+ },
+ "themeDesc": {
+ "message": "Змінити колірну тему додатка."
+ },
+ "dark": {
+ "message": "Темна",
+ "description": "Dark color"
+ },
+ "light": {
+ "message": "Світла",
+ "description": "Light color"
+ },
+ "solarizedDark": {
+ "message": "Solarized темна",
+ "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated."
+ },
+ "exportVault": {
+ "message": "Експорт сховища"
+ },
+ "fileFormat": {
+ "message": "Формат файлу"
+ },
+ "warning": {
+ "message": "ПОПЕРЕДЖЕННЯ",
+ "description": "WARNING (should stay in capitalized letters if the language permits)"
+ },
+ "confirmVaultExport": {
+ "message": "Підтвердити експорт сховища"
+ },
+ "exportWarningDesc": {
+ "message": "Експортовані дані вашого сховища знаходяться в незашифрованому вигляді. Вам не слід зберігати чи надсилати їх через незахищені канали (наприклад, е-поштою). Після використання негайно видаліть їх."
+ },
+ "encExportKeyWarningDesc": {
+ "message": "Цей експорт шифрує ваші дані за допомогою ключа шифрування облікового запису. Якщо ви коли-небудь оновите ключ шифрування облікового запису, ви повинні виконати експорт знову, оскільки не зможете розшифрувати цей файл експорту."
+ },
+ "encExportAccountWarningDesc": {
+ "message": "Ключі шифрування унікальні для кожного облікового запису користувача Bitwarden, тому ви не можете імпортувати зашифрований експорт до іншого облікового запису."
+ },
+ "exportMasterPassword": {
+ "message": "Введіть головний пароль, щоб експортувати дані сховища."
+ },
+ "shared": {
+ "message": "Спільні"
+ },
+ "learnOrg": {
+ "message": "Докладніше про організації"
+ },
+ "learnOrgConfirmation": {
+ "message": "Bitwarden дозволяє вам надавати доступ до записів свого сховища іншим за допомогою облікового запису організації. Бажаєте перейти на веб-сайт bitwarden.com, щоб дізнатися більше?"
+ },
+ "moveToOrganization": {
+ "message": "Перемістити до організації"
+ },
+ "share": {
+ "message": "Поділитися"
+ },
+ "movedItemToOrg": {
+ "message": "$ITEMNAME$ переміщено до $ORGNAME$",
+ "placeholders": {
+ "itemname": {
+ "content": "$1",
+ "example": "Secret Item"
+ },
+ "orgname": {
+ "content": "$2",
+ "example": "Company Name"
+ }
+ }
+ },
+ "moveToOrgDesc": {
+ "message": "Виберіть організацію, до якої ви бажаєте перемістити цей запис. При переміщенні до організації власність запису передається тій організації. Ви більше не будете єдиним власником цього запису після переміщення."
+ },
+ "learnMore": {
+ "message": "Докладніше"
+ },
+ "authenticatorKeyTotp": {
+ "message": "Ключ авторизації (TOTP)"
+ },
+ "verificationCodeTotp": {
+ "message": "Код підтвердження (TOTP)"
+ },
+ "copyVerificationCode": {
+ "message": "Копіювати код підтвердження"
+ },
+ "attachments": {
+ "message": "Вкладення"
+ },
+ "deleteAttachment": {
+ "message": "Видалити вкладення"
+ },
+ "deleteAttachmentConfirmation": {
+ "message": "Ви дійсно хочете видалити це вкладення?"
+ },
+ "deletedAttachment": {
+ "message": "Вкладення видалено"
+ },
+ "newAttachment": {
+ "message": "Додати нове вкладення"
+ },
+ "noAttachments": {
+ "message": "Немає вкладень."
+ },
+ "attachmentSaved": {
+ "message": "Вкладення збережено."
+ },
+ "file": {
+ "message": "Файл"
+ },
+ "selectFile": {
+ "message": "Оберіть файл."
+ },
+ "maxFileSize": {
+ "message": "Максимальний розмір файлу 500 Мб."
+ },
+ "featureUnavailable": {
+ "message": "Функція недоступна"
+ },
+ "updateKey": {
+ "message": "Ви не можете використовувати цю функцію доки не оновите свій ключ шифрування."
+ },
+ "premiumMembership": {
+ "message": "Преміум статус"
+ },
+ "premiumManage": {
+ "message": "Керувати статусом"
+ },
+ "premiumManageAlert": {
+ "message": "Ви можете керувати своїм статусом у сховищі на bitwarden.com. Хочете перейти на вебсайт зараз?"
+ },
+ "premiumRefresh": {
+ "message": "Оновити статус"
+ },
+ "premiumNotCurrentMember": {
+ "message": "Зараз у вас немає преміум-статусу."
+ },
+ "premiumSignUpAndGet": {
+ "message": "Підпишіться на преміум-статус і отримайте:"
+ },
+ "ppremiumSignUpStorage": {
+ "message": "1 ГБ зашифрованого сховища для файлів."
+ },
+ "ppremiumSignUpTwoStep": {
+ "message": "Додаткові можливості двоетапної перевірки, наприклад, YubiKey, FIDO U2F та Duo."
+ },
+ "ppremiumSignUpReports": {
+ "message": "Гігієна паролів, здоров'я облікового запису, а також звіти про вразливості даних, щоб зберігати ваше сховище в безпеці."
+ },
+ "ppremiumSignUpTotp": {
+ "message": "Генератор коду авторизації TOTP (2FA) для входу в сховище."
+ },
+ "ppremiumSignUpSupport": {
+ "message": "Пріоритетну технічну підтримку."
+ },
+ "ppremiumSignUpFuture": {
+ "message": "Всі майбутні функції преміум статусу. Їх буде більше!"
+ },
+ "premiumPurchase": {
+ "message": "Придбати преміум"
+ },
+ "premiumPurchaseAlert": {
+ "message": "Ви можете придбати преміум статус у сховищі на bitwarden.com. Хочете перейти на вебсайт зараз?"
+ },
+ "premiumCurrentMember": {
+ "message": "У вас преміум статус!"
+ },
+ "premiumCurrentMemberThanks": {
+ "message": "Дякуємо за підтримку Bitwarden."
+ },
+ "premiumPrice": {
+ "message": "Всього лише $PRICE$ / за рік!",
+ "placeholders": {
+ "price": {
+ "content": "$1",
+ "example": "$10"
+ }
+ }
+ },
+ "refreshComplete": {
+ "message": "Оновлення завершено"
+ },
+ "disableAutoTotpCopy": {
+ "message": "Вимкнути авто-копіювання TOTP"
+ },
+ "disableAutoTotpCopyDesc": {
+ "message": "Якщо ваш запис має вкладений ключ авторизації, код підтвердження TOTP автоматично копіюється до буфера обміну щоразу при автозаповненні."
+ },
+ "disableAutoBiometricsPrompt": {
+ "message": "Не запитувати біометрію при запуску"
+ },
+ "premiumRequired": {
+ "message": "Необхідний преміум статус"
+ },
+ "premiumRequiredDesc": {
+ "message": "Для використання цієї функції необхідний преміум статус."
+ },
+ "enterVerificationCodeApp": {
+ "message": "Введіть 6-значний код підтвердження з програми авторизації."
+ },
+ "enterVerificationCodeEmail": {
+ "message": "Введіть 6-значний код підтвердження, надісланий на $EMAIL$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "example@gmail.com"
+ }
+ }
+ },
+ "verificationCodeEmailSent": {
+ "message": "Код підтвердження надіслано на $EMAIL$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "example@gmail.com"
+ }
+ }
+ },
+ "rememberMe": {
+ "message": "Запам'ятати мене"
+ },
+ "sendVerificationCodeEmailAgain": {
+ "message": "Надіслати код підтвердження ще раз"
+ },
+ "useAnotherTwoStepMethod": {
+ "message": "Інший спосіб двоетапної перевірки"
+ },
+ "insertYubiKey": {
+ "message": "Вставте свій YubiKey в USB порт комп'ютера, потім торкніться цієї кнопки."
+ },
+ "insertU2f": {
+ "message": "Вставте свій ключ безпеки в USB порт комп'ютера. Якщо в нього є кнопка, натисніть її."
+ },
+ "webAuthnNewTab": {
+ "message": "Щоб почати перевірку WebAuthn 2FA, натисніть кнопку внизу для відкриття нової вкладки і дотримуйтесь зазначених на ній настанов."
+ },
+ "webAuthnNewTabOpen": {
+ "message": "Відкрити нову вкладку"
+ },
+ "webAuthnAuthenticate": {
+ "message": "Авторизація WebAuthn"
+ },
+ "loginUnavailable": {
+ "message": "Вхід недоступний"
+ },
+ "noTwoStepProviders": {
+ "message": "Для цього облікового запису увімкнено двоетапну перевірку. Однак, жоден з налаштованих провайдерів двоетапної перевірки не підтримується цим браузером."
+ },
+ "noTwoStepProviders2": {
+ "message": "Будь ласка, скористайтеся підтримуваним браузером (наприклад, Chrome) та/або іншими провайдерами, що краще підтримуються браузерами (наприклад, програма авторизації)."
+ },
+ "twoStepOptions": {
+ "message": "Налаштування двоетапної перевірки"
+ },
+ "recoveryCodeDesc": {
+ "message": "Втратили доступ до всіх провайдерів двоетапної перевірки? Скористайтеся кодом відновлення, щоб вимкнути двоетапну перевірку для свого облікового запису."
+ },
+ "recoveryCodeTitle": {
+ "message": "Код відновлення"
+ },
+ "authenticatorAppTitle": {
+ "message": "Програма авторизації"
+ },
+ "authenticatorAppDesc": {
+ "message": "Використовуйте програму авторизації (наприклад, Authy або Google Authenticator), щоб генерувати тимчасові коди підтвердження.",
+ "description": "'Authy' and 'Google Authenticator' are product names and should not be translated."
+ },
+ "yubiKeyTitle": {
+ "message": "Ключ безпеки YubiKey OTP"
+ },
+ "yubiKeyDesc": {
+ "message": "Використовуйте YubiKey для доступу до сховища. Працює з YubiKey 4, 4 Nano, 4C та пристроями NEO."
+ },
+ "duoDesc": {
+ "message": "Авторизуйтесь за допомогою Duo Security з використанням мобільного додатку Duo Mobile, SMS, телефонного виклику, або ключа безпеки U2F.",
+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
+ },
+ "duoOrganizationDesc": {
+ "message": "Авторизуйтесь за допомогою Duo Security для вашої організації з використанням мобільного додатку Duo Mobile, SMS, телефонного виклику, або ключа безпеки U2F.",
+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
+ },
+ "webAuthnTitle": {
+ "message": "FIDO2 WebAuthn"
+ },
+ "webAuthnDesc": {
+ "message": "Використовуйте будь-який ключ безпеки WebAuthn для доступу до сховища."
+ },
+ "emailTitle": {
+ "message": "Е-пошта"
+ },
+ "emailDesc": {
+ "message": "Коди підтвердження будуть надсилатися на вашу пошту."
+ },
+ "selfHostedEnvironment": {
+ "message": "Середовище власного хостингу"
+ },
+ "selfHostedEnvironmentFooter": {
+ "message": "Вкажіть основну URL-адресу Bitwarden на вашому сервері."
+ },
+ "customEnvironment": {
+ "message": "Власне середовище"
+ },
+ "customEnvironmentFooter": {
+ "message": "Для досвідчених користувачів. Ви можете вказати основну URL-адресу окремо для кожної служби."
+ },
+ "baseUrl": {
+ "message": "URL-адреса сервера"
+ },
+ "apiUrl": {
+ "message": "URL-адреса API"
+ },
+ "webVaultUrl": {
+ "message": "URL-адреса сервера веб сховища"
+ },
+ "identityUrl": {
+ "message": "URL-адреса сервера ідентифікації"
+ },
+ "notificationsUrl": {
+ "message": "URL сервера сповіщень"
+ },
+ "iconsUrl": {
+ "message": "URL-адреса сервера піктограм"
+ },
+ "environmentSaved": {
+ "message": "URL-адреси середовища збережено."
+ },
+ "enableAutoFillOnPageLoad": {
+ "message": "Автозаповнення на сторінці"
+ },
+ "enableAutoFillOnPageLoadDesc": {
+ "message": "При виявленні форми входу виконувати автоматичне її заповнення під час завантаження сторінки."
+ },
+ "experimentalFeature": {
+ "message": "Це експериментальна функція. При її використанні ви берете ризик на себе."
+ },
+ "defaultAutoFillOnPageLoad": {
+ "message": "Типове налаштування автозаповнення для записів входу"
+ },
+ "defaultAutoFillOnPageLoadDesc": {
+ "message": "Після увімкнення автозаповнення на сторінці ви можете увімкнути чи вимкнути цю функцію для окремих записів входу. Це налаштування є типовим для записів входу, які не мають окремого налаштування."
+ },
+ "itemAutoFillOnPageLoad": {
+ "message": "Автозаповнення на сторінці (якщо не увімкнено в налаштуваннях)"
+ },
+ "autoFillOnPageLoadUseDefault": {
+ "message": "Типове налаштування"
+ },
+ "autoFillOnPageLoadYes": {
+ "message": "Автозаповнення на сторінці"
+ },
+ "autoFillOnPageLoadNo": {
+ "message": "Не заповнювати автоматично"
+ },
+ "commandOpenPopup": {
+ "message": "Відкрити сховище у виринаючому вікні"
+ },
+ "commandOpenSidebar": {
+ "message": "Відкрити сховище у бічній панелі"
+ },
+ "commandAutofillDesc": {
+ "message": "Автозаповнення останнього використаного запису для цього вебсайту"
+ },
+ "commandGeneratePasswordDesc": {
+ "message": "Генерувати і копіювати новий випадковий пароль в буфер обміну"
+ },
+ "commandLockVaultDesc": {
+ "message": "Заблокувати сховище"
+ },
+ "privateModeMessage": {
+ "message": "Шкода, але це вікно недоступне в приватному режимі для цього браузера."
+ },
+ "customFields": {
+ "message": "Власні поля"
+ },
+ "copyValue": {
+ "message": "Копіювати значення"
+ },
+ "value": {
+ "message": "Значення"
+ },
+ "newCustomField": {
+ "message": "Нове власне поле"
+ },
+ "dragToSort": {
+ "message": "Перетягніть, щоб відсортувати"
+ },
+ "cfTypeText": {
+ "message": "Текст"
+ },
+ "cfTypeHidden": {
+ "message": "Приховано"
+ },
+ "cfTypeBoolean": {
+ "message": "Логічне значення"
+ },
+ "popup2faCloseMessage": {
+ "message": "Натискання поза межами спливаючого вікна для перевірки коду підтвердження в пошті спричинить його закриття. Хочете відкрити його в новому вікні, щоб воно не закрилося?"
+ },
+ "popupU2fCloseMessage": {
+ "message": "Цей браузер не може обробити U2F запити в цьому виринаючому вікні. Хочете відкрити його у новому вікні, щоб ви змогли увійти з використанням U2F?"
+ },
+ "disableFavicon": {
+ "message": "Вимкнути піктограми вебсайтів"
+ },
+ "disableFaviconDesc": {
+ "message": "Впізнавані піктограми вебсайтів додаються біля кожного запису вашого сховища."
+ },
+ "disableBadgeCounter": {
+ "message": "Вимкнути лічильник значка"
+ },
+ "disableBadgeCounterDesc": {
+ "message": "Лічильник значка показує кількість записів у сховищі для поточної сторінки."
+ },
+ "cardholderName": {
+ "message": "Ім'я власника картки"
+ },
+ "number": {
+ "message": "Номер"
+ },
+ "brand": {
+ "message": "Тип картки"
+ },
+ "expirationMonth": {
+ "message": "Місяць завершення"
+ },
+ "expirationYear": {
+ "message": "Рік завершення"
+ },
+ "expiration": {
+ "message": "Термін дії"
+ },
+ "january": {
+ "message": "Січень"
+ },
+ "february": {
+ "message": "Лютий"
+ },
+ "march": {
+ "message": "Березень"
+ },
+ "april": {
+ "message": "Квітень"
+ },
+ "may": {
+ "message": "Травень"
+ },
+ "june": {
+ "message": "Червень"
+ },
+ "july": {
+ "message": "Липень"
+ },
+ "august": {
+ "message": "Серпень"
+ },
+ "september": {
+ "message": "Вересень"
+ },
+ "october": {
+ "message": "Жовтень"
+ },
+ "november": {
+ "message": "Листопад"
+ },
+ "december": {
+ "message": "Грудень"
+ },
+ "securityCode": {
+ "message": "Код безпеки"
+ },
+ "ex": {
+ "message": "зразок"
+ },
+ "title": {
+ "message": "Звернення"
+ },
+ "mr": {
+ "message": "Містер"
+ },
+ "mrs": {
+ "message": "Місіс"
+ },
+ "ms": {
+ "message": "Міс"
+ },
+ "dr": {
+ "message": "Доктор"
+ },
+ "firstName": {
+ "message": "Ім’я"
+ },
+ "middleName": {
+ "message": "По батькові"
+ },
+ "lastName": {
+ "message": "Прізвище"
+ },
+ "identityName": {
+ "message": "Назва"
+ },
+ "company": {
+ "message": "Компанія"
+ },
+ "ssn": {
+ "message": "Номер соціального страхування"
+ },
+ "passportNumber": {
+ "message": "Номер паспорта"
+ },
+ "licenseNumber": {
+ "message": "Номер ліцензії"
+ },
+ "email": {
+ "message": "Е-пошта"
+ },
+ "phone": {
+ "message": "Телефон"
+ },
+ "address": {
+ "message": "Адреса"
+ },
+ "address1": {
+ "message": "Адреса 1"
+ },
+ "address2": {
+ "message": "Адреса 2"
+ },
+ "address3": {
+ "message": "Адреса 3"
+ },
+ "cityTown": {
+ "message": "Місто / Селище"
+ },
+ "stateProvince": {
+ "message": "Штат / Область"
+ },
+ "zipPostalCode": {
+ "message": "Поштовий індекс"
+ },
+ "country": {
+ "message": "Країна"
+ },
+ "type": {
+ "message": "Тип"
+ },
+ "typeLogin": {
+ "message": "Вхід"
+ },
+ "typeLogins": {
+ "message": "Записи входу"
+ },
+ "typeSecureNote": {
+ "message": "Захищена нотатка"
+ },
+ "typeCard": {
+ "message": "Картка"
+ },
+ "typeIdentity": {
+ "message": "Особисті дані"
+ },
+ "passwordHistory": {
+ "message": "Історія паролів"
+ },
+ "back": {
+ "message": "Назад"
+ },
+ "collections": {
+ "message": "Збірки"
+ },
+ "favorites": {
+ "message": "Обране"
+ },
+ "popOutNewWindow": {
+ "message": "Відкрити в новому вікні"
+ },
+ "refresh": {
+ "message": "Оновити"
+ },
+ "cards": {
+ "message": "Картки"
+ },
+ "identities": {
+ "message": "Особисті дані"
+ },
+ "logins": {
+ "message": "Записи входу"
+ },
+ "secureNotes": {
+ "message": "Захищені нотатки"
+ },
+ "clear": {
+ "message": "Стерти",
+ "description": "To clear something out. example: To clear browser history."
+ },
+ "checkPassword": {
+ "message": "Перевірити чи пароль було викрито."
+ },
+ "passwordExposed": {
+ "message": "Цей пароль було викрито $VALUE$ разів з витоком даних. Вам слід його змінити.",
+ "placeholders": {
+ "value": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "passwordSafe": {
+ "message": "Цей пароль не було знайдено у жодних відомих витоках даних. Його можна безпечно використовувати."
+ },
+ "baseDomain": {
+ "message": "Основний домен"
+ },
+ "host": {
+ "message": "Вузол",
+ "description": "A URL's host value. For example, the host of https://sub.domain.com:443 is 'sub.domain.com:443'."
+ },
+ "exact": {
+ "message": "Точно"
+ },
+ "startsWith": {
+ "message": "Починається з"
+ },
+ "regEx": {
+ "message": "Звичайний вираз",
+ "description": "A programming term, also known as 'RegEx'."
+ },
+ "matchDetection": {
+ "message": "Виявлення збігів",
+ "description": "URI match detection for auto-fill."
+ },
+ "defaultMatchDetection": {
+ "message": "Типове виявлення збігів",
+ "description": "Default URI match detection for auto-fill."
+ },
+ "toggleOptions": {
+ "message": "Перемкнути налаштування"
+ },
+ "toggleCurrentUris": {
+ "message": "Перемкнути поточні URL-адреси",
+ "description": "Toggle the display of the URIs of the currently open tabs in the browser."
+ },
+ "currentUri": {
+ "message": "Поточна URL-адреса",
+ "description": "The URI of one of the current open tabs in the browser."
+ },
+ "organization": {
+ "message": "Організація",
+ "description": "An entity of multiple related people (ex. a team or business organization)."
+ },
+ "types": {
+ "message": "Типи"
+ },
+ "allItems": {
+ "message": "Всі елементи"
+ },
+ "noPasswordsInList": {
+ "message": "Немає паролів."
+ },
+ "remove": {
+ "message": "Вилучити"
+ },
+ "default": {
+ "message": "Типово"
+ },
+ "dateUpdated": {
+ "message": "Оновлено",
+ "description": "ex. Date this item was updated"
+ },
+ "datePasswordUpdated": {
+ "message": "Пароль оновлено",
+ "description": "ex. Date this password was updated"
+ },
+ "neverLockWarning": {
+ "message": "Ви впевнені, що ніколи не хочете блокувати? Встановивши цю опцію, ключ шифрування вашого сховища зберігатиметься на вашому пристрої. Використовуючи цю опцію, вам слід бути певними в тому, що ваш пристрій має належний захист."
+ },
+ "noOrganizationsList": {
+ "message": "Ви не входите до жодної організації. Організації дозволяють безпечно обмінюватися елементами з іншими користувачами."
+ },
+ "noCollectionsInList": {
+ "message": "Немає збірок."
+ },
+ "ownership": {
+ "message": "Власник"
+ },
+ "whoOwnsThisItem": {
+ "message": "Хто є власником цього елемента?"
+ },
+ "strong": {
+ "message": "Надійний",
+ "description": "ex. A strong password. Scale: Weak -> Good -> Strong"
+ },
+ "good": {
+ "message": "Хороший",
+ "description": "ex. A good password. Scale: Weak -> Good -> Strong"
+ },
+ "weak": {
+ "message": "Слабкий",
+ "description": "ex. A weak password. Scale: Weak -> Good -> Strong"
+ },
+ "weakMasterPassword": {
+ "message": "Слабкий головний пароль"
+ },
+ "weakMasterPasswordDesc": {
+ "message": "Обраний вами головний пароль є слабким. Для належного захисту свого облікового запису Bitwarden, вам слід використовувати надійний головний пароль (або парольну фразу). Ви впевнені, що хочете використати цей пароль?"
+ },
+ "pin": {
+ "message": "PIN-код",
+ "description": "PIN code. Ex. The short code (often numeric) that you use to unlock a device."
+ },
+ "unlockWithPin": {
+ "message": "Розблокування з PIN-кодом"
+ },
+ "setYourPinCode": {
+ "message": "Встановіть PIN-код для розблокування Bitwarden. Налаштування PIN-коду будуть скинуті, якщо ви коли-небудь повністю вийдете з програми."
+ },
+ "pinRequired": {
+ "message": "Необхідний PIN-код."
+ },
+ "invalidPin": {
+ "message": "Неправильний PIN-код."
+ },
+ "verifyPin": {
+ "message": "Перевірка PIN"
+ },
+ "yourVaultIsLockedPinCode": {
+ "message": "Ваше сховище заблоковане. Для продовження підтвердьте свій PIN-код."
+ },
+ "unlockWithBiometrics": {
+ "message": "Розблокувати з біометрією"
+ },
+ "awaitDesktop": {
+ "message": "Очікується підтвердження з комп'ютера"
+ },
+ "awaitDesktopDesc": {
+ "message": "Для увімкнення біометрії в браузері, будь ласка, підтвердьте це у програмі Bitwarden на комп'ютері."
+ },
+ "lockWithMasterPassOnRestart": {
+ "message": "Блокувати головним паролем при перезапуску браузера"
+ },
+ "selectOneCollection": {
+ "message": "Ви повинні обрати принаймні одну збірку."
+ },
+ "cloneItem": {
+ "message": "Клонувати запис"
+ },
+ "clone": {
+ "message": "Клонувати"
+ },
+ "passwordGeneratorPolicyInEffect": {
+ "message": "На параметри генератора впливають одна чи декілька політик організації."
+ },
+ "vaultTimeoutAction": {
+ "message": "Дія після часу очікування сховища"
+ },
+ "lock": {
+ "message": "Блокувати",
+ "description": "Verb form: to make secure or inaccesible by"
+ },
+ "trash": {
+ "message": "Смітник",
+ "description": "Noun: a special folder to hold deleted items"
+ },
+ "searchTrash": {
+ "message": "Пошук у смітнику"
+ },
+ "permanentlyDeleteItem": {
+ "message": "Остаточно видалити запис"
+ },
+ "permanentlyDeleteItemConfirmation": {
+ "message": "Ви дійсно хочете остаточно видалити цей запис?"
+ },
+ "permanentlyDeletedItem": {
+ "message": "Запис остаточно видалено"
+ },
+ "restoreItem": {
+ "message": "Відновити запис"
+ },
+ "restoreItemConfirmation": {
+ "message": "Ви дійсно хочете відновити цей запис?"
+ },
+ "restoredItem": {
+ "message": "Запис відновлено"
+ },
+ "vaultTimeoutLogOutConfirmation": {
+ "message": "Вихід скасує всі права доступу до вашого сховища і вимагатиме авторизації після завершення часу очікування. Ви дійсно хочете використати цей параметр?"
+ },
+ "vaultTimeoutLogOutConfirmationTitle": {
+ "message": "Підтвердження дії часу очікування"
+ },
+ "autoFillAndSave": {
+ "message": "Заповнити і зберегти"
+ },
+ "autoFillSuccessAndSavedUri": {
+ "message": "Запис заповнено і збережено"
+ },
+ "autoFillSuccess": {
+ "message": "Запис заповнено"
+ },
+ "setMasterPassword": {
+ "message": "Встановити головний пароль"
+ },
+ "masterPasswordPolicyInEffect": {
+ "message": "Одна або декілька політик організації вимагають дотримання таких вимог для головного пароля:"
+ },
+ "policyInEffectMinComplexity": {
+ "message": "Мінімальний рівень складності $SCORE$",
+ "placeholders": {
+ "score": {
+ "content": "$1",
+ "example": "4"
+ }
+ }
+ },
+ "policyInEffectMinLength": {
+ "message": "Мінімальна довжина $LENGTH$",
+ "placeholders": {
+ "length": {
+ "content": "$1",
+ "example": "14"
+ }
+ }
+ },
+ "policyInEffectUppercase": {
+ "message": "Наявність одного чи більше символів верхнього регістру"
+ },
+ "policyInEffectLowercase": {
+ "message": "Наявність одного чи більше символів нижнього регістру"
+ },
+ "policyInEffectNumbers": {
+ "message": "Наявність однієї чи більше цифр"
+ },
+ "policyInEffectSpecial": {
+ "message": "Наявність одного чи більше таких спеціальних символів: $CHARS$",
+ "placeholders": {
+ "chars": {
+ "content": "$1",
+ "example": "!@#$%^&*"
+ }
+ }
+ },
+ "masterPasswordPolicyRequirementsNotMet": {
+ "message": "Ваш новий головний пароль не задовольняє вимоги політики."
+ },
+ "acceptPolicies": {
+ "message": "Позначивши цей прапорець, ви погоджуєтеся з:"
+ },
+ "acceptPoliciesError": {
+ "message": "Умови користування та політика приватності не погоджені."
+ },
+ "termsOfService": {
+ "message": "Умови користування"
+ },
+ "privacyPolicy": {
+ "message": "Політика приватності"
+ },
+ "hintEqualsPassword": {
+ "message": "Підказка для пароля не може бути такою самою, як ваш пароль."
+ },
+ "ok": {
+ "message": "Ok"
+ },
+ "desktopSyncVerificationTitle": {
+ "message": "Перевірка синхронізації на комп'ютері"
+ },
+ "desktopIntegrationVerificationText": {
+ "message": "Перевірте, чи програма на комп'ютері показує відбиток: "
+ },
+ "desktopIntegrationDisabledTitle": {
+ "message": "Інтеграція з браузером не увімкнена"
+ },
+ "desktopIntegrationDisabledDesc": {
+ "message": "Інтеграція з браузером не увімкнена в програмі Bitwarden на комп'ютері. Увімкніть її в налаштуваннях програми на комп'ютері."
+ },
+ "startDesktopTitle": {
+ "message": "Запустити програму Bitwarden на комп'ютері"
+ },
+ "startDesktopDesc": {
+ "message": "Для використання цієї функції необхідно запустити програму Bitwarden на комп'ютері."
+ },
+ "errorEnableBiometricTitle": {
+ "message": "Не вдається увімкнути біометрію"
+ },
+ "errorEnableBiometricDesc": {
+ "message": "Дію було скасовано програмою на комп'ютері"
+ },
+ "nativeMessagingInvalidEncryptionDesc": {
+ "message": "Програма на комп'ютері не схвалила безпечний канал зв'язку. Будь ласка, спробуйте знову"
+ },
+ "nativeMessagingInvalidEncryptionTitle": {
+ "message": "З'єднання з комп'ютером перервано"
+ },
+ "nativeMessagingWrongUserDesc": {
+ "message": "Програма на комп'ютері використовує інший обліковий запис. Переконайтеся, що програма й розширення використовують однаковий обліковий запис."
+ },
+ "nativeMessagingWrongUserTitle": {
+ "message": "Невідповідність облікових записів"
+ },
+ "biometricsNotEnabledTitle": {
+ "message": "Біометрію не увімкнено"
+ },
+ "biometricsNotEnabledDesc": {
+ "message": "Для активації біометрії в браузері необхідно спершу увімкнути біометрію в програмі на комп'ютері."
+ },
+ "biometricsNotSupportedTitle": {
+ "message": "Біометрія не підтримується"
+ },
+ "biometricsNotSupportedDesc": {
+ "message": "Біометрія в браузері не підтримується на цьому пристрої."
+ },
+ "nativeMessaginPermissionErrorTitle": {
+ "message": "Дозвіл не надано"
+ },
+ "nativeMessaginPermissionErrorDesc": {
+ "message": "Без дозволу з'єднання з програмою Bitwarden на комп'ютері неможливо використовувати біометрію в розширенні браузера. Спробуйте знову."
+ },
+ "nativeMessaginPermissionSidebarTitle": {
+ "message": "Помилка запиту дозволу"
+ },
+ "nativeMessaginPermissionSidebarDesc": {
+ "message": "Цю дію неможливо виконати в бічній панелі. Спробуйте знову в спливному чи окремому вікні."
+ },
+ "personalOwnershipSubmitError": {
+ "message": "У зв'язку з корпоративною політикою, вам не дозволено зберігати записи до особистого сховища. Змініть налаштування власності на організацію та виберіть серед доступних збірок."
+ },
+ "personalOwnershipPolicyInEffect": {
+ "message": "Політика організації впливає на ваші параметри власності."
+ },
+ "excludedDomains": {
+ "message": "Виключені домени"
+ },
+ "excludedDomainsDesc": {
+ "message": "Bitwarden не запитуватиме про збереження даних входу для цих доменів. Ви повинні оновити сторінку для застосування змін."
+ },
+ "excludedDomainsInvalidDomain": {
+ "message": "$DOMAIN$ не є дійсним доменом",
+ "placeholders": {
+ "domain": {
+ "content": "$1",
+ "example": "googlecom"
+ }
+ }
+ },
+ "send": {
+ "message": "Відправлення",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "searchSends": {
+ "message": "Пошук відправлень",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "addSend": {
+ "message": "Додати відправлення",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTypeText": {
+ "message": "Текст"
+ },
+ "sendTypeFile": {
+ "message": "Файл"
+ },
+ "allSends": {
+ "message": "Усі відправлення",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "maxAccessCountReached": {
+ "message": "Досягнуто максимальну кількість доступів"
+ },
+ "expired": {
+ "message": "Термін дії завершився"
+ },
+ "pendingDeletion": {
+ "message": "Очікується видалення"
+ },
+ "passwordProtected": {
+ "message": "Захищено паролем"
+ },
+ "copySendLink": {
+ "message": "Копіювати посилання відправлення",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "removePassword": {
+ "message": "Вилучити пароль"
+ },
+ "delete": {
+ "message": "Видалити"
+ },
+ "removedPassword": {
+ "message": "Пароль вилучено"
+ },
+ "deletedSend": {
+ "message": "Відправлення видалено",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendLink": {
+ "message": "Посилання на відправлення",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "disabled": {
+ "message": "Вимкнено"
+ },
+ "removePasswordConfirmation": {
+ "message": "Ви дійсно хочете вилучити пароль?"
+ },
+ "deleteSend": {
+ "message": "Видалити відправлення",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "deleteSendConfirmation": {
+ "message": "Ви дійсно хочете видалити це відправлення?",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "editSend": {
+ "message": "Змінити відправлення",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTypeHeader": {
+ "message": "Який це тип відправлення?",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendNameDesc": {
+ "message": "Опис цього відправлення.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendFileDesc": {
+ "message": "Файл, який ви хочете відправити."
+ },
+ "deletionDate": {
+ "message": "Дата видалення"
+ },
+ "deletionDateDesc": {
+ "message": "Відправлення буде остаточно видалено у вказаний час.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "expirationDate": {
+ "message": "Дата завершення"
+ },
+ "expirationDateDesc": {
+ "message": "Якщо встановлено, термін дії цього відправлення завершиться у вказаний час.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "oneDay": {
+ "message": "1 день"
+ },
+ "days": {
+ "message": "$DAYS$ днів",
+ "placeholders": {
+ "days": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "custom": {
+ "message": "Спеціальний"
+ },
+ "maximumAccessCount": {
+ "message": "Максимальна кількість доступів"
+ },
+ "maximumAccessCountDesc": {
+ "message": "Якщо встановлено, користувачі більше не зможуть отримати доступ до цього відправлення після досягнення максимальної кількості доступів.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendPasswordDesc": {
+ "message": "За бажанням вимагати пароль в користувачів для доступу до цього відправлення.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendNotesDesc": {
+ "message": "Особисті нотатки про це відправлення.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendDisableDesc": {
+ "message": "Деактивувати це відправлення для скасування доступу до нього.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendShareDesc": {
+ "message": "Копіювати посилання цього відправлення перед збереженням.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTextDesc": {
+ "message": "Текст, який ви хочете відправити."
+ },
+ "sendHideText": {
+ "message": "Приховувати текст цього відправлення.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "currentAccessCount": {
+ "message": "Поточна кількість доступів"
+ },
+ "createSend": {
+ "message": "Створити нове відправлення",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "newPassword": {
+ "message": "Новий пароль"
+ },
+ "sendDisabled": {
+ "message": "Відправлення вимкнено",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendDisabledWarning": {
+ "message": "У зв'язку з політикою компанії, ви можете лише видалити наявне відправлення.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "createdSend": {
+ "message": "Відправлення створено",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "editedSend": {
+ "message": "Відправлення змінено",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendLinuxChromiumFileWarning": {
+ "message": "Щоб вибрати файл, відкрийте розширення в бічній панелі (якщо можливо) або в новому вікні, натиснувши цей банер."
+ },
+ "sendFirefoxFileWarning": {
+ "message": "Щоб вибрати файл з використанням Firefox, відкрийте розширення в бічній панелі або в новому вікні, натиснувши цей банер."
+ },
+ "sendSafariFileWarning": {
+ "message": "Щоб вибрати файл з використанням Safari, відкрийте розширення в новому вікні, натиснувши на цей банер."
+ },
+ "sendFileCalloutHeader": {
+ "message": "Перед початком"
+ },
+ "sendFirefoxCustomDatePopoutMessage1": {
+ "message": "Щоб використовувати календарний стиль вибору дати",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read '**To use a calendar style date picker ** click here to pop out your window.'"
+ },
+ "sendFirefoxCustomDatePopoutMessage2": {
+ "message": "натисніть тут",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker **click here** to pop out your window.'"
+ },
+ "sendFirefoxCustomDatePopoutMessage3": {
+ "message": "щоб відкріпити ваше вікно.",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker click here **to pop out your window.**'"
+ },
+ "expirationDateIsInvalid": {
+ "message": "Вказано недійсний термін дії."
+ },
+ "deletionDateIsInvalid": {
+ "message": "Вказано недійсну дату видалення."
+ },
+ "expirationDateAndTimeRequired": {
+ "message": "Необхідно вказати час і дату терміну дії."
+ },
+ "deletionDateAndTimeRequired": {
+ "message": "Необхідно вказати час і дату видалення."
+ },
+ "dateParsingError": {
+ "message": "При збереженні дат видалення і терміну дії виникла помилка."
+ },
+ "hideEmail": {
+ "message": "Приховувати мою адресу електронної пошти від отримувачів."
+ },
+ "sendOptionsPolicyInEffect": {
+ "message": "На параметри відправлень впливають одна чи декілька політик організації."
+ },
+ "passwordPrompt": {
+ "message": "Повторний запит головного пароля"
+ },
+ "passwordConfirmation": {
+ "message": "Підтвердження головного пароля"
+ },
+ "passwordConfirmationDesc": {
+ "message": "Ця дія захищена. Щоб продовжити, повторно введіть головний пароль."
+ },
+ "emailVerificationRequired": {
+ "message": "Необхідно підтвердити е-пошту"
+ },
+ "emailVerificationRequiredDesc": {
+ "message": "Для використання цієї функції необхідно підтвердити електронну пошту. Ви можете виконати підтвердження у веб сховищі."
+ },
+ "updatedMasterPassword": {
+ "message": "Головний пароль оновлено"
+ },
+ "updateMasterPassword": {
+ "message": "Оновити головний пароль"
+ },
+ "updateMasterPasswordWarning": {
+ "message": "Ваш головний пароль нещодавно був змінений адміністратором організації. Щоб отримати доступ до сховища, ви повинні оновити його зараз. Продовживши, ви вийдете з поточного сеансу, після чого необхідно буде повторно виконати вхід. Сеанси на інших пристроях можуть залишатися активними протягом однієї години."
+ },
+ "resetPasswordPolicyAutoEnroll": {
+ "message": "Автоматичне розгортання"
+ },
+ "resetPasswordAutoEnrollInviteWarning": {
+ "message": "Ця організація має корпоративну політику, яка автоматично розгортає вас на скидання пароля. Розгортання дозволятиме адміністраторам організації змінювати ваш головний пароль."
+ },
+ "selectFolder": {
+ "message": "Обрати теку..."
+ },
+ "ssoCompleteRegistration": {
+ "message": "Щоб завершити налаштування входу з SSO, встановіть головний пароль для доступу і захисту сховища."
+ },
+ "hours": {
+ "message": "Годин"
+ },
+ "minutes": {
+ "message": "Хвилин"
+ },
+ "vaultTimeoutPolicyInEffect": {
+ "message": "Політики вашої організації впливають на час очікування сховища. Максимальний дозволений час очікування сховища $HOURS$ годин, $MINUTES$ хвилин",
+ "placeholders": {
+ "hours": {
+ "content": "$1",
+ "example": "5"
+ },
+ "minutes": {
+ "content": "$2",
+ "example": "5"
+ }
+ }
+ },
+ "vaultTimeoutToLarge": {
+ "message": "Час очікування сховища перевищує обмеження, встановлені вашою організацією."
+ },
+ "vaultExportDisabled": {
+ "message": "Експорт сховища вимкнено"
+ },
+ "personalVaultExportPolicyInEffect": {
+ "message": "Одна чи декілька організаційних політик не дозволяють вам експортувати особисте сховище."
+ },
+ "copyCustomFieldNameInvalidElement": {
+ "message": "Не вдається ідентифікувати дійсний елемент форми. Спробуйте натомість інспектувати HTML."
+ },
+ "copyCustomFieldNameNotUnique": {
+ "message": "Не знайдено унікальний ідентифікатор."
+ }
+}
diff --git a/src/iOS.Safari/Resources/_locales/vi/messages.json b/src/iOS.Safari/Resources/_locales/vi/messages.json
new file mode 100644
index 000000000..9561dcc32
--- /dev/null
+++ b/src/iOS.Safari/Resources/_locales/vi/messages.json
@@ -0,0 +1,1817 @@
+{
+ "appName": {
+ "message": "Bitwarden"
+ },
+ "extName": {
+ "message": "Bitwarden",
+ "description": "Extension name, MUST be less than 40 characters (Safari restriction)"
+ },
+ "extDesc": {
+ "message": "Một trình quản lý mật khẩu an toàn và miễn phí cho mọi thiết bị của bạn.",
+ "description": "Extension description"
+ },
+ "loginOrCreateNewAccount": {
+ "message": "Đăng nhập hoặc tạo tài khoản mới để truy cập kho mật khẩu của bạn."
+ },
+ "createAccount": {
+ "message": "Tạo Tài Khoản"
+ },
+ "login": {
+ "message": "Đăng Nhập"
+ },
+ "enterpriseSingleSignOn": {
+ "message": "Enterprise Single Sign-On"
+ },
+ "cancel": {
+ "message": "Hủy bỏ"
+ },
+ "close": {
+ "message": "Đóng"
+ },
+ "submit": {
+ "message": "Gửi"
+ },
+ "emailAddress": {
+ "message": "Địa chỉ Email"
+ },
+ "masterPass": {
+ "message": "Mật khẩu chính"
+ },
+ "masterPassDesc": {
+ "message": "Mật khẩu chủ là mật khẩu bạn sử dụng để truy cập kho mật khẩu của bạn. Nó rất quan trọng nên bạn không được quên mật khẩu chủ của mình. Không thể khôi phục lại mật khẩu chủ nếu bạn quên nó."
+ },
+ "masterPassHintDesc": {
+ "message": "Một gợi ý mật khẩu có thể giúp bạn nhớ lại mật khẩu chủ của bạn nếu bạn quên nó."
+ },
+ "reTypeMasterPass": {
+ "message": "Nhập lại mật khẩu chính"
+ },
+ "masterPassHint": {
+ "message": "Gợi ý mật khẩu chính (tùy chọn)"
+ },
+ "tab": {
+ "message": "Thẻ"
+ },
+ "myVault": {
+ "message": "Hầm của tôi"
+ },
+ "tools": {
+ "message": "Công cụ"
+ },
+ "settings": {
+ "message": "Cài đặt"
+ },
+ "currentTab": {
+ "message": "Thẻ hiện tại"
+ },
+ "copyPassword": {
+ "message": "Sao chép Mật khẩu"
+ },
+ "copyNote": {
+ "message": "Sao chép Ghi chú"
+ },
+ "copyUri": {
+ "message": "Sao chép URL"
+ },
+ "copyUsername": {
+ "message": "Sao chép tên đăng nhập"
+ },
+ "copyNumber": {
+ "message": "Sao chép Số"
+ },
+ "copySecurityCode": {
+ "message": "Sao chép Mã bảo mật"
+ },
+ "autoFill": {
+ "message": "Tự động điền"
+ },
+ "generatePasswordCopied": {
+ "message": "Tạo mật khẩu (đã sao chép)"
+ },
+ "copyElementIdentifier": {
+ "message": "Copy Custom Field Name"
+ },
+ "noMatchingLogins": {
+ "message": "Không có thông tin đăng nhập phù hợp."
+ },
+ "vaultLocked": {
+ "message": "Kho bị khóa."
+ },
+ "vaultLoggedOut": {
+ "message": "Kho đã bị đăng xuất."
+ },
+ "autoFillInfo": {
+ "message": "Không có thông tin đăng nhập nào sẵn có để tự động điền vào tab hiện tại."
+ },
+ "addLogin": {
+ "message": "Thêm một Đăng nhập"
+ },
+ "addItem": {
+ "message": "Thêm Mục"
+ },
+ "passwordHint": {
+ "message": "Gợi ý mật khẩu"
+ },
+ "enterEmailToGetHint": {
+ "message": "Nhập địa chỉ email tài khoản của bạn để nhận gợi ý mật khẩu chủ."
+ },
+ "getMasterPasswordHint": {
+ "message": "Nhận gợi ý mật khẩu chủ"
+ },
+ "continue": {
+ "message": "Tiếp tục"
+ },
+ "verificationCode": {
+ "message": "Mã xác nhận"
+ },
+ "account": {
+ "message": "Tài khoản"
+ },
+ "changeMasterPassword": {
+ "message": "Thay đổi mật khẩu chính"
+ },
+ "fingerprintPhrase": {
+ "message": "Fingerprint Phrase",
+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
+ },
+ "yourAccountsFingerprint": {
+ "message": "Cụm từ mật khẩu của tài khoản của bạn",
+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
+ },
+ "twoStepLogin": {
+ "message": "Xác thực hai lớp"
+ },
+ "logOut": {
+ "message": "Đăng xuất"
+ },
+ "about": {
+ "message": "Thông tin"
+ },
+ "version": {
+ "message": "Phiên bản"
+ },
+ "save": {
+ "message": "Lưu"
+ },
+ "move": {
+ "message": "Move"
+ },
+ "addFolder": {
+ "message": "Thêm thư mục"
+ },
+ "name": {
+ "message": "Tên mục"
+ },
+ "editFolder": {
+ "message": "Chỉnh sửa thư mục"
+ },
+ "deleteFolder": {
+ "message": "Xóa thư mục"
+ },
+ "folders": {
+ "message": "Thư mục"
+ },
+ "noFolders": {
+ "message": "Không có thư mục để liệt kê."
+ },
+ "helpFeedback": {
+ "message": "Trợ giúp & Phản hồi"
+ },
+ "sync": {
+ "message": "Đồng bộ"
+ },
+ "syncVaultNow": {
+ "message": "Đồng bộ Kho mật khẩu ngay"
+ },
+ "lastSync": {
+ "message": "Lần đồng bộ gần nhất:"
+ },
+ "passGen": {
+ "message": "Tạo mật khẩu"
+ },
+ "generator": {
+ "message": "Tạo mật khẩu",
+ "description": "Short for 'Password Generator'."
+ },
+ "passGenInfo": {
+ "message": "Tự động tạo mật khẩu mạnh mẽ, duy nhất cho đăng nhập của bạn."
+ },
+ "bitWebVault": {
+ "message": "Hầm bitwarden trên Web"
+ },
+ "importItems": {
+ "message": "Nhập mục"
+ },
+ "select": {
+ "message": "Chọn"
+ },
+ "generatePassword": {
+ "message": "Tạo mật khẩu"
+ },
+ "regeneratePassword": {
+ "message": "Tạo lại mật khẩu"
+ },
+ "options": {
+ "message": "Tùy chọn"
+ },
+ "length": {
+ "message": "Độ dài"
+ },
+ "numWords": {
+ "message": "Number of Words"
+ },
+ "wordSeparator": {
+ "message": "Word Separator"
+ },
+ "capitalize": {
+ "message": "Viết hoa",
+ "description": "Make the first letter of a work uppercase."
+ },
+ "includeNumber": {
+ "message": "Bao gồm cả số"
+ },
+ "minNumbers": {
+ "message": "Số kí tự tối thiểu"
+ },
+ "minSpecial": {
+ "message": "Số kí tự đặc biệt tối thiểu"
+ },
+ "avoidAmbChar": {
+ "message": "Tránh các ký tự không rõ ràng"
+ },
+ "searchVault": {
+ "message": "Tìm kiếm trong kho"
+ },
+ "edit": {
+ "message": "Sửa"
+ },
+ "view": {
+ "message": "Xem"
+ },
+ "noItemsInList": {
+ "message": "Không có mục nào để liệt kê."
+ },
+ "itemInformation": {
+ "message": "Mục thông tin"
+ },
+ "username": {
+ "message": "Tên người dùng"
+ },
+ "password": {
+ "message": "Mật khẩu"
+ },
+ "passphrase": {
+ "message": "Cụm từ mật khẩu"
+ },
+ "favorite": {
+ "message": "Yêu thích"
+ },
+ "notes": {
+ "message": "Ghi chú"
+ },
+ "note": {
+ "message": "Ghi chú"
+ },
+ "editItem": {
+ "message": "Chỉnh sửa mục"
+ },
+ "folder": {
+ "message": "Thư mục"
+ },
+ "deleteItem": {
+ "message": "Xóa mục"
+ },
+ "viewItem": {
+ "message": "Xem mục"
+ },
+ "launch": {
+ "message": "Khởi chạy"
+ },
+ "website": {
+ "message": "Trang web"
+ },
+ "toggleVisibility": {
+ "message": "Bật/tắt khả năng hiển thị"
+ },
+ "manage": {
+ "message": "Quản lý"
+ },
+ "other": {
+ "message": "Khác"
+ },
+ "rateExtension": {
+ "message": "Đánh giá tiện ích mở rộng"
+ },
+ "rateExtensionDesc": {
+ "message": "Xin hãy nhìn nhận và đánh giá tốt cho chúng tôi!"
+ },
+ "browserNotSupportClipboard": {
+ "message": "Trình duyệt web của bạn không hỗ trợ dễ dàng sao chép bộ nhớ tạm. Bạn có thể sao chép nó theo cách thủ công để thay thế."
+ },
+ "verifyMasterPassword": {
+ "message": "Nhập lại mật khẩu chính"
+ },
+ "yourVaultIsLocked": {
+ "message": "Kho của bạn đã bị khóa. Xác minh mật khẩu chính của bạn để mở."
+ },
+ "unlock": {
+ "message": "Mở khóa"
+ },
+ "loggedInAsOn": {
+ "message": "Đã đăng nhập là $EMAIL$ trên $HOSTNAME$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "name@example.com"
+ },
+ "hostname": {
+ "content": "$2",
+ "example": "bitwarden.com"
+ }
+ }
+ },
+ "invalidMasterPassword": {
+ "message": "Mật khẩu chủ không hợp lệ"
+ },
+ "vaultTimeout": {
+ "message": "Thời Gian Chờ Của Kho"
+ },
+ "lockNow": {
+ "message": "Khóa ngay"
+ },
+ "immediately": {
+ "message": "Tức thì"
+ },
+ "tenSeconds": {
+ "message": "10 giây"
+ },
+ "twentySeconds": {
+ "message": "20 giây"
+ },
+ "thirtySeconds": {
+ "message": "30 giây"
+ },
+ "oneMinute": {
+ "message": "1 phút"
+ },
+ "twoMinutes": {
+ "message": "2 phút"
+ },
+ "fiveMinutes": {
+ "message": "5 phút"
+ },
+ "fifteenMinutes": {
+ "message": "15 phút"
+ },
+ "thirtyMinutes": {
+ "message": "30 phút"
+ },
+ "oneHour": {
+ "message": "1 giờ"
+ },
+ "fourHours": {
+ "message": "4 giờ"
+ },
+ "onLocked": {
+ "message": "Mỗi khi khóa"
+ },
+ "onRestart": {
+ "message": "Mỗi khi khởi động lại trình duyệt"
+ },
+ "never": {
+ "message": "Không bao giờ"
+ },
+ "security": {
+ "message": "Bảo mật"
+ },
+ "errorOccurred": {
+ "message": "Đã xảy ra lỗi chưa xác định"
+ },
+ "emailRequired": {
+ "message": "Địa chỉ email là bắt buộc."
+ },
+ "invalidEmail": {
+ "message": "Địa chỉ email không hợp lệ."
+ },
+ "masterPassRequired": {
+ "message": "Mật khẩu chủ là bắt buộc."
+ },
+ "masterPassLength": {
+ "message": "Mật khẩu chủ phải có ít nhất 8 kí tự."
+ },
+ "masterPassDoesntMatch": {
+ "message": "Xác nhận mật khẩu chủ không khớp."
+ },
+ "newAccountCreated": {
+ "message": "Tài khoản của bạn đã được tạo. Bạn có thể đăng nhập bây giờ."
+ },
+ "masterPassSent": {
+ "message": "Chúng tôi đã gửi cho bạn email có chứa gợi ý mật khẩu chủ của bạn."
+ },
+ "verificationCodeRequired": {
+ "message": "Yêu cầu mã xác nhận."
+ },
+ "valueCopied": {
+ "message": "$VALUE$ đã sao chép",
+ "description": "Value has been copied to the clipboard.",
+ "placeholders": {
+ "value": {
+ "content": "$1",
+ "example": "Password"
+ }
+ }
+ },
+ "autofillError": {
+ "message": "Tự động điền thông tin đăng nhập trong hoạt động trên trang này. Bạn có thể thực hiện thủ công bằng cách sao chép/dán thông tin đăng nhập."
+ },
+ "loggedOut": {
+ "message": "Đăng xuất"
+ },
+ "loginExpired": {
+ "message": "Phiên đăng nhập của bạn đã hết hạn."
+ },
+ "logOutConfirmation": {
+ "message": "Bạn có chắc chắn muốn đăng xuất không?"
+ },
+ "yes": {
+ "message": "Có"
+ },
+ "no": {
+ "message": "Không"
+ },
+ "unexpectedError": {
+ "message": "Một lỗi bất ngờ đã xảy ra."
+ },
+ "nameRequired": {
+ "message": "Tên là bắt buộc."
+ },
+ "addedFolder": {
+ "message": "Thêm thư mục"
+ },
+ "changeMasterPass": {
+ "message": "Thay đổi mật khẩu chính"
+ },
+ "changeMasterPasswordConfirmation": {
+ "message": "Bạn có thể thay đổi mật khẩu chủ trong trang web Bitwarden. Bạn có muốn truy cập bitwarden.com bây giờ?"
+ },
+ "twoStepLoginConfirmation": {
+ "message": "Xác thực hai lớp giúp cho tài khoản của bạn an toàn hơn bằng cách yêu cầu bạn xác minh thông tin đăng nhập của bạn bằng một thiết bị khác như khóa bảo mật, ứng dụng xác thực, SMS, cuộc gọi điện thoại hoặc email. Bạn có thể bật xác thực hai lớp trong trang web Bitwarden. Bạn có muốn ghé thăm bitwarden.com bây giờ?"
+ },
+ "editedFolder": {
+ "message": "Chỉnh sửa Thư mục"
+ },
+ "deleteFolderConfirmation": {
+ "message": "Bạn có chắc chắn muốn xóa thư mục này không?"
+ },
+ "deletedFolder": {
+ "message": "Đã xóa thư mục"
+ },
+ "gettingStartedTutorial": {
+ "message": "Hướng dẫn Bắt đầu"
+ },
+ "gettingStartedTutorialVideo": {
+ "message": "Xem hướng dẫn bắt đầu của chúng tôi để tìm hiểu cách tận dụng tối đa tiện ích mở rộng của trình duyệt."
+ },
+ "syncingComplete": {
+ "message": "Đồng bộ hoàn tất"
+ },
+ "syncingFailed": {
+ "message": "Đồng bộ thất bại"
+ },
+ "passwordCopied": {
+ "message": "Đã sao chép mật khẩu"
+ },
+ "uri": {
+ "message": "Đường dẫn"
+ },
+ "uriPosition": {
+ "message": "URL $POSITION$",
+ "description": "A listing of URIs. Ex: URI 1, URI 2, URI 3, etc.",
+ "placeholders": {
+ "position": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "newUri": {
+ "message": "URL Mới"
+ },
+ "addedItem": {
+ "message": "Đã thêm mục"
+ },
+ "editedItem": {
+ "message": "Mục được chỉnh sửa"
+ },
+ "deleteItemConfirmation": {
+ "message": "Bạn có chắc bạn muốn xóa mục này?"
+ },
+ "deletedItem": {
+ "message": "Đã xóa mục"
+ },
+ "overwritePassword": {
+ "message": "Ghi đè lên mật khẩu"
+ },
+ "overwritePasswordConfirmation": {
+ "message": "Bạn có chắc chắn muốn ghi đè mật khẩu hiện tại không?"
+ },
+ "searchFolder": {
+ "message": "Tìm kiếm thư mục"
+ },
+ "searchCollection": {
+ "message": "Tìm kiếm bộ sưu tập"
+ },
+ "searchType": {
+ "message": "Tìm mục"
+ },
+ "noneFolder": {
+ "message": "Không có thư mục",
+ "description": "This is the folder for uncategorized items"
+ },
+ "disableAddLoginNotification": {
+ "message": "Vô hiệu thông báo Thêm đăng nhập"
+ },
+ "addLoginNotificationDesc": {
+ "message": "'Thông báo Thêm đăng nhập' sẽ tự động nhắc bạn lưu các đăng nhập mới vào hầm an toàn của bạn bất cứ khi nào bạn đăng nhập trang web lần đầu tiên."
+ },
+ "dontShowCardsCurrentTab": {
+ "message": "Don't Show Cards on Tab Page"
+ },
+ "dontShowCardsCurrentTabDesc": {
+ "message": "Card items from your vault are listed on the 'Current Tab' page for easy auto-fill access."
+ },
+ "dontShowIdentitiesCurrentTab": {
+ "message": "Don't Show Identities on Tab Page"
+ },
+ "dontShowIdentitiesCurrentTabDesc": {
+ "message": "Identity items from your vault are listed on the 'Current Tab' page for easy auto-fill access."
+ },
+ "clearClipboard": {
+ "message": "Dọn dẹp khay nhớ tạm",
+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
+ },
+ "clearClipboardDesc": {
+ "message": "Tự động dọn dẹp giá trị được sao chép khỏi khay nhớ tạm của bạn.",
+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
+ },
+ "notificationAddDesc": {
+ "message": "Bạn có cần Bitwarden nhớ giúp bạn mật khẩu này không?"
+ },
+ "notificationAddSave": {
+ "message": "Vâng, Lưu Ngay"
+ },
+ "notificationNeverSave": {
+ "message": "Không bao giờ lưu thông tin từ trang này"
+ },
+ "disableChangedPasswordNotification": {
+ "message": "Disable Changed Password Notification"
+ },
+ "disableChangedPasswordNotificationDesc": {
+ "message": "The \"Changed Password Notification\" automatically prompts you to update a login's password in your vault whenever it detects that you have changed it on a website."
+ },
+ "notificationChangeDesc": {
+ "message": "Bạn có muốn cập nhật mật khẩu này trên Bitwarden không?"
+ },
+ "notificationChangeSave": {
+ "message": "Yes, Update Now"
+ },
+ "disableContextMenuItem": {
+ "message": "Tắt tuỳ chọn trong Menu Ngữ Cảnh"
+ },
+ "disableContextMenuItemDesc": {
+ "message": "Tùy chọn menu ngữ cảnh giúp bạn truy cập nhanh thông tin đăng nhập và tạo mật khẩu cho trang web trong tab mà bạn đang mở."
+ },
+ "defaultUriMatchDetection": {
+ "message": "Phương thức kiểm tra URI mặc định",
+ "description": "Default URI match detection for auto-fill."
+ },
+ "defaultUriMatchDetectionDesc": {
+ "message": "Chọn phương thức mặc định để kiểm tra so sánh URI cho các đăng nhập khi xử lí các hành động như là tự động điền."
+ },
+ "theme": {
+ "message": "Giao diện"
+ },
+ "themeDesc": {
+ "message": "Thay đổi màu sắc ứng dụng."
+ },
+ "dark": {
+ "message": "Tối",
+ "description": "Dark color"
+ },
+ "light": {
+ "message": "Sáng",
+ "description": "Light color"
+ },
+ "solarizedDark": {
+ "message": "Solarized Dark",
+ "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated."
+ },
+ "exportVault": {
+ "message": "Xuất Kho"
+ },
+ "fileFormat": {
+ "message": "File Format"
+ },
+ "warning": {
+ "message": "CẢNH BÁO",
+ "description": "WARNING (should stay in capitalized letters if the language permits)"
+ },
+ "confirmVaultExport": {
+ "message": "Confirm Vault Export"
+ },
+ "exportWarningDesc": {
+ "message": "This export contains your vault data in an unencrypted format. You should not store or send the exported file over unsecure channels (such as email). Delete it immediately after you are done using it."
+ },
+ "encExportKeyWarningDesc": {
+ "message": "This export encrypts your data using your account's encryption key. If you ever rotate your account's encryption key you should export again since you will not be able to decrypt this export file."
+ },
+ "encExportAccountWarningDesc": {
+ "message": "Account encryption keys are unique to each Bitwarden user account, so you can't import an encrypted export into a different account."
+ },
+ "exportMasterPassword": {
+ "message": "Nhập mật khẩu chủ để xuất kho dữ liệu của bạn."
+ },
+ "shared": {
+ "message": "Đã chia sẻ"
+ },
+ "learnOrg": {
+ "message": "Learn about Organizations"
+ },
+ "learnOrgConfirmation": {
+ "message": "Bitwarden allows you to share your vault items with others by using an organization. Would you like to visit the bitwarden.com website to learn more?"
+ },
+ "moveToOrganization": {
+ "message": "Move to Organization"
+ },
+ "share": {
+ "message": "Chia sẻ"
+ },
+ "movedItemToOrg": {
+ "message": "$ITEMNAME$ moved to $ORGNAME$",
+ "placeholders": {
+ "itemname": {
+ "content": "$1",
+ "example": "Secret Item"
+ },
+ "orgname": {
+ "content": "$2",
+ "example": "Company Name"
+ }
+ }
+ },
+ "moveToOrgDesc": {
+ "message": "Choose an organization that you wish to move this item to. Moving to an organization transfers ownership of the item to that organization. You will no longer be the direct owner of this item once it has been moved."
+ },
+ "learnMore": {
+ "message": "Tìm hiểu thêm"
+ },
+ "authenticatorKeyTotp": {
+ "message": "Khóa xác thực (TOTP)"
+ },
+ "verificationCodeTotp": {
+ "message": "Mã xác thực (TOTP)"
+ },
+ "copyVerificationCode": {
+ "message": "Sao chép Mã xác thực"
+ },
+ "attachments": {
+ "message": "Tệp đính kèm"
+ },
+ "deleteAttachment": {
+ "message": "Xóa tệp đính kèm"
+ },
+ "deleteAttachmentConfirmation": {
+ "message": "Bạn có muốn xóa tệp đính kèm này không?"
+ },
+ "deletedAttachment": {
+ "message": "Đã xoá tệp đính kèm"
+ },
+ "newAttachment": {
+ "message": "Thêm tệp đính kèm mới"
+ },
+ "noAttachments": {
+ "message": "Không có tệp đính kèm."
+ },
+ "attachmentSaved": {
+ "message": "Tệp đính kèm đã được lưu."
+ },
+ "file": {
+ "message": "Tập tin"
+ },
+ "selectFile": {
+ "message": "Chọn 1 tập tin."
+ },
+ "maxFileSize": {
+ "message": "Kích thước tối đa của tệp tin là 500MB."
+ },
+ "featureUnavailable": {
+ "message": "Tính năng không có sẵn"
+ },
+ "updateKey": {
+ "message": "Bạn không thể sử dụng tính năng này cho đến khi bạn cập nhật khoá mã hóa."
+ },
+ "premiumMembership": {
+ "message": "Thành viên Cao Cấp"
+ },
+ "premiumManage": {
+ "message": "Quản lý Thành viên"
+ },
+ "premiumManageAlert": {
+ "message": "Bạn có thể quản lý các thành viên trong trang web Bitwarden. Bạn có muốn truy cập bitwarden.com bây giờ?"
+ },
+ "premiumRefresh": {
+ "message": "Làm mới thành viên"
+ },
+ "premiumNotCurrentMember": {
+ "message": "Bạn hiện không phải là một thành viên cao cấp."
+ },
+ "premiumSignUpAndGet": {
+ "message": "Đăng ký làm thành viên cao cấp và nhận được:"
+ },
+ "ppremiumSignUpStorage": {
+ "message": "1GB bộ nhớ lưu trữ tập tin được mã hóa."
+ },
+ "ppremiumSignUpTwoStep": {
+ "message": "Các tùy chọn xác thực hai lớp bổ sung như YubiKey, FIDO U2F và Duo."
+ },
+ "ppremiumSignUpReports": {
+ "message": "Thanh lọc mật khẩu, kiểm tra an toàn tài khoản và các báo cáo rò rĩ dữ liệu là để giữ cho kho của bạn an toàn."
+ },
+ "ppremiumSignUpTotp": {
+ "message": "Mã xác nhận TOTP (2FA) để đăng nhập vào kho mật khẩu của bạn."
+ },
+ "ppremiumSignUpSupport": {
+ "message": "Hỗ trợ khách hàng ưu tiên."
+ },
+ "ppremiumSignUpFuture": {
+ "message": "Tất cả các tính năng cao cấp trong tương lai. Nó sẽ sớm xuất hiện!"
+ },
+ "premiumPurchase": {
+ "message": "Mua bản Cao Cấp"
+ },
+ "premiumPurchaseAlert": {
+ "message": "Bạn có thể nâng cấp làm thành viên cao cấp trong trang web Bitwarden. Bạn có muốn truy cập bitwarden.com bây giờ?"
+ },
+ "premiumCurrentMember": {
+ "message": "Bạn là một thành viên cao cấp!"
+ },
+ "premiumCurrentMemberThanks": {
+ "message": "Cảm ơn bạn đã hỗ trợ Bitwarden."
+ },
+ "premiumPrice": {
+ "message": "Tất cả chỉ với $PRICE$ /năm!",
+ "placeholders": {
+ "price": {
+ "content": "$1",
+ "example": "$10"
+ }
+ }
+ },
+ "refreshComplete": {
+ "message": "Làm mới hoàn tất"
+ },
+ "disableAutoTotpCopy": {
+ "message": "Vô hiệu hoá tự động sao chép TOTP"
+ },
+ "disableAutoTotpCopyDesc": {
+ "message": "Nếu đăng nhập của bạn có một khóa xác thực gắn liền với nó, mã xác nhận TOTP sẽ được tự động sao chép vào bộ nhớ tạm của bạn bất cứ khi nào bạn tự động điền thông tin đăng nhập."
+ },
+ "disableAutoBiometricsPrompt": {
+ "message": "Do not prompt for biometrics on launch"
+ },
+ "premiumRequired": {
+ "message": "Cần có tài khoản cao cấp"
+ },
+ "premiumRequiredDesc": {
+ "message": "Cần là thành viên cao cấp để sử dụng tính năng này."
+ },
+ "enterVerificationCodeApp": {
+ "message": "Nhập mã xác nhận 6 chữ số từ ứng dụng xác thực của bạn."
+ },
+ "enterVerificationCodeEmail": {
+ "message": "Nhập mã xác nhận 6 chữ số đã được gửi tới $EMAIL$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "example@gmail.com"
+ }
+ }
+ },
+ "verificationCodeEmailSent": {
+ "message": "Email xác minh được gửi tới $EMAIL$.",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "example@gmail.com"
+ }
+ }
+ },
+ "rememberMe": {
+ "message": "Ghi nhớ đăng nhập"
+ },
+ "sendVerificationCodeEmailAgain": {
+ "message": "Gửi lại email chứa mã xác nhận"
+ },
+ "useAnotherTwoStepMethod": {
+ "message": "Sử dụng phương pháp xác thực hai lớp khác"
+ },
+ "insertYubiKey": {
+ "message": "Lắp YubiKey vào cổng USB máy tính của bạn, sau đó chạm vào nút trên nó."
+ },
+ "insertU2f": {
+ "message": "Lắp khóa bảo mật vào cổng USB của máy tính. Nếu nó có một nút, nhấn vào nó."
+ },
+ "webAuthnNewTab": {
+ "message": "To start the WebAuthn 2FA verification. Click the button below to open a new tab and follow the instructions provided in the new tab."
+ },
+ "webAuthnNewTabOpen": {
+ "message": "Open new tab"
+ },
+ "webAuthnAuthenticate": {
+ "message": "Authenticate WebAuthn"
+ },
+ "loginUnavailable": {
+ "message": "Đăng nhập không sẵn có"
+ },
+ "noTwoStepProviders": {
+ "message": "Tài khoản này đã kích hoạt xác thực hai lớp, tuy nhiên, trình duyệt này không hỗ trợ cấu hình dịch vụ xác thực hai lớp đang sử dụng."
+ },
+ "noTwoStepProviders2": {
+ "message": "Vui lòng sử dụng trình duyệt web được hỗ trợ (chẳng hạn như Chrome) và/hoặc thêm dịch vụ bổ sung được hỗ trợ tốt hơn trên các trình duyệt web (chẳng hạn như một ứng dụng xác thực)."
+ },
+ "twoStepOptions": {
+ "message": "Tùy chọn xác thực hai lớp"
+ },
+ "recoveryCodeDesc": {
+ "message": "Bạn mất quyền truy cập vào tất cả các dịch vụ xác thực 2 lớp? Sử dụng mã phục hồi của bạn để vô hiệu hóa tất cả các dịch vụ xác thực hai lớp trong tài khoản của bạn."
+ },
+ "recoveryCodeTitle": {
+ "message": "Mã phục hồi"
+ },
+ "authenticatorAppTitle": {
+ "message": "Ứng dụng Authenticator"
+ },
+ "authenticatorAppDesc": {
+ "message": "Sử dụng một ứng dụng xác thực (chẳng hạn như Authy hoặc Google Authenticator) để tạo các mã xác nhận theo thời gian thực.",
+ "description": "'Authy' and 'Google Authenticator' are product names and should not be translated."
+ },
+ "yubiKeyTitle": {
+ "message": "Khóa bảo mật YubiKey OTP"
+ },
+ "yubiKeyDesc": {
+ "message": "Sử dụng YubiKey để truy cập tài khoản của bạn. Làm việc với thiết bị YubiKey 4, 4 Nano, 4C và NEO."
+ },
+ "duoDesc": {
+ "message": "Xác minh với Duo Security sử dụng ứng dụng Duo Mobile, SMS, cuộc gọi điện thoại, hoặc khoá bảo mật U2F.",
+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
+ },
+ "duoOrganizationDesc": {
+ "message": "Xác minh với Duo Security cho tổ chức của bạn sử dụng ứng dụng Duo Mobile, SMS, cuộc gọi điện thoại, hoặc khoá bảo mật U2F.",
+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
+ },
+ "webAuthnTitle": {
+ "message": "FIDO2 WebAuthn"
+ },
+ "webAuthnDesc": {
+ "message": "Use any WebAuthn enabled security key to access your account."
+ },
+ "emailTitle": {
+ "message": "Email"
+ },
+ "emailDesc": {
+ "message": "Mã xác thực sẽ được gửi qua email cho bạn."
+ },
+ "selfHostedEnvironment": {
+ "message": "Môi trường độc lập"
+ },
+ "selfHostedEnvironmentFooter": {
+ "message": "Chỉ định liên kết cơ bản của cài đặt bitwarden tại chỗ của bạn."
+ },
+ "customEnvironment": {
+ "message": "Môi trường tùy chỉnh"
+ },
+ "customEnvironmentFooter": {
+ "message": "Đối với người dùng nâng cao. Bạn có thể chỉ định liên kết cơ bản của mỗi dịch vụ một cách độc lập."
+ },
+ "baseUrl": {
+ "message": "Địa chỉ máy chủ"
+ },
+ "apiUrl": {
+ "message": "Địa chỉ API máy chủ"
+ },
+ "webVaultUrl": {
+ "message": "Địa chỉ máy chủ kho web"
+ },
+ "identityUrl": {
+ "message": "Địa chỉ nhận dạng máy chủ"
+ },
+ "notificationsUrl": {
+ "message": "Notifications Server URL"
+ },
+ "iconsUrl": {
+ "message": "Biểu tượng địa chỉ máy chủ"
+ },
+ "environmentSaved": {
+ "message": "Địa chỉ môi trường đã được lưu."
+ },
+ "enableAutoFillOnPageLoad": {
+ "message": "Bật Tự động điền vào Tải trang"
+ },
+ "enableAutoFillOnPageLoadDesc": {
+ "message": "Nếu có một biểu mẫu đăng nhập được phát hiện, thực hiện tự động điền khi trang web tải xong."
+ },
+ "experimentalFeature": {
+ "message": "Đây là một tính năng thử nghiệm. Sử dụng nó có thể gây ra rủi ro cho bạn."
+ },
+ "defaultAutoFillOnPageLoad": {
+ "message": "Default autofill setting for login items"
+ },
+ "defaultAutoFillOnPageLoadDesc": {
+ "message": "After enabling Auto-fill on Page Load, you can enable or disable the feature for individual login items. This is the default setting for login items that are not separately configured."
+ },
+ "itemAutoFillOnPageLoad": {
+ "message": "Auto-fill on Page Load (if enabled in Options)"
+ },
+ "autoFillOnPageLoadUseDefault": {
+ "message": "Use default setting"
+ },
+ "autoFillOnPageLoadYes": {
+ "message": "Auto-fill on page load"
+ },
+ "autoFillOnPageLoadNo": {
+ "message": "Do not auto-fill on page load"
+ },
+ "commandOpenPopup": {
+ "message": "Mở popup kho"
+ },
+ "commandOpenSidebar": {
+ "message": "Mở kho ở thanh bên"
+ },
+ "commandAutofillDesc": {
+ "message": "Tự động điền thông tin đăng nhập người dùng cho trang web hiện tại."
+ },
+ "commandGeneratePasswordDesc": {
+ "message": "Tạo và sao chép một mật khẩu ngẫu nhiên mới vào bộ nhớ tạm."
+ },
+ "commandLockVaultDesc": {
+ "message": "Lock the vault"
+ },
+ "privateModeMessage": {
+ "message": "Rất tiếc, cửa sổ này không khả dụng trong chế độ riêng tư của trình duyệt này."
+ },
+ "customFields": {
+ "message": "Trường tùy chỉnh"
+ },
+ "copyValue": {
+ "message": "Sao chép giá trị"
+ },
+ "value": {
+ "message": "Giá trị"
+ },
+ "newCustomField": {
+ "message": "Trường tùy chỉnh mới"
+ },
+ "dragToSort": {
+ "message": "Kéo để sắp xếp"
+ },
+ "cfTypeText": {
+ "message": "Văn bản"
+ },
+ "cfTypeHidden": {
+ "message": "Ẩn"
+ },
+ "cfTypeBoolean": {
+ "message": "Đúng/Sai"
+ },
+ "popup2faCloseMessage": {
+ "message": "Nhấp bên ngoài popup để xem mã xác thực trong email của bạn sẽ làm cho popup này đóng lại. Bạn có muốn mở popup này trong một cửa sổ mới để nó không bị đóng?"
+ },
+ "popupU2fCloseMessage": {
+ "message": "Trình duyệt này không thể xử lý các yêu cầu U2F trong cửa sổ popup này. Bạn có muốn mở popup này trong cửa sổ mới để bạn có thể đăng nhập thông qua U2F?"
+ },
+ "disableFavicon": {
+ "message": "Vô hiệu hoá biểu tượng trang web"
+ },
+ "disableFaviconDesc": {
+ "message": "Biểu tượng trang web cung cấp các biểu tượng nhận dạng trang web bên cạnh mỗi mục đăng nhập trong kho mật khẩu của bạn."
+ },
+ "disableBadgeCounter": {
+ "message": "Disable Badge Counter"
+ },
+ "disableBadgeCounterDesc": {
+ "message": "Badge counter indicates how many logins you have for the current page in your vault."
+ },
+ "cardholderName": {
+ "message": "Tên chủ thẻ"
+ },
+ "number": {
+ "message": "Số"
+ },
+ "brand": {
+ "message": "Thương hiệu"
+ },
+ "expirationMonth": {
+ "message": "Tháng Hết Hạn"
+ },
+ "expirationYear": {
+ "message": "Năm hết hạn"
+ },
+ "expiration": {
+ "message": "Hết hạn"
+ },
+ "january": {
+ "message": "Tháng 1"
+ },
+ "february": {
+ "message": "Tháng 2"
+ },
+ "march": {
+ "message": "Tháng 3"
+ },
+ "april": {
+ "message": "Tháng 4"
+ },
+ "may": {
+ "message": "Tháng 5"
+ },
+ "june": {
+ "message": "Tháng 6"
+ },
+ "july": {
+ "message": "Tháng 7"
+ },
+ "august": {
+ "message": "Tháng 8"
+ },
+ "september": {
+ "message": "Tháng 9"
+ },
+ "october": {
+ "message": "Tháng 10"
+ },
+ "november": {
+ "message": "Tháng 11"
+ },
+ "december": {
+ "message": "Tháng 12"
+ },
+ "securityCode": {
+ "message": "Mã bảo mật"
+ },
+ "ex": {
+ "message": "Ví dụ:"
+ },
+ "title": {
+ "message": "Tiêu đề"
+ },
+ "mr": {
+ "message": "Ông"
+ },
+ "mrs": {
+ "message": "Bà"
+ },
+ "ms": {
+ "message": "Chị"
+ },
+ "dr": {
+ "message": "Bác sĩ"
+ },
+ "firstName": {
+ "message": "Tên"
+ },
+ "middleName": {
+ "message": "Tên đệm"
+ },
+ "lastName": {
+ "message": "Họ"
+ },
+ "identityName": {
+ "message": "Tên nhận dạng"
+ },
+ "company": {
+ "message": "Công ty"
+ },
+ "ssn": {
+ "message": "Số bảo hiểm xã hội"
+ },
+ "passportNumber": {
+ "message": "Số hộ chiếu"
+ },
+ "licenseNumber": {
+ "message": "Số giấy phép"
+ },
+ "email": {
+ "message": "Email"
+ },
+ "phone": {
+ "message": "Số điện thoại"
+ },
+ "address": {
+ "message": "Địa chỉ"
+ },
+ "address1": {
+ "message": "Địa chỉ 1"
+ },
+ "address2": {
+ "message": "Địa chỉ 2"
+ },
+ "address3": {
+ "message": "Địa chỉ 3"
+ },
+ "cityTown": {
+ "message": "Quận/Huyện/Thị trấn"
+ },
+ "stateProvince": {
+ "message": "Tỉnh/Thành Phố"
+ },
+ "zipPostalCode": {
+ "message": "Mã bưu chính"
+ },
+ "country": {
+ "message": "Quốc Gia"
+ },
+ "type": {
+ "message": "Loại"
+ },
+ "typeLogin": {
+ "message": "Đăng nhập"
+ },
+ "typeLogins": {
+ "message": "Đăng nhập"
+ },
+ "typeSecureNote": {
+ "message": "Lưu ý an toàn"
+ },
+ "typeCard": {
+ "message": "Thẻ"
+ },
+ "typeIdentity": {
+ "message": "Danh tính"
+ },
+ "passwordHistory": {
+ "message": "Lịch sử Mật khẩu"
+ },
+ "back": {
+ "message": "Quay lại"
+ },
+ "collections": {
+ "message": "Các Bộ Sưu Tập"
+ },
+ "favorites": {
+ "message": "Yêu thích"
+ },
+ "popOutNewWindow": {
+ "message": "Mở trong cửa sổ mới"
+ },
+ "refresh": {
+ "message": "Làm mới"
+ },
+ "cards": {
+ "message": "Thẻ"
+ },
+ "identities": {
+ "message": "Danh tính"
+ },
+ "logins": {
+ "message": "Đăng nhập"
+ },
+ "secureNotes": {
+ "message": "Ghi chú bảo mật"
+ },
+ "clear": {
+ "message": "Xoá",
+ "description": "To clear something out. example: To clear browser history."
+ },
+ "checkPassword": {
+ "message": "Kiểm tra xem mật khẩu có bị lộ không."
+ },
+ "passwordExposed": {
+ "message": "Mật khẩu này đã bị lộ $VALUE$ trong các dữ liệu vi phạm. Bạn nên thay đổi nó.",
+ "placeholders": {
+ "value": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "passwordSafe": {
+ "message": "Mật khẩu này không được tìm thấy trong bất kỳ dữ liệu vi phạm nào được biết đến. Nó an toàn để sử dụng."
+ },
+ "baseDomain": {
+ "message": "Tên miền cơ sở"
+ },
+ "host": {
+ "message": "Máy chủ",
+ "description": "A URL's host value. For example, the host of https://sub.domain.com:443 is 'sub.domain.com:443'."
+ },
+ "exact": {
+ "message": "Chính xác"
+ },
+ "startsWith": {
+ "message": "Bắt đầu với"
+ },
+ "regEx": {
+ "message": "Biểu thức chính quy",
+ "description": "A programming term, also known as 'RegEx'."
+ },
+ "matchDetection": {
+ "message": "Độ phù hợp",
+ "description": "URI match detection for auto-fill."
+ },
+ "defaultMatchDetection": {
+ "message": "Độ phù hợp mặc định",
+ "description": "Default URI match detection for auto-fill."
+ },
+ "toggleOptions": {
+ "message": "Bật/tắt tùy chọn"
+ },
+ "toggleCurrentUris": {
+ "message": "Bật/tắt URI hiện tại",
+ "description": "Toggle the display of the URIs of the currently open tabs in the browser."
+ },
+ "currentUri": {
+ "message": "URI hiện tại",
+ "description": "The URI of one of the current open tabs in the browser."
+ },
+ "organization": {
+ "message": "Tổ chức",
+ "description": "An entity of multiple related people (ex. a team or business organization)."
+ },
+ "types": {
+ "message": "Các loại"
+ },
+ "allItems": {
+ "message": "Tất cả các mục"
+ },
+ "noPasswordsInList": {
+ "message": "Không có mật khẩu để liệt kê."
+ },
+ "remove": {
+ "message": "Xoá"
+ },
+ "default": {
+ "message": "Mặc định"
+ },
+ "dateUpdated": {
+ "message": "Ngày cập nhật",
+ "description": "ex. Date this item was updated"
+ },
+ "datePasswordUpdated": {
+ "message": "Password Updated",
+ "description": "ex. Date this password was updated"
+ },
+ "neverLockWarning": {
+ "message": "Bạn có chắc bạn muốn sử dụng tùy chọn \"Không bao giờ\"? Đặt các tùy chọn khóa về \"Không bao giờ\" sẽ lưu key mã hóa kho của ngay trên thiết bị của bạn. Nếu bạn sử dụng tùy chọn này, bạn nên chắc chắn là thiết bị bạn đang được bảo vệ."
+ },
+ "noOrganizationsList": {
+ "message": "You do not belong to any organizations. Organizations allow you to securely share items with other users."
+ },
+ "noCollectionsInList": {
+ "message": "Không có bộ sưu tập nào để liệt kê."
+ },
+ "ownership": {
+ "message": "Quyền sở hữu"
+ },
+ "whoOwnsThisItem": {
+ "message": "Ai sở hữu mục này?"
+ },
+ "strong": {
+ "message": "Mạnh",
+ "description": "ex. A strong password. Scale: Weak -> Good -> Strong"
+ },
+ "good": {
+ "message": "Tốt",
+ "description": "ex. A good password. Scale: Weak -> Good -> Strong"
+ },
+ "weak": {
+ "message": "Yếu",
+ "description": "ex. A weak password. Scale: Weak -> Good -> Strong"
+ },
+ "weakMasterPassword": {
+ "message": "Weak Master Password"
+ },
+ "weakMasterPasswordDesc": {
+ "message": "Mật khẩu chính bạn vừa chọn có vẻ yếu. Bạn nên chọn mật khẩu chính (hoặc cụm từ mật khẩu) mạnh để bảo vệ đúng cách tài khoản Bitwarden của bạn. Bạn có thực sự muốn dùng mật khẩu chính này?"
+ },
+ "pin": {
+ "message": "Mã PIN",
+ "description": "PIN code. Ex. The short code (often numeric) that you use to unlock a device."
+ },
+ "unlockWithPin": {
+ "message": "Mở khóa với mã PIN"
+ },
+ "setYourPinCode": {
+ "message": "Đặt mã PIN của bạn để mở khóa Bitwarden. Cài đặt mã PIN của bạn sẽ bị xóa nếu bạn hoàn toàn đăng xuất khỏi ứng dụng."
+ },
+ "pinRequired": {
+ "message": "Mã PIN là bắt buộc."
+ },
+ "invalidPin": {
+ "message": "Mã PIN không hợp lệ."
+ },
+ "verifyPin": {
+ "message": "Xác thực mã PIN"
+ },
+ "yourVaultIsLockedPinCode": {
+ "message": "Kho của bạn đã bị khóa. Xác minh mã PIN của bạn để mở."
+ },
+ "unlockWithBiometrics": {
+ "message": "Unlock with biometrics"
+ },
+ "awaitDesktop": {
+ "message": "Awaiting confirmation from desktop"
+ },
+ "awaitDesktopDesc": {
+ "message": "Please confirm using biometrics in the Bitwarden Desktop application to enable biometrics for browser."
+ },
+ "lockWithMasterPassOnRestart": {
+ "message": "Khóa với mật khẩu chính khi trình duyệt khởi động lại"
+ },
+ "selectOneCollection": {
+ "message": "Bạn phải chọn ít nhất một bộ sưu tập."
+ },
+ "cloneItem": {
+ "message": "Tại bản sao của mục"
+ },
+ "clone": {
+ "message": "Tạo bản sao"
+ },
+ "passwordGeneratorPolicyInEffect": {
+ "message": "Có một hoặc vài chính sách của tổ chức đang làm ảnh hưởng đến cài đặt tạo mật khẩu của bạn."
+ },
+ "vaultTimeoutAction": {
+ "message": "Hành Động Khi Hết Thời Gian Chờ"
+ },
+ "lock": {
+ "message": "Khóa",
+ "description": "Verb form: to make secure or inaccesible by"
+ },
+ "trash": {
+ "message": "Thùng rác",
+ "description": "Noun: a special folder to hold deleted items"
+ },
+ "searchTrash": {
+ "message": "Tìm kiếm thùng rác"
+ },
+ "permanentlyDeleteItem": {
+ "message": "Xoá vĩnh viễn mục"
+ },
+ "permanentlyDeleteItemConfirmation": {
+ "message": "Bạn có chắc chắn muốn xóa vĩnh viễn mục này không?"
+ },
+ "permanentlyDeletedItem": {
+ "message": "Đã xóa vĩnh viễn mục"
+ },
+ "restoreItem": {
+ "message": "Khôi phục mục"
+ },
+ "restoreItemConfirmation": {
+ "message": "Bạn có chắc chắn muốn khôi phục mục này không?"
+ },
+ "restoredItem": {
+ "message": "Mục đã được khôi phục"
+ },
+ "vaultTimeoutLogOutConfirmation": {
+ "message": "Đăng xuất sẽ xóa tất các truy cập vào kho của bạn và yêu cầu xác thực trực tuyến sau khi khoảng thời gian chờ hết. Bạn có chắc bạn muốn dùng cài đặt này?"
+ },
+ "vaultTimeoutLogOutConfirmationTitle": {
+ "message": "Xác nhận hành động khi hết thời gian chờ"
+ },
+ "autoFillAndSave": {
+ "message": "Auto-fill and Save"
+ },
+ "autoFillSuccessAndSavedUri": {
+ "message": "Auto-filled Item and Saved URI"
+ },
+ "autoFillSuccess": {
+ "message": "Tự động điền"
+ },
+ "setMasterPassword": {
+ "message": "Đặt mật khẩu chủ"
+ },
+ "masterPasswordPolicyInEffect": {
+ "message": "One or more organization policies require your master password to meet the following requirements:"
+ },
+ "policyInEffectMinComplexity": {
+ "message": "Minimum complexity score of $SCORE$",
+ "placeholders": {
+ "score": {
+ "content": "$1",
+ "example": "4"
+ }
+ }
+ },
+ "policyInEffectMinLength": {
+ "message": "Độ dài tối thiểu là $LENGTH$",
+ "placeholders": {
+ "length": {
+ "content": "$1",
+ "example": "14"
+ }
+ }
+ },
+ "policyInEffectUppercase": {
+ "message": "Contain one or more uppercase characters"
+ },
+ "policyInEffectLowercase": {
+ "message": "Chứa một hoặc nhiều kí tự viết thường"
+ },
+ "policyInEffectNumbers": {
+ "message": "Chứa một hoặc nhiều chữ số"
+ },
+ "policyInEffectSpecial": {
+ "message": "Contain one or more of the following special characters $CHARS$",
+ "placeholders": {
+ "chars": {
+ "content": "$1",
+ "example": "!@#$%^&*"
+ }
+ }
+ },
+ "masterPasswordPolicyRequirementsNotMet": {
+ "message": "Your new master password does not meet the policy requirements."
+ },
+ "acceptPolicies": {
+ "message": "By checking this box you agree to the following:"
+ },
+ "acceptPoliciesError": {
+ "message": "Terms of Service and Privacy Policy have not been acknowledged."
+ },
+ "termsOfService": {
+ "message": "Terms of Service"
+ },
+ "privacyPolicy": {
+ "message": "Privacy Policy"
+ },
+ "hintEqualsPassword": {
+ "message": "Your password hint cannot be the same as your password."
+ },
+ "ok": {
+ "message": "Ok"
+ },
+ "desktopSyncVerificationTitle": {
+ "message": "Desktop sync verification"
+ },
+ "desktopIntegrationVerificationText": {
+ "message": "Please verify that the desktop application shows this fingerprint: "
+ },
+ "desktopIntegrationDisabledTitle": {
+ "message": "Browser integration is not enabled"
+ },
+ "desktopIntegrationDisabledDesc": {
+ "message": "Browser integration is not enabled in the Bitwarden Desktop application. Please enable it in the settings within the desktop application."
+ },
+ "startDesktopTitle": {
+ "message": "Start the Bitwarden Desktop application"
+ },
+ "startDesktopDesc": {
+ "message": "The Bitwarden Desktop application needs to be started before this function can be used."
+ },
+ "errorEnableBiometricTitle": {
+ "message": "Không thể bật nhận dạng sinh trắc học"
+ },
+ "errorEnableBiometricDesc": {
+ "message": "Action was canceled by the desktop application"
+ },
+ "nativeMessagingInvalidEncryptionDesc": {
+ "message": "Desktop application invalidated the secure communication channel. Please retry this operation"
+ },
+ "nativeMessagingInvalidEncryptionTitle": {
+ "message": "Desktop communication interrupted"
+ },
+ "nativeMessagingWrongUserDesc": {
+ "message": "The desktop application is logged into a different account. Please ensure both applications are logged into the same account."
+ },
+ "nativeMessagingWrongUserTitle": {
+ "message": "Tài khoản không đúng"
+ },
+ "biometricsNotEnabledTitle": {
+ "message": "Nhận dạng sinh trắc học chưa được bật"
+ },
+ "biometricsNotEnabledDesc": {
+ "message": "Browser biometrics requires desktop biometric to be enabled in the settings first."
+ },
+ "biometricsNotSupportedTitle": {
+ "message": "Nhận dạng sinh trắc học không được hỗ trợ"
+ },
+ "biometricsNotSupportedDesc": {
+ "message": "Nhận dạng sinh trắc học trên trình duyệt không được hỗ trợ trên thiết bị này"
+ },
+ "nativeMessaginPermissionErrorTitle": {
+ "message": "Permission not provided"
+ },
+ "nativeMessaginPermissionErrorDesc": {
+ "message": "Without permission to communicate with the Bitwarden Desktop Application we cannot provide biometrics in the browser extension. Please try again."
+ },
+ "nativeMessaginPermissionSidebarTitle": {
+ "message": "Permission request error"
+ },
+ "nativeMessaginPermissionSidebarDesc": {
+ "message": "This action cannot be done in the sidebar, please retry the action in the popup or popout."
+ },
+ "personalOwnershipSubmitError": {
+ "message": "Due to an Enterprise Policy, you are restricted from saving items to your personal vault. Change the Ownership option to an organization and choose from available Collections."
+ },
+ "personalOwnershipPolicyInEffect": {
+ "message": "An organization policy is affecting your ownership options."
+ },
+ "excludedDomains": {
+ "message": "Excluded Domains"
+ },
+ "excludedDomainsDesc": {
+ "message": "Bitwarden will not ask to save login details for these domains. You must refresh the page for changes to take effect."
+ },
+ "excludedDomainsInvalidDomain": {
+ "message": "$DOMAIN$ is not a valid domain",
+ "placeholders": {
+ "domain": {
+ "content": "$1",
+ "example": "googlecom"
+ }
+ }
+ },
+ "send": {
+ "message": "Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "searchSends": {
+ "message": "Tìm kiếm Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "addSend": {
+ "message": "Thêm Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTypeText": {
+ "message": "Văn bản"
+ },
+ "sendTypeFile": {
+ "message": "Tập tin"
+ },
+ "allSends": {
+ "message": "Toàn bộ Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "maxAccessCountReached": {
+ "message": "Max access count reached"
+ },
+ "expired": {
+ "message": "Đã hết hạn"
+ },
+ "pendingDeletion": {
+ "message": "Đang chờ xóa"
+ },
+ "passwordProtected": {
+ "message": "Password protected"
+ },
+ "copySendLink": {
+ "message": "Sao chép liên kết Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "removePassword": {
+ "message": "Remove Password"
+ },
+ "delete": {
+ "message": "Delete"
+ },
+ "removedPassword": {
+ "message": "Xóa mật khẩu"
+ },
+ "deletedSend": {
+ "message": "Đã xóa Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendLink": {
+ "message": "Gửi liên kết",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "disabled": {
+ "message": "Đã tắt"
+ },
+ "removePasswordConfirmation": {
+ "message": "Bạn có chắc chắn muốn xóa mật khẩu này?"
+ },
+ "deleteSend": {
+ "message": "Xóa Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "deleteSendConfirmation": {
+ "message": "Bạn có chắc chắn muốn xóa Send này?",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "editSend": {
+ "message": "Chỉnh sửa Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTypeHeader": {
+ "message": "Đây là loại Send gì?",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendNameDesc": {
+ "message": "Một tên gợi nhớ để mô tả về Send này.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendFileDesc": {
+ "message": "Tập tin bạn muốn gửi."
+ },
+ "deletionDate": {
+ "message": "Deletion Date"
+ },
+ "deletionDateDesc": {
+ "message": "Send sẽ được xóa vĩnh viễn vào ngày và giờ được chỉ định.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "expirationDate": {
+ "message": "Expiration Date"
+ },
+ "expirationDateDesc": {
+ "message": "Nếu được thiết lập, truy cập vào Send này sẽ hết hạn vào ngày và giờ được chỉ định.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "oneDay": {
+ "message": "1 ngày"
+ },
+ "days": {
+ "message": "#DAYS# ngày",
+ "placeholders": {
+ "days": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "custom": {
+ "message": "Custom"
+ },
+ "maximumAccessCount": {
+ "message": "Số lượng truy cập tối đa"
+ },
+ "maximumAccessCountDesc": {
+ "message": "Nếu được thiết lập, khi đã đạt tới số lượng truy cập tối đa, người dùng sẽ không thể truy cập Send này nữa.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendPasswordDesc": {
+ "message": "Optionally require a password for users to access this Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendNotesDesc": {
+ "message": "Private notes about this Send.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendDisableDesc": {
+ "message": "Disable this Send so that no one can access it.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendShareDesc": {
+ "message": "Copy this Send's link to clipboard upon save.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTextDesc": {
+ "message": "Văn bản bạn muốn gửi."
+ },
+ "sendHideText": {
+ "message": "Hide this Send's text by default.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "currentAccessCount": {
+ "message": "Current Access Count"
+ },
+ "createSend": {
+ "message": "Create New Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "newPassword": {
+ "message": "New Password"
+ },
+ "sendDisabled": {
+ "message": "Send Disabled",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendDisabledWarning": {
+ "message": "Do chính sách doanh nghiệp, bạn chỉ có thể xóa những Send hiện có.",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "createdSend": {
+ "message": "Đã tạo Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "editedSend": {
+ "message": "Đã chỉnh sửa Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendLinuxChromiumFileWarning": {
+ "message": "In order to choose a file, open the extension in the sidebar (if possible) or pop out to a new window by clicking this banner."
+ },
+ "sendFirefoxFileWarning": {
+ "message": "In order to choose a file using Firefox, open the extension in the sidebar or pop out to a new window by clicking this banner."
+ },
+ "sendSafariFileWarning": {
+ "message": "In order to choose a file using Safari, pop out to a new window by clicking this banner."
+ },
+ "sendFileCalloutHeader": {
+ "message": "Trước khi bạn bắt đầu"
+ },
+ "sendFirefoxCustomDatePopoutMessage1": {
+ "message": "To use a calendar style date picker",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read '**To use a calendar style date picker ** click here to pop out your window.'"
+ },
+ "sendFirefoxCustomDatePopoutMessage2": {
+ "message": "nhấn vào đây",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker **click here** to pop out your window.'"
+ },
+ "sendFirefoxCustomDatePopoutMessage3": {
+ "message": "to pop out your window.",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker click here **to pop out your window.**'"
+ },
+ "expirationDateIsInvalid": {
+ "message": "The expiration date provided is not valid."
+ },
+ "deletionDateIsInvalid": {
+ "message": "The deletion date provided is not valid."
+ },
+ "expirationDateAndTimeRequired": {
+ "message": "An expiration date and time are required."
+ },
+ "deletionDateAndTimeRequired": {
+ "message": "A deletion date and time are required."
+ },
+ "dateParsingError": {
+ "message": "There was an error saving your deletion and expiration dates."
+ },
+ "hideEmail": {
+ "message": "Hide my email address from recipients."
+ },
+ "sendOptionsPolicyInEffect": {
+ "message": "One or more organization policies are affecting your Send options."
+ },
+ "passwordPrompt": {
+ "message": "Master password re-prompt"
+ },
+ "passwordConfirmation": {
+ "message": "Master password confirmation"
+ },
+ "passwordConfirmationDesc": {
+ "message": "This action is protected. To continue, please re-enter your master password to verify your identity."
+ },
+ "emailVerificationRequired": {
+ "message": "Email Verification Required"
+ },
+ "emailVerificationRequiredDesc": {
+ "message": "You must verify your email to use this feature. You can verify your email in the web vault."
+ },
+ "updatedMasterPassword": {
+ "message": "Updated Master Password"
+ },
+ "updateMasterPassword": {
+ "message": "Update Master Password"
+ },
+ "updateMasterPasswordWarning": {
+ "message": "Your Master Password was recently changed by an administrator in your organization. In order to access the vault, you must update it now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour."
+ },
+ "resetPasswordPolicyAutoEnroll": {
+ "message": "Automatic Enrollment"
+ },
+ "resetPasswordAutoEnrollInviteWarning": {
+ "message": "This organization has an enterprise policy that will automatically enroll you in password reset. Enrollment will allow organization administrators to change your master password."
+ },
+ "selectFolder": {
+ "message": "Select folder..."
+ },
+ "ssoCompleteRegistration": {
+ "message": "In order to complete logging in with SSO, please set a master password to access and protect your vault."
+ },
+ "hours": {
+ "message": "Hours"
+ },
+ "minutes": {
+ "message": "Minutes"
+ },
+ "vaultTimeoutPolicyInEffect": {
+ "message": "Your organization policies are affecting your vault timeout. Maximum allowed Vault Timeout is $HOURS$ hour(s) and $MINUTES$ minute(s)",
+ "placeholders": {
+ "hours": {
+ "content": "$1",
+ "example": "5"
+ },
+ "minutes": {
+ "content": "$2",
+ "example": "5"
+ }
+ }
+ },
+ "vaultTimeoutToLarge": {
+ "message": "Your vault timeout exceeds the restrictions set by your organization."
+ },
+ "vaultExportDisabled": {
+ "message": "Vault Export Disabled"
+ },
+ "personalVaultExportPolicyInEffect": {
+ "message": "One or more organization policies prevents you from exporting your personal vault."
+ },
+ "copyCustomFieldNameInvalidElement": {
+ "message": "Unable to identify a valid form element. Try inspecting the HTML instead."
+ },
+ "copyCustomFieldNameNotUnique": {
+ "message": "No unique identifier found."
+ }
+}
diff --git a/src/iOS.Safari/Resources/_locales/zh_CN/messages.json b/src/iOS.Safari/Resources/_locales/zh_CN/messages.json
new file mode 100644
index 000000000..4155b1992
--- /dev/null
+++ b/src/iOS.Safari/Resources/_locales/zh_CN/messages.json
@@ -0,0 +1,1817 @@
+{
+ "appName": {
+ "message": "Bitwarden"
+ },
+ "extName": {
+ "message": "Bitwarden - 免费密码管理器",
+ "description": "Extension name, MUST be less than 40 characters (Safari restriction)"
+ },
+ "extDesc": {
+ "message": "Bitwarden 是一个安全且免费的跨平台密码管理器。",
+ "description": "Extension description"
+ },
+ "loginOrCreateNewAccount": {
+ "message": "登录或新建一个帐号来访问你的密码库。"
+ },
+ "createAccount": {
+ "message": "新建帐号"
+ },
+ "login": {
+ "message": "登录"
+ },
+ "enterpriseSingleSignOn": {
+ "message": "企业单点登录(SSO)"
+ },
+ "cancel": {
+ "message": "取消"
+ },
+ "close": {
+ "message": "关闭"
+ },
+ "submit": {
+ "message": "提交"
+ },
+ "emailAddress": {
+ "message": "电子邮件地址"
+ },
+ "masterPass": {
+ "message": "主密码"
+ },
+ "masterPassDesc": {
+ "message": "主密码是您访问密码库的唯一密码。它非常重要,请您不要忘记。一旦忘记,无任何办法恢复此密码。"
+ },
+ "masterPassHintDesc": {
+ "message": "主密码提示可以在你忘记密码时帮你回忆起来。"
+ },
+ "reTypeMasterPass": {
+ "message": "重新输入主密码"
+ },
+ "masterPassHint": {
+ "message": "主密码提示 (可选)"
+ },
+ "tab": {
+ "message": "标签页"
+ },
+ "myVault": {
+ "message": "密码库"
+ },
+ "tools": {
+ "message": "工具"
+ },
+ "settings": {
+ "message": "设置"
+ },
+ "currentTab": {
+ "message": "当前标签"
+ },
+ "copyPassword": {
+ "message": "复制密码"
+ },
+ "copyNote": {
+ "message": "复制备注"
+ },
+ "copyUri": {
+ "message": "复制 URI"
+ },
+ "copyUsername": {
+ "message": "复制用户名"
+ },
+ "copyNumber": {
+ "message": "复制号码"
+ },
+ "copySecurityCode": {
+ "message": "复制安全码"
+ },
+ "autoFill": {
+ "message": "自动填充"
+ },
+ "generatePasswordCopied": {
+ "message": "生成密码 (并复制)"
+ },
+ "copyElementIdentifier": {
+ "message": "Copy Custom Field Name"
+ },
+ "noMatchingLogins": {
+ "message": "无匹配的登录信息。"
+ },
+ "vaultLocked": {
+ "message": "密码库已锁定"
+ },
+ "vaultLoggedOut": {
+ "message": "密码库已注销"
+ },
+ "autoFillInfo": {
+ "message": "没有可以自动填充当前浏览器标签页的登录项目。"
+ },
+ "addLogin": {
+ "message": "添加登录信息"
+ },
+ "addItem": {
+ "message": "添加项目"
+ },
+ "passwordHint": {
+ "message": "密码提示"
+ },
+ "enterEmailToGetHint": {
+ "message": "请输入您帐号的 Email 地址来接收主密码提示。"
+ },
+ "getMasterPasswordHint": {
+ "message": "获取主密码提示"
+ },
+ "continue": {
+ "message": "继续"
+ },
+ "verificationCode": {
+ "message": "验证码"
+ },
+ "account": {
+ "message": "账户"
+ },
+ "changeMasterPassword": {
+ "message": "修改主密码"
+ },
+ "fingerprintPhrase": {
+ "message": "指纹短语",
+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
+ },
+ "yourAccountsFingerprint": {
+ "message": "您的账户的指纹短语",
+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
+ },
+ "twoStepLogin": {
+ "message": "两步登录"
+ },
+ "logOut": {
+ "message": "注销"
+ },
+ "about": {
+ "message": "关于"
+ },
+ "version": {
+ "message": "版本"
+ },
+ "save": {
+ "message": "保存"
+ },
+ "move": {
+ "message": "移动"
+ },
+ "addFolder": {
+ "message": "添加文件夹"
+ },
+ "name": {
+ "message": "名称"
+ },
+ "editFolder": {
+ "message": "编辑文件夹"
+ },
+ "deleteFolder": {
+ "message": "删除文件夹"
+ },
+ "folders": {
+ "message": "文件夹"
+ },
+ "noFolders": {
+ "message": "没有可列出的文件夹。"
+ },
+ "helpFeedback": {
+ "message": "帮助和反馈"
+ },
+ "sync": {
+ "message": "同步"
+ },
+ "syncVaultNow": {
+ "message": "立即同步密码库"
+ },
+ "lastSync": {
+ "message": "上次同步:"
+ },
+ "passGen": {
+ "message": "密码生成器"
+ },
+ "generator": {
+ "message": "生成器",
+ "description": "Short for 'Password Generator'."
+ },
+ "passGenInfo": {
+ "message": "自动生成安全可靠唯一的登录密码。"
+ },
+ "bitWebVault": {
+ "message": "Bitwarden 网页版密码库"
+ },
+ "importItems": {
+ "message": "导入项目"
+ },
+ "select": {
+ "message": "选择"
+ },
+ "generatePassword": {
+ "message": "生成密码"
+ },
+ "regeneratePassword": {
+ "message": "重新生成密码"
+ },
+ "options": {
+ "message": "选项"
+ },
+ "length": {
+ "message": "长度"
+ },
+ "numWords": {
+ "message": "单词数"
+ },
+ "wordSeparator": {
+ "message": "单词分隔符"
+ },
+ "capitalize": {
+ "message": "大写",
+ "description": "Make the first letter of a work uppercase."
+ },
+ "includeNumber": {
+ "message": "包含数字"
+ },
+ "minNumbers": {
+ "message": "数字最少个数"
+ },
+ "minSpecial": {
+ "message": "符号最少个数"
+ },
+ "avoidAmbChar": {
+ "message": "避免易混淆的字符"
+ },
+ "searchVault": {
+ "message": "搜索密码库"
+ },
+ "edit": {
+ "message": "编辑"
+ },
+ "view": {
+ "message": "查看"
+ },
+ "noItemsInList": {
+ "message": "没有可列出的项目。"
+ },
+ "itemInformation": {
+ "message": "项目信息"
+ },
+ "username": {
+ "message": "用户名"
+ },
+ "password": {
+ "message": "密码"
+ },
+ "passphrase": {
+ "message": "密码短语"
+ },
+ "favorite": {
+ "message": "收藏"
+ },
+ "notes": {
+ "message": "备注"
+ },
+ "note": {
+ "message": "备注"
+ },
+ "editItem": {
+ "message": "编辑项目"
+ },
+ "folder": {
+ "message": "文件夹"
+ },
+ "deleteItem": {
+ "message": "删除项目"
+ },
+ "viewItem": {
+ "message": "查看项目"
+ },
+ "launch": {
+ "message": "启动"
+ },
+ "website": {
+ "message": "网站"
+ },
+ "toggleVisibility": {
+ "message": "切换可见性"
+ },
+ "manage": {
+ "message": "管理"
+ },
+ "other": {
+ "message": "其他"
+ },
+ "rateExtension": {
+ "message": "为本扩展打分"
+ },
+ "rateExtensionDesc": {
+ "message": "请给我们好评!"
+ },
+ "browserNotSupportClipboard": {
+ "message": "您的浏览器不支持剪贴板简单复制,请手动复制。"
+ },
+ "verifyMasterPassword": {
+ "message": "验证主密码"
+ },
+ "yourVaultIsLocked": {
+ "message": "您的密码库已锁定,验证您的主密码以继续。"
+ },
+ "unlock": {
+ "message": "解锁"
+ },
+ "loggedInAsOn": {
+ "message": "以 $EMAIL$ 在 $HOSTNAME$ 上登录。",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "name@example.com"
+ },
+ "hostname": {
+ "content": "$2",
+ "example": "bitwarden.com"
+ }
+ }
+ },
+ "invalidMasterPassword": {
+ "message": "无效的主密码"
+ },
+ "vaultTimeout": {
+ "message": "密码库超时"
+ },
+ "lockNow": {
+ "message": "立即锁定"
+ },
+ "immediately": {
+ "message": "立即"
+ },
+ "tenSeconds": {
+ "message": "10 秒"
+ },
+ "twentySeconds": {
+ "message": "20 秒"
+ },
+ "thirtySeconds": {
+ "message": "30 秒"
+ },
+ "oneMinute": {
+ "message": "1 分钟"
+ },
+ "twoMinutes": {
+ "message": "2 分钟"
+ },
+ "fiveMinutes": {
+ "message": "5 分钟"
+ },
+ "fifteenMinutes": {
+ "message": "15 分钟"
+ },
+ "thirtyMinutes": {
+ "message": "30 分钟"
+ },
+ "oneHour": {
+ "message": "1 小时"
+ },
+ "fourHours": {
+ "message": "4 小时"
+ },
+ "onLocked": {
+ "message": "系统锁定时"
+ },
+ "onRestart": {
+ "message": "重启浏览器时"
+ },
+ "never": {
+ "message": "从不"
+ },
+ "security": {
+ "message": "安全"
+ },
+ "errorOccurred": {
+ "message": "发生了一个错误"
+ },
+ "emailRequired": {
+ "message": "必须填写电子邮件地址。"
+ },
+ "invalidEmail": {
+ "message": "无效的电子邮件地址。"
+ },
+ "masterPassRequired": {
+ "message": "必须填写主密码。"
+ },
+ "masterPassLength": {
+ "message": "主密码至少需要 8 个字符。"
+ },
+ "masterPassDoesntMatch": {
+ "message": "两次填写的主密码不一致。"
+ },
+ "newAccountCreated": {
+ "message": "已经为您建立了账户,您可以登录了。"
+ },
+ "masterPassSent": {
+ "message": "我们已经为您发送了包含主密码提示的邮件。"
+ },
+ "verificationCodeRequired": {
+ "message": "必须填写验证码。"
+ },
+ "valueCopied": {
+ "message": "$VALUE$ 已复制",
+ "description": "Value has been copied to the clipboard.",
+ "placeholders": {
+ "value": {
+ "content": "$1",
+ "example": "Password"
+ }
+ }
+ },
+ "autofillError": {
+ "message": "无法在此页面上自动填充所选项目。请改为手工复制并粘贴。"
+ },
+ "loggedOut": {
+ "message": "已注销"
+ },
+ "loginExpired": {
+ "message": "您的登录会话已过期。"
+ },
+ "logOutConfirmation": {
+ "message": "您确定要注销吗?"
+ },
+ "yes": {
+ "message": "是"
+ },
+ "no": {
+ "message": "否"
+ },
+ "unexpectedError": {
+ "message": "发生意外错误。"
+ },
+ "nameRequired": {
+ "message": "必须填写名称。"
+ },
+ "addedFolder": {
+ "message": "文件夹已添加"
+ },
+ "changeMasterPass": {
+ "message": "修改主密码"
+ },
+ "changeMasterPasswordConfirmation": {
+ "message": "您可以在 bitwarden.com 网页版密码库修改主密码。您现在要访问这个网站吗?"
+ },
+ "twoStepLoginConfirmation": {
+ "message": "两步登录要求您从其他设备(例如安全钥匙、验证器应用、短信、电话或者电子邮件)来验证你的登录,这能使您的账户更加安全。两步登录可以在 bitwarden.com 网页版密码库启用。您现在要访问这个网站吗?"
+ },
+ "editedFolder": {
+ "message": "文件夹已编辑"
+ },
+ "deleteFolderConfirmation": {
+ "message": "您确定要删除此文件夹吗?"
+ },
+ "deletedFolder": {
+ "message": "文件夹已删除"
+ },
+ "gettingStartedTutorial": {
+ "message": "入门教程"
+ },
+ "gettingStartedTutorialVideo": {
+ "message": "观看我们的入门教程,了解如何充分利用浏览器扩展。"
+ },
+ "syncingComplete": {
+ "message": "同步完成"
+ },
+ "syncingFailed": {
+ "message": "同步失败"
+ },
+ "passwordCopied": {
+ "message": "密码已复制"
+ },
+ "uri": {
+ "message": "URI"
+ },
+ "uriPosition": {
+ "message": "URI $POSITION$",
+ "description": "A listing of URIs. Ex: URI 1, URI 2, URI 3, etc.",
+ "placeholders": {
+ "position": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "newUri": {
+ "message": "新增 URI"
+ },
+ "addedItem": {
+ "message": "项目已添加"
+ },
+ "editedItem": {
+ "message": "项目已编辑"
+ },
+ "deleteItemConfirmation": {
+ "message": "您确定要删除此项目吗?"
+ },
+ "deletedItem": {
+ "message": "发送项目到回收站"
+ },
+ "overwritePassword": {
+ "message": "覆盖密码"
+ },
+ "overwritePasswordConfirmation": {
+ "message": "您确定要覆盖当前密码吗?"
+ },
+ "searchFolder": {
+ "message": "搜索文件夹"
+ },
+ "searchCollection": {
+ "message": "搜索集合"
+ },
+ "searchType": {
+ "message": "搜索类型"
+ },
+ "noneFolder": {
+ "message": "默认文件夹",
+ "description": "This is the folder for uncategorized items"
+ },
+ "disableAddLoginNotification": {
+ "message": "禁用添加登录项的提醒"
+ },
+ "addLoginNotificationDesc": {
+ "message": "当您第一次登录时,\"添加登录提醒\" 会自动提醒您在密码库里保存新的登录信息。"
+ },
+ "dontShowCardsCurrentTab": {
+ "message": "标签页上不显示支付卡"
+ },
+ "dontShowCardsCurrentTabDesc": {
+ "message": "密码库中的支付卡项目会在 “当前标签” 页面列出,以便于自动填充。"
+ },
+ "dontShowIdentitiesCurrentTab": {
+ "message": "标签页上不显示身份"
+ },
+ "dontShowIdentitiesCurrentTabDesc": {
+ "message": "密码库中的身份项目会在 “当前标签” 页面列出,以便于自动填充。"
+ },
+ "clearClipboard": {
+ "message": "清除剪贴板",
+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
+ },
+ "clearClipboardDesc": {
+ "message": "自动清除复制到剪贴板的值。",
+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
+ },
+ "notificationAddDesc": {
+ "message": "希望 Bitwarden 为您保存这个密码吗?"
+ },
+ "notificationAddSave": {
+ "message": "是,现在保存"
+ },
+ "notificationNeverSave": {
+ "message": "永久忽略此网站"
+ },
+ "disableChangedPasswordNotification": {
+ "message": "禁用密码变更通知"
+ },
+ "disableChangedPasswordNotificationDesc": {
+ "message": "检测到您已变更网站上的密码时,“密码变更通知” 自动提醒您更新密码库中相应项的密码。"
+ },
+ "notificationChangeDesc": {
+ "message": "是否要在 Bitwarden 中更新此密码?"
+ },
+ "notificationChangeSave": {
+ "message": "是,立即更新"
+ },
+ "disableContextMenuItem": {
+ "message": "关闭上下文菜单选项"
+ },
+ "disableContextMenuItemDesc": {
+ "message": "上下文菜单选项可以让您快速访问密码生成器,也可以登陆当前标签的网站。"
+ },
+ "defaultUriMatchDetection": {
+ "message": "默认的 URI 匹配检测方式",
+ "description": "Default URI match detection for auto-fill."
+ },
+ "defaultUriMatchDetectionDesc": {
+ "message": "选择在执行诸如自动填充之类的操作时对登录进行 URI 匹配检测的默认方式。"
+ },
+ "theme": {
+ "message": "主题"
+ },
+ "themeDesc": {
+ "message": "更改本应用程序的颜色主题。"
+ },
+ "dark": {
+ "message": "暗",
+ "description": "Dark color"
+ },
+ "light": {
+ "message": "亮",
+ "description": "Light color"
+ },
+ "solarizedDark": {
+ "message": "过曝暗",
+ "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated."
+ },
+ "exportVault": {
+ "message": "导出密码库"
+ },
+ "fileFormat": {
+ "message": "文件格式"
+ },
+ "warning": {
+ "message": "警告",
+ "description": "WARNING (should stay in capitalized letters if the language permits)"
+ },
+ "confirmVaultExport": {
+ "message": "确认密码库导出"
+ },
+ "exportWarningDesc": {
+ "message": "导出的密码库数据包含未加密格式。您不应该通过不安全的渠道(例如电子邮件)来存储或发送导出的文件。用完后请立即将其删除。"
+ },
+ "encExportKeyWarningDesc": {
+ "message": "此导出将使用您账户的加密密钥来加密您的数据。 如果您曾经轮换过账户的加密密钥,您应将其重新导出,否则您将无法解密导出的文件。"
+ },
+ "encExportAccountWarningDesc": {
+ "message": "账户加密密钥对每个 Bitwarden 用户账户都是唯一的,所以您不能将加密的导出导入到另一个账户。"
+ },
+ "exportMasterPassword": {
+ "message": "输入主密码来导出你的密码库。"
+ },
+ "shared": {
+ "message": "已共享"
+ },
+ "learnOrg": {
+ "message": "了解组织"
+ },
+ "learnOrgConfirmation": {
+ "message": "Bitwarden 允许您使用组织与他人共享您的密码库项目。要访问 bitwarden.com 网站以了解更多内容吗?"
+ },
+ "moveToOrganization": {
+ "message": "移动到组织"
+ },
+ "share": {
+ "message": "共享"
+ },
+ "movedItemToOrg": {
+ "message": "$ITEMNAME$ 已移动到 $ORGNAME$",
+ "placeholders": {
+ "itemname": {
+ "content": "$1",
+ "example": "Secret Item"
+ },
+ "orgname": {
+ "content": "$2",
+ "example": "Company Name"
+ }
+ }
+ },
+ "moveToOrgDesc": {
+ "message": "选择一个您想将此项目移至的组织。移动到组织会将该项目的所有权转让给该组织。移动后,您将不再是此项目的直接所有者。"
+ },
+ "learnMore": {
+ "message": "进一步了解"
+ },
+ "authenticatorKeyTotp": {
+ "message": "验证器密钥 (TOTP)"
+ },
+ "verificationCodeTotp": {
+ "message": "验证码 (TOTP)"
+ },
+ "copyVerificationCode": {
+ "message": "复制验证码"
+ },
+ "attachments": {
+ "message": "附件"
+ },
+ "deleteAttachment": {
+ "message": "删除附件"
+ },
+ "deleteAttachmentConfirmation": {
+ "message": "您确定要删除此附件吗?"
+ },
+ "deletedAttachment": {
+ "message": "附件已删除"
+ },
+ "newAttachment": {
+ "message": "添加新附件"
+ },
+ "noAttachments": {
+ "message": "没有附件。"
+ },
+ "attachmentSaved": {
+ "message": "附件已保存。"
+ },
+ "file": {
+ "message": "文件"
+ },
+ "selectFile": {
+ "message": "选择一个文件。"
+ },
+ "maxFileSize": {
+ "message": "文件最大为 500 MB。"
+ },
+ "featureUnavailable": {
+ "message": "功能不可用"
+ },
+ "updateKey": {
+ "message": "在您更新加密密钥前,您不能使用此功能。"
+ },
+ "premiumMembership": {
+ "message": "高级会员"
+ },
+ "premiumManage": {
+ "message": "管理会员资格"
+ },
+ "premiumManageAlert": {
+ "message": "您可以在 bitwarden.com 网页版密码库管理您的会员资格。现在要访问吗?"
+ },
+ "premiumRefresh": {
+ "message": "刷新会员资格"
+ },
+ "premiumNotCurrentMember": {
+ "message": "您目前不是高级会员。"
+ },
+ "premiumSignUpAndGet": {
+ "message": "注册高级会员将获得:"
+ },
+ "ppremiumSignUpStorage": {
+ "message": "1 GB 文件附件加密存储。"
+ },
+ "ppremiumSignUpTwoStep": {
+ "message": "额外的两步登录选项,如 YubiKey、FIDO U2F 和 Duo。"
+ },
+ "ppremiumSignUpReports": {
+ "message": "密码健康、账户体检以及数据泄露报告,保障您的密码库安全。"
+ },
+ "ppremiumSignUpTotp": {
+ "message": "用于登录您的密码库的 TOTP 验证码(两步验证)生成器。"
+ },
+ "ppremiumSignUpSupport": {
+ "message": "优先客户支持。"
+ },
+ "ppremiumSignUpFuture": {
+ "message": "未来会增加更多高级功能。敬请期待!"
+ },
+ "premiumPurchase": {
+ "message": "购买高级版"
+ },
+ "premiumPurchaseAlert": {
+ "message": "您可以在 bitwarden.com 网页版密码库购买高级会员。现在要访问吗?"
+ },
+ "premiumCurrentMember": {
+ "message": "您是高级会员!"
+ },
+ "premiumCurrentMemberThanks": {
+ "message": "感谢您支持 Bitwarden。"
+ },
+ "premiumPrice": {
+ "message": "每年只需 $PRICE$ !",
+ "placeholders": {
+ "price": {
+ "content": "$1",
+ "example": "$10"
+ }
+ }
+ },
+ "refreshComplete": {
+ "message": "刷新完成"
+ },
+ "disableAutoTotpCopy": {
+ "message": "禁用自动 TOTP 复制"
+ },
+ "disableAutoTotpCopyDesc": {
+ "message": "如果您的登录信息包含一个验证器密钥,当自动填充该登录项目时,TOTP 验证码将会自动复制到剪贴板。"
+ },
+ "disableAutoBiometricsPrompt": {
+ "message": "Do not prompt for biometrics on launch"
+ },
+ "premiumRequired": {
+ "message": "需要高级会员"
+ },
+ "premiumRequiredDesc": {
+ "message": "使用此功能需要高级会员资格。"
+ },
+ "enterVerificationCodeApp": {
+ "message": "请输入您的身份验证器应用中的 6 位验证码。"
+ },
+ "enterVerificationCodeEmail": {
+ "message": "请输入通过电子邮件发送给 $EMAIL$ 的 6 位验证码。",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "example@gmail.com"
+ }
+ }
+ },
+ "verificationCodeEmailSent": {
+ "message": "验证邮件已发送到 $EMAIL$。",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "example@gmail.com"
+ }
+ }
+ },
+ "rememberMe": {
+ "message": "记住我"
+ },
+ "sendVerificationCodeEmailAgain": {
+ "message": "再次发送验证码电子邮件"
+ },
+ "useAnotherTwoStepMethod": {
+ "message": "使用其他两步登录方式"
+ },
+ "insertYubiKey": {
+ "message": "将您的 YubiKey 插入计算机的 USB 端口,然后按下按钮。"
+ },
+ "insertU2f": {
+ "message": "将您的安全钥匙插入计算机的 USB 端口。如果它有一个按钮,按下它。"
+ },
+ "webAuthnNewTab": {
+ "message": "要开始 WebAuthn 2FA 验证,请点击下面的按钮打开一个新标签页,并按照新标签页中提供的说明操作。"
+ },
+ "webAuthnNewTabOpen": {
+ "message": "打开新标签页"
+ },
+ "webAuthnAuthenticate": {
+ "message": "验证 WebAuthn"
+ },
+ "loginUnavailable": {
+ "message": "登录不可用"
+ },
+ "noTwoStepProviders": {
+ "message": "此账户已启用两步登录,但此浏览器不支持任何已配置的两步登录提供程序。"
+ },
+ "noTwoStepProviders2": {
+ "message": "请使用支持的网页浏览器(例如 Chrome)和/或添加其他支持更广泛的提供程序(例如验证器应用)。"
+ },
+ "twoStepOptions": {
+ "message": "两步登录选项"
+ },
+ "recoveryCodeDesc": {
+ "message": "失去访问您所有的双重身份验证设备?请使用您的恢复代码来禁用您账户中所有的两步登录提供程序。"
+ },
+ "recoveryCodeTitle": {
+ "message": "恢复代码"
+ },
+ "authenticatorAppTitle": {
+ "message": "验证器应用"
+ },
+ "authenticatorAppDesc": {
+ "message": "使用身份验证器应用(例如 Authy 或 Google Authenticator)来生成基于时间的验证码。",
+ "description": "'Authy' and 'Google Authenticator' are product names and should not be translated."
+ },
+ "yubiKeyTitle": {
+ "message": "YubiKey OTP 安全钥匙"
+ },
+ "yubiKeyDesc": {
+ "message": "使用 YubiKey 来访问您的账户。支持 YubiKey 4、4 Nano、4C 以及 NEO 设备。"
+ },
+ "duoDesc": {
+ "message": "使用 Duo Security 的 Duo 移动应用、短信、电话或 U2F 安全钥匙来进行验证。",
+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
+ },
+ "duoOrganizationDesc": {
+ "message": "为您的组织使用 Duo Security 的 Duo 移动应用、短信、电话或 U2F 安全钥匙来进行验证。",
+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
+ },
+ "webAuthnTitle": {
+ "message": "FIDO2 WebAuthn"
+ },
+ "webAuthnDesc": {
+ "message": "使用任何启用了 WebAuthn 的安全钥匙访问您的帐户。"
+ },
+ "emailTitle": {
+ "message": "电子邮件"
+ },
+ "emailDesc": {
+ "message": "验证码将会发送到您的电子邮箱。"
+ },
+ "selfHostedEnvironment": {
+ "message": "自托管环境"
+ },
+ "selfHostedEnvironmentFooter": {
+ "message": "指定您本地托管的 Bitwarden 安装的基础 URL。"
+ },
+ "customEnvironment": {
+ "message": "自定义环境"
+ },
+ "customEnvironmentFooter": {
+ "message": "适用于高级用户。你可以分别指定各个服务的基础 URL。"
+ },
+ "baseUrl": {
+ "message": "服务器 URL"
+ },
+ "apiUrl": {
+ "message": "API 服务器 URL"
+ },
+ "webVaultUrl": {
+ "message": "网页密码库服务器 URL"
+ },
+ "identityUrl": {
+ "message": "身份服务器 URL"
+ },
+ "notificationsUrl": {
+ "message": "通知服务器 URL"
+ },
+ "iconsUrl": {
+ "message": "图标服务器 URL"
+ },
+ "environmentSaved": {
+ "message": "各环境 URL 已保存。"
+ },
+ "enableAutoFillOnPageLoad": {
+ "message": "启用页面加载时的自动填充"
+ },
+ "enableAutoFillOnPageLoadDesc": {
+ "message": "如果网页加载时检测到登录表单,自动进行自动填充。"
+ },
+ "experimentalFeature": {
+ "message": "目前这是一项实验功能。使用需自担风险。"
+ },
+ "defaultAutoFillOnPageLoad": {
+ "message": "登录项目的默认自动填充设置"
+ },
+ "defaultAutoFillOnPageLoadDesc": {
+ "message": "启用页面加载时自动填充后,您可以为单个登录项目启用或禁用此功能。这是未单独配置的登录项目的默认设置。"
+ },
+ "itemAutoFillOnPageLoad": {
+ "message": "页面加载时自动填充(如果选项中已启用)"
+ },
+ "autoFillOnPageLoadUseDefault": {
+ "message": "使用默认设置"
+ },
+ "autoFillOnPageLoadYes": {
+ "message": "页面加载时自动填充"
+ },
+ "autoFillOnPageLoadNo": {
+ "message": "页面加载时不自动填充"
+ },
+ "commandOpenPopup": {
+ "message": "在弹出框中打开密码库"
+ },
+ "commandOpenSidebar": {
+ "message": "在侧边栏中打开密码库"
+ },
+ "commandAutofillDesc": {
+ "message": "为当前网站自动填充最后使用的登录信息"
+ },
+ "commandGeneratePasswordDesc": {
+ "message": "生成一个新的随机密码并将其复制到剪贴板中。"
+ },
+ "commandLockVaultDesc": {
+ "message": "锁定密码库"
+ },
+ "privateModeMessage": {
+ "message": "非常不幸,此窗口在这个浏览器的隐私模式中不可用。"
+ },
+ "customFields": {
+ "message": "自定义字段"
+ },
+ "copyValue": {
+ "message": "复制值"
+ },
+ "value": {
+ "message": "值"
+ },
+ "newCustomField": {
+ "message": "新建自定义字段"
+ },
+ "dragToSort": {
+ "message": "拖动排序"
+ },
+ "cfTypeText": {
+ "message": "文本"
+ },
+ "cfTypeHidden": {
+ "message": "隐藏的"
+ },
+ "cfTypeBoolean": {
+ "message": "布尔值"
+ },
+ "popup2faCloseMessage": {
+ "message": "如果您点击弹窗外的任何区域,将导致弹窗关闭。您想在新窗口中打开此弹窗,以便它不会关闭吗?"
+ },
+ "popupU2fCloseMessage": {
+ "message": "此浏览器无法处理此弹出窗口中的 U2F 请求。您想要在新窗口中打开此弹出窗口吗?"
+ },
+ "disableFavicon": {
+ "message": "禁用网站图标"
+ },
+ "disableFaviconDesc": {
+ "message": "在您密码库的每个登录项目旁边显示一个可识别的图标。"
+ },
+ "disableBadgeCounter": {
+ "message": "禁用角标计数器"
+ },
+ "disableBadgeCounterDesc": {
+ "message": "角标计数器表示您的密码库中可用于当前页面的登录的数量。"
+ },
+ "cardholderName": {
+ "message": "持卡人姓名"
+ },
+ "number": {
+ "message": "号码"
+ },
+ "brand": {
+ "message": "品牌"
+ },
+ "expirationMonth": {
+ "message": "到期月份"
+ },
+ "expirationYear": {
+ "message": "到期年份"
+ },
+ "expiration": {
+ "message": "到期"
+ },
+ "january": {
+ "message": "一月"
+ },
+ "february": {
+ "message": "二月"
+ },
+ "march": {
+ "message": "三月"
+ },
+ "april": {
+ "message": "四月"
+ },
+ "may": {
+ "message": "五月"
+ },
+ "june": {
+ "message": "六月"
+ },
+ "july": {
+ "message": "七月"
+ },
+ "august": {
+ "message": "八月"
+ },
+ "september": {
+ "message": "九月"
+ },
+ "october": {
+ "message": "十月"
+ },
+ "november": {
+ "message": "十一月"
+ },
+ "december": {
+ "message": "十二月"
+ },
+ "securityCode": {
+ "message": "安全码"
+ },
+ "ex": {
+ "message": "例如"
+ },
+ "title": {
+ "message": "称呼"
+ },
+ "mr": {
+ "message": "先生"
+ },
+ "mrs": {
+ "message": "夫人"
+ },
+ "ms": {
+ "message": "女士"
+ },
+ "dr": {
+ "message": "博士"
+ },
+ "firstName": {
+ "message": "名"
+ },
+ "middleName": {
+ "message": "中间名"
+ },
+ "lastName": {
+ "message": "姓"
+ },
+ "identityName": {
+ "message": "身份名称"
+ },
+ "company": {
+ "message": "公司"
+ },
+ "ssn": {
+ "message": "社会安全号码"
+ },
+ "passportNumber": {
+ "message": "护照号码"
+ },
+ "licenseNumber": {
+ "message": "许可证编号"
+ },
+ "email": {
+ "message": "Email"
+ },
+ "phone": {
+ "message": "电话"
+ },
+ "address": {
+ "message": "地址"
+ },
+ "address1": {
+ "message": "地址 1"
+ },
+ "address2": {
+ "message": "地址 2"
+ },
+ "address3": {
+ "message": "地址 3"
+ },
+ "cityTown": {
+ "message": "市 / 镇"
+ },
+ "stateProvince": {
+ "message": "州 / 省"
+ },
+ "zipPostalCode": {
+ "message": "邮编 / 邮政代码"
+ },
+ "country": {
+ "message": "国家"
+ },
+ "type": {
+ "message": "类型"
+ },
+ "typeLogin": {
+ "message": "登录"
+ },
+ "typeLogins": {
+ "message": "登录项目"
+ },
+ "typeSecureNote": {
+ "message": "安全笔记"
+ },
+ "typeCard": {
+ "message": "支付卡"
+ },
+ "typeIdentity": {
+ "message": "身份"
+ },
+ "passwordHistory": {
+ "message": "密码历史记录"
+ },
+ "back": {
+ "message": "后退"
+ },
+ "collections": {
+ "message": "集合"
+ },
+ "favorites": {
+ "message": "收藏"
+ },
+ "popOutNewWindow": {
+ "message": "弹出到新窗口"
+ },
+ "refresh": {
+ "message": "刷新"
+ },
+ "cards": {
+ "message": "支付卡"
+ },
+ "identities": {
+ "message": "身份"
+ },
+ "logins": {
+ "message": "登录"
+ },
+ "secureNotes": {
+ "message": "安全笔记"
+ },
+ "clear": {
+ "message": "清除",
+ "description": "To clear something out. example: To clear browser history."
+ },
+ "checkPassword": {
+ "message": "检查密码是否已经被公开。"
+ },
+ "passwordExposed": {
+ "message": "此密码在泄露数据中已被公开 $VALUE$ 次。请立即修改。",
+ "placeholders": {
+ "value": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "passwordSafe": {
+ "message": "没有在已知的数据泄露中发现此密码,它暂时比较安全。"
+ },
+ "baseDomain": {
+ "message": "基础域"
+ },
+ "host": {
+ "message": "主机",
+ "description": "A URL's host value. For example, the host of https://sub.domain.com:443 is 'sub.domain.com:443'."
+ },
+ "exact": {
+ "message": "精确"
+ },
+ "startsWith": {
+ "message": "开始于"
+ },
+ "regEx": {
+ "message": "正则表达式",
+ "description": "A programming term, also known as 'RegEx'."
+ },
+ "matchDetection": {
+ "message": "匹配检测",
+ "description": "URI match detection for auto-fill."
+ },
+ "defaultMatchDetection": {
+ "message": "默认匹配检测",
+ "description": "Default URI match detection for auto-fill."
+ },
+ "toggleOptions": {
+ "message": "切换选项"
+ },
+ "toggleCurrentUris": {
+ "message": "切换当前网址",
+ "description": "Toggle the display of the URIs of the currently open tabs in the browser."
+ },
+ "currentUri": {
+ "message": "当前 URI",
+ "description": "The URI of one of the current open tabs in the browser."
+ },
+ "organization": {
+ "message": "组织",
+ "description": "An entity of multiple related people (ex. a team or business organization)."
+ },
+ "types": {
+ "message": "类型"
+ },
+ "allItems": {
+ "message": "所有项目"
+ },
+ "noPasswordsInList": {
+ "message": "没有可列出的密码。"
+ },
+ "remove": {
+ "message": "移除"
+ },
+ "default": {
+ "message": "默认"
+ },
+ "dateUpdated": {
+ "message": "更新于",
+ "description": "ex. Date this item was updated"
+ },
+ "datePasswordUpdated": {
+ "message": "密码更新于",
+ "description": "ex. Date this password was updated"
+ },
+ "neverLockWarning": {
+ "message": "您确定要使用“从不”选项吗?将锁定选项设置为“从不”会将密码库的加密密钥存储在您的设备上。如果使用此选项,您必须确保您的设备安全。"
+ },
+ "noOrganizationsList": {
+ "message": "您没有加入任何组织。组织允许您与其他用户安全地共享项目。"
+ },
+ "noCollectionsInList": {
+ "message": "没有可列出的集合。"
+ },
+ "ownership": {
+ "message": "所有权"
+ },
+ "whoOwnsThisItem": {
+ "message": "谁拥有这个项目?"
+ },
+ "strong": {
+ "message": "强",
+ "description": "ex. A strong password. Scale: Weak -> Good -> Strong"
+ },
+ "good": {
+ "message": "良好",
+ "description": "ex. A good password. Scale: Weak -> Good -> Strong"
+ },
+ "weak": {
+ "message": "弱",
+ "description": "ex. A weak password. Scale: Weak -> Good -> Strong"
+ },
+ "weakMasterPassword": {
+ "message": "脆弱的主密码"
+ },
+ "weakMasterPasswordDesc": {
+ "message": "您选择的主密码较弱。您应该使用强密码(或密码短语)来正确保护您的 Bitwarden 账户。仍要使用此主密码吗?"
+ },
+ "pin": {
+ "message": "PIN",
+ "description": "PIN code. Ex. The short code (often numeric) that you use to unlock a device."
+ },
+ "unlockWithPin": {
+ "message": "使用 PIN 解锁"
+ },
+ "setYourPinCode": {
+ "message": "设定您用来解锁 Bitwarden 的 PIN 码。您的 PIN 设置将在您完全注销本应用程序时被重置。"
+ },
+ "pinRequired": {
+ "message": "需要 PIN 码。"
+ },
+ "invalidPin": {
+ "message": "无效 PIN 码。"
+ },
+ "verifyPin": {
+ "message": "验证 PIN 码"
+ },
+ "yourVaultIsLockedPinCode": {
+ "message": "您的密码库已锁定。请验证您的 PIN 码以继续。"
+ },
+ "unlockWithBiometrics": {
+ "message": "使用生物识别解锁"
+ },
+ "awaitDesktop": {
+ "message": "等待来自桌面应用程序的确认"
+ },
+ "awaitDesktopDesc": {
+ "message": "请确认在 Bitwarden 桌面应用程序中使用了生物识别以启用浏览器的生物识别。"
+ },
+ "lockWithMasterPassOnRestart": {
+ "message": "浏览器重启后使用主密码锁定"
+ },
+ "selectOneCollection": {
+ "message": "您必须至少选择一个集合。"
+ },
+ "cloneItem": {
+ "message": "复制项目"
+ },
+ "clone": {
+ "message": "克隆"
+ },
+ "passwordGeneratorPolicyInEffect": {
+ "message": "一个或多个组织策略正在影响您的生成器设置。"
+ },
+ "vaultTimeoutAction": {
+ "message": "密码库超时动作"
+ },
+ "lock": {
+ "message": "锁定",
+ "description": "Verb form: to make secure or inaccesible by"
+ },
+ "trash": {
+ "message": "回收站",
+ "description": "Noun: a special folder to hold deleted items"
+ },
+ "searchTrash": {
+ "message": "搜索回收站"
+ },
+ "permanentlyDeleteItem": {
+ "message": "永久删除项目"
+ },
+ "permanentlyDeleteItemConfirmation": {
+ "message": "您确定要永久删除此项目吗?"
+ },
+ "permanentlyDeletedItem": {
+ "message": "已永久删除项目"
+ },
+ "restoreItem": {
+ "message": "恢复项目"
+ },
+ "restoreItemConfirmation": {
+ "message": "您确定要恢复此项目吗?"
+ },
+ "restoredItem": {
+ "message": "项目已恢复"
+ },
+ "vaultTimeoutLogOutConfirmation": {
+ "message": "超时后注销将解除对密码库的所有访问权限,并需要进行在线认证。确定使用此设置吗?"
+ },
+ "vaultTimeoutLogOutConfirmationTitle": {
+ "message": "超时动作确认"
+ },
+ "autoFillAndSave": {
+ "message": "自动填充并保存"
+ },
+ "autoFillSuccessAndSavedUri": {
+ "message": "项目已自动填充且 URI 已保存"
+ },
+ "autoFillSuccess": {
+ "message": "项目已自动填充"
+ },
+ "setMasterPassword": {
+ "message": "设置主密码"
+ },
+ "masterPasswordPolicyInEffect": {
+ "message": "一个或多个组织策略要求您的主密码满足下列要求:"
+ },
+ "policyInEffectMinComplexity": {
+ "message": "最小复杂度为 $SCORE$",
+ "placeholders": {
+ "score": {
+ "content": "$1",
+ "example": "4"
+ }
+ }
+ },
+ "policyInEffectMinLength": {
+ "message": "最小长度为 $LENGTH$",
+ "placeholders": {
+ "length": {
+ "content": "$1",
+ "example": "14"
+ }
+ }
+ },
+ "policyInEffectUppercase": {
+ "message": "至少包含一个大写字符"
+ },
+ "policyInEffectLowercase": {
+ "message": "至少包含一个小写字符"
+ },
+ "policyInEffectNumbers": {
+ "message": "至少包含一个数字"
+ },
+ "policyInEffectSpecial": {
+ "message": "至少包含一个下列的特殊字符:$CHARS$",
+ "placeholders": {
+ "chars": {
+ "content": "$1",
+ "example": "!@#$%^&*"
+ }
+ }
+ },
+ "masterPasswordPolicyRequirementsNotMet": {
+ "message": "您的新主密码不符合策略要求。"
+ },
+ "acceptPolicies": {
+ "message": "选中此框表示您同意:"
+ },
+ "acceptPoliciesError": {
+ "message": "尚未同意服务条款和隐私政策。"
+ },
+ "termsOfService": {
+ "message": "服务条款"
+ },
+ "privacyPolicy": {
+ "message": "隐私政策"
+ },
+ "hintEqualsPassword": {
+ "message": "您的密码提示不能与您的密码相同。"
+ },
+ "ok": {
+ "message": "确定"
+ },
+ "desktopSyncVerificationTitle": {
+ "message": "桌面同步验证"
+ },
+ "desktopIntegrationVerificationText": {
+ "message": "请验证桌面应用程序显示的指纹为: "
+ },
+ "desktopIntegrationDisabledTitle": {
+ "message": "浏览器整合未启用"
+ },
+ "desktopIntegrationDisabledDesc": {
+ "message": "浏览器整合在 Bitwarden 桌面应用程序中未启用。请在桌面应用程序的设置中启用它。"
+ },
+ "startDesktopTitle": {
+ "message": "启动 Bitwarden 桌面应用程序"
+ },
+ "startDesktopDesc": {
+ "message": "Bitwarden 桌面应用程序需要已启动才能使用此功能。"
+ },
+ "errorEnableBiometricTitle": {
+ "message": "无法启用生物识别"
+ },
+ "errorEnableBiometricDesc": {
+ "message": "操作被桌面应用程序取消"
+ },
+ "nativeMessagingInvalidEncryptionDesc": {
+ "message": "桌面应用程序废止了安全通信通道。请重试此操作"
+ },
+ "nativeMessagingInvalidEncryptionTitle": {
+ "message": "桌面通信已中断"
+ },
+ "nativeMessagingWrongUserDesc": {
+ "message": "桌面应用程序登录到了不同的帐户。请确保两个应用程序都登录到同一个帐户。"
+ },
+ "nativeMessagingWrongUserTitle": {
+ "message": "账户不匹配"
+ },
+ "biometricsNotEnabledTitle": {
+ "message": "生物识别未启用"
+ },
+ "biometricsNotEnabledDesc": {
+ "message": "需要首先在桌面应用程序的设置中启用生物识别才能使用浏览器的生物识别。"
+ },
+ "biometricsNotSupportedTitle": {
+ "message": "不支持生物识别"
+ },
+ "biometricsNotSupportedDesc": {
+ "message": "此设备不支持浏览器生物识别。"
+ },
+ "nativeMessaginPermissionErrorTitle": {
+ "message": "未提供权限"
+ },
+ "nativeMessaginPermissionErrorDesc": {
+ "message": "没有与 Bitwarden 桌面应用程序通信的权限,我们无法在浏览器扩展中提供生物识别。请再试一次。"
+ },
+ "nativeMessaginPermissionSidebarTitle": {
+ "message": "权限请求错误"
+ },
+ "nativeMessaginPermissionSidebarDesc": {
+ "message": "此操作不能在侧边栏中完成,请在弹出窗口或弹出对话框中重试。"
+ },
+ "personalOwnershipSubmitError": {
+ "message": "由于某个企业策略,您被限制为保存项目到您的个人密码库。将所有权选项更改为组织,并从可用的集合中选择。"
+ },
+ "personalOwnershipPolicyInEffect": {
+ "message": "一个组织策略正影响您的所有权选项。"
+ },
+ "excludedDomains": {
+ "message": "排除的域名"
+ },
+ "excludedDomainsDesc": {
+ "message": "Bitwarden 将不会询问是否为这些域名保存登录信息。需要刷新页面才能生效。"
+ },
+ "excludedDomainsInvalidDomain": {
+ "message": "$DOMAIN$ 不是一个有效的域名",
+ "placeholders": {
+ "domain": {
+ "content": "$1",
+ "example": "googlecom"
+ }
+ }
+ },
+ "send": {
+ "message": "Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "searchSends": {
+ "message": "搜索 Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "addSend": {
+ "message": "添加 Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTypeText": {
+ "message": "文本"
+ },
+ "sendTypeFile": {
+ "message": "文件"
+ },
+ "allSends": {
+ "message": "所有 Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "maxAccessCountReached": {
+ "message": "已达最大访问次数"
+ },
+ "expired": {
+ "message": "已过期"
+ },
+ "pendingDeletion": {
+ "message": "等待删除"
+ },
+ "passwordProtected": {
+ "message": "密码保护"
+ },
+ "copySendLink": {
+ "message": "复制 Send 链接",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "removePassword": {
+ "message": "移除密码"
+ },
+ "delete": {
+ "message": "删除"
+ },
+ "removedPassword": {
+ "message": "密码已移除"
+ },
+ "deletedSend": {
+ "message": "Send 已删除",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendLink": {
+ "message": "Send 链接",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "disabled": {
+ "message": "已禁用"
+ },
+ "removePasswordConfirmation": {
+ "message": "确定要移除此密码吗?"
+ },
+ "deleteSend": {
+ "message": "删除 Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "deleteSendConfirmation": {
+ "message": "确定要删除此 Send 吗?",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "editSend": {
+ "message": "编辑 Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTypeHeader": {
+ "message": "这是什么类型的 Send?",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendNameDesc": {
+ "message": "用于描述此 Send 的友好名称。",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendFileDesc": {
+ "message": "您想要发送的文件。"
+ },
+ "deletionDate": {
+ "message": "删除日期"
+ },
+ "deletionDateDesc": {
+ "message": "此 Send 将在指定的日期和时间后被永久删除。",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "expirationDate": {
+ "message": "到期日期"
+ },
+ "expirationDateDesc": {
+ "message": "如果设置,此 Send 将在指定的日期和时间后过期。",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "oneDay": {
+ "message": "1 天"
+ },
+ "days": {
+ "message": "$DAYS$ 天",
+ "placeholders": {
+ "days": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "custom": {
+ "message": "自定义"
+ },
+ "maximumAccessCount": {
+ "message": "最大访问次数"
+ },
+ "maximumAccessCountDesc": {
+ "message": "如果设置,达到最大访问次数后用户将无法访问此 Send。",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendPasswordDesc": {
+ "message": "可选,用户需要提供密码才能访问此 Send。",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendNotesDesc": {
+ "message": "关于此 Send 的私密备注。",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendDisableDesc": {
+ "message": "禁用此 Send 以阻止任何人访问它。",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendShareDesc": {
+ "message": "保存时复制此 Send 的链接到剪贴板。",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTextDesc": {
+ "message": "您想要发送的文本。"
+ },
+ "sendHideText": {
+ "message": "默认隐藏此 Send 的文本。",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "currentAccessCount": {
+ "message": "当前访问次数"
+ },
+ "createSend": {
+ "message": "创建新 Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "newPassword": {
+ "message": "新密码"
+ },
+ "sendDisabled": {
+ "message": "Send 已禁用",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendDisabledWarning": {
+ "message": "由于企业策略,您只能删除现有的 Send。",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "createdSend": {
+ "message": "Send 已创建",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "editedSend": {
+ "message": "Send 已编辑",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendLinuxChromiumFileWarning": {
+ "message": "要选择文件,请在侧边栏中打开扩展(如果可以),或者点击此横幅来弹出一个新窗口。"
+ },
+ "sendFirefoxFileWarning": {
+ "message": "要在 Firefox 中选择文件,请在侧边栏中打开本扩展,或者点击此横幅来弹出一个新窗口。"
+ },
+ "sendSafariFileWarning": {
+ "message": "要在 Safari 中选择文件,请点击此横幅来弹出一个新窗口。"
+ },
+ "sendFileCalloutHeader": {
+ "message": "在开始之前"
+ },
+ "sendFirefoxCustomDatePopoutMessage1": {
+ "message": "要使用日历样式的日期选择器",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read '**To use a calendar style date picker ** click here to pop out your window.'"
+ },
+ "sendFirefoxCustomDatePopoutMessage2": {
+ "message": "点击这里",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker **click here** to pop out your window.'"
+ },
+ "sendFirefoxCustomDatePopoutMessage3": {
+ "message": "来弹出窗口。",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker click here **to pop out your window.**'"
+ },
+ "expirationDateIsInvalid": {
+ "message": "所提供的到期日期无效。"
+ },
+ "deletionDateIsInvalid": {
+ "message": "所提供的删除日期无效。"
+ },
+ "expirationDateAndTimeRequired": {
+ "message": "需要到期日期和时间。"
+ },
+ "deletionDateAndTimeRequired": {
+ "message": "需要删除日期和时间。"
+ },
+ "dateParsingError": {
+ "message": "保存您的删除和到期日期时出错。"
+ },
+ "hideEmail": {
+ "message": "对收件人隐藏我的电子邮件地址。"
+ },
+ "sendOptionsPolicyInEffect": {
+ "message": "一个或多个组织策略正在影响您的 Send 选项。"
+ },
+ "passwordPrompt": {
+ "message": "重新询问主密码"
+ },
+ "passwordConfirmation": {
+ "message": "确认主密码"
+ },
+ "passwordConfirmationDesc": {
+ "message": "此操作受到保护。若要继续,请重新输入您的主密码以验证您的身份。"
+ },
+ "emailVerificationRequired": {
+ "message": "需要验证电子邮件地址"
+ },
+ "emailVerificationRequiredDesc": {
+ "message": "您必须验证电子邮件才能使用此功能。您可以在网页密码库中验证您的电子邮件。"
+ },
+ "updatedMasterPassword": {
+ "message": "Updated Master Password"
+ },
+ "updateMasterPassword": {
+ "message": "Update Master Password"
+ },
+ "updateMasterPasswordWarning": {
+ "message": "Your Master Password was recently changed by an administrator in your organization. In order to access the vault, you must update it now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour."
+ },
+ "resetPasswordPolicyAutoEnroll": {
+ "message": "Automatic Enrollment"
+ },
+ "resetPasswordAutoEnrollInviteWarning": {
+ "message": "This organization has an enterprise policy that will automatically enroll you in password reset. Enrollment will allow organization administrators to change your master password."
+ },
+ "selectFolder": {
+ "message": "Select folder..."
+ },
+ "ssoCompleteRegistration": {
+ "message": "In order to complete logging in with SSO, please set a master password to access and protect your vault."
+ },
+ "hours": {
+ "message": "Hours"
+ },
+ "minutes": {
+ "message": "Minutes"
+ },
+ "vaultTimeoutPolicyInEffect": {
+ "message": "Your organization policies are affecting your vault timeout. Maximum allowed Vault Timeout is $HOURS$ hour(s) and $MINUTES$ minute(s)",
+ "placeholders": {
+ "hours": {
+ "content": "$1",
+ "example": "5"
+ },
+ "minutes": {
+ "content": "$2",
+ "example": "5"
+ }
+ }
+ },
+ "vaultTimeoutToLarge": {
+ "message": "Your vault timeout exceeds the restrictions set by your organization."
+ },
+ "vaultExportDisabled": {
+ "message": "Vault Export Disabled"
+ },
+ "personalVaultExportPolicyInEffect": {
+ "message": "One or more organization policies prevents you from exporting your personal vault."
+ },
+ "copyCustomFieldNameInvalidElement": {
+ "message": "Unable to identify a valid form element. Try inspecting the HTML instead."
+ },
+ "copyCustomFieldNameNotUnique": {
+ "message": "No unique identifier found."
+ }
+}
diff --git a/src/iOS.Safari/Resources/_locales/zh_TW/messages.json b/src/iOS.Safari/Resources/_locales/zh_TW/messages.json
new file mode 100644
index 000000000..643663807
--- /dev/null
+++ b/src/iOS.Safari/Resources/_locales/zh_TW/messages.json
@@ -0,0 +1,1817 @@
+{
+ "appName": {
+ "message": "Bitwarden"
+ },
+ "extName": {
+ "message": "Bitwarden - 免費密碼管理工具",
+ "description": "Extension name, MUST be less than 40 characters (Safari restriction)"
+ },
+ "extDesc": {
+ "message": "Bitwarden 是一款安全、免費、跨平台的密碼管理工具。",
+ "description": "Extension description"
+ },
+ "loginOrCreateNewAccount": {
+ "message": "登入或建立帳戶來存取您的安全密碼庫。"
+ },
+ "createAccount": {
+ "message": "建立帳戶"
+ },
+ "login": {
+ "message": "登入"
+ },
+ "enterpriseSingleSignOn": {
+ "message": "企業單一登入(SSO)"
+ },
+ "cancel": {
+ "message": "取消"
+ },
+ "close": {
+ "message": "關閉"
+ },
+ "submit": {
+ "message": "送出"
+ },
+ "emailAddress": {
+ "message": "電子郵件地址"
+ },
+ "masterPass": {
+ "message": "主密碼"
+ },
+ "masterPassDesc": {
+ "message": "主密碼是您用於存取您的密碼庫的密碼。不要忘記主密碼,這一點非常重要。如果忘記了密碼,無法將其復原。"
+ },
+ "masterPassHintDesc": {
+ "message": "主密碼提示可以在您忘記主密碼時幫助您回憶主密碼。"
+ },
+ "reTypeMasterPass": {
+ "message": "重新輸入主密碼"
+ },
+ "masterPassHint": {
+ "message": "主密碼提示(選用)"
+ },
+ "tab": {
+ "message": "分頁"
+ },
+ "myVault": {
+ "message": "我的密碼庫"
+ },
+ "tools": {
+ "message": "工具"
+ },
+ "settings": {
+ "message": "設定"
+ },
+ "currentTab": {
+ "message": "目前分頁"
+ },
+ "copyPassword": {
+ "message": "複製密碼"
+ },
+ "copyNote": {
+ "message": "複製備註"
+ },
+ "copyUri": {
+ "message": "複製 URI"
+ },
+ "copyUsername": {
+ "message": "複製使用者名稱"
+ },
+ "copyNumber": {
+ "message": "複製號碼"
+ },
+ "copySecurityCode": {
+ "message": "複製安全代碼"
+ },
+ "autoFill": {
+ "message": "自動填入"
+ },
+ "generatePasswordCopied": {
+ "message": "產生及複製密碼"
+ },
+ "copyElementIdentifier": {
+ "message": "複製自訂欄位名稱"
+ },
+ "noMatchingLogins": {
+ "message": "無符合的登入資料。"
+ },
+ "vaultLocked": {
+ "message": "密碼庫已鎖定。"
+ },
+ "vaultLoggedOut": {
+ "message": "密碼庫已登出。"
+ },
+ "autoFillInfo": {
+ "message": "沒有可以自動填入目前瀏覽器分頁的登入資料。"
+ },
+ "addLogin": {
+ "message": "新增登入資料"
+ },
+ "addItem": {
+ "message": "新增項目"
+ },
+ "passwordHint": {
+ "message": "密碼提示"
+ },
+ "enterEmailToGetHint": {
+ "message": "請輸入您的帳户電子郵件地址以接收主密碼提示。"
+ },
+ "getMasterPasswordHint": {
+ "message": "取得主密碼提示"
+ },
+ "continue": {
+ "message": "繼續"
+ },
+ "verificationCode": {
+ "message": "驗證碼"
+ },
+ "account": {
+ "message": "帳戶"
+ },
+ "changeMasterPassword": {
+ "message": "變更主密碼"
+ },
+ "fingerprintPhrase": {
+ "message": "指紋短語",
+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
+ },
+ "yourAccountsFingerprint": {
+ "message": "您帳戶的指紋短語",
+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
+ },
+ "twoStepLogin": {
+ "message": "兩步驟登入"
+ },
+ "logOut": {
+ "message": "登出"
+ },
+ "about": {
+ "message": "關於"
+ },
+ "version": {
+ "message": "版本"
+ },
+ "save": {
+ "message": "儲存"
+ },
+ "move": {
+ "message": "移動"
+ },
+ "addFolder": {
+ "message": "新增資料夾"
+ },
+ "name": {
+ "message": "名稱"
+ },
+ "editFolder": {
+ "message": "編輯資料夾"
+ },
+ "deleteFolder": {
+ "message": "刪除資料夾"
+ },
+ "folders": {
+ "message": "資料夾"
+ },
+ "noFolders": {
+ "message": "沒有可列出的資料夾。"
+ },
+ "helpFeedback": {
+ "message": "協助與意見反應"
+ },
+ "sync": {
+ "message": "同步"
+ },
+ "syncVaultNow": {
+ "message": "立即同步密碼庫"
+ },
+ "lastSync": {
+ "message": "上次同步於:"
+ },
+ "passGen": {
+ "message": "密碼產生器"
+ },
+ "generator": {
+ "message": "產生器",
+ "description": "Short for 'Password Generator'."
+ },
+ "passGenInfo": {
+ "message": "自動產生安全、唯一的登入密碼。"
+ },
+ "bitWebVault": {
+ "message": "Bitwarden 網頁版密碼庫"
+ },
+ "importItems": {
+ "message": "匯入項目"
+ },
+ "select": {
+ "message": "選擇"
+ },
+ "generatePassword": {
+ "message": "產生密碼"
+ },
+ "regeneratePassword": {
+ "message": "重新產生密碼"
+ },
+ "options": {
+ "message": "選項"
+ },
+ "length": {
+ "message": "長度"
+ },
+ "numWords": {
+ "message": "字數"
+ },
+ "wordSeparator": {
+ "message": "文字分隔字元"
+ },
+ "capitalize": {
+ "message": "大寫",
+ "description": "Make the first letter of a work uppercase."
+ },
+ "includeNumber": {
+ "message": "包含數字"
+ },
+ "minNumbers": {
+ "message": "最少數字位數"
+ },
+ "minSpecial": {
+ "message": "最少符號位數"
+ },
+ "avoidAmbChar": {
+ "message": "避免易混淆的字元"
+ },
+ "searchVault": {
+ "message": "搜尋密碼庫"
+ },
+ "edit": {
+ "message": "編輯"
+ },
+ "view": {
+ "message": "檢視"
+ },
+ "noItemsInList": {
+ "message": "沒有可列出的項目。"
+ },
+ "itemInformation": {
+ "message": "項目資訊"
+ },
+ "username": {
+ "message": "使用者名稱"
+ },
+ "password": {
+ "message": "密碼"
+ },
+ "passphrase": {
+ "message": "密碼短語"
+ },
+ "favorite": {
+ "message": "我的最愛"
+ },
+ "notes": {
+ "message": "備註"
+ },
+ "note": {
+ "message": "備註"
+ },
+ "editItem": {
+ "message": "編輯項目"
+ },
+ "folder": {
+ "message": "資料夾"
+ },
+ "deleteItem": {
+ "message": "刪除項目"
+ },
+ "viewItem": {
+ "message": "檢視項目"
+ },
+ "launch": {
+ "message": "啟動"
+ },
+ "website": {
+ "message": "網站"
+ },
+ "toggleVisibility": {
+ "message": "切換可見度"
+ },
+ "manage": {
+ "message": "管理"
+ },
+ "other": {
+ "message": "其他"
+ },
+ "rateExtension": {
+ "message": "為本套件評分"
+ },
+ "rateExtensionDesc": {
+ "message": "請給予我們好評!"
+ },
+ "browserNotSupportClipboard": {
+ "message": "您的瀏覽器不支援剪貼簿簡單複製,請手動複製。"
+ },
+ "verifyMasterPassword": {
+ "message": "驗證主密碼"
+ },
+ "yourVaultIsLocked": {
+ "message": "密碼庫已鎖定。驗證主密碼以繼續。"
+ },
+ "unlock": {
+ "message": "解鎖"
+ },
+ "loggedInAsOn": {
+ "message": "已在 $HOSTNAME$ 以 $EMAIL$ 身份登入。",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "name@example.com"
+ },
+ "hostname": {
+ "content": "$2",
+ "example": "bitwarden.com"
+ }
+ }
+ },
+ "invalidMasterPassword": {
+ "message": "無效的主密碼"
+ },
+ "vaultTimeout": {
+ "message": "密碼庫逾時"
+ },
+ "lockNow": {
+ "message": "立即鎖定"
+ },
+ "immediately": {
+ "message": "立即"
+ },
+ "tenSeconds": {
+ "message": "10 秒鐘"
+ },
+ "twentySeconds": {
+ "message": "20 秒鐘"
+ },
+ "thirtySeconds": {
+ "message": "30 秒鐘"
+ },
+ "oneMinute": {
+ "message": "1 分鐘"
+ },
+ "twoMinutes": {
+ "message": "2 分鐘"
+ },
+ "fiveMinutes": {
+ "message": "5 分鐘"
+ },
+ "fifteenMinutes": {
+ "message": "15 分鐘"
+ },
+ "thirtyMinutes": {
+ "message": "30 分鐘"
+ },
+ "oneHour": {
+ "message": "1 小時"
+ },
+ "fourHours": {
+ "message": "4 小時"
+ },
+ "onLocked": {
+ "message": "系統鎖定時"
+ },
+ "onRestart": {
+ "message": "瀏覽器重新啟動時"
+ },
+ "never": {
+ "message": "永不"
+ },
+ "security": {
+ "message": "安全"
+ },
+ "errorOccurred": {
+ "message": "發生錯誤。"
+ },
+ "emailRequired": {
+ "message": "必須填入電子郵件地址 。"
+ },
+ "invalidEmail": {
+ "message": "無效的電子郵件地址。"
+ },
+ "masterPassRequired": {
+ "message": "必須填入主密碼。"
+ },
+ "masterPassLength": {
+ "message": "主密碼需要至少 8 個字元。"
+ },
+ "masterPassDoesntMatch": {
+ "message": "兩次填入的主密碼不一致。"
+ },
+ "newAccountCreated": {
+ "message": "帳戶已建立!現在可以登入了。"
+ },
+ "masterPassSent": {
+ "message": "已寄出包含您主密碼提示的電子郵件。"
+ },
+ "verificationCodeRequired": {
+ "message": "必須填入驗證碼。"
+ },
+ "valueCopied": {
+ "message": "$VALUE$ 已複製",
+ "description": "Value has been copied to the clipboard.",
+ "placeholders": {
+ "value": {
+ "content": "$1",
+ "example": "Password"
+ }
+ }
+ },
+ "autofillError": {
+ "message": "無法在此頁面自動填入所選項目。請改為手動複製並貼上。"
+ },
+ "loggedOut": {
+ "message": "已登出"
+ },
+ "loginExpired": {
+ "message": "您的登入階段已過期。"
+ },
+ "logOutConfirmation": {
+ "message": "您確定要登出嗎?"
+ },
+ "yes": {
+ "message": "是"
+ },
+ "no": {
+ "message": "否"
+ },
+ "unexpectedError": {
+ "message": "發生了未預期的錯誤。"
+ },
+ "nameRequired": {
+ "message": "必須填入名稱。"
+ },
+ "addedFolder": {
+ "message": "資料夾已新增"
+ },
+ "changeMasterPass": {
+ "message": "變更主密碼"
+ },
+ "changeMasterPasswordConfirmation": {
+ "message": "您可以在 Bitwarden 網頁版密碼庫變更主密碼。現在要前往嗎?"
+ },
+ "twoStepLoginConfirmation": {
+ "message": "兩步驟登入需要您從其他裝置(例如安全金鑰、驗證器程式、SMS、手機或電子郵件)來驗證您的登入,這使您的帳戶更加安全。兩步驟登入可以在 Bitwarden 網頁版密碼庫啟用。現在要前往嗎?"
+ },
+ "editedFolder": {
+ "message": "資料夾已編輯"
+ },
+ "deleteFolderConfirmation": {
+ "message": "您確定要刪除此資料夾嗎?"
+ },
+ "deletedFolder": {
+ "message": "資料夾已刪除"
+ },
+ "gettingStartedTutorial": {
+ "message": "新手教學"
+ },
+ "gettingStartedTutorialVideo": {
+ "message": "觀看我們的新手教學,了解如何充分利用瀏覽器擴充套件。"
+ },
+ "syncingComplete": {
+ "message": "同步完成"
+ },
+ "syncingFailed": {
+ "message": "同步失敗"
+ },
+ "passwordCopied": {
+ "message": "密碼已複製"
+ },
+ "uri": {
+ "message": "URI"
+ },
+ "uriPosition": {
+ "message": "URI $POSITION$",
+ "description": "A listing of URIs. Ex: URI 1, URI 2, URI 3, etc.",
+ "placeholders": {
+ "position": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "newUri": {
+ "message": "新增 URI"
+ },
+ "addedItem": {
+ "message": "項目已新增"
+ },
+ "editedItem": {
+ "message": "項目已編輯"
+ },
+ "deleteItemConfirmation": {
+ "message": "確定要刪除此項目嗎?"
+ },
+ "deletedItem": {
+ "message": "已將項目丟到垃圾桶"
+ },
+ "overwritePassword": {
+ "message": "覆寫密碼"
+ },
+ "overwritePasswordConfirmation": {
+ "message": "您確定要覆寫目前的密碼嗎?"
+ },
+ "searchFolder": {
+ "message": "搜尋資料夾"
+ },
+ "searchCollection": {
+ "message": "搜尋集合"
+ },
+ "searchType": {
+ "message": "搜尋類型"
+ },
+ "noneFolder": {
+ "message": "(未分類)",
+ "description": "This is the folder for uncategorized items"
+ },
+ "disableAddLoginNotification": {
+ "message": "停用新增登入資料提示"
+ },
+ "addLoginNotificationDesc": {
+ "message": "當您首次登入時,「新增登入資料提示」會自動提醒您在密碼庫中新增登入資料。"
+ },
+ "dontShowCardsCurrentTab": {
+ "message": "不要在分頁頁面顯示支付卡"
+ },
+ "dontShowCardsCurrentTabDesc": {
+ "message": "將密碼庫中的支付卡項目列在「目前分頁」頁面上,以便於自動填入。"
+ },
+ "dontShowIdentitiesCurrentTab": {
+ "message": "不要在分頁頁面顯示身分"
+ },
+ "dontShowIdentitiesCurrentTabDesc": {
+ "message": "將密碼庫中的身分項目列在「目前分頁」頁面上,以便於自動填入。"
+ },
+ "clearClipboard": {
+ "message": "清除剪貼簿",
+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
+ },
+ "clearClipboardDesc": {
+ "message": "自動清除剪貼簿中複製的值。",
+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
+ },
+ "notificationAddDesc": {
+ "message": "希望 Bitwarden 幫您儲存這個密碼嗎?"
+ },
+ "notificationAddSave": {
+ "message": "是,立即儲存"
+ },
+ "notificationNeverSave": {
+ "message": "此網站不再提示"
+ },
+ "disableChangedPasswordNotification": {
+ "message": "停用密碼變更通知"
+ },
+ "disableChangedPasswordNotificationDesc": {
+ "message": "偵測到您已變更網站上的密碼時,「密碼變更通知」將會自動提醒您更新密碼庫的密碼。"
+ },
+ "notificationChangeDesc": {
+ "message": "是否要在 Bitwarden 中更新此密碼?"
+ },
+ "notificationChangeSave": {
+ "message": "是,立即更新"
+ },
+ "disableContextMenuItem": {
+ "message": "停用右鍵選單選項"
+ },
+ "disableContextMenuItemDesc": {
+ "message": "右鍵選單選項可讓您在目前分頁中快速存取密碼或使用密碼產生器產生新密碼。"
+ },
+ "defaultUriMatchDetection": {
+ "message": "預設的 URI 一致性偵測",
+ "description": "Default URI match detection for auto-fill."
+ },
+ "defaultUriMatchDetectionDesc": {
+ "message": "選擇在執行自動填入等動作時對登入資料進行 URI 一致性偵測的預設方式。"
+ },
+ "theme": {
+ "message": "主題"
+ },
+ "themeDesc": {
+ "message": "變更應用程式的主題色彩。"
+ },
+ "dark": {
+ "message": "深色",
+ "description": "Dark color"
+ },
+ "light": {
+ "message": "淺色",
+ "description": "Light color"
+ },
+ "solarizedDark": {
+ "message": "Solarized Dark",
+ "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated."
+ },
+ "exportVault": {
+ "message": "匯出密碼庫"
+ },
+ "fileFormat": {
+ "message": "檔案格式"
+ },
+ "warning": {
+ "message": "警告",
+ "description": "WARNING (should stay in capitalized letters if the language permits)"
+ },
+ "confirmVaultExport": {
+ "message": "確認密碼庫匯出"
+ },
+ "exportWarningDesc": {
+ "message": "此次匯出包含未加密格式的密碼庫檔案。您不應將它存放或經由不安全的方式(例如電子郵件)傳送。用完後請立即將它刪除。"
+ },
+ "encExportKeyWarningDesc": {
+ "message": "將使用您帳戶的加密金鑰來加密匯出資料,若您更新了帳戶的加密金鑰,請重新匯出,才有辦法解密匯出的檔案。"
+ },
+ "encExportAccountWarningDesc": {
+ "message": "每個 Bitwarden 使用者帳戶的帳戶加密金鑰都不同,因此無法將加密過的匯出檔案匯入到不同帳戶中。"
+ },
+ "exportMasterPassword": {
+ "message": "輸入您的主密碼以匯出密碼庫資料。"
+ },
+ "shared": {
+ "message": "已共用"
+ },
+ "learnOrg": {
+ "message": "瞭解組織"
+ },
+ "learnOrgConfirmation": {
+ "message": "Bitwarden 允許您使用組織與他人分享您的密碼庫項目。您想造訪 bitwarden.com 網站以了解更多內容詳情嗎?"
+ },
+ "moveToOrganization": {
+ "message": "移動至組織 "
+ },
+ "share": {
+ "message": "共用"
+ },
+ "movedItemToOrg": {
+ "message": "已將 $ITEMNAME$ 移動至 $ORGNAME$",
+ "placeholders": {
+ "itemname": {
+ "content": "$1",
+ "example": "Secret Item"
+ },
+ "orgname": {
+ "content": "$2",
+ "example": "Company Name"
+ }
+ }
+ },
+ "moveToOrgDesc": {
+ "message": "選擇您希望將這個項目移動到哪個組織。項目的擁有權將會轉移到該組織。一經移動,您將不再是此項目的直接擁有者。"
+ },
+ "learnMore": {
+ "message": "了解更多"
+ },
+ "authenticatorKeyTotp": {
+ "message": "驗證器金鑰 (TOTP)"
+ },
+ "verificationCodeTotp": {
+ "message": "驗證碼 (TOTP)"
+ },
+ "copyVerificationCode": {
+ "message": "複製驗證碼"
+ },
+ "attachments": {
+ "message": "附件"
+ },
+ "deleteAttachment": {
+ "message": "刪除附件"
+ },
+ "deleteAttachmentConfirmation": {
+ "message": "確定要刪除此附件嗎?"
+ },
+ "deletedAttachment": {
+ "message": "附件已刪除"
+ },
+ "newAttachment": {
+ "message": "新增附件"
+ },
+ "noAttachments": {
+ "message": "沒有附件。"
+ },
+ "attachmentSaved": {
+ "message": "附件已儲存。"
+ },
+ "file": {
+ "message": "檔案"
+ },
+ "selectFile": {
+ "message": "選擇檔案。"
+ },
+ "maxFileSize": {
+ "message": "檔案最大為 500MB。"
+ },
+ "featureUnavailable": {
+ "message": "功能無法使用"
+ },
+ "updateKey": {
+ "message": "更新加密金鑰前不能使用此功能。"
+ },
+ "premiumMembership": {
+ "message": "進階會員"
+ },
+ "premiumManage": {
+ "message": "管理會員資格"
+ },
+ "premiumManageAlert": {
+ "message": "您可以在 Bitwarden 網頁版管理您的會員資格。現在要前往嗎?"
+ },
+ "premiumRefresh": {
+ "message": "重新整理會員資格"
+ },
+ "premiumNotCurrentMember": {
+ "message": "您尚未成為進階會員。"
+ },
+ "premiumSignUpAndGet": {
+ "message": "註冊成為進階會員將獲得:"
+ },
+ "ppremiumSignUpStorage": {
+ "message": "用於檔案附件的 1 GB 加密儲存空間。"
+ },
+ "ppremiumSignUpTwoStep": {
+ "message": "YubiKey、FIDO U2F 和 Duo 等額外的兩步驟登入選項。"
+ },
+ "ppremiumSignUpReports": {
+ "message": "密碼健康度檢查、提供帳戶體檢以及資料外洩報告,以保障您的密碼庫安全。"
+ },
+ "ppremiumSignUpTotp": {
+ "message": "用於登入您的密碼庫的 TOTP 驗證碼 (2FA) 產生器。"
+ },
+ "ppremiumSignUpSupport": {
+ "message": "優先客戶支援。"
+ },
+ "ppremiumSignUpFuture": {
+ "message": "未來會增加更多進階功能,敬請期待!"
+ },
+ "premiumPurchase": {
+ "message": "購買進階會員資格"
+ },
+ "premiumPurchaseAlert": {
+ "message": "您可以在 Bitwarden 網頁版密碼庫購買進階會員資格。現在要前往嗎?"
+ },
+ "premiumCurrentMember": {
+ "message": "您目前為進階會員!"
+ },
+ "premiumCurrentMemberThanks": {
+ "message": "感謝您支持 Bitwarden 。"
+ },
+ "premiumPrice": {
+ "message": "每年只需 $PRICE$!",
+ "placeholders": {
+ "price": {
+ "content": "$1",
+ "example": "$10"
+ }
+ }
+ },
+ "refreshComplete": {
+ "message": "重新整理完成"
+ },
+ "disableAutoTotpCopy": {
+ "message": "停用自動 TOTP 複製"
+ },
+ "disableAutoTotpCopyDesc": {
+ "message": "如果您的登入資料已包含驗證器金鑰,TOTP 驗證碼會在您自動填入時自動複製到您的剪貼簿。"
+ },
+ "disableAutoBiometricsPrompt": {
+ "message": "不要在啟動時提示生物特徵辨識驗證。"
+ },
+ "premiumRequired": {
+ "message": "需要進階會員資格"
+ },
+ "premiumRequiredDesc": {
+ "message": "進階會員才可使用此功能。"
+ },
+ "enterVerificationCodeApp": {
+ "message": "輸入驗證器應用程式提供的 6 位數驗證碼。"
+ },
+ "enterVerificationCodeEmail": {
+ "message": "輸入已傳送至 $EMAIL$ 的 6 位數驗證碼。",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "example@gmail.com"
+ }
+ }
+ },
+ "verificationCodeEmailSent": {
+ "message": "驗證碼已傳送至 $EMAIL$。",
+ "placeholders": {
+ "email": {
+ "content": "$1",
+ "example": "example@gmail.com"
+ }
+ }
+ },
+ "rememberMe": {
+ "message": "記住我"
+ },
+ "sendVerificationCodeEmailAgain": {
+ "message": "再次傳送包含驗證碼的電子郵件"
+ },
+ "useAnotherTwoStepMethod": {
+ "message": "使用另一種兩步驟登入方式"
+ },
+ "insertYubiKey": {
+ "message": "將您的 YubiKey 插入電腦的 USB 連接埠,然後按一下它的按鈕。"
+ },
+ "insertU2f": {
+ "message": "將您的安全金鑰插入電腦的 USB 連接埠,然後按一下它的按鈕(如有的話)。"
+ },
+ "webAuthnNewTab": {
+ "message": "要開始 WebAuthn 2FA 驗證,請點擊下面的按鈕打開一個新的分頁,並按照新分頁中提供的說明操作。"
+ },
+ "webAuthnNewTabOpen": {
+ "message": "開啟新分頁"
+ },
+ "webAuthnAuthenticate": {
+ "message": "驗證 WebAuthn"
+ },
+ "loginUnavailable": {
+ "message": "登入無法使用"
+ },
+ "noTwoStepProviders": {
+ "message": "此帳戶已啟用兩步驟登入,但是本瀏覽器不支援已設定的兩步驟登入方式。"
+ },
+ "noTwoStepProviders2": {
+ "message": "請使用已支援的瀏覽器(例如 Chrome ),及/或新增可以更好地跨瀏覽器的兩步驟登入方法(例如驗證器應用程式)。"
+ },
+ "twoStepOptions": {
+ "message": "兩步驟登入選項"
+ },
+ "recoveryCodeDesc": {
+ "message": "無法使用任何兩步驟登入方式?請使用您的復原代碼以停用您帳戶的所有兩步驟登入方式。"
+ },
+ "recoveryCodeTitle": {
+ "message": "復原代碼"
+ },
+ "authenticatorAppTitle": {
+ "message": "驗證器應用程式"
+ },
+ "authenticatorAppDesc": {
+ "message": "使用驗證器應用程式 (如 Authy 或 Google Authenticator) 產生基於時間的驗證碼。",
+ "description": "'Authy' and 'Google Authenticator' are product names and should not be translated."
+ },
+ "yubiKeyTitle": {
+ "message": "YubiKey OTP 安全金鑰"
+ },
+ "yubiKeyDesc": {
+ "message": "使用 YubiKey 存取您的帳戶。支援 YubiKey 4、4 Nano、4C、以及 NEO 裝置。"
+ },
+ "duoDesc": {
+ "message": "使用 Duo Security 的 Duo Mobile 程式、SMS 、致電或 U2F 安全金鑰進行驗證。",
+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
+ },
+ "duoOrganizationDesc": {
+ "message": "為您的組織使用 Duo Security 的 Duo Mobile 程式、SMS、致電或 U2F 安全金鑰進行驗證。",
+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
+ },
+ "webAuthnTitle": {
+ "message": "FIDO2 WebAuthn"
+ },
+ "webAuthnDesc": {
+ "message": "使用任何具有 WebAuthn 功能的安全金鑰來存取您的帳戶。"
+ },
+ "emailTitle": {
+ "message": "電子郵件"
+ },
+ "emailDesc": {
+ "message": "將使用電子郵件傳送驗證碼給您。"
+ },
+ "selfHostedEnvironment": {
+ "message": "自我託管環境"
+ },
+ "selfHostedEnvironmentFooter": {
+ "message": "指定您內部部署的 Bitwarden 安裝之基礎 URL。"
+ },
+ "customEnvironment": {
+ "message": "自訂環境"
+ },
+ "customEnvironmentFooter": {
+ "message": "適用於進階使用者。您可以單獨指定各個服務的基礎 URL。"
+ },
+ "baseUrl": {
+ "message": "伺服器 URL"
+ },
+ "apiUrl": {
+ "message": "API 伺服器 URL"
+ },
+ "webVaultUrl": {
+ "message": "網頁版密碼庫伺服器 URL"
+ },
+ "identityUrl": {
+ "message": "身分伺服器 URL"
+ },
+ "notificationsUrl": {
+ "message": "通知伺服器 URL"
+ },
+ "iconsUrl": {
+ "message": "圖示伺服器 URL"
+ },
+ "environmentSaved": {
+ "message": "環境 URL 已儲存。"
+ },
+ "enableAutoFillOnPageLoad": {
+ "message": "啟用頁面載入時的自動填入功能"
+ },
+ "enableAutoFillOnPageLoadDesc": {
+ "message": "如果網頁載入時偵測到登入表單,則自動執行表單填入。"
+ },
+ "experimentalFeature": {
+ "message": "目前這是一項實驗性功能。要使用需自行承擔風險。"
+ },
+ "defaultAutoFillOnPageLoad": {
+ "message": "登入項目的預設自動填入設定"
+ },
+ "defaultAutoFillOnPageLoadDesc": {
+ "message": "頁面載入時自動填入啟用後,你可以給個別登入項目啟用或停用這個功能。這是未單獨配置的登入項目的預設設定。"
+ },
+ "itemAutoFillOnPageLoad": {
+ "message": "頁面載入時自動填入 (如果選項中已啟用)"
+ },
+ "autoFillOnPageLoadUseDefault": {
+ "message": "使用預設設定"
+ },
+ "autoFillOnPageLoadYes": {
+ "message": "頁面載入時自動填入"
+ },
+ "autoFillOnPageLoadNo": {
+ "message": "不要在頁面載入時自動填入"
+ },
+ "commandOpenPopup": {
+ "message": "在彈出式視窗中開啟密碼庫"
+ },
+ "commandOpenSidebar": {
+ "message": "在側邊欄中開啟密碼庫"
+ },
+ "commandAutofillDesc": {
+ "message": "自動使用最後一次登入的登入資料填入目前網站"
+ },
+ "commandGeneratePasswordDesc": {
+ "message": "產生一組新的隨機密碼並將它複製到剪貼簿中。"
+ },
+ "commandLockVaultDesc": {
+ "message": "鎖定密碼庫"
+ },
+ "privateModeMessage": {
+ "message": "很遺憾,在瀏覽器的隱私模式下,此視窗無法使用。"
+ },
+ "customFields": {
+ "message": "自訂欄位"
+ },
+ "copyValue": {
+ "message": "複製值"
+ },
+ "value": {
+ "message": "值"
+ },
+ "newCustomField": {
+ "message": "新增自訂欄位"
+ },
+ "dragToSort": {
+ "message": "透過拖曳來排序"
+ },
+ "cfTypeText": {
+ "message": "文字"
+ },
+ "cfTypeHidden": {
+ "message": "隱藏"
+ },
+ "cfTypeBoolean": {
+ "message": "布林值"
+ },
+ "popup2faCloseMessage": {
+ "message": "如果您點選彈出式視窗外的任意區域,將導致彈出式視窗關閉。您想在新視窗中開啟此彈出式視窗,以讓它不關閉嗎?"
+ },
+ "popupU2fCloseMessage": {
+ "message": "此瀏覽器不能在彈出式視窗中處理 U2F 要求。是否在新視窗開啟此對話方塊,以便您能夠使用 U2F 登入?"
+ },
+ "disableFavicon": {
+ "message": "停用網站圖示顯示功能"
+ },
+ "disableFaviconDesc": {
+ "message": "在您密碼庫的每個登入資料旁顯示一個可辨識的圖示。"
+ },
+ "disableBadgeCounter": {
+ "message": "停用角標計數器"
+ },
+ "disableBadgeCounterDesc": {
+ "message": "角標計數器表示您的密碼庫中可用於當前頁面的登入資料的數量。"
+ },
+ "cardholderName": {
+ "message": "持卡人姓名"
+ },
+ "number": {
+ "message": "號碼"
+ },
+ "brand": {
+ "message": "發卡組織"
+ },
+ "expirationMonth": {
+ "message": "逾期月份"
+ },
+ "expirationYear": {
+ "message": "逾期年份"
+ },
+ "expiration": {
+ "message": "逾期"
+ },
+ "january": {
+ "message": "一月"
+ },
+ "february": {
+ "message": "二月"
+ },
+ "march": {
+ "message": "三月"
+ },
+ "april": {
+ "message": "四月"
+ },
+ "may": {
+ "message": "五月"
+ },
+ "june": {
+ "message": "六月"
+ },
+ "july": {
+ "message": "七月"
+ },
+ "august": {
+ "message": "八月"
+ },
+ "september": {
+ "message": "九月"
+ },
+ "october": {
+ "message": "十月"
+ },
+ "november": {
+ "message": "十一月"
+ },
+ "december": {
+ "message": "十二月"
+ },
+ "securityCode": {
+ "message": "安全代碼"
+ },
+ "ex": {
+ "message": "例如"
+ },
+ "title": {
+ "message": "稱呼"
+ },
+ "mr": {
+ "message": "Mr"
+ },
+ "mrs": {
+ "message": "Mrs"
+ },
+ "ms": {
+ "message": "Ms"
+ },
+ "dr": {
+ "message": "Dr"
+ },
+ "firstName": {
+ "message": "名"
+ },
+ "middleName": {
+ "message": "中間名"
+ },
+ "lastName": {
+ "message": "姓"
+ },
+ "identityName": {
+ "message": "身分名稱"
+ },
+ "company": {
+ "message": "公司"
+ },
+ "ssn": {
+ "message": "社會安全號碼"
+ },
+ "passportNumber": {
+ "message": "護照號碼"
+ },
+ "licenseNumber": {
+ "message": "許可證編號"
+ },
+ "email": {
+ "message": "電子郵件"
+ },
+ "phone": {
+ "message": "電話號碼"
+ },
+ "address": {
+ "message": "地址"
+ },
+ "address1": {
+ "message": "地址 1"
+ },
+ "address2": {
+ "message": "地址 2"
+ },
+ "address3": {
+ "message": "地址 3"
+ },
+ "cityTown": {
+ "message": "市/鎮"
+ },
+ "stateProvince": {
+ "message": "州/省"
+ },
+ "zipPostalCode": {
+ "message": "郵遞區號"
+ },
+ "country": {
+ "message": "國家"
+ },
+ "type": {
+ "message": "類型"
+ },
+ "typeLogin": {
+ "message": "登入"
+ },
+ "typeLogins": {
+ "message": "登入資料"
+ },
+ "typeSecureNote": {
+ "message": "安全筆記"
+ },
+ "typeCard": {
+ "message": "支付卡"
+ },
+ "typeIdentity": {
+ "message": "身分"
+ },
+ "passwordHistory": {
+ "message": "密碼歷史記錄"
+ },
+ "back": {
+ "message": "返回"
+ },
+ "collections": {
+ "message": "集合"
+ },
+ "favorites": {
+ "message": "我的最愛"
+ },
+ "popOutNewWindow": {
+ "message": "彈出至新視窗"
+ },
+ "refresh": {
+ "message": "重新整理"
+ },
+ "cards": {
+ "message": "支付卡"
+ },
+ "identities": {
+ "message": "身分"
+ },
+ "logins": {
+ "message": "登入資料"
+ },
+ "secureNotes": {
+ "message": "安全筆記"
+ },
+ "clear": {
+ "message": "清除",
+ "description": "To clear something out. example: To clear browser history."
+ },
+ "checkPassword": {
+ "message": "檢查密碼是否已外洩。"
+ },
+ "passwordExposed": {
+ "message": "此密碼已外洩了 $VALUE$ 次,應立即變更密碼。",
+ "placeholders": {
+ "value": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "passwordSafe": {
+ "message": "任何已知的外洩密碼資料庫中都沒有此密碼,它目前是安全的。"
+ },
+ "baseDomain": {
+ "message": "基底網域"
+ },
+ "host": {
+ "message": "主機",
+ "description": "A URL's host value. For example, the host of https://sub.domain.com:443 is 'sub.domain.com:443'."
+ },
+ "exact": {
+ "message": "完全相符"
+ },
+ "startsWith": {
+ "message": "開始於"
+ },
+ "regEx": {
+ "message": "規則運算式",
+ "description": "A programming term, also known as 'RegEx'."
+ },
+ "matchDetection": {
+ "message": "一致性偵測",
+ "description": "URI match detection for auto-fill."
+ },
+ "defaultMatchDetection": {
+ "message": "預設一致性偵測",
+ "description": "Default URI match detection for auto-fill."
+ },
+ "toggleOptions": {
+ "message": "切換選項"
+ },
+ "toggleCurrentUris": {
+ "message": "切換目前 URL",
+ "description": "Toggle the display of the URIs of the currently open tabs in the browser."
+ },
+ "currentUri": {
+ "message": "目前 URL",
+ "description": "The URI of one of the current open tabs in the browser."
+ },
+ "organization": {
+ "message": "組織",
+ "description": "An entity of multiple related people (ex. a team or business organization)."
+ },
+ "types": {
+ "message": "類型"
+ },
+ "allItems": {
+ "message": "所有項目"
+ },
+ "noPasswordsInList": {
+ "message": "沒有可顯示的密碼。"
+ },
+ "remove": {
+ "message": "移除"
+ },
+ "default": {
+ "message": "預設"
+ },
+ "dateUpdated": {
+ "message": "更新於",
+ "description": "ex. Date this item was updated"
+ },
+ "datePasswordUpdated": {
+ "message": "密碼更新於",
+ "description": "ex. Date this password was updated"
+ },
+ "neverLockWarning": {
+ "message": "您確定要使用「永不」選項嗎?將鎖定選項設定為「永不」會將密碼庫的加密金鑰儲存在您的裝置上。如果使用此選項,應確保您的裝置是安全的。"
+ },
+ "noOrganizationsList": {
+ "message": "您沒有加入任何組織。組織允許您與其他使用者安全地共用項目。"
+ },
+ "noCollectionsInList": {
+ "message": "沒有可顯示的集合。"
+ },
+ "ownership": {
+ "message": "擁有權"
+ },
+ "whoOwnsThisItem": {
+ "message": "誰擁有這個項目?"
+ },
+ "strong": {
+ "message": "強",
+ "description": "ex. A strong password. Scale: Weak -> Good -> Strong"
+ },
+ "good": {
+ "message": "好",
+ "description": "ex. A good password. Scale: Weak -> Good -> Strong"
+ },
+ "weak": {
+ "message": "弱",
+ "description": "ex. A weak password. Scale: Weak -> Good -> Strong"
+ },
+ "weakMasterPassword": {
+ "message": "主密碼強度太弱"
+ },
+ "weakMasterPasswordDesc": {
+ "message": "您設定的主密碼很脆弱。您應該使用高強度的密碼 (或密碼短語) 來正確保護您的 bitwarden 帳戶。仍要使用這組主密碼嗎?"
+ },
+ "pin": {
+ "message": "PIN",
+ "description": "PIN code. Ex. The short code (often numeric) that you use to unlock a device."
+ },
+ "unlockWithPin": {
+ "message": "使用 PIN 碼解鎖"
+ },
+ "setYourPinCode": {
+ "message": "設定您用來解鎖 Bitwarden 的 PIN 碼。您的 PIN 設定將在您完全登出本應用程式時被重設。"
+ },
+ "pinRequired": {
+ "message": "需要 PIN 碼。"
+ },
+ "invalidPin": {
+ "message": "無效的 PIN 碼。"
+ },
+ "verifyPin": {
+ "message": "驗證 PIN 碼"
+ },
+ "yourVaultIsLockedPinCode": {
+ "message": "密碼庫已鎖定。驗證 PIN 碼以繼續。"
+ },
+ "unlockWithBiometrics": {
+ "message": "使用生物特徵辨識解鎖"
+ },
+ "awaitDesktop": {
+ "message": "等待來自桌面應用程式的確認"
+ },
+ "awaitDesktopDesc": {
+ "message": "請確認在 Bitwarden 桌面應用程式中使用了生物特徵辨識,以啟用瀏覽器的生物特徵辨識。"
+ },
+ "lockWithMasterPassOnRestart": {
+ "message": "瀏覽器重啟後使用主密碼鎖定"
+ },
+ "selectOneCollection": {
+ "message": "您必須至少選擇一個集合。"
+ },
+ "cloneItem": {
+ "message": "複製項目"
+ },
+ "clone": {
+ "message": "複製"
+ },
+ "passwordGeneratorPolicyInEffect": {
+ "message": "一個或多個組織原則正影響密碼產生器設定。"
+ },
+ "vaultTimeoutAction": {
+ "message": "密碼庫逾時動作"
+ },
+ "lock": {
+ "message": "鎖定",
+ "description": "Verb form: to make secure or inaccesible by"
+ },
+ "trash": {
+ "message": "垃圾桶",
+ "description": "Noun: a special folder to hold deleted items"
+ },
+ "searchTrash": {
+ "message": "搜尋垃圾桶"
+ },
+ "permanentlyDeleteItem": {
+ "message": "永久刪除項目"
+ },
+ "permanentlyDeleteItemConfirmation": {
+ "message": "您確定要永久刪除此項目嗎?"
+ },
+ "permanentlyDeletedItem": {
+ "message": "已永久刪除項目"
+ },
+ "restoreItem": {
+ "message": "還原項目"
+ },
+ "restoreItemConfirmation": {
+ "message": "您確定要還原此項目嗎?"
+ },
+ "restoredItem": {
+ "message": "項目已還原"
+ },
+ "vaultTimeoutLogOutConfirmation": {
+ "message": "逾時後登出將移除對密碼庫的所有存取權限,以及重新認證時需要連線網路。確定要使用此設定嗎?"
+ },
+ "vaultTimeoutLogOutConfirmationTitle": {
+ "message": "逾時動作確認"
+ },
+ "autoFillAndSave": {
+ "message": "自動填入並儲存"
+ },
+ "autoFillSuccessAndSavedUri": {
+ "message": "項目已自動填入並且 URL 已儲存"
+ },
+ "autoFillSuccess": {
+ "message": "項目已自動填入"
+ },
+ "setMasterPassword": {
+ "message": "設定主密碼"
+ },
+ "masterPasswordPolicyInEffect": {
+ "message": "一個或多個組織原則要求您的主密碼須符合下列條件:"
+ },
+ "policyInEffectMinComplexity": {
+ "message": "最小複雜度為 $SCORE$",
+ "placeholders": {
+ "score": {
+ "content": "$1",
+ "example": "4"
+ }
+ }
+ },
+ "policyInEffectMinLength": {
+ "message": "最小長度為 $LENGTH$",
+ "placeholders": {
+ "length": {
+ "content": "$1",
+ "example": "14"
+ }
+ }
+ },
+ "policyInEffectUppercase": {
+ "message": "至少包含一個大寫字元"
+ },
+ "policyInEffectLowercase": {
+ "message": "至少包含一個小寫字元"
+ },
+ "policyInEffectNumbers": {
+ "message": "至少包含一個數字"
+ },
+ "policyInEffectSpecial": {
+ "message": "至少包含一個下列特殊字元:$CHARS$",
+ "placeholders": {
+ "chars": {
+ "content": "$1",
+ "example": "!@#$%^&*"
+ }
+ }
+ },
+ "masterPasswordPolicyRequirementsNotMet": {
+ "message": "您新的主密碼不符合原則要求。"
+ },
+ "acceptPolicies": {
+ "message": "一旦選取此方塊,代表您同意下列項目:"
+ },
+ "acceptPoliciesError": {
+ "message": "尚未接受服務條款與隱私權政策。"
+ },
+ "termsOfService": {
+ "message": "服務條款"
+ },
+ "privacyPolicy": {
+ "message": "隱私權政策"
+ },
+ "hintEqualsPassword": {
+ "message": "密碼提示不能與您的密碼相同。"
+ },
+ "ok": {
+ "message": "確定"
+ },
+ "desktopSyncVerificationTitle": {
+ "message": "桌面同步確認"
+ },
+ "desktopIntegrationVerificationText": {
+ "message": "請驗證桌面應用程式顯示的指紋為: "
+ },
+ "desktopIntegrationDisabledTitle": {
+ "message": "瀏覽器整合未啟用"
+ },
+ "desktopIntegrationDisabledDesc": {
+ "message": "瀏覽器整合在桌面應用程式中未啟用,請在桌面應用程式的設定中啟用它。"
+ },
+ "startDesktopTitle": {
+ "message": "啟動 Bitwarden 桌面應用程式"
+ },
+ "startDesktopDesc": {
+ "message": "需要先啟動 Bitwarden 桌面應用程式才能使用此功能。"
+ },
+ "errorEnableBiometricTitle": {
+ "message": "無法啟用生物特徵辨識"
+ },
+ "errorEnableBiometricDesc": {
+ "message": "動作被桌面應用程式取消"
+ },
+ "nativeMessagingInvalidEncryptionDesc": {
+ "message": "桌面應用程式廢止了安全通訊通道。請重試此操作"
+ },
+ "nativeMessagingInvalidEncryptionTitle": {
+ "message": "桌面通訊已中斷"
+ },
+ "nativeMessagingWrongUserDesc": {
+ "message": "桌面應用程式登入了不同的帳戶。請確保兩個應用程式登入的是同一個帳戶。"
+ },
+ "nativeMessagingWrongUserTitle": {
+ "message": "帳戶不符合"
+ },
+ "biometricsNotEnabledTitle": {
+ "message": "生物特徵辨識未啟用"
+ },
+ "biometricsNotEnabledDesc": {
+ "message": "需先在桌面應用程式的設定中啟用生物特徵辨識,才能使用瀏覽器的生物特徵辨識。"
+ },
+ "biometricsNotSupportedTitle": {
+ "message": "不支援生物特徵辨識"
+ },
+ "biometricsNotSupportedDesc": {
+ "message": "此裝置不支援瀏覽器生物特徵辨識。"
+ },
+ "nativeMessaginPermissionErrorTitle": {
+ "message": "未提供權限"
+ },
+ "nativeMessaginPermissionErrorDesc": {
+ "message": "沒有與 Bitwarden 桌面應用程式通訊的權限,我們無法在瀏覽器擴充套件中提供生物特徵辨識。請再試一次。"
+ },
+ "nativeMessaginPermissionSidebarTitle": {
+ "message": "權限要求錯誤"
+ },
+ "nativeMessaginPermissionSidebarDesc": {
+ "message": "此動作無法在側邊欄中完成,請在彈出式視窗中再試一次。"
+ },
+ "personalOwnershipSubmitError": {
+ "message": "由於某個企業原則,您被限制為儲存項目到您的個人密碼庫。將擁有權改為組織,並從可用的集合中選擇。"
+ },
+ "personalOwnershipPolicyInEffect": {
+ "message": "一個組織原則正在影響您的擁有權選項。"
+ },
+ "excludedDomains": {
+ "message": "排除的網域"
+ },
+ "excludedDomainsDesc": {
+ "message": "Bitwarden 不會要求儲存這些網域的登入詳細資訊。必須重新整理頁面才能使變更生效。"
+ },
+ "excludedDomainsInvalidDomain": {
+ "message": "$DOMAIN$ 不是一個有效的網域",
+ "placeholders": {
+ "domain": {
+ "content": "$1",
+ "example": "googlecom"
+ }
+ }
+ },
+ "send": {
+ "message": "Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "searchSends": {
+ "message": "搜尋 Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "addSend": {
+ "message": "新增 Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTypeText": {
+ "message": "文字"
+ },
+ "sendTypeFile": {
+ "message": "檔案"
+ },
+ "allSends": {
+ "message": "所有 Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "maxAccessCountReached": {
+ "message": "已達最大存取次數"
+ },
+ "expired": {
+ "message": "已逾期"
+ },
+ "pendingDeletion": {
+ "message": "等待刪除"
+ },
+ "passwordProtected": {
+ "message": "密碼保護"
+ },
+ "copySendLink": {
+ "message": "複製 Send 連結",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "removePassword": {
+ "message": "移除密碼"
+ },
+ "delete": {
+ "message": "刪除"
+ },
+ "removedPassword": {
+ "message": "密碼已移除"
+ },
+ "deletedSend": {
+ "message": "Send 已刪除",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendLink": {
+ "message": "Send 連結",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "disabled": {
+ "message": "已停用"
+ },
+ "removePasswordConfirmation": {
+ "message": "您確定要移除此密碼嗎?"
+ },
+ "deleteSend": {
+ "message": "刪除 Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "deleteSendConfirmation": {
+ "message": "您確定要刪除此 Send 嗎?",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "editSend": {
+ "message": "編輯 Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTypeHeader": {
+ "message": "這是什麽類型的 Send?",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendNameDesc": {
+ "message": "用於描述此 Send 的易記名稱。",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendFileDesc": {
+ "message": "您想要傳送的檔案。"
+ },
+ "deletionDate": {
+ "message": "刪除日期"
+ },
+ "deletionDateDesc": {
+ "message": "此 Send 將在指定的日期和時間後被永久删除。",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "expirationDate": {
+ "message": "逾期日期"
+ },
+ "expirationDateDesc": {
+ "message": "如果設定此選項,對此 Send 的存取將在指定的日期和時間後逾期。",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "oneDay": {
+ "message": "1 天"
+ },
+ "days": {
+ "message": "$DAYS$ 天",
+ "placeholders": {
+ "days": {
+ "content": "$1",
+ "example": "2"
+ }
+ }
+ },
+ "custom": {
+ "message": "自訂"
+ },
+ "maximumAccessCount": {
+ "message": "最大存取次數"
+ },
+ "maximumAccessCountDesc": {
+ "message": "如果設定此選項,當達到最大存取次數時,使用者將無法再次存取此 Send。",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendPasswordDesc": {
+ "message": "可選。使用者需提供密碼才能存取此 Send。",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendNotesDesc": {
+ "message": "關於此 Send 的私人註釋。",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendDisableDesc": {
+ "message": "停用此 Send 以阻止任何人存取它。",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendShareDesc": {
+ "message": "儲存時複製此 Send 的連結到剪貼簿。",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendTextDesc": {
+ "message": "您想要傳送的文字。"
+ },
+ "sendHideText": {
+ "message": "預設隱藏此 Send 的文字。",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "currentAccessCount": {
+ "message": "目前存取次數"
+ },
+ "createSend": {
+ "message": "建立新的 Send",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "newPassword": {
+ "message": "新的密碼"
+ },
+ "sendDisabled": {
+ "message": "Send 已停用",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendDisabledWarning": {
+ "message": "由於某個企業原則,您只能刪除已有的 Send。",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "createdSend": {
+ "message": "Send 已建立",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "editedSend": {
+ "message": "Send 已編輯",
+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
+ },
+ "sendLinuxChromiumFileWarning": {
+ "message": "要選擇文檔,請在側邊欄中打開擴充套件(若可能),或單擊此橫幅彈出到新視窗。"
+ },
+ "sendFirefoxFileWarning": {
+ "message": "要使用 Firefox 來選擇檔案,請開啟側邊欄中的擴充套件,或點選此橫幅彈出至新視窗。"
+ },
+ "sendSafariFileWarning": {
+ "message": "要使用 Safari 來選擇檔案,請點選此橫幅彈出至新視窗。"
+ },
+ "sendFileCalloutHeader": {
+ "message": "在開始之前"
+ },
+ "sendFirefoxCustomDatePopoutMessage1": {
+ "message": "使用行事曆樣式的日期選取器",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read '**To use a calendar style date picker ** click here to pop out your window.'"
+ },
+ "sendFirefoxCustomDatePopoutMessage2": {
+ "message": "按一下這裡",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker **click here** to pop out your window.'"
+ },
+ "sendFirefoxCustomDatePopoutMessage3": {
+ "message": "要彈出至視窗。",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker click here **to pop out your window.**'"
+ },
+ "expirationDateIsInvalid": {
+ "message": "指定的逾期日期無效。"
+ },
+ "deletionDateIsInvalid": {
+ "message": "指定的刪除日期無效。"
+ },
+ "expirationDateAndTimeRequired": {
+ "message": "要求指定逾期日期和時間。"
+ },
+ "deletionDateAndTimeRequired": {
+ "message": "要求指定刪除日期和時間。"
+ },
+ "dateParsingError": {
+ "message": "儲存刪除日期和逾期日期時發生錯誤。"
+ },
+ "hideEmail": {
+ "message": "對收件人隱藏我的電子郵件位址。"
+ },
+ "sendOptionsPolicyInEffect": {
+ "message": "一個或多個組織原则正影響您的 Send 選項。"
+ },
+ "passwordPrompt": {
+ "message": "重新詢問主密碼"
+ },
+ "passwordConfirmation": {
+ "message": "確認主密碼"
+ },
+ "passwordConfirmationDesc": {
+ "message": "此操作受到保護。若要繼續,請重新輸入您的主密碼以驗證您的身份。"
+ },
+ "emailVerificationRequired": {
+ "message": "需要驗證電子郵件"
+ },
+ "emailVerificationRequiredDesc": {
+ "message": "您必須驗證您的電子郵件才能使用此功能。 您可以在網頁密碼庫裡驗證您的電子郵件。"
+ },
+ "updatedMasterPassword": {
+ "message": "已更新主密碼"
+ },
+ "updateMasterPassword": {
+ "message": "更新主密碼"
+ },
+ "updateMasterPasswordWarning": {
+ "message": "您的主密碼最近被您的組織管理者更改過。要存取密碼庫,您必須現在更新主密碼。繼續操作會登出目前的登入階段,要求您重新登入。其他裝置上使用中的登入階段可能持續最長一個小時。"
+ },
+ "resetPasswordPolicyAutoEnroll": {
+ "message": "自動註冊"
+ },
+ "resetPasswordAutoEnrollInviteWarning": {
+ "message": "此組織擁有一個可以爲你自動注冊密碼重置的企業策略。注冊后將允許組織管理員變更您的主密碼。"
+ },
+ "selectFolder": {
+ "message": "選擇資料夾⋯"
+ },
+ "ssoCompleteRegistration": {
+ "message": "要完成 SSO 登入,請設定主密碼以存取和保護您的密碼庫。"
+ },
+ "hours": {
+ "message": "小時"
+ },
+ "minutes": {
+ "message": "分鐘"
+ },
+ "vaultTimeoutPolicyInEffect": {
+ "message": "您的組織策略正在影響您的密碼庫逾時時長。密碼庫逾時時長最多可以設定到 $HOURS$ 小時,$MINUTES$ 分鐘。",
+ "placeholders": {
+ "hours": {
+ "content": "$1",
+ "example": "5"
+ },
+ "minutes": {
+ "content": "$2",
+ "example": "5"
+ }
+ }
+ },
+ "vaultTimeoutToLarge": {
+ "message": "您的密碼庫逾時時長超過組織限制。"
+ },
+ "vaultExportDisabled": {
+ "message": "密碼庫匯出已停用"
+ },
+ "personalVaultExportPolicyInEffect": {
+ "message": "一或多個組織策略不允許您輸出個人密碼庫。"
+ },
+ "copyCustomFieldNameInvalidElement": {
+ "message": "未能找出有效的表單元件。請試試看改用 HTML 檢查功能。"
+ },
+ "copyCustomFieldNameNotUnique": {
+ "message": "找不到唯一識別元。"
+ }
+}
diff --git a/src/iOS.Safari/Resources/background.html b/src/iOS.Safari/Resources/background.html
new file mode 100644
index 000000000..805ece89f
--- /dev/null
+++ b/src/iOS.Safari/Resources/background.html
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/src/iOS.Safari/Resources/background.js b/src/iOS.Safari/Resources/background.js
new file mode 100644
index 000000000..fbc06556b
--- /dev/null
+++ b/src/iOS.Safari/Resources/background.js
@@ -0,0 +1,30039 @@
+/******/ (function(modules) { // webpackBootstrap
+/******/ // install a JSONP callback for chunk loading
+/******/ function webpackJsonpCallback(data) {
+/******/ var chunkIds = data[0];
+/******/ var moreModules = data[1];
+/******/ var executeModules = data[2];
+/******/
+/******/ // add "moreModules" to the modules object,
+/******/ // then flag all "chunkIds" as loaded and fire callback
+/******/ var moduleId, chunkId, i = 0, resolves = [];
+/******/ for(;i < chunkIds.length; i++) {
+/******/ chunkId = chunkIds[i];
+/******/ if(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {
+/******/ resolves.push(installedChunks[chunkId][0]);
+/******/ }
+/******/ installedChunks[chunkId] = 0;
+/******/ }
+/******/ for(moduleId in moreModules) {
+/******/ if(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {
+/******/ modules[moduleId] = moreModules[moduleId];
+/******/ }
+/******/ }
+/******/ if(parentJsonpFunction) parentJsonpFunction(data);
+/******/
+/******/ while(resolves.length) {
+/******/ resolves.shift()();
+/******/ }
+/******/
+/******/ // add entry modules from loaded chunk to deferred list
+/******/ deferredModules.push.apply(deferredModules, executeModules || []);
+/******/
+/******/ // run deferred modules when all chunks ready
+/******/ return checkDeferredModules();
+/******/ };
+/******/ function checkDeferredModules() {
+/******/ var result;
+/******/ for(var i = 0; i < deferredModules.length; i++) {
+/******/ var deferredModule = deferredModules[i];
+/******/ var fulfilled = true;
+/******/ for(var j = 1; j < deferredModule.length; j++) {
+/******/ var depId = deferredModule[j];
+/******/ if(installedChunks[depId] !== 0) fulfilled = false;
+/******/ }
+/******/ if(fulfilled) {
+/******/ deferredModules.splice(i--, 1);
+/******/ result = __webpack_require__(__webpack_require__.s = deferredModule[0]);
+/******/ }
+/******/ }
+/******/
+/******/ return result;
+/******/ }
+/******/
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // object to store loaded and loading chunks
+/******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched
+/******/ // Promise = chunk loading, 0 = chunk loaded
+/******/ var installedChunks = {
+/******/ "background": 0
+/******/ };
+/******/
+/******/ var deferredModules = [];
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ var jsonpArray = window["webpackJsonp"] = window["webpackJsonp"] || [];
+/******/ var oldJsonpFunction = jsonpArray.push.bind(jsonpArray);
+/******/ jsonpArray.push = webpackJsonpCallback;
+/******/ jsonpArray = jsonpArray.slice();
+/******/ for(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);
+/******/ var parentJsonpFunction = oldJsonpFunction;
+/******/
+/******/
+/******/ // add entry module to deferred list
+/******/ deferredModules.push(["./src/background.ts","vendor"]);
+/******/ // run deferred modules when ready
+/******/ return checkDeferredModules();
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./$$_lazy_route_resource lazy recursive":
+/*!******************************************************!*\
+ !*** ./$$_lazy_route_resource lazy namespace object ***!
+ \******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+function webpackEmptyAsyncContext(req) {
+ // Here Promise.resolve().then() is used instead of new Promise() to prevent
+ // uncaught exception popping up in devtools
+ return Promise.resolve().then(function() {
+ var e = new Error("Cannot find module '" + req + "'");
+ e.code = 'MODULE_NOT_FOUND';
+ throw e;
+ });
+}
+webpackEmptyAsyncContext.keys = function() { return []; };
+webpackEmptyAsyncContext.resolve = webpackEmptyAsyncContext;
+module.exports = webpackEmptyAsyncContext;
+webpackEmptyAsyncContext.id = "./$$_lazy_route_resource lazy recursive";
+
+/***/ }),
+
+/***/ "./jslib/common/src/abstractions/messaging.service.ts":
+/*!************************************************************!*\
+ !*** ./jslib/common/src/abstractions/messaging.service.ts ***!
+ \************************************************************/
+/*! exports provided: MessagingService */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MessagingService", function() { return MessagingService; });
+class MessagingService {
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/abstractions/platformUtils.service.ts":
+/*!****************************************************************!*\
+ !*** ./jslib/common/src/abstractions/platformUtils.service.ts ***!
+ \****************************************************************/
+/*! exports provided: PlatformUtilsService */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PlatformUtilsService", function() { return PlatformUtilsService; });
+class PlatformUtilsService {
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/enums/cipherRepromptType.ts":
+/*!******************************************************!*\
+ !*** ./jslib/common/src/enums/cipherRepromptType.ts ***!
+ \******************************************************/
+/*! exports provided: CipherRepromptType */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CipherRepromptType", function() { return CipherRepromptType; });
+var CipherRepromptType;
+(function (CipherRepromptType) {
+ CipherRepromptType[CipherRepromptType["None"] = 0] = "None";
+ CipherRepromptType[CipherRepromptType["Password"] = 1] = "Password";
+})(CipherRepromptType || (CipherRepromptType = {}));
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/enums/cipherType.ts":
+/*!**********************************************!*\
+ !*** ./jslib/common/src/enums/cipherType.ts ***!
+ \**********************************************/
+/*! exports provided: CipherType */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CipherType", function() { return CipherType; });
+var CipherType;
+(function (CipherType) {
+ CipherType[CipherType["Login"] = 1] = "Login";
+ CipherType[CipherType["SecureNote"] = 2] = "SecureNote";
+ CipherType[CipherType["Card"] = 3] = "Card";
+ CipherType[CipherType["Identity"] = 4] = "Identity";
+})(CipherType || (CipherType = {}));
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/enums/deviceType.ts":
+/*!**********************************************!*\
+ !*** ./jslib/common/src/enums/deviceType.ts ***!
+ \**********************************************/
+/*! exports provided: DeviceType */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "DeviceType", function() { return DeviceType; });
+var DeviceType;
+(function (DeviceType) {
+ DeviceType[DeviceType["Android"] = 0] = "Android";
+ DeviceType[DeviceType["iOS"] = 1] = "iOS";
+ DeviceType[DeviceType["ChromeExtension"] = 2] = "ChromeExtension";
+ DeviceType[DeviceType["FirefoxExtension"] = 3] = "FirefoxExtension";
+ DeviceType[DeviceType["OperaExtension"] = 4] = "OperaExtension";
+ DeviceType[DeviceType["EdgeExtension"] = 5] = "EdgeExtension";
+ DeviceType[DeviceType["WindowsDesktop"] = 6] = "WindowsDesktop";
+ DeviceType[DeviceType["MacOsDesktop"] = 7] = "MacOsDesktop";
+ DeviceType[DeviceType["LinuxDesktop"] = 8] = "LinuxDesktop";
+ DeviceType[DeviceType["ChromeBrowser"] = 9] = "ChromeBrowser";
+ DeviceType[DeviceType["FirefoxBrowser"] = 10] = "FirefoxBrowser";
+ DeviceType[DeviceType["OperaBrowser"] = 11] = "OperaBrowser";
+ DeviceType[DeviceType["EdgeBrowser"] = 12] = "EdgeBrowser";
+ DeviceType[DeviceType["IEBrowser"] = 13] = "IEBrowser";
+ DeviceType[DeviceType["UnknownBrowser"] = 14] = "UnknownBrowser";
+ DeviceType[DeviceType["AndroidAmazon"] = 15] = "AndroidAmazon";
+ DeviceType[DeviceType["UWP"] = 16] = "UWP";
+ DeviceType[DeviceType["SafariBrowser"] = 17] = "SafariBrowser";
+ DeviceType[DeviceType["VivaldiBrowser"] = 18] = "VivaldiBrowser";
+ DeviceType[DeviceType["VivaldiExtension"] = 19] = "VivaldiExtension";
+ DeviceType[DeviceType["SafariExtension"] = 20] = "SafariExtension";
+})(DeviceType || (DeviceType = {}));
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/enums/encryptionType.ts":
+/*!**************************************************!*\
+ !*** ./jslib/common/src/enums/encryptionType.ts ***!
+ \**************************************************/
+/*! exports provided: EncryptionType */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "EncryptionType", function() { return EncryptionType; });
+var EncryptionType;
+(function (EncryptionType) {
+ EncryptionType[EncryptionType["AesCbc256_B64"] = 0] = "AesCbc256_B64";
+ EncryptionType[EncryptionType["AesCbc128_HmacSha256_B64"] = 1] = "AesCbc128_HmacSha256_B64";
+ EncryptionType[EncryptionType["AesCbc256_HmacSha256_B64"] = 2] = "AesCbc256_HmacSha256_B64";
+ EncryptionType[EncryptionType["Rsa2048_OaepSha256_B64"] = 3] = "Rsa2048_OaepSha256_B64";
+ EncryptionType[EncryptionType["Rsa2048_OaepSha1_B64"] = 4] = "Rsa2048_OaepSha1_B64";
+ EncryptionType[EncryptionType["Rsa2048_OaepSha256_HmacSha256_B64"] = 5] = "Rsa2048_OaepSha256_HmacSha256_B64";
+ EncryptionType[EncryptionType["Rsa2048_OaepSha1_HmacSha256_B64"] = 6] = "Rsa2048_OaepSha1_HmacSha256_B64";
+})(EncryptionType || (EncryptionType = {}));
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/enums/eventType.ts":
+/*!*********************************************!*\
+ !*** ./jslib/common/src/enums/eventType.ts ***!
+ \*********************************************/
+/*! exports provided: EventType */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "EventType", function() { return EventType; });
+var EventType;
+(function (EventType) {
+ EventType[EventType["User_LoggedIn"] = 1000] = "User_LoggedIn";
+ EventType[EventType["User_ChangedPassword"] = 1001] = "User_ChangedPassword";
+ EventType[EventType["User_Updated2fa"] = 1002] = "User_Updated2fa";
+ EventType[EventType["User_Disabled2fa"] = 1003] = "User_Disabled2fa";
+ EventType[EventType["User_Recovered2fa"] = 1004] = "User_Recovered2fa";
+ EventType[EventType["User_FailedLogIn"] = 1005] = "User_FailedLogIn";
+ EventType[EventType["User_FailedLogIn2fa"] = 1006] = "User_FailedLogIn2fa";
+ EventType[EventType["User_ClientExportedVault"] = 1007] = "User_ClientExportedVault";
+ EventType[EventType["User_UpdatedTempPassword"] = 1008] = "User_UpdatedTempPassword";
+ EventType[EventType["Cipher_Created"] = 1100] = "Cipher_Created";
+ EventType[EventType["Cipher_Updated"] = 1101] = "Cipher_Updated";
+ EventType[EventType["Cipher_Deleted"] = 1102] = "Cipher_Deleted";
+ EventType[EventType["Cipher_AttachmentCreated"] = 1103] = "Cipher_AttachmentCreated";
+ EventType[EventType["Cipher_AttachmentDeleted"] = 1104] = "Cipher_AttachmentDeleted";
+ EventType[EventType["Cipher_Shared"] = 1105] = "Cipher_Shared";
+ EventType[EventType["Cipher_UpdatedCollections"] = 1106] = "Cipher_UpdatedCollections";
+ EventType[EventType["Cipher_ClientViewed"] = 1107] = "Cipher_ClientViewed";
+ EventType[EventType["Cipher_ClientToggledPasswordVisible"] = 1108] = "Cipher_ClientToggledPasswordVisible";
+ EventType[EventType["Cipher_ClientToggledHiddenFieldVisible"] = 1109] = "Cipher_ClientToggledHiddenFieldVisible";
+ EventType[EventType["Cipher_ClientToggledCardCodeVisible"] = 1110] = "Cipher_ClientToggledCardCodeVisible";
+ EventType[EventType["Cipher_ClientCopiedPassword"] = 1111] = "Cipher_ClientCopiedPassword";
+ EventType[EventType["Cipher_ClientCopiedHiddenField"] = 1112] = "Cipher_ClientCopiedHiddenField";
+ EventType[EventType["Cipher_ClientCopiedCardCode"] = 1113] = "Cipher_ClientCopiedCardCode";
+ EventType[EventType["Cipher_ClientAutofilled"] = 1114] = "Cipher_ClientAutofilled";
+ EventType[EventType["Cipher_SoftDeleted"] = 1115] = "Cipher_SoftDeleted";
+ EventType[EventType["Cipher_Restored"] = 1116] = "Cipher_Restored";
+ EventType[EventType["Cipher_ClientToggledCardNumberVisible"] = 1117] = "Cipher_ClientToggledCardNumberVisible";
+ EventType[EventType["Collection_Created"] = 1300] = "Collection_Created";
+ EventType[EventType["Collection_Updated"] = 1301] = "Collection_Updated";
+ EventType[EventType["Collection_Deleted"] = 1302] = "Collection_Deleted";
+ EventType[EventType["Group_Created"] = 1400] = "Group_Created";
+ EventType[EventType["Group_Updated"] = 1401] = "Group_Updated";
+ EventType[EventType["Group_Deleted"] = 1402] = "Group_Deleted";
+ EventType[EventType["OrganizationUser_Invited"] = 1500] = "OrganizationUser_Invited";
+ EventType[EventType["OrganizationUser_Confirmed"] = 1501] = "OrganizationUser_Confirmed";
+ EventType[EventType["OrganizationUser_Updated"] = 1502] = "OrganizationUser_Updated";
+ EventType[EventType["OrganizationUser_Removed"] = 1503] = "OrganizationUser_Removed";
+ EventType[EventType["OrganizationUser_UpdatedGroups"] = 1504] = "OrganizationUser_UpdatedGroups";
+ EventType[EventType["OrganizationUser_UnlinkedSso"] = 1505] = "OrganizationUser_UnlinkedSso";
+ EventType[EventType["OrganizationUser_ResetPassword_Enroll"] = 1506] = "OrganizationUser_ResetPassword_Enroll";
+ EventType[EventType["OrganizationUser_ResetPassword_Withdraw"] = 1507] = "OrganizationUser_ResetPassword_Withdraw";
+ EventType[EventType["OrganizationUser_AdminResetPassword"] = 1508] = "OrganizationUser_AdminResetPassword";
+ EventType[EventType["OrganizationUser_ResetSsoLink"] = 1509] = "OrganizationUser_ResetSsoLink";
+ EventType[EventType["Organization_Updated"] = 1600] = "Organization_Updated";
+ EventType[EventType["Organization_PurgedVault"] = 1601] = "Organization_PurgedVault";
+ // Organization_ClientExportedVault = 1602,
+ EventType[EventType["Organization_VaultAccessed"] = 1603] = "Organization_VaultAccessed";
+ EventType[EventType["Policy_Updated"] = 1700] = "Policy_Updated";
+ EventType[EventType["ProviderUser_Invited"] = 1800] = "ProviderUser_Invited";
+ EventType[EventType["ProviderUser_Confirmed"] = 1801] = "ProviderUser_Confirmed";
+ EventType[EventType["ProviderUser_Updated"] = 1802] = "ProviderUser_Updated";
+ EventType[EventType["ProviderUser_Removed"] = 1803] = "ProviderUser_Removed";
+ EventType[EventType["ProviderOrganization_Created"] = 1900] = "ProviderOrganization_Created";
+ EventType[EventType["ProviderOrganization_Added"] = 1901] = "ProviderOrganization_Added";
+ EventType[EventType["ProviderOrganization_Removed"] = 1902] = "ProviderOrganization_Removed";
+ EventType[EventType["ProviderOrganization_VaultAccessed"] = 1903] = "ProviderOrganization_VaultAccessed";
+})(EventType || (EventType = {}));
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/enums/fieldType.ts":
+/*!*********************************************!*\
+ !*** ./jslib/common/src/enums/fieldType.ts ***!
+ \*********************************************/
+/*! exports provided: FieldType */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FieldType", function() { return FieldType; });
+var FieldType;
+(function (FieldType) {
+ FieldType[FieldType["Text"] = 0] = "Text";
+ FieldType[FieldType["Hidden"] = 1] = "Hidden";
+ FieldType[FieldType["Boolean"] = 2] = "Boolean";
+ FieldType[FieldType["Linked"] = 3] = "Linked";
+})(FieldType || (FieldType = {}));
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/enums/fileUploadType.ts":
+/*!**************************************************!*\
+ !*** ./jslib/common/src/enums/fileUploadType.ts ***!
+ \**************************************************/
+/*! exports provided: FileUploadType */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FileUploadType", function() { return FileUploadType; });
+var FileUploadType;
+(function (FileUploadType) {
+ FileUploadType[FileUploadType["Direct"] = 0] = "Direct";
+ FileUploadType[FileUploadType["Azure"] = 1] = "Azure";
+})(FileUploadType || (FileUploadType = {}));
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/enums/hashPurpose.ts":
+/*!***********************************************!*\
+ !*** ./jslib/common/src/enums/hashPurpose.ts ***!
+ \***********************************************/
+/*! exports provided: HashPurpose */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "HashPurpose", function() { return HashPurpose; });
+var HashPurpose;
+(function (HashPurpose) {
+ HashPurpose[HashPurpose["ServerAuthorization"] = 1] = "ServerAuthorization";
+ HashPurpose[HashPurpose["LocalAuthorization"] = 2] = "LocalAuthorization";
+})(HashPurpose || (HashPurpose = {}));
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/enums/kdfType.ts":
+/*!*******************************************!*\
+ !*** ./jslib/common/src/enums/kdfType.ts ***!
+ \*******************************************/
+/*! exports provided: KdfType */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "KdfType", function() { return KdfType; });
+var KdfType;
+(function (KdfType) {
+ KdfType[KdfType["PBKDF2_SHA256"] = 0] = "PBKDF2_SHA256";
+})(KdfType || (KdfType = {}));
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/enums/linkedIdType.ts":
+/*!************************************************!*\
+ !*** ./jslib/common/src/enums/linkedIdType.ts ***!
+ \************************************************/
+/*! exports provided: LoginLinkedId, CardLinkedId, IdentityLinkedId */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LoginLinkedId", function() { return LoginLinkedId; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CardLinkedId", function() { return CardLinkedId; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "IdentityLinkedId", function() { return IdentityLinkedId; });
+// LoginView
+var LoginLinkedId;
+(function (LoginLinkedId) {
+ LoginLinkedId[LoginLinkedId["Username"] = 100] = "Username";
+ LoginLinkedId[LoginLinkedId["Password"] = 101] = "Password";
+})(LoginLinkedId || (LoginLinkedId = {}));
+// CardView
+var CardLinkedId;
+(function (CardLinkedId) {
+ CardLinkedId[CardLinkedId["CardholderName"] = 300] = "CardholderName";
+ CardLinkedId[CardLinkedId["ExpMonth"] = 301] = "ExpMonth";
+ CardLinkedId[CardLinkedId["ExpYear"] = 302] = "ExpYear";
+ CardLinkedId[CardLinkedId["Code"] = 303] = "Code";
+ CardLinkedId[CardLinkedId["Brand"] = 304] = "Brand";
+ CardLinkedId[CardLinkedId["Number"] = 305] = "Number";
+})(CardLinkedId || (CardLinkedId = {}));
+// IdentityView
+var IdentityLinkedId;
+(function (IdentityLinkedId) {
+ IdentityLinkedId[IdentityLinkedId["Title"] = 400] = "Title";
+ IdentityLinkedId[IdentityLinkedId["MiddleName"] = 401] = "MiddleName";
+ IdentityLinkedId[IdentityLinkedId["Address1"] = 402] = "Address1";
+ IdentityLinkedId[IdentityLinkedId["Address2"] = 403] = "Address2";
+ IdentityLinkedId[IdentityLinkedId["Address3"] = 404] = "Address3";
+ IdentityLinkedId[IdentityLinkedId["City"] = 405] = "City";
+ IdentityLinkedId[IdentityLinkedId["State"] = 406] = "State";
+ IdentityLinkedId[IdentityLinkedId["PostalCode"] = 407] = "PostalCode";
+ IdentityLinkedId[IdentityLinkedId["Country"] = 408] = "Country";
+ IdentityLinkedId[IdentityLinkedId["Company"] = 409] = "Company";
+ IdentityLinkedId[IdentityLinkedId["Email"] = 410] = "Email";
+ IdentityLinkedId[IdentityLinkedId["Phone"] = 411] = "Phone";
+ IdentityLinkedId[IdentityLinkedId["Ssn"] = 412] = "Ssn";
+ IdentityLinkedId[IdentityLinkedId["Username"] = 413] = "Username";
+ IdentityLinkedId[IdentityLinkedId["PassportNumber"] = 414] = "PassportNumber";
+ IdentityLinkedId[IdentityLinkedId["LicenseNumber"] = 415] = "LicenseNumber";
+ IdentityLinkedId[IdentityLinkedId["FirstName"] = 416] = "FirstName";
+ IdentityLinkedId[IdentityLinkedId["LastName"] = 417] = "LastName";
+ IdentityLinkedId[IdentityLinkedId["FullName"] = 418] = "FullName";
+})(IdentityLinkedId || (IdentityLinkedId = {}));
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/enums/logLevelType.ts":
+/*!************************************************!*\
+ !*** ./jslib/common/src/enums/logLevelType.ts ***!
+ \************************************************/
+/*! exports provided: LogLevelType */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LogLevelType", function() { return LogLevelType; });
+var LogLevelType;
+(function (LogLevelType) {
+ LogLevelType[LogLevelType["Debug"] = 0] = "Debug";
+ LogLevelType[LogLevelType["Info"] = 1] = "Info";
+ LogLevelType[LogLevelType["Warning"] = 2] = "Warning";
+ LogLevelType[LogLevelType["Error"] = 3] = "Error";
+})(LogLevelType || (LogLevelType = {}));
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/enums/notificationType.ts":
+/*!****************************************************!*\
+ !*** ./jslib/common/src/enums/notificationType.ts ***!
+ \****************************************************/
+/*! exports provided: NotificationType */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "NotificationType", function() { return NotificationType; });
+var NotificationType;
+(function (NotificationType) {
+ NotificationType[NotificationType["SyncCipherUpdate"] = 0] = "SyncCipherUpdate";
+ NotificationType[NotificationType["SyncCipherCreate"] = 1] = "SyncCipherCreate";
+ NotificationType[NotificationType["SyncLoginDelete"] = 2] = "SyncLoginDelete";
+ NotificationType[NotificationType["SyncFolderDelete"] = 3] = "SyncFolderDelete";
+ NotificationType[NotificationType["SyncCiphers"] = 4] = "SyncCiphers";
+ NotificationType[NotificationType["SyncVault"] = 5] = "SyncVault";
+ NotificationType[NotificationType["SyncOrgKeys"] = 6] = "SyncOrgKeys";
+ NotificationType[NotificationType["SyncFolderCreate"] = 7] = "SyncFolderCreate";
+ NotificationType[NotificationType["SyncFolderUpdate"] = 8] = "SyncFolderUpdate";
+ NotificationType[NotificationType["SyncCipherDelete"] = 9] = "SyncCipherDelete";
+ NotificationType[NotificationType["SyncSettings"] = 10] = "SyncSettings";
+ NotificationType[NotificationType["LogOut"] = 11] = "LogOut";
+ NotificationType[NotificationType["SyncSendCreate"] = 12] = "SyncSendCreate";
+ NotificationType[NotificationType["SyncSendUpdate"] = 13] = "SyncSendUpdate";
+ NotificationType[NotificationType["SyncSendDelete"] = 14] = "SyncSendDelete";
+})(NotificationType || (NotificationType = {}));
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/enums/organizationUserStatusType.ts":
+/*!**************************************************************!*\
+ !*** ./jslib/common/src/enums/organizationUserStatusType.ts ***!
+ \**************************************************************/
+/*! exports provided: OrganizationUserStatusType */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "OrganizationUserStatusType", function() { return OrganizationUserStatusType; });
+var OrganizationUserStatusType;
+(function (OrganizationUserStatusType) {
+ OrganizationUserStatusType[OrganizationUserStatusType["Invited"] = 0] = "Invited";
+ OrganizationUserStatusType[OrganizationUserStatusType["Accepted"] = 1] = "Accepted";
+ OrganizationUserStatusType[OrganizationUserStatusType["Confirmed"] = 2] = "Confirmed";
+})(OrganizationUserStatusType || (OrganizationUserStatusType = {}));
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/enums/organizationUserType.ts":
+/*!********************************************************!*\
+ !*** ./jslib/common/src/enums/organizationUserType.ts ***!
+ \********************************************************/
+/*! exports provided: OrganizationUserType */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "OrganizationUserType", function() { return OrganizationUserType; });
+var OrganizationUserType;
+(function (OrganizationUserType) {
+ OrganizationUserType[OrganizationUserType["Owner"] = 0] = "Owner";
+ OrganizationUserType[OrganizationUserType["Admin"] = 1] = "Admin";
+ OrganizationUserType[OrganizationUserType["User"] = 2] = "User";
+ OrganizationUserType[OrganizationUserType["Manager"] = 3] = "Manager";
+ OrganizationUserType[OrganizationUserType["Custom"] = 4] = "Custom";
+})(OrganizationUserType || (OrganizationUserType = {}));
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/enums/policyType.ts":
+/*!**********************************************!*\
+ !*** ./jslib/common/src/enums/policyType.ts ***!
+ \**********************************************/
+/*! exports provided: PolicyType */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PolicyType", function() { return PolicyType; });
+var PolicyType;
+(function (PolicyType) {
+ PolicyType[PolicyType["TwoFactorAuthentication"] = 0] = "TwoFactorAuthentication";
+ PolicyType[PolicyType["MasterPassword"] = 1] = "MasterPassword";
+ PolicyType[PolicyType["PasswordGenerator"] = 2] = "PasswordGenerator";
+ PolicyType[PolicyType["SingleOrg"] = 3] = "SingleOrg";
+ PolicyType[PolicyType["RequireSso"] = 4] = "RequireSso";
+ PolicyType[PolicyType["PersonalOwnership"] = 5] = "PersonalOwnership";
+ PolicyType[PolicyType["DisableSend"] = 6] = "DisableSend";
+ PolicyType[PolicyType["SendOptions"] = 7] = "SendOptions";
+ PolicyType[PolicyType["ResetPassword"] = 8] = "ResetPassword";
+ PolicyType[PolicyType["MaximumVaultTimeout"] = 9] = "MaximumVaultTimeout";
+ PolicyType[PolicyType["DisablePersonalVaultExport"] = 10] = "DisablePersonalVaultExport";
+})(PolicyType || (PolicyType = {}));
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/enums/providerUserStatusType.ts":
+/*!**********************************************************!*\
+ !*** ./jslib/common/src/enums/providerUserStatusType.ts ***!
+ \**********************************************************/
+/*! exports provided: ProviderUserStatusType */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ProviderUserStatusType", function() { return ProviderUserStatusType; });
+var ProviderUserStatusType;
+(function (ProviderUserStatusType) {
+ ProviderUserStatusType[ProviderUserStatusType["Invited"] = 0] = "Invited";
+ ProviderUserStatusType[ProviderUserStatusType["Accepted"] = 1] = "Accepted";
+ ProviderUserStatusType[ProviderUserStatusType["Confirmed"] = 2] = "Confirmed";
+})(ProviderUserStatusType || (ProviderUserStatusType = {}));
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/enums/providerUserType.ts":
+/*!****************************************************!*\
+ !*** ./jslib/common/src/enums/providerUserType.ts ***!
+ \****************************************************/
+/*! exports provided: ProviderUserType */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ProviderUserType", function() { return ProviderUserType; });
+var ProviderUserType;
+(function (ProviderUserType) {
+ ProviderUserType[ProviderUserType["ProviderAdmin"] = 0] = "ProviderAdmin";
+ ProviderUserType[ProviderUserType["ServiceUser"] = 1] = "ServiceUser";
+})(ProviderUserType || (ProviderUserType = {}));
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/enums/secureNoteType.ts":
+/*!**************************************************!*\
+ !*** ./jslib/common/src/enums/secureNoteType.ts ***!
+ \**************************************************/
+/*! exports provided: SecureNoteType */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SecureNoteType", function() { return SecureNoteType; });
+var SecureNoteType;
+(function (SecureNoteType) {
+ SecureNoteType[SecureNoteType["Generic"] = 0] = "Generic";
+})(SecureNoteType || (SecureNoteType = {}));
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/enums/sendType.ts":
+/*!********************************************!*\
+ !*** ./jslib/common/src/enums/sendType.ts ***!
+ \********************************************/
+/*! exports provided: SendType */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SendType", function() { return SendType; });
+var SendType;
+(function (SendType) {
+ SendType[SendType["Text"] = 0] = "Text";
+ SendType[SendType["File"] = 1] = "File";
+})(SendType || (SendType = {}));
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/enums/themeType.ts":
+/*!*********************************************!*\
+ !*** ./jslib/common/src/enums/themeType.ts ***!
+ \*********************************************/
+/*! exports provided: ThemeType */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ThemeType", function() { return ThemeType; });
+var ThemeType;
+(function (ThemeType) {
+ ThemeType["System"] = "system";
+ ThemeType["Light"] = "light";
+ ThemeType["Dark"] = "dark";
+ ThemeType["Nord"] = "nord";
+ ThemeType["SolarizedDark"] = "solarizedDark";
+})(ThemeType || (ThemeType = {}));
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/enums/twoFactorProviderType.ts":
+/*!*********************************************************!*\
+ !*** ./jslib/common/src/enums/twoFactorProviderType.ts ***!
+ \*********************************************************/
+/*! exports provided: TwoFactorProviderType */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TwoFactorProviderType", function() { return TwoFactorProviderType; });
+var TwoFactorProviderType;
+(function (TwoFactorProviderType) {
+ TwoFactorProviderType[TwoFactorProviderType["Authenticator"] = 0] = "Authenticator";
+ TwoFactorProviderType[TwoFactorProviderType["Email"] = 1] = "Email";
+ TwoFactorProviderType[TwoFactorProviderType["Duo"] = 2] = "Duo";
+ TwoFactorProviderType[TwoFactorProviderType["Yubikey"] = 3] = "Yubikey";
+ TwoFactorProviderType[TwoFactorProviderType["U2f"] = 4] = "U2f";
+ TwoFactorProviderType[TwoFactorProviderType["Remember"] = 5] = "Remember";
+ TwoFactorProviderType[TwoFactorProviderType["OrganizationDuo"] = 6] = "OrganizationDuo";
+ TwoFactorProviderType[TwoFactorProviderType["WebAuthn"] = 7] = "WebAuthn";
+})(TwoFactorProviderType || (TwoFactorProviderType = {}));
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/enums/uriMatchType.ts":
+/*!************************************************!*\
+ !*** ./jslib/common/src/enums/uriMatchType.ts ***!
+ \************************************************/
+/*! exports provided: UriMatchType */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "UriMatchType", function() { return UriMatchType; });
+var UriMatchType;
+(function (UriMatchType) {
+ UriMatchType[UriMatchType["Domain"] = 0] = "Domain";
+ UriMatchType[UriMatchType["Host"] = 1] = "Host";
+ UriMatchType[UriMatchType["StartsWith"] = 2] = "StartsWith";
+ UriMatchType[UriMatchType["Exact"] = 3] = "Exact";
+ UriMatchType[UriMatchType["RegularExpression"] = 4] = "RegularExpression";
+ UriMatchType[UriMatchType["Never"] = 5] = "Never";
+})(UriMatchType || (UriMatchType = {}));
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/misc/linkedFieldOption.decorator.ts":
+/*!**************************************************************!*\
+ !*** ./jslib/common/src/misc/linkedFieldOption.decorator.ts ***!
+ \**************************************************************/
+/*! exports provided: LinkedMetadata, linkedFieldOption */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LinkedMetadata", function() { return LinkedMetadata; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "linkedFieldOption", function() { return linkedFieldOption; });
+class LinkedMetadata {
+ constructor(propertyKey, _i18nKey) {
+ this.propertyKey = propertyKey;
+ this._i18nKey = _i18nKey;
+ }
+ get i18nKey() {
+ var _a;
+ return (_a = this._i18nKey) !== null && _a !== void 0 ? _a : this.propertyKey;
+ }
+}
+/**
+ * A decorator used to set metadata used by Linked custom fields. Apply it to a class property or getter to make it
+ * available as a Linked custom field option.
+ * @param id - A unique value that is saved in the Field model. It is used to look up the decorated class property.
+ * @param i18nKey - The i18n key used to describe the decorated class property in the UI. If it is null, then the name
+ * of the class property will be used as the i18n key.
+ */
+function linkedFieldOption(id, i18nKey) {
+ return (prototype, propertyKey) => {
+ if (prototype.linkedFieldOptions == null) {
+ prototype.linkedFieldOptions = new Map();
+ }
+ prototype.linkedFieldOptions.set(id, new LinkedMetadata(propertyKey, i18nKey));
+ };
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/misc/sequentialize.ts":
+/*!************************************************!*\
+ !*** ./jslib/common/src/misc/sequentialize.ts ***!
+ \************************************************/
+/*! exports provided: sequentialize */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sequentialize", function() { return sequentialize; });
+/**
+ * Use as a Decorator on async functions, it will prevent multiple 'active' calls as the same time
+ *
+ * If a promise was returned from a previous call to this function, that hasn't yet resolved it will
+ * be returned, instead of calling the original function again
+ *
+ * Results are not cached, once the promise has returned, the next call will result in a fresh call
+ *
+ * Read more at https://github.com/bitwarden/jslib/pull/7
+ */
+function sequentialize(cacheKey) {
+ return (target, propertyKey, descriptor) => {
+ const originalMethod = descriptor.value;
+ const caches = new Map();
+ const getCache = (obj) => {
+ let cache = caches.get(obj);
+ if (cache != null) {
+ return cache;
+ }
+ cache = new Map();
+ caches.set(obj, cache);
+ return cache;
+ };
+ return {
+ value: function (...args) {
+ const cache = getCache(this);
+ const argsCacheKey = cacheKey(args);
+ let response = cache.get(argsCacheKey);
+ if (response != null) {
+ return response;
+ }
+ const onFinally = () => {
+ cache.delete(argsCacheKey);
+ if (cache.size === 0) {
+ caches.delete(this);
+ }
+ };
+ response = originalMethod.apply(this, args).then((val) => {
+ onFinally();
+ return val;
+ }).catch((err) => {
+ onFinally();
+ throw err;
+ });
+ cache.set(argsCacheKey, response);
+ return response;
+ },
+ };
+ };
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/misc/serviceUtils.ts":
+/*!***********************************************!*\
+ !*** ./jslib/common/src/misc/serviceUtils.ts ***!
+ \***********************************************/
+/*! exports provided: ServiceUtils */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ServiceUtils", function() { return ServiceUtils; });
+/* harmony import */ var _models_domain_treeNode__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../models/domain/treeNode */ "./jslib/common/src/models/domain/treeNode.ts");
+
+class ServiceUtils {
+ static nestedTraverse(nodeTree, partIndex, parts, obj, parent, delimiter) {
+ if (parts.length <= partIndex) {
+ return;
+ }
+ const end = partIndex === parts.length - 1;
+ const partName = parts[partIndex];
+ for (let i = 0; i < nodeTree.length; i++) {
+ if (nodeTree[i].node.name !== parts[partIndex]) {
+ continue;
+ }
+ if (end && nodeTree[i].node.id !== obj.id) {
+ // Another node with the same name.
+ nodeTree.push(new _models_domain_treeNode__WEBPACK_IMPORTED_MODULE_0__["TreeNode"](obj, partName, parent));
+ return;
+ }
+ ServiceUtils.nestedTraverse(nodeTree[i].children, partIndex + 1, parts, obj, nodeTree[i].node, delimiter);
+ return;
+ }
+ if (nodeTree.filter(n => n.node.name === partName).length === 0) {
+ if (end) {
+ nodeTree.push(new _models_domain_treeNode__WEBPACK_IMPORTED_MODULE_0__["TreeNode"](obj, partName, parent));
+ return;
+ }
+ const newPartName = parts[partIndex] + delimiter + parts[partIndex + 1];
+ ServiceUtils.nestedTraverse(nodeTree, 0, [newPartName, ...parts.slice(partIndex + 2)], obj, parent, delimiter);
+ }
+ }
+ static getTreeNodeObject(nodeTree, id) {
+ for (let i = 0; i < nodeTree.length; i++) {
+ if (nodeTree[i].node.id === id) {
+ return nodeTree[i];
+ }
+ else if (nodeTree[i].children != null) {
+ const node = ServiceUtils.getTreeNodeObject(nodeTree[i].children, id);
+ if (node !== null) {
+ return node;
+ }
+ }
+ }
+ return null;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/misc/throttle.ts":
+/*!*******************************************!*\
+ !*** ./jslib/common/src/misc/throttle.ts ***!
+ \*******************************************/
+/*! exports provided: throttle */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "throttle", function() { return throttle; });
+/**
+ * Use as a Decorator on async functions, it will limit how many times the function can be
+ * in-flight at a time.
+ *
+ * Calls beyond the limit will be queued, and run when one of the active calls finishes
+ */
+function throttle(limit, throttleKey) {
+ return (target, propertyKey, descriptor) => {
+ const originalMethod = descriptor.value;
+ const allThrottles = new Map();
+ const getThrottles = (obj) => {
+ let throttles = allThrottles.get(obj);
+ if (throttles != null) {
+ return throttles;
+ }
+ throttles = new Map();
+ allThrottles.set(obj, throttles);
+ return throttles;
+ };
+ return {
+ value: function (...args) {
+ const throttles = getThrottles(this);
+ const argsThrottleKey = throttleKey(args);
+ let queue = throttles.get(argsThrottleKey);
+ if (queue == null) {
+ queue = [];
+ throttles.set(argsThrottleKey, queue);
+ }
+ return new Promise((resolve, reject) => {
+ const exec = () => {
+ const onFinally = () => {
+ queue.splice(queue.indexOf(exec), 1);
+ if (queue.length >= limit) {
+ queue[limit - 1]();
+ }
+ else if (queue.length === 0) {
+ throttles.delete(argsThrottleKey);
+ if (throttles.size === 0) {
+ allThrottles.delete(this);
+ }
+ }
+ };
+ originalMethod.apply(this, args).then((val) => {
+ onFinally();
+ return val;
+ }).catch((err) => {
+ onFinally();
+ throw err;
+ }).then(resolve, reject);
+ };
+ queue.push(exec);
+ if (queue.length <= limit) {
+ exec();
+ }
+ });
+ },
+ };
+ };
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/misc/utils.ts":
+/*!****************************************!*\
+ !*** ./jslib/common/src/misc/utils.ts ***!
+ \****************************************/
+/*! exports provided: Utils */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* WEBPACK VAR INJECTION */(function(process, global, Buffer) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Utils", function() { return Utils; });
+/* harmony import */ var tldjs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tldjs */ "./node_modules/tldjs/index.js");
+/* harmony import */ var tldjs__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(tldjs__WEBPACK_IMPORTED_MODULE_0__);
+
+// tslint:disable-next-line
+const nodeURL = typeof window === 'undefined' ? __webpack_require__(/*! url */ "./node_modules/url/url.js") : null;
+class Utils {
+ static init() {
+ if (Utils.inited) {
+ return;
+ }
+ Utils.inited = true;
+ Utils.isNode = typeof process !== 'undefined' && process.release != null &&
+ process.release.name === 'node';
+ Utils.isBrowser = typeof window !== 'undefined';
+ Utils.isNativeScript = !Utils.isNode && !Utils.isBrowser;
+ Utils.isMobileBrowser = Utils.isBrowser && this.isMobile(window);
+ Utils.isAppleMobileBrowser = Utils.isBrowser && this.isAppleMobile(window);
+ Utils.global = Utils.isNativeScript ? global : (Utils.isNode && !Utils.isBrowser ? global : window);
+ }
+ static fromB64ToArray(str) {
+ if (Utils.isNode || Utils.isNativeScript) {
+ return new Uint8Array(Buffer.from(str, 'base64'));
+ }
+ else {
+ const binaryString = window.atob(str);
+ const bytes = new Uint8Array(binaryString.length);
+ for (let i = 0; i < binaryString.length; i++) {
+ bytes[i] = binaryString.charCodeAt(i);
+ }
+ return bytes;
+ }
+ }
+ static fromUrlB64ToArray(str) {
+ return Utils.fromB64ToArray(Utils.fromUrlB64ToB64(str));
+ }
+ static fromHexToArray(str) {
+ if (Utils.isNode || Utils.isNativeScript) {
+ return new Uint8Array(Buffer.from(str, 'hex'));
+ }
+ else {
+ const bytes = new Uint8Array(str.length / 2);
+ for (let i = 0; i < str.length; i += 2) {
+ bytes[i / 2] = parseInt(str.substr(i, 2), 16);
+ }
+ return bytes;
+ }
+ }
+ static fromUtf8ToArray(str) {
+ if (Utils.isNode || Utils.isNativeScript) {
+ return new Uint8Array(Buffer.from(str, 'utf8'));
+ }
+ else {
+ const strUtf8 = unescape(encodeURIComponent(str));
+ const arr = new Uint8Array(strUtf8.length);
+ for (let i = 0; i < strUtf8.length; i++) {
+ arr[i] = strUtf8.charCodeAt(i);
+ }
+ return arr;
+ }
+ }
+ static fromByteStringToArray(str) {
+ const arr = new Uint8Array(str.length);
+ for (let i = 0; i < str.length; i++) {
+ arr[i] = str.charCodeAt(i);
+ }
+ return arr;
+ }
+ static fromBufferToB64(buffer) {
+ if (Utils.isNode || Utils.isNativeScript) {
+ return Buffer.from(buffer).toString('base64');
+ }
+ else {
+ let binary = '';
+ const bytes = new Uint8Array(buffer);
+ for (let i = 0; i < bytes.byteLength; i++) {
+ binary += String.fromCharCode(bytes[i]);
+ }
+ return window.btoa(binary);
+ }
+ }
+ static fromBufferToUrlB64(buffer) {
+ return Utils.fromB64toUrlB64(Utils.fromBufferToB64(buffer));
+ }
+ static fromB64toUrlB64(b64Str) {
+ return b64Str.replace(/\+/g, '-')
+ .replace(/\//g, '_')
+ .replace(/=/g, '');
+ }
+ static fromBufferToUtf8(buffer) {
+ if (Utils.isNode || Utils.isNativeScript) {
+ return Buffer.from(buffer).toString('utf8');
+ }
+ else {
+ const bytes = new Uint8Array(buffer);
+ const encodedString = String.fromCharCode.apply(null, bytes);
+ return decodeURIComponent(escape(encodedString));
+ }
+ }
+ static fromBufferToByteString(buffer) {
+ return String.fromCharCode.apply(null, new Uint8Array(buffer));
+ }
+ // ref: https://stackoverflow.com/a/40031979/1090359
+ static fromBufferToHex(buffer) {
+ if (Utils.isNode || Utils.isNativeScript) {
+ return Buffer.from(buffer).toString('hex');
+ }
+ else {
+ const bytes = new Uint8Array(buffer);
+ return Array.prototype.map.call(bytes, (x) => ('00' + x.toString(16)).slice(-2)).join('');
+ }
+ }
+ static fromUrlB64ToB64(urlB64Str) {
+ let output = urlB64Str.replace(/-/g, '+').replace(/_/g, '/');
+ switch (output.length % 4) {
+ case 0:
+ break;
+ case 2:
+ output += '==';
+ break;
+ case 3:
+ output += '=';
+ break;
+ default:
+ throw new Error('Illegal base64url string!');
+ }
+ return output;
+ }
+ static fromUrlB64ToUtf8(urlB64Str) {
+ return Utils.fromB64ToUtf8(Utils.fromUrlB64ToB64(urlB64Str));
+ }
+ static fromUtf8ToB64(utfStr) {
+ if (Utils.isNode || Utils.isNativeScript) {
+ return Buffer.from(utfStr, 'utf8').toString('base64');
+ }
+ else {
+ return decodeURIComponent(escape(window.btoa(utfStr)));
+ }
+ }
+ static fromUtf8ToUrlB64(utfStr) {
+ return Utils.fromBufferToUrlB64(Utils.fromUtf8ToArray(utfStr));
+ }
+ static fromB64ToUtf8(b64Str) {
+ if (Utils.isNode || Utils.isNativeScript) {
+ return Buffer.from(b64Str, 'base64').toString('utf8');
+ }
+ else {
+ return decodeURIComponent(escape(window.atob(b64Str)));
+ }
+ }
+ // ref: http://stackoverflow.com/a/2117523/1090359
+ static newGuid() {
+ return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => {
+ // tslint:disable-next-line
+ const r = Math.random() * 16 | 0;
+ // tslint:disable-next-line
+ const v = c === 'x' ? r : (r & 0x3 | 0x8);
+ return v.toString(16);
+ });
+ }
+ static isGuid(id) {
+ return RegExp(/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/, 'i').test(id);
+ }
+ static getHostname(uriString) {
+ const url = Utils.getUrl(uriString);
+ try {
+ return url != null && url.hostname !== '' ? url.hostname : null;
+ }
+ catch (_a) {
+ return null;
+ }
+ }
+ static getHost(uriString) {
+ const url = Utils.getUrl(uriString);
+ try {
+ return url != null && url.host !== '' ? url.host : null;
+ }
+ catch (_a) {
+ return null;
+ }
+ }
+ static getDomain(uriString) {
+ if (uriString == null) {
+ return null;
+ }
+ uriString = uriString.trim();
+ if (uriString === '') {
+ return null;
+ }
+ if (uriString.startsWith('data:')) {
+ return null;
+ }
+ let httpUrl = uriString.startsWith('http://') || uriString.startsWith('https://');
+ if (!httpUrl && uriString.indexOf('://') < 0 && Utils.tldEndingRegex.test(uriString)) {
+ uriString = 'http://' + uriString;
+ httpUrl = true;
+ }
+ if (httpUrl) {
+ try {
+ const url = Utils.getUrlObject(uriString);
+ const validHostname = (tldjs__WEBPACK_IMPORTED_MODULE_0__ === null || tldjs__WEBPACK_IMPORTED_MODULE_0__ === void 0 ? void 0 : tldjs__WEBPACK_IMPORTED_MODULE_0__["isValid"]) != null ? tldjs__WEBPACK_IMPORTED_MODULE_0__["isValid"](url.hostname) : true;
+ if (!validHostname) {
+ return null;
+ }
+ if (url.hostname === 'localhost' || Utils.validIpAddress(url.hostname)) {
+ return url.hostname;
+ }
+ const urlDomain = tldjs__WEBPACK_IMPORTED_MODULE_0__ != null && tldjs__WEBPACK_IMPORTED_MODULE_0__["getDomain"] != null ? tldjs__WEBPACK_IMPORTED_MODULE_0__["getDomain"](url.hostname) : null;
+ return urlDomain != null ? urlDomain : url.hostname;
+ }
+ catch (e) {
+ // Invalid domain, try another approach below.
+ }
+ }
+ try {
+ const domain = tldjs__WEBPACK_IMPORTED_MODULE_0__ != null && tldjs__WEBPACK_IMPORTED_MODULE_0__["getDomain"] != null ? tldjs__WEBPACK_IMPORTED_MODULE_0__["getDomain"](uriString) : null;
+ if (domain != null) {
+ return domain;
+ }
+ }
+ catch (_a) {
+ return null;
+ }
+ return null;
+ }
+ static getQueryParams(uriString) {
+ const url = Utils.getUrl(uriString);
+ if (url == null || url.search == null || url.search === '') {
+ return null;
+ }
+ const map = new Map();
+ const pairs = (url.search[0] === '?' ? url.search.substr(1) : url.search).split('&');
+ pairs.forEach(pair => {
+ const parts = pair.split('=');
+ if (parts.length < 1) {
+ return;
+ }
+ map.set(decodeURIComponent(parts[0]).toLowerCase(), parts[1] == null ? '' : decodeURIComponent(parts[1]));
+ });
+ return map;
+ }
+ static getSortFunction(i18nService, prop) {
+ return (a, b) => {
+ if (a[prop] == null && b[prop] != null) {
+ return -1;
+ }
+ if (a[prop] != null && b[prop] == null) {
+ return 1;
+ }
+ if (a[prop] == null && b[prop] == null) {
+ return 0;
+ }
+ return i18nService.collator ? i18nService.collator.compare(a[prop], b[prop]) :
+ a[prop].localeCompare(b[prop]);
+ };
+ }
+ static isNullOrWhitespace(str) {
+ return str == null || typeof str !== 'string' || str.trim() === '';
+ }
+ static nameOf(name) {
+ return name;
+ }
+ static assign(target, source) {
+ return Object.assign(target, source);
+ }
+ static iterateEnum(obj) {
+ return Object.keys(obj).filter(k => Number.isNaN(+k)).map(k => obj[k]);
+ }
+ static getUrl(uriString) {
+ if (uriString == null) {
+ return null;
+ }
+ uriString = uriString.trim();
+ if (uriString === '') {
+ return null;
+ }
+ let url = Utils.getUrlObject(uriString);
+ if (url == null) {
+ const hasHttpProtocol = uriString.indexOf('http://') === 0 || uriString.indexOf('https://') === 0;
+ if (!hasHttpProtocol && uriString.indexOf('.') > -1) {
+ url = Utils.getUrlObject('http://' + uriString);
+ }
+ }
+ return url;
+ }
+ static camelToPascalCase(s) {
+ return s.charAt(0).toUpperCase() + s.slice(1);
+ }
+ static validIpAddress(ipString) {
+ // tslint:disable-next-line
+ const ipRegex = /^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/;
+ return ipRegex.test(ipString);
+ }
+ static isMobile(win) {
+ let mobile = false;
+ (a => {
+ // tslint:disable-next-line
+ if (/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0, 4))) {
+ mobile = true;
+ }
+ })(win.navigator.userAgent || win.navigator.vendor || win.opera);
+ return mobile || win.navigator.userAgent.match(/iPad/i) != null;
+ }
+ static isAppleMobile(win) {
+ return win.navigator.userAgent.match(/iPhone/i) != null || win.navigator.userAgent.match(/iPad/i) != null;
+ }
+ static getUrlObject(uriString) {
+ try {
+ if (nodeURL != null) {
+ return nodeURL.URL ? new nodeURL.URL(uriString) : nodeURL.parse(uriString);
+ }
+ else if (typeof URL === 'function') {
+ return new URL(uriString);
+ }
+ else if (window != null) {
+ const hasProtocol = uriString.indexOf('://') > -1;
+ if (!hasProtocol && uriString.indexOf('.') > -1) {
+ uriString = 'http://' + uriString;
+ }
+ else if (!hasProtocol) {
+ return null;
+ }
+ const anchor = window.document.createElement('a');
+ anchor.href = uriString;
+ return anchor;
+ }
+ }
+ catch (e) {
+ // Ignore error
+ }
+ return null;
+ }
+}
+Utils.inited = false;
+Utils.isNativeScript = false;
+Utils.isNode = false;
+Utils.isBrowser = true;
+Utils.isMobileBrowser = false;
+Utils.isAppleMobileBrowser = false;
+Utils.global = null;
+Utils.tldEndingRegex = /.*\.(com|net|org|edu|uk|gov|ca|de|jp|fr|au|ru|ch|io|es|us|co|xyz|info|ly|mil)$/;
+// Transpiled version of /\p{Emoji_Presentation}/gu using https://mothereff.in/regexpu. Used for compatability in older browsers.
+Utils.regexpEmojiPresentation = /(?:[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u270A\u270B\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55]|\uD83C[\uDC04\uDCCF\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF7C\uDF7E-\uDF93\uDFA0-\uDFCA\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF4\uDFF8-\uDFFF]|\uD83D[\uDC00-\uDC3E\uDC40\uDC42-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDD7A\uDD95\uDD96\uDDA4\uDDFB-\uDE4F\uDE80-\uDEC5\uDECC\uDED0-\uDED2\uDED5-\uDED7\uDEEB\uDEEC\uDEF4-\uDEFC\uDFE0-\uDFEB]|\uD83E[\uDD0C-\uDD3A\uDD3C-\uDD45\uDD47-\uDD78\uDD7A-\uDDCB\uDDCD-\uDDFF\uDE70-\uDE74\uDE78-\uDE7A\uDE80-\uDE86\uDE90-\uDEA8\uDEB0-\uDEB6\uDEC0-\uDEC2\uDED0-\uDED6])/g;
+Utils.init();
+
+/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../../node_modules/process/browser.js */ "./node_modules/process/browser.js"), __webpack_require__(/*! ./../../../../node_modules/webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js"), __webpack_require__(/*! ./../../../../node_modules/buffer/index.js */ "./node_modules/buffer/index.js").Buffer))
+
+/***/ }),
+
+/***/ "./jslib/common/src/misc/wordlist.ts":
+/*!*******************************************!*\
+ !*** ./jslib/common/src/misc/wordlist.ts ***!
+ \*******************************************/
+/*! exports provided: EEFLongWordList */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "EEFLongWordList", function() { return EEFLongWordList; });
+// EFF's Long Wordlist from https://www.eff.org/dice
+const EEFLongWordList = [
+ 'abacus',
+ 'abdomen',
+ 'abdominal',
+ 'abide',
+ 'abiding',
+ 'ability',
+ 'ablaze',
+ 'able',
+ 'abnormal',
+ 'abrasion',
+ 'abrasive',
+ 'abreast',
+ 'abridge',
+ 'abroad',
+ 'abruptly',
+ 'absence',
+ 'absentee',
+ 'absently',
+ 'absinthe',
+ 'absolute',
+ 'absolve',
+ 'abstain',
+ 'abstract',
+ 'absurd',
+ 'accent',
+ 'acclaim',
+ 'acclimate',
+ 'accompany',
+ 'account',
+ 'accuracy',
+ 'accurate',
+ 'accustom',
+ 'acetone',
+ 'achiness',
+ 'aching',
+ 'acid',
+ 'acorn',
+ 'acquaint',
+ 'acquire',
+ 'acre',
+ 'acrobat',
+ 'acronym',
+ 'acting',
+ 'action',
+ 'activate',
+ 'activator',
+ 'active',
+ 'activism',
+ 'activist',
+ 'activity',
+ 'actress',
+ 'acts',
+ 'acutely',
+ 'acuteness',
+ 'aeration',
+ 'aerobics',
+ 'aerosol',
+ 'aerospace',
+ 'afar',
+ 'affair',
+ 'affected',
+ 'affecting',
+ 'affection',
+ 'affidavit',
+ 'affiliate',
+ 'affirm',
+ 'affix',
+ 'afflicted',
+ 'affluent',
+ 'afford',
+ 'affront',
+ 'aflame',
+ 'afloat',
+ 'aflutter',
+ 'afoot',
+ 'afraid',
+ 'afterglow',
+ 'afterlife',
+ 'aftermath',
+ 'aftermost',
+ 'afternoon',
+ 'aged',
+ 'ageless',
+ 'agency',
+ 'agenda',
+ 'agent',
+ 'aggregate',
+ 'aghast',
+ 'agile',
+ 'agility',
+ 'aging',
+ 'agnostic',
+ 'agonize',
+ 'agonizing',
+ 'agony',
+ 'agreeable',
+ 'agreeably',
+ 'agreed',
+ 'agreeing',
+ 'agreement',
+ 'aground',
+ 'ahead',
+ 'ahoy',
+ 'aide',
+ 'aids',
+ 'aim',
+ 'ajar',
+ 'alabaster',
+ 'alarm',
+ 'albatross',
+ 'album',
+ 'alfalfa',
+ 'algebra',
+ 'algorithm',
+ 'alias',
+ 'alibi',
+ 'alienable',
+ 'alienate',
+ 'aliens',
+ 'alike',
+ 'alive',
+ 'alkaline',
+ 'alkalize',
+ 'almanac',
+ 'almighty',
+ 'almost',
+ 'aloe',
+ 'aloft',
+ 'aloha',
+ 'alone',
+ 'alongside',
+ 'aloof',
+ 'alphabet',
+ 'alright',
+ 'although',
+ 'altitude',
+ 'alto',
+ 'aluminum',
+ 'alumni',
+ 'always',
+ 'amaretto',
+ 'amaze',
+ 'amazingly',
+ 'amber',
+ 'ambiance',
+ 'ambiguity',
+ 'ambiguous',
+ 'ambition',
+ 'ambitious',
+ 'ambulance',
+ 'ambush',
+ 'amendable',
+ 'amendment',
+ 'amends',
+ 'amenity',
+ 'amiable',
+ 'amicably',
+ 'amid',
+ 'amigo',
+ 'amino',
+ 'amiss',
+ 'ammonia',
+ 'ammonium',
+ 'amnesty',
+ 'amniotic',
+ 'among',
+ 'amount',
+ 'amperage',
+ 'ample',
+ 'amplifier',
+ 'amplify',
+ 'amply',
+ 'amuck',
+ 'amulet',
+ 'amusable',
+ 'amused',
+ 'amusement',
+ 'amuser',
+ 'amusing',
+ 'anaconda',
+ 'anaerobic',
+ 'anagram',
+ 'anatomist',
+ 'anatomy',
+ 'anchor',
+ 'anchovy',
+ 'ancient',
+ 'android',
+ 'anemia',
+ 'anemic',
+ 'aneurism',
+ 'anew',
+ 'angelfish',
+ 'angelic',
+ 'anger',
+ 'angled',
+ 'angler',
+ 'angles',
+ 'angling',
+ 'angrily',
+ 'angriness',
+ 'anguished',
+ 'angular',
+ 'animal',
+ 'animate',
+ 'animating',
+ 'animation',
+ 'animator',
+ 'anime',
+ 'animosity',
+ 'ankle',
+ 'annex',
+ 'annotate',
+ 'announcer',
+ 'annoying',
+ 'annually',
+ 'annuity',
+ 'anointer',
+ 'another',
+ 'answering',
+ 'antacid',
+ 'antarctic',
+ 'anteater',
+ 'antelope',
+ 'antennae',
+ 'anthem',
+ 'anthill',
+ 'anthology',
+ 'antibody',
+ 'antics',
+ 'antidote',
+ 'antihero',
+ 'antiquely',
+ 'antiques',
+ 'antiquity',
+ 'antirust',
+ 'antitoxic',
+ 'antitrust',
+ 'antiviral',
+ 'antivirus',
+ 'antler',
+ 'antonym',
+ 'antsy',
+ 'anvil',
+ 'anybody',
+ 'anyhow',
+ 'anymore',
+ 'anyone',
+ 'anyplace',
+ 'anything',
+ 'anytime',
+ 'anyway',
+ 'anywhere',
+ 'aorta',
+ 'apache',
+ 'apostle',
+ 'appealing',
+ 'appear',
+ 'appease',
+ 'appeasing',
+ 'appendage',
+ 'appendix',
+ 'appetite',
+ 'appetizer',
+ 'applaud',
+ 'applause',
+ 'apple',
+ 'appliance',
+ 'applicant',
+ 'applied',
+ 'apply',
+ 'appointee',
+ 'appraisal',
+ 'appraiser',
+ 'apprehend',
+ 'approach',
+ 'approval',
+ 'approve',
+ 'apricot',
+ 'april',
+ 'apron',
+ 'aptitude',
+ 'aptly',
+ 'aqua',
+ 'aqueduct',
+ 'arbitrary',
+ 'arbitrate',
+ 'ardently',
+ 'area',
+ 'arena',
+ 'arguable',
+ 'arguably',
+ 'argue',
+ 'arise',
+ 'armadillo',
+ 'armband',
+ 'armchair',
+ 'armed',
+ 'armful',
+ 'armhole',
+ 'arming',
+ 'armless',
+ 'armoire',
+ 'armored',
+ 'armory',
+ 'armrest',
+ 'army',
+ 'aroma',
+ 'arose',
+ 'around',
+ 'arousal',
+ 'arrange',
+ 'array',
+ 'arrest',
+ 'arrival',
+ 'arrive',
+ 'arrogance',
+ 'arrogant',
+ 'arson',
+ 'art',
+ 'ascend',
+ 'ascension',
+ 'ascent',
+ 'ascertain',
+ 'ashamed',
+ 'ashen',
+ 'ashes',
+ 'ashy',
+ 'aside',
+ 'askew',
+ 'asleep',
+ 'asparagus',
+ 'aspect',
+ 'aspirate',
+ 'aspire',
+ 'aspirin',
+ 'astonish',
+ 'astound',
+ 'astride',
+ 'astrology',
+ 'astronaut',
+ 'astronomy',
+ 'astute',
+ 'atlantic',
+ 'atlas',
+ 'atom',
+ 'atonable',
+ 'atop',
+ 'atrium',
+ 'atrocious',
+ 'atrophy',
+ 'attach',
+ 'attain',
+ 'attempt',
+ 'attendant',
+ 'attendee',
+ 'attention',
+ 'attentive',
+ 'attest',
+ 'attic',
+ 'attire',
+ 'attitude',
+ 'attractor',
+ 'attribute',
+ 'atypical',
+ 'auction',
+ 'audacious',
+ 'audacity',
+ 'audible',
+ 'audibly',
+ 'audience',
+ 'audio',
+ 'audition',
+ 'augmented',
+ 'august',
+ 'authentic',
+ 'author',
+ 'autism',
+ 'autistic',
+ 'autograph',
+ 'automaker',
+ 'automated',
+ 'automatic',
+ 'autopilot',
+ 'available',
+ 'avalanche',
+ 'avatar',
+ 'avenge',
+ 'avenging',
+ 'avenue',
+ 'average',
+ 'aversion',
+ 'avert',
+ 'aviation',
+ 'aviator',
+ 'avid',
+ 'avoid',
+ 'await',
+ 'awaken',
+ 'award',
+ 'aware',
+ 'awhile',
+ 'awkward',
+ 'awning',
+ 'awoke',
+ 'awry',
+ 'axis',
+ 'babble',
+ 'babbling',
+ 'babied',
+ 'baboon',
+ 'backache',
+ 'backboard',
+ 'backboned',
+ 'backdrop',
+ 'backed',
+ 'backer',
+ 'backfield',
+ 'backfire',
+ 'backhand',
+ 'backing',
+ 'backlands',
+ 'backlash',
+ 'backless',
+ 'backlight',
+ 'backlit',
+ 'backlog',
+ 'backpack',
+ 'backpedal',
+ 'backrest',
+ 'backroom',
+ 'backshift',
+ 'backside',
+ 'backslid',
+ 'backspace',
+ 'backspin',
+ 'backstab',
+ 'backstage',
+ 'backtalk',
+ 'backtrack',
+ 'backup',
+ 'backward',
+ 'backwash',
+ 'backwater',
+ 'backyard',
+ 'bacon',
+ 'bacteria',
+ 'bacterium',
+ 'badass',
+ 'badge',
+ 'badland',
+ 'badly',
+ 'badness',
+ 'baffle',
+ 'baffling',
+ 'bagel',
+ 'bagful',
+ 'baggage',
+ 'bagged',
+ 'baggie',
+ 'bagginess',
+ 'bagging',
+ 'baggy',
+ 'bagpipe',
+ 'baguette',
+ 'baked',
+ 'bakery',
+ 'bakeshop',
+ 'baking',
+ 'balance',
+ 'balancing',
+ 'balcony',
+ 'balmy',
+ 'balsamic',
+ 'bamboo',
+ 'banana',
+ 'banish',
+ 'banister',
+ 'banjo',
+ 'bankable',
+ 'bankbook',
+ 'banked',
+ 'banker',
+ 'banking',
+ 'banknote',
+ 'bankroll',
+ 'banner',
+ 'bannister',
+ 'banshee',
+ 'banter',
+ 'barbecue',
+ 'barbed',
+ 'barbell',
+ 'barber',
+ 'barcode',
+ 'barge',
+ 'bargraph',
+ 'barista',
+ 'baritone',
+ 'barley',
+ 'barmaid',
+ 'barman',
+ 'barn',
+ 'barometer',
+ 'barrack',
+ 'barracuda',
+ 'barrel',
+ 'barrette',
+ 'barricade',
+ 'barrier',
+ 'barstool',
+ 'bartender',
+ 'barterer',
+ 'bash',
+ 'basically',
+ 'basics',
+ 'basil',
+ 'basin',
+ 'basis',
+ 'basket',
+ 'batboy',
+ 'batch',
+ 'bath',
+ 'baton',
+ 'bats',
+ 'battalion',
+ 'battered',
+ 'battering',
+ 'battery',
+ 'batting',
+ 'battle',
+ 'bauble',
+ 'bazooka',
+ 'blabber',
+ 'bladder',
+ 'blade',
+ 'blah',
+ 'blame',
+ 'blaming',
+ 'blanching',
+ 'blandness',
+ 'blank',
+ 'blaspheme',
+ 'blasphemy',
+ 'blast',
+ 'blatancy',
+ 'blatantly',
+ 'blazer',
+ 'blazing',
+ 'bleach',
+ 'bleak',
+ 'bleep',
+ 'blemish',
+ 'blend',
+ 'bless',
+ 'blighted',
+ 'blimp',
+ 'bling',
+ 'blinked',
+ 'blinker',
+ 'blinking',
+ 'blinks',
+ 'blip',
+ 'blissful',
+ 'blitz',
+ 'blizzard',
+ 'bloated',
+ 'bloating',
+ 'blob',
+ 'blog',
+ 'bloomers',
+ 'blooming',
+ 'blooper',
+ 'blot',
+ 'blouse',
+ 'blubber',
+ 'bluff',
+ 'bluish',
+ 'blunderer',
+ 'blunt',
+ 'blurb',
+ 'blurred',
+ 'blurry',
+ 'blurt',
+ 'blush',
+ 'blustery',
+ 'boaster',
+ 'boastful',
+ 'boasting',
+ 'boat',
+ 'bobbed',
+ 'bobbing',
+ 'bobble',
+ 'bobcat',
+ 'bobsled',
+ 'bobtail',
+ 'bodacious',
+ 'body',
+ 'bogged',
+ 'boggle',
+ 'bogus',
+ 'boil',
+ 'bok',
+ 'bolster',
+ 'bolt',
+ 'bonanza',
+ 'bonded',
+ 'bonding',
+ 'bondless',
+ 'boned',
+ 'bonehead',
+ 'boneless',
+ 'bonelike',
+ 'boney',
+ 'bonfire',
+ 'bonnet',
+ 'bonsai',
+ 'bonus',
+ 'bony',
+ 'boogeyman',
+ 'boogieman',
+ 'book',
+ 'boondocks',
+ 'booted',
+ 'booth',
+ 'bootie',
+ 'booting',
+ 'bootlace',
+ 'bootleg',
+ 'boots',
+ 'boozy',
+ 'borax',
+ 'boring',
+ 'borough',
+ 'borrower',
+ 'borrowing',
+ 'boss',
+ 'botanical',
+ 'botanist',
+ 'botany',
+ 'botch',
+ 'both',
+ 'bottle',
+ 'bottling',
+ 'bottom',
+ 'bounce',
+ 'bouncing',
+ 'bouncy',
+ 'bounding',
+ 'boundless',
+ 'bountiful',
+ 'bovine',
+ 'boxcar',
+ 'boxer',
+ 'boxing',
+ 'boxlike',
+ 'boxy',
+ 'breach',
+ 'breath',
+ 'breeches',
+ 'breeching',
+ 'breeder',
+ 'breeding',
+ 'breeze',
+ 'breezy',
+ 'brethren',
+ 'brewery',
+ 'brewing',
+ 'briar',
+ 'bribe',
+ 'brick',
+ 'bride',
+ 'bridged',
+ 'brigade',
+ 'bright',
+ 'brilliant',
+ 'brim',
+ 'bring',
+ 'brink',
+ 'brisket',
+ 'briskly',
+ 'briskness',
+ 'bristle',
+ 'brittle',
+ 'broadband',
+ 'broadcast',
+ 'broaden',
+ 'broadly',
+ 'broadness',
+ 'broadside',
+ 'broadways',
+ 'broiler',
+ 'broiling',
+ 'broken',
+ 'broker',
+ 'bronchial',
+ 'bronco',
+ 'bronze',
+ 'bronzing',
+ 'brook',
+ 'broom',
+ 'brought',
+ 'browbeat',
+ 'brownnose',
+ 'browse',
+ 'browsing',
+ 'bruising',
+ 'brunch',
+ 'brunette',
+ 'brunt',
+ 'brush',
+ 'brussels',
+ 'brute',
+ 'brutishly',
+ 'bubble',
+ 'bubbling',
+ 'bubbly',
+ 'buccaneer',
+ 'bucked',
+ 'bucket',
+ 'buckle',
+ 'buckshot',
+ 'buckskin',
+ 'bucktooth',
+ 'buckwheat',
+ 'buddhism',
+ 'buddhist',
+ 'budding',
+ 'buddy',
+ 'budget',
+ 'buffalo',
+ 'buffed',
+ 'buffer',
+ 'buffing',
+ 'buffoon',
+ 'buggy',
+ 'bulb',
+ 'bulge',
+ 'bulginess',
+ 'bulgur',
+ 'bulk',
+ 'bulldog',
+ 'bulldozer',
+ 'bullfight',
+ 'bullfrog',
+ 'bullhorn',
+ 'bullion',
+ 'bullish',
+ 'bullpen',
+ 'bullring',
+ 'bullseye',
+ 'bullwhip',
+ 'bully',
+ 'bunch',
+ 'bundle',
+ 'bungee',
+ 'bunion',
+ 'bunkbed',
+ 'bunkhouse',
+ 'bunkmate',
+ 'bunny',
+ 'bunt',
+ 'busboy',
+ 'bush',
+ 'busily',
+ 'busload',
+ 'bust',
+ 'busybody',
+ 'buzz',
+ 'cabana',
+ 'cabbage',
+ 'cabbie',
+ 'cabdriver',
+ 'cable',
+ 'caboose',
+ 'cache',
+ 'cackle',
+ 'cacti',
+ 'cactus',
+ 'caddie',
+ 'caddy',
+ 'cadet',
+ 'cadillac',
+ 'cadmium',
+ 'cage',
+ 'cahoots',
+ 'cake',
+ 'calamari',
+ 'calamity',
+ 'calcium',
+ 'calculate',
+ 'calculus',
+ 'caliber',
+ 'calibrate',
+ 'calm',
+ 'caloric',
+ 'calorie',
+ 'calzone',
+ 'camcorder',
+ 'cameo',
+ 'camera',
+ 'camisole',
+ 'camper',
+ 'campfire',
+ 'camping',
+ 'campsite',
+ 'campus',
+ 'canal',
+ 'canary',
+ 'cancel',
+ 'candied',
+ 'candle',
+ 'candy',
+ 'cane',
+ 'canine',
+ 'canister',
+ 'cannabis',
+ 'canned',
+ 'canning',
+ 'cannon',
+ 'cannot',
+ 'canola',
+ 'canon',
+ 'canopener',
+ 'canopy',
+ 'canteen',
+ 'canyon',
+ 'capable',
+ 'capably',
+ 'capacity',
+ 'cape',
+ 'capillary',
+ 'capital',
+ 'capitol',
+ 'capped',
+ 'capricorn',
+ 'capsize',
+ 'capsule',
+ 'caption',
+ 'captivate',
+ 'captive',
+ 'captivity',
+ 'capture',
+ 'caramel',
+ 'carat',
+ 'caravan',
+ 'carbon',
+ 'cardboard',
+ 'carded',
+ 'cardiac',
+ 'cardigan',
+ 'cardinal',
+ 'cardstock',
+ 'carefully',
+ 'caregiver',
+ 'careless',
+ 'caress',
+ 'caretaker',
+ 'cargo',
+ 'caring',
+ 'carless',
+ 'carload',
+ 'carmaker',
+ 'carnage',
+ 'carnation',
+ 'carnival',
+ 'carnivore',
+ 'carol',
+ 'carpenter',
+ 'carpentry',
+ 'carpool',
+ 'carport',
+ 'carried',
+ 'carrot',
+ 'carrousel',
+ 'carry',
+ 'cartel',
+ 'cartload',
+ 'carton',
+ 'cartoon',
+ 'cartridge',
+ 'cartwheel',
+ 'carve',
+ 'carving',
+ 'carwash',
+ 'cascade',
+ 'case',
+ 'cash',
+ 'casing',
+ 'casino',
+ 'casket',
+ 'cassette',
+ 'casually',
+ 'casualty',
+ 'catacomb',
+ 'catalog',
+ 'catalyst',
+ 'catalyze',
+ 'catapult',
+ 'cataract',
+ 'catatonic',
+ 'catcall',
+ 'catchable',
+ 'catcher',
+ 'catching',
+ 'catchy',
+ 'caterer',
+ 'catering',
+ 'catfight',
+ 'catfish',
+ 'cathedral',
+ 'cathouse',
+ 'catlike',
+ 'catnap',
+ 'catnip',
+ 'catsup',
+ 'cattail',
+ 'cattishly',
+ 'cattle',
+ 'catty',
+ 'catwalk',
+ 'caucasian',
+ 'caucus',
+ 'causal',
+ 'causation',
+ 'cause',
+ 'causing',
+ 'cauterize',
+ 'caution',
+ 'cautious',
+ 'cavalier',
+ 'cavalry',
+ 'caviar',
+ 'cavity',
+ 'cedar',
+ 'celery',
+ 'celestial',
+ 'celibacy',
+ 'celibate',
+ 'celtic',
+ 'cement',
+ 'census',
+ 'ceramics',
+ 'ceremony',
+ 'certainly',
+ 'certainty',
+ 'certified',
+ 'certify',
+ 'cesarean',
+ 'cesspool',
+ 'chafe',
+ 'chaffing',
+ 'chain',
+ 'chair',
+ 'chalice',
+ 'challenge',
+ 'chamber',
+ 'chamomile',
+ 'champion',
+ 'chance',
+ 'change',
+ 'channel',
+ 'chant',
+ 'chaos',
+ 'chaperone',
+ 'chaplain',
+ 'chapped',
+ 'chaps',
+ 'chapter',
+ 'character',
+ 'charbroil',
+ 'charcoal',
+ 'charger',
+ 'charging',
+ 'chariot',
+ 'charity',
+ 'charm',
+ 'charred',
+ 'charter',
+ 'charting',
+ 'chase',
+ 'chasing',
+ 'chaste',
+ 'chastise',
+ 'chastity',
+ 'chatroom',
+ 'chatter',
+ 'chatting',
+ 'chatty',
+ 'cheating',
+ 'cheddar',
+ 'cheek',
+ 'cheer',
+ 'cheese',
+ 'cheesy',
+ 'chef',
+ 'chemicals',
+ 'chemist',
+ 'chemo',
+ 'cherisher',
+ 'cherub',
+ 'chess',
+ 'chest',
+ 'chevron',
+ 'chevy',
+ 'chewable',
+ 'chewer',
+ 'chewing',
+ 'chewy',
+ 'chief',
+ 'chihuahua',
+ 'childcare',
+ 'childhood',
+ 'childish',
+ 'childless',
+ 'childlike',
+ 'chili',
+ 'chill',
+ 'chimp',
+ 'chip',
+ 'chirping',
+ 'chirpy',
+ 'chitchat',
+ 'chivalry',
+ 'chive',
+ 'chloride',
+ 'chlorine',
+ 'choice',
+ 'chokehold',
+ 'choking',
+ 'chomp',
+ 'chooser',
+ 'choosing',
+ 'choosy',
+ 'chop',
+ 'chosen',
+ 'chowder',
+ 'chowtime',
+ 'chrome',
+ 'chubby',
+ 'chuck',
+ 'chug',
+ 'chummy',
+ 'chump',
+ 'chunk',
+ 'churn',
+ 'chute',
+ 'cider',
+ 'cilantro',
+ 'cinch',
+ 'cinema',
+ 'cinnamon',
+ 'circle',
+ 'circling',
+ 'circular',
+ 'circulate',
+ 'circus',
+ 'citable',
+ 'citadel',
+ 'citation',
+ 'citizen',
+ 'citric',
+ 'citrus',
+ 'city',
+ 'civic',
+ 'civil',
+ 'clad',
+ 'claim',
+ 'clambake',
+ 'clammy',
+ 'clamor',
+ 'clamp',
+ 'clamshell',
+ 'clang',
+ 'clanking',
+ 'clapped',
+ 'clapper',
+ 'clapping',
+ 'clarify',
+ 'clarinet',
+ 'clarity',
+ 'clash',
+ 'clasp',
+ 'class',
+ 'clatter',
+ 'clause',
+ 'clavicle',
+ 'claw',
+ 'clay',
+ 'clean',
+ 'clear',
+ 'cleat',
+ 'cleaver',
+ 'cleft',
+ 'clench',
+ 'clergyman',
+ 'clerical',
+ 'clerk',
+ 'clever',
+ 'clicker',
+ 'client',
+ 'climate',
+ 'climatic',
+ 'cling',
+ 'clinic',
+ 'clinking',
+ 'clip',
+ 'clique',
+ 'cloak',
+ 'clobber',
+ 'clock',
+ 'clone',
+ 'cloning',
+ 'closable',
+ 'closure',
+ 'clothes',
+ 'clothing',
+ 'cloud',
+ 'clover',
+ 'clubbed',
+ 'clubbing',
+ 'clubhouse',
+ 'clump',
+ 'clumsily',
+ 'clumsy',
+ 'clunky',
+ 'clustered',
+ 'clutch',
+ 'clutter',
+ 'coach',
+ 'coagulant',
+ 'coastal',
+ 'coaster',
+ 'coasting',
+ 'coastland',
+ 'coastline',
+ 'coat',
+ 'coauthor',
+ 'cobalt',
+ 'cobbler',
+ 'cobweb',
+ 'cocoa',
+ 'coconut',
+ 'cod',
+ 'coeditor',
+ 'coerce',
+ 'coexist',
+ 'coffee',
+ 'cofounder',
+ 'cognition',
+ 'cognitive',
+ 'cogwheel',
+ 'coherence',
+ 'coherent',
+ 'cohesive',
+ 'coil',
+ 'coke',
+ 'cola',
+ 'cold',
+ 'coleslaw',
+ 'coliseum',
+ 'collage',
+ 'collapse',
+ 'collar',
+ 'collected',
+ 'collector',
+ 'collide',
+ 'collie',
+ 'collision',
+ 'colonial',
+ 'colonist',
+ 'colonize',
+ 'colony',
+ 'colossal',
+ 'colt',
+ 'coma',
+ 'come',
+ 'comfort',
+ 'comfy',
+ 'comic',
+ 'coming',
+ 'comma',
+ 'commence',
+ 'commend',
+ 'comment',
+ 'commerce',
+ 'commode',
+ 'commodity',
+ 'commodore',
+ 'common',
+ 'commotion',
+ 'commute',
+ 'commuting',
+ 'compacted',
+ 'compacter',
+ 'compactly',
+ 'compactor',
+ 'companion',
+ 'company',
+ 'compare',
+ 'compel',
+ 'compile',
+ 'comply',
+ 'component',
+ 'composed',
+ 'composer',
+ 'composite',
+ 'compost',
+ 'composure',
+ 'compound',
+ 'compress',
+ 'comprised',
+ 'computer',
+ 'computing',
+ 'comrade',
+ 'concave',
+ 'conceal',
+ 'conceded',
+ 'concept',
+ 'concerned',
+ 'concert',
+ 'conch',
+ 'concierge',
+ 'concise',
+ 'conclude',
+ 'concrete',
+ 'concur',
+ 'condense',
+ 'condiment',
+ 'condition',
+ 'condone',
+ 'conducive',
+ 'conductor',
+ 'conduit',
+ 'cone',
+ 'confess',
+ 'confetti',
+ 'confidant',
+ 'confident',
+ 'confider',
+ 'confiding',
+ 'configure',
+ 'confined',
+ 'confining',
+ 'confirm',
+ 'conflict',
+ 'conform',
+ 'confound',
+ 'confront',
+ 'confused',
+ 'confusing',
+ 'confusion',
+ 'congenial',
+ 'congested',
+ 'congrats',
+ 'congress',
+ 'conical',
+ 'conjoined',
+ 'conjure',
+ 'conjuror',
+ 'connected',
+ 'connector',
+ 'consensus',
+ 'consent',
+ 'console',
+ 'consoling',
+ 'consonant',
+ 'constable',
+ 'constant',
+ 'constrain',
+ 'constrict',
+ 'construct',
+ 'consult',
+ 'consumer',
+ 'consuming',
+ 'contact',
+ 'container',
+ 'contempt',
+ 'contend',
+ 'contented',
+ 'contently',
+ 'contents',
+ 'contest',
+ 'context',
+ 'contort',
+ 'contour',
+ 'contrite',
+ 'control',
+ 'contusion',
+ 'convene',
+ 'convent',
+ 'copartner',
+ 'cope',
+ 'copied',
+ 'copier',
+ 'copilot',
+ 'coping',
+ 'copious',
+ 'copper',
+ 'copy',
+ 'coral',
+ 'cork',
+ 'cornball',
+ 'cornbread',
+ 'corncob',
+ 'cornea',
+ 'corned',
+ 'corner',
+ 'cornfield',
+ 'cornflake',
+ 'cornhusk',
+ 'cornmeal',
+ 'cornstalk',
+ 'corny',
+ 'coronary',
+ 'coroner',
+ 'corporal',
+ 'corporate',
+ 'corral',
+ 'correct',
+ 'corridor',
+ 'corrode',
+ 'corroding',
+ 'corrosive',
+ 'corsage',
+ 'corset',
+ 'cortex',
+ 'cosigner',
+ 'cosmetics',
+ 'cosmic',
+ 'cosmos',
+ 'cosponsor',
+ 'cost',
+ 'cottage',
+ 'cotton',
+ 'couch',
+ 'cough',
+ 'could',
+ 'countable',
+ 'countdown',
+ 'counting',
+ 'countless',
+ 'country',
+ 'county',
+ 'courier',
+ 'covenant',
+ 'cover',
+ 'coveted',
+ 'coveting',
+ 'coyness',
+ 'cozily',
+ 'coziness',
+ 'cozy',
+ 'crabbing',
+ 'crabgrass',
+ 'crablike',
+ 'crabmeat',
+ 'cradle',
+ 'cradling',
+ 'crafter',
+ 'craftily',
+ 'craftsman',
+ 'craftwork',
+ 'crafty',
+ 'cramp',
+ 'cranberry',
+ 'crane',
+ 'cranial',
+ 'cranium',
+ 'crank',
+ 'crate',
+ 'crave',
+ 'craving',
+ 'crawfish',
+ 'crawlers',
+ 'crawling',
+ 'crayfish',
+ 'crayon',
+ 'crazed',
+ 'crazily',
+ 'craziness',
+ 'crazy',
+ 'creamed',
+ 'creamer',
+ 'creamlike',
+ 'crease',
+ 'creasing',
+ 'creatable',
+ 'create',
+ 'creation',
+ 'creative',
+ 'creature',
+ 'credible',
+ 'credibly',
+ 'credit',
+ 'creed',
+ 'creme',
+ 'creole',
+ 'crepe',
+ 'crept',
+ 'crescent',
+ 'crested',
+ 'cresting',
+ 'crestless',
+ 'crevice',
+ 'crewless',
+ 'crewman',
+ 'crewmate',
+ 'crib',
+ 'cricket',
+ 'cried',
+ 'crier',
+ 'crimp',
+ 'crimson',
+ 'cringe',
+ 'cringing',
+ 'crinkle',
+ 'crinkly',
+ 'crisped',
+ 'crisping',
+ 'crisply',
+ 'crispness',
+ 'crispy',
+ 'criteria',
+ 'critter',
+ 'croak',
+ 'crock',
+ 'crook',
+ 'croon',
+ 'crop',
+ 'cross',
+ 'crouch',
+ 'crouton',
+ 'crowbar',
+ 'crowd',
+ 'crown',
+ 'crucial',
+ 'crudely',
+ 'crudeness',
+ 'cruelly',
+ 'cruelness',
+ 'cruelty',
+ 'crumb',
+ 'crummiest',
+ 'crummy',
+ 'crumpet',
+ 'crumpled',
+ 'cruncher',
+ 'crunching',
+ 'crunchy',
+ 'crusader',
+ 'crushable',
+ 'crushed',
+ 'crusher',
+ 'crushing',
+ 'crust',
+ 'crux',
+ 'crying',
+ 'cryptic',
+ 'crystal',
+ 'cubbyhole',
+ 'cube',
+ 'cubical',
+ 'cubicle',
+ 'cucumber',
+ 'cuddle',
+ 'cuddly',
+ 'cufflink',
+ 'culinary',
+ 'culminate',
+ 'culpable',
+ 'culprit',
+ 'cultivate',
+ 'cultural',
+ 'culture',
+ 'cupbearer',
+ 'cupcake',
+ 'cupid',
+ 'cupped',
+ 'cupping',
+ 'curable',
+ 'curator',
+ 'curdle',
+ 'cure',
+ 'curfew',
+ 'curing',
+ 'curled',
+ 'curler',
+ 'curliness',
+ 'curling',
+ 'curly',
+ 'curry',
+ 'curse',
+ 'cursive',
+ 'cursor',
+ 'curtain',
+ 'curtly',
+ 'curtsy',
+ 'curvature',
+ 'curve',
+ 'curvy',
+ 'cushy',
+ 'cusp',
+ 'cussed',
+ 'custard',
+ 'custodian',
+ 'custody',
+ 'customary',
+ 'customer',
+ 'customize',
+ 'customs',
+ 'cut',
+ 'cycle',
+ 'cyclic',
+ 'cycling',
+ 'cyclist',
+ 'cylinder',
+ 'cymbal',
+ 'cytoplasm',
+ 'cytoplast',
+ 'dab',
+ 'dad',
+ 'daffodil',
+ 'dagger',
+ 'daily',
+ 'daintily',
+ 'dainty',
+ 'dairy',
+ 'daisy',
+ 'dallying',
+ 'dance',
+ 'dancing',
+ 'dandelion',
+ 'dander',
+ 'dandruff',
+ 'dandy',
+ 'danger',
+ 'dangle',
+ 'dangling',
+ 'daredevil',
+ 'dares',
+ 'daringly',
+ 'darkened',
+ 'darkening',
+ 'darkish',
+ 'darkness',
+ 'darkroom',
+ 'darling',
+ 'darn',
+ 'dart',
+ 'darwinism',
+ 'dash',
+ 'dastardly',
+ 'data',
+ 'datebook',
+ 'dating',
+ 'daughter',
+ 'daunting',
+ 'dawdler',
+ 'dawn',
+ 'daybed',
+ 'daybreak',
+ 'daycare',
+ 'daydream',
+ 'daylight',
+ 'daylong',
+ 'dayroom',
+ 'daytime',
+ 'dazzler',
+ 'dazzling',
+ 'deacon',
+ 'deafening',
+ 'deafness',
+ 'dealer',
+ 'dealing',
+ 'dealmaker',
+ 'dealt',
+ 'dean',
+ 'debatable',
+ 'debate',
+ 'debating',
+ 'debit',
+ 'debrief',
+ 'debtless',
+ 'debtor',
+ 'debug',
+ 'debunk',
+ 'decade',
+ 'decaf',
+ 'decal',
+ 'decathlon',
+ 'decay',
+ 'deceased',
+ 'deceit',
+ 'deceiver',
+ 'deceiving',
+ 'december',
+ 'decency',
+ 'decent',
+ 'deception',
+ 'deceptive',
+ 'decibel',
+ 'decidable',
+ 'decimal',
+ 'decimeter',
+ 'decipher',
+ 'deck',
+ 'declared',
+ 'decline',
+ 'decode',
+ 'decompose',
+ 'decorated',
+ 'decorator',
+ 'decoy',
+ 'decrease',
+ 'decree',
+ 'dedicate',
+ 'dedicator',
+ 'deduce',
+ 'deduct',
+ 'deed',
+ 'deem',
+ 'deepen',
+ 'deeply',
+ 'deepness',
+ 'deface',
+ 'defacing',
+ 'defame',
+ 'default',
+ 'defeat',
+ 'defection',
+ 'defective',
+ 'defendant',
+ 'defender',
+ 'defense',
+ 'defensive',
+ 'deferral',
+ 'deferred',
+ 'defiance',
+ 'defiant',
+ 'defile',
+ 'defiling',
+ 'define',
+ 'definite',
+ 'deflate',
+ 'deflation',
+ 'deflator',
+ 'deflected',
+ 'deflector',
+ 'defog',
+ 'deforest',
+ 'defraud',
+ 'defrost',
+ 'deftly',
+ 'defuse',
+ 'defy',
+ 'degraded',
+ 'degrading',
+ 'degrease',
+ 'degree',
+ 'dehydrate',
+ 'deity',
+ 'dejected',
+ 'delay',
+ 'delegate',
+ 'delegator',
+ 'delete',
+ 'deletion',
+ 'delicacy',
+ 'delicate',
+ 'delicious',
+ 'delighted',
+ 'delirious',
+ 'delirium',
+ 'deliverer',
+ 'delivery',
+ 'delouse',
+ 'delta',
+ 'deluge',
+ 'delusion',
+ 'deluxe',
+ 'demanding',
+ 'demeaning',
+ 'demeanor',
+ 'demise',
+ 'democracy',
+ 'democrat',
+ 'demote',
+ 'demotion',
+ 'demystify',
+ 'denatured',
+ 'deniable',
+ 'denial',
+ 'denim',
+ 'denote',
+ 'dense',
+ 'density',
+ 'dental',
+ 'dentist',
+ 'denture',
+ 'deny',
+ 'deodorant',
+ 'deodorize',
+ 'departed',
+ 'departure',
+ 'depict',
+ 'deplete',
+ 'depletion',
+ 'deplored',
+ 'deploy',
+ 'deport',
+ 'depose',
+ 'depraved',
+ 'depravity',
+ 'deprecate',
+ 'depress',
+ 'deprive',
+ 'depth',
+ 'deputize',
+ 'deputy',
+ 'derail',
+ 'deranged',
+ 'derby',
+ 'derived',
+ 'desecrate',
+ 'deserve',
+ 'deserving',
+ 'designate',
+ 'designed',
+ 'designer',
+ 'designing',
+ 'deskbound',
+ 'desktop',
+ 'deskwork',
+ 'desolate',
+ 'despair',
+ 'despise',
+ 'despite',
+ 'destiny',
+ 'destitute',
+ 'destruct',
+ 'detached',
+ 'detail',
+ 'detection',
+ 'detective',
+ 'detector',
+ 'detention',
+ 'detergent',
+ 'detest',
+ 'detonate',
+ 'detonator',
+ 'detoxify',
+ 'detract',
+ 'deuce',
+ 'devalue',
+ 'deviancy',
+ 'deviant',
+ 'deviate',
+ 'deviation',
+ 'deviator',
+ 'device',
+ 'devious',
+ 'devotedly',
+ 'devotee',
+ 'devotion',
+ 'devourer',
+ 'devouring',
+ 'devoutly',
+ 'dexterity',
+ 'dexterous',
+ 'diabetes',
+ 'diabetic',
+ 'diabolic',
+ 'diagnoses',
+ 'diagnosis',
+ 'diagram',
+ 'dial',
+ 'diameter',
+ 'diaper',
+ 'diaphragm',
+ 'diary',
+ 'dice',
+ 'dicing',
+ 'dictate',
+ 'dictation',
+ 'dictator',
+ 'difficult',
+ 'diffused',
+ 'diffuser',
+ 'diffusion',
+ 'diffusive',
+ 'dig',
+ 'dilation',
+ 'diligence',
+ 'diligent',
+ 'dill',
+ 'dilute',
+ 'dime',
+ 'diminish',
+ 'dimly',
+ 'dimmed',
+ 'dimmer',
+ 'dimness',
+ 'dimple',
+ 'diner',
+ 'dingbat',
+ 'dinghy',
+ 'dinginess',
+ 'dingo',
+ 'dingy',
+ 'dining',
+ 'dinner',
+ 'diocese',
+ 'dioxide',
+ 'diploma',
+ 'dipped',
+ 'dipper',
+ 'dipping',
+ 'directed',
+ 'direction',
+ 'directive',
+ 'directly',
+ 'directory',
+ 'direness',
+ 'dirtiness',
+ 'disabled',
+ 'disagree',
+ 'disallow',
+ 'disarm',
+ 'disarray',
+ 'disaster',
+ 'disband',
+ 'disbelief',
+ 'disburse',
+ 'discard',
+ 'discern',
+ 'discharge',
+ 'disclose',
+ 'discolor',
+ 'discount',
+ 'discourse',
+ 'discover',
+ 'discuss',
+ 'disdain',
+ 'disengage',
+ 'disfigure',
+ 'disgrace',
+ 'dish',
+ 'disinfect',
+ 'disjoin',
+ 'disk',
+ 'dislike',
+ 'disliking',
+ 'dislocate',
+ 'dislodge',
+ 'disloyal',
+ 'dismantle',
+ 'dismay',
+ 'dismiss',
+ 'dismount',
+ 'disobey',
+ 'disorder',
+ 'disown',
+ 'disparate',
+ 'disparity',
+ 'dispatch',
+ 'dispense',
+ 'dispersal',
+ 'dispersed',
+ 'disperser',
+ 'displace',
+ 'display',
+ 'displease',
+ 'disposal',
+ 'dispose',
+ 'disprove',
+ 'dispute',
+ 'disregard',
+ 'disrupt',
+ 'dissuade',
+ 'distance',
+ 'distant',
+ 'distaste',
+ 'distill',
+ 'distinct',
+ 'distort',
+ 'distract',
+ 'distress',
+ 'district',
+ 'distrust',
+ 'ditch',
+ 'ditto',
+ 'ditzy',
+ 'dividable',
+ 'divided',
+ 'dividend',
+ 'dividers',
+ 'dividing',
+ 'divinely',
+ 'diving',
+ 'divinity',
+ 'divisible',
+ 'divisibly',
+ 'division',
+ 'divisive',
+ 'divorcee',
+ 'dizziness',
+ 'dizzy',
+ 'doable',
+ 'docile',
+ 'dock',
+ 'doctrine',
+ 'document',
+ 'dodge',
+ 'dodgy',
+ 'doily',
+ 'doing',
+ 'dole',
+ 'dollar',
+ 'dollhouse',
+ 'dollop',
+ 'dolly',
+ 'dolphin',
+ 'domain',
+ 'domelike',
+ 'domestic',
+ 'dominion',
+ 'dominoes',
+ 'donated',
+ 'donation',
+ 'donator',
+ 'donor',
+ 'donut',
+ 'doodle',
+ 'doorbell',
+ 'doorframe',
+ 'doorknob',
+ 'doorman',
+ 'doormat',
+ 'doornail',
+ 'doorpost',
+ 'doorstep',
+ 'doorstop',
+ 'doorway',
+ 'doozy',
+ 'dork',
+ 'dormitory',
+ 'dorsal',
+ 'dosage',
+ 'dose',
+ 'dotted',
+ 'doubling',
+ 'douche',
+ 'dove',
+ 'down',
+ 'dowry',
+ 'doze',
+ 'drab',
+ 'dragging',
+ 'dragonfly',
+ 'dragonish',
+ 'dragster',
+ 'drainable',
+ 'drainage',
+ 'drained',
+ 'drainer',
+ 'drainpipe',
+ 'dramatic',
+ 'dramatize',
+ 'drank',
+ 'drapery',
+ 'drastic',
+ 'draw',
+ 'dreaded',
+ 'dreadful',
+ 'dreadlock',
+ 'dreamboat',
+ 'dreamily',
+ 'dreamland',
+ 'dreamless',
+ 'dreamlike',
+ 'dreamt',
+ 'dreamy',
+ 'drearily',
+ 'dreary',
+ 'drench',
+ 'dress',
+ 'drew',
+ 'dribble',
+ 'dried',
+ 'drier',
+ 'drift',
+ 'driller',
+ 'drilling',
+ 'drinkable',
+ 'drinking',
+ 'dripping',
+ 'drippy',
+ 'drivable',
+ 'driven',
+ 'driver',
+ 'driveway',
+ 'driving',
+ 'drizzle',
+ 'drizzly',
+ 'drone',
+ 'drool',
+ 'droop',
+ 'drop-down',
+ 'dropbox',
+ 'dropkick',
+ 'droplet',
+ 'dropout',
+ 'dropper',
+ 'drove',
+ 'drown',
+ 'drowsily',
+ 'drudge',
+ 'drum',
+ 'dry',
+ 'dubbed',
+ 'dubiously',
+ 'duchess',
+ 'duckbill',
+ 'ducking',
+ 'duckling',
+ 'ducktail',
+ 'ducky',
+ 'duct',
+ 'dude',
+ 'duffel',
+ 'dugout',
+ 'duh',
+ 'duke',
+ 'duller',
+ 'dullness',
+ 'duly',
+ 'dumping',
+ 'dumpling',
+ 'dumpster',
+ 'duo',
+ 'dupe',
+ 'duplex',
+ 'duplicate',
+ 'duplicity',
+ 'durable',
+ 'durably',
+ 'duration',
+ 'duress',
+ 'during',
+ 'dusk',
+ 'dust',
+ 'dutiful',
+ 'duty',
+ 'duvet',
+ 'dwarf',
+ 'dweeb',
+ 'dwelled',
+ 'dweller',
+ 'dwelling',
+ 'dwindle',
+ 'dwindling',
+ 'dynamic',
+ 'dynamite',
+ 'dynasty',
+ 'dyslexia',
+ 'dyslexic',
+ 'each',
+ 'eagle',
+ 'earache',
+ 'eardrum',
+ 'earflap',
+ 'earful',
+ 'earlobe',
+ 'early',
+ 'earmark',
+ 'earmuff',
+ 'earphone',
+ 'earpiece',
+ 'earplugs',
+ 'earring',
+ 'earshot',
+ 'earthen',
+ 'earthlike',
+ 'earthling',
+ 'earthly',
+ 'earthworm',
+ 'earthy',
+ 'earwig',
+ 'easeful',
+ 'easel',
+ 'easiest',
+ 'easily',
+ 'easiness',
+ 'easing',
+ 'eastbound',
+ 'eastcoast',
+ 'easter',
+ 'eastward',
+ 'eatable',
+ 'eaten',
+ 'eatery',
+ 'eating',
+ 'eats',
+ 'ebay',
+ 'ebony',
+ 'ebook',
+ 'ecard',
+ 'eccentric',
+ 'echo',
+ 'eclair',
+ 'eclipse',
+ 'ecologist',
+ 'ecology',
+ 'economic',
+ 'economist',
+ 'economy',
+ 'ecosphere',
+ 'ecosystem',
+ 'edge',
+ 'edginess',
+ 'edging',
+ 'edgy',
+ 'edition',
+ 'editor',
+ 'educated',
+ 'education',
+ 'educator',
+ 'eel',
+ 'effective',
+ 'effects',
+ 'efficient',
+ 'effort',
+ 'eggbeater',
+ 'egging',
+ 'eggnog',
+ 'eggplant',
+ 'eggshell',
+ 'egomaniac',
+ 'egotism',
+ 'egotistic',
+ 'either',
+ 'eject',
+ 'elaborate',
+ 'elastic',
+ 'elated',
+ 'elbow',
+ 'eldercare',
+ 'elderly',
+ 'eldest',
+ 'electable',
+ 'election',
+ 'elective',
+ 'elephant',
+ 'elevate',
+ 'elevating',
+ 'elevation',
+ 'elevator',
+ 'eleven',
+ 'elf',
+ 'eligible',
+ 'eligibly',
+ 'eliminate',
+ 'elite',
+ 'elitism',
+ 'elixir',
+ 'elk',
+ 'ellipse',
+ 'elliptic',
+ 'elm',
+ 'elongated',
+ 'elope',
+ 'eloquence',
+ 'eloquent',
+ 'elsewhere',
+ 'elude',
+ 'elusive',
+ 'elves',
+ 'email',
+ 'embargo',
+ 'embark',
+ 'embassy',
+ 'embattled',
+ 'embellish',
+ 'ember',
+ 'embezzle',
+ 'emblaze',
+ 'emblem',
+ 'embody',
+ 'embolism',
+ 'emboss',
+ 'embroider',
+ 'emcee',
+ 'emerald',
+ 'emergency',
+ 'emission',
+ 'emit',
+ 'emote',
+ 'emoticon',
+ 'emotion',
+ 'empathic',
+ 'empathy',
+ 'emperor',
+ 'emphases',
+ 'emphasis',
+ 'emphasize',
+ 'emphatic',
+ 'empirical',
+ 'employed',
+ 'employee',
+ 'employer',
+ 'emporium',
+ 'empower',
+ 'emptier',
+ 'emptiness',
+ 'empty',
+ 'emu',
+ 'enable',
+ 'enactment',
+ 'enamel',
+ 'enchanted',
+ 'enchilada',
+ 'encircle',
+ 'enclose',
+ 'enclosure',
+ 'encode',
+ 'encore',
+ 'encounter',
+ 'encourage',
+ 'encroach',
+ 'encrust',
+ 'encrypt',
+ 'endanger',
+ 'endeared',
+ 'endearing',
+ 'ended',
+ 'ending',
+ 'endless',
+ 'endnote',
+ 'endocrine',
+ 'endorphin',
+ 'endorse',
+ 'endowment',
+ 'endpoint',
+ 'endurable',
+ 'endurance',
+ 'enduring',
+ 'energetic',
+ 'energize',
+ 'energy',
+ 'enforced',
+ 'enforcer',
+ 'engaged',
+ 'engaging',
+ 'engine',
+ 'engorge',
+ 'engraved',
+ 'engraver',
+ 'engraving',
+ 'engross',
+ 'engulf',
+ 'enhance',
+ 'enigmatic',
+ 'enjoyable',
+ 'enjoyably',
+ 'enjoyer',
+ 'enjoying',
+ 'enjoyment',
+ 'enlarged',
+ 'enlarging',
+ 'enlighten',
+ 'enlisted',
+ 'enquirer',
+ 'enrage',
+ 'enrich',
+ 'enroll',
+ 'enslave',
+ 'ensnare',
+ 'ensure',
+ 'entail',
+ 'entangled',
+ 'entering',
+ 'entertain',
+ 'enticing',
+ 'entire',
+ 'entitle',
+ 'entity',
+ 'entomb',
+ 'entourage',
+ 'entrap',
+ 'entree',
+ 'entrench',
+ 'entrust',
+ 'entryway',
+ 'entwine',
+ 'enunciate',
+ 'envelope',
+ 'enviable',
+ 'enviably',
+ 'envious',
+ 'envision',
+ 'envoy',
+ 'envy',
+ 'enzyme',
+ 'epic',
+ 'epidemic',
+ 'epidermal',
+ 'epidermis',
+ 'epidural',
+ 'epilepsy',
+ 'epileptic',
+ 'epilogue',
+ 'epiphany',
+ 'episode',
+ 'equal',
+ 'equate',
+ 'equation',
+ 'equator',
+ 'equinox',
+ 'equipment',
+ 'equity',
+ 'equivocal',
+ 'eradicate',
+ 'erasable',
+ 'erased',
+ 'eraser',
+ 'erasure',
+ 'ergonomic',
+ 'errand',
+ 'errant',
+ 'erratic',
+ 'error',
+ 'erupt',
+ 'escalate',
+ 'escalator',
+ 'escapable',
+ 'escapade',
+ 'escapist',
+ 'escargot',
+ 'eskimo',
+ 'esophagus',
+ 'espionage',
+ 'espresso',
+ 'esquire',
+ 'essay',
+ 'essence',
+ 'essential',
+ 'establish',
+ 'estate',
+ 'esteemed',
+ 'estimate',
+ 'estimator',
+ 'estranged',
+ 'estrogen',
+ 'etching',
+ 'eternal',
+ 'eternity',
+ 'ethanol',
+ 'ether',
+ 'ethically',
+ 'ethics',
+ 'euphemism',
+ 'evacuate',
+ 'evacuee',
+ 'evade',
+ 'evaluate',
+ 'evaluator',
+ 'evaporate',
+ 'evasion',
+ 'evasive',
+ 'even',
+ 'everglade',
+ 'evergreen',
+ 'everybody',
+ 'everyday',
+ 'everyone',
+ 'evict',
+ 'evidence',
+ 'evident',
+ 'evil',
+ 'evoke',
+ 'evolution',
+ 'evolve',
+ 'exact',
+ 'exalted',
+ 'example',
+ 'excavate',
+ 'excavator',
+ 'exceeding',
+ 'exception',
+ 'excess',
+ 'exchange',
+ 'excitable',
+ 'exciting',
+ 'exclaim',
+ 'exclude',
+ 'excluding',
+ 'exclusion',
+ 'exclusive',
+ 'excretion',
+ 'excretory',
+ 'excursion',
+ 'excusable',
+ 'excusably',
+ 'excuse',
+ 'exemplary',
+ 'exemplify',
+ 'exemption',
+ 'exerciser',
+ 'exert',
+ 'exes',
+ 'exfoliate',
+ 'exhale',
+ 'exhaust',
+ 'exhume',
+ 'exile',
+ 'existing',
+ 'exit',
+ 'exodus',
+ 'exonerate',
+ 'exorcism',
+ 'exorcist',
+ 'expand',
+ 'expanse',
+ 'expansion',
+ 'expansive',
+ 'expectant',
+ 'expedited',
+ 'expediter',
+ 'expel',
+ 'expend',
+ 'expenses',
+ 'expensive',
+ 'expert',
+ 'expire',
+ 'expiring',
+ 'explain',
+ 'expletive',
+ 'explicit',
+ 'explode',
+ 'exploit',
+ 'explore',
+ 'exploring',
+ 'exponent',
+ 'exporter',
+ 'exposable',
+ 'expose',
+ 'exposure',
+ 'express',
+ 'expulsion',
+ 'exquisite',
+ 'extended',
+ 'extending',
+ 'extent',
+ 'extenuate',
+ 'exterior',
+ 'external',
+ 'extinct',
+ 'extortion',
+ 'extradite',
+ 'extras',
+ 'extrovert',
+ 'extrude',
+ 'extruding',
+ 'exuberant',
+ 'fable',
+ 'fabric',
+ 'fabulous',
+ 'facebook',
+ 'facecloth',
+ 'facedown',
+ 'faceless',
+ 'facelift',
+ 'faceplate',
+ 'faceted',
+ 'facial',
+ 'facility',
+ 'facing',
+ 'facsimile',
+ 'faction',
+ 'factoid',
+ 'factor',
+ 'factsheet',
+ 'factual',
+ 'faculty',
+ 'fade',
+ 'fading',
+ 'failing',
+ 'falcon',
+ 'fall',
+ 'false',
+ 'falsify',
+ 'fame',
+ 'familiar',
+ 'family',
+ 'famine',
+ 'famished',
+ 'fanatic',
+ 'fancied',
+ 'fanciness',
+ 'fancy',
+ 'fanfare',
+ 'fang',
+ 'fanning',
+ 'fantasize',
+ 'fantastic',
+ 'fantasy',
+ 'fascism',
+ 'fastball',
+ 'faster',
+ 'fasting',
+ 'fastness',
+ 'faucet',
+ 'favorable',
+ 'favorably',
+ 'favored',
+ 'favoring',
+ 'favorite',
+ 'fax',
+ 'feast',
+ 'federal',
+ 'fedora',
+ 'feeble',
+ 'feed',
+ 'feel',
+ 'feisty',
+ 'feline',
+ 'felt-tip',
+ 'feminine',
+ 'feminism',
+ 'feminist',
+ 'feminize',
+ 'femur',
+ 'fence',
+ 'fencing',
+ 'fender',
+ 'ferment',
+ 'fernlike',
+ 'ferocious',
+ 'ferocity',
+ 'ferret',
+ 'ferris',
+ 'ferry',
+ 'fervor',
+ 'fester',
+ 'festival',
+ 'festive',
+ 'festivity',
+ 'fetal',
+ 'fetch',
+ 'fever',
+ 'fiber',
+ 'fiction',
+ 'fiddle',
+ 'fiddling',
+ 'fidelity',
+ 'fidgeting',
+ 'fidgety',
+ 'fifteen',
+ 'fifth',
+ 'fiftieth',
+ 'fifty',
+ 'figment',
+ 'figure',
+ 'figurine',
+ 'filing',
+ 'filled',
+ 'filler',
+ 'filling',
+ 'film',
+ 'filter',
+ 'filth',
+ 'filtrate',
+ 'finale',
+ 'finalist',
+ 'finalize',
+ 'finally',
+ 'finance',
+ 'financial',
+ 'finch',
+ 'fineness',
+ 'finer',
+ 'finicky',
+ 'finished',
+ 'finisher',
+ 'finishing',
+ 'finite',
+ 'finless',
+ 'finlike',
+ 'fiscally',
+ 'fit',
+ 'five',
+ 'flaccid',
+ 'flagman',
+ 'flagpole',
+ 'flagship',
+ 'flagstick',
+ 'flagstone',
+ 'flail',
+ 'flakily',
+ 'flaky',
+ 'flame',
+ 'flammable',
+ 'flanked',
+ 'flanking',
+ 'flannels',
+ 'flap',
+ 'flaring',
+ 'flashback',
+ 'flashbulb',
+ 'flashcard',
+ 'flashily',
+ 'flashing',
+ 'flashy',
+ 'flask',
+ 'flatbed',
+ 'flatfoot',
+ 'flatly',
+ 'flatness',
+ 'flatten',
+ 'flattered',
+ 'flatterer',
+ 'flattery',
+ 'flattop',
+ 'flatware',
+ 'flatworm',
+ 'flavored',
+ 'flavorful',
+ 'flavoring',
+ 'flaxseed',
+ 'fled',
+ 'fleshed',
+ 'fleshy',
+ 'flick',
+ 'flier',
+ 'flight',
+ 'flinch',
+ 'fling',
+ 'flint',
+ 'flip',
+ 'flirt',
+ 'float',
+ 'flock',
+ 'flogging',
+ 'flop',
+ 'floral',
+ 'florist',
+ 'floss',
+ 'flounder',
+ 'flyable',
+ 'flyaway',
+ 'flyer',
+ 'flying',
+ 'flyover',
+ 'flypaper',
+ 'foam',
+ 'foe',
+ 'fog',
+ 'foil',
+ 'folic',
+ 'folk',
+ 'follicle',
+ 'follow',
+ 'fondling',
+ 'fondly',
+ 'fondness',
+ 'fondue',
+ 'font',
+ 'food',
+ 'fool',
+ 'footage',
+ 'football',
+ 'footbath',
+ 'footboard',
+ 'footer',
+ 'footgear',
+ 'foothill',
+ 'foothold',
+ 'footing',
+ 'footless',
+ 'footman',
+ 'footnote',
+ 'footpad',
+ 'footpath',
+ 'footprint',
+ 'footrest',
+ 'footsie',
+ 'footsore',
+ 'footwear',
+ 'footwork',
+ 'fossil',
+ 'foster',
+ 'founder',
+ 'founding',
+ 'fountain',
+ 'fox',
+ 'foyer',
+ 'fraction',
+ 'fracture',
+ 'fragile',
+ 'fragility',
+ 'fragment',
+ 'fragrance',
+ 'fragrant',
+ 'frail',
+ 'frame',
+ 'framing',
+ 'frantic',
+ 'fraternal',
+ 'frayed',
+ 'fraying',
+ 'frays',
+ 'freckled',
+ 'freckles',
+ 'freebase',
+ 'freebee',
+ 'freebie',
+ 'freedom',
+ 'freefall',
+ 'freehand',
+ 'freeing',
+ 'freeload',
+ 'freely',
+ 'freemason',
+ 'freeness',
+ 'freestyle',
+ 'freeware',
+ 'freeway',
+ 'freewill',
+ 'freezable',
+ 'freezing',
+ 'freight',
+ 'french',
+ 'frenzied',
+ 'frenzy',
+ 'frequency',
+ 'frequent',
+ 'fresh',
+ 'fretful',
+ 'fretted',
+ 'friction',
+ 'friday',
+ 'fridge',
+ 'fried',
+ 'friend',
+ 'frighten',
+ 'frightful',
+ 'frigidity',
+ 'frigidly',
+ 'frill',
+ 'fringe',
+ 'frisbee',
+ 'frisk',
+ 'fritter',
+ 'frivolous',
+ 'frolic',
+ 'from',
+ 'front',
+ 'frostbite',
+ 'frosted',
+ 'frostily',
+ 'frosting',
+ 'frostlike',
+ 'frosty',
+ 'froth',
+ 'frown',
+ 'frozen',
+ 'fructose',
+ 'frugality',
+ 'frugally',
+ 'fruit',
+ 'frustrate',
+ 'frying',
+ 'gab',
+ 'gaffe',
+ 'gag',
+ 'gainfully',
+ 'gaining',
+ 'gains',
+ 'gala',
+ 'gallantly',
+ 'galleria',
+ 'gallery',
+ 'galley',
+ 'gallon',
+ 'gallows',
+ 'gallstone',
+ 'galore',
+ 'galvanize',
+ 'gambling',
+ 'game',
+ 'gaming',
+ 'gamma',
+ 'gander',
+ 'gangly',
+ 'gangrene',
+ 'gangway',
+ 'gap',
+ 'garage',
+ 'garbage',
+ 'garden',
+ 'gargle',
+ 'garland',
+ 'garlic',
+ 'garment',
+ 'garnet',
+ 'garnish',
+ 'garter',
+ 'gas',
+ 'gatherer',
+ 'gathering',
+ 'gating',
+ 'gauging',
+ 'gauntlet',
+ 'gauze',
+ 'gave',
+ 'gawk',
+ 'gazing',
+ 'gear',
+ 'gecko',
+ 'geek',
+ 'geiger',
+ 'gem',
+ 'gender',
+ 'generic',
+ 'generous',
+ 'genetics',
+ 'genre',
+ 'gentile',
+ 'gentleman',
+ 'gently',
+ 'gents',
+ 'geography',
+ 'geologic',
+ 'geologist',
+ 'geology',
+ 'geometric',
+ 'geometry',
+ 'geranium',
+ 'gerbil',
+ 'geriatric',
+ 'germicide',
+ 'germinate',
+ 'germless',
+ 'germproof',
+ 'gestate',
+ 'gestation',
+ 'gesture',
+ 'getaway',
+ 'getting',
+ 'getup',
+ 'giant',
+ 'gibberish',
+ 'giblet',
+ 'giddily',
+ 'giddiness',
+ 'giddy',
+ 'gift',
+ 'gigabyte',
+ 'gigahertz',
+ 'gigantic',
+ 'giggle',
+ 'giggling',
+ 'giggly',
+ 'gigolo',
+ 'gilled',
+ 'gills',
+ 'gimmick',
+ 'girdle',
+ 'giveaway',
+ 'given',
+ 'giver',
+ 'giving',
+ 'gizmo',
+ 'gizzard',
+ 'glacial',
+ 'glacier',
+ 'glade',
+ 'gladiator',
+ 'gladly',
+ 'glamorous',
+ 'glamour',
+ 'glance',
+ 'glancing',
+ 'glandular',
+ 'glare',
+ 'glaring',
+ 'glass',
+ 'glaucoma',
+ 'glazing',
+ 'gleaming',
+ 'gleeful',
+ 'glider',
+ 'gliding',
+ 'glimmer',
+ 'glimpse',
+ 'glisten',
+ 'glitch',
+ 'glitter',
+ 'glitzy',
+ 'gloater',
+ 'gloating',
+ 'gloomily',
+ 'gloomy',
+ 'glorified',
+ 'glorifier',
+ 'glorify',
+ 'glorious',
+ 'glory',
+ 'gloss',
+ 'glove',
+ 'glowing',
+ 'glowworm',
+ 'glucose',
+ 'glue',
+ 'gluten',
+ 'glutinous',
+ 'glutton',
+ 'gnarly',
+ 'gnat',
+ 'goal',
+ 'goatskin',
+ 'goes',
+ 'goggles',
+ 'going',
+ 'goldfish',
+ 'goldmine',
+ 'goldsmith',
+ 'golf',
+ 'goliath',
+ 'gonad',
+ 'gondola',
+ 'gone',
+ 'gong',
+ 'good',
+ 'gooey',
+ 'goofball',
+ 'goofiness',
+ 'goofy',
+ 'google',
+ 'goon',
+ 'gopher',
+ 'gore',
+ 'gorged',
+ 'gorgeous',
+ 'gory',
+ 'gosling',
+ 'gossip',
+ 'gothic',
+ 'gotten',
+ 'gout',
+ 'gown',
+ 'grab',
+ 'graceful',
+ 'graceless',
+ 'gracious',
+ 'gradation',
+ 'graded',
+ 'grader',
+ 'gradient',
+ 'grading',
+ 'gradually',
+ 'graduate',
+ 'graffiti',
+ 'grafted',
+ 'grafting',
+ 'grain',
+ 'granddad',
+ 'grandkid',
+ 'grandly',
+ 'grandma',
+ 'grandpa',
+ 'grandson',
+ 'granite',
+ 'granny',
+ 'granola',
+ 'grant',
+ 'granular',
+ 'grape',
+ 'graph',
+ 'grapple',
+ 'grappling',
+ 'grasp',
+ 'grass',
+ 'gratified',
+ 'gratify',
+ 'grating',
+ 'gratitude',
+ 'gratuity',
+ 'gravel',
+ 'graveness',
+ 'graves',
+ 'graveyard',
+ 'gravitate',
+ 'gravity',
+ 'gravy',
+ 'gray',
+ 'grazing',
+ 'greasily',
+ 'greedily',
+ 'greedless',
+ 'greedy',
+ 'green',
+ 'greeter',
+ 'greeting',
+ 'grew',
+ 'greyhound',
+ 'grid',
+ 'grief',
+ 'grievance',
+ 'grieving',
+ 'grievous',
+ 'grill',
+ 'grimace',
+ 'grimacing',
+ 'grime',
+ 'griminess',
+ 'grimy',
+ 'grinch',
+ 'grinning',
+ 'grip',
+ 'gristle',
+ 'grit',
+ 'groggily',
+ 'groggy',
+ 'groin',
+ 'groom',
+ 'groove',
+ 'grooving',
+ 'groovy',
+ 'grope',
+ 'ground',
+ 'grouped',
+ 'grout',
+ 'grove',
+ 'grower',
+ 'growing',
+ 'growl',
+ 'grub',
+ 'grudge',
+ 'grudging',
+ 'grueling',
+ 'gruffly',
+ 'grumble',
+ 'grumbling',
+ 'grumbly',
+ 'grumpily',
+ 'grunge',
+ 'grunt',
+ 'guacamole',
+ 'guidable',
+ 'guidance',
+ 'guide',
+ 'guiding',
+ 'guileless',
+ 'guise',
+ 'gulf',
+ 'gullible',
+ 'gully',
+ 'gulp',
+ 'gumball',
+ 'gumdrop',
+ 'gumminess',
+ 'gumming',
+ 'gummy',
+ 'gurgle',
+ 'gurgling',
+ 'guru',
+ 'gush',
+ 'gusto',
+ 'gusty',
+ 'gutless',
+ 'guts',
+ 'gutter',
+ 'guy',
+ 'guzzler',
+ 'gyration',
+ 'habitable',
+ 'habitant',
+ 'habitat',
+ 'habitual',
+ 'hacked',
+ 'hacker',
+ 'hacking',
+ 'hacksaw',
+ 'had',
+ 'haggler',
+ 'haiku',
+ 'half',
+ 'halogen',
+ 'halt',
+ 'halved',
+ 'halves',
+ 'hamburger',
+ 'hamlet',
+ 'hammock',
+ 'hamper',
+ 'hamster',
+ 'hamstring',
+ 'handbag',
+ 'handball',
+ 'handbook',
+ 'handbrake',
+ 'handcart',
+ 'handclap',
+ 'handclasp',
+ 'handcraft',
+ 'handcuff',
+ 'handed',
+ 'handful',
+ 'handgrip',
+ 'handgun',
+ 'handheld',
+ 'handiness',
+ 'handiwork',
+ 'handlebar',
+ 'handled',
+ 'handler',
+ 'handling',
+ 'handmade',
+ 'handoff',
+ 'handpick',
+ 'handprint',
+ 'handrail',
+ 'handsaw',
+ 'handset',
+ 'handsfree',
+ 'handshake',
+ 'handstand',
+ 'handwash',
+ 'handwork',
+ 'handwoven',
+ 'handwrite',
+ 'handyman',
+ 'hangnail',
+ 'hangout',
+ 'hangover',
+ 'hangup',
+ 'hankering',
+ 'hankie',
+ 'hanky',
+ 'haphazard',
+ 'happening',
+ 'happier',
+ 'happiest',
+ 'happily',
+ 'happiness',
+ 'happy',
+ 'harbor',
+ 'hardcopy',
+ 'hardcore',
+ 'hardcover',
+ 'harddisk',
+ 'hardened',
+ 'hardener',
+ 'hardening',
+ 'hardhat',
+ 'hardhead',
+ 'hardiness',
+ 'hardly',
+ 'hardness',
+ 'hardship',
+ 'hardware',
+ 'hardwired',
+ 'hardwood',
+ 'hardy',
+ 'harmful',
+ 'harmless',
+ 'harmonica',
+ 'harmonics',
+ 'harmonize',
+ 'harmony',
+ 'harness',
+ 'harpist',
+ 'harsh',
+ 'harvest',
+ 'hash',
+ 'hassle',
+ 'haste',
+ 'hastily',
+ 'hastiness',
+ 'hasty',
+ 'hatbox',
+ 'hatchback',
+ 'hatchery',
+ 'hatchet',
+ 'hatching',
+ 'hatchling',
+ 'hate',
+ 'hatless',
+ 'hatred',
+ 'haunt',
+ 'haven',
+ 'hazard',
+ 'hazelnut',
+ 'hazily',
+ 'haziness',
+ 'hazing',
+ 'hazy',
+ 'headache',
+ 'headband',
+ 'headboard',
+ 'headcount',
+ 'headdress',
+ 'headed',
+ 'header',
+ 'headfirst',
+ 'headgear',
+ 'heading',
+ 'headlamp',
+ 'headless',
+ 'headlock',
+ 'headphone',
+ 'headpiece',
+ 'headrest',
+ 'headroom',
+ 'headscarf',
+ 'headset',
+ 'headsman',
+ 'headstand',
+ 'headstone',
+ 'headway',
+ 'headwear',
+ 'heap',
+ 'heat',
+ 'heave',
+ 'heavily',
+ 'heaviness',
+ 'heaving',
+ 'hedge',
+ 'hedging',
+ 'heftiness',
+ 'hefty',
+ 'helium',
+ 'helmet',
+ 'helper',
+ 'helpful',
+ 'helping',
+ 'helpless',
+ 'helpline',
+ 'hemlock',
+ 'hemstitch',
+ 'hence',
+ 'henchman',
+ 'henna',
+ 'herald',
+ 'herbal',
+ 'herbicide',
+ 'herbs',
+ 'heritage',
+ 'hermit',
+ 'heroics',
+ 'heroism',
+ 'herring',
+ 'herself',
+ 'hertz',
+ 'hesitancy',
+ 'hesitant',
+ 'hesitate',
+ 'hexagon',
+ 'hexagram',
+ 'hubcap',
+ 'huddle',
+ 'huddling',
+ 'huff',
+ 'hug',
+ 'hula',
+ 'hulk',
+ 'hull',
+ 'human',
+ 'humble',
+ 'humbling',
+ 'humbly',
+ 'humid',
+ 'humiliate',
+ 'humility',
+ 'humming',
+ 'hummus',
+ 'humongous',
+ 'humorist',
+ 'humorless',
+ 'humorous',
+ 'humpback',
+ 'humped',
+ 'humvee',
+ 'hunchback',
+ 'hundredth',
+ 'hunger',
+ 'hungrily',
+ 'hungry',
+ 'hunk',
+ 'hunter',
+ 'hunting',
+ 'huntress',
+ 'huntsman',
+ 'hurdle',
+ 'hurled',
+ 'hurler',
+ 'hurling',
+ 'hurray',
+ 'hurricane',
+ 'hurried',
+ 'hurry',
+ 'hurt',
+ 'husband',
+ 'hush',
+ 'husked',
+ 'huskiness',
+ 'hut',
+ 'hybrid',
+ 'hydrant',
+ 'hydrated',
+ 'hydration',
+ 'hydrogen',
+ 'hydroxide',
+ 'hyperlink',
+ 'hypertext',
+ 'hyphen',
+ 'hypnoses',
+ 'hypnosis',
+ 'hypnotic',
+ 'hypnotism',
+ 'hypnotist',
+ 'hypnotize',
+ 'hypocrisy',
+ 'hypocrite',
+ 'ibuprofen',
+ 'ice',
+ 'iciness',
+ 'icing',
+ 'icky',
+ 'icon',
+ 'icy',
+ 'idealism',
+ 'idealist',
+ 'idealize',
+ 'ideally',
+ 'idealness',
+ 'identical',
+ 'identify',
+ 'identity',
+ 'ideology',
+ 'idiocy',
+ 'idiom',
+ 'idly',
+ 'igloo',
+ 'ignition',
+ 'ignore',
+ 'iguana',
+ 'illicitly',
+ 'illusion',
+ 'illusive',
+ 'image',
+ 'imaginary',
+ 'imagines',
+ 'imaging',
+ 'imbecile',
+ 'imitate',
+ 'imitation',
+ 'immature',
+ 'immerse',
+ 'immersion',
+ 'imminent',
+ 'immobile',
+ 'immodest',
+ 'immorally',
+ 'immortal',
+ 'immovable',
+ 'immovably',
+ 'immunity',
+ 'immunize',
+ 'impaired',
+ 'impale',
+ 'impart',
+ 'impatient',
+ 'impeach',
+ 'impeding',
+ 'impending',
+ 'imperfect',
+ 'imperial',
+ 'impish',
+ 'implant',
+ 'implement',
+ 'implicate',
+ 'implicit',
+ 'implode',
+ 'implosion',
+ 'implosive',
+ 'imply',
+ 'impolite',
+ 'important',
+ 'importer',
+ 'impose',
+ 'imposing',
+ 'impotence',
+ 'impotency',
+ 'impotent',
+ 'impound',
+ 'imprecise',
+ 'imprint',
+ 'imprison',
+ 'impromptu',
+ 'improper',
+ 'improve',
+ 'improving',
+ 'improvise',
+ 'imprudent',
+ 'impulse',
+ 'impulsive',
+ 'impure',
+ 'impurity',
+ 'iodine',
+ 'iodize',
+ 'ion',
+ 'ipad',
+ 'iphone',
+ 'ipod',
+ 'irate',
+ 'irk',
+ 'iron',
+ 'irregular',
+ 'irrigate',
+ 'irritable',
+ 'irritably',
+ 'irritant',
+ 'irritate',
+ 'islamic',
+ 'islamist',
+ 'isolated',
+ 'isolating',
+ 'isolation',
+ 'isotope',
+ 'issue',
+ 'issuing',
+ 'italicize',
+ 'italics',
+ 'item',
+ 'itinerary',
+ 'itunes',
+ 'ivory',
+ 'ivy',
+ 'jab',
+ 'jackal',
+ 'jacket',
+ 'jackknife',
+ 'jackpot',
+ 'jailbird',
+ 'jailbreak',
+ 'jailer',
+ 'jailhouse',
+ 'jalapeno',
+ 'jam',
+ 'janitor',
+ 'january',
+ 'jargon',
+ 'jarring',
+ 'jasmine',
+ 'jaundice',
+ 'jaunt',
+ 'java',
+ 'jawed',
+ 'jawless',
+ 'jawline',
+ 'jaws',
+ 'jaybird',
+ 'jaywalker',
+ 'jazz',
+ 'jeep',
+ 'jeeringly',
+ 'jellied',
+ 'jelly',
+ 'jersey',
+ 'jester',
+ 'jet',
+ 'jiffy',
+ 'jigsaw',
+ 'jimmy',
+ 'jingle',
+ 'jingling',
+ 'jinx',
+ 'jitters',
+ 'jittery',
+ 'job',
+ 'jockey',
+ 'jockstrap',
+ 'jogger',
+ 'jogging',
+ 'john',
+ 'joining',
+ 'jokester',
+ 'jokingly',
+ 'jolliness',
+ 'jolly',
+ 'jolt',
+ 'jot',
+ 'jovial',
+ 'joyfully',
+ 'joylessly',
+ 'joyous',
+ 'joyride',
+ 'joystick',
+ 'jubilance',
+ 'jubilant',
+ 'judge',
+ 'judgingly',
+ 'judicial',
+ 'judiciary',
+ 'judo',
+ 'juggle',
+ 'juggling',
+ 'jugular',
+ 'juice',
+ 'juiciness',
+ 'juicy',
+ 'jujitsu',
+ 'jukebox',
+ 'july',
+ 'jumble',
+ 'jumbo',
+ 'jump',
+ 'junction',
+ 'juncture',
+ 'june',
+ 'junior',
+ 'juniper',
+ 'junkie',
+ 'junkman',
+ 'junkyard',
+ 'jurist',
+ 'juror',
+ 'jury',
+ 'justice',
+ 'justifier',
+ 'justify',
+ 'justly',
+ 'justness',
+ 'juvenile',
+ 'kabob',
+ 'kangaroo',
+ 'karaoke',
+ 'karate',
+ 'karma',
+ 'kebab',
+ 'keenly',
+ 'keenness',
+ 'keep',
+ 'keg',
+ 'kelp',
+ 'kennel',
+ 'kept',
+ 'kerchief',
+ 'kerosene',
+ 'kettle',
+ 'kick',
+ 'kiln',
+ 'kilobyte',
+ 'kilogram',
+ 'kilometer',
+ 'kilowatt',
+ 'kilt',
+ 'kimono',
+ 'kindle',
+ 'kindling',
+ 'kindly',
+ 'kindness',
+ 'kindred',
+ 'kinetic',
+ 'kinfolk',
+ 'king',
+ 'kinship',
+ 'kinsman',
+ 'kinswoman',
+ 'kissable',
+ 'kisser',
+ 'kissing',
+ 'kitchen',
+ 'kite',
+ 'kitten',
+ 'kitty',
+ 'kiwi',
+ 'kleenex',
+ 'knapsack',
+ 'knee',
+ 'knelt',
+ 'knickers',
+ 'knoll',
+ 'koala',
+ 'kooky',
+ 'kosher',
+ 'krypton',
+ 'kudos',
+ 'kung',
+ 'labored',
+ 'laborer',
+ 'laboring',
+ 'laborious',
+ 'labrador',
+ 'ladder',
+ 'ladies',
+ 'ladle',
+ 'ladybug',
+ 'ladylike',
+ 'lagged',
+ 'lagging',
+ 'lagoon',
+ 'lair',
+ 'lake',
+ 'lance',
+ 'landed',
+ 'landfall',
+ 'landfill',
+ 'landing',
+ 'landlady',
+ 'landless',
+ 'landline',
+ 'landlord',
+ 'landmark',
+ 'landmass',
+ 'landmine',
+ 'landowner',
+ 'landscape',
+ 'landside',
+ 'landslide',
+ 'language',
+ 'lankiness',
+ 'lanky',
+ 'lantern',
+ 'lapdog',
+ 'lapel',
+ 'lapped',
+ 'lapping',
+ 'laptop',
+ 'lard',
+ 'large',
+ 'lark',
+ 'lash',
+ 'lasso',
+ 'last',
+ 'latch',
+ 'late',
+ 'lather',
+ 'latitude',
+ 'latrine',
+ 'latter',
+ 'latticed',
+ 'launch',
+ 'launder',
+ 'laundry',
+ 'laurel',
+ 'lavender',
+ 'lavish',
+ 'laxative',
+ 'lazily',
+ 'laziness',
+ 'lazy',
+ 'lecturer',
+ 'left',
+ 'legacy',
+ 'legal',
+ 'legend',
+ 'legged',
+ 'leggings',
+ 'legible',
+ 'legibly',
+ 'legislate',
+ 'lego',
+ 'legroom',
+ 'legume',
+ 'legwarmer',
+ 'legwork',
+ 'lemon',
+ 'lend',
+ 'length',
+ 'lens',
+ 'lent',
+ 'leotard',
+ 'lesser',
+ 'letdown',
+ 'lethargic',
+ 'lethargy',
+ 'letter',
+ 'lettuce',
+ 'level',
+ 'leverage',
+ 'levers',
+ 'levitate',
+ 'levitator',
+ 'liability',
+ 'liable',
+ 'liberty',
+ 'librarian',
+ 'library',
+ 'licking',
+ 'licorice',
+ 'lid',
+ 'life',
+ 'lifter',
+ 'lifting',
+ 'liftoff',
+ 'ligament',
+ 'likely',
+ 'likeness',
+ 'likewise',
+ 'liking',
+ 'lilac',
+ 'lilly',
+ 'lily',
+ 'limb',
+ 'limeade',
+ 'limelight',
+ 'limes',
+ 'limit',
+ 'limping',
+ 'limpness',
+ 'line',
+ 'lingo',
+ 'linguini',
+ 'linguist',
+ 'lining',
+ 'linked',
+ 'linoleum',
+ 'linseed',
+ 'lint',
+ 'lion',
+ 'lip',
+ 'liquefy',
+ 'liqueur',
+ 'liquid',
+ 'lisp',
+ 'list',
+ 'litigate',
+ 'litigator',
+ 'litmus',
+ 'litter',
+ 'little',
+ 'livable',
+ 'lived',
+ 'lively',
+ 'liver',
+ 'livestock',
+ 'lividly',
+ 'living',
+ 'lizard',
+ 'lubricant',
+ 'lubricate',
+ 'lucid',
+ 'luckily',
+ 'luckiness',
+ 'luckless',
+ 'lucrative',
+ 'ludicrous',
+ 'lugged',
+ 'lukewarm',
+ 'lullaby',
+ 'lumber',
+ 'luminance',
+ 'luminous',
+ 'lumpiness',
+ 'lumping',
+ 'lumpish',
+ 'lunacy',
+ 'lunar',
+ 'lunchbox',
+ 'luncheon',
+ 'lunchroom',
+ 'lunchtime',
+ 'lung',
+ 'lurch',
+ 'lure',
+ 'luridness',
+ 'lurk',
+ 'lushly',
+ 'lushness',
+ 'luster',
+ 'lustfully',
+ 'lustily',
+ 'lustiness',
+ 'lustrous',
+ 'lusty',
+ 'luxurious',
+ 'luxury',
+ 'lying',
+ 'lyrically',
+ 'lyricism',
+ 'lyricist',
+ 'lyrics',
+ 'macarena',
+ 'macaroni',
+ 'macaw',
+ 'mace',
+ 'machine',
+ 'machinist',
+ 'magazine',
+ 'magenta',
+ 'maggot',
+ 'magical',
+ 'magician',
+ 'magma',
+ 'magnesium',
+ 'magnetic',
+ 'magnetism',
+ 'magnetize',
+ 'magnifier',
+ 'magnify',
+ 'magnitude',
+ 'magnolia',
+ 'mahogany',
+ 'maimed',
+ 'majestic',
+ 'majesty',
+ 'majorette',
+ 'majority',
+ 'makeover',
+ 'maker',
+ 'makeshift',
+ 'making',
+ 'malformed',
+ 'malt',
+ 'mama',
+ 'mammal',
+ 'mammary',
+ 'mammogram',
+ 'manager',
+ 'managing',
+ 'manatee',
+ 'mandarin',
+ 'mandate',
+ 'mandatory',
+ 'mandolin',
+ 'manger',
+ 'mangle',
+ 'mango',
+ 'mangy',
+ 'manhandle',
+ 'manhole',
+ 'manhood',
+ 'manhunt',
+ 'manicotti',
+ 'manicure',
+ 'manifesto',
+ 'manila',
+ 'mankind',
+ 'manlike',
+ 'manliness',
+ 'manly',
+ 'manmade',
+ 'manned',
+ 'mannish',
+ 'manor',
+ 'manpower',
+ 'mantis',
+ 'mantra',
+ 'manual',
+ 'many',
+ 'map',
+ 'marathon',
+ 'marauding',
+ 'marbled',
+ 'marbles',
+ 'marbling',
+ 'march',
+ 'mardi',
+ 'margarine',
+ 'margarita',
+ 'margin',
+ 'marigold',
+ 'marina',
+ 'marine',
+ 'marital',
+ 'maritime',
+ 'marlin',
+ 'marmalade',
+ 'maroon',
+ 'married',
+ 'marrow',
+ 'marry',
+ 'marshland',
+ 'marshy',
+ 'marsupial',
+ 'marvelous',
+ 'marxism',
+ 'mascot',
+ 'masculine',
+ 'mashed',
+ 'mashing',
+ 'massager',
+ 'masses',
+ 'massive',
+ 'mastiff',
+ 'matador',
+ 'matchbook',
+ 'matchbox',
+ 'matcher',
+ 'matching',
+ 'matchless',
+ 'material',
+ 'maternal',
+ 'maternity',
+ 'math',
+ 'mating',
+ 'matriarch',
+ 'matrimony',
+ 'matrix',
+ 'matron',
+ 'matted',
+ 'matter',
+ 'maturely',
+ 'maturing',
+ 'maturity',
+ 'mauve',
+ 'maverick',
+ 'maximize',
+ 'maximum',
+ 'maybe',
+ 'mayday',
+ 'mayflower',
+ 'moaner',
+ 'moaning',
+ 'mobile',
+ 'mobility',
+ 'mobilize',
+ 'mobster',
+ 'mocha',
+ 'mocker',
+ 'mockup',
+ 'modified',
+ 'modify',
+ 'modular',
+ 'modulator',
+ 'module',
+ 'moisten',
+ 'moistness',
+ 'moisture',
+ 'molar',
+ 'molasses',
+ 'mold',
+ 'molecular',
+ 'molecule',
+ 'molehill',
+ 'mollusk',
+ 'mom',
+ 'monastery',
+ 'monday',
+ 'monetary',
+ 'monetize',
+ 'moneybags',
+ 'moneyless',
+ 'moneywise',
+ 'mongoose',
+ 'mongrel',
+ 'monitor',
+ 'monkhood',
+ 'monogamy',
+ 'monogram',
+ 'monologue',
+ 'monopoly',
+ 'monorail',
+ 'monotone',
+ 'monotype',
+ 'monoxide',
+ 'monsieur',
+ 'monsoon',
+ 'monstrous',
+ 'monthly',
+ 'monument',
+ 'moocher',
+ 'moodiness',
+ 'moody',
+ 'mooing',
+ 'moonbeam',
+ 'mooned',
+ 'moonlight',
+ 'moonlike',
+ 'moonlit',
+ 'moonrise',
+ 'moonscape',
+ 'moonshine',
+ 'moonstone',
+ 'moonwalk',
+ 'mop',
+ 'morale',
+ 'morality',
+ 'morally',
+ 'morbidity',
+ 'morbidly',
+ 'morphine',
+ 'morphing',
+ 'morse',
+ 'mortality',
+ 'mortally',
+ 'mortician',
+ 'mortified',
+ 'mortify',
+ 'mortuary',
+ 'mosaic',
+ 'mossy',
+ 'most',
+ 'mothball',
+ 'mothproof',
+ 'motion',
+ 'motivate',
+ 'motivator',
+ 'motive',
+ 'motocross',
+ 'motor',
+ 'motto',
+ 'mountable',
+ 'mountain',
+ 'mounted',
+ 'mounting',
+ 'mourner',
+ 'mournful',
+ 'mouse',
+ 'mousiness',
+ 'moustache',
+ 'mousy',
+ 'mouth',
+ 'movable',
+ 'move',
+ 'movie',
+ 'moving',
+ 'mower',
+ 'mowing',
+ 'much',
+ 'muck',
+ 'mud',
+ 'mug',
+ 'mulberry',
+ 'mulch',
+ 'mule',
+ 'mulled',
+ 'mullets',
+ 'multiple',
+ 'multiply',
+ 'multitask',
+ 'multitude',
+ 'mumble',
+ 'mumbling',
+ 'mumbo',
+ 'mummified',
+ 'mummify',
+ 'mummy',
+ 'mumps',
+ 'munchkin',
+ 'mundane',
+ 'municipal',
+ 'muppet',
+ 'mural',
+ 'murkiness',
+ 'murky',
+ 'murmuring',
+ 'muscular',
+ 'museum',
+ 'mushily',
+ 'mushiness',
+ 'mushroom',
+ 'mushy',
+ 'music',
+ 'musket',
+ 'muskiness',
+ 'musky',
+ 'mustang',
+ 'mustard',
+ 'muster',
+ 'mustiness',
+ 'musty',
+ 'mutable',
+ 'mutate',
+ 'mutation',
+ 'mute',
+ 'mutilated',
+ 'mutilator',
+ 'mutiny',
+ 'mutt',
+ 'mutual',
+ 'muzzle',
+ 'myself',
+ 'myspace',
+ 'mystified',
+ 'mystify',
+ 'myth',
+ 'nacho',
+ 'nag',
+ 'nail',
+ 'name',
+ 'naming',
+ 'nanny',
+ 'nanometer',
+ 'nape',
+ 'napkin',
+ 'napped',
+ 'napping',
+ 'nappy',
+ 'narrow',
+ 'nastily',
+ 'nastiness',
+ 'national',
+ 'native',
+ 'nativity',
+ 'natural',
+ 'nature',
+ 'naturist',
+ 'nautical',
+ 'navigate',
+ 'navigator',
+ 'navy',
+ 'nearby',
+ 'nearest',
+ 'nearly',
+ 'nearness',
+ 'neatly',
+ 'neatness',
+ 'nebula',
+ 'nebulizer',
+ 'nectar',
+ 'negate',
+ 'negation',
+ 'negative',
+ 'neglector',
+ 'negligee',
+ 'negligent',
+ 'negotiate',
+ 'nemeses',
+ 'nemesis',
+ 'neon',
+ 'nephew',
+ 'nerd',
+ 'nervous',
+ 'nervy',
+ 'nest',
+ 'net',
+ 'neurology',
+ 'neuron',
+ 'neurosis',
+ 'neurotic',
+ 'neuter',
+ 'neutron',
+ 'never',
+ 'next',
+ 'nibble',
+ 'nickname',
+ 'nicotine',
+ 'niece',
+ 'nifty',
+ 'nimble',
+ 'nimbly',
+ 'nineteen',
+ 'ninetieth',
+ 'ninja',
+ 'nintendo',
+ 'ninth',
+ 'nuclear',
+ 'nuclei',
+ 'nucleus',
+ 'nugget',
+ 'nullify',
+ 'number',
+ 'numbing',
+ 'numbly',
+ 'numbness',
+ 'numeral',
+ 'numerate',
+ 'numerator',
+ 'numeric',
+ 'numerous',
+ 'nuptials',
+ 'nursery',
+ 'nursing',
+ 'nurture',
+ 'nutcase',
+ 'nutlike',
+ 'nutmeg',
+ 'nutrient',
+ 'nutshell',
+ 'nuttiness',
+ 'nutty',
+ 'nuzzle',
+ 'nylon',
+ 'oaf',
+ 'oak',
+ 'oasis',
+ 'oat',
+ 'obedience',
+ 'obedient',
+ 'obituary',
+ 'object',
+ 'obligate',
+ 'obliged',
+ 'oblivion',
+ 'oblivious',
+ 'oblong',
+ 'obnoxious',
+ 'oboe',
+ 'obscure',
+ 'obscurity',
+ 'observant',
+ 'observer',
+ 'observing',
+ 'obsessed',
+ 'obsession',
+ 'obsessive',
+ 'obsolete',
+ 'obstacle',
+ 'obstinate',
+ 'obstruct',
+ 'obtain',
+ 'obtrusive',
+ 'obtuse',
+ 'obvious',
+ 'occultist',
+ 'occupancy',
+ 'occupant',
+ 'occupier',
+ 'occupy',
+ 'ocean',
+ 'ocelot',
+ 'octagon',
+ 'octane',
+ 'october',
+ 'octopus',
+ 'ogle',
+ 'oil',
+ 'oink',
+ 'ointment',
+ 'okay',
+ 'old',
+ 'olive',
+ 'olympics',
+ 'omega',
+ 'omen',
+ 'ominous',
+ 'omission',
+ 'omit',
+ 'omnivore',
+ 'onboard',
+ 'oncoming',
+ 'ongoing',
+ 'onion',
+ 'online',
+ 'onlooker',
+ 'only',
+ 'onscreen',
+ 'onset',
+ 'onshore',
+ 'onslaught',
+ 'onstage',
+ 'onto',
+ 'onward',
+ 'onyx',
+ 'oops',
+ 'ooze',
+ 'oozy',
+ 'opacity',
+ 'opal',
+ 'open',
+ 'operable',
+ 'operate',
+ 'operating',
+ 'operation',
+ 'operative',
+ 'operator',
+ 'opium',
+ 'opossum',
+ 'opponent',
+ 'oppose',
+ 'opposing',
+ 'opposite',
+ 'oppressed',
+ 'oppressor',
+ 'opt',
+ 'opulently',
+ 'osmosis',
+ 'other',
+ 'otter',
+ 'ouch',
+ 'ought',
+ 'ounce',
+ 'outage',
+ 'outback',
+ 'outbid',
+ 'outboard',
+ 'outbound',
+ 'outbreak',
+ 'outburst',
+ 'outcast',
+ 'outclass',
+ 'outcome',
+ 'outdated',
+ 'outdoors',
+ 'outer',
+ 'outfield',
+ 'outfit',
+ 'outflank',
+ 'outgoing',
+ 'outgrow',
+ 'outhouse',
+ 'outing',
+ 'outlast',
+ 'outlet',
+ 'outline',
+ 'outlook',
+ 'outlying',
+ 'outmatch',
+ 'outmost',
+ 'outnumber',
+ 'outplayed',
+ 'outpost',
+ 'outpour',
+ 'output',
+ 'outrage',
+ 'outrank',
+ 'outreach',
+ 'outright',
+ 'outscore',
+ 'outsell',
+ 'outshine',
+ 'outshoot',
+ 'outsider',
+ 'outskirts',
+ 'outsmart',
+ 'outsource',
+ 'outspoken',
+ 'outtakes',
+ 'outthink',
+ 'outward',
+ 'outweigh',
+ 'outwit',
+ 'oval',
+ 'ovary',
+ 'oven',
+ 'overact',
+ 'overall',
+ 'overarch',
+ 'overbid',
+ 'overbill',
+ 'overbite',
+ 'overblown',
+ 'overboard',
+ 'overbook',
+ 'overbuilt',
+ 'overcast',
+ 'overcoat',
+ 'overcome',
+ 'overcook',
+ 'overcrowd',
+ 'overdraft',
+ 'overdrawn',
+ 'overdress',
+ 'overdrive',
+ 'overdue',
+ 'overeager',
+ 'overeater',
+ 'overexert',
+ 'overfed',
+ 'overfeed',
+ 'overfill',
+ 'overflow',
+ 'overfull',
+ 'overgrown',
+ 'overhand',
+ 'overhang',
+ 'overhaul',
+ 'overhead',
+ 'overhear',
+ 'overheat',
+ 'overhung',
+ 'overjoyed',
+ 'overkill',
+ 'overlabor',
+ 'overlaid',
+ 'overlap',
+ 'overlay',
+ 'overload',
+ 'overlook',
+ 'overlord',
+ 'overlying',
+ 'overnight',
+ 'overpass',
+ 'overpay',
+ 'overplant',
+ 'overplay',
+ 'overpower',
+ 'overprice',
+ 'overrate',
+ 'overreach',
+ 'overreact',
+ 'override',
+ 'overripe',
+ 'overrule',
+ 'overrun',
+ 'overshoot',
+ 'overshot',
+ 'oversight',
+ 'oversized',
+ 'oversleep',
+ 'oversold',
+ 'overspend',
+ 'overstate',
+ 'overstay',
+ 'overstep',
+ 'overstock',
+ 'overstuff',
+ 'oversweet',
+ 'overtake',
+ 'overthrow',
+ 'overtime',
+ 'overtly',
+ 'overtone',
+ 'overture',
+ 'overturn',
+ 'overuse',
+ 'overvalue',
+ 'overview',
+ 'overwrite',
+ 'owl',
+ 'oxford',
+ 'oxidant',
+ 'oxidation',
+ 'oxidize',
+ 'oxidizing',
+ 'oxygen',
+ 'oxymoron',
+ 'oyster',
+ 'ozone',
+ 'paced',
+ 'pacemaker',
+ 'pacific',
+ 'pacifier',
+ 'pacifism',
+ 'pacifist',
+ 'pacify',
+ 'padded',
+ 'padding',
+ 'paddle',
+ 'paddling',
+ 'padlock',
+ 'pagan',
+ 'pager',
+ 'paging',
+ 'pajamas',
+ 'palace',
+ 'palatable',
+ 'palm',
+ 'palpable',
+ 'palpitate',
+ 'paltry',
+ 'pampered',
+ 'pamperer',
+ 'pampers',
+ 'pamphlet',
+ 'panama',
+ 'pancake',
+ 'pancreas',
+ 'panda',
+ 'pandemic',
+ 'pang',
+ 'panhandle',
+ 'panic',
+ 'panning',
+ 'panorama',
+ 'panoramic',
+ 'panther',
+ 'pantomime',
+ 'pantry',
+ 'pants',
+ 'pantyhose',
+ 'paparazzi',
+ 'papaya',
+ 'paper',
+ 'paprika',
+ 'papyrus',
+ 'parabola',
+ 'parachute',
+ 'parade',
+ 'paradox',
+ 'paragraph',
+ 'parakeet',
+ 'paralegal',
+ 'paralyses',
+ 'paralysis',
+ 'paralyze',
+ 'paramedic',
+ 'parameter',
+ 'paramount',
+ 'parasail',
+ 'parasite',
+ 'parasitic',
+ 'parcel',
+ 'parched',
+ 'parchment',
+ 'pardon',
+ 'parish',
+ 'parka',
+ 'parking',
+ 'parkway',
+ 'parlor',
+ 'parmesan',
+ 'parole',
+ 'parrot',
+ 'parsley',
+ 'parsnip',
+ 'partake',
+ 'parted',
+ 'parting',
+ 'partition',
+ 'partly',
+ 'partner',
+ 'partridge',
+ 'party',
+ 'passable',
+ 'passably',
+ 'passage',
+ 'passcode',
+ 'passenger',
+ 'passerby',
+ 'passing',
+ 'passion',
+ 'passive',
+ 'passivism',
+ 'passover',
+ 'passport',
+ 'password',
+ 'pasta',
+ 'pasted',
+ 'pastel',
+ 'pastime',
+ 'pastor',
+ 'pastrami',
+ 'pasture',
+ 'pasty',
+ 'patchwork',
+ 'patchy',
+ 'paternal',
+ 'paternity',
+ 'path',
+ 'patience',
+ 'patient',
+ 'patio',
+ 'patriarch',
+ 'patriot',
+ 'patrol',
+ 'patronage',
+ 'patronize',
+ 'pauper',
+ 'pavement',
+ 'paver',
+ 'pavestone',
+ 'pavilion',
+ 'paving',
+ 'pawing',
+ 'payable',
+ 'payback',
+ 'paycheck',
+ 'payday',
+ 'payee',
+ 'payer',
+ 'paying',
+ 'payment',
+ 'payphone',
+ 'payroll',
+ 'pebble',
+ 'pebbly',
+ 'pecan',
+ 'pectin',
+ 'peculiar',
+ 'peddling',
+ 'pediatric',
+ 'pedicure',
+ 'pedigree',
+ 'pedometer',
+ 'pegboard',
+ 'pelican',
+ 'pellet',
+ 'pelt',
+ 'pelvis',
+ 'penalize',
+ 'penalty',
+ 'pencil',
+ 'pendant',
+ 'pending',
+ 'penholder',
+ 'penknife',
+ 'pennant',
+ 'penniless',
+ 'penny',
+ 'penpal',
+ 'pension',
+ 'pentagon',
+ 'pentagram',
+ 'pep',
+ 'perceive',
+ 'percent',
+ 'perch',
+ 'percolate',
+ 'perennial',
+ 'perfected',
+ 'perfectly',
+ 'perfume',
+ 'periscope',
+ 'perish',
+ 'perjurer',
+ 'perjury',
+ 'perkiness',
+ 'perky',
+ 'perm',
+ 'peroxide',
+ 'perpetual',
+ 'perplexed',
+ 'persecute',
+ 'persevere',
+ 'persuaded',
+ 'persuader',
+ 'pesky',
+ 'peso',
+ 'pessimism',
+ 'pessimist',
+ 'pester',
+ 'pesticide',
+ 'petal',
+ 'petite',
+ 'petition',
+ 'petri',
+ 'petroleum',
+ 'petted',
+ 'petticoat',
+ 'pettiness',
+ 'petty',
+ 'petunia',
+ 'phantom',
+ 'phobia',
+ 'phoenix',
+ 'phonebook',
+ 'phoney',
+ 'phonics',
+ 'phoniness',
+ 'phony',
+ 'phosphate',
+ 'photo',
+ 'phrase',
+ 'phrasing',
+ 'placard',
+ 'placate',
+ 'placidly',
+ 'plank',
+ 'planner',
+ 'plant',
+ 'plasma',
+ 'plaster',
+ 'plastic',
+ 'plated',
+ 'platform',
+ 'plating',
+ 'platinum',
+ 'platonic',
+ 'platter',
+ 'platypus',
+ 'plausible',
+ 'plausibly',
+ 'playable',
+ 'playback',
+ 'player',
+ 'playful',
+ 'playgroup',
+ 'playhouse',
+ 'playing',
+ 'playlist',
+ 'playmaker',
+ 'playmate',
+ 'playoff',
+ 'playpen',
+ 'playroom',
+ 'playset',
+ 'plaything',
+ 'playtime',
+ 'plaza',
+ 'pleading',
+ 'pleat',
+ 'pledge',
+ 'plentiful',
+ 'plenty',
+ 'plethora',
+ 'plexiglas',
+ 'pliable',
+ 'plod',
+ 'plop',
+ 'plot',
+ 'plow',
+ 'ploy',
+ 'pluck',
+ 'plug',
+ 'plunder',
+ 'plunging',
+ 'plural',
+ 'plus',
+ 'plutonium',
+ 'plywood',
+ 'poach',
+ 'pod',
+ 'poem',
+ 'poet',
+ 'pogo',
+ 'pointed',
+ 'pointer',
+ 'pointing',
+ 'pointless',
+ 'pointy',
+ 'poise',
+ 'poison',
+ 'poker',
+ 'poking',
+ 'polar',
+ 'police',
+ 'policy',
+ 'polio',
+ 'polish',
+ 'politely',
+ 'polka',
+ 'polo',
+ 'polyester',
+ 'polygon',
+ 'polygraph',
+ 'polymer',
+ 'poncho',
+ 'pond',
+ 'pony',
+ 'popcorn',
+ 'pope',
+ 'poplar',
+ 'popper',
+ 'poppy',
+ 'popsicle',
+ 'populace',
+ 'popular',
+ 'populate',
+ 'porcupine',
+ 'pork',
+ 'porous',
+ 'porridge',
+ 'portable',
+ 'portal',
+ 'portfolio',
+ 'porthole',
+ 'portion',
+ 'portly',
+ 'portside',
+ 'poser',
+ 'posh',
+ 'posing',
+ 'possible',
+ 'possibly',
+ 'possum',
+ 'postage',
+ 'postal',
+ 'postbox',
+ 'postcard',
+ 'posted',
+ 'poster',
+ 'posting',
+ 'postnasal',
+ 'posture',
+ 'postwar',
+ 'pouch',
+ 'pounce',
+ 'pouncing',
+ 'pound',
+ 'pouring',
+ 'pout',
+ 'powdered',
+ 'powdering',
+ 'powdery',
+ 'power',
+ 'powwow',
+ 'pox',
+ 'praising',
+ 'prance',
+ 'prancing',
+ 'pranker',
+ 'prankish',
+ 'prankster',
+ 'prayer',
+ 'praying',
+ 'preacher',
+ 'preaching',
+ 'preachy',
+ 'preamble',
+ 'precinct',
+ 'precise',
+ 'precision',
+ 'precook',
+ 'precut',
+ 'predator',
+ 'predefine',
+ 'predict',
+ 'preface',
+ 'prefix',
+ 'preflight',
+ 'preformed',
+ 'pregame',
+ 'pregnancy',
+ 'pregnant',
+ 'preheated',
+ 'prelaunch',
+ 'prelaw',
+ 'prelude',
+ 'premiere',
+ 'premises',
+ 'premium',
+ 'prenatal',
+ 'preoccupy',
+ 'preorder',
+ 'prepaid',
+ 'prepay',
+ 'preplan',
+ 'preppy',
+ 'preschool',
+ 'prescribe',
+ 'preseason',
+ 'preset',
+ 'preshow',
+ 'president',
+ 'presoak',
+ 'press',
+ 'presume',
+ 'presuming',
+ 'preteen',
+ 'pretended',
+ 'pretender',
+ 'pretense',
+ 'pretext',
+ 'pretty',
+ 'pretzel',
+ 'prevail',
+ 'prevalent',
+ 'prevent',
+ 'preview',
+ 'previous',
+ 'prewar',
+ 'prewashed',
+ 'prideful',
+ 'pried',
+ 'primal',
+ 'primarily',
+ 'primary',
+ 'primate',
+ 'primer',
+ 'primp',
+ 'princess',
+ 'print',
+ 'prior',
+ 'prism',
+ 'prison',
+ 'prissy',
+ 'pristine',
+ 'privacy',
+ 'private',
+ 'privatize',
+ 'prize',
+ 'proactive',
+ 'probable',
+ 'probably',
+ 'probation',
+ 'probe',
+ 'probing',
+ 'probiotic',
+ 'problem',
+ 'procedure',
+ 'process',
+ 'proclaim',
+ 'procreate',
+ 'procurer',
+ 'prodigal',
+ 'prodigy',
+ 'produce',
+ 'product',
+ 'profane',
+ 'profanity',
+ 'professed',
+ 'professor',
+ 'profile',
+ 'profound',
+ 'profusely',
+ 'progeny',
+ 'prognosis',
+ 'program',
+ 'progress',
+ 'projector',
+ 'prologue',
+ 'prolonged',
+ 'promenade',
+ 'prominent',
+ 'promoter',
+ 'promotion',
+ 'prompter',
+ 'promptly',
+ 'prone',
+ 'prong',
+ 'pronounce',
+ 'pronto',
+ 'proofing',
+ 'proofread',
+ 'proofs',
+ 'propeller',
+ 'properly',
+ 'property',
+ 'proponent',
+ 'proposal',
+ 'propose',
+ 'props',
+ 'prorate',
+ 'protector',
+ 'protegee',
+ 'proton',
+ 'prototype',
+ 'protozoan',
+ 'protract',
+ 'protrude',
+ 'proud',
+ 'provable',
+ 'proved',
+ 'proven',
+ 'provided',
+ 'provider',
+ 'providing',
+ 'province',
+ 'proving',
+ 'provoke',
+ 'provoking',
+ 'provolone',
+ 'prowess',
+ 'prowler',
+ 'prowling',
+ 'proximity',
+ 'proxy',
+ 'prozac',
+ 'prude',
+ 'prudishly',
+ 'prune',
+ 'pruning',
+ 'pry',
+ 'psychic',
+ 'public',
+ 'publisher',
+ 'pucker',
+ 'pueblo',
+ 'pug',
+ 'pull',
+ 'pulmonary',
+ 'pulp',
+ 'pulsate',
+ 'pulse',
+ 'pulverize',
+ 'puma',
+ 'pumice',
+ 'pummel',
+ 'punch',
+ 'punctual',
+ 'punctuate',
+ 'punctured',
+ 'pungent',
+ 'punisher',
+ 'punk',
+ 'pupil',
+ 'puppet',
+ 'puppy',
+ 'purchase',
+ 'pureblood',
+ 'purebred',
+ 'purely',
+ 'pureness',
+ 'purgatory',
+ 'purge',
+ 'purging',
+ 'purifier',
+ 'purify',
+ 'purist',
+ 'puritan',
+ 'purity',
+ 'purple',
+ 'purplish',
+ 'purposely',
+ 'purr',
+ 'purse',
+ 'pursuable',
+ 'pursuant',
+ 'pursuit',
+ 'purveyor',
+ 'pushcart',
+ 'pushchair',
+ 'pusher',
+ 'pushiness',
+ 'pushing',
+ 'pushover',
+ 'pushpin',
+ 'pushup',
+ 'pushy',
+ 'putdown',
+ 'putt',
+ 'puzzle',
+ 'puzzling',
+ 'pyramid',
+ 'pyromania',
+ 'python',
+ 'quack',
+ 'quadrant',
+ 'quail',
+ 'quaintly',
+ 'quake',
+ 'quaking',
+ 'qualified',
+ 'qualifier',
+ 'qualify',
+ 'quality',
+ 'qualm',
+ 'quantum',
+ 'quarrel',
+ 'quarry',
+ 'quartered',
+ 'quarterly',
+ 'quarters',
+ 'quartet',
+ 'quench',
+ 'query',
+ 'quicken',
+ 'quickly',
+ 'quickness',
+ 'quicksand',
+ 'quickstep',
+ 'quiet',
+ 'quill',
+ 'quilt',
+ 'quintet',
+ 'quintuple',
+ 'quirk',
+ 'quit',
+ 'quiver',
+ 'quizzical',
+ 'quotable',
+ 'quotation',
+ 'quote',
+ 'rabid',
+ 'race',
+ 'racing',
+ 'racism',
+ 'rack',
+ 'racoon',
+ 'radar',
+ 'radial',
+ 'radiance',
+ 'radiantly',
+ 'radiated',
+ 'radiation',
+ 'radiator',
+ 'radio',
+ 'radish',
+ 'raffle',
+ 'raft',
+ 'rage',
+ 'ragged',
+ 'raging',
+ 'ragweed',
+ 'raider',
+ 'railcar',
+ 'railing',
+ 'railroad',
+ 'railway',
+ 'raisin',
+ 'rake',
+ 'raking',
+ 'rally',
+ 'ramble',
+ 'rambling',
+ 'ramp',
+ 'ramrod',
+ 'ranch',
+ 'rancidity',
+ 'random',
+ 'ranged',
+ 'ranger',
+ 'ranging',
+ 'ranked',
+ 'ranking',
+ 'ransack',
+ 'ranting',
+ 'rants',
+ 'rare',
+ 'rarity',
+ 'rascal',
+ 'rash',
+ 'rasping',
+ 'ravage',
+ 'raven',
+ 'ravine',
+ 'raving',
+ 'ravioli',
+ 'ravishing',
+ 'reabsorb',
+ 'reach',
+ 'reacquire',
+ 'reaction',
+ 'reactive',
+ 'reactor',
+ 'reaffirm',
+ 'ream',
+ 'reanalyze',
+ 'reappear',
+ 'reapply',
+ 'reappoint',
+ 'reapprove',
+ 'rearrange',
+ 'rearview',
+ 'reason',
+ 'reassign',
+ 'reassure',
+ 'reattach',
+ 'reawake',
+ 'rebalance',
+ 'rebate',
+ 'rebel',
+ 'rebirth',
+ 'reboot',
+ 'reborn',
+ 'rebound',
+ 'rebuff',
+ 'rebuild',
+ 'rebuilt',
+ 'reburial',
+ 'rebuttal',
+ 'recall',
+ 'recant',
+ 'recapture',
+ 'recast',
+ 'recede',
+ 'recent',
+ 'recess',
+ 'recharger',
+ 'recipient',
+ 'recital',
+ 'recite',
+ 'reckless',
+ 'reclaim',
+ 'recliner',
+ 'reclining',
+ 'recluse',
+ 'reclusive',
+ 'recognize',
+ 'recoil',
+ 'recollect',
+ 'recolor',
+ 'reconcile',
+ 'reconfirm',
+ 'reconvene',
+ 'recopy',
+ 'record',
+ 'recount',
+ 'recoup',
+ 'recovery',
+ 'recreate',
+ 'rectal',
+ 'rectangle',
+ 'rectified',
+ 'rectify',
+ 'recycled',
+ 'recycler',
+ 'recycling',
+ 'reemerge',
+ 'reenact',
+ 'reenter',
+ 'reentry',
+ 'reexamine',
+ 'referable',
+ 'referee',
+ 'reference',
+ 'refill',
+ 'refinance',
+ 'refined',
+ 'refinery',
+ 'refining',
+ 'refinish',
+ 'reflected',
+ 'reflector',
+ 'reflex',
+ 'reflux',
+ 'refocus',
+ 'refold',
+ 'reforest',
+ 'reformat',
+ 'reformed',
+ 'reformer',
+ 'reformist',
+ 'refract',
+ 'refrain',
+ 'refreeze',
+ 'refresh',
+ 'refried',
+ 'refueling',
+ 'refund',
+ 'refurbish',
+ 'refurnish',
+ 'refusal',
+ 'refuse',
+ 'refusing',
+ 'refutable',
+ 'refute',
+ 'regain',
+ 'regalia',
+ 'regally',
+ 'reggae',
+ 'regime',
+ 'region',
+ 'register',
+ 'registrar',
+ 'registry',
+ 'regress',
+ 'regretful',
+ 'regroup',
+ 'regular',
+ 'regulate',
+ 'regulator',
+ 'rehab',
+ 'reheat',
+ 'rehire',
+ 'rehydrate',
+ 'reimburse',
+ 'reissue',
+ 'reiterate',
+ 'rejoice',
+ 'rejoicing',
+ 'rejoin',
+ 'rekindle',
+ 'relapse',
+ 'relapsing',
+ 'relatable',
+ 'related',
+ 'relation',
+ 'relative',
+ 'relax',
+ 'relay',
+ 'relearn',
+ 'release',
+ 'relenting',
+ 'reliable',
+ 'reliably',
+ 'reliance',
+ 'reliant',
+ 'relic',
+ 'relieve',
+ 'relieving',
+ 'relight',
+ 'relish',
+ 'relive',
+ 'reload',
+ 'relocate',
+ 'relock',
+ 'reluctant',
+ 'rely',
+ 'remake',
+ 'remark',
+ 'remarry',
+ 'rematch',
+ 'remedial',
+ 'remedy',
+ 'remember',
+ 'reminder',
+ 'remindful',
+ 'remission',
+ 'remix',
+ 'remnant',
+ 'remodeler',
+ 'remold',
+ 'remorse',
+ 'remote',
+ 'removable',
+ 'removal',
+ 'removed',
+ 'remover',
+ 'removing',
+ 'rename',
+ 'renderer',
+ 'rendering',
+ 'rendition',
+ 'renegade',
+ 'renewable',
+ 'renewably',
+ 'renewal',
+ 'renewed',
+ 'renounce',
+ 'renovate',
+ 'renovator',
+ 'rentable',
+ 'rental',
+ 'rented',
+ 'renter',
+ 'reoccupy',
+ 'reoccur',
+ 'reopen',
+ 'reorder',
+ 'repackage',
+ 'repacking',
+ 'repaint',
+ 'repair',
+ 'repave',
+ 'repaying',
+ 'repayment',
+ 'repeal',
+ 'repeated',
+ 'repeater',
+ 'repent',
+ 'rephrase',
+ 'replace',
+ 'replay',
+ 'replica',
+ 'reply',
+ 'reporter',
+ 'repose',
+ 'repossess',
+ 'repost',
+ 'repressed',
+ 'reprimand',
+ 'reprint',
+ 'reprise',
+ 'reproach',
+ 'reprocess',
+ 'reproduce',
+ 'reprogram',
+ 'reps',
+ 'reptile',
+ 'reptilian',
+ 'repugnant',
+ 'repulsion',
+ 'repulsive',
+ 'repurpose',
+ 'reputable',
+ 'reputably',
+ 'request',
+ 'require',
+ 'requisite',
+ 'reroute',
+ 'rerun',
+ 'resale',
+ 'resample',
+ 'rescuer',
+ 'reseal',
+ 'research',
+ 'reselect',
+ 'reseller',
+ 'resemble',
+ 'resend',
+ 'resent',
+ 'reset',
+ 'reshape',
+ 'reshoot',
+ 'reshuffle',
+ 'residence',
+ 'residency',
+ 'resident',
+ 'residual',
+ 'residue',
+ 'resigned',
+ 'resilient',
+ 'resistant',
+ 'resisting',
+ 'resize',
+ 'resolute',
+ 'resolved',
+ 'resonant',
+ 'resonate',
+ 'resort',
+ 'resource',
+ 'respect',
+ 'resubmit',
+ 'result',
+ 'resume',
+ 'resupply',
+ 'resurface',
+ 'resurrect',
+ 'retail',
+ 'retainer',
+ 'retaining',
+ 'retake',
+ 'retaliate',
+ 'retention',
+ 'rethink',
+ 'retinal',
+ 'retired',
+ 'retiree',
+ 'retiring',
+ 'retold',
+ 'retool',
+ 'retorted',
+ 'retouch',
+ 'retrace',
+ 'retract',
+ 'retrain',
+ 'retread',
+ 'retreat',
+ 'retrial',
+ 'retrieval',
+ 'retriever',
+ 'retry',
+ 'return',
+ 'retying',
+ 'retype',
+ 'reunion',
+ 'reunite',
+ 'reusable',
+ 'reuse',
+ 'reveal',
+ 'reveler',
+ 'revenge',
+ 'revenue',
+ 'reverb',
+ 'revered',
+ 'reverence',
+ 'reverend',
+ 'reversal',
+ 'reverse',
+ 'reversing',
+ 'reversion',
+ 'revert',
+ 'revisable',
+ 'revise',
+ 'revision',
+ 'revisit',
+ 'revivable',
+ 'revival',
+ 'reviver',
+ 'reviving',
+ 'revocable',
+ 'revoke',
+ 'revolt',
+ 'revolver',
+ 'revolving',
+ 'reward',
+ 'rewash',
+ 'rewind',
+ 'rewire',
+ 'reword',
+ 'rework',
+ 'rewrap',
+ 'rewrite',
+ 'rhyme',
+ 'ribbon',
+ 'ribcage',
+ 'rice',
+ 'riches',
+ 'richly',
+ 'richness',
+ 'rickety',
+ 'ricotta',
+ 'riddance',
+ 'ridden',
+ 'ride',
+ 'riding',
+ 'rifling',
+ 'rift',
+ 'rigging',
+ 'rigid',
+ 'rigor',
+ 'rimless',
+ 'rimmed',
+ 'rind',
+ 'rink',
+ 'rinse',
+ 'rinsing',
+ 'riot',
+ 'ripcord',
+ 'ripeness',
+ 'ripening',
+ 'ripping',
+ 'ripple',
+ 'rippling',
+ 'riptide',
+ 'rise',
+ 'rising',
+ 'risk',
+ 'risotto',
+ 'ritalin',
+ 'ritzy',
+ 'rival',
+ 'riverbank',
+ 'riverbed',
+ 'riverboat',
+ 'riverside',
+ 'riveter',
+ 'riveting',
+ 'roamer',
+ 'roaming',
+ 'roast',
+ 'robbing',
+ 'robe',
+ 'robin',
+ 'robotics',
+ 'robust',
+ 'rockband',
+ 'rocker',
+ 'rocket',
+ 'rockfish',
+ 'rockiness',
+ 'rocking',
+ 'rocklike',
+ 'rockslide',
+ 'rockstar',
+ 'rocky',
+ 'rogue',
+ 'roman',
+ 'romp',
+ 'rope',
+ 'roping',
+ 'roster',
+ 'rosy',
+ 'rotten',
+ 'rotting',
+ 'rotunda',
+ 'roulette',
+ 'rounding',
+ 'roundish',
+ 'roundness',
+ 'roundup',
+ 'roundworm',
+ 'routine',
+ 'routing',
+ 'rover',
+ 'roving',
+ 'royal',
+ 'rubbed',
+ 'rubber',
+ 'rubbing',
+ 'rubble',
+ 'rubdown',
+ 'ruby',
+ 'ruckus',
+ 'rudder',
+ 'rug',
+ 'ruined',
+ 'rule',
+ 'rumble',
+ 'rumbling',
+ 'rummage',
+ 'rumor',
+ 'runaround',
+ 'rundown',
+ 'runner',
+ 'running',
+ 'runny',
+ 'runt',
+ 'runway',
+ 'rupture',
+ 'rural',
+ 'ruse',
+ 'rush',
+ 'rust',
+ 'rut',
+ 'sabbath',
+ 'sabotage',
+ 'sacrament',
+ 'sacred',
+ 'sacrifice',
+ 'sadden',
+ 'saddlebag',
+ 'saddled',
+ 'saddling',
+ 'sadly',
+ 'sadness',
+ 'safari',
+ 'safeguard',
+ 'safehouse',
+ 'safely',
+ 'safeness',
+ 'saffron',
+ 'saga',
+ 'sage',
+ 'sagging',
+ 'saggy',
+ 'said',
+ 'saint',
+ 'sake',
+ 'salad',
+ 'salami',
+ 'salaried',
+ 'salary',
+ 'saline',
+ 'salon',
+ 'saloon',
+ 'salsa',
+ 'salt',
+ 'salutary',
+ 'salute',
+ 'salvage',
+ 'salvaging',
+ 'salvation',
+ 'same',
+ 'sample',
+ 'sampling',
+ 'sanction',
+ 'sanctity',
+ 'sanctuary',
+ 'sandal',
+ 'sandbag',
+ 'sandbank',
+ 'sandbar',
+ 'sandblast',
+ 'sandbox',
+ 'sanded',
+ 'sandfish',
+ 'sanding',
+ 'sandlot',
+ 'sandpaper',
+ 'sandpit',
+ 'sandstone',
+ 'sandstorm',
+ 'sandworm',
+ 'sandy',
+ 'sanitary',
+ 'sanitizer',
+ 'sank',
+ 'santa',
+ 'sapling',
+ 'sappiness',
+ 'sappy',
+ 'sarcasm',
+ 'sarcastic',
+ 'sardine',
+ 'sash',
+ 'sasquatch',
+ 'sassy',
+ 'satchel',
+ 'satiable',
+ 'satin',
+ 'satirical',
+ 'satisfied',
+ 'satisfy',
+ 'saturate',
+ 'saturday',
+ 'sauciness',
+ 'saucy',
+ 'sauna',
+ 'savage',
+ 'savanna',
+ 'saved',
+ 'savings',
+ 'savior',
+ 'savor',
+ 'saxophone',
+ 'say',
+ 'scabbed',
+ 'scabby',
+ 'scalded',
+ 'scalding',
+ 'scale',
+ 'scaling',
+ 'scallion',
+ 'scallop',
+ 'scalping',
+ 'scam',
+ 'scandal',
+ 'scanner',
+ 'scanning',
+ 'scant',
+ 'scapegoat',
+ 'scarce',
+ 'scarcity',
+ 'scarecrow',
+ 'scared',
+ 'scarf',
+ 'scarily',
+ 'scariness',
+ 'scarring',
+ 'scary',
+ 'scavenger',
+ 'scenic',
+ 'schedule',
+ 'schematic',
+ 'scheme',
+ 'scheming',
+ 'schilling',
+ 'schnapps',
+ 'scholar',
+ 'science',
+ 'scientist',
+ 'scion',
+ 'scoff',
+ 'scolding',
+ 'scone',
+ 'scoop',
+ 'scooter',
+ 'scope',
+ 'scorch',
+ 'scorebook',
+ 'scorecard',
+ 'scored',
+ 'scoreless',
+ 'scorer',
+ 'scoring',
+ 'scorn',
+ 'scorpion',
+ 'scotch',
+ 'scoundrel',
+ 'scoured',
+ 'scouring',
+ 'scouting',
+ 'scouts',
+ 'scowling',
+ 'scrabble',
+ 'scraggly',
+ 'scrambled',
+ 'scrambler',
+ 'scrap',
+ 'scratch',
+ 'scrawny',
+ 'screen',
+ 'scribble',
+ 'scribe',
+ 'scribing',
+ 'scrimmage',
+ 'script',
+ 'scroll',
+ 'scrooge',
+ 'scrounger',
+ 'scrubbed',
+ 'scrubber',
+ 'scruffy',
+ 'scrunch',
+ 'scrutiny',
+ 'scuba',
+ 'scuff',
+ 'sculptor',
+ 'sculpture',
+ 'scurvy',
+ 'scuttle',
+ 'secluded',
+ 'secluding',
+ 'seclusion',
+ 'second',
+ 'secrecy',
+ 'secret',
+ 'sectional',
+ 'sector',
+ 'secular',
+ 'securely',
+ 'security',
+ 'sedan',
+ 'sedate',
+ 'sedation',
+ 'sedative',
+ 'sediment',
+ 'seduce',
+ 'seducing',
+ 'segment',
+ 'seismic',
+ 'seizing',
+ 'seldom',
+ 'selected',
+ 'selection',
+ 'selective',
+ 'selector',
+ 'self',
+ 'seltzer',
+ 'semantic',
+ 'semester',
+ 'semicolon',
+ 'semifinal',
+ 'seminar',
+ 'semisoft',
+ 'semisweet',
+ 'senate',
+ 'senator',
+ 'send',
+ 'senior',
+ 'senorita',
+ 'sensation',
+ 'sensitive',
+ 'sensitize',
+ 'sensually',
+ 'sensuous',
+ 'sepia',
+ 'september',
+ 'septic',
+ 'septum',
+ 'sequel',
+ 'sequence',
+ 'sequester',
+ 'series',
+ 'sermon',
+ 'serotonin',
+ 'serpent',
+ 'serrated',
+ 'serve',
+ 'service',
+ 'serving',
+ 'sesame',
+ 'sessions',
+ 'setback',
+ 'setting',
+ 'settle',
+ 'settling',
+ 'setup',
+ 'sevenfold',
+ 'seventeen',
+ 'seventh',
+ 'seventy',
+ 'severity',
+ 'shabby',
+ 'shack',
+ 'shaded',
+ 'shadily',
+ 'shadiness',
+ 'shading',
+ 'shadow',
+ 'shady',
+ 'shaft',
+ 'shakable',
+ 'shakily',
+ 'shakiness',
+ 'shaking',
+ 'shaky',
+ 'shale',
+ 'shallot',
+ 'shallow',
+ 'shame',
+ 'shampoo',
+ 'shamrock',
+ 'shank',
+ 'shanty',
+ 'shape',
+ 'shaping',
+ 'share',
+ 'sharpener',
+ 'sharper',
+ 'sharpie',
+ 'sharply',
+ 'sharpness',
+ 'shawl',
+ 'sheath',
+ 'shed',
+ 'sheep',
+ 'sheet',
+ 'shelf',
+ 'shell',
+ 'shelter',
+ 'shelve',
+ 'shelving',
+ 'sherry',
+ 'shield',
+ 'shifter',
+ 'shifting',
+ 'shiftless',
+ 'shifty',
+ 'shimmer',
+ 'shimmy',
+ 'shindig',
+ 'shine',
+ 'shingle',
+ 'shininess',
+ 'shining',
+ 'shiny',
+ 'ship',
+ 'shirt',
+ 'shivering',
+ 'shock',
+ 'shone',
+ 'shoplift',
+ 'shopper',
+ 'shopping',
+ 'shoptalk',
+ 'shore',
+ 'shortage',
+ 'shortcake',
+ 'shortcut',
+ 'shorten',
+ 'shorter',
+ 'shorthand',
+ 'shortlist',
+ 'shortly',
+ 'shortness',
+ 'shorts',
+ 'shortwave',
+ 'shorty',
+ 'shout',
+ 'shove',
+ 'showbiz',
+ 'showcase',
+ 'showdown',
+ 'shower',
+ 'showgirl',
+ 'showing',
+ 'showman',
+ 'shown',
+ 'showoff',
+ 'showpiece',
+ 'showplace',
+ 'showroom',
+ 'showy',
+ 'shrank',
+ 'shrapnel',
+ 'shredder',
+ 'shredding',
+ 'shrewdly',
+ 'shriek',
+ 'shrill',
+ 'shrimp',
+ 'shrine',
+ 'shrink',
+ 'shrivel',
+ 'shrouded',
+ 'shrubbery',
+ 'shrubs',
+ 'shrug',
+ 'shrunk',
+ 'shucking',
+ 'shudder',
+ 'shuffle',
+ 'shuffling',
+ 'shun',
+ 'shush',
+ 'shut',
+ 'shy',
+ 'siamese',
+ 'siberian',
+ 'sibling',
+ 'siding',
+ 'sierra',
+ 'siesta',
+ 'sift',
+ 'sighing',
+ 'silenced',
+ 'silencer',
+ 'silent',
+ 'silica',
+ 'silicon',
+ 'silk',
+ 'silliness',
+ 'silly',
+ 'silo',
+ 'silt',
+ 'silver',
+ 'similarly',
+ 'simile',
+ 'simmering',
+ 'simple',
+ 'simplify',
+ 'simply',
+ 'sincere',
+ 'sincerity',
+ 'singer',
+ 'singing',
+ 'single',
+ 'singular',
+ 'sinister',
+ 'sinless',
+ 'sinner',
+ 'sinuous',
+ 'sip',
+ 'siren',
+ 'sister',
+ 'sitcom',
+ 'sitter',
+ 'sitting',
+ 'situated',
+ 'situation',
+ 'sixfold',
+ 'sixteen',
+ 'sixth',
+ 'sixties',
+ 'sixtieth',
+ 'sixtyfold',
+ 'sizable',
+ 'sizably',
+ 'size',
+ 'sizing',
+ 'sizzle',
+ 'sizzling',
+ 'skater',
+ 'skating',
+ 'skedaddle',
+ 'skeletal',
+ 'skeleton',
+ 'skeptic',
+ 'sketch',
+ 'skewed',
+ 'skewer',
+ 'skid',
+ 'skied',
+ 'skier',
+ 'skies',
+ 'skiing',
+ 'skilled',
+ 'skillet',
+ 'skillful',
+ 'skimmed',
+ 'skimmer',
+ 'skimming',
+ 'skimpily',
+ 'skincare',
+ 'skinhead',
+ 'skinless',
+ 'skinning',
+ 'skinny',
+ 'skintight',
+ 'skipper',
+ 'skipping',
+ 'skirmish',
+ 'skirt',
+ 'skittle',
+ 'skydiver',
+ 'skylight',
+ 'skyline',
+ 'skype',
+ 'skyrocket',
+ 'skyward',
+ 'slab',
+ 'slacked',
+ 'slacker',
+ 'slacking',
+ 'slackness',
+ 'slacks',
+ 'slain',
+ 'slam',
+ 'slander',
+ 'slang',
+ 'slapping',
+ 'slapstick',
+ 'slashed',
+ 'slashing',
+ 'slate',
+ 'slather',
+ 'slaw',
+ 'sled',
+ 'sleek',
+ 'sleep',
+ 'sleet',
+ 'sleeve',
+ 'slept',
+ 'sliceable',
+ 'sliced',
+ 'slicer',
+ 'slicing',
+ 'slick',
+ 'slider',
+ 'slideshow',
+ 'sliding',
+ 'slighted',
+ 'slighting',
+ 'slightly',
+ 'slimness',
+ 'slimy',
+ 'slinging',
+ 'slingshot',
+ 'slinky',
+ 'slip',
+ 'slit',
+ 'sliver',
+ 'slobbery',
+ 'slogan',
+ 'sloped',
+ 'sloping',
+ 'sloppily',
+ 'sloppy',
+ 'slot',
+ 'slouching',
+ 'slouchy',
+ 'sludge',
+ 'slug',
+ 'slum',
+ 'slurp',
+ 'slush',
+ 'sly',
+ 'small',
+ 'smartly',
+ 'smartness',
+ 'smasher',
+ 'smashing',
+ 'smashup',
+ 'smell',
+ 'smelting',
+ 'smile',
+ 'smilingly',
+ 'smirk',
+ 'smite',
+ 'smith',
+ 'smitten',
+ 'smock',
+ 'smog',
+ 'smoked',
+ 'smokeless',
+ 'smokiness',
+ 'smoking',
+ 'smoky',
+ 'smolder',
+ 'smooth',
+ 'smother',
+ 'smudge',
+ 'smudgy',
+ 'smuggler',
+ 'smuggling',
+ 'smugly',
+ 'smugness',
+ 'snack',
+ 'snagged',
+ 'snaking',
+ 'snap',
+ 'snare',
+ 'snarl',
+ 'snazzy',
+ 'sneak',
+ 'sneer',
+ 'sneeze',
+ 'sneezing',
+ 'snide',
+ 'sniff',
+ 'snippet',
+ 'snipping',
+ 'snitch',
+ 'snooper',
+ 'snooze',
+ 'snore',
+ 'snoring',
+ 'snorkel',
+ 'snort',
+ 'snout',
+ 'snowbird',
+ 'snowboard',
+ 'snowbound',
+ 'snowcap',
+ 'snowdrift',
+ 'snowdrop',
+ 'snowfall',
+ 'snowfield',
+ 'snowflake',
+ 'snowiness',
+ 'snowless',
+ 'snowman',
+ 'snowplow',
+ 'snowshoe',
+ 'snowstorm',
+ 'snowsuit',
+ 'snowy',
+ 'snub',
+ 'snuff',
+ 'snuggle',
+ 'snugly',
+ 'snugness',
+ 'speak',
+ 'spearfish',
+ 'spearhead',
+ 'spearman',
+ 'spearmint',
+ 'species',
+ 'specimen',
+ 'specked',
+ 'speckled',
+ 'specks',
+ 'spectacle',
+ 'spectator',
+ 'spectrum',
+ 'speculate',
+ 'speech',
+ 'speed',
+ 'spellbind',
+ 'speller',
+ 'spelling',
+ 'spendable',
+ 'spender',
+ 'spending',
+ 'spent',
+ 'spew',
+ 'sphere',
+ 'spherical',
+ 'sphinx',
+ 'spider',
+ 'spied',
+ 'spiffy',
+ 'spill',
+ 'spilt',
+ 'spinach',
+ 'spinal',
+ 'spindle',
+ 'spinner',
+ 'spinning',
+ 'spinout',
+ 'spinster',
+ 'spiny',
+ 'spiral',
+ 'spirited',
+ 'spiritism',
+ 'spirits',
+ 'spiritual',
+ 'splashed',
+ 'splashing',
+ 'splashy',
+ 'splatter',
+ 'spleen',
+ 'splendid',
+ 'splendor',
+ 'splice',
+ 'splicing',
+ 'splinter',
+ 'splotchy',
+ 'splurge',
+ 'spoilage',
+ 'spoiled',
+ 'spoiler',
+ 'spoiling',
+ 'spoils',
+ 'spoken',
+ 'spokesman',
+ 'sponge',
+ 'spongy',
+ 'sponsor',
+ 'spoof',
+ 'spookily',
+ 'spooky',
+ 'spool',
+ 'spoon',
+ 'spore',
+ 'sporting',
+ 'sports',
+ 'sporty',
+ 'spotless',
+ 'spotlight',
+ 'spotted',
+ 'spotter',
+ 'spotting',
+ 'spotty',
+ 'spousal',
+ 'spouse',
+ 'spout',
+ 'sprain',
+ 'sprang',
+ 'sprawl',
+ 'spray',
+ 'spree',
+ 'sprig',
+ 'spring',
+ 'sprinkled',
+ 'sprinkler',
+ 'sprint',
+ 'sprite',
+ 'sprout',
+ 'spruce',
+ 'sprung',
+ 'spry',
+ 'spud',
+ 'spur',
+ 'sputter',
+ 'spyglass',
+ 'squabble',
+ 'squad',
+ 'squall',
+ 'squander',
+ 'squash',
+ 'squatted',
+ 'squatter',
+ 'squatting',
+ 'squeak',
+ 'squealer',
+ 'squealing',
+ 'squeamish',
+ 'squeegee',
+ 'squeeze',
+ 'squeezing',
+ 'squid',
+ 'squiggle',
+ 'squiggly',
+ 'squint',
+ 'squire',
+ 'squirt',
+ 'squishier',
+ 'squishy',
+ 'stability',
+ 'stabilize',
+ 'stable',
+ 'stack',
+ 'stadium',
+ 'staff',
+ 'stage',
+ 'staging',
+ 'stagnant',
+ 'stagnate',
+ 'stainable',
+ 'stained',
+ 'staining',
+ 'stainless',
+ 'stalemate',
+ 'staleness',
+ 'stalling',
+ 'stallion',
+ 'stamina',
+ 'stammer',
+ 'stamp',
+ 'stand',
+ 'stank',
+ 'staple',
+ 'stapling',
+ 'starboard',
+ 'starch',
+ 'stardom',
+ 'stardust',
+ 'starfish',
+ 'stargazer',
+ 'staring',
+ 'stark',
+ 'starless',
+ 'starlet',
+ 'starlight',
+ 'starlit',
+ 'starring',
+ 'starry',
+ 'starship',
+ 'starter',
+ 'starting',
+ 'startle',
+ 'startling',
+ 'startup',
+ 'starved',
+ 'starving',
+ 'stash',
+ 'state',
+ 'static',
+ 'statistic',
+ 'statue',
+ 'stature',
+ 'status',
+ 'statute',
+ 'statutory',
+ 'staunch',
+ 'stays',
+ 'steadfast',
+ 'steadier',
+ 'steadily',
+ 'steadying',
+ 'steam',
+ 'steed',
+ 'steep',
+ 'steerable',
+ 'steering',
+ 'steersman',
+ 'stegosaur',
+ 'stellar',
+ 'stem',
+ 'stench',
+ 'stencil',
+ 'step',
+ 'stereo',
+ 'sterile',
+ 'sterility',
+ 'sterilize',
+ 'sterling',
+ 'sternness',
+ 'sternum',
+ 'stew',
+ 'stick',
+ 'stiffen',
+ 'stiffly',
+ 'stiffness',
+ 'stifle',
+ 'stifling',
+ 'stillness',
+ 'stilt',
+ 'stimulant',
+ 'stimulate',
+ 'stimuli',
+ 'stimulus',
+ 'stinger',
+ 'stingily',
+ 'stinging',
+ 'stingray',
+ 'stingy',
+ 'stinking',
+ 'stinky',
+ 'stipend',
+ 'stipulate',
+ 'stir',
+ 'stitch',
+ 'stock',
+ 'stoic',
+ 'stoke',
+ 'stole',
+ 'stomp',
+ 'stonewall',
+ 'stoneware',
+ 'stonework',
+ 'stoning',
+ 'stony',
+ 'stood',
+ 'stooge',
+ 'stool',
+ 'stoop',
+ 'stoplight',
+ 'stoppable',
+ 'stoppage',
+ 'stopped',
+ 'stopper',
+ 'stopping',
+ 'stopwatch',
+ 'storable',
+ 'storage',
+ 'storeroom',
+ 'storewide',
+ 'storm',
+ 'stout',
+ 'stove',
+ 'stowaway',
+ 'stowing',
+ 'straddle',
+ 'straggler',
+ 'strained',
+ 'strainer',
+ 'straining',
+ 'strangely',
+ 'stranger',
+ 'strangle',
+ 'strategic',
+ 'strategy',
+ 'stratus',
+ 'straw',
+ 'stray',
+ 'streak',
+ 'stream',
+ 'street',
+ 'strength',
+ 'strenuous',
+ 'strep',
+ 'stress',
+ 'stretch',
+ 'strewn',
+ 'stricken',
+ 'strict',
+ 'stride',
+ 'strife',
+ 'strike',
+ 'striking',
+ 'strive',
+ 'striving',
+ 'strobe',
+ 'strode',
+ 'stroller',
+ 'strongbox',
+ 'strongly',
+ 'strongman',
+ 'struck',
+ 'structure',
+ 'strudel',
+ 'struggle',
+ 'strum',
+ 'strung',
+ 'strut',
+ 'stubbed',
+ 'stubble',
+ 'stubbly',
+ 'stubborn',
+ 'stucco',
+ 'stuck',
+ 'student',
+ 'studied',
+ 'studio',
+ 'study',
+ 'stuffed',
+ 'stuffing',
+ 'stuffy',
+ 'stumble',
+ 'stumbling',
+ 'stump',
+ 'stung',
+ 'stunned',
+ 'stunner',
+ 'stunning',
+ 'stunt',
+ 'stupor',
+ 'sturdily',
+ 'sturdy',
+ 'styling',
+ 'stylishly',
+ 'stylist',
+ 'stylized',
+ 'stylus',
+ 'suave',
+ 'subarctic',
+ 'subatomic',
+ 'subdivide',
+ 'subdued',
+ 'subduing',
+ 'subfloor',
+ 'subgroup',
+ 'subheader',
+ 'subject',
+ 'sublease',
+ 'sublet',
+ 'sublevel',
+ 'sublime',
+ 'submarine',
+ 'submerge',
+ 'submersed',
+ 'submitter',
+ 'subpanel',
+ 'subpar',
+ 'subplot',
+ 'subprime',
+ 'subscribe',
+ 'subscript',
+ 'subsector',
+ 'subside',
+ 'subsiding',
+ 'subsidize',
+ 'subsidy',
+ 'subsoil',
+ 'subsonic',
+ 'substance',
+ 'subsystem',
+ 'subtext',
+ 'subtitle',
+ 'subtly',
+ 'subtotal',
+ 'subtract',
+ 'subtype',
+ 'suburb',
+ 'subway',
+ 'subwoofer',
+ 'subzero',
+ 'succulent',
+ 'such',
+ 'suction',
+ 'sudden',
+ 'sudoku',
+ 'suds',
+ 'sufferer',
+ 'suffering',
+ 'suffice',
+ 'suffix',
+ 'suffocate',
+ 'suffrage',
+ 'sugar',
+ 'suggest',
+ 'suing',
+ 'suitable',
+ 'suitably',
+ 'suitcase',
+ 'suitor',
+ 'sulfate',
+ 'sulfide',
+ 'sulfite',
+ 'sulfur',
+ 'sulk',
+ 'sullen',
+ 'sulphate',
+ 'sulphuric',
+ 'sultry',
+ 'superbowl',
+ 'superglue',
+ 'superhero',
+ 'superior',
+ 'superjet',
+ 'superman',
+ 'supermom',
+ 'supernova',
+ 'supervise',
+ 'supper',
+ 'supplier',
+ 'supply',
+ 'support',
+ 'supremacy',
+ 'supreme',
+ 'surcharge',
+ 'surely',
+ 'sureness',
+ 'surface',
+ 'surfacing',
+ 'surfboard',
+ 'surfer',
+ 'surgery',
+ 'surgical',
+ 'surging',
+ 'surname',
+ 'surpass',
+ 'surplus',
+ 'surprise',
+ 'surreal',
+ 'surrender',
+ 'surrogate',
+ 'surround',
+ 'survey',
+ 'survival',
+ 'survive',
+ 'surviving',
+ 'survivor',
+ 'sushi',
+ 'suspect',
+ 'suspend',
+ 'suspense',
+ 'sustained',
+ 'sustainer',
+ 'swab',
+ 'swaddling',
+ 'swagger',
+ 'swampland',
+ 'swan',
+ 'swapping',
+ 'swarm',
+ 'sway',
+ 'swear',
+ 'sweat',
+ 'sweep',
+ 'swell',
+ 'swept',
+ 'swerve',
+ 'swifter',
+ 'swiftly',
+ 'swiftness',
+ 'swimmable',
+ 'swimmer',
+ 'swimming',
+ 'swimsuit',
+ 'swimwear',
+ 'swinger',
+ 'swinging',
+ 'swipe',
+ 'swirl',
+ 'switch',
+ 'swivel',
+ 'swizzle',
+ 'swooned',
+ 'swoop',
+ 'swoosh',
+ 'swore',
+ 'sworn',
+ 'swung',
+ 'sycamore',
+ 'sympathy',
+ 'symphonic',
+ 'symphony',
+ 'symptom',
+ 'synapse',
+ 'syndrome',
+ 'synergy',
+ 'synopses',
+ 'synopsis',
+ 'synthesis',
+ 'synthetic',
+ 'syrup',
+ 'system',
+ 't-shirt',
+ 'tabasco',
+ 'tabby',
+ 'tableful',
+ 'tables',
+ 'tablet',
+ 'tableware',
+ 'tabloid',
+ 'tackiness',
+ 'tacking',
+ 'tackle',
+ 'tackling',
+ 'tacky',
+ 'taco',
+ 'tactful',
+ 'tactical',
+ 'tactics',
+ 'tactile',
+ 'tactless',
+ 'tadpole',
+ 'taekwondo',
+ 'tag',
+ 'tainted',
+ 'take',
+ 'taking',
+ 'talcum',
+ 'talisman',
+ 'tall',
+ 'talon',
+ 'tamale',
+ 'tameness',
+ 'tamer',
+ 'tamper',
+ 'tank',
+ 'tanned',
+ 'tannery',
+ 'tanning',
+ 'tantrum',
+ 'tapeless',
+ 'tapered',
+ 'tapering',
+ 'tapestry',
+ 'tapioca',
+ 'tapping',
+ 'taps',
+ 'tarantula',
+ 'target',
+ 'tarmac',
+ 'tarnish',
+ 'tarot',
+ 'tartar',
+ 'tartly',
+ 'tartness',
+ 'task',
+ 'tassel',
+ 'taste',
+ 'tastiness',
+ 'tasting',
+ 'tasty',
+ 'tattered',
+ 'tattle',
+ 'tattling',
+ 'tattoo',
+ 'taunt',
+ 'tavern',
+ 'thank',
+ 'that',
+ 'thaw',
+ 'theater',
+ 'theatrics',
+ 'thee',
+ 'theft',
+ 'theme',
+ 'theology',
+ 'theorize',
+ 'thermal',
+ 'thermos',
+ 'thesaurus',
+ 'these',
+ 'thesis',
+ 'thespian',
+ 'thicken',
+ 'thicket',
+ 'thickness',
+ 'thieving',
+ 'thievish',
+ 'thigh',
+ 'thimble',
+ 'thing',
+ 'think',
+ 'thinly',
+ 'thinner',
+ 'thinness',
+ 'thinning',
+ 'thirstily',
+ 'thirsting',
+ 'thirsty',
+ 'thirteen',
+ 'thirty',
+ 'thong',
+ 'thorn',
+ 'those',
+ 'thousand',
+ 'thrash',
+ 'thread',
+ 'threaten',
+ 'threefold',
+ 'thrift',
+ 'thrill',
+ 'thrive',
+ 'thriving',
+ 'throat',
+ 'throbbing',
+ 'throng',
+ 'throttle',
+ 'throwaway',
+ 'throwback',
+ 'thrower',
+ 'throwing',
+ 'thud',
+ 'thumb',
+ 'thumping',
+ 'thursday',
+ 'thus',
+ 'thwarting',
+ 'thyself',
+ 'tiara',
+ 'tibia',
+ 'tidal',
+ 'tidbit',
+ 'tidiness',
+ 'tidings',
+ 'tidy',
+ 'tiger',
+ 'tighten',
+ 'tightly',
+ 'tightness',
+ 'tightrope',
+ 'tightwad',
+ 'tigress',
+ 'tile',
+ 'tiling',
+ 'till',
+ 'tilt',
+ 'timid',
+ 'timing',
+ 'timothy',
+ 'tinderbox',
+ 'tinfoil',
+ 'tingle',
+ 'tingling',
+ 'tingly',
+ 'tinker',
+ 'tinkling',
+ 'tinsel',
+ 'tinsmith',
+ 'tint',
+ 'tinwork',
+ 'tiny',
+ 'tipoff',
+ 'tipped',
+ 'tipper',
+ 'tipping',
+ 'tiptoeing',
+ 'tiptop',
+ 'tiring',
+ 'tissue',
+ 'trace',
+ 'tracing',
+ 'track',
+ 'traction',
+ 'tractor',
+ 'trade',
+ 'trading',
+ 'tradition',
+ 'traffic',
+ 'tragedy',
+ 'trailing',
+ 'trailside',
+ 'train',
+ 'traitor',
+ 'trance',
+ 'tranquil',
+ 'transfer',
+ 'transform',
+ 'translate',
+ 'transpire',
+ 'transport',
+ 'transpose',
+ 'trapdoor',
+ 'trapeze',
+ 'trapezoid',
+ 'trapped',
+ 'trapper',
+ 'trapping',
+ 'traps',
+ 'trash',
+ 'travel',
+ 'traverse',
+ 'travesty',
+ 'tray',
+ 'treachery',
+ 'treading',
+ 'treadmill',
+ 'treason',
+ 'treat',
+ 'treble',
+ 'tree',
+ 'trekker',
+ 'tremble',
+ 'trembling',
+ 'tremor',
+ 'trench',
+ 'trend',
+ 'trespass',
+ 'triage',
+ 'trial',
+ 'triangle',
+ 'tribesman',
+ 'tribunal',
+ 'tribune',
+ 'tributary',
+ 'tribute',
+ 'triceps',
+ 'trickery',
+ 'trickily',
+ 'tricking',
+ 'trickle',
+ 'trickster',
+ 'tricky',
+ 'tricolor',
+ 'tricycle',
+ 'trident',
+ 'tried',
+ 'trifle',
+ 'trifocals',
+ 'trillion',
+ 'trilogy',
+ 'trimester',
+ 'trimmer',
+ 'trimming',
+ 'trimness',
+ 'trinity',
+ 'trio',
+ 'tripod',
+ 'tripping',
+ 'triumph',
+ 'trivial',
+ 'trodden',
+ 'trolling',
+ 'trombone',
+ 'trophy',
+ 'tropical',
+ 'tropics',
+ 'trouble',
+ 'troubling',
+ 'trough',
+ 'trousers',
+ 'trout',
+ 'trowel',
+ 'truce',
+ 'truck',
+ 'truffle',
+ 'trump',
+ 'trunks',
+ 'trustable',
+ 'trustee',
+ 'trustful',
+ 'trusting',
+ 'trustless',
+ 'truth',
+ 'try',
+ 'tubby',
+ 'tubeless',
+ 'tubular',
+ 'tucking',
+ 'tuesday',
+ 'tug',
+ 'tuition',
+ 'tulip',
+ 'tumble',
+ 'tumbling',
+ 'tummy',
+ 'turban',
+ 'turbine',
+ 'turbofan',
+ 'turbojet',
+ 'turbulent',
+ 'turf',
+ 'turkey',
+ 'turmoil',
+ 'turret',
+ 'turtle',
+ 'tusk',
+ 'tutor',
+ 'tutu',
+ 'tux',
+ 'tweak',
+ 'tweed',
+ 'tweet',
+ 'tweezers',
+ 'twelve',
+ 'twentieth',
+ 'twenty',
+ 'twerp',
+ 'twice',
+ 'twiddle',
+ 'twiddling',
+ 'twig',
+ 'twilight',
+ 'twine',
+ 'twins',
+ 'twirl',
+ 'twistable',
+ 'twisted',
+ 'twister',
+ 'twisting',
+ 'twisty',
+ 'twitch',
+ 'twitter',
+ 'tycoon',
+ 'tying',
+ 'tyke',
+ 'udder',
+ 'ultimate',
+ 'ultimatum',
+ 'ultra',
+ 'umbilical',
+ 'umbrella',
+ 'umpire',
+ 'unabashed',
+ 'unable',
+ 'unadorned',
+ 'unadvised',
+ 'unafraid',
+ 'unaired',
+ 'unaligned',
+ 'unaltered',
+ 'unarmored',
+ 'unashamed',
+ 'unaudited',
+ 'unawake',
+ 'unaware',
+ 'unbaked',
+ 'unbalance',
+ 'unbeaten',
+ 'unbend',
+ 'unbent',
+ 'unbiased',
+ 'unbitten',
+ 'unblended',
+ 'unblessed',
+ 'unblock',
+ 'unbolted',
+ 'unbounded',
+ 'unboxed',
+ 'unbraided',
+ 'unbridle',
+ 'unbroken',
+ 'unbuckled',
+ 'unbundle',
+ 'unburned',
+ 'unbutton',
+ 'uncanny',
+ 'uncapped',
+ 'uncaring',
+ 'uncertain',
+ 'unchain',
+ 'unchanged',
+ 'uncharted',
+ 'uncheck',
+ 'uncivil',
+ 'unclad',
+ 'unclaimed',
+ 'unclamped',
+ 'unclasp',
+ 'uncle',
+ 'unclip',
+ 'uncloak',
+ 'unclog',
+ 'unclothed',
+ 'uncoated',
+ 'uncoiled',
+ 'uncolored',
+ 'uncombed',
+ 'uncommon',
+ 'uncooked',
+ 'uncork',
+ 'uncorrupt',
+ 'uncounted',
+ 'uncouple',
+ 'uncouth',
+ 'uncover',
+ 'uncross',
+ 'uncrown',
+ 'uncrushed',
+ 'uncured',
+ 'uncurious',
+ 'uncurled',
+ 'uncut',
+ 'undamaged',
+ 'undated',
+ 'undaunted',
+ 'undead',
+ 'undecided',
+ 'undefined',
+ 'underage',
+ 'underarm',
+ 'undercoat',
+ 'undercook',
+ 'undercut',
+ 'underdog',
+ 'underdone',
+ 'underfed',
+ 'underfeed',
+ 'underfoot',
+ 'undergo',
+ 'undergrad',
+ 'underhand',
+ 'underline',
+ 'underling',
+ 'undermine',
+ 'undermost',
+ 'underpaid',
+ 'underpass',
+ 'underpay',
+ 'underrate',
+ 'undertake',
+ 'undertone',
+ 'undertook',
+ 'undertow',
+ 'underuse',
+ 'underwear',
+ 'underwent',
+ 'underwire',
+ 'undesired',
+ 'undiluted',
+ 'undivided',
+ 'undocked',
+ 'undoing',
+ 'undone',
+ 'undrafted',
+ 'undress',
+ 'undrilled',
+ 'undusted',
+ 'undying',
+ 'unearned',
+ 'unearth',
+ 'unease',
+ 'uneasily',
+ 'uneasy',
+ 'uneatable',
+ 'uneaten',
+ 'unedited',
+ 'unelected',
+ 'unending',
+ 'unengaged',
+ 'unenvied',
+ 'unequal',
+ 'unethical',
+ 'uneven',
+ 'unexpired',
+ 'unexposed',
+ 'unfailing',
+ 'unfair',
+ 'unfasten',
+ 'unfazed',
+ 'unfeeling',
+ 'unfiled',
+ 'unfilled',
+ 'unfitted',
+ 'unfitting',
+ 'unfixable',
+ 'unfixed',
+ 'unflawed',
+ 'unfocused',
+ 'unfold',
+ 'unfounded',
+ 'unframed',
+ 'unfreeze',
+ 'unfrosted',
+ 'unfrozen',
+ 'unfunded',
+ 'unglazed',
+ 'ungloved',
+ 'unglue',
+ 'ungodly',
+ 'ungraded',
+ 'ungreased',
+ 'unguarded',
+ 'unguided',
+ 'unhappily',
+ 'unhappy',
+ 'unharmed',
+ 'unhealthy',
+ 'unheard',
+ 'unhearing',
+ 'unheated',
+ 'unhelpful',
+ 'unhidden',
+ 'unhinge',
+ 'unhitched',
+ 'unholy',
+ 'unhook',
+ 'unicorn',
+ 'unicycle',
+ 'unified',
+ 'unifier',
+ 'uniformed',
+ 'uniformly',
+ 'unify',
+ 'unimpeded',
+ 'uninjured',
+ 'uninstall',
+ 'uninsured',
+ 'uninvited',
+ 'union',
+ 'uniquely',
+ 'unisexual',
+ 'unison',
+ 'unissued',
+ 'unit',
+ 'universal',
+ 'universe',
+ 'unjustly',
+ 'unkempt',
+ 'unkind',
+ 'unknotted',
+ 'unknowing',
+ 'unknown',
+ 'unlaced',
+ 'unlatch',
+ 'unlawful',
+ 'unleaded',
+ 'unlearned',
+ 'unleash',
+ 'unless',
+ 'unleveled',
+ 'unlighted',
+ 'unlikable',
+ 'unlimited',
+ 'unlined',
+ 'unlinked',
+ 'unlisted',
+ 'unlit',
+ 'unlivable',
+ 'unloaded',
+ 'unloader',
+ 'unlocked',
+ 'unlocking',
+ 'unlovable',
+ 'unloved',
+ 'unlovely',
+ 'unloving',
+ 'unluckily',
+ 'unlucky',
+ 'unmade',
+ 'unmanaged',
+ 'unmanned',
+ 'unmapped',
+ 'unmarked',
+ 'unmasked',
+ 'unmasking',
+ 'unmatched',
+ 'unmindful',
+ 'unmixable',
+ 'unmixed',
+ 'unmolded',
+ 'unmoral',
+ 'unmovable',
+ 'unmoved',
+ 'unmoving',
+ 'unnamable',
+ 'unnamed',
+ 'unnatural',
+ 'unneeded',
+ 'unnerve',
+ 'unnerving',
+ 'unnoticed',
+ 'unopened',
+ 'unopposed',
+ 'unpack',
+ 'unpadded',
+ 'unpaid',
+ 'unpainted',
+ 'unpaired',
+ 'unpaved',
+ 'unpeeled',
+ 'unpicked',
+ 'unpiloted',
+ 'unpinned',
+ 'unplanned',
+ 'unplanted',
+ 'unpleased',
+ 'unpledged',
+ 'unplowed',
+ 'unplug',
+ 'unpopular',
+ 'unproven',
+ 'unquote',
+ 'unranked',
+ 'unrated',
+ 'unraveled',
+ 'unreached',
+ 'unread',
+ 'unreal',
+ 'unreeling',
+ 'unrefined',
+ 'unrelated',
+ 'unrented',
+ 'unrest',
+ 'unretired',
+ 'unrevised',
+ 'unrigged',
+ 'unripe',
+ 'unrivaled',
+ 'unroasted',
+ 'unrobed',
+ 'unroll',
+ 'unruffled',
+ 'unruly',
+ 'unrushed',
+ 'unsaddle',
+ 'unsafe',
+ 'unsaid',
+ 'unsalted',
+ 'unsaved',
+ 'unsavory',
+ 'unscathed',
+ 'unscented',
+ 'unscrew',
+ 'unsealed',
+ 'unseated',
+ 'unsecured',
+ 'unseeing',
+ 'unseemly',
+ 'unseen',
+ 'unselect',
+ 'unselfish',
+ 'unsent',
+ 'unsettled',
+ 'unshackle',
+ 'unshaken',
+ 'unshaved',
+ 'unshaven',
+ 'unsheathe',
+ 'unshipped',
+ 'unsightly',
+ 'unsigned',
+ 'unskilled',
+ 'unsliced',
+ 'unsmooth',
+ 'unsnap',
+ 'unsocial',
+ 'unsoiled',
+ 'unsold',
+ 'unsolved',
+ 'unsorted',
+ 'unspoiled',
+ 'unspoken',
+ 'unstable',
+ 'unstaffed',
+ 'unstamped',
+ 'unsteady',
+ 'unsterile',
+ 'unstirred',
+ 'unstitch',
+ 'unstopped',
+ 'unstuck',
+ 'unstuffed',
+ 'unstylish',
+ 'unsubtle',
+ 'unsubtly',
+ 'unsuited',
+ 'unsure',
+ 'unsworn',
+ 'untagged',
+ 'untainted',
+ 'untaken',
+ 'untamed',
+ 'untangled',
+ 'untapped',
+ 'untaxed',
+ 'unthawed',
+ 'unthread',
+ 'untidy',
+ 'untie',
+ 'until',
+ 'untimed',
+ 'untimely',
+ 'untitled',
+ 'untoasted',
+ 'untold',
+ 'untouched',
+ 'untracked',
+ 'untrained',
+ 'untreated',
+ 'untried',
+ 'untrimmed',
+ 'untrue',
+ 'untruth',
+ 'unturned',
+ 'untwist',
+ 'untying',
+ 'unusable',
+ 'unused',
+ 'unusual',
+ 'unvalued',
+ 'unvaried',
+ 'unvarying',
+ 'unveiled',
+ 'unveiling',
+ 'unvented',
+ 'unviable',
+ 'unvisited',
+ 'unvocal',
+ 'unwanted',
+ 'unwarlike',
+ 'unwary',
+ 'unwashed',
+ 'unwatched',
+ 'unweave',
+ 'unwed',
+ 'unwelcome',
+ 'unwell',
+ 'unwieldy',
+ 'unwilling',
+ 'unwind',
+ 'unwired',
+ 'unwitting',
+ 'unwomanly',
+ 'unworldly',
+ 'unworn',
+ 'unworried',
+ 'unworthy',
+ 'unwound',
+ 'unwoven',
+ 'unwrapped',
+ 'unwritten',
+ 'unzip',
+ 'upbeat',
+ 'upchuck',
+ 'upcoming',
+ 'upcountry',
+ 'update',
+ 'upfront',
+ 'upgrade',
+ 'upheaval',
+ 'upheld',
+ 'uphill',
+ 'uphold',
+ 'uplifted',
+ 'uplifting',
+ 'upload',
+ 'upon',
+ 'upper',
+ 'upright',
+ 'uprising',
+ 'upriver',
+ 'uproar',
+ 'uproot',
+ 'upscale',
+ 'upside',
+ 'upstage',
+ 'upstairs',
+ 'upstart',
+ 'upstate',
+ 'upstream',
+ 'upstroke',
+ 'upswing',
+ 'uptake',
+ 'uptight',
+ 'uptown',
+ 'upturned',
+ 'upward',
+ 'upwind',
+ 'uranium',
+ 'urban',
+ 'urchin',
+ 'urethane',
+ 'urgency',
+ 'urgent',
+ 'urging',
+ 'urologist',
+ 'urology',
+ 'usable',
+ 'usage',
+ 'useable',
+ 'used',
+ 'uselessly',
+ 'user',
+ 'usher',
+ 'usual',
+ 'utensil',
+ 'utility',
+ 'utilize',
+ 'utmost',
+ 'utopia',
+ 'utter',
+ 'vacancy',
+ 'vacant',
+ 'vacate',
+ 'vacation',
+ 'vagabond',
+ 'vagrancy',
+ 'vagrantly',
+ 'vaguely',
+ 'vagueness',
+ 'valiant',
+ 'valid',
+ 'valium',
+ 'valley',
+ 'valuables',
+ 'value',
+ 'vanilla',
+ 'vanish',
+ 'vanity',
+ 'vanquish',
+ 'vantage',
+ 'vaporizer',
+ 'variable',
+ 'variably',
+ 'varied',
+ 'variety',
+ 'various',
+ 'varmint',
+ 'varnish',
+ 'varsity',
+ 'varying',
+ 'vascular',
+ 'vaseline',
+ 'vastly',
+ 'vastness',
+ 'veal',
+ 'vegan',
+ 'veggie',
+ 'vehicular',
+ 'velcro',
+ 'velocity',
+ 'velvet',
+ 'vendetta',
+ 'vending',
+ 'vendor',
+ 'veneering',
+ 'vengeful',
+ 'venomous',
+ 'ventricle',
+ 'venture',
+ 'venue',
+ 'venus',
+ 'verbalize',
+ 'verbally',
+ 'verbose',
+ 'verdict',
+ 'verify',
+ 'verse',
+ 'version',
+ 'versus',
+ 'vertebrae',
+ 'vertical',
+ 'vertigo',
+ 'very',
+ 'vessel',
+ 'vest',
+ 'veteran',
+ 'veto',
+ 'vexingly',
+ 'viability',
+ 'viable',
+ 'vibes',
+ 'vice',
+ 'vicinity',
+ 'victory',
+ 'video',
+ 'viewable',
+ 'viewer',
+ 'viewing',
+ 'viewless',
+ 'viewpoint',
+ 'vigorous',
+ 'village',
+ 'villain',
+ 'vindicate',
+ 'vineyard',
+ 'vintage',
+ 'violate',
+ 'violation',
+ 'violator',
+ 'violet',
+ 'violin',
+ 'viper',
+ 'viral',
+ 'virtual',
+ 'virtuous',
+ 'virus',
+ 'visa',
+ 'viscosity',
+ 'viscous',
+ 'viselike',
+ 'visible',
+ 'visibly',
+ 'vision',
+ 'visiting',
+ 'visitor',
+ 'visor',
+ 'vista',
+ 'vitality',
+ 'vitalize',
+ 'vitally',
+ 'vitamins',
+ 'vivacious',
+ 'vividly',
+ 'vividness',
+ 'vixen',
+ 'vocalist',
+ 'vocalize',
+ 'vocally',
+ 'vocation',
+ 'voice',
+ 'voicing',
+ 'void',
+ 'volatile',
+ 'volley',
+ 'voltage',
+ 'volumes',
+ 'voter',
+ 'voting',
+ 'voucher',
+ 'vowed',
+ 'vowel',
+ 'voyage',
+ 'wackiness',
+ 'wad',
+ 'wafer',
+ 'waffle',
+ 'waged',
+ 'wager',
+ 'wages',
+ 'waggle',
+ 'wagon',
+ 'wake',
+ 'waking',
+ 'walk',
+ 'walmart',
+ 'walnut',
+ 'walrus',
+ 'waltz',
+ 'wand',
+ 'wannabe',
+ 'wanted',
+ 'wanting',
+ 'wasabi',
+ 'washable',
+ 'washbasin',
+ 'washboard',
+ 'washbowl',
+ 'washcloth',
+ 'washday',
+ 'washed',
+ 'washer',
+ 'washhouse',
+ 'washing',
+ 'washout',
+ 'washroom',
+ 'washstand',
+ 'washtub',
+ 'wasp',
+ 'wasting',
+ 'watch',
+ 'water',
+ 'waviness',
+ 'waving',
+ 'wavy',
+ 'whacking',
+ 'whacky',
+ 'wham',
+ 'wharf',
+ 'wheat',
+ 'whenever',
+ 'whiff',
+ 'whimsical',
+ 'whinny',
+ 'whiny',
+ 'whisking',
+ 'whoever',
+ 'whole',
+ 'whomever',
+ 'whoopee',
+ 'whooping',
+ 'whoops',
+ 'why',
+ 'wick',
+ 'widely',
+ 'widen',
+ 'widget',
+ 'widow',
+ 'width',
+ 'wieldable',
+ 'wielder',
+ 'wife',
+ 'wifi',
+ 'wikipedia',
+ 'wildcard',
+ 'wildcat',
+ 'wilder',
+ 'wildfire',
+ 'wildfowl',
+ 'wildland',
+ 'wildlife',
+ 'wildly',
+ 'wildness',
+ 'willed',
+ 'willfully',
+ 'willing',
+ 'willow',
+ 'willpower',
+ 'wilt',
+ 'wimp',
+ 'wince',
+ 'wincing',
+ 'wind',
+ 'wing',
+ 'winking',
+ 'winner',
+ 'winnings',
+ 'winter',
+ 'wipe',
+ 'wired',
+ 'wireless',
+ 'wiring',
+ 'wiry',
+ 'wisdom',
+ 'wise',
+ 'wish',
+ 'wisplike',
+ 'wispy',
+ 'wistful',
+ 'wizard',
+ 'wobble',
+ 'wobbling',
+ 'wobbly',
+ 'wok',
+ 'wolf',
+ 'wolverine',
+ 'womanhood',
+ 'womankind',
+ 'womanless',
+ 'womanlike',
+ 'womanly',
+ 'womb',
+ 'woof',
+ 'wooing',
+ 'wool',
+ 'woozy',
+ 'word',
+ 'work',
+ 'worried',
+ 'worrier',
+ 'worrisome',
+ 'worry',
+ 'worsening',
+ 'worshiper',
+ 'worst',
+ 'wound',
+ 'woven',
+ 'wow',
+ 'wrangle',
+ 'wrath',
+ 'wreath',
+ 'wreckage',
+ 'wrecker',
+ 'wrecking',
+ 'wrench',
+ 'wriggle',
+ 'wriggly',
+ 'wrinkle',
+ 'wrinkly',
+ 'wrist',
+ 'writing',
+ 'written',
+ 'wrongdoer',
+ 'wronged',
+ 'wrongful',
+ 'wrongly',
+ 'wrongness',
+ 'wrought',
+ 'xbox',
+ 'xerox',
+ 'yahoo',
+ 'yam',
+ 'yanking',
+ 'yapping',
+ 'yard',
+ 'yarn',
+ 'yeah',
+ 'yearbook',
+ 'yearling',
+ 'yearly',
+ 'yearning',
+ 'yeast',
+ 'yelling',
+ 'yelp',
+ 'yen',
+ 'yesterday',
+ 'yiddish',
+ 'yield',
+ 'yin',
+ 'yippee',
+ 'yo-yo',
+ 'yodel',
+ 'yoga',
+ 'yogurt',
+ 'yonder',
+ 'yoyo',
+ 'yummy',
+ 'zap',
+ 'zealous',
+ 'zebra',
+ 'zen',
+ 'zeppelin',
+ 'zero',
+ 'zestfully',
+ 'zesty',
+ 'zigzagged',
+ 'zipfile',
+ 'zipping',
+ 'zippy',
+ 'zips',
+ 'zit',
+ 'zodiac',
+ 'zombie',
+ 'zone',
+ 'zoning',
+ 'zookeeper',
+ 'zoologist',
+ 'zoology',
+ 'zoom',
+];
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/api/cardApi.ts":
+/*!************************************************!*\
+ !*** ./jslib/common/src/models/api/cardApi.ts ***!
+ \************************************************/
+/*! exports provided: CardApi */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CardApi", function() { return CardApi; });
+/* harmony import */ var _response_baseResponse__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../response/baseResponse */ "./jslib/common/src/models/response/baseResponse.ts");
+
+class CardApi extends _response_baseResponse__WEBPACK_IMPORTED_MODULE_0__["BaseResponse"] {
+ constructor(data = null) {
+ super(data);
+ if (data == null) {
+ return;
+ }
+ this.cardholderName = this.getResponseProperty('CardholderName');
+ this.brand = this.getResponseProperty('Brand');
+ this.number = this.getResponseProperty('Number');
+ this.expMonth = this.getResponseProperty('ExpMonth');
+ this.expYear = this.getResponseProperty('ExpYear');
+ this.code = this.getResponseProperty('Code');
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/api/fieldApi.ts":
+/*!*************************************************!*\
+ !*** ./jslib/common/src/models/api/fieldApi.ts ***!
+ \*************************************************/
+/*! exports provided: FieldApi */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FieldApi", function() { return FieldApi; });
+/* harmony import */ var _response_baseResponse__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../response/baseResponse */ "./jslib/common/src/models/response/baseResponse.ts");
+
+class FieldApi extends _response_baseResponse__WEBPACK_IMPORTED_MODULE_0__["BaseResponse"] {
+ constructor(data = null) {
+ super(data);
+ if (data == null) {
+ return;
+ }
+ this.type = this.getResponseProperty('Type');
+ this.name = this.getResponseProperty('Name');
+ this.value = this.getResponseProperty('Value');
+ this.linkedId = this.getResponseProperty('linkedId');
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/api/identityApi.ts":
+/*!****************************************************!*\
+ !*** ./jslib/common/src/models/api/identityApi.ts ***!
+ \****************************************************/
+/*! exports provided: IdentityApi */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "IdentityApi", function() { return IdentityApi; });
+/* harmony import */ var _response_baseResponse__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../response/baseResponse */ "./jslib/common/src/models/response/baseResponse.ts");
+
+class IdentityApi extends _response_baseResponse__WEBPACK_IMPORTED_MODULE_0__["BaseResponse"] {
+ constructor(data = null) {
+ super(data);
+ if (data == null) {
+ return;
+ }
+ this.title = this.getResponseProperty('Title');
+ this.firstName = this.getResponseProperty('FirstName');
+ this.middleName = this.getResponseProperty('MiddleName');
+ this.lastName = this.getResponseProperty('LastName');
+ this.address1 = this.getResponseProperty('Address1');
+ this.address2 = this.getResponseProperty('Address2');
+ this.address3 = this.getResponseProperty('Address3');
+ this.city = this.getResponseProperty('City');
+ this.state = this.getResponseProperty('State');
+ this.postalCode = this.getResponseProperty('PostalCode');
+ this.country = this.getResponseProperty('Country');
+ this.company = this.getResponseProperty('Company');
+ this.email = this.getResponseProperty('Email');
+ this.phone = this.getResponseProperty('Phone');
+ this.ssn = this.getResponseProperty('SSN');
+ this.username = this.getResponseProperty('Username');
+ this.passportNumber = this.getResponseProperty('PassportNumber');
+ this.licenseNumber = this.getResponseProperty('LicenseNumber');
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/api/loginApi.ts":
+/*!*************************************************!*\
+ !*** ./jslib/common/src/models/api/loginApi.ts ***!
+ \*************************************************/
+/*! exports provided: LoginApi */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LoginApi", function() { return LoginApi; });
+/* harmony import */ var _response_baseResponse__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../response/baseResponse */ "./jslib/common/src/models/response/baseResponse.ts");
+/* harmony import */ var _loginUriApi__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./loginUriApi */ "./jslib/common/src/models/api/loginUriApi.ts");
+
+
+class LoginApi extends _response_baseResponse__WEBPACK_IMPORTED_MODULE_0__["BaseResponse"] {
+ constructor(data = null) {
+ super(data);
+ if (data == null) {
+ return;
+ }
+ this.username = this.getResponseProperty('Username');
+ this.password = this.getResponseProperty('Password');
+ this.passwordRevisionDate = this.getResponseProperty('PasswordRevisionDate');
+ this.totp = this.getResponseProperty('Totp');
+ this.autofillOnPageLoad = this.getResponseProperty('AutofillOnPageLoad');
+ const uris = this.getResponseProperty('Uris');
+ if (uris != null) {
+ this.uris = uris.map((u) => new _loginUriApi__WEBPACK_IMPORTED_MODULE_1__["LoginUriApi"](u));
+ }
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/api/loginUriApi.ts":
+/*!****************************************************!*\
+ !*** ./jslib/common/src/models/api/loginUriApi.ts ***!
+ \****************************************************/
+/*! exports provided: LoginUriApi */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LoginUriApi", function() { return LoginUriApi; });
+/* harmony import */ var _response_baseResponse__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../response/baseResponse */ "./jslib/common/src/models/response/baseResponse.ts");
+
+class LoginUriApi extends _response_baseResponse__WEBPACK_IMPORTED_MODULE_0__["BaseResponse"] {
+ constructor(data = null) {
+ super(data);
+ this.match = null;
+ if (data == null) {
+ return;
+ }
+ this.uri = this.getResponseProperty('Uri');
+ const match = this.getResponseProperty('Match');
+ this.match = match != null ? match : null;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/api/permissionsApi.ts":
+/*!*******************************************************!*\
+ !*** ./jslib/common/src/models/api/permissionsApi.ts ***!
+ \*******************************************************/
+/*! exports provided: PermissionsApi */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PermissionsApi", function() { return PermissionsApi; });
+/* harmony import */ var _response_baseResponse__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../response/baseResponse */ "./jslib/common/src/models/response/baseResponse.ts");
+
+class PermissionsApi extends _response_baseResponse__WEBPACK_IMPORTED_MODULE_0__["BaseResponse"] {
+ constructor(data = null) {
+ super(data);
+ if (data == null) {
+ return this;
+ }
+ this.accessEventLogs = this.getResponseProperty('AccessEventLogs');
+ this.accessImportExport = this.getResponseProperty('AccessImportExport');
+ this.accessReports = this.getResponseProperty('AccessReports');
+ // For backwards compatibility with Server <= 1.43.0
+ this.manageAllCollections = this.getResponseProperty('ManageAllCollections');
+ this.manageAssignedCollections = this.getResponseProperty('ManageAssignedCollections');
+ this.createNewCollections = this.getResponseProperty('CreateNewCollections');
+ this.editAnyCollection = this.getResponseProperty('EditAnyCollection');
+ this.deleteAnyCollection = this.getResponseProperty('DeleteAnyCollection');
+ this.editAssignedCollections = this.getResponseProperty('EditAssignedCollections');
+ this.deleteAssignedCollections = this.getResponseProperty('DeleteAssignedCollections');
+ this.manageCiphers = this.getResponseProperty('ManageCiphers');
+ this.manageGroups = this.getResponseProperty('ManageGroups');
+ this.manageSso = this.getResponseProperty('ManageSso');
+ this.managePolicies = this.getResponseProperty('ManagePolicies');
+ this.manageUsers = this.getResponseProperty('ManageUsers');
+ this.manageResetPassword = this.getResponseProperty('ManageResetPassword');
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/api/secureNoteApi.ts":
+/*!******************************************************!*\
+ !*** ./jslib/common/src/models/api/secureNoteApi.ts ***!
+ \******************************************************/
+/*! exports provided: SecureNoteApi */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SecureNoteApi", function() { return SecureNoteApi; });
+/* harmony import */ var _response_baseResponse__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../response/baseResponse */ "./jslib/common/src/models/response/baseResponse.ts");
+
+class SecureNoteApi extends _response_baseResponse__WEBPACK_IMPORTED_MODULE_0__["BaseResponse"] {
+ constructor(data = null) {
+ super(data);
+ if (data == null) {
+ return;
+ }
+ this.type = this.getResponseProperty('Type');
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/api/sendFileApi.ts":
+/*!****************************************************!*\
+ !*** ./jslib/common/src/models/api/sendFileApi.ts ***!
+ \****************************************************/
+/*! exports provided: SendFileApi */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SendFileApi", function() { return SendFileApi; });
+/* harmony import */ var _response_baseResponse__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../response/baseResponse */ "./jslib/common/src/models/response/baseResponse.ts");
+
+class SendFileApi extends _response_baseResponse__WEBPACK_IMPORTED_MODULE_0__["BaseResponse"] {
+ constructor(data = null) {
+ super(data);
+ if (data == null) {
+ return;
+ }
+ this.id = this.getResponseProperty('Id');
+ this.fileName = this.getResponseProperty('FileName');
+ this.key = this.getResponseProperty('Key');
+ this.size = this.getResponseProperty('Size');
+ this.sizeName = this.getResponseProperty('SizeName');
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/api/sendTextApi.ts":
+/*!****************************************************!*\
+ !*** ./jslib/common/src/models/api/sendTextApi.ts ***!
+ \****************************************************/
+/*! exports provided: SendTextApi */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SendTextApi", function() { return SendTextApi; });
+/* harmony import */ var _response_baseResponse__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../response/baseResponse */ "./jslib/common/src/models/response/baseResponse.ts");
+
+class SendTextApi extends _response_baseResponse__WEBPACK_IMPORTED_MODULE_0__["BaseResponse"] {
+ constructor(data = null) {
+ super(data);
+ if (data == null) {
+ return;
+ }
+ this.text = this.getResponseProperty('Text');
+ this.hidden = this.getResponseProperty('Hidden') || false;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/api/ssoConfigApi.ts":
+/*!*****************************************************!*\
+ !*** ./jslib/common/src/models/api/ssoConfigApi.ts ***!
+ \*****************************************************/
+/*! exports provided: SsoConfigApi */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SsoConfigApi", function() { return SsoConfigApi; });
+/* harmony import */ var _response_baseResponse__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../response/baseResponse */ "./jslib/common/src/models/response/baseResponse.ts");
+
+var SsoType;
+(function (SsoType) {
+ SsoType[SsoType["OpenIdConnect"] = 1] = "OpenIdConnect";
+ SsoType[SsoType["Saml2"] = 2] = "Saml2";
+})(SsoType || (SsoType = {}));
+var OpenIdConnectRedirectBehavior;
+(function (OpenIdConnectRedirectBehavior) {
+ OpenIdConnectRedirectBehavior[OpenIdConnectRedirectBehavior["RedirectGet"] = 0] = "RedirectGet";
+ OpenIdConnectRedirectBehavior[OpenIdConnectRedirectBehavior["FormPost"] = 1] = "FormPost";
+})(OpenIdConnectRedirectBehavior || (OpenIdConnectRedirectBehavior = {}));
+var Saml2BindingType;
+(function (Saml2BindingType) {
+ Saml2BindingType[Saml2BindingType["HttpRedirect"] = 1] = "HttpRedirect";
+ Saml2BindingType[Saml2BindingType["HttpPost"] = 2] = "HttpPost";
+ Saml2BindingType[Saml2BindingType["Artifact"] = 4] = "Artifact";
+})(Saml2BindingType || (Saml2BindingType = {}));
+var Saml2NameIdFormat;
+(function (Saml2NameIdFormat) {
+ Saml2NameIdFormat[Saml2NameIdFormat["NotConfigured"] = 0] = "NotConfigured";
+ Saml2NameIdFormat[Saml2NameIdFormat["Unspecified"] = 1] = "Unspecified";
+ Saml2NameIdFormat[Saml2NameIdFormat["EmailAddress"] = 2] = "EmailAddress";
+ Saml2NameIdFormat[Saml2NameIdFormat["X509SubjectName"] = 3] = "X509SubjectName";
+ Saml2NameIdFormat[Saml2NameIdFormat["WindowsDomainQualifiedName"] = 4] = "WindowsDomainQualifiedName";
+ Saml2NameIdFormat[Saml2NameIdFormat["KerberosPrincipalName"] = 5] = "KerberosPrincipalName";
+ Saml2NameIdFormat[Saml2NameIdFormat["EntityIdentifier"] = 6] = "EntityIdentifier";
+ Saml2NameIdFormat[Saml2NameIdFormat["Persistent"] = 7] = "Persistent";
+ Saml2NameIdFormat[Saml2NameIdFormat["Transient"] = 8] = "Transient";
+})(Saml2NameIdFormat || (Saml2NameIdFormat = {}));
+var Saml2SigningBehavior;
+(function (Saml2SigningBehavior) {
+ Saml2SigningBehavior[Saml2SigningBehavior["IfIdpWantAuthnRequestsSigned"] = 0] = "IfIdpWantAuthnRequestsSigned";
+ Saml2SigningBehavior[Saml2SigningBehavior["Always"] = 1] = "Always";
+ Saml2SigningBehavior[Saml2SigningBehavior["Never"] = 3] = "Never";
+})(Saml2SigningBehavior || (Saml2SigningBehavior = {}));
+class SsoConfigApi extends _response_baseResponse__WEBPACK_IMPORTED_MODULE_0__["BaseResponse"] {
+ constructor(data = null) {
+ super(data);
+ if (data == null) {
+ return;
+ }
+ this.configType = this.getResponseProperty('ConfigType');
+ this.useCryptoAgent = this.getResponseProperty('UseCryptoAgent');
+ this.cryptoAgentUrl = this.getResponseProperty('CryptoAgentUrl');
+ this.authority = this.getResponseProperty('Authority');
+ this.clientId = this.getResponseProperty('ClientId');
+ this.clientSecret = this.getResponseProperty('ClientSecret');
+ this.metadataAddress = this.getResponseProperty('MetadataAddress');
+ this.redirectBehavior = this.getResponseProperty('RedirectBehavior');
+ this.getClaimsFromUserInfoEndpoint = this.getResponseProperty('GetClaimsFromUserInfoEndpoint');
+ this.additionalScopes = this.getResponseProperty('AdditionalScopes');
+ this.additionalUserIdClaimTypes = this.getResponseProperty('AdditionalUserIdClaimTypes');
+ this.additionalEmailClaimTypes = this.getResponseProperty('AdditionalEmailClaimTypes');
+ this.additionalNameClaimTypes = this.getResponseProperty('AdditionalNameClaimTypes');
+ this.acrValues = this.getResponseProperty('AcrValues');
+ this.expectedReturnAcrValue = this.getResponseProperty('ExpectedReturnAcrValue');
+ this.spNameIdFormat = this.getResponseProperty('SpNameIdFormat');
+ this.spOutboundSigningAlgorithm = this.getResponseProperty('SpOutboundSigningAlgorithm');
+ this.spSigningBehavior = this.getResponseProperty('SpSigningBehavior');
+ this.spMinIncomingSigningAlgorithm = this.getResponseProperty('SpMinIncomingSigningAlgorithm');
+ this.spWantAssertionsSigned = this.getResponseProperty('SpWantAssertionsSigned');
+ this.spValidateCertificates = this.getResponseProperty('SpValidateCertificates');
+ this.idpEntityId = this.getResponseProperty('IdpEntityId');
+ this.idpBindingType = this.getResponseProperty('IdpBindingType');
+ this.idpSingleSignOnServiceUrl = this.getResponseProperty('IdpSingleSignOnServiceUrl');
+ this.idpSingleLogoutServiceUrl = this.getResponseProperty('IdpSingleLogoutServiceUrl');
+ this.idpArtifactResolutionServiceUrl = this.getResponseProperty('IdpArtifactResolutionServiceUrl');
+ this.idpX509PublicCert = this.getResponseProperty('IdpX509PublicCert');
+ this.idpOutboundSigningAlgorithm = this.getResponseProperty('IdpOutboundSigningAlgorithm');
+ this.idpAllowUnsolicitedAuthnResponse = this.getResponseProperty('IdpAllowUnsolicitedAuthnResponse');
+ this.idpDisableOutboundLogoutRequests = this.getResponseProperty('IdpDisableOutboundLogoutRequests');
+ this.idpWantAuthnRequestsSigned = this.getResponseProperty('IdpWantAuthnRequestsSigned');
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/data/attachmentData.ts":
+/*!********************************************************!*\
+ !*** ./jslib/common/src/models/data/attachmentData.ts ***!
+ \********************************************************/
+/*! exports provided: AttachmentData */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AttachmentData", function() { return AttachmentData; });
+class AttachmentData {
+ constructor(response) {
+ if (response == null) {
+ return;
+ }
+ this.id = response.id;
+ this.url = response.url;
+ this.fileName = response.fileName;
+ this.key = response.key;
+ this.size = response.size;
+ this.sizeName = response.sizeName;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/data/cardData.ts":
+/*!**************************************************!*\
+ !*** ./jslib/common/src/models/data/cardData.ts ***!
+ \**************************************************/
+/*! exports provided: CardData */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CardData", function() { return CardData; });
+class CardData {
+ constructor(data) {
+ if (data == null) {
+ return;
+ }
+ this.cardholderName = data.cardholderName;
+ this.brand = data.brand;
+ this.number = data.number;
+ this.expMonth = data.expMonth;
+ this.expYear = data.expYear;
+ this.code = data.code;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/data/cipherData.ts":
+/*!****************************************************!*\
+ !*** ./jslib/common/src/models/data/cipherData.ts ***!
+ \****************************************************/
+/*! exports provided: CipherData */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CipherData", function() { return CipherData; });
+/* harmony import */ var _enums_cipherType__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../enums/cipherType */ "./jslib/common/src/enums/cipherType.ts");
+/* harmony import */ var _attachmentData__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./attachmentData */ "./jslib/common/src/models/data/attachmentData.ts");
+/* harmony import */ var _cardData__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./cardData */ "./jslib/common/src/models/data/cardData.ts");
+/* harmony import */ var _fieldData__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./fieldData */ "./jslib/common/src/models/data/fieldData.ts");
+/* harmony import */ var _identityData__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./identityData */ "./jslib/common/src/models/data/identityData.ts");
+/* harmony import */ var _loginData__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./loginData */ "./jslib/common/src/models/data/loginData.ts");
+/* harmony import */ var _passwordHistoryData__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./passwordHistoryData */ "./jslib/common/src/models/data/passwordHistoryData.ts");
+/* harmony import */ var _secureNoteData__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./secureNoteData */ "./jslib/common/src/models/data/secureNoteData.ts");
+
+
+
+
+
+
+
+
+class CipherData {
+ constructor(response, userId, collectionIds) {
+ if (response == null) {
+ return;
+ }
+ this.id = response.id;
+ this.organizationId = response.organizationId;
+ this.folderId = response.folderId;
+ this.userId = userId;
+ this.edit = response.edit;
+ this.viewPassword = response.viewPassword;
+ this.organizationUseTotp = response.organizationUseTotp;
+ this.favorite = response.favorite;
+ this.revisionDate = response.revisionDate;
+ this.type = response.type;
+ this.name = response.name;
+ this.notes = response.notes;
+ this.collectionIds = collectionIds != null ? collectionIds : response.collectionIds;
+ this.deletedDate = response.deletedDate;
+ this.reprompt = response.reprompt;
+ switch (this.type) {
+ case _enums_cipherType__WEBPACK_IMPORTED_MODULE_0__["CipherType"].Login:
+ this.login = new _loginData__WEBPACK_IMPORTED_MODULE_5__["LoginData"](response.login);
+ break;
+ case _enums_cipherType__WEBPACK_IMPORTED_MODULE_0__["CipherType"].SecureNote:
+ this.secureNote = new _secureNoteData__WEBPACK_IMPORTED_MODULE_7__["SecureNoteData"](response.secureNote);
+ break;
+ case _enums_cipherType__WEBPACK_IMPORTED_MODULE_0__["CipherType"].Card:
+ this.card = new _cardData__WEBPACK_IMPORTED_MODULE_2__["CardData"](response.card);
+ break;
+ case _enums_cipherType__WEBPACK_IMPORTED_MODULE_0__["CipherType"].Identity:
+ this.identity = new _identityData__WEBPACK_IMPORTED_MODULE_4__["IdentityData"](response.identity);
+ break;
+ default:
+ break;
+ }
+ if (response.fields != null) {
+ this.fields = response.fields.map(f => new _fieldData__WEBPACK_IMPORTED_MODULE_3__["FieldData"](f));
+ }
+ if (response.attachments != null) {
+ this.attachments = response.attachments.map(a => new _attachmentData__WEBPACK_IMPORTED_MODULE_1__["AttachmentData"](a));
+ }
+ if (response.passwordHistory != null) {
+ this.passwordHistory = response.passwordHistory.map(ph => new _passwordHistoryData__WEBPACK_IMPORTED_MODULE_6__["PasswordHistoryData"](ph));
+ }
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/data/collectionData.ts":
+/*!********************************************************!*\
+ !*** ./jslib/common/src/models/data/collectionData.ts ***!
+ \********************************************************/
+/*! exports provided: CollectionData */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CollectionData", function() { return CollectionData; });
+class CollectionData {
+ constructor(response) {
+ this.id = response.id;
+ this.organizationId = response.organizationId;
+ this.name = response.name;
+ this.externalId = response.externalId;
+ this.readOnly = response.readOnly;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/data/eventData.ts":
+/*!***************************************************!*\
+ !*** ./jslib/common/src/models/data/eventData.ts ***!
+ \***************************************************/
+/*! exports provided: EventData */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "EventData", function() { return EventData; });
+class EventData {
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/data/fieldData.ts":
+/*!***************************************************!*\
+ !*** ./jslib/common/src/models/data/fieldData.ts ***!
+ \***************************************************/
+/*! exports provided: FieldData */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FieldData", function() { return FieldData; });
+class FieldData {
+ constructor(response) {
+ if (response == null) {
+ return;
+ }
+ this.type = response.type;
+ this.name = response.name;
+ this.value = response.value;
+ this.linkedId = response.linkedId;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/data/folderData.ts":
+/*!****************************************************!*\
+ !*** ./jslib/common/src/models/data/folderData.ts ***!
+ \****************************************************/
+/*! exports provided: FolderData */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FolderData", function() { return FolderData; });
+class FolderData {
+ constructor(response, userId) {
+ this.userId = userId;
+ this.name = response.name;
+ this.id = response.id;
+ this.revisionDate = response.revisionDate;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/data/identityData.ts":
+/*!******************************************************!*\
+ !*** ./jslib/common/src/models/data/identityData.ts ***!
+ \******************************************************/
+/*! exports provided: IdentityData */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "IdentityData", function() { return IdentityData; });
+class IdentityData {
+ constructor(data) {
+ if (data == null) {
+ return;
+ }
+ this.title = data.title;
+ this.firstName = data.firstName;
+ this.middleName = data.middleName;
+ this.lastName = data.lastName;
+ this.address1 = data.address1;
+ this.address2 = data.address2;
+ this.address3 = data.address3;
+ this.city = data.city;
+ this.state = data.state;
+ this.postalCode = data.postalCode;
+ this.country = data.country;
+ this.company = data.company;
+ this.email = data.email;
+ this.phone = data.phone;
+ this.ssn = data.ssn;
+ this.username = data.username;
+ this.passportNumber = data.passportNumber;
+ this.licenseNumber = data.licenseNumber;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/data/loginData.ts":
+/*!***************************************************!*\
+ !*** ./jslib/common/src/models/data/loginData.ts ***!
+ \***************************************************/
+/*! exports provided: LoginData */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LoginData", function() { return LoginData; });
+/* harmony import */ var _loginUriData__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./loginUriData */ "./jslib/common/src/models/data/loginUriData.ts");
+
+class LoginData {
+ constructor(data) {
+ if (data == null) {
+ return;
+ }
+ this.username = data.username;
+ this.password = data.password;
+ this.passwordRevisionDate = data.passwordRevisionDate;
+ this.totp = data.totp;
+ this.autofillOnPageLoad = data.autofillOnPageLoad;
+ if (data.uris) {
+ this.uris = data.uris.map(u => new _loginUriData__WEBPACK_IMPORTED_MODULE_0__["LoginUriData"](u));
+ }
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/data/loginUriData.ts":
+/*!******************************************************!*\
+ !*** ./jslib/common/src/models/data/loginUriData.ts ***!
+ \******************************************************/
+/*! exports provided: LoginUriData */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LoginUriData", function() { return LoginUriData; });
+class LoginUriData {
+ constructor(data) {
+ this.match = null;
+ if (data == null) {
+ return;
+ }
+ this.uri = data.uri;
+ this.match = data.match;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/data/organizationData.ts":
+/*!**********************************************************!*\
+ !*** ./jslib/common/src/models/data/organizationData.ts ***!
+ \**********************************************************/
+/*! exports provided: OrganizationData */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "OrganizationData", function() { return OrganizationData; });
+class OrganizationData {
+ constructor(response) {
+ this.id = response.id;
+ this.name = response.name;
+ this.status = response.status;
+ this.type = response.type;
+ this.enabled = response.enabled;
+ this.usePolicies = response.usePolicies;
+ this.useGroups = response.useGroups;
+ this.useDirectory = response.useDirectory;
+ this.useEvents = response.useEvents;
+ this.useTotp = response.useTotp;
+ this.use2fa = response.use2fa;
+ this.useApi = response.useApi;
+ this.useSso = response.useSso;
+ this.useResetPassword = response.useResetPassword;
+ this.selfHost = response.selfHost;
+ this.usersGetPremium = response.usersGetPremium;
+ this.seats = response.seats;
+ this.maxCollections = response.maxCollections;
+ this.maxStorageGb = response.maxStorageGb;
+ this.ssoBound = response.ssoBound;
+ this.identifier = response.identifier;
+ this.permissions = response.permissions;
+ this.resetPasswordEnrolled = response.resetPasswordEnrolled;
+ this.userId = response.userId;
+ this.hasPublicAndPrivateKeys = response.hasPublicAndPrivateKeys;
+ this.providerId = response.providerId;
+ this.providerName = response.providerName;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/data/passwordHistoryData.ts":
+/*!*************************************************************!*\
+ !*** ./jslib/common/src/models/data/passwordHistoryData.ts ***!
+ \*************************************************************/
+/*! exports provided: PasswordHistoryData */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PasswordHistoryData", function() { return PasswordHistoryData; });
+class PasswordHistoryData {
+ constructor(response) {
+ if (response == null) {
+ return;
+ }
+ this.password = response.password;
+ this.lastUsedDate = response.lastUsedDate;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/data/policyData.ts":
+/*!****************************************************!*\
+ !*** ./jslib/common/src/models/data/policyData.ts ***!
+ \****************************************************/
+/*! exports provided: PolicyData */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PolicyData", function() { return PolicyData; });
+class PolicyData {
+ constructor(response) {
+ this.id = response.id;
+ this.organizationId = response.organizationId;
+ this.type = response.type;
+ this.data = response.data;
+ this.enabled = response.enabled;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/data/providerData.ts":
+/*!******************************************************!*\
+ !*** ./jslib/common/src/models/data/providerData.ts ***!
+ \******************************************************/
+/*! exports provided: ProviderData */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ProviderData", function() { return ProviderData; });
+class ProviderData {
+ constructor(response) {
+ this.id = response.id;
+ this.name = response.name;
+ this.status = response.status;
+ this.type = response.type;
+ this.enabled = response.enabled;
+ this.userId = response.userId;
+ this.useEvents = response.useEvents;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/data/secureNoteData.ts":
+/*!********************************************************!*\
+ !*** ./jslib/common/src/models/data/secureNoteData.ts ***!
+ \********************************************************/
+/*! exports provided: SecureNoteData */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SecureNoteData", function() { return SecureNoteData; });
+class SecureNoteData {
+ constructor(data) {
+ if (data == null) {
+ return;
+ }
+ this.type = data.type;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/data/sendData.ts":
+/*!**************************************************!*\
+ !*** ./jslib/common/src/models/data/sendData.ts ***!
+ \**************************************************/
+/*! exports provided: SendData */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SendData", function() { return SendData; });
+/* harmony import */ var _enums_sendType__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../enums/sendType */ "./jslib/common/src/enums/sendType.ts");
+/* harmony import */ var _sendFileData__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./sendFileData */ "./jslib/common/src/models/data/sendFileData.ts");
+/* harmony import */ var _sendTextData__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./sendTextData */ "./jslib/common/src/models/data/sendTextData.ts");
+
+
+
+class SendData {
+ constructor(response, userId) {
+ if (response == null) {
+ return;
+ }
+ this.id = response.id;
+ this.accessId = response.accessId;
+ this.userId = userId;
+ this.type = response.type;
+ this.name = response.name;
+ this.notes = response.notes;
+ this.key = response.key;
+ this.maxAccessCount = response.maxAccessCount;
+ this.accessCount = response.accessCount;
+ this.revisionDate = response.revisionDate;
+ this.expirationDate = response.expirationDate;
+ this.deletionDate = response.deletionDate;
+ this.password = response.password;
+ this.disabled = response.disable;
+ this.hideEmail = response.hideEmail;
+ switch (this.type) {
+ case _enums_sendType__WEBPACK_IMPORTED_MODULE_0__["SendType"].Text:
+ this.text = new _sendTextData__WEBPACK_IMPORTED_MODULE_2__["SendTextData"](response.text);
+ break;
+ case _enums_sendType__WEBPACK_IMPORTED_MODULE_0__["SendType"].File:
+ this.file = new _sendFileData__WEBPACK_IMPORTED_MODULE_1__["SendFileData"](response.file);
+ break;
+ default:
+ break;
+ }
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/data/sendFileData.ts":
+/*!******************************************************!*\
+ !*** ./jslib/common/src/models/data/sendFileData.ts ***!
+ \******************************************************/
+/*! exports provided: SendFileData */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SendFileData", function() { return SendFileData; });
+class SendFileData {
+ constructor(data) {
+ if (data == null) {
+ return;
+ }
+ this.id = data.id;
+ this.fileName = data.fileName;
+ this.key = data.key;
+ this.size = data.size;
+ this.sizeName = data.sizeName;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/data/sendTextData.ts":
+/*!******************************************************!*\
+ !*** ./jslib/common/src/models/data/sendTextData.ts ***!
+ \******************************************************/
+/*! exports provided: SendTextData */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SendTextData", function() { return SendTextData; });
+class SendTextData {
+ constructor(data) {
+ if (data == null) {
+ return;
+ }
+ this.text = data.text;
+ this.hidden = data.hidden;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/domain/attachment.ts":
+/*!******************************************************!*\
+ !*** ./jslib/common/src/models/domain/attachment.ts ***!
+ \******************************************************/
+/*! exports provided: Attachment */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Attachment", function() { return Attachment; });
+/* harmony import */ var _data_attachmentData__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../data/attachmentData */ "./jslib/common/src/models/data/attachmentData.ts");
+/* harmony import */ var _view_attachmentView__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../view/attachmentView */ "./jslib/common/src/models/view/attachmentView.ts");
+/* harmony import */ var _domainBase__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./domainBase */ "./jslib/common/src/models/domain/domainBase.ts");
+/* harmony import */ var _symmetricCryptoKey__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./symmetricCryptoKey */ "./jslib/common/src/models/domain/symmetricCryptoKey.ts");
+/* harmony import */ var _misc_utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../misc/utils */ "./jslib/common/src/misc/utils.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+
+
+
+class Attachment extends _domainBase__WEBPACK_IMPORTED_MODULE_2__["default"] {
+ constructor(obj, alreadyEncrypted = false) {
+ super();
+ if (obj == null) {
+ return;
+ }
+ this.size = obj.size;
+ this.buildDomainModel(this, obj, {
+ id: null,
+ url: null,
+ sizeName: null,
+ fileName: null,
+ key: null,
+ }, alreadyEncrypted, ['id', 'url', 'sizeName']);
+ }
+ decrypt(orgId, encKey) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const view = yield this.decryptObj(new _view_attachmentView__WEBPACK_IMPORTED_MODULE_1__["AttachmentView"](this), {
+ fileName: null,
+ }, orgId, encKey);
+ if (this.key != null) {
+ let cryptoService;
+ const containerService = _misc_utils__WEBPACK_IMPORTED_MODULE_4__["Utils"].global.bitwardenContainerService;
+ if (containerService) {
+ cryptoService = containerService.getCryptoService();
+ }
+ else {
+ throw new Error('global bitwardenContainerService not initialized.');
+ }
+ try {
+ const orgKey = yield cryptoService.getOrgKey(orgId);
+ const decValue = yield cryptoService.decryptToBytes(this.key, orgKey !== null && orgKey !== void 0 ? orgKey : encKey);
+ view.key = new _symmetricCryptoKey__WEBPACK_IMPORTED_MODULE_3__["SymmetricCryptoKey"](decValue);
+ }
+ catch (e) {
+ // TODO: error?
+ }
+ }
+ return view;
+ });
+ }
+ toAttachmentData() {
+ const a = new _data_attachmentData__WEBPACK_IMPORTED_MODULE_0__["AttachmentData"]();
+ a.size = this.size;
+ this.buildDataModel(this, a, {
+ id: null,
+ url: null,
+ sizeName: null,
+ fileName: null,
+ key: null,
+ }, ['id', 'url', 'sizeName']);
+ return a;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/domain/authResult.ts":
+/*!******************************************************!*\
+ !*** ./jslib/common/src/models/domain/authResult.ts ***!
+ \******************************************************/
+/*! exports provided: AuthResult */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AuthResult", function() { return AuthResult; });
+class AuthResult {
+ constructor() {
+ this.twoFactor = false;
+ this.captchaSiteKey = '';
+ this.resetMasterPassword = false;
+ this.forcePasswordReset = false;
+ this.twoFactorProviders = null;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/domain/card.ts":
+/*!************************************************!*\
+ !*** ./jslib/common/src/models/domain/card.ts ***!
+ \************************************************/
+/*! exports provided: Card */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Card", function() { return Card; });
+/* harmony import */ var _data_cardData__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../data/cardData */ "./jslib/common/src/models/data/cardData.ts");
+/* harmony import */ var _domainBase__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./domainBase */ "./jslib/common/src/models/domain/domainBase.ts");
+/* harmony import */ var _view_cardView__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../view/cardView */ "./jslib/common/src/models/view/cardView.ts");
+
+
+
+class Card extends _domainBase__WEBPACK_IMPORTED_MODULE_1__["default"] {
+ constructor(obj, alreadyEncrypted = false) {
+ super();
+ if (obj == null) {
+ return;
+ }
+ this.buildDomainModel(this, obj, {
+ cardholderName: null,
+ brand: null,
+ number: null,
+ expMonth: null,
+ expYear: null,
+ code: null,
+ }, alreadyEncrypted, []);
+ }
+ decrypt(orgId, encKey) {
+ return this.decryptObj(new _view_cardView__WEBPACK_IMPORTED_MODULE_2__["CardView"](this), {
+ cardholderName: null,
+ brand: null,
+ number: null,
+ expMonth: null,
+ expYear: null,
+ code: null,
+ }, orgId, encKey);
+ }
+ toCardData() {
+ const c = new _data_cardData__WEBPACK_IMPORTED_MODULE_0__["CardData"]();
+ this.buildDataModel(this, c, {
+ cardholderName: null,
+ brand: null,
+ number: null,
+ expMonth: null,
+ expYear: null,
+ code: null,
+ });
+ return c;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/domain/cipher.ts":
+/*!**************************************************!*\
+ !*** ./jslib/common/src/models/domain/cipher.ts ***!
+ \**************************************************/
+/*! exports provided: Cipher */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Cipher", function() { return Cipher; });
+/* harmony import */ var _enums_cipherType__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../enums/cipherType */ "./jslib/common/src/enums/cipherType.ts");
+/* harmony import */ var _data_cipherData__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../data/cipherData */ "./jslib/common/src/models/data/cipherData.ts");
+/* harmony import */ var _view_cipherView__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../view/cipherView */ "./jslib/common/src/models/view/cipherView.ts");
+/* harmony import */ var _attachment__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./attachment */ "./jslib/common/src/models/domain/attachment.ts");
+/* harmony import */ var _card__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./card */ "./jslib/common/src/models/domain/card.ts");
+/* harmony import */ var _domainBase__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./domainBase */ "./jslib/common/src/models/domain/domainBase.ts");
+/* harmony import */ var _field__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./field */ "./jslib/common/src/models/domain/field.ts");
+/* harmony import */ var _identity__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./identity */ "./jslib/common/src/models/domain/identity.ts");
+/* harmony import */ var _login__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./login */ "./jslib/common/src/models/domain/login.ts");
+/* harmony import */ var _password__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./password */ "./jslib/common/src/models/domain/password.ts");
+/* harmony import */ var _secureNote__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./secureNote */ "./jslib/common/src/models/domain/secureNote.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+
+
+
+
+
+
+
+
+
+class Cipher extends _domainBase__WEBPACK_IMPORTED_MODULE_5__["default"] {
+ constructor(obj, alreadyEncrypted = false, localData = null) {
+ super();
+ if (obj == null) {
+ return;
+ }
+ this.buildDomainModel(this, obj, {
+ id: null,
+ userId: null,
+ organizationId: null,
+ folderId: null,
+ name: null,
+ notes: null,
+ }, alreadyEncrypted, ['id', 'userId', 'organizationId', 'folderId']);
+ this.type = obj.type;
+ this.favorite = obj.favorite;
+ this.organizationUseTotp = obj.organizationUseTotp;
+ this.edit = obj.edit;
+ if (obj.viewPassword != null) {
+ this.viewPassword = obj.viewPassword;
+ }
+ else {
+ this.viewPassword = true; // Default for already synced Ciphers without viewPassword
+ }
+ this.revisionDate = obj.revisionDate != null ? new Date(obj.revisionDate) : null;
+ this.collectionIds = obj.collectionIds;
+ this.localData = localData;
+ this.deletedDate = obj.deletedDate != null ? new Date(obj.deletedDate) : null;
+ this.reprompt = obj.reprompt;
+ switch (this.type) {
+ case _enums_cipherType__WEBPACK_IMPORTED_MODULE_0__["CipherType"].Login:
+ this.login = new _login__WEBPACK_IMPORTED_MODULE_8__["Login"](obj.login, alreadyEncrypted);
+ break;
+ case _enums_cipherType__WEBPACK_IMPORTED_MODULE_0__["CipherType"].SecureNote:
+ this.secureNote = new _secureNote__WEBPACK_IMPORTED_MODULE_10__["SecureNote"](obj.secureNote, alreadyEncrypted);
+ break;
+ case _enums_cipherType__WEBPACK_IMPORTED_MODULE_0__["CipherType"].Card:
+ this.card = new _card__WEBPACK_IMPORTED_MODULE_4__["Card"](obj.card, alreadyEncrypted);
+ break;
+ case _enums_cipherType__WEBPACK_IMPORTED_MODULE_0__["CipherType"].Identity:
+ this.identity = new _identity__WEBPACK_IMPORTED_MODULE_7__["Identity"](obj.identity, alreadyEncrypted);
+ break;
+ default:
+ break;
+ }
+ if (obj.attachments != null) {
+ this.attachments = obj.attachments.map(a => new _attachment__WEBPACK_IMPORTED_MODULE_3__["Attachment"](a, alreadyEncrypted));
+ }
+ else {
+ this.attachments = null;
+ }
+ if (obj.fields != null) {
+ this.fields = obj.fields.map(f => new _field__WEBPACK_IMPORTED_MODULE_6__["Field"](f, alreadyEncrypted));
+ }
+ else {
+ this.fields = null;
+ }
+ if (obj.passwordHistory != null) {
+ this.passwordHistory = obj.passwordHistory.map(ph => new _password__WEBPACK_IMPORTED_MODULE_9__["Password"](ph, alreadyEncrypted));
+ }
+ else {
+ this.passwordHistory = null;
+ }
+ }
+ decrypt(encKey) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const model = new _view_cipherView__WEBPACK_IMPORTED_MODULE_2__["CipherView"](this);
+ yield this.decryptObj(model, {
+ name: null,
+ notes: null,
+ }, this.organizationId, encKey);
+ switch (this.type) {
+ case _enums_cipherType__WEBPACK_IMPORTED_MODULE_0__["CipherType"].Login:
+ model.login = yield this.login.decrypt(this.organizationId, encKey);
+ break;
+ case _enums_cipherType__WEBPACK_IMPORTED_MODULE_0__["CipherType"].SecureNote:
+ model.secureNote = yield this.secureNote.decrypt(this.organizationId, encKey);
+ break;
+ case _enums_cipherType__WEBPACK_IMPORTED_MODULE_0__["CipherType"].Card:
+ model.card = yield this.card.decrypt(this.organizationId, encKey);
+ break;
+ case _enums_cipherType__WEBPACK_IMPORTED_MODULE_0__["CipherType"].Identity:
+ model.identity = yield this.identity.decrypt(this.organizationId, encKey);
+ break;
+ default:
+ break;
+ }
+ const orgId = this.organizationId;
+ if (this.attachments != null && this.attachments.length > 0) {
+ const attachments = [];
+ yield this.attachments.reduce((promise, attachment) => {
+ return promise.then(() => {
+ return attachment.decrypt(orgId, encKey);
+ }).then(decAttachment => {
+ attachments.push(decAttachment);
+ });
+ }, Promise.resolve());
+ model.attachments = attachments;
+ }
+ if (this.fields != null && this.fields.length > 0) {
+ const fields = [];
+ yield this.fields.reduce((promise, field) => {
+ return promise.then(() => {
+ return field.decrypt(orgId, encKey);
+ }).then(decField => {
+ fields.push(decField);
+ });
+ }, Promise.resolve());
+ model.fields = fields;
+ }
+ if (this.passwordHistory != null && this.passwordHistory.length > 0) {
+ const passwordHistory = [];
+ yield this.passwordHistory.reduce((promise, ph) => {
+ return promise.then(() => {
+ return ph.decrypt(orgId, encKey);
+ }).then(decPh => {
+ passwordHistory.push(decPh);
+ });
+ }, Promise.resolve());
+ model.passwordHistory = passwordHistory;
+ }
+ return model;
+ });
+ }
+ toCipherData(userId) {
+ const c = new _data_cipherData__WEBPACK_IMPORTED_MODULE_1__["CipherData"]();
+ c.id = this.id;
+ c.organizationId = this.organizationId;
+ c.folderId = this.folderId;
+ c.userId = this.organizationId != null ? userId : null;
+ c.edit = this.edit;
+ c.viewPassword = this.viewPassword;
+ c.organizationUseTotp = this.organizationUseTotp;
+ c.favorite = this.favorite;
+ c.revisionDate = this.revisionDate != null ? this.revisionDate.toISOString() : null;
+ c.type = this.type;
+ c.collectionIds = this.collectionIds;
+ c.deletedDate = this.deletedDate != null ? this.deletedDate.toISOString() : null;
+ c.reprompt = this.reprompt;
+ this.buildDataModel(this, c, {
+ name: null,
+ notes: null,
+ });
+ switch (c.type) {
+ case _enums_cipherType__WEBPACK_IMPORTED_MODULE_0__["CipherType"].Login:
+ c.login = this.login.toLoginData();
+ break;
+ case _enums_cipherType__WEBPACK_IMPORTED_MODULE_0__["CipherType"].SecureNote:
+ c.secureNote = this.secureNote.toSecureNoteData();
+ break;
+ case _enums_cipherType__WEBPACK_IMPORTED_MODULE_0__["CipherType"].Card:
+ c.card = this.card.toCardData();
+ break;
+ case _enums_cipherType__WEBPACK_IMPORTED_MODULE_0__["CipherType"].Identity:
+ c.identity = this.identity.toIdentityData();
+ break;
+ default:
+ break;
+ }
+ if (this.fields != null) {
+ c.fields = this.fields.map(f => f.toFieldData());
+ }
+ if (this.attachments != null) {
+ c.attachments = this.attachments.map(a => a.toAttachmentData());
+ }
+ if (this.passwordHistory != null) {
+ c.passwordHistory = this.passwordHistory.map(ph => ph.toPasswordHistoryData());
+ }
+ return c;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/domain/collection.ts":
+/*!******************************************************!*\
+ !*** ./jslib/common/src/models/domain/collection.ts ***!
+ \******************************************************/
+/*! exports provided: Collection */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Collection", function() { return Collection; });
+/* harmony import */ var _view_collectionView__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../view/collectionView */ "./jslib/common/src/models/view/collectionView.ts");
+/* harmony import */ var _domainBase__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./domainBase */ "./jslib/common/src/models/domain/domainBase.ts");
+
+
+class Collection extends _domainBase__WEBPACK_IMPORTED_MODULE_1__["default"] {
+ constructor(obj, alreadyEncrypted = false) {
+ super();
+ if (obj == null) {
+ return;
+ }
+ this.buildDomainModel(this, obj, {
+ id: null,
+ organizationId: null,
+ name: null,
+ externalId: null,
+ readOnly: null,
+ hidePasswords: null,
+ }, alreadyEncrypted, ['id', 'organizationId', 'externalId', 'readOnly', 'hidePasswords']);
+ }
+ decrypt() {
+ return this.decryptObj(new _view_collectionView__WEBPACK_IMPORTED_MODULE_0__["CollectionView"](this), {
+ name: null,
+ }, this.organizationId);
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/domain/decryptParameters.ts":
+/*!*************************************************************!*\
+ !*** ./jslib/common/src/models/domain/decryptParameters.ts ***!
+ \*************************************************************/
+/*! exports provided: DecryptParameters */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "DecryptParameters", function() { return DecryptParameters; });
+class DecryptParameters {
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/domain/domainBase.ts":
+/*!******************************************************!*\
+ !*** ./jslib/common/src/models/domain/domainBase.ts ***!
+ \******************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Domain; });
+/* harmony import */ var _encString__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./encString */ "./jslib/common/src/models/domain/encString.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+class Domain {
+ buildDomainModel(domain, dataObj, map, alreadyEncrypted, notEncList = []) {
+ for (const prop in map) {
+ if (!map.hasOwnProperty(prop)) {
+ continue;
+ }
+ const objProp = dataObj[(map[prop] || prop)];
+ if (alreadyEncrypted === true || notEncList.indexOf(prop) > -1) {
+ domain[prop] = objProp ? objProp : null;
+ }
+ else {
+ domain[prop] = objProp ? new _encString__WEBPACK_IMPORTED_MODULE_0__["EncString"](objProp) : null;
+ }
+ }
+ }
+ buildDataModel(domain, dataObj, map, notEncStringList = []) {
+ for (const prop in map) {
+ if (!map.hasOwnProperty(prop)) {
+ continue;
+ }
+ const objProp = domain[(map[prop] || prop)];
+ if (notEncStringList.indexOf(prop) > -1) {
+ dataObj[prop] = objProp != null ? objProp : null;
+ }
+ else {
+ dataObj[prop] = objProp != null ? objProp.encryptedString : null;
+ }
+ }
+ }
+ decryptObj(viewModel, map, orgId, key = null) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const promises = [];
+ const self = this;
+ for (const prop in map) {
+ if (!map.hasOwnProperty(prop)) {
+ continue;
+ }
+ // tslint:disable-next-line
+ (function (theProp) {
+ const p = Promise.resolve().then(() => {
+ const mapProp = map[theProp] || theProp;
+ if (self[mapProp]) {
+ return self[mapProp].decrypt(orgId, key);
+ }
+ return null;
+ }).then((val) => {
+ viewModel[theProp] = val;
+ });
+ promises.push(p);
+ })(prop);
+ }
+ yield Promise.all(promises);
+ return viewModel;
+ });
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/domain/encArrayBuffer.ts":
+/*!**********************************************************!*\
+ !*** ./jslib/common/src/models/domain/encArrayBuffer.ts ***!
+ \**********************************************************/
+/*! exports provided: EncArrayBuffer */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "EncArrayBuffer", function() { return EncArrayBuffer; });
+class EncArrayBuffer {
+ constructor(buffer) {
+ this.buffer = buffer;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/domain/encString.ts":
+/*!*****************************************************!*\
+ !*** ./jslib/common/src/models/domain/encString.ts ***!
+ \*****************************************************/
+/*! exports provided: EncString */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "EncString", function() { return EncString; });
+/* harmony import */ var _enums_encryptionType__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../enums/encryptionType */ "./jslib/common/src/enums/encryptionType.ts");
+/* harmony import */ var _misc_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../misc/utils */ "./jslib/common/src/misc/utils.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+class EncString {
+ constructor(encryptedStringOrType, data, iv, mac) {
+ if (data != null) {
+ // data and header
+ const encType = encryptedStringOrType;
+ if (iv != null) {
+ this.encryptedString = encType + '.' + iv + '|' + data;
+ }
+ else {
+ this.encryptedString = encType + '.' + data;
+ }
+ // mac
+ if (mac != null) {
+ this.encryptedString += ('|' + mac);
+ }
+ this.encryptionType = encType;
+ this.data = data;
+ this.iv = iv;
+ this.mac = mac;
+ return;
+ }
+ this.encryptedString = encryptedStringOrType;
+ if (!this.encryptedString) {
+ return;
+ }
+ const headerPieces = this.encryptedString.split('.');
+ let encPieces = null;
+ if (headerPieces.length === 2) {
+ try {
+ this.encryptionType = parseInt(headerPieces[0], null);
+ encPieces = headerPieces[1].split('|');
+ }
+ catch (e) {
+ return;
+ }
+ }
+ else {
+ encPieces = this.encryptedString.split('|');
+ this.encryptionType = encPieces.length === 3 ? _enums_encryptionType__WEBPACK_IMPORTED_MODULE_0__["EncryptionType"].AesCbc128_HmacSha256_B64 :
+ _enums_encryptionType__WEBPACK_IMPORTED_MODULE_0__["EncryptionType"].AesCbc256_B64;
+ }
+ switch (this.encryptionType) {
+ case _enums_encryptionType__WEBPACK_IMPORTED_MODULE_0__["EncryptionType"].AesCbc128_HmacSha256_B64:
+ case _enums_encryptionType__WEBPACK_IMPORTED_MODULE_0__["EncryptionType"].AesCbc256_HmacSha256_B64:
+ if (encPieces.length !== 3) {
+ return;
+ }
+ this.iv = encPieces[0];
+ this.data = encPieces[1];
+ this.mac = encPieces[2];
+ break;
+ case _enums_encryptionType__WEBPACK_IMPORTED_MODULE_0__["EncryptionType"].AesCbc256_B64:
+ if (encPieces.length !== 2) {
+ return;
+ }
+ this.iv = encPieces[0];
+ this.data = encPieces[1];
+ break;
+ case _enums_encryptionType__WEBPACK_IMPORTED_MODULE_0__["EncryptionType"].Rsa2048_OaepSha256_B64:
+ case _enums_encryptionType__WEBPACK_IMPORTED_MODULE_0__["EncryptionType"].Rsa2048_OaepSha1_B64:
+ if (encPieces.length !== 1) {
+ return;
+ }
+ this.data = encPieces[0];
+ break;
+ default:
+ return;
+ }
+ }
+ decrypt(orgId, key = null) {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (this.decryptedValue != null) {
+ return this.decryptedValue;
+ }
+ let cryptoService;
+ const containerService = _misc_utils__WEBPACK_IMPORTED_MODULE_1__["Utils"].global.bitwardenContainerService;
+ if (containerService) {
+ cryptoService = containerService.getCryptoService();
+ }
+ else {
+ throw new Error('global bitwardenContainerService not initialized.');
+ }
+ try {
+ if (key == null) {
+ key = yield cryptoService.getOrgKey(orgId);
+ }
+ this.decryptedValue = yield cryptoService.decryptToUtf8(this, key);
+ }
+ catch (e) {
+ this.decryptedValue = '[error: cannot decrypt]';
+ }
+ return this.decryptedValue;
+ });
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/domain/encryptedObject.ts":
+/*!***********************************************************!*\
+ !*** ./jslib/common/src/models/domain/encryptedObject.ts ***!
+ \***********************************************************/
+/*! exports provided: EncryptedObject */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "EncryptedObject", function() { return EncryptedObject; });
+class EncryptedObject {
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/domain/environmentUrls.ts":
+/*!***********************************************************!*\
+ !*** ./jslib/common/src/models/domain/environmentUrls.ts ***!
+ \***********************************************************/
+/*! exports provided: EnvironmentUrls */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "EnvironmentUrls", function() { return EnvironmentUrls; });
+class EnvironmentUrls {
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/domain/field.ts":
+/*!*************************************************!*\
+ !*** ./jslib/common/src/models/domain/field.ts ***!
+ \*************************************************/
+/*! exports provided: Field */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Field", function() { return Field; });
+/* harmony import */ var _data_fieldData__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../data/fieldData */ "./jslib/common/src/models/data/fieldData.ts");
+/* harmony import */ var _domainBase__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./domainBase */ "./jslib/common/src/models/domain/domainBase.ts");
+/* harmony import */ var _view_fieldView__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../view/fieldView */ "./jslib/common/src/models/view/fieldView.ts");
+
+
+
+class Field extends _domainBase__WEBPACK_IMPORTED_MODULE_1__["default"] {
+ constructor(obj, alreadyEncrypted = false) {
+ super();
+ if (obj == null) {
+ return;
+ }
+ this.type = obj.type;
+ this.linkedId = obj.linkedId;
+ this.buildDomainModel(this, obj, {
+ name: null,
+ value: null,
+ }, alreadyEncrypted, []);
+ }
+ decrypt(orgId, encKey) {
+ return this.decryptObj(new _view_fieldView__WEBPACK_IMPORTED_MODULE_2__["FieldView"](this), {
+ name: null,
+ value: null,
+ }, orgId, encKey);
+ }
+ toFieldData() {
+ const f = new _data_fieldData__WEBPACK_IMPORTED_MODULE_0__["FieldData"]();
+ this.buildDataModel(this, f, {
+ name: null,
+ value: null,
+ type: null,
+ linkedId: null,
+ }, ['type', 'linkedId']);
+ return f;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/domain/folder.ts":
+/*!**************************************************!*\
+ !*** ./jslib/common/src/models/domain/folder.ts ***!
+ \**************************************************/
+/*! exports provided: Folder */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Folder", function() { return Folder; });
+/* harmony import */ var _view_folderView__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../view/folderView */ "./jslib/common/src/models/view/folderView.ts");
+/* harmony import */ var _domainBase__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./domainBase */ "./jslib/common/src/models/domain/domainBase.ts");
+
+
+class Folder extends _domainBase__WEBPACK_IMPORTED_MODULE_1__["default"] {
+ constructor(obj, alreadyEncrypted = false) {
+ super();
+ if (obj == null) {
+ return;
+ }
+ this.buildDomainModel(this, obj, {
+ id: null,
+ name: null,
+ }, alreadyEncrypted, ['id']);
+ this.revisionDate = obj.revisionDate != null ? new Date(obj.revisionDate) : null;
+ }
+ decrypt() {
+ return this.decryptObj(new _view_folderView__WEBPACK_IMPORTED_MODULE_0__["FolderView"](this), {
+ name: null,
+ }, null);
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/domain/generatedPasswordHistory.ts":
+/*!********************************************************************!*\
+ !*** ./jslib/common/src/models/domain/generatedPasswordHistory.ts ***!
+ \********************************************************************/
+/*! exports provided: GeneratedPasswordHistory */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "GeneratedPasswordHistory", function() { return GeneratedPasswordHistory; });
+class GeneratedPasswordHistory {
+ constructor(password, date) {
+ this.password = password;
+ this.date = date;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/domain/identity.ts":
+/*!****************************************************!*\
+ !*** ./jslib/common/src/models/domain/identity.ts ***!
+ \****************************************************/
+/*! exports provided: Identity */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Identity", function() { return Identity; });
+/* harmony import */ var _data_identityData__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../data/identityData */ "./jslib/common/src/models/data/identityData.ts");
+/* harmony import */ var _domainBase__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./domainBase */ "./jslib/common/src/models/domain/domainBase.ts");
+/* harmony import */ var _view_identityView__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../view/identityView */ "./jslib/common/src/models/view/identityView.ts");
+
+
+
+class Identity extends _domainBase__WEBPACK_IMPORTED_MODULE_1__["default"] {
+ constructor(obj, alreadyEncrypted = false) {
+ super();
+ if (obj == null) {
+ return;
+ }
+ this.buildDomainModel(this, obj, {
+ title: null,
+ firstName: null,
+ middleName: null,
+ lastName: null,
+ address1: null,
+ address2: null,
+ address3: null,
+ city: null,
+ state: null,
+ postalCode: null,
+ country: null,
+ company: null,
+ email: null,
+ phone: null,
+ ssn: null,
+ username: null,
+ passportNumber: null,
+ licenseNumber: null,
+ }, alreadyEncrypted, []);
+ }
+ decrypt(orgId, encKey) {
+ return this.decryptObj(new _view_identityView__WEBPACK_IMPORTED_MODULE_2__["IdentityView"](this), {
+ title: null,
+ firstName: null,
+ middleName: null,
+ lastName: null,
+ address1: null,
+ address2: null,
+ address3: null,
+ city: null,
+ state: null,
+ postalCode: null,
+ country: null,
+ company: null,
+ email: null,
+ phone: null,
+ ssn: null,
+ username: null,
+ passportNumber: null,
+ licenseNumber: null,
+ }, orgId, encKey);
+ }
+ toIdentityData() {
+ const i = new _data_identityData__WEBPACK_IMPORTED_MODULE_0__["IdentityData"]();
+ this.buildDataModel(this, i, {
+ title: null,
+ firstName: null,
+ middleName: null,
+ lastName: null,
+ address1: null,
+ address2: null,
+ address3: null,
+ city: null,
+ state: null,
+ postalCode: null,
+ country: null,
+ company: null,
+ email: null,
+ phone: null,
+ ssn: null,
+ username: null,
+ passportNumber: null,
+ licenseNumber: null,
+ });
+ return i;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/domain/login.ts":
+/*!*************************************************!*\
+ !*** ./jslib/common/src/models/domain/login.ts ***!
+ \*************************************************/
+/*! exports provided: Login */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Login", function() { return Login; });
+/* harmony import */ var _loginUri__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./loginUri */ "./jslib/common/src/models/domain/loginUri.ts");
+/* harmony import */ var _data_loginData__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../data/loginData */ "./jslib/common/src/models/data/loginData.ts");
+/* harmony import */ var _view_loginView__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../view/loginView */ "./jslib/common/src/models/view/loginView.ts");
+/* harmony import */ var _domainBase__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./domainBase */ "./jslib/common/src/models/domain/domainBase.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+
+
+class Login extends _domainBase__WEBPACK_IMPORTED_MODULE_3__["default"] {
+ constructor(obj, alreadyEncrypted = false) {
+ super();
+ if (obj == null) {
+ return;
+ }
+ this.passwordRevisionDate = obj.passwordRevisionDate != null ? new Date(obj.passwordRevisionDate) : null;
+ this.autofillOnPageLoad = obj.autofillOnPageLoad;
+ this.buildDomainModel(this, obj, {
+ username: null,
+ password: null,
+ totp: null,
+ }, alreadyEncrypted, []);
+ if (obj.uris) {
+ this.uris = [];
+ obj.uris.forEach(u => {
+ this.uris.push(new _loginUri__WEBPACK_IMPORTED_MODULE_0__["LoginUri"](u, alreadyEncrypted));
+ });
+ }
+ }
+ decrypt(orgId, encKey) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const view = yield this.decryptObj(new _view_loginView__WEBPACK_IMPORTED_MODULE_2__["LoginView"](this), {
+ username: null,
+ password: null,
+ totp: null,
+ }, orgId, encKey);
+ if (this.uris != null) {
+ view.uris = [];
+ for (let i = 0; i < this.uris.length; i++) {
+ const uri = yield this.uris[i].decrypt(orgId, encKey);
+ view.uris.push(uri);
+ }
+ }
+ return view;
+ });
+ }
+ toLoginData() {
+ const l = new _data_loginData__WEBPACK_IMPORTED_MODULE_1__["LoginData"]();
+ l.passwordRevisionDate = this.passwordRevisionDate != null ? this.passwordRevisionDate.toISOString() : null;
+ l.autofillOnPageLoad = this.autofillOnPageLoad;
+ this.buildDataModel(this, l, {
+ username: null,
+ password: null,
+ totp: null,
+ });
+ if (this.uris != null && this.uris.length > 0) {
+ l.uris = [];
+ this.uris.forEach(u => {
+ l.uris.push(u.toLoginUriData());
+ });
+ }
+ return l;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/domain/loginUri.ts":
+/*!****************************************************!*\
+ !*** ./jslib/common/src/models/domain/loginUri.ts ***!
+ \****************************************************/
+/*! exports provided: LoginUri */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LoginUri", function() { return LoginUri; });
+/* harmony import */ var _data_loginUriData__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../data/loginUriData */ "./jslib/common/src/models/data/loginUriData.ts");
+/* harmony import */ var _view_loginUriView__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../view/loginUriView */ "./jslib/common/src/models/view/loginUriView.ts");
+/* harmony import */ var _domainBase__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./domainBase */ "./jslib/common/src/models/domain/domainBase.ts");
+
+
+
+class LoginUri extends _domainBase__WEBPACK_IMPORTED_MODULE_2__["default"] {
+ constructor(obj, alreadyEncrypted = false) {
+ super();
+ if (obj == null) {
+ return;
+ }
+ this.match = obj.match;
+ this.buildDomainModel(this, obj, {
+ uri: null,
+ }, alreadyEncrypted, []);
+ }
+ decrypt(orgId, encKey) {
+ return this.decryptObj(new _view_loginUriView__WEBPACK_IMPORTED_MODULE_1__["LoginUriView"](this), {
+ uri: null,
+ }, orgId, encKey);
+ }
+ toLoginUriData() {
+ const u = new _data_loginUriData__WEBPACK_IMPORTED_MODULE_0__["LoginUriData"]();
+ this.buildDataModel(this, u, {
+ uri: null,
+ }, ['match']);
+ return u;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/domain/masterPasswordPolicyOptions.ts":
+/*!***********************************************************************!*\
+ !*** ./jslib/common/src/models/domain/masterPasswordPolicyOptions.ts ***!
+ \***********************************************************************/
+/*! exports provided: MasterPasswordPolicyOptions */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MasterPasswordPolicyOptions", function() { return MasterPasswordPolicyOptions; });
+/* harmony import */ var _domainBase__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./domainBase */ "./jslib/common/src/models/domain/domainBase.ts");
+
+class MasterPasswordPolicyOptions extends _domainBase__WEBPACK_IMPORTED_MODULE_0__["default"] {
+ constructor() {
+ super(...arguments);
+ this.minComplexity = 0;
+ this.minLength = 0;
+ this.requireUpper = false;
+ this.requireLower = false;
+ this.requireNumbers = false;
+ this.requireSpecial = false;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/domain/organization.ts":
+/*!********************************************************!*\
+ !*** ./jslib/common/src/models/domain/organization.ts ***!
+ \********************************************************/
+/*! exports provided: Organization */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Organization", function() { return Organization; });
+/* harmony import */ var _enums_organizationUserStatusType__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../enums/organizationUserStatusType */ "./jslib/common/src/enums/organizationUserStatusType.ts");
+/* harmony import */ var _enums_organizationUserType__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../enums/organizationUserType */ "./jslib/common/src/enums/organizationUserType.ts");
+
+
+class Organization {
+ constructor(obj) {
+ if (obj == null) {
+ return;
+ }
+ this.id = obj.id;
+ this.name = obj.name;
+ this.status = obj.status;
+ this.type = obj.type;
+ this.enabled = obj.enabled;
+ this.usePolicies = obj.usePolicies;
+ this.useGroups = obj.useGroups;
+ this.useDirectory = obj.useDirectory;
+ this.useEvents = obj.useEvents;
+ this.useTotp = obj.useTotp;
+ this.use2fa = obj.use2fa;
+ this.useApi = obj.useApi;
+ this.useSso = obj.useSso;
+ this.useResetPassword = obj.useResetPassword;
+ this.selfHost = obj.selfHost;
+ this.usersGetPremium = obj.usersGetPremium;
+ this.seats = obj.seats;
+ this.maxCollections = obj.maxCollections;
+ this.maxStorageGb = obj.maxStorageGb;
+ this.ssoBound = obj.ssoBound;
+ this.identifier = obj.identifier;
+ this.permissions = obj.permissions;
+ this.resetPasswordEnrolled = obj.resetPasswordEnrolled;
+ this.userId = obj.userId;
+ this.hasPublicAndPrivateKeys = obj.hasPublicAndPrivateKeys;
+ this.providerId = obj.providerId;
+ this.providerName = obj.providerName;
+ this.isProviderUser = obj.isProviderUser;
+ }
+ get canAccess() {
+ if (this.type === _enums_organizationUserType__WEBPACK_IMPORTED_MODULE_1__["OrganizationUserType"].Owner) {
+ return true;
+ }
+ return this.enabled && this.status === _enums_organizationUserStatusType__WEBPACK_IMPORTED_MODULE_0__["OrganizationUserStatusType"].Confirmed;
+ }
+ get isManager() {
+ return this.type === _enums_organizationUserType__WEBPACK_IMPORTED_MODULE_1__["OrganizationUserType"].Manager || this.type === _enums_organizationUserType__WEBPACK_IMPORTED_MODULE_1__["OrganizationUserType"].Owner ||
+ this.type === _enums_organizationUserType__WEBPACK_IMPORTED_MODULE_1__["OrganizationUserType"].Admin;
+ }
+ get isAdmin() {
+ return this.type === _enums_organizationUserType__WEBPACK_IMPORTED_MODULE_1__["OrganizationUserType"].Owner || this.type === _enums_organizationUserType__WEBPACK_IMPORTED_MODULE_1__["OrganizationUserType"].Admin;
+ }
+ get isOwner() {
+ return this.type === _enums_organizationUserType__WEBPACK_IMPORTED_MODULE_1__["OrganizationUserType"].Owner || this.isProviderUser;
+ }
+ get canAccessEventLogs() {
+ return this.isAdmin || this.permissions.accessEventLogs;
+ }
+ get canAccessImportExport() {
+ return this.isAdmin || this.permissions.accessImportExport;
+ }
+ get canAccessReports() {
+ return this.isAdmin || this.permissions.accessReports;
+ }
+ get canCreateNewCollections() {
+ var _a;
+ return this.isManager || ((_a = this.permissions.createNewCollections) !== null && _a !== void 0 ? _a : this.permissions.manageAllCollections);
+ }
+ get canEditAnyCollection() {
+ var _a;
+ return this.isAdmin || ((_a = this.permissions.editAnyCollection) !== null && _a !== void 0 ? _a : this.permissions.manageAllCollections);
+ }
+ get canDeleteAnyCollection() {
+ var _a;
+ return this.isAdmin || ((_a = this.permissions.deleteAnyCollection) !== null && _a !== void 0 ? _a : this.permissions.manageAllCollections);
+ }
+ get canViewAllCollections() {
+ return this.canCreateNewCollections || this.canEditAnyCollection || this.canDeleteAnyCollection;
+ }
+ get canEditAssignedCollections() {
+ var _a;
+ return this.isManager || ((_a = this.permissions.editAssignedCollections) !== null && _a !== void 0 ? _a : this.permissions.manageAssignedCollections);
+ }
+ get canDeleteAssignedCollections() {
+ var _a;
+ return this.isManager || ((_a = this.permissions.deleteAssignedCollections) !== null && _a !== void 0 ? _a : this.permissions.manageAssignedCollections);
+ }
+ get canViewAssignedCollections() {
+ return this.canDeleteAssignedCollections || this.canEditAssignedCollections;
+ }
+ get canManageGroups() {
+ return this.isAdmin || this.permissions.manageGroups;
+ }
+ get canManageSso() {
+ return this.isAdmin || this.permissions.manageSso;
+ }
+ get canManagePolicies() {
+ return this.isAdmin || this.permissions.managePolicies;
+ }
+ get canManageUsers() {
+ return this.isAdmin || this.permissions.manageUsers;
+ }
+ get canManageUsersPassword() {
+ return this.isAdmin || this.permissions.manageResetPassword;
+ }
+ get isExemptFromPolicies() {
+ return this.canManagePolicies;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/domain/password.ts":
+/*!****************************************************!*\
+ !*** ./jslib/common/src/models/domain/password.ts ***!
+ \****************************************************/
+/*! exports provided: Password */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Password", function() { return Password; });
+/* harmony import */ var _data_passwordHistoryData__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../data/passwordHistoryData */ "./jslib/common/src/models/data/passwordHistoryData.ts");
+/* harmony import */ var _domainBase__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./domainBase */ "./jslib/common/src/models/domain/domainBase.ts");
+/* harmony import */ var _view_passwordHistoryView__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../view/passwordHistoryView */ "./jslib/common/src/models/view/passwordHistoryView.ts");
+
+
+
+class Password extends _domainBase__WEBPACK_IMPORTED_MODULE_1__["default"] {
+ constructor(obj, alreadyEncrypted = false) {
+ super();
+ if (obj == null) {
+ return;
+ }
+ this.buildDomainModel(this, obj, {
+ password: null,
+ }, alreadyEncrypted);
+ this.lastUsedDate = new Date(obj.lastUsedDate);
+ }
+ decrypt(orgId, encKey) {
+ return this.decryptObj(new _view_passwordHistoryView__WEBPACK_IMPORTED_MODULE_2__["PasswordHistoryView"](this), {
+ password: null,
+ }, orgId, encKey);
+ }
+ toPasswordHistoryData() {
+ const ph = new _data_passwordHistoryData__WEBPACK_IMPORTED_MODULE_0__["PasswordHistoryData"]();
+ ph.lastUsedDate = this.lastUsedDate.toISOString();
+ this.buildDataModel(this, ph, {
+ password: null,
+ });
+ return ph;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/domain/passwordGeneratorPolicyOptions.ts":
+/*!**************************************************************************!*\
+ !*** ./jslib/common/src/models/domain/passwordGeneratorPolicyOptions.ts ***!
+ \**************************************************************************/
+/*! exports provided: PasswordGeneratorPolicyOptions */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PasswordGeneratorPolicyOptions", function() { return PasswordGeneratorPolicyOptions; });
+/* harmony import */ var _domainBase__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./domainBase */ "./jslib/common/src/models/domain/domainBase.ts");
+
+class PasswordGeneratorPolicyOptions extends _domainBase__WEBPACK_IMPORTED_MODULE_0__["default"] {
+ constructor() {
+ super(...arguments);
+ this.defaultType = '';
+ this.minLength = 0;
+ this.useUppercase = false;
+ this.useLowercase = false;
+ this.useNumbers = false;
+ this.numberCount = 0;
+ this.useSpecial = false;
+ this.specialCount = 0;
+ this.minNumberWords = 0;
+ this.capitalize = false;
+ this.includeNumber = false;
+ }
+ inEffect() {
+ return this.defaultType !== '' ||
+ this.minLength > 0 ||
+ this.numberCount > 0 ||
+ this.specialCount > 0 ||
+ this.useUppercase ||
+ this.useLowercase ||
+ this.useNumbers ||
+ this.useSpecial ||
+ this.minNumberWords > 0 ||
+ this.capitalize ||
+ this.includeNumber;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/domain/policy.ts":
+/*!**************************************************!*\
+ !*** ./jslib/common/src/models/domain/policy.ts ***!
+ \**************************************************/
+/*! exports provided: Policy */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Policy", function() { return Policy; });
+/* harmony import */ var _domainBase__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./domainBase */ "./jslib/common/src/models/domain/domainBase.ts");
+
+class Policy extends _domainBase__WEBPACK_IMPORTED_MODULE_0__["default"] {
+ constructor(obj) {
+ super();
+ if (obj == null) {
+ return;
+ }
+ this.id = obj.id;
+ this.organizationId = obj.organizationId;
+ this.type = obj.type;
+ this.data = obj.data;
+ this.enabled = obj.enabled;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/domain/provider.ts":
+/*!****************************************************!*\
+ !*** ./jslib/common/src/models/domain/provider.ts ***!
+ \****************************************************/
+/*! exports provided: Provider */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Provider", function() { return Provider; });
+/* harmony import */ var _enums_providerUserStatusType__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../enums/providerUserStatusType */ "./jslib/common/src/enums/providerUserStatusType.ts");
+/* harmony import */ var _enums_providerUserType__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../enums/providerUserType */ "./jslib/common/src/enums/providerUserType.ts");
+
+
+class Provider {
+ constructor(obj) {
+ if (obj == null) {
+ return;
+ }
+ this.id = obj.id;
+ this.name = obj.name;
+ this.status = obj.status;
+ this.type = obj.type;
+ this.enabled = obj.enabled;
+ this.userId = obj.userId;
+ this.useEvents = obj.useEvents;
+ }
+ get canAccess() {
+ if (this.isProviderAdmin) {
+ return true;
+ }
+ return this.enabled && this.status === _enums_providerUserStatusType__WEBPACK_IMPORTED_MODULE_0__["ProviderUserStatusType"].Confirmed;
+ }
+ get canCreateOrganizations() {
+ return this.enabled && this.isProviderAdmin;
+ }
+ get canManageUsers() {
+ return this.isProviderAdmin;
+ }
+ get canAccessEventLogs() {
+ return this.isProviderAdmin;
+ }
+ get isProviderAdmin() {
+ return this.type === _enums_providerUserType__WEBPACK_IMPORTED_MODULE_1__["ProviderUserType"].ProviderAdmin;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/domain/resetPasswordPolicyOptions.ts":
+/*!**********************************************************************!*\
+ !*** ./jslib/common/src/models/domain/resetPasswordPolicyOptions.ts ***!
+ \**********************************************************************/
+/*! exports provided: ResetPasswordPolicyOptions */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ResetPasswordPolicyOptions", function() { return ResetPasswordPolicyOptions; });
+/* harmony import */ var _domainBase__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./domainBase */ "./jslib/common/src/models/domain/domainBase.ts");
+
+class ResetPasswordPolicyOptions extends _domainBase__WEBPACK_IMPORTED_MODULE_0__["default"] {
+ constructor() {
+ super(...arguments);
+ this.autoEnrollEnabled = false;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/domain/secureNote.ts":
+/*!******************************************************!*\
+ !*** ./jslib/common/src/models/domain/secureNote.ts ***!
+ \******************************************************/
+/*! exports provided: SecureNote */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SecureNote", function() { return SecureNote; });
+/* harmony import */ var _data_secureNoteData__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../data/secureNoteData */ "./jslib/common/src/models/data/secureNoteData.ts");
+/* harmony import */ var _domainBase__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./domainBase */ "./jslib/common/src/models/domain/domainBase.ts");
+/* harmony import */ var _view_secureNoteView__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../view/secureNoteView */ "./jslib/common/src/models/view/secureNoteView.ts");
+
+
+
+class SecureNote extends _domainBase__WEBPACK_IMPORTED_MODULE_1__["default"] {
+ constructor(obj, alreadyEncrypted = false) {
+ super();
+ if (obj == null) {
+ return;
+ }
+ this.type = obj.type;
+ }
+ decrypt(orgId, encKey) {
+ return Promise.resolve(new _view_secureNoteView__WEBPACK_IMPORTED_MODULE_2__["SecureNoteView"](this));
+ }
+ toSecureNoteData() {
+ const n = new _data_secureNoteData__WEBPACK_IMPORTED_MODULE_0__["SecureNoteData"]();
+ n.type = this.type;
+ return n;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/domain/send.ts":
+/*!************************************************!*\
+ !*** ./jslib/common/src/models/domain/send.ts ***!
+ \************************************************/
+/*! exports provided: Send */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Send", function() { return Send; });
+/* harmony import */ var _enums_sendType__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../enums/sendType */ "./jslib/common/src/enums/sendType.ts");
+/* harmony import */ var _misc_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../misc/utils */ "./jslib/common/src/misc/utils.ts");
+/* harmony import */ var _view_sendView__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../view/sendView */ "./jslib/common/src/models/view/sendView.ts");
+/* harmony import */ var _domainBase__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./domainBase */ "./jslib/common/src/models/domain/domainBase.ts");
+/* harmony import */ var _sendFile__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./sendFile */ "./jslib/common/src/models/domain/sendFile.ts");
+/* harmony import */ var _sendText__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./sendText */ "./jslib/common/src/models/domain/sendText.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+
+
+
+
+class Send extends _domainBase__WEBPACK_IMPORTED_MODULE_3__["default"] {
+ constructor(obj, alreadyEncrypted = false) {
+ super();
+ if (obj == null) {
+ return;
+ }
+ this.buildDomainModel(this, obj, {
+ id: null,
+ accessId: null,
+ userId: null,
+ name: null,
+ notes: null,
+ key: null,
+ }, alreadyEncrypted, ['id', 'accessId', 'userId']);
+ this.type = obj.type;
+ this.maxAccessCount = obj.maxAccessCount;
+ this.accessCount = obj.accessCount;
+ this.password = obj.password;
+ this.disabled = obj.disabled;
+ this.revisionDate = obj.revisionDate != null ? new Date(obj.revisionDate) : null;
+ this.deletionDate = obj.deletionDate != null ? new Date(obj.deletionDate) : null;
+ this.expirationDate = obj.expirationDate != null ? new Date(obj.expirationDate) : null;
+ this.hideEmail = obj.hideEmail;
+ switch (this.type) {
+ case _enums_sendType__WEBPACK_IMPORTED_MODULE_0__["SendType"].Text:
+ this.text = new _sendText__WEBPACK_IMPORTED_MODULE_5__["SendText"](obj.text, alreadyEncrypted);
+ break;
+ case _enums_sendType__WEBPACK_IMPORTED_MODULE_0__["SendType"].File:
+ this.file = new _sendFile__WEBPACK_IMPORTED_MODULE_4__["SendFile"](obj.file, alreadyEncrypted);
+ break;
+ default:
+ break;
+ }
+ }
+ decrypt() {
+ return __awaiter(this, void 0, void 0, function* () {
+ const model = new _view_sendView__WEBPACK_IMPORTED_MODULE_2__["SendView"](this);
+ let cryptoService;
+ const containerService = _misc_utils__WEBPACK_IMPORTED_MODULE_1__["Utils"].global.bitwardenContainerService;
+ if (containerService) {
+ cryptoService = containerService.getCryptoService();
+ }
+ else {
+ throw new Error('global bitwardenContainerService not initialized.');
+ }
+ try {
+ model.key = yield cryptoService.decryptToBytes(this.key, null);
+ model.cryptoKey = yield cryptoService.makeSendKey(model.key);
+ }
+ catch (e) {
+ // TODO: error?
+ }
+ yield this.decryptObj(model, {
+ name: null,
+ notes: null,
+ }, null, model.cryptoKey);
+ switch (this.type) {
+ case _enums_sendType__WEBPACK_IMPORTED_MODULE_0__["SendType"].File:
+ model.file = yield this.file.decrypt(model.cryptoKey);
+ break;
+ case _enums_sendType__WEBPACK_IMPORTED_MODULE_0__["SendType"].Text:
+ model.text = yield this.text.decrypt(model.cryptoKey);
+ break;
+ default:
+ break;
+ }
+ return model;
+ });
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/domain/sendFile.ts":
+/*!****************************************************!*\
+ !*** ./jslib/common/src/models/domain/sendFile.ts ***!
+ \****************************************************/
+/*! exports provided: SendFile */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SendFile", function() { return SendFile; });
+/* harmony import */ var _domainBase__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./domainBase */ "./jslib/common/src/models/domain/domainBase.ts");
+/* harmony import */ var _view_sendFileView__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../view/sendFileView */ "./jslib/common/src/models/view/sendFileView.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+class SendFile extends _domainBase__WEBPACK_IMPORTED_MODULE_0__["default"] {
+ constructor(obj, alreadyEncrypted = false) {
+ super();
+ if (obj == null) {
+ return;
+ }
+ this.size = obj.size;
+ this.buildDomainModel(this, obj, {
+ id: null,
+ sizeName: null,
+ fileName: null,
+ }, alreadyEncrypted, ['id', 'sizeName']);
+ }
+ decrypt(key) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const view = yield this.decryptObj(new _view_sendFileView__WEBPACK_IMPORTED_MODULE_1__["SendFileView"](this), {
+ fileName: null,
+ }, null, key);
+ return view;
+ });
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/domain/sendText.ts":
+/*!****************************************************!*\
+ !*** ./jslib/common/src/models/domain/sendText.ts ***!
+ \****************************************************/
+/*! exports provided: SendText */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SendText", function() { return SendText; });
+/* harmony import */ var _domainBase__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./domainBase */ "./jslib/common/src/models/domain/domainBase.ts");
+/* harmony import */ var _view_sendTextView__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../view/sendTextView */ "./jslib/common/src/models/view/sendTextView.ts");
+
+
+class SendText extends _domainBase__WEBPACK_IMPORTED_MODULE_0__["default"] {
+ constructor(obj, alreadyEncrypted = false) {
+ super();
+ if (obj == null) {
+ return;
+ }
+ this.hidden = obj.hidden;
+ this.buildDomainModel(this, obj, {
+ text: null,
+ }, alreadyEncrypted, []);
+ }
+ decrypt(key) {
+ return this.decryptObj(new _view_sendTextView__WEBPACK_IMPORTED_MODULE_1__["SendTextView"](this), {
+ text: null,
+ }, null, key);
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/domain/sortedCiphersCache.ts":
+/*!**************************************************************!*\
+ !*** ./jslib/common/src/models/domain/sortedCiphersCache.ts ***!
+ \**************************************************************/
+/*! exports provided: SortedCiphersCache */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SortedCiphersCache", function() { return SortedCiphersCache; });
+const CacheTTL = 3000;
+class SortedCiphersCache {
+ constructor(comparator) {
+ this.comparator = comparator;
+ this.sortedCiphersByUrl = new Map();
+ this.timeouts = new Map();
+ }
+ isCached(url) {
+ return this.sortedCiphersByUrl.has(url);
+ }
+ addCiphers(url, ciphers) {
+ ciphers.sort(this.comparator);
+ this.sortedCiphersByUrl.set(url, new Ciphers(ciphers));
+ this.resetTimer(url);
+ }
+ getLastUsed(url) {
+ this.resetTimer(url);
+ return this.isCached(url) ? this.sortedCiphersByUrl.get(url).getLastUsed() : null;
+ }
+ getLastLaunched(url) {
+ return this.isCached(url) ? this.sortedCiphersByUrl.get(url).getLastLaunched() : null;
+ }
+ getNext(url) {
+ this.resetTimer(url);
+ return this.isCached(url) ? this.sortedCiphersByUrl.get(url).getNext() : null;
+ }
+ updateLastUsedIndex(url) {
+ if (this.isCached(url)) {
+ this.sortedCiphersByUrl.get(url).updateLastUsedIndex();
+ }
+ }
+ clear() {
+ this.sortedCiphersByUrl.clear();
+ this.timeouts.clear();
+ }
+ resetTimer(url) {
+ clearTimeout(this.timeouts.get(url));
+ this.timeouts.set(url, setTimeout(() => {
+ this.sortedCiphersByUrl.delete(url);
+ this.timeouts.delete(url);
+ }, CacheTTL));
+ }
+}
+class Ciphers {
+ constructor(ciphers) {
+ this.ciphers = ciphers;
+ this.lastUsedIndex = -1;
+ }
+ getLastUsed() {
+ this.lastUsedIndex = Math.max(this.lastUsedIndex, 0);
+ return this.ciphers[this.lastUsedIndex];
+ }
+ getLastLaunched() {
+ const usedCiphers = this.ciphers.filter(cipher => { var _a; return (_a = cipher.localData) === null || _a === void 0 ? void 0 : _a.lastLaunched; });
+ const sortedCiphers = usedCiphers.sort((x, y) => y.localData.lastLaunched.valueOf() - x.localData.lastLaunched.valueOf());
+ return sortedCiphers[0];
+ }
+ getNextIndex() {
+ return (this.lastUsedIndex + 1) % this.ciphers.length;
+ }
+ getNext() {
+ return this.ciphers[this.getNextIndex()];
+ }
+ updateLastUsedIndex() {
+ this.lastUsedIndex = this.getNextIndex();
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/domain/symmetricCryptoKey.ts":
+/*!**************************************************************!*\
+ !*** ./jslib/common/src/models/domain/symmetricCryptoKey.ts ***!
+ \**************************************************************/
+/*! exports provided: SymmetricCryptoKey */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SymmetricCryptoKey", function() { return SymmetricCryptoKey; });
+/* harmony import */ var _enums_encryptionType__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../enums/encryptionType */ "./jslib/common/src/enums/encryptionType.ts");
+/* harmony import */ var _misc_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../misc/utils */ "./jslib/common/src/misc/utils.ts");
+
+
+class SymmetricCryptoKey {
+ constructor(key, encType) {
+ if (key == null) {
+ throw new Error('Must provide key');
+ }
+ if (encType == null) {
+ if (key.byteLength === 32) {
+ encType = _enums_encryptionType__WEBPACK_IMPORTED_MODULE_0__["EncryptionType"].AesCbc256_B64;
+ }
+ else if (key.byteLength === 64) {
+ encType = _enums_encryptionType__WEBPACK_IMPORTED_MODULE_0__["EncryptionType"].AesCbc256_HmacSha256_B64;
+ }
+ else {
+ throw new Error('Unable to determine encType.');
+ }
+ }
+ this.key = key;
+ this.encType = encType;
+ if (encType === _enums_encryptionType__WEBPACK_IMPORTED_MODULE_0__["EncryptionType"].AesCbc256_B64 && key.byteLength === 32) {
+ this.encKey = key;
+ this.macKey = null;
+ }
+ else if (encType === _enums_encryptionType__WEBPACK_IMPORTED_MODULE_0__["EncryptionType"].AesCbc128_HmacSha256_B64 && key.byteLength === 32) {
+ this.encKey = key.slice(0, 16);
+ this.macKey = key.slice(16, 32);
+ }
+ else if (encType === _enums_encryptionType__WEBPACK_IMPORTED_MODULE_0__["EncryptionType"].AesCbc256_HmacSha256_B64 && key.byteLength === 64) {
+ this.encKey = key.slice(0, 32);
+ this.macKey = key.slice(32, 64);
+ }
+ else {
+ throw new Error('Unsupported encType/key length.');
+ }
+ if (this.key != null) {
+ this.keyB64 = _misc_utils__WEBPACK_IMPORTED_MODULE_1__["Utils"].fromBufferToB64(this.key);
+ }
+ if (this.encKey != null) {
+ this.encKeyB64 = _misc_utils__WEBPACK_IMPORTED_MODULE_1__["Utils"].fromBufferToB64(this.encKey);
+ }
+ if (this.macKey != null) {
+ this.macKeyB64 = _misc_utils__WEBPACK_IMPORTED_MODULE_1__["Utils"].fromBufferToB64(this.macKey);
+ }
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/domain/treeNode.ts":
+/*!****************************************************!*\
+ !*** ./jslib/common/src/models/domain/treeNode.ts ***!
+ \****************************************************/
+/*! exports provided: TreeNode */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TreeNode", function() { return TreeNode; });
+class TreeNode {
+ constructor(node, name, parent) {
+ this.children = [];
+ this.parent = parent;
+ this.node = node;
+ this.node.name = name;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/export/card.ts":
+/*!************************************************!*\
+ !*** ./jslib/common/src/models/export/card.ts ***!
+ \************************************************/
+/*! exports provided: Card */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Card", function() { return Card; });
+/* harmony import */ var _view_cardView__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../view/cardView */ "./jslib/common/src/models/view/cardView.ts");
+/* harmony import */ var _domain_card__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../domain/card */ "./jslib/common/src/models/domain/card.ts");
+/* harmony import */ var _domain_encString__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../domain/encString */ "./jslib/common/src/models/domain/encString.ts");
+
+
+
+class Card {
+ constructor(o) {
+ var _a, _b, _c, _d, _e, _f;
+ if (o == null) {
+ return;
+ }
+ if (o instanceof _view_cardView__WEBPACK_IMPORTED_MODULE_0__["CardView"]) {
+ this.cardholderName = o.cardholderName;
+ this.brand = o.brand;
+ this.number = o.number;
+ this.expMonth = o.expMonth;
+ this.expYear = o.expYear;
+ this.code = o.code;
+ }
+ else {
+ this.cardholderName = (_a = o.cardholderName) === null || _a === void 0 ? void 0 : _a.encryptedString;
+ this.brand = (_b = o.brand) === null || _b === void 0 ? void 0 : _b.encryptedString;
+ this.number = (_c = o.number) === null || _c === void 0 ? void 0 : _c.encryptedString;
+ this.expMonth = (_d = o.expMonth) === null || _d === void 0 ? void 0 : _d.encryptedString;
+ this.expYear = (_e = o.expYear) === null || _e === void 0 ? void 0 : _e.encryptedString;
+ this.code = (_f = o.code) === null || _f === void 0 ? void 0 : _f.encryptedString;
+ }
+ }
+ static template() {
+ const req = new Card();
+ req.cardholderName = 'John Doe';
+ req.brand = 'visa';
+ req.number = '4242424242424242';
+ req.expMonth = '04';
+ req.expYear = '2023';
+ req.code = '123';
+ return req;
+ }
+ static toView(req, view = new _view_cardView__WEBPACK_IMPORTED_MODULE_0__["CardView"]()) {
+ view.cardholderName = req.cardholderName;
+ view.brand = req.brand;
+ view.number = req.number;
+ view.expMonth = req.expMonth;
+ view.expYear = req.expYear;
+ view.code = req.code;
+ return view;
+ }
+ static toDomain(req, domain = new _domain_card__WEBPACK_IMPORTED_MODULE_1__["Card"]()) {
+ domain.cardholderName = req.cardholderName != null ? new _domain_encString__WEBPACK_IMPORTED_MODULE_2__["EncString"](req.cardholderName) : null;
+ domain.brand = req.brand != null ? new _domain_encString__WEBPACK_IMPORTED_MODULE_2__["EncString"](req.brand) : null;
+ domain.number = req.number != null ? new _domain_encString__WEBPACK_IMPORTED_MODULE_2__["EncString"](req.number) : null;
+ domain.expMonth = req.expMonth != null ? new _domain_encString__WEBPACK_IMPORTED_MODULE_2__["EncString"](req.expMonth) : null;
+ domain.expYear = req.expYear != null ? new _domain_encString__WEBPACK_IMPORTED_MODULE_2__["EncString"](req.expYear) : null;
+ domain.code = req.code != null ? new _domain_encString__WEBPACK_IMPORTED_MODULE_2__["EncString"](req.code) : null;
+ return domain;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/export/cipher.ts":
+/*!**************************************************!*\
+ !*** ./jslib/common/src/models/export/cipher.ts ***!
+ \**************************************************/
+/*! exports provided: Cipher */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Cipher", function() { return Cipher; });
+/* harmony import */ var _enums_cipherRepromptType__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../enums/cipherRepromptType */ "./jslib/common/src/enums/cipherRepromptType.ts");
+/* harmony import */ var _enums_cipherType__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../enums/cipherType */ "./jslib/common/src/enums/cipherType.ts");
+/* harmony import */ var _view_cipherView__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../view/cipherView */ "./jslib/common/src/models/view/cipherView.ts");
+/* harmony import */ var _domain_cipher__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../domain/cipher */ "./jslib/common/src/models/domain/cipher.ts");
+/* harmony import */ var _domain_encString__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../domain/encString */ "./jslib/common/src/models/domain/encString.ts");
+/* harmony import */ var _card__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./card */ "./jslib/common/src/models/export/card.ts");
+/* harmony import */ var _field__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./field */ "./jslib/common/src/models/export/field.ts");
+/* harmony import */ var _identity__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./identity */ "./jslib/common/src/models/export/identity.ts");
+/* harmony import */ var _login__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./login */ "./jslib/common/src/models/export/login.ts");
+/* harmony import */ var _secureNote__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./secureNote */ "./jslib/common/src/models/export/secureNote.ts");
+
+
+
+
+
+
+
+
+
+
+class Cipher {
+ static template() {
+ const req = new Cipher();
+ req.organizationId = null;
+ req.collectionIds = null;
+ req.folderId = null;
+ req.type = _enums_cipherType__WEBPACK_IMPORTED_MODULE_1__["CipherType"].Login;
+ req.name = 'Item name';
+ req.notes = 'Some notes about this item.';
+ req.favorite = false;
+ req.fields = [];
+ req.login = null;
+ req.secureNote = null;
+ req.card = null;
+ req.identity = null;
+ req.reprompt = _enums_cipherRepromptType__WEBPACK_IMPORTED_MODULE_0__["CipherRepromptType"].None;
+ return req;
+ }
+ static toView(req, view = new _view_cipherView__WEBPACK_IMPORTED_MODULE_2__["CipherView"]()) {
+ var _a, _b, _c;
+ view.type = req.type;
+ view.folderId = req.folderId;
+ if (view.organizationId == null) {
+ view.organizationId = req.organizationId;
+ }
+ if (view.collectionIds || req.collectionIds) {
+ const set = new Set(((_a = view.collectionIds) !== null && _a !== void 0 ? _a : []).concat((_b = req.collectionIds) !== null && _b !== void 0 ? _b : []));
+ view.collectionIds = Array.from(set.values());
+ }
+ view.name = req.name;
+ view.notes = req.notes;
+ view.favorite = req.favorite;
+ view.reprompt = (_c = req.reprompt) !== null && _c !== void 0 ? _c : _enums_cipherRepromptType__WEBPACK_IMPORTED_MODULE_0__["CipherRepromptType"].None;
+ if (req.fields != null) {
+ view.fields = req.fields.map(f => _field__WEBPACK_IMPORTED_MODULE_6__["Field"].toView(f));
+ }
+ switch (req.type) {
+ case _enums_cipherType__WEBPACK_IMPORTED_MODULE_1__["CipherType"].Login:
+ view.login = _login__WEBPACK_IMPORTED_MODULE_8__["Login"].toView(req.login);
+ break;
+ case _enums_cipherType__WEBPACK_IMPORTED_MODULE_1__["CipherType"].SecureNote:
+ view.secureNote = _secureNote__WEBPACK_IMPORTED_MODULE_9__["SecureNote"].toView(req.secureNote);
+ break;
+ case _enums_cipherType__WEBPACK_IMPORTED_MODULE_1__["CipherType"].Card:
+ view.card = _card__WEBPACK_IMPORTED_MODULE_5__["Card"].toView(req.card);
+ break;
+ case _enums_cipherType__WEBPACK_IMPORTED_MODULE_1__["CipherType"].Identity:
+ view.identity = _identity__WEBPACK_IMPORTED_MODULE_7__["Identity"].toView(req.identity);
+ break;
+ }
+ return view;
+ }
+ static toDomain(req, domain = new _domain_cipher__WEBPACK_IMPORTED_MODULE_3__["Cipher"]()) {
+ var _a;
+ domain.type = req.type;
+ domain.folderId = req.folderId;
+ if (domain.organizationId == null) {
+ domain.organizationId = req.organizationId;
+ }
+ domain.name = req.name != null ? new _domain_encString__WEBPACK_IMPORTED_MODULE_4__["EncString"](req.name) : null;
+ domain.notes = req.notes != null ? new _domain_encString__WEBPACK_IMPORTED_MODULE_4__["EncString"](req.notes) : null;
+ domain.favorite = req.favorite;
+ domain.reprompt = (_a = req.reprompt) !== null && _a !== void 0 ? _a : _enums_cipherRepromptType__WEBPACK_IMPORTED_MODULE_0__["CipherRepromptType"].None;
+ if (req.fields != null) {
+ domain.fields = req.fields.map(f => _field__WEBPACK_IMPORTED_MODULE_6__["Field"].toDomain(f));
+ }
+ switch (req.type) {
+ case _enums_cipherType__WEBPACK_IMPORTED_MODULE_1__["CipherType"].Login:
+ domain.login = _login__WEBPACK_IMPORTED_MODULE_8__["Login"].toDomain(req.login);
+ break;
+ case _enums_cipherType__WEBPACK_IMPORTED_MODULE_1__["CipherType"].SecureNote:
+ domain.secureNote = _secureNote__WEBPACK_IMPORTED_MODULE_9__["SecureNote"].toDomain(req.secureNote);
+ break;
+ case _enums_cipherType__WEBPACK_IMPORTED_MODULE_1__["CipherType"].Card:
+ domain.card = _card__WEBPACK_IMPORTED_MODULE_5__["Card"].toDomain(req.card);
+ break;
+ case _enums_cipherType__WEBPACK_IMPORTED_MODULE_1__["CipherType"].Identity:
+ domain.identity = _identity__WEBPACK_IMPORTED_MODULE_7__["Identity"].toDomain(req.identity);
+ break;
+ }
+ return domain;
+ }
+ // Use build method instead of ctor so that we can control order of JSON stringify for pretty print
+ build(o) {
+ var _a, _b;
+ this.organizationId = o.organizationId;
+ this.folderId = o.folderId;
+ this.type = o.type;
+ this.reprompt = o.reprompt;
+ if (o instanceof _view_cipherView__WEBPACK_IMPORTED_MODULE_2__["CipherView"]) {
+ this.name = o.name;
+ this.notes = o.notes;
+ }
+ else {
+ this.name = (_a = o.name) === null || _a === void 0 ? void 0 : _a.encryptedString;
+ this.notes = (_b = o.notes) === null || _b === void 0 ? void 0 : _b.encryptedString;
+ }
+ this.favorite = o.favorite;
+ if (o.fields != null) {
+ if (o instanceof _view_cipherView__WEBPACK_IMPORTED_MODULE_2__["CipherView"]) {
+ this.fields = o.fields.map(f => new _field__WEBPACK_IMPORTED_MODULE_6__["Field"](f));
+ }
+ else {
+ this.fields = o.fields.map(f => new _field__WEBPACK_IMPORTED_MODULE_6__["Field"](f));
+ }
+ }
+ switch (o.type) {
+ case _enums_cipherType__WEBPACK_IMPORTED_MODULE_1__["CipherType"].Login:
+ this.login = new _login__WEBPACK_IMPORTED_MODULE_8__["Login"](o.login);
+ break;
+ case _enums_cipherType__WEBPACK_IMPORTED_MODULE_1__["CipherType"].SecureNote:
+ this.secureNote = new _secureNote__WEBPACK_IMPORTED_MODULE_9__["SecureNote"](o.secureNote);
+ break;
+ case _enums_cipherType__WEBPACK_IMPORTED_MODULE_1__["CipherType"].Card:
+ this.card = new _card__WEBPACK_IMPORTED_MODULE_5__["Card"](o.card);
+ break;
+ case _enums_cipherType__WEBPACK_IMPORTED_MODULE_1__["CipherType"].Identity:
+ this.identity = new _identity__WEBPACK_IMPORTED_MODULE_7__["Identity"](o.identity);
+ break;
+ }
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/export/cipherWithIds.ts":
+/*!*********************************************************!*\
+ !*** ./jslib/common/src/models/export/cipherWithIds.ts ***!
+ \*********************************************************/
+/*! exports provided: CipherWithIds */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CipherWithIds", function() { return CipherWithIds; });
+/* harmony import */ var _cipher__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./cipher */ "./jslib/common/src/models/export/cipher.ts");
+
+class CipherWithIds extends _cipher__WEBPACK_IMPORTED_MODULE_0__["Cipher"] {
+ // Use build method instead of ctor so that we can control order of JSON stringify for pretty print
+ build(o) {
+ this.id = o.id;
+ super.build(o);
+ this.collectionIds = o.collectionIds;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/export/collection.ts":
+/*!******************************************************!*\
+ !*** ./jslib/common/src/models/export/collection.ts ***!
+ \******************************************************/
+/*! exports provided: Collection */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Collection", function() { return Collection; });
+/* harmony import */ var _view_collectionView__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../view/collectionView */ "./jslib/common/src/models/view/collectionView.ts");
+/* harmony import */ var _domain_collection__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../domain/collection */ "./jslib/common/src/models/domain/collection.ts");
+/* harmony import */ var _domain_encString__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../domain/encString */ "./jslib/common/src/models/domain/encString.ts");
+
+
+
+class Collection {
+ static template() {
+ const req = new Collection();
+ req.organizationId = '00000000-0000-0000-0000-000000000000';
+ req.name = 'Collection name';
+ req.externalId = null;
+ return req;
+ }
+ static toView(req, view = new _view_collectionView__WEBPACK_IMPORTED_MODULE_0__["CollectionView"]()) {
+ view.name = req.name;
+ view.externalId = req.externalId;
+ if (view.organizationId == null) {
+ view.organizationId = req.organizationId;
+ }
+ return view;
+ }
+ static toDomain(req, domain = new _domain_collection__WEBPACK_IMPORTED_MODULE_1__["Collection"]()) {
+ domain.name = req.name != null ? new _domain_encString__WEBPACK_IMPORTED_MODULE_2__["EncString"](req.name) : null;
+ domain.externalId = req.externalId;
+ if (domain.organizationId == null) {
+ domain.organizationId = req.organizationId;
+ }
+ return domain;
+ }
+ // Use build method instead of ctor so that we can control order of JSON stringify for pretty print
+ build(o) {
+ var _a;
+ this.organizationId = o.organizationId;
+ if (o instanceof _view_collectionView__WEBPACK_IMPORTED_MODULE_0__["CollectionView"]) {
+ this.name = o.name;
+ }
+ else {
+ this.name = (_a = o.name) === null || _a === void 0 ? void 0 : _a.encryptedString;
+ }
+ this.externalId = o.externalId;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/export/collectionWithId.ts":
+/*!************************************************************!*\
+ !*** ./jslib/common/src/models/export/collectionWithId.ts ***!
+ \************************************************************/
+/*! exports provided: CollectionWithId */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CollectionWithId", function() { return CollectionWithId; });
+/* harmony import */ var _collection__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./collection */ "./jslib/common/src/models/export/collection.ts");
+
+class CollectionWithId extends _collection__WEBPACK_IMPORTED_MODULE_0__["Collection"] {
+ // Use build method instead of ctor so that we can control order of JSON stringify for pretty print
+ build(o) {
+ this.id = o.id;
+ super.build(o);
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/export/event.ts":
+/*!*************************************************!*\
+ !*** ./jslib/common/src/models/export/event.ts ***!
+ \*************************************************/
+/*! exports provided: Event */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Event", function() { return Event; });
+/* harmony import */ var _enums_eventType__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../enums/eventType */ "./jslib/common/src/enums/eventType.ts");
+
+class Event {
+ constructor(event) {
+ this.message = event.humanReadableMessage;
+ this.appIcon = event.appIcon;
+ this.appName = event.appName;
+ this.userId = event.userId;
+ this.userName = event.userName;
+ this.userEmail = event.userEmail;
+ this.date = event.date;
+ this.ip = event.ip;
+ this.type = _enums_eventType__WEBPACK_IMPORTED_MODULE_0__["EventType"][event.type];
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/export/field.ts":
+/*!*************************************************!*\
+ !*** ./jslib/common/src/models/export/field.ts ***!
+ \*************************************************/
+/*! exports provided: Field */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Field", function() { return Field; });
+/* harmony import */ var _enums_fieldType__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../enums/fieldType */ "./jslib/common/src/enums/fieldType.ts");
+/* harmony import */ var _view_fieldView__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../view/fieldView */ "./jslib/common/src/models/view/fieldView.ts");
+/* harmony import */ var _domain_encString__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../domain/encString */ "./jslib/common/src/models/domain/encString.ts");
+/* harmony import */ var _domain_field__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../domain/field */ "./jslib/common/src/models/domain/field.ts");
+
+
+
+
+class Field {
+ constructor(o) {
+ var _a, _b;
+ if (o == null) {
+ return;
+ }
+ if (o instanceof _view_fieldView__WEBPACK_IMPORTED_MODULE_1__["FieldView"]) {
+ this.name = o.name;
+ this.value = o.value;
+ }
+ else {
+ this.name = (_a = o.name) === null || _a === void 0 ? void 0 : _a.encryptedString;
+ this.value = (_b = o.value) === null || _b === void 0 ? void 0 : _b.encryptedString;
+ }
+ this.type = o.type;
+ }
+ static template() {
+ const req = new Field();
+ req.name = 'Field name';
+ req.value = 'Some value';
+ req.type = _enums_fieldType__WEBPACK_IMPORTED_MODULE_0__["FieldType"].Text;
+ return req;
+ }
+ static toView(req, view = new _view_fieldView__WEBPACK_IMPORTED_MODULE_1__["FieldView"]()) {
+ view.type = req.type;
+ view.value = req.value;
+ view.name = req.name;
+ return view;
+ }
+ static toDomain(req, domain = new _domain_field__WEBPACK_IMPORTED_MODULE_3__["Field"]()) {
+ domain.type = req.type;
+ domain.value = req.value != null ? new _domain_encString__WEBPACK_IMPORTED_MODULE_2__["EncString"](req.value) : null;
+ domain.name = req.name != null ? new _domain_encString__WEBPACK_IMPORTED_MODULE_2__["EncString"](req.name) : null;
+ return domain;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/export/folder.ts":
+/*!**************************************************!*\
+ !*** ./jslib/common/src/models/export/folder.ts ***!
+ \**************************************************/
+/*! exports provided: Folder */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Folder", function() { return Folder; });
+/* harmony import */ var _view_folderView__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../view/folderView */ "./jslib/common/src/models/view/folderView.ts");
+/* harmony import */ var _domain_encString__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../domain/encString */ "./jslib/common/src/models/domain/encString.ts");
+/* harmony import */ var _domain_folder__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../domain/folder */ "./jslib/common/src/models/domain/folder.ts");
+
+
+
+class Folder {
+ static template() {
+ const req = new Folder();
+ req.name = 'Folder name';
+ return req;
+ }
+ static toView(req, view = new _view_folderView__WEBPACK_IMPORTED_MODULE_0__["FolderView"]()) {
+ view.name = req.name;
+ return view;
+ }
+ static toDomain(req, domain = new _domain_folder__WEBPACK_IMPORTED_MODULE_2__["Folder"]()) {
+ domain.name = req.name != null ? new _domain_encString__WEBPACK_IMPORTED_MODULE_1__["EncString"](req.name) : null;
+ return domain;
+ }
+ // Use build method instead of ctor so that we can control order of JSON stringify for pretty print
+ build(o) {
+ var _a;
+ if (o instanceof _view_folderView__WEBPACK_IMPORTED_MODULE_0__["FolderView"]) {
+ this.name = o.name;
+ }
+ else {
+ this.name = (_a = o.name) === null || _a === void 0 ? void 0 : _a.encryptedString;
+ }
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/export/folderWithId.ts":
+/*!********************************************************!*\
+ !*** ./jslib/common/src/models/export/folderWithId.ts ***!
+ \********************************************************/
+/*! exports provided: FolderWithId */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FolderWithId", function() { return FolderWithId; });
+/* harmony import */ var _folder__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./folder */ "./jslib/common/src/models/export/folder.ts");
+
+class FolderWithId extends _folder__WEBPACK_IMPORTED_MODULE_0__["Folder"] {
+ // Use build method instead of ctor so that we can control order of JSON stringify for pretty print
+ build(o) {
+ this.id = o.id;
+ super.build(o);
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/export/identity.ts":
+/*!****************************************************!*\
+ !*** ./jslib/common/src/models/export/identity.ts ***!
+ \****************************************************/
+/*! exports provided: Identity */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Identity", function() { return Identity; });
+/* harmony import */ var _view_identityView__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../view/identityView */ "./jslib/common/src/models/view/identityView.ts");
+/* harmony import */ var _domain_encString__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../domain/encString */ "./jslib/common/src/models/domain/encString.ts");
+/* harmony import */ var _domain_identity__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../domain/identity */ "./jslib/common/src/models/domain/identity.ts");
+
+
+
+class Identity {
+ constructor(o) {
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t;
+ if (o == null) {
+ return;
+ }
+ if (o instanceof _view_identityView__WEBPACK_IMPORTED_MODULE_0__["IdentityView"]) {
+ this.title = o.title;
+ this.firstName = o.firstName;
+ this.middleName = o.middleName;
+ this.lastName = o.lastName;
+ this.address1 = o.address1;
+ this.address2 = o.address2;
+ this.address3 = o.address3;
+ this.city = o.city;
+ this.state = o.state;
+ this.postalCode = o.postalCode;
+ this.country = o.country;
+ this.company = o.company;
+ this.email = o.email;
+ this.phone = o.phone;
+ this.ssn = o.ssn;
+ this.username = o.username;
+ this.passportNumber = o.passportNumber;
+ this.licenseNumber = o.licenseNumber;
+ }
+ else {
+ this.title = (_a = o.title) === null || _a === void 0 ? void 0 : _a.encryptedString;
+ this.firstName = (_b = o.firstName) === null || _b === void 0 ? void 0 : _b.encryptedString;
+ this.middleName = (_c = o.middleName) === null || _c === void 0 ? void 0 : _c.encryptedString;
+ this.lastName = (_d = o.lastName) === null || _d === void 0 ? void 0 : _d.encryptedString;
+ this.address1 = (_e = o.address1) === null || _e === void 0 ? void 0 : _e.encryptedString;
+ this.address2 = (_f = o.address2) === null || _f === void 0 ? void 0 : _f.encryptedString;
+ this.address3 = (_g = o.address3) === null || _g === void 0 ? void 0 : _g.encryptedString;
+ this.city = (_h = o.city) === null || _h === void 0 ? void 0 : _h.encryptedString;
+ this.state = (_j = o.state) === null || _j === void 0 ? void 0 : _j.encryptedString;
+ this.postalCode = (_k = o.postalCode) === null || _k === void 0 ? void 0 : _k.encryptedString;
+ this.country = (_l = o.country) === null || _l === void 0 ? void 0 : _l.encryptedString;
+ this.company = (_m = o.company) === null || _m === void 0 ? void 0 : _m.encryptedString;
+ this.email = (_o = o.email) === null || _o === void 0 ? void 0 : _o.encryptedString;
+ this.phone = (_p = o.phone) === null || _p === void 0 ? void 0 : _p.encryptedString;
+ this.ssn = (_q = o.ssn) === null || _q === void 0 ? void 0 : _q.encryptedString;
+ this.username = (_r = o.username) === null || _r === void 0 ? void 0 : _r.encryptedString;
+ this.passportNumber = (_s = o.passportNumber) === null || _s === void 0 ? void 0 : _s.encryptedString;
+ this.licenseNumber = (_t = o.licenseNumber) === null || _t === void 0 ? void 0 : _t.encryptedString;
+ }
+ }
+ static template() {
+ const req = new Identity();
+ req.title = 'Mr';
+ req.firstName = 'John';
+ req.middleName = 'William';
+ req.lastName = 'Doe';
+ req.address1 = '123 Any St';
+ req.address2 = 'Apt #123';
+ req.address3 = null;
+ req.city = 'New York';
+ req.state = 'NY';
+ req.postalCode = '10001';
+ req.country = 'US';
+ req.company = 'Acme Inc.';
+ req.email = 'john@company.com';
+ req.phone = '5555551234';
+ req.ssn = '000-123-4567';
+ req.username = 'jdoe';
+ req.passportNumber = 'US-123456789';
+ req.licenseNumber = 'D123-12-123-12333';
+ return req;
+ }
+ static toView(req, view = new _view_identityView__WEBPACK_IMPORTED_MODULE_0__["IdentityView"]()) {
+ view.title = req.title;
+ view.firstName = req.firstName;
+ view.middleName = req.middleName;
+ view.lastName = req.lastName;
+ view.address1 = req.address1;
+ view.address2 = req.address2;
+ view.address3 = req.address3;
+ view.city = req.city;
+ view.state = req.state;
+ view.postalCode = req.postalCode;
+ view.country = req.country;
+ view.company = req.company;
+ view.email = req.email;
+ view.phone = req.phone;
+ view.ssn = req.ssn;
+ view.username = req.username;
+ view.passportNumber = req.passportNumber;
+ view.licenseNumber = req.licenseNumber;
+ return view;
+ }
+ static toDomain(req, domain = new _domain_identity__WEBPACK_IMPORTED_MODULE_2__["Identity"]()) {
+ domain.title = req.title != null ? new _domain_encString__WEBPACK_IMPORTED_MODULE_1__["EncString"](req.title) : null;
+ domain.firstName = req.firstName != null ? new _domain_encString__WEBPACK_IMPORTED_MODULE_1__["EncString"](req.firstName) : null;
+ domain.middleName = req.middleName != null ? new _domain_encString__WEBPACK_IMPORTED_MODULE_1__["EncString"](req.middleName) : null;
+ domain.lastName = req.lastName != null ? new _domain_encString__WEBPACK_IMPORTED_MODULE_1__["EncString"](req.lastName) : null;
+ domain.address1 = req.address1 != null ? new _domain_encString__WEBPACK_IMPORTED_MODULE_1__["EncString"](req.address1) : null;
+ domain.address2 = req.address2 != null ? new _domain_encString__WEBPACK_IMPORTED_MODULE_1__["EncString"](req.address2) : null;
+ domain.address3 = req.address3 != null ? new _domain_encString__WEBPACK_IMPORTED_MODULE_1__["EncString"](req.address3) : null;
+ domain.city = req.city != null ? new _domain_encString__WEBPACK_IMPORTED_MODULE_1__["EncString"](req.city) : null;
+ domain.state = req.state != null ? new _domain_encString__WEBPACK_IMPORTED_MODULE_1__["EncString"](req.state) : null;
+ domain.postalCode = req.postalCode != null ? new _domain_encString__WEBPACK_IMPORTED_MODULE_1__["EncString"](req.postalCode) : null;
+ domain.country = req.country != null ? new _domain_encString__WEBPACK_IMPORTED_MODULE_1__["EncString"](req.country) : null;
+ domain.company = req.company != null ? new _domain_encString__WEBPACK_IMPORTED_MODULE_1__["EncString"](req.company) : null;
+ domain.email = req.email != null ? new _domain_encString__WEBPACK_IMPORTED_MODULE_1__["EncString"](req.email) : null;
+ domain.phone = req.phone != null ? new _domain_encString__WEBPACK_IMPORTED_MODULE_1__["EncString"](req.phone) : null;
+ domain.ssn = req.ssn != null ? new _domain_encString__WEBPACK_IMPORTED_MODULE_1__["EncString"](req.ssn) : null;
+ domain.username = req.username != null ? new _domain_encString__WEBPACK_IMPORTED_MODULE_1__["EncString"](req.username) : null;
+ domain.passportNumber = req.passportNumber != null ? new _domain_encString__WEBPACK_IMPORTED_MODULE_1__["EncString"](req.passportNumber) : null;
+ domain.licenseNumber = req.licenseNumber != null ? new _domain_encString__WEBPACK_IMPORTED_MODULE_1__["EncString"](req.licenseNumber) : null;
+ return domain;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/export/login.ts":
+/*!*************************************************!*\
+ !*** ./jslib/common/src/models/export/login.ts ***!
+ \*************************************************/
+/*! exports provided: Login */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Login", function() { return Login; });
+/* harmony import */ var _loginUri__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./loginUri */ "./jslib/common/src/models/export/loginUri.ts");
+/* harmony import */ var _view_loginView__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../view/loginView */ "./jslib/common/src/models/view/loginView.ts");
+/* harmony import */ var _domain_encString__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../domain/encString */ "./jslib/common/src/models/domain/encString.ts");
+/* harmony import */ var _domain_login__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../domain/login */ "./jslib/common/src/models/domain/login.ts");
+
+
+
+
+class Login {
+ constructor(o) {
+ var _a, _b, _c;
+ if (o == null) {
+ return;
+ }
+ if (o.uris != null) {
+ if (o instanceof _view_loginView__WEBPACK_IMPORTED_MODULE_1__["LoginView"]) {
+ this.uris = o.uris.map(u => new _loginUri__WEBPACK_IMPORTED_MODULE_0__["LoginUri"](u));
+ }
+ else {
+ this.uris = o.uris.map(u => new _loginUri__WEBPACK_IMPORTED_MODULE_0__["LoginUri"](u));
+ }
+ }
+ if (o instanceof _view_loginView__WEBPACK_IMPORTED_MODULE_1__["LoginView"]) {
+ this.username = o.username;
+ this.password = o.password;
+ this.totp = o.totp;
+ }
+ else {
+ this.username = (_a = o.username) === null || _a === void 0 ? void 0 : _a.encryptedString;
+ this.password = (_b = o.password) === null || _b === void 0 ? void 0 : _b.encryptedString;
+ this.totp = (_c = o.totp) === null || _c === void 0 ? void 0 : _c.encryptedString;
+ }
+ }
+ static template() {
+ const req = new Login();
+ req.uris = [];
+ req.username = 'jdoe';
+ req.password = 'myp@ssword123';
+ req.totp = 'JBSWY3DPEHPK3PXP';
+ return req;
+ }
+ static toView(req, view = new _view_loginView__WEBPACK_IMPORTED_MODULE_1__["LoginView"]()) {
+ if (req.uris != null) {
+ view.uris = req.uris.map(u => _loginUri__WEBPACK_IMPORTED_MODULE_0__["LoginUri"].toView(u));
+ }
+ view.username = req.username;
+ view.password = req.password;
+ view.totp = req.totp;
+ return view;
+ }
+ static toDomain(req, domain = new _domain_login__WEBPACK_IMPORTED_MODULE_3__["Login"]()) {
+ if (req.uris != null) {
+ domain.uris = req.uris.map(u => _loginUri__WEBPACK_IMPORTED_MODULE_0__["LoginUri"].toDomain(u));
+ }
+ domain.username = req.username != null ? new _domain_encString__WEBPACK_IMPORTED_MODULE_2__["EncString"](req.username) : null;
+ domain.password = req.password != null ? new _domain_encString__WEBPACK_IMPORTED_MODULE_2__["EncString"](req.password) : null;
+ domain.totp = req.totp != null ? new _domain_encString__WEBPACK_IMPORTED_MODULE_2__["EncString"](req.totp) : null;
+ return domain;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/export/loginUri.ts":
+/*!****************************************************!*\
+ !*** ./jslib/common/src/models/export/loginUri.ts ***!
+ \****************************************************/
+/*! exports provided: LoginUri */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LoginUri", function() { return LoginUri; });
+/* harmony import */ var _view_loginUriView__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../view/loginUriView */ "./jslib/common/src/models/view/loginUriView.ts");
+/* harmony import */ var _domain_encString__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../domain/encString */ "./jslib/common/src/models/domain/encString.ts");
+/* harmony import */ var _domain_loginUri__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../domain/loginUri */ "./jslib/common/src/models/domain/loginUri.ts");
+
+
+
+class LoginUri {
+ constructor(o) {
+ var _a;
+ this.match = null;
+ if (o == null) {
+ return;
+ }
+ if (o instanceof _view_loginUriView__WEBPACK_IMPORTED_MODULE_0__["LoginUriView"]) {
+ this.uri = o.uri;
+ }
+ else {
+ this.uri = (_a = o.uri) === null || _a === void 0 ? void 0 : _a.encryptedString;
+ }
+ this.match = o.match;
+ }
+ static template() {
+ const req = new LoginUri();
+ req.uri = 'https://google.com';
+ req.match = null;
+ return req;
+ }
+ static toView(req, view = new _view_loginUriView__WEBPACK_IMPORTED_MODULE_0__["LoginUriView"]()) {
+ view.uri = req.uri;
+ view.match = req.match;
+ return view;
+ }
+ static toDomain(req, domain = new _domain_loginUri__WEBPACK_IMPORTED_MODULE_2__["LoginUri"]()) {
+ domain.uri = req.uri != null ? new _domain_encString__WEBPACK_IMPORTED_MODULE_1__["EncString"](req.uri) : null;
+ domain.match = req.match;
+ return domain;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/export/secureNote.ts":
+/*!******************************************************!*\
+ !*** ./jslib/common/src/models/export/secureNote.ts ***!
+ \******************************************************/
+/*! exports provided: SecureNote */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SecureNote", function() { return SecureNote; });
+/* harmony import */ var _enums_secureNoteType__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../enums/secureNoteType */ "./jslib/common/src/enums/secureNoteType.ts");
+/* harmony import */ var _view_secureNoteView__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../view/secureNoteView */ "./jslib/common/src/models/view/secureNoteView.ts");
+/* harmony import */ var _domain_secureNote__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../domain/secureNote */ "./jslib/common/src/models/domain/secureNote.ts");
+
+
+
+class SecureNote {
+ constructor(o) {
+ if (o == null) {
+ return;
+ }
+ this.type = o.type;
+ }
+ static template() {
+ const req = new SecureNote();
+ req.type = _enums_secureNoteType__WEBPACK_IMPORTED_MODULE_0__["SecureNoteType"].Generic;
+ return req;
+ }
+ static toView(req, view = new _view_secureNoteView__WEBPACK_IMPORTED_MODULE_1__["SecureNoteView"]()) {
+ view.type = req.type;
+ return view;
+ }
+ static toDomain(req, view = new _domain_secureNote__WEBPACK_IMPORTED_MODULE_2__["SecureNote"]()) {
+ view.type = req.type;
+ return view;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/request/account/setCryptoAgentKeyRequest.ts":
+/*!*****************************************************************************!*\
+ !*** ./jslib/common/src/models/request/account/setCryptoAgentKeyRequest.ts ***!
+ \*****************************************************************************/
+/*! exports provided: SetCryptoAgentKeyRequest */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SetCryptoAgentKeyRequest", function() { return SetCryptoAgentKeyRequest; });
+class SetCryptoAgentKeyRequest {
+ constructor(key, kdf, kdfIterations, orgIdentifier, keys) {
+ this.key = key;
+ this.kdf = kdf;
+ this.kdfIterations = kdfIterations;
+ this.orgIdentifier = orgIdentifier;
+ this.keys = keys;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/request/attachmentRequest.ts":
+/*!**************************************************************!*\
+ !*** ./jslib/common/src/models/request/attachmentRequest.ts ***!
+ \**************************************************************/
+/*! exports provided: AttachmentRequest */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AttachmentRequest", function() { return AttachmentRequest; });
+class AttachmentRequest {
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/request/cipherBulkDeleteRequest.ts":
+/*!********************************************************************!*\
+ !*** ./jslib/common/src/models/request/cipherBulkDeleteRequest.ts ***!
+ \********************************************************************/
+/*! exports provided: CipherBulkDeleteRequest */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CipherBulkDeleteRequest", function() { return CipherBulkDeleteRequest; });
+class CipherBulkDeleteRequest {
+ constructor(ids, organizationId) {
+ this.ids = ids == null ? [] : ids;
+ this.organizationId = organizationId;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/request/cipherBulkMoveRequest.ts":
+/*!******************************************************************!*\
+ !*** ./jslib/common/src/models/request/cipherBulkMoveRequest.ts ***!
+ \******************************************************************/
+/*! exports provided: CipherBulkMoveRequest */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CipherBulkMoveRequest", function() { return CipherBulkMoveRequest; });
+class CipherBulkMoveRequest {
+ constructor(ids, folderId) {
+ this.ids = ids == null ? [] : ids;
+ this.folderId = folderId;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/request/cipherBulkRestoreRequest.ts":
+/*!*********************************************************************!*\
+ !*** ./jslib/common/src/models/request/cipherBulkRestoreRequest.ts ***!
+ \*********************************************************************/
+/*! exports provided: CipherBulkRestoreRequest */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CipherBulkRestoreRequest", function() { return CipherBulkRestoreRequest; });
+class CipherBulkRestoreRequest {
+ constructor(ids) {
+ this.ids = ids == null ? [] : ids;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/request/cipherBulkShareRequest.ts":
+/*!*******************************************************************!*\
+ !*** ./jslib/common/src/models/request/cipherBulkShareRequest.ts ***!
+ \*******************************************************************/
+/*! exports provided: CipherBulkShareRequest */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CipherBulkShareRequest", function() { return CipherBulkShareRequest; });
+/* harmony import */ var _cipherWithIdRequest__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./cipherWithIdRequest */ "./jslib/common/src/models/request/cipherWithIdRequest.ts");
+
+class CipherBulkShareRequest {
+ constructor(ciphers, collectionIds) {
+ if (ciphers != null) {
+ this.ciphers = [];
+ ciphers.forEach(c => {
+ this.ciphers.push(new _cipherWithIdRequest__WEBPACK_IMPORTED_MODULE_0__["CipherWithIdRequest"](c));
+ });
+ }
+ this.collectionIds = collectionIds;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/request/cipherCollectionsRequest.ts":
+/*!*********************************************************************!*\
+ !*** ./jslib/common/src/models/request/cipherCollectionsRequest.ts ***!
+ \*********************************************************************/
+/*! exports provided: CipherCollectionsRequest */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CipherCollectionsRequest", function() { return CipherCollectionsRequest; });
+class CipherCollectionsRequest {
+ constructor(collectionIds) {
+ this.collectionIds = collectionIds == null ? [] : collectionIds;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/request/cipherCreateRequest.ts":
+/*!****************************************************************!*\
+ !*** ./jslib/common/src/models/request/cipherCreateRequest.ts ***!
+ \****************************************************************/
+/*! exports provided: CipherCreateRequest */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CipherCreateRequest", function() { return CipherCreateRequest; });
+/* harmony import */ var _cipherRequest__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./cipherRequest */ "./jslib/common/src/models/request/cipherRequest.ts");
+
+class CipherCreateRequest {
+ constructor(cipher) {
+ this.cipher = new _cipherRequest__WEBPACK_IMPORTED_MODULE_0__["CipherRequest"](cipher);
+ this.collectionIds = cipher.collectionIds;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/request/cipherRequest.ts":
+/*!**********************************************************!*\
+ !*** ./jslib/common/src/models/request/cipherRequest.ts ***!
+ \**********************************************************/
+/*! exports provided: CipherRequest */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CipherRequest", function() { return CipherRequest; });
+/* harmony import */ var _enums_cipherType__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../enums/cipherType */ "./jslib/common/src/enums/cipherType.ts");
+/* harmony import */ var _api_cardApi__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../api/cardApi */ "./jslib/common/src/models/api/cardApi.ts");
+/* harmony import */ var _api_fieldApi__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../api/fieldApi */ "./jslib/common/src/models/api/fieldApi.ts");
+/* harmony import */ var _api_identityApi__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../api/identityApi */ "./jslib/common/src/models/api/identityApi.ts");
+/* harmony import */ var _api_loginApi__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../api/loginApi */ "./jslib/common/src/models/api/loginApi.ts");
+/* harmony import */ var _api_loginUriApi__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../api/loginUriApi */ "./jslib/common/src/models/api/loginUriApi.ts");
+/* harmony import */ var _api_secureNoteApi__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../api/secureNoteApi */ "./jslib/common/src/models/api/secureNoteApi.ts");
+/* harmony import */ var _attachmentRequest__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./attachmentRequest */ "./jslib/common/src/models/request/attachmentRequest.ts");
+
+
+
+
+
+
+
+
+class CipherRequest {
+ constructor(cipher) {
+ this.type = cipher.type;
+ this.folderId = cipher.folderId;
+ this.organizationId = cipher.organizationId;
+ this.name = cipher.name ? cipher.name.encryptedString : null;
+ this.notes = cipher.notes ? cipher.notes.encryptedString : null;
+ this.favorite = cipher.favorite;
+ this.lastKnownRevisionDate = cipher.revisionDate;
+ this.reprompt = cipher.reprompt;
+ switch (this.type) {
+ case _enums_cipherType__WEBPACK_IMPORTED_MODULE_0__["CipherType"].Login:
+ this.login = new _api_loginApi__WEBPACK_IMPORTED_MODULE_4__["LoginApi"]();
+ this.login.uris = null;
+ this.login.username = cipher.login.username ? cipher.login.username.encryptedString : null;
+ this.login.password = cipher.login.password ? cipher.login.password.encryptedString : null;
+ this.login.passwordRevisionDate = cipher.login.passwordRevisionDate != null ?
+ cipher.login.passwordRevisionDate.toISOString() : null;
+ this.login.totp = cipher.login.totp ? cipher.login.totp.encryptedString : null;
+ this.login.autofillOnPageLoad = cipher.login.autofillOnPageLoad;
+ if (cipher.login.uris != null) {
+ this.login.uris = cipher.login.uris.map(u => {
+ const uri = new _api_loginUriApi__WEBPACK_IMPORTED_MODULE_5__["LoginUriApi"]();
+ uri.uri = u.uri != null ? u.uri.encryptedString : null;
+ uri.match = u.match != null ? u.match : null;
+ return uri;
+ });
+ }
+ break;
+ case _enums_cipherType__WEBPACK_IMPORTED_MODULE_0__["CipherType"].SecureNote:
+ this.secureNote = new _api_secureNoteApi__WEBPACK_IMPORTED_MODULE_6__["SecureNoteApi"]();
+ this.secureNote.type = cipher.secureNote.type;
+ break;
+ case _enums_cipherType__WEBPACK_IMPORTED_MODULE_0__["CipherType"].Card:
+ this.card = new _api_cardApi__WEBPACK_IMPORTED_MODULE_1__["CardApi"]();
+ this.card.cardholderName = cipher.card.cardholderName != null ?
+ cipher.card.cardholderName.encryptedString : null;
+ this.card.brand = cipher.card.brand != null ? cipher.card.brand.encryptedString : null;
+ this.card.number = cipher.card.number != null ? cipher.card.number.encryptedString : null;
+ this.card.expMonth = cipher.card.expMonth != null ? cipher.card.expMonth.encryptedString : null;
+ this.card.expYear = cipher.card.expYear != null ? cipher.card.expYear.encryptedString : null;
+ this.card.code = cipher.card.code != null ? cipher.card.code.encryptedString : null;
+ break;
+ case _enums_cipherType__WEBPACK_IMPORTED_MODULE_0__["CipherType"].Identity:
+ this.identity = new _api_identityApi__WEBPACK_IMPORTED_MODULE_3__["IdentityApi"]();
+ this.identity.title = cipher.identity.title != null ? cipher.identity.title.encryptedString : null;
+ this.identity.firstName = cipher.identity.firstName != null ?
+ cipher.identity.firstName.encryptedString : null;
+ this.identity.middleName = cipher.identity.middleName != null ?
+ cipher.identity.middleName.encryptedString : null;
+ this.identity.lastName = cipher.identity.lastName != null ?
+ cipher.identity.lastName.encryptedString : null;
+ this.identity.address1 = cipher.identity.address1 != null ?
+ cipher.identity.address1.encryptedString : null;
+ this.identity.address2 = cipher.identity.address2 != null ?
+ cipher.identity.address2.encryptedString : null;
+ this.identity.address3 = cipher.identity.address3 != null ?
+ cipher.identity.address3.encryptedString : null;
+ this.identity.city = cipher.identity.city != null ? cipher.identity.city.encryptedString : null;
+ this.identity.state = cipher.identity.state != null ? cipher.identity.state.encryptedString : null;
+ this.identity.postalCode = cipher.identity.postalCode != null ?
+ cipher.identity.postalCode.encryptedString : null;
+ this.identity.country = cipher.identity.country != null ?
+ cipher.identity.country.encryptedString : null;
+ this.identity.company = cipher.identity.company != null ?
+ cipher.identity.company.encryptedString : null;
+ this.identity.email = cipher.identity.email != null ? cipher.identity.email.encryptedString : null;
+ this.identity.phone = cipher.identity.phone != null ? cipher.identity.phone.encryptedString : null;
+ this.identity.ssn = cipher.identity.ssn != null ? cipher.identity.ssn.encryptedString : null;
+ this.identity.username = cipher.identity.username != null ?
+ cipher.identity.username.encryptedString : null;
+ this.identity.passportNumber = cipher.identity.passportNumber != null ?
+ cipher.identity.passportNumber.encryptedString : null;
+ this.identity.licenseNumber = cipher.identity.licenseNumber != null ?
+ cipher.identity.licenseNumber.encryptedString : null;
+ break;
+ default:
+ break;
+ }
+ if (cipher.fields != null) {
+ this.fields = cipher.fields.map(f => {
+ const field = new _api_fieldApi__WEBPACK_IMPORTED_MODULE_2__["FieldApi"]();
+ field.type = f.type;
+ field.name = f.name ? f.name.encryptedString : null;
+ field.value = f.value ? f.value.encryptedString : null;
+ field.linkedId = f.linkedId;
+ return field;
+ });
+ }
+ if (cipher.passwordHistory != null) {
+ this.passwordHistory = [];
+ cipher.passwordHistory.forEach(ph => {
+ this.passwordHistory.push({
+ lastUsedDate: ph.lastUsedDate,
+ password: ph.password ? ph.password.encryptedString : null,
+ });
+ });
+ }
+ if (cipher.attachments != null) {
+ this.attachments = {};
+ this.attachments2 = {};
+ cipher.attachments.forEach(attachment => {
+ const fileName = attachment.fileName ? attachment.fileName.encryptedString : null;
+ this.attachments[attachment.id] = fileName;
+ const attachmentRequest = new _attachmentRequest__WEBPACK_IMPORTED_MODULE_7__["AttachmentRequest"]();
+ attachmentRequest.fileName = fileName;
+ if (attachment.key != null) {
+ attachmentRequest.key = attachment.key.encryptedString;
+ }
+ this.attachments2[attachment.id] = attachmentRequest;
+ });
+ }
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/request/cipherShareRequest.ts":
+/*!***************************************************************!*\
+ !*** ./jslib/common/src/models/request/cipherShareRequest.ts ***!
+ \***************************************************************/
+/*! exports provided: CipherShareRequest */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CipherShareRequest", function() { return CipherShareRequest; });
+/* harmony import */ var _cipherRequest__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./cipherRequest */ "./jslib/common/src/models/request/cipherRequest.ts");
+
+class CipherShareRequest {
+ constructor(cipher) {
+ this.cipher = new _cipherRequest__WEBPACK_IMPORTED_MODULE_0__["CipherRequest"](cipher);
+ this.collectionIds = cipher.collectionIds;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/request/cipherWithIdRequest.ts":
+/*!****************************************************************!*\
+ !*** ./jslib/common/src/models/request/cipherWithIdRequest.ts ***!
+ \****************************************************************/
+/*! exports provided: CipherWithIdRequest */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CipherWithIdRequest", function() { return CipherWithIdRequest; });
+/* harmony import */ var _cipherRequest__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./cipherRequest */ "./jslib/common/src/models/request/cipherRequest.ts");
+
+class CipherWithIdRequest extends _cipherRequest__WEBPACK_IMPORTED_MODULE_0__["CipherRequest"] {
+ constructor(cipher) {
+ super(cipher);
+ this.id = cipher.id;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/request/cryptoAgentUserKeyRequest.ts":
+/*!**********************************************************************!*\
+ !*** ./jslib/common/src/models/request/cryptoAgentUserKeyRequest.ts ***!
+ \**********************************************************************/
+/*! exports provided: CryptoAgentUserKeyRequest */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CryptoAgentUserKeyRequest", function() { return CryptoAgentUserKeyRequest; });
+class CryptoAgentUserKeyRequest {
+ constructor(key) {
+ this.key = key;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/request/deviceRequest.ts":
+/*!**********************************************************!*\
+ !*** ./jslib/common/src/models/request/deviceRequest.ts ***!
+ \**********************************************************/
+/*! exports provided: DeviceRequest */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "DeviceRequest", function() { return DeviceRequest; });
+class DeviceRequest {
+ constructor(appId, platformUtilsService) {
+ this.type = platformUtilsService.getDevice();
+ this.name = platformUtilsService.getDeviceString();
+ this.identifier = appId;
+ this.pushToken = null;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/request/eventRequest.ts":
+/*!*********************************************************!*\
+ !*** ./jslib/common/src/models/request/eventRequest.ts ***!
+ \*********************************************************/
+/*! exports provided: EventRequest */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "EventRequest", function() { return EventRequest; });
+class EventRequest {
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/request/folderRequest.ts":
+/*!**********************************************************!*\
+ !*** ./jslib/common/src/models/request/folderRequest.ts ***!
+ \**********************************************************/
+/*! exports provided: FolderRequest */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FolderRequest", function() { return FolderRequest; });
+class FolderRequest {
+ constructor(folder) {
+ this.name = folder.name ? folder.name.encryptedString : null;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/request/keysRequest.ts":
+/*!********************************************************!*\
+ !*** ./jslib/common/src/models/request/keysRequest.ts ***!
+ \********************************************************/
+/*! exports provided: KeysRequest */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "KeysRequest", function() { return KeysRequest; });
+class KeysRequest {
+ constructor(publicKey, encryptedPrivateKey) {
+ this.publicKey = publicKey;
+ this.encryptedPrivateKey = encryptedPrivateKey;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/request/preloginRequest.ts":
+/*!************************************************************!*\
+ !*** ./jslib/common/src/models/request/preloginRequest.ts ***!
+ \************************************************************/
+/*! exports provided: PreloginRequest */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PreloginRequest", function() { return PreloginRequest; });
+class PreloginRequest {
+ constructor(email) {
+ this.email = email;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/request/sendRequest.ts":
+/*!********************************************************!*\
+ !*** ./jslib/common/src/models/request/sendRequest.ts ***!
+ \********************************************************/
+/*! exports provided: SendRequest */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SendRequest", function() { return SendRequest; });
+/* harmony import */ var _enums_sendType__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../enums/sendType */ "./jslib/common/src/enums/sendType.ts");
+/* harmony import */ var _api_sendFileApi__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../api/sendFileApi */ "./jslib/common/src/models/api/sendFileApi.ts");
+/* harmony import */ var _api_sendTextApi__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../api/sendTextApi */ "./jslib/common/src/models/api/sendTextApi.ts");
+
+
+
+class SendRequest {
+ constructor(send, fileLength) {
+ this.type = send.type;
+ this.fileLength = fileLength;
+ this.name = send.name ? send.name.encryptedString : null;
+ this.notes = send.notes ? send.notes.encryptedString : null;
+ this.maxAccessCount = send.maxAccessCount;
+ this.expirationDate = send.expirationDate != null ? send.expirationDate.toISOString() : null;
+ this.deletionDate = send.deletionDate != null ? send.deletionDate.toISOString() : null;
+ this.key = send.key != null ? send.key.encryptedString : null;
+ this.password = send.password;
+ this.disabled = send.disabled;
+ this.hideEmail = send.hideEmail;
+ switch (this.type) {
+ case _enums_sendType__WEBPACK_IMPORTED_MODULE_0__["SendType"].Text:
+ this.text = new _api_sendTextApi__WEBPACK_IMPORTED_MODULE_2__["SendTextApi"]();
+ this.text.text = send.text.text != null ? send.text.text.encryptedString : null;
+ this.text.hidden = send.text.hidden;
+ break;
+ case _enums_sendType__WEBPACK_IMPORTED_MODULE_0__["SendType"].File:
+ this.file = new _api_sendFileApi__WEBPACK_IMPORTED_MODULE_1__["SendFileApi"]();
+ this.file.fileName = send.file.fileName != null ? send.file.fileName.encryptedString : null;
+ break;
+ default:
+ break;
+ }
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/request/tokenRequest.ts":
+/*!*********************************************************!*\
+ !*** ./jslib/common/src/models/request/tokenRequest.ts ***!
+ \*********************************************************/
+/*! exports provided: TokenRequest */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TokenRequest", function() { return TokenRequest; });
+/* harmony import */ var _misc_utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../misc/utils */ "./jslib/common/src/misc/utils.ts");
+
+class TokenRequest {
+ constructor(credentials, codes, clientIdClientSecret, provider, token, remember, captchaResponse, device) {
+ this.provider = provider;
+ this.token = token;
+ this.remember = remember;
+ this.captchaResponse = captchaResponse;
+ if (credentials != null && credentials.length > 1) {
+ this.email = credentials[0];
+ this.masterPasswordHash = credentials[1];
+ }
+ else if (codes != null && codes.length > 2) {
+ this.code = codes[0];
+ this.codeVerifier = codes[1];
+ this.redirectUri = codes[2];
+ }
+ else if (clientIdClientSecret != null && clientIdClientSecret.length > 1) {
+ this.clientId = clientIdClientSecret[0];
+ this.clientSecret = clientIdClientSecret[1];
+ }
+ this.device = device != null ? device : null;
+ }
+ toIdentityToken(clientId) {
+ const obj = {
+ scope: 'api offline_access',
+ client_id: clientId,
+ };
+ if (this.clientSecret != null) {
+ obj.scope = clientId.startsWith('organization') ? 'api.organization' : 'api';
+ obj.grant_type = 'client_credentials';
+ obj.client_secret = this.clientSecret;
+ }
+ else if (this.masterPasswordHash != null && this.email != null) {
+ obj.grant_type = 'password';
+ obj.username = this.email;
+ obj.password = this.masterPasswordHash;
+ }
+ else if (this.code != null && this.codeVerifier != null && this.redirectUri != null) {
+ obj.grant_type = 'authorization_code';
+ obj.code = this.code;
+ obj.code_verifier = this.codeVerifier;
+ obj.redirect_uri = this.redirectUri;
+ }
+ else {
+ throw new Error('must provide credentials or codes');
+ }
+ if (this.device) {
+ obj.deviceType = this.device.type;
+ obj.deviceIdentifier = this.device.identifier;
+ obj.deviceName = this.device.name;
+ // no push tokens for browser apps yet
+ // obj.devicePushToken = this.device.pushToken;
+ }
+ if (this.token && this.provider != null) {
+ obj.twoFactorToken = this.token;
+ obj.twoFactorProvider = this.provider;
+ obj.twoFactorRemember = this.remember ? '1' : '0';
+ }
+ if (this.captchaResponse != null) {
+ obj.captchaResponse = this.captchaResponse;
+ }
+ return obj;
+ }
+ alterIdentityTokenHeaders(headers) {
+ if (this.clientSecret == null && this.masterPasswordHash != null && this.email != null) {
+ headers.set('Auth-Email', _misc_utils__WEBPACK_IMPORTED_MODULE_0__["Utils"].fromUtf8ToUrlB64(this.email));
+ }
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/response/apiKeyResponse.ts":
+/*!************************************************************!*\
+ !*** ./jslib/common/src/models/response/apiKeyResponse.ts ***!
+ \************************************************************/
+/*! exports provided: ApiKeyResponse */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ApiKeyResponse", function() { return ApiKeyResponse; });
+/* harmony import */ var _baseResponse__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./baseResponse */ "./jslib/common/src/models/response/baseResponse.ts");
+
+class ApiKeyResponse extends _baseResponse__WEBPACK_IMPORTED_MODULE_0__["BaseResponse"] {
+ constructor(response) {
+ super(response);
+ this.apiKey = this.getResponseProperty('ApiKey');
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/response/attachmentResponse.ts":
+/*!****************************************************************!*\
+ !*** ./jslib/common/src/models/response/attachmentResponse.ts ***!
+ \****************************************************************/
+/*! exports provided: AttachmentResponse */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AttachmentResponse", function() { return AttachmentResponse; });
+/* harmony import */ var _baseResponse__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./baseResponse */ "./jslib/common/src/models/response/baseResponse.ts");
+
+class AttachmentResponse extends _baseResponse__WEBPACK_IMPORTED_MODULE_0__["BaseResponse"] {
+ constructor(response) {
+ super(response);
+ this.id = this.getResponseProperty('Id');
+ this.url = this.getResponseProperty('Url');
+ this.fileName = this.getResponseProperty('FileName');
+ this.key = this.getResponseProperty('Key');
+ this.size = this.getResponseProperty('Size');
+ this.sizeName = this.getResponseProperty('SizeName');
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/response/attachmentUploadDataResponse.ts":
+/*!**************************************************************************!*\
+ !*** ./jslib/common/src/models/response/attachmentUploadDataResponse.ts ***!
+ \**************************************************************************/
+/*! exports provided: AttachmentUploadDataResponse */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AttachmentUploadDataResponse", function() { return AttachmentUploadDataResponse; });
+/* harmony import */ var _baseResponse__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./baseResponse */ "./jslib/common/src/models/response/baseResponse.ts");
+/* harmony import */ var _cipherResponse__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./cipherResponse */ "./jslib/common/src/models/response/cipherResponse.ts");
+
+
+class AttachmentUploadDataResponse extends _baseResponse__WEBPACK_IMPORTED_MODULE_0__["BaseResponse"] {
+ constructor(response) {
+ super(response);
+ this.url = null;
+ this.attachmentId = this.getResponseProperty('AttachmentId');
+ this.fileUploadType = this.getResponseProperty('FileUploadType');
+ const cipherResponse = this.getResponseProperty('CipherResponse');
+ const cipherMiniResponse = this.getResponseProperty('CipherMiniResponse');
+ this.cipherResponse = cipherResponse == null ? null : new _cipherResponse__WEBPACK_IMPORTED_MODULE_1__["CipherResponse"](cipherResponse);
+ this.cipherMiniResponse = cipherMiniResponse == null ? null : new _cipherResponse__WEBPACK_IMPORTED_MODULE_1__["CipherResponse"](cipherMiniResponse);
+ this.url = this.getResponseProperty('Url');
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/response/baseResponse.ts":
+/*!**********************************************************!*\
+ !*** ./jslib/common/src/models/response/baseResponse.ts ***!
+ \**********************************************************/
+/*! exports provided: BaseResponse */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BaseResponse", function() { return BaseResponse; });
+class BaseResponse {
+ constructor(response) {
+ this.response = response;
+ }
+ getResponseProperty(propertyName, response = null, exactName = false) {
+ if (propertyName == null || propertyName === '') {
+ throw new Error('propertyName must not be null/empty.');
+ }
+ if (response == null && this.response != null) {
+ response = this.response;
+ }
+ if (response == null) {
+ return null;
+ }
+ if (!exactName && response[propertyName] === undefined) {
+ let otherCasePropertyName = null;
+ if (propertyName.charAt(0) === propertyName.charAt(0).toUpperCase()) {
+ otherCasePropertyName = propertyName.charAt(0).toLowerCase();
+ }
+ else {
+ otherCasePropertyName = propertyName.charAt(0).toUpperCase();
+ }
+ if (propertyName.length > 1) {
+ otherCasePropertyName += propertyName.slice(1);
+ }
+ propertyName = otherCasePropertyName;
+ if (response[propertyName] === undefined) {
+ propertyName = propertyName.toLowerCase();
+ }
+ if (response[propertyName] === undefined) {
+ propertyName = propertyName.toUpperCase();
+ }
+ }
+ return response[propertyName];
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/response/billingResponse.ts":
+/*!*************************************************************!*\
+ !*** ./jslib/common/src/models/response/billingResponse.ts ***!
+ \*************************************************************/
+/*! exports provided: BillingResponse, BillingSourceResponse, BillingInvoiceResponse, BillingTransactionResponse */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BillingResponse", function() { return BillingResponse; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BillingSourceResponse", function() { return BillingSourceResponse; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BillingInvoiceResponse", function() { return BillingInvoiceResponse; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BillingTransactionResponse", function() { return BillingTransactionResponse; });
+/* harmony import */ var _baseResponse__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./baseResponse */ "./jslib/common/src/models/response/baseResponse.ts");
+
+class BillingResponse extends _baseResponse__WEBPACK_IMPORTED_MODULE_0__["BaseResponse"] {
+ constructor(response) {
+ super(response);
+ this.invoices = [];
+ this.transactions = [];
+ this.balance = this.getResponseProperty('Balance');
+ const paymentSource = this.getResponseProperty('PaymentSource');
+ const transactions = this.getResponseProperty('Transactions');
+ const invoices = this.getResponseProperty('Invoices');
+ this.paymentSource = paymentSource == null ? null : new BillingSourceResponse(paymentSource);
+ if (transactions != null) {
+ this.transactions = transactions.map((t) => new BillingTransactionResponse(t));
+ }
+ if (invoices != null) {
+ this.invoices = invoices.map((i) => new BillingInvoiceResponse(i));
+ }
+ }
+}
+class BillingSourceResponse extends _baseResponse__WEBPACK_IMPORTED_MODULE_0__["BaseResponse"] {
+ constructor(response) {
+ super(response);
+ this.type = this.getResponseProperty('Type');
+ this.cardBrand = this.getResponseProperty('CardBrand');
+ this.description = this.getResponseProperty('Description');
+ this.needsVerification = this.getResponseProperty('NeedsVerification');
+ }
+}
+class BillingInvoiceResponse extends _baseResponse__WEBPACK_IMPORTED_MODULE_0__["BaseResponse"] {
+ constructor(response) {
+ super(response);
+ this.url = this.getResponseProperty('Url');
+ this.pdfUrl = this.getResponseProperty('PdfUrl');
+ this.number = this.getResponseProperty('Number');
+ this.paid = this.getResponseProperty('Paid');
+ this.date = this.getResponseProperty('Date');
+ this.amount = this.getResponseProperty('Amount');
+ }
+}
+class BillingTransactionResponse extends _baseResponse__WEBPACK_IMPORTED_MODULE_0__["BaseResponse"] {
+ constructor(response) {
+ super(response);
+ this.createdDate = this.getResponseProperty('CreatedDate');
+ this.amount = this.getResponseProperty('Amount');
+ this.refunded = this.getResponseProperty('Refunded');
+ this.partiallyRefunded = this.getResponseProperty('PartiallyRefunded');
+ this.refundedAmount = this.getResponseProperty('RefundedAmount');
+ this.type = this.getResponseProperty('Type');
+ this.paymentMethodType = this.getResponseProperty('PaymentMethodType');
+ this.details = this.getResponseProperty('Details');
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/response/breachAccountResponse.ts":
+/*!*******************************************************************!*\
+ !*** ./jslib/common/src/models/response/breachAccountResponse.ts ***!
+ \*******************************************************************/
+/*! exports provided: BreachAccountResponse */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BreachAccountResponse", function() { return BreachAccountResponse; });
+/* harmony import */ var _baseResponse__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./baseResponse */ "./jslib/common/src/models/response/baseResponse.ts");
+
+class BreachAccountResponse extends _baseResponse__WEBPACK_IMPORTED_MODULE_0__["BaseResponse"] {
+ constructor(response) {
+ super(response);
+ this.addedDate = this.getResponseProperty('AddedDate');
+ this.breachDate = this.getResponseProperty('BreachDate');
+ this.dataClasses = this.getResponseProperty('DataClasses');
+ this.description = this.getResponseProperty('Description');
+ this.domain = this.getResponseProperty('Domain');
+ this.isActive = this.getResponseProperty('IsActive');
+ this.isVerified = this.getResponseProperty('IsVerified');
+ this.logoPath = this.getResponseProperty('LogoPath');
+ this.modifiedDate = this.getResponseProperty('ModifiedDate');
+ this.name = this.getResponseProperty('Name');
+ this.pwnCount = this.getResponseProperty('PwnCount');
+ this.title = this.getResponseProperty('Title');
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/response/cipherResponse.ts":
+/*!************************************************************!*\
+ !*** ./jslib/common/src/models/response/cipherResponse.ts ***!
+ \************************************************************/
+/*! exports provided: CipherResponse */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CipherResponse", function() { return CipherResponse; });
+/* harmony import */ var _attachmentResponse__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./attachmentResponse */ "./jslib/common/src/models/response/attachmentResponse.ts");
+/* harmony import */ var _baseResponse__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./baseResponse */ "./jslib/common/src/models/response/baseResponse.ts");
+/* harmony import */ var _passwordHistoryResponse__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./passwordHistoryResponse */ "./jslib/common/src/models/response/passwordHistoryResponse.ts");
+/* harmony import */ var _enums_cipherRepromptType__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../enums/cipherRepromptType */ "./jslib/common/src/enums/cipherRepromptType.ts");
+/* harmony import */ var _api_cardApi__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../api/cardApi */ "./jslib/common/src/models/api/cardApi.ts");
+/* harmony import */ var _api_fieldApi__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../api/fieldApi */ "./jslib/common/src/models/api/fieldApi.ts");
+/* harmony import */ var _api_identityApi__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../api/identityApi */ "./jslib/common/src/models/api/identityApi.ts");
+/* harmony import */ var _api_loginApi__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../api/loginApi */ "./jslib/common/src/models/api/loginApi.ts");
+/* harmony import */ var _api_secureNoteApi__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../api/secureNoteApi */ "./jslib/common/src/models/api/secureNoteApi.ts");
+
+
+
+
+
+
+
+
+
+class CipherResponse extends _baseResponse__WEBPACK_IMPORTED_MODULE_1__["BaseResponse"] {
+ constructor(response) {
+ super(response);
+ this.id = this.getResponseProperty('Id');
+ this.organizationId = this.getResponseProperty('OrganizationId');
+ this.folderId = this.getResponseProperty('FolderId') || null;
+ this.type = this.getResponseProperty('Type');
+ this.name = this.getResponseProperty('Name');
+ this.notes = this.getResponseProperty('Notes');
+ this.favorite = this.getResponseProperty('Favorite') || false;
+ this.edit = !!this.getResponseProperty('Edit');
+ if (this.getResponseProperty('ViewPassword') == null) {
+ this.viewPassword = true;
+ }
+ else {
+ this.viewPassword = this.getResponseProperty('ViewPassword');
+ }
+ this.organizationUseTotp = this.getResponseProperty('OrganizationUseTotp');
+ this.revisionDate = this.getResponseProperty('RevisionDate');
+ this.collectionIds = this.getResponseProperty('CollectionIds');
+ this.deletedDate = this.getResponseProperty('DeletedDate');
+ const login = this.getResponseProperty('Login');
+ if (login != null) {
+ this.login = new _api_loginApi__WEBPACK_IMPORTED_MODULE_7__["LoginApi"](login);
+ }
+ const card = this.getResponseProperty('Card');
+ if (card != null) {
+ this.card = new _api_cardApi__WEBPACK_IMPORTED_MODULE_4__["CardApi"](card);
+ }
+ const identity = this.getResponseProperty('Identity');
+ if (identity != null) {
+ this.identity = new _api_identityApi__WEBPACK_IMPORTED_MODULE_6__["IdentityApi"](identity);
+ }
+ const secureNote = this.getResponseProperty('SecureNote');
+ if (secureNote != null) {
+ this.secureNote = new _api_secureNoteApi__WEBPACK_IMPORTED_MODULE_8__["SecureNoteApi"](secureNote);
+ }
+ const fields = this.getResponseProperty('Fields');
+ if (fields != null) {
+ this.fields = fields.map((f) => new _api_fieldApi__WEBPACK_IMPORTED_MODULE_5__["FieldApi"](f));
+ }
+ const attachments = this.getResponseProperty('Attachments');
+ if (attachments != null) {
+ this.attachments = attachments.map((a) => new _attachmentResponse__WEBPACK_IMPORTED_MODULE_0__["AttachmentResponse"](a));
+ }
+ const passwordHistory = this.getResponseProperty('PasswordHistory');
+ if (passwordHistory != null) {
+ this.passwordHistory = passwordHistory.map((h) => new _passwordHistoryResponse__WEBPACK_IMPORTED_MODULE_2__["PasswordHistoryResponse"](h));
+ }
+ this.reprompt = this.getResponseProperty('Reprompt') || _enums_cipherRepromptType__WEBPACK_IMPORTED_MODULE_3__["CipherRepromptType"].None;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/response/collectionResponse.ts":
+/*!****************************************************************!*\
+ !*** ./jslib/common/src/models/response/collectionResponse.ts ***!
+ \****************************************************************/
+/*! exports provided: CollectionResponse, CollectionDetailsResponse, CollectionGroupDetailsResponse */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CollectionResponse", function() { return CollectionResponse; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CollectionDetailsResponse", function() { return CollectionDetailsResponse; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CollectionGroupDetailsResponse", function() { return CollectionGroupDetailsResponse; });
+/* harmony import */ var _baseResponse__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./baseResponse */ "./jslib/common/src/models/response/baseResponse.ts");
+/* harmony import */ var _selectionReadOnlyResponse__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./selectionReadOnlyResponse */ "./jslib/common/src/models/response/selectionReadOnlyResponse.ts");
+
+
+class CollectionResponse extends _baseResponse__WEBPACK_IMPORTED_MODULE_0__["BaseResponse"] {
+ constructor(response) {
+ super(response);
+ this.id = this.getResponseProperty('Id');
+ this.organizationId = this.getResponseProperty('OrganizationId');
+ this.name = this.getResponseProperty('Name');
+ this.externalId = this.getResponseProperty('ExternalId');
+ }
+}
+class CollectionDetailsResponse extends CollectionResponse {
+ constructor(response) {
+ super(response);
+ this.readOnly = this.getResponseProperty('ReadOnly') || false;
+ }
+}
+class CollectionGroupDetailsResponse extends CollectionResponse {
+ constructor(response) {
+ super(response);
+ this.groups = [];
+ const groups = this.getResponseProperty('Groups');
+ if (groups != null) {
+ this.groups = groups.map((g) => new _selectionReadOnlyResponse__WEBPACK_IMPORTED_MODULE_1__["SelectionReadOnlyResponse"](g));
+ }
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/response/cryptoAgentUserKeyResponse.ts":
+/*!************************************************************************!*\
+ !*** ./jslib/common/src/models/response/cryptoAgentUserKeyResponse.ts ***!
+ \************************************************************************/
+/*! exports provided: CryptoAgentUserKeyResponse */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CryptoAgentUserKeyResponse", function() { return CryptoAgentUserKeyResponse; });
+/* harmony import */ var _baseResponse__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./baseResponse */ "./jslib/common/src/models/response/baseResponse.ts");
+
+class CryptoAgentUserKeyResponse extends _baseResponse__WEBPACK_IMPORTED_MODULE_0__["BaseResponse"] {
+ constructor(response) {
+ super(response);
+ this.key = this.getResponseProperty('Key');
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/response/domainsResponse.ts":
+/*!*************************************************************!*\
+ !*** ./jslib/common/src/models/response/domainsResponse.ts ***!
+ \*************************************************************/
+/*! exports provided: DomainsResponse */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "DomainsResponse", function() { return DomainsResponse; });
+/* harmony import */ var _baseResponse__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./baseResponse */ "./jslib/common/src/models/response/baseResponse.ts");
+/* harmony import */ var _globalDomainResponse__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./globalDomainResponse */ "./jslib/common/src/models/response/globalDomainResponse.ts");
+
+
+class DomainsResponse extends _baseResponse__WEBPACK_IMPORTED_MODULE_0__["BaseResponse"] {
+ constructor(response) {
+ super(response);
+ this.globalEquivalentDomains = [];
+ this.equivalentDomains = this.getResponseProperty('EquivalentDomains');
+ const globalEquivalentDomains = this.getResponseProperty('GlobalEquivalentDomains');
+ if (globalEquivalentDomains != null) {
+ this.globalEquivalentDomains = globalEquivalentDomains.map((d) => new _globalDomainResponse__WEBPACK_IMPORTED_MODULE_1__["GlobalDomainResponse"](d));
+ }
+ else {
+ this.globalEquivalentDomains = [];
+ }
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/response/emergencyAccessResponse.ts":
+/*!*********************************************************************!*\
+ !*** ./jslib/common/src/models/response/emergencyAccessResponse.ts ***!
+ \*********************************************************************/
+/*! exports provided: EmergencyAccessGranteeDetailsResponse, EmergencyAccessGrantorDetailsResponse, EmergencyAccessTakeoverResponse, EmergencyAccessViewResponse */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "EmergencyAccessGranteeDetailsResponse", function() { return EmergencyAccessGranteeDetailsResponse; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "EmergencyAccessGrantorDetailsResponse", function() { return EmergencyAccessGrantorDetailsResponse; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "EmergencyAccessTakeoverResponse", function() { return EmergencyAccessTakeoverResponse; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "EmergencyAccessViewResponse", function() { return EmergencyAccessViewResponse; });
+/* harmony import */ var _baseResponse__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./baseResponse */ "./jslib/common/src/models/response/baseResponse.ts");
+/* harmony import */ var _cipherResponse__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./cipherResponse */ "./jslib/common/src/models/response/cipherResponse.ts");
+
+
+class EmergencyAccessGranteeDetailsResponse extends _baseResponse__WEBPACK_IMPORTED_MODULE_0__["BaseResponse"] {
+ constructor(response) {
+ super(response);
+ this.id = this.getResponseProperty('Id');
+ this.granteeId = this.getResponseProperty('GranteeId');
+ this.name = this.getResponseProperty('Name');
+ this.email = this.getResponseProperty('Email');
+ this.type = this.getResponseProperty('Type');
+ this.status = this.getResponseProperty('Status');
+ this.waitTimeDays = this.getResponseProperty('WaitTimeDays');
+ this.creationDate = this.getResponseProperty('CreationDate');
+ }
+}
+class EmergencyAccessGrantorDetailsResponse extends _baseResponse__WEBPACK_IMPORTED_MODULE_0__["BaseResponse"] {
+ constructor(response) {
+ super(response);
+ this.id = this.getResponseProperty('Id');
+ this.grantorId = this.getResponseProperty('GrantorId');
+ this.name = this.getResponseProperty('Name');
+ this.email = this.getResponseProperty('Email');
+ this.type = this.getResponseProperty('Type');
+ this.status = this.getResponseProperty('Status');
+ this.waitTimeDays = this.getResponseProperty('WaitTimeDays');
+ this.creationDate = this.getResponseProperty('CreationDate');
+ }
+}
+class EmergencyAccessTakeoverResponse extends _baseResponse__WEBPACK_IMPORTED_MODULE_0__["BaseResponse"] {
+ constructor(response) {
+ super(response);
+ this.keyEncrypted = this.getResponseProperty('KeyEncrypted');
+ this.kdf = this.getResponseProperty('Kdf');
+ this.kdfIterations = this.getResponseProperty('KdfIterations');
+ }
+}
+class EmergencyAccessViewResponse extends _baseResponse__WEBPACK_IMPORTED_MODULE_0__["BaseResponse"] {
+ constructor(response) {
+ super(response);
+ this.ciphers = [];
+ this.keyEncrypted = this.getResponseProperty('KeyEncrypted');
+ const ciphers = this.getResponseProperty('Ciphers');
+ if (ciphers != null) {
+ this.ciphers = ciphers.map((c) => new _cipherResponse__WEBPACK_IMPORTED_MODULE_1__["CipherResponse"](c));
+ }
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/response/errorResponse.ts":
+/*!***********************************************************!*\
+ !*** ./jslib/common/src/models/response/errorResponse.ts ***!
+ \***********************************************************/
+/*! exports provided: ErrorResponse */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ErrorResponse", function() { return ErrorResponse; });
+/* harmony import */ var _misc_utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../misc/utils */ "./jslib/common/src/misc/utils.ts");
+/* harmony import */ var _baseResponse__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./baseResponse */ "./jslib/common/src/models/response/baseResponse.ts");
+
+
+class ErrorResponse extends _baseResponse__WEBPACK_IMPORTED_MODULE_1__["BaseResponse"] {
+ constructor(response, status, identityResponse) {
+ var _a, _b;
+ super(response);
+ let errorModel = null;
+ if (response != null) {
+ const responseErrorModel = this.getResponseProperty('ErrorModel');
+ if (responseErrorModel && identityResponse) {
+ errorModel = responseErrorModel;
+ }
+ else {
+ errorModel = response;
+ }
+ }
+ if (errorModel) {
+ this.message = this.getResponseProperty('Message', errorModel);
+ this.validationErrors = this.getResponseProperty('ValidationErrors', errorModel);
+ this.captchaSiteKey = (_b = (_a = this.validationErrors) === null || _a === void 0 ? void 0 : _a.HCaptcha_SiteKey) === null || _b === void 0 ? void 0 : _b[0];
+ this.captchaRequired = !_misc_utils__WEBPACK_IMPORTED_MODULE_0__["Utils"].isNullOrWhitespace(this.captchaSiteKey);
+ }
+ else {
+ if (status === 429) {
+ this.message = 'Rate limit exceeded. Try again later.';
+ }
+ }
+ this.statusCode = status;
+ }
+ getSingleMessage() {
+ if (this.validationErrors == null) {
+ return this.message;
+ }
+ for (const key in this.validationErrors) {
+ if (!this.validationErrors.hasOwnProperty(key)) {
+ continue;
+ }
+ if (this.validationErrors[key].length) {
+ return this.validationErrors[key][0];
+ }
+ }
+ return this.message;
+ }
+ getAllMessages() {
+ const messages = [];
+ if (this.validationErrors == null) {
+ return messages;
+ }
+ for (const key in this.validationErrors) {
+ if (!this.validationErrors.hasOwnProperty(key)) {
+ continue;
+ }
+ this.validationErrors[key].forEach((item) => {
+ let prefix = '';
+ if (key.indexOf('[') > -1 && key.indexOf(']') > -1) {
+ const lastSep = key.lastIndexOf('.');
+ prefix = key.substr(0, lastSep > -1 ? lastSep : key.length) + ': ';
+ }
+ messages.push(prefix + item);
+ });
+ }
+ return messages;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/response/eventResponse.ts":
+/*!***********************************************************!*\
+ !*** ./jslib/common/src/models/response/eventResponse.ts ***!
+ \***********************************************************/
+/*! exports provided: EventResponse */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "EventResponse", function() { return EventResponse; });
+/* harmony import */ var _baseResponse__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./baseResponse */ "./jslib/common/src/models/response/baseResponse.ts");
+
+class EventResponse extends _baseResponse__WEBPACK_IMPORTED_MODULE_0__["BaseResponse"] {
+ constructor(response) {
+ super(response);
+ this.type = this.getResponseProperty('Type');
+ this.userId = this.getResponseProperty('UserId');
+ this.organizationId = this.getResponseProperty('OrganizationId');
+ this.providerId = this.getResponseProperty('ProviderId');
+ this.cipherId = this.getResponseProperty('CipherId');
+ this.collectionId = this.getResponseProperty('CollectionId');
+ this.groupId = this.getResponseProperty('GroupId');
+ this.policyId = this.getResponseProperty('PolicyId');
+ this.organizationUserId = this.getResponseProperty('OrganizationUserId');
+ this.providerUserId = this.getResponseProperty('ProviderUserId');
+ this.providerOrganizationId = this.getResponseProperty('ProviderOrganizationId');
+ this.actingUserId = this.getResponseProperty('ActingUserId');
+ this.date = this.getResponseProperty('Date');
+ this.deviceType = this.getResponseProperty('DeviceType');
+ this.ipAddress = this.getResponseProperty('IpAddress');
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/response/folderResponse.ts":
+/*!************************************************************!*\
+ !*** ./jslib/common/src/models/response/folderResponse.ts ***!
+ \************************************************************/
+/*! exports provided: FolderResponse */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FolderResponse", function() { return FolderResponse; });
+/* harmony import */ var _baseResponse__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./baseResponse */ "./jslib/common/src/models/response/baseResponse.ts");
+
+class FolderResponse extends _baseResponse__WEBPACK_IMPORTED_MODULE_0__["BaseResponse"] {
+ constructor(response) {
+ super(response);
+ this.id = this.getResponseProperty('Id');
+ this.name = this.getResponseProperty('Name');
+ this.revisionDate = this.getResponseProperty('RevisionDate');
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/response/globalDomainResponse.ts":
+/*!******************************************************************!*\
+ !*** ./jslib/common/src/models/response/globalDomainResponse.ts ***!
+ \******************************************************************/
+/*! exports provided: GlobalDomainResponse */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "GlobalDomainResponse", function() { return GlobalDomainResponse; });
+/* harmony import */ var _baseResponse__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./baseResponse */ "./jslib/common/src/models/response/baseResponse.ts");
+
+class GlobalDomainResponse extends _baseResponse__WEBPACK_IMPORTED_MODULE_0__["BaseResponse"] {
+ constructor(response) {
+ super(response);
+ this.type = this.getResponseProperty('Type');
+ this.domains = this.getResponseProperty('Domains');
+ this.excluded = this.getResponseProperty('Excluded');
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/response/groupResponse.ts":
+/*!***********************************************************!*\
+ !*** ./jslib/common/src/models/response/groupResponse.ts ***!
+ \***********************************************************/
+/*! exports provided: GroupResponse, GroupDetailsResponse */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "GroupResponse", function() { return GroupResponse; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "GroupDetailsResponse", function() { return GroupDetailsResponse; });
+/* harmony import */ var _baseResponse__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./baseResponse */ "./jslib/common/src/models/response/baseResponse.ts");
+/* harmony import */ var _selectionReadOnlyResponse__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./selectionReadOnlyResponse */ "./jslib/common/src/models/response/selectionReadOnlyResponse.ts");
+
+
+class GroupResponse extends _baseResponse__WEBPACK_IMPORTED_MODULE_0__["BaseResponse"] {
+ constructor(response) {
+ super(response);
+ this.id = this.getResponseProperty('Id');
+ this.organizationId = this.getResponseProperty('OrganizationId');
+ this.name = this.getResponseProperty('Name');
+ this.accessAll = this.getResponseProperty('AccessAll');
+ this.externalId = this.getResponseProperty('ExternalId');
+ }
+}
+class GroupDetailsResponse extends GroupResponse {
+ constructor(response) {
+ super(response);
+ this.collections = [];
+ const collections = this.getResponseProperty('Collections');
+ if (collections != null) {
+ this.collections = collections.map((c) => new _selectionReadOnlyResponse__WEBPACK_IMPORTED_MODULE_1__["SelectionReadOnlyResponse"](c));
+ }
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/response/identityCaptchaResponse.ts":
+/*!*********************************************************************!*\
+ !*** ./jslib/common/src/models/response/identityCaptchaResponse.ts ***!
+ \*********************************************************************/
+/*! exports provided: IdentityCaptchaResponse */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "IdentityCaptchaResponse", function() { return IdentityCaptchaResponse; });
+/* harmony import */ var _baseResponse__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./baseResponse */ "./jslib/common/src/models/response/baseResponse.ts");
+
+class IdentityCaptchaResponse extends _baseResponse__WEBPACK_IMPORTED_MODULE_0__["BaseResponse"] {
+ constructor(response) {
+ super(response);
+ this.siteKey = this.getResponseProperty('HCaptcha_SiteKey');
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/response/identityTokenResponse.ts":
+/*!*******************************************************************!*\
+ !*** ./jslib/common/src/models/response/identityTokenResponse.ts ***!
+ \*******************************************************************/
+/*! exports provided: IdentityTokenResponse */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "IdentityTokenResponse", function() { return IdentityTokenResponse; });
+/* harmony import */ var _baseResponse__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./baseResponse */ "./jslib/common/src/models/response/baseResponse.ts");
+
+class IdentityTokenResponse extends _baseResponse__WEBPACK_IMPORTED_MODULE_0__["BaseResponse"] {
+ constructor(response) {
+ super(response);
+ this.accessToken = response.access_token;
+ this.expiresIn = response.expires_in;
+ this.refreshToken = response.refresh_token;
+ this.tokenType = response.token_type;
+ this.resetMasterPassword = this.getResponseProperty('ResetMasterPassword');
+ this.privateKey = this.getResponseProperty('PrivateKey');
+ this.key = this.getResponseProperty('Key');
+ this.twoFactorToken = this.getResponseProperty('TwoFactorToken');
+ this.kdf = this.getResponseProperty('Kdf');
+ this.kdfIterations = this.getResponseProperty('KdfIterations');
+ this.forcePasswordReset = this.getResponseProperty('ForcePasswordReset');
+ this.cryptoAgentUrl = this.getResponseProperty('CryptoAgentUrl');
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/response/identityTwoFactorResponse.ts":
+/*!***********************************************************************!*\
+ !*** ./jslib/common/src/models/response/identityTwoFactorResponse.ts ***!
+ \***********************************************************************/
+/*! exports provided: IdentityTwoFactorResponse */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "IdentityTwoFactorResponse", function() { return IdentityTwoFactorResponse; });
+/* harmony import */ var _baseResponse__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./baseResponse */ "./jslib/common/src/models/response/baseResponse.ts");
+
+class IdentityTwoFactorResponse extends _baseResponse__WEBPACK_IMPORTED_MODULE_0__["BaseResponse"] {
+ constructor(response) {
+ super(response);
+ this.twoFactorProviders2 = new Map();
+ this.captchaToken = this.getResponseProperty('CaptchaBypassToken');
+ this.twoFactorProviders = this.getResponseProperty('TwoFactorProviders');
+ const twoFactorProviders2 = this.getResponseProperty('TwoFactorProviders2');
+ if (twoFactorProviders2 != null) {
+ for (const prop in twoFactorProviders2) {
+ if (twoFactorProviders2.hasOwnProperty(prop)) {
+ this.twoFactorProviders2.set(parseInt(prop, null), twoFactorProviders2[prop]);
+ }
+ }
+ }
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/response/keysResponse.ts":
+/*!**********************************************************!*\
+ !*** ./jslib/common/src/models/response/keysResponse.ts ***!
+ \**********************************************************/
+/*! exports provided: KeysResponse */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "KeysResponse", function() { return KeysResponse; });
+/* harmony import */ var _baseResponse__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./baseResponse */ "./jslib/common/src/models/response/baseResponse.ts");
+
+class KeysResponse extends _baseResponse__WEBPACK_IMPORTED_MODULE_0__["BaseResponse"] {
+ constructor(response) {
+ super(response);
+ this.privateKey = this.getResponseProperty('PrivateKey');
+ this.publicKey = this.getResponseProperty('PublicKey');
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/response/listResponse.ts":
+/*!**********************************************************!*\
+ !*** ./jslib/common/src/models/response/listResponse.ts ***!
+ \**********************************************************/
+/*! exports provided: ListResponse */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ListResponse", function() { return ListResponse; });
+/* harmony import */ var _baseResponse__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./baseResponse */ "./jslib/common/src/models/response/baseResponse.ts");
+
+class ListResponse extends _baseResponse__WEBPACK_IMPORTED_MODULE_0__["BaseResponse"] {
+ constructor(response, t) {
+ super(response);
+ const data = this.getResponseProperty('Data');
+ this.data = data == null ? [] : data.map((dr) => new t(dr));
+ this.continuationToken = this.getResponseProperty('ContinuationToken');
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/response/notificationResponse.ts":
+/*!******************************************************************!*\
+ !*** ./jslib/common/src/models/response/notificationResponse.ts ***!
+ \******************************************************************/
+/*! exports provided: NotificationResponse, SyncCipherNotification, SyncFolderNotification, UserNotification, SyncSendNotification */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "NotificationResponse", function() { return NotificationResponse; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SyncCipherNotification", function() { return SyncCipherNotification; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SyncFolderNotification", function() { return SyncFolderNotification; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "UserNotification", function() { return UserNotification; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SyncSendNotification", function() { return SyncSendNotification; });
+/* harmony import */ var _baseResponse__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./baseResponse */ "./jslib/common/src/models/response/baseResponse.ts");
+/* harmony import */ var _enums_notificationType__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../enums/notificationType */ "./jslib/common/src/enums/notificationType.ts");
+
+
+class NotificationResponse extends _baseResponse__WEBPACK_IMPORTED_MODULE_0__["BaseResponse"] {
+ constructor(response) {
+ super(response);
+ this.contextId = this.getResponseProperty('ContextId');
+ this.type = this.getResponseProperty('Type');
+ const payload = this.getResponseProperty('Payload');
+ switch (this.type) {
+ case _enums_notificationType__WEBPACK_IMPORTED_MODULE_1__["NotificationType"].SyncCipherCreate:
+ case _enums_notificationType__WEBPACK_IMPORTED_MODULE_1__["NotificationType"].SyncCipherDelete:
+ case _enums_notificationType__WEBPACK_IMPORTED_MODULE_1__["NotificationType"].SyncCipherUpdate:
+ case _enums_notificationType__WEBPACK_IMPORTED_MODULE_1__["NotificationType"].SyncLoginDelete:
+ this.payload = new SyncCipherNotification(payload);
+ break;
+ case _enums_notificationType__WEBPACK_IMPORTED_MODULE_1__["NotificationType"].SyncFolderCreate:
+ case _enums_notificationType__WEBPACK_IMPORTED_MODULE_1__["NotificationType"].SyncFolderDelete:
+ case _enums_notificationType__WEBPACK_IMPORTED_MODULE_1__["NotificationType"].SyncFolderUpdate:
+ this.payload = new SyncFolderNotification(payload);
+ break;
+ case _enums_notificationType__WEBPACK_IMPORTED_MODULE_1__["NotificationType"].SyncVault:
+ case _enums_notificationType__WEBPACK_IMPORTED_MODULE_1__["NotificationType"].SyncCiphers:
+ case _enums_notificationType__WEBPACK_IMPORTED_MODULE_1__["NotificationType"].SyncOrgKeys:
+ case _enums_notificationType__WEBPACK_IMPORTED_MODULE_1__["NotificationType"].SyncSettings:
+ case _enums_notificationType__WEBPACK_IMPORTED_MODULE_1__["NotificationType"].LogOut:
+ this.payload = new UserNotification(payload);
+ break;
+ case _enums_notificationType__WEBPACK_IMPORTED_MODULE_1__["NotificationType"].SyncSendCreate:
+ case _enums_notificationType__WEBPACK_IMPORTED_MODULE_1__["NotificationType"].SyncSendUpdate:
+ case _enums_notificationType__WEBPACK_IMPORTED_MODULE_1__["NotificationType"].SyncSendDelete:
+ this.payload = new SyncSendNotification(payload);
+ default:
+ break;
+ }
+ }
+}
+class SyncCipherNotification extends _baseResponse__WEBPACK_IMPORTED_MODULE_0__["BaseResponse"] {
+ constructor(response) {
+ super(response);
+ this.id = this.getResponseProperty('Id');
+ this.userId = this.getResponseProperty('UserId');
+ this.organizationId = this.getResponseProperty('OrganizationId');
+ this.collectionIds = this.getResponseProperty('CollectionIds');
+ this.revisionDate = new Date(this.getResponseProperty('RevisionDate'));
+ }
+}
+class SyncFolderNotification extends _baseResponse__WEBPACK_IMPORTED_MODULE_0__["BaseResponse"] {
+ constructor(response) {
+ super(response);
+ this.id = this.getResponseProperty('Id');
+ this.userId = this.getResponseProperty('UserId');
+ this.revisionDate = new Date(this.getResponseProperty('RevisionDate'));
+ }
+}
+class UserNotification extends _baseResponse__WEBPACK_IMPORTED_MODULE_0__["BaseResponse"] {
+ constructor(response) {
+ super(response);
+ this.userId = this.getResponseProperty('UserId');
+ this.date = new Date(this.getResponseProperty('Date'));
+ }
+}
+class SyncSendNotification extends _baseResponse__WEBPACK_IMPORTED_MODULE_0__["BaseResponse"] {
+ constructor(response) {
+ super(response);
+ this.id = this.getResponseProperty('Id');
+ this.userId = this.getResponseProperty('UserId');
+ this.revisionDate = new Date(this.getResponseProperty('RevisionDate'));
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/response/organization/organizationSsoResponse.ts":
+/*!**********************************************************************************!*\
+ !*** ./jslib/common/src/models/response/organization/organizationSsoResponse.ts ***!
+ \**********************************************************************************/
+/*! exports provided: OrganizationSsoResponse */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "OrganizationSsoResponse", function() { return OrganizationSsoResponse; });
+/* harmony import */ var _api_ssoConfigApi__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../api/ssoConfigApi */ "./jslib/common/src/models/api/ssoConfigApi.ts");
+/* harmony import */ var _baseResponse__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../baseResponse */ "./jslib/common/src/models/response/baseResponse.ts");
+
+
+class OrganizationSsoResponse extends _baseResponse__WEBPACK_IMPORTED_MODULE_1__["BaseResponse"] {
+ constructor(response) {
+ super(response);
+ this.enabled = this.getResponseProperty('Enabled');
+ this.data = new _api_ssoConfigApi__WEBPACK_IMPORTED_MODULE_0__["SsoConfigApi"](this.getResponseProperty('Data'));
+ this.urls = new SsoUrls(this.getResponseProperty('Urls'));
+ }
+}
+class SsoUrls extends _baseResponse__WEBPACK_IMPORTED_MODULE_1__["BaseResponse"] {
+ constructor(response) {
+ super(response);
+ this.callbackPath = this.getResponseProperty('CallbackPath');
+ this.signedOutCallbackPath = this.getResponseProperty('SignedOutCallbackPath');
+ this.spEntityId = this.getResponseProperty('SpEntityId');
+ this.spMetadataUrl = this.getResponseProperty('SpMetadataUrl');
+ this.spAcsUrl = this.getResponseProperty('SpAcsUrl');
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/response/organizationAutoEnrollStatusResponse.ts":
+/*!**********************************************************************************!*\
+ !*** ./jslib/common/src/models/response/organizationAutoEnrollStatusResponse.ts ***!
+ \**********************************************************************************/
+/*! exports provided: OrganizationAutoEnrollStatusResponse */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "OrganizationAutoEnrollStatusResponse", function() { return OrganizationAutoEnrollStatusResponse; });
+/* harmony import */ var _baseResponse__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./baseResponse */ "./jslib/common/src/models/response/baseResponse.ts");
+
+class OrganizationAutoEnrollStatusResponse extends _baseResponse__WEBPACK_IMPORTED_MODULE_0__["BaseResponse"] {
+ constructor(response) {
+ super(response);
+ this.id = this.getResponseProperty('Id');
+ this.resetPasswordEnabled = this.getResponseProperty('ResetPasswordEnabled');
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/response/organizationKeysResponse.ts":
+/*!**********************************************************************!*\
+ !*** ./jslib/common/src/models/response/organizationKeysResponse.ts ***!
+ \**********************************************************************/
+/*! exports provided: OrganizationKeysResponse */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "OrganizationKeysResponse", function() { return OrganizationKeysResponse; });
+/* harmony import */ var _keysResponse__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./keysResponse */ "./jslib/common/src/models/response/keysResponse.ts");
+
+class OrganizationKeysResponse extends _keysResponse__WEBPACK_IMPORTED_MODULE_0__["KeysResponse"] {
+ constructor(response) {
+ super(response);
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/response/organizationResponse.ts":
+/*!******************************************************************!*\
+ !*** ./jslib/common/src/models/response/organizationResponse.ts ***!
+ \******************************************************************/
+/*! exports provided: OrganizationResponse */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "OrganizationResponse", function() { return OrganizationResponse; });
+/* harmony import */ var _baseResponse__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./baseResponse */ "./jslib/common/src/models/response/baseResponse.ts");
+/* harmony import */ var _planResponse__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./planResponse */ "./jslib/common/src/models/response/planResponse.ts");
+
+
+class OrganizationResponse extends _baseResponse__WEBPACK_IMPORTED_MODULE_0__["BaseResponse"] {
+ constructor(response) {
+ super(response);
+ this.id = this.getResponseProperty('Id');
+ this.identifier = this.getResponseProperty('Identifier');
+ this.name = this.getResponseProperty('Name');
+ this.businessName = this.getResponseProperty('BusinessName');
+ this.businessAddress1 = this.getResponseProperty('BusinessAddress1');
+ this.businessAddress2 = this.getResponseProperty('BusinessAddress2');
+ this.businessAddress3 = this.getResponseProperty('BusinessAddress3');
+ this.businessCountry = this.getResponseProperty('BusinessCountry');
+ this.businessTaxNumber = this.getResponseProperty('BusinessTaxNumber');
+ this.billingEmail = this.getResponseProperty('BillingEmail');
+ const plan = this.getResponseProperty('Plan');
+ this.plan = plan == null ? null : new _planResponse__WEBPACK_IMPORTED_MODULE_1__["PlanResponse"](plan);
+ this.planType = this.getResponseProperty('PlanType');
+ this.seats = this.getResponseProperty('Seats');
+ this.maxAutoscaleSeats = this.getResponseProperty('MaxAutoscaleSeats');
+ this.maxCollections = this.getResponseProperty('MaxCollections');
+ this.maxStorageGb = this.getResponseProperty('MaxStorageGb');
+ this.useGroups = this.getResponseProperty('UseGroups');
+ this.useDirectory = this.getResponseProperty('UseDirectory');
+ this.useEvents = this.getResponseProperty('UseEvents');
+ this.useTotp = this.getResponseProperty('UseTotp');
+ this.use2fa = this.getResponseProperty('Use2fa');
+ this.useApi = this.getResponseProperty('UseApi');
+ this.useResetPassword = this.getResponseProperty('UseResetPassword');
+ this.hasPublicAndPrivateKeys = this.getResponseProperty('HasPublicAndPrivateKeys');
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/response/organizationSubscriptionResponse.ts":
+/*!******************************************************************************!*\
+ !*** ./jslib/common/src/models/response/organizationSubscriptionResponse.ts ***!
+ \******************************************************************************/
+/*! exports provided: OrganizationSubscriptionResponse */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "OrganizationSubscriptionResponse", function() { return OrganizationSubscriptionResponse; });
+/* harmony import */ var _organizationResponse__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./organizationResponse */ "./jslib/common/src/models/response/organizationResponse.ts");
+/* harmony import */ var _subscriptionResponse__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./subscriptionResponse */ "./jslib/common/src/models/response/subscriptionResponse.ts");
+
+
+class OrganizationSubscriptionResponse extends _organizationResponse__WEBPACK_IMPORTED_MODULE_0__["OrganizationResponse"] {
+ constructor(response) {
+ super(response);
+ this.storageName = this.getResponseProperty('StorageName');
+ this.storageGb = this.getResponseProperty('StorageGb');
+ const subscription = this.getResponseProperty('Subscription');
+ this.subscription = subscription == null ? null : new _subscriptionResponse__WEBPACK_IMPORTED_MODULE_1__["BillingSubscriptionResponse"](subscription);
+ const upcomingInvoice = this.getResponseProperty('UpcomingInvoice');
+ this.upcomingInvoice = upcomingInvoice == null ? null :
+ new _subscriptionResponse__WEBPACK_IMPORTED_MODULE_1__["BillingSubscriptionUpcomingInvoiceResponse"](upcomingInvoice);
+ this.expiration = this.getResponseProperty('Expiration');
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/response/organizationUserBulkPublicKeyResponse.ts":
+/*!***********************************************************************************!*\
+ !*** ./jslib/common/src/models/response/organizationUserBulkPublicKeyResponse.ts ***!
+ \***********************************************************************************/
+/*! exports provided: OrganizationUserBulkPublicKeyResponse */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "OrganizationUserBulkPublicKeyResponse", function() { return OrganizationUserBulkPublicKeyResponse; });
+/* harmony import */ var _baseResponse__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./baseResponse */ "./jslib/common/src/models/response/baseResponse.ts");
+
+class OrganizationUserBulkPublicKeyResponse extends _baseResponse__WEBPACK_IMPORTED_MODULE_0__["BaseResponse"] {
+ constructor(response) {
+ super(response);
+ this.id = this.getResponseProperty('Id');
+ this.userId = this.getResponseProperty('UserId');
+ this.key = this.getResponseProperty('Key');
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/response/organizationUserBulkResponse.ts":
+/*!**************************************************************************!*\
+ !*** ./jslib/common/src/models/response/organizationUserBulkResponse.ts ***!
+ \**************************************************************************/
+/*! exports provided: OrganizationUserBulkResponse */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "OrganizationUserBulkResponse", function() { return OrganizationUserBulkResponse; });
+/* harmony import */ var _baseResponse__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./baseResponse */ "./jslib/common/src/models/response/baseResponse.ts");
+
+class OrganizationUserBulkResponse extends _baseResponse__WEBPACK_IMPORTED_MODULE_0__["BaseResponse"] {
+ constructor(response) {
+ super(response);
+ this.id = this.getResponseProperty('Id');
+ this.error = this.getResponseProperty('Error');
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/response/organizationUserResponse.ts":
+/*!**********************************************************************!*\
+ !*** ./jslib/common/src/models/response/organizationUserResponse.ts ***!
+ \**********************************************************************/
+/*! exports provided: OrganizationUserResponse, OrganizationUserUserDetailsResponse, OrganizationUserDetailsResponse, OrganizationUserResetPasswordDetailsReponse */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "OrganizationUserResponse", function() { return OrganizationUserResponse; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "OrganizationUserUserDetailsResponse", function() { return OrganizationUserUserDetailsResponse; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "OrganizationUserDetailsResponse", function() { return OrganizationUserDetailsResponse; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "OrganizationUserResetPasswordDetailsReponse", function() { return OrganizationUserResetPasswordDetailsReponse; });
+/* harmony import */ var _baseResponse__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./baseResponse */ "./jslib/common/src/models/response/baseResponse.ts");
+/* harmony import */ var _selectionReadOnlyResponse__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./selectionReadOnlyResponse */ "./jslib/common/src/models/response/selectionReadOnlyResponse.ts");
+/* harmony import */ var _api_permissionsApi__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../api/permissionsApi */ "./jslib/common/src/models/api/permissionsApi.ts");
+
+
+
+class OrganizationUserResponse extends _baseResponse__WEBPACK_IMPORTED_MODULE_0__["BaseResponse"] {
+ constructor(response) {
+ super(response);
+ this.id = this.getResponseProperty('Id');
+ this.userId = this.getResponseProperty('UserId');
+ this.type = this.getResponseProperty('Type');
+ this.status = this.getResponseProperty('Status');
+ this.permissions = new _api_permissionsApi__WEBPACK_IMPORTED_MODULE_2__["PermissionsApi"](this.getResponseProperty('Permissions'));
+ this.accessAll = this.getResponseProperty('AccessAll');
+ this.resetPasswordEnrolled = this.getResponseProperty('ResetPasswordEnrolled');
+ }
+}
+class OrganizationUserUserDetailsResponse extends OrganizationUserResponse {
+ constructor(response) {
+ super(response);
+ this.name = this.getResponseProperty('Name');
+ this.email = this.getResponseProperty('Email');
+ this.twoFactorEnabled = this.getResponseProperty('TwoFactorEnabled');
+ }
+}
+class OrganizationUserDetailsResponse extends OrganizationUserResponse {
+ constructor(response) {
+ super(response);
+ this.collections = [];
+ const collections = this.getResponseProperty('Collections');
+ if (collections != null) {
+ this.collections = collections.map((c) => new _selectionReadOnlyResponse__WEBPACK_IMPORTED_MODULE_1__["SelectionReadOnlyResponse"](c));
+ }
+ }
+}
+class OrganizationUserResetPasswordDetailsReponse extends _baseResponse__WEBPACK_IMPORTED_MODULE_0__["BaseResponse"] {
+ constructor(response) {
+ super(response);
+ this.kdf = this.getResponseProperty('Kdf');
+ this.kdfIterations = this.getResponseProperty('KdfIterations');
+ this.resetPasswordKey = this.getResponseProperty('ResetPasswordKey');
+ this.encryptedPrivateKey = this.getResponseProperty('EncryptedPrivateKey');
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/response/passwordHistoryResponse.ts":
+/*!*********************************************************************!*\
+ !*** ./jslib/common/src/models/response/passwordHistoryResponse.ts ***!
+ \*********************************************************************/
+/*! exports provided: PasswordHistoryResponse */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PasswordHistoryResponse", function() { return PasswordHistoryResponse; });
+/* harmony import */ var _baseResponse__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./baseResponse */ "./jslib/common/src/models/response/baseResponse.ts");
+
+class PasswordHistoryResponse extends _baseResponse__WEBPACK_IMPORTED_MODULE_0__["BaseResponse"] {
+ constructor(response) {
+ super(response);
+ this.password = this.getResponseProperty('Password');
+ this.lastUsedDate = this.getResponseProperty('LastUsedDate');
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/response/paymentResponse.ts":
+/*!*************************************************************!*\
+ !*** ./jslib/common/src/models/response/paymentResponse.ts ***!
+ \*************************************************************/
+/*! exports provided: PaymentResponse */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PaymentResponse", function() { return PaymentResponse; });
+/* harmony import */ var _baseResponse__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./baseResponse */ "./jslib/common/src/models/response/baseResponse.ts");
+/* harmony import */ var _profileResponse__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./profileResponse */ "./jslib/common/src/models/response/profileResponse.ts");
+
+
+class PaymentResponse extends _baseResponse__WEBPACK_IMPORTED_MODULE_0__["BaseResponse"] {
+ constructor(response) {
+ super(response);
+ const userProfile = this.getResponseProperty('UserProfile');
+ if (userProfile != null) {
+ this.userProfile = new _profileResponse__WEBPACK_IMPORTED_MODULE_1__["ProfileResponse"](userProfile);
+ }
+ this.paymentIntentClientSecret = this.getResponseProperty('PaymentIntentClientSecret');
+ this.success = this.getResponseProperty('Success');
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/response/planResponse.ts":
+/*!**********************************************************!*\
+ !*** ./jslib/common/src/models/response/planResponse.ts ***!
+ \**********************************************************/
+/*! exports provided: PlanResponse */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PlanResponse", function() { return PlanResponse; });
+/* harmony import */ var _baseResponse__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./baseResponse */ "./jslib/common/src/models/response/baseResponse.ts");
+
+class PlanResponse extends _baseResponse__WEBPACK_IMPORTED_MODULE_0__["BaseResponse"] {
+ constructor(response) {
+ super(response);
+ this.type = this.getResponseProperty('Type');
+ this.product = this.getResponseProperty('Product');
+ this.name = this.getResponseProperty('Name');
+ this.isAnnual = this.getResponseProperty('IsAnnual');
+ this.nameLocalizationKey = this.getResponseProperty('NameLocalizationKey');
+ this.descriptionLocalizationKey = this.getResponseProperty('DescriptionLocalizationKey');
+ this.canBeUsedByBusiness = this.getResponseProperty('CanBeUsedByBusiness');
+ this.baseSeats = this.getResponseProperty('BaseSeats');
+ this.baseStorageGb = this.getResponseProperty('BaseStorageGb');
+ this.maxCollections = this.getResponseProperty('MaxCollections');
+ this.maxUsers = this.getResponseProperty('MaxUsers');
+ this.hasAdditionalSeatsOption = this.getResponseProperty('HasAdditionalSeatsOption');
+ this.maxAdditionalSeats = this.getResponseProperty('MaxAdditionalSeats');
+ this.hasAdditionalStorageOption = this.getResponseProperty('HasAdditionalStorageOption');
+ this.maxAdditionalStorage = this.getResponseProperty('MaxAdditionalStorage');
+ this.hasPremiumAccessOption = this.getResponseProperty('HasPremiumAccessOption');
+ this.trialPeriodDays = this.getResponseProperty('TrialPeriodDays');
+ this.hasSelfHost = this.getResponseProperty('HasSelfHost');
+ this.hasPolicies = this.getResponseProperty('HasPolicies');
+ this.hasGroups = this.getResponseProperty('HasGroups');
+ this.hasDirectory = this.getResponseProperty('HasDirectory');
+ this.hasEvents = this.getResponseProperty('HasEvents');
+ this.hasTotp = this.getResponseProperty('HasTotp');
+ this.has2fa = this.getResponseProperty('Has2fa');
+ this.hasApi = this.getResponseProperty('HasApi');
+ this.hasSso = this.getResponseProperty('HasSso');
+ this.hasResetPassword = this.getResponseProperty('HasResetPassword');
+ this.usersGetPremium = this.getResponseProperty('UsersGetPremium');
+ this.upgradeSortOrder = this.getResponseProperty('UpgradeSortOrder');
+ this.displaySortOrder = this.getResponseProperty('SortOrder');
+ this.legacyYear = this.getResponseProperty('LegacyYear');
+ this.disabled = this.getResponseProperty('Disabled');
+ this.stripePlanId = this.getResponseProperty('StripePlanId');
+ this.stripeSeatPlanId = this.getResponseProperty('StripeSeatPlanId');
+ this.stripeStoragePlanId = this.getResponseProperty('StripeStoragePlanId');
+ this.stripePremiumAccessPlanId = this.getResponseProperty('StripePremiumAccessPlanId');
+ this.basePrice = this.getResponseProperty('BasePrice');
+ this.seatPrice = this.getResponseProperty('SeatPrice');
+ this.additionalStoragePricePerGb = this.getResponseProperty('AdditionalStoragePricePerGb');
+ this.premiumAccessOptionPrice = this.getResponseProperty('PremiumAccessOptionPrice');
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/response/policyResponse.ts":
+/*!************************************************************!*\
+ !*** ./jslib/common/src/models/response/policyResponse.ts ***!
+ \************************************************************/
+/*! exports provided: PolicyResponse */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PolicyResponse", function() { return PolicyResponse; });
+/* harmony import */ var _baseResponse__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./baseResponse */ "./jslib/common/src/models/response/baseResponse.ts");
+
+class PolicyResponse extends _baseResponse__WEBPACK_IMPORTED_MODULE_0__["BaseResponse"] {
+ constructor(response) {
+ super(response);
+ this.id = this.getResponseProperty('Id');
+ this.organizationId = this.getResponseProperty('OrganizationId');
+ this.type = this.getResponseProperty('Type');
+ this.data = this.getResponseProperty('Data');
+ this.enabled = this.getResponseProperty('Enabled');
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/response/preloginResponse.ts":
+/*!**************************************************************!*\
+ !*** ./jslib/common/src/models/response/preloginResponse.ts ***!
+ \**************************************************************/
+/*! exports provided: PreloginResponse */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PreloginResponse", function() { return PreloginResponse; });
+/* harmony import */ var _baseResponse__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./baseResponse */ "./jslib/common/src/models/response/baseResponse.ts");
+
+class PreloginResponse extends _baseResponse__WEBPACK_IMPORTED_MODULE_0__["BaseResponse"] {
+ constructor(response) {
+ super(response);
+ this.kdf = this.getResponseProperty('Kdf');
+ this.kdfIterations = this.getResponseProperty('KdfIterations');
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/response/profileOrganizationResponse.ts":
+/*!*************************************************************************!*\
+ !*** ./jslib/common/src/models/response/profileOrganizationResponse.ts ***!
+ \*************************************************************************/
+/*! exports provided: ProfileOrganizationResponse */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ProfileOrganizationResponse", function() { return ProfileOrganizationResponse; });
+/* harmony import */ var _baseResponse__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./baseResponse */ "./jslib/common/src/models/response/baseResponse.ts");
+/* harmony import */ var _api_permissionsApi__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../api/permissionsApi */ "./jslib/common/src/models/api/permissionsApi.ts");
+
+
+class ProfileOrganizationResponse extends _baseResponse__WEBPACK_IMPORTED_MODULE_0__["BaseResponse"] {
+ constructor(response) {
+ super(response);
+ this.id = this.getResponseProperty('Id');
+ this.name = this.getResponseProperty('Name');
+ this.usePolicies = this.getResponseProperty('UsePolicies');
+ this.useGroups = this.getResponseProperty('UseGroups');
+ this.useDirectory = this.getResponseProperty('UseDirectory');
+ this.useEvents = this.getResponseProperty('UseEvents');
+ this.useTotp = this.getResponseProperty('UseTotp');
+ this.use2fa = this.getResponseProperty('Use2fa');
+ this.useApi = this.getResponseProperty('UseApi');
+ this.useSso = this.getResponseProperty('UseSso');
+ this.useResetPassword = this.getResponseProperty('UseResetPassword');
+ this.selfHost = this.getResponseProperty('SelfHost');
+ this.usersGetPremium = this.getResponseProperty('UsersGetPremium');
+ this.seats = this.getResponseProperty('Seats');
+ this.maxCollections = this.getResponseProperty('MaxCollections');
+ this.maxStorageGb = this.getResponseProperty('MaxStorageGb');
+ this.key = this.getResponseProperty('Key');
+ this.hasPublicAndPrivateKeys = this.getResponseProperty('HasPublicAndPrivateKeys');
+ this.status = this.getResponseProperty('Status');
+ this.type = this.getResponseProperty('Type');
+ this.enabled = this.getResponseProperty('Enabled');
+ this.ssoBound = this.getResponseProperty('SsoBound');
+ this.identifier = this.getResponseProperty('Identifier');
+ this.permissions = new _api_permissionsApi__WEBPACK_IMPORTED_MODULE_1__["PermissionsApi"](this.getResponseProperty('permissions'));
+ this.resetPasswordEnrolled = this.getResponseProperty('ResetPasswordEnrolled');
+ this.userId = this.getResponseProperty('UserId');
+ this.providerId = this.getResponseProperty('ProviderId');
+ this.providerName = this.getResponseProperty('ProviderName');
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/response/profileProviderOrganizationResponse.ts":
+/*!*********************************************************************************!*\
+ !*** ./jslib/common/src/models/response/profileProviderOrganizationResponse.ts ***!
+ \*********************************************************************************/
+/*! exports provided: ProfileProviderOrganizationResponse */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ProfileProviderOrganizationResponse", function() { return ProfileProviderOrganizationResponse; });
+/* harmony import */ var _baseResponse__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./baseResponse */ "./jslib/common/src/models/response/baseResponse.ts");
+/* harmony import */ var _api_permissionsApi__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../api/permissionsApi */ "./jslib/common/src/models/api/permissionsApi.ts");
+
+
+class ProfileProviderOrganizationResponse extends _baseResponse__WEBPACK_IMPORTED_MODULE_0__["BaseResponse"] {
+ constructor(response) {
+ super(response);
+ this.id = this.getResponseProperty('Id');
+ this.name = this.getResponseProperty('Name');
+ this.usePolicies = this.getResponseProperty('UsePolicies');
+ this.useGroups = this.getResponseProperty('UseGroups');
+ this.useDirectory = this.getResponseProperty('UseDirectory');
+ this.useEvents = this.getResponseProperty('UseEvents');
+ this.useTotp = this.getResponseProperty('UseTotp');
+ this.use2fa = this.getResponseProperty('Use2fa');
+ this.useApi = this.getResponseProperty('UseApi');
+ this.useSso = this.getResponseProperty('UseSso');
+ this.useResetPassword = this.getResponseProperty('UseResetPassword');
+ this.selfHost = this.getResponseProperty('SelfHost');
+ this.usersGetPremium = this.getResponseProperty('UsersGetPremium');
+ this.seats = this.getResponseProperty('Seats');
+ this.maxCollections = this.getResponseProperty('MaxCollections');
+ this.maxStorageGb = this.getResponseProperty('MaxStorageGb');
+ this.key = this.getResponseProperty('Key');
+ this.hasPublicAndPrivateKeys = this.getResponseProperty('HasPublicAndPrivateKeys');
+ this.status = this.getResponseProperty('Status');
+ this.type = this.getResponseProperty('Type');
+ this.enabled = this.getResponseProperty('Enabled');
+ this.ssoBound = this.getResponseProperty('SsoBound');
+ this.identifier = this.getResponseProperty('Identifier');
+ this.permissions = new _api_permissionsApi__WEBPACK_IMPORTED_MODULE_1__["PermissionsApi"](this.getResponseProperty('permissions'));
+ this.resetPasswordEnrolled = this.getResponseProperty('ResetPasswordEnrolled');
+ this.userId = this.getResponseProperty('UserId');
+ this.providerId = this.getResponseProperty('ProviderId');
+ this.providerName = this.getResponseProperty('ProviderName');
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/response/profileProviderResponse.ts":
+/*!*********************************************************************!*\
+ !*** ./jslib/common/src/models/response/profileProviderResponse.ts ***!
+ \*********************************************************************/
+/*! exports provided: ProfileProviderResponse */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ProfileProviderResponse", function() { return ProfileProviderResponse; });
+/* harmony import */ var _baseResponse__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./baseResponse */ "./jslib/common/src/models/response/baseResponse.ts");
+/* harmony import */ var _api_permissionsApi__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../api/permissionsApi */ "./jslib/common/src/models/api/permissionsApi.ts");
+
+
+class ProfileProviderResponse extends _baseResponse__WEBPACK_IMPORTED_MODULE_0__["BaseResponse"] {
+ constructor(response) {
+ super(response);
+ this.id = this.getResponseProperty('Id');
+ this.name = this.getResponseProperty('Name');
+ this.key = this.getResponseProperty('Key');
+ this.status = this.getResponseProperty('Status');
+ this.type = this.getResponseProperty('Type');
+ this.enabled = this.getResponseProperty('Enabled');
+ this.permissions = new _api_permissionsApi__WEBPACK_IMPORTED_MODULE_1__["PermissionsApi"](this.getResponseProperty('permissions'));
+ this.userId = this.getResponseProperty('UserId');
+ this.useEvents = this.getResponseProperty('UseEvents');
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/response/profileResponse.ts":
+/*!*************************************************************!*\
+ !*** ./jslib/common/src/models/response/profileResponse.ts ***!
+ \*************************************************************/
+/*! exports provided: ProfileResponse */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ProfileResponse", function() { return ProfileResponse; });
+/* harmony import */ var _baseResponse__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./baseResponse */ "./jslib/common/src/models/response/baseResponse.ts");
+/* harmony import */ var _profileOrganizationResponse__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./profileOrganizationResponse */ "./jslib/common/src/models/response/profileOrganizationResponse.ts");
+/* harmony import */ var _profileProviderOrganizationResponse__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./profileProviderOrganizationResponse */ "./jslib/common/src/models/response/profileProviderOrganizationResponse.ts");
+/* harmony import */ var _profileProviderResponse__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./profileProviderResponse */ "./jslib/common/src/models/response/profileProviderResponse.ts");
+
+
+
+
+class ProfileResponse extends _baseResponse__WEBPACK_IMPORTED_MODULE_0__["BaseResponse"] {
+ constructor(response) {
+ var _a;
+ super(response);
+ this.organizations = [];
+ this.providers = [];
+ this.providerOrganizations = [];
+ this.id = this.getResponseProperty('Id');
+ this.name = this.getResponseProperty('Name');
+ this.email = this.getResponseProperty('Email');
+ this.emailVerified = this.getResponseProperty('EmailVerified');
+ this.masterPasswordHint = this.getResponseProperty('MasterPasswordHint');
+ this.premium = this.getResponseProperty('Premium');
+ this.culture = this.getResponseProperty('Culture');
+ this.twoFactorEnabled = this.getResponseProperty('TwoFactorEnabled');
+ this.key = this.getResponseProperty('Key');
+ this.privateKey = this.getResponseProperty('PrivateKey');
+ this.securityStamp = this.getResponseProperty('SecurityStamp');
+ this.forcePasswordReset = (_a = this.getResponseProperty('ForcePasswordReset')) !== null && _a !== void 0 ? _a : false;
+ const organizations = this.getResponseProperty('Organizations');
+ if (organizations != null) {
+ this.organizations = organizations.map((o) => new _profileOrganizationResponse__WEBPACK_IMPORTED_MODULE_1__["ProfileOrganizationResponse"](o));
+ }
+ const providers = this.getResponseProperty('Providers');
+ if (providers != null) {
+ this.providers = providers.map((o) => new _profileProviderResponse__WEBPACK_IMPORTED_MODULE_3__["ProfileProviderResponse"](o));
+ }
+ const providerOrganizations = this.getResponseProperty('ProviderOrganizations');
+ if (providerOrganizations != null) {
+ this.providerOrganizations = providerOrganizations.map((o) => new _profileProviderOrganizationResponse__WEBPACK_IMPORTED_MODULE_2__["ProfileProviderOrganizationResponse"](o));
+ }
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/response/provider/providerOrganizationResponse.ts":
+/*!***********************************************************************************!*\
+ !*** ./jslib/common/src/models/response/provider/providerOrganizationResponse.ts ***!
+ \***********************************************************************************/
+/*! exports provided: ProviderOrganizationResponse, ProviderOrganizationOrganizationDetailsResponse */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ProviderOrganizationResponse", function() { return ProviderOrganizationResponse; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ProviderOrganizationOrganizationDetailsResponse", function() { return ProviderOrganizationOrganizationDetailsResponse; });
+/* harmony import */ var _baseResponse__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../baseResponse */ "./jslib/common/src/models/response/baseResponse.ts");
+
+class ProviderOrganizationResponse extends _baseResponse__WEBPACK_IMPORTED_MODULE_0__["BaseResponse"] {
+ constructor(response) {
+ super(response);
+ this.id = this.getResponseProperty('Id');
+ this.providerId = this.getResponseProperty('ProviderId');
+ this.organizationId = this.getResponseProperty('OrganizationId');
+ this.key = this.getResponseProperty('Key');
+ this.settings = this.getResponseProperty('Settings');
+ this.creationDate = this.getResponseProperty('CreationDate');
+ this.revisionDate = this.getResponseProperty('RevisionDate');
+ }
+}
+class ProviderOrganizationOrganizationDetailsResponse extends ProviderOrganizationResponse {
+ constructor(response) {
+ super(response);
+ this.organizationName = this.getResponseProperty('OrganizationName');
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/response/provider/providerResponse.ts":
+/*!***********************************************************************!*\
+ !*** ./jslib/common/src/models/response/provider/providerResponse.ts ***!
+ \***********************************************************************/
+/*! exports provided: ProviderResponse */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ProviderResponse", function() { return ProviderResponse; });
+/* harmony import */ var _baseResponse__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../baseResponse */ "./jslib/common/src/models/response/baseResponse.ts");
+
+class ProviderResponse extends _baseResponse__WEBPACK_IMPORTED_MODULE_0__["BaseResponse"] {
+ constructor(response) {
+ super(response);
+ this.id = this.getResponseProperty('Id');
+ this.name = this.getResponseProperty('Name');
+ this.businessName = this.getResponseProperty('BusinessName');
+ this.billingEmail = this.getResponseProperty('BillingEmail');
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/response/provider/providerUserBulkPublicKeyResponse.ts":
+/*!****************************************************************************************!*\
+ !*** ./jslib/common/src/models/response/provider/providerUserBulkPublicKeyResponse.ts ***!
+ \****************************************************************************************/
+/*! exports provided: ProviderUserBulkPublicKeyResponse */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ProviderUserBulkPublicKeyResponse", function() { return ProviderUserBulkPublicKeyResponse; });
+/* harmony import */ var _organizationUserBulkPublicKeyResponse__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../organizationUserBulkPublicKeyResponse */ "./jslib/common/src/models/response/organizationUserBulkPublicKeyResponse.ts");
+
+class ProviderUserBulkPublicKeyResponse extends _organizationUserBulkPublicKeyResponse__WEBPACK_IMPORTED_MODULE_0__["OrganizationUserBulkPublicKeyResponse"] {
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/response/provider/providerUserBulkResponse.ts":
+/*!*******************************************************************************!*\
+ !*** ./jslib/common/src/models/response/provider/providerUserBulkResponse.ts ***!
+ \*******************************************************************************/
+/*! exports provided: ProviderUserBulkResponse */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ProviderUserBulkResponse", function() { return ProviderUserBulkResponse; });
+/* harmony import */ var _baseResponse__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../baseResponse */ "./jslib/common/src/models/response/baseResponse.ts");
+
+class ProviderUserBulkResponse extends _baseResponse__WEBPACK_IMPORTED_MODULE_0__["BaseResponse"] {
+ constructor(response) {
+ super(response);
+ this.id = this.getResponseProperty('Id');
+ this.error = this.getResponseProperty('Error');
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/response/provider/providerUserResponse.ts":
+/*!***************************************************************************!*\
+ !*** ./jslib/common/src/models/response/provider/providerUserResponse.ts ***!
+ \***************************************************************************/
+/*! exports provided: ProviderUserResponse, ProviderUserUserDetailsResponse */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ProviderUserResponse", function() { return ProviderUserResponse; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ProviderUserUserDetailsResponse", function() { return ProviderUserUserDetailsResponse; });
+/* harmony import */ var _baseResponse__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../baseResponse */ "./jslib/common/src/models/response/baseResponse.ts");
+/* harmony import */ var _api_permissionsApi__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../api/permissionsApi */ "./jslib/common/src/models/api/permissionsApi.ts");
+
+
+class ProviderUserResponse extends _baseResponse__WEBPACK_IMPORTED_MODULE_0__["BaseResponse"] {
+ constructor(response) {
+ super(response);
+ this.id = this.getResponseProperty('Id');
+ this.userId = this.getResponseProperty('UserId');
+ this.type = this.getResponseProperty('Type');
+ this.status = this.getResponseProperty('Status');
+ this.permissions = new _api_permissionsApi__WEBPACK_IMPORTED_MODULE_1__["PermissionsApi"](this.getResponseProperty('Permissions'));
+ }
+}
+class ProviderUserUserDetailsResponse extends ProviderUserResponse {
+ constructor(response) {
+ super(response);
+ this.name = this.getResponseProperty('Name');
+ this.email = this.getResponseProperty('Email');
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/response/selectionReadOnlyResponse.ts":
+/*!***********************************************************************!*\
+ !*** ./jslib/common/src/models/response/selectionReadOnlyResponse.ts ***!
+ \***********************************************************************/
+/*! exports provided: SelectionReadOnlyResponse */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SelectionReadOnlyResponse", function() { return SelectionReadOnlyResponse; });
+/* harmony import */ var _baseResponse__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./baseResponse */ "./jslib/common/src/models/response/baseResponse.ts");
+
+class SelectionReadOnlyResponse extends _baseResponse__WEBPACK_IMPORTED_MODULE_0__["BaseResponse"] {
+ constructor(response) {
+ super(response);
+ this.id = this.getResponseProperty('Id');
+ this.readOnly = this.getResponseProperty('ReadOnly');
+ this.hidePasswords = this.getResponseProperty('HidePasswords');
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/response/sendAccessResponse.ts":
+/*!****************************************************************!*\
+ !*** ./jslib/common/src/models/response/sendAccessResponse.ts ***!
+ \****************************************************************/
+/*! exports provided: SendAccessResponse */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SendAccessResponse", function() { return SendAccessResponse; });
+/* harmony import */ var _baseResponse__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./baseResponse */ "./jslib/common/src/models/response/baseResponse.ts");
+/* harmony import */ var _api_sendFileApi__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../api/sendFileApi */ "./jslib/common/src/models/api/sendFileApi.ts");
+/* harmony import */ var _api_sendTextApi__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../api/sendTextApi */ "./jslib/common/src/models/api/sendTextApi.ts");
+
+
+
+class SendAccessResponse extends _baseResponse__WEBPACK_IMPORTED_MODULE_0__["BaseResponse"] {
+ constructor(response) {
+ super(response);
+ this.id = this.getResponseProperty('Id');
+ this.type = this.getResponseProperty('Type');
+ this.name = this.getResponseProperty('Name');
+ const text = this.getResponseProperty('Text');
+ if (text != null) {
+ this.text = new _api_sendTextApi__WEBPACK_IMPORTED_MODULE_2__["SendTextApi"](text);
+ }
+ const file = this.getResponseProperty('File');
+ if (file != null) {
+ this.file = new _api_sendFileApi__WEBPACK_IMPORTED_MODULE_1__["SendFileApi"](file);
+ }
+ this.expirationDate = this.getResponseProperty('ExpirationDate');
+ this.creatorIdentifier = this.getResponseProperty('CreatorIdentifier');
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/response/sendFileDownloadDataResponse.ts":
+/*!**************************************************************************!*\
+ !*** ./jslib/common/src/models/response/sendFileDownloadDataResponse.ts ***!
+ \**************************************************************************/
+/*! exports provided: SendFileDownloadDataResponse */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SendFileDownloadDataResponse", function() { return SendFileDownloadDataResponse; });
+/* harmony import */ var _baseResponse__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./baseResponse */ "./jslib/common/src/models/response/baseResponse.ts");
+
+class SendFileDownloadDataResponse extends _baseResponse__WEBPACK_IMPORTED_MODULE_0__["BaseResponse"] {
+ constructor(response) {
+ super(response);
+ this.id = null;
+ this.url = null;
+ this.id = this.getResponseProperty('Id');
+ this.url = this.getResponseProperty('Url');
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/response/sendFileUploadDataResponse.ts":
+/*!************************************************************************!*\
+ !*** ./jslib/common/src/models/response/sendFileUploadDataResponse.ts ***!
+ \************************************************************************/
+/*! exports provided: SendFileUploadDataResponse */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SendFileUploadDataResponse", function() { return SendFileUploadDataResponse; });
+/* harmony import */ var _baseResponse__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./baseResponse */ "./jslib/common/src/models/response/baseResponse.ts");
+/* harmony import */ var _sendResponse__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./sendResponse */ "./jslib/common/src/models/response/sendResponse.ts");
+
+
+class SendFileUploadDataResponse extends _baseResponse__WEBPACK_IMPORTED_MODULE_0__["BaseResponse"] {
+ constructor(response) {
+ super(response);
+ this.url = null;
+ this.fileUploadType = this.getResponseProperty('FileUploadType');
+ const sendResponse = this.getResponseProperty('SendResponse');
+ this.sendResponse = sendResponse == null ? null : new _sendResponse__WEBPACK_IMPORTED_MODULE_1__["SendResponse"](sendResponse);
+ this.url = this.getResponseProperty('Url');
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/response/sendResponse.ts":
+/*!**********************************************************!*\
+ !*** ./jslib/common/src/models/response/sendResponse.ts ***!
+ \**********************************************************/
+/*! exports provided: SendResponse */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SendResponse", function() { return SendResponse; });
+/* harmony import */ var _baseResponse__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./baseResponse */ "./jslib/common/src/models/response/baseResponse.ts");
+/* harmony import */ var _api_sendFileApi__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../api/sendFileApi */ "./jslib/common/src/models/api/sendFileApi.ts");
+/* harmony import */ var _api_sendTextApi__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../api/sendTextApi */ "./jslib/common/src/models/api/sendTextApi.ts");
+
+
+
+class SendResponse extends _baseResponse__WEBPACK_IMPORTED_MODULE_0__["BaseResponse"] {
+ constructor(response) {
+ super(response);
+ this.id = this.getResponseProperty('Id');
+ this.accessId = this.getResponseProperty('AccessId');
+ this.type = this.getResponseProperty('Type');
+ this.name = this.getResponseProperty('Name');
+ this.notes = this.getResponseProperty('Notes');
+ this.key = this.getResponseProperty('Key');
+ this.maxAccessCount = this.getResponseProperty('MaxAccessCount');
+ this.accessCount = this.getResponseProperty('AccessCount');
+ this.revisionDate = this.getResponseProperty('RevisionDate');
+ this.expirationDate = this.getResponseProperty('ExpirationDate');
+ this.deletionDate = this.getResponseProperty('DeletionDate');
+ this.password = this.getResponseProperty('Password');
+ this.disable = this.getResponseProperty('Disabled') || false;
+ this.hideEmail = this.getResponseProperty('HideEmail') || false;
+ const text = this.getResponseProperty('Text');
+ if (text != null) {
+ this.text = new _api_sendTextApi__WEBPACK_IMPORTED_MODULE_2__["SendTextApi"](text);
+ }
+ const file = this.getResponseProperty('File');
+ if (file != null) {
+ this.file = new _api_sendFileApi__WEBPACK_IMPORTED_MODULE_1__["SendFileApi"](file);
+ }
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/response/subscriptionResponse.ts":
+/*!******************************************************************!*\
+ !*** ./jslib/common/src/models/response/subscriptionResponse.ts ***!
+ \******************************************************************/
+/*! exports provided: SubscriptionResponse, BillingSubscriptionResponse, BillingSubscriptionItemResponse, BillingSubscriptionUpcomingInvoiceResponse */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SubscriptionResponse", function() { return SubscriptionResponse; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BillingSubscriptionResponse", function() { return BillingSubscriptionResponse; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BillingSubscriptionItemResponse", function() { return BillingSubscriptionItemResponse; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BillingSubscriptionUpcomingInvoiceResponse", function() { return BillingSubscriptionUpcomingInvoiceResponse; });
+/* harmony import */ var _baseResponse__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./baseResponse */ "./jslib/common/src/models/response/baseResponse.ts");
+
+class SubscriptionResponse extends _baseResponse__WEBPACK_IMPORTED_MODULE_0__["BaseResponse"] {
+ constructor(response) {
+ super(response);
+ this.storageName = this.getResponseProperty('StorageName');
+ this.storageGb = this.getResponseProperty('StorageGb');
+ this.maxStorageGb = this.getResponseProperty('MaxStorageGb');
+ this.license = this.getResponseProperty('License');
+ this.expiration = this.getResponseProperty('Expiration');
+ this.usingInAppPurchase = this.getResponseProperty('UsingInAppPurchase');
+ const subscription = this.getResponseProperty('Subscription');
+ const upcomingInvoice = this.getResponseProperty('UpcomingInvoice');
+ this.subscription = subscription == null ? null : new BillingSubscriptionResponse(subscription);
+ this.upcomingInvoice = upcomingInvoice == null ? null :
+ new BillingSubscriptionUpcomingInvoiceResponse(upcomingInvoice);
+ }
+}
+class BillingSubscriptionResponse extends _baseResponse__WEBPACK_IMPORTED_MODULE_0__["BaseResponse"] {
+ constructor(response) {
+ super(response);
+ this.items = [];
+ this.trialEndDate = this.getResponseProperty('TrialStartDate');
+ this.trialEndDate = this.getResponseProperty('TrialEndDate');
+ this.periodStartDate = this.getResponseProperty('PeriodStartDate');
+ this.periodEndDate = this.getResponseProperty('PeriodEndDate');
+ this.cancelledDate = this.getResponseProperty('CancelledDate');
+ this.cancelAtEndDate = this.getResponseProperty('CancelAtEndDate');
+ this.status = this.getResponseProperty('Status');
+ this.cancelled = this.getResponseProperty('Cancelled');
+ const items = this.getResponseProperty('Items');
+ if (items != null) {
+ this.items = items.map((i) => new BillingSubscriptionItemResponse(i));
+ }
+ }
+}
+class BillingSubscriptionItemResponse extends _baseResponse__WEBPACK_IMPORTED_MODULE_0__["BaseResponse"] {
+ constructor(response) {
+ super(response);
+ this.name = this.getResponseProperty('Name');
+ this.amount = this.getResponseProperty('Amount');
+ this.quantity = this.getResponseProperty('Quantity');
+ this.interval = this.getResponseProperty('Interval');
+ }
+}
+class BillingSubscriptionUpcomingInvoiceResponse extends _baseResponse__WEBPACK_IMPORTED_MODULE_0__["BaseResponse"] {
+ constructor(response) {
+ super(response);
+ this.date = this.getResponseProperty('Date');
+ this.amount = this.getResponseProperty('Amount');
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/response/syncResponse.ts":
+/*!**********************************************************!*\
+ !*** ./jslib/common/src/models/response/syncResponse.ts ***!
+ \**********************************************************/
+/*! exports provided: SyncResponse */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SyncResponse", function() { return SyncResponse; });
+/* harmony import */ var _baseResponse__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./baseResponse */ "./jslib/common/src/models/response/baseResponse.ts");
+/* harmony import */ var _cipherResponse__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./cipherResponse */ "./jslib/common/src/models/response/cipherResponse.ts");
+/* harmony import */ var _collectionResponse__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./collectionResponse */ "./jslib/common/src/models/response/collectionResponse.ts");
+/* harmony import */ var _domainsResponse__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./domainsResponse */ "./jslib/common/src/models/response/domainsResponse.ts");
+/* harmony import */ var _folderResponse__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./folderResponse */ "./jslib/common/src/models/response/folderResponse.ts");
+/* harmony import */ var _policyResponse__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./policyResponse */ "./jslib/common/src/models/response/policyResponse.ts");
+/* harmony import */ var _profileResponse__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./profileResponse */ "./jslib/common/src/models/response/profileResponse.ts");
+/* harmony import */ var _sendResponse__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./sendResponse */ "./jslib/common/src/models/response/sendResponse.ts");
+
+
+
+
+
+
+
+
+class SyncResponse extends _baseResponse__WEBPACK_IMPORTED_MODULE_0__["BaseResponse"] {
+ constructor(response) {
+ super(response);
+ this.folders = [];
+ this.collections = [];
+ this.ciphers = [];
+ this.policies = [];
+ this.sends = [];
+ const profile = this.getResponseProperty('Profile');
+ if (profile != null) {
+ this.profile = new _profileResponse__WEBPACK_IMPORTED_MODULE_6__["ProfileResponse"](profile);
+ }
+ const folders = this.getResponseProperty('Folders');
+ if (folders != null) {
+ this.folders = folders.map((f) => new _folderResponse__WEBPACK_IMPORTED_MODULE_4__["FolderResponse"](f));
+ }
+ const collections = this.getResponseProperty('Collections');
+ if (collections != null) {
+ this.collections = collections.map((c) => new _collectionResponse__WEBPACK_IMPORTED_MODULE_2__["CollectionDetailsResponse"](c));
+ }
+ const ciphers = this.getResponseProperty('Ciphers');
+ if (ciphers != null) {
+ this.ciphers = ciphers.map((c) => new _cipherResponse__WEBPACK_IMPORTED_MODULE_1__["CipherResponse"](c));
+ }
+ const domains = this.getResponseProperty('Domains');
+ if (domains != null) {
+ this.domains = new _domainsResponse__WEBPACK_IMPORTED_MODULE_3__["DomainsResponse"](domains);
+ }
+ const policies = this.getResponseProperty('Policies');
+ if (policies != null) {
+ this.policies = policies.map((p) => new _policyResponse__WEBPACK_IMPORTED_MODULE_5__["PolicyResponse"](p));
+ }
+ const sends = this.getResponseProperty('Sends');
+ if (sends != null) {
+ this.sends = sends.map((s) => new _sendResponse__WEBPACK_IMPORTED_MODULE_7__["SendResponse"](s));
+ }
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/response/taxInfoResponse.ts":
+/*!*************************************************************!*\
+ !*** ./jslib/common/src/models/response/taxInfoResponse.ts ***!
+ \*************************************************************/
+/*! exports provided: TaxInfoResponse */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TaxInfoResponse", function() { return TaxInfoResponse; });
+/* harmony import */ var _baseResponse__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./baseResponse */ "./jslib/common/src/models/response/baseResponse.ts");
+
+class TaxInfoResponse extends _baseResponse__WEBPACK_IMPORTED_MODULE_0__["BaseResponse"] {
+ constructor(response) {
+ super(response);
+ this.taxId = this.getResponseProperty('TaxIdNumber');
+ this.taxIdType = this.getResponseProperty('TaxIdType');
+ this.line1 = this.getResponseProperty('Line1');
+ this.line2 = this.getResponseProperty('Line2');
+ this.city = this.getResponseProperty('City');
+ this.state = this.getResponseProperty('State');
+ this.postalCode = this.getResponseProperty('PostalCode');
+ this.country = this.getResponseProperty('Country');
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/response/taxRateResponse.ts":
+/*!*************************************************************!*\
+ !*** ./jslib/common/src/models/response/taxRateResponse.ts ***!
+ \*************************************************************/
+/*! exports provided: TaxRateResponse */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TaxRateResponse", function() { return TaxRateResponse; });
+/* harmony import */ var _baseResponse__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./baseResponse */ "./jslib/common/src/models/response/baseResponse.ts");
+
+class TaxRateResponse extends _baseResponse__WEBPACK_IMPORTED_MODULE_0__["BaseResponse"] {
+ constructor(response) {
+ super(response);
+ this.id = this.getResponseProperty('Id');
+ this.country = this.getResponseProperty('Country');
+ this.state = this.getResponseProperty('State');
+ this.postalCode = this.getResponseProperty('PostalCode');
+ this.rate = this.getResponseProperty('Rate');
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/response/twoFactorAuthenticatorResponse.ts":
+/*!****************************************************************************!*\
+ !*** ./jslib/common/src/models/response/twoFactorAuthenticatorResponse.ts ***!
+ \****************************************************************************/
+/*! exports provided: TwoFactorAuthenticatorResponse */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TwoFactorAuthenticatorResponse", function() { return TwoFactorAuthenticatorResponse; });
+/* harmony import */ var _baseResponse__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./baseResponse */ "./jslib/common/src/models/response/baseResponse.ts");
+
+class TwoFactorAuthenticatorResponse extends _baseResponse__WEBPACK_IMPORTED_MODULE_0__["BaseResponse"] {
+ constructor(response) {
+ super(response);
+ this.enabled = this.getResponseProperty('Enabled');
+ this.key = this.getResponseProperty('Key');
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/response/twoFactorDuoResponse.ts":
+/*!******************************************************************!*\
+ !*** ./jslib/common/src/models/response/twoFactorDuoResponse.ts ***!
+ \******************************************************************/
+/*! exports provided: TwoFactorDuoResponse */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TwoFactorDuoResponse", function() { return TwoFactorDuoResponse; });
+/* harmony import */ var _baseResponse__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./baseResponse */ "./jslib/common/src/models/response/baseResponse.ts");
+
+class TwoFactorDuoResponse extends _baseResponse__WEBPACK_IMPORTED_MODULE_0__["BaseResponse"] {
+ constructor(response) {
+ super(response);
+ this.enabled = this.getResponseProperty('Enabled');
+ this.host = this.getResponseProperty('Host');
+ this.secretKey = this.getResponseProperty('SecretKey');
+ this.integrationKey = this.getResponseProperty('IntegrationKey');
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/response/twoFactorEmailResponse.ts":
+/*!********************************************************************!*\
+ !*** ./jslib/common/src/models/response/twoFactorEmailResponse.ts ***!
+ \********************************************************************/
+/*! exports provided: TwoFactorEmailResponse */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TwoFactorEmailResponse", function() { return TwoFactorEmailResponse; });
+/* harmony import */ var _baseResponse__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./baseResponse */ "./jslib/common/src/models/response/baseResponse.ts");
+
+class TwoFactorEmailResponse extends _baseResponse__WEBPACK_IMPORTED_MODULE_0__["BaseResponse"] {
+ constructor(response) {
+ super(response);
+ this.enabled = this.getResponseProperty('Enabled');
+ this.email = this.getResponseProperty('Email');
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/response/twoFactorProviderResponse.ts":
+/*!***********************************************************************!*\
+ !*** ./jslib/common/src/models/response/twoFactorProviderResponse.ts ***!
+ \***********************************************************************/
+/*! exports provided: TwoFactorProviderResponse */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TwoFactorProviderResponse", function() { return TwoFactorProviderResponse; });
+/* harmony import */ var _baseResponse__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./baseResponse */ "./jslib/common/src/models/response/baseResponse.ts");
+
+class TwoFactorProviderResponse extends _baseResponse__WEBPACK_IMPORTED_MODULE_0__["BaseResponse"] {
+ constructor(response) {
+ super(response);
+ this.enabled = this.getResponseProperty('Enabled');
+ this.type = this.getResponseProperty('Type');
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/response/twoFactorRescoverResponse.ts":
+/*!***********************************************************************!*\
+ !*** ./jslib/common/src/models/response/twoFactorRescoverResponse.ts ***!
+ \***********************************************************************/
+/*! exports provided: TwoFactorRecoverResponse */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TwoFactorRecoverResponse", function() { return TwoFactorRecoverResponse; });
+/* harmony import */ var _baseResponse__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./baseResponse */ "./jslib/common/src/models/response/baseResponse.ts");
+
+class TwoFactorRecoverResponse extends _baseResponse__WEBPACK_IMPORTED_MODULE_0__["BaseResponse"] {
+ constructor(response) {
+ super(response);
+ this.code = this.getResponseProperty('Code');
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/response/twoFactorWebAuthnResponse.ts":
+/*!***********************************************************************!*\
+ !*** ./jslib/common/src/models/response/twoFactorWebAuthnResponse.ts ***!
+ \***********************************************************************/
+/*! exports provided: TwoFactorWebAuthnResponse, KeyResponse, ChallengeResponse */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TwoFactorWebAuthnResponse", function() { return TwoFactorWebAuthnResponse; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "KeyResponse", function() { return KeyResponse; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ChallengeResponse", function() { return ChallengeResponse; });
+/* harmony import */ var _misc_utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../misc/utils */ "./jslib/common/src/misc/utils.ts");
+/* harmony import */ var _baseResponse__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./baseResponse */ "./jslib/common/src/models/response/baseResponse.ts");
+
+
+class TwoFactorWebAuthnResponse extends _baseResponse__WEBPACK_IMPORTED_MODULE_1__["BaseResponse"] {
+ constructor(response) {
+ super(response);
+ this.enabled = this.getResponseProperty('Enabled');
+ const keys = this.getResponseProperty('Keys');
+ this.keys = keys == null ? null : keys.map((k) => new KeyResponse(k));
+ }
+}
+class KeyResponse extends _baseResponse__WEBPACK_IMPORTED_MODULE_1__["BaseResponse"] {
+ constructor(response) {
+ super(response);
+ this.name = this.getResponseProperty('Name');
+ this.id = this.getResponseProperty('Id');
+ this.migrated = this.getResponseProperty('Migrated');
+ }
+}
+class ChallengeResponse extends _baseResponse__WEBPACK_IMPORTED_MODULE_1__["BaseResponse"] {
+ constructor(response) {
+ super(response);
+ this.attestation = this.getResponseProperty('attestation');
+ this.authenticatorSelection = this.getResponseProperty('authenticatorSelection');
+ this.challenge = _misc_utils__WEBPACK_IMPORTED_MODULE_0__["Utils"].fromUrlB64ToArray(this.getResponseProperty('challenge'));
+ this.excludeCredentials = this.getResponseProperty('excludeCredentials').map((c) => {
+ c.id = _misc_utils__WEBPACK_IMPORTED_MODULE_0__["Utils"].fromUrlB64ToArray(c.id).buffer;
+ return c;
+ });
+ this.extensions = this.getResponseProperty('extensions');
+ this.pubKeyCredParams = this.getResponseProperty('pubKeyCredParams');
+ this.rp = this.getResponseProperty('rp');
+ this.timeout = this.getResponseProperty('timeout');
+ const user = this.getResponseProperty('user');
+ user.id = _misc_utils__WEBPACK_IMPORTED_MODULE_0__["Utils"].fromUrlB64ToArray(user.id);
+ this.user = user;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/response/twoFactorYubiKeyResponse.ts":
+/*!**********************************************************************!*\
+ !*** ./jslib/common/src/models/response/twoFactorYubiKeyResponse.ts ***!
+ \**********************************************************************/
+/*! exports provided: TwoFactorYubiKeyResponse */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TwoFactorYubiKeyResponse", function() { return TwoFactorYubiKeyResponse; });
+/* harmony import */ var _baseResponse__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./baseResponse */ "./jslib/common/src/models/response/baseResponse.ts");
+
+class TwoFactorYubiKeyResponse extends _baseResponse__WEBPACK_IMPORTED_MODULE_0__["BaseResponse"] {
+ constructor(response) {
+ super(response);
+ this.enabled = this.getResponseProperty('Enabled');
+ this.key1 = this.getResponseProperty('Key1');
+ this.key2 = this.getResponseProperty('Key2');
+ this.key3 = this.getResponseProperty('Key3');
+ this.key4 = this.getResponseProperty('Key4');
+ this.key5 = this.getResponseProperty('Key5');
+ this.nfc = this.getResponseProperty('Nfc');
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/response/userKeyResponse.ts":
+/*!*************************************************************!*\
+ !*** ./jslib/common/src/models/response/userKeyResponse.ts ***!
+ \*************************************************************/
+/*! exports provided: UserKeyResponse */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "UserKeyResponse", function() { return UserKeyResponse; });
+/* harmony import */ var _baseResponse__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./baseResponse */ "./jslib/common/src/models/response/baseResponse.ts");
+
+class UserKeyResponse extends _baseResponse__WEBPACK_IMPORTED_MODULE_0__["BaseResponse"] {
+ constructor(response) {
+ super(response);
+ this.userId = this.getResponseProperty('UserId');
+ this.publicKey = this.getResponseProperty('PublicKey');
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/view/attachmentView.ts":
+/*!********************************************************!*\
+ !*** ./jslib/common/src/models/view/attachmentView.ts ***!
+ \********************************************************/
+/*! exports provided: AttachmentView */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AttachmentView", function() { return AttachmentView; });
+class AttachmentView {
+ constructor(a) {
+ this.id = null;
+ this.url = null;
+ this.size = null;
+ this.sizeName = null;
+ this.fileName = null;
+ this.key = null;
+ if (!a) {
+ return;
+ }
+ this.id = a.id;
+ this.url = a.url;
+ this.size = a.size;
+ this.sizeName = a.sizeName;
+ }
+ get fileSize() {
+ try {
+ if (this.size != null) {
+ return parseInt(this.size, null);
+ }
+ }
+ catch (_a) {
+ // Invalid file size.
+ }
+ return 0;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/view/cardView.ts":
+/*!**************************************************!*\
+ !*** ./jslib/common/src/models/view/cardView.ts ***!
+ \**************************************************/
+/*! exports provided: CardView */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CardView", function() { return CardView; });
+/* harmony import */ var _itemView__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./itemView */ "./jslib/common/src/models/view/itemView.ts");
+/* harmony import */ var _enums_linkedIdType__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../enums/linkedIdType */ "./jslib/common/src/enums/linkedIdType.ts");
+/* harmony import */ var _misc_linkedFieldOption_decorator__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../misc/linkedFieldOption.decorator */ "./jslib/common/src/misc/linkedFieldOption.decorator.ts");
+var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
+ 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;
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
+};
+var __metadata = (undefined && undefined.__metadata) || function (k, v) {
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
+};
+
+
+
+class CardView extends _itemView__WEBPACK_IMPORTED_MODULE_0__["ItemView"] {
+ // tslint:enable
+ constructor(c) {
+ super();
+ this.cardholderName = null;
+ this.expMonth = null;
+ this.expYear = null;
+ this.code = null;
+ // tslint:disable
+ this._brand = null;
+ this._number = null;
+ this._subTitle = null;
+ }
+ get maskedCode() {
+ return this.code != null ? '•'.repeat(this.code.length) : null;
+ }
+ get maskedNumber() {
+ return this.number != null ? '•'.repeat(this.number.length) : null;
+ }
+ get brand() {
+ return this._brand;
+ }
+ set brand(value) {
+ this._brand = value;
+ this._subTitle = null;
+ }
+ get number() {
+ return this._number;
+ }
+ set number(value) {
+ this._number = value;
+ this._subTitle = null;
+ }
+ get subTitle() {
+ if (this._subTitle == null) {
+ this._subTitle = this.brand;
+ if (this.number != null && this.number.length >= 4) {
+ if (this._subTitle != null && this._subTitle !== '') {
+ this._subTitle += ', ';
+ }
+ else {
+ this._subTitle = '';
+ }
+ // Show last 5 on amex, last 4 for all others
+ const count = this.number.length >= 5 && this.number.match(new RegExp('^3[47]')) != null ? 5 : 4;
+ this._subTitle += ('*' + this.number.substr(this.number.length - count));
+ }
+ }
+ return this._subTitle;
+ }
+ get expiration() {
+ if (!this.expMonth && !this.expYear) {
+ return null;
+ }
+ let exp = this.expMonth != null ? ('0' + this.expMonth).slice(-2) : '__';
+ exp += (' / ' + (this.expYear != null ? this.formatYear(this.expYear) : '____'));
+ return exp;
+ }
+ formatYear(year) {
+ return year.length === 2 ? '20' + year : year;
+ }
+}
+__decorate([
+ Object(_misc_linkedFieldOption_decorator__WEBPACK_IMPORTED_MODULE_2__["linkedFieldOption"])(_enums_linkedIdType__WEBPACK_IMPORTED_MODULE_1__["CardLinkedId"].CardholderName),
+ __metadata("design:type", String)
+], CardView.prototype, "cardholderName", void 0);
+__decorate([
+ Object(_misc_linkedFieldOption_decorator__WEBPACK_IMPORTED_MODULE_2__["linkedFieldOption"])(_enums_linkedIdType__WEBPACK_IMPORTED_MODULE_1__["CardLinkedId"].ExpMonth, 'expirationMonth'),
+ __metadata("design:type", String)
+], CardView.prototype, "expMonth", void 0);
+__decorate([
+ Object(_misc_linkedFieldOption_decorator__WEBPACK_IMPORTED_MODULE_2__["linkedFieldOption"])(_enums_linkedIdType__WEBPACK_IMPORTED_MODULE_1__["CardLinkedId"].ExpYear, 'expirationYear'),
+ __metadata("design:type", String)
+], CardView.prototype, "expYear", void 0);
+__decorate([
+ Object(_misc_linkedFieldOption_decorator__WEBPACK_IMPORTED_MODULE_2__["linkedFieldOption"])(_enums_linkedIdType__WEBPACK_IMPORTED_MODULE_1__["CardLinkedId"].Code, 'securityCode'),
+ __metadata("design:type", String)
+], CardView.prototype, "code", void 0);
+__decorate([
+ Object(_misc_linkedFieldOption_decorator__WEBPACK_IMPORTED_MODULE_2__["linkedFieldOption"])(_enums_linkedIdType__WEBPACK_IMPORTED_MODULE_1__["CardLinkedId"].Brand),
+ __metadata("design:type", String),
+ __metadata("design:paramtypes", [String])
+], CardView.prototype, "brand", null);
+__decorate([
+ Object(_misc_linkedFieldOption_decorator__WEBPACK_IMPORTED_MODULE_2__["linkedFieldOption"])(_enums_linkedIdType__WEBPACK_IMPORTED_MODULE_1__["CardLinkedId"].Number),
+ __metadata("design:type", String),
+ __metadata("design:paramtypes", [String])
+], CardView.prototype, "number", null);
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/view/cipherView.ts":
+/*!****************************************************!*\
+ !*** ./jslib/common/src/models/view/cipherView.ts ***!
+ \****************************************************/
+/*! exports provided: CipherView */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CipherView", function() { return CipherView; });
+/* harmony import */ var _enums_cipherRepromptType__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../enums/cipherRepromptType */ "./jslib/common/src/enums/cipherRepromptType.ts");
+/* harmony import */ var _enums_cipherType__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../enums/cipherType */ "./jslib/common/src/enums/cipherType.ts");
+/* harmony import */ var _cardView__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./cardView */ "./jslib/common/src/models/view/cardView.ts");
+/* harmony import */ var _identityView__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./identityView */ "./jslib/common/src/models/view/identityView.ts");
+/* harmony import */ var _loginView__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./loginView */ "./jslib/common/src/models/view/loginView.ts");
+/* harmony import */ var _secureNoteView__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./secureNoteView */ "./jslib/common/src/models/view/secureNoteView.ts");
+
+
+
+
+
+
+class CipherView {
+ constructor(c) {
+ var _a;
+ this.id = null;
+ this.organizationId = null;
+ this.folderId = null;
+ this.name = null;
+ this.notes = null;
+ this.type = null;
+ this.favorite = false;
+ this.organizationUseTotp = false;
+ this.edit = false;
+ this.viewPassword = true;
+ this.login = new _loginView__WEBPACK_IMPORTED_MODULE_4__["LoginView"]();
+ this.identity = new _identityView__WEBPACK_IMPORTED_MODULE_3__["IdentityView"]();
+ this.card = new _cardView__WEBPACK_IMPORTED_MODULE_2__["CardView"]();
+ this.secureNote = new _secureNoteView__WEBPACK_IMPORTED_MODULE_5__["SecureNoteView"]();
+ this.attachments = null;
+ this.fields = null;
+ this.passwordHistory = null;
+ this.collectionIds = null;
+ this.revisionDate = null;
+ this.deletedDate = null;
+ this.reprompt = _enums_cipherRepromptType__WEBPACK_IMPORTED_MODULE_0__["CipherRepromptType"].None;
+ if (!c) {
+ return;
+ }
+ this.id = c.id;
+ this.organizationId = c.organizationId;
+ this.folderId = c.folderId;
+ this.favorite = c.favorite;
+ this.organizationUseTotp = c.organizationUseTotp;
+ this.edit = c.edit;
+ this.viewPassword = c.viewPassword;
+ this.type = c.type;
+ this.localData = c.localData;
+ this.collectionIds = c.collectionIds;
+ this.revisionDate = c.revisionDate;
+ this.deletedDate = c.deletedDate;
+ // Old locally stored ciphers might have reprompt == null. If so set it to None.
+ this.reprompt = (_a = c.reprompt) !== null && _a !== void 0 ? _a : _enums_cipherRepromptType__WEBPACK_IMPORTED_MODULE_0__["CipherRepromptType"].None;
+ }
+ get item() {
+ switch (this.type) {
+ case _enums_cipherType__WEBPACK_IMPORTED_MODULE_1__["CipherType"].Login:
+ return this.login;
+ case _enums_cipherType__WEBPACK_IMPORTED_MODULE_1__["CipherType"].SecureNote:
+ return this.secureNote;
+ case _enums_cipherType__WEBPACK_IMPORTED_MODULE_1__["CipherType"].Card:
+ return this.card;
+ case _enums_cipherType__WEBPACK_IMPORTED_MODULE_1__["CipherType"].Identity:
+ return this.identity;
+ default:
+ break;
+ }
+ return null;
+ }
+ get subTitle() {
+ return this.item.subTitle;
+ }
+ get hasPasswordHistory() {
+ return this.passwordHistory && this.passwordHistory.length > 0;
+ }
+ get hasAttachments() {
+ return this.attachments && this.attachments.length > 0;
+ }
+ get hasOldAttachments() {
+ if (this.hasAttachments) {
+ for (let i = 0; i < this.attachments.length; i++) {
+ if (this.attachments[i].key == null) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+ get hasFields() {
+ return this.fields && this.fields.length > 0;
+ }
+ get passwordRevisionDisplayDate() {
+ if (this.type !== _enums_cipherType__WEBPACK_IMPORTED_MODULE_1__["CipherType"].Login || this.login == null) {
+ return null;
+ }
+ else if (this.login.password == null || this.login.password === '') {
+ return null;
+ }
+ return this.login.passwordRevisionDate;
+ }
+ get isDeleted() {
+ return this.deletedDate != null;
+ }
+ get linkedFieldOptions() {
+ return this.item.linkedFieldOptions;
+ }
+ linkedFieldValue(id) {
+ var _a;
+ const linkedFieldOption = (_a = this.linkedFieldOptions) === null || _a === void 0 ? void 0 : _a.get(id);
+ if (linkedFieldOption == null) {
+ return null;
+ }
+ const item = this.item;
+ return this.item[linkedFieldOption.propertyKey];
+ }
+ linkedFieldI18nKey(id) {
+ var _a;
+ return (_a = this.linkedFieldOptions.get(id)) === null || _a === void 0 ? void 0 : _a.i18nKey;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/view/collectionView.ts":
+/*!********************************************************!*\
+ !*** ./jslib/common/src/models/view/collectionView.ts ***!
+ \********************************************************/
+/*! exports provided: CollectionView */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CollectionView", function() { return CollectionView; });
+/* harmony import */ var _domain_collection__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../domain/collection */ "./jslib/common/src/models/domain/collection.ts");
+
+class CollectionView {
+ constructor(c) {
+ this.id = null;
+ this.organizationId = null;
+ this.name = null;
+ this.externalId = null;
+ this.readOnly = null;
+ this.hidePasswords = null;
+ if (!c) {
+ return;
+ }
+ this.id = c.id;
+ this.organizationId = c.organizationId;
+ this.externalId = c.externalId;
+ if (c instanceof _domain_collection__WEBPACK_IMPORTED_MODULE_0__["Collection"]) {
+ this.readOnly = c.readOnly;
+ this.hidePasswords = c.hidePasswords;
+ }
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/view/fieldView.ts":
+/*!***************************************************!*\
+ !*** ./jslib/common/src/models/view/fieldView.ts ***!
+ \***************************************************/
+/*! exports provided: FieldView */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FieldView", function() { return FieldView; });
+class FieldView {
+ constructor(f) {
+ this.name = null;
+ this.value = null;
+ this.type = null;
+ this.newField = false; // Marks if the field is new and hasn't been saved
+ this.showValue = false;
+ this.linkedId = null;
+ if (!f) {
+ return;
+ }
+ this.type = f.type;
+ this.linkedId = f.linkedId;
+ }
+ get maskedValue() {
+ return this.value != null ? '••••••••' : null;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/view/folderView.ts":
+/*!****************************************************!*\
+ !*** ./jslib/common/src/models/view/folderView.ts ***!
+ \****************************************************/
+/*! exports provided: FolderView */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FolderView", function() { return FolderView; });
+class FolderView {
+ constructor(f) {
+ this.id = null;
+ this.name = null;
+ this.revisionDate = null;
+ if (!f) {
+ return;
+ }
+ this.id = f.id;
+ this.revisionDate = f.revisionDate;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/view/identityView.ts":
+/*!******************************************************!*\
+ !*** ./jslib/common/src/models/view/identityView.ts ***!
+ \******************************************************/
+/*! exports provided: IdentityView */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "IdentityView", function() { return IdentityView; });
+/* harmony import */ var _itemView__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./itemView */ "./jslib/common/src/models/view/itemView.ts");
+/* harmony import */ var _misc_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../misc/utils */ "./jslib/common/src/misc/utils.ts");
+/* harmony import */ var _enums_linkedIdType__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../enums/linkedIdType */ "./jslib/common/src/enums/linkedIdType.ts");
+/* harmony import */ var _misc_linkedFieldOption_decorator__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../misc/linkedFieldOption.decorator */ "./jslib/common/src/misc/linkedFieldOption.decorator.ts");
+var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
+ 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;
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
+};
+var __metadata = (undefined && undefined.__metadata) || function (k, v) {
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
+};
+
+
+
+
+class IdentityView extends _itemView__WEBPACK_IMPORTED_MODULE_0__["ItemView"] {
+ // tslint:enable
+ constructor(i) {
+ super();
+ this.title = null;
+ this.middleName = null;
+ this.address1 = null;
+ this.address2 = null;
+ this.address3 = null;
+ this.city = null;
+ this.state = null;
+ this.postalCode = null;
+ this.country = null;
+ this.company = null;
+ this.email = null;
+ this.phone = null;
+ this.ssn = null;
+ this.username = null;
+ this.passportNumber = null;
+ this.licenseNumber = null;
+ // tslint:disable
+ this._firstName = null;
+ this._lastName = null;
+ this._subTitle = null;
+ }
+ get firstName() {
+ return this._firstName;
+ }
+ set firstName(value) {
+ this._firstName = value;
+ this._subTitle = null;
+ }
+ get lastName() {
+ return this._lastName;
+ }
+ set lastName(value) {
+ this._lastName = value;
+ this._subTitle = null;
+ }
+ get subTitle() {
+ if (this._subTitle == null && (this.firstName != null || this.lastName != null)) {
+ this._subTitle = '';
+ if (this.firstName != null) {
+ this._subTitle = this.firstName;
+ }
+ if (this.lastName != null) {
+ if (this._subTitle !== '') {
+ this._subTitle += ' ';
+ }
+ this._subTitle += this.lastName;
+ }
+ }
+ return this._subTitle;
+ }
+ get fullName() {
+ if (this.title != null || this.firstName != null || this.middleName != null || this.lastName != null) {
+ let name = '';
+ if (this.title != null) {
+ name += (this.title + ' ');
+ }
+ if (this.firstName != null) {
+ name += (this.firstName + ' ');
+ }
+ if (this.middleName != null) {
+ name += (this.middleName + ' ');
+ }
+ if (this.lastName != null) {
+ name += this.lastName;
+ }
+ return name.trim();
+ }
+ return null;
+ }
+ get fullAddress() {
+ let address = this.address1;
+ if (!_misc_utils__WEBPACK_IMPORTED_MODULE_1__["Utils"].isNullOrWhitespace(this.address2)) {
+ if (!_misc_utils__WEBPACK_IMPORTED_MODULE_1__["Utils"].isNullOrWhitespace(address)) {
+ address += ', ';
+ }
+ address += this.address2;
+ }
+ if (!_misc_utils__WEBPACK_IMPORTED_MODULE_1__["Utils"].isNullOrWhitespace(this.address3)) {
+ if (!_misc_utils__WEBPACK_IMPORTED_MODULE_1__["Utils"].isNullOrWhitespace(address)) {
+ address += ', ';
+ }
+ address += this.address3;
+ }
+ return address;
+ }
+ get fullAddressPart2() {
+ if (this.city == null && this.state == null && this.postalCode == null) {
+ return null;
+ }
+ const city = this.city || '-';
+ const state = this.state;
+ const postalCode = this.postalCode || '-';
+ let addressPart2 = city;
+ if (!_misc_utils__WEBPACK_IMPORTED_MODULE_1__["Utils"].isNullOrWhitespace(state)) {
+ addressPart2 += ', ' + state;
+ }
+ addressPart2 += ', ' + postalCode;
+ return addressPart2;
+ }
+}
+__decorate([
+ Object(_misc_linkedFieldOption_decorator__WEBPACK_IMPORTED_MODULE_3__["linkedFieldOption"])(_enums_linkedIdType__WEBPACK_IMPORTED_MODULE_2__["IdentityLinkedId"].Title),
+ __metadata("design:type", String)
+], IdentityView.prototype, "title", void 0);
+__decorate([
+ Object(_misc_linkedFieldOption_decorator__WEBPACK_IMPORTED_MODULE_3__["linkedFieldOption"])(_enums_linkedIdType__WEBPACK_IMPORTED_MODULE_2__["IdentityLinkedId"].MiddleName),
+ __metadata("design:type", String)
+], IdentityView.prototype, "middleName", void 0);
+__decorate([
+ Object(_misc_linkedFieldOption_decorator__WEBPACK_IMPORTED_MODULE_3__["linkedFieldOption"])(_enums_linkedIdType__WEBPACK_IMPORTED_MODULE_2__["IdentityLinkedId"].Address1),
+ __metadata("design:type", String)
+], IdentityView.prototype, "address1", void 0);
+__decorate([
+ Object(_misc_linkedFieldOption_decorator__WEBPACK_IMPORTED_MODULE_3__["linkedFieldOption"])(_enums_linkedIdType__WEBPACK_IMPORTED_MODULE_2__["IdentityLinkedId"].Address2),
+ __metadata("design:type", String)
+], IdentityView.prototype, "address2", void 0);
+__decorate([
+ Object(_misc_linkedFieldOption_decorator__WEBPACK_IMPORTED_MODULE_3__["linkedFieldOption"])(_enums_linkedIdType__WEBPACK_IMPORTED_MODULE_2__["IdentityLinkedId"].Address3),
+ __metadata("design:type", String)
+], IdentityView.prototype, "address3", void 0);
+__decorate([
+ Object(_misc_linkedFieldOption_decorator__WEBPACK_IMPORTED_MODULE_3__["linkedFieldOption"])(_enums_linkedIdType__WEBPACK_IMPORTED_MODULE_2__["IdentityLinkedId"].City, 'cityTown'),
+ __metadata("design:type", String)
+], IdentityView.prototype, "city", void 0);
+__decorate([
+ Object(_misc_linkedFieldOption_decorator__WEBPACK_IMPORTED_MODULE_3__["linkedFieldOption"])(_enums_linkedIdType__WEBPACK_IMPORTED_MODULE_2__["IdentityLinkedId"].State, 'stateProvince'),
+ __metadata("design:type", String)
+], IdentityView.prototype, "state", void 0);
+__decorate([
+ Object(_misc_linkedFieldOption_decorator__WEBPACK_IMPORTED_MODULE_3__["linkedFieldOption"])(_enums_linkedIdType__WEBPACK_IMPORTED_MODULE_2__["IdentityLinkedId"].PostalCode, 'zipPostalCode'),
+ __metadata("design:type", String)
+], IdentityView.prototype, "postalCode", void 0);
+__decorate([
+ Object(_misc_linkedFieldOption_decorator__WEBPACK_IMPORTED_MODULE_3__["linkedFieldOption"])(_enums_linkedIdType__WEBPACK_IMPORTED_MODULE_2__["IdentityLinkedId"].Country),
+ __metadata("design:type", String)
+], IdentityView.prototype, "country", void 0);
+__decorate([
+ Object(_misc_linkedFieldOption_decorator__WEBPACK_IMPORTED_MODULE_3__["linkedFieldOption"])(_enums_linkedIdType__WEBPACK_IMPORTED_MODULE_2__["IdentityLinkedId"].Company),
+ __metadata("design:type", String)
+], IdentityView.prototype, "company", void 0);
+__decorate([
+ Object(_misc_linkedFieldOption_decorator__WEBPACK_IMPORTED_MODULE_3__["linkedFieldOption"])(_enums_linkedIdType__WEBPACK_IMPORTED_MODULE_2__["IdentityLinkedId"].Email),
+ __metadata("design:type", String)
+], IdentityView.prototype, "email", void 0);
+__decorate([
+ Object(_misc_linkedFieldOption_decorator__WEBPACK_IMPORTED_MODULE_3__["linkedFieldOption"])(_enums_linkedIdType__WEBPACK_IMPORTED_MODULE_2__["IdentityLinkedId"].Phone),
+ __metadata("design:type", String)
+], IdentityView.prototype, "phone", void 0);
+__decorate([
+ Object(_misc_linkedFieldOption_decorator__WEBPACK_IMPORTED_MODULE_3__["linkedFieldOption"])(_enums_linkedIdType__WEBPACK_IMPORTED_MODULE_2__["IdentityLinkedId"].Ssn),
+ __metadata("design:type", String)
+], IdentityView.prototype, "ssn", void 0);
+__decorate([
+ Object(_misc_linkedFieldOption_decorator__WEBPACK_IMPORTED_MODULE_3__["linkedFieldOption"])(_enums_linkedIdType__WEBPACK_IMPORTED_MODULE_2__["IdentityLinkedId"].Username),
+ __metadata("design:type", String)
+], IdentityView.prototype, "username", void 0);
+__decorate([
+ Object(_misc_linkedFieldOption_decorator__WEBPACK_IMPORTED_MODULE_3__["linkedFieldOption"])(_enums_linkedIdType__WEBPACK_IMPORTED_MODULE_2__["IdentityLinkedId"].PassportNumber),
+ __metadata("design:type", String)
+], IdentityView.prototype, "passportNumber", void 0);
+__decorate([
+ Object(_misc_linkedFieldOption_decorator__WEBPACK_IMPORTED_MODULE_3__["linkedFieldOption"])(_enums_linkedIdType__WEBPACK_IMPORTED_MODULE_2__["IdentityLinkedId"].LicenseNumber),
+ __metadata("design:type", String)
+], IdentityView.prototype, "licenseNumber", void 0);
+__decorate([
+ Object(_misc_linkedFieldOption_decorator__WEBPACK_IMPORTED_MODULE_3__["linkedFieldOption"])(_enums_linkedIdType__WEBPACK_IMPORTED_MODULE_2__["IdentityLinkedId"].FirstName),
+ __metadata("design:type", String),
+ __metadata("design:paramtypes", [String])
+], IdentityView.prototype, "firstName", null);
+__decorate([
+ Object(_misc_linkedFieldOption_decorator__WEBPACK_IMPORTED_MODULE_3__["linkedFieldOption"])(_enums_linkedIdType__WEBPACK_IMPORTED_MODULE_2__["IdentityLinkedId"].LastName),
+ __metadata("design:type", String),
+ __metadata("design:paramtypes", [String])
+], IdentityView.prototype, "lastName", null);
+__decorate([
+ Object(_misc_linkedFieldOption_decorator__WEBPACK_IMPORTED_MODULE_3__["linkedFieldOption"])(_enums_linkedIdType__WEBPACK_IMPORTED_MODULE_2__["IdentityLinkedId"].FullName),
+ __metadata("design:type", String),
+ __metadata("design:paramtypes", [])
+], IdentityView.prototype, "fullName", null);
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/view/itemView.ts":
+/*!**************************************************!*\
+ !*** ./jslib/common/src/models/view/itemView.ts ***!
+ \**************************************************/
+/*! exports provided: ItemView */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ItemView", function() { return ItemView; });
+class ItemView {
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/view/loginUriView.ts":
+/*!******************************************************!*\
+ !*** ./jslib/common/src/models/view/loginUriView.ts ***!
+ \******************************************************/
+/*! exports provided: LoginUriView */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LoginUriView", function() { return LoginUriView; });
+/* harmony import */ var _enums_uriMatchType__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../enums/uriMatchType */ "./jslib/common/src/enums/uriMatchType.ts");
+/* harmony import */ var _misc_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../misc/utils */ "./jslib/common/src/misc/utils.ts");
+
+
+const CanLaunchWhitelist = [
+ 'https://',
+ 'http://',
+ 'ssh://',
+ 'ftp://',
+ 'sftp://',
+ 'irc://',
+ 'vnc://',
+ // https://docs.microsoft.com/en-us/windows-server/remote/remote-desktop-services/clients/remote-desktop-uri
+ 'rdp://',
+ 'ms-rd:',
+ 'chrome://',
+ 'iosapp://',
+ 'androidapp://',
+];
+class LoginUriView {
+ // tslint:enable
+ constructor(u) {
+ this.match = null;
+ // tslint:disable
+ this._uri = null;
+ this._domain = null;
+ this._hostname = null;
+ this._host = null;
+ this._canLaunch = null;
+ if (!u) {
+ return;
+ }
+ this.match = u.match;
+ }
+ get uri() {
+ return this._uri;
+ }
+ set uri(value) {
+ this._uri = value;
+ this._domain = null;
+ this._canLaunch = null;
+ }
+ get domain() {
+ if (this._domain == null && this.uri != null) {
+ this._domain = _misc_utils__WEBPACK_IMPORTED_MODULE_1__["Utils"].getDomain(this.uri);
+ if (this._domain === '') {
+ this._domain = null;
+ }
+ }
+ return this._domain;
+ }
+ get hostname() {
+ if (this.match === _enums_uriMatchType__WEBPACK_IMPORTED_MODULE_0__["UriMatchType"].RegularExpression) {
+ return null;
+ }
+ if (this._hostname == null && this.uri != null) {
+ this._hostname = _misc_utils__WEBPACK_IMPORTED_MODULE_1__["Utils"].getHostname(this.uri);
+ if (this._hostname === '') {
+ this._hostname = null;
+ }
+ }
+ return this._hostname;
+ }
+ get host() {
+ if (this.match === _enums_uriMatchType__WEBPACK_IMPORTED_MODULE_0__["UriMatchType"].RegularExpression) {
+ return null;
+ }
+ if (this._host == null && this.uri != null) {
+ this._host = _misc_utils__WEBPACK_IMPORTED_MODULE_1__["Utils"].getHost(this.uri);
+ if (this._host === '') {
+ this._host = null;
+ }
+ }
+ return this._host;
+ }
+ get hostnameOrUri() {
+ return this.hostname != null ? this.hostname : this.uri;
+ }
+ get hostOrUri() {
+ return this.host != null ? this.host : this.uri;
+ }
+ get isWebsite() {
+ return this.uri != null && (this.uri.indexOf('http://') === 0 || this.uri.indexOf('https://') === 0 ||
+ (this.uri.indexOf('://') < 0 && _misc_utils__WEBPACK_IMPORTED_MODULE_1__["Utils"].tldEndingRegex.test(this.uri)));
+ }
+ get canLaunch() {
+ if (this._canLaunch != null) {
+ return this._canLaunch;
+ }
+ if (this.uri != null && this.match !== _enums_uriMatchType__WEBPACK_IMPORTED_MODULE_0__["UriMatchType"].RegularExpression) {
+ const uri = this.launchUri;
+ for (let i = 0; i < CanLaunchWhitelist.length; i++) {
+ if (uri.indexOf(CanLaunchWhitelist[i]) === 0) {
+ this._canLaunch = true;
+ return this._canLaunch;
+ }
+ }
+ }
+ this._canLaunch = false;
+ return this._canLaunch;
+ }
+ get launchUri() {
+ return this.uri.indexOf('://') < 0 && _misc_utils__WEBPACK_IMPORTED_MODULE_1__["Utils"].tldEndingRegex.test(this.uri) ? ('http://' + this.uri) : this.uri;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/view/loginView.ts":
+/*!***************************************************!*\
+ !*** ./jslib/common/src/models/view/loginView.ts ***!
+ \***************************************************/
+/*! exports provided: LoginView */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LoginView", function() { return LoginView; });
+/* harmony import */ var _itemView__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./itemView */ "./jslib/common/src/models/view/itemView.ts");
+/* harmony import */ var _misc_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../misc/utils */ "./jslib/common/src/misc/utils.ts");
+/* harmony import */ var _enums_linkedIdType__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../enums/linkedIdType */ "./jslib/common/src/enums/linkedIdType.ts");
+/* harmony import */ var _misc_linkedFieldOption_decorator__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../misc/linkedFieldOption.decorator */ "./jslib/common/src/misc/linkedFieldOption.decorator.ts");
+var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
+ 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;
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
+};
+var __metadata = (undefined && undefined.__metadata) || function (k, v) {
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
+};
+
+
+
+
+class LoginView extends _itemView__WEBPACK_IMPORTED_MODULE_0__["ItemView"] {
+ constructor(l) {
+ super();
+ this.username = null;
+ this.password = null;
+ this.passwordRevisionDate = null;
+ this.totp = null;
+ this.uris = null;
+ this.autofillOnPageLoad = null;
+ if (!l) {
+ return;
+ }
+ this.passwordRevisionDate = l.passwordRevisionDate;
+ this.autofillOnPageLoad = l.autofillOnPageLoad;
+ }
+ get uri() {
+ return this.hasUris ? this.uris[0].uri : null;
+ }
+ get maskedPassword() {
+ return this.password != null ? '••••••••' : null;
+ }
+ get subTitle() {
+ return this.username;
+ }
+ get canLaunch() {
+ return this.hasUris && this.uris.some(u => u.canLaunch);
+ }
+ get hasTotp() {
+ return !_misc_utils__WEBPACK_IMPORTED_MODULE_1__["Utils"].isNullOrWhitespace(this.totp);
+ }
+ get launchUri() {
+ if (this.hasUris) {
+ const uri = this.uris.find(u => u.canLaunch);
+ if (uri != null) {
+ return uri.launchUri;
+ }
+ }
+ return null;
+ }
+ get hasUris() {
+ return this.uris != null && this.uris.length > 0;
+ }
+}
+__decorate([
+ Object(_misc_linkedFieldOption_decorator__WEBPACK_IMPORTED_MODULE_3__["linkedFieldOption"])(_enums_linkedIdType__WEBPACK_IMPORTED_MODULE_2__["LoginLinkedId"].Username),
+ __metadata("design:type", String)
+], LoginView.prototype, "username", void 0);
+__decorate([
+ Object(_misc_linkedFieldOption_decorator__WEBPACK_IMPORTED_MODULE_3__["linkedFieldOption"])(_enums_linkedIdType__WEBPACK_IMPORTED_MODULE_2__["LoginLinkedId"].Password),
+ __metadata("design:type", String)
+], LoginView.prototype, "password", void 0);
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/view/passwordHistoryView.ts":
+/*!*************************************************************!*\
+ !*** ./jslib/common/src/models/view/passwordHistoryView.ts ***!
+ \*************************************************************/
+/*! exports provided: PasswordHistoryView */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PasswordHistoryView", function() { return PasswordHistoryView; });
+class PasswordHistoryView {
+ constructor(ph) {
+ this.password = null;
+ this.lastUsedDate = null;
+ if (!ph) {
+ return;
+ }
+ this.lastUsedDate = ph.lastUsedDate;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/view/secureNoteView.ts":
+/*!********************************************************!*\
+ !*** ./jslib/common/src/models/view/secureNoteView.ts ***!
+ \********************************************************/
+/*! exports provided: SecureNoteView */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SecureNoteView", function() { return SecureNoteView; });
+/* harmony import */ var _itemView__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./itemView */ "./jslib/common/src/models/view/itemView.ts");
+
+class SecureNoteView extends _itemView__WEBPACK_IMPORTED_MODULE_0__["ItemView"] {
+ constructor(n) {
+ super();
+ this.type = null;
+ if (!n) {
+ return;
+ }
+ this.type = n.type;
+ }
+ get subTitle() {
+ return null;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/view/sendFileView.ts":
+/*!******************************************************!*\
+ !*** ./jslib/common/src/models/view/sendFileView.ts ***!
+ \******************************************************/
+/*! exports provided: SendFileView */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SendFileView", function() { return SendFileView; });
+class SendFileView {
+ constructor(f) {
+ this.id = null;
+ this.size = null;
+ this.sizeName = null;
+ this.fileName = null;
+ if (!f) {
+ return;
+ }
+ this.id = f.id;
+ this.size = f.size;
+ this.sizeName = f.sizeName;
+ }
+ get fileSize() {
+ try {
+ if (this.size != null) {
+ return parseInt(this.size, null);
+ }
+ }
+ catch (_a) {
+ // Invalid file size.
+ }
+ return 0;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/view/sendTextView.ts":
+/*!******************************************************!*\
+ !*** ./jslib/common/src/models/view/sendTextView.ts ***!
+ \******************************************************/
+/*! exports provided: SendTextView */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SendTextView", function() { return SendTextView; });
+class SendTextView {
+ constructor(t) {
+ this.text = null;
+ if (!t) {
+ return;
+ }
+ this.hidden = t.hidden;
+ }
+ get maskedText() {
+ return this.text != null ? '••••••••' : null;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/view/sendView.ts":
+/*!**************************************************!*\
+ !*** ./jslib/common/src/models/view/sendView.ts ***!
+ \**************************************************/
+/*! exports provided: SendView */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SendView", function() { return SendView; });
+/* harmony import */ var _misc_utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../misc/utils */ "./jslib/common/src/misc/utils.ts");
+/* harmony import */ var _sendFileView__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./sendFileView */ "./jslib/common/src/models/view/sendFileView.ts");
+/* harmony import */ var _sendTextView__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./sendTextView */ "./jslib/common/src/models/view/sendTextView.ts");
+
+
+
+class SendView {
+ constructor(s) {
+ this.id = null;
+ this.accessId = null;
+ this.name = null;
+ this.notes = null;
+ this.type = null;
+ this.text = new _sendTextView__WEBPACK_IMPORTED_MODULE_2__["SendTextView"]();
+ this.file = new _sendFileView__WEBPACK_IMPORTED_MODULE_1__["SendFileView"]();
+ this.maxAccessCount = null;
+ this.accessCount = 0;
+ this.revisionDate = null;
+ this.deletionDate = null;
+ this.expirationDate = null;
+ this.password = null;
+ this.disabled = false;
+ this.hideEmail = false;
+ if (!s) {
+ return;
+ }
+ this.id = s.id;
+ this.accessId = s.accessId;
+ this.type = s.type;
+ this.maxAccessCount = s.maxAccessCount;
+ this.accessCount = s.accessCount;
+ this.revisionDate = s.revisionDate;
+ this.deletionDate = s.deletionDate;
+ this.expirationDate = s.expirationDate;
+ this.disabled = s.disabled;
+ this.password = s.password;
+ this.hideEmail = s.hideEmail;
+ }
+ get urlB64Key() {
+ return _misc_utils__WEBPACK_IMPORTED_MODULE_0__["Utils"].fromBufferToUrlB64(this.key);
+ }
+ get maxAccessCountReached() {
+ if (this.maxAccessCount == null) {
+ return false;
+ }
+ return this.accessCount >= this.maxAccessCount;
+ }
+ get expired() {
+ if (this.expirationDate == null) {
+ return false;
+ }
+ return this.expirationDate <= new Date();
+ }
+ get pendingDelete() {
+ return this.deletionDate <= new Date();
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/services/api.service.ts":
+/*!**************************************************!*\
+ !*** ./jslib/common/src/services/api.service.ts ***!
+ \**************************************************/
+/*! exports provided: ApiService */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ApiService", function() { return ApiService; });
+/* harmony import */ var _enums_deviceType__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../enums/deviceType */ "./jslib/common/src/enums/deviceType.ts");
+/* harmony import */ var _misc_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../misc/utils */ "./jslib/common/src/misc/utils.ts");
+/* harmony import */ var _models_response_apiKeyResponse__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../models/response/apiKeyResponse */ "./jslib/common/src/models/response/apiKeyResponse.ts");
+/* harmony import */ var _models_response_attachmentResponse__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../models/response/attachmentResponse */ "./jslib/common/src/models/response/attachmentResponse.ts");
+/* harmony import */ var _models_response_attachmentUploadDataResponse__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../models/response/attachmentUploadDataResponse */ "./jslib/common/src/models/response/attachmentUploadDataResponse.ts");
+/* harmony import */ var _models_response_billingResponse__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../models/response/billingResponse */ "./jslib/common/src/models/response/billingResponse.ts");
+/* harmony import */ var _models_response_breachAccountResponse__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../models/response/breachAccountResponse */ "./jslib/common/src/models/response/breachAccountResponse.ts");
+/* harmony import */ var _models_response_cipherResponse__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../models/response/cipherResponse */ "./jslib/common/src/models/response/cipherResponse.ts");
+/* harmony import */ var _models_response_collectionResponse__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../models/response/collectionResponse */ "./jslib/common/src/models/response/collectionResponse.ts");
+/* harmony import */ var _models_response_domainsResponse__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../models/response/domainsResponse */ "./jslib/common/src/models/response/domainsResponse.ts");
+/* harmony import */ var _models_response_emergencyAccessResponse__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../models/response/emergencyAccessResponse */ "./jslib/common/src/models/response/emergencyAccessResponse.ts");
+/* harmony import */ var _models_response_errorResponse__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../models/response/errorResponse */ "./jslib/common/src/models/response/errorResponse.ts");
+/* harmony import */ var _models_response_eventResponse__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../models/response/eventResponse */ "./jslib/common/src/models/response/eventResponse.ts");
+/* harmony import */ var _models_response_folderResponse__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../models/response/folderResponse */ "./jslib/common/src/models/response/folderResponse.ts");
+/* harmony import */ var _models_response_groupResponse__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../models/response/groupResponse */ "./jslib/common/src/models/response/groupResponse.ts");
+/* harmony import */ var _models_response_identityCaptchaResponse__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../models/response/identityCaptchaResponse */ "./jslib/common/src/models/response/identityCaptchaResponse.ts");
+/* harmony import */ var _models_response_identityTokenResponse__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../models/response/identityTokenResponse */ "./jslib/common/src/models/response/identityTokenResponse.ts");
+/* harmony import */ var _models_response_identityTwoFactorResponse__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../models/response/identityTwoFactorResponse */ "./jslib/common/src/models/response/identityTwoFactorResponse.ts");
+/* harmony import */ var _models_response_listResponse__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../models/response/listResponse */ "./jslib/common/src/models/response/listResponse.ts");
+/* harmony import */ var _models_response_organization_organizationSsoResponse__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../models/response/organization/organizationSsoResponse */ "./jslib/common/src/models/response/organization/organizationSsoResponse.ts");
+/* harmony import */ var _models_response_organizationAutoEnrollStatusResponse__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../models/response/organizationAutoEnrollStatusResponse */ "./jslib/common/src/models/response/organizationAutoEnrollStatusResponse.ts");
+/* harmony import */ var _models_response_organizationKeysResponse__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../models/response/organizationKeysResponse */ "./jslib/common/src/models/response/organizationKeysResponse.ts");
+/* harmony import */ var _models_response_organizationResponse__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ../models/response/organizationResponse */ "./jslib/common/src/models/response/organizationResponse.ts");
+/* harmony import */ var _models_response_organizationSubscriptionResponse__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ../models/response/organizationSubscriptionResponse */ "./jslib/common/src/models/response/organizationSubscriptionResponse.ts");
+/* harmony import */ var _models_response_organizationUserBulkPublicKeyResponse__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ../models/response/organizationUserBulkPublicKeyResponse */ "./jslib/common/src/models/response/organizationUserBulkPublicKeyResponse.ts");
+/* harmony import */ var _models_response_organizationUserBulkResponse__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ../models/response/organizationUserBulkResponse */ "./jslib/common/src/models/response/organizationUserBulkResponse.ts");
+/* harmony import */ var _models_response_organizationUserResponse__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ../models/response/organizationUserResponse */ "./jslib/common/src/models/response/organizationUserResponse.ts");
+/* harmony import */ var _models_response_paymentResponse__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ../models/response/paymentResponse */ "./jslib/common/src/models/response/paymentResponse.ts");
+/* harmony import */ var _models_response_planResponse__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ../models/response/planResponse */ "./jslib/common/src/models/response/planResponse.ts");
+/* harmony import */ var _models_response_policyResponse__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ../models/response/policyResponse */ "./jslib/common/src/models/response/policyResponse.ts");
+/* harmony import */ var _models_response_preloginResponse__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ../models/response/preloginResponse */ "./jslib/common/src/models/response/preloginResponse.ts");
+/* harmony import */ var _models_response_profileResponse__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ../models/response/profileResponse */ "./jslib/common/src/models/response/profileResponse.ts");
+/* harmony import */ var _models_response_provider_providerOrganizationResponse__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ../models/response/provider/providerOrganizationResponse */ "./jslib/common/src/models/response/provider/providerOrganizationResponse.ts");
+/* harmony import */ var _models_response_provider_providerResponse__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! ../models/response/provider/providerResponse */ "./jslib/common/src/models/response/provider/providerResponse.ts");
+/* harmony import */ var _models_response_provider_providerUserBulkPublicKeyResponse__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! ../models/response/provider/providerUserBulkPublicKeyResponse */ "./jslib/common/src/models/response/provider/providerUserBulkPublicKeyResponse.ts");
+/* harmony import */ var _models_response_provider_providerUserBulkResponse__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! ../models/response/provider/providerUserBulkResponse */ "./jslib/common/src/models/response/provider/providerUserBulkResponse.ts");
+/* harmony import */ var _models_response_provider_providerUserResponse__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! ../models/response/provider/providerUserResponse */ "./jslib/common/src/models/response/provider/providerUserResponse.ts");
+/* harmony import */ var _models_response_selectionReadOnlyResponse__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! ../models/response/selectionReadOnlyResponse */ "./jslib/common/src/models/response/selectionReadOnlyResponse.ts");
+/* harmony import */ var _models_response_sendAccessResponse__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(/*! ../models/response/sendAccessResponse */ "./jslib/common/src/models/response/sendAccessResponse.ts");
+/* harmony import */ var _models_response_sendFileDownloadDataResponse__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(/*! ../models/response/sendFileDownloadDataResponse */ "./jslib/common/src/models/response/sendFileDownloadDataResponse.ts");
+/* harmony import */ var _models_response_sendFileUploadDataResponse__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(/*! ../models/response/sendFileUploadDataResponse */ "./jslib/common/src/models/response/sendFileUploadDataResponse.ts");
+/* harmony import */ var _models_response_sendResponse__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(/*! ../models/response/sendResponse */ "./jslib/common/src/models/response/sendResponse.ts");
+/* harmony import */ var _models_response_subscriptionResponse__WEBPACK_IMPORTED_MODULE_42__ = __webpack_require__(/*! ../models/response/subscriptionResponse */ "./jslib/common/src/models/response/subscriptionResponse.ts");
+/* harmony import */ var _models_response_syncResponse__WEBPACK_IMPORTED_MODULE_43__ = __webpack_require__(/*! ../models/response/syncResponse */ "./jslib/common/src/models/response/syncResponse.ts");
+/* harmony import */ var _models_response_taxInfoResponse__WEBPACK_IMPORTED_MODULE_44__ = __webpack_require__(/*! ../models/response/taxInfoResponse */ "./jslib/common/src/models/response/taxInfoResponse.ts");
+/* harmony import */ var _models_response_taxRateResponse__WEBPACK_IMPORTED_MODULE_45__ = __webpack_require__(/*! ../models/response/taxRateResponse */ "./jslib/common/src/models/response/taxRateResponse.ts");
+/* harmony import */ var _models_response_twoFactorAuthenticatorResponse__WEBPACK_IMPORTED_MODULE_46__ = __webpack_require__(/*! ../models/response/twoFactorAuthenticatorResponse */ "./jslib/common/src/models/response/twoFactorAuthenticatorResponse.ts");
+/* harmony import */ var _models_response_twoFactorDuoResponse__WEBPACK_IMPORTED_MODULE_47__ = __webpack_require__(/*! ../models/response/twoFactorDuoResponse */ "./jslib/common/src/models/response/twoFactorDuoResponse.ts");
+/* harmony import */ var _models_response_twoFactorEmailResponse__WEBPACK_IMPORTED_MODULE_48__ = __webpack_require__(/*! ../models/response/twoFactorEmailResponse */ "./jslib/common/src/models/response/twoFactorEmailResponse.ts");
+/* harmony import */ var _models_response_twoFactorProviderResponse__WEBPACK_IMPORTED_MODULE_49__ = __webpack_require__(/*! ../models/response/twoFactorProviderResponse */ "./jslib/common/src/models/response/twoFactorProviderResponse.ts");
+/* harmony import */ var _models_response_twoFactorRescoverResponse__WEBPACK_IMPORTED_MODULE_50__ = __webpack_require__(/*! ../models/response/twoFactorRescoverResponse */ "./jslib/common/src/models/response/twoFactorRescoverResponse.ts");
+/* harmony import */ var _models_response_twoFactorWebAuthnResponse__WEBPACK_IMPORTED_MODULE_51__ = __webpack_require__(/*! ../models/response/twoFactorWebAuthnResponse */ "./jslib/common/src/models/response/twoFactorWebAuthnResponse.ts");
+/* harmony import */ var _models_response_twoFactorYubiKeyResponse__WEBPACK_IMPORTED_MODULE_52__ = __webpack_require__(/*! ../models/response/twoFactorYubiKeyResponse */ "./jslib/common/src/models/response/twoFactorYubiKeyResponse.ts");
+/* harmony import */ var _models_response_userKeyResponse__WEBPACK_IMPORTED_MODULE_53__ = __webpack_require__(/*! ../models/response/userKeyResponse */ "./jslib/common/src/models/response/userKeyResponse.ts");
+/* harmony import */ var _models_response_cryptoAgentUserKeyResponse__WEBPACK_IMPORTED_MODULE_54__ = __webpack_require__(/*! ../models/response/cryptoAgentUserKeyResponse */ "./jslib/common/src/models/response/cryptoAgentUserKeyResponse.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+class ApiService {
+ constructor(tokenService, platformUtilsService, environmentService, logoutCallback, customUserAgent = null) {
+ this.tokenService = tokenService;
+ this.platformUtilsService = platformUtilsService;
+ this.environmentService = environmentService;
+ this.logoutCallback = logoutCallback;
+ this.customUserAgent = customUserAgent;
+ this.isWebClient = false;
+ this.isDesktopClient = false;
+ this.device = platformUtilsService.getDevice();
+ this.deviceType = this.device.toString();
+ this.isWebClient = this.device === _enums_deviceType__WEBPACK_IMPORTED_MODULE_0__["DeviceType"].IEBrowser || this.device === _enums_deviceType__WEBPACK_IMPORTED_MODULE_0__["DeviceType"].ChromeBrowser ||
+ this.device === _enums_deviceType__WEBPACK_IMPORTED_MODULE_0__["DeviceType"].EdgeBrowser || this.device === _enums_deviceType__WEBPACK_IMPORTED_MODULE_0__["DeviceType"].FirefoxBrowser ||
+ this.device === _enums_deviceType__WEBPACK_IMPORTED_MODULE_0__["DeviceType"].OperaBrowser || this.device === _enums_deviceType__WEBPACK_IMPORTED_MODULE_0__["DeviceType"].SafariBrowser ||
+ this.device === _enums_deviceType__WEBPACK_IMPORTED_MODULE_0__["DeviceType"].UnknownBrowser || this.device === _enums_deviceType__WEBPACK_IMPORTED_MODULE_0__["DeviceType"].VivaldiBrowser;
+ this.isDesktopClient = this.device === _enums_deviceType__WEBPACK_IMPORTED_MODULE_0__["DeviceType"].WindowsDesktop || this.device === _enums_deviceType__WEBPACK_IMPORTED_MODULE_0__["DeviceType"].MacOsDesktop ||
+ this.device === _enums_deviceType__WEBPACK_IMPORTED_MODULE_0__["DeviceType"].LinuxDesktop;
+ }
+ // Auth APIs
+ postIdentityToken(request) {
+ var _a;
+ return __awaiter(this, void 0, void 0, function* () {
+ const headers = new Headers({
+ 'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8',
+ 'Accept': 'application/json',
+ 'Device-Type': this.deviceType,
+ });
+ if (this.customUserAgent != null) {
+ headers.set('User-Agent', this.customUserAgent);
+ }
+ request.alterIdentityTokenHeaders(headers);
+ const response = yield this.fetch(new Request(this.environmentService.getIdentityUrl() + '/connect/token', {
+ body: this.qsStringify(request.toIdentityToken((_a = request.clientId) !== null && _a !== void 0 ? _a : this.platformUtilsService.identityClientId)),
+ credentials: this.getCredentials(),
+ cache: 'no-store',
+ headers: headers,
+ method: 'POST',
+ }));
+ let responseJson = null;
+ if (this.isJsonResponse(response)) {
+ responseJson = yield response.json();
+ }
+ if (responseJson != null) {
+ if (response.status === 200) {
+ return new _models_response_identityTokenResponse__WEBPACK_IMPORTED_MODULE_16__["IdentityTokenResponse"](responseJson);
+ }
+ else if (response.status === 400 && responseJson.TwoFactorProviders2 &&
+ Object.keys(responseJson.TwoFactorProviders2).length) {
+ yield this.tokenService.clearTwoFactorToken(request.email);
+ return new _models_response_identityTwoFactorResponse__WEBPACK_IMPORTED_MODULE_17__["IdentityTwoFactorResponse"](responseJson);
+ }
+ else if (response.status === 400 && responseJson.HCaptcha_SiteKey &&
+ Object.keys(responseJson.HCaptcha_SiteKey).length) {
+ return new _models_response_identityCaptchaResponse__WEBPACK_IMPORTED_MODULE_15__["IdentityCaptchaResponse"](responseJson);
+ }
+ }
+ return Promise.reject(new _models_response_errorResponse__WEBPACK_IMPORTED_MODULE_11__["ErrorResponse"](responseJson, response.status, true));
+ });
+ }
+ refreshIdentityToken() {
+ return __awaiter(this, void 0, void 0, function* () {
+ try {
+ yield this.doAuthRefresh();
+ }
+ catch (e) {
+ return Promise.reject(null);
+ }
+ });
+ }
+ // Account APIs
+ getProfile() {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('GET', '/accounts/profile', null, true, true);
+ return new _models_response_profileResponse__WEBPACK_IMPORTED_MODULE_31__["ProfileResponse"](r);
+ });
+ }
+ getUserBilling() {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('GET', '/accounts/billing', null, true, true);
+ return new _models_response_billingResponse__WEBPACK_IMPORTED_MODULE_5__["BillingResponse"](r);
+ });
+ }
+ getUserSubscription() {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('GET', '/accounts/subscription', null, true, true);
+ return new _models_response_subscriptionResponse__WEBPACK_IMPORTED_MODULE_42__["SubscriptionResponse"](r);
+ });
+ }
+ getTaxInfo() {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('GET', '/accounts/tax', null, true, true);
+ return new _models_response_taxInfoResponse__WEBPACK_IMPORTED_MODULE_44__["TaxInfoResponse"](r);
+ });
+ }
+ putProfile(request) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('PUT', '/accounts/profile', request, true, true);
+ return new _models_response_profileResponse__WEBPACK_IMPORTED_MODULE_31__["ProfileResponse"](r);
+ });
+ }
+ putTaxInfo(request) {
+ return this.send('PUT', '/accounts/tax', request, true, false);
+ }
+ postPrelogin(request) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('POST', '/accounts/prelogin', request, false, true);
+ return new _models_response_preloginResponse__WEBPACK_IMPORTED_MODULE_30__["PreloginResponse"](r);
+ });
+ }
+ postEmailToken(request) {
+ return this.send('POST', '/accounts/email-token', request, true, false);
+ }
+ postEmail(request) {
+ return this.send('POST', '/accounts/email', request, true, false);
+ }
+ postPassword(request) {
+ return this.send('POST', '/accounts/password', request, true, false);
+ }
+ setPassword(request) {
+ return this.send('POST', '/accounts/set-password', request, true, false);
+ }
+ postSetCryptoAgentKey(request) {
+ return this.send('POST', '/accounts/set-crypto-agent-key', request, true, false);
+ }
+ postSecurityStamp(request) {
+ return this.send('POST', '/accounts/security-stamp', request, true, false);
+ }
+ deleteAccount(request) {
+ return this.send('DELETE', '/accounts', request, true, false);
+ }
+ getAccountRevisionDate() {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('GET', '/accounts/revision-date', null, true, true);
+ return r;
+ });
+ }
+ postPasswordHint(request) {
+ return this.send('POST', '/accounts/password-hint', request, false, false);
+ }
+ postRegister(request) {
+ return this.send('POST', '/accounts/register', request, false, false);
+ }
+ postPremium(data) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('POST', '/accounts/premium', data, true, true);
+ return new _models_response_paymentResponse__WEBPACK_IMPORTED_MODULE_27__["PaymentResponse"](r);
+ });
+ }
+ postIapCheck(request) {
+ return __awaiter(this, void 0, void 0, function* () {
+ return this.send('POST', '/accounts/iap-check', request, true, false);
+ });
+ }
+ postReinstatePremium() {
+ return this.send('POST', '/accounts/reinstate-premium', null, true, false);
+ }
+ postCancelPremium() {
+ return this.send('POST', '/accounts/cancel-premium', null, true, false);
+ }
+ postAccountStorage(request) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('POST', '/accounts/storage', request, true, true);
+ return new _models_response_paymentResponse__WEBPACK_IMPORTED_MODULE_27__["PaymentResponse"](r);
+ });
+ }
+ postAccountPayment(request) {
+ return this.send('POST', '/accounts/payment', request, true, false);
+ }
+ postAccountLicense(data) {
+ return this.send('POST', '/accounts/license', data, true, false);
+ }
+ postAccountKeys(request) {
+ return this.send('POST', '/accounts/keys', request, true, false);
+ }
+ postAccountKey(request) {
+ return this.send('POST', '/accounts/key', request, true, false);
+ }
+ postAccountVerifyEmail() {
+ return this.send('POST', '/accounts/verify-email', null, true, false);
+ }
+ postAccountVerifyEmailToken(request) {
+ return this.send('POST', '/accounts/verify-email-token', request, false, false);
+ }
+ postAccountVerifyPassword(request) {
+ return this.send('POST', '/accounts/verify-password', request, true, false);
+ }
+ postAccountRecoverDelete(request) {
+ return this.send('POST', '/accounts/delete-recover', request, false, false);
+ }
+ postAccountRecoverDeleteToken(request) {
+ return this.send('POST', '/accounts/delete-recover-token', request, false, false);
+ }
+ postAccountKdf(request) {
+ return this.send('POST', '/accounts/kdf', request, true, false);
+ }
+ deleteSsoUser(organizationId) {
+ return __awaiter(this, void 0, void 0, function* () {
+ return this.send('DELETE', '/accounts/sso/' + organizationId, null, true, false);
+ });
+ }
+ getSsoUserIdentifier() {
+ return __awaiter(this, void 0, void 0, function* () {
+ return this.send('GET', '/accounts/sso/user-identifier', null, true, true);
+ });
+ }
+ postUserApiKey(id, request) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('POST', '/accounts/api-key', request, true, true);
+ return new _models_response_apiKeyResponse__WEBPACK_IMPORTED_MODULE_2__["ApiKeyResponse"](r);
+ });
+ }
+ postUserRotateApiKey(id, request) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('POST', '/accounts/rotate-api-key', request, true, true);
+ return new _models_response_apiKeyResponse__WEBPACK_IMPORTED_MODULE_2__["ApiKeyResponse"](r);
+ });
+ }
+ putUpdateTempPassword(request) {
+ return this.send('PUT', '/accounts/update-temp-password', request, true, false);
+ }
+ // Folder APIs
+ getFolder(id) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('GET', '/folders/' + id, null, true, true);
+ return new _models_response_folderResponse__WEBPACK_IMPORTED_MODULE_13__["FolderResponse"](r);
+ });
+ }
+ postFolder(request) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('POST', '/folders', request, true, true);
+ return new _models_response_folderResponse__WEBPACK_IMPORTED_MODULE_13__["FolderResponse"](r);
+ });
+ }
+ putFolder(id, request) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('PUT', '/folders/' + id, request, true, true);
+ return new _models_response_folderResponse__WEBPACK_IMPORTED_MODULE_13__["FolderResponse"](r);
+ });
+ }
+ deleteFolder(id) {
+ return this.send('DELETE', '/folders/' + id, null, true, false);
+ }
+ // Send APIs
+ getSend(id) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('GET', '/sends/' + id, null, true, true);
+ return new _models_response_sendResponse__WEBPACK_IMPORTED_MODULE_41__["SendResponse"](r);
+ });
+ }
+ postSendAccess(id, request, apiUrl) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const addSendIdHeader = (headers) => {
+ headers.set('Send-Id', id);
+ };
+ const r = yield this.send('POST', '/sends/access/' + id, request, false, true, apiUrl, addSendIdHeader);
+ return new _models_response_sendAccessResponse__WEBPACK_IMPORTED_MODULE_38__["SendAccessResponse"](r);
+ });
+ }
+ getSendFileDownloadData(send, request, apiUrl) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const addSendIdHeader = (headers) => {
+ headers.set('Send-Id', send.id);
+ };
+ const r = yield this.send('POST', '/sends/' + send.id + '/access/file/' + send.file.id, request, false, true, apiUrl, addSendIdHeader);
+ return new _models_response_sendFileDownloadDataResponse__WEBPACK_IMPORTED_MODULE_39__["SendFileDownloadDataResponse"](r);
+ });
+ }
+ getSends() {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('GET', '/sends', null, true, true);
+ return new _models_response_listResponse__WEBPACK_IMPORTED_MODULE_18__["ListResponse"](r, _models_response_sendResponse__WEBPACK_IMPORTED_MODULE_41__["SendResponse"]);
+ });
+ }
+ postSend(request) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('POST', '/sends', request, true, true);
+ return new _models_response_sendResponse__WEBPACK_IMPORTED_MODULE_41__["SendResponse"](r);
+ });
+ }
+ postFileTypeSend(request) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('POST', '/sends/file/v2', request, true, true);
+ return new _models_response_sendFileUploadDataResponse__WEBPACK_IMPORTED_MODULE_40__["SendFileUploadDataResponse"](r);
+ });
+ }
+ renewSendFileUploadUrl(sendId, fileId) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('GET', '/sends/' + sendId + '/file/' + fileId, null, true, true);
+ return new _models_response_sendFileUploadDataResponse__WEBPACK_IMPORTED_MODULE_40__["SendFileUploadDataResponse"](r);
+ });
+ }
+ postSendFile(sendId, fileId, data) {
+ return this.send('POST', '/sends/' + sendId + '/file/' + fileId, data, true, false);
+ }
+ /**
+ * @deprecated Mar 25 2021: This method has been deprecated in favor of direct uploads.
+ * This method still exists for backward compatibility with old server versions.
+ */
+ postSendFileLegacy(data) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('POST', '/sends/file', data, true, true);
+ return new _models_response_sendResponse__WEBPACK_IMPORTED_MODULE_41__["SendResponse"](r);
+ });
+ }
+ putSend(id, request) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('PUT', '/sends/' + id, request, true, true);
+ return new _models_response_sendResponse__WEBPACK_IMPORTED_MODULE_41__["SendResponse"](r);
+ });
+ }
+ putSendRemovePassword(id) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('PUT', '/sends/' + id + '/remove-password', null, true, true);
+ return new _models_response_sendResponse__WEBPACK_IMPORTED_MODULE_41__["SendResponse"](r);
+ });
+ }
+ deleteSend(id) {
+ return this.send('DELETE', '/sends/' + id, null, true, false);
+ }
+ // Cipher APIs
+ getCipher(id) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('GET', '/ciphers/' + id, null, true, true);
+ return new _models_response_cipherResponse__WEBPACK_IMPORTED_MODULE_7__["CipherResponse"](r);
+ });
+ }
+ getCipherAdmin(id) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('GET', '/ciphers/' + id + '/admin', null, true, true);
+ return new _models_response_cipherResponse__WEBPACK_IMPORTED_MODULE_7__["CipherResponse"](r);
+ });
+ }
+ getCiphersOrganization(organizationId) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('GET', '/ciphers/organization-details?organizationId=' + organizationId, null, true, true);
+ return new _models_response_listResponse__WEBPACK_IMPORTED_MODULE_18__["ListResponse"](r, _models_response_cipherResponse__WEBPACK_IMPORTED_MODULE_7__["CipherResponse"]);
+ });
+ }
+ postCipher(request) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('POST', '/ciphers', request, true, true);
+ return new _models_response_cipherResponse__WEBPACK_IMPORTED_MODULE_7__["CipherResponse"](r);
+ });
+ }
+ postCipherCreate(request) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('POST', '/ciphers/create', request, true, true);
+ return new _models_response_cipherResponse__WEBPACK_IMPORTED_MODULE_7__["CipherResponse"](r);
+ });
+ }
+ postCipherAdmin(request) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('POST', '/ciphers/admin', request, true, true);
+ return new _models_response_cipherResponse__WEBPACK_IMPORTED_MODULE_7__["CipherResponse"](r);
+ });
+ }
+ putCipher(id, request) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('PUT', '/ciphers/' + id, request, true, true);
+ return new _models_response_cipherResponse__WEBPACK_IMPORTED_MODULE_7__["CipherResponse"](r);
+ });
+ }
+ putCipherAdmin(id, request) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('PUT', '/ciphers/' + id + '/admin', request, true, true);
+ return new _models_response_cipherResponse__WEBPACK_IMPORTED_MODULE_7__["CipherResponse"](r);
+ });
+ }
+ deleteCipher(id) {
+ return this.send('DELETE', '/ciphers/' + id, null, true, false);
+ }
+ deleteCipherAdmin(id) {
+ return this.send('DELETE', '/ciphers/' + id + '/admin', null, true, false);
+ }
+ deleteManyCiphers(request) {
+ return this.send('DELETE', '/ciphers', request, true, false);
+ }
+ deleteManyCiphersAdmin(request) {
+ return this.send('DELETE', '/ciphers/admin', request, true, false);
+ }
+ putMoveCiphers(request) {
+ return this.send('PUT', '/ciphers/move', request, true, false);
+ }
+ putShareCipher(id, request) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('PUT', '/ciphers/' + id + '/share', request, true, true);
+ return new _models_response_cipherResponse__WEBPACK_IMPORTED_MODULE_7__["CipherResponse"](r);
+ });
+ }
+ putShareCiphers(request) {
+ return this.send('PUT', '/ciphers/share', request, true, false);
+ }
+ putCipherCollections(id, request) {
+ return this.send('PUT', '/ciphers/' + id + '/collections', request, true, false);
+ }
+ putCipherCollectionsAdmin(id, request) {
+ return this.send('PUT', '/ciphers/' + id + '/collections-admin', request, true, false);
+ }
+ postPurgeCiphers(request, organizationId = null) {
+ let path = '/ciphers/purge';
+ if (organizationId != null) {
+ path += '?organizationId=' + organizationId;
+ }
+ return this.send('POST', path, request, true, false);
+ }
+ postImportCiphers(request) {
+ return this.send('POST', '/ciphers/import', request, true, false);
+ }
+ postImportOrganizationCiphers(organizationId, request) {
+ return this.send('POST', '/ciphers/import-organization?organizationId=' + organizationId, request, true, false);
+ }
+ putDeleteCipher(id) {
+ return this.send('PUT', '/ciphers/' + id + '/delete', null, true, false);
+ }
+ putDeleteCipherAdmin(id) {
+ return this.send('PUT', '/ciphers/' + id + '/delete-admin', null, true, false);
+ }
+ putDeleteManyCiphers(request) {
+ return this.send('PUT', '/ciphers/delete', request, true, false);
+ }
+ putDeleteManyCiphersAdmin(request) {
+ return this.send('PUT', '/ciphers/delete-admin', request, true, false);
+ }
+ putRestoreCipher(id) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('PUT', '/ciphers/' + id + '/restore', null, true, true);
+ return new _models_response_cipherResponse__WEBPACK_IMPORTED_MODULE_7__["CipherResponse"](r);
+ });
+ }
+ putRestoreCipherAdmin(id) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('PUT', '/ciphers/' + id + '/restore-admin', null, true, true);
+ return new _models_response_cipherResponse__WEBPACK_IMPORTED_MODULE_7__["CipherResponse"](r);
+ });
+ }
+ putRestoreManyCiphers(request) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('PUT', '/ciphers/restore', request, true, true);
+ return new _models_response_listResponse__WEBPACK_IMPORTED_MODULE_18__["ListResponse"](r, _models_response_cipherResponse__WEBPACK_IMPORTED_MODULE_7__["CipherResponse"]);
+ });
+ }
+ // Attachments APIs
+ getAttachmentData(cipherId, attachmentId, emergencyAccessId) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const path = (emergencyAccessId != null ?
+ '/emergency-access/' + emergencyAccessId + '/' :
+ '/ciphers/') + cipherId + '/attachment/' + attachmentId;
+ const r = yield this.send('GET', path, null, true, true);
+ return new _models_response_attachmentResponse__WEBPACK_IMPORTED_MODULE_3__["AttachmentResponse"](r);
+ });
+ }
+ postCipherAttachment(id, request) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('POST', '/ciphers/' + id + '/attachment/v2', request, true, true);
+ return new _models_response_attachmentUploadDataResponse__WEBPACK_IMPORTED_MODULE_4__["AttachmentUploadDataResponse"](r);
+ });
+ }
+ /**
+ * @deprecated Mar 25 2021: This method has been deprecated in favor of direct uploads.
+ * This method still exists for backward compatibility with old server versions.
+ */
+ postCipherAttachmentLegacy(id, data) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('POST', '/ciphers/' + id + '/attachment', data, true, true);
+ return new _models_response_cipherResponse__WEBPACK_IMPORTED_MODULE_7__["CipherResponse"](r);
+ });
+ }
+ /**
+ * @deprecated Mar 25 2021: This method has been deprecated in favor of direct uploads.
+ * This method still exists for backward compatibility with old server versions.
+ */
+ postCipherAttachmentAdminLegacy(id, data) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('POST', '/ciphers/' + id + '/attachment-admin', data, true, true);
+ return new _models_response_cipherResponse__WEBPACK_IMPORTED_MODULE_7__["CipherResponse"](r);
+ });
+ }
+ deleteCipherAttachment(id, attachmentId) {
+ return this.send('DELETE', '/ciphers/' + id + '/attachment/' + attachmentId, null, true, false);
+ }
+ deleteCipherAttachmentAdmin(id, attachmentId) {
+ return this.send('DELETE', '/ciphers/' + id + '/attachment/' + attachmentId + '/admin', null, true, false);
+ }
+ postShareCipherAttachment(id, attachmentId, data, organizationId) {
+ return this.send('POST', '/ciphers/' + id + '/attachment/' +
+ attachmentId + '/share?organizationId=' + organizationId, data, true, false);
+ }
+ renewAttachmentUploadUrl(id, attachmentId) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('GET', '/ciphers/' + id + '/attachment/' + attachmentId + '/renew', null, true, true);
+ return new _models_response_attachmentUploadDataResponse__WEBPACK_IMPORTED_MODULE_4__["AttachmentUploadDataResponse"](r);
+ });
+ }
+ postAttachmentFile(id, attachmentId, data) {
+ return this.send('POST', '/ciphers/' + id + '/attachment/' + attachmentId, data, true, false);
+ }
+ // Collections APIs
+ getCollectionDetails(organizationId, id) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('GET', '/organizations/' + organizationId + '/collections/' + id + '/details', null, true, true);
+ return new _models_response_collectionResponse__WEBPACK_IMPORTED_MODULE_8__["CollectionGroupDetailsResponse"](r);
+ });
+ }
+ getUserCollections() {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('GET', '/collections', null, true, true);
+ return new _models_response_listResponse__WEBPACK_IMPORTED_MODULE_18__["ListResponse"](r, _models_response_collectionResponse__WEBPACK_IMPORTED_MODULE_8__["CollectionResponse"]);
+ });
+ }
+ getCollections(organizationId) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('GET', '/organizations/' + organizationId + '/collections', null, true, true);
+ return new _models_response_listResponse__WEBPACK_IMPORTED_MODULE_18__["ListResponse"](r, _models_response_collectionResponse__WEBPACK_IMPORTED_MODULE_8__["CollectionResponse"]);
+ });
+ }
+ getCollectionUsers(organizationId, id) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('GET', '/organizations/' + organizationId + '/collections/' + id + '/users', null, true, true);
+ return r.map((dr) => new _models_response_selectionReadOnlyResponse__WEBPACK_IMPORTED_MODULE_37__["SelectionReadOnlyResponse"](dr));
+ });
+ }
+ postCollection(organizationId, request) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('POST', '/organizations/' + organizationId + '/collections', request, true, true);
+ return new _models_response_collectionResponse__WEBPACK_IMPORTED_MODULE_8__["CollectionResponse"](r);
+ });
+ }
+ putCollection(organizationId, id, request) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('PUT', '/organizations/' + organizationId + '/collections/' + id, request, true, true);
+ return new _models_response_collectionResponse__WEBPACK_IMPORTED_MODULE_8__["CollectionResponse"](r);
+ });
+ }
+ putCollectionUsers(organizationId, id, request) {
+ return __awaiter(this, void 0, void 0, function* () {
+ yield this.send('PUT', '/organizations/' + organizationId + '/collections/' + id + '/users', request, true, false);
+ });
+ }
+ deleteCollection(organizationId, id) {
+ return this.send('DELETE', '/organizations/' + organizationId + '/collections/' + id, null, true, false);
+ }
+ deleteCollectionUser(organizationId, id, organizationUserId) {
+ return this.send('DELETE', '/organizations/' + organizationId + '/collections/' + id + '/user/' + organizationUserId, null, true, false);
+ }
+ // Groups APIs
+ getGroupDetails(organizationId, id) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('GET', '/organizations/' + organizationId + '/groups/' + id + '/details', null, true, true);
+ return new _models_response_groupResponse__WEBPACK_IMPORTED_MODULE_14__["GroupDetailsResponse"](r);
+ });
+ }
+ getGroups(organizationId) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('GET', '/organizations/' + organizationId + '/groups', null, true, true);
+ return new _models_response_listResponse__WEBPACK_IMPORTED_MODULE_18__["ListResponse"](r, _models_response_groupResponse__WEBPACK_IMPORTED_MODULE_14__["GroupResponse"]);
+ });
+ }
+ getGroupUsers(organizationId, id) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('GET', '/organizations/' + organizationId + '/groups/' + id + '/users', null, true, true);
+ return r;
+ });
+ }
+ postGroup(organizationId, request) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('POST', '/organizations/' + organizationId + '/groups', request, true, true);
+ return new _models_response_groupResponse__WEBPACK_IMPORTED_MODULE_14__["GroupResponse"](r);
+ });
+ }
+ putGroup(organizationId, id, request) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('PUT', '/organizations/' + organizationId + '/groups/' + id, request, true, true);
+ return new _models_response_groupResponse__WEBPACK_IMPORTED_MODULE_14__["GroupResponse"](r);
+ });
+ }
+ putGroupUsers(organizationId, id, request) {
+ return __awaiter(this, void 0, void 0, function* () {
+ yield this.send('PUT', '/organizations/' + organizationId + '/groups/' + id + '/users', request, true, false);
+ });
+ }
+ deleteGroup(organizationId, id) {
+ return this.send('DELETE', '/organizations/' + organizationId + '/groups/' + id, null, true, false);
+ }
+ deleteGroupUser(organizationId, id, organizationUserId) {
+ return this.send('DELETE', '/organizations/' + organizationId + '/groups/' + id + '/user/' + organizationUserId, null, true, false);
+ }
+ // Policy APIs
+ getPolicy(organizationId, type) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('GET', '/organizations/' + organizationId + '/policies/' + type, null, true, true);
+ return new _models_response_policyResponse__WEBPACK_IMPORTED_MODULE_29__["PolicyResponse"](r);
+ });
+ }
+ getPolicies(organizationId) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('GET', '/organizations/' + organizationId + '/policies', null, true, true);
+ return new _models_response_listResponse__WEBPACK_IMPORTED_MODULE_18__["ListResponse"](r, _models_response_policyResponse__WEBPACK_IMPORTED_MODULE_29__["PolicyResponse"]);
+ });
+ }
+ getPoliciesByToken(organizationId, token, email, organizationUserId) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('GET', '/organizations/' + organizationId + '/policies/token?' +
+ 'token=' + encodeURIComponent(token) + '&email=' + encodeURIComponent(email) +
+ '&organizationUserId=' + organizationUserId, null, false, true);
+ return new _models_response_listResponse__WEBPACK_IMPORTED_MODULE_18__["ListResponse"](r, _models_response_policyResponse__WEBPACK_IMPORTED_MODULE_29__["PolicyResponse"]);
+ });
+ }
+ putPolicy(organizationId, type, request) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('PUT', '/organizations/' + organizationId + '/policies/' + type, request, true, true);
+ return new _models_response_policyResponse__WEBPACK_IMPORTED_MODULE_29__["PolicyResponse"](r);
+ });
+ }
+ // Organization User APIs
+ getOrganizationUser(organizationId, id) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('GET', '/organizations/' + organizationId + '/users/' + id, null, true, true);
+ return new _models_response_organizationUserResponse__WEBPACK_IMPORTED_MODULE_26__["OrganizationUserDetailsResponse"](r);
+ });
+ }
+ getOrganizationUserGroups(organizationId, id) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('GET', '/organizations/' + organizationId + '/users/' + id + '/groups', null, true, true);
+ return r;
+ });
+ }
+ getOrganizationUsers(organizationId) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('GET', '/organizations/' + organizationId + '/users', null, true, true);
+ return new _models_response_listResponse__WEBPACK_IMPORTED_MODULE_18__["ListResponse"](r, _models_response_organizationUserResponse__WEBPACK_IMPORTED_MODULE_26__["OrganizationUserUserDetailsResponse"]);
+ });
+ }
+ getOrganizationUserResetPasswordDetails(organizationId, id) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('GET', '/organizations/' + organizationId + '/users/' + id +
+ '/reset-password-details', null, true, true);
+ return new _models_response_organizationUserResponse__WEBPACK_IMPORTED_MODULE_26__["OrganizationUserResetPasswordDetailsReponse"](r);
+ });
+ }
+ getOrganizationAutoEnrollStatus(identifier) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('GET', '/organizations/' + identifier + '/auto-enroll-status', null, true, true);
+ return new _models_response_organizationAutoEnrollStatusResponse__WEBPACK_IMPORTED_MODULE_20__["OrganizationAutoEnrollStatusResponse"](r);
+ });
+ }
+ postOrganizationUserInvite(organizationId, request) {
+ return this.send('POST', '/organizations/' + organizationId + '/users/invite', request, true, false);
+ }
+ postOrganizationUserReinvite(organizationId, id) {
+ return this.send('POST', '/organizations/' + organizationId + '/users/' + id + '/reinvite', null, true, false);
+ }
+ postManyOrganizationUserReinvite(organizationId, request) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('POST', '/organizations/' + organizationId + '/users/reinvite', request, true, true);
+ return new _models_response_listResponse__WEBPACK_IMPORTED_MODULE_18__["ListResponse"](r, _models_response_organizationUserBulkResponse__WEBPACK_IMPORTED_MODULE_25__["OrganizationUserBulkResponse"]);
+ });
+ }
+ postOrganizationUserAccept(organizationId, id, request) {
+ return this.send('POST', '/organizations/' + organizationId + '/users/' + id + '/accept', request, true, false);
+ }
+ postOrganizationUserConfirm(organizationId, id, request) {
+ return this.send('POST', '/organizations/' + organizationId + '/users/' + id + '/confirm', request, true, false);
+ }
+ postOrganizationUsersPublicKey(organizationId, request) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('POST', '/organizations/' + organizationId + '/users/public-keys', request, true, true);
+ return new _models_response_listResponse__WEBPACK_IMPORTED_MODULE_18__["ListResponse"](r, _models_response_organizationUserBulkPublicKeyResponse__WEBPACK_IMPORTED_MODULE_24__["OrganizationUserBulkPublicKeyResponse"]);
+ });
+ }
+ postOrganizationUserBulkConfirm(organizationId, request) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('POST', '/organizations/' + organizationId + '/users/confirm', request, true, true);
+ return new _models_response_listResponse__WEBPACK_IMPORTED_MODULE_18__["ListResponse"](r, _models_response_organizationUserBulkResponse__WEBPACK_IMPORTED_MODULE_25__["OrganizationUserBulkResponse"]);
+ });
+ }
+ putOrganizationUser(organizationId, id, request) {
+ return this.send('PUT', '/organizations/' + organizationId + '/users/' + id, request, true, false);
+ }
+ putOrganizationUserGroups(organizationId, id, request) {
+ return this.send('PUT', '/organizations/' + organizationId + '/users/' + id + '/groups', request, true, false);
+ }
+ putOrganizationUserResetPasswordEnrollment(organizationId, userId, request) {
+ return this.send('PUT', '/organizations/' + organizationId + '/users/' + userId + '/reset-password-enrollment', request, true, false);
+ }
+ putOrganizationUserResetPassword(organizationId, id, request) {
+ return this.send('PUT', '/organizations/' + organizationId + '/users/' + id + '/reset-password', request, true, false);
+ }
+ deleteOrganizationUser(organizationId, id) {
+ return this.send('DELETE', '/organizations/' + organizationId + '/users/' + id, null, true, false);
+ }
+ deleteManyOrganizationUsers(organizationId, request) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('DELETE', '/organizations/' + organizationId + '/users', request, true, true);
+ return new _models_response_listResponse__WEBPACK_IMPORTED_MODULE_18__["ListResponse"](r, _models_response_organizationUserBulkResponse__WEBPACK_IMPORTED_MODULE_25__["OrganizationUserBulkResponse"]);
+ });
+ }
+ // Plan APIs
+ getPlans() {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('GET', '/plans/', null, true, true);
+ return new _models_response_listResponse__WEBPACK_IMPORTED_MODULE_18__["ListResponse"](r, _models_response_planResponse__WEBPACK_IMPORTED_MODULE_28__["PlanResponse"]);
+ });
+ }
+ postImportDirectory(organizationId, request) {
+ return __awaiter(this, void 0, void 0, function* () {
+ return this.send('POST', '/organizations/' + organizationId + '/import', request, true, false);
+ });
+ }
+ postPublicImportDirectory(request) {
+ return __awaiter(this, void 0, void 0, function* () {
+ return this.send('POST', '/public/organization/import', request, true, false);
+ });
+ }
+ getTaxRates() {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('GET', '/plans/sales-tax-rates/', null, true, true);
+ return new _models_response_listResponse__WEBPACK_IMPORTED_MODULE_18__["ListResponse"](r, _models_response_taxRateResponse__WEBPACK_IMPORTED_MODULE_45__["TaxRateResponse"]);
+ });
+ }
+ // Settings APIs
+ getSettingsDomains() {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('GET', '/settings/domains', null, true, true);
+ return new _models_response_domainsResponse__WEBPACK_IMPORTED_MODULE_9__["DomainsResponse"](r);
+ });
+ }
+ putSettingsDomains(request) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('PUT', '/settings/domains', request, true, true);
+ return new _models_response_domainsResponse__WEBPACK_IMPORTED_MODULE_9__["DomainsResponse"](r);
+ });
+ }
+ // Sync APIs
+ getSync() {
+ return __awaiter(this, void 0, void 0, function* () {
+ const path = this.isDesktopClient || this.isWebClient ? '/sync?excludeDomains=true' : '/sync';
+ const r = yield this.send('GET', path, null, true, true);
+ return new _models_response_syncResponse__WEBPACK_IMPORTED_MODULE_43__["SyncResponse"](r);
+ });
+ }
+ // Two-factor APIs
+ getTwoFactorProviders() {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('GET', '/two-factor', null, true, true);
+ return new _models_response_listResponse__WEBPACK_IMPORTED_MODULE_18__["ListResponse"](r, _models_response_twoFactorProviderResponse__WEBPACK_IMPORTED_MODULE_49__["TwoFactorProviderResponse"]);
+ });
+ }
+ getTwoFactorOrganizationProviders(organizationId) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('GET', '/organizations/' + organizationId + '/two-factor', null, true, true);
+ return new _models_response_listResponse__WEBPACK_IMPORTED_MODULE_18__["ListResponse"](r, _models_response_twoFactorProviderResponse__WEBPACK_IMPORTED_MODULE_49__["TwoFactorProviderResponse"]);
+ });
+ }
+ getTwoFactorAuthenticator(request) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('POST', '/two-factor/get-authenticator', request, true, true);
+ return new _models_response_twoFactorAuthenticatorResponse__WEBPACK_IMPORTED_MODULE_46__["TwoFactorAuthenticatorResponse"](r);
+ });
+ }
+ getTwoFactorEmail(request) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('POST', '/two-factor/get-email', request, true, true);
+ return new _models_response_twoFactorEmailResponse__WEBPACK_IMPORTED_MODULE_48__["TwoFactorEmailResponse"](r);
+ });
+ }
+ getTwoFactorDuo(request) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('POST', '/two-factor/get-duo', request, true, true);
+ return new _models_response_twoFactorDuoResponse__WEBPACK_IMPORTED_MODULE_47__["TwoFactorDuoResponse"](r);
+ });
+ }
+ getTwoFactorOrganizationDuo(organizationId, request) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('POST', '/organizations/' + organizationId + '/two-factor/get-duo', request, true, true);
+ return new _models_response_twoFactorDuoResponse__WEBPACK_IMPORTED_MODULE_47__["TwoFactorDuoResponse"](r);
+ });
+ }
+ getTwoFactorYubiKey(request) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('POST', '/two-factor/get-yubikey', request, true, true);
+ return new _models_response_twoFactorYubiKeyResponse__WEBPACK_IMPORTED_MODULE_52__["TwoFactorYubiKeyResponse"](r);
+ });
+ }
+ getTwoFactorWebAuthn(request) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('POST', '/two-factor/get-webauthn', request, true, true);
+ return new _models_response_twoFactorWebAuthnResponse__WEBPACK_IMPORTED_MODULE_51__["TwoFactorWebAuthnResponse"](r);
+ });
+ }
+ getTwoFactorWebAuthnChallenge(request) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('POST', '/two-factor/get-webauthn-challenge', request, true, true);
+ return new _models_response_twoFactorWebAuthnResponse__WEBPACK_IMPORTED_MODULE_51__["ChallengeResponse"](r);
+ });
+ }
+ getTwoFactorRecover(request) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('POST', '/two-factor/get-recover', request, true, true);
+ return new _models_response_twoFactorRescoverResponse__WEBPACK_IMPORTED_MODULE_50__["TwoFactorRecoverResponse"](r);
+ });
+ }
+ putTwoFactorAuthenticator(request) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('PUT', '/two-factor/authenticator', request, true, true);
+ return new _models_response_twoFactorAuthenticatorResponse__WEBPACK_IMPORTED_MODULE_46__["TwoFactorAuthenticatorResponse"](r);
+ });
+ }
+ putTwoFactorEmail(request) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('PUT', '/two-factor/email', request, true, true);
+ return new _models_response_twoFactorEmailResponse__WEBPACK_IMPORTED_MODULE_48__["TwoFactorEmailResponse"](r);
+ });
+ }
+ putTwoFactorDuo(request) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('PUT', '/two-factor/duo', request, true, true);
+ return new _models_response_twoFactorDuoResponse__WEBPACK_IMPORTED_MODULE_47__["TwoFactorDuoResponse"](r);
+ });
+ }
+ putTwoFactorOrganizationDuo(organizationId, request) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('PUT', '/organizations/' + organizationId + '/two-factor/duo', request, true, true);
+ return new _models_response_twoFactorDuoResponse__WEBPACK_IMPORTED_MODULE_47__["TwoFactorDuoResponse"](r);
+ });
+ }
+ putTwoFactorYubiKey(request) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('PUT', '/two-factor/yubikey', request, true, true);
+ return new _models_response_twoFactorYubiKeyResponse__WEBPACK_IMPORTED_MODULE_52__["TwoFactorYubiKeyResponse"](r);
+ });
+ }
+ putTwoFactorWebAuthn(request) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const response = request.deviceResponse.response;
+ const data = Object.assign({}, request);
+ data.deviceResponse = {
+ id: request.deviceResponse.id,
+ rawId: btoa(request.deviceResponse.id),
+ type: request.deviceResponse.type,
+ extensions: request.deviceResponse.getClientExtensionResults(),
+ response: {
+ AttestationObject: _misc_utils__WEBPACK_IMPORTED_MODULE_1__["Utils"].fromBufferToB64(response.attestationObject),
+ clientDataJson: _misc_utils__WEBPACK_IMPORTED_MODULE_1__["Utils"].fromBufferToB64(response.clientDataJSON),
+ },
+ };
+ const r = yield this.send('PUT', '/two-factor/webauthn', data, true, true);
+ return new _models_response_twoFactorWebAuthnResponse__WEBPACK_IMPORTED_MODULE_51__["TwoFactorWebAuthnResponse"](r);
+ });
+ }
+ deleteTwoFactorWebAuthn(request) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('DELETE', '/two-factor/webauthn', request, true, true);
+ return new _models_response_twoFactorWebAuthnResponse__WEBPACK_IMPORTED_MODULE_51__["TwoFactorWebAuthnResponse"](r);
+ });
+ }
+ putTwoFactorDisable(request) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('PUT', '/two-factor/disable', request, true, true);
+ return new _models_response_twoFactorProviderResponse__WEBPACK_IMPORTED_MODULE_49__["TwoFactorProviderResponse"](r);
+ });
+ }
+ putTwoFactorOrganizationDisable(organizationId, request) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('PUT', '/organizations/' + organizationId + '/two-factor/disable', request, true, true);
+ return new _models_response_twoFactorProviderResponse__WEBPACK_IMPORTED_MODULE_49__["TwoFactorProviderResponse"](r);
+ });
+ }
+ postTwoFactorRecover(request) {
+ return this.send('POST', '/two-factor/recover', request, false, false);
+ }
+ postTwoFactorEmailSetup(request) {
+ return this.send('POST', '/two-factor/send-email', request, true, false);
+ }
+ postTwoFactorEmail(request) {
+ return this.send('POST', '/two-factor/send-email-login', request, false, false);
+ }
+ // Emergency Access APIs
+ getEmergencyAccessTrusted() {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('GET', '/emergency-access/trusted', null, true, true);
+ return new _models_response_listResponse__WEBPACK_IMPORTED_MODULE_18__["ListResponse"](r, _models_response_emergencyAccessResponse__WEBPACK_IMPORTED_MODULE_10__["EmergencyAccessGranteeDetailsResponse"]);
+ });
+ }
+ getEmergencyAccessGranted() {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('GET', '/emergency-access/granted', null, true, true);
+ return new _models_response_listResponse__WEBPACK_IMPORTED_MODULE_18__["ListResponse"](r, _models_response_emergencyAccessResponse__WEBPACK_IMPORTED_MODULE_10__["EmergencyAccessGrantorDetailsResponse"]);
+ });
+ }
+ getEmergencyAccess(id) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('GET', '/emergency-access/' + id, null, true, true);
+ return new _models_response_emergencyAccessResponse__WEBPACK_IMPORTED_MODULE_10__["EmergencyAccessGranteeDetailsResponse"](r);
+ });
+ }
+ getEmergencyGrantorPolicies(id) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('GET', '/emergency-access/' + id + '/policies', null, true, true);
+ return new _models_response_listResponse__WEBPACK_IMPORTED_MODULE_18__["ListResponse"](r, _models_response_policyResponse__WEBPACK_IMPORTED_MODULE_29__["PolicyResponse"]);
+ });
+ }
+ putEmergencyAccess(id, request) {
+ return this.send('PUT', '/emergency-access/' + id, request, true, false);
+ }
+ deleteEmergencyAccess(id) {
+ return this.send('DELETE', '/emergency-access/' + id, null, true, false);
+ }
+ postEmergencyAccessInvite(request) {
+ return this.send('POST', '/emergency-access/invite', request, true, false);
+ }
+ postEmergencyAccessReinvite(id) {
+ return this.send('POST', '/emergency-access/' + id + '/reinvite', null, true, false);
+ }
+ postEmergencyAccessAccept(id, request) {
+ return this.send('POST', '/emergency-access/' + id + '/accept', request, true, false);
+ }
+ postEmergencyAccessConfirm(id, request) {
+ return this.send('POST', '/emergency-access/' + id + '/confirm', request, true, false);
+ }
+ postEmergencyAccessInitiate(id) {
+ return this.send('POST', '/emergency-access/' + id + '/initiate', null, true, false);
+ }
+ postEmergencyAccessApprove(id) {
+ return this.send('POST', '/emergency-access/' + id + '/approve', null, true, false);
+ }
+ postEmergencyAccessReject(id) {
+ return this.send('POST', '/emergency-access/' + id + '/reject', null, true, false);
+ }
+ postEmergencyAccessTakeover(id) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('POST', '/emergency-access/' + id + '/takeover', null, true, true);
+ return new _models_response_emergencyAccessResponse__WEBPACK_IMPORTED_MODULE_10__["EmergencyAccessTakeoverResponse"](r);
+ });
+ }
+ postEmergencyAccessPassword(id, request) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('POST', '/emergency-access/' + id + '/password', request, true, true);
+ });
+ }
+ postEmergencyAccessView(id) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('POST', '/emergency-access/' + id + '/view', null, true, true);
+ return new _models_response_emergencyAccessResponse__WEBPACK_IMPORTED_MODULE_10__["EmergencyAccessViewResponse"](r);
+ });
+ }
+ // Organization APIs
+ getOrganization(id) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('GET', '/organizations/' + id, null, true, true);
+ return new _models_response_organizationResponse__WEBPACK_IMPORTED_MODULE_22__["OrganizationResponse"](r);
+ });
+ }
+ getOrganizationBilling(id) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('GET', '/organizations/' + id + '/billing', null, true, true);
+ return new _models_response_billingResponse__WEBPACK_IMPORTED_MODULE_5__["BillingResponse"](r);
+ });
+ }
+ getOrganizationSubscription(id) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('GET', '/organizations/' + id + '/subscription', null, true, true);
+ return new _models_response_organizationSubscriptionResponse__WEBPACK_IMPORTED_MODULE_23__["OrganizationSubscriptionResponse"](r);
+ });
+ }
+ getOrganizationLicense(id, installationId) {
+ return __awaiter(this, void 0, void 0, function* () {
+ return this.send('GET', '/organizations/' + id + '/license?installationId=' + installationId, null, true, true);
+ });
+ }
+ getOrganizationTaxInfo(id) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('GET', '/organizations/' + id + '/tax', null, true, true);
+ return new _models_response_taxInfoResponse__WEBPACK_IMPORTED_MODULE_44__["TaxInfoResponse"](r);
+ });
+ }
+ getOrganizationSso(id) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('GET', '/organizations/' + id + '/sso', null, true, true);
+ return new _models_response_organization_organizationSsoResponse__WEBPACK_IMPORTED_MODULE_19__["OrganizationSsoResponse"](r);
+ });
+ }
+ postOrganization(request) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('POST', '/organizations', request, true, true);
+ return new _models_response_organizationResponse__WEBPACK_IMPORTED_MODULE_22__["OrganizationResponse"](r);
+ });
+ }
+ putOrganization(id, request) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('PUT', '/organizations/' + id, request, true, true);
+ return new _models_response_organizationResponse__WEBPACK_IMPORTED_MODULE_22__["OrganizationResponse"](r);
+ });
+ }
+ putOrganizationTaxInfo(id, request) {
+ return __awaiter(this, void 0, void 0, function* () {
+ return this.send('PUT', '/organizations/' + id + '/tax', request, true, false);
+ });
+ }
+ postLeaveOrganization(id) {
+ return this.send('POST', '/organizations/' + id + '/leave', null, true, false);
+ }
+ postOrganizationLicense(data) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('POST', '/organizations/license', data, true, true);
+ return new _models_response_organizationResponse__WEBPACK_IMPORTED_MODULE_22__["OrganizationResponse"](r);
+ });
+ }
+ postOrganizationLicenseUpdate(id, data) {
+ return __awaiter(this, void 0, void 0, function* () {
+ return this.send('POST', '/organizations/' + id + '/license', data, true, false);
+ });
+ }
+ postOrganizationApiKey(id, request) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('POST', '/organizations/' + id + '/api-key', request, true, true);
+ return new _models_response_apiKeyResponse__WEBPACK_IMPORTED_MODULE_2__["ApiKeyResponse"](r);
+ });
+ }
+ postOrganizationRotateApiKey(id, request) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('POST', '/organizations/' + id + '/rotate-api-key', request, true, true);
+ return new _models_response_apiKeyResponse__WEBPACK_IMPORTED_MODULE_2__["ApiKeyResponse"](r);
+ });
+ }
+ postOrganizationSso(id, request) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('POST', '/organizations/' + id + '/sso', request, true, true);
+ return new _models_response_organization_organizationSsoResponse__WEBPACK_IMPORTED_MODULE_19__["OrganizationSsoResponse"](r);
+ });
+ }
+ postOrganizationUpgrade(id, request) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('POST', '/organizations/' + id + '/upgrade', request, true, true);
+ return new _models_response_paymentResponse__WEBPACK_IMPORTED_MODULE_27__["PaymentResponse"](r);
+ });
+ }
+ postOrganizationUpdateSubscription(id, request) {
+ return __awaiter(this, void 0, void 0, function* () {
+ return this.send('POST', '/organizations/' + id + '/subscription', request, true, false);
+ });
+ }
+ postOrganizationSeat(id, request) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('POST', '/organizations/' + id + '/seat', request, true, true);
+ return new _models_response_paymentResponse__WEBPACK_IMPORTED_MODULE_27__["PaymentResponse"](r);
+ });
+ }
+ postOrganizationStorage(id, request) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('POST', '/organizations/' + id + '/storage', request, true, true);
+ return new _models_response_paymentResponse__WEBPACK_IMPORTED_MODULE_27__["PaymentResponse"](r);
+ });
+ }
+ postOrganizationPayment(id, request) {
+ return this.send('POST', '/organizations/' + id + '/payment', request, true, false);
+ }
+ postOrganizationVerifyBank(id, request) {
+ return this.send('POST', '/organizations/' + id + '/verify-bank', request, true, false);
+ }
+ postOrganizationCancel(id) {
+ return this.send('POST', '/organizations/' + id + '/cancel', null, true, false);
+ }
+ postOrganizationReinstate(id) {
+ return this.send('POST', '/organizations/' + id + '/reinstate', null, true, false);
+ }
+ deleteOrganization(id, request) {
+ return this.send('DELETE', '/organizations/' + id, request, true, false);
+ }
+ getOrganizationKeys(id) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('GET', '/organizations/' + id + '/keys', null, true, true);
+ return new _models_response_organizationKeysResponse__WEBPACK_IMPORTED_MODULE_21__["OrganizationKeysResponse"](r);
+ });
+ }
+ postOrganizationKeys(id, request) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('POST', '/organizations/' + id + '/keys', request, true, true);
+ return new _models_response_organizationKeysResponse__WEBPACK_IMPORTED_MODULE_21__["OrganizationKeysResponse"](r);
+ });
+ }
+ // Provider APIs
+ postProviderSetup(id, request) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('POST', '/providers/' + id + '/setup', request, true, true);
+ return new _models_response_provider_providerResponse__WEBPACK_IMPORTED_MODULE_33__["ProviderResponse"](r);
+ });
+ }
+ getProvider(id) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('GET', '/providers/' + id, null, true, true);
+ return new _models_response_provider_providerResponse__WEBPACK_IMPORTED_MODULE_33__["ProviderResponse"](r);
+ });
+ }
+ putProvider(id, request) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('PUT', '/providers/' + id, request, true, true);
+ return new _models_response_provider_providerResponse__WEBPACK_IMPORTED_MODULE_33__["ProviderResponse"](r);
+ });
+ }
+ // Provider User APIs
+ getProviderUsers(providerId) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('GET', '/providers/' + providerId + '/users', null, true, true);
+ return new _models_response_listResponse__WEBPACK_IMPORTED_MODULE_18__["ListResponse"](r, _models_response_provider_providerUserResponse__WEBPACK_IMPORTED_MODULE_36__["ProviderUserUserDetailsResponse"]);
+ });
+ }
+ getProviderUser(providerId, id) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('GET', '/providers/' + providerId + '/users/' + id, null, true, true);
+ return new _models_response_provider_providerUserResponse__WEBPACK_IMPORTED_MODULE_36__["ProviderUserResponse"](r);
+ });
+ }
+ postProviderUserInvite(providerId, request) {
+ return this.send('POST', '/providers/' + providerId + '/users/invite', request, true, false);
+ }
+ postProviderUserReinvite(providerId, id) {
+ return this.send('POST', '/providers/' + providerId + '/users/' + id + '/reinvite', null, true, false);
+ }
+ postManyProviderUserReinvite(providerId, request) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('POST', '/providers/' + providerId + '/users/reinvite', request, true, true);
+ return new _models_response_listResponse__WEBPACK_IMPORTED_MODULE_18__["ListResponse"](r, _models_response_provider_providerUserBulkResponse__WEBPACK_IMPORTED_MODULE_35__["ProviderUserBulkResponse"]);
+ });
+ }
+ postProviderUserBulkConfirm(providerId, request) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('POST', '/providers/' + providerId + '/users/confirm', request, true, true);
+ return new _models_response_listResponse__WEBPACK_IMPORTED_MODULE_18__["ListResponse"](r, _models_response_provider_providerUserBulkResponse__WEBPACK_IMPORTED_MODULE_35__["ProviderUserBulkResponse"]);
+ });
+ }
+ deleteManyProviderUsers(providerId, request) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('DELETE', '/providers/' + providerId + '/users', request, true, true);
+ return new _models_response_listResponse__WEBPACK_IMPORTED_MODULE_18__["ListResponse"](r, _models_response_provider_providerUserBulkResponse__WEBPACK_IMPORTED_MODULE_35__["ProviderUserBulkResponse"]);
+ });
+ }
+ postProviderUserAccept(providerId, id, request) {
+ return this.send('POST', '/providers/' + providerId + '/users/' + id + '/accept', request, true, false);
+ }
+ postProviderUserConfirm(providerId, id, request) {
+ return this.send('POST', '/providers/' + providerId + '/users/' + id + '/confirm', request, true, false);
+ }
+ postProviderUsersPublicKey(providerId, request) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('POST', '/providers/' + providerId + '/users/public-keys', request, true, true);
+ return new _models_response_listResponse__WEBPACK_IMPORTED_MODULE_18__["ListResponse"](r, _models_response_provider_providerUserBulkPublicKeyResponse__WEBPACK_IMPORTED_MODULE_34__["ProviderUserBulkPublicKeyResponse"]);
+ });
+ }
+ putProviderUser(providerId, id, request) {
+ return this.send('PUT', '/providers/' + providerId + '/users/' + id, request, true, false);
+ }
+ deleteProviderUser(providerId, id) {
+ return this.send('DELETE', '/providers/' + providerId + '/users/' + id, null, true, false);
+ }
+ // Provider Organization APIs
+ getProviderClients(providerId) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('GET', '/providers/' + providerId + '/organizations', null, true, true);
+ return new _models_response_listResponse__WEBPACK_IMPORTED_MODULE_18__["ListResponse"](r, _models_response_provider_providerOrganizationResponse__WEBPACK_IMPORTED_MODULE_32__["ProviderOrganizationOrganizationDetailsResponse"]);
+ });
+ }
+ postProviderAddOrganization(providerId, request) {
+ return this.send('POST', '/providers/' + providerId + '/organizations/add', request, true, false);
+ }
+ postProviderCreateOrganization(providerId, request) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('POST', '/providers/' + providerId + '/organizations', request, true, true);
+ return new _models_response_provider_providerOrganizationResponse__WEBPACK_IMPORTED_MODULE_32__["ProviderOrganizationResponse"](r);
+ });
+ }
+ deleteProviderOrganization(providerId, id) {
+ return this.send('DELETE', '/providers/' + providerId + '/organizations/' + id, null, true, false);
+ }
+ // Event APIs
+ getEvents(start, end, token) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('GET', this.addEventParameters('/events', start, end, token), null, true, true);
+ return new _models_response_listResponse__WEBPACK_IMPORTED_MODULE_18__["ListResponse"](r, _models_response_eventResponse__WEBPACK_IMPORTED_MODULE_12__["EventResponse"]);
+ });
+ }
+ getEventsCipher(id, start, end, token) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('GET', this.addEventParameters('/ciphers/' + id + '/events', start, end, token), null, true, true);
+ return new _models_response_listResponse__WEBPACK_IMPORTED_MODULE_18__["ListResponse"](r, _models_response_eventResponse__WEBPACK_IMPORTED_MODULE_12__["EventResponse"]);
+ });
+ }
+ getEventsOrganization(id, start, end, token) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('GET', this.addEventParameters('/organizations/' + id + '/events', start, end, token), null, true, true);
+ return new _models_response_listResponse__WEBPACK_IMPORTED_MODULE_18__["ListResponse"](r, _models_response_eventResponse__WEBPACK_IMPORTED_MODULE_12__["EventResponse"]);
+ });
+ }
+ getEventsOrganizationUser(organizationId, id, start, end, token) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('GET', this.addEventParameters('/organizations/' + organizationId + '/users/' + id + '/events', start, end, token), null, true, true);
+ return new _models_response_listResponse__WEBPACK_IMPORTED_MODULE_18__["ListResponse"](r, _models_response_eventResponse__WEBPACK_IMPORTED_MODULE_12__["EventResponse"]);
+ });
+ }
+ getEventsProvider(id, start, end, token) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('GET', this.addEventParameters('/providers/' + id + '/events', start, end, token), null, true, true);
+ return new _models_response_listResponse__WEBPACK_IMPORTED_MODULE_18__["ListResponse"](r, _models_response_eventResponse__WEBPACK_IMPORTED_MODULE_12__["EventResponse"]);
+ });
+ }
+ getEventsProviderUser(providerId, id, start, end, token) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('GET', this.addEventParameters('/providers/' + providerId + '/users/' + id + '/events', start, end, token), null, true, true);
+ return new _models_response_listResponse__WEBPACK_IMPORTED_MODULE_18__["ListResponse"](r, _models_response_eventResponse__WEBPACK_IMPORTED_MODULE_12__["EventResponse"]);
+ });
+ }
+ postEventsCollect(request) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const authHeader = yield this.getActiveBearerToken();
+ const headers = new Headers({
+ 'Device-Type': this.deviceType,
+ 'Authorization': 'Bearer ' + authHeader,
+ 'Content-Type': 'application/json; charset=utf-8',
+ });
+ if (this.customUserAgent != null) {
+ headers.set('User-Agent', this.customUserAgent);
+ }
+ const response = yield this.fetch(new Request(this.environmentService.getEventsUrl() + '/collect', {
+ cache: 'no-store',
+ credentials: this.getCredentials(),
+ method: 'POST',
+ body: JSON.stringify(request),
+ headers: headers,
+ }));
+ if (response.status !== 200) {
+ return Promise.reject('Event post failed.');
+ }
+ });
+ }
+ // User APIs
+ getUserPublicKey(id) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('GET', '/users/' + id + '/public-key', null, true, true);
+ return new _models_response_userKeyResponse__WEBPACK_IMPORTED_MODULE_53__["UserKeyResponse"](r);
+ });
+ }
+ // HIBP APIs
+ getHibpBreach(username) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('GET', '/hibp/breach?username=' + username, null, true, true);
+ return r.map((a) => new _models_response_breachAccountResponse__WEBPACK_IMPORTED_MODULE_6__["BreachAccountResponse"](a));
+ });
+ }
+ // Misc
+ postBitPayInvoice(request) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('POST', '/bitpay-invoice', request, true, true);
+ return r;
+ });
+ }
+ postSetupPayment() {
+ return __awaiter(this, void 0, void 0, function* () {
+ const r = yield this.send('POST', '/setup-payment', null, true, true);
+ return r;
+ });
+ }
+ // Crypto Agent
+ getUserKeyFromCryptoAgent(cryptoAgentUrl) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const authHeader = yield this.getActiveBearerToken();
+ const response = yield this.fetch(new Request(cryptoAgentUrl + '/user-keys', {
+ cache: 'no-store',
+ method: 'GET',
+ headers: new Headers({
+ 'Accept': 'application/json',
+ 'Authorization': 'Bearer ' + authHeader,
+ }),
+ }));
+ if (response.status !== 200) {
+ const error = yield this.handleError(response, false, true);
+ return Promise.reject(error);
+ }
+ return new _models_response_cryptoAgentUserKeyResponse__WEBPACK_IMPORTED_MODULE_54__["CryptoAgentUserKeyResponse"](yield response.json());
+ });
+ }
+ postUserKeyToCryptoAgent(cryptoAgentUrl, request) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const authHeader = yield this.getActiveBearerToken();
+ const response = yield this.fetch(new Request(cryptoAgentUrl + '/user-keys', {
+ cache: 'no-store',
+ method: 'POST',
+ headers: new Headers({
+ 'Accept': 'application/json',
+ 'Authorization': 'Bearer ' + authHeader,
+ 'Content-Type': 'application/json; charset=utf-8',
+ }),
+ body: JSON.stringify(request),
+ }));
+ if (response.status !== 200) {
+ const error = yield this.handleError(response, false, true);
+ return Promise.reject(error);
+ }
+ });
+ }
+ // Helpers
+ getActiveBearerToken() {
+ return __awaiter(this, void 0, void 0, function* () {
+ let accessToken = yield this.tokenService.getToken();
+ if (this.tokenService.tokenNeedsRefresh()) {
+ yield this.doAuthRefresh();
+ accessToken = yield this.tokenService.getToken();
+ }
+ return accessToken;
+ });
+ }
+ fetch(request) {
+ if (request.method === 'GET') {
+ request.headers.set('Cache-Control', 'no-store');
+ request.headers.set('Pragma', 'no-cache');
+ }
+ return this.nativeFetch(request);
+ }
+ nativeFetch(request) {
+ return fetch(request);
+ }
+ preValidateSso(identifier) {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (identifier == null || identifier === '') {
+ throw new Error('Organization Identifier was not provided.');
+ }
+ const headers = new Headers({
+ 'Accept': 'application/json',
+ 'Device-Type': this.deviceType,
+ });
+ if (this.customUserAgent != null) {
+ headers.set('User-Agent', this.customUserAgent);
+ }
+ const path = `/account/prevalidate?domainHint=${encodeURIComponent(identifier)}`;
+ const response = yield this.fetch(new Request(this.environmentService.getIdentityUrl() + path, {
+ cache: 'no-store',
+ credentials: this.getCredentials(),
+ headers: headers,
+ method: 'GET',
+ }));
+ if (response.status === 200) {
+ return true;
+ }
+ else {
+ const error = yield this.handleError(response, false, true);
+ return Promise.reject(error);
+ }
+ });
+ }
+ doAuthRefresh() {
+ return __awaiter(this, void 0, void 0, function* () {
+ const refreshToken = yield this.tokenService.getRefreshToken();
+ if (refreshToken != null && refreshToken !== '') {
+ return this.doRefreshToken();
+ }
+ const clientId = yield this.tokenService.getClientId();
+ const clientSecret = yield this.tokenService.getClientSecret();
+ if (!_misc_utils__WEBPACK_IMPORTED_MODULE_1__["Utils"].isNullOrWhitespace(clientId) && !_misc_utils__WEBPACK_IMPORTED_MODULE_1__["Utils"].isNullOrWhitespace(clientSecret)) {
+ return this.doApiTokenRefresh();
+ }
+ throw new Error('Cannot refresh token, no refresh token or api keys are stored');
+ });
+ }
+ doApiTokenRefresh() {
+ return __awaiter(this, void 0, void 0, function* () {
+ const clientId = yield this.tokenService.getClientId();
+ const clientSecret = yield this.tokenService.getClientSecret();
+ if (_misc_utils__WEBPACK_IMPORTED_MODULE_1__["Utils"].isNullOrWhitespace(clientId) || _misc_utils__WEBPACK_IMPORTED_MODULE_1__["Utils"].isNullOrWhitespace(clientSecret) || this.apiKeyRefresh == null) {
+ throw new Error();
+ }
+ yield this.apiKeyRefresh(clientId, clientSecret);
+ });
+ }
+ doRefreshToken() {
+ return __awaiter(this, void 0, void 0, function* () {
+ const refreshToken = yield this.tokenService.getRefreshToken();
+ if (refreshToken == null || refreshToken === '') {
+ throw new Error();
+ }
+ const headers = new Headers({
+ 'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8',
+ 'Accept': 'application/json',
+ 'Device-Type': this.deviceType,
+ });
+ if (this.customUserAgent != null) {
+ headers.set('User-Agent', this.customUserAgent);
+ }
+ const decodedToken = this.tokenService.decodeToken();
+ const response = yield this.fetch(new Request(this.environmentService.getIdentityUrl() + '/connect/token', {
+ body: this.qsStringify({
+ grant_type: 'refresh_token',
+ client_id: decodedToken.client_id,
+ refresh_token: refreshToken,
+ }),
+ cache: 'no-store',
+ credentials: this.getCredentials(),
+ headers: headers,
+ method: 'POST',
+ }));
+ if (response.status === 200) {
+ const responseJson = yield response.json();
+ const tokenResponse = new _models_response_identityTokenResponse__WEBPACK_IMPORTED_MODULE_16__["IdentityTokenResponse"](responseJson);
+ yield this.tokenService.setTokens(tokenResponse.accessToken, tokenResponse.refreshToken, null);
+ }
+ else {
+ const error = yield this.handleError(response, true, true);
+ return Promise.reject(error);
+ }
+ });
+ }
+ send(method, path, body, authed, hasResponse, apiUrl, alterHeaders) {
+ return __awaiter(this, void 0, void 0, function* () {
+ apiUrl = _misc_utils__WEBPACK_IMPORTED_MODULE_1__["Utils"].isNullOrWhitespace(apiUrl) ? this.environmentService.getApiUrl() : apiUrl;
+ const headers = new Headers({
+ 'Device-Type': this.deviceType,
+ });
+ if (this.customUserAgent != null) {
+ headers.set('User-Agent', this.customUserAgent);
+ }
+ const requestInit = {
+ cache: 'no-store',
+ credentials: this.getCredentials(),
+ method: method,
+ };
+ if (authed) {
+ const authHeader = yield this.getActiveBearerToken();
+ headers.set('Authorization', 'Bearer ' + authHeader);
+ }
+ if (body != null) {
+ if (typeof body === 'string') {
+ requestInit.body = body;
+ headers.set('Content-Type', 'application/x-www-form-urlencoded; charset=utf-8');
+ }
+ else if (typeof body === 'object') {
+ if (body instanceof FormData) {
+ requestInit.body = body;
+ }
+ else {
+ headers.set('Content-Type', 'application/json; charset=utf-8');
+ requestInit.body = JSON.stringify(body);
+ }
+ }
+ }
+ if (hasResponse) {
+ headers.set('Accept', 'application/json');
+ }
+ if (alterHeaders != null) {
+ alterHeaders(headers);
+ }
+ requestInit.headers = headers;
+ const response = yield this.fetch(new Request(apiUrl + path, requestInit));
+ if (hasResponse && response.status === 200) {
+ const responseJson = yield response.json();
+ return responseJson;
+ }
+ else if (response.status !== 200) {
+ const error = yield this.handleError(response, false, authed);
+ return Promise.reject(error);
+ }
+ });
+ }
+ handleError(response, tokenError, authed) {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (authed && ((tokenError && response.status === 400) || response.status === 401 || response.status === 403)) {
+ yield this.logoutCallback(true);
+ return null;
+ }
+ let responseJson = null;
+ if (this.isJsonResponse(response)) {
+ responseJson = yield response.json();
+ }
+ else if (this.isTextResponse(response)) {
+ responseJson = { Message: yield response.text() };
+ }
+ return new _models_response_errorResponse__WEBPACK_IMPORTED_MODULE_11__["ErrorResponse"](responseJson, response.status, tokenError);
+ });
+ }
+ qsStringify(params) {
+ return Object.keys(params).map(key => {
+ return encodeURIComponent(key) + '=' + encodeURIComponent(params[key]);
+ }).join('&');
+ }
+ getCredentials() {
+ if (!this.isWebClient || this.environmentService.hasBaseUrl()) {
+ return 'include';
+ }
+ return undefined;
+ }
+ addEventParameters(base, start, end, token) {
+ if (start != null) {
+ base += ('?start=' + start);
+ }
+ if (end != null) {
+ base += (base.indexOf('?') > -1 ? '&' : '?');
+ base += ('end=' + end);
+ }
+ if (token != null) {
+ base += (base.indexOf('?') > -1 ? '&' : '?');
+ base += ('continuationToken=' + token);
+ }
+ return base;
+ }
+ isJsonResponse(response) {
+ const typeHeader = response.headers.get('content-type');
+ return typeHeader != null && typeHeader.indexOf('application/json') > -1;
+ }
+ isTextResponse(response) {
+ const typeHeader = response.headers.get('content-type');
+ return typeHeader != null && typeHeader.indexOf('text') > -1;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/services/appId.service.ts":
+/*!****************************************************!*\
+ !*** ./jslib/common/src/services/appId.service.ts ***!
+ \****************************************************/
+/*! exports provided: AppIdService */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AppIdService", function() { return AppIdService; });
+/* harmony import */ var _misc_utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../misc/utils */ "./jslib/common/src/misc/utils.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+class AppIdService {
+ constructor(storageService) {
+ this.storageService = storageService;
+ }
+ getAppId() {
+ return this.makeAndGetAppId('appId');
+ }
+ getAnonymousAppId() {
+ return this.makeAndGetAppId('anonymousAppId');
+ }
+ makeAndGetAppId(key) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const existingId = yield this.storageService.get(key);
+ if (existingId != null) {
+ return existingId;
+ }
+ const guid = _misc_utils__WEBPACK_IMPORTED_MODULE_0__["Utils"].newGuid();
+ yield this.storageService.save(key, guid);
+ return guid;
+ });
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/services/audit.service.ts":
+/*!****************************************************!*\
+ !*** ./jslib/common/src/services/audit.service.ts ***!
+ \****************************************************/
+/*! exports provided: AuditService */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AuditService", function() { return AuditService; });
+/* harmony import */ var _misc_throttle__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../misc/throttle */ "./jslib/common/src/misc/throttle.ts");
+/* harmony import */ var _misc_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../misc/utils */ "./jslib/common/src/misc/utils.ts");
+var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
+ 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;
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
+};
+var __metadata = (undefined && undefined.__metadata) || function (k, v) {
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
+};
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+const PwnedPasswordsApi = 'https://api.pwnedpasswords.com/range/';
+class AuditService {
+ constructor(cryptoFunctionService, apiService) {
+ this.cryptoFunctionService = cryptoFunctionService;
+ this.apiService = apiService;
+ }
+ passwordLeaked(password) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const hashBytes = yield this.cryptoFunctionService.hash(password, 'sha1');
+ const hash = _misc_utils__WEBPACK_IMPORTED_MODULE_1__["Utils"].fromBufferToHex(hashBytes).toUpperCase();
+ const hashStart = hash.substr(0, 5);
+ const hashEnding = hash.substr(5);
+ const response = yield this.apiService.nativeFetch(new Request(PwnedPasswordsApi + hashStart));
+ const leakedHashes = yield response.text();
+ const match = leakedHashes.split(/\r?\n/).find(v => {
+ return v.split(':')[0] === hashEnding;
+ });
+ return match != null ? parseInt(match.split(':')[1], 10) : 0;
+ });
+ }
+ breachedAccounts(username) {
+ return __awaiter(this, void 0, void 0, function* () {
+ try {
+ return yield this.apiService.getHibpBreach(username);
+ }
+ catch (e) {
+ const error = e;
+ if (error.statusCode === 404) {
+ return [];
+ }
+ throw new Error();
+ }
+ });
+ }
+}
+__decorate([
+ Object(_misc_throttle__WEBPACK_IMPORTED_MODULE_0__["throttle"])(100, () => 'passwordLeaked'),
+ __metadata("design:type", Function),
+ __metadata("design:paramtypes", [String]),
+ __metadata("design:returntype", Promise)
+], AuditService.prototype, "passwordLeaked", null);
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/services/auth.service.ts":
+/*!***************************************************!*\
+ !*** ./jslib/common/src/services/auth.service.ts ***!
+ \***************************************************/
+/*! exports provided: TwoFactorProviders, AuthService */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TwoFactorProviders", function() { return TwoFactorProviders; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AuthService", function() { return AuthService; });
+/* harmony import */ var _enums_hashPurpose__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../enums/hashPurpose */ "./jslib/common/src/enums/hashPurpose.ts");
+/* harmony import */ var _enums_twoFactorProviderType__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../enums/twoFactorProviderType */ "./jslib/common/src/enums/twoFactorProviderType.ts");
+/* harmony import */ var _models_domain_authResult__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../models/domain/authResult */ "./jslib/common/src/models/domain/authResult.ts");
+/* harmony import */ var _models_domain_symmetricCryptoKey__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../models/domain/symmetricCryptoKey */ "./jslib/common/src/models/domain/symmetricCryptoKey.ts");
+/* harmony import */ var _models_request_account_setCryptoAgentKeyRequest__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../models/request/account/setCryptoAgentKeyRequest */ "./jslib/common/src/models/request/account/setCryptoAgentKeyRequest.ts");
+/* harmony import */ var _models_request_cryptoAgentUserKeyRequest__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../models/request/cryptoAgentUserKeyRequest */ "./jslib/common/src/models/request/cryptoAgentUserKeyRequest.ts");
+/* harmony import */ var _models_request_deviceRequest__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../models/request/deviceRequest */ "./jslib/common/src/models/request/deviceRequest.ts");
+/* harmony import */ var _models_request_keysRequest__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../models/request/keysRequest */ "./jslib/common/src/models/request/keysRequest.ts");
+/* harmony import */ var _models_request_preloginRequest__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../models/request/preloginRequest */ "./jslib/common/src/models/request/preloginRequest.ts");
+/* harmony import */ var _models_request_tokenRequest__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../models/request/tokenRequest */ "./jslib/common/src/models/request/tokenRequest.ts");
+/* harmony import */ var _misc_utils__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../misc/utils */ "./jslib/common/src/misc/utils.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+
+
+
+
+
+
+
+
+
+const TwoFactorProviders = {
+ [_enums_twoFactorProviderType__WEBPACK_IMPORTED_MODULE_1__["TwoFactorProviderType"].Authenticator]: {
+ type: _enums_twoFactorProviderType__WEBPACK_IMPORTED_MODULE_1__["TwoFactorProviderType"].Authenticator,
+ name: null,
+ description: null,
+ priority: 1,
+ sort: 1,
+ premium: false,
+ },
+ [_enums_twoFactorProviderType__WEBPACK_IMPORTED_MODULE_1__["TwoFactorProviderType"].Yubikey]: {
+ type: _enums_twoFactorProviderType__WEBPACK_IMPORTED_MODULE_1__["TwoFactorProviderType"].Yubikey,
+ name: null,
+ description: null,
+ priority: 3,
+ sort: 2,
+ premium: true,
+ },
+ [_enums_twoFactorProviderType__WEBPACK_IMPORTED_MODULE_1__["TwoFactorProviderType"].Duo]: {
+ type: _enums_twoFactorProviderType__WEBPACK_IMPORTED_MODULE_1__["TwoFactorProviderType"].Duo,
+ name: 'Duo',
+ description: null,
+ priority: 2,
+ sort: 3,
+ premium: true,
+ },
+ [_enums_twoFactorProviderType__WEBPACK_IMPORTED_MODULE_1__["TwoFactorProviderType"].OrganizationDuo]: {
+ type: _enums_twoFactorProviderType__WEBPACK_IMPORTED_MODULE_1__["TwoFactorProviderType"].OrganizationDuo,
+ name: 'Duo (Organization)',
+ description: null,
+ priority: 10,
+ sort: 4,
+ premium: false,
+ },
+ [_enums_twoFactorProviderType__WEBPACK_IMPORTED_MODULE_1__["TwoFactorProviderType"].Email]: {
+ type: _enums_twoFactorProviderType__WEBPACK_IMPORTED_MODULE_1__["TwoFactorProviderType"].Email,
+ name: null,
+ description: null,
+ priority: 0,
+ sort: 6,
+ premium: false,
+ },
+ [_enums_twoFactorProviderType__WEBPACK_IMPORTED_MODULE_1__["TwoFactorProviderType"].WebAuthn]: {
+ type: _enums_twoFactorProviderType__WEBPACK_IMPORTED_MODULE_1__["TwoFactorProviderType"].WebAuthn,
+ name: null,
+ description: null,
+ priority: 4,
+ sort: 5,
+ premium: true,
+ },
+};
+class AuthService {
+ constructor(cryptoService, apiService, userService, tokenService, appIdService, i18nService, platformUtilsService, messagingService, vaultTimeoutService, logService, cryptoFunctionService, setCryptoKeys = true) {
+ this.cryptoService = cryptoService;
+ this.apiService = apiService;
+ this.userService = userService;
+ this.tokenService = tokenService;
+ this.appIdService = appIdService;
+ this.i18nService = i18nService;
+ this.platformUtilsService = platformUtilsService;
+ this.messagingService = messagingService;
+ this.vaultTimeoutService = vaultTimeoutService;
+ this.logService = logService;
+ this.cryptoFunctionService = cryptoFunctionService;
+ this.setCryptoKeys = setCryptoKeys;
+ this.selectedTwoFactorProviderType = null;
+ }
+ init() {
+ TwoFactorProviders[_enums_twoFactorProviderType__WEBPACK_IMPORTED_MODULE_1__["TwoFactorProviderType"].Email].name = this.i18nService.t('emailTitle');
+ TwoFactorProviders[_enums_twoFactorProviderType__WEBPACK_IMPORTED_MODULE_1__["TwoFactorProviderType"].Email].description = this.i18nService.t('emailDesc');
+ TwoFactorProviders[_enums_twoFactorProviderType__WEBPACK_IMPORTED_MODULE_1__["TwoFactorProviderType"].Authenticator].name = this.i18nService.t('authenticatorAppTitle');
+ TwoFactorProviders[_enums_twoFactorProviderType__WEBPACK_IMPORTED_MODULE_1__["TwoFactorProviderType"].Authenticator].description =
+ this.i18nService.t('authenticatorAppDesc');
+ TwoFactorProviders[_enums_twoFactorProviderType__WEBPACK_IMPORTED_MODULE_1__["TwoFactorProviderType"].Duo].description = this.i18nService.t('duoDesc');
+ TwoFactorProviders[_enums_twoFactorProviderType__WEBPACK_IMPORTED_MODULE_1__["TwoFactorProviderType"].OrganizationDuo].name =
+ 'Duo (' + this.i18nService.t('organization') + ')';
+ TwoFactorProviders[_enums_twoFactorProviderType__WEBPACK_IMPORTED_MODULE_1__["TwoFactorProviderType"].OrganizationDuo].description =
+ this.i18nService.t('duoOrganizationDesc');
+ TwoFactorProviders[_enums_twoFactorProviderType__WEBPACK_IMPORTED_MODULE_1__["TwoFactorProviderType"].WebAuthn].name = this.i18nService.t('webAuthnTitle');
+ TwoFactorProviders[_enums_twoFactorProviderType__WEBPACK_IMPORTED_MODULE_1__["TwoFactorProviderType"].WebAuthn].description = this.i18nService.t('webAuthnDesc');
+ TwoFactorProviders[_enums_twoFactorProviderType__WEBPACK_IMPORTED_MODULE_1__["TwoFactorProviderType"].Yubikey].name = this.i18nService.t('yubiKeyTitle');
+ TwoFactorProviders[_enums_twoFactorProviderType__WEBPACK_IMPORTED_MODULE_1__["TwoFactorProviderType"].Yubikey].description = this.i18nService.t('yubiKeyDesc');
+ }
+ logIn(email, masterPassword, captchaToken) {
+ return __awaiter(this, void 0, void 0, function* () {
+ this.selectedTwoFactorProviderType = null;
+ const key = yield this.makePreloginKey(masterPassword, email);
+ const hashedPassword = yield this.cryptoService.hashPassword(masterPassword, key);
+ const localHashedPassword = yield this.cryptoService.hashPassword(masterPassword, key, _enums_hashPurpose__WEBPACK_IMPORTED_MODULE_0__["HashPurpose"].LocalAuthorization);
+ return yield this.logInHelper(email, hashedPassword, localHashedPassword, null, null, null, null, null, key, null, null, null, captchaToken, null);
+ });
+ }
+ logInSso(code, codeVerifier, redirectUrl, orgId) {
+ return __awaiter(this, void 0, void 0, function* () {
+ this.selectedTwoFactorProviderType = null;
+ return yield this.logInHelper(null, null, null, code, codeVerifier, redirectUrl, null, null, null, null, null, null, null, orgId);
+ });
+ }
+ logInApiKey(clientId, clientSecret) {
+ return __awaiter(this, void 0, void 0, function* () {
+ this.selectedTwoFactorProviderType = null;
+ return yield this.logInHelper(null, null, null, null, null, null, clientId, clientSecret, null, null, null, null, null, null);
+ });
+ }
+ logInTwoFactor(twoFactorProvider, twoFactorToken, remember) {
+ return __awaiter(this, void 0, void 0, function* () {
+ return yield this.logInHelper(this.email, this.masterPasswordHash, this.localMasterPasswordHash, this.code, this.codeVerifier, this.ssoRedirectUrl, this.clientId, this.clientSecret, this.key, twoFactorProvider, twoFactorToken, remember, this.captchaToken, null);
+ });
+ }
+ logInComplete(email, masterPassword, twoFactorProvider, twoFactorToken, remember, captchaToken) {
+ return __awaiter(this, void 0, void 0, function* () {
+ this.selectedTwoFactorProviderType = null;
+ const key = yield this.makePreloginKey(masterPassword, email);
+ const hashedPassword = yield this.cryptoService.hashPassword(masterPassword, key);
+ const localHashedPassword = yield this.cryptoService.hashPassword(masterPassword, key, _enums_hashPurpose__WEBPACK_IMPORTED_MODULE_0__["HashPurpose"].LocalAuthorization);
+ return yield this.logInHelper(email, hashedPassword, localHashedPassword, null, null, null, null, null, key, twoFactorProvider, twoFactorToken, remember, captchaToken, null);
+ });
+ }
+ logInSsoComplete(code, codeVerifier, redirectUrl, twoFactorProvider, twoFactorToken, remember) {
+ return __awaiter(this, void 0, void 0, function* () {
+ this.selectedTwoFactorProviderType = null;
+ return yield this.logInHelper(null, null, null, code, codeVerifier, redirectUrl, null, null, null, twoFactorProvider, twoFactorToken, remember, null, null);
+ });
+ }
+ logInApiKeyComplete(clientId, clientSecret, twoFactorProvider, twoFactorToken, remember) {
+ return __awaiter(this, void 0, void 0, function* () {
+ this.selectedTwoFactorProviderType = null;
+ return yield this.logInHelper(null, null, null, null, null, null, clientId, clientSecret, null, twoFactorProvider, twoFactorToken, remember, null, null);
+ });
+ }
+ logOut(callback) {
+ callback();
+ this.messagingService.send('loggedOut');
+ }
+ getSupportedTwoFactorProviders(win) {
+ const providers = [];
+ if (this.twoFactorProvidersData == null) {
+ return providers;
+ }
+ if (this.twoFactorProvidersData.has(_enums_twoFactorProviderType__WEBPACK_IMPORTED_MODULE_1__["TwoFactorProviderType"].OrganizationDuo) &&
+ this.platformUtilsService.supportsDuo()) {
+ providers.push(TwoFactorProviders[_enums_twoFactorProviderType__WEBPACK_IMPORTED_MODULE_1__["TwoFactorProviderType"].OrganizationDuo]);
+ }
+ if (this.twoFactorProvidersData.has(_enums_twoFactorProviderType__WEBPACK_IMPORTED_MODULE_1__["TwoFactorProviderType"].Authenticator)) {
+ providers.push(TwoFactorProviders[_enums_twoFactorProviderType__WEBPACK_IMPORTED_MODULE_1__["TwoFactorProviderType"].Authenticator]);
+ }
+ if (this.twoFactorProvidersData.has(_enums_twoFactorProviderType__WEBPACK_IMPORTED_MODULE_1__["TwoFactorProviderType"].Yubikey)) {
+ providers.push(TwoFactorProviders[_enums_twoFactorProviderType__WEBPACK_IMPORTED_MODULE_1__["TwoFactorProviderType"].Yubikey]);
+ }
+ if (this.twoFactorProvidersData.has(_enums_twoFactorProviderType__WEBPACK_IMPORTED_MODULE_1__["TwoFactorProviderType"].Duo) && this.platformUtilsService.supportsDuo()) {
+ providers.push(TwoFactorProviders[_enums_twoFactorProviderType__WEBPACK_IMPORTED_MODULE_1__["TwoFactorProviderType"].Duo]);
+ }
+ if (this.twoFactorProvidersData.has(_enums_twoFactorProviderType__WEBPACK_IMPORTED_MODULE_1__["TwoFactorProviderType"].WebAuthn) && this.platformUtilsService.supportsWebAuthn(win)) {
+ providers.push(TwoFactorProviders[_enums_twoFactorProviderType__WEBPACK_IMPORTED_MODULE_1__["TwoFactorProviderType"].WebAuthn]);
+ }
+ if (this.twoFactorProvidersData.has(_enums_twoFactorProviderType__WEBPACK_IMPORTED_MODULE_1__["TwoFactorProviderType"].Email)) {
+ providers.push(TwoFactorProviders[_enums_twoFactorProviderType__WEBPACK_IMPORTED_MODULE_1__["TwoFactorProviderType"].Email]);
+ }
+ return providers;
+ }
+ getDefaultTwoFactorProvider(webAuthnSupported) {
+ if (this.twoFactorProvidersData == null) {
+ return null;
+ }
+ if (this.selectedTwoFactorProviderType != null &&
+ this.twoFactorProvidersData.has(this.selectedTwoFactorProviderType)) {
+ return this.selectedTwoFactorProviderType;
+ }
+ let providerType = null;
+ let providerPriority = -1;
+ this.twoFactorProvidersData.forEach((value, type) => {
+ const provider = TwoFactorProviders[type];
+ if (provider != null && provider.priority > providerPriority) {
+ if (type === _enums_twoFactorProviderType__WEBPACK_IMPORTED_MODULE_1__["TwoFactorProviderType"].WebAuthn && !webAuthnSupported) {
+ return;
+ }
+ providerType = type;
+ providerPriority = provider.priority;
+ }
+ });
+ return providerType;
+ }
+ makePreloginKey(masterPassword, email) {
+ return __awaiter(this, void 0, void 0, function* () {
+ email = email.trim().toLowerCase();
+ let kdf = null;
+ let kdfIterations = null;
+ try {
+ const preloginResponse = yield this.apiService.postPrelogin(new _models_request_preloginRequest__WEBPACK_IMPORTED_MODULE_8__["PreloginRequest"](email));
+ if (preloginResponse != null) {
+ kdf = preloginResponse.kdf;
+ kdfIterations = preloginResponse.kdfIterations;
+ }
+ }
+ catch (e) {
+ if (e == null || e.statusCode !== 404) {
+ throw e;
+ }
+ }
+ return this.cryptoService.makeKey(masterPassword, email, kdf, kdfIterations);
+ });
+ }
+ authingWithApiKey() {
+ return this.clientId != null && this.clientSecret != null;
+ }
+ authingWithSso() {
+ return this.code != null && this.codeVerifier != null && this.ssoRedirectUrl != null;
+ }
+ authingWithPassword() {
+ return this.email != null && this.masterPasswordHash != null;
+ }
+ logInHelper(email, hashedPassword, localHashedPassword, code, codeVerifier, redirectUrl, clientId, clientSecret, key, twoFactorProvider, twoFactorToken, remember, captchaToken, orgId) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const storedTwoFactorToken = yield this.tokenService.getTwoFactorToken(email);
+ const appId = yield this.appIdService.getAppId();
+ const deviceRequest = new _models_request_deviceRequest__WEBPACK_IMPORTED_MODULE_6__["DeviceRequest"](appId, this.platformUtilsService);
+ let emailPassword = [];
+ let codeCodeVerifier = [];
+ let clientIdClientSecret = [null, null];
+ if (email != null && hashedPassword != null) {
+ emailPassword = [email, hashedPassword];
+ }
+ else {
+ emailPassword = null;
+ }
+ if (code != null && codeVerifier != null && redirectUrl != null) {
+ codeCodeVerifier = [code, codeVerifier, redirectUrl];
+ }
+ else {
+ codeCodeVerifier = null;
+ }
+ if (clientId != null && clientSecret != null) {
+ clientIdClientSecret = [clientId, clientSecret];
+ }
+ else {
+ clientIdClientSecret = null;
+ }
+ let request;
+ if (twoFactorToken != null && twoFactorProvider != null) {
+ request = new _models_request_tokenRequest__WEBPACK_IMPORTED_MODULE_9__["TokenRequest"](emailPassword, codeCodeVerifier, clientIdClientSecret, twoFactorProvider, twoFactorToken, remember, captchaToken, deviceRequest);
+ }
+ else if (storedTwoFactorToken != null) {
+ request = new _models_request_tokenRequest__WEBPACK_IMPORTED_MODULE_9__["TokenRequest"](emailPassword, codeCodeVerifier, clientIdClientSecret, _enums_twoFactorProviderType__WEBPACK_IMPORTED_MODULE_1__["TwoFactorProviderType"].Remember, storedTwoFactorToken, false, captchaToken, deviceRequest);
+ }
+ else {
+ request = new _models_request_tokenRequest__WEBPACK_IMPORTED_MODULE_9__["TokenRequest"](emailPassword, codeCodeVerifier, clientIdClientSecret, null, null, false, captchaToken, deviceRequest);
+ }
+ const response = yield this.apiService.postIdentityToken(request);
+ this.clearState();
+ const result = new _models_domain_authResult__WEBPACK_IMPORTED_MODULE_2__["AuthResult"]();
+ result.captchaSiteKey = response.siteKey;
+ if (!!result.captchaSiteKey) {
+ return result;
+ }
+ result.twoFactor = !!response.twoFactorProviders2;
+ if (result.twoFactor) {
+ // two factor required
+ this.email = email;
+ this.masterPasswordHash = hashedPassword;
+ this.localMasterPasswordHash = localHashedPassword;
+ this.code = code;
+ this.codeVerifier = codeVerifier;
+ this.ssoRedirectUrl = redirectUrl;
+ this.clientId = clientId;
+ this.clientSecret = clientSecret;
+ this.key = this.setCryptoKeys ? key : null;
+ const twoFactorResponse = response;
+ this.twoFactorProvidersData = twoFactorResponse.twoFactorProviders2;
+ result.twoFactorProviders = twoFactorResponse.twoFactorProviders2;
+ this.captchaToken = twoFactorResponse.captchaToken;
+ return result;
+ }
+ const tokenResponse = response;
+ result.resetMasterPassword = tokenResponse.resetMasterPassword;
+ result.forcePasswordReset = tokenResponse.forcePasswordReset;
+ if (tokenResponse.twoFactorToken != null) {
+ yield this.tokenService.setTwoFactorToken(tokenResponse.twoFactorToken, email);
+ }
+ yield this.tokenService.setTokens(tokenResponse.accessToken, tokenResponse.refreshToken, clientIdClientSecret);
+ yield this.userService.setInformation(this.tokenService.getUserId(), this.tokenService.getEmail(), tokenResponse.kdf, tokenResponse.kdfIterations);
+ if (this.setCryptoKeys) {
+ if (key != null) {
+ yield this.cryptoService.setKey(key);
+ }
+ if (localHashedPassword != null) {
+ yield this.cryptoService.setKeyHash(localHashedPassword);
+ }
+ // Skip this step during SSO new user flow. No key is returned from server.
+ if (code == null || tokenResponse.key != null) {
+ if (tokenResponse.cryptoAgentUrl != null) {
+ try {
+ const userKeyResponse = yield this.apiService.getUserKeyFromCryptoAgent(tokenResponse.cryptoAgentUrl);
+ const keyArr = _misc_utils__WEBPACK_IMPORTED_MODULE_10__["Utils"].fromB64ToArray(userKeyResponse.key);
+ const k = new _models_domain_symmetricCryptoKey__WEBPACK_IMPORTED_MODULE_3__["SymmetricCryptoKey"](keyArr);
+ yield this.cryptoService.setKey(k);
+ }
+ catch (e) {
+ this.logService.error(e);
+ throw new Error('Unable to reach crypto agent');
+ }
+ }
+ yield this.cryptoService.setEncKey(tokenResponse.key);
+ // User doesn't have a key pair yet (old account), let's generate one for them
+ if (tokenResponse.privateKey == null) {
+ try {
+ const keyPair = yield this.cryptoService.makeKeyPair();
+ yield this.apiService.postAccountKeys(new _models_request_keysRequest__WEBPACK_IMPORTED_MODULE_7__["KeysRequest"](keyPair[0], keyPair[1].encryptedString));
+ tokenResponse.privateKey = keyPair[1].encryptedString;
+ }
+ catch (e) {
+ this.logService.error(e);
+ }
+ }
+ yield this.cryptoService.setEncPrivateKey(tokenResponse.privateKey);
+ }
+ else if (tokenResponse.cryptoAgentUrl != null) {
+ const password = yield this.cryptoFunctionService.randomBytes(64);
+ const k = yield this.cryptoService.makeKey(_misc_utils__WEBPACK_IMPORTED_MODULE_10__["Utils"].fromBufferToB64(password), this.tokenService.getEmail(), tokenResponse.kdf, tokenResponse.kdfIterations);
+ const cryptoAgentRequest = new _models_request_cryptoAgentUserKeyRequest__WEBPACK_IMPORTED_MODULE_5__["CryptoAgentUserKeyRequest"](k.encKeyB64);
+ yield this.cryptoService.setKey(k);
+ const encKey = yield this.cryptoService.makeEncKey(k);
+ yield this.cryptoService.setEncKey(encKey[1].encryptedString);
+ const [pubKey, privKey] = yield this.cryptoService.makeKeyPair();
+ try {
+ yield this.apiService.postUserKeyToCryptoAgent(tokenResponse.cryptoAgentUrl, cryptoAgentRequest);
+ }
+ catch (e) {
+ throw new Error('Unable to reach crypto agent');
+ }
+ const keys = new _models_request_keysRequest__WEBPACK_IMPORTED_MODULE_7__["KeysRequest"](pubKey, privKey.encryptedString);
+ const setPasswordRequest = new _models_request_account_setCryptoAgentKeyRequest__WEBPACK_IMPORTED_MODULE_4__["SetCryptoAgentKeyRequest"](encKey[1].encryptedString, tokenResponse.kdf, tokenResponse.kdfIterations, orgId, keys);
+ yield this.apiService.postSetCryptoAgentKey(setPasswordRequest);
+ }
+ }
+ if (this.vaultTimeoutService != null) {
+ this.vaultTimeoutService.biometricLocked = false;
+ }
+ this.messagingService.send('loggedIn');
+ return result;
+ });
+ }
+ clearState() {
+ this.key = null;
+ this.email = null;
+ this.masterPasswordHash = null;
+ this.localMasterPasswordHash = null;
+ this.code = null;
+ this.codeVerifier = null;
+ this.ssoRedirectUrl = null;
+ this.clientId = null;
+ this.clientSecret = null;
+ this.twoFactorProvidersData = null;
+ this.selectedTwoFactorProviderType = null;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/services/azureFileUpload.service.ts":
+/*!**************************************************************!*\
+ !*** ./jslib/common/src/services/azureFileUpload.service.ts ***!
+ \**************************************************************/
+/*! exports provided: AzureFileUploadService */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AzureFileUploadService", function() { return AzureFileUploadService; });
+/* harmony import */ var _misc_utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../misc/utils */ "./jslib/common/src/misc/utils.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+const MAX_SINGLE_BLOB_UPLOAD_SIZE = 256 * 1024 * 1024; // 256 MiB
+const MAX_BLOCKS_PER_BLOB = 50000;
+class AzureFileUploadService {
+ constructor(logService) {
+ this.logService = logService;
+ }
+ upload(url, data, renewalCallback) {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (data.buffer.byteLength <= MAX_SINGLE_BLOB_UPLOAD_SIZE) {
+ return yield this.azureUploadBlob(url, data);
+ }
+ else {
+ return yield this.azureUploadBlocks(url, data, renewalCallback);
+ }
+ });
+ }
+ azureUploadBlob(url, data) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const urlObject = _misc_utils__WEBPACK_IMPORTED_MODULE_0__["Utils"].getUrl(url);
+ const headers = new Headers({
+ 'x-ms-date': new Date().toUTCString(),
+ 'x-ms-version': urlObject.searchParams.get('sv'),
+ 'Content-Length': data.buffer.byteLength.toString(),
+ 'x-ms-blob-type': 'BlockBlob',
+ });
+ const request = new Request(url, {
+ body: data.buffer,
+ cache: 'no-store',
+ method: 'PUT',
+ headers: headers,
+ });
+ const blobResponse = yield fetch(request);
+ if (blobResponse.status !== 201) {
+ throw new Error(`Failed to create Azure blob: ${blobResponse.status}`);
+ }
+ });
+ }
+ azureUploadBlocks(url, data, renewalCallback) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const baseUrl = _misc_utils__WEBPACK_IMPORTED_MODULE_0__["Utils"].getUrl(url);
+ const blockSize = this.getMaxBlockSize(baseUrl.searchParams.get('sv'));
+ let blockIndex = 0;
+ const numBlocks = Math.ceil(data.buffer.byteLength / blockSize);
+ const blocksStaged = [];
+ if (numBlocks > MAX_BLOCKS_PER_BLOB) {
+ throw new Error(`Cannot upload file, exceeds maximum size of ${blockSize * MAX_BLOCKS_PER_BLOB}`);
+ }
+ try {
+ while (blockIndex < numBlocks) {
+ url = yield this.renewUrlIfNecessary(url, renewalCallback);
+ const blockUrl = _misc_utils__WEBPACK_IMPORTED_MODULE_0__["Utils"].getUrl(url);
+ const blockId = this.encodedBlockId(blockIndex);
+ blockUrl.searchParams.append('comp', 'block');
+ blockUrl.searchParams.append('blockid', blockId);
+ const start = blockIndex * blockSize;
+ const blockData = data.buffer.slice(start, start + blockSize);
+ const blockHeaders = new Headers({
+ 'x-ms-date': new Date().toUTCString(),
+ 'x-ms-version': blockUrl.searchParams.get('sv'),
+ 'Content-Length': blockData.byteLength.toString(),
+ });
+ const blockRequest = new Request(blockUrl.toString(), {
+ body: blockData,
+ cache: 'no-store',
+ method: 'PUT',
+ headers: blockHeaders,
+ });
+ const blockResponse = yield fetch(blockRequest);
+ if (blockResponse.status !== 201) {
+ const message = `Unsuccessful block PUT. Received status ${blockResponse.status}`;
+ this.logService.error(message + '\n' + (yield blockResponse.json()));
+ throw new Error(message);
+ }
+ blocksStaged.push(blockId);
+ blockIndex++;
+ }
+ url = yield this.renewUrlIfNecessary(url, renewalCallback);
+ const blockListUrl = _misc_utils__WEBPACK_IMPORTED_MODULE_0__["Utils"].getUrl(url);
+ const blockListXml = this.blockListXml(blocksStaged);
+ blockListUrl.searchParams.append('comp', 'blocklist');
+ const headers = new Headers({
+ 'x-ms-date': new Date().toUTCString(),
+ 'x-ms-version': blockListUrl.searchParams.get('sv'),
+ 'Content-Length': blockListXml.length.toString(),
+ });
+ const request = new Request(blockListUrl.toString(), {
+ body: blockListXml,
+ cache: 'no-store',
+ method: 'PUT',
+ headers: headers,
+ });
+ const response = yield fetch(request);
+ if (response.status !== 201) {
+ const message = `Unsuccessful block list PUT. Received status ${response.status}`;
+ this.logService.error(message + '\n' + (yield response.json()));
+ throw new Error(message);
+ }
+ }
+ catch (e) {
+ throw e;
+ }
+ });
+ }
+ renewUrlIfNecessary(url, renewalCallback) {
+ var _a;
+ return __awaiter(this, void 0, void 0, function* () {
+ const urlObject = _misc_utils__WEBPACK_IMPORTED_MODULE_0__["Utils"].getUrl(url);
+ const expiry = new Date((_a = urlObject.searchParams.get('se')) !== null && _a !== void 0 ? _a : '');
+ if (isNaN(expiry.getTime())) {
+ expiry.setTime(Date.now() + 3600000);
+ }
+ if (expiry.getTime() < Date.now() + 1000) {
+ return yield renewalCallback();
+ }
+ return url;
+ });
+ }
+ encodedBlockId(blockIndex) {
+ // Encoded blockId max size is 64, so pre-encoding max size is 48
+ const utfBlockId = ('000000000000000000000000000000000000000000000000' + blockIndex.toString()).slice(-48);
+ return _misc_utils__WEBPACK_IMPORTED_MODULE_0__["Utils"].fromUtf8ToB64(utfBlockId);
+ }
+ blockListXml(blockIdList) {
+ let xml = '';
+ blockIdList.forEach(blockId => {
+ xml += `${blockId}`;
+ });
+ xml += '';
+ return xml;
+ }
+ getMaxBlockSize(version) {
+ if (Version.compare(version, '2019-12-12') >= 0) {
+ return 4000 * 1024 * 1024; // 4000 MiB
+ }
+ else if (Version.compare(version, '2016-05-31') >= 0) {
+ return 100 * 1024 * 1024; // 100 MiB
+ }
+ else {
+ return 4 * 1024 * 1024; // 4 MiB
+ }
+ }
+}
+class Version {
+ constructor(version) {
+ this.year = 0;
+ this.month = 0;
+ this.day = 0;
+ try {
+ const parts = version.split('-').map(v => Number.parseInt(v, 10));
+ this.year = parts[0];
+ this.month = parts[1];
+ this.day = parts[2];
+ }
+ catch (_a) {
+ // Ignore error
+ }
+ }
+ /**
+ * Compares two Azure Versions against each other
+ * @param a Version to compare
+ * @param b Version to compare
+ * @returns a number less than zero if b is newer than a, 0 if equal,
+ * and greater than zero if a is newer than b
+ */
+ static compare(a, b) {
+ if (typeof (a) === 'string') {
+ a = new Version(a);
+ }
+ if (typeof (b) === 'string') {
+ b = new Version(b);
+ }
+ return a.year !== b.year ? a.year - b.year :
+ a.month !== b.month ? a.month - b.month :
+ a.day !== b.day ? a.day - b.day :
+ 0;
+ }
+ /**
+ * Compares two Azure Versions against each other
+ * @param compareTo Version to compare against
+ * @returns a number less than zero if compareTo is newer, 0 if equal,
+ * and greater than zero if this is greater than compareTo
+ */
+ compare(compareTo) {
+ return Version.compare(this, compareTo);
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/services/bitwardenFileUpload.service.ts":
+/*!******************************************************************!*\
+ !*** ./jslib/common/src/services/bitwardenFileUpload.service.ts ***!
+ \******************************************************************/
+/*! exports provided: BitwardenFileUploadService */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* WEBPACK VAR INJECTION */(function(Buffer) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BitwardenFileUploadService", function() { return BitwardenFileUploadService; });
+/* harmony import */ var _misc_utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../misc/utils */ "./jslib/common/src/misc/utils.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+class BitwardenFileUploadService {
+ constructor(apiService) {
+ this.apiService = apiService;
+ }
+ upload(encryptedFileName, encryptedFileData, apiCall) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const fd = new FormData();
+ try {
+ const blob = new Blob([encryptedFileData.buffer], { type: 'application/octet-stream' });
+ fd.append('data', blob, encryptedFileName);
+ }
+ catch (e) {
+ if (_misc_utils__WEBPACK_IMPORTED_MODULE_0__["Utils"].isNode && !_misc_utils__WEBPACK_IMPORTED_MODULE_0__["Utils"].isBrowser) {
+ fd.append('data', Buffer.from(encryptedFileData.buffer), {
+ filepath: encryptedFileName,
+ contentType: 'application/octet-stream',
+ });
+ }
+ else {
+ throw e;
+ }
+ }
+ yield apiCall(fd);
+ });
+ }
+}
+
+/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../../node_modules/buffer/index.js */ "./node_modules/buffer/index.js").Buffer))
+
+/***/ }),
+
+/***/ "./jslib/common/src/services/cipher.service.ts":
+/*!*****************************************************!*\
+ !*** ./jslib/common/src/services/cipher.service.ts ***!
+ \*****************************************************/
+/*! exports provided: CipherService */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* WEBPACK VAR INJECTION */(function(Buffer) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CipherService", function() { return CipherService; });
+/* harmony import */ var _enums_cipherType__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../enums/cipherType */ "./jslib/common/src/enums/cipherType.ts");
+/* harmony import */ var _enums_fieldType__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../enums/fieldType */ "./jslib/common/src/enums/fieldType.ts");
+/* harmony import */ var _enums_uriMatchType__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../enums/uriMatchType */ "./jslib/common/src/enums/uriMatchType.ts");
+/* harmony import */ var _models_data_cipherData__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../models/data/cipherData */ "./jslib/common/src/models/data/cipherData.ts");
+/* harmony import */ var _models_domain_attachment__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../models/domain/attachment */ "./jslib/common/src/models/domain/attachment.ts");
+/* harmony import */ var _models_domain_card__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../models/domain/card */ "./jslib/common/src/models/domain/card.ts");
+/* harmony import */ var _models_domain_cipher__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../models/domain/cipher */ "./jslib/common/src/models/domain/cipher.ts");
+/* harmony import */ var _models_domain_field__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../models/domain/field */ "./jslib/common/src/models/domain/field.ts");
+/* harmony import */ var _models_domain_identity__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../models/domain/identity */ "./jslib/common/src/models/domain/identity.ts");
+/* harmony import */ var _models_domain_login__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../models/domain/login */ "./jslib/common/src/models/domain/login.ts");
+/* harmony import */ var _models_domain_loginUri__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../models/domain/loginUri */ "./jslib/common/src/models/domain/loginUri.ts");
+/* harmony import */ var _models_domain_password__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../models/domain/password */ "./jslib/common/src/models/domain/password.ts");
+/* harmony import */ var _models_domain_secureNote__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../models/domain/secureNote */ "./jslib/common/src/models/domain/secureNote.ts");
+/* harmony import */ var _models_request_cipherBulkDeleteRequest__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../models/request/cipherBulkDeleteRequest */ "./jslib/common/src/models/request/cipherBulkDeleteRequest.ts");
+/* harmony import */ var _models_request_cipherBulkMoveRequest__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../models/request/cipherBulkMoveRequest */ "./jslib/common/src/models/request/cipherBulkMoveRequest.ts");
+/* harmony import */ var _models_request_cipherBulkRestoreRequest__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../models/request/cipherBulkRestoreRequest */ "./jslib/common/src/models/request/cipherBulkRestoreRequest.ts");
+/* harmony import */ var _models_request_cipherBulkShareRequest__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../models/request/cipherBulkShareRequest */ "./jslib/common/src/models/request/cipherBulkShareRequest.ts");
+/* harmony import */ var _models_request_cipherCollectionsRequest__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../models/request/cipherCollectionsRequest */ "./jslib/common/src/models/request/cipherCollectionsRequest.ts");
+/* harmony import */ var _models_request_cipherCreateRequest__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../models/request/cipherCreateRequest */ "./jslib/common/src/models/request/cipherCreateRequest.ts");
+/* harmony import */ var _models_request_cipherRequest__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../models/request/cipherRequest */ "./jslib/common/src/models/request/cipherRequest.ts");
+/* harmony import */ var _models_request_cipherShareRequest__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../models/request/cipherShareRequest */ "./jslib/common/src/models/request/cipherShareRequest.ts");
+/* harmony import */ var _models_response_errorResponse__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../models/response/errorResponse */ "./jslib/common/src/models/response/errorResponse.ts");
+/* harmony import */ var _models_view_passwordHistoryView__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ../models/view/passwordHistoryView */ "./jslib/common/src/models/view/passwordHistoryView.ts");
+/* harmony import */ var _models_domain_sortedCiphersCache__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ../models/domain/sortedCiphersCache */ "./jslib/common/src/models/domain/sortedCiphersCache.ts");
+/* harmony import */ var _constants_service__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./constants.service */ "./jslib/common/src/services/constants.service.ts");
+/* harmony import */ var _misc_sequentialize__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ../misc/sequentialize */ "./jslib/common/src/misc/sequentialize.ts");
+/* harmony import */ var _misc_utils__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ../misc/utils */ "./jslib/common/src/misc/utils.ts");
+var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
+ 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;
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
+};
+var __metadata = (undefined && undefined.__metadata) || function (k, v) {
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
+};
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+const Keys = {
+ ciphersPrefix: 'ciphers_',
+ localData: 'sitesLocalData',
+ neverDomains: 'neverDomains',
+};
+const DomainMatchBlacklist = new Map([
+ ['google.com', new Set(['script.google.com'])],
+]);
+class CipherService {
+ constructor(cryptoService, userService, settingsService, apiService, fileUploadService, storageService, i18nService, searchService, logService) {
+ this.cryptoService = cryptoService;
+ this.userService = userService;
+ this.settingsService = settingsService;
+ this.apiService = apiService;
+ this.fileUploadService = fileUploadService;
+ this.storageService = storageService;
+ this.i18nService = i18nService;
+ this.searchService = searchService;
+ this.logService = logService;
+ this.sortedCiphersCache = new _models_domain_sortedCiphersCache__WEBPACK_IMPORTED_MODULE_23__["SortedCiphersCache"](this.sortCiphersByLastUsed);
+ }
+ get decryptedCipherCache() {
+ return this._decryptedCipherCache;
+ }
+ set decryptedCipherCache(value) {
+ this._decryptedCipherCache = value;
+ if (this.searchService != null) {
+ if (value == null) {
+ this.searchService().clearIndex();
+ }
+ else {
+ this.searchService().indexCiphers();
+ }
+ }
+ }
+ clearCache() {
+ this.decryptedCipherCache = null;
+ this.sortedCiphersCache.clear();
+ }
+ encrypt(model, key, originalCipher = null) {
+ return __awaiter(this, void 0, void 0, function* () {
+ // Adjust password history
+ if (model.id != null) {
+ if (originalCipher == null) {
+ originalCipher = yield this.get(model.id);
+ }
+ if (originalCipher != null) {
+ const existingCipher = yield originalCipher.decrypt();
+ model.passwordHistory = existingCipher.passwordHistory || [];
+ if (model.type === _enums_cipherType__WEBPACK_IMPORTED_MODULE_0__["CipherType"].Login && existingCipher.type === _enums_cipherType__WEBPACK_IMPORTED_MODULE_0__["CipherType"].Login) {
+ if (existingCipher.login.password != null && existingCipher.login.password !== '' &&
+ existingCipher.login.password !== model.login.password) {
+ const ph = new _models_view_passwordHistoryView__WEBPACK_IMPORTED_MODULE_22__["PasswordHistoryView"]();
+ ph.password = existingCipher.login.password;
+ ph.lastUsedDate = model.login.passwordRevisionDate = new Date();
+ model.passwordHistory.splice(0, 0, ph);
+ }
+ else {
+ model.login.passwordRevisionDate = existingCipher.login.passwordRevisionDate;
+ }
+ }
+ if (existingCipher.hasFields) {
+ const existingHiddenFields = existingCipher.fields.filter(f => f.type === _enums_fieldType__WEBPACK_IMPORTED_MODULE_1__["FieldType"].Hidden &&
+ f.name != null && f.name !== '' && f.value != null && f.value !== '');
+ const hiddenFields = model.fields == null ? [] :
+ model.fields.filter(f => f.type === _enums_fieldType__WEBPACK_IMPORTED_MODULE_1__["FieldType"].Hidden && f.name != null && f.name !== '');
+ existingHiddenFields.forEach(ef => {
+ const matchedField = hiddenFields.find(f => f.name === ef.name);
+ if (matchedField == null || matchedField.value !== ef.value) {
+ const ph = new _models_view_passwordHistoryView__WEBPACK_IMPORTED_MODULE_22__["PasswordHistoryView"]();
+ ph.password = ef.name + ': ' + ef.value;
+ ph.lastUsedDate = new Date();
+ model.passwordHistory.splice(0, 0, ph);
+ }
+ });
+ }
+ }
+ if (model.passwordHistory != null && model.passwordHistory.length === 0) {
+ model.passwordHistory = null;
+ }
+ else if (model.passwordHistory != null && model.passwordHistory.length > 5) {
+ // only save last 5 history
+ model.passwordHistory = model.passwordHistory.slice(0, 5);
+ }
+ }
+ const cipher = new _models_domain_cipher__WEBPACK_IMPORTED_MODULE_6__["Cipher"]();
+ cipher.id = model.id;
+ cipher.folderId = model.folderId;
+ cipher.favorite = model.favorite;
+ cipher.organizationId = model.organizationId;
+ cipher.type = model.type;
+ cipher.collectionIds = model.collectionIds;
+ cipher.revisionDate = model.revisionDate;
+ cipher.reprompt = model.reprompt;
+ if (key == null && cipher.organizationId != null) {
+ key = yield this.cryptoService.getOrgKey(cipher.organizationId);
+ if (key == null) {
+ throw new Error('Cannot encrypt cipher for organization. No key.');
+ }
+ }
+ yield Promise.all([
+ this.encryptObjProperty(model, cipher, {
+ name: null,
+ notes: null,
+ }, key),
+ this.encryptCipherData(cipher, model, key),
+ this.encryptFields(model.fields, key).then(fields => {
+ cipher.fields = fields;
+ }),
+ this.encryptPasswordHistories(model.passwordHistory, key).then(ph => {
+ cipher.passwordHistory = ph;
+ }),
+ this.encryptAttachments(model.attachments, key).then(attachments => {
+ cipher.attachments = attachments;
+ }),
+ ]);
+ return cipher;
+ });
+ }
+ encryptAttachments(attachmentsModel, key) {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (attachmentsModel == null || attachmentsModel.length === 0) {
+ return null;
+ }
+ const promises = [];
+ const encAttachments = [];
+ attachmentsModel.forEach((model) => __awaiter(this, void 0, void 0, function* () {
+ const attachment = new _models_domain_attachment__WEBPACK_IMPORTED_MODULE_4__["Attachment"]();
+ attachment.id = model.id;
+ attachment.size = model.size;
+ attachment.sizeName = model.sizeName;
+ attachment.url = model.url;
+ const promise = this.encryptObjProperty(model, attachment, {
+ fileName: null,
+ }, key).then(() => __awaiter(this, void 0, void 0, function* () {
+ if (model.key != null) {
+ attachment.key = yield this.cryptoService.encrypt(model.key.key, key);
+ }
+ encAttachments.push(attachment);
+ }));
+ promises.push(promise);
+ }));
+ yield Promise.all(promises);
+ return encAttachments;
+ });
+ }
+ encryptFields(fieldsModel, key) {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (!fieldsModel || !fieldsModel.length) {
+ return null;
+ }
+ const self = this;
+ const encFields = [];
+ yield fieldsModel.reduce((promise, field) => {
+ return promise.then(() => {
+ return self.encryptField(field, key);
+ }).then((encField) => {
+ encFields.push(encField);
+ });
+ }, Promise.resolve());
+ return encFields;
+ });
+ }
+ encryptField(fieldModel, key) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const field = new _models_domain_field__WEBPACK_IMPORTED_MODULE_7__["Field"]();
+ field.type = fieldModel.type;
+ field.linkedId = fieldModel.linkedId;
+ // normalize boolean type field values
+ if (fieldModel.type === _enums_fieldType__WEBPACK_IMPORTED_MODULE_1__["FieldType"].Boolean && fieldModel.value !== 'true') {
+ fieldModel.value = 'false';
+ }
+ yield this.encryptObjProperty(fieldModel, field, {
+ name: null,
+ value: null,
+ }, key);
+ return field;
+ });
+ }
+ encryptPasswordHistories(phModels, key) {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (!phModels || !phModels.length) {
+ return null;
+ }
+ const self = this;
+ const encPhs = [];
+ yield phModels.reduce((promise, ph) => {
+ return promise.then(() => {
+ return self.encryptPasswordHistory(ph, key);
+ }).then((encPh) => {
+ encPhs.push(encPh);
+ });
+ }, Promise.resolve());
+ return encPhs;
+ });
+ }
+ encryptPasswordHistory(phModel, key) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const ph = new _models_domain_password__WEBPACK_IMPORTED_MODULE_11__["Password"]();
+ ph.lastUsedDate = phModel.lastUsedDate;
+ yield this.encryptObjProperty(phModel, ph, {
+ password: null,
+ }, key);
+ return ph;
+ });
+ }
+ get(id) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const userId = yield this.userService.getUserId();
+ const localData = yield this.storageService.get(Keys.localData);
+ const ciphers = yield this.storageService.get(Keys.ciphersPrefix + userId);
+ if (ciphers == null || !ciphers.hasOwnProperty(id)) {
+ return null;
+ }
+ return new _models_domain_cipher__WEBPACK_IMPORTED_MODULE_6__["Cipher"](ciphers[id], false, localData ? localData[id] : null);
+ });
+ }
+ getAll() {
+ return __awaiter(this, void 0, void 0, function* () {
+ const userId = yield this.userService.getUserId();
+ const localData = yield this.storageService.get(Keys.localData);
+ const ciphers = yield this.storageService.get(Keys.ciphersPrefix + userId);
+ const response = [];
+ for (const id in ciphers) {
+ if (ciphers.hasOwnProperty(id)) {
+ response.push(new _models_domain_cipher__WEBPACK_IMPORTED_MODULE_6__["Cipher"](ciphers[id], false, localData ? localData[id] : null));
+ }
+ }
+ return response;
+ });
+ }
+ getAllDecrypted() {
+ var _a;
+ return __awaiter(this, void 0, void 0, function* () {
+ if (this.decryptedCipherCache != null) {
+ const userId = yield this.userService.getUserId();
+ if (this.searchService != null && ((_a = this.searchService().indexedEntityId) !== null && _a !== void 0 ? _a : userId) !== userId) {
+ yield this.searchService().indexCiphers(userId, this.decryptedCipherCache);
+ }
+ return this.decryptedCipherCache;
+ }
+ const decCiphers = [];
+ const hasKey = yield this.cryptoService.hasKey();
+ if (!hasKey) {
+ throw new Error('No key.');
+ }
+ const promises = [];
+ const ciphers = yield this.getAll();
+ ciphers.forEach(cipher => {
+ promises.push(cipher.decrypt().then(c => decCiphers.push(c)));
+ });
+ yield Promise.all(promises);
+ decCiphers.sort(this.getLocaleSortingFunction());
+ this.decryptedCipherCache = decCiphers;
+ return this.decryptedCipherCache;
+ });
+ }
+ getAllDecryptedForGrouping(groupingId, folder = true) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const ciphers = yield this.getAllDecrypted();
+ return ciphers.filter(cipher => {
+ if (cipher.isDeleted) {
+ return false;
+ }
+ if (folder && cipher.folderId === groupingId) {
+ return true;
+ }
+ else if (!folder && cipher.collectionIds != null && cipher.collectionIds.indexOf(groupingId) > -1) {
+ return true;
+ }
+ return false;
+ });
+ });
+ }
+ getAllDecryptedForUrl(url, includeOtherTypes, defaultMatch = null) {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (url == null && includeOtherTypes == null) {
+ return Promise.resolve([]);
+ }
+ const domain = _misc_utils__WEBPACK_IMPORTED_MODULE_26__["Utils"].getDomain(url);
+ const eqDomainsPromise = domain == null ? Promise.resolve([]) :
+ this.settingsService.getEquivalentDomains().then((eqDomains) => {
+ let matches = [];
+ eqDomains.forEach(eqDomain => {
+ if (eqDomain.length && eqDomain.indexOf(domain) >= 0) {
+ matches = matches.concat(eqDomain);
+ }
+ });
+ if (!matches.length) {
+ matches.push(domain);
+ }
+ return matches;
+ });
+ const result = yield Promise.all([eqDomainsPromise, this.getAllDecrypted()]);
+ const matchingDomains = result[0];
+ const ciphers = result[1];
+ if (defaultMatch == null) {
+ defaultMatch = yield this.storageService.get(_constants_service__WEBPACK_IMPORTED_MODULE_24__["ConstantsService"].defaultUriMatch);
+ if (defaultMatch == null) {
+ defaultMatch = _enums_uriMatchType__WEBPACK_IMPORTED_MODULE_2__["UriMatchType"].Domain;
+ }
+ }
+ return ciphers.filter(cipher => {
+ if (cipher.deletedDate != null) {
+ return false;
+ }
+ if (includeOtherTypes != null && includeOtherTypes.indexOf(cipher.type) > -1) {
+ return true;
+ }
+ if (url != null && cipher.type === _enums_cipherType__WEBPACK_IMPORTED_MODULE_0__["CipherType"].Login && cipher.login.uris != null) {
+ for (let i = 0; i < cipher.login.uris.length; i++) {
+ const u = cipher.login.uris[i];
+ if (u.uri == null) {
+ continue;
+ }
+ const match = u.match == null ? defaultMatch : u.match;
+ switch (match) {
+ case _enums_uriMatchType__WEBPACK_IMPORTED_MODULE_2__["UriMatchType"].Domain:
+ if (domain != null && u.domain != null && matchingDomains.indexOf(u.domain) > -1) {
+ if (DomainMatchBlacklist.has(u.domain)) {
+ const domainUrlHost = _misc_utils__WEBPACK_IMPORTED_MODULE_26__["Utils"].getHost(url);
+ if (!DomainMatchBlacklist.get(u.domain).has(domainUrlHost)) {
+ return true;
+ }
+ }
+ else {
+ return true;
+ }
+ }
+ break;
+ case _enums_uriMatchType__WEBPACK_IMPORTED_MODULE_2__["UriMatchType"].Host:
+ const urlHost = _misc_utils__WEBPACK_IMPORTED_MODULE_26__["Utils"].getHost(url);
+ if (urlHost != null && urlHost === _misc_utils__WEBPACK_IMPORTED_MODULE_26__["Utils"].getHost(u.uri)) {
+ return true;
+ }
+ break;
+ case _enums_uriMatchType__WEBPACK_IMPORTED_MODULE_2__["UriMatchType"].Exact:
+ if (url === u.uri) {
+ return true;
+ }
+ break;
+ case _enums_uriMatchType__WEBPACK_IMPORTED_MODULE_2__["UriMatchType"].StartsWith:
+ if (url.startsWith(u.uri)) {
+ return true;
+ }
+ break;
+ case _enums_uriMatchType__WEBPACK_IMPORTED_MODULE_2__["UriMatchType"].RegularExpression:
+ try {
+ const regex = new RegExp(u.uri, 'i');
+ if (regex.test(url)) {
+ return true;
+ }
+ }
+ catch (e) {
+ this.logService.error(e);
+ }
+ break;
+ case _enums_uriMatchType__WEBPACK_IMPORTED_MODULE_2__["UriMatchType"].Never:
+ default:
+ break;
+ }
+ }
+ }
+ return false;
+ });
+ });
+ }
+ getAllFromApiForOrganization(organizationId) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const ciphers = yield this.apiService.getCiphersOrganization(organizationId);
+ if (ciphers != null && ciphers.data != null && ciphers.data.length) {
+ const decCiphers = [];
+ const promises = [];
+ ciphers.data.forEach(r => {
+ const data = new _models_data_cipherData__WEBPACK_IMPORTED_MODULE_3__["CipherData"](r);
+ const cipher = new _models_domain_cipher__WEBPACK_IMPORTED_MODULE_6__["Cipher"](data);
+ promises.push(cipher.decrypt().then(c => decCiphers.push(c)));
+ });
+ yield Promise.all(promises);
+ decCiphers.sort(this.getLocaleSortingFunction());
+ return decCiphers;
+ }
+ else {
+ return [];
+ }
+ });
+ }
+ getLastUsedForUrl(url, autofillOnPageLoad = false) {
+ return __awaiter(this, void 0, void 0, function* () {
+ return this.getCipherForUrl(url, true, false, autofillOnPageLoad);
+ });
+ }
+ getLastLaunchedForUrl(url, autofillOnPageLoad = false) {
+ return __awaiter(this, void 0, void 0, function* () {
+ return this.getCipherForUrl(url, false, true, autofillOnPageLoad);
+ });
+ }
+ getNextCipherForUrl(url) {
+ return __awaiter(this, void 0, void 0, function* () {
+ return this.getCipherForUrl(url, false, false, false);
+ });
+ }
+ updateLastUsedIndexForUrl(url) {
+ this.sortedCiphersCache.updateLastUsedIndex(url);
+ }
+ updateLastUsedDate(id) {
+ return __awaiter(this, void 0, void 0, function* () {
+ let ciphersLocalData = yield this.storageService.get(Keys.localData);
+ if (!ciphersLocalData) {
+ ciphersLocalData = {};
+ }
+ if (ciphersLocalData[id]) {
+ ciphersLocalData[id].lastUsedDate = new Date().getTime();
+ }
+ else {
+ ciphersLocalData[id] = {
+ lastUsedDate: new Date().getTime(),
+ };
+ }
+ yield this.storageService.save(Keys.localData, ciphersLocalData);
+ if (this.decryptedCipherCache == null) {
+ return;
+ }
+ for (let i = 0; i < this.decryptedCipherCache.length; i++) {
+ const cached = this.decryptedCipherCache[i];
+ if (cached.id === id) {
+ cached.localData = ciphersLocalData[id];
+ break;
+ }
+ }
+ });
+ }
+ updateLastLaunchedDate(id) {
+ return __awaiter(this, void 0, void 0, function* () {
+ let ciphersLocalData = yield this.storageService.get(Keys.localData);
+ if (!ciphersLocalData) {
+ ciphersLocalData = {};
+ }
+ if (ciphersLocalData[id]) {
+ ciphersLocalData[id].lastLaunched = new Date().getTime();
+ }
+ else {
+ ciphersLocalData[id] = {
+ lastUsedDate: new Date().getTime(),
+ };
+ }
+ yield this.storageService.save(Keys.localData, ciphersLocalData);
+ if (this.decryptedCipherCache == null) {
+ return;
+ }
+ for (let i = 0; i < this.decryptedCipherCache.length; i++) {
+ const cached = this.decryptedCipherCache[i];
+ if (cached.id === id) {
+ cached.localData = ciphersLocalData[id];
+ break;
+ }
+ }
+ });
+ }
+ saveNeverDomain(domain) {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (domain == null) {
+ return;
+ }
+ let domains = yield this.storageService.get(Keys.neverDomains);
+ if (!domains) {
+ domains = {};
+ }
+ domains[domain] = null;
+ yield this.storageService.save(Keys.neverDomains, domains);
+ });
+ }
+ saveWithServer(cipher) {
+ return __awaiter(this, void 0, void 0, function* () {
+ let response;
+ if (cipher.id == null) {
+ if (cipher.collectionIds != null) {
+ const request = new _models_request_cipherCreateRequest__WEBPACK_IMPORTED_MODULE_18__["CipherCreateRequest"](cipher);
+ response = yield this.apiService.postCipherCreate(request);
+ }
+ else {
+ const request = new _models_request_cipherRequest__WEBPACK_IMPORTED_MODULE_19__["CipherRequest"](cipher);
+ response = yield this.apiService.postCipher(request);
+ }
+ cipher.id = response.id;
+ }
+ else {
+ const request = new _models_request_cipherRequest__WEBPACK_IMPORTED_MODULE_19__["CipherRequest"](cipher);
+ response = yield this.apiService.putCipher(cipher.id, request);
+ }
+ const userId = yield this.userService.getUserId();
+ const data = new _models_data_cipherData__WEBPACK_IMPORTED_MODULE_3__["CipherData"](response, userId, cipher.collectionIds);
+ yield this.upsert(data);
+ });
+ }
+ shareWithServer(cipher, organizationId, collectionIds) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const attachmentPromises = [];
+ if (cipher.attachments != null) {
+ cipher.attachments.forEach(attachment => {
+ if (attachment.key == null) {
+ attachmentPromises.push(this.shareAttachmentWithServer(attachment, cipher.id, organizationId));
+ }
+ });
+ }
+ yield Promise.all(attachmentPromises);
+ cipher.organizationId = organizationId;
+ cipher.collectionIds = collectionIds;
+ const encCipher = yield this.encrypt(cipher);
+ const request = new _models_request_cipherShareRequest__WEBPACK_IMPORTED_MODULE_20__["CipherShareRequest"](encCipher);
+ const response = yield this.apiService.putShareCipher(cipher.id, request);
+ const userId = yield this.userService.getUserId();
+ const data = new _models_data_cipherData__WEBPACK_IMPORTED_MODULE_3__["CipherData"](response, userId, collectionIds);
+ yield this.upsert(data);
+ });
+ }
+ shareManyWithServer(ciphers, organizationId, collectionIds) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const promises = [];
+ const encCiphers = [];
+ for (const cipher of ciphers) {
+ cipher.organizationId = organizationId;
+ cipher.collectionIds = collectionIds;
+ promises.push(this.encrypt(cipher).then(c => {
+ encCiphers.push(c);
+ }));
+ }
+ yield Promise.all(promises);
+ const request = new _models_request_cipherBulkShareRequest__WEBPACK_IMPORTED_MODULE_16__["CipherBulkShareRequest"](encCiphers, collectionIds);
+ yield this.apiService.putShareCiphers(request);
+ const userId = yield this.userService.getUserId();
+ yield this.upsert(encCiphers.map(c => c.toCipherData(userId)));
+ });
+ }
+ saveAttachmentWithServer(cipher, unencryptedFile, admin = false) {
+ return new Promise((resolve, reject) => {
+ const reader = new FileReader();
+ reader.readAsArrayBuffer(unencryptedFile);
+ reader.onload = (evt) => __awaiter(this, void 0, void 0, function* () {
+ try {
+ const cData = yield this.saveAttachmentRawWithServer(cipher, unencryptedFile.name, evt.target.result, admin);
+ resolve(cData);
+ }
+ catch (e) {
+ reject(e);
+ }
+ });
+ reader.onerror = evt => {
+ reject('Error reading file.');
+ };
+ });
+ }
+ saveAttachmentRawWithServer(cipher, filename, data, admin = false) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const key = yield this.cryptoService.getOrgKey(cipher.organizationId);
+ const encFileName = yield this.cryptoService.encrypt(filename, key);
+ const dataEncKey = yield this.cryptoService.makeEncKey(key);
+ const encData = yield this.cryptoService.encryptToBytes(data, dataEncKey[0]);
+ const request = {
+ key: dataEncKey[1].encryptedString,
+ fileName: encFileName.encryptedString,
+ fileSize: encData.buffer.byteLength,
+ adminRequest: admin,
+ };
+ let response;
+ try {
+ const uploadDataResponse = yield this.apiService.postCipherAttachment(cipher.id, request);
+ response = admin ? uploadDataResponse.cipherMiniResponse : uploadDataResponse.cipherResponse;
+ yield this.fileUploadService.uploadCipherAttachment(admin, uploadDataResponse, encFileName, encData);
+ }
+ catch (e) {
+ if (e instanceof _models_response_errorResponse__WEBPACK_IMPORTED_MODULE_21__["ErrorResponse"] && e.statusCode === 404 || e.statusCode === 405) {
+ response = yield this.legacyServerAttachmentFileUpload(admin, cipher.id, encFileName, encData, dataEncKey[1]);
+ }
+ else if (e instanceof _models_response_errorResponse__WEBPACK_IMPORTED_MODULE_21__["ErrorResponse"]) {
+ throw new Error(e.getSingleMessage());
+ }
+ else {
+ throw e;
+ }
+ }
+ const userId = yield this.userService.getUserId();
+ const cData = new _models_data_cipherData__WEBPACK_IMPORTED_MODULE_3__["CipherData"](response, userId, cipher.collectionIds);
+ if (!admin) {
+ yield this.upsert(cData);
+ }
+ return new _models_domain_cipher__WEBPACK_IMPORTED_MODULE_6__["Cipher"](cData);
+ });
+ }
+ /**
+ * @deprecated Mar 25 2021: This method has been deprecated in favor of direct uploads.
+ * This method still exists for backward compatibility with old server versions.
+ */
+ legacyServerAttachmentFileUpload(admin, cipherId, encFileName, encData, key) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const fd = new FormData();
+ try {
+ const blob = new Blob([encData.buffer], { type: 'application/octet-stream' });
+ fd.append('key', key.encryptedString);
+ fd.append('data', blob, encFileName.encryptedString);
+ }
+ catch (e) {
+ if (_misc_utils__WEBPACK_IMPORTED_MODULE_26__["Utils"].isNode && !_misc_utils__WEBPACK_IMPORTED_MODULE_26__["Utils"].isBrowser) {
+ fd.append('key', key.encryptedString);
+ fd.append('data', Buffer.from(encData.buffer), {
+ filepath: encFileName.encryptedString,
+ contentType: 'application/octet-stream',
+ });
+ }
+ else {
+ throw e;
+ }
+ }
+ let response;
+ try {
+ if (admin) {
+ response = yield this.apiService.postCipherAttachmentAdminLegacy(cipherId, fd);
+ }
+ else {
+ response = yield this.apiService.postCipherAttachmentLegacy(cipherId, fd);
+ }
+ }
+ catch (e) {
+ throw new Error(e.getSingleMessage());
+ }
+ return response;
+ });
+ }
+ saveCollectionsWithServer(cipher) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const request = new _models_request_cipherCollectionsRequest__WEBPACK_IMPORTED_MODULE_17__["CipherCollectionsRequest"](cipher.collectionIds);
+ yield this.apiService.putCipherCollections(cipher.id, request);
+ const userId = yield this.userService.getUserId();
+ const data = cipher.toCipherData(userId);
+ yield this.upsert(data);
+ });
+ }
+ upsert(cipher) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const userId = yield this.userService.getUserId();
+ let ciphers = yield this.storageService.get(Keys.ciphersPrefix + userId);
+ if (ciphers == null) {
+ ciphers = {};
+ }
+ if (cipher instanceof _models_data_cipherData__WEBPACK_IMPORTED_MODULE_3__["CipherData"]) {
+ const c = cipher;
+ ciphers[c.id] = c;
+ }
+ else {
+ cipher.forEach(c => {
+ ciphers[c.id] = c;
+ });
+ }
+ yield this.storageService.save(Keys.ciphersPrefix + userId, ciphers);
+ this.decryptedCipherCache = null;
+ });
+ }
+ replace(ciphers) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const userId = yield this.userService.getUserId();
+ yield this.storageService.save(Keys.ciphersPrefix + userId, ciphers);
+ this.decryptedCipherCache = null;
+ });
+ }
+ clear(userId) {
+ return __awaiter(this, void 0, void 0, function* () {
+ yield this.storageService.remove(Keys.ciphersPrefix + userId);
+ this.clearCache();
+ });
+ }
+ moveManyWithServer(ids, folderId) {
+ return __awaiter(this, void 0, void 0, function* () {
+ yield this.apiService.putMoveCiphers(new _models_request_cipherBulkMoveRequest__WEBPACK_IMPORTED_MODULE_14__["CipherBulkMoveRequest"](ids, folderId));
+ const userId = yield this.userService.getUserId();
+ let ciphers = yield this.storageService.get(Keys.ciphersPrefix + userId);
+ if (ciphers == null) {
+ ciphers = {};
+ }
+ ids.forEach(id => {
+ if (ciphers.hasOwnProperty(id)) {
+ ciphers[id].folderId = folderId;
+ }
+ });
+ yield this.storageService.save(Keys.ciphersPrefix + userId, ciphers);
+ this.decryptedCipherCache = null;
+ });
+ }
+ delete(id) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const userId = yield this.userService.getUserId();
+ const ciphers = yield this.storageService.get(Keys.ciphersPrefix + userId);
+ if (ciphers == null) {
+ return;
+ }
+ if (typeof id === 'string') {
+ if (ciphers[id] == null) {
+ return;
+ }
+ delete ciphers[id];
+ }
+ else {
+ id.forEach(i => {
+ delete ciphers[i];
+ });
+ }
+ yield this.storageService.save(Keys.ciphersPrefix + userId, ciphers);
+ this.decryptedCipherCache = null;
+ });
+ }
+ deleteWithServer(id) {
+ return __awaiter(this, void 0, void 0, function* () {
+ yield this.apiService.deleteCipher(id);
+ yield this.delete(id);
+ });
+ }
+ deleteManyWithServer(ids) {
+ return __awaiter(this, void 0, void 0, function* () {
+ yield this.apiService.deleteManyCiphers(new _models_request_cipherBulkDeleteRequest__WEBPACK_IMPORTED_MODULE_13__["CipherBulkDeleteRequest"](ids));
+ yield this.delete(ids);
+ });
+ }
+ deleteAttachment(id, attachmentId) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const userId = yield this.userService.getUserId();
+ const ciphers = yield this.storageService.get(Keys.ciphersPrefix + userId);
+ if (ciphers == null || !ciphers.hasOwnProperty(id) || ciphers[id].attachments == null) {
+ return;
+ }
+ for (let i = 0; i < ciphers[id].attachments.length; i++) {
+ if (ciphers[id].attachments[i].id === attachmentId) {
+ ciphers[id].attachments.splice(i, 1);
+ }
+ }
+ yield this.storageService.save(Keys.ciphersPrefix + userId, ciphers);
+ this.decryptedCipherCache = null;
+ });
+ }
+ deleteAttachmentWithServer(id, attachmentId) {
+ return __awaiter(this, void 0, void 0, function* () {
+ try {
+ yield this.apiService.deleteCipherAttachment(id, attachmentId);
+ }
+ catch (e) {
+ return Promise.reject(e.getSingleMessage());
+ }
+ yield this.deleteAttachment(id, attachmentId);
+ });
+ }
+ sortCiphersByLastUsed(a, b) {
+ const aLastUsed = a.localData && a.localData.lastUsedDate ? a.localData.lastUsedDate : null;
+ const bLastUsed = b.localData && b.localData.lastUsedDate ? b.localData.lastUsedDate : null;
+ const bothNotNull = aLastUsed != null && bLastUsed != null;
+ if (bothNotNull && aLastUsed < bLastUsed) {
+ return 1;
+ }
+ if (aLastUsed != null && bLastUsed == null) {
+ return -1;
+ }
+ if (bothNotNull && aLastUsed > bLastUsed) {
+ return -1;
+ }
+ if (bLastUsed != null && aLastUsed == null) {
+ return 1;
+ }
+ return 0;
+ }
+ sortCiphersByLastUsedThenName(a, b) {
+ const result = this.sortCiphersByLastUsed(a, b);
+ if (result !== 0) {
+ return result;
+ }
+ return this.getLocaleSortingFunction()(a, b);
+ }
+ getLocaleSortingFunction() {
+ return (a, b) => {
+ let aName = a.name;
+ let bName = b.name;
+ if (aName == null && bName != null) {
+ return -1;
+ }
+ if (aName != null && bName == null) {
+ return 1;
+ }
+ if (aName == null && bName == null) {
+ return 0;
+ }
+ const result = this.i18nService.collator ? this.i18nService.collator.compare(aName, bName) :
+ aName.localeCompare(bName);
+ if (result !== 0 || a.type !== _enums_cipherType__WEBPACK_IMPORTED_MODULE_0__["CipherType"].Login || b.type !== _enums_cipherType__WEBPACK_IMPORTED_MODULE_0__["CipherType"].Login) {
+ return result;
+ }
+ if (a.login.username != null) {
+ aName += a.login.username;
+ }
+ if (b.login.username != null) {
+ bName += b.login.username;
+ }
+ return this.i18nService.collator ? this.i18nService.collator.compare(aName, bName) :
+ aName.localeCompare(bName);
+ };
+ }
+ softDelete(id) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const userId = yield this.userService.getUserId();
+ const ciphers = yield this.storageService.get(Keys.ciphersPrefix + userId);
+ if (ciphers == null) {
+ return;
+ }
+ const setDeletedDate = (cipherId) => {
+ if (ciphers[cipherId] == null) {
+ return;
+ }
+ ciphers[cipherId].deletedDate = new Date().toISOString();
+ };
+ if (typeof id === 'string') {
+ setDeletedDate(id);
+ }
+ else {
+ id.forEach(setDeletedDate);
+ }
+ yield this.storageService.save(Keys.ciphersPrefix + userId, ciphers);
+ this.decryptedCipherCache = null;
+ });
+ }
+ softDeleteWithServer(id) {
+ return __awaiter(this, void 0, void 0, function* () {
+ yield this.apiService.putDeleteCipher(id);
+ yield this.softDelete(id);
+ });
+ }
+ softDeleteManyWithServer(ids) {
+ return __awaiter(this, void 0, void 0, function* () {
+ yield this.apiService.putDeleteManyCiphers(new _models_request_cipherBulkDeleteRequest__WEBPACK_IMPORTED_MODULE_13__["CipherBulkDeleteRequest"](ids));
+ yield this.softDelete(ids);
+ });
+ }
+ restore(cipher) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const userId = yield this.userService.getUserId();
+ const ciphers = yield this.storageService.get(Keys.ciphersPrefix + userId);
+ if (ciphers == null) {
+ return;
+ }
+ const clearDeletedDate = (c) => {
+ if (ciphers[c.id] == null) {
+ return;
+ }
+ ciphers[c.id].deletedDate = null;
+ ciphers[c.id].revisionDate = c.revisionDate;
+ };
+ if (cipher.constructor.name === 'Array') {
+ cipher.forEach(clearDeletedDate);
+ }
+ else {
+ clearDeletedDate(cipher);
+ }
+ yield this.storageService.save(Keys.ciphersPrefix + userId, ciphers);
+ this.decryptedCipherCache = null;
+ });
+ }
+ restoreWithServer(id) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const response = yield this.apiService.putRestoreCipher(id);
+ yield this.restore({ id: id, revisionDate: response.revisionDate });
+ });
+ }
+ restoreManyWithServer(ids) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const response = yield this.apiService.putRestoreManyCiphers(new _models_request_cipherBulkRestoreRequest__WEBPACK_IMPORTED_MODULE_15__["CipherBulkRestoreRequest"](ids));
+ const restores = [];
+ for (const cipher of response.data) {
+ restores.push({ id: cipher.id, revisionDate: cipher.revisionDate });
+ }
+ yield this.restore(restores);
+ });
+ }
+ // Helpers
+ shareAttachmentWithServer(attachmentView, cipherId, organizationId) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const attachmentResponse = yield this.apiService.nativeFetch(new Request(attachmentView.url, { cache: 'no-store' }));
+ if (attachmentResponse.status !== 200) {
+ throw Error('Failed to download attachment: ' + attachmentResponse.status.toString());
+ }
+ const buf = yield attachmentResponse.arrayBuffer();
+ const decBuf = yield this.cryptoService.decryptFromBytes(buf, null);
+ const key = yield this.cryptoService.getOrgKey(organizationId);
+ const encFileName = yield this.cryptoService.encrypt(attachmentView.fileName, key);
+ const dataEncKey = yield this.cryptoService.makeEncKey(key);
+ const encData = yield this.cryptoService.encryptToBytes(decBuf, dataEncKey[0]);
+ const fd = new FormData();
+ try {
+ const blob = new Blob([encData.buffer], { type: 'application/octet-stream' });
+ fd.append('key', dataEncKey[1].encryptedString);
+ fd.append('data', blob, encFileName.encryptedString);
+ }
+ catch (e) {
+ if (_misc_utils__WEBPACK_IMPORTED_MODULE_26__["Utils"].isNode && !_misc_utils__WEBPACK_IMPORTED_MODULE_26__["Utils"].isBrowser) {
+ fd.append('key', dataEncKey[1].encryptedString);
+ fd.append('data', Buffer.from(encData.buffer), {
+ filepath: encFileName.encryptedString,
+ contentType: 'application/octet-stream',
+ });
+ }
+ else {
+ throw e;
+ }
+ }
+ try {
+ yield this.apiService.postShareCipherAttachment(cipherId, attachmentView.id, fd, organizationId);
+ }
+ catch (e) {
+ throw new Error(e.getSingleMessage());
+ }
+ });
+ }
+ encryptObjProperty(model, obj, map, key) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const promises = [];
+ const self = this;
+ for (const prop in map) {
+ if (!map.hasOwnProperty(prop)) {
+ continue;
+ }
+ // tslint:disable-next-line
+ (function (theProp, theObj) {
+ const p = Promise.resolve().then(() => {
+ const modelProp = model[(map[theProp] || theProp)];
+ if (modelProp && modelProp !== '') {
+ return self.cryptoService.encrypt(modelProp, key);
+ }
+ return null;
+ }).then((val) => {
+ theObj[theProp] = val;
+ });
+ promises.push(p);
+ })(prop, obj);
+ }
+ yield Promise.all(promises);
+ });
+ }
+ encryptCipherData(cipher, model, key) {
+ return __awaiter(this, void 0, void 0, function* () {
+ switch (cipher.type) {
+ case _enums_cipherType__WEBPACK_IMPORTED_MODULE_0__["CipherType"].Login:
+ cipher.login = new _models_domain_login__WEBPACK_IMPORTED_MODULE_9__["Login"]();
+ cipher.login.passwordRevisionDate = model.login.passwordRevisionDate;
+ cipher.login.autofillOnPageLoad = model.login.autofillOnPageLoad;
+ yield this.encryptObjProperty(model.login, cipher.login, {
+ username: null,
+ password: null,
+ totp: null,
+ }, key);
+ if (model.login.uris != null) {
+ cipher.login.uris = [];
+ for (let i = 0; i < model.login.uris.length; i++) {
+ const loginUri = new _models_domain_loginUri__WEBPACK_IMPORTED_MODULE_10__["LoginUri"]();
+ loginUri.match = model.login.uris[i].match;
+ yield this.encryptObjProperty(model.login.uris[i], loginUri, {
+ uri: null,
+ }, key);
+ cipher.login.uris.push(loginUri);
+ }
+ }
+ return;
+ case _enums_cipherType__WEBPACK_IMPORTED_MODULE_0__["CipherType"].SecureNote:
+ cipher.secureNote = new _models_domain_secureNote__WEBPACK_IMPORTED_MODULE_12__["SecureNote"]();
+ cipher.secureNote.type = model.secureNote.type;
+ return;
+ case _enums_cipherType__WEBPACK_IMPORTED_MODULE_0__["CipherType"].Card:
+ cipher.card = new _models_domain_card__WEBPACK_IMPORTED_MODULE_5__["Card"]();
+ yield this.encryptObjProperty(model.card, cipher.card, {
+ cardholderName: null,
+ brand: null,
+ number: null,
+ expMonth: null,
+ expYear: null,
+ code: null,
+ }, key);
+ return;
+ case _enums_cipherType__WEBPACK_IMPORTED_MODULE_0__["CipherType"].Identity:
+ cipher.identity = new _models_domain_identity__WEBPACK_IMPORTED_MODULE_8__["Identity"]();
+ yield this.encryptObjProperty(model.identity, cipher.identity, {
+ title: null,
+ firstName: null,
+ middleName: null,
+ lastName: null,
+ address1: null,
+ address2: null,
+ address3: null,
+ city: null,
+ state: null,
+ postalCode: null,
+ country: null,
+ company: null,
+ email: null,
+ phone: null,
+ ssn: null,
+ username: null,
+ passportNumber: null,
+ licenseNumber: null,
+ }, key);
+ return;
+ default:
+ throw new Error('Unknown cipher type.');
+ }
+ });
+ }
+ getCipherForUrl(url, lastUsed, lastLaunched, autofillOnPageLoad) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const cacheKey = autofillOnPageLoad ? 'autofillOnPageLoad-' + url : url;
+ if (!this.sortedCiphersCache.isCached(cacheKey)) {
+ let ciphers = yield this.getAllDecryptedForUrl(url);
+ if (!ciphers) {
+ return null;
+ }
+ if (autofillOnPageLoad) {
+ const autofillOnPageLoadDefault = yield this.storageService.get(_constants_service__WEBPACK_IMPORTED_MODULE_24__["ConstantsService"].autoFillOnPageLoadDefaultKey);
+ ciphers = ciphers.filter(cipher => cipher.login.autofillOnPageLoad ||
+ (cipher.login.autofillOnPageLoad == null && autofillOnPageLoadDefault !== false));
+ if (ciphers.length === 0) {
+ return null;
+ }
+ }
+ this.sortedCiphersCache.addCiphers(cacheKey, ciphers);
+ }
+ if (lastLaunched) {
+ return this.sortedCiphersCache.getLastLaunched(cacheKey);
+ }
+ else if (lastUsed) {
+ return this.sortedCiphersCache.getLastUsed(cacheKey);
+ }
+ else {
+ return this.sortedCiphersCache.getNext(cacheKey);
+ }
+ });
+ }
+}
+__decorate([
+ Object(_misc_sequentialize__WEBPACK_IMPORTED_MODULE_25__["sequentialize"])(() => 'getAllDecrypted'),
+ __metadata("design:type", Function),
+ __metadata("design:paramtypes", []),
+ __metadata("design:returntype", Promise)
+], CipherService.prototype, "getAllDecrypted", null);
+
+/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../../node_modules/buffer/index.js */ "./node_modules/buffer/index.js").Buffer))
+
+/***/ }),
+
+/***/ "./jslib/common/src/services/collection.service.ts":
+/*!*********************************************************!*\
+ !*** ./jslib/common/src/services/collection.service.ts ***!
+ \*********************************************************/
+/*! exports provided: CollectionService */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CollectionService", function() { return CollectionService; });
+/* harmony import */ var _models_data_collectionData__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../models/data/collectionData */ "./jslib/common/src/models/data/collectionData.ts");
+/* harmony import */ var _models_domain_collection__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../models/domain/collection */ "./jslib/common/src/models/domain/collection.ts");
+/* harmony import */ var _models_view_collectionView__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../models/view/collectionView */ "./jslib/common/src/models/view/collectionView.ts");
+/* harmony import */ var _misc_serviceUtils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../misc/serviceUtils */ "./jslib/common/src/misc/serviceUtils.ts");
+/* harmony import */ var _misc_utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../misc/utils */ "./jslib/common/src/misc/utils.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+
+
+
+const Keys = {
+ collectionsPrefix: 'collections_',
+};
+const NestingDelimiter = '/';
+class CollectionService {
+ constructor(cryptoService, userService, storageService, i18nService) {
+ this.cryptoService = cryptoService;
+ this.userService = userService;
+ this.storageService = storageService;
+ this.i18nService = i18nService;
+ }
+ clearCache() {
+ this.decryptedCollectionCache = null;
+ }
+ encrypt(model) {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (model.organizationId == null) {
+ throw new Error('Collection has no organization id.');
+ }
+ const key = yield this.cryptoService.getOrgKey(model.organizationId);
+ if (key == null) {
+ throw new Error('No key for this collection\'s organization.');
+ }
+ const collection = new _models_domain_collection__WEBPACK_IMPORTED_MODULE_1__["Collection"]();
+ collection.id = model.id;
+ collection.organizationId = model.organizationId;
+ collection.readOnly = model.readOnly;
+ collection.name = yield this.cryptoService.encrypt(model.name, key);
+ return collection;
+ });
+ }
+ decryptMany(collections) {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (collections == null) {
+ return [];
+ }
+ const decCollections = [];
+ const promises = [];
+ collections.forEach(collection => {
+ promises.push(collection.decrypt().then(c => decCollections.push(c)));
+ });
+ yield Promise.all(promises);
+ return decCollections.sort(_misc_utils__WEBPACK_IMPORTED_MODULE_4__["Utils"].getSortFunction(this.i18nService, 'name'));
+ });
+ }
+ get(id) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const userId = yield this.userService.getUserId();
+ const collections = yield this.storageService.get(Keys.collectionsPrefix + userId);
+ if (collections == null || !collections.hasOwnProperty(id)) {
+ return null;
+ }
+ return new _models_domain_collection__WEBPACK_IMPORTED_MODULE_1__["Collection"](collections[id]);
+ });
+ }
+ getAll() {
+ return __awaiter(this, void 0, void 0, function* () {
+ const userId = yield this.userService.getUserId();
+ const collections = yield this.storageService.get(Keys.collectionsPrefix + userId);
+ const response = [];
+ for (const id in collections) {
+ if (collections.hasOwnProperty(id)) {
+ response.push(new _models_domain_collection__WEBPACK_IMPORTED_MODULE_1__["Collection"](collections[id]));
+ }
+ }
+ return response;
+ });
+ }
+ getAllDecrypted() {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (this.decryptedCollectionCache != null) {
+ return this.decryptedCollectionCache;
+ }
+ const hasKey = yield this.cryptoService.hasKey();
+ if (!hasKey) {
+ throw new Error('No key.');
+ }
+ const collections = yield this.getAll();
+ this.decryptedCollectionCache = yield this.decryptMany(collections);
+ return this.decryptedCollectionCache;
+ });
+ }
+ getAllNested(collections = null) {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (collections == null) {
+ collections = yield this.getAllDecrypted();
+ }
+ const nodes = [];
+ collections.forEach(c => {
+ const collectionCopy = new _models_view_collectionView__WEBPACK_IMPORTED_MODULE_2__["CollectionView"]();
+ collectionCopy.id = c.id;
+ collectionCopy.organizationId = c.organizationId;
+ const parts = c.name != null ? c.name.replace(/^\/+|\/+$/g, '').split(NestingDelimiter) : [];
+ _misc_serviceUtils__WEBPACK_IMPORTED_MODULE_3__["ServiceUtils"].nestedTraverse(nodes, 0, parts, collectionCopy, null, NestingDelimiter);
+ });
+ return nodes;
+ });
+ }
+ getNested(id) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const collections = yield this.getAllNested();
+ return _misc_serviceUtils__WEBPACK_IMPORTED_MODULE_3__["ServiceUtils"].getTreeNodeObject(collections, id);
+ });
+ }
+ upsert(collection) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const userId = yield this.userService.getUserId();
+ let collections = yield this.storageService.get(Keys.collectionsPrefix + userId);
+ if (collections == null) {
+ collections = {};
+ }
+ if (collection instanceof _models_data_collectionData__WEBPACK_IMPORTED_MODULE_0__["CollectionData"]) {
+ const c = collection;
+ collections[c.id] = c;
+ }
+ else {
+ collection.forEach(c => {
+ collections[c.id] = c;
+ });
+ }
+ yield this.storageService.save(Keys.collectionsPrefix + userId, collections);
+ this.decryptedCollectionCache = null;
+ });
+ }
+ replace(collections) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const userId = yield this.userService.getUserId();
+ yield this.storageService.save(Keys.collectionsPrefix + userId, collections);
+ this.decryptedCollectionCache = null;
+ });
+ }
+ clear(userId) {
+ return __awaiter(this, void 0, void 0, function* () {
+ yield this.storageService.remove(Keys.collectionsPrefix + userId);
+ this.decryptedCollectionCache = null;
+ });
+ }
+ delete(id) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const userId = yield this.userService.getUserId();
+ const collections = yield this.storageService.get(Keys.collectionsPrefix + userId);
+ if (collections == null) {
+ return;
+ }
+ if (typeof id === 'string') {
+ const i = id;
+ delete collections[id];
+ }
+ else {
+ id.forEach(i => {
+ delete collections[i];
+ });
+ }
+ yield this.storageService.save(Keys.collectionsPrefix + userId, collections);
+ this.decryptedCollectionCache = null;
+ });
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/services/consoleLog.service.ts":
+/*!*********************************************************!*\
+ !*** ./jslib/common/src/services/consoleLog.service.ts ***!
+ \*********************************************************/
+/*! exports provided: ConsoleLogService */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ConsoleLogService", function() { return ConsoleLogService; });
+/* harmony import */ var _enums_logLevelType__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../enums/logLevelType */ "./jslib/common/src/enums/logLevelType.ts");
+/* harmony import */ var browser_hrtime__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! browser-hrtime */ "./node_modules/browser-hrtime/dist/hrtime.js");
+/* harmony import */ var browser_hrtime__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(browser_hrtime__WEBPACK_IMPORTED_MODULE_1__);
+
+
+class ConsoleLogService {
+ constructor(isDev, filter = null) {
+ this.isDev = isDev;
+ this.filter = filter;
+ this.timersMap = new Map();
+ }
+ debug(message) {
+ if (!this.isDev) {
+ return;
+ }
+ this.write(_enums_logLevelType__WEBPACK_IMPORTED_MODULE_0__["LogLevelType"].Debug, message);
+ }
+ info(message) {
+ this.write(_enums_logLevelType__WEBPACK_IMPORTED_MODULE_0__["LogLevelType"].Info, message);
+ }
+ warning(message) {
+ this.write(_enums_logLevelType__WEBPACK_IMPORTED_MODULE_0__["LogLevelType"].Warning, message);
+ }
+ error(message) {
+ this.write(_enums_logLevelType__WEBPACK_IMPORTED_MODULE_0__["LogLevelType"].Error, message);
+ }
+ write(level, message) {
+ if (this.filter != null && this.filter(level)) {
+ return;
+ }
+ switch (level) {
+ case _enums_logLevelType__WEBPACK_IMPORTED_MODULE_0__["LogLevelType"].Debug:
+ // tslint:disable-next-line
+ console.log(message);
+ break;
+ case _enums_logLevelType__WEBPACK_IMPORTED_MODULE_0__["LogLevelType"].Info:
+ // tslint:disable-next-line
+ console.log(message);
+ break;
+ case _enums_logLevelType__WEBPACK_IMPORTED_MODULE_0__["LogLevelType"].Warning:
+ // tslint:disable-next-line
+ console.warn(message);
+ break;
+ case _enums_logLevelType__WEBPACK_IMPORTED_MODULE_0__["LogLevelType"].Error:
+ // tslint:disable-next-line
+ console.error(message);
+ break;
+ default:
+ break;
+ }
+ }
+ time(label = 'default') {
+ if (!this.timersMap.has(label)) {
+ this.timersMap.set(label, browser_hrtime__WEBPACK_IMPORTED_MODULE_1__());
+ }
+ }
+ timeEnd(label = 'default') {
+ const elapsed = browser_hrtime__WEBPACK_IMPORTED_MODULE_1__(this.timersMap.get(label));
+ this.timersMap.delete(label);
+ this.write(_enums_logLevelType__WEBPACK_IMPORTED_MODULE_0__["LogLevelType"].Info, `${label}: ${elapsed[0] * 1000 + elapsed[1] / 10e6}ms`);
+ return elapsed;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/services/constants.service.ts":
+/*!********************************************************!*\
+ !*** ./jslib/common/src/services/constants.service.ts ***!
+ \********************************************************/
+/*! exports provided: ConstantsService */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ConstantsService", function() { return ConstantsService; });
+class ConstantsService {
+ constructor() {
+ this.environmentUrlsKey = ConstantsService.environmentUrlsKey;
+ this.disableGaKey = ConstantsService.disableGaKey;
+ this.disableAddLoginNotificationKey = ConstantsService.disableAddLoginNotificationKey;
+ this.disableContextMenuItemKey = ConstantsService.disableContextMenuItemKey;
+ this.disableFaviconKey = ConstantsService.disableFaviconKey;
+ this.disableBadgeCounterKey = ConstantsService.disableBadgeCounterKey;
+ this.disableAutoTotpCopyKey = ConstantsService.disableAutoTotpCopyKey;
+ this.disableAutoBiometricsPromptKey = ConstantsService.disableAutoBiometricsPromptKey;
+ this.enableAutoFillOnPageLoadKey = ConstantsService.enableAutoFillOnPageLoadKey;
+ this.autoFillOnPageLoadDefaultKey = ConstantsService.autoFillOnPageLoadDefaultKey;
+ this.vaultTimeoutKey = ConstantsService.vaultTimeoutKey;
+ this.vaultTimeoutActionKey = ConstantsService.vaultTimeoutActionKey;
+ this.lastActiveKey = ConstantsService.lastActiveKey;
+ this.neverDomainsKey = ConstantsService.neverDomainsKey;
+ this.installedVersionKey = ConstantsService.installedVersionKey;
+ this.localeKey = ConstantsService.localeKey;
+ this.themeKey = ConstantsService.themeKey;
+ this.collapsedGroupingsKey = ConstantsService.collapsedGroupingsKey;
+ this.autoConfirmFingerprints = ConstantsService.autoConfirmFingerprints;
+ this.dontShowCardsCurrentTab = ConstantsService.dontShowCardsCurrentTab;
+ this.dontShowIdentitiesCurrentTab = ConstantsService.dontShowIdentitiesCurrentTab;
+ this.defaultUriMatch = ConstantsService.defaultUriMatch;
+ this.pinProtectedKey = ConstantsService.pinProtectedKey;
+ this.protectedPin = ConstantsService.protectedPin;
+ this.clearClipboardKey = ConstantsService.clearClipboardKey;
+ this.eventCollectionKey = ConstantsService.eventCollectionKey;
+ this.ssoCodeVerifierKey = ConstantsService.ssoCodeVerifierKey;
+ this.ssoStateKey = ConstantsService.ssoStateKey;
+ this.biometricUnlockKey = ConstantsService.biometricUnlockKey;
+ this.biometricText = ConstantsService.biometricText;
+ this.biometricAwaitingAcceptance = ConstantsService.biometricAwaitingAcceptance;
+ this.biometricFingerprintValidated = ConstantsService.biometricFingerprintValidated;
+ }
+}
+ConstantsService.environmentUrlsKey = 'environmentUrls';
+ConstantsService.disableGaKey = 'disableGa';
+ConstantsService.disableAddLoginNotificationKey = 'disableAddLoginNotification';
+ConstantsService.disableChangedPasswordNotificationKey = 'disableChangedPasswordNotification';
+ConstantsService.disableContextMenuItemKey = 'disableContextMenuItem';
+ConstantsService.disableFaviconKey = 'disableFavicon';
+ConstantsService.disableBadgeCounterKey = 'disableBadgeCounter';
+ConstantsService.disableAutoTotpCopyKey = 'disableAutoTotpCopy';
+ConstantsService.disableAutoBiometricsPromptKey = 'noAutoPromptBiometrics';
+ConstantsService.enableAutoFillOnPageLoadKey = 'enableAutoFillOnPageLoad';
+ConstantsService.autoFillOnPageLoadDefaultKey = 'autoFillOnPageLoadDefault';
+ConstantsService.vaultTimeoutKey = 'lockOption';
+ConstantsService.vaultTimeoutActionKey = 'vaultTimeoutAction';
+ConstantsService.lastActiveKey = 'lastActive';
+ConstantsService.neverDomainsKey = 'neverDomains';
+ConstantsService.installedVersionKey = 'installedVersion';
+ConstantsService.localeKey = 'locale';
+ConstantsService.themeKey = 'theme';
+ConstantsService.collapsedGroupingsKey = 'collapsedGroupings';
+ConstantsService.autoConfirmFingerprints = 'autoConfirmFingerprints';
+ConstantsService.dontShowCardsCurrentTab = 'dontShowCardsCurrentTab';
+ConstantsService.dontShowIdentitiesCurrentTab = 'dontShowIdentitiesCurrentTab';
+ConstantsService.defaultUriMatch = 'defaultUriMatch';
+ConstantsService.pinProtectedKey = 'pinProtectedKey';
+ConstantsService.protectedPin = 'protectedPin';
+ConstantsService.clearClipboardKey = 'clearClipboardKey';
+ConstantsService.eventCollectionKey = 'eventCollection';
+ConstantsService.ssoCodeVerifierKey = 'ssoCodeVerifier';
+ConstantsService.ssoStateKey = 'ssoState';
+ConstantsService.biometricUnlockKey = 'biometric';
+ConstantsService.biometricText = 'biometricText';
+ConstantsService.biometricAwaitingAcceptance = 'biometricAwaitingAcceptance';
+ConstantsService.biometricFingerprintValidated = 'biometricFingerprintValidated';
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/services/container.service.ts":
+/*!********************************************************!*\
+ !*** ./jslib/common/src/services/container.service.ts ***!
+ \********************************************************/
+/*! exports provided: ContainerService */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ContainerService", function() { return ContainerService; });
+class ContainerService {
+ constructor(cryptoService) {
+ this.cryptoService = cryptoService;
+ }
+ // deprecated, use attachToGlobal instead
+ attachToWindow(win) {
+ this.attachToGlobal(win);
+ }
+ attachToGlobal(global) {
+ if (!global.bitwardenContainerService) {
+ global.bitwardenContainerService = this;
+ }
+ }
+ getCryptoService() {
+ return this.cryptoService;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/services/crypto.service.ts":
+/*!*****************************************************!*\
+ !*** ./jslib/common/src/services/crypto.service.ts ***!
+ \*****************************************************/
+/*! exports provided: Keys, CryptoService */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Keys", function() { return Keys; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CryptoService", function() { return CryptoService; });
+/* harmony import */ var big_integer__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! big-integer */ "./node_modules/big-integer/BigInteger.js");
+/* harmony import */ var big_integer__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(big_integer__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var _enums_encryptionType__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../enums/encryptionType */ "./jslib/common/src/enums/encryptionType.ts");
+/* harmony import */ var _enums_hashPurpose__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../enums/hashPurpose */ "./jslib/common/src/enums/hashPurpose.ts");
+/* harmony import */ var _enums_kdfType__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../enums/kdfType */ "./jslib/common/src/enums/kdfType.ts");
+/* harmony import */ var _models_domain_encArrayBuffer__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../models/domain/encArrayBuffer */ "./jslib/common/src/models/domain/encArrayBuffer.ts");
+/* harmony import */ var _models_domain_encryptedObject__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../models/domain/encryptedObject */ "./jslib/common/src/models/domain/encryptedObject.ts");
+/* harmony import */ var _models_domain_encString__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../models/domain/encString */ "./jslib/common/src/models/domain/encString.ts");
+/* harmony import */ var _models_domain_symmetricCryptoKey__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../models/domain/symmetricCryptoKey */ "./jslib/common/src/models/domain/symmetricCryptoKey.ts");
+/* harmony import */ var _constants_service__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./constants.service */ "./jslib/common/src/services/constants.service.ts");
+/* harmony import */ var _misc_sequentialize__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../misc/sequentialize */ "./jslib/common/src/misc/sequentialize.ts");
+/* harmony import */ var _misc_utils__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../misc/utils */ "./jslib/common/src/misc/utils.ts");
+/* harmony import */ var _misc_wordlist__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../misc/wordlist */ "./jslib/common/src/misc/wordlist.ts");
+var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
+ 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;
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
+};
+var __metadata = (undefined && undefined.__metadata) || function (k, v) {
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
+};
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+
+
+
+
+
+
+
+
+
+
+const Keys = {
+ key: 'key',
+ encOrgKeys: 'encOrgKeys',
+ encProviderKeys: 'encProviderKeys',
+ encPrivateKey: 'encPrivateKey',
+ encKey: 'encKey',
+ keyHash: 'keyHash',
+};
+class CryptoService {
+ constructor(storageService, secureStorageService, cryptoFunctionService, platformUtilService, logService) {
+ this.storageService = storageService;
+ this.secureStorageService = secureStorageService;
+ this.cryptoFunctionService = cryptoFunctionService;
+ this.platformUtilService = platformUtilService;
+ this.logService = logService;
+ }
+ setKey(key) {
+ return __awaiter(this, void 0, void 0, function* () {
+ this.key = key;
+ yield this.storeKey(key);
+ });
+ }
+ setKeyHash(keyHash) {
+ this.keyHash = keyHash;
+ return this.storageService.save(Keys.keyHash, keyHash);
+ }
+ setEncKey(encKey) {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (encKey == null) {
+ return;
+ }
+ yield this.storageService.save(Keys.encKey, encKey);
+ this.encKey = null;
+ });
+ }
+ setEncPrivateKey(encPrivateKey) {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (encPrivateKey == null) {
+ return;
+ }
+ yield this.storageService.save(Keys.encPrivateKey, encPrivateKey);
+ this.privateKey = null;
+ });
+ }
+ setOrgKeys(orgs, providerOrgs) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const orgKeys = {};
+ orgs.forEach(org => {
+ orgKeys[org.id] = org.key;
+ });
+ for (const providerOrg of providerOrgs) {
+ // Convert provider encrypted keys to user encrypted.
+ const providerKey = yield this.getProviderKey(providerOrg.providerId);
+ const decValue = yield this.decryptToBytes(new _models_domain_encString__WEBPACK_IMPORTED_MODULE_6__["EncString"](providerOrg.key), providerKey);
+ orgKeys[providerOrg.id] = yield (yield this.rsaEncrypt(decValue)).encryptedString;
+ }
+ this.orgKeys = null;
+ return this.storageService.save(Keys.encOrgKeys, orgKeys);
+ });
+ }
+ setProviderKeys(providers) {
+ const providerKeys = {};
+ providers.forEach(provider => {
+ providerKeys[provider.id] = provider.key;
+ });
+ this.providerKeys = null;
+ return this.storageService.save(Keys.encProviderKeys, providerKeys);
+ }
+ getKey(keySuffix) {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (this.key != null) {
+ return this.key;
+ }
+ keySuffix || (keySuffix = 'auto');
+ const symmetricKey = yield this.getKeyFromStorage(keySuffix);
+ if (symmetricKey != null) {
+ this.setKey(symmetricKey);
+ }
+ return symmetricKey;
+ });
+ }
+ getKeyFromStorage(keySuffix) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const key = yield this.retrieveKeyFromStorage(keySuffix);
+ if (key != null) {
+ const symmetricKey = new _models_domain_symmetricCryptoKey__WEBPACK_IMPORTED_MODULE_7__["SymmetricCryptoKey"](_misc_utils__WEBPACK_IMPORTED_MODULE_10__["Utils"].fromB64ToArray(key).buffer);
+ if (!(yield this.validateKey(symmetricKey))) {
+ this.logService.warning('Wrong key, throwing away stored key');
+ this.secureStorageService.remove(Keys.key, { keySuffix: keySuffix });
+ return null;
+ }
+ return symmetricKey;
+ }
+ return null;
+ });
+ }
+ getKeyHash() {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (this.keyHash != null) {
+ return this.keyHash;
+ }
+ const keyHash = yield this.storageService.get(Keys.keyHash);
+ if (keyHash != null) {
+ this.keyHash = keyHash;
+ }
+ return keyHash == null ? null : this.keyHash;
+ });
+ }
+ compareAndUpdateKeyHash(masterPassword, key) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const storedKeyHash = yield this.getKeyHash();
+ if (masterPassword != null && storedKeyHash != null) {
+ const localKeyHash = yield this.hashPassword(masterPassword, key, _enums_hashPurpose__WEBPACK_IMPORTED_MODULE_2__["HashPurpose"].LocalAuthorization);
+ if (localKeyHash != null && storedKeyHash === localKeyHash) {
+ return true;
+ }
+ // TODO: remove serverKeyHash check in 1-2 releases after everyone's keyHash has been updated
+ const serverKeyHash = yield this.hashPassword(masterPassword, key, _enums_hashPurpose__WEBPACK_IMPORTED_MODULE_2__["HashPurpose"].ServerAuthorization);
+ if (serverKeyHash != null && storedKeyHash === serverKeyHash) {
+ yield this.setKeyHash(localKeyHash);
+ return true;
+ }
+ }
+ return false;
+ });
+ }
+ getEncKey(key = null) {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (this.encKey != null) {
+ return this.encKey;
+ }
+ const encKey = yield this.storageService.get(Keys.encKey);
+ if (encKey == null) {
+ return null;
+ }
+ if (key == null) {
+ key = yield this.getKey();
+ }
+ if (key == null) {
+ return null;
+ }
+ let decEncKey;
+ const encKeyCipher = new _models_domain_encString__WEBPACK_IMPORTED_MODULE_6__["EncString"](encKey);
+ if (encKeyCipher.encryptionType === _enums_encryptionType__WEBPACK_IMPORTED_MODULE_1__["EncryptionType"].AesCbc256_B64) {
+ decEncKey = yield this.decryptToBytes(encKeyCipher, key);
+ }
+ else if (encKeyCipher.encryptionType === _enums_encryptionType__WEBPACK_IMPORTED_MODULE_1__["EncryptionType"].AesCbc256_HmacSha256_B64) {
+ const newKey = yield this.stretchKey(key);
+ decEncKey = yield this.decryptToBytes(encKeyCipher, newKey);
+ }
+ else {
+ throw new Error('Unsupported encKey type.');
+ }
+ if (decEncKey == null) {
+ return null;
+ }
+ this.encKey = new _models_domain_symmetricCryptoKey__WEBPACK_IMPORTED_MODULE_7__["SymmetricCryptoKey"](decEncKey);
+ return this.encKey;
+ });
+ }
+ getPublicKey() {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (this.publicKey != null) {
+ return this.publicKey;
+ }
+ const privateKey = yield this.getPrivateKey();
+ if (privateKey == null) {
+ return null;
+ }
+ this.publicKey = yield this.cryptoFunctionService.rsaExtractPublicKey(privateKey);
+ return this.publicKey;
+ });
+ }
+ getPrivateKey() {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (this.privateKey != null) {
+ return this.privateKey;
+ }
+ const encPrivateKey = yield this.storageService.get(Keys.encPrivateKey);
+ if (encPrivateKey == null) {
+ return null;
+ }
+ this.privateKey = yield this.decryptToBytes(new _models_domain_encString__WEBPACK_IMPORTED_MODULE_6__["EncString"](encPrivateKey), null);
+ return this.privateKey;
+ });
+ }
+ getFingerprint(userId, publicKey) {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (publicKey == null) {
+ publicKey = yield this.getPublicKey();
+ }
+ if (publicKey === null) {
+ throw new Error('No public key available.');
+ }
+ const keyFingerprint = yield this.cryptoFunctionService.hash(publicKey, 'sha256');
+ const userFingerprint = yield this.cryptoFunctionService.hkdfExpand(keyFingerprint, userId, 32, 'sha256');
+ return this.hashPhrase(userFingerprint);
+ });
+ }
+ getOrgKeys() {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (this.orgKeys != null && this.orgKeys.size > 0) {
+ return this.orgKeys;
+ }
+ const encOrgKeys = yield this.storageService.get(Keys.encOrgKeys);
+ if (encOrgKeys == null) {
+ return null;
+ }
+ const orgKeys = new Map();
+ let setKey = false;
+ for (const orgId in encOrgKeys) {
+ if (!encOrgKeys.hasOwnProperty(orgId)) {
+ continue;
+ }
+ const decValue = yield this.rsaDecrypt(encOrgKeys[orgId]);
+ orgKeys.set(orgId, new _models_domain_symmetricCryptoKey__WEBPACK_IMPORTED_MODULE_7__["SymmetricCryptoKey"](decValue));
+ setKey = true;
+ }
+ if (setKey) {
+ this.orgKeys = orgKeys;
+ }
+ return this.orgKeys;
+ });
+ }
+ getOrgKey(orgId) {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (orgId == null) {
+ return null;
+ }
+ const orgKeys = yield this.getOrgKeys();
+ if (orgKeys == null || !orgKeys.has(orgId)) {
+ return null;
+ }
+ return orgKeys.get(orgId);
+ });
+ }
+ getProviderKeys() {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (this.providerKeys != null && this.providerKeys.size > 0) {
+ return this.providerKeys;
+ }
+ const encProviderKeys = yield this.storageService.get(Keys.encProviderKeys);
+ if (encProviderKeys == null) {
+ return null;
+ }
+ const providerKeys = new Map();
+ let setKey = false;
+ for (const orgId in encProviderKeys) {
+ if (!encProviderKeys.hasOwnProperty(orgId)) {
+ continue;
+ }
+ const decValue = yield this.rsaDecrypt(encProviderKeys[orgId]);
+ providerKeys.set(orgId, new _models_domain_symmetricCryptoKey__WEBPACK_IMPORTED_MODULE_7__["SymmetricCryptoKey"](decValue));
+ setKey = true;
+ }
+ if (setKey) {
+ this.providerKeys = providerKeys;
+ }
+ return this.providerKeys;
+ });
+ }
+ getProviderKey(providerId) {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (providerId == null) {
+ return null;
+ }
+ const providerKeys = yield this.getProviderKeys();
+ if (providerKeys == null || !providerKeys.has(providerId)) {
+ return null;
+ }
+ return providerKeys.get(providerId);
+ });
+ }
+ hasKey() {
+ return __awaiter(this, void 0, void 0, function* () {
+ return this.hasKeyInMemory() || (yield this.hasKeyStored('auto')) || (yield this.hasKeyStored('biometric'));
+ });
+ }
+ hasKeyInMemory() {
+ return this.key != null;
+ }
+ hasKeyStored(keySuffix) {
+ return this.secureStorageService.has(Keys.key, { keySuffix: keySuffix });
+ }
+ hasEncKey() {
+ return __awaiter(this, void 0, void 0, function* () {
+ const encKey = yield this.storageService.get(Keys.encKey);
+ return encKey != null;
+ });
+ }
+ clearKey(clearSecretStorage = true) {
+ return __awaiter(this, void 0, void 0, function* () {
+ this.key = this.legacyEtmKey = null;
+ if (clearSecretStorage) {
+ this.clearStoredKey('auto');
+ this.clearStoredKey('biometric');
+ }
+ });
+ }
+ clearStoredKey(keySuffix) {
+ return __awaiter(this, void 0, void 0, function* () {
+ yield this.secureStorageService.remove(Keys.key, { keySuffix: keySuffix });
+ });
+ }
+ clearKeyHash() {
+ this.keyHash = null;
+ return this.storageService.remove(Keys.keyHash);
+ }
+ clearEncKey(memoryOnly) {
+ this.encKey = null;
+ if (memoryOnly) {
+ return Promise.resolve();
+ }
+ return this.storageService.remove(Keys.encKey);
+ }
+ clearKeyPair(memoryOnly) {
+ this.privateKey = null;
+ this.publicKey = null;
+ if (memoryOnly) {
+ return Promise.resolve();
+ }
+ return this.storageService.remove(Keys.encPrivateKey);
+ }
+ clearOrgKeys(memoryOnly) {
+ this.orgKeys = null;
+ if (memoryOnly) {
+ return Promise.resolve();
+ }
+ return this.storageService.remove(Keys.encOrgKeys);
+ }
+ clearProviderKeys(memoryOnly) {
+ this.providerKeys = null;
+ if (memoryOnly) {
+ return Promise.resolve();
+ }
+ return this.storageService.remove(Keys.encOrgKeys);
+ }
+ clearPinProtectedKey() {
+ return this.storageService.remove(_constants_service__WEBPACK_IMPORTED_MODULE_8__["ConstantsService"].pinProtectedKey);
+ }
+ clearKeys() {
+ return __awaiter(this, void 0, void 0, function* () {
+ yield this.clearKey();
+ yield this.clearKeyHash();
+ yield this.clearOrgKeys();
+ yield this.clearProviderKeys();
+ yield this.clearEncKey();
+ yield this.clearKeyPair();
+ yield this.clearPinProtectedKey();
+ });
+ }
+ toggleKey() {
+ return __awaiter(this, void 0, void 0, function* () {
+ const key = yield this.getKey();
+ yield this.setKey(key);
+ });
+ }
+ makeKey(password, salt, kdf, kdfIterations) {
+ return __awaiter(this, void 0, void 0, function* () {
+ let key = null;
+ if (kdf == null || kdf === _enums_kdfType__WEBPACK_IMPORTED_MODULE_3__["KdfType"].PBKDF2_SHA256) {
+ if (kdfIterations == null) {
+ kdfIterations = 5000;
+ }
+ else if (kdfIterations < 5000) {
+ throw new Error('PBKDF2 iteration minimum is 5000.');
+ }
+ key = yield this.cryptoFunctionService.pbkdf2(password, salt, 'sha256', kdfIterations);
+ }
+ else {
+ throw new Error('Unknown Kdf.');
+ }
+ return new _models_domain_symmetricCryptoKey__WEBPACK_IMPORTED_MODULE_7__["SymmetricCryptoKey"](key);
+ });
+ }
+ makeKeyFromPin(pin, salt, kdf, kdfIterations, protectedKeyCs = null) {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (protectedKeyCs == null) {
+ const pinProtectedKey = yield this.storageService.get(_constants_service__WEBPACK_IMPORTED_MODULE_8__["ConstantsService"].pinProtectedKey);
+ if (pinProtectedKey == null) {
+ throw new Error('No PIN protected key found.');
+ }
+ protectedKeyCs = new _models_domain_encString__WEBPACK_IMPORTED_MODULE_6__["EncString"](pinProtectedKey);
+ }
+ const pinKey = yield this.makePinKey(pin, salt, kdf, kdfIterations);
+ const decKey = yield this.decryptToBytes(protectedKeyCs, pinKey);
+ return new _models_domain_symmetricCryptoKey__WEBPACK_IMPORTED_MODULE_7__["SymmetricCryptoKey"](decKey);
+ });
+ }
+ makeShareKey() {
+ return __awaiter(this, void 0, void 0, function* () {
+ const shareKey = yield this.cryptoFunctionService.randomBytes(64);
+ const publicKey = yield this.getPublicKey();
+ const encShareKey = yield this.rsaEncrypt(shareKey, publicKey);
+ return [encShareKey, new _models_domain_symmetricCryptoKey__WEBPACK_IMPORTED_MODULE_7__["SymmetricCryptoKey"](shareKey)];
+ });
+ }
+ makeKeyPair(key) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const keyPair = yield this.cryptoFunctionService.rsaGenerateKeyPair(2048);
+ const publicB64 = _misc_utils__WEBPACK_IMPORTED_MODULE_10__["Utils"].fromBufferToB64(keyPair[0]);
+ const privateEnc = yield this.encrypt(keyPair[1], key);
+ return [publicB64, privateEnc];
+ });
+ }
+ makePinKey(pin, salt, kdf, kdfIterations) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const pinKey = yield this.makeKey(pin, salt, kdf, kdfIterations);
+ return yield this.stretchKey(pinKey);
+ });
+ }
+ makeSendKey(keyMaterial) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const sendKey = yield this.cryptoFunctionService.hkdf(keyMaterial, 'bitwarden-send', 'send', 64, 'sha256');
+ return new _models_domain_symmetricCryptoKey__WEBPACK_IMPORTED_MODULE_7__["SymmetricCryptoKey"](sendKey);
+ });
+ }
+ hashPassword(password, key, hashPurpose) {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (key == null) {
+ key = yield this.getKey();
+ }
+ if (password == null || key == null) {
+ throw new Error('Invalid parameters.');
+ }
+ const iterations = hashPurpose === _enums_hashPurpose__WEBPACK_IMPORTED_MODULE_2__["HashPurpose"].LocalAuthorization ? 2 : 1;
+ const hash = yield this.cryptoFunctionService.pbkdf2(key.key, password, 'sha256', iterations);
+ return _misc_utils__WEBPACK_IMPORTED_MODULE_10__["Utils"].fromBufferToB64(hash);
+ });
+ }
+ makeEncKey(key) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const theKey = yield this.getKeyForEncryption(key);
+ const encKey = yield this.cryptoFunctionService.randomBytes(64);
+ return this.buildEncKey(theKey, encKey);
+ });
+ }
+ remakeEncKey(key, encKey) {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (encKey == null) {
+ encKey = yield this.getEncKey();
+ }
+ return this.buildEncKey(key, encKey.key);
+ });
+ }
+ encrypt(plainValue, key) {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (plainValue == null) {
+ return Promise.resolve(null);
+ }
+ let plainBuf;
+ if (typeof (plainValue) === 'string') {
+ plainBuf = _misc_utils__WEBPACK_IMPORTED_MODULE_10__["Utils"].fromUtf8ToArray(plainValue).buffer;
+ }
+ else {
+ plainBuf = plainValue;
+ }
+ const encObj = yield this.aesEncrypt(plainBuf, key);
+ const iv = _misc_utils__WEBPACK_IMPORTED_MODULE_10__["Utils"].fromBufferToB64(encObj.iv);
+ const data = _misc_utils__WEBPACK_IMPORTED_MODULE_10__["Utils"].fromBufferToB64(encObj.data);
+ const mac = encObj.mac != null ? _misc_utils__WEBPACK_IMPORTED_MODULE_10__["Utils"].fromBufferToB64(encObj.mac) : null;
+ return new _models_domain_encString__WEBPACK_IMPORTED_MODULE_6__["EncString"](encObj.key.encType, data, iv, mac);
+ });
+ }
+ encryptToBytes(plainValue, key) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const encValue = yield this.aesEncrypt(plainValue, key);
+ let macLen = 0;
+ if (encValue.mac != null) {
+ macLen = encValue.mac.byteLength;
+ }
+ const encBytes = new Uint8Array(1 + encValue.iv.byteLength + macLen + encValue.data.byteLength);
+ encBytes.set([encValue.key.encType]);
+ encBytes.set(new Uint8Array(encValue.iv), 1);
+ if (encValue.mac != null) {
+ encBytes.set(new Uint8Array(encValue.mac), 1 + encValue.iv.byteLength);
+ }
+ encBytes.set(new Uint8Array(encValue.data), 1 + encValue.iv.byteLength + macLen);
+ return new _models_domain_encArrayBuffer__WEBPACK_IMPORTED_MODULE_4__["EncArrayBuffer"](encBytes.buffer);
+ });
+ }
+ rsaEncrypt(data, publicKey) {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (publicKey == null) {
+ publicKey = yield this.getPublicKey();
+ }
+ if (publicKey == null) {
+ throw new Error('Public key unavailable.');
+ }
+ const encBytes = yield this.cryptoFunctionService.rsaEncrypt(data, publicKey, 'sha1');
+ return new _models_domain_encString__WEBPACK_IMPORTED_MODULE_6__["EncString"](_enums_encryptionType__WEBPACK_IMPORTED_MODULE_1__["EncryptionType"].Rsa2048_OaepSha1_B64, _misc_utils__WEBPACK_IMPORTED_MODULE_10__["Utils"].fromBufferToB64(encBytes));
+ });
+ }
+ rsaDecrypt(encValue, privateKeyValue) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const headerPieces = encValue.split('.');
+ let encType = null;
+ let encPieces;
+ if (headerPieces.length === 1) {
+ encType = _enums_encryptionType__WEBPACK_IMPORTED_MODULE_1__["EncryptionType"].Rsa2048_OaepSha256_B64;
+ encPieces = [headerPieces[0]];
+ }
+ else if (headerPieces.length === 2) {
+ try {
+ encType = parseInt(headerPieces[0], null);
+ encPieces = headerPieces[1].split('|');
+ }
+ catch (e) {
+ this.logService.error(e);
+ }
+ }
+ switch (encType) {
+ case _enums_encryptionType__WEBPACK_IMPORTED_MODULE_1__["EncryptionType"].Rsa2048_OaepSha256_B64:
+ case _enums_encryptionType__WEBPACK_IMPORTED_MODULE_1__["EncryptionType"].Rsa2048_OaepSha1_B64:
+ // HmacSha256 types are deprecated
+ case _enums_encryptionType__WEBPACK_IMPORTED_MODULE_1__["EncryptionType"].Rsa2048_OaepSha256_HmacSha256_B64:
+ case _enums_encryptionType__WEBPACK_IMPORTED_MODULE_1__["EncryptionType"].Rsa2048_OaepSha1_HmacSha256_B64:
+ break;
+ default:
+ throw new Error('encType unavailable.');
+ }
+ if (encPieces == null || encPieces.length <= 0) {
+ throw new Error('encPieces unavailable.');
+ }
+ const data = _misc_utils__WEBPACK_IMPORTED_MODULE_10__["Utils"].fromB64ToArray(encPieces[0]).buffer;
+ const privateKey = privateKeyValue !== null && privateKeyValue !== void 0 ? privateKeyValue : yield this.getPrivateKey();
+ if (privateKey == null) {
+ throw new Error('No private key.');
+ }
+ let alg = 'sha1';
+ switch (encType) {
+ case _enums_encryptionType__WEBPACK_IMPORTED_MODULE_1__["EncryptionType"].Rsa2048_OaepSha256_B64:
+ case _enums_encryptionType__WEBPACK_IMPORTED_MODULE_1__["EncryptionType"].Rsa2048_OaepSha256_HmacSha256_B64:
+ alg = 'sha256';
+ break;
+ case _enums_encryptionType__WEBPACK_IMPORTED_MODULE_1__["EncryptionType"].Rsa2048_OaepSha1_B64:
+ case _enums_encryptionType__WEBPACK_IMPORTED_MODULE_1__["EncryptionType"].Rsa2048_OaepSha1_HmacSha256_B64:
+ break;
+ default:
+ throw new Error('encType unavailable.');
+ }
+ return this.cryptoFunctionService.rsaDecrypt(data, privateKey, alg);
+ });
+ }
+ decryptToBytes(encString, key) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const iv = _misc_utils__WEBPACK_IMPORTED_MODULE_10__["Utils"].fromB64ToArray(encString.iv).buffer;
+ const data = _misc_utils__WEBPACK_IMPORTED_MODULE_10__["Utils"].fromB64ToArray(encString.data).buffer;
+ const mac = encString.mac ? _misc_utils__WEBPACK_IMPORTED_MODULE_10__["Utils"].fromB64ToArray(encString.mac).buffer : null;
+ const decipher = yield this.aesDecryptToBytes(encString.encryptionType, data, iv, mac, key);
+ if (decipher == null) {
+ return null;
+ }
+ return decipher;
+ });
+ }
+ decryptToUtf8(encString, key) {
+ return __awaiter(this, void 0, void 0, function* () {
+ return yield this.aesDecryptToUtf8(encString.encryptionType, encString.data, encString.iv, encString.mac, key);
+ });
+ }
+ decryptFromBytes(encBuf, key) {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (encBuf == null) {
+ throw new Error('no encBuf.');
+ }
+ const encBytes = new Uint8Array(encBuf);
+ const encType = encBytes[0];
+ let ctBytes = null;
+ let ivBytes = null;
+ let macBytes = null;
+ switch (encType) {
+ case _enums_encryptionType__WEBPACK_IMPORTED_MODULE_1__["EncryptionType"].AesCbc128_HmacSha256_B64:
+ case _enums_encryptionType__WEBPACK_IMPORTED_MODULE_1__["EncryptionType"].AesCbc256_HmacSha256_B64:
+ if (encBytes.length <= 49) { // 1 + 16 + 32 + ctLength
+ return null;
+ }
+ ivBytes = encBytes.slice(1, 17);
+ macBytes = encBytes.slice(17, 49);
+ ctBytes = encBytes.slice(49);
+ break;
+ case _enums_encryptionType__WEBPACK_IMPORTED_MODULE_1__["EncryptionType"].AesCbc256_B64:
+ if (encBytes.length <= 17) { // 1 + 16 + ctLength
+ return null;
+ }
+ ivBytes = encBytes.slice(1, 17);
+ ctBytes = encBytes.slice(17);
+ break;
+ default:
+ return null;
+ }
+ return yield this.aesDecryptToBytes(encType, ctBytes.buffer, ivBytes.buffer, macBytes != null ? macBytes.buffer : null, key);
+ });
+ }
+ // EFForg/OpenWireless
+ // ref https://github.com/EFForg/OpenWireless/blob/master/app/js/diceware.js
+ randomNumber(min, max) {
+ return __awaiter(this, void 0, void 0, function* () {
+ let rval = 0;
+ const range = max - min + 1;
+ const bitsNeeded = Math.ceil(Math.log2(range));
+ if (bitsNeeded > 53) {
+ throw new Error('We cannot generate numbers larger than 53 bits.');
+ }
+ const bytesNeeded = Math.ceil(bitsNeeded / 8);
+ const mask = Math.pow(2, bitsNeeded) - 1;
+ // 7776 -> (2^13 = 8192) -1 == 8191 or 0x00001111 11111111
+ // Fill a byte array with N random numbers
+ const byteArray = new Uint8Array(yield this.cryptoFunctionService.randomBytes(bytesNeeded));
+ let p = (bytesNeeded - 1) * 8;
+ for (let i = 0; i < bytesNeeded; i++) {
+ rval += byteArray[i] * Math.pow(2, p);
+ p -= 8;
+ }
+ // Use & to apply the mask and reduce the number of recursive lookups
+ // tslint:disable-next-line
+ rval = rval & mask;
+ if (rval >= range) {
+ // Integer out of acceptable range
+ return this.randomNumber(min, max);
+ }
+ // Return an integer that falls within the range
+ return min + rval;
+ });
+ }
+ validateKey(key) {
+ return __awaiter(this, void 0, void 0, function* () {
+ try {
+ const encPrivateKey = yield this.storageService.get(Keys.encPrivateKey);
+ const encKey = yield this.getEncKey(key);
+ if (encPrivateKey == null || encKey == null) {
+ return false;
+ }
+ const privateKey = yield this.decryptToBytes(new _models_domain_encString__WEBPACK_IMPORTED_MODULE_6__["EncString"](encPrivateKey), encKey);
+ yield this.cryptoFunctionService.rsaExtractPublicKey(privateKey);
+ }
+ catch (e) {
+ return false;
+ }
+ return true;
+ });
+ }
+ // Helpers
+ storeKey(key) {
+ return __awaiter(this, void 0, void 0, function* () {
+ if ((yield this.shouldStoreKey('auto')) || (yield this.shouldStoreKey('biometric'))) {
+ this.secureStorageService.save(Keys.key, key.keyB64);
+ }
+ else {
+ this.secureStorageService.remove(Keys.key);
+ }
+ });
+ }
+ shouldStoreKey(keySuffix) {
+ return __awaiter(this, void 0, void 0, function* () {
+ let shouldStoreKey = false;
+ if (keySuffix === 'auto') {
+ const vaultTimeout = yield this.storageService.get(_constants_service__WEBPACK_IMPORTED_MODULE_8__["ConstantsService"].vaultTimeoutKey);
+ shouldStoreKey = vaultTimeout == null;
+ }
+ else if (keySuffix === 'biometric') {
+ const biometricUnlock = yield this.storageService.get(_constants_service__WEBPACK_IMPORTED_MODULE_8__["ConstantsService"].biometricUnlockKey);
+ shouldStoreKey = biometricUnlock && this.platformUtilService.supportsSecureStorage();
+ }
+ return shouldStoreKey;
+ });
+ }
+ retrieveKeyFromStorage(keySuffix) {
+ return this.secureStorageService.get(Keys.key, { keySuffix: keySuffix });
+ }
+ aesEncrypt(data, key) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const obj = new _models_domain_encryptedObject__WEBPACK_IMPORTED_MODULE_5__["EncryptedObject"]();
+ obj.key = yield this.getKeyForEncryption(key);
+ obj.iv = yield this.cryptoFunctionService.randomBytes(16);
+ obj.data = yield this.cryptoFunctionService.aesEncrypt(data, obj.iv, obj.key.encKey);
+ if (obj.key.macKey != null) {
+ const macData = new Uint8Array(obj.iv.byteLength + obj.data.byteLength);
+ macData.set(new Uint8Array(obj.iv), 0);
+ macData.set(new Uint8Array(obj.data), obj.iv.byteLength);
+ obj.mac = yield this.cryptoFunctionService.hmac(macData.buffer, obj.key.macKey, 'sha256');
+ }
+ return obj;
+ });
+ }
+ aesDecryptToUtf8(encType, data, iv, mac, key) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const keyForEnc = yield this.getKeyForEncryption(key);
+ const theKey = this.resolveLegacyKey(encType, keyForEnc);
+ if (theKey.macKey != null && mac == null) {
+ this.logService.error('mac required.');
+ return null;
+ }
+ if (theKey.encType !== encType) {
+ this.logService.error('encType unavailable.');
+ return null;
+ }
+ const fastParams = this.cryptoFunctionService.aesDecryptFastParameters(data, iv, mac, theKey);
+ if (fastParams.macKey != null && fastParams.mac != null) {
+ const computedMac = yield this.cryptoFunctionService.hmacFast(fastParams.macData, fastParams.macKey, 'sha256');
+ const macsEqual = yield this.cryptoFunctionService.compareFast(fastParams.mac, computedMac);
+ if (!macsEqual) {
+ this.logService.error('mac failed.');
+ return null;
+ }
+ }
+ return this.cryptoFunctionService.aesDecryptFast(fastParams);
+ });
+ }
+ aesDecryptToBytes(encType, data, iv, mac, key) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const keyForEnc = yield this.getKeyForEncryption(key);
+ const theKey = this.resolveLegacyKey(encType, keyForEnc);
+ if (theKey.macKey != null && mac == null) {
+ return null;
+ }
+ if (theKey.encType !== encType) {
+ return null;
+ }
+ if (theKey.macKey != null && mac != null) {
+ const macData = new Uint8Array(iv.byteLength + data.byteLength);
+ macData.set(new Uint8Array(iv), 0);
+ macData.set(new Uint8Array(data), iv.byteLength);
+ const computedMac = yield this.cryptoFunctionService.hmac(macData.buffer, theKey.macKey, 'sha256');
+ if (computedMac === null) {
+ return null;
+ }
+ const macsMatch = yield this.cryptoFunctionService.compare(mac, computedMac);
+ if (!macsMatch) {
+ this.logService.error('mac failed.');
+ return null;
+ }
+ }
+ return yield this.cryptoFunctionService.aesDecrypt(data, iv, theKey.encKey);
+ });
+ }
+ getKeyForEncryption(key) {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (key != null) {
+ return key;
+ }
+ const encKey = yield this.getEncKey();
+ if (encKey != null) {
+ return encKey;
+ }
+ return yield this.getKey();
+ });
+ }
+ resolveLegacyKey(encType, key) {
+ if (encType === _enums_encryptionType__WEBPACK_IMPORTED_MODULE_1__["EncryptionType"].AesCbc128_HmacSha256_B64 &&
+ key.encType === _enums_encryptionType__WEBPACK_IMPORTED_MODULE_1__["EncryptionType"].AesCbc256_B64) {
+ // Old encrypt-then-mac scheme, make a new key
+ if (this.legacyEtmKey == null) {
+ this.legacyEtmKey = new _models_domain_symmetricCryptoKey__WEBPACK_IMPORTED_MODULE_7__["SymmetricCryptoKey"](key.key, _enums_encryptionType__WEBPACK_IMPORTED_MODULE_1__["EncryptionType"].AesCbc128_HmacSha256_B64);
+ }
+ return this.legacyEtmKey;
+ }
+ return key;
+ }
+ stretchKey(key) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const newKey = new Uint8Array(64);
+ const encKey = yield this.cryptoFunctionService.hkdfExpand(key.key, 'enc', 32, 'sha256');
+ const macKey = yield this.cryptoFunctionService.hkdfExpand(key.key, 'mac', 32, 'sha256');
+ newKey.set(new Uint8Array(encKey));
+ newKey.set(new Uint8Array(macKey), 32);
+ return new _models_domain_symmetricCryptoKey__WEBPACK_IMPORTED_MODULE_7__["SymmetricCryptoKey"](newKey.buffer);
+ });
+ }
+ hashPhrase(hash, minimumEntropy = 64) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const entropyPerWord = Math.log(_misc_wordlist__WEBPACK_IMPORTED_MODULE_11__["EEFLongWordList"].length) / Math.log(2);
+ let numWords = Math.ceil(minimumEntropy / entropyPerWord);
+ const hashArr = Array.from(new Uint8Array(hash));
+ const entropyAvailable = hashArr.length * 4;
+ if (numWords * entropyPerWord > entropyAvailable) {
+ throw new Error('Output entropy of hash function is too small');
+ }
+ const phrase = [];
+ let hashNumber = big_integer__WEBPACK_IMPORTED_MODULE_0__["fromArray"](hashArr, 256);
+ while (numWords--) {
+ const remainder = hashNumber.mod(_misc_wordlist__WEBPACK_IMPORTED_MODULE_11__["EEFLongWordList"].length);
+ hashNumber = hashNumber.divide(_misc_wordlist__WEBPACK_IMPORTED_MODULE_11__["EEFLongWordList"].length);
+ phrase.push(_misc_wordlist__WEBPACK_IMPORTED_MODULE_11__["EEFLongWordList"][remainder]);
+ }
+ return phrase;
+ });
+ }
+ buildEncKey(key, encKey) {
+ return __awaiter(this, void 0, void 0, function* () {
+ let encKeyEnc = null;
+ if (key.key.byteLength === 32) {
+ const newKey = yield this.stretchKey(key);
+ encKeyEnc = yield this.encrypt(encKey, newKey);
+ }
+ else if (key.key.byteLength === 64) {
+ encKeyEnc = yield this.encrypt(encKey, key);
+ }
+ else {
+ throw new Error('Invalid key size.');
+ }
+ return [new _models_domain_symmetricCryptoKey__WEBPACK_IMPORTED_MODULE_7__["SymmetricCryptoKey"](encKey), encKeyEnc];
+ });
+ }
+}
+__decorate([
+ Object(_misc_sequentialize__WEBPACK_IMPORTED_MODULE_9__["sequentialize"])(() => 'getEncKey'),
+ __metadata("design:type", Function),
+ __metadata("design:paramtypes", [_models_domain_symmetricCryptoKey__WEBPACK_IMPORTED_MODULE_7__["SymmetricCryptoKey"]]),
+ __metadata("design:returntype", Promise)
+], CryptoService.prototype, "getEncKey", null);
+__decorate([
+ Object(_misc_sequentialize__WEBPACK_IMPORTED_MODULE_9__["sequentialize"])(() => 'getOrgKeys'),
+ __metadata("design:type", Function),
+ __metadata("design:paramtypes", []),
+ __metadata("design:returntype", Promise)
+], CryptoService.prototype, "getOrgKeys", null);
+__decorate([
+ Object(_misc_sequentialize__WEBPACK_IMPORTED_MODULE_9__["sequentialize"])(() => 'getProviderKeys'),
+ __metadata("design:type", Function),
+ __metadata("design:paramtypes", []),
+ __metadata("design:returntype", Promise)
+], CryptoService.prototype, "getProviderKeys", null);
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/services/environment.service.ts":
+/*!**********************************************************!*\
+ !*** ./jslib/common/src/services/environment.service.ts ***!
+ \**********************************************************/
+/*! exports provided: EnvironmentService */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "EnvironmentService", function() { return EnvironmentService; });
+/* harmony import */ var rxjs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! rxjs */ "./node_modules/rxjs/_esm5/index.js");
+/* harmony import */ var _models_domain_environmentUrls__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../models/domain/environmentUrls */ "./jslib/common/src/models/domain/environmentUrls.ts");
+/* harmony import */ var _constants_service__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./constants.service */ "./jslib/common/src/services/constants.service.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+
+class EnvironmentService {
+ constructor(storageService) {
+ this.storageService = storageService;
+ this.urlsSubject = new rxjs__WEBPACK_IMPORTED_MODULE_0__["Subject"]();
+ this.urls = this.urlsSubject; // tslint:disable-line
+ }
+ hasBaseUrl() {
+ return this.baseUrl != null;
+ }
+ getNotificationsUrl() {
+ if (this.notificationsUrl != null) {
+ return this.notificationsUrl;
+ }
+ if (this.baseUrl != null) {
+ return this.baseUrl + '/notifications';
+ }
+ return 'https://notifications.bitwarden.com';
+ }
+ getWebVaultUrl() {
+ if (this.webVaultUrl != null) {
+ return this.webVaultUrl;
+ }
+ if (this.baseUrl) {
+ return this.baseUrl;
+ }
+ return 'https://vault.bitwarden.com';
+ }
+ getSendUrl() {
+ return this.getWebVaultUrl() === 'https://vault.bitwarden.com'
+ ? 'https://send.bitwarden.com/#'
+ : this.getWebVaultUrl() + '/#/send/';
+ }
+ getIconsUrl() {
+ if (this.iconsUrl != null) {
+ return this.iconsUrl;
+ }
+ if (this.baseUrl) {
+ return this.baseUrl + '/icons';
+ }
+ return 'https://icons.bitwarden.net';
+ }
+ getApiUrl() {
+ if (this.apiUrl != null) {
+ return this.apiUrl;
+ }
+ if (this.baseUrl) {
+ return this.baseUrl + '/api';
+ }
+ return 'https://api.bitwarden.com';
+ }
+ getIdentityUrl() {
+ if (this.identityUrl != null) {
+ return this.identityUrl;
+ }
+ if (this.baseUrl) {
+ return this.baseUrl + '/identity';
+ }
+ return 'https://identity.bitwarden.com';
+ }
+ getEventsUrl() {
+ if (this.eventsUrl != null) {
+ return this.eventsUrl;
+ }
+ if (this.baseUrl) {
+ return this.baseUrl + '/events';
+ }
+ return 'https://events.bitwarden.com';
+ }
+ setUrlsFromStorage() {
+ return __awaiter(this, void 0, void 0, function* () {
+ const urlsObj = yield this.storageService.get(_constants_service__WEBPACK_IMPORTED_MODULE_2__["ConstantsService"].environmentUrlsKey);
+ const urls = urlsObj || {
+ base: null,
+ api: null,
+ identity: null,
+ icons: null,
+ notifications: null,
+ events: null,
+ webVault: null,
+ };
+ const envUrls = new _models_domain_environmentUrls__WEBPACK_IMPORTED_MODULE_1__["EnvironmentUrls"]();
+ if (urls.base) {
+ this.baseUrl = envUrls.base = urls.base;
+ return;
+ }
+ this.webVaultUrl = urls.webVault;
+ this.apiUrl = envUrls.api = urls.api;
+ this.identityUrl = envUrls.identity = urls.identity;
+ this.iconsUrl = urls.icons;
+ this.notificationsUrl = urls.notifications;
+ this.eventsUrl = envUrls.events = urls.events;
+ });
+ }
+ setUrls(urls, saveSettings = true) {
+ return __awaiter(this, void 0, void 0, function* () {
+ urls.base = this.formatUrl(urls.base);
+ urls.webVault = this.formatUrl(urls.webVault);
+ urls.api = this.formatUrl(urls.api);
+ urls.identity = this.formatUrl(urls.identity);
+ urls.icons = this.formatUrl(urls.icons);
+ urls.notifications = this.formatUrl(urls.notifications);
+ urls.events = this.formatUrl(urls.events);
+ if (saveSettings) {
+ yield this.storageService.save(_constants_service__WEBPACK_IMPORTED_MODULE_2__["ConstantsService"].environmentUrlsKey, {
+ base: urls.base,
+ api: urls.api,
+ identity: urls.identity,
+ webVault: urls.webVault,
+ icons: urls.icons,
+ notifications: urls.notifications,
+ events: urls.events,
+ });
+ }
+ this.baseUrl = urls.base;
+ this.webVaultUrl = urls.webVault;
+ this.apiUrl = urls.api;
+ this.identityUrl = urls.identity;
+ this.iconsUrl = urls.icons;
+ this.notificationsUrl = urls.notifications;
+ this.eventsUrl = urls.events;
+ this.urlsSubject.next(urls);
+ return urls;
+ });
+ }
+ getUrls() {
+ return {
+ base: this.baseUrl,
+ webVault: this.webVaultUrl,
+ api: this.apiUrl,
+ identity: this.identityUrl,
+ icons: this.iconsUrl,
+ notifications: this.notificationsUrl,
+ events: this.eventsUrl,
+ };
+ }
+ formatUrl(url) {
+ if (url == null || url === '') {
+ return null;
+ }
+ url = url.replace(/\/+$/g, '');
+ if (!url.startsWith('http://') && !url.startsWith('https://')) {
+ url = 'https://' + url;
+ }
+ return url.trim();
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/services/event.service.ts":
+/*!****************************************************!*\
+ !*** ./jslib/common/src/services/event.service.ts ***!
+ \****************************************************/
+/*! exports provided: EventService */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "EventService", function() { return EventService; });
+/* harmony import */ var _models_data_eventData__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../models/data/eventData */ "./jslib/common/src/models/data/eventData.ts");
+/* harmony import */ var _models_request_eventRequest__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../models/request/eventRequest */ "./jslib/common/src/models/request/eventRequest.ts");
+/* harmony import */ var _constants_service__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./constants.service */ "./jslib/common/src/services/constants.service.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+
+class EventService {
+ constructor(storageService, apiService, userService, cipherService, logService) {
+ this.storageService = storageService;
+ this.apiService = apiService;
+ this.userService = userService;
+ this.cipherService = cipherService;
+ this.logService = logService;
+ this.inited = false;
+ }
+ init(checkOnInterval) {
+ if (this.inited) {
+ return;
+ }
+ this.inited = true;
+ if (checkOnInterval) {
+ this.uploadEvents();
+ setInterval(() => this.uploadEvents(), 60 * 1000); // check every 60 seconds
+ }
+ }
+ collect(eventType, cipherId = null, uploadImmediately = false) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const authed = yield this.userService.isAuthenticated();
+ if (!authed) {
+ return;
+ }
+ const organizations = yield this.userService.getAllOrganizations();
+ if (organizations == null) {
+ return;
+ }
+ const orgIds = new Set(organizations.filter(o => o.useEvents).map(o => o.id));
+ if (orgIds.size === 0) {
+ return;
+ }
+ if (cipherId != null) {
+ const cipher = yield this.cipherService.get(cipherId);
+ if (cipher == null || cipher.organizationId == null || !orgIds.has(cipher.organizationId)) {
+ return;
+ }
+ }
+ let eventCollection = yield this.storageService.get(_constants_service__WEBPACK_IMPORTED_MODULE_2__["ConstantsService"].eventCollectionKey);
+ if (eventCollection == null) {
+ eventCollection = [];
+ }
+ const event = new _models_data_eventData__WEBPACK_IMPORTED_MODULE_0__["EventData"]();
+ event.type = eventType;
+ event.cipherId = cipherId;
+ event.date = new Date().toISOString();
+ eventCollection.push(event);
+ yield this.storageService.save(_constants_service__WEBPACK_IMPORTED_MODULE_2__["ConstantsService"].eventCollectionKey, eventCollection);
+ if (uploadImmediately) {
+ yield this.uploadEvents();
+ }
+ });
+ }
+ uploadEvents() {
+ return __awaiter(this, void 0, void 0, function* () {
+ const authed = yield this.userService.isAuthenticated();
+ if (!authed) {
+ return;
+ }
+ const eventCollection = yield this.storageService.get(_constants_service__WEBPACK_IMPORTED_MODULE_2__["ConstantsService"].eventCollectionKey);
+ if (eventCollection == null || eventCollection.length === 0) {
+ return;
+ }
+ const request = eventCollection.map(e => {
+ const req = new _models_request_eventRequest__WEBPACK_IMPORTED_MODULE_1__["EventRequest"]();
+ req.type = e.type;
+ req.cipherId = e.cipherId;
+ req.date = e.date;
+ return req;
+ });
+ try {
+ yield this.apiService.postEventsCollect(request);
+ this.clearEvents();
+ }
+ catch (e) {
+ this.logService.error(e);
+ }
+ });
+ }
+ clearEvents() {
+ return __awaiter(this, void 0, void 0, function* () {
+ yield this.storageService.remove(_constants_service__WEBPACK_IMPORTED_MODULE_2__["ConstantsService"].eventCollectionKey);
+ });
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/services/export.service.ts":
+/*!*****************************************************!*\
+ !*** ./jslib/common/src/services/export.service.ts ***!
+ \*****************************************************/
+/*! exports provided: ExportService */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ExportService", function() { return ExportService; });
+/* harmony import */ var papaparse__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! papaparse */ "./node_modules/papaparse/papaparse.min.js");
+/* harmony import */ var papaparse__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(papaparse__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var _enums_cipherType__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../enums/cipherType */ "./jslib/common/src/enums/cipherType.ts");
+/* harmony import */ var _models_domain_cipher__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../models/domain/cipher */ "./jslib/common/src/models/domain/cipher.ts");
+/* harmony import */ var _models_domain_collection__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../models/domain/collection */ "./jslib/common/src/models/domain/collection.ts");
+/* harmony import */ var _models_data_cipherData__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../models/data/cipherData */ "./jslib/common/src/models/data/cipherData.ts");
+/* harmony import */ var _models_data_collectionData__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../models/data/collectionData */ "./jslib/common/src/models/data/collectionData.ts");
+/* harmony import */ var _models_export_cipherWithIds__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../models/export/cipherWithIds */ "./jslib/common/src/models/export/cipherWithIds.ts");
+/* harmony import */ var _models_export_collectionWithId__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../models/export/collectionWithId */ "./jslib/common/src/models/export/collectionWithId.ts");
+/* harmony import */ var _models_export_event__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../models/export/event */ "./jslib/common/src/models/export/event.ts");
+/* harmony import */ var _models_export_folderWithId__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../models/export/folderWithId */ "./jslib/common/src/models/export/folderWithId.ts");
+/* harmony import */ var _misc_utils__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../misc/utils */ "./jslib/common/src/misc/utils.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+
+
+
+
+
+
+
+
+
+class ExportService {
+ constructor(folderService, cipherService, apiService, cryptoService) {
+ this.folderService = folderService;
+ this.cipherService = cipherService;
+ this.apiService = apiService;
+ this.cryptoService = cryptoService;
+ }
+ getExport(format = 'csv') {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (format === 'encrypted_json') {
+ return this.getEncryptedExport();
+ }
+ else {
+ return this.getDecryptedExport(format);
+ }
+ });
+ }
+ getOrganizationExport(organizationId, format = 'csv') {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (format === 'encrypted_json') {
+ return this.getOrganizationEncryptedExport(organizationId);
+ }
+ else {
+ return this.getOrganizationDecryptedExport(organizationId, format);
+ }
+ });
+ }
+ getEventExport(events) {
+ return __awaiter(this, void 0, void 0, function* () {
+ return papaparse__WEBPACK_IMPORTED_MODULE_0__["unparse"](events.map(e => new _models_export_event__WEBPACK_IMPORTED_MODULE_8__["Event"](e)));
+ });
+ }
+ getFileName(prefix = null, extension = 'csv') {
+ const now = new Date();
+ const dateString = now.getFullYear() + '' + this.padNumber(now.getMonth() + 1, 2) + '' + this.padNumber(now.getDate(), 2) +
+ this.padNumber(now.getHours(), 2) + '' + this.padNumber(now.getMinutes(), 2) +
+ this.padNumber(now.getSeconds(), 2);
+ return 'bitwarden' + (prefix ? ('_' + prefix) : '') + '_export_' + dateString + '.' + extension;
+ }
+ getDecryptedExport(format) {
+ return __awaiter(this, void 0, void 0, function* () {
+ let decFolders = [];
+ let decCiphers = [];
+ const promises = [];
+ promises.push(this.folderService.getAllDecrypted().then(folders => {
+ decFolders = folders;
+ }));
+ promises.push(this.cipherService.getAllDecrypted().then(ciphers => {
+ decCiphers = ciphers.filter(f => f.deletedDate == null);
+ }));
+ yield Promise.all(promises);
+ if (format === 'csv') {
+ const foldersMap = new Map();
+ decFolders.forEach(f => {
+ if (f.id != null) {
+ foldersMap.set(f.id, f);
+ }
+ });
+ const exportCiphers = [];
+ decCiphers.forEach(c => {
+ // only export logins and secure notes
+ if (c.type !== _enums_cipherType__WEBPACK_IMPORTED_MODULE_1__["CipherType"].Login && c.type !== _enums_cipherType__WEBPACK_IMPORTED_MODULE_1__["CipherType"].SecureNote) {
+ return;
+ }
+ if (c.organizationId != null) {
+ return;
+ }
+ const cipher = {};
+ cipher.folder = c.folderId != null && foldersMap.has(c.folderId) ?
+ foldersMap.get(c.folderId).name : null;
+ cipher.favorite = c.favorite ? 1 : null;
+ this.buildCommonCipher(cipher, c);
+ exportCiphers.push(cipher);
+ });
+ return papaparse__WEBPACK_IMPORTED_MODULE_0__["unparse"](exportCiphers);
+ }
+ else {
+ const jsonDoc = {
+ encrypted: false,
+ folders: [],
+ items: [],
+ };
+ decFolders.forEach(f => {
+ if (f.id == null) {
+ return;
+ }
+ const folder = new _models_export_folderWithId__WEBPACK_IMPORTED_MODULE_9__["FolderWithId"]();
+ folder.build(f);
+ jsonDoc.folders.push(folder);
+ });
+ decCiphers.forEach(c => {
+ if (c.organizationId != null) {
+ return;
+ }
+ const cipher = new _models_export_cipherWithIds__WEBPACK_IMPORTED_MODULE_6__["CipherWithIds"]();
+ cipher.build(c);
+ cipher.collectionIds = null;
+ jsonDoc.items.push(cipher);
+ });
+ return JSON.stringify(jsonDoc, null, ' ');
+ }
+ });
+ }
+ getEncryptedExport() {
+ return __awaiter(this, void 0, void 0, function* () {
+ let folders = [];
+ let ciphers = [];
+ const promises = [];
+ promises.push(this.folderService.getAll().then(f => {
+ folders = f;
+ }));
+ promises.push(this.cipherService.getAll().then(c => {
+ ciphers = c.filter(f => f.deletedDate == null);
+ }));
+ yield Promise.all(promises);
+ const encKeyValidation = yield this.cryptoService.encrypt(_misc_utils__WEBPACK_IMPORTED_MODULE_10__["Utils"].newGuid());
+ const jsonDoc = {
+ encrypted: true,
+ encKeyValidation_DO_NOT_EDIT: encKeyValidation.encryptedString,
+ folders: [],
+ items: [],
+ };
+ folders.forEach(f => {
+ if (f.id == null) {
+ return;
+ }
+ const folder = new _models_export_folderWithId__WEBPACK_IMPORTED_MODULE_9__["FolderWithId"]();
+ folder.build(f);
+ jsonDoc.folders.push(folder);
+ });
+ ciphers.forEach(c => {
+ if (c.organizationId != null) {
+ return;
+ }
+ const cipher = new _models_export_cipherWithIds__WEBPACK_IMPORTED_MODULE_6__["CipherWithIds"]();
+ cipher.build(c);
+ cipher.collectionIds = null;
+ jsonDoc.items.push(cipher);
+ });
+ return JSON.stringify(jsonDoc, null, ' ');
+ });
+ }
+ getOrganizationDecryptedExport(organizationId, format) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const decCollections = [];
+ const decCiphers = [];
+ const promises = [];
+ promises.push(this.apiService.getCollections(organizationId).then(collections => {
+ const collectionPromises = [];
+ if (collections != null && collections.data != null && collections.data.length > 0) {
+ collections.data.forEach(c => {
+ const collection = new _models_domain_collection__WEBPACK_IMPORTED_MODULE_3__["Collection"](new _models_data_collectionData__WEBPACK_IMPORTED_MODULE_5__["CollectionData"](c));
+ collectionPromises.push(collection.decrypt().then(decCol => {
+ decCollections.push(decCol);
+ }));
+ });
+ }
+ return Promise.all(collectionPromises);
+ }));
+ promises.push(this.apiService.getCiphersOrganization(organizationId).then(ciphers => {
+ const cipherPromises = [];
+ if (ciphers != null && ciphers.data != null && ciphers.data.length > 0) {
+ ciphers.data.filter(c => c.deletedDate === null).forEach(c => {
+ const cipher = new _models_domain_cipher__WEBPACK_IMPORTED_MODULE_2__["Cipher"](new _models_data_cipherData__WEBPACK_IMPORTED_MODULE_4__["CipherData"](c));
+ cipherPromises.push(cipher.decrypt().then(decCipher => {
+ decCiphers.push(decCipher);
+ }));
+ });
+ }
+ return Promise.all(cipherPromises);
+ }));
+ yield Promise.all(promises);
+ if (format === 'csv') {
+ const collectionsMap = new Map();
+ decCollections.forEach(c => {
+ collectionsMap.set(c.id, c);
+ });
+ const exportCiphers = [];
+ decCiphers.forEach(c => {
+ // only export logins and secure notes
+ if (c.type !== _enums_cipherType__WEBPACK_IMPORTED_MODULE_1__["CipherType"].Login && c.type !== _enums_cipherType__WEBPACK_IMPORTED_MODULE_1__["CipherType"].SecureNote) {
+ return;
+ }
+ const cipher = {};
+ cipher.collections = [];
+ if (c.collectionIds != null) {
+ cipher.collections = c.collectionIds.filter(id => collectionsMap.has(id))
+ .map(id => collectionsMap.get(id).name);
+ }
+ this.buildCommonCipher(cipher, c);
+ exportCiphers.push(cipher);
+ });
+ return papaparse__WEBPACK_IMPORTED_MODULE_0__["unparse"](exportCiphers);
+ }
+ else {
+ const jsonDoc = {
+ encrypted: false,
+ collections: [],
+ items: [],
+ };
+ decCollections.forEach(c => {
+ const collection = new _models_export_collectionWithId__WEBPACK_IMPORTED_MODULE_7__["CollectionWithId"]();
+ collection.build(c);
+ jsonDoc.collections.push(collection);
+ });
+ decCiphers.forEach(c => {
+ const cipher = new _models_export_cipherWithIds__WEBPACK_IMPORTED_MODULE_6__["CipherWithIds"]();
+ cipher.build(c);
+ jsonDoc.items.push(cipher);
+ });
+ return JSON.stringify(jsonDoc, null, ' ');
+ }
+ });
+ }
+ getOrganizationEncryptedExport(organizationId) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const collections = [];
+ const ciphers = [];
+ const promises = [];
+ promises.push(this.apiService.getCollections(organizationId).then(c => {
+ const collectionPromises = [];
+ if (c != null && c.data != null && c.data.length > 0) {
+ c.data.forEach(r => {
+ const collection = new _models_domain_collection__WEBPACK_IMPORTED_MODULE_3__["Collection"](new _models_data_collectionData__WEBPACK_IMPORTED_MODULE_5__["CollectionData"](r));
+ collections.push(collection);
+ });
+ }
+ return Promise.all(collectionPromises);
+ }));
+ promises.push(this.apiService.getCiphersOrganization(organizationId).then(c => {
+ const cipherPromises = [];
+ if (c != null && c.data != null && c.data.length > 0) {
+ c.data.filter(item => item.deletedDate === null).forEach(item => {
+ const cipher = new _models_domain_cipher__WEBPACK_IMPORTED_MODULE_2__["Cipher"](new _models_data_cipherData__WEBPACK_IMPORTED_MODULE_4__["CipherData"](item));
+ ciphers.push(cipher);
+ });
+ }
+ return Promise.all(cipherPromises);
+ }));
+ yield Promise.all(promises);
+ const orgKey = yield this.cryptoService.getOrgKey(organizationId);
+ const encKeyValidation = yield this.cryptoService.encrypt(_misc_utils__WEBPACK_IMPORTED_MODULE_10__["Utils"].newGuid(), orgKey);
+ const jsonDoc = {
+ encrypted: true,
+ encKeyValidation_DO_NOT_EDIT: encKeyValidation.encryptedString,
+ collections: [],
+ items: [],
+ };
+ collections.forEach(c => {
+ const collection = new _models_export_collectionWithId__WEBPACK_IMPORTED_MODULE_7__["CollectionWithId"]();
+ collection.build(c);
+ jsonDoc.collections.push(collection);
+ });
+ ciphers.forEach(c => {
+ const cipher = new _models_export_cipherWithIds__WEBPACK_IMPORTED_MODULE_6__["CipherWithIds"]();
+ cipher.build(c);
+ jsonDoc.items.push(cipher);
+ });
+ return JSON.stringify(jsonDoc, null, ' ');
+ });
+ }
+ padNumber(num, width, padCharacter = '0') {
+ const numString = num.toString();
+ return numString.length >= width ? numString :
+ new Array(width - numString.length + 1).join(padCharacter) + numString;
+ }
+ buildCommonCipher(cipher, c) {
+ cipher.type = null;
+ cipher.name = c.name;
+ cipher.notes = c.notes;
+ cipher.fields = null;
+ cipher.reprompt = c.reprompt;
+ // Login props
+ cipher.login_uri = null;
+ cipher.login_username = null;
+ cipher.login_password = null;
+ cipher.login_totp = null;
+ if (c.fields) {
+ c.fields.forEach((f) => {
+ if (!cipher.fields) {
+ cipher.fields = '';
+ }
+ else {
+ cipher.fields += '\n';
+ }
+ cipher.fields += ((f.name || '') + ': ' + f.value);
+ });
+ }
+ switch (c.type) {
+ case _enums_cipherType__WEBPACK_IMPORTED_MODULE_1__["CipherType"].Login:
+ cipher.type = 'login';
+ cipher.login_username = c.login.username;
+ cipher.login_password = c.login.password;
+ cipher.login_totp = c.login.totp;
+ if (c.login.uris) {
+ cipher.login_uri = [];
+ c.login.uris.forEach(u => {
+ cipher.login_uri.push(u.uri);
+ });
+ }
+ break;
+ case _enums_cipherType__WEBPACK_IMPORTED_MODULE_1__["CipherType"].SecureNote:
+ cipher.type = 'note';
+ break;
+ default:
+ return;
+ }
+ return cipher;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/services/fileUpload.service.ts":
+/*!*********************************************************!*\
+ !*** ./jslib/common/src/services/fileUpload.service.ts ***!
+ \*********************************************************/
+/*! exports provided: FileUploadService */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FileUploadService", function() { return FileUploadService; });
+/* harmony import */ var _enums_fileUploadType__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../enums/fileUploadType */ "./jslib/common/src/enums/fileUploadType.ts");
+/* harmony import */ var _azureFileUpload_service__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./azureFileUpload.service */ "./jslib/common/src/services/azureFileUpload.service.ts");
+/* harmony import */ var _bitwardenFileUpload_service__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./bitwardenFileUpload.service */ "./jslib/common/src/services/bitwardenFileUpload.service.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+
+class FileUploadService {
+ constructor(logService, apiService) {
+ this.logService = logService;
+ this.apiService = apiService;
+ this.azureFileUploadService = new _azureFileUpload_service__WEBPACK_IMPORTED_MODULE_1__["AzureFileUploadService"](logService);
+ this.bitwardenFileUploadService = new _bitwardenFileUpload_service__WEBPACK_IMPORTED_MODULE_2__["BitwardenFileUploadService"](apiService);
+ }
+ uploadSendFile(uploadData, fileName, encryptedFileData) {
+ return __awaiter(this, void 0, void 0, function* () {
+ try {
+ switch (uploadData.fileUploadType) {
+ case _enums_fileUploadType__WEBPACK_IMPORTED_MODULE_0__["FileUploadType"].Direct:
+ yield this.bitwardenFileUploadService.upload(fileName.encryptedString, encryptedFileData, fd => this.apiService.postSendFile(uploadData.sendResponse.id, uploadData.sendResponse.file.id, fd));
+ break;
+ case _enums_fileUploadType__WEBPACK_IMPORTED_MODULE_0__["FileUploadType"].Azure:
+ const renewalCallback = () => __awaiter(this, void 0, void 0, function* () {
+ const renewalResponse = yield this.apiService.renewSendFileUploadUrl(uploadData.sendResponse.id, uploadData.sendResponse.file.id);
+ return renewalResponse.url;
+ });
+ yield this.azureFileUploadService.upload(uploadData.url, encryptedFileData, renewalCallback);
+ break;
+ default:
+ throw new Error('Unknown file upload type');
+ }
+ }
+ catch (e) {
+ yield this.apiService.deleteSend(uploadData.sendResponse.id);
+ throw e;
+ }
+ });
+ }
+ uploadCipherAttachment(admin, uploadData, encryptedFileName, encryptedFileData) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const response = admin ? uploadData.cipherMiniResponse : uploadData.cipherResponse;
+ try {
+ switch (uploadData.fileUploadType) {
+ case _enums_fileUploadType__WEBPACK_IMPORTED_MODULE_0__["FileUploadType"].Direct:
+ yield this.bitwardenFileUploadService.upload(encryptedFileName.encryptedString, encryptedFileData, fd => this.apiService.postAttachmentFile(response.id, uploadData.attachmentId, fd));
+ break;
+ case _enums_fileUploadType__WEBPACK_IMPORTED_MODULE_0__["FileUploadType"].Azure:
+ const renewalCallback = () => __awaiter(this, void 0, void 0, function* () {
+ const renewalResponse = yield this.apiService.renewAttachmentUploadUrl(response.id, uploadData.attachmentId);
+ return renewalResponse.url;
+ });
+ yield this.azureFileUploadService.upload(uploadData.url, encryptedFileData, renewalCallback);
+ break;
+ default:
+ throw new Error('Unknown file upload type.');
+ }
+ }
+ catch (e) {
+ if (admin) {
+ yield this.apiService.deleteCipherAttachmentAdmin(response.id, uploadData.attachmentId);
+ }
+ else {
+ yield this.apiService.deleteCipherAttachment(response.id, uploadData.attachmentId);
+ }
+ throw e;
+ }
+ });
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/services/folder.service.ts":
+/*!*****************************************************!*\
+ !*** ./jslib/common/src/services/folder.service.ts ***!
+ \*****************************************************/
+/*! exports provided: FolderService */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FolderService", function() { return FolderService; });
+/* harmony import */ var _models_data_folderData__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../models/data/folderData */ "./jslib/common/src/models/data/folderData.ts");
+/* harmony import */ var _models_domain_folder__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../models/domain/folder */ "./jslib/common/src/models/domain/folder.ts");
+/* harmony import */ var _models_request_folderRequest__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../models/request/folderRequest */ "./jslib/common/src/models/request/folderRequest.ts");
+/* harmony import */ var _models_view_folderView__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../models/view/folderView */ "./jslib/common/src/models/view/folderView.ts");
+/* harmony import */ var _misc_serviceUtils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../misc/serviceUtils */ "./jslib/common/src/misc/serviceUtils.ts");
+/* harmony import */ var _misc_utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../misc/utils */ "./jslib/common/src/misc/utils.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+
+
+
+
+const Keys = {
+ foldersPrefix: 'folders_',
+ ciphersPrefix: 'ciphers_',
+};
+const NestingDelimiter = '/';
+class FolderService {
+ constructor(cryptoService, userService, apiService, storageService, i18nService, cipherService) {
+ this.cryptoService = cryptoService;
+ this.userService = userService;
+ this.apiService = apiService;
+ this.storageService = storageService;
+ this.i18nService = i18nService;
+ this.cipherService = cipherService;
+ }
+ clearCache() {
+ this.decryptedFolderCache = null;
+ }
+ encrypt(model, key) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const folder = new _models_domain_folder__WEBPACK_IMPORTED_MODULE_1__["Folder"]();
+ folder.id = model.id;
+ folder.name = yield this.cryptoService.encrypt(model.name, key);
+ return folder;
+ });
+ }
+ get(id) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const userId = yield this.userService.getUserId();
+ const folders = yield this.storageService.get(Keys.foldersPrefix + userId);
+ if (folders == null || !folders.hasOwnProperty(id)) {
+ return null;
+ }
+ return new _models_domain_folder__WEBPACK_IMPORTED_MODULE_1__["Folder"](folders[id]);
+ });
+ }
+ getAll() {
+ return __awaiter(this, void 0, void 0, function* () {
+ const userId = yield this.userService.getUserId();
+ const folders = yield this.storageService.get(Keys.foldersPrefix + userId);
+ const response = [];
+ for (const id in folders) {
+ if (folders.hasOwnProperty(id)) {
+ response.push(new _models_domain_folder__WEBPACK_IMPORTED_MODULE_1__["Folder"](folders[id]));
+ }
+ }
+ return response;
+ });
+ }
+ getAllDecrypted() {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (this.decryptedFolderCache != null) {
+ return this.decryptedFolderCache;
+ }
+ const hasKey = yield this.cryptoService.hasKey();
+ if (!hasKey) {
+ throw new Error('No key.');
+ }
+ const decFolders = [];
+ const promises = [];
+ const folders = yield this.getAll();
+ folders.forEach(folder => {
+ promises.push(folder.decrypt().then(f => decFolders.push(f)));
+ });
+ yield Promise.all(promises);
+ decFolders.sort(_misc_utils__WEBPACK_IMPORTED_MODULE_5__["Utils"].getSortFunction(this.i18nService, 'name'));
+ const noneFolder = new _models_view_folderView__WEBPACK_IMPORTED_MODULE_3__["FolderView"]();
+ noneFolder.name = this.i18nService.t('noneFolder');
+ decFolders.push(noneFolder);
+ this.decryptedFolderCache = decFolders;
+ return this.decryptedFolderCache;
+ });
+ }
+ getAllNested() {
+ return __awaiter(this, void 0, void 0, function* () {
+ const folders = yield this.getAllDecrypted();
+ const nodes = [];
+ folders.forEach(f => {
+ const folderCopy = new _models_view_folderView__WEBPACK_IMPORTED_MODULE_3__["FolderView"]();
+ folderCopy.id = f.id;
+ folderCopy.revisionDate = f.revisionDate;
+ const parts = f.name != null ? f.name.replace(/^\/+|\/+$/g, '').split(NestingDelimiter) : [];
+ _misc_serviceUtils__WEBPACK_IMPORTED_MODULE_4__["ServiceUtils"].nestedTraverse(nodes, 0, parts, folderCopy, null, NestingDelimiter);
+ });
+ return nodes;
+ });
+ }
+ getNested(id) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const folders = yield this.getAllNested();
+ return _misc_serviceUtils__WEBPACK_IMPORTED_MODULE_4__["ServiceUtils"].getTreeNodeObject(folders, id);
+ });
+ }
+ saveWithServer(folder) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const request = new _models_request_folderRequest__WEBPACK_IMPORTED_MODULE_2__["FolderRequest"](folder);
+ let response;
+ if (folder.id == null) {
+ response = yield this.apiService.postFolder(request);
+ folder.id = response.id;
+ }
+ else {
+ response = yield this.apiService.putFolder(folder.id, request);
+ }
+ const userId = yield this.userService.getUserId();
+ const data = new _models_data_folderData__WEBPACK_IMPORTED_MODULE_0__["FolderData"](response, userId);
+ yield this.upsert(data);
+ });
+ }
+ upsert(folder) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const userId = yield this.userService.getUserId();
+ let folders = yield this.storageService.get(Keys.foldersPrefix + userId);
+ if (folders == null) {
+ folders = {};
+ }
+ if (folder instanceof _models_data_folderData__WEBPACK_IMPORTED_MODULE_0__["FolderData"]) {
+ const f = folder;
+ folders[f.id] = f;
+ }
+ else {
+ folder.forEach(f => {
+ folders[f.id] = f;
+ });
+ }
+ yield this.storageService.save(Keys.foldersPrefix + userId, folders);
+ this.decryptedFolderCache = null;
+ });
+ }
+ replace(folders) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const userId = yield this.userService.getUserId();
+ yield this.storageService.save(Keys.foldersPrefix + userId, folders);
+ this.decryptedFolderCache = null;
+ });
+ }
+ clear(userId) {
+ return __awaiter(this, void 0, void 0, function* () {
+ yield this.storageService.remove(Keys.foldersPrefix + userId);
+ this.decryptedFolderCache = null;
+ });
+ }
+ delete(id) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const userId = yield this.userService.getUserId();
+ const folders = yield this.storageService.get(Keys.foldersPrefix + userId);
+ if (folders == null) {
+ return;
+ }
+ if (typeof id === 'string') {
+ if (folders[id] == null) {
+ return;
+ }
+ delete folders[id];
+ }
+ else {
+ id.forEach(i => {
+ delete folders[i];
+ });
+ }
+ yield this.storageService.save(Keys.foldersPrefix + userId, folders);
+ this.decryptedFolderCache = null;
+ // Items in a deleted folder are re-assigned to "No Folder"
+ const ciphers = yield this.storageService.get(Keys.ciphersPrefix + userId);
+ if (ciphers != null) {
+ const updates = [];
+ for (const cId in ciphers) {
+ if (ciphers[cId].folderId === id) {
+ ciphers[cId].folderId = null;
+ updates.push(ciphers[cId]);
+ }
+ }
+ if (updates.length > 0) {
+ this.cipherService.upsert(updates);
+ }
+ }
+ });
+ }
+ deleteWithServer(id) {
+ return __awaiter(this, void 0, void 0, function* () {
+ yield this.apiService.deleteFolder(id);
+ yield this.delete(id);
+ });
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/services/i18n.service.ts":
+/*!***************************************************!*\
+ !*** ./jslib/common/src/services/i18n.service.ts ***!
+ \***************************************************/
+/*! exports provided: I18nService */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "I18nService", function() { return I18nService; });
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+class I18nService {
+ constructor(systemLanguage, localesDirectory, getLocalesJson) {
+ this.systemLanguage = systemLanguage;
+ this.localesDirectory = localesDirectory;
+ this.getLocalesJson = getLocalesJson;
+ // First locale is the default (English)
+ this.supportedTranslationLocales = ['en'];
+ this.localeNames = new Map([
+ ['af', 'Afrikaans'],
+ ['az', 'Azərbaycanca'],
+ ['be', 'Беларуская'],
+ ['bg', 'български'],
+ ['ca', 'català'],
+ ['cs', 'čeština'],
+ ['da', 'dansk'],
+ ['de', 'Deutsch'],
+ ['el', 'Ελληνικά'],
+ ['en', 'English'],
+ ['en-GB', 'English (British)'],
+ ['eo', 'Esperanto'],
+ ['es', 'español'],
+ ['et', 'eesti'],
+ ['fa', 'فارسی'],
+ ['fi', 'suomi'],
+ ['fr', 'français'],
+ ['he', 'עברית'],
+ ['hi', 'हिन्दी'],
+ ['hr', 'hrvatski'],
+ ['hu', 'magyar'],
+ ['id', 'Bahasa Indonesia'],
+ ['it', 'italiano'],
+ ['ja', '日本語'],
+ ['ko', '한국어'],
+ ['lv', 'Latvietis'],
+ ['ml', 'മലയാളം'],
+ ['nb', 'norsk (bokmål)'],
+ ['nl', 'Nederlands'],
+ ['pl', 'polski'],
+ ['pt-BR', 'português do Brasil'],
+ ['pt-PT', 'português'],
+ ['ro', 'română'],
+ ['ru', 'русский'],
+ ['sk', 'slovenčina'],
+ ['sr', 'Српски'],
+ ['sv', 'svenska'],
+ ['th', 'ไทย'],
+ ['tr', 'Türkçe'],
+ ['uk', 'українська'],
+ ['vi', 'Tiếng Việt'],
+ ['zh-CN', '中文(中国大陆)'],
+ ['zh-TW', '中文(台灣)'],
+ ]);
+ this.defaultMessages = {};
+ this.localeMessages = {};
+ this.systemLanguage = systemLanguage.replace('_', '-');
+ }
+ init(locale) {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (this.inited) {
+ throw new Error('i18n already initialized.');
+ }
+ if (this.supportedTranslationLocales == null || this.supportedTranslationLocales.length === 0) {
+ throw new Error('supportedTranslationLocales not set.');
+ }
+ this.inited = true;
+ this.locale = this.translationLocale = locale != null ? locale : this.systemLanguage;
+ try {
+ this.collator = new Intl.Collator(this.locale, { numeric: true, sensitivity: 'base' });
+ }
+ catch (_a) {
+ this.collator = null;
+ }
+ if (this.supportedTranslationLocales.indexOf(this.translationLocale) === -1) {
+ this.translationLocale = this.translationLocale.slice(0, 2);
+ if (this.supportedTranslationLocales.indexOf(this.translationLocale) === -1) {
+ this.translationLocale = this.supportedTranslationLocales[0];
+ }
+ }
+ if (this.localesDirectory != null) {
+ yield this.loadMessages(this.translationLocale, this.localeMessages);
+ if (this.translationLocale !== this.supportedTranslationLocales[0]) {
+ yield this.loadMessages(this.supportedTranslationLocales[0], this.defaultMessages);
+ }
+ }
+ });
+ }
+ t(id, p1, p2, p3) {
+ return this.translate(id, p1, p2, p3);
+ }
+ translate(id, p1, p2, p3) {
+ let result;
+ if (this.localeMessages.hasOwnProperty(id) && this.localeMessages[id]) {
+ result = this.localeMessages[id];
+ }
+ else if (this.defaultMessages.hasOwnProperty(id) && this.defaultMessages[id]) {
+ result = this.defaultMessages[id];
+ }
+ else {
+ result = '';
+ }
+ if (result !== '') {
+ if (p1 != null) {
+ result = result.split('__$1__').join(p1);
+ }
+ if (p2 != null) {
+ result = result.split('__$2__').join(p2);
+ }
+ if (p3 != null) {
+ result = result.split('__$3__').join(p3);
+ }
+ }
+ return result;
+ }
+ loadMessages(locale, messagesObj) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const formattedLocale = locale.replace('-', '_');
+ const locales = yield this.getLocalesJson(formattedLocale);
+ for (const prop in locales) {
+ if (!locales.hasOwnProperty(prop)) {
+ continue;
+ }
+ messagesObj[prop] = locales[prop].message;
+ if (locales[prop].placeholders) {
+ for (const placeProp in locales[prop].placeholders) {
+ if (!locales[prop].placeholders.hasOwnProperty(placeProp) ||
+ !locales[prop].placeholders[placeProp].content) {
+ continue;
+ }
+ const replaceToken = '\\$' + placeProp.toUpperCase() + '\\$';
+ let replaceContent = locales[prop].placeholders[placeProp].content;
+ if (replaceContent === '$1' || replaceContent === '$2' || replaceContent === '$3') {
+ replaceContent = '__$' + replaceContent + '__';
+ }
+ messagesObj[prop] = messagesObj[prop].replace(new RegExp(replaceToken, 'g'), replaceContent);
+ }
+ }
+ }
+ });
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/services/notifications.service.ts":
+/*!************************************************************!*\
+ !*** ./jslib/common/src/services/notifications.service.ts ***!
+ \************************************************************/
+/*! exports provided: NotificationsService */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "NotificationsService", function() { return NotificationsService; });
+/* harmony import */ var _microsoft_signalr__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @microsoft/signalr */ "./node_modules/@microsoft/signalr/dist/esm/index.js");
+/* harmony import */ var _microsoft_signalr_protocol_msgpack__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @microsoft/signalr-protocol-msgpack */ "./node_modules/@microsoft/signalr-protocol-msgpack/dist/esm/index.js");
+/* harmony import */ var _enums_notificationType__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../enums/notificationType */ "./jslib/common/src/enums/notificationType.ts");
+/* harmony import */ var _models_response_notificationResponse__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../models/response/notificationResponse */ "./jslib/common/src/models/response/notificationResponse.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+
+
+class NotificationsService {
+ constructor(userService, syncService, appIdService, apiService, vaultTimeoutService, environmentService, logoutCallback, logService) {
+ this.userService = userService;
+ this.syncService = syncService;
+ this.appIdService = appIdService;
+ this.apiService = apiService;
+ this.vaultTimeoutService = vaultTimeoutService;
+ this.environmentService = environmentService;
+ this.logoutCallback = logoutCallback;
+ this.logService = logService;
+ this.connected = false;
+ this.inited = false;
+ this.inactive = false;
+ this.reconnectTimer = null;
+ this.environmentService.urls.subscribe(() => {
+ if (!this.inited) {
+ return;
+ }
+ this.init();
+ });
+ }
+ init() {
+ return __awaiter(this, void 0, void 0, function* () {
+ this.inited = false;
+ this.url = this.environmentService.getNotificationsUrl();
+ // Set notifications server URL to `https://-` to effectively disable communication
+ // with the notifications server from the client app
+ if (this.url === 'https://-') {
+ return;
+ }
+ if (this.signalrConnection != null) {
+ this.signalrConnection.off('ReceiveMessage');
+ this.signalrConnection.off('Heartbeat');
+ yield this.signalrConnection.stop();
+ this.connected = false;
+ this.signalrConnection = null;
+ }
+ this.signalrConnection = new _microsoft_signalr__WEBPACK_IMPORTED_MODULE_0__["HubConnectionBuilder"]()
+ .withUrl(this.url + '/hub', {
+ accessTokenFactory: () => this.apiService.getActiveBearerToken(),
+ skipNegotiation: true,
+ transport: _microsoft_signalr__WEBPACK_IMPORTED_MODULE_0__["HttpTransportType"].WebSockets,
+ })
+ .withHubProtocol(new _microsoft_signalr_protocol_msgpack__WEBPACK_IMPORTED_MODULE_1__["MessagePackHubProtocol"]())
+ // .configureLogging(signalR.LogLevel.Trace)
+ .build();
+ this.signalrConnection.on('ReceiveMessage', (data) => this.processNotification(new _models_response_notificationResponse__WEBPACK_IMPORTED_MODULE_3__["NotificationResponse"](data)));
+ this.signalrConnection.on('Heartbeat', (data) => { });
+ this.signalrConnection.onclose(() => {
+ this.connected = false;
+ this.reconnect(true);
+ });
+ this.inited = true;
+ if (yield this.isAuthedAndUnlocked()) {
+ yield this.reconnect(false);
+ }
+ });
+ }
+ updateConnection(sync = false) {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (!this.inited) {
+ return;
+ }
+ try {
+ if (yield this.isAuthedAndUnlocked()) {
+ yield this.reconnect(sync);
+ }
+ else {
+ yield this.signalrConnection.stop();
+ }
+ }
+ catch (e) {
+ this.logService.error(e.toString());
+ }
+ });
+ }
+ reconnectFromActivity() {
+ return __awaiter(this, void 0, void 0, function* () {
+ this.inactive = false;
+ if (this.inited && !this.connected) {
+ yield this.reconnect(true);
+ }
+ });
+ }
+ disconnectFromInactivity() {
+ return __awaiter(this, void 0, void 0, function* () {
+ this.inactive = true;
+ if (this.inited && this.connected) {
+ yield this.signalrConnection.stop();
+ }
+ });
+ }
+ processNotification(notification) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const appId = yield this.appIdService.getAppId();
+ if (notification == null || notification.contextId === appId) {
+ return;
+ }
+ const isAuthenticated = yield this.userService.isAuthenticated();
+ const payloadUserId = notification.payload.userId || notification.payload.UserId;
+ const myUserId = yield this.userService.getUserId();
+ if (isAuthenticated && payloadUserId != null && payloadUserId !== myUserId) {
+ return;
+ }
+ switch (notification.type) {
+ case _enums_notificationType__WEBPACK_IMPORTED_MODULE_2__["NotificationType"].SyncCipherCreate:
+ case _enums_notificationType__WEBPACK_IMPORTED_MODULE_2__["NotificationType"].SyncCipherUpdate:
+ yield this.syncService.syncUpsertCipher(notification.payload, notification.type === _enums_notificationType__WEBPACK_IMPORTED_MODULE_2__["NotificationType"].SyncCipherUpdate);
+ break;
+ case _enums_notificationType__WEBPACK_IMPORTED_MODULE_2__["NotificationType"].SyncCipherDelete:
+ case _enums_notificationType__WEBPACK_IMPORTED_MODULE_2__["NotificationType"].SyncLoginDelete:
+ yield this.syncService.syncDeleteCipher(notification.payload);
+ break;
+ case _enums_notificationType__WEBPACK_IMPORTED_MODULE_2__["NotificationType"].SyncFolderCreate:
+ case _enums_notificationType__WEBPACK_IMPORTED_MODULE_2__["NotificationType"].SyncFolderUpdate:
+ yield this.syncService.syncUpsertFolder(notification.payload, notification.type === _enums_notificationType__WEBPACK_IMPORTED_MODULE_2__["NotificationType"].SyncFolderUpdate);
+ break;
+ case _enums_notificationType__WEBPACK_IMPORTED_MODULE_2__["NotificationType"].SyncFolderDelete:
+ yield this.syncService.syncDeleteFolder(notification.payload);
+ break;
+ case _enums_notificationType__WEBPACK_IMPORTED_MODULE_2__["NotificationType"].SyncVault:
+ case _enums_notificationType__WEBPACK_IMPORTED_MODULE_2__["NotificationType"].SyncCiphers:
+ case _enums_notificationType__WEBPACK_IMPORTED_MODULE_2__["NotificationType"].SyncSettings:
+ if (isAuthenticated) {
+ yield this.syncService.fullSync(false);
+ }
+ break;
+ case _enums_notificationType__WEBPACK_IMPORTED_MODULE_2__["NotificationType"].SyncOrgKeys:
+ if (isAuthenticated) {
+ yield this.syncService.fullSync(true);
+ // Stop so a reconnect can be made
+ yield this.signalrConnection.stop();
+ }
+ break;
+ case _enums_notificationType__WEBPACK_IMPORTED_MODULE_2__["NotificationType"].LogOut:
+ if (isAuthenticated) {
+ this.logoutCallback();
+ }
+ break;
+ case _enums_notificationType__WEBPACK_IMPORTED_MODULE_2__["NotificationType"].SyncSendCreate:
+ case _enums_notificationType__WEBPACK_IMPORTED_MODULE_2__["NotificationType"].SyncSendUpdate:
+ yield this.syncService.syncUpsertSend(notification.payload, notification.type === _enums_notificationType__WEBPACK_IMPORTED_MODULE_2__["NotificationType"].SyncSendUpdate);
+ break;
+ case _enums_notificationType__WEBPACK_IMPORTED_MODULE_2__["NotificationType"].SyncSendDelete:
+ yield this.syncService.syncDeleteSend(notification.payload);
+ default:
+ break;
+ }
+ });
+ }
+ reconnect(sync) {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (this.reconnectTimer != null) {
+ clearTimeout(this.reconnectTimer);
+ this.reconnectTimer = null;
+ }
+ if (this.connected || !this.inited || this.inactive) {
+ return;
+ }
+ const authedAndUnlocked = yield this.isAuthedAndUnlocked();
+ if (!authedAndUnlocked) {
+ return;
+ }
+ try {
+ yield this.signalrConnection.start();
+ this.connected = true;
+ if (sync) {
+ yield this.syncService.fullSync(false);
+ }
+ }
+ catch (e) {
+ this.logService.error(e);
+ }
+ if (!this.connected) {
+ this.reconnectTimer = setTimeout(() => this.reconnect(sync), this.random(120000, 300000));
+ }
+ });
+ }
+ isAuthedAndUnlocked() {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (yield this.userService.isAuthenticated()) {
+ const locked = yield this.vaultTimeoutService.isLocked();
+ return !locked;
+ }
+ return false;
+ });
+ }
+ random(min, max) {
+ min = Math.ceil(min);
+ max = Math.floor(max);
+ return Math.floor(Math.random() * (max - min + 1)) + min;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/services/passwordGeneration.service.ts":
+/*!*****************************************************************!*\
+ !*** ./jslib/common/src/services/passwordGeneration.service.ts ***!
+ \*****************************************************************/
+/*! exports provided: PasswordGenerationService */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PasswordGenerationService", function() { return PasswordGenerationService; });
+/* harmony import */ var zxcvbn__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! zxcvbn */ "./node_modules/zxcvbn/lib/main.js");
+/* harmony import */ var zxcvbn__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(zxcvbn__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var _models_domain_encString__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../models/domain/encString */ "./jslib/common/src/models/domain/encString.ts");
+/* harmony import */ var _models_domain_generatedPasswordHistory__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../models/domain/generatedPasswordHistory */ "./jslib/common/src/models/domain/generatedPasswordHistory.ts");
+/* harmony import */ var _models_domain_passwordGeneratorPolicyOptions__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../models/domain/passwordGeneratorPolicyOptions */ "./jslib/common/src/models/domain/passwordGeneratorPolicyOptions.ts");
+/* harmony import */ var _misc_wordlist__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../misc/wordlist */ "./jslib/common/src/misc/wordlist.ts");
+/* harmony import */ var _enums_policyType__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../enums/policyType */ "./jslib/common/src/enums/policyType.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+
+
+
+
+const DefaultOptions = {
+ length: 14,
+ ambiguous: false,
+ number: true,
+ minNumber: 1,
+ uppercase: true,
+ minUppercase: 0,
+ lowercase: true,
+ minLowercase: 0,
+ special: false,
+ minSpecial: 1,
+ type: 'password',
+ numWords: 3,
+ wordSeparator: '-',
+ capitalize: false,
+ includeNumber: false,
+};
+const Keys = {
+ options: 'passwordGenerationOptions',
+ history: 'generatedPasswordHistory',
+};
+const MaxPasswordsInHistory = 100;
+class PasswordGenerationService {
+ constructor(cryptoService, storageService, policyService) {
+ this.cryptoService = cryptoService;
+ this.storageService = storageService;
+ this.policyService = policyService;
+ }
+ generatePassword(options) {
+ return __awaiter(this, void 0, void 0, function* () {
+ // overload defaults with given options
+ const o = Object.assign({}, DefaultOptions, options);
+ if (o.type === 'passphrase') {
+ return this.generatePassphrase(options);
+ }
+ // sanitize
+ this.sanitizePasswordLength(o, true);
+ const minLength = o.minUppercase + o.minLowercase + o.minNumber + o.minSpecial;
+ if (o.length < minLength) {
+ o.length = minLength;
+ }
+ const positions = [];
+ if (o.lowercase && o.minLowercase > 0) {
+ for (let i = 0; i < o.minLowercase; i++) {
+ positions.push('l');
+ }
+ }
+ if (o.uppercase && o.minUppercase > 0) {
+ for (let i = 0; i < o.minUppercase; i++) {
+ positions.push('u');
+ }
+ }
+ if (o.number && o.minNumber > 0) {
+ for (let i = 0; i < o.minNumber; i++) {
+ positions.push('n');
+ }
+ }
+ if (o.special && o.minSpecial > 0) {
+ for (let i = 0; i < o.minSpecial; i++) {
+ positions.push('s');
+ }
+ }
+ while (positions.length < o.length) {
+ positions.push('a');
+ }
+ // shuffle
+ yield this.shuffleArray(positions);
+ // build out the char sets
+ let allCharSet = '';
+ let lowercaseCharSet = 'abcdefghijkmnopqrstuvwxyz';
+ if (o.ambiguous) {
+ lowercaseCharSet += 'l';
+ }
+ if (o.lowercase) {
+ allCharSet += lowercaseCharSet;
+ }
+ let uppercaseCharSet = 'ABCDEFGHJKLMNPQRSTUVWXYZ';
+ if (o.ambiguous) {
+ uppercaseCharSet += 'IO';
+ }
+ if (o.uppercase) {
+ allCharSet += uppercaseCharSet;
+ }
+ let numberCharSet = '23456789';
+ if (o.ambiguous) {
+ numberCharSet += '01';
+ }
+ if (o.number) {
+ allCharSet += numberCharSet;
+ }
+ const specialCharSet = '!@#$%^&*';
+ if (o.special) {
+ allCharSet += specialCharSet;
+ }
+ let password = '';
+ for (let i = 0; i < o.length; i++) {
+ let positionChars;
+ switch (positions[i]) {
+ case 'l':
+ positionChars = lowercaseCharSet;
+ break;
+ case 'u':
+ positionChars = uppercaseCharSet;
+ break;
+ case 'n':
+ positionChars = numberCharSet;
+ break;
+ case 's':
+ positionChars = specialCharSet;
+ break;
+ case 'a':
+ positionChars = allCharSet;
+ break;
+ default:
+ break;
+ }
+ const randomCharIndex = yield this.cryptoService.randomNumber(0, positionChars.length - 1);
+ password += positionChars.charAt(randomCharIndex);
+ }
+ return password;
+ });
+ }
+ generatePassphrase(options) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const o = Object.assign({}, DefaultOptions, options);
+ if (o.numWords == null || o.numWords <= 2) {
+ o.numWords = DefaultOptions.numWords;
+ }
+ if (o.wordSeparator == null || o.wordSeparator.length === 0 || o.wordSeparator.length > 1) {
+ o.wordSeparator = ' ';
+ }
+ if (o.capitalize == null) {
+ o.capitalize = false;
+ }
+ if (o.includeNumber == null) {
+ o.includeNumber = false;
+ }
+ const listLength = _misc_wordlist__WEBPACK_IMPORTED_MODULE_4__["EEFLongWordList"].length - 1;
+ const wordList = new Array(o.numWords);
+ for (let i = 0; i < o.numWords; i++) {
+ const wordIndex = yield this.cryptoService.randomNumber(0, listLength);
+ if (o.capitalize) {
+ wordList[i] = this.capitalize(_misc_wordlist__WEBPACK_IMPORTED_MODULE_4__["EEFLongWordList"][wordIndex]);
+ }
+ else {
+ wordList[i] = _misc_wordlist__WEBPACK_IMPORTED_MODULE_4__["EEFLongWordList"][wordIndex];
+ }
+ }
+ if (o.includeNumber) {
+ yield this.appendRandomNumberToRandomWord(wordList);
+ }
+ return wordList.join(o.wordSeparator);
+ });
+ }
+ getOptions() {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (this.optionsCache == null) {
+ const options = yield this.storageService.get(Keys.options);
+ if (options == null) {
+ this.optionsCache = DefaultOptions;
+ }
+ else {
+ this.optionsCache = Object.assign({}, DefaultOptions, options);
+ }
+ }
+ const enforcedOptions = yield this.enforcePasswordGeneratorPoliciesOnOptions(this.optionsCache);
+ this.optionsCache = enforcedOptions[0];
+ return [this.optionsCache, enforcedOptions[1]];
+ });
+ }
+ enforcePasswordGeneratorPoliciesOnOptions(options) {
+ return __awaiter(this, void 0, void 0, function* () {
+ let enforcedPolicyOptions = yield this.getPasswordGeneratorPolicyOptions();
+ if (enforcedPolicyOptions != null) {
+ if (options.length < enforcedPolicyOptions.minLength) {
+ options.length = enforcedPolicyOptions.minLength;
+ }
+ if (enforcedPolicyOptions.useUppercase) {
+ options.uppercase = true;
+ }
+ if (enforcedPolicyOptions.useLowercase) {
+ options.lowercase = true;
+ }
+ if (enforcedPolicyOptions.useNumbers) {
+ options.number = true;
+ }
+ if (options.minNumber < enforcedPolicyOptions.numberCount) {
+ options.minNumber = enforcedPolicyOptions.numberCount;
+ }
+ if (enforcedPolicyOptions.useSpecial) {
+ options.special = true;
+ }
+ if (options.minSpecial < enforcedPolicyOptions.specialCount) {
+ options.minSpecial = enforcedPolicyOptions.specialCount;
+ }
+ // Must normalize these fields because the receiving call expects all options to pass the current rules
+ if (options.minSpecial + options.minNumber > options.length) {
+ options.minSpecial = options.length - options.minNumber;
+ }
+ if (options.numWords < enforcedPolicyOptions.minNumberWords) {
+ options.numWords = enforcedPolicyOptions.minNumberWords;
+ }
+ if (enforcedPolicyOptions.capitalize) {
+ options.capitalize = true;
+ }
+ if (enforcedPolicyOptions.includeNumber) {
+ options.includeNumber = true;
+ }
+ // Force default type if password/passphrase selected via policy
+ if (enforcedPolicyOptions.defaultType === 'password' ||
+ enforcedPolicyOptions.defaultType === 'passphrase') {
+ options.type = enforcedPolicyOptions.defaultType;
+ }
+ }
+ else { // UI layer expects an instantiated object to prevent more explicit null checks
+ enforcedPolicyOptions = new _models_domain_passwordGeneratorPolicyOptions__WEBPACK_IMPORTED_MODULE_3__["PasswordGeneratorPolicyOptions"]();
+ }
+ return [options, enforcedPolicyOptions];
+ });
+ }
+ getPasswordGeneratorPolicyOptions() {
+ return __awaiter(this, void 0, void 0, function* () {
+ const policies = this.policyService == null ? null :
+ yield this.policyService.getAll(_enums_policyType__WEBPACK_IMPORTED_MODULE_5__["PolicyType"].PasswordGenerator);
+ let enforcedOptions = null;
+ if (policies == null || policies.length === 0) {
+ return enforcedOptions;
+ }
+ policies.forEach(currentPolicy => {
+ if (!currentPolicy.enabled || currentPolicy.data == null) {
+ return;
+ }
+ if (enforcedOptions == null) {
+ enforcedOptions = new _models_domain_passwordGeneratorPolicyOptions__WEBPACK_IMPORTED_MODULE_3__["PasswordGeneratorPolicyOptions"]();
+ }
+ // Password wins in multi-org collisions
+ if (currentPolicy.data.defaultType != null && enforcedOptions.defaultType !== 'password') {
+ enforcedOptions.defaultType = currentPolicy.data.defaultType;
+ }
+ if (currentPolicy.data.minLength != null
+ && currentPolicy.data.minLength > enforcedOptions.minLength) {
+ enforcedOptions.minLength = currentPolicy.data.minLength;
+ }
+ if (currentPolicy.data.useUpper) {
+ enforcedOptions.useUppercase = true;
+ }
+ if (currentPolicy.data.useLower) {
+ enforcedOptions.useLowercase = true;
+ }
+ if (currentPolicy.data.useNumbers) {
+ enforcedOptions.useNumbers = true;
+ }
+ if (currentPolicy.data.minNumbers != null
+ && currentPolicy.data.minNumbers > enforcedOptions.numberCount) {
+ enforcedOptions.numberCount = currentPolicy.data.minNumbers;
+ }
+ if (currentPolicy.data.useSpecial) {
+ enforcedOptions.useSpecial = true;
+ }
+ if (currentPolicy.data.minSpecial != null
+ && currentPolicy.data.minSpecial > enforcedOptions.specialCount) {
+ enforcedOptions.specialCount = currentPolicy.data.minSpecial;
+ }
+ if (currentPolicy.data.minNumberWords != null
+ && currentPolicy.data.minNumberWords > enforcedOptions.minNumberWords) {
+ enforcedOptions.minNumberWords = currentPolicy.data.minNumberWords;
+ }
+ if (currentPolicy.data.capitalize) {
+ enforcedOptions.capitalize = true;
+ }
+ if (currentPolicy.data.includeNumber) {
+ enforcedOptions.includeNumber = true;
+ }
+ });
+ return enforcedOptions;
+ });
+ }
+ saveOptions(options) {
+ return __awaiter(this, void 0, void 0, function* () {
+ yield this.storageService.save(Keys.options, options);
+ this.optionsCache = options;
+ });
+ }
+ getHistory() {
+ return __awaiter(this, void 0, void 0, function* () {
+ const hasKey = yield this.cryptoService.hasKey();
+ if (!hasKey) {
+ return new Array();
+ }
+ if (!this.history) {
+ const encrypted = yield this.storageService.get(Keys.history);
+ this.history = yield this.decryptHistory(encrypted);
+ }
+ return this.history || new Array();
+ });
+ }
+ addHistory(password) {
+ return __awaiter(this, void 0, void 0, function* () {
+ // Cannot add new history if no key is available
+ const hasKey = yield this.cryptoService.hasKey();
+ if (!hasKey) {
+ return;
+ }
+ const currentHistory = yield this.getHistory();
+ // Prevent duplicates
+ if (this.matchesPrevious(password, currentHistory)) {
+ return;
+ }
+ currentHistory.unshift(new _models_domain_generatedPasswordHistory__WEBPACK_IMPORTED_MODULE_2__["GeneratedPasswordHistory"](password, Date.now()));
+ // Remove old items.
+ if (currentHistory.length > MaxPasswordsInHistory) {
+ currentHistory.pop();
+ }
+ const newHistory = yield this.encryptHistory(currentHistory);
+ return yield this.storageService.save(Keys.history, newHistory);
+ });
+ }
+ clear() {
+ return __awaiter(this, void 0, void 0, function* () {
+ this.history = [];
+ return yield this.storageService.remove(Keys.history);
+ });
+ }
+ passwordStrength(password, userInputs = null) {
+ if (password == null || password.length === 0) {
+ return null;
+ }
+ let globalUserInputs = ['bitwarden', 'bit', 'warden'];
+ if (userInputs != null && userInputs.length > 0) {
+ globalUserInputs = globalUserInputs.concat(userInputs);
+ }
+ // Use a hash set to get rid of any duplicate user inputs
+ const finalUserInputs = Array.from(new Set(globalUserInputs));
+ const result = zxcvbn__WEBPACK_IMPORTED_MODULE_0__(password, finalUserInputs);
+ return result;
+ }
+ normalizeOptions(options, enforcedPolicyOptions) {
+ options.minLowercase = 0;
+ options.minUppercase = 0;
+ if (!options.length || options.length < 5) {
+ options.length = 5;
+ }
+ else if (options.length > 128) {
+ options.length = 128;
+ }
+ if (options.length < enforcedPolicyOptions.minLength) {
+ options.length = enforcedPolicyOptions.minLength;
+ }
+ if (!options.minNumber) {
+ options.minNumber = 0;
+ }
+ else if (options.minNumber > options.length) {
+ options.minNumber = options.length;
+ }
+ else if (options.minNumber > 9) {
+ options.minNumber = 9;
+ }
+ if (options.minNumber < enforcedPolicyOptions.numberCount) {
+ options.minNumber = enforcedPolicyOptions.numberCount;
+ }
+ if (!options.minSpecial) {
+ options.minSpecial = 0;
+ }
+ else if (options.minSpecial > options.length) {
+ options.minSpecial = options.length;
+ }
+ else if (options.minSpecial > 9) {
+ options.minSpecial = 9;
+ }
+ if (options.minSpecial < enforcedPolicyOptions.specialCount) {
+ options.minSpecial = enforcedPolicyOptions.specialCount;
+ }
+ if (options.minSpecial + options.minNumber > options.length) {
+ options.minSpecial = options.length - options.minNumber;
+ }
+ if (options.numWords == null || options.length < 3) {
+ options.numWords = 3;
+ }
+ else if (options.numWords > 20) {
+ options.numWords = 20;
+ }
+ if (options.numWords < enforcedPolicyOptions.minNumberWords) {
+ options.numWords = enforcedPolicyOptions.minNumberWords;
+ }
+ if (options.wordSeparator != null && options.wordSeparator.length > 1) {
+ options.wordSeparator = options.wordSeparator[0];
+ }
+ this.sanitizePasswordLength(options, false);
+ }
+ capitalize(str) {
+ return str.charAt(0).toUpperCase() + str.slice(1);
+ }
+ appendRandomNumberToRandomWord(wordList) {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (wordList == null || wordList.length <= 0) {
+ return;
+ }
+ const index = yield this.cryptoService.randomNumber(0, wordList.length - 1);
+ const num = yield this.cryptoService.randomNumber(0, 9);
+ wordList[index] = wordList[index] + num;
+ });
+ }
+ encryptHistory(history) {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (history == null || history.length === 0) {
+ return Promise.resolve([]);
+ }
+ const promises = history.map((item) => __awaiter(this, void 0, void 0, function* () {
+ const encrypted = yield this.cryptoService.encrypt(item.password);
+ return new _models_domain_generatedPasswordHistory__WEBPACK_IMPORTED_MODULE_2__["GeneratedPasswordHistory"](encrypted.encryptedString, item.date);
+ }));
+ return yield Promise.all(promises);
+ });
+ }
+ decryptHistory(history) {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (history == null || history.length === 0) {
+ return Promise.resolve([]);
+ }
+ const promises = history.map((item) => __awaiter(this, void 0, void 0, function* () {
+ const decrypted = yield this.cryptoService.decryptToUtf8(new _models_domain_encString__WEBPACK_IMPORTED_MODULE_1__["EncString"](item.password));
+ return new _models_domain_generatedPasswordHistory__WEBPACK_IMPORTED_MODULE_2__["GeneratedPasswordHistory"](decrypted, item.date);
+ }));
+ return yield Promise.all(promises);
+ });
+ }
+ matchesPrevious(password, history) {
+ if (history == null || history.length === 0) {
+ return false;
+ }
+ return history[history.length - 1].password === password;
+ }
+ // ref: https://stackoverflow.com/a/12646864/1090359
+ shuffleArray(array) {
+ return __awaiter(this, void 0, void 0, function* () {
+ for (let i = array.length - 1; i > 0; i--) {
+ const j = yield this.cryptoService.randomNumber(0, i);
+ [array[i], array[j]] = [array[j], array[i]];
+ }
+ });
+ }
+ sanitizePasswordLength(options, forGeneration) {
+ let minUppercaseCalc = 0;
+ let minLowercaseCalc = 0;
+ let minNumberCalc = options.minNumber;
+ let minSpecialCalc = options.minSpecial;
+ if (options.uppercase && options.minUppercase <= 0) {
+ minUppercaseCalc = 1;
+ }
+ else if (!options.uppercase) {
+ minUppercaseCalc = 0;
+ }
+ if (options.lowercase && options.minLowercase <= 0) {
+ minLowercaseCalc = 1;
+ }
+ else if (!options.lowercase) {
+ minLowercaseCalc = 0;
+ }
+ if (options.number && options.minNumber <= 0) {
+ minNumberCalc = 1;
+ }
+ else if (!options.number) {
+ minNumberCalc = 0;
+ }
+ if (options.special && options.minSpecial <= 0) {
+ minSpecialCalc = 1;
+ }
+ else if (!options.special) {
+ minSpecialCalc = 0;
+ }
+ // This should never happen but is a final safety net
+ if (!options.length || options.length < 1) {
+ options.length = 10;
+ }
+ const minLength = minUppercaseCalc + minLowercaseCalc + minNumberCalc + minSpecialCalc;
+ // Normalize and Generation both require this modification
+ if (options.length < minLength) {
+ options.length = minLength;
+ }
+ // Apply other changes if the options object passed in is for generation
+ if (forGeneration) {
+ options.minUppercase = minUppercaseCalc;
+ options.minLowercase = minLowercaseCalc;
+ options.minNumber = minNumberCalc;
+ options.minSpecial = minSpecialCalc;
+ }
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/services/policy.service.ts":
+/*!*****************************************************!*\
+ !*** ./jslib/common/src/services/policy.service.ts ***!
+ \*****************************************************/
+/*! exports provided: PolicyService */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PolicyService", function() { return PolicyService; });
+/* harmony import */ var _models_data_policyData__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../models/data/policyData */ "./jslib/common/src/models/data/policyData.ts");
+/* harmony import */ var _models_domain_masterPasswordPolicyOptions__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../models/domain/masterPasswordPolicyOptions */ "./jslib/common/src/models/domain/masterPasswordPolicyOptions.ts");
+/* harmony import */ var _models_domain_policy__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../models/domain/policy */ "./jslib/common/src/models/domain/policy.ts");
+/* harmony import */ var _models_domain_resetPasswordPolicyOptions__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../models/domain/resetPasswordPolicyOptions */ "./jslib/common/src/models/domain/resetPasswordPolicyOptions.ts");
+/* harmony import */ var _enums_organizationUserStatusType__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../enums/organizationUserStatusType */ "./jslib/common/src/enums/organizationUserStatusType.ts");
+/* harmony import */ var _enums_organizationUserType__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../enums/organizationUserType */ "./jslib/common/src/enums/organizationUserType.ts");
+/* harmony import */ var _enums_policyType__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../enums/policyType */ "./jslib/common/src/enums/policyType.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+
+
+
+
+
+const Keys = {
+ policiesPrefix: 'policies_',
+};
+class PolicyService {
+ constructor(userService, storageService, apiService) {
+ this.userService = userService;
+ this.storageService = storageService;
+ this.apiService = apiService;
+ }
+ clearCache() {
+ this.policyCache = null;
+ }
+ getAll(type) {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (this.policyCache == null) {
+ const userId = yield this.userService.getUserId();
+ const policies = yield this.storageService.get(Keys.policiesPrefix + userId);
+ const response = [];
+ for (const id in policies) {
+ if (policies.hasOwnProperty(id)) {
+ response.push(new _models_domain_policy__WEBPACK_IMPORTED_MODULE_2__["Policy"](policies[id]));
+ }
+ }
+ this.policyCache = response;
+ }
+ if (type != null) {
+ return this.policyCache.filter(p => p.type === type);
+ }
+ else {
+ return this.policyCache;
+ }
+ });
+ }
+ getPolicyForOrganization(policyType, organizationId) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const org = yield this.userService.getOrganization(organizationId);
+ if (org === null || org === void 0 ? void 0 : org.isProviderUser) {
+ const orgPolicies = yield this.apiService.getPolicies(organizationId);
+ const policy = orgPolicies.data.find(p => p.organizationId === organizationId);
+ if (policy == null) {
+ return null;
+ }
+ return new _models_domain_policy__WEBPACK_IMPORTED_MODULE_2__["Policy"](new _models_data_policyData__WEBPACK_IMPORTED_MODULE_0__["PolicyData"](policy));
+ }
+ const policies = yield this.getAll(policyType);
+ return policies.find(p => p.organizationId === organizationId);
+ });
+ }
+ replace(policies) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const userId = yield this.userService.getUserId();
+ yield this.storageService.save(Keys.policiesPrefix + userId, policies);
+ this.policyCache = null;
+ });
+ }
+ clear(userId) {
+ return __awaiter(this, void 0, void 0, function* () {
+ yield this.storageService.remove(Keys.policiesPrefix + userId);
+ this.policyCache = null;
+ });
+ }
+ getMasterPasswordPolicyOptions(policies) {
+ return __awaiter(this, void 0, void 0, function* () {
+ let enforcedOptions = null;
+ if (policies == null) {
+ policies = yield this.getAll(_enums_policyType__WEBPACK_IMPORTED_MODULE_6__["PolicyType"].MasterPassword);
+ }
+ else {
+ policies = policies.filter(p => p.type === _enums_policyType__WEBPACK_IMPORTED_MODULE_6__["PolicyType"].MasterPassword);
+ }
+ if (policies == null || policies.length === 0) {
+ return enforcedOptions;
+ }
+ policies.forEach(currentPolicy => {
+ if (!currentPolicy.enabled || currentPolicy.data == null) {
+ return;
+ }
+ if (enforcedOptions == null) {
+ enforcedOptions = new _models_domain_masterPasswordPolicyOptions__WEBPACK_IMPORTED_MODULE_1__["MasterPasswordPolicyOptions"]();
+ }
+ if (currentPolicy.data.minComplexity != null
+ && currentPolicy.data.minComplexity > enforcedOptions.minComplexity) {
+ enforcedOptions.minComplexity = currentPolicy.data.minComplexity;
+ }
+ if (currentPolicy.data.minLength != null
+ && currentPolicy.data.minLength > enforcedOptions.minLength) {
+ enforcedOptions.minLength = currentPolicy.data.minLength;
+ }
+ if (currentPolicy.data.requireUpper) {
+ enforcedOptions.requireUpper = true;
+ }
+ if (currentPolicy.data.requireLower) {
+ enforcedOptions.requireLower = true;
+ }
+ if (currentPolicy.data.requireNumbers) {
+ enforcedOptions.requireNumbers = true;
+ }
+ if (currentPolicy.data.requireSpecial) {
+ enforcedOptions.requireSpecial = true;
+ }
+ });
+ return enforcedOptions;
+ });
+ }
+ evaluateMasterPassword(passwordStrength, newPassword, enforcedPolicyOptions) {
+ if (enforcedPolicyOptions == null) {
+ return true;
+ }
+ if (enforcedPolicyOptions.minComplexity > 0 && enforcedPolicyOptions.minComplexity > passwordStrength) {
+ return false;
+ }
+ if (enforcedPolicyOptions.minLength > 0 && enforcedPolicyOptions.minLength > newPassword.length) {
+ return false;
+ }
+ if (enforcedPolicyOptions.requireUpper && newPassword.toLocaleLowerCase() === newPassword) {
+ return false;
+ }
+ if (enforcedPolicyOptions.requireLower && newPassword.toLocaleUpperCase() === newPassword) {
+ return false;
+ }
+ if (enforcedPolicyOptions.requireNumbers && !(/[0-9]/.test(newPassword))) {
+ return false;
+ }
+ if (enforcedPolicyOptions.requireSpecial && !(/[!@#$%\^&*]/g.test(newPassword))) {
+ return false;
+ }
+ return true;
+ }
+ getResetPasswordPolicyOptions(policies, orgId) {
+ var _a, _b, _c;
+ const resetPasswordPolicyOptions = new _models_domain_resetPasswordPolicyOptions__WEBPACK_IMPORTED_MODULE_3__["ResetPasswordPolicyOptions"]();
+ if (policies == null || orgId == null) {
+ return [resetPasswordPolicyOptions, false];
+ }
+ const policy = policies.find(p => p.organizationId === orgId && p.type === _enums_policyType__WEBPACK_IMPORTED_MODULE_6__["PolicyType"].ResetPassword && p.enabled);
+ resetPasswordPolicyOptions.autoEnrollEnabled = (_b = (_a = policy === null || policy === void 0 ? void 0 : policy.data) === null || _a === void 0 ? void 0 : _a.autoEnrollEnabled) !== null && _b !== void 0 ? _b : false;
+ return [resetPasswordPolicyOptions, (_c = policy === null || policy === void 0 ? void 0 : policy.enabled) !== null && _c !== void 0 ? _c : false];
+ }
+ mapPoliciesFromToken(policiesResponse) {
+ if (policiesResponse == null || policiesResponse.data == null) {
+ return null;
+ }
+ const policiesData = policiesResponse.data.map(p => new _models_data_policyData__WEBPACK_IMPORTED_MODULE_0__["PolicyData"](p));
+ return policiesData.map(p => new _models_domain_policy__WEBPACK_IMPORTED_MODULE_2__["Policy"](p));
+ }
+ policyAppliesToUser(policyType, policyFilter) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const policies = yield this.getAll(policyType);
+ const organizations = yield this.userService.getAllOrganizations();
+ let filteredPolicies;
+ if (policyFilter != null) {
+ filteredPolicies = policies.filter(p => p.enabled && policyFilter(p));
+ }
+ else {
+ filteredPolicies = policies.filter(p => p.enabled);
+ }
+ const policySet = new Set(filteredPolicies.map(p => p.organizationId));
+ return organizations.some(o => o.enabled &&
+ o.status >= _enums_organizationUserStatusType__WEBPACK_IMPORTED_MODULE_4__["OrganizationUserStatusType"].Accepted &&
+ o.usePolicies &&
+ !this.isExcemptFromPolicies(o, policyType) &&
+ policySet.has(o.id));
+ });
+ }
+ isExcemptFromPolicies(organization, policyType) {
+ if (policyType === _enums_policyType__WEBPACK_IMPORTED_MODULE_6__["PolicyType"].MaximumVaultTimeout) {
+ return organization.type === _enums_organizationUserType__WEBPACK_IMPORTED_MODULE_5__["OrganizationUserType"].Owner;
+ }
+ return organization.isExemptFromPolicies;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/services/search.service.ts":
+/*!*****************************************************!*\
+ !*** ./jslib/common/src/services/search.service.ts ***!
+ \*****************************************************/
+/*! exports provided: SearchService */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SearchService", function() { return SearchService; });
+/* harmony import */ var lunr__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lunr */ "./node_modules/lunr/lunr.js");
+/* harmony import */ var lunr__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(lunr__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var _enums_cipherType__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../enums/cipherType */ "./jslib/common/src/enums/cipherType.ts");
+/* harmony import */ var _enums_fieldType__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../enums/fieldType */ "./jslib/common/src/enums/fieldType.ts");
+/* harmony import */ var _enums_uriMatchType__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../enums/uriMatchType */ "./jslib/common/src/enums/uriMatchType.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+
+
+class SearchService {
+ constructor(cipherService, logService, i18nService) {
+ this.cipherService = cipherService;
+ this.logService = logService;
+ this.i18nService = i18nService;
+ this.indexedEntityId = null;
+ this.indexing = false;
+ this.index = null;
+ this.searchableMinLength = 2;
+ if (['zh-CN', 'zh-TW'].indexOf(i18nService.locale) !== -1) {
+ this.searchableMinLength = 1;
+ }
+ }
+ clearIndex() {
+ this.indexedEntityId = null;
+ this.index = null;
+ }
+ isSearchable(query) {
+ const notSearchable = query == null || (this.index == null && query.length < this.searchableMinLength) ||
+ (this.index != null && query.length < this.searchableMinLength && query.indexOf('>') !== 0);
+ return !notSearchable;
+ }
+ indexCiphers(indexedEntityId, ciphers) {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (this.indexing) {
+ return;
+ }
+ this.logService.time('search indexing');
+ this.indexing = true;
+ this.indexedEntityId = indexedEntityId;
+ this.index = null;
+ const builder = new lunr__WEBPACK_IMPORTED_MODULE_0__["Builder"]();
+ builder.ref('id');
+ builder.field('shortid', { boost: 100, extractor: (c) => c.id.substr(0, 8) });
+ builder.field('name', { boost: 10 });
+ builder.field('subtitle', {
+ boost: 5,
+ extractor: (c) => {
+ if (c.subTitle != null && c.type === _enums_cipherType__WEBPACK_IMPORTED_MODULE_1__["CipherType"].Card) {
+ return c.subTitle.replace(/\*/g, '');
+ }
+ return c.subTitle;
+ },
+ });
+ builder.field('notes');
+ builder.field('login.username', {
+ extractor: (c) => c.type === _enums_cipherType__WEBPACK_IMPORTED_MODULE_1__["CipherType"].Login && c.login != null ? c.login.username : null,
+ });
+ builder.field('login.uris', { boost: 2, extractor: (c) => this.uriExtractor(c) });
+ builder.field('fields', { extractor: (c) => this.fieldExtractor(c, false) });
+ builder.field('fields_joined', { extractor: (c) => this.fieldExtractor(c, true) });
+ builder.field('attachments', { extractor: (c) => this.attachmentExtractor(c, false) });
+ builder.field('attachments_joined', { extractor: (c) => this.attachmentExtractor(c, true) });
+ builder.field('organizationid', { extractor: (c) => c.organizationId });
+ ciphers = ciphers || (yield this.cipherService.getAllDecrypted());
+ ciphers.forEach(c => builder.add(c));
+ this.index = builder.build();
+ this.indexing = false;
+ this.logService.timeEnd('search indexing');
+ });
+ }
+ searchCiphers(query, filter = null, ciphers = null) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const results = [];
+ if (query != null) {
+ query = query.trim().toLowerCase();
+ }
+ if (query === '') {
+ query = null;
+ }
+ if (ciphers == null) {
+ ciphers = yield this.cipherService.getAllDecrypted();
+ }
+ if (filter != null && Array.isArray(filter) && filter.length > 0) {
+ ciphers = ciphers.filter(c => filter.every(f => f == null || f(c)));
+ }
+ else if (filter != null) {
+ ciphers = ciphers.filter(filter);
+ }
+ if (!this.isSearchable(query)) {
+ return ciphers;
+ }
+ if (this.indexing) {
+ yield new Promise(r => setTimeout(r, 250));
+ if (this.indexing) {
+ yield new Promise(r => setTimeout(r, 500));
+ }
+ }
+ const index = this.getIndexForSearch();
+ if (index == null) {
+ // Fall back to basic search if index is not available
+ return this.searchCiphersBasic(ciphers, query);
+ }
+ const ciphersMap = new Map();
+ ciphers.forEach(c => ciphersMap.set(c.id, c));
+ let searchResults = null;
+ const isQueryString = query != null && query.length > 1 && query.indexOf('>') === 0;
+ if (isQueryString) {
+ try {
+ searchResults = index.search(query.substr(1).trim());
+ }
+ catch (e) {
+ this.logService.error(e);
+ }
+ }
+ else {
+ // tslint:disable-next-line
+ const soWild = lunr__WEBPACK_IMPORTED_MODULE_0__["Query"].wildcard.LEADING | lunr__WEBPACK_IMPORTED_MODULE_0__["Query"].wildcard.TRAILING;
+ searchResults = index.query(q => {
+ lunr__WEBPACK_IMPORTED_MODULE_0__["tokenizer"](query).forEach(token => {
+ const t = token.toString();
+ q.term(t, { fields: ['name'], wildcard: soWild });
+ q.term(t, { fields: ['subtitle'], wildcard: soWild });
+ q.term(t, { fields: ['login.uris'], wildcard: soWild });
+ q.term(t, {});
+ });
+ });
+ }
+ if (searchResults != null) {
+ searchResults.forEach(r => {
+ if (ciphersMap.has(r.ref)) {
+ results.push(ciphersMap.get(r.ref));
+ }
+ });
+ }
+ return results;
+ });
+ }
+ searchCiphersBasic(ciphers, query, deleted = false) {
+ query = query.trim().toLowerCase();
+ return ciphers.filter(c => {
+ if (deleted !== c.isDeleted) {
+ return false;
+ }
+ if (c.name != null && c.name.toLowerCase().indexOf(query) > -1) {
+ return true;
+ }
+ if (query.length >= 8 && c.id.startsWith(query)) {
+ return true;
+ }
+ if (c.subTitle != null && c.subTitle.toLowerCase().indexOf(query) > -1) {
+ return true;
+ }
+ if (c.login && c.login.uri != null && c.login.uri.toLowerCase().indexOf(query) > -1) {
+ return true;
+ }
+ return false;
+ });
+ }
+ searchSends(sends, query) {
+ query = query.trim().toLocaleLowerCase();
+ return sends.filter(s => {
+ var _a, _b, _c;
+ if (s.name != null && s.name.toLowerCase().indexOf(query) > -1) {
+ return true;
+ }
+ if (query.length >= 8 && (s.id.startsWith(query) || s.accessId.toLocaleLowerCase().startsWith(query) || (((_a = s.file) === null || _a === void 0 ? void 0 : _a.id) != null && s.file.id.startsWith(query)))) {
+ return true;
+ }
+ if (s.notes != null && s.notes.toLowerCase().indexOf(query) > -1) {
+ return true;
+ }
+ if (((_b = s.text) === null || _b === void 0 ? void 0 : _b.text) != null && s.text.text.toLowerCase().indexOf(query) > -1) {
+ return true;
+ }
+ if (((_c = s.file) === null || _c === void 0 ? void 0 : _c.fileName) != null && s.file.fileName.toLowerCase().indexOf(query) > -1) {
+ return true;
+ }
+ });
+ }
+ getIndexForSearch() {
+ return this.index;
+ }
+ fieldExtractor(c, joined) {
+ if (!c.hasFields) {
+ return null;
+ }
+ let fields = [];
+ c.fields.forEach(f => {
+ if (f.name != null) {
+ fields.push(f.name);
+ }
+ if (f.type === _enums_fieldType__WEBPACK_IMPORTED_MODULE_2__["FieldType"].Text && f.value != null) {
+ fields.push(f.value);
+ }
+ });
+ fields = fields.filter(f => f.trim() !== '');
+ if (fields.length === 0) {
+ return null;
+ }
+ return joined ? fields.join(' ') : fields;
+ }
+ attachmentExtractor(c, joined) {
+ if (!c.hasAttachments) {
+ return null;
+ }
+ let attachments = [];
+ c.attachments.forEach(a => {
+ if (a != null && a.fileName != null) {
+ if (joined && a.fileName.indexOf('.') > -1) {
+ attachments.push(a.fileName.substr(0, a.fileName.lastIndexOf('.')));
+ }
+ else {
+ attachments.push(a.fileName);
+ }
+ }
+ });
+ attachments = attachments.filter(f => f.trim() !== '');
+ if (attachments.length === 0) {
+ return null;
+ }
+ return joined ? attachments.join(' ') : attachments;
+ }
+ uriExtractor(c) {
+ if (c.type !== _enums_cipherType__WEBPACK_IMPORTED_MODULE_1__["CipherType"].Login || c.login == null || !c.login.hasUris) {
+ return null;
+ }
+ const uris = [];
+ c.login.uris.forEach(u => {
+ if (u.uri == null || u.uri === '') {
+ return;
+ }
+ if (u.hostname != null) {
+ uris.push(u.hostname);
+ return;
+ }
+ let uri = u.uri;
+ if (u.match !== _enums_uriMatchType__WEBPACK_IMPORTED_MODULE_3__["UriMatchType"].RegularExpression) {
+ const protocolIndex = uri.indexOf('://');
+ if (protocolIndex > -1) {
+ uri = uri.substr(protocolIndex + 3);
+ }
+ const queryIndex = uri.search(/\?|&|#/);
+ if (queryIndex > -1) {
+ uri = uri.substring(0, queryIndex);
+ }
+ }
+ uris.push(uri);
+ });
+ return uris.length > 0 ? uris : null;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/services/send.service.ts":
+/*!***************************************************!*\
+ !*** ./jslib/common/src/services/send.service.ts ***!
+ \***************************************************/
+/*! exports provided: SendService */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* WEBPACK VAR INJECTION */(function(Buffer) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SendService", function() { return SendService; });
+/* harmony import */ var _models_data_sendData__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../models/data/sendData */ "./jslib/common/src/models/data/sendData.ts");
+/* harmony import */ var _models_request_sendRequest__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../models/request/sendRequest */ "./jslib/common/src/models/request/sendRequest.ts");
+/* harmony import */ var _models_response_errorResponse__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../models/response/errorResponse */ "./jslib/common/src/models/response/errorResponse.ts");
+/* harmony import */ var _models_domain_send__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../models/domain/send */ "./jslib/common/src/models/domain/send.ts");
+/* harmony import */ var _models_domain_sendFile__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../models/domain/sendFile */ "./jslib/common/src/models/domain/sendFile.ts");
+/* harmony import */ var _models_domain_sendText__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../models/domain/sendText */ "./jslib/common/src/models/domain/sendText.ts");
+/* harmony import */ var _enums_sendType__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../enums/sendType */ "./jslib/common/src/enums/sendType.ts");
+/* harmony import */ var _misc_utils__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../misc/utils */ "./jslib/common/src/misc/utils.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+
+
+
+
+
+
+const Keys = {
+ sendsPrefix: 'sends_',
+};
+class SendService {
+ constructor(cryptoService, userService, apiService, fileUploadService, storageService, i18nService, cryptoFunctionService) {
+ this.cryptoService = cryptoService;
+ this.userService = userService;
+ this.apiService = apiService;
+ this.fileUploadService = fileUploadService;
+ this.storageService = storageService;
+ this.i18nService = i18nService;
+ this.cryptoFunctionService = cryptoFunctionService;
+ }
+ clearCache() {
+ this.decryptedSendCache = null;
+ }
+ encrypt(model, file, password, key) {
+ return __awaiter(this, void 0, void 0, function* () {
+ let fileData = null;
+ const send = new _models_domain_send__WEBPACK_IMPORTED_MODULE_3__["Send"]();
+ send.id = model.id;
+ send.type = model.type;
+ send.disabled = model.disabled;
+ send.hideEmail = model.hideEmail;
+ send.maxAccessCount = model.maxAccessCount;
+ if (model.key == null) {
+ model.key = yield this.cryptoFunctionService.randomBytes(16);
+ model.cryptoKey = yield this.cryptoService.makeSendKey(model.key);
+ }
+ if (password != null) {
+ const passwordHash = yield this.cryptoFunctionService.pbkdf2(password, model.key, 'sha256', 100000);
+ send.password = _misc_utils__WEBPACK_IMPORTED_MODULE_7__["Utils"].fromBufferToB64(passwordHash);
+ }
+ send.key = yield this.cryptoService.encrypt(model.key, key);
+ send.name = yield this.cryptoService.encrypt(model.name, model.cryptoKey);
+ send.notes = yield this.cryptoService.encrypt(model.notes, model.cryptoKey);
+ if (send.type === _enums_sendType__WEBPACK_IMPORTED_MODULE_6__["SendType"].Text) {
+ send.text = new _models_domain_sendText__WEBPACK_IMPORTED_MODULE_5__["SendText"]();
+ send.text.text = yield this.cryptoService.encrypt(model.text.text, model.cryptoKey);
+ send.text.hidden = model.text.hidden;
+ }
+ else if (send.type === _enums_sendType__WEBPACK_IMPORTED_MODULE_6__["SendType"].File) {
+ send.file = new _models_domain_sendFile__WEBPACK_IMPORTED_MODULE_4__["SendFile"]();
+ if (file != null) {
+ if (file instanceof ArrayBuffer) {
+ const [name, data] = yield this.encryptFileData(model.file.fileName, file, model.cryptoKey);
+ send.file.fileName = name;
+ fileData = data;
+ }
+ else {
+ fileData = yield this.parseFile(send, file, model.cryptoKey);
+ }
+ }
+ }
+ return [send, fileData];
+ });
+ }
+ get(id) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const userId = yield this.userService.getUserId();
+ const sends = yield this.storageService.get(Keys.sendsPrefix + userId);
+ if (sends == null || !sends.hasOwnProperty(id)) {
+ return null;
+ }
+ return new _models_domain_send__WEBPACK_IMPORTED_MODULE_3__["Send"](sends[id]);
+ });
+ }
+ getAll() {
+ return __awaiter(this, void 0, void 0, function* () {
+ const userId = yield this.userService.getUserId();
+ const sends = yield this.storageService.get(Keys.sendsPrefix + userId);
+ const response = [];
+ for (const id in sends) {
+ if (sends.hasOwnProperty(id)) {
+ response.push(new _models_domain_send__WEBPACK_IMPORTED_MODULE_3__["Send"](sends[id]));
+ }
+ }
+ return response;
+ });
+ }
+ getAllDecrypted() {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (this.decryptedSendCache != null) {
+ return this.decryptedSendCache;
+ }
+ const hasKey = yield this.cryptoService.hasKey();
+ if (!hasKey) {
+ throw new Error('No key.');
+ }
+ const decSends = [];
+ const promises = [];
+ const sends = yield this.getAll();
+ sends.forEach(send => {
+ promises.push(send.decrypt().then(f => decSends.push(f)));
+ });
+ yield Promise.all(promises);
+ decSends.sort(_misc_utils__WEBPACK_IMPORTED_MODULE_7__["Utils"].getSortFunction(this.i18nService, 'name'));
+ this.decryptedSendCache = decSends;
+ return this.decryptedSendCache;
+ });
+ }
+ saveWithServer(sendData) {
+ var _a;
+ return __awaiter(this, void 0, void 0, function* () {
+ const request = new _models_request_sendRequest__WEBPACK_IMPORTED_MODULE_1__["SendRequest"](sendData[0], (_a = sendData[1]) === null || _a === void 0 ? void 0 : _a.buffer.byteLength);
+ let response;
+ if (sendData[0].id == null) {
+ if (sendData[0].type === _enums_sendType__WEBPACK_IMPORTED_MODULE_6__["SendType"].Text) {
+ response = yield this.apiService.postSend(request);
+ }
+ else {
+ try {
+ const uploadDataResponse = yield this.apiService.postFileTypeSend(request);
+ response = uploadDataResponse.sendResponse;
+ yield this.fileUploadService.uploadSendFile(uploadDataResponse, sendData[0].file.fileName, sendData[1]);
+ }
+ catch (e) {
+ if (e instanceof _models_response_errorResponse__WEBPACK_IMPORTED_MODULE_2__["ErrorResponse"] && e.statusCode === 404) {
+ response = yield this.legacyServerSendFileUpload(sendData, request);
+ }
+ else if (e instanceof _models_response_errorResponse__WEBPACK_IMPORTED_MODULE_2__["ErrorResponse"]) {
+ throw new Error(e.getSingleMessage());
+ }
+ else {
+ throw e;
+ }
+ }
+ }
+ sendData[0].id = response.id;
+ sendData[0].accessId = response.accessId;
+ }
+ else {
+ response = yield this.apiService.putSend(sendData[0].id, request);
+ }
+ const userId = yield this.userService.getUserId();
+ const data = new _models_data_sendData__WEBPACK_IMPORTED_MODULE_0__["SendData"](response, userId);
+ yield this.upsert(data);
+ });
+ }
+ /**
+ * @deprecated Mar 25 2021: This method has been deprecated in favor of direct uploads.
+ * This method still exists for backward compatibility with old server versions.
+ */
+ legacyServerSendFileUpload(sendData, request) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const fd = new FormData();
+ try {
+ const blob = new Blob([sendData[1].buffer], { type: 'application/octet-stream' });
+ fd.append('model', JSON.stringify(request));
+ fd.append('data', blob, sendData[0].file.fileName.encryptedString);
+ }
+ catch (e) {
+ if (_misc_utils__WEBPACK_IMPORTED_MODULE_7__["Utils"].isNode && !_misc_utils__WEBPACK_IMPORTED_MODULE_7__["Utils"].isBrowser) {
+ fd.append('model', JSON.stringify(request));
+ fd.append('data', Buffer.from(sendData[1].buffer), {
+ filepath: sendData[0].file.fileName.encryptedString,
+ contentType: 'application/octet-stream',
+ });
+ }
+ else {
+ throw e;
+ }
+ }
+ return yield this.apiService.postSendFileLegacy(fd);
+ });
+ }
+ upsert(send) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const userId = yield this.userService.getUserId();
+ let sends = yield this.storageService.get(Keys.sendsPrefix + userId);
+ if (sends == null) {
+ sends = {};
+ }
+ if (send instanceof _models_data_sendData__WEBPACK_IMPORTED_MODULE_0__["SendData"]) {
+ const s = send;
+ sends[s.id] = s;
+ }
+ else {
+ send.forEach(s => {
+ sends[s.id] = s;
+ });
+ }
+ yield this.storageService.save(Keys.sendsPrefix + userId, sends);
+ this.decryptedSendCache = null;
+ });
+ }
+ replace(sends) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const userId = yield this.userService.getUserId();
+ yield this.storageService.save(Keys.sendsPrefix + userId, sends);
+ this.decryptedSendCache = null;
+ });
+ }
+ clear(userId) {
+ return __awaiter(this, void 0, void 0, function* () {
+ yield this.storageService.remove(Keys.sendsPrefix + userId);
+ this.decryptedSendCache = null;
+ });
+ }
+ delete(id) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const userId = yield this.userService.getUserId();
+ const sends = yield this.storageService.get(Keys.sendsPrefix + userId);
+ if (sends == null) {
+ return;
+ }
+ if (typeof id === 'string') {
+ if (sends[id] == null) {
+ return;
+ }
+ delete sends[id];
+ }
+ else {
+ id.forEach(i => {
+ delete sends[i];
+ });
+ }
+ yield this.storageService.save(Keys.sendsPrefix + userId, sends);
+ this.decryptedSendCache = null;
+ });
+ }
+ deleteWithServer(id) {
+ return __awaiter(this, void 0, void 0, function* () {
+ yield this.apiService.deleteSend(id);
+ yield this.delete(id);
+ });
+ }
+ removePasswordWithServer(id) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const response = yield this.apiService.putSendRemovePassword(id);
+ const userId = yield this.userService.getUserId();
+ const data = new _models_data_sendData__WEBPACK_IMPORTED_MODULE_0__["SendData"](response, userId);
+ yield this.upsert(data);
+ });
+ }
+ parseFile(send, file, key) {
+ return new Promise((resolve, reject) => {
+ const reader = new FileReader();
+ reader.readAsArrayBuffer(file);
+ reader.onload = (evt) => __awaiter(this, void 0, void 0, function* () {
+ try {
+ const [name, data] = yield this.encryptFileData(file.name, evt.target.result, key);
+ send.file.fileName = name;
+ resolve(data);
+ }
+ catch (e) {
+ reject(e);
+ }
+ });
+ reader.onerror = evt => {
+ reject('Error reading file.');
+ };
+ });
+ }
+ encryptFileData(fileName, data, key) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const encFileName = yield this.cryptoService.encrypt(fileName, key);
+ const encFileData = yield this.cryptoService.encryptToBytes(data, key);
+ return [encFileName, encFileData];
+ });
+ }
+}
+
+/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../../node_modules/buffer/index.js */ "./node_modules/buffer/index.js").Buffer))
+
+/***/ }),
+
+/***/ "./jslib/common/src/services/settings.service.ts":
+/*!*******************************************************!*\
+ !*** ./jslib/common/src/services/settings.service.ts ***!
+ \*******************************************************/
+/*! exports provided: SettingsService */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SettingsService", function() { return SettingsService; });
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+const Keys = {
+ settingsPrefix: 'settings_',
+ equivalentDomains: 'equivalentDomains',
+};
+class SettingsService {
+ constructor(userService, storageService) {
+ this.userService = userService;
+ this.storageService = storageService;
+ }
+ clearCache() {
+ this.settingsCache = null;
+ }
+ getEquivalentDomains() {
+ return this.getSettingsKey(Keys.equivalentDomains);
+ }
+ setEquivalentDomains(equivalentDomains) {
+ return __awaiter(this, void 0, void 0, function* () {
+ yield this.setSettingsKey(Keys.equivalentDomains, equivalentDomains);
+ });
+ }
+ clear(userId) {
+ return __awaiter(this, void 0, void 0, function* () {
+ yield this.storageService.remove(Keys.settingsPrefix + userId);
+ this.clearCache();
+ });
+ }
+ // Helpers
+ getSettings() {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (this.settingsCache == null) {
+ const userId = yield this.userService.getUserId();
+ this.settingsCache = this.storageService.get(Keys.settingsPrefix + userId);
+ }
+ return this.settingsCache;
+ });
+ }
+ getSettingsKey(key) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const settings = yield this.getSettings();
+ if (settings != null && settings[key]) {
+ return settings[key];
+ }
+ return null;
+ });
+ }
+ setSettingsKey(key, value) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const userId = yield this.userService.getUserId();
+ let settings = yield this.getSettings();
+ if (!settings) {
+ settings = {};
+ }
+ settings[key] = value;
+ yield this.storageService.save(Keys.settingsPrefix + userId, settings);
+ this.settingsCache = settings;
+ });
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/services/state.service.ts":
+/*!****************************************************!*\
+ !*** ./jslib/common/src/services/state.service.ts ***!
+ \****************************************************/
+/*! exports provided: StateService */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "StateService", function() { return StateService; });
+class StateService {
+ constructor() {
+ this.state = {};
+ }
+ get(key) {
+ if (this.state.hasOwnProperty(key)) {
+ return Promise.resolve(this.state[key]);
+ }
+ return Promise.resolve(null);
+ }
+ save(key, obj) {
+ this.state[key] = obj;
+ return Promise.resolve();
+ }
+ remove(key) {
+ delete this.state[key];
+ return Promise.resolve();
+ }
+ purge() {
+ this.state = {};
+ return Promise.resolve();
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/services/sync.service.ts":
+/*!***************************************************!*\
+ !*** ./jslib/common/src/services/sync.service.ts ***!
+ \***************************************************/
+/*! exports provided: SyncService */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SyncService", function() { return SyncService; });
+/* harmony import */ var _models_data_cipherData__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../models/data/cipherData */ "./jslib/common/src/models/data/cipherData.ts");
+/* harmony import */ var _models_data_collectionData__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../models/data/collectionData */ "./jslib/common/src/models/data/collectionData.ts");
+/* harmony import */ var _models_data_folderData__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../models/data/folderData */ "./jslib/common/src/models/data/folderData.ts");
+/* harmony import */ var _models_data_organizationData__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../models/data/organizationData */ "./jslib/common/src/models/data/organizationData.ts");
+/* harmony import */ var _models_data_policyData__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../models/data/policyData */ "./jslib/common/src/models/data/policyData.ts");
+/* harmony import */ var _models_data_providerData__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../models/data/providerData */ "./jslib/common/src/models/data/providerData.ts");
+/* harmony import */ var _models_data_sendData__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../models/data/sendData */ "./jslib/common/src/models/data/sendData.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+
+
+
+
+
+const Keys = {
+ lastSyncPrefix: 'lastSync_',
+};
+class SyncService {
+ constructor(userService, apiService, settingsService, folderService, cipherService, cryptoService, collectionService, storageService, messagingService, policyService, sendService, logService, logoutCallback) {
+ this.userService = userService;
+ this.apiService = apiService;
+ this.settingsService = settingsService;
+ this.folderService = folderService;
+ this.cipherService = cipherService;
+ this.cryptoService = cryptoService;
+ this.collectionService = collectionService;
+ this.storageService = storageService;
+ this.messagingService = messagingService;
+ this.policyService = policyService;
+ this.sendService = sendService;
+ this.logService = logService;
+ this.logoutCallback = logoutCallback;
+ this.syncInProgress = false;
+ }
+ getLastSync() {
+ return __awaiter(this, void 0, void 0, function* () {
+ const userId = yield this.userService.getUserId();
+ if (userId == null) {
+ return null;
+ }
+ const lastSync = yield this.storageService.get(Keys.lastSyncPrefix + userId);
+ if (lastSync) {
+ return new Date(lastSync);
+ }
+ return null;
+ });
+ }
+ setLastSync(date) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const userId = yield this.userService.getUserId();
+ if (userId == null) {
+ return;
+ }
+ yield this.storageService.save(Keys.lastSyncPrefix + userId, date.toJSON());
+ });
+ }
+ fullSync(forceSync, allowThrowOnError = false) {
+ return __awaiter(this, void 0, void 0, function* () {
+ this.syncStarted();
+ const isAuthenticated = yield this.userService.isAuthenticated();
+ if (!isAuthenticated) {
+ return this.syncCompleted(false);
+ }
+ const now = new Date();
+ let needsSync = false;
+ try {
+ needsSync = yield this.needsSyncing(forceSync);
+ }
+ catch (e) {
+ if (allowThrowOnError) {
+ throw e;
+ }
+ }
+ if (!needsSync) {
+ yield this.setLastSync(now);
+ return this.syncCompleted(false);
+ }
+ const userId = yield this.userService.getUserId();
+ try {
+ yield this.apiService.refreshIdentityToken();
+ const response = yield this.apiService.getSync();
+ yield this.syncProfile(response.profile);
+ yield this.syncFolders(userId, response.folders);
+ yield this.syncCollections(response.collections);
+ yield this.syncCiphers(userId, response.ciphers);
+ yield this.syncSends(userId, response.sends);
+ yield this.syncSettings(userId, response.domains);
+ yield this.syncPolicies(response.policies);
+ yield this.setLastSync(now);
+ return this.syncCompleted(true);
+ }
+ catch (e) {
+ if (allowThrowOnError) {
+ throw e;
+ }
+ else {
+ return this.syncCompleted(false);
+ }
+ }
+ });
+ }
+ syncUpsertFolder(notification, isEdit) {
+ return __awaiter(this, void 0, void 0, function* () {
+ this.syncStarted();
+ if (yield this.userService.isAuthenticated()) {
+ try {
+ const localFolder = yield this.folderService.get(notification.id);
+ if ((!isEdit && localFolder == null) ||
+ (isEdit && localFolder != null && localFolder.revisionDate < notification.revisionDate)) {
+ const remoteFolder = yield this.apiService.getFolder(notification.id);
+ if (remoteFolder != null) {
+ const userId = yield this.userService.getUserId();
+ yield this.folderService.upsert(new _models_data_folderData__WEBPACK_IMPORTED_MODULE_2__["FolderData"](remoteFolder, userId));
+ this.messagingService.send('syncedUpsertedFolder', { folderId: notification.id });
+ return this.syncCompleted(true);
+ }
+ }
+ }
+ catch (e) {
+ this.logService.error(e);
+ }
+ }
+ return this.syncCompleted(false);
+ });
+ }
+ syncDeleteFolder(notification) {
+ return __awaiter(this, void 0, void 0, function* () {
+ this.syncStarted();
+ if (yield this.userService.isAuthenticated()) {
+ yield this.folderService.delete(notification.id);
+ this.messagingService.send('syncedDeletedFolder', { folderId: notification.id });
+ this.syncCompleted(true);
+ return true;
+ }
+ return this.syncCompleted(false);
+ });
+ }
+ syncUpsertCipher(notification, isEdit) {
+ return __awaiter(this, void 0, void 0, function* () {
+ this.syncStarted();
+ if (yield this.userService.isAuthenticated()) {
+ try {
+ let shouldUpdate = true;
+ const localCipher = yield this.cipherService.get(notification.id);
+ if (localCipher != null && localCipher.revisionDate >= notification.revisionDate) {
+ shouldUpdate = false;
+ }
+ let checkCollections = false;
+ if (shouldUpdate) {
+ if (isEdit) {
+ shouldUpdate = localCipher != null;
+ checkCollections = true;
+ }
+ else {
+ if (notification.collectionIds == null || notification.organizationId == null) {
+ shouldUpdate = localCipher == null;
+ }
+ else {
+ shouldUpdate = false;
+ checkCollections = true;
+ }
+ }
+ }
+ if (!shouldUpdate && checkCollections && notification.organizationId != null &&
+ notification.collectionIds != null && notification.collectionIds.length > 0) {
+ const collections = yield this.collectionService.getAll();
+ if (collections != null) {
+ for (let i = 0; i < collections.length; i++) {
+ if (notification.collectionIds.indexOf(collections[i].id) > -1) {
+ shouldUpdate = true;
+ break;
+ }
+ }
+ }
+ }
+ if (shouldUpdate) {
+ const remoteCipher = yield this.apiService.getCipher(notification.id);
+ if (remoteCipher != null) {
+ const userId = yield this.userService.getUserId();
+ yield this.cipherService.upsert(new _models_data_cipherData__WEBPACK_IMPORTED_MODULE_0__["CipherData"](remoteCipher, userId));
+ this.messagingService.send('syncedUpsertedCipher', { cipherId: notification.id });
+ return this.syncCompleted(true);
+ }
+ }
+ }
+ catch (e) {
+ if (e != null && e.statusCode === 404 && isEdit) {
+ yield this.cipherService.delete(notification.id);
+ this.messagingService.send('syncedDeletedCipher', { cipherId: notification.id });
+ return this.syncCompleted(true);
+ }
+ }
+ }
+ return this.syncCompleted(false);
+ });
+ }
+ syncDeleteCipher(notification) {
+ return __awaiter(this, void 0, void 0, function* () {
+ this.syncStarted();
+ if (yield this.userService.isAuthenticated()) {
+ yield this.cipherService.delete(notification.id);
+ this.messagingService.send('syncedDeletedCipher', { cipherId: notification.id });
+ return this.syncCompleted(true);
+ }
+ return this.syncCompleted(false);
+ });
+ }
+ syncUpsertSend(notification, isEdit) {
+ return __awaiter(this, void 0, void 0, function* () {
+ this.syncStarted();
+ if (yield this.userService.isAuthenticated()) {
+ try {
+ const localSend = yield this.sendService.get(notification.id);
+ if ((!isEdit && localSend == null) ||
+ (isEdit && localSend != null && localSend.revisionDate < notification.revisionDate)) {
+ const remoteSend = yield this.apiService.getSend(notification.id);
+ if (remoteSend != null) {
+ const userId = yield this.userService.getUserId();
+ yield this.sendService.upsert(new _models_data_sendData__WEBPACK_IMPORTED_MODULE_6__["SendData"](remoteSend, userId));
+ this.messagingService.send('syncedUpsertedSend', { sendId: notification.id });
+ return this.syncCompleted(true);
+ }
+ }
+ }
+ catch (e) {
+ this.logService.error(e);
+ }
+ }
+ return this.syncCompleted(false);
+ });
+ }
+ syncDeleteSend(notification) {
+ return __awaiter(this, void 0, void 0, function* () {
+ this.syncStarted();
+ if (yield this.userService.isAuthenticated()) {
+ yield this.sendService.delete(notification.id);
+ this.messagingService.send('syncedDeletedSend', { sendId: notification.id });
+ this.syncCompleted(true);
+ return true;
+ }
+ return this.syncCompleted(false);
+ });
+ }
+ // Helpers
+ syncStarted() {
+ this.syncInProgress = true;
+ this.messagingService.send('syncStarted');
+ }
+ syncCompleted(successfully) {
+ this.syncInProgress = false;
+ this.messagingService.send('syncCompleted', { successfully: successfully });
+ return successfully;
+ }
+ needsSyncing(forceSync) {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (forceSync) {
+ return true;
+ }
+ const lastSync = yield this.getLastSync();
+ if (lastSync == null || lastSync.getTime() === 0) {
+ return true;
+ }
+ const response = yield this.apiService.getAccountRevisionDate();
+ if (new Date(response) <= lastSync) {
+ return false;
+ }
+ return true;
+ });
+ }
+ syncProfile(response) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const stamp = yield this.userService.getSecurityStamp();
+ if (stamp != null && stamp !== response.securityStamp) {
+ if (this.logoutCallback != null) {
+ yield this.logoutCallback(true);
+ }
+ throw new Error('Stamp has changed');
+ }
+ yield this.cryptoService.setEncKey(response.key);
+ yield this.cryptoService.setEncPrivateKey(response.privateKey);
+ yield this.cryptoService.setProviderKeys(response.providers);
+ yield this.cryptoService.setOrgKeys(response.organizations, response.providerOrganizations);
+ yield this.userService.setSecurityStamp(response.securityStamp);
+ yield this.userService.setEmailVerified(response.emailVerified);
+ yield this.userService.setForcePasswordReset(response.forcePasswordReset);
+ const organizations = {};
+ response.organizations.forEach(o => {
+ organizations[o.id] = new _models_data_organizationData__WEBPACK_IMPORTED_MODULE_3__["OrganizationData"](o);
+ });
+ const providers = {};
+ response.providers.forEach(p => {
+ providers[p.id] = new _models_data_providerData__WEBPACK_IMPORTED_MODULE_5__["ProviderData"](p);
+ });
+ response.providerOrganizations.forEach(o => {
+ if (organizations[o.id] == null) {
+ organizations[o.id] = new _models_data_organizationData__WEBPACK_IMPORTED_MODULE_3__["OrganizationData"](o);
+ organizations[o.id].isProviderUser = true;
+ }
+ });
+ return Promise.all([
+ this.userService.replaceOrganizations(organizations),
+ this.userService.replaceProviders(providers),
+ ]);
+ });
+ }
+ syncFolders(userId, response) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const folders = {};
+ response.forEach(f => {
+ folders[f.id] = new _models_data_folderData__WEBPACK_IMPORTED_MODULE_2__["FolderData"](f, userId);
+ });
+ return yield this.folderService.replace(folders);
+ });
+ }
+ syncCollections(response) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const collections = {};
+ response.forEach(c => {
+ collections[c.id] = new _models_data_collectionData__WEBPACK_IMPORTED_MODULE_1__["CollectionData"](c);
+ });
+ return yield this.collectionService.replace(collections);
+ });
+ }
+ syncCiphers(userId, response) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const ciphers = {};
+ response.forEach(c => {
+ ciphers[c.id] = new _models_data_cipherData__WEBPACK_IMPORTED_MODULE_0__["CipherData"](c, userId);
+ });
+ return yield this.cipherService.replace(ciphers);
+ });
+ }
+ syncSends(userId, response) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const sends = {};
+ response.forEach(s => {
+ sends[s.id] = new _models_data_sendData__WEBPACK_IMPORTED_MODULE_6__["SendData"](s, userId);
+ });
+ return yield this.sendService.replace(sends);
+ });
+ }
+ syncSettings(userId, response) {
+ return __awaiter(this, void 0, void 0, function* () {
+ let eqDomains = [];
+ if (response != null && response.equivalentDomains != null) {
+ eqDomains = eqDomains.concat(response.equivalentDomains);
+ }
+ if (response != null && response.globalEquivalentDomains != null) {
+ response.globalEquivalentDomains.forEach(global => {
+ if (global.domains.length > 0) {
+ eqDomains.push(global.domains);
+ }
+ });
+ }
+ return this.settingsService.setEquivalentDomains(eqDomains);
+ });
+ }
+ syncPolicies(response) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const policies = {};
+ if (response != null) {
+ response.forEach(p => {
+ policies[p.id] = new _models_data_policyData__WEBPACK_IMPORTED_MODULE_4__["PolicyData"](p);
+ });
+ }
+ return yield this.policyService.replace(policies);
+ });
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/services/system.service.ts":
+/*!*****************************************************!*\
+ !*** ./jslib/common/src/services/system.service.ts ***!
+ \*****************************************************/
+/*! exports provided: SystemService */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SystemService", function() { return SystemService; });
+/* harmony import */ var _constants_service__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./constants.service */ "./jslib/common/src/services/constants.service.ts");
+/* harmony import */ var _misc_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../misc/utils */ "./jslib/common/src/misc/utils.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+class SystemService {
+ constructor(storageService, vaultTimeoutService, messagingService, platformUtilsService, reloadCallback = null) {
+ this.storageService = storageService;
+ this.vaultTimeoutService = vaultTimeoutService;
+ this.messagingService = messagingService;
+ this.platformUtilsService = platformUtilsService;
+ this.reloadCallback = reloadCallback;
+ this.reloadInterval = null;
+ this.clearClipboardTimeout = null;
+ this.clearClipboardTimeoutFunction = null;
+ }
+ startProcessReload() {
+ if (this.vaultTimeoutService.pinProtectedKey != null ||
+ this.vaultTimeoutService.biometricLocked ||
+ this.reloadInterval != null) {
+ return;
+ }
+ this.cancelProcessReload();
+ this.reloadInterval = setInterval(() => __awaiter(this, void 0, void 0, function* () {
+ let doRefresh = false;
+ const lastActive = yield this.storageService.get(_constants_service__WEBPACK_IMPORTED_MODULE_0__["ConstantsService"].lastActiveKey);
+ if (lastActive != null) {
+ const diffSeconds = (new Date()).getTime() - lastActive;
+ // Don't refresh if they are still active in the window
+ doRefresh = diffSeconds >= 5000;
+ }
+ const biometricLockedFingerprintValidated = (yield this.storageService.get(_constants_service__WEBPACK_IMPORTED_MODULE_0__["ConstantsService"].biometricFingerprintValidated)) && this.vaultTimeoutService.biometricLocked;
+ if (doRefresh && !biometricLockedFingerprintValidated) {
+ clearInterval(this.reloadInterval);
+ this.reloadInterval = null;
+ this.messagingService.send('reloadProcess');
+ if (this.reloadCallback != null) {
+ yield this.reloadCallback();
+ }
+ }
+ }), 10000);
+ }
+ cancelProcessReload() {
+ if (this.reloadInterval != null) {
+ clearInterval(this.reloadInterval);
+ this.reloadInterval = null;
+ }
+ }
+ clearClipboard(clipboardValue, timeoutMs = null) {
+ if (this.clearClipboardTimeout != null) {
+ clearTimeout(this.clearClipboardTimeout);
+ this.clearClipboardTimeout = null;
+ }
+ if (_misc_utils__WEBPACK_IMPORTED_MODULE_1__["Utils"].isNullOrWhitespace(clipboardValue)) {
+ return;
+ }
+ this.storageService.get(_constants_service__WEBPACK_IMPORTED_MODULE_0__["ConstantsService"].clearClipboardKey).then(clearSeconds => {
+ if (clearSeconds == null) {
+ return;
+ }
+ if (timeoutMs == null) {
+ timeoutMs = clearSeconds * 1000;
+ }
+ this.clearClipboardTimeoutFunction = () => __awaiter(this, void 0, void 0, function* () {
+ const clipboardValueNow = yield this.platformUtilsService.readFromClipboard();
+ if (clipboardValue === clipboardValueNow) {
+ this.platformUtilsService.copyToClipboard('', { clearing: true });
+ }
+ });
+ this.clearClipboardTimeout = setTimeout(() => __awaiter(this, void 0, void 0, function* () {
+ yield this.clearPendingClipboard();
+ }), timeoutMs);
+ });
+ }
+ clearPendingClipboard() {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (this.clearClipboardTimeoutFunction != null) {
+ yield this.clearClipboardTimeoutFunction();
+ this.clearClipboardTimeoutFunction = null;
+ }
+ });
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/services/token.service.ts":
+/*!****************************************************!*\
+ !*** ./jslib/common/src/services/token.service.ts ***!
+ \****************************************************/
+/*! exports provided: TokenService */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TokenService", function() { return TokenService; });
+/* harmony import */ var _constants_service__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./constants.service */ "./jslib/common/src/services/constants.service.ts");
+/* harmony import */ var _misc_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../misc/utils */ "./jslib/common/src/misc/utils.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+const Keys = {
+ accessToken: 'accessToken',
+ refreshToken: 'refreshToken',
+ twoFactorTokenPrefix: 'twoFactorToken_',
+ clientId: 'apikey_clientId',
+ clientSecret: 'apikey_clientSecret',
+};
+class TokenService {
+ constructor(storageService) {
+ this.storageService = storageService;
+ }
+ setTokens(accessToken, refreshToken, clientIdClientSecret) {
+ return __awaiter(this, void 0, void 0, function* () {
+ yield this.setToken(accessToken);
+ yield this.setRefreshToken(refreshToken);
+ if (clientIdClientSecret != null) {
+ yield this.setClientId(clientIdClientSecret[0]);
+ yield this.setClientSecret(clientIdClientSecret[1]);
+ }
+ });
+ }
+ setClientId(clientId) {
+ return __awaiter(this, void 0, void 0, function* () {
+ this.clientId = clientId;
+ return this.storeTokenValue(Keys.clientId, clientId);
+ });
+ }
+ getClientId() {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (this.clientId != null) {
+ return this.clientId;
+ }
+ this.clientId = yield this.storageService.get(Keys.clientId);
+ return this.clientId;
+ });
+ }
+ setClientSecret(clientSecret) {
+ return __awaiter(this, void 0, void 0, function* () {
+ this.clientSecret = clientSecret;
+ return this.storeTokenValue(Keys.clientSecret, clientSecret);
+ });
+ }
+ getClientSecret() {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (this.clientSecret != null) {
+ return this.clientSecret;
+ }
+ this.clientSecret = yield this.storageService.get(Keys.clientSecret);
+ return this.clientSecret;
+ });
+ }
+ setToken(token) {
+ return __awaiter(this, void 0, void 0, function* () {
+ this.token = token;
+ this.decodedToken = null;
+ return this.storeTokenValue(Keys.accessToken, token);
+ });
+ }
+ getToken() {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (this.token != null) {
+ return this.token;
+ }
+ this.token = yield this.storageService.get(Keys.accessToken);
+ return this.token;
+ });
+ }
+ setRefreshToken(refreshToken) {
+ return __awaiter(this, void 0, void 0, function* () {
+ this.refreshToken = refreshToken;
+ return this.storeTokenValue(Keys.refreshToken, refreshToken);
+ });
+ }
+ getRefreshToken() {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (this.refreshToken != null) {
+ return this.refreshToken;
+ }
+ this.refreshToken = yield this.storageService.get(Keys.refreshToken);
+ return this.refreshToken;
+ });
+ }
+ toggleTokens() {
+ return __awaiter(this, void 0, void 0, function* () {
+ const token = yield this.getToken();
+ const refreshToken = yield this.getRefreshToken();
+ const clientId = yield this.getClientId();
+ const clientSecret = yield this.getClientSecret();
+ const timeout = yield this.storageService.get(_constants_service__WEBPACK_IMPORTED_MODULE_0__["ConstantsService"].vaultTimeoutKey);
+ const action = yield this.storageService.get(_constants_service__WEBPACK_IMPORTED_MODULE_0__["ConstantsService"].vaultTimeoutActionKey);
+ if ((timeout != null || timeout === 0) && action === 'logOut') {
+ // if we have a vault timeout and the action is log out, reset tokens
+ yield this.clearToken();
+ this.token = token;
+ this.refreshToken = refreshToken;
+ this.clientId = clientId;
+ this.clientSecret = clientSecret;
+ return;
+ }
+ yield this.setToken(token);
+ yield this.setRefreshToken(refreshToken);
+ yield this.setClientId(clientId);
+ yield this.setClientSecret(clientSecret);
+ });
+ }
+ setTwoFactorToken(token, email) {
+ return this.storageService.save(Keys.twoFactorTokenPrefix + email, token);
+ }
+ getTwoFactorToken(email) {
+ return this.storageService.get(Keys.twoFactorTokenPrefix + email);
+ }
+ clearTwoFactorToken(email) {
+ return this.storageService.remove(Keys.twoFactorTokenPrefix + email);
+ }
+ clearToken() {
+ return __awaiter(this, void 0, void 0, function* () {
+ this.token = null;
+ this.decodedToken = null;
+ this.refreshToken = null;
+ this.clientId = null;
+ this.clientSecret = null;
+ yield this.storageService.remove(Keys.accessToken);
+ yield this.storageService.remove(Keys.refreshToken);
+ yield this.storageService.remove(Keys.clientId);
+ yield this.storageService.remove(Keys.clientSecret);
+ });
+ }
+ // jwthelper methods
+ // ref https://github.com/auth0/angular-jwt/blob/master/src/angularJwt/services/jwt.js
+ decodeToken() {
+ if (this.decodedToken) {
+ return this.decodedToken;
+ }
+ if (this.token == null) {
+ throw new Error('Token not found.');
+ }
+ const parts = this.token.split('.');
+ if (parts.length !== 3) {
+ throw new Error('JWT must have 3 parts');
+ }
+ const decoded = _misc_utils__WEBPACK_IMPORTED_MODULE_1__["Utils"].fromUrlB64ToUtf8(parts[1]);
+ if (decoded == null) {
+ throw new Error('Cannot decode the token');
+ }
+ this.decodedToken = JSON.parse(decoded);
+ return this.decodedToken;
+ }
+ getTokenExpirationDate() {
+ const decoded = this.decodeToken();
+ if (typeof decoded.exp === 'undefined') {
+ return null;
+ }
+ const d = new Date(0); // The 0 here is the key, which sets the date to the epoch
+ d.setUTCSeconds(decoded.exp);
+ return d;
+ }
+ tokenSecondsRemaining(offsetSeconds = 0) {
+ const d = this.getTokenExpirationDate();
+ if (d == null) {
+ return 0;
+ }
+ const msRemaining = d.valueOf() - (new Date().valueOf() + (offsetSeconds * 1000));
+ return Math.round(msRemaining / 1000);
+ }
+ tokenNeedsRefresh(minutes = 5) {
+ const sRemaining = this.tokenSecondsRemaining();
+ return sRemaining < (60 * minutes);
+ }
+ getUserId() {
+ const decoded = this.decodeToken();
+ if (typeof decoded.sub === 'undefined') {
+ throw new Error('No user id found');
+ }
+ return decoded.sub;
+ }
+ getEmail() {
+ const decoded = this.decodeToken();
+ if (typeof decoded.email === 'undefined') {
+ throw new Error('No email found');
+ }
+ return decoded.email;
+ }
+ getEmailVerified() {
+ const decoded = this.decodeToken();
+ if (typeof decoded.email_verified === 'undefined') {
+ throw new Error('No email verification found');
+ }
+ return decoded.email_verified;
+ }
+ getName() {
+ const decoded = this.decodeToken();
+ if (typeof decoded.name === 'undefined') {
+ return null;
+ }
+ return decoded.name;
+ }
+ getPremium() {
+ const decoded = this.decodeToken();
+ if (typeof decoded.premium === 'undefined') {
+ return false;
+ }
+ return decoded.premium;
+ }
+ getIssuer() {
+ const decoded = this.decodeToken();
+ if (typeof decoded.iss === 'undefined') {
+ throw new Error('No issuer found');
+ }
+ return decoded.iss;
+ }
+ storeTokenValue(key, value) {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (yield this.skipTokenStorage()) {
+ // if we have a vault timeout and the action is log out, don't store token
+ return;
+ }
+ return this.storageService.save(key, value);
+ });
+ }
+ skipTokenStorage() {
+ return __awaiter(this, void 0, void 0, function* () {
+ const timeout = yield this.storageService.get(_constants_service__WEBPACK_IMPORTED_MODULE_0__["ConstantsService"].vaultTimeoutKey);
+ const action = yield this.storageService.get(_constants_service__WEBPACK_IMPORTED_MODULE_0__["ConstantsService"].vaultTimeoutActionKey);
+ return timeout != null && action === 'logOut';
+ });
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/services/totp.service.ts":
+/*!***************************************************!*\
+ !*** ./jslib/common/src/services/totp.service.ts ***!
+ \***************************************************/
+/*! exports provided: TotpService */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TotpService", function() { return TotpService; });
+/* harmony import */ var _constants_service__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./constants.service */ "./jslib/common/src/services/constants.service.ts");
+/* harmony import */ var _misc_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../misc/utils */ "./jslib/common/src/misc/utils.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+const B32Chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567';
+const SteamChars = '23456789BCDFGHJKMNPQRTVWXY';
+class TotpService {
+ constructor(storageService, cryptoFunctionService, logService) {
+ this.storageService = storageService;
+ this.cryptoFunctionService = cryptoFunctionService;
+ this.logService = logService;
+ }
+ getCode(key) {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (key == null) {
+ return null;
+ }
+ let period = 30;
+ let alg = 'sha1';
+ let digits = 6;
+ let keyB32 = key;
+ const isOtpAuth = key.toLowerCase().indexOf('otpauth://') === 0;
+ const isSteamAuth = !isOtpAuth && key.toLowerCase().indexOf('steam://') === 0;
+ if (isOtpAuth) {
+ const params = _misc_utils__WEBPACK_IMPORTED_MODULE_1__["Utils"].getQueryParams(key);
+ if (params.has('digits') && params.get('digits') != null) {
+ try {
+ const digitParams = parseInt(params.get('digits').trim(), null);
+ if (digitParams > 10) {
+ digits = 10;
+ }
+ else if (digitParams > 0) {
+ digits = digitParams;
+ }
+ }
+ catch (_a) {
+ this.logService.error('Invalid digits param.');
+ }
+ }
+ if (params.has('period') && params.get('period') != null) {
+ try {
+ const periodParam = parseInt(params.get('period').trim(), null);
+ if (periodParam > 0) {
+ period = periodParam;
+ }
+ }
+ catch (_b) {
+ this.logService.error('Invalid period param.');
+ }
+ }
+ if (params.has('secret') && params.get('secret') != null) {
+ keyB32 = params.get('secret');
+ }
+ if (params.has('algorithm') && params.get('algorithm') != null) {
+ const algParam = params.get('algorithm').toLowerCase();
+ if (algParam === 'sha1' || algParam === 'sha256' || algParam === 'sha512') {
+ alg = algParam;
+ }
+ }
+ }
+ else if (isSteamAuth) {
+ keyB32 = key.substr('steam://'.length);
+ digits = 5;
+ }
+ const epoch = Math.round(new Date().getTime() / 1000.0);
+ const timeHex = this.leftPad(this.decToHex(Math.floor(epoch / period)), 16, '0');
+ const timeBytes = _misc_utils__WEBPACK_IMPORTED_MODULE_1__["Utils"].fromHexToArray(timeHex);
+ const keyBytes = this.b32ToBytes(keyB32);
+ if (!keyBytes.length || !timeBytes.length) {
+ return null;
+ }
+ const hash = yield this.sign(keyBytes, timeBytes, alg);
+ if (hash.length === 0) {
+ return null;
+ }
+ /* tslint:disable */
+ const offset = (hash[hash.length - 1] & 0xf);
+ const binary = ((hash[offset] & 0x7f) << 24) | ((hash[offset + 1] & 0xff) << 16) |
+ ((hash[offset + 2] & 0xff) << 8) | (hash[offset + 3] & 0xff);
+ /* tslint:enable */
+ let otp = '';
+ if (isSteamAuth) {
+ // tslint:disable-next-line
+ let fullCode = binary & 0x7fffffff;
+ for (let i = 0; i < digits; i++) {
+ otp += SteamChars[fullCode % SteamChars.length];
+ fullCode = Math.trunc(fullCode / SteamChars.length);
+ }
+ }
+ else {
+ otp = (binary % Math.pow(10, digits)).toString();
+ otp = this.leftPad(otp, digits, '0');
+ }
+ return otp;
+ });
+ }
+ getTimeInterval(key) {
+ let period = 30;
+ if (key != null && key.toLowerCase().indexOf('otpauth://') === 0) {
+ const params = _misc_utils__WEBPACK_IMPORTED_MODULE_1__["Utils"].getQueryParams(key);
+ if (params.has('period') && params.get('period') != null) {
+ try {
+ period = parseInt(params.get('period').trim(), null);
+ }
+ catch (_a) {
+ this.logService.error('Invalid period param.');
+ }
+ }
+ }
+ return period;
+ }
+ isAutoCopyEnabled() {
+ return __awaiter(this, void 0, void 0, function* () {
+ return !(yield this.storageService.get(_constants_service__WEBPACK_IMPORTED_MODULE_0__["ConstantsService"].disableAutoTotpCopyKey));
+ });
+ }
+ // Helpers
+ leftPad(s, l, p) {
+ if (l + 1 >= s.length) {
+ s = Array(l + 1 - s.length).join(p) + s;
+ }
+ return s;
+ }
+ decToHex(d) {
+ return (d < 15.5 ? '0' : '') + Math.round(d).toString(16);
+ }
+ b32ToHex(s) {
+ s = s.toUpperCase();
+ let cleanedInput = '';
+ for (let i = 0; i < s.length; i++) {
+ if (B32Chars.indexOf(s[i]) < 0) {
+ continue;
+ }
+ cleanedInput += s[i];
+ }
+ s = cleanedInput;
+ let bits = '';
+ let hex = '';
+ for (let i = 0; i < s.length; i++) {
+ const byteIndex = B32Chars.indexOf(s.charAt(i));
+ if (byteIndex < 0) {
+ continue;
+ }
+ bits += this.leftPad(byteIndex.toString(2), 5, '0');
+ }
+ for (let i = 0; i + 4 <= bits.length; i += 4) {
+ const chunk = bits.substr(i, 4);
+ hex = hex + parseInt(chunk, 2).toString(16);
+ }
+ return hex;
+ }
+ b32ToBytes(s) {
+ return _misc_utils__WEBPACK_IMPORTED_MODULE_1__["Utils"].fromHexToArray(this.b32ToHex(s));
+ }
+ sign(keyBytes, timeBytes, alg) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const signature = yield this.cryptoFunctionService.hmac(timeBytes.buffer, keyBytes.buffer, alg);
+ return new Uint8Array(signature);
+ });
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/services/user.service.ts":
+/*!***************************************************!*\
+ !*** ./jslib/common/src/services/user.service.ts ***!
+ \***************************************************/
+/*! exports provided: UserService */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "UserService", function() { return UserService; });
+/* harmony import */ var _models_domain_organization__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../models/domain/organization */ "./jslib/common/src/models/domain/organization.ts");
+/* harmony import */ var _models_domain_provider__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../models/domain/provider */ "./jslib/common/src/models/domain/provider.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+const Keys = {
+ userId: 'userId',
+ userEmail: 'userEmail',
+ stamp: 'securityStamp',
+ kdf: 'kdf',
+ kdfIterations: 'kdfIterations',
+ organizationsPrefix: 'organizations_',
+ providersPrefix: 'providers_',
+ emailVerified: 'emailVerified',
+ forcePasswordReset: 'forcePasswordReset',
+};
+class UserService {
+ constructor(tokenService, storageService) {
+ this.tokenService = tokenService;
+ this.storageService = storageService;
+ }
+ setInformation(userId, email, kdf, kdfIterations) {
+ return __awaiter(this, void 0, void 0, function* () {
+ this.email = email;
+ this.userId = userId;
+ this.kdf = kdf;
+ this.kdfIterations = kdfIterations;
+ yield this.storageService.save(Keys.userEmail, email);
+ yield this.storageService.save(Keys.userId, userId);
+ yield this.storageService.save(Keys.kdf, kdf);
+ yield this.storageService.save(Keys.kdfIterations, kdfIterations);
+ });
+ }
+ setSecurityStamp(stamp) {
+ this.stamp = stamp;
+ return this.storageService.save(Keys.stamp, stamp);
+ }
+ setEmailVerified(emailVerified) {
+ this.emailVerified = emailVerified;
+ return this.storageService.save(Keys.emailVerified, emailVerified);
+ }
+ setForcePasswordReset(forcePasswordReset) {
+ this.forcePasswordReset = forcePasswordReset;
+ return this.storageService.save(Keys.forcePasswordReset, forcePasswordReset);
+ }
+ getUserId() {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (this.userId == null) {
+ this.userId = yield this.storageService.get(Keys.userId);
+ }
+ return this.userId;
+ });
+ }
+ getEmail() {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (this.email == null) {
+ this.email = yield this.storageService.get(Keys.userEmail);
+ }
+ return this.email;
+ });
+ }
+ getSecurityStamp() {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (this.stamp == null) {
+ this.stamp = yield this.storageService.get(Keys.stamp);
+ }
+ return this.stamp;
+ });
+ }
+ getKdf() {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (this.kdf == null) {
+ this.kdf = yield this.storageService.get(Keys.kdf);
+ }
+ return this.kdf;
+ });
+ }
+ getKdfIterations() {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (this.kdfIterations == null) {
+ this.kdfIterations = yield this.storageService.get(Keys.kdfIterations);
+ }
+ return this.kdfIterations;
+ });
+ }
+ getEmailVerified() {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (this.emailVerified == null) {
+ this.emailVerified = yield this.storageService.get(Keys.emailVerified);
+ }
+ return this.emailVerified;
+ });
+ }
+ getForcePasswordReset() {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (this.forcePasswordReset == null) {
+ this.forcePasswordReset = yield this.storageService.get(Keys.forcePasswordReset);
+ }
+ return this.forcePasswordReset;
+ });
+ }
+ clear() {
+ return __awaiter(this, void 0, void 0, function* () {
+ const userId = yield this.getUserId();
+ yield this.storageService.remove(Keys.userId);
+ yield this.storageService.remove(Keys.userEmail);
+ yield this.storageService.remove(Keys.stamp);
+ yield this.storageService.remove(Keys.kdf);
+ yield this.storageService.remove(Keys.kdfIterations);
+ yield this.storageService.remove(Keys.forcePasswordReset);
+ yield this.clearOrganizations(userId);
+ yield this.clearProviders(userId);
+ this.userId = this.email = this.stamp = null;
+ this.kdf = null;
+ this.kdfIterations = null;
+ });
+ }
+ isAuthenticated() {
+ return __awaiter(this, void 0, void 0, function* () {
+ const token = yield this.tokenService.getToken();
+ if (token == null) {
+ return false;
+ }
+ const userId = yield this.getUserId();
+ return userId != null;
+ });
+ }
+ canAccessPremium() {
+ return __awaiter(this, void 0, void 0, function* () {
+ const authed = yield this.isAuthenticated();
+ if (!authed) {
+ return false;
+ }
+ const tokenPremium = this.tokenService.getPremium();
+ if (tokenPremium) {
+ return true;
+ }
+ const orgs = yield this.getAllOrganizations();
+ for (let i = 0; i < orgs.length; i++) {
+ if (orgs[i].usersGetPremium && orgs[i].enabled) {
+ return true;
+ }
+ }
+ return false;
+ });
+ }
+ getOrganization(id) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const userId = yield this.getUserId();
+ const organizations = yield this.storageService.get(Keys.organizationsPrefix + userId);
+ if (organizations == null || !organizations.hasOwnProperty(id)) {
+ return null;
+ }
+ return new _models_domain_organization__WEBPACK_IMPORTED_MODULE_0__["Organization"](organizations[id]);
+ });
+ }
+ getOrganizationByIdentifier(identifier) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const organizations = yield this.getAllOrganizations();
+ if (organizations == null || organizations.length === 0) {
+ return null;
+ }
+ return organizations.find(o => o.identifier === identifier);
+ });
+ }
+ getAllOrganizations() {
+ return __awaiter(this, void 0, void 0, function* () {
+ const userId = yield this.getUserId();
+ const organizations = yield this.storageService.get(Keys.organizationsPrefix + userId);
+ const response = [];
+ for (const id in organizations) {
+ if (organizations.hasOwnProperty(id) && !organizations[id].isProviderUser) {
+ response.push(new _models_domain_organization__WEBPACK_IMPORTED_MODULE_0__["Organization"](organizations[id]));
+ }
+ }
+ return response;
+ });
+ }
+ replaceOrganizations(organizations) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const userId = yield this.getUserId();
+ yield this.storageService.save(Keys.organizationsPrefix + userId, organizations);
+ });
+ }
+ clearOrganizations(userId) {
+ return __awaiter(this, void 0, void 0, function* () {
+ yield this.storageService.remove(Keys.organizationsPrefix + userId);
+ });
+ }
+ getProvider(id) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const userId = yield this.getUserId();
+ const providers = yield this.storageService.get(Keys.providersPrefix + userId);
+ if (providers == null || !providers.hasOwnProperty(id)) {
+ return null;
+ }
+ return new _models_domain_provider__WEBPACK_IMPORTED_MODULE_1__["Provider"](providers[id]);
+ });
+ }
+ getAllProviders() {
+ return __awaiter(this, void 0, void 0, function* () {
+ const userId = yield this.getUserId();
+ const providers = yield this.storageService.get(Keys.providersPrefix + userId);
+ const response = [];
+ for (const id in providers) {
+ if (providers.hasOwnProperty(id)) {
+ response.push(new _models_domain_provider__WEBPACK_IMPORTED_MODULE_1__["Provider"](providers[id]));
+ }
+ }
+ return response;
+ });
+ }
+ replaceProviders(providers) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const userId = yield this.getUserId();
+ yield this.storageService.save(Keys.providersPrefix + userId, providers);
+ });
+ }
+ clearProviders(userId) {
+ return __awaiter(this, void 0, void 0, function* () {
+ yield this.storageService.remove(Keys.providersPrefix + userId);
+ });
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/services/vaultTimeout.service.ts":
+/*!***********************************************************!*\
+ !*** ./jslib/common/src/services/vaultTimeout.service.ts ***!
+ \***********************************************************/
+/*! exports provided: VaultTimeoutService */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "VaultTimeoutService", function() { return VaultTimeoutService; });
+/* harmony import */ var _constants_service__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./constants.service */ "./jslib/common/src/services/constants.service.ts");
+/* harmony import */ var _enums_policyType__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../enums/policyType */ "./jslib/common/src/enums/policyType.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+class VaultTimeoutService {
+ constructor(cipherService, folderService, collectionService, cryptoService, platformUtilsService, storageService, messagingService, searchService, userService, tokenService, policyService, lockedCallback = null, loggedOutCallback = null) {
+ this.cipherService = cipherService;
+ this.folderService = folderService;
+ this.collectionService = collectionService;
+ this.cryptoService = cryptoService;
+ this.platformUtilsService = platformUtilsService;
+ this.storageService = storageService;
+ this.messagingService = messagingService;
+ this.searchService = searchService;
+ this.userService = userService;
+ this.tokenService = tokenService;
+ this.policyService = policyService;
+ this.lockedCallback = lockedCallback;
+ this.loggedOutCallback = loggedOutCallback;
+ this.pinProtectedKey = null;
+ this.biometricLocked = true;
+ this.everBeenUnlocked = false;
+ this.inited = false;
+ }
+ init(checkOnInterval) {
+ if (this.inited) {
+ return;
+ }
+ this.inited = true;
+ if (checkOnInterval) {
+ this.startCheck();
+ }
+ }
+ startCheck() {
+ this.checkVaultTimeout();
+ setInterval(() => this.checkVaultTimeout(), 10 * 1000); // check every 10 seconds
+ }
+ // Keys aren't stored for a device that is locked or logged out.
+ isLocked() {
+ return __awaiter(this, void 0, void 0, function* () {
+ // Handle never lock startup situation
+ if ((yield this.cryptoService.hasKeyStored('auto')) && !this.everBeenUnlocked) {
+ yield this.cryptoService.getKey('auto');
+ }
+ return !this.cryptoService.hasKeyInMemory();
+ });
+ }
+ checkVaultTimeout() {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (yield this.platformUtilsService.isViewOpen()) {
+ // Do not lock
+ return;
+ }
+ // "is logged out check" - similar to isLocked, below
+ const authed = yield this.userService.isAuthenticated();
+ if (!authed) {
+ return;
+ }
+ if (yield this.isLocked()) {
+ return;
+ }
+ const vaultTimeout = yield this.getVaultTimeout();
+ if (vaultTimeout == null || vaultTimeout < 0) {
+ return;
+ }
+ const lastActive = yield this.storageService.get(_constants_service__WEBPACK_IMPORTED_MODULE_0__["ConstantsService"].lastActiveKey);
+ if (lastActive == null) {
+ return;
+ }
+ const vaultTimeoutSeconds = vaultTimeout * 60;
+ const diffSeconds = ((new Date()).getTime() - lastActive) / 1000;
+ if (diffSeconds >= vaultTimeoutSeconds) {
+ // Pivot based on the saved vault timeout action
+ const timeoutAction = yield this.storageService.get(_constants_service__WEBPACK_IMPORTED_MODULE_0__["ConstantsService"].vaultTimeoutActionKey);
+ timeoutAction === 'logOut' ? yield this.logOut() : yield this.lock(true);
+ }
+ });
+ }
+ lock(allowSoftLock = false) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const authed = yield this.userService.isAuthenticated();
+ if (!authed) {
+ return;
+ }
+ this.biometricLocked = true;
+ this.everBeenUnlocked = true;
+ yield this.cryptoService.clearKey(false);
+ yield this.cryptoService.clearOrgKeys(true);
+ yield this.cryptoService.clearKeyPair(true);
+ yield this.cryptoService.clearEncKey(true);
+ this.folderService.clearCache();
+ this.cipherService.clearCache();
+ this.collectionService.clearCache();
+ this.searchService.clearIndex();
+ this.messagingService.send('locked');
+ if (this.lockedCallback != null) {
+ yield this.lockedCallback();
+ }
+ });
+ }
+ logOut() {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (this.loggedOutCallback != null) {
+ yield this.loggedOutCallback();
+ }
+ });
+ }
+ setVaultTimeoutOptions(timeout, action) {
+ return __awaiter(this, void 0, void 0, function* () {
+ yield this.storageService.save(_constants_service__WEBPACK_IMPORTED_MODULE_0__["ConstantsService"].vaultTimeoutKey, timeout);
+ yield this.storageService.save(_constants_service__WEBPACK_IMPORTED_MODULE_0__["ConstantsService"].vaultTimeoutActionKey, action);
+ yield this.cryptoService.toggleKey();
+ yield this.tokenService.toggleTokens();
+ });
+ }
+ isPinLockSet() {
+ return __awaiter(this, void 0, void 0, function* () {
+ const protectedPin = yield this.storageService.get(_constants_service__WEBPACK_IMPORTED_MODULE_0__["ConstantsService"].protectedPin);
+ const pinProtectedKey = yield this.storageService.get(_constants_service__WEBPACK_IMPORTED_MODULE_0__["ConstantsService"].pinProtectedKey);
+ return [protectedPin != null, pinProtectedKey != null];
+ });
+ }
+ isBiometricLockSet() {
+ return __awaiter(this, void 0, void 0, function* () {
+ return yield this.storageService.get(_constants_service__WEBPACK_IMPORTED_MODULE_0__["ConstantsService"].biometricUnlockKey);
+ });
+ }
+ getVaultTimeout() {
+ return __awaiter(this, void 0, void 0, function* () {
+ const vaultTimeout = yield this.storageService.get(_constants_service__WEBPACK_IMPORTED_MODULE_0__["ConstantsService"].vaultTimeoutKey);
+ if (yield this.policyService.policyAppliesToUser(_enums_policyType__WEBPACK_IMPORTED_MODULE_1__["PolicyType"].MaximumVaultTimeout)) {
+ const policy = yield this.policyService.getAll(_enums_policyType__WEBPACK_IMPORTED_MODULE_1__["PolicyType"].MaximumVaultTimeout);
+ // Remove negative values, and ensure it's smaller than maximum allowed value according to policy
+ let timeout = Math.min(vaultTimeout, policy[0].data.minutes);
+ if (vaultTimeout == null || timeout < 0) {
+ timeout = policy[0].data.minutes;
+ }
+ // We really shouldn't need to set the value here, but multiple services relies on this value being correct.
+ if (vaultTimeout !== timeout) {
+ yield this.storageService.save(_constants_service__WEBPACK_IMPORTED_MODULE_0__["ConstantsService"].vaultTimeoutKey, timeout);
+ }
+ return timeout;
+ }
+ return vaultTimeout;
+ });
+ }
+ clear() {
+ this.everBeenUnlocked = false;
+ this.pinProtectedKey = null;
+ return this.storageService.remove(_constants_service__WEBPACK_IMPORTED_MODULE_0__["ConstantsService"].protectedPin);
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/services/webCryptoFunction.service.ts":
+/*!****************************************************************!*\
+ !*** ./jslib/common/src/services/webCryptoFunction.service.ts ***!
+ \****************************************************************/
+/*! exports provided: WebCryptoFunctionService */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "WebCryptoFunctionService", function() { return WebCryptoFunctionService; });
+/* harmony import */ var node_forge__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! node-forge */ "./node_modules/node-forge/lib/index.js");
+/* harmony import */ var node_forge__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(node_forge__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var _misc_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../misc/utils */ "./jslib/common/src/misc/utils.ts");
+/* harmony import */ var _models_domain_decryptParameters__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../models/domain/decryptParameters */ "./jslib/common/src/models/domain/decryptParameters.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+
+class WebCryptoFunctionService {
+ constructor(win, platformUtilsService) {
+ this.win = win;
+ this.platformUtilsService = platformUtilsService;
+ this.crypto = typeof win.crypto !== 'undefined' ? win.crypto : null;
+ this.subtle = (!!this.crypto && typeof win.crypto.subtle !== 'undefined') ? win.crypto.subtle : null;
+ this.isIE = platformUtilsService.isIE();
+ const ua = win.navigator.userAgent;
+ this.isOldSafari = platformUtilsService.isSafari() &&
+ (ua.indexOf(' Version/10.') > -1 || ua.indexOf(' Version/9.') > -1);
+ }
+ pbkdf2(password, salt, algorithm, iterations) {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (this.isIE || this.isOldSafari) {
+ const forgeLen = algorithm === 'sha256' ? 32 : 64;
+ const passwordBytes = this.toByteString(password);
+ const saltBytes = this.toByteString(salt);
+ const derivedKeyBytes = node_forge__WEBPACK_IMPORTED_MODULE_0__["pbkdf2"](passwordBytes, saltBytes, iterations, forgeLen, algorithm);
+ return _misc_utils__WEBPACK_IMPORTED_MODULE_1__["Utils"].fromByteStringToArray(derivedKeyBytes).buffer;
+ }
+ const wcLen = algorithm === 'sha256' ? 256 : 512;
+ const passwordBuf = this.toBuf(password);
+ const saltBuf = this.toBuf(salt);
+ const pbkdf2Params = {
+ name: 'PBKDF2',
+ salt: saltBuf,
+ iterations: iterations,
+ hash: { name: this.toWebCryptoAlgorithm(algorithm) },
+ };
+ const impKey = yield this.subtle.importKey('raw', passwordBuf, { name: 'PBKDF2' }, false, ['deriveBits']);
+ return yield this.subtle.deriveBits(pbkdf2Params, impKey, wcLen);
+ });
+ }
+ hkdf(ikm, salt, info, outputByteSize, algorithm) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const saltBuf = this.toBuf(salt);
+ const infoBuf = this.toBuf(info);
+ const hkdfParams = {
+ name: 'HKDF',
+ salt: saltBuf,
+ info: infoBuf,
+ hash: { name: this.toWebCryptoAlgorithm(algorithm) },
+ };
+ const impKey = yield this.subtle.importKey('raw', ikm, { name: 'HKDF' }, false, ['deriveBits']);
+ return yield this.subtle.deriveBits(hkdfParams, impKey, outputByteSize * 8);
+ });
+ }
+ // ref: https://tools.ietf.org/html/rfc5869
+ hkdfExpand(prk, info, outputByteSize, algorithm) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const hashLen = algorithm === 'sha256' ? 32 : 64;
+ if (outputByteSize > 255 * hashLen) {
+ throw new Error('outputByteSize is too large.');
+ }
+ const prkArr = new Uint8Array(prk);
+ if (prkArr.length < hashLen) {
+ throw new Error('prk is too small.');
+ }
+ const infoBuf = this.toBuf(info);
+ const infoArr = new Uint8Array(infoBuf);
+ let runningOkmLength = 0;
+ let previousT = new Uint8Array(0);
+ const n = Math.ceil(outputByteSize / hashLen);
+ const okm = new Uint8Array(n * hashLen);
+ for (let i = 0; i < n; i++) {
+ const t = new Uint8Array(previousT.length + infoArr.length + 1);
+ t.set(previousT);
+ t.set(infoArr, previousT.length);
+ t.set([i + 1], t.length - 1);
+ previousT = new Uint8Array(yield this.hmac(t.buffer, prk, algorithm));
+ okm.set(previousT, runningOkmLength);
+ runningOkmLength += previousT.length;
+ if (runningOkmLength >= outputByteSize) {
+ break;
+ }
+ }
+ return okm.slice(0, outputByteSize).buffer;
+ });
+ }
+ hash(value, algorithm) {
+ return __awaiter(this, void 0, void 0, function* () {
+ if ((this.isIE && algorithm === 'sha1') || algorithm === 'md5') {
+ const md = algorithm === 'md5' ? node_forge__WEBPACK_IMPORTED_MODULE_0__["md"].md5.create() : node_forge__WEBPACK_IMPORTED_MODULE_0__["md"].sha1.create();
+ const valueBytes = this.toByteString(value);
+ md.update(valueBytes, 'raw');
+ return _misc_utils__WEBPACK_IMPORTED_MODULE_1__["Utils"].fromByteStringToArray(md.digest().data).buffer;
+ }
+ const valueBuf = this.toBuf(value);
+ return yield this.subtle.digest({ name: this.toWebCryptoAlgorithm(algorithm) }, valueBuf);
+ });
+ }
+ hmac(value, key, algorithm) {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (this.isIE && algorithm === 'sha512') {
+ const hmac = node_forge__WEBPACK_IMPORTED_MODULE_0__["hmac"].create();
+ const keyBytes = this.toByteString(key);
+ const valueBytes = this.toByteString(value);
+ hmac.start(algorithm, keyBytes);
+ hmac.update(valueBytes, 'raw');
+ return _misc_utils__WEBPACK_IMPORTED_MODULE_1__["Utils"].fromByteStringToArray(hmac.digest().data).buffer;
+ }
+ const signingAlgorithm = {
+ name: 'HMAC',
+ hash: { name: this.toWebCryptoAlgorithm(algorithm) },
+ };
+ const impKey = yield this.subtle.importKey('raw', key, signingAlgorithm, false, ['sign']);
+ return yield this.subtle.sign(signingAlgorithm, impKey, value);
+ });
+ }
+ // Safely compare two values in a way that protects against timing attacks (Double HMAC Verification).
+ // ref: https://www.nccgroup.trust/us/about-us/newsroom-and-events/blog/2011/february/double-hmac-verification/
+ // ref: https://paragonie.com/blog/2015/11/preventing-timing-attacks-on-string-comparison-with-double-hmac-strategy
+ compare(a, b) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const macKey = yield this.randomBytes(32);
+ const signingAlgorithm = {
+ name: 'HMAC',
+ hash: { name: 'SHA-256' },
+ };
+ const impKey = yield this.subtle.importKey('raw', macKey, signingAlgorithm, false, ['sign']);
+ const mac1 = yield this.subtle.sign(signingAlgorithm, impKey, a);
+ const mac2 = yield this.subtle.sign(signingAlgorithm, impKey, b);
+ if (mac1.byteLength !== mac2.byteLength) {
+ return false;
+ }
+ const arr1 = new Uint8Array(mac1);
+ const arr2 = new Uint8Array(mac2);
+ for (let i = 0; i < arr2.length; i++) {
+ if (arr1[i] !== arr2[i]) {
+ return false;
+ }
+ }
+ return true;
+ });
+ }
+ hmacFast(value, key, algorithm) {
+ const hmac = node_forge__WEBPACK_IMPORTED_MODULE_0__["hmac"].create();
+ hmac.start(algorithm, key);
+ hmac.update(value);
+ const bytes = hmac.digest().getBytes();
+ return Promise.resolve(bytes);
+ }
+ compareFast(a, b) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const rand = yield this.randomBytes(32);
+ const bytes = new Uint32Array(rand);
+ const buffer = node_forge__WEBPACK_IMPORTED_MODULE_0__["util"].createBuffer();
+ for (let i = 0; i < bytes.length; i++) {
+ buffer.putInt32(bytes[i]);
+ }
+ const macKey = buffer.getBytes();
+ const hmac = node_forge__WEBPACK_IMPORTED_MODULE_0__["hmac"].create();
+ hmac.start('sha256', macKey);
+ hmac.update(a);
+ const mac1 = hmac.digest().getBytes();
+ hmac.start(null, null);
+ hmac.update(b);
+ const mac2 = hmac.digest().getBytes();
+ const equals = mac1 === mac2;
+ return equals;
+ });
+ }
+ aesEncrypt(data, iv, key) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const impKey = yield this.subtle.importKey('raw', key, { name: 'AES-CBC' }, false, ['encrypt']);
+ return yield this.subtle.encrypt({ name: 'AES-CBC', iv: iv }, impKey, data);
+ });
+ }
+ aesDecryptFastParameters(data, iv, mac, key) {
+ const p = new _models_domain_decryptParameters__WEBPACK_IMPORTED_MODULE_2__["DecryptParameters"]();
+ if (key.meta != null) {
+ p.encKey = key.meta.encKeyByteString;
+ p.macKey = key.meta.macKeyByteString;
+ }
+ if (p.encKey == null) {
+ p.encKey = node_forge__WEBPACK_IMPORTED_MODULE_0__["util"].decode64(key.encKeyB64);
+ }
+ p.data = node_forge__WEBPACK_IMPORTED_MODULE_0__["util"].decode64(data);
+ p.iv = node_forge__WEBPACK_IMPORTED_MODULE_0__["util"].decode64(iv);
+ p.macData = p.iv + p.data;
+ if (p.macKey == null && key.macKeyB64 != null) {
+ p.macKey = node_forge__WEBPACK_IMPORTED_MODULE_0__["util"].decode64(key.macKeyB64);
+ }
+ if (mac != null) {
+ p.mac = node_forge__WEBPACK_IMPORTED_MODULE_0__["util"].decode64(mac);
+ }
+ // cache byte string keys for later
+ if (key.meta == null) {
+ key.meta = {};
+ }
+ if (key.meta.encKeyByteString == null) {
+ key.meta.encKeyByteString = p.encKey;
+ }
+ if (p.macKey != null && key.meta.macKeyByteString == null) {
+ key.meta.macKeyByteString = p.macKey;
+ }
+ return p;
+ }
+ aesDecryptFast(parameters) {
+ const dataBuffer = node_forge__WEBPACK_IMPORTED_MODULE_0__["util"].createBuffer(parameters.data);
+ const decipher = node_forge__WEBPACK_IMPORTED_MODULE_0__["cipher"].createDecipher('AES-CBC', parameters.encKey);
+ decipher.start({ iv: parameters.iv });
+ decipher.update(dataBuffer);
+ decipher.finish();
+ const val = decipher.output.toString('utf8');
+ return Promise.resolve(val);
+ }
+ aesDecrypt(data, iv, key) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const impKey = yield this.subtle.importKey('raw', key, { name: 'AES-CBC' }, false, ['decrypt']);
+ return yield this.subtle.decrypt({ name: 'AES-CBC', iv: iv }, impKey, data);
+ });
+ }
+ rsaEncrypt(data, publicKey, algorithm) {
+ return __awaiter(this, void 0, void 0, function* () {
+ // Note: Edge browser requires that we specify name and hash for both key import and decrypt.
+ // We cannot use the proper types here.
+ const rsaParams = {
+ name: 'RSA-OAEP',
+ hash: { name: this.toWebCryptoAlgorithm(algorithm) },
+ };
+ const impKey = yield this.subtle.importKey('spki', publicKey, rsaParams, false, ['encrypt']);
+ return yield this.subtle.encrypt(rsaParams, impKey, data);
+ });
+ }
+ rsaDecrypt(data, privateKey, algorithm) {
+ return __awaiter(this, void 0, void 0, function* () {
+ // Note: Edge browser requires that we specify name and hash for both key import and decrypt.
+ // We cannot use the proper types here.
+ const rsaParams = {
+ name: 'RSA-OAEP',
+ hash: { name: this.toWebCryptoAlgorithm(algorithm) },
+ };
+ const impKey = yield this.subtle.importKey('pkcs8', privateKey, rsaParams, false, ['decrypt']);
+ return yield this.subtle.decrypt(rsaParams, impKey, data);
+ });
+ }
+ rsaExtractPublicKey(privateKey) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const rsaParams = {
+ name: 'RSA-OAEP',
+ // Have to specify some algorithm
+ hash: { name: this.toWebCryptoAlgorithm('sha1') },
+ };
+ const impPrivateKey = yield this.subtle.importKey('pkcs8', privateKey, rsaParams, true, ['decrypt']);
+ const jwkPrivateKey = yield this.subtle.exportKey('jwk', impPrivateKey);
+ const jwkPublicKeyParams = {
+ kty: 'RSA',
+ e: jwkPrivateKey.e,
+ n: jwkPrivateKey.n,
+ alg: 'RSA-OAEP',
+ ext: true,
+ };
+ const impPublicKey = yield this.subtle.importKey('jwk', jwkPublicKeyParams, rsaParams, true, ['encrypt']);
+ return yield this.subtle.exportKey('spki', impPublicKey);
+ });
+ }
+ rsaGenerateKeyPair(length) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const rsaParams = {
+ name: 'RSA-OAEP',
+ modulusLength: length,
+ publicExponent: new Uint8Array([0x01, 0x00, 0x01]),
+ // Have to specify some algorithm
+ hash: { name: this.toWebCryptoAlgorithm('sha1') },
+ };
+ const keyPair = (yield this.subtle.generateKey(rsaParams, true, ['encrypt', 'decrypt']));
+ const publicKey = yield this.subtle.exportKey('spki', keyPair.publicKey);
+ const privateKey = yield this.subtle.exportKey('pkcs8', keyPair.privateKey);
+ return [publicKey, privateKey];
+ });
+ }
+ randomBytes(length) {
+ const arr = new Uint8Array(length);
+ this.crypto.getRandomValues(arr);
+ return Promise.resolve(arr.buffer);
+ }
+ toBuf(value) {
+ let buf;
+ if (typeof (value) === 'string') {
+ buf = _misc_utils__WEBPACK_IMPORTED_MODULE_1__["Utils"].fromUtf8ToArray(value).buffer;
+ }
+ else {
+ buf = value;
+ }
+ return buf;
+ }
+ toByteString(value) {
+ let bytes;
+ if (typeof (value) === 'string') {
+ bytes = node_forge__WEBPACK_IMPORTED_MODULE_0__["util"].encodeUtf8(value);
+ }
+ else {
+ bytes = _misc_utils__WEBPACK_IMPORTED_MODULE_1__["Utils"].fromBufferToByteString(value);
+ }
+ return bytes;
+ }
+ toWebCryptoAlgorithm(algorithm) {
+ if (algorithm === 'md5') {
+ throw new Error('MD5 is not supported in WebCrypto.');
+ }
+ return algorithm === 'sha1' ? 'SHA-1' : algorithm === 'sha256' ? 'SHA-256' : 'SHA-512';
+ }
+}
+
+
+/***/ }),
+
+/***/ "./src/background.ts":
+/*!***************************!*\
+ !*** ./src/background.ts ***!
+ \***************************/
+/*! no exports provided */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _background_main_background__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./background/main.background */ "./src/background/main.background.ts");
+
+const bitwardenMain = window.bitwardenMain = new _background_main_background__WEBPACK_IMPORTED_MODULE_0__["default"]();
+bitwardenMain.bootstrap().then(() => {
+ // Finished bootstrapping
+});
+
+
+/***/ }),
+
+/***/ "./src/background/commands.background.ts":
+/*!***********************************************!*\
+ !*** ./src/background/commands.background.ts ***!
+ \***********************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return CommandsBackground; });
+/* harmony import */ var _browser_browserApi__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../browser/browserApi */ "./src/browser/browserApi.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+class CommandsBackground {
+ constructor(main, passwordGenerationService, platformUtilsService, vaultTimeoutService) {
+ this.main = main;
+ this.passwordGenerationService = passwordGenerationService;
+ this.platformUtilsService = platformUtilsService;
+ this.vaultTimeoutService = vaultTimeoutService;
+ this.isSafari = this.platformUtilsService.isSafari();
+ this.isVivaldi = this.platformUtilsService.isVivaldi();
+ }
+ init() {
+ return __awaiter(this, void 0, void 0, function* () {
+ _browser_browserApi__WEBPACK_IMPORTED_MODULE_0__["BrowserApi"].messageListener('commands.background', (msg, sender, sendResponse) => __awaiter(this, void 0, void 0, function* () {
+ if (msg.command === 'unlockCompleted' && msg.data.target === 'commands.background') {
+ yield this.processCommand(msg.data.commandToRetry.msg.command, msg.data.commandToRetry.sender);
+ }
+ if (this.isVivaldi && msg.command === 'keyboardShortcutTriggered' && msg.shortcut) {
+ yield this.processCommand(msg.shortcut, sender);
+ }
+ }));
+ if (!this.isVivaldi && chrome && chrome.commands) {
+ chrome.commands.onCommand.addListener((command) => __awaiter(this, void 0, void 0, function* () {
+ yield this.processCommand(command);
+ }));
+ }
+ });
+ }
+ processCommand(command, sender) {
+ return __awaiter(this, void 0, void 0, function* () {
+ switch (command) {
+ case 'generate_password':
+ yield this.generatePasswordToClipboard();
+ break;
+ case 'autofill_login':
+ yield this.autoFillLogin(sender ? sender.tab : null);
+ break;
+ case 'open_popup':
+ yield this.openPopup();
+ break;
+ case 'lock_vault':
+ yield this.vaultTimeoutService.lock(true);
+ break;
+ default:
+ break;
+ }
+ });
+ }
+ generatePasswordToClipboard() {
+ return __awaiter(this, void 0, void 0, function* () {
+ const options = (yield this.passwordGenerationService.getOptions())[0];
+ const password = yield this.passwordGenerationService.generatePassword(options);
+ this.platformUtilsService.copyToClipboard(password, { window: window });
+ this.passwordGenerationService.addHistory(password);
+ });
+ }
+ autoFillLogin(tab) {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (!tab) {
+ tab = yield _browser_browserApi__WEBPACK_IMPORTED_MODULE_0__["BrowserApi"].getTabFromCurrentWindowId();
+ }
+ if (tab == null) {
+ return;
+ }
+ if (yield this.vaultTimeoutService.isLocked()) {
+ const retryMessage = {
+ commandToRetry: {
+ msg: { command: 'autofill_login' },
+ sender: { tab: tab },
+ },
+ target: 'commands.background',
+ };
+ yield _browser_browserApi__WEBPACK_IMPORTED_MODULE_0__["BrowserApi"].tabSendMessageData(tab, 'addToLockedVaultPendingNotifications', retryMessage);
+ _browser_browserApi__WEBPACK_IMPORTED_MODULE_0__["BrowserApi"].tabSendMessageData(tab, 'promptForLogin');
+ return;
+ }
+ yield this.main.collectPageDetailsForContentScript(tab, 'autofill_cmd');
+ });
+ }
+ openPopup() {
+ return __awaiter(this, void 0, void 0, function* () {
+ // Chrome APIs cannot open popup
+ if (!this.isSafari) {
+ return;
+ }
+ this.main.openPopup();
+ });
+ }
+}
+
+
+/***/ }),
+
+/***/ "./src/background/contextMenus.background.ts":
+/*!***************************************************!*\
+ !*** ./src/background/contextMenus.background.ts ***!
+ \***************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return ContextMenusBackground; });
+/* harmony import */ var _browser_browserApi__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../browser/browserApi */ "./src/browser/browserApi.ts");
+/* harmony import */ var jslib_common_enums_eventType__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! jslib-common/enums/eventType */ "./jslib/common/src/enums/eventType.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+class ContextMenusBackground {
+ constructor(main, cipherService, passwordGenerationService, platformUtilsService, vaultTimeoutService, eventService, totpService) {
+ this.main = main;
+ this.cipherService = cipherService;
+ this.passwordGenerationService = passwordGenerationService;
+ this.platformUtilsService = platformUtilsService;
+ this.vaultTimeoutService = vaultTimeoutService;
+ this.eventService = eventService;
+ this.totpService = totpService;
+ this.noopCommandSuffix = 'noop';
+ this.contextMenus = chrome.contextMenus;
+ }
+ init() {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (!this.contextMenus) {
+ return;
+ }
+ this.contextMenus.onClicked.addListener((info, tab) => __awaiter(this, void 0, void 0, function* () {
+ if (info.menuItemId === 'generate-password') {
+ yield this.generatePasswordToClipboard();
+ }
+ else if (info.menuItemId === 'copy-identifier') {
+ yield this.getClickedElement(tab, info.frameId);
+ }
+ else if (info.parentMenuItemId === 'autofill' ||
+ info.parentMenuItemId === 'copy-username' ||
+ info.parentMenuItemId === 'copy-password' ||
+ info.parentMenuItemId === 'copy-totp') {
+ yield this.cipherAction(tab, info);
+ }
+ }));
+ _browser_browserApi__WEBPACK_IMPORTED_MODULE_0__["BrowserApi"].messageListener('contextmenus.background', (msg, sender, sendResponse) => __awaiter(this, void 0, void 0, function* () {
+ if (msg.command === 'unlockCompleted' && msg.data.target === 'contextmenus.background') {
+ yield this.cipherAction(msg.data.commandToRetry.sender.tab, msg.data.commandToRetry.msg.data);
+ }
+ }));
+ });
+ }
+ generatePasswordToClipboard() {
+ return __awaiter(this, void 0, void 0, function* () {
+ const options = (yield this.passwordGenerationService.getOptions())[0];
+ const password = yield this.passwordGenerationService.generatePassword(options);
+ this.platformUtilsService.copyToClipboard(password, { window: window });
+ this.passwordGenerationService.addHistory(password);
+ });
+ }
+ getClickedElement(tab, frameId) {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (tab == null) {
+ return;
+ }
+ _browser_browserApi__WEBPACK_IMPORTED_MODULE_0__["BrowserApi"].tabSendMessage(tab, { command: 'getClickedElement' }, { frameId: frameId });
+ });
+ }
+ cipherAction(tab, info) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const id = info.menuItemId.split('_')[1];
+ if (yield this.vaultTimeoutService.isLocked()) {
+ const retryMessage = {
+ commandToRetry: {
+ msg: { command: this.noopCommandSuffix, data: info },
+ sender: { tab: tab },
+ },
+ target: 'contextmenus.background',
+ };
+ yield _browser_browserApi__WEBPACK_IMPORTED_MODULE_0__["BrowserApi"].tabSendMessageData(tab, 'addToLockedVaultPendingNotifications', retryMessage);
+ _browser_browserApi__WEBPACK_IMPORTED_MODULE_0__["BrowserApi"].tabSendMessageData(tab, 'promptForLogin');
+ return;
+ }
+ let cipher;
+ if (id === this.noopCommandSuffix) {
+ const ciphers = yield this.cipherService.getAllDecryptedForUrl(tab.url);
+ cipher = ciphers.length > 0 ? ciphers[0] : null;
+ }
+ else {
+ const ciphers = yield this.cipherService.getAllDecrypted();
+ cipher = ciphers.find(c => c.id === id);
+ }
+ if (cipher == null) {
+ return;
+ }
+ if (info.parentMenuItemId === 'autofill') {
+ yield this.startAutofillPage(tab, cipher);
+ }
+ else if (info.parentMenuItemId === 'copy-username') {
+ this.platformUtilsService.copyToClipboard(cipher.login.username, { window: window });
+ }
+ else if (info.parentMenuItemId === 'copy-password') {
+ this.platformUtilsService.copyToClipboard(cipher.login.password, { window: window });
+ this.eventService.collect(jslib_common_enums_eventType__WEBPACK_IMPORTED_MODULE_1__["EventType"].Cipher_ClientCopiedPassword, cipher.id);
+ }
+ else if (info.parentMenuItemId === 'copy-totp') {
+ const totpValue = yield this.totpService.getCode(cipher.login.totp);
+ this.platformUtilsService.copyToClipboard(totpValue, { window: window });
+ }
+ });
+ }
+ startAutofillPage(tab, cipher) {
+ return __awaiter(this, void 0, void 0, function* () {
+ this.main.loginToAutoFill = cipher;
+ if (tab == null) {
+ return;
+ }
+ _browser_browserApi__WEBPACK_IMPORTED_MODULE_0__["BrowserApi"].tabSendMessage(tab, {
+ command: 'collectPageDetails',
+ tab: tab,
+ sender: 'contextMenu',
+ });
+ });
+ }
+}
+
+
+/***/ }),
+
+/***/ "./src/background/idle.background.ts":
+/*!*******************************************!*\
+ !*** ./src/background/idle.background.ts ***!
+ \*******************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return IdleBackground; });
+/* harmony import */ var jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jslib-common/services/constants.service */ "./jslib/common/src/services/constants.service.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+const IdleInterval = 60 * 5; // 5 minutes
+class IdleBackground {
+ constructor(vaultTimeoutService, storageService, notificationsService) {
+ this.vaultTimeoutService = vaultTimeoutService;
+ this.storageService = storageService;
+ this.notificationsService = notificationsService;
+ this.idleTimer = null;
+ this.idleState = 'active';
+ this.idle = chrome.idle || (browser != null ? browser.idle : null);
+ }
+ init() {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (!this.idle) {
+ return;
+ }
+ const idleHandler = (newState) => {
+ if (newState === 'active') {
+ this.notificationsService.reconnectFromActivity();
+ }
+ else {
+ this.notificationsService.disconnectFromInactivity();
+ }
+ };
+ if (this.idle.onStateChanged && this.idle.setDetectionInterval) {
+ this.idle.setDetectionInterval(IdleInterval);
+ this.idle.onStateChanged.addListener(idleHandler);
+ }
+ else {
+ this.pollIdle(idleHandler);
+ }
+ if (this.idle.onStateChanged) {
+ this.idle.onStateChanged.addListener((newState) => __awaiter(this, void 0, void 0, function* () {
+ if (newState === 'locked') { // If the screen is locked or the screensaver activates
+ const timeout = yield this.storageService.get(jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_0__["ConstantsService"].vaultTimeoutKey);
+ if (timeout === -2) { // On System Lock vault timeout option
+ const action = yield this.storageService.get(jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_0__["ConstantsService"].vaultTimeoutActionKey);
+ if (action === 'logOut') {
+ yield this.vaultTimeoutService.logOut();
+ }
+ else {
+ yield this.vaultTimeoutService.lock(true);
+ }
+ }
+ }
+ }));
+ }
+ });
+ }
+ pollIdle(handler) {
+ if (this.idleTimer != null) {
+ window.clearTimeout(this.idleTimer);
+ this.idleTimer = null;
+ }
+ this.idle.queryState(IdleInterval, (state) => {
+ if (state !== this.idleState) {
+ this.idleState = state;
+ handler(state);
+ }
+ this.idleTimer = window.setTimeout(() => this.pollIdle(handler), 5000);
+ });
+ }
+}
+
+
+/***/ }),
+
+/***/ "./src/background/main.background.ts":
+/*!*******************************************!*\
+ !*** ./src/background/main.background.ts ***!
+ \*******************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return MainBackground; });
+/* harmony import */ var jslib_common_enums_cipherRepromptType__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jslib-common/enums/cipherRepromptType */ "./jslib/common/src/enums/cipherRepromptType.ts");
+/* harmony import */ var jslib_common_enums_cipherType__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! jslib-common/enums/cipherType */ "./jslib/common/src/enums/cipherType.ts");
+/* harmony import */ var jslib_common_services_api_service__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! jslib-common/services/api.service */ "./jslib/common/src/services/api.service.ts");
+/* harmony import */ var jslib_common_services_appId_service__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! jslib-common/services/appId.service */ "./jslib/common/src/services/appId.service.ts");
+/* harmony import */ var jslib_common_services_audit_service__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! jslib-common/services/audit.service */ "./jslib/common/src/services/audit.service.ts");
+/* harmony import */ var jslib_common_services_auth_service__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! jslib-common/services/auth.service */ "./jslib/common/src/services/auth.service.ts");
+/* harmony import */ var jslib_common_services_cipher_service__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! jslib-common/services/cipher.service */ "./jslib/common/src/services/cipher.service.ts");
+/* harmony import */ var jslib_common_services_collection_service__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! jslib-common/services/collection.service */ "./jslib/common/src/services/collection.service.ts");
+/* harmony import */ var jslib_common_services_consoleLog_service__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! jslib-common/services/consoleLog.service */ "./jslib/common/src/services/consoleLog.service.ts");
+/* harmony import */ var jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! jslib-common/services/constants.service */ "./jslib/common/src/services/constants.service.ts");
+/* harmony import */ var jslib_common_services_container_service__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! jslib-common/services/container.service */ "./jslib/common/src/services/container.service.ts");
+/* harmony import */ var jslib_common_services_environment_service__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! jslib-common/services/environment.service */ "./jslib/common/src/services/environment.service.ts");
+/* harmony import */ var jslib_common_services_event_service__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! jslib-common/services/event.service */ "./jslib/common/src/services/event.service.ts");
+/* harmony import */ var jslib_common_services_export_service__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! jslib-common/services/export.service */ "./jslib/common/src/services/export.service.ts");
+/* harmony import */ var jslib_common_services_fileUpload_service__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! jslib-common/services/fileUpload.service */ "./jslib/common/src/services/fileUpload.service.ts");
+/* harmony import */ var jslib_common_services_folder_service__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! jslib-common/services/folder.service */ "./jslib/common/src/services/folder.service.ts");
+/* harmony import */ var jslib_common_services_notifications_service__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! jslib-common/services/notifications.service */ "./jslib/common/src/services/notifications.service.ts");
+/* harmony import */ var jslib_common_services_passwordGeneration_service__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! jslib-common/services/passwordGeneration.service */ "./jslib/common/src/services/passwordGeneration.service.ts");
+/* harmony import */ var jslib_common_services_policy_service__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! jslib-common/services/policy.service */ "./jslib/common/src/services/policy.service.ts");
+/* harmony import */ var jslib_common_services_search_service__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! jslib-common/services/search.service */ "./jslib/common/src/services/search.service.ts");
+/* harmony import */ var jslib_common_services_send_service__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! jslib-common/services/send.service */ "./jslib/common/src/services/send.service.ts");
+/* harmony import */ var jslib_common_services_settings_service__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! jslib-common/services/settings.service */ "./jslib/common/src/services/settings.service.ts");
+/* harmony import */ var jslib_common_services_state_service__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! jslib-common/services/state.service */ "./jslib/common/src/services/state.service.ts");
+/* harmony import */ var jslib_common_services_sync_service__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! jslib-common/services/sync.service */ "./jslib/common/src/services/sync.service.ts");
+/* harmony import */ var jslib_common_services_system_service__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! jslib-common/services/system.service */ "./jslib/common/src/services/system.service.ts");
+/* harmony import */ var jslib_common_services_token_service__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! jslib-common/services/token.service */ "./jslib/common/src/services/token.service.ts");
+/* harmony import */ var jslib_common_services_totp_service__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! jslib-common/services/totp.service */ "./jslib/common/src/services/totp.service.ts");
+/* harmony import */ var jslib_common_services_user_service__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! jslib-common/services/user.service */ "./jslib/common/src/services/user.service.ts");
+/* harmony import */ var jslib_common_services_webCryptoFunction_service__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! jslib-common/services/webCryptoFunction.service */ "./jslib/common/src/services/webCryptoFunction.service.ts");
+/* harmony import */ var jslib_common_abstractions_messaging_service__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! jslib-common/abstractions/messaging.service */ "./jslib/common/src/abstractions/messaging.service.ts");
+/* harmony import */ var _browser_browserApi__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ../browser/browserApi */ "./src/browser/browserApi.ts");
+/* harmony import */ var _browser_safariApp__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ../browser/safariApp */ "./src/browser/safariApp.ts");
+/* harmony import */ var _commands_background__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ./commands.background */ "./src/background/commands.background.ts");
+/* harmony import */ var _contextMenus_background__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! ./contextMenus.background */ "./src/background/contextMenus.background.ts");
+/* harmony import */ var _idle_background__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! ./idle.background */ "./src/background/idle.background.ts");
+/* harmony import */ var _nativeMessaging_background__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! ./nativeMessaging.background */ "./src/background/nativeMessaging.background.ts");
+/* harmony import */ var _notification_background__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! ./notification.background */ "./src/background/notification.background.ts");
+/* harmony import */ var _runtime_background__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! ./runtime.background */ "./src/background/runtime.background.ts");
+/* harmony import */ var _tabs_background__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(/*! ./tabs.background */ "./src/background/tabs.background.ts");
+/* harmony import */ var _webRequest_background__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(/*! ./webRequest.background */ "./src/background/webRequest.background.ts");
+/* harmony import */ var _windows_background__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(/*! ./windows.background */ "./src/background/windows.background.ts");
+/* harmony import */ var _popup_services_popup_utils_service__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(/*! ../popup/services/popup-utils.service */ "./src/popup/services/popup-utils.service.ts");
+/* harmony import */ var _services_autofill_service__WEBPACK_IMPORTED_MODULE_42__ = __webpack_require__(/*! ../services/autofill.service */ "./src/services/autofill.service.ts");
+/* harmony import */ var _services_browserCrypto_service__WEBPACK_IMPORTED_MODULE_43__ = __webpack_require__(/*! ../services/browserCrypto.service */ "./src/services/browserCrypto.service.ts");
+/* harmony import */ var _services_browserMessaging_service__WEBPACK_IMPORTED_MODULE_44__ = __webpack_require__(/*! ../services/browserMessaging.service */ "./src/services/browserMessaging.service.ts");
+/* harmony import */ var _services_browserPlatformUtils_service__WEBPACK_IMPORTED_MODULE_45__ = __webpack_require__(/*! ../services/browserPlatformUtils.service */ "./src/services/browserPlatformUtils.service.ts");
+/* harmony import */ var _services_browserStorage_service__WEBPACK_IMPORTED_MODULE_46__ = __webpack_require__(/*! ../services/browserStorage.service */ "./src/services/browserStorage.service.ts");
+/* harmony import */ var _services_i18n_service__WEBPACK_IMPORTED_MODULE_47__ = __webpack_require__(/*! ../services/i18n.service */ "./src/services/i18n.service.ts");
+/* harmony import */ var _services_vaultTimeout_service__WEBPACK_IMPORTED_MODULE_48__ = __webpack_require__(/*! ../services/vaultTimeout.service */ "./src/services/vaultTimeout.service.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+class MainBackground {
+ constructor() {
+ this.loginToAutoFill = null;
+ this.menuOptionsLoaded = [];
+ // Services
+ this.messagingService = new _services_browserMessaging_service__WEBPACK_IMPORTED_MODULE_44__["default"]();
+ this.storageService = new _services_browserStorage_service__WEBPACK_IMPORTED_MODULE_46__["default"]();
+ this.platformUtilsService = new _services_browserPlatformUtils_service__WEBPACK_IMPORTED_MODULE_45__["default"](this.messagingService, this.storageService, (clipboardValue, clearMs) => {
+ if (this.systemService != null) {
+ this.systemService.clearClipboard(clipboardValue, clearMs);
+ }
+ }, () => __awaiter(this, void 0, void 0, function* () {
+ if (this.nativeMessagingBackground != null) {
+ const promise = this.nativeMessagingBackground.getResponse();
+ try {
+ yield this.nativeMessagingBackground.send({ command: 'biometricUnlock' });
+ }
+ catch (e) {
+ return Promise.reject(e);
+ }
+ return promise.then(result => result.response === 'unlocked');
+ }
+ }));
+ this.secureStorageService = new _services_browserStorage_service__WEBPACK_IMPORTED_MODULE_46__["default"]();
+ this.i18nService = new _services_i18n_service__WEBPACK_IMPORTED_MODULE_47__["default"](_browser_browserApi__WEBPACK_IMPORTED_MODULE_30__["BrowserApi"].getUILanguage(window));
+ this.cryptoFunctionService = new jslib_common_services_webCryptoFunction_service__WEBPACK_IMPORTED_MODULE_28__["WebCryptoFunctionService"](window, this.platformUtilsService);
+ this.logService = new jslib_common_services_consoleLog_service__WEBPACK_IMPORTED_MODULE_8__["ConsoleLogService"](false);
+ this.cryptoService = new _services_browserCrypto_service__WEBPACK_IMPORTED_MODULE_43__["BrowserCryptoService"](this.storageService, this.secureStorageService, this.cryptoFunctionService, this.platformUtilsService, this.logService);
+ this.tokenService = new jslib_common_services_token_service__WEBPACK_IMPORTED_MODULE_25__["TokenService"](this.storageService);
+ this.appIdService = new jslib_common_services_appId_service__WEBPACK_IMPORTED_MODULE_3__["AppIdService"](this.storageService);
+ this.environmentService = new jslib_common_services_environment_service__WEBPACK_IMPORTED_MODULE_11__["EnvironmentService"](this.storageService);
+ this.apiService = new jslib_common_services_api_service__WEBPACK_IMPORTED_MODULE_2__["ApiService"](this.tokenService, this.platformUtilsService, this.environmentService, (expired) => this.logout(expired));
+ this.userService = new jslib_common_services_user_service__WEBPACK_IMPORTED_MODULE_27__["UserService"](this.tokenService, this.storageService);
+ this.settingsService = new jslib_common_services_settings_service__WEBPACK_IMPORTED_MODULE_21__["SettingsService"](this.userService, this.storageService);
+ this.fileUploadService = new jslib_common_services_fileUpload_service__WEBPACK_IMPORTED_MODULE_14__["FileUploadService"](this.logService, this.apiService);
+ this.cipherService = new jslib_common_services_cipher_service__WEBPACK_IMPORTED_MODULE_6__["CipherService"](this.cryptoService, this.userService, this.settingsService, this.apiService, this.fileUploadService, this.storageService, this.i18nService, () => this.searchService, this.logService);
+ this.folderService = new jslib_common_services_folder_service__WEBPACK_IMPORTED_MODULE_15__["FolderService"](this.cryptoService, this.userService, this.apiService, this.storageService, this.i18nService, this.cipherService);
+ this.collectionService = new jslib_common_services_collection_service__WEBPACK_IMPORTED_MODULE_7__["CollectionService"](this.cryptoService, this.userService, this.storageService, this.i18nService);
+ this.searchService = new jslib_common_services_search_service__WEBPACK_IMPORTED_MODULE_19__["SearchService"](this.cipherService, this.logService, this.i18nService);
+ this.sendService = new jslib_common_services_send_service__WEBPACK_IMPORTED_MODULE_20__["SendService"](this.cryptoService, this.userService, this.apiService, this.fileUploadService, this.storageService, this.i18nService, this.cryptoFunctionService);
+ this.stateService = new jslib_common_services_state_service__WEBPACK_IMPORTED_MODULE_22__["StateService"]();
+ this.policyService = new jslib_common_services_policy_service__WEBPACK_IMPORTED_MODULE_18__["PolicyService"](this.userService, this.storageService, this.apiService);
+ this.vaultTimeoutService = new _services_vaultTimeout_service__WEBPACK_IMPORTED_MODULE_48__["default"](this.cipherService, this.folderService, this.collectionService, this.cryptoService, this.platformUtilsService, this.storageService, this.messagingService, this.searchService, this.userService, this.tokenService, this.policyService, () => __awaiter(this, void 0, void 0, function* () {
+ if (this.notificationsService != null) {
+ this.notificationsService.updateConnection(false);
+ }
+ yield this.setIcon();
+ yield this.refreshBadgeAndMenu(true);
+ if (this.systemService != null) {
+ this.systemService.startProcessReload();
+ yield this.systemService.clearPendingClipboard();
+ }
+ }), () => __awaiter(this, void 0, void 0, function* () { return yield this.logout(false); }));
+ this.syncService = new jslib_common_services_sync_service__WEBPACK_IMPORTED_MODULE_23__["SyncService"](this.userService, this.apiService, this.settingsService, this.folderService, this.cipherService, this.cryptoService, this.collectionService, this.storageService, this.messagingService, this.policyService, this.sendService, this.logService, (expired) => __awaiter(this, void 0, void 0, function* () { return yield this.logout(expired); }));
+ this.eventService = new jslib_common_services_event_service__WEBPACK_IMPORTED_MODULE_12__["EventService"](this.storageService, this.apiService, this.userService, this.cipherService, this.logService);
+ this.passwordGenerationService = new jslib_common_services_passwordGeneration_service__WEBPACK_IMPORTED_MODULE_17__["PasswordGenerationService"](this.cryptoService, this.storageService, this.policyService);
+ this.totpService = new jslib_common_services_totp_service__WEBPACK_IMPORTED_MODULE_26__["TotpService"](this.storageService, this.cryptoFunctionService, this.logService);
+ this.autofillService = new _services_autofill_service__WEBPACK_IMPORTED_MODULE_42__["default"](this.cipherService, this.userService, this.totpService, this.eventService, this.logService);
+ this.containerService = new jslib_common_services_container_service__WEBPACK_IMPORTED_MODULE_10__["ContainerService"](this.cryptoService);
+ this.auditService = new jslib_common_services_audit_service__WEBPACK_IMPORTED_MODULE_4__["AuditService"](this.cryptoFunctionService, this.apiService);
+ this.exportService = new jslib_common_services_export_service__WEBPACK_IMPORTED_MODULE_13__["ExportService"](this.folderService, this.cipherService, this.apiService, this.cryptoService);
+ this.notificationsService = new jslib_common_services_notifications_service__WEBPACK_IMPORTED_MODULE_16__["NotificationsService"](this.userService, this.syncService, this.appIdService, this.apiService, this.vaultTimeoutService, this.environmentService, () => this.logout(true), this.logService);
+ this.popupUtilsService = new _popup_services_popup_utils_service__WEBPACK_IMPORTED_MODULE_41__["PopupUtilsService"](this.platformUtilsService);
+ this.systemService = new jslib_common_services_system_service__WEBPACK_IMPORTED_MODULE_24__["SystemService"](this.storageService, this.vaultTimeoutService, this.messagingService, this.platformUtilsService, () => {
+ const forceWindowReload = this.platformUtilsService.isSafari() ||
+ this.platformUtilsService.isFirefox() || this.platformUtilsService.isOpera();
+ _browser_browserApi__WEBPACK_IMPORTED_MODULE_30__["BrowserApi"].reloadExtension(forceWindowReload ? window : null);
+ return Promise.resolve();
+ });
+ // Other fields
+ this.isSafari = this.platformUtilsService.isSafari();
+ this.sidebarAction = this.isSafari ? null : (typeof opr !== 'undefined') && opr.sidebarAction ?
+ opr.sidebarAction : window.chrome.sidebarAction;
+ // Background
+ this.runtimeBackground = new _runtime_background__WEBPACK_IMPORTED_MODULE_37__["default"](this, this.autofillService, this.platformUtilsService, this.storageService, this.i18nService, this.notificationsService, this.systemService, this.environmentService, this.messagingService, this.logService);
+ this.nativeMessagingBackground = new _nativeMessaging_background__WEBPACK_IMPORTED_MODULE_35__["NativeMessagingBackground"](this.storageService, this.cryptoService, this.cryptoFunctionService, this.vaultTimeoutService, this.runtimeBackground, this.i18nService, this.userService, this.messagingService, this.appIdService, this.platformUtilsService);
+ this.commandsBackground = new _commands_background__WEBPACK_IMPORTED_MODULE_32__["default"](this, this.passwordGenerationService, this.platformUtilsService, this.vaultTimeoutService);
+ this.notificationBackground = new _notification_background__WEBPACK_IMPORTED_MODULE_36__["default"](this, this.autofillService, this.cipherService, this.storageService, this.vaultTimeoutService, this.policyService, this.folderService);
+ this.tabsBackground = new _tabs_background__WEBPACK_IMPORTED_MODULE_38__["default"](this, this.notificationBackground);
+ this.contextMenusBackground = new _contextMenus_background__WEBPACK_IMPORTED_MODULE_33__["default"](this, this.cipherService, this.passwordGenerationService, this.platformUtilsService, this.vaultTimeoutService, this.eventService, this.totpService);
+ this.idleBackground = new _idle_background__WEBPACK_IMPORTED_MODULE_34__["default"](this.vaultTimeoutService, this.storageService, this.notificationsService);
+ this.webRequestBackground = new _webRequest_background__WEBPACK_IMPORTED_MODULE_39__["default"](this.platformUtilsService, this.cipherService, this.vaultTimeoutService);
+ this.windowsBackground = new _windows_background__WEBPACK_IMPORTED_MODULE_40__["default"](this);
+ const that = this;
+ this.authService = new jslib_common_services_auth_service__WEBPACK_IMPORTED_MODULE_5__["AuthService"](this.cryptoService, this.apiService, this.userService, this.tokenService, this.appIdService, this.i18nService, this.platformUtilsService, new class extends jslib_common_abstractions_messaging_service__WEBPACK_IMPORTED_MODULE_29__["MessagingService"] {
+ constructor() {
+ super(...arguments);
+ // AuthService should send the messages to the background not popup.
+ this.send = (subscriber, arg = {}) => {
+ const message = Object.assign({}, { command: subscriber }, arg);
+ that.runtimeBackground.processMessage(message, that, null);
+ };
+ }
+ }(), this.vaultTimeoutService, this.logService, this.cryptoFunctionService);
+ }
+ bootstrap() {
+ return __awaiter(this, void 0, void 0, function* () {
+ this.containerService.attachToWindow(window);
+ this.authService.init();
+ yield this.vaultTimeoutService.init(true);
+ yield this.i18nService.init();
+ yield this.eventService.init(true);
+ yield this.runtimeBackground.init();
+ yield this.notificationBackground.init();
+ yield this.commandsBackground.init();
+ yield this.tabsBackground.init();
+ yield this.contextMenusBackground.init();
+ yield this.idleBackground.init();
+ yield this.webRequestBackground.init();
+ yield this.windowsBackground.init();
+ return new Promise(resolve => {
+ setTimeout(() => __awaiter(this, void 0, void 0, function* () {
+ yield this.environmentService.setUrlsFromStorage();
+ yield this.setIcon();
+ this.fullSync(true);
+ setTimeout(() => this.notificationsService.init(), 2500);
+ resolve();
+ }), 500);
+ });
+ });
+ }
+ setIcon() {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (!chrome.browserAction && !this.sidebarAction) {
+ return;
+ }
+ const isAuthenticated = yield this.userService.isAuthenticated();
+ const locked = yield this.vaultTimeoutService.isLocked();
+ let suffix = '';
+ if (!isAuthenticated) {
+ suffix = '_gray';
+ }
+ else if (locked) {
+ suffix = '_locked';
+ }
+ yield this.actionSetIcon(chrome.browserAction, suffix);
+ yield this.actionSetIcon(this.sidebarAction, suffix);
+ });
+ }
+ refreshBadgeAndMenu(forLocked = false) {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (!chrome.windows || !chrome.contextMenus) {
+ return;
+ }
+ const menuDisabled = yield this.storageService.get(jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_9__["ConstantsService"].disableContextMenuItemKey);
+ if (!menuDisabled) {
+ yield this.buildContextMenu();
+ }
+ else {
+ yield this.contextMenusRemoveAll();
+ }
+ if (forLocked) {
+ yield this.loadMenuAndUpdateBadgeForNoAccessState(!menuDisabled);
+ this.onUpdatedRan = this.onReplacedRan = false;
+ return;
+ }
+ const tab = yield _browser_browserApi__WEBPACK_IMPORTED_MODULE_30__["BrowserApi"].getTabFromCurrentWindow();
+ if (tab) {
+ yield this.contextMenuReady(tab, !menuDisabled);
+ }
+ });
+ }
+ logout(expired) {
+ return __awaiter(this, void 0, void 0, function* () {
+ yield this.eventService.uploadEvents();
+ const userId = yield this.userService.getUserId();
+ yield Promise.all([
+ this.eventService.clearEvents(),
+ this.syncService.setLastSync(new Date(0)),
+ this.tokenService.clearToken(),
+ this.cryptoService.clearKeys(),
+ this.userService.clear(),
+ this.settingsService.clear(userId),
+ this.cipherService.clear(userId),
+ this.folderService.clear(userId),
+ this.collectionService.clear(userId),
+ this.policyService.clear(userId),
+ this.passwordGenerationService.clear(),
+ this.vaultTimeoutService.clear(),
+ ]);
+ this.searchService.clearIndex();
+ this.messagingService.send('doneLoggingOut', { expired: expired });
+ yield this.setIcon();
+ yield this.refreshBadgeAndMenu();
+ yield this.reseedStorage();
+ this.notificationsService.updateConnection(false);
+ this.systemService.startProcessReload();
+ yield this.systemService.clearPendingClipboard();
+ });
+ }
+ collectPageDetailsForContentScript(tab, sender, frameId = null) {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (tab == null || !tab.id) {
+ return;
+ }
+ const options = {};
+ if (frameId != null) {
+ options.frameId = frameId;
+ }
+ _browser_browserApi__WEBPACK_IMPORTED_MODULE_30__["BrowserApi"].tabSendMessage(tab, {
+ command: 'collectPageDetails',
+ tab: tab,
+ sender: sender,
+ }, options);
+ });
+ }
+ openPopup() {
+ return __awaiter(this, void 0, void 0, function* () {
+ // Chrome APIs cannot open popup
+ // TODO: Do we need to open this popup?
+ if (!this.isSafari) {
+ return;
+ }
+ yield _browser_safariApp__WEBPACK_IMPORTED_MODULE_31__["SafariApp"].sendMessageToApp('showPopover', null, true);
+ });
+ }
+ reseedStorage() {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (!this.platformUtilsService.isChrome() && !this.platformUtilsService.isVivaldi() &&
+ !this.platformUtilsService.isOpera()) {
+ return;
+ }
+ const currentVaultTimeout = yield this.storageService.get(jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_9__["ConstantsService"].vaultTimeoutKey);
+ if (currentVaultTimeout == null) {
+ return;
+ }
+ const getStorage = () => new Promise(resolve => {
+ chrome.storage.local.get(null, (o) => resolve(o));
+ });
+ const clearStorage = () => new Promise(resolve => {
+ chrome.storage.local.clear(() => resolve());
+ });
+ const storage = yield getStorage();
+ yield clearStorage();
+ for (const key in storage) {
+ if (!storage.hasOwnProperty(key)) {
+ continue;
+ }
+ yield this.storageService.save(key, storage[key]);
+ }
+ });
+ }
+ buildContextMenu() {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (!chrome.contextMenus || this.buildingContextMenu) {
+ return;
+ }
+ this.buildingContextMenu = true;
+ yield this.contextMenusRemoveAll();
+ yield this.contextMenusCreate({
+ type: 'normal',
+ id: 'root',
+ contexts: ['all'],
+ title: 'Bitwarden',
+ });
+ yield this.contextMenusCreate({
+ type: 'normal',
+ id: 'autofill',
+ parentId: 'root',
+ contexts: ['all'],
+ title: this.i18nService.t('autoFill'),
+ });
+ yield this.contextMenusCreate({
+ type: 'normal',
+ id: 'copy-username',
+ parentId: 'root',
+ contexts: ['all'],
+ title: this.i18nService.t('copyUsername'),
+ });
+ yield this.contextMenusCreate({
+ type: 'normal',
+ id: 'copy-password',
+ parentId: 'root',
+ contexts: ['all'],
+ title: this.i18nService.t('copyPassword'),
+ });
+ if (yield this.userService.canAccessPremium()) {
+ yield this.contextMenusCreate({
+ type: 'normal',
+ id: 'copy-totp',
+ parentId: 'root',
+ contexts: ['all'],
+ title: this.i18nService.t('copyVerificationCode'),
+ });
+ }
+ yield this.contextMenusCreate({
+ type: 'separator',
+ parentId: 'root',
+ });
+ yield this.contextMenusCreate({
+ type: 'normal',
+ id: 'generate-password',
+ parentId: 'root',
+ contexts: ['all'],
+ title: this.i18nService.t('generatePasswordCopied'),
+ });
+ yield this.contextMenusCreate({
+ type: 'normal',
+ id: 'copy-identifier',
+ parentId: 'root',
+ contexts: ['all'],
+ title: this.i18nService.t('copyElementIdentifier'),
+ });
+ this.buildingContextMenu = false;
+ });
+ }
+ contextMenuReady(tab, contextMenuEnabled) {
+ return __awaiter(this, void 0, void 0, function* () {
+ yield this.loadMenuAndUpdateBadge(tab.url, tab.id, contextMenuEnabled);
+ this.onUpdatedRan = this.onReplacedRan = false;
+ });
+ }
+ loadMenuAndUpdateBadge(url, tabId, contextMenuEnabled) {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (!url || (!chrome.browserAction && !this.sidebarAction)) {
+ return;
+ }
+ this.actionSetBadgeBackgroundColor(chrome.browserAction);
+ this.actionSetBadgeBackgroundColor(this.sidebarAction);
+ this.menuOptionsLoaded = [];
+ const locked = yield this.vaultTimeoutService.isLocked();
+ if (!locked) {
+ try {
+ const ciphers = yield this.cipherService.getAllDecryptedForUrl(url);
+ ciphers.sort((a, b) => this.cipherService.sortCiphersByLastUsedThenName(a, b));
+ if (contextMenuEnabled) {
+ ciphers.forEach(cipher => {
+ this.loadLoginContextMenuOptions(cipher);
+ });
+ }
+ const disableBadgeCounter = yield this.storageService.get(jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_9__["ConstantsService"].disableBadgeCounterKey);
+ let theText = '';
+ if (!disableBadgeCounter) {
+ if (ciphers.length > 0 && ciphers.length <= 9) {
+ theText = ciphers.length.toString();
+ }
+ else if (ciphers.length > 0) {
+ theText = '9+';
+ }
+ }
+ if (contextMenuEnabled && ciphers.length === 0) {
+ yield this.loadNoLoginsContextMenuOptions(this.i18nService.t('noMatchingLogins'));
+ }
+ this.sidebarActionSetBadgeText(theText, tabId);
+ this.browserActionSetBadgeText(theText, tabId);
+ return;
+ }
+ catch (e) {
+ this.logService.error(e);
+ }
+ }
+ yield this.loadMenuAndUpdateBadgeForNoAccessState(contextMenuEnabled);
+ });
+ }
+ loadMenuAndUpdateBadgeForNoAccessState(contextMenuEnabled) {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (contextMenuEnabled) {
+ const authed = yield this.userService.isAuthenticated();
+ yield this.loadNoLoginsContextMenuOptions(this.i18nService.t(authed ? 'vaultLocked' : 'vaultLoggedOut'));
+ }
+ const tabs = yield _browser_browserApi__WEBPACK_IMPORTED_MODULE_30__["BrowserApi"].getActiveTabs();
+ if (tabs != null) {
+ tabs.forEach(tab => {
+ if (tab.id != null) {
+ this.browserActionSetBadgeText('', tab.id);
+ this.sidebarActionSetBadgeText('', tab.id);
+ }
+ });
+ }
+ });
+ }
+ loadLoginContextMenuOptions(cipher) {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (cipher == null || cipher.type !== jslib_common_enums_cipherType__WEBPACK_IMPORTED_MODULE_1__["CipherType"].Login || cipher.reprompt !== jslib_common_enums_cipherRepromptType__WEBPACK_IMPORTED_MODULE_0__["CipherRepromptType"].None) {
+ return;
+ }
+ let title = cipher.name;
+ if (cipher.login.username && cipher.login.username !== '') {
+ title += (' (' + cipher.login.username + ')');
+ }
+ yield this.loadContextMenuOptions(title, cipher.id, cipher);
+ });
+ }
+ loadNoLoginsContextMenuOptions(noLoginsMessage) {
+ return __awaiter(this, void 0, void 0, function* () {
+ yield this.loadContextMenuOptions(noLoginsMessage, 'noop', null);
+ });
+ }
+ loadContextMenuOptions(title, idSuffix, cipher) {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (!chrome.contextMenus || this.menuOptionsLoaded.indexOf(idSuffix) > -1 ||
+ (cipher != null && cipher.type !== jslib_common_enums_cipherType__WEBPACK_IMPORTED_MODULE_1__["CipherType"].Login)) {
+ return;
+ }
+ this.menuOptionsLoaded.push(idSuffix);
+ if (cipher == null || (cipher.login.password && cipher.login.password !== '')) {
+ yield this.contextMenusCreate({
+ type: 'normal',
+ id: 'autofill_' + idSuffix,
+ parentId: 'autofill',
+ contexts: ['all'],
+ title: this.sanitizeContextMenuTitle(title),
+ });
+ }
+ if (cipher == null || (cipher.login.username && cipher.login.username !== '')) {
+ yield this.contextMenusCreate({
+ type: 'normal',
+ id: 'copy-username_' + idSuffix,
+ parentId: 'copy-username',
+ contexts: ['all'],
+ title: this.sanitizeContextMenuTitle(title),
+ });
+ }
+ if (cipher == null || (cipher.login.password && cipher.login.password !== '' && cipher.viewPassword)) {
+ yield this.contextMenusCreate({
+ type: 'normal',
+ id: 'copy-password_' + idSuffix,
+ parentId: 'copy-password',
+ contexts: ['all'],
+ title: this.sanitizeContextMenuTitle(title),
+ });
+ }
+ const canAccessPremium = yield this.userService.canAccessPremium();
+ if (canAccessPremium && (cipher == null || (cipher.login.totp && cipher.login.totp !== ''))) {
+ yield this.contextMenusCreate({
+ type: 'normal',
+ id: 'copy-totp_' + idSuffix,
+ parentId: 'copy-totp',
+ contexts: ['all'],
+ title: this.sanitizeContextMenuTitle(title),
+ });
+ }
+ });
+ }
+ sanitizeContextMenuTitle(title) {
+ return title.replace(/&/g, '&&');
+ }
+ fullSync(override = false) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const syncInternal = 6 * 60 * 60 * 1000; // 6 hours
+ const lastSync = yield this.syncService.getLastSync();
+ let lastSyncAgo = syncInternal + 1;
+ if (lastSync != null) {
+ lastSyncAgo = new Date().getTime() - lastSync.getTime();
+ }
+ if (override || lastSyncAgo >= syncInternal) {
+ yield this.syncService.fullSync(override);
+ this.scheduleNextSync();
+ }
+ else {
+ this.scheduleNextSync();
+ }
+ });
+ }
+ scheduleNextSync() {
+ if (this.syncTimeout) {
+ clearTimeout(this.syncTimeout);
+ }
+ this.syncTimeout = setTimeout(() => __awaiter(this, void 0, void 0, function* () { return yield this.fullSync(); }), 5 * 60 * 1000); // check every 5 minutes
+ }
+ // Browser API Helpers
+ contextMenusRemoveAll() {
+ return new Promise(resolve => {
+ chrome.contextMenus.removeAll(() => {
+ resolve();
+ if (chrome.runtime.lastError) {
+ return;
+ }
+ });
+ });
+ }
+ contextMenusCreate(options) {
+ return new Promise(resolve => {
+ chrome.contextMenus.create(options, () => {
+ resolve();
+ if (chrome.runtime.lastError) {
+ return;
+ }
+ });
+ });
+ }
+ actionSetIcon(theAction, suffix) {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (!theAction || !theAction.setIcon) {
+ return;
+ }
+ const options = {
+ path: {
+ 19: 'images/icon19' + suffix + '.png',
+ 38: 'images/icon38' + suffix + '.png',
+ },
+ };
+ if (this.platformUtilsService.isFirefox()) {
+ yield theAction.setIcon(options);
+ }
+ else if (this.platformUtilsService.isSafari()) {
+ // Workaround since Safari 14.0.3 returns a pending promise
+ // which doesn't resolve within a reasonable time.
+ theAction.setIcon(options);
+ }
+ else {
+ return new Promise(resolve => {
+ theAction.setIcon(options, () => resolve());
+ });
+ }
+ });
+ }
+ actionSetBadgeBackgroundColor(action) {
+ if (action && action.setBadgeBackgroundColor) {
+ action.setBadgeBackgroundColor({ color: '#294e5f' });
+ }
+ }
+ browserActionSetBadgeText(text, tabId) {
+ if (chrome.browserAction && chrome.browserAction.setBadgeText) {
+ chrome.browserAction.setBadgeText({
+ text: text,
+ tabId: tabId,
+ });
+ }
+ }
+ sidebarActionSetBadgeText(text, tabId) {
+ if (!this.sidebarAction) {
+ return;
+ }
+ if (this.sidebarAction.setBadgeText) {
+ this.sidebarAction.setBadgeText({
+ text: text,
+ tabId: tabId,
+ });
+ }
+ else if (this.sidebarAction.setTitle) {
+ let title = 'Bitwarden';
+ if (text && text !== '') {
+ title += (' [' + text + ']');
+ }
+ this.sidebarAction.setTitle({
+ title: title,
+ tabId: tabId,
+ });
+ }
+ }
+}
+
+
+/***/ }),
+
+/***/ "./src/background/models/notificationQueueMessageType.ts":
+/*!***************************************************************!*\
+ !*** ./src/background/models/notificationQueueMessageType.ts ***!
+ \***************************************************************/
+/*! exports provided: NotificationQueueMessageType */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "NotificationQueueMessageType", function() { return NotificationQueueMessageType; });
+var NotificationQueueMessageType;
+(function (NotificationQueueMessageType) {
+ NotificationQueueMessageType["addLogin"] = "addLogin";
+ NotificationQueueMessageType["changePassword"] = "changePassword";
+})(NotificationQueueMessageType || (NotificationQueueMessageType = {}));
+
+
+/***/ }),
+
+/***/ "./src/background/nativeMessaging.background.ts":
+/*!******************************************************!*\
+ !*** ./src/background/nativeMessaging.background.ts ***!
+ \******************************************************/
+/*! exports provided: NativeMessagingBackground */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "NativeMessagingBackground", function() { return NativeMessagingBackground; });
+/* harmony import */ var jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jslib-common/services/constants.service */ "./jslib/common/src/services/constants.service.ts");
+/* harmony import */ var jslib_common_misc_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! jslib-common/misc/utils */ "./jslib/common/src/misc/utils.ts");
+/* harmony import */ var jslib_common_models_domain_symmetricCryptoKey__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! jslib-common/models/domain/symmetricCryptoKey */ "./jslib/common/src/models/domain/symmetricCryptoKey.ts");
+/* harmony import */ var _browser_browserApi__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../browser/browserApi */ "./src/browser/browserApi.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+
+
+const MessageValidTimeout = 10 * 1000;
+const EncryptionAlgorithm = 'sha1';
+class NativeMessagingBackground {
+ constructor(storageService, cryptoService, cryptoFunctionService, vaultTimeoutService, runtimeBackground, i18nService, userService, messagingService, appIdService, platformUtilsService) {
+ var _a;
+ this.storageService = storageService;
+ this.cryptoService = cryptoService;
+ this.cryptoFunctionService = cryptoFunctionService;
+ this.vaultTimeoutService = vaultTimeoutService;
+ this.runtimeBackground = runtimeBackground;
+ this.i18nService = i18nService;
+ this.userService = userService;
+ this.messagingService = messagingService;
+ this.appIdService = appIdService;
+ this.platformUtilsService = platformUtilsService;
+ this.connected = false;
+ this.resolver = null;
+ this.privateKey = null;
+ this.publicKey = null;
+ this.secureSetupResolve = null;
+ this.storageService.save(jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_0__["ConstantsService"].biometricFingerprintValidated, false);
+ if ((_a = chrome === null || chrome === void 0 ? void 0 : chrome.permissions) === null || _a === void 0 ? void 0 : _a.onAdded) {
+ // Reload extension to activate nativeMessaging
+ chrome.permissions.onAdded.addListener(permissions => {
+ _browser_browserApi__WEBPACK_IMPORTED_MODULE_3__["BrowserApi"].reloadExtension(null);
+ });
+ }
+ }
+ connect() {
+ return __awaiter(this, void 0, void 0, function* () {
+ this.appId = yield this.appIdService.getAppId();
+ this.storageService.save(jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_0__["ConstantsService"].biometricFingerprintValidated, false);
+ return new Promise((resolve, reject) => {
+ this.port = _browser_browserApi__WEBPACK_IMPORTED_MODULE_3__["BrowserApi"].connectNative('com.8bit.bitwarden');
+ this.connecting = true;
+ const connectedCallback = () => {
+ this.connected = true;
+ this.connecting = false;
+ resolve();
+ };
+ // Safari has a bundled native component which is always available, no need to
+ // check if the desktop app is running.
+ if (this.platformUtilsService.isSafari()) {
+ connectedCallback();
+ }
+ this.port.onMessage.addListener((message) => __awaiter(this, void 0, void 0, function* () {
+ switch (message.command) {
+ case 'connected':
+ connectedCallback();
+ break;
+ case 'disconnected':
+ if (this.connecting) {
+ this.messagingService.send('showDialog', {
+ text: this.i18nService.t('startDesktopDesc'),
+ title: this.i18nService.t('startDesktopTitle'),
+ confirmText: this.i18nService.t('ok'),
+ type: 'error',
+ });
+ reject();
+ }
+ this.connected = false;
+ this.port.disconnect();
+ break;
+ case 'setupEncryption':
+ // Ignore since it belongs to another device
+ if (message.appId !== this.appId) {
+ return;
+ }
+ const encrypted = jslib_common_misc_utils__WEBPACK_IMPORTED_MODULE_1__["Utils"].fromB64ToArray(message.sharedSecret);
+ const decrypted = yield this.cryptoFunctionService.rsaDecrypt(encrypted.buffer, this.privateKey, EncryptionAlgorithm);
+ if (this.validatingFingerprint) {
+ this.validatingFingerprint = false;
+ this.storageService.save(jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_0__["ConstantsService"].biometricFingerprintValidated, true);
+ }
+ this.sharedSecret = new jslib_common_models_domain_symmetricCryptoKey__WEBPACK_IMPORTED_MODULE_2__["SymmetricCryptoKey"](decrypted);
+ this.secureSetupResolve();
+ break;
+ case 'invalidateEncryption':
+ // Ignore since it belongs to another device
+ if (message.appId !== this.appId) {
+ return;
+ }
+ this.sharedSecret = null;
+ this.privateKey = null;
+ this.connected = false;
+ this.messagingService.send('showDialog', {
+ text: this.i18nService.t('nativeMessagingInvalidEncryptionDesc'),
+ title: this.i18nService.t('nativeMessagingInvalidEncryptionTitle'),
+ confirmText: this.i18nService.t('ok'),
+ type: 'error',
+ });
+ break;
+ case 'verifyFingerprint': {
+ if (this.sharedSecret == null) {
+ this.validatingFingerprint = true;
+ this.showFingerprintDialog();
+ }
+ break;
+ }
+ case 'wrongUserId':
+ this.showWrongUserDialog();
+ default:
+ // Ignore since it belongs to another device
+ if (!this.platformUtilsService.isSafari() && message.appId !== this.appId) {
+ return;
+ }
+ this.onMessage(message.message);
+ }
+ }));
+ this.port.onDisconnect.addListener((p) => {
+ let error;
+ if (_browser_browserApi__WEBPACK_IMPORTED_MODULE_3__["BrowserApi"].isWebExtensionsApi) {
+ error = p.error.message;
+ }
+ else {
+ error = chrome.runtime.lastError.message;
+ }
+ if (error != null) {
+ this.messagingService.send('showDialog', {
+ text: this.i18nService.t('desktopIntegrationDisabledDesc'),
+ title: this.i18nService.t('desktopIntegrationDisabledTitle'),
+ confirmText: this.i18nService.t('ok'),
+ type: 'error',
+ });
+ }
+ this.sharedSecret = null;
+ this.privateKey = null;
+ this.connected = false;
+ reject();
+ });
+ });
+ });
+ }
+ showWrongUserDialog() {
+ this.messagingService.send('showDialog', {
+ text: this.i18nService.t('nativeMessagingWrongUserDesc'),
+ title: this.i18nService.t('nativeMessagingWrongUserTitle'),
+ confirmText: this.i18nService.t('ok'),
+ type: 'error',
+ });
+ }
+ send(message) {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (!this.connected) {
+ yield this.connect();
+ }
+ if (this.platformUtilsService.isSafari()) {
+ this.postMessage(message);
+ }
+ else {
+ this.postMessage({ appId: this.appId, message: yield this.encryptMessage(message) });
+ }
+ });
+ }
+ encryptMessage(message) {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (this.sharedSecret == null) {
+ yield this.secureCommunication();
+ }
+ message.timestamp = Date.now();
+ return yield this.cryptoService.encrypt(JSON.stringify(message), this.sharedSecret);
+ });
+ }
+ getResponse() {
+ return new Promise((resolve, reject) => {
+ this.resolver = resolve;
+ });
+ }
+ postMessage(message) {
+ // Wrap in try-catch to when the port disconnected without triggering `onDisconnect`.
+ try {
+ this.port.postMessage(message);
+ }
+ catch (e) {
+ // tslint:disable-next-line
+ console.error("NativeMessaging port disconnected, disconnecting.");
+ this.sharedSecret = null;
+ this.privateKey = null;
+ this.connected = false;
+ this.messagingService.send('showDialog', {
+ text: this.i18nService.t('nativeMessagingInvalidEncryptionDesc'),
+ title: this.i18nService.t('nativeMessagingInvalidEncryptionTitle'),
+ confirmText: this.i18nService.t('ok'),
+ type: 'error',
+ });
+ }
+ }
+ onMessage(rawMessage) {
+ return __awaiter(this, void 0, void 0, function* () {
+ let message = rawMessage;
+ if (!this.platformUtilsService.isSafari()) {
+ message = JSON.parse(yield this.cryptoService.decryptToUtf8(rawMessage, this.sharedSecret));
+ }
+ if (Math.abs(message.timestamp - Date.now()) > MessageValidTimeout) {
+ // tslint:disable-next-line
+ console.error('NativeMessage is to old, ignoring.');
+ return;
+ }
+ switch (message.command) {
+ case 'biometricUnlock':
+ yield this.storageService.remove(jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_0__["ConstantsService"].biometricAwaitingAcceptance);
+ if (message.response === 'not enabled') {
+ this.messagingService.send('showDialog', {
+ text: this.i18nService.t('biometricsNotEnabledDesc'),
+ title: this.i18nService.t('biometricsNotEnabledTitle'),
+ confirmText: this.i18nService.t('ok'),
+ type: 'error',
+ });
+ break;
+ }
+ else if (message.response === 'not supported') {
+ this.messagingService.send('showDialog', {
+ text: this.i18nService.t('biometricsNotSupportedDesc'),
+ title: this.i18nService.t('biometricsNotSupportedTitle'),
+ confirmText: this.i18nService.t('ok'),
+ type: 'error',
+ });
+ break;
+ }
+ const enabled = yield this.storageService.get(jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_0__["ConstantsService"].biometricUnlockKey);
+ if (enabled === null || enabled === false) {
+ if (message.response === 'unlocked') {
+ yield this.storageService.save(jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_0__["ConstantsService"].biometricUnlockKey, true);
+ }
+ break;
+ }
+ // Ignore unlock if already unlockeded
+ if (!this.vaultTimeoutService.biometricLocked) {
+ break;
+ }
+ if (message.response === 'unlocked') {
+ yield this.cryptoService.setKey(new jslib_common_models_domain_symmetricCryptoKey__WEBPACK_IMPORTED_MODULE_2__["SymmetricCryptoKey"](jslib_common_misc_utils__WEBPACK_IMPORTED_MODULE_1__["Utils"].fromB64ToArray(message.keyB64).buffer));
+ // Verify key is correct by attempting to decrypt a secret
+ try {
+ yield this.cryptoService.getFingerprint(yield this.userService.getUserId());
+ }
+ catch (e) {
+ // tslint:disable-next-line
+ console.error('Unable to verify key:', e);
+ yield this.cryptoService.clearKey();
+ this.showWrongUserDialog();
+ message = false;
+ break;
+ }
+ this.vaultTimeoutService.biometricLocked = false;
+ this.runtimeBackground.processMessage({ command: 'unlocked' }, null, null);
+ }
+ break;
+ default:
+ // tslint:disable-next-line
+ console.error('NativeMessage, got unknown command: ', message.command);
+ }
+ if (this.resolver) {
+ this.resolver(message);
+ }
+ });
+ }
+ secureCommunication() {
+ return __awaiter(this, void 0, void 0, function* () {
+ const [publicKey, privateKey] = yield this.cryptoFunctionService.rsaGenerateKeyPair(2048);
+ this.publicKey = publicKey;
+ this.privateKey = privateKey;
+ this.sendUnencrypted({
+ command: 'setupEncryption',
+ publicKey: jslib_common_misc_utils__WEBPACK_IMPORTED_MODULE_1__["Utils"].fromBufferToB64(publicKey),
+ userId: yield this.userService.getUserId(),
+ });
+ return new Promise((resolve, reject) => this.secureSetupResolve = resolve);
+ });
+ }
+ sendUnencrypted(message) {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (!this.connected) {
+ yield this.connect();
+ }
+ message.timestamp = Date.now();
+ this.postMessage({ appId: this.appId, message: message });
+ });
+ }
+ showFingerprintDialog() {
+ return __awaiter(this, void 0, void 0, function* () {
+ const fingerprint = (yield this.cryptoService.getFingerprint(yield this.userService.getUserId(), this.publicKey)).join(' ');
+ this.messagingService.send('showDialog', {
+ html: `${this.i18nService.t('desktopIntegrationVerificationText')}
${fingerprint}`,
+ title: this.i18nService.t('desktopSyncVerificationTitle'),
+ confirmText: this.i18nService.t('ok'),
+ type: 'warning',
+ });
+ });
+ }
+}
+
+
+/***/ }),
+
+/***/ "./src/background/notification.background.ts":
+/*!***************************************************!*\
+ !*** ./src/background/notification.background.ts ***!
+ \***************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return NotificationBackground; });
+/* harmony import */ var jslib_common_enums_cipherType__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jslib-common/enums/cipherType */ "./jslib/common/src/enums/cipherType.ts");
+/* harmony import */ var jslib_common_models_view_cipherView__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! jslib-common/models/view/cipherView */ "./jslib/common/src/models/view/cipherView.ts");
+/* harmony import */ var jslib_common_models_view_loginUriView__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! jslib-common/models/view/loginUriView */ "./jslib/common/src/models/view/loginUriView.ts");
+/* harmony import */ var jslib_common_models_view_loginView__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! jslib-common/models/view/loginView */ "./jslib/common/src/models/view/loginView.ts");
+/* harmony import */ var jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! jslib-common/services/constants.service */ "./jslib/common/src/services/constants.service.ts");
+/* harmony import */ var _browser_browserApi__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../browser/browserApi */ "./src/browser/browserApi.ts");
+/* harmony import */ var jslib_common_misc_utils__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! jslib-common/misc/utils */ "./jslib/common/src/misc/utils.ts");
+/* harmony import */ var jslib_common_enums_policyType__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! jslib-common/enums/policyType */ "./jslib/common/src/enums/policyType.ts");
+/* harmony import */ var _models_notificationQueueMessageType__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./models/notificationQueueMessageType */ "./src/background/models/notificationQueueMessageType.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+
+
+
+
+
+
+
+class NotificationBackground {
+ constructor(main, autofillService, cipherService, storageService, vaultTimeoutService, policyService, folderService) {
+ this.main = main;
+ this.autofillService = autofillService;
+ this.cipherService = cipherService;
+ this.storageService = storageService;
+ this.vaultTimeoutService = vaultTimeoutService;
+ this.policyService = policyService;
+ this.folderService = folderService;
+ this.notificationQueue = [];
+ }
+ init() {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (chrome.runtime == null) {
+ return;
+ }
+ _browser_browserApi__WEBPACK_IMPORTED_MODULE_5__["BrowserApi"].messageListener('notification.background', (msg, sender) => __awaiter(this, void 0, void 0, function* () {
+ yield this.processMessage(msg, sender);
+ }));
+ this.cleanupNotificationQueue();
+ });
+ }
+ processMessage(msg, sender) {
+ return __awaiter(this, void 0, void 0, function* () {
+ switch (msg.command) {
+ case 'unlockCompleted':
+ if (msg.data.target !== 'notification.background') {
+ return;
+ }
+ yield this.processMessage(msg.data.commandToRetry.msg, msg.data.commandToRetry.sender);
+ break;
+ case 'bgGetDataForTab':
+ yield this.getDataForTab(sender.tab, msg.responseCommand);
+ break;
+ case 'bgCloseNotificationBar':
+ yield _browser_browserApi__WEBPACK_IMPORTED_MODULE_5__["BrowserApi"].tabSendMessageData(sender.tab, 'closeNotificationBar');
+ break;
+ case 'bgAdjustNotificationBar':
+ yield _browser_browserApi__WEBPACK_IMPORTED_MODULE_5__["BrowserApi"].tabSendMessageData(sender.tab, 'adjustNotificationBar', msg.data);
+ break;
+ case 'bgAddLogin':
+ yield this.addLogin(msg.login, sender.tab);
+ break;
+ case 'bgChangedPassword':
+ yield this.changedPassword(msg.data, sender.tab);
+ break;
+ case 'bgAddClose':
+ case 'bgChangeClose':
+ this.removeTabFromNotificationQueue(sender.tab);
+ break;
+ case 'bgAddSave':
+ case 'bgChangeSave':
+ if (yield this.vaultTimeoutService.isLocked()) {
+ const retryMessage = {
+ commandToRetry: {
+ msg: msg,
+ sender: sender,
+ },
+ target: 'notification.background',
+ };
+ yield _browser_browserApi__WEBPACK_IMPORTED_MODULE_5__["BrowserApi"].tabSendMessageData(sender.tab, 'addToLockedVaultPendingNotifications', retryMessage);
+ yield _browser_browserApi__WEBPACK_IMPORTED_MODULE_5__["BrowserApi"].tabSendMessageData(sender.tab, 'promptForLogin');
+ return;
+ }
+ yield this.saveOrUpdateCredentials(sender.tab, msg.folder);
+ break;
+ case 'bgNeverSave':
+ yield this.saveNever(sender.tab);
+ break;
+ case 'collectPageDetailsResponse':
+ switch (msg.sender) {
+ case 'notificationBar':
+ const forms = this.autofillService.getFormsWithPasswordFields(msg.details);
+ yield _browser_browserApi__WEBPACK_IMPORTED_MODULE_5__["BrowserApi"].tabSendMessageData(msg.tab, 'notificationBarPageDetails', {
+ details: msg.details,
+ forms: forms,
+ });
+ break;
+ default:
+ break;
+ }
+ break;
+ default:
+ break;
+ }
+ });
+ }
+ checkNotificationQueue(tab = null) {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (this.notificationQueue.length === 0) {
+ return;
+ }
+ if (tab != null) {
+ this.doNotificationQueueCheck(tab);
+ return;
+ }
+ const currentTab = yield _browser_browserApi__WEBPACK_IMPORTED_MODULE_5__["BrowserApi"].getTabFromCurrentWindow();
+ if (currentTab != null) {
+ this.doNotificationQueueCheck(currentTab);
+ }
+ });
+ }
+ cleanupNotificationQueue() {
+ for (let i = this.notificationQueue.length - 1; i >= 0; i--) {
+ if (this.notificationQueue[i].expires < new Date()) {
+ this.notificationQueue.splice(i, 1);
+ }
+ }
+ setTimeout(() => this.cleanupNotificationQueue(), 2 * 60 * 1000); // check every 2 minutes
+ }
+ doNotificationQueueCheck(tab) {
+ if (tab == null) {
+ return;
+ }
+ const tabDomain = jslib_common_misc_utils__WEBPACK_IMPORTED_MODULE_6__["Utils"].getDomain(tab.url);
+ if (tabDomain == null) {
+ return;
+ }
+ for (let i = 0; i < this.notificationQueue.length; i++) {
+ if (this.notificationQueue[i].tabId !== tab.id || this.notificationQueue[i].domain !== tabDomain) {
+ continue;
+ }
+ if (this.notificationQueue[i].type === _models_notificationQueueMessageType__WEBPACK_IMPORTED_MODULE_8__["NotificationQueueMessageType"].addLogin) {
+ _browser_browserApi__WEBPACK_IMPORTED_MODULE_5__["BrowserApi"].tabSendMessageData(tab, 'openNotificationBar', {
+ type: 'add',
+ typeData: {
+ isVaultLocked: this.notificationQueue[i].wasVaultLocked,
+ },
+ });
+ }
+ else if (this.notificationQueue[i].type === _models_notificationQueueMessageType__WEBPACK_IMPORTED_MODULE_8__["NotificationQueueMessageType"].changePassword) {
+ _browser_browserApi__WEBPACK_IMPORTED_MODULE_5__["BrowserApi"].tabSendMessageData(tab, 'openNotificationBar', {
+ type: 'change',
+ typeData: {
+ isVaultLocked: this.notificationQueue[i].wasVaultLocked,
+ },
+ });
+ }
+ break;
+ }
+ }
+ removeTabFromNotificationQueue(tab) {
+ for (let i = this.notificationQueue.length - 1; i >= 0; i--) {
+ if (this.notificationQueue[i].tabId === tab.id) {
+ this.notificationQueue.splice(i, 1);
+ }
+ }
+ }
+ addLogin(loginInfo, tab) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const loginDomain = jslib_common_misc_utils__WEBPACK_IMPORTED_MODULE_6__["Utils"].getDomain(loginInfo.url);
+ if (loginDomain == null) {
+ return;
+ }
+ let normalizedUsername = loginInfo.username;
+ if (normalizedUsername != null) {
+ normalizedUsername = normalizedUsername.toLowerCase();
+ }
+ if (yield this.vaultTimeoutService.isLocked()) {
+ if (!(yield this.allowPersonalOwnership())) {
+ return;
+ }
+ this.pushAddLoginToQueue(loginDomain, loginInfo, tab, true);
+ return;
+ }
+ const ciphers = yield this.cipherService.getAllDecryptedForUrl(loginInfo.url);
+ const usernameMatches = ciphers.filter(c => c.login.username != null && c.login.username.toLowerCase() === normalizedUsername);
+ if (usernameMatches.length === 0) {
+ const disabledAddLogin = yield this.storageService.get(jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_4__["ConstantsService"].disableAddLoginNotificationKey);
+ if (disabledAddLogin) {
+ return;
+ }
+ if (!(yield this.allowPersonalOwnership())) {
+ return;
+ }
+ this.pushAddLoginToQueue(loginDomain, loginInfo, tab);
+ }
+ else if (usernameMatches.length === 1 && usernameMatches[0].login.password !== loginInfo.password) {
+ const disabledChangePassword = yield this.storageService.get(jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_4__["ConstantsService"].disableChangedPasswordNotificationKey);
+ if (disabledChangePassword) {
+ return;
+ }
+ this.pushChangePasswordToQueue(usernameMatches[0].id, loginDomain, loginInfo.password, tab);
+ }
+ });
+ }
+ pushAddLoginToQueue(loginDomain, loginInfo, tab, isVaultLocked = false) {
+ return __awaiter(this, void 0, void 0, function* () {
+ // remove any old messages for this tab
+ this.removeTabFromNotificationQueue(tab);
+ const message = {
+ type: _models_notificationQueueMessageType__WEBPACK_IMPORTED_MODULE_8__["NotificationQueueMessageType"].addLogin,
+ username: loginInfo.username,
+ password: loginInfo.password,
+ domain: loginDomain,
+ uri: loginInfo.url,
+ tabId: tab.id,
+ expires: new Date((new Date()).getTime() + 5 * 60000),
+ wasVaultLocked: isVaultLocked,
+ };
+ this.notificationQueue.push(message);
+ yield this.checkNotificationQueue(tab);
+ });
+ }
+ changedPassword(changeData, tab) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const loginDomain = jslib_common_misc_utils__WEBPACK_IMPORTED_MODULE_6__["Utils"].getDomain(changeData.url);
+ if (loginDomain == null) {
+ return;
+ }
+ if (yield this.vaultTimeoutService.isLocked()) {
+ this.pushChangePasswordToQueue(null, loginDomain, changeData.newPassword, tab, true);
+ return;
+ }
+ let id = null;
+ const ciphers = yield this.cipherService.getAllDecryptedForUrl(changeData.url);
+ if (changeData.currentPassword != null) {
+ const passwordMatches = ciphers.filter(c => c.login.password === changeData.currentPassword);
+ if (passwordMatches.length === 1) {
+ id = passwordMatches[0].id;
+ }
+ }
+ else if (ciphers.length === 1) {
+ id = ciphers[0].id;
+ }
+ if (id != null) {
+ this.pushChangePasswordToQueue(id, loginDomain, changeData.newPassword, tab);
+ }
+ });
+ }
+ pushChangePasswordToQueue(cipherId, loginDomain, newPassword, tab, isVaultLocked = false) {
+ return __awaiter(this, void 0, void 0, function* () {
+ // remove any old messages for this tab
+ this.removeTabFromNotificationQueue(tab);
+ const message = {
+ type: _models_notificationQueueMessageType__WEBPACK_IMPORTED_MODULE_8__["NotificationQueueMessageType"].changePassword,
+ cipherId: cipherId,
+ newPassword: newPassword,
+ domain: loginDomain,
+ tabId: tab.id,
+ expires: new Date((new Date()).getTime() + 5 * 60000),
+ wasVaultLocked: isVaultLocked,
+ };
+ this.notificationQueue.push(message);
+ yield this.checkNotificationQueue(tab);
+ });
+ }
+ saveOrUpdateCredentials(tab, folderId) {
+ return __awaiter(this, void 0, void 0, function* () {
+ for (let i = this.notificationQueue.length - 1; i >= 0; i--) {
+ const queueMessage = this.notificationQueue[i];
+ if (queueMessage.tabId !== tab.id ||
+ (queueMessage.type !== _models_notificationQueueMessageType__WEBPACK_IMPORTED_MODULE_8__["NotificationQueueMessageType"].addLogin && queueMessage.type !== _models_notificationQueueMessageType__WEBPACK_IMPORTED_MODULE_8__["NotificationQueueMessageType"].changePassword)) {
+ continue;
+ }
+ const tabDomain = jslib_common_misc_utils__WEBPACK_IMPORTED_MODULE_6__["Utils"].getDomain(tab.url);
+ if (tabDomain != null && tabDomain !== queueMessage.domain) {
+ continue;
+ }
+ this.notificationQueue.splice(i, 1);
+ _browser_browserApi__WEBPACK_IMPORTED_MODULE_5__["BrowserApi"].tabSendMessageData(tab, 'closeNotificationBar');
+ if (queueMessage.type === _models_notificationQueueMessageType__WEBPACK_IMPORTED_MODULE_8__["NotificationQueueMessageType"].changePassword) {
+ const message = queueMessage;
+ const cipher = yield this.getDecryptedCipherById(message.cipherId);
+ if (cipher == null) {
+ return;
+ }
+ yield this.updateCipher(cipher, message.newPassword);
+ return;
+ }
+ if (!queueMessage.wasVaultLocked) {
+ yield this.createNewCipher(queueMessage, folderId);
+ }
+ // If the vault was locked, check if a cipher needs updating instead of creating a new one
+ if (queueMessage.type === _models_notificationQueueMessageType__WEBPACK_IMPORTED_MODULE_8__["NotificationQueueMessageType"].addLogin && queueMessage.wasVaultLocked === true) {
+ const message = queueMessage;
+ const ciphers = yield this.cipherService.getAllDecryptedForUrl(message.uri);
+ const usernameMatches = ciphers.filter(c => c.login.username != null &&
+ c.login.username.toLowerCase() === message.username);
+ if (usernameMatches.length >= 1) {
+ yield this.updateCipher(usernameMatches[0], message.password);
+ return;
+ }
+ yield this.createNewCipher(message, folderId);
+ }
+ }
+ });
+ }
+ createNewCipher(queueMessage, folderId) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const loginModel = new jslib_common_models_view_loginView__WEBPACK_IMPORTED_MODULE_3__["LoginView"]();
+ const loginUri = new jslib_common_models_view_loginUriView__WEBPACK_IMPORTED_MODULE_2__["LoginUriView"]();
+ loginUri.uri = queueMessage.uri;
+ loginModel.uris = [loginUri];
+ loginModel.username = queueMessage.username;
+ loginModel.password = queueMessage.password;
+ const model = new jslib_common_models_view_cipherView__WEBPACK_IMPORTED_MODULE_1__["CipherView"]();
+ model.name = jslib_common_misc_utils__WEBPACK_IMPORTED_MODULE_6__["Utils"].getHostname(queueMessage.uri) || queueMessage.domain;
+ model.name = model.name.replace(/^www\./, '');
+ model.type = jslib_common_enums_cipherType__WEBPACK_IMPORTED_MODULE_0__["CipherType"].Login;
+ model.login = loginModel;
+ if (!jslib_common_misc_utils__WEBPACK_IMPORTED_MODULE_6__["Utils"].isNullOrWhitespace(folderId)) {
+ const folders = yield this.folderService.getAllDecrypted();
+ if (folders.some(x => x.id === folderId)) {
+ model.folderId = folderId;
+ }
+ }
+ const cipher = yield this.cipherService.encrypt(model);
+ yield this.cipherService.saveWithServer(cipher);
+ });
+ }
+ getDecryptedCipherById(cipherId) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const cipher = yield this.cipherService.get(cipherId);
+ if (cipher != null && cipher.type === jslib_common_enums_cipherType__WEBPACK_IMPORTED_MODULE_0__["CipherType"].Login) {
+ return yield cipher.decrypt();
+ }
+ return null;
+ });
+ }
+ updateCipher(cipher, newPassword) {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (cipher != null && cipher.type === jslib_common_enums_cipherType__WEBPACK_IMPORTED_MODULE_0__["CipherType"].Login) {
+ cipher.login.password = newPassword;
+ const newCipher = yield this.cipherService.encrypt(cipher);
+ yield this.cipherService.saveWithServer(newCipher);
+ }
+ });
+ }
+ saveNever(tab) {
+ return __awaiter(this, void 0, void 0, function* () {
+ for (let i = this.notificationQueue.length - 1; i >= 0; i--) {
+ const queueMessage = this.notificationQueue[i];
+ if (queueMessage.tabId !== tab.id || queueMessage.type !== _models_notificationQueueMessageType__WEBPACK_IMPORTED_MODULE_8__["NotificationQueueMessageType"].addLogin) {
+ continue;
+ }
+ const tabDomain = jslib_common_misc_utils__WEBPACK_IMPORTED_MODULE_6__["Utils"].getDomain(tab.url);
+ if (tabDomain != null && tabDomain !== queueMessage.domain) {
+ continue;
+ }
+ this.notificationQueue.splice(i, 1);
+ _browser_browserApi__WEBPACK_IMPORTED_MODULE_5__["BrowserApi"].tabSendMessageData(tab, 'closeNotificationBar');
+ const hostname = jslib_common_misc_utils__WEBPACK_IMPORTED_MODULE_6__["Utils"].getHostname(tab.url);
+ yield this.cipherService.saveNeverDomain(hostname);
+ }
+ });
+ }
+ getDataForTab(tab, responseCommand) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const responseData = {};
+ if (responseCommand === 'notificationBarGetFoldersList') {
+ responseData.folders = yield this.folderService.getAllDecrypted();
+ }
+ yield _browser_browserApi__WEBPACK_IMPORTED_MODULE_5__["BrowserApi"].tabSendMessageData(tab, responseCommand, responseData);
+ });
+ }
+ allowPersonalOwnership() {
+ return __awaiter(this, void 0, void 0, function* () {
+ return !(yield this.policyService.policyAppliesToUser(jslib_common_enums_policyType__WEBPACK_IMPORTED_MODULE_7__["PolicyType"].PersonalOwnership));
+ });
+ }
+}
+
+
+/***/ }),
+
+/***/ "./src/background/runtime.background.ts":
+/*!**********************************************!*\
+ !*** ./src/background/runtime.background.ts ***!
+ \**********************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return RuntimeBackground; });
+/* harmony import */ var jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jslib-common/services/constants.service */ "./jslib/common/src/services/constants.service.ts");
+/* harmony import */ var _browser_browserApi__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../browser/browserApi */ "./src/browser/browserApi.ts");
+/* harmony import */ var jslib_common_misc_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! jslib-common/misc/utils */ "./jslib/common/src/misc/utils.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+
+class RuntimeBackground {
+ constructor(main, autofillService, platformUtilsService, storageService, i18nService, notificationsService, systemService, environmentService, messagingService, logService) {
+ this.main = main;
+ this.autofillService = autofillService;
+ this.platformUtilsService = platformUtilsService;
+ this.storageService = storageService;
+ this.i18nService = i18nService;
+ this.notificationsService = notificationsService;
+ this.systemService = systemService;
+ this.environmentService = environmentService;
+ this.messagingService = messagingService;
+ this.logService = logService;
+ this.pageDetailsToAutoFill = [];
+ this.onInstalledReason = null;
+ this.lockedVaultPendingNotifications = [];
+ // onInstalled listener must be wired up before anything else, so we do it in the ctor
+ chrome.runtime.onInstalled.addListener((details) => {
+ this.onInstalledReason = details.reason;
+ });
+ }
+ init() {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (!chrome.runtime) {
+ return;
+ }
+ yield this.checkOnInstalled();
+ _browser_browserApi__WEBPACK_IMPORTED_MODULE_1__["BrowserApi"].messageListener('runtime.background', (msg, sender, sendResponse) => __awaiter(this, void 0, void 0, function* () {
+ yield this.processMessage(msg, sender, sendResponse);
+ }));
+ });
+ }
+ processMessage(msg, sender, sendResponse) {
+ var _a, _b;
+ return __awaiter(this, void 0, void 0, function* () {
+ switch (msg.command) {
+ case 'loggedIn':
+ case 'unlocked':
+ let item;
+ if (this.lockedVaultPendingNotifications.length > 0) {
+ yield _browser_browserApi__WEBPACK_IMPORTED_MODULE_1__["BrowserApi"].closeLoginTab();
+ item = this.lockedVaultPendingNotifications.pop();
+ if ((_b = (_a = item.commandToRetry.sender) === null || _a === void 0 ? void 0 : _a.tab) === null || _b === void 0 ? void 0 : _b.id) {
+ yield _browser_browserApi__WEBPACK_IMPORTED_MODULE_1__["BrowserApi"].focusSpecifiedTab(item.commandToRetry.sender.tab.id);
+ }
+ }
+ yield this.main.setIcon();
+ yield this.main.refreshBadgeAndMenu(false);
+ this.notificationsService.updateConnection(msg.command === 'unlocked');
+ this.systemService.cancelProcessReload();
+ if (item) {
+ yield _browser_browserApi__WEBPACK_IMPORTED_MODULE_1__["BrowserApi"].tabSendMessageData(item.commandToRetry.sender.tab, 'unlockCompleted', item);
+ }
+ break;
+ case 'addToLockedVaultPendingNotifications':
+ this.lockedVaultPendingNotifications.push(msg.data);
+ break;
+ case 'logout':
+ yield this.main.logout(msg.expired);
+ break;
+ case 'syncCompleted':
+ if (msg.successfully) {
+ setTimeout(() => __awaiter(this, void 0, void 0, function* () { return yield this.main.refreshBadgeAndMenu(); }), 2000);
+ }
+ break;
+ case 'openPopup':
+ yield this.main.openPopup();
+ break;
+ case 'promptForLogin':
+ yield _browser_browserApi__WEBPACK_IMPORTED_MODULE_1__["BrowserApi"].createNewTab('popup/index.html?uilocation=popout', true, true);
+ break;
+ case 'showDialogResolve':
+ this.platformUtilsService.resolveDialogPromise(msg.dialogId, msg.confirmed);
+ break;
+ case 'bgCollectPageDetails':
+ yield this.main.collectPageDetailsForContentScript(sender.tab, msg.sender, sender.frameId);
+ break;
+ case 'bgUpdateContextMenu':
+ case 'editedCipher':
+ case 'addedCipher':
+ case 'deletedCipher':
+ yield this.main.refreshBadgeAndMenu();
+ break;
+ case 'bgReseedStorage':
+ yield this.main.reseedStorage();
+ break;
+ case 'collectPageDetailsResponse':
+ switch (msg.sender) {
+ case 'autofiller':
+ case 'autofill_cmd':
+ const totpCode = yield this.autofillService.doAutoFillActiveTab([{
+ frameId: sender.frameId,
+ tab: msg.tab,
+ details: msg.details,
+ }], msg.sender === 'autofill_cmd');
+ if (totpCode != null) {
+ this.platformUtilsService.copyToClipboard(totpCode, { window: window });
+ }
+ break;
+ case 'contextMenu':
+ clearTimeout(this.autofillTimeout);
+ this.pageDetailsToAutoFill.push({
+ frameId: sender.frameId,
+ tab: msg.tab,
+ details: msg.details,
+ });
+ this.autofillTimeout = setTimeout(() => __awaiter(this, void 0, void 0, function* () { return yield this.autofillPage(); }), 300);
+ break;
+ default:
+ break;
+ }
+ break;
+ case 'authResult':
+ const vaultUrl = this.environmentService.getWebVaultUrl();
+ if (msg.referrer == null || jslib_common_misc_utils__WEBPACK_IMPORTED_MODULE_2__["Utils"].getHostname(vaultUrl) !== msg.referrer) {
+ return;
+ }
+ try {
+ _browser_browserApi__WEBPACK_IMPORTED_MODULE_1__["BrowserApi"].createNewTab('popup/index.html?uilocation=popout#/sso?code=' +
+ msg.code + '&state=' + msg.state);
+ }
+ catch (_c) {
+ this.logService.error('Unable to open sso popout tab');
+ }
+ break;
+ case 'webAuthnResult':
+ const vaultUrl2 = this.environmentService.getWebVaultUrl();
+ if (msg.referrer == null || jslib_common_misc_utils__WEBPACK_IMPORTED_MODULE_2__["Utils"].getHostname(vaultUrl2) !== msg.referrer) {
+ return;
+ }
+ const params = `webAuthnResponse=${encodeURIComponent(msg.data)};remember=${msg.remember}`;
+ _browser_browserApi__WEBPACK_IMPORTED_MODULE_1__["BrowserApi"].createNewTab(`popup/index.html?uilocation=popout#/2fa;${params}`, undefined, false);
+ break;
+ case 'reloadPopup':
+ this.messagingService.send('reloadPopup');
+ break;
+ case 'emailVerificationRequired':
+ this.messagingService.send('showDialog', {
+ dialogId: 'emailVerificationRequired',
+ title: this.i18nService.t('emailVerificationRequired'),
+ text: this.i18nService.t('emailVerificationRequiredDesc'),
+ confirmText: this.i18nService.t('ok'),
+ type: 'info',
+ });
+ break;
+ case 'getClickedElementResponse':
+ this.platformUtilsService.copyToClipboard(msg.identifier, { window: window });
+ default:
+ break;
+ }
+ });
+ }
+ autofillPage() {
+ return __awaiter(this, void 0, void 0, function* () {
+ const totpCode = yield this.autofillService.doAutoFill({
+ cipher: this.main.loginToAutoFill,
+ pageDetails: this.pageDetailsToAutoFill,
+ fillNewPassword: true,
+ });
+ if (totpCode != null) {
+ this.platformUtilsService.copyToClipboard(totpCode, { window: window });
+ }
+ // reset
+ this.main.loginToAutoFill = null;
+ this.pageDetailsToAutoFill = [];
+ });
+ }
+ checkOnInstalled() {
+ return __awaiter(this, void 0, void 0, function* () {
+ setTimeout(() => __awaiter(this, void 0, void 0, function* () {
+ if (this.onInstalledReason != null) {
+ if (this.onInstalledReason === 'install') {
+ _browser_browserApi__WEBPACK_IMPORTED_MODULE_1__["BrowserApi"].createNewTab('https://bitwarden.com/browser-start/');
+ yield this.setDefaultSettings();
+ }
+ this.onInstalledReason = null;
+ }
+ }), 100);
+ });
+ }
+ setDefaultSettings() {
+ return __awaiter(this, void 0, void 0, function* () {
+ // Default timeout option to "on restart".
+ const currentVaultTimeout = yield this.storageService.get(jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_0__["ConstantsService"].vaultTimeoutKey);
+ if (currentVaultTimeout == null) {
+ yield this.storageService.save(jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_0__["ConstantsService"].vaultTimeoutKey, -1);
+ }
+ // Default action to "lock".
+ const currentVaultTimeoutAction = yield this.storageService.get(jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_0__["ConstantsService"].vaultTimeoutActionKey);
+ if (currentVaultTimeoutAction == null) {
+ yield this.storageService.save(jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_0__["ConstantsService"].vaultTimeoutActionKey, 'lock');
+ }
+ });
+ }
+}
+
+
+/***/ }),
+
+/***/ "./src/background/tabs.background.ts":
+/*!*******************************************!*\
+ !*** ./src/background/tabs.background.ts ***!
+ \*******************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return TabsBackground; });
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+class TabsBackground {
+ constructor(main, notificationBackground) {
+ this.main = main;
+ this.notificationBackground = notificationBackground;
+ }
+ init() {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (!chrome.tabs) {
+ return;
+ }
+ chrome.tabs.onActivated.addListener((activeInfo) => __awaiter(this, void 0, void 0, function* () {
+ yield this.main.refreshBadgeAndMenu();
+ this.main.messagingService.send('tabActivated');
+ this.main.messagingService.send('tabChanged');
+ }));
+ chrome.tabs.onReplaced.addListener((addedTabId, removedTabId) => __awaiter(this, void 0, void 0, function* () {
+ if (this.main.onReplacedRan) {
+ return;
+ }
+ this.main.onReplacedRan = true;
+ yield this.notificationBackground.checkNotificationQueue();
+ yield this.main.refreshBadgeAndMenu();
+ this.main.messagingService.send('tabReplaced');
+ this.main.messagingService.send('tabChanged');
+ }));
+ chrome.tabs.onUpdated.addListener((tabId, changeInfo, tab) => __awaiter(this, void 0, void 0, function* () {
+ if (this.main.onUpdatedRan) {
+ return;
+ }
+ this.main.onUpdatedRan = true;
+ yield this.notificationBackground.checkNotificationQueue(tab);
+ yield this.main.refreshBadgeAndMenu();
+ this.main.messagingService.send('tabUpdated');
+ this.main.messagingService.send('tabChanged');
+ }));
+ });
+ }
+}
+
+
+/***/ }),
+
+/***/ "./src/background/webRequest.background.ts":
+/*!*************************************************!*\
+ !*** ./src/background/webRequest.background.ts ***!
+ \*************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return WebRequestBackground; });
+/* harmony import */ var jslib_common_enums_uriMatchType__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jslib-common/enums/uriMatchType */ "./jslib/common/src/enums/uriMatchType.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+class WebRequestBackground {
+ constructor(platformUtilsService, cipherService, vaultTimeoutService) {
+ this.cipherService = cipherService;
+ this.vaultTimeoutService = vaultTimeoutService;
+ this.pendingAuthRequests = [];
+ this.webRequest = window.chrome.webRequest;
+ this.isFirefox = platformUtilsService.isFirefox();
+ }
+ init() {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (!this.webRequest || !this.webRequest.onAuthRequired) {
+ return;
+ }
+ this.webRequest.onAuthRequired.addListener((details, callback) => __awaiter(this, void 0, void 0, function* () {
+ if (!details.url || this.pendingAuthRequests.indexOf(details.requestId) !== -1) {
+ if (callback) {
+ callback();
+ }
+ return;
+ }
+ this.pendingAuthRequests.push(details.requestId);
+ if (this.isFirefox) {
+ return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {
+ yield this.resolveAuthCredentials(details.url, resolve, reject);
+ }));
+ }
+ else {
+ yield this.resolveAuthCredentials(details.url, callback, callback);
+ }
+ }), { urls: ['http://*/*', 'https://*/*'] }, [this.isFirefox ? 'blocking' : 'asyncBlocking']);
+ this.webRequest.onCompleted.addListener((details) => this.completeAuthRequest(details), { urls: ['http://*/*'] });
+ this.webRequest.onErrorOccurred.addListener((details) => this.completeAuthRequest(details), { urls: ['http://*/*'] });
+ });
+ }
+ resolveAuthCredentials(domain, success, error) {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (yield this.vaultTimeoutService.isLocked()) {
+ error();
+ return;
+ }
+ try {
+ const ciphers = yield this.cipherService.getAllDecryptedForUrl(domain, null, jslib_common_enums_uriMatchType__WEBPACK_IMPORTED_MODULE_0__["UriMatchType"].Host);
+ if (ciphers == null || ciphers.length !== 1) {
+ error();
+ return;
+ }
+ success({
+ authCredentials: {
+ username: ciphers[0].login.username,
+ password: ciphers[0].login.password,
+ },
+ });
+ }
+ catch (_a) {
+ error();
+ }
+ });
+ }
+ completeAuthRequest(details) {
+ const i = this.pendingAuthRequests.indexOf(details.requestId);
+ if (i > -1) {
+ this.pendingAuthRequests.splice(i, 1);
+ }
+ }
+}
+
+
+/***/ }),
+
+/***/ "./src/background/windows.background.ts":
+/*!**********************************************!*\
+ !*** ./src/background/windows.background.ts ***!
+ \**********************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return WindowsBackground; });
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+class WindowsBackground {
+ constructor(main) {
+ this.main = main;
+ this.windows = chrome.windows;
+ }
+ init() {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (!this.windows) {
+ return;
+ }
+ this.windows.onFocusChanged.addListener((windowId) => __awaiter(this, void 0, void 0, function* () {
+ if (windowId === null || windowId < 0) {
+ return;
+ }
+ yield this.main.refreshBadgeAndMenu();
+ this.main.messagingService.send('windowFocused');
+ this.main.messagingService.send('windowChanged');
+ }));
+ });
+ }
+}
+
+
+/***/ }),
+
+/***/ "./src/browser/browserApi.ts":
+/*!***********************************!*\
+ !*** ./src/browser/browserApi.ts ***!
+ \***********************************/
+/*! exports provided: BrowserApi */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BrowserApi", function() { return BrowserApi; });
+/* harmony import */ var _safariApp__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./safariApp */ "./src/browser/safariApp.ts");
+/* harmony import */ var jslib_common_misc_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! jslib-common/misc/utils */ "./jslib/common/src/misc/utils.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+class BrowserApi {
+ static getTabFromCurrentWindowId() {
+ return __awaiter(this, void 0, void 0, function* () {
+ return yield BrowserApi.tabsQueryFirst({
+ active: true,
+ windowId: chrome.windows.WINDOW_ID_CURRENT,
+ });
+ });
+ }
+ static getTabFromCurrentWindow() {
+ return __awaiter(this, void 0, void 0, function* () {
+ return yield BrowserApi.tabsQueryFirst({
+ active: true,
+ currentWindow: true,
+ });
+ });
+ }
+ static getActiveTabs() {
+ return __awaiter(this, void 0, void 0, function* () {
+ return yield BrowserApi.tabsQuery({
+ active: true,
+ });
+ });
+ }
+ static tabsQuery(options) {
+ return __awaiter(this, void 0, void 0, function* () {
+ return new Promise(resolve => {
+ chrome.tabs.query(options, (tabs) => {
+ resolve(tabs);
+ });
+ });
+ });
+ }
+ static tabsQueryFirst(options) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const tabs = yield BrowserApi.tabsQuery(options);
+ if (tabs.length > 0) {
+ return tabs[0];
+ }
+ return null;
+ });
+ }
+ static tabSendMessageData(tab, command, data = null) {
+ const obj = {
+ command: command,
+ };
+ if (data != null) {
+ obj.data = data;
+ }
+ return BrowserApi.tabSendMessage(tab, obj);
+ }
+ static tabSendMessage(tab, obj, options = null) {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (!tab || !tab.id) {
+ return;
+ }
+ return new Promise(resolve => {
+ chrome.tabs.sendMessage(tab.id, obj, options, () => {
+ if (chrome.runtime.lastError) {
+ // Some error happened
+ }
+ resolve();
+ });
+ });
+ });
+ }
+ static getBackgroundPage() {
+ return chrome.extension.getBackgroundPage();
+ }
+ static getApplicationVersion() {
+ return chrome.runtime.getManifest().version;
+ }
+ static isPopupOpen() {
+ return __awaiter(this, void 0, void 0, function* () {
+ return Promise.resolve(chrome.extension.getViews({ type: 'popup' }).length > 0);
+ });
+ }
+ static createNewTab(url, extensionPage = false, active = true) {
+ chrome.tabs.create({ url: url, active: active });
+ }
+ static messageListener(name, callback) {
+ chrome.runtime.onMessage.addListener((msg, sender, response) => {
+ callback(msg, sender, response);
+ });
+ }
+ static closeLoginTab() {
+ return __awaiter(this, void 0, void 0, function* () {
+ const tabs = yield BrowserApi.tabsQuery({
+ active: true,
+ title: 'Bitwarden',
+ windowType: 'normal',
+ currentWindow: true,
+ });
+ if (tabs.length === 0) {
+ return;
+ }
+ const tabToClose = tabs[tabs.length - 1].id;
+ chrome.tabs.remove(tabToClose);
+ });
+ }
+ static focusSpecifiedTab(tabId) {
+ return __awaiter(this, void 0, void 0, function* () {
+ chrome.tabs.update(tabId, { active: true, highlighted: true });
+ });
+ }
+ static closePopup(win) {
+ if (BrowserApi.isWebExtensionsApi && BrowserApi.isFirefoxOnAndroid) {
+ // Reactivating the active tab dismisses the popup tab. The promise final
+ // condition is only called if the popup wasn't already dismissed (future proofing).
+ // ref: https://bugzilla.mozilla.org/show_bug.cgi?id=1433604
+ browser.tabs.update({ active: true }).finally(win.close);
+ }
+ else {
+ win.close();
+ }
+ }
+ static downloadFile(win, blobData, blobOptions, fileName) {
+ if (BrowserApi.isSafariApi) {
+ const type = blobOptions != null ? blobOptions.type : null;
+ let data = null;
+ if (type === 'text/plain' && typeof (blobData) === 'string') {
+ data = blobData;
+ }
+ else {
+ data = jslib_common_misc_utils__WEBPACK_IMPORTED_MODULE_1__["Utils"].fromBufferToB64(blobData);
+ }
+ _safariApp__WEBPACK_IMPORTED_MODULE_0__["SafariApp"].sendMessageToApp('downloadFile', JSON.stringify({
+ blobData: data,
+ blobOptions: blobOptions,
+ fileName: fileName,
+ }), true);
+ }
+ else {
+ const blob = new Blob([blobData], blobOptions);
+ if (navigator.msSaveOrOpenBlob) {
+ navigator.msSaveBlob(blob, fileName);
+ }
+ else {
+ const a = win.document.createElement('a');
+ a.href = URL.createObjectURL(blob);
+ a.download = fileName;
+ win.document.body.appendChild(a);
+ a.click();
+ win.document.body.removeChild(a);
+ }
+ }
+ }
+ static gaFilter() {
+ return "development" !== 'production';
+ }
+ static getUILanguage(win) {
+ return chrome.i18n.getUILanguage();
+ }
+ static reloadExtension(win) {
+ if (win != null) {
+ return win.location.reload(true);
+ }
+ else {
+ return chrome.runtime.reload();
+ }
+ }
+ static reloadOpenWindows() {
+ const views = chrome.extension.getViews();
+ views.filter(w => w.location.href != null).forEach(w => {
+ w.location.reload();
+ });
+ }
+ static connectNative(application) {
+ if (BrowserApi.isWebExtensionsApi) {
+ return browser.runtime.connectNative(application);
+ }
+ else if (BrowserApi.isChromeApi) {
+ return chrome.runtime.connectNative(application);
+ }
+ }
+ static requestPermission(permission) {
+ if (BrowserApi.isWebExtensionsApi) {
+ return browser.permissions.request(permission);
+ }
+ return new Promise((resolve, reject) => {
+ chrome.permissions.request(permission, resolve);
+ });
+ }
+ static getPlatformInfo() {
+ if (BrowserApi.isWebExtensionsApi) {
+ return browser.runtime.getPlatformInfo();
+ }
+ return new Promise(resolve => {
+ chrome.runtime.getPlatformInfo(resolve);
+ });
+ }
+}
+BrowserApi.isWebExtensionsApi = (typeof browser !== 'undefined');
+BrowserApi.isSafariApi = navigator.userAgent.indexOf(' Safari/') !== -1 &&
+ navigator.userAgent.indexOf(' Chrome/') === -1 &&
+ navigator.userAgent.indexOf(' Chromium/') === -1;
+BrowserApi.isChromeApi = !BrowserApi.isSafariApi && (typeof chrome !== 'undefined');
+BrowserApi.isFirefoxOnAndroid = navigator.userAgent.indexOf('Firefox/') !== -1 &&
+ navigator.userAgent.indexOf('Android') !== -1;
+
+
+/***/ }),
+
+/***/ "./src/browser/safariApp.ts":
+/*!**********************************!*\
+ !*** ./src/browser/safariApp.ts ***!
+ \**********************************/
+/*! exports provided: SafariApp */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SafariApp", function() { return SafariApp; });
+/* harmony import */ var _browserApi__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./browserApi */ "./src/browser/browserApi.ts");
+
+class SafariApp {
+ static sendMessageToApp(command, data = null, resolveNow = false) {
+ if (!_browserApi__WEBPACK_IMPORTED_MODULE_0__["BrowserApi"].isSafariApi) {
+ return Promise.resolve(null);
+ }
+ return new Promise(resolve => {
+ const now = new Date();
+ const messageId = now.getTime().toString() + '_' + Math.floor(Math.random() * Number.MAX_SAFE_INTEGER);
+ browser.runtime.sendNativeMessage('com.bitwarden.desktop', {
+ id: messageId,
+ command: command,
+ data: data,
+ responseData: null,
+ }, (response) => {
+ resolve(response);
+ });
+ });
+ }
+}
+
+
+/***/ }),
+
+/***/ "./src/models/autofillScript.ts":
+/*!**************************************!*\
+ !*** ./src/models/autofillScript.ts ***!
+ \**************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return AutofillScript; });
+class AutofillScript {
+ constructor(documentUUID) {
+ this.script = [];
+ this.documentUUID = {};
+ this.properties = {};
+ this.options = {};
+ this.metadata = {};
+ this.autosubmit = null;
+ this.documentUUID = documentUUID;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./src/popup/services/popup-utils.service.ts":
+/*!***************************************************!*\
+ !*** ./src/popup/services/popup-utils.service.ts ***!
+ \***************************************************/
+/*! exports provided: PopupUtilsService */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PopupUtilsService", function() { return PopupUtilsService; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var _browser_browserApi__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../browser/browserApi */ "./src/browser/browserApi.ts");
+/* harmony import */ var jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! jslib-common/abstractions/platformUtils.service */ "./jslib/common/src/abstractions/platformUtils.service.ts");
+
+
+
+
+
+class PopupUtilsService {
+ constructor(platformUtilsService) {
+ this.platformUtilsService = platformUtilsService;
+ }
+ inSidebar(win) {
+ return win.location.search !== '' && win.location.search.indexOf('uilocation=sidebar') > -1;
+ }
+ inTab(win) {
+ return win.location.search !== '' && win.location.search.indexOf('uilocation=tab') > -1;
+ }
+ inPopout(win) {
+ return win.location.search !== '' && win.location.search.indexOf('uilocation=popout') > -1;
+ }
+ inPopup(win) {
+ return win.location.search === '' || win.location.search.indexOf('uilocation=') === -1 ||
+ win.location.search.indexOf('uilocation=popup') > -1;
+ }
+ getContentScrollY(win, scrollingContainer = 'content') {
+ const content = win.document.getElementsByTagName(scrollingContainer)[0];
+ return content.scrollTop;
+ }
+ setContentScrollY(win, scrollY, scrollingContainer = 'content') {
+ if (scrollY != null) {
+ const content = win.document.getElementsByTagName(scrollingContainer)[0];
+ content.scrollTop = scrollY;
+ }
+ }
+ popOut(win, href = null) {
+ if (href === null) {
+ href = win.location.href;
+ }
+ if ((typeof chrome !== 'undefined') && chrome.windows && chrome.windows.create) {
+ if (href.indexOf('?uilocation=') > -1) {
+ href = href.replace('uilocation=popup', 'uilocation=popout')
+ .replace('uilocation=tab', 'uilocation=popout')
+ .replace('uilocation=sidebar', 'uilocation=popout');
+ }
+ else {
+ const hrefParts = href.split('#');
+ href = hrefParts[0] + '?uilocation=popout' + (hrefParts.length > 0 ? '#' + hrefParts[1] : '');
+ }
+ const bodyRect = document.querySelector('body').getBoundingClientRect();
+ chrome.windows.create({
+ url: href,
+ type: 'popup',
+ width: Math.round(bodyRect.width ? bodyRect.width + 60 : 375),
+ height: Math.round(bodyRect.height || 600),
+ });
+ if (this.inPopup(win)) {
+ _browser_browserApi__WEBPACK_IMPORTED_MODULE_1__["BrowserApi"].closePopup(win);
+ }
+ }
+ else if ((typeof chrome !== 'undefined') && chrome.tabs && chrome.tabs.create) {
+ href = href.replace('uilocation=popup', 'uilocation=tab')
+ .replace('uilocation=popout', 'uilocation=tab')
+ .replace('uilocation=sidebar', 'uilocation=tab');
+ chrome.tabs.create({
+ url: href,
+ });
+ }
+ }
+}
+PopupUtilsService.ɵfac = function PopupUtilsService_Factory(t) { return new (t || PopupUtilsService)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵinject"](jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_2__["PlatformUtilsService"])); };
+PopupUtilsService.ɵprov = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineInjectable"]({ token: PopupUtilsService, factory: PopupUtilsService.ɵfac });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](PopupUtilsService, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Injectable"]
+ }], function () { return [{ type: jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_2__["PlatformUtilsService"] }]; }, null); })();
+
+
+/***/ }),
+
+/***/ "./src/services/autofill.service.ts":
+/*!******************************************!*\
+ !*** ./src/services/autofill.service.ts ***!
+ \******************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return AutofillService; });
+/* harmony import */ var jslib_common_enums_cipherRepromptType__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jslib-common/enums/cipherRepromptType */ "./jslib/common/src/enums/cipherRepromptType.ts");
+/* harmony import */ var jslib_common_enums_cipherType__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! jslib-common/enums/cipherType */ "./jslib/common/src/enums/cipherType.ts");
+/* harmony import */ var jslib_common_enums_eventType__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! jslib-common/enums/eventType */ "./jslib/common/src/enums/eventType.ts");
+/* harmony import */ var jslib_common_enums_fieldType__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! jslib-common/enums/fieldType */ "./jslib/common/src/enums/fieldType.ts");
+/* harmony import */ var _models_autofillScript__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../models/autofillScript */ "./src/models/autofillScript.ts");
+/* harmony import */ var _browser_browserApi__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../browser/browserApi */ "./src/browser/browserApi.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+
+
+
+
+const CardAttributes = ['autoCompleteType', 'data-stripe', 'htmlName', 'htmlID', 'label-tag',
+ 'placeholder', 'label-left', 'label-top', 'data-recurly'];
+const CardAttributesExtended = [...CardAttributes, 'label-right'];
+const IdentityAttributes = ['autoCompleteType', 'data-stripe', 'htmlName', 'htmlID', 'label-tag',
+ 'placeholder', 'label-left', 'label-top', 'data-recurly'];
+const UsernameFieldNames = [
+ // English
+ 'username', 'user name', 'email', 'email address', 'e-mail', 'e-mail address', 'userid', 'user id',
+ 'customer id', 'login id',
+ // German
+ 'benutzername', 'benutzer name', 'email adresse', 'e-mail adresse', 'benutzerid', 'benutzer id'
+];
+const FirstnameFieldNames = [
+ // English
+ 'f-name', 'first-name', 'given-name', 'first-n',
+ // German
+ 'vorname',
+];
+const LastnameFieldNames = [
+ // English
+ 'l-name', 'last-name', 's-name', 'surname', 'family-name', 'family-n', 'last-n',
+ // German
+ 'nachname', 'familienname',
+];
+const ExcludedAutofillTypes = ['radio', 'checkbox', 'hidden', 'file', 'button', 'image', 'reset', 'search'];
+// Each index represents a language. These three arrays should all be the same length.
+// 0: English, 1: Danish, 2: German/Dutch, 3: French/Spanish/Italian, 4: Russian, 5: Portuguese
+const MonthAbbr = ['mm', 'mm', 'mm', 'mm', 'mm', 'mm'];
+const YearAbbrShort = ['yy', 'åå', 'jj', 'aa', 'гг', 'rr'];
+const YearAbbrLong = ['yyyy', 'åååå', 'jjjj', 'aa', 'гггг', 'rrrr'];
+const OperationDelays = new Map([
+ ['buzzsprout.com', 100],
+]);
+/* tslint:disable */
+const IsoCountries = {
+ afghanistan: "AF", "aland islands": "AX", albania: "AL", algeria: "DZ", "american samoa": "AS", andorra: "AD",
+ angola: "AO", anguilla: "AI", antarctica: "AQ", "antigua and barbuda": "AG", argentina: "AR", armenia: "AM",
+ aruba: "AW", australia: "AU", austria: "AT", azerbaijan: "AZ", bahamas: "BS", bahrain: "BH", bangladesh: "BD",
+ barbados: "BB", belarus: "BY", belgium: "BE", belize: "BZ", benin: "BJ", bermuda: "BM", bhutan: "BT",
+ bolivia: "BO", "bosnia and herzegovina": "BA", botswana: "BW", "bouvet island": "BV", brazil: "BR",
+ "british indian ocean territory": "IO", "brunei darussalam": "BN", bulgaria: "BG", "burkina faso": "BF",
+ burundi: "BI", cambodia: "KH", cameroon: "CM", canada: "CA", "cape verde": "CV", "cayman islands": "KY",
+ "central african republic": "CF", chad: "TD", chile: "CL", china: "CN", "christmas island": "CX",
+ "cocos (keeling) islands": "CC", colombia: "CO", comoros: "KM", congo: "CG", "congo, democratic republic": "CD",
+ "cook islands": "CK", "costa rica": "CR", "cote d'ivoire": "CI", croatia: "HR", cuba: "CU", cyprus: "CY",
+ "czech republic": "CZ", denmark: "DK", djibouti: "DJ", dominica: "DM", "dominican republic": "DO", ecuador: "EC",
+ egypt: "EG", "el salvador": "SV", "equatorial guinea": "GQ", eritrea: "ER", estonia: "EE", ethiopia: "ET",
+ "falkland islands": "FK", "faroe islands": "FO", fiji: "FJ", finland: "FI", france: "FR", "french guiana": "GF",
+ "french polynesia": "PF", "french southern territories": "TF", gabon: "GA", gambia: "GM", georgia: "GE",
+ germany: "DE", ghana: "GH", gibraltar: "GI", greece: "GR", greenland: "GL", grenada: "GD", guadeloupe: "GP",
+ guam: "GU", guatemala: "GT", guernsey: "GG", guinea: "GN", "guinea-bissau": "GW", guyana: "GY", haiti: "HT",
+ "heard island & mcdonald islands": "HM", "holy see (vatican city state)": "VA", honduras: "HN", "hong kong": "HK",
+ hungary: "HU", iceland: "IS", india: "IN", indonesia: "ID", "iran, islamic republic of": "IR", iraq: "IQ",
+ ireland: "IE", "isle of man": "IM", israel: "IL", italy: "IT", jamaica: "JM", japan: "JP", jersey: "JE",
+ jordan: "JO", kazakhstan: "KZ", kenya: "KE", kiribati: "KI", "republic of korea": "KR", "south korea": "KR",
+ "democratic people's republic of korea": "KP", "north korea": "KP", kuwait: "KW", kyrgyzstan: "KG",
+ "lao people's democratic republic": "LA", latvia: "LV", lebanon: "LB", lesotho: "LS", liberia: "LR",
+ "libyan arab jamahiriya": "LY", liechtenstein: "LI", lithuania: "LT", luxembourg: "LU", macao: "MO",
+ macedonia: "MK", madagascar: "MG", malawi: "MW", malaysia: "MY", maldives: "MV", mali: "ML", malta: "MT",
+ "marshall islands": "MH", martinique: "MQ", mauritania: "MR", mauritius: "MU", mayotte: "YT", mexico: "MX",
+ "micronesia, federated states of": "FM", moldova: "MD", monaco: "MC", mongolia: "MN", montenegro: "ME",
+ montserrat: "MS", morocco: "MA", mozambique: "MZ", myanmar: "MM", namibia: "NA", nauru: "NR", nepal: "NP",
+ netherlands: "NL", "netherlands antilles": "AN", "new caledonia": "NC", "new zealand": "NZ", nicaragua: "NI",
+ niger: "NE", nigeria: "NG", niue: "NU", "norfolk island": "NF", "northern mariana islands": "MP", norway: "NO",
+ oman: "OM", pakistan: "PK", palau: "PW", "palestinian territory, occupied": "PS", panama: "PA",
+ "papua new guinea": "PG", paraguay: "PY", peru: "PE", philippines: "PH", pitcairn: "PN", poland: "PL",
+ portugal: "PT", "puerto rico": "PR", qatar: "QA", reunion: "RE", romania: "RO", "russian federation": "RU",
+ rwanda: "RW", "saint barthelemy": "BL", "saint helena": "SH", "saint kitts and nevis": "KN", "saint lucia": "LC",
+ "saint martin": "MF", "saint pierre and miquelon": "PM", "saint vincent and grenadines": "VC", samoa: "WS",
+ "san marino": "SM", "sao tome and principe": "ST", "saudi arabia": "SA", senegal: "SN", serbia: "RS",
+ seychelles: "SC", "sierra leone": "SL", singapore: "SG", slovakia: "SK", slovenia: "SI", "solomon islands": "SB",
+ somalia: "SO", "south africa": "ZA", "south georgia and sandwich isl.": "GS", spain: "ES", "sri lanka": "LK",
+ sudan: "SD", suriname: "SR", "svalbard and jan mayen": "SJ", swaziland: "SZ", sweden: "SE", switzerland: "CH",
+ "syrian arab republic": "SY", taiwan: "TW", tajikistan: "TJ", tanzania: "TZ", thailand: "TH", "timor-leste": "TL",
+ togo: "TG", tokelau: "TK", tonga: "TO", "trinidad and tobago": "TT", tunisia: "TN", turkey: "TR",
+ turkmenistan: "TM", "turks and caicos islands": "TC", tuvalu: "TV", uganda: "UG", ukraine: "UA",
+ "united arab emirates": "AE", "united kingdom": "GB", "united states": "US",
+ "united states outlying islands": "UM", uruguay: "UY", uzbekistan: "UZ", vanuatu: "VU", venezuela: "VE",
+ vietnam: "VN", "virgin islands, british": "VG", "virgin islands, u.s.": "VI", "wallis and futuna": "WF",
+ "western sahara": "EH", yemen: "YE", zambia: "ZM", zimbabwe: "ZW",
+};
+const IsoStates = {
+ alabama: 'AL', alaska: 'AK', 'american samoa': 'AS', arizona: 'AZ', arkansas: 'AR', california: 'CA',
+ colorado: 'CO', connecticut: 'CT', delaware: 'DE', 'district of columbia': 'DC',
+ 'federated states of micronesia': 'FM', florida: 'FL', georgia: 'GA', guam: 'GU', hawaii: 'HI', idaho: 'ID',
+ illinois: 'IL', indiana: 'IN', iowa: 'IA', kansas: 'KS', kentucky: 'KY', louisiana: 'LA', maine: 'ME',
+ 'marshall islands': 'MH', maryland: 'MD', massachusetts: 'MA', michigan: 'MI', minnesota: 'MN', mississippi: 'MS',
+ missouri: 'MO', montana: 'MT', nebraska: 'NE', nevada: 'NV', 'new hampshire': 'NH', 'new jersey': 'NJ',
+ 'new mexico': 'NM', 'new york': 'NY', 'north carolina': 'NC', 'north dakota': 'ND',
+ 'northern mariana islands': 'MP', ohio: 'OH', oklahoma: 'OK', oregon: 'OR', palau: 'PW', pennsylvania: 'PA',
+ 'puerto rico': 'PR', 'rhode island': 'RI', 'south carolina': 'SC', 'south dakota': 'SD', tennessee: 'TN',
+ texas: 'TX', utah: 'UT', vermont: 'VT', 'virgin islands': 'VI', virginia: 'VA', washington: 'WA',
+ 'west virginia': 'WV', wisconsin: 'WI', wyoming: 'WY',
+};
+var IsoProvinces = {
+ alberta: 'AB', 'british columbia': 'BC', manitoba: 'MB', 'new brunswick': 'NB', 'newfoundland and labrador': 'NL',
+ 'nova scotia': 'NS', ontario: 'ON', 'prince edward island': 'PE', quebec: 'QC', saskatchewan: 'SK',
+};
+/* tslint:enable */
+class AutofillService {
+ constructor(cipherService, userService, totpService, eventService, logService) {
+ this.cipherService = cipherService;
+ this.userService = userService;
+ this.totpService = totpService;
+ this.eventService = eventService;
+ this.logService = logService;
+ }
+ getFormsWithPasswordFields(pageDetails) {
+ const formData = [];
+ const passwordFields = this.loadPasswordFields(pageDetails, true, true, false, false);
+ if (passwordFields.length === 0) {
+ return formData;
+ }
+ for (const formKey in pageDetails.forms) {
+ if (!pageDetails.forms.hasOwnProperty(formKey)) {
+ continue;
+ }
+ const formPasswordFields = passwordFields.filter(pf => formKey === pf.form);
+ if (formPasswordFields.length > 0) {
+ let uf = this.findUsernameField(pageDetails, formPasswordFields[0], false, false, false);
+ if (uf == null) {
+ // not able to find any viewable username fields. maybe there are some "hidden" ones?
+ uf = this.findUsernameField(pageDetails, formPasswordFields[0], true, true, false);
+ }
+ formData.push({
+ form: pageDetails.forms[formKey],
+ password: formPasswordFields[0],
+ username: uf,
+ passwords: formPasswordFields,
+ });
+ }
+ }
+ return formData;
+ }
+ doAutoFill(options) {
+ return __awaiter(this, void 0, void 0, function* () {
+ let totpPromise = null;
+ const tab = yield this.getActiveTab();
+ if (!tab || !options.cipher || !options.pageDetails || !options.pageDetails.length) {
+ throw new Error('Nothing to auto-fill.');
+ }
+ const canAccessPremium = yield this.userService.canAccessPremium();
+ let didAutofill = false;
+ options.pageDetails.forEach((pd) => {
+ // make sure we're still on correct tab
+ if (pd.tab.id !== tab.id || pd.tab.url !== tab.url) {
+ return;
+ }
+ const fillScript = this.generateFillScript(pd.details, {
+ skipUsernameOnlyFill: options.skipUsernameOnlyFill || false,
+ onlyEmptyFields: options.onlyEmptyFields || false,
+ onlyVisibleFields: options.onlyVisibleFields || false,
+ fillNewPassword: options.fillNewPassword || false,
+ cipher: options.cipher,
+ });
+ if (!fillScript || !fillScript.script || !fillScript.script.length) {
+ return;
+ }
+ // Add a small delay between operations
+ fillScript.properties.delay_between_operations = 20;
+ didAutofill = true;
+ if (!options.skipLastUsed) {
+ this.cipherService.updateLastUsedDate(options.cipher.id);
+ }
+ _browser_browserApi__WEBPACK_IMPORTED_MODULE_5__["BrowserApi"].tabSendMessage(tab, {
+ command: 'fillForm',
+ fillScript: fillScript,
+ url: tab.url,
+ }, { frameId: pd.frameId });
+ if (options.cipher.type !== jslib_common_enums_cipherType__WEBPACK_IMPORTED_MODULE_1__["CipherType"].Login || totpPromise || !options.cipher.login.totp ||
+ (!canAccessPremium && !options.cipher.organizationUseTotp)) {
+ return;
+ }
+ totpPromise = this.totpService.isAutoCopyEnabled().then(enabled => {
+ if (enabled) {
+ return this.totpService.getCode(options.cipher.login.totp);
+ }
+ return null;
+ });
+ });
+ if (didAutofill) {
+ this.eventService.collect(jslib_common_enums_eventType__WEBPACK_IMPORTED_MODULE_2__["EventType"].Cipher_ClientAutofilled, options.cipher.id);
+ if (totpPromise != null) {
+ return yield totpPromise;
+ }
+ else {
+ return null;
+ }
+ }
+ else {
+ throw new Error('Did not auto-fill.');
+ }
+ });
+ }
+ doAutoFillActiveTab(pageDetails, fromCommand) {
+ var _a, _b;
+ return __awaiter(this, void 0, void 0, function* () {
+ const tab = yield this.getActiveTab();
+ if (!tab || !tab.url) {
+ return;
+ }
+ let cipher;
+ if (fromCommand) {
+ cipher = yield this.cipherService.getNextCipherForUrl(tab.url);
+ }
+ else {
+ const lastLaunchedCipher = yield this.cipherService.getLastLaunchedForUrl(tab.url, true);
+ if (lastLaunchedCipher && Date.now().valueOf() - ((_b = (_a = lastLaunchedCipher.localData) === null || _a === void 0 ? void 0 : _a.lastLaunched) === null || _b === void 0 ? void 0 : _b.valueOf()) < 30000) {
+ cipher = lastLaunchedCipher;
+ }
+ else {
+ cipher = yield this.cipherService.getLastUsedForUrl(tab.url, true);
+ }
+ if (cipher == null) {
+ return null;
+ }
+ }
+ if (cipher.reprompt !== jslib_common_enums_cipherRepromptType__WEBPACK_IMPORTED_MODULE_0__["CipherRepromptType"].None) {
+ return;
+ }
+ const totpCode = yield this.doAutoFill({
+ cipher: cipher,
+ pageDetails: pageDetails,
+ skipLastUsed: !fromCommand,
+ skipUsernameOnlyFill: !fromCommand,
+ onlyEmptyFields: !fromCommand,
+ onlyVisibleFields: !fromCommand,
+ fillNewPassword: fromCommand,
+ });
+ // Update last used index as autofill has succeed
+ if (fromCommand) {
+ this.cipherService.updateLastUsedIndexForUrl(tab.url);
+ }
+ return totpCode;
+ });
+ }
+ // Helpers
+ getActiveTab() {
+ return __awaiter(this, void 0, void 0, function* () {
+ const tab = yield _browser_browserApi__WEBPACK_IMPORTED_MODULE_5__["BrowserApi"].getTabFromCurrentWindow();
+ if (!tab) {
+ throw new Error('No tab found.');
+ }
+ return tab;
+ });
+ }
+ generateFillScript(pageDetails, options) {
+ if (!pageDetails || !options.cipher) {
+ return null;
+ }
+ let fillScript = new _models_autofillScript__WEBPACK_IMPORTED_MODULE_4__["default"](pageDetails.documentUUID);
+ const filledFields = {};
+ const fields = options.cipher.fields;
+ if (fields && fields.length) {
+ const fieldNames = [];
+ fields.forEach((f) => {
+ if (this.hasValue(f.name)) {
+ fieldNames.push(f.name.toLowerCase());
+ }
+ });
+ pageDetails.fields.forEach((field) => {
+ if (filledFields.hasOwnProperty(field.opid)) {
+ return;
+ }
+ if (!field.viewable && field.tagName !== 'span') {
+ return;
+ }
+ const matchingIndex = this.findMatchingFieldIndex(field, fieldNames);
+ if (matchingIndex > -1) {
+ const matchingField = fields[matchingIndex];
+ let val;
+ if (matchingField.type === jslib_common_enums_fieldType__WEBPACK_IMPORTED_MODULE_3__["FieldType"].Linked) {
+ // Assumption: Linked Field is not being used to autofill a boolean value
+ val = options.cipher.linkedFieldValue(matchingField.linkedId);
+ }
+ else {
+ val = matchingField.value;
+ if (val == null && matchingField.type === jslib_common_enums_fieldType__WEBPACK_IMPORTED_MODULE_3__["FieldType"].Boolean) {
+ val = 'false';
+ }
+ }
+ filledFields[field.opid] = field;
+ this.fillByOpid(fillScript, field, val);
+ }
+ });
+ }
+ switch (options.cipher.type) {
+ case jslib_common_enums_cipherType__WEBPACK_IMPORTED_MODULE_1__["CipherType"].Login:
+ fillScript = this.generateLoginFillScript(fillScript, pageDetails, filledFields, options);
+ break;
+ case jslib_common_enums_cipherType__WEBPACK_IMPORTED_MODULE_1__["CipherType"].Card:
+ fillScript = this.generateCardFillScript(fillScript, pageDetails, filledFields, options);
+ break;
+ case jslib_common_enums_cipherType__WEBPACK_IMPORTED_MODULE_1__["CipherType"].Identity:
+ fillScript = this.generateIdentityFillScript(fillScript, pageDetails, filledFields, options);
+ break;
+ default:
+ return null;
+ }
+ return fillScript;
+ }
+ generateLoginFillScript(fillScript, pageDetails, filledFields, options) {
+ if (!options.cipher.login) {
+ return null;
+ }
+ const passwords = [];
+ const usernames = [];
+ let pf = null;
+ let username = null;
+ const login = options.cipher.login;
+ if (!login.password || login.password === '') {
+ // No password for this login. Maybe they just wanted to auto-fill some custom fields?
+ fillScript = this.setFillScriptForFocus(filledFields, fillScript);
+ return fillScript;
+ }
+ let passwordFields = this.loadPasswordFields(pageDetails, false, false, options.onlyEmptyFields, options.fillNewPassword);
+ if (!passwordFields.length && !options.onlyVisibleFields) {
+ // not able to find any viewable password fields. maybe there are some "hidden" ones?
+ passwordFields = this.loadPasswordFields(pageDetails, true, true, options.onlyEmptyFields, options.fillNewPassword);
+ }
+ for (const formKey in pageDetails.forms) {
+ if (!pageDetails.forms.hasOwnProperty(formKey)) {
+ continue;
+ }
+ const passwordFieldsForForm = [];
+ passwordFields.forEach(passField => {
+ if (formKey === passField.form) {
+ passwordFieldsForForm.push(passField);
+ }
+ });
+ passwordFields.forEach(passField => {
+ pf = passField;
+ passwords.push(pf);
+ if (login.username) {
+ username = this.findUsernameField(pageDetails, pf, false, false, false);
+ if (!username && !options.onlyVisibleFields) {
+ // not able to find any viewable username fields. maybe there are some "hidden" ones?
+ username = this.findUsernameField(pageDetails, pf, true, true, false);
+ }
+ if (username) {
+ usernames.push(username);
+ }
+ }
+ });
+ }
+ if (passwordFields.length && !passwords.length) {
+ // The page does not have any forms with password fields. Use the first password field on the page and the
+ // input field just before it as the username.
+ pf = passwordFields[0];
+ passwords.push(pf);
+ if (login.username && pf.elementNumber > 0) {
+ username = this.findUsernameField(pageDetails, pf, false, false, true);
+ if (!username && !options.onlyVisibleFields) {
+ // not able to find any viewable username fields. maybe there are some "hidden" ones?
+ username = this.findUsernameField(pageDetails, pf, true, true, true);
+ }
+ if (username) {
+ usernames.push(username);
+ }
+ }
+ }
+ if (!passwordFields.length && !options.skipUsernameOnlyFill) {
+ // No password fields on this page. Let's try to just fuzzy fill the username.
+ pageDetails.fields.forEach((f) => {
+ if (f.viewable && (f.type === 'text' || f.type === 'email' || f.type === 'tel') &&
+ this.fieldIsFuzzyMatch(f, UsernameFieldNames)) {
+ usernames.push(f);
+ }
+ });
+ }
+ usernames.forEach(u => {
+ if (filledFields.hasOwnProperty(u.opid)) {
+ return;
+ }
+ filledFields[u.opid] = u;
+ this.fillByOpid(fillScript, u, login.username);
+ });
+ passwords.forEach(p => {
+ if (filledFields.hasOwnProperty(p.opid)) {
+ return;
+ }
+ filledFields[p.opid] = p;
+ this.fillByOpid(fillScript, p, login.password);
+ });
+ fillScript = this.setFillScriptForFocus(filledFields, fillScript);
+ return fillScript;
+ }
+ generateCardFillScript(fillScript, pageDetails, filledFields, options) {
+ if (!options.cipher.card) {
+ return null;
+ }
+ const fillFields = {};
+ pageDetails.fields.forEach((f) => {
+ if (this.forCustomFieldsOnly(f)) {
+ return;
+ }
+ if (this.isExcludedType(f.type, ExcludedAutofillTypes)) {
+ return;
+ }
+ for (let i = 0; i < CardAttributes.length; i++) {
+ const attr = CardAttributes[i];
+ if (!f.hasOwnProperty(attr) || !f[attr] || !f.viewable) {
+ continue;
+ }
+ // ref https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#autofill
+ // ref https://developers.google.com/web/fundamentals/design-and-ux/input/forms/
+ if (!fillFields.cardholderName && this.isFieldMatch(f[attr], ['cc-name', 'card-name', 'cardholder-name', 'cardholder', 'name', 'nom'], ['cc-name', 'card-name', 'cardholder-name', 'cardholder', 'tbName'])) {
+ fillFields.cardholderName = f;
+ break;
+ }
+ else if (!fillFields.number && this.isFieldMatch(f[attr], ['cc-number', 'cc-num', 'card-number', 'card-num', 'number', 'cc', 'cc-no', 'card-no',
+ 'credit-card', 'numero-carte', 'carte', 'carte-credit', 'num-carte', 'cb-num'], ['cc-number', 'cc-num', 'card-number', 'card-num', 'cc-no', 'card-no', 'numero-carte',
+ 'num-carte', 'cb-num'])) {
+ fillFields.number = f;
+ break;
+ }
+ else if (!fillFields.exp && this.isFieldMatch(f[attr], ['cc-exp', 'card-exp', 'cc-expiration', 'card-expiration', 'cc-ex', 'card-ex',
+ 'card-expire', 'card-expiry', 'validite', 'expiration', 'expiry', 'mm-yy',
+ 'mm-yyyy', 'yy-mm', 'yyyy-mm', 'expiration-date', 'payment-card-expiration',
+ 'payment-cc-date'], ['mm-yy', 'mm-yyyy', 'yy-mm', 'yyyy-mm', 'expiration-date',
+ 'payment-card-expiration'])) {
+ fillFields.exp = f;
+ break;
+ }
+ else if (!fillFields.expMonth && this.isFieldMatch(f[attr], ['exp-month', 'cc-exp-month', 'cc-month', 'card-month', 'cc-mo', 'card-mo', 'exp-mo',
+ 'card-exp-mo', 'cc-exp-mo', 'card-expiration-month', 'expiration-month',
+ 'cc-mm', 'cc-m', 'card-mm', 'card-m', 'card-exp-mm', 'cc-exp-mm', 'exp-mm', 'exp-m',
+ 'expire-month', 'expire-mo', 'expiry-month', 'expiry-mo', 'card-expire-month',
+ 'card-expire-mo', 'card-expiry-month', 'card-expiry-mo', 'mois-validite',
+ 'mois-expiration', 'm-validite', 'm-expiration', 'expiry-date-field-month',
+ 'expiration-date-month', 'expiration-date-mm', 'exp-mon', 'validity-mo',
+ 'exp-date-mo', 'cb-date-mois', 'date-m'])) {
+ fillFields.expMonth = f;
+ break;
+ }
+ else if (!fillFields.expYear && this.isFieldMatch(f[attr], ['exp-year', 'cc-exp-year', 'cc-year', 'card-year', 'cc-yr', 'card-yr', 'exp-yr',
+ 'card-exp-yr', 'cc-exp-yr', 'card-expiration-year', 'expiration-year',
+ 'cc-yy', 'cc-y', 'card-yy', 'card-y', 'card-exp-yy', 'cc-exp-yy', 'exp-yy', 'exp-y',
+ 'cc-yyyy', 'card-yyyy', 'card-exp-yyyy', 'cc-exp-yyyy', 'expire-year', 'expire-yr',
+ 'expiry-year', 'expiry-yr', 'card-expire-year', 'card-expire-yr', 'card-expiry-year',
+ 'card-expiry-yr', 'an-validite', 'an-expiration', 'annee-validite',
+ 'annee-expiration', 'expiry-date-field-year', 'expiration-date-year', 'cb-date-ann',
+ 'expiration-date-yy', 'expiration-date-yyyy', 'validity-year', 'exp-date-year', 'date-y'])) {
+ fillFields.expYear = f;
+ break;
+ }
+ else if (!fillFields.code && this.isFieldMatch(f[attr], ['cvv', 'cvc', 'cvv2', 'cc-csc', 'cc-cvv', 'card-csc', 'card-cvv', 'cvd', 'cid', 'cvc2',
+ 'cnv', 'cvn2', 'cc-code', 'card-code', 'code-securite', 'security-code', 'crypto',
+ 'card-verif', 'verification-code', 'csc', 'ccv'])) {
+ fillFields.code = f;
+ break;
+ }
+ else if (!fillFields.brand && this.isFieldMatch(f[attr], ['cc-type', 'card-type', 'card-brand', 'cc-brand', 'cb-type'])) {
+ fillFields.brand = f;
+ break;
+ }
+ }
+ });
+ const card = options.cipher.card;
+ this.makeScriptAction(fillScript, card, fillFields, filledFields, 'cardholderName');
+ this.makeScriptAction(fillScript, card, fillFields, filledFields, 'number');
+ this.makeScriptAction(fillScript, card, fillFields, filledFields, 'code');
+ this.makeScriptAction(fillScript, card, fillFields, filledFields, 'brand');
+ if (fillFields.expMonth && this.hasValue(card.expMonth)) {
+ let expMonth = card.expMonth;
+ if (fillFields.expMonth.selectInfo && fillFields.expMonth.selectInfo.options) {
+ let index = null;
+ const siOptions = fillFields.expMonth.selectInfo.options;
+ if (siOptions.length === 12) {
+ index = parseInt(card.expMonth, null) - 1;
+ }
+ else if (siOptions.length === 13) {
+ if (siOptions[0][0] != null && siOptions[0][0] !== '' &&
+ (siOptions[12][0] == null || siOptions[12][0] === '')) {
+ index = parseInt(card.expMonth, null) - 1;
+ }
+ else {
+ index = parseInt(card.expMonth, null);
+ }
+ }
+ if (index != null) {
+ const option = siOptions[index];
+ if (option.length > 1) {
+ expMonth = option[1];
+ }
+ }
+ }
+ else if ((this.fieldAttrsContain(fillFields.expMonth, 'mm') || fillFields.expMonth.maxLength === 2)
+ && expMonth.length === 1) {
+ expMonth = '0' + expMonth;
+ }
+ filledFields[fillFields.expMonth.opid] = fillFields.expMonth;
+ this.fillByOpid(fillScript, fillFields.expMonth, expMonth);
+ }
+ if (fillFields.expYear && this.hasValue(card.expYear)) {
+ let expYear = card.expYear;
+ if (fillFields.expYear.selectInfo && fillFields.expYear.selectInfo.options) {
+ for (let i = 0; i < fillFields.expYear.selectInfo.options.length; i++) {
+ const o = fillFields.expYear.selectInfo.options[i];
+ if (o[0] === card.expYear || o[1] === card.expYear) {
+ expYear = o[1];
+ break;
+ }
+ if (o[1].length === 2 && card.expYear.length === 4 && o[1] === card.expYear.substring(2)) {
+ expYear = o[1];
+ break;
+ }
+ const colonIndex = o[1].indexOf(':');
+ if (colonIndex > -1 && o[1].length > colonIndex + 1) {
+ const val = o[1].substring(colonIndex + 2);
+ if (val != null && val.trim() !== '' && val === card.expYear) {
+ expYear = o[1];
+ break;
+ }
+ }
+ }
+ }
+ else if (this.fieldAttrsContain(fillFields.expYear, 'yyyy') || fillFields.expYear.maxLength === 4) {
+ if (expYear.length === 2) {
+ expYear = '20' + expYear;
+ }
+ }
+ else if (this.fieldAttrsContain(fillFields.expYear, 'yy') || fillFields.expYear.maxLength === 2) {
+ if (expYear.length === 4) {
+ expYear = expYear.substr(2);
+ }
+ }
+ filledFields[fillFields.expYear.opid] = fillFields.expYear;
+ this.fillByOpid(fillScript, fillFields.expYear, expYear);
+ }
+ if (fillFields.exp && this.hasValue(card.expMonth) && this.hasValue(card.expYear)) {
+ const fullMonth = ('0' + card.expMonth).slice(-2);
+ let fullYear = card.expYear;
+ let partYear = null;
+ if (fullYear.length === 2) {
+ partYear = fullYear;
+ fullYear = '20' + fullYear;
+ }
+ else if (fullYear.length === 4) {
+ partYear = fullYear.substr(2, 2);
+ }
+ let exp = null;
+ for (let i = 0; i < MonthAbbr.length; i++) {
+ if (this.fieldAttrsContain(fillFields.exp, MonthAbbr[i] + '/' + YearAbbrShort[i]) &&
+ partYear != null) {
+ exp = fullMonth + '/' + partYear;
+ }
+ else if (this.fieldAttrsContain(fillFields.exp, MonthAbbr[i] + '/' + YearAbbrLong[i])) {
+ exp = fullMonth + '/' + fullYear;
+ }
+ else if (this.fieldAttrsContain(fillFields.exp, YearAbbrShort[i] + '/' + MonthAbbr[i]) &&
+ partYear != null) {
+ exp = partYear + '/' + fullMonth;
+ }
+ else if (this.fieldAttrsContain(fillFields.exp, YearAbbrLong[i] + '/' + MonthAbbr[i])) {
+ exp = fullYear + '/' + fullMonth;
+ }
+ else if (this.fieldAttrsContain(fillFields.exp, MonthAbbr[i] + '-' + YearAbbrShort[i]) &&
+ partYear != null) {
+ exp = fullMonth + '-' + partYear;
+ }
+ else if (this.fieldAttrsContain(fillFields.exp, MonthAbbr[i] + '-' + YearAbbrLong[i])) {
+ exp = fullMonth + '-' + fullYear;
+ }
+ else if (this.fieldAttrsContain(fillFields.exp, YearAbbrShort[i] + '-' + MonthAbbr[i]) &&
+ partYear != null) {
+ exp = partYear + '-' + fullMonth;
+ }
+ else if (this.fieldAttrsContain(fillFields.exp, YearAbbrLong[i] + '-' + MonthAbbr[i])) {
+ exp = fullYear + '-' + fullMonth;
+ }
+ else if (this.fieldAttrsContain(fillFields.exp, YearAbbrShort[i] + MonthAbbr[i]) &&
+ partYear != null) {
+ exp = partYear + fullMonth;
+ }
+ else if (this.fieldAttrsContain(fillFields.exp, YearAbbrLong[i] + MonthAbbr[i])) {
+ exp = fullYear + fullMonth;
+ }
+ else if (this.fieldAttrsContain(fillFields.exp, MonthAbbr[i] + YearAbbrShort[i]) &&
+ partYear != null) {
+ exp = fullMonth + partYear;
+ }
+ else if (this.fieldAttrsContain(fillFields.exp, MonthAbbr[i] + YearAbbrLong[i])) {
+ exp = fullMonth + fullYear;
+ }
+ if (exp != null) {
+ break;
+ }
+ }
+ if (exp == null) {
+ exp = fullYear + '-' + fullMonth;
+ }
+ this.makeScriptActionWithValue(fillScript, exp, fillFields.exp, filledFields);
+ }
+ return fillScript;
+ }
+ fieldAttrsContain(field, containsVal) {
+ if (!field) {
+ return false;
+ }
+ let doesContain = false;
+ CardAttributesExtended.forEach(attr => {
+ if (doesContain || !field.hasOwnProperty(attr) || !field[attr]) {
+ return;
+ }
+ let val = field[attr];
+ val = val.replace(/ /g, '').toLowerCase();
+ doesContain = val.indexOf(containsVal) > -1;
+ });
+ return doesContain;
+ }
+ generateIdentityFillScript(fillScript, pageDetails, filledFields, options) {
+ if (!options.cipher.identity) {
+ return null;
+ }
+ const fillFields = {};
+ pageDetails.fields.forEach((f) => {
+ if (this.forCustomFieldsOnly(f)) {
+ return;
+ }
+ if (this.isExcludedType(f.type, ExcludedAutofillTypes)) {
+ return;
+ }
+ for (let i = 0; i < IdentityAttributes.length; i++) {
+ const attr = IdentityAttributes[i];
+ if (!f.hasOwnProperty(attr) || !f[attr] || !f.viewable) {
+ continue;
+ }
+ // ref https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#autofill
+ // ref https://developers.google.com/web/fundamentals/design-and-ux/input/forms/
+ if (!fillFields.name && this.isFieldMatch(f[attr], ['name', 'full-name', 'your-name'], ['full-name', 'your-name'])) {
+ fillFields.name = f;
+ break;
+ }
+ else if (!fillFields.firstName && this.isFieldMatch(f[attr], FirstnameFieldNames)) {
+ fillFields.firstName = f;
+ break;
+ }
+ else if (!fillFields.middleName && this.isFieldMatch(f[attr], ['m-name', 'middle-name', 'additional-name', 'middle-initial', 'middle-n', 'middle-i'])) {
+ fillFields.middleName = f;
+ break;
+ }
+ else if (!fillFields.lastName && this.isFieldMatch(f[attr], LastnameFieldNames)) {
+ fillFields.lastName = f;
+ break;
+ }
+ else if (!fillFields.title && this.isFieldMatch(f[attr], ['honorific-prefix', 'prefix', 'title'])) {
+ fillFields.title = f;
+ break;
+ }
+ else if (!fillFields.email && this.isFieldMatch(f[attr], ['e-mail', 'email-address'])) {
+ fillFields.email = f;
+ break;
+ }
+ else if (!fillFields.address && this.isFieldMatch(f[attr], ['address', 'street-address', 'addr', 'street', 'mailing-addr', 'billing-addr',
+ 'mail-addr', 'bill-addr'], ['mailing-addr', 'billing-addr', 'mail-addr', 'bill-addr'])) {
+ fillFields.address = f;
+ break;
+ }
+ else if (!fillFields.address1 && this.isFieldMatch(f[attr], ['address-1', 'address-line-1', 'addr-1', 'street-1'])) {
+ fillFields.address1 = f;
+ break;
+ }
+ else if (!fillFields.address2 && this.isFieldMatch(f[attr], ['address-2', 'address-line-2', 'addr-2', 'street-2'])) {
+ fillFields.address2 = f;
+ break;
+ }
+ else if (!fillFields.address3 && this.isFieldMatch(f[attr], ['address-3', 'address-line-3', 'addr-3', 'street-3'])) {
+ fillFields.address3 = f;
+ break;
+ }
+ else if (!fillFields.postalCode && this.isFieldMatch(f[attr], ['postal', 'zip', 'zip2', 'zip-code', 'postal-code', 'post-code', 'address-zip',
+ 'address-postal', 'address-code', 'address-postal-code', 'address-zip-code'])) {
+ fillFields.postalCode = f;
+ break;
+ }
+ else if (!fillFields.city && this.isFieldMatch(f[attr], ['city', 'town', 'address-level-2', 'address-city', 'address-town'])) {
+ fillFields.city = f;
+ break;
+ }
+ else if (!fillFields.state && this.isFieldMatch(f[attr], ['state', 'province', 'provence', 'address-level-1', 'address-state',
+ 'address-province'])) {
+ fillFields.state = f;
+ break;
+ }
+ else if (!fillFields.country && this.isFieldMatch(f[attr], ['country', 'country-code', 'country-name', 'address-country', 'address-country-name',
+ 'address-country-code'])) {
+ fillFields.country = f;
+ break;
+ }
+ else if (!fillFields.phone && this.isFieldMatch(f[attr], ['phone', 'mobile', 'mobile-phone', 'tel', 'telephone', 'phone-number'])) {
+ fillFields.phone = f;
+ break;
+ }
+ else if (!fillFields.username && this.isFieldMatch(f[attr], ['user-name', 'user-id', 'screen-name'])) {
+ fillFields.username = f;
+ break;
+ }
+ else if (!fillFields.company && this.isFieldMatch(f[attr], ['company', 'company-name', 'organization', 'organization-name'])) {
+ fillFields.company = f;
+ break;
+ }
+ }
+ });
+ const identity = options.cipher.identity;
+ this.makeScriptAction(fillScript, identity, fillFields, filledFields, 'title');
+ this.makeScriptAction(fillScript, identity, fillFields, filledFields, 'firstName');
+ this.makeScriptAction(fillScript, identity, fillFields, filledFields, 'middleName');
+ this.makeScriptAction(fillScript, identity, fillFields, filledFields, 'lastName');
+ this.makeScriptAction(fillScript, identity, fillFields, filledFields, 'address1');
+ this.makeScriptAction(fillScript, identity, fillFields, filledFields, 'address2');
+ this.makeScriptAction(fillScript, identity, fillFields, filledFields, 'address3');
+ this.makeScriptAction(fillScript, identity, fillFields, filledFields, 'city');
+ this.makeScriptAction(fillScript, identity, fillFields, filledFields, 'postalCode');
+ this.makeScriptAction(fillScript, identity, fillFields, filledFields, 'company');
+ this.makeScriptAction(fillScript, identity, fillFields, filledFields, 'email');
+ this.makeScriptAction(fillScript, identity, fillFields, filledFields, 'phone');
+ this.makeScriptAction(fillScript, identity, fillFields, filledFields, 'username');
+ let filledState = false;
+ if (fillFields.state && identity.state && identity.state.length > 2) {
+ const stateLower = identity.state.toLowerCase();
+ const isoState = IsoStates[stateLower] || IsoProvinces[stateLower];
+ if (isoState) {
+ filledState = true;
+ this.makeScriptActionWithValue(fillScript, isoState, fillFields.state, filledFields);
+ }
+ }
+ if (!filledState) {
+ this.makeScriptAction(fillScript, identity, fillFields, filledFields, 'state');
+ }
+ let filledCountry = false;
+ if (fillFields.country && identity.country && identity.country.length > 2) {
+ const countryLower = identity.country.toLowerCase();
+ const isoCountry = IsoCountries[countryLower];
+ if (isoCountry) {
+ filledCountry = true;
+ this.makeScriptActionWithValue(fillScript, isoCountry, fillFields.country, filledFields);
+ }
+ }
+ if (!filledCountry) {
+ this.makeScriptAction(fillScript, identity, fillFields, filledFields, 'country');
+ }
+ if (fillFields.name && (identity.firstName || identity.lastName)) {
+ let fullName = '';
+ if (this.hasValue(identity.firstName)) {
+ fullName = identity.firstName;
+ }
+ if (this.hasValue(identity.middleName)) {
+ if (fullName !== '') {
+ fullName += ' ';
+ }
+ fullName += identity.middleName;
+ }
+ if (this.hasValue(identity.lastName)) {
+ if (fullName !== '') {
+ fullName += ' ';
+ }
+ fullName += identity.lastName;
+ }
+ this.makeScriptActionWithValue(fillScript, fullName, fillFields.name, filledFields);
+ }
+ if (fillFields.address && this.hasValue(identity.address1)) {
+ let address = '';
+ if (this.hasValue(identity.address1)) {
+ address = identity.address1;
+ }
+ if (this.hasValue(identity.address2)) {
+ if (address !== '') {
+ address += ', ';
+ }
+ address += identity.address2;
+ }
+ if (this.hasValue(identity.address3)) {
+ if (address !== '') {
+ address += ', ';
+ }
+ address += identity.address3;
+ }
+ this.makeScriptActionWithValue(fillScript, address, fillFields.address, filledFields);
+ }
+ return fillScript;
+ }
+ isExcludedType(type, excludedTypes) {
+ return excludedTypes.indexOf(type) > -1;
+ }
+ isFieldMatch(value, options, containsOptions) {
+ value = value.trim().toLowerCase().replace(/[^a-zA-Z0-9]+/g, '');
+ for (let i = 0; i < options.length; i++) {
+ let option = options[i];
+ const checkValueContains = containsOptions == null || containsOptions.indexOf(option) > -1;
+ option = option.toLowerCase().replace(/-/g, '');
+ if (value === option || (checkValueContains && value.indexOf(option) > -1)) {
+ return true;
+ }
+ }
+ return false;
+ }
+ makeScriptAction(fillScript, cipherData, fillFields, filledFields, dataProp, fieldProp) {
+ fieldProp = fieldProp || dataProp;
+ this.makeScriptActionWithValue(fillScript, cipherData[dataProp], fillFields[fieldProp], filledFields);
+ }
+ makeScriptActionWithValue(fillScript, dataValue, field, filledFields) {
+ let doFill = false;
+ if (this.hasValue(dataValue) && field) {
+ if (field.type === 'select-one' && field.selectInfo && field.selectInfo.options) {
+ for (let i = 0; i < field.selectInfo.options.length; i++) {
+ const option = field.selectInfo.options[i];
+ for (let j = 0; j < option.length; j++) {
+ if (this.hasValue(option[j]) && option[j].toLowerCase() === dataValue.toLowerCase()) {
+ doFill = true;
+ if (option.length > 1) {
+ dataValue = option[1];
+ }
+ break;
+ }
+ }
+ if (doFill) {
+ break;
+ }
+ }
+ }
+ else {
+ doFill = true;
+ }
+ }
+ if (doFill) {
+ filledFields[field.opid] = field;
+ this.fillByOpid(fillScript, field, dataValue);
+ }
+ }
+ loadPasswordFields(pageDetails, canBeHidden, canBeReadOnly, mustBeEmpty, fillNewPassword) {
+ const arr = [];
+ pageDetails.fields.forEach(f => {
+ if (this.forCustomFieldsOnly(f)) {
+ return;
+ }
+ const isPassword = f.type === 'password';
+ const valueIsLikePassword = (value) => {
+ if (value == null) {
+ return false;
+ }
+ // Removes all whitespace, _ and - characters
+ const cleanedValue = value.toLowerCase().replace(/[\s_\-]/g, '');
+ if (cleanedValue.indexOf('password') < 0) {
+ return false;
+ }
+ const ignoreList = ['onetimepassword', 'captcha', 'findanything', 'forgot'];
+ if (ignoreList.some(i => cleanedValue.indexOf(i) > -1)) {
+ return false;
+ }
+ return true;
+ };
+ const isLikePassword = () => {
+ if (f.type !== 'text') {
+ return false;
+ }
+ if (valueIsLikePassword(f.htmlID)) {
+ return true;
+ }
+ if (valueIsLikePassword(f.htmlName)) {
+ return true;
+ }
+ if (valueIsLikePassword(f.placeholder)) {
+ return true;
+ }
+ return false;
+ };
+ if (!f.disabled && (canBeReadOnly || !f.readonly) && (isPassword || isLikePassword())
+ && (canBeHidden || f.viewable) && (!mustBeEmpty || f.value == null || f.value.trim() === '')
+ && (fillNewPassword || f.autoCompleteType !== 'new-password')) {
+ arr.push(f);
+ }
+ });
+ return arr;
+ }
+ findUsernameField(pageDetails, passwordField, canBeHidden, canBeReadOnly, withoutForm) {
+ let usernameField = null;
+ for (let i = 0; i < pageDetails.fields.length; i++) {
+ const f = pageDetails.fields[i];
+ if (this.forCustomFieldsOnly(f)) {
+ continue;
+ }
+ if (f.elementNumber >= passwordField.elementNumber) {
+ break;
+ }
+ if (!f.disabled && (canBeReadOnly || !f.readonly) &&
+ (withoutForm || f.form === passwordField.form) && (canBeHidden || f.viewable) &&
+ (f.type === 'text' || f.type === 'email' || f.type === 'tel')) {
+ usernameField = f;
+ if (this.findMatchingFieldIndex(f, UsernameFieldNames) > -1) {
+ // We found an exact match. No need to keep looking.
+ break;
+ }
+ }
+ }
+ return usernameField;
+ }
+ findMatchingFieldIndex(field, names) {
+ for (let i = 0; i < names.length; i++) {
+ if (names[i].indexOf('=') > -1) {
+ if (this.fieldPropertyIsPrefixMatch(field, 'htmlID', names[i], 'id')) {
+ return i;
+ }
+ if (this.fieldPropertyIsPrefixMatch(field, 'htmlName', names[i], 'name')) {
+ return i;
+ }
+ if (this.fieldPropertyIsPrefixMatch(field, 'label-tag', names[i], 'label')) {
+ return i;
+ }
+ if (this.fieldPropertyIsPrefixMatch(field, 'label-aria', names[i], 'label')) {
+ return i;
+ }
+ if (this.fieldPropertyIsPrefixMatch(field, 'placeholder', names[i], 'placeholder')) {
+ return i;
+ }
+ }
+ if (this.fieldPropertyIsMatch(field, 'htmlID', names[i])) {
+ return i;
+ }
+ if (this.fieldPropertyIsMatch(field, 'htmlName', names[i])) {
+ return i;
+ }
+ if (this.fieldPropertyIsMatch(field, 'label-tag', names[i])) {
+ return i;
+ }
+ if (this.fieldPropertyIsMatch(field, 'label-aria', names[i])) {
+ return i;
+ }
+ if (this.fieldPropertyIsMatch(field, 'placeholder', names[i])) {
+ return i;
+ }
+ }
+ return -1;
+ }
+ fieldPropertyIsPrefixMatch(field, property, name, prefix, separator = '=') {
+ if (name.indexOf(prefix + separator) === 0) {
+ const sepIndex = name.indexOf(separator);
+ const val = name.substring(sepIndex + 1);
+ return val != null && this.fieldPropertyIsMatch(field, property, val);
+ }
+ return false;
+ }
+ fieldPropertyIsMatch(field, property, name) {
+ let fieldVal = field[property];
+ if (!this.hasValue(fieldVal)) {
+ return false;
+ }
+ fieldVal = fieldVal.trim().replace(/(?:\r\n|\r|\n)/g, '');
+ if (name.startsWith('regex=')) {
+ try {
+ const regexParts = name.split('=', 2);
+ if (regexParts.length === 2) {
+ const regex = new RegExp(regexParts[1], 'i');
+ return regex.test(fieldVal);
+ }
+ }
+ catch (e) {
+ this.logService.error(e);
+ }
+ }
+ else if (name.startsWith('csv=')) {
+ const csvParts = name.split('=', 2);
+ if (csvParts.length === 2) {
+ const csvVals = csvParts[1].split(',');
+ for (let i = 0; i < csvVals.length; i++) {
+ const val = csvVals[i];
+ if (val != null && val.trim().toLowerCase() === fieldVal.toLowerCase()) {
+ return true;
+ }
+ }
+ return false;
+ }
+ }
+ return fieldVal.toLowerCase() === name;
+ }
+ fieldIsFuzzyMatch(field, names) {
+ if (this.hasValue(field.htmlID) && this.fuzzyMatch(names, field.htmlID)) {
+ return true;
+ }
+ if (this.hasValue(field.htmlName) && this.fuzzyMatch(names, field.htmlName)) {
+ return true;
+ }
+ if (this.hasValue(field['label-tag']) && this.fuzzyMatch(names, field['label-tag'])) {
+ return true;
+ }
+ if (this.hasValue(field.placeholder) && this.fuzzyMatch(names, field.placeholder)) {
+ return true;
+ }
+ if (this.hasValue(field['label-left']) && this.fuzzyMatch(names, field['label-left'])) {
+ return true;
+ }
+ if (this.hasValue(field['label-top']) && this.fuzzyMatch(names, field['label-top'])) {
+ return true;
+ }
+ if (this.hasValue(field['label-aria']) && this.fuzzyMatch(names, field['label-aria'])) {
+ return true;
+ }
+ return false;
+ }
+ fuzzyMatch(options, value) {
+ if (options == null || options.length === 0 || value == null || value === '') {
+ return false;
+ }
+ value = value.replace(/(?:\r\n|\r|\n)/g, '').trim().toLowerCase();
+ for (let i = 0; i < options.length; i++) {
+ if (value.indexOf(options[i]) > -1) {
+ return true;
+ }
+ }
+ return false;
+ }
+ hasValue(str) {
+ return str && str !== '';
+ }
+ setFillScriptForFocus(filledFields, fillScript) {
+ let lastField = null;
+ let lastPasswordField = null;
+ for (const opid in filledFields) {
+ if (filledFields.hasOwnProperty(opid) && filledFields[opid].viewable) {
+ lastField = filledFields[opid];
+ if (filledFields[opid].type === 'password') {
+ lastPasswordField = filledFields[opid];
+ }
+ }
+ }
+ // Prioritize password field over others.
+ if (lastPasswordField) {
+ fillScript.script.push(['focus_by_opid', lastPasswordField.opid]);
+ }
+ else if (lastField) {
+ fillScript.script.push(['focus_by_opid', lastField.opid]);
+ }
+ return fillScript;
+ }
+ fillByOpid(fillScript, field, value) {
+ if (field.maxLength && value && value.length > field.maxLength) {
+ value = value.substr(0, value.length);
+ }
+ if (field.tagName !== 'span') {
+ fillScript.script.push(['click_on_opid', field.opid]);
+ fillScript.script.push(['focus_by_opid', field.opid]);
+ }
+ fillScript.script.push(['fill_by_opid', field.opid, value]);
+ }
+ forCustomFieldsOnly(field) {
+ return field.tagName === 'span';
+ }
+}
+
+
+/***/ }),
+
+/***/ "./src/services/browserCrypto.service.ts":
+/*!***********************************************!*\
+ !*** ./src/services/browserCrypto.service.ts ***!
+ \***********************************************/
+/*! exports provided: BrowserCryptoService */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BrowserCryptoService", function() { return BrowserCryptoService; });
+/* harmony import */ var jslib_common_services_crypto_service__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jslib-common/services/crypto.service */ "./jslib/common/src/services/crypto.service.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+class BrowserCryptoService extends jslib_common_services_crypto_service__WEBPACK_IMPORTED_MODULE_0__["CryptoService"] {
+ retrieveKeyFromStorage(keySuffix) {
+ const _super = Object.create(null, {
+ retrieveKeyFromStorage: { get: () => super.retrieveKeyFromStorage }
+ });
+ var _a;
+ return __awaiter(this, void 0, void 0, function* () {
+ if (keySuffix === 'biometric') {
+ yield this.platformUtilService.authenticateBiometric();
+ return (_a = (yield this.getKey())) === null || _a === void 0 ? void 0 : _a.keyB64;
+ }
+ return yield _super.retrieveKeyFromStorage.call(this, keySuffix);
+ });
+ }
+}
+
+
+/***/ }),
+
+/***/ "./src/services/browserMessaging.service.ts":
+/*!**************************************************!*\
+ !*** ./src/services/browserMessaging.service.ts ***!
+ \**************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return BrowserMessagingService; });
+class BrowserMessagingService {
+ send(subscriber, arg = {}) {
+ const message = Object.assign({}, { command: subscriber }, arg);
+ chrome.runtime.sendMessage(message);
+ }
+}
+
+
+/***/ }),
+
+/***/ "./src/services/browserPlatformUtils.service.ts":
+/*!******************************************************!*\
+ !*** ./src/services/browserPlatformUtils.service.ts ***!
+ \******************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return BrowserPlatformUtilsService; });
+/* harmony import */ var _browser_browserApi__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../browser/browserApi */ "./src/browser/browserApi.ts");
+/* harmony import */ var _browser_safariApp__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../browser/safariApp */ "./src/browser/safariApp.ts");
+/* harmony import */ var jslib_common_enums_deviceType__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! jslib-common/enums/deviceType */ "./jslib/common/src/enums/deviceType.ts");
+/* harmony import */ var jslib_common_enums_themeType__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! jslib-common/enums/themeType */ "./jslib/common/src/enums/themeType.ts");
+/* harmony import */ var jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! jslib-common/services/constants.service */ "./jslib/common/src/services/constants.service.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+
+
+
+const DialogPromiseExpiration = 600000; // 10 minutes
+class BrowserPlatformUtilsService {
+ constructor(messagingService, storageService, clipboardWriteCallback, biometricCallback) {
+ this.messagingService = messagingService;
+ this.storageService = storageService;
+ this.clipboardWriteCallback = clipboardWriteCallback;
+ this.biometricCallback = biometricCallback;
+ this.identityClientId = 'browser';
+ this.showDialogResolves = new Map();
+ this.passwordDialogResolves = new Map();
+ this.deviceCache = null;
+ this.prefersColorSchemeDark = window.matchMedia('(prefers-color-scheme: dark)');
+ }
+ getDevice() {
+ if (this.deviceCache) {
+ return this.deviceCache;
+ }
+ if (navigator.userAgent.indexOf(' Firefox/') !== -1 || navigator.userAgent.indexOf(' Gecko/') !== -1) {
+ this.deviceCache = jslib_common_enums_deviceType__WEBPACK_IMPORTED_MODULE_2__["DeviceType"].FirefoxExtension;
+ }
+ else if ((!!window.opr && !!opr.addons) || !!window.opera ||
+ navigator.userAgent.indexOf(' OPR/') >= 0) {
+ this.deviceCache = jslib_common_enums_deviceType__WEBPACK_IMPORTED_MODULE_2__["DeviceType"].OperaExtension;
+ }
+ else if (navigator.userAgent.indexOf(' Edg/') !== -1) {
+ this.deviceCache = jslib_common_enums_deviceType__WEBPACK_IMPORTED_MODULE_2__["DeviceType"].EdgeExtension;
+ }
+ else if (navigator.userAgent.indexOf(' Vivaldi/') !== -1) {
+ this.deviceCache = jslib_common_enums_deviceType__WEBPACK_IMPORTED_MODULE_2__["DeviceType"].VivaldiExtension;
+ }
+ else if (window.chrome && navigator.userAgent.indexOf(' Chrome/') !== -1) {
+ this.deviceCache = jslib_common_enums_deviceType__WEBPACK_IMPORTED_MODULE_2__["DeviceType"].ChromeExtension;
+ }
+ else if (navigator.userAgent.indexOf(' Safari/') !== -1) {
+ this.deviceCache = jslib_common_enums_deviceType__WEBPACK_IMPORTED_MODULE_2__["DeviceType"].SafariExtension;
+ }
+ return this.deviceCache;
+ }
+ getDeviceString() {
+ const device = jslib_common_enums_deviceType__WEBPACK_IMPORTED_MODULE_2__["DeviceType"][this.getDevice()].toLowerCase();
+ return device.replace('extension', '');
+ }
+ isFirefox() {
+ return this.getDevice() === jslib_common_enums_deviceType__WEBPACK_IMPORTED_MODULE_2__["DeviceType"].FirefoxExtension;
+ }
+ isChrome() {
+ return this.getDevice() === jslib_common_enums_deviceType__WEBPACK_IMPORTED_MODULE_2__["DeviceType"].ChromeExtension;
+ }
+ isEdge() {
+ return this.getDevice() === jslib_common_enums_deviceType__WEBPACK_IMPORTED_MODULE_2__["DeviceType"].EdgeExtension;
+ }
+ isOpera() {
+ return this.getDevice() === jslib_common_enums_deviceType__WEBPACK_IMPORTED_MODULE_2__["DeviceType"].OperaExtension;
+ }
+ isVivaldi() {
+ return this.getDevice() === jslib_common_enums_deviceType__WEBPACK_IMPORTED_MODULE_2__["DeviceType"].VivaldiExtension;
+ }
+ isSafari() {
+ return this.getDevice() === jslib_common_enums_deviceType__WEBPACK_IMPORTED_MODULE_2__["DeviceType"].SafariExtension;
+ }
+ isIE() {
+ return false;
+ }
+ isMacAppStore() {
+ return false;
+ }
+ isViewOpen() {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (yield _browser_browserApi__WEBPACK_IMPORTED_MODULE_0__["BrowserApi"].isPopupOpen()) {
+ return true;
+ }
+ if (this.isSafari()) {
+ return false;
+ }
+ const sidebarView = this.sidebarViewName();
+ const sidebarOpen = sidebarView != null && chrome.extension.getViews({ type: sidebarView }).length > 0;
+ if (sidebarOpen) {
+ return true;
+ }
+ const tabOpen = chrome.extension.getViews({ type: 'tab' }).length > 0;
+ return tabOpen;
+ });
+ }
+ lockTimeout() {
+ return null;
+ }
+ launchUri(uri, options) {
+ _browser_browserApi__WEBPACK_IMPORTED_MODULE_0__["BrowserApi"].createNewTab(uri, options && options.extensionPage === true);
+ }
+ saveFile(win, blobData, blobOptions, fileName) {
+ _browser_browserApi__WEBPACK_IMPORTED_MODULE_0__["BrowserApi"].downloadFile(win, blobData, blobOptions, fileName);
+ }
+ getApplicationVersion() {
+ return Promise.resolve(_browser_browserApi__WEBPACK_IMPORTED_MODULE_0__["BrowserApi"].getApplicationVersion());
+ }
+ supportsWebAuthn(win) {
+ return (typeof (PublicKeyCredential) !== 'undefined');
+ }
+ supportsDuo() {
+ return true;
+ }
+ showToast(type, title, text, options) {
+ this.messagingService.send('showToast', {
+ text: text,
+ title: title,
+ type: type,
+ options: options,
+ });
+ }
+ showDialog(body, title, confirmText, cancelText, type, bodyIsHtml = false) {
+ const dialogId = Math.floor(Math.random() * Number.MAX_SAFE_INTEGER);
+ this.messagingService.send('showDialog', {
+ text: bodyIsHtml ? null : body,
+ html: bodyIsHtml ? body : null,
+ title: title,
+ confirmText: confirmText,
+ cancelText: cancelText,
+ type: type,
+ dialogId: dialogId,
+ });
+ return new Promise(resolve => {
+ this.showDialogResolves.set(dialogId, { resolve: resolve, date: new Date() });
+ });
+ }
+ isDev() {
+ return "development" === 'development';
+ }
+ isSelfHost() {
+ return false;
+ }
+ copyToClipboard(text, options) {
+ let win = window;
+ let doc = window.document;
+ if (options && (options.window || options.win)) {
+ win = options.window || options.win;
+ doc = win.document;
+ }
+ else if (options && options.doc) {
+ doc = options.doc;
+ }
+ const clearing = options ? !!options.clearing : false;
+ const clearMs = options && options.clearMs ? options.clearMs : null;
+ if (this.isSafari()) {
+ _browser_safariApp__WEBPACK_IMPORTED_MODULE_1__["SafariApp"].sendMessageToApp('copyToClipboard', text).then(() => {
+ if (!clearing && this.clipboardWriteCallback != null) {
+ this.clipboardWriteCallback(text, clearMs);
+ }
+ });
+ }
+ else if (this.isFirefox() && win.navigator.clipboard && win.navigator.clipboard.writeText) {
+ win.navigator.clipboard.writeText(text).then(() => {
+ if (!clearing && this.clipboardWriteCallback != null) {
+ this.clipboardWriteCallback(text, clearMs);
+ }
+ });
+ }
+ else if (win.clipboardData && win.clipboardData.setData) {
+ // IE specific code path to prevent textarea being shown while dialog is visible.
+ win.clipboardData.setData('Text', text);
+ if (!clearing && this.clipboardWriteCallback != null) {
+ this.clipboardWriteCallback(text, clearMs);
+ }
+ }
+ else if (doc.queryCommandSupported && doc.queryCommandSupported('copy')) {
+ if (this.isChrome() && text === '') {
+ text = '\u0000';
+ }
+ const textarea = doc.createElement('textarea');
+ textarea.textContent = text == null || text === '' ? ' ' : text;
+ // Prevent scrolling to bottom of page in MS Edge.
+ textarea.style.position = 'fixed';
+ doc.body.appendChild(textarea);
+ textarea.select();
+ try {
+ // Security exception may be thrown by some browsers.
+ if (doc.execCommand('copy') && !clearing && this.clipboardWriteCallback != null) {
+ this.clipboardWriteCallback(text, clearMs);
+ }
+ }
+ catch (e) {
+ // tslint:disable-next-line
+ console.warn('Copy to clipboard failed.', e);
+ }
+ finally {
+ doc.body.removeChild(textarea);
+ }
+ }
+ }
+ readFromClipboard(options) {
+ return __awaiter(this, void 0, void 0, function* () {
+ let win = window;
+ let doc = window.document;
+ if (options && (options.window || options.win)) {
+ win = options.window || options.win;
+ doc = win.document;
+ }
+ else if (options && options.doc) {
+ doc = options.doc;
+ }
+ if (this.isSafari()) {
+ return yield _browser_safariApp__WEBPACK_IMPORTED_MODULE_1__["SafariApp"].sendMessageToApp('readFromClipboard');
+ }
+ else if (this.isFirefox() && win.navigator.clipboard && win.navigator.clipboard.readText) {
+ return yield win.navigator.clipboard.readText();
+ }
+ else if (doc.queryCommandSupported && doc.queryCommandSupported('paste')) {
+ const textarea = doc.createElement('textarea');
+ // Prevent scrolling to bottom of page in MS Edge.
+ textarea.style.position = 'fixed';
+ doc.body.appendChild(textarea);
+ textarea.focus();
+ try {
+ // Security exception may be thrown by some browsers.
+ if (doc.execCommand('paste')) {
+ return textarea.value;
+ }
+ }
+ catch (e) {
+ // tslint:disable-next-line
+ console.warn('Read from clipboard failed.', e);
+ }
+ finally {
+ doc.body.removeChild(textarea);
+ }
+ }
+ return null;
+ });
+ }
+ resolveDialogPromise(dialogId, confirmed) {
+ if (this.showDialogResolves.has(dialogId)) {
+ const resolveObj = this.showDialogResolves.get(dialogId);
+ resolveObj.resolve(confirmed);
+ this.showDialogResolves.delete(dialogId);
+ }
+ // Clean up old promises
+ this.showDialogResolves.forEach((val, key) => {
+ const age = new Date().getTime() - val.date.getTime();
+ if (age > DialogPromiseExpiration) {
+ this.showDialogResolves.delete(key);
+ }
+ });
+ }
+ resolvePasswordDialogPromise(dialogId, canceled, password) {
+ return __awaiter(this, void 0, void 0, function* () {
+ let result = false;
+ if (this.passwordDialogResolves.has(dialogId)) {
+ const resolveObj = this.passwordDialogResolves.get(dialogId);
+ if (yield resolveObj.tryResolve(canceled, password)) {
+ this.passwordDialogResolves.delete(dialogId);
+ result = true;
+ }
+ }
+ // Clean up old promises
+ this.passwordDialogResolves.forEach((val, key) => {
+ const age = new Date().getTime() - val.date.getTime();
+ if (age > DialogPromiseExpiration) {
+ this.passwordDialogResolves.delete(key);
+ }
+ });
+ return result;
+ });
+ }
+ supportsBiometric() {
+ return __awaiter(this, void 0, void 0, function* () {
+ const platformInfo = yield _browser_browserApi__WEBPACK_IMPORTED_MODULE_0__["BrowserApi"].getPlatformInfo();
+ if (platformInfo.os === 'android') {
+ return false;
+ }
+ if (this.isFirefox()) {
+ return parseInt((yield browser.runtime.getBrowserInfo()).version.split('.')[0], 10) >= 87;
+ }
+ return true;
+ });
+ }
+ authenticateBiometric() {
+ return this.biometricCallback();
+ }
+ sidebarViewName() {
+ if (window.chrome.sidebarAction && this.isFirefox()) {
+ return 'sidebar';
+ }
+ else if (this.isOpera() && (typeof opr !== 'undefined') && opr.sidebarAction) {
+ return 'sidebar_panel';
+ }
+ return null;
+ }
+ supportsSecureStorage() {
+ return false;
+ }
+ getDefaultSystemTheme() {
+ return Promise.resolve(this.prefersColorSchemeDark.matches ? jslib_common_enums_themeType__WEBPACK_IMPORTED_MODULE_3__["ThemeType"].Dark : jslib_common_enums_themeType__WEBPACK_IMPORTED_MODULE_3__["ThemeType"].Light);
+ }
+ onDefaultSystemThemeChange(callback) {
+ this.prefersColorSchemeDark.addEventListener('change', ({ matches }) => {
+ callback(matches ? jslib_common_enums_themeType__WEBPACK_IMPORTED_MODULE_3__["ThemeType"].Dark : jslib_common_enums_themeType__WEBPACK_IMPORTED_MODULE_3__["ThemeType"].Light);
+ });
+ }
+ getEffectiveTheme() {
+ return __awaiter(this, void 0, void 0, function* () {
+ const theme = yield this.storageService.get(jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_4__["ConstantsService"].themeKey);
+ if (theme == null || theme === jslib_common_enums_themeType__WEBPACK_IMPORTED_MODULE_3__["ThemeType"].System) {
+ return this.getDefaultSystemTheme();
+ }
+ else {
+ return theme;
+ }
+ });
+ }
+}
+
+
+/***/ }),
+
+/***/ "./src/services/browserStorage.service.ts":
+/*!************************************************!*\
+ !*** ./src/services/browserStorage.service.ts ***!
+ \************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return BrowserStorageService; });
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+class BrowserStorageService {
+ constructor() {
+ this.chromeStorageApi = chrome.storage.local;
+ }
+ get(key) {
+ return __awaiter(this, void 0, void 0, function* () {
+ return new Promise(resolve => {
+ this.chromeStorageApi.get(key, (obj) => {
+ if (obj != null && obj[key] != null) {
+ resolve(obj[key]);
+ return;
+ }
+ resolve(null);
+ });
+ });
+ });
+ }
+ has(key) {
+ return __awaiter(this, void 0, void 0, function* () {
+ return (yield this.get(key)) != null;
+ });
+ }
+ save(key, obj) {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (obj == null) {
+ // Fix safari not liking null in set
+ return new Promise(resolve => {
+ this.chromeStorageApi.remove(key, () => {
+ resolve();
+ });
+ });
+ }
+ if (obj instanceof Set) {
+ obj = Array.from(obj);
+ }
+ const keyedObj = { [key]: obj };
+ return new Promise(resolve => {
+ this.chromeStorageApi.set(keyedObj, () => {
+ resolve();
+ });
+ });
+ });
+ }
+ remove(key) {
+ return __awaiter(this, void 0, void 0, function* () {
+ return new Promise(resolve => {
+ this.chromeStorageApi.remove(key, () => {
+ resolve();
+ });
+ });
+ });
+ }
+}
+
+
+/***/ }),
+
+/***/ "./src/services/i18n.service.ts":
+/*!**************************************!*\
+ !*** ./src/services/i18n.service.ts ***!
+ \**************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return I18nService; });
+/* harmony import */ var jslib_common_services_i18n_service__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jslib-common/services/i18n.service */ "./jslib/common/src/services/i18n.service.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+class I18nService extends jslib_common_services_i18n_service__WEBPACK_IMPORTED_MODULE_0__["I18nService"] {
+ constructor(systemLanguage) {
+ super(systemLanguage, null, (formattedLocale) => __awaiter(this, void 0, void 0, function* () {
+ // Deprecated
+ const file = yield fetch(this.localesDirectory + formattedLocale + '/messages.json');
+ return yield file.json();
+ }));
+ // Please leave 'en' where it is, as it's our fallback language in case no translation can be found
+ this.supportedTranslationLocales = [
+ 'en', 'az', 'be', 'bg', 'bn', 'ca', 'cs', 'da', 'de', 'el', 'en-GB', 'en-IN', 'es', 'et', 'fa', 'fi', 'fr', 'he', 'hr', 'hu',
+ 'id', 'it', 'ja', 'kn', 'ko', 'lv', 'ml', 'nb', 'nl', 'pl', 'pt-BR', 'pt-PT', 'ro', 'ru', 'sk', 'sr', 'sv', 'th', 'tr', 'uk',
+ 'vi', 'zh-CN', 'zh-TW',
+ ];
+ }
+ t(id, p1, p2, p3) {
+ return this.translate(id, p1, p2, p3);
+ }
+ translate(id, p1, p2, p3) {
+ if (this.localesDirectory == null) {
+ const placeholders = [];
+ if (p1 != null) {
+ placeholders.push(p1);
+ }
+ if (p2 != null) {
+ placeholders.push(p2);
+ }
+ if (p3 != null) {
+ placeholders.push(p3);
+ }
+ if (placeholders.length) {
+ return chrome.i18n.getMessage(id, placeholders);
+ }
+ else {
+ return chrome.i18n.getMessage(id);
+ }
+ }
+ return super.translate(id, p1, p2, p3);
+ }
+}
+
+
+/***/ }),
+
+/***/ "./src/services/vaultTimeout.service.ts":
+/*!**********************************************!*\
+ !*** ./src/services/vaultTimeout.service.ts ***!
+ \**********************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return VaultTimeoutService; });
+/* harmony import */ var jslib_common_services_vaultTimeout_service__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jslib-common/services/vaultTimeout.service */ "./jslib/common/src/services/vaultTimeout.service.ts");
+/* harmony import */ var _browser_safariApp__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../browser/safariApp */ "./src/browser/safariApp.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+class VaultTimeoutService extends jslib_common_services_vaultTimeout_service__WEBPACK_IMPORTED_MODULE_0__["VaultTimeoutService"] {
+ startCheck() {
+ this.checkVaultTimeout();
+ if (this.platformUtilsService.isSafari()) {
+ this.checkSafari();
+ }
+ else {
+ setInterval(() => this.checkVaultTimeout(), 10 * 1000); // check every 10 seconds
+ }
+ }
+ // This is a work-around to safari adding an arbitary delay to setTimeout and
+ // setIntervals. It works by calling the native extension which sleeps for 10s,
+ // efficiently replicating setInterval.
+ checkSafari() {
+ return __awaiter(this, void 0, void 0, function* () {
+ while (true) {
+ try {
+ yield _browser_safariApp__WEBPACK_IMPORTED_MODULE_1__["SafariApp"].sendMessageToApp('sleep');
+ this.checkVaultTimeout();
+ }
+ catch (e) {
+ // tslint:disable-next-line
+ console.log('Exception Safari VaultTimeout', e);
+ }
+ }
+ });
+ }
+}
+
+
+/***/ }),
+
+/***/ 0:
+/*!**********************!*\
+ !*** util (ignored) ***!
+ \**********************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+/* (ignored) */
+
+/***/ }),
+
+/***/ 1:
+/*!**********************!*\
+ !*** util (ignored) ***!
+ \**********************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+/* (ignored) */
+
+/***/ }),
+
+/***/ 2:
+/*!************************!*\
+ !*** crypto (ignored) ***!
+ \************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+/* (ignored) */
+
+/***/ })
+
+/******/ });
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4vJF9sYXp5X3JvdXRlX3Jlc291cmNlIGxhenkgbmFtZXNwYWNlIG9iamVjdCIsIndlYnBhY2s6Ly8vLi9qc2xpYi9jb21tb24vc3JjL2Fic3RyYWN0aW9ucy9tZXNzYWdpbmcuc2VydmljZS50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9jb21tb24vc3JjL2Fic3RyYWN0aW9ucy9wbGF0Zm9ybVV0aWxzLnNlcnZpY2UudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9lbnVtcy9jaXBoZXJSZXByb21wdFR5cGUudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9lbnVtcy9jaXBoZXJUeXBlLnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvZW51bXMvZGV2aWNlVHlwZS50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9jb21tb24vc3JjL2VudW1zL2VuY3J5cHRpb25UeXBlLnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvZW51bXMvZXZlbnRUeXBlLnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvZW51bXMvZmllbGRUeXBlLnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvZW51bXMvZmlsZVVwbG9hZFR5cGUudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9lbnVtcy9oYXNoUHVycG9zZS50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9jb21tb24vc3JjL2VudW1zL2tkZlR5cGUudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9lbnVtcy9saW5rZWRJZFR5cGUudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9lbnVtcy9sb2dMZXZlbFR5cGUudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9lbnVtcy9ub3RpZmljYXRpb25UeXBlLnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvZW51bXMvb3JnYW5pemF0aW9uVXNlclN0YXR1c1R5cGUudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9lbnVtcy9vcmdhbml6YXRpb25Vc2VyVHlwZS50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9jb21tb24vc3JjL2VudW1zL3BvbGljeVR5cGUudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9lbnVtcy9wcm92aWRlclVzZXJTdGF0dXNUeXBlLnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvZW51bXMvcHJvdmlkZXJVc2VyVHlwZS50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9jb21tb24vc3JjL2VudW1zL3NlY3VyZU5vdGVUeXBlLnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvZW51bXMvc2VuZFR5cGUudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9lbnVtcy90aGVtZVR5cGUudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9lbnVtcy90d29GYWN0b3JQcm92aWRlclR5cGUudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9lbnVtcy91cmlNYXRjaFR5cGUudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9taXNjL2xpbmtlZEZpZWxkT3B0aW9uLmRlY29yYXRvci50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9jb21tb24vc3JjL21pc2Mvc2VxdWVudGlhbGl6ZS50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9jb21tb24vc3JjL21pc2Mvc2VydmljZVV0aWxzLnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvbWlzYy90aHJvdHRsZS50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9jb21tb24vc3JjL21pc2MvdXRpbHMudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9taXNjL3dvcmRsaXN0LnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvbW9kZWxzL2FwaS9jYXJkQXBpLnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvbW9kZWxzL2FwaS9maWVsZEFwaS50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9jb21tb24vc3JjL21vZGVscy9hcGkvaWRlbnRpdHlBcGkudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9tb2RlbHMvYXBpL2xvZ2luQXBpLnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvbW9kZWxzL2FwaS9sb2dpblVyaUFwaS50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9jb21tb24vc3JjL21vZGVscy9hcGkvcGVybWlzc2lvbnNBcGkudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9tb2RlbHMvYXBpL3NlY3VyZU5vdGVBcGkudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9tb2RlbHMvYXBpL3NlbmRGaWxlQXBpLnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvbW9kZWxzL2FwaS9zZW5kVGV4dEFwaS50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9jb21tb24vc3JjL21vZGVscy9hcGkvc3NvQ29uZmlnQXBpLnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvbW9kZWxzL2RhdGEvYXR0YWNobWVudERhdGEudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9tb2RlbHMvZGF0YS9jYXJkRGF0YS50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9jb21tb24vc3JjL21vZGVscy9kYXRhL2NpcGhlckRhdGEudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9tb2RlbHMvZGF0YS9jb2xsZWN0aW9uRGF0YS50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9jb21tb24vc3JjL21vZGVscy9kYXRhL2V2ZW50RGF0YS50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9jb21tb24vc3JjL21vZGVscy9kYXRhL2ZpZWxkRGF0YS50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9jb21tb24vc3JjL21vZGVscy9kYXRhL2ZvbGRlckRhdGEudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9tb2RlbHMvZGF0YS9pZGVudGl0eURhdGEudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9tb2RlbHMvZGF0YS9sb2dpbkRhdGEudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9tb2RlbHMvZGF0YS9sb2dpblVyaURhdGEudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9tb2RlbHMvZGF0YS9vcmdhbml6YXRpb25EYXRhLnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvbW9kZWxzL2RhdGEvcGFzc3dvcmRIaXN0b3J5RGF0YS50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9jb21tb24vc3JjL21vZGVscy9kYXRhL3BvbGljeURhdGEudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9tb2RlbHMvZGF0YS9wcm92aWRlckRhdGEudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9tb2RlbHMvZGF0YS9zZWN1cmVOb3RlRGF0YS50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9jb21tb24vc3JjL21vZGVscy9kYXRhL3NlbmREYXRhLnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvbW9kZWxzL2RhdGEvc2VuZEZpbGVEYXRhLnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvbW9kZWxzL2RhdGEvc2VuZFRleHREYXRhLnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvbW9kZWxzL2RvbWFpbi9hdHRhY2htZW50LnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvbW9kZWxzL2RvbWFpbi9hdXRoUmVzdWx0LnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvbW9kZWxzL2RvbWFpbi9jYXJkLnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvbW9kZWxzL2RvbWFpbi9jaXBoZXIudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9tb2RlbHMvZG9tYWluL2NvbGxlY3Rpb24udHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9tb2RlbHMvZG9tYWluL2RlY3J5cHRQYXJhbWV0ZXJzLnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvbW9kZWxzL2RvbWFpbi9kb21haW5CYXNlLnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvbW9kZWxzL2RvbWFpbi9lbmNBcnJheUJ1ZmZlci50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9jb21tb24vc3JjL21vZGVscy9kb21haW4vZW5jU3RyaW5nLnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvbW9kZWxzL2RvbWFpbi9lbmNyeXB0ZWRPYmplY3QudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9tb2RlbHMvZG9tYWluL2Vudmlyb25tZW50VXJscy50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9jb21tb24vc3JjL21vZGVscy9kb21haW4vZmllbGQudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9tb2RlbHMvZG9tYWluL2ZvbGRlci50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9jb21tb24vc3JjL21vZGVscy9kb21haW4vZ2VuZXJhdGVkUGFzc3dvcmRIaXN0b3J5LnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvbW9kZWxzL2RvbWFpbi9pZGVudGl0eS50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9jb21tb24vc3JjL21vZGVscy9kb21haW4vbG9naW4udHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9tb2RlbHMvZG9tYWluL2xvZ2luVXJpLnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvbW9kZWxzL2RvbWFpbi9tYXN0ZXJQYXNzd29yZFBvbGljeU9wdGlvbnMudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9tb2RlbHMvZG9tYWluL29yZ2FuaXphdGlvbi50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9jb21tb24vc3JjL21vZGVscy9kb21haW4vcGFzc3dvcmQudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9tb2RlbHMvZG9tYWluL3Bhc3N3b3JkR2VuZXJhdG9yUG9saWN5T3B0aW9ucy50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9jb21tb24vc3JjL21vZGVscy9kb21haW4vcG9saWN5LnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvbW9kZWxzL2RvbWFpbi9wcm92aWRlci50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9jb21tb24vc3JjL21vZGVscy9kb21haW4vcmVzZXRQYXNzd29yZFBvbGljeU9wdGlvbnMudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9tb2RlbHMvZG9tYWluL3NlY3VyZU5vdGUudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9tb2RlbHMvZG9tYWluL3NlbmQudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9tb2RlbHMvZG9tYWluL3NlbmRGaWxlLnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvbW9kZWxzL2RvbWFpbi9zZW5kVGV4dC50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9jb21tb24vc3JjL21vZGVscy9kb21haW4vc29ydGVkQ2lwaGVyc0NhY2hlLnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvbW9kZWxzL2RvbWFpbi9zeW1tZXRyaWNDcnlwdG9LZXkudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9tb2RlbHMvZG9tYWluL3RyZWVOb2RlLnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvbW9kZWxzL2V4cG9ydC9jYXJkLnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvbW9kZWxzL2V4cG9ydC9jaXBoZXIudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9tb2RlbHMvZXhwb3J0L2NpcGhlcldpdGhJZHMudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9tb2RlbHMvZXhwb3J0L2NvbGxlY3Rpb24udHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9tb2RlbHMvZXhwb3J0L2NvbGxlY3Rpb25XaXRoSWQudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9tb2RlbHMvZXhwb3J0L2V2ZW50LnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvbW9kZWxzL2V4cG9ydC9maWVsZC50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9jb21tb24vc3JjL21vZGVscy9leHBvcnQvZm9sZGVyLnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvbW9kZWxzL2V4cG9ydC9mb2xkZXJXaXRoSWQudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9tb2RlbHMvZXhwb3J0L2lkZW50aXR5LnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvbW9kZWxzL2V4cG9ydC9sb2dpbi50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9jb21tb24vc3JjL21vZGVscy9leHBvcnQvbG9naW5VcmkudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9tb2RlbHMvZXhwb3J0L3NlY3VyZU5vdGUudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9tb2RlbHMvcmVxdWVzdC9hY2NvdW50L3NldENyeXB0b0FnZW50S2V5UmVxdWVzdC50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9jb21tb24vc3JjL21vZGVscy9yZXF1ZXN0L2F0dGFjaG1lbnRSZXF1ZXN0LnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvbW9kZWxzL3JlcXVlc3QvY2lwaGVyQnVsa0RlbGV0ZVJlcXVlc3QudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9tb2RlbHMvcmVxdWVzdC9jaXBoZXJCdWxrTW92ZVJlcXVlc3QudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9tb2RlbHMvcmVxdWVzdC9jaXBoZXJCdWxrUmVzdG9yZVJlcXVlc3QudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9tb2RlbHMvcmVxdWVzdC9jaXBoZXJCdWxrU2hhcmVSZXF1ZXN0LnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvbW9kZWxzL3JlcXVlc3QvY2lwaGVyQ29sbGVjdGlvbnNSZXF1ZXN0LnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvbW9kZWxzL3JlcXVlc3QvY2lwaGVyQ3JlYXRlUmVxdWVzdC50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9jb21tb24vc3JjL21vZGVscy9yZXF1ZXN0L2NpcGhlclJlcXVlc3QudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9tb2RlbHMvcmVxdWVzdC9jaXBoZXJTaGFyZVJlcXVlc3QudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9tb2RlbHMvcmVxdWVzdC9jaXBoZXJXaXRoSWRSZXF1ZXN0LnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvbW9kZWxzL3JlcXVlc3QvY3J5cHRvQWdlbnRVc2VyS2V5UmVxdWVzdC50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9jb21tb24vc3JjL21vZGVscy9yZXF1ZXN0L2RldmljZVJlcXVlc3QudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9tb2RlbHMvcmVxdWVzdC9ldmVudFJlcXVlc3QudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9tb2RlbHMvcmVxdWVzdC9mb2xkZXJSZXF1ZXN0LnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvbW9kZWxzL3JlcXVlc3Qva2V5c1JlcXVlc3QudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9tb2RlbHMvcmVxdWVzdC9wcmVsb2dpblJlcXVlc3QudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9tb2RlbHMvcmVxdWVzdC9zZW5kUmVxdWVzdC50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9jb21tb24vc3JjL21vZGVscy9yZXF1ZXN0L3Rva2VuUmVxdWVzdC50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9jb21tb24vc3JjL21vZGVscy9yZXNwb25zZS9hcGlLZXlSZXNwb25zZS50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9jb21tb24vc3JjL21vZGVscy9yZXNwb25zZS9hdHRhY2htZW50UmVzcG9uc2UudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9tb2RlbHMvcmVzcG9uc2UvYXR0YWNobWVudFVwbG9hZERhdGFSZXNwb25zZS50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9jb21tb24vc3JjL21vZGVscy9yZXNwb25zZS9iYXNlUmVzcG9uc2UudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9tb2RlbHMvcmVzcG9uc2UvYmlsbGluZ1Jlc3BvbnNlLnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvbW9kZWxzL3Jlc3BvbnNlL2JyZWFjaEFjY291bnRSZXNwb25zZS50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9jb21tb24vc3JjL21vZGVscy9yZXNwb25zZS9jaXBoZXJSZXNwb25zZS50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9jb21tb24vc3JjL21vZGVscy9yZXNwb25zZS9jb2xsZWN0aW9uUmVzcG9uc2UudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9tb2RlbHMvcmVzcG9uc2UvY3J5cHRvQWdlbnRVc2VyS2V5UmVzcG9uc2UudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9tb2RlbHMvcmVzcG9uc2UvZG9tYWluc1Jlc3BvbnNlLnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvbW9kZWxzL3Jlc3BvbnNlL2VtZXJnZW5jeUFjY2Vzc1Jlc3BvbnNlLnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvbW9kZWxzL3Jlc3BvbnNlL2Vycm9yUmVzcG9uc2UudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9tb2RlbHMvcmVzcG9uc2UvZXZlbnRSZXNwb25zZS50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9jb21tb24vc3JjL21vZGVscy9yZXNwb25zZS9mb2xkZXJSZXNwb25zZS50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9jb21tb24vc3JjL21vZGVscy9yZXNwb25zZS9nbG9iYWxEb21haW5SZXNwb25zZS50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9jb21tb24vc3JjL21vZGVscy9yZXNwb25zZS9ncm91cFJlc3BvbnNlLnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvbW9kZWxzL3Jlc3BvbnNlL2lkZW50aXR5Q2FwdGNoYVJlc3BvbnNlLnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvbW9kZWxzL3Jlc3BvbnNlL2lkZW50aXR5VG9rZW5SZXNwb25zZS50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9jb21tb24vc3JjL21vZGVscy9yZXNwb25zZS9pZGVudGl0eVR3b0ZhY3RvclJlc3BvbnNlLnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvbW9kZWxzL3Jlc3BvbnNlL2tleXNSZXNwb25zZS50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9jb21tb24vc3JjL21vZGVscy9yZXNwb25zZS9saXN0UmVzcG9uc2UudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9tb2RlbHMvcmVzcG9uc2Uvbm90aWZpY2F0aW9uUmVzcG9uc2UudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9tb2RlbHMvcmVzcG9uc2Uvb3JnYW5pemF0aW9uL29yZ2FuaXphdGlvblNzb1Jlc3BvbnNlLnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvbW9kZWxzL3Jlc3BvbnNlL29yZ2FuaXphdGlvbkF1dG9FbnJvbGxTdGF0dXNSZXNwb25zZS50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9jb21tb24vc3JjL21vZGVscy9yZXNwb25zZS9vcmdhbml6YXRpb25LZXlzUmVzcG9uc2UudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9tb2RlbHMvcmVzcG9uc2Uvb3JnYW5pemF0aW9uUmVzcG9uc2UudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9tb2RlbHMvcmVzcG9uc2Uvb3JnYW5pemF0aW9uU3Vic2NyaXB0aW9uUmVzcG9uc2UudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9tb2RlbHMvcmVzcG9uc2Uvb3JnYW5pemF0aW9uVXNlckJ1bGtQdWJsaWNLZXlSZXNwb25zZS50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9jb21tb24vc3JjL21vZGVscy9yZXNwb25zZS9vcmdhbml6YXRpb25Vc2VyQnVsa1Jlc3BvbnNlLnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvbW9kZWxzL3Jlc3BvbnNlL29yZ2FuaXphdGlvblVzZXJSZXNwb25zZS50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9jb21tb24vc3JjL21vZGVscy9yZXNwb25zZS9wYXNzd29yZEhpc3RvcnlSZXNwb25zZS50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9jb21tb24vc3JjL21vZGVscy9yZXNwb25zZS9wYXltZW50UmVzcG9uc2UudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9tb2RlbHMvcmVzcG9uc2UvcGxhblJlc3BvbnNlLnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvbW9kZWxzL3Jlc3BvbnNlL3BvbGljeVJlc3BvbnNlLnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvbW9kZWxzL3Jlc3BvbnNlL3ByZWxvZ2luUmVzcG9uc2UudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9tb2RlbHMvcmVzcG9uc2UvcHJvZmlsZU9yZ2FuaXphdGlvblJlc3BvbnNlLnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvbW9kZWxzL3Jlc3BvbnNlL3Byb2ZpbGVQcm92aWRlck9yZ2FuaXphdGlvblJlc3BvbnNlLnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvbW9kZWxzL3Jlc3BvbnNlL3Byb2ZpbGVQcm92aWRlclJlc3BvbnNlLnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvbW9kZWxzL3Jlc3BvbnNlL3Byb2ZpbGVSZXNwb25zZS50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9jb21tb24vc3JjL21vZGVscy9yZXNwb25zZS9wcm92aWRlci9wcm92aWRlck9yZ2FuaXphdGlvblJlc3BvbnNlLnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvbW9kZWxzL3Jlc3BvbnNlL3Byb3ZpZGVyL3Byb3ZpZGVyUmVzcG9uc2UudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9tb2RlbHMvcmVzcG9uc2UvcHJvdmlkZXIvcHJvdmlkZXJVc2VyQnVsa1B1YmxpY0tleVJlc3BvbnNlLnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvbW9kZWxzL3Jlc3BvbnNlL3Byb3ZpZGVyL3Byb3ZpZGVyVXNlckJ1bGtSZXNwb25zZS50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9jb21tb24vc3JjL21vZGVscy9yZXNwb25zZS9wcm92aWRlci9wcm92aWRlclVzZXJSZXNwb25zZS50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9jb21tb24vc3JjL21vZGVscy9yZXNwb25zZS9zZWxlY3Rpb25SZWFkT25seVJlc3BvbnNlLnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvbW9kZWxzL3Jlc3BvbnNlL3NlbmRBY2Nlc3NSZXNwb25zZS50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9jb21tb24vc3JjL21vZGVscy9yZXNwb25zZS9zZW5kRmlsZURvd25sb2FkRGF0YVJlc3BvbnNlLnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvbW9kZWxzL3Jlc3BvbnNlL3NlbmRGaWxlVXBsb2FkRGF0YVJlc3BvbnNlLnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvbW9kZWxzL3Jlc3BvbnNlL3NlbmRSZXNwb25zZS50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9jb21tb24vc3JjL21vZGVscy9yZXNwb25zZS9zdWJzY3JpcHRpb25SZXNwb25zZS50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9jb21tb24vc3JjL21vZGVscy9yZXNwb25zZS9zeW5jUmVzcG9uc2UudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9tb2RlbHMvcmVzcG9uc2UvdGF4SW5mb1Jlc3BvbnNlLnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvbW9kZWxzL3Jlc3BvbnNlL3RheFJhdGVSZXNwb25zZS50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9jb21tb24vc3JjL21vZGVscy9yZXNwb25zZS90d29GYWN0b3JBdXRoZW50aWNhdG9yUmVzcG9uc2UudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9tb2RlbHMvcmVzcG9uc2UvdHdvRmFjdG9yRHVvUmVzcG9uc2UudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9tb2RlbHMvcmVzcG9uc2UvdHdvRmFjdG9yRW1haWxSZXNwb25zZS50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9jb21tb24vc3JjL21vZGVscy9yZXNwb25zZS90d29GYWN0b3JQcm92aWRlclJlc3BvbnNlLnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvbW9kZWxzL3Jlc3BvbnNlL3R3b0ZhY3RvclJlc2NvdmVyUmVzcG9uc2UudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9tb2RlbHMvcmVzcG9uc2UvdHdvRmFjdG9yV2ViQXV0aG5SZXNwb25zZS50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9jb21tb24vc3JjL21vZGVscy9yZXNwb25zZS90d29GYWN0b3JZdWJpS2V5UmVzcG9uc2UudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9tb2RlbHMvcmVzcG9uc2UvdXNlcktleVJlc3BvbnNlLnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvbW9kZWxzL3ZpZXcvYXR0YWNobWVudFZpZXcudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9tb2RlbHMvdmlldy9jYXJkVmlldy50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9jb21tb24vc3JjL21vZGVscy92aWV3L2NpcGhlclZpZXcudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9tb2RlbHMvdmlldy9jb2xsZWN0aW9uVmlldy50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9jb21tb24vc3JjL21vZGVscy92aWV3L2ZpZWxkVmlldy50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9jb21tb24vc3JjL21vZGVscy92aWV3L2ZvbGRlclZpZXcudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9tb2RlbHMvdmlldy9pZGVudGl0eVZpZXcudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9tb2RlbHMvdmlldy9pdGVtVmlldy50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9jb21tb24vc3JjL21vZGVscy92aWV3L2xvZ2luVXJpVmlldy50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9jb21tb24vc3JjL21vZGVscy92aWV3L2xvZ2luVmlldy50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9jb21tb24vc3JjL21vZGVscy92aWV3L3Bhc3N3b3JkSGlzdG9yeVZpZXcudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9tb2RlbHMvdmlldy9zZWN1cmVOb3RlVmlldy50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9jb21tb24vc3JjL21vZGVscy92aWV3L3NlbmRGaWxlVmlldy50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9jb21tb24vc3JjL21vZGVscy92aWV3L3NlbmRUZXh0Vmlldy50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9jb21tb24vc3JjL21vZGVscy92aWV3L3NlbmRWaWV3LnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvc2VydmljZXMvYXBpLnNlcnZpY2UudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9zZXJ2aWNlcy9hcHBJZC5zZXJ2aWNlLnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvc2VydmljZXMvYXVkaXQuc2VydmljZS50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9jb21tb24vc3JjL3NlcnZpY2VzL2F1dGguc2VydmljZS50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9jb21tb24vc3JjL3NlcnZpY2VzL2F6dXJlRmlsZVVwbG9hZC5zZXJ2aWNlLnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvc2VydmljZXMvYml0d2FyZGVuRmlsZVVwbG9hZC5zZXJ2aWNlLnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvc2VydmljZXMvY2lwaGVyLnNlcnZpY2UudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9zZXJ2aWNlcy9jb2xsZWN0aW9uLnNlcnZpY2UudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9zZXJ2aWNlcy9jb25zb2xlTG9nLnNlcnZpY2UudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9zZXJ2aWNlcy9jb25zdGFudHMuc2VydmljZS50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9jb21tb24vc3JjL3NlcnZpY2VzL2NvbnRhaW5lci5zZXJ2aWNlLnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvc2VydmljZXMvY3J5cHRvLnNlcnZpY2UudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9zZXJ2aWNlcy9lbnZpcm9ubWVudC5zZXJ2aWNlLnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvc2VydmljZXMvZXZlbnQuc2VydmljZS50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9jb21tb24vc3JjL3NlcnZpY2VzL2V4cG9ydC5zZXJ2aWNlLnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvc2VydmljZXMvZmlsZVVwbG9hZC5zZXJ2aWNlLnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvc2VydmljZXMvZm9sZGVyLnNlcnZpY2UudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9zZXJ2aWNlcy9pMThuLnNlcnZpY2UudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9zZXJ2aWNlcy9ub3RpZmljYXRpb25zLnNlcnZpY2UudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9zZXJ2aWNlcy9wYXNzd29yZEdlbmVyYXRpb24uc2VydmljZS50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9jb21tb24vc3JjL3NlcnZpY2VzL3BvbGljeS5zZXJ2aWNlLnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvc2VydmljZXMvc2VhcmNoLnNlcnZpY2UudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9zZXJ2aWNlcy9zZW5kLnNlcnZpY2UudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9zZXJ2aWNlcy9zZXR0aW5ncy5zZXJ2aWNlLnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvc2VydmljZXMvc3RhdGUuc2VydmljZS50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9jb21tb24vc3JjL3NlcnZpY2VzL3N5bmMuc2VydmljZS50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9jb21tb24vc3JjL3NlcnZpY2VzL3N5c3RlbS5zZXJ2aWNlLnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvc2VydmljZXMvdG9rZW4uc2VydmljZS50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9jb21tb24vc3JjL3NlcnZpY2VzL3RvdHAuc2VydmljZS50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9jb21tb24vc3JjL3NlcnZpY2VzL3VzZXIuc2VydmljZS50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9jb21tb24vc3JjL3NlcnZpY2VzL3ZhdWx0VGltZW91dC5zZXJ2aWNlLnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvc2VydmljZXMvd2ViQ3J5cHRvRnVuY3Rpb24uc2VydmljZS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvYmFja2dyb3VuZC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvYmFja2dyb3VuZC9jb21tYW5kcy5iYWNrZ3JvdW5kLnRzIiwid2VicGFjazovLy8uL3NyYy9iYWNrZ3JvdW5kL2NvbnRleHRNZW51cy5iYWNrZ3JvdW5kLnRzIiwid2VicGFjazovLy8uL3NyYy9iYWNrZ3JvdW5kL2lkbGUuYmFja2dyb3VuZC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvYmFja2dyb3VuZC9tYWluLmJhY2tncm91bmQudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2JhY2tncm91bmQvbW9kZWxzL25vdGlmaWNhdGlvblF1ZXVlTWVzc2FnZVR5cGUudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2JhY2tncm91bmQvbmF0aXZlTWVzc2FnaW5nLmJhY2tncm91bmQudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2JhY2tncm91bmQvbm90aWZpY2F0aW9uLmJhY2tncm91bmQudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2JhY2tncm91bmQvcnVudGltZS5iYWNrZ3JvdW5kLnRzIiwid2VicGFjazovLy8uL3NyYy9iYWNrZ3JvdW5kL3RhYnMuYmFja2dyb3VuZC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvYmFja2dyb3VuZC93ZWJSZXF1ZXN0LmJhY2tncm91bmQudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2JhY2tncm91bmQvd2luZG93cy5iYWNrZ3JvdW5kLnRzIiwid2VicGFjazovLy8uL3NyYy9icm93c2VyL2Jyb3dzZXJBcGkudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2Jyb3dzZXIvc2FmYXJpQXBwLnRzIiwid2VicGFjazovLy8uL3NyYy9tb2RlbHMvYXV0b2ZpbGxTY3JpcHQudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BvcHVwL3NlcnZpY2VzL3BvcHVwLXV0aWxzLnNlcnZpY2UudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3NlcnZpY2VzL2F1dG9maWxsLnNlcnZpY2UudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3NlcnZpY2VzL2Jyb3dzZXJDcnlwdG8uc2VydmljZS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvc2VydmljZXMvYnJvd3Nlck1lc3NhZ2luZy5zZXJ2aWNlLnRzIiwid2VicGFjazovLy8uL3NyYy9zZXJ2aWNlcy9icm93c2VyUGxhdGZvcm1VdGlscy5zZXJ2aWNlLnRzIiwid2VicGFjazovLy8uL3NyYy9zZXJ2aWNlcy9icm93c2VyU3RvcmFnZS5zZXJ2aWNlLnRzIiwid2VicGFjazovLy8uL3NyYy9zZXJ2aWNlcy9pMThuLnNlcnZpY2UudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3NlcnZpY2VzL3ZhdWx0VGltZW91dC5zZXJ2aWNlLnRzIiwid2VicGFjazovLy91dGlsIChpZ25vcmVkKSIsIndlYnBhY2s6Ly8vdXRpbCAoaWdub3JlZCk/YmRlYyIsIndlYnBhY2s6Ly8vY3J5cHRvIChpZ25vcmVkKSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO1FBQUE7UUFDQTtRQUNBO1FBQ0E7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQSxRQUFRLG9CQUFvQjtRQUM1QjtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBLGlCQUFpQiw0QkFBNEI7UUFDN0M7UUFDQTtRQUNBLGtCQUFrQiwyQkFBMkI7UUFDN0M7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBOztRQUVBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTs7O1FBR0E7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBLDBDQUEwQyxnQ0FBZ0M7UUFDMUU7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQSx3REFBd0Qsa0JBQWtCO1FBQzFFO1FBQ0EsaURBQWlELGNBQWM7UUFDL0Q7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBLHlDQUF5QyxpQ0FBaUM7UUFDMUUsZ0hBQWdILG1CQUFtQixFQUFFO1FBQ3JJO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0EsMkJBQTJCLDBCQUEwQixFQUFFO1FBQ3ZELGlDQUFpQyxlQUFlO1FBQ2hEO1FBQ0E7UUFDQTs7UUFFQTtRQUNBLHNEQUFzRCwrREFBK0Q7O1FBRXJIO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7UUFDQSxnQkFBZ0IsdUJBQXVCO1FBQ3ZDOzs7UUFHQTtRQUNBO1FBQ0E7UUFDQTs7Ozs7Ozs7Ozs7O0FDdkpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0EsNENBQTRDLFdBQVc7QUFDdkQ7QUFDQTtBQUNBLHdFOzs7Ozs7Ozs7Ozs7QUNaQTtBQUFBO0FBQU8sTUFBZSxnQkFBZ0I7Q0FFckM7Ozs7Ozs7Ozs7Ozs7QUNDRDtBQUFBO0FBQU8sTUFBZSxvQkFBb0I7Q0FnQ3pDOzs7Ozs7Ozs7Ozs7O0FDbkNEO0FBQUE7QUFBQSxJQUFZLGtCQUdYO0FBSEQsV0FBWSxrQkFBa0I7SUFDMUIsMkRBQVE7SUFDUixtRUFBWTtBQUNoQixDQUFDLEVBSFcsa0JBQWtCLEtBQWxCLGtCQUFrQixRQUc3Qjs7Ozs7Ozs7Ozs7OztBQ0hEO0FBQUE7QUFBQSxJQUFZLFVBS1g7QUFMRCxXQUFZLFVBQVU7SUFDbEIsNkNBQVM7SUFDVCx1REFBYztJQUNkLDJDQUFRO0lBQ1IsbURBQVk7QUFDaEIsQ0FBQyxFQUxXLFVBQVUsS0FBVixVQUFVLFFBS3JCOzs7Ozs7Ozs7Ozs7O0FDTEQ7QUFBQTtBQUFBLElBQVksVUFzQlg7QUF0QkQsV0FBWSxVQUFVO0lBQ2xCLGlEQUFXO0lBQ1gseUNBQU87SUFDUCxpRUFBbUI7SUFDbkIsbUVBQW9CO0lBQ3BCLCtEQUFrQjtJQUNsQiw2REFBaUI7SUFDakIsK0RBQWtCO0lBQ2xCLDJEQUFnQjtJQUNoQiwyREFBZ0I7SUFDaEIsNkRBQWlCO0lBQ2pCLGdFQUFtQjtJQUNuQiw0REFBaUI7SUFDakIsMERBQWdCO0lBQ2hCLHNEQUFjO0lBQ2QsZ0VBQW1CO0lBQ25CLDhEQUFrQjtJQUNsQiwwQ0FBUTtJQUNSLDhEQUFrQjtJQUNsQixnRUFBbUI7SUFDbkIsb0VBQXFCO0lBQ3JCLGtFQUFvQjtBQUN4QixDQUFDLEVBdEJXLFVBQVUsS0FBVixVQUFVLFFBc0JyQjs7Ozs7Ozs7Ozs7OztBQ3RCRDtBQUFBO0FBQUEsSUFBWSxjQVFYO0FBUkQsV0FBWSxjQUFjO0lBQ3RCLHFFQUFpQjtJQUNqQiwyRkFBNEI7SUFDNUIsMkZBQTRCO0lBQzVCLHVGQUEwQjtJQUMxQixtRkFBd0I7SUFDeEIsNkdBQXFDO0lBQ3JDLHlHQUFtQztBQUN2QyxDQUFDLEVBUlcsY0FBYyxLQUFkLGNBQWMsUUFRekI7Ozs7Ozs7Ozs7Ozs7QUNSRDtBQUFBO0FBQUEsSUFBWSxTQWlFWDtBQWpFRCxXQUFZLFNBQVM7SUFDakIsOERBQW9CO0lBQ3BCLDRFQUEyQjtJQUMzQixrRUFBc0I7SUFDdEIsb0VBQXVCO0lBQ3ZCLHNFQUF3QjtJQUN4QixvRUFBdUI7SUFDdkIsMEVBQTBCO0lBQzFCLG9GQUErQjtJQUMvQixvRkFBK0I7SUFFL0IsZ0VBQXFCO0lBQ3JCLGdFQUFxQjtJQUNyQixnRUFBcUI7SUFDckIsb0ZBQStCO0lBQy9CLG9GQUErQjtJQUMvQiw4REFBb0I7SUFDcEIsc0ZBQWdDO0lBQ2hDLDBFQUEwQjtJQUMxQiwwR0FBMEM7SUFDMUMsZ0hBQTZDO0lBQzdDLDBHQUEwQztJQUMxQywwRkFBa0M7SUFDbEMsZ0dBQXFDO0lBQ3JDLDBGQUFrQztJQUNsQyxrRkFBOEI7SUFDOUIsd0VBQXlCO0lBQ3pCLGtFQUFzQjtJQUN0Qiw4R0FBNEM7SUFFNUMsd0VBQXlCO0lBQ3pCLHdFQUF5QjtJQUN6Qix3RUFBeUI7SUFFekIsOERBQW9CO0lBQ3BCLDhEQUFvQjtJQUNwQiw4REFBb0I7SUFFcEIsb0ZBQStCO0lBQy9CLHdGQUFpQztJQUNqQyxvRkFBK0I7SUFDL0Isb0ZBQStCO0lBQy9CLGdHQUFxQztJQUNyQyw0RkFBbUM7SUFDbkMsOEdBQTRDO0lBQzVDLGtIQUE4QztJQUM5QywwR0FBMEM7SUFDMUMsOEZBQW9DO0lBRXBDLDRFQUEyQjtJQUMzQixvRkFBK0I7SUFDL0IsMkNBQTJDO0lBQzNDLHdGQUFpQztJQUVqQyxnRUFBcUI7SUFFckIsNEVBQTJCO0lBQzNCLGdGQUE2QjtJQUM3Qiw0RUFBMkI7SUFDM0IsNEVBQTJCO0lBRTNCLDRGQUFtQztJQUNuQyx3RkFBaUM7SUFDakMsNEZBQW1DO0lBQ25DLHdHQUF5QztBQUM3QyxDQUFDLEVBakVXLFNBQVMsS0FBVCxTQUFTLFFBaUVwQjs7Ozs7Ozs7Ozs7OztBQ2pFRDtBQUFBO0FBQUEsSUFBWSxTQUtYO0FBTEQsV0FBWSxTQUFTO0lBQ2pCLHlDQUFRO0lBQ1IsNkNBQVU7SUFDViwrQ0FBVztJQUNYLDZDQUFVO0FBQ2QsQ0FBQyxFQUxXLFNBQVMsS0FBVCxTQUFTLFFBS3BCOzs7Ozs7Ozs7Ozs7O0FDTEQ7QUFBQTtBQUFBLElBQVksY0FHWDtBQUhELFdBQVksY0FBYztJQUN0Qix1REFBVTtJQUNWLHFEQUFTO0FBQ2IsQ0FBQyxFQUhXLGNBQWMsS0FBZCxjQUFjLFFBR3pCOzs7Ozs7Ozs7Ozs7O0FDSEQ7QUFBQTtBQUFBLElBQVksV0FHWDtBQUhELFdBQVksV0FBVztJQUNuQiwyRUFBdUI7SUFDdkIseUVBQXNCO0FBQzFCLENBQUMsRUFIVyxXQUFXLEtBQVgsV0FBVyxRQUd0Qjs7Ozs7Ozs7Ozs7OztBQ0hEO0FBQUE7QUFBQSxJQUFZLE9BRVg7QUFGRCxXQUFZLE9BQU87SUFDZix1REFBaUI7QUFDckIsQ0FBQyxFQUZXLE9BQU8sS0FBUCxPQUFPLFFBRWxCOzs7Ozs7Ozs7Ozs7O0FDQUQ7QUFBQTtBQUFBO0FBQUE7QUFBQSxZQUFZO0FBQ1osSUFBWSxhQUdYO0FBSEQsV0FBWSxhQUFhO0lBQ3JCLDJEQUFjO0lBQ2QsMkRBQWM7QUFDbEIsQ0FBQyxFQUhXLGFBQWEsS0FBYixhQUFhLFFBR3hCO0FBRUQsV0FBVztBQUNYLElBQVksWUFPWDtBQVBELFdBQVksWUFBWTtJQUNwQixxRUFBb0I7SUFDcEIseURBQWM7SUFDZCx1REFBYTtJQUNiLGlEQUFVO0lBQ1YsbURBQVc7SUFDWCxxREFBWTtBQUNoQixDQUFDLEVBUFcsWUFBWSxLQUFaLFlBQVksUUFPdkI7QUFFRCxlQUFlO0FBQ2YsSUFBWSxnQkFvQlg7QUFwQkQsV0FBWSxnQkFBZ0I7SUFDeEIsMkRBQVc7SUFDWCxxRUFBZ0I7SUFDaEIsaUVBQWM7SUFDZCxpRUFBYztJQUNkLGlFQUFjO0lBQ2QseURBQVU7SUFDViwyREFBVztJQUNYLHFFQUFnQjtJQUNoQiwrREFBYTtJQUNiLCtEQUFhO0lBQ2IsMkRBQVc7SUFDWCwyREFBVztJQUNYLHVEQUFTO0lBQ1QsaUVBQWM7SUFDZCw2RUFBb0I7SUFDcEIsMkVBQW1CO0lBQ25CLG1FQUFlO0lBQ2YsaUVBQWM7SUFDZCxpRUFBYztBQUNsQixDQUFDLEVBcEJXLGdCQUFnQixLQUFoQixnQkFBZ0IsUUFvQjNCOzs7Ozs7Ozs7Ozs7O0FDdkNEO0FBQUE7QUFBQSxJQUFZLFlBS1g7QUFMRCxXQUFZLFlBQVk7SUFDcEIsaURBQUs7SUFDTCwrQ0FBSTtJQUNKLHFEQUFPO0lBQ1AsaURBQUs7QUFDVCxDQUFDLEVBTFcsWUFBWSxLQUFaLFlBQVksUUFLdkI7Ozs7Ozs7Ozs7Ozs7QUNMRDtBQUFBO0FBQUEsSUFBWSxnQkFtQlg7QUFuQkQsV0FBWSxnQkFBZ0I7SUFDeEIsK0VBQW9CO0lBQ3BCLCtFQUFvQjtJQUNwQiw2RUFBbUI7SUFDbkIsK0VBQW9CO0lBQ3BCLHFFQUFlO0lBRWYsaUVBQWE7SUFDYixxRUFBZTtJQUNmLCtFQUFvQjtJQUNwQiwrRUFBb0I7SUFDcEIsK0VBQW9CO0lBQ3BCLHdFQUFpQjtJQUVqQiw0REFBVztJQUVYLDRFQUFtQjtJQUNuQiw0RUFBbUI7SUFDbkIsNEVBQW1CO0FBQ3ZCLENBQUMsRUFuQlcsZ0JBQWdCLEtBQWhCLGdCQUFnQixRQW1CM0I7Ozs7Ozs7Ozs7Ozs7QUNuQkQ7QUFBQTtBQUFBLElBQVksMEJBSVg7QUFKRCxXQUFZLDBCQUEwQjtJQUNsQyxpRkFBVztJQUNYLG1GQUFZO0lBQ1oscUZBQWE7QUFDakIsQ0FBQyxFQUpXLDBCQUEwQixLQUExQiwwQkFBMEIsUUFJckM7Ozs7Ozs7Ozs7Ozs7QUNKRDtBQUFBO0FBQUEsSUFBWSxvQkFNWDtBQU5ELFdBQVksb0JBQW9CO0lBQzVCLGlFQUFTO0lBQ1QsaUVBQVM7SUFDVCwrREFBUTtJQUNSLHFFQUFXO0lBQ1gsbUVBQVU7QUFDZCxDQUFDLEVBTlcsb0JBQW9CLEtBQXBCLG9CQUFvQixRQU0vQjs7Ozs7Ozs7Ozs7OztBQ05EO0FBQUE7QUFBQSxJQUFZLFVBWVg7QUFaRCxXQUFZLFVBQVU7SUFDbEIsaUZBQTJCO0lBQzNCLCtEQUFrQjtJQUNsQixxRUFBcUI7SUFDckIscURBQWE7SUFDYix1REFBYztJQUNkLHFFQUFxQjtJQUNyQix5REFBZTtJQUNmLHlEQUFlO0lBQ2YsNkRBQWlCO0lBQ2pCLHlFQUF1QjtJQUN2Qix3RkFBK0I7QUFDbkMsQ0FBQyxFQVpXLFVBQVUsS0FBVixVQUFVLFFBWXJCOzs7Ozs7Ozs7Ozs7O0FDWkQ7QUFBQTtBQUFBLElBQVksc0JBSVg7QUFKRCxXQUFZLHNCQUFzQjtJQUM5Qix5RUFBVztJQUNYLDJFQUFZO0lBQ1osNkVBQWE7QUFDakIsQ0FBQyxFQUpXLHNCQUFzQixLQUF0QixzQkFBc0IsUUFJakM7Ozs7Ozs7Ozs7Ozs7QUNKRDtBQUFBO0FBQUEsSUFBWSxnQkFHWDtBQUhELFdBQVksZ0JBQWdCO0lBQ3hCLHlFQUFpQjtJQUNqQixxRUFBZTtBQUNuQixDQUFDLEVBSFcsZ0JBQWdCLEtBQWhCLGdCQUFnQixRQUczQjs7Ozs7Ozs7Ozs7OztBQ0hEO0FBQUE7QUFBQSxJQUFZLGNBRVg7QUFGRCxXQUFZLGNBQWM7SUFDdEIseURBQVc7QUFDZixDQUFDLEVBRlcsY0FBYyxLQUFkLGNBQWMsUUFFekI7Ozs7Ozs7Ozs7Ozs7QUNGRDtBQUFBO0FBQUEsSUFBWSxRQUdYO0FBSEQsV0FBWSxRQUFRO0lBQ2hCLHVDQUFRO0lBQ1IsdUNBQVE7QUFDWixDQUFDLEVBSFcsUUFBUSxLQUFSLFFBQVEsUUFHbkI7Ozs7Ozs7Ozs7Ozs7QUNIRDtBQUFBO0FBQUEsSUFBWSxTQU1YO0FBTkQsV0FBWSxTQUFTO0lBQ2pCLDhCQUFpQjtJQUNqQiw0QkFBZTtJQUNmLDBCQUFhO0lBQ2IsMEJBQWE7SUFDYiw0Q0FBK0I7QUFDbkMsQ0FBQyxFQU5XLFNBQVMsS0FBVCxTQUFTLFFBTXBCOzs7Ozs7Ozs7Ozs7O0FDTkQ7QUFBQTtBQUFBLElBQVkscUJBU1g7QUFURCxXQUFZLHFCQUFxQjtJQUM3QixtRkFBaUI7SUFDakIsbUVBQVM7SUFDVCwrREFBTztJQUNQLHVFQUFXO0lBQ1gsK0RBQU87SUFDUCx5RUFBWTtJQUNaLHVGQUFtQjtJQUNuQix5RUFBWTtBQUNoQixDQUFDLEVBVFcscUJBQXFCLEtBQXJCLHFCQUFxQixRQVNoQzs7Ozs7Ozs7Ozs7OztBQ1REO0FBQUE7QUFBQSxJQUFZLFlBT1g7QUFQRCxXQUFZLFlBQVk7SUFDcEIsbURBQVU7SUFDViwrQ0FBUTtJQUNSLDJEQUFjO0lBQ2QsaURBQVM7SUFDVCx5RUFBcUI7SUFDckIsaURBQVM7QUFDYixDQUFDLEVBUFcsWUFBWSxLQUFaLFlBQVksUUFPdkI7Ozs7Ozs7Ozs7Ozs7QUNIRDtBQUFBO0FBQUE7QUFBTyxNQUFNLGNBQWM7SUFDdkIsWUFBcUIsV0FBbUIsRUFBbUIsUUFBaUI7UUFBdkQsZ0JBQVcsR0FBWCxXQUFXLENBQVE7UUFBbUIsYUFBUSxHQUFSLFFBQVEsQ0FBUztJQUFJLENBQUM7SUFFakYsSUFBSSxPQUFPOztRQUNQLGFBQU8sSUFBSSxDQUFDLFFBQVEsbUNBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUM3QyxDQUFDO0NBQ0o7QUFFRDs7Ozs7O0dBTUc7QUFDSSxTQUFTLGlCQUFpQixDQUFDLEVBQWdCLEVBQUUsT0FBZ0I7SUFDaEUsT0FBTyxDQUFDLFNBQW1CLEVBQUUsV0FBbUIsRUFBRSxFQUFFO1FBQ2hELElBQUksU0FBUyxDQUFDLGtCQUFrQixJQUFJLElBQUksRUFBRTtZQUN0QyxTQUFTLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxHQUFHLEVBQWdDLENBQUM7U0FDMUU7UUFFRCxTQUFTLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxJQUFJLGNBQWMsQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUNuRixDQUFDLENBQUM7QUFDTixDQUFDOzs7Ozs7Ozs7Ozs7O0FDM0JEO0FBQUE7QUFBQTs7Ozs7Ozs7O0dBU0c7QUFDSSxTQUFTLGFBQWEsQ0FBQyxRQUFpQztJQUMzRCxPQUFPLENBQUMsTUFBVyxFQUFFLFdBQTRCLEVBQUUsVUFBOEIsRUFBRSxFQUFFO1FBQ2pGLE1BQU0sY0FBYyxHQUF1QixVQUFVLENBQUMsS0FBSyxDQUFDO1FBQzVELE1BQU0sTUFBTSxHQUFHLElBQUksR0FBRyxFQUFrQyxDQUFDO1FBRXpELE1BQU0sUUFBUSxHQUFHLENBQUMsR0FBUSxFQUFFLEVBQUU7WUFDMUIsSUFBSSxLQUFLLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM1QixJQUFJLEtBQUssSUFBSSxJQUFJLEVBQUU7Z0JBQ2YsT0FBTyxLQUFLLENBQUM7YUFDaEI7WUFDRCxLQUFLLEdBQUcsSUFBSSxHQUFHLEVBQXdCLENBQUM7WUFDeEMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDdkIsT0FBTyxLQUFLLENBQUM7UUFDakIsQ0FBQyxDQUFDO1FBRUYsT0FBTztZQUNILEtBQUssRUFBRSxVQUFTLEdBQUcsSUFBVztnQkFDMUIsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUM3QixNQUFNLFlBQVksR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3BDLElBQUksUUFBUSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQ3ZDLElBQUksUUFBUSxJQUFJLElBQUksRUFBRTtvQkFDbEIsT0FBTyxRQUFRLENBQUM7aUJBQ25CO2dCQUVELE1BQU0sU0FBUyxHQUFHLEdBQUcsRUFBRTtvQkFDbkIsS0FBSyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztvQkFDM0IsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRTt3QkFDbEIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztxQkFDdkI7Z0JBQ0wsQ0FBQyxDQUFDO2dCQUNGLFFBQVEsR0FBRyxjQUFjLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRTtvQkFDMUQsU0FBUyxFQUFFLENBQUM7b0JBQ1osT0FBTyxHQUFHLENBQUM7Z0JBQ2YsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBUSxFQUFFLEVBQUU7b0JBQ2xCLFNBQVMsRUFBRSxDQUFDO29CQUNaLE1BQU0sR0FBRyxDQUFDO2dCQUNkLENBQUMsQ0FBQyxDQUFDO2dCQUVILEtBQUssQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLFFBQVEsQ0FBQyxDQUFDO2dCQUNsQyxPQUFPLFFBQVEsQ0FBQztZQUNwQixDQUFDO1NBQ0osQ0FBQztJQUNOLENBQUMsQ0FBQztBQUNOLENBQUM7Ozs7Ozs7Ozs7Ozs7QUNyREQ7QUFBQTtBQUFBO0FBR21DO0FBRTVCLE1BQU0sWUFBWTtJQUNyQixNQUFNLENBQUMsY0FBYyxDQUFDLFFBQXFDLEVBQUUsU0FBaUIsRUFBRSxLQUFlLEVBQzNGLEdBQW9CLEVBQUUsTUFBdUIsRUFBRSxTQUFpQjtRQUNoRSxJQUFJLEtBQUssQ0FBQyxNQUFNLElBQUksU0FBUyxFQUFFO1lBQzNCLE9BQU87U0FDVjtRQUVELE1BQU0sR0FBRyxHQUFHLFNBQVMsS0FBSyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUMzQyxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFbEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDdEMsSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxLQUFLLENBQUMsU0FBUyxDQUFDLEVBQUU7Z0JBQzVDLFNBQVM7YUFDWjtZQUNELElBQUksR0FBRyxJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEVBQUU7Z0JBQ3ZDLG1DQUFtQztnQkFDbkMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLGdFQUFRLENBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUNuRCxPQUFPO2FBQ1Y7WUFDRCxZQUFZLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsU0FBUyxHQUFHLENBQUMsRUFBRSxLQUFLLEVBQ2xFLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQ3RDLE9BQU87U0FDVjtRQUVELElBQUksUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLFFBQVEsQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDN0QsSUFBSSxHQUFHLEVBQUU7Z0JBQ0wsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLGdFQUFRLENBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUNuRCxPQUFPO2FBQ1Y7WUFDRCxNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLEdBQUcsU0FBUyxHQUFHLEtBQUssQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDeEUsWUFBWSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUFFLENBQUMsV0FBVyxFQUFFLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFDakYsR0FBRyxFQUFFLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQztTQUMvQjtJQUNMLENBQUM7SUFFRCxNQUFNLENBQUMsaUJBQWlCLENBQUMsUUFBcUMsRUFBRSxFQUFVO1FBQ3RFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3RDLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFO2dCQUM1QixPQUFPLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUN0QjtpQkFBTSxJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLElBQUksSUFBSSxFQUFFO2dCQUNyQyxNQUFNLElBQUksR0FBRyxZQUFZLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDdEUsSUFBSSxJQUFJLEtBQUssSUFBSSxFQUFFO29CQUNmLE9BQU8sSUFBSSxDQUFDO2lCQUNmO2FBQ0o7U0FDSjtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7Q0FDSjs7Ozs7Ozs7Ozs7OztBQ3JERDtBQUFBO0FBQUE7Ozs7O0dBS0c7QUFDSSxTQUFTLFFBQVEsQ0FBQyxLQUFhLEVBQUUsV0FBb0M7SUFDeEUsT0FBTyxDQUFJLE1BQVcsRUFBRSxXQUE0QixFQUNoRCxVQUFtRSxFQUFFLEVBQUU7UUFDdkUsTUFBTSxjQUFjLEdBQXFCLFVBQVUsQ0FBQyxLQUFLLENBQUM7UUFDMUQsTUFBTSxZQUFZLEdBQUcsSUFBSSxHQUFHLEVBQW9DLENBQUM7UUFFakUsTUFBTSxZQUFZLEdBQUcsQ0FBQyxHQUFRLEVBQUUsRUFBRTtZQUM5QixJQUFJLFNBQVMsR0FBRyxZQUFZLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3RDLElBQUksU0FBUyxJQUFJLElBQUksRUFBRTtnQkFDbkIsT0FBTyxTQUFTLENBQUM7YUFDcEI7WUFDRCxTQUFTLEdBQUcsSUFBSSxHQUFHLEVBQTBCLENBQUM7WUFDOUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDakMsT0FBTyxTQUFTLENBQUM7UUFDckIsQ0FBQyxDQUFDO1FBRUYsT0FBTztZQUNILEtBQUssRUFBRSxVQUFTLEdBQUcsSUFBVztnQkFDMUIsTUFBTSxTQUFTLEdBQUcsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNyQyxNQUFNLGVBQWUsR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzFDLElBQUksS0FBSyxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUM7Z0JBQzNDLElBQUksS0FBSyxJQUFJLElBQUksRUFBRTtvQkFDZixLQUFLLEdBQUcsRUFBRSxDQUFDO29CQUNYLFNBQVMsQ0FBQyxHQUFHLENBQUMsZUFBZSxFQUFFLEtBQUssQ0FBQyxDQUFDO2lCQUN6QztnQkFFRCxPQUFPLElBQUksT0FBTyxDQUFJLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO29CQUN0QyxNQUFNLElBQUksR0FBRyxHQUFHLEVBQUU7d0JBQ2QsTUFBTSxTQUFTLEdBQUcsR0FBRyxFQUFFOzRCQUNuQixLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7NEJBQ3JDLElBQUksS0FBSyxDQUFDLE1BQU0sSUFBSSxLQUFLLEVBQUU7Z0NBQ3ZCLEtBQUssQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQzs2QkFDdEI7aUNBQU0sSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtnQ0FDM0IsU0FBUyxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQztnQ0FDbEMsSUFBSSxTQUFTLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRTtvQ0FDdEIsWUFBWSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztpQ0FDN0I7NkJBQ0o7d0JBQ0wsQ0FBQyxDQUFDO3dCQUNGLGNBQWMsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFOzRCQUMvQyxTQUFTLEVBQUUsQ0FBQzs0QkFDWixPQUFPLEdBQUcsQ0FBQzt3QkFDZixDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRTs0QkFDbEIsU0FBUyxFQUFFLENBQUM7NEJBQ1osTUFBTSxHQUFHLENBQUM7d0JBQ2QsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztvQkFDN0IsQ0FBQyxDQUFDO29CQUNGLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ2pCLElBQUksS0FBSyxDQUFDLE1BQU0sSUFBSSxLQUFLLEVBQUU7d0JBQ3ZCLElBQUksRUFBRSxDQUFDO3FCQUNWO2dCQUNMLENBQUMsQ0FBQyxDQUFDO1lBQ1AsQ0FBQztTQUNKLENBQUM7SUFDTixDQUFDLENBQUM7QUFDTixDQUFDOzs7Ozs7Ozs7Ozs7O0FDN0REO0FBQUE7QUFBQTtBQUFBO0FBQStCO0FBSS9CLDJCQUEyQjtBQUMzQixNQUFNLE9BQU8sR0FBRyxPQUFPLE1BQU0sS0FBSyxXQUFXLENBQUMsQ0FBQyxDQUFDLG1CQUFPLENBQUMsc0NBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7QUFFL0QsTUFBTSxLQUFLO0lBWWQsTUFBTSxDQUFDLElBQUk7UUFDUCxJQUFJLEtBQUssQ0FBQyxNQUFNLEVBQUU7WUFDZCxPQUFPO1NBQ1Y7UUFFRCxLQUFLLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztRQUNwQixLQUFLLENBQUMsTUFBTSxHQUFHLE9BQU8sT0FBTyxLQUFLLFdBQVcsSUFBSyxPQUFlLENBQUMsT0FBTyxJQUFJLElBQUk7WUFDNUUsT0FBZSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEtBQUssTUFBTSxDQUFDO1FBQzdDLEtBQUssQ0FBQyxTQUFTLEdBQUcsT0FBTyxNQUFNLEtBQUssV0FBVyxDQUFDO1FBQ2hELEtBQUssQ0FBQyxjQUFjLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQztRQUN6RCxLQUFLLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNqRSxLQUFLLENBQUMsb0JBQW9CLEdBQUcsS0FBSyxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzNFLEtBQUssQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3hHLENBQUM7SUFFRCxNQUFNLENBQUMsY0FBYyxDQUFDLEdBQVc7UUFDN0IsSUFBSSxLQUFLLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxjQUFjLEVBQUU7WUFDdEMsT0FBTyxJQUFJLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDO1NBQ3JEO2FBQU07WUFDSCxNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3RDLE1BQU0sS0FBSyxHQUFHLElBQUksVUFBVSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNsRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDMUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDekM7WUFDRCxPQUFPLEtBQUssQ0FBQztTQUNoQjtJQUNMLENBQUM7SUFFRCxNQUFNLENBQUMsaUJBQWlCLENBQUMsR0FBVztRQUNoQyxPQUFPLEtBQUssQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFFRCxNQUFNLENBQUMsY0FBYyxDQUFDLEdBQVc7UUFDN0IsSUFBSSxLQUFLLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxjQUFjLEVBQUU7WUFDdEMsT0FBTyxJQUFJLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO1NBQ2xEO2FBQU07WUFDSCxNQUFNLEtBQUssR0FBRyxJQUFJLFVBQVUsQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQzdDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQ3BDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO2FBQ2pEO1lBQ0QsT0FBTyxLQUFLLENBQUM7U0FDaEI7SUFDTCxDQUFDO0lBRUQsTUFBTSxDQUFDLGVBQWUsQ0FBQyxHQUFXO1FBQzlCLElBQUksS0FBSyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsY0FBYyxFQUFFO1lBQ3RDLE9BQU8sSUFBSSxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztTQUNuRDthQUFNO1lBQ0gsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDbEQsTUFBTSxHQUFHLEdBQUcsSUFBSSxVQUFVLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzNDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUNyQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNsQztZQUNELE9BQU8sR0FBRyxDQUFDO1NBQ2Q7SUFDTCxDQUFDO0lBRUQsTUFBTSxDQUFDLHFCQUFxQixDQUFDLEdBQVc7UUFDcEMsTUFBTSxHQUFHLEdBQUcsSUFBSSxVQUFVLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3ZDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ2pDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQzlCO1FBQ0QsT0FBTyxHQUFHLENBQUM7SUFDZixDQUFDO0lBRUQsTUFBTSxDQUFDLGVBQWUsQ0FBQyxNQUFtQjtRQUN0QyxJQUFJLEtBQUssQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLGNBQWMsRUFBRTtZQUN0QyxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQ2pEO2FBQU07WUFDSCxJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7WUFDaEIsTUFBTSxLQUFLLEdBQUcsSUFBSSxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDckMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ3ZDLE1BQU0sSUFBSSxNQUFNLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQzNDO1lBQ0QsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQzlCO0lBQ0wsQ0FBQztJQUVELE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxNQUFtQjtRQUN6QyxPQUFPLEtBQUssQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFFRCxNQUFNLENBQUMsZUFBZSxDQUFDLE1BQWM7UUFDakMsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUM7YUFDNUIsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUM7YUFDbkIsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztJQUMzQixDQUFDO0lBRUQsTUFBTSxDQUFDLGdCQUFnQixDQUFDLE1BQW1CO1FBQ3ZDLElBQUksS0FBSyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsY0FBYyxFQUFFO1lBQ3RDLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDL0M7YUFBTTtZQUNILE1BQU0sS0FBSyxHQUFHLElBQUksVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3JDLE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztZQUM3RCxPQUFPLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO1NBQ3BEO0lBQ0wsQ0FBQztJQUVELE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxNQUFtQjtRQUM3QyxPQUFPLE1BQU0sQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxJQUFJLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ25FLENBQUM7SUFFRCxvREFBb0Q7SUFDcEQsTUFBTSxDQUFDLGVBQWUsQ0FBQyxNQUFtQjtRQUN0QyxJQUFJLEtBQUssQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLGNBQWMsRUFBRTtZQUN0QyxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQzlDO2FBQU07WUFDSCxNQUFNLEtBQUssR0FBRyxJQUFJLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNyQyxPQUFPLEtBQUssQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFTLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUNyRztJQUNMLENBQUM7SUFFRCxNQUFNLENBQUMsZUFBZSxDQUFDLFNBQWlCO1FBQ3BDLElBQUksTUFBTSxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDN0QsUUFBUSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUN2QixLQUFLLENBQUM7Z0JBQ0YsTUFBTTtZQUNWLEtBQUssQ0FBQztnQkFDRixNQUFNLElBQUksSUFBSSxDQUFDO2dCQUNmLE1BQU07WUFDVixLQUFLLENBQUM7Z0JBQ0YsTUFBTSxJQUFJLEdBQUcsQ0FBQztnQkFDZCxNQUFNO1lBQ1Y7Z0JBQ0ksTUFBTSxJQUFJLEtBQUssQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO1NBQ3BEO1FBRUQsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQztJQUVELE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFpQjtRQUNyQyxPQUFPLEtBQUssQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQ2pFLENBQUM7SUFFRCxNQUFNLENBQUMsYUFBYSxDQUFDLE1BQWM7UUFDL0IsSUFBSSxLQUFLLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxjQUFjLEVBQUU7WUFDdEMsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDekQ7YUFBTTtZQUNILE9BQU8sa0JBQWtCLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQzFEO0lBQ0wsQ0FBQztJQUVELE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFjO1FBQ2xDLE9BQU8sS0FBSyxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBRUQsTUFBTSxDQUFDLGFBQWEsQ0FBQyxNQUFjO1FBQy9CLElBQUksS0FBSyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsY0FBYyxFQUFFO1lBQ3RDLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQ3pEO2FBQU07WUFDSCxPQUFPLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUMxRDtJQUNMLENBQUM7SUFFRCxrREFBa0Q7SUFDbEQsTUFBTSxDQUFDLE9BQU87UUFDVixPQUFPLHNDQUFzQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLEVBQUU7WUFDL0QsMkJBQTJCO1lBQzNCLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ2pDLDJCQUEyQjtZQUMzQixNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztZQUMxQyxPQUFPLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDMUIsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFVO1FBQ3BCLE9BQU8sTUFBTSxDQUFDLDJFQUEyRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUM3RyxDQUFDO0lBRUQsTUFBTSxDQUFDLFdBQVcsQ0FBQyxTQUFpQjtRQUNoQyxNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3BDLElBQUk7WUFDQSxPQUFPLEdBQUcsSUFBSSxJQUFJLElBQUksR0FBRyxDQUFDLFFBQVEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztTQUNuRTtRQUFDLFdBQU07WUFDSixPQUFPLElBQUksQ0FBQztTQUNmO0lBQ0wsQ0FBQztJQUVELE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBaUI7UUFDNUIsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNwQyxJQUFJO1lBQ0EsT0FBTyxHQUFHLElBQUksSUFBSSxJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7U0FDM0Q7UUFBQyxXQUFNO1lBQ0osT0FBTyxJQUFJLENBQUM7U0FDZjtJQUNMLENBQUM7SUFFRCxNQUFNLENBQUMsU0FBUyxDQUFDLFNBQWlCO1FBQzlCLElBQUksU0FBUyxJQUFJLElBQUksRUFBRTtZQUNuQixPQUFPLElBQUksQ0FBQztTQUNmO1FBRUQsU0FBUyxHQUFHLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUM3QixJQUFJLFNBQVMsS0FBSyxFQUFFLEVBQUU7WUFDbEIsT0FBTyxJQUFJLENBQUM7U0FDZjtRQUVELElBQUksU0FBUyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUMvQixPQUFPLElBQUksQ0FBQztTQUNmO1FBRUQsSUFBSSxPQUFPLEdBQUcsU0FBUyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsSUFBSSxTQUFTLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2xGLElBQUksQ0FBQyxPQUFPLElBQUksU0FBUyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksS0FBSyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUU7WUFDbEYsU0FBUyxHQUFHLFNBQVMsR0FBRyxTQUFTLENBQUM7WUFDbEMsT0FBTyxHQUFHLElBQUksQ0FBQztTQUNsQjtRQUVELElBQUksT0FBTyxFQUFFO1lBQ1QsSUFBSTtnQkFDQSxNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUMxQyxNQUFNLGFBQWEsR0FBRyxtQ0FBSyxhQUFMLGtDQUFLLHVCQUFMLDZDQUFjLEtBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyw2Q0FBYSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO2dCQUNsRixJQUFJLENBQUMsYUFBYSxFQUFFO29CQUNoQixPQUFPLElBQUksQ0FBQztpQkFDZjtnQkFFRCxJQUFJLEdBQUcsQ0FBQyxRQUFRLEtBQUssV0FBVyxJQUFJLEtBQUssQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFO29CQUNwRSxPQUFPLEdBQUcsQ0FBQyxRQUFRLENBQUM7aUJBQ3ZCO2dCQUVELE1BQU0sU0FBUyxHQUFHLGtDQUFLLElBQUksSUFBSSxJQUFJLCtDQUFlLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQywrQ0FBZSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO2dCQUNsRyxPQUFPLFNBQVMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQzthQUN2RDtZQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUNSLDhDQUE4QzthQUNqRDtTQUNKO1FBRUQsSUFBSTtZQUNBLE1BQU0sTUFBTSxHQUFHLGtDQUFLLElBQUksSUFBSSxJQUFJLCtDQUFlLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQywrQ0FBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFFNUYsSUFBSSxNQUFNLElBQUksSUFBSSxFQUFFO2dCQUNoQixPQUFPLE1BQU0sQ0FBQzthQUNqQjtTQUNKO1FBQUMsV0FBTTtZQUNKLE9BQU8sSUFBSSxDQUFDO1NBQ2Y7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQsTUFBTSxDQUFDLGNBQWMsQ0FBQyxTQUFpQjtRQUNuQyxNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3BDLElBQUksR0FBRyxJQUFJLElBQUksSUFBSSxHQUFHLENBQUMsTUFBTSxJQUFJLElBQUksSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLEVBQUUsRUFBRTtZQUN4RCxPQUFPLElBQUksQ0FBQztTQUNmO1FBQ0QsTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7UUFDdEMsTUFBTSxLQUFLLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDckYsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNqQixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzlCLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQ2xCLE9BQU87YUFDVjtZQUNELEdBQUcsQ0FBQyxHQUFHLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlHLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxHQUFHLENBQUM7SUFDZixDQUFDO0lBRUQsTUFBTSxDQUFDLGVBQWUsQ0FBQyxXQUF3QixFQUFFLElBQVk7UUFDekQsT0FBTyxDQUFDLENBQU0sRUFBRSxDQUFNLEVBQUUsRUFBRTtZQUN0QixJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksRUFBRTtnQkFDcEMsT0FBTyxDQUFDLENBQUMsQ0FBQzthQUNiO1lBQ0QsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLEVBQUU7Z0JBQ3BDLE9BQU8sQ0FBQyxDQUFDO2FBQ1o7WUFDRCxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksRUFBRTtnQkFDcEMsT0FBTyxDQUFDLENBQUM7YUFDWjtZQUVELE9BQU8sV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDdkMsQ0FBQyxDQUFDO0lBQ04sQ0FBQztJQUVELE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxHQUFXO1FBQ2pDLE9BQU8sR0FBRyxJQUFJLElBQUksSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLElBQUksR0FBRyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQztJQUN2RSxDQUFDO0lBRUQsTUFBTSxDQUFDLE1BQU0sQ0FBSSxJQUFzQjtRQUNuQyxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQsTUFBTSxDQUFDLE1BQU0sQ0FBSSxNQUFTLEVBQUUsTUFBa0I7UUFDMUMsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRUQsTUFBTSxDQUFDLFdBQVcsQ0FBZ0QsR0FBTTtRQUNwRSxPQUFRLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDcEYsQ0FBQztJQUdELE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBaUI7UUFDM0IsSUFBSSxTQUFTLElBQUksSUFBSSxFQUFFO1lBQ25CLE9BQU8sSUFBSSxDQUFDO1NBQ2Y7UUFFRCxTQUFTLEdBQUcsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzdCLElBQUksU0FBUyxLQUFLLEVBQUUsRUFBRTtZQUNsQixPQUFPLElBQUksQ0FBQztTQUNmO1FBRUQsSUFBSSxHQUFHLEdBQUcsS0FBSyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN4QyxJQUFJLEdBQUcsSUFBSSxJQUFJLEVBQUU7WUFDYixNQUFNLGVBQWUsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxTQUFTLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNsRyxJQUFJLENBQUMsZUFBZSxJQUFJLFNBQVMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUU7Z0JBQ2pELEdBQUcsR0FBRyxLQUFLLENBQUMsWUFBWSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUMsQ0FBQzthQUNuRDtTQUNKO1FBQ0QsT0FBTyxHQUFHLENBQUM7SUFDZixDQUFDO0lBRUQsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQVM7UUFDOUIsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVPLE1BQU0sQ0FBQyxjQUFjLENBQUMsUUFBZ0I7UUFDMUMsMkJBQTJCO1FBQzNCLE1BQU0sT0FBTyxHQUFHLGtLQUFrSyxDQUFDO1FBQ25MLE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRU8sTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFXO1FBQy9CLElBQUksTUFBTSxHQUFHLEtBQUssQ0FBQztRQUNuQixDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ0QsMkJBQTJCO1lBQzNCLElBQUksMFRBQTBULENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLHlrREFBeWtELENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0JBQ3Q2RCxNQUFNLEdBQUcsSUFBSSxDQUFDO2FBQ2pCO1FBQ0wsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxTQUFTLElBQUksR0FBRyxDQUFDLFNBQVMsQ0FBQyxNQUFNLElBQUssR0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzFFLE9BQU8sTUFBTSxJQUFJLEdBQUcsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxJQUFJLENBQUM7SUFDcEUsQ0FBQztJQUVPLE1BQU0sQ0FBQyxhQUFhLENBQUMsR0FBVztRQUNwQyxPQUFPLEdBQUcsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsSUFBSSxJQUFJLElBQUksR0FBRyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUksQ0FBQztJQUM5RyxDQUFDO0lBRU8sTUFBTSxDQUFDLFlBQVksQ0FBQyxTQUFpQjtRQUN6QyxJQUFJO1lBQ0EsSUFBSSxPQUFPLElBQUksSUFBSSxFQUFFO2dCQUNqQixPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQzthQUM5RTtpQkFBTSxJQUFJLE9BQU8sR0FBRyxLQUFLLFVBQVUsRUFBRTtnQkFDbEMsT0FBTyxJQUFJLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQzthQUM3QjtpQkFBTSxJQUFJLE1BQU0sSUFBSSxJQUFJLEVBQUU7Z0JBQ3ZCLE1BQU0sV0FBVyxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ2xELElBQUksQ0FBQyxXQUFXLElBQUksU0FBUyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRTtvQkFDN0MsU0FBUyxHQUFHLFNBQVMsR0FBRyxTQUFTLENBQUM7aUJBQ3JDO3FCQUFNLElBQUksQ0FBQyxXQUFXLEVBQUU7b0JBQ3JCLE9BQU8sSUFBSSxDQUFDO2lCQUNmO2dCQUNELE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNsRCxNQUFNLENBQUMsSUFBSSxHQUFHLFNBQVMsQ0FBQztnQkFDeEIsT0FBTyxNQUFhLENBQUM7YUFDeEI7U0FDSjtRQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ1IsZUFBZTtTQUNsQjtRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7O0FBaFhNLFlBQU0sR0FBRyxLQUFLLENBQUM7QUFDZixvQkFBYyxHQUFHLEtBQUssQ0FBQztBQUN2QixZQUFNLEdBQUcsS0FBSyxDQUFDO0FBQ2YsZUFBUyxHQUFHLElBQUksQ0FBQztBQUNqQixxQkFBZSxHQUFHLEtBQUssQ0FBQztBQUN4QiwwQkFBb0IsR0FBRyxLQUFLLENBQUM7QUFDN0IsWUFBTSxHQUFRLElBQUksQ0FBQztBQUNuQixvQkFBYyxHQUFHLGdGQUFnRixDQUFDO0FBQ3pHLGlJQUFpSTtBQUMxSCw2QkFBdUIsR0FBSSx5MkJBQXkyQixDQUFDO0FBMFdoNUIsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDOzs7Ozs7Ozs7Ozs7OztBQzNYYjtBQUFBO0FBQUEsb0RBQW9EO0FBQzdDLE1BQU0sZUFBZSxHQUFHO0lBQzNCLFFBQVE7SUFDUixTQUFTO0lBQ1QsV0FBVztJQUNYLE9BQU87SUFDUCxTQUFTO0lBQ1QsU0FBUztJQUNULFFBQVE7SUFDUixNQUFNO0lBQ04sVUFBVTtJQUNWLFVBQVU7SUFDVixVQUFVO0lBQ1YsU0FBUztJQUNULFNBQVM7SUFDVCxRQUFRO0lBQ1IsVUFBVTtJQUNWLFNBQVM7SUFDVCxVQUFVO0lBQ1YsVUFBVTtJQUNWLFVBQVU7SUFDVixVQUFVO0lBQ1YsU0FBUztJQUNULFNBQVM7SUFDVCxVQUFVO0lBQ1YsUUFBUTtJQUNSLFFBQVE7SUFDUixTQUFTO0lBQ1QsV0FBVztJQUNYLFdBQVc7SUFDWCxTQUFTO0lBQ1QsVUFBVTtJQUNWLFVBQVU7SUFDVixVQUFVO0lBQ1YsU0FBUztJQUNULFVBQVU7SUFDVixRQUFRO0lBQ1IsTUFBTTtJQUNOLE9BQU87SUFDUCxVQUFVO0lBQ1YsU0FBUztJQUNULE1BQU07SUFDTixTQUFTO0lBQ1QsU0FBUztJQUNULFFBQVE7SUFDUixRQUFRO0lBQ1IsVUFBVTtJQUNWLFdBQVc7SUFDWCxRQUFRO0lBQ1IsVUFBVTtJQUNWLFVBQVU7SUFDVixVQUFVO0lBQ1YsU0FBUztJQUNULE1BQU07SUFDTixTQUFTO0lBQ1QsV0FBVztJQUNYLFVBQVU7SUFDVixVQUFVO0lBQ1YsU0FBUztJQUNULFdBQVc7SUFDWCxNQUFNO0lBQ04sUUFBUTtJQUNSLFVBQVU7SUFDVixXQUFXO0lBQ1gsV0FBVztJQUNYLFdBQVc7SUFDWCxXQUFXO0lBQ1gsUUFBUTtJQUNSLE9BQU87SUFDUCxXQUFXO0lBQ1gsVUFBVTtJQUNWLFFBQVE7SUFDUixTQUFTO0lBQ1QsUUFBUTtJQUNSLFFBQVE7SUFDUixVQUFVO0lBQ1YsT0FBTztJQUNQLFFBQVE7SUFDUixXQUFXO0lBQ1gsV0FBVztJQUNYLFdBQVc7SUFDWCxXQUFXO0lBQ1gsV0FBVztJQUNYLE1BQU07SUFDTixTQUFTO0lBQ1QsUUFBUTtJQUNSLFFBQVE7SUFDUixPQUFPO0lBQ1AsV0FBVztJQUNYLFFBQVE7SUFDUixPQUFPO0lBQ1AsU0FBUztJQUNULE9BQU87SUFDUCxVQUFVO0lBQ1YsU0FBUztJQUNULFdBQVc7SUFDWCxPQUFPO0lBQ1AsV0FBVztJQUNYLFdBQVc7SUFDWCxRQUFRO0lBQ1IsVUFBVTtJQUNWLFdBQVc7SUFDWCxTQUFTO0lBQ1QsT0FBTztJQUNQLE1BQU07SUFDTixNQUFNO0lBQ04sTUFBTTtJQUNOLEtBQUs7SUFDTCxNQUFNO0lBQ04sV0FBVztJQUNYLE9BQU87SUFDUCxXQUFXO0lBQ1gsT0FBTztJQUNQLFNBQVM7SUFDVCxTQUFTO0lBQ1QsV0FBVztJQUNYLE9BQU87SUFDUCxPQUFPO0lBQ1AsV0FBVztJQUNYLFVBQVU7SUFDVixRQUFRO0lBQ1IsT0FBTztJQUNQLE9BQU87SUFDUCxVQUFVO0lBQ1YsVUFBVTtJQUNWLFNBQVM7SUFDVCxVQUFVO0lBQ1YsUUFBUTtJQUNSLE1BQU07SUFDTixPQUFPO0lBQ1AsT0FBTztJQUNQLE9BQU87SUFDUCxXQUFXO0lBQ1gsT0FBTztJQUNQLFVBQVU7SUFDVixTQUFTO0lBQ1QsVUFBVTtJQUNWLFVBQVU7SUFDVixNQUFNO0lBQ04sVUFBVTtJQUNWLFFBQVE7SUFDUixRQUFRO0lBQ1IsVUFBVTtJQUNWLE9BQU87SUFDUCxXQUFXO0lBQ1gsT0FBTztJQUNQLFVBQVU7SUFDVixXQUFXO0lBQ1gsV0FBVztJQUNYLFVBQVU7SUFDVixXQUFXO0lBQ1gsV0FBVztJQUNYLFFBQVE7SUFDUixXQUFXO0lBQ1gsV0FBVztJQUNYLFFBQVE7SUFDUixTQUFTO0lBQ1QsU0FBUztJQUNULFVBQVU7SUFDVixNQUFNO0lBQ04sT0FBTztJQUNQLE9BQU87SUFDUCxPQUFPO0lBQ1AsU0FBUztJQUNULFVBQVU7SUFDVixTQUFTO0lBQ1QsVUFBVTtJQUNWLE9BQU87SUFDUCxRQUFRO0lBQ1IsVUFBVTtJQUNWLE9BQU87SUFDUCxXQUFXO0lBQ1gsU0FBUztJQUNULE9BQU87SUFDUCxPQUFPO0lBQ1AsUUFBUTtJQUNSLFVBQVU7SUFDVixRQUFRO0lBQ1IsV0FBVztJQUNYLFFBQVE7SUFDUixTQUFTO0lBQ1QsVUFBVTtJQUNWLFdBQVc7SUFDWCxTQUFTO0lBQ1QsV0FBVztJQUNYLFNBQVM7SUFDVCxRQUFRO0lBQ1IsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0lBQ1QsUUFBUTtJQUNSLFFBQVE7SUFDUixVQUFVO0lBQ1YsTUFBTTtJQUNOLFdBQVc7SUFDWCxTQUFTO0lBQ1QsT0FBTztJQUNQLFFBQVE7SUFDUixRQUFRO0lBQ1IsUUFBUTtJQUNSLFNBQVM7SUFDVCxTQUFTO0lBQ1QsV0FBVztJQUNYLFdBQVc7SUFDWCxTQUFTO0lBQ1QsUUFBUTtJQUNSLFNBQVM7SUFDVCxXQUFXO0lBQ1gsV0FBVztJQUNYLFVBQVU7SUFDVixPQUFPO0lBQ1AsV0FBVztJQUNYLE9BQU87SUFDUCxPQUFPO0lBQ1AsVUFBVTtJQUNWLFdBQVc7SUFDWCxVQUFVO0lBQ1YsVUFBVTtJQUNWLFNBQVM7SUFDVCxVQUFVO0lBQ1YsU0FBUztJQUNULFdBQVc7SUFDWCxTQUFTO0lBQ1QsV0FBVztJQUNYLFVBQVU7SUFDVixVQUFVO0lBQ1YsVUFBVTtJQUNWLFFBQVE7SUFDUixTQUFTO0lBQ1QsV0FBVztJQUNYLFVBQVU7SUFDVixRQUFRO0lBQ1IsVUFBVTtJQUNWLFVBQVU7SUFDVixXQUFXO0lBQ1gsVUFBVTtJQUNWLFdBQVc7SUFDWCxVQUFVO0lBQ1YsV0FBVztJQUNYLFdBQVc7SUFDWCxXQUFXO0lBQ1gsV0FBVztJQUNYLFFBQVE7SUFDUixTQUFTO0lBQ1QsT0FBTztJQUNQLE9BQU87SUFDUCxTQUFTO0lBQ1QsUUFBUTtJQUNSLFNBQVM7SUFDVCxRQUFRO0lBQ1IsVUFBVTtJQUNWLFVBQVU7SUFDVixTQUFTO0lBQ1QsUUFBUTtJQUNSLFVBQVU7SUFDVixPQUFPO0lBQ1AsUUFBUTtJQUNSLFNBQVM7SUFDVCxXQUFXO0lBQ1gsUUFBUTtJQUNSLFNBQVM7SUFDVCxXQUFXO0lBQ1gsV0FBVztJQUNYLFVBQVU7SUFDVixVQUFVO0lBQ1YsV0FBVztJQUNYLFNBQVM7SUFDVCxVQUFVO0lBQ1YsT0FBTztJQUNQLFdBQVc7SUFDWCxXQUFXO0lBQ1gsU0FBUztJQUNULE9BQU87SUFDUCxXQUFXO0lBQ1gsV0FBVztJQUNYLFdBQVc7SUFDWCxXQUFXO0lBQ1gsVUFBVTtJQUNWLFVBQVU7SUFDVixTQUFTO0lBQ1QsU0FBUztJQUNULE9BQU87SUFDUCxPQUFPO0lBQ1AsVUFBVTtJQUNWLE9BQU87SUFDUCxNQUFNO0lBQ04sVUFBVTtJQUNWLFdBQVc7SUFDWCxXQUFXO0lBQ1gsVUFBVTtJQUNWLE1BQU07SUFDTixPQUFPO0lBQ1AsVUFBVTtJQUNWLFVBQVU7SUFDVixPQUFPO0lBQ1AsT0FBTztJQUNQLFdBQVc7SUFDWCxTQUFTO0lBQ1QsVUFBVTtJQUNWLE9BQU87SUFDUCxRQUFRO0lBQ1IsU0FBUztJQUNULFFBQVE7SUFDUixTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFDVCxRQUFRO0lBQ1IsU0FBUztJQUNULE1BQU07SUFDTixPQUFPO0lBQ1AsT0FBTztJQUNQLFFBQVE7SUFDUixTQUFTO0lBQ1QsU0FBUztJQUNULE9BQU87SUFDUCxRQUFRO0lBQ1IsU0FBUztJQUNULFFBQVE7SUFDUixXQUFXO0lBQ1gsVUFBVTtJQUNWLE9BQU87SUFDUCxLQUFLO0lBQ0wsUUFBUTtJQUNSLFdBQVc7SUFDWCxRQUFRO0lBQ1IsV0FBVztJQUNYLFNBQVM7SUFDVCxPQUFPO0lBQ1AsT0FBTztJQUNQLE1BQU07SUFDTixPQUFPO0lBQ1AsT0FBTztJQUNQLFFBQVE7SUFDUixXQUFXO0lBQ1gsUUFBUTtJQUNSLFVBQVU7SUFDVixRQUFRO0lBQ1IsU0FBUztJQUNULFVBQVU7SUFDVixTQUFTO0lBQ1QsU0FBUztJQUNULFdBQVc7SUFDWCxXQUFXO0lBQ1gsV0FBVztJQUNYLFFBQVE7SUFDUixVQUFVO0lBQ1YsT0FBTztJQUNQLE1BQU07SUFDTixVQUFVO0lBQ1YsTUFBTTtJQUNOLFFBQVE7SUFDUixXQUFXO0lBQ1gsU0FBUztJQUNULFFBQVE7SUFDUixRQUFRO0lBQ1IsU0FBUztJQUNULFdBQVc7SUFDWCxVQUFVO0lBQ1YsV0FBVztJQUNYLFdBQVc7SUFDWCxRQUFRO0lBQ1IsT0FBTztJQUNQLFFBQVE7SUFDUixVQUFVO0lBQ1YsV0FBVztJQUNYLFdBQVc7SUFDWCxVQUFVO0lBQ1YsU0FBUztJQUNULFdBQVc7SUFDWCxVQUFVO0lBQ1YsU0FBUztJQUNULFNBQVM7SUFDVCxVQUFVO0lBQ1YsT0FBTztJQUNQLFVBQVU7SUFDVixXQUFXO0lBQ1gsUUFBUTtJQUNSLFdBQVc7SUFDWCxRQUFRO0lBQ1IsUUFBUTtJQUNSLFVBQVU7SUFDVixXQUFXO0lBQ1gsV0FBVztJQUNYLFdBQVc7SUFDWCxXQUFXO0lBQ1gsV0FBVztJQUNYLFdBQVc7SUFDWCxXQUFXO0lBQ1gsUUFBUTtJQUNSLFFBQVE7SUFDUixVQUFVO0lBQ1YsUUFBUTtJQUNSLFNBQVM7SUFDVCxVQUFVO0lBQ1YsT0FBTztJQUNQLFVBQVU7SUFDVixTQUFTO0lBQ1QsTUFBTTtJQUNOLE9BQU87SUFDUCxPQUFPO0lBQ1AsUUFBUTtJQUNSLE9BQU87SUFDUCxPQUFPO0lBQ1AsUUFBUTtJQUNSLFNBQVM7SUFDVCxRQUFRO0lBQ1IsT0FBTztJQUNQLE1BQU07SUFDTixNQUFNO0lBQ04sUUFBUTtJQUNSLFVBQVU7SUFDVixRQUFRO0lBQ1IsUUFBUTtJQUNSLFVBQVU7SUFDVixXQUFXO0lBQ1gsV0FBVztJQUNYLFVBQVU7SUFDVixRQUFRO0lBQ1IsUUFBUTtJQUNSLFdBQVc7SUFDWCxVQUFVO0lBQ1YsVUFBVTtJQUNWLFNBQVM7SUFDVCxXQUFXO0lBQ1gsVUFBVTtJQUNWLFVBQVU7SUFDVixXQUFXO0lBQ1gsU0FBUztJQUNULFNBQVM7SUFDVCxVQUFVO0lBQ1YsV0FBVztJQUNYLFVBQVU7SUFDVixVQUFVO0lBQ1YsV0FBVztJQUNYLFVBQVU7SUFDVixVQUFVO0lBQ1YsV0FBVztJQUNYLFVBQVU7SUFDVixVQUFVO0lBQ1YsV0FBVztJQUNYLFVBQVU7SUFDVixXQUFXO0lBQ1gsUUFBUTtJQUNSLFVBQVU7SUFDVixVQUFVO0lBQ1YsV0FBVztJQUNYLFVBQVU7SUFDVixPQUFPO0lBQ1AsVUFBVTtJQUNWLFdBQVc7SUFDWCxRQUFRO0lBQ1IsT0FBTztJQUNQLFNBQVM7SUFDVCxPQUFPO0lBQ1AsU0FBUztJQUNULFFBQVE7SUFDUixVQUFVO0lBQ1YsT0FBTztJQUNQLFFBQVE7SUFDUixTQUFTO0lBQ1QsUUFBUTtJQUNSLFFBQVE7SUFDUixXQUFXO0lBQ1gsU0FBUztJQUNULE9BQU87SUFDUCxTQUFTO0lBQ1QsVUFBVTtJQUNWLE9BQU87SUFDUCxRQUFRO0lBQ1IsVUFBVTtJQUNWLFFBQVE7SUFDUixTQUFTO0lBQ1QsV0FBVztJQUNYLFNBQVM7SUFDVCxPQUFPO0lBQ1AsVUFBVTtJQUNWLFFBQVE7SUFDUixRQUFRO0lBQ1IsUUFBUTtJQUNSLFVBQVU7SUFDVixPQUFPO0lBQ1AsVUFBVTtJQUNWLFVBQVU7SUFDVixRQUFRO0lBQ1IsUUFBUTtJQUNSLFNBQVM7SUFDVCxVQUFVO0lBQ1YsVUFBVTtJQUNWLFFBQVE7SUFDUixXQUFXO0lBQ1gsU0FBUztJQUNULFFBQVE7SUFDUixVQUFVO0lBQ1YsUUFBUTtJQUNSLFNBQVM7SUFDVCxRQUFRO0lBQ1IsU0FBUztJQUNULE9BQU87SUFDUCxVQUFVO0lBQ1YsU0FBUztJQUNULFVBQVU7SUFDVixRQUFRO0lBQ1IsU0FBUztJQUNULFFBQVE7SUFDUixNQUFNO0lBQ04sV0FBVztJQUNYLFNBQVM7SUFDVCxXQUFXO0lBQ1gsUUFBUTtJQUNSLFVBQVU7SUFDVixXQUFXO0lBQ1gsU0FBUztJQUNULFVBQVU7SUFDVixXQUFXO0lBQ1gsVUFBVTtJQUNWLE1BQU07SUFDTixXQUFXO0lBQ1gsUUFBUTtJQUNSLE9BQU87SUFDUCxPQUFPO0lBQ1AsT0FBTztJQUNQLFFBQVE7SUFDUixRQUFRO0lBQ1IsT0FBTztJQUNQLE1BQU07SUFDTixPQUFPO0lBQ1AsTUFBTTtJQUNOLFdBQVc7SUFDWCxVQUFVO0lBQ1YsV0FBVztJQUNYLFNBQVM7SUFDVCxTQUFTO0lBQ1QsUUFBUTtJQUNSLFFBQVE7SUFDUixTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFDVCxPQUFPO0lBQ1AsTUFBTTtJQUNOLE9BQU87SUFDUCxTQUFTO0lBQ1QsV0FBVztJQUNYLFdBQVc7SUFDWCxPQUFPO0lBQ1AsV0FBVztJQUNYLFdBQVc7SUFDWCxPQUFPO0lBQ1AsVUFBVTtJQUNWLFdBQVc7SUFDWCxRQUFRO0lBQ1IsU0FBUztJQUNULFFBQVE7SUFDUixPQUFPO0lBQ1AsT0FBTztJQUNQLFNBQVM7SUFDVCxPQUFPO0lBQ1AsT0FBTztJQUNQLFVBQVU7SUFDVixPQUFPO0lBQ1AsT0FBTztJQUNQLFNBQVM7SUFDVCxTQUFTO0lBQ1QsVUFBVTtJQUNWLFFBQVE7SUFDUixNQUFNO0lBQ04sVUFBVTtJQUNWLE9BQU87SUFDUCxVQUFVO0lBQ1YsU0FBUztJQUNULFVBQVU7SUFDVixNQUFNO0lBQ04sTUFBTTtJQUNOLFVBQVU7SUFDVixVQUFVO0lBQ1YsU0FBUztJQUNULE1BQU07SUFDTixRQUFRO0lBQ1IsU0FBUztJQUNULE9BQU87SUFDUCxRQUFRO0lBQ1IsV0FBVztJQUNYLE9BQU87SUFDUCxPQUFPO0lBQ1AsU0FBUztJQUNULFFBQVE7SUFDUixPQUFPO0lBQ1AsT0FBTztJQUNQLFVBQVU7SUFDVixTQUFTO0lBQ1QsVUFBVTtJQUNWLFVBQVU7SUFDVixNQUFNO0lBQ04sUUFBUTtJQUNSLFNBQVM7SUFDVCxRQUFRO0lBQ1IsUUFBUTtJQUNSLFNBQVM7SUFDVCxTQUFTO0lBQ1QsV0FBVztJQUNYLE1BQU07SUFDTixRQUFRO0lBQ1IsUUFBUTtJQUNSLE9BQU87SUFDUCxNQUFNO0lBQ04sS0FBSztJQUNMLFNBQVM7SUFDVCxNQUFNO0lBQ04sU0FBUztJQUNULFFBQVE7SUFDUixTQUFTO0lBQ1QsVUFBVTtJQUNWLE9BQU87SUFDUCxVQUFVO0lBQ1YsVUFBVTtJQUNWLFVBQVU7SUFDVixPQUFPO0lBQ1AsU0FBUztJQUNULFFBQVE7SUFDUixRQUFRO0lBQ1IsT0FBTztJQUNQLE1BQU07SUFDTixXQUFXO0lBQ1gsV0FBVztJQUNYLE1BQU07SUFDTixXQUFXO0lBQ1gsUUFBUTtJQUNSLE9BQU87SUFDUCxRQUFRO0lBQ1IsU0FBUztJQUNULFVBQVU7SUFDVixTQUFTO0lBQ1QsT0FBTztJQUNQLE9BQU87SUFDUCxPQUFPO0lBQ1AsUUFBUTtJQUNSLFNBQVM7SUFDVCxVQUFVO0lBQ1YsV0FBVztJQUNYLE1BQU07SUFDTixXQUFXO0lBQ1gsVUFBVTtJQUNWLFFBQVE7SUFDUixPQUFPO0lBQ1AsTUFBTTtJQUNOLFFBQVE7SUFDUixVQUFVO0lBQ1YsUUFBUTtJQUNSLFFBQVE7SUFDUixVQUFVO0lBQ1YsUUFBUTtJQUNSLFVBQVU7SUFDVixXQUFXO0lBQ1gsV0FBVztJQUNYLFFBQVE7SUFDUixRQUFRO0lBQ1IsT0FBTztJQUNQLFFBQVE7SUFDUixTQUFTO0lBQ1QsTUFBTTtJQUNOLFFBQVE7SUFDUixRQUFRO0lBQ1IsVUFBVTtJQUNWLFdBQVc7SUFDWCxTQUFTO0lBQ1QsVUFBVTtJQUNWLFFBQVE7SUFDUixRQUFRO0lBQ1IsVUFBVTtJQUNWLFNBQVM7SUFDVCxTQUFTO0lBQ1QsT0FBTztJQUNQLE9BQU87SUFDUCxPQUFPO0lBQ1AsT0FBTztJQUNQLFNBQVM7SUFDVCxTQUFTO0lBQ1QsUUFBUTtJQUNSLFdBQVc7SUFDWCxNQUFNO0lBQ04sT0FBTztJQUNQLE9BQU87SUFDUCxTQUFTO0lBQ1QsU0FBUztJQUNULFdBQVc7SUFDWCxTQUFTO0lBQ1QsU0FBUztJQUNULFdBQVc7SUFDWCxXQUFXO0lBQ1gsU0FBUztJQUNULFNBQVM7SUFDVCxXQUFXO0lBQ1gsV0FBVztJQUNYLFdBQVc7SUFDWCxTQUFTO0lBQ1QsVUFBVTtJQUNWLFFBQVE7SUFDUixRQUFRO0lBQ1IsV0FBVztJQUNYLFFBQVE7SUFDUixRQUFRO0lBQ1IsVUFBVTtJQUNWLE9BQU87SUFDUCxPQUFPO0lBQ1AsU0FBUztJQUNULFVBQVU7SUFDVixXQUFXO0lBQ1gsUUFBUTtJQUNSLFVBQVU7SUFDVixVQUFVO0lBQ1YsUUFBUTtJQUNSLFVBQVU7SUFDVixPQUFPO0lBQ1AsT0FBTztJQUNQLFVBQVU7SUFDVixPQUFPO0lBQ1AsV0FBVztJQUNYLFFBQVE7SUFDUixVQUFVO0lBQ1YsUUFBUTtJQUNSLFdBQVc7SUFDWCxRQUFRO0lBQ1IsUUFBUTtJQUNSLFFBQVE7SUFDUixVQUFVO0lBQ1YsVUFBVTtJQUNWLFdBQVc7SUFDWCxXQUFXO0lBQ1gsVUFBVTtJQUNWLFVBQVU7SUFDVixTQUFTO0lBQ1QsT0FBTztJQUNQLFFBQVE7SUFDUixTQUFTO0lBQ1QsUUFBUTtJQUNSLFFBQVE7SUFDUixTQUFTO0lBQ1QsU0FBUztJQUNULE9BQU87SUFDUCxNQUFNO0lBQ04sT0FBTztJQUNQLFdBQVc7SUFDWCxRQUFRO0lBQ1IsTUFBTTtJQUNOLFNBQVM7SUFDVCxXQUFXO0lBQ1gsV0FBVztJQUNYLFVBQVU7SUFDVixVQUFVO0lBQ1YsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0lBQ1QsVUFBVTtJQUNWLFVBQVU7SUFDVixVQUFVO0lBQ1YsT0FBTztJQUNQLE9BQU87SUFDUCxRQUFRO0lBQ1IsUUFBUTtJQUNSLFFBQVE7SUFDUixTQUFTO0lBQ1QsV0FBVztJQUNYLFVBQVU7SUFDVixPQUFPO0lBQ1AsTUFBTTtJQUNOLFFBQVE7SUFDUixNQUFNO0lBQ04sUUFBUTtJQUNSLFNBQVM7SUFDVCxNQUFNO0lBQ04sVUFBVTtJQUNWLE1BQU07SUFDTixRQUFRO0lBQ1IsU0FBUztJQUNULFFBQVE7SUFDUixXQUFXO0lBQ1gsT0FBTztJQUNQLFNBQVM7SUFDVCxPQUFPO0lBQ1AsUUFBUTtJQUNSLE9BQU87SUFDUCxRQUFRO0lBQ1IsUUFBUTtJQUNSLE9BQU87SUFDUCxPQUFPO0lBQ1AsVUFBVTtJQUNWLFNBQVM7SUFDVCxNQUFNO0lBQ04sU0FBUztJQUNULE1BQU07SUFDTixVQUFVO0lBQ1YsVUFBVTtJQUNWLFNBQVM7SUFDVCxXQUFXO0lBQ1gsVUFBVTtJQUNWLFNBQVM7SUFDVCxXQUFXO0lBQ1gsTUFBTTtJQUNOLFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULFdBQVc7SUFDWCxPQUFPO0lBQ1AsUUFBUTtJQUNSLFVBQVU7SUFDVixRQUFRO0lBQ1IsVUFBVTtJQUNWLFNBQVM7SUFDVCxVQUFVO0lBQ1YsUUFBUTtJQUNSLE9BQU87SUFDUCxRQUFRO0lBQ1IsUUFBUTtJQUNSLFNBQVM7SUFDVCxRQUFRO0lBQ1IsT0FBTztJQUNQLE1BQU07SUFDTixRQUFRO0lBQ1IsVUFBVTtJQUNWLFVBQVU7SUFDVixRQUFRO0lBQ1IsU0FBUztJQUNULFFBQVE7SUFDUixRQUFRO0lBQ1IsUUFBUTtJQUNSLE9BQU87SUFDUCxXQUFXO0lBQ1gsUUFBUTtJQUNSLFNBQVM7SUFDVCxRQUFRO0lBQ1IsU0FBUztJQUNULFNBQVM7SUFDVCxVQUFVO0lBQ1YsTUFBTTtJQUNOLFdBQVc7SUFDWCxTQUFTO0lBQ1QsU0FBUztJQUNULFFBQVE7SUFDUixXQUFXO0lBQ1gsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0lBQ1QsV0FBVztJQUNYLFNBQVM7SUFDVCxXQUFXO0lBQ1gsU0FBUztJQUNULFNBQVM7SUFDVCxPQUFPO0lBQ1AsU0FBUztJQUNULFFBQVE7SUFDUixXQUFXO0lBQ1gsUUFBUTtJQUNSLFNBQVM7SUFDVCxVQUFVO0lBQ1YsVUFBVTtJQUNWLFdBQVc7SUFDWCxXQUFXO0lBQ1gsV0FBVztJQUNYLFVBQVU7SUFDVixRQUFRO0lBQ1IsV0FBVztJQUNYLE9BQU87SUFDUCxRQUFRO0lBQ1IsU0FBUztJQUNULFNBQVM7SUFDVCxVQUFVO0lBQ1YsU0FBUztJQUNULFdBQVc7SUFDWCxVQUFVO0lBQ1YsV0FBVztJQUNYLE9BQU87SUFDUCxXQUFXO0lBQ1gsV0FBVztJQUNYLFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULFFBQVE7SUFDUixXQUFXO0lBQ1gsT0FBTztJQUNQLFFBQVE7SUFDUixVQUFVO0lBQ1YsUUFBUTtJQUNSLFNBQVM7SUFDVCxXQUFXO0lBQ1gsV0FBVztJQUNYLE9BQU87SUFDUCxTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFDVCxNQUFNO0lBQ04sTUFBTTtJQUNOLFFBQVE7SUFDUixRQUFRO0lBQ1IsUUFBUTtJQUNSLFVBQVU7SUFDVixVQUFVO0lBQ1YsVUFBVTtJQUNWLFVBQVU7SUFDVixTQUFTO0lBQ1QsVUFBVTtJQUNWLFVBQVU7SUFDVixVQUFVO0lBQ1YsVUFBVTtJQUNWLFdBQVc7SUFDWCxTQUFTO0lBQ1QsV0FBVztJQUNYLFNBQVM7SUFDVCxVQUFVO0lBQ1YsUUFBUTtJQUNSLFNBQVM7SUFDVCxVQUFVO0lBQ1YsVUFBVTtJQUNWLFNBQVM7SUFDVCxXQUFXO0lBQ1gsVUFBVTtJQUNWLFNBQVM7SUFDVCxRQUFRO0lBQ1IsUUFBUTtJQUNSLFFBQVE7SUFDUixTQUFTO0lBQ1QsV0FBVztJQUNYLFFBQVE7SUFDUixPQUFPO0lBQ1AsU0FBUztJQUNULFdBQVc7SUFDWCxRQUFRO0lBQ1IsUUFBUTtJQUNSLFdBQVc7SUFDWCxPQUFPO0lBQ1AsU0FBUztJQUNULFdBQVc7SUFDWCxTQUFTO0lBQ1QsVUFBVTtJQUNWLFVBQVU7SUFDVixTQUFTO0lBQ1QsUUFBUTtJQUNSLFFBQVE7SUFDUixPQUFPO0lBQ1AsUUFBUTtJQUNSLFdBQVc7SUFDWCxVQUFVO0lBQ1YsVUFBVTtJQUNWLFFBQVE7SUFDUixRQUFRO0lBQ1IsUUFBUTtJQUNSLFVBQVU7SUFDVixVQUFVO0lBQ1YsV0FBVztJQUNYLFdBQVc7SUFDWCxXQUFXO0lBQ1gsU0FBUztJQUNULFVBQVU7SUFDVixVQUFVO0lBQ1YsT0FBTztJQUNQLFVBQVU7SUFDVixPQUFPO0lBQ1AsT0FBTztJQUNQLFNBQVM7SUFDVCxXQUFXO0lBQ1gsU0FBUztJQUNULFdBQVc7SUFDWCxVQUFVO0lBQ1YsUUFBUTtJQUNSLFFBQVE7SUFDUixTQUFTO0lBQ1QsT0FBTztJQUNQLE9BQU87SUFDUCxXQUFXO0lBQ1gsVUFBVTtJQUNWLFNBQVM7SUFDVCxPQUFPO0lBQ1AsU0FBUztJQUNULFdBQVc7SUFDWCxXQUFXO0lBQ1gsVUFBVTtJQUNWLFNBQVM7SUFDVCxVQUFVO0lBQ1YsU0FBUztJQUNULFNBQVM7SUFDVCxPQUFPO0lBQ1AsU0FBUztJQUNULFNBQVM7SUFDVCxVQUFVO0lBQ1YsT0FBTztJQUNQLFNBQVM7SUFDVCxRQUFRO0lBQ1IsVUFBVTtJQUNWLFVBQVU7SUFDVixVQUFVO0lBQ1YsU0FBUztJQUNULFVBQVU7SUFDVixRQUFRO0lBQ1IsVUFBVTtJQUNWLFNBQVM7SUFDVCxPQUFPO0lBQ1AsT0FBTztJQUNQLFFBQVE7SUFDUixRQUFRO0lBQ1IsTUFBTTtJQUNOLFdBQVc7SUFDWCxTQUFTO0lBQ1QsT0FBTztJQUNQLFdBQVc7SUFDWCxRQUFRO0lBQ1IsT0FBTztJQUNQLE9BQU87SUFDUCxTQUFTO0lBQ1QsT0FBTztJQUNQLFVBQVU7SUFDVixRQUFRO0lBQ1IsU0FBUztJQUNULE9BQU87SUFDUCxPQUFPO0lBQ1AsV0FBVztJQUNYLFdBQVc7SUFDWCxXQUFXO0lBQ1gsVUFBVTtJQUNWLFdBQVc7SUFDWCxXQUFXO0lBQ1gsT0FBTztJQUNQLE9BQU87SUFDUCxPQUFPO0lBQ1AsTUFBTTtJQUNOLFVBQVU7SUFDVixRQUFRO0lBQ1IsVUFBVTtJQUNWLFVBQVU7SUFDVixPQUFPO0lBQ1AsVUFBVTtJQUNWLFVBQVU7SUFDVixRQUFRO0lBQ1IsV0FBVztJQUNYLFNBQVM7SUFDVCxPQUFPO0lBQ1AsU0FBUztJQUNULFVBQVU7SUFDVixRQUFRO0lBQ1IsTUFBTTtJQUNOLFFBQVE7SUFDUixTQUFTO0lBQ1QsVUFBVTtJQUNWLFFBQVE7SUFDUixRQUFRO0lBQ1IsT0FBTztJQUNQLE1BQU07SUFDTixRQUFRO0lBQ1IsT0FBTztJQUNQLE9BQU87SUFDUCxPQUFPO0lBQ1AsT0FBTztJQUNQLE9BQU87SUFDUCxVQUFVO0lBQ1YsT0FBTztJQUNQLFFBQVE7SUFDUixVQUFVO0lBQ1YsUUFBUTtJQUNSLFVBQVU7SUFDVixVQUFVO0lBQ1YsV0FBVztJQUNYLFFBQVE7SUFDUixTQUFTO0lBQ1QsU0FBUztJQUNULFVBQVU7SUFDVixTQUFTO0lBQ1QsUUFBUTtJQUNSLFFBQVE7SUFDUixNQUFNO0lBQ04sT0FBTztJQUNQLE9BQU87SUFDUCxNQUFNO0lBQ04sT0FBTztJQUNQLFVBQVU7SUFDVixRQUFRO0lBQ1IsUUFBUTtJQUNSLE9BQU87SUFDUCxXQUFXO0lBQ1gsT0FBTztJQUNQLFVBQVU7SUFDVixTQUFTO0lBQ1QsU0FBUztJQUNULFVBQVU7SUFDVixTQUFTO0lBQ1QsVUFBVTtJQUNWLFNBQVM7SUFDVCxPQUFPO0lBQ1AsT0FBTztJQUNQLE9BQU87SUFDUCxTQUFTO0lBQ1QsUUFBUTtJQUNSLFVBQVU7SUFDVixNQUFNO0lBQ04sTUFBTTtJQUNOLE9BQU87SUFDUCxPQUFPO0lBQ1AsT0FBTztJQUNQLFNBQVM7SUFDVCxPQUFPO0lBQ1AsUUFBUTtJQUNSLFdBQVc7SUFDWCxVQUFVO0lBQ1YsT0FBTztJQUNQLFFBQVE7SUFDUixTQUFTO0lBQ1QsUUFBUTtJQUNSLFNBQVM7SUFDVCxVQUFVO0lBQ1YsT0FBTztJQUNQLFFBQVE7SUFDUixVQUFVO0lBQ1YsTUFBTTtJQUNOLFFBQVE7SUFDUixPQUFPO0lBQ1AsU0FBUztJQUNULE9BQU87SUFDUCxPQUFPO0lBQ1AsU0FBUztJQUNULFVBQVU7SUFDVixTQUFTO0lBQ1QsU0FBUztJQUNULFVBQVU7SUFDVixPQUFPO0lBQ1AsUUFBUTtJQUNSLFNBQVM7SUFDVCxVQUFVO0lBQ1YsV0FBVztJQUNYLE9BQU87SUFDUCxVQUFVO0lBQ1YsUUFBUTtJQUNSLFFBQVE7SUFDUixXQUFXO0lBQ1gsUUFBUTtJQUNSLFNBQVM7SUFDVCxPQUFPO0lBQ1AsV0FBVztJQUNYLFNBQVM7SUFDVCxTQUFTO0lBQ1QsVUFBVTtJQUNWLFdBQVc7SUFDWCxXQUFXO0lBQ1gsTUFBTTtJQUNOLFVBQVU7SUFDVixRQUFRO0lBQ1IsU0FBUztJQUNULFFBQVE7SUFDUixPQUFPO0lBQ1AsU0FBUztJQUNULEtBQUs7SUFDTCxVQUFVO0lBQ1YsUUFBUTtJQUNSLFNBQVM7SUFDVCxRQUFRO0lBQ1IsV0FBVztJQUNYLFdBQVc7SUFDWCxXQUFXO0lBQ1gsVUFBVTtJQUNWLFdBQVc7SUFDWCxVQUFVO0lBQ1YsVUFBVTtJQUNWLE1BQU07SUFDTixNQUFNO0lBQ04sTUFBTTtJQUNOLE1BQU07SUFDTixVQUFVO0lBQ1YsVUFBVTtJQUNWLFNBQVM7SUFDVCxVQUFVO0lBQ1YsUUFBUTtJQUNSLFdBQVc7SUFDWCxXQUFXO0lBQ1gsU0FBUztJQUNULFFBQVE7SUFDUixXQUFXO0lBQ1gsVUFBVTtJQUNWLFVBQVU7SUFDVixVQUFVO0lBQ1YsUUFBUTtJQUNSLFVBQVU7SUFDVixNQUFNO0lBQ04sTUFBTTtJQUNOLE1BQU07SUFDTixTQUFTO0lBQ1QsT0FBTztJQUNQLE9BQU87SUFDUCxRQUFRO0lBQ1IsT0FBTztJQUNQLFVBQVU7SUFDVixTQUFTO0lBQ1QsU0FBUztJQUNULFVBQVU7SUFDVixTQUFTO0lBQ1QsV0FBVztJQUNYLFdBQVc7SUFDWCxRQUFRO0lBQ1IsV0FBVztJQUNYLFNBQVM7SUFDVCxXQUFXO0lBQ1gsV0FBVztJQUNYLFdBQVc7SUFDWCxXQUFXO0lBQ1gsV0FBVztJQUNYLFdBQVc7SUFDWCxTQUFTO0lBQ1QsU0FBUztJQUNULFFBQVE7SUFDUixTQUFTO0lBQ1QsUUFBUTtJQUNSLFdBQVc7SUFDWCxVQUFVO0lBQ1YsVUFBVTtJQUNWLFdBQVc7SUFDWCxTQUFTO0lBQ1QsV0FBVztJQUNYLFVBQVU7SUFDVixVQUFVO0lBQ1YsV0FBVztJQUNYLFVBQVU7SUFDVixXQUFXO0lBQ1gsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0lBQ1QsVUFBVTtJQUNWLFNBQVM7SUFDVCxXQUFXO0lBQ1gsU0FBUztJQUNULE9BQU87SUFDUCxXQUFXO0lBQ1gsU0FBUztJQUNULFVBQVU7SUFDVixVQUFVO0lBQ1YsUUFBUTtJQUNSLFVBQVU7SUFDVixXQUFXO0lBQ1gsV0FBVztJQUNYLFNBQVM7SUFDVCxXQUFXO0lBQ1gsV0FBVztJQUNYLFNBQVM7SUFDVCxNQUFNO0lBQ04sU0FBUztJQUNULFVBQVU7SUFDVixXQUFXO0lBQ1gsV0FBVztJQUNYLFVBQVU7SUFDVixXQUFXO0lBQ1gsV0FBVztJQUNYLFVBQVU7SUFDVixXQUFXO0lBQ1gsU0FBUztJQUNULFVBQVU7SUFDVixTQUFTO0lBQ1QsVUFBVTtJQUNWLFVBQVU7SUFDVixVQUFVO0lBQ1YsV0FBVztJQUNYLFdBQVc7SUFDWCxXQUFXO0lBQ1gsV0FBVztJQUNYLFVBQVU7SUFDVixVQUFVO0lBQ1YsU0FBUztJQUNULFdBQVc7SUFDWCxTQUFTO0lBQ1QsVUFBVTtJQUNWLFdBQVc7SUFDWCxXQUFXO0lBQ1gsV0FBVztJQUNYLFNBQVM7SUFDVCxTQUFTO0lBQ1QsV0FBVztJQUNYLFdBQVc7SUFDWCxXQUFXO0lBQ1gsVUFBVTtJQUNWLFdBQVc7SUFDWCxXQUFXO0lBQ1gsV0FBVztJQUNYLFNBQVM7SUFDVCxVQUFVO0lBQ1YsV0FBVztJQUNYLFNBQVM7SUFDVCxXQUFXO0lBQ1gsVUFBVTtJQUNWLFNBQVM7SUFDVCxXQUFXO0lBQ1gsV0FBVztJQUNYLFVBQVU7SUFDVixTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0lBQ1QsVUFBVTtJQUNWLFNBQVM7SUFDVCxXQUFXO0lBQ1gsU0FBUztJQUNULFNBQVM7SUFDVCxXQUFXO0lBQ1gsTUFBTTtJQUNOLFFBQVE7SUFDUixRQUFRO0lBQ1IsU0FBUztJQUNULFFBQVE7SUFDUixTQUFTO0lBQ1QsUUFBUTtJQUNSLE1BQU07SUFDTixPQUFPO0lBQ1AsTUFBTTtJQUNOLFVBQVU7SUFDVixXQUFXO0lBQ1gsU0FBUztJQUNULFFBQVE7SUFDUixRQUFRO0lBQ1IsUUFBUTtJQUNSLFdBQVc7SUFDWCxXQUFXO0lBQ1gsVUFBVTtJQUNWLFVBQVU7SUFDVixXQUFXO0lBQ1gsT0FBTztJQUNQLFVBQVU7SUFDVixTQUFTO0lBQ1QsVUFBVTtJQUNWLFdBQVc7SUFDWCxRQUFRO0lBQ1IsU0FBUztJQUNULFVBQVU7SUFDVixTQUFTO0lBQ1QsV0FBVztJQUNYLFdBQVc7SUFDWCxTQUFTO0lBQ1QsUUFBUTtJQUNSLFFBQVE7SUFDUixVQUFVO0lBQ1YsV0FBVztJQUNYLFFBQVE7SUFDUixRQUFRO0lBQ1IsV0FBVztJQUNYLE1BQU07SUFDTixTQUFTO0lBQ1QsUUFBUTtJQUNSLE9BQU87SUFDUCxPQUFPO0lBQ1AsT0FBTztJQUNQLFdBQVc7SUFDWCxXQUFXO0lBQ1gsVUFBVTtJQUNWLFdBQVc7SUFDWCxTQUFTO0lBQ1QsUUFBUTtJQUNSLFNBQVM7SUFDVCxVQUFVO0lBQ1YsT0FBTztJQUNQLFNBQVM7SUFDVCxVQUFVO0lBQ1YsU0FBUztJQUNULFFBQVE7SUFDUixVQUFVO0lBQ1YsTUFBTTtJQUNOLFVBQVU7SUFDVixXQUFXO0lBQ1gsVUFBVTtJQUNWLFVBQVU7SUFDVixRQUFRO0lBQ1IsVUFBVTtJQUNWLFNBQVM7SUFDVCxVQUFVO0lBQ1YsV0FBVztJQUNYLFdBQVc7SUFDWCxRQUFRO0lBQ1IsT0FBTztJQUNQLFdBQVc7SUFDWCxPQUFPO0lBQ1AsU0FBUztJQUNULFNBQVM7SUFDVCxPQUFPO0lBQ1AsT0FBTztJQUNQLE9BQU87SUFDUCxTQUFTO0lBQ1QsVUFBVTtJQUNWLFVBQVU7SUFDVixVQUFVO0lBQ1YsVUFBVTtJQUNWLFFBQVE7SUFDUixRQUFRO0lBQ1IsU0FBUztJQUNULFdBQVc7SUFDWCxPQUFPO0lBQ1AsU0FBUztJQUNULFNBQVM7SUFDVCxXQUFXO0lBQ1gsUUFBUTtJQUNSLFVBQVU7SUFDVixXQUFXO0lBQ1gsUUFBUTtJQUNSLFVBQVU7SUFDVixVQUFVO0lBQ1YsVUFBVTtJQUNWLFVBQVU7SUFDVixVQUFVO0lBQ1YsUUFBUTtJQUNSLE9BQU87SUFDUCxPQUFPO0lBQ1AsUUFBUTtJQUNSLE9BQU87SUFDUCxPQUFPO0lBQ1AsVUFBVTtJQUNWLFNBQVM7SUFDVCxVQUFVO0lBQ1YsV0FBVztJQUNYLFNBQVM7SUFDVCxVQUFVO0lBQ1YsU0FBUztJQUNULFVBQVU7SUFDVixNQUFNO0lBQ04sU0FBUztJQUNULE9BQU87SUFDUCxPQUFPO0lBQ1AsT0FBTztJQUNQLFNBQVM7SUFDVCxRQUFRO0lBQ1IsVUFBVTtJQUNWLFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULFVBQVU7SUFDVixTQUFTO0lBQ1QsV0FBVztJQUNYLFFBQVE7SUFDUixVQUFVO0lBQ1YsU0FBUztJQUNULE9BQU87SUFDUCxPQUFPO0lBQ1AsT0FBTztJQUNQLE9BQU87SUFDUCxNQUFNO0lBQ04sT0FBTztJQUNQLFFBQVE7SUFDUixTQUFTO0lBQ1QsU0FBUztJQUNULE9BQU87SUFDUCxPQUFPO0lBQ1AsU0FBUztJQUNULFNBQVM7SUFDVCxXQUFXO0lBQ1gsU0FBUztJQUNULFdBQVc7SUFDWCxTQUFTO0lBQ1QsT0FBTztJQUNQLFdBQVc7SUFDWCxRQUFRO0lBQ1IsU0FBUztJQUNULFVBQVU7SUFDVixVQUFVO0lBQ1YsV0FBVztJQUNYLFNBQVM7SUFDVCxVQUFVO0lBQ1YsV0FBVztJQUNYLFNBQVM7SUFDVCxTQUFTO0lBQ1QsVUFBVTtJQUNWLE9BQU87SUFDUCxNQUFNO0lBQ04sUUFBUTtJQUNSLFNBQVM7SUFDVCxTQUFTO0lBQ1QsV0FBVztJQUNYLE1BQU07SUFDTixTQUFTO0lBQ1QsU0FBUztJQUNULFVBQVU7SUFDVixRQUFRO0lBQ1IsUUFBUTtJQUNSLFVBQVU7SUFDVixVQUFVO0lBQ1YsV0FBVztJQUNYLFVBQVU7SUFDVixTQUFTO0lBQ1QsV0FBVztJQUNYLFVBQVU7SUFDVixTQUFTO0lBQ1QsV0FBVztJQUNYLFNBQVM7SUFDVCxPQUFPO0lBQ1AsUUFBUTtJQUNSLFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULFFBQVE7SUFDUixNQUFNO0lBQ04sUUFBUTtJQUNSLFFBQVE7SUFDUixRQUFRO0lBQ1IsUUFBUTtJQUNSLFdBQVc7SUFDWCxTQUFTO0lBQ1QsT0FBTztJQUNQLE9BQU87SUFDUCxPQUFPO0lBQ1AsU0FBUztJQUNULFFBQVE7SUFDUixTQUFTO0lBQ1QsUUFBUTtJQUNSLFFBQVE7SUFDUixXQUFXO0lBQ1gsT0FBTztJQUNQLE9BQU87SUFDUCxPQUFPO0lBQ1AsTUFBTTtJQUNOLFFBQVE7SUFDUixTQUFTO0lBQ1QsV0FBVztJQUNYLFNBQVM7SUFDVCxXQUFXO0lBQ1gsVUFBVTtJQUNWLFdBQVc7SUFDWCxTQUFTO0lBQ1QsS0FBSztJQUNMLE9BQU87SUFDUCxRQUFRO0lBQ1IsU0FBUztJQUNULFNBQVM7SUFDVCxVQUFVO0lBQ1YsUUFBUTtJQUNSLFdBQVc7SUFDWCxXQUFXO0lBQ1gsS0FBSztJQUNMLEtBQUs7SUFDTCxVQUFVO0lBQ1YsUUFBUTtJQUNSLE9BQU87SUFDUCxVQUFVO0lBQ1YsUUFBUTtJQUNSLE9BQU87SUFDUCxPQUFPO0lBQ1AsVUFBVTtJQUNWLE9BQU87SUFDUCxTQUFTO0lBQ1QsV0FBVztJQUNYLFFBQVE7SUFDUixVQUFVO0lBQ1YsT0FBTztJQUNQLFFBQVE7SUFDUixRQUFRO0lBQ1IsVUFBVTtJQUNWLFdBQVc7SUFDWCxPQUFPO0lBQ1AsVUFBVTtJQUNWLFVBQVU7SUFDVixXQUFXO0lBQ1gsU0FBUztJQUNULFVBQVU7SUFDVixVQUFVO0lBQ1YsU0FBUztJQUNULE1BQU07SUFDTixNQUFNO0lBQ04sV0FBVztJQUNYLE1BQU07SUFDTixXQUFXO0lBQ1gsTUFBTTtJQUNOLFVBQVU7SUFDVixRQUFRO0lBQ1IsVUFBVTtJQUNWLFVBQVU7SUFDVixTQUFTO0lBQ1QsTUFBTTtJQUNOLFFBQVE7SUFDUixVQUFVO0lBQ1YsU0FBUztJQUNULFVBQVU7SUFDVixVQUFVO0lBQ1YsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULFVBQVU7SUFDVixRQUFRO0lBQ1IsV0FBVztJQUNYLFVBQVU7SUFDVixRQUFRO0lBQ1IsU0FBUztJQUNULFdBQVc7SUFDWCxPQUFPO0lBQ1AsTUFBTTtJQUNOLFdBQVc7SUFDWCxRQUFRO0lBQ1IsVUFBVTtJQUNWLE9BQU87SUFDUCxTQUFTO0lBQ1QsVUFBVTtJQUNWLFFBQVE7SUFDUixPQUFPO0lBQ1AsUUFBUTtJQUNSLFFBQVE7SUFDUixPQUFPO0lBQ1AsT0FBTztJQUNQLFdBQVc7SUFDWCxPQUFPO0lBQ1AsVUFBVTtJQUNWLFFBQVE7SUFDUixVQUFVO0lBQ1YsV0FBVztJQUNYLFVBQVU7SUFDVixTQUFTO0lBQ1QsUUFBUTtJQUNSLFdBQVc7SUFDWCxXQUFXO0lBQ1gsU0FBUztJQUNULFdBQVc7SUFDWCxTQUFTO0lBQ1QsV0FBVztJQUNYLFVBQVU7SUFDVixNQUFNO0lBQ04sVUFBVTtJQUNWLFNBQVM7SUFDVCxRQUFRO0lBQ1IsV0FBVztJQUNYLFdBQVc7SUFDWCxXQUFXO0lBQ1gsT0FBTztJQUNQLFVBQVU7SUFDVixRQUFRO0lBQ1IsVUFBVTtJQUNWLFdBQVc7SUFDWCxRQUFRO0lBQ1IsUUFBUTtJQUNSLE1BQU07SUFDTixNQUFNO0lBQ04sUUFBUTtJQUNSLFFBQVE7SUFDUixVQUFVO0lBQ1YsUUFBUTtJQUNSLFVBQVU7SUFDVixRQUFRO0lBQ1IsU0FBUztJQUNULFFBQVE7SUFDUixXQUFXO0lBQ1gsV0FBVztJQUNYLFdBQVc7SUFDWCxVQUFVO0lBQ1YsU0FBUztJQUNULFdBQVc7SUFDWCxVQUFVO0lBQ1YsVUFBVTtJQUNWLFVBQVU7SUFDVixTQUFTO0lBQ1QsUUFBUTtJQUNSLFVBQVU7SUFDVixRQUFRO0lBQ1IsVUFBVTtJQUNWLFNBQVM7SUFDVCxXQUFXO0lBQ1gsVUFBVTtJQUNWLFdBQVc7SUFDWCxXQUFXO0lBQ1gsT0FBTztJQUNQLFVBQVU7SUFDVixTQUFTO0lBQ1QsU0FBUztJQUNULFFBQVE7SUFDUixRQUFRO0lBQ1IsTUFBTTtJQUNOLFVBQVU7SUFDVixXQUFXO0lBQ1gsVUFBVTtJQUNWLFFBQVE7SUFDUixXQUFXO0lBQ1gsT0FBTztJQUNQLFVBQVU7SUFDVixPQUFPO0lBQ1AsVUFBVTtJQUNWLFdBQVc7SUFDWCxRQUFRO0lBQ1IsVUFBVTtJQUNWLFVBQVU7SUFDVixVQUFVO0lBQ1YsV0FBVztJQUNYLFdBQVc7SUFDWCxXQUFXO0lBQ1gsVUFBVTtJQUNWLFdBQVc7SUFDWCxVQUFVO0lBQ1YsU0FBUztJQUNULE9BQU87SUFDUCxRQUFRO0lBQ1IsVUFBVTtJQUNWLFFBQVE7SUFDUixXQUFXO0lBQ1gsV0FBVztJQUNYLFVBQVU7SUFDVixRQUFRO0lBQ1IsV0FBVztJQUNYLFVBQVU7SUFDVixRQUFRO0lBQ1IsVUFBVTtJQUNWLFdBQVc7SUFDWCxXQUFXO0lBQ1gsVUFBVTtJQUNWLFFBQVE7SUFDUixPQUFPO0lBQ1AsUUFBUTtJQUNSLE9BQU87SUFDUCxTQUFTO0lBQ1QsUUFBUTtJQUNSLFNBQVM7SUFDVCxTQUFTO0lBQ1QsTUFBTTtJQUNOLFdBQVc7SUFDWCxXQUFXO0lBQ1gsVUFBVTtJQUNWLFdBQVc7SUFDWCxRQUFRO0lBQ1IsU0FBUztJQUNULFdBQVc7SUFDWCxVQUFVO0lBQ1YsUUFBUTtJQUNSLFFBQVE7SUFDUixRQUFRO0lBQ1IsVUFBVTtJQUNWLFdBQVc7SUFDWCxXQUFXO0lBQ1gsU0FBUztJQUNULFNBQVM7SUFDVCxPQUFPO0lBQ1AsVUFBVTtJQUNWLFFBQVE7SUFDUixRQUFRO0lBQ1IsVUFBVTtJQUNWLE9BQU87SUFDUCxTQUFTO0lBQ1QsV0FBVztJQUNYLFNBQVM7SUFDVCxXQUFXO0lBQ1gsV0FBVztJQUNYLFVBQVU7SUFDVixVQUFVO0lBQ1YsV0FBVztJQUNYLFdBQVc7SUFDWCxTQUFTO0lBQ1QsVUFBVTtJQUNWLFVBQVU7SUFDVixTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0lBQ1QsV0FBVztJQUNYLFVBQVU7SUFDVixVQUFVO0lBQ1YsUUFBUTtJQUNSLFdBQVc7SUFDWCxXQUFXO0lBQ1gsVUFBVTtJQUNWLFdBQVc7SUFDWCxXQUFXO0lBQ1gsUUFBUTtJQUNSLFVBQVU7SUFDVixXQUFXO0lBQ1gsVUFBVTtJQUNWLFNBQVM7SUFDVCxPQUFPO0lBQ1AsU0FBUztJQUNULFVBQVU7SUFDVixTQUFTO0lBQ1QsU0FBUztJQUNULFdBQVc7SUFDWCxVQUFVO0lBQ1YsUUFBUTtJQUNSLFNBQVM7SUFDVCxXQUFXO0lBQ1gsU0FBUztJQUNULFVBQVU7SUFDVixVQUFVO0lBQ1YsV0FBVztJQUNYLFVBQVU7SUFDVixXQUFXO0lBQ1gsV0FBVztJQUNYLFVBQVU7SUFDVixVQUFVO0lBQ1YsVUFBVTtJQUNWLFdBQVc7SUFDWCxXQUFXO0lBQ1gsU0FBUztJQUNULE1BQU07SUFDTixVQUFVO0lBQ1YsUUFBUTtJQUNSLFdBQVc7SUFDWCxPQUFPO0lBQ1AsTUFBTTtJQUNOLFFBQVE7SUFDUixTQUFTO0lBQ1QsV0FBVztJQUNYLFVBQVU7SUFDVixXQUFXO0lBQ1gsVUFBVTtJQUNWLFVBQVU7SUFDVixXQUFXO0lBQ1gsV0FBVztJQUNYLEtBQUs7SUFDTCxVQUFVO0lBQ1YsV0FBVztJQUNYLFVBQVU7SUFDVixNQUFNO0lBQ04sUUFBUTtJQUNSLE1BQU07SUFDTixVQUFVO0lBQ1YsT0FBTztJQUNQLFFBQVE7SUFDUixRQUFRO0lBQ1IsU0FBUztJQUNULFFBQVE7SUFDUixPQUFPO0lBQ1AsU0FBUztJQUNULFFBQVE7SUFDUixXQUFXO0lBQ1gsT0FBTztJQUNQLE9BQU87SUFDUCxRQUFRO0lBQ1IsUUFBUTtJQUNSLFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULFFBQVE7SUFDUixRQUFRO0lBQ1IsU0FBUztJQUNULFVBQVU7SUFDVixXQUFXO0lBQ1gsV0FBVztJQUNYLFVBQVU7SUFDVixXQUFXO0lBQ1gsVUFBVTtJQUNWLFdBQVc7SUFDWCxVQUFVO0lBQ1YsVUFBVTtJQUNWLFVBQVU7SUFDVixRQUFRO0lBQ1IsVUFBVTtJQUNWLFVBQVU7SUFDVixTQUFTO0lBQ1QsV0FBVztJQUNYLFVBQVU7SUFDVixTQUFTO0lBQ1QsU0FBUztJQUNULFdBQVc7SUFDWCxVQUFVO0lBQ1YsVUFBVTtJQUNWLFVBQVU7SUFDVixXQUFXO0lBQ1gsVUFBVTtJQUNWLFNBQVM7SUFDVCxTQUFTO0lBQ1QsV0FBVztJQUNYLFdBQVc7SUFDWCxVQUFVO0lBQ1YsTUFBTTtJQUNOLFdBQVc7SUFDWCxTQUFTO0lBQ1QsTUFBTTtJQUNOLFNBQVM7SUFDVCxXQUFXO0lBQ1gsV0FBVztJQUNYLFVBQVU7SUFDVixVQUFVO0lBQ1YsV0FBVztJQUNYLFFBQVE7SUFDUixTQUFTO0lBQ1QsVUFBVTtJQUNWLFNBQVM7SUFDVCxVQUFVO0lBQ1YsUUFBUTtJQUNSLFdBQVc7SUFDWCxXQUFXO0lBQ1gsVUFBVTtJQUNWLFVBQVU7SUFDVixXQUFXO0lBQ1gsV0FBVztJQUNYLFdBQVc7SUFDWCxVQUFVO0lBQ1YsU0FBUztJQUNULFdBQVc7SUFDWCxVQUFVO0lBQ1YsU0FBUztJQUNULFVBQVU7SUFDVixTQUFTO0lBQ1QsV0FBVztJQUNYLFNBQVM7SUFDVCxVQUFVO0lBQ1YsVUFBVTtJQUNWLFNBQVM7SUFDVCxVQUFVO0lBQ1YsU0FBUztJQUNULFVBQVU7SUFDVixTQUFTO0lBQ1QsVUFBVTtJQUNWLFVBQVU7SUFDVixVQUFVO0lBQ1YsVUFBVTtJQUNWLE9BQU87SUFDUCxPQUFPO0lBQ1AsT0FBTztJQUNQLFdBQVc7SUFDWCxTQUFTO0lBQ1QsVUFBVTtJQUNWLFVBQVU7SUFDVixVQUFVO0lBQ1YsVUFBVTtJQUNWLFFBQVE7SUFDUixVQUFVO0lBQ1YsV0FBVztJQUNYLFdBQVc7SUFDWCxVQUFVO0lBQ1YsVUFBVTtJQUNWLFVBQVU7SUFDVixXQUFXO0lBQ1gsT0FBTztJQUNQLFFBQVE7SUFDUixRQUFRO0lBQ1IsTUFBTTtJQUNOLFVBQVU7SUFDVixVQUFVO0lBQ1YsT0FBTztJQUNQLE9BQU87SUFDUCxPQUFPO0lBQ1AsT0FBTztJQUNQLE1BQU07SUFDTixRQUFRO0lBQ1IsV0FBVztJQUNYLFFBQVE7SUFDUixPQUFPO0lBQ1AsU0FBUztJQUNULFFBQVE7SUFDUixVQUFVO0lBQ1YsVUFBVTtJQUNWLFVBQVU7SUFDVixVQUFVO0lBQ1YsU0FBUztJQUNULFVBQVU7SUFDVixTQUFTO0lBQ1QsT0FBTztJQUNQLE9BQU87SUFDUCxRQUFRO0lBQ1IsVUFBVTtJQUNWLFdBQVc7SUFDWCxVQUFVO0lBQ1YsU0FBUztJQUNULFNBQVM7SUFDVCxVQUFVO0lBQ1YsVUFBVTtJQUNWLFVBQVU7SUFDVixVQUFVO0lBQ1YsU0FBUztJQUNULE9BQU87SUFDUCxNQUFNO0lBQ04sV0FBVztJQUNYLFFBQVE7SUFDUixRQUFRO0lBQ1IsTUFBTTtJQUNOLFFBQVE7SUFDUixVQUFVO0lBQ1YsUUFBUTtJQUNSLE1BQU07SUFDTixNQUFNO0lBQ04sT0FBTztJQUNQLE1BQU07SUFDTixNQUFNO0lBQ04sVUFBVTtJQUNWLFdBQVc7SUFDWCxXQUFXO0lBQ1gsVUFBVTtJQUNWLFdBQVc7SUFDWCxVQUFVO0lBQ1YsU0FBUztJQUNULFNBQVM7SUFDVCxXQUFXO0lBQ1gsVUFBVTtJQUNWLFdBQVc7SUFDWCxPQUFPO0lBQ1AsU0FBUztJQUNULFNBQVM7SUFDVCxNQUFNO0lBQ04sU0FBUztJQUNULFVBQVU7SUFDVixXQUFXO0lBQ1gsV0FBVztJQUNYLFVBQVU7SUFDVixXQUFXO0lBQ1gsV0FBVztJQUNYLFdBQVc7SUFDWCxRQUFRO0lBQ1IsUUFBUTtJQUNSLFVBQVU7SUFDVixRQUFRO0lBQ1IsUUFBUTtJQUNSLE9BQU87SUFDUCxNQUFNO0lBQ04sU0FBUztJQUNULE9BQU87SUFDUCxPQUFPO0lBQ1AsT0FBTztJQUNQLFNBQVM7SUFDVCxVQUFVO0lBQ1YsV0FBVztJQUNYLFVBQVU7SUFDVixVQUFVO0lBQ1YsUUFBUTtJQUNSLFVBQVU7SUFDVixRQUFRO0lBQ1IsUUFBUTtJQUNSLFVBQVU7SUFDVixTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFDVCxPQUFPO0lBQ1AsT0FBTztJQUNQLE9BQU87SUFDUCxXQUFXO0lBQ1gsU0FBUztJQUNULFVBQVU7SUFDVixTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFDVCxPQUFPO0lBQ1AsT0FBTztJQUNQLFVBQVU7SUFDVixRQUFRO0lBQ1IsTUFBTTtJQUNOLEtBQUs7SUFDTCxRQUFRO0lBQ1IsV0FBVztJQUNYLFNBQVM7SUFDVCxVQUFVO0lBQ1YsU0FBUztJQUNULFVBQVU7SUFDVixVQUFVO0lBQ1YsT0FBTztJQUNQLE1BQU07SUFDTixNQUFNO0lBQ04sUUFBUTtJQUNSLFFBQVE7SUFDUixLQUFLO0lBQ0wsTUFBTTtJQUNOLFFBQVE7SUFDUixVQUFVO0lBQ1YsTUFBTTtJQUNOLFNBQVM7SUFDVCxVQUFVO0lBQ1YsVUFBVTtJQUNWLEtBQUs7SUFDTCxNQUFNO0lBQ04sUUFBUTtJQUNSLFdBQVc7SUFDWCxXQUFXO0lBQ1gsU0FBUztJQUNULFNBQVM7SUFDVCxVQUFVO0lBQ1YsUUFBUTtJQUNSLFFBQVE7SUFDUixNQUFNO0lBQ04sTUFBTTtJQUNOLFNBQVM7SUFDVCxNQUFNO0lBQ04sT0FBTztJQUNQLE9BQU87SUFDUCxPQUFPO0lBQ1AsU0FBUztJQUNULFNBQVM7SUFDVCxVQUFVO0lBQ1YsU0FBUztJQUNULFdBQVc7SUFDWCxTQUFTO0lBQ1QsVUFBVTtJQUNWLFNBQVM7SUFDVCxVQUFVO0lBQ1YsVUFBVTtJQUNWLE1BQU07SUFDTixPQUFPO0lBQ1AsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0lBQ1QsUUFBUTtJQUNSLFNBQVM7SUFDVCxPQUFPO0lBQ1AsU0FBUztJQUNULFNBQVM7SUFDVCxVQUFVO0lBQ1YsVUFBVTtJQUNWLFVBQVU7SUFDVixTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFDVCxXQUFXO0lBQ1gsV0FBVztJQUNYLFNBQVM7SUFDVCxXQUFXO0lBQ1gsUUFBUTtJQUNSLFFBQVE7SUFDUixTQUFTO0lBQ1QsT0FBTztJQUNQLFNBQVM7SUFDVCxRQUFRO0lBQ1IsVUFBVTtJQUNWLFFBQVE7SUFDUixXQUFXO0lBQ1gsV0FBVztJQUNYLFFBQVE7SUFDUixVQUFVO0lBQ1YsU0FBUztJQUNULE9BQU87SUFDUCxRQUFRO0lBQ1IsUUFBUTtJQUNSLE1BQU07SUFDTixNQUFNO0lBQ04sT0FBTztJQUNQLE9BQU87SUFDUCxPQUFPO0lBQ1AsV0FBVztJQUNYLE1BQU07SUFDTixRQUFRO0lBQ1IsU0FBUztJQUNULFdBQVc7SUFDWCxTQUFTO0lBQ1QsVUFBVTtJQUNWLFdBQVc7SUFDWCxTQUFTO0lBQ1QsV0FBVztJQUNYLFdBQVc7SUFDWCxNQUFNO0lBQ04sVUFBVTtJQUNWLFFBQVE7SUFDUixNQUFNO0lBQ04sU0FBUztJQUNULFFBQVE7SUFDUixVQUFVO0lBQ1YsV0FBVztJQUNYLFVBQVU7SUFDVixLQUFLO0lBQ0wsV0FBVztJQUNYLFNBQVM7SUFDVCxXQUFXO0lBQ1gsUUFBUTtJQUNSLFdBQVc7SUFDWCxRQUFRO0lBQ1IsUUFBUTtJQUNSLFVBQVU7SUFDVixVQUFVO0lBQ1YsV0FBVztJQUNYLFNBQVM7SUFDVCxXQUFXO0lBQ1gsUUFBUTtJQUNSLE9BQU87SUFDUCxXQUFXO0lBQ1gsU0FBUztJQUNULFFBQVE7SUFDUixPQUFPO0lBQ1AsV0FBVztJQUNYLFNBQVM7SUFDVCxRQUFRO0lBQ1IsV0FBVztJQUNYLFVBQVU7SUFDVixVQUFVO0lBQ1YsVUFBVTtJQUNWLFNBQVM7SUFDVCxXQUFXO0lBQ1gsV0FBVztJQUNYLFVBQVU7SUFDVixRQUFRO0lBQ1IsS0FBSztJQUNMLFVBQVU7SUFDVixVQUFVO0lBQ1YsV0FBVztJQUNYLE9BQU87SUFDUCxTQUFTO0lBQ1QsUUFBUTtJQUNSLEtBQUs7SUFDTCxTQUFTO0lBQ1QsVUFBVTtJQUNWLEtBQUs7SUFDTCxXQUFXO0lBQ1gsT0FBTztJQUNQLFdBQVc7SUFDWCxVQUFVO0lBQ1YsV0FBVztJQUNYLE9BQU87SUFDUCxTQUFTO0lBQ1QsT0FBTztJQUNQLE9BQU87SUFDUCxTQUFTO0lBQ1QsUUFBUTtJQUNSLFNBQVM7SUFDVCxXQUFXO0lBQ1gsV0FBVztJQUNYLE9BQU87SUFDUCxVQUFVO0lBQ1YsU0FBUztJQUNULFFBQVE7SUFDUixRQUFRO0lBQ1IsVUFBVTtJQUNWLFFBQVE7SUFDUixXQUFXO0lBQ1gsT0FBTztJQUNQLFNBQVM7SUFDVCxXQUFXO0lBQ1gsVUFBVTtJQUNWLE1BQU07SUFDTixPQUFPO0lBQ1AsVUFBVTtJQUNWLFNBQVM7SUFDVCxVQUFVO0lBQ1YsU0FBUztJQUNULFNBQVM7SUFDVCxVQUFVO0lBQ1YsVUFBVTtJQUNWLFdBQVc7SUFDWCxVQUFVO0lBQ1YsV0FBVztJQUNYLFVBQVU7SUFDVixVQUFVO0lBQ1YsVUFBVTtJQUNWLFVBQVU7SUFDVixTQUFTO0lBQ1QsU0FBUztJQUNULFdBQVc7SUFDWCxPQUFPO0lBQ1AsS0FBSztJQUNMLFFBQVE7SUFDUixXQUFXO0lBQ1gsUUFBUTtJQUNSLFdBQVc7SUFDWCxXQUFXO0lBQ1gsVUFBVTtJQUNWLFNBQVM7SUFDVCxXQUFXO0lBQ1gsUUFBUTtJQUNSLFFBQVE7SUFDUixXQUFXO0lBQ1gsV0FBVztJQUNYLFVBQVU7SUFDVixTQUFTO0lBQ1QsU0FBUztJQUNULFVBQVU7SUFDVixVQUFVO0lBQ1YsV0FBVztJQUNYLE9BQU87SUFDUCxRQUFRO0lBQ1IsU0FBUztJQUNULFNBQVM7SUFDVCxXQUFXO0lBQ1gsV0FBVztJQUNYLFNBQVM7SUFDVCxXQUFXO0lBQ1gsVUFBVTtJQUNWLFdBQVc7SUFDWCxXQUFXO0lBQ1gsVUFBVTtJQUNWLFdBQVc7SUFDWCxVQUFVO0lBQ1YsUUFBUTtJQUNSLFVBQVU7SUFDVixVQUFVO0lBQ1YsU0FBUztJQUNULFVBQVU7SUFDVixRQUFRO0lBQ1IsU0FBUztJQUNULFVBQVU7SUFDVixVQUFVO0lBQ1YsV0FBVztJQUNYLFNBQVM7SUFDVCxRQUFRO0lBQ1IsU0FBUztJQUNULFdBQVc7SUFDWCxXQUFXO0lBQ1gsV0FBVztJQUNYLFNBQVM7SUFDVCxVQUFVO0lBQ1YsV0FBVztJQUNYLFVBQVU7SUFDVixXQUFXO0lBQ1gsV0FBVztJQUNYLFVBQVU7SUFDVixVQUFVO0lBQ1YsUUFBUTtJQUNSLFFBQVE7SUFDUixRQUFRO0lBQ1IsU0FBUztJQUNULFNBQVM7SUFDVCxRQUFRO0lBQ1IsUUFBUTtJQUNSLFdBQVc7SUFDWCxVQUFVO0lBQ1YsV0FBVztJQUNYLFVBQVU7SUFDVixRQUFRO0lBQ1IsU0FBUztJQUNULFFBQVE7SUFDUixRQUFRO0lBQ1IsV0FBVztJQUNYLFFBQVE7SUFDUixRQUFRO0lBQ1IsVUFBVTtJQUNWLFNBQVM7SUFDVCxVQUFVO0lBQ1YsU0FBUztJQUNULFdBQVc7SUFDWCxVQUFVO0lBQ1YsVUFBVTtJQUNWLFVBQVU7SUFDVixTQUFTO0lBQ1QsVUFBVTtJQUNWLE9BQU87SUFDUCxNQUFNO0lBQ04sUUFBUTtJQUNSLE1BQU07SUFDTixVQUFVO0lBQ1YsV0FBVztJQUNYLFdBQVc7SUFDWCxVQUFVO0lBQ1YsVUFBVTtJQUNWLFdBQVc7SUFDWCxVQUFVO0lBQ1YsVUFBVTtJQUNWLFNBQVM7SUFDVCxPQUFPO0lBQ1AsUUFBUTtJQUNSLFVBQVU7SUFDVixTQUFTO0lBQ1QsU0FBUztJQUNULFdBQVc7SUFDWCxRQUFRO0lBQ1IsV0FBVztJQUNYLFdBQVc7SUFDWCxVQUFVO0lBQ1YsUUFBUTtJQUNSLFFBQVE7SUFDUixTQUFTO0lBQ1QsV0FBVztJQUNYLFFBQVE7SUFDUixRQUFRO0lBQ1IsU0FBUztJQUNULE9BQU87SUFDUCxPQUFPO0lBQ1AsVUFBVTtJQUNWLFdBQVc7SUFDWCxXQUFXO0lBQ1gsVUFBVTtJQUNWLFVBQVU7SUFDVixVQUFVO0lBQ1YsUUFBUTtJQUNSLFdBQVc7SUFDWCxXQUFXO0lBQ1gsVUFBVTtJQUNWLFNBQVM7SUFDVCxPQUFPO0lBQ1AsU0FBUztJQUNULFdBQVc7SUFDWCxXQUFXO0lBQ1gsUUFBUTtJQUNSLFVBQVU7SUFDVixVQUFVO0lBQ1YsV0FBVztJQUNYLFdBQVc7SUFDWCxVQUFVO0lBQ1YsU0FBUztJQUNULFNBQVM7SUFDVCxVQUFVO0lBQ1YsU0FBUztJQUNULE9BQU87SUFDUCxXQUFXO0lBQ1gsUUFBUTtJQUNSLFdBQVc7SUFDWCxVQUFVO0lBQ1YsU0FBUztJQUNULE9BQU87SUFDUCxVQUFVO0lBQ1YsV0FBVztJQUNYLFdBQVc7SUFDWCxTQUFTO0lBQ1QsU0FBUztJQUNULE1BQU07SUFDTixXQUFXO0lBQ1gsV0FBVztJQUNYLFdBQVc7SUFDWCxVQUFVO0lBQ1YsVUFBVTtJQUNWLE9BQU87SUFDUCxVQUFVO0lBQ1YsU0FBUztJQUNULE1BQU07SUFDTixPQUFPO0lBQ1AsV0FBVztJQUNYLFFBQVE7SUFDUixPQUFPO0lBQ1AsU0FBUztJQUNULFNBQVM7SUFDVCxVQUFVO0lBQ1YsV0FBVztJQUNYLFdBQVc7SUFDWCxXQUFXO0lBQ1gsUUFBUTtJQUNSLFVBQVU7SUFDVixXQUFXO0lBQ1gsVUFBVTtJQUNWLFNBQVM7SUFDVCxTQUFTO0lBQ1QsV0FBVztJQUNYLFdBQVc7SUFDWCxXQUFXO0lBQ1gsV0FBVztJQUNYLFdBQVc7SUFDWCxXQUFXO0lBQ1gsV0FBVztJQUNYLFdBQVc7SUFDWCxRQUFRO0lBQ1IsV0FBVztJQUNYLFdBQVc7SUFDWCxXQUFXO0lBQ1gsV0FBVztJQUNYLE9BQU87SUFDUCxNQUFNO0lBQ04sV0FBVztJQUNYLFFBQVE7SUFDUixTQUFTO0lBQ1QsUUFBUTtJQUNSLE9BQU87SUFDUCxVQUFVO0lBQ1YsTUFBTTtJQUNOLFFBQVE7SUFDUixXQUFXO0lBQ1gsVUFBVTtJQUNWLFVBQVU7SUFDVixRQUFRO0lBQ1IsU0FBUztJQUNULFdBQVc7SUFDWCxXQUFXO0lBQ1gsV0FBVztJQUNYLFdBQVc7SUFDWCxXQUFXO0lBQ1gsT0FBTztJQUNQLFFBQVE7SUFDUixVQUFVO0lBQ1YsV0FBVztJQUNYLFFBQVE7SUFDUixRQUFRO0lBQ1IsVUFBVTtJQUNWLFNBQVM7SUFDVCxXQUFXO0lBQ1gsVUFBVTtJQUNWLFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULFdBQVc7SUFDWCxVQUFVO0lBQ1YsVUFBVTtJQUNWLFdBQVc7SUFDWCxRQUFRO0lBQ1IsVUFBVTtJQUNWLFNBQVM7SUFDVCxXQUFXO0lBQ1gsV0FBVztJQUNYLFVBQVU7SUFDVixXQUFXO0lBQ1gsUUFBUTtJQUNSLFdBQVc7SUFDWCxVQUFVO0lBQ1YsVUFBVTtJQUNWLFNBQVM7SUFDVCxXQUFXO0lBQ1gsV0FBVztJQUNYLFFBQVE7SUFDUixXQUFXO0lBQ1gsU0FBUztJQUNULFdBQVc7SUFDWCxXQUFXO0lBQ1gsT0FBTztJQUNQLFFBQVE7SUFDUixVQUFVO0lBQ1YsVUFBVTtJQUNWLFdBQVc7SUFDWCxVQUFVO0lBQ1YsVUFBVTtJQUNWLFVBQVU7SUFDVixXQUFXO0lBQ1gsU0FBUztJQUNULFFBQVE7SUFDUixVQUFVO0lBQ1YsUUFBUTtJQUNSLFdBQVc7SUFDWCxTQUFTO0lBQ1QsU0FBUztJQUNULFFBQVE7SUFDUixXQUFXO0lBQ1gsU0FBUztJQUNULFNBQVM7SUFDVCxNQUFNO0lBQ04sUUFBUTtJQUNSLFNBQVM7SUFDVCxRQUFRO0lBQ1IsTUFBTTtJQUNOLE9BQU87SUFDUCxTQUFTO0lBQ1QsTUFBTTtJQUNOLFVBQVU7SUFDVixRQUFRO0lBQ1IsUUFBUTtJQUNSLFVBQVU7SUFDVixTQUFTO0lBQ1QsU0FBUztJQUNULFdBQVc7SUFDWCxPQUFPO0lBQ1AsU0FBUztJQUNULE1BQU07SUFDTixTQUFTO0lBQ1QsV0FBVztJQUNYLFdBQVc7SUFDWCxTQUFTO0lBQ1QsU0FBUztJQUNULFVBQVU7SUFDVixRQUFRO0lBQ1IsU0FBUztJQUNULFVBQVU7SUFDVixRQUFRO0lBQ1IsV0FBVztJQUNYLFdBQVc7SUFDWCxTQUFTO0lBQ1QsVUFBVTtJQUNWLFVBQVU7SUFDVixLQUFLO0lBQ0wsT0FBTztJQUNQLFNBQVM7SUFDVCxRQUFRO0lBQ1IsUUFBUTtJQUNSLE1BQU07SUFDTixNQUFNO0lBQ04sUUFBUTtJQUNSLFFBQVE7SUFDUixVQUFVO0lBQ1YsVUFBVTtJQUNWLFVBQVU7SUFDVixVQUFVO0lBQ1YsVUFBVTtJQUNWLE9BQU87SUFDUCxPQUFPO0lBQ1AsU0FBUztJQUNULFFBQVE7SUFDUixTQUFTO0lBQ1QsVUFBVTtJQUNWLFdBQVc7SUFDWCxVQUFVO0lBQ1YsUUFBUTtJQUNSLFFBQVE7SUFDUixPQUFPO0lBQ1AsUUFBUTtJQUNSLFFBQVE7SUFDUixVQUFVO0lBQ1YsU0FBUztJQUNULFdBQVc7SUFDWCxPQUFPO0lBQ1AsT0FBTztJQUNQLE9BQU87SUFDUCxPQUFPO0lBQ1AsU0FBUztJQUNULFFBQVE7SUFDUixVQUFVO0lBQ1YsVUFBVTtJQUNWLFdBQVc7SUFDWCxTQUFTO0lBQ1QsU0FBUztJQUNULE9BQU87SUFDUCxVQUFVO0lBQ1YsT0FBTztJQUNQLFNBQVM7SUFDVCxRQUFRO0lBQ1IsVUFBVTtJQUNWLFFBQVE7SUFDUixRQUFRO0lBQ1IsUUFBUTtJQUNSLFNBQVM7SUFDVCxNQUFNO0lBQ04sUUFBUTtJQUNSLE9BQU87SUFDUCxVQUFVO0lBQ1YsUUFBUTtJQUNSLFVBQVU7SUFDVixVQUFVO0lBQ1YsU0FBUztJQUNULFNBQVM7SUFDVCxXQUFXO0lBQ1gsT0FBTztJQUNQLFVBQVU7SUFDVixPQUFPO0lBQ1AsU0FBUztJQUNULFVBQVU7SUFDVixVQUFVO0lBQ1YsV0FBVztJQUNYLFFBQVE7SUFDUixTQUFTO0lBQ1QsU0FBUztJQUNULFVBQVU7SUFDVixLQUFLO0lBQ0wsTUFBTTtJQUNOLFNBQVM7SUFDVCxTQUFTO0lBQ1QsVUFBVTtJQUNWLFVBQVU7SUFDVixXQUFXO0lBQ1gsV0FBVztJQUNYLE9BQU87SUFDUCxTQUFTO0lBQ1QsT0FBTztJQUNQLE9BQU87SUFDUCxXQUFXO0lBQ1gsU0FBUztJQUNULFVBQVU7SUFDVixVQUFVO0lBQ1YsTUFBTTtJQUNOLFNBQVM7SUFDVCxXQUFXO0lBQ1gsV0FBVztJQUNYLFdBQVc7SUFDWCxVQUFVO0lBQ1YsVUFBVTtJQUNWLFFBQVE7SUFDUixPQUFPO0lBQ1AsU0FBUztJQUNULFVBQVU7SUFDVixRQUFRO0lBQ1IsVUFBVTtJQUNWLFNBQVM7SUFDVCxXQUFXO0lBQ1gsV0FBVztJQUNYLFVBQVU7SUFDVixTQUFTO0lBQ1QsVUFBVTtJQUNWLFVBQVU7SUFDVixVQUFVO0lBQ1YsV0FBVztJQUNYLFdBQVc7SUFDWCxVQUFVO0lBQ1YsTUFBTTtJQUNOLFNBQVM7SUFDVCxRQUFRO0lBQ1IsT0FBTztJQUNQLE9BQU87SUFDUCxRQUFRO0lBQ1IsUUFBUTtJQUNSLE9BQU87SUFDUCxPQUFPO0lBQ1AsTUFBTTtJQUNOLE9BQU87SUFDUCxPQUFPO0lBQ1AsT0FBTztJQUNQLFVBQVU7SUFDVixNQUFNO0lBQ04sUUFBUTtJQUNSLFNBQVM7SUFDVCxPQUFPO0lBQ1AsVUFBVTtJQUNWLFNBQVM7SUFDVCxTQUFTO0lBQ1QsT0FBTztJQUNQLFFBQVE7SUFDUixTQUFTO0lBQ1QsVUFBVTtJQUNWLE1BQU07SUFDTixLQUFLO0lBQ0wsS0FBSztJQUNMLE1BQU07SUFDTixPQUFPO0lBQ1AsTUFBTTtJQUNOLFVBQVU7SUFDVixRQUFRO0lBQ1IsVUFBVTtJQUNWLFFBQVE7SUFDUixVQUFVO0lBQ1YsUUFBUTtJQUNSLE1BQU07SUFDTixNQUFNO0lBQ04sTUFBTTtJQUNOLFNBQVM7SUFDVCxVQUFVO0lBQ1YsVUFBVTtJQUNWLFdBQVc7SUFDWCxRQUFRO0lBQ1IsVUFBVTtJQUNWLFVBQVU7SUFDVixVQUFVO0lBQ1YsU0FBUztJQUNULFVBQVU7SUFDVixTQUFTO0lBQ1QsVUFBVTtJQUNWLFNBQVM7SUFDVCxVQUFVO0lBQ1YsV0FBVztJQUNYLFVBQVU7SUFDVixTQUFTO0lBQ1QsVUFBVTtJQUNWLFVBQVU7SUFDVixVQUFVO0lBQ1YsUUFBUTtJQUNSLFFBQVE7SUFDUixTQUFTO0lBQ1QsVUFBVTtJQUNWLFVBQVU7SUFDVixLQUFLO0lBQ0wsT0FBTztJQUNQLFVBQVU7SUFDVixVQUFVO0lBQ1YsU0FBUztJQUNULFdBQVc7SUFDWCxVQUFVO0lBQ1YsV0FBVztJQUNYLFVBQVU7SUFDVixPQUFPO0lBQ1AsT0FBTztJQUNQLFNBQVM7SUFDVCxTQUFTO0lBQ1QsV0FBVztJQUNYLFFBQVE7SUFDUixTQUFTO0lBQ1QsT0FBTztJQUNQLFVBQVU7SUFDVixVQUFVO0lBQ1YsVUFBVTtJQUNWLFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULFVBQVU7SUFDVixVQUFVO0lBQ1YsU0FBUztJQUNULFVBQVU7SUFDVixRQUFRO0lBQ1IsV0FBVztJQUNYLFVBQVU7SUFDVixXQUFXO0lBQ1gsVUFBVTtJQUNWLFNBQVM7SUFDVCxVQUFVO0lBQ1YsV0FBVztJQUNYLFVBQVU7SUFDVixTQUFTO0lBQ1QsUUFBUTtJQUNSLFVBQVU7SUFDVixRQUFRO0lBQ1IsV0FBVztJQUNYLFVBQVU7SUFDVixPQUFPO0lBQ1AsU0FBUztJQUNULFNBQVM7SUFDVCxVQUFVO0lBQ1YsUUFBUTtJQUNSLFFBQVE7SUFDUixPQUFPO0lBQ1AsUUFBUTtJQUNSLFVBQVU7SUFDVixXQUFXO0lBQ1gsV0FBVztJQUNYLFVBQVU7SUFDVixPQUFPO0lBQ1AsUUFBUTtJQUNSLFNBQVM7SUFDVCxPQUFPO0lBQ1AsU0FBUztJQUNULFdBQVc7SUFDWCxRQUFRO0lBQ1IsTUFBTTtJQUNOLE9BQU87SUFDUCxXQUFXO0lBQ1gsU0FBUztJQUNULFVBQVU7SUFDVixVQUFVO0lBQ1YsV0FBVztJQUNYLFFBQVE7SUFDUixPQUFPO0lBQ1AsT0FBTztJQUNQLFFBQVE7SUFDUixVQUFVO0lBQ1YsV0FBVztJQUNYLFVBQVU7SUFDVixPQUFPO0lBQ1AsV0FBVztJQUNYLFFBQVE7SUFDUixLQUFLO0lBQ0wsT0FBTztJQUNQLEtBQUs7SUFDTCxXQUFXO0lBQ1gsU0FBUztJQUNULE9BQU87SUFDUCxNQUFNO0lBQ04sV0FBVztJQUNYLFVBQVU7SUFDVixTQUFTO0lBQ1QsUUFBUTtJQUNSLFFBQVE7SUFDUixTQUFTO0lBQ1QsV0FBVztJQUNYLFFBQVE7SUFDUixXQUFXO0lBQ1gsVUFBVTtJQUNWLE1BQU07SUFDTixRQUFRO0lBQ1IsT0FBTztJQUNQLFFBQVE7SUFDUixRQUFRO0lBQ1IsVUFBVTtJQUNWLFNBQVM7SUFDVCxLQUFLO0lBQ0wsUUFBUTtJQUNSLFNBQVM7SUFDVCxRQUFRO0lBQ1IsUUFBUTtJQUNSLFNBQVM7SUFDVCxRQUFRO0lBQ1IsU0FBUztJQUNULFFBQVE7SUFDUixTQUFTO0lBQ1QsUUFBUTtJQUNSLEtBQUs7SUFDTCxVQUFVO0lBQ1YsV0FBVztJQUNYLFFBQVE7SUFDUixTQUFTO0lBQ1QsVUFBVTtJQUNWLE9BQU87SUFDUCxNQUFNO0lBQ04sTUFBTTtJQUNOLFFBQVE7SUFDUixNQUFNO0lBQ04sT0FBTztJQUNQLE1BQU07SUFDTixRQUFRO0lBQ1IsS0FBSztJQUNMLFFBQVE7SUFDUixTQUFTO0lBQ1QsVUFBVTtJQUNWLFVBQVU7SUFDVixPQUFPO0lBQ1AsU0FBUztJQUNULFdBQVc7SUFDWCxRQUFRO0lBQ1IsT0FBTztJQUNQLFdBQVc7SUFDWCxVQUFVO0lBQ1YsV0FBVztJQUNYLFNBQVM7SUFDVCxXQUFXO0lBQ1gsVUFBVTtJQUNWLFVBQVU7SUFDVixRQUFRO0lBQ1IsV0FBVztJQUNYLFdBQVc7SUFDWCxXQUFXO0lBQ1gsVUFBVTtJQUNWLFdBQVc7SUFDWCxTQUFTO0lBQ1QsV0FBVztJQUNYLFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULE9BQU87SUFDUCxPQUFPO0lBQ1AsV0FBVztJQUNYLFFBQVE7SUFDUixTQUFTO0lBQ1QsV0FBVztJQUNYLE9BQU87SUFDUCxNQUFNO0lBQ04sVUFBVTtJQUNWLFdBQVc7SUFDWCxVQUFVO0lBQ1YsUUFBUTtJQUNSLFVBQVU7SUFDVixRQUFRO0lBQ1IsUUFBUTtJQUNSLFFBQVE7SUFDUixPQUFPO0lBQ1AsU0FBUztJQUNULFFBQVE7SUFDUixVQUFVO0lBQ1YsT0FBTztJQUNQLE9BQU87SUFDUCxRQUFRO0lBQ1IsT0FBTztJQUNQLFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULE9BQU87SUFDUCxXQUFXO0lBQ1gsUUFBUTtJQUNSLFdBQVc7SUFDWCxTQUFTO0lBQ1QsUUFBUTtJQUNSLFVBQVU7SUFDVixXQUFXO0lBQ1gsT0FBTztJQUNQLFNBQVM7SUFDVCxPQUFPO0lBQ1AsVUFBVTtJQUNWLFNBQVM7SUFDVCxVQUFVO0lBQ1YsU0FBUztJQUNULFFBQVE7SUFDUixTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0lBQ1QsUUFBUTtJQUNSLFNBQVM7SUFDVCxRQUFRO0lBQ1IsU0FBUztJQUNULFVBQVU7SUFDVixVQUFVO0lBQ1YsUUFBUTtJQUNSLFdBQVc7SUFDWCxXQUFXO0lBQ1gsU0FBUztJQUNULFVBQVU7SUFDVixPQUFPO0lBQ1AsT0FBTztJQUNQLE9BQU87SUFDUCxTQUFTO0lBQ1QsVUFBVTtJQUNWLFNBQVM7SUFDVCxNQUFNO0lBQ04sUUFBUTtJQUNSLFdBQVc7SUFDWCxTQUFTO0lBQ1QsUUFBUTtJQUNSLE1BQU07SUFDTixNQUFNO0lBQ04sVUFBVTtJQUNWLE1BQU07SUFDTixTQUFTO0lBQ1QsT0FBTztJQUNQLFVBQVU7SUFDVixVQUFVO0lBQ1YsV0FBVztJQUNYLE1BQU07SUFDTixTQUFTO0lBQ1QsT0FBTztJQUNQLFNBQVM7SUFDVCxNQUFNO0lBQ04sTUFBTTtJQUNOLE1BQU07SUFDTixPQUFPO0lBQ1AsVUFBVTtJQUNWLFdBQVc7SUFDWCxPQUFPO0lBQ1AsUUFBUTtJQUNSLE1BQU07SUFDTixRQUFRO0lBQ1IsTUFBTTtJQUNOLFFBQVE7SUFDUixVQUFVO0lBQ1YsTUFBTTtJQUNOLFNBQVM7SUFDVCxRQUFRO0lBQ1IsUUFBUTtJQUNSLFFBQVE7SUFDUixNQUFNO0lBQ04sTUFBTTtJQUNOLE1BQU07SUFDTixVQUFVO0lBQ1YsV0FBVztJQUNYLFVBQVU7SUFDVixXQUFXO0lBQ1gsUUFBUTtJQUNSLFFBQVE7SUFDUixVQUFVO0lBQ1YsU0FBUztJQUNULFdBQVc7SUFDWCxVQUFVO0lBQ1YsVUFBVTtJQUNWLFNBQVM7SUFDVCxVQUFVO0lBQ1YsT0FBTztJQUNQLFVBQVU7SUFDVixVQUFVO0lBQ1YsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0lBQ1QsVUFBVTtJQUNWLFNBQVM7SUFDVCxRQUFRO0lBQ1IsU0FBUztJQUNULE9BQU87SUFDUCxVQUFVO0lBQ1YsT0FBTztJQUNQLE9BQU87SUFDUCxTQUFTO0lBQ1QsV0FBVztJQUNYLE9BQU87SUFDUCxPQUFPO0lBQ1AsV0FBVztJQUNYLFNBQVM7SUFDVCxTQUFTO0lBQ1QsV0FBVztJQUNYLFVBQVU7SUFDVixRQUFRO0lBQ1IsV0FBVztJQUNYLFFBQVE7SUFDUixXQUFXO0lBQ1gsV0FBVztJQUNYLFNBQVM7SUFDVCxPQUFPO0lBQ1AsTUFBTTtJQUNOLFNBQVM7SUFDVCxVQUFVO0lBQ1YsVUFBVTtJQUNWLFdBQVc7SUFDWCxRQUFRO0lBQ1IsT0FBTztJQUNQLFNBQVM7SUFDVCxVQUFVO0lBQ1YsTUFBTTtJQUNOLFdBQVc7SUFDWCxNQUFNO0lBQ04sT0FBTztJQUNQLFdBQVc7SUFDWCxVQUFVO0lBQ1YsVUFBVTtJQUNWLE9BQU87SUFDUCxTQUFTO0lBQ1QsV0FBVztJQUNYLE9BQU87SUFDUCxXQUFXO0lBQ1gsT0FBTztJQUNQLFFBQVE7SUFDUixVQUFVO0lBQ1YsTUFBTTtJQUNOLFNBQVM7SUFDVCxNQUFNO0lBQ04sVUFBVTtJQUNWLFFBQVE7SUFDUixPQUFPO0lBQ1AsT0FBTztJQUNQLFFBQVE7SUFDUixVQUFVO0lBQ1YsUUFBUTtJQUNSLE9BQU87SUFDUCxRQUFRO0lBQ1IsU0FBUztJQUNULE9BQU87SUFDUCxPQUFPO0lBQ1AsUUFBUTtJQUNSLFNBQVM7SUFDVCxPQUFPO0lBQ1AsTUFBTTtJQUNOLFFBQVE7SUFDUixVQUFVO0lBQ1YsVUFBVTtJQUNWLFNBQVM7SUFDVCxTQUFTO0lBQ1QsV0FBVztJQUNYLFNBQVM7SUFDVCxVQUFVO0lBQ1YsUUFBUTtJQUNSLE9BQU87SUFDUCxXQUFXO0lBQ1gsVUFBVTtJQUNWLFVBQVU7SUFDVixPQUFPO0lBQ1AsU0FBUztJQUNULFdBQVc7SUFDWCxPQUFPO0lBQ1AsTUFBTTtJQUNOLFVBQVU7SUFDVixPQUFPO0lBQ1AsTUFBTTtJQUNOLFNBQVM7SUFDVCxTQUFTO0lBQ1QsV0FBVztJQUNYLFNBQVM7SUFDVCxPQUFPO0lBQ1AsUUFBUTtJQUNSLFVBQVU7SUFDVixNQUFNO0lBQ04sTUFBTTtJQUNOLE9BQU87SUFDUCxPQUFPO0lBQ1AsU0FBUztJQUNULE1BQU07SUFDTixRQUFRO0lBQ1IsS0FBSztJQUNMLFNBQVM7SUFDVCxVQUFVO0lBQ1YsV0FBVztJQUNYLFVBQVU7SUFDVixTQUFTO0lBQ1QsVUFBVTtJQUNWLFFBQVE7SUFDUixRQUFRO0lBQ1IsU0FBUztJQUNULFNBQVM7SUFDVCxLQUFLO0lBQ0wsU0FBUztJQUNULE9BQU87SUFDUCxNQUFNO0lBQ04sU0FBUztJQUNULE1BQU07SUFDTixRQUFRO0lBQ1IsUUFBUTtJQUNSLFdBQVc7SUFDWCxRQUFRO0lBQ1IsU0FBUztJQUNULFFBQVE7SUFDUixTQUFTO0lBQ1QsV0FBVztJQUNYLFNBQVM7SUFDVCxVQUFVO0lBQ1YsVUFBVTtJQUNWLFdBQVc7SUFDWCxVQUFVO0lBQ1YsVUFBVTtJQUNWLFdBQVc7SUFDWCxXQUFXO0lBQ1gsVUFBVTtJQUNWLFFBQVE7SUFDUixTQUFTO0lBQ1QsVUFBVTtJQUNWLFNBQVM7SUFDVCxVQUFVO0lBQ1YsV0FBVztJQUNYLFdBQVc7SUFDWCxXQUFXO0lBQ1gsU0FBUztJQUNULFNBQVM7SUFDVCxVQUFVO0lBQ1YsVUFBVTtJQUNWLFNBQVM7SUFDVCxVQUFVO0lBQ1YsV0FBVztJQUNYLFVBQVU7SUFDVixTQUFTO0lBQ1QsU0FBUztJQUNULFdBQVc7SUFDWCxXQUFXO0lBQ1gsV0FBVztJQUNYLFVBQVU7SUFDVixVQUFVO0lBQ1YsV0FBVztJQUNYLFdBQVc7SUFDWCxVQUFVO0lBQ1YsVUFBVTtJQUNWLFNBQVM7SUFDVCxVQUFVO0lBQ1YsUUFBUTtJQUNSLFdBQVc7SUFDWCxRQUFRO0lBQ1IsT0FBTztJQUNQLFdBQVc7SUFDWCxXQUFXO0lBQ1gsU0FBUztJQUNULFVBQVU7SUFDVixTQUFTO0lBQ1QsV0FBVztJQUNYLE9BQU87SUFDUCxRQUFRO0lBQ1IsVUFBVTtJQUNWLFVBQVU7SUFDVixXQUFXO0lBQ1gsVUFBVTtJQUNWLFVBQVU7SUFDVixVQUFVO0lBQ1YsV0FBVztJQUNYLFNBQVM7SUFDVCxVQUFVO0lBQ1YsV0FBVztJQUNYLFFBQVE7SUFDUixVQUFVO0lBQ1YsVUFBVTtJQUNWLFVBQVU7SUFDVixXQUFXO0lBQ1gsVUFBVTtJQUNWLE9BQU87SUFDUCxTQUFTO0lBQ1QsVUFBVTtJQUNWLFdBQVc7SUFDWCxXQUFXO0lBQ1gsV0FBVztJQUNYLFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULE9BQU87SUFDUCxTQUFTO0lBQ1QsTUFBTTtJQUNOLFFBQVE7SUFDUixPQUFPO0lBQ1AsU0FBUztJQUNULFdBQVc7SUFDWCxPQUFPO0lBQ1AsUUFBUTtJQUNSLFdBQVc7SUFDWCxVQUFVO0lBQ1YsU0FBUztJQUNULFVBQVU7SUFDVixXQUFXO0lBQ1gsTUFBTTtJQUNOLFNBQVM7SUFDVCxRQUFRO0lBQ1IsT0FBTztJQUNQLE9BQU87SUFDUCxRQUFRO0lBQ1IsVUFBVTtJQUNWLFFBQVE7SUFDUixVQUFVO0lBQ1YsUUFBUTtJQUNSLE1BQU07SUFDTixVQUFVO0lBQ1YsVUFBVTtJQUNWLFdBQVc7SUFDWCxXQUFXO0lBQ1gsV0FBVztJQUNYLFFBQVE7SUFDUixRQUFRO0lBQ1IsV0FBVztJQUNYLFVBQVU7SUFDVixTQUFTO0lBQ1QsVUFBVTtJQUNWLFVBQVU7SUFDVixVQUFVO0lBQ1YsV0FBVztJQUNYLFdBQVc7SUFDWCxVQUFVO0lBQ1YsVUFBVTtJQUNWLFdBQVc7SUFDWCxTQUFTO0lBQ1QsVUFBVTtJQUNWLFdBQVc7SUFDWCxXQUFXO0lBQ1gsU0FBUztJQUNULFVBQVU7SUFDVixNQUFNO0lBQ04sTUFBTTtJQUNOLE9BQU87SUFDUCxTQUFTO0lBQ1QsV0FBVztJQUNYLFNBQVM7SUFDVCxPQUFPO0lBQ1AsU0FBUztJQUNULFdBQVc7SUFDWCxPQUFPO0lBQ1AsUUFBUTtJQUNSLFFBQVE7SUFDUixRQUFRO0lBQ1IsU0FBUztJQUNULFNBQVM7SUFDVCxVQUFVO0lBQ1YsVUFBVTtJQUNWLFNBQVM7SUFDVCxXQUFXO0lBQ1gsT0FBTztJQUNQLFVBQVU7SUFDVixPQUFPO0lBQ1AsUUFBUTtJQUNSLFFBQVE7SUFDUixXQUFXO0lBQ1gsT0FBTztJQUNQLFVBQVU7SUFDVixRQUFRO0lBQ1IsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULE9BQU87SUFDUCxXQUFXO0lBQ1gsVUFBVTtJQUNWLFVBQVU7SUFDVixTQUFTO0lBQ1QsVUFBVTtJQUNWLFFBQVE7SUFDUixRQUFRO0lBQ1IsVUFBVTtJQUNWLE1BQU07SUFDTixLQUFLO0lBQ0wsTUFBTTtJQUNOLE1BQU07SUFDTixNQUFNO0lBQ04sT0FBTztJQUNQLFFBQVE7SUFDUixVQUFVO0lBQ1YsUUFBUTtJQUNSLE9BQU87SUFDUCxXQUFXO0lBQ1gsVUFBVTtJQUNWLFNBQVM7SUFDVCxRQUFRO0lBQ1IsV0FBVztJQUNYLFVBQVU7SUFDVixXQUFXO0lBQ1gsVUFBVTtJQUNWLFVBQVU7SUFDVixRQUFRO0lBQ1IsUUFBUTtJQUNSLFdBQVc7SUFDWCxXQUFXO0lBQ1gsUUFBUTtJQUNSLFVBQVU7SUFDVixRQUFRO0lBQ1IsTUFBTTtJQUNOLFFBQVE7SUFDUixTQUFTO0lBQ1QsVUFBVTtJQUNWLFVBQVU7SUFDVixRQUFRO0lBQ1IsUUFBUTtJQUNSLFFBQVE7SUFDUixTQUFTO0lBQ1QsUUFBUTtJQUNSLFdBQVc7SUFDWCxTQUFTO0lBQ1QsT0FBTztJQUNQLE1BQU07SUFDTixTQUFTO0lBQ1QsTUFBTTtJQUNOLFFBQVE7SUFDUixXQUFXO0lBQ1gsS0FBSztJQUNMLFFBQVE7SUFDUixTQUFTO0lBQ1QsVUFBVTtJQUNWLFdBQVc7SUFDWCxVQUFVO0lBQ1YsV0FBVztJQUNYLFdBQVc7SUFDWCxXQUFXO0lBQ1gsUUFBUTtJQUNSLFVBQVU7SUFDVixVQUFVO0lBQ1YsVUFBVTtJQUNWLFdBQVc7SUFDWCxXQUFXO0lBQ1gsV0FBVztJQUNYLFdBQVc7SUFDWCxXQUFXO0lBQ1gsV0FBVztJQUNYLEtBQUs7SUFDTCxTQUFTO0lBQ1QsT0FBTztJQUNQLE1BQU07SUFDTixNQUFNO0lBQ04sS0FBSztJQUNMLFVBQVU7SUFDVixVQUFVO0lBQ1YsVUFBVTtJQUNWLFNBQVM7SUFDVCxXQUFXO0lBQ1gsV0FBVztJQUNYLFVBQVU7SUFDVixVQUFVO0lBQ1YsVUFBVTtJQUNWLFFBQVE7SUFDUixPQUFPO0lBQ1AsTUFBTTtJQUNOLE9BQU87SUFDUCxVQUFVO0lBQ1YsUUFBUTtJQUNSLFFBQVE7SUFDUixXQUFXO0lBQ1gsVUFBVTtJQUNWLFVBQVU7SUFDVixPQUFPO0lBQ1AsV0FBVztJQUNYLFVBQVU7SUFDVixTQUFTO0lBQ1QsVUFBVTtJQUNWLFNBQVM7SUFDVCxXQUFXO0lBQ1gsVUFBVTtJQUNWLFNBQVM7SUFDVCxXQUFXO0lBQ1gsVUFBVTtJQUNWLFVBQVU7SUFDVixVQUFVO0lBQ1YsV0FBVztJQUNYLFVBQVU7SUFDVixXQUFXO0lBQ1gsV0FBVztJQUNYLFVBQVU7SUFDVixVQUFVO0lBQ1YsVUFBVTtJQUNWLFFBQVE7SUFDUixRQUFRO0lBQ1IsV0FBVztJQUNYLFNBQVM7SUFDVCxVQUFVO0lBQ1YsV0FBVztJQUNYLFdBQVc7SUFDWCxVQUFVO0lBQ1YsUUFBUTtJQUNSLFNBQVM7SUFDVCxXQUFXO0lBQ1gsV0FBVztJQUNYLFVBQVU7SUFDVixTQUFTO0lBQ1QsV0FBVztJQUNYLFdBQVc7SUFDWCxPQUFPO0lBQ1AsVUFBVTtJQUNWLFdBQVc7SUFDWCxVQUFVO0lBQ1YsUUFBUTtJQUNSLFVBQVU7SUFDVixXQUFXO0lBQ1gsV0FBVztJQUNYLFVBQVU7SUFDVixTQUFTO0lBQ1QsV0FBVztJQUNYLFNBQVM7SUFDVCxVQUFVO0lBQ1YsV0FBVztJQUNYLFVBQVU7SUFDVixTQUFTO0lBQ1QsV0FBVztJQUNYLFdBQVc7SUFDWCxXQUFXO0lBQ1gsU0FBUztJQUNULFdBQVc7SUFDWCxRQUFRO0lBQ1IsVUFBVTtJQUNWLFFBQVE7SUFDUixRQUFRO0lBQ1IsS0FBSztJQUNMLE1BQU07SUFDTixRQUFRO0lBQ1IsTUFBTTtJQUNOLE9BQU87SUFDUCxLQUFLO0lBQ0wsTUFBTTtJQUNOLFdBQVc7SUFDWCxVQUFVO0lBQ1YsV0FBVztJQUNYLFdBQVc7SUFDWCxVQUFVO0lBQ1YsVUFBVTtJQUNWLFNBQVM7SUFDVCxVQUFVO0lBQ1YsVUFBVTtJQUNWLFdBQVc7SUFDWCxXQUFXO0lBQ1gsU0FBUztJQUNULE9BQU87SUFDUCxTQUFTO0lBQ1QsV0FBVztJQUNYLFNBQVM7SUFDVCxNQUFNO0lBQ04sV0FBVztJQUNYLFFBQVE7SUFDUixPQUFPO0lBQ1AsS0FBSztJQUNMLEtBQUs7SUFDTCxRQUFRO0lBQ1IsUUFBUTtJQUNSLFdBQVc7SUFDWCxTQUFTO0lBQ1QsVUFBVTtJQUNWLFdBQVc7SUFDWCxRQUFRO0lBQ1IsV0FBVztJQUNYLFVBQVU7SUFDVixLQUFLO0lBQ0wsU0FBUztJQUNULFNBQVM7SUFDVCxRQUFRO0lBQ1IsU0FBUztJQUNULFNBQVM7SUFDVCxVQUFVO0lBQ1YsT0FBTztJQUNQLE1BQU07SUFDTixPQUFPO0lBQ1AsU0FBUztJQUNULFNBQVM7SUFDVCxNQUFNO0lBQ04sU0FBUztJQUNULFdBQVc7SUFDWCxNQUFNO0lBQ04sTUFBTTtJQUNOLFdBQVc7SUFDWCxTQUFTO0lBQ1QsT0FBTztJQUNQLFFBQVE7SUFDUixRQUFRO0lBQ1IsS0FBSztJQUNMLE9BQU87SUFDUCxRQUFRO0lBQ1IsT0FBTztJQUNQLFFBQVE7SUFDUixVQUFVO0lBQ1YsTUFBTTtJQUNOLFNBQVM7SUFDVCxTQUFTO0lBQ1QsS0FBSztJQUNMLFFBQVE7SUFDUixXQUFXO0lBQ1gsUUFBUTtJQUNSLFNBQVM7SUFDVCxNQUFNO0lBQ04sU0FBUztJQUNULFVBQVU7SUFDVixVQUFVO0lBQ1YsV0FBVztJQUNYLE9BQU87SUFDUCxNQUFNO0lBQ04sS0FBSztJQUNMLFFBQVE7SUFDUixVQUFVO0lBQ1YsV0FBVztJQUNYLFFBQVE7SUFDUixTQUFTO0lBQ1QsVUFBVTtJQUNWLFdBQVc7SUFDWCxVQUFVO0lBQ1YsT0FBTztJQUNQLFdBQVc7SUFDWCxVQUFVO0lBQ1YsV0FBVztJQUNYLE1BQU07SUFDTixRQUFRO0lBQ1IsVUFBVTtJQUNWLFNBQVM7SUFDVCxPQUFPO0lBQ1AsV0FBVztJQUNYLE9BQU87SUFDUCxTQUFTO0lBQ1QsU0FBUztJQUNULE1BQU07SUFDTixRQUFRO0lBQ1IsT0FBTztJQUNQLE1BQU07SUFDTixVQUFVO0lBQ1YsVUFBVTtJQUNWLE1BQU07SUFDTixRQUFRO0lBQ1IsU0FBUztJQUNULFFBQVE7SUFDUixTQUFTO0lBQ1QsVUFBVTtJQUNWLFFBQVE7SUFDUixPQUFPO0lBQ1AsTUFBTTtJQUNOLFNBQVM7SUFDVCxXQUFXO0lBQ1gsU0FBUztJQUNULFFBQVE7SUFDUixVQUFVO0lBQ1YsVUFBVTtJQUNWLE9BQU87SUFDUCxVQUFVO0lBQ1YsU0FBUztJQUNULFFBQVE7SUFDUixPQUFPO0lBQ1AsT0FBTztJQUNQLFFBQVE7SUFDUixVQUFVO0lBQ1YsTUFBTTtJQUNOLEtBQUs7SUFDTCxNQUFNO0lBQ04sUUFBUTtJQUNSLE1BQU07SUFDTixVQUFVO0lBQ1YsVUFBVTtJQUNWLFFBQVE7SUFDUixNQUFNO0lBQ04sTUFBTTtJQUNOLFVBQVU7SUFDVixVQUFVO0lBQ1YsV0FBVztJQUNYLFVBQVU7SUFDVixNQUFNO0lBQ04sUUFBUTtJQUNSLFFBQVE7SUFDUixVQUFVO0lBQ1YsUUFBUTtJQUNSLFVBQVU7SUFDVixTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFDVCxNQUFNO0lBQ04sU0FBUztJQUNULFNBQVM7SUFDVCxXQUFXO0lBQ1gsVUFBVTtJQUNWLFFBQVE7SUFDUixTQUFTO0lBQ1QsU0FBUztJQUNULE1BQU07SUFDTixRQUFRO0lBQ1IsT0FBTztJQUNQLE1BQU07SUFDTixTQUFTO0lBQ1QsVUFBVTtJQUNWLE1BQU07SUFDTixPQUFPO0lBQ1AsVUFBVTtJQUNWLE9BQU87SUFDUCxPQUFPO0lBQ1AsT0FBTztJQUNQLFFBQVE7SUFDUixTQUFTO0lBQ1QsT0FBTztJQUNQLE1BQU07SUFDTixTQUFTO0lBQ1QsU0FBUztJQUNULFVBQVU7SUFDVixXQUFXO0lBQ1gsVUFBVTtJQUNWLFFBQVE7SUFDUixRQUFRO0lBQ1IsT0FBTztJQUNQLFNBQVM7SUFDVCxVQUFVO0lBQ1YsUUFBUTtJQUNSLFNBQVM7SUFDVCxRQUFRO0lBQ1IsTUFBTTtJQUNOLE1BQU07SUFDTixPQUFPO0lBQ1AsUUFBUTtJQUNSLFVBQVU7SUFDVixVQUFVO0lBQ1YsU0FBUztJQUNULFVBQVU7SUFDVixVQUFVO0lBQ1YsVUFBVTtJQUNWLFVBQVU7SUFDVixVQUFVO0lBQ1YsVUFBVTtJQUNWLFVBQVU7SUFDVixXQUFXO0lBQ1gsV0FBVztJQUNYLFVBQVU7SUFDVixXQUFXO0lBQ1gsVUFBVTtJQUNWLFdBQVc7SUFDWCxPQUFPO0lBQ1AsU0FBUztJQUNULFFBQVE7SUFDUixPQUFPO0lBQ1AsUUFBUTtJQUNSLFNBQVM7SUFDVCxRQUFRO0lBQ1IsTUFBTTtJQUNOLE9BQU87SUFDUCxNQUFNO0lBQ04sTUFBTTtJQUNOLE9BQU87SUFDUCxNQUFNO0lBQ04sT0FBTztJQUNQLE1BQU07SUFDTixRQUFRO0lBQ1IsVUFBVTtJQUNWLFNBQVM7SUFDVCxRQUFRO0lBQ1IsVUFBVTtJQUNWLFFBQVE7SUFDUixTQUFTO0lBQ1QsU0FBUztJQUNULFFBQVE7SUFDUixVQUFVO0lBQ1YsUUFBUTtJQUNSLFVBQVU7SUFDVixRQUFRO0lBQ1IsVUFBVTtJQUNWLE1BQU07SUFDTixVQUFVO0lBQ1YsTUFBTTtJQUNOLFFBQVE7SUFDUixPQUFPO0lBQ1AsUUFBUTtJQUNSLFFBQVE7SUFDUixVQUFVO0lBQ1YsU0FBUztJQUNULFNBQVM7SUFDVCxXQUFXO0lBQ1gsTUFBTTtJQUNOLFNBQVM7SUFDVCxRQUFRO0lBQ1IsV0FBVztJQUNYLFNBQVM7SUFDVCxPQUFPO0lBQ1AsTUFBTTtJQUNOLFFBQVE7SUFDUixNQUFNO0lBQ04sTUFBTTtJQUNOLFNBQVM7SUFDVCxRQUFRO0lBQ1IsU0FBUztJQUNULFdBQVc7SUFDWCxVQUFVO0lBQ1YsUUFBUTtJQUNSLFNBQVM7SUFDVCxPQUFPO0lBQ1AsVUFBVTtJQUNWLFFBQVE7SUFDUixVQUFVO0lBQ1YsV0FBVztJQUNYLFdBQVc7SUFDWCxRQUFRO0lBQ1IsU0FBUztJQUNULFdBQVc7SUFDWCxTQUFTO0lBQ1QsU0FBUztJQUNULFVBQVU7SUFDVixLQUFLO0lBQ0wsTUFBTTtJQUNOLFFBQVE7SUFDUixTQUFTO0lBQ1QsU0FBUztJQUNULFVBQVU7SUFDVixRQUFRO0lBQ1IsVUFBVTtJQUNWLFVBQVU7SUFDVixRQUFRO0lBQ1IsT0FBTztJQUNQLE9BQU87SUFDUCxNQUFNO0lBQ04sTUFBTTtJQUNOLFNBQVM7SUFDVCxXQUFXO0lBQ1gsT0FBTztJQUNQLE9BQU87SUFDUCxTQUFTO0lBQ1QsVUFBVTtJQUNWLE1BQU07SUFDTixPQUFPO0lBQ1AsVUFBVTtJQUNWLFVBQVU7SUFDVixRQUFRO0lBQ1IsUUFBUTtJQUNSLFVBQVU7SUFDVixTQUFTO0lBQ1QsTUFBTTtJQUNOLE1BQU07SUFDTixLQUFLO0lBQ0wsU0FBUztJQUNULFNBQVM7SUFDVCxRQUFRO0lBQ1IsTUFBTTtJQUNOLE1BQU07SUFDTixVQUFVO0lBQ1YsV0FBVztJQUNYLFFBQVE7SUFDUixRQUFRO0lBQ1IsUUFBUTtJQUNSLFNBQVM7SUFDVCxPQUFPO0lBQ1AsUUFBUTtJQUNSLE9BQU87SUFDUCxXQUFXO0lBQ1gsU0FBUztJQUNULFFBQVE7SUFDUixRQUFRO0lBQ1IsV0FBVztJQUNYLFdBQVc7SUFDWCxPQUFPO0lBQ1AsU0FBUztJQUNULFdBQVc7SUFDWCxVQUFVO0lBQ1YsV0FBVztJQUNYLFdBQVc7SUFDWCxRQUFRO0lBQ1IsVUFBVTtJQUNWLFNBQVM7SUFDVCxRQUFRO0lBQ1IsV0FBVztJQUNYLFVBQVU7SUFDVixXQUFXO0lBQ1gsU0FBUztJQUNULFNBQVM7SUFDVCxRQUFRO0lBQ1IsT0FBTztJQUNQLFVBQVU7SUFDVixVQUFVO0lBQ1YsV0FBVztJQUNYLFdBQVc7SUFDWCxNQUFNO0lBQ04sT0FBTztJQUNQLE1BQU07SUFDTixXQUFXO0lBQ1gsTUFBTTtJQUNOLFFBQVE7SUFDUixVQUFVO0lBQ1YsUUFBUTtJQUNSLFdBQVc7SUFDWCxTQUFTO0lBQ1QsV0FBVztJQUNYLFVBQVU7SUFDVixPQUFPO0lBQ1AsV0FBVztJQUNYLFFBQVE7SUFDUixPQUFPO0lBQ1AsV0FBVztJQUNYLFVBQVU7SUFDVixVQUFVO0lBQ1YsUUFBUTtJQUNSLFVBQVU7SUFDVixVQUFVO0lBQ1YsT0FBTztJQUNQLE1BQU07SUFDTixTQUFTO0lBQ1QsV0FBVztJQUNYLFVBQVU7SUFDVixTQUFTO0lBQ1QsUUFBUTtJQUNSLFNBQVM7SUFDVCxVQUFVO0lBQ1YsT0FBTztJQUNQLFdBQVc7SUFDWCxVQUFVO0lBQ1YsV0FBVztJQUNYLFdBQVc7SUFDWCxXQUFXO0lBQ1gsU0FBUztJQUNULFdBQVc7SUFDWCxVQUFVO0lBQ1YsVUFBVTtJQUNWLFFBQVE7SUFDUixVQUFVO0lBQ1YsU0FBUztJQUNULFdBQVc7SUFDWCxVQUFVO0lBQ1YsVUFBVTtJQUNWLE9BQU87SUFDUCxXQUFXO0lBQ1gsUUFBUTtJQUNSLFdBQVc7SUFDWCxNQUFNO0lBQ04sTUFBTTtJQUNOLFFBQVE7SUFDUixTQUFTO0lBQ1QsV0FBVztJQUNYLFNBQVM7SUFDVCxVQUFVO0lBQ1YsU0FBUztJQUNULFVBQVU7SUFDVixTQUFTO0lBQ1QsV0FBVztJQUNYLFVBQVU7SUFDVixRQUFRO0lBQ1IsUUFBUTtJQUNSLE9BQU87SUFDUCxPQUFPO0lBQ1AsV0FBVztJQUNYLFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULFdBQVc7SUFDWCxVQUFVO0lBQ1YsV0FBVztJQUNYLFFBQVE7SUFDUixTQUFTO0lBQ1QsU0FBUztJQUNULFdBQVc7SUFDWCxPQUFPO0lBQ1AsU0FBUztJQUNULFFBQVE7SUFDUixTQUFTO0lBQ1QsT0FBTztJQUNQLFVBQVU7SUFDVixRQUFRO0lBQ1IsUUFBUTtJQUNSLFFBQVE7SUFDUixNQUFNO0lBQ04sS0FBSztJQUNMLFVBQVU7SUFDVixXQUFXO0lBQ1gsU0FBUztJQUNULFNBQVM7SUFDVCxVQUFVO0lBQ1YsT0FBTztJQUNQLE9BQU87SUFDUCxXQUFXO0lBQ1gsV0FBVztJQUNYLFFBQVE7SUFDUixVQUFVO0lBQ1YsUUFBUTtJQUNSLFFBQVE7SUFDUixTQUFTO0lBQ1QsVUFBVTtJQUNWLFFBQVE7SUFDUixXQUFXO0lBQ1gsUUFBUTtJQUNSLFNBQVM7SUFDVCxRQUFRO0lBQ1IsT0FBTztJQUNQLFdBQVc7SUFDWCxRQUFRO0lBQ1IsV0FBVztJQUNYLFdBQVc7SUFDWCxTQUFTO0lBQ1QsUUFBUTtJQUNSLFdBQVc7SUFDWCxRQUFRO0lBQ1IsU0FBUztJQUNULFVBQVU7SUFDVixRQUFRO0lBQ1IsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0lBQ1QsV0FBVztJQUNYLFVBQVU7SUFDVixTQUFTO0lBQ1QsVUFBVTtJQUNWLFdBQVc7SUFDWCxVQUFVO0lBQ1YsVUFBVTtJQUNWLFdBQVc7SUFDWCxNQUFNO0lBQ04sUUFBUTtJQUNSLFdBQVc7SUFDWCxXQUFXO0lBQ1gsUUFBUTtJQUNSLFFBQVE7SUFDUixRQUFRO0lBQ1IsUUFBUTtJQUNSLFVBQVU7SUFDVixVQUFVO0lBQ1YsVUFBVTtJQUNWLE9BQU87SUFDUCxVQUFVO0lBQ1YsVUFBVTtJQUNWLFNBQVM7SUFDVCxPQUFPO0lBQ1AsUUFBUTtJQUNSLFdBQVc7SUFDWCxRQUFRO0lBQ1IsU0FBUztJQUNULFFBQVE7SUFDUixVQUFVO0lBQ1YsVUFBVTtJQUNWLFNBQVM7SUFDVCxPQUFPO0lBQ1AsUUFBUTtJQUNSLFFBQVE7SUFDUixVQUFVO0lBQ1YsUUFBUTtJQUNSLFNBQVM7SUFDVCxXQUFXO0lBQ1gsUUFBUTtJQUNSLFNBQVM7SUFDVCxXQUFXO0lBQ1gsVUFBVTtJQUNWLE9BQU87SUFDUCxVQUFVO0lBQ1YsTUFBTTtJQUNOLFdBQVc7SUFDWCxVQUFVO0lBQ1YsVUFBVTtJQUNWLFNBQVM7SUFDVCxLQUFLO0lBQ0wsV0FBVztJQUNYLFFBQVE7SUFDUixVQUFVO0lBQ1YsVUFBVTtJQUNWLFdBQVc7SUFDWCxXQUFXO0lBQ1gsV0FBVztJQUNYLFVBQVU7SUFDVixTQUFTO0lBQ1QsU0FBUztJQUNULFVBQVU7SUFDVixVQUFVO0lBQ1YsVUFBVTtJQUNWLFdBQVc7SUFDWCxVQUFVO0lBQ1YsVUFBVTtJQUNWLFVBQVU7SUFDVixVQUFVO0lBQ1YsVUFBVTtJQUNWLFVBQVU7SUFDVixTQUFTO0lBQ1QsV0FBVztJQUNYLFNBQVM7SUFDVCxVQUFVO0lBQ1YsU0FBUztJQUNULFdBQVc7SUFDWCxPQUFPO0lBQ1AsUUFBUTtJQUNSLFVBQVU7SUFDVixRQUFRO0lBQ1IsV0FBVztJQUNYLFVBQVU7SUFDVixTQUFTO0lBQ1QsVUFBVTtJQUNWLFdBQVc7SUFDWCxXQUFXO0lBQ1gsV0FBVztJQUNYLFVBQVU7SUFDVixLQUFLO0lBQ0wsUUFBUTtJQUNSLFVBQVU7SUFDVixTQUFTO0lBQ1QsV0FBVztJQUNYLFVBQVU7SUFDVixVQUFVO0lBQ1YsVUFBVTtJQUNWLE9BQU87SUFDUCxXQUFXO0lBQ1gsVUFBVTtJQUNWLFdBQVc7SUFDWCxXQUFXO0lBQ1gsU0FBUztJQUNULFVBQVU7SUFDVixRQUFRO0lBQ1IsT0FBTztJQUNQLE1BQU07SUFDTixVQUFVO0lBQ1YsV0FBVztJQUNYLFFBQVE7SUFDUixVQUFVO0lBQ1YsV0FBVztJQUNYLFFBQVE7SUFDUixXQUFXO0lBQ1gsT0FBTztJQUNQLE9BQU87SUFDUCxXQUFXO0lBQ1gsVUFBVTtJQUNWLFNBQVM7SUFDVCxVQUFVO0lBQ1YsU0FBUztJQUNULFVBQVU7SUFDVixPQUFPO0lBQ1AsV0FBVztJQUNYLFdBQVc7SUFDWCxPQUFPO0lBQ1AsT0FBTztJQUNQLFNBQVM7SUFDVCxNQUFNO0lBQ04sT0FBTztJQUNQLFFBQVE7SUFDUixPQUFPO0lBQ1AsUUFBUTtJQUNSLE1BQU07SUFDTixNQUFNO0lBQ04sS0FBSztJQUNMLEtBQUs7SUFDTCxVQUFVO0lBQ1YsT0FBTztJQUNQLE1BQU07SUFDTixRQUFRO0lBQ1IsU0FBUztJQUNULFVBQVU7SUFDVixVQUFVO0lBQ1YsV0FBVztJQUNYLFdBQVc7SUFDWCxRQUFRO0lBQ1IsVUFBVTtJQUNWLE9BQU87SUFDUCxXQUFXO0lBQ1gsU0FBUztJQUNULE9BQU87SUFDUCxPQUFPO0lBQ1AsVUFBVTtJQUNWLFNBQVM7SUFDVCxXQUFXO0lBQ1gsUUFBUTtJQUNSLE9BQU87SUFDUCxXQUFXO0lBQ1gsT0FBTztJQUNQLFdBQVc7SUFDWCxVQUFVO0lBQ1YsUUFBUTtJQUNSLFNBQVM7SUFDVCxXQUFXO0lBQ1gsVUFBVTtJQUNWLE9BQU87SUFDUCxPQUFPO0lBQ1AsUUFBUTtJQUNSLFdBQVc7SUFDWCxPQUFPO0lBQ1AsU0FBUztJQUNULFNBQVM7SUFDVCxRQUFRO0lBQ1IsV0FBVztJQUNYLE9BQU87SUFDUCxTQUFTO0lBQ1QsUUFBUTtJQUNSLFVBQVU7SUFDVixNQUFNO0lBQ04sV0FBVztJQUNYLFdBQVc7SUFDWCxRQUFRO0lBQ1IsTUFBTTtJQUNOLFFBQVE7SUFDUixRQUFRO0lBQ1IsUUFBUTtJQUNSLFNBQVM7SUFDVCxXQUFXO0lBQ1gsU0FBUztJQUNULE1BQU07SUFDTixPQUFPO0lBQ1AsS0FBSztJQUNMLE1BQU07SUFDTixNQUFNO0lBQ04sUUFBUTtJQUNSLE9BQU87SUFDUCxXQUFXO0lBQ1gsTUFBTTtJQUNOLFFBQVE7SUFDUixRQUFRO0lBQ1IsU0FBUztJQUNULE9BQU87SUFDUCxRQUFRO0lBQ1IsU0FBUztJQUNULFdBQVc7SUFDWCxVQUFVO0lBQ1YsUUFBUTtJQUNSLFVBQVU7SUFDVixTQUFTO0lBQ1QsUUFBUTtJQUNSLFVBQVU7SUFDVixVQUFVO0lBQ1YsVUFBVTtJQUNWLFdBQVc7SUFDWCxNQUFNO0lBQ04sUUFBUTtJQUNSLFNBQVM7SUFDVCxRQUFRO0lBQ1IsVUFBVTtJQUNWLFFBQVE7SUFDUixVQUFVO0lBQ1YsUUFBUTtJQUNSLFdBQVc7SUFDWCxRQUFRO0lBQ1IsUUFBUTtJQUNSLFVBQVU7SUFDVixVQUFVO0lBQ1YsV0FBVztJQUNYLFVBQVU7SUFDVixXQUFXO0lBQ1gsV0FBVztJQUNYLFNBQVM7SUFDVCxTQUFTO0lBQ1QsTUFBTTtJQUNOLFFBQVE7SUFDUixNQUFNO0lBQ04sU0FBUztJQUNULE9BQU87SUFDUCxNQUFNO0lBQ04sS0FBSztJQUNMLFdBQVc7SUFDWCxRQUFRO0lBQ1IsVUFBVTtJQUNWLFVBQVU7SUFDVixRQUFRO0lBQ1IsU0FBUztJQUNULE9BQU87SUFDUCxNQUFNO0lBQ04sUUFBUTtJQUNSLFVBQVU7SUFDVixVQUFVO0lBQ1YsT0FBTztJQUNQLE9BQU87SUFDUCxRQUFRO0lBQ1IsUUFBUTtJQUNSLFVBQVU7SUFDVixXQUFXO0lBQ1gsT0FBTztJQUNQLFVBQVU7SUFDVixPQUFPO0lBQ1AsU0FBUztJQUNULFFBQVE7SUFDUixTQUFTO0lBQ1QsUUFBUTtJQUNSLFNBQVM7SUFDVCxRQUFRO0lBQ1IsU0FBUztJQUNULFFBQVE7SUFDUixVQUFVO0lBQ1YsU0FBUztJQUNULFVBQVU7SUFDVixXQUFXO0lBQ1gsU0FBUztJQUNULFVBQVU7SUFDVixVQUFVO0lBQ1YsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFDVCxRQUFRO0lBQ1IsVUFBVTtJQUNWLFVBQVU7SUFDVixXQUFXO0lBQ1gsT0FBTztJQUNQLFFBQVE7SUFDUixPQUFPO0lBQ1AsS0FBSztJQUNMLEtBQUs7SUFDTCxPQUFPO0lBQ1AsS0FBSztJQUNMLFdBQVc7SUFDWCxVQUFVO0lBQ1YsVUFBVTtJQUNWLFFBQVE7SUFDUixVQUFVO0lBQ1YsU0FBUztJQUNULFVBQVU7SUFDVixXQUFXO0lBQ1gsUUFBUTtJQUNSLFdBQVc7SUFDWCxNQUFNO0lBQ04sU0FBUztJQUNULFdBQVc7SUFDWCxXQUFXO0lBQ1gsVUFBVTtJQUNWLFdBQVc7SUFDWCxVQUFVO0lBQ1YsV0FBVztJQUNYLFdBQVc7SUFDWCxVQUFVO0lBQ1YsVUFBVTtJQUNWLFdBQVc7SUFDWCxVQUFVO0lBQ1YsUUFBUTtJQUNSLFdBQVc7SUFDWCxRQUFRO0lBQ1IsU0FBUztJQUNULFdBQVc7SUFDWCxXQUFXO0lBQ1gsVUFBVTtJQUNWLFVBQVU7SUFDVixRQUFRO0lBQ1IsT0FBTztJQUNQLFFBQVE7SUFDUixTQUFTO0lBQ1QsUUFBUTtJQUNSLFNBQVM7SUFDVCxTQUFTO0lBQ1QsTUFBTTtJQUNOLEtBQUs7SUFDTCxNQUFNO0lBQ04sVUFBVTtJQUNWLE1BQU07SUFDTixLQUFLO0lBQ0wsT0FBTztJQUNQLFVBQVU7SUFDVixPQUFPO0lBQ1AsTUFBTTtJQUNOLFNBQVM7SUFDVCxVQUFVO0lBQ1YsTUFBTTtJQUNOLFVBQVU7SUFDVixTQUFTO0lBQ1QsVUFBVTtJQUNWLFNBQVM7SUFDVCxPQUFPO0lBQ1AsUUFBUTtJQUNSLFVBQVU7SUFDVixNQUFNO0lBQ04sVUFBVTtJQUNWLE9BQU87SUFDUCxTQUFTO0lBQ1QsV0FBVztJQUNYLFNBQVM7SUFDVCxNQUFNO0lBQ04sUUFBUTtJQUNSLE1BQU07SUFDTixNQUFNO0lBQ04sTUFBTTtJQUNOLE1BQU07SUFDTixTQUFTO0lBQ1QsTUFBTTtJQUNOLE1BQU07SUFDTixVQUFVO0lBQ1YsU0FBUztJQUNULFdBQVc7SUFDWCxXQUFXO0lBQ1gsV0FBVztJQUNYLFVBQVU7SUFDVixPQUFPO0lBQ1AsU0FBUztJQUNULFVBQVU7SUFDVixRQUFRO0lBQ1IsVUFBVTtJQUNWLFVBQVU7SUFDVixXQUFXO0lBQ1gsV0FBVztJQUNYLEtBQUs7SUFDTCxXQUFXO0lBQ1gsU0FBUztJQUNULE9BQU87SUFDUCxPQUFPO0lBQ1AsTUFBTTtJQUNOLE9BQU87SUFDUCxPQUFPO0lBQ1AsUUFBUTtJQUNSLFNBQVM7SUFDVCxRQUFRO0lBQ1IsVUFBVTtJQUNWLFVBQVU7SUFDVixVQUFVO0lBQ1YsVUFBVTtJQUNWLFNBQVM7SUFDVCxVQUFVO0lBQ1YsU0FBUztJQUNULFVBQVU7SUFDVixVQUFVO0lBQ1YsT0FBTztJQUNQLFVBQVU7SUFDVixRQUFRO0lBQ1IsVUFBVTtJQUNWLFVBQVU7SUFDVixTQUFTO0lBQ1QsVUFBVTtJQUNWLFFBQVE7SUFDUixTQUFTO0lBQ1QsUUFBUTtJQUNSLFNBQVM7SUFDVCxTQUFTO0lBQ1QsVUFBVTtJQUNWLFVBQVU7SUFDVixTQUFTO0lBQ1QsV0FBVztJQUNYLFdBQVc7SUFDWCxTQUFTO0lBQ1QsU0FBUztJQUNULFFBQVE7SUFDUixTQUFTO0lBQ1QsU0FBUztJQUNULFVBQVU7SUFDVixVQUFVO0lBQ1YsVUFBVTtJQUNWLFNBQVM7SUFDVCxVQUFVO0lBQ1YsVUFBVTtJQUNWLFVBQVU7SUFDVixXQUFXO0lBQ1gsVUFBVTtJQUNWLFdBQVc7SUFDWCxXQUFXO0lBQ1gsVUFBVTtJQUNWLFVBQVU7SUFDVixTQUFTO0lBQ1QsVUFBVTtJQUNWLFFBQVE7SUFDUixNQUFNO0lBQ04sT0FBTztJQUNQLE1BQU07SUFDTixTQUFTO0lBQ1QsU0FBUztJQUNULFVBQVU7SUFDVixTQUFTO0lBQ1QsVUFBVTtJQUNWLFVBQVU7SUFDVixXQUFXO0lBQ1gsV0FBVztJQUNYLFVBQVU7SUFDVixXQUFXO0lBQ1gsVUFBVTtJQUNWLFVBQVU7SUFDVixVQUFVO0lBQ1YsVUFBVTtJQUNWLFdBQVc7SUFDWCxXQUFXO0lBQ1gsV0FBVztJQUNYLFdBQVc7SUFDWCxXQUFXO0lBQ1gsU0FBUztJQUNULFdBQVc7SUFDWCxXQUFXO0lBQ1gsV0FBVztJQUNYLFNBQVM7SUFDVCxVQUFVO0lBQ1YsVUFBVTtJQUNWLFVBQVU7SUFDVixVQUFVO0lBQ1YsV0FBVztJQUNYLFVBQVU7SUFDVixVQUFVO0lBQ1YsVUFBVTtJQUNWLFVBQVU7SUFDVixVQUFVO0lBQ1YsVUFBVTtJQUNWLFVBQVU7SUFDVixXQUFXO0lBQ1gsVUFBVTtJQUNWLFdBQVc7SUFDWCxVQUFVO0lBQ1YsU0FBUztJQUNULFNBQVM7SUFDVCxVQUFVO0lBQ1YsVUFBVTtJQUNWLFVBQVU7SUFDVixXQUFXO0lBQ1gsV0FBVztJQUNYLFVBQVU7SUFDVixTQUFTO0lBQ1QsV0FBVztJQUNYLFVBQVU7SUFDVixXQUFXO0lBQ1gsV0FBVztJQUNYLFVBQVU7SUFDVixXQUFXO0lBQ1gsV0FBVztJQUNYLFVBQVU7SUFDVixVQUFVO0lBQ1YsVUFBVTtJQUNWLFNBQVM7SUFDVCxXQUFXO0lBQ1gsVUFBVTtJQUNWLFdBQVc7SUFDWCxXQUFXO0lBQ1gsV0FBVztJQUNYLFVBQVU7SUFDVixXQUFXO0lBQ1gsV0FBVztJQUNYLFVBQVU7SUFDVixVQUFVO0lBQ1YsV0FBVztJQUNYLFdBQVc7SUFDWCxXQUFXO0lBQ1gsVUFBVTtJQUNWLFdBQVc7SUFDWCxVQUFVO0lBQ1YsU0FBUztJQUNULFVBQVU7SUFDVixVQUFVO0lBQ1YsVUFBVTtJQUNWLFNBQVM7SUFDVCxXQUFXO0lBQ1gsVUFBVTtJQUNWLFdBQVc7SUFDWCxLQUFLO0lBQ0wsUUFBUTtJQUNSLFNBQVM7SUFDVCxXQUFXO0lBQ1gsU0FBUztJQUNULFdBQVc7SUFDWCxRQUFRO0lBQ1IsVUFBVTtJQUNWLFFBQVE7SUFDUixPQUFPO0lBQ1AsT0FBTztJQUNQLFdBQVc7SUFDWCxTQUFTO0lBQ1QsVUFBVTtJQUNWLFVBQVU7SUFDVixVQUFVO0lBQ1YsUUFBUTtJQUNSLFFBQVE7SUFDUixTQUFTO0lBQ1QsUUFBUTtJQUNSLFVBQVU7SUFDVixTQUFTO0lBQ1QsT0FBTztJQUNQLE9BQU87SUFDUCxRQUFRO0lBQ1IsU0FBUztJQUNULFFBQVE7SUFDUixXQUFXO0lBQ1gsTUFBTTtJQUNOLFVBQVU7SUFDVixXQUFXO0lBQ1gsUUFBUTtJQUNSLFVBQVU7SUFDVixVQUFVO0lBQ1YsU0FBUztJQUNULFVBQVU7SUFDVixRQUFRO0lBQ1IsU0FBUztJQUNULFVBQVU7SUFDVixPQUFPO0lBQ1AsVUFBVTtJQUNWLE1BQU07SUFDTixXQUFXO0lBQ1gsT0FBTztJQUNQLFNBQVM7SUFDVCxVQUFVO0lBQ1YsV0FBVztJQUNYLFNBQVM7SUFDVCxXQUFXO0lBQ1gsUUFBUTtJQUNSLE9BQU87SUFDUCxXQUFXO0lBQ1gsV0FBVztJQUNYLFFBQVE7SUFDUixPQUFPO0lBQ1AsU0FBUztJQUNULFNBQVM7SUFDVCxVQUFVO0lBQ1YsV0FBVztJQUNYLFFBQVE7SUFDUixTQUFTO0lBQ1QsV0FBVztJQUNYLFVBQVU7SUFDVixXQUFXO0lBQ1gsV0FBVztJQUNYLFdBQVc7SUFDWCxVQUFVO0lBQ1YsV0FBVztJQUNYLFdBQVc7SUFDWCxXQUFXO0lBQ1gsVUFBVTtJQUNWLFVBQVU7SUFDVixXQUFXO0lBQ1gsUUFBUTtJQUNSLFNBQVM7SUFDVCxXQUFXO0lBQ1gsUUFBUTtJQUNSLFFBQVE7SUFDUixPQUFPO0lBQ1AsU0FBUztJQUNULFNBQVM7SUFDVCxRQUFRO0lBQ1IsVUFBVTtJQUNWLFFBQVE7SUFDUixRQUFRO0lBQ1IsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0lBQ1QsUUFBUTtJQUNSLFNBQVM7SUFDVCxXQUFXO0lBQ1gsUUFBUTtJQUNSLFNBQVM7SUFDVCxXQUFXO0lBQ1gsT0FBTztJQUNQLFVBQVU7SUFDVixVQUFVO0lBQ1YsU0FBUztJQUNULFVBQVU7SUFDVixXQUFXO0lBQ1gsVUFBVTtJQUNWLFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULFdBQVc7SUFDWCxVQUFVO0lBQ1YsVUFBVTtJQUNWLFVBQVU7SUFDVixPQUFPO0lBQ1AsUUFBUTtJQUNSLFFBQVE7SUFDUixTQUFTO0lBQ1QsUUFBUTtJQUNSLFVBQVU7SUFDVixTQUFTO0lBQ1QsT0FBTztJQUNQLFdBQVc7SUFDWCxRQUFRO0lBQ1IsVUFBVTtJQUNWLFdBQVc7SUFDWCxNQUFNO0lBQ04sVUFBVTtJQUNWLFNBQVM7SUFDVCxPQUFPO0lBQ1AsV0FBVztJQUNYLFNBQVM7SUFDVCxRQUFRO0lBQ1IsV0FBVztJQUNYLFdBQVc7SUFDWCxRQUFRO0lBQ1IsVUFBVTtJQUNWLE9BQU87SUFDUCxXQUFXO0lBQ1gsVUFBVTtJQUNWLFFBQVE7SUFDUixRQUFRO0lBQ1IsU0FBUztJQUNULFNBQVM7SUFDVCxVQUFVO0lBQ1YsUUFBUTtJQUNSLE9BQU87SUFDUCxPQUFPO0lBQ1AsUUFBUTtJQUNSLFNBQVM7SUFDVCxVQUFVO0lBQ1YsU0FBUztJQUNULFFBQVE7SUFDUixRQUFRO0lBQ1IsT0FBTztJQUNQLFFBQVE7SUFDUixVQUFVO0lBQ1YsVUFBVTtJQUNWLFdBQVc7SUFDWCxVQUFVO0lBQ1YsVUFBVTtJQUNWLFdBQVc7SUFDWCxVQUFVO0lBQ1YsU0FBUztJQUNULFFBQVE7SUFDUixNQUFNO0lBQ04sUUFBUTtJQUNSLFVBQVU7SUFDVixTQUFTO0lBQ1QsUUFBUTtJQUNSLFNBQVM7SUFDVCxTQUFTO0lBQ1QsV0FBVztJQUNYLFVBQVU7SUFDVixTQUFTO0lBQ1QsV0FBVztJQUNYLE9BQU87SUFDUCxRQUFRO0lBQ1IsU0FBUztJQUNULFVBQVU7SUFDVixXQUFXO0lBQ1gsS0FBSztJQUNMLFVBQVU7SUFDVixTQUFTO0lBQ1QsT0FBTztJQUNQLFdBQVc7SUFDWCxXQUFXO0lBQ1gsV0FBVztJQUNYLFdBQVc7SUFDWCxTQUFTO0lBQ1QsV0FBVztJQUNYLFFBQVE7SUFDUixVQUFVO0lBQ1YsU0FBUztJQUNULFdBQVc7SUFDWCxPQUFPO0lBQ1AsTUFBTTtJQUNOLFVBQVU7SUFDVixXQUFXO0lBQ1gsV0FBVztJQUNYLFdBQVc7SUFDWCxXQUFXO0lBQ1gsV0FBVztJQUNYLFdBQVc7SUFDWCxPQUFPO0lBQ1AsTUFBTTtJQUNOLFdBQVc7SUFDWCxXQUFXO0lBQ1gsUUFBUTtJQUNSLFdBQVc7SUFDWCxPQUFPO0lBQ1AsUUFBUTtJQUNSLFVBQVU7SUFDVixPQUFPO0lBQ1AsV0FBVztJQUNYLFFBQVE7SUFDUixXQUFXO0lBQ1gsV0FBVztJQUNYLE9BQU87SUFDUCxTQUFTO0lBQ1QsU0FBUztJQUNULFFBQVE7SUFDUixTQUFTO0lBQ1QsV0FBVztJQUNYLFFBQVE7SUFDUixTQUFTO0lBQ1QsV0FBVztJQUNYLE9BQU87SUFDUCxXQUFXO0lBQ1gsT0FBTztJQUNQLFFBQVE7SUFDUixVQUFVO0lBQ1YsU0FBUztJQUNULFNBQVM7SUFDVCxVQUFVO0lBQ1YsT0FBTztJQUNQLFNBQVM7SUFDVCxPQUFPO0lBQ1AsUUFBUTtJQUNSLFNBQVM7SUFDVCxTQUFTO0lBQ1QsUUFBUTtJQUNSLFVBQVU7SUFDVixTQUFTO0lBQ1QsVUFBVTtJQUNWLFVBQVU7SUFDVixTQUFTO0lBQ1QsVUFBVTtJQUNWLFdBQVc7SUFDWCxXQUFXO0lBQ1gsVUFBVTtJQUNWLFVBQVU7SUFDVixRQUFRO0lBQ1IsU0FBUztJQUNULFdBQVc7SUFDWCxXQUFXO0lBQ1gsU0FBUztJQUNULFVBQVU7SUFDVixXQUFXO0lBQ1gsVUFBVTtJQUNWLFNBQVM7SUFDVCxTQUFTO0lBQ1QsVUFBVTtJQUNWLFNBQVM7SUFDVCxXQUFXO0lBQ1gsVUFBVTtJQUNWLE9BQU87SUFDUCxVQUFVO0lBQ1YsT0FBTztJQUNQLFFBQVE7SUFDUixXQUFXO0lBQ1gsUUFBUTtJQUNSLFVBQVU7SUFDVixXQUFXO0lBQ1gsU0FBUztJQUNULE1BQU07SUFDTixNQUFNO0lBQ04sTUFBTTtJQUNOLE1BQU07SUFDTixNQUFNO0lBQ04sT0FBTztJQUNQLE1BQU07SUFDTixTQUFTO0lBQ1QsVUFBVTtJQUNWLFFBQVE7SUFDUixNQUFNO0lBQ04sV0FBVztJQUNYLFNBQVM7SUFDVCxPQUFPO0lBQ1AsS0FBSztJQUNMLE1BQU07SUFDTixNQUFNO0lBQ04sTUFBTTtJQUNOLFNBQVM7SUFDVCxTQUFTO0lBQ1QsVUFBVTtJQUNWLFdBQVc7SUFDWCxRQUFRO0lBQ1IsT0FBTztJQUNQLFFBQVE7SUFDUixPQUFPO0lBQ1AsUUFBUTtJQUNSLE9BQU87SUFDUCxRQUFRO0lBQ1IsUUFBUTtJQUNSLE9BQU87SUFDUCxRQUFRO0lBQ1IsVUFBVTtJQUNWLE9BQU87SUFDUCxNQUFNO0lBQ04sV0FBVztJQUNYLFNBQVM7SUFDVCxXQUFXO0lBQ1gsU0FBUztJQUNULFFBQVE7SUFDUixNQUFNO0lBQ04sTUFBTTtJQUNOLFNBQVM7SUFDVCxNQUFNO0lBQ04sUUFBUTtJQUNSLFFBQVE7SUFDUixPQUFPO0lBQ1AsVUFBVTtJQUNWLFVBQVU7SUFDVixTQUFTO0lBQ1QsVUFBVTtJQUNWLFdBQVc7SUFDWCxNQUFNO0lBQ04sUUFBUTtJQUNSLFVBQVU7SUFDVixVQUFVO0lBQ1YsUUFBUTtJQUNSLFdBQVc7SUFDWCxVQUFVO0lBQ1YsU0FBUztJQUNULFFBQVE7SUFDUixVQUFVO0lBQ1YsT0FBTztJQUNQLE1BQU07SUFDTixRQUFRO0lBQ1IsVUFBVTtJQUNWLFVBQVU7SUFDVixRQUFRO0lBQ1IsU0FBUztJQUNULFFBQVE7SUFDUixTQUFTO0lBQ1QsVUFBVTtJQUNWLFFBQVE7SUFDUixRQUFRO0lBQ1IsU0FBUztJQUNULFdBQVc7SUFDWCxTQUFTO0lBQ1QsU0FBUztJQUNULE9BQU87SUFDUCxRQUFRO0lBQ1IsVUFBVTtJQUNWLE9BQU87SUFDUCxTQUFTO0lBQ1QsTUFBTTtJQUNOLFVBQVU7SUFDVixXQUFXO0lBQ1gsU0FBUztJQUNULE9BQU87SUFDUCxRQUFRO0lBQ1IsS0FBSztJQUNMLFVBQVU7SUFDVixRQUFRO0lBQ1IsVUFBVTtJQUNWLFNBQVM7SUFDVCxVQUFVO0lBQ1YsV0FBVztJQUNYLFFBQVE7SUFDUixTQUFTO0lBQ1QsVUFBVTtJQUNWLFdBQVc7SUFDWCxTQUFTO0lBQ1QsVUFBVTtJQUNWLFVBQVU7SUFDVixTQUFTO0lBQ1QsV0FBVztJQUNYLFNBQVM7SUFDVCxRQUFRO0lBQ1IsVUFBVTtJQUNWLFdBQVc7SUFDWCxTQUFTO0lBQ1QsU0FBUztJQUNULFFBQVE7SUFDUixXQUFXO0lBQ1gsV0FBVztJQUNYLFNBQVM7SUFDVCxXQUFXO0lBQ1gsVUFBVTtJQUNWLFdBQVc7SUFDWCxXQUFXO0lBQ1gsUUFBUTtJQUNSLFNBQVM7SUFDVCxVQUFVO0lBQ1YsVUFBVTtJQUNWLFNBQVM7SUFDVCxVQUFVO0lBQ1YsV0FBVztJQUNYLFVBQVU7SUFDVixTQUFTO0lBQ1QsUUFBUTtJQUNSLFNBQVM7SUFDVCxRQUFRO0lBQ1IsV0FBVztJQUNYLFdBQVc7SUFDWCxXQUFXO0lBQ1gsUUFBUTtJQUNSLFNBQVM7SUFDVCxXQUFXO0lBQ1gsU0FBUztJQUNULE9BQU87SUFDUCxTQUFTO0lBQ1QsV0FBVztJQUNYLFNBQVM7SUFDVCxXQUFXO0lBQ1gsV0FBVztJQUNYLFVBQVU7SUFDVixTQUFTO0lBQ1QsUUFBUTtJQUNSLFNBQVM7SUFDVCxTQUFTO0lBQ1QsV0FBVztJQUNYLFNBQVM7SUFDVCxTQUFTO0lBQ1QsVUFBVTtJQUNWLFFBQVE7SUFDUixXQUFXO0lBQ1gsVUFBVTtJQUNWLE9BQU87SUFDUCxRQUFRO0lBQ1IsV0FBVztJQUNYLFNBQVM7SUFDVCxTQUFTO0lBQ1QsUUFBUTtJQUNSLE9BQU87SUFDUCxVQUFVO0lBQ1YsT0FBTztJQUNQLE9BQU87SUFDUCxPQUFPO0lBQ1AsUUFBUTtJQUNSLFFBQVE7SUFDUixVQUFVO0lBQ1YsU0FBUztJQUNULFNBQVM7SUFDVCxXQUFXO0lBQ1gsT0FBTztJQUNQLFdBQVc7SUFDWCxVQUFVO0lBQ1YsVUFBVTtJQUNWLFdBQVc7SUFDWCxPQUFPO0lBQ1AsU0FBUztJQUNULFdBQVc7SUFDWCxTQUFTO0lBQ1QsV0FBVztJQUNYLFNBQVM7SUFDVCxVQUFVO0lBQ1YsV0FBVztJQUNYLFVBQVU7SUFDVixVQUFVO0lBQ1YsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULFdBQVc7SUFDWCxXQUFXO0lBQ1gsV0FBVztJQUNYLFNBQVM7SUFDVCxVQUFVO0lBQ1YsV0FBVztJQUNYLFNBQVM7SUFDVCxXQUFXO0lBQ1gsU0FBUztJQUNULFVBQVU7SUFDVixXQUFXO0lBQ1gsVUFBVTtJQUNWLFdBQVc7SUFDWCxXQUFXO0lBQ1gsV0FBVztJQUNYLFVBQVU7SUFDVixXQUFXO0lBQ1gsVUFBVTtJQUNWLFVBQVU7SUFDVixPQUFPO0lBQ1AsT0FBTztJQUNQLFdBQVc7SUFDWCxRQUFRO0lBQ1IsVUFBVTtJQUNWLFdBQVc7SUFDWCxRQUFRO0lBQ1IsV0FBVztJQUNYLFVBQVU7SUFDVixVQUFVO0lBQ1YsV0FBVztJQUNYLFVBQVU7SUFDVixTQUFTO0lBQ1QsT0FBTztJQUNQLFNBQVM7SUFDVCxXQUFXO0lBQ1gsVUFBVTtJQUNWLFFBQVE7SUFDUixXQUFXO0lBQ1gsV0FBVztJQUNYLFVBQVU7SUFDVixVQUFVO0lBQ1YsT0FBTztJQUNQLFVBQVU7SUFDVixRQUFRO0lBQ1IsUUFBUTtJQUNSLFVBQVU7SUFDVixVQUFVO0lBQ1YsV0FBVztJQUNYLFVBQVU7SUFDVixTQUFTO0lBQ1QsU0FBUztJQUNULFdBQVc7SUFDWCxXQUFXO0lBQ1gsU0FBUztJQUNULFNBQVM7SUFDVCxVQUFVO0lBQ1YsV0FBVztJQUNYLE9BQU87SUFDUCxRQUFRO0lBQ1IsT0FBTztJQUNQLFdBQVc7SUFDWCxPQUFPO0lBQ1AsU0FBUztJQUNULEtBQUs7SUFDTCxTQUFTO0lBQ1QsUUFBUTtJQUNSLFdBQVc7SUFDWCxRQUFRO0lBQ1IsUUFBUTtJQUNSLEtBQUs7SUFDTCxNQUFNO0lBQ04sV0FBVztJQUNYLE1BQU07SUFDTixTQUFTO0lBQ1QsT0FBTztJQUNQLFdBQVc7SUFDWCxNQUFNO0lBQ04sUUFBUTtJQUNSLFFBQVE7SUFDUixPQUFPO0lBQ1AsVUFBVTtJQUNWLFdBQVc7SUFDWCxXQUFXO0lBQ1gsU0FBUztJQUNULFVBQVU7SUFDVixNQUFNO0lBQ04sT0FBTztJQUNQLFFBQVE7SUFDUixPQUFPO0lBQ1AsVUFBVTtJQUNWLFdBQVc7SUFDWCxVQUFVO0lBQ1YsUUFBUTtJQUNSLFVBQVU7SUFDVixXQUFXO0lBQ1gsT0FBTztJQUNQLFNBQVM7SUFDVCxVQUFVO0lBQ1YsUUFBUTtJQUNSLFFBQVE7SUFDUixTQUFTO0lBQ1QsUUFBUTtJQUNSLFFBQVE7SUFDUixVQUFVO0lBQ1YsV0FBVztJQUNYLE1BQU07SUFDTixPQUFPO0lBQ1AsV0FBVztJQUNYLFVBQVU7SUFDVixTQUFTO0lBQ1QsVUFBVTtJQUNWLFVBQVU7SUFDVixXQUFXO0lBQ1gsUUFBUTtJQUNSLFdBQVc7SUFDWCxTQUFTO0lBQ1QsVUFBVTtJQUNWLFNBQVM7SUFDVCxRQUFRO0lBQ1IsT0FBTztJQUNQLFNBQVM7SUFDVCxNQUFNO0lBQ04sUUFBUTtJQUNSLFVBQVU7SUFDVixTQUFTO0lBQ1QsV0FBVztJQUNYLFFBQVE7SUFDUixPQUFPO0lBQ1AsVUFBVTtJQUNWLE9BQU87SUFDUCxVQUFVO0lBQ1YsT0FBTztJQUNQLFNBQVM7SUFDVCxXQUFXO0lBQ1gsV0FBVztJQUNYLFNBQVM7SUFDVCxTQUFTO0lBQ1QsT0FBTztJQUNQLFNBQVM7SUFDVCxTQUFTO0lBQ1QsUUFBUTtJQUNSLFdBQVc7SUFDWCxXQUFXO0lBQ1gsVUFBVTtJQUNWLFNBQVM7SUFDVCxRQUFRO0lBQ1IsT0FBTztJQUNQLFNBQVM7SUFDVCxTQUFTO0lBQ1QsV0FBVztJQUNYLFdBQVc7SUFDWCxXQUFXO0lBQ1gsT0FBTztJQUNQLE9BQU87SUFDUCxPQUFPO0lBQ1AsU0FBUztJQUNULFdBQVc7SUFDWCxPQUFPO0lBQ1AsTUFBTTtJQUNOLFFBQVE7SUFDUixXQUFXO0lBQ1gsVUFBVTtJQUNWLFdBQVc7SUFDWCxPQUFPO0lBQ1AsT0FBTztJQUNQLE1BQU07SUFDTixRQUFRO0lBQ1IsUUFBUTtJQUNSLE1BQU07SUFDTixRQUFRO0lBQ1IsT0FBTztJQUNQLFFBQVE7SUFDUixVQUFVO0lBQ1YsV0FBVztJQUNYLFVBQVU7SUFDVixXQUFXO0lBQ1gsVUFBVTtJQUNWLE9BQU87SUFDUCxRQUFRO0lBQ1IsUUFBUTtJQUNSLE1BQU07SUFDTixNQUFNO0lBQ04sUUFBUTtJQUNSLFFBQVE7SUFDUixTQUFTO0lBQ1QsUUFBUTtJQUNSLFNBQVM7SUFDVCxTQUFTO0lBQ1QsVUFBVTtJQUNWLFNBQVM7SUFDVCxRQUFRO0lBQ1IsTUFBTTtJQUNOLFFBQVE7SUFDUixPQUFPO0lBQ1AsUUFBUTtJQUNSLFVBQVU7SUFDVixNQUFNO0lBQ04sUUFBUTtJQUNSLE9BQU87SUFDUCxXQUFXO0lBQ1gsUUFBUTtJQUNSLFFBQVE7SUFDUixRQUFRO0lBQ1IsU0FBUztJQUNULFFBQVE7SUFDUixTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFDVCxPQUFPO0lBQ1AsTUFBTTtJQUNOLFFBQVE7SUFDUixRQUFRO0lBQ1IsTUFBTTtJQUNOLFNBQVM7SUFDVCxRQUFRO0lBQ1IsT0FBTztJQUNQLFFBQVE7SUFDUixRQUFRO0lBQ1IsU0FBUztJQUNULFdBQVc7SUFDWCxVQUFVO0lBQ1YsT0FBTztJQUNQLFdBQVc7SUFDWCxVQUFVO0lBQ1YsVUFBVTtJQUNWLFNBQVM7SUFDVCxVQUFVO0lBQ1YsTUFBTTtJQUNOLFdBQVc7SUFDWCxVQUFVO0lBQ1YsU0FBUztJQUNULFdBQVc7SUFDWCxXQUFXO0lBQ1gsV0FBVztJQUNYLFVBQVU7SUFDVixRQUFRO0lBQ1IsVUFBVTtJQUNWLFVBQVU7SUFDVixVQUFVO0lBQ1YsU0FBUztJQUNULFdBQVc7SUFDWCxRQUFRO0lBQ1IsT0FBTztJQUNQLFNBQVM7SUFDVCxRQUFRO0lBQ1IsUUFBUTtJQUNSLFNBQVM7SUFDVCxRQUFRO0lBQ1IsU0FBUztJQUNULFNBQVM7SUFDVCxVQUFVO0lBQ1YsVUFBVTtJQUNWLFFBQVE7SUFDUixRQUFRO0lBQ1IsV0FBVztJQUNYLFFBQVE7SUFDUixRQUFRO0lBQ1IsUUFBUTtJQUNSLFFBQVE7SUFDUixXQUFXO0lBQ1gsV0FBVztJQUNYLFNBQVM7SUFDVCxRQUFRO0lBQ1IsVUFBVTtJQUNWLFNBQVM7SUFDVCxVQUFVO0lBQ1YsV0FBVztJQUNYLFNBQVM7SUFDVCxXQUFXO0lBQ1gsV0FBVztJQUNYLFFBQVE7SUFDUixXQUFXO0lBQ1gsU0FBUztJQUNULFdBQVc7SUFDWCxXQUFXO0lBQ1gsV0FBVztJQUNYLFFBQVE7SUFDUixRQUFRO0lBQ1IsU0FBUztJQUNULFFBQVE7SUFDUixVQUFVO0lBQ1YsVUFBVTtJQUNWLFFBQVE7SUFDUixXQUFXO0lBQ1gsV0FBVztJQUNYLFNBQVM7SUFDVCxVQUFVO0lBQ1YsVUFBVTtJQUNWLFdBQVc7SUFDWCxVQUFVO0lBQ1YsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0lBQ1QsV0FBVztJQUNYLFdBQVc7SUFDWCxTQUFTO0lBQ1QsV0FBVztJQUNYLFFBQVE7SUFDUixXQUFXO0lBQ1gsU0FBUztJQUNULFVBQVU7SUFDVixVQUFVO0lBQ1YsVUFBVTtJQUNWLFdBQVc7SUFDWCxXQUFXO0lBQ1gsUUFBUTtJQUNSLFFBQVE7SUFDUixTQUFTO0lBQ1QsUUFBUTtJQUNSLFVBQVU7SUFDVixVQUFVO0lBQ1YsVUFBVTtJQUNWLFVBQVU7SUFDVixXQUFXO0lBQ1gsU0FBUztJQUNULFNBQVM7SUFDVCxVQUFVO0lBQ1YsU0FBUztJQUNULFNBQVM7SUFDVCxXQUFXO0lBQ1gsUUFBUTtJQUNSLFdBQVc7SUFDWCxXQUFXO0lBQ1gsU0FBUztJQUNULFFBQVE7SUFDUixVQUFVO0lBQ1YsV0FBVztJQUNYLFFBQVE7SUFDUixRQUFRO0lBQ1IsU0FBUztJQUNULFNBQVM7SUFDVCxRQUFRO0lBQ1IsUUFBUTtJQUNSLFFBQVE7SUFDUixVQUFVO0lBQ1YsV0FBVztJQUNYLFVBQVU7SUFDVixTQUFTO0lBQ1QsV0FBVztJQUNYLFNBQVM7SUFDVCxTQUFTO0lBQ1QsVUFBVTtJQUNWLFdBQVc7SUFDWCxPQUFPO0lBQ1AsUUFBUTtJQUNSLFFBQVE7SUFDUixXQUFXO0lBQ1gsV0FBVztJQUNYLFNBQVM7SUFDVCxXQUFXO0lBQ1gsU0FBUztJQUNULFdBQVc7SUFDWCxRQUFRO0lBQ1IsVUFBVTtJQUNWLFNBQVM7SUFDVCxXQUFXO0lBQ1gsV0FBVztJQUNYLFNBQVM7SUFDVCxVQUFVO0lBQ1YsVUFBVTtJQUNWLE9BQU87SUFDUCxPQUFPO0lBQ1AsU0FBUztJQUNULFNBQVM7SUFDVCxXQUFXO0lBQ1gsVUFBVTtJQUNWLFVBQVU7SUFDVixVQUFVO0lBQ1YsU0FBUztJQUNULE9BQU87SUFDUCxTQUFTO0lBQ1QsV0FBVztJQUNYLFNBQVM7SUFDVCxRQUFRO0lBQ1IsUUFBUTtJQUNSLFFBQVE7SUFDUixVQUFVO0lBQ1YsUUFBUTtJQUNSLFdBQVc7SUFDWCxNQUFNO0lBQ04sUUFBUTtJQUNSLFFBQVE7SUFDUixTQUFTO0lBQ1QsU0FBUztJQUNULFVBQVU7SUFDVixRQUFRO0lBQ1IsVUFBVTtJQUNWLFVBQVU7SUFDVixXQUFXO0lBQ1gsV0FBVztJQUNYLE9BQU87SUFDUCxTQUFTO0lBQ1QsV0FBVztJQUNYLFFBQVE7SUFDUixTQUFTO0lBQ1QsUUFBUTtJQUNSLFdBQVc7SUFDWCxTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFDVCxVQUFVO0lBQ1YsUUFBUTtJQUNSLFVBQVU7SUFDVixXQUFXO0lBQ1gsV0FBVztJQUNYLFVBQVU7SUFDVixXQUFXO0lBQ1gsV0FBVztJQUNYLFNBQVM7SUFDVCxTQUFTO0lBQ1QsVUFBVTtJQUNWLFVBQVU7SUFDVixXQUFXO0lBQ1gsVUFBVTtJQUNWLFFBQVE7SUFDUixRQUFRO0lBQ1IsUUFBUTtJQUNSLFVBQVU7SUFDVixTQUFTO0lBQ1QsUUFBUTtJQUNSLFNBQVM7SUFDVCxXQUFXO0lBQ1gsV0FBVztJQUNYLFNBQVM7SUFDVCxRQUFRO0lBQ1IsUUFBUTtJQUNSLFVBQVU7SUFDVixXQUFXO0lBQ1gsUUFBUTtJQUNSLFVBQVU7SUFDVixVQUFVO0lBQ1YsUUFBUTtJQUNSLFVBQVU7SUFDVixTQUFTO0lBQ1QsUUFBUTtJQUNSLFNBQVM7SUFDVCxPQUFPO0lBQ1AsVUFBVTtJQUNWLFFBQVE7SUFDUixXQUFXO0lBQ1gsUUFBUTtJQUNSLFdBQVc7SUFDWCxXQUFXO0lBQ1gsU0FBUztJQUNULFNBQVM7SUFDVCxVQUFVO0lBQ1YsV0FBVztJQUNYLFdBQVc7SUFDWCxXQUFXO0lBQ1gsTUFBTTtJQUNOLFNBQVM7SUFDVCxXQUFXO0lBQ1gsV0FBVztJQUNYLFdBQVc7SUFDWCxXQUFXO0lBQ1gsV0FBVztJQUNYLFdBQVc7SUFDWCxXQUFXO0lBQ1gsU0FBUztJQUNULFNBQVM7SUFDVCxXQUFXO0lBQ1gsU0FBUztJQUNULE9BQU87SUFDUCxRQUFRO0lBQ1IsVUFBVTtJQUNWLFNBQVM7SUFDVCxRQUFRO0lBQ1IsVUFBVTtJQUNWLFVBQVU7SUFDVixVQUFVO0lBQ1YsVUFBVTtJQUNWLFFBQVE7SUFDUixRQUFRO0lBQ1IsT0FBTztJQUNQLFNBQVM7SUFDVCxTQUFTO0lBQ1QsV0FBVztJQUNYLFdBQVc7SUFDWCxXQUFXO0lBQ1gsVUFBVTtJQUNWLFVBQVU7SUFDVixTQUFTO0lBQ1QsVUFBVTtJQUNWLFdBQVc7SUFDWCxXQUFXO0lBQ1gsV0FBVztJQUNYLFFBQVE7SUFDUixVQUFVO0lBQ1YsVUFBVTtJQUNWLFVBQVU7SUFDVixVQUFVO0lBQ1YsUUFBUTtJQUNSLFVBQVU7SUFDVixTQUFTO0lBQ1QsVUFBVTtJQUNWLFFBQVE7SUFDUixRQUFRO0lBQ1IsVUFBVTtJQUNWLFdBQVc7SUFDWCxXQUFXO0lBQ1gsUUFBUTtJQUNSLFVBQVU7SUFDVixXQUFXO0lBQ1gsUUFBUTtJQUNSLFdBQVc7SUFDWCxXQUFXO0lBQ1gsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULFVBQVU7SUFDVixRQUFRO0lBQ1IsUUFBUTtJQUNSLFVBQVU7SUFDVixTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0lBQ1QsV0FBVztJQUNYLFdBQVc7SUFDWCxPQUFPO0lBQ1AsUUFBUTtJQUNSLFNBQVM7SUFDVCxRQUFRO0lBQ1IsU0FBUztJQUNULFNBQVM7SUFDVCxVQUFVO0lBQ1YsT0FBTztJQUNQLFFBQVE7SUFDUixTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFDVCxRQUFRO0lBQ1IsU0FBUztJQUNULFdBQVc7SUFDWCxVQUFVO0lBQ1YsVUFBVTtJQUNWLFNBQVM7SUFDVCxXQUFXO0lBQ1gsV0FBVztJQUNYLFFBQVE7SUFDUixXQUFXO0lBQ1gsUUFBUTtJQUNSLFVBQVU7SUFDVixTQUFTO0lBQ1QsV0FBVztJQUNYLFNBQVM7SUFDVCxTQUFTO0lBQ1QsVUFBVTtJQUNWLFdBQVc7SUFDWCxRQUFRO0lBQ1IsUUFBUTtJQUNSLFVBQVU7SUFDVixXQUFXO0lBQ1gsUUFBUTtJQUNSLFFBQVE7SUFDUixRQUFRO0lBQ1IsUUFBUTtJQUNSLFFBQVE7SUFDUixRQUFRO0lBQ1IsUUFBUTtJQUNSLFNBQVM7SUFDVCxPQUFPO0lBQ1AsUUFBUTtJQUNSLFNBQVM7SUFDVCxNQUFNO0lBQ04sUUFBUTtJQUNSLFFBQVE7SUFDUixVQUFVO0lBQ1YsU0FBUztJQUNULFNBQVM7SUFDVCxVQUFVO0lBQ1YsUUFBUTtJQUNSLE1BQU07SUFDTixRQUFRO0lBQ1IsU0FBUztJQUNULE1BQU07SUFDTixTQUFTO0lBQ1QsT0FBTztJQUNQLE9BQU87SUFDUCxTQUFTO0lBQ1QsUUFBUTtJQUNSLE1BQU07SUFDTixNQUFNO0lBQ04sT0FBTztJQUNQLFNBQVM7SUFDVCxNQUFNO0lBQ04sU0FBUztJQUNULFVBQVU7SUFDVixVQUFVO0lBQ1YsU0FBUztJQUNULFFBQVE7SUFDUixVQUFVO0lBQ1YsU0FBUztJQUNULE1BQU07SUFDTixRQUFRO0lBQ1IsTUFBTTtJQUNOLFNBQVM7SUFDVCxTQUFTO0lBQ1QsT0FBTztJQUNQLE9BQU87SUFDUCxXQUFXO0lBQ1gsVUFBVTtJQUNWLFdBQVc7SUFDWCxXQUFXO0lBQ1gsU0FBUztJQUNULFVBQVU7SUFDVixRQUFRO0lBQ1IsU0FBUztJQUNULE9BQU87SUFDUCxTQUFTO0lBQ1QsTUFBTTtJQUNOLE9BQU87SUFDUCxVQUFVO0lBQ1YsUUFBUTtJQUNSLFVBQVU7SUFDVixRQUFRO0lBQ1IsUUFBUTtJQUNSLFVBQVU7SUFDVixXQUFXO0lBQ1gsU0FBUztJQUNULFVBQVU7SUFDVixXQUFXO0lBQ1gsVUFBVTtJQUNWLE9BQU87SUFDUCxPQUFPO0lBQ1AsT0FBTztJQUNQLE1BQU07SUFDTixNQUFNO0lBQ04sUUFBUTtJQUNSLFFBQVE7SUFDUixNQUFNO0lBQ04sUUFBUTtJQUNSLFNBQVM7SUFDVCxTQUFTO0lBQ1QsVUFBVTtJQUNWLFVBQVU7SUFDVixVQUFVO0lBQ1YsV0FBVztJQUNYLFNBQVM7SUFDVCxXQUFXO0lBQ1gsU0FBUztJQUNULFNBQVM7SUFDVCxPQUFPO0lBQ1AsUUFBUTtJQUNSLE9BQU87SUFDUCxRQUFRO0lBQ1IsUUFBUTtJQUNSLFNBQVM7SUFDVCxRQUFRO0lBQ1IsU0FBUztJQUNULE1BQU07SUFDTixRQUFRO0lBQ1IsUUFBUTtJQUNSLEtBQUs7SUFDTCxRQUFRO0lBQ1IsTUFBTTtJQUNOLFFBQVE7SUFDUixVQUFVO0lBQ1YsU0FBUztJQUNULE9BQU87SUFDUCxXQUFXO0lBQ1gsU0FBUztJQUNULFFBQVE7SUFDUixTQUFTO0lBQ1QsT0FBTztJQUNQLE1BQU07SUFDTixRQUFRO0lBQ1IsU0FBUztJQUNULE9BQU87SUFDUCxNQUFNO0lBQ04sTUFBTTtJQUNOLE1BQU07SUFDTixLQUFLO0lBQ0wsU0FBUztJQUNULFVBQVU7SUFDVixXQUFXO0lBQ1gsUUFBUTtJQUNSLFdBQVc7SUFDWCxRQUFRO0lBQ1IsV0FBVztJQUNYLFNBQVM7SUFDVCxVQUFVO0lBQ1YsT0FBTztJQUNQLFNBQVM7SUFDVCxRQUFRO0lBQ1IsV0FBVztJQUNYLFdBQVc7SUFDWCxRQUFRO0lBQ1IsVUFBVTtJQUNWLFNBQVM7SUFDVCxNQUFNO0lBQ04sTUFBTTtJQUNOLFNBQVM7SUFDVCxPQUFPO0lBQ1AsTUFBTTtJQUNOLE9BQU87SUFDUCxNQUFNO0lBQ04sT0FBTztJQUNQLFFBQVE7SUFDUixVQUFVO0lBQ1YsUUFBUTtJQUNSLFFBQVE7SUFDUixPQUFPO0lBQ1AsUUFBUTtJQUNSLE9BQU87SUFDUCxNQUFNO0lBQ04sVUFBVTtJQUNWLFFBQVE7SUFDUixTQUFTO0lBQ1QsV0FBVztJQUNYLFdBQVc7SUFDWCxNQUFNO0lBQ04sUUFBUTtJQUNSLFVBQVU7SUFDVixVQUFVO0lBQ1YsVUFBVTtJQUNWLFdBQVc7SUFDWCxRQUFRO0lBQ1IsU0FBUztJQUNULFVBQVU7SUFDVixTQUFTO0lBQ1QsV0FBVztJQUNYLFNBQVM7SUFDVCxRQUFRO0lBQ1IsVUFBVTtJQUNWLFNBQVM7SUFDVCxTQUFTO0lBQ1QsV0FBVztJQUNYLFNBQVM7SUFDVCxXQUFXO0lBQ1gsV0FBVztJQUNYLFVBQVU7SUFDVixPQUFPO0lBQ1AsVUFBVTtJQUNWLFdBQVc7SUFDWCxNQUFNO0lBQ04sT0FBTztJQUNQLFNBQVM7SUFDVCxXQUFXO0lBQ1gsT0FBTztJQUNQLFNBQVM7SUFDVCxXQUFXO0lBQ1gsU0FBUztJQUNULE1BQU07SUFDTixXQUFXO0lBQ1gsT0FBTztJQUNQLFNBQVM7SUFDVCxVQUFVO0lBQ1YsT0FBTztJQUNQLFdBQVc7SUFDWCxXQUFXO0lBQ1gsU0FBUztJQUNULFVBQVU7SUFDVixVQUFVO0lBQ1YsV0FBVztJQUNYLE9BQU87SUFDUCxPQUFPO0lBQ1AsUUFBUTtJQUNSLFNBQVM7SUFDVCxPQUFPO0lBQ1AsU0FBUztJQUNULFFBQVE7SUFDUixPQUFPO0lBQ1AsV0FBVztJQUNYLEtBQUs7SUFDTCxTQUFTO0lBQ1QsUUFBUTtJQUNSLFNBQVM7SUFDVCxVQUFVO0lBQ1YsT0FBTztJQUNQLFNBQVM7SUFDVCxVQUFVO0lBQ1YsU0FBUztJQUNULFVBQVU7SUFDVixNQUFNO0lBQ04sU0FBUztJQUNULFNBQVM7SUFDVCxVQUFVO0lBQ1YsT0FBTztJQUNQLFdBQVc7SUFDWCxRQUFRO0lBQ1IsVUFBVTtJQUNWLFdBQVc7SUFDWCxRQUFRO0lBQ1IsT0FBTztJQUNQLFNBQVM7SUFDVCxXQUFXO0lBQ1gsVUFBVTtJQUNWLE9BQU87SUFDUCxXQUFXO0lBQ1gsUUFBUTtJQUNSLFVBQVU7SUFDVixXQUFXO0lBQ1gsUUFBUTtJQUNSLFVBQVU7SUFDVixXQUFXO0lBQ1gsVUFBVTtJQUNWLFNBQVM7SUFDVCxTQUFTO0lBQ1QsV0FBVztJQUNYLE9BQU87SUFDUCxPQUFPO0lBQ1AsVUFBVTtJQUNWLE9BQU87SUFDUCxPQUFPO0lBQ1AsU0FBUztJQUNULE9BQU87SUFDUCxRQUFRO0lBQ1IsV0FBVztJQUNYLFdBQVc7SUFDWCxRQUFRO0lBQ1IsV0FBVztJQUNYLFFBQVE7SUFDUixTQUFTO0lBQ1QsT0FBTztJQUNQLFVBQVU7SUFDVixRQUFRO0lBQ1IsV0FBVztJQUNYLFNBQVM7SUFDVCxVQUFVO0lBQ1YsVUFBVTtJQUNWLFFBQVE7SUFDUixVQUFVO0lBQ1YsVUFBVTtJQUNWLFVBQVU7SUFDVixXQUFXO0lBQ1gsV0FBVztJQUNYLE9BQU87SUFDUCxTQUFTO0lBQ1QsU0FBUztJQUNULFFBQVE7SUFDUixVQUFVO0lBQ1YsUUFBUTtJQUNSLFVBQVU7SUFDVixXQUFXO0lBQ1gsUUFBUTtJQUNSLFFBQVE7SUFDUixTQUFTO0lBQ1QsV0FBVztJQUNYLFVBQVU7SUFDVixVQUFVO0lBQ1YsU0FBUztJQUNULFNBQVM7SUFDVCxVQUFVO0lBQ1YsT0FBTztJQUNQLE9BQU87SUFDUCxVQUFVO0lBQ1YsV0FBVztJQUNYLFFBQVE7SUFDUixTQUFTO0lBQ1QsVUFBVTtJQUNWLFdBQVc7SUFDWCxXQUFXO0lBQ1gsUUFBUTtJQUNSLFNBQVM7SUFDVCxRQUFRO0lBQ1IsV0FBVztJQUNYLFFBQVE7SUFDUixTQUFTO0lBQ1QsVUFBVTtJQUNWLFVBQVU7SUFDVixPQUFPO0lBQ1AsUUFBUTtJQUNSLFVBQVU7SUFDVixVQUFVO0lBQ1YsVUFBVTtJQUNWLFFBQVE7SUFDUixVQUFVO0lBQ1YsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0lBQ1QsUUFBUTtJQUNSLFVBQVU7SUFDVixXQUFXO0lBQ1gsV0FBVztJQUNYLFVBQVU7SUFDVixNQUFNO0lBQ04sU0FBUztJQUNULFVBQVU7SUFDVixVQUFVO0lBQ1YsV0FBVztJQUNYLFdBQVc7SUFDWCxTQUFTO0lBQ1QsVUFBVTtJQUNWLFdBQVc7SUFDWCxRQUFRO0lBQ1IsU0FBUztJQUNULE1BQU07SUFDTixRQUFRO0lBQ1IsVUFBVTtJQUNWLFdBQVc7SUFDWCxXQUFXO0lBQ1gsV0FBVztJQUNYLFdBQVc7SUFDWCxVQUFVO0lBQ1YsT0FBTztJQUNQLFdBQVc7SUFDWCxRQUFRO0lBQ1IsUUFBUTtJQUNSLFFBQVE7SUFDUixVQUFVO0lBQ1YsV0FBVztJQUNYLFFBQVE7SUFDUixRQUFRO0lBQ1IsV0FBVztJQUNYLFNBQVM7SUFDVCxVQUFVO0lBQ1YsT0FBTztJQUNQLFNBQVM7SUFDVCxTQUFTO0lBQ1QsUUFBUTtJQUNSLFVBQVU7SUFDVixTQUFTO0lBQ1QsU0FBUztJQUNULFFBQVE7SUFDUixVQUFVO0lBQ1YsT0FBTztJQUNQLFdBQVc7SUFDWCxXQUFXO0lBQ1gsU0FBUztJQUNULFNBQVM7SUFDVCxVQUFVO0lBQ1YsUUFBUTtJQUNSLE9BQU87SUFDUCxRQUFRO0lBQ1IsU0FBUztJQUNULFdBQVc7SUFDWCxTQUFTO0lBQ1QsUUFBUTtJQUNSLE9BQU87SUFDUCxPQUFPO0lBQ1AsVUFBVTtJQUNWLFNBQVM7SUFDVCxXQUFXO0lBQ1gsU0FBUztJQUNULE9BQU87SUFDUCxPQUFPO0lBQ1AsU0FBUztJQUNULFNBQVM7SUFDVCxPQUFPO0lBQ1AsU0FBUztJQUNULFVBQVU7SUFDVixPQUFPO0lBQ1AsUUFBUTtJQUNSLE9BQU87SUFDUCxTQUFTO0lBQ1QsT0FBTztJQUNQLFdBQVc7SUFDWCxTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFDVCxXQUFXO0lBQ1gsT0FBTztJQUNQLFFBQVE7SUFDUixNQUFNO0lBQ04sT0FBTztJQUNQLE9BQU87SUFDUCxPQUFPO0lBQ1AsT0FBTztJQUNQLFNBQVM7SUFDVCxRQUFRO0lBQ1IsVUFBVTtJQUNWLFFBQVE7SUFDUixRQUFRO0lBQ1IsU0FBUztJQUNULFVBQVU7SUFDVixXQUFXO0lBQ1gsUUFBUTtJQUNSLFNBQVM7SUFDVCxRQUFRO0lBQ1IsU0FBUztJQUNULE9BQU87SUFDUCxTQUFTO0lBQ1QsV0FBVztJQUNYLFNBQVM7SUFDVCxPQUFPO0lBQ1AsTUFBTTtJQUNOLE9BQU87SUFDUCxXQUFXO0lBQ1gsT0FBTztJQUNQLE9BQU87SUFDUCxVQUFVO0lBQ1YsU0FBUztJQUNULFVBQVU7SUFDVixVQUFVO0lBQ1YsT0FBTztJQUNQLFVBQVU7SUFDVixXQUFXO0lBQ1gsVUFBVTtJQUNWLFNBQVM7SUFDVCxTQUFTO0lBQ1QsV0FBVztJQUNYLFdBQVc7SUFDWCxTQUFTO0lBQ1QsV0FBVztJQUNYLFFBQVE7SUFDUixXQUFXO0lBQ1gsUUFBUTtJQUNSLE9BQU87SUFDUCxPQUFPO0lBQ1AsU0FBUztJQUNULFVBQVU7SUFDVixVQUFVO0lBQ1YsUUFBUTtJQUNSLFVBQVU7SUFDVixTQUFTO0lBQ1QsU0FBUztJQUNULE9BQU87SUFDUCxTQUFTO0lBQ1QsV0FBVztJQUNYLFdBQVc7SUFDWCxVQUFVO0lBQ1YsT0FBTztJQUNQLFFBQVE7SUFDUixVQUFVO0lBQ1YsVUFBVTtJQUNWLFdBQVc7SUFDWCxVQUFVO0lBQ1YsUUFBUTtJQUNSLFFBQVE7SUFDUixRQUFRO0lBQ1IsUUFBUTtJQUNSLFFBQVE7SUFDUixTQUFTO0lBQ1QsVUFBVTtJQUNWLFdBQVc7SUFDWCxRQUFRO0lBQ1IsT0FBTztJQUNQLFFBQVE7SUFDUixVQUFVO0lBQ1YsU0FBUztJQUNULFNBQVM7SUFDVCxXQUFXO0lBQ1gsTUFBTTtJQUNOLE9BQU87SUFDUCxNQUFNO0lBQ04sS0FBSztJQUNMLFNBQVM7SUFDVCxVQUFVO0lBQ1YsU0FBUztJQUNULFFBQVE7SUFDUixRQUFRO0lBQ1IsUUFBUTtJQUNSLE1BQU07SUFDTixTQUFTO0lBQ1QsVUFBVTtJQUNWLFVBQVU7SUFDVixRQUFRO0lBQ1IsUUFBUTtJQUNSLFNBQVM7SUFDVCxNQUFNO0lBQ04sV0FBVztJQUNYLE9BQU87SUFDUCxNQUFNO0lBQ04sTUFBTTtJQUNOLFFBQVE7SUFDUixXQUFXO0lBQ1gsUUFBUTtJQUNSLFdBQVc7SUFDWCxRQUFRO0lBQ1IsVUFBVTtJQUNWLFFBQVE7SUFDUixTQUFTO0lBQ1QsV0FBVztJQUNYLFFBQVE7SUFDUixTQUFTO0lBQ1QsUUFBUTtJQUNSLFVBQVU7SUFDVixVQUFVO0lBQ1YsU0FBUztJQUNULFFBQVE7SUFDUixTQUFTO0lBQ1QsS0FBSztJQUNMLE9BQU87SUFDUCxRQUFRO0lBQ1IsUUFBUTtJQUNSLFFBQVE7SUFDUixTQUFTO0lBQ1QsVUFBVTtJQUNWLFdBQVc7SUFDWCxTQUFTO0lBQ1QsU0FBUztJQUNULE9BQU87SUFDUCxTQUFTO0lBQ1QsVUFBVTtJQUNWLFdBQVc7SUFDWCxTQUFTO0lBQ1QsU0FBUztJQUNULE1BQU07SUFDTixRQUFRO0lBQ1IsUUFBUTtJQUNSLFVBQVU7SUFDVixRQUFRO0lBQ1IsU0FBUztJQUNULFdBQVc7SUFDWCxVQUFVO0lBQ1YsVUFBVTtJQUNWLFNBQVM7SUFDVCxRQUFRO0lBQ1IsUUFBUTtJQUNSLFFBQVE7SUFDUixNQUFNO0lBQ04sT0FBTztJQUNQLE9BQU87SUFDUCxPQUFPO0lBQ1AsUUFBUTtJQUNSLFNBQVM7SUFDVCxTQUFTO0lBQ1QsVUFBVTtJQUNWLFNBQVM7SUFDVCxTQUFTO0lBQ1QsVUFBVTtJQUNWLFVBQVU7SUFDVixVQUFVO0lBQ1YsVUFBVTtJQUNWLFVBQVU7SUFDVixVQUFVO0lBQ1YsUUFBUTtJQUNSLFdBQVc7SUFDWCxTQUFTO0lBQ1QsVUFBVTtJQUNWLFVBQVU7SUFDVixPQUFPO0lBQ1AsU0FBUztJQUNULFVBQVU7SUFDVixVQUFVO0lBQ1YsU0FBUztJQUNULE9BQU87SUFDUCxXQUFXO0lBQ1gsU0FBUztJQUNULE1BQU07SUFDTixTQUFTO0lBQ1QsU0FBUztJQUNULFVBQVU7SUFDVixXQUFXO0lBQ1gsUUFBUTtJQUNSLE9BQU87SUFDUCxNQUFNO0lBQ04sU0FBUztJQUNULE9BQU87SUFDUCxVQUFVO0lBQ1YsV0FBVztJQUNYLFNBQVM7SUFDVCxVQUFVO0lBQ1YsT0FBTztJQUNQLFNBQVM7SUFDVCxNQUFNO0lBQ04sTUFBTTtJQUNOLE9BQU87SUFDUCxPQUFPO0lBQ1AsT0FBTztJQUNQLFFBQVE7SUFDUixPQUFPO0lBQ1AsV0FBVztJQUNYLFFBQVE7SUFDUixRQUFRO0lBQ1IsU0FBUztJQUNULE9BQU87SUFDUCxRQUFRO0lBQ1IsV0FBVztJQUNYLFNBQVM7SUFDVCxVQUFVO0lBQ1YsV0FBVztJQUNYLFVBQVU7SUFDVixVQUFVO0lBQ1YsT0FBTztJQUNQLFVBQVU7SUFDVixXQUFXO0lBQ1gsUUFBUTtJQUNSLE1BQU07SUFDTixNQUFNO0lBQ04sUUFBUTtJQUNSLFVBQVU7SUFDVixRQUFRO0lBQ1IsUUFBUTtJQUNSLFNBQVM7SUFDVCxVQUFVO0lBQ1YsUUFBUTtJQUNSLE1BQU07SUFDTixXQUFXO0lBQ1gsU0FBUztJQUNULFFBQVE7SUFDUixNQUFNO0lBQ04sTUFBTTtJQUNOLE9BQU87SUFDUCxPQUFPO0lBQ1AsS0FBSztJQUNMLE9BQU87SUFDUCxTQUFTO0lBQ1QsV0FBVztJQUNYLFNBQVM7SUFDVCxVQUFVO0lBQ1YsU0FBUztJQUNULE9BQU87SUFDUCxVQUFVO0lBQ1YsT0FBTztJQUNQLFdBQVc7SUFDWCxPQUFPO0lBQ1AsT0FBTztJQUNQLE9BQU87SUFDUCxTQUFTO0lBQ1QsT0FBTztJQUNQLE1BQU07SUFDTixRQUFRO0lBQ1IsV0FBVztJQUNYLFdBQVc7SUFDWCxTQUFTO0lBQ1QsT0FBTztJQUNQLFNBQVM7SUFDVCxRQUFRO0lBQ1IsU0FBUztJQUNULFFBQVE7SUFDUixRQUFRO0lBQ1IsVUFBVTtJQUNWLFdBQVc7SUFDWCxRQUFRO0lBQ1IsVUFBVTtJQUNWLE9BQU87SUFDUCxTQUFTO0lBQ1QsU0FBUztJQUNULE1BQU07SUFDTixPQUFPO0lBQ1AsT0FBTztJQUNQLFFBQVE7SUFDUixPQUFPO0lBQ1AsT0FBTztJQUNQLFFBQVE7SUFDUixVQUFVO0lBQ1YsT0FBTztJQUNQLE9BQU87SUFDUCxTQUFTO0lBQ1QsVUFBVTtJQUNWLFFBQVE7SUFDUixTQUFTO0lBQ1QsUUFBUTtJQUNSLE9BQU87SUFDUCxTQUFTO0lBQ1QsU0FBUztJQUNULE9BQU87SUFDUCxPQUFPO0lBQ1AsVUFBVTtJQUNWLFdBQVc7SUFDWCxXQUFXO0lBQ1gsU0FBUztJQUNULFdBQVc7SUFDWCxVQUFVO0lBQ1YsVUFBVTtJQUNWLFdBQVc7SUFDWCxXQUFXO0lBQ1gsV0FBVztJQUNYLFVBQVU7SUFDVixTQUFTO0lBQ1QsVUFBVTtJQUNWLFVBQVU7SUFDVixXQUFXO0lBQ1gsVUFBVTtJQUNWLE9BQU87SUFDUCxNQUFNO0lBQ04sT0FBTztJQUNQLFNBQVM7SUFDVCxRQUFRO0lBQ1IsVUFBVTtJQUNWLE9BQU87SUFDUCxXQUFXO0lBQ1gsV0FBVztJQUNYLFVBQVU7SUFDVixXQUFXO0lBQ1gsU0FBUztJQUNULFVBQVU7SUFDVixTQUFTO0lBQ1QsVUFBVTtJQUNWLFFBQVE7SUFDUixXQUFXO0lBQ1gsV0FBVztJQUNYLFVBQVU7SUFDVixXQUFXO0lBQ1gsUUFBUTtJQUNSLE9BQU87SUFDUCxXQUFXO0lBQ1gsU0FBUztJQUNULFVBQVU7SUFDVixXQUFXO0lBQ1gsU0FBUztJQUNULFVBQVU7SUFDVixPQUFPO0lBQ1AsTUFBTTtJQUNOLFFBQVE7SUFDUixXQUFXO0lBQ1gsUUFBUTtJQUNSLFFBQVE7SUFDUixPQUFPO0lBQ1AsUUFBUTtJQUNSLE9BQU87SUFDUCxPQUFPO0lBQ1AsU0FBUztJQUNULFFBQVE7SUFDUixTQUFTO0lBQ1QsU0FBUztJQUNULFVBQVU7SUFDVixTQUFTO0lBQ1QsVUFBVTtJQUNWLE9BQU87SUFDUCxRQUFRO0lBQ1IsVUFBVTtJQUNWLFdBQVc7SUFDWCxTQUFTO0lBQ1QsV0FBVztJQUNYLFVBQVU7SUFDVixXQUFXO0lBQ1gsU0FBUztJQUNULFVBQVU7SUFDVixRQUFRO0lBQ1IsVUFBVTtJQUNWLFVBQVU7SUFDVixRQUFRO0lBQ1IsVUFBVTtJQUNWLFVBQVU7SUFDVixVQUFVO0lBQ1YsU0FBUztJQUNULFVBQVU7SUFDVixTQUFTO0lBQ1QsU0FBUztJQUNULFVBQVU7SUFDVixRQUFRO0lBQ1IsUUFBUTtJQUNSLFdBQVc7SUFDWCxRQUFRO0lBQ1IsUUFBUTtJQUNSLFNBQVM7SUFDVCxPQUFPO0lBQ1AsVUFBVTtJQUNWLFFBQVE7SUFDUixPQUFPO0lBQ1AsT0FBTztJQUNQLE9BQU87SUFDUCxVQUFVO0lBQ1YsUUFBUTtJQUNSLFFBQVE7SUFDUixVQUFVO0lBQ1YsV0FBVztJQUNYLFNBQVM7SUFDVCxTQUFTO0lBQ1QsVUFBVTtJQUNWLFFBQVE7SUFDUixTQUFTO0lBQ1QsUUFBUTtJQUNSLE9BQU87SUFDUCxRQUFRO0lBQ1IsUUFBUTtJQUNSLFFBQVE7SUFDUixPQUFPO0lBQ1AsT0FBTztJQUNQLE9BQU87SUFDUCxRQUFRO0lBQ1IsV0FBVztJQUNYLFdBQVc7SUFDWCxRQUFRO0lBQ1IsUUFBUTtJQUNSLFFBQVE7SUFDUixRQUFRO0lBQ1IsUUFBUTtJQUNSLE1BQU07SUFDTixNQUFNO0lBQ04sTUFBTTtJQUNOLFNBQVM7SUFDVCxVQUFVO0lBQ1YsVUFBVTtJQUNWLE9BQU87SUFDUCxRQUFRO0lBQ1IsVUFBVTtJQUNWLFFBQVE7SUFDUixVQUFVO0lBQ1YsVUFBVTtJQUNWLFdBQVc7SUFDWCxRQUFRO0lBQ1IsVUFBVTtJQUNWLFdBQVc7SUFDWCxXQUFXO0lBQ1gsVUFBVTtJQUNWLFNBQVM7SUFDVCxXQUFXO0lBQ1gsT0FBTztJQUNQLFVBQVU7SUFDVixVQUFVO0lBQ1YsUUFBUTtJQUNSLFFBQVE7SUFDUixRQUFRO0lBQ1IsV0FBVztJQUNYLFNBQVM7SUFDVCxXQUFXO0lBQ1gsV0FBVztJQUNYLFFBQVE7SUFDUixPQUFPO0lBQ1AsU0FBUztJQUNULE9BQU87SUFDUCxPQUFPO0lBQ1AsU0FBUztJQUNULFVBQVU7SUFDVixVQUFVO0lBQ1YsV0FBVztJQUNYLFNBQVM7SUFDVCxVQUFVO0lBQ1YsV0FBVztJQUNYLFdBQVc7SUFDWCxXQUFXO0lBQ1gsVUFBVTtJQUNWLFVBQVU7SUFDVixTQUFTO0lBQ1QsU0FBUztJQUNULE9BQU87SUFDUCxPQUFPO0lBQ1AsT0FBTztJQUNQLFFBQVE7SUFDUixVQUFVO0lBQ1YsV0FBVztJQUNYLFFBQVE7SUFDUixTQUFTO0lBQ1QsVUFBVTtJQUNWLFVBQVU7SUFDVixXQUFXO0lBQ1gsU0FBUztJQUNULE9BQU87SUFDUCxVQUFVO0lBQ1YsU0FBUztJQUNULFdBQVc7SUFDWCxTQUFTO0lBQ1QsVUFBVTtJQUNWLFFBQVE7SUFDUixVQUFVO0lBQ1YsU0FBUztJQUNULFVBQVU7SUFDVixTQUFTO0lBQ1QsV0FBVztJQUNYLFNBQVM7SUFDVCxTQUFTO0lBQ1QsVUFBVTtJQUNWLE9BQU87SUFDUCxPQUFPO0lBQ1AsUUFBUTtJQUNSLFdBQVc7SUFDWCxRQUFRO0lBQ1IsU0FBUztJQUNULFFBQVE7SUFDUixTQUFTO0lBQ1QsV0FBVztJQUNYLFNBQVM7SUFDVCxPQUFPO0lBQ1AsV0FBVztJQUNYLFVBQVU7SUFDVixVQUFVO0lBQ1YsV0FBVztJQUNYLE9BQU87SUFDUCxPQUFPO0lBQ1AsT0FBTztJQUNQLFdBQVc7SUFDWCxVQUFVO0lBQ1YsV0FBVztJQUNYLFdBQVc7SUFDWCxTQUFTO0lBQ1QsTUFBTTtJQUNOLFFBQVE7SUFDUixTQUFTO0lBQ1QsTUFBTTtJQUNOLFFBQVE7SUFDUixTQUFTO0lBQ1QsV0FBVztJQUNYLFdBQVc7SUFDWCxVQUFVO0lBQ1YsV0FBVztJQUNYLFNBQVM7SUFDVCxNQUFNO0lBQ04sT0FBTztJQUNQLFNBQVM7SUFDVCxTQUFTO0lBQ1QsV0FBVztJQUNYLFFBQVE7SUFDUixVQUFVO0lBQ1YsV0FBVztJQUNYLE9BQU87SUFDUCxXQUFXO0lBQ1gsV0FBVztJQUNYLFNBQVM7SUFDVCxVQUFVO0lBQ1YsU0FBUztJQUNULFVBQVU7SUFDVixVQUFVO0lBQ1YsVUFBVTtJQUNWLFFBQVE7SUFDUixVQUFVO0lBQ1YsUUFBUTtJQUNSLFNBQVM7SUFDVCxXQUFXO0lBQ1gsTUFBTTtJQUNOLFFBQVE7SUFDUixPQUFPO0lBQ1AsT0FBTztJQUNQLE9BQU87SUFDUCxPQUFPO0lBQ1AsT0FBTztJQUNQLFdBQVc7SUFDWCxXQUFXO0lBQ1gsV0FBVztJQUNYLFNBQVM7SUFDVCxPQUFPO0lBQ1AsT0FBTztJQUNQLFFBQVE7SUFDUixPQUFPO0lBQ1AsT0FBTztJQUNQLFdBQVc7SUFDWCxXQUFXO0lBQ1gsVUFBVTtJQUNWLFNBQVM7SUFDVCxTQUFTO0lBQ1QsVUFBVTtJQUNWLFdBQVc7SUFDWCxVQUFVO0lBQ1YsU0FBUztJQUNULFdBQVc7SUFDWCxXQUFXO0lBQ1gsT0FBTztJQUNQLE9BQU87SUFDUCxPQUFPO0lBQ1AsVUFBVTtJQUNWLFNBQVM7SUFDVCxVQUFVO0lBQ1YsV0FBVztJQUNYLFVBQVU7SUFDVixVQUFVO0lBQ1YsV0FBVztJQUNYLFdBQVc7SUFDWCxVQUFVO0lBQ1YsVUFBVTtJQUNWLFdBQVc7SUFDWCxVQUFVO0lBQ1YsU0FBUztJQUNULE9BQU87SUFDUCxPQUFPO0lBQ1AsUUFBUTtJQUNSLFFBQVE7SUFDUixRQUFRO0lBQ1IsVUFBVTtJQUNWLFdBQVc7SUFDWCxPQUFPO0lBQ1AsUUFBUTtJQUNSLFNBQVM7SUFDVCxRQUFRO0lBQ1IsVUFBVTtJQUNWLFFBQVE7SUFDUixRQUFRO0lBQ1IsUUFBUTtJQUNSLFFBQVE7SUFDUixVQUFVO0lBQ1YsUUFBUTtJQUNSLFVBQVU7SUFDVixRQUFRO0lBQ1IsUUFBUTtJQUNSLFVBQVU7SUFDVixXQUFXO0lBQ1gsVUFBVTtJQUNWLFdBQVc7SUFDWCxRQUFRO0lBQ1IsV0FBVztJQUNYLFNBQVM7SUFDVCxVQUFVO0lBQ1YsT0FBTztJQUNQLFFBQVE7SUFDUixPQUFPO0lBQ1AsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0lBQ1QsVUFBVTtJQUNWLFFBQVE7SUFDUixPQUFPO0lBQ1AsU0FBUztJQUNULFNBQVM7SUFDVCxRQUFRO0lBQ1IsT0FBTztJQUNQLFNBQVM7SUFDVCxVQUFVO0lBQ1YsUUFBUTtJQUNSLFNBQVM7SUFDVCxXQUFXO0lBQ1gsT0FBTztJQUNQLE9BQU87SUFDUCxTQUFTO0lBQ1QsU0FBUztJQUNULFVBQVU7SUFDVixPQUFPO0lBQ1AsUUFBUTtJQUNSLFVBQVU7SUFDVixRQUFRO0lBQ1IsU0FBUztJQUNULFdBQVc7SUFDWCxTQUFTO0lBQ1QsVUFBVTtJQUNWLFFBQVE7SUFDUixPQUFPO0lBQ1AsV0FBVztJQUNYLFdBQVc7SUFDWCxXQUFXO0lBQ1gsU0FBUztJQUNULFVBQVU7SUFDVixVQUFVO0lBQ1YsVUFBVTtJQUNWLFdBQVc7SUFDWCxTQUFTO0lBQ1QsVUFBVTtJQUNWLFFBQVE7SUFDUixVQUFVO0lBQ1YsU0FBUztJQUNULFdBQVc7SUFDWCxVQUFVO0lBQ1YsV0FBVztJQUNYLFdBQVc7SUFDWCxVQUFVO0lBQ1YsUUFBUTtJQUNSLFNBQVM7SUFDVCxVQUFVO0lBQ1YsV0FBVztJQUNYLFdBQVc7SUFDWCxXQUFXO0lBQ1gsU0FBUztJQUNULFdBQVc7SUFDWCxXQUFXO0lBQ1gsU0FBUztJQUNULFNBQVM7SUFDVCxVQUFVO0lBQ1YsV0FBVztJQUNYLFdBQVc7SUFDWCxTQUFTO0lBQ1QsVUFBVTtJQUNWLFFBQVE7SUFDUixVQUFVO0lBQ1YsVUFBVTtJQUNWLFNBQVM7SUFDVCxRQUFRO0lBQ1IsUUFBUTtJQUNSLFdBQVc7SUFDWCxTQUFTO0lBQ1QsV0FBVztJQUNYLE1BQU07SUFDTixTQUFTO0lBQ1QsUUFBUTtJQUNSLFFBQVE7SUFDUixNQUFNO0lBQ04sVUFBVTtJQUNWLFdBQVc7SUFDWCxTQUFTO0lBQ1QsUUFBUTtJQUNSLFdBQVc7SUFDWCxVQUFVO0lBQ1YsT0FBTztJQUNQLFNBQVM7SUFDVCxPQUFPO0lBQ1AsVUFBVTtJQUNWLFVBQVU7SUFDVixVQUFVO0lBQ1YsUUFBUTtJQUNSLFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULFFBQVE7SUFDUixNQUFNO0lBQ04sUUFBUTtJQUNSLFVBQVU7SUFDVixXQUFXO0lBQ1gsUUFBUTtJQUNSLFdBQVc7SUFDWCxXQUFXO0lBQ1gsV0FBVztJQUNYLFVBQVU7SUFDVixVQUFVO0lBQ1YsVUFBVTtJQUNWLFVBQVU7SUFDVixXQUFXO0lBQ1gsV0FBVztJQUNYLFFBQVE7SUFDUixVQUFVO0lBQ1YsUUFBUTtJQUNSLFNBQVM7SUFDVCxXQUFXO0lBQ1gsU0FBUztJQUNULFdBQVc7SUFDWCxRQUFRO0lBQ1IsVUFBVTtJQUNWLFNBQVM7SUFDVCxXQUFXO0lBQ1gsV0FBVztJQUNYLFFBQVE7SUFDUixTQUFTO0lBQ1QsVUFBVTtJQUNWLFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFDVCxVQUFVO0lBQ1YsU0FBUztJQUNULFdBQVc7SUFDWCxXQUFXO0lBQ1gsVUFBVTtJQUNWLFFBQVE7SUFDUixVQUFVO0lBQ1YsU0FBUztJQUNULFdBQVc7SUFDWCxVQUFVO0lBQ1YsT0FBTztJQUNQLFNBQVM7SUFDVCxTQUFTO0lBQ1QsVUFBVTtJQUNWLFdBQVc7SUFDWCxXQUFXO0lBQ1gsTUFBTTtJQUNOLFdBQVc7SUFDWCxTQUFTO0lBQ1QsV0FBVztJQUNYLE1BQU07SUFDTixVQUFVO0lBQ1YsT0FBTztJQUNQLE1BQU07SUFDTixPQUFPO0lBQ1AsT0FBTztJQUNQLE9BQU87SUFDUCxPQUFPO0lBQ1AsT0FBTztJQUNQLFFBQVE7SUFDUixTQUFTO0lBQ1QsU0FBUztJQUNULFdBQVc7SUFDWCxXQUFXO0lBQ1gsU0FBUztJQUNULFVBQVU7SUFDVixVQUFVO0lBQ1YsVUFBVTtJQUNWLFNBQVM7SUFDVCxVQUFVO0lBQ1YsT0FBTztJQUNQLE9BQU87SUFDUCxRQUFRO0lBQ1IsUUFBUTtJQUNSLFNBQVM7SUFDVCxTQUFTO0lBQ1QsT0FBTztJQUNQLFFBQVE7SUFDUixPQUFPO0lBQ1AsT0FBTztJQUNQLE9BQU87SUFDUCxVQUFVO0lBQ1YsVUFBVTtJQUNWLFdBQVc7SUFDWCxVQUFVO0lBQ1YsU0FBUztJQUNULFNBQVM7SUFDVCxVQUFVO0lBQ1YsU0FBUztJQUNULFVBQVU7SUFDVixVQUFVO0lBQ1YsV0FBVztJQUNYLFdBQVc7SUFDWCxPQUFPO0lBQ1AsUUFBUTtJQUNSLFNBQVM7SUFDVCxTQUFTO0lBQ1QsT0FBTztJQUNQLFVBQVU7SUFDVixRQUFRO0lBQ1IsUUFBUTtJQUNSLFdBQVc7SUFDWCxTQUFTO0lBQ1QsV0FBVztJQUNYLFNBQVM7SUFDVCxRQUFRO0lBQ1IsVUFBVTtJQUNWLE9BQU87SUFDUCxNQUFNO0lBQ04sU0FBUztJQUNULFVBQVU7SUFDVixTQUFTO0lBQ1QsU0FBUztJQUNULFVBQVU7SUFDVixTQUFTO0lBQ1QsV0FBVztJQUNYLEtBQUs7SUFDTCxTQUFTO0lBQ1QsTUFBTTtJQUNOLFFBQVE7SUFDUixRQUFRO0lBQ1IsVUFBVTtJQUNWLE1BQU07SUFDTixPQUFPO0lBQ1AsUUFBUTtJQUNSLFVBQVU7SUFDVixPQUFPO0lBQ1AsUUFBUTtJQUNSLE1BQU07SUFDTixRQUFRO0lBQ1IsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0lBQ1QsVUFBVTtJQUNWLFNBQVM7SUFDVCxVQUFVO0lBQ1YsVUFBVTtJQUNWLFNBQVM7SUFDVCxTQUFTO0lBQ1QsTUFBTTtJQUNOLFdBQVc7SUFDWCxRQUFRO0lBQ1IsUUFBUTtJQUNSLFNBQVM7SUFDVCxPQUFPO0lBQ1AsUUFBUTtJQUNSLFFBQVE7SUFDUixVQUFVO0lBQ1YsTUFBTTtJQUNOLFFBQVE7SUFDUixPQUFPO0lBQ1AsV0FBVztJQUNYLFNBQVM7SUFDVCxPQUFPO0lBQ1AsVUFBVTtJQUNWLFFBQVE7SUFDUixVQUFVO0lBQ1YsUUFBUTtJQUNSLE9BQU87SUFDUCxRQUFRO0lBQ1IsT0FBTztJQUNQLE1BQU07SUFDTixNQUFNO0lBQ04sU0FBUztJQUNULFdBQVc7SUFDWCxNQUFNO0lBQ04sT0FBTztJQUNQLE9BQU87SUFDUCxVQUFVO0lBQ1YsVUFBVTtJQUNWLFNBQVM7SUFDVCxTQUFTO0lBQ1QsV0FBVztJQUNYLE9BQU87SUFDUCxRQUFRO0lBQ1IsVUFBVTtJQUNWLFNBQVM7SUFDVCxTQUFTO0lBQ1QsV0FBVztJQUNYLFVBQVU7SUFDVixVQUFVO0lBQ1YsT0FBTztJQUNQLFNBQVM7SUFDVCxPQUFPO0lBQ1AsT0FBTztJQUNQLFFBQVE7SUFDUixTQUFTO0lBQ1QsVUFBVTtJQUNWLFVBQVU7SUFDVixXQUFXO0lBQ1gsV0FBVztJQUNYLFNBQVM7SUFDVCxVQUFVO0lBQ1YsUUFBUTtJQUNSLE9BQU87SUFDUCxPQUFPO0lBQ1AsT0FBTztJQUNQLFVBQVU7SUFDVixRQUFRO0lBQ1IsUUFBUTtJQUNSLFVBQVU7SUFDVixXQUFXO0lBQ1gsUUFBUTtJQUNSLFFBQVE7SUFDUixRQUFRO0lBQ1IsVUFBVTtJQUNWLFFBQVE7SUFDUixXQUFXO0lBQ1gsUUFBUTtJQUNSLFVBQVU7SUFDVixXQUFXO0lBQ1gsV0FBVztJQUNYLFNBQVM7SUFDVCxVQUFVO0lBQ1YsTUFBTTtJQUNOLE9BQU87SUFDUCxVQUFVO0lBQ1YsVUFBVTtJQUNWLE1BQU07SUFDTixXQUFXO0lBQ1gsU0FBUztJQUNULE9BQU87SUFDUCxPQUFPO0lBQ1AsT0FBTztJQUNQLFFBQVE7SUFDUixVQUFVO0lBQ1YsU0FBUztJQUNULE1BQU07SUFDTixPQUFPO0lBQ1AsU0FBUztJQUNULFNBQVM7SUFDVCxXQUFXO0lBQ1gsV0FBVztJQUNYLFVBQVU7SUFDVixTQUFTO0lBQ1QsTUFBTTtJQUNOLFFBQVE7SUFDUixNQUFNO0lBQ04sTUFBTTtJQUNOLE9BQU87SUFDUCxRQUFRO0lBQ1IsU0FBUztJQUNULFdBQVc7SUFDWCxTQUFTO0lBQ1QsUUFBUTtJQUNSLFVBQVU7SUFDVixRQUFRO0lBQ1IsUUFBUTtJQUNSLFVBQVU7SUFDVixRQUFRO0lBQ1IsVUFBVTtJQUNWLE1BQU07SUFDTixTQUFTO0lBQ1QsTUFBTTtJQUNOLFFBQVE7SUFDUixRQUFRO0lBQ1IsUUFBUTtJQUNSLFNBQVM7SUFDVCxXQUFXO0lBQ1gsUUFBUTtJQUNSLFFBQVE7SUFDUixRQUFRO0lBQ1IsT0FBTztJQUNQLFNBQVM7SUFDVCxPQUFPO0lBQ1AsVUFBVTtJQUNWLFNBQVM7SUFDVCxPQUFPO0lBQ1AsU0FBUztJQUNULFdBQVc7SUFDWCxTQUFTO0lBQ1QsU0FBUztJQUNULFVBQVU7SUFDVixXQUFXO0lBQ1gsT0FBTztJQUNQLFNBQVM7SUFDVCxRQUFRO0lBQ1IsVUFBVTtJQUNWLFVBQVU7SUFDVixXQUFXO0lBQ1gsV0FBVztJQUNYLFdBQVc7SUFDWCxXQUFXO0lBQ1gsV0FBVztJQUNYLFVBQVU7SUFDVixTQUFTO0lBQ1QsV0FBVztJQUNYLFNBQVM7SUFDVCxTQUFTO0lBQ1QsVUFBVTtJQUNWLE9BQU87SUFDUCxPQUFPO0lBQ1AsUUFBUTtJQUNSLFVBQVU7SUFDVixVQUFVO0lBQ1YsTUFBTTtJQUNOLFdBQVc7SUFDWCxVQUFVO0lBQ1YsV0FBVztJQUNYLFNBQVM7SUFDVCxPQUFPO0lBQ1AsUUFBUTtJQUNSLE1BQU07SUFDTixTQUFTO0lBQ1QsU0FBUztJQUNULFdBQVc7SUFDWCxRQUFRO0lBQ1IsUUFBUTtJQUNSLE9BQU87SUFDUCxVQUFVO0lBQ1YsUUFBUTtJQUNSLE9BQU87SUFDUCxVQUFVO0lBQ1YsV0FBVztJQUNYLFVBQVU7SUFDVixTQUFTO0lBQ1QsV0FBVztJQUNYLFNBQVM7SUFDVCxTQUFTO0lBQ1QsVUFBVTtJQUNWLFVBQVU7SUFDVixVQUFVO0lBQ1YsU0FBUztJQUNULFdBQVc7SUFDWCxRQUFRO0lBQ1IsVUFBVTtJQUNWLFVBQVU7SUFDVixTQUFTO0lBQ1QsT0FBTztJQUNQLFFBQVE7SUFDUixXQUFXO0lBQ1gsVUFBVTtJQUNWLFNBQVM7SUFDVCxXQUFXO0lBQ1gsU0FBUztJQUNULFVBQVU7SUFDVixVQUFVO0lBQ1YsU0FBUztJQUNULE1BQU07SUFDTixRQUFRO0lBQ1IsVUFBVTtJQUNWLFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULFVBQVU7SUFDVixVQUFVO0lBQ1YsUUFBUTtJQUNSLFVBQVU7SUFDVixTQUFTO0lBQ1QsU0FBUztJQUNULFdBQVc7SUFDWCxRQUFRO0lBQ1IsVUFBVTtJQUNWLE9BQU87SUFDUCxRQUFRO0lBQ1IsT0FBTztJQUNQLE9BQU87SUFDUCxTQUFTO0lBQ1QsT0FBTztJQUNQLFFBQVE7SUFDUixXQUFXO0lBQ1gsU0FBUztJQUNULFVBQVU7SUFDVixVQUFVO0lBQ1YsV0FBVztJQUNYLE9BQU87SUFDUCxLQUFLO0lBQ0wsT0FBTztJQUNQLFVBQVU7SUFDVixTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFDVCxLQUFLO0lBQ0wsU0FBUztJQUNULE9BQU87SUFDUCxRQUFRO0lBQ1IsVUFBVTtJQUNWLE9BQU87SUFDUCxRQUFRO0lBQ1IsU0FBUztJQUNULFVBQVU7SUFDVixVQUFVO0lBQ1YsV0FBVztJQUNYLE1BQU07SUFDTixRQUFRO0lBQ1IsU0FBUztJQUNULFFBQVE7SUFDUixRQUFRO0lBQ1IsTUFBTTtJQUNOLE9BQU87SUFDUCxNQUFNO0lBQ04sS0FBSztJQUNMLE9BQU87SUFDUCxPQUFPO0lBQ1AsT0FBTztJQUNQLFVBQVU7SUFDVixRQUFRO0lBQ1IsV0FBVztJQUNYLFFBQVE7SUFDUixPQUFPO0lBQ1AsT0FBTztJQUNQLFNBQVM7SUFDVCxXQUFXO0lBQ1gsTUFBTTtJQUNOLFVBQVU7SUFDVixPQUFPO0lBQ1AsT0FBTztJQUNQLE9BQU87SUFDUCxXQUFXO0lBQ1gsU0FBUztJQUNULFNBQVM7SUFDVCxVQUFVO0lBQ1YsUUFBUTtJQUNSLFFBQVE7SUFDUixTQUFTO0lBQ1QsUUFBUTtJQUNSLE9BQU87SUFDUCxNQUFNO0lBQ04sT0FBTztJQUNQLFVBQVU7SUFDVixXQUFXO0lBQ1gsT0FBTztJQUNQLFdBQVc7SUFDWCxVQUFVO0lBQ1YsUUFBUTtJQUNSLFdBQVc7SUFDWCxRQUFRO0lBQ1IsV0FBVztJQUNYLFdBQVc7SUFDWCxVQUFVO0lBQ1YsU0FBUztJQUNULFdBQVc7SUFDWCxXQUFXO0lBQ1gsV0FBVztJQUNYLFdBQVc7SUFDWCxXQUFXO0lBQ1gsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0lBQ1QsV0FBVztJQUNYLFVBQVU7SUFDVixRQUFRO0lBQ1IsUUFBUTtJQUNSLFVBQVU7SUFDVixVQUFVO0lBQ1YsV0FBVztJQUNYLFdBQVc7SUFDWCxTQUFTO0lBQ1QsVUFBVTtJQUNWLFdBQVc7SUFDWCxTQUFTO0lBQ1QsV0FBVztJQUNYLFVBQVU7SUFDVixVQUFVO0lBQ1YsV0FBVztJQUNYLFVBQVU7SUFDVixVQUFVO0lBQ1YsVUFBVTtJQUNWLFNBQVM7SUFDVCxVQUFVO0lBQ1YsVUFBVTtJQUNWLFdBQVc7SUFDWCxTQUFTO0lBQ1QsV0FBVztJQUNYLFdBQVc7SUFDWCxTQUFTO0lBQ1QsU0FBUztJQUNULFFBQVE7SUFDUixXQUFXO0lBQ1gsV0FBVztJQUNYLFNBQVM7SUFDVCxPQUFPO0lBQ1AsUUFBUTtJQUNSLFNBQVM7SUFDVCxRQUFRO0lBQ1IsV0FBVztJQUNYLFVBQVU7SUFDVixVQUFVO0lBQ1YsV0FBVztJQUNYLFVBQVU7SUFDVixVQUFVO0lBQ1YsVUFBVTtJQUNWLFFBQVE7SUFDUixXQUFXO0lBQ1gsV0FBVztJQUNYLFVBQVU7SUFDVixTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0lBQ1QsV0FBVztJQUNYLFNBQVM7SUFDVCxXQUFXO0lBQ1gsVUFBVTtJQUNWLE9BQU87SUFDUCxXQUFXO0lBQ1gsU0FBUztJQUNULFdBQVc7SUFDWCxRQUFRO0lBQ1IsV0FBVztJQUNYLFdBQVc7SUFDWCxVQUFVO0lBQ1YsVUFBVTtJQUNWLFdBQVc7SUFDWCxXQUFXO0lBQ1gsVUFBVTtJQUNWLFVBQVU7SUFDVixXQUFXO0lBQ1gsVUFBVTtJQUNWLFdBQVc7SUFDWCxXQUFXO0lBQ1gsU0FBUztJQUNULFdBQVc7SUFDWCxXQUFXO0lBQ1gsV0FBVztJQUNYLFdBQVc7SUFDWCxXQUFXO0lBQ1gsV0FBVztJQUNYLFdBQVc7SUFDWCxXQUFXO0lBQ1gsVUFBVTtJQUNWLFdBQVc7SUFDWCxXQUFXO0lBQ1gsV0FBVztJQUNYLFdBQVc7SUFDWCxVQUFVO0lBQ1YsVUFBVTtJQUNWLFdBQVc7SUFDWCxXQUFXO0lBQ1gsV0FBVztJQUNYLFdBQVc7SUFDWCxXQUFXO0lBQ1gsV0FBVztJQUNYLFVBQVU7SUFDVixTQUFTO0lBQ1QsUUFBUTtJQUNSLFdBQVc7SUFDWCxTQUFTO0lBQ1QsV0FBVztJQUNYLFVBQVU7SUFDVixTQUFTO0lBQ1QsVUFBVTtJQUNWLFNBQVM7SUFDVCxRQUFRO0lBQ1IsVUFBVTtJQUNWLFFBQVE7SUFDUixXQUFXO0lBQ1gsU0FBUztJQUNULFVBQVU7SUFDVixXQUFXO0lBQ1gsVUFBVTtJQUNWLFdBQVc7SUFDWCxVQUFVO0lBQ1YsU0FBUztJQUNULFdBQVc7SUFDWCxRQUFRO0lBQ1IsV0FBVztJQUNYLFdBQVc7SUFDWCxXQUFXO0lBQ1gsUUFBUTtJQUNSLFVBQVU7SUFDVixTQUFTO0lBQ1QsV0FBVztJQUNYLFNBQVM7SUFDVCxVQUFVO0lBQ1YsVUFBVTtJQUNWLFdBQVc7SUFDWCxXQUFXO0lBQ1gsU0FBUztJQUNULFVBQVU7SUFDVixXQUFXO0lBQ1gsUUFBUTtJQUNSLFdBQVc7SUFDWCxVQUFVO0lBQ1YsVUFBVTtJQUNWLFdBQVc7SUFDWCxVQUFVO0lBQ1YsVUFBVTtJQUNWLFVBQVU7SUFDVixVQUFVO0lBQ1YsUUFBUTtJQUNSLFNBQVM7SUFDVCxVQUFVO0lBQ1YsV0FBVztJQUNYLFdBQVc7SUFDWCxVQUFVO0lBQ1YsV0FBVztJQUNYLFNBQVM7SUFDVCxVQUFVO0lBQ1YsV0FBVztJQUNYLFNBQVM7SUFDVCxXQUFXO0lBQ1gsVUFBVTtJQUNWLFdBQVc7SUFDWCxVQUFVO0lBQ1YsU0FBUztJQUNULFdBQVc7SUFDWCxRQUFRO0lBQ1IsUUFBUTtJQUNSLFNBQVM7SUFDVCxVQUFVO0lBQ1YsU0FBUztJQUNULFNBQVM7SUFDVCxXQUFXO0lBQ1gsV0FBVztJQUNYLE9BQU87SUFDUCxXQUFXO0lBQ1gsV0FBVztJQUNYLFdBQVc7SUFDWCxXQUFXO0lBQ1gsV0FBVztJQUNYLE9BQU87SUFDUCxVQUFVO0lBQ1YsV0FBVztJQUNYLFFBQVE7SUFDUixVQUFVO0lBQ1YsTUFBTTtJQUNOLFdBQVc7SUFDWCxVQUFVO0lBQ1YsVUFBVTtJQUNWLFNBQVM7SUFDVCxRQUFRO0lBQ1IsV0FBVztJQUNYLFdBQVc7SUFDWCxTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFDVCxVQUFVO0lBQ1YsVUFBVTtJQUNWLFdBQVc7SUFDWCxTQUFTO0lBQ1QsUUFBUTtJQUNSLFdBQVc7SUFDWCxXQUFXO0lBQ1gsV0FBVztJQUNYLFdBQVc7SUFDWCxTQUFTO0lBQ1QsVUFBVTtJQUNWLFVBQVU7SUFDVixPQUFPO0lBQ1AsV0FBVztJQUNYLFVBQVU7SUFDVixVQUFVO0lBQ1YsVUFBVTtJQUNWLFdBQVc7SUFDWCxXQUFXO0lBQ1gsU0FBUztJQUNULFVBQVU7SUFDVixVQUFVO0lBQ1YsV0FBVztJQUNYLFNBQVM7SUFDVCxRQUFRO0lBQ1IsV0FBVztJQUNYLFVBQVU7SUFDVixVQUFVO0lBQ1YsVUFBVTtJQUNWLFVBQVU7SUFDVixXQUFXO0lBQ1gsV0FBVztJQUNYLFdBQVc7SUFDWCxXQUFXO0lBQ1gsU0FBUztJQUNULFVBQVU7SUFDVixTQUFTO0lBQ1QsV0FBVztJQUNYLFNBQVM7SUFDVCxVQUFVO0lBQ1YsV0FBVztJQUNYLFNBQVM7SUFDVCxXQUFXO0lBQ1gsVUFBVTtJQUNWLFNBQVM7SUFDVCxXQUFXO0lBQ1gsV0FBVztJQUNYLFVBQVU7SUFDVixXQUFXO0lBQ1gsUUFBUTtJQUNSLFVBQVU7SUFDVixRQUFRO0lBQ1IsV0FBVztJQUNYLFVBQVU7SUFDVixTQUFTO0lBQ1QsVUFBVTtJQUNWLFVBQVU7SUFDVixXQUFXO0lBQ1gsVUFBVTtJQUNWLFdBQVc7SUFDWCxXQUFXO0lBQ1gsV0FBVztJQUNYLFdBQVc7SUFDWCxVQUFVO0lBQ1YsUUFBUTtJQUNSLFdBQVc7SUFDWCxVQUFVO0lBQ1YsU0FBUztJQUNULFVBQVU7SUFDVixTQUFTO0lBQ1QsV0FBVztJQUNYLFdBQVc7SUFDWCxRQUFRO0lBQ1IsUUFBUTtJQUNSLFdBQVc7SUFDWCxXQUFXO0lBQ1gsV0FBVztJQUNYLFVBQVU7SUFDVixRQUFRO0lBQ1IsV0FBVztJQUNYLFdBQVc7SUFDWCxVQUFVO0lBQ1YsUUFBUTtJQUNSLFdBQVc7SUFDWCxXQUFXO0lBQ1gsU0FBUztJQUNULFFBQVE7SUFDUixXQUFXO0lBQ1gsUUFBUTtJQUNSLFVBQVU7SUFDVixVQUFVO0lBQ1YsUUFBUTtJQUNSLFFBQVE7SUFDUixVQUFVO0lBQ1YsU0FBUztJQUNULFVBQVU7SUFDVixXQUFXO0lBQ1gsV0FBVztJQUNYLFNBQVM7SUFDVCxVQUFVO0lBQ1YsVUFBVTtJQUNWLFdBQVc7SUFDWCxVQUFVO0lBQ1YsVUFBVTtJQUNWLFFBQVE7SUFDUixVQUFVO0lBQ1YsV0FBVztJQUNYLFFBQVE7SUFDUixXQUFXO0lBQ1gsV0FBVztJQUNYLFVBQVU7SUFDVixVQUFVO0lBQ1YsVUFBVTtJQUNWLFdBQVc7SUFDWCxXQUFXO0lBQ1gsV0FBVztJQUNYLFVBQVU7SUFDVixXQUFXO0lBQ1gsVUFBVTtJQUNWLFVBQVU7SUFDVixRQUFRO0lBQ1IsVUFBVTtJQUNWLFVBQVU7SUFDVixRQUFRO0lBQ1IsVUFBVTtJQUNWLFVBQVU7SUFDVixXQUFXO0lBQ1gsVUFBVTtJQUNWLFVBQVU7SUFDVixXQUFXO0lBQ1gsV0FBVztJQUNYLFVBQVU7SUFDVixXQUFXO0lBQ1gsV0FBVztJQUNYLFVBQVU7SUFDVixXQUFXO0lBQ1gsU0FBUztJQUNULFdBQVc7SUFDWCxXQUFXO0lBQ1gsVUFBVTtJQUNWLFVBQVU7SUFDVixVQUFVO0lBQ1YsUUFBUTtJQUNSLFNBQVM7SUFDVCxVQUFVO0lBQ1YsV0FBVztJQUNYLFNBQVM7SUFDVCxTQUFTO0lBQ1QsV0FBVztJQUNYLFVBQVU7SUFDVixTQUFTO0lBQ1QsVUFBVTtJQUNWLFVBQVU7SUFDVixRQUFRO0lBQ1IsT0FBTztJQUNQLE9BQU87SUFDUCxTQUFTO0lBQ1QsVUFBVTtJQUNWLFVBQVU7SUFDVixXQUFXO0lBQ1gsUUFBUTtJQUNSLFdBQVc7SUFDWCxXQUFXO0lBQ1gsV0FBVztJQUNYLFdBQVc7SUFDWCxTQUFTO0lBQ1QsV0FBVztJQUNYLFFBQVE7SUFDUixTQUFTO0lBQ1QsVUFBVTtJQUNWLFNBQVM7SUFDVCxTQUFTO0lBQ1QsVUFBVTtJQUNWLFFBQVE7SUFDUixTQUFTO0lBQ1QsVUFBVTtJQUNWLFVBQVU7SUFDVixXQUFXO0lBQ1gsVUFBVTtJQUNWLFdBQVc7SUFDWCxVQUFVO0lBQ1YsVUFBVTtJQUNWLFdBQVc7SUFDWCxTQUFTO0lBQ1QsVUFBVTtJQUNWLFdBQVc7SUFDWCxRQUFRO0lBQ1IsVUFBVTtJQUNWLFdBQVc7SUFDWCxTQUFTO0lBQ1QsT0FBTztJQUNQLFdBQVc7SUFDWCxRQUFRO0lBQ1IsVUFBVTtJQUNWLFdBQVc7SUFDWCxRQUFRO0lBQ1IsU0FBUztJQUNULFdBQVc7SUFDWCxXQUFXO0lBQ1gsV0FBVztJQUNYLFFBQVE7SUFDUixXQUFXO0lBQ1gsVUFBVTtJQUNWLFNBQVM7SUFDVCxTQUFTO0lBQ1QsV0FBVztJQUNYLFdBQVc7SUFDWCxPQUFPO0lBQ1AsUUFBUTtJQUNSLFNBQVM7SUFDVCxVQUFVO0lBQ1YsV0FBVztJQUNYLFFBQVE7SUFDUixTQUFTO0lBQ1QsU0FBUztJQUNULFVBQVU7SUFDVixRQUFRO0lBQ1IsUUFBUTtJQUNSLFFBQVE7SUFDUixVQUFVO0lBQ1YsV0FBVztJQUNYLFFBQVE7SUFDUixNQUFNO0lBQ04sT0FBTztJQUNQLFNBQVM7SUFDVCxVQUFVO0lBQ1YsU0FBUztJQUNULFFBQVE7SUFDUixRQUFRO0lBQ1IsU0FBUztJQUNULFFBQVE7SUFDUixTQUFTO0lBQ1QsVUFBVTtJQUNWLFNBQVM7SUFDVCxTQUFTO0lBQ1QsVUFBVTtJQUNWLFVBQVU7SUFDVixTQUFTO0lBQ1QsUUFBUTtJQUNSLFNBQVM7SUFDVCxRQUFRO0lBQ1IsVUFBVTtJQUNWLFFBQVE7SUFDUixRQUFRO0lBQ1IsU0FBUztJQUNULE9BQU87SUFDUCxRQUFRO0lBQ1IsVUFBVTtJQUNWLFNBQVM7SUFDVCxRQUFRO0lBQ1IsUUFBUTtJQUNSLFdBQVc7SUFDWCxTQUFTO0lBQ1QsUUFBUTtJQUNSLE9BQU87SUFDUCxTQUFTO0lBQ1QsTUFBTTtJQUNOLFdBQVc7SUFDWCxNQUFNO0lBQ04sT0FBTztJQUNQLE9BQU87SUFDUCxTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFDVCxRQUFRO0lBQ1IsUUFBUTtJQUNSLE9BQU87SUFDUCxTQUFTO0lBQ1QsUUFBUTtJQUNSLFFBQVE7SUFDUixVQUFVO0lBQ1YsVUFBVTtJQUNWLFVBQVU7SUFDVixXQUFXO0lBQ1gsU0FBUztJQUNULFdBQVc7SUFDWCxTQUFTO0lBQ1QsT0FBTztJQUNQLFFBQVE7SUFDUixRQUFRO0lBQ1IsV0FBVztJQUNYLE9BQU87SUFDUCxTQUFTO0lBQ1QsUUFBUTtJQUNSLFFBQVE7SUFDUixVQUFVO0lBQ1YsU0FBUztJQUNULFdBQVc7SUFDWCxVQUFVO0lBQ1YsVUFBVTtJQUNWLFFBQVE7SUFDUixTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFDVCxVQUFVO0lBQ1YsVUFBVTtJQUNWLFFBQVE7SUFDUixVQUFVO0lBQ1YsTUFBTTtJQUNOLE9BQU87SUFDUCxRQUFRO0lBQ1IsV0FBVztJQUNYLFFBQVE7SUFDUixVQUFVO0lBQ1YsUUFBUTtJQUNSLFVBQVU7SUFDVixTQUFTO0lBQ1QsUUFBUTtJQUNSLFdBQVc7SUFDWCxVQUFVO0lBQ1YsVUFBVTtJQUNWLFdBQVc7SUFDWCxTQUFTO0lBQ1QsT0FBTztJQUNQLE9BQU87SUFDUCxXQUFXO0lBQ1gsVUFBVTtJQUNWLFNBQVM7SUFDVCxTQUFTO0lBQ1QsUUFBUTtJQUNSLE9BQU87SUFDUCxTQUFTO0lBQ1QsUUFBUTtJQUNSLFdBQVc7SUFDWCxVQUFVO0lBQ1YsU0FBUztJQUNULE1BQU07SUFDTixRQUFRO0lBQ1IsTUFBTTtJQUNOLFNBQVM7SUFDVCxNQUFNO0lBQ04sVUFBVTtJQUNWLFdBQVc7SUFDWCxRQUFRO0lBQ1IsT0FBTztJQUNQLE1BQU07SUFDTixVQUFVO0lBQ1YsU0FBUztJQUNULE9BQU87SUFDUCxVQUFVO0lBQ1YsUUFBUTtJQUNSLFNBQVM7SUFDVCxVQUFVO0lBQ1YsV0FBVztJQUNYLFVBQVU7SUFDVixTQUFTO0lBQ1QsU0FBUztJQUNULFdBQVc7SUFDWCxVQUFVO0lBQ1YsU0FBUztJQUNULFNBQVM7SUFDVCxXQUFXO0lBQ1gsVUFBVTtJQUNWLFFBQVE7SUFDUixRQUFRO0lBQ1IsT0FBTztJQUNQLE9BQU87SUFDUCxTQUFTO0lBQ1QsVUFBVTtJQUNWLE9BQU87SUFDUCxNQUFNO0lBQ04sV0FBVztJQUNYLFNBQVM7SUFDVCxVQUFVO0lBQ1YsU0FBUztJQUNULFNBQVM7SUFDVCxRQUFRO0lBQ1IsVUFBVTtJQUNWLFNBQVM7SUFDVCxPQUFPO0lBQ1AsT0FBTztJQUNQLFVBQVU7SUFDVixVQUFVO0lBQ1YsU0FBUztJQUNULFVBQVU7SUFDVixXQUFXO0lBQ1gsU0FBUztJQUNULFdBQVc7SUFDWCxPQUFPO0lBQ1AsVUFBVTtJQUNWLFVBQVU7SUFDVixTQUFTO0lBQ1QsVUFBVTtJQUNWLE9BQU87SUFDUCxTQUFTO0lBQ1QsTUFBTTtJQUNOLFVBQVU7SUFDVixRQUFRO0lBQ1IsU0FBUztJQUNULFNBQVM7SUFDVCxPQUFPO0lBQ1AsUUFBUTtJQUNSLFNBQVM7SUFDVCxPQUFPO0lBQ1AsT0FBTztJQUNQLFFBQVE7SUFDUixXQUFXO0lBQ1gsS0FBSztJQUNMLE9BQU87SUFDUCxRQUFRO0lBQ1IsT0FBTztJQUNQLE9BQU87SUFDUCxPQUFPO0lBQ1AsUUFBUTtJQUNSLE9BQU87SUFDUCxNQUFNO0lBQ04sUUFBUTtJQUNSLE1BQU07SUFDTixTQUFTO0lBQ1QsUUFBUTtJQUNSLFFBQVE7SUFDUixPQUFPO0lBQ1AsTUFBTTtJQUNOLFNBQVM7SUFDVCxRQUFRO0lBQ1IsU0FBUztJQUNULFFBQVE7SUFDUixVQUFVO0lBQ1YsV0FBVztJQUNYLFdBQVc7SUFDWCxVQUFVO0lBQ1YsV0FBVztJQUNYLFNBQVM7SUFDVCxRQUFRO0lBQ1IsUUFBUTtJQUNSLFdBQVc7SUFDWCxTQUFTO0lBQ1QsU0FBUztJQUNULFVBQVU7SUFDVixXQUFXO0lBQ1gsU0FBUztJQUNULE1BQU07SUFDTixTQUFTO0lBQ1QsT0FBTztJQUNQLE9BQU87SUFDUCxVQUFVO0lBQ1YsUUFBUTtJQUNSLE1BQU07SUFDTixVQUFVO0lBQ1YsUUFBUTtJQUNSLE1BQU07SUFDTixPQUFPO0lBQ1AsT0FBTztJQUNQLFVBQVU7SUFDVixPQUFPO0lBQ1AsV0FBVztJQUNYLFFBQVE7SUFDUixPQUFPO0lBQ1AsVUFBVTtJQUNWLFNBQVM7SUFDVCxPQUFPO0lBQ1AsVUFBVTtJQUNWLFNBQVM7SUFDVCxVQUFVO0lBQ1YsUUFBUTtJQUNSLEtBQUs7SUFDTCxNQUFNO0lBQ04sUUFBUTtJQUNSLE9BQU87SUFDUCxRQUFRO0lBQ1IsT0FBTztJQUNQLE9BQU87SUFDUCxXQUFXO0lBQ1gsU0FBUztJQUNULE1BQU07SUFDTixNQUFNO0lBQ04sV0FBVztJQUNYLFVBQVU7SUFDVixTQUFTO0lBQ1QsUUFBUTtJQUNSLFVBQVU7SUFDVixVQUFVO0lBQ1YsVUFBVTtJQUNWLFVBQVU7SUFDVixRQUFRO0lBQ1IsVUFBVTtJQUNWLFFBQVE7SUFDUixXQUFXO0lBQ1gsU0FBUztJQUNULFFBQVE7SUFDUixXQUFXO0lBQ1gsTUFBTTtJQUNOLE1BQU07SUFDTixPQUFPO0lBQ1AsU0FBUztJQUNULE1BQU07SUFDTixNQUFNO0lBQ04sU0FBUztJQUNULFFBQVE7SUFDUixVQUFVO0lBQ1YsUUFBUTtJQUNSLE1BQU07SUFDTixPQUFPO0lBQ1AsVUFBVTtJQUNWLFFBQVE7SUFDUixNQUFNO0lBQ04sUUFBUTtJQUNSLE1BQU07SUFDTixNQUFNO0lBQ04sVUFBVTtJQUNWLE9BQU87SUFDUCxTQUFTO0lBQ1QsUUFBUTtJQUNSLFFBQVE7SUFDUixVQUFVO0lBQ1YsUUFBUTtJQUNSLEtBQUs7SUFDTCxNQUFNO0lBQ04sV0FBVztJQUNYLFdBQVc7SUFDWCxXQUFXO0lBQ1gsV0FBVztJQUNYLFdBQVc7SUFDWCxTQUFTO0lBQ1QsTUFBTTtJQUNOLE1BQU07SUFDTixRQUFRO0lBQ1IsTUFBTTtJQUNOLE9BQU87SUFDUCxNQUFNO0lBQ04sTUFBTTtJQUNOLFNBQVM7SUFDVCxTQUFTO0lBQ1QsV0FBVztJQUNYLE9BQU87SUFDUCxXQUFXO0lBQ1gsV0FBVztJQUNYLE9BQU87SUFDUCxPQUFPO0lBQ1AsT0FBTztJQUNQLEtBQUs7SUFDTCxTQUFTO0lBQ1QsT0FBTztJQUNQLFFBQVE7SUFDUixVQUFVO0lBQ1YsU0FBUztJQUNULFVBQVU7SUFDVixRQUFRO0lBQ1IsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULE9BQU87SUFDUCxTQUFTO0lBQ1QsU0FBUztJQUNULFdBQVc7SUFDWCxTQUFTO0lBQ1QsVUFBVTtJQUNWLFNBQVM7SUFDVCxXQUFXO0lBQ1gsU0FBUztJQUNULE1BQU07SUFDTixPQUFPO0lBQ1AsT0FBTztJQUNQLEtBQUs7SUFDTCxTQUFTO0lBQ1QsU0FBUztJQUNULE1BQU07SUFDTixNQUFNO0lBQ04sTUFBTTtJQUNOLFVBQVU7SUFDVixVQUFVO0lBQ1YsUUFBUTtJQUNSLFVBQVU7SUFDVixPQUFPO0lB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USxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUM1RSxNQUFNLENBQUMsUUFBUSxHQUFHLEdBQUcsQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLDJEQUFTLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDNUUsTUFBTSxDQUFDLFFBQVEsR0FBRyxHQUFHLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSwyREFBUyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQzVFLE1BQU0sQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksMkRBQVMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUM1RSxNQUFNLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLDJEQUFTLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDaEUsTUFBTSxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSwyREFBUyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ25FLE1BQU0sQ0FBQyxVQUFVLEdBQUcsR0FBRyxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksMkRBQVMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUNsRixNQUFNLENBQUMsT0FBTyxHQUFHLEdBQUcsQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLDJEQUFTLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFD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O0lBQ2hGLHdDQUF3QztJQUNsQyxXQUFXOztZQUNiLE9BQU8sSUFBSSxFQUFFO2dCQUNULElBQUk7b0JBQ0EsTUFBTSw0REFBUyxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDO29CQUMxQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztpQkFDNUI7Z0JBQUMsT0FBTyxDQUFDLEVBQUU7b0JBQ1IsMkJBQTJCO29CQUMzQixPQUFPLENBQUMsR0FBRyxDQUFDLCtCQUErQixFQUFFLENBQUMsQ0FBQyxDQUFDO2lCQUNuRDthQUNKO1FBQ0wsQ0FBQztLQUFBO0NBQ0o7Ozs7Ozs7Ozs7OztBQzVCRCxlOzs7Ozs7Ozs7OztBQ0FBLGU7Ozs7Ozs7Ozs7O0FDQUEsZSIsImZpbGUiOiJiYWNrZ3JvdW5kLmpzIiwic291cmNlc0NvbnRlbnQiOlsiIFx0Ly8gaW5zdGFsbCBhIEpTT05QIGNhbGxiYWNrIGZvciBjaHVuayBsb2FkaW5nXG4gXHRmdW5jdGlvbiB3ZWJwYWNrSnNvbnBDYWxsYmFjayhkYXRhKSB7XG4gXHRcdHZhciBjaHVua0lkcyA9IGRhdGFbMF07XG4gXHRcdHZhciBtb3JlTW9kdWxlcyA9IGRhdGFbMV07XG4gXHRcdHZhciBleGVjdXRlTW9kdWxlcyA9IGRhdGFbMl07XG5cbiBcdFx0Ly8gYWRkIFwibW9yZU1vZHVsZXNcIiB0byB0aGUgbW9kdWxlcyBvYmplY3QsXG4gXHRcdC8vIHRoZW4gZmxhZyBhbGwgXCJjaHVua0lkc1wiIGFzIGxvYWRlZCBhbmQgZmlyZSBjYWxsYmFja1xuIFx0XHR2YXIgbW9kdWxlSWQsIGNodW5rSWQsIGkgPSAwLCByZXNvbHZlcyA9IFtdO1xuIFx0XHRmb3IoO2kgPCBjaHVua0lkcy5sZW5ndGg7IGkrKykge1xuIFx0XHRcdGNodW5rSWQgPSBjaHVua0lkc1tpXTtcbiBcdFx0XHRpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoaW5zdGFsbGVkQ2h1bmtzLCBjaHVua0lkKSAmJiBpbnN0YWxsZWRDaHVua3NbY2h1bmtJZF0pIHtcbiBcdFx0XHRcdHJlc29sdmVzLnB1c2goaW5zdGFsbGVkQ2h1bmtzW2NodW5rSWRdWzBdKTtcbiBcdFx0XHR9XG4gXHRcdFx0aW5zdGFsbGVkQ2h1bmtzW2NodW5rSWRdID0gMDtcbiBcdFx0fVxuIFx0XHRmb3IobW9kdWxlSWQgaW4gbW9yZU1vZHVsZXMpIHtcbiBcdFx0XHRpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9yZU1vZHVsZXMsIG1vZHVsZUlkKSkge1xuIFx0XHRcdFx0bW9kdWxlc1ttb2R1bGVJZF0gPSBtb3JlTW9kdWxlc1ttb2R1bGVJZF07XG4gXHRcdFx0fVxuIFx0XHR9XG4gXHRcdGlmKHBhcmVudEpzb25wRnVuY3Rpb24pIHBhcmVudEpzb25wRnVuY3Rpb24oZGF0YSk7XG5cbiBcdFx0d2hpbGUocmVzb2x2ZXMubGVuZ3RoKSB7XG4gXHRcdFx0cmVzb2x2ZXMuc2hpZnQoKSgpO1xuIFx0XHR9XG5cbiBcdFx0Ly8gYWRkIGVudHJ5IG1vZHVsZXMgZnJvbSBsb2FkZWQgY2h1bmsgdG8gZGVmZXJyZWQgbGlzdFxuIFx0XHRkZWZlcnJlZE1vZHVsZXMucHVzaC5hcHBseShkZWZlcnJlZE1vZHVsZXMsIGV4ZWN1dGVNb2R1bGVzIHx8IFtdKTtcblxuIFx0XHQvLyBydW4gZGVmZXJyZWQgbW9kdWxlcyB3aGVuIGFsbCBjaHVua3MgcmVhZHlcbiBcdFx0cmV0dXJuIGNoZWNrRGVmZXJyZWRNb2R1bGVzKCk7XG4gXHR9O1xuIFx0ZnVuY3Rpb24gY2hlY2tEZWZlcnJlZE1vZHVsZXMoKSB7XG4gXHRcdHZhciByZXN1bHQ7XG4gXHRcdGZvcih2YXIgaSA9IDA7IGkgPCBkZWZlcnJlZE1vZHVsZXMubGVuZ3RoOyBpKyspIHtcbiBcdFx0XHR2YXIgZGVmZXJyZWRNb2R1bGUgPSBkZWZlcnJlZE1vZHVsZXNbaV07XG4gXHRcdFx0dmFyIGZ1bGZpbGxlZCA9IHRydWU7XG4gXHRcdFx0Zm9yKHZhciBqID0gMTsgaiA8IGRlZmVycmVkTW9kdWxlLmxlbmd0aDsgaisrKSB7XG4gXHRcdFx0XHR2YXIgZGVwSWQgPSBkZWZlcnJlZE1vZHVsZVtqXTtcbiBcdFx0XHRcdGlmKGluc3RhbGxlZENodW5rc1tkZXBJZF0gIT09IDApIGZ1bGZpbGxlZCA9IGZhbHNlO1xuIFx0XHRcdH1cbiBcdFx0XHRpZihmdWxmaWxsZWQpIHtcbiBcdFx0XHRcdGRlZmVycmVkTW9kdWxlcy5zcGxpY2UoaS0tLCAxKTtcbiBcdFx0XHRcdHJlc3VsdCA9IF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gZGVmZXJyZWRNb2R1bGVbMF0pO1xuIFx0XHRcdH1cbiBcdFx0fVxuXG4gXHRcdHJldHVybiByZXN1bHQ7XG4gXHR9XG5cbiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIG9iamVjdCB0byBzdG9yZSBsb2FkZWQgYW5kIGxvYWRpbmcgY2h1bmtzXG4gXHQvLyB1bmRlZmluZWQgPSBjaHVuayBub3QgbG9hZGVkLCBudWxsID0gY2h1bmsgcHJlbG9hZGVkL3ByZWZldGNoZWRcbiBcdC8vIFByb21pc2UgPSBjaHVuayBsb2FkaW5nLCAwID0gY2h1bmsgbG9hZGVkXG4gXHR2YXIgaW5zdGFsbGVkQ2h1bmtzID0ge1xuIFx0XHRcImJhY2tncm91bmRcIjogMFxuIFx0fTtcblxuIFx0dmFyIGRlZmVycmVkTW9kdWxlcyA9IFtdO1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuIFx0XHR9XG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBnZXR0ZXIgfSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uciA9IGZ1bmN0aW9uKGV4cG9ydHMpIHtcbiBcdFx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG4gXHRcdH1cbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbiBcdH07XG5cbiBcdC8vIGNyZWF0ZSBhIGZha2UgbmFtZXNwYWNlIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDE6IHZhbHVlIGlzIGEgbW9kdWxlIGlkLCByZXF1aXJlIGl0XG4gXHQvLyBtb2RlICYgMjogbWVyZ2UgYWxsIHByb3BlcnRpZXMgb2YgdmFsdWUgaW50byB0aGUgbnNcbiBcdC8vIG1vZGUgJiA0OiByZXR1cm4gdmFsdWUgd2hlbiBhbHJlYWR5IG5zIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDh8MTogYmVoYXZlIGxpa2UgcmVxdWlyZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy50ID0gZnVuY3Rpb24odmFsdWUsIG1vZGUpIHtcbiBcdFx0aWYobW9kZSAmIDEpIHZhbHVlID0gX193ZWJwYWNrX3JlcXVpcmVfXyh2YWx1ZSk7XG4gXHRcdGlmKG1vZGUgJiA4KSByZXR1cm4gdmFsdWU7XG4gXHRcdGlmKChtb2RlICYgNCkgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAmJiB2YWx1ZS5fX2VzTW9kdWxlKSByZXR1cm4gdmFsdWU7XG4gXHRcdHZhciBucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18ucihucyk7XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShucywgJ2RlZmF1bHQnLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2YWx1ZSB9KTtcbiBcdFx0aWYobW9kZSAmIDIgJiYgdHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSBmb3IodmFyIGtleSBpbiB2YWx1ZSkgX193ZWJwYWNrX3JlcXVpcmVfXy5kKG5zLCBrZXksIGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gdmFsdWVba2V5XTsgfS5iaW5kKG51bGwsIGtleSkpO1xuIFx0XHRyZXR1cm4gbnM7XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG4gXHR2YXIganNvbnBBcnJheSA9IHdpbmRvd1tcIndlYnBhY2tKc29ucFwiXSA9IHdpbmRvd1tcIndlYnBhY2tKc29ucFwiXSB8fCBbXTtcbiBcdHZhciBvbGRKc29ucEZ1bmN0aW9uID0ganNvbnBBcnJheS5wdXNoLmJpbmQoanNvbnBBcnJheSk7XG4gXHRqc29ucEFycmF5LnB1c2ggPSB3ZWJwYWNrSnNvbnBDYWxsYmFjaztcbiBcdGpzb25wQXJyYXkgPSBqc29ucEFycmF5LnNsaWNlKCk7XG4gXHRmb3IodmFyIGkgPSAwOyBpIDwganNvbnBBcnJheS5sZW5ndGg7IGkrKykgd2VicGFja0pzb25wQ2FsbGJhY2soanNvbnBBcnJheVtpXSk7XG4gXHR2YXIgcGFyZW50SnNvbnBGdW5jdGlvbiA9IG9sZEpzb25wRnVuY3Rpb247XG5cblxuIFx0Ly8gYWRkIGVudHJ5IG1vZHVsZSB0byBkZWZlcnJlZCBsaXN0XG4gXHRkZWZlcnJlZE1vZHVsZXMucHVzaChbXCIuL3NyYy9iYWNrZ3JvdW5kLnRzXCIsXCJ2ZW5kb3JcIl0pO1xuIFx0Ly8gcnVuIGRlZmVycmVkIG1vZHVsZXMgd2hlbiByZWFkeVxuIFx0cmV0dXJuIGNoZWNrRGVmZXJyZWRNb2R1bGVzKCk7XG4iLCJmdW5jdGlvbiB3ZWJwYWNrRW1wdHlBc3luY0NvbnRleHQocmVxKSB7XG5cdC8vIEhlcmUgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigpIGlzIHVzZWQgaW5zdGVhZCBvZiBuZXcgUHJvbWlzZSgpIHRvIHByZXZlbnRcblx0Ly8gdW5jYXVnaHQgZXhjZXB0aW9uIHBvcHBpbmcgdXAgaW4gZGV2dG9vbHNcblx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGUgPSBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiICsgcmVxICsgXCInXCIpO1xuXHRcdGUuY29kZSA9ICdNT0RVTEVfTk9UX0ZPVU5EJztcblx0XHR0aHJvdyBlO1xuXHR9KTtcbn1cbndlYnBhY2tFbXB0eUFzeW5jQ29udGV4dC5rZXlzID0gZnVuY3Rpb24oKSB7IHJldHVybiBbXTsgfTtcbndlYnBhY2tFbXB0eUFzeW5jQ29udGV4dC5yZXNvbHZlID0gd2VicGFja0VtcHR5QXN5bmNDb250ZXh0O1xubW9kdWxlLmV4cG9ydHMgPSB3ZWJwYWNrRW1wdHlBc3luY0NvbnRleHQ7XG53ZWJwYWNrRW1wdHlBc3luY0NvbnRleHQuaWQgPSBcIi4vJCRfbGF6eV9yb3V0ZV9yZXNvdXJjZSBsYXp5IHJlY3Vyc2l2ZVwiOyIsImV4cG9ydCBhYnN0cmFjdCBjbGFzcyBNZXNzYWdpbmdTZXJ2aWNlIHtcbiAgICBzZW5kOiAoc3Vic2NyaWJlcjogc3RyaW5nLCBhcmc/OiBhbnkpID0+IHZvaWQ7XG59XG4iLCJpbXBvcnQgeyBEZXZpY2VUeXBlIH0gZnJvbSAnLi4vZW51bXMvZGV2aWNlVHlwZSc7XG5pbXBvcnQgeyBUaGVtZVR5cGUgfSBmcm9tICcuLi9lbnVtcy90aGVtZVR5cGUnO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgUGxhdGZvcm1VdGlsc1NlcnZpY2Uge1xuICAgIGlkZW50aXR5Q2xpZW50SWQ6IHN0cmluZztcbiAgICBnZXREZXZpY2U6ICgpID0+IERldmljZVR5cGU7XG4gICAgZ2V0RGV2aWNlU3RyaW5nOiAoKSA9PiBzdHJpbmc7XG4gICAgaXNGaXJlZm94OiAoKSA9PiBib29sZWFuO1xuICAgIGlzQ2hyb21lOiAoKSA9PiBib29sZWFuO1xuICAgIGlzRWRnZTogKCkgPT4gYm9vbGVhbjtcbiAgICBpc09wZXJhOiAoKSA9PiBib29sZWFuO1xuICAgIGlzVml2YWxkaTogKCkgPT4gYm9vbGVhbjtcbiAgICBpc1NhZmFyaTogKCkgPT4gYm9vbGVhbjtcbiAgICBpc0lFOiAoKSA9PiBib29sZWFuO1xuICAgIGlzTWFjQXBwU3RvcmU6ICgpID0+IGJvb2xlYW47XG4gICAgaXNWaWV3T3BlbjogKCkgPT4gUHJvbWlzZTxib29sZWFuPjtcbiAgICBsYXVuY2hVcmk6ICh1cmk6IHN0cmluZywgb3B0aW9ucz86IGFueSkgPT4gdm9pZDtcbiAgICBzYXZlRmlsZTogKHdpbjogV2luZG93LCBibG9iRGF0YTogYW55LCBibG9iT3B0aW9uczogYW55LCBmaWxlTmFtZTogc3RyaW5nKSA9PiB2b2lkO1xuICAgIGdldEFwcGxpY2F0aW9uVmVyc2lvbjogKCkgPT4gUHJvbWlzZTxzdHJpbmc+O1xuICAgIHN1cHBvcnRzV2ViQXV0aG46ICh3aW46IFdpbmRvdykgPT4gYm9vbGVhbjtcbiAgICBzdXBwb3J0c0R1bzogKCkgPT4gYm9vbGVhbjtcbiAgICBzaG93VG9hc3Q6ICh0eXBlOiAnZXJyb3InIHwgJ3N1Y2Nlc3MnIHwgJ3dhcm5pbmcnIHwgJ2luZm8nLCB0aXRsZTogc3RyaW5nLCB0ZXh0OiBzdHJpbmcgfCBzdHJpbmdbXSxcbiAgICAgICAgb3B0aW9ucz86IGFueSkgPT4gdm9pZDtcbiAgICBzaG93RGlhbG9nOiAoYm9keTogc3RyaW5nLCB0aXRsZT86IHN0cmluZywgY29uZmlybVRleHQ/OiBzdHJpbmcsIGNhbmNlbFRleHQ/OiBzdHJpbmcsXG4gICAgICAgIHR5cGU/OiBzdHJpbmcsIGJvZHlJc0h0bWw/OiBib29sZWFuKSA9PiBQcm9taXNlPGJvb2xlYW4+O1xuICAgIGlzRGV2OiAoKSA9PiBib29sZWFuO1xuICAgIGlzU2VsZkhvc3Q6ICgpID0+IGJvb2xlYW47XG4gICAgY29weVRvQ2xpcGJvYXJkOiAodGV4dDogc3RyaW5nLCBvcHRpb25zPzogYW55KSA9PiB2b2lkIHwgYm9vbGVhbjtcbiAgICByZWFkRnJvbUNsaXBib2FyZDogKG9wdGlvbnM/OiBhbnkpID0+IFByb21pc2U8c3RyaW5nPjtcbiAgICBzdXBwb3J0c0Jpb21ldHJpYzogKCkgPT4gUHJvbWlzZTxib29sZWFuPjtcbiAgICBhdXRoZW50aWNhdGVCaW9tZXRyaWM6ICgpID0+IFByb21pc2U8Ym9vbGVhbj47XG4gICAgZ2V0RGVmYXVsdFN5c3RlbVRoZW1lOiAoKSA9PiBQcm9taXNlPFRoZW1lVHlwZS5MaWdodCB8IFRoZW1lVHlwZS5EYXJrPjtcbiAgICBvbkRlZmF1bHRTeXN0ZW1UaGVtZUNoYW5nZTogKGNhbGxiYWNrOiAoKHRoZW1lOiBUaGVtZVR5cGUuTGlnaHQgfCBUaGVtZVR5cGUuRGFyaykgPT4gdW5rbm93bikpID0+IHVua25vd247XG4gICAgZ2V0RWZmZWN0aXZlVGhlbWU6ICgpID0+IFByb21pc2U8VGhlbWVUeXBlPjtcbiAgICBzdXBwb3J0c1NlY3VyZVN0b3JhZ2U6ICgpID0+IGJvb2xlYW47XG59XG4iLCJleHBvcnQgZW51bSBDaXBoZXJSZXByb21wdFR5cGUge1xuICAgIE5vbmUgPSAwLFxuICAgIFBhc3N3b3JkID0gMSxcbn1cbiIsImV4cG9ydCBlbnVtIENpcGhlclR5cGUge1xuICAgIExvZ2luID0gMSxcbiAgICBTZWN1cmVOb3RlID0gMixcbiAgICBDYXJkID0gMyxcbiAgICBJZGVudGl0eSA9IDQsXG59XG4iLCJleHBvcnQgZW51bSBEZXZpY2VUeXBlIHtcbiAgICBBbmRyb2lkID0gMCxcbiAgICBpT1MgPSAxLFxuICAgIENocm9tZUV4dGVuc2lvbiA9IDIsXG4gICAgRmlyZWZveEV4dGVuc2lvbiA9IDMsXG4gICAgT3BlcmFFeHRlbnNpb24gPSA0LFxuICAgIEVkZ2VFeHRlbnNpb24gPSA1LFxuICAgIFdpbmRvd3NEZXNrdG9wID0gNixcbiAgICBNYWNPc0Rlc2t0b3AgPSA3LFxuICAgIExpbnV4RGVza3RvcCA9IDgsXG4gICAgQ2hyb21lQnJvd3NlciA9IDksXG4gICAgRmlyZWZveEJyb3dzZXIgPSAxMCxcbiAgICBPcGVyYUJyb3dzZXIgPSAxMSxcbiAgICBFZGdlQnJvd3NlciA9IDEyLFxuICAgIElFQnJvd3NlciA9IDEzLFxuICAgIFVua25vd25Ccm93c2VyID0gMTQsXG4gICAgQW5kcm9pZEFtYXpvbiA9IDE1LFxuICAgIFVXUCA9IDE2LFxuICAgIFNhZmFyaUJyb3dzZXIgPSAxNyxcbiAgICBWaXZhbGRpQnJvd3NlciA9IDE4LFxuICAgIFZpdmFsZGlFeHRlbnNpb24gPSAxOSxcbiAgICBTYWZhcmlFeHRlbnNpb24gPSAyMCxcbn1cbiIsImV4cG9ydCBlbnVtIEVuY3J5cHRpb25UeXBlIHtcbiAgICBBZXNDYmMyNTZfQjY0ID0gMCxcbiAgICBBZXNDYmMxMjhfSG1hY1NoYTI1Nl9CNjQgPSAxLFxuICAgIEFlc0NiYzI1Nl9IbWFjU2hhMjU2X0I2NCA9IDIsXG4gICAgUnNhMjA0OF9PYWVwU2hhMjU2X0I2NCA9IDMsXG4gICAgUnNhMjA0OF9PYWVwU2hhMV9CNjQgPSA0LFxuICAgIFJzYTIwNDhfT2FlcFNoYTI1Nl9IbWFjU2hhMjU2X0I2NCA9IDUsXG4gICAgUnNhMjA0OF9PYWVwU2hhMV9IbWFjU2hhMjU2X0I2NCA9IDYsXG59XG4iLCJleHBvcnQgZW51bSBFdmVudFR5cGUge1xuICAgIFVzZXJfTG9nZ2VkSW4gPSAxMDAwLFxuICAgIFVzZXJfQ2hhbmdlZFBhc3N3b3JkID0gMTAwMSxcbiAgICBVc2VyX1VwZGF0ZWQyZmEgPSAxMDAyLFxuICAgIFVzZXJfRGlzYWJsZWQyZmEgPSAxMDAzLFxuICAgIFVzZXJfUmVjb3ZlcmVkMmZhID0gMTAwNCxcbiAgICBVc2VyX0ZhaWxlZExvZ0luID0gMTAwNSxcbiAgICBVc2VyX0ZhaWxlZExvZ0luMmZhID0gMTAwNixcbiAgICBVc2VyX0NsaWVudEV4cG9ydGVkVmF1bHQgPSAxMDA3LFxuICAgIFVzZXJfVXBkYXRlZFRlbXBQYXNzd29yZCA9IDEwMDgsXG5cbiAgICBDaXBoZXJfQ3JlYXRlZCA9IDExMDAsXG4gICAgQ2lwaGVyX1VwZGF0ZWQgPSAxMTAxLFxuICAgIENpcGhlcl9EZWxldGVkID0gMTEwMixcbiAgICBDaXBoZXJfQXR0YWNobWVudENyZWF0ZWQgPSAxMTAzLFxuICAgIENpcGhlcl9BdHRhY2htZW50RGVsZXRlZCA9IDExMDQsXG4gICAgQ2lwaGVyX1NoYXJlZCA9IDExMDUsXG4gICAgQ2lwaGVyX1VwZGF0ZWRDb2xsZWN0aW9ucyA9IDExMDYsXG4gICAgQ2lwaGVyX0NsaWVudFZpZXdlZCA9IDExMDcsXG4gICAgQ2lwaGVyX0NsaWVudFRvZ2dsZWRQYXNzd29yZFZpc2libGUgPSAxMTA4LFxuICAgIENpcGhlcl9DbGllbnRUb2dnbGVkSGlkZGVuRmllbGRWaXNpYmxlID0gMTEwOSxcbiAgICBDaXBoZXJfQ2xpZW50VG9nZ2xlZENhcmRDb2RlVmlzaWJsZSA9IDExMTAsXG4gICAgQ2lwaGVyX0NsaWVudENvcGllZFBhc3N3b3JkID0gMTExMSxcbiAgICBDaXBoZXJfQ2xpZW50Q29waWVkSGlkZGVuRmllbGQgPSAxMTEyLFxuICAgIENpcGhlcl9DbGllbnRDb3BpZWRDYXJkQ29kZSA9IDExMTMsXG4gICAgQ2lwaGVyX0NsaWVudEF1dG9maWxsZWQgPSAxMTE0LFxuICAgIENpcGhlcl9Tb2Z0RGVsZXRlZCA9IDExMTUsXG4gICAgQ2lwaGVyX1Jlc3RvcmVkID0gMTExNixcbiAgICBDaXBoZXJfQ2xpZW50VG9nZ2xlZENhcmROdW1iZXJWaXNpYmxlID0gMTExNyxcblxuICAgIENvbGxlY3Rpb25fQ3JlYXRlZCA9IDEzMDAsXG4gICAgQ29sbGVjdGlvbl9VcGRhdGVkID0gMTMwMSxcbiAgICBDb2xsZWN0aW9uX0RlbGV0ZWQgPSAxMzAyLFxuXG4gICAgR3JvdXBfQ3JlYXRlZCA9IDE0MDAsXG4gICAgR3JvdXBfVXBkYXRlZCA9IDE0MDEsXG4gICAgR3JvdXBfRGVsZXRlZCA9IDE0MDIsXG5cbiAgICBPcmdhbml6YXRpb25Vc2VyX0ludml0ZWQgPSAxNTAwLFxuICAgIE9yZ2FuaXphdGlvblVzZXJfQ29uZmlybWVkID0gMTUwMSxcbiAgICBPcmdhbml6YXRpb25Vc2VyX1VwZGF0ZWQgPSAxNTAyLFxuICAgIE9yZ2FuaXphdGlvblVzZXJfUmVtb3ZlZCA9IDE1MDMsXG4gICAgT3JnYW5pemF0aW9uVXNlcl9VcGRhdGVkR3JvdXBzID0gMTUwNCxcbiAgICBPcmdhbml6YXRpb25Vc2VyX1VubGlua2VkU3NvID0gMTUwNSxcbiAgICBPcmdhbml6YXRpb25Vc2VyX1Jlc2V0UGFzc3dvcmRfRW5yb2xsID0gMTUwNixcbiAgICBPcmdhbml6YXRpb25Vc2VyX1Jlc2V0UGFzc3dvcmRfV2l0aGRyYXcgPSAxNTA3LFxuICAgIE9yZ2FuaXphdGlvblVzZXJfQWRtaW5SZXNldFBhc3N3b3JkID0gMTUwOCxcbiAgICBPcmdhbml6YXRpb25Vc2VyX1Jlc2V0U3NvTGluayA9IDE1MDksXG5cbiAgICBPcmdhbml6YXRpb25fVXBkYXRlZCA9IDE2MDAsXG4gICAgT3JnYW5pemF0aW9uX1B1cmdlZFZhdWx0ID0gMTYwMSxcbiAgICAvLyBPcmdhbml6YXRpb25fQ2xpZW50RXhwb3J0ZWRWYXVsdCA9IDE2MDIsXG4gICAgT3JnYW5pemF0aW9uX1ZhdWx0QWNjZXNzZWQgPSAxNjAzLFxuXG4gICAgUG9saWN5X1VwZGF0ZWQgPSAxNzAwLFxuXG4gICAgUHJvdmlkZXJVc2VyX0ludml0ZWQgPSAxODAwLFxuICAgIFByb3ZpZGVyVXNlcl9Db25maXJtZWQgPSAxODAxLFxuICAgIFByb3ZpZGVyVXNlcl9VcGRhdGVkID0gMTgwMixcbiAgICBQcm92aWRlclVzZXJfUmVtb3ZlZCA9IDE4MDMsXG5cbiAgICBQcm92aWRlck9yZ2FuaXphdGlvbl9DcmVhdGVkID0gMTkwMCxcbiAgICBQcm92aWRlck9yZ2FuaXphdGlvbl9BZGRlZCA9IDE5MDEsXG4gICAgUHJvdmlkZXJPcmdhbml6YXRpb25fUmVtb3ZlZCA9IDE5MDIsXG4gICAgUHJvdmlkZXJPcmdhbml6YXRpb25fVmF1bHRBY2Nlc3NlZCA9IDE5MDMsXG59XG4iLCJleHBvcnQgZW51bSBGaWVsZFR5cGUge1xuICAgIFRleHQgPSAwLFxuICAgIEhpZGRlbiA9IDEsXG4gICAgQm9vbGVhbiA9IDIsXG4gICAgTGlua2VkID0gMyxcbn1cbiIsImV4cG9ydCBlbnVtIEZpbGVVcGxvYWRUeXBlIHtcbiAgICBEaXJlY3QgPSAwLFxuICAgIEF6dXJlID0gMSxcbn1cbiIsImV4cG9ydCBlbnVtIEhhc2hQdXJwb3NlIHtcbiAgICBTZXJ2ZXJBdXRob3JpemF0aW9uID0gMSxcbiAgICBMb2NhbEF1dGhvcml6YXRpb24gPSAyLFxufVxuIiwiZXhwb3J0IGVudW0gS2RmVHlwZSB7XG4gICAgUEJLREYyX1NIQTI1NiA9IDAsXG59XG4iLCJleHBvcnQgdHlwZSBMaW5rZWRJZFR5cGUgPSBMb2dpbkxpbmtlZElkIHwgQ2FyZExpbmtlZElkIHwgSWRlbnRpdHlMaW5rZWRJZDtcblxuLy8gTG9naW5WaWV3XG5leHBvcnQgZW51bSBMb2dpbkxpbmtlZElkIHtcbiAgICBVc2VybmFtZSA9IDEwMCxcbiAgICBQYXNzd29yZCA9IDEwMSxcbn1cblxuLy8gQ2FyZFZpZXdcbmV4cG9ydCBlbnVtIENhcmRMaW5rZWRJZCB7XG4gICAgQ2FyZGhvbGRlck5hbWUgPSAzMDAsXG4gICAgRXhwTW9udGggPSAzMDEsXG4gICAgRXhwWWVhciA9IDMwMixcbiAgICBDb2RlID0gMzAzLFxuICAgIEJyYW5kID0gMzA0LFxuICAgIE51bWJlciA9IDMwNSxcbn1cblxuLy8gSWRlbnRpdHlWaWV3XG5leHBvcnQgZW51bSBJZGVudGl0eUxpbmtlZElkIHtcbiAgICBUaXRsZSA9IDQwMCxcbiAgICBNaWRkbGVOYW1lID0gNDAxLFxuICAgIEFkZHJlc3MxID0gNDAyLFxuICAgIEFkZHJlc3MyID0gNDAzLFxuICAgIEFkZHJlc3MzID0gNDA0LFxuICAgIENpdHkgPSA0MDUsXG4gICAgU3RhdGUgPSA0MDYsXG4gICAgUG9zdGFsQ29kZSA9IDQwNyxcbiAgICBDb3VudHJ5ID0gNDA4LFxuICAgIENvbXBhbnkgPSA0MDksXG4gICAgRW1haWwgPSA0MTAsXG4gICAgUGhvbmUgPSA0MTEsXG4gICAgU3NuID0gNDEyLFxuICAgIFVzZXJuYW1lID0gNDEzLFxuICAgIFBhc3Nwb3J0TnVtYmVyID0gNDE0LFxuICAgIExpY2Vuc2VOdW1iZXIgPSA0MTUsXG4gICAgRmlyc3ROYW1lID0gNDE2LFxuICAgIExhc3ROYW1lID0gNDE3LFxuICAgIEZ1bGxOYW1lID0gNDE4LFxufVxuIiwiZXhwb3J0IGVudW0gTG9nTGV2ZWxUeXBlIHtcbiAgICBEZWJ1ZyxcbiAgICBJbmZvLFxuICAgIFdhcm5pbmcsXG4gICAgRXJyb3IsXG59XG4iLCJleHBvcnQgZW51bSBOb3RpZmljYXRpb25UeXBlIHtcbiAgICBTeW5jQ2lwaGVyVXBkYXRlID0gMCxcbiAgICBTeW5jQ2lwaGVyQ3JlYXRlID0gMSxcbiAgICBTeW5jTG9naW5EZWxldGUgPSAyLFxuICAgIFN5bmNGb2xkZXJEZWxldGUgPSAzLFxuICAgIFN5bmNDaXBoZXJzID0gNCxcblxuICAgIFN5bmNWYXVsdCA9IDUsXG4gICAgU3luY09yZ0tleXMgPSA2LFxuICAgIFN5bmNGb2xkZXJDcmVhdGUgPSA3LFxuICAgIFN5bmNGb2xkZXJVcGRhdGUgPSA4LFxuICAgIFN5bmNDaXBoZXJEZWxldGUgPSA5LFxuICAgIFN5bmNTZXR0aW5ncyA9IDEwLFxuXG4gICAgTG9nT3V0ID0gMTEsXG5cbiAgICBTeW5jU2VuZENyZWF0ZSA9IDEyLFxuICAgIFN5bmNTZW5kVXBkYXRlID0gMTMsXG4gICAgU3luY1NlbmREZWxldGUgPSAxNCxcbn1cbiIsImV4cG9ydCBlbnVtIE9yZ2FuaXphdGlvblVzZXJTdGF0dXNUeXBlIHtcbiAgICBJbnZpdGVkID0gMCxcbiAgICBBY2NlcHRlZCA9IDEsXG4gICAgQ29uZmlybWVkID0gMixcbn1cbiIsImV4cG9ydCBlbnVtIE9yZ2FuaXphdGlvblVzZXJUeXBlIHtcbiAgICBPd25lciA9IDAsXG4gICAgQWRtaW4gPSAxLFxuICAgIFVzZXIgPSAyLFxuICAgIE1hbmFnZXIgPSAzLFxuICAgIEN1c3RvbSA9IDQsXG59XG4iLCJleHBvcnQgZW51bSBQb2xpY3lUeXBlIHtcbiAgICBUd29GYWN0b3JBdXRoZW50aWNhdGlvbiA9IDAsIC8vIFJlcXVpcmVzIHVzZXJzIHRvIGhhdmUgMmZhIGVuYWJsZWRcbiAgICBNYXN0ZXJQYXNzd29yZCA9IDEsIC8vIFNldHMgbWluaW11bSByZXF1aXJlbWVudHMgZm9yIG1hc3RlciBwYXNzd29yZCBjb21wbGV4aXR5XG4gICAgUGFzc3dvcmRHZW5lcmF0b3IgPSAyLCAvLyBTZXRzIG1pbmltdW0gcmVxdWlyZW1lbnRzL2RlZmF1bHQgdHlwZSBmb3IgZ2VuZXJhdGVkIHBhc3N3b3Jkcy9wYXNzcGhyYXNlc1xuICAgIFNpbmdsZU9yZyA9IDMsIC8vIEFsbG93cyB1c2VycyB0byBvbmx5IGJlIGFwYXJ0IG9mIG9uZSBvcmdhbml6YXRpb25cbiAgICBSZXF1aXJlU3NvID0gNCwgLy8gUmVxdWlyZXMgdXNlcnMgdG8gYXV0aGVudGljYXRlIHdpdGggU1NPXG4gICAgUGVyc29uYWxPd25lcnNoaXAgPSA1LCAvLyBEaXNhYmxlcyBwZXJzb25hbCB2YXVsdCBvd25lcnNoaXAgZm9yIGFkZGluZy9jbG9uaW5nIGl0ZW1zXG4gICAgRGlzYWJsZVNlbmQgPSA2LCAvLyBEaXNhYmxlcyB0aGUgYWJpbGl0eSB0byBjcmVhdGUgYW5kIGVkaXQgQml0d2FyZGVuIFNlbmRzXG4gICAgU2VuZE9wdGlvbnMgPSA3LCAvLyBTZXRzIHJlc3RyaWN0aW9ucyBvciBkZWZhdWx0cyBmb3IgQml0d2FyZGVuIFNlbmRzXG4gICAgUmVzZXRQYXNzd29yZCA9IDgsIC8vIEFsbG93cyBvcmdzIHRvIHVzZSByZXNldCBwYXNzd29yZCA6IGFsc28gY2FuIGVuYWJsZSBhdXRvLWVucm9sbG1lbnQgZHVyaW5nIGludml0ZSBmbG93XG4gICAgTWF4aW11bVZhdWx0VGltZW91dCA9IDksIC8vIFNldHMgdGhlIG1heGltdW0gYWxsb3dlZCB2YXVsdCB0aW1lb3V0XG4gICAgRGlzYWJsZVBlcnNvbmFsVmF1bHRFeHBvcnQgPSAxMCwgLy8gRGlzYWJsZSBwZXJzb25hbCB2YXVsdCBleHBvcnRcbn1cbiIsImV4cG9ydCBlbnVtIFByb3ZpZGVyVXNlclN0YXR1c1R5cGUge1xuICAgIEludml0ZWQgPSAwLFxuICAgIEFjY2VwdGVkID0gMSxcbiAgICBDb25maXJtZWQgPSAyLFxufVxuIiwiZXhwb3J0IGVudW0gUHJvdmlkZXJVc2VyVHlwZSB7XG4gICAgUHJvdmlkZXJBZG1pbiA9IDAsXG4gICAgU2VydmljZVVzZXIgPSAxLFxufVxuIiwiZXhwb3J0IGVudW0gU2VjdXJlTm90ZVR5cGUge1xuICAgIEdlbmVyaWMgPSAwLFxufVxuIiwiZXhwb3J0IGVudW0gU2VuZFR5cGUge1xuICAgIFRleHQgPSAwLFxuICAgIEZpbGUgPSAxLFxufVxuIiwiZXhwb3J0IGVudW0gVGhlbWVUeXBlIHtcbiAgICBTeXN0ZW0gPSAnc3lzdGVtJyxcbiAgICBMaWdodCA9ICdsaWdodCcsXG4gICAgRGFyayA9ICdkYXJrJyxcbiAgICBOb3JkID0gJ25vcmQnLFxuICAgIFNvbGFyaXplZERhcmsgPSAnc29sYXJpemVkRGFyaycsXG59XG4iLCJleHBvcnQgZW51bSBUd29GYWN0b3JQcm92aWRlclR5cGUge1xuICAgIEF1dGhlbnRpY2F0b3IgPSAwLFxuICAgIEVtYWlsID0gMSxcbiAgICBEdW8gPSAyLFxuICAgIFl1YmlrZXkgPSAzLFxuICAgIFUyZiA9IDQsXG4gICAgUmVtZW1iZXIgPSA1LFxuICAgIE9yZ2FuaXphdGlvbkR1byA9IDYsXG4gICAgV2ViQXV0aG4gPSA3LFxufVxuIiwiZXhwb3J0IGVudW0gVXJpTWF0Y2hUeXBlIHtcbiAgICBEb21haW4gPSAwLFxuICAgIEhvc3QgPSAxLFxuICAgIFN0YXJ0c1dpdGggPSAyLFxuICAgIEV4YWN0ID0gMyxcbiAgICBSZWd1bGFyRXhwcmVzc2lvbiA9IDQsXG4gICAgTmV2ZXIgPSA1LFxufVxuIiwiaW1wb3J0IHsgSXRlbVZpZXcgfSBmcm9tICcuLi9tb2RlbHMvdmlldy9pdGVtVmlldyc7XG5cbmltcG9ydCB7IExpbmtlZElkVHlwZSB9IGZyb20gJy4uL2VudW1zL2xpbmtlZElkVHlwZSc7XG5cbmV4cG9ydCBjbGFzcyBMaW5rZWRNZXRhZGF0YSB7XG4gICAgY29uc3RydWN0b3IocmVhZG9ubHkgcHJvcGVydHlLZXk6IHN0cmluZywgcHJpdmF0ZSByZWFkb25seSBfaTE4bktleT86IHN0cmluZykgeyB9XG5cbiAgICBnZXQgaTE4bktleSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2kxOG5LZXkgPz8gdGhpcy5wcm9wZXJ0eUtleTtcbiAgICB9XG59XG5cbi8qKlxuICogQSBkZWNvcmF0b3IgdXNlZCB0byBzZXQgbWV0YWRhdGEgdXNlZCBieSBMaW5rZWQgY3VzdG9tIGZpZWxkcy4gQXBwbHkgaXQgdG8gYSBjbGFzcyBwcm9wZXJ0eSBvciBnZXR0ZXIgdG8gbWFrZSBpdFxuICogICAgYXZhaWxhYmxlIGFzIGEgTGlua2VkIGN1c3RvbSBmaWVsZCBvcHRpb24uXG4gKiBAcGFyYW0gaWQgLSBBIHVuaXF1ZSB2YWx1ZSB0aGF0IGlzIHNhdmVkIGluIHRoZSBGaWVsZCBtb2RlbC4gSXQgaXMgdXNlZCB0byBsb29rIHVwIHRoZSBkZWNvcmF0ZWQgY2xhc3MgcHJvcGVydHkuXG4gKiBAcGFyYW0gaTE4bktleSAtIFRoZSBpMThuIGtleSB1c2VkIHRvIGRlc2NyaWJlIHRoZSBkZWNvcmF0ZWQgY2xhc3MgcHJvcGVydHkgaW4gdGhlIFVJLiBJZiBpdCBpcyBudWxsLCB0aGVuIHRoZSBuYW1lXG4gKiAgICBvZiB0aGUgY2xhc3MgcHJvcGVydHkgd2lsbCBiZSB1c2VkIGFzIHRoZSBpMThuIGtleS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxpbmtlZEZpZWxkT3B0aW9uKGlkOiBMaW5rZWRJZFR5cGUsIGkxOG5LZXk/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gKHByb3RvdHlwZTogSXRlbVZpZXcsIHByb3BlcnR5S2V5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgaWYgKHByb3RvdHlwZS5saW5rZWRGaWVsZE9wdGlvbnMgPT0gbnVsbCkge1xuICAgICAgICAgICAgcHJvdG90eXBlLmxpbmtlZEZpZWxkT3B0aW9ucyA9IG5ldyBNYXA8TGlua2VkSWRUeXBlLCBMaW5rZWRNZXRhZGF0YT4oKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHByb3RvdHlwZS5saW5rZWRGaWVsZE9wdGlvbnMuc2V0KGlkLCBuZXcgTGlua2VkTWV0YWRhdGEocHJvcGVydHlLZXksIGkxOG5LZXkpKTtcbiAgICB9O1xufVxuIiwiLyoqXG4gKiBVc2UgYXMgYSBEZWNvcmF0b3Igb24gYXN5bmMgZnVuY3Rpb25zLCBpdCB3aWxsIHByZXZlbnQgbXVsdGlwbGUgJ2FjdGl2ZScgY2FsbHMgYXMgdGhlIHNhbWUgdGltZVxuICpcbiAqIElmIGEgcHJvbWlzZSB3YXMgcmV0dXJuZWQgZnJvbSBhIHByZXZpb3VzIGNhbGwgdG8gdGhpcyBmdW5jdGlvbiwgdGhhdCBoYXNuJ3QgeWV0IHJlc29sdmVkIGl0IHdpbGxcbiAqIGJlIHJldHVybmVkLCBpbnN0ZWFkIG9mIGNhbGxpbmcgdGhlIG9yaWdpbmFsIGZ1bmN0aW9uIGFnYWluXG4gKlxuICogUmVzdWx0cyBhcmUgbm90IGNhY2hlZCwgb25jZSB0aGUgcHJvbWlzZSBoYXMgcmV0dXJuZWQsIHRoZSBuZXh0IGNhbGwgd2lsbCByZXN1bHQgaW4gYSBmcmVzaCBjYWxsXG4gKlxuICogUmVhZCBtb3JlIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9iaXR3YXJkZW4vanNsaWIvcHVsbC83XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXF1ZW50aWFsaXplKGNhY2hlS2V5OiAoYXJnczogYW55W10pID0+IHN0cmluZykge1xuICAgIHJldHVybiAodGFyZ2V0OiBhbnksIHByb3BlcnR5S2V5OiBzdHJpbmcgfCBzeW1ib2wsIGRlc2NyaXB0b3I6IFByb3BlcnR5RGVzY3JpcHRvcikgPT4ge1xuICAgICAgICBjb25zdCBvcmlnaW5hbE1ldGhvZDogKCkgPT4gUHJvbWlzZTxhbnk+ID0gZGVzY3JpcHRvci52YWx1ZTtcbiAgICAgICAgY29uc3QgY2FjaGVzID0gbmV3IE1hcDxhbnksIE1hcDxzdHJpbmcsIFByb21pc2U8YW55Pj4+KCk7XG5cbiAgICAgICAgY29uc3QgZ2V0Q2FjaGUgPSAob2JqOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGxldCBjYWNoZSA9IGNhY2hlcy5nZXQob2JqKTtcbiAgICAgICAgICAgIGlmIChjYWNoZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FjaGUgPSBuZXcgTWFwPHN0cmluZywgUHJvbWlzZTxhbnk+PigpO1xuICAgICAgICAgICAgY2FjaGVzLnNldChvYmosIGNhY2hlKTtcbiAgICAgICAgICAgIHJldHVybiBjYWNoZTtcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2FjaGUgPSBnZXRDYWNoZSh0aGlzKTtcbiAgICAgICAgICAgICAgICBjb25zdCBhcmdzQ2FjaGVLZXkgPSBjYWNoZUtleShhcmdzKTtcbiAgICAgICAgICAgICAgICBsZXQgcmVzcG9uc2UgPSBjYWNoZS5nZXQoYXJnc0NhY2hlS2V5KTtcbiAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3Qgb25GaW5hbGx5ID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjYWNoZS5kZWxldGUoYXJnc0NhY2hlS2V5KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNhY2hlLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlcy5kZWxldGUodGhpcyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gb3JpZ2luYWxNZXRob2QuYXBwbHkodGhpcywgYXJncykudGhlbigodmFsOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgb25GaW5hbGx5KCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWw7XG4gICAgICAgICAgICAgICAgfSkuY2F0Y2goKGVycjogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIG9uRmluYWxseSgpO1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBjYWNoZS5zZXQoYXJnc0NhY2hlS2V5LCByZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICB9O1xufVxuIiwiaW1wb3J0IHtcbiAgICBJVHJlZU5vZGVPYmplY3QsXG4gICAgVHJlZU5vZGUsXG59IGZyb20gJy4uL21vZGVscy9kb21haW4vdHJlZU5vZGUnO1xuXG5leHBvcnQgY2xhc3MgU2VydmljZVV0aWxzIHtcbiAgICBzdGF0aWMgbmVzdGVkVHJhdmVyc2Uobm9kZVRyZWU6IFRyZWVOb2RlPElUcmVlTm9kZU9iamVjdD5bXSwgcGFydEluZGV4OiBudW1iZXIsIHBhcnRzOiBzdHJpbmdbXSxcbiAgICAgICAgb2JqOiBJVHJlZU5vZGVPYmplY3QsIHBhcmVudDogSVRyZWVOb2RlT2JqZWN0LCBkZWxpbWl0ZXI6IHN0cmluZykge1xuICAgICAgICBpZiAocGFydHMubGVuZ3RoIDw9IHBhcnRJbmRleCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZW5kID0gcGFydEluZGV4ID09PSBwYXJ0cy5sZW5ndGggLSAxO1xuICAgICAgICBjb25zdCBwYXJ0TmFtZSA9IHBhcnRzW3BhcnRJbmRleF07XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2RlVHJlZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKG5vZGVUcmVlW2ldLm5vZGUubmFtZSAhPT0gcGFydHNbcGFydEluZGV4XSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGVuZCAmJiBub2RlVHJlZVtpXS5ub2RlLmlkICE9PSBvYmouaWQpIHtcbiAgICAgICAgICAgICAgICAvLyBBbm90aGVyIG5vZGUgd2l0aCB0aGUgc2FtZSBuYW1lLlxuICAgICAgICAgICAgICAgIG5vZGVUcmVlLnB1c2gobmV3IFRyZWVOb2RlKG9iaiwgcGFydE5hbWUsIHBhcmVudCkpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFNlcnZpY2VVdGlscy5uZXN0ZWRUcmF2ZXJzZShub2RlVHJlZVtpXS5jaGlsZHJlbiwgcGFydEluZGV4ICsgMSwgcGFydHMsXG4gICAgICAgICAgICAgICAgb2JqLCBub2RlVHJlZVtpXS5ub2RlLCBkZWxpbWl0ZXIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG5vZGVUcmVlLmZpbHRlcihuID0+IG4ubm9kZS5uYW1lID09PSBwYXJ0TmFtZSkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBpZiAoZW5kKSB7XG4gICAgICAgICAgICAgICAgbm9kZVRyZWUucHVzaChuZXcgVHJlZU5vZGUob2JqLCBwYXJ0TmFtZSwgcGFyZW50KSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbmV3UGFydE5hbWUgPSBwYXJ0c1twYXJ0SW5kZXhdICsgZGVsaW1pdGVyICsgcGFydHNbcGFydEluZGV4ICsgMV07XG4gICAgICAgICAgICBTZXJ2aWNlVXRpbHMubmVzdGVkVHJhdmVyc2Uobm9kZVRyZWUsIDAsIFtuZXdQYXJ0TmFtZSwgLi4ucGFydHMuc2xpY2UocGFydEluZGV4ICsgMildLFxuICAgICAgICAgICAgICAgIG9iaiwgcGFyZW50LCBkZWxpbWl0ZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGdldFRyZWVOb2RlT2JqZWN0KG5vZGVUcmVlOiBUcmVlTm9kZTxJVHJlZU5vZGVPYmplY3Q+W10sIGlkOiBzdHJpbmcpOiBUcmVlTm9kZTxJVHJlZU5vZGVPYmplY3Q+IHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2RlVHJlZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKG5vZGVUcmVlW2ldLm5vZGUuaWQgPT09IGlkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5vZGVUcmVlW2ldO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChub2RlVHJlZVtpXS5jaGlsZHJlbiAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgbm9kZSA9IFNlcnZpY2VVdGlscy5nZXRUcmVlTm9kZU9iamVjdChub2RlVHJlZVtpXS5jaGlsZHJlbiwgaWQpO1xuICAgICAgICAgICAgICAgIGlmIChub2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59XG4iLCIvKipcbiAqIFVzZSBhcyBhIERlY29yYXRvciBvbiBhc3luYyBmdW5jdGlvbnMsIGl0IHdpbGwgbGltaXQgaG93IG1hbnkgdGltZXMgdGhlIGZ1bmN0aW9uIGNhbiBiZVxuICogaW4tZmxpZ2h0IGF0IGEgdGltZS5cbiAqXG4gKiBDYWxscyBiZXlvbmQgdGhlIGxpbWl0IHdpbGwgYmUgcXVldWVkLCBhbmQgcnVuIHdoZW4gb25lIG9mIHRoZSBhY3RpdmUgY2FsbHMgZmluaXNoZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRocm90dGxlKGxpbWl0OiBudW1iZXIsIHRocm90dGxlS2V5OiAoYXJnczogYW55W10pID0+IHN0cmluZykge1xuICAgIHJldHVybiA8VD4odGFyZ2V0OiBhbnksIHByb3BlcnR5S2V5OiBzdHJpbmcgfCBzeW1ib2wsXG4gICAgICAgIGRlc2NyaXB0b3I6IFR5cGVkUHJvcGVydHlEZXNjcmlwdG9yPCguLi5hcmdzOiBhbnlbXSkgPT4gUHJvbWlzZTxUPj4pID0+IHtcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxNZXRob2Q6ICgpID0+IFByb21pc2U8VD4gPSBkZXNjcmlwdG9yLnZhbHVlO1xuICAgICAgICBjb25zdCBhbGxUaHJvdHRsZXMgPSBuZXcgTWFwPGFueSwgTWFwPHN0cmluZywgKCgpID0+IHZvaWQpW10+PigpO1xuXG4gICAgICAgIGNvbnN0IGdldFRocm90dGxlcyA9IChvYmo6IGFueSkgPT4ge1xuICAgICAgICAgICAgbGV0IHRocm90dGxlcyA9IGFsbFRocm90dGxlcy5nZXQob2JqKTtcbiAgICAgICAgICAgIGlmICh0aHJvdHRsZXMgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aHJvdHRsZXM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdHRsZXMgPSBuZXcgTWFwPHN0cmluZywgKCgpID0+IHZvaWQpW10+KCk7XG4gICAgICAgICAgICBhbGxUaHJvdHRsZXMuc2V0KG9iaiwgdGhyb3R0bGVzKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvdHRsZXM7XG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiguLi5hcmdzOiBhbnlbXSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRocm90dGxlcyA9IGdldFRocm90dGxlcyh0aGlzKTtcbiAgICAgICAgICAgICAgICBjb25zdCBhcmdzVGhyb3R0bGVLZXkgPSB0aHJvdHRsZUtleShhcmdzKTtcbiAgICAgICAgICAgICAgICBsZXQgcXVldWUgPSB0aHJvdHRsZXMuZ2V0KGFyZ3NUaHJvdHRsZUtleSk7XG4gICAgICAgICAgICAgICAgaWYgKHF1ZXVlID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcXVldWUgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3R0bGVzLnNldChhcmdzVGhyb3R0bGVLZXksIHF1ZXVlKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8VD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBleGVjID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb25GaW5hbGx5ID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlLnNwbGljZShxdWV1ZS5pbmRleE9mKGV4ZWMpLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocXVldWUubGVuZ3RoID49IGxpbWl0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlW2xpbWl0IC0gMV0oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHF1ZXVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdHRsZXMuZGVsZXRlKGFyZ3NUaHJvdHRsZUtleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aHJvdHRsZXMuc2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsVGhyb3R0bGVzLmRlbGV0ZSh0aGlzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbE1ldGhvZC5hcHBseSh0aGlzLCBhcmdzKS50aGVuKCh2YWw6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uRmluYWxseSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWw7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KS5jYXRjaCgoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkZpbmFsbHkoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KS50aGVuKHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIHF1ZXVlLnB1c2goZXhlYyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChxdWV1ZS5sZW5ndGggPD0gbGltaXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWMoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICB9O1xufVxuIiwiaW1wb3J0ICogYXMgdGxkanMgZnJvbSAndGxkanMnO1xuXG5pbXBvcnQgeyBJMThuU2VydmljZSB9IGZyb20gJy4uL2Fic3RyYWN0aW9ucy9pMThuLnNlcnZpY2UnO1xuXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmVcbmNvbnN0IG5vZGVVUkwgPSB0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJyA/IHJlcXVpcmUoJ3VybCcpIDogbnVsbDtcblxuZXhwb3J0IGNsYXNzIFV0aWxzIHtcbiAgICBzdGF0aWMgaW5pdGVkID0gZmFsc2U7XG4gICAgc3RhdGljIGlzTmF0aXZlU2NyaXB0ID0gZmFsc2U7XG4gICAgc3RhdGljIGlzTm9kZSA9IGZhbHNlO1xuICAgIHN0YXRpYyBpc0Jyb3dzZXIgPSB0cnVlO1xuICAgIHN0YXRpYyBpc01vYmlsZUJyb3dzZXIgPSBmYWxzZTtcbiAgICBzdGF0aWMgaXNBcHBsZU1vYmlsZUJyb3dzZXIgPSBmYWxzZTtcbiAgICBzdGF0aWMgZ2xvYmFsOiBhbnkgPSBudWxsO1xuICAgIHN0YXRpYyB0bGRFbmRpbmdSZWdleCA9IC8uKlxcLihjb218bmV0fG9yZ3xlZHV8dWt8Z292fGNhfGRlfGpwfGZyfGF1fHJ1fGNofGlvfGVzfHVzfGNvfHh5enxpbmZvfGx5fG1pbCkkLztcbiAgICAvLyBUcmFuc3BpbGVkIHZlcnNpb24gb2YgL1xccHtFbW9qaV9QcmVzZW50YXRpb259L2d1IHVzaW5nIGh0dHBzOi8vbW90aGVyZWZmLmluL3JlZ2V4cHUuIFVzZWQgZm9yIGNvbXBhdGFiaWxpdHkgaW4gb2xkZXIgYnJvd3NlcnMuXG4gICAgc3RhdGljIHJlZ2V4cEVtb2ppUHJlc2VudGF0aW9uID0gIC8oPzpbXFx1MjMxQVxcdTIzMUJcXHUyM0U5LVxcdTIzRUNcXHUyM0YwXFx1MjNGM1xcdTI1RkRcXHUyNUZFXFx1MjYxNFxcdTI2MTVcXHUyNjQ4LVxcdTI2NTNcXHUyNjdGXFx1MjY5M1xcdTI2QTFcXHUyNkFBXFx1MjZBQlxcdTI2QkRcXHUyNkJFXFx1MjZDNFxcdTI2QzVcXHUyNkNFXFx1MjZENFxcdTI2RUFcXHUyNkYyXFx1MjZGM1xcdTI2RjVcXHUyNkZBXFx1MjZGRFxcdTI3MDVcXHUyNzBBXFx1MjcwQlxcdTI3MjhcXHUyNzRDXFx1Mjc0RVxcdTI3NTMtXFx1Mjc1NVxcdTI3NTdcXHUyNzk1LVxcdTI3OTdcXHUyN0IwXFx1MjdCRlxcdTJCMUJcXHUyQjFDXFx1MkI1MFxcdTJCNTVdfFxcdUQ4M0NbXFx1REMwNFxcdURDQ0ZcXHVERDhFXFx1REQ5MS1cXHVERDlBXFx1RERFNi1cXHVEREZGXFx1REUwMVxcdURFMUFcXHVERTJGXFx1REUzMi1cXHVERTM2XFx1REUzOC1cXHVERTNBXFx1REU1MFxcdURFNTFcXHVERjAwLVxcdURGMjBcXHVERjJELVxcdURGMzVcXHVERjM3LVxcdURGN0NcXHVERjdFLVxcdURGOTNcXHVERkEwLVxcdURGQ0FcXHVERkNGLVxcdURGRDNcXHVERkUwLVxcdURGRjBcXHVERkY0XFx1REZGOC1cXHVERkZGXXxcXHVEODNEW1xcdURDMDAtXFx1REMzRVxcdURDNDBcXHVEQzQyLVxcdURDRkNcXHVEQ0ZGLVxcdUREM0RcXHVERDRCLVxcdURENEVcXHVERDUwLVxcdURENjdcXHVERDdBXFx1REQ5NVxcdUREOTZcXHVEREE0XFx1RERGQi1cXHVERTRGXFx1REU4MC1cXHVERUM1XFx1REVDQ1xcdURFRDAtXFx1REVEMlxcdURFRDUtXFx1REVEN1xcdURFRUJcXHVERUVDXFx1REVGNC1cXHVERUZDXFx1REZFMC1cXHVERkVCXXxcXHVEODNFW1xcdUREMEMtXFx1REQzQVxcdUREM0MtXFx1REQ0NVxcdURENDctXFx1REQ3OFxcdUREN0EtXFx1RERDQlxcdUREQ0QtXFx1RERGRlxcdURFNzAtXFx1REU3NFxcdURFNzgtXFx1REU3QVxcdURFODAtXFx1REU4NlxcdURFOTAtXFx1REVBOFxcdURFQjAtXFx1REVCNlxcdURFQzAtXFx1REVDMlxcdURFRDAtXFx1REVENl0pL2c7XG5cbiAgICBzdGF0aWMgaW5pdCgpIHtcbiAgICAgICAgaWYgKFV0aWxzLmluaXRlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgVXRpbHMuaW5pdGVkID0gdHJ1ZTtcbiAgICAgICAgVXRpbHMuaXNOb2RlID0gdHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmIChwcm9jZXNzIGFzIGFueSkucmVsZWFzZSAhPSBudWxsICYmXG4gICAgICAgICAgICAocHJvY2VzcyBhcyBhbnkpLnJlbGVhc2UubmFtZSA9PT0gJ25vZGUnO1xuICAgICAgICBVdGlscy5pc0Jyb3dzZXIgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJztcbiAgICAgICAgVXRpbHMuaXNOYXRpdmVTY3JpcHQgPSAhVXRpbHMuaXNOb2RlICYmICFVdGlscy5pc0Jyb3dzZXI7XG4gICAgICAgIFV0aWxzLmlzTW9iaWxlQnJvd3NlciA9IFV0aWxzLmlzQnJvd3NlciAmJiB0aGlzLmlzTW9iaWxlKHdpbmRvdyk7XG4gICAgICAgIFV0aWxzLmlzQXBwbGVNb2JpbGVCcm93c2VyID0gVXRpbHMuaXNCcm93c2VyICYmIHRoaXMuaXNBcHBsZU1vYmlsZSh3aW5kb3cpO1xuICAgICAgICBVdGlscy5nbG9iYWwgPSBVdGlscy5pc05hdGl2ZVNjcmlwdCA/IGdsb2JhbCA6IChVdGlscy5pc05vZGUgJiYgIVV0aWxzLmlzQnJvd3NlciA/IGdsb2JhbCA6IHdpbmRvdyk7XG4gICAgfVxuXG4gICAgc3RhdGljIGZyb21CNjRUb0FycmF5KHN0cjogc3RyaW5nKTogVWludDhBcnJheSB7XG4gICAgICAgIGlmIChVdGlscy5pc05vZGUgfHwgVXRpbHMuaXNOYXRpdmVTY3JpcHQpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShCdWZmZXIuZnJvbShzdHIsICdiYXNlNjQnKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBiaW5hcnlTdHJpbmcgPSB3aW5kb3cuYXRvYihzdHIpO1xuICAgICAgICAgICAgY29uc3QgYnl0ZXMgPSBuZXcgVWludDhBcnJheShiaW5hcnlTdHJpbmcubGVuZ3RoKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYmluYXJ5U3RyaW5nLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgYnl0ZXNbaV0gPSBiaW5hcnlTdHJpbmcuY2hhckNvZGVBdChpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBieXRlcztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBmcm9tVXJsQjY0VG9BcnJheShzdHI6IHN0cmluZyk6IFVpbnQ4QXJyYXkge1xuICAgICAgICByZXR1cm4gVXRpbHMuZnJvbUI2NFRvQXJyYXkoVXRpbHMuZnJvbVVybEI2NFRvQjY0KHN0cikpO1xuICAgIH1cblxuICAgIHN0YXRpYyBmcm9tSGV4VG9BcnJheShzdHI6IHN0cmluZyk6IFVpbnQ4QXJyYXkge1xuICAgICAgICBpZiAoVXRpbHMuaXNOb2RlIHx8IFV0aWxzLmlzTmF0aXZlU2NyaXB0KSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoQnVmZmVyLmZyb20oc3RyLCAnaGV4JykpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgYnl0ZXMgPSBuZXcgVWludDhBcnJheShzdHIubGVuZ3RoIC8gMik7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgICAgICAgICAgIGJ5dGVzW2kgLyAyXSA9IHBhcnNlSW50KHN0ci5zdWJzdHIoaSwgMiksIDE2KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBieXRlcztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBmcm9tVXRmOFRvQXJyYXkoc3RyOiBzdHJpbmcpOiBVaW50OEFycmF5IHtcbiAgICAgICAgaWYgKFV0aWxzLmlzTm9kZSB8fCBVdGlscy5pc05hdGl2ZVNjcmlwdCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KEJ1ZmZlci5mcm9tKHN0ciwgJ3V0ZjgnKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBzdHJVdGY4ID0gdW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KHN0cikpO1xuICAgICAgICAgICAgY29uc3QgYXJyID0gbmV3IFVpbnQ4QXJyYXkoc3RyVXRmOC5sZW5ndGgpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHJVdGY4Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgYXJyW2ldID0gc3RyVXRmOC5jaGFyQ29kZUF0KGkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGFycjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBmcm9tQnl0ZVN0cmluZ1RvQXJyYXkoc3RyOiBzdHJpbmcpOiBVaW50OEFycmF5IHtcbiAgICAgICAgY29uc3QgYXJyID0gbmV3IFVpbnQ4QXJyYXkoc3RyLmxlbmd0aCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBhcnJbaV0gPSBzdHIuY2hhckNvZGVBdChpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXJyO1xuICAgIH1cblxuICAgIHN0YXRpYyBmcm9tQnVmZmVyVG9CNjQoYnVmZmVyOiBBcnJheUJ1ZmZlcik6IHN0cmluZyB7XG4gICAgICAgIGlmIChVdGlscy5pc05vZGUgfHwgVXRpbHMuaXNOYXRpdmVTY3JpcHQpIHtcbiAgICAgICAgICAgIHJldHVybiBCdWZmZXIuZnJvbShidWZmZXIpLnRvU3RyaW5nKCdiYXNlNjQnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBiaW5hcnkgPSAnJztcbiAgICAgICAgICAgIGNvbnN0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnl0ZXMuYnl0ZUxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgYmluYXJ5ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnl0ZXNbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHdpbmRvdy5idG9hKGJpbmFyeSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgZnJvbUJ1ZmZlclRvVXJsQjY0KGJ1ZmZlcjogQXJyYXlCdWZmZXIpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gVXRpbHMuZnJvbUI2NHRvVXJsQjY0KFV0aWxzLmZyb21CdWZmZXJUb0I2NChidWZmZXIpKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZnJvbUI2NHRvVXJsQjY0KGI2NFN0cjogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiBiNjRTdHIucmVwbGFjZSgvXFwrL2csICctJylcbiAgICAgICAgICAgIC5yZXBsYWNlKC9cXC8vZywgJ18nKVxuICAgICAgICAgICAgLnJlcGxhY2UoLz0vZywgJycpO1xuICAgIH1cblxuICAgIHN0YXRpYyBmcm9tQnVmZmVyVG9VdGY4KGJ1ZmZlcjogQXJyYXlCdWZmZXIpOiBzdHJpbmcge1xuICAgICAgICBpZiAoVXRpbHMuaXNOb2RlIHx8IFV0aWxzLmlzTmF0aXZlU2NyaXB0KSB7XG4gICAgICAgICAgICByZXR1cm4gQnVmZmVyLmZyb20oYnVmZmVyKS50b1N0cmluZygndXRmOCcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgYnl0ZXMgPSBuZXcgVWludDhBcnJheShidWZmZXIpO1xuICAgICAgICAgICAgY29uc3QgZW5jb2RlZFN0cmluZyA9IFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgYnl0ZXMpO1xuICAgICAgICAgICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChlc2NhcGUoZW5jb2RlZFN0cmluZykpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGZyb21CdWZmZXJUb0J5dGVTdHJpbmcoYnVmZmVyOiBBcnJheUJ1ZmZlcik6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIG5ldyBVaW50OEFycmF5KGJ1ZmZlcikpO1xuICAgIH1cblxuICAgIC8vIHJlZjogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzQwMDMxOTc5LzEwOTAzNTlcbiAgICBzdGF0aWMgZnJvbUJ1ZmZlclRvSGV4KGJ1ZmZlcjogQXJyYXlCdWZmZXIpOiBzdHJpbmcge1xuICAgICAgICBpZiAoVXRpbHMuaXNOb2RlIHx8IFV0aWxzLmlzTmF0aXZlU2NyaXB0KSB7XG4gICAgICAgICAgICByZXR1cm4gQnVmZmVyLmZyb20oYnVmZmVyKS50b1N0cmluZygnaGV4Jyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBieXRlcyA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlcik7XG4gICAgICAgICAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLm1hcC5jYWxsKGJ5dGVzLCAoeDogbnVtYmVyKSA9PiAoJzAwJyArIHgudG9TdHJpbmcoMTYpKS5zbGljZSgtMikpLmpvaW4oJycpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGZyb21VcmxCNjRUb0I2NCh1cmxCNjRTdHI6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGxldCBvdXRwdXQgPSB1cmxCNjRTdHIucmVwbGFjZSgvLS9nLCAnKycpLnJlcGxhY2UoL18vZywgJy8nKTtcbiAgICAgICAgc3dpdGNoIChvdXRwdXQubGVuZ3RoICUgNCkge1xuICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgIG91dHB1dCArPSAnPT0nO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgIG91dHB1dCArPSAnPSc7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSWxsZWdhbCBiYXNlNjR1cmwgc3RyaW5nIScpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICB9XG5cbiAgICBzdGF0aWMgZnJvbVVybEI2NFRvVXRmOCh1cmxCNjRTdHI6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBVdGlscy5mcm9tQjY0VG9VdGY4KFV0aWxzLmZyb21VcmxCNjRUb0I2NCh1cmxCNjRTdHIpKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZnJvbVV0ZjhUb0I2NCh1dGZTdHI6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGlmIChVdGlscy5pc05vZGUgfHwgVXRpbHMuaXNOYXRpdmVTY3JpcHQpIHtcbiAgICAgICAgICAgIHJldHVybiBCdWZmZXIuZnJvbSh1dGZTdHIsICd1dGY4JykudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChlc2NhcGUod2luZG93LmJ0b2EodXRmU3RyKSkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGZyb21VdGY4VG9VcmxCNjQodXRmU3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gVXRpbHMuZnJvbUJ1ZmZlclRvVXJsQjY0KFV0aWxzLmZyb21VdGY4VG9BcnJheSh1dGZTdHIpKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZnJvbUI2NFRvVXRmOChiNjRTdHI6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGlmIChVdGlscy5pc05vZGUgfHwgVXRpbHMuaXNOYXRpdmVTY3JpcHQpIHtcbiAgICAgICAgICAgIHJldHVybiBCdWZmZXIuZnJvbShiNjRTdHIsICdiYXNlNjQnKS50b1N0cmluZygndXRmOCcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChlc2NhcGUod2luZG93LmF0b2IoYjY0U3RyKSkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gcmVmOiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8yMTE3NTIzLzEwOTAzNTlcbiAgICBzdGF0aWMgbmV3R3VpZCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gJ3h4eHh4eHh4LXh4eHgtNHh4eC15eHh4LXh4eHh4eHh4eHh4eCcucmVwbGFjZSgvW3h5XS9nLCBjID0+IHtcbiAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZVxuICAgICAgICAgICAgY29uc3QgciA9IE1hdGgucmFuZG9tKCkgKiAxNiB8IDA7XG4gICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAgICAgICAgIGNvbnN0IHYgPSBjID09PSAneCcgPyByIDogKHIgJiAweDMgfCAweDgpO1xuICAgICAgICAgICAgcmV0dXJuIHYudG9TdHJpbmcoMTYpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzdGF0aWMgaXNHdWlkKGlkOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIFJlZ0V4cCgvXlswLTlhLWZdezh9LVswLTlhLWZdezR9LVsxLTVdWzAtOWEtZl17M30tWzg5YWJdWzAtOWEtZl17M30tWzAtOWEtZl17MTJ9JC8sICdpJykudGVzdChpZCk7XG4gICAgfVxuXG4gICAgc3RhdGljIGdldEhvc3RuYW1lKHVyaVN0cmluZzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgdXJsID0gVXRpbHMuZ2V0VXJsKHVyaVN0cmluZyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gdXJsICE9IG51bGwgJiYgdXJsLmhvc3RuYW1lICE9PSAnJyA/IHVybC5ob3N0bmFtZSA6IG51bGw7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0SG9zdCh1cmlTdHJpbmc6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IHVybCA9IFV0aWxzLmdldFVybCh1cmlTdHJpbmcpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIHVybCAhPSBudWxsICYmIHVybC5ob3N0ICE9PSAnJyA/IHVybC5ob3N0IDogbnVsbDtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBnZXREb21haW4odXJpU3RyaW5nOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBpZiAodXJpU3RyaW5nID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgdXJpU3RyaW5nID0gdXJpU3RyaW5nLnRyaW0oKTtcbiAgICAgICAgaWYgKHVyaVN0cmluZyA9PT0gJycpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHVyaVN0cmluZy5zdGFydHNXaXRoKCdkYXRhOicpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBodHRwVXJsID0gdXJpU3RyaW5nLnN0YXJ0c1dpdGgoJ2h0dHA6Ly8nKSB8fCB1cmlTdHJpbmcuc3RhcnRzV2l0aCgnaHR0cHM6Ly8nKTtcbiAgICAgICAgaWYgKCFodHRwVXJsICYmIHVyaVN0cmluZy5pbmRleE9mKCc6Ly8nKSA8IDAgJiYgVXRpbHMudGxkRW5kaW5nUmVnZXgudGVzdCh1cmlTdHJpbmcpKSB7XG4gICAgICAgICAgICB1cmlTdHJpbmcgPSAnaHR0cDovLycgKyB1cmlTdHJpbmc7XG4gICAgICAgICAgICBodHRwVXJsID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChodHRwVXJsKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHVybCA9IFV0aWxzLmdldFVybE9iamVjdCh1cmlTdHJpbmcpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbGlkSG9zdG5hbWUgPSB0bGRqcz8uaXNWYWxpZCAhPSBudWxsID8gdGxkanMuaXNWYWxpZCh1cmwuaG9zdG5hbWUpIDogdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAoIXZhbGlkSG9zdG5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHVybC5ob3N0bmFtZSA9PT0gJ2xvY2FsaG9zdCcgfHwgVXRpbHMudmFsaWRJcEFkZHJlc3ModXJsLmhvc3RuYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdXJsLmhvc3RuYW1lO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IHVybERvbWFpbiA9IHRsZGpzICE9IG51bGwgJiYgdGxkanMuZ2V0RG9tYWluICE9IG51bGwgPyB0bGRqcy5nZXREb21haW4odXJsLmhvc3RuYW1lKSA6IG51bGw7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVybERvbWFpbiAhPSBudWxsID8gdXJsRG9tYWluIDogdXJsLmhvc3RuYW1lO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIC8vIEludmFsaWQgZG9tYWluLCB0cnkgYW5vdGhlciBhcHByb2FjaCBiZWxvdy5cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBkb21haW4gPSB0bGRqcyAhPSBudWxsICYmIHRsZGpzLmdldERvbWFpbiAhPSBudWxsID8gdGxkanMuZ2V0RG9tYWluKHVyaVN0cmluZykgOiBudWxsO1xuXG4gICAgICAgICAgICBpZiAoZG9tYWluICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZG9tYWluO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgc3RhdGljIGdldFF1ZXJ5UGFyYW1zKHVyaVN0cmluZzogc3RyaW5nKTogTWFwPHN0cmluZywgc3RyaW5nPiB7XG4gICAgICAgIGNvbnN0IHVybCA9IFV0aWxzLmdldFVybCh1cmlTdHJpbmcpO1xuICAgICAgICBpZiAodXJsID09IG51bGwgfHwgdXJsLnNlYXJjaCA9PSBudWxsIHx8IHVybC5zZWFyY2ggPT09ICcnKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtYXAgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICAgICAgICBjb25zdCBwYWlycyA9ICh1cmwuc2VhcmNoWzBdID09PSAnPycgPyB1cmwuc2VhcmNoLnN1YnN0cigxKSA6IHVybC5zZWFyY2gpLnNwbGl0KCcmJyk7XG4gICAgICAgIHBhaXJzLmZvckVhY2gocGFpciA9PiB7XG4gICAgICAgICAgICBjb25zdCBwYXJ0cyA9IHBhaXIuc3BsaXQoJz0nKTtcbiAgICAgICAgICAgIGlmIChwYXJ0cy5sZW5ndGggPCAxKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbWFwLnNldChkZWNvZGVVUklDb21wb25lbnQocGFydHNbMF0pLnRvTG93ZXJDYXNlKCksIHBhcnRzWzFdID09IG51bGwgPyAnJyA6IGRlY29kZVVSSUNvbXBvbmVudChwYXJ0c1sxXSkpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIG1hcDtcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0U29ydEZ1bmN0aW9uKGkxOG5TZXJ2aWNlOiBJMThuU2VydmljZSwgcHJvcDogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiAoYTogYW55LCBiOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChhW3Byb3BdID09IG51bGwgJiYgYltwcm9wXSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGFbcHJvcF0gIT0gbnVsbCAmJiBiW3Byb3BdID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChhW3Byb3BdID09IG51bGwgJiYgYltwcm9wXSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBpMThuU2VydmljZS5jb2xsYXRvciA/IGkxOG5TZXJ2aWNlLmNvbGxhdG9yLmNvbXBhcmUoYVtwcm9wXSwgYltwcm9wXSkgOlxuICAgICAgICAgICAgICAgIGFbcHJvcF0ubG9jYWxlQ29tcGFyZShiW3Byb3BdKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBzdGF0aWMgaXNOdWxsT3JXaGl0ZXNwYWNlKHN0cjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBzdHIgPT0gbnVsbCB8fCB0eXBlb2Ygc3RyICE9PSAnc3RyaW5nJyB8fCBzdHIudHJpbSgpID09PSAnJztcbiAgICB9XG5cbiAgICBzdGF0aWMgbmFtZU9mPFQ+KG5hbWU6IHN0cmluZyAmIGtleW9mIFQpIHtcbiAgICAgICAgcmV0dXJuIG5hbWU7XG4gICAgfVxuXG4gICAgc3RhdGljIGFzc2lnbjxUPih0YXJnZXQ6IFQsIHNvdXJjZTogUGFydGlhbDxUPik6IFQge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih0YXJnZXQsIHNvdXJjZSk7XG4gICAgfVxuXG4gICAgc3RhdGljIGl0ZXJhdGVFbnVtPE8gZXh0ZW5kcyBvYmplY3QsIEsgZXh0ZW5kcyBrZXlvZiBPID0ga2V5b2YgTz4ob2JqOiBPKSB7XG4gICAgICAgIHJldHVybiAoT2JqZWN0LmtleXMob2JqKS5maWx0ZXIoayA9PiBOdW1iZXIuaXNOYU4oK2spKSBhcyBLW10pLm1hcChrID0+IG9ialtrXSk7XG4gICAgfVxuXG5cbiAgICBzdGF0aWMgZ2V0VXJsKHVyaVN0cmluZzogc3RyaW5nKTogVVJMIHtcbiAgICAgICAgaWYgKHVyaVN0cmluZyA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHVyaVN0cmluZyA9IHVyaVN0cmluZy50cmltKCk7XG4gICAgICAgIGlmICh1cmlTdHJpbmcgPT09ICcnKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB1cmwgPSBVdGlscy5nZXRVcmxPYmplY3QodXJpU3RyaW5nKTtcbiAgICAgICAgaWYgKHVybCA9PSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBoYXNIdHRwUHJvdG9jb2wgPSB1cmlTdHJpbmcuaW5kZXhPZignaHR0cDovLycpID09PSAwIHx8IHVyaVN0cmluZy5pbmRleE9mKCdodHRwczovLycpID09PSAwO1xuICAgICAgICAgICAgaWYgKCFoYXNIdHRwUHJvdG9jb2wgJiYgdXJpU3RyaW5nLmluZGV4T2YoJy4nKSA+IC0xKSB7XG4gICAgICAgICAgICAgICAgdXJsID0gVXRpbHMuZ2V0VXJsT2JqZWN0KCdodHRwOi8vJyArIHVyaVN0cmluZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVybDtcbiAgICB9XG5cbiAgICBzdGF0aWMgY2FtZWxUb1Bhc2NhbENhc2Uoczogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiBzLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgcy5zbGljZSgxKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyB2YWxpZElwQWRkcmVzcyhpcFN0cmluZzogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZVxuICAgICAgICBjb25zdCBpcFJlZ2V4ID0gL14oMjVbMC01XXwyWzAtNF1bMC05XXxbMDFdP1swLTldWzAtOV0/KVxcLigyNVswLTVdfDJbMC00XVswLTldfFswMV0/WzAtOV1bMC05XT8pXFwuKDI1WzAtNV18MlswLTRdWzAtOV18WzAxXT9bMC05XVswLTldPylcXC4oMjVbMC01XXwyWzAtNF1bMC05XXxbMDFdP1swLTldWzAtOV0/KSQvO1xuICAgICAgICByZXR1cm4gaXBSZWdleC50ZXN0KGlwU3RyaW5nKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBpc01vYmlsZSh3aW46IFdpbmRvdykge1xuICAgICAgICBsZXQgbW9iaWxlID0gZmFsc2U7XG4gICAgICAgIChhID0+IHtcbiAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZVxuICAgICAgICAgICAgaWYgKC8oYW5kcm9pZHxiYlxcZCt8bWVlZ28pLittb2JpbGV8YXZhbnRnb3xiYWRhXFwvfGJsYWNrYmVycnl8YmxhemVyfGNvbXBhbHxlbGFpbmV8ZmVubmVjfGhpcHRvcHxpZW1vYmlsZXxpcChob25lfG9kKXxpcmlzfGtpbmRsZXxsZ2UgfG1hZW1vfG1pZHB8bW1wfG1vYmlsZS4rZmlyZWZveHxuZXRmcm9udHxvcGVyYSBtKG9ifGluKWl8cGFsbSggb3MpP3xwaG9uZXxwKGl4aXxyZSlcXC98cGx1Y2tlcnxwb2NrZXR8cHNwfHNlcmllcyg0fDYpMHxzeW1iaWFufHRyZW98dXBcXC4oYnJvd3NlcnxsaW5rKXx2b2RhZm9uZXx3YXB8d2luZG93cyBjZXx4ZGF8eGlpbm8vaS50ZXN0KGEpIHx8IC8xMjA3fDYzMTB8NjU5MHwzZ3NvfDR0aHB8NTBbMS02XWl8Nzcwc3w4MDJzfGEgd2F8YWJhY3xhYyhlcnxvb3xzXFwtKXxhaShrb3xybil8YWwoYXZ8Y2F8Y28pfGFtb2l8YW4oZXh8bnl8eXcpfGFwdHV8YXIoY2h8Z28pfGFzKHRlfHVzKXxhdHR3fGF1KGRpfFxcLW18ciB8cyApfGF2YW58YmUoY2t8bGx8bnEpfGJpKGxifHJkKXxibChhY3xheil8YnIoZXx2KXd8YnVtYnxid1xcLShufHUpfGM1NVxcL3xjYXBpfGNjd2F8Y2RtXFwtfGNlbGx8Y2h0bXxjbGRjfGNtZFxcLXxjbyhtcHxuZCl8Y3Jhd3xkYShpdHxsbHxuZyl8ZGJ0ZXxkY1xcLXN8ZGV2aXxkaWNhfGRtb2J8ZG8oY3xwKW98ZHMoMTJ8XFwtZCl8ZWwoNDl8YWkpfGVtKGwyfHVsKXxlcihpY3xrMCl8ZXNsOHxleihbNC03XTB8b3N8d2F8emUpfGZldGN8Zmx5KFxcLXxfKXxnMSB1fGc1NjB8Z2VuZXxnZlxcLTV8Z1xcLW1vfGdvKFxcLnd8b2QpfGdyKGFkfHVuKXxoYWllfGhjaXR8aGRcXC0obXxwfHQpfGhlaVxcLXxoaShwdHx0YSl8aHAoIGl8aXApfGhzXFwtY3xodChjKFxcLXwgfF98YXxnfHB8c3x0KXx0cCl8aHUoYXd8dGMpfGlcXC0oMjB8Z298bWEpfGkyMzB8aWFjKCB8XFwtfFxcLyl8aWJyb3xpZGVhfGlnMDF8aWtvbXxpbTFrfGlubm98aXBhcXxpcmlzfGphKHR8dilhfGpicm98amVtdXxqaWdzfGtkZGl8a2VqaXxrZ3QoIHxcXC8pfGtsb258a3B0IHxrd2NcXC18a3lvKGN8ayl8bGUobm98eGkpfGxnKCBnfFxcLyhrfGx8dSl8NTB8NTR8XFwtW2Etd10pfGxpYnd8bHlueHxtMVxcLXd8bTNnYXxtNTBcXC98bWEodGV8dWl8eG8pfG1jKDAxfDIxfGNhKXxtXFwtY3J8bWUocmN8cmkpfG1pKG84fG9hfHRzKXxtbWVmfG1vKDAxfDAyfGJpfGRlfGRvfHQoXFwtfCB8b3x2KXx6eil8bXQoNTB8cDF8diApfG13YnB8bXl3YXxuMTBbMC0yXXxuMjBbMi0zXXxuMzAoMHwyKXxuNTAoMHwyfDUpfG43KDAoMHwxKXwxMCl8bmUoKGN8bSlcXC18b258dGZ8d2Z8d2d8d3QpfG5vayg2fGkpfG56cGh8bzJpbXxvcCh0aXx3dil8b3Jhbnxvd2cxfHA4MDB8cGFuKGF8ZHx0KXxwZHhnfHBnKDEzfFxcLShbMS04XXxjKSl8cGhpbHxwaXJlfHBsKGF5fHVjKXxwblxcLTJ8cG8oY2t8cnR8c2UpfHByb3h8cHNpb3xwdFxcLWd8cWFcXC1hfHFjKDA3fDEyfDIxfDMyfDYwfFxcLVsyLTddfGlcXC0pfHF0ZWt8cjM4MHxyNjAwfHJha3N8cmltOXxybyh2ZXx6byl8czU1XFwvfHNhKGdlfG1hfG1tfG1zfG55fHZhKXxzYygwMXxoXFwtfG9vfHBcXC0pfHNka1xcL3xzZShjKFxcLXwwfDEpfDQ3fG1jfG5kfHJpKXxzZ2hcXC18c2hhcnxzaWUoXFwtfG0pfHNrXFwtMHxzbCg0NXxpZCl8c20oYWx8YXJ8YjN8aXR8dDUpfHNvKGZ0fG55KXxzcCgwMXxoXFwtfHZcXC18diApfHN5KDAxfG1iKXx0MigxOHw1MCl8dDYoMDB8MTB8MTgpfHRhKGd0fGxrKXx0Y2xcXC18dGRnXFwtfHRlbChpfG0pfHRpbVxcLXx0XFwtbW98dG8ocGx8c2gpfHRzKDcwfG1cXC18bTN8bTUpfHR4XFwtOXx1cChcXC5ifGcxfHNpKXx1dHN0fHY0MDB8djc1MHx2ZXJpfHZpKHJnfHRlKXx2ayg0MHw1WzAtM118XFwtdil8dm00MHx2b2RhfHZ1bGN8dngoNTJ8NTN8NjB8NjF8NzB8ODB8ODF8ODN8ODV8OTgpfHczYyhcXC18ICl8d2ViY3x3aGl0fHdpKGcgfG5jfG53KXx3bWxifHdvbnV8eDcwMHx5YXNcXC18eW91cnx6ZXRvfHp0ZVxcLS9pLnRlc3QoYS5zdWJzdHIoMCwgNCkpKSB7XG4gICAgICAgICAgICAgICAgbW9iaWxlID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkod2luLm5hdmlnYXRvci51c2VyQWdlbnQgfHwgd2luLm5hdmlnYXRvci52ZW5kb3IgfHwgKHdpbiBhcyBhbnkpLm9wZXJhKTtcbiAgICAgICAgcmV0dXJuIG1vYmlsZSB8fCB3aW4ubmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBhZC9pKSAhPSBudWxsO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGlzQXBwbGVNb2JpbGUod2luOiBXaW5kb3cpIHtcbiAgICAgICAgcmV0dXJuIHdpbi5uYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmUvaSkgIT0gbnVsbCB8fCB3aW4ubmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBhZC9pKSAhPSBudWxsO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGdldFVybE9iamVjdCh1cmlTdHJpbmc6IHN0cmluZyk6IFVSTCB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAobm9kZVVSTCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5vZGVVUkwuVVJMID8gbmV3IG5vZGVVUkwuVVJMKHVyaVN0cmluZykgOiBub2RlVVJMLnBhcnNlKHVyaVN0cmluZyk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBVUkwgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFVSTCh1cmlTdHJpbmcpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh3aW5kb3cgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGhhc1Byb3RvY29sID0gdXJpU3RyaW5nLmluZGV4T2YoJzovLycpID4gLTE7XG4gICAgICAgICAgICAgICAgaWYgKCFoYXNQcm90b2NvbCAmJiB1cmlTdHJpbmcuaW5kZXhPZignLicpID4gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgdXJpU3RyaW5nID0gJ2h0dHA6Ly8nICsgdXJpU3RyaW5nO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWhhc1Byb3RvY29sKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBhbmNob3IgPSB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgICAgICAgICAgICAgIGFuY2hvci5ocmVmID0gdXJpU3RyaW5nO1xuICAgICAgICAgICAgICAgIHJldHVybiBhbmNob3IgYXMgYW55O1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvLyBJZ25vcmUgZXJyb3JcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn1cblxuVXRpbHMuaW5pdCgpO1xuIiwiLy8gRUZGJ3MgTG9uZyBXb3JkbGlzdCBmcm9tIGh0dHBzOi8vd3d3LmVmZi5vcmcvZGljZVxuZXhwb3J0IGNvbnN0IEVFRkxvbmdXb3JkTGlzdCA9IFtcbiAgICAnYWJhY3VzJyxcbiAgICAnYWJkb21lbicsXG4gICAgJ2FiZG9taW5hbCcsXG4gICAgJ2FiaWRlJyxcbiAgICAnYWJpZGluZycsXG4gICAgJ2FiaWxpdHknLFxuICAgICdhYmxhemUnLFxuICAgICdhYmxlJyxcbiAgICAnYWJub3JtYWwnLFxuICAgICdhYnJhc2lvbicsXG4gICAgJ2FicmFzaXZlJyxcbiAgICAnYWJyZWFzdCcsXG4gICAgJ2FicmlkZ2UnLFxuICAgICdhYnJvYWQnLFxuICAgICdhYnJ1cHRseScsXG4gICAgJ2Fic2VuY2UnLFxuICAgICdhYnNlbnRlZScsXG4gICAgJ2Fic2VudGx5JyxcbiAgICAnYWJzaW50aGUnLFxuICAgICdhYnNvbHV0ZScsXG4gICAgJ2Fic29sdmUnLFxuICAgICdhYnN0YWluJyxcbiAgICAnYWJzdHJhY3QnLFxuICAgICdhYnN1cmQnLFxuICAgICdhY2NlbnQnLFxuICAgICdhY2NsYWltJyxcbiAgICAnYWNjbGltYXRlJyxcbiAgICAnYWNjb21wYW55JyxcbiAgICAnYWNjb3VudCcsXG4gICAgJ2FjY3VyYWN5JyxcbiAgICAnYWNjdXJhdGUnLFxuICAgICdhY2N1c3RvbScsXG4gICAgJ2FjZXRvbmUnLFxuICAgICdhY2hpbmVzcycsXG4gICAgJ2FjaGluZycsXG4gICAgJ2FjaWQnLFxuICAgICdhY29ybicsXG4gICAgJ2FjcXVhaW50JyxcbiAgICAnYWNxdWlyZScsXG4gICAgJ2FjcmUnLFxuICAgICdhY3JvYmF0JyxcbiAgICAnYWNyb255bScsXG4gICAgJ2FjdGluZycsXG4gICAgJ2FjdGlvbicsXG4gICAgJ2FjdGl2YXRlJyxcbiAgICAnYWN0aXZhdG9yJyxcbiAgICAnYWN0aXZlJyxcbiAgICAnYWN0aXZpc20nLFxuICAgICdhY3RpdmlzdCcsXG4gICAgJ2FjdGl2aXR5JyxcbiAgICAnYWN0cmVzcycsXG4gICAgJ2FjdHMnLFxuICAgICdhY3V0ZWx5JyxcbiAgICAnYWN1dGVuZXNzJyxcbiAgICAnYWVyYXRpb24nLFxuICAgICdhZXJvYmljcycsXG4gICAgJ2Flcm9zb2wnLFxuICAgICdhZXJvc3BhY2UnLFxuICAgICdhZmFyJyxcbiAgICAnYWZmYWlyJyxcbiAgICAnYWZmZWN0ZWQnLFxuICAgICdhZmZlY3RpbmcnLFxuICAgICdhZmZlY3Rpb24nLFxuICAgICdhZmZpZGF2aXQnLFxuICAgICdhZmZpbGlhdGUnLFxuICAgICdhZmZpcm0nLFxuICAgICdhZmZpeCcsXG4gICAgJ2FmZmxpY3RlZCcsXG4gICAgJ2FmZmx1ZW50JyxcbiAgICAnYWZmb3JkJyxcbiAgICAnYWZmcm9udCcsXG4gICAgJ2FmbGFtZScsXG4gICAgJ2FmbG9hdCcsXG4gICAgJ2FmbHV0dGVyJyxcbiAgICAnYWZvb3QnLFxuICAgICdhZnJhaWQnLFxuICAgICdhZnRlcmdsb3cnLFxuICAgICdhZnRlcmxpZmUnLFxuICAgICdhZnRlcm1hdGgnLFxuICAgICdhZnRlcm1vc3QnLFxuICAgICdhZnRlcm5vb24nLFxuICAgICdhZ2VkJyxcbiAgICAnYWdlbGVzcycsXG4gICAgJ2FnZW5jeScsXG4gICAgJ2FnZW5kYScsXG4gICAgJ2FnZW50JyxcbiAgICAnYWdncmVnYXRlJyxcbiAgICAnYWdoYXN0JyxcbiAgICAnYWdpbGUnLFxuICAgICdhZ2lsaXR5JyxcbiAgICAnYWdpbmcnLFxuICAgICdhZ25vc3RpYycsXG4gICAgJ2Fnb25pemUnLFxuICAgICdhZ29uaXppbmcnLFxuICAgICdhZ29ueScsXG4gICAgJ2FncmVlYWJsZScsXG4gICAgJ2FncmVlYWJseScsXG4gICAgJ2FncmVlZCcsXG4gICAgJ2FncmVlaW5nJyxcbiAgICAnYWdyZWVtZW50JyxcbiAgICAnYWdyb3VuZCcsXG4gICAgJ2FoZWFkJyxcbiAgICAnYWhveScsXG4gICAgJ2FpZGUnLFxuICAgICdhaWRzJyxcbiAgICAnYWltJyxcbiAgICAnYWphcicsXG4gICAgJ2FsYWJhc3RlcicsXG4gICAgJ2FsYXJtJyxcbiAgICAnYWxiYXRyb3NzJyxcbiAgICAnYWxidW0nLFxuICAgICdhbGZhbGZhJyxcbiAgICAnYWxnZWJyYScsXG4gICAgJ2FsZ29yaXRobScsXG4gICAgJ2FsaWFzJyxcbiAgICAnYWxpYmknLFxuICAgICdhbGllbmFibGUnLFxuICAgICdhbGllbmF0ZScsXG4gICAgJ2FsaWVucycsXG4gICAgJ2FsaWtlJyxcbiAgICAnYWxpdmUnLFxuICAgICdhbGthbGluZScsXG4gICAgJ2Fsa2FsaXplJyxcbiAgICAnYWxtYW5hYycsXG4gICAgJ2FsbWlnaHR5JyxcbiAgICAnYWxtb3N0JyxcbiAgICAnYWxvZScsXG4gICAgJ2Fsb2Z0JyxcbiAgICAnYWxvaGEnLFxuICAgICdhbG9uZScsXG4gICAgJ2Fsb25nc2lkZScsXG4gICAgJ2Fsb29mJyxcbiAgICAnYWxwaGFiZXQnLFxuICAgICdhbHJpZ2h0JyxcbiAgICAnYWx0aG91Z2gnLFxuICAgICdhbHRpdHVkZScsXG4gICAgJ2FsdG8nLFxuICAgICdhbHVtaW51bScsXG4gICAgJ2FsdW1uaScsXG4gICAgJ2Fsd2F5cycsXG4gICAgJ2FtYXJldHRvJyxcbiAgICAnYW1hemUnLFxuICAgICdhbWF6aW5nbHknLFxuICAgICdhbWJlcicsXG4gICAgJ2FtYmlhbmNlJyxcbiAgICAnYW1iaWd1aXR5JyxcbiAgICAnYW1iaWd1b3VzJyxcbiAgICAnYW1iaXRpb24nLFxuICAgICdhbWJpdGlvdXMnLFxuICAgICdhbWJ1bGFuY2UnLFxuICAgICdhbWJ1c2gnLFxuICAgICdhbWVuZGFibGUnLFxuICAgICdhbWVuZG1lbnQnLFxuICAgICdhbWVuZHMnLFxuICAgICdhbWVuaXR5JyxcbiAgICAnYW1pYWJsZScsXG4gICAgJ2FtaWNhYmx5JyxcbiAgICAnYW1pZCcsXG4gICAgJ2FtaWdvJyxcbiAgICAnYW1pbm8nLFxuICAgICdhbWlzcycsXG4gICAgJ2FtbW9uaWEnLFxuICAgICdhbW1vbml1bScsXG4gICAgJ2FtbmVzdHknLFxuICAgICdhbW5pb3RpYycsXG4gICAgJ2Ftb25nJyxcbiAgICAnYW1vdW50JyxcbiAgICAnYW1wZXJhZ2UnLFxuICAgICdhbXBsZScsXG4gICAgJ2FtcGxpZmllcicsXG4gICAgJ2FtcGxpZnknLFxuICAgICdhbXBseScsXG4gICAgJ2FtdWNrJyxcbiAgICAnYW11bGV0JyxcbiAgICAnYW11c2FibGUnLFxuICAgICdhbXVzZWQnLFxuICAgICdhbXVzZW1lbnQnLFxuICAgICdhbXVzZXInLFxuICAgICdhbXVzaW5nJyxcbiAgICAnYW5hY29uZGEnLFxuICAgICdhbmFlcm9iaWMnLFxuICAgICdhbmFncmFtJyxcbiAgICAnYW5hdG9taXN0JyxcbiAgICAnYW5hdG9teScsXG4gICAgJ2FuY2hvcicsXG4gICAgJ2FuY2hvdnknLFxuICAgICdhbmNpZW50JyxcbiAgICAnYW5kcm9pZCcsXG4gICAgJ2FuZW1pYScsXG4gICAgJ2FuZW1pYycsXG4gICAgJ2FuZXVyaXNtJyxcbiAgICAnYW5ldycsXG4gICAgJ2FuZ2VsZmlzaCcsXG4gICAgJ2FuZ2VsaWMnLFxuICAgICdhbmdlcicsXG4gICAgJ2FuZ2xlZCcsXG4gICAgJ2FuZ2xlcicsXG4gICAgJ2FuZ2xlcycsXG4gICAgJ2FuZ2xpbmcnLFxuICAgICdhbmdyaWx5JyxcbiAgICAnYW5ncmluZXNzJyxcbiAgICAnYW5ndWlzaGVkJyxcbiAgICAnYW5ndWxhcicsXG4gICAgJ2FuaW1hbCcsXG4gICAgJ2FuaW1hdGUnLFxuICAgICdhbmltYXRpbmcnLFxuICAgICdhbmltYXRpb24nLFxuICAgICdhbmltYXRvcicsXG4gICAgJ2FuaW1lJyxcbiAgICAnYW5pbW9zaXR5JyxcbiAgICAnYW5rbGUnLFxuICAgICdhbm5leCcsXG4gICAgJ2Fubm90YXRlJyxcbiAgICAnYW5ub3VuY2VyJyxcbiAgICAnYW5ub3lpbmcnLFxuICAgICdhbm51YWxseScsXG4gICAgJ2FubnVpdHknLFxuICAgICdhbm9pbnRlcicsXG4gICAgJ2Fub3RoZXInLFxuICAgICdhbnN3ZXJpbmcnLFxuICAgICdhbnRhY2lkJyxcbiAgICAnYW50YXJjdGljJyxcbiAgICAnYW50ZWF0ZXInLFxuICAgICdhbnRlbG9wZScsXG4gICAgJ2FudGVubmFlJyxcbiAgICAnYW50aGVtJyxcbiAgICAnYW50aGlsbCcsXG4gICAgJ2FudGhvbG9neScsXG4gICAgJ2FudGlib2R5JyxcbiAgICAnYW50aWNzJyxcbiAgICAnYW50aWRvdGUnLFxuICAgICdhbnRpaGVybycsXG4gICAgJ2FudGlxdWVseScsXG4gICAgJ2FudGlxdWVzJyxcbiAgICAnYW50aXF1aXR5JyxcbiAgICAnYW50aXJ1c3QnLFxuICAgICdhbnRpdG94aWMnLFxuICAgICdhbnRpdHJ1c3QnLFxuICAgICdhbnRpdmlyYWwnLFxuICAgICdhbnRpdmlydXMnLFxuICAgICdhbnRsZXInLFxuICAgICdhbnRvbnltJyxcbiAgICAnYW50c3knLFxuICAgICdhbnZpbCcsXG4gICAgJ2FueWJvZHknLFxuICAgICdhbnlob3cnLFxuICAgICdhbnltb3JlJyxcbiAgICAnYW55b25lJyxcbiAgICAnYW55cGxhY2UnLFxuICAgICdhbnl0aGluZycsXG4gICAgJ2FueXRpbWUnLFxuICAgICdhbnl3YXknLFxuICAgICdhbnl3aGVyZScsXG4gICAgJ2FvcnRhJyxcbiAgICAnYXBhY2hlJyxcbiAgICAnYXBvc3RsZScsXG4gICAgJ2FwcGVhbGluZycsXG4gICAgJ2FwcGVhcicsXG4gICAgJ2FwcGVhc2UnLFxuICAgICdhcHBlYXNpbmcnLFxuICAgICdhcHBlbmRhZ2UnLFxuICAgICdhcHBlbmRpeCcsXG4gICAgJ2FwcGV0aXRlJyxcbiAgICAnYXBwZXRpemVyJyxcbiAgICAnYXBwbGF1ZCcsXG4gICAgJ2FwcGxhdXNlJyxcbiAgICAnYXBwbGUnLFxuICAgICdhcHBsaWFuY2UnLFxuICAgICdhcHBsaWNhbnQnLFxuICAgICdhcHBsaWVkJyxcbiAgICAnYXBwbHknLFxuICAgICdhcHBvaW50ZWUnLFxuICAgICdhcHByYWlzYWwnLFxuICAgICdhcHByYWlzZXInLFxuICAgICdhcHByZWhlbmQnLFxuICAgICdhcHByb2FjaCcsXG4gICAgJ2FwcHJvdmFsJyxcbiAgICAnYXBwcm92ZScsXG4gICAgJ2Fwcmljb3QnLFxuICAgICdhcHJpbCcsXG4gICAgJ2Fwcm9uJyxcbiAgICAnYXB0aXR1ZGUnLFxuICAgICdhcHRseScsXG4gICAgJ2FxdWEnLFxuICAgICdhcXVlZHVjdCcsXG4gICAgJ2FyYml0cmFyeScsXG4gICAgJ2FyYml0cmF0ZScsXG4gICAgJ2FyZGVudGx5JyxcbiAgICAnYXJlYScsXG4gICAgJ2FyZW5hJyxcbiAgICAnYXJndWFibGUnLFxuICAgICdhcmd1YWJseScsXG4gICAgJ2FyZ3VlJyxcbiAgICAnYXJpc2UnLFxuICAgICdhcm1hZGlsbG8nLFxuICAgICdhcm1iYW5kJyxcbiAgICAnYXJtY2hhaXInLFxuICAgICdhcm1lZCcsXG4gICAgJ2FybWZ1bCcsXG4gICAgJ2FybWhvbGUnLFxuICAgICdhcm1pbmcnLFxuICAgICdhcm1sZXNzJyxcbiAgICAnYXJtb2lyZScsXG4gICAgJ2FybW9yZWQnLFxuICAgICdhcm1vcnknLFxuICAgICdhcm1yZXN0JyxcbiAgICAnYXJteScsXG4gICAgJ2Fyb21hJyxcbiAgICAnYXJvc2UnLFxuICAgICdhcm91bmQnLFxuICAgICdhcm91c2FsJyxcbiAgICAnYXJyYW5nZScsXG4gICAgJ2FycmF5JyxcbiAgICAnYXJyZXN0JyxcbiAgICAnYXJyaXZhbCcsXG4gICAgJ2Fycml2ZScsXG4gICAgJ2Fycm9nYW5jZScsXG4gICAgJ2Fycm9nYW50JyxcbiAgICAnYXJzb24nLFxuICAgICdhcnQnLFxuICAgICdhc2NlbmQnLFxuICAgICdhc2NlbnNpb24nLFxuICAgICdhc2NlbnQnLFxuICAgICdhc2NlcnRhaW4nLFxuICAgICdhc2hhbWVkJyxcbiAgICAnYXNoZW4nLFxuICAgICdhc2hlcycsXG4gICAgJ2FzaHknLFxuICAgICdhc2lkZScsXG4gICAgJ2Fza2V3JyxcbiAgICAnYXNsZWVwJyxcbiAgICAnYXNwYXJhZ3VzJyxcbiAgICAnYXNwZWN0JyxcbiAgICAnYXNwaXJhdGUnLFxuICAgICdhc3BpcmUnLFxuICAgICdhc3BpcmluJyxcbiAgICAnYXN0b25pc2gnLFxuICAgICdhc3RvdW5kJyxcbiAgICAnYXN0cmlkZScsXG4gICAgJ2FzdHJvbG9neScsXG4gICAgJ2FzdHJvbmF1dCcsXG4gICAgJ2FzdHJvbm9teScsXG4gICAgJ2FzdHV0ZScsXG4gICAgJ2F0bGFudGljJyxcbiAgICAnYXRsYXMnLFxuICAgICdhdG9tJyxcbiAgICAnYXRvbmFibGUnLFxuICAgICdhdG9wJyxcbiAgICAnYXRyaXVtJyxcbiAgICAnYXRyb2Npb3VzJyxcbiAgICAnYXRyb3BoeScsXG4gICAgJ2F0dGFjaCcsXG4gICAgJ2F0dGFpbicsXG4gICAgJ2F0dGVtcHQnLFxuICAgICdhdHRlbmRhbnQnLFxuICAgICdhdHRlbmRlZScsXG4gICAgJ2F0dGVudGlvbicsXG4gICAgJ2F0dGVudGl2ZScsXG4gICAgJ2F0dGVzdCcsXG4gICAgJ2F0dGljJyxcbiAgICAnYXR0aXJlJyxcbiAgICAnYXR0aXR1ZGUnLFxuICAgICdhdHRyYWN0b3InLFxuICAgICdhdHRyaWJ1dGUnLFxuICAgICdhdHlwaWNhbCcsXG4gICAgJ2F1Y3Rpb24nLFxuICAgICdhdWRhY2lvdXMnLFxuICAgICdhdWRhY2l0eScsXG4gICAgJ2F1ZGlibGUnLFxuICAgICdhdWRpYmx5JyxcbiAgICAnYXVkaWVuY2UnLFxuICAgICdhdWRpbycsXG4gICAgJ2F1ZGl0aW9uJyxcbiAgICAnYXVnbWVudGVkJyxcbiAgICAnYXVndXN0JyxcbiAgICAnYXV0aGVudGljJyxcbiAgICAnYXV0aG9yJyxcbiAgICAnYXV0aXNtJyxcbiAgICAnYXV0aXN0aWMnLFxuICAgICdhdXRvZ3JhcGgnLFxuICAgICdhdXRvbWFrZXInLFxuICAgICdhdXRvbWF0ZWQnLFxuICAgICdhdXRvbWF0aWMnLFxuICAgICdhdXRvcGlsb3QnLFxuICAgICdhdmFpbGFibGUnLFxuICAgICdhdmFsYW5jaGUnLFxuICAgICdhdmF0YXInLFxuICAgICdhdmVuZ2UnLFxuICAgICdhdmVuZ2luZycsXG4gICAgJ2F2ZW51ZScsXG4gICAgJ2F2ZXJhZ2UnLFxuICAgICdhdmVyc2lvbicsXG4gICAgJ2F2ZXJ0JyxcbiAgICAnYXZpYXRpb24nLFxuICAgICdhdmlhdG9yJyxcbiAgICAnYXZpZCcsXG4gICAgJ2F2b2lkJyxcbiAgICAnYXdhaXQnLFxuICAgICdhd2FrZW4nLFxuICAgICdhd2FyZCcsXG4gICAgJ2F3YXJlJyxcbiAgICAnYXdoaWxlJyxcbiAgICAnYXdrd2FyZCcsXG4gICAgJ2F3bmluZycsXG4gICAgJ2F3b2tlJyxcbiAgICAnYXdyeScsXG4gICAgJ2F4aXMnLFxuICAgICdiYWJibGUnLFxuICAgICdiYWJibGluZycsXG4gICAgJ2JhYmllZCcsXG4gICAgJ2JhYm9vbicsXG4gICAgJ2JhY2thY2hlJyxcbiAgICAnYmFja2JvYXJkJyxcbiAgICAnYmFja2JvbmVkJyxcbiAgICAnYmFja2Ryb3AnLFxuICAgICdiYWNrZWQnLFxuICAgICdiYWNrZXInLFxuICAgICdiYWNrZmllbGQnLFxuICAgICdiYWNrZmlyZScsXG4gICAgJ2JhY2toYW5kJyxcbiAgICAnYmFja2luZycsXG4gICAgJ2JhY2tsYW5kcycsXG4gICAgJ2JhY2tsYXNoJyxcbiAgICAnYmFja2xlc3MnLFxuICAgICdiYWNrbGlnaHQnLFxuICAgICdiYWNrbGl0JyxcbiAgICAnYmFja2xvZycsXG4gICAgJ2JhY2twYWNrJyxcbiAgICAnYmFja3BlZGFsJyxcbiAgICAnYmFja3Jlc3QnLFxuICAgICdiYWNrcm9vbScsXG4gICAgJ2JhY2tzaGlmdCcsXG4gICAgJ2JhY2tzaWRlJyxcbiAgICAnYmFja3NsaWQnLFxuICAgICdiYWNrc3BhY2UnLFxuICAgICdiYWNrc3BpbicsXG4gICAgJ2JhY2tzdGFiJyxcbiAgICAnYmFja3N0YWdlJyxcbiAgICAnYmFja3RhbGsnLFxuICAgICdiYWNrdHJhY2snLFxuICAgICdiYWNrdXAnLFxuICAgICdiYWNrd2FyZCcsXG4gICAgJ2JhY2t3YXNoJyxcbiAgICAnYmFja3dhdGVyJyxcbiAgICAnYmFja3lhcmQnLFxuICAgICdiYWNvbicsXG4gICAgJ2JhY3RlcmlhJyxcbiAgICAnYmFjdGVyaXVtJyxcbiAgICAnYmFkYXNzJyxcbiAgICAnYmFkZ2UnLFxuICAgICdiYWRsYW5kJyxcbiAgICAnYmFkbHknLFxuICAgICdiYWRuZXNzJyxcbiAgICAnYmFmZmxlJyxcbiAgICAnYmFmZmxpbmcnLFxuICAgICdiYWdlbCcsXG4gICAgJ2JhZ2Z1bCcsXG4gICAgJ2JhZ2dhZ2UnLFxuICAgICdiYWdnZWQnLFxuICAgICdiYWdnaWUnLFxuICAgICdiYWdnaW5lc3MnLFxuICAgICdiYWdnaW5nJyxcbiAgICAnYmFnZ3knLFxuICAgICdiYWdwaXBlJyxcbiAgICAnYmFndWV0dGUnLFxuICAgICdiYWtlZCcsXG4gICAgJ2Jha2VyeScsXG4gICAgJ2Jha2VzaG9wJyxcbiAgICAnYmFraW5nJyxcbiAgICAnYmFsYW5jZScsXG4gICAgJ2JhbGFuY2luZycsXG4gICAgJ2JhbGNvbnknLFxuICAgICdiYWxteScsXG4gICAgJ2JhbHNhbWljJyxcbiAgICAnYmFtYm9vJyxcbiAgICAnYmFuYW5hJyxcbiAgICAnYmFuaXNoJyxcbiAgICAnYmFuaXN0ZXInLFxuICAgICdiYW5qbycsXG4gICAgJ2JhbmthYmxlJyxcbiAgICAnYmFua2Jvb2snLFxuICAgICdiYW5rZWQnLFxuICAgICdiYW5rZXInLFxuICAgICdiYW5raW5nJyxcbiAgICAnYmFua25vdGUnLFxuICAgICdiYW5rcm9sbCcsXG4gICAgJ2Jhbm5lcicsXG4gICAgJ2Jhbm5pc3RlcicsXG4gICAgJ2JhbnNoZWUnLFxuICAgICdiYW50ZXInLFxuICAgICdiYXJiZWN1ZScsXG4gICAgJ2JhcmJlZCcsXG4gICAgJ2JhcmJlbGwnLFxuICAgICdiYXJiZXInLFxuICAgICdiYXJjb2RlJyxcbiAgICAnYmFyZ2UnLFxuICAgICdiYXJncmFwaCcsXG4gICAgJ2JhcmlzdGEnLFxuICAgICdiYXJpdG9uZScsXG4gICAgJ2JhcmxleScsXG4gICAgJ2Jhcm1haWQnLFxuICAgICdiYXJtYW4nLFxuICAgICdiYXJuJyxcbiAgICAnYmFyb21ldGVyJyxcbiAgICAnYmFycmFjaycsXG4gICAgJ2JhcnJhY3VkYScsXG4gICAgJ2JhcnJlbCcsXG4gICAgJ2JhcnJldHRlJyxcbiAgICAnYmFycmljYWRlJyxcbiAgICAnYmFycmllcicsXG4gICAgJ2JhcnN0b29sJyxcbiAgICAnYmFydGVuZGVyJyxcbiAgICAnYmFydGVyZXInLFxuICAgICdiYXNoJyxcbiAgICAnYmFzaWNhbGx5JyxcbiAgICAnYmFzaWNzJyxcbiAgICAnYmFzaWwnLFxuICAgICdiYXNpbicsXG4gICAgJ2Jhc2lzJyxcbiAgICAnYmFza2V0JyxcbiAgICAnYmF0Ym95JyxcbiAgICAnYmF0Y2gnLFxuICAgICdiYXRoJyxcbiAgICAnYmF0b24nLFxuICAgICdiYXRzJyxcbiAgICAnYmF0dGFsaW9uJyxcbiAgICAnYmF0dGVyZWQnLFxuICAgICdiYXR0ZXJpbmcnLFxuICAgICdiYXR0ZXJ5JyxcbiAgICAnYmF0dGluZycsXG4gICAgJ2JhdHRsZScsXG4gICAgJ2JhdWJsZScsXG4gICAgJ2Jhem9va2EnLFxuICAgICdibGFiYmVyJyxcbiAgICAnYmxhZGRlcicsXG4gICAgJ2JsYWRlJyxcbiAgICAnYmxhaCcsXG4gICAgJ2JsYW1lJyxcbiAgICAnYmxhbWluZycsXG4gICAgJ2JsYW5jaGluZycsXG4gICAgJ2JsYW5kbmVzcycsXG4gICAgJ2JsYW5rJyxcbiAgICAnYmxhc3BoZW1lJyxcbiAgICAnYmxhc3BoZW15JyxcbiAgICAnYmxhc3QnLFxuICAgICdibGF0YW5jeScsXG4gICAgJ2JsYXRhbnRseScsXG4gICAgJ2JsYXplcicsXG4gICAgJ2JsYXppbmcnLFxuICAgICdibGVhY2gnLFxuICAgICdibGVhaycsXG4gICAgJ2JsZWVwJyxcbiAgICAnYmxlbWlzaCcsXG4gICAgJ2JsZW5kJyxcbiAgICAnYmxlc3MnLFxuICAgICdibGlnaHRlZCcsXG4gICAgJ2JsaW1wJyxcbiAgICAnYmxpbmcnLFxuICAgICdibGlua2VkJyxcbiAgICAnYmxpbmtlcicsXG4gICAgJ2JsaW5raW5nJyxcbiAgICAnYmxpbmtzJyxcbiAgICAnYmxpcCcsXG4gICAgJ2JsaXNzZnVsJyxcbiAgICAnYmxpdHonLFxuICAgICdibGl6emFyZCcsXG4gICAgJ2Jsb2F0ZWQnLFxuICAgICdibG9hdGluZycsXG4gICAgJ2Jsb2InLFxuICAgICdibG9nJyxcbiAgICAnYmxvb21lcnMnLFxuICAgICdibG9vbWluZycsXG4gICAgJ2Jsb29wZXInLFxuICAgICdibG90JyxcbiAgICAnYmxvdXNlJyxcbiAgICAnYmx1YmJlcicsXG4gICAgJ2JsdWZmJyxcbiAgICAnYmx1aXNoJyxcbiAgICAnYmx1bmRlcmVyJyxcbiAgICAnYmx1bnQnLFxuICAgICdibHVyYicsXG4gICAgJ2JsdXJyZWQnLFxuICAgICdibHVycnknLFxuICAgICdibHVydCcsXG4gICAgJ2JsdXNoJyxcbiAgICAnYmx1c3RlcnknLFxuICAgICdib2FzdGVyJyxcbiAgICAnYm9hc3RmdWwnLFxuICAgICdib2FzdGluZycsXG4gICAgJ2JvYXQnLFxuICAgICdib2JiZWQnLFxuICAgICdib2JiaW5nJyxcbiAgICAnYm9iYmxlJyxcbiAgICAnYm9iY2F0JyxcbiAgICAnYm9ic2xlZCcsXG4gICAgJ2JvYnRhaWwnLFxuICAgICdib2RhY2lvdXMnLFxuICAgICdib2R5JyxcbiAgICAnYm9nZ2VkJyxcbiAgICAnYm9nZ2xlJyxcbiAgICAnYm9ndXMnLFxuICAgICdib2lsJyxcbiAgICAnYm9rJyxcbiAgICAnYm9sc3RlcicsXG4gICAgJ2JvbHQnLFxuICAgICdib25hbnphJyxcbiAgICAnYm9uZGVkJyxcbiAgICAnYm9uZGluZycsXG4gICAgJ2JvbmRsZXNzJyxcbiAgICAnYm9uZWQnLFxuICAgICdib25laGVhZCcsXG4gICAgJ2JvbmVsZXNzJyxcbiAgICAnYm9uZWxpa2UnLFxuICAgICdib25leScsXG4gICAgJ2JvbmZpcmUnLFxuICAgICdib25uZXQnLFxuICAgICdib25zYWknLFxuICAgICdib251cycsXG4gICAgJ2JvbnknLFxuICAgICdib29nZXltYW4nLFxuICAgICdib29naWVtYW4nLFxuICAgICdib29rJyxcbiAgICAnYm9vbmRvY2tzJyxcbiAgICAnYm9vdGVkJyxcbiAgICAnYm9vdGgnLFxuICAgICdib290aWUnLFxuICAgICdib290aW5nJyxcbiAgICAnYm9vdGxhY2UnLFxuICAgICdib290bGVnJyxcbiAgICAnYm9vdHMnLFxuICAgICdib296eScsXG4gICAgJ2JvcmF4JyxcbiAgICAnYm9yaW5nJyxcbiAgICAnYm9yb3VnaCcsXG4gICAgJ2JvcnJvd2VyJyxcbiAgICAnYm9ycm93aW5nJyxcbiAgICAnYm9zcycsXG4gICAgJ2JvdGFuaWNhbCcsXG4gICAgJ2JvdGFuaXN0JyxcbiAgICAnYm90YW55JyxcbiAgICAnYm90Y2gnLFxuICAgICdib3RoJyxcbiAgICAnYm90dGxlJyxcbiAgICAnYm90dGxpbmcnLFxuICAgICdib3R0b20nLFxuICAgICdib3VuY2UnLFxuICAgICdib3VuY2luZycsXG4gICAgJ2JvdW5jeScsXG4gICAgJ2JvdW5kaW5nJyxcbiAgICAnYm91bmRsZXNzJyxcbiAgICAnYm91bnRpZnVsJyxcbiAgICAnYm92aW5lJyxcbiAgICAnYm94Y2FyJyxcbiAgICAnYm94ZXInLFxuICAgICdib3hpbmcnLFxuICAgICdib3hsaWtlJyxcbiAgICAnYm94eScsXG4gICAgJ2JyZWFjaCcsXG4gICAgJ2JyZWF0aCcsXG4gICAgJ2JyZWVjaGVzJyxcbiAgICAnYnJlZWNoaW5nJyxcbiAgICAnYnJlZWRlcicsXG4gICAgJ2JyZWVkaW5nJyxcbiAgICAnYnJlZXplJyxcbiAgICAnYnJlZXp5JyxcbiAgICAnYnJldGhyZW4nLFxuICAgICdicmV3ZXJ5JyxcbiAgICAnYnJld2luZycsXG4gICAgJ2JyaWFyJyxcbiAgICAnYnJpYmUnLFxuICAgICdicmljaycsXG4gICAgJ2JyaWRlJyxcbiAgICAnYnJpZGdlZCcsXG4gICAgJ2JyaWdhZGUnLFxuICAgICdicmlnaHQnLFxuICAgICdicmlsbGlhbnQnLFxuICAgICdicmltJyxcbiAgICAnYnJpbmcnLFxuICAgICdicmluaycsXG4gICAgJ2JyaXNrZXQnLFxuICAgICdicmlza2x5JyxcbiAgICAnYnJpc2tuZXNzJyxcbiAgICAnYnJpc3RsZScsXG4gICAgJ2JyaXR0bGUnLFxuICAgICdicm9hZGJhbmQnLFxuICAgICdicm9hZGNhc3QnLFxuICAgICdicm9hZGVuJyxcbiAgICAnYnJvYWRseScsXG4gICAgJ2Jyb2FkbmVzcycsXG4gICAgJ2Jyb2Fkc2lkZScsXG4gICAgJ2Jyb2Fkd2F5cycsXG4gICAgJ2Jyb2lsZXInLFxuICAgICdicm9pbGluZycsXG4gICAgJ2Jyb2tlbicsXG4gICAgJ2Jyb2tlcicsXG4gICAgJ2Jyb25jaGlhbCcsXG4gICAgJ2Jyb25jbycsXG4gICAgJ2Jyb256ZScsXG4gICAgJ2Jyb256aW5nJyxcbiAgICAnYnJvb2snLFxuICAgICdicm9vbScsXG4gICAgJ2Jyb3VnaHQnLFxuICAgICdicm93YmVhdCcsXG4gICAgJ2Jyb3dubm9zZScsXG4gICAgJ2Jyb3dzZScsXG4gICAgJ2Jyb3dzaW5nJyxcbiAgICAnYnJ1aXNpbmcnLFxuICAgICdicnVuY2gnLFxuICAgICdicnVuZXR0ZScsXG4gICAgJ2JydW50JyxcbiAgICAnYnJ1c2gnLFxuICAgICdicnVzc2VscycsXG4gICAgJ2JydXRlJyxcbiAgICAnYnJ1dGlzaGx5JyxcbiAgICAnYnViYmxlJyxcbiAgICAnYnViYmxpbmcnLFxuICAgICdidWJibHknLFxuICAgICdidWNjYW5lZXInLFxuICAgICdidWNrZWQnLFxuICAgICdidWNrZXQnLFxuICAgICdidWNrbGUnLFxuICAgICdidWNrc2hvdCcsXG4gICAgJ2J1Y2tza2luJyxcbiAgICAnYnVja3Rvb3RoJyxcbiAgICAnYnVja3doZWF0JyxcbiAgICAnYnVkZGhpc20nLFxuICAgICdidWRkaGlzdCcsXG4gICAgJ2J1ZGRpbmcnLFxuICAgICdidWRkeScsXG4gICAgJ2J1ZGdldCcsXG4gICAgJ2J1ZmZhbG8nLFxuICAgICdidWZmZWQnLFxuICAgICdidWZmZXInLFxuICAgICdidWZmaW5nJyxcbiAgICAnYnVmZm9vbicsXG4gICAgJ2J1Z2d5JyxcbiAgICAnYnVsYicsXG4gICAgJ2J1bGdlJyxcbiAgICAnYnVsZ2luZXNzJyxcbiAgICAnYnVsZ3VyJyxcbiAgICAnYnVsaycsXG4gICAgJ2J1bGxkb2cnLFxuICAgICdidWxsZG96ZXInLFxuICAgICdidWxsZmlnaHQnLFxuICAgICdidWxsZnJvZycsXG4gICAgJ2J1bGxob3JuJyxcbiAgICAnYnVsbGlvbicsXG4gICAgJ2J1bGxpc2gnLFxuICAgICdidWxscGVuJyxcbiAgICAnYnVsbHJpbmcnLFxuICAgICdidWxsc2V5ZScsXG4gICAgJ2J1bGx3aGlwJyxcbiAgICAnYnVsbHknLFxuICAgICdidW5jaCcsXG4gICAgJ2J1bmRsZScsXG4gICAgJ2J1bmdlZScsXG4gICAgJ2J1bmlvbicsXG4gICAgJ2J1bmtiZWQnLFxuICAgICdidW5raG91c2UnLFxuICAgICdidW5rbWF0ZScsXG4gICAgJ2J1bm55JyxcbiAgICAnYnVudCcsXG4gICAgJ2J1c2JveScsXG4gICAgJ2J1c2gnLFxuICAgICdidXNpbHknLFxuICAgICdidXNsb2FkJyxcbiAgICAnYnVzdCcsXG4gICAgJ2J1c3lib2R5JyxcbiAgICAnYnV6eicsXG4gICAgJ2NhYmFuYScsXG4gICAgJ2NhYmJhZ2UnLFxuICAgICdjYWJiaWUnLFxuICAgICdjYWJkcml2ZXInLFxuICAgICdjYWJsZScsXG4gICAgJ2NhYm9vc2UnLFxuICAgICdjYWNoZScsXG4gICAgJ2NhY2tsZScsXG4gICAgJ2NhY3RpJyxcbiAgICAnY2FjdHVzJyxcbiAgICAnY2FkZGllJyxcbiAgICAnY2FkZHknLFxuICAgICdjYWRldCcsXG4gICAgJ2NhZGlsbGFjJyxcbiAgICAnY2FkbWl1bScsXG4gICAgJ2NhZ2UnLFxuICAgICdjYWhvb3RzJyxcbiAgICAnY2FrZScsXG4gICAgJ2NhbGFtYXJpJyxcbiAgICAnY2FsYW1pdHknLFxuICAgICdjYWxjaXVtJyxcbiAgICAnY2FsY3VsYXRlJyxcbiAgICAnY2FsY3VsdXMnLFxuICAgICdjYWxpYmVyJyxcbiAgICAnY2FsaWJyYXRlJyxcbiAgICAnY2FsbScsXG4gICAgJ2NhbG9yaWMnLFxuICAgICdjYWxvcmllJyxcbiAgICAnY2Fsem9uZScsXG4gICAgJ2NhbWNvcmRlcicsXG4gICAgJ2NhbWVvJyxcbiAgICAnY2FtZXJhJyxcbiAgICAnY2FtaXNvbGUnLFxuICAgICdjYW1wZXInLFxuICAgICdjYW1wZmlyZScsXG4gICAgJ2NhbXBpbmcnLFxuICAgICdjYW1wc2l0ZScsXG4gICAgJ2NhbXB1cycsXG4gICAgJ2NhbmFsJyxcbiAgICAnY2FuYXJ5JyxcbiAgICAnY2FuY2VsJyxcbiAgICAnY2FuZGllZCcsXG4gICAgJ2NhbmRsZScsXG4gICAgJ2NhbmR5JyxcbiAgICAnY2FuZScsXG4gICAgJ2NhbmluZScsXG4gICAgJ2NhbmlzdGVyJyxcbiAgICAnY2FubmFiaXMnLFxuICAgICdjYW5uZWQnLFxuICAgICdjYW5uaW5nJyxcbiAgICAnY2Fubm9uJyxcbiAgICAnY2Fubm90JyxcbiAgICAnY2Fub2xhJyxcbiAgICAnY2Fub24nLFxuICAgICdjYW5vcGVuZXInLFxuICAgICdjYW5vcHknLFxuICAgICdjYW50ZWVuJyxcbiAgICAnY2FueW9uJyxcbiAgICAnY2FwYWJsZScsXG4gICAgJ2NhcGFibHknLFxuICAgICdjYXBhY2l0eScsXG4gICAgJ2NhcGUnLFxuICAgICdjYXBpbGxhcnknLFxuICAgICdjYXBpdGFsJyxcbiAgICAnY2FwaXRvbCcsXG4gICAgJ2NhcHBlZCcsXG4gICAgJ2NhcHJpY29ybicsXG4gICAgJ2NhcHNpemUnLFxuICAgICdjYXBzdWxlJyxcbiAgICAnY2FwdGlvbicsXG4gICAgJ2NhcHRpdmF0ZScsXG4gICAgJ2NhcHRpdmUnLFxuICAgICdjYXB0aXZpdHknLFxuICAgICdjYXB0dXJlJyxcbiAgICAnY2FyYW1lbCcsXG4gICAgJ2NhcmF0JyxcbiAgICAnY2FyYXZhbicsXG4gICAgJ2NhcmJvbicsXG4gICAgJ2NhcmRib2FyZCcsXG4gICAgJ2NhcmRlZCcsXG4gICAgJ2NhcmRpYWMnLFxuICAgICdjYXJkaWdhbicsXG4gICAgJ2NhcmRpbmFsJyxcbiAgICAnY2FyZHN0b2NrJyxcbiAgICAnY2FyZWZ1bGx5JyxcbiAgICAnY2FyZWdpdmVyJyxcbiAgICAnY2FyZWxlc3MnLFxuICAgICdjYXJlc3MnLFxuICAgICdjYXJldGFrZXInLFxuICAgICdjYXJnbycsXG4gICAgJ2NhcmluZycsXG4gICAgJ2Nhcmxlc3MnLFxuICAgICdjYXJsb2FkJyxcbiAgICAnY2FybWFrZXInLFxuICAgICdjYXJuYWdlJyxcbiAgICAnY2FybmF0aW9uJyxcbiAgICAnY2Fybml2YWwnLFxuICAgICdjYXJuaXZvcmUnLFxuICAgICdjYXJvbCcsXG4gICAgJ2NhcnBlbnRlcicsXG4gICAgJ2NhcnBlbnRyeScsXG4gICAgJ2NhcnBvb2wnLFxuICAgICdjYXJwb3J0JyxcbiAgICAnY2FycmllZCcsXG4gICAgJ2NhcnJvdCcsXG4gICAgJ2NhcnJvdXNlbCcsXG4gICAgJ2NhcnJ5JyxcbiAgICAnY2FydGVsJyxcbiAgICAnY2FydGxvYWQnLFxuICAgICdjYXJ0b24nLFxuICAgICdjYXJ0b29uJyxcbiAgICAnY2FydHJpZGdlJyxcbiAgICAnY2FydHdoZWVsJyxcbiAgICAnY2FydmUnLFxuICAgICdjYXJ2aW5nJyxcbiAgICAnY2Fyd2FzaCcsXG4gICAgJ2Nhc2NhZGUnLFxuICAgICdjYXNlJyxcbiAgICAnY2FzaCcsXG4gICAgJ2Nhc2luZycsXG4gICAgJ2Nhc2lubycsXG4gICAgJ2Nhc2tldCcsXG4gICAgJ2Nhc3NldHRlJyxcbiAgICAnY2FzdWFsbHknLFxuICAgICdjYXN1YWx0eScsXG4gICAgJ2NhdGFjb21iJyxcbiAgICAnY2F0YWxvZycsXG4gICAgJ2NhdGFseXN0JyxcbiAgICAnY2F0YWx5emUnLFxuICAgICdjYXRhcHVsdCcsXG4gICAgJ2NhdGFyYWN0JyxcbiAgICAnY2F0YXRvbmljJyxcbiAgICAnY2F0Y2FsbCcsXG4gICAgJ2NhdGNoYWJsZScsXG4gICAgJ2NhdGNoZXInLFxuICAgICdjYXRjaGluZycsXG4gICAgJ2NhdGNoeScsXG4gICAgJ2NhdGVyZXInLFxuICAgICdjYXRlcmluZycsXG4gICAgJ2NhdGZpZ2h0JyxcbiAgICAnY2F0ZmlzaCcsXG4gICAgJ2NhdGhlZHJhbCcsXG4gICAgJ2NhdGhvdXNlJyxcbiAgICAnY2F0bGlrZScsXG4gICAgJ2NhdG5hcCcsXG4gICAgJ2NhdG5pcCcsXG4gICAgJ2NhdHN1cCcsXG4gICAgJ2NhdHRhaWwnLFxuICAgICdjYXR0aXNobHknLFxuICAgICdjYXR0bGUnLFxuICAgICdjYXR0eScsXG4gICAgJ2NhdHdhbGsnLFxuICAgICdjYXVjYXNpYW4nLFxuICAgICdjYXVjdXMnLFxuICAgICdjYXVzYWwnLFxuICAgICdjYXVzYXRpb24nLFxuICAgICdjYXVzZScsXG4gICAgJ2NhdXNpbmcnLFxuICAgICdjYXV0ZXJpemUnLFxuICAgICdjYXV0aW9uJyxcbiAgICAnY2F1dGlvdXMnLFxuICAgICdjYXZhbGllcicsXG4gICAgJ2NhdmFscnknLFxuICAgICdjYXZpYXInLFxuICAgICdjYXZpdHknLFxuICAgICdjZWRhcicsXG4gICAgJ2NlbGVyeScsXG4gICAgJ2NlbGVzdGlhbCcsXG4gICAgJ2NlbGliYWN5JyxcbiAgICAnY2VsaWJhdGUnLFxuICAgICdjZWx0aWMnLFxuICAgICdjZW1lbnQnLFxuICAgICdjZW5zdXMnLFxuICAgICdjZXJhbWljcycsXG4gICAgJ2NlcmVtb255JyxcbiAgICAnY2VydGFpbmx5JyxcbiAgICAnY2VydGFpbnR5JyxcbiAgICAnY2VydGlmaWVkJyxcbiAgICAnY2VydGlmeScsXG4gICAgJ2Nlc2FyZWFuJyxcbiAgICAnY2Vzc3Bvb2wnLFxuICAgICdjaGFmZScsXG4gICAgJ2NoYWZmaW5nJyxcbiAgICAnY2hhaW4nLFxuICAgICdjaGFpcicsXG4gICAgJ2NoYWxpY2UnLFxuICAgICdjaGFsbGVuZ2UnLFxuICAgICdjaGFtYmVyJyxcbiAgICAnY2hhbW9taWxlJyxcbiAgICAnY2hhbXBpb24nLFxuICAgICdjaGFuY2UnLFxuICAgICdjaGFuZ2UnLFxuICAgICdjaGFubmVsJyxcbiAgICAnY2hhbnQnLFxuICAgICdjaGFvcycsXG4gICAgJ2NoYXBlcm9uZScsXG4gICAgJ2NoYXBsYWluJyxcbiAgICAnY2hhcHBlZCcsXG4gICAgJ2NoYXBzJyxcbiAgICAnY2hhcHRlcicsXG4gICAgJ2NoYXJhY3RlcicsXG4gICAgJ2NoYXJicm9pbCcsXG4gICAgJ2NoYXJjb2FsJyxcbiAgICAnY2hhcmdlcicsXG4gICAgJ2NoYXJnaW5nJyxcbiAgICAnY2hhcmlvdCcsXG4gICAgJ2NoYXJpdHknLFxuICAgICdjaGFybScsXG4gICAgJ2NoYXJyZWQnLFxuICAgICdjaGFydGVyJyxcbiAgICAnY2hhcnRpbmcnLFxuICAgICdjaGFzZScsXG4gICAgJ2NoYXNpbmcnLFxuICAgICdjaGFzdGUnLFxuICAgICdjaGFzdGlzZScsXG4gICAgJ2NoYXN0aXR5JyxcbiAgICAnY2hhdHJvb20nLFxuICAgICdjaGF0dGVyJyxcbiAgICAnY2hhdHRpbmcnLFxuICAgICdjaGF0dHknLFxuICAgICdjaGVhdGluZycsXG4gICAgJ2NoZWRkYXInLFxuICAgICdjaGVlaycsXG4gICAgJ2NoZWVyJyxcbiAgICAnY2hlZXNlJyxcbiAgICAnY2hlZXN5JyxcbiAgICAnY2hlZicsXG4gICAgJ2NoZW1pY2FscycsXG4gICAgJ2NoZW1pc3QnLFxuICAgICdjaGVtbycsXG4gICAgJ2NoZXJpc2hlcicsXG4gICAgJ2NoZXJ1YicsXG4gICAgJ2NoZXNzJyxcbiAgICAnY2hlc3QnLFxuICAgICdjaGV2cm9uJyxcbiAgICAnY2hldnknLFxuICAgICdjaGV3YWJsZScsXG4gICAgJ2NoZXdlcicsXG4gICAgJ2NoZXdpbmcnLFxuICAgICdjaGV3eScsXG4gICAgJ2NoaWVmJyxcbiAgICAnY2hpaHVhaHVhJyxcbiAgICAnY2hpbGRjYXJlJyxcbiAgICAnY2hpbGRob29kJyxcbiAgICAnY2hpbGRpc2gnLFxuICAgICdjaGlsZGxlc3MnLFxuICAgICdjaGlsZGxpa2UnLFxuICAgICdjaGlsaScsXG4gICAgJ2NoaWxsJyxcbiAgICAnY2hpbXAnLFxuICAgICdjaGlwJyxcbiAgICAnY2hpcnBpbmcnLFxuICAgICdjaGlycHknLFxuICAgICdjaGl0Y2hhdCcsXG4gICAgJ2NoaXZhbHJ5JyxcbiAgICAnY2hpdmUnLFxuICAgICdjaGxvcmlkZScsXG4gICAgJ2NobG9yaW5lJyxcbiAgICAnY2hvaWNlJyxcbiAgICAnY2hva2Vob2xkJyxcbiAgICAnY2hva2luZycsXG4gICAgJ2Nob21wJyxcbiAgICAnY2hvb3NlcicsXG4gICAgJ2Nob29zaW5nJyxcbiAgICAnY2hvb3N5JyxcbiAgICAnY2hvcCcsXG4gICAgJ2Nob3NlbicsXG4gICAgJ2Nob3dkZXInLFxuICAgICdjaG93dGltZScsXG4gICAgJ2Nocm9tZScsXG4gICAgJ2NodWJieScsXG4gICAgJ2NodWNrJyxcbiAgICAnY2h1ZycsXG4gICAgJ2NodW1teScsXG4gICAgJ2NodW1wJyxcbiAgICAnY2h1bmsnLFxuICAgICdjaHVybicsXG4gICAgJ2NodXRlJyxcbiAgICAnY2lkZXInLFxuICAgICdjaWxhbnRybycsXG4gICAgJ2NpbmNoJyxcbiAgICAnY2luZW1hJyxcbiAgICAnY2lubmFtb24nLFxuICAgICdjaXJjbGUnLFxuICAgICdjaXJjbGluZycsXG4gICAgJ2NpcmN1bGFyJyxcbiAgICAnY2lyY3VsYXRlJyxcbiAgICAnY2lyY3VzJyxcbiAgICAnY2l0YWJsZScsXG4gICAgJ2NpdGFkZWwnLFxuICAgICdjaXRhdGlvbicsXG4gICAgJ2NpdGl6ZW4nLFxuICAgICdjaXRyaWMnLFxuICAgICdjaXRydXMnLFxuICAgICdjaXR5JyxcbiAgICAnY2l2aWMnLFxuICAgICdjaXZpbCcsXG4gICAgJ2NsYWQnLFxuICAgICdjbGFpbScsXG4gICAgJ2NsYW1iYWtlJyxcbiAgICAnY2xhbW15JyxcbiAgICAnY2xhbW9yJyxcbiAgICAnY2xhbXAnLFxuICAgICdjbGFtc2hlbGwnLFxuICAgICdjbGFuZycsXG4gICAgJ2NsYW5raW5nJyxcbiAgICAnY2xhcHBlZCcsXG4gICAgJ2NsYXBwZXInLFxuICAgICdjbGFwcGluZycsXG4gICAgJ2NsYXJpZnknLFxuICAgICdjbGFyaW5ldCcsXG4gICAgJ2NsYXJpdHknLFxuICAgICdjbGFzaCcsXG4gICAgJ2NsYXNwJyxcbiAgICAnY2xhc3MnLFxuICAgICdjbGF0dGVyJyxcbiAgICAnY2xhdXNlJyxcbiAgICAnY2xhdmljbGUnLFxuICAgICdjbGF3JyxcbiAgICAnY2xheScsXG4gICAgJ2NsZWFuJyxcbiAgICAnY2xlYXInLFxuICAgICdjbGVhdCcsXG4gICAgJ2NsZWF2ZXInLFxuICAgICdjbGVmdCcsXG4gICAgJ2NsZW5jaCcsXG4gICAgJ2NsZXJneW1hbicsXG4gICAgJ2NsZXJpY2FsJyxcbiAgICAnY2xlcmsnLFxuICAgICdjbGV2ZXInLFxuICAgICdjbGlja2VyJyxcbiAgICAnY2xpZW50JyxcbiAgICAnY2xpbWF0ZScsXG4gICAgJ2NsaW1hdGljJyxcbiAgICAnY2xpbmcnLFxuICAgICdjbGluaWMnLFxuICAgICdjbGlua2luZycsXG4gICAgJ2NsaXAnLFxuICAgICdjbGlxdWUnLFxuICAgICdjbG9haycsXG4gICAgJ2Nsb2JiZXInLFxuICAgICdjbG9jaycsXG4gICAgJ2Nsb25lJyxcbiAgICAnY2xvbmluZycsXG4gICAgJ2Nsb3NhYmxlJyxcbiAgICAnY2xvc3VyZScsXG4gICAgJ2Nsb3RoZXMnLFxuICAgICdjbG90aGluZycsXG4gICAgJ2Nsb3VkJyxcbiAgICAnY2xvdmVyJyxcbiAgICAnY2x1YmJlZCcsXG4gICAgJ2NsdWJiaW5nJyxcbiAgICAnY2x1YmhvdXNlJyxcbiAgICAnY2x1bXAnLFxuICAgICdjbHVtc2lseScsXG4gICAgJ2NsdW1zeScsXG4gICAgJ2NsdW5reScsXG4gICAgJ2NsdXN0ZXJlZCcsXG4gICAgJ2NsdXRjaCcsXG4gICAgJ2NsdXR0ZXInLFxuICAgICdjb2FjaCcsXG4gICAgJ2NvYWd1bGFudCcsXG4gICAgJ2NvYXN0YWwnLFxuICAgICdjb2FzdGVyJyxcbiAgICAnY29hc3RpbmcnLFxuICAgICdjb2FzdGxhbmQnLFxuICAgICdjb2FzdGxpbmUnLFxuICAgICdjb2F0JyxcbiAgICAnY29hdXRob3InLFxuICAgICdjb2JhbHQnLFxuICAgICdjb2JibGVyJyxcbiAgICAnY29id2ViJyxcbiAgICAnY29jb2EnLFxuICAgICdjb2NvbnV0JyxcbiAgICAnY29kJyxcbiAgICAnY29lZGl0b3InLFxuICAgICdjb2VyY2UnLFxuICAgICdjb2V4aXN0JyxcbiAgICAnY29mZmVlJyxcbiAgICAnY29mb3VuZGVyJyxcbiAgICAnY29nbml0aW9uJyxcbiAgICAnY29nbml0aXZlJyxcbiAgICAnY29nd2hlZWwnLFxuICAgICdjb2hlcmVuY2UnLFxuICAgICdjb2hlcmVudCcsXG4gICAgJ2NvaGVzaXZlJyxcbiAgICAnY29pbCcsXG4gICAgJ2Nva2UnLFxuICAgICdjb2xhJyxcbiAgICAnY29sZCcsXG4gICAgJ2NvbGVzbGF3JyxcbiAgICAnY29saXNldW0nLFxuICAgICdjb2xsYWdlJyxcbiAgICAnY29sbGFwc2UnLFxuICAgICdjb2xsYXInLFxuICAgICdjb2xsZWN0ZWQnLFxuICAgICdjb2xsZWN0b3InLFxuICAgICdjb2xsaWRlJyxcbiAgICAnY29sbGllJyxcbiAgICAnY29sbGlzaW9uJyxcbiAgICAnY29sb25pYWwnLFxuICAgICdjb2xvbmlzdCcsXG4gICAgJ2NvbG9uaXplJyxcbiAgICAnY29sb255JyxcbiAgICAnY29sb3NzYWwnLFxuICAgICdjb2x0JyxcbiAgICAnY29tYScsXG4gICAgJ2NvbWUnLFxuICAgICdjb21mb3J0JyxcbiAgICAnY29tZnknLFxuICAgICdjb21pYycsXG4gICAgJ2NvbWluZycsXG4gICAgJ2NvbW1hJyxcbiAgICAnY29tbWVuY2UnLFxuICAgICdjb21tZW5kJyxcbiAgICAnY29tbWVudCcsXG4gICAgJ2NvbW1lcmNlJyxcbiAgICAnY29tbW9kZScsXG4gICAgJ2NvbW1vZGl0eScsXG4gICAgJ2NvbW1vZG9yZScsXG4gICAgJ2NvbW1vbicsXG4gICAgJ2NvbW1vdGlvbicsXG4gICAgJ2NvbW11dGUnLFxuICAgICdjb21tdXRpbmcnLFxuICAgICdjb21wYWN0ZWQnLFxuICAgICdjb21wYWN0ZXInLFxuICAgICdjb21wYWN0bHknLFxuICAgICdjb21wYWN0b3InLFxuICAgICdjb21wYW5pb24nLFxuICAgICdjb21wYW55JyxcbiAgICAnY29tcGFyZScsXG4gICAgJ2NvbXBlbCcsXG4gICAgJ2NvbXBpbGUnLFxuICAgICdjb21wbHknLFxuICAgICdjb21wb25lbnQnLFxuICAgICdjb21wb3NlZCcsXG4gICAgJ2NvbXBvc2VyJyxcbiAgICAnY29tcG9zaXRlJyxcbiAgICAnY29tcG9zdCcsXG4gICAgJ2NvbXBvc3VyZScsXG4gICAgJ2NvbXBvdW5kJyxcbiAgICAnY29tcHJlc3MnLFxuICAgICdjb21wcmlzZWQnLFxuICAgICdjb21wdXRlcicsXG4gICAgJ2NvbXB1dGluZycsXG4gICAgJ2NvbXJhZGUnLFxuICAgICdjb25jYXZlJyxcbiAgICAnY29uY2VhbCcsXG4gICAgJ2NvbmNlZGVkJyxcbiAgICAnY29uY2VwdCcsXG4gICAgJ2NvbmNlcm5lZCcsXG4gICAgJ2NvbmNlcnQnLFxuICAgICdjb25jaCcsXG4gICAgJ2NvbmNpZXJnZScsXG4gICAgJ2NvbmNpc2UnLFxuICAgICdjb25jbHVkZScsXG4gICAgJ2NvbmNyZXRlJyxcbiAgICAnY29uY3VyJyxcbiAgICAnY29uZGVuc2UnLFxuICAgICdjb25kaW1lbnQnLFxuICAgICdjb25kaXRpb24nLFxuICAgICdjb25kb25lJyxcbiAgICAnY29uZHVjaXZlJyxcbiAgICAnY29uZHVjdG9yJyxcbiAgICAnY29uZHVpdCcsXG4gICAgJ2NvbmUnLFxuICAgICdjb25mZXNzJyxcbiAgICAnY29uZmV0dGknLFxuICAgICdjb25maWRhbnQnLFxuICAgICdjb25maWRlbnQnLFxuICAgICdjb25maWRlcicsXG4gICAgJ2NvbmZpZGluZycsXG4gICAgJ2NvbmZpZ3VyZScsXG4gICAgJ2NvbmZpbmVkJyxcbiAgICAnY29uZmluaW5nJyxcbiAgICAnY29uZmlybScsXG4gICAgJ2NvbmZsaWN0JyxcbiAgICAnY29uZm9ybScsXG4gICAgJ2NvbmZvdW5kJyxcbiAgICAnY29uZnJvbnQnLFxuICAgICdjb25mdXNlZCcsXG4gICAgJ2NvbmZ1c2luZycsXG4gICAgJ2NvbmZ1c2lvbicsXG4gICAgJ2NvbmdlbmlhbCcsXG4gICAgJ2Nvbmdlc3RlZCcsXG4gICAgJ2NvbmdyYXRzJyxcbiAgICAnY29uZ3Jlc3MnLFxuICAgICdjb25pY2FsJyxcbiAgICAnY29uam9pbmVkJyxcbiAgICAnY29uanVyZScsXG4gICAgJ2Nvbmp1cm9yJyxcbiAgICAnY29ubmVjdGVkJyxcbiAgICAnY29ubmVjdG9yJyxcbiAgICAnY29uc2Vuc3VzJyxcbiAgICAnY29uc2VudCcsXG4gICAgJ2NvbnNvbGUnLFxuICAgICdjb25zb2xpbmcnLFxuICAgICdjb25zb25hbnQnLFxuICAgICdjb25zdGFibGUnLFxuICAgICdjb25zdGFudCcsXG4gICAgJ2NvbnN0cmFpbicsXG4gICAgJ2NvbnN0cmljdCcsXG4gICAgJ2NvbnN0cnVjdCcsXG4gICAgJ2NvbnN1bHQnLFxuICAgICdjb25zdW1lcicsXG4gICAgJ2NvbnN1bWluZycsXG4gICAgJ2NvbnRhY3QnLFxuICAgICdjb250YWluZXInLFxuICAgICdjb250ZW1wdCcsXG4gICAgJ2NvbnRlbmQnLFxuICAgICdjb250ZW50ZWQnLFxuICAgICdjb250ZW50bHknLFxuICAgICdjb250ZW50cycsXG4gICAgJ2NvbnRlc3QnLFxuICAgICdjb250ZXh0JyxcbiAgICAnY29udG9ydCcsXG4gICAgJ2NvbnRvdXInLFxuICAgICdjb250cml0ZScsXG4gICAgJ2NvbnRyb2wnLFxuICAgICdjb250dXNpb24nLFxuICAgICdjb252ZW5lJyxcbiAgICAnY29udmVudCcsXG4gICAgJ2NvcGFydG5lcicsXG4gICAgJ2NvcGUnLFxuICAgICdjb3BpZWQnLFxuICAgICdjb3BpZXInLFxuICAgICdjb3BpbG90JyxcbiAgICAnY29waW5nJyxcbiAgICAnY29waW91cycsXG4gICAgJ2NvcHBlcicsXG4gICAgJ2NvcHknLFxuICAgICdjb3JhbCcsXG4gICAgJ2NvcmsnLFxuICAgICdjb3JuYmFsbCcsXG4gICAgJ2Nvcm5icmVhZCcsXG4gICAgJ2Nvcm5jb2InLFxuICAgICdjb3JuZWEnLFxuICAgICdjb3JuZWQnLFxuICAgICdjb3JuZXInLFxuICAgICdjb3JuZmllbGQnLFxuICAgICdjb3JuZmxha2UnLFxuICAgICdjb3JuaHVzaycsXG4gICAgJ2Nvcm5tZWFsJyxcbiAgICAnY29ybnN0YWxrJyxcbiAgICAnY29ybnknLFxuICAgICdjb3JvbmFyeScsXG4gICAgJ2Nvcm9uZXInLFxuICAgICdjb3Jwb3JhbCcsXG4gICAgJ2NvcnBvcmF0ZScsXG4gICAgJ2NvcnJhbCcsXG4gICAgJ2NvcnJlY3QnLFxuICAgICdjb3JyaWRvcicsXG4gICAgJ2NvcnJvZGUnLFxuICAgICdjb3Jyb2RpbmcnLFxuICAgICdjb3Jyb3NpdmUnLFxuICAgICdjb3JzYWdlJyxcbiAgICAnY29yc2V0JyxcbiAgICAnY29ydGV4JyxcbiAgICAnY29zaWduZXInLFxuICAgICdjb3NtZXRpY3MnLFxuICAgICdjb3NtaWMnLFxuICAgICdjb3Ntb3MnLFxuICAgICdjb3Nwb25zb3InLFxuICAgICdjb3N0JyxcbiAgICAnY290dGFnZScsXG4gICAgJ2NvdHRvbicsXG4gICAgJ2NvdWNoJyxcbiAgICAnY291Z2gnLFxuICAgICdjb3VsZCcsXG4gICAgJ2NvdW50YWJsZScsXG4gICAgJ2NvdW50ZG93bicsXG4gICAgJ2NvdW50aW5nJyxcbiAgICAnY291bnRsZXNzJyxcbiAgICAnY291bnRyeScsXG4gICAgJ2NvdW50eScsXG4gICAgJ2NvdXJpZXInLFxuICAgICdjb3ZlbmFudCcsXG4gICAgJ2NvdmVyJyxcbiAgICAnY292ZXRlZCcsXG4gICAgJ2NvdmV0aW5nJyxcbiAgICAnY295bmVzcycsXG4gICAgJ2NvemlseScsXG4gICAgJ2NvemluZXNzJyxcbiAgICAnY296eScsXG4gICAgJ2NyYWJiaW5nJyxcbiAgICAnY3JhYmdyYXNzJyxcbiAgICAnY3JhYmxpa2UnLFxuICAgICdjcmFibWVhdCcsXG4gICAgJ2NyYWRsZScsXG4gICAgJ2NyYWRsaW5nJyxcbiAgICAnY3JhZnRlcicsXG4gICAgJ2NyYWZ0aWx5JyxcbiAgICAnY3JhZnRzbWFuJyxcbiAgICAnY3JhZnR3b3JrJyxcbiAgICAnY3JhZnR5JyxcbiAgICAnY3JhbXAnLFxuICAgICdjcmFuYmVycnknLFxuICAgICdjcmFuZScsXG4gICAgJ2NyYW5pYWwnLFxuICAgICdjcmFuaXVtJyxcbiAgICAnY3JhbmsnLFxuICAgICdjcmF0ZScsXG4gICAgJ2NyYXZlJyxcbiAgICAnY3JhdmluZycsXG4gICAgJ2NyYXdmaXNoJyxcbiAgICAnY3Jhd2xlcnMnLFxuICAgICdjcmF3bGluZycsXG4gICAgJ2NyYXlmaXNoJyxcbiAgICAnY3JheW9uJyxcbiAgICAnY3JhemVkJyxcbiAgICAnY3JhemlseScsXG4gICAgJ2NyYXppbmVzcycsXG4gICAgJ2NyYXp5JyxcbiAgICAnY3JlYW1lZCcsXG4gICAgJ2NyZWFtZXInLFxuICAgICdjcmVhbWxpa2UnLFxuICAgICdjcmVhc2UnLFxuICAgICdjcmVhc2luZycsXG4gICAgJ2NyZWF0YWJsZScsXG4gICAgJ2NyZWF0ZScsXG4gICAgJ2NyZWF0aW9uJyxcbiAgICAnY3JlYXRpdmUnLFxuICAgICdjcmVhdHVyZScsXG4gICAgJ2NyZWRpYmxlJyxcbiAgICAnY3JlZGlibHknLFxuICAgICdjcmVkaXQnLFxuICAgICdjcmVlZCcsXG4gICAgJ2NyZW1lJyxcbiAgICAnY3Jlb2xlJyxcbiAgICAnY3JlcGUnLFxuICAgICdjcmVwdCcsXG4gICAgJ2NyZXNjZW50JyxcbiAgICAnY3Jlc3RlZCcsXG4gICAgJ2NyZXN0aW5nJyxcbiAgICAnY3Jlc3RsZXNzJyxcbiAgICAnY3JldmljZScsXG4gICAgJ2NyZXdsZXNzJyxcbiAgICAnY3Jld21hbicsXG4gICAgJ2NyZXdtYXRlJyxcbiAgICAnY3JpYicsXG4gICAgJ2NyaWNrZXQnLFxuICAgICdjcmllZCcsXG4gICAgJ2NyaWVyJyxcbiAgICAnY3JpbXAnLFxuICAgICdjcmltc29uJyxcbiAgICAnY3JpbmdlJyxcbiAgICAnY3JpbmdpbmcnLFxuICAgICdjcmlua2xlJyxcbiAgICAnY3JpbmtseScsXG4gICAgJ2NyaXNwZWQnLFxuICAgICdjcmlzcGluZycsXG4gICAgJ2NyaXNwbHknLFxuICAgICdjcmlzcG5lc3MnLFxuICAgICdjcmlzcHknLFxuICAgICdjcml0ZXJpYScsXG4gICAgJ2NyaXR0ZXInLFxuICAgICdjcm9haycsXG4gICAgJ2Nyb2NrJyxcbiAgICAnY3Jvb2snLFxuICAgICdjcm9vbicsXG4gICAgJ2Nyb3AnLFxuICAgICdjcm9zcycsXG4gICAgJ2Nyb3VjaCcsXG4gICAgJ2Nyb3V0b24nLFxuICAgICdjcm93YmFyJyxcbiAgICAnY3Jvd2QnLFxuICAgICdjcm93bicsXG4gICAgJ2NydWNpYWwnLFxuICAgICdjcnVkZWx5JyxcbiAgICAnY3J1ZGVuZXNzJyxcbiAgICAnY3J1ZWxseScsXG4gICAgJ2NydWVsbmVzcycsXG4gICAgJ2NydWVsdHknLFxuICAgICdjcnVtYicsXG4gICAgJ2NydW1taWVzdCcsXG4gICAgJ2NydW1teScsXG4gICAgJ2NydW1wZXQnLFxuICAgICdjcnVtcGxlZCcsXG4gICAgJ2NydW5jaGVyJyxcbiAgICAnY3J1bmNoaW5nJyxcbiAgICAnY3J1bmNoeScsXG4gICAgJ2NydXNhZGVyJyxcbiAgICAnY3J1c2hhYmxlJyxcbiAgICAnY3J1c2hlZCcsXG4gICAgJ2NydXNoZXInLFxuICAgICdjcnVzaGluZycsXG4gICAgJ2NydXN0JyxcbiAgICAnY3J1eCcsXG4gICAgJ2NyeWluZycsXG4gICAgJ2NyeXB0aWMnLFxuICAgICdjcnlzdGFsJyxcbiAgICAnY3ViYnlob2xlJyxcbiAgICAnY3ViZScsXG4gICAgJ2N1YmljYWwnLFxuICAgICdjdWJpY2xlJyxcbiAgICAnY3VjdW1iZXInLFxuICAgICdjdWRkbGUnLFxuICAgICdjdWRkbHknLFxuICAgICdjdWZmbGluaycsXG4gICAgJ2N1bGluYXJ5JyxcbiAgICAnY3VsbWluYXRlJyxcbiAgICAnY3VscGFibGUnLFxuICAgICdjdWxwcml0JyxcbiAgICAnY3VsdGl2YXRlJyxcbiAgICAnY3VsdHVyYWwnLFxuICAgICdjdWx0dXJlJyxcbiAgICAnY3VwYmVhcmVyJyxcbiAgICAnY3VwY2FrZScsXG4gICAgJ2N1cGlkJyxcbiAgICAnY3VwcGVkJyxcbiAgICAnY3VwcGluZycsXG4gICAgJ2N1cmFibGUnLFxuICAgICdjdXJhdG9yJyxcbiAgICAnY3VyZGxlJyxcbiAgICAnY3VyZScsXG4gICAgJ2N1cmZldycsXG4gICAgJ2N1cmluZycsXG4gICAgJ2N1cmxlZCcsXG4gICAgJ2N1cmxlcicsXG4gICAgJ2N1cmxpbmVzcycsXG4gICAgJ2N1cmxpbmcnLFxuICAgICdjdXJseScsXG4gICAgJ2N1cnJ5JyxcbiAgICAnY3Vyc2UnLFxuICAgICdjdXJzaXZlJyxcbiAgICAnY3Vyc29yJyxcbiAgICAnY3VydGFpbicsXG4gICAgJ2N1cnRseScsXG4gICAgJ2N1cnRzeScsXG4gICAgJ2N1cnZhdHVyZScsXG4gICAgJ2N1cnZlJyxcbiAgICAnY3VydnknLFxuICAgICdjdXNoeScsXG4gICAgJ2N1c3AnLFxuICAgICdjdXNzZWQnLFxuICAgICdjdXN0YXJkJyxcbiAgICAnY3VzdG9kaWFuJyxcbiAgICAnY3VzdG9keScsXG4gICAgJ2N1c3RvbWFyeScsXG4gICAgJ2N1c3RvbWVyJyxcbiAgICAnY3VzdG9taXplJyxcbiAgICAnY3VzdG9tcycsXG4gICAgJ2N1dCcsXG4gICAgJ2N5Y2xlJyxcbiAgICAnY3ljbGljJyxcbiAgICAnY3ljbGluZycsXG4gICAgJ2N5Y2xpc3QnLFxuICAgICdjeWxpbmRlcicsXG4gICAgJ2N5bWJhbCcsXG4gICAgJ2N5dG9wbGFzbScsXG4gICAgJ2N5dG9wbGFzdCcsXG4gICAgJ2RhYicsXG4gICAgJ2RhZCcsXG4gICAgJ2RhZmZvZGlsJyxcbiAgICAnZGFnZ2VyJyxcbiAgICAnZGFpbHknLFxuICAgICdkYWludGlseScsXG4gICAgJ2RhaW50eScsXG4gICAgJ2RhaXJ5JyxcbiAgICAnZGFpc3knLFxuICAgICdkYWxseWluZycsXG4gICAgJ2RhbmNlJyxcbiAgICAnZGFuY2luZycsXG4gICAgJ2RhbmRlbGlvbicsXG4gICAgJ2RhbmRlcicsXG4gICAgJ2RhbmRydWZmJyxcbiAgICAnZGFuZHknLFxuICAgICdkYW5nZXInLFxuICAgICdkYW5nbGUnLFxuICAgICdkYW5nbGluZycsXG4gICAgJ2RhcmVkZXZpbCcsXG4gICAgJ2RhcmVzJyxcbiAgICAnZGFyaW5nbHknLFxuICAgICdkYXJrZW5lZCcsXG4gICAgJ2RhcmtlbmluZycsXG4gICAgJ2Rhcmtpc2gnLFxuICAgICdkYXJrbmVzcycsXG4gICAgJ2Rhcmtyb29tJyxcbiAgICAnZGFybGluZycsXG4gICAgJ2Rhcm4nLFxuICAgICdkYXJ0JyxcbiAgICAnZGFyd2luaXNtJyxcbiAgICAnZGFzaCcsXG4gICAgJ2Rhc3RhcmRseScsXG4gICAgJ2RhdGEnLFxuICAgICdkYXRlYm9vaycsXG4gICAgJ2RhdGluZycsXG4gICAgJ2RhdWdodGVyJyxcbiAgICAnZGF1bnRpbmcnLFxuICAgICdkYXdkbGVyJyxcbiAgICAnZGF3bicsXG4gICAgJ2RheWJlZCcsXG4gICAgJ2RheWJyZWFrJyxcbiAgICAnZGF5Y2FyZScsXG4gICAgJ2RheWRyZWFtJyxcbiAgICAnZGF5bGlnaHQnLFxuICAgICdkYXlsb25nJyxcbiAgICAnZGF5cm9vbScsXG4gICAgJ2RheXRpbWUnLFxuICAgICdkYXp6bGVyJyxcbiAgICAnZGF6emxpbmcnLFxuICAgICdkZWFjb24nLFxuICAgICdkZWFmZW5pbmcnLFxuICAgICdkZWFmbmVzcycsXG4gICAgJ2RlYWxlcicsXG4gICAgJ2RlYWxpbmcnLFxuICAgICdkZWFsbWFrZXInLFxuICAgICdkZWFsdCcsXG4gICAgJ2RlYW4nLFxuICAgICdkZWJhdGFibGUnLFxuICAgICdkZWJhdGUnLFxuICAgICdkZWJhdGluZycsXG4gICAgJ2RlYml0JyxcbiAgICAnZGVicmllZicsXG4gICAgJ2RlYnRsZXNzJyxcbiAgICAnZGVidG9yJyxcbiAgICAnZGVidWcnLFxuICAgICdkZWJ1bmsnLFxuICAgICdkZWNhZGUnLFxuICAgICdkZWNhZicsXG4gICAgJ2RlY2FsJyxcbiAgICAnZGVjYXRobG9uJyxcbiAgICAnZGVjYXknLFxuICAgICdkZWNlYXNlZCcsXG4gICAgJ2RlY2VpdCcsXG4gICAgJ2RlY2VpdmVyJyxcbiAgICAnZGVjZWl2aW5nJyxcbiAgICAnZGVjZW1iZXInLFxuICAgICdkZWNlbmN5JyxcbiAgICAnZGVjZW50JyxcbiAgICAnZGVjZXB0aW9uJyxcbiAgICAnZGVjZXB0aXZlJyxcbiAgICAnZGVjaWJlbCcsXG4gICAgJ2RlY2lkYWJsZScsXG4gICAgJ2RlY2ltYWwnLFxuICAgICdkZWNpbWV0ZXInLFxuICAgICdkZWNpcGhlcicsXG4gICAgJ2RlY2snLFxuICAgICdkZWNsYXJlZCcsXG4gICAgJ2RlY2xpbmUnLFxuICAgICdkZWNvZGUnLFxuICAgICdkZWNvbXBvc2UnLFxuICAgICdkZWNvcmF0ZWQnLFxuICAgICdkZWNvcmF0b3InLFxuICAgICdkZWNveScsXG4gICAgJ2RlY3JlYXNlJyxcbiAgICAnZGVjcmVlJyxcbiAgICAnZGVkaWNhdGUnLFxuICAgICdkZWRpY2F0b3InLFxuICAgICdkZWR1Y2UnLFxuICAgICdkZWR1Y3QnLFxuICAgICdkZWVkJyxcbiAgICAnZGVlbScsXG4gICAgJ2RlZXBlbicsXG4gICAgJ2RlZXBseScsXG4gICAgJ2RlZXBuZXNzJyxcbiAgICAnZGVmYWNlJyxcbiAgICAnZGVmYWNpbmcnLFxuICAgICdkZWZhbWUnLFxuICAgICdkZWZhdWx0JyxcbiAgICAnZGVmZWF0JyxcbiAgICAnZGVmZWN0aW9uJyxcbiAgICAnZGVmZWN0aXZlJyxcbiAgICAnZGVmZW5kYW50JyxcbiAgICAnZGVmZW5kZXInLFxuICAgICdkZWZlbnNlJyxcbiAgICAnZGVmZW5zaXZlJyxcbiAgICAnZGVmZXJyYWwnLFxuICAgICdkZWZlcnJlZCcsXG4gICAgJ2RlZmlhbmNlJyxcbiAgICAnZGVmaWFudCcsXG4gICAgJ2RlZmlsZScsXG4gICAgJ2RlZmlsaW5nJyxcbiAgICAnZGVmaW5lJyxcbiAgICAnZGVmaW5pdGUnLFxuICAgICdkZWZsYXRlJyxcbiAgICAnZGVmbGF0aW9uJyxcbiAgICAnZGVmbGF0b3InLFxuICAgICdkZWZsZWN0ZWQnLFxuICAgICdkZWZsZWN0b3InLFxuICAgICdkZWZvZycsXG4gICAgJ2RlZm9yZXN0JyxcbiAgICAnZGVmcmF1ZCcsXG4gICAgJ2RlZnJvc3QnLFxuICAgICdkZWZ0bHknLFxuICAgICdkZWZ1c2UnLFxuICAgICdkZWZ5JyxcbiAgICAnZGVncmFkZWQnLFxuICAgICdkZWdyYWRpbmcnLFxuICAgICdkZWdyZWFzZScsXG4gICAgJ2RlZ3JlZScsXG4gICAgJ2RlaHlkcmF0ZScsXG4gICAgJ2RlaXR5JyxcbiAgICAnZGVqZWN0ZWQnLFxuICAgICdkZWxheScsXG4gICAgJ2RlbGVnYXRlJyxcbiAgICAnZGVsZWdhdG9yJyxcbiAgICAnZGVsZXRlJyxcbiAgICAnZGVsZXRpb24nLFxuICAgICdkZWxpY2FjeScsXG4gICAgJ2RlbGljYXRlJyxcbiAgICAnZGVsaWNpb3VzJyxcbiAgICAnZGVsaWdodGVkJyxcbiAgICAnZGVsaXJpb3VzJyxcbiAgICAnZGVsaXJpdW0nLFxuICAgICdkZWxpdmVyZXInLFxuICAgICdkZWxpdmVyeScsXG4gICAgJ2RlbG91c2UnLFxuICAgICdkZWx0YScsXG4gICAgJ2RlbHVnZScsXG4gICAgJ2RlbHVzaW9uJyxcbiAgICAnZGVsdXhlJyxcbiAgICAnZGVtYW5kaW5nJyxcbiAgICAnZGVtZWFuaW5nJyxcbiAgICAnZGVtZWFub3InLFxuICAgICdkZW1pc2UnLFxuICAgICdkZW1vY3JhY3knLFxuICAgICdkZW1vY3JhdCcsXG4gICAgJ2RlbW90ZScsXG4gICAgJ2RlbW90aW9uJyxcbiAgICAnZGVteXN0aWZ5JyxcbiAgICAnZGVuYXR1cmVkJyxcbiAgICAnZGVuaWFibGUnLFxuICAgICdkZW5pYWwnLFxuICAgICdkZW5pbScsXG4gICAgJ2Rlbm90ZScsXG4gICAgJ2RlbnNlJyxcbiAgICAnZGVuc2l0eScsXG4gICAgJ2RlbnRhbCcsXG4gICAgJ2RlbnRpc3QnLFxuICAgICdkZW50dXJlJyxcbiAgICAnZGVueScsXG4gICAgJ2Rlb2RvcmFudCcsXG4gICAgJ2Rlb2Rvcml6ZScsXG4gICAgJ2RlcGFydGVkJyxcbiAgICAnZGVwYXJ0dXJlJyxcbiAgICAnZGVwaWN0JyxcbiAgICAnZGVwbGV0ZScsXG4gICAgJ2RlcGxldGlvbicsXG4gICAgJ2RlcGxvcmVkJyxcbiAgICAnZGVwbG95JyxcbiAgICAnZGVwb3J0JyxcbiAgICAnZGVwb3NlJyxcbiAgICAnZGVwcmF2ZWQnLFxuICAgICdkZXByYXZpdHknLFxuICAgICdkZXByZWNhdGUnLFxuICAgICdkZXByZXNzJyxcbiAgICAnZGVwcml2ZScsXG4gICAgJ2RlcHRoJyxcbiAgICAnZGVwdXRpemUnLFxuICAgICdkZXB1dHknLFxuICAgICdkZXJhaWwnLFxuICAgICdkZXJhbmdlZCcsXG4gICAgJ2RlcmJ5JyxcbiAgICAnZGVyaXZlZCcsXG4gICAgJ2Rlc2VjcmF0ZScsXG4gICAgJ2Rlc2VydmUnLFxuICAgICdkZXNlcnZpbmcnLFxuICAgICdkZXNpZ25hdGUnLFxuICAgICdkZXNpZ25lZCcsXG4gICAgJ2Rlc2lnbmVyJyxcbiAgICAnZGVzaWduaW5nJyxcbiAgICAnZGVza2JvdW5kJyxcbiAgICAnZGVza3RvcCcsXG4gICAgJ2Rlc2t3b3JrJyxcbiAgICAnZGVzb2xhdGUnLFxuICAgICdkZXNwYWlyJyxcbiAgICAnZGVzcGlzZScsXG4gICAgJ2Rlc3BpdGUnLFxuICAgICdkZXN0aW55JyxcbiAgICAnZGVzdGl0dXRlJyxcbiAgICAnZGVzdHJ1Y3QnLFxuICAgICdkZXRhY2hlZCcsXG4gICAgJ2RldGFpbCcsXG4gICAgJ2RldGVjdGlvbicsXG4gICAgJ2RldGVjdGl2ZScsXG4gICAgJ2RldGVjdG9yJyxcbiAgICAnZGV0ZW50aW9uJyxcbiAgICAnZGV0ZXJnZW50JyxcbiAgICAnZGV0ZXN0JyxcbiAgICAnZGV0b25hdGUnLFxuICAgICdkZXRvbmF0b3InLFxuICAgICdkZXRveGlmeScsXG4gICAgJ2RldHJhY3QnLFxuICAgICdkZXVjZScsXG4gICAgJ2RldmFsdWUnLFxuICAgICdkZXZpYW5jeScsXG4gICAgJ2RldmlhbnQnLFxuICAgICdkZXZpYXRlJyxcbiAgICAnZGV2aWF0aW9uJyxcbiAgICAnZGV2aWF0b3InLFxuICAgICdkZXZpY2UnLFxuICAgICdkZXZpb3VzJyxcbiAgICAnZGV2b3RlZGx5JyxcbiAgICAnZGV2b3RlZScsXG4gICAgJ2Rldm90aW9uJyxcbiAgICAnZGV2b3VyZXInLFxuICAgICdkZXZvdXJpbmcnLFxuICAgICdkZXZvdXRseScsXG4gICAgJ2RleHRlcml0eScsXG4gICAgJ2RleHRlcm91cycsXG4gICAgJ2RpYWJldGVzJyxcbiAgICAnZGlhYmV0aWMnLFxuICAgICdkaWFib2xpYycsXG4gICAgJ2RpYWdub3NlcycsXG4gICAgJ2RpYWdub3NpcycsXG4gICAgJ2RpYWdyYW0nLFxuICAgICdkaWFsJyxcbiAgICAnZGlhbWV0ZXInLFxuICAgICdkaWFwZXInLFxuICAgICdkaWFwaHJhZ20nLFxuICAgICdkaWFyeScsXG4gICAgJ2RpY2UnLFxuICAgICdkaWNpbmcnLFxuICAgICdkaWN0YXRlJyxcbiAgICAnZGljdGF0aW9uJyxcbiAgICAnZGljdGF0b3InLFxuICAgICdkaWZmaWN1bHQnLFxuICAgICdkaWZmdXNlZCcsXG4gICAgJ2RpZmZ1c2VyJyxcbiAgICAnZGlmZnVzaW9uJyxcbiAgICAnZGlmZnVzaXZlJyxcbiAgICAnZGlnJyxcbiAgICAnZGlsYXRpb24nLFxuICAgICdkaWxpZ2VuY2UnLFxuICAgICdkaWxpZ2VudCcsXG4gICAgJ2RpbGwnLFxuICAgICdkaWx1dGUnLFxuICAgICdkaW1lJyxcbiAgICAnZGltaW5pc2gnLFxuICAgICdkaW1seScsXG4gICAgJ2RpbW1lZCcsXG4gICAgJ2RpbW1lcicsXG4gICAgJ2RpbW5lc3MnLFxuICAgICdkaW1wbGUnLFxuICAgICdkaW5lcicsXG4gICAgJ2RpbmdiYXQnLFxuICAgICdkaW5naHknLFxuICAgICdkaW5naW5lc3MnLFxuICAgICdkaW5nbycsXG4gICAgJ2Rpbmd5JyxcbiAgICAnZGluaW5nJyxcbiAgICAnZGlubmVyJyxcbiAgICAnZGlvY2VzZScsXG4gICAgJ2Rpb3hpZGUnLFxuICAgICdkaXBsb21hJyxcbiAgICAnZGlwcGVkJyxcbiAgICAnZGlwcGVyJyxcbiAgICAnZGlwcGluZycsXG4gICAgJ2RpcmVjdGVkJyxcbiAgICAnZGlyZWN0aW9uJyxcbiAgICAnZGlyZWN0aXZlJyxcbiAgICAnZGlyZWN0bHknLFxuICAgICdkaXJlY3RvcnknLFxuICAgICdkaXJlbmVzcycsXG4gICAgJ2RpcnRpbmVzcycsXG4gICAgJ2Rpc2FibGVkJyxcbiAgICAnZGlzYWdyZWUnLFxuICAgICdkaXNhbGxvdycsXG4gICAgJ2Rpc2FybScsXG4gICAgJ2Rpc2FycmF5JyxcbiAgICAnZGlzYXN0ZXInLFxuICAgICdkaXNiYW5kJyxcbiAgICAnZGlzYmVsaWVmJyxcbiAgICAnZGlzYnVyc2UnLFxuICAgICdkaXNjYXJkJyxcbiAgICAnZGlzY2VybicsXG4gICAgJ2Rpc2NoYXJnZScsXG4gICAgJ2Rpc2Nsb3NlJyxcbiAgICAnZGlzY29sb3InLFxuICAgICdkaXNjb3VudCcsXG4gICAgJ2Rpc2NvdXJzZScsXG4gICAgJ2Rpc2NvdmVyJyxcbiAgICAnZGlzY3VzcycsXG4gICAgJ2Rpc2RhaW4nLFxuICAgICdkaXNlbmdhZ2UnLFxuICAgICdkaXNmaWd1cmUnLFxuICAgICdkaXNncmFjZScsXG4gICAgJ2Rpc2gnLFxuICAgICdkaXNpbmZlY3QnLFxuICAgICdkaXNqb2luJyxcbiAgICAnZGlzaycsXG4gICAgJ2Rpc2xpa2UnLFxuICAgICdkaXNsaWtpbmcnLFxuICAgICdkaXNsb2NhdGUnLFxuICAgICdkaXNsb2RnZScsXG4gICAgJ2Rpc2xveWFsJyxcbiAgICAnZGlzbWFudGxlJyxcbiAgICAnZGlzbWF5JyxcbiAgICAnZGlzbWlzcycsXG4gICAgJ2Rpc21vdW50JyxcbiAgICAnZGlzb2JleScsXG4gICAgJ2Rpc29yZGVyJyxcbiAgICAnZGlzb3duJyxcbiAgICAnZGlzcGFyYXRlJyxcbiAgICAnZGlzcGFyaXR5JyxcbiAgICAnZGlzcGF0Y2gnLFxuICAgICdkaXNwZW5zZScsXG4gICAgJ2Rpc3BlcnNhbCcsXG4gICAgJ2Rpc3BlcnNlZCcsXG4gICAgJ2Rpc3BlcnNlcicsXG4gICAgJ2Rpc3BsYWNlJyxcbiAgICAnZGlzcGxheScsXG4gICAgJ2Rpc3BsZWFzZScsXG4gICAgJ2Rpc3Bvc2FsJyxcbiAgICAnZGlzcG9zZScsXG4gICAgJ2Rpc3Byb3ZlJyxcbiAgICAnZGlzcHV0ZScsXG4gICAgJ2Rpc3JlZ2FyZCcsXG4gICAgJ2Rpc3J1cHQnLFxuICAgICdkaXNzdWFkZScsXG4gICAgJ2Rpc3RhbmNlJyxcbiAgICAnZGlzdGFudCcsXG4gICAgJ2Rpc3Rhc3RlJyxcbiAgICAnZGlzdGlsbCcsXG4gICAgJ2Rpc3RpbmN0JyxcbiAgICAnZGlzdG9ydCcsXG4gICAgJ2Rpc3RyYWN0JyxcbiAgICAnZGlzdHJlc3MnLFxuICAgICdkaXN0cmljdCcsXG4gICAgJ2Rpc3RydXN0JyxcbiAgICAnZGl0Y2gnLFxuICAgICdkaXR0bycsXG4gICAgJ2RpdHp5JyxcbiAgICAnZGl2aWRhYmxlJyxcbiAgICAnZGl2aWRlZCcsXG4gICAgJ2RpdmlkZW5kJyxcbiAgICAnZGl2aWRlcnMnLFxuICAgICdkaXZpZGluZycsXG4gICAgJ2RpdmluZWx5JyxcbiAgICAnZGl2aW5nJyxcbiAgICAnZGl2aW5pdHknLFxuICAgICdkaXZpc2libGUnLFxuICAgICdkaXZpc2libHknLFxuICAgICdkaXZpc2lvbicsXG4gICAgJ2RpdmlzaXZlJyxcbiAgICAnZGl2b3JjZWUnLFxuICAgICdkaXp6aW5lc3MnLFxuICAgICdkaXp6eScsXG4gICAgJ2RvYWJsZScsXG4gICAgJ2RvY2lsZScsXG4gICAgJ2RvY2snLFxuICAgICdkb2N0cmluZScsXG4gICAgJ2RvY3VtZW50JyxcbiAgICAnZG9kZ2UnLFxuICAgICdkb2RneScsXG4gICAgJ2RvaWx5JyxcbiAgICAnZG9pbmcnLFxuICAgICdkb2xlJyxcbiAgICAnZG9sbGFyJyxcbiAgICAnZG9sbGhvdXNlJyxcbiAgICAnZG9sbG9wJyxcbiAgICAnZG9sbHknLFxuICAgICdkb2xwaGluJyxcbiAgICAnZG9tYWluJyxcbiAgICAnZG9tZWxpa2UnLFxuICAgICdkb21lc3RpYycsXG4gICAgJ2RvbWluaW9uJyxcbiAgICAnZG9taW5vZXMnLFxuICAgICdkb25hdGVkJyxcbiAgICAnZG9uYXRpb24nLFxuICAgICdkb25hdG9yJyxcbiAgICAnZG9ub3InLFxuICAgICdkb251dCcsXG4gICAgJ2Rvb2RsZScsXG4gICAgJ2Rvb3JiZWxsJyxcbiAgICAnZG9vcmZyYW1lJyxcbiAgICAnZG9vcmtub2InLFxuICAgICdkb29ybWFuJyxcbiAgICAnZG9vcm1hdCcsXG4gICAgJ2Rvb3JuYWlsJyxcbiAgICAnZG9vcnBvc3QnLFxuICAgICdkb29yc3RlcCcsXG4gICAgJ2Rvb3JzdG9wJyxcbiAgICAnZG9vcndheScsXG4gICAgJ2Rvb3p5JyxcbiAgICAnZG9yaycsXG4gICAgJ2Rvcm1pdG9yeScsXG4gICAgJ2RvcnNhbCcsXG4gICAgJ2Rvc2FnZScsXG4gICAgJ2Rvc2UnLFxuICAgICdkb3R0ZWQnLFxuICAgICdkb3VibGluZycsXG4gICAgJ2RvdWNoZScsXG4gICAgJ2RvdmUnLFxuICAgICdkb3duJyxcbiAgICAnZG93cnknLFxuICAgICdkb3plJyxcbiAgICAnZHJhYicsXG4gICAgJ2RyYWdnaW5nJyxcbiAgICAnZHJhZ29uZmx5JyxcbiAgICAnZHJhZ29uaXNoJyxcbiAgICAnZHJhZ3N0ZXInLFxuICAgICdkcmFpbmFibGUnLFxuICAgICdkcmFpbmFnZScsXG4gICAgJ2RyYWluZWQnLFxuICAgICdkcmFpbmVyJyxcbiAgICAnZHJhaW5waXBlJyxcbiAgICAnZHJhbWF0aWMnLFxuICAgICdkcmFtYXRpemUnLFxuICAgICdkcmFuaycsXG4gICAgJ2RyYXBlcnknLFxuICAgICdkcmFzdGljJyxcbiAgICAnZHJhdycsXG4gICAgJ2RyZWFkZWQnLFxuICAgICdkcmVhZGZ1bCcsXG4gICAgJ2RyZWFkbG9jaycsXG4gICAgJ2RyZWFtYm9hdCcsXG4gICAgJ2RyZWFtaWx5JyxcbiAgICAnZHJlYW1sYW5kJyxcbiAgICAnZHJlYW1sZXNzJyxcbiAgICAnZHJlYW1saWtlJyxcbiAgICAnZHJlYW10JyxcbiAgICAnZHJlYW15JyxcbiAgICAnZHJlYXJpbHknLFxuICAgICdkcmVhcnknLFxuICAgICdkcmVuY2gnLFxuICAgICdkcmVzcycsXG4gICAgJ2RyZXcnLFxuICAgICdkcmliYmxlJyxcbiAgICAnZHJpZWQnLFxuICAgICdkcmllcicsXG4gICAgJ2RyaWZ0JyxcbiAgICAnZHJpbGxlcicsXG4gICAgJ2RyaWxsaW5nJyxcbiAgICAnZHJpbmthYmxlJyxcbiAgICAnZHJpbmtpbmcnLFxuICAgICdkcmlwcGluZycsXG4gICAgJ2RyaXBweScsXG4gICAgJ2RyaXZhYmxlJyxcbiAgICAnZHJpdmVuJyxcbiAgICAnZHJpdmVyJyxcbiAgICAnZHJpdmV3YXknLFxuICAgICdkcml2aW5nJyxcbiAgICAnZHJpenpsZScsXG4gICAgJ2RyaXp6bHknLFxuICAgICdkcm9uZScsXG4gICAgJ2Ryb29sJyxcbiAgICAnZHJvb3AnLFxuICAgICdkcm9wLWRvd24nLFxuICAgICdkcm9wYm94JyxcbiAgICAnZHJvcGtpY2snLFxuICAgICdkcm9wbGV0JyxcbiAgICAnZHJvcG91dCcsXG4gICAgJ2Ryb3BwZXInLFxuICAgICdkcm92ZScsXG4gICAgJ2Ryb3duJyxcbiAgICAnZHJvd3NpbHknLFxuICAgICdkcnVkZ2UnLFxuICAgICdkcnVtJyxcbiAgICAnZHJ5JyxcbiAgICAnZHViYmVkJyxcbiAgICAnZHViaW91c2x5JyxcbiAgICAnZHVjaGVzcycsXG4gICAgJ2R1Y2tiaWxsJyxcbiAgICAnZHVja2luZycsXG4gICAgJ2R1Y2tsaW5nJyxcbiAgICAnZHVja3RhaWwnLFxuICAgICdkdWNreScsXG4gICAgJ2R1Y3QnLFxuICAgICdkdWRlJyxcbiAgICAnZHVmZmVsJyxcbiAgICAnZHVnb3V0JyxcbiAgICAnZHVoJyxcbiAgICAnZHVrZScsXG4gICAgJ2R1bGxlcicsXG4gICAgJ2R1bGxuZXNzJyxcbiAgICAnZHVseScsXG4gICAgJ2R1bXBpbmcnLFxuICAgICdkdW1wbGluZycsXG4gICAgJ2R1bXBzdGVyJyxcbiAgICAnZHVvJyxcbiAgICAnZHVwZScsXG4gICAgJ2R1cGxleCcsXG4gICAgJ2R1cGxpY2F0ZScsXG4gICAgJ2R1cGxpY2l0eScsXG4gICAgJ2R1cmFibGUnLFxuICAgICdkdXJhYmx5JyxcbiAgICAnZHVyYXRpb24nLFxuICAgICdkdXJlc3MnLFxuICAgICdkdXJpbmcnLFxuICAgICdkdXNrJyxcbiAgICAnZHVzdCcsXG4gICAgJ2R1dGlmdWwnLFxuICAgICdkdXR5JyxcbiAgICAnZHV2ZXQnLFxuICAgICdkd2FyZicsXG4gICAgJ2R3ZWViJyxcbiAgICAnZHdlbGxlZCcsXG4gICAgJ2R3ZWxsZXInLFxuICAgICdkd2VsbGluZycsXG4gICAgJ2R3aW5kbGUnLFxuICAgICdkd2luZGxpbmcnLFxuICAgICdkeW5hbWljJyxcbiAgICAnZHluYW1pdGUnLFxuICAgICdkeW5hc3R5JyxcbiAgICAnZHlzbGV4aWEnLFxuICAgICdkeXNsZXhpYycsXG4gICAgJ2VhY2gnLFxuICAgICdlYWdsZScsXG4gICAgJ2VhcmFjaGUnLFxuICAgICdlYXJkcnVtJyxcbiAgICAnZWFyZmxhcCcsXG4gICAgJ2VhcmZ1bCcsXG4gICAgJ2VhcmxvYmUnLFxuICAgICdlYXJseScsXG4gICAgJ2Vhcm1hcmsnLFxuICAgICdlYXJtdWZmJyxcbiAgICAnZWFycGhvbmUnLFxuICAgICdlYXJwaWVjZScsXG4gICAgJ2VhcnBsdWdzJyxcbiAgICAnZWFycmluZycsXG4gICAgJ2VhcnNob3QnLFxuICAgICdlYXJ0aGVuJyxcbiAgICAnZWFydGhsaWtlJyxcbiAgICAnZWFydGhsaW5nJyxcbiAgICAnZWFydGhseScsXG4gICAgJ2VhcnRod29ybScsXG4gICAgJ2VhcnRoeScsXG4gICAgJ2VhcndpZycsXG4gICAgJ2Vhc2VmdWwnLFxuICAgICdlYXNlbCcsXG4gICAgJ2Vhc2llc3QnLFxuICAgICdlYXNpbHknLFxuICAgICdlYXNpbmVzcycsXG4gICAgJ2Vhc2luZycsXG4gICAgJ2Vhc3Rib3VuZCcsXG4gICAgJ2Vhc3Rjb2FzdCcsXG4gICAgJ2Vhc3RlcicsXG4gICAgJ2Vhc3R3YXJkJyxcbiAgICAnZWF0YWJsZScsXG4gICAgJ2VhdGVuJyxcbiAgICAnZWF0ZXJ5JyxcbiAgICAnZWF0aW5nJyxcbiAgICAnZWF0cycsXG4gICAgJ2ViYXknLFxuICAgICdlYm9ueScsXG4gICAgJ2Vib29rJyxcbiAgICAnZWNhcmQnLFxuICAgICdlY2NlbnRyaWMnLFxuICAgICdlY2hvJyxcbiAgICAnZWNsYWlyJyxcbiAgICAnZWNsaXBzZScsXG4gICAgJ2Vjb2xvZ2lzdCcsXG4gICAgJ2Vjb2xvZ3knLFxuICAgICdlY29ub21pYycsXG4gICAgJ2Vjb25vbWlzdCcsXG4gICAgJ2Vjb25vbXknLFxuICAgICdlY29zcGhlcmUnLFxuICAgICdlY29zeXN0ZW0nLFxuICAgICdlZGdlJyxcbiAgICAnZWRnaW5lc3MnLFxuICAgICdlZGdpbmcnLFxuICAgICdlZGd5JyxcbiAgICAnZWRpdGlvbicsXG4gICAgJ2VkaXRvcicsXG4gICAgJ2VkdWNhdGVkJyxcbiAgICAnZWR1Y2F0aW9uJyxcbiAgICAnZWR1Y2F0b3InLFxuICAgICdlZWwnLFxuICAgICdlZmZlY3RpdmUnLFxuICAgICdlZmZlY3RzJyxcbiAgICAnZWZmaWNpZW50JyxcbiAgICAnZWZmb3J0JyxcbiAgICAnZWdnYmVhdGVyJyxcbiAgICAnZWdnaW5nJyxcbiAgICAnZWdnbm9nJyxcbiAgICAnZWdncGxhbnQnLFxuICAgICdlZ2dzaGVsbCcsXG4gICAgJ2Vnb21hbmlhYycsXG4gICAgJ2Vnb3Rpc20nLFxuICAgICdlZ290aXN0aWMnLFxuICAgICdlaXRoZXInLFxuICAgICdlamVjdCcsXG4gICAgJ2VsYWJvcmF0ZScsXG4gICAgJ2VsYXN0aWMnLFxuICAgICdlbGF0ZWQnLFxuICAgICdlbGJvdycsXG4gICAgJ2VsZGVyY2FyZScsXG4gICAgJ2VsZGVybHknLFxuICAgICdlbGRlc3QnLFxuICAgICdlbGVjdGFibGUnLFxuICAgICdlbGVjdGlvbicsXG4gICAgJ2VsZWN0aXZlJyxcbiAgICAnZWxlcGhhbnQnLFxuICAgICdlbGV2YXRlJyxcbiAgICAnZWxldmF0aW5nJyxcbiAgICAnZWxldmF0aW9uJyxcbiAgICAnZWxldmF0b3InLFxuICAgICdlbGV2ZW4nLFxuICAgICdlbGYnLFxuICAgICdlbGlnaWJsZScsXG4gICAgJ2VsaWdpYmx5JyxcbiAgICAnZWxpbWluYXRlJyxcbiAgICAnZWxpdGUnLFxuICAgICdlbGl0aXNtJyxcbiAgICAnZWxpeGlyJyxcbiAgICAnZWxrJyxcbiAgICAnZWxsaXBzZScsXG4gICAgJ2VsbGlwdGljJyxcbiAgICAnZWxtJyxcbiAgICAnZWxvbmdhdGVkJyxcbiAgICAnZWxvcGUnLFxuICAgICdlbG9xdWVuY2UnLFxuICAgICdlbG9xdWVudCcsXG4gICAgJ2Vsc2V3aGVyZScsXG4gICAgJ2VsdWRlJyxcbiAgICAnZWx1c2l2ZScsXG4gICAgJ2VsdmVzJyxcbiAgICAnZW1haWwnLFxuICAgICdlbWJhcmdvJyxcbiAgICAnZW1iYXJrJyxcbiAgICAnZW1iYXNzeScsXG4gICAgJ2VtYmF0dGxlZCcsXG4gICAgJ2VtYmVsbGlzaCcsXG4gICAgJ2VtYmVyJyxcbiAgICAnZW1iZXp6bGUnLFxuICAgICdlbWJsYXplJyxcbiAgICAnZW1ibGVtJyxcbiAgICAnZW1ib2R5JyxcbiAgICAnZW1ib2xpc20nLFxuICAgICdlbWJvc3MnLFxuICAgICdlbWJyb2lkZXInLFxuICAgICdlbWNlZScsXG4gICAgJ2VtZXJhbGQnLFxuICAgICdlbWVyZ2VuY3knLFxuICAgICdlbWlzc2lvbicsXG4gICAgJ2VtaXQnLFxuICAgICdlbW90ZScsXG4gICAgJ2Vtb3RpY29uJyxcbiAgICAnZW1vdGlvbicsXG4gICAgJ2VtcGF0aGljJyxcbiAgICAnZW1wYXRoeScsXG4gICAgJ2VtcGVyb3InLFxuICAgICdlbXBoYXNlcycsXG4gICAgJ2VtcGhhc2lzJyxcbiAgICAnZW1waGFzaXplJyxcbiAgICAnZW1waGF0aWMnLFxuICAgICdlbXBpcmljYWwnLFxuICAgICdlbXBsb3llZCcsXG4gICAgJ2VtcGxveWVlJyxcbiAgICAnZW1wbG95ZXInLFxuICAgICdlbXBvcml1bScsXG4gICAgJ2VtcG93ZXInLFxuICAgICdlbXB0aWVyJyxcbiAgICAnZW1wdGluZXNzJyxcbiAgICAnZW1wdHknLFxuICAgICdlbXUnLFxuICAgICdlbmFibGUnLFxuICAgICdlbmFjdG1lbnQnLFxuICAgICdlbmFtZWwnLFxuICAgICdlbmNoYW50ZWQnLFxuICAgICdlbmNoaWxhZGEnLFxuICAgICdlbmNpcmNsZScsXG4gICAgJ2VuY2xvc2UnLFxuICAgICdlbmNsb3N1cmUnLFxuICAgICdlbmNvZGUnLFxuICAgICdlbmNvcmUnLFxuICAgICdlbmNvdW50ZXInLFxuICAgICdlbmNvdXJhZ2UnLFxuICAgICdlbmNyb2FjaCcsXG4gICAgJ2VuY3J1c3QnLFxuICAgICdlbmNyeXB0JyxcbiAgICAnZW5kYW5nZXInLFxuICAgICdlbmRlYXJlZCcsXG4gICAgJ2VuZGVhcmluZycsXG4gICAgJ2VuZGVkJyxcbiAgICAnZW5kaW5nJyxcbiAgICAnZW5kbGVzcycsXG4gICAgJ2VuZG5vdGUnLFxuICAgICdlbmRvY3JpbmUnLFxuICAgICdlbmRvcnBoaW4nLFxuICAgICdlbmRvcnNlJyxcbiAgICAnZW5kb3dtZW50JyxcbiAgICAnZW5kcG9pbnQnLFxuICAgICdlbmR1cmFibGUnLFxuICAgICdlbmR1cmFuY2UnLFxuICAgICdlbmR1cmluZycsXG4gICAgJ2VuZXJnZXRpYycsXG4gICAgJ2VuZXJnaXplJyxcbiAgICAnZW5lcmd5JyxcbiAgICAnZW5mb3JjZWQnLFxuICAgICdlbmZvcmNlcicsXG4gICAgJ2VuZ2FnZWQnLFxuICAgICdlbmdhZ2luZycsXG4gICAgJ2VuZ2luZScsXG4gICAgJ2VuZ29yZ2UnLFxuICAgICdlbmdyYXZlZCcsXG4gICAgJ2VuZ3JhdmVyJyxcbiAgICAnZW5ncmF2aW5nJyxcbiAgICAnZW5ncm9zcycsXG4gICAgJ2VuZ3VsZicsXG4gICAgJ2VuaGFuY2UnLFxuICAgICdlbmlnbWF0aWMnLFxuICAgICdlbmpveWFibGUnLFxuICAgICdlbmpveWFibHknLFxuICAgICdlbmpveWVyJyxcbiAgICAnZW5qb3lpbmcnLFxuICAgICdlbmpveW1lbnQnLFxuICAgICdlbmxhcmdlZCcsXG4gICAgJ2VubGFyZ2luZycsXG4gICAgJ2VubGlnaHRlbicsXG4gICAgJ2VubGlzdGVkJyxcbiAgICAnZW5xdWlyZXInLFxuICAgICdlbnJhZ2UnLFxuICAgICdlbnJpY2gnLFxuICAgICdlbnJvbGwnLFxuICAgICdlbnNsYXZlJyxcbiAgICAnZW5zbmFyZScsXG4gICAgJ2Vuc3VyZScsXG4gICAgJ2VudGFpbCcsXG4gICAgJ2VudGFuZ2xlZCcsXG4gICAgJ2VudGVyaW5nJyxcbiAgICAnZW50ZXJ0YWluJyxcbiAgICAnZW50aWNpbmcnLFxuICAgICdlbnRpcmUnLFxuICAgICdlbnRpdGxlJyxcbiAgICAnZW50aXR5JyxcbiAgICAnZW50b21iJyxcbiAgICAnZW50b3VyYWdlJyxcbiAgICAnZW50cmFwJyxcbiAgICAnZW50cmVlJyxcbiAgICAnZW50cmVuY2gnLFxuICAgICdlbnRydXN0JyxcbiAgICAnZW50cnl3YXknLFxuICAgICdlbnR3aW5lJyxcbiAgICAnZW51bmNpYXRlJyxcbiAgICAnZW52ZWxvcGUnLFxuICAgICdlbnZpYWJsZScsXG4gICAgJ2VudmlhYmx5JyxcbiAgICAnZW52aW91cycsXG4gICAgJ2VudmlzaW9uJyxcbiAgICAnZW52b3knLFxuICAgICdlbnZ5JyxcbiAgICAnZW56eW1lJyxcbiAgICAnZXBpYycsXG4gICAgJ2VwaWRlbWljJyxcbiAgICAnZXBpZGVybWFsJyxcbiAgICAnZXBpZGVybWlzJyxcbiAgICAnZXBpZHVyYWwnLFxuICAgICdlcGlsZXBzeScsXG4gICAgJ2VwaWxlcHRpYycsXG4gICAgJ2VwaWxvZ3VlJyxcbiAgICAnZXBpcGhhbnknLFxuICAgICdlcGlzb2RlJyxcbiAgICAnZXF1YWwnLFxuICAgICdlcXVhdGUnLFxuICAgICdlcXVhdGlvbicsXG4gICAgJ2VxdWF0b3InLFxuICAgICdlcXVpbm94JyxcbiAgICAnZXF1aXBtZW50JyxcbiAgICAnZXF1aXR5JyxcbiAgICAnZXF1aXZvY2FsJyxcbiAgICAnZXJhZGljYXRlJyxcbiAgICAnZXJhc2FibGUnLFxuICAgICdlcmFzZWQnLFxuICAgICdlcmFzZXInLFxuICAgICdlcmFzdXJlJyxcbiAgICAnZXJnb25vbWljJyxcbiAgICAnZXJyYW5kJyxcbiAgICAnZXJyYW50JyxcbiAgICAnZXJyYXRpYycsXG4gICAgJ2Vycm9yJyxcbiAgICAnZXJ1cHQnLFxuICAgICdlc2NhbGF0ZScsXG4gICAgJ2VzY2FsYXRvcicsXG4gICAgJ2VzY2FwYWJsZScsXG4gICAgJ2VzY2FwYWRlJyxcbiAgICAnZXNjYXBpc3QnLFxuICAgICdlc2NhcmdvdCcsXG4gICAgJ2Vza2ltbycsXG4gICAgJ2Vzb3BoYWd1cycsXG4gICAgJ2VzcGlvbmFnZScsXG4gICAgJ2VzcHJlc3NvJyxcbiAgICAnZXNxdWlyZScsXG4gICAgJ2Vzc2F5JyxcbiAgICAnZXNzZW5jZScsXG4gICAgJ2Vzc2VudGlhbCcsXG4gICAgJ2VzdGFibGlzaCcsXG4gICAgJ2VzdGF0ZScsXG4gICAgJ2VzdGVlbWVkJyxcbiAgICAnZXN0aW1hdGUnLFxuICAgICdlc3RpbWF0b3InLFxuICAgICdlc3RyYW5nZWQnLFxuICAgICdlc3Ryb2dlbicsXG4gICAgJ2V0Y2hpbmcnLFxuICAgICdldGVybmFsJyxcbiAgICAnZXRlcm5pdHknLFxuICAgICdldGhhbm9sJyxcbiAgICAnZXRoZXInLFxuICAgICdldGhpY2FsbHknLFxuICAgICdldGhpY3MnLFxuICAgICdldXBoZW1pc20nLFxuICAgICdldmFjdWF0ZScsXG4gICAgJ2V2YWN1ZWUnLFxuICAgICdldmFkZScsXG4gICAgJ2V2YWx1YXRlJyxcbiAgICAnZXZhbHVhdG9yJyxcbiAgICAnZXZhcG9yYXRlJyxcbiAgICAnZXZhc2lvbicsXG4gICAgJ2V2YXNpdmUnLFxuICAgICdldmVuJyxcbiAgICAnZXZlcmdsYWRlJyxcbiAgICAnZXZlcmdyZWVuJyxcbiAgICAnZXZlcnlib2R5JyxcbiAgICAnZXZlcnlkYXknLFxuICAgICdldmVyeW9uZScsXG4gICAgJ2V2aWN0JyxcbiAgICAnZXZpZGVuY2UnLFxuICAgICdldmlkZW50JyxcbiAgICAnZXZpbCcsXG4gICAgJ2V2b2tlJyxcbiAgICAnZXZvbHV0aW9uJyxcbiAgICAnZXZvbHZlJyxcbiAgICAnZXhhY3QnLFxuICAgICdleGFsdGVkJyxcbiAgICAnZXhhbXBsZScsXG4gICAgJ2V4Y2F2YXRlJyxcbiAgICAnZXhjYXZhdG9yJyxcbiAgICAnZXhjZWVkaW5nJyxcbiAgICAnZXhjZXB0aW9uJyxcbiAgICAnZXhjZXNzJyxcbiAgICAnZXhjaGFuZ2UnLFxuICAgICdleGNpdGFibGUnLFxuICAgICdleGNpdGluZycsXG4gICAgJ2V4Y2xhaW0nLFxuICAgICdleGNsdWRlJyxcbiAgICAnZXhjbHVkaW5nJyxcbiAgICAnZXhjbHVzaW9uJyxcbiAgICAnZXhjbHVzaXZlJyxcbiAgICAnZXhjcmV0aW9uJyxcbiAgICAnZXhjcmV0b3J5JyxcbiAgICAnZXhjdXJzaW9uJyxcbiAgICAnZXhjdXNhYmxlJyxcbiAgICAnZXhjdXNhYmx5JyxcbiAgICAnZXhjdXNlJyxcbiAgICAnZXhlbXBsYXJ5JyxcbiAgICAnZXhlbXBsaWZ5JyxcbiAgICAnZXhlbXB0aW9uJyxcbiAgICAnZXhlcmNpc2VyJyxcbiAgICAnZXhlcnQnLFxuICAgICdleGVzJyxcbiAgICAnZXhmb2xpYXRlJyxcbiAgICAnZXhoYWxlJyxcbiAgICAnZXhoYXVzdCcsXG4gICAgJ2V4aHVtZScsXG4gICAgJ2V4aWxlJyxcbiAgICAnZXhpc3RpbmcnLFxuICAgICdleGl0JyxcbiAgICAnZXhvZHVzJyxcbiAgICAnZXhvbmVyYXRlJyxcbiAgICAnZXhvcmNpc20nLFxuICAgICdleG9yY2lzdCcsXG4gICAgJ2V4cGFuZCcsXG4gICAgJ2V4cGFuc2UnLFxuICAgICdleHBhbnNpb24nLFxuICAgICdleHBhbnNpdmUnLFxuICAgICdleHBlY3RhbnQnLFxuICAgICdleHBlZGl0ZWQnLFxuICAgICdleHBlZGl0ZXInLFxuICAgICdleHBlbCcsXG4gICAgJ2V4cGVuZCcsXG4gICAgJ2V4cGVuc2VzJyxcbiAgICAnZXhwZW5zaXZlJyxcbiAgICAnZXhwZXJ0JyxcbiAgICAnZXhwaXJlJyxcbiAgICAnZXhwaXJpbmcnLFxuICAgICdleHBsYWluJyxcbiAgICAnZXhwbGV0aXZlJyxcbiAgICAnZXhwbGljaXQnLFxuICAgICdleHBsb2RlJyxcbiAgICAnZXhwbG9pdCcsXG4gICAgJ2V4cGxvcmUnLFxuICAgICdleHBsb3JpbmcnLFxuICAgICdleHBvbmVudCcsXG4gICAgJ2V4cG9ydGVyJyxcbiAgICAnZXhwb3NhYmxlJyxcbiAgICAnZXhwb3NlJyxcbiAgICAnZXhwb3N1cmUnLFxuICAgICdleHByZXNzJyxcbiAgICAnZXhwdWxzaW9uJyxcbiAgICAnZXhxdWlzaXRlJyxcbiAgICAnZXh0ZW5kZWQnLFxuICAgICdleHRlbmRpbmcnLFxuICAgICdleHRlbnQnLFxuICAgICdleHRlbnVhdGUnLFxuICAgICdleHRlcmlvcicsXG4gICAgJ2V4dGVybmFsJyxcbiAgICAnZXh0aW5jdCcsXG4gICAgJ2V4dG9ydGlvbicsXG4gICAgJ2V4dHJhZGl0ZScsXG4gICAgJ2V4dHJhcycsXG4gICAgJ2V4dHJvdmVydCcsXG4gICAgJ2V4dHJ1ZGUnLFxuICAgICdleHRydWRpbmcnLFxuICAgICdleHViZXJhbnQnLFxuICAgICdmYWJsZScsXG4gICAgJ2ZhYnJpYycsXG4gICAgJ2ZhYnVsb3VzJyxcbiAgICAnZmFjZWJvb2snLFxuICAgICdmYWNlY2xvdGgnLFxuICAgICdmYWNlZG93bicsXG4gICAgJ2ZhY2VsZXNzJyxcbiAgICAnZmFjZWxpZnQnLFxuICAgICdmYWNlcGxhdGUnLFxuICAgICdmYWNldGVkJyxcbiAgICAnZmFjaWFsJyxcbiAgICAnZmFjaWxpdHknLFxuICAgICdmYWNpbmcnLFxuICAgICdmYWNzaW1pbGUnLFxuICAgICdmYWN0aW9uJyxcbiAgICAnZmFjdG9pZCcsXG4gICAgJ2ZhY3RvcicsXG4gICAgJ2ZhY3RzaGVldCcsXG4gICAgJ2ZhY3R1YWwnLFxuICAgICdmYWN1bHR5JyxcbiAgICAnZmFkZScsXG4gICAgJ2ZhZGluZycsXG4gICAgJ2ZhaWxpbmcnLFxuICAgICdmYWxjb24nLFxuICAgICdmYWxsJyxcbiAgICAnZmFsc2UnLFxuICAgICdmYWxzaWZ5JyxcbiAgICAnZmFtZScsXG4gICAgJ2ZhbWlsaWFyJyxcbiAgICAnZmFtaWx5JyxcbiAgICAnZmFtaW5lJyxcbiAgICAnZmFtaXNoZWQnLFxuICAgICdmYW5hdGljJyxcbiAgICAnZmFuY2llZCcsXG4gICAgJ2ZhbmNpbmVzcycsXG4gICAgJ2ZhbmN5JyxcbiAgICAnZmFuZmFyZScsXG4gICAgJ2ZhbmcnLFxuICAgICdmYW5uaW5nJyxcbiAgICAnZmFudGFzaXplJyxcbiAgICAnZmFudGFzdGljJyxcbiAgICAnZmFudGFzeScsXG4gICAgJ2Zhc2Npc20nLFxuICAgICdmYXN0YmFsbCcsXG4gICAgJ2Zhc3RlcicsXG4gICAgJ2Zhc3RpbmcnLFxuICAgICdmYXN0bmVzcycsXG4gICAgJ2ZhdWNldCcsXG4gICAgJ2Zhdm9yYWJsZScsXG4gICAgJ2Zhdm9yYWJseScsXG4gICAgJ2Zhdm9yZWQnLFxuICAgICdmYXZvcmluZycsXG4gICAgJ2Zhdm9yaXRlJyxcbiAgICAnZmF4JyxcbiAgICAnZmVhc3QnLFxuICAgICdmZWRlcmFsJyxcbiAgICAnZmVkb3JhJyxcbiAgICAnZmVlYmxlJyxcbiAgICAnZmVlZCcsXG4gICAgJ2ZlZWwnLFxuICAgICdmZWlzdHknLFxuICAgICdmZWxpbmUnLFxuICAgICdmZWx0LXRpcCcsXG4gICAgJ2ZlbWluaW5lJyxcbiAgICAnZmVtaW5pc20nLFxuICAgICdmZW1pbmlzdCcsXG4gICAgJ2ZlbWluaXplJyxcbiAgICAnZmVtdXInLFxuICAgICdmZW5jZScsXG4gICAgJ2ZlbmNpbmcnLFxuICAgICdmZW5kZXInLFxuICAgICdmZXJtZW50JyxcbiAgICAnZmVybmxpa2UnLFxuICAgICdmZXJvY2lvdXMnLFxuICAgICdmZXJvY2l0eScsXG4gICAgJ2ZlcnJldCcsXG4gICAgJ2ZlcnJpcycsXG4gICAgJ2ZlcnJ5JyxcbiAgICAnZmVydm9yJyxcbiAgICAnZmVzdGVyJyxcbiAgICAnZmVzdGl2YWwnLFxuICAgICdmZXN0aXZlJyxcbiAgICAnZmVzdGl2aXR5JyxcbiAgICAnZmV0YWwnLFxuICAgICdmZXRjaCcsXG4gICAgJ2ZldmVyJyxcbiAgICAnZmliZXInLFxuICAgICdmaWN0aW9uJyxcbiAgICAnZmlkZGxlJyxcbiAgICAnZmlkZGxpbmcnLFxuICAgICdmaWRlbGl0eScsXG4gICAgJ2ZpZGdldGluZycsXG4gICAgJ2ZpZGdldHknLFxuICAgICdmaWZ0ZWVuJyxcbiAgICAnZmlmdGgnLFxuICAgICdmaWZ0aWV0aCcsXG4gICAgJ2ZpZnR5JyxcbiAgICAnZmlnbWVudCcsXG4gICAgJ2ZpZ3VyZScsXG4gICAgJ2ZpZ3VyaW5lJyxcbiAgICAnZmlsaW5nJyxcbiAgICAnZmlsbGVkJyxcbiAgICAnZmlsbGVyJyxcbiAgICAnZmlsbGluZycsXG4gICAgJ2ZpbG0nLFxuICAgICdmaWx0ZXInLFxuICAgICdmaWx0aCcsXG4gICAgJ2ZpbHRyYXRlJyxcbiAgICAnZmluYWxlJyxcbiAgICAnZmluYWxpc3QnLFxuICAgICdmaW5hbGl6ZScsXG4gICAgJ2ZpbmFsbHknLFxuICAgICdmaW5hbmNlJyxcbiAgICAnZmluYW5jaWFsJyxcbiAgICAnZmluY2gnLFxuICAgICdmaW5lbmVzcycsXG4gICAgJ2ZpbmVyJyxcbiAgICAnZmluaWNreScsXG4gICAgJ2ZpbmlzaGVkJyxcbiAgICAnZmluaXNoZXInLFxuICAgICdmaW5pc2hpbmcnLFxuICAgICdmaW5pdGUnLFxuICAgICdmaW5sZXNzJyxcbiAgICAnZmlubGlrZScsXG4gICAgJ2Zpc2NhbGx5JyxcbiAgICAnZml0JyxcbiAgICAnZml2ZScsXG4gICAgJ2ZsYWNjaWQnLFxuICAgICdmbGFnbWFuJyxcbiAgICAnZmxhZ3BvbGUnLFxuICAgICdmbGFnc2hpcCcsXG4gICAgJ2ZsYWdzdGljaycsXG4gICAgJ2ZsYWdzdG9uZScsXG4gICAgJ2ZsYWlsJyxcbiAgICAnZmxha2lseScsXG4gICAgJ2ZsYWt5JyxcbiAgICAnZmxhbWUnLFxuICAgICdmbGFtbWFibGUnLFxuICAgICdmbGFua2VkJyxcbiAgICAnZmxhbmtpbmcnLFxuICAgICdmbGFubmVscycsXG4gICAgJ2ZsYXAnLFxuICAgICdmbGFyaW5nJyxcbiAgICAnZmxhc2hiYWNrJyxcbiAgICAnZmxhc2hidWxiJyxcbiAgICAnZmxhc2hjYXJkJyxcbiAgICAnZmxhc2hpbHknLFxuICAgICdmbGFzaGluZycsXG4gICAgJ2ZsYXNoeScsXG4gICAgJ2ZsYXNrJyxcbiAgICAnZmxhdGJlZCcsXG4gICAgJ2ZsYXRmb290JyxcbiAgICAnZmxhdGx5JyxcbiAgICAnZmxhdG5lc3MnLFxuICAgICdmbGF0dGVuJyxcbiAgICAnZmxhdHRlcmVkJyxcbiAgICAnZmxhdHRlcmVyJyxcbiAgICAnZmxhdHRlcnknLFxuICAgICdmbGF0dG9wJyxcbiAgICAnZmxhdHdhcmUnLFxuICAgICdmbGF0d29ybScsXG4gICAgJ2ZsYXZvcmVkJyxcbiAgICAnZmxhdm9yZnVsJyxcbiAgICAnZmxhdm9yaW5nJyxcbiAgICAnZmxheHNlZWQnLFxuICAgICdmbGVkJyxcbiAgICAnZmxlc2hlZCcsXG4gICAgJ2ZsZXNoeScsXG4gICAgJ2ZsaWNrJyxcbiAgICAnZmxpZXInLFxuICAgICdmbGlnaHQnLFxuICAgICdmbGluY2gnLFxuICAgICdmbGluZycsXG4gICAgJ2ZsaW50JyxcbiAgICAnZmxpcCcsXG4gICAgJ2ZsaXJ0JyxcbiAgICAnZmxvYXQnLFxuICAgICdmbG9jaycsXG4gICAgJ2Zsb2dnaW5nJyxcbiAgICAnZmxvcCcsXG4gICAgJ2Zsb3JhbCcsXG4gICAgJ2Zsb3Jpc3QnLFxuICAgICdmbG9zcycsXG4gICAgJ2Zsb3VuZGVyJyxcbiAgICAnZmx5YWJsZScsXG4gICAgJ2ZseWF3YXknLFxuICAgICdmbHllcicsXG4gICAgJ2ZseWluZycsXG4gICAgJ2ZseW92ZXInLFxuICAgICdmbHlwYXBlcicsXG4gICAgJ2ZvYW0nLFxuICAgICdmb2UnLFxuICAgICdmb2cnLFxuICAgICdmb2lsJyxcbiAgICAnZm9saWMnLFxuICAgICdmb2xrJyxcbiAgICAnZm9sbGljbGUnLFxuICAgICdmb2xsb3cnLFxuICAgICdmb25kbGluZycsXG4gICAgJ2ZvbmRseScsXG4gICAgJ2ZvbmRuZXNzJyxcbiAgICAnZm9uZHVlJyxcbiAgICAnZm9udCcsXG4gICAgJ2Zvb2QnLFxuICAgICdmb29sJyxcbiAgICAnZm9vdGFnZScsXG4gICAgJ2Zvb3RiYWxsJyxcbiAgICAnZm9vdGJhdGgnLFxuICAgICdmb290Ym9hcmQnLFxuICAgICdmb290ZXInLFxuICAgICdmb290Z2VhcicsXG4gICAgJ2Zvb3RoaWxsJyxcbiAgICAnZm9vdGhvbGQnLFxuICAgICdmb290aW5nJyxcbiAgICAnZm9vdGxlc3MnLFxuICAgICdmb290bWFuJyxcbiAgICAnZm9vdG5vdGUnLFxuICAgICdmb290cGFkJyxcbiAgICAnZm9vdHBhdGgnLFxuICAgICdmb290cHJpbnQnLFxuICAgICdmb290cmVzdCcsXG4gICAgJ2Zvb3RzaWUnLFxuICAgICdmb290c29yZScsXG4gICAgJ2Zvb3R3ZWFyJyxcbiAgICAnZm9vdHdvcmsnLFxuICAgICdmb3NzaWwnLFxuICAgICdmb3N0ZXInLFxuICAgICdmb3VuZGVyJyxcbiAgICAnZm91bmRpbmcnLFxuICAgICdmb3VudGFpbicsXG4gICAgJ2ZveCcsXG4gICAgJ2ZveWVyJyxcbiAgICAnZnJhY3Rpb24nLFxuICAgICdmcmFjdHVyZScsXG4gICAgJ2ZyYWdpbGUnLFxuICAgICdmcmFnaWxpdHknLFxuICAgICdmcmFnbWVudCcsXG4gICAgJ2ZyYWdyYW5jZScsXG4gICAgJ2ZyYWdyYW50JyxcbiAgICAnZnJhaWwnLFxuICAgICdmcmFtZScsXG4gICAgJ2ZyYW1pbmcnLFxuICAgICdmcmFudGljJyxcbiAgICAnZnJhdGVybmFsJyxcbiAgICAnZnJheWVkJyxcbiAgICAnZnJheWluZycsXG4gICAgJ2ZyYXlzJyxcbiAgICAnZnJlY2tsZWQnLFxuICAgICdmcmVja2xlcycsXG4gICAgJ2ZyZWViYXNlJyxcbiAgICAnZnJlZWJlZScsXG4gICAgJ2ZyZWViaWUnLFxuICAgICdmcmVlZG9tJyxcbiAgICAnZnJlZWZhbGwnLFxuICAgICdmcmVlaGFuZCcsXG4gICAgJ2ZyZWVpbmcnLFxuICAgICdmcmVlbG9hZCcsXG4gICAgJ2ZyZWVseScsXG4gICAgJ2ZyZWVtYXNvbicsXG4gICAgJ2ZyZWVuZXNzJyxcbiAgICAnZnJlZXN0eWxlJyxcbiAgICAnZnJlZXdhcmUnLFxuICAgICdmcmVld2F5JyxcbiAgICAnZnJlZXdpbGwnLFxuICAgICdmcmVlemFibGUnLFxuICAgICdmcmVlemluZycsXG4gICAgJ2ZyZWlnaHQnLFxuICAgICdmcmVuY2gnLFxuICAgICdmcmVuemllZCcsXG4gICAgJ2ZyZW56eScsXG4gICAgJ2ZyZXF1ZW5jeScsXG4gICAgJ2ZyZXF1ZW50JyxcbiAgICAnZnJlc2gnLFxuICAgICdmcmV0ZnVsJyxcbiAgICAnZnJldHRlZCcsXG4gICAgJ2ZyaWN0aW9uJyxcbiAgICAnZnJpZGF5JyxcbiAgICAnZnJpZGdlJyxcbiAgICAnZnJpZWQnLFxuICAgICdmcmllbmQnLFxuICAgICdmcmlnaHRlbicsXG4gICAgJ2ZyaWdodGZ1bCcsXG4gICAgJ2ZyaWdpZGl0eScsXG4gICAgJ2ZyaWdpZGx5JyxcbiAgICAnZnJpbGwnLFxuICAgICdmcmluZ2UnLFxuICAgICdmcmlzYmVlJyxcbiAgICAnZnJpc2snLFxuICAgICdmcml0dGVyJyxcbiAgICAnZnJpdm9sb3VzJyxcbiAgICAnZnJvbGljJyxcbiAgICAnZnJvbScsXG4gICAgJ2Zyb250JyxcbiAgICAnZnJvc3RiaXRlJyxcbiAgICAnZnJvc3RlZCcsXG4gICAgJ2Zyb3N0aWx5JyxcbiAgICAnZnJvc3RpbmcnLFxuICAgICdmcm9zdGxpa2UnLFxuICAgICdmcm9zdHknLFxuICAgICdmcm90aCcsXG4gICAgJ2Zyb3duJyxcbiAgICAnZnJvemVuJyxcbiAgICAnZnJ1Y3Rvc2UnLFxuICAgICdmcnVnYWxpdHknLFxuICAgICdmcnVnYWxseScsXG4gICAgJ2ZydWl0JyxcbiAgICAnZnJ1c3RyYXRlJyxcbiAgICAnZnJ5aW5nJyxcbiAgICAnZ2FiJyxcbiAgICAnZ2FmZmUnLFxuICAgICdnYWcnLFxuICAgICdnYWluZnVsbHknLFxuICAgICdnYWluaW5nJyxcbiAgICAnZ2FpbnMnLFxuICAgICdnYWxhJyxcbiAgICAnZ2FsbGFudGx5JyxcbiAgICAnZ2FsbGVyaWEnLFxuICAgICdnYWxsZXJ5JyxcbiAgICAnZ2FsbGV5JyxcbiAgICAnZ2FsbG9uJyxcbiAgICAnZ2FsbG93cycsXG4gICAgJ2dhbGxzdG9uZScsXG4gICAgJ2dhbG9yZScsXG4gICAgJ2dhbHZhbml6ZScsXG4gICAgJ2dhbWJsaW5nJyxcbiAgICAnZ2FtZScsXG4gICAgJ2dhbWluZycsXG4gICAgJ2dhbW1hJyxcbiAgICAnZ2FuZGVyJyxcbiAgICAnZ2FuZ2x5JyxcbiAgICAnZ2FuZ3JlbmUnLFxuICAgICdnYW5nd2F5JyxcbiAgICAnZ2FwJyxcbiAgICAnZ2FyYWdlJyxcbiAgICAnZ2FyYmFnZScsXG4gICAgJ2dhcmRlbicsXG4gICAgJ2dhcmdsZScsXG4gICAgJ2dhcmxhbmQnLFxuICAgICdnYXJsaWMnLFxuICAgICdnYXJtZW50JyxcbiAgICAnZ2FybmV0JyxcbiAgICAnZ2FybmlzaCcsXG4gICAgJ2dhcnRlcicsXG4gICAgJ2dhcycsXG4gICAgJ2dhdGhlcmVyJyxcbiAgICAnZ2F0aGVyaW5nJyxcbiAgICAnZ2F0aW5nJyxcbiAgICAnZ2F1Z2luZycsXG4gICAgJ2dhdW50bGV0JyxcbiAgICAnZ2F1emUnLFxuICAgICdnYXZlJyxcbiAgICAnZ2F3aycsXG4gICAgJ2dhemluZycsXG4gICAgJ2dlYXInLFxuICAgICdnZWNrbycsXG4gICAgJ2dlZWsnLFxuICAgICdnZWlnZXInLFxuICAgICdnZW0nLFxuICAgICdnZW5kZXInLFxuICAgICdnZW5lcmljJyxcbiAgICAnZ2VuZXJvdXMnLFxuICAgICdnZW5ldGljcycsXG4gICAgJ2dlbnJlJyxcbiAgICAnZ2VudGlsZScsXG4gICAgJ2dlbnRsZW1hbicsXG4gICAgJ2dlbnRseScsXG4gICAgJ2dlbnRzJyxcbiAgICAnZ2VvZ3JhcGh5JyxcbiAgICAnZ2VvbG9naWMnLFxuICAgICdnZW9sb2dpc3QnLFxuICAgICdnZW9sb2d5JyxcbiAgICAnZ2VvbWV0cmljJyxcbiAgICAnZ2VvbWV0cnknLFxuICAgICdnZXJhbml1bScsXG4gICAgJ2dlcmJpbCcsXG4gICAgJ2dlcmlhdHJpYycsXG4gICAgJ2dlcm1pY2lkZScsXG4gICAgJ2dlcm1pbmF0ZScsXG4gICAgJ2dlcm1sZXNzJyxcbiAgICAnZ2VybXByb29mJyxcbiAgICAnZ2VzdGF0ZScsXG4gICAgJ2dlc3RhdGlvbicsXG4gICAgJ2dlc3R1cmUnLFxuICAgICdnZXRhd2F5JyxcbiAgICAnZ2V0dGluZycsXG4gICAgJ2dldHVwJyxcbiAgICAnZ2lhbnQnLFxuICAgICdnaWJiZXJpc2gnLFxuICAgICdnaWJsZXQnLFxuICAgICdnaWRkaWx5JyxcbiAgICAnZ2lkZGluZXNzJyxcbiAgICAnZ2lkZHknLFxuICAgICdnaWZ0JyxcbiAgICAnZ2lnYWJ5dGUnLFxuICAgICdnaWdhaGVydHonLFxuICAgICdnaWdhbnRpYycsXG4gICAgJ2dpZ2dsZScsXG4gICAgJ2dpZ2dsaW5nJyxcbiAgICAnZ2lnZ2x5JyxcbiAgICAnZ2lnb2xvJyxcbiAgICAnZ2lsbGVkJyxcbiAgICAnZ2lsbHMnLFxuICAgICdnaW1taWNrJyxcbiAgICAnZ2lyZGxlJyxcbiAgICAnZ2l2ZWF3YXknLFxuICAgICdnaXZlbicsXG4gICAgJ2dpdmVyJyxcbiAgICAnZ2l2aW5nJyxcbiAgICAnZ2l6bW8nLFxuICAgICdnaXp6YXJkJyxcbiAgICAnZ2xhY2lhbCcsXG4gICAgJ2dsYWNpZXInLFxuICAgICdnbGFkZScsXG4gICAgJ2dsYWRpYXRvcicsXG4gICAgJ2dsYWRseScsXG4gICAgJ2dsYW1vcm91cycsXG4gICAgJ2dsYW1vdXInLFxuICAgICdnbGFuY2UnLFxuICAgICdnbGFuY2luZycsXG4gICAgJ2dsYW5kdWxhcicsXG4gICAgJ2dsYXJlJyxcbiAgICAnZ2xhcmluZycsXG4gICAgJ2dsYXNzJyxcbiAgICAnZ2xhdWNvbWEnLFxuICAgICdnbGF6aW5nJyxcbiAgICAnZ2xlYW1pbmcnLFxuICAgICdnbGVlZnVsJyxcbiAgICAnZ2xpZGVyJyxcbiAgICAnZ2xpZGluZycsXG4gICAgJ2dsaW1tZXInLFxuICAgICdnbGltcHNlJyxcbiAgICAnZ2xpc3RlbicsXG4gICAgJ2dsaXRjaCcsXG4gICAgJ2dsaXR0ZXInLFxuICAgICdnbGl0enknLFxuICAgICdnbG9hdGVyJyxcbiAgICAnZ2xvYXRpbmcnLFxuICAgICdnbG9vbWlseScsXG4gICAgJ2dsb29teScsXG4gICAgJ2dsb3JpZmllZCcsXG4gICAgJ2dsb3JpZmllcicsXG4gICAgJ2dsb3JpZnknLFxuICAgICdnbG9yaW91cycsXG4gICAgJ2dsb3J5JyxcbiAgICAnZ2xvc3MnLFxuICAgICdnbG92ZScsXG4gICAgJ2dsb3dpbmcnLFxuICAgICdnbG93d29ybScsXG4gICAgJ2dsdWNvc2UnLFxuICAgICdnbHVlJyxcbiAgICAnZ2x1dGVuJyxcbiAgICAnZ2x1dGlub3VzJyxcbiAgICAnZ2x1dHRvbicsXG4gICAgJ2duYXJseScsXG4gICAgJ2duYXQnLFxuICAgICdnb2FsJyxcbiAgICAnZ29hdHNraW4nLFxuICAgICdnb2VzJyxcbiAgICAnZ29nZ2xlcycsXG4gICAgJ2dvaW5nJyxcbiAgICAnZ29sZGZpc2gnLFxuICAgICdnb2xkbWluZScsXG4gICAgJ2dvbGRzbWl0aCcsXG4gICAgJ2dvbGYnLFxuICAgICdnb2xpYXRoJyxcbiAgICAnZ29uYWQnLFxuICAgICdnb25kb2xhJyxcbiAgICAnZ29uZScsXG4gICAgJ2dvbmcnLFxuICAgICdnb29kJyxcbiAgICAnZ29vZXknLFxuICAgICdnb29mYmFsbCcsXG4gICAgJ2dvb2ZpbmVzcycsXG4gICAgJ2dvb2Z5JyxcbiAgICAnZ29vZ2xlJyxcbiAgICAnZ29vbicsXG4gICAgJ2dvcGhlcicsXG4gICAgJ2dvcmUnLFxuICAgICdnb3JnZWQnLFxuICAgICdnb3JnZW91cycsXG4gICAgJ2dvcnknLFxuICAgICdnb3NsaW5nJyxcbiAgICAnZ29zc2lwJyxcbiAgICAnZ290aGljJyxcbiAgICAnZ290dGVuJyxcbiAgICAnZ291dCcsXG4gICAgJ2dvd24nLFxuICAgICdncmFiJyxcbiAgICAnZ3JhY2VmdWwnLFxuICAgICdncmFjZWxlc3MnLFxuICAgICdncmFjaW91cycsXG4gICAgJ2dyYWRhdGlvbicsXG4gICAgJ2dyYWRlZCcsXG4gICAgJ2dyYWRlcicsXG4gICAgJ2dyYWRpZW50JyxcbiAgICAnZ3JhZGluZycsXG4gICAgJ2dyYWR1YWxseScsXG4gICAgJ2dyYWR1YXRlJyxcbiAgICAnZ3JhZmZpdGknLFxuICAgICdncmFmdGVkJyxcbiAgICAnZ3JhZnRpbmcnLFxuICAgICdncmFpbicsXG4gICAgJ2dyYW5kZGFkJyxcbiAgICAnZ3JhbmRraWQnLFxuICAgICdncmFuZGx5JyxcbiAgICAnZ3JhbmRtYScsXG4gICAgJ2dyYW5kcGEnLFxuICAgICdncmFuZHNvbicsXG4gICAgJ2dyYW5pdGUnLFxuICAgICdncmFubnknLFxuICAgICdncmFub2xhJyxcbiAgICAnZ3JhbnQnLFxuICAgICdncmFudWxhcicsXG4gICAgJ2dyYXBlJyxcbiAgICAnZ3JhcGgnLFxuICAgICdncmFwcGxlJyxcbiAgICAnZ3JhcHBsaW5nJyxcbiAgICAnZ3Jhc3AnLFxuICAgICdncmFzcycsXG4gICAgJ2dyYXRpZmllZCcsXG4gICAgJ2dyYXRpZnknLFxuICAgICdncmF0aW5nJyxcbiAgICAnZ3JhdGl0dWRlJyxcbiAgICAnZ3JhdHVpdHknLFxuICAgICdncmF2ZWwnLFxuICAgICdncmF2ZW5lc3MnLFxuICAgICdncmF2ZXMnLFxuICAgICdncmF2ZXlhcmQnLFxuICAgICdncmF2aXRhdGUnLFxuICAgICdncmF2aXR5JyxcbiAgICAnZ3JhdnknLFxuICAgICdncmF5JyxcbiAgICAnZ3JhemluZycsXG4gICAgJ2dyZWFzaWx5JyxcbiAgICAnZ3JlZWRpbHknLFxuICAgICdncmVlZGxlc3MnLFxuICAgICdncmVlZHknLFxuICAgICdncmVlbicsXG4gICAgJ2dyZWV0ZXInLFxuICAgICdncmVldGluZycsXG4gICAgJ2dyZXcnLFxuICAgICdncmV5aG91bmQnLFxuICAgICdncmlkJyxcbiAgICAnZ3JpZWYnLFxuICAgICdncmlldmFuY2UnLFxuICAgICdncmlldmluZycsXG4gICAgJ2dyaWV2b3VzJyxcbiAgICAnZ3JpbGwnLFxuICAgICdncmltYWNlJyxcbiAgICAnZ3JpbWFjaW5nJyxcbiAgICAnZ3JpbWUnLFxuICAgICdncmltaW5lc3MnLFxuICAgICdncmlteScsXG4gICAgJ2dyaW5jaCcsXG4gICAgJ2dyaW5uaW5nJyxcbiAgICAnZ3JpcCcsXG4gICAgJ2dyaXN0bGUnLFxuICAgICdncml0JyxcbiAgICAnZ3JvZ2dpbHknLFxuICAgICdncm9nZ3knLFxuICAgICdncm9pbicsXG4gICAgJ2dyb29tJyxcbiAgICAnZ3Jvb3ZlJyxcbiAgICAnZ3Jvb3ZpbmcnLFxuICAgICdncm9vdnknLFxuICAgICdncm9wZScsXG4gICAgJ2dyb3VuZCcsXG4gICAgJ2dyb3VwZWQnLFxuICAgICdncm91dCcsXG4gICAgJ2dyb3ZlJyxcbiAgICAnZ3Jvd2VyJyxcbiAgICAnZ3Jvd2luZycsXG4gICAgJ2dyb3dsJyxcbiAgICAnZ3J1YicsXG4gICAgJ2dydWRnZScsXG4gICAgJ2dydWRnaW5nJyxcbiAgICAnZ3J1ZWxpbmcnLFxuICAgICdncnVmZmx5JyxcbiAgICAnZ3J1bWJsZScsXG4gICAgJ2dydW1ibGluZycsXG4gICAgJ2dydW1ibHknLFxuICAgICdncnVtcGlseScsXG4gICAgJ2dydW5nZScsXG4gICAgJ2dydW50JyxcbiAgICAnZ3VhY2Ftb2xlJyxcbiAgICAnZ3VpZGFibGUnLFxuICAgICdndWlkYW5jZScsXG4gICAgJ2d1aWRlJyxcbiAgICAnZ3VpZGluZycsXG4gICAgJ2d1aWxlbGVzcycsXG4gICAgJ2d1aXNlJyxcbiAgICAnZ3VsZicsXG4gICAgJ2d1bGxpYmxlJyxcbiAgICAnZ3VsbHknLFxuICAgICdndWxwJyxcbiAgICAnZ3VtYmFsbCcsXG4gICAgJ2d1bWRyb3AnLFxuICAgICdndW1taW5lc3MnLFxuICAgICdndW1taW5nJyxcbiAgICAnZ3VtbXknLFxuICAgICdndXJnbGUnLFxuICAgICdndXJnbGluZycsXG4gICAgJ2d1cnUnLFxuICAgICdndXNoJyxcbiAgICAnZ3VzdG8nLFxuICAgICdndXN0eScsXG4gICAgJ2d1dGxlc3MnLFxuICAgICdndXRzJyxcbiAgICAnZ3V0dGVyJyxcbiAgICAnZ3V5JyxcbiAgICAnZ3V6emxlcicsXG4gICAgJ2d5cmF0aW9uJyxcbiAgICAnaGFiaXRhYmxlJyxcbiAgICAnaGFiaXRhbnQnLFxuICAgICdoYWJpdGF0JyxcbiAgICAnaGFiaXR1YWwnLFxuICAgICdoYWNrZWQnLFxuICAgICdoYWNrZXInLFxuICAgICdoYWNraW5nJyxcbiAgICAnaGFja3NhdycsXG4gICAgJ2hhZCcsXG4gICAgJ2hhZ2dsZXInLFxuICAgICdoYWlrdScsXG4gICAgJ2hhbGYnLFxuICAgICdoYWxvZ2VuJyxcbiAgICAnaGFsdCcsXG4gICAgJ2hhbHZlZCcsXG4gICAgJ2hhbHZlcycsXG4gICAgJ2hhbWJ1cmdlcicsXG4gICAgJ2hhbWxldCcsXG4gICAgJ2hhbW1vY2snLFxuICAgICdoYW1wZXInLFxuICAgICdoYW1zdGVyJyxcbiAgICAnaGFtc3RyaW5nJyxcbiAgICAnaGFuZGJhZycsXG4gICAgJ2hhbmRiYWxsJyxcbiAgICAnaGFuZGJvb2snLFxuICAgICdoYW5kYnJha2UnLFxuICAgICdoYW5kY2FydCcsXG4gICAgJ2hhbmRjbGFwJyxcbiAgICAnaGFuZGNsYXNwJyxcbiAgICAnaGFuZGNyYWZ0JyxcbiAgICAnaGFuZGN1ZmYnLFxuICAgICdoYW5kZWQnLFxuICAgICdoYW5kZnVsJyxcbiAgICAnaGFuZGdyaXAnLFxuICAgICdoYW5kZ3VuJyxcbiAgICAnaGFuZGhlbGQnLFxuICAgICdoYW5kaW5lc3MnLFxuICAgICdoYW5kaXdvcmsnLFxuICAgICdoYW5kbGViYXInLFxuICAgICdoYW5kbGVkJyxcbiAgICAnaGFuZGxlcicsXG4gICAgJ2hhbmRsaW5nJyxcbiAgICAnaGFuZG1hZGUnLFxuICAgICdoYW5kb2ZmJyxcbiAgICAnaGFuZHBpY2snLFxuICAgICdoYW5kcHJpbnQnLFxuICAgICdoYW5kcmFpbCcsXG4gICAgJ2hhbmRzYXcnLFxuICAgICdoYW5kc2V0JyxcbiAgICAnaGFuZHNmcmVlJyxcbiAgICAnaGFuZHNoYWtlJyxcbiAgICAnaGFuZHN0YW5kJyxcbiAgICAnaGFuZHdhc2gnLFxuICAgICdoYW5kd29yaycsXG4gICAgJ2hhbmR3b3ZlbicsXG4gICAgJ2hhbmR3cml0ZScsXG4gICAgJ2hhbmR5bWFuJyxcbiAgICAnaGFuZ25haWwnLFxuICAgICdoYW5nb3V0JyxcbiAgICAnaGFuZ292ZXInLFxuICAgICdoYW5ndXAnLFxuICAgICdoYW5rZXJpbmcnLFxuICAgICdoYW5raWUnLFxuICAgICdoYW5reScsXG4gICAgJ2hhcGhhemFyZCcsXG4gICAgJ2hhcHBlbmluZycsXG4gICAgJ2hhcHBpZXInLFxuICAgICdoYXBwaWVzdCcsXG4gICAgJ2hhcHBpbHknLFxuICAgICdoYXBwaW5lc3MnLFxuICAgICdoYXBweScsXG4gICAgJ2hhcmJvcicsXG4gICAgJ2hhcmRjb3B5JyxcbiAgICAnaGFyZGNvcmUnLFxuICAgICdoYXJkY292ZXInLFxuICAgICdoYXJkZGlzaycsXG4gICAgJ2hhcmRlbmVkJyxcbiAgICAnaGFyZGVuZXInLFxuICAgICdoYXJkZW5pbmcnLFxuICAgICdoYXJkaGF0JyxcbiAgICAnaGFyZGhlYWQnLFxuICAgICdoYXJkaW5lc3MnLFxuICAgICdoYXJkbHknLFxuICAgICdoYXJkbmVzcycsXG4gICAgJ2hhcmRzaGlwJyxcbiAgICAnaGFyZHdhcmUnLFxuICAgICdoYXJkd2lyZWQnLFxuICAgICdoYXJkd29vZCcsXG4gICAgJ2hhcmR5JyxcbiAgICAnaGFybWZ1bCcsXG4gICAgJ2hhcm1sZXNzJyxcbiAgICAnaGFybW9uaWNhJyxcbiAgICAnaGFybW9uaWNzJyxcbiAgICAnaGFybW9uaXplJyxcbiAgICAnaGFybW9ueScsXG4gICAgJ2hhcm5lc3MnLFxuICAgICdoYXJwaXN0JyxcbiAgICAnaGFyc2gnLFxuICAgICdoYXJ2ZXN0JyxcbiAgICAnaGFzaCcsXG4gICAgJ2hhc3NsZScsXG4gICAgJ2hhc3RlJyxcbiAgICAnaGFzdGlseScsXG4gICAgJ2hhc3RpbmVzcycsXG4gICAgJ2hhc3R5JyxcbiAgICAnaGF0Ym94JyxcbiAgICAnaGF0Y2hiYWNrJyxcbiAgICAnaGF0Y2hlcnknLFxuICAgICdoYXRjaGV0JyxcbiAgICAnaGF0Y2hpbmcnLFxuICAgICdoYXRjaGxpbmcnLFxuICAgICdoYXRlJyxcbiAgICAnaGF0bGVzcycsXG4gICAgJ2hhdHJlZCcsXG4gICAgJ2hhdW50JyxcbiAgICAnaGF2ZW4nLFxuICAgICdoYXphcmQnLFxuICAgICdoYXplbG51dCcsXG4gICAgJ2hhemlseScsXG4gICAgJ2hhemluZXNzJyxcbiAgICAnaGF6aW5nJyxcbiAgICAnaGF6eScsXG4gICAgJ2hlYWRhY2hlJyxcbiAgICAnaGVhZGJhbmQnLFxuICAgICdoZWFkYm9hcmQnLFxuICAgICdoZWFkY291bnQnLFxuICAgICdoZWFkZHJlc3MnLFxuICAgICdoZWFkZWQnLFxuICAgICdoZWFkZXInLFxuICAgICdoZWFkZmlyc3QnLFxuICAgICdoZWFkZ2VhcicsXG4gICAgJ2hlYWRpbmcnLFxuICAgICdoZWFkbGFtcCcsXG4gICAgJ2hlYWRsZXNzJyxcbiAgICAnaGVhZGxvY2snLFxuICAgICdoZWFkcGhvbmUnLFxuICAgICdoZWFkcGllY2UnLFxuICAgICdoZWFkcmVzdCcsXG4gICAgJ2hlYWRyb29tJyxcbiAgICAnaGVhZHNjYXJmJyxcbiAgICAnaGVhZHNldCcsXG4gICAgJ2hlYWRzbWFuJyxcbiAgICAnaGVhZHN0YW5kJyxcbiAgICAnaGVhZHN0b25lJyxcbiAgICAnaGVhZHdheScsXG4gICAgJ2hlYWR3ZWFyJyxcbiAgICAnaGVhcCcsXG4gICAgJ2hlYXQnLFxuICAgICdoZWF2ZScsXG4gICAgJ2hlYXZpbHknLFxuICAgICdoZWF2aW5lc3MnLFxuICAgICdoZWF2aW5nJyxcbiAgICAnaGVkZ2UnLFxuICAgICdoZWRnaW5nJyxcbiAgICAnaGVmdGluZXNzJyxcbiAgICAnaGVmdHknLFxuICAgICdoZWxpdW0nLFxuICAgICdoZWxtZXQnLFxuICAgICdoZWxwZXInLFxuICAgICdoZWxwZnVsJyxcbiAgICAnaGVscGluZycsXG4gICAgJ2hlbHBsZXNzJyxcbiAgICAnaGVscGxpbmUnLFxuICAgICdoZW1sb2NrJyxcbiAgICAnaGVtc3RpdGNoJyxcbiAgICAnaGVuY2UnLFxuICAgICdoZW5jaG1hbicsXG4gICAgJ2hlbm5hJyxcbiAgICAnaGVyYWxkJyxcbiAgICAnaGVyYmFsJyxcbiAgICAnaGVyYmljaWRlJyxcbiAgICAnaGVyYnMnLFxuICAgICdoZXJpdGFnZScsXG4gICAgJ2hlcm1pdCcsXG4gICAgJ2hlcm9pY3MnLFxuICAgICdoZXJvaXNtJyxcbiAgICAnaGVycmluZycsXG4gICAgJ2hlcnNlbGYnLFxuICAgICdoZXJ0eicsXG4gICAgJ2hlc2l0YW5jeScsXG4gICAgJ2hlc2l0YW50JyxcbiAgICAnaGVzaXRhdGUnLFxuICAgICdoZXhhZ29uJyxcbiAgICAnaGV4YWdyYW0nLFxuICAgICdodWJjYXAnLFxuICAgICdodWRkbGUnLFxuICAgICdodWRkbGluZycsXG4gICAgJ2h1ZmYnLFxuICAgICdodWcnLFxuICAgICdodWxhJyxcbiAgICAnaHVsaycsXG4gICAgJ2h1bGwnLFxuICAgICdodW1hbicsXG4gICAgJ2h1bWJsZScsXG4gICAgJ2h1bWJsaW5nJyxcbiAgICAnaHVtYmx5JyxcbiAgICAnaHVtaWQnLFxuICAgICdodW1pbGlhdGUnLFxuICAgICdodW1pbGl0eScsXG4gICAgJ2h1bW1pbmcnLFxuICAgICdodW1tdXMnLFxuICAgICdodW1vbmdvdXMnLFxuICAgICdodW1vcmlzdCcsXG4gICAgJ2h1bW9ybGVzcycsXG4gICAgJ2h1bW9yb3VzJyxcbiAgICAnaHVtcGJhY2snLFxuICAgICdodW1wZWQnLFxuICAgICdodW12ZWUnLFxuICAgICdodW5jaGJhY2snLFxuICAgICdodW5kcmVkdGgnLFxuICAgICdodW5nZXInLFxuICAgICdodW5ncmlseScsXG4gICAgJ2h1bmdyeScsXG4gICAgJ2h1bmsnLFxuICAgICdodW50ZXInLFxuICAgICdodW50aW5nJyxcbiAgICAnaHVudHJlc3MnLFxuICAgICdodW50c21hbicsXG4gICAgJ2h1cmRsZScsXG4gICAgJ2h1cmxlZCcsXG4gICAgJ2h1cmxlcicsXG4gICAgJ2h1cmxpbmcnLFxuICAgICdodXJyYXknLFxuICAgICdodXJyaWNhbmUnLFxuICAgICdodXJyaWVkJyxcbiAgICAnaHVycnknLFxuICAgICdodXJ0JyxcbiAgICAnaHVzYmFuZCcsXG4gICAgJ2h1c2gnLFxuICAgICdodXNrZWQnLFxuICAgICdodXNraW5lc3MnLFxuICAgICdodXQnLFxuICAgICdoeWJyaWQnLFxuICAgICdoeWRyYW50JyxcbiAgICAnaHlkcmF0ZWQnLFxuICAgICdoeWRyYXRpb24nLFxuICAgICdoeWRyb2dlbicsXG4gICAgJ2h5ZHJveGlkZScsXG4gICAgJ2h5cGVybGluaycsXG4gICAgJ2h5cGVydGV4dCcsXG4gICAgJ2h5cGhlbicsXG4gICAgJ2h5cG5vc2VzJyxcbiAgICAnaHlwbm9zaXMnLFxuICAgICdoeXBub3RpYycsXG4gICAgJ2h5cG5vdGlzbScsXG4gICAgJ2h5cG5vdGlzdCcsXG4gICAgJ2h5cG5vdGl6ZScsXG4gICAgJ2h5cG9jcmlzeScsXG4gICAgJ2h5cG9jcml0ZScsXG4gICAgJ2lidXByb2ZlbicsXG4gICAgJ2ljZScsXG4gICAgJ2ljaW5lc3MnLFxuICAgICdpY2luZycsXG4gICAgJ2lja3knLFxuICAgICdpY29uJyxcbiAgICAnaWN5JyxcbiAgICAnaWRlYWxpc20nLFxuICAgICdpZGVhbGlzdCcsXG4gICAgJ2lkZWFsaXplJyxcbiAgICAnaWRlYWxseScsXG4gICAgJ2lkZWFsbmVzcycsXG4gICAgJ2lkZW50aWNhbCcsXG4gICAgJ2lkZW50aWZ5JyxcbiAgICAnaWRlbnRpdHknLFxuICAgICdpZGVvbG9neScsXG4gICAgJ2lkaW9jeScsXG4gICAgJ2lkaW9tJyxcbiAgICAnaWRseScsXG4gICAgJ2lnbG9vJyxcbiAgICAnaWduaXRpb24nLFxuICAgICdpZ25vcmUnLFxuICAgICdpZ3VhbmEnLFxuICAgICdpbGxpY2l0bHknLFxuICAgICdpbGx1c2lvbicsXG4gICAgJ2lsbHVzaXZlJyxcbiAgICAnaW1hZ2UnLFxuICAgICdpbWFnaW5hcnknLFxuICAgICdpbWFnaW5lcycsXG4gICAgJ2ltYWdpbmcnLFxuICAgICdpbWJlY2lsZScsXG4gICAgJ2ltaXRhdGUnLFxuICAgICdpbWl0YXRpb24nLFxuICAgICdpbW1hdHVyZScsXG4gICAgJ2ltbWVyc2UnLFxuICAgICdpbW1lcnNpb24nLFxuICAgICdpbW1pbmVudCcsXG4gICAgJ2ltbW9iaWxlJyxcbiAgICAnaW1tb2Rlc3QnLFxuICAgICdpbW1vcmFsbHknLFxuICAgICdpbW1vcnRhbCcsXG4gICAgJ2ltbW92YWJsZScsXG4gICAgJ2ltbW92YWJseScsXG4gICAgJ2ltbXVuaXR5JyxcbiAgICAnaW1tdW5pemUnLFxuICAgICdpbXBhaXJlZCcsXG4gICAgJ2ltcGFsZScsXG4gICAgJ2ltcGFydCcsXG4gICAgJ2ltcGF0aWVudCcsXG4gICAgJ2ltcGVhY2gnLFxuICAgICdpbXBlZGluZycsXG4gICAgJ2ltcGVuZGluZycsXG4gICAgJ2ltcGVyZmVjdCcsXG4gICAgJ2ltcGVyaWFsJyxcbiAgICAnaW1waXNoJyxcbiAgICAnaW1wbGFudCcsXG4gICAgJ2ltcGxlbWVudCcsXG4gICAgJ2ltcGxpY2F0ZScsXG4gICAgJ2ltcGxpY2l0JyxcbiAgICAnaW1wbG9kZScsXG4gICAgJ2ltcGxvc2lvbicsXG4gICAgJ2ltcGxvc2l2ZScsXG4gICAgJ2ltcGx5JyxcbiAgICAnaW1wb2xpdGUnLFxuICAgICdpbXBvcnRhbnQnLFxuICAgICdpbXBvcnRlcicsXG4gICAgJ2ltcG9zZScsXG4gICAgJ2ltcG9zaW5nJyxcbiAgICAnaW1wb3RlbmNlJyxcbiAgICAnaW1wb3RlbmN5JyxcbiAgICAnaW1wb3RlbnQnLFxuICAgICdpbXBvdW5kJyxcbiAgICAnaW1wcmVjaXNlJyxcbiAgICAnaW1wcmludCcsXG4gICAgJ2ltcHJpc29uJyxcbiAgICAnaW1wcm9tcHR1JyxcbiAgICAnaW1wcm9wZXInLFxuICAgICdpbXByb3ZlJyxcbiAgICAnaW1wcm92aW5nJyxcbiAgICAnaW1wcm92aXNlJyxcbiAgICAnaW1wcnVkZW50JyxcbiAgICAnaW1wdWxzZScsXG4gICAgJ2ltcHVsc2l2ZScsXG4gICAgJ2ltcHVyZScsXG4gICAgJ2ltcHVyaXR5JyxcbiAgICAnaW9kaW5lJyxcbiAgICAnaW9kaXplJyxcbiAgICAnaW9uJyxcbiAgICAnaXBhZCcsXG4gICAgJ2lwaG9uZScsXG4gICAgJ2lwb2QnLFxuICAgICdpcmF0ZScsXG4gICAgJ2lyaycsXG4gICAgJ2lyb24nLFxuICAgICdpcnJlZ3VsYXInLFxuICAgICdpcnJpZ2F0ZScsXG4gICAgJ2lycml0YWJsZScsXG4gICAgJ2lycml0YWJseScsXG4gICAgJ2lycml0YW50JyxcbiAgICAnaXJyaXRhdGUnLFxuICAgICdpc2xhbWljJyxcbiAgICAnaXNsYW1pc3QnLFxuICAgICdpc29sYXRlZCcsXG4gICAgJ2lzb2xhdGluZycsXG4gICAgJ2lzb2xhdGlvbicsXG4gICAgJ2lzb3RvcGUnLFxuICAgICdpc3N1ZScsXG4gICAgJ2lzc3VpbmcnLFxuICAgICdpdGFsaWNpemUnLFxuICAgICdpdGFsaWNzJyxcbiAgICAnaXRlbScsXG4gICAgJ2l0aW5lcmFyeScsXG4gICAgJ2l0dW5lcycsXG4gICAgJ2l2b3J5JyxcbiAgICAnaXZ5JyxcbiAgICAnamFiJyxcbiAgICAnamFja2FsJyxcbiAgICAnamFja2V0JyxcbiAgICAnamFja2tuaWZlJyxcbiAgICAnamFja3BvdCcsXG4gICAgJ2phaWxiaXJkJyxcbiAgICAnamFpbGJyZWFrJyxcbiAgICAnamFpbGVyJyxcbiAgICAnamFpbGhvdXNlJyxcbiAgICAnamFsYXBlbm8nLFxuICAgICdqYW0nLFxuICAgICdqYW5pdG9yJyxcbiAgICAnamFudWFyeScsXG4gICAgJ2phcmdvbicsXG4gICAgJ2phcnJpbmcnLFxuICAgICdqYXNtaW5lJyxcbiAgICAnamF1bmRpY2UnLFxuICAgICdqYXVudCcsXG4gICAgJ2phdmEnLFxuICAgICdqYXdlZCcsXG4gICAgJ2phd2xlc3MnLFxuICAgICdqYXdsaW5lJyxcbiAgICAnamF3cycsXG4gICAgJ2pheWJpcmQnLFxuICAgICdqYXl3YWxrZXInLFxuICAgICdqYXp6JyxcbiAgICAnamVlcCcsXG4gICAgJ2plZXJpbmdseScsXG4gICAgJ2plbGxpZWQnLFxuICAgICdqZWxseScsXG4gICAgJ2plcnNleScsXG4gICAgJ2plc3RlcicsXG4gICAgJ2pldCcsXG4gICAgJ2ppZmZ5JyxcbiAgICAnamlnc2F3JyxcbiAgICAnamltbXknLFxuICAgICdqaW5nbGUnLFxuICAgICdqaW5nbGluZycsXG4gICAgJ2ppbngnLFxuICAgICdqaXR0ZXJzJyxcbiAgICAnaml0dGVyeScsXG4gICAgJ2pvYicsXG4gICAgJ2pvY2tleScsXG4gICAgJ2pvY2tzdHJhcCcsXG4gICAgJ2pvZ2dlcicsXG4gICAgJ2pvZ2dpbmcnLFxuICAgICdqb2huJyxcbiAgICAnam9pbmluZycsXG4gICAgJ2pva2VzdGVyJyxcbiAgICAnam9raW5nbHknLFxuICAgICdqb2xsaW5lc3MnLFxuICAgICdqb2xseScsXG4gICAgJ2pvbHQnLFxuICAgICdqb3QnLFxuICAgICdqb3ZpYWwnLFxuICAgICdqb3lmdWxseScsXG4gICAgJ2pveWxlc3NseScsXG4gICAgJ2pveW91cycsXG4gICAgJ2pveXJpZGUnLFxuICAgICdqb3lzdGljaycsXG4gICAgJ2p1YmlsYW5jZScsXG4gICAgJ2p1YmlsYW50JyxcbiAgICAnanVkZ2UnLFxuICAgICdqdWRnaW5nbHknLFxuICAgICdqdWRpY2lhbCcsXG4gICAgJ2p1ZGljaWFyeScsXG4gICAgJ2p1ZG8nLFxuICAgICdqdWdnbGUnLFxuICAgICdqdWdnbGluZycsXG4gICAgJ2p1Z3VsYXInLFxuICAgICdqdWljZScsXG4gICAgJ2p1aWNpbmVzcycsXG4gICAgJ2p1aWN5JyxcbiAgICAnanVqaXRzdScsXG4gICAgJ2p1a2Vib3gnLFxuICAgICdqdWx5JyxcbiAgICAnanVtYmxlJyxcbiAgICAnanVtYm8nLFxuICAgICdqdW1wJyxcbiAgICAnanVuY3Rpb24nLFxuICAgICdqdW5jdHVyZScsXG4gICAgJ2p1bmUnLFxuICAgICdqdW5pb3InLFxuICAgICdqdW5pcGVyJyxcbiAgICAnanVua2llJyxcbiAgICAnanVua21hbicsXG4gICAgJ2p1bmt5YXJkJyxcbiAgICAnanVyaXN0JyxcbiAgICAnanVyb3InLFxuICAgICdqdXJ5JyxcbiAgICAnanVzdGljZScsXG4gICAgJ2p1c3RpZmllcicsXG4gICAgJ2p1c3RpZnknLFxuICAgICdqdXN0bHknLFxuICAgICdqdXN0bmVzcycsXG4gICAgJ2p1dmVuaWxlJyxcbiAgICAna2Fib2InLFxuICAgICdrYW5nYXJvbycsXG4gICAgJ2thcmFva2UnLFxuICAgICdrYXJhdGUnLFxuICAgICdrYXJtYScsXG4gICAgJ2tlYmFiJyxcbiAgICAna2Vlbmx5JyxcbiAgICAna2Vlbm5lc3MnLFxuICAgICdrZWVwJyxcbiAgICAna2VnJyxcbiAgICAna2VscCcsXG4gICAgJ2tlbm5lbCcsXG4gICAgJ2tlcHQnLFxuICAgICdrZXJjaGllZicsXG4gICAgJ2tlcm9zZW5lJyxcbiAgICAna2V0dGxlJyxcbiAgICAna2ljaycsXG4gICAgJ2tpbG4nLFxuICAgICdraWxvYnl0ZScsXG4gICAgJ2tpbG9ncmFtJyxcbiAgICAna2lsb21ldGVyJyxcbiAgICAna2lsb3dhdHQnLFxuICAgICdraWx0JyxcbiAgICAna2ltb25vJyxcbiAgICAna2luZGxlJyxcbiAgICAna2luZGxpbmcnLFxuICAgICdraW5kbHknLFxuICAgICdraW5kbmVzcycsXG4gICAgJ2tpbmRyZWQnLFxuICAgICdraW5ldGljJyxcbiAgICAna2luZm9saycsXG4gICAgJ2tpbmcnLFxuICAgICdraW5zaGlwJyxcbiAgICAna2luc21hbicsXG4gICAgJ2tpbnN3b21hbicsXG4gICAgJ2tpc3NhYmxlJyxcbiAgICAna2lzc2VyJyxcbiAgICAna2lzc2luZycsXG4gICAgJ2tpdGNoZW4nLFxuICAgICdraXRlJyxcbiAgICAna2l0dGVuJyxcbiAgICAna2l0dHknLFxuICAgICdraXdpJyxcbiAgICAna2xlZW5leCcsXG4gICAgJ2tuYXBzYWNrJyxcbiAgICAna25lZScsXG4gICAgJ2tuZWx0JyxcbiAgICAna25pY2tlcnMnLFxuICAgICdrbm9sbCcsXG4gICAgJ2tvYWxhJyxcbiAgICAna29va3knLFxuICAgICdrb3NoZXInLFxuICAgICdrcnlwdG9uJyxcbiAgICAna3Vkb3MnLFxuICAgICdrdW5nJyxcbiAgICAnbGFib3JlZCcsXG4gICAgJ2xhYm9yZXInLFxuICAgICdsYWJvcmluZycsXG4gICAgJ2xhYm9yaW91cycsXG4gICAgJ2xhYnJhZG9yJyxcbiAgICAnbGFkZGVyJyxcbiAgICAnbGFkaWVzJyxcbiAgICAnbGFkbGUnLFxuICAgICdsYWR5YnVnJyxcbiAgICAnbGFkeWxpa2UnLFxuICAgICdsYWdnZWQnLFxuICAgICdsYWdnaW5nJyxcbiAgICAnbGFnb29uJyxcbiAgICAnbGFpcicsXG4gICAgJ2xha2UnLFxuICAgICdsYW5jZScsXG4gICAgJ2xhbmRlZCcsXG4gICAgJ2xhbmRmYWxsJyxcbiAgICAnbGFuZGZpbGwnLFxuICAgICdsYW5kaW5nJyxcbiAgICAnbGFuZGxhZHknLFxuICAgICdsYW5kbGVzcycsXG4gICAgJ2xhbmRsaW5lJyxcbiAgICAnbGFuZGxvcmQnLFxuICAgICdsYW5kbWFyaycsXG4gICAgJ2xhbmRtYXNzJyxcbiAgICAnbGFuZG1pbmUnLFxuICAgICdsYW5kb3duZXInLFxuICAgICdsYW5kc2NhcGUnLFxuICAgICdsYW5kc2lkZScsXG4gICAgJ2xhbmRzbGlkZScsXG4gICAgJ2xhbmd1YWdlJyxcbiAgICAnbGFua2luZXNzJyxcbiAgICAnbGFua3knLFxuICAgICdsYW50ZXJuJyxcbiAgICAnbGFwZG9nJyxcbiAgICAnbGFwZWwnLFxuICAgICdsYXBwZWQnLFxuICAgICdsYXBwaW5nJyxcbiAgICAnbGFwdG9wJyxcbiAgICAnbGFyZCcsXG4gICAgJ2xhcmdlJyxcbiAgICAnbGFyaycsXG4gICAgJ2xhc2gnLFxuICAgICdsYXNzbycsXG4gICAgJ2xhc3QnLFxuICAgICdsYXRjaCcsXG4gICAgJ2xhdGUnLFxuICAgICdsYXRoZXInLFxuICAgICdsYXRpdHVkZScsXG4gICAgJ2xhdHJpbmUnLFxuICAgICdsYXR0ZXInLFxuICAgICdsYXR0aWNlZCcsXG4gICAgJ2xhdW5jaCcsXG4gICAgJ2xhdW5kZXInLFxuICAgICdsYXVuZHJ5JyxcbiAgICAnbGF1cmVsJyxcbiAgICAnbGF2ZW5kZXInLFxuICAgICdsYXZpc2gnLFxuICAgICdsYXhhdGl2ZScsXG4gICAgJ2xhemlseScsXG4gICAgJ2xhemluZXNzJyxcbiAgICAnbGF6eScsXG4gICAgJ2xlY3R1cmVyJyxcbiAgICAnbGVmdCcsXG4gICAgJ2xlZ2FjeScsXG4gICAgJ2xlZ2FsJyxcbiAgICAnbGVnZW5kJyxcbiAgICAnbGVnZ2VkJyxcbiAgICAnbGVnZ2luZ3MnLFxuICAgICdsZWdpYmxlJyxcbiAgICAnbGVnaWJseScsXG4gICAgJ2xlZ2lzbGF0ZScsXG4gICAgJ2xlZ28nLFxuICAgICdsZWdyb29tJyxcbiAgICAnbGVndW1lJyxcbiAgICAnbGVnd2FybWVyJyxcbiAgICAnbGVnd29yaycsXG4gICAgJ2xlbW9uJyxcbiAgICAnbGVuZCcsXG4gICAgJ2xlbmd0aCcsXG4gICAgJ2xlbnMnLFxuICAgICdsZW50JyxcbiAgICAnbGVvdGFyZCcsXG4gICAgJ2xlc3NlcicsXG4gICAgJ2xldGRvd24nLFxuICAgICdsZXRoYXJnaWMnLFxuICAgICdsZXRoYXJneScsXG4gICAgJ2xldHRlcicsXG4gICAgJ2xldHR1Y2UnLFxuICAgICdsZXZlbCcsXG4gICAgJ2xldmVyYWdlJyxcbiAgICAnbGV2ZXJzJyxcbiAgICAnbGV2aXRhdGUnLFxuICAgICdsZXZpdGF0b3InLFxuICAgICdsaWFiaWxpdHknLFxuICAgICdsaWFibGUnLFxuICAgICdsaWJlcnR5JyxcbiAgICAnbGlicmFyaWFuJyxcbiAgICAnbGlicmFyeScsXG4gICAgJ2xpY2tpbmcnLFxuICAgICdsaWNvcmljZScsXG4gICAgJ2xpZCcsXG4gICAgJ2xpZmUnLFxuICAgICdsaWZ0ZXInLFxuICAgICdsaWZ0aW5nJyxcbiAgICAnbGlmdG9mZicsXG4gICAgJ2xpZ2FtZW50JyxcbiAgICAnbGlrZWx5JyxcbiAgICAnbGlrZW5lc3MnLFxuICAgICdsaWtld2lzZScsXG4gICAgJ2xpa2luZycsXG4gICAgJ2xpbGFjJyxcbiAgICAnbGlsbHknLFxuICAgICdsaWx5JyxcbiAgICAnbGltYicsXG4gICAgJ2xpbWVhZGUnLFxuICAgICdsaW1lbGlnaHQnLFxuICAgICdsaW1lcycsXG4gICAgJ2xpbWl0JyxcbiAgICAnbGltcGluZycsXG4gICAgJ2xpbXBuZXNzJyxcbiAgICAnbGluZScsXG4gICAgJ2xpbmdvJyxcbiAgICAnbGluZ3VpbmknLFxuICAgICdsaW5ndWlzdCcsXG4gICAgJ2xpbmluZycsXG4gICAgJ2xpbmtlZCcsXG4gICAgJ2xpbm9sZXVtJyxcbiAgICAnbGluc2VlZCcsXG4gICAgJ2xpbnQnLFxuICAgICdsaW9uJyxcbiAgICAnbGlwJyxcbiAgICAnbGlxdWVmeScsXG4gICAgJ2xpcXVldXInLFxuICAgICdsaXF1aWQnLFxuICAgICdsaXNwJyxcbiAgICAnbGlzdCcsXG4gICAgJ2xpdGlnYXRlJyxcbiAgICAnbGl0aWdhdG9yJyxcbiAgICAnbGl0bXVzJyxcbiAgICAnbGl0dGVyJyxcbiAgICAnbGl0dGxlJyxcbiAgICAnbGl2YWJsZScsXG4gICAgJ2xpdmVkJyxcbiAgICAnbGl2ZWx5JyxcbiAgICAnbGl2ZXInLFxuICAgICdsaXZlc3RvY2snLFxuICAgICdsaXZpZGx5JyxcbiAgICAnbGl2aW5nJyxcbiAgICAnbGl6YXJkJyxcbiAgICAnbHVicmljYW50JyxcbiAgICAnbHVicmljYXRlJyxcbiAgICAnbHVjaWQnLFxuICAgICdsdWNraWx5JyxcbiAgICAnbHVja2luZXNzJyxcbiAgICAnbHVja2xlc3MnLFxuICAgICdsdWNyYXRpdmUnLFxuICAgICdsdWRpY3JvdXMnLFxuICAgICdsdWdnZWQnLFxuICAgICdsdWtld2FybScsXG4gICAgJ2x1bGxhYnknLFxuICAgICdsdW1iZXInLFxuICAgICdsdW1pbmFuY2UnLFxuICAgICdsdW1pbm91cycsXG4gICAgJ2x1bXBpbmVzcycsXG4gICAgJ2x1bXBpbmcnLFxuICAgICdsdW1waXNoJyxcbiAgICAnbHVuYWN5JyxcbiAgICAnbHVuYXInLFxuICAgICdsdW5jaGJveCcsXG4gICAgJ2x1bmNoZW9uJyxcbiAgICAnbHVuY2hyb29tJyxcbiAgICAnbHVuY2h0aW1lJyxcbiAgICAnbHVuZycsXG4gICAgJ2x1cmNoJyxcbiAgICAnbHVyZScsXG4gICAgJ2x1cmlkbmVzcycsXG4gICAgJ2x1cmsnLFxuICAgICdsdXNobHknLFxuICAgICdsdXNobmVzcycsXG4gICAgJ2x1c3RlcicsXG4gICAgJ2x1c3RmdWxseScsXG4gICAgJ2x1c3RpbHknLFxuICAgICdsdXN0aW5lc3MnLFxuICAgICdsdXN0cm91cycsXG4gICAgJ2x1c3R5JyxcbiAgICAnbHV4dXJpb3VzJyxcbiAgICAnbHV4dXJ5JyxcbiAgICAnbHlpbmcnLFxuICAgICdseXJpY2FsbHknLFxuICAgICdseXJpY2lzbScsXG4gICAgJ2x5cmljaXN0JyxcbiAgICAnbHlyaWNzJyxcbiAgICAnbWFjYXJlbmEnLFxuICAgICdtYWNhcm9uaScsXG4gICAgJ21hY2F3JyxcbiAgICAnbWFjZScsXG4gICAgJ21hY2hpbmUnLFxuICAgICdtYWNoaW5pc3QnLFxuICAgICdtYWdhemluZScsXG4gICAgJ21hZ2VudGEnLFxuICAgICdtYWdnb3QnLFxuICAgICdtYWdpY2FsJyxcbiAgICAnbWFnaWNpYW4nLFxuICAgICdtYWdtYScsXG4gICAgJ21hZ25lc2l1bScsXG4gICAgJ21hZ25ldGljJyxcbiAgICAnbWFnbmV0aXNtJyxcbiAgICAnbWFnbmV0aXplJyxcbiAgICAnbWFnbmlmaWVyJyxcbiAgICAnbWFnbmlmeScsXG4gICAgJ21hZ25pdHVkZScsXG4gICAgJ21hZ25vbGlhJyxcbiAgICAnbWFob2dhbnknLFxuICAgICdtYWltZWQnLFxuICAgICdtYWplc3RpYycsXG4gICAgJ21hamVzdHknLFxuICAgICdtYWpvcmV0dGUnLFxuICAgICdtYWpvcml0eScsXG4gICAgJ21ha2VvdmVyJyxcbiAgICAnbWFrZXInLFxuICAgICdtYWtlc2hpZnQnLFxuICAgICdtYWtpbmcnLFxuICAgICdtYWxmb3JtZWQnLFxuICAgICdtYWx0JyxcbiAgICAnbWFtYScsXG4gICAgJ21hbW1hbCcsXG4gICAgJ21hbW1hcnknLFxuICAgICdtYW1tb2dyYW0nLFxuICAgICdtYW5hZ2VyJyxcbiAgICAnbWFuYWdpbmcnLFxuICAgICdtYW5hdGVlJyxcbiAgICAnbWFuZGFyaW4nLFxuICAgICdtYW5kYXRlJyxcbiAgICAnbWFuZGF0b3J5JyxcbiAgICAnbWFuZG9saW4nLFxuICAgICdtYW5nZXInLFxuICAgICdtYW5nbGUnLFxuICAgICdtYW5nbycsXG4gICAgJ21hbmd5JyxcbiAgICAnbWFuaGFuZGxlJyxcbiAgICAnbWFuaG9sZScsXG4gICAgJ21hbmhvb2QnLFxuICAgICdtYW5odW50JyxcbiAgICAnbWFuaWNvdHRpJyxcbiAgICAnbWFuaWN1cmUnLFxuICAgICdtYW5pZmVzdG8nLFxuICAgICdtYW5pbGEnLFxuICAgICdtYW5raW5kJyxcbiAgICAnbWFubGlrZScsXG4gICAgJ21hbmxpbmVzcycsXG4gICAgJ21hbmx5JyxcbiAgICAnbWFubWFkZScsXG4gICAgJ21hbm5lZCcsXG4gICAgJ21hbm5pc2gnLFxuICAgICdtYW5vcicsXG4gICAgJ21hbnBvd2VyJyxcbiAgICAnbWFudGlzJyxcbiAgICAnbWFudHJhJyxcbiAgICAnbWFudWFsJyxcbiAgICAnbWFueScsXG4gICAgJ21hcCcsXG4gICAgJ21hcmF0aG9uJyxcbiAgICAnbWFyYXVkaW5nJyxcbiAgICAnbWFyYmxlZCcsXG4gICAgJ21hcmJsZXMnLFxuICAgICdtYXJibGluZycsXG4gICAgJ21hcmNoJyxcbiAgICAnbWFyZGknLFxuICAgICdtYXJnYXJpbmUnLFxuICAgICdtYXJnYXJpdGEnLFxuICAgICdtYXJnaW4nLFxuICAgICdtYXJpZ29sZCcsXG4gICAgJ21hcmluYScsXG4gICAgJ21hcmluZScsXG4gICAgJ21hcml0YWwnLFxuICAgICdtYXJpdGltZScsXG4gICAgJ21hcmxpbicsXG4gICAgJ21hcm1hbGFkZScsXG4gICAgJ21hcm9vbicsXG4gICAgJ21hcnJpZWQnLFxuICAgICdtYXJyb3cnLFxuICAgICdtYXJyeScsXG4gICAgJ21hcnNobGFuZCcsXG4gICAgJ21hcnNoeScsXG4gICAgJ21hcnN1cGlhbCcsXG4gICAgJ21hcnZlbG91cycsXG4gICAgJ21hcnhpc20nLFxuICAgICdtYXNjb3QnLFxuICAgICdtYXNjdWxpbmUnLFxuICAgICdtYXNoZWQnLFxuICAgICdtYXNoaW5nJyxcbiAgICAnbWFzc2FnZXInLFxuICAgICdtYXNzZXMnLFxuICAgICdtYXNzaXZlJyxcbiAgICAnbWFzdGlmZicsXG4gICAgJ21hdGFkb3InLFxuICAgICdtYXRjaGJvb2snLFxuICAgICdtYXRjaGJveCcsXG4gICAgJ21hdGNoZXInLFxuICAgICdtYXRjaGluZycsXG4gICAgJ21hdGNobGVzcycsXG4gICAgJ21hdGVyaWFsJyxcbiAgICAnbWF0ZXJuYWwnLFxuICAgICdtYXRlcm5pdHknLFxuICAgICdtYXRoJyxcbiAgICAnbWF0aW5nJyxcbiAgICAnbWF0cmlhcmNoJyxcbiAgICAnbWF0cmltb255JyxcbiAgICAnbWF0cml4JyxcbiAgICAnbWF0cm9uJyxcbiAgICAnbWF0dGVkJyxcbiAgICAnbWF0dGVyJyxcbiAgICAnbWF0dXJlbHknLFxuICAgICdtYXR1cmluZycsXG4gICAgJ21hdHVyaXR5JyxcbiAgICAnbWF1dmUnLFxuICAgICdtYXZlcmljaycsXG4gICAgJ21heGltaXplJyxcbiAgICAnbWF4aW11bScsXG4gICAgJ21heWJlJyxcbiAgICAnbWF5ZGF5JyxcbiAgICAnbWF5Zmxvd2VyJyxcbiAgICAnbW9hbmVyJyxcbiAgICAnbW9hbmluZycsXG4gICAgJ21vYmlsZScsXG4gICAgJ21vYmlsaXR5JyxcbiAgICAnbW9iaWxpemUnLFxuICAgICdtb2JzdGVyJyxcbiAgICAnbW9jaGEnLFxuICAgICdtb2NrZXInLFxuICAgICdtb2NrdXAnLFxuICAgICdtb2RpZmllZCcsXG4gICAgJ21vZGlmeScsXG4gICAgJ21vZHVsYXInLFxuICAgICdtb2R1bGF0b3InLFxuICAgICdtb2R1bGUnLFxuICAgICdtb2lzdGVuJyxcbiAgICAnbW9pc3RuZXNzJyxcbiAgICAnbW9pc3R1cmUnLFxuICAgICdtb2xhcicsXG4gICAgJ21vbGFzc2VzJyxcbiAgICAnbW9sZCcsXG4gICAgJ21vbGVjdWxhcicsXG4gICAgJ21vbGVjdWxlJyxcbiAgICAnbW9sZWhpbGwnLFxuICAgICdtb2xsdXNrJyxcbiAgICAnbW9tJyxcbiAgICAnbW9uYXN0ZXJ5JyxcbiAgICAnbW9uZGF5JyxcbiAgICAnbW9uZXRhcnknLFxuICAgICdtb25ldGl6ZScsXG4gICAgJ21vbmV5YmFncycsXG4gICAgJ21vbmV5bGVzcycsXG4gICAgJ21vbmV5d2lzZScsXG4gICAgJ21vbmdvb3NlJyxcbiAgICAnbW9uZ3JlbCcsXG4gICAgJ21vbml0b3InLFxuICAgICdtb25raG9vZCcsXG4gICAgJ21vbm9nYW15JyxcbiAgICAnbW9ub2dyYW0nLFxuICAgICdtb25vbG9ndWUnLFxuICAgICdtb25vcG9seScsXG4gICAgJ21vbm9yYWlsJyxcbiAgICAnbW9ub3RvbmUnLFxuICAgICdtb25vdHlwZScsXG4gICAgJ21vbm94aWRlJyxcbiAgICAnbW9uc2lldXInLFxuICAgICdtb25zb29uJyxcbiAgICAnbW9uc3Ryb3VzJyxcbiAgICAnbW9udGhseScsXG4gICAgJ21vbnVtZW50JyxcbiAgICAnbW9vY2hlcicsXG4gICAgJ21vb2RpbmVzcycsXG4gICAgJ21vb2R5JyxcbiAgICAnbW9vaW5nJyxcbiAgICAnbW9vbmJlYW0nLFxuICAgICdtb29uZWQnLFxuICAgICdtb29ubGlnaHQnLFxuICAgICdtb29ubGlrZScsXG4gICAgJ21vb25saXQnLFxuICAgICdtb29ucmlzZScsXG4gICAgJ21vb25zY2FwZScsXG4gICAgJ21vb25zaGluZScsXG4gICAgJ21vb25zdG9uZScsXG4gICAgJ21vb253YWxrJyxcbiAgICAnbW9wJyxcbiAgICAnbW9yYWxlJyxcbiAgICAnbW9yYWxpdHknLFxuICAgICdtb3JhbGx5JyxcbiAgICAnbW9yYmlkaXR5JyxcbiAgICAnbW9yYmlkbHknLFxuICAgICdtb3JwaGluZScsXG4gICAgJ21vcnBoaW5nJyxcbiAgICAnbW9yc2UnLFxuICAgICdtb3J0YWxpdHknLFxuICAgICdtb3J0YWxseScsXG4gICAgJ21vcnRpY2lhbicsXG4gICAgJ21vcnRpZmllZCcsXG4gICAgJ21vcnRpZnknLFxuICAgICdtb3J0dWFyeScsXG4gICAgJ21vc2FpYycsXG4gICAgJ21vc3N5JyxcbiAgICAnbW9zdCcsXG4gICAgJ21vdGhiYWxsJyxcbiAgICAnbW90aHByb29mJyxcbiAgICAnbW90aW9uJyxcbiAgICAnbW90aXZhdGUnLFxuICAgICdtb3RpdmF0b3InLFxuICAgICdtb3RpdmUnLFxuICAgICdtb3RvY3Jvc3MnLFxuICAgICdtb3RvcicsXG4gICAgJ21vdHRvJyxcbiAgICAnbW91bnRhYmxlJyxcbiAgICAnbW91bnRhaW4nLFxuICAgICdtb3VudGVkJyxcbiAgICAnbW91bnRpbmcnLFxuICAgICdtb3VybmVyJyxcbiAgICAnbW91cm5mdWwnLFxuICAgICdtb3VzZScsXG4gICAgJ21vdXNpbmVzcycsXG4gICAgJ21vdXN0YWNoZScsXG4gICAgJ21vdXN5JyxcbiAgICAnbW91dGgnLFxuICAgICdtb3ZhYmxlJyxcbiAgICAnbW92ZScsXG4gICAgJ21vdmllJyxcbiAgICAnbW92aW5nJyxcbiAgICAnbW93ZXInLFxuICAgICdtb3dpbmcnLFxuICAgICdtdWNoJyxcbiAgICAnbXVjaycsXG4gICAgJ211ZCcsXG4gICAgJ211ZycsXG4gICAgJ211bGJlcnJ5JyxcbiAgICAnbXVsY2gnLFxuICAgICdtdWxlJyxcbiAgICAnbXVsbGVkJyxcbiAgICAnbXVsbGV0cycsXG4gICAgJ211bHRpcGxlJyxcbiAgICAnbXVsdGlwbHknLFxuICAgICdtdWx0aXRhc2snLFxuICAgICdtdWx0aXR1ZGUnLFxuICAgICdtdW1ibGUnLFxuICAgICdtdW1ibGluZycsXG4gICAgJ211bWJvJyxcbiAgICAnbXVtbWlmaWVkJyxcbiAgICAnbXVtbWlmeScsXG4gICAgJ211bW15JyxcbiAgICAnbXVtcHMnLFxuICAgICdtdW5jaGtpbicsXG4gICAgJ211bmRhbmUnLFxuICAgICdtdW5pY2lwYWwnLFxuICAgICdtdXBwZXQnLFxuICAgICdtdXJhbCcsXG4gICAgJ211cmtpbmVzcycsXG4gICAgJ211cmt5JyxcbiAgICAnbXVybXVyaW5nJyxcbiAgICAnbXVzY3VsYXInLFxuICAgICdtdXNldW0nLFxuICAgICdtdXNoaWx5JyxcbiAgICAnbXVzaGluZXNzJyxcbiAgICAnbXVzaHJvb20nLFxuICAgICdtdXNoeScsXG4gICAgJ211c2ljJyxcbiAgICAnbXVza2V0JyxcbiAgICAnbXVza2luZXNzJyxcbiAgICAnbXVza3knLFxuICAgICdtdXN0YW5nJyxcbiAgICAnbXVzdGFyZCcsXG4gICAgJ211c3RlcicsXG4gICAgJ211c3RpbmVzcycsXG4gICAgJ211c3R5JyxcbiAgICAnbXV0YWJsZScsXG4gICAgJ211dGF0ZScsXG4gICAgJ211dGF0aW9uJyxcbiAgICAnbXV0ZScsXG4gICAgJ211dGlsYXRlZCcsXG4gICAgJ211dGlsYXRvcicsXG4gICAgJ211dGlueScsXG4gICAgJ211dHQnLFxuICAgICdtdXR1YWwnLFxuICAgICdtdXp6bGUnLFxuICAgICdteXNlbGYnLFxuICAgICdteXNwYWNlJyxcbiAgICAnbXlzdGlmaWVkJyxcbiAgICAnbXlzdGlmeScsXG4gICAgJ215dGgnLFxuICAgICduYWNobycsXG4gICAgJ25hZycsXG4gICAgJ25haWwnLFxuICAgICduYW1lJyxcbiAgICAnbmFtaW5nJyxcbiAgICAnbmFubnknLFxuICAgICduYW5vbWV0ZXInLFxuICAgICduYXBlJyxcbiAgICAnbmFwa2luJyxcbiAgICAnbmFwcGVkJyxcbiAgICAnbmFwcGluZycsXG4gICAgJ25hcHB5JyxcbiAgICAnbmFycm93JyxcbiAgICAnbmFzdGlseScsXG4gICAgJ25hc3RpbmVzcycsXG4gICAgJ25hdGlvbmFsJyxcbiAgICAnbmF0aXZlJyxcbiAgICAnbmF0aXZpdHknLFxuICAgICduYXR1cmFsJyxcbiAgICAnbmF0dXJlJyxcbiAgICAnbmF0dXJpc3QnLFxuICAgICduYXV0aWNhbCcsXG4gICAgJ25hdmlnYXRlJyxcbiAgICAnbmF2aWdhdG9yJyxcbiAgICAnbmF2eScsXG4gICAgJ25lYXJieScsXG4gICAgJ25lYXJlc3QnLFxuICAgICduZWFybHknLFxuICAgICduZWFybmVzcycsXG4gICAgJ25lYXRseScsXG4gICAgJ25lYXRuZXNzJyxcbiAgICAnbmVidWxhJyxcbiAgICAnbmVidWxpemVyJyxcbiAgICAnbmVjdGFyJyxcbiAgICAnbmVnYXRlJyxcbiAgICAnbmVnYXRpb24nLFxuICAgICduZWdhdGl2ZScsXG4gICAgJ25lZ2xlY3RvcicsXG4gICAgJ25lZ2xpZ2VlJyxcbiAgICAnbmVnbGlnZW50JyxcbiAgICAnbmVnb3RpYXRlJyxcbiAgICAnbmVtZXNlcycsXG4gICAgJ25lbWVzaXMnLFxuICAgICduZW9uJyxcbiAgICAnbmVwaGV3JyxcbiAgICAnbmVyZCcsXG4gICAgJ25lcnZvdXMnLFxuICAgICduZXJ2eScsXG4gICAgJ25lc3QnLFxuICAgICduZXQnLFxuICAgICduZXVyb2xvZ3knLFxuICAgICduZXVyb24nLFxuICAgICduZXVyb3NpcycsXG4gICAgJ25ldXJvdGljJyxcbiAgICAnbmV1dGVyJyxcbiAgICAnbmV1dHJvbicsXG4gICAgJ25ldmVyJyxcbiAgICAnbmV4dCcsXG4gICAgJ25pYmJsZScsXG4gICAgJ25pY2tuYW1lJyxcbiAgICAnbmljb3RpbmUnLFxuICAgICduaWVjZScsXG4gICAgJ25pZnR5JyxcbiAgICAnbmltYmxlJyxcbiAgICAnbmltYmx5JyxcbiAgICAnbmluZXRlZW4nLFxuICAgICduaW5ldGlldGgnLFxuICAgICduaW5qYScsXG4gICAgJ25pbnRlbmRvJyxcbiAgICAnbmludGgnLFxuICAgICdudWNsZWFyJyxcbiAgICAnbnVjbGVpJyxcbiAgICAnbnVjbGV1cycsXG4gICAgJ251Z2dldCcsXG4gICAgJ251bGxpZnknLFxuICAgICdudW1iZXInLFxuICAgICdudW1iaW5nJyxcbiAgICAnbnVtYmx5JyxcbiAgICAnbnVtYm5lc3MnLFxuICAgICdudW1lcmFsJyxcbiAgICAnbnVtZXJhdGUnLFxuICAgICdudW1lcmF0b3InLFxuICAgICdudW1lcmljJyxcbiAgICAnbnVtZXJvdXMnLFxuICAgICdudXB0aWFscycsXG4gICAgJ251cnNlcnknLFxuICAgICdudXJzaW5nJyxcbiAgICAnbnVydHVyZScsXG4gICAgJ251dGNhc2UnLFxuICAgICdudXRsaWtlJyxcbiAgICAnbnV0bWVnJyxcbiAgICAnbnV0cmllbnQnLFxuICAgICdudXRzaGVsbCcsXG4gICAgJ251dHRpbmVzcycsXG4gICAgJ251dHR5JyxcbiAgICAnbnV6emxlJyxcbiAgICAnbnlsb24nLFxuICAgICdvYWYnLFxuICAgICdvYWsnLFxuICAgICdvYXNpcycsXG4gICAgJ29hdCcsXG4gICAgJ29iZWRpZW5jZScsXG4gICAgJ29iZWRpZW50JyxcbiAgICAnb2JpdHVhcnknLFxuICAgICdvYmplY3QnLFxuICAgICdvYmxpZ2F0ZScsXG4gICAgJ29ibGlnZWQnLFxuICAgICdvYmxpdmlvbicsXG4gICAgJ29ibGl2aW91cycsXG4gICAgJ29ibG9uZycsXG4gICAgJ29ibm94aW91cycsXG4gICAgJ29ib2UnLFxuICAgICdvYnNjdXJlJyxcbiAgICAnb2JzY3VyaXR5JyxcbiAgICAnb2JzZXJ2YW50JyxcbiAgICAnb2JzZXJ2ZXInLFxuICAgICdvYnNlcnZpbmcnLFxuICAgICdvYnNlc3NlZCcsXG4gICAgJ29ic2Vzc2lvbicsXG4gICAgJ29ic2Vzc2l2ZScsXG4gICAgJ29ic29sZXRlJyxcbiAgICAnb2JzdGFjbGUnLFxuICAgICdvYnN0aW5hdGUnLFxuICAgICdvYnN0cnVjdCcsXG4gICAgJ29idGFpbicsXG4gICAgJ29idHJ1c2l2ZScsXG4gICAgJ29idHVzZScsXG4gICAgJ29idmlvdXMnLFxuICAgICdvY2N1bHRpc3QnLFxuICAgICdvY2N1cGFuY3knLFxuICAgICdvY2N1cGFudCcsXG4gICAgJ29jY3VwaWVyJyxcbiAgICAnb2NjdXB5JyxcbiAgICAnb2NlYW4nLFxuICAgICdvY2Vsb3QnLFxuICAgICdvY3RhZ29uJyxcbiAgICAnb2N0YW5lJyxcbiAgICAnb2N0b2JlcicsXG4gICAgJ29jdG9wdXMnLFxuICAgICdvZ2xlJyxcbiAgICAnb2lsJyxcbiAgICAnb2luaycsXG4gICAgJ29pbnRtZW50JyxcbiAgICAnb2theScsXG4gICAgJ29sZCcsXG4gICAgJ29saXZlJyxcbiAgICAnb2x5bXBpY3MnLFxuICAgICdvbWVnYScsXG4gICAgJ29tZW4nLFxuICAgICdvbWlub3VzJyxcbiAgICAnb21pc3Npb24nLFxuICAgICdvbWl0JyxcbiAgICAnb21uaXZvcmUnLFxuICAgICdvbmJvYXJkJyxcbiAgICAnb25jb21pbmcnLFxuICAgICdvbmdvaW5nJyxcbiAgICAnb25pb24nLFxuICAgICdvbmxpbmUnLFxuICAgICdvbmxvb2tlcicsXG4gICAgJ29ubHknLFxuICAgICdvbnNjcmVlbicsXG4gICAgJ29uc2V0JyxcbiAgICAnb25zaG9yZScsXG4gICAgJ29uc2xhdWdodCcsXG4gICAgJ29uc3RhZ2UnLFxuICAgICdvbnRvJyxcbiAgICAnb253YXJkJyxcbiAgICAnb255eCcsXG4gICAgJ29vcHMnLFxuICAgICdvb3plJyxcbiAgICAnb296eScsXG4gICAgJ29wYWNpdHknLFxuICAgICdvcGFsJyxcbiAgICAnb3BlbicsXG4gICAgJ29wZXJhYmxlJyxcbiAgICAnb3BlcmF0ZScsXG4gICAgJ29wZXJhdGluZycsXG4gICAgJ29wZXJhdGlvbicsXG4gICAgJ29wZXJhdGl2ZScsXG4gICAgJ29wZXJhdG9yJyxcbiAgICAnb3BpdW0nLFxuICAgICdvcG9zc3VtJyxcbiAgICAnb3Bwb25lbnQnLFxuICAgICdvcHBvc2UnLFxuICAgICdvcHBvc2luZycsXG4gICAgJ29wcG9zaXRlJyxcbiAgICAnb3BwcmVzc2VkJyxcbiAgICAnb3BwcmVzc29yJyxcbiAgICAnb3B0JyxcbiAgICAnb3B1bGVudGx5JyxcbiAgICAnb3Ntb3NpcycsXG4gICAgJ290aGVyJyxcbiAgICAnb3R0ZXInLFxuICAgICdvdWNoJyxcbiAgICAnb3VnaHQnLFxuICAgICdvdW5jZScsXG4gICAgJ291dGFnZScsXG4gICAgJ291dGJhY2snLFxuICAgICdvdXRiaWQnLFxuICAgICdvdXRib2FyZCcsXG4gICAgJ291dGJvdW5kJyxcbiAgICAnb3V0YnJlYWsnLFxuICAgICdvdXRidXJzdCcsXG4gICAgJ291dGNhc3QnLFxuICAgICdvdXRjbGFzcycsXG4gICAgJ291dGNvbWUnLFxuICAgICdvdXRkYXRlZCcsXG4gICAgJ291dGRvb3JzJyxcbiAgICAnb3V0ZXInLFxuICAgICdvdXRmaWVsZCcsXG4gICAgJ291dGZpdCcsXG4gICAgJ291dGZsYW5rJyxcbiAgICAnb3V0Z29pbmcnLFxuICAgICdvdXRncm93JyxcbiAgICAnb3V0aG91c2UnLFxuICAgICdvdXRpbmcnLFxuICAgICdvdXRsYXN0JyxcbiAgICAnb3V0bGV0JyxcbiAgICAnb3V0bGluZScsXG4gICAgJ291dGxvb2snLFxuICAgICdvdXRseWluZycsXG4gICAgJ291dG1hdGNoJyxcbiAgICAnb3V0bW9zdCcsXG4gICAgJ291dG51bWJlcicsXG4gICAgJ291dHBsYXllZCcsXG4gICAgJ291dHBvc3QnLFxuICAgICdvdXRwb3VyJyxcbiAgICAnb3V0cHV0JyxcbiAgICAnb3V0cmFnZScsXG4gICAgJ291dHJhbmsnLFxuICAgICdvdXRyZWFjaCcsXG4gICAgJ291dHJpZ2h0JyxcbiAgICAnb3V0c2NvcmUnLFxuICAgICdvdXRzZWxsJyxcbiAgICAnb3V0c2hpbmUnLFxuICAgICdvdXRzaG9vdCcsXG4gICAgJ291dHNpZGVyJyxcbiAgICAnb3V0c2tpcnRzJyxcbiAgICAnb3V0c21hcnQnLFxuICAgICdvdXRzb3VyY2UnLFxuICAgICdvdXRzcG9rZW4nLFxuICAgICdvdXR0YWtlcycsXG4gICAgJ291dHRoaW5rJyxcbiAgICAnb3V0d2FyZCcsXG4gICAgJ291dHdlaWdoJyxcbiAgICAnb3V0d2l0JyxcbiAgICAnb3ZhbCcsXG4gICAgJ292YXJ5JyxcbiAgICAnb3ZlbicsXG4gICAgJ292ZXJhY3QnLFxuICAgICdvdmVyYWxsJyxcbiAgICAnb3ZlcmFyY2gnLFxuICAgICdvdmVyYmlkJyxcbiAgICAnb3ZlcmJpbGwnLFxuICAgICdvdmVyYml0ZScsXG4gICAgJ292ZXJibG93bicsXG4gICAgJ292ZXJib2FyZCcsXG4gICAgJ292ZXJib29rJyxcbiAgICAnb3ZlcmJ1aWx0JyxcbiAgICAnb3ZlcmNhc3QnLFxuICAgICdvdmVyY29hdCcsXG4gICAgJ292ZXJjb21lJyxcbiAgICAnb3ZlcmNvb2snLFxuICAgICdvdmVyY3Jvd2QnLFxuICAgICdvdmVyZHJhZnQnLFxuICAgICdvdmVyZHJhd24nLFxuICAgICdvdmVyZHJlc3MnLFxuICAgICdvdmVyZHJpdmUnLFxuICAgICdvdmVyZHVlJyxcbiAgICAnb3ZlcmVhZ2VyJyxcbiAgICAnb3ZlcmVhdGVyJyxcbiAgICAnb3ZlcmV4ZXJ0JyxcbiAgICAnb3ZlcmZlZCcsXG4gICAgJ292ZXJmZWVkJyxcbiAgICAnb3ZlcmZpbGwnLFxuICAgICdvdmVyZmxvdycsXG4gICAgJ292ZXJmdWxsJyxcbiAgICAnb3Zlcmdyb3duJyxcbiAgICAnb3ZlcmhhbmQnLFxuICAgICdvdmVyaGFuZycsXG4gICAgJ292ZXJoYXVsJyxcbiAgICAnb3ZlcmhlYWQnLFxuICAgICdvdmVyaGVhcicsXG4gICAgJ292ZXJoZWF0JyxcbiAgICAnb3Zlcmh1bmcnLFxuICAgICdvdmVyam95ZWQnLFxuICAgICdvdmVya2lsbCcsXG4gICAgJ292ZXJsYWJvcicsXG4gICAgJ292ZXJsYWlkJyxcbiAgICAnb3ZlcmxhcCcsXG4gICAgJ292ZXJsYXknLFxuICAgICdvdmVybG9hZCcsXG4gICAgJ292ZXJsb29rJyxcbiAgICAnb3ZlcmxvcmQnLFxuICAgICdvdmVybHlpbmcnLFxuICAgICdvdmVybmlnaHQnLFxuICAgICdvdmVycGFzcycsXG4gICAgJ292ZXJwYXknLFxuICAgICdvdmVycGxhbnQnLFxuICAgICdvdmVycGxheScsXG4gICAgJ292ZXJwb3dlcicsXG4gICAgJ292ZXJwcmljZScsXG4gICAgJ292ZXJyYXRlJyxcbiAgICAnb3ZlcnJlYWNoJyxcbiAgICAnb3ZlcnJlYWN0JyxcbiAgICAnb3ZlcnJpZGUnLFxuICAgICdvdmVycmlwZScsXG4gICAgJ292ZXJydWxlJyxcbiAgICAnb3ZlcnJ1bicsXG4gICAgJ292ZXJzaG9vdCcsXG4gICAgJ292ZXJzaG90JyxcbiAgICAnb3ZlcnNpZ2h0JyxcbiAgICAnb3ZlcnNpemVkJyxcbiAgICAnb3ZlcnNsZWVwJyxcbiAgICAnb3ZlcnNvbGQnLFxuICAgICdvdmVyc3BlbmQnLFxuICAgICdvdmVyc3RhdGUnLFxuICAgICdvdmVyc3RheScsXG4gICAgJ292ZXJzdGVwJyxcbiAgICAnb3ZlcnN0b2NrJyxcbiAgICAnb3ZlcnN0dWZmJyxcbiAgICAnb3ZlcnN3ZWV0JyxcbiAgICAnb3ZlcnRha2UnLFxuICAgICdvdmVydGhyb3cnLFxuICAgICdvdmVydGltZScsXG4gICAgJ292ZXJ0bHknLFxuICAgICdvdmVydG9uZScsXG4gICAgJ292ZXJ0dXJlJyxcbiAgICAnb3ZlcnR1cm4nLFxuICAgICdvdmVydXNlJyxcbiAgICAnb3ZlcnZhbHVlJyxcbiAgICAnb3ZlcnZpZXcnLFxuICAgICdvdmVyd3JpdGUnLFxuICAgICdvd2wnLFxuICAgICdveGZvcmQnLFxuICAgICdveGlkYW50JyxcbiAgICAnb3hpZGF0aW9uJyxcbiAgICAnb3hpZGl6ZScsXG4gICAgJ294aWRpemluZycsXG4gICAgJ294eWdlbicsXG4gICAgJ294eW1vcm9uJyxcbiAgICAnb3lzdGVyJyxcbiAgICAnb3pvbmUnLFxuICAgICdwYWNlZCcsXG4gICAgJ3BhY2VtYWtlcicsXG4gICAgJ3BhY2lmaWMnLFxuICAgICdwYWNpZmllcicsXG4gICAgJ3BhY2lmaXNtJyxcbiAgICAncGFjaWZpc3QnLFxuICAgICdwYWNpZnknLFxuICAgICdwYWRkZWQnLFxuICAgICdwYWRkaW5nJyxcbiAgICAncGFkZGxlJyxcbiAgICAncGFkZGxpbmcnLFxuICAgICdwYWRsb2NrJyxcbiAgICAncGFnYW4nLFxuICAgICdwYWdlcicsXG4gICAgJ3BhZ2luZycsXG4gICAgJ3BhamFtYXMnLFxuICAgICdwYWxhY2UnLFxuICAgICdwYWxhdGFibGUnLFxuICAgICdwYWxtJyxcbiAgICAncGFscGFibGUnLFxuICAgICdwYWxwaXRhdGUnLFxuICAgICdwYWx0cnknLFxuICAgICdwYW1wZXJlZCcsXG4gICAgJ3BhbXBlcmVyJyxcbiAgICAncGFtcGVycycsXG4gICAgJ3BhbXBobGV0JyxcbiAgICAncGFuYW1hJyxcbiAgICAncGFuY2FrZScsXG4gICAgJ3BhbmNyZWFzJyxcbiAgICAncGFuZGEnLFxuICAgICdwYW5kZW1pYycsXG4gICAgJ3BhbmcnLFxuICAgICdwYW5oYW5kbGUnLFxuICAgICdwYW5pYycsXG4gICAgJ3Bhbm5pbmcnLFxuICAgICdwYW5vcmFtYScsXG4gICAgJ3Bhbm9yYW1pYycsXG4gICAgJ3BhbnRoZXInLFxuICAgICdwYW50b21pbWUnLFxuICAgICdwYW50cnknLFxuICAgICdwYW50cycsXG4gICAgJ3BhbnR5aG9zZScsXG4gICAgJ3BhcGFyYXp6aScsXG4gICAgJ3BhcGF5YScsXG4gICAgJ3BhcGVyJyxcbiAgICAncGFwcmlrYScsXG4gICAgJ3BhcHlydXMnLFxuICAgICdwYXJhYm9sYScsXG4gICAgJ3BhcmFjaHV0ZScsXG4gICAgJ3BhcmFkZScsXG4gICAgJ3BhcmFkb3gnLFxuICAgICdwYXJhZ3JhcGgnLFxuICAgICdwYXJha2VldCcsXG4gICAgJ3BhcmFsZWdhbCcsXG4gICAgJ3BhcmFseXNlcycsXG4gICAgJ3BhcmFseXNpcycsXG4gICAgJ3BhcmFseXplJyxcbiAgICAncGFyYW1lZGljJyxcbiAgICAncGFyYW1ldGVyJyxcbiAgICAncGFyYW1vdW50JyxcbiAgICAncGFyYXNhaWwnLFxuICAgICdwYXJhc2l0ZScsXG4gICAgJ3BhcmFzaXRpYycsXG4gICAgJ3BhcmNlbCcsXG4gICAgJ3BhcmNoZWQnLFxuICAgICdwYXJjaG1lbnQnLFxuICAgICdwYXJkb24nLFxuICAgICdwYXJpc2gnLFxuICAgICdwYXJrYScsXG4gICAgJ3BhcmtpbmcnLFxuICAgICdwYXJrd2F5JyxcbiAgICAncGFybG9yJyxcbiAgICAncGFybWVzYW4nLFxuICAgICdwYXJvbGUnLFxuICAgICdwYXJyb3QnLFxuICAgICdwYXJzbGV5JyxcbiAgICAncGFyc25pcCcsXG4gICAgJ3BhcnRha2UnLFxuICAgICdwYXJ0ZWQnLFxuICAgICdwYXJ0aW5nJyxcbiAgICAncGFydGl0aW9uJyxcbiAgICAncGFydGx5JyxcbiAgICAncGFydG5lcicsXG4gICAgJ3BhcnRyaWRnZScsXG4gICAgJ3BhcnR5JyxcbiAgICAncGFzc2FibGUnLFxuICAgICdwYXNzYWJseScsXG4gICAgJ3Bhc3NhZ2UnLFxuICAgICdwYXNzY29kZScsXG4gICAgJ3Bhc3NlbmdlcicsXG4gICAgJ3Bhc3NlcmJ5JyxcbiAgICAncGFzc2luZycsXG4gICAgJ3Bhc3Npb24nLFxuICAgICdwYXNzaXZlJyxcbiAgICAncGFzc2l2aXNtJyxcbiAgICAncGFzc292ZXInLFxuICAgICdwYXNzcG9ydCcsXG4gICAgJ3Bhc3N3b3JkJyxcbiAgICAncGFzdGEnLFxuICAgICdwYXN0ZWQnLFxuICAgICdwYXN0ZWwnLFxuICAgICdwYXN0aW1lJyxcbiAgICAncGFzdG9yJyxcbiAgICAncGFzdHJhbWknLFxuICAgICdwYXN0dXJlJyxcbiAgICAncGFzdHknLFxuICAgICdwYXRjaHdvcmsnLFxuICAgICdwYXRjaHknLFxuICAgICdwYXRlcm5hbCcsXG4gICAgJ3BhdGVybml0eScsXG4gICAgJ3BhdGgnLFxuICAgICdwYXRpZW5jZScsXG4gICAgJ3BhdGllbnQnLFxuICAgICdwYXRpbycsXG4gICAgJ3BhdHJpYXJjaCcsXG4gICAgJ3BhdHJpb3QnLFxuICAgICdwYXRyb2wnLFxuICAgICdwYXRyb25hZ2UnLFxuICAgICdwYXRyb25pemUnLFxuICAgICdwYXVwZXInLFxuICAgICdwYXZlbWVudCcsXG4gICAgJ3BhdmVyJyxcbiAgICAncGF2ZXN0b25lJyxcbiAgICAncGF2aWxpb24nLFxuICAgICdwYXZpbmcnLFxuICAgICdwYXdpbmcnLFxuICAgICdwYXlhYmxlJyxcbiAgICAncGF5YmFjaycsXG4gICAgJ3BheWNoZWNrJyxcbiAgICAncGF5ZGF5JyxcbiAgICAncGF5ZWUnLFxuICAgICdwYXllcicsXG4gICAgJ3BheWluZycsXG4gICAgJ3BheW1lbnQnLFxuICAgICdwYXlwaG9uZScsXG4gICAgJ3BheXJvbGwnLFxuICAgICdwZWJibGUnLFxuICAgICdwZWJibHknLFxuICAgICdwZWNhbicsXG4gICAgJ3BlY3RpbicsXG4gICAgJ3BlY3VsaWFyJyxcbiAgICAncGVkZGxpbmcnLFxuICAgICdwZWRpYXRyaWMnLFxuICAgICdwZWRpY3VyZScsXG4gICAgJ3BlZGlncmVlJyxcbiAgICAncGVkb21ldGVyJyxcbiAgICAncGVnYm9hcmQnLFxuICAgICdwZWxpY2FuJyxcbiAgICAncGVsbGV0JyxcbiAgICAncGVsdCcsXG4gICAgJ3BlbHZpcycsXG4gICAgJ3BlbmFsaXplJyxcbiAgICAncGVuYWx0eScsXG4gICAgJ3BlbmNpbCcsXG4gICAgJ3BlbmRhbnQnLFxuICAgICdwZW5kaW5nJyxcbiAgICAncGVuaG9sZGVyJyxcbiAgICAncGVua25pZmUnLFxuICAgICdwZW5uYW50JyxcbiAgICAncGVubmlsZXNzJyxcbiAgICAncGVubnknLFxuICAgICdwZW5wYWwnLFxuICAgICdwZW5zaW9uJyxcbiAgICAncGVudGFnb24nLFxuICAgICdwZW50YWdyYW0nLFxuICAgICdwZXAnLFxuICAgICdwZXJjZWl2ZScsXG4gICAgJ3BlcmNlbnQnLFxuICAgICdwZXJjaCcsXG4gICAgJ3BlcmNvbGF0ZScsXG4gICAgJ3BlcmVubmlhbCcsXG4gICAgJ3BlcmZlY3RlZCcsXG4gICAgJ3BlcmZlY3RseScsXG4gICAgJ3BlcmZ1bWUnLFxuICAgICdwZXJpc2NvcGUnLFxuICAgICdwZXJpc2gnLFxuICAgICdwZXJqdXJlcicsXG4gICAgJ3Blcmp1cnknLFxuICAgICdwZXJraW5lc3MnLFxuICAgICdwZXJreScsXG4gICAgJ3Blcm0nLFxuICAgICdwZXJveGlkZScsXG4gICAgJ3BlcnBldHVhbCcsXG4gICAgJ3BlcnBsZXhlZCcsXG4gICAgJ3BlcnNlY3V0ZScsXG4gICAgJ3BlcnNldmVyZScsXG4gICAgJ3BlcnN1YWRlZCcsXG4gICAgJ3BlcnN1YWRlcicsXG4gICAgJ3Blc2t5JyxcbiAgICAncGVzbycsXG4gICAgJ3Blc3NpbWlzbScsXG4gICAgJ3Blc3NpbWlzdCcsXG4gICAgJ3Blc3RlcicsXG4gICAgJ3Blc3RpY2lkZScsXG4gICAgJ3BldGFsJyxcbiAgICAncGV0aXRlJyxcbiAgICAncGV0aXRpb24nLFxuICAgICdwZXRyaScsXG4gICAgJ3BldHJvbGV1bScsXG4gICAgJ3BldHRlZCcsXG4gICAgJ3BldHRpY29hdCcsXG4gICAgJ3BldHRpbmVzcycsXG4gICAgJ3BldHR5JyxcbiAgICAncGV0dW5pYScsXG4gICAgJ3BoYW50b20nLFxuICAgICdwaG9iaWEnLFxuICAgICdwaG9lbml4JyxcbiAgICAncGhvbmVib29rJyxcbiAgICAncGhvbmV5JyxcbiAgICAncGhvbmljcycsXG4gICAgJ3Bob25pbmVzcycsXG4gICAgJ3Bob255JyxcbiAgICAncGhvc3BoYXRlJyxcbiAgICAncGhvdG8nLFxuICAgICdwaHJhc2UnLFxuICAgICdwaHJhc2luZycsXG4gICAgJ3BsYWNhcmQnLFxuICAgICdwbGFjYXRlJyxcbiAgICAncGxhY2lkbHknLFxuICAgICdwbGFuaycsXG4gICAgJ3BsYW5uZXInLFxuICAgICdwbGFudCcsXG4gICAgJ3BsYXNtYScsXG4gICAgJ3BsYXN0ZXInLFxuICAgICdwbGFzdGljJyxcbiAgICAncGxhdGVkJyxcbiAgICAncGxhdGZvcm0nLFxuICAgICdwbGF0aW5nJyxcbiAgICAncGxhdGludW0nLFxuICAgICdwbGF0b25pYycsXG4gICAgJ3BsYXR0ZXInLFxuICAgICdwbGF0eXB1cycsXG4gICAgJ3BsYXVzaWJsZScsXG4gICAgJ3BsYXVzaWJseScsXG4gICAgJ3BsYXlhYmxlJyxcbiAgICAncGxheWJhY2snLFxuICAgICdwbGF5ZXInLFxuICAgICdwbGF5ZnVsJyxcbiAgICAncGxheWdyb3VwJyxcbiAgICAncGxheWhvdXNlJyxcbiAgICAncGxheWluZycsXG4gICAgJ3BsYXlsaXN0JyxcbiAgICAncGxheW1ha2VyJyxcbiAgICAncGxheW1hdGUnLFxuICAgICdwbGF5b2ZmJyxcbiAgICAncGxheXBlbicsXG4gICAgJ3BsYXlyb29tJyxcbiAgICAncGxheXNldCcsXG4gICAgJ3BsYXl0aGluZycsXG4gICAgJ3BsYXl0aW1lJyxcbiAgICAncGxhemEnLFxuICAgICdwbGVhZGluZycsXG4gICAgJ3BsZWF0JyxcbiAgICAncGxlZGdlJyxcbiAgICAncGxlbnRpZnVsJyxcbiAgICAncGxlbnR5JyxcbiAgICAncGxldGhvcmEnLFxuICAgICdwbGV4aWdsYXMnLFxuICAgICdwbGlhYmxlJyxcbiAgICAncGxvZCcsXG4gICAgJ3Bsb3AnLFxuICAgICdwbG90JyxcbiAgICAncGxvdycsXG4gICAgJ3Bsb3knLFxuICAgICdwbHVjaycsXG4gICAgJ3BsdWcnLFxuICAgICdwbHVuZGVyJyxcbiAgICAncGx1bmdpbmcnLFxuICAgICdwbHVyYWwnLFxuICAgICdwbHVzJyxcbiAgICAncGx1dG9uaXVtJyxcbiAgICAncGx5d29vZCcsXG4gICAgJ3BvYWNoJyxcbiAgICAncG9kJyxcbiAgICAncG9lbScsXG4gICAgJ3BvZXQnLFxuICAgICdwb2dvJyxcbiAgICAncG9pbnRlZCcsXG4gICAgJ3BvaW50ZXInLFxuICAgICdwb2ludGluZycsXG4gICAgJ3BvaW50bGVzcycsXG4gICAgJ3BvaW50eScsXG4gICAgJ3BvaXNlJyxcbiAgICAncG9pc29uJyxcbiAgICAncG9rZXInLFxuICAgICdwb2tpbmcnLFxuICAgICdwb2xhcicsXG4gICAgJ3BvbGljZScsXG4gICAgJ3BvbGljeScsXG4gICAgJ3BvbGlvJyxcbiAgICAncG9saXNoJyxcbiAgICAncG9saXRlbHknLFxuICAgICdwb2xrYScsXG4gICAgJ3BvbG8nLFxuICAgICdwb2x5ZXN0ZXInLFxuICAgICdwb2x5Z29uJyxcbiAgICAncG9seWdyYXBoJyxcbiAgICAncG9seW1lcicsXG4gICAgJ3BvbmNobycsXG4gICAgJ3BvbmQnLFxuICAgICdwb255JyxcbiAgICAncG9wY29ybicsXG4gICAgJ3BvcGUnLFxuICAgICdwb3BsYXInLFxuICAgICdwb3BwZXInLFxuICAgICdwb3BweScsXG4gICAgJ3BvcHNpY2xlJyxcbiAgICAncG9wdWxhY2UnLFxuICAgICdwb3B1bGFyJyxcbiAgICAncG9wdWxhdGUnLFxuICAgICdwb3JjdXBpbmUnLFxuICAgICdwb3JrJyxcbiAgICAncG9yb3VzJyxcbiAgICAncG9ycmlkZ2UnLFxuICAgICdwb3J0YWJsZScsXG4gICAgJ3BvcnRhbCcsXG4gICAgJ3BvcnRmb2xpbycsXG4gICAgJ3BvcnRob2xlJyxcbiAgICAncG9ydGlvbicsXG4gICAgJ3BvcnRseScsXG4gICAgJ3BvcnRzaWRlJyxcbiAgICAncG9zZXInLFxuICAgICdwb3NoJyxcbiAgICAncG9zaW5nJyxcbiAgICAncG9zc2libGUnLFxuICAgICdwb3NzaWJseScsXG4gICAgJ3Bvc3N1bScsXG4gICAgJ3Bvc3RhZ2UnLFxuICAgICdwb3N0YWwnLFxuICAgICdwb3N0Ym94JyxcbiAgICAncG9zdGNhcmQnLFxuICAgICdwb3N0ZWQnLFxuICAgICdwb3N0ZXInLFxuICAgICdwb3N0aW5nJyxcbiAgICAncG9zdG5hc2FsJyxcbiAgICAncG9zdHVyZScsXG4gICAgJ3Bvc3R3YXInLFxuICAgICdwb3VjaCcsXG4gICAgJ3BvdW5jZScsXG4gICAgJ3BvdW5jaW5nJyxcbiAgICAncG91bmQnLFxuICAgICdwb3VyaW5nJyxcbiAgICAncG91dCcsXG4gICAgJ3Bvd2RlcmVkJyxcbiAgICAncG93ZGVyaW5nJyxcbiAgICAncG93ZGVyeScsXG4gICAgJ3Bvd2VyJyxcbiAgICAncG93d293JyxcbiAgICAncG94JyxcbiAgICAncHJhaXNpbmcnLFxuICAgICdwcmFuY2UnLFxuICAgICdwcmFuY2luZycsXG4gICAgJ3ByYW5rZXInLFxuICAgICdwcmFua2lzaCcsXG4gICAgJ3ByYW5rc3RlcicsXG4gICAgJ3ByYXllcicsXG4gICAgJ3ByYXlpbmcnLFxuICAgICdwcmVhY2hlcicsXG4gICAgJ3ByZWFjaGluZycsXG4gICAgJ3ByZWFjaHknLFxuICAgICdwcmVhbWJsZScsXG4gICAgJ3ByZWNpbmN0JyxcbiAgICAncHJlY2lzZScsXG4gICAgJ3ByZWNpc2lvbicsXG4gICAgJ3ByZWNvb2snLFxuICAgICdwcmVjdXQnLFxuICAgICdwcmVkYXRvcicsXG4gICAgJ3ByZWRlZmluZScsXG4gICAgJ3ByZWRpY3QnLFxuICAgICdwcmVmYWNlJyxcbiAgICAncHJlZml4JyxcbiAgICAncHJlZmxpZ2h0JyxcbiAgICAncHJlZm9ybWVkJyxcbiAgICAncHJlZ2FtZScsXG4gICAgJ3ByZWduYW5jeScsXG4gICAgJ3ByZWduYW50JyxcbiAgICAncHJlaGVhdGVkJyxcbiAgICAncHJlbGF1bmNoJyxcbiAgICAncHJlbGF3JyxcbiAgICAncHJlbHVkZScsXG4gICAgJ3ByZW1pZXJlJyxcbiAgICAncHJlbWlzZXMnLFxuICAgICdwcmVtaXVtJyxcbiAgICAncHJlbmF0YWwnLFxuICAgICdwcmVvY2N1cHknLFxuICAgICdwcmVvcmRlcicsXG4gICAgJ3ByZXBhaWQnLFxuICAgICdwcmVwYXknLFxuICAgICdwcmVwbGFuJyxcbiAgICAncHJlcHB5JyxcbiAgICAncHJlc2Nob29sJyxcbiAgICAncHJlc2NyaWJlJyxcbiAgICAncHJlc2Vhc29uJyxcbiAgICAncHJlc2V0JyxcbiAgICAncHJlc2hvdycsXG4gICAgJ3ByZXNpZGVudCcsXG4gICAgJ3ByZXNvYWsnLFxuICAgICdwcmVzcycsXG4gICAgJ3ByZXN1bWUnLFxuICAgICdwcmVzdW1pbmcnLFxuICAgICdwcmV0ZWVuJyxcbiAgICAncHJldGVuZGVkJyxcbiAgICAncHJldGVuZGVyJyxcbiAgICAncHJldGVuc2UnLFxuICAgICdwcmV0ZXh0JyxcbiAgICAncHJldHR5JyxcbiAgICAncHJldHplbCcsXG4gICAgJ3ByZXZhaWwnLFxuICAgICdwcmV2YWxlbnQnLFxuICAgICdwcmV2ZW50JyxcbiAgICAncHJldmlldycsXG4gICAgJ3ByZXZpb3VzJyxcbiAgICAncHJld2FyJyxcbiAgICAncHJld2FzaGVkJyxcbiAgICAncHJpZGVmdWwnLFxuICAgICdwcmllZCcsXG4gICAgJ3ByaW1hbCcsXG4gICAgJ3ByaW1hcmlseScsXG4gICAgJ3ByaW1hcnknLFxuICAgICdwcmltYXRlJyxcbiAgICAncHJpbWVyJyxcbiAgICAncHJpbXAnLFxuICAgICdwcmluY2VzcycsXG4gICAgJ3ByaW50JyxcbiAgICAncHJpb3InLFxuICAgICdwcmlzbScsXG4gICAgJ3ByaXNvbicsXG4gICAgJ3ByaXNzeScsXG4gICAgJ3ByaXN0aW5lJyxcbiAgICAncHJpdmFjeScsXG4gICAgJ3ByaXZhdGUnLFxuICAgICdwcml2YXRpemUnLFxuICAgICdwcml6ZScsXG4gICAgJ3Byb2FjdGl2ZScsXG4gICAgJ3Byb2JhYmxlJyxcbiAgICAncHJvYmFibHknLFxuICAgICdwcm9iYXRpb24nLFxuICAgICdwcm9iZScsXG4gICAgJ3Byb2JpbmcnLFxuICAgICdwcm9iaW90aWMnLFxuICAgICdwcm9ibGVtJyxcbiAgICAncHJvY2VkdXJlJyxcbiAgICAncHJvY2VzcycsXG4gICAgJ3Byb2NsYWltJyxcbiAgICAncHJvY3JlYXRlJyxcbiAgICAncHJvY3VyZXInLFxuICAgICdwcm9kaWdhbCcsXG4gICAgJ3Byb2RpZ3knLFxuICAgICdwcm9kdWNlJyxcbiAgICAncHJvZHVjdCcsXG4gICAgJ3Byb2ZhbmUnLFxuICAgICdwcm9mYW5pdHknLFxuICAgICdwcm9mZXNzZWQnLFxuICAgICdwcm9mZXNzb3InLFxuICAgICdwcm9maWxlJyxcbiAgICAncHJvZm91bmQnLFxuICAgICdwcm9mdXNlbHknLFxuICAgICdwcm9nZW55JyxcbiAgICAncHJvZ25vc2lzJyxcbiAgICAncHJvZ3JhbScsXG4gICAgJ3Byb2dyZXNzJyxcbiAgICAncHJvamVjdG9yJyxcbiAgICAncHJvbG9ndWUnLFxuICAgICdwcm9sb25nZWQnLFxuICAgICdwcm9tZW5hZGUnLFxuICAgICdwcm9taW5lbnQnLFxuICAgICdwcm9tb3RlcicsXG4gICAgJ3Byb21vdGlvbicsXG4gICAgJ3Byb21wdGVyJyxcbiAgICAncHJvbXB0bHknLFxuICAgICdwcm9uZScsXG4gICAgJ3Byb25nJyxcbiAgICAncHJvbm91bmNlJyxcbiAgICAncHJvbnRvJyxcbiAgICAncHJvb2ZpbmcnLFxuICAgICdwcm9vZnJlYWQnLFxuICAgICdwcm9vZnMnLFxuICAgICdwcm9wZWxsZXInLFxuICAgICdwcm9wZXJseScsXG4gICAgJ3Byb3BlcnR5JyxcbiAgICAncHJvcG9uZW50JyxcbiAgICAncHJvcG9zYWwnLFxuICAgICdwcm9wb3NlJyxcbiAgICAncHJvcHMnLFxuICAgICdwcm9yYXRlJyxcbiAgICAncHJvdGVjdG9yJyxcbiAgICAncHJvdGVnZWUnLFxuICAgICdwcm90b24nLFxuICAgICdwcm90b3R5cGUnLFxuICAgICdwcm90b3pvYW4nLFxuICAgICdwcm90cmFjdCcsXG4gICAgJ3Byb3RydWRlJyxcbiAgICAncHJvdWQnLFxuICAgICdwcm92YWJsZScsXG4gICAgJ3Byb3ZlZCcsXG4gICAgJ3Byb3ZlbicsXG4gICAgJ3Byb3ZpZGVkJyxcbiAgICAncHJvdmlkZXInLFxuICAgICdwcm92aWRpbmcnLFxuICAgICdwcm92aW5jZScsXG4gICAgJ3Byb3ZpbmcnLFxuICAgICdwcm92b2tlJyxcbiAgICAncHJvdm9raW5nJyxcbiAgICAncHJvdm9sb25lJyxcbiAgICAncHJvd2VzcycsXG4gICAgJ3Byb3dsZXInLFxuICAgICdwcm93bGluZycsXG4gICAgJ3Byb3hpbWl0eScsXG4gICAgJ3Byb3h5JyxcbiAgICAncHJvemFjJyxcbiAgICAncHJ1ZGUnLFxuICAgICdwcnVkaXNobHknLFxuICAgICdwcnVuZScsXG4gICAgJ3BydW5pbmcnLFxuICAgICdwcnknLFxuICAgICdwc3ljaGljJyxcbiAgICAncHVibGljJyxcbiAgICAncHVibGlzaGVyJyxcbiAgICAncHVja2VyJyxcbiAgICAncHVlYmxvJyxcbiAgICAncHVnJyxcbiAgICAncHVsbCcsXG4gICAgJ3B1bG1vbmFyeScsXG4gICAgJ3B1bHAnLFxuICAgICdwdWxzYXRlJyxcbiAgICAncHVsc2UnLFxuICAgICdwdWx2ZXJpemUnLFxuICAgICdwdW1hJyxcbiAgICAncHVtaWNlJyxcbiAgICAncHVtbWVsJyxcbiAgICAncHVuY2gnLFxuICAgICdwdW5jdHVhbCcsXG4gICAgJ3B1bmN0dWF0ZScsXG4gICAgJ3B1bmN0dXJlZCcsXG4gICAgJ3B1bmdlbnQnLFxuICAgICdwdW5pc2hlcicsXG4gICAgJ3B1bmsnLFxuICAgICdwdXBpbCcsXG4gICAgJ3B1cHBldCcsXG4gICAgJ3B1cHB5JyxcbiAgICAncHVyY2hhc2UnLFxuICAgICdwdXJlYmxvb2QnLFxuICAgICdwdXJlYnJlZCcsXG4gICAgJ3B1cmVseScsXG4gICAgJ3B1cmVuZXNzJyxcbiAgICAncHVyZ2F0b3J5JyxcbiAgICAncHVyZ2UnLFxuICAgICdwdXJnaW5nJyxcbiAgICAncHVyaWZpZXInLFxuICAgICdwdXJpZnknLFxuICAgICdwdXJpc3QnLFxuICAgICdwdXJpdGFuJyxcbiAgICAncHVyaXR5JyxcbiAgICAncHVycGxlJyxcbiAgICAncHVycGxpc2gnLFxuICAgICdwdXJwb3NlbHknLFxuICAgICdwdXJyJyxcbiAgICAncHVyc2UnLFxuICAgICdwdXJzdWFibGUnLFxuICAgICdwdXJzdWFudCcsXG4gICAgJ3B1cnN1aXQnLFxuICAgICdwdXJ2ZXlvcicsXG4gICAgJ3B1c2hjYXJ0JyxcbiAgICAncHVzaGNoYWlyJyxcbiAgICAncHVzaGVyJyxcbiAgICAncHVzaGluZXNzJyxcbiAgICAncHVzaGluZycsXG4gICAgJ3B1c2hvdmVyJyxcbiAgICAncHVzaHBpbicsXG4gICAgJ3B1c2h1cCcsXG4gICAgJ3B1c2h5JyxcbiAgICAncHV0ZG93bicsXG4gICAgJ3B1dHQnLFxuICAgICdwdXp6bGUnLFxuICAgICdwdXp6bGluZycsXG4gICAgJ3B5cmFtaWQnLFxuICAgICdweXJvbWFuaWEnLFxuICAgICdweXRob24nLFxuICAgICdxdWFjaycsXG4gICAgJ3F1YWRyYW50JyxcbiAgICAncXVhaWwnLFxuICAgICdxdWFpbnRseScsXG4gICAgJ3F1YWtlJyxcbiAgICAncXVha2luZycsXG4gICAgJ3F1YWxpZmllZCcsXG4gICAgJ3F1YWxpZmllcicsXG4gICAgJ3F1YWxpZnknLFxuICAgICdxdWFsaXR5JyxcbiAgICAncXVhbG0nLFxuICAgICdxdWFudHVtJyxcbiAgICAncXVhcnJlbCcsXG4gICAgJ3F1YXJyeScsXG4gICAgJ3F1YXJ0ZXJlZCcsXG4gICAgJ3F1YXJ0ZXJseScsXG4gICAgJ3F1YXJ0ZXJzJyxcbiAgICAncXVhcnRldCcsXG4gICAgJ3F1ZW5jaCcsXG4gICAgJ3F1ZXJ5JyxcbiAgICAncXVpY2tlbicsXG4gICAgJ3F1aWNrbHknLFxuICAgICdxdWlja25lc3MnLFxuICAgICdxdWlja3NhbmQnLFxuICAgICdxdWlja3N0ZXAnLFxuICAgICdxdWlldCcsXG4gICAgJ3F1aWxsJyxcbiAgICAncXVpbHQnLFxuICAgICdxdWludGV0JyxcbiAgICAncXVpbnR1cGxlJyxcbiAgICAncXVpcmsnLFxuICAgICdxdWl0JyxcbiAgICAncXVpdmVyJyxcbiAgICAncXVpenppY2FsJyxcbiAgICAncXVvdGFibGUnLFxuICAgICdxdW90YXRpb24nLFxuICAgICdxdW90ZScsXG4gICAgJ3JhYmlkJyxcbiAgICAncmFjZScsXG4gICAgJ3JhY2luZycsXG4gICAgJ3JhY2lzbScsXG4gICAgJ3JhY2snLFxuICAgICdyYWNvb24nLFxuICAgICdyYWRhcicsXG4gICAgJ3JhZGlhbCcsXG4gICAgJ3JhZGlhbmNlJyxcbiAgICAncmFkaWFudGx5JyxcbiAgICAncmFkaWF0ZWQnLFxuICAgICdyYWRpYXRpb24nLFxuICAgICdyYWRpYXRvcicsXG4gICAgJ3JhZGlvJyxcbiAgICAncmFkaXNoJyxcbiAgICAncmFmZmxlJyxcbiAgICAncmFmdCcsXG4gICAgJ3JhZ2UnLFxuICAgICdyYWdnZWQnLFxuICAgICdyYWdpbmcnLFxuICAgICdyYWd3ZWVkJyxcbiAgICAncmFpZGVyJyxcbiAgICAncmFpbGNhcicsXG4gICAgJ3JhaWxpbmcnLFxuICAgICdyYWlscm9hZCcsXG4gICAgJ3JhaWx3YXknLFxuICAgICdyYWlzaW4nLFxuICAgICdyYWtlJyxcbiAgICAncmFraW5nJyxcbiAgICAncmFsbHknLFxuICAgICdyYW1ibGUnLFxuICAgICdyYW1ibGluZycsXG4gICAgJ3JhbXAnLFxuICAgICdyYW1yb2QnLFxuICAgICdyYW5jaCcsXG4gICAgJ3JhbmNpZGl0eScsXG4gICAgJ3JhbmRvbScsXG4gICAgJ3JhbmdlZCcsXG4gICAgJ3JhbmdlcicsXG4gICAgJ3JhbmdpbmcnLFxuICAgICdyYW5rZWQnLFxuICAgICdyYW5raW5nJyxcbiAgICAncmFuc2FjaycsXG4gICAgJ3JhbnRpbmcnLFxuICAgICdyYW50cycsXG4gICAgJ3JhcmUnLFxuICAgICdyYXJpdHknLFxuICAgICdyYXNjYWwnLFxuICAgICdyYXNoJyxcbiAgICAncmFzcGluZycsXG4gICAgJ3JhdmFnZScsXG4gICAgJ3JhdmVuJyxcbiAgICAncmF2aW5lJyxcbiAgICAncmF2aW5nJyxcbiAgICAncmF2aW9saScsXG4gICAgJ3JhdmlzaGluZycsXG4gICAgJ3JlYWJzb3JiJyxcbiAgICAncmVhY2gnLFxuICAgICdyZWFjcXVpcmUnLFxuICAgICdyZWFjdGlvbicsXG4gICAgJ3JlYWN0aXZlJyxcbiAgICAncmVhY3RvcicsXG4gICAgJ3JlYWZmaXJtJyxcbiAgICAncmVhbScsXG4gICAgJ3JlYW5hbHl6ZScsXG4gICAgJ3JlYXBwZWFyJyxcbiAgICAncmVhcHBseScsXG4gICAgJ3JlYXBwb2ludCcsXG4gICAgJ3JlYXBwcm92ZScsXG4gICAgJ3JlYXJyYW5nZScsXG4gICAgJ3JlYXJ2aWV3JyxcbiAgICAncmVhc29uJyxcbiAgICAncmVhc3NpZ24nLFxuICAgICdyZWFzc3VyZScsXG4gICAgJ3JlYXR0YWNoJyxcbiAgICAncmVhd2FrZScsXG4gICAgJ3JlYmFsYW5jZScsXG4gICAgJ3JlYmF0ZScsXG4gICAgJ3JlYmVsJyxcbiAgICAncmViaXJ0aCcsXG4gICAgJ3JlYm9vdCcsXG4gICAgJ3JlYm9ybicsXG4gICAgJ3JlYm91bmQnLFxuICAgICdyZWJ1ZmYnLFxuICAgICdyZWJ1aWxkJyxcbiAgICAncmVidWlsdCcsXG4gICAgJ3JlYnVyaWFsJyxcbiAgICAncmVidXR0YWwnLFxuICAgICdyZWNhbGwnLFxuICAgICdyZWNhbnQnLFxuICAgICdyZWNhcHR1cmUnLFxuICAgICdyZWNhc3QnLFxuICAgICdyZWNlZGUnLFxuICAgICdyZWNlbnQnLFxuICAgICdyZWNlc3MnLFxuICAgICdyZWNoYXJnZXInLFxuICAgICdyZWNpcGllbnQnLFxuICAgICdyZWNpdGFsJyxcbiAgICAncmVjaXRlJyxcbiAgICAncmVja2xlc3MnLFxuICAgICdyZWNsYWltJyxcbiAgICAncmVjbGluZXInLFxuICAgICdyZWNsaW5pbmcnLFxuICAgICdyZWNsdXNlJyxcbiAgICAncmVjbHVzaXZlJyxcbiAgICAncmVjb2duaXplJyxcbiAgICAncmVjb2lsJyxcbiAgICAncmVjb2xsZWN0JyxcbiAgICAncmVjb2xvcicsXG4gICAgJ3JlY29uY2lsZScsXG4gICAgJ3JlY29uZmlybScsXG4gICAgJ3JlY29udmVuZScsXG4gICAgJ3JlY29weScsXG4gICAgJ3JlY29yZCcsXG4gICAgJ3JlY291bnQnLFxuICAgICdyZWNvdXAnLFxuICAgICdyZWNvdmVyeScsXG4gICAgJ3JlY3JlYXRlJyxcbiAgICAncmVjdGFsJyxcbiAgICAncmVjdGFuZ2xlJyxcbiAgICAncmVjdGlmaWVkJyxcbiAgICAncmVjdGlmeScsXG4gICAgJ3JlY3ljbGVkJyxcbiAgICAncmVjeWNsZXInLFxuICAgICdyZWN5Y2xpbmcnLFxuICAgICdyZWVtZXJnZScsXG4gICAgJ3JlZW5hY3QnLFxuICAgICdyZWVudGVyJyxcbiAgICAncmVlbnRyeScsXG4gICAgJ3JlZXhhbWluZScsXG4gICAgJ3JlZmVyYWJsZScsXG4gICAgJ3JlZmVyZWUnLFxuICAgICdyZWZlcmVuY2UnLFxuICAgICdyZWZpbGwnLFxuICAgICdyZWZpbmFuY2UnLFxuICAgICdyZWZpbmVkJyxcbiAgICAncmVmaW5lcnknLFxuICAgICdyZWZpbmluZycsXG4gICAgJ3JlZmluaXNoJyxcbiAgICAncmVmbGVjdGVkJyxcbiAgICAncmVmbGVjdG9yJyxcbiAgICAncmVmbGV4JyxcbiAgICAncmVmbHV4JyxcbiAgICAncmVmb2N1cycsXG4gICAgJ3JlZm9sZCcsXG4gICAgJ3JlZm9yZXN0JyxcbiAgICAncmVmb3JtYXQnLFxuICAgICdyZWZvcm1lZCcsXG4gICAgJ3JlZm9ybWVyJyxcbiAgICAncmVmb3JtaXN0JyxcbiAgICAncmVmcmFjdCcsXG4gICAgJ3JlZnJhaW4nLFxuICAgICdyZWZyZWV6ZScsXG4gICAgJ3JlZnJlc2gnLFxuICAgICdyZWZyaWVkJyxcbiAgICAncmVmdWVsaW5nJyxcbiAgICAncmVmdW5kJyxcbiAgICAncmVmdXJiaXNoJyxcbiAgICAncmVmdXJuaXNoJyxcbiAgICAncmVmdXNhbCcsXG4gICAgJ3JlZnVzZScsXG4gICAgJ3JlZnVzaW5nJyxcbiAgICAncmVmdXRhYmxlJyxcbiAgICAncmVmdXRlJyxcbiAgICAncmVnYWluJyxcbiAgICAncmVnYWxpYScsXG4gICAgJ3JlZ2FsbHknLFxuICAgICdyZWdnYWUnLFxuICAgICdyZWdpbWUnLFxuICAgICdyZWdpb24nLFxuICAgICdyZWdpc3RlcicsXG4gICAgJ3JlZ2lzdHJhcicsXG4gICAgJ3JlZ2lzdHJ5JyxcbiAgICAncmVncmVzcycsXG4gICAgJ3JlZ3JldGZ1bCcsXG4gICAgJ3JlZ3JvdXAnLFxuICAgICdyZWd1bGFyJyxcbiAgICAncmVndWxhdGUnLFxuICAgICdyZWd1bGF0b3InLFxuICAgICdyZWhhYicsXG4gICAgJ3JlaGVhdCcsXG4gICAgJ3JlaGlyZScsXG4gICAgJ3JlaHlkcmF0ZScsXG4gICAgJ3JlaW1idXJzZScsXG4gICAgJ3JlaXNzdWUnLFxuICAgICdyZWl0ZXJhdGUnLFxuICAgICdyZWpvaWNlJyxcbiAgICAncmVqb2ljaW5nJyxcbiAgICAncmVqb2luJyxcbiAgICAncmVraW5kbGUnLFxuICAgICdyZWxhcHNlJyxcbiAgICAncmVsYXBzaW5nJyxcbiAgICAncmVsYXRhYmxlJyxcbiAgICAncmVsYXRlZCcsXG4gICAgJ3JlbGF0aW9uJyxcbiAgICAncmVsYXRpdmUnLFxuICAgICdyZWxheCcsXG4gICAgJ3JlbGF5JyxcbiAgICAncmVsZWFybicsXG4gICAgJ3JlbGVhc2UnLFxuICAgICdyZWxlbnRpbmcnLFxuICAgICdyZWxpYWJsZScsXG4gICAgJ3JlbGlhYmx5JyxcbiAgICAncmVsaWFuY2UnLFxuICAgICdyZWxpYW50JyxcbiAgICAncmVsaWMnLFxuICAgICdyZWxpZXZlJyxcbiAgICAncmVsaWV2aW5nJyxcbiAgICAncmVsaWdodCcsXG4gICAgJ3JlbGlzaCcsXG4gICAgJ3JlbGl2ZScsXG4gICAgJ3JlbG9hZCcsXG4gICAgJ3JlbG9jYXRlJyxcbiAgICAncmVsb2NrJyxcbiAgICAncmVsdWN0YW50JyxcbiAgICAncmVseScsXG4gICAgJ3JlbWFrZScsXG4gICAgJ3JlbWFyaycsXG4gICAgJ3JlbWFycnknLFxuICAgICdyZW1hdGNoJyxcbiAgICAncmVtZWRpYWwnLFxuICAgICdyZW1lZHknLFxuICAgICdyZW1lbWJlcicsXG4gICAgJ3JlbWluZGVyJyxcbiAgICAncmVtaW5kZnVsJyxcbiAgICAncmVtaXNzaW9uJyxcbiAgICAncmVtaXgnLFxuICAgICdyZW1uYW50JyxcbiAgICAncmVtb2RlbGVyJyxcbiAgICAncmVtb2xkJyxcbiAgICAncmVtb3JzZScsXG4gICAgJ3JlbW90ZScsXG4gICAgJ3JlbW92YWJsZScsXG4gICAgJ3JlbW92YWwnLFxuICAgICdyZW1vdmVkJyxcbiAgICAncmVtb3ZlcicsXG4gICAgJ3JlbW92aW5nJyxcbiAgICAncmVuYW1lJyxcbiAgICAncmVuZGVyZXInLFxuICAgICdyZW5kZXJpbmcnLFxuICAgICdyZW5kaXRpb24nLFxuICAgICdyZW5lZ2FkZScsXG4gICAgJ3JlbmV3YWJsZScsXG4gICAgJ3JlbmV3YWJseScsXG4gICAgJ3JlbmV3YWwnLFxuICAgICdyZW5ld2VkJyxcbiAgICAncmVub3VuY2UnLFxuICAgICdyZW5vdmF0ZScsXG4gICAgJ3Jlbm92YXRvcicsXG4gICAgJ3JlbnRhYmxlJyxcbiAgICAncmVudGFsJyxcbiAgICAncmVudGVkJyxcbiAgICAncmVudGVyJyxcbiAgICAncmVvY2N1cHknLFxuICAgICdyZW9jY3VyJyxcbiAgICAncmVvcGVuJyxcbiAgICAncmVvcmRlcicsXG4gICAgJ3JlcGFja2FnZScsXG4gICAgJ3JlcGFja2luZycsXG4gICAgJ3JlcGFpbnQnLFxuICAgICdyZXBhaXInLFxuICAgICdyZXBhdmUnLFxuICAgICdyZXBheWluZycsXG4gICAgJ3JlcGF5bWVudCcsXG4gICAgJ3JlcGVhbCcsXG4gICAgJ3JlcGVhdGVkJyxcbiAgICAncmVwZWF0ZXInLFxuICAgICdyZXBlbnQnLFxuICAgICdyZXBocmFzZScsXG4gICAgJ3JlcGxhY2UnLFxuICAgICdyZXBsYXknLFxuICAgICdyZXBsaWNhJyxcbiAgICAncmVwbHknLFxuICAgICdyZXBvcnRlcicsXG4gICAgJ3JlcG9zZScsXG4gICAgJ3JlcG9zc2VzcycsXG4gICAgJ3JlcG9zdCcsXG4gICAgJ3JlcHJlc3NlZCcsXG4gICAgJ3JlcHJpbWFuZCcsXG4gICAgJ3JlcHJpbnQnLFxuICAgICdyZXByaXNlJyxcbiAgICAncmVwcm9hY2gnLFxuICAgICdyZXByb2Nlc3MnLFxuICAgICdyZXByb2R1Y2UnLFxuICAgICdyZXByb2dyYW0nLFxuICAgICdyZXBzJyxcbiAgICAncmVwdGlsZScsXG4gICAgJ3JlcHRpbGlhbicsXG4gICAgJ3JlcHVnbmFudCcsXG4gICAgJ3JlcHVsc2lvbicsXG4gICAgJ3JlcHVsc2l2ZScsXG4gICAgJ3JlcHVycG9zZScsXG4gICAgJ3JlcHV0YWJsZScsXG4gICAgJ3JlcHV0YWJseScsXG4gICAgJ3JlcXVlc3QnLFxuICAgICdyZXF1aXJlJyxcbiAgICAncmVxdWlzaXRlJyxcbiAgICAncmVyb3V0ZScsXG4gICAgJ3JlcnVuJyxcbiAgICAncmVzYWxlJyxcbiAgICAncmVzYW1wbGUnLFxuICAgICdyZXNjdWVyJyxcbiAgICAncmVzZWFsJyxcbiAgICAncmVzZWFyY2gnLFxuICAgICdyZXNlbGVjdCcsXG4gICAgJ3Jlc2VsbGVyJyxcbiAgICAncmVzZW1ibGUnLFxuICAgICdyZXNlbmQnLFxuICAgICdyZXNlbnQnLFxuICAgICdyZXNldCcsXG4gICAgJ3Jlc2hhcGUnLFxuICAgICdyZXNob290JyxcbiAgICAncmVzaHVmZmxlJyxcbiAgICAncmVzaWRlbmNlJyxcbiAgICAncmVzaWRlbmN5JyxcbiAgICAncmVzaWRlbnQnLFxuICAgICdyZXNpZHVhbCcsXG4gICAgJ3Jlc2lkdWUnLFxuICAgICdyZXNpZ25lZCcsXG4gICAgJ3Jlc2lsaWVudCcsXG4gICAgJ3Jlc2lzdGFudCcsXG4gICAgJ3Jlc2lzdGluZycsXG4gICAgJ3Jlc2l6ZScsXG4gICAgJ3Jlc29sdXRlJyxcbiAgICAncmVzb2x2ZWQnLFxuICAgICdyZXNvbmFudCcsXG4gICAgJ3Jlc29uYXRlJyxcbiAgICAncmVzb3J0JyxcbiAgICAncmVzb3VyY2UnLFxuICAgICdyZXNwZWN0JyxcbiAgICAncmVzdWJtaXQnLFxuICAgICdyZXN1bHQnLFxuICAgICdyZXN1bWUnLFxuICAgICdyZXN1cHBseScsXG4gICAgJ3Jlc3VyZmFjZScsXG4gICAgJ3Jlc3VycmVjdCcsXG4gICAgJ3JldGFpbCcsXG4gICAgJ3JldGFpbmVyJyxcbiAgICAncmV0YWluaW5nJyxcbiAgICAncmV0YWtlJyxcbiAgICAncmV0YWxpYXRlJyxcbiAgICAncmV0ZW50aW9uJyxcbiAgICAncmV0aGluaycsXG4gICAgJ3JldGluYWwnLFxuICAgICdyZXRpcmVkJyxcbiAgICAncmV0aXJlZScsXG4gICAgJ3JldGlyaW5nJyxcbiAgICAncmV0b2xkJyxcbiAgICAncmV0b29sJyxcbiAgICAncmV0b3J0ZWQnLFxuICAgICdyZXRvdWNoJyxcbiAgICAncmV0cmFjZScsXG4gICAgJ3JldHJhY3QnLFxuICAgICdyZXRyYWluJyxcbiAgICAncmV0cmVhZCcsXG4gICAgJ3JldHJlYXQnLFxuICAgICdyZXRyaWFsJyxcbiAgICAncmV0cmlldmFsJyxcbiAgICAncmV0cmlldmVyJyxcbiAgICAncmV0cnknLFxuICAgICdyZXR1cm4nLFxuICAgICdyZXR5aW5nJyxcbiAgICAncmV0eXBlJyxcbiAgICAncmV1bmlvbicsXG4gICAgJ3JldW5pdGUnLFxuICAgICdyZXVzYWJsZScsXG4gICAgJ3JldXNlJyxcbiAgICAncmV2ZWFsJyxcbiAgICAncmV2ZWxlcicsXG4gICAgJ3JldmVuZ2UnLFxuICAgICdyZXZlbnVlJyxcbiAgICAncmV2ZXJiJyxcbiAgICAncmV2ZXJlZCcsXG4gICAgJ3JldmVyZW5jZScsXG4gICAgJ3JldmVyZW5kJyxcbiAgICAncmV2ZXJzYWwnLFxuICAgICdyZXZlcnNlJyxcbiAgICAncmV2ZXJzaW5nJyxcbiAgICAncmV2ZXJzaW9uJyxcbiAgICAncmV2ZXJ0JyxcbiAgICAncmV2aXNhYmxlJyxcbiAgICAncmV2aXNlJyxcbiAgICAncmV2aXNpb24nLFxuICAgICdyZXZpc2l0JyxcbiAgICAncmV2aXZhYmxlJyxcbiAgICAncmV2aXZhbCcsXG4gICAgJ3Jldml2ZXInLFxuICAgICdyZXZpdmluZycsXG4gICAgJ3Jldm9jYWJsZScsXG4gICAgJ3Jldm9rZScsXG4gICAgJ3Jldm9sdCcsXG4gICAgJ3Jldm9sdmVyJyxcbiAgICAncmV2b2x2aW5nJyxcbiAgICAncmV3YXJkJyxcbiAgICAncmV3YXNoJyxcbiAgICAncmV3aW5kJyxcbiAgICAncmV3aXJlJyxcbiAgICAncmV3b3JkJyxcbiAgICAncmV3b3JrJyxcbiAgICAncmV3cmFwJyxcbiAgICAncmV3cml0ZScsXG4gICAgJ3JoeW1lJyxcbiAgICAncmliYm9uJyxcbiAgICAncmliY2FnZScsXG4gICAgJ3JpY2UnLFxuICAgICdyaWNoZXMnLFxuICAgICdyaWNobHknLFxuICAgICdyaWNobmVzcycsXG4gICAgJ3JpY2tldHknLFxuICAgICdyaWNvdHRhJyxcbiAgICAncmlkZGFuY2UnLFxuICAgICdyaWRkZW4nLFxuICAgICdyaWRlJyxcbiAgICAncmlkaW5nJyxcbiAgICAncmlmbGluZycsXG4gICAgJ3JpZnQnLFxuICAgICdyaWdnaW5nJyxcbiAgICAncmlnaWQnLFxuICAgICdyaWdvcicsXG4gICAgJ3JpbWxlc3MnLFxuICAgICdyaW1tZWQnLFxuICAgICdyaW5kJyxcbiAgICAncmluaycsXG4gICAgJ3JpbnNlJyxcbiAgICAncmluc2luZycsXG4gICAgJ3Jpb3QnLFxuICAgICdyaXBjb3JkJyxcbiAgICAncmlwZW5lc3MnLFxuICAgICdyaXBlbmluZycsXG4gICAgJ3JpcHBpbmcnLFxuICAgICdyaXBwbGUnLFxuICAgICdyaXBwbGluZycsXG4gICAgJ3JpcHRpZGUnLFxuICAgICdyaXNlJyxcbiAgICAncmlzaW5nJyxcbiAgICAncmlzaycsXG4gICAgJ3Jpc290dG8nLFxuICAgICdyaXRhbGluJyxcbiAgICAncml0enknLFxuICAgICdyaXZhbCcsXG4gICAgJ3JpdmVyYmFuaycsXG4gICAgJ3JpdmVyYmVkJyxcbiAgICAncml2ZXJib2F0JyxcbiAgICAncml2ZXJzaWRlJyxcbiAgICAncml2ZXRlcicsXG4gICAgJ3JpdmV0aW5nJyxcbiAgICAncm9hbWVyJyxcbiAgICAncm9hbWluZycsXG4gICAgJ3JvYXN0JyxcbiAgICAncm9iYmluZycsXG4gICAgJ3JvYmUnLFxuICAgICdyb2JpbicsXG4gICAgJ3JvYm90aWNzJyxcbiAgICAncm9idXN0JyxcbiAgICAncm9ja2JhbmQnLFxuICAgICdyb2NrZXInLFxuICAgICdyb2NrZXQnLFxuICAgICdyb2NrZmlzaCcsXG4gICAgJ3JvY2tpbmVzcycsXG4gICAgJ3JvY2tpbmcnLFxuICAgICdyb2NrbGlrZScsXG4gICAgJ3JvY2tzbGlkZScsXG4gICAgJ3JvY2tzdGFyJyxcbiAgICAncm9ja3knLFxuICAgICdyb2d1ZScsXG4gICAgJ3JvbWFuJyxcbiAgICAncm9tcCcsXG4gICAgJ3JvcGUnLFxuICAgICdyb3BpbmcnLFxuICAgICdyb3N0ZXInLFxuICAgICdyb3N5JyxcbiAgICAncm90dGVuJyxcbiAgICAncm90dGluZycsXG4gICAgJ3JvdHVuZGEnLFxuICAgICdyb3VsZXR0ZScsXG4gICAgJ3JvdW5kaW5nJyxcbiAgICAncm91bmRpc2gnLFxuICAgICdyb3VuZG5lc3MnLFxuICAgICdyb3VuZHVwJyxcbiAgICAncm91bmR3b3JtJyxcbiAgICAncm91dGluZScsXG4gICAgJ3JvdXRpbmcnLFxuICAgICdyb3ZlcicsXG4gICAgJ3JvdmluZycsXG4gICAgJ3JveWFsJyxcbiAgICAncnViYmVkJyxcbiAgICAncnViYmVyJyxcbiAgICAncnViYmluZycsXG4gICAgJ3J1YmJsZScsXG4gICAgJ3J1YmRvd24nLFxuICAgICdydWJ5JyxcbiAgICAncnVja3VzJyxcbiAgICAncnVkZGVyJyxcbiAgICAncnVnJyxcbiAgICAncnVpbmVkJyxcbiAgICAncnVsZScsXG4gICAgJ3J1bWJsZScsXG4gICAgJ3J1bWJsaW5nJyxcbiAgICAncnVtbWFnZScsXG4gICAgJ3J1bW9yJyxcbiAgICAncnVuYXJvdW5kJyxcbiAgICAncnVuZG93bicsXG4gICAgJ3J1bm5lcicsXG4gICAgJ3J1bm5pbmcnLFxuICAgICdydW5ueScsXG4gICAgJ3J1bnQnLFxuICAgICdydW53YXknLFxuICAgICdydXB0dXJlJyxcbiAgICAncnVyYWwnLFxuICAgICdydXNlJyxcbiAgICAncnVzaCcsXG4gICAgJ3J1c3QnLFxuICAgICdydXQnLFxuICAgICdzYWJiYXRoJyxcbiAgICAnc2Fib3RhZ2UnLFxuICAgICdzYWNyYW1lbnQnLFxuICAgICdzYWNyZWQnLFxuICAgICdzYWNyaWZpY2UnLFxuICAgICdzYWRkZW4nLFxuICAgICdzYWRkbGViYWcnLFxuICAgICdzYWRkbGVkJyxcbiAgICAnc2FkZGxpbmcnLFxuICAgICdzYWRseScsXG4gICAgJ3NhZG5lc3MnLFxuICAgICdzYWZhcmknLFxuICAgICdzYWZlZ3VhcmQnLFxuICAgICdzYWZlaG91c2UnLFxuICAgICdzYWZlbHknLFxuICAgICdzYWZlbmVzcycsXG4gICAgJ3NhZmZyb24nLFxuICAgICdzYWdhJyxcbiAgICAnc2FnZScsXG4gICAgJ3NhZ2dpbmcnLFxuICAgICdzYWdneScsXG4gICAgJ3NhaWQnLFxuICAgICdzYWludCcsXG4gICAgJ3Nha2UnLFxuICAgICdzYWxhZCcsXG4gICAgJ3NhbGFtaScsXG4gICAgJ3NhbGFyaWVkJyxcbiAgICAnc2FsYXJ5JyxcbiAgICAnc2FsaW5lJyxcbiAgICAnc2Fsb24nLFxuICAgICdzYWxvb24nLFxuICAgICdzYWxzYScsXG4gICAgJ3NhbHQnLFxuICAgICdzYWx1dGFyeScsXG4gICAgJ3NhbHV0ZScsXG4gICAgJ3NhbHZhZ2UnLFxuICAgICdzYWx2YWdpbmcnLFxuICAgICdzYWx2YXRpb24nLFxuICAgICdzYW1lJyxcbiAgICAnc2FtcGxlJyxcbiAgICAnc2FtcGxpbmcnLFxuICAgICdzYW5jdGlvbicsXG4gICAgJ3NhbmN0aXR5JyxcbiAgICAnc2FuY3R1YXJ5JyxcbiAgICAnc2FuZGFsJyxcbiAgICAnc2FuZGJhZycsXG4gICAgJ3NhbmRiYW5rJyxcbiAgICAnc2FuZGJhcicsXG4gICAgJ3NhbmRibGFzdCcsXG4gICAgJ3NhbmRib3gnLFxuICAgICdzYW5kZWQnLFxuICAgICdzYW5kZmlzaCcsXG4gICAgJ3NhbmRpbmcnLFxuICAgICdzYW5kbG90JyxcbiAgICAnc2FuZHBhcGVyJyxcbiAgICAnc2FuZHBpdCcsXG4gICAgJ3NhbmRzdG9uZScsXG4gICAgJ3NhbmRzdG9ybScsXG4gICAgJ3NhbmR3b3JtJyxcbiAgICAnc2FuZHknLFxuICAgICdzYW5pdGFyeScsXG4gICAgJ3Nhbml0aXplcicsXG4gICAgJ3NhbmsnLFxuICAgICdzYW50YScsXG4gICAgJ3NhcGxpbmcnLFxuICAgICdzYXBwaW5lc3MnLFxuICAgICdzYXBweScsXG4gICAgJ3NhcmNhc20nLFxuICAgICdzYXJjYXN0aWMnLFxuICAgICdzYXJkaW5lJyxcbiAgICAnc2FzaCcsXG4gICAgJ3Nhc3F1YXRjaCcsXG4gICAgJ3Nhc3N5JyxcbiAgICAnc2F0Y2hlbCcsXG4gICAgJ3NhdGlhYmxlJyxcbiAgICAnc2F0aW4nLFxuICAgICdzYXRpcmljYWwnLFxuICAgICdzYXRpc2ZpZWQnLFxuICAgICdzYXRpc2Z5JyxcbiAgICAnc2F0dXJhdGUnLFxuICAgICdzYXR1cmRheScsXG4gICAgJ3NhdWNpbmVzcycsXG4gICAgJ3NhdWN5JyxcbiAgICAnc2F1bmEnLFxuICAgICdzYXZhZ2UnLFxuICAgICdzYXZhbm5hJyxcbiAgICAnc2F2ZWQnLFxuICAgICdzYXZpbmdzJyxcbiAgICAnc2F2aW9yJyxcbiAgICAnc2F2b3InLFxuICAgICdzYXhvcGhvbmUnLFxuICAgICdzYXknLFxuICAgICdzY2FiYmVkJyxcbiAgICAnc2NhYmJ5JyxcbiAgICAnc2NhbGRlZCcsXG4gICAgJ3NjYWxkaW5nJyxcbiAgICAnc2NhbGUnLFxuICAgICdzY2FsaW5nJyxcbiAgICAnc2NhbGxpb24nLFxuICAgICdzY2FsbG9wJyxcbiAgICAnc2NhbHBpbmcnLFxuICAgICdzY2FtJyxcbiAgICAnc2NhbmRhbCcsXG4gICAgJ3NjYW5uZXInLFxuICAgICdzY2FubmluZycsXG4gICAgJ3NjYW50JyxcbiAgICAnc2NhcGVnb2F0JyxcbiAgICAnc2NhcmNlJyxcbiAgICAnc2NhcmNpdHknLFxuICAgICdzY2FyZWNyb3cnLFxuICAgICdzY2FyZWQnLFxuICAgICdzY2FyZicsXG4gICAgJ3NjYXJpbHknLFxuICAgICdzY2FyaW5lc3MnLFxuICAgICdzY2FycmluZycsXG4gICAgJ3NjYXJ5JyxcbiAgICAnc2NhdmVuZ2VyJyxcbiAgICAnc2NlbmljJyxcbiAgICAnc2NoZWR1bGUnLFxuICAgICdzY2hlbWF0aWMnLFxuICAgICdzY2hlbWUnLFxuICAgICdzY2hlbWluZycsXG4gICAgJ3NjaGlsbGluZycsXG4gICAgJ3NjaG5hcHBzJyxcbiAgICAnc2Nob2xhcicsXG4gICAgJ3NjaWVuY2UnLFxuICAgICdzY2llbnRpc3QnLFxuICAgICdzY2lvbicsXG4gICAgJ3Njb2ZmJyxcbiAgICAnc2NvbGRpbmcnLFxuICAgICdzY29uZScsXG4gICAgJ3Njb29wJyxcbiAgICAnc2Nvb3RlcicsXG4gICAgJ3Njb3BlJyxcbiAgICAnc2NvcmNoJyxcbiAgICAnc2NvcmVib29rJyxcbiAgICAnc2NvcmVjYXJkJyxcbiAgICAnc2NvcmVkJyxcbiAgICAnc2NvcmVsZXNzJyxcbiAgICAnc2NvcmVyJyxcbiAgICAnc2NvcmluZycsXG4gICAgJ3Njb3JuJyxcbiAgICAnc2NvcnBpb24nLFxuICAgICdzY290Y2gnLFxuICAgICdzY291bmRyZWwnLFxuICAgICdzY291cmVkJyxcbiAgICAnc2NvdXJpbmcnLFxuICAgICdzY291dGluZycsXG4gICAgJ3Njb3V0cycsXG4gICAgJ3Njb3dsaW5nJyxcbiAgICAnc2NyYWJibGUnLFxuICAgICdzY3JhZ2dseScsXG4gICAgJ3NjcmFtYmxlZCcsXG4gICAgJ3NjcmFtYmxlcicsXG4gICAgJ3NjcmFwJyxcbiAgICAnc2NyYXRjaCcsXG4gICAgJ3NjcmF3bnknLFxuICAgICdzY3JlZW4nLFxuICAgICdzY3JpYmJsZScsXG4gICAgJ3NjcmliZScsXG4gICAgJ3NjcmliaW5nJyxcbiAgICAnc2NyaW1tYWdlJyxcbiAgICAnc2NyaXB0JyxcbiAgICAnc2Nyb2xsJyxcbiAgICAnc2Nyb29nZScsXG4gICAgJ3Njcm91bmdlcicsXG4gICAgJ3NjcnViYmVkJyxcbiAgICAnc2NydWJiZXInLFxuICAgICdzY3J1ZmZ5JyxcbiAgICAnc2NydW5jaCcsXG4gICAgJ3NjcnV0aW55JyxcbiAgICAnc2N1YmEnLFxuICAgICdzY3VmZicsXG4gICAgJ3NjdWxwdG9yJyxcbiAgICAnc2N1bHB0dXJlJyxcbiAgICAnc2N1cnZ5JyxcbiAgICAnc2N1dHRsZScsXG4gICAgJ3NlY2x1ZGVkJyxcbiAgICAnc2VjbHVkaW5nJyxcbiAgICAnc2VjbHVzaW9uJyxcbiAgICAnc2Vjb25kJyxcbiAgICAnc2VjcmVjeScsXG4gICAgJ3NlY3JldCcsXG4gICAgJ3NlY3Rpb25hbCcsXG4gICAgJ3NlY3RvcicsXG4gICAgJ3NlY3VsYXInLFxuICAgICdzZWN1cmVseScsXG4gICAgJ3NlY3VyaXR5JyxcbiAgICAnc2VkYW4nLFxuICAgICdzZWRhdGUnLFxuICAgICdzZWRhdGlvbicsXG4gICAgJ3NlZGF0aXZlJyxcbiAgICAnc2VkaW1lbnQnLFxuICAgICdzZWR1Y2UnLFxuICAgICdzZWR1Y2luZycsXG4gICAgJ3NlZ21lbnQnLFxuICAgICdzZWlzbWljJyxcbiAgICAnc2VpemluZycsXG4gICAgJ3NlbGRvbScsXG4gICAgJ3NlbGVjdGVkJyxcbiAgICAnc2VsZWN0aW9uJyxcbiAgICAnc2VsZWN0aXZlJyxcbiAgICAnc2VsZWN0b3InLFxuICAgICdzZWxmJyxcbiAgICAnc2VsdHplcicsXG4gICAgJ3NlbWFudGljJyxcbiAgICAnc2VtZXN0ZXInLFxuICAgICdzZW1pY29sb24nLFxuICAgICdzZW1pZmluYWwnLFxuICAgICdzZW1pbmFyJyxcbiAgICAnc2VtaXNvZnQnLFxuICAgICdzZW1pc3dlZXQnLFxuICAgICdzZW5hdGUnLFxuICAgICdzZW5hdG9yJyxcbiAgICAnc2VuZCcsXG4gICAgJ3NlbmlvcicsXG4gICAgJ3Nlbm9yaXRhJyxcbiAgICAnc2Vuc2F0aW9uJyxcbiAgICAnc2Vuc2l0aXZlJyxcbiAgICAnc2Vuc2l0aXplJyxcbiAgICAnc2Vuc3VhbGx5JyxcbiAgICAnc2Vuc3VvdXMnLFxuICAgICdzZXBpYScsXG4gICAgJ3NlcHRlbWJlcicsXG4gICAgJ3NlcHRpYycsXG4gICAgJ3NlcHR1bScsXG4gICAgJ3NlcXVlbCcsXG4gICAgJ3NlcXVlbmNlJyxcbiAgICAnc2VxdWVzdGVyJyxcbiAgICAnc2VyaWVzJyxcbiAgICAnc2VybW9uJyxcbiAgICAnc2Vyb3RvbmluJyxcbiAgICAnc2VycGVudCcsXG4gICAgJ3NlcnJhdGVkJyxcbiAgICAnc2VydmUnLFxuICAgICdzZXJ2aWNlJyxcbiAgICAnc2VydmluZycsXG4gICAgJ3Nlc2FtZScsXG4gICAgJ3Nlc3Npb25zJyxcbiAgICAnc2V0YmFjaycsXG4gICAgJ3NldHRpbmcnLFxuICAgICdzZXR0bGUnLFxuICAgICdzZXR0bGluZycsXG4gICAgJ3NldHVwJyxcbiAgICAnc2V2ZW5mb2xkJyxcbiAgICAnc2V2ZW50ZWVuJyxcbiAgICAnc2V2ZW50aCcsXG4gICAgJ3NldmVudHknLFxuICAgICdzZXZlcml0eScsXG4gICAgJ3NoYWJieScsXG4gICAgJ3NoYWNrJyxcbiAgICAnc2hhZGVkJyxcbiAgICAnc2hhZGlseScsXG4gICAgJ3NoYWRpbmVzcycsXG4gICAgJ3NoYWRpbmcnLFxuICAgICdzaGFkb3cnLFxuICAgICdzaGFkeScsXG4gICAgJ3NoYWZ0JyxcbiAgICAnc2hha2FibGUnLFxuICAgICdzaGFraWx5JyxcbiAgICAnc2hha2luZXNzJyxcbiAgICAnc2hha2luZycsXG4gICAgJ3NoYWt5JyxcbiAgICAnc2hhbGUnLFxuICAgICdzaGFsbG90JyxcbiAgICAnc2hhbGxvdycsXG4gICAgJ3NoYW1lJyxcbiAgICAnc2hhbXBvbycsXG4gICAgJ3NoYW1yb2NrJyxcbiAgICAnc2hhbmsnLFxuICAgICdzaGFudHknLFxuICAgICdzaGFwZScsXG4gICAgJ3NoYXBpbmcnLFxuICAgICdzaGFyZScsXG4gICAgJ3NoYXJwZW5lcicsXG4gICAgJ3NoYXJwZXInLFxuICAgICdzaGFycGllJyxcbiAgICAnc2hhcnBseScsXG4gICAgJ3NoYXJwbmVzcycsXG4gICAgJ3NoYXdsJyxcbiAgICAnc2hlYXRoJyxcbiAgICAnc2hlZCcsXG4gICAgJ3NoZWVwJyxcbiAgICAnc2hlZXQnLFxuICAgICdzaGVsZicsXG4gICAgJ3NoZWxsJyxcbiAgICAnc2hlbHRlcicsXG4gICAgJ3NoZWx2ZScsXG4gICAgJ3NoZWx2aW5nJyxcbiAgICAnc2hlcnJ5JyxcbiAgICAnc2hpZWxkJyxcbiAgICAnc2hpZnRlcicsXG4gICAgJ3NoaWZ0aW5nJyxcbiAgICAnc2hpZnRsZXNzJyxcbiAgICAnc2hpZnR5JyxcbiAgICAnc2hpbW1lcicsXG4gICAgJ3NoaW1teScsXG4gICAgJ3NoaW5kaWcnLFxuICAgICdzaGluZScsXG4gICAgJ3NoaW5nbGUnLFxuICAgICdzaGluaW5lc3MnLFxuICAgICdzaGluaW5nJyxcbiAgICAnc2hpbnknLFxuICAgICdzaGlwJyxcbiAgICAnc2hpcnQnLFxuICAgICdzaGl2ZXJpbmcnLFxuICAgICdzaG9jaycsXG4gICAgJ3Nob25lJyxcbiAgICAnc2hvcGxpZnQnLFxuICAgICdzaG9wcGVyJyxcbiAgICAnc2hvcHBpbmcnLFxuICAgICdzaG9wdGFsaycsXG4gICAgJ3Nob3JlJyxcbiAgICAnc2hvcnRhZ2UnLFxuICAgICdzaG9ydGNha2UnLFxuICAgICdzaG9ydGN1dCcsXG4gICAgJ3Nob3J0ZW4nLFxuICAgICdzaG9ydGVyJyxcbiAgICAnc2hvcnRoYW5kJyxcbiAgICAnc2hvcnRsaXN0JyxcbiAgICAnc2hvcnRseScsXG4gICAgJ3Nob3J0bmVzcycsXG4gICAgJ3Nob3J0cycsXG4gICAgJ3Nob3J0d2F2ZScsXG4gICAgJ3Nob3J0eScsXG4gICAgJ3Nob3V0JyxcbiAgICAnc2hvdmUnLFxuICAgICdzaG93Yml6JyxcbiAgICAnc2hvd2Nhc2UnLFxuICAgICdzaG93ZG93bicsXG4gICAgJ3Nob3dlcicsXG4gICAgJ3Nob3dnaXJsJyxcbiAgICAnc2hvd2luZycsXG4gICAgJ3Nob3dtYW4nLFxuICAgICdzaG93bicsXG4gICAgJ3Nob3dvZmYnLFxuICAgICdzaG93cGllY2UnLFxuICAgICdzaG93cGxhY2UnLFxuICAgICdzaG93cm9vbScsXG4gICAgJ3Nob3d5JyxcbiAgICAnc2hyYW5rJyxcbiAgICAnc2hyYXBuZWwnLFxuICAgICdzaHJlZGRlcicsXG4gICAgJ3NocmVkZGluZycsXG4gICAgJ3NocmV3ZGx5JyxcbiAgICAnc2hyaWVrJyxcbiAgICAnc2hyaWxsJyxcbiAgICAnc2hyaW1wJyxcbiAgICAnc2hyaW5lJyxcbiAgICAnc2hyaW5rJyxcbiAgICAnc2hyaXZlbCcsXG4gICAgJ3Nocm91ZGVkJyxcbiAgICAnc2hydWJiZXJ5JyxcbiAgICAnc2hydWJzJyxcbiAgICAnc2hydWcnLFxuICAgICdzaHJ1bmsnLFxuICAgICdzaHVja2luZycsXG4gICAgJ3NodWRkZXInLFxuICAgICdzaHVmZmxlJyxcbiAgICAnc2h1ZmZsaW5nJyxcbiAgICAnc2h1bicsXG4gICAgJ3NodXNoJyxcbiAgICAnc2h1dCcsXG4gICAgJ3NoeScsXG4gICAgJ3NpYW1lc2UnLFxuICAgICdzaWJlcmlhbicsXG4gICAgJ3NpYmxpbmcnLFxuICAgICdzaWRpbmcnLFxuICAgICdzaWVycmEnLFxuICAgICdzaWVzdGEnLFxuICAgICdzaWZ0JyxcbiAgICAnc2lnaGluZycsXG4gICAgJ3NpbGVuY2VkJyxcbiAgICAnc2lsZW5jZXInLFxuICAgICdzaWxlbnQnLFxuICAgICdzaWxpY2EnLFxuICAgICdzaWxpY29uJyxcbiAgICAnc2lsaycsXG4gICAgJ3NpbGxpbmVzcycsXG4gICAgJ3NpbGx5JyxcbiAgICAnc2lsbycsXG4gICAgJ3NpbHQnLFxuICAgICdzaWx2ZXInLFxuICAgICdzaW1pbGFybHknLFxuICAgICdzaW1pbGUnLFxuICAgICdzaW1tZXJpbmcnLFxuICAgICdzaW1wbGUnLFxuICAgICdzaW1wbGlmeScsXG4gICAgJ3NpbXBseScsXG4gICAgJ3NpbmNlcmUnLFxuICAgICdzaW5jZXJpdHknLFxuICAgICdzaW5nZXInLFxuICAgICdzaW5naW5nJyxcbiAgICAnc2luZ2xlJyxcbiAgICAnc2luZ3VsYXInLFxuICAgICdzaW5pc3RlcicsXG4gICAgJ3Npbmxlc3MnLFxuICAgICdzaW5uZXInLFxuICAgICdzaW51b3VzJyxcbiAgICAnc2lwJyxcbiAgICAnc2lyZW4nLFxuICAgICdzaXN0ZXInLFxuICAgICdzaXRjb20nLFxuICAgICdzaXR0ZXInLFxuICAgICdzaXR0aW5nJyxcbiAgICAnc2l0dWF0ZWQnLFxuICAgICdzaXR1YXRpb24nLFxuICAgICdzaXhmb2xkJyxcbiAgICAnc2l4dGVlbicsXG4gICAgJ3NpeHRoJyxcbiAgICAnc2l4dGllcycsXG4gICAgJ3NpeHRpZXRoJyxcbiAgICAnc2l4dHlmb2xkJyxcbiAgICAnc2l6YWJsZScsXG4gICAgJ3NpemFibHknLFxuICAgICdzaXplJyxcbiAgICAnc2l6aW5nJyxcbiAgICAnc2l6emxlJyxcbiAgICAnc2l6emxpbmcnLFxuICAgICdza2F0ZXInLFxuICAgICdza2F0aW5nJyxcbiAgICAnc2tlZGFkZGxlJyxcbiAgICAnc2tlbGV0YWwnLFxuICAgICdza2VsZXRvbicsXG4gICAgJ3NrZXB0aWMnLFxuICAgICdza2V0Y2gnLFxuICAgICdza2V3ZWQnLFxuICAgICdza2V3ZXInLFxuICAgICdza2lkJyxcbiAgICAnc2tpZWQnLFxuICAgICdza2llcicsXG4gICAgJ3NraWVzJyxcbiAgICAnc2tpaW5nJyxcbiAgICAnc2tpbGxlZCcsXG4gICAgJ3NraWxsZXQnLFxuICAgICdza2lsbGZ1bCcsXG4gICAgJ3NraW1tZWQnLFxuICAgICdza2ltbWVyJyxcbiAgICAnc2tpbW1pbmcnLFxuICAgICdza2ltcGlseScsXG4gICAgJ3NraW5jYXJlJyxcbiAgICAnc2tpbmhlYWQnLFxuICAgICdza2lubGVzcycsXG4gICAgJ3NraW5uaW5nJyxcbiAgICAnc2tpbm55JyxcbiAgICAnc2tpbnRpZ2h0JyxcbiAgICAnc2tpcHBlcicsXG4gICAgJ3NraXBwaW5nJyxcbiAgICAnc2tpcm1pc2gnLFxuICAgICdza2lydCcsXG4gICAgJ3NraXR0bGUnLFxuICAgICdza3lkaXZlcicsXG4gICAgJ3NreWxpZ2h0JyxcbiAgICAnc2t5bGluZScsXG4gICAgJ3NreXBlJyxcbiAgICAnc2t5cm9ja2V0JyxcbiAgICAnc2t5d2FyZCcsXG4gICAgJ3NsYWInLFxuICAgICdzbGFja2VkJyxcbiAgICAnc2xhY2tlcicsXG4gICAgJ3NsYWNraW5nJyxcbiAgICAnc2xhY2tuZXNzJyxcbiAgICAnc2xhY2tzJyxcbiAgICAnc2xhaW4nLFxuICAgICdzbGFtJyxcbiAgICAnc2xhbmRlcicsXG4gICAgJ3NsYW5nJyxcbiAgICAnc2xhcHBpbmcnLFxuICAgICdzbGFwc3RpY2snLFxuICAgICdzbGFzaGVkJyxcbiAgICAnc2xhc2hpbmcnLFxuICAgICdzbGF0ZScsXG4gICAgJ3NsYXRoZXInLFxuICAgICdzbGF3JyxcbiAgICAnc2xlZCcsXG4gICAgJ3NsZWVrJyxcbiAgICAnc2xlZXAnLFxuICAgICdzbGVldCcsXG4gICAgJ3NsZWV2ZScsXG4gICAgJ3NsZXB0JyxcbiAgICAnc2xpY2VhYmxlJyxcbiAgICAnc2xpY2VkJyxcbiAgICAnc2xpY2VyJyxcbiAgICAnc2xpY2luZycsXG4gICAgJ3NsaWNrJyxcbiAgICAnc2xpZGVyJyxcbiAgICAnc2xpZGVzaG93JyxcbiAgICAnc2xpZGluZycsXG4gICAgJ3NsaWdodGVkJyxcbiAgICAnc2xpZ2h0aW5nJyxcbiAgICAnc2xpZ2h0bHknLFxuICAgICdzbGltbmVzcycsXG4gICAgJ3NsaW15JyxcbiAgICAnc2xpbmdpbmcnLFxuICAgICdzbGluZ3Nob3QnLFxuICAgICdzbGlua3knLFxuICAgICdzbGlwJyxcbiAgICAnc2xpdCcsXG4gICAgJ3NsaXZlcicsXG4gICAgJ3Nsb2JiZXJ5JyxcbiAgICAnc2xvZ2FuJyxcbiAgICAnc2xvcGVkJyxcbiAgICAnc2xvcGluZycsXG4gICAgJ3Nsb3BwaWx5JyxcbiAgICAnc2xvcHB5JyxcbiAgICAnc2xvdCcsXG4gICAgJ3Nsb3VjaGluZycsXG4gICAgJ3Nsb3VjaHknLFxuICAgICdzbHVkZ2UnLFxuICAgICdzbHVnJyxcbiAgICAnc2x1bScsXG4gICAgJ3NsdXJwJyxcbiAgICAnc2x1c2gnLFxuICAgICdzbHknLFxuICAgICdzbWFsbCcsXG4gICAgJ3NtYXJ0bHknLFxuICAgICdzbWFydG5lc3MnLFxuICAgICdzbWFzaGVyJyxcbiAgICAnc21hc2hpbmcnLFxuICAgICdzbWFzaHVwJyxcbiAgICAnc21lbGwnLFxuICAgICdzbWVsdGluZycsXG4gICAgJ3NtaWxlJyxcbiAgICAnc21pbGluZ2x5JyxcbiAgICAnc21pcmsnLFxuICAgICdzbWl0ZScsXG4gICAgJ3NtaXRoJyxcbiAgICAnc21pdHRlbicsXG4gICAgJ3Ntb2NrJyxcbiAgICAnc21vZycsXG4gICAgJ3Ntb2tlZCcsXG4gICAgJ3Ntb2tlbGVzcycsXG4gICAgJ3Ntb2tpbmVzcycsXG4gICAgJ3Ntb2tpbmcnLFxuICAgICdzbW9reScsXG4gICAgJ3Ntb2xkZXInLFxuICAgICdzbW9vdGgnLFxuICAgICdzbW90aGVyJyxcbiAgICAnc211ZGdlJyxcbiAgICAnc211ZGd5JyxcbiAgICAnc211Z2dsZXInLFxuICAgICdzbXVnZ2xpbmcnLFxuICAgICdzbXVnbHknLFxuICAgICdzbXVnbmVzcycsXG4gICAgJ3NuYWNrJyxcbiAgICAnc25hZ2dlZCcsXG4gICAgJ3NuYWtpbmcnLFxuICAgICdzbmFwJyxcbiAgICAnc25hcmUnLFxuICAgICdzbmFybCcsXG4gICAgJ3NuYXp6eScsXG4gICAgJ3NuZWFrJyxcbiAgICAnc25lZXInLFxuICAgICdzbmVlemUnLFxuICAgICdzbmVlemluZycsXG4gICAgJ3NuaWRlJyxcbiAgICAnc25pZmYnLFxuICAgICdzbmlwcGV0JyxcbiAgICAnc25pcHBpbmcnLFxuICAgICdzbml0Y2gnLFxuICAgICdzbm9vcGVyJyxcbiAgICAnc25vb3plJyxcbiAgICAnc25vcmUnLFxuICAgICdzbm9yaW5nJyxcbiAgICAnc25vcmtlbCcsXG4gICAgJ3Nub3J0JyxcbiAgICAnc25vdXQnLFxuICAgICdzbm93YmlyZCcsXG4gICAgJ3Nub3dib2FyZCcsXG4gICAgJ3Nub3dib3VuZCcsXG4gICAgJ3Nub3djYXAnLFxuICAgICdzbm93ZHJpZnQnLFxuICAgICdzbm93ZHJvcCcsXG4gICAgJ3Nub3dmYWxsJyxcbiAgICAnc25vd2ZpZWxkJyxcbiAgICAnc25vd2ZsYWtlJyxcbiAgICAnc25vd2luZXNzJyxcbiAgICAnc25vd2xlc3MnLFxuICAgICdzbm93bWFuJyxcbiAgICAnc25vd3Bsb3cnLFxuICAgICdzbm93c2hvZScsXG4gICAgJ3Nub3dzdG9ybScsXG4gICAgJ3Nub3dzdWl0JyxcbiAgICAnc25vd3knLFxuICAgICdzbnViJyxcbiAgICAnc251ZmYnLFxuICAgICdzbnVnZ2xlJyxcbiAgICAnc251Z2x5JyxcbiAgICAnc251Z25lc3MnLFxuICAgICdzcGVhaycsXG4gICAgJ3NwZWFyZmlzaCcsXG4gICAgJ3NwZWFyaGVhZCcsXG4gICAgJ3NwZWFybWFuJyxcbiAgICAnc3BlYXJtaW50JyxcbiAgICAnc3BlY2llcycsXG4gICAgJ3NwZWNpbWVuJyxcbiAgICAnc3BlY2tlZCcsXG4gICAgJ3NwZWNrbGVkJyxcbiAgICAnc3BlY2tzJyxcbiAgICAnc3BlY3RhY2xlJyxcbiAgICAnc3BlY3RhdG9yJyxcbiAgICAnc3BlY3RydW0nLFxuICAgICdzcGVjdWxhdGUnLFxuICAgICdzcGVlY2gnLFxuICAgICdzcGVlZCcsXG4gICAgJ3NwZWxsYmluZCcsXG4gICAgJ3NwZWxsZXInLFxuICAgICdzcGVsbGluZycsXG4gICAgJ3NwZW5kYWJsZScsXG4gICAgJ3NwZW5kZXInLFxuICAgICdzcGVuZGluZycsXG4gICAgJ3NwZW50JyxcbiAgICAnc3BldycsXG4gICAgJ3NwaGVyZScsXG4gICAgJ3NwaGVyaWNhbCcsXG4gICAgJ3NwaGlueCcsXG4gICAgJ3NwaWRlcicsXG4gICAgJ3NwaWVkJyxcbiAgICAnc3BpZmZ5JyxcbiAgICAnc3BpbGwnLFxuICAgICdzcGlsdCcsXG4gICAgJ3NwaW5hY2gnLFxuICAgICdzcGluYWwnLFxuICAgICdzcGluZGxlJyxcbiAgICAnc3Bpbm5lcicsXG4gICAgJ3NwaW5uaW5nJyxcbiAgICAnc3Bpbm91dCcsXG4gICAgJ3NwaW5zdGVyJyxcbiAgICAnc3BpbnknLFxuICAgICdzcGlyYWwnLFxuICAgICdzcGlyaXRlZCcsXG4gICAgJ3NwaXJpdGlzbScsXG4gICAgJ3NwaXJpdHMnLFxuICAgICdzcGlyaXR1YWwnLFxuICAgICdzcGxhc2hlZCcsXG4gICAgJ3NwbGFzaGluZycsXG4gICAgJ3NwbGFzaHknLFxuICAgICdzcGxhdHRlcicsXG4gICAgJ3NwbGVlbicsXG4gICAgJ3NwbGVuZGlkJyxcbiAgICAnc3BsZW5kb3InLFxuICAgICdzcGxpY2UnLFxuICAgICdzcGxpY2luZycsXG4gICAgJ3NwbGludGVyJyxcbiAgICAnc3Bsb3RjaHknLFxuICAgICdzcGx1cmdlJyxcbiAgICAnc3BvaWxhZ2UnLFxuICAgICdzcG9pbGVkJyxcbiAgICAnc3BvaWxlcicsXG4gICAgJ3Nwb2lsaW5nJyxcbiAgICAnc3BvaWxzJyxcbiAgICAnc3Bva2VuJyxcbiAgICAnc3Bva2VzbWFuJyxcbiAgICAnc3BvbmdlJyxcbiAgICAnc3Bvbmd5JyxcbiAgICAnc3BvbnNvcicsXG4gICAgJ3Nwb29mJyxcbiAgICAnc3Bvb2tpbHknLFxuICAgICdzcG9va3knLFxuICAgICdzcG9vbCcsXG4gICAgJ3Nwb29uJyxcbiAgICAnc3BvcmUnLFxuICAgICdzcG9ydGluZycsXG4gICAgJ3Nwb3J0cycsXG4gICAgJ3Nwb3J0eScsXG4gICAgJ3Nwb3RsZXNzJyxcbiAgICAnc3BvdGxpZ2h0JyxcbiAgICAnc3BvdHRlZCcsXG4gICAgJ3Nwb3R0ZXInLFxuICAgICdzcG90dGluZycsXG4gICAgJ3Nwb3R0eScsXG4gICAgJ3Nwb3VzYWwnLFxuICAgICdzcG91c2UnLFxuICAgICdzcG91dCcsXG4gICAgJ3NwcmFpbicsXG4gICAgJ3NwcmFuZycsXG4gICAgJ3NwcmF3bCcsXG4gICAgJ3NwcmF5JyxcbiAgICAnc3ByZWUnLFxuICAgICdzcHJpZycsXG4gICAgJ3NwcmluZycsXG4gICAgJ3Nwcmlua2xlZCcsXG4gICAgJ3Nwcmlua2xlcicsXG4gICAgJ3NwcmludCcsXG4gICAgJ3Nwcml0ZScsXG4gICAgJ3Nwcm91dCcsXG4gICAgJ3NwcnVjZScsXG4gICAgJ3NwcnVuZycsXG4gICAgJ3NwcnknLFxuICAgICdzcHVkJyxcbiAgICAnc3B1cicsXG4gICAgJ3NwdXR0ZXInLFxuICAgICdzcHlnbGFzcycsXG4gICAgJ3NxdWFiYmxlJyxcbiAgICAnc3F1YWQnLFxuICAgICdzcXVhbGwnLFxuICAgICdzcXVhbmRlcicsXG4gICAgJ3NxdWFzaCcsXG4gICAgJ3NxdWF0dGVkJyxcbiAgICAnc3F1YXR0ZXInLFxuICAgICdzcXVhdHRpbmcnLFxuICAgICdzcXVlYWsnLFxuICAgICdzcXVlYWxlcicsXG4gICAgJ3NxdWVhbGluZycsXG4gICAgJ3NxdWVhbWlzaCcsXG4gICAgJ3NxdWVlZ2VlJyxcbiAgICAnc3F1ZWV6ZScsXG4gICAgJ3NxdWVlemluZycsXG4gICAgJ3NxdWlkJyxcbiAgICAnc3F1aWdnbGUnLFxuICAgICdzcXVpZ2dseScsXG4gICAgJ3NxdWludCcsXG4gICAgJ3NxdWlyZScsXG4gICAgJ3NxdWlydCcsXG4gICAgJ3NxdWlzaGllcicsXG4gICAgJ3NxdWlzaHknLFxuICAgICdzdGFiaWxpdHknLFxuICAgICdzdGFiaWxpemUnLFxuICAgICdzdGFibGUnLFxuICAgICdzdGFjaycsXG4gICAgJ3N0YWRpdW0nLFxuICAgICdzdGFmZicsXG4gICAgJ3N0YWdlJyxcbiAgICAnc3RhZ2luZycsXG4gICAgJ3N0YWduYW50JyxcbiAgICAnc3RhZ25hdGUnLFxuICAgICdzdGFpbmFibGUnLFxuICAgICdzdGFpbmVkJyxcbiAgICAnc3RhaW5pbmcnLFxuICAgICdzdGFpbmxlc3MnLFxuICAgICdzdGFsZW1hdGUnLFxuICAgICdzdGFsZW5lc3MnLFxuICAgICdzdGFsbGluZycsXG4gICAgJ3N0YWxsaW9uJyxcbiAgICAnc3RhbWluYScsXG4gICAgJ3N0YW1tZXInLFxuICAgICdzdGFtcCcsXG4gICAgJ3N0YW5kJyxcbiAgICAnc3RhbmsnLFxuICAgICdzdGFwbGUnLFxuICAgICdzdGFwbGluZycsXG4gICAgJ3N0YXJib2FyZCcsXG4gICAgJ3N0YXJjaCcsXG4gICAgJ3N0YXJkb20nLFxuICAgICdzdGFyZHVzdCcsXG4gICAgJ3N0YXJmaXNoJyxcbiAgICAnc3RhcmdhemVyJyxcbiAgICAnc3RhcmluZycsXG4gICAgJ3N0YXJrJyxcbiAgICAnc3Rhcmxlc3MnLFxuICAgICdzdGFybGV0JyxcbiAgICAnc3RhcmxpZ2h0JyxcbiAgICAnc3RhcmxpdCcsXG4gICAgJ3N0YXJyaW5nJyxcbiAgICAnc3RhcnJ5JyxcbiAgICAnc3RhcnNoaXAnLFxuICAgICdzdGFydGVyJyxcbiAgICAnc3RhcnRpbmcnLFxuICAgICdzdGFydGxlJyxcbiAgICAnc3RhcnRsaW5nJyxcbiAgICAnc3RhcnR1cCcsXG4gICAgJ3N0YXJ2ZWQnLFxuICAgICdzdGFydmluZycsXG4gICAgJ3N0YXNoJyxcbiAgICAnc3RhdGUnLFxuICAgICdzdGF0aWMnLFxuICAgICdzdGF0aXN0aWMnLFxuICAgICdzdGF0dWUnLFxuICAgICdzdGF0dXJlJyxcbiAgICAnc3RhdHVzJyxcbiAgICAnc3RhdHV0ZScsXG4gICAgJ3N0YXR1dG9yeScsXG4gICAgJ3N0YXVuY2gnLFxuICAgICdzdGF5cycsXG4gICAgJ3N0ZWFkZmFzdCcsXG4gICAgJ3N0ZWFkaWVyJyxcbiAgICAnc3RlYWRpbHknLFxuICAgICdzdGVhZHlpbmcnLFxuICAgICdzdGVhbScsXG4gICAgJ3N0ZWVkJyxcbiAgICAnc3RlZXAnLFxuICAgICdzdGVlcmFibGUnLFxuICAgICdzdGVlcmluZycsXG4gICAgJ3N0ZWVyc21hbicsXG4gICAgJ3N0ZWdvc2F1cicsXG4gICAgJ3N0ZWxsYXInLFxuICAgICdzdGVtJyxcbiAgICAnc3RlbmNoJyxcbiAgICAnc3RlbmNpbCcsXG4gICAgJ3N0ZXAnLFxuICAgICdzdGVyZW8nLFxuICAgICdzdGVyaWxlJyxcbiAgICAnc3RlcmlsaXR5JyxcbiAgICAnc3RlcmlsaXplJyxcbiAgICAnc3RlcmxpbmcnLFxuICAgICdzdGVybm5lc3MnLFxuICAgICdzdGVybnVtJyxcbiAgICAnc3RldycsXG4gICAgJ3N0aWNrJyxcbiAgICAnc3RpZmZlbicsXG4gICAgJ3N0aWZmbHknLFxuICAgICdzdGlmZm5lc3MnLFxuICAgICdzdGlmbGUnLFxuICAgICdzdGlmbGluZycsXG4gICAgJ3N0aWxsbmVzcycsXG4gICAgJ3N0aWx0JyxcbiAgICAnc3RpbXVsYW50JyxcbiAgICAnc3RpbXVsYXRlJyxcbiAgICAnc3RpbXVsaScsXG4gICAgJ3N0aW11bHVzJyxcbiAgICAnc3RpbmdlcicsXG4gICAgJ3N0aW5naWx5JyxcbiAgICAnc3RpbmdpbmcnLFxuICAgICdzdGluZ3JheScsXG4gICAgJ3N0aW5neScsXG4gICAgJ3N0aW5raW5nJyxcbiAgICAnc3Rpbmt5JyxcbiAgICAnc3RpcGVuZCcsXG4gICAgJ3N0aXB1bGF0ZScsXG4gICAgJ3N0aXInLFxuICAgICdzdGl0Y2gnLFxuICAgICdzdG9jaycsXG4gICAgJ3N0b2ljJyxcbiAgICAnc3Rva2UnLFxuICAgICdzdG9sZScsXG4gICAgJ3N0b21wJyxcbiAgICAnc3RvbmV3YWxsJyxcbiAgICAnc3RvbmV3YXJlJyxcbiAgICAnc3RvbmV3b3JrJyxcbiAgICAnc3RvbmluZycsXG4gICAgJ3N0b255JyxcbiAgICAnc3Rvb2QnLFxuICAgICdzdG9vZ2UnLFxuICAgICdzdG9vbCcsXG4gICAgJ3N0b29wJyxcbiAgICAnc3RvcGxpZ2h0JyxcbiAgICAnc3RvcHBhYmxlJyxcbiAgICAnc3RvcHBhZ2UnLFxuICAgICdzdG9wcGVkJyxcbiAgICAnc3RvcHBlcicsXG4gICAgJ3N0b3BwaW5nJyxcbiAgICAnc3RvcHdhdGNoJyxcbiAgICAnc3RvcmFibGUnLFxuICAgICdzdG9yYWdlJyxcbiAgICAnc3RvcmVyb29tJyxcbiAgICAnc3RvcmV3aWRlJyxcbiAgICAnc3Rvcm0nLFxuICAgICdzdG91dCcsXG4gICAgJ3N0b3ZlJyxcbiAgICAnc3Rvd2F3YXknLFxuICAgICdzdG93aW5nJyxcbiAgICAnc3RyYWRkbGUnLFxuICAgICdzdHJhZ2dsZXInLFxuICAgICdzdHJhaW5lZCcsXG4gICAgJ3N0cmFpbmVyJyxcbiAgICAnc3RyYWluaW5nJyxcbiAgICAnc3RyYW5nZWx5JyxcbiAgICAnc3RyYW5nZXInLFxuICAgICdzdHJhbmdsZScsXG4gICAgJ3N0cmF0ZWdpYycsXG4gICAgJ3N0cmF0ZWd5JyxcbiAgICAnc3RyYXR1cycsXG4gICAgJ3N0cmF3JyxcbiAgICAnc3RyYXknLFxuICAgICdzdHJlYWsnLFxuICAgICdzdHJlYW0nLFxuICAgICdzdHJlZXQnLFxuICAgICdzdHJlbmd0aCcsXG4gICAgJ3N0cmVudW91cycsXG4gICAgJ3N0cmVwJyxcbiAgICAnc3RyZXNzJyxcbiAgICAnc3RyZXRjaCcsXG4gICAgJ3N0cmV3bicsXG4gICAgJ3N0cmlja2VuJyxcbiAgICAnc3RyaWN0JyxcbiAgICAnc3RyaWRlJyxcbiAgICAnc3RyaWZlJyxcbiAgICAnc3RyaWtlJyxcbiAgICAnc3RyaWtpbmcnLFxuICAgICdzdHJpdmUnLFxuICAgICdzdHJpdmluZycsXG4gICAgJ3N0cm9iZScsXG4gICAgJ3N0cm9kZScsXG4gICAgJ3N0cm9sbGVyJyxcbiAgICAnc3Ryb25nYm94JyxcbiAgICAnc3Ryb25nbHknLFxuICAgICdzdHJvbmdtYW4nLFxuICAgICdzdHJ1Y2snLFxuICAgICdzdHJ1Y3R1cmUnLFxuICAgICdzdHJ1ZGVsJyxcbiAgICAnc3RydWdnbGUnLFxuICAgICdzdHJ1bScsXG4gICAgJ3N0cnVuZycsXG4gICAgJ3N0cnV0JyxcbiAgICAnc3R1YmJlZCcsXG4gICAgJ3N0dWJibGUnLFxuICAgICdzdHViYmx5JyxcbiAgICAnc3R1YmJvcm4nLFxuICAgICdzdHVjY28nLFxuICAgICdzdHVjaycsXG4gICAgJ3N0dWRlbnQnLFxuICAgICdzdHVkaWVkJyxcbiAgICAnc3R1ZGlvJyxcbiAgICAnc3R1ZHknLFxuICAgICdzdHVmZmVkJyxcbiAgICAnc3R1ZmZpbmcnLFxuICAgICdzdHVmZnknLFxuICAgICdzdHVtYmxlJyxcbiAgICAnc3R1bWJsaW5nJyxcbiAgICAnc3R1bXAnLFxuICAgICdzdHVuZycsXG4gICAgJ3N0dW5uZWQnLFxuICAgICdzdHVubmVyJyxcbiAgICAnc3R1bm5pbmcnLFxuICAgICdzdHVudCcsXG4gICAgJ3N0dXBvcicsXG4gICAgJ3N0dXJkaWx5JyxcbiAgICAnc3R1cmR5JyxcbiAgICAnc3R5bGluZycsXG4gICAgJ3N0eWxpc2hseScsXG4gICAgJ3N0eWxpc3QnLFxuICAgICdzdHlsaXplZCcsXG4gICAgJ3N0eWx1cycsXG4gICAgJ3N1YXZlJyxcbiAgICAnc3ViYXJjdGljJyxcbiAgICAnc3ViYXRvbWljJyxcbiAgICAnc3ViZGl2aWRlJyxcbiAgICAnc3ViZHVlZCcsXG4gICAgJ3N1YmR1aW5nJyxcbiAgICAnc3ViZmxvb3InLFxuICAgICdzdWJncm91cCcsXG4gICAgJ3N1YmhlYWRlcicsXG4gICAgJ3N1YmplY3QnLFxuICAgICdzdWJsZWFzZScsXG4gICAgJ3N1YmxldCcsXG4gICAgJ3N1YmxldmVsJyxcbiAgICAnc3VibGltZScsXG4gICAgJ3N1Ym1hcmluZScsXG4gICAgJ3N1Ym1lcmdlJyxcbiAgICAnc3VibWVyc2VkJyxcbiAgICAnc3VibWl0dGVyJyxcbiAgICAnc3VicGFuZWwnLFxuICAgICdzdWJwYXInLFxuICAgICdzdWJwbG90JyxcbiAgICAnc3VicHJpbWUnLFxuICAgICdzdWJzY3JpYmUnLFxuICAgICdzdWJzY3JpcHQnLFxuICAgICdzdWJzZWN0b3InLFxuICAgICdzdWJzaWRlJyxcbiAgICAnc3Vic2lkaW5nJyxcbiAgICAnc3Vic2lkaXplJyxcbiAgICAnc3Vic2lkeScsXG4gICAgJ3N1YnNvaWwnLFxuICAgICdzdWJzb25pYycsXG4gICAgJ3N1YnN0YW5jZScsXG4gICAgJ3N1YnN5c3RlbScsXG4gICAgJ3N1YnRleHQnLFxuICAgICdzdWJ0aXRsZScsXG4gICAgJ3N1YnRseScsXG4gICAgJ3N1YnRvdGFsJyxcbiAgICAnc3VidHJhY3QnLFxuICAgICdzdWJ0eXBlJyxcbiAgICAnc3VidXJiJyxcbiAgICAnc3Vid2F5JyxcbiAgICAnc3Vid29vZmVyJyxcbiAgICAnc3ViemVybycsXG4gICAgJ3N1Y2N1bGVudCcsXG4gICAgJ3N1Y2gnLFxuICAgICdzdWN0aW9uJyxcbiAgICAnc3VkZGVuJyxcbiAgICAnc3Vkb2t1JyxcbiAgICAnc3VkcycsXG4gICAgJ3N1ZmZlcmVyJyxcbiAgICAnc3VmZmVyaW5nJyxcbiAgICAnc3VmZmljZScsXG4gICAgJ3N1ZmZpeCcsXG4gICAgJ3N1ZmZvY2F0ZScsXG4gICAgJ3N1ZmZyYWdlJyxcbiAgICAnc3VnYXInLFxuICAgICdzdWdnZXN0JyxcbiAgICAnc3VpbmcnLFxuICAgICdzdWl0YWJsZScsXG4gICAgJ3N1aXRhYmx5JyxcbiAgICAnc3VpdGNhc2UnLFxuICAgICdzdWl0b3InLFxuICAgICdzdWxmYXRlJyxcbiAgICAnc3VsZmlkZScsXG4gICAgJ3N1bGZpdGUnLFxuICAgICdzdWxmdXInLFxuICAgICdzdWxrJyxcbiAgICAnc3VsbGVuJyxcbiAgICAnc3VscGhhdGUnLFxuICAgICdzdWxwaHVyaWMnLFxuICAgICdzdWx0cnknLFxuICAgICdzdXBlcmJvd2wnLFxuICAgICdzdXBlcmdsdWUnLFxuICAgICdzdXBlcmhlcm8nLFxuICAgICdzdXBlcmlvcicsXG4gICAgJ3N1cGVyamV0JyxcbiAgICAnc3VwZXJtYW4nLFxuICAgICdzdXBlcm1vbScsXG4gICAgJ3N1cGVybm92YScsXG4gICAgJ3N1cGVydmlzZScsXG4gICAgJ3N1cHBlcicsXG4gICAgJ3N1cHBsaWVyJyxcbiAgICAnc3VwcGx5JyxcbiAgICAnc3VwcG9ydCcsXG4gICAgJ3N1cHJlbWFjeScsXG4gICAgJ3N1cHJlbWUnLFxuICAgICdzdXJjaGFyZ2UnLFxuICAgICdzdXJlbHknLFxuICAgICdzdXJlbmVzcycsXG4gICAgJ3N1cmZhY2UnLFxuICAgICdzdXJmYWNpbmcnLFxuICAgICdzdXJmYm9hcmQnLFxuICAgICdzdXJmZXInLFxuICAgICdzdXJnZXJ5JyxcbiAgICAnc3VyZ2ljYWwnLFxuICAgICdzdXJnaW5nJyxcbiAgICAnc3VybmFtZScsXG4gICAgJ3N1cnBhc3MnLFxuICAgICdzdXJwbHVzJyxcbiAgICAnc3VycHJpc2UnLFxuICAgICdzdXJyZWFsJyxcbiAgICAnc3VycmVuZGVyJyxcbiAgICAnc3Vycm9nYXRlJyxcbiAgICAnc3Vycm91bmQnLFxuICAgICdzdXJ2ZXknLFxuICAgICdzdXJ2aXZhbCcsXG4gICAgJ3N1cnZpdmUnLFxuICAgICdzdXJ2aXZpbmcnLFxuICAgICdzdXJ2aXZvcicsXG4gICAgJ3N1c2hpJyxcbiAgICAnc3VzcGVjdCcsXG4gICAgJ3N1c3BlbmQnLFxuICAgICdzdXNwZW5zZScsXG4gICAgJ3N1c3RhaW5lZCcsXG4gICAgJ3N1c3RhaW5lcicsXG4gICAgJ3N3YWInLFxuICAgICdzd2FkZGxpbmcnLFxuICAgICdzd2FnZ2VyJyxcbiAgICAnc3dhbXBsYW5kJyxcbiAgICAnc3dhbicsXG4gICAgJ3N3YXBwaW5nJyxcbiAgICAnc3dhcm0nLFxuICAgICdzd2F5JyxcbiAgICAnc3dlYXInLFxuICAgICdzd2VhdCcsXG4gICAgJ3N3ZWVwJyxcbiAgICAnc3dlbGwnLFxuICAgICdzd2VwdCcsXG4gICAgJ3N3ZXJ2ZScsXG4gICAgJ3N3aWZ0ZXInLFxuICAgICdzd2lmdGx5JyxcbiAgICAnc3dpZnRuZXNzJyxcbiAgICAnc3dpbW1hYmxlJyxcbiAgICAnc3dpbW1lcicsXG4gICAgJ3N3aW1taW5nJyxcbiAgICAnc3dpbXN1aXQnLFxuICAgICdzd2ltd2VhcicsXG4gICAgJ3N3aW5nZXInLFxuICAgICdzd2luZ2luZycsXG4gICAgJ3N3aXBlJyxcbiAgICAnc3dpcmwnLFxuICAgICdzd2l0Y2gnLFxuICAgICdzd2l2ZWwnLFxuICAgICdzd2l6emxlJyxcbiAgICAnc3dvb25lZCcsXG4gICAgJ3N3b29wJyxcbiAgICAnc3dvb3NoJyxcbiAgICAnc3dvcmUnLFxuICAgICdzd29ybicsXG4gICAgJ3N3dW5nJyxcbiAgICAnc3ljYW1vcmUnLFxuICAgICdzeW1wYXRoeScsXG4gICAgJ3N5bXBob25pYycsXG4gICAgJ3N5bXBob255JyxcbiAgICAnc3ltcHRvbScsXG4gICAgJ3N5bmFwc2UnLFxuICAgICdzeW5kcm9tZScsXG4gICAgJ3N5bmVyZ3knLFxuICAgICdzeW5vcHNlcycsXG4gICAgJ3N5bm9wc2lzJyxcbiAgICAnc3ludGhlc2lzJyxcbiAgICAnc3ludGhldGljJyxcbiAgICAnc3lydXAnLFxuICAgICdzeXN0ZW0nLFxuICAgICd0LXNoaXJ0JyxcbiAgICAndGFiYXNjbycsXG4gICAgJ3RhYmJ5JyxcbiAgICAndGFibGVmdWwnLFxuICAgICd0YWJsZXMnLFxuICAgICd0YWJsZXQnLFxuICAgICd0YWJsZXdhcmUnLFxuICAgICd0YWJsb2lkJyxcbiAgICAndGFja2luZXNzJyxcbiAgICAndGFja2luZycsXG4gICAgJ3RhY2tsZScsXG4gICAgJ3RhY2tsaW5nJyxcbiAgICAndGFja3knLFxuICAgICd0YWNvJyxcbiAgICAndGFjdGZ1bCcsXG4gICAgJ3RhY3RpY2FsJyxcbiAgICAndGFjdGljcycsXG4gICAgJ3RhY3RpbGUnLFxuICAgICd0YWN0bGVzcycsXG4gICAgJ3RhZHBvbGUnLFxuICAgICd0YWVrd29uZG8nLFxuICAgICd0YWcnLFxuICAgICd0YWludGVkJyxcbiAgICAndGFrZScsXG4gICAgJ3Rha2luZycsXG4gICAgJ3RhbGN1bScsXG4gICAgJ3RhbGlzbWFuJyxcbiAgICAndGFsbCcsXG4gICAgJ3RhbG9uJyxcbiAgICAndGFtYWxlJyxcbiAgICAndGFtZW5lc3MnLFxuICAgICd0YW1lcicsXG4gICAgJ3RhbXBlcicsXG4gICAgJ3RhbmsnLFxuICAgICd0YW5uZWQnLFxuICAgICd0YW5uZXJ5JyxcbiAgICAndGFubmluZycsXG4gICAgJ3RhbnRydW0nLFxuICAgICd0YXBlbGVzcycsXG4gICAgJ3RhcGVyZWQnLFxuICAgICd0YXBlcmluZycsXG4gICAgJ3RhcGVzdHJ5JyxcbiAgICAndGFwaW9jYScsXG4gICAgJ3RhcHBpbmcnLFxuICAgICd0YXBzJyxcbiAgICAndGFyYW50dWxhJyxcbiAgICAndGFyZ2V0JyxcbiAgICAndGFybWFjJyxcbiAgICAndGFybmlzaCcsXG4gICAgJ3Rhcm90JyxcbiAgICAndGFydGFyJyxcbiAgICAndGFydGx5JyxcbiAgICAndGFydG5lc3MnLFxuICAgICd0YXNrJyxcbiAgICAndGFzc2VsJyxcbiAgICAndGFzdGUnLFxuICAgICd0YXN0aW5lc3MnLFxuICAgICd0YXN0aW5nJyxcbiAgICAndGFzdHknLFxuICAgICd0YXR0ZXJlZCcsXG4gICAgJ3RhdHRsZScsXG4gICAgJ3RhdHRsaW5nJyxcbiAgICAndGF0dG9vJyxcbiAgICAndGF1bnQnLFxuICAgICd0YXZlcm4nLFxuICAgICd0aGFuaycsXG4gICAgJ3RoYXQnLFxuICAgICd0aGF3JyxcbiAgICAndGhlYXRlcicsXG4gICAgJ3RoZWF0cmljcycsXG4gICAgJ3RoZWUnLFxuICAgICd0aGVmdCcsXG4gICAgJ3RoZW1lJyxcbiAgICAndGhlb2xvZ3knLFxuICAgICd0aGVvcml6ZScsXG4gICAgJ3RoZXJtYWwnLFxuICAgICd0aGVybW9zJyxcbiAgICAndGhlc2F1cnVzJyxcbiAgICAndGhlc2UnLFxuICAgICd0aGVzaXMnLFxuICAgICd0aGVzcGlhbicsXG4gICAgJ3RoaWNrZW4nLFxuICAgICd0aGlja2V0JyxcbiAgICAndGhpY2tuZXNzJyxcbiAgICAndGhpZXZpbmcnLFxuICAgICd0aGlldmlzaCcsXG4gICAgJ3RoaWdoJyxcbiAgICAndGhpbWJsZScsXG4gICAgJ3RoaW5nJyxcbiAgICAndGhpbmsnLFxuICAgICd0aGlubHknLFxuICAgICd0aGlubmVyJyxcbiAgICAndGhpbm5lc3MnLFxuICAgICd0aGlubmluZycsXG4gICAgJ3RoaXJzdGlseScsXG4gICAgJ3RoaXJzdGluZycsXG4gICAgJ3RoaXJzdHknLFxuICAgICd0aGlydGVlbicsXG4gICAgJ3RoaXJ0eScsXG4gICAgJ3Rob25nJyxcbiAgICAndGhvcm4nLFxuICAgICd0aG9zZScsXG4gICAgJ3Rob3VzYW5kJyxcbiAgICAndGhyYXNoJyxcbiAgICAndGhyZWFkJyxcbiAgICAndGhyZWF0ZW4nLFxuICAgICd0aHJlZWZvbGQnLFxuICAgICd0aHJpZnQnLFxuICAgICd0aHJpbGwnLFxuICAgICd0aHJpdmUnLFxuICAgICd0aHJpdmluZycsXG4gICAgJ3Rocm9hdCcsXG4gICAgJ3Rocm9iYmluZycsXG4gICAgJ3Rocm9uZycsXG4gICAgJ3Rocm90dGxlJyxcbiAgICAndGhyb3dhd2F5JyxcbiAgICAndGhyb3diYWNrJyxcbiAgICAndGhyb3dlcicsXG4gICAgJ3Rocm93aW5nJyxcbiAgICAndGh1ZCcsXG4gICAgJ3RodW1iJyxcbiAgICAndGh1bXBpbmcnLFxuICAgICd0aHVyc2RheScsXG4gICAgJ3RodXMnLFxuICAgICd0aHdhcnRpbmcnLFxuICAgICd0aHlzZWxmJyxcbiAgICAndGlhcmEnLFxuICAgICd0aWJpYScsXG4gICAgJ3RpZGFsJyxcbiAgICAndGlkYml0JyxcbiAgICAndGlkaW5lc3MnLFxuICAgICd0aWRpbmdzJyxcbiAgICAndGlkeScsXG4gICAgJ3RpZ2VyJyxcbiAgICAndGlnaHRlbicsXG4gICAgJ3RpZ2h0bHknLFxuICAgICd0aWdodG5lc3MnLFxuICAgICd0aWdodHJvcGUnLFxuICAgICd0aWdodHdhZCcsXG4gICAgJ3RpZ3Jlc3MnLFxuICAgICd0aWxlJyxcbiAgICAndGlsaW5nJyxcbiAgICAndGlsbCcsXG4gICAgJ3RpbHQnLFxuICAgICd0aW1pZCcsXG4gICAgJ3RpbWluZycsXG4gICAgJ3RpbW90aHknLFxuICAgICd0aW5kZXJib3gnLFxuICAgICd0aW5mb2lsJyxcbiAgICAndGluZ2xlJyxcbiAgICAndGluZ2xpbmcnLFxuICAgICd0aW5nbHknLFxuICAgICd0aW5rZXInLFxuICAgICd0aW5rbGluZycsXG4gICAgJ3RpbnNlbCcsXG4gICAgJ3RpbnNtaXRoJyxcbiAgICAndGludCcsXG4gICAgJ3RpbndvcmsnLFxuICAgICd0aW55JyxcbiAgICAndGlwb2ZmJyxcbiAgICAndGlwcGVkJyxcbiAgICAndGlwcGVyJyxcbiAgICAndGlwcGluZycsXG4gICAgJ3RpcHRvZWluZycsXG4gICAgJ3RpcHRvcCcsXG4gICAgJ3RpcmluZycsXG4gICAgJ3Rpc3N1ZScsXG4gICAgJ3RyYWNlJyxcbiAgICAndHJhY2luZycsXG4gICAgJ3RyYWNrJyxcbiAgICAndHJhY3Rpb24nLFxuICAgICd0cmFjdG9yJyxcbiAgICAndHJhZGUnLFxuICAgICd0cmFkaW5nJyxcbiAgICAndHJhZGl0aW9uJyxcbiAgICAndHJhZmZpYycsXG4gICAgJ3RyYWdlZHknLFxuICAgICd0cmFpbGluZycsXG4gICAgJ3RyYWlsc2lkZScsXG4gICAgJ3RyYWluJyxcbiAgICAndHJhaXRvcicsXG4gICAgJ3RyYW5jZScsXG4gICAgJ3RyYW5xdWlsJyxcbiAgICAndHJhbnNmZXInLFxuICAgICd0cmFuc2Zvcm0nLFxuICAgICd0cmFuc2xhdGUnLFxuICAgICd0cmFuc3BpcmUnLFxuICAgICd0cmFuc3BvcnQnLFxuICAgICd0cmFuc3Bvc2UnLFxuICAgICd0cmFwZG9vcicsXG4gICAgJ3RyYXBlemUnLFxuICAgICd0cmFwZXpvaWQnLFxuICAgICd0cmFwcGVkJyxcbiAgICAndHJhcHBlcicsXG4gICAgJ3RyYXBwaW5nJyxcbiAgICAndHJhcHMnLFxuICAgICd0cmFzaCcsXG4gICAgJ3RyYXZlbCcsXG4gICAgJ3RyYXZlcnNlJyxcbiAgICAndHJhdmVzdHknLFxuICAgICd0cmF5JyxcbiAgICAndHJlYWNoZXJ5JyxcbiAgICAndHJlYWRpbmcnLFxuICAgICd0cmVhZG1pbGwnLFxuICAgICd0cmVhc29uJyxcbiAgICAndHJlYXQnLFxuICAgICd0cmVibGUnLFxuICAgICd0cmVlJyxcbiAgICAndHJla2tlcicsXG4gICAgJ3RyZW1ibGUnLFxuICAgICd0cmVtYmxpbmcnLFxuICAgICd0cmVtb3InLFxuICAgICd0cmVuY2gnLFxuICAgICd0cmVuZCcsXG4gICAgJ3RyZXNwYXNzJyxcbiAgICAndHJpYWdlJyxcbiAgICAndHJpYWwnLFxuICAgICd0cmlhbmdsZScsXG4gICAgJ3RyaWJlc21hbicsXG4gICAgJ3RyaWJ1bmFsJyxcbiAgICAndHJpYnVuZScsXG4gICAgJ3RyaWJ1dGFyeScsXG4gICAgJ3RyaWJ1dGUnLFxuICAgICd0cmljZXBzJyxcbiAgICAndHJpY2tlcnknLFxuICAgICd0cmlja2lseScsXG4gICAgJ3RyaWNraW5nJyxcbiAgICAndHJpY2tsZScsXG4gICAgJ3RyaWNrc3RlcicsXG4gICAgJ3RyaWNreScsXG4gICAgJ3RyaWNvbG9yJyxcbiAgICAndHJpY3ljbGUnLFxuICAgICd0cmlkZW50JyxcbiAgICAndHJpZWQnLFxuICAgICd0cmlmbGUnLFxuICAgICd0cmlmb2NhbHMnLFxuICAgICd0cmlsbGlvbicsXG4gICAgJ3RyaWxvZ3knLFxuICAgICd0cmltZXN0ZXInLFxuICAgICd0cmltbWVyJyxcbiAgICAndHJpbW1pbmcnLFxuICAgICd0cmltbmVzcycsXG4gICAgJ3RyaW5pdHknLFxuICAgICd0cmlvJyxcbiAgICAndHJpcG9kJyxcbiAgICAndHJpcHBpbmcnLFxuICAgICd0cml1bXBoJyxcbiAgICAndHJpdmlhbCcsXG4gICAgJ3Ryb2RkZW4nLFxuICAgICd0cm9sbGluZycsXG4gICAgJ3Ryb21ib25lJyxcbiAgICAndHJvcGh5JyxcbiAgICAndHJvcGljYWwnLFxuICAgICd0cm9waWNzJyxcbiAgICAndHJvdWJsZScsXG4gICAgJ3Ryb3VibGluZycsXG4gICAgJ3Ryb3VnaCcsXG4gICAgJ3Ryb3VzZXJzJyxcbiAgICAndHJvdXQnLFxuICAgICd0cm93ZWwnLFxuICAgICd0cnVjZScsXG4gICAgJ3RydWNrJyxcbiAgICAndHJ1ZmZsZScsXG4gICAgJ3RydW1wJyxcbiAgICAndHJ1bmtzJyxcbiAgICAndHJ1c3RhYmxlJyxcbiAgICAndHJ1c3RlZScsXG4gICAgJ3RydXN0ZnVsJyxcbiAgICAndHJ1c3RpbmcnLFxuICAgICd0cnVzdGxlc3MnLFxuICAgICd0cnV0aCcsXG4gICAgJ3RyeScsXG4gICAgJ3R1YmJ5JyxcbiAgICAndHViZWxlc3MnLFxuICAgICd0dWJ1bGFyJyxcbiAgICAndHVja2luZycsXG4gICAgJ3R1ZXNkYXknLFxuICAgICd0dWcnLFxuICAgICd0dWl0aW9uJyxcbiAgICAndHVsaXAnLFxuICAgICd0dW1ibGUnLFxuICAgICd0dW1ibGluZycsXG4gICAgJ3R1bW15JyxcbiAgICAndHVyYmFuJyxcbiAgICAndHVyYmluZScsXG4gICAgJ3R1cmJvZmFuJyxcbiAgICAndHVyYm9qZXQnLFxuICAgICd0dXJidWxlbnQnLFxuICAgICd0dXJmJyxcbiAgICAndHVya2V5JyxcbiAgICAndHVybW9pbCcsXG4gICAgJ3R1cnJldCcsXG4gICAgJ3R1cnRsZScsXG4gICAgJ3R1c2snLFxuICAgICd0dXRvcicsXG4gICAgJ3R1dHUnLFxuICAgICd0dXgnLFxuICAgICd0d2VhaycsXG4gICAgJ3R3ZWVkJyxcbiAgICAndHdlZXQnLFxuICAgICd0d2VlemVycycsXG4gICAgJ3R3ZWx2ZScsXG4gICAgJ3R3ZW50aWV0aCcsXG4gICAgJ3R3ZW50eScsXG4gICAgJ3R3ZXJwJyxcbiAgICAndHdpY2UnLFxuICAgICd0d2lkZGxlJyxcbiAgICAndHdpZGRsaW5nJyxcbiAgICAndHdpZycsXG4gICAgJ3R3aWxpZ2h0JyxcbiAgICAndHdpbmUnLFxuICAgICd0d2lucycsXG4gICAgJ3R3aXJsJyxcbiAgICAndHdpc3RhYmxlJyxcbiAgICAndHdpc3RlZCcsXG4gICAgJ3R3aXN0ZXInLFxuICAgICd0d2lzdGluZycsXG4gICAgJ3R3aXN0eScsXG4gICAgJ3R3aXRjaCcsXG4gICAgJ3R3aXR0ZXInLFxuICAgICd0eWNvb24nLFxuICAgICd0eWluZycsXG4gICAgJ3R5a2UnLFxuICAgICd1ZGRlcicsXG4gICAgJ3VsdGltYXRlJyxcbiAgICAndWx0aW1hdHVtJyxcbiAgICAndWx0cmEnLFxuICAgICd1bWJpbGljYWwnLFxuICAgICd1bWJyZWxsYScsXG4gICAgJ3VtcGlyZScsXG4gICAgJ3VuYWJhc2hlZCcsXG4gICAgJ3VuYWJsZScsXG4gICAgJ3VuYWRvcm5lZCcsXG4gICAgJ3VuYWR2aXNlZCcsXG4gICAgJ3VuYWZyYWlkJyxcbiAgICAndW5haXJlZCcsXG4gICAgJ3VuYWxpZ25lZCcsXG4gICAgJ3VuYWx0ZXJlZCcsXG4gICAgJ3VuYXJtb3JlZCcsXG4gICAgJ3VuYXNoYW1lZCcsXG4gICAgJ3VuYXVkaXRlZCcsXG4gICAgJ3VuYXdha2UnLFxuICAgICd1bmF3YXJlJyxcbiAgICAndW5iYWtlZCcsXG4gICAgJ3VuYmFsYW5jZScsXG4gICAgJ3VuYmVhdGVuJyxcbiAgICAndW5iZW5kJyxcbiAgICAndW5iZW50JyxcbiAgICAndW5iaWFzZWQnLFxuICAgICd1bmJpdHRlbicsXG4gICAgJ3VuYmxlbmRlZCcsXG4gICAgJ3VuYmxlc3NlZCcsXG4gICAgJ3VuYmxvY2snLFxuICAgICd1bmJvbHRlZCcsXG4gICAgJ3VuYm91bmRlZCcsXG4gICAgJ3VuYm94ZWQnLFxuICAgICd1bmJyYWlkZWQnLFxuICAgICd1bmJyaWRsZScsXG4gICAgJ3VuYnJva2VuJyxcbiAgICAndW5idWNrbGVkJyxcbiAgICAndW5idW5kbGUnLFxuICAgICd1bmJ1cm5lZCcsXG4gICAgJ3VuYnV0dG9uJyxcbiAgICAndW5jYW5ueScsXG4gICAgJ3VuY2FwcGVkJyxcbiAgICAndW5jYXJpbmcnLFxuICAgICd1bmNlcnRhaW4nLFxuICAgICd1bmNoYWluJyxcbiAgICAndW5jaGFuZ2VkJyxcbiAgICAndW5jaGFydGVkJyxcbiAgICAndW5jaGVjaycsXG4gICAgJ3VuY2l2aWwnLFxuICAgICd1bmNsYWQnLFxuICAgICd1bmNsYWltZWQnLFxuICAgICd1bmNsYW1wZWQnLFxuICAgICd1bmNsYXNwJyxcbiAgICAndW5jbGUnLFxuICAgICd1bmNsaXAnLFxuICAgICd1bmNsb2FrJyxcbiAgICAndW5jbG9nJyxcbiAgICAndW5jbG90aGVkJyxcbiAgICAndW5jb2F0ZWQnLFxuICAgICd1bmNvaWxlZCcsXG4gICAgJ3VuY29sb3JlZCcsXG4gICAgJ3VuY29tYmVkJyxcbiAgICAndW5jb21tb24nLFxuICAgICd1bmNvb2tlZCcsXG4gICAgJ3VuY29yaycsXG4gICAgJ3VuY29ycnVwdCcsXG4gICAgJ3VuY291bnRlZCcsXG4gICAgJ3VuY291cGxlJyxcbiAgICAndW5jb3V0aCcsXG4gICAgJ3VuY292ZXInLFxuICAgICd1bmNyb3NzJyxcbiAgICAndW5jcm93bicsXG4gICAgJ3VuY3J1c2hlZCcsXG4gICAgJ3VuY3VyZWQnLFxuICAgICd1bmN1cmlvdXMnLFxuICAgICd1bmN1cmxlZCcsXG4gICAgJ3VuY3V0JyxcbiAgICAndW5kYW1hZ2VkJyxcbiAgICAndW5kYXRlZCcsXG4gICAgJ3VuZGF1bnRlZCcsXG4gICAgJ3VuZGVhZCcsXG4gICAgJ3VuZGVjaWRlZCcsXG4gICAgJ3VuZGVmaW5lZCcsXG4gICAgJ3VuZGVyYWdlJyxcbiAgICAndW5kZXJhcm0nLFxuICAgICd1bmRlcmNvYXQnLFxuICAgICd1bmRlcmNvb2snLFxuICAgICd1bmRlcmN1dCcsXG4gICAgJ3VuZGVyZG9nJyxcbiAgICAndW5kZXJkb25lJyxcbiAgICAndW5kZXJmZWQnLFxuICAgICd1bmRlcmZlZWQnLFxuICAgICd1bmRlcmZvb3QnLFxuICAgICd1bmRlcmdvJyxcbiAgICAndW5kZXJncmFkJyxcbiAgICAndW5kZXJoYW5kJyxcbiAgICAndW5kZXJsaW5lJyxcbiAgICAndW5kZXJsaW5nJyxcbiAgICAndW5kZXJtaW5lJyxcbiAgICAndW5kZXJtb3N0JyxcbiAgICAndW5kZXJwYWlkJyxcbiAgICAndW5kZXJwYXNzJyxcbiAgICAndW5kZXJwYXknLFxuICAgICd1bmRlcnJhdGUnLFxuICAgICd1bmRlcnRha2UnLFxuICAgICd1bmRlcnRvbmUnLFxuICAgICd1bmRlcnRvb2snLFxuICAgICd1bmRlcnRvdycsXG4gICAgJ3VuZGVydXNlJyxcbiAgICAndW5kZXJ3ZWFyJyxcbiAgICAndW5kZXJ3ZW50JyxcbiAgICAndW5kZXJ3aXJlJyxcbiAgICAndW5kZXNpcmVkJyxcbiAgICAndW5kaWx1dGVkJyxcbiAgICAndW5kaXZpZGVkJyxcbiAgICAndW5kb2NrZWQnLFxuICAgICd1bmRvaW5nJyxcbiAgICAndW5kb25lJyxcbiAgICAndW5kcmFmdGVkJyxcbiAgICAndW5kcmVzcycsXG4gICAgJ3VuZHJpbGxlZCcsXG4gICAgJ3VuZHVzdGVkJyxcbiAgICAndW5keWluZycsXG4gICAgJ3VuZWFybmVkJyxcbiAgICAndW5lYXJ0aCcsXG4gICAgJ3VuZWFzZScsXG4gICAgJ3VuZWFzaWx5JyxcbiAgICAndW5lYXN5JyxcbiAgICAndW5lYXRhYmxlJyxcbiAgICAndW5lYXRlbicsXG4gICAgJ3VuZWRpdGVkJyxcbiAgICAndW5lbGVjdGVkJyxcbiAgICAndW5lbmRpbmcnLFxuICAgICd1bmVuZ2FnZWQnLFxuICAgICd1bmVudmllZCcsXG4gICAgJ3VuZXF1YWwnLFxuICAgICd1bmV0aGljYWwnLFxuICAgICd1bmV2ZW4nLFxuICAgICd1bmV4cGlyZWQnLFxuICAgICd1bmV4cG9zZWQnLFxuICAgICd1bmZhaWxpbmcnLFxuICAgICd1bmZhaXInLFxuICAgICd1bmZhc3RlbicsXG4gICAgJ3VuZmF6ZWQnLFxuICAgICd1bmZlZWxpbmcnLFxuICAgICd1bmZpbGVkJyxcbiAgICAndW5maWxsZWQnLFxuICAgICd1bmZpdHRlZCcsXG4gICAgJ3VuZml0dGluZycsXG4gICAgJ3VuZml4YWJsZScsXG4gICAgJ3VuZml4ZWQnLFxuICAgICd1bmZsYXdlZCcsXG4gICAgJ3VuZm9jdXNlZCcsXG4gICAgJ3VuZm9sZCcsXG4gICAgJ3VuZm91bmRlZCcsXG4gICAgJ3VuZnJhbWVkJyxcbiAgICAndW5mcmVlemUnLFxuICAgICd1bmZyb3N0ZWQnLFxuICAgICd1bmZyb3plbicsXG4gICAgJ3VuZnVuZGVkJyxcbiAgICAndW5nbGF6ZWQnLFxuICAgICd1bmdsb3ZlZCcsXG4gICAgJ3VuZ2x1ZScsXG4gICAgJ3VuZ29kbHknLFxuICAgICd1bmdyYWRlZCcsXG4gICAgJ3VuZ3JlYXNlZCcsXG4gICAgJ3VuZ3VhcmRlZCcsXG4gICAgJ3VuZ3VpZGVkJyxcbiAgICAndW5oYXBwaWx5JyxcbiAgICAndW5oYXBweScsXG4gICAgJ3VuaGFybWVkJyxcbiAgICAndW5oZWFsdGh5JyxcbiAgICAndW5oZWFyZCcsXG4gICAgJ3VuaGVhcmluZycsXG4gICAgJ3VuaGVhdGVkJyxcbiAgICAndW5oZWxwZnVsJyxcbiAgICAndW5oaWRkZW4nLFxuICAgICd1bmhpbmdlJyxcbiAgICAndW5oaXRjaGVkJyxcbiAgICAndW5ob2x5JyxcbiAgICAndW5ob29rJyxcbiAgICAndW5pY29ybicsXG4gICAgJ3VuaWN5Y2xlJyxcbiAgICAndW5pZmllZCcsXG4gICAgJ3VuaWZpZXInLFxuICAgICd1bmlmb3JtZWQnLFxuICAgICd1bmlmb3JtbHknLFxuICAgICd1bmlmeScsXG4gICAgJ3VuaW1wZWRlZCcsXG4gICAgJ3VuaW5qdXJlZCcsXG4gICAgJ3VuaW5zdGFsbCcsXG4gICAgJ3VuaW5zdXJlZCcsXG4gICAgJ3VuaW52aXRlZCcsXG4gICAgJ3VuaW9uJyxcbiAgICAndW5pcXVlbHknLFxuICAgICd1bmlzZXh1YWwnLFxuICAgICd1bmlzb24nLFxuICAgICd1bmlzc3VlZCcsXG4gICAgJ3VuaXQnLFxuICAgICd1bml2ZXJzYWwnLFxuICAgICd1bml2ZXJzZScsXG4gICAgJ3VuanVzdGx5JyxcbiAgICAndW5rZW1wdCcsXG4gICAgJ3Vua2luZCcsXG4gICAgJ3Vua25vdHRlZCcsXG4gICAgJ3Vua25vd2luZycsXG4gICAgJ3Vua25vd24nLFxuICAgICd1bmxhY2VkJyxcbiAgICAndW5sYXRjaCcsXG4gICAgJ3VubGF3ZnVsJyxcbiAgICAndW5sZWFkZWQnLFxuICAgICd1bmxlYXJuZWQnLFxuICAgICd1bmxlYXNoJyxcbiAgICAndW5sZXNzJyxcbiAgICAndW5sZXZlbGVkJyxcbiAgICAndW5saWdodGVkJyxcbiAgICAndW5saWthYmxlJyxcbiAgICAndW5saW1pdGVkJyxcbiAgICAndW5saW5lZCcsXG4gICAgJ3VubGlua2VkJyxcbiAgICAndW5saXN0ZWQnLFxuICAgICd1bmxpdCcsXG4gICAgJ3VubGl2YWJsZScsXG4gICAgJ3VubG9hZGVkJyxcbiAgICAndW5sb2FkZXInLFxuICAgICd1bmxvY2tlZCcsXG4gICAgJ3VubG9ja2luZycsXG4gICAgJ3VubG92YWJsZScsXG4gICAgJ3VubG92ZWQnLFxuICAgICd1bmxvdmVseScsXG4gICAgJ3VubG92aW5nJyxcbiAgICAndW5sdWNraWx5JyxcbiAgICAndW5sdWNreScsXG4gICAgJ3VubWFkZScsXG4gICAgJ3VubWFuYWdlZCcsXG4gICAgJ3VubWFubmVkJyxcbiAgICAndW5tYXBwZWQnLFxuICAgICd1bm1hcmtlZCcsXG4gICAgJ3VubWFza2VkJyxcbiAgICAndW5tYXNraW5nJyxcbiAgICAndW5tYXRjaGVkJyxcbiAgICAndW5taW5kZnVsJyxcbiAgICAndW5taXhhYmxlJyxcbiAgICAndW5taXhlZCcsXG4gICAgJ3VubW9sZGVkJyxcbiAgICAndW5tb3JhbCcsXG4gICAgJ3VubW92YWJsZScsXG4gICAgJ3VubW92ZWQnLFxuICAgICd1bm1vdmluZycsXG4gICAgJ3VubmFtYWJsZScsXG4gICAgJ3VubmFtZWQnLFxuICAgICd1bm5hdHVyYWwnLFxuICAgICd1bm5lZWRlZCcsXG4gICAgJ3VubmVydmUnLFxuICAgICd1bm5lcnZpbmcnLFxuICAgICd1bm5vdGljZWQnLFxuICAgICd1bm9wZW5lZCcsXG4gICAgJ3Vub3Bwb3NlZCcsXG4gICAgJ3VucGFjaycsXG4gICAgJ3VucGFkZGVkJyxcbiAgICAndW5wYWlkJyxcbiAgICAndW5wYWludGVkJyxcbiAgICAndW5wYWlyZWQnLFxuICAgICd1bnBhdmVkJyxcbiAgICAndW5wZWVsZWQnLFxuICAgICd1bnBpY2tlZCcsXG4gICAgJ3VucGlsb3RlZCcsXG4gICAgJ3VucGlubmVkJyxcbiAgICAndW5wbGFubmVkJyxcbiAgICAndW5wbGFudGVkJyxcbiAgICAndW5wbGVhc2VkJyxcbiAgICAndW5wbGVkZ2VkJyxcbiAgICAndW5wbG93ZWQnLFxuICAgICd1bnBsdWcnLFxuICAgICd1bnBvcHVsYXInLFxuICAgICd1bnByb3ZlbicsXG4gICAgJ3VucXVvdGUnLFxuICAgICd1bnJhbmtlZCcsXG4gICAgJ3VucmF0ZWQnLFxuICAgICd1bnJhdmVsZWQnLFxuICAgICd1bnJlYWNoZWQnLFxuICAgICd1bnJlYWQnLFxuICAgICd1bnJlYWwnLFxuICAgICd1bnJlZWxpbmcnLFxuICAgICd1bnJlZmluZWQnLFxuICAgICd1bnJlbGF0ZWQnLFxuICAgICd1bnJlbnRlZCcsXG4gICAgJ3VucmVzdCcsXG4gICAgJ3VucmV0aXJlZCcsXG4gICAgJ3VucmV2aXNlZCcsXG4gICAgJ3VucmlnZ2VkJyxcbiAgICAndW5yaXBlJyxcbiAgICAndW5yaXZhbGVkJyxcbiAgICAndW5yb2FzdGVkJyxcbiAgICAndW5yb2JlZCcsXG4gICAgJ3Vucm9sbCcsXG4gICAgJ3VucnVmZmxlZCcsXG4gICAgJ3VucnVseScsXG4gICAgJ3VucnVzaGVkJyxcbiAgICAndW5zYWRkbGUnLFxuICAgICd1bnNhZmUnLFxuICAgICd1bnNhaWQnLFxuICAgICd1bnNhbHRlZCcsXG4gICAgJ3Vuc2F2ZWQnLFxuICAgICd1bnNhdm9yeScsXG4gICAgJ3Vuc2NhdGhlZCcsXG4gICAgJ3Vuc2NlbnRlZCcsXG4gICAgJ3Vuc2NyZXcnLFxuICAgICd1bnNlYWxlZCcsXG4gICAgJ3Vuc2VhdGVkJyxcbiAgICAndW5zZWN1cmVkJyxcbiAgICAndW5zZWVpbmcnLFxuICAgICd1bnNlZW1seScsXG4gICAgJ3Vuc2VlbicsXG4gICAgJ3Vuc2VsZWN0JyxcbiAgICAndW5zZWxmaXNoJyxcbiAgICAndW5zZW50JyxcbiAgICAndW5zZXR0bGVkJyxcbiAgICAndW5zaGFja2xlJyxcbiAgICAndW5zaGFrZW4nLFxuICAgICd1bnNoYXZlZCcsXG4gICAgJ3Vuc2hhdmVuJyxcbiAgICAndW5zaGVhdGhlJyxcbiAgICAndW5zaGlwcGVkJyxcbiAgICAndW5zaWdodGx5JyxcbiAgICAndW5zaWduZWQnLFxuICAgICd1bnNraWxsZWQnLFxuICAgICd1bnNsaWNlZCcsXG4gICAgJ3Vuc21vb3RoJyxcbiAgICAndW5zbmFwJyxcbiAgICAndW5zb2NpYWwnLFxuICAgICd1bnNvaWxlZCcsXG4gICAgJ3Vuc29sZCcsXG4gICAgJ3Vuc29sdmVkJyxcbiAgICAndW5zb3J0ZWQnLFxuICAgICd1bnNwb2lsZWQnLFxuICAgICd1bnNwb2tlbicsXG4gICAgJ3Vuc3RhYmxlJyxcbiAgICAndW5zdGFmZmVkJyxcbiAgICAndW5zdGFtcGVkJyxcbiAgICAndW5zdGVhZHknLFxuICAgICd1bnN0ZXJpbGUnLFxuICAgICd1bnN0aXJyZWQnLFxuICAgICd1bnN0aXRjaCcsXG4gICAgJ3Vuc3RvcHBlZCcsXG4gICAgJ3Vuc3R1Y2snLFxuICAgICd1bnN0dWZmZWQnLFxuICAgICd1bnN0eWxpc2gnLFxuICAgICd1bnN1YnRsZScsXG4gICAgJ3Vuc3VidGx5JyxcbiAgICAndW5zdWl0ZWQnLFxuICAgICd1bnN1cmUnLFxuICAgICd1bnN3b3JuJyxcbiAgICAndW50YWdnZWQnLFxuICAgICd1bnRhaW50ZWQnLFxuICAgICd1bnRha2VuJyxcbiAgICAndW50YW1lZCcsXG4gICAgJ3VudGFuZ2xlZCcsXG4gICAgJ3VudGFwcGVkJyxcbiAgICAndW50YXhlZCcsXG4gICAgJ3VudGhhd2VkJyxcbiAgICAndW50aHJlYWQnLFxuICAgICd1bnRpZHknLFxuICAgICd1bnRpZScsXG4gICAgJ3VudGlsJyxcbiAgICAndW50aW1lZCcsXG4gICAgJ3VudGltZWx5JyxcbiAgICAndW50aXRsZWQnLFxuICAgICd1bnRvYXN0ZWQnLFxuICAgICd1bnRvbGQnLFxuICAgICd1bnRvdWNoZWQnLFxuICAgICd1bnRyYWNrZWQnLFxuICAgICd1bnRyYWluZWQnLFxuICAgICd1bnRyZWF0ZWQnLFxuICAgICd1bnRyaWVkJyxcbiAgICAndW50cmltbWVkJyxcbiAgICAndW50cnVlJyxcbiAgICAndW50cnV0aCcsXG4gICAgJ3VudHVybmVkJyxcbiAgICAndW50d2lzdCcsXG4gICAgJ3VudHlpbmcnLFxuICAgICd1bnVzYWJsZScsXG4gICAgJ3VudXNlZCcsXG4gICAgJ3VudXN1YWwnLFxuICAgICd1bnZhbHVlZCcsXG4gICAgJ3VudmFyaWVkJyxcbiAgICAndW52YXJ5aW5nJyxcbiAgICAndW52ZWlsZWQnLFxuICAgICd1bnZlaWxpbmcnLFxuICAgICd1bnZlbnRlZCcsXG4gICAgJ3VudmlhYmxlJyxcbiAgICAndW52aXNpdGVkJyxcbiAgICAndW52b2NhbCcsXG4gICAgJ3Vud2FudGVkJyxcbiAgICAndW53YXJsaWtlJyxcbiAgICAndW53YXJ5JyxcbiAgICAndW53YXNoZWQnLFxuICAgICd1bndhdGNoZWQnLFxuICAgICd1bndlYXZlJyxcbiAgICAndW53ZWQnLFxuICAgICd1bndlbGNvbWUnLFxuICAgICd1bndlbGwnLFxuICAgICd1bndpZWxkeScsXG4gICAgJ3Vud2lsbGluZycsXG4gICAgJ3Vud2luZCcsXG4gICAgJ3Vud2lyZWQnLFxuICAgICd1bndpdHRpbmcnLFxuICAgICd1bndvbWFubHknLFxuICAgICd1bndvcmxkbHknLFxuICAgICd1bndvcm4nLFxuICAgICd1bndvcnJpZWQnLFxuICAgICd1bndvcnRoeScsXG4gICAgJ3Vud291bmQnLFxuICAgICd1bndvdmVuJyxcbiAgICAndW53cmFwcGVkJyxcbiAgICAndW53cml0dGVuJyxcbiAgICAndW56aXAnLFxuICAgICd1cGJlYXQnLFxuICAgICd1cGNodWNrJyxcbiAgICAndXBjb21pbmcnLFxuICAgICd1cGNvdW50cnknLFxuICAgICd1cGRhdGUnLFxuICAgICd1cGZyb250JyxcbiAgICAndXBncmFkZScsXG4gICAgJ3VwaGVhdmFsJyxcbiAgICAndXBoZWxkJyxcbiAgICAndXBoaWxsJyxcbiAgICAndXBob2xkJyxcbiAgICAndXBsaWZ0ZWQnLFxuICAgICd1cGxpZnRpbmcnLFxuICAgICd1cGxvYWQnLFxuICAgICd1cG9uJyxcbiAgICAndXBwZXInLFxuICAgICd1cHJpZ2h0JyxcbiAgICAndXByaXNpbmcnLFxuICAgICd1cHJpdmVyJyxcbiAgICAndXByb2FyJyxcbiAgICAndXByb290JyxcbiAgICAndXBzY2FsZScsXG4gICAgJ3Vwc2lkZScsXG4gICAgJ3Vwc3RhZ2UnLFxuICAgICd1cHN0YWlycycsXG4gICAgJ3Vwc3RhcnQnLFxuICAgICd1cHN0YXRlJyxcbiAgICAndXBzdHJlYW0nLFxuICAgICd1cHN0cm9rZScsXG4gICAgJ3Vwc3dpbmcnLFxuICAgICd1cHRha2UnLFxuICAgICd1cHRpZ2h0JyxcbiAgICAndXB0b3duJyxcbiAgICAndXB0dXJuZWQnLFxuICAgICd1cHdhcmQnLFxuICAgICd1cHdpbmQnLFxuICAgICd1cmFuaXVtJyxcbiAgICAndXJiYW4nLFxuICAgICd1cmNoaW4nLFxuICAgICd1cmV0aGFuZScsXG4gICAgJ3VyZ2VuY3knLFxuICAgICd1cmdlbnQnLFxuICAgICd1cmdpbmcnLFxuICAgICd1cm9sb2dpc3QnLFxuICAgICd1cm9sb2d5JyxcbiAgICAndXNhYmxlJyxcbiAgICAndXNhZ2UnLFxuICAgICd1c2VhYmxlJyxcbiAgICAndXNlZCcsXG4gICAgJ3VzZWxlc3NseScsXG4gICAgJ3VzZXInLFxuICAgICd1c2hlcicsXG4gICAgJ3VzdWFsJyxcbiAgICAndXRlbnNpbCcsXG4gICAgJ3V0aWxpdHknLFxuICAgICd1dGlsaXplJyxcbiAgICAndXRtb3N0JyxcbiAgICAndXRvcGlhJyxcbiAgICAndXR0ZXInLFxuICAgICd2YWNhbmN5JyxcbiAgICAndmFjYW50JyxcbiAgICAndmFjYXRlJyxcbiAgICAndmFjYXRpb24nLFxuICAgICd2YWdhYm9uZCcsXG4gICAgJ3ZhZ3JhbmN5JyxcbiAgICAndmFncmFudGx5JyxcbiAgICAndmFndWVseScsXG4gICAgJ3ZhZ3VlbmVzcycsXG4gICAgJ3ZhbGlhbnQnLFxuICAgICd2YWxpZCcsXG4gICAgJ3ZhbGl1bScsXG4gICAgJ3ZhbGxleScsXG4gICAgJ3ZhbHVhYmxlcycsXG4gICAgJ3ZhbHVlJyxcbiAgICAndmFuaWxsYScsXG4gICAgJ3ZhbmlzaCcsXG4gICAgJ3Zhbml0eScsXG4gICAgJ3ZhbnF1aXNoJyxcbiAgICAndmFudGFnZScsXG4gICAgJ3ZhcG9yaXplcicsXG4gICAgJ3ZhcmlhYmxlJyxcbiAgICAndmFyaWFibHknLFxuICAgICd2YXJpZWQnLFxuICAgICd2YXJpZXR5JyxcbiAgICAndmFyaW91cycsXG4gICAgJ3Zhcm1pbnQnLFxuICAgICd2YXJuaXNoJyxcbiAgICAndmFyc2l0eScsXG4gICAgJ3ZhcnlpbmcnLFxuICAgICd2YXNjdWxhcicsXG4gICAgJ3Zhc2VsaW5lJyxcbiAgICAndmFzdGx5JyxcbiAgICAndmFzdG5lc3MnLFxuICAgICd2ZWFsJyxcbiAgICAndmVnYW4nLFxuICAgICd2ZWdnaWUnLFxuICAgICd2ZWhpY3VsYXInLFxuICAgICd2ZWxjcm8nLFxuICAgICd2ZWxvY2l0eScsXG4gICAgJ3ZlbHZldCcsXG4gICAgJ3ZlbmRldHRhJyxcbiAgICAndmVuZGluZycsXG4gICAgJ3ZlbmRvcicsXG4gICAgJ3ZlbmVlcmluZycsXG4gICAgJ3ZlbmdlZnVsJyxcbiAgICAndmVub21vdXMnLFxuICAgICd2ZW50cmljbGUnLFxuICAgICd2ZW50dXJlJyxcbiAgICAndmVudWUnLFxuICAgICd2ZW51cycsXG4gICAgJ3ZlcmJhbGl6ZScsXG4gICAgJ3ZlcmJhbGx5JyxcbiAgICAndmVyYm9zZScsXG4gICAgJ3ZlcmRpY3QnLFxuICAgICd2ZXJpZnknLFxuICAgICd2ZXJzZScsXG4gICAgJ3ZlcnNpb24nLFxuICAgICd2ZXJzdXMnLFxuICAgICd2ZXJ0ZWJyYWUnLFxuICAgICd2ZXJ0aWNhbCcsXG4gICAgJ3ZlcnRpZ28nLFxuICAgICd2ZXJ5JyxcbiAgICAndmVzc2VsJyxcbiAgICAndmVzdCcsXG4gICAgJ3ZldGVyYW4nLFxuICAgICd2ZXRvJyxcbiAgICAndmV4aW5nbHknLFxuICAgICd2aWFiaWxpdHknLFxuICAgICd2aWFibGUnLFxuICAgICd2aWJlcycsXG4gICAgJ3ZpY2UnLFxuICAgICd2aWNpbml0eScsXG4gICAgJ3ZpY3RvcnknLFxuICAgICd2aWRlbycsXG4gICAgJ3ZpZXdhYmxlJyxcbiAgICAndmlld2VyJyxcbiAgICAndmlld2luZycsXG4gICAgJ3ZpZXdsZXNzJyxcbiAgICAndmlld3BvaW50JyxcbiAgICAndmlnb3JvdXMnLFxuICAgICd2aWxsYWdlJyxcbiAgICAndmlsbGFpbicsXG4gICAgJ3ZpbmRpY2F0ZScsXG4gICAgJ3ZpbmV5YXJkJyxcbiAgICAndmludGFnZScsXG4gICAgJ3Zpb2xhdGUnLFxuICAgICd2aW9sYXRpb24nLFxuICAgICd2aW9sYXRvcicsXG4gICAgJ3Zpb2xldCcsXG4gICAgJ3Zpb2xpbicsXG4gICAgJ3ZpcGVyJyxcbiAgICAndmlyYWwnLFxuICAgICd2aXJ0dWFsJyxcbiAgICAndmlydHVvdXMnLFxuICAgICd2aXJ1cycsXG4gICAgJ3Zpc2EnLFxuICAgICd2aXNjb3NpdHknLFxuICAgICd2aXNjb3VzJyxcbiAgICAndmlzZWxpa2UnLFxuICAgICd2aXNpYmxlJyxcbiAgICAndmlzaWJseScsXG4gICAgJ3Zpc2lvbicsXG4gICAgJ3Zpc2l0aW5nJyxcbiAgICAndmlzaXRvcicsXG4gICAgJ3Zpc29yJyxcbiAgICAndmlzdGEnLFxuICAgICd2aXRhbGl0eScsXG4gICAgJ3ZpdGFsaXplJyxcbiAgICAndml0YWxseScsXG4gICAgJ3ZpdGFtaW5zJyxcbiAgICAndml2YWNpb3VzJyxcbiAgICAndml2aWRseScsXG4gICAgJ3ZpdmlkbmVzcycsXG4gICAgJ3ZpeGVuJyxcbiAgICAndm9jYWxpc3QnLFxuICAgICd2b2NhbGl6ZScsXG4gICAgJ3ZvY2FsbHknLFxuICAgICd2b2NhdGlvbicsXG4gICAgJ3ZvaWNlJyxcbiAgICAndm9pY2luZycsXG4gICAgJ3ZvaWQnLFxuICAgICd2b2xhdGlsZScsXG4gICAgJ3ZvbGxleScsXG4gICAgJ3ZvbHRhZ2UnLFxuICAgICd2b2x1bWVzJyxcbiAgICAndm90ZXInLFxuICAgICd2b3RpbmcnLFxuICAgICd2b3VjaGVyJyxcbiAgICAndm93ZWQnLFxuICAgICd2b3dlbCcsXG4gICAgJ3ZveWFnZScsXG4gICAgJ3dhY2tpbmVzcycsXG4gICAgJ3dhZCcsXG4gICAgJ3dhZmVyJyxcbiAgICAnd2FmZmxlJyxcbiAgICAnd2FnZWQnLFxuICAgICd3YWdlcicsXG4gICAgJ3dhZ2VzJyxcbiAgICAnd2FnZ2xlJyxcbiAgICAnd2Fnb24nLFxuICAgICd3YWtlJyxcbiAgICAnd2FraW5nJyxcbiAgICAnd2FsaycsXG4gICAgJ3dhbG1hcnQnLFxuICAgICd3YWxudXQnLFxuICAgICd3YWxydXMnLFxuICAgICd3YWx0eicsXG4gICAgJ3dhbmQnLFxuICAgICd3YW5uYWJlJyxcbiAgICAnd2FudGVkJyxcbiAgICAnd2FudGluZycsXG4gICAgJ3dhc2FiaScsXG4gICAgJ3dhc2hhYmxlJyxcbiAgICAnd2FzaGJhc2luJyxcbiAgICAnd2FzaGJvYXJkJyxcbiAgICAnd2FzaGJvd2wnLFxuICAgICd3YXNoY2xvdGgnLFxuICAgICd3YXNoZGF5JyxcbiAgICAnd2FzaGVkJyxcbiAgICAnd2FzaGVyJyxcbiAgICAnd2FzaGhvdXNlJyxcbiAgICAnd2FzaGluZycsXG4gICAgJ3dhc2hvdXQnLFxuICAgICd3YXNocm9vbScsXG4gICAgJ3dhc2hzdGFuZCcsXG4gICAgJ3dhc2h0dWInLFxuICAgICd3YXNwJyxcbiAgICAnd2FzdGluZycsXG4gICAgJ3dhdGNoJyxcbiAgICAnd2F0ZXInLFxuICAgICd3YXZpbmVzcycsXG4gICAgJ3dhdmluZycsXG4gICAgJ3dhdnknLFxuICAgICd3aGFja2luZycsXG4gICAgJ3doYWNreScsXG4gICAgJ3doYW0nLFxuICAgICd3aGFyZicsXG4gICAgJ3doZWF0JyxcbiAgICAnd2hlbmV2ZXInLFxuICAgICd3aGlmZicsXG4gICAgJ3doaW1zaWNhbCcsXG4gICAgJ3doaW5ueScsXG4gICAgJ3doaW55JyxcbiAgICAnd2hpc2tpbmcnLFxuICAgICd3aG9ldmVyJyxcbiAgICAnd2hvbGUnLFxuICAgICd3aG9tZXZlcicsXG4gICAgJ3dob29wZWUnLFxuICAgICd3aG9vcGluZycsXG4gICAgJ3dob29wcycsXG4gICAgJ3doeScsXG4gICAgJ3dpY2snLFxuICAgICd3aWRlbHknLFxuICAgICd3aWRlbicsXG4gICAgJ3dpZGdldCcsXG4gICAgJ3dpZG93JyxcbiAgICAnd2lkdGgnLFxuICAgICd3aWVsZGFibGUnLFxuICAgICd3aWVsZGVyJyxcbiAgICAnd2lmZScsXG4gICAgJ3dpZmknLFxuICAgICd3aWtpcGVkaWEnLFxuICAgICd3aWxkY2FyZCcsXG4gICAgJ3dpbGRjYXQnLFxuICAgICd3aWxkZXInLFxuICAgICd3aWxkZmlyZScsXG4gICAgJ3dpbGRmb3dsJyxcbiAgICAnd2lsZGxhbmQnLFxuICAgICd3aWxkbGlmZScsXG4gICAgJ3dpbGRseScsXG4gICAgJ3dpbGRuZXNzJyxcbiAgICAnd2lsbGVkJyxcbiAgICAnd2lsbGZ1bGx5JyxcbiAgICAnd2lsbGluZycsXG4gICAgJ3dpbGxvdycsXG4gICAgJ3dpbGxwb3dlcicsXG4gICAgJ3dpbHQnLFxuICAgICd3aW1wJyxcbiAgICAnd2luY2UnLFxuICAgICd3aW5jaW5nJyxcbiAgICAnd2luZCcsXG4gICAgJ3dpbmcnLFxuICAgICd3aW5raW5nJyxcbiAgICAnd2lubmVyJyxcbiAgICAnd2lubmluZ3MnLFxuICAgICd3aW50ZXInLFxuICAgICd3aXBlJyxcbiAgICAnd2lyZWQnLFxuICAgICd3aXJlbGVzcycsXG4gICAgJ3dpcmluZycsXG4gICAgJ3dpcnknLFxuICAgICd3aXNkb20nLFxuICAgICd3aXNlJyxcbiAgICAnd2lzaCcsXG4gICAgJ3dpc3BsaWtlJyxcbiAgICAnd2lzcHknLFxuICAgICd3aXN0ZnVsJyxcbiAgICAnd2l6YXJkJyxcbiAgICAnd29iYmxlJyxcbiAgICAnd29iYmxpbmcnLFxuICAgICd3b2JibHknLFxuICAgICd3b2snLFxuICAgICd3b2xmJyxcbiAgICAnd29sdmVyaW5lJyxcbiAgICAnd29tYW5ob29kJyxcbiAgICAnd29tYW5raW5kJyxcbiAgICAnd29tYW5sZXNzJyxcbiAgICAnd29tYW5saWtlJyxcbiAgICAnd29tYW5seScsXG4gICAgJ3dvbWInLFxuICAgICd3b29mJyxcbiAgICAnd29vaW5nJyxcbiAgICAnd29vbCcsXG4gICAgJ3dvb3p5JyxcbiAgICAnd29yZCcsXG4gICAgJ3dvcmsnLFxuICAgICd3b3JyaWVkJyxcbiAgICAnd29ycmllcicsXG4gICAgJ3dvcnJpc29tZScsXG4gICAgJ3dvcnJ5JyxcbiAgICAnd29yc2VuaW5nJyxcbiAgICAnd29yc2hpcGVyJyxcbiAgICAnd29yc3QnLFxuICAgICd3b3VuZCcsXG4gICAgJ3dvdmVuJyxcbiAgICAnd293JyxcbiAgICAnd3JhbmdsZScsXG4gICAgJ3dyYXRoJyxcbiAgICAnd3JlYXRoJyxcbiAgICAnd3JlY2thZ2UnLFxuICAgICd3cmVja2VyJyxcbiAgICAnd3JlY2tpbmcnLFxuICAgICd3cmVuY2gnLFxuICAgICd3cmlnZ2xlJyxcbiAgICAnd3JpZ2dseScsXG4gICAgJ3dyaW5rbGUnLFxuICAgICd3cmlua2x5JyxcbiAgICAnd3Jpc3QnLFxuICAgICd3cml0aW5nJyxcbiAgICAnd3JpdHRlbicsXG4gICAgJ3dyb25nZG9lcicsXG4gICAgJ3dyb25nZWQnLFxuICAgICd3cm9uZ2Z1bCcsXG4gICAgJ3dyb25nbHknLFxuICAgICd3cm9uZ25lc3MnLFxuICAgICd3cm91Z2h0JyxcbiAgICAneGJveCcsXG4gICAgJ3hlcm94JyxcbiAgICAneWFob28nLFxuICAgICd5YW0nLFxuICAgICd5YW5raW5nJyxcbiAgICAneWFwcGluZycsXG4gICAgJ3lhcmQnLFxuICAgICd5YXJuJyxcbiAgICAneWVhaCcsXG4gICAgJ3llYXJib29rJyxcbiAgICAneWVhcmxpbmcnLFxuICAgICd5ZWFybHknLFxuICAgICd5ZWFybmluZycsXG4gICAgJ3llYXN0JyxcbiAgICAneWVsbGluZycsXG4gICAgJ3llbHAnLFxuICAgICd5ZW4nLFxuICAgICd5ZXN0ZXJkYXknLFxuICAgICd5aWRkaXNoJyxcbiAgICAneWllbGQnLFxuICAgICd5aW4nLFxuICAgICd5aXBwZWUnLFxuICAgICd5by15bycsXG4gICAgJ3lvZGVsJyxcbiAgICAneW9nYScsXG4gICAgJ3lvZ3VydCcsXG4gICAgJ3lvbmRlcicsXG4gICAgJ3lveW8nLFxuICAgICd5dW1teScsXG4gICAgJ3phcCcsXG4gICAgJ3plYWxvdXMnLFxuICAgICd6ZWJyYScsXG4gICAgJ3plbicsXG4gICAgJ3plcHBlbGluJyxcbiAgICAnemVybycsXG4gICAgJ3plc3RmdWxseScsXG4gICAgJ3plc3R5JyxcbiAgICAnemlnemFnZ2VkJyxcbiAgICAnemlwZmlsZScsXG4gICAgJ3ppcHBpbmcnLFxuICAgICd6aXBweScsXG4gICAgJ3ppcHMnLFxuICAgICd6aXQnLFxuICAgICd6b2RpYWMnLFxuICAgICd6b21iaWUnLFxuICAgICd6b25lJyxcbiAgICAnem9uaW5nJyxcbiAgICAnem9va2VlcGVyJyxcbiAgICAnem9vbG9naXN0JyxcbiAgICAnem9vbG9neScsXG4gICAgJ3pvb20nLFxuXTtcbiIsImltcG9ydCB7IEJhc2VSZXNwb25zZSB9IGZyb20gJy4uL3Jlc3BvbnNlL2Jhc2VSZXNwb25zZSc7XG5cbmV4cG9ydCBjbGFzcyBDYXJkQXBpIGV4dGVuZHMgQmFzZVJlc3BvbnNlIHtcbiAgICBjYXJkaG9sZGVyTmFtZTogc3RyaW5nO1xuICAgIGJyYW5kOiBzdHJpbmc7XG4gICAgbnVtYmVyOiBzdHJpbmc7XG4gICAgZXhwTW9udGg6IHN0cmluZztcbiAgICBleHBZZWFyOiBzdHJpbmc7XG4gICAgY29kZTogc3RyaW5nO1xuXG4gICAgY29uc3RydWN0b3IoZGF0YTogYW55ID0gbnVsbCkge1xuICAgICAgICBzdXBlcihkYXRhKTtcbiAgICAgICAgaWYgKGRhdGEgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2FyZGhvbGRlck5hbWUgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ0NhcmRob2xkZXJOYW1lJyk7XG4gICAgICAgIHRoaXMuYnJhbmQgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ0JyYW5kJyk7XG4gICAgICAgIHRoaXMubnVtYmVyID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdOdW1iZXInKTtcbiAgICAgICAgdGhpcy5leHBNb250aCA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnRXhwTW9udGgnKTtcbiAgICAgICAgdGhpcy5leHBZZWFyID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdFeHBZZWFyJyk7XG4gICAgICAgIHRoaXMuY29kZSA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnQ29kZScpO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IEJhc2VSZXNwb25zZSB9IGZyb20gJy4uL3Jlc3BvbnNlL2Jhc2VSZXNwb25zZSc7XG5cbmltcG9ydCB7IEZpZWxkVHlwZSB9IGZyb20gJy4uLy4uL2VudW1zL2ZpZWxkVHlwZSc7XG5pbXBvcnQgeyBMaW5rZWRJZFR5cGUgfSBmcm9tICcuLi8uLi9lbnVtcy9saW5rZWRJZFR5cGUnO1xuXG5leHBvcnQgY2xhc3MgRmllbGRBcGkgZXh0ZW5kcyBCYXNlUmVzcG9uc2Uge1xuICAgIG5hbWU6IHN0cmluZztcbiAgICB2YWx1ZTogc3RyaW5nO1xuICAgIHR5cGU6IEZpZWxkVHlwZTtcbiAgICBsaW5rZWRJZDogTGlua2VkSWRUeXBlO1xuXG4gICAgY29uc3RydWN0b3IoZGF0YTogYW55ID0gbnVsbCkge1xuICAgICAgICBzdXBlcihkYXRhKTtcbiAgICAgICAgaWYgKGRhdGEgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudHlwZSA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnVHlwZScpO1xuICAgICAgICB0aGlzLm5hbWUgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ05hbWUnKTtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnVmFsdWUnKTtcbiAgICAgICAgdGhpcy5saW5rZWRJZCA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnbGlua2VkSWQnKTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBCYXNlUmVzcG9uc2UgfSBmcm9tICcuLi9yZXNwb25zZS9iYXNlUmVzcG9uc2UnO1xuXG5leHBvcnQgY2xhc3MgSWRlbnRpdHlBcGkgZXh0ZW5kcyBCYXNlUmVzcG9uc2Uge1xuICAgIHRpdGxlOiBzdHJpbmc7XG4gICAgZmlyc3ROYW1lOiBzdHJpbmc7XG4gICAgbWlkZGxlTmFtZTogc3RyaW5nO1xuICAgIGxhc3ROYW1lOiBzdHJpbmc7XG4gICAgYWRkcmVzczE6IHN0cmluZztcbiAgICBhZGRyZXNzMjogc3RyaW5nO1xuICAgIGFkZHJlc3MzOiBzdHJpbmc7XG4gICAgY2l0eTogc3RyaW5nO1xuICAgIHN0YXRlOiBzdHJpbmc7XG4gICAgcG9zdGFsQ29kZTogc3RyaW5nO1xuICAgIGNvdW50cnk6IHN0cmluZztcbiAgICBjb21wYW55OiBzdHJpbmc7XG4gICAgZW1haWw6IHN0cmluZztcbiAgICBwaG9uZTogc3RyaW5nO1xuICAgIHNzbjogc3RyaW5nO1xuICAgIHVzZXJuYW1lOiBzdHJpbmc7XG4gICAgcGFzc3BvcnROdW1iZXI6IHN0cmluZztcbiAgICBsaWNlbnNlTnVtYmVyOiBzdHJpbmc7XG5cbiAgICBjb25zdHJ1Y3RvcihkYXRhOiBhbnkgPSBudWxsKSB7XG4gICAgICAgIHN1cGVyKGRhdGEpO1xuICAgICAgICBpZiAoZGF0YSA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50aXRsZSA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnVGl0bGUnKTtcbiAgICAgICAgdGhpcy5maXJzdE5hbWUgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ0ZpcnN0TmFtZScpO1xuICAgICAgICB0aGlzLm1pZGRsZU5hbWUgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ01pZGRsZU5hbWUnKTtcbiAgICAgICAgdGhpcy5sYXN0TmFtZSA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnTGFzdE5hbWUnKTtcbiAgICAgICAgdGhpcy5hZGRyZXNzMSA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnQWRkcmVzczEnKTtcbiAgICAgICAgdGhpcy5hZGRyZXNzMiA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnQWRkcmVzczInKTtcbiAgICAgICAgdGhpcy5hZGRyZXNzMyA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnQWRkcmVzczMnKTtcbiAgICAgICAgdGhpcy5jaXR5ID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdDaXR5Jyk7XG4gICAgICAgIHRoaXMuc3RhdGUgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ1N0YXRlJyk7XG4gICAgICAgIHRoaXMucG9zdGFsQ29kZSA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnUG9zdGFsQ29kZScpO1xuICAgICAgICB0aGlzLmNvdW50cnkgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ0NvdW50cnknKTtcbiAgICAgICAgdGhpcy5jb21wYW55ID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdDb21wYW55Jyk7XG4gICAgICAgIHRoaXMuZW1haWwgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ0VtYWlsJyk7XG4gICAgICAgIHRoaXMucGhvbmUgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ1Bob25lJyk7XG4gICAgICAgIHRoaXMuc3NuID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdTU04nKTtcbiAgICAgICAgdGhpcy51c2VybmFtZSA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnVXNlcm5hbWUnKTtcbiAgICAgICAgdGhpcy5wYXNzcG9ydE51bWJlciA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnUGFzc3BvcnROdW1iZXInKTtcbiAgICAgICAgdGhpcy5saWNlbnNlTnVtYmVyID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdMaWNlbnNlTnVtYmVyJyk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgQmFzZVJlc3BvbnNlIH0gZnJvbSAnLi4vcmVzcG9uc2UvYmFzZVJlc3BvbnNlJztcblxuaW1wb3J0IHsgTG9naW5VcmlBcGkgfSBmcm9tICcuL2xvZ2luVXJpQXBpJztcblxuZXhwb3J0IGNsYXNzIExvZ2luQXBpIGV4dGVuZHMgQmFzZVJlc3BvbnNlIHtcbiAgICB1cmlzOiBMb2dpblVyaUFwaVtdO1xuICAgIHVzZXJuYW1lOiBzdHJpbmc7XG4gICAgcGFzc3dvcmQ6IHN0cmluZztcbiAgICBwYXNzd29yZFJldmlzaW9uRGF0ZTogc3RyaW5nO1xuICAgIHRvdHA6IHN0cmluZztcbiAgICBhdXRvZmlsbE9uUGFnZUxvYWQ6IGJvb2xlYW47XG5cbiAgICBjb25zdHJ1Y3RvcihkYXRhOiBhbnkgPSBudWxsKSB7XG4gICAgICAgIHN1cGVyKGRhdGEpO1xuICAgICAgICBpZiAoZGF0YSA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51c2VybmFtZSA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnVXNlcm5hbWUnKTtcbiAgICAgICAgdGhpcy5wYXNzd29yZCA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnUGFzc3dvcmQnKTtcbiAgICAgICAgdGhpcy5wYXNzd29yZFJldmlzaW9uRGF0ZSA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnUGFzc3dvcmRSZXZpc2lvbkRhdGUnKTtcbiAgICAgICAgdGhpcy50b3RwID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdUb3RwJyk7XG4gICAgICAgIHRoaXMuYXV0b2ZpbGxPblBhZ2VMb2FkID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdBdXRvZmlsbE9uUGFnZUxvYWQnKTtcblxuICAgICAgICBjb25zdCB1cmlzID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdVcmlzJyk7XG4gICAgICAgIGlmICh1cmlzICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMudXJpcyA9IHVyaXMubWFwKCh1OiBhbnkpID0+IG5ldyBMb2dpblVyaUFwaSh1KSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgeyBCYXNlUmVzcG9uc2UgfSBmcm9tICcuLi9yZXNwb25zZS9iYXNlUmVzcG9uc2UnO1xuXG5pbXBvcnQgeyBVcmlNYXRjaFR5cGUgfSBmcm9tICcuLi8uLi9lbnVtcy91cmlNYXRjaFR5cGUnO1xuXG5leHBvcnQgY2xhc3MgTG9naW5VcmlBcGkgZXh0ZW5kcyBCYXNlUmVzcG9uc2Uge1xuICAgIHVyaTogc3RyaW5nO1xuICAgIG1hdGNoOiBVcmlNYXRjaFR5cGUgPSBudWxsO1xuXG4gICAgY29uc3RydWN0b3IoZGF0YTogYW55ID0gbnVsbCkge1xuICAgICAgICBzdXBlcihkYXRhKTtcbiAgICAgICAgaWYgKGRhdGEgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudXJpID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdVcmknKTtcbiAgICAgICAgY29uc3QgbWF0Y2ggPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ01hdGNoJyk7XG4gICAgICAgIHRoaXMubWF0Y2ggPSBtYXRjaCAhPSBudWxsID8gbWF0Y2ggOiBudWxsO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IEJhc2VSZXNwb25zZSB9IGZyb20gJy4uL3Jlc3BvbnNlL2Jhc2VSZXNwb25zZSc7XG5cbmV4cG9ydCBjbGFzcyBQZXJtaXNzaW9uc0FwaSBleHRlbmRzIEJhc2VSZXNwb25zZSB7XG4gICAgYWNjZXNzRXZlbnRMb2dzOiBib29sZWFuO1xuICAgIGFjY2Vzc0ltcG9ydEV4cG9ydDogYm9vbGVhbjtcbiAgICBhY2Nlc3NSZXBvcnRzOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIFNlcCAyOSAyMDIxOiBUaGlzIHBlcm1pc3Npb24gaGFzIGJlZW4gc3BsaXQgb3V0IHRvIGBjcmVhdGVOZXdDb2xsZWN0aW9uc2AsIGBlZGl0QW55Q29sbGVjdGlvbmAsIGFuZFxuICAgICAqIGBkZWxldGVBbnlDb2xsZWN0aW9uYC4gSXQgZXhpc3RzIGhlcmUgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGggU2VydmVyIHZlcnNpb25zIDw9IDEuNDMuMFxuICAgICAqL1xuICAgIG1hbmFnZUFsbENvbGxlY3Rpb25zOiBib29sZWFuO1xuICAgIGNyZWF0ZU5ld0NvbGxlY3Rpb25zOiBib29sZWFuO1xuICAgIGVkaXRBbnlDb2xsZWN0aW9uOiBib29sZWFuO1xuICAgIGRlbGV0ZUFueUNvbGxlY3Rpb246IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgU2VwIDI5IDIwMjE6IFRoaXMgcGVybWlzc2lvbiBoYXMgYmVlbiBzcGxpdCBvdXQgdG8gYGVkaXRBc3NpZ25lZENvbGxlY3Rpb25zYCBhbmRcbiAgICAgKiBgZGVsZXRlQXNzaWduZWRDb2xsZWN0aW9uc2AuIEl0IGV4aXN0cyBoZXJlIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIFNlcnZlciB2ZXJzaW9ucyA8PSAxLjQzLjBcbiAgICAgKi9cbiAgICBtYW5hZ2VBc3NpZ25lZENvbGxlY3Rpb25zOiBib29sZWFuO1xuICAgIGVkaXRBc3NpZ25lZENvbGxlY3Rpb25zOiBib29sZWFuO1xuICAgIGRlbGV0ZUFzc2lnbmVkQ29sbGVjdGlvbnM6IGJvb2xlYW47XG4gICAgbWFuYWdlQ2lwaGVyczogYm9vbGVhbjtcbiAgICBtYW5hZ2VHcm91cHM6IGJvb2xlYW47XG4gICAgbWFuYWdlU3NvOiBib29sZWFuO1xuICAgIG1hbmFnZVBvbGljaWVzOiBib29sZWFuO1xuICAgIG1hbmFnZVVzZXJzOiBib29sZWFuO1xuICAgIG1hbmFnZVJlc2V0UGFzc3dvcmQ6IGJvb2xlYW47XG5cbiAgICBjb25zdHJ1Y3RvcihkYXRhOiBhbnkgPSBudWxsKSB7XG4gICAgICAgIHN1cGVyKGRhdGEpO1xuICAgICAgICBpZiAoZGF0YSA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFjY2Vzc0V2ZW50TG9ncyA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnQWNjZXNzRXZlbnRMb2dzJyk7XG4gICAgICAgIHRoaXMuYWNjZXNzSW1wb3J0RXhwb3J0ID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdBY2Nlc3NJbXBvcnRFeHBvcnQnKTtcbiAgICAgICAgdGhpcy5hY2Nlc3NSZXBvcnRzID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdBY2Nlc3NSZXBvcnRzJyk7XG5cbiAgICAgICAgLy8gRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGggU2VydmVyIDw9IDEuNDMuMFxuICAgICAgICB0aGlzLm1hbmFnZUFsbENvbGxlY3Rpb25zID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdNYW5hZ2VBbGxDb2xsZWN0aW9ucycpO1xuICAgICAgICB0aGlzLm1hbmFnZUFzc2lnbmVkQ29sbGVjdGlvbnMgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ01hbmFnZUFzc2lnbmVkQ29sbGVjdGlvbnMnKTtcblxuICAgICAgICB0aGlzLmNyZWF0ZU5ld0NvbGxlY3Rpb25zID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdDcmVhdGVOZXdDb2xsZWN0aW9ucycpO1xuICAgICAgICB0aGlzLmVkaXRBbnlDb2xsZWN0aW9uID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdFZGl0QW55Q29sbGVjdGlvbicpO1xuICAgICAgICB0aGlzLmRlbGV0ZUFueUNvbGxlY3Rpb24gPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ0RlbGV0ZUFueUNvbGxlY3Rpb24nKTtcbiAgICAgICAgdGhpcy5lZGl0QXNzaWduZWRDb2xsZWN0aW9ucyA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnRWRpdEFzc2lnbmVkQ29sbGVjdGlvbnMnKTtcbiAgICAgICAgdGhpcy5kZWxldGVBc3NpZ25lZENvbGxlY3Rpb25zID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdEZWxldGVBc3NpZ25lZENvbGxlY3Rpb25zJyk7XG5cbiAgICAgICAgdGhpcy5tYW5hZ2VDaXBoZXJzID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdNYW5hZ2VDaXBoZXJzJyk7XG4gICAgICAgIHRoaXMubWFuYWdlR3JvdXBzID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdNYW5hZ2VHcm91cHMnKTtcbiAgICAgICAgdGhpcy5tYW5hZ2VTc28gPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ01hbmFnZVNzbycpO1xuICAgICAgICB0aGlzLm1hbmFnZVBvbGljaWVzID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdNYW5hZ2VQb2xpY2llcycpO1xuICAgICAgICB0aGlzLm1hbmFnZVVzZXJzID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdNYW5hZ2VVc2VycycpO1xuICAgICAgICB0aGlzLm1hbmFnZVJlc2V0UGFzc3dvcmQgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ01hbmFnZVJlc2V0UGFzc3dvcmQnKTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBCYXNlUmVzcG9uc2UgfSBmcm9tICcuLi9yZXNwb25zZS9iYXNlUmVzcG9uc2UnO1xuXG5pbXBvcnQgeyBTZWN1cmVOb3RlVHlwZSB9IGZyb20gJy4uLy4uL2VudW1zL3NlY3VyZU5vdGVUeXBlJztcblxuZXhwb3J0IGNsYXNzIFNlY3VyZU5vdGVBcGkgZXh0ZW5kcyBCYXNlUmVzcG9uc2Uge1xuICAgIHR5cGU6IFNlY3VyZU5vdGVUeXBlO1xuXG4gICAgY29uc3RydWN0b3IoZGF0YTogYW55ID0gbnVsbCkge1xuICAgICAgICBzdXBlcihkYXRhKTtcbiAgICAgICAgaWYgKGRhdGEgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudHlwZSA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnVHlwZScpO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IEJhc2VSZXNwb25zZSB9IGZyb20gJy4uL3Jlc3BvbnNlL2Jhc2VSZXNwb25zZSc7XG5cbmV4cG9ydCBjbGFzcyBTZW5kRmlsZUFwaSBleHRlbmRzIEJhc2VSZXNwb25zZSB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBmaWxlTmFtZTogc3RyaW5nO1xuICAgIGtleTogc3RyaW5nO1xuICAgIHNpemU6IHN0cmluZztcbiAgICBzaXplTmFtZTogc3RyaW5nO1xuXG4gICAgY29uc3RydWN0b3IoZGF0YTogYW55ID0gbnVsbCkge1xuICAgICAgICBzdXBlcihkYXRhKTtcbiAgICAgICAgaWYgKGRhdGEgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaWQgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ0lkJyk7XG4gICAgICAgIHRoaXMuZmlsZU5hbWUgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ0ZpbGVOYW1lJyk7XG4gICAgICAgIHRoaXMua2V5ID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdLZXknKTtcbiAgICAgICAgdGhpcy5zaXplID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdTaXplJyk7XG4gICAgICAgIHRoaXMuc2l6ZU5hbWUgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ1NpemVOYW1lJyk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgQmFzZVJlc3BvbnNlIH0gZnJvbSAnLi4vcmVzcG9uc2UvYmFzZVJlc3BvbnNlJztcblxuZXhwb3J0IGNsYXNzIFNlbmRUZXh0QXBpIGV4dGVuZHMgQmFzZVJlc3BvbnNlIHtcbiAgICB0ZXh0OiBzdHJpbmc7XG4gICAgaGlkZGVuOiBib29sZWFuO1xuXG4gICAgY29uc3RydWN0b3IoZGF0YTogYW55ID0gbnVsbCkge1xuICAgICAgICBzdXBlcihkYXRhKTtcbiAgICAgICAgaWYgKGRhdGEgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudGV4dCA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnVGV4dCcpO1xuICAgICAgICB0aGlzLmhpZGRlbiA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnSGlkZGVuJykgfHwgZmFsc2U7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgQmFzZVJlc3BvbnNlIH0gZnJvbSAnLi4vcmVzcG9uc2UvYmFzZVJlc3BvbnNlJztcblxuZW51bSBTc29UeXBlIHtcbiAgICBPcGVuSWRDb25uZWN0ID0gMSxcbiAgICBTYW1sMiA9IDIsXG59XG5cbmVudW0gT3BlbklkQ29ubmVjdFJlZGlyZWN0QmVoYXZpb3Ige1xuICAgIFJlZGlyZWN0R2V0ID0gMCxcbiAgICBGb3JtUG9zdCA9IDEsXG59XG5cbmVudW0gU2FtbDJCaW5kaW5nVHlwZSB7XG4gICAgSHR0cFJlZGlyZWN0ID0gMSxcbiAgICBIdHRwUG9zdCA9IDIsXG4gICAgQXJ0aWZhY3QgPSA0LFxufVxuXG5lbnVtIFNhbWwyTmFtZUlkRm9ybWF0IHtcbiAgICBOb3RDb25maWd1cmVkID0gMCxcbiAgICBVbnNwZWNpZmllZCA9IDEsXG4gICAgRW1haWxBZGRyZXNzID0gMixcbiAgICBYNTA5U3ViamVjdE5hbWUgPSAzLFxuICAgIFdpbmRvd3NEb21haW5RdWFsaWZpZWROYW1lID0gNCxcbiAgICBLZXJiZXJvc1ByaW5jaXBhbE5hbWUgPSA1LFxuICAgIEVudGl0eUlkZW50aWZpZXIgPSA2LFxuICAgIFBlcnNpc3RlbnQgPSA3LFxuICAgIFRyYW5zaWVudCA9IDgsXG59XG5cbmVudW0gU2FtbDJTaWduaW5nQmVoYXZpb3Ige1xuICAgIElmSWRwV2FudEF1dGhuUmVxdWVzdHNTaWduZWQgPSAwLFxuICAgIEFsd2F5cyA9IDEsXG4gICAgTmV2ZXIgPSAzLFxufVxuXG5leHBvcnQgY2xhc3MgU3NvQ29uZmlnQXBpIGV4dGVuZHMgQmFzZVJlc3BvbnNlIHtcbiAgICBjb25maWdUeXBlOiBTc29UeXBlO1xuXG4gICAgdXNlQ3J5cHRvQWdlbnQ6IGJvb2xlYW47XG4gICAgY3J5cHRvQWdlbnRVcmw6IHN0cmluZztcblxuICAgIC8vIE9wZW5JZFxuICAgIGF1dGhvcml0eTogc3RyaW5nO1xuICAgIGNsaWVudElkOiBzdHJpbmc7XG4gICAgY2xpZW50U2VjcmV0OiBzdHJpbmc7XG4gICAgbWV0YWRhdGFBZGRyZXNzOiBzdHJpbmc7XG4gICAgcmVkaXJlY3RCZWhhdmlvcjogT3BlbklkQ29ubmVjdFJlZGlyZWN0QmVoYXZpb3I7XG4gICAgZ2V0Q2xhaW1zRnJvbVVzZXJJbmZvRW5kcG9pbnQ6IGJvb2xlYW47XG4gICAgYWRkaXRpb25hbFNjb3Blczogc3RyaW5nO1xuICAgIGFkZGl0aW9uYWxVc2VySWRDbGFpbVR5cGVzOiBzdHJpbmc7XG4gICAgYWRkaXRpb25hbEVtYWlsQ2xhaW1UeXBlczogc3RyaW5nO1xuICAgIGFkZGl0aW9uYWxOYW1lQ2xhaW1UeXBlczogc3RyaW5nO1xuICAgIGFjclZhbHVlczogc3RyaW5nO1xuICAgIGV4cGVjdGVkUmV0dXJuQWNyVmFsdWU6IHN0cmluZztcblxuICAgIC8vIFNBTUxcbiAgICBzcE5hbWVJZEZvcm1hdDogU2FtbDJOYW1lSWRGb3JtYXQ7XG4gICAgc3BPdXRib3VuZFNpZ25pbmdBbGdvcml0aG06IHN0cmluZztcbiAgICBzcFNpZ25pbmdCZWhhdmlvcjogU2FtbDJTaWduaW5nQmVoYXZpb3I7XG4gICAgc3BNaW5JbmNvbWluZ1NpZ25pbmdBbGdvcml0aG06IGJvb2xlYW47XG4gICAgc3BXYW50QXNzZXJ0aW9uc1NpZ25lZDogYm9vbGVhbjtcbiAgICBzcFZhbGlkYXRlQ2VydGlmaWNhdGVzOiBib29sZWFuO1xuXG4gICAgaWRwRW50aXR5SWQ6IHN0cmluZztcbiAgICBpZHBCaW5kaW5nVHlwZTogU2FtbDJCaW5kaW5nVHlwZTtcbiAgICBpZHBTaW5nbGVTaWduT25TZXJ2aWNlVXJsOiBzdHJpbmc7XG4gICAgaWRwU2luZ2xlTG9nb3V0U2VydmljZVVybDogc3RyaW5nO1xuICAgIGlkcEFydGlmYWN0UmVzb2x1dGlvblNlcnZpY2VVcmw6IHN0cmluZztcbiAgICBpZHBYNTA5UHVibGljQ2VydDogc3RyaW5nO1xuICAgIGlkcE91dGJvdW5kU2lnbmluZ0FsZ29yaXRobTogc3RyaW5nO1xuICAgIGlkcEFsbG93VW5zb2xpY2l0ZWRBdXRoblJlc3BvbnNlOiBib29sZWFuO1xuICAgIGlkcERpc2FibGVPdXRib3VuZExvZ291dFJlcXVlc3RzOiBib29sZWFuO1xuICAgIGlkcFdhbnRBdXRoblJlcXVlc3RzU2lnbmVkOiBib29sZWFuO1xuXG4gICAgY29uc3RydWN0b3IoZGF0YTogYW55ID0gbnVsbCkge1xuICAgICAgICBzdXBlcihkYXRhKTtcbiAgICAgICAgaWYgKGRhdGEgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb25maWdUeXBlID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdDb25maWdUeXBlJyk7XG5cbiAgICAgICAgdGhpcy51c2VDcnlwdG9BZ2VudCA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnVXNlQ3J5cHRvQWdlbnQnKTtcbiAgICAgICAgdGhpcy5jcnlwdG9BZ2VudFVybCA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnQ3J5cHRvQWdlbnRVcmwnKTtcblxuICAgICAgICB0aGlzLmF1dGhvcml0eSA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnQXV0aG9yaXR5Jyk7XG4gICAgICAgIHRoaXMuY2xpZW50SWQgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ0NsaWVudElkJyk7XG4gICAgICAgIHRoaXMuY2xpZW50U2VjcmV0ID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdDbGllbnRTZWNyZXQnKTtcbiAgICAgICAgdGhpcy5tZXRhZGF0YUFkZHJlc3MgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ01ldGFkYXRhQWRkcmVzcycpO1xuICAgICAgICB0aGlzLnJlZGlyZWN0QmVoYXZpb3IgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ1JlZGlyZWN0QmVoYXZpb3InKTtcbiAgICAgICAgdGhpcy5nZXRDbGFpbXNGcm9tVXNlckluZm9FbmRwb2ludCA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnR2V0Q2xhaW1zRnJvbVVzZXJJbmZvRW5kcG9pbnQnKTtcbiAgICAgICAgdGhpcy5hZGRpdGlvbmFsU2NvcGVzID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdBZGRpdGlvbmFsU2NvcGVzJyk7XG4gICAgICAgIHRoaXMuYWRkaXRpb25hbFVzZXJJZENsYWltVHlwZXMgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ0FkZGl0aW9uYWxVc2VySWRDbGFpbVR5cGVzJyk7XG4gICAgICAgIHRoaXMuYWRkaXRpb25hbEVtYWlsQ2xhaW1UeXBlcyA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnQWRkaXRpb25hbEVtYWlsQ2xhaW1UeXBlcycpO1xuICAgICAgICB0aGlzLmFkZGl0aW9uYWxOYW1lQ2xhaW1UeXBlcyA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnQWRkaXRpb25hbE5hbWVDbGFpbVR5cGVzJyk7XG4gICAgICAgIHRoaXMuYWNyVmFsdWVzID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdBY3JWYWx1ZXMnKTtcbiAgICAgICAgdGhpcy5leHBlY3RlZFJldHVybkFjclZhbHVlID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdFeHBlY3RlZFJldHVybkFjclZhbHVlJyk7XG5cbiAgICAgICAgdGhpcy5zcE5hbWVJZEZvcm1hdCA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnU3BOYW1lSWRGb3JtYXQnKTtcbiAgICAgICAgdGhpcy5zcE91dGJvdW5kU2lnbmluZ0FsZ29yaXRobSA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnU3BPdXRib3VuZFNpZ25pbmdBbGdvcml0aG0nKTtcbiAgICAgICAgdGhpcy5zcFNpZ25pbmdCZWhhdmlvciA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnU3BTaWduaW5nQmVoYXZpb3InKTtcbiAgICAgICAgdGhpcy5zcE1pbkluY29taW5nU2lnbmluZ0FsZ29yaXRobSA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnU3BNaW5JbmNvbWluZ1NpZ25pbmdBbGdvcml0aG0nKTtcbiAgICAgICAgdGhpcy5zcFdhbnRBc3NlcnRpb25zU2lnbmVkID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdTcFdhbnRBc3NlcnRpb25zU2lnbmVkJyk7XG4gICAgICAgIHRoaXMuc3BWYWxpZGF0ZUNlcnRpZmljYXRlcyA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnU3BWYWxpZGF0ZUNlcnRpZmljYXRlcycpO1xuXG4gICAgICAgIHRoaXMuaWRwRW50aXR5SWQgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ0lkcEVudGl0eUlkJyk7XG4gICAgICAgIHRoaXMuaWRwQmluZGluZ1R5cGUgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ0lkcEJpbmRpbmdUeXBlJyk7XG4gICAgICAgIHRoaXMuaWRwU2luZ2xlU2lnbk9uU2VydmljZVVybCA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnSWRwU2luZ2xlU2lnbk9uU2VydmljZVVybCcpO1xuICAgICAgICB0aGlzLmlkcFNpbmdsZUxvZ291dFNlcnZpY2VVcmwgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ0lkcFNpbmdsZUxvZ291dFNlcnZpY2VVcmwnKTtcbiAgICAgICAgdGhpcy5pZHBBcnRpZmFjdFJlc29sdXRpb25TZXJ2aWNlVXJsID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdJZHBBcnRpZmFjdFJlc29sdXRpb25TZXJ2aWNlVXJsJyk7XG4gICAgICAgIHRoaXMuaWRwWDUwOVB1YmxpY0NlcnQgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ0lkcFg1MDlQdWJsaWNDZXJ0Jyk7XG4gICAgICAgIHRoaXMuaWRwT3V0Ym91bmRTaWduaW5nQWxnb3JpdGhtID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdJZHBPdXRib3VuZFNpZ25pbmdBbGdvcml0aG0nKTtcbiAgICAgICAgdGhpcy5pZHBBbGxvd1Vuc29saWNpdGVkQXV0aG5SZXNwb25zZSA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnSWRwQWxsb3dVbnNvbGljaXRlZEF1dGhuUmVzcG9uc2UnKTtcbiAgICAgICAgdGhpcy5pZHBEaXNhYmxlT3V0Ym91bmRMb2dvdXRSZXF1ZXN0cyA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnSWRwRGlzYWJsZU91dGJvdW5kTG9nb3V0UmVxdWVzdHMnKTtcbiAgICAgICAgdGhpcy5pZHBXYW50QXV0aG5SZXF1ZXN0c1NpZ25lZCA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnSWRwV2FudEF1dGhuUmVxdWVzdHNTaWduZWQnKTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBBdHRhY2htZW50UmVzcG9uc2UgfSBmcm9tICcuLi9yZXNwb25zZS9hdHRhY2htZW50UmVzcG9uc2UnO1xuXG5leHBvcnQgY2xhc3MgQXR0YWNobWVudERhdGEge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgdXJsOiBzdHJpbmc7XG4gICAgZmlsZU5hbWU6IHN0cmluZztcbiAgICBrZXk6IHN0cmluZztcbiAgICBzaXplOiBzdHJpbmc7XG4gICAgc2l6ZU5hbWU6IHN0cmluZztcblxuICAgIGNvbnN0cnVjdG9yKHJlc3BvbnNlPzogQXR0YWNobWVudFJlc3BvbnNlKSB7XG4gICAgICAgIGlmIChyZXNwb25zZSA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pZCA9IHJlc3BvbnNlLmlkO1xuICAgICAgICB0aGlzLnVybCA9IHJlc3BvbnNlLnVybDtcbiAgICAgICAgdGhpcy5maWxlTmFtZSA9IHJlc3BvbnNlLmZpbGVOYW1lO1xuICAgICAgICB0aGlzLmtleSA9IHJlc3BvbnNlLmtleTtcbiAgICAgICAgdGhpcy5zaXplID0gcmVzcG9uc2Uuc2l6ZTtcbiAgICAgICAgdGhpcy5zaXplTmFtZSA9IHJlc3BvbnNlLnNpemVOYW1lO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IENhcmRBcGkgfSBmcm9tICcuLi9hcGkvY2FyZEFwaSc7XG5cbmV4cG9ydCBjbGFzcyBDYXJkRGF0YSB7XG4gICAgY2FyZGhvbGRlck5hbWU6IHN0cmluZztcbiAgICBicmFuZDogc3RyaW5nO1xuICAgIG51bWJlcjogc3RyaW5nO1xuICAgIGV4cE1vbnRoOiBzdHJpbmc7XG4gICAgZXhwWWVhcjogc3RyaW5nO1xuICAgIGNvZGU6IHN0cmluZztcblxuICAgIGNvbnN0cnVjdG9yKGRhdGE/OiBDYXJkQXBpKSB7XG4gICAgICAgIGlmIChkYXRhID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2FyZGhvbGRlck5hbWUgPSBkYXRhLmNhcmRob2xkZXJOYW1lO1xuICAgICAgICB0aGlzLmJyYW5kID0gZGF0YS5icmFuZDtcbiAgICAgICAgdGhpcy5udW1iZXIgPSBkYXRhLm51bWJlcjtcbiAgICAgICAgdGhpcy5leHBNb250aCA9IGRhdGEuZXhwTW9udGg7XG4gICAgICAgIHRoaXMuZXhwWWVhciA9IGRhdGEuZXhwWWVhcjtcbiAgICAgICAgdGhpcy5jb2RlID0gZGF0YS5jb2RlO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IENpcGhlclJlcHJvbXB0VHlwZSB9IGZyb20gJy4uLy4uL2VudW1zL2NpcGhlclJlcHJvbXB0VHlwZSc7XG5pbXBvcnQgeyBDaXBoZXJUeXBlIH0gZnJvbSAnLi4vLi4vZW51bXMvY2lwaGVyVHlwZSc7XG5cbmltcG9ydCB7IEF0dGFjaG1lbnREYXRhIH0gZnJvbSAnLi9hdHRhY2htZW50RGF0YSc7XG5pbXBvcnQgeyBDYXJkRGF0YSB9IGZyb20gJy4vY2FyZERhdGEnO1xuaW1wb3J0IHsgRmllbGREYXRhIH0gZnJvbSAnLi9maWVsZERhdGEnO1xuaW1wb3J0IHsgSWRlbnRpdHlEYXRhIH0gZnJvbSAnLi9pZGVudGl0eURhdGEnO1xuaW1wb3J0IHsgTG9naW5EYXRhIH0gZnJvbSAnLi9sb2dpbkRhdGEnO1xuaW1wb3J0IHsgUGFzc3dvcmRIaXN0b3J5RGF0YSB9IGZyb20gJy4vcGFzc3dvcmRIaXN0b3J5RGF0YSc7XG5pbXBvcnQgeyBTZWN1cmVOb3RlRGF0YSB9IGZyb20gJy4vc2VjdXJlTm90ZURhdGEnO1xuXG5pbXBvcnQgeyBDaXBoZXJSZXNwb25zZSB9IGZyb20gJy4uL3Jlc3BvbnNlL2NpcGhlclJlc3BvbnNlJztcblxuZXhwb3J0IGNsYXNzIENpcGhlckRhdGEge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgb3JnYW5pemF0aW9uSWQ6IHN0cmluZztcbiAgICBmb2xkZXJJZDogc3RyaW5nO1xuICAgIHVzZXJJZDogc3RyaW5nO1xuICAgIGVkaXQ6IGJvb2xlYW47XG4gICAgdmlld1Bhc3N3b3JkOiBib29sZWFuO1xuICAgIG9yZ2FuaXphdGlvblVzZVRvdHA6IGJvb2xlYW47XG4gICAgZmF2b3JpdGU6IGJvb2xlYW47XG4gICAgcmV2aXNpb25EYXRlOiBzdHJpbmc7XG4gICAgdHlwZTogQ2lwaGVyVHlwZTtcbiAgICBzaXplTmFtZTogc3RyaW5nO1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBub3Rlczogc3RyaW5nO1xuICAgIGxvZ2luPzogTG9naW5EYXRhO1xuICAgIHNlY3VyZU5vdGU/OiBTZWN1cmVOb3RlRGF0YTtcbiAgICBjYXJkPzogQ2FyZERhdGE7XG4gICAgaWRlbnRpdHk/OiBJZGVudGl0eURhdGE7XG4gICAgZmllbGRzPzogRmllbGREYXRhW107XG4gICAgYXR0YWNobWVudHM/OiBBdHRhY2htZW50RGF0YVtdO1xuICAgIHBhc3N3b3JkSGlzdG9yeT86IFBhc3N3b3JkSGlzdG9yeURhdGFbXTtcbiAgICBjb2xsZWN0aW9uSWRzPzogc3RyaW5nW107XG4gICAgZGVsZXRlZERhdGU6IHN0cmluZztcbiAgICByZXByb21wdDogQ2lwaGVyUmVwcm9tcHRUeXBlO1xuXG4gICAgY29uc3RydWN0b3IocmVzcG9uc2U/OiBDaXBoZXJSZXNwb25zZSwgdXNlcklkPzogc3RyaW5nLCBjb2xsZWN0aW9uSWRzPzogc3RyaW5nW10pIHtcbiAgICAgICAgaWYgKHJlc3BvbnNlID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaWQgPSByZXNwb25zZS5pZDtcbiAgICAgICAgdGhpcy5vcmdhbml6YXRpb25JZCA9IHJlc3BvbnNlLm9yZ2FuaXphdGlvbklkO1xuICAgICAgICB0aGlzLmZvbGRlcklkID0gcmVzcG9uc2UuZm9sZGVySWQ7XG4gICAgICAgIHRoaXMudXNlcklkID0gdXNlcklkO1xuICAgICAgICB0aGlzLmVkaXQgPSByZXNwb25zZS5lZGl0O1xuICAgICAgICB0aGlzLnZpZXdQYXNzd29yZCA9IHJlc3BvbnNlLnZpZXdQYXNzd29yZDtcbiAgICAgICAgdGhpcy5vcmdhbml6YXRpb25Vc2VUb3RwID0gcmVzcG9uc2Uub3JnYW5pemF0aW9uVXNlVG90cDtcbiAgICAgICAgdGhpcy5mYXZvcml0ZSA9IHJlc3BvbnNlLmZhdm9yaXRlO1xuICAgICAgICB0aGlzLnJldmlzaW9uRGF0ZSA9IHJlc3BvbnNlLnJldmlzaW9uRGF0ZTtcbiAgICAgICAgdGhpcy50eXBlID0gcmVzcG9uc2UudHlwZTtcbiAgICAgICAgdGhpcy5uYW1lID0gcmVzcG9uc2UubmFtZTtcbiAgICAgICAgdGhpcy5ub3RlcyA9IHJlc3BvbnNlLm5vdGVzO1xuICAgICAgICB0aGlzLmNvbGxlY3Rpb25JZHMgPSBjb2xsZWN0aW9uSWRzICE9IG51bGwgPyBjb2xsZWN0aW9uSWRzIDogcmVzcG9uc2UuY29sbGVjdGlvbklkcztcbiAgICAgICAgdGhpcy5kZWxldGVkRGF0ZSA9IHJlc3BvbnNlLmRlbGV0ZWREYXRlO1xuICAgICAgICB0aGlzLnJlcHJvbXB0ID0gcmVzcG9uc2UucmVwcm9tcHQ7XG5cbiAgICAgICAgc3dpdGNoICh0aGlzLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgQ2lwaGVyVHlwZS5Mb2dpbjpcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2luID0gbmV3IExvZ2luRGF0YShyZXNwb25zZS5sb2dpbik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIENpcGhlclR5cGUuU2VjdXJlTm90ZTpcbiAgICAgICAgICAgICAgICB0aGlzLnNlY3VyZU5vdGUgPSBuZXcgU2VjdXJlTm90ZURhdGEocmVzcG9uc2Uuc2VjdXJlTm90ZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIENpcGhlclR5cGUuQ2FyZDpcbiAgICAgICAgICAgICAgICB0aGlzLmNhcmQgPSBuZXcgQ2FyZERhdGEocmVzcG9uc2UuY2FyZCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIENpcGhlclR5cGUuSWRlbnRpdHk6XG4gICAgICAgICAgICAgICAgdGhpcy5pZGVudGl0eSA9IG5ldyBJZGVudGl0eURhdGEocmVzcG9uc2UuaWRlbnRpdHkpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXNwb25zZS5maWVsZHMgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5maWVsZHMgPSByZXNwb25zZS5maWVsZHMubWFwKGYgPT4gbmV3IEZpZWxkRGF0YShmKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc3BvbnNlLmF0dGFjaG1lbnRzICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuYXR0YWNobWVudHMgPSByZXNwb25zZS5hdHRhY2htZW50cy5tYXAoYSA9PiBuZXcgQXR0YWNobWVudERhdGEoYSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXNwb25zZS5wYXNzd29yZEhpc3RvcnkgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5wYXNzd29yZEhpc3RvcnkgPSByZXNwb25zZS5wYXNzd29yZEhpc3RvcnkubWFwKHBoID0+IG5ldyBQYXNzd29yZEhpc3RvcnlEYXRhKHBoKSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgeyBDb2xsZWN0aW9uRGV0YWlsc1Jlc3BvbnNlIH0gZnJvbSAnLi4vcmVzcG9uc2UvY29sbGVjdGlvblJlc3BvbnNlJztcblxuZXhwb3J0IGNsYXNzIENvbGxlY3Rpb25EYXRhIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIG9yZ2FuaXphdGlvbklkOiBzdHJpbmc7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGV4dGVybmFsSWQ6IHN0cmluZztcbiAgICByZWFkT25seTogYm9vbGVhbjtcblxuICAgIGNvbnN0cnVjdG9yKHJlc3BvbnNlOiBDb2xsZWN0aW9uRGV0YWlsc1Jlc3BvbnNlKSB7XG4gICAgICAgIHRoaXMuaWQgPSByZXNwb25zZS5pZDtcbiAgICAgICAgdGhpcy5vcmdhbml6YXRpb25JZCA9IHJlc3BvbnNlLm9yZ2FuaXphdGlvbklkO1xuICAgICAgICB0aGlzLm5hbWUgPSByZXNwb25zZS5uYW1lO1xuICAgICAgICB0aGlzLmV4dGVybmFsSWQgPSByZXNwb25zZS5leHRlcm5hbElkO1xuICAgICAgICB0aGlzLnJlYWRPbmx5ID0gcmVzcG9uc2UucmVhZE9ubHk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgRXZlbnRUeXBlIH0gZnJvbSAnLi4vLi4vZW51bXMvZXZlbnRUeXBlJztcblxuZXhwb3J0IGNsYXNzIEV2ZW50RGF0YSB7XG4gICAgdHlwZTogRXZlbnRUeXBlO1xuICAgIGNpcGhlcklkOiBzdHJpbmc7XG4gICAgZGF0ZTogc3RyaW5nO1xufVxuIiwiaW1wb3J0IHsgRmllbGRUeXBlIH0gZnJvbSAnLi4vLi4vZW51bXMvZmllbGRUeXBlJztcbmltcG9ydCB7IExpbmtlZElkVHlwZSB9IGZyb20gJy4uLy4uL2VudW1zL2xpbmtlZElkVHlwZSc7XG5cbmltcG9ydCB7IEZpZWxkQXBpIH0gZnJvbSAnLi4vYXBpL2ZpZWxkQXBpJztcblxuZXhwb3J0IGNsYXNzIEZpZWxkRGF0YSB7XG4gICAgdHlwZTogRmllbGRUeXBlO1xuICAgIG5hbWU6IHN0cmluZztcbiAgICB2YWx1ZTogc3RyaW5nO1xuICAgIGxpbmtlZElkOiBMaW5rZWRJZFR5cGU7XG5cbiAgICBjb25zdHJ1Y3RvcihyZXNwb25zZT86IEZpZWxkQXBpKSB7XG4gICAgICAgIGlmIChyZXNwb25zZSA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50eXBlID0gcmVzcG9uc2UudHlwZTtcbiAgICAgICAgdGhpcy5uYW1lID0gcmVzcG9uc2UubmFtZTtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHJlc3BvbnNlLnZhbHVlO1xuICAgICAgICB0aGlzLmxpbmtlZElkID0gcmVzcG9uc2UubGlua2VkSWQ7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgRm9sZGVyUmVzcG9uc2UgfSBmcm9tICcuLi9yZXNwb25zZS9mb2xkZXJSZXNwb25zZSc7XG5cbmV4cG9ydCBjbGFzcyBGb2xkZXJEYXRhIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIHVzZXJJZDogc3RyaW5nO1xuICAgIG5hbWU6IHN0cmluZztcbiAgICByZXZpc2lvbkRhdGU6IHN0cmluZztcblxuICAgIGNvbnN0cnVjdG9yKHJlc3BvbnNlOiBGb2xkZXJSZXNwb25zZSwgdXNlcklkOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy51c2VySWQgPSB1c2VySWQ7XG4gICAgICAgIHRoaXMubmFtZSA9IHJlc3BvbnNlLm5hbWU7XG4gICAgICAgIHRoaXMuaWQgPSByZXNwb25zZS5pZDtcbiAgICAgICAgdGhpcy5yZXZpc2lvbkRhdGUgPSByZXNwb25zZS5yZXZpc2lvbkRhdGU7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgSWRlbnRpdHlBcGkgfSBmcm9tICcuLi9hcGkvaWRlbnRpdHlBcGknO1xuXG5leHBvcnQgY2xhc3MgSWRlbnRpdHlEYXRhIHtcbiAgICB0aXRsZTogc3RyaW5nO1xuICAgIGZpcnN0TmFtZTogc3RyaW5nO1xuICAgIG1pZGRsZU5hbWU6IHN0cmluZztcbiAgICBsYXN0TmFtZTogc3RyaW5nO1xuICAgIGFkZHJlc3MxOiBzdHJpbmc7XG4gICAgYWRkcmVzczI6IHN0cmluZztcbiAgICBhZGRyZXNzMzogc3RyaW5nO1xuICAgIGNpdHk6IHN0cmluZztcbiAgICBzdGF0ZTogc3RyaW5nO1xuICAgIHBvc3RhbENvZGU6IHN0cmluZztcbiAgICBjb3VudHJ5OiBzdHJpbmc7XG4gICAgY29tcGFueTogc3RyaW5nO1xuICAgIGVtYWlsOiBzdHJpbmc7XG4gICAgcGhvbmU6IHN0cmluZztcbiAgICBzc246IHN0cmluZztcbiAgICB1c2VybmFtZTogc3RyaW5nO1xuICAgIHBhc3Nwb3J0TnVtYmVyOiBzdHJpbmc7XG4gICAgbGljZW5zZU51bWJlcjogc3RyaW5nO1xuXG4gICAgY29uc3RydWN0b3IoZGF0YT86IElkZW50aXR5QXBpKSB7XG4gICAgICAgIGlmIChkYXRhID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudGl0bGUgPSBkYXRhLnRpdGxlO1xuICAgICAgICB0aGlzLmZpcnN0TmFtZSA9IGRhdGEuZmlyc3ROYW1lO1xuICAgICAgICB0aGlzLm1pZGRsZU5hbWUgPSBkYXRhLm1pZGRsZU5hbWU7XG4gICAgICAgIHRoaXMubGFzdE5hbWUgPSBkYXRhLmxhc3ROYW1lO1xuICAgICAgICB0aGlzLmFkZHJlc3MxID0gZGF0YS5hZGRyZXNzMTtcbiAgICAgICAgdGhpcy5hZGRyZXNzMiA9IGRhdGEuYWRkcmVzczI7XG4gICAgICAgIHRoaXMuYWRkcmVzczMgPSBkYXRhLmFkZHJlc3MzO1xuICAgICAgICB0aGlzLmNpdHkgPSBkYXRhLmNpdHk7XG4gICAgICAgIHRoaXMuc3RhdGUgPSBkYXRhLnN0YXRlO1xuICAgICAgICB0aGlzLnBvc3RhbENvZGUgPSBkYXRhLnBvc3RhbENvZGU7XG4gICAgICAgIHRoaXMuY291bnRyeSA9IGRhdGEuY291bnRyeTtcbiAgICAgICAgdGhpcy5jb21wYW55ID0gZGF0YS5jb21wYW55O1xuICAgICAgICB0aGlzLmVtYWlsID0gZGF0YS5lbWFpbDtcbiAgICAgICAgdGhpcy5waG9uZSA9IGRhdGEucGhvbmU7XG4gICAgICAgIHRoaXMuc3NuID0gZGF0YS5zc247XG4gICAgICAgIHRoaXMudXNlcm5hbWUgPSBkYXRhLnVzZXJuYW1lO1xuICAgICAgICB0aGlzLnBhc3Nwb3J0TnVtYmVyID0gZGF0YS5wYXNzcG9ydE51bWJlcjtcbiAgICAgICAgdGhpcy5saWNlbnNlTnVtYmVyID0gZGF0YS5saWNlbnNlTnVtYmVyO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IExvZ2luQXBpIH0gZnJvbSAnLi4vYXBpL2xvZ2luQXBpJztcblxuaW1wb3J0IHsgTG9naW5VcmlEYXRhIH0gZnJvbSAnLi9sb2dpblVyaURhdGEnO1xuXG5leHBvcnQgY2xhc3MgTG9naW5EYXRhIHtcbiAgICB1cmlzOiBMb2dpblVyaURhdGFbXTtcbiAgICB1c2VybmFtZTogc3RyaW5nO1xuICAgIHBhc3N3b3JkOiBzdHJpbmc7XG4gICAgcGFzc3dvcmRSZXZpc2lvbkRhdGU6IHN0cmluZztcbiAgICB0b3RwOiBzdHJpbmc7XG4gICAgYXV0b2ZpbGxPblBhZ2VMb2FkOiBib29sZWFuO1xuXG4gICAgY29uc3RydWN0b3IoZGF0YT86IExvZ2luQXBpKSB7XG4gICAgICAgIGlmIChkYXRhID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudXNlcm5hbWUgPSBkYXRhLnVzZXJuYW1lO1xuICAgICAgICB0aGlzLnBhc3N3b3JkID0gZGF0YS5wYXNzd29yZDtcbiAgICAgICAgdGhpcy5wYXNzd29yZFJldmlzaW9uRGF0ZSA9IGRhdGEucGFzc3dvcmRSZXZpc2lvbkRhdGU7XG4gICAgICAgIHRoaXMudG90cCA9IGRhdGEudG90cDtcbiAgICAgICAgdGhpcy5hdXRvZmlsbE9uUGFnZUxvYWQgPSBkYXRhLmF1dG9maWxsT25QYWdlTG9hZDtcblxuICAgICAgICBpZiAoZGF0YS51cmlzKSB7XG4gICAgICAgICAgICB0aGlzLnVyaXMgPSBkYXRhLnVyaXMubWFwKHUgPT4gbmV3IExvZ2luVXJpRGF0YSh1KSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgeyBVcmlNYXRjaFR5cGUgfSBmcm9tICcuLi8uLi9lbnVtcy91cmlNYXRjaFR5cGUnO1xuXG5pbXBvcnQgeyBMb2dpblVyaUFwaSB9IGZyb20gJy4uL2FwaS9sb2dpblVyaUFwaSc7XG5cbmV4cG9ydCBjbGFzcyBMb2dpblVyaURhdGEge1xuICAgIHVyaTogc3RyaW5nO1xuICAgIG1hdGNoOiBVcmlNYXRjaFR5cGUgPSBudWxsO1xuXG4gICAgY29uc3RydWN0b3IoZGF0YT86IExvZ2luVXJpQXBpKSB7XG4gICAgICAgIGlmIChkYXRhID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVyaSA9IGRhdGEudXJpO1xuICAgICAgICB0aGlzLm1hdGNoID0gZGF0YS5tYXRjaDtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBQcm9maWxlT3JnYW5pemF0aW9uUmVzcG9uc2UgfSBmcm9tICcuLi9yZXNwb25zZS9wcm9maWxlT3JnYW5pemF0aW9uUmVzcG9uc2UnO1xuXG5pbXBvcnQgeyBPcmdhbml6YXRpb25Vc2VyU3RhdHVzVHlwZSB9IGZyb20gJy4uLy4uL2VudW1zL29yZ2FuaXphdGlvblVzZXJTdGF0dXNUeXBlJztcbmltcG9ydCB7IE9yZ2FuaXphdGlvblVzZXJUeXBlIH0gZnJvbSAnLi4vLi4vZW51bXMvb3JnYW5pemF0aW9uVXNlclR5cGUnO1xuaW1wb3J0IHsgUGVybWlzc2lvbnNBcGkgfSBmcm9tICcuLi9hcGkvcGVybWlzc2lvbnNBcGknO1xuXG5leHBvcnQgY2xhc3MgT3JnYW5pemF0aW9uRGF0YSB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgc3RhdHVzOiBPcmdhbml6YXRpb25Vc2VyU3RhdHVzVHlwZTtcbiAgICB0eXBlOiBPcmdhbml6YXRpb25Vc2VyVHlwZTtcbiAgICBlbmFibGVkOiBib29sZWFuO1xuICAgIHVzZVBvbGljaWVzOiBib29sZWFuO1xuICAgIHVzZUdyb3VwczogYm9vbGVhbjtcbiAgICB1c2VEaXJlY3Rvcnk6IGJvb2xlYW47XG4gICAgdXNlRXZlbnRzOiBib29sZWFuO1xuICAgIHVzZVRvdHA6IGJvb2xlYW47XG4gICAgdXNlMmZhOiBib29sZWFuO1xuICAgIHVzZUFwaTogYm9vbGVhbjtcbiAgICB1c2VTc286IGJvb2xlYW47XG4gICAgdXNlUmVzZXRQYXNzd29yZDogYm9vbGVhbjtcbiAgICBzZWxmSG9zdDogYm9vbGVhbjtcbiAgICB1c2Vyc0dldFByZW1pdW06IGJvb2xlYW47XG4gICAgc2VhdHM6IG51bWJlcjtcbiAgICBtYXhDb2xsZWN0aW9uczogbnVtYmVyO1xuICAgIG1heFN0b3JhZ2VHYj86IG51bWJlcjtcbiAgICBzc29Cb3VuZDogYm9vbGVhbjtcbiAgICBpZGVudGlmaWVyOiBzdHJpbmc7XG4gICAgcGVybWlzc2lvbnM6IFBlcm1pc3Npb25zQXBpO1xuICAgIHJlc2V0UGFzc3dvcmRFbnJvbGxlZDogYm9vbGVhbjtcbiAgICB1c2VySWQ6IHN0cmluZztcbiAgICBoYXNQdWJsaWNBbmRQcml2YXRlS2V5czogYm9vbGVhbjtcbiAgICBwcm92aWRlcklkOiBzdHJpbmc7XG4gICAgcHJvdmlkZXJOYW1lOiBzdHJpbmc7XG4gICAgaXNQcm92aWRlclVzZXI6IGJvb2xlYW47XG5cbiAgICBjb25zdHJ1Y3RvcihyZXNwb25zZTogUHJvZmlsZU9yZ2FuaXphdGlvblJlc3BvbnNlKSB7XG4gICAgICAgIHRoaXMuaWQgPSByZXNwb25zZS5pZDtcbiAgICAgICAgdGhpcy5uYW1lID0gcmVzcG9uc2UubmFtZTtcbiAgICAgICAgdGhpcy5zdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIHRoaXMudHlwZSA9IHJlc3BvbnNlLnR5cGU7XG4gICAgICAgIHRoaXMuZW5hYmxlZCA9IHJlc3BvbnNlLmVuYWJsZWQ7XG4gICAgICAgIHRoaXMudXNlUG9saWNpZXMgPSByZXNwb25zZS51c2VQb2xpY2llcztcbiAgICAgICAgdGhpcy51c2VHcm91cHMgPSByZXNwb25zZS51c2VHcm91cHM7XG4gICAgICAgIHRoaXMudXNlRGlyZWN0b3J5ID0gcmVzcG9uc2UudXNlRGlyZWN0b3J5O1xuICAgICAgICB0aGlzLnVzZUV2ZW50cyA9IHJlc3BvbnNlLnVzZUV2ZW50cztcbiAgICAgICAgdGhpcy51c2VUb3RwID0gcmVzcG9uc2UudXNlVG90cDtcbiAgICAgICAgdGhpcy51c2UyZmEgPSByZXNwb25zZS51c2UyZmE7XG4gICAgICAgIHRoaXMudXNlQXBpID0gcmVzcG9uc2UudXNlQXBpO1xuICAgICAgICB0aGlzLnVzZVNzbyA9IHJlc3BvbnNlLnVzZVNzbztcbiAgICAgICAgdGhpcy51c2VSZXNldFBhc3N3b3JkID0gcmVzcG9uc2UudXNlUmVzZXRQYXNzd29yZDtcbiAgICAgICAgdGhpcy5zZWxmSG9zdCA9IHJlc3BvbnNlLnNlbGZIb3N0O1xuICAgICAgICB0aGlzLnVzZXJzR2V0UHJlbWl1bSA9IHJlc3BvbnNlLnVzZXJzR2V0UHJlbWl1bTtcbiAgICAgICAgdGhpcy5zZWF0cyA9IHJlc3BvbnNlLnNlYXRzO1xuICAgICAgICB0aGlzLm1heENvbGxlY3Rpb25zID0gcmVzcG9uc2UubWF4Q29sbGVjdGlvbnM7XG4gICAgICAgIHRoaXMubWF4U3RvcmFnZUdiID0gcmVzcG9uc2UubWF4U3RvcmFnZUdiO1xuICAgICAgICB0aGlzLnNzb0JvdW5kID0gcmVzcG9uc2Uuc3NvQm91bmQ7XG4gICAgICAgIHRoaXMuaWRlbnRpZmllciA9IHJlc3BvbnNlLmlkZW50aWZpZXI7XG4gICAgICAgIHRoaXMucGVybWlzc2lvbnMgPSByZXNwb25zZS5wZXJtaXNzaW9ucztcbiAgICAgICAgdGhpcy5yZXNldFBhc3N3b3JkRW5yb2xsZWQgPSByZXNwb25zZS5yZXNldFBhc3N3b3JkRW5yb2xsZWQ7XG4gICAgICAgIHRoaXMudXNlcklkID0gcmVzcG9uc2UudXNlcklkO1xuICAgICAgICB0aGlzLmhhc1B1YmxpY0FuZFByaXZhdGVLZXlzID0gcmVzcG9uc2UuaGFzUHVibGljQW5kUHJpdmF0ZUtleXM7XG4gICAgICAgIHRoaXMucHJvdmlkZXJJZCA9IHJlc3BvbnNlLnByb3ZpZGVySWQ7XG4gICAgICAgIHRoaXMucHJvdmlkZXJOYW1lID0gcmVzcG9uc2UucHJvdmlkZXJOYW1lO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IFBhc3N3b3JkSGlzdG9yeVJlc3BvbnNlIH0gZnJvbSAnLi4vcmVzcG9uc2UvcGFzc3dvcmRIaXN0b3J5UmVzcG9uc2UnO1xuXG5leHBvcnQgY2xhc3MgUGFzc3dvcmRIaXN0b3J5RGF0YSB7XG4gICAgcGFzc3dvcmQ6IHN0cmluZztcbiAgICBsYXN0VXNlZERhdGU6IHN0cmluZztcblxuICAgIGNvbnN0cnVjdG9yKHJlc3BvbnNlPzogUGFzc3dvcmRIaXN0b3J5UmVzcG9uc2UpIHtcbiAgICAgICAgaWYgKHJlc3BvbnNlID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucGFzc3dvcmQgPSByZXNwb25zZS5wYXNzd29yZDtcbiAgICAgICAgdGhpcy5sYXN0VXNlZERhdGUgPSByZXNwb25zZS5sYXN0VXNlZERhdGU7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgUG9saWN5UmVzcG9uc2UgfSBmcm9tICcuLi9yZXNwb25zZS9wb2xpY3lSZXNwb25zZSc7XG5cbmltcG9ydCB7IFBvbGljeVR5cGUgfSBmcm9tICcuLi8uLi9lbnVtcy9wb2xpY3lUeXBlJztcblxuZXhwb3J0IGNsYXNzIFBvbGljeURhdGEge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgb3JnYW5pemF0aW9uSWQ6IHN0cmluZztcbiAgICB0eXBlOiBQb2xpY3lUeXBlO1xuICAgIGRhdGE6IGFueTtcbiAgICBlbmFibGVkOiBib29sZWFuO1xuXG4gICAgY29uc3RydWN0b3IocmVzcG9uc2U6IFBvbGljeVJlc3BvbnNlKSB7XG4gICAgICAgIHRoaXMuaWQgPSByZXNwb25zZS5pZDtcbiAgICAgICAgdGhpcy5vcmdhbml6YXRpb25JZCA9IHJlc3BvbnNlLm9yZ2FuaXphdGlvbklkO1xuICAgICAgICB0aGlzLnR5cGUgPSByZXNwb25zZS50eXBlO1xuICAgICAgICB0aGlzLmRhdGEgPSByZXNwb25zZS5kYXRhO1xuICAgICAgICB0aGlzLmVuYWJsZWQgPSByZXNwb25zZS5lbmFibGVkO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IFByb2ZpbGVQcm92aWRlclJlc3BvbnNlIH0gZnJvbSAnLi4vcmVzcG9uc2UvcHJvZmlsZVByb3ZpZGVyUmVzcG9uc2UnO1xuXG5pbXBvcnQgeyBQcm92aWRlclVzZXJTdGF0dXNUeXBlIH0gZnJvbSAnLi4vLi4vZW51bXMvcHJvdmlkZXJVc2VyU3RhdHVzVHlwZSc7XG5pbXBvcnQgeyBQcm92aWRlclVzZXJUeXBlIH0gZnJvbSAnLi4vLi4vZW51bXMvcHJvdmlkZXJVc2VyVHlwZSc7XG5cbmV4cG9ydCBjbGFzcyBQcm92aWRlckRhdGEge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIHN0YXR1czogUHJvdmlkZXJVc2VyU3RhdHVzVHlwZTtcbiAgICB0eXBlOiBQcm92aWRlclVzZXJUeXBlO1xuICAgIGVuYWJsZWQ6IGJvb2xlYW47XG4gICAgdXNlcklkOiBzdHJpbmc7XG4gICAgdXNlRXZlbnRzOiBib29sZWFuO1xuXG4gICAgY29uc3RydWN0b3IocmVzcG9uc2U6IFByb2ZpbGVQcm92aWRlclJlc3BvbnNlKSB7XG4gICAgICAgIHRoaXMuaWQgPSByZXNwb25zZS5pZDtcbiAgICAgICAgdGhpcy5uYW1lID0gcmVzcG9uc2UubmFtZTtcbiAgICAgICAgdGhpcy5zdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIHRoaXMudHlwZSA9IHJlc3BvbnNlLnR5cGU7XG4gICAgICAgIHRoaXMuZW5hYmxlZCA9IHJlc3BvbnNlLmVuYWJsZWQ7XG4gICAgICAgIHRoaXMudXNlcklkID0gcmVzcG9uc2UudXNlcklkO1xuICAgICAgICB0aGlzLnVzZUV2ZW50cyA9IHJlc3BvbnNlLnVzZUV2ZW50cztcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBTZWN1cmVOb3RlVHlwZSB9IGZyb20gJy4uLy4uL2VudW1zL3NlY3VyZU5vdGVUeXBlJztcblxuaW1wb3J0IHsgU2VjdXJlTm90ZUFwaSB9IGZyb20gJy4uL2FwaS9zZWN1cmVOb3RlQXBpJztcblxuZXhwb3J0IGNsYXNzIFNlY3VyZU5vdGVEYXRhIHtcbiAgICB0eXBlOiBTZWN1cmVOb3RlVHlwZTtcblxuICAgIGNvbnN0cnVjdG9yKGRhdGE/OiBTZWN1cmVOb3RlQXBpKSB7XG4gICAgICAgIGlmIChkYXRhID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudHlwZSA9IGRhdGEudHlwZTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBTZW5kVHlwZSB9IGZyb20gJy4uLy4uL2VudW1zL3NlbmRUeXBlJztcblxuaW1wb3J0IHsgU2VuZEZpbGVEYXRhIH0gZnJvbSAnLi9zZW5kRmlsZURhdGEnO1xuaW1wb3J0IHsgU2VuZFRleHREYXRhIH0gZnJvbSAnLi9zZW5kVGV4dERhdGEnO1xuXG5pbXBvcnQgeyBTZW5kUmVzcG9uc2UgfSBmcm9tICcuLi9yZXNwb25zZS9zZW5kUmVzcG9uc2UnO1xuXG5leHBvcnQgY2xhc3MgU2VuZERhdGEge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgYWNjZXNzSWQ6IHN0cmluZztcbiAgICB1c2VySWQ6IHN0cmluZztcbiAgICB0eXBlOiBTZW5kVHlwZTtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgbm90ZXM6IHN0cmluZztcbiAgICBmaWxlOiBTZW5kRmlsZURhdGE7XG4gICAgdGV4dDogU2VuZFRleHREYXRhO1xuICAgIGtleTogc3RyaW5nO1xuICAgIG1heEFjY2Vzc0NvdW50PzogbnVtYmVyO1xuICAgIGFjY2Vzc0NvdW50OiBudW1iZXI7XG4gICAgcmV2aXNpb25EYXRlOiBzdHJpbmc7XG4gICAgZXhwaXJhdGlvbkRhdGU6IHN0cmluZztcbiAgICBkZWxldGlvbkRhdGU6IHN0cmluZztcbiAgICBwYXNzd29yZDogc3RyaW5nO1xuICAgIGRpc2FibGVkOiBib29sZWFuO1xuICAgIGhpZGVFbWFpbDogYm9vbGVhbjtcblxuICAgIGNvbnN0cnVjdG9yKHJlc3BvbnNlPzogU2VuZFJlc3BvbnNlLCB1c2VySWQ/OiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKHJlc3BvbnNlID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaWQgPSByZXNwb25zZS5pZDtcbiAgICAgICAgdGhpcy5hY2Nlc3NJZCA9IHJlc3BvbnNlLmFjY2Vzc0lkO1xuICAgICAgICB0aGlzLnVzZXJJZCA9IHVzZXJJZDtcbiAgICAgICAgdGhpcy50eXBlID0gcmVzcG9uc2UudHlwZTtcbiAgICAgICAgdGhpcy5uYW1lID0gcmVzcG9uc2UubmFtZTtcbiAgICAgICAgdGhpcy5ub3RlcyA9IHJlc3BvbnNlLm5vdGVzO1xuICAgICAgICB0aGlzLmtleSA9IHJlc3BvbnNlLmtleTtcbiAgICAgICAgdGhpcy5tYXhBY2Nlc3NDb3VudCA9IHJlc3BvbnNlLm1heEFjY2Vzc0NvdW50O1xuICAgICAgICB0aGlzLmFjY2Vzc0NvdW50ID0gcmVzcG9uc2UuYWNjZXNzQ291bnQ7XG4gICAgICAgIHRoaXMucmV2aXNpb25EYXRlID0gcmVzcG9uc2UucmV2aXNpb25EYXRlO1xuICAgICAgICB0aGlzLmV4cGlyYXRpb25EYXRlID0gcmVzcG9uc2UuZXhwaXJhdGlvbkRhdGU7XG4gICAgICAgIHRoaXMuZGVsZXRpb25EYXRlID0gcmVzcG9uc2UuZGVsZXRpb25EYXRlO1xuICAgICAgICB0aGlzLnBhc3N3b3JkID0gcmVzcG9uc2UucGFzc3dvcmQ7XG4gICAgICAgIHRoaXMuZGlzYWJsZWQgPSByZXNwb25zZS5kaXNhYmxlO1xuICAgICAgICB0aGlzLmhpZGVFbWFpbCA9IHJlc3BvbnNlLmhpZGVFbWFpbDtcblxuICAgICAgICBzd2l0Y2ggKHRoaXMudHlwZSkge1xuICAgICAgICAgICAgY2FzZSBTZW5kVHlwZS5UZXh0OlxuICAgICAgICAgICAgICAgIHRoaXMudGV4dCA9IG5ldyBTZW5kVGV4dERhdGEocmVzcG9uc2UudGV4dCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFNlbmRUeXBlLkZpbGU6XG4gICAgICAgICAgICAgICAgdGhpcy5maWxlID0gbmV3IFNlbmRGaWxlRGF0YShyZXNwb25zZS5maWxlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgeyBTZW5kRmlsZUFwaSB9IGZyb20gJy4uL2FwaS9zZW5kRmlsZUFwaSc7XG5cbmV4cG9ydCBjbGFzcyBTZW5kRmlsZURhdGEge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgZmlsZU5hbWU6IHN0cmluZztcbiAgICBrZXk6IHN0cmluZztcbiAgICBzaXplOiBzdHJpbmc7XG4gICAgc2l6ZU5hbWU6IHN0cmluZztcblxuICAgIGNvbnN0cnVjdG9yKGRhdGE/OiBTZW5kRmlsZUFwaSkge1xuICAgICAgICBpZiAoZGF0YSA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmlkID0gZGF0YS5pZDtcbiAgICAgICAgdGhpcy5maWxlTmFtZSA9IGRhdGEuZmlsZU5hbWU7XG4gICAgICAgIHRoaXMua2V5ID0gZGF0YS5rZXk7XG4gICAgICAgIHRoaXMuc2l6ZSA9IGRhdGEuc2l6ZTtcbiAgICAgICAgdGhpcy5zaXplTmFtZSA9IGRhdGEuc2l6ZU5hbWU7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgU2VuZFRleHRBcGkgfSBmcm9tICcuLi9hcGkvc2VuZFRleHRBcGknO1xuXG5leHBvcnQgY2xhc3MgU2VuZFRleHREYXRhIHtcbiAgICB0ZXh0OiBzdHJpbmc7XG4gICAgaGlkZGVuOiBib29sZWFuO1xuXG4gICAgY29uc3RydWN0b3IoZGF0YT86IFNlbmRUZXh0QXBpKSB7XG4gICAgICAgIGlmIChkYXRhID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudGV4dCA9IGRhdGEudGV4dDtcbiAgICAgICAgdGhpcy5oaWRkZW4gPSBkYXRhLmhpZGRlbjtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBBdHRhY2htZW50RGF0YSB9IGZyb20gJy4uL2RhdGEvYXR0YWNobWVudERhdGEnO1xuXG5pbXBvcnQgeyBBdHRhY2htZW50VmlldyB9IGZyb20gJy4uL3ZpZXcvYXR0YWNobWVudFZpZXcnO1xuXG5pbXBvcnQgRG9tYWluIGZyb20gJy4vZG9tYWluQmFzZSc7XG5pbXBvcnQgeyBFbmNTdHJpbmcgfSBmcm9tICcuL2VuY1N0cmluZyc7XG5pbXBvcnQgeyBTeW1tZXRyaWNDcnlwdG9LZXkgfSBmcm9tICcuL3N5bW1ldHJpY0NyeXB0b0tleSc7XG5cbmltcG9ydCB7IENyeXB0b1NlcnZpY2UgfSBmcm9tICcuLi8uLi9hYnN0cmFjdGlvbnMvY3J5cHRvLnNlcnZpY2UnO1xuXG5pbXBvcnQgeyBVdGlscyB9IGZyb20gJy4uLy4uL21pc2MvdXRpbHMnO1xuXG5leHBvcnQgY2xhc3MgQXR0YWNobWVudCBleHRlbmRzIERvbWFpbiB7XG4gICAgaWQ6IHN0cmluZztcbiAgICB1cmw6IHN0cmluZztcbiAgICBzaXplOiBzdHJpbmc7XG4gICAgc2l6ZU5hbWU6IHN0cmluZztcbiAgICBrZXk6IEVuY1N0cmluZztcbiAgICBmaWxlTmFtZTogRW5jU3RyaW5nO1xuXG4gICAgY29uc3RydWN0b3Iob2JqPzogQXR0YWNobWVudERhdGEsIGFscmVhZHlFbmNyeXB0ZWQ6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICBpZiAob2JqID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2l6ZSA9IG9iai5zaXplO1xuICAgICAgICB0aGlzLmJ1aWxkRG9tYWluTW9kZWwodGhpcywgb2JqLCB7XG4gICAgICAgICAgICBpZDogbnVsbCxcbiAgICAgICAgICAgIHVybDogbnVsbCxcbiAgICAgICAgICAgIHNpemVOYW1lOiBudWxsLFxuICAgICAgICAgICAgZmlsZU5hbWU6IG51bGwsXG4gICAgICAgICAgICBrZXk6IG51bGwsXG4gICAgICAgIH0sIGFscmVhZHlFbmNyeXB0ZWQsIFsnaWQnLCAndXJsJywgJ3NpemVOYW1lJ10pO1xuICAgIH1cblxuICAgIGFzeW5jIGRlY3J5cHQob3JnSWQ6IHN0cmluZywgZW5jS2V5PzogU3ltbWV0cmljQ3J5cHRvS2V5KTogUHJvbWlzZTxBdHRhY2htZW50Vmlldz4ge1xuICAgICAgICBjb25zdCB2aWV3ID0gYXdhaXQgdGhpcy5kZWNyeXB0T2JqKG5ldyBBdHRhY2htZW50Vmlldyh0aGlzKSwge1xuICAgICAgICAgICAgZmlsZU5hbWU6IG51bGwsXG4gICAgICAgIH0sIG9yZ0lkLCBlbmNLZXkpO1xuXG4gICAgICAgIGlmICh0aGlzLmtleSAhPSBudWxsKSB7XG4gICAgICAgICAgICBsZXQgY3J5cHRvU2VydmljZTogQ3J5cHRvU2VydmljZTtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lclNlcnZpY2UgPSAoVXRpbHMuZ2xvYmFsIGFzIGFueSkuYml0d2FyZGVuQ29udGFpbmVyU2VydmljZTtcbiAgICAgICAgICAgIGlmIChjb250YWluZXJTZXJ2aWNlKSB7XG4gICAgICAgICAgICAgICAgY3J5cHRvU2VydmljZSA9IGNvbnRhaW5lclNlcnZpY2UuZ2V0Q3J5cHRvU2VydmljZSgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2dsb2JhbCBiaXR3YXJkZW5Db250YWluZXJTZXJ2aWNlIG5vdCBpbml0aWFsaXplZC4nKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCBvcmdLZXkgPSBhd2FpdCBjcnlwdG9TZXJ2aWNlLmdldE9yZ0tleShvcmdJZCk7XG4gICAgICAgICAgICAgICAgY29uc3QgZGVjVmFsdWUgPSBhd2FpdCBjcnlwdG9TZXJ2aWNlLmRlY3J5cHRUb0J5dGVzKHRoaXMua2V5LCBvcmdLZXkgPz8gZW5jS2V5KTtcbiAgICAgICAgICAgICAgICB2aWV3LmtleSA9IG5ldyBTeW1tZXRyaWNDcnlwdG9LZXkoZGVjVmFsdWUpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIC8vIFRPRE86IGVycm9yP1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHZpZXc7XG4gICAgfVxuXG4gICAgdG9BdHRhY2htZW50RGF0YSgpOiBBdHRhY2htZW50RGF0YSB7XG4gICAgICAgIGNvbnN0IGEgPSBuZXcgQXR0YWNobWVudERhdGEoKTtcbiAgICAgICAgYS5zaXplID0gdGhpcy5zaXplO1xuICAgICAgICB0aGlzLmJ1aWxkRGF0YU1vZGVsKHRoaXMsIGEsIHtcbiAgICAgICAgICAgIGlkOiBudWxsLFxuICAgICAgICAgICAgdXJsOiBudWxsLFxuICAgICAgICAgICAgc2l6ZU5hbWU6IG51bGwsXG4gICAgICAgICAgICBmaWxlTmFtZTogbnVsbCxcbiAgICAgICAgICAgIGtleTogbnVsbCxcbiAgICAgICAgfSwgWydpZCcsICd1cmwnLCAnc2l6ZU5hbWUnXSk7XG4gICAgICAgIHJldHVybiBhO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IFR3b0ZhY3RvclByb3ZpZGVyVHlwZSB9IGZyb20gJy4uLy4uL2VudW1zL3R3b0ZhY3RvclByb3ZpZGVyVHlwZSc7XG5cbmV4cG9ydCBjbGFzcyBBdXRoUmVzdWx0IHtcbiAgICB0d29GYWN0b3I6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBjYXB0Y2hhU2l0ZUtleTogc3RyaW5nID0gJyc7XG4gICAgcmVzZXRNYXN0ZXJQYXNzd29yZDogYm9vbGVhbiA9IGZhbHNlO1xuICAgIGZvcmNlUGFzc3dvcmRSZXNldDogYm9vbGVhbiA9IGZhbHNlO1xuICAgIHR3b0ZhY3RvclByb3ZpZGVyczogTWFwPFR3b0ZhY3RvclByb3ZpZGVyVHlwZSwgeyBba2V5OiBzdHJpbmddOiBzdHJpbmc7IH0+ID0gbnVsbDtcbn1cbiIsImltcG9ydCB7IENhcmREYXRhIH0gZnJvbSAnLi4vZGF0YS9jYXJkRGF0YSc7XG5cbmltcG9ydCBEb21haW4gZnJvbSAnLi9kb21haW5CYXNlJztcbmltcG9ydCB7IEVuY1N0cmluZyB9IGZyb20gJy4vZW5jU3RyaW5nJztcblxuaW1wb3J0IHsgQ2FyZFZpZXcgfSBmcm9tICcuLi92aWV3L2NhcmRWaWV3JztcbmltcG9ydCB7IFN5bW1ldHJpY0NyeXB0b0tleSB9IGZyb20gJy4vc3ltbWV0cmljQ3J5cHRvS2V5JztcblxuZXhwb3J0IGNsYXNzIENhcmQgZXh0ZW5kcyBEb21haW4ge1xuICAgIGNhcmRob2xkZXJOYW1lOiBFbmNTdHJpbmc7XG4gICAgYnJhbmQ6IEVuY1N0cmluZztcbiAgICBudW1iZXI6IEVuY1N0cmluZztcbiAgICBleHBNb250aDogRW5jU3RyaW5nO1xuICAgIGV4cFllYXI6IEVuY1N0cmluZztcbiAgICBjb2RlOiBFbmNTdHJpbmc7XG5cbiAgICBjb25zdHJ1Y3RvcihvYmo/OiBDYXJkRGF0YSwgYWxyZWFkeUVuY3J5cHRlZDogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIGlmIChvYmogPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5idWlsZERvbWFpbk1vZGVsKHRoaXMsIG9iaiwge1xuICAgICAgICAgICAgY2FyZGhvbGRlck5hbWU6IG51bGwsXG4gICAgICAgICAgICBicmFuZDogbnVsbCxcbiAgICAgICAgICAgIG51bWJlcjogbnVsbCxcbiAgICAgICAgICAgIGV4cE1vbnRoOiBudWxsLFxuICAgICAgICAgICAgZXhwWWVhcjogbnVsbCxcbiAgICAgICAgICAgIGNvZGU6IG51bGwsXG4gICAgICAgIH0sIGFscmVhZHlFbmNyeXB0ZWQsIFtdKTtcbiAgICB9XG5cbiAgICBkZWNyeXB0KG9yZ0lkOiBzdHJpbmcsIGVuY0tleT86IFN5bW1ldHJpY0NyeXB0b0tleSk6IFByb21pc2U8Q2FyZFZpZXc+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGVjcnlwdE9iaihuZXcgQ2FyZFZpZXcodGhpcyksIHtcbiAgICAgICAgICAgIGNhcmRob2xkZXJOYW1lOiBudWxsLFxuICAgICAgICAgICAgYnJhbmQ6IG51bGwsXG4gICAgICAgICAgICBudW1iZXI6IG51bGwsXG4gICAgICAgICAgICBleHBNb250aDogbnVsbCxcbiAgICAgICAgICAgIGV4cFllYXI6IG51bGwsXG4gICAgICAgICAgICBjb2RlOiBudWxsLFxuICAgICAgICB9LCBvcmdJZCwgZW5jS2V5KTtcbiAgICB9XG5cbiAgICB0b0NhcmREYXRhKCk6IENhcmREYXRhIHtcbiAgICAgICAgY29uc3QgYyA9IG5ldyBDYXJkRGF0YSgpO1xuICAgICAgICB0aGlzLmJ1aWxkRGF0YU1vZGVsKHRoaXMsIGMsIHtcbiAgICAgICAgICAgIGNhcmRob2xkZXJOYW1lOiBudWxsLFxuICAgICAgICAgICAgYnJhbmQ6IG51bGwsXG4gICAgICAgICAgICBudW1iZXI6IG51bGwsXG4gICAgICAgICAgICBleHBNb250aDogbnVsbCxcbiAgICAgICAgICAgIGV4cFllYXI6IG51bGwsXG4gICAgICAgICAgICBjb2RlOiBudWxsLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGM7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgQ2lwaGVyUmVwcm9tcHRUeXBlIH0gZnJvbSAnLi4vLi4vZW51bXMvY2lwaGVyUmVwcm9tcHRUeXBlJztcbmltcG9ydCB7IENpcGhlclR5cGUgfSBmcm9tICcuLi8uLi9lbnVtcy9jaXBoZXJUeXBlJztcblxuaW1wb3J0IHsgQ2lwaGVyRGF0YSB9IGZyb20gJy4uL2RhdGEvY2lwaGVyRGF0YSc7XG5cbmltcG9ydCB7IENpcGhlclZpZXcgfSBmcm9tICcuLi92aWV3L2NpcGhlclZpZXcnO1xuXG5pbXBvcnQgeyBBdHRhY2htZW50IH0gZnJvbSAnLi9hdHRhY2htZW50JztcbmltcG9ydCB7IENhcmQgfSBmcm9tICcuL2NhcmQnO1xuaW1wb3J0IERvbWFpbiBmcm9tICcuL2RvbWFpbkJhc2UnO1xuaW1wb3J0IHsgRW5jU3RyaW5nIH0gZnJvbSAnLi9lbmNTdHJpbmcnO1xuaW1wb3J0IHsgRmllbGQgfSBmcm9tICcuL2ZpZWxkJztcbmltcG9ydCB7IElkZW50aXR5IH0gZnJvbSAnLi9pZGVudGl0eSc7XG5pbXBvcnQgeyBMb2dpbiB9IGZyb20gJy4vbG9naW4nO1xuaW1wb3J0IHsgUGFzc3dvcmQgfSBmcm9tICcuL3Bhc3N3b3JkJztcbmltcG9ydCB7IFNlY3VyZU5vdGUgfSBmcm9tICcuL3NlY3VyZU5vdGUnO1xuaW1wb3J0IHsgU3ltbWV0cmljQ3J5cHRvS2V5IH0gZnJvbSAnLi9zeW1tZXRyaWNDcnlwdG9LZXknO1xuXG5leHBvcnQgY2xhc3MgQ2lwaGVyIGV4dGVuZHMgRG9tYWluIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIG9yZ2FuaXphdGlvbklkOiBzdHJpbmc7XG4gICAgZm9sZGVySWQ6IHN0cmluZztcbiAgICBuYW1lOiBFbmNTdHJpbmc7XG4gICAgbm90ZXM6IEVuY1N0cmluZztcbiAgICB0eXBlOiBDaXBoZXJUeXBlO1xuICAgIGZhdm9yaXRlOiBib29sZWFuO1xuICAgIG9yZ2FuaXphdGlvblVzZVRvdHA6IGJvb2xlYW47XG4gICAgZWRpdDogYm9vbGVhbjtcbiAgICB2aWV3UGFzc3dvcmQ6IGJvb2xlYW47XG4gICAgcmV2aXNpb25EYXRlOiBEYXRlO1xuICAgIGxvY2FsRGF0YTogYW55O1xuICAgIGxvZ2luOiBMb2dpbjtcbiAgICBpZGVudGl0eTogSWRlbnRpdHk7XG4gICAgY2FyZDogQ2FyZDtcbiAgICBzZWN1cmVOb3RlOiBTZWN1cmVOb3RlO1xuICAgIGF0dGFjaG1lbnRzOiBBdHRhY2htZW50W107XG4gICAgZmllbGRzOiBGaWVsZFtdO1xuICAgIHBhc3N3b3JkSGlzdG9yeTogUGFzc3dvcmRbXTtcbiAgICBjb2xsZWN0aW9uSWRzOiBzdHJpbmdbXTtcbiAgICBkZWxldGVkRGF0ZTogRGF0ZTtcbiAgICByZXByb21wdDogQ2lwaGVyUmVwcm9tcHRUeXBlO1xuXG4gICAgY29uc3RydWN0b3Iob2JqPzogQ2lwaGVyRGF0YSwgYWxyZWFkeUVuY3J5cHRlZDogYm9vbGVhbiA9IGZhbHNlLCBsb2NhbERhdGE6IGFueSA9IG51bGwpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgaWYgKG9iaiA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmJ1aWxkRG9tYWluTW9kZWwodGhpcywgb2JqLCB7XG4gICAgICAgICAgICBpZDogbnVsbCxcbiAgICAgICAgICAgIHVzZXJJZDogbnVsbCxcbiAgICAgICAgICAgIG9yZ2FuaXphdGlvbklkOiBudWxsLFxuICAgICAgICAgICAgZm9sZGVySWQ6IG51bGwsXG4gICAgICAgICAgICBuYW1lOiBudWxsLFxuICAgICAgICAgICAgbm90ZXM6IG51bGwsXG4gICAgICAgIH0sIGFscmVhZHlFbmNyeXB0ZWQsIFsnaWQnLCAndXNlcklkJywgJ29yZ2FuaXphdGlvbklkJywgJ2ZvbGRlcklkJ10pO1xuXG4gICAgICAgIHRoaXMudHlwZSA9IG9iai50eXBlO1xuICAgICAgICB0aGlzLmZhdm9yaXRlID0gb2JqLmZhdm9yaXRlO1xuICAgICAgICB0aGlzLm9yZ2FuaXphdGlvblVzZVRvdHAgPSBvYmoub3JnYW5pemF0aW9uVXNlVG90cDtcbiAgICAgICAgdGhpcy5lZGl0ID0gb2JqLmVkaXQ7XG4gICAgICAgIGlmIChvYmoudmlld1Bhc3N3b3JkICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMudmlld1Bhc3N3b3JkID0gb2JqLnZpZXdQYXNzd29yZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudmlld1Bhc3N3b3JkID0gdHJ1ZTsgLy8gRGVmYXVsdCBmb3IgYWxyZWFkeSBzeW5jZWQgQ2lwaGVycyB3aXRob3V0IHZpZXdQYXNzd29yZFxuICAgICAgICB9XG4gICAgICAgIHRoaXMucmV2aXNpb25EYXRlID0gb2JqLnJldmlzaW9uRGF0ZSAhPSBudWxsID8gbmV3IERhdGUob2JqLnJldmlzaW9uRGF0ZSkgOiBudWxsO1xuICAgICAgICB0aGlzLmNvbGxlY3Rpb25JZHMgPSBvYmouY29sbGVjdGlvbklkcztcbiAgICAgICAgdGhpcy5sb2NhbERhdGEgPSBsb2NhbERhdGE7XG4gICAgICAgIHRoaXMuZGVsZXRlZERhdGUgPSBvYmouZGVsZXRlZERhdGUgIT0gbnVsbCA/IG5ldyBEYXRlKG9iai5kZWxldGVkRGF0ZSkgOiBudWxsO1xuICAgICAgICB0aGlzLnJlcHJvbXB0ID0gb2JqLnJlcHJvbXB0O1xuXG4gICAgICAgIHN3aXRjaCAodGhpcy50eXBlKSB7XG4gICAgICAgICAgICBjYXNlIENpcGhlclR5cGUuTG9naW46XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dpbiA9IG5ldyBMb2dpbihvYmoubG9naW4sIGFscmVhZHlFbmNyeXB0ZWQpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBDaXBoZXJUeXBlLlNlY3VyZU5vdGU6XG4gICAgICAgICAgICAgICAgdGhpcy5zZWN1cmVOb3RlID0gbmV3IFNlY3VyZU5vdGUob2JqLnNlY3VyZU5vdGUsIGFscmVhZHlFbmNyeXB0ZWQpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBDaXBoZXJUeXBlLkNhcmQ6XG4gICAgICAgICAgICAgICAgdGhpcy5jYXJkID0gbmV3IENhcmQob2JqLmNhcmQsIGFscmVhZHlFbmNyeXB0ZWQpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBDaXBoZXJUeXBlLklkZW50aXR5OlxuICAgICAgICAgICAgICAgIHRoaXMuaWRlbnRpdHkgPSBuZXcgSWRlbnRpdHkob2JqLmlkZW50aXR5LCBhbHJlYWR5RW5jcnlwdGVkKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob2JqLmF0dGFjaG1lbnRzICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuYXR0YWNobWVudHMgPSBvYmouYXR0YWNobWVudHMubWFwKGEgPT4gbmV3IEF0dGFjaG1lbnQoYSwgYWxyZWFkeUVuY3J5cHRlZCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5hdHRhY2htZW50cyA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob2JqLmZpZWxkcyAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmZpZWxkcyA9IG9iai5maWVsZHMubWFwKGYgPT4gbmV3IEZpZWxkKGYsIGFscmVhZHlFbmNyeXB0ZWQpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZmllbGRzID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvYmoucGFzc3dvcmRIaXN0b3J5ICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMucGFzc3dvcmRIaXN0b3J5ID0gb2JqLnBhc3N3b3JkSGlzdG9yeS5tYXAocGggPT4gbmV3IFBhc3N3b3JkKHBoLCBhbHJlYWR5RW5jcnlwdGVkKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnBhc3N3b3JkSGlzdG9yeSA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBkZWNyeXB0KGVuY0tleT86IFN5bW1ldHJpY0NyeXB0b0tleSk6IFByb21pc2U8Q2lwaGVyVmlldz4ge1xuICAgICAgICBjb25zdCBtb2RlbCA9IG5ldyBDaXBoZXJWaWV3KHRoaXMpO1xuXG4gICAgICAgIGF3YWl0IHRoaXMuZGVjcnlwdE9iaihtb2RlbCwge1xuICAgICAgICAgICAgbmFtZTogbnVsbCxcbiAgICAgICAgICAgIG5vdGVzOiBudWxsLFxuICAgICAgICB9LCB0aGlzLm9yZ2FuaXphdGlvbklkLCBlbmNLZXkpO1xuXG4gICAgICAgIHN3aXRjaCAodGhpcy50eXBlKSB7XG4gICAgICAgICAgICBjYXNlIENpcGhlclR5cGUuTG9naW46XG4gICAgICAgICAgICAgICAgbW9kZWwubG9naW4gPSBhd2FpdCB0aGlzLmxvZ2luLmRlY3J5cHQodGhpcy5vcmdhbml6YXRpb25JZCwgZW5jS2V5KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgQ2lwaGVyVHlwZS5TZWN1cmVOb3RlOlxuICAgICAgICAgICAgICAgIG1vZGVsLnNlY3VyZU5vdGUgPSBhd2FpdCB0aGlzLnNlY3VyZU5vdGUuZGVjcnlwdCh0aGlzLm9yZ2FuaXphdGlvbklkLCBlbmNLZXkpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBDaXBoZXJUeXBlLkNhcmQ6XG4gICAgICAgICAgICAgICAgbW9kZWwuY2FyZCA9IGF3YWl0IHRoaXMuY2FyZC5kZWNyeXB0KHRoaXMub3JnYW5pemF0aW9uSWQsIGVuY0tleSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIENpcGhlclR5cGUuSWRlbnRpdHk6XG4gICAgICAgICAgICAgICAgbW9kZWwuaWRlbnRpdHkgPSBhd2FpdCB0aGlzLmlkZW50aXR5LmRlY3J5cHQodGhpcy5vcmdhbml6YXRpb25JZCwgZW5jS2V5KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBvcmdJZCA9IHRoaXMub3JnYW5pemF0aW9uSWQ7XG5cbiAgICAgICAgaWYgKHRoaXMuYXR0YWNobWVudHMgIT0gbnVsbCAmJiB0aGlzLmF0dGFjaG1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGF0dGFjaG1lbnRzOiBhbnlbXSA9IFtdO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5hdHRhY2htZW50cy5yZWR1Y2UoKHByb21pc2UsIGF0dGFjaG1lbnQpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvbWlzZS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF0dGFjaG1lbnQuZGVjcnlwdChvcmdJZCwgZW5jS2V5KTtcbiAgICAgICAgICAgICAgICB9KS50aGVuKGRlY0F0dGFjaG1lbnQgPT4ge1xuICAgICAgICAgICAgICAgICAgICBhdHRhY2htZW50cy5wdXNoKGRlY0F0dGFjaG1lbnQpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSwgUHJvbWlzZS5yZXNvbHZlKCkpO1xuICAgICAgICAgICAgbW9kZWwuYXR0YWNobWVudHMgPSBhdHRhY2htZW50cztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmZpZWxkcyAhPSBudWxsICYmIHRoaXMuZmllbGRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGZpZWxkczogYW55W10gPSBbXTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZmllbGRzLnJlZHVjZSgocHJvbWlzZSwgZmllbGQpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvbWlzZS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpZWxkLmRlY3J5cHQob3JnSWQsIGVuY0tleSk7XG4gICAgICAgICAgICAgICAgfSkudGhlbihkZWNGaWVsZCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkcy5wdXNoKGRlY0ZpZWxkKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sIFByb21pc2UucmVzb2x2ZSgpKTtcbiAgICAgICAgICAgIG1vZGVsLmZpZWxkcyA9IGZpZWxkcztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnBhc3N3b3JkSGlzdG9yeSAhPSBudWxsICYmIHRoaXMucGFzc3dvcmRIaXN0b3J5Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHBhc3N3b3JkSGlzdG9yeTogYW55W10gPSBbXTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucGFzc3dvcmRIaXN0b3J5LnJlZHVjZSgocHJvbWlzZSwgcGgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvbWlzZS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBoLmRlY3J5cHQob3JnSWQsIGVuY0tleSk7XG4gICAgICAgICAgICAgICAgfSkudGhlbihkZWNQaCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHBhc3N3b3JkSGlzdG9yeS5wdXNoKGRlY1BoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sIFByb21pc2UucmVzb2x2ZSgpKTtcbiAgICAgICAgICAgIG1vZGVsLnBhc3N3b3JkSGlzdG9yeSA9IHBhc3N3b3JkSGlzdG9yeTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBtb2RlbDtcbiAgICB9XG5cbiAgICB0b0NpcGhlckRhdGEodXNlcklkOiBzdHJpbmcpOiBDaXBoZXJEYXRhIHtcbiAgICAgICAgY29uc3QgYyA9IG5ldyBDaXBoZXJEYXRhKCk7XG4gICAgICAgIGMuaWQgPSB0aGlzLmlkO1xuICAgICAgICBjLm9yZ2FuaXphdGlvbklkID0gdGhpcy5vcmdhbml6YXRpb25JZDtcbiAgICAgICAgYy5mb2xkZXJJZCA9IHRoaXMuZm9sZGVySWQ7XG4gICAgICAgIGMudXNlcklkID0gdGhpcy5vcmdhbml6YXRpb25JZCAhPSBudWxsID8gdXNlcklkIDogbnVsbDtcbiAgICAgICAgYy5lZGl0ID0gdGhpcy5lZGl0O1xuICAgICAgICBjLnZpZXdQYXNzd29yZCA9IHRoaXMudmlld1Bhc3N3b3JkO1xuICAgICAgICBjLm9yZ2FuaXphdGlvblVzZVRvdHAgPSB0aGlzLm9yZ2FuaXphdGlvblVzZVRvdHA7XG4gICAgICAgIGMuZmF2b3JpdGUgPSB0aGlzLmZhdm9yaXRlO1xuICAgICAgICBjLnJldmlzaW9uRGF0ZSA9IHRoaXMucmV2aXNpb25EYXRlICE9IG51bGwgPyB0aGlzLnJldmlzaW9uRGF0ZS50b0lTT1N0cmluZygpIDogbnVsbDtcbiAgICAgICAgYy50eXBlID0gdGhpcy50eXBlO1xuICAgICAgICBjLmNvbGxlY3Rpb25JZHMgPSB0aGlzLmNvbGxlY3Rpb25JZHM7XG4gICAgICAgIGMuZGVsZXRlZERhdGUgPSB0aGlzLmRlbGV0ZWREYXRlICE9IG51bGwgPyB0aGlzLmRlbGV0ZWREYXRlLnRvSVNPU3RyaW5nKCkgOiBudWxsO1xuICAgICAgICBjLnJlcHJvbXB0ID0gdGhpcy5yZXByb21wdDtcblxuICAgICAgICB0aGlzLmJ1aWxkRGF0YU1vZGVsKHRoaXMsIGMsIHtcbiAgICAgICAgICAgIG5hbWU6IG51bGwsXG4gICAgICAgICAgICBub3RlczogbnVsbCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgc3dpdGNoIChjLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgQ2lwaGVyVHlwZS5Mb2dpbjpcbiAgICAgICAgICAgICAgICBjLmxvZ2luID0gdGhpcy5sb2dpbi50b0xvZ2luRGF0YSgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBDaXBoZXJUeXBlLlNlY3VyZU5vdGU6XG4gICAgICAgICAgICAgICAgYy5zZWN1cmVOb3RlID0gdGhpcy5zZWN1cmVOb3RlLnRvU2VjdXJlTm90ZURhdGEoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgQ2lwaGVyVHlwZS5DYXJkOlxuICAgICAgICAgICAgICAgIGMuY2FyZCA9IHRoaXMuY2FyZC50b0NhcmREYXRhKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIENpcGhlclR5cGUuSWRlbnRpdHk6XG4gICAgICAgICAgICAgICAgYy5pZGVudGl0eSA9IHRoaXMuaWRlbnRpdHkudG9JZGVudGl0eURhdGEoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5maWVsZHMgIT0gbnVsbCkge1xuICAgICAgICAgICAgYy5maWVsZHMgPSB0aGlzLmZpZWxkcy5tYXAoZiA9PiBmLnRvRmllbGREYXRhKCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmF0dGFjaG1lbnRzICE9IG51bGwpIHtcbiAgICAgICAgICAgIGMuYXR0YWNobWVudHMgPSB0aGlzLmF0dGFjaG1lbnRzLm1hcChhID0+IGEudG9BdHRhY2htZW50RGF0YSgpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5wYXNzd29yZEhpc3RvcnkgIT0gbnVsbCkge1xuICAgICAgICAgICAgYy5wYXNzd29yZEhpc3RvcnkgPSB0aGlzLnBhc3N3b3JkSGlzdG9yeS5tYXAocGggPT4gcGgudG9QYXNzd29yZEhpc3RvcnlEYXRhKCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IENvbGxlY3Rpb25EYXRhIH0gZnJvbSAnLi4vZGF0YS9jb2xsZWN0aW9uRGF0YSc7XG5cbmltcG9ydCB7IENvbGxlY3Rpb25WaWV3IH0gZnJvbSAnLi4vdmlldy9jb2xsZWN0aW9uVmlldyc7XG5cbmltcG9ydCBEb21haW4gZnJvbSAnLi9kb21haW5CYXNlJztcbmltcG9ydCB7IEVuY1N0cmluZyB9IGZyb20gJy4vZW5jU3RyaW5nJztcblxuZXhwb3J0IGNsYXNzIENvbGxlY3Rpb24gZXh0ZW5kcyBEb21haW4ge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgb3JnYW5pemF0aW9uSWQ6IHN0cmluZztcbiAgICBuYW1lOiBFbmNTdHJpbmc7XG4gICAgZXh0ZXJuYWxJZDogc3RyaW5nO1xuICAgIHJlYWRPbmx5OiBib29sZWFuO1xuICAgIGhpZGVQYXNzd29yZHM6IGJvb2xlYW47XG5cbiAgICBjb25zdHJ1Y3RvcihvYmo/OiBDb2xsZWN0aW9uRGF0YSwgYWxyZWFkeUVuY3J5cHRlZDogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIGlmIChvYmogPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5idWlsZERvbWFpbk1vZGVsKHRoaXMsIG9iaiwge1xuICAgICAgICAgICAgaWQ6IG51bGwsXG4gICAgICAgICAgICBvcmdhbml6YXRpb25JZDogbnVsbCxcbiAgICAgICAgICAgIG5hbWU6IG51bGwsXG4gICAgICAgICAgICBleHRlcm5hbElkOiBudWxsLFxuICAgICAgICAgICAgcmVhZE9ubHk6IG51bGwsXG4gICAgICAgICAgICBoaWRlUGFzc3dvcmRzOiBudWxsLFxuICAgICAgICB9LCBhbHJlYWR5RW5jcnlwdGVkLCBbJ2lkJywgJ29yZ2FuaXphdGlvbklkJywgJ2V4dGVybmFsSWQnLCAncmVhZE9ubHknLCAnaGlkZVBhc3N3b3JkcyddKTtcbiAgICB9XG5cbiAgICBkZWNyeXB0KCk6IFByb21pc2U8Q29sbGVjdGlvblZpZXc+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGVjcnlwdE9iaihuZXcgQ29sbGVjdGlvblZpZXcodGhpcyksIHtcbiAgICAgICAgICAgIG5hbWU6IG51bGwsXG4gICAgICAgIH0sIHRoaXMub3JnYW5pemF0aW9uSWQpO1xuICAgIH1cbn1cbiIsImV4cG9ydCBjbGFzcyBEZWNyeXB0UGFyYW1ldGVyczxUPiB7XG4gICAgZW5jS2V5OiBUO1xuICAgIGRhdGE6IFQ7XG4gICAgaXY6IFQ7XG4gICAgbWFjS2V5OiBUO1xuICAgIG1hYzogVDtcbiAgICBtYWNEYXRhOiBUO1xufVxuIiwiaW1wb3J0IHsgRW5jU3RyaW5nIH0gZnJvbSAnLi9lbmNTdHJpbmcnO1xuXG5pbXBvcnQgeyBWaWV3IH0gZnJvbSAnLi4vdmlldy92aWV3JztcblxuaW1wb3J0IHsgU3ltbWV0cmljQ3J5cHRvS2V5IH0gZnJvbSAnLi9zeW1tZXRyaWNDcnlwdG9LZXknO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEb21haW4ge1xuICAgIHByb3RlY3RlZCBidWlsZERvbWFpbk1vZGVsPEQgZXh0ZW5kcyBEb21haW4+KGRvbWFpbjogRCwgZGF0YU9iajogYW55LCBtYXA6IGFueSxcbiAgICAgICAgYWxyZWFkeUVuY3J5cHRlZDogYm9vbGVhbiwgbm90RW5jTGlzdDogYW55W10gPSBbXSkge1xuICAgICAgICBmb3IgKGNvbnN0IHByb3AgaW4gbWFwKSB7XG4gICAgICAgICAgICBpZiAoIW1hcC5oYXNPd25Qcm9wZXJ0eShwcm9wKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBvYmpQcm9wID0gZGF0YU9ialsobWFwW3Byb3BdIHx8IHByb3ApXTtcbiAgICAgICAgICAgIGlmIChhbHJlYWR5RW5jcnlwdGVkID09PSB0cnVlIHx8IG5vdEVuY0xpc3QuaW5kZXhPZihwcm9wKSA+IC0xKSB7XG4gICAgICAgICAgICAgICAgKGRvbWFpbiBhcyBhbnkpW3Byb3BdID0gb2JqUHJvcCA/IG9ialByb3AgOiBudWxsO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAoZG9tYWluIGFzIGFueSlbcHJvcF0gPSBvYmpQcm9wID8gbmV3IEVuY1N0cmluZyhvYmpQcm9wKSA6IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHJvdGVjdGVkIGJ1aWxkRGF0YU1vZGVsPEQgZXh0ZW5kcyBEb21haW4+KGRvbWFpbjogRCwgZGF0YU9iajogYW55LCBtYXA6IGFueSwgbm90RW5jU3RyaW5nTGlzdDogYW55W10gPSBbXSkge1xuICAgICAgICBmb3IgKGNvbnN0IHByb3AgaW4gbWFwKSB7XG4gICAgICAgICAgICBpZiAoIW1hcC5oYXNPd25Qcm9wZXJ0eShwcm9wKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBvYmpQcm9wID0gKGRvbWFpbiBhcyBhbnkpWyhtYXBbcHJvcF0gfHwgcHJvcCldO1xuICAgICAgICAgICAgaWYgKG5vdEVuY1N0cmluZ0xpc3QuaW5kZXhPZihwcm9wKSA+IC0xKSB7XG4gICAgICAgICAgICAgICAgKGRhdGFPYmogYXMgYW55KVtwcm9wXSA9IG9ialByb3AgIT0gbnVsbCA/IG9ialByb3AgOiBudWxsO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAoZGF0YU9iaiBhcyBhbnkpW3Byb3BdID0gb2JqUHJvcCAhPSBudWxsID8gKG9ialByb3AgYXMgRW5jU3RyaW5nKS5lbmNyeXB0ZWRTdHJpbmcgOiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGFzeW5jIGRlY3J5cHRPYmo8VCBleHRlbmRzIFZpZXc+KHZpZXdNb2RlbDogVCwgbWFwOiBhbnksIG9yZ0lkOiBzdHJpbmcsXG4gICAgICAgIGtleTogU3ltbWV0cmljQ3J5cHRvS2V5ID0gbnVsbCk6IFByb21pc2U8VD4ge1xuICAgICAgICBjb25zdCBwcm9taXNlcyA9IFtdO1xuICAgICAgICBjb25zdCBzZWxmOiBhbnkgPSB0aGlzO1xuXG4gICAgICAgIGZvciAoY29uc3QgcHJvcCBpbiBtYXApIHtcbiAgICAgICAgICAgIGlmICghbWFwLmhhc093blByb3BlcnR5KHByb3ApKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZVxuICAgICAgICAgICAgKGZ1bmN0aW9uICh0aGVQcm9wKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcCA9IFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXBQcm9wID0gbWFwW3RoZVByb3BdIHx8IHRoZVByb3A7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWxmW21hcFByb3BdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZlttYXBQcm9wXS5kZWNyeXB0KG9yZ0lkLCBrZXkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH0pLnRoZW4oKHZhbDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICh2aWV3TW9kZWwgYXMgYW55KVt0aGVQcm9wXSA9IHZhbDtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBwcm9taXNlcy5wdXNoKHApO1xuICAgICAgICAgICAgfSkocHJvcCk7XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gICAgICAgIHJldHVybiB2aWV3TW9kZWw7XG4gICAgfVxufVxuIiwiZXhwb3J0IGNsYXNzIEVuY0FycmF5QnVmZmVyIHtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgYnVmZmVyOiBBcnJheUJ1ZmZlcikgeyB9XG59XG4iLCJpbXBvcnQgeyBFbmNyeXB0aW9uVHlwZSB9IGZyb20gJy4uLy4uL2VudW1zL2VuY3J5cHRpb25UeXBlJztcblxuaW1wb3J0IHsgQ3J5cHRvU2VydmljZSB9IGZyb20gJy4uLy4uL2Fic3RyYWN0aW9ucy9jcnlwdG8uc2VydmljZSc7XG5cbmltcG9ydCB7IFV0aWxzIH0gZnJvbSAnLi4vLi4vbWlzYy91dGlscyc7XG5cbmltcG9ydCB7IFN5bW1ldHJpY0NyeXB0b0tleSB9IGZyb20gJy4vc3ltbWV0cmljQ3J5cHRvS2V5JztcblxuZXhwb3J0IGNsYXNzIEVuY1N0cmluZyB7XG4gICAgZW5jcnlwdGVkU3RyaW5nPzogc3RyaW5nO1xuICAgIGVuY3J5cHRpb25UeXBlPzogRW5jcnlwdGlvblR5cGU7XG4gICAgZGVjcnlwdGVkVmFsdWU/OiBzdHJpbmc7XG4gICAgZGF0YT86IHN0cmluZztcbiAgICBpdj86IHN0cmluZztcbiAgICBtYWM/OiBzdHJpbmc7XG5cbiAgICBjb25zdHJ1Y3RvcihlbmNyeXB0ZWRTdHJpbmdPclR5cGU6IHN0cmluZyB8IEVuY3J5cHRpb25UeXBlLCBkYXRhPzogc3RyaW5nLCBpdj86IHN0cmluZywgbWFjPzogc3RyaW5nKSB7XG4gICAgICAgIGlmIChkYXRhICE9IG51bGwpIHtcbiAgICAgICAgICAgIC8vIGRhdGEgYW5kIGhlYWRlclxuICAgICAgICAgICAgY29uc3QgZW5jVHlwZSA9IGVuY3J5cHRlZFN0cmluZ09yVHlwZSBhcyBFbmNyeXB0aW9uVHlwZTtcblxuICAgICAgICAgICAgaWYgKGl2ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVuY3J5cHRlZFN0cmluZyA9IGVuY1R5cGUgKyAnLicgKyBpdiArICd8JyArIGRhdGE7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuZW5jcnlwdGVkU3RyaW5nID0gZW5jVHlwZSArICcuJyArIGRhdGE7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIG1hY1xuICAgICAgICAgICAgaWYgKG1hYyAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbmNyeXB0ZWRTdHJpbmcgKz0gKCd8JyArIG1hYyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuZW5jcnlwdGlvblR5cGUgPSBlbmNUeXBlO1xuICAgICAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgICAgICAgICAgIHRoaXMuaXYgPSBpdjtcbiAgICAgICAgICAgIHRoaXMubWFjID0gbWFjO1xuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmVuY3J5cHRlZFN0cmluZyA9IGVuY3J5cHRlZFN0cmluZ09yVHlwZSBhcyBzdHJpbmc7XG4gICAgICAgIGlmICghdGhpcy5lbmNyeXB0ZWRTdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGhlYWRlclBpZWNlcyA9IHRoaXMuZW5jcnlwdGVkU3RyaW5nLnNwbGl0KCcuJyk7XG4gICAgICAgIGxldCBlbmNQaWVjZXM6IHN0cmluZ1tdID0gbnVsbDtcblxuICAgICAgICBpZiAoaGVhZGVyUGllY2VzLmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB0aGlzLmVuY3J5cHRpb25UeXBlID0gcGFyc2VJbnQoaGVhZGVyUGllY2VzWzBdLCBudWxsKTtcbiAgICAgICAgICAgICAgICBlbmNQaWVjZXMgPSBoZWFkZXJQaWVjZXNbMV0uc3BsaXQoJ3wnKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlbmNQaWVjZXMgPSB0aGlzLmVuY3J5cHRlZFN0cmluZy5zcGxpdCgnfCcpO1xuICAgICAgICAgICAgdGhpcy5lbmNyeXB0aW9uVHlwZSA9IGVuY1BpZWNlcy5sZW5ndGggPT09IDMgPyBFbmNyeXB0aW9uVHlwZS5BZXNDYmMxMjhfSG1hY1NoYTI1Nl9CNjQgOlxuICAgICAgICAgICAgICAgIEVuY3J5cHRpb25UeXBlLkFlc0NiYzI1Nl9CNjQ7XG4gICAgICAgIH1cblxuICAgICAgICBzd2l0Y2ggKHRoaXMuZW5jcnlwdGlvblR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgRW5jcnlwdGlvblR5cGUuQWVzQ2JjMTI4X0htYWNTaGEyNTZfQjY0OlxuICAgICAgICAgICAgY2FzZSBFbmNyeXB0aW9uVHlwZS5BZXNDYmMyNTZfSG1hY1NoYTI1Nl9CNjQ6XG4gICAgICAgICAgICAgICAgaWYgKGVuY1BpZWNlcy5sZW5ndGggIT09IDMpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMuaXYgPSBlbmNQaWVjZXNbMF07XG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhID0gZW5jUGllY2VzWzFdO1xuICAgICAgICAgICAgICAgIHRoaXMubWFjID0gZW5jUGllY2VzWzJdO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBFbmNyeXB0aW9uVHlwZS5BZXNDYmMyNTZfQjY0OlxuICAgICAgICAgICAgICAgIGlmIChlbmNQaWVjZXMubGVuZ3RoICE9PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLml2ID0gZW5jUGllY2VzWzBdO1xuICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IGVuY1BpZWNlc1sxXTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgRW5jcnlwdGlvblR5cGUuUnNhMjA0OF9PYWVwU2hhMjU2X0I2NDpcbiAgICAgICAgICAgIGNhc2UgRW5jcnlwdGlvblR5cGUuUnNhMjA0OF9PYWVwU2hhMV9CNjQ6XG4gICAgICAgICAgICAgICAgaWYgKGVuY1BpZWNlcy5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IGVuY1BpZWNlc1swXTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgZGVjcnlwdChvcmdJZDogc3RyaW5nLCBrZXk6IFN5bW1ldHJpY0NyeXB0b0tleSA9IG51bGwpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBpZiAodGhpcy5kZWNyeXB0ZWRWYWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kZWNyeXB0ZWRWYWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBjcnlwdG9TZXJ2aWNlOiBDcnlwdG9TZXJ2aWNlO1xuICAgICAgICBjb25zdCBjb250YWluZXJTZXJ2aWNlID0gKFV0aWxzLmdsb2JhbCBhcyBhbnkpLmJpdHdhcmRlbkNvbnRhaW5lclNlcnZpY2U7XG4gICAgICAgIGlmIChjb250YWluZXJTZXJ2aWNlKSB7XG4gICAgICAgICAgICBjcnlwdG9TZXJ2aWNlID0gY29udGFpbmVyU2VydmljZS5nZXRDcnlwdG9TZXJ2aWNlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2dsb2JhbCBiaXR3YXJkZW5Db250YWluZXJTZXJ2aWNlIG5vdCBpbml0aWFsaXplZC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoa2V5ID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBrZXkgPSBhd2FpdCBjcnlwdG9TZXJ2aWNlLmdldE9yZ0tleShvcmdJZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmRlY3J5cHRlZFZhbHVlID0gYXdhaXQgY3J5cHRvU2VydmljZS5kZWNyeXB0VG9VdGY4KHRoaXMsIGtleSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRoaXMuZGVjcnlwdGVkVmFsdWUgPSAnW2Vycm9yOiBjYW5ub3QgZGVjcnlwdF0nO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmRlY3J5cHRlZFZhbHVlO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IFN5bW1ldHJpY0NyeXB0b0tleSB9IGZyb20gJy4vc3ltbWV0cmljQ3J5cHRvS2V5JztcblxuZXhwb3J0IGNsYXNzIEVuY3J5cHRlZE9iamVjdCB7XG4gICAgaXY6IEFycmF5QnVmZmVyO1xuICAgIGRhdGE6IEFycmF5QnVmZmVyO1xuICAgIG1hYzogQXJyYXlCdWZmZXI7XG4gICAga2V5OiBTeW1tZXRyaWNDcnlwdG9LZXk7XG59XG4iLCJleHBvcnQgY2xhc3MgRW52aXJvbm1lbnRVcmxzIHtcbiAgICBiYXNlOiBzdHJpbmc7XG4gICAgYXBpOiBzdHJpbmc7XG4gICAgaWRlbnRpdHk6IHN0cmluZztcbiAgICBldmVudHM6IHN0cmluZztcbn1cbiIsImltcG9ydCB7IEZpZWxkVHlwZSB9IGZyb20gJy4uLy4uL2VudW1zL2ZpZWxkVHlwZSc7XG5pbXBvcnQgeyBMaW5rZWRJZFR5cGUgfSBmcm9tICcuLi8uLi9lbnVtcy9saW5rZWRJZFR5cGUnO1xuXG5pbXBvcnQgeyBGaWVsZERhdGEgfSBmcm9tICcuLi9kYXRhL2ZpZWxkRGF0YSc7XG5cbmltcG9ydCBEb21haW4gZnJvbSAnLi9kb21haW5CYXNlJztcbmltcG9ydCB7IEVuY1N0cmluZyB9IGZyb20gJy4vZW5jU3RyaW5nJztcblxuaW1wb3J0IHsgRmllbGRWaWV3IH0gZnJvbSAnLi4vdmlldy9maWVsZFZpZXcnO1xuaW1wb3J0IHsgU3ltbWV0cmljQ3J5cHRvS2V5IH0gZnJvbSAnLi9zeW1tZXRyaWNDcnlwdG9LZXknO1xuXG5leHBvcnQgY2xhc3MgRmllbGQgZXh0ZW5kcyBEb21haW4ge1xuICAgIG5hbWU6IEVuY1N0cmluZztcbiAgICB2YWx1ZTogRW5jU3RyaW5nO1xuICAgIHR5cGU6IEZpZWxkVHlwZTtcbiAgICBsaW5rZWRJZDogTGlua2VkSWRUeXBlO1xuXG4gICAgY29uc3RydWN0b3Iob2JqPzogRmllbGREYXRhLCBhbHJlYWR5RW5jcnlwdGVkOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgaWYgKG9iaiA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnR5cGUgPSBvYmoudHlwZTtcbiAgICAgICAgdGhpcy5saW5rZWRJZCA9IG9iai5saW5rZWRJZDtcbiAgICAgICAgdGhpcy5idWlsZERvbWFpbk1vZGVsKHRoaXMsIG9iaiwge1xuICAgICAgICAgICAgbmFtZTogbnVsbCxcbiAgICAgICAgICAgIHZhbHVlOiBudWxsLFxuICAgICAgICB9LCBhbHJlYWR5RW5jcnlwdGVkLCBbXSk7XG4gICAgfVxuXG4gICAgZGVjcnlwdChvcmdJZDogc3RyaW5nLCBlbmNLZXk/OiBTeW1tZXRyaWNDcnlwdG9LZXkpOiBQcm9taXNlPEZpZWxkVmlldz4ge1xuICAgICAgICByZXR1cm4gdGhpcy5kZWNyeXB0T2JqKG5ldyBGaWVsZFZpZXcodGhpcyksIHtcbiAgICAgICAgICAgIG5hbWU6IG51bGwsXG4gICAgICAgICAgICB2YWx1ZTogbnVsbCxcbiAgICAgICAgfSwgb3JnSWQsIGVuY0tleSk7XG4gICAgfVxuXG4gICAgdG9GaWVsZERhdGEoKTogRmllbGREYXRhIHtcbiAgICAgICAgY29uc3QgZiA9IG5ldyBGaWVsZERhdGEoKTtcbiAgICAgICAgdGhpcy5idWlsZERhdGFNb2RlbCh0aGlzLCBmLCB7XG4gICAgICAgICAgICBuYW1lOiBudWxsLFxuICAgICAgICAgICAgdmFsdWU6IG51bGwsXG4gICAgICAgICAgICB0eXBlOiBudWxsLFxuICAgICAgICAgICAgbGlua2VkSWQ6IG51bGwsXG4gICAgICAgIH0sIFsndHlwZScsICdsaW5rZWRJZCddKTtcbiAgICAgICAgcmV0dXJuIGY7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgRm9sZGVyRGF0YSB9IGZyb20gJy4uL2RhdGEvZm9sZGVyRGF0YSc7XG5cbmltcG9ydCB7IEZvbGRlclZpZXcgfSBmcm9tICcuLi92aWV3L2ZvbGRlclZpZXcnO1xuXG5pbXBvcnQgRG9tYWluIGZyb20gJy4vZG9tYWluQmFzZSc7XG5pbXBvcnQgeyBFbmNTdHJpbmcgfSBmcm9tICcuL2VuY1N0cmluZyc7XG5cbmV4cG9ydCBjbGFzcyBGb2xkZXIgZXh0ZW5kcyBEb21haW4ge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgbmFtZTogRW5jU3RyaW5nO1xuICAgIHJldmlzaW9uRGF0ZTogRGF0ZTtcblxuICAgIGNvbnN0cnVjdG9yKG9iaj86IEZvbGRlckRhdGEsIGFscmVhZHlFbmNyeXB0ZWQ6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICBpZiAob2JqID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuYnVpbGREb21haW5Nb2RlbCh0aGlzLCBvYmosIHtcbiAgICAgICAgICAgIGlkOiBudWxsLFxuICAgICAgICAgICAgbmFtZTogbnVsbCxcbiAgICAgICAgfSwgYWxyZWFkeUVuY3J5cHRlZCwgWydpZCddKTtcblxuICAgICAgICB0aGlzLnJldmlzaW9uRGF0ZSA9IG9iai5yZXZpc2lvbkRhdGUgIT0gbnVsbCA/IG5ldyBEYXRlKG9iai5yZXZpc2lvbkRhdGUpIDogbnVsbDtcbiAgICB9XG5cbiAgICBkZWNyeXB0KCk6IFByb21pc2U8Rm9sZGVyVmlldz4ge1xuICAgICAgICByZXR1cm4gdGhpcy5kZWNyeXB0T2JqKG5ldyBGb2xkZXJWaWV3KHRoaXMpLCB7XG4gICAgICAgICAgICBuYW1lOiBudWxsLFxuICAgICAgICB9LCBudWxsKTtcbiAgICB9XG59XG4iLCJleHBvcnQgY2xhc3MgR2VuZXJhdGVkUGFzc3dvcmRIaXN0b3J5IHtcbiAgICBwYXNzd29yZDogc3RyaW5nO1xuICAgIGRhdGU6IG51bWJlcjtcblxuICAgIGNvbnN0cnVjdG9yKHBhc3N3b3JkOiBzdHJpbmcsIGRhdGU6IG51bWJlcikge1xuICAgICAgICB0aGlzLnBhc3N3b3JkID0gcGFzc3dvcmQ7XG4gICAgICAgIHRoaXMuZGF0ZSA9IGRhdGU7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgSWRlbnRpdHlEYXRhIH0gZnJvbSAnLi4vZGF0YS9pZGVudGl0eURhdGEnO1xuXG5pbXBvcnQgRG9tYWluIGZyb20gJy4vZG9tYWluQmFzZSc7XG5pbXBvcnQgeyBFbmNTdHJpbmcgfSBmcm9tICcuL2VuY1N0cmluZyc7XG5pbXBvcnQgeyBTeW1tZXRyaWNDcnlwdG9LZXkgfSBmcm9tICcuL3N5bW1ldHJpY0NyeXB0b0tleSc7XG5cbmltcG9ydCB7IElkZW50aXR5VmlldyB9IGZyb20gJy4uL3ZpZXcvaWRlbnRpdHlWaWV3JztcblxuZXhwb3J0IGNsYXNzIElkZW50aXR5IGV4dGVuZHMgRG9tYWluIHtcbiAgICB0aXRsZTogRW5jU3RyaW5nO1xuICAgIGZpcnN0TmFtZTogRW5jU3RyaW5nO1xuICAgIG1pZGRsZU5hbWU6IEVuY1N0cmluZztcbiAgICBsYXN0TmFtZTogRW5jU3RyaW5nO1xuICAgIGFkZHJlc3MxOiBFbmNTdHJpbmc7XG4gICAgYWRkcmVzczI6IEVuY1N0cmluZztcbiAgICBhZGRyZXNzMzogRW5jU3RyaW5nO1xuICAgIGNpdHk6IEVuY1N0cmluZztcbiAgICBzdGF0ZTogRW5jU3RyaW5nO1xuICAgIHBvc3RhbENvZGU6IEVuY1N0cmluZztcbiAgICBjb3VudHJ5OiBFbmNTdHJpbmc7XG4gICAgY29tcGFueTogRW5jU3RyaW5nO1xuICAgIGVtYWlsOiBFbmNTdHJpbmc7XG4gICAgcGhvbmU6IEVuY1N0cmluZztcbiAgICBzc246IEVuY1N0cmluZztcbiAgICB1c2VybmFtZTogRW5jU3RyaW5nO1xuICAgIHBhc3Nwb3J0TnVtYmVyOiBFbmNTdHJpbmc7XG4gICAgbGljZW5zZU51bWJlcjogRW5jU3RyaW5nO1xuXG4gICAgY29uc3RydWN0b3Iob2JqPzogSWRlbnRpdHlEYXRhLCBhbHJlYWR5RW5jcnlwdGVkOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgaWYgKG9iaiA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmJ1aWxkRG9tYWluTW9kZWwodGhpcywgb2JqLCB7XG4gICAgICAgICAgICB0aXRsZTogbnVsbCxcbiAgICAgICAgICAgIGZpcnN0TmFtZTogbnVsbCxcbiAgICAgICAgICAgIG1pZGRsZU5hbWU6IG51bGwsXG4gICAgICAgICAgICBsYXN0TmFtZTogbnVsbCxcbiAgICAgICAgICAgIGFkZHJlc3MxOiBudWxsLFxuICAgICAgICAgICAgYWRkcmVzczI6IG51bGwsXG4gICAgICAgICAgICBhZGRyZXNzMzogbnVsbCxcbiAgICAgICAgICAgIGNpdHk6IG51bGwsXG4gICAgICAgICAgICBzdGF0ZTogbnVsbCxcbiAgICAgICAgICAgIHBvc3RhbENvZGU6IG51bGwsXG4gICAgICAgICAgICBjb3VudHJ5OiBudWxsLFxuICAgICAgICAgICAgY29tcGFueTogbnVsbCxcbiAgICAgICAgICAgIGVtYWlsOiBudWxsLFxuICAgICAgICAgICAgcGhvbmU6IG51bGwsXG4gICAgICAgICAgICBzc246IG51bGwsXG4gICAgICAgICAgICB1c2VybmFtZTogbnVsbCxcbiAgICAgICAgICAgIHBhc3Nwb3J0TnVtYmVyOiBudWxsLFxuICAgICAgICAgICAgbGljZW5zZU51bWJlcjogbnVsbCxcbiAgICAgICAgfSwgYWxyZWFkeUVuY3J5cHRlZCwgW10pO1xuICAgIH1cblxuICAgIGRlY3J5cHQob3JnSWQ6IHN0cmluZywgZW5jS2V5PzogU3ltbWV0cmljQ3J5cHRvS2V5KTogUHJvbWlzZTxJZGVudGl0eVZpZXc+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGVjcnlwdE9iaihuZXcgSWRlbnRpdHlWaWV3KHRoaXMpLCB7XG4gICAgICAgICAgICB0aXRsZTogbnVsbCxcbiAgICAgICAgICAgIGZpcnN0TmFtZTogbnVsbCxcbiAgICAgICAgICAgIG1pZGRsZU5hbWU6IG51bGwsXG4gICAgICAgICAgICBsYXN0TmFtZTogbnVsbCxcbiAgICAgICAgICAgIGFkZHJlc3MxOiBudWxsLFxuICAgICAgICAgICAgYWRkcmVzczI6IG51bGwsXG4gICAgICAgICAgICBhZGRyZXNzMzogbnVsbCxcbiAgICAgICAgICAgIGNpdHk6IG51bGwsXG4gICAgICAgICAgICBzdGF0ZTogbnVsbCxcbiAgICAgICAgICAgIHBvc3RhbENvZGU6IG51bGwsXG4gICAgICAgICAgICBjb3VudHJ5OiBudWxsLFxuICAgICAgICAgICAgY29tcGFueTogbnVsbCxcbiAgICAgICAgICAgIGVtYWlsOiBudWxsLFxuICAgICAgICAgICAgcGhvbmU6IG51bGwsXG4gICAgICAgICAgICBzc246IG51bGwsXG4gICAgICAgICAgICB1c2VybmFtZTogbnVsbCxcbiAgICAgICAgICAgIHBhc3Nwb3J0TnVtYmVyOiBudWxsLFxuICAgICAgICAgICAgbGljZW5zZU51bWJlcjogbnVsbCxcbiAgICAgICAgfSwgb3JnSWQsIGVuY0tleSk7XG4gICAgfVxuXG4gICAgdG9JZGVudGl0eURhdGEoKTogSWRlbnRpdHlEYXRhIHtcbiAgICAgICAgY29uc3QgaSA9IG5ldyBJZGVudGl0eURhdGEoKTtcbiAgICAgICAgdGhpcy5idWlsZERhdGFNb2RlbCh0aGlzLCBpLCB7XG4gICAgICAgICAgICB0aXRsZTogbnVsbCxcbiAgICAgICAgICAgIGZpcnN0TmFtZTogbnVsbCxcbiAgICAgICAgICAgIG1pZGRsZU5hbWU6IG51bGwsXG4gICAgICAgICAgICBsYXN0TmFtZTogbnVsbCxcbiAgICAgICAgICAgIGFkZHJlc3MxOiBudWxsLFxuICAgICAgICAgICAgYWRkcmVzczI6IG51bGwsXG4gICAgICAgICAgICBhZGRyZXNzMzogbnVsbCxcbiAgICAgICAgICAgIGNpdHk6IG51bGwsXG4gICAgICAgICAgICBzdGF0ZTogbnVsbCxcbiAgICAgICAgICAgIHBvc3RhbENvZGU6IG51bGwsXG4gICAgICAgICAgICBjb3VudHJ5OiBudWxsLFxuICAgICAgICAgICAgY29tcGFueTogbnVsbCxcbiAgICAgICAgICAgIGVtYWlsOiBudWxsLFxuICAgICAgICAgICAgcGhvbmU6IG51bGwsXG4gICAgICAgICAgICBzc246IG51bGwsXG4gICAgICAgICAgICB1c2VybmFtZTogbnVsbCxcbiAgICAgICAgICAgIHBhc3Nwb3J0TnVtYmVyOiBudWxsLFxuICAgICAgICAgICAgbGljZW5zZU51bWJlcjogbnVsbCxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBpO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IExvZ2luVXJpIH0gZnJvbSAnLi9sb2dpblVyaSc7XG5cbmltcG9ydCB7IExvZ2luRGF0YSB9IGZyb20gJy4uL2RhdGEvbG9naW5EYXRhJztcblxuaW1wb3J0IHsgTG9naW5WaWV3IH0gZnJvbSAnLi4vdmlldy9sb2dpblZpZXcnO1xuXG5pbXBvcnQgRG9tYWluIGZyb20gJy4vZG9tYWluQmFzZSc7XG5pbXBvcnQgeyBFbmNTdHJpbmcgfSBmcm9tICcuL2VuY1N0cmluZyc7XG5pbXBvcnQgeyBTeW1tZXRyaWNDcnlwdG9LZXkgfSBmcm9tICcuL3N5bW1ldHJpY0NyeXB0b0tleSc7XG5cbmV4cG9ydCBjbGFzcyBMb2dpbiBleHRlbmRzIERvbWFpbiB7XG4gICAgdXJpczogTG9naW5VcmlbXTtcbiAgICB1c2VybmFtZTogRW5jU3RyaW5nO1xuICAgIHBhc3N3b3JkOiBFbmNTdHJpbmc7XG4gICAgcGFzc3dvcmRSZXZpc2lvbkRhdGU/OiBEYXRlO1xuICAgIHRvdHA6IEVuY1N0cmluZztcbiAgICBhdXRvZmlsbE9uUGFnZUxvYWQ6IGJvb2xlYW47XG5cbiAgICBjb25zdHJ1Y3RvcihvYmo/OiBMb2dpbkRhdGEsIGFscmVhZHlFbmNyeXB0ZWQ6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICBpZiAob2JqID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucGFzc3dvcmRSZXZpc2lvbkRhdGUgPSBvYmoucGFzc3dvcmRSZXZpc2lvbkRhdGUgIT0gbnVsbCA/IG5ldyBEYXRlKG9iai5wYXNzd29yZFJldmlzaW9uRGF0ZSkgOiBudWxsO1xuICAgICAgICB0aGlzLmF1dG9maWxsT25QYWdlTG9hZCA9IG9iai5hdXRvZmlsbE9uUGFnZUxvYWQ7XG4gICAgICAgIHRoaXMuYnVpbGREb21haW5Nb2RlbCh0aGlzLCBvYmosIHtcbiAgICAgICAgICAgIHVzZXJuYW1lOiBudWxsLFxuICAgICAgICAgICAgcGFzc3dvcmQ6IG51bGwsXG4gICAgICAgICAgICB0b3RwOiBudWxsLFxuICAgICAgICB9LCBhbHJlYWR5RW5jcnlwdGVkLCBbXSk7XG5cbiAgICAgICAgaWYgKG9iai51cmlzKSB7XG4gICAgICAgICAgICB0aGlzLnVyaXMgPSBbXTtcbiAgICAgICAgICAgIG9iai51cmlzLmZvckVhY2godSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy51cmlzLnB1c2gobmV3IExvZ2luVXJpKHUsIGFscmVhZHlFbmNyeXB0ZWQpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgZGVjcnlwdChvcmdJZDogc3RyaW5nLCBlbmNLZXk/OiBTeW1tZXRyaWNDcnlwdG9LZXkpOiBQcm9taXNlPExvZ2luVmlldz4ge1xuICAgICAgICBjb25zdCB2aWV3ID0gYXdhaXQgdGhpcy5kZWNyeXB0T2JqKG5ldyBMb2dpblZpZXcodGhpcyksIHtcbiAgICAgICAgICAgIHVzZXJuYW1lOiBudWxsLFxuICAgICAgICAgICAgcGFzc3dvcmQ6IG51bGwsXG4gICAgICAgICAgICB0b3RwOiBudWxsLFxuICAgICAgICB9LCBvcmdJZCwgZW5jS2V5KTtcblxuICAgICAgICBpZiAodGhpcy51cmlzICE9IG51bGwpIHtcbiAgICAgICAgICAgIHZpZXcudXJpcyA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnVyaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCB1cmkgPSBhd2FpdCB0aGlzLnVyaXNbaV0uZGVjcnlwdChvcmdJZCwgZW5jS2V5KTtcbiAgICAgICAgICAgICAgICB2aWV3LnVyaXMucHVzaCh1cmkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHZpZXc7XG4gICAgfVxuXG4gICAgdG9Mb2dpbkRhdGEoKTogTG9naW5EYXRhIHtcbiAgICAgICAgY29uc3QgbCA9IG5ldyBMb2dpbkRhdGEoKTtcbiAgICAgICAgbC5wYXNzd29yZFJldmlzaW9uRGF0ZSA9IHRoaXMucGFzc3dvcmRSZXZpc2lvbkRhdGUgIT0gbnVsbCA/IHRoaXMucGFzc3dvcmRSZXZpc2lvbkRhdGUudG9JU09TdHJpbmcoKSA6IG51bGw7XG4gICAgICAgIGwuYXV0b2ZpbGxPblBhZ2VMb2FkID0gdGhpcy5hdXRvZmlsbE9uUGFnZUxvYWQ7XG4gICAgICAgIHRoaXMuYnVpbGREYXRhTW9kZWwodGhpcywgbCwge1xuICAgICAgICAgICAgdXNlcm5hbWU6IG51bGwsXG4gICAgICAgICAgICBwYXNzd29yZDogbnVsbCxcbiAgICAgICAgICAgIHRvdHA6IG51bGwsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICh0aGlzLnVyaXMgIT0gbnVsbCAmJiB0aGlzLnVyaXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbC51cmlzID0gW107XG4gICAgICAgICAgICB0aGlzLnVyaXMuZm9yRWFjaCh1ID0+IHtcbiAgICAgICAgICAgICAgICBsLnVyaXMucHVzaCh1LnRvTG9naW5VcmlEYXRhKCkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbDtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBVcmlNYXRjaFR5cGUgfSBmcm9tICcuLi8uLi9lbnVtcy91cmlNYXRjaFR5cGUnO1xuXG5pbXBvcnQgeyBMb2dpblVyaURhdGEgfSBmcm9tICcuLi9kYXRhL2xvZ2luVXJpRGF0YSc7XG5cbmltcG9ydCB7IExvZ2luVXJpVmlldyB9IGZyb20gJy4uL3ZpZXcvbG9naW5VcmlWaWV3JztcblxuaW1wb3J0IERvbWFpbiBmcm9tICcuL2RvbWFpbkJhc2UnO1xuaW1wb3J0IHsgRW5jU3RyaW5nIH0gZnJvbSAnLi9lbmNTdHJpbmcnO1xuaW1wb3J0IHsgU3ltbWV0cmljQ3J5cHRvS2V5IH0gZnJvbSAnLi9zeW1tZXRyaWNDcnlwdG9LZXknO1xuXG5leHBvcnQgY2xhc3MgTG9naW5VcmkgZXh0ZW5kcyBEb21haW4ge1xuICAgIHVyaTogRW5jU3RyaW5nO1xuICAgIG1hdGNoOiBVcmlNYXRjaFR5cGU7XG5cbiAgICBjb25zdHJ1Y3RvcihvYmo/OiBMb2dpblVyaURhdGEsIGFscmVhZHlFbmNyeXB0ZWQ6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICBpZiAob2JqID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubWF0Y2ggPSBvYmoubWF0Y2g7XG4gICAgICAgIHRoaXMuYnVpbGREb21haW5Nb2RlbCh0aGlzLCBvYmosIHtcbiAgICAgICAgICAgIHVyaTogbnVsbCxcbiAgICAgICAgfSwgYWxyZWFkeUVuY3J5cHRlZCwgW10pO1xuICAgIH1cblxuICAgIGRlY3J5cHQob3JnSWQ6IHN0cmluZywgZW5jS2V5PzogU3ltbWV0cmljQ3J5cHRvS2V5KTogUHJvbWlzZTxMb2dpblVyaVZpZXc+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGVjcnlwdE9iaihuZXcgTG9naW5VcmlWaWV3KHRoaXMpLCB7XG4gICAgICAgICAgICB1cmk6IG51bGwsXG4gICAgICAgIH0sIG9yZ0lkLCBlbmNLZXkpO1xuICAgIH1cblxuICAgIHRvTG9naW5VcmlEYXRhKCk6IExvZ2luVXJpRGF0YSB7XG4gICAgICAgIGNvbnN0IHUgPSBuZXcgTG9naW5VcmlEYXRhKCk7XG4gICAgICAgIHRoaXMuYnVpbGREYXRhTW9kZWwodGhpcywgdSwge1xuICAgICAgICAgICAgdXJpOiBudWxsLFxuICAgICAgICB9LCBbJ21hdGNoJ10pO1xuICAgICAgICByZXR1cm4gdTtcbiAgICB9XG59XG4iLCJpbXBvcnQgRG9tYWluIGZyb20gJy4vZG9tYWluQmFzZSc7XG5cbmV4cG9ydCBjbGFzcyBNYXN0ZXJQYXNzd29yZFBvbGljeU9wdGlvbnMgZXh0ZW5kcyBEb21haW4ge1xuICAgIG1pbkNvbXBsZXhpdHk6IG51bWJlciA9IDA7XG4gICAgbWluTGVuZ3RoOiBudW1iZXIgPSAwO1xuICAgIHJlcXVpcmVVcHBlcjogYm9vbGVhbiA9IGZhbHNlO1xuICAgIHJlcXVpcmVMb3dlcjogYm9vbGVhbiA9IGZhbHNlO1xuICAgIHJlcXVpcmVOdW1iZXJzOiBib29sZWFuID0gZmFsc2U7XG4gICAgcmVxdWlyZVNwZWNpYWw6IGJvb2xlYW4gPSBmYWxzZTtcbn1cbiIsImltcG9ydCB7IE9yZ2FuaXphdGlvbkRhdGEgfSBmcm9tICcuLi9kYXRhL29yZ2FuaXphdGlvbkRhdGEnO1xuXG5pbXBvcnQgeyBPcmdhbml6YXRpb25Vc2VyU3RhdHVzVHlwZSB9IGZyb20gJy4uLy4uL2VudW1zL29yZ2FuaXphdGlvblVzZXJTdGF0dXNUeXBlJztcbmltcG9ydCB7IE9yZ2FuaXphdGlvblVzZXJUeXBlIH0gZnJvbSAnLi4vLi4vZW51bXMvb3JnYW5pemF0aW9uVXNlclR5cGUnO1xuaW1wb3J0IHsgUGVybWlzc2lvbnNBcGkgfSBmcm9tICcuLi9hcGkvcGVybWlzc2lvbnNBcGknO1xuXG5cbmV4cG9ydCBjbGFzcyBPcmdhbml6YXRpb24ge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIHN0YXR1czogT3JnYW5pemF0aW9uVXNlclN0YXR1c1R5cGU7XG4gICAgdHlwZTogT3JnYW5pemF0aW9uVXNlclR5cGU7XG4gICAgZW5hYmxlZDogYm9vbGVhbjtcbiAgICB1c2VQb2xpY2llczogYm9vbGVhbjtcbiAgICB1c2VHcm91cHM6IGJvb2xlYW47XG4gICAgdXNlRGlyZWN0b3J5OiBib29sZWFuO1xuICAgIHVzZUV2ZW50czogYm9vbGVhbjtcbiAgICB1c2VUb3RwOiBib29sZWFuO1xuICAgIHVzZTJmYTogYm9vbGVhbjtcbiAgICB1c2VBcGk6IGJvb2xlYW47XG4gICAgdXNlU3NvOiBib29sZWFuO1xuICAgIHVzZVJlc2V0UGFzc3dvcmQ6IGJvb2xlYW47XG4gICAgc2VsZkhvc3Q6IGJvb2xlYW47XG4gICAgdXNlcnNHZXRQcmVtaXVtOiBib29sZWFuO1xuICAgIHNlYXRzOiBudW1iZXI7XG4gICAgbWF4Q29sbGVjdGlvbnM6IG51bWJlcjtcbiAgICBtYXhTdG9yYWdlR2I/OiBudW1iZXI7XG4gICAgc3NvQm91bmQ6IGJvb2xlYW47XG4gICAgaWRlbnRpZmllcjogc3RyaW5nO1xuICAgIHBlcm1pc3Npb25zOiBQZXJtaXNzaW9uc0FwaTtcbiAgICByZXNldFBhc3N3b3JkRW5yb2xsZWQ6IGJvb2xlYW47XG4gICAgdXNlcklkOiBzdHJpbmc7XG4gICAgaGFzUHVibGljQW5kUHJpdmF0ZUtleXM6IGJvb2xlYW47XG4gICAgcHJvdmlkZXJJZDogc3RyaW5nO1xuICAgIHByb3ZpZGVyTmFtZTogc3RyaW5nO1xuICAgIGlzUHJvdmlkZXJVc2VyOiBib29sZWFuO1xuXG4gICAgY29uc3RydWN0b3Iob2JqPzogT3JnYW5pemF0aW9uRGF0YSkge1xuICAgICAgICBpZiAob2JqID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaWQgPSBvYmouaWQ7XG4gICAgICAgIHRoaXMubmFtZSA9IG9iai5uYW1lO1xuICAgICAgICB0aGlzLnN0YXR1cyA9IG9iai5zdGF0dXM7XG4gICAgICAgIHRoaXMudHlwZSA9IG9iai50eXBlO1xuICAgICAgICB0aGlzLmVuYWJsZWQgPSBvYmouZW5hYmxlZDtcbiAgICAgICAgdGhpcy51c2VQb2xpY2llcyA9IG9iai51c2VQb2xpY2llcztcbiAgICAgICAgdGhpcy51c2VHcm91cHMgPSBvYmoudXNlR3JvdXBzO1xuICAgICAgICB0aGlzLnVzZURpcmVjdG9yeSA9IG9iai51c2VEaXJlY3Rvcnk7XG4gICAgICAgIHRoaXMudXNlRXZlbnRzID0gb2JqLnVzZUV2ZW50cztcbiAgICAgICAgdGhpcy51c2VUb3RwID0gb2JqLnVzZVRvdHA7XG4gICAgICAgIHRoaXMudXNlMmZhID0gb2JqLnVzZTJmYTtcbiAgICAgICAgdGhpcy51c2VBcGkgPSBvYmoudXNlQXBpO1xuICAgICAgICB0aGlzLnVzZVNzbyA9IG9iai51c2VTc287XG4gICAgICAgIHRoaXMudXNlUmVzZXRQYXNzd29yZCA9IG9iai51c2VSZXNldFBhc3N3b3JkO1xuICAgICAgICB0aGlzLnNlbGZIb3N0ID0gb2JqLnNlbGZIb3N0O1xuICAgICAgICB0aGlzLnVzZXJzR2V0UHJlbWl1bSA9IG9iai51c2Vyc0dldFByZW1pdW07XG4gICAgICAgIHRoaXMuc2VhdHMgPSBvYmouc2VhdHM7XG4gICAgICAgIHRoaXMubWF4Q29sbGVjdGlvbnMgPSBvYmoubWF4Q29sbGVjdGlvbnM7XG4gICAgICAgIHRoaXMubWF4U3RvcmFnZUdiID0gb2JqLm1heFN0b3JhZ2VHYjtcbiAgICAgICAgdGhpcy5zc29Cb3VuZCA9IG9iai5zc29Cb3VuZDtcbiAgICAgICAgdGhpcy5pZGVudGlmaWVyID0gb2JqLmlkZW50aWZpZXI7XG4gICAgICAgIHRoaXMucGVybWlzc2lvbnMgPSBvYmoucGVybWlzc2lvbnM7XG4gICAgICAgIHRoaXMucmVzZXRQYXNzd29yZEVucm9sbGVkID0gb2JqLnJlc2V0UGFzc3dvcmRFbnJvbGxlZDtcbiAgICAgICAgdGhpcy51c2VySWQgPSBvYmoudXNlcklkO1xuICAgICAgICB0aGlzLmhhc1B1YmxpY0FuZFByaXZhdGVLZXlzID0gb2JqLmhhc1B1YmxpY0FuZFByaXZhdGVLZXlzO1xuICAgICAgICB0aGlzLnByb3ZpZGVySWQgPSBvYmoucHJvdmlkZXJJZDtcbiAgICAgICAgdGhpcy5wcm92aWRlck5hbWUgPSBvYmoucHJvdmlkZXJOYW1lO1xuICAgICAgICB0aGlzLmlzUHJvdmlkZXJVc2VyID0gb2JqLmlzUHJvdmlkZXJVc2VyO1xuICAgIH1cblxuICAgIGdldCBjYW5BY2Nlc3MoKSB7XG4gICAgICAgIGlmICh0aGlzLnR5cGUgPT09IE9yZ2FuaXphdGlvblVzZXJUeXBlLk93bmVyKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5lbmFibGVkICYmIHRoaXMuc3RhdHVzID09PSBPcmdhbml6YXRpb25Vc2VyU3RhdHVzVHlwZS5Db25maXJtZWQ7XG4gICAgfVxuXG4gICAgZ2V0IGlzTWFuYWdlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHlwZSA9PT0gT3JnYW5pemF0aW9uVXNlclR5cGUuTWFuYWdlciB8fCB0aGlzLnR5cGUgPT09IE9yZ2FuaXphdGlvblVzZXJUeXBlLk93bmVyIHx8XG4gICAgICAgICAgICB0aGlzLnR5cGUgPT09IE9yZ2FuaXphdGlvblVzZXJUeXBlLkFkbWluO1xuICAgIH1cblxuICAgIGdldCBpc0FkbWluKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50eXBlID09PSBPcmdhbml6YXRpb25Vc2VyVHlwZS5Pd25lciB8fCB0aGlzLnR5cGUgPT09IE9yZ2FuaXphdGlvblVzZXJUeXBlLkFkbWluO1xuICAgIH1cblxuICAgIGdldCBpc093bmVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50eXBlID09PSBPcmdhbml6YXRpb25Vc2VyVHlwZS5Pd25lciB8fCB0aGlzLmlzUHJvdmlkZXJVc2VyO1xuICAgIH1cblxuICAgIGdldCBjYW5BY2Nlc3NFdmVudExvZ3MoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzQWRtaW4gfHwgdGhpcy5wZXJtaXNzaW9ucy5hY2Nlc3NFdmVudExvZ3M7XG4gICAgfVxuXG4gICAgZ2V0IGNhbkFjY2Vzc0ltcG9ydEV4cG9ydCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNBZG1pbiB8fCB0aGlzLnBlcm1pc3Npb25zLmFjY2Vzc0ltcG9ydEV4cG9ydDtcbiAgICB9XG5cbiAgICBnZXQgY2FuQWNjZXNzUmVwb3J0cygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNBZG1pbiB8fCB0aGlzLnBlcm1pc3Npb25zLmFjY2Vzc1JlcG9ydHM7XG4gICAgfVxuXG4gICAgZ2V0IGNhbkNyZWF0ZU5ld0NvbGxlY3Rpb25zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pc01hbmFnZXIgfHwgKHRoaXMucGVybWlzc2lvbnMuY3JlYXRlTmV3Q29sbGVjdGlvbnMgPz8gdGhpcy5wZXJtaXNzaW9ucy5tYW5hZ2VBbGxDb2xsZWN0aW9ucyk7XG4gICAgfVxuXG4gICAgZ2V0IGNhbkVkaXRBbnlDb2xsZWN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pc0FkbWluIHx8ICh0aGlzLnBlcm1pc3Npb25zLmVkaXRBbnlDb2xsZWN0aW9uID8/IHRoaXMucGVybWlzc2lvbnMubWFuYWdlQWxsQ29sbGVjdGlvbnMpO1xuICAgIH1cblxuICAgIGdldCBjYW5EZWxldGVBbnlDb2xsZWN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pc0FkbWluIHx8ICh0aGlzLnBlcm1pc3Npb25zLmRlbGV0ZUFueUNvbGxlY3Rpb24gPz8gdGhpcy5wZXJtaXNzaW9ucy5tYW5hZ2VBbGxDb2xsZWN0aW9ucyk7XG4gICAgfVxuXG4gICAgZ2V0IGNhblZpZXdBbGxDb2xsZWN0aW9ucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FuQ3JlYXRlTmV3Q29sbGVjdGlvbnMgfHwgdGhpcy5jYW5FZGl0QW55Q29sbGVjdGlvbiB8fCB0aGlzLmNhbkRlbGV0ZUFueUNvbGxlY3Rpb247XG4gICAgfVxuXG4gICAgZ2V0IGNhbkVkaXRBc3NpZ25lZENvbGxlY3Rpb25zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pc01hbmFnZXIgfHwgKHRoaXMucGVybWlzc2lvbnMuZWRpdEFzc2lnbmVkQ29sbGVjdGlvbnMgPz8gdGhpcy5wZXJtaXNzaW9ucy5tYW5hZ2VBc3NpZ25lZENvbGxlY3Rpb25zKTtcbiAgICB9XG5cbiAgICBnZXQgY2FuRGVsZXRlQXNzaWduZWRDb2xsZWN0aW9ucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNNYW5hZ2VyIHx8ICh0aGlzLnBlcm1pc3Npb25zLmRlbGV0ZUFzc2lnbmVkQ29sbGVjdGlvbnMgPz8gdGhpcy5wZXJtaXNzaW9ucy5tYW5hZ2VBc3NpZ25lZENvbGxlY3Rpb25zKTtcbiAgICB9XG5cbiAgICBnZXQgY2FuVmlld0Fzc2lnbmVkQ29sbGVjdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhbkRlbGV0ZUFzc2lnbmVkQ29sbGVjdGlvbnMgfHwgdGhpcy5jYW5FZGl0QXNzaWduZWRDb2xsZWN0aW9ucztcbiAgICB9XG5cbiAgICBnZXQgY2FuTWFuYWdlR3JvdXBzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pc0FkbWluIHx8IHRoaXMucGVybWlzc2lvbnMubWFuYWdlR3JvdXBzO1xuICAgIH1cblxuICAgIGdldCBjYW5NYW5hZ2VTc28oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzQWRtaW4gfHwgdGhpcy5wZXJtaXNzaW9ucy5tYW5hZ2VTc287XG4gICAgfVxuXG4gICAgZ2V0IGNhbk1hbmFnZVBvbGljaWVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pc0FkbWluIHx8IHRoaXMucGVybWlzc2lvbnMubWFuYWdlUG9saWNpZXM7XG4gICAgfVxuXG4gICAgZ2V0IGNhbk1hbmFnZVVzZXJzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pc0FkbWluIHx8IHRoaXMucGVybWlzc2lvbnMubWFuYWdlVXNlcnM7XG4gICAgfVxuXG4gICAgZ2V0IGNhbk1hbmFnZVVzZXJzUGFzc3dvcmQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzQWRtaW4gfHwgdGhpcy5wZXJtaXNzaW9ucy5tYW5hZ2VSZXNldFBhc3N3b3JkO1xuICAgIH1cblxuICAgIGdldCBpc0V4ZW1wdEZyb21Qb2xpY2llcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FuTWFuYWdlUG9saWNpZXM7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgUGFzc3dvcmRIaXN0b3J5RGF0YSB9IGZyb20gJy4uL2RhdGEvcGFzc3dvcmRIaXN0b3J5RGF0YSc7XG5cbmltcG9ydCBEb21haW4gZnJvbSAnLi9kb21haW5CYXNlJztcbmltcG9ydCB7IEVuY1N0cmluZyB9IGZyb20gJy4vZW5jU3RyaW5nJztcblxuaW1wb3J0IHsgUGFzc3dvcmRIaXN0b3J5VmlldyB9IGZyb20gJy4uL3ZpZXcvcGFzc3dvcmRIaXN0b3J5Vmlldyc7XG5pbXBvcnQgeyBTeW1tZXRyaWNDcnlwdG9LZXkgfSBmcm9tICcuL3N5bW1ldHJpY0NyeXB0b0tleSc7XG5cbmV4cG9ydCBjbGFzcyBQYXNzd29yZCBleHRlbmRzIERvbWFpbiB7XG4gICAgcGFzc3dvcmQ6IEVuY1N0cmluZztcbiAgICBsYXN0VXNlZERhdGU6IERhdGU7XG5cbiAgICBjb25zdHJ1Y3RvcihvYmo/OiBQYXNzd29yZEhpc3RvcnlEYXRhLCBhbHJlYWR5RW5jcnlwdGVkOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgaWYgKG9iaiA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmJ1aWxkRG9tYWluTW9kZWwodGhpcywgb2JqLCB7XG4gICAgICAgICAgICBwYXNzd29yZDogbnVsbCxcbiAgICAgICAgfSwgYWxyZWFkeUVuY3J5cHRlZCk7XG4gICAgICAgIHRoaXMubGFzdFVzZWREYXRlID0gbmV3IERhdGUob2JqLmxhc3RVc2VkRGF0ZSk7XG4gICAgfVxuXG4gICAgZGVjcnlwdChvcmdJZDogc3RyaW5nLCBlbmNLZXk/OiBTeW1tZXRyaWNDcnlwdG9LZXkpOiBQcm9taXNlPFBhc3N3b3JkSGlzdG9yeVZpZXc+IHtcbiAgICAgICAgIHJldHVybiB0aGlzLmRlY3J5cHRPYmoobmV3IFBhc3N3b3JkSGlzdG9yeVZpZXcodGhpcyksIHtcbiAgICAgICAgICAgIHBhc3N3b3JkOiBudWxsLFxuICAgICAgICB9LCBvcmdJZCwgZW5jS2V5KTtcbiAgICB9XG5cbiAgICB0b1Bhc3N3b3JkSGlzdG9yeURhdGEoKTogUGFzc3dvcmRIaXN0b3J5RGF0YSB7XG4gICAgICAgIGNvbnN0IHBoID0gbmV3IFBhc3N3b3JkSGlzdG9yeURhdGEoKTtcbiAgICAgICAgcGgubGFzdFVzZWREYXRlID0gdGhpcy5sYXN0VXNlZERhdGUudG9JU09TdHJpbmcoKTtcbiAgICAgICAgdGhpcy5idWlsZERhdGFNb2RlbCh0aGlzLCBwaCwge1xuICAgICAgICAgICAgcGFzc3dvcmQ6IG51bGwsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcGg7XG4gICAgfVxufVxuIiwiaW1wb3J0IERvbWFpbiBmcm9tICcuL2RvbWFpbkJhc2UnO1xuXG5leHBvcnQgY2xhc3MgUGFzc3dvcmRHZW5lcmF0b3JQb2xpY3lPcHRpb25zIGV4dGVuZHMgRG9tYWluIHtcbiAgICBkZWZhdWx0VHlwZTogc3RyaW5nID0gJyc7XG4gICAgbWluTGVuZ3RoOiBudW1iZXIgPSAwO1xuICAgIHVzZVVwcGVyY2FzZTogYm9vbGVhbiA9IGZhbHNlO1xuICAgIHVzZUxvd2VyY2FzZTogYm9vbGVhbiA9IGZhbHNlO1xuICAgIHVzZU51bWJlcnM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBudW1iZXJDb3VudDogbnVtYmVyID0gMDtcbiAgICB1c2VTcGVjaWFsOiBib29sZWFuID0gZmFsc2U7XG4gICAgc3BlY2lhbENvdW50OiBudW1iZXIgPSAwO1xuICAgIG1pbk51bWJlcldvcmRzOiBudW1iZXIgPSAwO1xuICAgIGNhcGl0YWxpemU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBpbmNsdWRlTnVtYmVyOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBpbkVmZmVjdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGVmYXVsdFR5cGUgIT09ICcnIHx8XG4gICAgICAgICAgICB0aGlzLm1pbkxlbmd0aCA+IDAgfHxcbiAgICAgICAgICAgIHRoaXMubnVtYmVyQ291bnQgPiAwIHx8XG4gICAgICAgICAgICB0aGlzLnNwZWNpYWxDb3VudCA+IDAgfHxcbiAgICAgICAgICAgIHRoaXMudXNlVXBwZXJjYXNlIHx8XG4gICAgICAgICAgICB0aGlzLnVzZUxvd2VyY2FzZSB8fFxuICAgICAgICAgICAgdGhpcy51c2VOdW1iZXJzIHx8XG4gICAgICAgICAgICB0aGlzLnVzZVNwZWNpYWwgfHxcbiAgICAgICAgICAgIHRoaXMubWluTnVtYmVyV29yZHMgPiAwIHx8XG4gICAgICAgICAgICB0aGlzLmNhcGl0YWxpemUgfHxcbiAgICAgICAgICAgIHRoaXMuaW5jbHVkZU51bWJlcjtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBQb2xpY3lEYXRhIH0gZnJvbSAnLi4vZGF0YS9wb2xpY3lEYXRhJztcblxuaW1wb3J0IERvbWFpbiBmcm9tICcuL2RvbWFpbkJhc2UnO1xuXG5pbXBvcnQgeyBQb2xpY3lUeXBlIH0gZnJvbSAnLi4vLi4vZW51bXMvcG9saWN5VHlwZSc7XG5cbmV4cG9ydCBjbGFzcyBQb2xpY3kgZXh0ZW5kcyBEb21haW4ge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgb3JnYW5pemF0aW9uSWQ6IHN0cmluZztcbiAgICB0eXBlOiBQb2xpY3lUeXBlO1xuICAgIGRhdGE6IGFueTtcbiAgICBlbmFibGVkOiBib29sZWFuO1xuXG4gICAgY29uc3RydWN0b3Iob2JqPzogUG9saWN5RGF0YSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICBpZiAob2JqID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaWQgPSBvYmouaWQ7XG4gICAgICAgIHRoaXMub3JnYW5pemF0aW9uSWQgPSBvYmoub3JnYW5pemF0aW9uSWQ7XG4gICAgICAgIHRoaXMudHlwZSA9IG9iai50eXBlO1xuICAgICAgICB0aGlzLmRhdGEgPSBvYmouZGF0YTtcbiAgICAgICAgdGhpcy5lbmFibGVkID0gb2JqLmVuYWJsZWQ7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgUHJvdmlkZXJVc2VyU3RhdHVzVHlwZSB9IGZyb20gJy4uLy4uL2VudW1zL3Byb3ZpZGVyVXNlclN0YXR1c1R5cGUnO1xuaW1wb3J0IHsgUHJvdmlkZXJVc2VyVHlwZSB9IGZyb20gJy4uLy4uL2VudW1zL3Byb3ZpZGVyVXNlclR5cGUnO1xuaW1wb3J0IHsgUHJvdmlkZXJEYXRhIH0gZnJvbSAnLi4vZGF0YS9wcm92aWRlckRhdGEnO1xuXG5leHBvcnQgY2xhc3MgUHJvdmlkZXIge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIHN0YXR1czogUHJvdmlkZXJVc2VyU3RhdHVzVHlwZTtcbiAgICB0eXBlOiBQcm92aWRlclVzZXJUeXBlO1xuICAgIGVuYWJsZWQ6IGJvb2xlYW47XG4gICAgdXNlcklkOiBzdHJpbmc7XG4gICAgdXNlRXZlbnRzOiBib29sZWFuO1xuXG4gICAgY29uc3RydWN0b3Iob2JqPzogUHJvdmlkZXJEYXRhKSB7XG4gICAgICAgIGlmIChvYmogPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pZCA9IG9iai5pZDtcbiAgICAgICAgdGhpcy5uYW1lID0gb2JqLm5hbWU7XG4gICAgICAgIHRoaXMuc3RhdHVzID0gb2JqLnN0YXR1cztcbiAgICAgICAgdGhpcy50eXBlID0gb2JqLnR5cGU7XG4gICAgICAgIHRoaXMuZW5hYmxlZCA9IG9iai5lbmFibGVkO1xuICAgICAgICB0aGlzLnVzZXJJZCA9IG9iai51c2VySWQ7XG4gICAgICAgIHRoaXMudXNlRXZlbnRzID0gb2JqLnVzZUV2ZW50cztcbiAgICB9XG5cbiAgICBnZXQgY2FuQWNjZXNzKCkge1xuICAgICAgICBpZiAodGhpcy5pc1Byb3ZpZGVyQWRtaW4pIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmVuYWJsZWQgJiYgdGhpcy5zdGF0dXMgPT09IFByb3ZpZGVyVXNlclN0YXR1c1R5cGUuQ29uZmlybWVkO1xuICAgIH1cblxuICAgIGdldCBjYW5DcmVhdGVPcmdhbml6YXRpb25zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5lbmFibGVkICYmIHRoaXMuaXNQcm92aWRlckFkbWluO1xuICAgIH1cblxuICAgIGdldCBjYW5NYW5hZ2VVc2VycygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNQcm92aWRlckFkbWluO1xuICAgIH1cblxuICAgIGdldCBjYW5BY2Nlc3NFdmVudExvZ3MoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzUHJvdmlkZXJBZG1pbjtcbiAgICB9XG5cbiAgICBnZXQgaXNQcm92aWRlckFkbWluKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50eXBlID09PSBQcm92aWRlclVzZXJUeXBlLlByb3ZpZGVyQWRtaW47XG4gICAgfVxufVxuIiwiaW1wb3J0IERvbWFpbiBmcm9tICcuL2RvbWFpbkJhc2UnO1xuXG5leHBvcnQgY2xhc3MgUmVzZXRQYXNzd29yZFBvbGljeU9wdGlvbnMgZXh0ZW5kcyBEb21haW4ge1xuICAgIGF1dG9FbnJvbGxFbmFibGVkOiBib29sZWFuID0gZmFsc2U7XG59XG4iLCJpbXBvcnQgeyBTZWN1cmVOb3RlVHlwZSB9IGZyb20gJy4uLy4uL2VudW1zL3NlY3VyZU5vdGVUeXBlJztcblxuaW1wb3J0IHsgU2VjdXJlTm90ZURhdGEgfSBmcm9tICcuLi9kYXRhL3NlY3VyZU5vdGVEYXRhJztcblxuaW1wb3J0IERvbWFpbiBmcm9tICcuL2RvbWFpbkJhc2UnO1xuXG5pbXBvcnQgeyBTZWN1cmVOb3RlVmlldyB9IGZyb20gJy4uL3ZpZXcvc2VjdXJlTm90ZVZpZXcnO1xuaW1wb3J0IHsgU3ltbWV0cmljQ3J5cHRvS2V5IH0gZnJvbSAnLi9zeW1tZXRyaWNDcnlwdG9LZXknO1xuXG5leHBvcnQgY2xhc3MgU2VjdXJlTm90ZSBleHRlbmRzIERvbWFpbiB7XG4gICAgdHlwZTogU2VjdXJlTm90ZVR5cGU7XG5cbiAgICBjb25zdHJ1Y3RvcihvYmo/OiBTZWN1cmVOb3RlRGF0YSwgYWxyZWFkeUVuY3J5cHRlZDogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIGlmIChvYmogPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy50eXBlID0gb2JqLnR5cGU7XG4gICAgfVxuXG4gICAgZGVjcnlwdChvcmdJZDogc3RyaW5nLCBlbmNLZXk/OiBTeW1tZXRyaWNDcnlwdG9LZXkpOiBQcm9taXNlPFNlY3VyZU5vdGVWaWV3PiB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobmV3IFNlY3VyZU5vdGVWaWV3KHRoaXMpKTtcbiAgICB9XG5cbiAgICB0b1NlY3VyZU5vdGVEYXRhKCk6IFNlY3VyZU5vdGVEYXRhIHtcbiAgICAgICAgY29uc3QgbiA9IG5ldyBTZWN1cmVOb3RlRGF0YSgpO1xuICAgICAgICBuLnR5cGUgPSB0aGlzLnR5cGU7XG4gICAgICAgIHJldHVybiBuO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IENyeXB0b1NlcnZpY2UgfSBmcm9tICcuLi8uLi9hYnN0cmFjdGlvbnMvY3J5cHRvLnNlcnZpY2UnO1xuXG5pbXBvcnQgeyBTZW5kVHlwZSB9IGZyb20gJy4uLy4uL2VudW1zL3NlbmRUeXBlJztcblxuaW1wb3J0IHsgVXRpbHMgfSBmcm9tICcuLi8uLi9taXNjL3V0aWxzJztcblxuaW1wb3J0IHsgU2VuZERhdGEgfSBmcm9tICcuLi9kYXRhL3NlbmREYXRhJztcblxuaW1wb3J0IHsgU2VuZFZpZXcgfSBmcm9tICcuLi92aWV3L3NlbmRWaWV3JztcblxuaW1wb3J0IERvbWFpbiBmcm9tICcuL2RvbWFpbkJhc2UnO1xuaW1wb3J0IHsgRW5jU3RyaW5nIH0gZnJvbSAnLi9lbmNTdHJpbmcnO1xuaW1wb3J0IHsgU2VuZEZpbGUgfSBmcm9tICcuL3NlbmRGaWxlJztcbmltcG9ydCB7IFNlbmRUZXh0IH0gZnJvbSAnLi9zZW5kVGV4dCc7XG5cbmV4cG9ydCBjbGFzcyBTZW5kIGV4dGVuZHMgRG9tYWluIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIGFjY2Vzc0lkOiBzdHJpbmc7XG4gICAgdXNlcklkOiBzdHJpbmc7XG4gICAgdHlwZTogU2VuZFR5cGU7XG4gICAgbmFtZTogRW5jU3RyaW5nO1xuICAgIG5vdGVzOiBFbmNTdHJpbmc7XG4gICAgZmlsZTogU2VuZEZpbGU7XG4gICAgdGV4dDogU2VuZFRleHQ7XG4gICAga2V5OiBFbmNTdHJpbmc7XG4gICAgbWF4QWNjZXNzQ291bnQ/OiBudW1iZXI7XG4gICAgYWNjZXNzQ291bnQ6IG51bWJlcjtcbiAgICByZXZpc2lvbkRhdGU6IERhdGU7XG4gICAgZXhwaXJhdGlvbkRhdGU6IERhdGU7XG4gICAgZGVsZXRpb25EYXRlOiBEYXRlO1xuICAgIHBhc3N3b3JkOiBzdHJpbmc7XG4gICAgZGlzYWJsZWQ6IGJvb2xlYW47XG4gICAgaGlkZUVtYWlsOiBib29sZWFuO1xuXG4gICAgY29uc3RydWN0b3Iob2JqPzogU2VuZERhdGEsIGFscmVhZHlFbmNyeXB0ZWQ6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICBpZiAob2JqID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuYnVpbGREb21haW5Nb2RlbCh0aGlzLCBvYmosIHtcbiAgICAgICAgICAgIGlkOiBudWxsLFxuICAgICAgICAgICAgYWNjZXNzSWQ6IG51bGwsXG4gICAgICAgICAgICB1c2VySWQ6IG51bGwsXG4gICAgICAgICAgICBuYW1lOiBudWxsLFxuICAgICAgICAgICAgbm90ZXM6IG51bGwsXG4gICAgICAgICAgICBrZXk6IG51bGwsXG4gICAgICAgIH0sIGFscmVhZHlFbmNyeXB0ZWQsIFsnaWQnLCAnYWNjZXNzSWQnLCAndXNlcklkJ10pO1xuXG4gICAgICAgIHRoaXMudHlwZSA9IG9iai50eXBlO1xuICAgICAgICB0aGlzLm1heEFjY2Vzc0NvdW50ID0gb2JqLm1heEFjY2Vzc0NvdW50O1xuICAgICAgICB0aGlzLmFjY2Vzc0NvdW50ID0gb2JqLmFjY2Vzc0NvdW50O1xuICAgICAgICB0aGlzLnBhc3N3b3JkID0gb2JqLnBhc3N3b3JkO1xuICAgICAgICB0aGlzLmRpc2FibGVkID0gb2JqLmRpc2FibGVkO1xuICAgICAgICB0aGlzLnJldmlzaW9uRGF0ZSA9IG9iai5yZXZpc2lvbkRhdGUgIT0gbnVsbCA/IG5ldyBEYXRlKG9iai5yZXZpc2lvbkRhdGUpIDogbnVsbDtcbiAgICAgICAgdGhpcy5kZWxldGlvbkRhdGUgPSBvYmouZGVsZXRpb25EYXRlICE9IG51bGwgPyBuZXcgRGF0ZShvYmouZGVsZXRpb25EYXRlKSA6IG51bGw7XG4gICAgICAgIHRoaXMuZXhwaXJhdGlvbkRhdGUgPSBvYmouZXhwaXJhdGlvbkRhdGUgIT0gbnVsbCA/IG5ldyBEYXRlKG9iai5leHBpcmF0aW9uRGF0ZSkgOiBudWxsO1xuICAgICAgICB0aGlzLmhpZGVFbWFpbCA9IG9iai5oaWRlRW1haWw7XG5cbiAgICAgICAgc3dpdGNoICh0aGlzLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgU2VuZFR5cGUuVGV4dDpcbiAgICAgICAgICAgICAgICB0aGlzLnRleHQgPSBuZXcgU2VuZFRleHQob2JqLnRleHQsIGFscmVhZHlFbmNyeXB0ZWQpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBTZW5kVHlwZS5GaWxlOlxuICAgICAgICAgICAgICAgIHRoaXMuZmlsZSA9IG5ldyBTZW5kRmlsZShvYmouZmlsZSwgYWxyZWFkeUVuY3J5cHRlZCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgZGVjcnlwdCgpOiBQcm9taXNlPFNlbmRWaWV3PiB7XG4gICAgICAgIGNvbnN0IG1vZGVsID0gbmV3IFNlbmRWaWV3KHRoaXMpO1xuXG4gICAgICAgIGxldCBjcnlwdG9TZXJ2aWNlOiBDcnlwdG9TZXJ2aWNlO1xuICAgICAgICBjb25zdCBjb250YWluZXJTZXJ2aWNlID0gKFV0aWxzLmdsb2JhbCBhcyBhbnkpLmJpdHdhcmRlbkNvbnRhaW5lclNlcnZpY2U7XG4gICAgICAgIGlmIChjb250YWluZXJTZXJ2aWNlKSB7XG4gICAgICAgICAgICBjcnlwdG9TZXJ2aWNlID0gY29udGFpbmVyU2VydmljZS5nZXRDcnlwdG9TZXJ2aWNlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2dsb2JhbCBiaXR3YXJkZW5Db250YWluZXJTZXJ2aWNlIG5vdCBpbml0aWFsaXplZC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBtb2RlbC5rZXkgPSBhd2FpdCBjcnlwdG9TZXJ2aWNlLmRlY3J5cHRUb0J5dGVzKHRoaXMua2V5LCBudWxsKTtcbiAgICAgICAgICAgIG1vZGVsLmNyeXB0b0tleSA9IGF3YWl0IGNyeXB0b1NlcnZpY2UubWFrZVNlbmRLZXkobW9kZWwua2V5KTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgLy8gVE9ETzogZXJyb3I/XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCB0aGlzLmRlY3J5cHRPYmoobW9kZWwsIHtcbiAgICAgICAgICAgIG5hbWU6IG51bGwsXG4gICAgICAgICAgICBub3RlczogbnVsbCxcbiAgICAgICAgfSwgbnVsbCwgbW9kZWwuY3J5cHRvS2V5KTtcblxuICAgICAgICBzd2l0Y2ggKHRoaXMudHlwZSkge1xuICAgICAgICAgICAgY2FzZSBTZW5kVHlwZS5GaWxlOlxuICAgICAgICAgICAgICAgIG1vZGVsLmZpbGUgPSBhd2FpdCB0aGlzLmZpbGUuZGVjcnlwdChtb2RlbC5jcnlwdG9LZXkpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBTZW5kVHlwZS5UZXh0OlxuICAgICAgICAgICAgICAgIG1vZGVsLnRleHQgPSBhd2FpdCB0aGlzLnRleHQuZGVjcnlwdChtb2RlbC5jcnlwdG9LZXkpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBtb2RlbDtcbiAgICB9XG59XG4iLCJpbXBvcnQgRG9tYWluIGZyb20gJy4vZG9tYWluQmFzZSc7XG5pbXBvcnQgeyBFbmNTdHJpbmcgfSBmcm9tICcuL2VuY1N0cmluZyc7XG5pbXBvcnQgeyBTeW1tZXRyaWNDcnlwdG9LZXkgfSBmcm9tICcuL3N5bW1ldHJpY0NyeXB0b0tleSc7XG5cbmltcG9ydCB7IFNlbmRGaWxlRGF0YSB9IGZyb20gJy4uL2RhdGEvc2VuZEZpbGVEYXRhJztcblxuaW1wb3J0IHsgU2VuZEZpbGVWaWV3IH0gZnJvbSAnLi4vdmlldy9zZW5kRmlsZVZpZXcnO1xuXG5leHBvcnQgY2xhc3MgU2VuZEZpbGUgZXh0ZW5kcyBEb21haW4ge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgc2l6ZTogc3RyaW5nO1xuICAgIHNpemVOYW1lOiBzdHJpbmc7XG4gICAgZmlsZU5hbWU6IEVuY1N0cmluZztcblxuICAgIGNvbnN0cnVjdG9yKG9iaj86IFNlbmRGaWxlRGF0YSwgYWxyZWFkeUVuY3J5cHRlZDogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIGlmIChvYmogPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zaXplID0gb2JqLnNpemU7XG4gICAgICAgIHRoaXMuYnVpbGREb21haW5Nb2RlbCh0aGlzLCBvYmosIHtcbiAgICAgICAgICAgIGlkOiBudWxsLFxuICAgICAgICAgICAgc2l6ZU5hbWU6IG51bGwsXG4gICAgICAgICAgICBmaWxlTmFtZTogbnVsbCxcbiAgICAgICAgfSwgYWxyZWFkeUVuY3J5cHRlZCwgWydpZCcsICdzaXplTmFtZSddKTtcbiAgICB9XG5cbiAgICBhc3luYyBkZWNyeXB0KGtleTogU3ltbWV0cmljQ3J5cHRvS2V5KTogUHJvbWlzZTxTZW5kRmlsZVZpZXc+IHtcbiAgICAgICAgY29uc3QgdmlldyA9IGF3YWl0IHRoaXMuZGVjcnlwdE9iaihuZXcgU2VuZEZpbGVWaWV3KHRoaXMpLCB7XG4gICAgICAgICAgICBmaWxlTmFtZTogbnVsbCxcbiAgICAgICAgfSwgbnVsbCwga2V5KTtcbiAgICAgICAgcmV0dXJuIHZpZXc7XG4gICAgfVxufVxuIiwiaW1wb3J0IERvbWFpbiBmcm9tICcuL2RvbWFpbkJhc2UnO1xuaW1wb3J0IHsgRW5jU3RyaW5nIH0gZnJvbSAnLi9lbmNTdHJpbmcnO1xuaW1wb3J0IHsgU3ltbWV0cmljQ3J5cHRvS2V5IH0gZnJvbSAnLi9zeW1tZXRyaWNDcnlwdG9LZXknO1xuXG5pbXBvcnQgeyBTZW5kVGV4dERhdGEgfSBmcm9tICcuLi9kYXRhL3NlbmRUZXh0RGF0YSc7XG5cbmltcG9ydCB7IFNlbmRUZXh0VmlldyB9IGZyb20gJy4uL3ZpZXcvc2VuZFRleHRWaWV3JztcblxuZXhwb3J0IGNsYXNzIFNlbmRUZXh0IGV4dGVuZHMgRG9tYWluIHtcbiAgICB0ZXh0OiBFbmNTdHJpbmc7XG4gICAgaGlkZGVuOiBib29sZWFuO1xuXG4gICAgY29uc3RydWN0b3Iob2JqPzogU2VuZFRleHREYXRhLCBhbHJlYWR5RW5jcnlwdGVkOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgaWYgKG9iaiA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmhpZGRlbiA9IG9iai5oaWRkZW47XG4gICAgICAgIHRoaXMuYnVpbGREb21haW5Nb2RlbCh0aGlzLCBvYmosIHtcbiAgICAgICAgICAgIHRleHQ6IG51bGwsXG4gICAgICAgIH0sIGFscmVhZHlFbmNyeXB0ZWQsIFtdKTtcbiAgICB9XG5cbiAgICBkZWNyeXB0KGtleTogU3ltbWV0cmljQ3J5cHRvS2V5KTogUHJvbWlzZTxTZW5kVGV4dFZpZXc+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGVjcnlwdE9iaihuZXcgU2VuZFRleHRWaWV3KHRoaXMpLCB7XG4gICAgICAgICAgICB0ZXh0OiBudWxsLFxuICAgICAgICB9LCBudWxsLCBrZXkpO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IENpcGhlclZpZXcgfSBmcm9tICcuLi92aWV3L2NpcGhlclZpZXcnO1xuXG5jb25zdCBDYWNoZVRUTCA9IDMwMDA7XG5cbmV4cG9ydCBjbGFzcyBTb3J0ZWRDaXBoZXJzQ2FjaGUge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgc29ydGVkQ2lwaGVyc0J5VXJsOiBNYXA8c3RyaW5nLCBDaXBoZXJzPiA9IG5ldyBNYXA8c3RyaW5nLCBDaXBoZXJzPigpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgdGltZW91dHM6IE1hcDxzdHJpbmcsIGFueT4gPSBuZXcgTWFwPHN0cmluZywgYW55PigpO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBjb21wYXJhdG9yOiAoYTogQ2lwaGVyVmlldywgYjogQ2lwaGVyVmlldykgPT4gbnVtYmVyKSB7IH1cblxuICAgIGlzQ2FjaGVkKHVybDogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNvcnRlZENpcGhlcnNCeVVybC5oYXModXJsKTtcbiAgICB9XG5cbiAgICBhZGRDaXBoZXJzKHVybDogc3RyaW5nLCBjaXBoZXJzOiBDaXBoZXJWaWV3W10pIHtcbiAgICAgICAgY2lwaGVycy5zb3J0KHRoaXMuY29tcGFyYXRvcik7XG4gICAgICAgIHRoaXMuc29ydGVkQ2lwaGVyc0J5VXJsLnNldCh1cmwsIG5ldyBDaXBoZXJzKGNpcGhlcnMpKTtcbiAgICAgICAgdGhpcy5yZXNldFRpbWVyKHVybCk7XG4gICAgfVxuXG4gICAgZ2V0TGFzdFVzZWQodXJsOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5yZXNldFRpbWVyKHVybCk7XG4gICAgICAgIHJldHVybiB0aGlzLmlzQ2FjaGVkKHVybCkgPyB0aGlzLnNvcnRlZENpcGhlcnNCeVVybC5nZXQodXJsKS5nZXRMYXN0VXNlZCgpIDogbnVsbDtcbiAgICB9XG5cbiAgICBnZXRMYXN0TGF1bmNoZWQodXJsOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNDYWNoZWQodXJsKSA/IHRoaXMuc29ydGVkQ2lwaGVyc0J5VXJsLmdldCh1cmwpLmdldExhc3RMYXVuY2hlZCgpIDogbnVsbDtcbiAgICB9XG5cbiAgICBnZXROZXh0KHVybDogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMucmVzZXRUaW1lcih1cmwpO1xuICAgICAgICByZXR1cm4gdGhpcy5pc0NhY2hlZCh1cmwpID8gdGhpcy5zb3J0ZWRDaXBoZXJzQnlVcmwuZ2V0KHVybCkuZ2V0TmV4dCgpIDogbnVsbDtcbiAgICB9XG5cbiAgICB1cGRhdGVMYXN0VXNlZEluZGV4KHVybDogc3RyaW5nKSB7XG4gICAgICAgIGlmICh0aGlzLmlzQ2FjaGVkKHVybCkpIHtcbiAgICAgICAgICAgIHRoaXMuc29ydGVkQ2lwaGVyc0J5VXJsLmdldCh1cmwpLnVwZGF0ZUxhc3RVc2VkSW5kZXgoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNsZWFyKCkge1xuICAgICAgICB0aGlzLnNvcnRlZENpcGhlcnNCeVVybC5jbGVhcigpO1xuICAgICAgICB0aGlzLnRpbWVvdXRzLmNsZWFyKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZXNldFRpbWVyKHVybDogc3RyaW5nKSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXRzLmdldCh1cmwpKTtcbiAgICAgICAgdGhpcy50aW1lb3V0cy5zZXQodXJsLCBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc29ydGVkQ2lwaGVyc0J5VXJsLmRlbGV0ZSh1cmwpO1xuICAgICAgICAgICAgdGhpcy50aW1lb3V0cy5kZWxldGUodXJsKTtcbiAgICAgICAgfSwgQ2FjaGVUVEwpKTtcbiAgICB9XG59XG5cbmNsYXNzIENpcGhlcnMge1xuICAgIGxhc3RVc2VkSW5kZXggPSAtMTtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgY2lwaGVyczogQ2lwaGVyVmlld1tdKSB7IH1cblxuICAgIGdldExhc3RVc2VkKCkge1xuICAgICAgICB0aGlzLmxhc3RVc2VkSW5kZXggPSBNYXRoLm1heCh0aGlzLmxhc3RVc2VkSW5kZXgsIDApO1xuICAgICAgICByZXR1cm4gdGhpcy5jaXBoZXJzW3RoaXMubGFzdFVzZWRJbmRleF07XG4gICAgfVxuXG4gICAgZ2V0TGFzdExhdW5jaGVkKCkge1xuICAgICAgICBjb25zdCB1c2VkQ2lwaGVycyA9IHRoaXMuY2lwaGVycy5maWx0ZXIoY2lwaGVyID0+IGNpcGhlci5sb2NhbERhdGE/Lmxhc3RMYXVuY2hlZCk7XG4gICAgICAgIGNvbnN0IHNvcnRlZENpcGhlcnMgPSB1c2VkQ2lwaGVycy5zb3J0KCh4LCB5KSA9PiB5LmxvY2FsRGF0YS5sYXN0TGF1bmNoZWQudmFsdWVPZigpIC0geC5sb2NhbERhdGEubGFzdExhdW5jaGVkLnZhbHVlT2YoKSk7XG4gICAgICAgIHJldHVybiBzb3J0ZWRDaXBoZXJzWzBdO1xuICAgIH1cblxuICAgIGdldE5leHRJbmRleCgpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLmxhc3RVc2VkSW5kZXggKyAxKSAlIHRoaXMuY2lwaGVycy5sZW5ndGg7XG4gICAgfVxuXG4gICAgZ2V0TmV4dCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2lwaGVyc1t0aGlzLmdldE5leHRJbmRleCgpXTtcbiAgICB9XG5cbiAgICB1cGRhdGVMYXN0VXNlZEluZGV4KCkge1xuICAgICAgICB0aGlzLmxhc3RVc2VkSW5kZXggPSB0aGlzLmdldE5leHRJbmRleCgpO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IEVuY3J5cHRpb25UeXBlIH0gZnJvbSAnLi4vLi4vZW51bXMvZW5jcnlwdGlvblR5cGUnO1xuXG5pbXBvcnQgeyBVdGlscyB9IGZyb20gJy4uLy4uL21pc2MvdXRpbHMnO1xuXG5leHBvcnQgY2xhc3MgU3ltbWV0cmljQ3J5cHRvS2V5IHtcbiAgICBrZXk6IEFycmF5QnVmZmVyO1xuICAgIGVuY0tleT86IEFycmF5QnVmZmVyO1xuICAgIG1hY0tleT86IEFycmF5QnVmZmVyO1xuICAgIGVuY1R5cGU6IEVuY3J5cHRpb25UeXBlO1xuXG4gICAga2V5QjY0OiBzdHJpbmc7XG4gICAgZW5jS2V5QjY0OiBzdHJpbmc7XG4gICAgbWFjS2V5QjY0OiBzdHJpbmc7XG5cbiAgICBtZXRhOiBhbnk7XG5cbiAgICBjb25zdHJ1Y3RvcihrZXk6IEFycmF5QnVmZmVyLCBlbmNUeXBlPzogRW5jcnlwdGlvblR5cGUpIHtcbiAgICAgICAgaWYgKGtleSA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ011c3QgcHJvdmlkZSBrZXknKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlbmNUeXBlID09IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChrZXkuYnl0ZUxlbmd0aCA9PT0gMzIpIHtcbiAgICAgICAgICAgICAgICBlbmNUeXBlID0gRW5jcnlwdGlvblR5cGUuQWVzQ2JjMjU2X0I2NDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoa2V5LmJ5dGVMZW5ndGggPT09IDY0KSB7XG4gICAgICAgICAgICAgICAgZW5jVHlwZSA9IEVuY3J5cHRpb25UeXBlLkFlc0NiYzI1Nl9IbWFjU2hhMjU2X0I2NDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gZGV0ZXJtaW5lIGVuY1R5cGUuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmtleSA9IGtleTtcbiAgICAgICAgdGhpcy5lbmNUeXBlID0gZW5jVHlwZTtcblxuICAgICAgICBpZiAoZW5jVHlwZSA9PT0gRW5jcnlwdGlvblR5cGUuQWVzQ2JjMjU2X0I2NCAmJiBrZXkuYnl0ZUxlbmd0aCA9PT0gMzIpIHtcbiAgICAgICAgICAgIHRoaXMuZW5jS2V5ID0ga2V5O1xuICAgICAgICAgICAgdGhpcy5tYWNLZXkgPSBudWxsO1xuICAgICAgICB9IGVsc2UgaWYgKGVuY1R5cGUgPT09IEVuY3J5cHRpb25UeXBlLkFlc0NiYzEyOF9IbWFjU2hhMjU2X0I2NCAmJiBrZXkuYnl0ZUxlbmd0aCA9PT0gMzIpIHtcbiAgICAgICAgICAgIHRoaXMuZW5jS2V5ID0ga2V5LnNsaWNlKDAsIDE2KTtcbiAgICAgICAgICAgIHRoaXMubWFjS2V5ID0ga2V5LnNsaWNlKDE2LCAzMik7XG4gICAgICAgIH0gZWxzZSBpZiAoZW5jVHlwZSA9PT0gRW5jcnlwdGlvblR5cGUuQWVzQ2JjMjU2X0htYWNTaGEyNTZfQjY0ICYmIGtleS5ieXRlTGVuZ3RoID09PSA2NCkge1xuICAgICAgICAgICAgdGhpcy5lbmNLZXkgPSBrZXkuc2xpY2UoMCwgMzIpO1xuICAgICAgICAgICAgdGhpcy5tYWNLZXkgPSBrZXkuc2xpY2UoMzIsIDY0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgZW5jVHlwZS9rZXkgbGVuZ3RoLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMua2V5ICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMua2V5QjY0ID0gVXRpbHMuZnJvbUJ1ZmZlclRvQjY0KHRoaXMua2V5KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5lbmNLZXkgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5lbmNLZXlCNjQgPSBVdGlscy5mcm9tQnVmZmVyVG9CNjQodGhpcy5lbmNLZXkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm1hY0tleSAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLm1hY0tleUI2NCA9IFV0aWxzLmZyb21CdWZmZXJUb0I2NCh0aGlzLm1hY0tleSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJleHBvcnQgY2xhc3MgVHJlZU5vZGU8VCBleHRlbmRzIElUcmVlTm9kZU9iamVjdD4ge1xuICAgIHBhcmVudDogVDtcbiAgICBub2RlOiBUO1xuICAgIGNoaWxkcmVuOiBUcmVlTm9kZTxUPltdID0gW107XG5cbiAgICBjb25zdHJ1Y3Rvcihub2RlOiBULCBuYW1lOiBzdHJpbmcsIHBhcmVudDogVCkge1xuICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDtcbiAgICAgICAgdGhpcy5ub2RlID0gbm9kZTtcbiAgICAgICAgdGhpcy5ub2RlLm5hbWUgPSBuYW1lO1xuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJVHJlZU5vZGVPYmplY3Qge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgbmFtZTogc3RyaW5nO1xufVxuIiwiaW1wb3J0IHsgQ2FyZFZpZXcgfSBmcm9tICcuLi92aWV3L2NhcmRWaWV3JztcblxuaW1wb3J0IHsgQ2FyZCBhcyBDYXJkRG9tYWluIH0gZnJvbSAnLi4vZG9tYWluL2NhcmQnO1xuaW1wb3J0IHsgRW5jU3RyaW5nIH0gZnJvbSAnLi4vZG9tYWluL2VuY1N0cmluZyc7XG5cbmV4cG9ydCBjbGFzcyBDYXJkIHtcbiAgICBzdGF0aWMgdGVtcGxhdGUoKTogQ2FyZCB7XG4gICAgICAgIGNvbnN0IHJlcSA9IG5ldyBDYXJkKCk7XG4gICAgICAgIHJlcS5jYXJkaG9sZGVyTmFtZSA9ICdKb2huIERvZSc7XG4gICAgICAgIHJlcS5icmFuZCA9ICd2aXNhJztcbiAgICAgICAgcmVxLm51bWJlciA9ICc0MjQyNDI0MjQyNDI0MjQyJztcbiAgICAgICAgcmVxLmV4cE1vbnRoID0gJzA0JztcbiAgICAgICAgcmVxLmV4cFllYXIgPSAnMjAyMyc7XG4gICAgICAgIHJlcS5jb2RlID0gJzEyMyc7XG4gICAgICAgIHJldHVybiByZXE7XG4gICAgfVxuXG4gICAgc3RhdGljIHRvVmlldyhyZXE6IENhcmQsIHZpZXcgPSBuZXcgQ2FyZFZpZXcoKSkge1xuICAgICAgICB2aWV3LmNhcmRob2xkZXJOYW1lID0gcmVxLmNhcmRob2xkZXJOYW1lO1xuICAgICAgICB2aWV3LmJyYW5kID0gcmVxLmJyYW5kO1xuICAgICAgICB2aWV3Lm51bWJlciA9IHJlcS5udW1iZXI7XG4gICAgICAgIHZpZXcuZXhwTW9udGggPSByZXEuZXhwTW9udGg7XG4gICAgICAgIHZpZXcuZXhwWWVhciA9IHJlcS5leHBZZWFyO1xuICAgICAgICB2aWV3LmNvZGUgPSByZXEuY29kZTtcbiAgICAgICAgcmV0dXJuIHZpZXc7XG4gICAgfVxuXG4gICAgc3RhdGljIHRvRG9tYWluKHJlcTogQ2FyZCwgZG9tYWluID0gbmV3IENhcmREb21haW4oKSkge1xuICAgICAgICBkb21haW4uY2FyZGhvbGRlck5hbWUgPSByZXEuY2FyZGhvbGRlck5hbWUgIT0gbnVsbCA/IG5ldyBFbmNTdHJpbmcocmVxLmNhcmRob2xkZXJOYW1lKSA6IG51bGw7XG4gICAgICAgIGRvbWFpbi5icmFuZCA9IHJlcS5icmFuZCAhPSBudWxsID8gbmV3IEVuY1N0cmluZyhyZXEuYnJhbmQpIDogbnVsbDtcbiAgICAgICAgZG9tYWluLm51bWJlciA9IHJlcS5udW1iZXIgIT0gbnVsbCA/IG5ldyBFbmNTdHJpbmcocmVxLm51bWJlcikgOiBudWxsO1xuICAgICAgICBkb21haW4uZXhwTW9udGggPSByZXEuZXhwTW9udGggIT0gbnVsbCA/IG5ldyBFbmNTdHJpbmcocmVxLmV4cE1vbnRoKSA6IG51bGw7XG4gICAgICAgIGRvbWFpbi5leHBZZWFyID0gcmVxLmV4cFllYXIgIT0gbnVsbCA/IG5ldyBFbmNTdHJpbmcocmVxLmV4cFllYXIpIDogbnVsbDtcbiAgICAgICAgZG9tYWluLmNvZGUgPSByZXEuY29kZSAhPSBudWxsID8gbmV3IEVuY1N0cmluZyhyZXEuY29kZSkgOiBudWxsO1xuICAgICAgICByZXR1cm4gZG9tYWluO1xuICAgIH1cblxuICAgIGNhcmRob2xkZXJOYW1lOiBzdHJpbmc7XG4gICAgYnJhbmQ6IHN0cmluZztcbiAgICBudW1iZXI6IHN0cmluZztcbiAgICBleHBNb250aDogc3RyaW5nO1xuICAgIGV4cFllYXI6IHN0cmluZztcbiAgICBjb2RlOiBzdHJpbmc7XG5cbiAgICBjb25zdHJ1Y3RvcihvPzogQ2FyZFZpZXcgfCBDYXJkRG9tYWluKSB7XG4gICAgICAgIGlmIChvID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvIGluc3RhbmNlb2YgQ2FyZFZpZXcpIHtcbiAgICAgICAgICAgIHRoaXMuY2FyZGhvbGRlck5hbWUgPSBvLmNhcmRob2xkZXJOYW1lO1xuICAgICAgICAgICAgdGhpcy5icmFuZCA9IG8uYnJhbmQ7XG4gICAgICAgICAgICB0aGlzLm51bWJlciA9IG8ubnVtYmVyO1xuICAgICAgICAgICAgdGhpcy5leHBNb250aCA9IG8uZXhwTW9udGg7XG4gICAgICAgICAgICB0aGlzLmV4cFllYXIgPSBvLmV4cFllYXI7XG4gICAgICAgICAgICB0aGlzLmNvZGUgPSBvLmNvZGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmNhcmRob2xkZXJOYW1lID0gby5jYXJkaG9sZGVyTmFtZT8uZW5jcnlwdGVkU3RyaW5nO1xuICAgICAgICAgICAgdGhpcy5icmFuZCA9IG8uYnJhbmQ/LmVuY3J5cHRlZFN0cmluZztcbiAgICAgICAgICAgIHRoaXMubnVtYmVyID0gby5udW1iZXI/LmVuY3J5cHRlZFN0cmluZztcbiAgICAgICAgICAgIHRoaXMuZXhwTW9udGggPSBvLmV4cE1vbnRoPy5lbmNyeXB0ZWRTdHJpbmc7XG4gICAgICAgICAgICB0aGlzLmV4cFllYXIgPSBvLmV4cFllYXI/LmVuY3J5cHRlZFN0cmluZztcbiAgICAgICAgICAgIHRoaXMuY29kZSA9IG8uY29kZT8uZW5jcnlwdGVkU3RyaW5nO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgQ2lwaGVyUmVwcm9tcHRUeXBlIH0gZnJvbSAnLi4vLi4vZW51bXMvY2lwaGVyUmVwcm9tcHRUeXBlJztcbmltcG9ydCB7IENpcGhlclR5cGUgfSBmcm9tICcuLi8uLi9lbnVtcy9jaXBoZXJUeXBlJztcblxuaW1wb3J0IHsgQ2lwaGVyVmlldyB9IGZyb20gJy4uL3ZpZXcvY2lwaGVyVmlldyc7XG5cbmltcG9ydCB7IENpcGhlciBhcyBDaXBoZXJEb21haW4gfSBmcm9tICcuLi9kb21haW4vY2lwaGVyJztcbmltcG9ydCB7IEVuY1N0cmluZyB9IGZyb20gJy4uL2RvbWFpbi9lbmNTdHJpbmcnO1xuXG5pbXBvcnQgeyBDYXJkIH0gZnJvbSAnLi9jYXJkJztcbmltcG9ydCB7IEZpZWxkIH0gZnJvbSAnLi9maWVsZCc7XG5pbXBvcnQgeyBJZGVudGl0eSB9IGZyb20gJy4vaWRlbnRpdHknO1xuaW1wb3J0IHsgTG9naW4gfSBmcm9tICcuL2xvZ2luJztcbmltcG9ydCB7IFNlY3VyZU5vdGUgfSBmcm9tICcuL3NlY3VyZU5vdGUnO1xuXG5leHBvcnQgY2xhc3MgQ2lwaGVyIHtcbiAgICBzdGF0aWMgdGVtcGxhdGUoKTogQ2lwaGVyIHtcbiAgICAgICAgY29uc3QgcmVxID0gbmV3IENpcGhlcigpO1xuICAgICAgICByZXEub3JnYW5pemF0aW9uSWQgPSBudWxsO1xuICAgICAgICByZXEuY29sbGVjdGlvbklkcyA9IG51bGw7XG4gICAgICAgIHJlcS5mb2xkZXJJZCA9IG51bGw7XG4gICAgICAgIHJlcS50eXBlID0gQ2lwaGVyVHlwZS5Mb2dpbjtcbiAgICAgICAgcmVxLm5hbWUgPSAnSXRlbSBuYW1lJztcbiAgICAgICAgcmVxLm5vdGVzID0gJ1NvbWUgbm90ZXMgYWJvdXQgdGhpcyBpdGVtLic7XG4gICAgICAgIHJlcS5mYXZvcml0ZSA9IGZhbHNlO1xuICAgICAgICByZXEuZmllbGRzID0gW107XG4gICAgICAgIHJlcS5sb2dpbiA9IG51bGw7XG4gICAgICAgIHJlcS5zZWN1cmVOb3RlID0gbnVsbDtcbiAgICAgICAgcmVxLmNhcmQgPSBudWxsO1xuICAgICAgICByZXEuaWRlbnRpdHkgPSBudWxsO1xuICAgICAgICByZXEucmVwcm9tcHQgPSBDaXBoZXJSZXByb21wdFR5cGUuTm9uZTtcbiAgICAgICAgcmV0dXJuIHJlcTtcbiAgICB9XG5cbiAgICBzdGF0aWMgdG9WaWV3KHJlcTogQ2lwaGVyLCB2aWV3ID0gbmV3IENpcGhlclZpZXcoKSkge1xuICAgICAgICB2aWV3LnR5cGUgPSByZXEudHlwZTtcbiAgICAgICAgdmlldy5mb2xkZXJJZCA9IHJlcS5mb2xkZXJJZDtcbiAgICAgICAgaWYgKHZpZXcub3JnYW5pemF0aW9uSWQgPT0gbnVsbCkge1xuICAgICAgICAgICAgdmlldy5vcmdhbml6YXRpb25JZCA9IHJlcS5vcmdhbml6YXRpb25JZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmlldy5jb2xsZWN0aW9uSWRzIHx8IHJlcS5jb2xsZWN0aW9uSWRzKSB7XG4gICAgICAgICAgICBjb25zdCBzZXQgPSBuZXcgU2V0KCh2aWV3LmNvbGxlY3Rpb25JZHMgPz8gW10pLmNvbmNhdChyZXEuY29sbGVjdGlvbklkcyA/PyBbXSkpO1xuICAgICAgICAgICAgdmlldy5jb2xsZWN0aW9uSWRzID0gQXJyYXkuZnJvbShzZXQudmFsdWVzKCkpO1xuICAgICAgICB9XG4gICAgICAgIHZpZXcubmFtZSA9IHJlcS5uYW1lO1xuICAgICAgICB2aWV3Lm5vdGVzID0gcmVxLm5vdGVzO1xuICAgICAgICB2aWV3LmZhdm9yaXRlID0gcmVxLmZhdm9yaXRlO1xuICAgICAgICB2aWV3LnJlcHJvbXB0ID0gcmVxLnJlcHJvbXB0ID8/IENpcGhlclJlcHJvbXB0VHlwZS5Ob25lO1xuXG4gICAgICAgIGlmIChyZXEuZmllbGRzICE9IG51bGwpIHtcbiAgICAgICAgICAgIHZpZXcuZmllbGRzID0gcmVxLmZpZWxkcy5tYXAoZiA9PiBGaWVsZC50b1ZpZXcoZikpO1xuICAgICAgICB9XG5cbiAgICAgICAgc3dpdGNoIChyZXEudHlwZSkge1xuICAgICAgICAgICAgY2FzZSBDaXBoZXJUeXBlLkxvZ2luOlxuICAgICAgICAgICAgICAgIHZpZXcubG9naW4gPSBMb2dpbi50b1ZpZXcocmVxLmxvZ2luKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgQ2lwaGVyVHlwZS5TZWN1cmVOb3RlOlxuICAgICAgICAgICAgICAgIHZpZXcuc2VjdXJlTm90ZSA9IFNlY3VyZU5vdGUudG9WaWV3KHJlcS5zZWN1cmVOb3RlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgQ2lwaGVyVHlwZS5DYXJkOlxuICAgICAgICAgICAgICAgIHZpZXcuY2FyZCA9IENhcmQudG9WaWV3KHJlcS5jYXJkKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgQ2lwaGVyVHlwZS5JZGVudGl0eTpcbiAgICAgICAgICAgICAgICB2aWV3LmlkZW50aXR5ID0gSWRlbnRpdHkudG9WaWV3KHJlcS5pZGVudGl0eSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdmlldztcbiAgICB9XG5cbiAgICBzdGF0aWMgdG9Eb21haW4ocmVxOiBDaXBoZXIsIGRvbWFpbiA9IG5ldyBDaXBoZXJEb21haW4oKSkge1xuICAgICAgICBkb21haW4udHlwZSA9IHJlcS50eXBlO1xuICAgICAgICBkb21haW4uZm9sZGVySWQgPSByZXEuZm9sZGVySWQ7XG4gICAgICAgIGlmIChkb21haW4ub3JnYW5pemF0aW9uSWQgPT0gbnVsbCkge1xuICAgICAgICAgICAgZG9tYWluLm9yZ2FuaXphdGlvbklkID0gcmVxLm9yZ2FuaXphdGlvbklkO1xuICAgICAgICB9XG4gICAgICAgIGRvbWFpbi5uYW1lID0gcmVxLm5hbWUgIT0gbnVsbCA/IG5ldyBFbmNTdHJpbmcocmVxLm5hbWUpIDogbnVsbDtcbiAgICAgICAgZG9tYWluLm5vdGVzID0gcmVxLm5vdGVzICE9IG51bGwgPyBuZXcgRW5jU3RyaW5nKHJlcS5ub3RlcykgOiBudWxsO1xuICAgICAgICBkb21haW4uZmF2b3JpdGUgPSByZXEuZmF2b3JpdGU7XG4gICAgICAgIGRvbWFpbi5yZXByb21wdCA9IHJlcS5yZXByb21wdCA/PyBDaXBoZXJSZXByb21wdFR5cGUuTm9uZTtcblxuICAgICAgICBpZiAocmVxLmZpZWxkcyAhPSBudWxsKSB7XG4gICAgICAgICAgICBkb21haW4uZmllbGRzID0gcmVxLmZpZWxkcy5tYXAoZiA9PiBGaWVsZC50b0RvbWFpbihmKSk7XG4gICAgICAgIH1cblxuICAgICAgICBzd2l0Y2ggKHJlcS50eXBlKSB7XG4gICAgICAgICAgICBjYXNlIENpcGhlclR5cGUuTG9naW46XG4gICAgICAgICAgICAgICAgZG9tYWluLmxvZ2luID0gTG9naW4udG9Eb21haW4ocmVxLmxvZ2luKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgQ2lwaGVyVHlwZS5TZWN1cmVOb3RlOlxuICAgICAgICAgICAgICAgIGRvbWFpbi5zZWN1cmVOb3RlID0gU2VjdXJlTm90ZS50b0RvbWFpbihyZXEuc2VjdXJlTm90ZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIENpcGhlclR5cGUuQ2FyZDpcbiAgICAgICAgICAgICAgICBkb21haW4uY2FyZCA9IENhcmQudG9Eb21haW4ocmVxLmNhcmQpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBDaXBoZXJUeXBlLklkZW50aXR5OlxuICAgICAgICAgICAgICAgIGRvbWFpbi5pZGVudGl0eSA9IElkZW50aXR5LnRvRG9tYWluKHJlcS5pZGVudGl0eSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZG9tYWluO1xuICAgIH1cblxuICAgIHR5cGU6IENpcGhlclR5cGU7XG4gICAgZm9sZGVySWQ6IHN0cmluZztcbiAgICBvcmdhbml6YXRpb25JZDogc3RyaW5nO1xuICAgIGNvbGxlY3Rpb25JZHM6IHN0cmluZ1tdO1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBub3Rlczogc3RyaW5nO1xuICAgIGZhdm9yaXRlOiBib29sZWFuO1xuICAgIGZpZWxkczogRmllbGRbXTtcbiAgICBsb2dpbjogTG9naW47XG4gICAgc2VjdXJlTm90ZTogU2VjdXJlTm90ZTtcbiAgICBjYXJkOiBDYXJkO1xuICAgIGlkZW50aXR5OiBJZGVudGl0eTtcbiAgICByZXByb21wdDogQ2lwaGVyUmVwcm9tcHRUeXBlO1xuXG4gICAgLy8gVXNlIGJ1aWxkIG1ldGhvZCBpbnN0ZWFkIG9mIGN0b3Igc28gdGhhdCB3ZSBjYW4gY29udHJvbCBvcmRlciBvZiBKU09OIHN0cmluZ2lmeSBmb3IgcHJldHR5IHByaW50XG4gICAgYnVpbGQobzogQ2lwaGVyVmlldyB8IENpcGhlckRvbWFpbikge1xuICAgICAgICB0aGlzLm9yZ2FuaXphdGlvbklkID0gby5vcmdhbml6YXRpb25JZDtcbiAgICAgICAgdGhpcy5mb2xkZXJJZCA9IG8uZm9sZGVySWQ7XG4gICAgICAgIHRoaXMudHlwZSA9IG8udHlwZTtcbiAgICAgICAgdGhpcy5yZXByb21wdCA9IG8ucmVwcm9tcHQ7XG5cbiAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBDaXBoZXJWaWV3KSB7XG4gICAgICAgICAgICB0aGlzLm5hbWUgPSBvLm5hbWU7XG4gICAgICAgICAgICB0aGlzLm5vdGVzID0gby5ub3RlcztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubmFtZSA9IG8ubmFtZT8uZW5jcnlwdGVkU3RyaW5nO1xuICAgICAgICAgICAgdGhpcy5ub3RlcyA9IG8ubm90ZXM/LmVuY3J5cHRlZFN0cmluZztcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZmF2b3JpdGUgPSBvLmZhdm9yaXRlO1xuXG4gICAgICAgIGlmIChvLmZpZWxkcyAhPSBudWxsKSB7XG4gICAgICAgICAgICBpZiAobyBpbnN0YW5jZW9mIENpcGhlclZpZXcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpZWxkcyA9IG8uZmllbGRzLm1hcChmID0+IG5ldyBGaWVsZChmKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuZmllbGRzID0gby5maWVsZHMubWFwKGYgPT4gbmV3IEZpZWxkKGYpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHN3aXRjaCAoby50eXBlKSB7XG4gICAgICAgICAgICBjYXNlIENpcGhlclR5cGUuTG9naW46XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dpbiA9IG5ldyBMb2dpbihvLmxvZ2luKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgQ2lwaGVyVHlwZS5TZWN1cmVOb3RlOlxuICAgICAgICAgICAgICAgIHRoaXMuc2VjdXJlTm90ZSA9IG5ldyBTZWN1cmVOb3RlKG8uc2VjdXJlTm90ZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIENpcGhlclR5cGUuQ2FyZDpcbiAgICAgICAgICAgICAgICB0aGlzLmNhcmQgPSBuZXcgQ2FyZChvLmNhcmQpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBDaXBoZXJUeXBlLklkZW50aXR5OlxuICAgICAgICAgICAgICAgIHRoaXMuaWRlbnRpdHkgPSBuZXcgSWRlbnRpdHkoby5pZGVudGl0eSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgeyBDaXBoZXIgfSBmcm9tICcuL2NpcGhlcic7XG5cbmltcG9ydCB7IENpcGhlclZpZXcgfSBmcm9tICcuLi92aWV3L2NpcGhlclZpZXcnO1xuXG5pbXBvcnQgeyBDaXBoZXIgYXMgQ2lwaGVyRG9tYWluIH0gZnJvbSAnLi4vZG9tYWluL2NpcGhlcic7XG5cbmV4cG9ydCBjbGFzcyBDaXBoZXJXaXRoSWRzIGV4dGVuZHMgQ2lwaGVyIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIGNvbGxlY3Rpb25JZHM6IHN0cmluZ1tdO1xuXG4gICAgLy8gVXNlIGJ1aWxkIG1ldGhvZCBpbnN0ZWFkIG9mIGN0b3Igc28gdGhhdCB3ZSBjYW4gY29udHJvbCBvcmRlciBvZiBKU09OIHN0cmluZ2lmeSBmb3IgcHJldHR5IHByaW50XG4gICAgYnVpbGQobzogQ2lwaGVyVmlldyB8IENpcGhlckRvbWFpbikge1xuICAgICAgICB0aGlzLmlkID0gby5pZDtcbiAgICAgICAgc3VwZXIuYnVpbGQobyk7XG4gICAgICAgIHRoaXMuY29sbGVjdGlvbklkcyA9IG8uY29sbGVjdGlvbklkcztcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBDb2xsZWN0aW9uVmlldyB9IGZyb20gJy4uL3ZpZXcvY29sbGVjdGlvblZpZXcnO1xuXG5pbXBvcnQgeyBDb2xsZWN0aW9uIGFzIENvbGxlY3Rpb25Eb21haW4gfSBmcm9tICcuLi9kb21haW4vY29sbGVjdGlvbic7XG5pbXBvcnQgeyBFbmNTdHJpbmcgfSBmcm9tICcuLi9kb21haW4vZW5jU3RyaW5nJztcblxuZXhwb3J0IGNsYXNzIENvbGxlY3Rpb24ge1xuICAgIHN0YXRpYyB0ZW1wbGF0ZSgpOiBDb2xsZWN0aW9uIHtcbiAgICAgICAgY29uc3QgcmVxID0gbmV3IENvbGxlY3Rpb24oKTtcbiAgICAgICAgcmVxLm9yZ2FuaXphdGlvbklkID0gJzAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMCc7XG4gICAgICAgIHJlcS5uYW1lID0gJ0NvbGxlY3Rpb24gbmFtZSc7XG4gICAgICAgIHJlcS5leHRlcm5hbElkID0gbnVsbDtcbiAgICAgICAgcmV0dXJuIHJlcTtcbiAgICB9XG5cbiAgICBzdGF0aWMgdG9WaWV3KHJlcTogQ29sbGVjdGlvbiwgdmlldyA9IG5ldyBDb2xsZWN0aW9uVmlldygpKSB7XG4gICAgICAgIHZpZXcubmFtZSA9IHJlcS5uYW1lO1xuICAgICAgICB2aWV3LmV4dGVybmFsSWQgPSByZXEuZXh0ZXJuYWxJZDtcbiAgICAgICAgaWYgKHZpZXcub3JnYW5pemF0aW9uSWQgPT0gbnVsbCkge1xuICAgICAgICAgICAgdmlldy5vcmdhbml6YXRpb25JZCA9IHJlcS5vcmdhbml6YXRpb25JZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmlldztcbiAgICB9XG5cbiAgICBzdGF0aWMgdG9Eb21haW4ocmVxOiBDb2xsZWN0aW9uLCBkb21haW4gPSBuZXcgQ29sbGVjdGlvbkRvbWFpbigpKSB7XG4gICAgICAgIGRvbWFpbi5uYW1lID0gcmVxLm5hbWUgIT0gbnVsbCA/IG5ldyBFbmNTdHJpbmcocmVxLm5hbWUpIDogbnVsbDtcbiAgICAgICAgZG9tYWluLmV4dGVybmFsSWQgPSByZXEuZXh0ZXJuYWxJZDtcbiAgICAgICAgaWYgKGRvbWFpbi5vcmdhbml6YXRpb25JZCA9PSBudWxsKSB7XG4gICAgICAgICAgICBkb21haW4ub3JnYW5pemF0aW9uSWQgPSByZXEub3JnYW5pemF0aW9uSWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRvbWFpbjtcbiAgICB9XG5cbiAgICBvcmdhbml6YXRpb25JZDogc3RyaW5nO1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBleHRlcm5hbElkOiBzdHJpbmc7XG5cbiAgICAvLyBVc2UgYnVpbGQgbWV0aG9kIGluc3RlYWQgb2YgY3RvciBzbyB0aGF0IHdlIGNhbiBjb250cm9sIG9yZGVyIG9mIEpTT04gc3RyaW5naWZ5IGZvciBwcmV0dHkgcHJpbnRcbiAgICBidWlsZChvOiBDb2xsZWN0aW9uVmlldyB8IENvbGxlY3Rpb25Eb21haW4pIHtcbiAgICAgICAgdGhpcy5vcmdhbml6YXRpb25JZCA9IG8ub3JnYW5pemF0aW9uSWQ7XG4gICAgICAgIGlmIChvIGluc3RhbmNlb2YgQ29sbGVjdGlvblZpZXcpIHtcbiAgICAgICAgICAgIHRoaXMubmFtZSA9IG8ubmFtZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubmFtZSA9IG8ubmFtZT8uZW5jcnlwdGVkU3RyaW5nO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZXh0ZXJuYWxJZCA9IG8uZXh0ZXJuYWxJZDtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBDb2xsZWN0aW9uIH0gZnJvbSAnLi9jb2xsZWN0aW9uJztcblxuaW1wb3J0IHsgQ29sbGVjdGlvblZpZXcgfSBmcm9tICcuLi92aWV3L2NvbGxlY3Rpb25WaWV3JztcblxuaW1wb3J0IHsgQ29sbGVjdGlvbiBhcyBDb2xsZWN0aW9uRG9tYWluIH0gZnJvbSAnLi4vZG9tYWluL2NvbGxlY3Rpb24nO1xuXG5leHBvcnQgY2xhc3MgQ29sbGVjdGlvbldpdGhJZCBleHRlbmRzIENvbGxlY3Rpb24ge1xuICAgIGlkOiBzdHJpbmc7XG5cbiAgICAvLyBVc2UgYnVpbGQgbWV0aG9kIGluc3RlYWQgb2YgY3RvciBzbyB0aGF0IHdlIGNhbiBjb250cm9sIG9yZGVyIG9mIEpTT04gc3RyaW5naWZ5IGZvciBwcmV0dHkgcHJpbnRcbiAgICBidWlsZChvOiBDb2xsZWN0aW9uVmlldyB8IENvbGxlY3Rpb25Eb21haW4pIHtcbiAgICAgICAgdGhpcy5pZCA9IG8uaWQ7XG4gICAgICAgIHN1cGVyLmJ1aWxkKG8pO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IEV2ZW50VHlwZSB9IGZyb20gJy4uLy4uL2VudW1zL2V2ZW50VHlwZSc7XG5pbXBvcnQgeyBFdmVudFZpZXcgfSBmcm9tICcuLi92aWV3L2V2ZW50Vmlldyc7XG5cbmV4cG9ydCBjbGFzcyBFdmVudCB7XG4gICAgbWVzc2FnZTogc3RyaW5nO1xuICAgIGFwcEljb246IHN0cmluZztcbiAgICBhcHBOYW1lOiBzdHJpbmc7XG4gICAgdXNlcklkOiBzdHJpbmc7XG4gICAgdXNlck5hbWU6IHN0cmluZztcbiAgICB1c2VyRW1haWw6IHN0cmluZztcbiAgICBkYXRlOiBzdHJpbmc7XG4gICAgaXA6IHN0cmluZztcbiAgICB0eXBlOiBzdHJpbmc7XG5cbiAgICBjb25zdHJ1Y3RvcihldmVudDogRXZlbnRWaWV3KSB7XG4gICAgICAgIHRoaXMubWVzc2FnZSA9IGV2ZW50Lmh1bWFuUmVhZGFibGVNZXNzYWdlO1xuICAgICAgICB0aGlzLmFwcEljb24gPSBldmVudC5hcHBJY29uO1xuICAgICAgICB0aGlzLmFwcE5hbWUgPSBldmVudC5hcHBOYW1lO1xuICAgICAgICB0aGlzLnVzZXJJZCA9IGV2ZW50LnVzZXJJZDtcbiAgICAgICAgdGhpcy51c2VyTmFtZSA9IGV2ZW50LnVzZXJOYW1lO1xuICAgICAgICB0aGlzLnVzZXJFbWFpbCA9IGV2ZW50LnVzZXJFbWFpbDtcbiAgICAgICAgdGhpcy5kYXRlID0gZXZlbnQuZGF0ZTtcbiAgICAgICAgdGhpcy5pcCA9IGV2ZW50LmlwO1xuICAgICAgICB0aGlzLnR5cGUgPSBFdmVudFR5cGVbZXZlbnQudHlwZV07XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgRmllbGRUeXBlIH0gZnJvbSAnLi4vLi4vZW51bXMvZmllbGRUeXBlJztcblxuaW1wb3J0IHsgRmllbGRWaWV3IH0gZnJvbSAnLi4vdmlldy9maWVsZFZpZXcnO1xuXG5pbXBvcnQgeyBFbmNTdHJpbmcgfSBmcm9tICcuLi9kb21haW4vZW5jU3RyaW5nJztcbmltcG9ydCB7IEZpZWxkIGFzIEZpZWxkRG9tYWluIH0gZnJvbSAnLi4vZG9tYWluL2ZpZWxkJztcblxuZXhwb3J0IGNsYXNzIEZpZWxkIHtcbiAgICBzdGF0aWMgdGVtcGxhdGUoKTogRmllbGQge1xuICAgICAgICBjb25zdCByZXEgPSBuZXcgRmllbGQoKTtcbiAgICAgICAgcmVxLm5hbWUgPSAnRmllbGQgbmFtZSc7XG4gICAgICAgIHJlcS52YWx1ZSA9ICdTb21lIHZhbHVlJztcbiAgICAgICAgcmVxLnR5cGUgPSBGaWVsZFR5cGUuVGV4dDtcbiAgICAgICAgcmV0dXJuIHJlcTtcbiAgICB9XG5cbiAgICBzdGF0aWMgdG9WaWV3KHJlcTogRmllbGQsIHZpZXcgPSBuZXcgRmllbGRWaWV3KCkpIHtcbiAgICAgICAgdmlldy50eXBlID0gcmVxLnR5cGU7XG4gICAgICAgIHZpZXcudmFsdWUgPSByZXEudmFsdWU7XG4gICAgICAgIHZpZXcubmFtZSA9IHJlcS5uYW1lO1xuICAgICAgICByZXR1cm4gdmlldztcbiAgICB9XG5cbiAgICBzdGF0aWMgdG9Eb21haW4ocmVxOiBGaWVsZCwgZG9tYWluID0gbmV3IEZpZWxkRG9tYWluKCkpIHtcbiAgICAgICAgZG9tYWluLnR5cGUgPSByZXEudHlwZTtcbiAgICAgICAgZG9tYWluLnZhbHVlID0gcmVxLnZhbHVlICE9IG51bGwgPyBuZXcgRW5jU3RyaW5nKHJlcS52YWx1ZSkgOiBudWxsO1xuICAgICAgICBkb21haW4ubmFtZSA9IHJlcS5uYW1lICE9IG51bGwgPyBuZXcgRW5jU3RyaW5nKHJlcS5uYW1lKSA6IG51bGw7XG4gICAgICAgIHJldHVybiBkb21haW47XG4gICAgfVxuXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIHZhbHVlOiBzdHJpbmc7XG4gICAgdHlwZTogRmllbGRUeXBlO1xuXG4gICAgY29uc3RydWN0b3Iobz86IEZpZWxkVmlldyB8IEZpZWxkRG9tYWluKSB7XG4gICAgICAgIGlmIChvID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvIGluc3RhbmNlb2YgRmllbGRWaWV3KSB7XG4gICAgICAgICAgICB0aGlzLm5hbWUgPSBvLm5hbWU7XG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gby52YWx1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubmFtZSA9IG8ubmFtZT8uZW5jcnlwdGVkU3RyaW5nO1xuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IG8udmFsdWU/LmVuY3J5cHRlZFN0cmluZztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnR5cGUgPSBvLnR5cGU7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgRm9sZGVyVmlldyB9IGZyb20gJy4uL3ZpZXcvZm9sZGVyVmlldyc7XG5cbmltcG9ydCB7IEVuY1N0cmluZyB9IGZyb20gJy4uL2RvbWFpbi9lbmNTdHJpbmcnO1xuaW1wb3J0IHsgRm9sZGVyIGFzIEZvbGRlckRvbWFpbiB9IGZyb20gJy4uL2RvbWFpbi9mb2xkZXInO1xuXG5leHBvcnQgY2xhc3MgRm9sZGVyIHtcbiAgICBzdGF0aWMgdGVtcGxhdGUoKTogRm9sZGVyIHtcbiAgICAgICAgY29uc3QgcmVxID0gbmV3IEZvbGRlcigpO1xuICAgICAgICByZXEubmFtZSA9ICdGb2xkZXIgbmFtZSc7XG4gICAgICAgIHJldHVybiByZXE7XG4gICAgfVxuXG4gICAgc3RhdGljIHRvVmlldyhyZXE6IEZvbGRlciwgdmlldyA9IG5ldyBGb2xkZXJWaWV3KCkpIHtcbiAgICAgICAgdmlldy5uYW1lID0gcmVxLm5hbWU7XG4gICAgICAgIHJldHVybiB2aWV3O1xuICAgIH1cblxuICAgIHN0YXRpYyB0b0RvbWFpbihyZXE6IEZvbGRlciwgZG9tYWluID0gbmV3IEZvbGRlckRvbWFpbigpKSB7XG4gICAgICAgIGRvbWFpbi5uYW1lID0gcmVxLm5hbWUgIT0gbnVsbCA/IG5ldyBFbmNTdHJpbmcocmVxLm5hbWUpIDogbnVsbDtcbiAgICAgICAgcmV0dXJuIGRvbWFpbjtcbiAgICB9XG5cbiAgICBuYW1lOiBzdHJpbmc7XG5cbiAgICAvLyBVc2UgYnVpbGQgbWV0aG9kIGluc3RlYWQgb2YgY3RvciBzbyB0aGF0IHdlIGNhbiBjb250cm9sIG9yZGVyIG9mIEpTT04gc3RyaW5naWZ5IGZvciBwcmV0dHkgcHJpbnRcbiAgICBidWlsZChvOiBGb2xkZXJWaWV3IHwgRm9sZGVyRG9tYWluKSB7XG4gICAgICAgIGlmIChvIGluc3RhbmNlb2YgRm9sZGVyVmlldykge1xuICAgICAgICAgICAgdGhpcy5uYW1lID0gby5uYW1lO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5uYW1lID0gby5uYW1lPy5lbmNyeXB0ZWRTdHJpbmc7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgeyBGb2xkZXIgfSBmcm9tICcuL2ZvbGRlcic7XG5cbmltcG9ydCB7IEZvbGRlclZpZXcgfSBmcm9tICcuLi92aWV3L2ZvbGRlclZpZXcnO1xuXG5pbXBvcnQgeyBGb2xkZXIgYXMgRm9sZGVyRG9tYWluIH0gZnJvbSAnLi4vZG9tYWluL2ZvbGRlcic7XG5cbmV4cG9ydCBjbGFzcyBGb2xkZXJXaXRoSWQgZXh0ZW5kcyBGb2xkZXIge1xuICAgIGlkOiBzdHJpbmc7XG5cbiAgICAvLyBVc2UgYnVpbGQgbWV0aG9kIGluc3RlYWQgb2YgY3RvciBzbyB0aGF0IHdlIGNhbiBjb250cm9sIG9yZGVyIG9mIEpTT04gc3RyaW5naWZ5IGZvciBwcmV0dHkgcHJpbnRcbiAgICBidWlsZChvOiBGb2xkZXJWaWV3IHwgRm9sZGVyRG9tYWluKSB7XG4gICAgICAgIHRoaXMuaWQgPSBvLmlkO1xuICAgICAgICBzdXBlci5idWlsZChvKTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBJZGVudGl0eVZpZXcgfSBmcm9tICcuLi92aWV3L2lkZW50aXR5Vmlldyc7XG5cbmltcG9ydCB7IEVuY1N0cmluZyB9IGZyb20gJy4uL2RvbWFpbi9lbmNTdHJpbmcnO1xuaW1wb3J0IHsgSWRlbnRpdHkgYXMgSWRlbnRpdHlEb21haW4gfSBmcm9tICcuLi9kb21haW4vaWRlbnRpdHknO1xuXG5leHBvcnQgY2xhc3MgSWRlbnRpdHkge1xuICAgIHN0YXRpYyB0ZW1wbGF0ZSgpOiBJZGVudGl0eSB7XG4gICAgICAgIGNvbnN0IHJlcSA9IG5ldyBJZGVudGl0eSgpO1xuICAgICAgICByZXEudGl0bGUgPSAnTXInO1xuICAgICAgICByZXEuZmlyc3ROYW1lID0gJ0pvaG4nO1xuICAgICAgICByZXEubWlkZGxlTmFtZSA9ICdXaWxsaWFtJztcbiAgICAgICAgcmVxLmxhc3ROYW1lID0gJ0RvZSc7XG4gICAgICAgIHJlcS5hZGRyZXNzMSA9ICcxMjMgQW55IFN0JztcbiAgICAgICAgcmVxLmFkZHJlc3MyID0gJ0FwdCAjMTIzJztcbiAgICAgICAgcmVxLmFkZHJlc3MzID0gbnVsbDtcbiAgICAgICAgcmVxLmNpdHkgPSAnTmV3IFlvcmsnO1xuICAgICAgICByZXEuc3RhdGUgPSAnTlknO1xuICAgICAgICByZXEucG9zdGFsQ29kZSA9ICcxMDAwMSc7XG4gICAgICAgIHJlcS5jb3VudHJ5ID0gJ1VTJztcbiAgICAgICAgcmVxLmNvbXBhbnkgPSAnQWNtZSBJbmMuJztcbiAgICAgICAgcmVxLmVtYWlsID0gJ2pvaG5AY29tcGFueS5jb20nO1xuICAgICAgICByZXEucGhvbmUgPSAnNTU1NTU1MTIzNCc7XG4gICAgICAgIHJlcS5zc24gPSAnMDAwLTEyMy00NTY3JztcbiAgICAgICAgcmVxLnVzZXJuYW1lID0gJ2pkb2UnO1xuICAgICAgICByZXEucGFzc3BvcnROdW1iZXIgPSAnVVMtMTIzNDU2Nzg5JztcbiAgICAgICAgcmVxLmxpY2Vuc2VOdW1iZXIgPSAnRDEyMy0xMi0xMjMtMTIzMzMnO1xuICAgICAgICByZXR1cm4gcmVxO1xuICAgIH1cblxuICAgIHN0YXRpYyB0b1ZpZXcocmVxOiBJZGVudGl0eSwgdmlldyA9IG5ldyBJZGVudGl0eVZpZXcoKSkge1xuICAgICAgICB2aWV3LnRpdGxlID0gcmVxLnRpdGxlO1xuICAgICAgICB2aWV3LmZpcnN0TmFtZSA9IHJlcS5maXJzdE5hbWU7XG4gICAgICAgIHZpZXcubWlkZGxlTmFtZSA9IHJlcS5taWRkbGVOYW1lO1xuICAgICAgICB2aWV3Lmxhc3ROYW1lID0gcmVxLmxhc3ROYW1lO1xuICAgICAgICB2aWV3LmFkZHJlc3MxID0gcmVxLmFkZHJlc3MxO1xuICAgICAgICB2aWV3LmFkZHJlc3MyID0gcmVxLmFkZHJlc3MyO1xuICAgICAgICB2aWV3LmFkZHJlc3MzID0gcmVxLmFkZHJlc3MzO1xuICAgICAgICB2aWV3LmNpdHkgPSByZXEuY2l0eTtcbiAgICAgICAgdmlldy5zdGF0ZSA9IHJlcS5zdGF0ZTtcbiAgICAgICAgdmlldy5wb3N0YWxDb2RlID0gcmVxLnBvc3RhbENvZGU7XG4gICAgICAgIHZpZXcuY291bnRyeSA9IHJlcS5jb3VudHJ5O1xuICAgICAgICB2aWV3LmNvbXBhbnkgPSByZXEuY29tcGFueTtcbiAgICAgICAgdmlldy5lbWFpbCA9IHJlcS5lbWFpbDtcbiAgICAgICAgdmlldy5waG9uZSA9IHJlcS5waG9uZTtcbiAgICAgICAgdmlldy5zc24gPSByZXEuc3NuO1xuICAgICAgICB2aWV3LnVzZXJuYW1lID0gcmVxLnVzZXJuYW1lO1xuICAgICAgICB2aWV3LnBhc3Nwb3J0TnVtYmVyID0gcmVxLnBhc3Nwb3J0TnVtYmVyO1xuICAgICAgICB2aWV3LmxpY2Vuc2VOdW1iZXIgPSByZXEubGljZW5zZU51bWJlcjtcbiAgICAgICAgcmV0dXJuIHZpZXc7XG4gICAgfVxuXG4gICAgc3RhdGljIHRvRG9tYWluKHJlcTogSWRlbnRpdHksIGRvbWFpbiA9IG5ldyBJZGVudGl0eURvbWFpbigpKSB7XG4gICAgICAgIGRvbWFpbi50aXRsZSA9IHJlcS50aXRsZSAhPSBudWxsID8gbmV3IEVuY1N0cmluZyhyZXEudGl0bGUpIDogbnVsbDtcbiAgICAgICAgZG9tYWluLmZpcnN0TmFtZSA9IHJlcS5maXJzdE5hbWUgIT0gbnVsbCA/IG5ldyBFbmNTdHJpbmcocmVxLmZpcnN0TmFtZSkgOiBudWxsO1xuICAgICAgICBkb21haW4ubWlkZGxlTmFtZSA9IHJlcS5taWRkbGVOYW1lICE9IG51bGwgPyBuZXcgRW5jU3RyaW5nKHJlcS5taWRkbGVOYW1lKSA6IG51bGw7XG4gICAgICAgIGRvbWFpbi5sYXN0TmFtZSA9IHJlcS5sYXN0TmFtZSAhPSBudWxsID8gbmV3IEVuY1N0cmluZyhyZXEubGFzdE5hbWUpIDogbnVsbDtcbiAgICAgICAgZG9tYWluLmFkZHJlc3MxID0gcmVxLmFkZHJlc3MxICE9IG51bGwgPyBuZXcgRW5jU3RyaW5nKHJlcS5hZGRyZXNzMSkgOiBudWxsO1xuICAgICAgICBkb21haW4uYWRkcmVzczIgPSByZXEuYWRkcmVzczIgIT0gbnVsbCA/IG5ldyBFbmNTdHJpbmcocmVxLmFkZHJlc3MyKSA6IG51bGw7XG4gICAgICAgIGRvbWFpbi5hZGRyZXNzMyA9IHJlcS5hZGRyZXNzMyAhPSBudWxsID8gbmV3IEVuY1N0cmluZyhyZXEuYWRkcmVzczMpIDogbnVsbDtcbiAgICAgICAgZG9tYWluLmNpdHkgPSByZXEuY2l0eSAhPSBudWxsID8gbmV3IEVuY1N0cmluZyhyZXEuY2l0eSkgOiBudWxsO1xuICAgICAgICBkb21haW4uc3RhdGUgPSByZXEuc3RhdGUgIT0gbnVsbCA/IG5ldyBFbmNTdHJpbmcocmVxLnN0YXRlKSA6IG51bGw7XG4gICAgICAgIGRvbWFpbi5wb3N0YWxDb2RlID0gcmVxLnBvc3RhbENvZGUgIT0gbnVsbCA/IG5ldyBFbmNTdHJpbmcocmVxLnBvc3RhbENvZGUpIDogbnVsbDtcbiAgICAgICAgZG9tYWluLmNvdW50cnkgPSByZXEuY291bnRyeSAhPSBudWxsID8gbmV3IEVuY1N0cmluZyhyZXEuY291bnRyeSkgOiBudWxsO1xuICAgICAgICBkb21haW4uY29tcGFueSA9IHJlcS5jb21wYW55ICE9IG51bGwgPyBuZXcgRW5jU3RyaW5nKHJlcS5jb21wYW55KSA6IG51bGw7XG4gICAgICAgIGRvbWFpbi5lbWFpbCA9IHJlcS5lbWFpbCAhPSBudWxsID8gbmV3IEVuY1N0cmluZyhyZXEuZW1haWwpIDogbnVsbDtcbiAgICAgICAgZG9tYWluLnBob25lID0gcmVxLnBob25lICE9IG51bGwgPyBuZXcgRW5jU3RyaW5nKHJlcS5waG9uZSkgOiBudWxsO1xuICAgICAgICBkb21haW4uc3NuID0gcmVxLnNzbiAhPSBudWxsID8gbmV3IEVuY1N0cmluZyhyZXEuc3NuKSA6IG51bGw7XG4gICAgICAgIGRvbWFpbi51c2VybmFtZSA9IHJlcS51c2VybmFtZSAhPSBudWxsID8gbmV3IEVuY1N0cmluZyhyZXEudXNlcm5hbWUpIDogbnVsbDtcbiAgICAgICAgZG9tYWluLnBhc3Nwb3J0TnVtYmVyID0gcmVxLnBhc3Nwb3J0TnVtYmVyICE9IG51bGwgPyBuZXcgRW5jU3RyaW5nKHJlcS5wYXNzcG9ydE51bWJlcikgOiBudWxsO1xuICAgICAgICBkb21haW4ubGljZW5zZU51bWJlciA9IHJlcS5saWNlbnNlTnVtYmVyICE9IG51bGwgPyBuZXcgRW5jU3RyaW5nKHJlcS5saWNlbnNlTnVtYmVyKSA6IG51bGw7XG4gICAgICAgIHJldHVybiBkb21haW47XG4gICAgfVxuXG4gICAgdGl0bGU6IHN0cmluZztcbiAgICBmaXJzdE5hbWU6IHN0cmluZztcbiAgICBtaWRkbGVOYW1lOiBzdHJpbmc7XG4gICAgbGFzdE5hbWU6IHN0cmluZztcbiAgICBhZGRyZXNzMTogc3RyaW5nO1xuICAgIGFkZHJlc3MyOiBzdHJpbmc7XG4gICAgYWRkcmVzczM6IHN0cmluZztcbiAgICBjaXR5OiBzdHJpbmc7XG4gICAgc3RhdGU6IHN0cmluZztcbiAgICBwb3N0YWxDb2RlOiBzdHJpbmc7XG4gICAgY291bnRyeTogc3RyaW5nO1xuICAgIGNvbXBhbnk6IHN0cmluZztcbiAgICBlbWFpbDogc3RyaW5nO1xuICAgIHBob25lOiBzdHJpbmc7XG4gICAgc3NuOiBzdHJpbmc7XG4gICAgdXNlcm5hbWU6IHN0cmluZztcbiAgICBwYXNzcG9ydE51bWJlcjogc3RyaW5nO1xuICAgIGxpY2Vuc2VOdW1iZXI6IHN0cmluZztcblxuICAgIGNvbnN0cnVjdG9yKG8/OiBJZGVudGl0eVZpZXcgfCBJZGVudGl0eURvbWFpbikge1xuICAgICAgICBpZiAobyA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobyBpbnN0YW5jZW9mIElkZW50aXR5Vmlldykge1xuICAgICAgICAgICAgdGhpcy50aXRsZSA9IG8udGl0bGU7XG4gICAgICAgICAgICB0aGlzLmZpcnN0TmFtZSA9IG8uZmlyc3ROYW1lO1xuICAgICAgICAgICAgdGhpcy5taWRkbGVOYW1lID0gby5taWRkbGVOYW1lO1xuICAgICAgICAgICAgdGhpcy5sYXN0TmFtZSA9IG8ubGFzdE5hbWU7XG4gICAgICAgICAgICB0aGlzLmFkZHJlc3MxID0gby5hZGRyZXNzMTtcbiAgICAgICAgICAgIHRoaXMuYWRkcmVzczIgPSBvLmFkZHJlc3MyO1xuICAgICAgICAgICAgdGhpcy5hZGRyZXNzMyA9IG8uYWRkcmVzczM7XG4gICAgICAgICAgICB0aGlzLmNpdHkgPSBvLmNpdHk7XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gby5zdGF0ZTtcbiAgICAgICAgICAgIHRoaXMucG9zdGFsQ29kZSA9IG8ucG9zdGFsQ29kZTtcbiAgICAgICAgICAgIHRoaXMuY291bnRyeSA9IG8uY291bnRyeTtcbiAgICAgICAgICAgIHRoaXMuY29tcGFueSA9IG8uY29tcGFueTtcbiAgICAgICAgICAgIHRoaXMuZW1haWwgPSBvLmVtYWlsO1xuICAgICAgICAgICAgdGhpcy5waG9uZSA9IG8ucGhvbmU7XG4gICAgICAgICAgICB0aGlzLnNzbiA9IG8uc3NuO1xuICAgICAgICAgICAgdGhpcy51c2VybmFtZSA9IG8udXNlcm5hbWU7XG4gICAgICAgICAgICB0aGlzLnBhc3Nwb3J0TnVtYmVyID0gby5wYXNzcG9ydE51bWJlcjtcbiAgICAgICAgICAgIHRoaXMubGljZW5zZU51bWJlciA9IG8ubGljZW5zZU51bWJlcjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudGl0bGUgPSBvLnRpdGxlPy5lbmNyeXB0ZWRTdHJpbmc7XG4gICAgICAgICAgICB0aGlzLmZpcnN0TmFtZSA9IG8uZmlyc3ROYW1lPy5lbmNyeXB0ZWRTdHJpbmc7XG4gICAgICAgICAgICB0aGlzLm1pZGRsZU5hbWUgPSBvLm1pZGRsZU5hbWU/LmVuY3J5cHRlZFN0cmluZztcbiAgICAgICAgICAgIHRoaXMubGFzdE5hbWUgPSBvLmxhc3ROYW1lPy5lbmNyeXB0ZWRTdHJpbmc7XG4gICAgICAgICAgICB0aGlzLmFkZHJlc3MxID0gby5hZGRyZXNzMT8uZW5jcnlwdGVkU3RyaW5nO1xuICAgICAgICAgICAgdGhpcy5hZGRyZXNzMiA9IG8uYWRkcmVzczI/LmVuY3J5cHRlZFN0cmluZztcbiAgICAgICAgICAgIHRoaXMuYWRkcmVzczMgPSBvLmFkZHJlc3MzPy5lbmNyeXB0ZWRTdHJpbmc7XG4gICAgICAgICAgICB0aGlzLmNpdHkgPSBvLmNpdHk/LmVuY3J5cHRlZFN0cmluZztcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBvLnN0YXRlPy5lbmNyeXB0ZWRTdHJpbmc7XG4gICAgICAgICAgICB0aGlzLnBvc3RhbENvZGUgPSBvLnBvc3RhbENvZGU/LmVuY3J5cHRlZFN0cmluZztcbiAgICAgICAgICAgIHRoaXMuY291bnRyeSA9IG8uY291bnRyeT8uZW5jcnlwdGVkU3RyaW5nO1xuICAgICAgICAgICAgdGhpcy5jb21wYW55ID0gby5jb21wYW55Py5lbmNyeXB0ZWRTdHJpbmc7XG4gICAgICAgICAgICB0aGlzLmVtYWlsID0gby5lbWFpbD8uZW5jcnlwdGVkU3RyaW5nO1xuICAgICAgICAgICAgdGhpcy5waG9uZSA9IG8ucGhvbmU/LmVuY3J5cHRlZFN0cmluZztcbiAgICAgICAgICAgIHRoaXMuc3NuID0gby5zc24/LmVuY3J5cHRlZFN0cmluZztcbiAgICAgICAgICAgIHRoaXMudXNlcm5hbWUgPSBvLnVzZXJuYW1lPy5lbmNyeXB0ZWRTdHJpbmc7XG4gICAgICAgICAgICB0aGlzLnBhc3Nwb3J0TnVtYmVyID0gby5wYXNzcG9ydE51bWJlcj8uZW5jcnlwdGVkU3RyaW5nO1xuICAgICAgICAgICAgdGhpcy5saWNlbnNlTnVtYmVyID0gby5saWNlbnNlTnVtYmVyPy5lbmNyeXB0ZWRTdHJpbmc7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgeyBMb2dpblVyaSB9IGZyb20gJy4vbG9naW5VcmknO1xuXG5pbXBvcnQgeyBMb2dpblZpZXcgfSBmcm9tICcuLi92aWV3L2xvZ2luVmlldyc7XG5cbmltcG9ydCB7IEVuY1N0cmluZyB9IGZyb20gJy4uL2RvbWFpbi9lbmNTdHJpbmcnO1xuaW1wb3J0IHsgTG9naW4gYXMgTG9naW5Eb21haW4gfSBmcm9tICcuLi9kb21haW4vbG9naW4nO1xuXG5leHBvcnQgY2xhc3MgTG9naW4ge1xuICAgIHN0YXRpYyB0ZW1wbGF0ZSgpOiBMb2dpbiB7XG4gICAgICAgIGNvbnN0IHJlcSA9IG5ldyBMb2dpbigpO1xuICAgICAgICByZXEudXJpcyA9IFtdO1xuICAgICAgICByZXEudXNlcm5hbWUgPSAnamRvZSc7XG4gICAgICAgIHJlcS5wYXNzd29yZCA9ICdteXBAc3N3b3JkMTIzJztcbiAgICAgICAgcmVxLnRvdHAgPSAnSkJTV1kzRFBFSFBLM1BYUCc7XG4gICAgICAgIHJldHVybiByZXE7XG4gICAgfVxuXG4gICAgc3RhdGljIHRvVmlldyhyZXE6IExvZ2luLCB2aWV3ID0gbmV3IExvZ2luVmlldygpKSB7XG4gICAgICAgIGlmIChyZXEudXJpcyAhPSBudWxsKSB7XG4gICAgICAgICAgICB2aWV3LnVyaXMgPSByZXEudXJpcy5tYXAodSA9PiBMb2dpblVyaS50b1ZpZXcodSkpO1xuICAgICAgICB9XG4gICAgICAgIHZpZXcudXNlcm5hbWUgPSByZXEudXNlcm5hbWU7XG4gICAgICAgIHZpZXcucGFzc3dvcmQgPSByZXEucGFzc3dvcmQ7XG4gICAgICAgIHZpZXcudG90cCA9IHJlcS50b3RwO1xuICAgICAgICByZXR1cm4gdmlldztcbiAgICB9XG5cbiAgICBzdGF0aWMgdG9Eb21haW4ocmVxOiBMb2dpbiwgZG9tYWluID0gbmV3IExvZ2luRG9tYWluKCkpIHtcbiAgICAgICAgaWYgKHJlcS51cmlzICE9IG51bGwpIHtcbiAgICAgICAgICAgIGRvbWFpbi51cmlzID0gcmVxLnVyaXMubWFwKHUgPT4gTG9naW5VcmkudG9Eb21haW4odSkpO1xuICAgICAgICB9XG4gICAgICAgIGRvbWFpbi51c2VybmFtZSA9IHJlcS51c2VybmFtZSAhPSBudWxsID8gbmV3IEVuY1N0cmluZyhyZXEudXNlcm5hbWUpIDogbnVsbDtcbiAgICAgICAgZG9tYWluLnBhc3N3b3JkID0gcmVxLnBhc3N3b3JkICE9IG51bGwgPyBuZXcgRW5jU3RyaW5nKHJlcS5wYXNzd29yZCkgOiBudWxsO1xuICAgICAgICBkb21haW4udG90cCA9IHJlcS50b3RwICE9IG51bGwgPyBuZXcgRW5jU3RyaW5nKHJlcS50b3RwKSA6IG51bGw7XG4gICAgICAgIHJldHVybiBkb21haW47XG4gICAgfVxuXG4gICAgdXJpczogTG9naW5VcmlbXTtcbiAgICB1c2VybmFtZTogc3RyaW5nO1xuICAgIHBhc3N3b3JkOiBzdHJpbmc7XG4gICAgdG90cDogc3RyaW5nO1xuXG4gICAgY29uc3RydWN0b3Iobz86IExvZ2luVmlldyB8IExvZ2luRG9tYWluKSB7XG4gICAgICAgIGlmIChvID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvLnVyaXMgIT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBMb2dpblZpZXcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnVyaXMgPSBvLnVyaXMubWFwKHUgPT4gbmV3IExvZ2luVXJpKHUpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy51cmlzID0gby51cmlzLm1hcCh1ID0+IG5ldyBMb2dpblVyaSh1KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobyBpbnN0YW5jZW9mIExvZ2luVmlldykge1xuICAgICAgICAgICAgdGhpcy51c2VybmFtZSA9IG8udXNlcm5hbWU7XG4gICAgICAgICAgICB0aGlzLnBhc3N3b3JkID0gby5wYXNzd29yZDtcbiAgICAgICAgICAgIHRoaXMudG90cCA9IG8udG90cDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudXNlcm5hbWUgPSBvLnVzZXJuYW1lPy5lbmNyeXB0ZWRTdHJpbmc7XG4gICAgICAgICAgICB0aGlzLnBhc3N3b3JkID0gby5wYXNzd29yZD8uZW5jcnlwdGVkU3RyaW5nO1xuICAgICAgICAgICAgdGhpcy50b3RwID0gby50b3RwPy5lbmNyeXB0ZWRTdHJpbmc7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgeyBVcmlNYXRjaFR5cGUgfSBmcm9tICcuLi8uLi9lbnVtcy91cmlNYXRjaFR5cGUnO1xuXG5pbXBvcnQgeyBMb2dpblVyaVZpZXcgfSBmcm9tICcuLi92aWV3L2xvZ2luVXJpVmlldyc7XG5cbmltcG9ydCB7IEVuY1N0cmluZyB9IGZyb20gJy4uL2RvbWFpbi9lbmNTdHJpbmcnO1xuaW1wb3J0IHsgTG9naW5VcmkgYXMgTG9naW5VcmlEb21haW4gfSBmcm9tICcuLi9kb21haW4vbG9naW5VcmknO1xuXG5leHBvcnQgY2xhc3MgTG9naW5Vcmkge1xuICAgIHN0YXRpYyB0ZW1wbGF0ZSgpOiBMb2dpblVyaSB7XG4gICAgICAgIGNvbnN0IHJlcSA9IG5ldyBMb2dpblVyaSgpO1xuICAgICAgICByZXEudXJpID0gJ2h0dHBzOi8vZ29vZ2xlLmNvbSc7XG4gICAgICAgIHJlcS5tYXRjaCA9IG51bGw7XG4gICAgICAgIHJldHVybiByZXE7XG4gICAgfVxuXG4gICAgc3RhdGljIHRvVmlldyhyZXE6IExvZ2luVXJpLCB2aWV3ID0gbmV3IExvZ2luVXJpVmlldygpKSB7XG4gICAgICAgIHZpZXcudXJpID0gcmVxLnVyaTtcbiAgICAgICAgdmlldy5tYXRjaCA9IHJlcS5tYXRjaDtcbiAgICAgICAgcmV0dXJuIHZpZXc7XG4gICAgfVxuXG4gICAgc3RhdGljIHRvRG9tYWluKHJlcTogTG9naW5VcmksIGRvbWFpbiA9IG5ldyBMb2dpblVyaURvbWFpbigpKSB7XG4gICAgICAgIGRvbWFpbi51cmkgPSByZXEudXJpICE9IG51bGwgPyBuZXcgRW5jU3RyaW5nKHJlcS51cmkpIDogbnVsbDtcbiAgICAgICAgZG9tYWluLm1hdGNoID0gcmVxLm1hdGNoO1xuICAgICAgICByZXR1cm4gZG9tYWluO1xuICAgIH1cblxuICAgIHVyaTogc3RyaW5nO1xuICAgIG1hdGNoOiBVcmlNYXRjaFR5cGUgPSBudWxsO1xuXG4gICAgY29uc3RydWN0b3Iobz86IExvZ2luVXJpVmlldyB8IExvZ2luVXJpRG9tYWluKSB7XG4gICAgICAgIGlmIChvID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvIGluc3RhbmNlb2YgTG9naW5VcmlWaWV3KSB7XG4gICAgICAgICAgICB0aGlzLnVyaSA9IG8udXJpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy51cmkgPSBvLnVyaT8uZW5jcnlwdGVkU3RyaW5nO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubWF0Y2ggPSBvLm1hdGNoO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IFNlY3VyZU5vdGVUeXBlIH0gZnJvbSAnLi4vLi4vZW51bXMvc2VjdXJlTm90ZVR5cGUnO1xuXG5pbXBvcnQgeyBTZWN1cmVOb3RlVmlldyB9IGZyb20gJy4uL3ZpZXcvc2VjdXJlTm90ZVZpZXcnO1xuXG5pbXBvcnQgeyBTZWN1cmVOb3RlIGFzIFNlY3VyZU5vdGVEb21haW4gfSBmcm9tICcuLi9kb21haW4vc2VjdXJlTm90ZSc7XG5cbmV4cG9ydCBjbGFzcyBTZWN1cmVOb3RlIHtcbiAgICBzdGF0aWMgdGVtcGxhdGUoKTogU2VjdXJlTm90ZSB7XG4gICAgICAgIGNvbnN0IHJlcSA9IG5ldyBTZWN1cmVOb3RlKCk7XG4gICAgICAgIHJlcS50eXBlID0gU2VjdXJlTm90ZVR5cGUuR2VuZXJpYztcbiAgICAgICAgcmV0dXJuIHJlcTtcbiAgICB9XG5cbiAgICBzdGF0aWMgdG9WaWV3KHJlcTogU2VjdXJlTm90ZSwgdmlldyA9IG5ldyBTZWN1cmVOb3RlVmlldygpKSB7XG4gICAgICAgIHZpZXcudHlwZSA9IHJlcS50eXBlO1xuICAgICAgICByZXR1cm4gdmlldztcbiAgICB9XG5cbiAgICBzdGF0aWMgdG9Eb21haW4ocmVxOiBTZWN1cmVOb3RlLCB2aWV3ID0gbmV3IFNlY3VyZU5vdGVEb21haW4oKSkge1xuICAgICAgICB2aWV3LnR5cGUgPSByZXEudHlwZTtcbiAgICAgICAgcmV0dXJuIHZpZXc7XG4gICAgfVxuXG4gICAgdHlwZTogU2VjdXJlTm90ZVR5cGU7XG5cbiAgICBjb25zdHJ1Y3RvcihvPzogU2VjdXJlTm90ZVZpZXcgfCBTZWN1cmVOb3RlRG9tYWluKSB7XG4gICAgICAgIGlmIChvID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudHlwZSA9IG8udHlwZTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBLZXlzUmVxdWVzdCB9IGZyb20gJy4uL2tleXNSZXF1ZXN0JztcblxuaW1wb3J0IHsgS2RmVHlwZSB9IGZyb20gJy4uLy4uLy4uL2VudW1zL2tkZlR5cGUnO1xuXG5leHBvcnQgY2xhc3MgU2V0Q3J5cHRvQWdlbnRLZXlSZXF1ZXN0IHtcbiAgICBrZXk6IHN0cmluZztcbiAgICBrZXlzOiBLZXlzUmVxdWVzdDtcbiAgICBrZGY6IEtkZlR5cGU7XG4gICAga2RmSXRlcmF0aW9uczogbnVtYmVyO1xuICAgIG9yZ0lkZW50aWZpZXI6IHN0cmluZztcblxuICAgIGNvbnN0cnVjdG9yKGtleTogc3RyaW5nLCBrZGY6IEtkZlR5cGUsIGtkZkl0ZXJhdGlvbnM6IG51bWJlciwgb3JnSWRlbnRpZmllcjogc3RyaW5nLCBrZXlzOiBLZXlzUmVxdWVzdCkge1xuICAgICAgICB0aGlzLmtleSA9IGtleTtcbiAgICAgICAgdGhpcy5rZGYgPSBrZGY7XG4gICAgICAgIHRoaXMua2RmSXRlcmF0aW9ucyA9IGtkZkl0ZXJhdGlvbnM7XG4gICAgICAgIHRoaXMub3JnSWRlbnRpZmllciA9IG9yZ0lkZW50aWZpZXI7XG4gICAgICAgIHRoaXMua2V5cyA9IGtleXM7XG4gICAgfVxufVxuIiwiZXhwb3J0IGNsYXNzIEF0dGFjaG1lbnRSZXF1ZXN0IHtcbiAgICBmaWxlTmFtZTogc3RyaW5nO1xuICAgIGtleTogc3RyaW5nO1xuICAgIGZpbGVTaXplOiBudW1iZXI7XG4gICAgYWRtaW5SZXF1ZXN0OiBib29sZWFuO1xufVxuIiwiZXhwb3J0IGNsYXNzIENpcGhlckJ1bGtEZWxldGVSZXF1ZXN0IHtcbiAgICBpZHM6IHN0cmluZ1tdO1xuICAgIG9yZ2FuaXphdGlvbklkOiBzdHJpbmc7XG5cbiAgICBjb25zdHJ1Y3RvcihpZHM6IHN0cmluZ1tdLCBvcmdhbml6YXRpb25JZD86IHN0cmluZykge1xuICAgICAgICB0aGlzLmlkcyA9IGlkcyA9PSBudWxsID8gW10gOiBpZHM7XG4gICAgICAgIHRoaXMub3JnYW5pemF0aW9uSWQgPSBvcmdhbml6YXRpb25JZDtcbiAgICB9XG59XG4iLCJleHBvcnQgY2xhc3MgQ2lwaGVyQnVsa01vdmVSZXF1ZXN0IHtcbiAgICBpZHM6IHN0cmluZ1tdO1xuICAgIGZvbGRlcklkOiBzdHJpbmc7XG5cbiAgICBjb25zdHJ1Y3RvcihpZHM6IHN0cmluZ1tdLCBmb2xkZXJJZDogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuaWRzID0gaWRzID09IG51bGwgPyBbXSA6IGlkcztcbiAgICAgICAgdGhpcy5mb2xkZXJJZCA9IGZvbGRlcklkO1xuICAgIH1cbn1cbiIsImV4cG9ydCBjbGFzcyBDaXBoZXJCdWxrUmVzdG9yZVJlcXVlc3Qge1xuICAgIGlkczogc3RyaW5nW107XG5cbiAgICBjb25zdHJ1Y3RvcihpZHM6IHN0cmluZ1tdKSB7XG4gICAgICAgIHRoaXMuaWRzID0gaWRzID09IG51bGwgPyBbXSA6IGlkcztcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBDaXBoZXJXaXRoSWRSZXF1ZXN0IH0gZnJvbSAnLi9jaXBoZXJXaXRoSWRSZXF1ZXN0JztcblxuaW1wb3J0IHsgQ2lwaGVyIH0gZnJvbSAnLi4vZG9tYWluL2NpcGhlcic7XG5cbmV4cG9ydCBjbGFzcyBDaXBoZXJCdWxrU2hhcmVSZXF1ZXN0IHtcbiAgICBjaXBoZXJzOiBDaXBoZXJXaXRoSWRSZXF1ZXN0W107XG4gICAgY29sbGVjdGlvbklkczogc3RyaW5nW107XG5cbiAgICBjb25zdHJ1Y3RvcihjaXBoZXJzOiBDaXBoZXJbXSwgY29sbGVjdGlvbklkczogc3RyaW5nW10pIHtcbiAgICAgICAgaWYgKGNpcGhlcnMgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5jaXBoZXJzID0gW107XG4gICAgICAgICAgICBjaXBoZXJzLmZvckVhY2goYyA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5jaXBoZXJzLnB1c2gobmV3IENpcGhlcldpdGhJZFJlcXVlc3QoYykpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb2xsZWN0aW9uSWRzID0gY29sbGVjdGlvbklkcztcbiAgICB9XG59XG4iLCJleHBvcnQgY2xhc3MgQ2lwaGVyQ29sbGVjdGlvbnNSZXF1ZXN0IHtcbiAgICBjb2xsZWN0aW9uSWRzOiBzdHJpbmdbXTtcblxuICAgIGNvbnN0cnVjdG9yKGNvbGxlY3Rpb25JZHM6IHN0cmluZ1tdKSB7XG4gICAgICAgIHRoaXMuY29sbGVjdGlvbklkcyA9IGNvbGxlY3Rpb25JZHMgPT0gbnVsbCA/IFtdIDogY29sbGVjdGlvbklkcztcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBDaXBoZXJSZXF1ZXN0IH0gZnJvbSAnLi9jaXBoZXJSZXF1ZXN0JztcblxuaW1wb3J0IHsgQ2lwaGVyIH0gZnJvbSAnLi4vZG9tYWluL2NpcGhlcic7XG5cbmV4cG9ydCBjbGFzcyBDaXBoZXJDcmVhdGVSZXF1ZXN0IHtcbiAgICBjaXBoZXI6IENpcGhlclJlcXVlc3Q7XG4gICAgY29sbGVjdGlvbklkczogc3RyaW5nW107XG5cbiAgICBjb25zdHJ1Y3RvcihjaXBoZXI6IENpcGhlcikge1xuICAgICAgICB0aGlzLmNpcGhlciA9IG5ldyBDaXBoZXJSZXF1ZXN0KGNpcGhlcik7XG4gICAgICAgIHRoaXMuY29sbGVjdGlvbklkcyA9IGNpcGhlci5jb2xsZWN0aW9uSWRzO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IENpcGhlclJlcHJvbXB0VHlwZSB9IGZyb20gJy4uLy4uL2VudW1zL2NpcGhlclJlcHJvbXB0VHlwZSc7XG5pbXBvcnQgeyBDaXBoZXJUeXBlIH0gZnJvbSAnLi4vLi4vZW51bXMvY2lwaGVyVHlwZSc7XG5cbmltcG9ydCB7IENpcGhlciB9IGZyb20gJy4uL2RvbWFpbi9jaXBoZXInO1xuXG5pbXBvcnQgeyBDYXJkQXBpIH0gZnJvbSAnLi4vYXBpL2NhcmRBcGknO1xuaW1wb3J0IHsgRmllbGRBcGkgfSBmcm9tICcuLi9hcGkvZmllbGRBcGknO1xuaW1wb3J0IHsgSWRlbnRpdHlBcGkgfSBmcm9tICcuLi9hcGkvaWRlbnRpdHlBcGknO1xuaW1wb3J0IHsgTG9naW5BcGkgfSBmcm9tICcuLi9hcGkvbG9naW5BcGknO1xuaW1wb3J0IHsgTG9naW5VcmlBcGkgfSBmcm9tICcuLi9hcGkvbG9naW5VcmlBcGknO1xuaW1wb3J0IHsgU2VjdXJlTm90ZUFwaSB9IGZyb20gJy4uL2FwaS9zZWN1cmVOb3RlQXBpJztcblxuaW1wb3J0IHsgQXR0YWNobWVudFJlcXVlc3QgfSBmcm9tICcuL2F0dGFjaG1lbnRSZXF1ZXN0JztcbmltcG9ydCB7IFBhc3N3b3JkSGlzdG9yeVJlcXVlc3QgfSBmcm9tICcuL3Bhc3N3b3JkSGlzdG9yeVJlcXVlc3QnO1xuXG5leHBvcnQgY2xhc3MgQ2lwaGVyUmVxdWVzdCB7XG4gICAgdHlwZTogQ2lwaGVyVHlwZTtcbiAgICBmb2xkZXJJZDogc3RyaW5nO1xuICAgIG9yZ2FuaXphdGlvbklkOiBzdHJpbmc7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIG5vdGVzOiBzdHJpbmc7XG4gICAgZmF2b3JpdGU6IGJvb2xlYW47XG4gICAgbG9naW46IExvZ2luQXBpO1xuICAgIHNlY3VyZU5vdGU6IFNlY3VyZU5vdGVBcGk7XG4gICAgY2FyZDogQ2FyZEFwaTtcbiAgICBpZGVudGl0eTogSWRlbnRpdHlBcGk7XG4gICAgZmllbGRzOiBGaWVsZEFwaVtdO1xuICAgIHBhc3N3b3JkSGlzdG9yeTogUGFzc3dvcmRIaXN0b3J5UmVxdWVzdFtdO1xuICAgIC8vIERlcHJlY2F0ZWQsIHJlbW92ZSBhdCBzb21lIHBvaW50IGFuZCByZW5hbWUgYXR0YWNobWVudHMyIHRvIGF0dGFjaG1lbnRzXG4gICAgYXR0YWNobWVudHM6IHsgW2lkOiBzdHJpbmddOiBzdHJpbmc7IH07XG4gICAgYXR0YWNobWVudHMyOiB7IFtpZDogc3RyaW5nXTogQXR0YWNobWVudFJlcXVlc3Q7IH07XG4gICAgbGFzdEtub3duUmV2aXNpb25EYXRlOiBEYXRlO1xuICAgIHJlcHJvbXB0OiBDaXBoZXJSZXByb21wdFR5cGU7XG5cbiAgICBjb25zdHJ1Y3RvcihjaXBoZXI6IENpcGhlcikge1xuICAgICAgICB0aGlzLnR5cGUgPSBjaXBoZXIudHlwZTtcbiAgICAgICAgdGhpcy5mb2xkZXJJZCA9IGNpcGhlci5mb2xkZXJJZDtcbiAgICAgICAgdGhpcy5vcmdhbml6YXRpb25JZCA9IGNpcGhlci5vcmdhbml6YXRpb25JZDtcbiAgICAgICAgdGhpcy5uYW1lID0gY2lwaGVyLm5hbWUgPyBjaXBoZXIubmFtZS5lbmNyeXB0ZWRTdHJpbmcgOiBudWxsO1xuICAgICAgICB0aGlzLm5vdGVzID0gY2lwaGVyLm5vdGVzID8gY2lwaGVyLm5vdGVzLmVuY3J5cHRlZFN0cmluZyA6IG51bGw7XG4gICAgICAgIHRoaXMuZmF2b3JpdGUgPSBjaXBoZXIuZmF2b3JpdGU7XG4gICAgICAgIHRoaXMubGFzdEtub3duUmV2aXNpb25EYXRlID0gY2lwaGVyLnJldmlzaW9uRGF0ZTtcbiAgICAgICAgdGhpcy5yZXByb21wdCA9IGNpcGhlci5yZXByb21wdDtcblxuICAgICAgICBzd2l0Y2ggKHRoaXMudHlwZSkge1xuICAgICAgICAgICAgY2FzZSBDaXBoZXJUeXBlLkxvZ2luOlxuICAgICAgICAgICAgICAgIHRoaXMubG9naW4gPSBuZXcgTG9naW5BcGkoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2luLnVyaXMgPSBudWxsO1xuICAgICAgICAgICAgICAgIHRoaXMubG9naW4udXNlcm5hbWUgPSBjaXBoZXIubG9naW4udXNlcm5hbWUgPyBjaXBoZXIubG9naW4udXNlcm5hbWUuZW5jcnlwdGVkU3RyaW5nIDogbnVsbDtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2luLnBhc3N3b3JkID0gY2lwaGVyLmxvZ2luLnBhc3N3b3JkID8gY2lwaGVyLmxvZ2luLnBhc3N3b3JkLmVuY3J5cHRlZFN0cmluZyA6IG51bGw7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dpbi5wYXNzd29yZFJldmlzaW9uRGF0ZSA9IGNpcGhlci5sb2dpbi5wYXNzd29yZFJldmlzaW9uRGF0ZSAhPSBudWxsID9cbiAgICAgICAgICAgICAgICAgICAgY2lwaGVyLmxvZ2luLnBhc3N3b3JkUmV2aXNpb25EYXRlLnRvSVNPU3RyaW5nKCkgOiBudWxsO1xuICAgICAgICAgICAgICAgIHRoaXMubG9naW4udG90cCA9IGNpcGhlci5sb2dpbi50b3RwID8gY2lwaGVyLmxvZ2luLnRvdHAuZW5jcnlwdGVkU3RyaW5nIDogbnVsbDtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2luLmF1dG9maWxsT25QYWdlTG9hZCA9IGNpcGhlci5sb2dpbi5hdXRvZmlsbE9uUGFnZUxvYWQ7XG5cbiAgICAgICAgICAgICAgICBpZiAoY2lwaGVyLmxvZ2luLnVyaXMgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2luLnVyaXMgPSBjaXBoZXIubG9naW4udXJpcy5tYXAodSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1cmkgPSBuZXcgTG9naW5VcmlBcGkoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVyaS51cmkgPSB1LnVyaSAhPSBudWxsID8gdS51cmkuZW5jcnlwdGVkU3RyaW5nIDogbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVyaS5tYXRjaCA9IHUubWF0Y2ggIT0gbnVsbCA/IHUubWF0Y2ggOiBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVyaTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBDaXBoZXJUeXBlLlNlY3VyZU5vdGU6XG4gICAgICAgICAgICAgICAgdGhpcy5zZWN1cmVOb3RlID0gbmV3IFNlY3VyZU5vdGVBcGkoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNlY3VyZU5vdGUudHlwZSA9IGNpcGhlci5zZWN1cmVOb3RlLnR5cGU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIENpcGhlclR5cGUuQ2FyZDpcbiAgICAgICAgICAgICAgICB0aGlzLmNhcmQgPSBuZXcgQ2FyZEFwaSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuY2FyZC5jYXJkaG9sZGVyTmFtZSA9IGNpcGhlci5jYXJkLmNhcmRob2xkZXJOYW1lICE9IG51bGwgP1xuICAgICAgICAgICAgICAgICAgICBjaXBoZXIuY2FyZC5jYXJkaG9sZGVyTmFtZS5lbmNyeXB0ZWRTdHJpbmcgOiBudWxsO1xuICAgICAgICAgICAgICAgIHRoaXMuY2FyZC5icmFuZCA9IGNpcGhlci5jYXJkLmJyYW5kICE9IG51bGwgPyBjaXBoZXIuY2FyZC5icmFuZC5lbmNyeXB0ZWRTdHJpbmcgOiBudWxsO1xuICAgICAgICAgICAgICAgIHRoaXMuY2FyZC5udW1iZXIgPSBjaXBoZXIuY2FyZC5udW1iZXIgIT0gbnVsbCA/IGNpcGhlci5jYXJkLm51bWJlci5lbmNyeXB0ZWRTdHJpbmcgOiBudWxsO1xuICAgICAgICAgICAgICAgIHRoaXMuY2FyZC5leHBNb250aCA9IGNpcGhlci5jYXJkLmV4cE1vbnRoICE9IG51bGwgPyBjaXBoZXIuY2FyZC5leHBNb250aC5lbmNyeXB0ZWRTdHJpbmcgOiBudWxsO1xuICAgICAgICAgICAgICAgIHRoaXMuY2FyZC5leHBZZWFyID0gY2lwaGVyLmNhcmQuZXhwWWVhciAhPSBudWxsID8gY2lwaGVyLmNhcmQuZXhwWWVhci5lbmNyeXB0ZWRTdHJpbmcgOiBudWxsO1xuICAgICAgICAgICAgICAgIHRoaXMuY2FyZC5jb2RlID0gY2lwaGVyLmNhcmQuY29kZSAhPSBudWxsID8gY2lwaGVyLmNhcmQuY29kZS5lbmNyeXB0ZWRTdHJpbmcgOiBudWxsO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBDaXBoZXJUeXBlLklkZW50aXR5OlxuICAgICAgICAgICAgICAgIHRoaXMuaWRlbnRpdHkgPSBuZXcgSWRlbnRpdHlBcGkoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmlkZW50aXR5LnRpdGxlID0gY2lwaGVyLmlkZW50aXR5LnRpdGxlICE9IG51bGwgPyBjaXBoZXIuaWRlbnRpdHkudGl0bGUuZW5jcnlwdGVkU3RyaW5nIDogbnVsbDtcbiAgICAgICAgICAgICAgICB0aGlzLmlkZW50aXR5LmZpcnN0TmFtZSA9IGNpcGhlci5pZGVudGl0eS5maXJzdE5hbWUgIT0gbnVsbCA/XG4gICAgICAgICAgICAgICAgICAgIGNpcGhlci5pZGVudGl0eS5maXJzdE5hbWUuZW5jcnlwdGVkU3RyaW5nIDogbnVsbDtcbiAgICAgICAgICAgICAgICB0aGlzLmlkZW50aXR5Lm1pZGRsZU5hbWUgPSBjaXBoZXIuaWRlbnRpdHkubWlkZGxlTmFtZSAhPSBudWxsID9cbiAgICAgICAgICAgICAgICAgICAgY2lwaGVyLmlkZW50aXR5Lm1pZGRsZU5hbWUuZW5jcnlwdGVkU3RyaW5nIDogbnVsbDtcbiAgICAgICAgICAgICAgICB0aGlzLmlkZW50aXR5Lmxhc3ROYW1lID0gY2lwaGVyLmlkZW50aXR5Lmxhc3ROYW1lICE9IG51bGwgP1xuICAgICAgICAgICAgICAgICAgICBjaXBoZXIuaWRlbnRpdHkubGFzdE5hbWUuZW5jcnlwdGVkU3RyaW5nIDogbnVsbDtcbiAgICAgICAgICAgICAgICB0aGlzLmlkZW50aXR5LmFkZHJlc3MxID0gY2lwaGVyLmlkZW50aXR5LmFkZHJlc3MxICE9IG51bGwgP1xuICAgICAgICAgICAgICAgICAgICBjaXBoZXIuaWRlbnRpdHkuYWRkcmVzczEuZW5jcnlwdGVkU3RyaW5nIDogbnVsbDtcbiAgICAgICAgICAgICAgICB0aGlzLmlkZW50aXR5LmFkZHJlc3MyID0gY2lwaGVyLmlkZW50aXR5LmFkZHJlc3MyICE9IG51bGwgP1xuICAgICAgICAgICAgICAgICAgICBjaXBoZXIuaWRlbnRpdHkuYWRkcmVzczIuZW5jcnlwdGVkU3RyaW5nIDogbnVsbDtcbiAgICAgICAgICAgICAgICB0aGlzLmlkZW50aXR5LmFkZHJlc3MzID0gY2lwaGVyLmlkZW50aXR5LmFkZHJlc3MzICE9IG51bGwgP1xuICAgICAgICAgICAgICAgICAgICBjaXBoZXIuaWRlbnRpdHkuYWRkcmVzczMuZW5jcnlwdGVkU3RyaW5nIDogbnVsbDtcbiAgICAgICAgICAgICAgICB0aGlzLmlkZW50aXR5LmNpdHkgPSBjaXBoZXIuaWRlbnRpdHkuY2l0eSAhPSBudWxsID8gY2lwaGVyLmlkZW50aXR5LmNpdHkuZW5jcnlwdGVkU3RyaW5nIDogbnVsbDtcbiAgICAgICAgICAgICAgICB0aGlzLmlkZW50aXR5LnN0YXRlID0gY2lwaGVyLmlkZW50aXR5LnN0YXRlICE9IG51bGwgPyBjaXBoZXIuaWRlbnRpdHkuc3RhdGUuZW5jcnlwdGVkU3RyaW5nIDogbnVsbDtcbiAgICAgICAgICAgICAgICB0aGlzLmlkZW50aXR5LnBvc3RhbENvZGUgPSBjaXBoZXIuaWRlbnRpdHkucG9zdGFsQ29kZSAhPSBudWxsID9cbiAgICAgICAgICAgICAgICAgICAgY2lwaGVyLmlkZW50aXR5LnBvc3RhbENvZGUuZW5jcnlwdGVkU3RyaW5nIDogbnVsbDtcbiAgICAgICAgICAgICAgICB0aGlzLmlkZW50aXR5LmNvdW50cnkgPSBjaXBoZXIuaWRlbnRpdHkuY291bnRyeSAhPSBudWxsID9cbiAgICAgICAgICAgICAgICAgICAgY2lwaGVyLmlkZW50aXR5LmNvdW50cnkuZW5jcnlwdGVkU3RyaW5nIDogbnVsbDtcbiAgICAgICAgICAgICAgICB0aGlzLmlkZW50aXR5LmNvbXBhbnkgPSBjaXBoZXIuaWRlbnRpdHkuY29tcGFueSAhPSBudWxsID9cbiAgICAgICAgICAgICAgICAgICAgY2lwaGVyLmlkZW50aXR5LmNvbXBhbnkuZW5jcnlwdGVkU3RyaW5nIDogbnVsbDtcbiAgICAgICAgICAgICAgICB0aGlzLmlkZW50aXR5LmVtYWlsID0gY2lwaGVyLmlkZW50aXR5LmVtYWlsICE9IG51bGwgPyBjaXBoZXIuaWRlbnRpdHkuZW1haWwuZW5jcnlwdGVkU3RyaW5nIDogbnVsbDtcbiAgICAgICAgICAgICAgICB0aGlzLmlkZW50aXR5LnBob25lID0gY2lwaGVyLmlkZW50aXR5LnBob25lICE9IG51bGwgPyBjaXBoZXIuaWRlbnRpdHkucGhvbmUuZW5jcnlwdGVkU3RyaW5nIDogbnVsbDtcbiAgICAgICAgICAgICAgICB0aGlzLmlkZW50aXR5LnNzbiA9IGNpcGhlci5pZGVudGl0eS5zc24gIT0gbnVsbCA/IGNpcGhlci5pZGVudGl0eS5zc24uZW5jcnlwdGVkU3RyaW5nIDogbnVsbDtcbiAgICAgICAgICAgICAgICB0aGlzLmlkZW50aXR5LnVzZXJuYW1lID0gY2lwaGVyLmlkZW50aXR5LnVzZXJuYW1lICE9IG51bGwgP1xuICAgICAgICAgICAgICAgICAgICBjaXBoZXIuaWRlbnRpdHkudXNlcm5hbWUuZW5jcnlwdGVkU3RyaW5nIDogbnVsbDtcbiAgICAgICAgICAgICAgICB0aGlzLmlkZW50aXR5LnBhc3Nwb3J0TnVtYmVyID0gY2lwaGVyLmlkZW50aXR5LnBhc3Nwb3J0TnVtYmVyICE9IG51bGwgP1xuICAgICAgICAgICAgICAgICAgICBjaXBoZXIuaWRlbnRpdHkucGFzc3BvcnROdW1iZXIuZW5jcnlwdGVkU3RyaW5nIDogbnVsbDtcbiAgICAgICAgICAgICAgICB0aGlzLmlkZW50aXR5LmxpY2Vuc2VOdW1iZXIgPSBjaXBoZXIuaWRlbnRpdHkubGljZW5zZU51bWJlciAhPSBudWxsID9cbiAgICAgICAgICAgICAgICAgICAgY2lwaGVyLmlkZW50aXR5LmxpY2Vuc2VOdW1iZXIuZW5jcnlwdGVkU3RyaW5nIDogbnVsbDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2lwaGVyLmZpZWxkcyAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmZpZWxkcyA9IGNpcGhlci5maWVsZHMubWFwKGYgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpZWxkID0gbmV3IEZpZWxkQXBpKCk7XG4gICAgICAgICAgICAgICAgZmllbGQudHlwZSA9IGYudHlwZTtcbiAgICAgICAgICAgICAgICBmaWVsZC5uYW1lID0gZi5uYW1lID8gZi5uYW1lLmVuY3J5cHRlZFN0cmluZyA6IG51bGw7XG4gICAgICAgICAgICAgICAgZmllbGQudmFsdWUgPSBmLnZhbHVlID8gZi52YWx1ZS5lbmNyeXB0ZWRTdHJpbmcgOiBudWxsO1xuICAgICAgICAgICAgICAgIGZpZWxkLmxpbmtlZElkID0gZi5saW5rZWRJZDtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjaXBoZXIucGFzc3dvcmRIaXN0b3J5ICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMucGFzc3dvcmRIaXN0b3J5ID0gW107XG4gICAgICAgICAgICBjaXBoZXIucGFzc3dvcmRIaXN0b3J5LmZvckVhY2gocGggPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucGFzc3dvcmRIaXN0b3J5LnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBsYXN0VXNlZERhdGU6IHBoLmxhc3RVc2VkRGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmQ6IHBoLnBhc3N3b3JkID8gcGgucGFzc3dvcmQuZW5jcnlwdGVkU3RyaW5nIDogbnVsbCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNpcGhlci5hdHRhY2htZW50cyAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmF0dGFjaG1lbnRzID0ge307XG4gICAgICAgICAgICB0aGlzLmF0dGFjaG1lbnRzMiA9IHt9O1xuICAgICAgICAgICAgY2lwaGVyLmF0dGFjaG1lbnRzLmZvckVhY2goYXR0YWNobWVudCA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlsZU5hbWUgPSBhdHRhY2htZW50LmZpbGVOYW1lID8gYXR0YWNobWVudC5maWxlTmFtZS5lbmNyeXB0ZWRTdHJpbmcgOiBudWxsO1xuICAgICAgICAgICAgICAgIHRoaXMuYXR0YWNobWVudHNbYXR0YWNobWVudC5pZF0gPSBmaWxlTmFtZTtcbiAgICAgICAgICAgICAgICBjb25zdCBhdHRhY2htZW50UmVxdWVzdCA9IG5ldyBBdHRhY2htZW50UmVxdWVzdCgpO1xuICAgICAgICAgICAgICAgIGF0dGFjaG1lbnRSZXF1ZXN0LmZpbGVOYW1lID0gZmlsZU5hbWU7XG4gICAgICAgICAgICAgICAgaWYgKGF0dGFjaG1lbnQua2V5ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgYXR0YWNobWVudFJlcXVlc3Qua2V5ID0gYXR0YWNobWVudC5rZXkuZW5jcnlwdGVkU3RyaW5nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmF0dGFjaG1lbnRzMlthdHRhY2htZW50LmlkXSA9IGF0dGFjaG1lbnRSZXF1ZXN0O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgeyBDaXBoZXJSZXF1ZXN0IH0gZnJvbSAnLi9jaXBoZXJSZXF1ZXN0JztcblxuaW1wb3J0IHsgQ2lwaGVyIH0gZnJvbSAnLi4vZG9tYWluL2NpcGhlcic7XG5cbmV4cG9ydCBjbGFzcyBDaXBoZXJTaGFyZVJlcXVlc3Qge1xuICAgIGNpcGhlcjogQ2lwaGVyUmVxdWVzdDtcbiAgICBjb2xsZWN0aW9uSWRzOiBzdHJpbmdbXTtcblxuICAgIGNvbnN0cnVjdG9yKGNpcGhlcjogQ2lwaGVyKSB7XG4gICAgICAgIHRoaXMuY2lwaGVyID0gbmV3IENpcGhlclJlcXVlc3QoY2lwaGVyKTtcbiAgICAgICAgdGhpcy5jb2xsZWN0aW9uSWRzID0gY2lwaGVyLmNvbGxlY3Rpb25JZHM7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgQ2lwaGVyUmVxdWVzdCB9IGZyb20gJy4vY2lwaGVyUmVxdWVzdCc7XG5cbmltcG9ydCB7IENpcGhlciB9IGZyb20gJy4uL2RvbWFpbi9jaXBoZXInO1xuXG5leHBvcnQgY2xhc3MgQ2lwaGVyV2l0aElkUmVxdWVzdCBleHRlbmRzIENpcGhlclJlcXVlc3Qge1xuICAgIGlkOiBzdHJpbmc7XG5cbiAgICBjb25zdHJ1Y3RvcihjaXBoZXI6IENpcGhlcikge1xuICAgICAgICBzdXBlcihjaXBoZXIpO1xuICAgICAgICB0aGlzLmlkID0gY2lwaGVyLmlkO1xuICAgIH1cbn1cbiIsImV4cG9ydCBjbGFzcyBDcnlwdG9BZ2VudFVzZXJLZXlSZXF1ZXN0IHtcbiAgICBrZXk6IHN0cmluZztcblxuICAgIGNvbnN0cnVjdG9yKGtleTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMua2V5ID0ga2V5O1xuICAgIH1cbn1cbiIsImltcG9ydCB7IERldmljZVR5cGUgfSBmcm9tICcuLi8uLi9lbnVtcy9kZXZpY2VUeXBlJztcblxuaW1wb3J0IHsgUGxhdGZvcm1VdGlsc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9hYnN0cmFjdGlvbnMvcGxhdGZvcm1VdGlscy5zZXJ2aWNlJztcblxuZXhwb3J0IGNsYXNzIERldmljZVJlcXVlc3Qge1xuICAgIHR5cGU6IERldmljZVR5cGU7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGlkZW50aWZpZXI6IHN0cmluZztcbiAgICBwdXNoVG9rZW4/OiBzdHJpbmc7XG5cbiAgICBjb25zdHJ1Y3RvcihhcHBJZDogc3RyaW5nLCBwbGF0Zm9ybVV0aWxzU2VydmljZTogUGxhdGZvcm1VdGlsc1NlcnZpY2UpIHtcbiAgICAgICAgdGhpcy50eXBlID0gcGxhdGZvcm1VdGlsc1NlcnZpY2UuZ2V0RGV2aWNlKCk7XG4gICAgICAgIHRoaXMubmFtZSA9IHBsYXRmb3JtVXRpbHNTZXJ2aWNlLmdldERldmljZVN0cmluZygpO1xuICAgICAgICB0aGlzLmlkZW50aWZpZXIgPSBhcHBJZDtcbiAgICAgICAgdGhpcy5wdXNoVG9rZW4gPSBudWxsO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IEV2ZW50VHlwZSB9IGZyb20gJy4uLy4uL2VudW1zL2V2ZW50VHlwZSc7XG5cbmV4cG9ydCBjbGFzcyBFdmVudFJlcXVlc3Qge1xuICAgIHR5cGU6IEV2ZW50VHlwZTtcbiAgICBjaXBoZXJJZDogc3RyaW5nO1xuICAgIGRhdGU6IHN0cmluZztcbn1cbiIsImltcG9ydCB7IEZvbGRlciB9IGZyb20gJy4uL2RvbWFpbi9mb2xkZXInO1xuXG5leHBvcnQgY2xhc3MgRm9sZGVyUmVxdWVzdCB7XG4gICAgbmFtZTogc3RyaW5nO1xuXG4gICAgY29uc3RydWN0b3IoZm9sZGVyOiBGb2xkZXIpIHtcbiAgICAgICAgdGhpcy5uYW1lID0gZm9sZGVyLm5hbWUgPyBmb2xkZXIubmFtZS5lbmNyeXB0ZWRTdHJpbmcgOiBudWxsO1xuICAgIH1cbn1cbiIsImV4cG9ydCBjbGFzcyBLZXlzUmVxdWVzdCB7XG4gICAgcHVibGljS2V5OiBzdHJpbmc7XG4gICAgZW5jcnlwdGVkUHJpdmF0ZUtleTogc3RyaW5nO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljS2V5OiBzdHJpbmcsIGVuY3J5cHRlZFByaXZhdGVLZXk6IHN0cmluZykge1xuICAgICAgICB0aGlzLnB1YmxpY0tleSA9IHB1YmxpY0tleTtcbiAgICAgICAgdGhpcy5lbmNyeXB0ZWRQcml2YXRlS2V5ID0gZW5jcnlwdGVkUHJpdmF0ZUtleTtcbiAgICB9XG59XG4iLCJleHBvcnQgY2xhc3MgUHJlbG9naW5SZXF1ZXN0IHtcbiAgICBlbWFpbDogc3RyaW5nO1xuXG4gICAgY29uc3RydWN0b3IoZW1haWw6IHN0cmluZykge1xuICAgICAgICB0aGlzLmVtYWlsID0gZW1haWw7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgU2VuZFR5cGUgfSBmcm9tICcuLi8uLi9lbnVtcy9zZW5kVHlwZSc7XG5cbmltcG9ydCB7IFNlbmRGaWxlQXBpIH0gZnJvbSAnLi4vYXBpL3NlbmRGaWxlQXBpJztcbmltcG9ydCB7IFNlbmRUZXh0QXBpIH0gZnJvbSAnLi4vYXBpL3NlbmRUZXh0QXBpJztcblxuaW1wb3J0IHsgU2VuZCB9IGZyb20gJy4uL2RvbWFpbi9zZW5kJztcblxuZXhwb3J0IGNsYXNzIFNlbmRSZXF1ZXN0IHtcbiAgICB0eXBlOiBTZW5kVHlwZTtcbiAgICBmaWxlTGVuZ3RoPzogbnVtYmVyO1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBub3Rlczogc3RyaW5nO1xuICAgIGtleTogc3RyaW5nO1xuICAgIG1heEFjY2Vzc0NvdW50PzogbnVtYmVyO1xuICAgIGV4cGlyYXRpb25EYXRlOiBzdHJpbmc7XG4gICAgZGVsZXRpb25EYXRlOiBzdHJpbmc7XG4gICAgdGV4dDogU2VuZFRleHRBcGk7XG4gICAgZmlsZTogU2VuZEZpbGVBcGk7XG4gICAgcGFzc3dvcmQ6IHN0cmluZztcbiAgICBkaXNhYmxlZDogYm9vbGVhbjtcbiAgICBoaWRlRW1haWw6IGJvb2xlYW47XG5cbiAgICBjb25zdHJ1Y3RvcihzZW5kOiBTZW5kLCBmaWxlTGVuZ3RoPzogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMudHlwZSA9IHNlbmQudHlwZTtcbiAgICAgICAgdGhpcy5maWxlTGVuZ3RoID0gZmlsZUxlbmd0aDtcbiAgICAgICAgdGhpcy5uYW1lID0gc2VuZC5uYW1lID8gc2VuZC5uYW1lLmVuY3J5cHRlZFN0cmluZyA6IG51bGw7XG4gICAgICAgIHRoaXMubm90ZXMgPSBzZW5kLm5vdGVzID8gc2VuZC5ub3Rlcy5lbmNyeXB0ZWRTdHJpbmcgOiBudWxsO1xuICAgICAgICB0aGlzLm1heEFjY2Vzc0NvdW50ID0gc2VuZC5tYXhBY2Nlc3NDb3VudDtcbiAgICAgICAgdGhpcy5leHBpcmF0aW9uRGF0ZSA9IHNlbmQuZXhwaXJhdGlvbkRhdGUgIT0gbnVsbCA/IHNlbmQuZXhwaXJhdGlvbkRhdGUudG9JU09TdHJpbmcoKSA6IG51bGw7XG4gICAgICAgIHRoaXMuZGVsZXRpb25EYXRlID0gc2VuZC5kZWxldGlvbkRhdGUgIT0gbnVsbCA/IHNlbmQuZGVsZXRpb25EYXRlLnRvSVNPU3RyaW5nKCkgOiBudWxsO1xuICAgICAgICB0aGlzLmtleSA9IHNlbmQua2V5ICE9IG51bGwgPyBzZW5kLmtleS5lbmNyeXB0ZWRTdHJpbmcgOiBudWxsO1xuICAgICAgICB0aGlzLnBhc3N3b3JkID0gc2VuZC5wYXNzd29yZDtcbiAgICAgICAgdGhpcy5kaXNhYmxlZCA9IHNlbmQuZGlzYWJsZWQ7XG4gICAgICAgIHRoaXMuaGlkZUVtYWlsID0gc2VuZC5oaWRlRW1haWw7XG5cbiAgICAgICAgc3dpdGNoICh0aGlzLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgU2VuZFR5cGUuVGV4dDpcbiAgICAgICAgICAgICAgICB0aGlzLnRleHQgPSBuZXcgU2VuZFRleHRBcGkoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnRleHQudGV4dCA9IHNlbmQudGV4dC50ZXh0ICE9IG51bGwgPyBzZW5kLnRleHQudGV4dC5lbmNyeXB0ZWRTdHJpbmcgOiBudWxsO1xuICAgICAgICAgICAgICAgIHRoaXMudGV4dC5oaWRkZW4gPSBzZW5kLnRleHQuaGlkZGVuO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBTZW5kVHlwZS5GaWxlOlxuICAgICAgICAgICAgICAgIHRoaXMuZmlsZSA9IG5ldyBTZW5kRmlsZUFwaSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsZS5maWxlTmFtZSA9IHNlbmQuZmlsZS5maWxlTmFtZSAhPSBudWxsID8gc2VuZC5maWxlLmZpbGVOYW1lLmVuY3J5cHRlZFN0cmluZyA6IG51bGw7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgVHdvRmFjdG9yUHJvdmlkZXJUeXBlIH0gZnJvbSAnLi4vLi4vZW51bXMvdHdvRmFjdG9yUHJvdmlkZXJUeXBlJztcblxuaW1wb3J0IHsgQ2FwdGNoYVByb3RlY3RlZFJlcXVlc3QgfSBmcm9tICcuL2NhcHRjaGFQcm90ZWN0ZWRSZXF1ZXN0JztcbmltcG9ydCB7IERldmljZVJlcXVlc3QgfSBmcm9tICcuL2RldmljZVJlcXVlc3QnO1xuXG5pbXBvcnQgeyBVdGlscyB9IGZyb20gJy4uLy4uL21pc2MvdXRpbHMnO1xuXG5leHBvcnQgY2xhc3MgVG9rZW5SZXF1ZXN0IGltcGxlbWVudHMgQ2FwdGNoYVByb3RlY3RlZFJlcXVlc3Qge1xuICAgIGVtYWlsOiBzdHJpbmc7XG4gICAgbWFzdGVyUGFzc3dvcmRIYXNoOiBzdHJpbmc7XG4gICAgY29kZTogc3RyaW5nO1xuICAgIGNvZGVWZXJpZmllcjogc3RyaW5nO1xuICAgIHJlZGlyZWN0VXJpOiBzdHJpbmc7XG4gICAgY2xpZW50SWQ6IHN0cmluZztcbiAgICBjbGllbnRTZWNyZXQ6IHN0cmluZztcbiAgICBkZXZpY2U/OiBEZXZpY2VSZXF1ZXN0O1xuXG4gICAgY29uc3RydWN0b3IoY3JlZGVudGlhbHM6IHN0cmluZ1tdLCBjb2Rlczogc3RyaW5nW10sIGNsaWVudElkQ2xpZW50U2VjcmV0OiBzdHJpbmdbXSwgcHVibGljIHByb3ZpZGVyOiBUd29GYWN0b3JQcm92aWRlclR5cGUsXG4gICAgICAgIHB1YmxpYyB0b2tlbjogc3RyaW5nLCBwdWJsaWMgcmVtZW1iZXI6IGJvb2xlYW4sIHB1YmxpYyBjYXB0Y2hhUmVzcG9uc2U6IHN0cmluZywgZGV2aWNlPzogRGV2aWNlUmVxdWVzdCkge1xuICAgICAgICBpZiAoY3JlZGVudGlhbHMgIT0gbnVsbCAmJiBjcmVkZW50aWFscy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICB0aGlzLmVtYWlsID0gY3JlZGVudGlhbHNbMF07XG4gICAgICAgICAgICB0aGlzLm1hc3RlclBhc3N3b3JkSGFzaCA9IGNyZWRlbnRpYWxzWzFdO1xuICAgICAgICB9IGVsc2UgaWYgKGNvZGVzICE9IG51bGwgJiYgY29kZXMubGVuZ3RoID4gMikge1xuICAgICAgICAgICAgdGhpcy5jb2RlID0gY29kZXNbMF07XG4gICAgICAgICAgICB0aGlzLmNvZGVWZXJpZmllciA9IGNvZGVzWzFdO1xuICAgICAgICAgICAgdGhpcy5yZWRpcmVjdFVyaSA9IGNvZGVzWzJdO1xuICAgICAgICB9IGVsc2UgaWYgKGNsaWVudElkQ2xpZW50U2VjcmV0ICE9IG51bGwgJiYgY2xpZW50SWRDbGllbnRTZWNyZXQubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgdGhpcy5jbGllbnRJZCA9IGNsaWVudElkQ2xpZW50U2VjcmV0WzBdO1xuICAgICAgICAgICAgdGhpcy5jbGllbnRTZWNyZXQgPSBjbGllbnRJZENsaWVudFNlY3JldFsxXTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRldmljZSA9IGRldmljZSAhPSBudWxsID8gZGV2aWNlIDogbnVsbDtcbiAgICB9XG5cbiAgICB0b0lkZW50aXR5VG9rZW4oY2xpZW50SWQ6IHN0cmluZykge1xuICAgICAgICBjb25zdCBvYmo6IGFueSA9IHtcbiAgICAgICAgICAgIHNjb3BlOiAnYXBpIG9mZmxpbmVfYWNjZXNzJyxcbiAgICAgICAgICAgIGNsaWVudF9pZDogY2xpZW50SWQsXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHRoaXMuY2xpZW50U2VjcmV0ICE9IG51bGwpIHtcbiAgICAgICAgICAgIG9iai5zY29wZSA9IGNsaWVudElkLnN0YXJ0c1dpdGgoJ29yZ2FuaXphdGlvbicpID8gJ2FwaS5vcmdhbml6YXRpb24nIDogJ2FwaSc7XG4gICAgICAgICAgICBvYmouZ3JhbnRfdHlwZSA9ICdjbGllbnRfY3JlZGVudGlhbHMnO1xuICAgICAgICAgICAgb2JqLmNsaWVudF9zZWNyZXQgPSB0aGlzLmNsaWVudFNlY3JldDtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLm1hc3RlclBhc3N3b3JkSGFzaCAhPSBudWxsICYmIHRoaXMuZW1haWwgIT0gbnVsbCkge1xuICAgICAgICAgICAgb2JqLmdyYW50X3R5cGUgPSAncGFzc3dvcmQnO1xuICAgICAgICAgICAgb2JqLnVzZXJuYW1lID0gdGhpcy5lbWFpbDtcbiAgICAgICAgICAgIG9iai5wYXNzd29yZCA9IHRoaXMubWFzdGVyUGFzc3dvcmRIYXNoO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY29kZSAhPSBudWxsICYmIHRoaXMuY29kZVZlcmlmaWVyICE9IG51bGwgJiYgdGhpcy5yZWRpcmVjdFVyaSAhPSBudWxsKSB7XG4gICAgICAgICAgICBvYmouZ3JhbnRfdHlwZSA9ICdhdXRob3JpemF0aW9uX2NvZGUnO1xuICAgICAgICAgICAgb2JqLmNvZGUgPSB0aGlzLmNvZGU7XG4gICAgICAgICAgICBvYmouY29kZV92ZXJpZmllciA9IHRoaXMuY29kZVZlcmlmaWVyO1xuICAgICAgICAgICAgb2JqLnJlZGlyZWN0X3VyaSA9IHRoaXMucmVkaXJlY3RVcmk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ211c3QgcHJvdmlkZSBjcmVkZW50aWFscyBvciBjb2RlcycpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuZGV2aWNlKSB7XG4gICAgICAgICAgICBvYmouZGV2aWNlVHlwZSA9IHRoaXMuZGV2aWNlLnR5cGU7XG4gICAgICAgICAgICBvYmouZGV2aWNlSWRlbnRpZmllciA9IHRoaXMuZGV2aWNlLmlkZW50aWZpZXI7XG4gICAgICAgICAgICBvYmouZGV2aWNlTmFtZSA9IHRoaXMuZGV2aWNlLm5hbWU7XG4gICAgICAgICAgICAvLyBubyBwdXNoIHRva2VucyBmb3IgYnJvd3NlciBhcHBzIHlldFxuICAgICAgICAgICAgLy8gb2JqLmRldmljZVB1c2hUb2tlbiA9IHRoaXMuZGV2aWNlLnB1c2hUb2tlbjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnRva2VuICYmIHRoaXMucHJvdmlkZXIgIT0gbnVsbCkge1xuICAgICAgICAgICAgb2JqLnR3b0ZhY3RvclRva2VuID0gdGhpcy50b2tlbjtcbiAgICAgICAgICAgIG9iai50d29GYWN0b3JQcm92aWRlciA9IHRoaXMucHJvdmlkZXI7XG4gICAgICAgICAgICBvYmoudHdvRmFjdG9yUmVtZW1iZXIgPSB0aGlzLnJlbWVtYmVyID8gJzEnIDogJzAnO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuY2FwdGNoYVJlc3BvbnNlICE9IG51bGwpIHtcbiAgICAgICAgICAgIG9iai5jYXB0Y2hhUmVzcG9uc2UgPSB0aGlzLmNhcHRjaGFSZXNwb25zZTtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgcmV0dXJuIG9iajtcbiAgICB9XG5cbiAgICBhbHRlcklkZW50aXR5VG9rZW5IZWFkZXJzKGhlYWRlcnM6IEhlYWRlcnMpIHtcbiAgICAgICAgaWYgKHRoaXMuY2xpZW50U2VjcmV0ID09IG51bGwgJiYgdGhpcy5tYXN0ZXJQYXNzd29yZEhhc2ggIT0gbnVsbCAmJiB0aGlzLmVtYWlsICE9IG51bGwpIHtcbiAgICAgICAgICAgIGhlYWRlcnMuc2V0KCdBdXRoLUVtYWlsJywgVXRpbHMuZnJvbVV0ZjhUb1VybEI2NCh0aGlzLmVtYWlsKSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgeyBCYXNlUmVzcG9uc2UgfSBmcm9tICcuL2Jhc2VSZXNwb25zZSc7XG5cbmV4cG9ydCBjbGFzcyBBcGlLZXlSZXNwb25zZSBleHRlbmRzIEJhc2VSZXNwb25zZSB7XG4gICAgYXBpS2V5OiBzdHJpbmc7XG5cbiAgICBjb25zdHJ1Y3RvcihyZXNwb25zZTogYW55KSB7XG4gICAgICAgIHN1cGVyKHJlc3BvbnNlKTtcbiAgICAgICAgdGhpcy5hcGlLZXkgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ0FwaUtleScpO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IEJhc2VSZXNwb25zZSB9IGZyb20gJy4vYmFzZVJlc3BvbnNlJztcblxuZXhwb3J0IGNsYXNzIEF0dGFjaG1lbnRSZXNwb25zZSBleHRlbmRzIEJhc2VSZXNwb25zZSB7XG4gICAgaWQ6IHN0cmluZztcbiAgICB1cmw6IHN0cmluZztcbiAgICBmaWxlTmFtZTogc3RyaW5nO1xuICAgIGtleTogc3RyaW5nO1xuICAgIHNpemU6IHN0cmluZztcbiAgICBzaXplTmFtZTogc3RyaW5nO1xuXG4gICAgY29uc3RydWN0b3IocmVzcG9uc2U6IGFueSkge1xuICAgICAgICBzdXBlcihyZXNwb25zZSk7XG4gICAgICAgIHRoaXMuaWQgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ0lkJyk7XG4gICAgICAgIHRoaXMudXJsID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdVcmwnKTtcbiAgICAgICAgdGhpcy5maWxlTmFtZSA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnRmlsZU5hbWUnKTtcbiAgICAgICAgdGhpcy5rZXkgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ0tleScpO1xuICAgICAgICB0aGlzLnNpemUgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ1NpemUnKTtcbiAgICAgICAgdGhpcy5zaXplTmFtZSA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnU2l6ZU5hbWUnKTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBGaWxlVXBsb2FkVHlwZSB9IGZyb20gJy4uLy4uL2VudW1zL2ZpbGVVcGxvYWRUeXBlJztcbmltcG9ydCB7IEJhc2VSZXNwb25zZSB9IGZyb20gJy4vYmFzZVJlc3BvbnNlJztcbmltcG9ydCB7IENpcGhlclJlc3BvbnNlIH0gZnJvbSAnLi9jaXBoZXJSZXNwb25zZSc7XG5cbmV4cG9ydCBjbGFzcyBBdHRhY2htZW50VXBsb2FkRGF0YVJlc3BvbnNlIGV4dGVuZHMgQmFzZVJlc3BvbnNlIHtcbiAgICBhdHRhY2htZW50SWQ6IHN0cmluZztcbiAgICBmaWxlVXBsb2FkVHlwZTogRmlsZVVwbG9hZFR5cGU7XG4gICAgY2lwaGVyUmVzcG9uc2U6IENpcGhlclJlc3BvbnNlO1xuICAgIGNpcGhlck1pbmlSZXNwb25zZTogQ2lwaGVyUmVzcG9uc2U7XG4gICAgdXJsOiBzdHJpbmcgPSBudWxsO1xuICAgIGNvbnN0cnVjdG9yKHJlc3BvbnNlOiBhbnkpIHtcbiAgICAgICAgc3VwZXIocmVzcG9uc2UpO1xuICAgICAgICB0aGlzLmF0dGFjaG1lbnRJZCA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnQXR0YWNobWVudElkJyk7XG4gICAgICAgIHRoaXMuZmlsZVVwbG9hZFR5cGUgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ0ZpbGVVcGxvYWRUeXBlJyk7XG4gICAgICAgIGNvbnN0IGNpcGhlclJlc3BvbnNlID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdDaXBoZXJSZXNwb25zZScpO1xuICAgICAgICBjb25zdCBjaXBoZXJNaW5pUmVzcG9uc2UgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ0NpcGhlck1pbmlSZXNwb25zZScpO1xuICAgICAgICB0aGlzLmNpcGhlclJlc3BvbnNlID0gY2lwaGVyUmVzcG9uc2UgPT0gbnVsbCA/IG51bGwgOiBuZXcgQ2lwaGVyUmVzcG9uc2UoY2lwaGVyUmVzcG9uc2UpO1xuICAgICAgICB0aGlzLmNpcGhlck1pbmlSZXNwb25zZSA9IGNpcGhlck1pbmlSZXNwb25zZSA9PSBudWxsID8gbnVsbCA6IG5ldyBDaXBoZXJSZXNwb25zZShjaXBoZXJNaW5pUmVzcG9uc2UpO1xuICAgICAgICB0aGlzLnVybCA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnVXJsJyk7XG4gICAgfVxuXG59XG4iLCJleHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZVJlc3BvbnNlIHtcbiAgICBwcml2YXRlIHJlc3BvbnNlOiBhbnk7XG5cbiAgICBjb25zdHJ1Y3RvcihyZXNwb25zZTogYW55KSB7XG4gICAgICAgIHRoaXMucmVzcG9uc2UgPSByZXNwb25zZTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZ2V0UmVzcG9uc2VQcm9wZXJ0eShwcm9wZXJ0eU5hbWU6IHN0cmluZywgcmVzcG9uc2U6IGFueSA9IG51bGwsIGV4YWN0TmFtZSA9IGZhbHNlKTogYW55IHtcbiAgICAgICAgaWYgKHByb3BlcnR5TmFtZSA9PSBudWxsIHx8IHByb3BlcnR5TmFtZSA9PT0gJycpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigncHJvcGVydHlOYW1lIG11c3Qgbm90IGJlIG51bGwvZW1wdHkuJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc3BvbnNlID09IG51bGwgJiYgdGhpcy5yZXNwb25zZSAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXNwb25zZSA9IHRoaXMucmVzcG9uc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc3BvbnNlID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZXhhY3ROYW1lICYmIHJlc3BvbnNlW3Byb3BlcnR5TmFtZV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbGV0IG90aGVyQ2FzZVByb3BlcnR5TmFtZTogc3RyaW5nID0gbnVsbDtcbiAgICAgICAgICAgIGlmIChwcm9wZXJ0eU5hbWUuY2hhckF0KDApID09PSBwcm9wZXJ0eU5hbWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkpIHtcbiAgICAgICAgICAgICAgICBvdGhlckNhc2VQcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eU5hbWUuY2hhckF0KDApLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG90aGVyQ2FzZVByb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwcm9wZXJ0eU5hbWUubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgIG90aGVyQ2FzZVByb3BlcnR5TmFtZSArPSBwcm9wZXJ0eU5hbWUuc2xpY2UoMSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHByb3BlcnR5TmFtZSA9IG90aGVyQ2FzZVByb3BlcnR5TmFtZTtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZVtwcm9wZXJ0eU5hbWVdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyZXNwb25zZVtwcm9wZXJ0eU5hbWVdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eU5hbWUudG9VcHBlckNhc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzcG9uc2VbcHJvcGVydHlOYW1lXTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBCYXNlUmVzcG9uc2UgfSBmcm9tICcuL2Jhc2VSZXNwb25zZSc7XG5cbmltcG9ydCB7IFBheW1lbnRNZXRob2RUeXBlIH0gZnJvbSAnLi4vLi4vZW51bXMvcGF5bWVudE1ldGhvZFR5cGUnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25UeXBlIH0gZnJvbSAnLi4vLi4vZW51bXMvdHJhbnNhY3Rpb25UeXBlJztcblxuZXhwb3J0IGNsYXNzIEJpbGxpbmdSZXNwb25zZSBleHRlbmRzIEJhc2VSZXNwb25zZSB7XG4gICAgYmFsYW5jZTogbnVtYmVyO1xuICAgIHBheW1lbnRTb3VyY2U6IEJpbGxpbmdTb3VyY2VSZXNwb25zZTtcbiAgICBpbnZvaWNlczogQmlsbGluZ0ludm9pY2VSZXNwb25zZVtdID0gW107XG4gICAgdHJhbnNhY3Rpb25zOiBCaWxsaW5nVHJhbnNhY3Rpb25SZXNwb25zZVtdID0gW107XG5cbiAgICBjb25zdHJ1Y3RvcihyZXNwb25zZTogYW55KSB7XG4gICAgICAgIHN1cGVyKHJlc3BvbnNlKTtcbiAgICAgICAgdGhpcy5iYWxhbmNlID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdCYWxhbmNlJyk7XG4gICAgICAgIGNvbnN0IHBheW1lbnRTb3VyY2UgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ1BheW1lbnRTb3VyY2UnKTtcbiAgICAgICAgY29uc3QgdHJhbnNhY3Rpb25zID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdUcmFuc2FjdGlvbnMnKTtcbiAgICAgICAgY29uc3QgaW52b2ljZXMgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ0ludm9pY2VzJyk7XG4gICAgICAgIHRoaXMucGF5bWVudFNvdXJjZSA9IHBheW1lbnRTb3VyY2UgPT0gbnVsbCA/IG51bGwgOiBuZXcgQmlsbGluZ1NvdXJjZVJlc3BvbnNlKHBheW1lbnRTb3VyY2UpO1xuICAgICAgICBpZiAodHJhbnNhY3Rpb25zICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMudHJhbnNhY3Rpb25zID0gdHJhbnNhY3Rpb25zLm1hcCgodDogYW55KSA9PiBuZXcgQmlsbGluZ1RyYW5zYWN0aW9uUmVzcG9uc2UodCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpbnZvaWNlcyAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmludm9pY2VzID0gaW52b2ljZXMubWFwKChpOiBhbnkpID0+IG5ldyBCaWxsaW5nSW52b2ljZVJlc3BvbnNlKGkpKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEJpbGxpbmdTb3VyY2VSZXNwb25zZSBleHRlbmRzIEJhc2VSZXNwb25zZSB7XG4gICAgdHlwZTogUGF5bWVudE1ldGhvZFR5cGU7XG4gICAgY2FyZEJyYW5kOiBzdHJpbmc7XG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICBuZWVkc1ZlcmlmaWNhdGlvbjogYm9vbGVhbjtcblxuICAgIGNvbnN0cnVjdG9yKHJlc3BvbnNlOiBhbnkpIHtcbiAgICAgICAgc3VwZXIocmVzcG9uc2UpO1xuICAgICAgICB0aGlzLnR5cGUgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ1R5cGUnKTtcbiAgICAgICAgdGhpcy5jYXJkQnJhbmQgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ0NhcmRCcmFuZCcpO1xuICAgICAgICB0aGlzLmRlc2NyaXB0aW9uID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdEZXNjcmlwdGlvbicpO1xuICAgICAgICB0aGlzLm5lZWRzVmVyaWZpY2F0aW9uID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdOZWVkc1ZlcmlmaWNhdGlvbicpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEJpbGxpbmdJbnZvaWNlUmVzcG9uc2UgZXh0ZW5kcyBCYXNlUmVzcG9uc2Uge1xuICAgIHVybDogc3RyaW5nO1xuICAgIHBkZlVybDogc3RyaW5nO1xuICAgIG51bWJlcjogc3RyaW5nO1xuICAgIHBhaWQ6IGJvb2xlYW47XG4gICAgZGF0ZTogc3RyaW5nO1xuICAgIGFtb3VudDogbnVtYmVyO1xuXG4gICAgY29uc3RydWN0b3IocmVzcG9uc2U6IGFueSkge1xuICAgICAgICBzdXBlcihyZXNwb25zZSk7XG4gICAgICAgIHRoaXMudXJsID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdVcmwnKTtcbiAgICAgICAgdGhpcy5wZGZVcmwgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ1BkZlVybCcpO1xuICAgICAgICB0aGlzLm51bWJlciA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnTnVtYmVyJyk7XG4gICAgICAgIHRoaXMucGFpZCA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnUGFpZCcpO1xuICAgICAgICB0aGlzLmRhdGUgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ0RhdGUnKTtcbiAgICAgICAgdGhpcy5hbW91bnQgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ0Ftb3VudCcpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEJpbGxpbmdUcmFuc2FjdGlvblJlc3BvbnNlIGV4dGVuZHMgQmFzZVJlc3BvbnNlIHtcbiAgICBjcmVhdGVkRGF0ZTogc3RyaW5nO1xuICAgIGFtb3VudDogbnVtYmVyO1xuICAgIHJlZnVuZGVkOiBib29sZWFuO1xuICAgIHBhcnRpYWxseVJlZnVuZGVkOiBib29sZWFuO1xuICAgIHJlZnVuZGVkQW1vdW50OiBudW1iZXI7XG4gICAgdHlwZTogVHJhbnNhY3Rpb25UeXBlO1xuICAgIHBheW1lbnRNZXRob2RUeXBlOiBQYXltZW50TWV0aG9kVHlwZTtcbiAgICBkZXRhaWxzOiBzdHJpbmc7XG5cbiAgICBjb25zdHJ1Y3RvcihyZXNwb25zZTogYW55KSB7XG4gICAgICAgIHN1cGVyKHJlc3BvbnNlKTtcbiAgICAgICAgdGhpcy5jcmVhdGVkRGF0ZSA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnQ3JlYXRlZERhdGUnKTtcbiAgICAgICAgdGhpcy5hbW91bnQgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ0Ftb3VudCcpO1xuICAgICAgICB0aGlzLnJlZnVuZGVkID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdSZWZ1bmRlZCcpO1xuICAgICAgICB0aGlzLnBhcnRpYWxseVJlZnVuZGVkID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdQYXJ0aWFsbHlSZWZ1bmRlZCcpO1xuICAgICAgICB0aGlzLnJlZnVuZGVkQW1vdW50ID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdSZWZ1bmRlZEFtb3VudCcpO1xuICAgICAgICB0aGlzLnR5cGUgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ1R5cGUnKTtcbiAgICAgICAgdGhpcy5wYXltZW50TWV0aG9kVHlwZSA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnUGF5bWVudE1ldGhvZFR5cGUnKTtcbiAgICAgICAgdGhpcy5kZXRhaWxzID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdEZXRhaWxzJyk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgQmFzZVJlc3BvbnNlIH0gZnJvbSAnLi9iYXNlUmVzcG9uc2UnO1xuXG5leHBvcnQgY2xhc3MgQnJlYWNoQWNjb3VudFJlc3BvbnNlIGV4dGVuZHMgQmFzZVJlc3BvbnNlIHtcbiAgICBhZGRlZERhdGU6IHN0cmluZztcbiAgICBicmVhY2hEYXRlOiBzdHJpbmc7XG4gICAgZGF0YUNsYXNzZXM6IHN0cmluZ1tdO1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgZG9tYWluOiBzdHJpbmc7XG4gICAgaXNBY3RpdmU6IGJvb2xlYW47XG4gICAgaXNWZXJpZmllZDogYm9vbGVhbjtcbiAgICBsb2dvUGF0aDogc3RyaW5nO1xuICAgIG1vZGlmaWVkRGF0ZTogc3RyaW5nO1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBwd25Db3VudDogbnVtYmVyO1xuICAgIHRpdGxlOiBzdHJpbmc7XG5cbiAgICBjb25zdHJ1Y3RvcihyZXNwb25zZTogYW55KSB7XG4gICAgICAgIHN1cGVyKHJlc3BvbnNlKTtcbiAgICAgICAgdGhpcy5hZGRlZERhdGUgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ0FkZGVkRGF0ZScpO1xuICAgICAgICB0aGlzLmJyZWFjaERhdGUgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ0JyZWFjaERhdGUnKTtcbiAgICAgICAgdGhpcy5kYXRhQ2xhc3NlcyA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnRGF0YUNsYXNzZXMnKTtcbiAgICAgICAgdGhpcy5kZXNjcmlwdGlvbiA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnRGVzY3JpcHRpb24nKTtcbiAgICAgICAgdGhpcy5kb21haW4gPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ0RvbWFpbicpO1xuICAgICAgICB0aGlzLmlzQWN0aXZlID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdJc0FjdGl2ZScpO1xuICAgICAgICB0aGlzLmlzVmVyaWZpZWQgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ0lzVmVyaWZpZWQnKTtcbiAgICAgICAgdGhpcy5sb2dvUGF0aCA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnTG9nb1BhdGgnKTtcbiAgICAgICAgdGhpcy5tb2RpZmllZERhdGUgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ01vZGlmaWVkRGF0ZScpO1xuICAgICAgICB0aGlzLm5hbWUgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ05hbWUnKTtcbiAgICAgICAgdGhpcy5wd25Db3VudCA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnUHduQ291bnQnKTtcbiAgICAgICAgdGhpcy50aXRsZSA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnVGl0bGUnKTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBBdHRhY2htZW50UmVzcG9uc2UgfSBmcm9tICcuL2F0dGFjaG1lbnRSZXNwb25zZSc7XG5pbXBvcnQgeyBCYXNlUmVzcG9uc2UgfSBmcm9tICcuL2Jhc2VSZXNwb25zZSc7XG5pbXBvcnQgeyBQYXNzd29yZEhpc3RvcnlSZXNwb25zZSB9IGZyb20gJy4vcGFzc3dvcmRIaXN0b3J5UmVzcG9uc2UnO1xuXG5pbXBvcnQgeyBDaXBoZXJSZXByb21wdFR5cGUgfSBmcm9tICcuLi8uLi9lbnVtcy9jaXBoZXJSZXByb21wdFR5cGUnO1xuaW1wb3J0IHsgQ2FyZEFwaSB9IGZyb20gJy4uL2FwaS9jYXJkQXBpJztcbmltcG9ydCB7IEZpZWxkQXBpIH0gZnJvbSAnLi4vYXBpL2ZpZWxkQXBpJztcbmltcG9ydCB7IElkZW50aXR5QXBpIH0gZnJvbSAnLi4vYXBpL2lkZW50aXR5QXBpJztcbmltcG9ydCB7IExvZ2luQXBpIH0gZnJvbSAnLi4vYXBpL2xvZ2luQXBpJztcbmltcG9ydCB7IFNlY3VyZU5vdGVBcGkgfSBmcm9tICcuLi9hcGkvc2VjdXJlTm90ZUFwaSc7XG5cbmV4cG9ydCBjbGFzcyBDaXBoZXJSZXNwb25zZSBleHRlbmRzIEJhc2VSZXNwb25zZSB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBvcmdhbml6YXRpb25JZDogc3RyaW5nO1xuICAgIGZvbGRlcklkOiBzdHJpbmc7XG4gICAgdHlwZTogbnVtYmVyO1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBub3Rlczogc3RyaW5nO1xuICAgIGZpZWxkczogRmllbGRBcGlbXTtcbiAgICBsb2dpbjogTG9naW5BcGk7XG4gICAgY2FyZDogQ2FyZEFwaTtcbiAgICBpZGVudGl0eTogSWRlbnRpdHlBcGk7XG4gICAgc2VjdXJlTm90ZTogU2VjdXJlTm90ZUFwaTtcbiAgICBmYXZvcml0ZTogYm9vbGVhbjtcbiAgICBlZGl0OiBib29sZWFuO1xuICAgIHZpZXdQYXNzd29yZDogYm9vbGVhbjtcbiAgICBvcmdhbml6YXRpb25Vc2VUb3RwOiBib29sZWFuO1xuICAgIHJldmlzaW9uRGF0ZTogc3RyaW5nO1xuICAgIGF0dGFjaG1lbnRzOiBBdHRhY2htZW50UmVzcG9uc2VbXTtcbiAgICBwYXNzd29yZEhpc3Rvcnk6IFBhc3N3b3JkSGlzdG9yeVJlc3BvbnNlW107XG4gICAgY29sbGVjdGlvbklkczogc3RyaW5nW107XG4gICAgZGVsZXRlZERhdGU6IHN0cmluZztcbiAgICByZXByb21wdDogQ2lwaGVyUmVwcm9tcHRUeXBlO1xuXG4gICAgY29uc3RydWN0b3IocmVzcG9uc2U6IGFueSkge1xuICAgICAgICBzdXBlcihyZXNwb25zZSk7XG4gICAgICAgIHRoaXMuaWQgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ0lkJyk7XG4gICAgICAgIHRoaXMub3JnYW5pemF0aW9uSWQgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ09yZ2FuaXphdGlvbklkJyk7XG4gICAgICAgIHRoaXMuZm9sZGVySWQgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ0ZvbGRlcklkJykgfHwgbnVsbDtcbiAgICAgICAgdGhpcy50eXBlID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdUeXBlJyk7XG4gICAgICAgIHRoaXMubmFtZSA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnTmFtZScpO1xuICAgICAgICB0aGlzLm5vdGVzID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdOb3RlcycpO1xuICAgICAgICB0aGlzLmZhdm9yaXRlID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdGYXZvcml0ZScpIHx8IGZhbHNlO1xuICAgICAgICB0aGlzLmVkaXQgPSAhIXRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnRWRpdCcpO1xuICAgICAgICBpZiAodGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdWaWV3UGFzc3dvcmQnKSA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnZpZXdQYXNzd29yZCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnZpZXdQYXNzd29yZCA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnVmlld1Bhc3N3b3JkJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vcmdhbml6YXRpb25Vc2VUb3RwID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdPcmdhbml6YXRpb25Vc2VUb3RwJyk7XG4gICAgICAgIHRoaXMucmV2aXNpb25EYXRlID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdSZXZpc2lvbkRhdGUnKTtcbiAgICAgICAgdGhpcy5jb2xsZWN0aW9uSWRzID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdDb2xsZWN0aW9uSWRzJyk7XG4gICAgICAgIHRoaXMuZGVsZXRlZERhdGUgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ0RlbGV0ZWREYXRlJyk7XG5cbiAgICAgICAgY29uc3QgbG9naW4gPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ0xvZ2luJyk7XG4gICAgICAgIGlmIChsb2dpbiAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2luID0gbmV3IExvZ2luQXBpKGxvZ2luKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNhcmQgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ0NhcmQnKTtcbiAgICAgICAgaWYgKGNhcmQgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5jYXJkID0gbmV3IENhcmRBcGkoY2FyZCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpZGVudGl0eSA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnSWRlbnRpdHknKTtcbiAgICAgICAgaWYgKGlkZW50aXR5ICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuaWRlbnRpdHkgPSBuZXcgSWRlbnRpdHlBcGkoaWRlbnRpdHkpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2VjdXJlTm90ZSA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnU2VjdXJlTm90ZScpO1xuICAgICAgICBpZiAoc2VjdXJlTm90ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnNlY3VyZU5vdGUgPSBuZXcgU2VjdXJlTm90ZUFwaShzZWN1cmVOb3RlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZpZWxkcyA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnRmllbGRzJyk7XG4gICAgICAgIGlmIChmaWVsZHMgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5maWVsZHMgPSBmaWVsZHMubWFwKChmOiBhbnkpID0+IG5ldyBGaWVsZEFwaShmKSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhdHRhY2htZW50cyA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnQXR0YWNobWVudHMnKTtcbiAgICAgICAgaWYgKGF0dGFjaG1lbnRzICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuYXR0YWNobWVudHMgPSBhdHRhY2htZW50cy5tYXAoKGE6IGFueSkgPT4gbmV3IEF0dGFjaG1lbnRSZXNwb25zZShhKSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwYXNzd29yZEhpc3RvcnkgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ1Bhc3N3b3JkSGlzdG9yeScpO1xuICAgICAgICBpZiAocGFzc3dvcmRIaXN0b3J5ICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMucGFzc3dvcmRIaXN0b3J5ID0gcGFzc3dvcmRIaXN0b3J5Lm1hcCgoaDogYW55KSA9PiBuZXcgUGFzc3dvcmRIaXN0b3J5UmVzcG9uc2UoaCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZXByb21wdCA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnUmVwcm9tcHQnKSB8fCBDaXBoZXJSZXByb21wdFR5cGUuTm9uZTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBCYXNlUmVzcG9uc2UgfSBmcm9tICcuL2Jhc2VSZXNwb25zZSc7XG5pbXBvcnQgeyBTZWxlY3Rpb25SZWFkT25seVJlc3BvbnNlIH0gZnJvbSAnLi9zZWxlY3Rpb25SZWFkT25seVJlc3BvbnNlJztcblxuZXhwb3J0IGNsYXNzIENvbGxlY3Rpb25SZXNwb25zZSBleHRlbmRzIEJhc2VSZXNwb25zZSB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBvcmdhbml6YXRpb25JZDogc3RyaW5nO1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBleHRlcm5hbElkOiBzdHJpbmc7XG5cbiAgICBjb25zdHJ1Y3RvcihyZXNwb25zZTogYW55KSB7XG4gICAgICAgIHN1cGVyKHJlc3BvbnNlKTtcbiAgICAgICAgdGhpcy5pZCA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnSWQnKTtcbiAgICAgICAgdGhpcy5vcmdhbml6YXRpb25JZCA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnT3JnYW5pemF0aW9uSWQnKTtcbiAgICAgICAgdGhpcy5uYW1lID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdOYW1lJyk7XG4gICAgICAgIHRoaXMuZXh0ZXJuYWxJZCA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnRXh0ZXJuYWxJZCcpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIENvbGxlY3Rpb25EZXRhaWxzUmVzcG9uc2UgZXh0ZW5kcyBDb2xsZWN0aW9uUmVzcG9uc2Uge1xuICAgIHJlYWRPbmx5OiBib29sZWFuO1xuXG4gICAgY29uc3RydWN0b3IocmVzcG9uc2U6IGFueSkge1xuICAgICAgICBzdXBlcihyZXNwb25zZSk7XG4gICAgICAgIHRoaXMucmVhZE9ubHkgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ1JlYWRPbmx5JykgfHwgZmFsc2U7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ29sbGVjdGlvbkdyb3VwRGV0YWlsc1Jlc3BvbnNlIGV4dGVuZHMgQ29sbGVjdGlvblJlc3BvbnNlIHtcbiAgICBncm91cHM6IFNlbGVjdGlvblJlYWRPbmx5UmVzcG9uc2VbXSA9IFtdO1xuXG4gICAgY29uc3RydWN0b3IocmVzcG9uc2U6IGFueSkge1xuICAgICAgICBzdXBlcihyZXNwb25zZSk7XG4gICAgICAgIGNvbnN0IGdyb3VwcyA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnR3JvdXBzJyk7XG4gICAgICAgIGlmIChncm91cHMgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5ncm91cHMgPSBncm91cHMubWFwKChnOiBhbnkpID0+IG5ldyBTZWxlY3Rpb25SZWFkT25seVJlc3BvbnNlKGcpKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCB7IEJhc2VSZXNwb25zZSB9IGZyb20gJy4vYmFzZVJlc3BvbnNlJztcblxuZXhwb3J0IGNsYXNzIENyeXB0b0FnZW50VXNlcktleVJlc3BvbnNlIGV4dGVuZHMgQmFzZVJlc3BvbnNlIHtcbiAgICBrZXk6IHN0cmluZztcblxuICAgIGNvbnN0cnVjdG9yKHJlc3BvbnNlOiBhbnkpIHtcbiAgICAgICAgc3VwZXIocmVzcG9uc2UpO1xuICAgICAgICB0aGlzLmtleSA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnS2V5Jyk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgQmFzZVJlc3BvbnNlIH0gZnJvbSAnLi9iYXNlUmVzcG9uc2UnO1xuaW1wb3J0IHsgR2xvYmFsRG9tYWluUmVzcG9uc2UgfSBmcm9tICcuL2dsb2JhbERvbWFpblJlc3BvbnNlJztcblxuZXhwb3J0IGNsYXNzIERvbWFpbnNSZXNwb25zZSBleHRlbmRzIEJhc2VSZXNwb25zZSB7XG4gICAgZXF1aXZhbGVudERvbWFpbnM6IHN0cmluZ1tdW107XG4gICAgZ2xvYmFsRXF1aXZhbGVudERvbWFpbnM6IEdsb2JhbERvbWFpblJlc3BvbnNlW10gPSBbXTtcblxuICAgIGNvbnN0cnVjdG9yKHJlc3BvbnNlOiBhbnkpIHtcbiAgICAgICAgc3VwZXIocmVzcG9uc2UpO1xuICAgICAgICB0aGlzLmVxdWl2YWxlbnREb21haW5zID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdFcXVpdmFsZW50RG9tYWlucycpO1xuICAgICAgICBjb25zdCBnbG9iYWxFcXVpdmFsZW50RG9tYWlucyA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnR2xvYmFsRXF1aXZhbGVudERvbWFpbnMnKTtcbiAgICAgICAgaWYgKGdsb2JhbEVxdWl2YWxlbnREb21haW5zICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuZ2xvYmFsRXF1aXZhbGVudERvbWFpbnMgPSBnbG9iYWxFcXVpdmFsZW50RG9tYWlucy5tYXAoKGQ6IGFueSkgPT4gbmV3IEdsb2JhbERvbWFpblJlc3BvbnNlKGQpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZ2xvYmFsRXF1aXZhbGVudERvbWFpbnMgPSBbXTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCB7IEVtZXJnZW5jeUFjY2Vzc1N0YXR1c1R5cGUgfSBmcm9tICcuLi8uLi9lbnVtcy9lbWVyZ2VuY3lBY2Nlc3NTdGF0dXNUeXBlJztcbmltcG9ydCB7IEVtZXJnZW5jeUFjY2Vzc1R5cGUgfSBmcm9tICcuLi8uLi9lbnVtcy9lbWVyZ2VuY3lBY2Nlc3NUeXBlJztcbmltcG9ydCB7IEtkZlR5cGUgfSBmcm9tICcuLi8uLi9lbnVtcy9rZGZUeXBlJztcbmltcG9ydCB7IEJhc2VSZXNwb25zZSB9IGZyb20gJy4vYmFzZVJlc3BvbnNlJztcbmltcG9ydCB7IENpcGhlclJlc3BvbnNlIH0gZnJvbSAnLi9jaXBoZXJSZXNwb25zZSc7XG5cbmV4cG9ydCBjbGFzcyBFbWVyZ2VuY3lBY2Nlc3NHcmFudGVlRGV0YWlsc1Jlc3BvbnNlIGV4dGVuZHMgQmFzZVJlc3BvbnNlIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIGdyYW50ZWVJZDogc3RyaW5nO1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBlbWFpbDogc3RyaW5nO1xuICAgIHR5cGU6IEVtZXJnZW5jeUFjY2Vzc1R5cGU7XG4gICAgc3RhdHVzOiBFbWVyZ2VuY3lBY2Nlc3NTdGF0dXNUeXBlO1xuICAgIHdhaXRUaW1lRGF5czogbnVtYmVyO1xuICAgIGNyZWF0aW9uRGF0ZTogc3RyaW5nO1xuXG4gICAgY29uc3RydWN0b3IocmVzcG9uc2U6IGFueSkge1xuICAgICAgICBzdXBlcihyZXNwb25zZSk7XG4gICAgICAgIHRoaXMuaWQgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ0lkJyk7XG4gICAgICAgIHRoaXMuZ3JhbnRlZUlkID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdHcmFudGVlSWQnKTtcbiAgICAgICAgdGhpcy5uYW1lID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdOYW1lJyk7XG4gICAgICAgIHRoaXMuZW1haWwgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ0VtYWlsJyk7XG4gICAgICAgIHRoaXMudHlwZSA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnVHlwZScpO1xuICAgICAgICB0aGlzLnN0YXR1cyA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnU3RhdHVzJyk7XG4gICAgICAgIHRoaXMud2FpdFRpbWVEYXlzID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdXYWl0VGltZURheXMnKTtcbiAgICAgICAgdGhpcy5jcmVhdGlvbkRhdGUgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ0NyZWF0aW9uRGF0ZScpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEVtZXJnZW5jeUFjY2Vzc0dyYW50b3JEZXRhaWxzUmVzcG9uc2UgZXh0ZW5kcyBCYXNlUmVzcG9uc2Uge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgZ3JhbnRvcklkOiBzdHJpbmc7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGVtYWlsOiBzdHJpbmc7XG4gICAgdHlwZTogRW1lcmdlbmN5QWNjZXNzVHlwZTtcbiAgICBzdGF0dXM6IEVtZXJnZW5jeUFjY2Vzc1N0YXR1c1R5cGU7XG4gICAgd2FpdFRpbWVEYXlzOiBudW1iZXI7XG4gICAgY3JlYXRpb25EYXRlOiBzdHJpbmc7XG5cbiAgICBjb25zdHJ1Y3RvcihyZXNwb25zZTogYW55KSB7XG4gICAgICAgIHN1cGVyKHJlc3BvbnNlKTtcbiAgICAgICAgdGhpcy5pZCA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnSWQnKTtcbiAgICAgICAgdGhpcy5ncmFudG9ySWQgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ0dyYW50b3JJZCcpO1xuICAgICAgICB0aGlzLm5hbWUgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ05hbWUnKTtcbiAgICAgICAgdGhpcy5lbWFpbCA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnRW1haWwnKTtcbiAgICAgICAgdGhpcy50eXBlID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdUeXBlJyk7XG4gICAgICAgIHRoaXMuc3RhdHVzID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdTdGF0dXMnKTtcbiAgICAgICAgdGhpcy53YWl0VGltZURheXMgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ1dhaXRUaW1lRGF5cycpO1xuICAgICAgICB0aGlzLmNyZWF0aW9uRGF0ZSA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnQ3JlYXRpb25EYXRlJyk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgRW1lcmdlbmN5QWNjZXNzVGFrZW92ZXJSZXNwb25zZSBleHRlbmRzIEJhc2VSZXNwb25zZSB7XG4gICAga2V5RW5jcnlwdGVkOiBzdHJpbmc7XG4gICAga2RmOiBLZGZUeXBlO1xuICAgIGtkZkl0ZXJhdGlvbnM6IG51bWJlcjtcblxuICAgIGNvbnN0cnVjdG9yKHJlc3BvbnNlOiBhbnkpIHtcbiAgICAgICAgc3VwZXIocmVzcG9uc2UpO1xuXG4gICAgICAgIHRoaXMua2V5RW5jcnlwdGVkID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdLZXlFbmNyeXB0ZWQnKTtcbiAgICAgICAgdGhpcy5rZGYgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ0tkZicpO1xuICAgICAgICB0aGlzLmtkZkl0ZXJhdGlvbnMgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ0tkZkl0ZXJhdGlvbnMnKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBFbWVyZ2VuY3lBY2Nlc3NWaWV3UmVzcG9uc2UgZXh0ZW5kcyBCYXNlUmVzcG9uc2Uge1xuICAgIGtleUVuY3J5cHRlZDogc3RyaW5nO1xuICAgIGNpcGhlcnM6IENpcGhlclJlc3BvbnNlW10gPSBbXTtcblxuICAgIGNvbnN0cnVjdG9yKHJlc3BvbnNlOiBhbnkpIHtcbiAgICAgICAgc3VwZXIocmVzcG9uc2UpO1xuXG4gICAgICAgIHRoaXMua2V5RW5jcnlwdGVkID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdLZXlFbmNyeXB0ZWQnKTtcblxuICAgICAgICBjb25zdCBjaXBoZXJzID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdDaXBoZXJzJyk7XG4gICAgICAgIGlmIChjaXBoZXJzICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuY2lwaGVycyA9IGNpcGhlcnMubWFwKChjOiBhbnkpID0+IG5ldyBDaXBoZXJSZXNwb25zZShjKSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgeyBVdGlscyB9IGZyb20gJy4uLy4uL21pc2MvdXRpbHMnO1xuXG5pbXBvcnQgeyBCYXNlUmVzcG9uc2UgfSBmcm9tICcuL2Jhc2VSZXNwb25zZSc7XG5cbmV4cG9ydCBjbGFzcyBFcnJvclJlc3BvbnNlIGV4dGVuZHMgQmFzZVJlc3BvbnNlIHtcbiAgICBtZXNzYWdlOiBzdHJpbmc7XG4gICAgdmFsaWRhdGlvbkVycm9yczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmdbXTsgfTtcbiAgICBzdGF0dXNDb2RlOiBudW1iZXI7XG4gICAgY2FwdGNoYVJlcXVpcmVkOiBib29sZWFuO1xuICAgIGNhcHRjaGFTaXRlS2V5OiBzdHJpbmc7XG5cbiAgICBjb25zdHJ1Y3RvcihyZXNwb25zZTogYW55LCBzdGF0dXM6IG51bWJlciwgaWRlbnRpdHlSZXNwb25zZT86IGJvb2xlYW4pIHtcbiAgICAgICAgc3VwZXIocmVzcG9uc2UpO1xuICAgICAgICBsZXQgZXJyb3JNb2RlbCA9IG51bGw7XG4gICAgICAgIGlmIChyZXNwb25zZSAhPSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZUVycm9yTW9kZWwgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ0Vycm9yTW9kZWwnKTtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZUVycm9yTW9kZWwgJiYgaWRlbnRpdHlSZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIGVycm9yTW9kZWwgPSByZXNwb25zZUVycm9yTW9kZWw7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGVycm9yTW9kZWwgPSByZXNwb25zZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlcnJvck1vZGVsKSB7XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2UgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ01lc3NhZ2UnLCBlcnJvck1vZGVsKTtcbiAgICAgICAgICAgIHRoaXMudmFsaWRhdGlvbkVycm9ycyA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnVmFsaWRhdGlvbkVycm9ycycsIGVycm9yTW9kZWwpO1xuICAgICAgICAgICAgdGhpcy5jYXB0Y2hhU2l0ZUtleSA9IHRoaXMudmFsaWRhdGlvbkVycm9ycz8uSENhcHRjaGFfU2l0ZUtleT8uWzBdO1xuICAgICAgICAgICAgdGhpcy5jYXB0Y2hhUmVxdWlyZWQgPSAhVXRpbHMuaXNOdWxsT3JXaGl0ZXNwYWNlKHRoaXMuY2FwdGNoYVNpdGVLZXkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHN0YXR1cyA9PT0gNDI5KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlID0gJ1JhdGUgbGltaXQgZXhjZWVkZWQuIFRyeSBhZ2FpbiBsYXRlci4nO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3RhdHVzQ29kZSA9IHN0YXR1cztcbiAgICB9XG5cbiAgICBnZXRTaW5nbGVNZXNzYWdlKCk6IHN0cmluZyB7XG4gICAgICAgIGlmICh0aGlzLnZhbGlkYXRpb25FcnJvcnMgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubWVzc2FnZTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLnZhbGlkYXRpb25FcnJvcnMpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy52YWxpZGF0aW9uRXJyb3JzLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLnZhbGlkYXRpb25FcnJvcnNba2V5XS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy52YWxpZGF0aW9uRXJyb3JzW2tleV1bMF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMubWVzc2FnZTtcbiAgICB9XG5cbiAgICBnZXRBbGxNZXNzYWdlcygpOiBzdHJpbmdbXSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2VzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBpZiAodGhpcy52YWxpZGF0aW9uRXJyb3JzID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBtZXNzYWdlcztcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLnZhbGlkYXRpb25FcnJvcnMpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy52YWxpZGF0aW9uRXJyb3JzLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMudmFsaWRhdGlvbkVycm9yc1trZXldLmZvckVhY2goKGl0ZW06IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBwcmVmaXggPSAnJztcbiAgICAgICAgICAgICAgICBpZiAoa2V5LmluZGV4T2YoJ1snKSA+IC0xICYmIGtleS5pbmRleE9mKCddJykgPiAtMSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXN0U2VwID0ga2V5Lmxhc3RJbmRleE9mKCcuJyk7XG4gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGtleS5zdWJzdHIoMCwgbGFzdFNlcCA+IC0xID8gbGFzdFNlcCA6IGtleS5sZW5ndGgpICsgJzogJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbWVzc2FnZXMucHVzaChwcmVmaXggKyBpdGVtKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlcztcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBCYXNlUmVzcG9uc2UgfSBmcm9tICcuL2Jhc2VSZXNwb25zZSc7XG5cbmltcG9ydCB7IERldmljZVR5cGUgfSBmcm9tICcuLi8uLi9lbnVtcy9kZXZpY2VUeXBlJztcbmltcG9ydCB7IEV2ZW50VHlwZSB9IGZyb20gJy4uLy4uL2VudW1zL2V2ZW50VHlwZSc7XG5cbmV4cG9ydCBjbGFzcyBFdmVudFJlc3BvbnNlIGV4dGVuZHMgQmFzZVJlc3BvbnNlIHtcbiAgICB0eXBlOiBFdmVudFR5cGU7XG4gICAgdXNlcklkOiBzdHJpbmc7XG4gICAgb3JnYW5pemF0aW9uSWQ6IHN0cmluZztcbiAgICBwcm92aWRlcklkOiBzdHJpbmc7XG4gICAgY2lwaGVySWQ6IHN0cmluZztcbiAgICBjb2xsZWN0aW9uSWQ6IHN0cmluZztcbiAgICBncm91cElkOiBzdHJpbmc7XG4gICAgcG9saWN5SWQ6IHN0cmluZztcbiAgICBvcmdhbml6YXRpb25Vc2VySWQ6IHN0cmluZztcbiAgICBwcm92aWRlclVzZXJJZDogc3RyaW5nO1xuICAgIHByb3ZpZGVyT3JnYW5pemF0aW9uSWQ6IHN0cmluZztcbiAgICBhY3RpbmdVc2VySWQ6IHN0cmluZztcbiAgICBkYXRlOiBzdHJpbmc7XG4gICAgZGV2aWNlVHlwZTogRGV2aWNlVHlwZTtcbiAgICBpcEFkZHJlc3M6IHN0cmluZztcblxuICAgIGNvbnN0cnVjdG9yKHJlc3BvbnNlOiBhbnkpIHtcbiAgICAgICAgc3VwZXIocmVzcG9uc2UpO1xuICAgICAgICB0aGlzLnR5cGUgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ1R5cGUnKTtcbiAgICAgICAgdGhpcy51c2VySWQgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ1VzZXJJZCcpO1xuICAgICAgICB0aGlzLm9yZ2FuaXphdGlvbklkID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdPcmdhbml6YXRpb25JZCcpO1xuICAgICAgICB0aGlzLnByb3ZpZGVySWQgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ1Byb3ZpZGVySWQnKTtcbiAgICAgICAgdGhpcy5jaXBoZXJJZCA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnQ2lwaGVySWQnKTtcbiAgICAgICAgdGhpcy5jb2xsZWN0aW9uSWQgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ0NvbGxlY3Rpb25JZCcpO1xuICAgICAgICB0aGlzLmdyb3VwSWQgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ0dyb3VwSWQnKTtcbiAgICAgICAgdGhpcy5wb2xpY3lJZCA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnUG9saWN5SWQnKTtcbiAgICAgICAgdGhpcy5vcmdhbml6YXRpb25Vc2VySWQgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ09yZ2FuaXphdGlvblVzZXJJZCcpO1xuICAgICAgICB0aGlzLnByb3ZpZGVyVXNlcklkID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdQcm92aWRlclVzZXJJZCcpO1xuICAgICAgICB0aGlzLnByb3ZpZGVyT3JnYW5pemF0aW9uSWQgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ1Byb3ZpZGVyT3JnYW5pemF0aW9uSWQnKTtcbiAgICAgICAgdGhpcy5hY3RpbmdVc2VySWQgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ0FjdGluZ1VzZXJJZCcpO1xuICAgICAgICB0aGlzLmRhdGUgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ0RhdGUnKTtcbiAgICAgICAgdGhpcy5kZXZpY2VUeXBlID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdEZXZpY2VUeXBlJyk7XG4gICAgICAgIHRoaXMuaXBBZGRyZXNzID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdJcEFkZHJlc3MnKTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBCYXNlUmVzcG9uc2UgfSBmcm9tICcuL2Jhc2VSZXNwb25zZSc7XG5cbmV4cG9ydCBjbGFzcyBGb2xkZXJSZXNwb25zZSBleHRlbmRzIEJhc2VSZXNwb25zZSB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgcmV2aXNpb25EYXRlOiBzdHJpbmc7XG5cbiAgICBjb25zdHJ1Y3RvcihyZXNwb25zZTogYW55KSB7XG4gICAgICAgIHN1cGVyKHJlc3BvbnNlKTtcbiAgICAgICAgdGhpcy5pZCA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnSWQnKTtcbiAgICAgICAgdGhpcy5uYW1lID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdOYW1lJyk7XG4gICAgICAgIHRoaXMucmV2aXNpb25EYXRlID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdSZXZpc2lvbkRhdGUnKTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBCYXNlUmVzcG9uc2UgfSBmcm9tICcuL2Jhc2VSZXNwb25zZSc7XG5cbmV4cG9ydCBjbGFzcyBHbG9iYWxEb21haW5SZXNwb25zZSBleHRlbmRzIEJhc2VSZXNwb25zZSB7XG4gICAgdHlwZTogbnVtYmVyO1xuICAgIGRvbWFpbnM6IHN0cmluZ1tdO1xuICAgIGV4Y2x1ZGVkOiBib29sZWFuO1xuXG4gICAgY29uc3RydWN0b3IocmVzcG9uc2U6IGFueSkge1xuICAgICAgICBzdXBlcihyZXNwb25zZSk7XG4gICAgICAgIHRoaXMudHlwZSA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnVHlwZScpO1xuICAgICAgICB0aGlzLmRvbWFpbnMgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ0RvbWFpbnMnKTtcbiAgICAgICAgdGhpcy5leGNsdWRlZCA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnRXhjbHVkZWQnKTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBCYXNlUmVzcG9uc2UgfSBmcm9tICcuL2Jhc2VSZXNwb25zZSc7XG5pbXBvcnQgeyBTZWxlY3Rpb25SZWFkT25seVJlc3BvbnNlIH0gZnJvbSAnLi9zZWxlY3Rpb25SZWFkT25seVJlc3BvbnNlJztcblxuZXhwb3J0IGNsYXNzIEdyb3VwUmVzcG9uc2UgZXh0ZW5kcyBCYXNlUmVzcG9uc2Uge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgb3JnYW5pemF0aW9uSWQ6IHN0cmluZztcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgYWNjZXNzQWxsOiBib29sZWFuO1xuICAgIGV4dGVybmFsSWQ6IHN0cmluZztcblxuICAgIGNvbnN0cnVjdG9yKHJlc3BvbnNlOiBhbnkpIHtcbiAgICAgICAgc3VwZXIocmVzcG9uc2UpO1xuICAgICAgICB0aGlzLmlkID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdJZCcpO1xuICAgICAgICB0aGlzLm9yZ2FuaXphdGlvbklkID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdPcmdhbml6YXRpb25JZCcpO1xuICAgICAgICB0aGlzLm5hbWUgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ05hbWUnKTtcbiAgICAgICAgdGhpcy5hY2Nlc3NBbGwgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ0FjY2Vzc0FsbCcpO1xuICAgICAgICB0aGlzLmV4dGVybmFsSWQgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ0V4dGVybmFsSWQnKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBHcm91cERldGFpbHNSZXNwb25zZSBleHRlbmRzIEdyb3VwUmVzcG9uc2Uge1xuICAgIGNvbGxlY3Rpb25zOiBTZWxlY3Rpb25SZWFkT25seVJlc3BvbnNlW10gPSBbXTtcblxuICAgIGNvbnN0cnVjdG9yKHJlc3BvbnNlOiBhbnkpIHtcbiAgICAgICAgc3VwZXIocmVzcG9uc2UpO1xuICAgICAgICBjb25zdCBjb2xsZWN0aW9ucyA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnQ29sbGVjdGlvbnMnKTtcbiAgICAgICAgaWYgKGNvbGxlY3Rpb25zICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuY29sbGVjdGlvbnMgPSBjb2xsZWN0aW9ucy5tYXAoKGM6IGFueSkgPT4gbmV3IFNlbGVjdGlvblJlYWRPbmx5UmVzcG9uc2UoYykpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgQmFzZVJlc3BvbnNlIH0gZnJvbSAnLi9iYXNlUmVzcG9uc2UnO1xuXG5leHBvcnQgY2xhc3MgSWRlbnRpdHlDYXB0Y2hhUmVzcG9uc2UgZXh0ZW5kcyBCYXNlUmVzcG9uc2Uge1xuICAgIHNpdGVLZXk6IHN0cmluZztcblxuICAgIGNvbnN0cnVjdG9yKHJlc3BvbnNlOiBhbnkpIHtcbiAgICAgICAgc3VwZXIocmVzcG9uc2UpO1xuICAgICAgICB0aGlzLnNpdGVLZXkgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ0hDYXB0Y2hhX1NpdGVLZXknKTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBCYXNlUmVzcG9uc2UgfSBmcm9tICcuL2Jhc2VSZXNwb25zZSc7XG5cbmltcG9ydCB7IEtkZlR5cGUgfSBmcm9tICcuLi8uLi9lbnVtcy9rZGZUeXBlJztcblxuZXhwb3J0IGNsYXNzIElkZW50aXR5VG9rZW5SZXNwb25zZSBleHRlbmRzIEJhc2VSZXNwb25zZSB7XG4gICAgYWNjZXNzVG9rZW46IHN0cmluZztcbiAgICBleHBpcmVzSW46IG51bWJlcjtcbiAgICByZWZyZXNoVG9rZW46IHN0cmluZztcbiAgICB0b2tlblR5cGU6IHN0cmluZztcblxuICAgIHJlc2V0TWFzdGVyUGFzc3dvcmQ6IGJvb2xlYW47XG4gICAgcHJpdmF0ZUtleTogc3RyaW5nO1xuICAgIGtleTogc3RyaW5nO1xuICAgIHR3b0ZhY3RvclRva2VuOiBzdHJpbmc7XG4gICAga2RmOiBLZGZUeXBlO1xuICAgIGtkZkl0ZXJhdGlvbnM6IG51bWJlcjtcbiAgICBmb3JjZVBhc3N3b3JkUmVzZXQ6IGJvb2xlYW47XG4gICAgY3J5cHRvQWdlbnRVcmw6IHN0cmluZztcblxuICAgIGNvbnN0cnVjdG9yKHJlc3BvbnNlOiBhbnkpIHtcbiAgICAgICAgc3VwZXIocmVzcG9uc2UpO1xuICAgICAgICB0aGlzLmFjY2Vzc1Rva2VuID0gcmVzcG9uc2UuYWNjZXNzX3Rva2VuO1xuICAgICAgICB0aGlzLmV4cGlyZXNJbiA9IHJlc3BvbnNlLmV4cGlyZXNfaW47XG4gICAgICAgIHRoaXMucmVmcmVzaFRva2VuID0gcmVzcG9uc2UucmVmcmVzaF90b2tlbjtcbiAgICAgICAgdGhpcy50b2tlblR5cGUgPSByZXNwb25zZS50b2tlbl90eXBlO1xuXG4gICAgICAgIHRoaXMucmVzZXRNYXN0ZXJQYXNzd29yZCA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnUmVzZXRNYXN0ZXJQYXNzd29yZCcpO1xuICAgICAgICB0aGlzLnByaXZhdGVLZXkgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ1ByaXZhdGVLZXknKTtcbiAgICAgICAgdGhpcy5rZXkgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ0tleScpO1xuICAgICAgICB0aGlzLnR3b0ZhY3RvclRva2VuID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdUd29GYWN0b3JUb2tlbicpO1xuICAgICAgICB0aGlzLmtkZiA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnS2RmJyk7XG4gICAgICAgIHRoaXMua2RmSXRlcmF0aW9ucyA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnS2RmSXRlcmF0aW9ucycpO1xuICAgICAgICB0aGlzLmZvcmNlUGFzc3dvcmRSZXNldCA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnRm9yY2VQYXNzd29yZFJlc2V0Jyk7XG4gICAgICAgIHRoaXMuY3J5cHRvQWdlbnRVcmwgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ0NyeXB0b0FnZW50VXJsJyk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgQmFzZVJlc3BvbnNlIH0gZnJvbSAnLi9iYXNlUmVzcG9uc2UnO1xuXG5pbXBvcnQgeyBUd29GYWN0b3JQcm92aWRlclR5cGUgfSBmcm9tICcuLi8uLi9lbnVtcy90d29GYWN0b3JQcm92aWRlclR5cGUnO1xuXG5leHBvcnQgY2xhc3MgSWRlbnRpdHlUd29GYWN0b3JSZXNwb25zZSBleHRlbmRzIEJhc2VSZXNwb25zZSB7XG4gICAgdHdvRmFjdG9yUHJvdmlkZXJzOiBUd29GYWN0b3JQcm92aWRlclR5cGVbXTtcbiAgICB0d29GYWN0b3JQcm92aWRlcnMyID0gbmV3IE1hcDxUd29GYWN0b3JQcm92aWRlclR5cGUsIHsgW2tleTogc3RyaW5nXTogc3RyaW5nOyB9PigpO1xuICAgIGNhcHRjaGFUb2tlbjogc3RyaW5nO1xuXG4gICAgY29uc3RydWN0b3IocmVzcG9uc2U6IGFueSkge1xuICAgICAgICBzdXBlcihyZXNwb25zZSk7XG4gICAgICAgIHRoaXMuY2FwdGNoYVRva2VuID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdDYXB0Y2hhQnlwYXNzVG9rZW4nKTtcbiAgICAgICAgdGhpcy50d29GYWN0b3JQcm92aWRlcnMgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ1R3b0ZhY3RvclByb3ZpZGVycycpO1xuICAgICAgICBjb25zdCB0d29GYWN0b3JQcm92aWRlcnMyID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdUd29GYWN0b3JQcm92aWRlcnMyJyk7XG4gICAgICAgIGlmICh0d29GYWN0b3JQcm92aWRlcnMyICE9IG51bGwpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcHJvcCBpbiB0d29GYWN0b3JQcm92aWRlcnMyKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR3b0ZhY3RvclByb3ZpZGVyczIuaGFzT3duUHJvcGVydHkocHJvcCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50d29GYWN0b3JQcm92aWRlcnMyLnNldChwYXJzZUludChwcm9wLCBudWxsKSwgdHdvRmFjdG9yUHJvdmlkZXJzMltwcm9wXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgQmFzZVJlc3BvbnNlIH0gZnJvbSAnLi9iYXNlUmVzcG9uc2UnO1xuXG5leHBvcnQgY2xhc3MgS2V5c1Jlc3BvbnNlIGV4dGVuZHMgQmFzZVJlc3BvbnNlIHtcbiAgICBwcml2YXRlS2V5OiBzdHJpbmc7XG4gICAgcHVibGljS2V5OiBzdHJpbmc7XG5cbiAgICBjb25zdHJ1Y3RvcihyZXNwb25zZTogYW55KSB7XG4gICAgICAgIHN1cGVyKHJlc3BvbnNlKTtcbiAgICAgICAgdGhpcy5wcml2YXRlS2V5ID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdQcml2YXRlS2V5Jyk7XG4gICAgICAgIHRoaXMucHVibGljS2V5ID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdQdWJsaWNLZXknKTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBCYXNlUmVzcG9uc2UgfSBmcm9tICcuL2Jhc2VSZXNwb25zZSc7XG5cbmV4cG9ydCBjbGFzcyBMaXN0UmVzcG9uc2U8VD4gZXh0ZW5kcyBCYXNlUmVzcG9uc2Uge1xuICAgIGRhdGE6IFRbXTtcbiAgICBjb250aW51YXRpb25Ub2tlbjogc3RyaW5nO1xuXG4gICAgY29uc3RydWN0b3IocmVzcG9uc2U6IGFueSwgdDogbmV3IChkYXRhUmVzcG9uc2U6IGFueSkgPT4gVCkge1xuICAgICAgICBzdXBlcihyZXNwb25zZSk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ0RhdGEnKTtcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YSA9PSBudWxsID8gW10gOiBkYXRhLm1hcCgoZHI6IGFueSkgPT4gbmV3IHQoZHIpKTtcbiAgICAgICAgdGhpcy5jb250aW51YXRpb25Ub2tlbiA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnQ29udGludWF0aW9uVG9rZW4nKTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBCYXNlUmVzcG9uc2UgfSBmcm9tICcuL2Jhc2VSZXNwb25zZSc7XG5cbmltcG9ydCB7IE5vdGlmaWNhdGlvblR5cGUgfSBmcm9tICcuLi8uLi9lbnVtcy9ub3RpZmljYXRpb25UeXBlJztcblxuZXhwb3J0IGNsYXNzIE5vdGlmaWNhdGlvblJlc3BvbnNlIGV4dGVuZHMgQmFzZVJlc3BvbnNlIHtcbiAgICBjb250ZXh0SWQ6IHN0cmluZztcbiAgICB0eXBlOiBOb3RpZmljYXRpb25UeXBlO1xuICAgIHBheWxvYWQ6IGFueTtcblxuICAgIGNvbnN0cnVjdG9yKHJlc3BvbnNlOiBhbnkpIHtcbiAgICAgICAgc3VwZXIocmVzcG9uc2UpO1xuICAgICAgICB0aGlzLmNvbnRleHRJZCA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnQ29udGV4dElkJyk7XG4gICAgICAgIHRoaXMudHlwZSA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnVHlwZScpO1xuXG4gICAgICAgIGNvbnN0IHBheWxvYWQgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ1BheWxvYWQnKTtcbiAgICAgICAgc3dpdGNoICh0aGlzLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgTm90aWZpY2F0aW9uVHlwZS5TeW5jQ2lwaGVyQ3JlYXRlOlxuICAgICAgICAgICAgY2FzZSBOb3RpZmljYXRpb25UeXBlLlN5bmNDaXBoZXJEZWxldGU6XG4gICAgICAgICAgICBjYXNlIE5vdGlmaWNhdGlvblR5cGUuU3luY0NpcGhlclVwZGF0ZTpcbiAgICAgICAgICAgIGNhc2UgTm90aWZpY2F0aW9uVHlwZS5TeW5jTG9naW5EZWxldGU6XG4gICAgICAgICAgICAgICAgdGhpcy5wYXlsb2FkID0gbmV3IFN5bmNDaXBoZXJOb3RpZmljYXRpb24ocGF5bG9hZCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIE5vdGlmaWNhdGlvblR5cGUuU3luY0ZvbGRlckNyZWF0ZTpcbiAgICAgICAgICAgIGNhc2UgTm90aWZpY2F0aW9uVHlwZS5TeW5jRm9sZGVyRGVsZXRlOlxuICAgICAgICAgICAgY2FzZSBOb3RpZmljYXRpb25UeXBlLlN5bmNGb2xkZXJVcGRhdGU6XG4gICAgICAgICAgICAgICAgdGhpcy5wYXlsb2FkID0gbmV3IFN5bmNGb2xkZXJOb3RpZmljYXRpb24ocGF5bG9hZCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIE5vdGlmaWNhdGlvblR5cGUuU3luY1ZhdWx0OlxuICAgICAgICAgICAgY2FzZSBOb3RpZmljYXRpb25UeXBlLlN5bmNDaXBoZXJzOlxuICAgICAgICAgICAgY2FzZSBOb3RpZmljYXRpb25UeXBlLlN5bmNPcmdLZXlzOlxuICAgICAgICAgICAgY2FzZSBOb3RpZmljYXRpb25UeXBlLlN5bmNTZXR0aW5nczpcbiAgICAgICAgICAgIGNhc2UgTm90aWZpY2F0aW9uVHlwZS5Mb2dPdXQ6XG4gICAgICAgICAgICAgICAgdGhpcy5wYXlsb2FkID0gbmV3IFVzZXJOb3RpZmljYXRpb24ocGF5bG9hZCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIE5vdGlmaWNhdGlvblR5cGUuU3luY1NlbmRDcmVhdGU6XG4gICAgICAgICAgICBjYXNlIE5vdGlmaWNhdGlvblR5cGUuU3luY1NlbmRVcGRhdGU6XG4gICAgICAgICAgICBjYXNlIE5vdGlmaWNhdGlvblR5cGUuU3luY1NlbmREZWxldGU6XG4gICAgICAgICAgICAgICAgdGhpcy5wYXlsb2FkID0gbmV3IFN5bmNTZW5kTm90aWZpY2F0aW9uKHBheWxvYWQpO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFN5bmNDaXBoZXJOb3RpZmljYXRpb24gZXh0ZW5kcyBCYXNlUmVzcG9uc2Uge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgdXNlcklkOiBzdHJpbmc7XG4gICAgb3JnYW5pemF0aW9uSWQ6IHN0cmluZztcbiAgICBjb2xsZWN0aW9uSWRzOiBzdHJpbmdbXTtcbiAgICByZXZpc2lvbkRhdGU6IERhdGU7XG5cbiAgICBjb25zdHJ1Y3RvcihyZXNwb25zZTogYW55KSB7XG4gICAgICAgIHN1cGVyKHJlc3BvbnNlKTtcbiAgICAgICAgdGhpcy5pZCA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnSWQnKTtcbiAgICAgICAgdGhpcy51c2VySWQgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ1VzZXJJZCcpO1xuICAgICAgICB0aGlzLm9yZ2FuaXphdGlvbklkID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdPcmdhbml6YXRpb25JZCcpO1xuICAgICAgICB0aGlzLmNvbGxlY3Rpb25JZHMgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ0NvbGxlY3Rpb25JZHMnKTtcbiAgICAgICAgdGhpcy5yZXZpc2lvbkRhdGUgPSBuZXcgRGF0ZSh0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ1JldmlzaW9uRGF0ZScpKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTeW5jRm9sZGVyTm90aWZpY2F0aW9uIGV4dGVuZHMgQmFzZVJlc3BvbnNlIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIHVzZXJJZDogc3RyaW5nO1xuICAgIHJldmlzaW9uRGF0ZTogRGF0ZTtcblxuICAgIGNvbnN0cnVjdG9yKHJlc3BvbnNlOiBhbnkpIHtcbiAgICAgICAgc3VwZXIocmVzcG9uc2UpO1xuICAgICAgICB0aGlzLmlkID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdJZCcpO1xuICAgICAgICB0aGlzLnVzZXJJZCA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnVXNlcklkJyk7XG4gICAgICAgIHRoaXMucmV2aXNpb25EYXRlID0gbmV3IERhdGUodGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdSZXZpc2lvbkRhdGUnKSk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgVXNlck5vdGlmaWNhdGlvbiBleHRlbmRzIEJhc2VSZXNwb25zZSB7XG4gICAgdXNlcklkOiBzdHJpbmc7XG4gICAgZGF0ZTogRGF0ZTtcblxuICAgIGNvbnN0cnVjdG9yKHJlc3BvbnNlOiBhbnkpIHtcbiAgICAgICAgc3VwZXIocmVzcG9uc2UpO1xuICAgICAgICB0aGlzLnVzZXJJZCA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnVXNlcklkJyk7XG4gICAgICAgIHRoaXMuZGF0ZSA9IG5ldyBEYXRlKHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnRGF0ZScpKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTeW5jU2VuZE5vdGlmaWNhdGlvbiBleHRlbmRzIEJhc2VSZXNwb25zZSB7XG4gICAgaWQ6IHN0cmluZztcbiAgICB1c2VySWQ6IHN0cmluZztcbiAgICByZXZpc2lvbkRhdGU6IERhdGU7XG5cbiAgICBjb25zdHJ1Y3RvcihyZXNwb25zZTogYW55KSB7XG4gICAgICAgIHN1cGVyKHJlc3BvbnNlKTtcbiAgICAgICAgdGhpcy5pZCA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnSWQnKTtcbiAgICAgICAgdGhpcy51c2VySWQgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ1VzZXJJZCcpO1xuICAgICAgICB0aGlzLnJldmlzaW9uRGF0ZSA9IG5ldyBEYXRlKHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnUmV2aXNpb25EYXRlJykpO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IFNzb0NvbmZpZ0FwaSB9IGZyb20gJy4uLy4uL2FwaS9zc29Db25maWdBcGknO1xuaW1wb3J0IHsgQmFzZVJlc3BvbnNlIH0gZnJvbSAnLi4vYmFzZVJlc3BvbnNlJztcblxuZXhwb3J0IGNsYXNzIE9yZ2FuaXphdGlvblNzb1Jlc3BvbnNlIGV4dGVuZHMgQmFzZVJlc3BvbnNlIHtcbiAgICBlbmFibGVkOiBib29sZWFuO1xuICAgIGRhdGE6IFNzb0NvbmZpZ0FwaTtcbiAgICB1cmxzOiBTc29VcmxzO1xuXG4gICAgY29uc3RydWN0b3IocmVzcG9uc2U6IGFueSkge1xuICAgICAgICBzdXBlcihyZXNwb25zZSk7XG4gICAgICAgIHRoaXMuZW5hYmxlZCA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnRW5hYmxlZCcpO1xuICAgICAgICB0aGlzLmRhdGEgPSBuZXcgU3NvQ29uZmlnQXBpKHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnRGF0YScpKTtcbiAgICAgICAgdGhpcy51cmxzID0gbmV3IFNzb1VybHModGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdVcmxzJykpO1xuICAgIH1cbn1cblxuY2xhc3MgU3NvVXJscyBleHRlbmRzIEJhc2VSZXNwb25zZSB7XG4gICAgY2FsbGJhY2tQYXRoOiBzdHJpbmc7XG4gICAgc2lnbmVkT3V0Q2FsbGJhY2tQYXRoOiBzdHJpbmc7XG4gICAgc3BFbnRpdHlJZDogc3RyaW5nO1xuICAgIHNwTWV0YWRhdGFVcmw6IHN0cmluZztcbiAgICBzcEFjc1VybDogc3RyaW5nO1xuXG4gICAgY29uc3RydWN0b3IocmVzcG9uc2U6IGFueSkge1xuICAgICAgICBzdXBlcihyZXNwb25zZSk7XG4gICAgICAgIHRoaXMuY2FsbGJhY2tQYXRoID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdDYWxsYmFja1BhdGgnKTtcbiAgICAgICAgdGhpcy5zaWduZWRPdXRDYWxsYmFja1BhdGggPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ1NpZ25lZE91dENhbGxiYWNrUGF0aCcpO1xuICAgICAgICB0aGlzLnNwRW50aXR5SWQgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ1NwRW50aXR5SWQnKTtcbiAgICAgICAgdGhpcy5zcE1ldGFkYXRhVXJsID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdTcE1ldGFkYXRhVXJsJyk7XG4gICAgICAgIHRoaXMuc3BBY3NVcmwgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ1NwQWNzVXJsJyk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgQmFzZVJlc3BvbnNlIH0gZnJvbSAnLi9iYXNlUmVzcG9uc2UnO1xuXG5leHBvcnQgY2xhc3MgT3JnYW5pemF0aW9uQXV0b0Vucm9sbFN0YXR1c1Jlc3BvbnNlIGV4dGVuZHMgQmFzZVJlc3BvbnNlIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIHJlc2V0UGFzc3dvcmRFbmFibGVkOiBib29sZWFuO1xuXG4gICAgY29uc3RydWN0b3IocmVzcG9uc2U6IGFueSkge1xuICAgICAgICBzdXBlcihyZXNwb25zZSk7XG4gICAgICAgIHRoaXMuaWQgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ0lkJyk7XG4gICAgICAgIHRoaXMucmVzZXRQYXNzd29yZEVuYWJsZWQgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ1Jlc2V0UGFzc3dvcmRFbmFibGVkJyk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgS2V5c1Jlc3BvbnNlIH0gZnJvbSAnLi9rZXlzUmVzcG9uc2UnO1xuXG5leHBvcnQgY2xhc3MgT3JnYW5pemF0aW9uS2V5c1Jlc3BvbnNlIGV4dGVuZHMgS2V5c1Jlc3BvbnNlIHtcbiAgICBjb25zdHJ1Y3RvcihyZXNwb25zZTogYW55KSB7XG4gICAgICAgIHN1cGVyKHJlc3BvbnNlKTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBCYXNlUmVzcG9uc2UgfSBmcm9tICcuL2Jhc2VSZXNwb25zZSc7XG5pbXBvcnQgeyBQbGFuUmVzcG9uc2UgfSBmcm9tICcuL3BsYW5SZXNwb25zZSc7XG5cbmltcG9ydCB7IFBsYW5UeXBlIH0gZnJvbSAnLi4vLi4vZW51bXMvcGxhblR5cGUnO1xuXG5leHBvcnQgY2xhc3MgT3JnYW5pemF0aW9uUmVzcG9uc2UgZXh0ZW5kcyBCYXNlUmVzcG9uc2Uge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgaWRlbnRpZmllcjogc3RyaW5nO1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBidXNpbmVzc05hbWU6IHN0cmluZztcbiAgICBidXNpbmVzc0FkZHJlc3MxOiBzdHJpbmc7XG4gICAgYnVzaW5lc3NBZGRyZXNzMjogc3RyaW5nO1xuICAgIGJ1c2luZXNzQWRkcmVzczM6IHN0cmluZztcbiAgICBidXNpbmVzc0NvdW50cnk6IHN0cmluZztcbiAgICBidXNpbmVzc1RheE51bWJlcjogc3RyaW5nO1xuICAgIGJpbGxpbmdFbWFpbDogc3RyaW5nO1xuICAgIHBsYW46IFBsYW5SZXNwb25zZTtcbiAgICBwbGFuVHlwZTogUGxhblR5cGU7XG4gICAgc2VhdHM6IG51bWJlcjtcbiAgICBtYXhBdXRvc2NhbGVTZWF0czogbnVtYmVyO1xuICAgIG1heENvbGxlY3Rpb25zOiBudW1iZXI7XG4gICAgbWF4U3RvcmFnZUdiOiBudW1iZXI7XG4gICAgdXNlR3JvdXBzOiBib29sZWFuO1xuICAgIHVzZURpcmVjdG9yeTogYm9vbGVhbjtcbiAgICB1c2VFdmVudHM6IGJvb2xlYW47XG4gICAgdXNlVG90cDogYm9vbGVhbjtcbiAgICB1c2UyZmE6IGJvb2xlYW47XG4gICAgdXNlQXBpOiBib29sZWFuO1xuICAgIHVzZVJlc2V0UGFzc3dvcmQ6IGJvb2xlYW47XG4gICAgaGFzUHVibGljQW5kUHJpdmF0ZUtleXM6IGJvb2xlYW47XG5cbiAgICBjb25zdHJ1Y3RvcihyZXNwb25zZTogYW55KSB7XG4gICAgICAgIHN1cGVyKHJlc3BvbnNlKTtcbiAgICAgICAgdGhpcy5pZCA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnSWQnKTtcbiAgICAgICAgdGhpcy5pZGVudGlmaWVyID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdJZGVudGlmaWVyJyk7XG4gICAgICAgIHRoaXMubmFtZSA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnTmFtZScpO1xuICAgICAgICB0aGlzLmJ1c2luZXNzTmFtZSA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnQnVzaW5lc3NOYW1lJyk7XG4gICAgICAgIHRoaXMuYnVzaW5lc3NBZGRyZXNzMSA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnQnVzaW5lc3NBZGRyZXNzMScpO1xuICAgICAgICB0aGlzLmJ1c2luZXNzQWRkcmVzczIgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ0J1c2luZXNzQWRkcmVzczInKTtcbiAgICAgICAgdGhpcy5idXNpbmVzc0FkZHJlc3MzID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdCdXNpbmVzc0FkZHJlc3MzJyk7XG4gICAgICAgIHRoaXMuYnVzaW5lc3NDb3VudHJ5ID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdCdXNpbmVzc0NvdW50cnknKTtcbiAgICAgICAgdGhpcy5idXNpbmVzc1RheE51bWJlciA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnQnVzaW5lc3NUYXhOdW1iZXInKTtcbiAgICAgICAgdGhpcy5iaWxsaW5nRW1haWwgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ0JpbGxpbmdFbWFpbCcpO1xuICAgICAgICBjb25zdCBwbGFuID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdQbGFuJyk7XG4gICAgICAgIHRoaXMucGxhbiA9IHBsYW4gPT0gbnVsbCA/IG51bGwgOiBuZXcgUGxhblJlc3BvbnNlKHBsYW4pO1xuICAgICAgICB0aGlzLnBsYW5UeXBlID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdQbGFuVHlwZScpO1xuICAgICAgICB0aGlzLnNlYXRzID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdTZWF0cycpO1xuICAgICAgICB0aGlzLm1heEF1dG9zY2FsZVNlYXRzID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdNYXhBdXRvc2NhbGVTZWF0cycpO1xuICAgICAgICB0aGlzLm1heENvbGxlY3Rpb25zID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdNYXhDb2xsZWN0aW9ucycpO1xuICAgICAgICB0aGlzLm1heFN0b3JhZ2VHYiA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnTWF4U3RvcmFnZUdiJyk7XG4gICAgICAgIHRoaXMudXNlR3JvdXBzID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdVc2VHcm91cHMnKTtcbiAgICAgICAgdGhpcy51c2VEaXJlY3RvcnkgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ1VzZURpcmVjdG9yeScpO1xuICAgICAgICB0aGlzLnVzZUV2ZW50cyA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnVXNlRXZlbnRzJyk7XG4gICAgICAgIHRoaXMudXNlVG90cCA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnVXNlVG90cCcpO1xuICAgICAgICB0aGlzLnVzZTJmYSA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnVXNlMmZhJyk7XG4gICAgICAgIHRoaXMudXNlQXBpID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdVc2VBcGknKTtcbiAgICAgICAgdGhpcy51c2VSZXNldFBhc3N3b3JkID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdVc2VSZXNldFBhc3N3b3JkJyk7XG4gICAgICAgIHRoaXMuaGFzUHVibGljQW5kUHJpdmF0ZUtleXMgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ0hhc1B1YmxpY0FuZFByaXZhdGVLZXlzJyk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgT3JnYW5pemF0aW9uUmVzcG9uc2UgfSBmcm9tICcuL29yZ2FuaXphdGlvblJlc3BvbnNlJztcbmltcG9ydCB7XG4gICAgQmlsbGluZ1N1YnNjcmlwdGlvblJlc3BvbnNlLFxuICAgIEJpbGxpbmdTdWJzY3JpcHRpb25VcGNvbWluZ0ludm9pY2VSZXNwb25zZSxcbn0gZnJvbSAnLi9zdWJzY3JpcHRpb25SZXNwb25zZSc7XG5cbmV4cG9ydCBjbGFzcyBPcmdhbml6YXRpb25TdWJzY3JpcHRpb25SZXNwb25zZSBleHRlbmRzIE9yZ2FuaXphdGlvblJlc3BvbnNlIHtcbiAgICBzdG9yYWdlTmFtZTogc3RyaW5nO1xuICAgIHN0b3JhZ2VHYjogbnVtYmVyO1xuICAgIHN1YnNjcmlwdGlvbjogQmlsbGluZ1N1YnNjcmlwdGlvblJlc3BvbnNlO1xuICAgIHVwY29taW5nSW52b2ljZTogQmlsbGluZ1N1YnNjcmlwdGlvblVwY29taW5nSW52b2ljZVJlc3BvbnNlO1xuICAgIGV4cGlyYXRpb246IHN0cmluZztcblxuICAgIGNvbnN0cnVjdG9yKHJlc3BvbnNlOiBhbnkpIHtcbiAgICAgICAgc3VwZXIocmVzcG9uc2UpO1xuICAgICAgICB0aGlzLnN0b3JhZ2VOYW1lID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdTdG9yYWdlTmFtZScpO1xuICAgICAgICB0aGlzLnN0b3JhZ2VHYiA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnU3RvcmFnZUdiJyk7XG4gICAgICAgIGNvbnN0IHN1YnNjcmlwdGlvbiA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnU3Vic2NyaXB0aW9uJyk7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gc3Vic2NyaXB0aW9uID09IG51bGwgPyBudWxsIDogbmV3IEJpbGxpbmdTdWJzY3JpcHRpb25SZXNwb25zZShzdWJzY3JpcHRpb24pO1xuICAgICAgICBjb25zdCB1cGNvbWluZ0ludm9pY2UgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ1VwY29taW5nSW52b2ljZScpO1xuICAgICAgICB0aGlzLnVwY29taW5nSW52b2ljZSA9IHVwY29taW5nSW52b2ljZSA9PSBudWxsID8gbnVsbCA6XG4gICAgICAgICAgICBuZXcgQmlsbGluZ1N1YnNjcmlwdGlvblVwY29taW5nSW52b2ljZVJlc3BvbnNlKHVwY29taW5nSW52b2ljZSk7XG4gICAgICAgIHRoaXMuZXhwaXJhdGlvbiA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnRXhwaXJhdGlvbicpO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IEJhc2VSZXNwb25zZSB9IGZyb20gJy4vYmFzZVJlc3BvbnNlJztcblxuZXhwb3J0IGNsYXNzIE9yZ2FuaXphdGlvblVzZXJCdWxrUHVibGljS2V5UmVzcG9uc2UgZXh0ZW5kcyBCYXNlUmVzcG9uc2Uge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgdXNlcklkOiBzdHJpbmc7XG4gICAga2V5OiBzdHJpbmc7XG5cbiAgICBjb25zdHJ1Y3RvcihyZXNwb25zZTogYW55KSB7XG4gICAgICAgIHN1cGVyKHJlc3BvbnNlKTtcbiAgICAgICAgdGhpcy5pZCA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnSWQnKTtcbiAgICAgICAgdGhpcy51c2VySWQgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ1VzZXJJZCcpO1xuICAgICAgICB0aGlzLmtleSA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnS2V5Jyk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgQmFzZVJlc3BvbnNlIH0gZnJvbSAnLi9iYXNlUmVzcG9uc2UnO1xuXG5leHBvcnQgY2xhc3MgT3JnYW5pemF0aW9uVXNlckJ1bGtSZXNwb25zZSBleHRlbmRzIEJhc2VSZXNwb25zZSB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBlcnJvcjogc3RyaW5nO1xuXG4gICAgY29uc3RydWN0b3IocmVzcG9uc2U6IGFueSkge1xuICAgICAgICBzdXBlcihyZXNwb25zZSk7XG4gICAgICAgIHRoaXMuaWQgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ0lkJyk7XG4gICAgICAgIHRoaXMuZXJyb3IgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ0Vycm9yJyk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgQmFzZVJlc3BvbnNlIH0gZnJvbSAnLi9iYXNlUmVzcG9uc2UnO1xuaW1wb3J0IHsgU2VsZWN0aW9uUmVhZE9ubHlSZXNwb25zZSB9IGZyb20gJy4vc2VsZWN0aW9uUmVhZE9ubHlSZXNwb25zZSc7XG5cbmltcG9ydCB7IFBlcm1pc3Npb25zQXBpIH0gZnJvbSAnLi4vYXBpL3Blcm1pc3Npb25zQXBpJztcblxuaW1wb3J0IHsgS2RmVHlwZSB9IGZyb20gJy4uLy4uL2VudW1zL2tkZlR5cGUnO1xuaW1wb3J0IHsgT3JnYW5pemF0aW9uVXNlclN0YXR1c1R5cGUgfSBmcm9tICcuLi8uLi9lbnVtcy9vcmdhbml6YXRpb25Vc2VyU3RhdHVzVHlwZSc7XG5pbXBvcnQgeyBPcmdhbml6YXRpb25Vc2VyVHlwZSB9IGZyb20gJy4uLy4uL2VudW1zL29yZ2FuaXphdGlvblVzZXJUeXBlJztcblxuZXhwb3J0IGNsYXNzIE9yZ2FuaXphdGlvblVzZXJSZXNwb25zZSBleHRlbmRzIEJhc2VSZXNwb25zZSB7XG4gICAgaWQ6IHN0cmluZztcbiAgICB1c2VySWQ6IHN0cmluZztcbiAgICB0eXBlOiBPcmdhbml6YXRpb25Vc2VyVHlwZTtcbiAgICBzdGF0dXM6IE9yZ2FuaXphdGlvblVzZXJTdGF0dXNUeXBlO1xuICAgIGFjY2Vzc0FsbDogYm9vbGVhbjtcbiAgICBwZXJtaXNzaW9uczogUGVybWlzc2lvbnNBcGk7XG4gICAgcmVzZXRQYXNzd29yZEVucm9sbGVkOiBib29sZWFuO1xuXG4gICAgY29uc3RydWN0b3IocmVzcG9uc2U6IGFueSkge1xuICAgICAgICBzdXBlcihyZXNwb25zZSk7XG4gICAgICAgIHRoaXMuaWQgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ0lkJyk7XG4gICAgICAgIHRoaXMudXNlcklkID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdVc2VySWQnKTtcbiAgICAgICAgdGhpcy50eXBlID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdUeXBlJyk7XG4gICAgICAgIHRoaXMuc3RhdHVzID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdTdGF0dXMnKTtcbiAgICAgICAgdGhpcy5wZXJtaXNzaW9ucyA9IG5ldyBQZXJtaXNzaW9uc0FwaSh0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ1Blcm1pc3Npb25zJykpO1xuICAgICAgICB0aGlzLmFjY2Vzc0FsbCA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnQWNjZXNzQWxsJyk7XG4gICAgICAgIHRoaXMucmVzZXRQYXNzd29yZEVucm9sbGVkID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdSZXNldFBhc3N3b3JkRW5yb2xsZWQnKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBPcmdhbml6YXRpb25Vc2VyVXNlckRldGFpbHNSZXNwb25zZSBleHRlbmRzIE9yZ2FuaXphdGlvblVzZXJSZXNwb25zZSB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGVtYWlsOiBzdHJpbmc7XG4gICAgdHdvRmFjdG9yRW5hYmxlZDogYm9vbGVhbjtcblxuICAgIGNvbnN0cnVjdG9yKHJlc3BvbnNlOiBhbnkpIHtcbiAgICAgICAgc3VwZXIocmVzcG9uc2UpO1xuICAgICAgICB0aGlzLm5hbWUgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ05hbWUnKTtcbiAgICAgICAgdGhpcy5lbWFpbCA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnRW1haWwnKTtcbiAgICAgICAgdGhpcy50d29GYWN0b3JFbmFibGVkID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdUd29GYWN0b3JFbmFibGVkJyk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgT3JnYW5pemF0aW9uVXNlckRldGFpbHNSZXNwb25zZSBleHRlbmRzIE9yZ2FuaXphdGlvblVzZXJSZXNwb25zZSB7XG4gICAgY29sbGVjdGlvbnM6IFNlbGVjdGlvblJlYWRPbmx5UmVzcG9uc2VbXSA9IFtdO1xuXG4gICAgY29uc3RydWN0b3IocmVzcG9uc2U6IGFueSkge1xuICAgICAgICBzdXBlcihyZXNwb25zZSk7XG4gICAgICAgIGNvbnN0IGNvbGxlY3Rpb25zID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdDb2xsZWN0aW9ucycpO1xuICAgICAgICBpZiAoY29sbGVjdGlvbnMgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5jb2xsZWN0aW9ucyA9IGNvbGxlY3Rpb25zLm1hcCgoYzogYW55KSA9PiBuZXcgU2VsZWN0aW9uUmVhZE9ubHlSZXNwb25zZShjKSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBPcmdhbml6YXRpb25Vc2VyUmVzZXRQYXNzd29yZERldGFpbHNSZXBvbnNlIGV4dGVuZHMgQmFzZVJlc3BvbnNlIHtcbiAgICBrZGY6IEtkZlR5cGU7XG4gICAga2RmSXRlcmF0aW9uczogbnVtYmVyO1xuICAgIHJlc2V0UGFzc3dvcmRLZXk6IHN0cmluZztcbiAgICBlbmNyeXB0ZWRQcml2YXRlS2V5OiBzdHJpbmc7XG5cbiAgICBjb25zdHJ1Y3RvcihyZXNwb25zZTogYW55KSB7XG4gICAgICAgIHN1cGVyKHJlc3BvbnNlKTtcbiAgICAgICAgdGhpcy5rZGYgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ0tkZicpO1xuICAgICAgICB0aGlzLmtkZkl0ZXJhdGlvbnMgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ0tkZkl0ZXJhdGlvbnMnKTtcbiAgICAgICAgdGhpcy5yZXNldFBhc3N3b3JkS2V5ID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdSZXNldFBhc3N3b3JkS2V5Jyk7XG4gICAgICAgIHRoaXMuZW5jcnlwdGVkUHJpdmF0ZUtleSA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnRW5jcnlwdGVkUHJpdmF0ZUtleScpO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IEJhc2VSZXNwb25zZSB9IGZyb20gJy4vYmFzZVJlc3BvbnNlJztcblxuZXhwb3J0IGNsYXNzIFBhc3N3b3JkSGlzdG9yeVJlc3BvbnNlIGV4dGVuZHMgQmFzZVJlc3BvbnNlIHtcbiAgICBwYXNzd29yZDogc3RyaW5nO1xuICAgIGxhc3RVc2VkRGF0ZTogc3RyaW5nO1xuXG4gICAgY29uc3RydWN0b3IocmVzcG9uc2U6IGFueSkge1xuICAgICAgICBzdXBlcihyZXNwb25zZSk7XG4gICAgICAgIHRoaXMucGFzc3dvcmQgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ1Bhc3N3b3JkJyk7XG4gICAgICAgIHRoaXMubGFzdFVzZWREYXRlID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdMYXN0VXNlZERhdGUnKTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBCYXNlUmVzcG9uc2UgfSBmcm9tICcuL2Jhc2VSZXNwb25zZSc7XG5pbXBvcnQgeyBQcm9maWxlUmVzcG9uc2UgfSBmcm9tICcuL3Byb2ZpbGVSZXNwb25zZSc7XG5cbmV4cG9ydCBjbGFzcyBQYXltZW50UmVzcG9uc2UgZXh0ZW5kcyBCYXNlUmVzcG9uc2Uge1xuICAgIHVzZXJQcm9maWxlOiBQcm9maWxlUmVzcG9uc2U7XG4gICAgcGF5bWVudEludGVudENsaWVudFNlY3JldDogc3RyaW5nO1xuICAgIHN1Y2Nlc3M6IGJvb2xlYW47XG5cbiAgICBjb25zdHJ1Y3RvcihyZXNwb25zZTogYW55KSB7XG4gICAgICAgIHN1cGVyKHJlc3BvbnNlKTtcbiAgICAgICAgY29uc3QgdXNlclByb2ZpbGUgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ1VzZXJQcm9maWxlJyk7XG4gICAgICAgIGlmICh1c2VyUHJvZmlsZSAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnVzZXJQcm9maWxlID0gbmV3IFByb2ZpbGVSZXNwb25zZSh1c2VyUHJvZmlsZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wYXltZW50SW50ZW50Q2xpZW50U2VjcmV0ID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdQYXltZW50SW50ZW50Q2xpZW50U2VjcmV0Jyk7XG4gICAgICAgIHRoaXMuc3VjY2VzcyA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnU3VjY2VzcycpO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IFBsYW5UeXBlIH0gZnJvbSAnLi4vLi4vZW51bXMvcGxhblR5cGUnO1xuaW1wb3J0IHsgUHJvZHVjdFR5cGUgfSBmcm9tICcuLi8uLi9lbnVtcy9wcm9kdWN0VHlwZSc7XG5cbmltcG9ydCB7IEJhc2VSZXNwb25zZSB9IGZyb20gJy4vYmFzZVJlc3BvbnNlJztcblxuZXhwb3J0IGNsYXNzIFBsYW5SZXNwb25zZSBleHRlbmRzIEJhc2VSZXNwb25zZSB7XG4gICAgdHlwZTogUGxhblR5cGU7XG4gICAgcHJvZHVjdDogUHJvZHVjdFR5cGU7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGlzQW5udWFsOiBib29sZWFuO1xuICAgIG5hbWVMb2NhbGl6YXRpb25LZXk6IHN0cmluZztcbiAgICBkZXNjcmlwdGlvbkxvY2FsaXphdGlvbktleTogc3RyaW5nO1xuICAgIGNhbkJlVXNlZEJ5QnVzaW5lc3M6IGJvb2xlYW47XG4gICAgYmFzZVNlYXRzOiBudW1iZXI7XG4gICAgYmFzZVN0b3JhZ2VHYjogbnVtYmVyO1xuICAgIG1heENvbGxlY3Rpb25zOiBudW1iZXI7XG4gICAgbWF4VXNlcnM6IG51bWJlcjtcblxuICAgIGhhc0FkZGl0aW9uYWxTZWF0c09wdGlvbjogYm9vbGVhbjtcbiAgICBtYXhBZGRpdGlvbmFsU2VhdHM6IG51bWJlcjtcbiAgICBoYXNBZGRpdGlvbmFsU3RvcmFnZU9wdGlvbjogYm9vbGVhbjtcbiAgICBtYXhBZGRpdGlvbmFsU3RvcmFnZTogbnVtYmVyO1xuICAgIGhhc1ByZW1pdW1BY2Nlc3NPcHRpb246IGJvb2xlYW47XG4gICAgdHJpYWxQZXJpb2REYXlzOiBudW1iZXI7XG5cbiAgICBoYXNTZWxmSG9zdDogYm9vbGVhbjtcbiAgICBoYXNQb2xpY2llczogYm9vbGVhbjtcbiAgICBoYXNHcm91cHM6IGJvb2xlYW47XG4gICAgaGFzRGlyZWN0b3J5OiBib29sZWFuO1xuICAgIGhhc0V2ZW50czogYm9vbGVhbjtcbiAgICBoYXNUb3RwOiBib29sZWFuO1xuICAgIGhhczJmYTogYm9vbGVhbjtcbiAgICBoYXNBcGk6IGJvb2xlYW47XG4gICAgaGFzU3NvOiBib29sZWFuO1xuICAgIGhhc1Jlc2V0UGFzc3dvcmQ6IGJvb2xlYW47XG4gICAgdXNlcnNHZXRQcmVtaXVtOiBib29sZWFuO1xuXG4gICAgdXBncmFkZVNvcnRPcmRlcjogbnVtYmVyO1xuICAgIGRpc3BsYXlTb3J0T3JkZXI6IG51bWJlcjtcbiAgICBsZWdhY3lZZWFyOiBudW1iZXI7XG4gICAgZGlzYWJsZWQ6IGJvb2xlYW47XG5cbiAgICBzdHJpcGVQbGFuSWQ6IHN0cmluZztcbiAgICBzdHJpcGVTZWF0UGxhbklkOiBzdHJpbmc7XG4gICAgc3RyaXBlU3RvcmFnZVBsYW5JZDogc3RyaW5nO1xuICAgIHN0cmlwZVByZW1pdW1BY2Nlc3NQbGFuSWQ6IHN0cmluZztcbiAgICBiYXNlUHJpY2U6IG51bWJlcjtcbiAgICBzZWF0UHJpY2U6IG51bWJlcjtcbiAgICBhZGRpdGlvbmFsU3RvcmFnZVByaWNlUGVyR2I6IG51bWJlcjtcbiAgICBwcmVtaXVtQWNjZXNzT3B0aW9uUHJpY2U6IG51bWJlcjtcblxuICAgIGNvbnN0cnVjdG9yKHJlc3BvbnNlOiBhbnkpIHtcbiAgICAgICAgc3VwZXIocmVzcG9uc2UpO1xuICAgICAgICB0aGlzLnR5cGUgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ1R5cGUnKTtcbiAgICAgICAgdGhpcy5wcm9kdWN0ID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdQcm9kdWN0Jyk7XG4gICAgICAgIHRoaXMubmFtZSA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnTmFtZScpO1xuICAgICAgICB0aGlzLmlzQW5udWFsID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdJc0FubnVhbCcpO1xuICAgICAgICB0aGlzLm5hbWVMb2NhbGl6YXRpb25LZXkgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ05hbWVMb2NhbGl6YXRpb25LZXknKTtcbiAgICAgICAgdGhpcy5kZXNjcmlwdGlvbkxvY2FsaXphdGlvbktleSA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnRGVzY3JpcHRpb25Mb2NhbGl6YXRpb25LZXknKTtcbiAgICAgICAgdGhpcy5jYW5CZVVzZWRCeUJ1c2luZXNzID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdDYW5CZVVzZWRCeUJ1c2luZXNzJyk7XG4gICAgICAgIHRoaXMuYmFzZVNlYXRzID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdCYXNlU2VhdHMnKTtcbiAgICAgICAgdGhpcy5iYXNlU3RvcmFnZUdiID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdCYXNlU3RvcmFnZUdiJyk7XG4gICAgICAgIHRoaXMubWF4Q29sbGVjdGlvbnMgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ01heENvbGxlY3Rpb25zJyk7XG4gICAgICAgIHRoaXMubWF4VXNlcnMgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ01heFVzZXJzJyk7XG4gICAgICAgIHRoaXMuaGFzQWRkaXRpb25hbFNlYXRzT3B0aW9uID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdIYXNBZGRpdGlvbmFsU2VhdHNPcHRpb24nKTtcbiAgICAgICAgdGhpcy5tYXhBZGRpdGlvbmFsU2VhdHMgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ01heEFkZGl0aW9uYWxTZWF0cycpO1xuICAgICAgICB0aGlzLmhhc0FkZGl0aW9uYWxTdG9yYWdlT3B0aW9uID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdIYXNBZGRpdGlvbmFsU3RvcmFnZU9wdGlvbicpO1xuICAgICAgICB0aGlzLm1heEFkZGl0aW9uYWxTdG9yYWdlID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdNYXhBZGRpdGlvbmFsU3RvcmFnZScpO1xuICAgICAgICB0aGlzLmhhc1ByZW1pdW1BY2Nlc3NPcHRpb24gPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ0hhc1ByZW1pdW1BY2Nlc3NPcHRpb24nKTtcbiAgICAgICAgdGhpcy50cmlhbFBlcmlvZERheXMgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ1RyaWFsUGVyaW9kRGF5cycpO1xuICAgICAgICB0aGlzLmhhc1NlbGZIb3N0ID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdIYXNTZWxmSG9zdCcpO1xuICAgICAgICB0aGlzLmhhc1BvbGljaWVzID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdIYXNQb2xpY2llcycpO1xuICAgICAgICB0aGlzLmhhc0dyb3VwcyA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnSGFzR3JvdXBzJyk7XG4gICAgICAgIHRoaXMuaGFzRGlyZWN0b3J5ID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdIYXNEaXJlY3RvcnknKTtcbiAgICAgICAgdGhpcy5oYXNFdmVudHMgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ0hhc0V2ZW50cycpO1xuICAgICAgICB0aGlzLmhhc1RvdHAgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ0hhc1RvdHAnKTtcbiAgICAgICAgdGhpcy5oYXMyZmEgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ0hhczJmYScpO1xuICAgICAgICB0aGlzLmhhc0FwaSA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnSGFzQXBpJyk7XG4gICAgICAgIHRoaXMuaGFzU3NvID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdIYXNTc28nKTtcbiAgICAgICAgdGhpcy5oYXNSZXNldFBhc3N3b3JkID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdIYXNSZXNldFBhc3N3b3JkJyk7XG4gICAgICAgIHRoaXMudXNlcnNHZXRQcmVtaXVtID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdVc2Vyc0dldFByZW1pdW0nKTtcbiAgICAgICAgdGhpcy51cGdyYWRlU29ydE9yZGVyID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdVcGdyYWRlU29ydE9yZGVyJyk7XG4gICAgICAgIHRoaXMuZGlzcGxheVNvcnRPcmRlciA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnU29ydE9yZGVyJyk7XG4gICAgICAgIHRoaXMubGVnYWN5WWVhciA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnTGVnYWN5WWVhcicpO1xuICAgICAgICB0aGlzLmRpc2FibGVkID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdEaXNhYmxlZCcpO1xuICAgICAgICB0aGlzLnN0cmlwZVBsYW5JZCA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnU3RyaXBlUGxhbklkJyk7XG4gICAgICAgIHRoaXMuc3RyaXBlU2VhdFBsYW5JZCA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnU3RyaXBlU2VhdFBsYW5JZCcpO1xuICAgICAgICB0aGlzLnN0cmlwZVN0b3JhZ2VQbGFuSWQgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ1N0cmlwZVN0b3JhZ2VQbGFuSWQnKTtcbiAgICAgICAgdGhpcy5zdHJpcGVQcmVtaXVtQWNjZXNzUGxhbklkID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdTdHJpcGVQcmVtaXVtQWNjZXNzUGxhbklkJyk7XG4gICAgICAgIHRoaXMuYmFzZVByaWNlID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdCYXNlUHJpY2UnKTtcbiAgICAgICAgdGhpcy5zZWF0UHJpY2UgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ1NlYXRQcmljZScpO1xuICAgICAgICB0aGlzLmFkZGl0aW9uYWxTdG9yYWdlUHJpY2VQZXJHYiA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnQWRkaXRpb25hbFN0b3JhZ2VQcmljZVBlckdiJyk7XG4gICAgICAgIHRoaXMucHJlbWl1bUFjY2Vzc09wdGlvblByaWNlID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdQcmVtaXVtQWNjZXNzT3B0aW9uUHJpY2UnKTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBCYXNlUmVzcG9uc2UgfSBmcm9tICcuL2Jhc2VSZXNwb25zZSc7XG5cbmltcG9ydCB7IFBvbGljeVR5cGUgfSBmcm9tICcuLi8uLi9lbnVtcy9wb2xpY3lUeXBlJztcblxuZXhwb3J0IGNsYXNzIFBvbGljeVJlc3BvbnNlIGV4dGVuZHMgQmFzZVJlc3BvbnNlIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIG9yZ2FuaXphdGlvbklkOiBzdHJpbmc7XG4gICAgdHlwZTogUG9saWN5VHlwZTtcbiAgICBkYXRhOiBhbnk7XG4gICAgZW5hYmxlZDogYm9vbGVhbjtcblxuICAgIGNvbnN0cnVjdG9yKHJlc3BvbnNlOiBhbnkpIHtcbiAgICAgICAgc3VwZXIocmVzcG9uc2UpO1xuICAgICAgICB0aGlzLmlkID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdJZCcpO1xuICAgICAgICB0aGlzLm9yZ2FuaXphdGlvbklkID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdPcmdhbml6YXRpb25JZCcpO1xuICAgICAgICB0aGlzLnR5cGUgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ1R5cGUnKTtcbiAgICAgICAgdGhpcy5kYXRhID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdEYXRhJyk7XG4gICAgICAgIHRoaXMuZW5hYmxlZCA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnRW5hYmxlZCcpO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IEJhc2VSZXNwb25zZSB9IGZyb20gJy4vYmFzZVJlc3BvbnNlJztcblxuaW1wb3J0IHsgS2RmVHlwZSB9IGZyb20gJy4uLy4uL2VudW1zL2tkZlR5cGUnO1xuXG5leHBvcnQgY2xhc3MgUHJlbG9naW5SZXNwb25zZSBleHRlbmRzIEJhc2VSZXNwb25zZSB7XG4gICAga2RmOiBLZGZUeXBlO1xuICAgIGtkZkl0ZXJhdGlvbnM6IG51bWJlcjtcblxuICAgIGNvbnN0cnVjdG9yKHJlc3BvbnNlOiBhbnkpIHtcbiAgICAgICAgc3VwZXIocmVzcG9uc2UpO1xuICAgICAgICB0aGlzLmtkZiA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnS2RmJyk7XG4gICAgICAgIHRoaXMua2RmSXRlcmF0aW9ucyA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnS2RmSXRlcmF0aW9ucycpO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IEJhc2VSZXNwb25zZSB9IGZyb20gJy4vYmFzZVJlc3BvbnNlJztcblxuaW1wb3J0IHsgT3JnYW5pemF0aW9uVXNlclN0YXR1c1R5cGUgfSBmcm9tICcuLi8uLi9lbnVtcy9vcmdhbml6YXRpb25Vc2VyU3RhdHVzVHlwZSc7XG5pbXBvcnQgeyBPcmdhbml6YXRpb25Vc2VyVHlwZSB9IGZyb20gJy4uLy4uL2VudW1zL29yZ2FuaXphdGlvblVzZXJUeXBlJztcbmltcG9ydCB7IFBlcm1pc3Npb25zQXBpIH0gZnJvbSAnLi4vYXBpL3Blcm1pc3Npb25zQXBpJztcblxuZXhwb3J0IGNsYXNzIFByb2ZpbGVPcmdhbml6YXRpb25SZXNwb25zZSBleHRlbmRzIEJhc2VSZXNwb25zZSB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgdXNlUG9saWNpZXM6IGJvb2xlYW47XG4gICAgdXNlR3JvdXBzOiBib29sZWFuO1xuICAgIHVzZURpcmVjdG9yeTogYm9vbGVhbjtcbiAgICB1c2VFdmVudHM6IGJvb2xlYW47XG4gICAgdXNlVG90cDogYm9vbGVhbjtcbiAgICB1c2UyZmE6IGJvb2xlYW47XG4gICAgdXNlQXBpOiBib29sZWFuO1xuICAgIHVzZVNzbzogYm9vbGVhbjtcbiAgICB1c2VSZXNldFBhc3N3b3JkOiBib29sZWFuO1xuICAgIHNlbGZIb3N0OiBib29sZWFuO1xuICAgIHVzZXJzR2V0UHJlbWl1bTogYm9vbGVhbjtcbiAgICBzZWF0czogbnVtYmVyO1xuICAgIG1heENvbGxlY3Rpb25zOiBudW1iZXI7XG4gICAgbWF4U3RvcmFnZUdiPzogbnVtYmVyO1xuICAgIGtleTogc3RyaW5nO1xuICAgIGhhc1B1YmxpY0FuZFByaXZhdGVLZXlzOiBib29sZWFuO1xuICAgIHN0YXR1czogT3JnYW5pemF0aW9uVXNlclN0YXR1c1R5cGU7XG4gICAgdHlwZTogT3JnYW5pemF0aW9uVXNlclR5cGU7XG4gICAgZW5hYmxlZDogYm9vbGVhbjtcbiAgICBzc29Cb3VuZDogYm9vbGVhbjtcbiAgICBpZGVudGlmaWVyOiBzdHJpbmc7XG4gICAgcGVybWlzc2lvbnM6IFBlcm1pc3Npb25zQXBpO1xuICAgIHJlc2V0UGFzc3dvcmRFbnJvbGxlZDogYm9vbGVhbjtcbiAgICB1c2VySWQ6IHN0cmluZztcbiAgICBwcm92aWRlcklkOiBzdHJpbmc7XG4gICAgcHJvdmlkZXJOYW1lOiBzdHJpbmc7XG5cbiAgICBjb25zdHJ1Y3RvcihyZXNwb25zZTogYW55KSB7XG4gICAgICAgIHN1cGVyKHJlc3BvbnNlKTtcbiAgICAgICAgdGhpcy5pZCA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnSWQnKTtcbiAgICAgICAgdGhpcy5uYW1lID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdOYW1lJyk7XG4gICAgICAgIHRoaXMudXNlUG9saWNpZXMgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ1VzZVBvbGljaWVzJyk7XG4gICAgICAgIHRoaXMudXNlR3JvdXBzID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdVc2VHcm91cHMnKTtcbiAgICAgICAgdGhpcy51c2VEaXJlY3RvcnkgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ1VzZURpcmVjdG9yeScpO1xuICAgICAgICB0aGlzLnVzZUV2ZW50cyA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnVXNlRXZlbnRzJyk7XG4gICAgICAgIHRoaXMudXNlVG90cCA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnVXNlVG90cCcpO1xuICAgICAgICB0aGlzLnVzZTJmYSA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnVXNlMmZhJyk7XG4gICAgICAgIHRoaXMudXNlQXBpID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdVc2VBcGknKTtcbiAgICAgICAgdGhpcy51c2VTc28gPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ1VzZVNzbycpO1xuICAgICAgICB0aGlzLnVzZVJlc2V0UGFzc3dvcmQgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ1VzZVJlc2V0UGFzc3dvcmQnKTtcbiAgICAgICAgdGhpcy5zZWxmSG9zdCA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnU2VsZkhvc3QnKTtcbiAgICAgICAgdGhpcy51c2Vyc0dldFByZW1pdW0gPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ1VzZXJzR2V0UHJlbWl1bScpO1xuICAgICAgICB0aGlzLnNlYXRzID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdTZWF0cycpO1xuICAgICAgICB0aGlzLm1heENvbGxlY3Rpb25zID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdNYXhDb2xsZWN0aW9ucycpO1xuICAgICAgICB0aGlzLm1heFN0b3JhZ2VHYiA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnTWF4U3RvcmFnZUdiJyk7XG4gICAgICAgIHRoaXMua2V5ID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdLZXknKTtcbiAgICAgICAgdGhpcy5oYXNQdWJsaWNBbmRQcml2YXRlS2V5cyA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnSGFzUHVibGljQW5kUHJpdmF0ZUtleXMnKTtcbiAgICAgICAgdGhpcy5zdGF0dXMgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ1N0YXR1cycpO1xuICAgICAgICB0aGlzLnR5cGUgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ1R5cGUnKTtcbiAgICAgICAgdGhpcy5lbmFibGVkID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdFbmFibGVkJyk7XG4gICAgICAgIHRoaXMuc3NvQm91bmQgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ1Nzb0JvdW5kJyk7XG4gICAgICAgIHRoaXMuaWRlbnRpZmllciA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnSWRlbnRpZmllcicpO1xuICAgICAgICB0aGlzLnBlcm1pc3Npb25zID0gbmV3IFBlcm1pc3Npb25zQXBpKHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgncGVybWlzc2lvbnMnKSk7XG4gICAgICAgIHRoaXMucmVzZXRQYXNzd29yZEVucm9sbGVkID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdSZXNldFBhc3N3b3JkRW5yb2xsZWQnKTtcbiAgICAgICAgdGhpcy51c2VySWQgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ1VzZXJJZCcpO1xuICAgICAgICB0aGlzLnByb3ZpZGVySWQgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ1Byb3ZpZGVySWQnKTtcbiAgICAgICAgdGhpcy5wcm92aWRlck5hbWUgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ1Byb3ZpZGVyTmFtZScpO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IEJhc2VSZXNwb25zZSB9IGZyb20gJy4vYmFzZVJlc3BvbnNlJztcblxuaW1wb3J0IHsgT3JnYW5pemF0aW9uVXNlclN0YXR1c1R5cGUgfSBmcm9tICcuLi8uLi9lbnVtcy9vcmdhbml6YXRpb25Vc2VyU3RhdHVzVHlwZSc7XG5pbXBvcnQgeyBPcmdhbml6YXRpb25Vc2VyVHlwZSB9IGZyb20gJy4uLy4uL2VudW1zL29yZ2FuaXphdGlvblVzZXJUeXBlJztcbmltcG9ydCB7IFBlcm1pc3Npb25zQXBpIH0gZnJvbSAnLi4vYXBpL3Blcm1pc3Npb25zQXBpJztcblxuZXhwb3J0IGNsYXNzIFByb2ZpbGVQcm92aWRlck9yZ2FuaXphdGlvblJlc3BvbnNlIGV4dGVuZHMgQmFzZVJlc3BvbnNlIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIG5hbWU6IHN0cmluZztcbiAgICB1c2VQb2xpY2llczogYm9vbGVhbjtcbiAgICB1c2VHcm91cHM6IGJvb2xlYW47XG4gICAgdXNlRGlyZWN0b3J5OiBib29sZWFuO1xuICAgIHVzZUV2ZW50czogYm9vbGVhbjtcbiAgICB1c2VUb3RwOiBib29sZWFuO1xuICAgIHVzZTJmYTogYm9vbGVhbjtcbiAgICB1c2VBcGk6IGJvb2xlYW47XG4gICAgdXNlU3NvOiBib29sZWFuO1xuICAgIHVzZVJlc2V0UGFzc3dvcmQ6IGJvb2xlYW47XG4gICAgc2VsZkhvc3Q6IGJvb2xlYW47XG4gICAgdXNlcnNHZXRQcmVtaXVtOiBib29sZWFuO1xuICAgIHNlYXRzOiBudW1iZXI7XG4gICAgbWF4Q29sbGVjdGlvbnM6IG51bWJlcjtcbiAgICBtYXhTdG9yYWdlR2I/OiBudW1iZXI7XG4gICAga2V5OiBzdHJpbmc7XG4gICAgaGFzUHVibGljQW5kUHJpdmF0ZUtleXM6IGJvb2xlYW47XG4gICAgc3RhdHVzOiBPcmdhbml6YXRpb25Vc2VyU3RhdHVzVHlwZTtcbiAgICB0eXBlOiBPcmdhbml6YXRpb25Vc2VyVHlwZTtcbiAgICBlbmFibGVkOiBib29sZWFuO1xuICAgIHNzb0JvdW5kOiBib29sZWFuO1xuICAgIGlkZW50aWZpZXI6IHN0cmluZztcbiAgICBwZXJtaXNzaW9uczogUGVybWlzc2lvbnNBcGk7XG4gICAgcmVzZXRQYXNzd29yZEVucm9sbGVkOiBib29sZWFuO1xuICAgIHVzZXJJZDogc3RyaW5nO1xuICAgIHByb3ZpZGVySWQ6IHN0cmluZztcbiAgICBwcm92aWRlck5hbWU6IHN0cmluZztcblxuICAgIGNvbnN0cnVjdG9yKHJlc3BvbnNlOiBhbnkpIHtcbiAgICAgICAgc3VwZXIocmVzcG9uc2UpO1xuICAgICAgICB0aGlzLmlkID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdJZCcpO1xuICAgICAgICB0aGlzLm5hbWUgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ05hbWUnKTtcbiAgICAgICAgdGhpcy51c2VQb2xpY2llcyA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnVXNlUG9saWNpZXMnKTtcbiAgICAgICAgdGhpcy51c2VHcm91cHMgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ1VzZUdyb3VwcycpO1xuICAgICAgICB0aGlzLnVzZURpcmVjdG9yeSA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnVXNlRGlyZWN0b3J5Jyk7XG4gICAgICAgIHRoaXMudXNlRXZlbnRzID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdVc2VFdmVudHMnKTtcbiAgICAgICAgdGhpcy51c2VUb3RwID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdVc2VUb3RwJyk7XG4gICAgICAgIHRoaXMudXNlMmZhID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdVc2UyZmEnKTtcbiAgICAgICAgdGhpcy51c2VBcGkgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ1VzZUFwaScpO1xuICAgICAgICB0aGlzLnVzZVNzbyA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnVXNlU3NvJyk7XG4gICAgICAgIHRoaXMudXNlUmVzZXRQYXNzd29yZCA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnVXNlUmVzZXRQYXNzd29yZCcpO1xuICAgICAgICB0aGlzLnNlbGZIb3N0ID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdTZWxmSG9zdCcpO1xuICAgICAgICB0aGlzLnVzZXJzR2V0UHJlbWl1bSA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnVXNlcnNHZXRQcmVtaXVtJyk7XG4gICAgICAgIHRoaXMuc2VhdHMgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ1NlYXRzJyk7XG4gICAgICAgIHRoaXMubWF4Q29sbGVjdGlvbnMgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ01heENvbGxlY3Rpb25zJyk7XG4gICAgICAgIHRoaXMubWF4U3RvcmFnZUdiID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdNYXhTdG9yYWdlR2InKTtcbiAgICAgICAgdGhpcy5rZXkgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ0tleScpO1xuICAgICAgICB0aGlzLmhhc1B1YmxpY0FuZFByaXZhdGVLZXlzID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdIYXNQdWJsaWNBbmRQcml2YXRlS2V5cycpO1xuICAgICAgICB0aGlzLnN0YXR1cyA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnU3RhdHVzJyk7XG4gICAgICAgIHRoaXMudHlwZSA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnVHlwZScpO1xuICAgICAgICB0aGlzLmVuYWJsZWQgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ0VuYWJsZWQnKTtcbiAgICAgICAgdGhpcy5zc29Cb3VuZCA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnU3NvQm91bmQnKTtcbiAgICAgICAgdGhpcy5pZGVudGlmaWVyID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdJZGVudGlmaWVyJyk7XG4gICAgICAgIHRoaXMucGVybWlzc2lvbnMgPSBuZXcgUGVybWlzc2lvbnNBcGkodGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdwZXJtaXNzaW9ucycpKTtcbiAgICAgICAgdGhpcy5yZXNldFBhc3N3b3JkRW5yb2xsZWQgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ1Jlc2V0UGFzc3dvcmRFbnJvbGxlZCcpO1xuICAgICAgICB0aGlzLnVzZXJJZCA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnVXNlcklkJyk7XG4gICAgICAgIHRoaXMucHJvdmlkZXJJZCA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnUHJvdmlkZXJJZCcpO1xuICAgICAgICB0aGlzLnByb3ZpZGVyTmFtZSA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnUHJvdmlkZXJOYW1lJyk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgQmFzZVJlc3BvbnNlIH0gZnJvbSAnLi9iYXNlUmVzcG9uc2UnO1xuXG5pbXBvcnQgeyBQcm92aWRlclVzZXJTdGF0dXNUeXBlIH0gZnJvbSAnLi4vLi4vZW51bXMvcHJvdmlkZXJVc2VyU3RhdHVzVHlwZSc7XG5pbXBvcnQgeyBQcm92aWRlclVzZXJUeXBlIH0gZnJvbSAnLi4vLi4vZW51bXMvcHJvdmlkZXJVc2VyVHlwZSc7XG5cbmltcG9ydCB7IFBlcm1pc3Npb25zQXBpIH0gZnJvbSAnLi4vYXBpL3Blcm1pc3Npb25zQXBpJztcblxuZXhwb3J0IGNsYXNzIFByb2ZpbGVQcm92aWRlclJlc3BvbnNlIGV4dGVuZHMgQmFzZVJlc3BvbnNlIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBrZXk6IHN0cmluZztcbiAgICBzdGF0dXM6IFByb3ZpZGVyVXNlclN0YXR1c1R5cGU7XG4gICAgdHlwZTogUHJvdmlkZXJVc2VyVHlwZTtcbiAgICBlbmFibGVkOiBib29sZWFuO1xuICAgIHBlcm1pc3Npb25zOiBQZXJtaXNzaW9uc0FwaTtcbiAgICB1c2VySWQ6IHN0cmluZztcbiAgICB1c2VFdmVudHM6IGJvb2xlYW47XG5cbiAgICBjb25zdHJ1Y3RvcihyZXNwb25zZTogYW55KSB7XG4gICAgICAgIHN1cGVyKHJlc3BvbnNlKTtcbiAgICAgICAgdGhpcy5pZCA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnSWQnKTtcbiAgICAgICAgdGhpcy5uYW1lID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdOYW1lJyk7XG4gICAgICAgIHRoaXMua2V5ID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdLZXknKTtcbiAgICAgICAgdGhpcy5zdGF0dXMgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ1N0YXR1cycpO1xuICAgICAgICB0aGlzLnR5cGUgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ1R5cGUnKTtcbiAgICAgICAgdGhpcy5lbmFibGVkID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdFbmFibGVkJyk7XG4gICAgICAgIHRoaXMucGVybWlzc2lvbnMgPSBuZXcgUGVybWlzc2lvbnNBcGkodGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdwZXJtaXNzaW9ucycpKTtcbiAgICAgICAgdGhpcy51c2VySWQgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ1VzZXJJZCcpO1xuICAgICAgICB0aGlzLnVzZUV2ZW50cyA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnVXNlRXZlbnRzJyk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgQmFzZVJlc3BvbnNlIH0gZnJvbSAnLi9iYXNlUmVzcG9uc2UnO1xuaW1wb3J0IHsgUHJvZmlsZU9yZ2FuaXphdGlvblJlc3BvbnNlIH0gZnJvbSAnLi9wcm9maWxlT3JnYW5pemF0aW9uUmVzcG9uc2UnO1xuaW1wb3J0IHsgUHJvZmlsZVByb3ZpZGVyT3JnYW5pemF0aW9uUmVzcG9uc2UgfSBmcm9tICcuL3Byb2ZpbGVQcm92aWRlck9yZ2FuaXphdGlvblJlc3BvbnNlJztcbmltcG9ydCB7IFByb2ZpbGVQcm92aWRlclJlc3BvbnNlIH0gZnJvbSAnLi9wcm9maWxlUHJvdmlkZXJSZXNwb25zZSc7XG5cbmV4cG9ydCBjbGFzcyBQcm9maWxlUmVzcG9uc2UgZXh0ZW5kcyBCYXNlUmVzcG9uc2Uge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGVtYWlsOiBzdHJpbmc7XG4gICAgZW1haWxWZXJpZmllZDogYm9vbGVhbjtcbiAgICBtYXN0ZXJQYXNzd29yZEhpbnQ6IHN0cmluZztcbiAgICBwcmVtaXVtOiBib29sZWFuO1xuICAgIGN1bHR1cmU6IHN0cmluZztcbiAgICB0d29GYWN0b3JFbmFibGVkOiBib29sZWFuO1xuICAgIGtleTogc3RyaW5nO1xuICAgIHByaXZhdGVLZXk6IHN0cmluZztcbiAgICBzZWN1cml0eVN0YW1wOiBzdHJpbmc7XG4gICAgZm9yY2VQYXNzd29yZFJlc2V0OiBib29sZWFuO1xuICAgIG9yZ2FuaXphdGlvbnM6IFByb2ZpbGVPcmdhbml6YXRpb25SZXNwb25zZVtdID0gW107XG4gICAgcHJvdmlkZXJzOiBQcm9maWxlUHJvdmlkZXJSZXNwb25zZVtdID0gW107XG4gICAgcHJvdmlkZXJPcmdhbml6YXRpb25zOiBQcm9maWxlUHJvdmlkZXJPcmdhbml6YXRpb25SZXNwb25zZVtdID0gW107XG5cbiAgICBjb25zdHJ1Y3RvcihyZXNwb25zZTogYW55KSB7XG4gICAgICAgIHN1cGVyKHJlc3BvbnNlKTtcbiAgICAgICAgdGhpcy5pZCA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnSWQnKTtcbiAgICAgICAgdGhpcy5uYW1lID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdOYW1lJyk7XG4gICAgICAgIHRoaXMuZW1haWwgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ0VtYWlsJyk7XG4gICAgICAgIHRoaXMuZW1haWxWZXJpZmllZCA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnRW1haWxWZXJpZmllZCcpO1xuICAgICAgICB0aGlzLm1hc3RlclBhc3N3b3JkSGludCA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnTWFzdGVyUGFzc3dvcmRIaW50Jyk7XG4gICAgICAgIHRoaXMucHJlbWl1bSA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnUHJlbWl1bScpO1xuICAgICAgICB0aGlzLmN1bHR1cmUgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ0N1bHR1cmUnKTtcbiAgICAgICAgdGhpcy50d29GYWN0b3JFbmFibGVkID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdUd29GYWN0b3JFbmFibGVkJyk7XG4gICAgICAgIHRoaXMua2V5ID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdLZXknKTtcbiAgICAgICAgdGhpcy5wcml2YXRlS2V5ID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdQcml2YXRlS2V5Jyk7XG4gICAgICAgIHRoaXMuc2VjdXJpdHlTdGFtcCA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnU2VjdXJpdHlTdGFtcCcpO1xuICAgICAgICB0aGlzLmZvcmNlUGFzc3dvcmRSZXNldCA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnRm9yY2VQYXNzd29yZFJlc2V0JykgPz8gZmFsc2U7XG5cbiAgICAgICAgY29uc3Qgb3JnYW5pemF0aW9ucyA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnT3JnYW5pemF0aW9ucycpO1xuICAgICAgICBpZiAob3JnYW5pemF0aW9ucyAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLm9yZ2FuaXphdGlvbnMgPSBvcmdhbml6YXRpb25zLm1hcCgobzogYW55KSA9PiBuZXcgUHJvZmlsZU9yZ2FuaXphdGlvblJlc3BvbnNlKG8pKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwcm92aWRlcnMgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ1Byb3ZpZGVycycpO1xuICAgICAgICBpZiAocHJvdmlkZXJzICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMucHJvdmlkZXJzID0gcHJvdmlkZXJzLm1hcCgobzogYW55KSA9PiBuZXcgUHJvZmlsZVByb3ZpZGVyUmVzcG9uc2UobykpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHByb3ZpZGVyT3JnYW5pemF0aW9ucyA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnUHJvdmlkZXJPcmdhbml6YXRpb25zJyk7XG4gICAgICAgIGlmIChwcm92aWRlck9yZ2FuaXphdGlvbnMgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5wcm92aWRlck9yZ2FuaXphdGlvbnMgPSBwcm92aWRlck9yZ2FuaXphdGlvbnMubWFwKChvOiBhbnkpID0+IG5ldyBQcm9maWxlUHJvdmlkZXJPcmdhbml6YXRpb25SZXNwb25zZShvKSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgeyBCYXNlUmVzcG9uc2UgfSBmcm9tICcuLi9iYXNlUmVzcG9uc2UnO1xuXG5leHBvcnQgY2xhc3MgUHJvdmlkZXJPcmdhbml6YXRpb25SZXNwb25zZSBleHRlbmRzIEJhc2VSZXNwb25zZSB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBwcm92aWRlcklkOiBzdHJpbmc7XG4gICAgb3JnYW5pemF0aW9uSWQ6IHN0cmluZztcbiAgICBrZXk6IHN0cmluZztcbiAgICBzZXR0aW5nczogc3RyaW5nO1xuICAgIGNyZWF0aW9uRGF0ZTogc3RyaW5nO1xuICAgIHJldmlzaW9uRGF0ZTogc3RyaW5nO1xuXG4gICAgY29uc3RydWN0b3IocmVzcG9uc2U6IGFueSkge1xuICAgICAgICBzdXBlcihyZXNwb25zZSk7XG4gICAgICAgIHRoaXMuaWQgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ0lkJyk7XG4gICAgICAgIHRoaXMucHJvdmlkZXJJZCA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnUHJvdmlkZXJJZCcpO1xuICAgICAgICB0aGlzLm9yZ2FuaXphdGlvbklkID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdPcmdhbml6YXRpb25JZCcpO1xuICAgICAgICB0aGlzLmtleSA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnS2V5Jyk7XG4gICAgICAgIHRoaXMuc2V0dGluZ3MgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ1NldHRpbmdzJyk7XG4gICAgICAgIHRoaXMuY3JlYXRpb25EYXRlID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdDcmVhdGlvbkRhdGUnKTtcbiAgICAgICAgdGhpcy5yZXZpc2lvbkRhdGUgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ1JldmlzaW9uRGF0ZScpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFByb3ZpZGVyT3JnYW5pemF0aW9uT3JnYW5pemF0aW9uRGV0YWlsc1Jlc3BvbnNlIGV4dGVuZHMgUHJvdmlkZXJPcmdhbml6YXRpb25SZXNwb25zZSB7XG4gICAgb3JnYW5pemF0aW9uTmFtZTogc3RyaW5nO1xuXG4gICAgY29uc3RydWN0b3IocmVzcG9uc2U6IGFueSkge1xuICAgICAgICBzdXBlcihyZXNwb25zZSk7XG4gICAgICAgIHRoaXMub3JnYW5pemF0aW9uTmFtZSA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnT3JnYW5pemF0aW9uTmFtZScpO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IEJhc2VSZXNwb25zZSB9IGZyb20gJy4uL2Jhc2VSZXNwb25zZSc7XG5cbmV4cG9ydCBjbGFzcyBQcm92aWRlclJlc3BvbnNlIGV4dGVuZHMgQmFzZVJlc3BvbnNlIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBidXNpbmVzc05hbWU6IHN0cmluZztcbiAgICBiaWxsaW5nRW1haWw6IHN0cmluZztcblxuICAgIGNvbnN0cnVjdG9yKHJlc3BvbnNlOiBhbnkpIHtcbiAgICAgICAgc3VwZXIocmVzcG9uc2UpO1xuICAgICAgICB0aGlzLmlkID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdJZCcpO1xuICAgICAgICB0aGlzLm5hbWUgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ05hbWUnKTtcbiAgICAgICAgdGhpcy5idXNpbmVzc05hbWUgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ0J1c2luZXNzTmFtZScpO1xuICAgICAgICB0aGlzLmJpbGxpbmdFbWFpbCA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnQmlsbGluZ0VtYWlsJyk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgT3JnYW5pemF0aW9uVXNlckJ1bGtQdWJsaWNLZXlSZXNwb25zZSB9IGZyb20gJy4uL29yZ2FuaXphdGlvblVzZXJCdWxrUHVibGljS2V5UmVzcG9uc2UnO1xuXG5leHBvcnQgY2xhc3MgUHJvdmlkZXJVc2VyQnVsa1B1YmxpY0tleVJlc3BvbnNlIGV4dGVuZHMgT3JnYW5pemF0aW9uVXNlckJ1bGtQdWJsaWNLZXlSZXNwb25zZSB7XG5cbn1cbiIsImltcG9ydCB7IEJhc2VSZXNwb25zZSB9IGZyb20gJy4uL2Jhc2VSZXNwb25zZSc7XG5cbmV4cG9ydCBjbGFzcyBQcm92aWRlclVzZXJCdWxrUmVzcG9uc2UgZXh0ZW5kcyBCYXNlUmVzcG9uc2Uge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgZXJyb3I6IHN0cmluZztcblxuICAgIGNvbnN0cnVjdG9yKHJlc3BvbnNlOiBhbnkpIHtcbiAgICAgICAgc3VwZXIocmVzcG9uc2UpO1xuICAgICAgICB0aGlzLmlkID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdJZCcpO1xuICAgICAgICB0aGlzLmVycm9yID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdFcnJvcicpO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IEJhc2VSZXNwb25zZSB9IGZyb20gJy4uL2Jhc2VSZXNwb25zZSc7XG5cbmltcG9ydCB7IFBlcm1pc3Npb25zQXBpIH0gZnJvbSAnLi4vLi4vYXBpL3Blcm1pc3Npb25zQXBpJztcblxuaW1wb3J0IHsgUHJvdmlkZXJVc2VyU3RhdHVzVHlwZSB9IGZyb20gJy4uLy4uLy4uL2VudW1zL3Byb3ZpZGVyVXNlclN0YXR1c1R5cGUnO1xuaW1wb3J0IHsgUHJvdmlkZXJVc2VyVHlwZSB9IGZyb20gJy4uLy4uLy4uL2VudW1zL3Byb3ZpZGVyVXNlclR5cGUnO1xuXG5leHBvcnQgY2xhc3MgUHJvdmlkZXJVc2VyUmVzcG9uc2UgZXh0ZW5kcyBCYXNlUmVzcG9uc2Uge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgdXNlcklkOiBzdHJpbmc7XG4gICAgdHlwZTogUHJvdmlkZXJVc2VyVHlwZTtcbiAgICBzdGF0dXM6IFByb3ZpZGVyVXNlclN0YXR1c1R5cGU7XG4gICAgcGVybWlzc2lvbnM6IFBlcm1pc3Npb25zQXBpO1xuXG4gICAgY29uc3RydWN0b3IocmVzcG9uc2U6IGFueSkge1xuICAgICAgICBzdXBlcihyZXNwb25zZSk7XG4gICAgICAgIHRoaXMuaWQgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ0lkJyk7XG4gICAgICAgIHRoaXMudXNlcklkID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdVc2VySWQnKTtcbiAgICAgICAgdGhpcy50eXBlID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdUeXBlJyk7XG4gICAgICAgIHRoaXMuc3RhdHVzID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdTdGF0dXMnKTtcbiAgICAgICAgdGhpcy5wZXJtaXNzaW9ucyA9IG5ldyBQZXJtaXNzaW9uc0FwaSh0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ1Blcm1pc3Npb25zJykpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFByb3ZpZGVyVXNlclVzZXJEZXRhaWxzUmVzcG9uc2UgZXh0ZW5kcyBQcm92aWRlclVzZXJSZXNwb25zZSB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGVtYWlsOiBzdHJpbmc7XG5cbiAgICBjb25zdHJ1Y3RvcihyZXNwb25zZTogYW55KSB7XG4gICAgICAgIHN1cGVyKHJlc3BvbnNlKTtcbiAgICAgICAgdGhpcy5uYW1lID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdOYW1lJyk7XG4gICAgICAgIHRoaXMuZW1haWwgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ0VtYWlsJyk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgQmFzZVJlc3BvbnNlIH0gZnJvbSAnLi9iYXNlUmVzcG9uc2UnO1xuXG5leHBvcnQgY2xhc3MgU2VsZWN0aW9uUmVhZE9ubHlSZXNwb25zZSBleHRlbmRzIEJhc2VSZXNwb25zZSB7XG4gICAgaWQ6IHN0cmluZztcbiAgICByZWFkT25seTogYm9vbGVhbjtcbiAgICBoaWRlUGFzc3dvcmRzOiBib29sZWFuO1xuXG4gICAgY29uc3RydWN0b3IocmVzcG9uc2U6IGFueSkge1xuICAgICAgICBzdXBlcihyZXNwb25zZSk7XG4gICAgICAgIHRoaXMuaWQgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ0lkJyk7XG4gICAgICAgIHRoaXMucmVhZE9ubHkgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ1JlYWRPbmx5Jyk7XG4gICAgICAgIHRoaXMuaGlkZVBhc3N3b3JkcyA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnSGlkZVBhc3N3b3JkcycpO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IEJhc2VSZXNwb25zZSB9IGZyb20gJy4vYmFzZVJlc3BvbnNlJztcblxuaW1wb3J0IHsgU2VuZFR5cGUgfSBmcm9tICcuLi8uLi9lbnVtcy9zZW5kVHlwZSc7XG5cbmltcG9ydCB7IFNlbmRGaWxlQXBpIH0gZnJvbSAnLi4vYXBpL3NlbmRGaWxlQXBpJztcbmltcG9ydCB7IFNlbmRUZXh0QXBpIH0gZnJvbSAnLi4vYXBpL3NlbmRUZXh0QXBpJztcblxuZXhwb3J0IGNsYXNzIFNlbmRBY2Nlc3NSZXNwb25zZSBleHRlbmRzIEJhc2VSZXNwb25zZSB7XG4gICAgaWQ6IHN0cmluZztcbiAgICB0eXBlOiBTZW5kVHlwZTtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgZmlsZTogU2VuZEZpbGVBcGk7XG4gICAgdGV4dDogU2VuZFRleHRBcGk7XG4gICAgZXhwaXJhdGlvbkRhdGU6IERhdGU7XG4gICAgY3JlYXRvcklkZW50aWZpZXI6IHN0cmluZztcblxuICAgIGNvbnN0cnVjdG9yKHJlc3BvbnNlOiBhbnkpIHtcbiAgICAgICAgc3VwZXIocmVzcG9uc2UpO1xuICAgICAgICB0aGlzLmlkID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdJZCcpO1xuICAgICAgICB0aGlzLnR5cGUgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ1R5cGUnKTtcbiAgICAgICAgdGhpcy5uYW1lID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdOYW1lJyk7XG5cbiAgICAgICAgY29uc3QgdGV4dCA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnVGV4dCcpO1xuICAgICAgICBpZiAodGV4dCAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnRleHQgPSBuZXcgU2VuZFRleHRBcGkodGV4dCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaWxlID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdGaWxlJyk7XG4gICAgICAgIGlmIChmaWxlICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuZmlsZSA9IG5ldyBTZW5kRmlsZUFwaShmaWxlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZXhwaXJhdGlvbkRhdGUgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ0V4cGlyYXRpb25EYXRlJyk7XG4gICAgICAgIHRoaXMuY3JlYXRvcklkZW50aWZpZXIgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ0NyZWF0b3JJZGVudGlmaWVyJyk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgQmFzZVJlc3BvbnNlIH0gZnJvbSAnLi9iYXNlUmVzcG9uc2UnO1xuXG5leHBvcnQgY2xhc3MgU2VuZEZpbGVEb3dubG9hZERhdGFSZXNwb25zZSBleHRlbmRzIEJhc2VSZXNwb25zZSB7XG5cbiAgICBpZDogc3RyaW5nID0gbnVsbDtcbiAgICB1cmw6IHN0cmluZyA9IG51bGw7XG4gICAgY29uc3RydWN0b3IocmVzcG9uc2U6IGFueSkge1xuICAgICAgICBzdXBlcihyZXNwb25zZSk7XG4gICAgICAgIHRoaXMuaWQgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ0lkJyk7XG4gICAgICAgIHRoaXMudXJsID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdVcmwnKTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBGaWxlVXBsb2FkVHlwZSB9IGZyb20gJy4uLy4uL2VudW1zL2ZpbGVVcGxvYWRUeXBlJztcblxuaW1wb3J0IHsgQmFzZVJlc3BvbnNlIH0gZnJvbSAnLi9iYXNlUmVzcG9uc2UnO1xuaW1wb3J0IHsgU2VuZFJlc3BvbnNlIH0gZnJvbSAnLi9zZW5kUmVzcG9uc2UnO1xuXG5leHBvcnQgY2xhc3MgU2VuZEZpbGVVcGxvYWREYXRhUmVzcG9uc2UgZXh0ZW5kcyBCYXNlUmVzcG9uc2Uge1xuXG4gICAgZmlsZVVwbG9hZFR5cGU6IEZpbGVVcGxvYWRUeXBlO1xuICAgIHNlbmRSZXNwb25zZTogU2VuZFJlc3BvbnNlO1xuICAgIHVybDogc3RyaW5nID0gbnVsbDtcbiAgICBjb25zdHJ1Y3RvcihyZXNwb25zZTogYW55KSB7XG4gICAgICAgIHN1cGVyKHJlc3BvbnNlKTtcbiAgICAgICAgdGhpcy5maWxlVXBsb2FkVHlwZSA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnRmlsZVVwbG9hZFR5cGUnKTtcbiAgICAgICAgY29uc3Qgc2VuZFJlc3BvbnNlID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdTZW5kUmVzcG9uc2UnKTtcbiAgICAgICAgdGhpcy5zZW5kUmVzcG9uc2UgPSBzZW5kUmVzcG9uc2UgPT0gbnVsbCA/IG51bGwgOiBuZXcgU2VuZFJlc3BvbnNlKHNlbmRSZXNwb25zZSk7XG4gICAgICAgIHRoaXMudXJsID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdVcmwnKTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBCYXNlUmVzcG9uc2UgfSBmcm9tICcuL2Jhc2VSZXNwb25zZSc7XG5cbmltcG9ydCB7IFNlbmRUeXBlIH0gZnJvbSAnLi4vLi4vZW51bXMvc2VuZFR5cGUnO1xuXG5pbXBvcnQgeyBTZW5kRmlsZUFwaSB9IGZyb20gJy4uL2FwaS9zZW5kRmlsZUFwaSc7XG5pbXBvcnQgeyBTZW5kVGV4dEFwaSB9IGZyb20gJy4uL2FwaS9zZW5kVGV4dEFwaSc7XG5cbmV4cG9ydCBjbGFzcyBTZW5kUmVzcG9uc2UgZXh0ZW5kcyBCYXNlUmVzcG9uc2Uge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgYWNjZXNzSWQ6IHN0cmluZztcbiAgICB0eXBlOiBTZW5kVHlwZTtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgbm90ZXM6IHN0cmluZztcbiAgICBmaWxlOiBTZW5kRmlsZUFwaTtcbiAgICB0ZXh0OiBTZW5kVGV4dEFwaTtcbiAgICBrZXk6IHN0cmluZztcbiAgICBtYXhBY2Nlc3NDb3VudD86IG51bWJlcjtcbiAgICBhY2Nlc3NDb3VudDogbnVtYmVyO1xuICAgIHJldmlzaW9uRGF0ZTogc3RyaW5nO1xuICAgIGV4cGlyYXRpb25EYXRlOiBzdHJpbmc7XG4gICAgZGVsZXRpb25EYXRlOiBzdHJpbmc7XG4gICAgcGFzc3dvcmQ6IHN0cmluZztcbiAgICBkaXNhYmxlOiBib29sZWFuO1xuICAgIGhpZGVFbWFpbDogYm9vbGVhbjtcblxuICAgIGNvbnN0cnVjdG9yKHJlc3BvbnNlOiBhbnkpIHtcbiAgICAgICAgc3VwZXIocmVzcG9uc2UpO1xuICAgICAgICB0aGlzLmlkID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdJZCcpO1xuICAgICAgICB0aGlzLmFjY2Vzc0lkID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdBY2Nlc3NJZCcpO1xuICAgICAgICB0aGlzLnR5cGUgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ1R5cGUnKTtcbiAgICAgICAgdGhpcy5uYW1lID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdOYW1lJyk7XG4gICAgICAgIHRoaXMubm90ZXMgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ05vdGVzJyk7XG4gICAgICAgIHRoaXMua2V5ID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdLZXknKTtcbiAgICAgICAgdGhpcy5tYXhBY2Nlc3NDb3VudCA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnTWF4QWNjZXNzQ291bnQnKTtcbiAgICAgICAgdGhpcy5hY2Nlc3NDb3VudCA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnQWNjZXNzQ291bnQnKTtcbiAgICAgICAgdGhpcy5yZXZpc2lvbkRhdGUgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ1JldmlzaW9uRGF0ZScpO1xuICAgICAgICB0aGlzLmV4cGlyYXRpb25EYXRlID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdFeHBpcmF0aW9uRGF0ZScpO1xuICAgICAgICB0aGlzLmRlbGV0aW9uRGF0ZSA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnRGVsZXRpb25EYXRlJyk7XG4gICAgICAgIHRoaXMucGFzc3dvcmQgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ1Bhc3N3b3JkJyk7XG4gICAgICAgIHRoaXMuZGlzYWJsZSA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnRGlzYWJsZWQnKSB8fCBmYWxzZTtcbiAgICAgICAgdGhpcy5oaWRlRW1haWwgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ0hpZGVFbWFpbCcpIHx8IGZhbHNlO1xuXG4gICAgICAgIGNvbnN0IHRleHQgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ1RleHQnKTtcbiAgICAgICAgaWYgKHRleHQgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy50ZXh0ID0gbmV3IFNlbmRUZXh0QXBpKHRleHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmlsZSA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnRmlsZScpO1xuICAgICAgICBpZiAoZmlsZSAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmZpbGUgPSBuZXcgU2VuZEZpbGVBcGkoZmlsZSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgeyBCYXNlUmVzcG9uc2UgfSBmcm9tICcuL2Jhc2VSZXNwb25zZSc7XG5cbmV4cG9ydCBjbGFzcyBTdWJzY3JpcHRpb25SZXNwb25zZSBleHRlbmRzIEJhc2VSZXNwb25zZSB7XG4gICAgc3RvcmFnZU5hbWU6IHN0cmluZztcbiAgICBzdG9yYWdlR2I6IG51bWJlcjtcbiAgICBtYXhTdG9yYWdlR2I6IG51bWJlcjtcbiAgICBzdWJzY3JpcHRpb246IEJpbGxpbmdTdWJzY3JpcHRpb25SZXNwb25zZTtcbiAgICB1cGNvbWluZ0ludm9pY2U6IEJpbGxpbmdTdWJzY3JpcHRpb25VcGNvbWluZ0ludm9pY2VSZXNwb25zZTtcbiAgICBsaWNlbnNlOiBhbnk7XG4gICAgZXhwaXJhdGlvbjogc3RyaW5nO1xuICAgIHVzaW5nSW5BcHBQdXJjaGFzZTogYm9vbGVhbjtcblxuICAgIGNvbnN0cnVjdG9yKHJlc3BvbnNlOiBhbnkpIHtcbiAgICAgICAgc3VwZXIocmVzcG9uc2UpO1xuICAgICAgICB0aGlzLnN0b3JhZ2VOYW1lID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdTdG9yYWdlTmFtZScpO1xuICAgICAgICB0aGlzLnN0b3JhZ2VHYiA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnU3RvcmFnZUdiJyk7XG4gICAgICAgIHRoaXMubWF4U3RvcmFnZUdiID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdNYXhTdG9yYWdlR2InKTtcbiAgICAgICAgdGhpcy5saWNlbnNlID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdMaWNlbnNlJyk7XG4gICAgICAgIHRoaXMuZXhwaXJhdGlvbiA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnRXhwaXJhdGlvbicpO1xuICAgICAgICB0aGlzLnVzaW5nSW5BcHBQdXJjaGFzZSA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnVXNpbmdJbkFwcFB1cmNoYXNlJyk7XG4gICAgICAgIGNvbnN0IHN1YnNjcmlwdGlvbiA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnU3Vic2NyaXB0aW9uJyk7XG4gICAgICAgIGNvbnN0IHVwY29taW5nSW52b2ljZSA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnVXBjb21pbmdJbnZvaWNlJyk7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gc3Vic2NyaXB0aW9uID09IG51bGwgPyBudWxsIDogbmV3IEJpbGxpbmdTdWJzY3JpcHRpb25SZXNwb25zZShzdWJzY3JpcHRpb24pO1xuICAgICAgICB0aGlzLnVwY29taW5nSW52b2ljZSA9IHVwY29taW5nSW52b2ljZSA9PSBudWxsID8gbnVsbCA6XG4gICAgICAgICAgICBuZXcgQmlsbGluZ1N1YnNjcmlwdGlvblVwY29taW5nSW52b2ljZVJlc3BvbnNlKHVwY29taW5nSW52b2ljZSk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQmlsbGluZ1N1YnNjcmlwdGlvblJlc3BvbnNlIGV4dGVuZHMgQmFzZVJlc3BvbnNlIHtcbiAgICB0cmlhbFN0YXJ0RGF0ZTogc3RyaW5nO1xuICAgIHRyaWFsRW5kRGF0ZTogc3RyaW5nO1xuICAgIHBlcmlvZFN0YXJ0RGF0ZTogc3RyaW5nO1xuICAgIHBlcmlvZEVuZERhdGU6IHN0cmluZztcbiAgICBjYW5jZWxsZWREYXRlOiBzdHJpbmc7XG4gICAgY2FuY2VsQXRFbmREYXRlOiBib29sZWFuO1xuICAgIHN0YXR1czogc3RyaW5nO1xuICAgIGNhbmNlbGxlZDogYm9vbGVhbjtcbiAgICBpdGVtczogQmlsbGluZ1N1YnNjcmlwdGlvbkl0ZW1SZXNwb25zZVtdID0gW107XG5cbiAgICBjb25zdHJ1Y3RvcihyZXNwb25zZTogYW55KSB7XG4gICAgICAgIHN1cGVyKHJlc3BvbnNlKTtcbiAgICAgICAgdGhpcy50cmlhbEVuZERhdGUgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ1RyaWFsU3RhcnREYXRlJyk7XG4gICAgICAgIHRoaXMudHJpYWxFbmREYXRlID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdUcmlhbEVuZERhdGUnKTtcbiAgICAgICAgdGhpcy5wZXJpb2RTdGFydERhdGUgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ1BlcmlvZFN0YXJ0RGF0ZScpO1xuICAgICAgICB0aGlzLnBlcmlvZEVuZERhdGUgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ1BlcmlvZEVuZERhdGUnKTtcbiAgICAgICAgdGhpcy5jYW5jZWxsZWREYXRlID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdDYW5jZWxsZWREYXRlJyk7XG4gICAgICAgIHRoaXMuY2FuY2VsQXRFbmREYXRlID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdDYW5jZWxBdEVuZERhdGUnKTtcbiAgICAgICAgdGhpcy5zdGF0dXMgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ1N0YXR1cycpO1xuICAgICAgICB0aGlzLmNhbmNlbGxlZCA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnQ2FuY2VsbGVkJyk7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdJdGVtcycpO1xuICAgICAgICBpZiAoaXRlbXMgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5pdGVtcyA9IGl0ZW1zLm1hcCgoaTogYW55KSA9PiBuZXcgQmlsbGluZ1N1YnNjcmlwdGlvbkl0ZW1SZXNwb25zZShpKSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBCaWxsaW5nU3Vic2NyaXB0aW9uSXRlbVJlc3BvbnNlIGV4dGVuZHMgQmFzZVJlc3BvbnNlIHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgYW1vdW50OiBudW1iZXI7XG4gICAgcXVhbnRpdHk6IG51bWJlcjtcbiAgICBpbnRlcnZhbDogc3RyaW5nO1xuXG4gICAgY29uc3RydWN0b3IocmVzcG9uc2U6IGFueSkge1xuICAgICAgICBzdXBlcihyZXNwb25zZSk7XG4gICAgICAgIHRoaXMubmFtZSA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnTmFtZScpO1xuICAgICAgICB0aGlzLmFtb3VudCA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnQW1vdW50Jyk7XG4gICAgICAgIHRoaXMucXVhbnRpdHkgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ1F1YW50aXR5Jyk7XG4gICAgICAgIHRoaXMuaW50ZXJ2YWwgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ0ludGVydmFsJyk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQmlsbGluZ1N1YnNjcmlwdGlvblVwY29taW5nSW52b2ljZVJlc3BvbnNlIGV4dGVuZHMgQmFzZVJlc3BvbnNlIHtcbiAgICBkYXRlOiBzdHJpbmc7XG4gICAgYW1vdW50OiBudW1iZXI7XG5cbiAgICBjb25zdHJ1Y3RvcihyZXNwb25zZTogYW55KSB7XG4gICAgICAgIHN1cGVyKHJlc3BvbnNlKTtcbiAgICAgICAgdGhpcy5kYXRlID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdEYXRlJyk7XG4gICAgICAgIHRoaXMuYW1vdW50ID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdBbW91bnQnKTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBCYXNlUmVzcG9uc2UgfSBmcm9tICcuL2Jhc2VSZXNwb25zZSc7XG5pbXBvcnQgeyBDaXBoZXJSZXNwb25zZSB9IGZyb20gJy4vY2lwaGVyUmVzcG9uc2UnO1xuaW1wb3J0IHsgQ29sbGVjdGlvbkRldGFpbHNSZXNwb25zZSB9IGZyb20gJy4vY29sbGVjdGlvblJlc3BvbnNlJztcbmltcG9ydCB7IERvbWFpbnNSZXNwb25zZSB9IGZyb20gJy4vZG9tYWluc1Jlc3BvbnNlJztcbmltcG9ydCB7IEZvbGRlclJlc3BvbnNlIH0gZnJvbSAnLi9mb2xkZXJSZXNwb25zZSc7XG5pbXBvcnQgeyBQb2xpY3lSZXNwb25zZSB9IGZyb20gJy4vcG9saWN5UmVzcG9uc2UnO1xuaW1wb3J0IHsgUHJvZmlsZVJlc3BvbnNlIH0gZnJvbSAnLi9wcm9maWxlUmVzcG9uc2UnO1xuaW1wb3J0IHsgU2VuZFJlc3BvbnNlIH0gZnJvbSAnLi9zZW5kUmVzcG9uc2UnO1xuXG5leHBvcnQgY2xhc3MgU3luY1Jlc3BvbnNlIGV4dGVuZHMgQmFzZVJlc3BvbnNlIHtcbiAgICBwcm9maWxlPzogUHJvZmlsZVJlc3BvbnNlO1xuICAgIGZvbGRlcnM6IEZvbGRlclJlc3BvbnNlW10gPSBbXTtcbiAgICBjb2xsZWN0aW9uczogQ29sbGVjdGlvbkRldGFpbHNSZXNwb25zZVtdID0gW107XG4gICAgY2lwaGVyczogQ2lwaGVyUmVzcG9uc2VbXSA9IFtdO1xuICAgIGRvbWFpbnM/OiBEb21haW5zUmVzcG9uc2U7XG4gICAgcG9saWNpZXM/OiBQb2xpY3lSZXNwb25zZVtdID0gW107XG4gICAgc2VuZHM6IFNlbmRSZXNwb25zZVtdID0gW107XG5cbiAgICBjb25zdHJ1Y3RvcihyZXNwb25zZTogYW55KSB7XG4gICAgICAgIHN1cGVyKHJlc3BvbnNlKTtcblxuICAgICAgICBjb25zdCBwcm9maWxlID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdQcm9maWxlJyk7XG4gICAgICAgIGlmIChwcm9maWxlICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMucHJvZmlsZSA9IG5ldyBQcm9maWxlUmVzcG9uc2UocHJvZmlsZSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmb2xkZXJzID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdGb2xkZXJzJyk7XG4gICAgICAgIGlmIChmb2xkZXJzICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuZm9sZGVycyA9IGZvbGRlcnMubWFwKChmOiBhbnkpID0+IG5ldyBGb2xkZXJSZXNwb25zZShmKSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb2xsZWN0aW9ucyA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnQ29sbGVjdGlvbnMnKTtcbiAgICAgICAgaWYgKGNvbGxlY3Rpb25zICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuY29sbGVjdGlvbnMgPSBjb2xsZWN0aW9ucy5tYXAoKGM6IGFueSkgPT4gbmV3IENvbGxlY3Rpb25EZXRhaWxzUmVzcG9uc2UoYykpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2lwaGVycyA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnQ2lwaGVycycpO1xuICAgICAgICBpZiAoY2lwaGVycyAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmNpcGhlcnMgPSBjaXBoZXJzLm1hcCgoYzogYW55KSA9PiBuZXcgQ2lwaGVyUmVzcG9uc2UoYykpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZG9tYWlucyA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnRG9tYWlucycpO1xuICAgICAgICBpZiAoZG9tYWlucyAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmRvbWFpbnMgPSBuZXcgRG9tYWluc1Jlc3BvbnNlKGRvbWFpbnMpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcG9saWNpZXMgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ1BvbGljaWVzJyk7XG4gICAgICAgIGlmIChwb2xpY2llcyAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnBvbGljaWVzID0gcG9saWNpZXMubWFwKChwOiBhbnkpID0+IG5ldyBQb2xpY3lSZXNwb25zZShwKSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzZW5kcyA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnU2VuZHMnKTtcbiAgICAgICAgaWYgKHNlbmRzICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuc2VuZHMgPSBzZW5kcy5tYXAoKHM6IGFueSkgPT4gbmV3IFNlbmRSZXNwb25zZShzKSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgeyBCYXNlUmVzcG9uc2UgfSBmcm9tICcuL2Jhc2VSZXNwb25zZSc7XG5cbmV4cG9ydCBjbGFzcyBUYXhJbmZvUmVzcG9uc2UgZXh0ZW5kcyBCYXNlUmVzcG9uc2Uge1xuICAgIHRheElkOiBzdHJpbmc7XG4gICAgdGF4SWRUeXBlOiBzdHJpbmc7XG4gICAgbGluZTE6IHN0cmluZztcbiAgICBsaW5lMjogc3RyaW5nO1xuICAgIGNpdHk6IHN0cmluZztcbiAgICBzdGF0ZTogc3RyaW5nO1xuICAgIGNvdW50cnk6IHN0cmluZztcbiAgICBwb3N0YWxDb2RlOiBzdHJpbmc7XG5cbiAgICBjb25zdHJ1Y3RvcihyZXNwb25zZTogYW55KSB7XG4gICAgICAgIHN1cGVyKHJlc3BvbnNlKTtcbiAgICAgICAgdGhpcy50YXhJZCA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnVGF4SWROdW1iZXInKTtcbiAgICAgICAgdGhpcy50YXhJZFR5cGUgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ1RheElkVHlwZScpO1xuICAgICAgICB0aGlzLmxpbmUxID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdMaW5lMScpO1xuICAgICAgICB0aGlzLmxpbmUyID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdMaW5lMicpO1xuICAgICAgICB0aGlzLmNpdHkgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ0NpdHknKTtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnU3RhdGUnKTtcbiAgICAgICAgdGhpcy5wb3N0YWxDb2RlID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdQb3N0YWxDb2RlJyk7XG4gICAgICAgIHRoaXMuY291bnRyeSA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnQ291bnRyeScpO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IEJhc2VSZXNwb25zZSB9IGZyb20gJy4vYmFzZVJlc3BvbnNlJztcblxuZXhwb3J0IGNsYXNzIFRheFJhdGVSZXNwb25zZSBleHRlbmRzIEJhc2VSZXNwb25zZSB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBjb3VudHJ5OiBzdHJpbmc7XG4gICAgc3RhdGU6IHN0cmluZztcbiAgICBwb3N0YWxDb2RlOiBzdHJpbmc7XG4gICAgcmF0ZTogbnVtYmVyO1xuXG4gICAgY29uc3RydWN0b3IocmVzcG9uc2U6IGFueSkge1xuICAgICAgICBzdXBlcihyZXNwb25zZSk7XG4gICAgICAgIHRoaXMuaWQgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ0lkJyk7XG4gICAgICAgIHRoaXMuY291bnRyeSA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnQ291bnRyeScpO1xuICAgICAgICB0aGlzLnN0YXRlID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdTdGF0ZScpO1xuICAgICAgICB0aGlzLnBvc3RhbENvZGUgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ1Bvc3RhbENvZGUnKTtcbiAgICAgICAgdGhpcy5yYXRlID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdSYXRlJyk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgQmFzZVJlc3BvbnNlIH0gZnJvbSAnLi9iYXNlUmVzcG9uc2UnO1xuXG5leHBvcnQgY2xhc3MgVHdvRmFjdG9yQXV0aGVudGljYXRvclJlc3BvbnNlIGV4dGVuZHMgQmFzZVJlc3BvbnNlIHtcbiAgICBlbmFibGVkOiBib29sZWFuO1xuICAgIGtleTogc3RyaW5nO1xuXG4gICAgY29uc3RydWN0b3IocmVzcG9uc2U6IGFueSkge1xuICAgICAgICBzdXBlcihyZXNwb25zZSk7XG4gICAgICAgIHRoaXMuZW5hYmxlZCA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnRW5hYmxlZCcpO1xuICAgICAgICB0aGlzLmtleSA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnS2V5Jyk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgQmFzZVJlc3BvbnNlIH0gZnJvbSAnLi9iYXNlUmVzcG9uc2UnO1xuXG5leHBvcnQgY2xhc3MgVHdvRmFjdG9yRHVvUmVzcG9uc2UgZXh0ZW5kcyBCYXNlUmVzcG9uc2Uge1xuICAgIGVuYWJsZWQ6IGJvb2xlYW47XG4gICAgaG9zdDogc3RyaW5nO1xuICAgIHNlY3JldEtleTogc3RyaW5nO1xuICAgIGludGVncmF0aW9uS2V5OiBzdHJpbmc7XG5cbiAgICBjb25zdHJ1Y3RvcihyZXNwb25zZTogYW55KSB7XG4gICAgICAgIHN1cGVyKHJlc3BvbnNlKTtcbiAgICAgICAgdGhpcy5lbmFibGVkID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdFbmFibGVkJyk7XG4gICAgICAgIHRoaXMuaG9zdCA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnSG9zdCcpO1xuICAgICAgICB0aGlzLnNlY3JldEtleSA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnU2VjcmV0S2V5Jyk7XG4gICAgICAgIHRoaXMuaW50ZWdyYXRpb25LZXkgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ0ludGVncmF0aW9uS2V5Jyk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgQmFzZVJlc3BvbnNlIH0gZnJvbSAnLi9iYXNlUmVzcG9uc2UnO1xuXG5leHBvcnQgY2xhc3MgVHdvRmFjdG9yRW1haWxSZXNwb25zZSBleHRlbmRzIEJhc2VSZXNwb25zZSB7XG4gICAgZW5hYmxlZDogYm9vbGVhbjtcbiAgICBlbWFpbDogc3RyaW5nO1xuXG4gICAgY29uc3RydWN0b3IocmVzcG9uc2U6IGFueSkge1xuICAgICAgICBzdXBlcihyZXNwb25zZSk7XG4gICAgICAgIHRoaXMuZW5hYmxlZCA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnRW5hYmxlZCcpO1xuICAgICAgICB0aGlzLmVtYWlsID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdFbWFpbCcpO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IEJhc2VSZXNwb25zZSB9IGZyb20gJy4vYmFzZVJlc3BvbnNlJztcblxuaW1wb3J0IHsgVHdvRmFjdG9yUHJvdmlkZXJUeXBlIH0gZnJvbSAnLi4vLi4vZW51bXMvdHdvRmFjdG9yUHJvdmlkZXJUeXBlJztcblxuZXhwb3J0IGNsYXNzIFR3b0ZhY3RvclByb3ZpZGVyUmVzcG9uc2UgZXh0ZW5kcyBCYXNlUmVzcG9uc2Uge1xuICAgIGVuYWJsZWQ6IGJvb2xlYW47XG4gICAgdHlwZTogVHdvRmFjdG9yUHJvdmlkZXJUeXBlO1xuXG4gICAgY29uc3RydWN0b3IocmVzcG9uc2U6IGFueSkge1xuICAgICAgICBzdXBlcihyZXNwb25zZSk7XG4gICAgICAgIHRoaXMuZW5hYmxlZCA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnRW5hYmxlZCcpO1xuICAgICAgICB0aGlzLnR5cGUgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ1R5cGUnKTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBCYXNlUmVzcG9uc2UgfSBmcm9tICcuL2Jhc2VSZXNwb25zZSc7XG5cbmV4cG9ydCBjbGFzcyBUd29GYWN0b3JSZWNvdmVyUmVzcG9uc2UgZXh0ZW5kcyBCYXNlUmVzcG9uc2Uge1xuICAgIGNvZGU6IHN0cmluZztcblxuICAgIGNvbnN0cnVjdG9yKHJlc3BvbnNlOiBhbnkpIHtcbiAgICAgICAgc3VwZXIocmVzcG9uc2UpO1xuICAgICAgICB0aGlzLmNvZGUgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ0NvZGUnKTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBVdGlscyB9IGZyb20gJy4uLy4uL21pc2MvdXRpbHMnO1xuaW1wb3J0IHsgQmFzZVJlc3BvbnNlIH0gZnJvbSAnLi9iYXNlUmVzcG9uc2UnO1xuXG5leHBvcnQgY2xhc3MgVHdvRmFjdG9yV2ViQXV0aG5SZXNwb25zZSBleHRlbmRzIEJhc2VSZXNwb25zZSB7XG4gICAgZW5hYmxlZDogYm9vbGVhbjtcbiAgICBrZXlzOiBLZXlSZXNwb25zZVtdO1xuXG4gICAgY29uc3RydWN0b3IocmVzcG9uc2U6IGFueSkge1xuICAgICAgICBzdXBlcihyZXNwb25zZSk7XG4gICAgICAgIHRoaXMuZW5hYmxlZCA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnRW5hYmxlZCcpO1xuICAgICAgICBjb25zdCBrZXlzID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdLZXlzJyk7XG4gICAgICAgIHRoaXMua2V5cyA9IGtleXMgPT0gbnVsbCA/IG51bGwgOiBrZXlzLm1hcCgoazogYW55KSA9PiBuZXcgS2V5UmVzcG9uc2UoaykpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEtleVJlc3BvbnNlIGV4dGVuZHMgQmFzZVJlc3BvbnNlIHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgaWQ6IG51bWJlcjtcbiAgICBtaWdyYXRlZDogYm9vbGVhbjtcblxuICAgIGNvbnN0cnVjdG9yKHJlc3BvbnNlOiBhbnkpIHtcbiAgICAgICAgc3VwZXIocmVzcG9uc2UpO1xuICAgICAgICB0aGlzLm5hbWUgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ05hbWUnKTtcbiAgICAgICAgdGhpcy5pZCA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnSWQnKTtcbiAgICAgICAgdGhpcy5taWdyYXRlZCA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnTWlncmF0ZWQnKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDaGFsbGVuZ2VSZXNwb25zZSBleHRlbmRzIEJhc2VSZXNwb25zZSBpbXBsZW1lbnRzIFB1YmxpY0tleUNyZWRlbnRpYWxDcmVhdGlvbk9wdGlvbnMge1xuICAgIGF0dGVzdGF0aW9uPzogQXR0ZXN0YXRpb25Db252ZXlhbmNlUHJlZmVyZW5jZTtcbiAgICBhdXRoZW50aWNhdG9yU2VsZWN0aW9uPzogQXV0aGVudGljYXRvclNlbGVjdGlvbkNyaXRlcmlhO1xuICAgIGNoYWxsZW5nZTogQnVmZmVyU291cmNlO1xuICAgIGV4Y2x1ZGVDcmVkZW50aWFscz86IFB1YmxpY0tleUNyZWRlbnRpYWxEZXNjcmlwdG9yW107XG4gICAgZXh0ZW5zaW9ucz86IEF1dGhlbnRpY2F0aW9uRXh0ZW5zaW9uc0NsaWVudElucHV0cztcbiAgICBwdWJLZXlDcmVkUGFyYW1zOiBQdWJsaWNLZXlDcmVkZW50aWFsUGFyYW1ldGVyc1tdO1xuICAgIHJwOiBQdWJsaWNLZXlDcmVkZW50aWFsUnBFbnRpdHk7XG4gICAgdGltZW91dD86IG51bWJlcjtcbiAgICB1c2VyOiBQdWJsaWNLZXlDcmVkZW50aWFsVXNlckVudGl0eTtcblxuICAgIGNvbnN0cnVjdG9yKHJlc3BvbnNlOiBhbnkpIHtcbiAgICAgICAgc3VwZXIocmVzcG9uc2UpO1xuICAgICAgICB0aGlzLmF0dGVzdGF0aW9uID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdhdHRlc3RhdGlvbicpO1xuICAgICAgICB0aGlzLmF1dGhlbnRpY2F0b3JTZWxlY3Rpb24gPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ2F1dGhlbnRpY2F0b3JTZWxlY3Rpb24nKTtcbiAgICAgICAgdGhpcy5jaGFsbGVuZ2UgPSBVdGlscy5mcm9tVXJsQjY0VG9BcnJheSh0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ2NoYWxsZW5nZScpKTtcbiAgICAgICAgdGhpcy5leGNsdWRlQ3JlZGVudGlhbHMgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ2V4Y2x1ZGVDcmVkZW50aWFscycpLm1hcCgoYzogYW55KSA9PiB7XG4gICAgICAgICAgICBjLmlkID0gVXRpbHMuZnJvbVVybEI2NFRvQXJyYXkoYy5pZCkuYnVmZmVyO1xuICAgICAgICAgICAgcmV0dXJuIGM7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmV4dGVuc2lvbnMgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ2V4dGVuc2lvbnMnKTtcbiAgICAgICAgdGhpcy5wdWJLZXlDcmVkUGFyYW1zID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdwdWJLZXlDcmVkUGFyYW1zJyk7XG4gICAgICAgIHRoaXMucnAgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ3JwJyk7XG4gICAgICAgIHRoaXMudGltZW91dCA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgndGltZW91dCcpO1xuXG4gICAgICAgIGNvbnN0IHVzZXIgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ3VzZXInKTtcbiAgICAgICAgdXNlci5pZCA9IFV0aWxzLmZyb21VcmxCNjRUb0FycmF5KHVzZXIuaWQpO1xuXG4gICAgICAgIHRoaXMudXNlciA9IHVzZXI7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgQmFzZVJlc3BvbnNlIH0gZnJvbSAnLi9iYXNlUmVzcG9uc2UnO1xuXG5leHBvcnQgY2xhc3MgVHdvRmFjdG9yWXViaUtleVJlc3BvbnNlIGV4dGVuZHMgQmFzZVJlc3BvbnNlIHtcbiAgICBlbmFibGVkOiBib29sZWFuO1xuICAgIGtleTE6IHN0cmluZztcbiAgICBrZXkyOiBzdHJpbmc7XG4gICAga2V5Mzogc3RyaW5nO1xuICAgIGtleTQ6IHN0cmluZztcbiAgICBrZXk1OiBzdHJpbmc7XG4gICAgbmZjOiBib29sZWFuO1xuXG4gICAgY29uc3RydWN0b3IocmVzcG9uc2U6IGFueSkge1xuICAgICAgICBzdXBlcihyZXNwb25zZSk7XG4gICAgICAgIHRoaXMuZW5hYmxlZCA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnRW5hYmxlZCcpO1xuICAgICAgICB0aGlzLmtleTEgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ0tleTEnKTtcbiAgICAgICAgdGhpcy5rZXkyID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdLZXkyJyk7XG4gICAgICAgIHRoaXMua2V5MyA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnS2V5MycpO1xuICAgICAgICB0aGlzLmtleTQgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ0tleTQnKTtcbiAgICAgICAgdGhpcy5rZXk1ID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdLZXk1Jyk7XG4gICAgICAgIHRoaXMubmZjID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdOZmMnKTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBCYXNlUmVzcG9uc2UgfSBmcm9tICcuL2Jhc2VSZXNwb25zZSc7XG5cbmV4cG9ydCBjbGFzcyBVc2VyS2V5UmVzcG9uc2UgZXh0ZW5kcyBCYXNlUmVzcG9uc2Uge1xuICAgIHVzZXJJZDogc3RyaW5nO1xuICAgIHB1YmxpY0tleTogc3RyaW5nO1xuXG4gICAgY29uc3RydWN0b3IocmVzcG9uc2U6IGFueSkge1xuICAgICAgICBzdXBlcihyZXNwb25zZSk7XG4gICAgICAgIHRoaXMudXNlcklkID0gdGhpcy5nZXRSZXNwb25zZVByb3BlcnR5KCdVc2VySWQnKTtcbiAgICAgICAgdGhpcy5wdWJsaWNLZXkgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ1B1YmxpY0tleScpO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IFZpZXcgfSBmcm9tICcuL3ZpZXcnO1xuXG5pbXBvcnQgeyBBdHRhY2htZW50IH0gZnJvbSAnLi4vZG9tYWluL2F0dGFjaG1lbnQnO1xuaW1wb3J0IHsgU3ltbWV0cmljQ3J5cHRvS2V5IH0gZnJvbSAnLi4vZG9tYWluL3N5bW1ldHJpY0NyeXB0b0tleSc7XG5cbmV4cG9ydCBjbGFzcyBBdHRhY2htZW50VmlldyBpbXBsZW1lbnRzIFZpZXcge1xuICAgIGlkOiBzdHJpbmcgPSBudWxsO1xuICAgIHVybDogc3RyaW5nID0gbnVsbDtcbiAgICBzaXplOiBzdHJpbmcgPSBudWxsO1xuICAgIHNpemVOYW1lOiBzdHJpbmcgPSBudWxsO1xuICAgIGZpbGVOYW1lOiBzdHJpbmcgPSBudWxsO1xuICAgIGtleTogU3ltbWV0cmljQ3J5cHRvS2V5ID0gbnVsbDtcblxuICAgIGNvbnN0cnVjdG9yKGE/OiBBdHRhY2htZW50KSB7XG4gICAgICAgIGlmICghYSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pZCA9IGEuaWQ7XG4gICAgICAgIHRoaXMudXJsID0gYS51cmw7XG4gICAgICAgIHRoaXMuc2l6ZSA9IGEuc2l6ZTtcbiAgICAgICAgdGhpcy5zaXplTmFtZSA9IGEuc2l6ZU5hbWU7XG4gICAgfVxuXG4gICAgZ2V0IGZpbGVTaXplKCk6IG51bWJlciB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAodGhpcy5zaXplICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VJbnQodGhpcy5zaXplLCBudWxsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvLyBJbnZhbGlkIGZpbGUgc2l6ZS5cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBJdGVtVmlldyB9IGZyb20gJy4vaXRlbVZpZXcnO1xuXG5pbXBvcnQgeyBDYXJkIH0gZnJvbSAnLi4vZG9tYWluL2NhcmQnO1xuXG5pbXBvcnQgeyBDYXJkTGlua2VkSWQgYXMgTGlua2VkSWQgfSBmcm9tICcuLi8uLi9lbnVtcy9saW5rZWRJZFR5cGUnO1xuXG5pbXBvcnQgeyBsaW5rZWRGaWVsZE9wdGlvbiB9IGZyb20gJy4uLy4uL21pc2MvbGlua2VkRmllbGRPcHRpb24uZGVjb3JhdG9yJztcblxuZXhwb3J0IGNsYXNzIENhcmRWaWV3IGV4dGVuZHMgSXRlbVZpZXcge1xuICAgIEBsaW5rZWRGaWVsZE9wdGlvbihMaW5rZWRJZC5DYXJkaG9sZGVyTmFtZSlcbiAgICBjYXJkaG9sZGVyTmFtZTogc3RyaW5nID0gbnVsbDtcbiAgICBAbGlua2VkRmllbGRPcHRpb24oTGlua2VkSWQuRXhwTW9udGgsICdleHBpcmF0aW9uTW9udGgnKVxuICAgIGV4cE1vbnRoOiBzdHJpbmcgPSBudWxsO1xuICAgIEBsaW5rZWRGaWVsZE9wdGlvbihMaW5rZWRJZC5FeHBZZWFyLCAnZXhwaXJhdGlvblllYXInKVxuICAgIGV4cFllYXI6IHN0cmluZyA9IG51bGw7XG4gICAgQGxpbmtlZEZpZWxkT3B0aW9uKExpbmtlZElkLkNvZGUsICdzZWN1cml0eUNvZGUnKVxuICAgIGNvZGU6IHN0cmluZyA9IG51bGw7XG5cbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZVxuICAgIHByaXZhdGUgX2JyYW5kOiBzdHJpbmcgPSBudWxsO1xuICAgIHByaXZhdGUgX251bWJlcjogc3RyaW5nID0gbnVsbDtcbiAgICBwcml2YXRlIF9zdWJUaXRsZTogc3RyaW5nID0gbnVsbDtcbiAgICAvLyB0c2xpbnQ6ZW5hYmxlXG5cbiAgICBjb25zdHJ1Y3RvcihjPzogQ2FyZCkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cblxuICAgIGdldCBtYXNrZWRDb2RlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvZGUgIT0gbnVsbCA/ICfigKInLnJlcGVhdCh0aGlzLmNvZGUubGVuZ3RoKSA6IG51bGw7XG4gICAgfVxuXG4gICAgZ2V0IG1hc2tlZE51bWJlcigpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5udW1iZXIgIT0gbnVsbCA/ICfigKInLnJlcGVhdCh0aGlzLm51bWJlci5sZW5ndGgpIDogbnVsbDtcbiAgICB9XG5cbiAgICBAbGlua2VkRmllbGRPcHRpb24oTGlua2VkSWQuQnJhbmQpXG4gICAgZ2V0IGJyYW5kKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9icmFuZDtcbiAgICB9XG4gICAgc2V0IGJyYW5kKHZhbHVlOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5fYnJhbmQgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5fc3ViVGl0bGUgPSBudWxsO1xuICAgIH1cblxuICAgIEBsaW5rZWRGaWVsZE9wdGlvbihMaW5rZWRJZC5OdW1iZXIpXG4gICAgZ2V0IG51bWJlcigpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fbnVtYmVyO1xuICAgIH1cbiAgICBzZXQgbnVtYmVyKHZhbHVlOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5fbnVtYmVyID0gdmFsdWU7XG4gICAgICAgIHRoaXMuX3N1YlRpdGxlID0gbnVsbDtcbiAgICB9XG5cbiAgICBnZXQgc3ViVGl0bGUoKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKHRoaXMuX3N1YlRpdGxlID09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuX3N1YlRpdGxlID0gdGhpcy5icmFuZDtcbiAgICAgICAgICAgIGlmICh0aGlzLm51bWJlciAhPSBudWxsICYmIHRoaXMubnVtYmVyLmxlbmd0aCA+PSA0KSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3N1YlRpdGxlICE9IG51bGwgJiYgdGhpcy5fc3ViVGl0bGUgIT09ICcnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3N1YlRpdGxlICs9ICcsICc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc3ViVGl0bGUgPSAnJztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBTaG93IGxhc3QgNSBvbiBhbWV4LCBsYXN0IDQgZm9yIGFsbCBvdGhlcnNcbiAgICAgICAgICAgICAgICBjb25zdCBjb3VudCA9IHRoaXMubnVtYmVyLmxlbmd0aCA+PSA1ICYmIHRoaXMubnVtYmVyLm1hdGNoKG5ldyBSZWdFeHAoJ14zWzQ3XScpKSAhPSBudWxsID8gNSA6IDQ7XG4gICAgICAgICAgICAgICAgdGhpcy5fc3ViVGl0bGUgKz0gKCcqJyArIHRoaXMubnVtYmVyLnN1YnN0cih0aGlzLm51bWJlci5sZW5ndGggLSBjb3VudCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9zdWJUaXRsZTtcbiAgICB9XG5cbiAgICBnZXQgZXhwaXJhdGlvbigpOiBzdHJpbmcge1xuICAgICAgICBpZiAoIXRoaXMuZXhwTW9udGggJiYgIXRoaXMuZXhwWWVhcikge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZXhwID0gdGhpcy5leHBNb250aCAhPSBudWxsID8gKCcwJyArIHRoaXMuZXhwTW9udGgpLnNsaWNlKC0yKSA6ICdfXyc7XG4gICAgICAgIGV4cCArPSAoJyAvICcgKyAodGhpcy5leHBZZWFyICE9IG51bGwgPyB0aGlzLmZvcm1hdFllYXIodGhpcy5leHBZZWFyKSA6ICdfX19fJykpO1xuICAgICAgICByZXR1cm4gZXhwO1xuICAgIH1cblxuICAgIHByaXZhdGUgZm9ybWF0WWVhcih5ZWFyOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4geWVhci5sZW5ndGggPT09IDIgPyAnMjAnICsgeWVhciA6IHllYXI7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgQ2lwaGVyUmVwcm9tcHRUeXBlIH0gZnJvbSAnLi4vLi4vZW51bXMvY2lwaGVyUmVwcm9tcHRUeXBlJztcbmltcG9ydCB7IENpcGhlclR5cGUgfSBmcm9tICcuLi8uLi9lbnVtcy9jaXBoZXJUeXBlJztcbmltcG9ydCB7IExpbmtlZElkVHlwZSB9IGZyb20gJy4uLy4uL2VudW1zL2xpbmtlZElkVHlwZSc7XG5cbmltcG9ydCB7IENpcGhlciB9IGZyb20gJy4uL2RvbWFpbi9jaXBoZXInO1xuXG5pbXBvcnQgeyBBdHRhY2htZW50VmlldyB9IGZyb20gJy4vYXR0YWNobWVudFZpZXcnO1xuaW1wb3J0IHsgQ2FyZFZpZXcgfSBmcm9tICcuL2NhcmRWaWV3JztcbmltcG9ydCB7IEZpZWxkVmlldyB9IGZyb20gJy4vZmllbGRWaWV3JztcbmltcG9ydCB7IElkZW50aXR5VmlldyB9IGZyb20gJy4vaWRlbnRpdHlWaWV3JztcbmltcG9ydCB7IEl0ZW1WaWV3IH0gZnJvbSAnLi9pdGVtVmlldyc7XG5pbXBvcnQgeyBMb2dpblZpZXcgfSBmcm9tICcuL2xvZ2luVmlldyc7XG5pbXBvcnQgeyBQYXNzd29yZEhpc3RvcnlWaWV3IH0gZnJvbSAnLi9wYXNzd29yZEhpc3RvcnlWaWV3JztcbmltcG9ydCB7IFNlY3VyZU5vdGVWaWV3IH0gZnJvbSAnLi9zZWN1cmVOb3RlVmlldyc7XG5pbXBvcnQgeyBWaWV3IH0gZnJvbSAnLi92aWV3JztcblxuZXhwb3J0IGNsYXNzIENpcGhlclZpZXcgaW1wbGVtZW50cyBWaWV3IHtcbiAgICBpZDogc3RyaW5nID0gbnVsbDtcbiAgICBvcmdhbml6YXRpb25JZDogc3RyaW5nID0gbnVsbDtcbiAgICBmb2xkZXJJZDogc3RyaW5nID0gbnVsbDtcbiAgICBuYW1lOiBzdHJpbmcgPSBudWxsO1xuICAgIG5vdGVzOiBzdHJpbmcgPSBudWxsO1xuICAgIHR5cGU6IENpcGhlclR5cGUgPSBudWxsO1xuICAgIGZhdm9yaXRlID0gZmFsc2U7XG4gICAgb3JnYW5pemF0aW9uVXNlVG90cCA9IGZhbHNlO1xuICAgIGVkaXQgPSBmYWxzZTtcbiAgICB2aWV3UGFzc3dvcmQgPSB0cnVlO1xuICAgIGxvY2FsRGF0YTogYW55O1xuICAgIGxvZ2luID0gbmV3IExvZ2luVmlldygpO1xuICAgIGlkZW50aXR5ID0gbmV3IElkZW50aXR5VmlldygpO1xuICAgIGNhcmQgPSBuZXcgQ2FyZFZpZXcoKTtcbiAgICBzZWN1cmVOb3RlID0gbmV3IFNlY3VyZU5vdGVWaWV3KCk7XG4gICAgYXR0YWNobWVudHM6IEF0dGFjaG1lbnRWaWV3W10gPSBudWxsO1xuICAgIGZpZWxkczogRmllbGRWaWV3W10gPSBudWxsO1xuICAgIHBhc3N3b3JkSGlzdG9yeTogUGFzc3dvcmRIaXN0b3J5Vmlld1tdID0gbnVsbDtcbiAgICBjb2xsZWN0aW9uSWRzOiBzdHJpbmdbXSA9IG51bGw7XG4gICAgcmV2aXNpb25EYXRlOiBEYXRlID0gbnVsbDtcbiAgICBkZWxldGVkRGF0ZTogRGF0ZSA9IG51bGw7XG4gICAgcmVwcm9tcHQ6IENpcGhlclJlcHJvbXB0VHlwZSA9IENpcGhlclJlcHJvbXB0VHlwZS5Ob25lO1xuXG4gICAgY29uc3RydWN0b3IoYz86IENpcGhlcikge1xuICAgICAgICBpZiAoIWMpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaWQgPSBjLmlkO1xuICAgICAgICB0aGlzLm9yZ2FuaXphdGlvbklkID0gYy5vcmdhbml6YXRpb25JZDtcbiAgICAgICAgdGhpcy5mb2xkZXJJZCA9IGMuZm9sZGVySWQ7XG4gICAgICAgIHRoaXMuZmF2b3JpdGUgPSBjLmZhdm9yaXRlO1xuICAgICAgICB0aGlzLm9yZ2FuaXphdGlvblVzZVRvdHAgPSBjLm9yZ2FuaXphdGlvblVzZVRvdHA7XG4gICAgICAgIHRoaXMuZWRpdCA9IGMuZWRpdDtcbiAgICAgICAgdGhpcy52aWV3UGFzc3dvcmQgPSBjLnZpZXdQYXNzd29yZDtcbiAgICAgICAgdGhpcy50eXBlID0gYy50eXBlO1xuICAgICAgICB0aGlzLmxvY2FsRGF0YSA9IGMubG9jYWxEYXRhO1xuICAgICAgICB0aGlzLmNvbGxlY3Rpb25JZHMgPSBjLmNvbGxlY3Rpb25JZHM7XG4gICAgICAgIHRoaXMucmV2aXNpb25EYXRlID0gYy5yZXZpc2lvbkRhdGU7XG4gICAgICAgIHRoaXMuZGVsZXRlZERhdGUgPSBjLmRlbGV0ZWREYXRlO1xuICAgICAgICAvLyBPbGQgbG9jYWxseSBzdG9yZWQgY2lwaGVycyBtaWdodCBoYXZlIHJlcHJvbXB0ID09IG51bGwuIElmIHNvIHNldCBpdCB0byBOb25lLlxuICAgICAgICB0aGlzLnJlcHJvbXB0ID0gYy5yZXByb21wdCA/PyBDaXBoZXJSZXByb21wdFR5cGUuTm9uZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldCBpdGVtKCkge1xuICAgICAgICBzd2l0Y2ggKHRoaXMudHlwZSkge1xuICAgICAgICAgICAgY2FzZSBDaXBoZXJUeXBlLkxvZ2luOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmxvZ2luO1xuICAgICAgICAgICAgY2FzZSBDaXBoZXJUeXBlLlNlY3VyZU5vdGU6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VjdXJlTm90ZTtcbiAgICAgICAgICAgIGNhc2UgQ2lwaGVyVHlwZS5DYXJkOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNhcmQ7XG4gICAgICAgICAgICBjYXNlIENpcGhlclR5cGUuSWRlbnRpdHk6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaWRlbnRpdHk7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgZ2V0IHN1YlRpdGxlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLml0ZW0uc3ViVGl0bGU7XG4gICAgfVxuXG4gICAgZ2V0IGhhc1Bhc3N3b3JkSGlzdG9yeSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFzc3dvcmRIaXN0b3J5ICYmIHRoaXMucGFzc3dvcmRIaXN0b3J5Lmxlbmd0aCA+IDA7XG4gICAgfVxuXG4gICAgZ2V0IGhhc0F0dGFjaG1lbnRzKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5hdHRhY2htZW50cyAmJiB0aGlzLmF0dGFjaG1lbnRzLmxlbmd0aCA+IDA7XG4gICAgfVxuXG4gICAgZ2V0IGhhc09sZEF0dGFjaG1lbnRzKCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodGhpcy5oYXNBdHRhY2htZW50cykge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmF0dGFjaG1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYXR0YWNobWVudHNbaV0ua2V5ID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBnZXQgaGFzRmllbGRzKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5maWVsZHMgJiYgdGhpcy5maWVsZHMubGVuZ3RoID4gMDtcbiAgICB9XG5cbiAgICBnZXQgcGFzc3dvcmRSZXZpc2lvbkRpc3BsYXlEYXRlKCk6IERhdGUge1xuICAgICAgICBpZiAodGhpcy50eXBlICE9PSBDaXBoZXJUeXBlLkxvZ2luIHx8IHRoaXMubG9naW4gPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5sb2dpbi5wYXNzd29yZCA9PSBudWxsIHx8IHRoaXMubG9naW4ucGFzc3dvcmQgPT09ICcnKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5sb2dpbi5wYXNzd29yZFJldmlzaW9uRGF0ZTtcbiAgICB9XG5cbiAgICBnZXQgaXNEZWxldGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5kZWxldGVkRGF0ZSAhPSBudWxsO1xuICAgIH1cblxuICAgIGdldCBsaW5rZWRGaWVsZE9wdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLml0ZW0ubGlua2VkRmllbGRPcHRpb25zO1xuICAgIH1cblxuICAgIGxpbmtlZEZpZWxkVmFsdWUoaWQ6IExpbmtlZElkVHlwZSkge1xuICAgICAgICBjb25zdCBsaW5rZWRGaWVsZE9wdGlvbiA9IHRoaXMubGlua2VkRmllbGRPcHRpb25zPy5nZXQoaWQpO1xuICAgICAgICBpZiAobGlua2VkRmllbGRPcHRpb24gPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5pdGVtO1xuICAgICAgICByZXR1cm4gdGhpcy5pdGVtW2xpbmtlZEZpZWxkT3B0aW9uLnByb3BlcnR5S2V5IGFzIGtleW9mIHR5cGVvZiBpdGVtXTtcbiAgICB9XG5cbiAgICBsaW5rZWRGaWVsZEkxOG5LZXkoaWQ6IExpbmtlZElkVHlwZSk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmxpbmtlZEZpZWxkT3B0aW9ucy5nZXQoaWQpPy5pMThuS2V5O1xuICAgIH1cbn1cbiIsImltcG9ydCB7IFZpZXcgfSBmcm9tICcuL3ZpZXcnO1xuXG5pbXBvcnQgeyBDb2xsZWN0aW9uIH0gZnJvbSAnLi4vZG9tYWluL2NvbGxlY3Rpb24nO1xuaW1wb3J0IHsgSVRyZWVOb2RlT2JqZWN0IH0gZnJvbSAnLi4vZG9tYWluL3RyZWVOb2RlJztcblxuaW1wb3J0IHsgQ29sbGVjdGlvbkdyb3VwRGV0YWlsc1Jlc3BvbnNlIH0gZnJvbSAnLi4vcmVzcG9uc2UvY29sbGVjdGlvblJlc3BvbnNlJztcblxuZXhwb3J0IGNsYXNzIENvbGxlY3Rpb25WaWV3IGltcGxlbWVudHMgVmlldywgSVRyZWVOb2RlT2JqZWN0IHtcbiAgICBpZDogc3RyaW5nID0gbnVsbDtcbiAgICBvcmdhbml6YXRpb25JZDogc3RyaW5nID0gbnVsbDtcbiAgICBuYW1lOiBzdHJpbmcgPSBudWxsO1xuICAgIGV4dGVybmFsSWQ6IHN0cmluZyA9IG51bGw7XG4gICAgcmVhZE9ubHk6IGJvb2xlYW4gPSBudWxsO1xuICAgIGhpZGVQYXNzd29yZHM6IGJvb2xlYW4gPSBudWxsO1xuXG4gICAgY29uc3RydWN0b3IoYz86IENvbGxlY3Rpb24gfCBDb2xsZWN0aW9uR3JvdXBEZXRhaWxzUmVzcG9uc2UpIHtcbiAgICAgICAgaWYgKCFjKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmlkID0gYy5pZDtcbiAgICAgICAgdGhpcy5vcmdhbml6YXRpb25JZCA9IGMub3JnYW5pemF0aW9uSWQ7XG4gICAgICAgIHRoaXMuZXh0ZXJuYWxJZCA9IGMuZXh0ZXJuYWxJZDtcbiAgICAgICAgaWYgKGMgaW5zdGFuY2VvZiBDb2xsZWN0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLnJlYWRPbmx5ID0gYy5yZWFkT25seTtcbiAgICAgICAgICAgIHRoaXMuaGlkZVBhc3N3b3JkcyA9IGMuaGlkZVBhc3N3b3JkcztcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCB7IEZpZWxkVHlwZSB9IGZyb20gJy4uLy4uL2VudW1zL2ZpZWxkVHlwZSc7XG5pbXBvcnQgeyBMaW5rZWRJZFR5cGUgfSBmcm9tICcuLi8uLi9lbnVtcy9saW5rZWRJZFR5cGUnO1xuXG5pbXBvcnQgeyBWaWV3IH0gZnJvbSAnLi92aWV3JztcblxuaW1wb3J0IHsgRmllbGQgfSBmcm9tICcuLi9kb21haW4vZmllbGQnO1xuXG5leHBvcnQgY2xhc3MgRmllbGRWaWV3IGltcGxlbWVudHMgVmlldyB7XG4gICAgbmFtZTogc3RyaW5nID0gbnVsbDtcbiAgICB2YWx1ZTogc3RyaW5nID0gbnVsbDtcbiAgICB0eXBlOiBGaWVsZFR5cGUgPSBudWxsO1xuICAgIG5ld0ZpZWxkOiBib29sZWFuID0gZmFsc2U7IC8vIE1hcmtzIGlmIHRoZSBmaWVsZCBpcyBuZXcgYW5kIGhhc24ndCBiZWVuIHNhdmVkXG4gICAgc2hvd1ZhbHVlOiBib29sZWFuID0gZmFsc2U7XG4gICAgbGlua2VkSWQ6IExpbmtlZElkVHlwZSA9IG51bGw7XG5cbiAgICBjb25zdHJ1Y3RvcihmPzogRmllbGQpIHtcbiAgICAgICAgaWYgKCFmKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnR5cGUgPSBmLnR5cGU7XG4gICAgICAgIHRoaXMubGlua2VkSWQgPSBmLmxpbmtlZElkO1xuICAgIH1cblxuICAgIGdldCBtYXNrZWRWYWx1ZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZSAhPSBudWxsID8gJ+KAouKAouKAouKAouKAouKAouKAouKAoicgOiBudWxsO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IFZpZXcgfSBmcm9tICcuL3ZpZXcnO1xuXG5pbXBvcnQgeyBGb2xkZXIgfSBmcm9tICcuLi9kb21haW4vZm9sZGVyJztcbmltcG9ydCB7IElUcmVlTm9kZU9iamVjdCB9IGZyb20gJy4uL2RvbWFpbi90cmVlTm9kZSc7XG5cbmV4cG9ydCBjbGFzcyBGb2xkZXJWaWV3IGltcGxlbWVudHMgVmlldywgSVRyZWVOb2RlT2JqZWN0IHtcbiAgICBpZDogc3RyaW5nID0gbnVsbDtcbiAgICBuYW1lOiBzdHJpbmcgPSBudWxsO1xuICAgIHJldmlzaW9uRGF0ZTogRGF0ZSA9IG51bGw7XG5cbiAgICBjb25zdHJ1Y3RvcihmPzogRm9sZGVyKSB7XG4gICAgICAgIGlmICghZikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pZCA9IGYuaWQ7XG4gICAgICAgIHRoaXMucmV2aXNpb25EYXRlID0gZi5yZXZpc2lvbkRhdGU7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgSXRlbVZpZXcgfSBmcm9tICcuL2l0ZW1WaWV3JztcblxuaW1wb3J0IHsgSWRlbnRpdHkgfSBmcm9tICcuLi9kb21haW4vaWRlbnRpdHknO1xuXG5pbXBvcnQgeyBVdGlscyB9IGZyb20gJy4uLy4uL21pc2MvdXRpbHMnO1xuXG5pbXBvcnQgeyBJZGVudGl0eUxpbmtlZElkIGFzIExpbmtlZElkIH0gZnJvbSAnLi4vLi4vZW51bXMvbGlua2VkSWRUeXBlJztcblxuaW1wb3J0IHsgbGlua2VkRmllbGRPcHRpb24gfSBmcm9tICcuLi8uLi9taXNjL2xpbmtlZEZpZWxkT3B0aW9uLmRlY29yYXRvcic7XG5cbmV4cG9ydCBjbGFzcyBJZGVudGl0eVZpZXcgZXh0ZW5kcyBJdGVtVmlldyB7XG4gICAgQGxpbmtlZEZpZWxkT3B0aW9uKExpbmtlZElkLlRpdGxlKVxuICAgIHRpdGxlOiBzdHJpbmcgPSBudWxsO1xuICAgIEBsaW5rZWRGaWVsZE9wdGlvbihMaW5rZWRJZC5NaWRkbGVOYW1lKVxuICAgIG1pZGRsZU5hbWU6IHN0cmluZyA9IG51bGw7XG4gICAgQGxpbmtlZEZpZWxkT3B0aW9uKExpbmtlZElkLkFkZHJlc3MxKVxuICAgIGFkZHJlc3MxOiBzdHJpbmcgPSBudWxsO1xuICAgIEBsaW5rZWRGaWVsZE9wdGlvbihMaW5rZWRJZC5BZGRyZXNzMilcbiAgICBhZGRyZXNzMjogc3RyaW5nID0gbnVsbDtcbiAgICBAbGlua2VkRmllbGRPcHRpb24oTGlua2VkSWQuQWRkcmVzczMpXG4gICAgYWRkcmVzczM6IHN0cmluZyA9IG51bGw7XG4gICAgQGxpbmtlZEZpZWxkT3B0aW9uKExpbmtlZElkLkNpdHksICdjaXR5VG93bicpXG4gICAgY2l0eTogc3RyaW5nID0gbnVsbDtcbiAgICBAbGlua2VkRmllbGRPcHRpb24oTGlua2VkSWQuU3RhdGUsICdzdGF0ZVByb3ZpbmNlJylcbiAgICBzdGF0ZTogc3RyaW5nID0gbnVsbDtcbiAgICBAbGlua2VkRmllbGRPcHRpb24oTGlua2VkSWQuUG9zdGFsQ29kZSwgJ3ppcFBvc3RhbENvZGUnKVxuICAgIHBvc3RhbENvZGU6IHN0cmluZyA9IG51bGw7XG4gICAgQGxpbmtlZEZpZWxkT3B0aW9uKExpbmtlZElkLkNvdW50cnkpXG4gICAgY291bnRyeTogc3RyaW5nID0gbnVsbDtcbiAgICBAbGlua2VkRmllbGRPcHRpb24oTGlua2VkSWQuQ29tcGFueSlcbiAgICBjb21wYW55OiBzdHJpbmcgPSBudWxsO1xuICAgIEBsaW5rZWRGaWVsZE9wdGlvbihMaW5rZWRJZC5FbWFpbClcbiAgICBlbWFpbDogc3RyaW5nID0gbnVsbDtcbiAgICBAbGlua2VkRmllbGRPcHRpb24oTGlua2VkSWQuUGhvbmUpXG4gICAgcGhvbmU6IHN0cmluZyA9IG51bGw7XG4gICAgQGxpbmtlZEZpZWxkT3B0aW9uKExpbmtlZElkLlNzbilcbiAgICBzc246IHN0cmluZyA9IG51bGw7XG4gICAgQGxpbmtlZEZpZWxkT3B0aW9uKExpbmtlZElkLlVzZXJuYW1lKVxuICAgIHVzZXJuYW1lOiBzdHJpbmcgPSBudWxsO1xuICAgIEBsaW5rZWRGaWVsZE9wdGlvbihMaW5rZWRJZC5QYXNzcG9ydE51bWJlcilcbiAgICBwYXNzcG9ydE51bWJlcjogc3RyaW5nID0gbnVsbDtcbiAgICBAbGlua2VkRmllbGRPcHRpb24oTGlua2VkSWQuTGljZW5zZU51bWJlcilcbiAgICBsaWNlbnNlTnVtYmVyOiBzdHJpbmcgPSBudWxsO1xuXG4gICAgLy8gdHNsaW50OmRpc2FibGVcbiAgICBwcml2YXRlIF9maXJzdE5hbWU6IHN0cmluZyA9IG51bGw7XG4gICAgcHJpdmF0ZSBfbGFzdE5hbWU6IHN0cmluZyA9IG51bGw7XG4gICAgcHJpdmF0ZSBfc3ViVGl0bGU6IHN0cmluZyA9IG51bGw7XG4gICAgLy8gdHNsaW50OmVuYWJsZVxuXG4gICAgY29uc3RydWN0b3IoaT86IElkZW50aXR5KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxuXG4gICAgQGxpbmtlZEZpZWxkT3B0aW9uKExpbmtlZElkLkZpcnN0TmFtZSlcbiAgICBnZXQgZmlyc3ROYW1lKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9maXJzdE5hbWU7XG4gICAgfVxuICAgIHNldCBmaXJzdE5hbWUodmFsdWU6IHN0cmluZykge1xuICAgICAgICB0aGlzLl9maXJzdE5hbWUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5fc3ViVGl0bGUgPSBudWxsO1xuICAgIH1cblxuICAgIEBsaW5rZWRGaWVsZE9wdGlvbihMaW5rZWRJZC5MYXN0TmFtZSlcbiAgICBnZXQgbGFzdE5hbWUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xhc3ROYW1lO1xuICAgIH1cbiAgICBzZXQgbGFzdE5hbWUodmFsdWU6IHN0cmluZykge1xuICAgICAgICB0aGlzLl9sYXN0TmFtZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLl9zdWJUaXRsZSA9IG51bGw7XG4gICAgfVxuXG4gICAgZ2V0IHN1YlRpdGxlKCk6IHN0cmluZyB7XG4gICAgICAgIGlmICh0aGlzLl9zdWJUaXRsZSA9PSBudWxsICYmICh0aGlzLmZpcnN0TmFtZSAhPSBudWxsIHx8IHRoaXMubGFzdE5hbWUgIT0gbnVsbCkpIHtcbiAgICAgICAgICAgIHRoaXMuX3N1YlRpdGxlID0gJyc7XG4gICAgICAgICAgICBpZiAodGhpcy5maXJzdE5hbWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3N1YlRpdGxlID0gdGhpcy5maXJzdE5hbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5sYXN0TmFtZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3N1YlRpdGxlICE9PSAnJykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9zdWJUaXRsZSArPSAnICc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuX3N1YlRpdGxlICs9IHRoaXMubGFzdE5hbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5fc3ViVGl0bGU7XG4gICAgfVxuXG4gICAgQGxpbmtlZEZpZWxkT3B0aW9uKExpbmtlZElkLkZ1bGxOYW1lKVxuICAgIGdldCBmdWxsTmFtZSgpOiBzdHJpbmcge1xuICAgICAgICBpZiAodGhpcy50aXRsZSAhPSBudWxsIHx8IHRoaXMuZmlyc3ROYW1lICE9IG51bGwgfHwgdGhpcy5taWRkbGVOYW1lICE9IG51bGwgfHwgdGhpcy5sYXN0TmFtZSAhPSBudWxsKSB7XG4gICAgICAgICAgICBsZXQgbmFtZSA9ICcnO1xuICAgICAgICAgICAgaWYgKHRoaXMudGl0bGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIG5hbWUgKz0gKHRoaXMudGl0bGUgKyAnICcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuZmlyc3ROYW1lICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBuYW1lICs9ICh0aGlzLmZpcnN0TmFtZSArICcgJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5taWRkbGVOYW1lICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBuYW1lICs9ICh0aGlzLm1pZGRsZU5hbWUgKyAnICcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMubGFzdE5hbWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIG5hbWUgKz0gdGhpcy5sYXN0TmFtZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBuYW1lLnRyaW0oKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGdldCBmdWxsQWRkcmVzcygpOiBzdHJpbmcge1xuICAgICAgICBsZXQgYWRkcmVzcyA9IHRoaXMuYWRkcmVzczE7XG4gICAgICAgIGlmICghVXRpbHMuaXNOdWxsT3JXaGl0ZXNwYWNlKHRoaXMuYWRkcmVzczIpKSB7XG4gICAgICAgICAgICBpZiAoIVV0aWxzLmlzTnVsbE9yV2hpdGVzcGFjZShhZGRyZXNzKSkge1xuICAgICAgICAgICAgICAgIGFkZHJlc3MgKz0gJywgJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFkZHJlc3MgKz0gdGhpcy5hZGRyZXNzMjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIVV0aWxzLmlzTnVsbE9yV2hpdGVzcGFjZSh0aGlzLmFkZHJlc3MzKSkge1xuICAgICAgICAgICAgaWYgKCFVdGlscy5pc051bGxPcldoaXRlc3BhY2UoYWRkcmVzcykpIHtcbiAgICAgICAgICAgICAgICBhZGRyZXNzICs9ICcsICc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhZGRyZXNzICs9IHRoaXMuYWRkcmVzczM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFkZHJlc3M7XG4gICAgfVxuXG4gICAgZ2V0IGZ1bGxBZGRyZXNzUGFydDIoKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKHRoaXMuY2l0eSA9PSBudWxsICYmIHRoaXMuc3RhdGUgPT0gbnVsbCAmJiB0aGlzLnBvc3RhbENvZGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2l0eSA9IHRoaXMuY2l0eSB8fCAnLSc7XG4gICAgICAgIGNvbnN0IHN0YXRlID0gdGhpcy5zdGF0ZTtcbiAgICAgICAgY29uc3QgcG9zdGFsQ29kZSA9IHRoaXMucG9zdGFsQ29kZSB8fCAnLSc7XG4gICAgICAgIGxldCBhZGRyZXNzUGFydDIgPSBjaXR5O1xuICAgICAgICBpZiAoIVV0aWxzLmlzTnVsbE9yV2hpdGVzcGFjZShzdGF0ZSkpIHtcbiAgICAgICAgICAgIGFkZHJlc3NQYXJ0MiArPSAnLCAnICsgc3RhdGU7XG4gICAgICAgIH1cbiAgICAgICAgYWRkcmVzc1BhcnQyICs9ICcsICcgKyBwb3N0YWxDb2RlO1xuICAgICAgICByZXR1cm4gYWRkcmVzc1BhcnQyO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IFZpZXcgfSBmcm9tICcuL3ZpZXcnO1xuXG5pbXBvcnQgeyBMaW5rZWRNZXRhZGF0YSB9IGZyb20gJy4uLy4uL21pc2MvbGlua2VkRmllbGRPcHRpb24uZGVjb3JhdG9yJztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEl0ZW1WaWV3IGltcGxlbWVudHMgVmlldyB7XG4gICAgbGlua2VkRmllbGRPcHRpb25zOiBNYXA8bnVtYmVyLCBMaW5rZWRNZXRhZGF0YT47XG4gICAgYWJzdHJhY3QgZ2V0IHN1YlRpdGxlKCk6IHN0cmluZztcbn1cbiIsImltcG9ydCB7IFVyaU1hdGNoVHlwZSB9IGZyb20gJy4uLy4uL2VudW1zL3VyaU1hdGNoVHlwZSc7XG5cbmltcG9ydCB7IFZpZXcgfSBmcm9tICcuL3ZpZXcnO1xuXG5pbXBvcnQgeyBMb2dpblVyaSB9IGZyb20gJy4uL2RvbWFpbi9sb2dpblVyaSc7XG5cbmltcG9ydCB7IFV0aWxzIH0gZnJvbSAnLi4vLi4vbWlzYy91dGlscyc7XG5cbmNvbnN0IENhbkxhdW5jaFdoaXRlbGlzdCA9IFtcbiAgICAnaHR0cHM6Ly8nLFxuICAgICdodHRwOi8vJyxcbiAgICAnc3NoOi8vJyxcbiAgICAnZnRwOi8vJyxcbiAgICAnc2Z0cDovLycsXG4gICAgJ2lyYzovLycsXG4gICAgJ3ZuYzovLycsXG4gICAgLy8gaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvd2luZG93cy1zZXJ2ZXIvcmVtb3RlL3JlbW90ZS1kZXNrdG9wLXNlcnZpY2VzL2NsaWVudHMvcmVtb3RlLWRlc2t0b3AtdXJpXG4gICAgJ3JkcDovLycsIC8vIExlZ2FjeSBSRFAgVVJJIHNjaGVtZVxuICAgICdtcy1yZDonLCAvLyBQcmVmZXJyZWQgUkRQIFVSSSBzY2hlbWVcbiAgICAnY2hyb21lOi8vJyxcbiAgICAnaW9zYXBwOi8vJyxcbiAgICAnYW5kcm9pZGFwcDovLycsXG5dO1xuXG5leHBvcnQgY2xhc3MgTG9naW5VcmlWaWV3IGltcGxlbWVudHMgVmlldyB7XG4gICAgbWF0Y2g6IFVyaU1hdGNoVHlwZSA9IG51bGw7XG5cbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZVxuICAgIHByaXZhdGUgX3VyaTogc3RyaW5nID0gbnVsbDtcbiAgICBwcml2YXRlIF9kb21haW46IHN0cmluZyA9IG51bGw7XG4gICAgcHJpdmF0ZSBfaG9zdG5hbWU6IHN0cmluZyA9IG51bGw7XG4gICAgcHJpdmF0ZSBfaG9zdDogc3RyaW5nID0gbnVsbDtcbiAgICBwcml2YXRlIF9jYW5MYXVuY2g6IGJvb2xlYW4gPSBudWxsO1xuICAgIC8vIHRzbGludDplbmFibGVcblxuICAgIGNvbnN0cnVjdG9yKHU/OiBMb2dpblVyaSkge1xuICAgICAgICBpZiAoIXUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubWF0Y2ggPSB1Lm1hdGNoO1xuICAgIH1cblxuICAgIGdldCB1cmkoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VyaTtcbiAgICB9XG4gICAgc2V0IHVyaSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX3VyaSA9IHZhbHVlO1xuICAgICAgICB0aGlzLl9kb21haW4gPSBudWxsO1xuICAgICAgICB0aGlzLl9jYW5MYXVuY2ggPSBudWxsO1xuICAgIH1cblxuICAgIGdldCBkb21haW4oKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKHRoaXMuX2RvbWFpbiA9PSBudWxsICYmIHRoaXMudXJpICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuX2RvbWFpbiA9IFV0aWxzLmdldERvbWFpbih0aGlzLnVyaSk7XG4gICAgICAgICAgICBpZiAodGhpcy5fZG9tYWluID09PSAnJykge1xuICAgICAgICAgICAgICAgIHRoaXMuX2RvbWFpbiA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5fZG9tYWluO1xuICAgIH1cblxuICAgIGdldCBob3N0bmFtZSgpOiBzdHJpbmcge1xuICAgICAgICBpZiAodGhpcy5tYXRjaCA9PT0gVXJpTWF0Y2hUeXBlLlJlZ3VsYXJFeHByZXNzaW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5faG9zdG5hbWUgPT0gbnVsbCAmJiB0aGlzLnVyaSAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLl9ob3N0bmFtZSA9IFV0aWxzLmdldEhvc3RuYW1lKHRoaXMudXJpKTtcbiAgICAgICAgICAgIGlmICh0aGlzLl9ob3N0bmFtZSA9PT0gJycpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9ob3N0bmFtZSA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5faG9zdG5hbWU7XG4gICAgfVxuXG4gICAgZ2V0IGhvc3QoKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKHRoaXMubWF0Y2ggPT09IFVyaU1hdGNoVHlwZS5SZWd1bGFyRXhwcmVzc2lvbikge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2hvc3QgPT0gbnVsbCAmJiB0aGlzLnVyaSAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLl9ob3N0ID0gVXRpbHMuZ2V0SG9zdCh0aGlzLnVyaSk7XG4gICAgICAgICAgICBpZiAodGhpcy5faG9zdCA9PT0gJycpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9ob3N0ID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLl9ob3N0O1xuICAgIH1cblxuICAgIGdldCBob3N0bmFtZU9yVXJpKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmhvc3RuYW1lICE9IG51bGwgPyB0aGlzLmhvc3RuYW1lIDogdGhpcy51cmk7XG4gICAgfVxuXG4gICAgZ2V0IGhvc3RPclVyaSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5ob3N0ICE9IG51bGwgPyB0aGlzLmhvc3QgOiB0aGlzLnVyaTtcbiAgICB9XG5cbiAgICBnZXQgaXNXZWJzaXRlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy51cmkgIT0gbnVsbCAmJiAodGhpcy51cmkuaW5kZXhPZignaHR0cDovLycpID09PSAwIHx8IHRoaXMudXJpLmluZGV4T2YoJ2h0dHBzOi8vJykgPT09IDAgfHxcbiAgICAgICAgICAgICh0aGlzLnVyaS5pbmRleE9mKCc6Ly8nKSA8IDAgJiYgVXRpbHMudGxkRW5kaW5nUmVnZXgudGVzdCh0aGlzLnVyaSkpKTtcbiAgICB9XG5cbiAgICBnZXQgY2FuTGF1bmNoKCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodGhpcy5fY2FuTGF1bmNoICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jYW5MYXVuY2g7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMudXJpICE9IG51bGwgJiYgdGhpcy5tYXRjaCAhPT0gVXJpTWF0Y2hUeXBlLlJlZ3VsYXJFeHByZXNzaW9uKSB7XG4gICAgICAgICAgICBjb25zdCB1cmkgPSB0aGlzLmxhdW5jaFVyaTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgQ2FuTGF1bmNoV2hpdGVsaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHVyaS5pbmRleE9mKENhbkxhdW5jaFdoaXRlbGlzdFtpXSkgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FuTGF1bmNoID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NhbkxhdW5jaDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fY2FuTGF1bmNoID0gZmFsc2U7XG4gICAgICAgIHJldHVybiB0aGlzLl9jYW5MYXVuY2g7XG4gICAgfVxuXG4gICAgZ2V0IGxhdW5jaFVyaSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy51cmkuaW5kZXhPZignOi8vJykgPCAwICYmIFV0aWxzLnRsZEVuZGluZ1JlZ2V4LnRlc3QodGhpcy51cmkpID8gKCdodHRwOi8vJyArIHRoaXMudXJpKSA6IHRoaXMudXJpO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IEl0ZW1WaWV3IH0gZnJvbSAnLi9pdGVtVmlldyc7XG5pbXBvcnQgeyBMb2dpblVyaVZpZXcgfSBmcm9tICcuL2xvZ2luVXJpVmlldyc7XG5cbmltcG9ydCB7IFV0aWxzIH0gZnJvbSAnLi4vLi4vbWlzYy91dGlscyc7XG5cbmltcG9ydCB7IExvZ2luIH0gZnJvbSAnLi4vZG9tYWluL2xvZ2luJztcblxuaW1wb3J0IHsgTG9naW5MaW5rZWRJZCBhcyBMaW5rZWRJZCB9IGZyb20gJy4uLy4uL2VudW1zL2xpbmtlZElkVHlwZSc7XG5cbmltcG9ydCB7IGxpbmtlZEZpZWxkT3B0aW9uIH0gZnJvbSAnLi4vLi4vbWlzYy9saW5rZWRGaWVsZE9wdGlvbi5kZWNvcmF0b3InO1xuXG5leHBvcnQgY2xhc3MgTG9naW5WaWV3IGV4dGVuZHMgSXRlbVZpZXcge1xuICAgIEBsaW5rZWRGaWVsZE9wdGlvbihMaW5rZWRJZC5Vc2VybmFtZSlcbiAgICB1c2VybmFtZTogc3RyaW5nID0gbnVsbDtcbiAgICBAbGlua2VkRmllbGRPcHRpb24oTGlua2VkSWQuUGFzc3dvcmQpXG4gICAgcGFzc3dvcmQ6IHN0cmluZyA9IG51bGw7XG5cbiAgICBwYXNzd29yZFJldmlzaW9uRGF0ZT86IERhdGUgPSBudWxsO1xuICAgIHRvdHA6IHN0cmluZyA9IG51bGw7XG4gICAgdXJpczogTG9naW5VcmlWaWV3W10gPSBudWxsO1xuICAgIGF1dG9maWxsT25QYWdlTG9hZDogYm9vbGVhbiA9IG51bGw7XG5cbiAgICBjb25zdHJ1Y3RvcihsPzogTG9naW4pIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgaWYgKCFsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnBhc3N3b3JkUmV2aXNpb25EYXRlID0gbC5wYXNzd29yZFJldmlzaW9uRGF0ZTtcbiAgICAgICAgdGhpcy5hdXRvZmlsbE9uUGFnZUxvYWQgPSBsLmF1dG9maWxsT25QYWdlTG9hZDtcbiAgICB9XG5cbiAgICBnZXQgdXJpKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmhhc1VyaXMgPyB0aGlzLnVyaXNbMF0udXJpIDogbnVsbDtcbiAgICB9XG5cbiAgICBnZXQgbWFza2VkUGFzc3dvcmQoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFzc3dvcmQgIT0gbnVsbCA/ICfigKLigKLigKLigKLigKLigKLigKLigKInIDogbnVsbDtcbiAgICB9XG5cbiAgICBnZXQgc3ViVGl0bGUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudXNlcm5hbWU7XG4gICAgfVxuXG4gICAgZ2V0IGNhbkxhdW5jaCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGFzVXJpcyAmJiB0aGlzLnVyaXMuc29tZSh1ID0+IHUuY2FuTGF1bmNoKTtcbiAgICB9XG5cbiAgICBnZXQgaGFzVG90cCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICFVdGlscy5pc051bGxPcldoaXRlc3BhY2UodGhpcy50b3RwKTtcbiAgICB9XG5cbiAgICBnZXQgbGF1bmNoVXJpKCk6IHN0cmluZyB7XG4gICAgICAgIGlmICh0aGlzLmhhc1VyaXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHVyaSA9IHRoaXMudXJpcy5maW5kKHUgPT4gdS5jYW5MYXVuY2gpO1xuICAgICAgICAgICAgaWYgKHVyaSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVyaS5sYXVuY2hVcmk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgZ2V0IGhhc1VyaXMoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnVyaXMgIT0gbnVsbCAmJiB0aGlzLnVyaXMubGVuZ3RoID4gMDtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBWaWV3IH0gZnJvbSAnLi92aWV3JztcblxuaW1wb3J0IHsgUGFzc3dvcmQgfSBmcm9tICcuLi9kb21haW4vcGFzc3dvcmQnO1xuXG5leHBvcnQgY2xhc3MgUGFzc3dvcmRIaXN0b3J5VmlldyBpbXBsZW1lbnRzIFZpZXcge1xuICAgIHBhc3N3b3JkOiBzdHJpbmcgPSBudWxsO1xuICAgIGxhc3RVc2VkRGF0ZTogRGF0ZSA9IG51bGw7XG5cbiAgICBjb25zdHJ1Y3RvcihwaD86IFBhc3N3b3JkKSB7XG4gICAgICAgIGlmICghcGgpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubGFzdFVzZWREYXRlID0gcGgubGFzdFVzZWREYXRlO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IFNlY3VyZU5vdGVUeXBlIH0gZnJvbSAnLi4vLi4vZW51bXMvc2VjdXJlTm90ZVR5cGUnO1xuXG5pbXBvcnQgeyBJdGVtVmlldyB9IGZyb20gJy4vaXRlbVZpZXcnO1xuXG5pbXBvcnQgeyBTZWN1cmVOb3RlIH0gZnJvbSAnLi4vZG9tYWluL3NlY3VyZU5vdGUnO1xuXG5leHBvcnQgY2xhc3MgU2VjdXJlTm90ZVZpZXcgZXh0ZW5kcyBJdGVtVmlldyB7XG4gICAgdHlwZTogU2VjdXJlTm90ZVR5cGUgPSBudWxsO1xuXG4gICAgY29uc3RydWN0b3Iobj86IFNlY3VyZU5vdGUpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgaWYgKCFuKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnR5cGUgPSBuLnR5cGU7XG4gICAgfVxuXG4gICAgZ2V0IHN1YlRpdGxlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IFZpZXcgfSBmcm9tICcuL3ZpZXcnO1xuXG5pbXBvcnQgeyBTZW5kRmlsZSB9IGZyb20gJy4uL2RvbWFpbi9zZW5kRmlsZSc7XG5cbmV4cG9ydCBjbGFzcyBTZW5kRmlsZVZpZXcgaW1wbGVtZW50cyBWaWV3IHtcbiAgICBpZDogc3RyaW5nID0gbnVsbDtcbiAgICBzaXplOiBzdHJpbmcgPSBudWxsO1xuICAgIHNpemVOYW1lOiBzdHJpbmcgPSBudWxsO1xuICAgIGZpbGVOYW1lOiBzdHJpbmcgPSBudWxsO1xuXG4gICAgY29uc3RydWN0b3IoZj86IFNlbmRGaWxlKSB7XG4gICAgICAgIGlmICghZikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pZCA9IGYuaWQ7XG4gICAgICAgIHRoaXMuc2l6ZSA9IGYuc2l6ZTtcbiAgICAgICAgdGhpcy5zaXplTmFtZSA9IGYuc2l6ZU5hbWU7XG4gICAgfVxuXG4gICAgZ2V0IGZpbGVTaXplKCk6IG51bWJlciB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAodGhpcy5zaXplICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VJbnQodGhpcy5zaXplLCBudWxsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvLyBJbnZhbGlkIGZpbGUgc2l6ZS5cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBWaWV3IH0gZnJvbSAnLi92aWV3JztcblxuaW1wb3J0IHsgU2VuZFRleHQgfSBmcm9tICcuLi9kb21haW4vc2VuZFRleHQnO1xuXG5leHBvcnQgY2xhc3MgU2VuZFRleHRWaWV3IGltcGxlbWVudHMgVmlldyB7XG4gICAgdGV4dDogc3RyaW5nID0gbnVsbDtcbiAgICBoaWRkZW46IGJvb2xlYW47XG5cbiAgICBjb25zdHJ1Y3Rvcih0PzogU2VuZFRleHQpIHtcbiAgICAgICAgaWYgKCF0KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmhpZGRlbiA9IHQuaGlkZGVuO1xuICAgIH1cblxuICAgIGdldCBtYXNrZWRUZXh0KCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnRleHQgIT0gbnVsbCA/ICfigKLigKLigKLigKLigKLigKLigKLigKInIDogbnVsbDtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBTZW5kVHlwZSB9IGZyb20gJy4uLy4uL2VudW1zL3NlbmRUeXBlJztcbmltcG9ydCB7IFV0aWxzIH0gZnJvbSAnLi4vLi4vbWlzYy91dGlscyc7XG5cbmltcG9ydCB7IFNlbmQgfSBmcm9tICcuLi9kb21haW4vc2VuZCc7XG5pbXBvcnQgeyBTeW1tZXRyaWNDcnlwdG9LZXkgfSBmcm9tICcuLi9kb21haW4vc3ltbWV0cmljQ3J5cHRvS2V5JztcblxuaW1wb3J0IHsgU2VuZEZpbGVWaWV3IH0gZnJvbSAnLi9zZW5kRmlsZVZpZXcnO1xuaW1wb3J0IHsgU2VuZFRleHRWaWV3IH0gZnJvbSAnLi9zZW5kVGV4dFZpZXcnO1xuaW1wb3J0IHsgVmlldyB9IGZyb20gJy4vdmlldyc7XG5cbmV4cG9ydCBjbGFzcyBTZW5kVmlldyBpbXBsZW1lbnRzIFZpZXcge1xuICAgIGlkOiBzdHJpbmcgPSBudWxsO1xuICAgIGFjY2Vzc0lkOiBzdHJpbmcgPSBudWxsO1xuICAgIG5hbWU6IHN0cmluZyA9IG51bGw7XG4gICAgbm90ZXM6IHN0cmluZyA9IG51bGw7XG4gICAga2V5OiBBcnJheUJ1ZmZlcjtcbiAgICBjcnlwdG9LZXk6IFN5bW1ldHJpY0NyeXB0b0tleTtcbiAgICB0eXBlOiBTZW5kVHlwZSA9IG51bGw7XG4gICAgdGV4dCA9IG5ldyBTZW5kVGV4dFZpZXcoKTtcbiAgICBmaWxlID0gbmV3IFNlbmRGaWxlVmlldygpO1xuICAgIG1heEFjY2Vzc0NvdW50PzogbnVtYmVyID0gbnVsbDtcbiAgICBhY2Nlc3NDb3VudDogbnVtYmVyID0gMDtcbiAgICByZXZpc2lvbkRhdGU6IERhdGUgPSBudWxsO1xuICAgIGRlbGV0aW9uRGF0ZTogRGF0ZSA9IG51bGw7XG4gICAgZXhwaXJhdGlvbkRhdGU6IERhdGUgPSBudWxsO1xuICAgIHBhc3N3b3JkOiBzdHJpbmcgPSBudWxsO1xuICAgIGRpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG4gICAgaGlkZUVtYWlsOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBjb25zdHJ1Y3RvcihzPzogU2VuZCkge1xuICAgICAgICBpZiAoIXMpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaWQgPSBzLmlkO1xuICAgICAgICB0aGlzLmFjY2Vzc0lkID0gcy5hY2Nlc3NJZDtcbiAgICAgICAgdGhpcy50eXBlID0gcy50eXBlO1xuICAgICAgICB0aGlzLm1heEFjY2Vzc0NvdW50ID0gcy5tYXhBY2Nlc3NDb3VudDtcbiAgICAgICAgdGhpcy5hY2Nlc3NDb3VudCA9IHMuYWNjZXNzQ291bnQ7XG4gICAgICAgIHRoaXMucmV2aXNpb25EYXRlID0gcy5yZXZpc2lvbkRhdGU7XG4gICAgICAgIHRoaXMuZGVsZXRpb25EYXRlID0gcy5kZWxldGlvbkRhdGU7XG4gICAgICAgIHRoaXMuZXhwaXJhdGlvbkRhdGUgPSBzLmV4cGlyYXRpb25EYXRlO1xuICAgICAgICB0aGlzLmRpc2FibGVkID0gcy5kaXNhYmxlZDtcbiAgICAgICAgdGhpcy5wYXNzd29yZCA9IHMucGFzc3dvcmQ7XG4gICAgICAgIHRoaXMuaGlkZUVtYWlsID0gcy5oaWRlRW1haWw7XG4gICAgfVxuXG4gICAgZ2V0IHVybEI2NEtleSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gVXRpbHMuZnJvbUJ1ZmZlclRvVXJsQjY0KHRoaXMua2V5KTtcbiAgICB9XG5cbiAgICBnZXQgbWF4QWNjZXNzQ291bnRSZWFjaGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodGhpcy5tYXhBY2Nlc3NDb3VudCA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuYWNjZXNzQ291bnQgPj0gdGhpcy5tYXhBY2Nlc3NDb3VudDtcbiAgICB9XG5cbiAgICBnZXQgZXhwaXJlZCgpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMuZXhwaXJhdGlvbkRhdGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmV4cGlyYXRpb25EYXRlIDw9IG5ldyBEYXRlKCk7XG4gICAgfVxuXG4gICAgZ2V0IHBlbmRpbmdEZWxldGUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmRlbGV0aW9uRGF0ZSA8PSBuZXcgRGF0ZSgpO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IERldmljZVR5cGUgfSBmcm9tICcuLi9lbnVtcy9kZXZpY2VUeXBlJztcbmltcG9ydCB7IFBvbGljeVR5cGUgfSBmcm9tICcuLi9lbnVtcy9wb2xpY3lUeXBlJztcblxuaW1wb3J0IHsgQXBpU2VydmljZSBhcyBBcGlTZXJ2aWNlQWJzdHJhY3Rpb24gfSBmcm9tICcuLi9hYnN0cmFjdGlvbnMvYXBpLnNlcnZpY2UnO1xuaW1wb3J0IHsgRW52aXJvbm1lbnRTZXJ2aWNlIH0gZnJvbSAnLi4vYWJzdHJhY3Rpb25zL2Vudmlyb25tZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgUGxhdGZvcm1VdGlsc1NlcnZpY2UgfSBmcm9tICcuLi9hYnN0cmFjdGlvbnMvcGxhdGZvcm1VdGlscy5zZXJ2aWNlJztcbmltcG9ydCB7IFRva2VuU2VydmljZSB9IGZyb20gJy4uL2Fic3RyYWN0aW9ucy90b2tlbi5zZXJ2aWNlJztcblxuaW1wb3J0IHsgQXR0YWNobWVudFJlcXVlc3QgfSBmcm9tICcuLi9tb2RlbHMvcmVxdWVzdC9hdHRhY2htZW50UmVxdWVzdCc7XG5pbXBvcnQgeyBCaXRQYXlJbnZvaWNlUmVxdWVzdCB9IGZyb20gJy4uL21vZGVscy9yZXF1ZXN0L2JpdFBheUludm9pY2VSZXF1ZXN0JztcbmltcG9ydCB7IENpcGhlckJ1bGtEZWxldGVSZXF1ZXN0IH0gZnJvbSAnLi4vbW9kZWxzL3JlcXVlc3QvY2lwaGVyQnVsa0RlbGV0ZVJlcXVlc3QnO1xuaW1wb3J0IHsgQ2lwaGVyQnVsa01vdmVSZXF1ZXN0IH0gZnJvbSAnLi4vbW9kZWxzL3JlcXVlc3QvY2lwaGVyQnVsa01vdmVSZXF1ZXN0JztcbmltcG9ydCB7IENpcGhlckJ1bGtTaGFyZVJlcXVlc3QgfSBmcm9tICcuLi9tb2RlbHMvcmVxdWVzdC9jaXBoZXJCdWxrU2hhcmVSZXF1ZXN0JztcbmltcG9ydCB7IENpcGhlckNvbGxlY3Rpb25zUmVxdWVzdCB9IGZyb20gJy4uL21vZGVscy9yZXF1ZXN0L2NpcGhlckNvbGxlY3Rpb25zUmVxdWVzdCc7XG5pbXBvcnQgeyBDaXBoZXJDcmVhdGVSZXF1ZXN0IH0gZnJvbSAnLi4vbW9kZWxzL3JlcXVlc3QvY2lwaGVyQ3JlYXRlUmVxdWVzdCc7XG5pbXBvcnQgeyBDaXBoZXJSZXF1ZXN0IH0gZnJvbSAnLi4vbW9kZWxzL3JlcXVlc3QvY2lwaGVyUmVxdWVzdCc7XG5pbXBvcnQgeyBDaXBoZXJTaGFyZVJlcXVlc3QgfSBmcm9tICcuLi9tb2RlbHMvcmVxdWVzdC9jaXBoZXJTaGFyZVJlcXVlc3QnO1xuaW1wb3J0IHsgQ29sbGVjdGlvblJlcXVlc3QgfSBmcm9tICcuLi9tb2RlbHMvcmVxdWVzdC9jb2xsZWN0aW9uUmVxdWVzdCc7XG5pbXBvcnQgeyBEZWxldGVSZWNvdmVyUmVxdWVzdCB9IGZyb20gJy4uL21vZGVscy9yZXF1ZXN0L2RlbGV0ZVJlY292ZXJSZXF1ZXN0JztcbmltcG9ydCB7IEVtYWlsUmVxdWVzdCB9IGZyb20gJy4uL21vZGVscy9yZXF1ZXN0L2VtYWlsUmVxdWVzdCc7XG5pbXBvcnQgeyBFbWFpbFRva2VuUmVxdWVzdCB9IGZyb20gJy4uL21vZGVscy9yZXF1ZXN0L2VtYWlsVG9rZW5SZXF1ZXN0JztcbmltcG9ydCB7IEVtZXJnZW5jeUFjY2Vzc0FjY2VwdFJlcXVlc3QgfSBmcm9tICcuLi9tb2RlbHMvcmVxdWVzdC9lbWVyZ2VuY3lBY2Nlc3NBY2NlcHRSZXF1ZXN0JztcbmltcG9ydCB7IEVtZXJnZW5jeUFjY2Vzc0NvbmZpcm1SZXF1ZXN0IH0gZnJvbSAnLi4vbW9kZWxzL3JlcXVlc3QvZW1lcmdlbmN5QWNjZXNzQ29uZmlybVJlcXVlc3QnO1xuaW1wb3J0IHsgRW1lcmdlbmN5QWNjZXNzSW52aXRlUmVxdWVzdCB9IGZyb20gJy4uL21vZGVscy9yZXF1ZXN0L2VtZXJnZW5jeUFjY2Vzc0ludml0ZVJlcXVlc3QnO1xuaW1wb3J0IHsgRW1lcmdlbmN5QWNjZXNzUGFzc3dvcmRSZXF1ZXN0IH0gZnJvbSAnLi4vbW9kZWxzL3JlcXVlc3QvZW1lcmdlbmN5QWNjZXNzUGFzc3dvcmRSZXF1ZXN0JztcbmltcG9ydCB7IEVtZXJnZW5jeUFjY2Vzc1VwZGF0ZVJlcXVlc3QgfSBmcm9tICcuLi9tb2RlbHMvcmVxdWVzdC9lbWVyZ2VuY3lBY2Nlc3NVcGRhdGVSZXF1ZXN0JztcbmltcG9ydCB7IEV2ZW50UmVxdWVzdCB9IGZyb20gJy4uL21vZGVscy9yZXF1ZXN0L2V2ZW50UmVxdWVzdCc7XG5pbXBvcnQgeyBGb2xkZXJSZXF1ZXN0IH0gZnJvbSAnLi4vbW9kZWxzL3JlcXVlc3QvZm9sZGVyUmVxdWVzdCc7XG5pbXBvcnQgeyBHcm91cFJlcXVlc3QgfSBmcm9tICcuLi9tb2RlbHMvcmVxdWVzdC9ncm91cFJlcXVlc3QnO1xuaW1wb3J0IHsgSWFwQ2hlY2tSZXF1ZXN0IH0gZnJvbSAnLi4vbW9kZWxzL3JlcXVlc3QvaWFwQ2hlY2tSZXF1ZXN0JztcbmltcG9ydCB7IEltcG9ydENpcGhlcnNSZXF1ZXN0IH0gZnJvbSAnLi4vbW9kZWxzL3JlcXVlc3QvaW1wb3J0Q2lwaGVyc1JlcXVlc3QnO1xuaW1wb3J0IHsgSW1wb3J0RGlyZWN0b3J5UmVxdWVzdCB9IGZyb20gJy4uL21vZGVscy9yZXF1ZXN0L2ltcG9ydERpcmVjdG9yeVJlcXVlc3QnO1xuaW1wb3J0IHsgSW1wb3J0T3JnYW5pemF0aW9uQ2lwaGVyc1JlcXVlc3QgfSBmcm9tICcuLi9tb2RlbHMvcmVxdWVzdC9pbXBvcnRPcmdhbml6YXRpb25DaXBoZXJzUmVxdWVzdCc7XG5pbXBvcnQgeyBLZGZSZXF1ZXN0IH0gZnJvbSAnLi4vbW9kZWxzL3JlcXVlc3Qva2RmUmVxdWVzdCc7XG5pbXBvcnQgeyBLZXlzUmVxdWVzdCB9IGZyb20gJy4uL21vZGVscy9yZXF1ZXN0L2tleXNSZXF1ZXN0JztcbmltcG9ydCB7IE9yZ2FuaXphdGlvblNzb1JlcXVlc3QgfSBmcm9tICcuLi9tb2RlbHMvcmVxdWVzdC9vcmdhbml6YXRpb24vb3JnYW5pemF0aW9uU3NvUmVxdWVzdCc7XG5pbXBvcnQgeyBPcmdhbml6YXRpb25DcmVhdGVSZXF1ZXN0IH0gZnJvbSAnLi4vbW9kZWxzL3JlcXVlc3Qvb3JnYW5pemF0aW9uQ3JlYXRlUmVxdWVzdCc7XG5pbXBvcnQgeyBPcmdhbml6YXRpb25JbXBvcnRSZXF1ZXN0IH0gZnJvbSAnLi4vbW9kZWxzL3JlcXVlc3Qvb3JnYW5pemF0aW9uSW1wb3J0UmVxdWVzdCc7XG5pbXBvcnQgeyBPcmdhbml6YXRpb25LZXlzUmVxdWVzdCB9IGZyb20gJy4uL21vZGVscy9yZXF1ZXN0L29yZ2FuaXphdGlvbktleXNSZXF1ZXN0JztcbmltcG9ydCB7IE9yZ2FuaXphdGlvblN1YnNjcmlwdGlvblVwZGF0ZVJlcXVlc3QgfSBmcm9tICcuLi9tb2RlbHMvcmVxdWVzdC9vcmdhbml6YXRpb25TdWJzY3JpcHRpb25VcGRhdGVSZXF1ZXN0JztcbmltcG9ydCB7IE9yZ2FuaXphdGlvblRheEluZm9VcGRhdGVSZXF1ZXN0IH0gZnJvbSAnLi4vbW9kZWxzL3JlcXVlc3Qvb3JnYW5pemF0aW9uVGF4SW5mb1VwZGF0ZVJlcXVlc3QnO1xuaW1wb3J0IHsgT3JnYW5pemF0aW9uVXBkYXRlUmVxdWVzdCB9IGZyb20gJy4uL21vZGVscy9yZXF1ZXN0L29yZ2FuaXphdGlvblVwZGF0ZVJlcXVlc3QnO1xuaW1wb3J0IHsgT3JnYW5pemF0aW9uVXBncmFkZVJlcXVlc3QgfSBmcm9tICcuLi9tb2RlbHMvcmVxdWVzdC9vcmdhbml6YXRpb25VcGdyYWRlUmVxdWVzdCc7XG5pbXBvcnQgeyBPcmdhbml6YXRpb25Vc2VyQWNjZXB0UmVxdWVzdCB9IGZyb20gJy4uL21vZGVscy9yZXF1ZXN0L29yZ2FuaXphdGlvblVzZXJBY2NlcHRSZXF1ZXN0JztcbmltcG9ydCB7IE9yZ2FuaXphdGlvblVzZXJCdWxrQ29uZmlybVJlcXVlc3QgfSBmcm9tICcuLi9tb2RlbHMvcmVxdWVzdC9vcmdhbml6YXRpb25Vc2VyQnVsa0NvbmZpcm1SZXF1ZXN0JztcbmltcG9ydCB7IE9yZ2FuaXphdGlvblVzZXJCdWxrUmVxdWVzdCB9IGZyb20gJy4uL21vZGVscy9yZXF1ZXN0L29yZ2FuaXphdGlvblVzZXJCdWxrUmVxdWVzdCc7XG5pbXBvcnQgeyBPcmdhbml6YXRpb25Vc2VyQ29uZmlybVJlcXVlc3QgfSBmcm9tICcuLi9tb2RlbHMvcmVxdWVzdC9vcmdhbml6YXRpb25Vc2VyQ29uZmlybVJlcXVlc3QnO1xuaW1wb3J0IHsgT3JnYW5pemF0aW9uVXNlckludml0ZVJlcXVlc3QgfSBmcm9tICcuLi9tb2RlbHMvcmVxdWVzdC9vcmdhbml6YXRpb25Vc2VySW52aXRlUmVxdWVzdCc7XG5pbXBvcnQgeyBPcmdhbml6YXRpb25Vc2VyUmVzZXRQYXNzd29yZEVucm9sbG1lbnRSZXF1ZXN0IH0gZnJvbSAnLi4vbW9kZWxzL3JlcXVlc3Qvb3JnYW5pemF0aW9uVXNlclJlc2V0UGFzc3dvcmRFbnJvbGxtZW50UmVxdWVzdCc7XG5pbXBvcnQgeyBPcmdhbml6YXRpb25Vc2VyUmVzZXRQYXNzd29yZFJlcXVlc3QgfSBmcm9tICcuLi9tb2RlbHMvcmVxdWVzdC9vcmdhbml6YXRpb25Vc2VyUmVzZXRQYXNzd29yZFJlcXVlc3QnO1xuaW1wb3J0IHsgT3JnYW5pemF0aW9uVXNlclVwZGF0ZUdyb3Vwc1JlcXVlc3QgfSBmcm9tICcuLi9tb2RlbHMvcmVxdWVzdC9vcmdhbml6YXRpb25Vc2VyVXBkYXRlR3JvdXBzUmVxdWVzdCc7XG5pbXBvcnQgeyBPcmdhbml6YXRpb25Vc2VyVXBkYXRlUmVxdWVzdCB9IGZyb20gJy4uL21vZGVscy9yZXF1ZXN0L29yZ2FuaXphdGlvblVzZXJVcGRhdGVSZXF1ZXN0JztcbmltcG9ydCB7IFBhc3N3b3JkSGludFJlcXVlc3QgfSBmcm9tICcuLi9tb2RlbHMvcmVxdWVzdC9wYXNzd29yZEhpbnRSZXF1ZXN0JztcbmltcG9ydCB7IFBhc3N3b3JkUmVxdWVzdCB9IGZyb20gJy4uL21vZGVscy9yZXF1ZXN0L3Bhc3N3b3JkUmVxdWVzdCc7XG5pbXBvcnQgeyBQYXNzd29yZFZlcmlmaWNhdGlvblJlcXVlc3QgfSBmcm9tICcuLi9tb2RlbHMvcmVxdWVzdC9wYXNzd29yZFZlcmlmaWNhdGlvblJlcXVlc3QnO1xuaW1wb3J0IHsgUGF5bWVudFJlcXVlc3QgfSBmcm9tICcuLi9tb2RlbHMvcmVxdWVzdC9wYXltZW50UmVxdWVzdCc7XG5pbXBvcnQgeyBQb2xpY3lSZXF1ZXN0IH0gZnJvbSAnLi4vbW9kZWxzL3JlcXVlc3QvcG9saWN5UmVxdWVzdCc7XG5pbXBvcnQgeyBQcmVsb2dpblJlcXVlc3QgfSBmcm9tICcuLi9tb2RlbHMvcmVxdWVzdC9wcmVsb2dpblJlcXVlc3QnO1xuaW1wb3J0IHsgUHJvdmlkZXJBZGRPcmdhbml6YXRpb25SZXF1ZXN0IH0gZnJvbSAnLi4vbW9kZWxzL3JlcXVlc3QvcHJvdmlkZXIvcHJvdmlkZXJBZGRPcmdhbml6YXRpb25SZXF1ZXN0JztcbmltcG9ydCB7IFByb3ZpZGVyT3JnYW5pemF0aW9uQ3JlYXRlUmVxdWVzdCB9IGZyb20gJy4uL21vZGVscy9yZXF1ZXN0L3Byb3ZpZGVyL3Byb3ZpZGVyT3JnYW5pemF0aW9uQ3JlYXRlUmVxdWVzdCc7XG5pbXBvcnQgeyBQcm92aWRlclNldHVwUmVxdWVzdCB9IGZyb20gJy4uL21vZGVscy9yZXF1ZXN0L3Byb3ZpZGVyL3Byb3ZpZGVyU2V0dXBSZXF1ZXN0JztcbmltcG9ydCB7IFByb3ZpZGVyVXBkYXRlUmVxdWVzdCB9IGZyb20gJy4uL21vZGVscy9yZXF1ZXN0L3Byb3ZpZGVyL3Byb3ZpZGVyVXBkYXRlUmVxdWVzdCc7XG5pbXBvcnQgeyBQcm92aWRlclVzZXJBY2NlcHRSZXF1ZXN0IH0gZnJvbSAnLi4vbW9kZWxzL3JlcXVlc3QvcHJvdmlkZXIvcHJvdmlkZXJVc2VyQWNjZXB0UmVxdWVzdCc7XG5pbXBvcnQgeyBQcm92aWRlclVzZXJCdWxrQ29uZmlybVJlcXVlc3QgfSBmcm9tICcuLi9tb2RlbHMvcmVxdWVzdC9wcm92aWRlci9wcm92aWRlclVzZXJCdWxrQ29uZmlybVJlcXVlc3QnO1xuaW1wb3J0IHsgUHJvdmlkZXJVc2VyQnVsa1JlcXVlc3QgfSBmcm9tICcuLi9tb2RlbHMvcmVxdWVzdC9wcm92aWRlci9wcm92aWRlclVzZXJCdWxrUmVxdWVzdCc7XG5pbXBvcnQgeyBQcm92aWRlclVzZXJDb25maXJtUmVxdWVzdCB9IGZyb20gJy4uL21vZGVscy9yZXF1ZXN0L3Byb3ZpZGVyL3Byb3ZpZGVyVXNlckNvbmZpcm1SZXF1ZXN0JztcbmltcG9ydCB7IFByb3ZpZGVyVXNlckludml0ZVJlcXVlc3QgfSBmcm9tICcuLi9tb2RlbHMvcmVxdWVzdC9wcm92aWRlci9wcm92aWRlclVzZXJJbnZpdGVSZXF1ZXN0JztcbmltcG9ydCB7IFByb3ZpZGVyVXNlclVwZGF0ZVJlcXVlc3QgfSBmcm9tICcuLi9tb2RlbHMvcmVxdWVzdC9wcm92aWRlci9wcm92aWRlclVzZXJVcGRhdGVSZXF1ZXN0JztcbmltcG9ydCB7IFJlZ2lzdGVyUmVxdWVzdCB9IGZyb20gJy4uL21vZGVscy9yZXF1ZXN0L3JlZ2lzdGVyUmVxdWVzdCc7XG5pbXBvcnQgeyBTZWF0UmVxdWVzdCB9IGZyb20gJy4uL21vZGVscy9yZXF1ZXN0L3NlYXRSZXF1ZXN0JztcbmltcG9ydCB7IFNlbGVjdGlvblJlYWRPbmx5UmVxdWVzdCB9IGZyb20gJy4uL21vZGVscy9yZXF1ZXN0L3NlbGVjdGlvblJlYWRPbmx5UmVxdWVzdCc7XG5pbXBvcnQgeyBTZW5kQWNjZXNzUmVxdWVzdCB9IGZyb20gJy4uL21vZGVscy9yZXF1ZXN0L3NlbmRBY2Nlc3NSZXF1ZXN0JztcbmltcG9ydCB7IFNlbmRSZXF1ZXN0IH0gZnJvbSAnLi4vbW9kZWxzL3JlcXVlc3Qvc2VuZFJlcXVlc3QnO1xuaW1wb3J0IHsgU2V0UGFzc3dvcmRSZXF1ZXN0IH0gZnJvbSAnLi4vbW9kZWxzL3JlcXVlc3Qvc2V0UGFzc3dvcmRSZXF1ZXN0JztcbmltcG9ydCB7IFN0b3JhZ2VSZXF1ZXN0IH0gZnJvbSAnLi4vbW9kZWxzL3JlcXVlc3Qvc3RvcmFnZVJlcXVlc3QnO1xuaW1wb3J0IHsgVGF4SW5mb1VwZGF0ZVJlcXVlc3QgfSBmcm9tICcuLi9tb2RlbHMvcmVxdWVzdC90YXhJbmZvVXBkYXRlUmVxdWVzdCc7XG5pbXBvcnQgeyBUb2tlblJlcXVlc3QgfSBmcm9tICcuLi9tb2RlbHMvcmVxdWVzdC90b2tlblJlcXVlc3QnO1xuaW1wb3J0IHsgVHdvRmFjdG9yRW1haWxSZXF1ZXN0IH0gZnJvbSAnLi4vbW9kZWxzL3JlcXVlc3QvdHdvRmFjdG9yRW1haWxSZXF1ZXN0JztcbmltcG9ydCB7IFR3b0ZhY3RvclByb3ZpZGVyUmVxdWVzdCB9IGZyb20gJy4uL21vZGVscy9yZXF1ZXN0L3R3b0ZhY3RvclByb3ZpZGVyUmVxdWVzdCc7XG5pbXBvcnQgeyBUd29GYWN0b3JSZWNvdmVyeVJlcXVlc3QgfSBmcm9tICcuLi9tb2RlbHMvcmVxdWVzdC90d29GYWN0b3JSZWNvdmVyeVJlcXVlc3QnO1xuaW1wb3J0IHsgVXBkYXRlRG9tYWluc1JlcXVlc3QgfSBmcm9tICcuLi9tb2RlbHMvcmVxdWVzdC91cGRhdGVEb21haW5zUmVxdWVzdCc7XG5pbXBvcnQgeyBVcGRhdGVLZXlSZXF1ZXN0IH0gZnJvbSAnLi4vbW9kZWxzL3JlcXVlc3QvdXBkYXRlS2V5UmVxdWVzdCc7XG5pbXBvcnQgeyBVcGRhdGVQcm9maWxlUmVxdWVzdCB9IGZyb20gJy4uL21vZGVscy9yZXF1ZXN0L3VwZGF0ZVByb2ZpbGVSZXF1ZXN0JztcbmltcG9ydCB7IFVwZGF0ZVRlbXBQYXNzd29yZFJlcXVlc3QgfSBmcm9tICcuLi9tb2RlbHMvcmVxdWVzdC91cGRhdGVUZW1wUGFzc3dvcmRSZXF1ZXN0JztcbmltcG9ydCB7IFVwZGF0ZVR3b0ZhY3RvckF1dGhlbnRpY2F0b3JSZXF1ZXN0IH0gZnJvbSAnLi4vbW9kZWxzL3JlcXVlc3QvdXBkYXRlVHdvRmFjdG9yQXV0aGVudGljYXRvclJlcXVlc3QnO1xuaW1wb3J0IHsgVXBkYXRlVHdvRmFjdG9yRHVvUmVxdWVzdCB9IGZyb20gJy4uL21vZGVscy9yZXF1ZXN0L3VwZGF0ZVR3b0ZhY3RvckR1b1JlcXVlc3QnO1xuaW1wb3J0IHsgVXBkYXRlVHdvRmFjdG9yRW1haWxSZXF1ZXN0IH0gZnJvbSAnLi4vbW9kZWxzL3JlcXVlc3QvdXBkYXRlVHdvRmFjdG9yRW1haWxSZXF1ZXN0JztcbmltcG9ydCB7IFVwZGF0ZVR3b0ZhY3RvcldlYkF1dGhuRGVsZXRlUmVxdWVzdCB9IGZyb20gJy4uL21vZGVscy9yZXF1ZXN0L3VwZGF0ZVR3b0ZhY3RvcldlYkF1dGhuRGVsZXRlUmVxdWVzdCc7XG5pbXBvcnQgeyBVcGRhdGVUd29GYWN0b3JXZWJBdXRoblJlcXVlc3QgfSBmcm9tICcuLi9tb2RlbHMvcmVxdWVzdC91cGRhdGVUd29GYWN0b3JXZWJBdXRoblJlcXVlc3QnO1xuaW1wb3J0IHsgVXBkYXRlVHdvRmFjdG9yWXViaW9PdHBSZXF1ZXN0IH0gZnJvbSAnLi4vbW9kZWxzL3JlcXVlc3QvdXBkYXRlVHdvRmFjdG9yWXViaW9PdHBSZXF1ZXN0JztcbmltcG9ydCB7IFZlcmlmeUJhbmtSZXF1ZXN0IH0gZnJvbSAnLi4vbW9kZWxzL3JlcXVlc3QvdmVyaWZ5QmFua1JlcXVlc3QnO1xuaW1wb3J0IHsgVmVyaWZ5RGVsZXRlUmVjb3ZlclJlcXVlc3QgfSBmcm9tICcuLi9tb2RlbHMvcmVxdWVzdC92ZXJpZnlEZWxldGVSZWNvdmVyUmVxdWVzdCc7XG5pbXBvcnQgeyBWZXJpZnlFbWFpbFJlcXVlc3QgfSBmcm9tICcuLi9tb2RlbHMvcmVxdWVzdC92ZXJpZnlFbWFpbFJlcXVlc3QnO1xuXG5pbXBvcnQgeyBVdGlscyB9IGZyb20gJy4uL21pc2MvdXRpbHMnO1xuXG5pbXBvcnQgeyBBcGlLZXlSZXNwb25zZSB9IGZyb20gJy4uL21vZGVscy9yZXNwb25zZS9hcGlLZXlSZXNwb25zZSc7XG5pbXBvcnQgeyBBdHRhY2htZW50UmVzcG9uc2UgfSBmcm9tICcuLi9tb2RlbHMvcmVzcG9uc2UvYXR0YWNobWVudFJlc3BvbnNlJztcbmltcG9ydCB7IEF0dGFjaG1lbnRVcGxvYWREYXRhUmVzcG9uc2UgfSBmcm9tICcuLi9tb2RlbHMvcmVzcG9uc2UvYXR0YWNobWVudFVwbG9hZERhdGFSZXNwb25zZSc7XG5pbXBvcnQgeyBCaWxsaW5nUmVzcG9uc2UgfSBmcm9tICcuLi9tb2RlbHMvcmVzcG9uc2UvYmlsbGluZ1Jlc3BvbnNlJztcbmltcG9ydCB7IEJyZWFjaEFjY291bnRSZXNwb25zZSB9IGZyb20gJy4uL21vZGVscy9yZXNwb25zZS9icmVhY2hBY2NvdW50UmVzcG9uc2UnO1xuaW1wb3J0IHsgQ2lwaGVyUmVzcG9uc2UgfSBmcm9tICcuLi9tb2RlbHMvcmVzcG9uc2UvY2lwaGVyUmVzcG9uc2UnO1xuaW1wb3J0IHtcbiAgICBDb2xsZWN0aW9uR3JvdXBEZXRhaWxzUmVzcG9uc2UsXG4gICAgQ29sbGVjdGlvblJlc3BvbnNlLFxufSBmcm9tICcuLi9tb2RlbHMvcmVzcG9uc2UvY29sbGVjdGlvblJlc3BvbnNlJztcbmltcG9ydCB7IERvbWFpbnNSZXNwb25zZSB9IGZyb20gJy4uL21vZGVscy9yZXNwb25zZS9kb21haW5zUmVzcG9uc2UnO1xuaW1wb3J0IHtcbiAgICBFbWVyZ2VuY3lBY2Nlc3NHcmFudGVlRGV0YWlsc1Jlc3BvbnNlLFxuICAgIEVtZXJnZW5jeUFjY2Vzc0dyYW50b3JEZXRhaWxzUmVzcG9uc2UsXG4gICAgRW1lcmdlbmN5QWNjZXNzVGFrZW92ZXJSZXNwb25zZSxcbiAgICBFbWVyZ2VuY3lBY2Nlc3NWaWV3UmVzcG9uc2Vcbn0gZnJvbSAnLi4vbW9kZWxzL3Jlc3BvbnNlL2VtZXJnZW5jeUFjY2Vzc1Jlc3BvbnNlJztcbmltcG9ydCB7IEVycm9yUmVzcG9uc2UgfSBmcm9tICcuLi9tb2RlbHMvcmVzcG9uc2UvZXJyb3JSZXNwb25zZSc7XG5pbXBvcnQgeyBFdmVudFJlc3BvbnNlIH0gZnJvbSAnLi4vbW9kZWxzL3Jlc3BvbnNlL2V2ZW50UmVzcG9uc2UnO1xuaW1wb3J0IHsgRm9sZGVyUmVzcG9uc2UgfSBmcm9tICcuLi9tb2RlbHMvcmVzcG9uc2UvZm9sZGVyUmVzcG9uc2UnO1xuaW1wb3J0IHtcbiAgICBHcm91cERldGFpbHNSZXNwb25zZSxcbiAgICBHcm91cFJlc3BvbnNlLFxufSBmcm9tICcuLi9tb2RlbHMvcmVzcG9uc2UvZ3JvdXBSZXNwb25zZSc7XG5pbXBvcnQgeyBJZGVudGl0eUNhcHRjaGFSZXNwb25zZSB9IGZyb20gJy4uL21vZGVscy9yZXNwb25zZS9pZGVudGl0eUNhcHRjaGFSZXNwb25zZSc7XG5pbXBvcnQgeyBJZGVudGl0eVRva2VuUmVzcG9uc2UgfSBmcm9tICcuLi9tb2RlbHMvcmVzcG9uc2UvaWRlbnRpdHlUb2tlblJlc3BvbnNlJztcbmltcG9ydCB7IElkZW50aXR5VHdvRmFjdG9yUmVzcG9uc2UgfSBmcm9tICcuLi9tb2RlbHMvcmVzcG9uc2UvaWRlbnRpdHlUd29GYWN0b3JSZXNwb25zZSc7XG5pbXBvcnQgeyBMaXN0UmVzcG9uc2UgfSBmcm9tICcuLi9tb2RlbHMvcmVzcG9uc2UvbGlzdFJlc3BvbnNlJztcbmltcG9ydCB7IE9yZ2FuaXphdGlvblNzb1Jlc3BvbnNlIH0gZnJvbSAnLi4vbW9kZWxzL3Jlc3BvbnNlL29yZ2FuaXphdGlvbi9vcmdhbml6YXRpb25Tc29SZXNwb25zZSc7XG5pbXBvcnQgeyBPcmdhbml6YXRpb25BdXRvRW5yb2xsU3RhdHVzUmVzcG9uc2UgfSBmcm9tICcuLi9tb2RlbHMvcmVzcG9uc2Uvb3JnYW5pemF0aW9uQXV0b0Vucm9sbFN0YXR1c1Jlc3BvbnNlJztcbmltcG9ydCB7IE9yZ2FuaXphdGlvbktleXNSZXNwb25zZSB9IGZyb20gJy4uL21vZGVscy9yZXNwb25zZS9vcmdhbml6YXRpb25LZXlzUmVzcG9uc2UnO1xuaW1wb3J0IHsgT3JnYW5pemF0aW9uUmVzcG9uc2UgfSBmcm9tICcuLi9tb2RlbHMvcmVzcG9uc2Uvb3JnYW5pemF0aW9uUmVzcG9uc2UnO1xuaW1wb3J0IHsgT3JnYW5pemF0aW9uU3Vic2NyaXB0aW9uUmVzcG9uc2UgfSBmcm9tICcuLi9tb2RlbHMvcmVzcG9uc2Uvb3JnYW5pemF0aW9uU3Vic2NyaXB0aW9uUmVzcG9uc2UnO1xuaW1wb3J0IHsgT3JnYW5pemF0aW9uVXNlckJ1bGtQdWJsaWNLZXlSZXNwb25zZSB9IGZyb20gJy4uL21vZGVscy9yZXNwb25zZS9vcmdhbml6YXRpb25Vc2VyQnVsa1B1YmxpY0tleVJlc3BvbnNlJztcbmltcG9ydCB7IE9yZ2FuaXphdGlvblVzZXJCdWxrUmVzcG9uc2UgfSBmcm9tICcuLi9tb2RlbHMvcmVzcG9uc2Uvb3JnYW5pemF0aW9uVXNlckJ1bGtSZXNwb25zZSc7XG5pbXBvcnQge1xuICAgIE9yZ2FuaXphdGlvblVzZXJEZXRhaWxzUmVzcG9uc2UsXG4gICAgT3JnYW5pemF0aW9uVXNlclJlc2V0UGFzc3dvcmREZXRhaWxzUmVwb25zZSxcbiAgICBPcmdhbml6YXRpb25Vc2VyVXNlckRldGFpbHNSZXNwb25zZSxcbn0gZnJvbSAnLi4vbW9kZWxzL3Jlc3BvbnNlL29yZ2FuaXphdGlvblVzZXJSZXNwb25zZSc7XG5pbXBvcnQgeyBQYXltZW50UmVzcG9uc2UgfSBmcm9tICcuLi9tb2RlbHMvcmVzcG9uc2UvcGF5bWVudFJlc3BvbnNlJztcbmltcG9ydCB7IFBsYW5SZXNwb25zZSB9IGZyb20gJy4uL21vZGVscy9yZXNwb25zZS9wbGFuUmVzcG9uc2UnO1xuaW1wb3J0IHsgUG9saWN5UmVzcG9uc2UgfSBmcm9tICcuLi9tb2RlbHMvcmVzcG9uc2UvcG9saWN5UmVzcG9uc2UnO1xuaW1wb3J0IHsgUHJlbG9naW5SZXNwb25zZSB9IGZyb20gJy4uL21vZGVscy9yZXNwb25zZS9wcmVsb2dpblJlc3BvbnNlJztcbmltcG9ydCB7IFByb2ZpbGVSZXNwb25zZSB9IGZyb20gJy4uL21vZGVscy9yZXNwb25zZS9wcm9maWxlUmVzcG9uc2UnO1xuaW1wb3J0IHsgUHJvdmlkZXJPcmdhbml6YXRpb25Pcmdhbml6YXRpb25EZXRhaWxzUmVzcG9uc2UsIFByb3ZpZGVyT3JnYW5pemF0aW9uUmVzcG9uc2UgfSBmcm9tICcuLi9tb2RlbHMvcmVzcG9uc2UvcHJvdmlkZXIvcHJvdmlkZXJPcmdhbml6YXRpb25SZXNwb25zZSc7XG5pbXBvcnQgeyBQcm92aWRlclJlc3BvbnNlIH0gZnJvbSAnLi4vbW9kZWxzL3Jlc3BvbnNlL3Byb3ZpZGVyL3Byb3ZpZGVyUmVzcG9uc2UnO1xuaW1wb3J0IHsgUHJvdmlkZXJVc2VyQnVsa1B1YmxpY0tleVJlc3BvbnNlIH0gZnJvbSAnLi4vbW9kZWxzL3Jlc3BvbnNlL3Byb3ZpZGVyL3Byb3ZpZGVyVXNlckJ1bGtQdWJsaWNLZXlSZXNwb25zZSc7XG5pbXBvcnQgeyBQcm92aWRlclVzZXJCdWxrUmVzcG9uc2UgfSBmcm9tICcuLi9tb2RlbHMvcmVzcG9uc2UvcHJvdmlkZXIvcHJvdmlkZXJVc2VyQnVsa1Jlc3BvbnNlJztcbmltcG9ydCB7XG4gICAgUHJvdmlkZXJVc2VyUmVzcG9uc2UsXG4gICAgUHJvdmlkZXJVc2VyVXNlckRldGFpbHNSZXNwb25zZVxufSBmcm9tICcuLi9tb2RlbHMvcmVzcG9uc2UvcHJvdmlkZXIvcHJvdmlkZXJVc2VyUmVzcG9uc2UnO1xuaW1wb3J0IHsgU2VsZWN0aW9uUmVhZE9ubHlSZXNwb25zZSB9IGZyb20gJy4uL21vZGVscy9yZXNwb25zZS9zZWxlY3Rpb25SZWFkT25seVJlc3BvbnNlJztcbmltcG9ydCB7IFNlbmRBY2Nlc3NSZXNwb25zZSB9IGZyb20gJy4uL21vZGVscy9yZXNwb25zZS9zZW5kQWNjZXNzUmVzcG9uc2UnO1xuaW1wb3J0IHsgU2VuZEZpbGVEb3dubG9hZERhdGFSZXNwb25zZSB9IGZyb20gJy4uL21vZGVscy9yZXNwb25zZS9zZW5kRmlsZURvd25sb2FkRGF0YVJlc3BvbnNlJztcbmltcG9ydCB7IFNlbmRGaWxlVXBsb2FkRGF0YVJlc3BvbnNlIH0gZnJvbSAnLi4vbW9kZWxzL3Jlc3BvbnNlL3NlbmRGaWxlVXBsb2FkRGF0YVJlc3BvbnNlJztcbmltcG9ydCB7IFNlbmRSZXNwb25zZSB9IGZyb20gJy4uL21vZGVscy9yZXNwb25zZS9zZW5kUmVzcG9uc2UnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uUmVzcG9uc2UgfSBmcm9tICcuLi9tb2RlbHMvcmVzcG9uc2Uvc3Vic2NyaXB0aW9uUmVzcG9uc2UnO1xuaW1wb3J0IHsgU3luY1Jlc3BvbnNlIH0gZnJvbSAnLi4vbW9kZWxzL3Jlc3BvbnNlL3N5bmNSZXNwb25zZSc7XG5pbXBvcnQgeyBUYXhJbmZvUmVzcG9uc2UgfSBmcm9tICcuLi9tb2RlbHMvcmVzcG9uc2UvdGF4SW5mb1Jlc3BvbnNlJztcbmltcG9ydCB7IFRheFJhdGVSZXNwb25zZSB9IGZyb20gJy4uL21vZGVscy9yZXNwb25zZS90YXhSYXRlUmVzcG9uc2UnO1xuaW1wb3J0IHsgVHdvRmFjdG9yQXV0aGVudGljYXRvclJlc3BvbnNlIH0gZnJvbSAnLi4vbW9kZWxzL3Jlc3BvbnNlL3R3b0ZhY3RvckF1dGhlbnRpY2F0b3JSZXNwb25zZSc7XG5pbXBvcnQgeyBUd29GYWN0b3JEdW9SZXNwb25zZSB9IGZyb20gJy4uL21vZGVscy9yZXNwb25zZS90d29GYWN0b3JEdW9SZXNwb25zZSc7XG5pbXBvcnQgeyBUd29GYWN0b3JFbWFpbFJlc3BvbnNlIH0gZnJvbSAnLi4vbW9kZWxzL3Jlc3BvbnNlL3R3b0ZhY3RvckVtYWlsUmVzcG9uc2UnO1xuaW1wb3J0IHsgVHdvRmFjdG9yUHJvdmlkZXJSZXNwb25zZSB9IGZyb20gJy4uL21vZGVscy9yZXNwb25zZS90d29GYWN0b3JQcm92aWRlclJlc3BvbnNlJztcbmltcG9ydCB7IFR3b0ZhY3RvclJlY292ZXJSZXNwb25zZSB9IGZyb20gJy4uL21vZGVscy9yZXNwb25zZS90d29GYWN0b3JSZXNjb3ZlclJlc3BvbnNlJztcbmltcG9ydCB7IFR3b0ZhY3RvcldlYkF1dGhuUmVzcG9uc2UgfSBmcm9tICcuLi9tb2RlbHMvcmVzcG9uc2UvdHdvRmFjdG9yV2ViQXV0aG5SZXNwb25zZSc7XG5pbXBvcnQgeyBDaGFsbGVuZ2VSZXNwb25zZSB9IGZyb20gJy4uL21vZGVscy9yZXNwb25zZS90d29GYWN0b3JXZWJBdXRoblJlc3BvbnNlJztcbmltcG9ydCB7IFR3b0ZhY3Rvcll1YmlLZXlSZXNwb25zZSB9IGZyb20gJy4uL21vZGVscy9yZXNwb25zZS90d29GYWN0b3JZdWJpS2V5UmVzcG9uc2UnO1xuaW1wb3J0IHsgVXNlcktleVJlc3BvbnNlIH0gZnJvbSAnLi4vbW9kZWxzL3Jlc3BvbnNlL3VzZXJLZXlSZXNwb25zZSc7XG5cbmltcG9ydCB7IFNldENyeXB0b0FnZW50S2V5UmVxdWVzdCB9IGZyb20gJy4uL21vZGVscy9yZXF1ZXN0L2FjY291bnQvc2V0Q3J5cHRvQWdlbnRLZXlSZXF1ZXN0JztcbmltcG9ydCB7IENyeXB0b0FnZW50VXNlcktleVJlcXVlc3QgfSBmcm9tICcuLi9tb2RlbHMvcmVxdWVzdC9jcnlwdG9BZ2VudFVzZXJLZXlSZXF1ZXN0JztcbmltcG9ydCB7IENyeXB0b0FnZW50VXNlcktleVJlc3BvbnNlIH0gZnJvbSAnLi4vbW9kZWxzL3Jlc3BvbnNlL2NyeXB0b0FnZW50VXNlcktleVJlc3BvbnNlJztcbmltcG9ydCB7IFNlbmRBY2Nlc3NWaWV3IH0gZnJvbSAnLi4vbW9kZWxzL3ZpZXcvc2VuZEFjY2Vzc1ZpZXcnO1xuXG5leHBvcnQgY2xhc3MgQXBpU2VydmljZSBpbXBsZW1lbnRzIEFwaVNlcnZpY2VBYnN0cmFjdGlvbiB7XG4gICAgcHJvdGVjdGVkIGFwaUtleVJlZnJlc2g6IChjbGllbnRJZDogc3RyaW5nLCBjbGllbnRTZWNyZXQ6IHN0cmluZykgPT4gUHJvbWlzZTxhbnk+O1xuICAgIHByaXZhdGUgZGV2aWNlOiBEZXZpY2VUeXBlO1xuICAgIHByaXZhdGUgZGV2aWNlVHlwZTogc3RyaW5nO1xuICAgIHByaXZhdGUgaXNXZWJDbGllbnQgPSBmYWxzZTtcbiAgICBwcml2YXRlIGlzRGVza3RvcENsaWVudCA9IGZhbHNlO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSB0b2tlblNlcnZpY2U6IFRva2VuU2VydmljZSwgcHJpdmF0ZSBwbGF0Zm9ybVV0aWxzU2VydmljZTogUGxhdGZvcm1VdGlsc1NlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgZW52aXJvbm1lbnRTZXJ2aWNlOiBFbnZpcm9ubWVudFNlcnZpY2UsIHByaXZhdGUgbG9nb3V0Q2FsbGJhY2s6IChleHBpcmVkOiBib29sZWFuKSA9PiBQcm9taXNlPHZvaWQ+LFxuICAgICAgICBwcml2YXRlIGN1c3RvbVVzZXJBZ2VudDogc3RyaW5nID0gbnVsbCkge1xuICAgICAgICB0aGlzLmRldmljZSA9IHBsYXRmb3JtVXRpbHNTZXJ2aWNlLmdldERldmljZSgpO1xuICAgICAgICB0aGlzLmRldmljZVR5cGUgPSB0aGlzLmRldmljZS50b1N0cmluZygpO1xuICAgICAgICB0aGlzLmlzV2ViQ2xpZW50ID0gdGhpcy5kZXZpY2UgPT09IERldmljZVR5cGUuSUVCcm93c2VyIHx8IHRoaXMuZGV2aWNlID09PSBEZXZpY2VUeXBlLkNocm9tZUJyb3dzZXIgfHxcbiAgICAgICAgICAgIHRoaXMuZGV2aWNlID09PSBEZXZpY2VUeXBlLkVkZ2VCcm93c2VyIHx8IHRoaXMuZGV2aWNlID09PSBEZXZpY2VUeXBlLkZpcmVmb3hCcm93c2VyIHx8XG4gICAgICAgICAgICB0aGlzLmRldmljZSA9PT0gRGV2aWNlVHlwZS5PcGVyYUJyb3dzZXIgfHwgdGhpcy5kZXZpY2UgPT09IERldmljZVR5cGUuU2FmYXJpQnJvd3NlciB8fFxuICAgICAgICAgICAgdGhpcy5kZXZpY2UgPT09IERldmljZVR5cGUuVW5rbm93bkJyb3dzZXIgfHwgdGhpcy5kZXZpY2UgPT09IERldmljZVR5cGUuVml2YWxkaUJyb3dzZXI7XG4gICAgICAgIHRoaXMuaXNEZXNrdG9wQ2xpZW50ID0gdGhpcy5kZXZpY2UgPT09IERldmljZVR5cGUuV2luZG93c0Rlc2t0b3AgfHwgdGhpcy5kZXZpY2UgPT09IERldmljZVR5cGUuTWFjT3NEZXNrdG9wIHx8XG4gICAgICAgICAgICB0aGlzLmRldmljZSA9PT0gRGV2aWNlVHlwZS5MaW51eERlc2t0b3A7XG4gICAgfVxuXG4gICAgLy8gQXV0aCBBUElzXG5cbiAgICBhc3luYyBwb3N0SWRlbnRpdHlUb2tlbihyZXF1ZXN0OiBUb2tlblJlcXVlc3QpOiBQcm9taXNlPElkZW50aXR5VG9rZW5SZXNwb25zZSB8IElkZW50aXR5VHdvRmFjdG9yUmVzcG9uc2UgfCBJZGVudGl0eUNhcHRjaGFSZXNwb25zZT4ge1xuICAgICAgICBjb25zdCBoZWFkZXJzID0gbmV3IEhlYWRlcnMoe1xuICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7IGNoYXJzZXQ9dXRmLTgnLFxuICAgICAgICAgICAgJ0FjY2VwdCc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgICdEZXZpY2UtVHlwZSc6IHRoaXMuZGV2aWNlVHlwZSxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICh0aGlzLmN1c3RvbVVzZXJBZ2VudCAhPSBudWxsKSB7XG4gICAgICAgICAgICBoZWFkZXJzLnNldCgnVXNlci1BZ2VudCcsIHRoaXMuY3VzdG9tVXNlckFnZW50KTtcbiAgICAgICAgfVxuICAgICAgICByZXF1ZXN0LmFsdGVySWRlbnRpdHlUb2tlbkhlYWRlcnMoaGVhZGVycyk7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5mZXRjaChuZXcgUmVxdWVzdCh0aGlzLmVudmlyb25tZW50U2VydmljZS5nZXRJZGVudGl0eVVybCgpICsgJy9jb25uZWN0L3Rva2VuJywge1xuICAgICAgICAgICAgYm9keTogdGhpcy5xc1N0cmluZ2lmeShyZXF1ZXN0LnRvSWRlbnRpdHlUb2tlbihyZXF1ZXN0LmNsaWVudElkID8/IHRoaXMucGxhdGZvcm1VdGlsc1NlcnZpY2UuaWRlbnRpdHlDbGllbnRJZCkpLFxuICAgICAgICAgICAgY3JlZGVudGlhbHM6IHRoaXMuZ2V0Q3JlZGVudGlhbHMoKSxcbiAgICAgICAgICAgIGNhY2hlOiAnbm8tc3RvcmUnLFxuICAgICAgICAgICAgaGVhZGVyczogaGVhZGVycyxcbiAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICB9KSk7XG5cbiAgICAgICAgbGV0IHJlc3BvbnNlSnNvbjogYW55ID0gbnVsbDtcbiAgICAgICAgaWYgKHRoaXMuaXNKc29uUmVzcG9uc2UocmVzcG9uc2UpKSB7XG4gICAgICAgICAgICByZXNwb25zZUpzb24gPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVzcG9uc2VKc29uICE9IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSWRlbnRpdHlUb2tlblJlc3BvbnNlKHJlc3BvbnNlSnNvbik7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNDAwICYmIHJlc3BvbnNlSnNvbi5Ud29GYWN0b3JQcm92aWRlcnMyICYmXG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXMocmVzcG9uc2VKc29uLlR3b0ZhY3RvclByb3ZpZGVyczIpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMudG9rZW5TZXJ2aWNlLmNsZWFyVHdvRmFjdG9yVG9rZW4ocmVxdWVzdC5lbWFpbCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBJZGVudGl0eVR3b0ZhY3RvclJlc3BvbnNlKHJlc3BvbnNlSnNvbik7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNDAwICYmIHJlc3BvbnNlSnNvbi5IQ2FwdGNoYV9TaXRlS2V5ICYmXG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXMocmVzcG9uc2VKc29uLkhDYXB0Y2hhX1NpdGVLZXkpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSWRlbnRpdHlDYXB0Y2hhUmVzcG9uc2UocmVzcG9uc2VKc29uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3JSZXNwb25zZShyZXNwb25zZUpzb24sIHJlc3BvbnNlLnN0YXR1cywgdHJ1ZSkpO1xuICAgIH1cblxuICAgIGFzeW5jIHJlZnJlc2hJZGVudGl0eVRva2VuKCk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmRvQXV0aFJlZnJlc2goKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG51bGwpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gQWNjb3VudCBBUElzXG5cbiAgICBhc3luYyBnZXRQcm9maWxlKCk6IFByb21pc2U8UHJvZmlsZVJlc3BvbnNlPiB7XG4gICAgICAgIGNvbnN0IHIgPSBhd2FpdCB0aGlzLnNlbmQoJ0dFVCcsICcvYWNjb3VudHMvcHJvZmlsZScsIG51bGwsIHRydWUsIHRydWUpO1xuICAgICAgICByZXR1cm4gbmV3IFByb2ZpbGVSZXNwb25zZShyKTtcbiAgICB9XG5cbiAgICBhc3luYyBnZXRVc2VyQmlsbGluZygpOiBQcm9taXNlPEJpbGxpbmdSZXNwb25zZT4ge1xuICAgICAgICBjb25zdCByID0gYXdhaXQgdGhpcy5zZW5kKCdHRVQnLCAnL2FjY291bnRzL2JpbGxpbmcnLCBudWxsLCB0cnVlLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIG5ldyBCaWxsaW5nUmVzcG9uc2Uocik7XG4gICAgfVxuXG4gICAgYXN5bmMgZ2V0VXNlclN1YnNjcmlwdGlvbigpOiBQcm9taXNlPFN1YnNjcmlwdGlvblJlc3BvbnNlPiB7XG4gICAgICAgIGNvbnN0IHIgPSBhd2FpdCB0aGlzLnNlbmQoJ0dFVCcsICcvYWNjb3VudHMvc3Vic2NyaXB0aW9uJywgbnVsbCwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiBuZXcgU3Vic2NyaXB0aW9uUmVzcG9uc2Uocik7XG4gICAgfVxuXG4gICAgYXN5bmMgZ2V0VGF4SW5mbygpOiBQcm9taXNlPFRheEluZm9SZXNwb25zZT4ge1xuICAgICAgICBjb25zdCByID0gYXdhaXQgdGhpcy5zZW5kKCdHRVQnLCAnL2FjY291bnRzL3RheCcsIG51bGwsIHRydWUsIHRydWUpO1xuICAgICAgICByZXR1cm4gbmV3IFRheEluZm9SZXNwb25zZShyKTtcbiAgICB9XG5cbiAgICBhc3luYyBwdXRQcm9maWxlKHJlcXVlc3Q6IFVwZGF0ZVByb2ZpbGVSZXF1ZXN0KTogUHJvbWlzZTxQcm9maWxlUmVzcG9uc2U+IHtcbiAgICAgICAgY29uc3QgciA9IGF3YWl0IHRoaXMuc2VuZCgnUFVUJywgJy9hY2NvdW50cy9wcm9maWxlJywgcmVxdWVzdCwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiBuZXcgUHJvZmlsZVJlc3BvbnNlKHIpO1xuICAgIH1cblxuICAgIHB1dFRheEluZm8ocmVxdWVzdDogVGF4SW5mb1VwZGF0ZVJlcXVlc3QpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zZW5kKCdQVVQnLCAnL2FjY291bnRzL3RheCcsIHJlcXVlc3QsIHRydWUsIGZhbHNlKTtcbiAgICB9XG5cbiAgICBhc3luYyBwb3N0UHJlbG9naW4ocmVxdWVzdDogUHJlbG9naW5SZXF1ZXN0KTogUHJvbWlzZTxQcmVsb2dpblJlc3BvbnNlPiB7XG4gICAgICAgIGNvbnN0IHIgPSBhd2FpdCB0aGlzLnNlbmQoJ1BPU1QnLCAnL2FjY291bnRzL3ByZWxvZ2luJywgcmVxdWVzdCwgZmFsc2UsIHRydWUpO1xuICAgICAgICByZXR1cm4gbmV3IFByZWxvZ2luUmVzcG9uc2Uocik7XG4gICAgfVxuXG4gICAgcG9zdEVtYWlsVG9rZW4ocmVxdWVzdDogRW1haWxUb2tlblJlcXVlc3QpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zZW5kKCdQT1NUJywgJy9hY2NvdW50cy9lbWFpbC10b2tlbicsIHJlcXVlc3QsIHRydWUsIGZhbHNlKTtcbiAgICB9XG5cbiAgICBwb3N0RW1haWwocmVxdWVzdDogRW1haWxSZXF1ZXN0KTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VuZCgnUE9TVCcsICcvYWNjb3VudHMvZW1haWwnLCByZXF1ZXN0LCB0cnVlLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgcG9zdFBhc3N3b3JkKHJlcXVlc3Q6IFBhc3N3b3JkUmVxdWVzdCk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlbmQoJ1BPU1QnLCAnL2FjY291bnRzL3Bhc3N3b3JkJywgcmVxdWVzdCwgdHJ1ZSwgZmFsc2UpO1xuICAgIH1cblxuICAgIHNldFBhc3N3b3JkKHJlcXVlc3Q6IFNldFBhc3N3b3JkUmVxdWVzdCk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlbmQoJ1BPU1QnLCAnL2FjY291bnRzL3NldC1wYXNzd29yZCcsIHJlcXVlc3QsIHRydWUsIGZhbHNlKTtcbiAgICB9XG5cbiAgICBwb3N0U2V0Q3J5cHRvQWdlbnRLZXkocmVxdWVzdDogU2V0Q3J5cHRvQWdlbnRLZXlSZXF1ZXN0KTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VuZCgnUE9TVCcsICcvYWNjb3VudHMvc2V0LWNyeXB0by1hZ2VudC1rZXknLCByZXF1ZXN0LCB0cnVlLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgcG9zdFNlY3VyaXR5U3RhbXAocmVxdWVzdDogUGFzc3dvcmRWZXJpZmljYXRpb25SZXF1ZXN0KTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VuZCgnUE9TVCcsICcvYWNjb3VudHMvc2VjdXJpdHktc3RhbXAnLCByZXF1ZXN0LCB0cnVlLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgZGVsZXRlQWNjb3VudChyZXF1ZXN0OiBQYXNzd29yZFZlcmlmaWNhdGlvblJlcXVlc3QpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zZW5kKCdERUxFVEUnLCAnL2FjY291bnRzJywgcmVxdWVzdCwgdHJ1ZSwgZmFsc2UpO1xuICAgIH1cblxuICAgIGFzeW5jIGdldEFjY291bnRSZXZpc2lvbkRhdGUoKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICAgICAgY29uc3QgciA9IGF3YWl0IHRoaXMuc2VuZCgnR0VUJywgJy9hY2NvdW50cy9yZXZpc2lvbi1kYXRlJywgbnVsbCwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiByIGFzIG51bWJlcjtcbiAgICB9XG5cbiAgICBwb3N0UGFzc3dvcmRIaW50KHJlcXVlc3Q6IFBhc3N3b3JkSGludFJlcXVlc3QpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zZW5kKCdQT1NUJywgJy9hY2NvdW50cy9wYXNzd29yZC1oaW50JywgcmVxdWVzdCwgZmFsc2UsIGZhbHNlKTtcbiAgICB9XG5cbiAgICBwb3N0UmVnaXN0ZXIocmVxdWVzdDogUmVnaXN0ZXJSZXF1ZXN0KTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VuZCgnUE9TVCcsICcvYWNjb3VudHMvcmVnaXN0ZXInLCByZXF1ZXN0LCBmYWxzZSwgZmFsc2UpO1xuICAgIH1cblxuICAgIGFzeW5jIHBvc3RQcmVtaXVtKGRhdGE6IEZvcm1EYXRhKTogUHJvbWlzZTxQYXltZW50UmVzcG9uc2U+IHtcbiAgICAgICAgY29uc3QgciA9IGF3YWl0IHRoaXMuc2VuZCgnUE9TVCcsICcvYWNjb3VudHMvcHJlbWl1bScsIGRhdGEsIHRydWUsIHRydWUpO1xuICAgICAgICByZXR1cm4gbmV3IFBheW1lbnRSZXNwb25zZShyKTtcbiAgICB9XG5cbiAgICBhc3luYyBwb3N0SWFwQ2hlY2socmVxdWVzdDogSWFwQ2hlY2tSZXF1ZXN0KTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VuZCgnUE9TVCcsICcvYWNjb3VudHMvaWFwLWNoZWNrJywgcmVxdWVzdCwgdHJ1ZSwgZmFsc2UpO1xuICAgIH1cblxuICAgIHBvc3RSZWluc3RhdGVQcmVtaXVtKCk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlbmQoJ1BPU1QnLCAnL2FjY291bnRzL3JlaW5zdGF0ZS1wcmVtaXVtJywgbnVsbCwgdHJ1ZSwgZmFsc2UpO1xuICAgIH1cblxuICAgIHBvc3RDYW5jZWxQcmVtaXVtKCk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlbmQoJ1BPU1QnLCAnL2FjY291bnRzL2NhbmNlbC1wcmVtaXVtJywgbnVsbCwgdHJ1ZSwgZmFsc2UpO1xuICAgIH1cblxuICAgIGFzeW5jIHBvc3RBY2NvdW50U3RvcmFnZShyZXF1ZXN0OiBTdG9yYWdlUmVxdWVzdCk6IFByb21pc2U8UGF5bWVudFJlc3BvbnNlPiB7XG4gICAgICAgIGNvbnN0IHIgPSBhd2FpdCB0aGlzLnNlbmQoJ1BPU1QnLCAnL2FjY291bnRzL3N0b3JhZ2UnLCByZXF1ZXN0LCB0cnVlLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIG5ldyBQYXltZW50UmVzcG9uc2Uocik7XG4gICAgfVxuXG4gICAgcG9zdEFjY291bnRQYXltZW50KHJlcXVlc3Q6IFBheW1lbnRSZXF1ZXN0KTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VuZCgnUE9TVCcsICcvYWNjb3VudHMvcGF5bWVudCcsIHJlcXVlc3QsIHRydWUsIGZhbHNlKTtcbiAgICB9XG5cbiAgICBwb3N0QWNjb3VudExpY2Vuc2UoZGF0YTogRm9ybURhdGEpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zZW5kKCdQT1NUJywgJy9hY2NvdW50cy9saWNlbnNlJywgZGF0YSwgdHJ1ZSwgZmFsc2UpO1xuICAgIH1cblxuICAgIHBvc3RBY2NvdW50S2V5cyhyZXF1ZXN0OiBLZXlzUmVxdWVzdCk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlbmQoJ1BPU1QnLCAnL2FjY291bnRzL2tleXMnLCByZXF1ZXN0LCB0cnVlLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgcG9zdEFjY291bnRLZXkocmVxdWVzdDogVXBkYXRlS2V5UmVxdWVzdCk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlbmQoJ1BPU1QnLCAnL2FjY291bnRzL2tleScsIHJlcXVlc3QsIHRydWUsIGZhbHNlKTtcbiAgICB9XG5cbiAgICBwb3N0QWNjb3VudFZlcmlmeUVtYWlsKCk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlbmQoJ1BPU1QnLCAnL2FjY291bnRzL3ZlcmlmeS1lbWFpbCcsIG51bGwsIHRydWUsIGZhbHNlKTtcbiAgICB9XG5cbiAgICBwb3N0QWNjb3VudFZlcmlmeUVtYWlsVG9rZW4ocmVxdWVzdDogVmVyaWZ5RW1haWxSZXF1ZXN0KTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VuZCgnUE9TVCcsICcvYWNjb3VudHMvdmVyaWZ5LWVtYWlsLXRva2VuJywgcmVxdWVzdCwgZmFsc2UsIGZhbHNlKTtcbiAgICB9XG5cbiAgICBwb3N0QWNjb3VudFZlcmlmeVBhc3N3b3JkKHJlcXVlc3Q6IFBhc3N3b3JkVmVyaWZpY2F0aW9uUmVxdWVzdCk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlbmQoJ1BPU1QnLCAnL2FjY291bnRzL3ZlcmlmeS1wYXNzd29yZCcsIHJlcXVlc3QsIHRydWUsIGZhbHNlKTtcbiAgICB9XG5cbiAgICBwb3N0QWNjb3VudFJlY292ZXJEZWxldGUocmVxdWVzdDogRGVsZXRlUmVjb3ZlclJlcXVlc3QpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zZW5kKCdQT1NUJywgJy9hY2NvdW50cy9kZWxldGUtcmVjb3ZlcicsIHJlcXVlc3QsIGZhbHNlLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgcG9zdEFjY291bnRSZWNvdmVyRGVsZXRlVG9rZW4ocmVxdWVzdDogVmVyaWZ5RGVsZXRlUmVjb3ZlclJlcXVlc3QpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zZW5kKCdQT1NUJywgJy9hY2NvdW50cy9kZWxldGUtcmVjb3Zlci10b2tlbicsIHJlcXVlc3QsIGZhbHNlLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgcG9zdEFjY291bnRLZGYocmVxdWVzdDogS2RmUmVxdWVzdCk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlbmQoJ1BPU1QnLCAnL2FjY291bnRzL2tkZicsIHJlcXVlc3QsIHRydWUsIGZhbHNlKTtcbiAgICB9XG5cbiAgICBhc3luYyBkZWxldGVTc29Vc2VyKG9yZ2FuaXphdGlvbklkOiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zZW5kKCdERUxFVEUnLCAnL2FjY291bnRzL3Nzby8nICsgb3JnYW5pemF0aW9uSWQsIG51bGwsIHRydWUsIGZhbHNlKTtcbiAgICB9XG5cbiAgICBhc3luYyBnZXRTc29Vc2VySWRlbnRpZmllcigpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zZW5kKCdHRVQnLCAnL2FjY291bnRzL3Nzby91c2VyLWlkZW50aWZpZXInLCBudWxsLCB0cnVlLCB0cnVlKTtcbiAgICB9XG5cbiAgICBhc3luYyBwb3N0VXNlckFwaUtleShpZDogc3RyaW5nLCByZXF1ZXN0OiBQYXNzd29yZFZlcmlmaWNhdGlvblJlcXVlc3QpOiBQcm9taXNlPEFwaUtleVJlc3BvbnNlPiB7XG4gICAgICAgIGNvbnN0IHIgPSBhd2FpdCB0aGlzLnNlbmQoJ1BPU1QnLCAnL2FjY291bnRzL2FwaS1rZXknLCByZXF1ZXN0LCB0cnVlLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIG5ldyBBcGlLZXlSZXNwb25zZShyKTtcbiAgICB9XG5cbiAgICBhc3luYyBwb3N0VXNlclJvdGF0ZUFwaUtleShpZDogc3RyaW5nLCByZXF1ZXN0OiBQYXNzd29yZFZlcmlmaWNhdGlvblJlcXVlc3QpOiBQcm9taXNlPEFwaUtleVJlc3BvbnNlPiB7XG4gICAgICAgIGNvbnN0IHIgPSBhd2FpdCB0aGlzLnNlbmQoJ1BPU1QnLCAnL2FjY291bnRzL3JvdGF0ZS1hcGkta2V5JywgcmVxdWVzdCwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiBuZXcgQXBpS2V5UmVzcG9uc2Uocik7XG4gICAgfVxuXG4gICAgcHV0VXBkYXRlVGVtcFBhc3N3b3JkKHJlcXVlc3Q6IFVwZGF0ZVRlbXBQYXNzd29yZFJlcXVlc3QpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zZW5kKCdQVVQnLCAnL2FjY291bnRzL3VwZGF0ZS10ZW1wLXBhc3N3b3JkJywgcmVxdWVzdCwgdHJ1ZSwgZmFsc2UpO1xuICAgIH1cblxuICAgIC8vIEZvbGRlciBBUElzXG5cbiAgICBhc3luYyBnZXRGb2xkZXIoaWQ6IHN0cmluZyk6IFByb21pc2U8Rm9sZGVyUmVzcG9uc2U+IHtcbiAgICAgICAgY29uc3QgciA9IGF3YWl0IHRoaXMuc2VuZCgnR0VUJywgJy9mb2xkZXJzLycgKyBpZCwgbnVsbCwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiBuZXcgRm9sZGVyUmVzcG9uc2Uocik7XG4gICAgfVxuXG4gICAgYXN5bmMgcG9zdEZvbGRlcihyZXF1ZXN0OiBGb2xkZXJSZXF1ZXN0KTogUHJvbWlzZTxGb2xkZXJSZXNwb25zZT4ge1xuICAgICAgICBjb25zdCByID0gYXdhaXQgdGhpcy5zZW5kKCdQT1NUJywgJy9mb2xkZXJzJywgcmVxdWVzdCwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiBuZXcgRm9sZGVyUmVzcG9uc2Uocik7XG4gICAgfVxuXG4gICAgYXN5bmMgcHV0Rm9sZGVyKGlkOiBzdHJpbmcsIHJlcXVlc3Q6IEZvbGRlclJlcXVlc3QpOiBQcm9taXNlPEZvbGRlclJlc3BvbnNlPiB7XG4gICAgICAgIGNvbnN0IHIgPSBhd2FpdCB0aGlzLnNlbmQoJ1BVVCcsICcvZm9sZGVycy8nICsgaWQsIHJlcXVlc3QsIHRydWUsIHRydWUpO1xuICAgICAgICByZXR1cm4gbmV3IEZvbGRlclJlc3BvbnNlKHIpO1xuICAgIH1cblxuICAgIGRlbGV0ZUZvbGRlcihpZDogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VuZCgnREVMRVRFJywgJy9mb2xkZXJzLycgKyBpZCwgbnVsbCwgdHJ1ZSwgZmFsc2UpO1xuICAgIH1cblxuICAgIC8vIFNlbmQgQVBJc1xuXG4gICAgYXN5bmMgZ2V0U2VuZChpZDogc3RyaW5nKTogUHJvbWlzZTxTZW5kUmVzcG9uc2U+IHtcbiAgICAgICAgY29uc3QgciA9IGF3YWl0IHRoaXMuc2VuZCgnR0VUJywgJy9zZW5kcy8nICsgaWQsIG51bGwsIHRydWUsIHRydWUpO1xuICAgICAgICByZXR1cm4gbmV3IFNlbmRSZXNwb25zZShyKTtcbiAgICB9XG5cbiAgICBhc3luYyBwb3N0U2VuZEFjY2VzcyhpZDogc3RyaW5nLCByZXF1ZXN0OiBTZW5kQWNjZXNzUmVxdWVzdCwgYXBpVXJsPzogc3RyaW5nKTogUHJvbWlzZTxTZW5kQWNjZXNzUmVzcG9uc2U+IHtcbiAgICAgICAgY29uc3QgYWRkU2VuZElkSGVhZGVyID0gKGhlYWRlcnM6IEhlYWRlcnMpID0+IHtcbiAgICAgICAgICAgIGhlYWRlcnMuc2V0KCdTZW5kLUlkJywgaWQpO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCByID0gYXdhaXQgdGhpcy5zZW5kKCdQT1NUJywgJy9zZW5kcy9hY2Nlc3MvJyArIGlkLCByZXF1ZXN0LCBmYWxzZSwgdHJ1ZSwgYXBpVXJsLCBhZGRTZW5kSWRIZWFkZXIpO1xuICAgICAgICByZXR1cm4gbmV3IFNlbmRBY2Nlc3NSZXNwb25zZShyKTtcbiAgICB9XG5cbiAgICBhc3luYyBnZXRTZW5kRmlsZURvd25sb2FkRGF0YShzZW5kOiBTZW5kQWNjZXNzVmlldywgcmVxdWVzdDogU2VuZEFjY2Vzc1JlcXVlc3QsIGFwaVVybD86IHN0cmluZyk6IFByb21pc2U8U2VuZEZpbGVEb3dubG9hZERhdGFSZXNwb25zZT4ge1xuICAgICAgICBjb25zdCBhZGRTZW5kSWRIZWFkZXIgPSAoaGVhZGVyczogSGVhZGVycykgPT4ge1xuICAgICAgICAgICAgaGVhZGVycy5zZXQoJ1NlbmQtSWQnLCBzZW5kLmlkKTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgciA9IGF3YWl0IHRoaXMuc2VuZCgnUE9TVCcsICcvc2VuZHMvJyArIHNlbmQuaWQgKyAnL2FjY2Vzcy9maWxlLycgKyBzZW5kLmZpbGUuaWQsIHJlcXVlc3QsIGZhbHNlLCB0cnVlLFxuICAgICAgICAgICAgYXBpVXJsLCBhZGRTZW5kSWRIZWFkZXIpO1xuICAgICAgICByZXR1cm4gbmV3IFNlbmRGaWxlRG93bmxvYWREYXRhUmVzcG9uc2Uocik7XG4gICAgfVxuXG4gICAgYXN5bmMgZ2V0U2VuZHMoKTogUHJvbWlzZTxMaXN0UmVzcG9uc2U8U2VuZFJlc3BvbnNlPj4ge1xuICAgICAgICBjb25zdCByID0gYXdhaXQgdGhpcy5zZW5kKCdHRVQnLCAnL3NlbmRzJywgbnVsbCwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiBuZXcgTGlzdFJlc3BvbnNlKHIsIFNlbmRSZXNwb25zZSk7XG4gICAgfVxuXG4gICAgYXN5bmMgcG9zdFNlbmQocmVxdWVzdDogU2VuZFJlcXVlc3QpOiBQcm9taXNlPFNlbmRSZXNwb25zZT4ge1xuICAgICAgICBjb25zdCByID0gYXdhaXQgdGhpcy5zZW5kKCdQT1NUJywgJy9zZW5kcycsIHJlcXVlc3QsIHRydWUsIHRydWUpO1xuICAgICAgICByZXR1cm4gbmV3IFNlbmRSZXNwb25zZShyKTtcbiAgICB9XG5cbiAgICBhc3luYyBwb3N0RmlsZVR5cGVTZW5kKHJlcXVlc3Q6IFNlbmRSZXF1ZXN0KTogUHJvbWlzZTxTZW5kRmlsZVVwbG9hZERhdGFSZXNwb25zZT4ge1xuICAgICAgICBjb25zdCByID0gYXdhaXQgdGhpcy5zZW5kKCdQT1NUJywgJy9zZW5kcy9maWxlL3YyJywgcmVxdWVzdCwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiBuZXcgU2VuZEZpbGVVcGxvYWREYXRhUmVzcG9uc2Uocik7XG4gICAgfVxuXG4gICAgYXN5bmMgcmVuZXdTZW5kRmlsZVVwbG9hZFVybChzZW5kSWQ6IHN0cmluZywgZmlsZUlkOiBzdHJpbmcpOiBQcm9taXNlPFNlbmRGaWxlVXBsb2FkRGF0YVJlc3BvbnNlPiB7XG4gICAgICAgIGNvbnN0IHIgPSBhd2FpdCB0aGlzLnNlbmQoJ0dFVCcsICcvc2VuZHMvJyArIHNlbmRJZCArICcvZmlsZS8nICsgZmlsZUlkLCBudWxsLCB0cnVlLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIG5ldyBTZW5kRmlsZVVwbG9hZERhdGFSZXNwb25zZShyKTtcbiAgICB9XG5cbiAgICBwb3N0U2VuZEZpbGUoc2VuZElkOiBzdHJpbmcsIGZpbGVJZDogc3RyaW5nLCBkYXRhOiBGb3JtRGF0YSk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlbmQoJ1BPU1QnLCAnL3NlbmRzLycgKyBzZW5kSWQgKyAnL2ZpbGUvJyArIGZpbGVJZCwgZGF0YSwgdHJ1ZSwgZmFsc2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIE1hciAyNSAyMDIxOiBUaGlzIG1ldGhvZCBoYXMgYmVlbiBkZXByZWNhdGVkIGluIGZhdm9yIG9mIGRpcmVjdCB1cGxvYWRzLlxuICAgICAqIFRoaXMgbWV0aG9kIHN0aWxsIGV4aXN0cyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIG9sZCBzZXJ2ZXIgdmVyc2lvbnMuXG4gICAgICovXG4gICAgYXN5bmMgcG9zdFNlbmRGaWxlTGVnYWN5KGRhdGE6IEZvcm1EYXRhKTogUHJvbWlzZTxTZW5kUmVzcG9uc2U+IHtcbiAgICAgICAgY29uc3QgciA9IGF3YWl0IHRoaXMuc2VuZCgnUE9TVCcsICcvc2VuZHMvZmlsZScsIGRhdGEsIHRydWUsIHRydWUpO1xuICAgICAgICByZXR1cm4gbmV3IFNlbmRSZXNwb25zZShyKTtcbiAgICB9XG5cbiAgICBhc3luYyBwdXRTZW5kKGlkOiBzdHJpbmcsIHJlcXVlc3Q6IFNlbmRSZXF1ZXN0KTogUHJvbWlzZTxTZW5kUmVzcG9uc2U+IHtcbiAgICAgICAgY29uc3QgciA9IGF3YWl0IHRoaXMuc2VuZCgnUFVUJywgJy9zZW5kcy8nICsgaWQsIHJlcXVlc3QsIHRydWUsIHRydWUpO1xuICAgICAgICByZXR1cm4gbmV3IFNlbmRSZXNwb25zZShyKTtcbiAgICB9XG5cbiAgICBhc3luYyBwdXRTZW5kUmVtb3ZlUGFzc3dvcmQoaWQ6IHN0cmluZyk6IFByb21pc2U8U2VuZFJlc3BvbnNlPiB7XG4gICAgICAgIGNvbnN0IHIgPSBhd2FpdCB0aGlzLnNlbmQoJ1BVVCcsICcvc2VuZHMvJyArIGlkICsgJy9yZW1vdmUtcGFzc3dvcmQnLCBudWxsLCB0cnVlLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIG5ldyBTZW5kUmVzcG9uc2Uocik7XG4gICAgfVxuXG4gICAgZGVsZXRlU2VuZChpZDogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VuZCgnREVMRVRFJywgJy9zZW5kcy8nICsgaWQsIG51bGwsIHRydWUsIGZhbHNlKTtcbiAgICB9XG5cbiAgICAvLyBDaXBoZXIgQVBJc1xuXG4gICAgYXN5bmMgZ2V0Q2lwaGVyKGlkOiBzdHJpbmcpOiBQcm9taXNlPENpcGhlclJlc3BvbnNlPiB7XG4gICAgICAgIGNvbnN0IHIgPSBhd2FpdCB0aGlzLnNlbmQoJ0dFVCcsICcvY2lwaGVycy8nICsgaWQsIG51bGwsIHRydWUsIHRydWUpO1xuICAgICAgICByZXR1cm4gbmV3IENpcGhlclJlc3BvbnNlKHIpO1xuICAgIH1cblxuICAgIGFzeW5jIGdldENpcGhlckFkbWluKGlkOiBzdHJpbmcpOiBQcm9taXNlPENpcGhlclJlc3BvbnNlPiB7XG4gICAgICAgIGNvbnN0IHIgPSBhd2FpdCB0aGlzLnNlbmQoJ0dFVCcsICcvY2lwaGVycy8nICsgaWQgKyAnL2FkbWluJywgbnVsbCwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiBuZXcgQ2lwaGVyUmVzcG9uc2Uocik7XG4gICAgfVxuXG4gICAgYXN5bmMgZ2V0Q2lwaGVyc09yZ2FuaXphdGlvbihvcmdhbml6YXRpb25JZDogc3RyaW5nKTogUHJvbWlzZTxMaXN0UmVzcG9uc2U8Q2lwaGVyUmVzcG9uc2U+PiB7XG4gICAgICAgIGNvbnN0IHIgPSBhd2FpdCB0aGlzLnNlbmQoJ0dFVCcsICcvY2lwaGVycy9vcmdhbml6YXRpb24tZGV0YWlscz9vcmdhbml6YXRpb25JZD0nICsgb3JnYW5pemF0aW9uSWQsXG4gICAgICAgICAgICBudWxsLCB0cnVlLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIG5ldyBMaXN0UmVzcG9uc2UociwgQ2lwaGVyUmVzcG9uc2UpO1xuICAgIH1cblxuICAgIGFzeW5jIHBvc3RDaXBoZXIocmVxdWVzdDogQ2lwaGVyUmVxdWVzdCk6IFByb21pc2U8Q2lwaGVyUmVzcG9uc2U+IHtcbiAgICAgICAgY29uc3QgciA9IGF3YWl0IHRoaXMuc2VuZCgnUE9TVCcsICcvY2lwaGVycycsIHJlcXVlc3QsIHRydWUsIHRydWUpO1xuICAgICAgICByZXR1cm4gbmV3IENpcGhlclJlc3BvbnNlKHIpO1xuICAgIH1cblxuICAgIGFzeW5jIHBvc3RDaXBoZXJDcmVhdGUocmVxdWVzdDogQ2lwaGVyQ3JlYXRlUmVxdWVzdCk6IFByb21pc2U8Q2lwaGVyUmVzcG9uc2U+IHtcbiAgICAgICAgY29uc3QgciA9IGF3YWl0IHRoaXMuc2VuZCgnUE9TVCcsICcvY2lwaGVycy9jcmVhdGUnLCByZXF1ZXN0LCB0cnVlLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIG5ldyBDaXBoZXJSZXNwb25zZShyKTtcbiAgICB9XG5cbiAgICBhc3luYyBwb3N0Q2lwaGVyQWRtaW4ocmVxdWVzdDogQ2lwaGVyQ3JlYXRlUmVxdWVzdCk6IFByb21pc2U8Q2lwaGVyUmVzcG9uc2U+IHtcbiAgICAgICAgY29uc3QgciA9IGF3YWl0IHRoaXMuc2VuZCgnUE9TVCcsICcvY2lwaGVycy9hZG1pbicsIHJlcXVlc3QsIHRydWUsIHRydWUpO1xuICAgICAgICByZXR1cm4gbmV3IENpcGhlclJlc3BvbnNlKHIpO1xuICAgIH1cblxuICAgIGFzeW5jIHB1dENpcGhlcihpZDogc3RyaW5nLCByZXF1ZXN0OiBDaXBoZXJSZXF1ZXN0KTogUHJvbWlzZTxDaXBoZXJSZXNwb25zZT4ge1xuICAgICAgICBjb25zdCByID0gYXdhaXQgdGhpcy5zZW5kKCdQVVQnLCAnL2NpcGhlcnMvJyArIGlkLCByZXF1ZXN0LCB0cnVlLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIG5ldyBDaXBoZXJSZXNwb25zZShyKTtcbiAgICB9XG5cbiAgICBhc3luYyBwdXRDaXBoZXJBZG1pbihpZDogc3RyaW5nLCByZXF1ZXN0OiBDaXBoZXJSZXF1ZXN0KTogUHJvbWlzZTxDaXBoZXJSZXNwb25zZT4ge1xuICAgICAgICBjb25zdCByID0gYXdhaXQgdGhpcy5zZW5kKCdQVVQnLCAnL2NpcGhlcnMvJyArIGlkICsgJy9hZG1pbicsIHJlcXVlc3QsIHRydWUsIHRydWUpO1xuICAgICAgICByZXR1cm4gbmV3IENpcGhlclJlc3BvbnNlKHIpO1xuICAgIH1cblxuICAgIGRlbGV0ZUNpcGhlcihpZDogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VuZCgnREVMRVRFJywgJy9jaXBoZXJzLycgKyBpZCwgbnVsbCwgdHJ1ZSwgZmFsc2UpO1xuICAgIH1cblxuICAgIGRlbGV0ZUNpcGhlckFkbWluKGlkOiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zZW5kKCdERUxFVEUnLCAnL2NpcGhlcnMvJyArIGlkICsgJy9hZG1pbicsIG51bGwsIHRydWUsIGZhbHNlKTtcbiAgICB9XG5cbiAgICBkZWxldGVNYW55Q2lwaGVycyhyZXF1ZXN0OiBDaXBoZXJCdWxrRGVsZXRlUmVxdWVzdCk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlbmQoJ0RFTEVURScsICcvY2lwaGVycycsIHJlcXVlc3QsIHRydWUsIGZhbHNlKTtcbiAgICB9XG5cbiAgICBkZWxldGVNYW55Q2lwaGVyc0FkbWluKHJlcXVlc3Q6IENpcGhlckJ1bGtEZWxldGVSZXF1ZXN0KTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VuZCgnREVMRVRFJywgJy9jaXBoZXJzL2FkbWluJywgcmVxdWVzdCwgdHJ1ZSwgZmFsc2UpO1xuICAgIH1cblxuICAgIHB1dE1vdmVDaXBoZXJzKHJlcXVlc3Q6IENpcGhlckJ1bGtNb3ZlUmVxdWVzdCk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlbmQoJ1BVVCcsICcvY2lwaGVycy9tb3ZlJywgcmVxdWVzdCwgdHJ1ZSwgZmFsc2UpO1xuICAgIH1cblxuICAgIGFzeW5jIHB1dFNoYXJlQ2lwaGVyKGlkOiBzdHJpbmcsIHJlcXVlc3Q6IENpcGhlclNoYXJlUmVxdWVzdCk6IFByb21pc2U8Q2lwaGVyUmVzcG9uc2U+IHtcbiAgICAgICAgY29uc3QgciA9IGF3YWl0IHRoaXMuc2VuZCgnUFVUJywgJy9jaXBoZXJzLycgKyBpZCArICcvc2hhcmUnLCByZXF1ZXN0LCB0cnVlLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIG5ldyBDaXBoZXJSZXNwb25zZShyKTtcbiAgICB9XG5cbiAgICBwdXRTaGFyZUNpcGhlcnMocmVxdWVzdDogQ2lwaGVyQnVsa1NoYXJlUmVxdWVzdCk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlbmQoJ1BVVCcsICcvY2lwaGVycy9zaGFyZScsIHJlcXVlc3QsIHRydWUsIGZhbHNlKTtcbiAgICB9XG5cbiAgICBwdXRDaXBoZXJDb2xsZWN0aW9ucyhpZDogc3RyaW5nLCByZXF1ZXN0OiBDaXBoZXJDb2xsZWN0aW9uc1JlcXVlc3QpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zZW5kKCdQVVQnLCAnL2NpcGhlcnMvJyArIGlkICsgJy9jb2xsZWN0aW9ucycsIHJlcXVlc3QsIHRydWUsIGZhbHNlKTtcbiAgICB9XG5cbiAgICBwdXRDaXBoZXJDb2xsZWN0aW9uc0FkbWluKGlkOiBzdHJpbmcsIHJlcXVlc3Q6IENpcGhlckNvbGxlY3Rpb25zUmVxdWVzdCk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlbmQoJ1BVVCcsICcvY2lwaGVycy8nICsgaWQgKyAnL2NvbGxlY3Rpb25zLWFkbWluJywgcmVxdWVzdCwgdHJ1ZSwgZmFsc2UpO1xuICAgIH1cblxuICAgIHBvc3RQdXJnZUNpcGhlcnMocmVxdWVzdDogUGFzc3dvcmRWZXJpZmljYXRpb25SZXF1ZXN0LCBvcmdhbml6YXRpb25JZDogc3RyaW5nID0gbnVsbCk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIGxldCBwYXRoID0gJy9jaXBoZXJzL3B1cmdlJztcbiAgICAgICAgaWYgKG9yZ2FuaXphdGlvbklkICE9IG51bGwpIHtcbiAgICAgICAgICAgIHBhdGggKz0gJz9vcmdhbml6YXRpb25JZD0nICsgb3JnYW5pemF0aW9uSWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuc2VuZCgnUE9TVCcsIHBhdGgsIHJlcXVlc3QsIHRydWUsIGZhbHNlKTtcbiAgICB9XG5cbiAgICBwb3N0SW1wb3J0Q2lwaGVycyhyZXF1ZXN0OiBJbXBvcnRDaXBoZXJzUmVxdWVzdCk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlbmQoJ1BPU1QnLCAnL2NpcGhlcnMvaW1wb3J0JywgcmVxdWVzdCwgdHJ1ZSwgZmFsc2UpO1xuICAgIH1cblxuICAgIHBvc3RJbXBvcnRPcmdhbml6YXRpb25DaXBoZXJzKG9yZ2FuaXphdGlvbklkOiBzdHJpbmcsIHJlcXVlc3Q6IEltcG9ydE9yZ2FuaXphdGlvbkNpcGhlcnNSZXF1ZXN0KTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VuZCgnUE9TVCcsICcvY2lwaGVycy9pbXBvcnQtb3JnYW5pemF0aW9uP29yZ2FuaXphdGlvbklkPScgKyBvcmdhbml6YXRpb25JZCwgcmVxdWVzdCwgdHJ1ZSwgZmFsc2UpO1xuICAgIH1cblxuICAgIHB1dERlbGV0ZUNpcGhlcihpZDogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VuZCgnUFVUJywgJy9jaXBoZXJzLycgKyBpZCArICcvZGVsZXRlJywgbnVsbCwgdHJ1ZSwgZmFsc2UpO1xuICAgIH1cblxuICAgIHB1dERlbGV0ZUNpcGhlckFkbWluKGlkOiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zZW5kKCdQVVQnLCAnL2NpcGhlcnMvJyArIGlkICsgJy9kZWxldGUtYWRtaW4nLCBudWxsLCB0cnVlLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgcHV0RGVsZXRlTWFueUNpcGhlcnMocmVxdWVzdDogQ2lwaGVyQnVsa0RlbGV0ZVJlcXVlc3QpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zZW5kKCdQVVQnLCAnL2NpcGhlcnMvZGVsZXRlJywgcmVxdWVzdCwgdHJ1ZSwgZmFsc2UpO1xuICAgIH1cblxuICAgIHB1dERlbGV0ZU1hbnlDaXBoZXJzQWRtaW4ocmVxdWVzdDogQ2lwaGVyQnVsa0RlbGV0ZVJlcXVlc3QpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zZW5kKCdQVVQnLCAnL2NpcGhlcnMvZGVsZXRlLWFkbWluJywgcmVxdWVzdCwgdHJ1ZSwgZmFsc2UpO1xuICAgIH1cblxuICAgIGFzeW5jIHB1dFJlc3RvcmVDaXBoZXIoaWQ6IHN0cmluZyk6IFByb21pc2U8Q2lwaGVyUmVzcG9uc2U+IHtcbiAgICAgICAgY29uc3QgciA9IGF3YWl0IHRoaXMuc2VuZCgnUFVUJywgJy9jaXBoZXJzLycgKyBpZCArICcvcmVzdG9yZScsIG51bGwsIHRydWUsIHRydWUpO1xuICAgICAgICByZXR1cm4gbmV3IENpcGhlclJlc3BvbnNlKHIpO1xuICAgIH1cblxuICAgIGFzeW5jIHB1dFJlc3RvcmVDaXBoZXJBZG1pbihpZDogc3RyaW5nKTogUHJvbWlzZTxDaXBoZXJSZXNwb25zZT4ge1xuICAgICAgICBjb25zdCByID0gYXdhaXQgdGhpcy5zZW5kKCdQVVQnLCAnL2NpcGhlcnMvJyArIGlkICsgJy9yZXN0b3JlLWFkbWluJywgbnVsbCwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiBuZXcgQ2lwaGVyUmVzcG9uc2Uocik7XG4gICAgfVxuXG4gICAgYXN5bmMgcHV0UmVzdG9yZU1hbnlDaXBoZXJzKHJlcXVlc3Q6IENpcGhlckJ1bGtEZWxldGVSZXF1ZXN0KTogUHJvbWlzZTxMaXN0UmVzcG9uc2U8Q2lwaGVyUmVzcG9uc2U+PiB7XG4gICAgICAgIGNvbnN0IHIgPSBhd2FpdCB0aGlzLnNlbmQoJ1BVVCcsICcvY2lwaGVycy9yZXN0b3JlJywgcmVxdWVzdCwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiBuZXcgTGlzdFJlc3BvbnNlPENpcGhlclJlc3BvbnNlPihyLCBDaXBoZXJSZXNwb25zZSk7XG4gICAgfVxuXG4gICAgLy8gQXR0YWNobWVudHMgQVBJc1xuXG4gICAgYXN5bmMgZ2V0QXR0YWNobWVudERhdGEoY2lwaGVySWQ6IHN0cmluZywgYXR0YWNobWVudElkOiBzdHJpbmcsIGVtZXJnZW5jeUFjY2Vzc0lkPzogc3RyaW5nKTogUHJvbWlzZTxBdHRhY2htZW50UmVzcG9uc2U+IHtcbiAgICAgICAgY29uc3QgcGF0aCA9IChlbWVyZ2VuY3lBY2Nlc3NJZCAhPSBudWxsID9cbiAgICAgICAgICAgICcvZW1lcmdlbmN5LWFjY2Vzcy8nICsgZW1lcmdlbmN5QWNjZXNzSWQgKyAnLycgOlxuICAgICAgICAgICAgJy9jaXBoZXJzLycpICsgY2lwaGVySWQgKyAnL2F0dGFjaG1lbnQvJyArIGF0dGFjaG1lbnRJZDtcbiAgICAgICAgY29uc3QgciA9IGF3YWl0IHRoaXMuc2VuZCgnR0VUJywgcGF0aCwgbnVsbCwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiBuZXcgQXR0YWNobWVudFJlc3BvbnNlKHIpO1xuICAgIH1cblxuICAgIGFzeW5jIHBvc3RDaXBoZXJBdHRhY2htZW50KGlkOiBzdHJpbmcsIHJlcXVlc3Q6IEF0dGFjaG1lbnRSZXF1ZXN0KTogUHJvbWlzZTxBdHRhY2htZW50VXBsb2FkRGF0YVJlc3BvbnNlPiB7XG4gICAgICAgIGNvbnN0IHIgPSBhd2FpdCB0aGlzLnNlbmQoJ1BPU1QnLCAnL2NpcGhlcnMvJyArIGlkICsgJy9hdHRhY2htZW50L3YyJywgcmVxdWVzdCwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiBuZXcgQXR0YWNobWVudFVwbG9hZERhdGFSZXNwb25zZShyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBNYXIgMjUgMjAyMTogVGhpcyBtZXRob2QgaGFzIGJlZW4gZGVwcmVjYXRlZCBpbiBmYXZvciBvZiBkaXJlY3QgdXBsb2Fkcy5cbiAgICAgKiBUaGlzIG1ldGhvZCBzdGlsbCBleGlzdHMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCBvbGQgc2VydmVyIHZlcnNpb25zLlxuICAgICAqL1xuICAgIGFzeW5jIHBvc3RDaXBoZXJBdHRhY2htZW50TGVnYWN5KGlkOiBzdHJpbmcsIGRhdGE6IEZvcm1EYXRhKTogUHJvbWlzZTxDaXBoZXJSZXNwb25zZT4ge1xuICAgICAgICBjb25zdCByID0gYXdhaXQgdGhpcy5zZW5kKCdQT1NUJywgJy9jaXBoZXJzLycgKyBpZCArICcvYXR0YWNobWVudCcsIGRhdGEsIHRydWUsIHRydWUpO1xuICAgICAgICByZXR1cm4gbmV3IENpcGhlclJlc3BvbnNlKHIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIE1hciAyNSAyMDIxOiBUaGlzIG1ldGhvZCBoYXMgYmVlbiBkZXByZWNhdGVkIGluIGZhdm9yIG9mIGRpcmVjdCB1cGxvYWRzLlxuICAgICAqIFRoaXMgbWV0aG9kIHN0aWxsIGV4aXN0cyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIG9sZCBzZXJ2ZXIgdmVyc2lvbnMuXG4gICAgICovXG4gICAgYXN5bmMgcG9zdENpcGhlckF0dGFjaG1lbnRBZG1pbkxlZ2FjeShpZDogc3RyaW5nLCBkYXRhOiBGb3JtRGF0YSk6IFByb21pc2U8Q2lwaGVyUmVzcG9uc2U+IHtcbiAgICAgICAgY29uc3QgciA9IGF3YWl0IHRoaXMuc2VuZCgnUE9TVCcsICcvY2lwaGVycy8nICsgaWQgKyAnL2F0dGFjaG1lbnQtYWRtaW4nLCBkYXRhLCB0cnVlLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIG5ldyBDaXBoZXJSZXNwb25zZShyKTtcbiAgICB9XG5cbiAgICBkZWxldGVDaXBoZXJBdHRhY2htZW50KGlkOiBzdHJpbmcsIGF0dGFjaG1lbnRJZDogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VuZCgnREVMRVRFJywgJy9jaXBoZXJzLycgKyBpZCArICcvYXR0YWNobWVudC8nICsgYXR0YWNobWVudElkLCBudWxsLCB0cnVlLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgZGVsZXRlQ2lwaGVyQXR0YWNobWVudEFkbWluKGlkOiBzdHJpbmcsIGF0dGFjaG1lbnRJZDogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VuZCgnREVMRVRFJywgJy9jaXBoZXJzLycgKyBpZCArICcvYXR0YWNobWVudC8nICsgYXR0YWNobWVudElkICsgJy9hZG1pbicsIG51bGwsIHRydWUsIGZhbHNlKTtcbiAgICB9XG5cbiAgICBwb3N0U2hhcmVDaXBoZXJBdHRhY2htZW50KGlkOiBzdHJpbmcsIGF0dGFjaG1lbnRJZDogc3RyaW5nLCBkYXRhOiBGb3JtRGF0YSxcbiAgICAgICAgb3JnYW5pemF0aW9uSWQ6IHN0cmluZyk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlbmQoJ1BPU1QnLCAnL2NpcGhlcnMvJyArIGlkICsgJy9hdHRhY2htZW50LycgK1xuICAgICAgICAgICAgYXR0YWNobWVudElkICsgJy9zaGFyZT9vcmdhbml6YXRpb25JZD0nICsgb3JnYW5pemF0aW9uSWQsIGRhdGEsIHRydWUsIGZhbHNlKTtcbiAgICB9XG5cbiAgICBhc3luYyByZW5ld0F0dGFjaG1lbnRVcGxvYWRVcmwoaWQ6IHN0cmluZywgYXR0YWNobWVudElkOiBzdHJpbmcpOiBQcm9taXNlPEF0dGFjaG1lbnRVcGxvYWREYXRhUmVzcG9uc2U+IHtcbiAgICAgICAgY29uc3QgciA9IGF3YWl0IHRoaXMuc2VuZCgnR0VUJywgJy9jaXBoZXJzLycgKyBpZCArICcvYXR0YWNobWVudC8nICsgYXR0YWNobWVudElkICsgJy9yZW5ldycsIG51bGwsIHRydWUsIHRydWUpO1xuICAgICAgICByZXR1cm4gbmV3IEF0dGFjaG1lbnRVcGxvYWREYXRhUmVzcG9uc2Uocik7XG4gICAgfVxuXG4gICAgcG9zdEF0dGFjaG1lbnRGaWxlKGlkOiBzdHJpbmcsIGF0dGFjaG1lbnRJZDogc3RyaW5nLCBkYXRhOiBGb3JtRGF0YSk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlbmQoJ1BPU1QnLCAnL2NpcGhlcnMvJyArIGlkICsgJy9hdHRhY2htZW50LycgKyBhdHRhY2htZW50SWQsIGRhdGEsIHRydWUsIGZhbHNlKTtcbiAgICB9XG5cbiAgICAvLyBDb2xsZWN0aW9ucyBBUElzXG5cbiAgICBhc3luYyBnZXRDb2xsZWN0aW9uRGV0YWlscyhvcmdhbml6YXRpb25JZDogc3RyaW5nLCBpZDogc3RyaW5nKTogUHJvbWlzZTxDb2xsZWN0aW9uR3JvdXBEZXRhaWxzUmVzcG9uc2U+IHtcbiAgICAgICAgY29uc3QgciA9IGF3YWl0IHRoaXMuc2VuZCgnR0VUJywgJy9vcmdhbml6YXRpb25zLycgKyBvcmdhbml6YXRpb25JZCArICcvY29sbGVjdGlvbnMvJyArIGlkICsgJy9kZXRhaWxzJyxcbiAgICAgICAgICAgIG51bGwsIHRydWUsIHRydWUpO1xuICAgICAgICByZXR1cm4gbmV3IENvbGxlY3Rpb25Hcm91cERldGFpbHNSZXNwb25zZShyKTtcbiAgICB9XG5cbiAgICBhc3luYyBnZXRVc2VyQ29sbGVjdGlvbnMoKTogUHJvbWlzZTxMaXN0UmVzcG9uc2U8Q29sbGVjdGlvblJlc3BvbnNlPj4ge1xuICAgICAgICBjb25zdCByID0gYXdhaXQgdGhpcy5zZW5kKCdHRVQnLCAnL2NvbGxlY3Rpb25zJywgbnVsbCwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiBuZXcgTGlzdFJlc3BvbnNlKHIsIENvbGxlY3Rpb25SZXNwb25zZSk7XG4gICAgfVxuXG4gICAgYXN5bmMgZ2V0Q29sbGVjdGlvbnMob3JnYW5pemF0aW9uSWQ6IHN0cmluZyk6IFByb21pc2U8TGlzdFJlc3BvbnNlPENvbGxlY3Rpb25SZXNwb25zZT4+IHtcbiAgICAgICAgY29uc3QgciA9IGF3YWl0IHRoaXMuc2VuZCgnR0VUJywgJy9vcmdhbml6YXRpb25zLycgKyBvcmdhbml6YXRpb25JZCArICcvY29sbGVjdGlvbnMnLCBudWxsLCB0cnVlLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIG5ldyBMaXN0UmVzcG9uc2UociwgQ29sbGVjdGlvblJlc3BvbnNlKTtcbiAgICB9XG5cbiAgICBhc3luYyBnZXRDb2xsZWN0aW9uVXNlcnMob3JnYW5pemF0aW9uSWQ6IHN0cmluZywgaWQ6IHN0cmluZyk6IFByb21pc2U8U2VsZWN0aW9uUmVhZE9ubHlSZXNwb25zZVtdPiB7XG4gICAgICAgIGNvbnN0IHIgPSBhd2FpdCB0aGlzLnNlbmQoJ0dFVCcsICcvb3JnYW5pemF0aW9ucy8nICsgb3JnYW5pemF0aW9uSWQgKyAnL2NvbGxlY3Rpb25zLycgKyBpZCArICcvdXNlcnMnLFxuICAgICAgICAgICAgbnVsbCwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiByLm1hcCgoZHI6IGFueSkgPT4gbmV3IFNlbGVjdGlvblJlYWRPbmx5UmVzcG9uc2UoZHIpKTtcbiAgICB9XG5cbiAgICBhc3luYyBwb3N0Q29sbGVjdGlvbihvcmdhbml6YXRpb25JZDogc3RyaW5nLCByZXF1ZXN0OiBDb2xsZWN0aW9uUmVxdWVzdCk6IFByb21pc2U8Q29sbGVjdGlvblJlc3BvbnNlPiB7XG4gICAgICAgIGNvbnN0IHIgPSBhd2FpdCB0aGlzLnNlbmQoJ1BPU1QnLCAnL29yZ2FuaXphdGlvbnMvJyArIG9yZ2FuaXphdGlvbklkICsgJy9jb2xsZWN0aW9ucycsIHJlcXVlc3QsIHRydWUsIHRydWUpO1xuICAgICAgICByZXR1cm4gbmV3IENvbGxlY3Rpb25SZXNwb25zZShyKTtcbiAgICB9XG5cbiAgICBhc3luYyBwdXRDb2xsZWN0aW9uKG9yZ2FuaXphdGlvbklkOiBzdHJpbmcsIGlkOiBzdHJpbmcsIHJlcXVlc3Q6IENvbGxlY3Rpb25SZXF1ZXN0KTogUHJvbWlzZTxDb2xsZWN0aW9uUmVzcG9uc2U+IHtcbiAgICAgICAgY29uc3QgciA9IGF3YWl0IHRoaXMuc2VuZCgnUFVUJywgJy9vcmdhbml6YXRpb25zLycgKyBvcmdhbml6YXRpb25JZCArICcvY29sbGVjdGlvbnMvJyArIGlkLFxuICAgICAgICAgICAgcmVxdWVzdCwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiBuZXcgQ29sbGVjdGlvblJlc3BvbnNlKHIpO1xuICAgIH1cblxuICAgIGFzeW5jIHB1dENvbGxlY3Rpb25Vc2Vycyhvcmdhbml6YXRpb25JZDogc3RyaW5nLCBpZDogc3RyaW5nLCByZXF1ZXN0OiBTZWxlY3Rpb25SZWFkT25seVJlcXVlc3RbXSk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIGF3YWl0IHRoaXMuc2VuZCgnUFVUJywgJy9vcmdhbml6YXRpb25zLycgKyBvcmdhbml6YXRpb25JZCArICcvY29sbGVjdGlvbnMvJyArIGlkICsgJy91c2VycycsXG4gICAgICAgICAgICByZXF1ZXN0LCB0cnVlLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgZGVsZXRlQ29sbGVjdGlvbihvcmdhbml6YXRpb25JZDogc3RyaW5nLCBpZDogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VuZCgnREVMRVRFJywgJy9vcmdhbml6YXRpb25zLycgKyBvcmdhbml6YXRpb25JZCArICcvY29sbGVjdGlvbnMvJyArIGlkLCBudWxsLCB0cnVlLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgZGVsZXRlQ29sbGVjdGlvblVzZXIob3JnYW5pemF0aW9uSWQ6IHN0cmluZywgaWQ6IHN0cmluZywgb3JnYW5pemF0aW9uVXNlcklkOiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zZW5kKCdERUxFVEUnLFxuICAgICAgICAgICAgJy9vcmdhbml6YXRpb25zLycgKyBvcmdhbml6YXRpb25JZCArICcvY29sbGVjdGlvbnMvJyArIGlkICsgJy91c2VyLycgKyBvcmdhbml6YXRpb25Vc2VySWQsXG4gICAgICAgICAgICBudWxsLCB0cnVlLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgLy8gR3JvdXBzIEFQSXNcblxuICAgIGFzeW5jIGdldEdyb3VwRGV0YWlscyhvcmdhbml6YXRpb25JZDogc3RyaW5nLCBpZDogc3RyaW5nKTogUHJvbWlzZTxHcm91cERldGFpbHNSZXNwb25zZT4ge1xuICAgICAgICBjb25zdCByID0gYXdhaXQgdGhpcy5zZW5kKCdHRVQnLCAnL29yZ2FuaXphdGlvbnMvJyArIG9yZ2FuaXphdGlvbklkICsgJy9ncm91cHMvJyArIGlkICsgJy9kZXRhaWxzJyxcbiAgICAgICAgICAgIG51bGwsIHRydWUsIHRydWUpO1xuICAgICAgICByZXR1cm4gbmV3IEdyb3VwRGV0YWlsc1Jlc3BvbnNlKHIpO1xuICAgIH1cblxuICAgIGFzeW5jIGdldEdyb3Vwcyhvcmdhbml6YXRpb25JZDogc3RyaW5nKTogUHJvbWlzZTxMaXN0UmVzcG9uc2U8R3JvdXBSZXNwb25zZT4+IHtcbiAgICAgICAgY29uc3QgciA9IGF3YWl0IHRoaXMuc2VuZCgnR0VUJywgJy9vcmdhbml6YXRpb25zLycgKyBvcmdhbml6YXRpb25JZCArICcvZ3JvdXBzJywgbnVsbCwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiBuZXcgTGlzdFJlc3BvbnNlKHIsIEdyb3VwUmVzcG9uc2UpO1xuICAgIH1cblxuICAgIGFzeW5jIGdldEdyb3VwVXNlcnMob3JnYW5pemF0aW9uSWQ6IHN0cmluZywgaWQ6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICAgICAgY29uc3QgciA9IGF3YWl0IHRoaXMuc2VuZCgnR0VUJywgJy9vcmdhbml6YXRpb25zLycgKyBvcmdhbml6YXRpb25JZCArICcvZ3JvdXBzLycgKyBpZCArICcvdXNlcnMnLFxuICAgICAgICAgICAgbnVsbCwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiByO1xuICAgIH1cblxuICAgIGFzeW5jIHBvc3RHcm91cChvcmdhbml6YXRpb25JZDogc3RyaW5nLCByZXF1ZXN0OiBHcm91cFJlcXVlc3QpOiBQcm9taXNlPEdyb3VwUmVzcG9uc2U+IHtcbiAgICAgICAgY29uc3QgciA9IGF3YWl0IHRoaXMuc2VuZCgnUE9TVCcsICcvb3JnYW5pemF0aW9ucy8nICsgb3JnYW5pemF0aW9uSWQgKyAnL2dyb3VwcycsIHJlcXVlc3QsIHRydWUsIHRydWUpO1xuICAgICAgICByZXR1cm4gbmV3IEdyb3VwUmVzcG9uc2Uocik7XG4gICAgfVxuXG4gICAgYXN5bmMgcHV0R3JvdXAob3JnYW5pemF0aW9uSWQ6IHN0cmluZywgaWQ6IHN0cmluZywgcmVxdWVzdDogR3JvdXBSZXF1ZXN0KTogUHJvbWlzZTxHcm91cFJlc3BvbnNlPiB7XG4gICAgICAgIGNvbnN0IHIgPSBhd2FpdCB0aGlzLnNlbmQoJ1BVVCcsICcvb3JnYW5pemF0aW9ucy8nICsgb3JnYW5pemF0aW9uSWQgKyAnL2dyb3Vwcy8nICsgaWQsIHJlcXVlc3QsIHRydWUsIHRydWUpO1xuICAgICAgICByZXR1cm4gbmV3IEdyb3VwUmVzcG9uc2Uocik7XG4gICAgfVxuXG4gICAgYXN5bmMgcHV0R3JvdXBVc2Vycyhvcmdhbml6YXRpb25JZDogc3RyaW5nLCBpZDogc3RyaW5nLCByZXF1ZXN0OiBzdHJpbmdbXSk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIGF3YWl0IHRoaXMuc2VuZCgnUFVUJywgJy9vcmdhbml6YXRpb25zLycgKyBvcmdhbml6YXRpb25JZCArICcvZ3JvdXBzLycgKyBpZCArICcvdXNlcnMnLCByZXF1ZXN0LCB0cnVlLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgZGVsZXRlR3JvdXAob3JnYW5pemF0aW9uSWQ6IHN0cmluZywgaWQ6IHN0cmluZyk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlbmQoJ0RFTEVURScsICcvb3JnYW5pemF0aW9ucy8nICsgb3JnYW5pemF0aW9uSWQgKyAnL2dyb3Vwcy8nICsgaWQsIG51bGwsIHRydWUsIGZhbHNlKTtcbiAgICB9XG5cbiAgICBkZWxldGVHcm91cFVzZXIob3JnYW5pemF0aW9uSWQ6IHN0cmluZywgaWQ6IHN0cmluZywgb3JnYW5pemF0aW9uVXNlcklkOiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zZW5kKCdERUxFVEUnLFxuICAgICAgICAgICAgJy9vcmdhbml6YXRpb25zLycgKyBvcmdhbml6YXRpb25JZCArICcvZ3JvdXBzLycgKyBpZCArICcvdXNlci8nICsgb3JnYW5pemF0aW9uVXNlcklkLCBudWxsLCB0cnVlLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgLy8gUG9saWN5IEFQSXNcblxuICAgIGFzeW5jIGdldFBvbGljeShvcmdhbml6YXRpb25JZDogc3RyaW5nLCB0eXBlOiBQb2xpY3lUeXBlKTogUHJvbWlzZTxQb2xpY3lSZXNwb25zZT4ge1xuICAgICAgICBjb25zdCByID0gYXdhaXQgdGhpcy5zZW5kKCdHRVQnLCAnL29yZ2FuaXphdGlvbnMvJyArIG9yZ2FuaXphdGlvbklkICsgJy9wb2xpY2llcy8nICsgdHlwZSwgbnVsbCwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiBuZXcgUG9saWN5UmVzcG9uc2Uocik7XG4gICAgfVxuXG4gICAgYXN5bmMgZ2V0UG9saWNpZXMob3JnYW5pemF0aW9uSWQ6IHN0cmluZyk6IFByb21pc2U8TGlzdFJlc3BvbnNlPFBvbGljeVJlc3BvbnNlPj4ge1xuICAgICAgICBjb25zdCByID0gYXdhaXQgdGhpcy5zZW5kKCdHRVQnLCAnL29yZ2FuaXphdGlvbnMvJyArIG9yZ2FuaXphdGlvbklkICsgJy9wb2xpY2llcycsIG51bGwsIHRydWUsIHRydWUpO1xuICAgICAgICByZXR1cm4gbmV3IExpc3RSZXNwb25zZShyLCBQb2xpY3lSZXNwb25zZSk7XG4gICAgfVxuXG4gICAgYXN5bmMgZ2V0UG9saWNpZXNCeVRva2VuKG9yZ2FuaXphdGlvbklkOiBzdHJpbmcsIHRva2VuOiBzdHJpbmcsIGVtYWlsOiBzdHJpbmcsIG9yZ2FuaXphdGlvblVzZXJJZDogc3RyaW5nKTpcbiAgICAgICAgUHJvbWlzZTxMaXN0UmVzcG9uc2U8UG9saWN5UmVzcG9uc2U+PiB7XG4gICAgICAgIGNvbnN0IHIgPSBhd2FpdCB0aGlzLnNlbmQoJ0dFVCcsICcvb3JnYW5pemF0aW9ucy8nICsgb3JnYW5pemF0aW9uSWQgKyAnL3BvbGljaWVzL3Rva2VuPycgK1xuICAgICAgICAgICAgJ3Rva2VuPScgKyBlbmNvZGVVUklDb21wb25lbnQodG9rZW4pICsgJyZlbWFpbD0nICsgZW5jb2RlVVJJQ29tcG9uZW50KGVtYWlsKSArXG4gICAgICAgICAgICAnJm9yZ2FuaXphdGlvblVzZXJJZD0nICsgb3JnYW5pemF0aW9uVXNlcklkLCBudWxsLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiBuZXcgTGlzdFJlc3BvbnNlKHIsIFBvbGljeVJlc3BvbnNlKTtcbiAgICB9XG5cbiAgICBhc3luYyBwdXRQb2xpY3kob3JnYW5pemF0aW9uSWQ6IHN0cmluZywgdHlwZTogUG9saWN5VHlwZSwgcmVxdWVzdDogUG9saWN5UmVxdWVzdCk6IFByb21pc2U8UG9saWN5UmVzcG9uc2U+IHtcbiAgICAgICAgY29uc3QgciA9IGF3YWl0IHRoaXMuc2VuZCgnUFVUJywgJy9vcmdhbml6YXRpb25zLycgKyBvcmdhbml6YXRpb25JZCArICcvcG9saWNpZXMvJyArIHR5cGUsIHJlcXVlc3QsIHRydWUsIHRydWUpO1xuICAgICAgICByZXR1cm4gbmV3IFBvbGljeVJlc3BvbnNlKHIpO1xuICAgIH1cblxuICAgIC8vIE9yZ2FuaXphdGlvbiBVc2VyIEFQSXNcblxuICAgIGFzeW5jIGdldE9yZ2FuaXphdGlvblVzZXIob3JnYW5pemF0aW9uSWQ6IHN0cmluZywgaWQ6IHN0cmluZyk6IFByb21pc2U8T3JnYW5pemF0aW9uVXNlckRldGFpbHNSZXNwb25zZT4ge1xuICAgICAgICBjb25zdCByID0gYXdhaXQgdGhpcy5zZW5kKCdHRVQnLCAnL29yZ2FuaXphdGlvbnMvJyArIG9yZ2FuaXphdGlvbklkICsgJy91c2Vycy8nICsgaWQsIG51bGwsIHRydWUsIHRydWUpO1xuICAgICAgICByZXR1cm4gbmV3IE9yZ2FuaXphdGlvblVzZXJEZXRhaWxzUmVzcG9uc2Uocik7XG4gICAgfVxuXG4gICAgYXN5bmMgZ2V0T3JnYW5pemF0aW9uVXNlckdyb3Vwcyhvcmdhbml6YXRpb25JZDogc3RyaW5nLCBpZDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgICAgICBjb25zdCByID0gYXdhaXQgdGhpcy5zZW5kKCdHRVQnLCAnL29yZ2FuaXphdGlvbnMvJyArIG9yZ2FuaXphdGlvbklkICsgJy91c2Vycy8nICsgaWQgKyAnL2dyb3VwcycsXG4gICAgICAgICAgICBudWxsLCB0cnVlLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIHI7XG4gICAgfVxuXG4gICAgYXN5bmMgZ2V0T3JnYW5pemF0aW9uVXNlcnMob3JnYW5pemF0aW9uSWQ6IHN0cmluZyk6IFByb21pc2U8TGlzdFJlc3BvbnNlPE9yZ2FuaXphdGlvblVzZXJVc2VyRGV0YWlsc1Jlc3BvbnNlPj4ge1xuICAgICAgICBjb25zdCByID0gYXdhaXQgdGhpcy5zZW5kKCdHRVQnLCAnL29yZ2FuaXphdGlvbnMvJyArIG9yZ2FuaXphdGlvbklkICsgJy91c2VycycsIG51bGwsIHRydWUsIHRydWUpO1xuICAgICAgICByZXR1cm4gbmV3IExpc3RSZXNwb25zZShyLCBPcmdhbml6YXRpb25Vc2VyVXNlckRldGFpbHNSZXNwb25zZSk7XG4gICAgfVxuXG4gICAgYXN5bmMgZ2V0T3JnYW5pemF0aW9uVXNlclJlc2V0UGFzc3dvcmREZXRhaWxzKG9yZ2FuaXphdGlvbklkOiBzdHJpbmcsIGlkOiBzdHJpbmcpOlxuICAgICAgICBQcm9taXNlPE9yZ2FuaXphdGlvblVzZXJSZXNldFBhc3N3b3JkRGV0YWlsc1JlcG9uc2U+IHtcbiAgICAgICAgY29uc3QgciA9IGF3YWl0IHRoaXMuc2VuZCgnR0VUJywgJy9vcmdhbml6YXRpb25zLycgKyBvcmdhbml6YXRpb25JZCArICcvdXNlcnMvJyArIGlkICtcbiAgICAgICAgICAgICcvcmVzZXQtcGFzc3dvcmQtZGV0YWlscycsIG51bGwsIHRydWUsIHRydWUpO1xuICAgICAgICByZXR1cm4gbmV3IE9yZ2FuaXphdGlvblVzZXJSZXNldFBhc3N3b3JkRGV0YWlsc1JlcG9uc2Uocik7XG4gICAgfVxuXG4gICAgYXN5bmMgZ2V0T3JnYW5pemF0aW9uQXV0b0Vucm9sbFN0YXR1cyhpZGVudGlmaWVyOiBzdHJpbmcpOiBQcm9taXNlPE9yZ2FuaXphdGlvbkF1dG9FbnJvbGxTdGF0dXNSZXNwb25zZT4ge1xuICAgICAgICBjb25zdCByID0gYXdhaXQgdGhpcy5zZW5kKCdHRVQnLCAnL29yZ2FuaXphdGlvbnMvJyArIGlkZW50aWZpZXIgKyAnL2F1dG8tZW5yb2xsLXN0YXR1cycsIG51bGwsIHRydWUsIHRydWUpO1xuICAgICAgICByZXR1cm4gbmV3IE9yZ2FuaXphdGlvbkF1dG9FbnJvbGxTdGF0dXNSZXNwb25zZShyKTtcbiAgICB9XG5cbiAgICBwb3N0T3JnYW5pemF0aW9uVXNlckludml0ZShvcmdhbml6YXRpb25JZDogc3RyaW5nLCByZXF1ZXN0OiBPcmdhbml6YXRpb25Vc2VySW52aXRlUmVxdWVzdCk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlbmQoJ1BPU1QnLCAnL29yZ2FuaXphdGlvbnMvJyArIG9yZ2FuaXphdGlvbklkICsgJy91c2Vycy9pbnZpdGUnLCByZXF1ZXN0LCB0cnVlLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgcG9zdE9yZ2FuaXphdGlvblVzZXJSZWludml0ZShvcmdhbml6YXRpb25JZDogc3RyaW5nLCBpZDogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VuZCgnUE9TVCcsICcvb3JnYW5pemF0aW9ucy8nICsgb3JnYW5pemF0aW9uSWQgKyAnL3VzZXJzLycgKyBpZCArICcvcmVpbnZpdGUnLCBudWxsLCB0cnVlLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgYXN5bmMgcG9zdE1hbnlPcmdhbml6YXRpb25Vc2VyUmVpbnZpdGUob3JnYW5pemF0aW9uSWQ6IHN0cmluZywgcmVxdWVzdDogT3JnYW5pemF0aW9uVXNlckJ1bGtSZXF1ZXN0KTogUHJvbWlzZTxMaXN0UmVzcG9uc2U8T3JnYW5pemF0aW9uVXNlckJ1bGtSZXNwb25zZT4+IHtcbiAgICAgICAgY29uc3QgciA9IGF3YWl0IHRoaXMuc2VuZCgnUE9TVCcsICcvb3JnYW5pemF0aW9ucy8nICsgb3JnYW5pemF0aW9uSWQgKyAnL3VzZXJzL3JlaW52aXRlJywgcmVxdWVzdCwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiBuZXcgTGlzdFJlc3BvbnNlKHIsIE9yZ2FuaXphdGlvblVzZXJCdWxrUmVzcG9uc2UpO1xuICAgIH1cblxuICAgIHBvc3RPcmdhbml6YXRpb25Vc2VyQWNjZXB0KG9yZ2FuaXphdGlvbklkOiBzdHJpbmcsIGlkOiBzdHJpbmcsXG4gICAgICAgIHJlcXVlc3Q6IE9yZ2FuaXphdGlvblVzZXJBY2NlcHRSZXF1ZXN0KTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VuZCgnUE9TVCcsICcvb3JnYW5pemF0aW9ucy8nICsgb3JnYW5pemF0aW9uSWQgKyAnL3VzZXJzLycgKyBpZCArICcvYWNjZXB0JywgcmVxdWVzdCwgdHJ1ZSwgZmFsc2UpO1xuICAgIH1cblxuICAgIHBvc3RPcmdhbml6YXRpb25Vc2VyQ29uZmlybShvcmdhbml6YXRpb25JZDogc3RyaW5nLCBpZDogc3RyaW5nLFxuICAgICAgICByZXF1ZXN0OiBPcmdhbml6YXRpb25Vc2VyQ29uZmlybVJlcXVlc3QpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zZW5kKCdQT1NUJywgJy9vcmdhbml6YXRpb25zLycgKyBvcmdhbml6YXRpb25JZCArICcvdXNlcnMvJyArIGlkICsgJy9jb25maXJtJyxcbiAgICAgICAgICAgIHJlcXVlc3QsIHRydWUsIGZhbHNlKTtcbiAgICB9XG5cbiAgICBhc3luYyBwb3N0T3JnYW5pemF0aW9uVXNlcnNQdWJsaWNLZXkob3JnYW5pemF0aW9uSWQ6IHN0cmluZywgcmVxdWVzdDogT3JnYW5pemF0aW9uVXNlckJ1bGtSZXF1ZXN0KTogUHJvbWlzZTxMaXN0UmVzcG9uc2U8T3JnYW5pemF0aW9uVXNlckJ1bGtQdWJsaWNLZXlSZXNwb25zZT4+IHtcbiAgICAgICAgY29uc3QgciA9IGF3YWl0IHRoaXMuc2VuZCgnUE9TVCcsICcvb3JnYW5pemF0aW9ucy8nICsgb3JnYW5pemF0aW9uSWQgKyAnL3VzZXJzL3B1YmxpYy1rZXlzJywgcmVxdWVzdCwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiBuZXcgTGlzdFJlc3BvbnNlKHIsIE9yZ2FuaXphdGlvblVzZXJCdWxrUHVibGljS2V5UmVzcG9uc2UpO1xuICAgIH1cblxuICAgIGFzeW5jIHBvc3RPcmdhbml6YXRpb25Vc2VyQnVsa0NvbmZpcm0ob3JnYW5pemF0aW9uSWQ6IHN0cmluZywgcmVxdWVzdDogT3JnYW5pemF0aW9uVXNlckJ1bGtDb25maXJtUmVxdWVzdCk6IFByb21pc2U8TGlzdFJlc3BvbnNlPE9yZ2FuaXphdGlvblVzZXJCdWxrUmVzcG9uc2U+PiB7XG4gICAgICAgIGNvbnN0IHIgPSBhd2FpdCB0aGlzLnNlbmQoJ1BPU1QnLCAnL29yZ2FuaXphdGlvbnMvJyArIG9yZ2FuaXphdGlvbklkICsgJy91c2Vycy9jb25maXJtJywgcmVxdWVzdCwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiBuZXcgTGlzdFJlc3BvbnNlKHIsIE9yZ2FuaXphdGlvblVzZXJCdWxrUmVzcG9uc2UpO1xuICAgIH1cblxuICAgIHB1dE9yZ2FuaXphdGlvblVzZXIob3JnYW5pemF0aW9uSWQ6IHN0cmluZywgaWQ6IHN0cmluZywgcmVxdWVzdDogT3JnYW5pemF0aW9uVXNlclVwZGF0ZVJlcXVlc3QpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zZW5kKCdQVVQnLCAnL29yZ2FuaXphdGlvbnMvJyArIG9yZ2FuaXphdGlvbklkICsgJy91c2Vycy8nICsgaWQsIHJlcXVlc3QsIHRydWUsIGZhbHNlKTtcbiAgICB9XG5cbiAgICBwdXRPcmdhbml6YXRpb25Vc2VyR3JvdXBzKG9yZ2FuaXphdGlvbklkOiBzdHJpbmcsIGlkOiBzdHJpbmcsXG4gICAgICAgIHJlcXVlc3Q6IE9yZ2FuaXphdGlvblVzZXJVcGRhdGVHcm91cHNSZXF1ZXN0KTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VuZCgnUFVUJywgJy9vcmdhbml6YXRpb25zLycgKyBvcmdhbml6YXRpb25JZCArICcvdXNlcnMvJyArIGlkICsgJy9ncm91cHMnLCByZXF1ZXN0LCB0cnVlLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgcHV0T3JnYW5pemF0aW9uVXNlclJlc2V0UGFzc3dvcmRFbnJvbGxtZW50KG9yZ2FuaXphdGlvbklkOiBzdHJpbmcsIHVzZXJJZDogc3RyaW5nLFxuICAgICAgICByZXF1ZXN0OiBPcmdhbml6YXRpb25Vc2VyUmVzZXRQYXNzd29yZEVucm9sbG1lbnRSZXF1ZXN0KTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VuZCgnUFVUJywgJy9vcmdhbml6YXRpb25zLycgKyBvcmdhbml6YXRpb25JZCArICcvdXNlcnMvJyArIHVzZXJJZCArICcvcmVzZXQtcGFzc3dvcmQtZW5yb2xsbWVudCcsXG4gICAgICAgICAgICByZXF1ZXN0LCB0cnVlLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgcHV0T3JnYW5pemF0aW9uVXNlclJlc2V0UGFzc3dvcmQob3JnYW5pemF0aW9uSWQ6IHN0cmluZywgaWQ6IHN0cmluZyxcbiAgICAgICAgcmVxdWVzdDogT3JnYW5pemF0aW9uVXNlclJlc2V0UGFzc3dvcmRSZXF1ZXN0KTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VuZCgnUFVUJywgJy9vcmdhbml6YXRpb25zLycgKyBvcmdhbml6YXRpb25JZCArICcvdXNlcnMvJyArIGlkICsgJy9yZXNldC1wYXNzd29yZCcsXG4gICAgICAgICAgICByZXF1ZXN0LCB0cnVlLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgZGVsZXRlT3JnYW5pemF0aW9uVXNlcihvcmdhbml6YXRpb25JZDogc3RyaW5nLCBpZDogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VuZCgnREVMRVRFJywgJy9vcmdhbml6YXRpb25zLycgKyBvcmdhbml6YXRpb25JZCArICcvdXNlcnMvJyArIGlkLCBudWxsLCB0cnVlLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgYXN5bmMgZGVsZXRlTWFueU9yZ2FuaXphdGlvblVzZXJzKG9yZ2FuaXphdGlvbklkOiBzdHJpbmcsIHJlcXVlc3Q6IE9yZ2FuaXphdGlvblVzZXJCdWxrUmVxdWVzdCk6IFByb21pc2U8TGlzdFJlc3BvbnNlPE9yZ2FuaXphdGlvblVzZXJCdWxrUmVzcG9uc2U+PiB7XG4gICAgICAgIGNvbnN0IHIgPSBhd2FpdCB0aGlzLnNlbmQoJ0RFTEVURScsICcvb3JnYW5pemF0aW9ucy8nICsgb3JnYW5pemF0aW9uSWQgKyAnL3VzZXJzJywgcmVxdWVzdCwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiBuZXcgTGlzdFJlc3BvbnNlKHIsIE9yZ2FuaXphdGlvblVzZXJCdWxrUmVzcG9uc2UpO1xuICAgIH1cblxuICAgIC8vIFBsYW4gQVBJc1xuXG4gICAgYXN5bmMgZ2V0UGxhbnMoKTogUHJvbWlzZTxMaXN0UmVzcG9uc2U8UGxhblJlc3BvbnNlPj4ge1xuICAgICAgICBjb25zdCByID0gYXdhaXQgdGhpcy5zZW5kKCdHRVQnLCAnL3BsYW5zLycsIG51bGwsIHRydWUsIHRydWUpO1xuICAgICAgICByZXR1cm4gbmV3IExpc3RSZXNwb25zZShyLCBQbGFuUmVzcG9uc2UpO1xuICAgIH1cblxuICAgIGFzeW5jIHBvc3RJbXBvcnREaXJlY3Rvcnkob3JnYW5pemF0aW9uSWQ6IHN0cmluZywgcmVxdWVzdDogSW1wb3J0RGlyZWN0b3J5UmVxdWVzdCk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlbmQoJ1BPU1QnLCAnL29yZ2FuaXphdGlvbnMvJyArIG9yZ2FuaXphdGlvbklkICsgJy9pbXBvcnQnLCByZXF1ZXN0LCB0cnVlLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgYXN5bmMgcG9zdFB1YmxpY0ltcG9ydERpcmVjdG9yeShyZXF1ZXN0OiBPcmdhbml6YXRpb25JbXBvcnRSZXF1ZXN0KTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VuZCgnUE9TVCcsICcvcHVibGljL29yZ2FuaXphdGlvbi9pbXBvcnQnLCByZXF1ZXN0LCB0cnVlLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgYXN5bmMgZ2V0VGF4UmF0ZXMoKTogUHJvbWlzZTxMaXN0UmVzcG9uc2U8VGF4UmF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICBjb25zdCByID0gYXdhaXQgdGhpcy5zZW5kKCdHRVQnLCAnL3BsYW5zL3NhbGVzLXRheC1yYXRlcy8nLCBudWxsLCB0cnVlLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIG5ldyBMaXN0UmVzcG9uc2UociwgVGF4UmF0ZVJlc3BvbnNlKTtcbiAgICB9XG5cbiAgICAvLyBTZXR0aW5ncyBBUElzXG5cbiAgICBhc3luYyBnZXRTZXR0aW5nc0RvbWFpbnMoKTogUHJvbWlzZTxEb21haW5zUmVzcG9uc2U+IHtcbiAgICAgICAgY29uc3QgciA9IGF3YWl0IHRoaXMuc2VuZCgnR0VUJywgJy9zZXR0aW5ncy9kb21haW5zJywgbnVsbCwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiBuZXcgRG9tYWluc1Jlc3BvbnNlKHIpO1xuICAgIH1cblxuICAgIGFzeW5jIHB1dFNldHRpbmdzRG9tYWlucyhyZXF1ZXN0OiBVcGRhdGVEb21haW5zUmVxdWVzdCk6IFByb21pc2U8RG9tYWluc1Jlc3BvbnNlPiB7XG4gICAgICAgIGNvbnN0IHIgPSBhd2FpdCB0aGlzLnNlbmQoJ1BVVCcsICcvc2V0dGluZ3MvZG9tYWlucycsIHJlcXVlc3QsIHRydWUsIHRydWUpO1xuICAgICAgICByZXR1cm4gbmV3IERvbWFpbnNSZXNwb25zZShyKTtcbiAgICB9XG5cbiAgICAvLyBTeW5jIEFQSXNcblxuICAgIGFzeW5jIGdldFN5bmMoKTogUHJvbWlzZTxTeW5jUmVzcG9uc2U+IHtcbiAgICAgICAgY29uc3QgcGF0aCA9IHRoaXMuaXNEZXNrdG9wQ2xpZW50IHx8IHRoaXMuaXNXZWJDbGllbnQgPyAnL3N5bmM/ZXhjbHVkZURvbWFpbnM9dHJ1ZScgOiAnL3N5bmMnO1xuICAgICAgICBjb25zdCByID0gYXdhaXQgdGhpcy5zZW5kKCdHRVQnLCBwYXRoLCBudWxsLCB0cnVlLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIG5ldyBTeW5jUmVzcG9uc2Uocik7XG4gICAgfVxuXG4gICAgLy8gVHdvLWZhY3RvciBBUElzXG5cbiAgICBhc3luYyBnZXRUd29GYWN0b3JQcm92aWRlcnMoKTogUHJvbWlzZTxMaXN0UmVzcG9uc2U8VHdvRmFjdG9yUHJvdmlkZXJSZXNwb25zZT4+IHtcbiAgICAgICAgY29uc3QgciA9IGF3YWl0IHRoaXMuc2VuZCgnR0VUJywgJy90d28tZmFjdG9yJywgbnVsbCwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiBuZXcgTGlzdFJlc3BvbnNlKHIsIFR3b0ZhY3RvclByb3ZpZGVyUmVzcG9uc2UpO1xuICAgIH1cblxuICAgIGFzeW5jIGdldFR3b0ZhY3Rvck9yZ2FuaXphdGlvblByb3ZpZGVycyhvcmdhbml6YXRpb25JZDogc3RyaW5nKTogUHJvbWlzZTxMaXN0UmVzcG9uc2U8VHdvRmFjdG9yUHJvdmlkZXJSZXNwb25zZT4+IHtcbiAgICAgICAgY29uc3QgciA9IGF3YWl0IHRoaXMuc2VuZCgnR0VUJywgJy9vcmdhbml6YXRpb25zLycgKyBvcmdhbml6YXRpb25JZCArICcvdHdvLWZhY3RvcicsIG51bGwsIHRydWUsIHRydWUpO1xuICAgICAgICByZXR1cm4gbmV3IExpc3RSZXNwb25zZShyLCBUd29GYWN0b3JQcm92aWRlclJlc3BvbnNlKTtcbiAgICB9XG5cbiAgICBhc3luYyBnZXRUd29GYWN0b3JBdXRoZW50aWNhdG9yKHJlcXVlc3Q6IFBhc3N3b3JkVmVyaWZpY2F0aW9uUmVxdWVzdCk6IFByb21pc2U8VHdvRmFjdG9yQXV0aGVudGljYXRvclJlc3BvbnNlPiB7XG4gICAgICAgIGNvbnN0IHIgPSBhd2FpdCB0aGlzLnNlbmQoJ1BPU1QnLCAnL3R3by1mYWN0b3IvZ2V0LWF1dGhlbnRpY2F0b3InLCByZXF1ZXN0LCB0cnVlLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIG5ldyBUd29GYWN0b3JBdXRoZW50aWNhdG9yUmVzcG9uc2Uocik7XG4gICAgfVxuXG4gICAgYXN5bmMgZ2V0VHdvRmFjdG9yRW1haWwocmVxdWVzdDogUGFzc3dvcmRWZXJpZmljYXRpb25SZXF1ZXN0KTogUHJvbWlzZTxUd29GYWN0b3JFbWFpbFJlc3BvbnNlPiB7XG4gICAgICAgIGNvbnN0IHIgPSBhd2FpdCB0aGlzLnNlbmQoJ1BPU1QnLCAnL3R3by1mYWN0b3IvZ2V0LWVtYWlsJywgcmVxdWVzdCwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiBuZXcgVHdvRmFjdG9yRW1haWxSZXNwb25zZShyKTtcbiAgICB9XG5cbiAgICBhc3luYyBnZXRUd29GYWN0b3JEdW8ocmVxdWVzdDogUGFzc3dvcmRWZXJpZmljYXRpb25SZXF1ZXN0KTogUHJvbWlzZTxUd29GYWN0b3JEdW9SZXNwb25zZT4ge1xuICAgICAgICBjb25zdCByID0gYXdhaXQgdGhpcy5zZW5kKCdQT1NUJywgJy90d28tZmFjdG9yL2dldC1kdW8nLCByZXF1ZXN0LCB0cnVlLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIG5ldyBUd29GYWN0b3JEdW9SZXNwb25zZShyKTtcbiAgICB9XG5cbiAgICBhc3luYyBnZXRUd29GYWN0b3JPcmdhbml6YXRpb25EdW8ob3JnYW5pemF0aW9uSWQ6IHN0cmluZyxcbiAgICAgICAgcmVxdWVzdDogUGFzc3dvcmRWZXJpZmljYXRpb25SZXF1ZXN0KTogUHJvbWlzZTxUd29GYWN0b3JEdW9SZXNwb25zZT4ge1xuICAgICAgICBjb25zdCByID0gYXdhaXQgdGhpcy5zZW5kKCdQT1NUJywgJy9vcmdhbml6YXRpb25zLycgKyBvcmdhbml6YXRpb25JZCArICcvdHdvLWZhY3Rvci9nZXQtZHVvJyxcbiAgICAgICAgICAgIHJlcXVlc3QsIHRydWUsIHRydWUpO1xuICAgICAgICByZXR1cm4gbmV3IFR3b0ZhY3RvckR1b1Jlc3BvbnNlKHIpO1xuICAgIH1cblxuICAgIGFzeW5jIGdldFR3b0ZhY3Rvcll1YmlLZXkocmVxdWVzdDogUGFzc3dvcmRWZXJpZmljYXRpb25SZXF1ZXN0KTogUHJvbWlzZTxUd29GYWN0b3JZdWJpS2V5UmVzcG9uc2U+IHtcbiAgICAgICAgY29uc3QgciA9IGF3YWl0IHRoaXMuc2VuZCgnUE9TVCcsICcvdHdvLWZhY3Rvci9nZXQteXViaWtleScsIHJlcXVlc3QsIHRydWUsIHRydWUpO1xuICAgICAgICByZXR1cm4gbmV3IFR3b0ZhY3Rvcll1YmlLZXlSZXNwb25zZShyKTtcbiAgICB9XG5cbiAgICBhc3luYyBnZXRUd29GYWN0b3JXZWJBdXRobihyZXF1ZXN0OiBQYXNzd29yZFZlcmlmaWNhdGlvblJlcXVlc3QpOiBQcm9taXNlPFR3b0ZhY3RvcldlYkF1dGhuUmVzcG9uc2U+IHtcbiAgICAgICAgY29uc3QgciA9IGF3YWl0IHRoaXMuc2VuZCgnUE9TVCcsICcvdHdvLWZhY3Rvci9nZXQtd2ViYXV0aG4nLCByZXF1ZXN0LCB0cnVlLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIG5ldyBUd29GYWN0b3JXZWJBdXRoblJlc3BvbnNlKHIpO1xuICAgIH1cblxuICAgIGFzeW5jIGdldFR3b0ZhY3RvcldlYkF1dGhuQ2hhbGxlbmdlKHJlcXVlc3Q6IFBhc3N3b3JkVmVyaWZpY2F0aW9uUmVxdWVzdCk6IFByb21pc2U8Q2hhbGxlbmdlUmVzcG9uc2U+IHtcbiAgICAgICAgY29uc3QgciA9IGF3YWl0IHRoaXMuc2VuZCgnUE9TVCcsICcvdHdvLWZhY3Rvci9nZXQtd2ViYXV0aG4tY2hhbGxlbmdlJywgcmVxdWVzdCwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiBuZXcgQ2hhbGxlbmdlUmVzcG9uc2Uocik7XG4gICAgfVxuXG4gICAgYXN5bmMgZ2V0VHdvRmFjdG9yUmVjb3ZlcihyZXF1ZXN0OiBQYXNzd29yZFZlcmlmaWNhdGlvblJlcXVlc3QpOiBQcm9taXNlPFR3b0ZhY3RvclJlY292ZXJSZXNwb25zZT4ge1xuICAgICAgICBjb25zdCByID0gYXdhaXQgdGhpcy5zZW5kKCdQT1NUJywgJy90d28tZmFjdG9yL2dldC1yZWNvdmVyJywgcmVxdWVzdCwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiBuZXcgVHdvRmFjdG9yUmVjb3ZlclJlc3BvbnNlKHIpO1xuICAgIH1cblxuICAgIGFzeW5jIHB1dFR3b0ZhY3RvckF1dGhlbnRpY2F0b3IoXG4gICAgICAgIHJlcXVlc3Q6IFVwZGF0ZVR3b0ZhY3RvckF1dGhlbnRpY2F0b3JSZXF1ZXN0KTogUHJvbWlzZTxUd29GYWN0b3JBdXRoZW50aWNhdG9yUmVzcG9uc2U+IHtcbiAgICAgICAgY29uc3QgciA9IGF3YWl0IHRoaXMuc2VuZCgnUFVUJywgJy90d28tZmFjdG9yL2F1dGhlbnRpY2F0b3InLCByZXF1ZXN0LCB0cnVlLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIG5ldyBUd29GYWN0b3JBdXRoZW50aWNhdG9yUmVzcG9uc2Uocik7XG4gICAgfVxuXG4gICAgYXN5bmMgcHV0VHdvRmFjdG9yRW1haWwocmVxdWVzdDogVXBkYXRlVHdvRmFjdG9yRW1haWxSZXF1ZXN0KTogUHJvbWlzZTxUd29GYWN0b3JFbWFpbFJlc3BvbnNlPiB7XG4gICAgICAgIGNvbnN0IHIgPSBhd2FpdCB0aGlzLnNlbmQoJ1BVVCcsICcvdHdvLWZhY3Rvci9lbWFpbCcsIHJlcXVlc3QsIHRydWUsIHRydWUpO1xuICAgICAgICByZXR1cm4gbmV3IFR3b0ZhY3RvckVtYWlsUmVzcG9uc2Uocik7XG4gICAgfVxuXG4gICAgYXN5bmMgcHV0VHdvRmFjdG9yRHVvKHJlcXVlc3Q6IFVwZGF0ZVR3b0ZhY3RvckR1b1JlcXVlc3QpOiBQcm9taXNlPFR3b0ZhY3RvckR1b1Jlc3BvbnNlPiB7XG4gICAgICAgIGNvbnN0IHIgPSBhd2FpdCB0aGlzLnNlbmQoJ1BVVCcsICcvdHdvLWZhY3Rvci9kdW8nLCByZXF1ZXN0LCB0cnVlLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIG5ldyBUd29GYWN0b3JEdW9SZXNwb25zZShyKTtcbiAgICB9XG5cbiAgICBhc3luYyBwdXRUd29GYWN0b3JPcmdhbml6YXRpb25EdW8ob3JnYW5pemF0aW9uSWQ6IHN0cmluZyxcbiAgICAgICAgcmVxdWVzdDogVXBkYXRlVHdvRmFjdG9yRHVvUmVxdWVzdCk6IFByb21pc2U8VHdvRmFjdG9yRHVvUmVzcG9uc2U+IHtcbiAgICAgICAgY29uc3QgciA9IGF3YWl0IHRoaXMuc2VuZCgnUFVUJywgJy9vcmdhbml6YXRpb25zLycgKyBvcmdhbml6YXRpb25JZCArICcvdHdvLWZhY3Rvci9kdW8nLCByZXF1ZXN0LCB0cnVlLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIG5ldyBUd29GYWN0b3JEdW9SZXNwb25zZShyKTtcbiAgICB9XG5cbiAgICBhc3luYyBwdXRUd29GYWN0b3JZdWJpS2V5KHJlcXVlc3Q6IFVwZGF0ZVR3b0ZhY3Rvcll1YmlvT3RwUmVxdWVzdCk6IFByb21pc2U8VHdvRmFjdG9yWXViaUtleVJlc3BvbnNlPiB7XG4gICAgICAgIGNvbnN0IHIgPSBhd2FpdCB0aGlzLnNlbmQoJ1BVVCcsICcvdHdvLWZhY3Rvci95dWJpa2V5JywgcmVxdWVzdCwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiBuZXcgVHdvRmFjdG9yWXViaUtleVJlc3BvbnNlKHIpO1xuICAgIH1cblxuICAgIGFzeW5jIHB1dFR3b0ZhY3RvcldlYkF1dGhuKHJlcXVlc3Q6IFVwZGF0ZVR3b0ZhY3RvcldlYkF1dGhuUmVxdWVzdCk6IFByb21pc2U8VHdvRmFjdG9yV2ViQXV0aG5SZXNwb25zZT4ge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IHJlcXVlc3QuZGV2aWNlUmVzcG9uc2UucmVzcG9uc2UgYXMgQXV0aGVudGljYXRvckF0dGVzdGF0aW9uUmVzcG9uc2U7XG4gICAgICAgIGNvbnN0IGRhdGE6IGFueSA9IE9iamVjdC5hc3NpZ24oe30sIHJlcXVlc3QpO1xuXG4gICAgICAgIGRhdGEuZGV2aWNlUmVzcG9uc2UgPSB7XG4gICAgICAgICAgICBpZDogcmVxdWVzdC5kZXZpY2VSZXNwb25zZS5pZCxcbiAgICAgICAgICAgIHJhd0lkOiBidG9hKHJlcXVlc3QuZGV2aWNlUmVzcG9uc2UuaWQpLFxuICAgICAgICAgICAgdHlwZTogcmVxdWVzdC5kZXZpY2VSZXNwb25zZS50eXBlLFxuICAgICAgICAgICAgZXh0ZW5zaW9uczogcmVxdWVzdC5kZXZpY2VSZXNwb25zZS5nZXRDbGllbnRFeHRlbnNpb25SZXN1bHRzKCksXG4gICAgICAgICAgICByZXNwb25zZToge1xuICAgICAgICAgICAgICAgIEF0dGVzdGF0aW9uT2JqZWN0OiBVdGlscy5mcm9tQnVmZmVyVG9CNjQocmVzcG9uc2UuYXR0ZXN0YXRpb25PYmplY3QpLFxuICAgICAgICAgICAgICAgIGNsaWVudERhdGFKc29uOiBVdGlscy5mcm9tQnVmZmVyVG9CNjQocmVzcG9uc2UuY2xpZW50RGF0YUpTT04pLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCByID0gYXdhaXQgdGhpcy5zZW5kKCdQVVQnLCAnL3R3by1mYWN0b3Ivd2ViYXV0aG4nLCBkYXRhLCB0cnVlLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIG5ldyBUd29GYWN0b3JXZWJBdXRoblJlc3BvbnNlKHIpO1xuICAgIH1cblxuICAgIGFzeW5jIGRlbGV0ZVR3b0ZhY3RvcldlYkF1dGhuKHJlcXVlc3Q6IFVwZGF0ZVR3b0ZhY3RvcldlYkF1dGhuRGVsZXRlUmVxdWVzdCk6IFByb21pc2U8VHdvRmFjdG9yV2ViQXV0aG5SZXNwb25zZT4ge1xuICAgICAgICBjb25zdCByID0gYXdhaXQgdGhpcy5zZW5kKCdERUxFVEUnLCAnL3R3by1mYWN0b3Ivd2ViYXV0aG4nLCByZXF1ZXN0LCB0cnVlLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIG5ldyBUd29GYWN0b3JXZWJBdXRoblJlc3BvbnNlKHIpO1xuICAgIH1cblxuICAgIGFzeW5jIHB1dFR3b0ZhY3RvckRpc2FibGUocmVxdWVzdDogVHdvRmFjdG9yUHJvdmlkZXJSZXF1ZXN0KTogUHJvbWlzZTxUd29GYWN0b3JQcm92aWRlclJlc3BvbnNlPiB7XG4gICAgICAgIGNvbnN0IHIgPSBhd2FpdCB0aGlzLnNlbmQoJ1BVVCcsICcvdHdvLWZhY3Rvci9kaXNhYmxlJywgcmVxdWVzdCwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiBuZXcgVHdvRmFjdG9yUHJvdmlkZXJSZXNwb25zZShyKTtcbiAgICB9XG5cbiAgICBhc3luYyBwdXRUd29GYWN0b3JPcmdhbml6YXRpb25EaXNhYmxlKG9yZ2FuaXphdGlvbklkOiBzdHJpbmcsXG4gICAgICAgIHJlcXVlc3Q6IFR3b0ZhY3RvclByb3ZpZGVyUmVxdWVzdCk6IFByb21pc2U8VHdvRmFjdG9yUHJvdmlkZXJSZXNwb25zZT4ge1xuICAgICAgICBjb25zdCByID0gYXdhaXQgdGhpcy5zZW5kKCdQVVQnLCAnL29yZ2FuaXphdGlvbnMvJyArIG9yZ2FuaXphdGlvbklkICsgJy90d28tZmFjdG9yL2Rpc2FibGUnLFxuICAgICAgICAgICAgcmVxdWVzdCwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiBuZXcgVHdvRmFjdG9yUHJvdmlkZXJSZXNwb25zZShyKTtcbiAgICB9XG5cbiAgICBwb3N0VHdvRmFjdG9yUmVjb3ZlcihyZXF1ZXN0OiBUd29GYWN0b3JSZWNvdmVyeVJlcXVlc3QpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zZW5kKCdQT1NUJywgJy90d28tZmFjdG9yL3JlY292ZXInLCByZXF1ZXN0LCBmYWxzZSwgZmFsc2UpO1xuICAgIH1cblxuICAgIHBvc3RUd29GYWN0b3JFbWFpbFNldHVwKHJlcXVlc3Q6IFR3b0ZhY3RvckVtYWlsUmVxdWVzdCk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlbmQoJ1BPU1QnLCAnL3R3by1mYWN0b3Ivc2VuZC1lbWFpbCcsIHJlcXVlc3QsIHRydWUsIGZhbHNlKTtcbiAgICB9XG5cbiAgICBwb3N0VHdvRmFjdG9yRW1haWwocmVxdWVzdDogVHdvRmFjdG9yRW1haWxSZXF1ZXN0KTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VuZCgnUE9TVCcsICcvdHdvLWZhY3Rvci9zZW5kLWVtYWlsLWxvZ2luJywgcmVxdWVzdCwgZmFsc2UsIGZhbHNlKTtcbiAgICB9XG5cbiAgICAvLyBFbWVyZ2VuY3kgQWNjZXNzIEFQSXNcblxuICAgIGFzeW5jIGdldEVtZXJnZW5jeUFjY2Vzc1RydXN0ZWQoKTogUHJvbWlzZTxMaXN0UmVzcG9uc2U8RW1lcmdlbmN5QWNjZXNzR3JhbnRlZURldGFpbHNSZXNwb25zZT4+IHtcbiAgICAgICAgY29uc3QgciA9IGF3YWl0IHRoaXMuc2VuZCgnR0VUJywgJy9lbWVyZ2VuY3ktYWNjZXNzL3RydXN0ZWQnLCBudWxsLCB0cnVlLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIG5ldyBMaXN0UmVzcG9uc2UociwgRW1lcmdlbmN5QWNjZXNzR3JhbnRlZURldGFpbHNSZXNwb25zZSk7XG4gICAgfVxuXG4gICAgYXN5bmMgZ2V0RW1lcmdlbmN5QWNjZXNzR3JhbnRlZCgpOiBQcm9taXNlPExpc3RSZXNwb25zZTxFbWVyZ2VuY3lBY2Nlc3NHcmFudG9yRGV0YWlsc1Jlc3BvbnNlPj4ge1xuICAgICAgICBjb25zdCByID0gYXdhaXQgdGhpcy5zZW5kKCdHRVQnLCAnL2VtZXJnZW5jeS1hY2Nlc3MvZ3JhbnRlZCcsIG51bGwsIHRydWUsIHRydWUpO1xuICAgICAgICByZXR1cm4gbmV3IExpc3RSZXNwb25zZShyLCBFbWVyZ2VuY3lBY2Nlc3NHcmFudG9yRGV0YWlsc1Jlc3BvbnNlKTtcbiAgICB9XG5cbiAgICBhc3luYyBnZXRFbWVyZ2VuY3lBY2Nlc3MoaWQ6IHN0cmluZyk6IFByb21pc2U8RW1lcmdlbmN5QWNjZXNzR3JhbnRlZURldGFpbHNSZXNwb25zZT4ge1xuICAgICAgICBjb25zdCByID0gYXdhaXQgdGhpcy5zZW5kKCdHRVQnLCAnL2VtZXJnZW5jeS1hY2Nlc3MvJyArIGlkLCBudWxsLCB0cnVlLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIG5ldyBFbWVyZ2VuY3lBY2Nlc3NHcmFudGVlRGV0YWlsc1Jlc3BvbnNlKHIpO1xuICAgIH1cblxuICAgIGFzeW5jIGdldEVtZXJnZW5jeUdyYW50b3JQb2xpY2llcyhpZDogc3RyaW5nKTogUHJvbWlzZTxMaXN0UmVzcG9uc2U8UG9saWN5UmVzcG9uc2U+PiB7XG4gICAgICAgIGNvbnN0IHIgPSBhd2FpdCB0aGlzLnNlbmQoJ0dFVCcsICcvZW1lcmdlbmN5LWFjY2Vzcy8nICsgaWQgKyAnL3BvbGljaWVzJywgbnVsbCwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiBuZXcgTGlzdFJlc3BvbnNlKHIsIFBvbGljeVJlc3BvbnNlKTtcbiAgICB9XG5cbiAgICBwdXRFbWVyZ2VuY3lBY2Nlc3MoaWQ6IHN0cmluZywgcmVxdWVzdDogRW1lcmdlbmN5QWNjZXNzVXBkYXRlUmVxdWVzdCk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlbmQoJ1BVVCcsICcvZW1lcmdlbmN5LWFjY2Vzcy8nICsgaWQsIHJlcXVlc3QsIHRydWUsIGZhbHNlKTtcbiAgICB9XG5cbiAgICBkZWxldGVFbWVyZ2VuY3lBY2Nlc3MoaWQ6IHN0cmluZyk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlbmQoJ0RFTEVURScsICcvZW1lcmdlbmN5LWFjY2Vzcy8nICsgaWQsIG51bGwsIHRydWUsIGZhbHNlKTtcbiAgICB9XG5cbiAgICBwb3N0RW1lcmdlbmN5QWNjZXNzSW52aXRlKHJlcXVlc3Q6IEVtZXJnZW5jeUFjY2Vzc0ludml0ZVJlcXVlc3QpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zZW5kKCdQT1NUJywgJy9lbWVyZ2VuY3ktYWNjZXNzL2ludml0ZScsIHJlcXVlc3QsIHRydWUsIGZhbHNlKTtcbiAgICB9XG5cbiAgICBwb3N0RW1lcmdlbmN5QWNjZXNzUmVpbnZpdGUoaWQ6IHN0cmluZyk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlbmQoJ1BPU1QnLCAnL2VtZXJnZW5jeS1hY2Nlc3MvJyArIGlkICsgJy9yZWludml0ZScsIG51bGwsIHRydWUsIGZhbHNlKTtcbiAgICB9XG5cbiAgICBwb3N0RW1lcmdlbmN5QWNjZXNzQWNjZXB0KGlkOiBzdHJpbmcsIHJlcXVlc3Q6IEVtZXJnZW5jeUFjY2Vzc0FjY2VwdFJlcXVlc3QpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zZW5kKCdQT1NUJywgJy9lbWVyZ2VuY3ktYWNjZXNzLycgKyBpZCArICcvYWNjZXB0JywgcmVxdWVzdCwgdHJ1ZSwgZmFsc2UpO1xuICAgIH1cblxuICAgIHBvc3RFbWVyZ2VuY3lBY2Nlc3NDb25maXJtKGlkOiBzdHJpbmcsIHJlcXVlc3Q6IEVtZXJnZW5jeUFjY2Vzc0NvbmZpcm1SZXF1ZXN0KTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VuZCgnUE9TVCcsICcvZW1lcmdlbmN5LWFjY2Vzcy8nICsgaWQgKyAnL2NvbmZpcm0nLCByZXF1ZXN0LCB0cnVlLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgcG9zdEVtZXJnZW5jeUFjY2Vzc0luaXRpYXRlKGlkOiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zZW5kKCdQT1NUJywgJy9lbWVyZ2VuY3ktYWNjZXNzLycgKyBpZCArICcvaW5pdGlhdGUnLCBudWxsLCB0cnVlLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgcG9zdEVtZXJnZW5jeUFjY2Vzc0FwcHJvdmUoaWQ6IHN0cmluZyk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlbmQoJ1BPU1QnLCAnL2VtZXJnZW5jeS1hY2Nlc3MvJyArIGlkICsgJy9hcHByb3ZlJywgbnVsbCwgdHJ1ZSwgZmFsc2UpO1xuICAgIH1cblxuICAgIHBvc3RFbWVyZ2VuY3lBY2Nlc3NSZWplY3QoaWQ6IHN0cmluZyk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlbmQoJ1BPU1QnLCAnL2VtZXJnZW5jeS1hY2Nlc3MvJyArIGlkICsgJy9yZWplY3QnLCBudWxsLCB0cnVlLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgYXN5bmMgcG9zdEVtZXJnZW5jeUFjY2Vzc1Rha2VvdmVyKGlkOiBzdHJpbmcpOiBQcm9taXNlPEVtZXJnZW5jeUFjY2Vzc1Rha2VvdmVyUmVzcG9uc2U+IHtcbiAgICAgICAgY29uc3QgciA9IGF3YWl0IHRoaXMuc2VuZCgnUE9TVCcsICcvZW1lcmdlbmN5LWFjY2Vzcy8nICsgaWQgKyAnL3Rha2VvdmVyJywgbnVsbCwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiBuZXcgRW1lcmdlbmN5QWNjZXNzVGFrZW92ZXJSZXNwb25zZShyKTtcbiAgICB9XG5cbiAgICBhc3luYyBwb3N0RW1lcmdlbmN5QWNjZXNzUGFzc3dvcmQoaWQ6IHN0cmluZywgcmVxdWVzdDogRW1lcmdlbmN5QWNjZXNzUGFzc3dvcmRSZXF1ZXN0KTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgY29uc3QgciA9IGF3YWl0IHRoaXMuc2VuZCgnUE9TVCcsICcvZW1lcmdlbmN5LWFjY2Vzcy8nICsgaWQgKyAnL3Bhc3N3b3JkJywgcmVxdWVzdCwgdHJ1ZSwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgYXN5bmMgcG9zdEVtZXJnZW5jeUFjY2Vzc1ZpZXcoaWQ6IHN0cmluZyk6IFByb21pc2U8RW1lcmdlbmN5QWNjZXNzVmlld1Jlc3BvbnNlPiB7XG4gICAgICAgIGNvbnN0IHIgPSBhd2FpdCB0aGlzLnNlbmQoJ1BPU1QnLCAnL2VtZXJnZW5jeS1hY2Nlc3MvJyArIGlkICsgJy92aWV3JywgbnVsbCwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiBuZXcgRW1lcmdlbmN5QWNjZXNzVmlld1Jlc3BvbnNlKHIpO1xuICAgIH1cblxuICAgIC8vIE9yZ2FuaXphdGlvbiBBUElzXG5cbiAgICBhc3luYyBnZXRPcmdhbml6YXRpb24oaWQ6IHN0cmluZyk6IFByb21pc2U8T3JnYW5pemF0aW9uUmVzcG9uc2U+IHtcbiAgICAgICAgY29uc3QgciA9IGF3YWl0IHRoaXMuc2VuZCgnR0VUJywgJy9vcmdhbml6YXRpb25zLycgKyBpZCwgbnVsbCwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiBuZXcgT3JnYW5pemF0aW9uUmVzcG9uc2Uocik7XG4gICAgfVxuXG4gICAgYXN5bmMgZ2V0T3JnYW5pemF0aW9uQmlsbGluZyhpZDogc3RyaW5nKTogUHJvbWlzZTxCaWxsaW5nUmVzcG9uc2U+IHtcbiAgICAgICAgY29uc3QgciA9IGF3YWl0IHRoaXMuc2VuZCgnR0VUJywgJy9vcmdhbml6YXRpb25zLycgKyBpZCArICcvYmlsbGluZycsIG51bGwsIHRydWUsIHRydWUpO1xuICAgICAgICByZXR1cm4gbmV3IEJpbGxpbmdSZXNwb25zZShyKTtcbiAgICB9XG5cbiAgICBhc3luYyBnZXRPcmdhbml6YXRpb25TdWJzY3JpcHRpb24oaWQ6IHN0cmluZyk6IFByb21pc2U8T3JnYW5pemF0aW9uU3Vic2NyaXB0aW9uUmVzcG9uc2U+IHtcbiAgICAgICAgY29uc3QgciA9IGF3YWl0IHRoaXMuc2VuZCgnR0VUJywgJy9vcmdhbml6YXRpb25zLycgKyBpZCArICcvc3Vic2NyaXB0aW9uJywgbnVsbCwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiBuZXcgT3JnYW5pemF0aW9uU3Vic2NyaXB0aW9uUmVzcG9uc2Uocik7XG4gICAgfVxuXG4gICAgYXN5bmMgZ2V0T3JnYW5pemF0aW9uTGljZW5zZShpZDogc3RyaW5nLCBpbnN0YWxsYXRpb25JZDogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VuZCgnR0VUJywgJy9vcmdhbml6YXRpb25zLycgKyBpZCArICcvbGljZW5zZT9pbnN0YWxsYXRpb25JZD0nICsgaW5zdGFsbGF0aW9uSWQsXG4gICAgICAgICAgICBudWxsLCB0cnVlLCB0cnVlKTtcbiAgICB9XG5cbiAgICBhc3luYyBnZXRPcmdhbml6YXRpb25UYXhJbmZvKGlkOiBzdHJpbmcpOiBQcm9taXNlPFRheEluZm9SZXNwb25zZT4ge1xuICAgICAgICBjb25zdCByID0gYXdhaXQgdGhpcy5zZW5kKCdHRVQnLCAnL29yZ2FuaXphdGlvbnMvJyArIGlkICsgJy90YXgnLCBudWxsLCB0cnVlLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIG5ldyBUYXhJbmZvUmVzcG9uc2Uocik7XG4gICAgfVxuXG4gICAgYXN5bmMgZ2V0T3JnYW5pemF0aW9uU3NvKGlkOiBzdHJpbmcpOiBQcm9taXNlPE9yZ2FuaXphdGlvblNzb1Jlc3BvbnNlPiB7XG4gICAgICAgIGNvbnN0IHIgPSBhd2FpdCB0aGlzLnNlbmQoJ0dFVCcsICcvb3JnYW5pemF0aW9ucy8nICsgaWQgKyAnL3NzbycsIG51bGwsIHRydWUsIHRydWUpO1xuICAgICAgICByZXR1cm4gbmV3IE9yZ2FuaXphdGlvblNzb1Jlc3BvbnNlKHIpO1xuICAgIH1cblxuICAgIGFzeW5jIHBvc3RPcmdhbml6YXRpb24ocmVxdWVzdDogT3JnYW5pemF0aW9uQ3JlYXRlUmVxdWVzdCk6IFByb21pc2U8T3JnYW5pemF0aW9uUmVzcG9uc2U+IHtcbiAgICAgICAgY29uc3QgciA9IGF3YWl0IHRoaXMuc2VuZCgnUE9TVCcsICcvb3JnYW5pemF0aW9ucycsIHJlcXVlc3QsIHRydWUsIHRydWUpO1xuICAgICAgICByZXR1cm4gbmV3IE9yZ2FuaXphdGlvblJlc3BvbnNlKHIpO1xuICAgIH1cblxuICAgIGFzeW5jIHB1dE9yZ2FuaXphdGlvbihpZDogc3RyaW5nLCByZXF1ZXN0OiBPcmdhbml6YXRpb25VcGRhdGVSZXF1ZXN0KTogUHJvbWlzZTxPcmdhbml6YXRpb25SZXNwb25zZT4ge1xuICAgICAgICBjb25zdCByID0gYXdhaXQgdGhpcy5zZW5kKCdQVVQnLCAnL29yZ2FuaXphdGlvbnMvJyArIGlkLCByZXF1ZXN0LCB0cnVlLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIG5ldyBPcmdhbml6YXRpb25SZXNwb25zZShyKTtcbiAgICB9XG5cbiAgICBhc3luYyBwdXRPcmdhbml6YXRpb25UYXhJbmZvKGlkOiBzdHJpbmcsIHJlcXVlc3Q6IE9yZ2FuaXphdGlvblRheEluZm9VcGRhdGVSZXF1ZXN0KTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VuZCgnUFVUJywgJy9vcmdhbml6YXRpb25zLycgKyBpZCArICcvdGF4JywgcmVxdWVzdCwgdHJ1ZSwgZmFsc2UpO1xuICAgIH1cblxuICAgIHBvc3RMZWF2ZU9yZ2FuaXphdGlvbihpZDogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VuZCgnUE9TVCcsICcvb3JnYW5pemF0aW9ucy8nICsgaWQgKyAnL2xlYXZlJywgbnVsbCwgdHJ1ZSwgZmFsc2UpO1xuICAgIH1cblxuICAgIGFzeW5jIHBvc3RPcmdhbml6YXRpb25MaWNlbnNlKGRhdGE6IEZvcm1EYXRhKTogUHJvbWlzZTxPcmdhbml6YXRpb25SZXNwb25zZT4ge1xuICAgICAgICBjb25zdCByID0gYXdhaXQgdGhpcy5zZW5kKCdQT1NUJywgJy9vcmdhbml6YXRpb25zL2xpY2Vuc2UnLCBkYXRhLCB0cnVlLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIG5ldyBPcmdhbml6YXRpb25SZXNwb25zZShyKTtcbiAgICB9XG5cbiAgICBhc3luYyBwb3N0T3JnYW5pemF0aW9uTGljZW5zZVVwZGF0ZShpZDogc3RyaW5nLCBkYXRhOiBGb3JtRGF0YSk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlbmQoJ1BPU1QnLCAnL29yZ2FuaXphdGlvbnMvJyArIGlkICsgJy9saWNlbnNlJywgZGF0YSwgdHJ1ZSwgZmFsc2UpO1xuICAgIH1cblxuICAgIGFzeW5jIHBvc3RPcmdhbml6YXRpb25BcGlLZXkoaWQ6IHN0cmluZywgcmVxdWVzdDogUGFzc3dvcmRWZXJpZmljYXRpb25SZXF1ZXN0KTogUHJvbWlzZTxBcGlLZXlSZXNwb25zZT4ge1xuICAgICAgICBjb25zdCByID0gYXdhaXQgdGhpcy5zZW5kKCdQT1NUJywgJy9vcmdhbml6YXRpb25zLycgKyBpZCArICcvYXBpLWtleScsIHJlcXVlc3QsIHRydWUsIHRydWUpO1xuICAgICAgICByZXR1cm4gbmV3IEFwaUtleVJlc3BvbnNlKHIpO1xuICAgIH1cblxuICAgIGFzeW5jIHBvc3RPcmdhbml6YXRpb25Sb3RhdGVBcGlLZXkoaWQ6IHN0cmluZywgcmVxdWVzdDogUGFzc3dvcmRWZXJpZmljYXRpb25SZXF1ZXN0KTogUHJvbWlzZTxBcGlLZXlSZXNwb25zZT4ge1xuICAgICAgICBjb25zdCByID0gYXdhaXQgdGhpcy5zZW5kKCdQT1NUJywgJy9vcmdhbml6YXRpb25zLycgKyBpZCArICcvcm90YXRlLWFwaS1rZXknLCByZXF1ZXN0LCB0cnVlLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIG5ldyBBcGlLZXlSZXNwb25zZShyKTtcbiAgICB9XG5cbiAgICBhc3luYyBwb3N0T3JnYW5pemF0aW9uU3NvKGlkOiBzdHJpbmcsIHJlcXVlc3Q6IE9yZ2FuaXphdGlvblNzb1JlcXVlc3QpOiBQcm9taXNlPE9yZ2FuaXphdGlvblNzb1Jlc3BvbnNlPiB7XG4gICAgICAgIGNvbnN0IHIgPSBhd2FpdCB0aGlzLnNlbmQoJ1BPU1QnLCAnL29yZ2FuaXphdGlvbnMvJyArIGlkICsgJy9zc28nLCByZXF1ZXN0LCB0cnVlLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIG5ldyBPcmdhbml6YXRpb25Tc29SZXNwb25zZShyKTtcbiAgICB9XG5cbiAgICBhc3luYyBwb3N0T3JnYW5pemF0aW9uVXBncmFkZShpZDogc3RyaW5nLCByZXF1ZXN0OiBPcmdhbml6YXRpb25VcGdyYWRlUmVxdWVzdCk6IFByb21pc2U8UGF5bWVudFJlc3BvbnNlPiB7XG4gICAgICAgIGNvbnN0IHIgPSBhd2FpdCB0aGlzLnNlbmQoJ1BPU1QnLCAnL29yZ2FuaXphdGlvbnMvJyArIGlkICsgJy91cGdyYWRlJywgcmVxdWVzdCwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiBuZXcgUGF5bWVudFJlc3BvbnNlKHIpO1xuICAgIH1cblxuICAgIGFzeW5jIHBvc3RPcmdhbml6YXRpb25VcGRhdGVTdWJzY3JpcHRpb24oaWQ6IHN0cmluZywgcmVxdWVzdDogT3JnYW5pemF0aW9uU3Vic2NyaXB0aW9uVXBkYXRlUmVxdWVzdCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zZW5kKCdQT1NUJywgJy9vcmdhbml6YXRpb25zLycgKyBpZCArICcvc3Vic2NyaXB0aW9uJywgcmVxdWVzdCwgdHJ1ZSwgZmFsc2UpO1xuICAgIH1cblxuICAgIGFzeW5jIHBvc3RPcmdhbml6YXRpb25TZWF0KGlkOiBzdHJpbmcsIHJlcXVlc3Q6IFNlYXRSZXF1ZXN0KTogUHJvbWlzZTxQYXltZW50UmVzcG9uc2U+IHtcbiAgICAgICAgY29uc3QgciA9IGF3YWl0IHRoaXMuc2VuZCgnUE9TVCcsICcvb3JnYW5pemF0aW9ucy8nICsgaWQgKyAnL3NlYXQnLCByZXF1ZXN0LCB0cnVlLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIG5ldyBQYXltZW50UmVzcG9uc2Uocik7XG4gICAgfVxuXG4gICAgYXN5bmMgcG9zdE9yZ2FuaXphdGlvblN0b3JhZ2UoaWQ6IHN0cmluZywgcmVxdWVzdDogU3RvcmFnZVJlcXVlc3QpOiBQcm9taXNlPFBheW1lbnRSZXNwb25zZT4ge1xuICAgICAgICBjb25zdCByID0gYXdhaXQgdGhpcy5zZW5kKCdQT1NUJywgJy9vcmdhbml6YXRpb25zLycgKyBpZCArICcvc3RvcmFnZScsIHJlcXVlc3QsIHRydWUsIHRydWUpO1xuICAgICAgICByZXR1cm4gbmV3IFBheW1lbnRSZXNwb25zZShyKTtcbiAgICB9XG5cbiAgICBwb3N0T3JnYW5pemF0aW9uUGF5bWVudChpZDogc3RyaW5nLCByZXF1ZXN0OiBQYXltZW50UmVxdWVzdCk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlbmQoJ1BPU1QnLCAnL29yZ2FuaXphdGlvbnMvJyArIGlkICsgJy9wYXltZW50JywgcmVxdWVzdCwgdHJ1ZSwgZmFsc2UpO1xuICAgIH1cblxuICAgIHBvc3RPcmdhbml6YXRpb25WZXJpZnlCYW5rKGlkOiBzdHJpbmcsIHJlcXVlc3Q6IFZlcmlmeUJhbmtSZXF1ZXN0KTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VuZCgnUE9TVCcsICcvb3JnYW5pemF0aW9ucy8nICsgaWQgKyAnL3ZlcmlmeS1iYW5rJywgcmVxdWVzdCwgdHJ1ZSwgZmFsc2UpO1xuICAgIH1cblxuICAgIHBvc3RPcmdhbml6YXRpb25DYW5jZWwoaWQ6IHN0cmluZyk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlbmQoJ1BPU1QnLCAnL29yZ2FuaXphdGlvbnMvJyArIGlkICsgJy9jYW5jZWwnLCBudWxsLCB0cnVlLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgcG9zdE9yZ2FuaXphdGlvblJlaW5zdGF0ZShpZDogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VuZCgnUE9TVCcsICcvb3JnYW5pemF0aW9ucy8nICsgaWQgKyAnL3JlaW5zdGF0ZScsIG51bGwsIHRydWUsIGZhbHNlKTtcbiAgICB9XG5cbiAgICBkZWxldGVPcmdhbml6YXRpb24oaWQ6IHN0cmluZywgcmVxdWVzdDogUGFzc3dvcmRWZXJpZmljYXRpb25SZXF1ZXN0KTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VuZCgnREVMRVRFJywgJy9vcmdhbml6YXRpb25zLycgKyBpZCwgcmVxdWVzdCwgdHJ1ZSwgZmFsc2UpO1xuICAgIH1cblxuICAgIGFzeW5jIGdldE9yZ2FuaXphdGlvbktleXMoaWQ6IHN0cmluZyk6IFByb21pc2U8T3JnYW5pemF0aW9uS2V5c1Jlc3BvbnNlPiB7XG4gICAgICAgIGNvbnN0IHIgPSBhd2FpdCB0aGlzLnNlbmQoJ0dFVCcsICcvb3JnYW5pemF0aW9ucy8nICsgaWQgKyAnL2tleXMnLCBudWxsLCB0cnVlLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIG5ldyBPcmdhbml6YXRpb25LZXlzUmVzcG9uc2Uocik7XG4gICAgfVxuXG4gICAgYXN5bmMgcG9zdE9yZ2FuaXphdGlvbktleXMoaWQ6IHN0cmluZywgcmVxdWVzdDogT3JnYW5pemF0aW9uS2V5c1JlcXVlc3QpOiBQcm9taXNlPE9yZ2FuaXphdGlvbktleXNSZXNwb25zZT4ge1xuICAgICAgICBjb25zdCByID0gYXdhaXQgdGhpcy5zZW5kKCdQT1NUJywgJy9vcmdhbml6YXRpb25zLycgKyBpZCArICcva2V5cycsIHJlcXVlc3QsIHRydWUsIHRydWUpO1xuICAgICAgICByZXR1cm4gbmV3IE9yZ2FuaXphdGlvbktleXNSZXNwb25zZShyKTtcbiAgICB9XG5cbiAgICAvLyBQcm92aWRlciBBUElzXG5cbiAgICBhc3luYyBwb3N0UHJvdmlkZXJTZXR1cChpZDogc3RyaW5nLCByZXF1ZXN0OiBQcm92aWRlclNldHVwUmVxdWVzdCkge1xuICAgICAgICBjb25zdCByID0gYXdhaXQgdGhpcy5zZW5kKCdQT1NUJywgJy9wcm92aWRlcnMvJyArIGlkICsgJy9zZXR1cCcsIHJlcXVlc3QsIHRydWUsIHRydWUpO1xuICAgICAgICByZXR1cm4gbmV3IFByb3ZpZGVyUmVzcG9uc2Uocik7XG4gICAgfVxuXG4gICAgYXN5bmMgZ2V0UHJvdmlkZXIoaWQ6IHN0cmluZykge1xuICAgICAgICBjb25zdCByID0gYXdhaXQgdGhpcy5zZW5kKCdHRVQnLCAnL3Byb3ZpZGVycy8nICsgaWQsIG51bGwsIHRydWUsIHRydWUpO1xuICAgICAgICByZXR1cm4gbmV3IFByb3ZpZGVyUmVzcG9uc2Uocik7XG4gICAgfVxuXG4gICAgYXN5bmMgcHV0UHJvdmlkZXIoaWQ6IHN0cmluZywgcmVxdWVzdDogUHJvdmlkZXJVcGRhdGVSZXF1ZXN0KSB7XG4gICAgICAgIGNvbnN0IHIgPSBhd2FpdCB0aGlzLnNlbmQoJ1BVVCcsICcvcHJvdmlkZXJzLycgKyBpZCwgcmVxdWVzdCwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiBuZXcgUHJvdmlkZXJSZXNwb25zZShyKTtcbiAgICB9XG5cbiAgICAvLyBQcm92aWRlciBVc2VyIEFQSXNcblxuICAgIGFzeW5jIGdldFByb3ZpZGVyVXNlcnMocHJvdmlkZXJJZDogc3RyaW5nKTogUHJvbWlzZTxMaXN0UmVzcG9uc2U8UHJvdmlkZXJVc2VyVXNlckRldGFpbHNSZXNwb25zZT4+IHtcbiAgICAgICAgY29uc3QgciA9IGF3YWl0IHRoaXMuc2VuZCgnR0VUJywgJy9wcm92aWRlcnMvJyArIHByb3ZpZGVySWQgKyAnL3VzZXJzJywgbnVsbCwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiBuZXcgTGlzdFJlc3BvbnNlKHIsIFByb3ZpZGVyVXNlclVzZXJEZXRhaWxzUmVzcG9uc2UpO1xuICAgIH1cblxuICAgIGFzeW5jIGdldFByb3ZpZGVyVXNlcihwcm92aWRlcklkOiBzdHJpbmcsIGlkOiBzdHJpbmcpOiBQcm9taXNlPFByb3ZpZGVyVXNlclJlc3BvbnNlPiB7XG4gICAgICAgIGNvbnN0IHIgPSBhd2FpdCB0aGlzLnNlbmQoJ0dFVCcsICcvcHJvdmlkZXJzLycgKyBwcm92aWRlcklkICsgJy91c2Vycy8nICsgaWQsIG51bGwsIHRydWUsIHRydWUpO1xuICAgICAgICByZXR1cm4gbmV3IFByb3ZpZGVyVXNlclJlc3BvbnNlKHIpO1xuICAgIH1cblxuICAgIHBvc3RQcm92aWRlclVzZXJJbnZpdGUocHJvdmlkZXJJZDogc3RyaW5nLCByZXF1ZXN0OiBQcm92aWRlclVzZXJJbnZpdGVSZXF1ZXN0KTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VuZCgnUE9TVCcsICcvcHJvdmlkZXJzLycgKyBwcm92aWRlcklkICsgJy91c2Vycy9pbnZpdGUnLCByZXF1ZXN0LCB0cnVlLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgcG9zdFByb3ZpZGVyVXNlclJlaW52aXRlKHByb3ZpZGVySWQ6IHN0cmluZywgaWQ6IHN0cmluZyk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlbmQoJ1BPU1QnLCAnL3Byb3ZpZGVycy8nICsgcHJvdmlkZXJJZCArICcvdXNlcnMvJyArIGlkICsgJy9yZWludml0ZScsIG51bGwsIHRydWUsIGZhbHNlKTtcbiAgICB9XG5cbiAgICBhc3luYyBwb3N0TWFueVByb3ZpZGVyVXNlclJlaW52aXRlKHByb3ZpZGVySWQ6IHN0cmluZywgcmVxdWVzdDogUHJvdmlkZXJVc2VyQnVsa1JlcXVlc3QpOiBQcm9taXNlPExpc3RSZXNwb25zZTxQcm92aWRlclVzZXJCdWxrUmVzcG9uc2U+PiB7XG4gICAgICAgIGNvbnN0IHIgPSBhd2FpdCB0aGlzLnNlbmQoJ1BPU1QnLCAnL3Byb3ZpZGVycy8nICsgcHJvdmlkZXJJZCArICcvdXNlcnMvcmVpbnZpdGUnLCByZXF1ZXN0LCB0cnVlLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIG5ldyBMaXN0UmVzcG9uc2UociwgUHJvdmlkZXJVc2VyQnVsa1Jlc3BvbnNlKTtcbiAgICB9XG5cbiAgICBhc3luYyBwb3N0UHJvdmlkZXJVc2VyQnVsa0NvbmZpcm0ocHJvdmlkZXJJZDogc3RyaW5nLCByZXF1ZXN0OiBQcm92aWRlclVzZXJCdWxrQ29uZmlybVJlcXVlc3QpOiBQcm9taXNlPExpc3RSZXNwb25zZTxQcm92aWRlclVzZXJCdWxrUmVzcG9uc2U+PiB7XG4gICAgICAgIGNvbnN0IHIgPSBhd2FpdCB0aGlzLnNlbmQoJ1BPU1QnLCAnL3Byb3ZpZGVycy8nICsgcHJvdmlkZXJJZCArICcvdXNlcnMvY29uZmlybScsIHJlcXVlc3QsIHRydWUsIHRydWUpO1xuICAgICAgICByZXR1cm4gbmV3IExpc3RSZXNwb25zZShyLCBQcm92aWRlclVzZXJCdWxrUmVzcG9uc2UpO1xuICAgIH1cblxuICAgIGFzeW5jIGRlbGV0ZU1hbnlQcm92aWRlclVzZXJzKHByb3ZpZGVySWQ6IHN0cmluZywgcmVxdWVzdDogUHJvdmlkZXJVc2VyQnVsa1JlcXVlc3QpOiBQcm9taXNlPExpc3RSZXNwb25zZTxQcm92aWRlclVzZXJCdWxrUmVzcG9uc2U+PiB7XG4gICAgICAgIGNvbnN0IHIgPSBhd2FpdCB0aGlzLnNlbmQoJ0RFTEVURScsICcvcHJvdmlkZXJzLycgKyBwcm92aWRlcklkICsgJy91c2VycycsIHJlcXVlc3QsIHRydWUsIHRydWUpO1xuICAgICAgICByZXR1cm4gbmV3IExpc3RSZXNwb25zZShyLCBQcm92aWRlclVzZXJCdWxrUmVzcG9uc2UpO1xuICAgIH1cblxuICAgIHBvc3RQcm92aWRlclVzZXJBY2NlcHQocHJvdmlkZXJJZDogc3RyaW5nLCBpZDogc3RyaW5nLCByZXF1ZXN0OiBQcm92aWRlclVzZXJBY2NlcHRSZXF1ZXN0KTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VuZCgnUE9TVCcsICcvcHJvdmlkZXJzLycgKyBwcm92aWRlcklkICsgJy91c2Vycy8nICsgaWQgKyAnL2FjY2VwdCcsIHJlcXVlc3QsIHRydWUsIGZhbHNlKTtcbiAgICB9XG5cbiAgICBwb3N0UHJvdmlkZXJVc2VyQ29uZmlybShwcm92aWRlcklkOiBzdHJpbmcsIGlkOiBzdHJpbmcsIHJlcXVlc3Q6IFByb3ZpZGVyVXNlckNvbmZpcm1SZXF1ZXN0KTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VuZCgnUE9TVCcsICcvcHJvdmlkZXJzLycgKyBwcm92aWRlcklkICsgJy91c2Vycy8nICsgaWQgKyAnL2NvbmZpcm0nLFxuICAgICAgICAgICAgcmVxdWVzdCwgdHJ1ZSwgZmFsc2UpO1xuICAgIH1cblxuICAgIGFzeW5jIHBvc3RQcm92aWRlclVzZXJzUHVibGljS2V5KHByb3ZpZGVySWQ6IHN0cmluZywgcmVxdWVzdDogUHJvdmlkZXJVc2VyQnVsa1JlcXVlc3QpOiBQcm9taXNlPExpc3RSZXNwb25zZTxQcm92aWRlclVzZXJCdWxrUHVibGljS2V5UmVzcG9uc2U+PiB7XG4gICAgICAgIGNvbnN0IHIgPSBhd2FpdCB0aGlzLnNlbmQoJ1BPU1QnLCAnL3Byb3ZpZGVycy8nICsgcHJvdmlkZXJJZCArICcvdXNlcnMvcHVibGljLWtleXMnLCByZXF1ZXN0LCB0cnVlLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIG5ldyBMaXN0UmVzcG9uc2UociwgUHJvdmlkZXJVc2VyQnVsa1B1YmxpY0tleVJlc3BvbnNlKTtcbiAgICB9XG5cblxuICAgIHB1dFByb3ZpZGVyVXNlcihwcm92aWRlcklkOiBzdHJpbmcsIGlkOiBzdHJpbmcsIHJlcXVlc3Q6IFByb3ZpZGVyVXNlclVwZGF0ZVJlcXVlc3QpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zZW5kKCdQVVQnLCAnL3Byb3ZpZGVycy8nICsgcHJvdmlkZXJJZCArICcvdXNlcnMvJyArIGlkLCByZXF1ZXN0LCB0cnVlLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgZGVsZXRlUHJvdmlkZXJVc2VyKHByb3ZpZGVySWQ6IHN0cmluZywgaWQ6IHN0cmluZyk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlbmQoJ0RFTEVURScsICcvcHJvdmlkZXJzLycgKyBwcm92aWRlcklkICsgJy91c2Vycy8nICsgaWQsIG51bGwsIHRydWUsIGZhbHNlKTtcbiAgICB9XG5cbiAgICAvLyBQcm92aWRlciBPcmdhbml6YXRpb24gQVBJc1xuXG4gICAgYXN5bmMgZ2V0UHJvdmlkZXJDbGllbnRzKHByb3ZpZGVySWQ6IHN0cmluZyk6IFByb21pc2U8TGlzdFJlc3BvbnNlPFByb3ZpZGVyT3JnYW5pemF0aW9uT3JnYW5pemF0aW9uRGV0YWlsc1Jlc3BvbnNlPj4ge1xuICAgICAgICBjb25zdCByID0gYXdhaXQgdGhpcy5zZW5kKCdHRVQnLCAnL3Byb3ZpZGVycy8nICsgcHJvdmlkZXJJZCArICcvb3JnYW5pemF0aW9ucycsIG51bGwsIHRydWUsIHRydWUpO1xuICAgICAgICByZXR1cm4gbmV3IExpc3RSZXNwb25zZShyLCBQcm92aWRlck9yZ2FuaXphdGlvbk9yZ2FuaXphdGlvbkRldGFpbHNSZXNwb25zZSk7XG4gICAgfVxuXG4gICAgcG9zdFByb3ZpZGVyQWRkT3JnYW5pemF0aW9uKHByb3ZpZGVySWQ6IHN0cmluZywgcmVxdWVzdDogUHJvdmlkZXJBZGRPcmdhbml6YXRpb25SZXF1ZXN0KTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VuZCgnUE9TVCcsICcvcHJvdmlkZXJzLycgKyBwcm92aWRlcklkICsgJy9vcmdhbml6YXRpb25zL2FkZCcsIHJlcXVlc3QsIHRydWUsIGZhbHNlKTtcbiAgICB9XG5cbiAgICBhc3luYyBwb3N0UHJvdmlkZXJDcmVhdGVPcmdhbml6YXRpb24ocHJvdmlkZXJJZDogc3RyaW5nLCByZXF1ZXN0OiBQcm92aWRlck9yZ2FuaXphdGlvbkNyZWF0ZVJlcXVlc3QpOiBQcm9taXNlPFByb3ZpZGVyT3JnYW5pemF0aW9uUmVzcG9uc2U+IHtcbiAgICAgICAgY29uc3QgciA9IGF3YWl0IHRoaXMuc2VuZCgnUE9TVCcsICcvcHJvdmlkZXJzLycgKyBwcm92aWRlcklkICsgJy9vcmdhbml6YXRpb25zJywgcmVxdWVzdCwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiBuZXcgUHJvdmlkZXJPcmdhbml6YXRpb25SZXNwb25zZShyKTtcbiAgICB9XG5cbiAgICBkZWxldGVQcm92aWRlck9yZ2FuaXphdGlvbihwcm92aWRlcklkOiBzdHJpbmcsIGlkOiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zZW5kKCdERUxFVEUnLCAnL3Byb3ZpZGVycy8nICsgcHJvdmlkZXJJZCArICcvb3JnYW5pemF0aW9ucy8nICsgaWQsIG51bGwsIHRydWUsIGZhbHNlKTtcbiAgICB9XG5cbiAgICAvLyBFdmVudCBBUElzXG5cbiAgICBhc3luYyBnZXRFdmVudHMoc3RhcnQ6IHN0cmluZywgZW5kOiBzdHJpbmcsIHRva2VuOiBzdHJpbmcpOiBQcm9taXNlPExpc3RSZXNwb25zZTxFdmVudFJlc3BvbnNlPj4ge1xuICAgICAgICBjb25zdCByID0gYXdhaXQgdGhpcy5zZW5kKCdHRVQnLCB0aGlzLmFkZEV2ZW50UGFyYW1ldGVycygnL2V2ZW50cycsIHN0YXJ0LCBlbmQsIHRva2VuKSwgbnVsbCwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiBuZXcgTGlzdFJlc3BvbnNlKHIsIEV2ZW50UmVzcG9uc2UpO1xuICAgIH1cblxuICAgIGFzeW5jIGdldEV2ZW50c0NpcGhlcihpZDogc3RyaW5nLCBzdGFydDogc3RyaW5nLCBlbmQ6IHN0cmluZyxcbiAgICAgICAgdG9rZW46IHN0cmluZyk6IFByb21pc2U8TGlzdFJlc3BvbnNlPEV2ZW50UmVzcG9uc2U+PiB7XG4gICAgICAgIGNvbnN0IHIgPSBhd2FpdCB0aGlzLnNlbmQoJ0dFVCcsIHRoaXMuYWRkRXZlbnRQYXJhbWV0ZXJzKCcvY2lwaGVycy8nICsgaWQgKyAnL2V2ZW50cycsIHN0YXJ0LCBlbmQsIHRva2VuKSxcbiAgICAgICAgICAgIG51bGwsIHRydWUsIHRydWUpO1xuICAgICAgICByZXR1cm4gbmV3IExpc3RSZXNwb25zZShyLCBFdmVudFJlc3BvbnNlKTtcbiAgICB9XG5cbiAgICBhc3luYyBnZXRFdmVudHNPcmdhbml6YXRpb24oaWQ6IHN0cmluZywgc3RhcnQ6IHN0cmluZywgZW5kOiBzdHJpbmcsXG4gICAgICAgIHRva2VuOiBzdHJpbmcpOiBQcm9taXNlPExpc3RSZXNwb25zZTxFdmVudFJlc3BvbnNlPj4ge1xuICAgICAgICBjb25zdCByID0gYXdhaXQgdGhpcy5zZW5kKCdHRVQnLCB0aGlzLmFkZEV2ZW50UGFyYW1ldGVycygnL29yZ2FuaXphdGlvbnMvJyArIGlkICsgJy9ldmVudHMnLCBzdGFydCwgZW5kLCB0b2tlbiksXG4gICAgICAgICAgICBudWxsLCB0cnVlLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIG5ldyBMaXN0UmVzcG9uc2UociwgRXZlbnRSZXNwb25zZSk7XG4gICAgfVxuXG4gICAgYXN5bmMgZ2V0RXZlbnRzT3JnYW5pemF0aW9uVXNlcihvcmdhbml6YXRpb25JZDogc3RyaW5nLCBpZDogc3RyaW5nLFxuICAgICAgICBzdGFydDogc3RyaW5nLCBlbmQ6IHN0cmluZywgdG9rZW46IHN0cmluZyk6IFByb21pc2U8TGlzdFJlc3BvbnNlPEV2ZW50UmVzcG9uc2U+PiB7XG4gICAgICAgIGNvbnN0IHIgPSBhd2FpdCB0aGlzLnNlbmQoJ0dFVCcsXG4gICAgICAgICAgICB0aGlzLmFkZEV2ZW50UGFyYW1ldGVycygnL29yZ2FuaXphdGlvbnMvJyArIG9yZ2FuaXphdGlvbklkICsgJy91c2Vycy8nICsgaWQgKyAnL2V2ZW50cycsIHN0YXJ0LCBlbmQsIHRva2VuKSxcbiAgICAgICAgICAgIG51bGwsIHRydWUsIHRydWUpO1xuICAgICAgICByZXR1cm4gbmV3IExpc3RSZXNwb25zZShyLCBFdmVudFJlc3BvbnNlKTtcbiAgICB9XG5cbiAgICBhc3luYyBnZXRFdmVudHNQcm92aWRlcihpZDogc3RyaW5nLCBzdGFydDogc3RyaW5nLCBlbmQ6IHN0cmluZywgdG9rZW46IHN0cmluZyk6IFByb21pc2U8TGlzdFJlc3BvbnNlPEV2ZW50UmVzcG9uc2U+PiB7XG4gICAgICAgIGNvbnN0IHIgPSBhd2FpdCB0aGlzLnNlbmQoJ0dFVCcsIHRoaXMuYWRkRXZlbnRQYXJhbWV0ZXJzKCcvcHJvdmlkZXJzLycgKyBpZCArICcvZXZlbnRzJywgc3RhcnQsIGVuZCwgdG9rZW4pLCBudWxsLCB0cnVlLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIG5ldyBMaXN0UmVzcG9uc2UociwgRXZlbnRSZXNwb25zZSk7XG4gICAgfVxuXG4gICAgYXN5bmMgZ2V0RXZlbnRzUHJvdmlkZXJVc2VyKHByb3ZpZGVySWQ6IHN0cmluZywgaWQ6IHN0cmluZyxcbiAgICAgICAgc3RhcnQ6IHN0cmluZywgZW5kOiBzdHJpbmcsIHRva2VuOiBzdHJpbmcpOiBQcm9taXNlPExpc3RSZXNwb25zZTxFdmVudFJlc3BvbnNlPj4ge1xuICAgICAgICBjb25zdCByID0gYXdhaXQgdGhpcy5zZW5kKCdHRVQnLFxuICAgICAgICAgICAgdGhpcy5hZGRFdmVudFBhcmFtZXRlcnMoJy9wcm92aWRlcnMvJyArIHByb3ZpZGVySWQgKyAnL3VzZXJzLycgKyBpZCArICcvZXZlbnRzJywgc3RhcnQsIGVuZCwgdG9rZW4pLFxuICAgICAgICAgICAgbnVsbCwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiBuZXcgTGlzdFJlc3BvbnNlKHIsIEV2ZW50UmVzcG9uc2UpO1xuICAgIH1cblxuICAgIGFzeW5jIHBvc3RFdmVudHNDb2xsZWN0KHJlcXVlc3Q6IEV2ZW50UmVxdWVzdFtdKTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgY29uc3QgYXV0aEhlYWRlciA9IGF3YWl0IHRoaXMuZ2V0QWN0aXZlQmVhcmVyVG9rZW4oKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IG5ldyBIZWFkZXJzKHtcbiAgICAgICAgICAgICdEZXZpY2UtVHlwZSc6IHRoaXMuZGV2aWNlVHlwZSxcbiAgICAgICAgICAgICdBdXRob3JpemF0aW9uJzogJ0JlYXJlciAnICsgYXV0aEhlYWRlcixcbiAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD11dGYtOCcsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAodGhpcy5jdXN0b21Vc2VyQWdlbnQgIT0gbnVsbCkge1xuICAgICAgICAgICAgaGVhZGVycy5zZXQoJ1VzZXItQWdlbnQnLCB0aGlzLmN1c3RvbVVzZXJBZ2VudCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmZldGNoKG5ldyBSZXF1ZXN0KHRoaXMuZW52aXJvbm1lbnRTZXJ2aWNlLmdldEV2ZW50c1VybCgpICsgJy9jb2xsZWN0Jywge1xuICAgICAgICAgICAgY2FjaGU6ICduby1zdG9yZScsXG4gICAgICAgICAgICBjcmVkZW50aWFsczogdGhpcy5nZXRDcmVkZW50aWFscygpLFxuICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShyZXF1ZXN0KSxcbiAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcnMsXG4gICAgICAgIH0pKTtcbiAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyAhPT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoJ0V2ZW50IHBvc3QgZmFpbGVkLicpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gVXNlciBBUElzXG5cbiAgICBhc3luYyBnZXRVc2VyUHVibGljS2V5KGlkOiBzdHJpbmcpOiBQcm9taXNlPFVzZXJLZXlSZXNwb25zZT4ge1xuICAgICAgICBjb25zdCByID0gYXdhaXQgdGhpcy5zZW5kKCdHRVQnLCAnL3VzZXJzLycgKyBpZCArICcvcHVibGljLWtleScsIG51bGwsIHRydWUsIHRydWUpO1xuICAgICAgICByZXR1cm4gbmV3IFVzZXJLZXlSZXNwb25zZShyKTtcbiAgICB9XG5cbiAgICAvLyBISUJQIEFQSXNcblxuICAgIGFzeW5jIGdldEhpYnBCcmVhY2godXNlcm5hbWU6IHN0cmluZyk6IFByb21pc2U8QnJlYWNoQWNjb3VudFJlc3BvbnNlW10+IHtcbiAgICAgICAgY29uc3QgciA9IGF3YWl0IHRoaXMuc2VuZCgnR0VUJywgJy9oaWJwL2JyZWFjaD91c2VybmFtZT0nICsgdXNlcm5hbWUsIG51bGwsIHRydWUsIHRydWUpO1xuICAgICAgICByZXR1cm4gci5tYXAoKGE6IGFueSkgPT4gbmV3IEJyZWFjaEFjY291bnRSZXNwb25zZShhKSk7XG4gICAgfVxuXG4gICAgLy8gTWlzY1xuXG4gICAgYXN5bmMgcG9zdEJpdFBheUludm9pY2UocmVxdWVzdDogQml0UGF5SW52b2ljZVJlcXVlc3QpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBjb25zdCByID0gYXdhaXQgdGhpcy5zZW5kKCdQT1NUJywgJy9iaXRwYXktaW52b2ljZScsIHJlcXVlc3QsIHRydWUsIHRydWUpO1xuICAgICAgICByZXR1cm4gciBhcyBzdHJpbmc7XG4gICAgfVxuXG4gICAgYXN5bmMgcG9zdFNldHVwUGF5bWVudCgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBjb25zdCByID0gYXdhaXQgdGhpcy5zZW5kKCdQT1NUJywgJy9zZXR1cC1wYXltZW50JywgbnVsbCwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiByIGFzIHN0cmluZztcbiAgICB9XG5cbiAgICAvLyBDcnlwdG8gQWdlbnRcblxuICAgIGFzeW5jIGdldFVzZXJLZXlGcm9tQ3J5cHRvQWdlbnQoY3J5cHRvQWdlbnRVcmw6IHN0cmluZyk6IFByb21pc2U8Q3J5cHRvQWdlbnRVc2VyS2V5UmVzcG9uc2U+IHtcbiAgICAgICAgY29uc3QgYXV0aEhlYWRlciA9IGF3YWl0IHRoaXMuZ2V0QWN0aXZlQmVhcmVyVG9rZW4oKTtcblxuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuZmV0Y2gobmV3IFJlcXVlc3QoY3J5cHRvQWdlbnRVcmwgKyAnL3VzZXIta2V5cycsIHtcbiAgICAgICAgICAgIGNhY2hlOiAnbm8tc3RvcmUnLFxuICAgICAgICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICAnQWNjZXB0JzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgICAgICdBdXRob3JpemF0aW9uJzogJ0JlYXJlciAnICsgYXV0aEhlYWRlcixcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KSk7XG5cbiAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyAhPT0gMjAwKSB7XG4gICAgICAgICAgICBjb25zdCBlcnJvciA9IGF3YWl0IHRoaXMuaGFuZGxlRXJyb3IocmVzcG9uc2UsIGZhbHNlLCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvcik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IENyeXB0b0FnZW50VXNlcktleVJlc3BvbnNlKGF3YWl0IHJlc3BvbnNlLmpzb24oKSk7XG4gICAgfVxuXG4gICAgYXN5bmMgcG9zdFVzZXJLZXlUb0NyeXB0b0FnZW50KGNyeXB0b0FnZW50VXJsOiBzdHJpbmcsIHJlcXVlc3Q6IENyeXB0b0FnZW50VXNlcktleVJlcXVlc3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgYXV0aEhlYWRlciA9IGF3YWl0IHRoaXMuZ2V0QWN0aXZlQmVhcmVyVG9rZW4oKTtcblxuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuZmV0Y2gobmV3IFJlcXVlc3QoY3J5cHRvQWdlbnRVcmwgKyAnL3VzZXIta2V5cycsIHtcbiAgICAgICAgICAgIGNhY2hlOiAnbm8tc3RvcmUnLFxuICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgJ0FjY2VwdCc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgICAgICAnQXV0aG9yaXphdGlvbic6ICdCZWFyZXIgJyArIGF1dGhIZWFkZXIsXG4gICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PXV0Zi04JyxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkocmVxdWVzdCksXG4gICAgICAgIH0pKTtcblxuICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzICE9PSAyMDApIHtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gYXdhaXQgdGhpcy5oYW5kbGVFcnJvcihyZXNwb25zZSwgZmFsc2UsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG4gICAgLy8gSGVscGVyc1xuXG4gICAgYXN5bmMgZ2V0QWN0aXZlQmVhcmVyVG9rZW4oKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgbGV0IGFjY2Vzc1Rva2VuID0gYXdhaXQgdGhpcy50b2tlblNlcnZpY2UuZ2V0VG9rZW4oKTtcbiAgICAgICAgaWYgKHRoaXMudG9rZW5TZXJ2aWNlLnRva2VuTmVlZHNSZWZyZXNoKCkpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZG9BdXRoUmVmcmVzaCgpO1xuICAgICAgICAgICAgYWNjZXNzVG9rZW4gPSBhd2FpdCB0aGlzLnRva2VuU2VydmljZS5nZXRUb2tlbigpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhY2Nlc3NUb2tlbjtcbiAgICB9XG5cbiAgICBmZXRjaChyZXF1ZXN0OiBSZXF1ZXN0KTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgICAgICBpZiAocmVxdWVzdC5tZXRob2QgPT09ICdHRVQnKSB7XG4gICAgICAgICAgICByZXF1ZXN0LmhlYWRlcnMuc2V0KCdDYWNoZS1Db250cm9sJywgJ25vLXN0b3JlJyk7XG4gICAgICAgICAgICByZXF1ZXN0LmhlYWRlcnMuc2V0KCdQcmFnbWEnLCAnbm8tY2FjaGUnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5uYXRpdmVGZXRjaChyZXF1ZXN0KTtcbiAgICB9XG5cbiAgICBuYXRpdmVGZXRjaChyZXF1ZXN0OiBSZXF1ZXN0KTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgICAgICByZXR1cm4gZmV0Y2gocmVxdWVzdCk7XG4gICAgfVxuXG4gICAgYXN5bmMgcHJlVmFsaWRhdGVTc28oaWRlbnRpZmllcjogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGlmIChpZGVudGlmaWVyID09IG51bGwgfHwgaWRlbnRpZmllciA9PT0gJycpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignT3JnYW5pemF0aW9uIElkZW50aWZpZXIgd2FzIG5vdCBwcm92aWRlZC4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBoZWFkZXJzID0gbmV3IEhlYWRlcnMoe1xuICAgICAgICAgICAgJ0FjY2VwdCc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgICdEZXZpY2UtVHlwZSc6IHRoaXMuZGV2aWNlVHlwZSxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICh0aGlzLmN1c3RvbVVzZXJBZ2VudCAhPSBudWxsKSB7XG4gICAgICAgICAgICBoZWFkZXJzLnNldCgnVXNlci1BZ2VudCcsIHRoaXMuY3VzdG9tVXNlckFnZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBhdGggPSBgL2FjY291bnQvcHJldmFsaWRhdGU/ZG9tYWluSGludD0ke2VuY29kZVVSSUNvbXBvbmVudChpZGVudGlmaWVyKX1gO1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuZmV0Y2gobmV3IFJlcXVlc3QodGhpcy5lbnZpcm9ubWVudFNlcnZpY2UuZ2V0SWRlbnRpdHlVcmwoKSArIHBhdGgsIHtcbiAgICAgICAgICAgIGNhY2hlOiAnbm8tc3RvcmUnLFxuICAgICAgICAgICAgY3JlZGVudGlhbHM6IHRoaXMuZ2V0Q3JlZGVudGlhbHMoKSxcbiAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcnMsXG4gICAgICAgICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgICB9KSk7XG5cbiAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gYXdhaXQgdGhpcy5oYW5kbGVFcnJvcihyZXNwb25zZSwgZmFsc2UsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBhc3luYyBkb0F1dGhSZWZyZXNoKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCByZWZyZXNoVG9rZW4gPSBhd2FpdCB0aGlzLnRva2VuU2VydmljZS5nZXRSZWZyZXNoVG9rZW4oKTtcbiAgICAgICAgaWYgKHJlZnJlc2hUb2tlbiAhPSBudWxsICYmIHJlZnJlc2hUb2tlbiAhPT0gJycpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRvUmVmcmVzaFRva2VuKCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjbGllbnRJZCA9IGF3YWl0IHRoaXMudG9rZW5TZXJ2aWNlLmdldENsaWVudElkKCk7XG4gICAgICAgIGNvbnN0IGNsaWVudFNlY3JldCA9IGF3YWl0IHRoaXMudG9rZW5TZXJ2aWNlLmdldENsaWVudFNlY3JldCgpO1xuICAgICAgICBpZiAoIVV0aWxzLmlzTnVsbE9yV2hpdGVzcGFjZShjbGllbnRJZCkgJiYgIVV0aWxzLmlzTnVsbE9yV2hpdGVzcGFjZShjbGllbnRTZWNyZXQpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kb0FwaVRva2VuUmVmcmVzaCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgcmVmcmVzaCB0b2tlbiwgbm8gcmVmcmVzaCB0b2tlbiBvciBhcGkga2V5cyBhcmUgc3RvcmVkJyk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGFzeW5jIGRvQXBpVG9rZW5SZWZyZXNoKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBjbGllbnRJZCA9IGF3YWl0IHRoaXMudG9rZW5TZXJ2aWNlLmdldENsaWVudElkKCk7XG4gICAgICAgIGNvbnN0IGNsaWVudFNlY3JldCA9IGF3YWl0IHRoaXMudG9rZW5TZXJ2aWNlLmdldENsaWVudFNlY3JldCgpO1xuICAgICAgICBpZiAoVXRpbHMuaXNOdWxsT3JXaGl0ZXNwYWNlKGNsaWVudElkKSB8fCBVdGlscy5pc051bGxPcldoaXRlc3BhY2UoY2xpZW50U2VjcmV0KSB8fCB0aGlzLmFwaUtleVJlZnJlc2ggPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCk7XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCB0aGlzLmFwaUtleVJlZnJlc2goY2xpZW50SWQsIGNsaWVudFNlY3JldCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGFzeW5jIGRvUmVmcmVzaFRva2VuKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCByZWZyZXNoVG9rZW4gPSBhd2FpdCB0aGlzLnRva2VuU2VydmljZS5nZXRSZWZyZXNoVG9rZW4oKTtcbiAgICAgICAgaWYgKHJlZnJlc2hUb2tlbiA9PSBudWxsIHx8IHJlZnJlc2hUb2tlbiA9PT0gJycpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSBuZXcgSGVhZGVycyh7XG4gICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDsgY2hhcnNldD11dGYtOCcsXG4gICAgICAgICAgICAnQWNjZXB0JzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgJ0RldmljZS1UeXBlJzogdGhpcy5kZXZpY2VUeXBlLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHRoaXMuY3VzdG9tVXNlckFnZW50ICE9IG51bGwpIHtcbiAgICAgICAgICAgIGhlYWRlcnMuc2V0KCdVc2VyLUFnZW50JywgdGhpcy5jdXN0b21Vc2VyQWdlbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGVjb2RlZFRva2VuID0gdGhpcy50b2tlblNlcnZpY2UuZGVjb2RlVG9rZW4oKTtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmZldGNoKG5ldyBSZXF1ZXN0KHRoaXMuZW52aXJvbm1lbnRTZXJ2aWNlLmdldElkZW50aXR5VXJsKCkgKyAnL2Nvbm5lY3QvdG9rZW4nLCB7XG4gICAgICAgICAgICBib2R5OiB0aGlzLnFzU3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICBncmFudF90eXBlOiAncmVmcmVzaF90b2tlbicsXG4gICAgICAgICAgICAgICAgY2xpZW50X2lkOiBkZWNvZGVkVG9rZW4uY2xpZW50X2lkLFxuICAgICAgICAgICAgICAgIHJlZnJlc2hfdG9rZW46IHJlZnJlc2hUb2tlbixcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgY2FjaGU6ICduby1zdG9yZScsXG4gICAgICAgICAgICBjcmVkZW50aWFsczogdGhpcy5nZXRDcmVkZW50aWFscygpLFxuICAgICAgICAgICAgaGVhZGVyczogaGVhZGVycyxcbiAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICB9KSk7XG5cbiAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZUpzb24gPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgICAgICBjb25zdCB0b2tlblJlc3BvbnNlID0gbmV3IElkZW50aXR5VG9rZW5SZXNwb25zZShyZXNwb25zZUpzb24pO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy50b2tlblNlcnZpY2Uuc2V0VG9rZW5zKHRva2VuUmVzcG9uc2UuYWNjZXNzVG9rZW4sIHRva2VuUmVzcG9uc2UucmVmcmVzaFRva2VuLCBudWxsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gYXdhaXQgdGhpcy5oYW5kbGVFcnJvcihyZXNwb25zZSwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBzZW5kKG1ldGhvZDogJ0dFVCcgfCAnUE9TVCcgfCAnUFVUJyB8ICdERUxFVEUnLCBwYXRoOiBzdHJpbmcsIGJvZHk6IGFueSxcbiAgICAgICAgYXV0aGVkOiBib29sZWFuLCBoYXNSZXNwb25zZTogYm9vbGVhbiwgYXBpVXJsPzogc3RyaW5nLFxuICAgICAgICBhbHRlckhlYWRlcnM/OiAoaGVhZGVyczogSGVhZGVycykgPT4gdm9pZCk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIGFwaVVybCA9IFV0aWxzLmlzTnVsbE9yV2hpdGVzcGFjZShhcGlVcmwpID8gdGhpcy5lbnZpcm9ubWVudFNlcnZpY2UuZ2V0QXBpVXJsKCkgOiBhcGlVcmw7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSBuZXcgSGVhZGVycyh7XG4gICAgICAgICAgICAnRGV2aWNlLVR5cGUnOiB0aGlzLmRldmljZVR5cGUsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAodGhpcy5jdXN0b21Vc2VyQWdlbnQgIT0gbnVsbCkge1xuICAgICAgICAgICAgaGVhZGVycy5zZXQoJ1VzZXItQWdlbnQnLCB0aGlzLmN1c3RvbVVzZXJBZ2VudCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXF1ZXN0SW5pdDogUmVxdWVzdEluaXQgPSB7XG4gICAgICAgICAgICBjYWNoZTogJ25vLXN0b3JlJyxcbiAgICAgICAgICAgIGNyZWRlbnRpYWxzOiB0aGlzLmdldENyZWRlbnRpYWxzKCksXG4gICAgICAgICAgICBtZXRob2Q6IG1ldGhvZCxcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoYXV0aGVkKSB7XG4gICAgICAgICAgICBjb25zdCBhdXRoSGVhZGVyID0gYXdhaXQgdGhpcy5nZXRBY3RpdmVCZWFyZXJUb2tlbigpO1xuICAgICAgICAgICAgaGVhZGVycy5zZXQoJ0F1dGhvcml6YXRpb24nLCAnQmVhcmVyICcgKyBhdXRoSGVhZGVyKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYm9keSAhPSBudWxsKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGJvZHkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgcmVxdWVzdEluaXQuYm9keSA9IGJvZHk7XG4gICAgICAgICAgICAgICAgaGVhZGVycy5zZXQoJ0NvbnRlbnQtVHlwZScsICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7IGNoYXJzZXQ9dXRmLTgnKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGJvZHkgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgaWYgKGJvZHkgaW5zdGFuY2VvZiBGb3JtRGF0YSkge1xuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SW5pdC5ib2R5ID0gYm9keTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzLnNldCgnQ29udGVudC1UeXBlJywgJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9dXRmLTgnKTtcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEluaXQuYm9keSA9IEpTT04uc3RyaW5naWZ5KGJvZHkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaGFzUmVzcG9uc2UpIHtcbiAgICAgICAgICAgIGhlYWRlcnMuc2V0KCdBY2NlcHQnLCAnYXBwbGljYXRpb24vanNvbicpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhbHRlckhlYWRlcnMgIT0gbnVsbCkge1xuICAgICAgICAgICAgYWx0ZXJIZWFkZXJzKGhlYWRlcnMpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVxdWVzdEluaXQuaGVhZGVycyA9IGhlYWRlcnM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5mZXRjaChuZXcgUmVxdWVzdChhcGlVcmwgKyBwYXRoLCByZXF1ZXN0SW5pdCkpO1xuXG4gICAgICAgIGlmIChoYXNSZXNwb25zZSAmJiByZXNwb25zZS5zdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VKc29uID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlSnNvbjtcbiAgICAgICAgfSBlbHNlIGlmIChyZXNwb25zZS5zdGF0dXMgIT09IDIwMCkge1xuICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBhd2FpdCB0aGlzLmhhbmRsZUVycm9yKHJlc3BvbnNlLCBmYWxzZSwgYXV0aGVkKTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGhhbmRsZUVycm9yKHJlc3BvbnNlOiBSZXNwb25zZSwgdG9rZW5FcnJvcjogYm9vbGVhbiwgYXV0aGVkOiBib29sZWFuKTogUHJvbWlzZTxFcnJvclJlc3BvbnNlPiB7XG4gICAgICAgIGlmIChhdXRoZWQgJiYgKCh0b2tlbkVycm9yICYmIHJlc3BvbnNlLnN0YXR1cyA9PT0gNDAwKSB8fCByZXNwb25zZS5zdGF0dXMgPT09IDQwMSB8fCByZXNwb25zZS5zdGF0dXMgPT09IDQwMykpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMubG9nb3V0Q2FsbGJhY2sodHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXNwb25zZUpzb246IGFueSA9IG51bGw7XG4gICAgICAgIGlmICh0aGlzLmlzSnNvblJlc3BvbnNlKHJlc3BvbnNlKSkge1xuICAgICAgICAgICAgcmVzcG9uc2VKc29uID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNUZXh0UmVzcG9uc2UocmVzcG9uc2UpKSB7XG4gICAgICAgICAgICByZXNwb25zZUpzb24gPSB7IE1lc3NhZ2U6IGF3YWl0IHJlc3BvbnNlLnRleHQoKSB9O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBFcnJvclJlc3BvbnNlKHJlc3BvbnNlSnNvbiwgcmVzcG9uc2Uuc3RhdHVzLCB0b2tlbkVycm9yKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHFzU3RyaW5naWZ5KHBhcmFtczogYW55KTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHBhcmFtcykubWFwKGtleSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KGtleSkgKyAnPScgKyBlbmNvZGVVUklDb21wb25lbnQocGFyYW1zW2tleV0pO1xuICAgICAgICB9KS5qb2luKCcmJyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRDcmVkZW50aWFscygpOiBSZXF1ZXN0Q3JlZGVudGlhbHMge1xuICAgICAgICBpZiAoIXRoaXMuaXNXZWJDbGllbnQgfHwgdGhpcy5lbnZpcm9ubWVudFNlcnZpY2UuaGFzQmFzZVVybCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gJ2luY2x1ZGUnO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhZGRFdmVudFBhcmFtZXRlcnMoYmFzZTogc3RyaW5nLCBzdGFydDogc3RyaW5nLCBlbmQ6IHN0cmluZywgdG9rZW46IHN0cmluZykge1xuICAgICAgICBpZiAoc3RhcnQgIT0gbnVsbCkge1xuICAgICAgICAgICAgYmFzZSArPSAoJz9zdGFydD0nICsgc3RhcnQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbmQgIT0gbnVsbCkge1xuICAgICAgICAgICAgYmFzZSArPSAoYmFzZS5pbmRleE9mKCc/JykgPiAtMSA/ICcmJyA6ICc/Jyk7XG4gICAgICAgICAgICBiYXNlICs9ICgnZW5kPScgKyBlbmQpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0b2tlbiAhPSBudWxsKSB7XG4gICAgICAgICAgICBiYXNlICs9IChiYXNlLmluZGV4T2YoJz8nKSA+IC0xID8gJyYnIDogJz8nKTtcbiAgICAgICAgICAgIGJhc2UgKz0gKCdjb250aW51YXRpb25Ub2tlbj0nICsgdG9rZW4pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBiYXNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNKc29uUmVzcG9uc2UocmVzcG9uc2U6IFJlc3BvbnNlKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHR5cGVIZWFkZXIgPSByZXNwb25zZS5oZWFkZXJzLmdldCgnY29udGVudC10eXBlJyk7XG4gICAgICAgIHJldHVybiB0eXBlSGVhZGVyICE9IG51bGwgJiYgdHlwZUhlYWRlci5pbmRleE9mKCdhcHBsaWNhdGlvbi9qc29uJykgPiAtMTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzVGV4dFJlc3BvbnNlKHJlc3BvbnNlOiBSZXNwb25zZSk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCB0eXBlSGVhZGVyID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoJ2NvbnRlbnQtdHlwZScpO1xuICAgICAgICByZXR1cm4gdHlwZUhlYWRlciAhPSBudWxsICYmIHR5cGVIZWFkZXIuaW5kZXhPZigndGV4dCcpID4gLTE7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgVXRpbHMgfSBmcm9tICcuLi9taXNjL3V0aWxzJztcblxuaW1wb3J0IHsgQXBwSWRTZXJ2aWNlIGFzIEFwcElkU2VydmljZUFic3RyYWN0aW9uIH0gZnJvbSAnLi4vYWJzdHJhY3Rpb25zL2FwcElkLnNlcnZpY2UnO1xuaW1wb3J0IHsgU3RvcmFnZVNlcnZpY2UgfSBmcm9tICcuLi9hYnN0cmFjdGlvbnMvc3RvcmFnZS5zZXJ2aWNlJztcblxuZXhwb3J0IGNsYXNzIEFwcElkU2VydmljZSBpbXBsZW1lbnRzIEFwcElkU2VydmljZUFic3RyYWN0aW9uIHtcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHN0b3JhZ2VTZXJ2aWNlOiBTdG9yYWdlU2VydmljZSkge1xuICAgIH1cblxuICAgIGdldEFwcElkKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIHJldHVybiB0aGlzLm1ha2VBbmRHZXRBcHBJZCgnYXBwSWQnKTtcbiAgICB9XG5cbiAgICBnZXRBbm9ueW1vdXNBcHBJZCgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICByZXR1cm4gdGhpcy5tYWtlQW5kR2V0QXBwSWQoJ2Fub255bW91c0FwcElkJyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBtYWtlQW5kR2V0QXBwSWQoa2V5OiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgZXhpc3RpbmdJZCA9IGF3YWl0IHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0PHN0cmluZz4oa2V5KTtcbiAgICAgICAgaWYgKGV4aXN0aW5nSWQgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGV4aXN0aW5nSWQ7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBndWlkID0gVXRpbHMubmV3R3VpZCgpO1xuICAgICAgICBhd2FpdCB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNhdmUoa2V5LCBndWlkKTtcbiAgICAgICAgcmV0dXJuIGd1aWQ7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgQXBpU2VydmljZSB9IGZyb20gJy4uL2Fic3RyYWN0aW9ucy9hcGkuc2VydmljZSc7XG5pbXBvcnQgeyBBdWRpdFNlcnZpY2UgYXMgQXVkaXRTZXJ2aWNlQWJzdHJhY3Rpb24gfSBmcm9tICcuLi9hYnN0cmFjdGlvbnMvYXVkaXQuc2VydmljZSc7XG5pbXBvcnQgeyBDcnlwdG9GdW5jdGlvblNlcnZpY2UgfSBmcm9tICcuLi9hYnN0cmFjdGlvbnMvY3J5cHRvRnVuY3Rpb24uc2VydmljZSc7XG5cbmltcG9ydCB7IHRocm90dGxlIH0gZnJvbSAnLi4vbWlzYy90aHJvdHRsZSc7XG5pbXBvcnQgeyBVdGlscyB9IGZyb20gJy4uL21pc2MvdXRpbHMnO1xuXG5pbXBvcnQgeyBCcmVhY2hBY2NvdW50UmVzcG9uc2UgfSBmcm9tICcuLi9tb2RlbHMvcmVzcG9uc2UvYnJlYWNoQWNjb3VudFJlc3BvbnNlJztcbmltcG9ydCB7IEVycm9yUmVzcG9uc2UgfSBmcm9tICcuLi9tb2RlbHMvcmVzcG9uc2UvZXJyb3JSZXNwb25zZSc7XG5cbmNvbnN0IFB3bmVkUGFzc3dvcmRzQXBpID0gJ2h0dHBzOi8vYXBpLnB3bmVkcGFzc3dvcmRzLmNvbS9yYW5nZS8nO1xuXG5leHBvcnQgY2xhc3MgQXVkaXRTZXJ2aWNlIGltcGxlbWVudHMgQXVkaXRTZXJ2aWNlQWJzdHJhY3Rpb24ge1xuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgY3J5cHRvRnVuY3Rpb25TZXJ2aWNlOiBDcnlwdG9GdW5jdGlvblNlcnZpY2UsIHByaXZhdGUgYXBpU2VydmljZTogQXBpU2VydmljZSkgeyB9XG5cbiAgICBAdGhyb3R0bGUoMTAwLCAoKSA9PiAncGFzc3dvcmRMZWFrZWQnKVxuICAgIGFzeW5jIHBhc3N3b3JkTGVha2VkKHBhc3N3b3JkOiBzdHJpbmcpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgICAgICBjb25zdCBoYXNoQnl0ZXMgPSBhd2FpdCB0aGlzLmNyeXB0b0Z1bmN0aW9uU2VydmljZS5oYXNoKHBhc3N3b3JkLCAnc2hhMScpO1xuICAgICAgICBjb25zdCBoYXNoID0gVXRpbHMuZnJvbUJ1ZmZlclRvSGV4KGhhc2hCeXRlcykudG9VcHBlckNhc2UoKTtcbiAgICAgICAgY29uc3QgaGFzaFN0YXJ0ID0gaGFzaC5zdWJzdHIoMCwgNSk7XG4gICAgICAgIGNvbnN0IGhhc2hFbmRpbmcgPSBoYXNoLnN1YnN0cig1KTtcblxuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuYXBpU2VydmljZS5uYXRpdmVGZXRjaChuZXcgUmVxdWVzdChQd25lZFBhc3N3b3Jkc0FwaSArIGhhc2hTdGFydCkpO1xuICAgICAgICBjb25zdCBsZWFrZWRIYXNoZXMgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7XG4gICAgICAgIGNvbnN0IG1hdGNoID0gbGVha2VkSGFzaGVzLnNwbGl0KC9cXHI/XFxuLykuZmluZCh2ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB2LnNwbGl0KCc6JylbMF0gPT09IGhhc2hFbmRpbmc7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBtYXRjaCAhPSBudWxsID8gcGFyc2VJbnQobWF0Y2guc3BsaXQoJzonKVsxXSwgMTApIDogMDtcbiAgICB9XG5cbiAgICBhc3luYyBicmVhY2hlZEFjY291bnRzKHVzZXJuYW1lOiBzdHJpbmcpOiBQcm9taXNlPEJyZWFjaEFjY291bnRSZXNwb25zZVtdPiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5hcGlTZXJ2aWNlLmdldEhpYnBCcmVhY2godXNlcm5hbWUpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zdCBlcnJvciA9IGUgYXMgRXJyb3JSZXNwb25zZTtcbiAgICAgICAgICAgIGlmIChlcnJvci5zdGF0dXNDb2RlID09PSA0MDQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCB7IEhhc2hQdXJwb3NlIH0gZnJvbSAnLi4vZW51bXMvaGFzaFB1cnBvc2UnO1xuaW1wb3J0IHsgS2RmVHlwZSB9IGZyb20gJy4uL2VudW1zL2tkZlR5cGUnO1xuaW1wb3J0IHsgVHdvRmFjdG9yUHJvdmlkZXJUeXBlIH0gZnJvbSAnLi4vZW51bXMvdHdvRmFjdG9yUHJvdmlkZXJUeXBlJztcblxuaW1wb3J0IHsgQXV0aFJlc3VsdCB9IGZyb20gJy4uL21vZGVscy9kb21haW4vYXV0aFJlc3VsdCc7XG5pbXBvcnQgeyBTeW1tZXRyaWNDcnlwdG9LZXkgfSBmcm9tICcuLi9tb2RlbHMvZG9tYWluL3N5bW1ldHJpY0NyeXB0b0tleSc7XG5cbmltcG9ydCB7IFNldENyeXB0b0FnZW50S2V5UmVxdWVzdCB9IGZyb20gJy4uL21vZGVscy9yZXF1ZXN0L2FjY291bnQvc2V0Q3J5cHRvQWdlbnRLZXlSZXF1ZXN0JztcbmltcG9ydCB7IENyeXB0b0FnZW50VXNlcktleVJlcXVlc3QgfSBmcm9tICcuLi9tb2RlbHMvcmVxdWVzdC9jcnlwdG9BZ2VudFVzZXJLZXlSZXF1ZXN0JztcbmltcG9ydCB7IERldmljZVJlcXVlc3QgfSBmcm9tICcuLi9tb2RlbHMvcmVxdWVzdC9kZXZpY2VSZXF1ZXN0JztcbmltcG9ydCB7IEtleXNSZXF1ZXN0IH0gZnJvbSAnLi4vbW9kZWxzL3JlcXVlc3Qva2V5c1JlcXVlc3QnO1xuaW1wb3J0IHsgUHJlbG9naW5SZXF1ZXN0IH0gZnJvbSAnLi4vbW9kZWxzL3JlcXVlc3QvcHJlbG9naW5SZXF1ZXN0JztcbmltcG9ydCB7IFRva2VuUmVxdWVzdCB9IGZyb20gJy4uL21vZGVscy9yZXF1ZXN0L3Rva2VuUmVxdWVzdCc7XG5cbmltcG9ydCB7IElkZW50aXR5VG9rZW5SZXNwb25zZSB9IGZyb20gJy4uL21vZGVscy9yZXNwb25zZS9pZGVudGl0eVRva2VuUmVzcG9uc2UnO1xuaW1wb3J0IHsgSWRlbnRpdHlUd29GYWN0b3JSZXNwb25zZSB9IGZyb20gJy4uL21vZGVscy9yZXNwb25zZS9pZGVudGl0eVR3b0ZhY3RvclJlc3BvbnNlJztcblxuaW1wb3J0IHsgQXBpU2VydmljZSB9IGZyb20gJy4uL2Fic3RyYWN0aW9ucy9hcGkuc2VydmljZSc7XG5pbXBvcnQgeyBBcHBJZFNlcnZpY2UgfSBmcm9tICcuLi9hYnN0cmFjdGlvbnMvYXBwSWQuc2VydmljZSc7XG5pbXBvcnQgeyBBdXRoU2VydmljZSBhcyBBdXRoU2VydmljZUFic3RyYWN0aW9uIH0gZnJvbSAnLi4vYWJzdHJhY3Rpb25zL2F1dGguc2VydmljZSc7XG5pbXBvcnQgeyBDcnlwdG9TZXJ2aWNlIH0gZnJvbSAnLi4vYWJzdHJhY3Rpb25zL2NyeXB0by5zZXJ2aWNlJztcbmltcG9ydCB7IENyeXB0b0Z1bmN0aW9uU2VydmljZSB9IGZyb20gJy4uL2Fic3RyYWN0aW9ucy9jcnlwdG9GdW5jdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IEkxOG5TZXJ2aWNlIH0gZnJvbSAnLi4vYWJzdHJhY3Rpb25zL2kxOG4uc2VydmljZSc7XG5pbXBvcnQgeyBMb2dTZXJ2aWNlIH0gZnJvbSAnLi4vYWJzdHJhY3Rpb25zL2xvZy5zZXJ2aWNlJztcbmltcG9ydCB7IE1lc3NhZ2luZ1NlcnZpY2UgfSBmcm9tICcuLi9hYnN0cmFjdGlvbnMvbWVzc2FnaW5nLnNlcnZpY2UnO1xuaW1wb3J0IHsgUGxhdGZvcm1VdGlsc1NlcnZpY2UgfSBmcm9tICcuLi9hYnN0cmFjdGlvbnMvcGxhdGZvcm1VdGlscy5zZXJ2aWNlJztcbmltcG9ydCB7IFRva2VuU2VydmljZSB9IGZyb20gJy4uL2Fic3RyYWN0aW9ucy90b2tlbi5zZXJ2aWNlJztcbmltcG9ydCB7IFVzZXJTZXJ2aWNlIH0gZnJvbSAnLi4vYWJzdHJhY3Rpb25zL3VzZXIuc2VydmljZSc7XG5pbXBvcnQgeyBWYXVsdFRpbWVvdXRTZXJ2aWNlIH0gZnJvbSAnLi4vYWJzdHJhY3Rpb25zL3ZhdWx0VGltZW91dC5zZXJ2aWNlJztcblxuaW1wb3J0IHsgVXRpbHMgfSBmcm9tICcuLi9taXNjL3V0aWxzJztcblxuZXhwb3J0IGNvbnN0IFR3b0ZhY3RvclByb3ZpZGVycyA9IHtcbiAgICBbVHdvRmFjdG9yUHJvdmlkZXJUeXBlLkF1dGhlbnRpY2F0b3JdOiB7XG4gICAgICAgIHR5cGU6IFR3b0ZhY3RvclByb3ZpZGVyVHlwZS5BdXRoZW50aWNhdG9yLFxuICAgICAgICBuYW1lOiBudWxsIGFzIHN0cmluZyxcbiAgICAgICAgZGVzY3JpcHRpb246IG51bGwgYXMgc3RyaW5nLFxuICAgICAgICBwcmlvcml0eTogMSxcbiAgICAgICAgc29ydDogMSxcbiAgICAgICAgcHJlbWl1bTogZmFsc2UsXG4gICAgfSxcbiAgICBbVHdvRmFjdG9yUHJvdmlkZXJUeXBlLll1YmlrZXldOiB7XG4gICAgICAgIHR5cGU6IFR3b0ZhY3RvclByb3ZpZGVyVHlwZS5ZdWJpa2V5LFxuICAgICAgICBuYW1lOiBudWxsIGFzIHN0cmluZyxcbiAgICAgICAgZGVzY3JpcHRpb246IG51bGwgYXMgc3RyaW5nLFxuICAgICAgICBwcmlvcml0eTogMyxcbiAgICAgICAgc29ydDogMixcbiAgICAgICAgcHJlbWl1bTogdHJ1ZSxcbiAgICB9LFxuICAgIFtUd29GYWN0b3JQcm92aWRlclR5cGUuRHVvXToge1xuICAgICAgICB0eXBlOiBUd29GYWN0b3JQcm92aWRlclR5cGUuRHVvLFxuICAgICAgICBuYW1lOiAnRHVvJyxcbiAgICAgICAgZGVzY3JpcHRpb246IG51bGwgYXMgc3RyaW5nLFxuICAgICAgICBwcmlvcml0eTogMixcbiAgICAgICAgc29ydDogMyxcbiAgICAgICAgcHJlbWl1bTogdHJ1ZSxcbiAgICB9LFxuICAgIFtUd29GYWN0b3JQcm92aWRlclR5cGUuT3JnYW5pemF0aW9uRHVvXToge1xuICAgICAgICB0eXBlOiBUd29GYWN0b3JQcm92aWRlclR5cGUuT3JnYW5pemF0aW9uRHVvLFxuICAgICAgICBuYW1lOiAnRHVvIChPcmdhbml6YXRpb24pJyxcbiAgICAgICAgZGVzY3JpcHRpb246IG51bGwgYXMgc3RyaW5nLFxuICAgICAgICBwcmlvcml0eTogMTAsXG4gICAgICAgIHNvcnQ6IDQsXG4gICAgICAgIHByZW1pdW06IGZhbHNlLFxuICAgIH0sXG4gICAgW1R3b0ZhY3RvclByb3ZpZGVyVHlwZS5FbWFpbF06IHtcbiAgICAgICAgdHlwZTogVHdvRmFjdG9yUHJvdmlkZXJUeXBlLkVtYWlsLFxuICAgICAgICBuYW1lOiBudWxsIGFzIHN0cmluZyxcbiAgICAgICAgZGVzY3JpcHRpb246IG51bGwgYXMgc3RyaW5nLFxuICAgICAgICBwcmlvcml0eTogMCxcbiAgICAgICAgc29ydDogNixcbiAgICAgICAgcHJlbWl1bTogZmFsc2UsXG4gICAgfSxcbiAgICBbVHdvRmFjdG9yUHJvdmlkZXJUeXBlLldlYkF1dGhuXToge1xuICAgICAgICB0eXBlOiBUd29GYWN0b3JQcm92aWRlclR5cGUuV2ViQXV0aG4sXG4gICAgICAgIG5hbWU6IG51bGwgYXMgc3RyaW5nLFxuICAgICAgICBkZXNjcmlwdGlvbjogbnVsbCBhcyBzdHJpbmcsXG4gICAgICAgIHByaW9yaXR5OiA0LFxuICAgICAgICBzb3J0OiA1LFxuICAgICAgICBwcmVtaXVtOiB0cnVlLFxuICAgIH0sXG59O1xuXG5leHBvcnQgY2xhc3MgQXV0aFNlcnZpY2UgaW1wbGVtZW50cyBBdXRoU2VydmljZUFic3RyYWN0aW9uIHtcbiAgICBlbWFpbDogc3RyaW5nO1xuICAgIG1hc3RlclBhc3N3b3JkSGFzaDogc3RyaW5nO1xuICAgIGxvY2FsTWFzdGVyUGFzc3dvcmRIYXNoOiBzdHJpbmc7XG4gICAgY29kZTogc3RyaW5nO1xuICAgIGNvZGVWZXJpZmllcjogc3RyaW5nO1xuICAgIHNzb1JlZGlyZWN0VXJsOiBzdHJpbmc7XG4gICAgY2xpZW50SWQ6IHN0cmluZztcbiAgICBjbGllbnRTZWNyZXQ6IHN0cmluZztcbiAgICB0d29GYWN0b3JQcm92aWRlcnNEYXRhOiBNYXA8VHdvRmFjdG9yUHJvdmlkZXJUeXBlLCB7IFtrZXk6IHN0cmluZ106IHN0cmluZzsgfT47XG4gICAgc2VsZWN0ZWRUd29GYWN0b3JQcm92aWRlclR5cGU6IFR3b0ZhY3RvclByb3ZpZGVyVHlwZSA9IG51bGw7XG4gICAgY2FwdGNoYVRva2VuOiBzdHJpbmc7XG5cbiAgICBwcml2YXRlIGtleTogU3ltbWV0cmljQ3J5cHRvS2V5O1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBjcnlwdG9TZXJ2aWNlOiBDcnlwdG9TZXJ2aWNlLCBwcm90ZWN0ZWQgYXBpU2VydmljZTogQXBpU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSB1c2VyU2VydmljZTogVXNlclNlcnZpY2UsIHByb3RlY3RlZCB0b2tlblNlcnZpY2U6IFRva2VuU2VydmljZSxcbiAgICAgICAgcHJvdGVjdGVkIGFwcElkU2VydmljZTogQXBwSWRTZXJ2aWNlLCBwcml2YXRlIGkxOG5TZXJ2aWNlOiBJMThuU2VydmljZSxcbiAgICAgICAgcHJvdGVjdGVkIHBsYXRmb3JtVXRpbHNTZXJ2aWNlOiBQbGF0Zm9ybVV0aWxzU2VydmljZSwgcHJpdmF0ZSBtZXNzYWdpbmdTZXJ2aWNlOiBNZXNzYWdpbmdTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHZhdWx0VGltZW91dFNlcnZpY2U6IFZhdWx0VGltZW91dFNlcnZpY2UsIHByaXZhdGUgbG9nU2VydmljZTogTG9nU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBjcnlwdG9GdW5jdGlvblNlcnZpY2U6IENyeXB0b0Z1bmN0aW9uU2VydmljZSwgcHJpdmF0ZSBzZXRDcnlwdG9LZXlzID0gdHJ1ZSkge1xuICAgIH1cblxuICAgIGluaXQoKSB7XG4gICAgICAgIFR3b0ZhY3RvclByb3ZpZGVyc1tUd29GYWN0b3JQcm92aWRlclR5cGUuRW1haWxdLm5hbWUgPSB0aGlzLmkxOG5TZXJ2aWNlLnQoJ2VtYWlsVGl0bGUnKTtcbiAgICAgICAgVHdvRmFjdG9yUHJvdmlkZXJzW1R3b0ZhY3RvclByb3ZpZGVyVHlwZS5FbWFpbF0uZGVzY3JpcHRpb24gPSB0aGlzLmkxOG5TZXJ2aWNlLnQoJ2VtYWlsRGVzYycpO1xuXG4gICAgICAgIFR3b0ZhY3RvclByb3ZpZGVyc1tUd29GYWN0b3JQcm92aWRlclR5cGUuQXV0aGVudGljYXRvcl0ubmFtZSA9IHRoaXMuaTE4blNlcnZpY2UudCgnYXV0aGVudGljYXRvckFwcFRpdGxlJyk7XG4gICAgICAgIFR3b0ZhY3RvclByb3ZpZGVyc1tUd29GYWN0b3JQcm92aWRlclR5cGUuQXV0aGVudGljYXRvcl0uZGVzY3JpcHRpb24gPVxuICAgICAgICAgICAgdGhpcy5pMThuU2VydmljZS50KCdhdXRoZW50aWNhdG9yQXBwRGVzYycpO1xuXG4gICAgICAgIFR3b0ZhY3RvclByb3ZpZGVyc1tUd29GYWN0b3JQcm92aWRlclR5cGUuRHVvXS5kZXNjcmlwdGlvbiA9IHRoaXMuaTE4blNlcnZpY2UudCgnZHVvRGVzYycpO1xuXG4gICAgICAgIFR3b0ZhY3RvclByb3ZpZGVyc1tUd29GYWN0b3JQcm92aWRlclR5cGUuT3JnYW5pemF0aW9uRHVvXS5uYW1lID1cbiAgICAgICAgICAgICdEdW8gKCcgKyB0aGlzLmkxOG5TZXJ2aWNlLnQoJ29yZ2FuaXphdGlvbicpICsgJyknO1xuICAgICAgICBUd29GYWN0b3JQcm92aWRlcnNbVHdvRmFjdG9yUHJvdmlkZXJUeXBlLk9yZ2FuaXphdGlvbkR1b10uZGVzY3JpcHRpb24gPVxuICAgICAgICAgICAgdGhpcy5pMThuU2VydmljZS50KCdkdW9Pcmdhbml6YXRpb25EZXNjJyk7XG5cbiAgICAgICAgVHdvRmFjdG9yUHJvdmlkZXJzW1R3b0ZhY3RvclByb3ZpZGVyVHlwZS5XZWJBdXRobl0ubmFtZSA9IHRoaXMuaTE4blNlcnZpY2UudCgnd2ViQXV0aG5UaXRsZScpO1xuICAgICAgICBUd29GYWN0b3JQcm92aWRlcnNbVHdvRmFjdG9yUHJvdmlkZXJUeXBlLldlYkF1dGhuXS5kZXNjcmlwdGlvbiA9IHRoaXMuaTE4blNlcnZpY2UudCgnd2ViQXV0aG5EZXNjJyk7XG5cbiAgICAgICAgVHdvRmFjdG9yUHJvdmlkZXJzW1R3b0ZhY3RvclByb3ZpZGVyVHlwZS5ZdWJpa2V5XS5uYW1lID0gdGhpcy5pMThuU2VydmljZS50KCd5dWJpS2V5VGl0bGUnKTtcbiAgICAgICAgVHdvRmFjdG9yUHJvdmlkZXJzW1R3b0ZhY3RvclByb3ZpZGVyVHlwZS5ZdWJpa2V5XS5kZXNjcmlwdGlvbiA9IHRoaXMuaTE4blNlcnZpY2UudCgneXViaUtleURlc2MnKTtcbiAgICB9XG5cbiAgICBhc3luYyBsb2dJbihlbWFpbDogc3RyaW5nLCBtYXN0ZXJQYXNzd29yZDogc3RyaW5nLCBjYXB0Y2hhVG9rZW4/OiBzdHJpbmcpOiBQcm9taXNlPEF1dGhSZXN1bHQ+IHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFR3b0ZhY3RvclByb3ZpZGVyVHlwZSA9IG51bGw7XG4gICAgICAgIGNvbnN0IGtleSA9IGF3YWl0IHRoaXMubWFrZVByZWxvZ2luS2V5KG1hc3RlclBhc3N3b3JkLCBlbWFpbCk7XG4gICAgICAgIGNvbnN0IGhhc2hlZFBhc3N3b3JkID0gYXdhaXQgdGhpcy5jcnlwdG9TZXJ2aWNlLmhhc2hQYXNzd29yZChtYXN0ZXJQYXNzd29yZCwga2V5KTtcbiAgICAgICAgY29uc3QgbG9jYWxIYXNoZWRQYXNzd29yZCA9IGF3YWl0IHRoaXMuY3J5cHRvU2VydmljZS5oYXNoUGFzc3dvcmQobWFzdGVyUGFzc3dvcmQsIGtleSxcbiAgICAgICAgICAgIEhhc2hQdXJwb3NlLkxvY2FsQXV0aG9yaXphdGlvbik7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmxvZ0luSGVscGVyKGVtYWlsLCBoYXNoZWRQYXNzd29yZCwgbG9jYWxIYXNoZWRQYXNzd29yZCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCxcbiAgICAgICAgICAgIGtleSwgbnVsbCwgbnVsbCwgbnVsbCwgY2FwdGNoYVRva2VuLCBudWxsKTtcbiAgICB9XG5cbiAgICBhc3luYyBsb2dJblNzbyhjb2RlOiBzdHJpbmcsIGNvZGVWZXJpZmllcjogc3RyaW5nLCByZWRpcmVjdFVybDogc3RyaW5nLCBvcmdJZDogc3RyaW5nKTogUHJvbWlzZTxBdXRoUmVzdWx0PiB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRUd29GYWN0b3JQcm92aWRlclR5cGUgPSBudWxsO1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5sb2dJbkhlbHBlcihudWxsLCBudWxsLCBudWxsLCBjb2RlLCBjb2RlVmVyaWZpZXIsIHJlZGlyZWN0VXJsLCBudWxsLCBudWxsLFxuICAgICAgICAgICAgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgb3JnSWQpO1xuICAgIH1cblxuICAgIGFzeW5jIGxvZ0luQXBpS2V5KGNsaWVudElkOiBzdHJpbmcsIGNsaWVudFNlY3JldDogc3RyaW5nKTogUHJvbWlzZTxBdXRoUmVzdWx0PiB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRUd29GYWN0b3JQcm92aWRlclR5cGUgPSBudWxsO1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5sb2dJbkhlbHBlcihudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBjbGllbnRJZCwgY2xpZW50U2VjcmV0LFxuICAgICAgICAgICAgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7XG4gICAgfVxuXG4gICAgYXN5bmMgbG9nSW5Ud29GYWN0b3IodHdvRmFjdG9yUHJvdmlkZXI6IFR3b0ZhY3RvclByb3ZpZGVyVHlwZSwgdHdvRmFjdG9yVG9rZW46IHN0cmluZyxcbiAgICAgICAgcmVtZW1iZXI/OiBib29sZWFuKTogUHJvbWlzZTxBdXRoUmVzdWx0PiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmxvZ0luSGVscGVyKHRoaXMuZW1haWwsIHRoaXMubWFzdGVyUGFzc3dvcmRIYXNoLCB0aGlzLmxvY2FsTWFzdGVyUGFzc3dvcmRIYXNoLCB0aGlzLmNvZGUsXG4gICAgICAgICAgICB0aGlzLmNvZGVWZXJpZmllciwgdGhpcy5zc29SZWRpcmVjdFVybCwgdGhpcy5jbGllbnRJZCwgdGhpcy5jbGllbnRTZWNyZXQsIHRoaXMua2V5LCB0d29GYWN0b3JQcm92aWRlcixcbiAgICAgICAgICAgIHR3b0ZhY3RvclRva2VuLCByZW1lbWJlciwgdGhpcy5jYXB0Y2hhVG9rZW4sIG51bGwpO1xuICAgIH1cblxuICAgIGFzeW5jIGxvZ0luQ29tcGxldGUoZW1haWw6IHN0cmluZywgbWFzdGVyUGFzc3dvcmQ6IHN0cmluZywgdHdvRmFjdG9yUHJvdmlkZXI6IFR3b0ZhY3RvclByb3ZpZGVyVHlwZSxcbiAgICAgICAgdHdvRmFjdG9yVG9rZW46IHN0cmluZywgcmVtZW1iZXI/OiBib29sZWFuLCBjYXB0Y2hhVG9rZW4/OiBzdHJpbmcpOiBQcm9taXNlPEF1dGhSZXN1bHQ+IHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFR3b0ZhY3RvclByb3ZpZGVyVHlwZSA9IG51bGw7XG4gICAgICAgIGNvbnN0IGtleSA9IGF3YWl0IHRoaXMubWFrZVByZWxvZ2luS2V5KG1hc3RlclBhc3N3b3JkLCBlbWFpbCk7XG4gICAgICAgIGNvbnN0IGhhc2hlZFBhc3N3b3JkID0gYXdhaXQgdGhpcy5jcnlwdG9TZXJ2aWNlLmhhc2hQYXNzd29yZChtYXN0ZXJQYXNzd29yZCwga2V5KTtcbiAgICAgICAgY29uc3QgbG9jYWxIYXNoZWRQYXNzd29yZCA9IGF3YWl0IHRoaXMuY3J5cHRvU2VydmljZS5oYXNoUGFzc3dvcmQobWFzdGVyUGFzc3dvcmQsIGtleSxcbiAgICAgICAgICAgIEhhc2hQdXJwb3NlLkxvY2FsQXV0aG9yaXphdGlvbik7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmxvZ0luSGVscGVyKGVtYWlsLCBoYXNoZWRQYXNzd29yZCwgbG9jYWxIYXNoZWRQYXNzd29yZCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwga2V5LFxuICAgICAgICAgICAgdHdvRmFjdG9yUHJvdmlkZXIsIHR3b0ZhY3RvclRva2VuLCByZW1lbWJlciwgY2FwdGNoYVRva2VuLCBudWxsKTtcbiAgICB9XG5cbiAgICBhc3luYyBsb2dJblNzb0NvbXBsZXRlKGNvZGU6IHN0cmluZywgY29kZVZlcmlmaWVyOiBzdHJpbmcsIHJlZGlyZWN0VXJsOiBzdHJpbmcsXG4gICAgICAgIHR3b0ZhY3RvclByb3ZpZGVyOiBUd29GYWN0b3JQcm92aWRlclR5cGUsIHR3b0ZhY3RvclRva2VuOiBzdHJpbmcsIHJlbWVtYmVyPzogYm9vbGVhbik6IFByb21pc2U8QXV0aFJlc3VsdD4ge1xuICAgICAgICB0aGlzLnNlbGVjdGVkVHdvRmFjdG9yUHJvdmlkZXJUeXBlID0gbnVsbDtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMubG9nSW5IZWxwZXIobnVsbCwgbnVsbCwgbnVsbCwgY29kZSwgY29kZVZlcmlmaWVyLCByZWRpcmVjdFVybCwgbnVsbCxcbiAgICAgICAgICAgIG51bGwsIG51bGwsIHR3b0ZhY3RvclByb3ZpZGVyLCB0d29GYWN0b3JUb2tlbiwgcmVtZW1iZXIsIG51bGwsIG51bGwpO1xuICAgIH1cblxuICAgIGFzeW5jIGxvZ0luQXBpS2V5Q29tcGxldGUoY2xpZW50SWQ6IHN0cmluZywgY2xpZW50U2VjcmV0OiBzdHJpbmcsIHR3b0ZhY3RvclByb3ZpZGVyOiBUd29GYWN0b3JQcm92aWRlclR5cGUsXG4gICAgICAgIHR3b0ZhY3RvclRva2VuOiBzdHJpbmcsIHJlbWVtYmVyPzogYm9vbGVhbik6IFByb21pc2U8QXV0aFJlc3VsdD4ge1xuICAgICAgICB0aGlzLnNlbGVjdGVkVHdvRmFjdG9yUHJvdmlkZXJUeXBlID0gbnVsbDtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMubG9nSW5IZWxwZXIobnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgY2xpZW50SWQsIGNsaWVudFNlY3JldCwgbnVsbCxcbiAgICAgICAgICAgIHR3b0ZhY3RvclByb3ZpZGVyLCB0d29GYWN0b3JUb2tlbiwgcmVtZW1iZXIsIG51bGwsIG51bGwpO1xuICAgIH1cblxuICAgIGxvZ091dChjYWxsYmFjazogRnVuY3Rpb24pIHtcbiAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgdGhpcy5tZXNzYWdpbmdTZXJ2aWNlLnNlbmQoJ2xvZ2dlZE91dCcpO1xuICAgIH1cblxuICAgIGdldFN1cHBvcnRlZFR3b0ZhY3RvclByb3ZpZGVycyh3aW46IFdpbmRvdyk6IGFueVtdIHtcbiAgICAgICAgY29uc3QgcHJvdmlkZXJzOiBhbnlbXSA9IFtdO1xuICAgICAgICBpZiAodGhpcy50d29GYWN0b3JQcm92aWRlcnNEYXRhID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBwcm92aWRlcnM7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy50d29GYWN0b3JQcm92aWRlcnNEYXRhLmhhcyhUd29GYWN0b3JQcm92aWRlclR5cGUuT3JnYW5pemF0aW9uRHVvKSAmJlxuICAgICAgICAgICAgdGhpcy5wbGF0Zm9ybVV0aWxzU2VydmljZS5zdXBwb3J0c0R1bygpKSB7XG4gICAgICAgICAgICBwcm92aWRlcnMucHVzaChUd29GYWN0b3JQcm92aWRlcnNbVHdvRmFjdG9yUHJvdmlkZXJUeXBlLk9yZ2FuaXphdGlvbkR1b10pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMudHdvRmFjdG9yUHJvdmlkZXJzRGF0YS5oYXMoVHdvRmFjdG9yUHJvdmlkZXJUeXBlLkF1dGhlbnRpY2F0b3IpKSB7XG4gICAgICAgICAgICBwcm92aWRlcnMucHVzaChUd29GYWN0b3JQcm92aWRlcnNbVHdvRmFjdG9yUHJvdmlkZXJUeXBlLkF1dGhlbnRpY2F0b3JdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnR3b0ZhY3RvclByb3ZpZGVyc0RhdGEuaGFzKFR3b0ZhY3RvclByb3ZpZGVyVHlwZS5ZdWJpa2V5KSkge1xuICAgICAgICAgICAgcHJvdmlkZXJzLnB1c2goVHdvRmFjdG9yUHJvdmlkZXJzW1R3b0ZhY3RvclByb3ZpZGVyVHlwZS5ZdWJpa2V5XSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy50d29GYWN0b3JQcm92aWRlcnNEYXRhLmhhcyhUd29GYWN0b3JQcm92aWRlclR5cGUuRHVvKSAmJiB0aGlzLnBsYXRmb3JtVXRpbHNTZXJ2aWNlLnN1cHBvcnRzRHVvKCkpIHtcbiAgICAgICAgICAgIHByb3ZpZGVycy5wdXNoKFR3b0ZhY3RvclByb3ZpZGVyc1tUd29GYWN0b3JQcm92aWRlclR5cGUuRHVvXSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy50d29GYWN0b3JQcm92aWRlcnNEYXRhLmhhcyhUd29GYWN0b3JQcm92aWRlclR5cGUuV2ViQXV0aG4pICYmIHRoaXMucGxhdGZvcm1VdGlsc1NlcnZpY2Uuc3VwcG9ydHNXZWJBdXRobih3aW4pKSB7XG4gICAgICAgICAgICBwcm92aWRlcnMucHVzaChUd29GYWN0b3JQcm92aWRlcnNbVHdvRmFjdG9yUHJvdmlkZXJUeXBlLldlYkF1dGhuXSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy50d29GYWN0b3JQcm92aWRlcnNEYXRhLmhhcyhUd29GYWN0b3JQcm92aWRlclR5cGUuRW1haWwpKSB7XG4gICAgICAgICAgICBwcm92aWRlcnMucHVzaChUd29GYWN0b3JQcm92aWRlcnNbVHdvRmFjdG9yUHJvdmlkZXJUeXBlLkVtYWlsXSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcHJvdmlkZXJzO1xuICAgIH1cblxuICAgIGdldERlZmF1bHRUd29GYWN0b3JQcm92aWRlcih3ZWJBdXRoblN1cHBvcnRlZDogYm9vbGVhbik6IFR3b0ZhY3RvclByb3ZpZGVyVHlwZSB7XG4gICAgICAgIGlmICh0aGlzLnR3b0ZhY3RvclByb3ZpZGVyc0RhdGEgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZFR3b0ZhY3RvclByb3ZpZGVyVHlwZSAhPSBudWxsICYmXG4gICAgICAgICAgICB0aGlzLnR3b0ZhY3RvclByb3ZpZGVyc0RhdGEuaGFzKHRoaXMuc2VsZWN0ZWRUd29GYWN0b3JQcm92aWRlclR5cGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZFR3b0ZhY3RvclByb3ZpZGVyVHlwZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBwcm92aWRlclR5cGU6IFR3b0ZhY3RvclByb3ZpZGVyVHlwZSA9IG51bGw7XG4gICAgICAgIGxldCBwcm92aWRlclByaW9yaXR5ID0gLTE7XG4gICAgICAgIHRoaXMudHdvRmFjdG9yUHJvdmlkZXJzRGF0YS5mb3JFYWNoKCh2YWx1ZSwgdHlwZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcHJvdmlkZXIgPSAoVHdvRmFjdG9yUHJvdmlkZXJzIGFzIGFueSlbdHlwZV07XG4gICAgICAgICAgICBpZiAocHJvdmlkZXIgIT0gbnVsbCAmJiBwcm92aWRlci5wcmlvcml0eSA+IHByb3ZpZGVyUHJpb3JpdHkpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZSA9PT0gVHdvRmFjdG9yUHJvdmlkZXJUeXBlLldlYkF1dGhuICYmICF3ZWJBdXRoblN1cHBvcnRlZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcHJvdmlkZXJUeXBlID0gdHlwZTtcbiAgICAgICAgICAgICAgICBwcm92aWRlclByaW9yaXR5ID0gcHJvdmlkZXIucHJpb3JpdHk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBwcm92aWRlclR5cGU7XG4gICAgfVxuXG4gICAgYXN5bmMgbWFrZVByZWxvZ2luS2V5KG1hc3RlclBhc3N3b3JkOiBzdHJpbmcsIGVtYWlsOiBzdHJpbmcpOiBQcm9taXNlPFN5bW1ldHJpY0NyeXB0b0tleT4ge1xuICAgICAgICBlbWFpbCA9IGVtYWlsLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBsZXQga2RmOiBLZGZUeXBlID0gbnVsbDtcbiAgICAgICAgbGV0IGtkZkl0ZXJhdGlvbnM6IG51bWJlciA9IG51bGw7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBwcmVsb2dpblJlc3BvbnNlID0gYXdhaXQgdGhpcy5hcGlTZXJ2aWNlLnBvc3RQcmVsb2dpbihuZXcgUHJlbG9naW5SZXF1ZXN0KGVtYWlsKSk7XG4gICAgICAgICAgICBpZiAocHJlbG9naW5SZXNwb25zZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAga2RmID0gcHJlbG9naW5SZXNwb25zZS5rZGY7XG4gICAgICAgICAgICAgICAga2RmSXRlcmF0aW9ucyA9IHByZWxvZ2luUmVzcG9uc2Uua2RmSXRlcmF0aW9ucztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgaWYgKGUgPT0gbnVsbCB8fCBlLnN0YXR1c0NvZGUgIT09IDQwNCkge1xuICAgICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuY3J5cHRvU2VydmljZS5tYWtlS2V5KG1hc3RlclBhc3N3b3JkLCBlbWFpbCwga2RmLCBrZGZJdGVyYXRpb25zKTtcbiAgICB9XG5cbiAgICBhdXRoaW5nV2l0aEFwaUtleSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50SWQgIT0gbnVsbCAmJiB0aGlzLmNsaWVudFNlY3JldCAhPSBudWxsO1xuICAgIH1cblxuICAgIGF1dGhpbmdXaXRoU3NvKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5jb2RlICE9IG51bGwgJiYgdGhpcy5jb2RlVmVyaWZpZXIgIT0gbnVsbCAmJiB0aGlzLnNzb1JlZGlyZWN0VXJsICE9IG51bGw7XG4gICAgfVxuXG4gICAgYXV0aGluZ1dpdGhQYXNzd29yZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW1haWwgIT0gbnVsbCAmJiB0aGlzLm1hc3RlclBhc3N3b3JkSGFzaCAhPSBudWxsO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgbG9nSW5IZWxwZXIoZW1haWw6IHN0cmluZywgaGFzaGVkUGFzc3dvcmQ6IHN0cmluZywgbG9jYWxIYXNoZWRQYXNzd29yZDogc3RyaW5nLCBjb2RlOiBzdHJpbmcsXG4gICAgICAgIGNvZGVWZXJpZmllcjogc3RyaW5nLCByZWRpcmVjdFVybDogc3RyaW5nLCBjbGllbnRJZDogc3RyaW5nLCBjbGllbnRTZWNyZXQ6IHN0cmluZywga2V5OiBTeW1tZXRyaWNDcnlwdG9LZXksXG4gICAgICAgIHR3b0ZhY3RvclByb3ZpZGVyPzogVHdvRmFjdG9yUHJvdmlkZXJUeXBlLCB0d29GYWN0b3JUb2tlbj86IHN0cmluZywgcmVtZW1iZXI/OiBib29sZWFuLCBjYXB0Y2hhVG9rZW4/OiBzdHJpbmcsXG4gICAgICAgIG9yZ0lkPzogc3RyaW5nKTogUHJvbWlzZTxBdXRoUmVzdWx0PiB7XG4gICAgICAgIGNvbnN0IHN0b3JlZFR3b0ZhY3RvclRva2VuID0gYXdhaXQgdGhpcy50b2tlblNlcnZpY2UuZ2V0VHdvRmFjdG9yVG9rZW4oZW1haWwpO1xuICAgICAgICBjb25zdCBhcHBJZCA9IGF3YWl0IHRoaXMuYXBwSWRTZXJ2aWNlLmdldEFwcElkKCk7XG4gICAgICAgIGNvbnN0IGRldmljZVJlcXVlc3QgPSBuZXcgRGV2aWNlUmVxdWVzdChhcHBJZCwgdGhpcy5wbGF0Zm9ybVV0aWxzU2VydmljZSk7XG5cbiAgICAgICAgbGV0IGVtYWlsUGFzc3dvcmQ6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGxldCBjb2RlQ29kZVZlcmlmaWVyOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBsZXQgY2xpZW50SWRDbGllbnRTZWNyZXQ6IFtzdHJpbmcsIHN0cmluZ10gPSBbbnVsbCwgbnVsbF07XG5cbiAgICAgICAgaWYgKGVtYWlsICE9IG51bGwgJiYgaGFzaGVkUGFzc3dvcmQgIT0gbnVsbCkge1xuICAgICAgICAgICAgZW1haWxQYXNzd29yZCA9IFtlbWFpbCwgaGFzaGVkUGFzc3dvcmRdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZW1haWxQYXNzd29yZCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvZGUgIT0gbnVsbCAmJiBjb2RlVmVyaWZpZXIgIT0gbnVsbCAmJiByZWRpcmVjdFVybCAhPSBudWxsKSB7XG4gICAgICAgICAgICBjb2RlQ29kZVZlcmlmaWVyID0gW2NvZGUsIGNvZGVWZXJpZmllciwgcmVkaXJlY3RVcmxdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29kZUNvZGVWZXJpZmllciA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNsaWVudElkICE9IG51bGwgJiYgY2xpZW50U2VjcmV0ICE9IG51bGwpIHtcbiAgICAgICAgICAgIGNsaWVudElkQ2xpZW50U2VjcmV0ID0gW2NsaWVudElkLCBjbGllbnRTZWNyZXRdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2xpZW50SWRDbGllbnRTZWNyZXQgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJlcXVlc3Q6IFRva2VuUmVxdWVzdDtcbiAgICAgICAgaWYgKHR3b0ZhY3RvclRva2VuICE9IG51bGwgJiYgdHdvRmFjdG9yUHJvdmlkZXIgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmVxdWVzdCA9IG5ldyBUb2tlblJlcXVlc3QoZW1haWxQYXNzd29yZCwgY29kZUNvZGVWZXJpZmllciwgY2xpZW50SWRDbGllbnRTZWNyZXQsIHR3b0ZhY3RvclByb3ZpZGVyLFxuICAgICAgICAgICAgICAgIHR3b0ZhY3RvclRva2VuLCByZW1lbWJlciwgY2FwdGNoYVRva2VuLCBkZXZpY2VSZXF1ZXN0KTtcbiAgICAgICAgfSBlbHNlIGlmIChzdG9yZWRUd29GYWN0b3JUb2tlbiAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXF1ZXN0ID0gbmV3IFRva2VuUmVxdWVzdChlbWFpbFBhc3N3b3JkLCBjb2RlQ29kZVZlcmlmaWVyLCBjbGllbnRJZENsaWVudFNlY3JldCxcbiAgICAgICAgICAgICAgICBUd29GYWN0b3JQcm92aWRlclR5cGUuUmVtZW1iZXIsIHN0b3JlZFR3b0ZhY3RvclRva2VuLCBmYWxzZSwgY2FwdGNoYVRva2VuLCBkZXZpY2VSZXF1ZXN0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlcXVlc3QgPSBuZXcgVG9rZW5SZXF1ZXN0KGVtYWlsUGFzc3dvcmQsIGNvZGVDb2RlVmVyaWZpZXIsIGNsaWVudElkQ2xpZW50U2VjcmV0LCBudWxsLFxuICAgICAgICAgICAgICAgIG51bGwsIGZhbHNlLCBjYXB0Y2hhVG9rZW4sIGRldmljZVJlcXVlc3QpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmFwaVNlcnZpY2UucG9zdElkZW50aXR5VG9rZW4ocmVxdWVzdCk7XG5cbiAgICAgICAgdGhpcy5jbGVhclN0YXRlKCk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBBdXRoUmVzdWx0KCk7XG4gICAgICAgIHJlc3VsdC5jYXB0Y2hhU2l0ZUtleSA9IChyZXNwb25zZSBhcyBhbnkpLnNpdGVLZXk7XG4gICAgICAgIGlmICghIXJlc3VsdC5jYXB0Y2hhU2l0ZUtleSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICByZXN1bHQudHdvRmFjdG9yID0gISEocmVzcG9uc2UgYXMgYW55KS50d29GYWN0b3JQcm92aWRlcnMyO1xuXG4gICAgICAgIGlmIChyZXN1bHQudHdvRmFjdG9yKSB7XG4gICAgICAgICAgICAvLyB0d28gZmFjdG9yIHJlcXVpcmVkXG4gICAgICAgICAgICB0aGlzLmVtYWlsID0gZW1haWw7XG4gICAgICAgICAgICB0aGlzLm1hc3RlclBhc3N3b3JkSGFzaCA9IGhhc2hlZFBhc3N3b3JkO1xuICAgICAgICAgICAgdGhpcy5sb2NhbE1hc3RlclBhc3N3b3JkSGFzaCA9IGxvY2FsSGFzaGVkUGFzc3dvcmQ7XG4gICAgICAgICAgICB0aGlzLmNvZGUgPSBjb2RlO1xuICAgICAgICAgICAgdGhpcy5jb2RlVmVyaWZpZXIgPSBjb2RlVmVyaWZpZXI7XG4gICAgICAgICAgICB0aGlzLnNzb1JlZGlyZWN0VXJsID0gcmVkaXJlY3RVcmw7XG4gICAgICAgICAgICB0aGlzLmNsaWVudElkID0gY2xpZW50SWQ7XG4gICAgICAgICAgICB0aGlzLmNsaWVudFNlY3JldCA9IGNsaWVudFNlY3JldDtcbiAgICAgICAgICAgIHRoaXMua2V5ID0gdGhpcy5zZXRDcnlwdG9LZXlzID8ga2V5IDogbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IHR3b0ZhY3RvclJlc3BvbnNlID0gcmVzcG9uc2UgYXMgSWRlbnRpdHlUd29GYWN0b3JSZXNwb25zZTtcbiAgICAgICAgICAgIHRoaXMudHdvRmFjdG9yUHJvdmlkZXJzRGF0YSA9IHR3b0ZhY3RvclJlc3BvbnNlLnR3b0ZhY3RvclByb3ZpZGVyczI7XG4gICAgICAgICAgICByZXN1bHQudHdvRmFjdG9yUHJvdmlkZXJzID0gdHdvRmFjdG9yUmVzcG9uc2UudHdvRmFjdG9yUHJvdmlkZXJzMjtcbiAgICAgICAgICAgIHRoaXMuY2FwdGNoYVRva2VuID0gdHdvRmFjdG9yUmVzcG9uc2UuY2FwdGNoYVRva2VuO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRva2VuUmVzcG9uc2UgPSByZXNwb25zZSBhcyBJZGVudGl0eVRva2VuUmVzcG9uc2U7XG4gICAgICAgIHJlc3VsdC5yZXNldE1hc3RlclBhc3N3b3JkID0gdG9rZW5SZXNwb25zZS5yZXNldE1hc3RlclBhc3N3b3JkO1xuICAgICAgICByZXN1bHQuZm9yY2VQYXNzd29yZFJlc2V0ID0gdG9rZW5SZXNwb25zZS5mb3JjZVBhc3N3b3JkUmVzZXQ7XG4gICAgICAgIGlmICh0b2tlblJlc3BvbnNlLnR3b0ZhY3RvclRva2VuICE9IG51bGwpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMudG9rZW5TZXJ2aWNlLnNldFR3b0ZhY3RvclRva2VuKHRva2VuUmVzcG9uc2UudHdvRmFjdG9yVG9rZW4sIGVtYWlsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IHRoaXMudG9rZW5TZXJ2aWNlLnNldFRva2Vucyh0b2tlblJlc3BvbnNlLmFjY2Vzc1Rva2VuLCB0b2tlblJlc3BvbnNlLnJlZnJlc2hUb2tlbiwgY2xpZW50SWRDbGllbnRTZWNyZXQpO1xuICAgICAgICBhd2FpdCB0aGlzLnVzZXJTZXJ2aWNlLnNldEluZm9ybWF0aW9uKHRoaXMudG9rZW5TZXJ2aWNlLmdldFVzZXJJZCgpLCB0aGlzLnRva2VuU2VydmljZS5nZXRFbWFpbCgpLFxuICAgICAgICAgICAgdG9rZW5SZXNwb25zZS5rZGYsIHRva2VuUmVzcG9uc2Uua2RmSXRlcmF0aW9ucyk7XG4gICAgICAgIGlmICh0aGlzLnNldENyeXB0b0tleXMpIHtcbiAgICAgICAgICAgIGlmIChrZXkgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuY3J5cHRvU2VydmljZS5zZXRLZXkoa2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChsb2NhbEhhc2hlZFBhc3N3b3JkICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNyeXB0b1NlcnZpY2Uuc2V0S2V5SGFzaChsb2NhbEhhc2hlZFBhc3N3b3JkKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gU2tpcCB0aGlzIHN0ZXAgZHVyaW5nIFNTTyBuZXcgdXNlciBmbG93LiBObyBrZXkgaXMgcmV0dXJuZWQgZnJvbSBzZXJ2ZXIuXG4gICAgICAgICAgICBpZiAoY29kZSA9PSBudWxsIHx8IHRva2VuUmVzcG9uc2Uua2V5ICE9IG51bGwpIHtcblxuICAgICAgICAgICAgICAgIGlmICh0b2tlblJlc3BvbnNlLmNyeXB0b0FnZW50VXJsICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVzZXJLZXlSZXNwb25zZSA9IGF3YWl0IHRoaXMuYXBpU2VydmljZS5nZXRVc2VyS2V5RnJvbUNyeXB0b0FnZW50KHRva2VuUmVzcG9uc2UuY3J5cHRvQWdlbnRVcmwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qga2V5QXJyID0gVXRpbHMuZnJvbUI2NFRvQXJyYXkodXNlcktleVJlc3BvbnNlLmtleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBrID0gbmV3IFN5bW1ldHJpY0NyeXB0b0tleShrZXlBcnIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jcnlwdG9TZXJ2aWNlLnNldEtleShrKTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dTZXJ2aWNlLmVycm9yKGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gcmVhY2ggY3J5cHRvIGFnZW50Jyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNyeXB0b1NlcnZpY2Uuc2V0RW5jS2V5KHRva2VuUmVzcG9uc2Uua2V5KTtcblxuICAgICAgICAgICAgICAgIC8vIFVzZXIgZG9lc24ndCBoYXZlIGEga2V5IHBhaXIgeWV0IChvbGQgYWNjb3VudCksIGxldCdzIGdlbmVyYXRlIG9uZSBmb3IgdGhlbVxuICAgICAgICAgICAgICAgIGlmICh0b2tlblJlc3BvbnNlLnByaXZhdGVLZXkgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qga2V5UGFpciA9IGF3YWl0IHRoaXMuY3J5cHRvU2VydmljZS5tYWtlS2V5UGFpcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5hcGlTZXJ2aWNlLnBvc3RBY2NvdW50S2V5cyhuZXcgS2V5c1JlcXVlc3Qoa2V5UGFpclswXSwga2V5UGFpclsxXS5lbmNyeXB0ZWRTdHJpbmcpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuUmVzcG9uc2UucHJpdmF0ZUtleSA9IGtleVBhaXJbMV0uZW5jcnlwdGVkU3RyaW5nO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ1NlcnZpY2UuZXJyb3IoZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNyeXB0b1NlcnZpY2Uuc2V0RW5jUHJpdmF0ZUtleSh0b2tlblJlc3BvbnNlLnByaXZhdGVLZXkpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlblJlc3BvbnNlLmNyeXB0b0FnZW50VXJsICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXNzd29yZCA9IGF3YWl0IHRoaXMuY3J5cHRvRnVuY3Rpb25TZXJ2aWNlLnJhbmRvbUJ5dGVzKDY0KTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGsgPSBhd2FpdCB0aGlzLmNyeXB0b1NlcnZpY2UubWFrZUtleShVdGlscy5mcm9tQnVmZmVyVG9CNjQocGFzc3dvcmQpLCB0aGlzLnRva2VuU2VydmljZS5nZXRFbWFpbCgpLCB0b2tlblJlc3BvbnNlLmtkZiwgdG9rZW5SZXNwb25zZS5rZGZJdGVyYXRpb25zKTtcbiAgICAgICAgICAgICAgICBjb25zdCBjcnlwdG9BZ2VudFJlcXVlc3QgPSBuZXcgQ3J5cHRvQWdlbnRVc2VyS2V5UmVxdWVzdChrLmVuY0tleUI2NCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jcnlwdG9TZXJ2aWNlLnNldEtleShrKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGVuY0tleSA9IGF3YWl0IHRoaXMuY3J5cHRvU2VydmljZS5tYWtlRW5jS2V5KGspO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuY3J5cHRvU2VydmljZS5zZXRFbmNLZXkoZW5jS2V5WzFdLmVuY3J5cHRlZFN0cmluZyk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBbcHViS2V5LCBwcml2S2V5XSA9IGF3YWl0IHRoaXMuY3J5cHRvU2VydmljZS5tYWtlS2V5UGFpcigpO1xuXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5hcGlTZXJ2aWNlLnBvc3RVc2VyS2V5VG9DcnlwdG9BZ2VudCh0b2tlblJlc3BvbnNlLmNyeXB0b0FnZW50VXJsLCBjcnlwdG9BZ2VudFJlcXVlc3QpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gcmVhY2ggY3J5cHRvIGFnZW50Jyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3Qga2V5cyA9IG5ldyBLZXlzUmVxdWVzdChwdWJLZXksIHByaXZLZXkuZW5jcnlwdGVkU3RyaW5nKTtcbiAgICAgICAgICAgICAgICBjb25zdCBzZXRQYXNzd29yZFJlcXVlc3QgPSBuZXcgU2V0Q3J5cHRvQWdlbnRLZXlSZXF1ZXN0KFxuICAgICAgICAgICAgICAgICAgICBlbmNLZXlbMV0uZW5jcnlwdGVkU3RyaW5nLCB0b2tlblJlc3BvbnNlLmtkZiwgdG9rZW5SZXNwb25zZS5rZGZJdGVyYXRpb25zLCBvcmdJZCwga2V5c1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5hcGlTZXJ2aWNlLnBvc3RTZXRDcnlwdG9BZ2VudEtleShzZXRQYXNzd29yZFJlcXVlc3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMudmF1bHRUaW1lb3V0U2VydmljZSAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnZhdWx0VGltZW91dFNlcnZpY2UuYmlvbWV0cmljTG9ja2VkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5tZXNzYWdpbmdTZXJ2aWNlLnNlbmQoJ2xvZ2dlZEluJyk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjbGVhclN0YXRlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmtleSA9IG51bGw7XG4gICAgICAgIHRoaXMuZW1haWwgPSBudWxsO1xuICAgICAgICB0aGlzLm1hc3RlclBhc3N3b3JkSGFzaCA9IG51bGw7XG4gICAgICAgIHRoaXMubG9jYWxNYXN0ZXJQYXNzd29yZEhhc2ggPSBudWxsO1xuICAgICAgICB0aGlzLmNvZGUgPSBudWxsO1xuICAgICAgICB0aGlzLmNvZGVWZXJpZmllciA9IG51bGw7XG4gICAgICAgIHRoaXMuc3NvUmVkaXJlY3RVcmwgPSBudWxsO1xuICAgICAgICB0aGlzLmNsaWVudElkID0gbnVsbDtcbiAgICAgICAgdGhpcy5jbGllbnRTZWNyZXQgPSBudWxsO1xuICAgICAgICB0aGlzLnR3b0ZhY3RvclByb3ZpZGVyc0RhdGEgPSBudWxsO1xuICAgICAgICB0aGlzLnNlbGVjdGVkVHdvRmFjdG9yUHJvdmlkZXJUeXBlID0gbnVsbDtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBMb2dTZXJ2aWNlIH0gZnJvbSAnLi4vYWJzdHJhY3Rpb25zL2xvZy5zZXJ2aWNlJztcblxuaW1wb3J0IHsgVXRpbHMgfSBmcm9tICcuLi9taXNjL3V0aWxzJztcblxuaW1wb3J0IHsgRW5jQXJyYXlCdWZmZXIgfSBmcm9tICcuLi9tb2RlbHMvZG9tYWluL2VuY0FycmF5QnVmZmVyJztcblxuY29uc3QgTUFYX1NJTkdMRV9CTE9CX1VQTE9BRF9TSVpFID0gMjU2ICogMTAyNCAqIDEwMjQ7IC8vIDI1NiBNaUJcbmNvbnN0IE1BWF9CTE9DS1NfUEVSX0JMT0IgPSA1MDAwMDtcblxuZXhwb3J0IGNsYXNzIEF6dXJlRmlsZVVwbG9hZFNlcnZpY2Uge1xuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgbG9nU2VydmljZTogTG9nU2VydmljZSkgeyB9XG5cbiAgICBhc3luYyB1cGxvYWQodXJsOiBzdHJpbmcsIGRhdGE6IEVuY0FycmF5QnVmZmVyLCByZW5ld2FsQ2FsbGJhY2s6ICgpID0+IFByb21pc2U8c3RyaW5nPikge1xuICAgICAgICBpZiAoZGF0YS5idWZmZXIuYnl0ZUxlbmd0aCA8PSBNQVhfU0lOR0xFX0JMT0JfVVBMT0FEX1NJWkUpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmF6dXJlVXBsb2FkQmxvYih1cmwsIGRhdGEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuYXp1cmVVcGxvYWRCbG9ja3ModXJsLCBkYXRhLCByZW5ld2FsQ2FsbGJhY2spO1xuICAgICAgICB9XG4gICAgfVxuICAgIHByaXZhdGUgYXN5bmMgYXp1cmVVcGxvYWRCbG9iKHVybDogc3RyaW5nLCBkYXRhOiBFbmNBcnJheUJ1ZmZlcikge1xuICAgICAgICBjb25zdCB1cmxPYmplY3QgPSBVdGlscy5nZXRVcmwodXJsKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IG5ldyBIZWFkZXJzKHtcbiAgICAgICAgICAgICd4LW1zLWRhdGUnOiBuZXcgRGF0ZSgpLnRvVVRDU3RyaW5nKCksXG4gICAgICAgICAgICAneC1tcy12ZXJzaW9uJzogdXJsT2JqZWN0LnNlYXJjaFBhcmFtcy5nZXQoJ3N2JyksXG4gICAgICAgICAgICAnQ29udGVudC1MZW5ndGgnOiBkYXRhLmJ1ZmZlci5ieXRlTGVuZ3RoLnRvU3RyaW5nKCksXG4gICAgICAgICAgICAneC1tcy1ibG9iLXR5cGUnOiAnQmxvY2tCbG9iJyxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IG5ldyBSZXF1ZXN0KHVybCwge1xuICAgICAgICAgICAgYm9keTogZGF0YS5idWZmZXIsXG4gICAgICAgICAgICBjYWNoZTogJ25vLXN0b3JlJyxcbiAgICAgICAgICAgIG1ldGhvZDogJ1BVVCcsXG4gICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJzLFxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBibG9iUmVzcG9uc2UgPSBhd2FpdCBmZXRjaChyZXF1ZXN0KTtcblxuICAgICAgICBpZiAoYmxvYlJlc3BvbnNlLnN0YXR1cyAhPT0gMjAxKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBjcmVhdGUgQXp1cmUgYmxvYjogJHtibG9iUmVzcG9uc2Uuc3RhdHVzfWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIHByaXZhdGUgYXN5bmMgYXp1cmVVcGxvYWRCbG9ja3ModXJsOiBzdHJpbmcsIGRhdGE6IEVuY0FycmF5QnVmZmVyLCByZW5ld2FsQ2FsbGJhY2s6ICgpID0+IFByb21pc2U8c3RyaW5nPikge1xuICAgICAgICBjb25zdCBiYXNlVXJsID0gVXRpbHMuZ2V0VXJsKHVybCk7XG4gICAgICAgIGNvbnN0IGJsb2NrU2l6ZSA9IHRoaXMuZ2V0TWF4QmxvY2tTaXplKGJhc2VVcmwuc2VhcmNoUGFyYW1zLmdldCgnc3YnKSk7XG4gICAgICAgIGxldCBibG9ja0luZGV4ID0gMDtcbiAgICAgICAgY29uc3QgbnVtQmxvY2tzID0gTWF0aC5jZWlsKGRhdGEuYnVmZmVyLmJ5dGVMZW5ndGggLyBibG9ja1NpemUpO1xuICAgICAgICBjb25zdCBibG9ja3NTdGFnZWQ6IHN0cmluZ1tdID0gW107XG5cbiAgICAgICAgaWYgKG51bUJsb2NrcyA+IE1BWF9CTE9DS1NfUEVSX0JMT0IpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHVwbG9hZCBmaWxlLCBleGNlZWRzIG1heGltdW0gc2l6ZSBvZiAke2Jsb2NrU2l6ZSAqIE1BWF9CTE9DS1NfUEVSX0JMT0J9YCk7XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgd2hpbGUgKGJsb2NrSW5kZXggPCBudW1CbG9ja3MpIHtcbiAgICAgICAgICAgICAgICB1cmwgPSBhd2FpdCB0aGlzLnJlbmV3VXJsSWZOZWNlc3NhcnkodXJsLCByZW5ld2FsQ2FsbGJhY2spO1xuICAgICAgICAgICAgICAgIGNvbnN0IGJsb2NrVXJsID0gVXRpbHMuZ2V0VXJsKHVybCk7XG4gICAgICAgICAgICAgICAgY29uc3QgYmxvY2tJZCA9IHRoaXMuZW5jb2RlZEJsb2NrSWQoYmxvY2tJbmRleCk7XG4gICAgICAgICAgICAgICAgYmxvY2tVcmwuc2VhcmNoUGFyYW1zLmFwcGVuZCgnY29tcCcsICdibG9jaycpO1xuICAgICAgICAgICAgICAgIGJsb2NrVXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoJ2Jsb2NraWQnLCBibG9ja0lkKTtcbiAgICAgICAgICAgICAgICBjb25zdCBzdGFydCA9IGJsb2NrSW5kZXggKiBibG9ja1NpemU7XG4gICAgICAgICAgICAgICAgY29uc3QgYmxvY2tEYXRhID0gZGF0YS5idWZmZXIuc2xpY2Uoc3RhcnQsIHN0YXJ0ICsgYmxvY2tTaXplKTtcbiAgICAgICAgICAgICAgICBjb25zdCBibG9ja0hlYWRlcnMgPSBuZXcgSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgICAgICd4LW1zLWRhdGUnOiBuZXcgRGF0ZSgpLnRvVVRDU3RyaW5nKCksXG4gICAgICAgICAgICAgICAgICAgICd4LW1zLXZlcnNpb24nOiBibG9ja1VybC5zZWFyY2hQYXJhbXMuZ2V0KCdzdicpLFxuICAgICAgICAgICAgICAgICAgICAnQ29udGVudC1MZW5ndGgnOiBibG9ja0RhdGEuYnl0ZUxlbmd0aC50b1N0cmluZygpLFxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgYmxvY2tSZXF1ZXN0ID0gbmV3IFJlcXVlc3QoYmxvY2tVcmwudG9TdHJpbmcoKSwge1xuICAgICAgICAgICAgICAgICAgICBib2R5OiBibG9ja0RhdGEsXG4gICAgICAgICAgICAgICAgICAgIGNhY2hlOiAnbm8tc3RvcmUnLFxuICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdQVVQnLFxuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiBibG9ja0hlYWRlcnMsXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBibG9ja1Jlc3BvbnNlID0gYXdhaXQgZmV0Y2goYmxvY2tSZXF1ZXN0KTtcblxuICAgICAgICAgICAgICAgIGlmIChibG9ja1Jlc3BvbnNlLnN0YXR1cyAhPT0gMjAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBgVW5zdWNjZXNzZnVsIGJsb2NrIFBVVC4gUmVjZWl2ZWQgc3RhdHVzICR7YmxvY2tSZXNwb25zZS5zdGF0dXN9YDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dTZXJ2aWNlLmVycm9yKG1lc3NhZ2UgKyAnXFxuJyArIGF3YWl0IGJsb2NrUmVzcG9uc2UuanNvbigpKTtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGJsb2Nrc1N0YWdlZC5wdXNoKGJsb2NrSWQpO1xuICAgICAgICAgICAgICAgIGJsb2NrSW5kZXgrKztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdXJsID0gYXdhaXQgdGhpcy5yZW5ld1VybElmTmVjZXNzYXJ5KHVybCwgcmVuZXdhbENhbGxiYWNrKTtcbiAgICAgICAgICAgIGNvbnN0IGJsb2NrTGlzdFVybCA9IFV0aWxzLmdldFVybCh1cmwpO1xuICAgICAgICAgICAgY29uc3QgYmxvY2tMaXN0WG1sID0gdGhpcy5ibG9ja0xpc3RYbWwoYmxvY2tzU3RhZ2VkKTtcbiAgICAgICAgICAgIGJsb2NrTGlzdFVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKCdjb21wJywgJ2Jsb2NrbGlzdCcpO1xuICAgICAgICAgICAgY29uc3QgaGVhZGVycyA9IG5ldyBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICAneC1tcy1kYXRlJzogbmV3IERhdGUoKS50b1VUQ1N0cmluZygpLFxuICAgICAgICAgICAgICAgICd4LW1zLXZlcnNpb24nOiBibG9ja0xpc3RVcmwuc2VhcmNoUGFyYW1zLmdldCgnc3YnKSxcbiAgICAgICAgICAgICAgICAnQ29udGVudC1MZW5ndGgnOiBibG9ja0xpc3RYbWwubGVuZ3RoLnRvU3RyaW5nKCksXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgY29uc3QgcmVxdWVzdCA9IG5ldyBSZXF1ZXN0KGJsb2NrTGlzdFVybC50b1N0cmluZygpLCB7XG4gICAgICAgICAgICAgICAgYm9keTogYmxvY2tMaXN0WG1sLFxuICAgICAgICAgICAgICAgIGNhY2hlOiAnbm8tc3RvcmUnLFxuICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BVVCcsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogaGVhZGVycyxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHJlcXVlc3QpO1xuXG4gICAgICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzICE9PSAyMDEpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gYFVuc3VjY2Vzc2Z1bCBibG9jayBsaXN0IFBVVC4gUmVjZWl2ZWQgc3RhdHVzICR7cmVzcG9uc2Uuc3RhdHVzfWA7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dTZXJ2aWNlLmVycm9yKG1lc3NhZ2UgKyAnXFxuJyArIGF3YWl0IHJlc3BvbnNlLmpzb24oKSk7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyByZW5ld1VybElmTmVjZXNzYXJ5KHVybDogc3RyaW5nLCByZW5ld2FsQ2FsbGJhY2s6ICgpID0+IFByb21pc2U8c3RyaW5nPik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIGNvbnN0IHVybE9iamVjdCA9IFV0aWxzLmdldFVybCh1cmwpO1xuICAgICAgICBjb25zdCBleHBpcnkgPSBuZXcgRGF0ZSh1cmxPYmplY3Quc2VhcmNoUGFyYW1zLmdldCgnc2UnKSA/PyAnJyk7XG5cbiAgICAgICAgaWYgKGlzTmFOKGV4cGlyeS5nZXRUaW1lKCkpKSB7XG4gICAgICAgICAgICBleHBpcnkuc2V0VGltZShEYXRlLm5vdygpICsgMzYwMDAwMCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXhwaXJ5LmdldFRpbWUoKSA8IERhdGUubm93KCkgKyAxMDAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgcmVuZXdhbENhbGxiYWNrKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVybDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGVuY29kZWRCbG9ja0lkKGJsb2NrSW5kZXg6IG51bWJlcikge1xuICAgICAgICAvLyBFbmNvZGVkIGJsb2NrSWQgbWF4IHNpemUgaXMgNjQsIHNvIHByZS1lbmNvZGluZyBtYXggc2l6ZSBpcyA0OFxuICAgICAgICBjb25zdCB1dGZCbG9ja0lkID0gKCcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnICsgYmxvY2tJbmRleC50b1N0cmluZygpKS5zbGljZSgtNDgpO1xuICAgICAgICByZXR1cm4gVXRpbHMuZnJvbVV0ZjhUb0I2NCh1dGZCbG9ja0lkKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGJsb2NrTGlzdFhtbChibG9ja0lkTGlzdDogc3RyaW5nW10pIHtcbiAgICAgICAgbGV0IHhtbCA9ICc8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJ1dGYtOFwiPz48QmxvY2tMaXN0Pic7XG4gICAgICAgIGJsb2NrSWRMaXN0LmZvckVhY2goYmxvY2tJZCA9PiB7XG4gICAgICAgICAgICB4bWwgKz0gYDxMYXRlc3Q+JHtibG9ja0lkfTwvTGF0ZXN0PmA7XG4gICAgICAgIH0pO1xuICAgICAgICB4bWwgKz0gJzwvQmxvY2tMaXN0Pic7XG4gICAgICAgIHJldHVybiB4bWw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRNYXhCbG9ja1NpemUodmVyc2lvbjogc3RyaW5nKSB7XG4gICAgICAgIGlmIChWZXJzaW9uLmNvbXBhcmUodmVyc2lvbiwgJzIwMTktMTItMTInKSA+PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gNDAwMCAqIDEwMjQgKiAxMDI0OyAvLyA0MDAwIE1pQlxuICAgICAgICB9IGVsc2UgaWYgKFZlcnNpb24uY29tcGFyZSh2ZXJzaW9uLCAnMjAxNi0wNS0zMScpID49IDApIHtcbiAgICAgICAgICAgIHJldHVybiAxMDAgKiAxMDI0ICogMTAyNDsgLy8gMTAwIE1pQlxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIDQgKiAxMDI0ICogMTAyNDsgLy8gNCBNaUJcbiAgICAgICAgfVxuICAgIH1cbn1cblxuY2xhc3MgVmVyc2lvbiB7XG4gICAgLyoqXG4gICAgICogQ29tcGFyZXMgdHdvIEF6dXJlIFZlcnNpb25zIGFnYWluc3QgZWFjaCBvdGhlclxuICAgICAqIEBwYXJhbSBhIFZlcnNpb24gdG8gY29tcGFyZVxuICAgICAqIEBwYXJhbSBiIFZlcnNpb24gdG8gY29tcGFyZVxuICAgICAqIEByZXR1cm5zIGEgbnVtYmVyIGxlc3MgdGhhbiB6ZXJvIGlmIGIgaXMgbmV3ZXIgdGhhbiBhLCAwIGlmIGVxdWFsLFxuICAgICAqIGFuZCBncmVhdGVyIHRoYW4gemVybyBpZiBhIGlzIG5ld2VyIHRoYW4gYlxuICAgICAqL1xuICAgIHN0YXRpYyBjb21wYXJlKGE6IFJlcXVpcmVkPFZlcnNpb24+IHwgc3RyaW5nLCBiOiBSZXF1aXJlZDxWZXJzaW9uPiB8IHN0cmluZykge1xuICAgICAgICBpZiAodHlwZW9mIChhKSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGEgPSBuZXcgVmVyc2lvbihhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgKGIpID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgYiA9IG5ldyBWZXJzaW9uKGIpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGEueWVhciAhPT0gYi55ZWFyID8gYS55ZWFyIC0gYi55ZWFyIDpcbiAgICAgICAgICAgIGEubW9udGggIT09IGIubW9udGggPyBhLm1vbnRoIC0gYi5tb250aCA6XG4gICAgICAgICAgICAgICAgYS5kYXkgIT09IGIuZGF5ID8gYS5kYXkgLSBiLmRheSA6XG4gICAgICAgICAgICAgICAgICAgIDA7XG4gICAgfVxuICAgIHllYXIgPSAwO1xuICAgIG1vbnRoID0gMDtcbiAgICBkYXkgPSAwO1xuXG4gICAgY29uc3RydWN0b3IodmVyc2lvbjogc3RyaW5nKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBwYXJ0cyA9IHZlcnNpb24uc3BsaXQoJy0nKS5tYXAodiA9PiBOdW1iZXIucGFyc2VJbnQodiwgMTApKTtcbiAgICAgICAgICAgIHRoaXMueWVhciA9IHBhcnRzWzBdO1xuICAgICAgICAgICAgdGhpcy5tb250aCA9IHBhcnRzWzFdO1xuICAgICAgICAgICAgdGhpcy5kYXkgPSBwYXJ0c1syXTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvLyBJZ25vcmUgZXJyb3JcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb21wYXJlcyB0d28gQXp1cmUgVmVyc2lvbnMgYWdhaW5zdCBlYWNoIG90aGVyXG4gICAgICogQHBhcmFtIGNvbXBhcmVUbyBWZXJzaW9uIHRvIGNvbXBhcmUgYWdhaW5zdFxuICAgICAqIEByZXR1cm5zIGEgbnVtYmVyIGxlc3MgdGhhbiB6ZXJvIGlmIGNvbXBhcmVUbyBpcyBuZXdlciwgMCBpZiBlcXVhbCxcbiAgICAgKiBhbmQgZ3JlYXRlciB0aGFuIHplcm8gaWYgdGhpcyBpcyBncmVhdGVyIHRoYW4gY29tcGFyZVRvXG4gICAgICovXG4gICAgY29tcGFyZShjb21wYXJlVG86IFJlcXVpcmVkPFZlcnNpb24+IHwgc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiBWZXJzaW9uLmNvbXBhcmUodGhpcywgY29tcGFyZVRvKTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBBcGlTZXJ2aWNlIH0gZnJvbSAnLi4vYWJzdHJhY3Rpb25zL2FwaS5zZXJ2aWNlJztcblxuaW1wb3J0IHsgRW5jQXJyYXlCdWZmZXIgfSBmcm9tICcuLi9tb2RlbHMvZG9tYWluL2VuY0FycmF5QnVmZmVyJztcblxuaW1wb3J0IHsgVXRpbHMgfSBmcm9tICcuLi9taXNjL3V0aWxzJztcblxuZXhwb3J0IGNsYXNzIEJpdHdhcmRlbkZpbGVVcGxvYWRTZXJ2aWNlXG57XG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBhcGlTZXJ2aWNlOiBBcGlTZXJ2aWNlKSB7IH1cblxuICAgIGFzeW5jIHVwbG9hZChlbmNyeXB0ZWRGaWxlTmFtZTogc3RyaW5nLCBlbmNyeXB0ZWRGaWxlRGF0YTogRW5jQXJyYXlCdWZmZXIsIGFwaUNhbGw6IChmZDogRm9ybURhdGEpID0+IFByb21pc2U8YW55Pikge1xuICAgICAgICBjb25zdCBmZCA9IG5ldyBGb3JtRGF0YSgpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtlbmNyeXB0ZWRGaWxlRGF0YS5idWZmZXJdLCB7IHR5cGU6ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nIH0pO1xuICAgICAgICAgICAgZmQuYXBwZW5kKCdkYXRhJywgYmxvYiwgZW5jcnlwdGVkRmlsZU5hbWUpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBpZiAoVXRpbHMuaXNOb2RlICYmICFVdGlscy5pc0Jyb3dzZXIpIHtcbiAgICAgICAgICAgICAgICBmZC5hcHBlbmQoJ2RhdGEnLCBCdWZmZXIuZnJvbShlbmNyeXB0ZWRGaWxlRGF0YS5idWZmZXIpIGFzIGFueSwge1xuICAgICAgICAgICAgICAgICAgICBmaWxlcGF0aDogZW5jcnlwdGVkRmlsZU5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRUeXBlOiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJyxcbiAgICAgICAgICAgICAgICB9IGFzIGFueSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCBhcGlDYWxsKGZkKTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBDaXBoZXJUeXBlIH0gZnJvbSAnLi4vZW51bXMvY2lwaGVyVHlwZSc7XG5pbXBvcnQgeyBGaWVsZFR5cGUgfSBmcm9tICcuLi9lbnVtcy9maWVsZFR5cGUnO1xuaW1wb3J0IHsgVXJpTWF0Y2hUeXBlIH0gZnJvbSAnLi4vZW51bXMvdXJpTWF0Y2hUeXBlJztcblxuaW1wb3J0IHsgQ2lwaGVyRGF0YSB9IGZyb20gJy4uL21vZGVscy9kYXRhL2NpcGhlckRhdGEnO1xuXG5pbXBvcnQgeyBBdHRhY2htZW50IH0gZnJvbSAnLi4vbW9kZWxzL2RvbWFpbi9hdHRhY2htZW50JztcbmltcG9ydCB7IENhcmQgfSBmcm9tICcuLi9tb2RlbHMvZG9tYWluL2NhcmQnO1xuaW1wb3J0IHsgQ2lwaGVyIH0gZnJvbSAnLi4vbW9kZWxzL2RvbWFpbi9jaXBoZXInO1xuaW1wb3J0IERvbWFpbiBmcm9tICcuLi9tb2RlbHMvZG9tYWluL2RvbWFpbkJhc2UnO1xuaW1wb3J0IHsgRW5jQXJyYXlCdWZmZXIgfSBmcm9tICcuLi9tb2RlbHMvZG9tYWluL2VuY0FycmF5QnVmZmVyJztcbmltcG9ydCB7IEVuY1N0cmluZyB9IGZyb20gJy4uL21vZGVscy9kb21haW4vZW5jU3RyaW5nJztcbmltcG9ydCB7IEZpZWxkIH0gZnJvbSAnLi4vbW9kZWxzL2RvbWFpbi9maWVsZCc7XG5pbXBvcnQgeyBJZGVudGl0eSB9IGZyb20gJy4uL21vZGVscy9kb21haW4vaWRlbnRpdHknO1xuaW1wb3J0IHsgTG9naW4gfSBmcm9tICcuLi9tb2RlbHMvZG9tYWluL2xvZ2luJztcbmltcG9ydCB7IExvZ2luVXJpIH0gZnJvbSAnLi4vbW9kZWxzL2RvbWFpbi9sb2dpblVyaSc7XG5pbXBvcnQgeyBQYXNzd29yZCB9IGZyb20gJy4uL21vZGVscy9kb21haW4vcGFzc3dvcmQnO1xuaW1wb3J0IHsgU2VjdXJlTm90ZSB9IGZyb20gJy4uL21vZGVscy9kb21haW4vc2VjdXJlTm90ZSc7XG5pbXBvcnQgeyBTeW1tZXRyaWNDcnlwdG9LZXkgfSBmcm9tICcuLi9tb2RlbHMvZG9tYWluL3N5bW1ldHJpY0NyeXB0b0tleSc7XG5cbmltcG9ydCB7IEF0dGFjaG1lbnRSZXF1ZXN0IH0gZnJvbSAnLi4vbW9kZWxzL3JlcXVlc3QvYXR0YWNobWVudFJlcXVlc3QnO1xuaW1wb3J0IHsgQ2lwaGVyQnVsa0RlbGV0ZVJlcXVlc3QgfSBmcm9tICcuLi9tb2RlbHMvcmVxdWVzdC9jaXBoZXJCdWxrRGVsZXRlUmVxdWVzdCc7XG5pbXBvcnQgeyBDaXBoZXJCdWxrTW92ZVJlcXVlc3QgfSBmcm9tICcuLi9tb2RlbHMvcmVxdWVzdC9jaXBoZXJCdWxrTW92ZVJlcXVlc3QnO1xuaW1wb3J0IHsgQ2lwaGVyQnVsa1Jlc3RvcmVSZXF1ZXN0IH0gZnJvbSAnLi4vbW9kZWxzL3JlcXVlc3QvY2lwaGVyQnVsa1Jlc3RvcmVSZXF1ZXN0JztcbmltcG9ydCB7IENpcGhlckJ1bGtTaGFyZVJlcXVlc3QgfSBmcm9tICcuLi9tb2RlbHMvcmVxdWVzdC9jaXBoZXJCdWxrU2hhcmVSZXF1ZXN0JztcbmltcG9ydCB7IENpcGhlckNvbGxlY3Rpb25zUmVxdWVzdCB9IGZyb20gJy4uL21vZGVscy9yZXF1ZXN0L2NpcGhlckNvbGxlY3Rpb25zUmVxdWVzdCc7XG5pbXBvcnQgeyBDaXBoZXJDcmVhdGVSZXF1ZXN0IH0gZnJvbSAnLi4vbW9kZWxzL3JlcXVlc3QvY2lwaGVyQ3JlYXRlUmVxdWVzdCc7XG5pbXBvcnQgeyBDaXBoZXJSZXF1ZXN0IH0gZnJvbSAnLi4vbW9kZWxzL3JlcXVlc3QvY2lwaGVyUmVxdWVzdCc7XG5pbXBvcnQgeyBDaXBoZXJTaGFyZVJlcXVlc3QgfSBmcm9tICcuLi9tb2RlbHMvcmVxdWVzdC9jaXBoZXJTaGFyZVJlcXVlc3QnO1xuXG5pbXBvcnQgeyBDaXBoZXJSZXNwb25zZSB9IGZyb20gJy4uL21vZGVscy9yZXNwb25zZS9jaXBoZXJSZXNwb25zZSc7XG5pbXBvcnQgeyBFcnJvclJlc3BvbnNlIH0gZnJvbSAnLi4vbW9kZWxzL3Jlc3BvbnNlL2Vycm9yUmVzcG9uc2UnO1xuXG5pbXBvcnQgeyBBdHRhY2htZW50VmlldyB9IGZyb20gJy4uL21vZGVscy92aWV3L2F0dGFjaG1lbnRWaWV3JztcbmltcG9ydCB7IENpcGhlclZpZXcgfSBmcm9tICcuLi9tb2RlbHMvdmlldy9jaXBoZXJWaWV3JztcbmltcG9ydCB7IEZpZWxkVmlldyB9IGZyb20gJy4uL21vZGVscy92aWV3L2ZpZWxkVmlldyc7XG5pbXBvcnQgeyBQYXNzd29yZEhpc3RvcnlWaWV3IH0gZnJvbSAnLi4vbW9kZWxzL3ZpZXcvcGFzc3dvcmRIaXN0b3J5Vmlldyc7XG5pbXBvcnQgeyBWaWV3IH0gZnJvbSAnLi4vbW9kZWxzL3ZpZXcvdmlldyc7XG5cbmltcG9ydCB7IFNvcnRlZENpcGhlcnNDYWNoZSB9IGZyb20gJy4uL21vZGVscy9kb21haW4vc29ydGVkQ2lwaGVyc0NhY2hlJztcblxuaW1wb3J0IHsgQXBpU2VydmljZSB9IGZyb20gJy4uL2Fic3RyYWN0aW9ucy9hcGkuc2VydmljZSc7XG5pbXBvcnQgeyBDaXBoZXJTZXJ2aWNlIGFzIENpcGhlclNlcnZpY2VBYnN0cmFjdGlvbiB9IGZyb20gJy4uL2Fic3RyYWN0aW9ucy9jaXBoZXIuc2VydmljZSc7XG5pbXBvcnQgeyBDcnlwdG9TZXJ2aWNlIH0gZnJvbSAnLi4vYWJzdHJhY3Rpb25zL2NyeXB0by5zZXJ2aWNlJztcbmltcG9ydCB7IEZpbGVVcGxvYWRTZXJ2aWNlIH0gZnJvbSAnLi4vYWJzdHJhY3Rpb25zL2ZpbGVVcGxvYWQuc2VydmljZSc7XG5pbXBvcnQgeyBJMThuU2VydmljZSB9IGZyb20gJy4uL2Fic3RyYWN0aW9ucy9pMThuLnNlcnZpY2UnO1xuaW1wb3J0IHsgU2VhcmNoU2VydmljZSB9IGZyb20gJy4uL2Fic3RyYWN0aW9ucy9zZWFyY2guc2VydmljZSc7XG5pbXBvcnQgeyBTZXR0aW5nc1NlcnZpY2UgfSBmcm9tICcuLi9hYnN0cmFjdGlvbnMvc2V0dGluZ3Muc2VydmljZSc7XG5pbXBvcnQgeyBTdG9yYWdlU2VydmljZSB9IGZyb20gJy4uL2Fic3RyYWN0aW9ucy9zdG9yYWdlLnNlcnZpY2UnO1xuaW1wb3J0IHsgVXNlclNlcnZpY2UgfSBmcm9tICcuLi9hYnN0cmFjdGlvbnMvdXNlci5zZXJ2aWNlJztcblxuaW1wb3J0IHsgQ29uc3RhbnRzU2VydmljZSB9IGZyb20gJy4vY29uc3RhbnRzLnNlcnZpY2UnO1xuXG5pbXBvcnQgeyBMb2dTZXJ2aWNlIH0gZnJvbSAnLi4vYWJzdHJhY3Rpb25zL2xvZy5zZXJ2aWNlJztcbmltcG9ydCB7IHNlcXVlbnRpYWxpemUgfSBmcm9tICcuLi9taXNjL3NlcXVlbnRpYWxpemUnO1xuaW1wb3J0IHsgVXRpbHMgfSBmcm9tICcuLi9taXNjL3V0aWxzJztcblxuY29uc3QgS2V5cyA9IHtcbiAgICBjaXBoZXJzUHJlZml4OiAnY2lwaGVyc18nLFxuICAgIGxvY2FsRGF0YTogJ3NpdGVzTG9jYWxEYXRhJyxcbiAgICBuZXZlckRvbWFpbnM6ICduZXZlckRvbWFpbnMnLFxufTtcblxuY29uc3QgRG9tYWluTWF0Y2hCbGFja2xpc3QgPSBuZXcgTWFwPHN0cmluZywgU2V0PHN0cmluZz4+KFtcbiAgICBbJ2dvb2dsZS5jb20nLCBuZXcgU2V0KFsnc2NyaXB0Lmdvb2dsZS5jb20nXSldLFxuXSk7XG5cbmV4cG9ydCBjbGFzcyBDaXBoZXJTZXJ2aWNlIGltcGxlbWVudHMgQ2lwaGVyU2VydmljZUFic3RyYWN0aW9uIHtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmVcbiAgICBfZGVjcnlwdGVkQ2lwaGVyQ2FjaGU6IENpcGhlclZpZXdbXTtcblxuICAgIHByaXZhdGUgc29ydGVkQ2lwaGVyc0NhY2hlOiBTb3J0ZWRDaXBoZXJzQ2FjaGUgPSBuZXcgU29ydGVkQ2lwaGVyc0NhY2hlKHRoaXMuc29ydENpcGhlcnNCeUxhc3RVc2VkKTtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgY3J5cHRvU2VydmljZTogQ3J5cHRvU2VydmljZSwgcHJpdmF0ZSB1c2VyU2VydmljZTogVXNlclNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgc2V0dGluZ3NTZXJ2aWNlOiBTZXR0aW5nc1NlcnZpY2UsIHByaXZhdGUgYXBpU2VydmljZTogQXBpU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBmaWxlVXBsb2FkU2VydmljZTogRmlsZVVwbG9hZFNlcnZpY2UsIHByaXZhdGUgc3RvcmFnZVNlcnZpY2U6IFN0b3JhZ2VTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGkxOG5TZXJ2aWNlOiBJMThuU2VydmljZSwgcHJpdmF0ZSBzZWFyY2hTZXJ2aWNlOiAoKSA9PiBTZWFyY2hTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGxvZ1NlcnZpY2U6IExvZ1NlcnZpY2UpIHtcbiAgICB9XG5cbiAgICBnZXQgZGVjcnlwdGVkQ2lwaGVyQ2FjaGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWNyeXB0ZWRDaXBoZXJDYWNoZTtcbiAgICB9XG4gICAgc2V0IGRlY3J5cHRlZENpcGhlckNhY2hlKHZhbHVlOiBDaXBoZXJWaWV3W10pIHtcbiAgICAgICAgdGhpcy5fZGVjcnlwdGVkQ2lwaGVyQ2FjaGUgPSB2YWx1ZTtcbiAgICAgICAgaWYgKHRoaXMuc2VhcmNoU2VydmljZSAhPSBudWxsKSB7XG4gICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoU2VydmljZSgpLmNsZWFySW5kZXgoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWFyY2hTZXJ2aWNlKCkuaW5kZXhDaXBoZXJzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjbGVhckNhY2hlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmRlY3J5cHRlZENpcGhlckNhY2hlID0gbnVsbDtcbiAgICAgICAgdGhpcy5zb3J0ZWRDaXBoZXJzQ2FjaGUuY2xlYXIoKTtcbiAgICB9XG5cbiAgICBhc3luYyBlbmNyeXB0KG1vZGVsOiBDaXBoZXJWaWV3LCBrZXk/OiBTeW1tZXRyaWNDcnlwdG9LZXksIG9yaWdpbmFsQ2lwaGVyOiBDaXBoZXIgPSBudWxsKTogUHJvbWlzZTxDaXBoZXI+IHtcbiAgICAgICAgLy8gQWRqdXN0IHBhc3N3b3JkIGhpc3RvcnlcbiAgICAgICAgaWYgKG1vZGVsLmlkICE9IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChvcmlnaW5hbENpcGhlciA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgb3JpZ2luYWxDaXBoZXIgPSBhd2FpdCB0aGlzLmdldChtb2RlbC5pZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob3JpZ2luYWxDaXBoZXIgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nQ2lwaGVyID0gYXdhaXQgb3JpZ2luYWxDaXBoZXIuZGVjcnlwdCgpO1xuICAgICAgICAgICAgICAgIG1vZGVsLnBhc3N3b3JkSGlzdG9yeSA9IGV4aXN0aW5nQ2lwaGVyLnBhc3N3b3JkSGlzdG9yeSB8fCBbXTtcbiAgICAgICAgICAgICAgICBpZiAobW9kZWwudHlwZSA9PT0gQ2lwaGVyVHlwZS5Mb2dpbiAmJiBleGlzdGluZ0NpcGhlci50eXBlID09PSBDaXBoZXJUeXBlLkxvZ2luKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChleGlzdGluZ0NpcGhlci5sb2dpbi5wYXNzd29yZCAhPSBudWxsICYmIGV4aXN0aW5nQ2lwaGVyLmxvZ2luLnBhc3N3b3JkICE9PSAnJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdDaXBoZXIubG9naW4ucGFzc3dvcmQgIT09IG1vZGVsLmxvZ2luLnBhc3N3b3JkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwaCA9IG5ldyBQYXNzd29yZEhpc3RvcnlWaWV3KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwaC5wYXNzd29yZCA9IGV4aXN0aW5nQ2lwaGVyLmxvZ2luLnBhc3N3b3JkO1xuICAgICAgICAgICAgICAgICAgICAgICAgcGgubGFzdFVzZWREYXRlID0gbW9kZWwubG9naW4ucGFzc3dvcmRSZXZpc2lvbkRhdGUgPSBuZXcgRGF0ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwucGFzc3dvcmRIaXN0b3J5LnNwbGljZSgwLCAwLCBwaCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC5sb2dpbi5wYXNzd29yZFJldmlzaW9uRGF0ZSA9IGV4aXN0aW5nQ2lwaGVyLmxvZ2luLnBhc3N3b3JkUmV2aXNpb25EYXRlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChleGlzdGluZ0NpcGhlci5oYXNGaWVsZHMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXhpc3RpbmdIaWRkZW5GaWVsZHMgPSBleGlzdGluZ0NpcGhlci5maWVsZHMuZmlsdGVyKGYgPT4gZi50eXBlID09PSBGaWVsZFR5cGUuSGlkZGVuICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBmLm5hbWUgIT0gbnVsbCAmJiBmLm5hbWUgIT09ICcnICYmIGYudmFsdWUgIT0gbnVsbCAmJiBmLnZhbHVlICE9PSAnJyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGRlbkZpZWxkcyA9IG1vZGVsLmZpZWxkcyA9PSBudWxsID8gW10gOlxuICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwuZmllbGRzLmZpbHRlcihmID0+IGYudHlwZSA9PT0gRmllbGRUeXBlLkhpZGRlbiAmJiBmLm5hbWUgIT0gbnVsbCAmJiBmLm5hbWUgIT09ICcnKTtcbiAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdIaWRkZW5GaWVsZHMuZm9yRWFjaChlZiA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXRjaGVkRmllbGQgPSBoaWRkZW5GaWVsZHMuZmluZChmID0+IGYubmFtZSA9PT0gZWYubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2hlZEZpZWxkID09IG51bGwgfHwgbWF0Y2hlZEZpZWxkLnZhbHVlICE9PSBlZi52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBoID0gbmV3IFBhc3N3b3JkSGlzdG9yeVZpZXcoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaC5wYXNzd29yZCA9IGVmLm5hbWUgKyAnOiAnICsgZWYudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGgubGFzdFVzZWREYXRlID0gbmV3IERhdGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC5wYXNzd29yZEhpc3Rvcnkuc3BsaWNlKDAsIDAsIHBoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1vZGVsLnBhc3N3b3JkSGlzdG9yeSAhPSBudWxsICYmIG1vZGVsLnBhc3N3b3JkSGlzdG9yeS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICBtb2RlbC5wYXNzd29yZEhpc3RvcnkgPSBudWxsO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtb2RlbC5wYXNzd29yZEhpc3RvcnkgIT0gbnVsbCAmJiBtb2RlbC5wYXNzd29yZEhpc3RvcnkubGVuZ3RoID4gNSkge1xuICAgICAgICAgICAgICAgIC8vIG9ubHkgc2F2ZSBsYXN0IDUgaGlzdG9yeVxuICAgICAgICAgICAgICAgIG1vZGVsLnBhc3N3b3JkSGlzdG9yeSA9IG1vZGVsLnBhc3N3b3JkSGlzdG9yeS5zbGljZSgwLCA1KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNpcGhlciA9IG5ldyBDaXBoZXIoKTtcbiAgICAgICAgY2lwaGVyLmlkID0gbW9kZWwuaWQ7XG4gICAgICAgIGNpcGhlci5mb2xkZXJJZCA9IG1vZGVsLmZvbGRlcklkO1xuICAgICAgICBjaXBoZXIuZmF2b3JpdGUgPSBtb2RlbC5mYXZvcml0ZTtcbiAgICAgICAgY2lwaGVyLm9yZ2FuaXphdGlvbklkID0gbW9kZWwub3JnYW5pemF0aW9uSWQ7XG4gICAgICAgIGNpcGhlci50eXBlID0gbW9kZWwudHlwZTtcbiAgICAgICAgY2lwaGVyLmNvbGxlY3Rpb25JZHMgPSBtb2RlbC5jb2xsZWN0aW9uSWRzO1xuICAgICAgICBjaXBoZXIucmV2aXNpb25EYXRlID0gbW9kZWwucmV2aXNpb25EYXRlO1xuICAgICAgICBjaXBoZXIucmVwcm9tcHQgPSBtb2RlbC5yZXByb21wdDtcblxuICAgICAgICBpZiAoa2V5ID09IG51bGwgJiYgY2lwaGVyLm9yZ2FuaXphdGlvbklkICE9IG51bGwpIHtcbiAgICAgICAgICAgIGtleSA9IGF3YWl0IHRoaXMuY3J5cHRvU2VydmljZS5nZXRPcmdLZXkoY2lwaGVyLm9yZ2FuaXphdGlvbklkKTtcbiAgICAgICAgICAgIGlmIChrZXkgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGVuY3J5cHQgY2lwaGVyIGZvciBvcmdhbml6YXRpb24uIE5vIGtleS4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICB0aGlzLmVuY3J5cHRPYmpQcm9wZXJ0eShtb2RlbCwgY2lwaGVyLCB7XG4gICAgICAgICAgICAgICAgbmFtZTogbnVsbCxcbiAgICAgICAgICAgICAgICBub3RlczogbnVsbCxcbiAgICAgICAgICAgIH0sIGtleSksXG4gICAgICAgICAgICB0aGlzLmVuY3J5cHRDaXBoZXJEYXRhKGNpcGhlciwgbW9kZWwsIGtleSksXG4gICAgICAgICAgICB0aGlzLmVuY3J5cHRGaWVsZHMobW9kZWwuZmllbGRzLCBrZXkpLnRoZW4oZmllbGRzID0+IHtcbiAgICAgICAgICAgICAgICBjaXBoZXIuZmllbGRzID0gZmllbGRzO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB0aGlzLmVuY3J5cHRQYXNzd29yZEhpc3Rvcmllcyhtb2RlbC5wYXNzd29yZEhpc3RvcnksIGtleSkudGhlbihwaCA9PiB7XG4gICAgICAgICAgICAgICAgY2lwaGVyLnBhc3N3b3JkSGlzdG9yeSA9IHBoO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB0aGlzLmVuY3J5cHRBdHRhY2htZW50cyhtb2RlbC5hdHRhY2htZW50cywga2V5KS50aGVuKGF0dGFjaG1lbnRzID0+IHtcbiAgICAgICAgICAgICAgICBjaXBoZXIuYXR0YWNobWVudHMgPSBhdHRhY2htZW50cztcbiAgICAgICAgICAgIH0pLFxuICAgICAgICBdKTtcblxuICAgICAgICByZXR1cm4gY2lwaGVyO1xuICAgIH1cblxuICAgIGFzeW5jIGVuY3J5cHRBdHRhY2htZW50cyhhdHRhY2htZW50c01vZGVsOiBBdHRhY2htZW50Vmlld1tdLCBrZXk6IFN5bW1ldHJpY0NyeXB0b0tleSk6IFByb21pc2U8QXR0YWNobWVudFtdPiB7XG4gICAgICAgIGlmIChhdHRhY2htZW50c01vZGVsID09IG51bGwgfHwgYXR0YWNobWVudHNNb2RlbC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcHJvbWlzZXM6IFByb21pc2U8YW55PltdID0gW107XG4gICAgICAgIGNvbnN0IGVuY0F0dGFjaG1lbnRzOiBBdHRhY2htZW50W10gPSBbXTtcbiAgICAgICAgYXR0YWNobWVudHNNb2RlbC5mb3JFYWNoKGFzeW5jIG1vZGVsID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGF0dGFjaG1lbnQgPSBuZXcgQXR0YWNobWVudCgpO1xuICAgICAgICAgICAgYXR0YWNobWVudC5pZCA9IG1vZGVsLmlkO1xuICAgICAgICAgICAgYXR0YWNobWVudC5zaXplID0gbW9kZWwuc2l6ZTtcbiAgICAgICAgICAgIGF0dGFjaG1lbnQuc2l6ZU5hbWUgPSBtb2RlbC5zaXplTmFtZTtcbiAgICAgICAgICAgIGF0dGFjaG1lbnQudXJsID0gbW9kZWwudXJsO1xuICAgICAgICAgICAgY29uc3QgcHJvbWlzZSA9IHRoaXMuZW5jcnlwdE9ialByb3BlcnR5KG1vZGVsLCBhdHRhY2htZW50LCB7XG4gICAgICAgICAgICAgICAgZmlsZU5hbWU6IG51bGwsXG4gICAgICAgICAgICB9LCBrZXkpLnRoZW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChtb2RlbC5rZXkgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBhdHRhY2htZW50LmtleSA9IGF3YWl0IHRoaXMuY3J5cHRvU2VydmljZS5lbmNyeXB0KG1vZGVsLmtleS5rZXksIGtleSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVuY0F0dGFjaG1lbnRzLnB1c2goYXR0YWNobWVudCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHByb21pc2VzLnB1c2gocHJvbWlzZSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgICAgICAgcmV0dXJuIGVuY0F0dGFjaG1lbnRzO1xuICAgIH1cblxuICAgIGFzeW5jIGVuY3J5cHRGaWVsZHMoZmllbGRzTW9kZWw6IEZpZWxkVmlld1tdLCBrZXk6IFN5bW1ldHJpY0NyeXB0b0tleSk6IFByb21pc2U8RmllbGRbXT4ge1xuICAgICAgICBpZiAoIWZpZWxkc01vZGVsIHx8ICFmaWVsZHNNb2RlbC5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgICAgIGNvbnN0IGVuY0ZpZWxkczogRmllbGRbXSA9IFtdO1xuICAgICAgICBhd2FpdCBmaWVsZHNNb2RlbC5yZWR1Y2UoKHByb21pc2UsIGZpZWxkKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzZS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5lbmNyeXB0RmllbGQoZmllbGQsIGtleSk7XG4gICAgICAgICAgICB9KS50aGVuKChlbmNGaWVsZDogRmllbGQpID0+IHtcbiAgICAgICAgICAgICAgICBlbmNGaWVsZHMucHVzaChlbmNGaWVsZCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSwgUHJvbWlzZS5yZXNvbHZlKCkpO1xuXG4gICAgICAgIHJldHVybiBlbmNGaWVsZHM7XG4gICAgfVxuXG4gICAgYXN5bmMgZW5jcnlwdEZpZWxkKGZpZWxkTW9kZWw6IEZpZWxkVmlldywga2V5OiBTeW1tZXRyaWNDcnlwdG9LZXkpOiBQcm9taXNlPEZpZWxkPiB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gbmV3IEZpZWxkKCk7XG4gICAgICAgIGZpZWxkLnR5cGUgPSBmaWVsZE1vZGVsLnR5cGU7XG4gICAgICAgIGZpZWxkLmxpbmtlZElkID0gZmllbGRNb2RlbC5saW5rZWRJZDtcbiAgICAgICAgLy8gbm9ybWFsaXplIGJvb2xlYW4gdHlwZSBmaWVsZCB2YWx1ZXNcbiAgICAgICAgaWYgKGZpZWxkTW9kZWwudHlwZSA9PT0gRmllbGRUeXBlLkJvb2xlYW4gJiYgZmllbGRNb2RlbC52YWx1ZSAhPT0gJ3RydWUnKSB7XG4gICAgICAgICAgICBmaWVsZE1vZGVsLnZhbHVlID0gJ2ZhbHNlJztcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IHRoaXMuZW5jcnlwdE9ialByb3BlcnR5KGZpZWxkTW9kZWwsIGZpZWxkLCB7XG4gICAgICAgICAgICBuYW1lOiBudWxsLFxuICAgICAgICAgICAgdmFsdWU6IG51bGwsXG4gICAgICAgIH0sIGtleSk7XG5cbiAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgIH1cblxuICAgIGFzeW5jIGVuY3J5cHRQYXNzd29yZEhpc3RvcmllcyhwaE1vZGVsczogUGFzc3dvcmRIaXN0b3J5Vmlld1tdLCBrZXk6IFN5bW1ldHJpY0NyeXB0b0tleSk6IFByb21pc2U8UGFzc3dvcmRbXT4ge1xuICAgICAgICBpZiAoIXBoTW9kZWxzIHx8ICFwaE1vZGVscy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgICAgIGNvbnN0IGVuY1BoczogUGFzc3dvcmRbXSA9IFtdO1xuICAgICAgICBhd2FpdCBwaE1vZGVscy5yZWR1Y2UoKHByb21pc2UsIHBoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzZS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5lbmNyeXB0UGFzc3dvcmRIaXN0b3J5KHBoLCBrZXkpO1xuICAgICAgICAgICAgfSkudGhlbigoZW5jUGg6IFBhc3N3b3JkKSA9PiB7XG4gICAgICAgICAgICAgICAgZW5jUGhzLnB1c2goZW5jUGgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sIFByb21pc2UucmVzb2x2ZSgpKTtcblxuICAgICAgICByZXR1cm4gZW5jUGhzO1xuICAgIH1cblxuICAgIGFzeW5jIGVuY3J5cHRQYXNzd29yZEhpc3RvcnkocGhNb2RlbDogUGFzc3dvcmRIaXN0b3J5Vmlldywga2V5OiBTeW1tZXRyaWNDcnlwdG9LZXkpOiBQcm9taXNlPFBhc3N3b3JkPiB7XG4gICAgICAgIGNvbnN0IHBoID0gbmV3IFBhc3N3b3JkKCk7XG4gICAgICAgIHBoLmxhc3RVc2VkRGF0ZSA9IHBoTW9kZWwubGFzdFVzZWREYXRlO1xuXG4gICAgICAgIGF3YWl0IHRoaXMuZW5jcnlwdE9ialByb3BlcnR5KHBoTW9kZWwsIHBoLCB7XG4gICAgICAgICAgICBwYXNzd29yZDogbnVsbCxcbiAgICAgICAgfSwga2V5KTtcblxuICAgICAgICByZXR1cm4gcGg7XG4gICAgfVxuXG4gICAgYXN5bmMgZ2V0KGlkOiBzdHJpbmcpOiBQcm9taXNlPENpcGhlcj4ge1xuICAgICAgICBjb25zdCB1c2VySWQgPSBhd2FpdCB0aGlzLnVzZXJTZXJ2aWNlLmdldFVzZXJJZCgpO1xuICAgICAgICBjb25zdCBsb2NhbERhdGEgPSBhd2FpdCB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldDxhbnk+KEtleXMubG9jYWxEYXRhKTtcbiAgICAgICAgY29uc3QgY2lwaGVycyA9IGF3YWl0IHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0PHsgW2lkOiBzdHJpbmddOiBDaXBoZXJEYXRhOyB9PihcbiAgICAgICAgICAgIEtleXMuY2lwaGVyc1ByZWZpeCArIHVzZXJJZCk7XG4gICAgICAgIGlmIChjaXBoZXJzID09IG51bGwgfHwgIWNpcGhlcnMuaGFzT3duUHJvcGVydHkoaWQpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgQ2lwaGVyKGNpcGhlcnNbaWRdLCBmYWxzZSwgbG9jYWxEYXRhID8gbG9jYWxEYXRhW2lkXSA6IG51bGwpO1xuICAgIH1cblxuICAgIGFzeW5jIGdldEFsbCgpOiBQcm9taXNlPENpcGhlcltdPiB7XG4gICAgICAgIGNvbnN0IHVzZXJJZCA9IGF3YWl0IHRoaXMudXNlclNlcnZpY2UuZ2V0VXNlcklkKCk7XG4gICAgICAgIGNvbnN0IGxvY2FsRGF0YSA9IGF3YWl0IHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0PGFueT4oS2V5cy5sb2NhbERhdGEpO1xuICAgICAgICBjb25zdCBjaXBoZXJzID0gYXdhaXQgdGhpcy5zdG9yYWdlU2VydmljZS5nZXQ8eyBbaWQ6IHN0cmluZ106IENpcGhlckRhdGE7IH0+KFxuICAgICAgICAgICAgS2V5cy5jaXBoZXJzUHJlZml4ICsgdXNlcklkKTtcbiAgICAgICAgY29uc3QgcmVzcG9uc2U6IENpcGhlcltdID0gW107XG4gICAgICAgIGZvciAoY29uc3QgaWQgaW4gY2lwaGVycykge1xuICAgICAgICAgICAgaWYgKGNpcGhlcnMuaGFzT3duUHJvcGVydHkoaWQpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2UucHVzaChuZXcgQ2lwaGVyKGNpcGhlcnNbaWRdLCBmYWxzZSwgbG9jYWxEYXRhID8gbG9jYWxEYXRhW2lkXSA6IG51bGwpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgfVxuXG4gICAgQHNlcXVlbnRpYWxpemUoKCkgPT4gJ2dldEFsbERlY3J5cHRlZCcpXG4gICAgYXN5bmMgZ2V0QWxsRGVjcnlwdGVkKCk6IFByb21pc2U8Q2lwaGVyVmlld1tdPiB7XG4gICAgICAgIGlmICh0aGlzLmRlY3J5cHRlZENpcGhlckNhY2hlICE9IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IHVzZXJJZCA9IGF3YWl0IHRoaXMudXNlclNlcnZpY2UuZ2V0VXNlcklkKCk7XG4gICAgICAgICAgICBpZiAodGhpcy5zZWFyY2hTZXJ2aWNlICE9IG51bGwgJiYgKHRoaXMuc2VhcmNoU2VydmljZSgpLmluZGV4ZWRFbnRpdHlJZCA/PyB1c2VySWQpICE9PSB1c2VySWQpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zZWFyY2hTZXJ2aWNlKCkuaW5kZXhDaXBoZXJzKHVzZXJJZCwgdGhpcy5kZWNyeXB0ZWRDaXBoZXJDYWNoZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kZWNyeXB0ZWRDaXBoZXJDYWNoZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRlY0NpcGhlcnM6IENpcGhlclZpZXdbXSA9IFtdO1xuICAgICAgICBjb25zdCBoYXNLZXkgPSBhd2FpdCB0aGlzLmNyeXB0b1NlcnZpY2UuaGFzS2V5KCk7XG4gICAgICAgIGlmICghaGFzS2V5KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGtleS4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHByb21pc2VzOiBhbnlbXSA9IFtdO1xuICAgICAgICBjb25zdCBjaXBoZXJzID0gYXdhaXQgdGhpcy5nZXRBbGwoKTtcbiAgICAgICAgY2lwaGVycy5mb3JFYWNoKGNpcGhlciA9PiB7XG4gICAgICAgICAgICBwcm9taXNlcy5wdXNoKGNpcGhlci5kZWNyeXB0KCkudGhlbihjID0+IGRlY0NpcGhlcnMucHVzaChjKSkpO1xuICAgICAgICB9KTtcblxuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gICAgICAgIGRlY0NpcGhlcnMuc29ydCh0aGlzLmdldExvY2FsZVNvcnRpbmdGdW5jdGlvbigpKTtcbiAgICAgICAgdGhpcy5kZWNyeXB0ZWRDaXBoZXJDYWNoZSA9IGRlY0NpcGhlcnM7XG4gICAgICAgIHJldHVybiB0aGlzLmRlY3J5cHRlZENpcGhlckNhY2hlO1xuICAgIH1cblxuICAgIGFzeW5jIGdldEFsbERlY3J5cHRlZEZvckdyb3VwaW5nKGdyb3VwaW5nSWQ6IHN0cmluZywgZm9sZGVyOiBib29sZWFuID0gdHJ1ZSk6IFByb21pc2U8Q2lwaGVyVmlld1tdPiB7XG4gICAgICAgIGNvbnN0IGNpcGhlcnMgPSBhd2FpdCB0aGlzLmdldEFsbERlY3J5cHRlZCgpO1xuXG4gICAgICAgIHJldHVybiBjaXBoZXJzLmZpbHRlcihjaXBoZXIgPT4ge1xuICAgICAgICAgICAgaWYgKGNpcGhlci5pc0RlbGV0ZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZm9sZGVyICYmIGNpcGhlci5mb2xkZXJJZCA9PT0gZ3JvdXBpbmdJZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfSBlbHNlIGlmICghZm9sZGVyICYmIGNpcGhlci5jb2xsZWN0aW9uSWRzICE9IG51bGwgJiYgY2lwaGVyLmNvbGxlY3Rpb25JZHMuaW5kZXhPZihncm91cGluZ0lkKSA+IC0xKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgYXN5bmMgZ2V0QWxsRGVjcnlwdGVkRm9yVXJsKHVybDogc3RyaW5nLCBpbmNsdWRlT3RoZXJUeXBlcz86IENpcGhlclR5cGVbXSxcbiAgICAgICAgZGVmYXVsdE1hdGNoOiBVcmlNYXRjaFR5cGUgPSBudWxsKTogUHJvbWlzZTxDaXBoZXJWaWV3W10+IHtcbiAgICAgICAgaWYgKHVybCA9PSBudWxsICYmIGluY2x1ZGVPdGhlclR5cGVzID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoW10pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZG9tYWluID0gVXRpbHMuZ2V0RG9tYWluKHVybCk7XG4gICAgICAgIGNvbnN0IGVxRG9tYWluc1Byb21pc2UgPSBkb21haW4gPT0gbnVsbCA/IFByb21pc2UucmVzb2x2ZShbXSkgOlxuICAgICAgICAgICAgdGhpcy5zZXR0aW5nc1NlcnZpY2UuZ2V0RXF1aXZhbGVudERvbWFpbnMoKS50aGVuKChlcURvbWFpbnM6IGFueVtdW10pID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgbWF0Y2hlczogYW55W10gPSBbXTtcbiAgICAgICAgICAgICAgICBlcURvbWFpbnMuZm9yRWFjaChlcURvbWFpbiA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcURvbWFpbi5sZW5ndGggJiYgZXFEb21haW4uaW5kZXhPZihkb21haW4pID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZXMgPSBtYXRjaGVzLmNvbmNhdChlcURvbWFpbik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIGlmICghbWF0Y2hlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgbWF0Y2hlcy5wdXNoKGRvbWFpbik7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIG1hdGNoZXM7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBQcm9taXNlLmFsbChbZXFEb21haW5zUHJvbWlzZSwgdGhpcy5nZXRBbGxEZWNyeXB0ZWQoKV0pO1xuICAgICAgICBjb25zdCBtYXRjaGluZ0RvbWFpbnMgPSByZXN1bHRbMF07XG4gICAgICAgIGNvbnN0IGNpcGhlcnMgPSByZXN1bHRbMV07XG5cbiAgICAgICAgaWYgKGRlZmF1bHRNYXRjaCA9PSBudWxsKSB7XG4gICAgICAgICAgICBkZWZhdWx0TWF0Y2ggPSBhd2FpdCB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldDxVcmlNYXRjaFR5cGU+KENvbnN0YW50c1NlcnZpY2UuZGVmYXVsdFVyaU1hdGNoKTtcbiAgICAgICAgICAgIGlmIChkZWZhdWx0TWF0Y2ggPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGRlZmF1bHRNYXRjaCA9IFVyaU1hdGNoVHlwZS5Eb21haW47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY2lwaGVycy5maWx0ZXIoY2lwaGVyID0+IHtcbiAgICAgICAgICAgIGlmIChjaXBoZXIuZGVsZXRlZERhdGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpbmNsdWRlT3RoZXJUeXBlcyAhPSBudWxsICYmIGluY2x1ZGVPdGhlclR5cGVzLmluZGV4T2YoY2lwaGVyLnR5cGUpID4gLTEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHVybCAhPSBudWxsICYmIGNpcGhlci50eXBlID09PSBDaXBoZXJUeXBlLkxvZ2luICYmIGNpcGhlci5sb2dpbi51cmlzICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNpcGhlci5sb2dpbi51cmlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHUgPSBjaXBoZXIubG9naW4udXJpc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUudXJpID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSB1Lm1hdGNoID09IG51bGwgPyBkZWZhdWx0TWF0Y2ggOiB1Lm1hdGNoO1xuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFVyaU1hdGNoVHlwZS5Eb21haW46XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRvbWFpbiAhPSBudWxsICYmIHUuZG9tYWluICE9IG51bGwgJiYgbWF0Y2hpbmdEb21haW5zLmluZGV4T2YodS5kb21haW4pID4gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERvbWFpbk1hdGNoQmxhY2tsaXN0Lmhhcyh1LmRvbWFpbikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvbWFpblVybEhvc3QgPSBVdGlscy5nZXRIb3N0KHVybCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIURvbWFpbk1hdGNoQmxhY2tsaXN0LmdldCh1LmRvbWFpbikuaGFzKGRvbWFpblVybEhvc3QpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgVXJpTWF0Y2hUeXBlLkhvc3Q6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdXJsSG9zdCA9IFV0aWxzLmdldEhvc3QodXJsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodXJsSG9zdCAhPSBudWxsICYmIHVybEhvc3QgPT09IFV0aWxzLmdldEhvc3QodS51cmkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgVXJpTWF0Y2hUeXBlLkV4YWN0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1cmwgPT09IHUudXJpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgVXJpTWF0Y2hUeXBlLlN0YXJ0c1dpdGg6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVybC5zdGFydHNXaXRoKHUudXJpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFVyaU1hdGNoVHlwZS5SZWd1bGFyRXhwcmVzc2lvbjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWdleCA9IG5ldyBSZWdFeHAodS51cmksICdpJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWdleC50ZXN0KHVybCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ1NlcnZpY2UuZXJyb3IoZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBVcmlNYXRjaFR5cGUuTmV2ZXI6XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGFzeW5jIGdldEFsbEZyb21BcGlGb3JPcmdhbml6YXRpb24ob3JnYW5pemF0aW9uSWQ6IHN0cmluZyk6IFByb21pc2U8Q2lwaGVyVmlld1tdPiB7XG4gICAgICAgIGNvbnN0IGNpcGhlcnMgPSBhd2FpdCB0aGlzLmFwaVNlcnZpY2UuZ2V0Q2lwaGVyc09yZ2FuaXphdGlvbihvcmdhbml6YXRpb25JZCk7XG4gICAgICAgIGlmIChjaXBoZXJzICE9IG51bGwgJiYgY2lwaGVycy5kYXRhICE9IG51bGwgJiYgY2lwaGVycy5kYXRhLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgZGVjQ2lwaGVyczogQ2lwaGVyVmlld1tdID0gW107XG4gICAgICAgICAgICBjb25zdCBwcm9taXNlczogYW55W10gPSBbXTtcbiAgICAgICAgICAgIGNpcGhlcnMuZGF0YS5mb3JFYWNoKHIgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBuZXcgQ2lwaGVyRGF0YShyKTtcbiAgICAgICAgICAgICAgICBjb25zdCBjaXBoZXIgPSBuZXcgQ2lwaGVyKGRhdGEpO1xuICAgICAgICAgICAgICAgIHByb21pc2VzLnB1c2goY2lwaGVyLmRlY3J5cHQoKS50aGVuKGMgPT4gZGVjQ2lwaGVycy5wdXNoKGMpKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgICAgICAgICAgIGRlY0NpcGhlcnMuc29ydCh0aGlzLmdldExvY2FsZVNvcnRpbmdGdW5jdGlvbigpKTtcbiAgICAgICAgICAgIHJldHVybiBkZWNDaXBoZXJzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgZ2V0TGFzdFVzZWRGb3JVcmwodXJsOiBzdHJpbmcsIGF1dG9maWxsT25QYWdlTG9hZDogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTxDaXBoZXJWaWV3PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldENpcGhlckZvclVybCh1cmwsIHRydWUsIGZhbHNlLCBhdXRvZmlsbE9uUGFnZUxvYWQpO1xuICAgIH1cblxuICAgIGFzeW5jIGdldExhc3RMYXVuY2hlZEZvclVybCh1cmw6IHN0cmluZywgYXV0b2ZpbGxPblBhZ2VMb2FkOiBib29sZWFuID0gZmFsc2UpOiBQcm9taXNlPENpcGhlclZpZXc+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q2lwaGVyRm9yVXJsKHVybCwgZmFsc2UsIHRydWUsIGF1dG9maWxsT25QYWdlTG9hZCk7XG4gICAgfVxuXG4gICAgYXN5bmMgZ2V0TmV4dENpcGhlckZvclVybCh1cmw6IHN0cmluZyk6IFByb21pc2U8Q2lwaGVyVmlldz4ge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRDaXBoZXJGb3JVcmwodXJsLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTtcbiAgICB9XG5cbiAgICB1cGRhdGVMYXN0VXNlZEluZGV4Rm9yVXJsKHVybDogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuc29ydGVkQ2lwaGVyc0NhY2hlLnVwZGF0ZUxhc3RVc2VkSW5kZXgodXJsKTtcbiAgICB9XG5cbiAgICBhc3luYyB1cGRhdGVMYXN0VXNlZERhdGUoaWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsZXQgY2lwaGVyc0xvY2FsRGF0YSA9IGF3YWl0IHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0PGFueT4oS2V5cy5sb2NhbERhdGEpO1xuICAgICAgICBpZiAoIWNpcGhlcnNMb2NhbERhdGEpIHtcbiAgICAgICAgICAgIGNpcGhlcnNMb2NhbERhdGEgPSB7fTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjaXBoZXJzTG9jYWxEYXRhW2lkXSkge1xuICAgICAgICAgICAgY2lwaGVyc0xvY2FsRGF0YVtpZF0ubGFzdFVzZWREYXRlID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjaXBoZXJzTG9jYWxEYXRhW2lkXSA9IHtcbiAgICAgICAgICAgICAgICBsYXN0VXNlZERhdGU6IG5ldyBEYXRlKCkuZ2V0VGltZSgpLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2F2ZShLZXlzLmxvY2FsRGF0YSwgY2lwaGVyc0xvY2FsRGF0YSk7XG5cbiAgICAgICAgaWYgKHRoaXMuZGVjcnlwdGVkQ2lwaGVyQ2FjaGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmRlY3J5cHRlZENpcGhlckNhY2hlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBjYWNoZWQgPSB0aGlzLmRlY3J5cHRlZENpcGhlckNhY2hlW2ldO1xuICAgICAgICAgICAgaWYgKGNhY2hlZC5pZCA9PT0gaWQpIHtcbiAgICAgICAgICAgICAgICBjYWNoZWQubG9jYWxEYXRhID0gY2lwaGVyc0xvY2FsRGF0YVtpZF07XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyB1cGRhdGVMYXN0TGF1bmNoZWREYXRlKGlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbGV0IGNpcGhlcnNMb2NhbERhdGEgPSBhd2FpdCB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldDxhbnk+KEtleXMubG9jYWxEYXRhKTtcbiAgICAgICAgaWYgKCFjaXBoZXJzTG9jYWxEYXRhKSB7XG4gICAgICAgICAgICBjaXBoZXJzTG9jYWxEYXRhID0ge307XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2lwaGVyc0xvY2FsRGF0YVtpZF0pIHtcbiAgICAgICAgICAgIGNpcGhlcnNMb2NhbERhdGFbaWRdLmxhc3RMYXVuY2hlZCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2lwaGVyc0xvY2FsRGF0YVtpZF0gPSB7XG4gICAgICAgICAgICAgICAgbGFzdFVzZWREYXRlOiBuZXcgRGF0ZSgpLmdldFRpbWUoKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNhdmUoS2V5cy5sb2NhbERhdGEsIGNpcGhlcnNMb2NhbERhdGEpO1xuXG4gICAgICAgIGlmICh0aGlzLmRlY3J5cHRlZENpcGhlckNhY2hlID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5kZWNyeXB0ZWRDaXBoZXJDYWNoZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgY2FjaGVkID0gdGhpcy5kZWNyeXB0ZWRDaXBoZXJDYWNoZVtpXTtcbiAgICAgICAgICAgIGlmIChjYWNoZWQuaWQgPT09IGlkKSB7XG4gICAgICAgICAgICAgICAgY2FjaGVkLmxvY2FsRGF0YSA9IGNpcGhlcnNMb2NhbERhdGFbaWRdO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgc2F2ZU5ldmVyRG9tYWluKGRvbWFpbjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmIChkb21haW4gPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGRvbWFpbnMgPSBhd2FpdCB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldDx7IFtpZDogc3RyaW5nXTogYW55OyB9PihLZXlzLm5ldmVyRG9tYWlucyk7XG4gICAgICAgIGlmICghZG9tYWlucykge1xuICAgICAgICAgICAgZG9tYWlucyA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIGRvbWFpbnNbZG9tYWluXSA9IG51bGw7XG4gICAgICAgIGF3YWl0IHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2F2ZShLZXlzLm5ldmVyRG9tYWlucywgZG9tYWlucyk7XG4gICAgfVxuXG4gICAgYXN5bmMgc2F2ZVdpdGhTZXJ2ZXIoY2lwaGVyOiBDaXBoZXIpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICBsZXQgcmVzcG9uc2U6IENpcGhlclJlc3BvbnNlO1xuICAgICAgICBpZiAoY2lwaGVyLmlkID09IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChjaXBoZXIuY29sbGVjdGlvbklkcyAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVxdWVzdCA9IG5ldyBDaXBoZXJDcmVhdGVSZXF1ZXN0KGNpcGhlcik7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmFwaVNlcnZpY2UucG9zdENpcGhlckNyZWF0ZShyZXF1ZXN0KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVxdWVzdCA9IG5ldyBDaXBoZXJSZXF1ZXN0KGNpcGhlcik7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmFwaVNlcnZpY2UucG9zdENpcGhlcihyZXF1ZXN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNpcGhlci5pZCA9IHJlc3BvbnNlLmlkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgcmVxdWVzdCA9IG5ldyBDaXBoZXJSZXF1ZXN0KGNpcGhlcik7XG4gICAgICAgICAgICByZXNwb25zZSA9IGF3YWl0IHRoaXMuYXBpU2VydmljZS5wdXRDaXBoZXIoY2lwaGVyLmlkLCByZXF1ZXN0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHVzZXJJZCA9IGF3YWl0IHRoaXMudXNlclNlcnZpY2UuZ2V0VXNlcklkKCk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBuZXcgQ2lwaGVyRGF0YShyZXNwb25zZSwgdXNlcklkLCBjaXBoZXIuY29sbGVjdGlvbklkcyk7XG4gICAgICAgIGF3YWl0IHRoaXMudXBzZXJ0KGRhdGEpO1xuICAgIH1cblxuICAgIGFzeW5jIHNoYXJlV2l0aFNlcnZlcihjaXBoZXI6IENpcGhlclZpZXcsIG9yZ2FuaXphdGlvbklkOiBzdHJpbmcsIGNvbGxlY3Rpb25JZHM6IHN0cmluZ1tdKTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgY29uc3QgYXR0YWNobWVudFByb21pc2VzOiBQcm9taXNlPGFueT5bXSA9IFtdO1xuICAgICAgICBpZiAoY2lwaGVyLmF0dGFjaG1lbnRzICE9IG51bGwpIHtcbiAgICAgICAgICAgIGNpcGhlci5hdHRhY2htZW50cy5mb3JFYWNoKGF0dGFjaG1lbnQgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChhdHRhY2htZW50LmtleSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnRQcm9taXNlcy5wdXNoKHRoaXMuc2hhcmVBdHRhY2htZW50V2l0aFNlcnZlcihhdHRhY2htZW50LCBjaXBoZXIuaWQsIG9yZ2FuaXphdGlvbklkKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoYXR0YWNobWVudFByb21pc2VzKTtcblxuICAgICAgICBjaXBoZXIub3JnYW5pemF0aW9uSWQgPSBvcmdhbml6YXRpb25JZDtcbiAgICAgICAgY2lwaGVyLmNvbGxlY3Rpb25JZHMgPSBjb2xsZWN0aW9uSWRzO1xuICAgICAgICBjb25zdCBlbmNDaXBoZXIgPSBhd2FpdCB0aGlzLmVuY3J5cHQoY2lwaGVyKTtcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IG5ldyBDaXBoZXJTaGFyZVJlcXVlc3QoZW5jQ2lwaGVyKTtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmFwaVNlcnZpY2UucHV0U2hhcmVDaXBoZXIoY2lwaGVyLmlkLCByZXF1ZXN0KTtcbiAgICAgICAgY29uc3QgdXNlcklkID0gYXdhaXQgdGhpcy51c2VyU2VydmljZS5nZXRVc2VySWQoKTtcbiAgICAgICAgY29uc3QgZGF0YSA9IG5ldyBDaXBoZXJEYXRhKHJlc3BvbnNlLCB1c2VySWQsIGNvbGxlY3Rpb25JZHMpO1xuICAgICAgICBhd2FpdCB0aGlzLnVwc2VydChkYXRhKTtcbiAgICB9XG5cbiAgICBhc3luYyBzaGFyZU1hbnlXaXRoU2VydmVyKGNpcGhlcnM6IENpcGhlclZpZXdbXSwgb3JnYW5pemF0aW9uSWQ6IHN0cmluZywgY29sbGVjdGlvbklkczogc3RyaW5nW10pOiBQcm9taXNlPGFueT4ge1xuICAgICAgICBjb25zdCBwcm9taXNlczogUHJvbWlzZTxhbnk+W10gPSBbXTtcbiAgICAgICAgY29uc3QgZW5jQ2lwaGVyczogQ2lwaGVyW10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBjaXBoZXIgb2YgY2lwaGVycykge1xuICAgICAgICAgICAgY2lwaGVyLm9yZ2FuaXphdGlvbklkID0gb3JnYW5pemF0aW9uSWQ7XG4gICAgICAgICAgICBjaXBoZXIuY29sbGVjdGlvbklkcyA9IGNvbGxlY3Rpb25JZHM7XG4gICAgICAgICAgICBwcm9taXNlcy5wdXNoKHRoaXMuZW5jcnlwdChjaXBoZXIpLnRoZW4oYyA9PiB7XG4gICAgICAgICAgICAgICAgZW5jQ2lwaGVycy5wdXNoKGMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IG5ldyBDaXBoZXJCdWxrU2hhcmVSZXF1ZXN0KGVuY0NpcGhlcnMsIGNvbGxlY3Rpb25JZHMpO1xuICAgICAgICBhd2FpdCB0aGlzLmFwaVNlcnZpY2UucHV0U2hhcmVDaXBoZXJzKHJlcXVlc3QpO1xuICAgICAgICBjb25zdCB1c2VySWQgPSBhd2FpdCB0aGlzLnVzZXJTZXJ2aWNlLmdldFVzZXJJZCgpO1xuICAgICAgICBhd2FpdCB0aGlzLnVwc2VydChlbmNDaXBoZXJzLm1hcChjID0+IGMudG9DaXBoZXJEYXRhKHVzZXJJZCkpKTtcbiAgICB9XG5cbiAgICBzYXZlQXR0YWNobWVudFdpdGhTZXJ2ZXIoY2lwaGVyOiBDaXBoZXIsIHVuZW5jcnlwdGVkRmlsZTogYW55LCBhZG1pbiA9IGZhbHNlKTogUHJvbWlzZTxDaXBoZXI+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgICAgICAgICByZWFkZXIucmVhZEFzQXJyYXlCdWZmZXIodW5lbmNyeXB0ZWRGaWxlKTtcbiAgICAgICAgICAgIHJlYWRlci5vbmxvYWQgPSBhc3luYyAoZXZ0OiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjRGF0YSA9IGF3YWl0IHRoaXMuc2F2ZUF0dGFjaG1lbnRSYXdXaXRoU2VydmVyKGNpcGhlcixcbiAgICAgICAgICAgICAgICAgICAgICAgIHVuZW5jcnlwdGVkRmlsZS5uYW1lLCBldnQudGFyZ2V0LnJlc3VsdCwgYWRtaW4pO1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGNEYXRhKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmVhZGVyLm9uZXJyb3IgPSBldnQgPT4ge1xuICAgICAgICAgICAgICAgIHJlamVjdCgnRXJyb3IgcmVhZGluZyBmaWxlLicpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgYXN5bmMgc2F2ZUF0dGFjaG1lbnRSYXdXaXRoU2VydmVyKGNpcGhlcjogQ2lwaGVyLCBmaWxlbmFtZTogc3RyaW5nLFxuICAgICAgICBkYXRhOiBBcnJheUJ1ZmZlciwgYWRtaW4gPSBmYWxzZSk6IFByb21pc2U8Q2lwaGVyPiB7XG4gICAgICAgIGNvbnN0IGtleSA9IGF3YWl0IHRoaXMuY3J5cHRvU2VydmljZS5nZXRPcmdLZXkoY2lwaGVyLm9yZ2FuaXphdGlvbklkKTtcbiAgICAgICAgY29uc3QgZW5jRmlsZU5hbWUgPSBhd2FpdCB0aGlzLmNyeXB0b1NlcnZpY2UuZW5jcnlwdChmaWxlbmFtZSwga2V5KTtcblxuICAgICAgICBjb25zdCBkYXRhRW5jS2V5ID0gYXdhaXQgdGhpcy5jcnlwdG9TZXJ2aWNlLm1ha2VFbmNLZXkoa2V5KTtcbiAgICAgICAgY29uc3QgZW5jRGF0YSA9IGF3YWl0IHRoaXMuY3J5cHRvU2VydmljZS5lbmNyeXB0VG9CeXRlcyhkYXRhLCBkYXRhRW5jS2V5WzBdKTtcblxuICAgICAgICBjb25zdCByZXF1ZXN0OiBBdHRhY2htZW50UmVxdWVzdCA9IHtcbiAgICAgICAgICAgIGtleTogZGF0YUVuY0tleVsxXS5lbmNyeXB0ZWRTdHJpbmcsXG4gICAgICAgICAgICBmaWxlTmFtZTogZW5jRmlsZU5hbWUuZW5jcnlwdGVkU3RyaW5nLFxuICAgICAgICAgICAgZmlsZVNpemU6IGVuY0RhdGEuYnVmZmVyLmJ5dGVMZW5ndGgsXG4gICAgICAgICAgICBhZG1pblJlcXVlc3Q6IGFkbWluLFxuICAgICAgICB9O1xuXG4gICAgICAgIGxldCByZXNwb25zZTogQ2lwaGVyUmVzcG9uc2U7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCB1cGxvYWREYXRhUmVzcG9uc2UgPSBhd2FpdCB0aGlzLmFwaVNlcnZpY2UucG9zdENpcGhlckF0dGFjaG1lbnQoY2lwaGVyLmlkLCByZXF1ZXN0KTtcbiAgICAgICAgICAgIHJlc3BvbnNlID0gYWRtaW4gPyB1cGxvYWREYXRhUmVzcG9uc2UuY2lwaGVyTWluaVJlc3BvbnNlIDogdXBsb2FkRGF0YVJlc3BvbnNlLmNpcGhlclJlc3BvbnNlO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5maWxlVXBsb2FkU2VydmljZS51cGxvYWRDaXBoZXJBdHRhY2htZW50KGFkbWluLCB1cGxvYWREYXRhUmVzcG9uc2UsIGVuY0ZpbGVOYW1lLCBlbmNEYXRhKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBFcnJvclJlc3BvbnNlICYmIChlIGFzIEVycm9yUmVzcG9uc2UpLnN0YXR1c0NvZGUgPT09IDQwNCB8fCAoZSBhcyBFcnJvclJlc3BvbnNlKS5zdGF0dXNDb2RlID09PSA0MDUpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZSA9IGF3YWl0IHRoaXMubGVnYWN5U2VydmVyQXR0YWNobWVudEZpbGVVcGxvYWQoYWRtaW4sIGNpcGhlci5pZCwgZW5jRmlsZU5hbWUsIGVuY0RhdGEsIGRhdGFFbmNLZXlbMV0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChlIGluc3RhbmNlb2YgRXJyb3JSZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigoZSBhcyBFcnJvclJlc3BvbnNlKS5nZXRTaW5nbGVNZXNzYWdlKCkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdXNlcklkID0gYXdhaXQgdGhpcy51c2VyU2VydmljZS5nZXRVc2VySWQoKTtcbiAgICAgICAgY29uc3QgY0RhdGEgPSBuZXcgQ2lwaGVyRGF0YShyZXNwb25zZSwgdXNlcklkLCBjaXBoZXIuY29sbGVjdGlvbklkcyk7XG4gICAgICAgIGlmICghYWRtaW4pIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMudXBzZXJ0KGNEYXRhKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IENpcGhlcihjRGF0YSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgTWFyIDI1IDIwMjE6IFRoaXMgbWV0aG9kIGhhcyBiZWVuIGRlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgZGlyZWN0IHVwbG9hZHMuXG4gICAgICogVGhpcyBtZXRob2Qgc3RpbGwgZXhpc3RzIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggb2xkIHNlcnZlciB2ZXJzaW9ucy5cbiAgICAgKi9cbiAgICBhc3luYyBsZWdhY3lTZXJ2ZXJBdHRhY2htZW50RmlsZVVwbG9hZChhZG1pbjogYm9vbGVhbiwgY2lwaGVySWQ6IHN0cmluZywgZW5jRmlsZU5hbWU6IEVuY1N0cmluZyxcbiAgICAgICAgZW5jRGF0YTogRW5jQXJyYXlCdWZmZXIsIGtleTogRW5jU3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IGZkID0gbmV3IEZvcm1EYXRhKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoW2VuY0RhdGEuYnVmZmVyXSwgeyB0eXBlOiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJyB9KTtcbiAgICAgICAgICAgIGZkLmFwcGVuZCgna2V5Jywga2V5LmVuY3J5cHRlZFN0cmluZyk7XG4gICAgICAgICAgICBmZC5hcHBlbmQoJ2RhdGEnLCBibG9iLCBlbmNGaWxlTmFtZS5lbmNyeXB0ZWRTdHJpbmcpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBpZiAoVXRpbHMuaXNOb2RlICYmICFVdGlscy5pc0Jyb3dzZXIpIHtcbiAgICAgICAgICAgICAgICBmZC5hcHBlbmQoJ2tleScsIGtleS5lbmNyeXB0ZWRTdHJpbmcpO1xuICAgICAgICAgICAgICAgIGZkLmFwcGVuZCgnZGF0YScsIEJ1ZmZlci5mcm9tKGVuY0RhdGEuYnVmZmVyKSBhcyBhbnksIHtcbiAgICAgICAgICAgICAgICAgICAgZmlsZXBhdGg6IGVuY0ZpbGVOYW1lLmVuY3J5cHRlZFN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgY29udGVudFR5cGU6ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nLFxuICAgICAgICAgICAgICAgIH0gYXMgYW55KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXNwb25zZTogQ2lwaGVyUmVzcG9uc2U7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoYWRtaW4pIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZSA9IGF3YWl0IHRoaXMuYXBpU2VydmljZS5wb3N0Q2lwaGVyQXR0YWNobWVudEFkbWluTGVnYWN5KGNpcGhlcklkLCBmZCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gYXdhaXQgdGhpcy5hcGlTZXJ2aWNlLnBvc3RDaXBoZXJBdHRhY2htZW50TGVnYWN5KGNpcGhlcklkLCBmZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigoZSBhcyBFcnJvclJlc3BvbnNlKS5nZXRTaW5nbGVNZXNzYWdlKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgIH1cblxuICAgIGFzeW5jIHNhdmVDb2xsZWN0aW9uc1dpdGhTZXJ2ZXIoY2lwaGVyOiBDaXBoZXIpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICBjb25zdCByZXF1ZXN0ID0gbmV3IENpcGhlckNvbGxlY3Rpb25zUmVxdWVzdChjaXBoZXIuY29sbGVjdGlvbklkcyk7XG4gICAgICAgIGF3YWl0IHRoaXMuYXBpU2VydmljZS5wdXRDaXBoZXJDb2xsZWN0aW9ucyhjaXBoZXIuaWQsIHJlcXVlc3QpO1xuICAgICAgICBjb25zdCB1c2VySWQgPSBhd2FpdCB0aGlzLnVzZXJTZXJ2aWNlLmdldFVzZXJJZCgpO1xuICAgICAgICBjb25zdCBkYXRhID0gY2lwaGVyLnRvQ2lwaGVyRGF0YSh1c2VySWQpO1xuICAgICAgICBhd2FpdCB0aGlzLnVwc2VydChkYXRhKTtcbiAgICB9XG5cbiAgICBhc3luYyB1cHNlcnQoY2lwaGVyOiBDaXBoZXJEYXRhIHwgQ2lwaGVyRGF0YVtdKTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgY29uc3QgdXNlcklkID0gYXdhaXQgdGhpcy51c2VyU2VydmljZS5nZXRVc2VySWQoKTtcbiAgICAgICAgbGV0IGNpcGhlcnMgPSBhd2FpdCB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldDx7IFtpZDogc3RyaW5nXTogQ2lwaGVyRGF0YTsgfT4oXG4gICAgICAgICAgICBLZXlzLmNpcGhlcnNQcmVmaXggKyB1c2VySWQpO1xuICAgICAgICBpZiAoY2lwaGVycyA9PSBudWxsKSB7XG4gICAgICAgICAgICBjaXBoZXJzID0ge307XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2lwaGVyIGluc3RhbmNlb2YgQ2lwaGVyRGF0YSkge1xuICAgICAgICAgICAgY29uc3QgYyA9IGNpcGhlciBhcyBDaXBoZXJEYXRhO1xuICAgICAgICAgICAgY2lwaGVyc1tjLmlkXSA9IGM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAoY2lwaGVyIGFzIENpcGhlckRhdGFbXSkuZm9yRWFjaChjID0+IHtcbiAgICAgICAgICAgICAgICBjaXBoZXJzW2MuaWRdID0gYztcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgdGhpcy5zdG9yYWdlU2VydmljZS5zYXZlKEtleXMuY2lwaGVyc1ByZWZpeCArIHVzZXJJZCwgY2lwaGVycyk7XG4gICAgICAgIHRoaXMuZGVjcnlwdGVkQ2lwaGVyQ2FjaGUgPSBudWxsO1xuICAgIH1cblxuICAgIGFzeW5jIHJlcGxhY2UoY2lwaGVyczogeyBbaWQ6IHN0cmluZ106IENpcGhlckRhdGE7IH0pOiBQcm9taXNlPGFueT4ge1xuICAgICAgICBjb25zdCB1c2VySWQgPSBhd2FpdCB0aGlzLnVzZXJTZXJ2aWNlLmdldFVzZXJJZCgpO1xuICAgICAgICBhd2FpdCB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNhdmUoS2V5cy5jaXBoZXJzUHJlZml4ICsgdXNlcklkLCBjaXBoZXJzKTtcbiAgICAgICAgdGhpcy5kZWNyeXB0ZWRDaXBoZXJDYWNoZSA9IG51bGw7XG4gICAgfVxuXG4gICAgYXN5bmMgY2xlYXIodXNlcklkOiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICBhd2FpdCB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnJlbW92ZShLZXlzLmNpcGhlcnNQcmVmaXggKyB1c2VySWQpO1xuICAgICAgICB0aGlzLmNsZWFyQ2FjaGUoKTtcbiAgICB9XG5cbiAgICBhc3luYyBtb3ZlTWFueVdpdGhTZXJ2ZXIoaWRzOiBzdHJpbmdbXSwgZm9sZGVySWQ6IHN0cmluZyk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIGF3YWl0IHRoaXMuYXBpU2VydmljZS5wdXRNb3ZlQ2lwaGVycyhuZXcgQ2lwaGVyQnVsa01vdmVSZXF1ZXN0KGlkcywgZm9sZGVySWQpKTtcblxuICAgICAgICBjb25zdCB1c2VySWQgPSBhd2FpdCB0aGlzLnVzZXJTZXJ2aWNlLmdldFVzZXJJZCgpO1xuICAgICAgICBsZXQgY2lwaGVycyA9IGF3YWl0IHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0PHsgW2lkOiBzdHJpbmddOiBDaXBoZXJEYXRhOyB9PihcbiAgICAgICAgICAgIEtleXMuY2lwaGVyc1ByZWZpeCArIHVzZXJJZCk7XG4gICAgICAgIGlmIChjaXBoZXJzID09IG51bGwpIHtcbiAgICAgICAgICAgIGNpcGhlcnMgPSB7fTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlkcy5mb3JFYWNoKGlkID0+IHtcbiAgICAgICAgICAgIGlmIChjaXBoZXJzLmhhc093blByb3BlcnR5KGlkKSkge1xuICAgICAgICAgICAgICAgIGNpcGhlcnNbaWRdLmZvbGRlcklkID0gZm9sZGVySWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGF3YWl0IHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2F2ZShLZXlzLmNpcGhlcnNQcmVmaXggKyB1c2VySWQsIGNpcGhlcnMpO1xuICAgICAgICB0aGlzLmRlY3J5cHRlZENpcGhlckNhY2hlID0gbnVsbDtcbiAgICB9XG5cbiAgICBhc3luYyBkZWxldGUoaWQ6IHN0cmluZyB8IHN0cmluZ1tdKTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgY29uc3QgdXNlcklkID0gYXdhaXQgdGhpcy51c2VyU2VydmljZS5nZXRVc2VySWQoKTtcbiAgICAgICAgY29uc3QgY2lwaGVycyA9IGF3YWl0IHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0PHsgW2lkOiBzdHJpbmddOiBDaXBoZXJEYXRhOyB9PihcbiAgICAgICAgICAgIEtleXMuY2lwaGVyc1ByZWZpeCArIHVzZXJJZCk7XG4gICAgICAgIGlmIChjaXBoZXJzID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgaWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBpZiAoY2lwaGVyc1tpZF0gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlbGV0ZSBjaXBoZXJzW2lkXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIChpZCBhcyBzdHJpbmdbXSkuZm9yRWFjaChpID0+IHtcbiAgICAgICAgICAgICAgICBkZWxldGUgY2lwaGVyc1tpXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgdGhpcy5zdG9yYWdlU2VydmljZS5zYXZlKEtleXMuY2lwaGVyc1ByZWZpeCArIHVzZXJJZCwgY2lwaGVycyk7XG4gICAgICAgIHRoaXMuZGVjcnlwdGVkQ2lwaGVyQ2FjaGUgPSBudWxsO1xuICAgIH1cblxuICAgIGFzeW5jIGRlbGV0ZVdpdGhTZXJ2ZXIoaWQ6IHN0cmluZyk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIGF3YWl0IHRoaXMuYXBpU2VydmljZS5kZWxldGVDaXBoZXIoaWQpO1xuICAgICAgICBhd2FpdCB0aGlzLmRlbGV0ZShpZCk7XG4gICAgfVxuXG4gICAgYXN5bmMgZGVsZXRlTWFueVdpdGhTZXJ2ZXIoaWRzOiBzdHJpbmdbXSk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIGF3YWl0IHRoaXMuYXBpU2VydmljZS5kZWxldGVNYW55Q2lwaGVycyhuZXcgQ2lwaGVyQnVsa0RlbGV0ZVJlcXVlc3QoaWRzKSk7XG4gICAgICAgIGF3YWl0IHRoaXMuZGVsZXRlKGlkcyk7XG4gICAgfVxuXG4gICAgYXN5bmMgZGVsZXRlQXR0YWNobWVudChpZDogc3RyaW5nLCBhdHRhY2htZW50SWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCB1c2VySWQgPSBhd2FpdCB0aGlzLnVzZXJTZXJ2aWNlLmdldFVzZXJJZCgpO1xuICAgICAgICBjb25zdCBjaXBoZXJzID0gYXdhaXQgdGhpcy5zdG9yYWdlU2VydmljZS5nZXQ8eyBbaWQ6IHN0cmluZ106IENpcGhlckRhdGE7IH0+KFxuICAgICAgICAgICAgS2V5cy5jaXBoZXJzUHJlZml4ICsgdXNlcklkKTtcblxuICAgICAgICBpZiAoY2lwaGVycyA9PSBudWxsIHx8ICFjaXBoZXJzLmhhc093blByb3BlcnR5KGlkKSB8fCBjaXBoZXJzW2lkXS5hdHRhY2htZW50cyA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNpcGhlcnNbaWRdLmF0dGFjaG1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoY2lwaGVyc1tpZF0uYXR0YWNobWVudHNbaV0uaWQgPT09IGF0dGFjaG1lbnRJZCkge1xuICAgICAgICAgICAgICAgIGNpcGhlcnNbaWRdLmF0dGFjaG1lbnRzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2F2ZShLZXlzLmNpcGhlcnNQcmVmaXggKyB1c2VySWQsIGNpcGhlcnMpO1xuICAgICAgICB0aGlzLmRlY3J5cHRlZENpcGhlckNhY2hlID0gbnVsbDtcbiAgICB9XG5cbiAgICBhc3luYyBkZWxldGVBdHRhY2htZW50V2l0aFNlcnZlcihpZDogc3RyaW5nLCBhdHRhY2htZW50SWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5hcGlTZXJ2aWNlLmRlbGV0ZUNpcGhlckF0dGFjaG1lbnQoaWQsIGF0dGFjaG1lbnRJZCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdCgoZSBhcyBFcnJvclJlc3BvbnNlKS5nZXRTaW5nbGVNZXNzYWdlKCkpO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMuZGVsZXRlQXR0YWNobWVudChpZCwgYXR0YWNobWVudElkKTtcbiAgICB9XG5cbiAgICBzb3J0Q2lwaGVyc0J5TGFzdFVzZWQoYTogQ2lwaGVyVmlldywgYjogQ2lwaGVyVmlldyk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IGFMYXN0VXNlZCA9IGEubG9jYWxEYXRhICYmIGEubG9jYWxEYXRhLmxhc3RVc2VkRGF0ZSA/IGEubG9jYWxEYXRhLmxhc3RVc2VkRGF0ZSBhcyBudW1iZXIgOiBudWxsO1xuICAgICAgICBjb25zdCBiTGFzdFVzZWQgPSBiLmxvY2FsRGF0YSAmJiBiLmxvY2FsRGF0YS5sYXN0VXNlZERhdGUgPyBiLmxvY2FsRGF0YS5sYXN0VXNlZERhdGUgYXMgbnVtYmVyIDogbnVsbDtcblxuICAgICAgICBjb25zdCBib3RoTm90TnVsbCA9IGFMYXN0VXNlZCAhPSBudWxsICYmIGJMYXN0VXNlZCAhPSBudWxsO1xuICAgICAgICBpZiAoYm90aE5vdE51bGwgJiYgYUxhc3RVc2VkIDwgYkxhc3RVc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYUxhc3RVc2VkICE9IG51bGwgJiYgYkxhc3RVc2VkID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChib3RoTm90TnVsbCAmJiBhTGFzdFVzZWQgPiBiTGFzdFVzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYkxhc3RVc2VkICE9IG51bGwgJiYgYUxhc3RVc2VkID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgc29ydENpcGhlcnNCeUxhc3RVc2VkVGhlbk5hbWUoYTogQ2lwaGVyVmlldywgYjogQ2lwaGVyVmlldyk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuc29ydENpcGhlcnNCeUxhc3RVc2VkKGEsIGIpO1xuICAgICAgICBpZiAocmVzdWx0ICE9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxlU29ydGluZ0Z1bmN0aW9uKCkoYSwgYik7XG4gICAgfVxuXG4gICAgZ2V0TG9jYWxlU29ydGluZ0Z1bmN0aW9uKCk6IChhOiBDaXBoZXJWaWV3LCBiOiBDaXBoZXJWaWV3KSA9PiBudW1iZXIge1xuICAgICAgICByZXR1cm4gKGEsIGIpID0+IHtcbiAgICAgICAgICAgIGxldCBhTmFtZSA9IGEubmFtZTtcbiAgICAgICAgICAgIGxldCBiTmFtZSA9IGIubmFtZTtcblxuICAgICAgICAgICAgaWYgKGFOYW1lID09IG51bGwgJiYgYk5hbWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChhTmFtZSAhPSBudWxsICYmIGJOYW1lID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChhTmFtZSA9PSBudWxsICYmIGJOYW1lID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5pMThuU2VydmljZS5jb2xsYXRvciA/IHRoaXMuaTE4blNlcnZpY2UuY29sbGF0b3IuY29tcGFyZShhTmFtZSwgYk5hbWUpIDpcbiAgICAgICAgICAgICAgICBhTmFtZS5sb2NhbGVDb21wYXJlKGJOYW1lKTtcblxuICAgICAgICAgICAgaWYgKHJlc3VsdCAhPT0gMCB8fCBhLnR5cGUgIT09IENpcGhlclR5cGUuTG9naW4gfHwgYi50eXBlICE9PSBDaXBoZXJUeXBlLkxvZ2luKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGEubG9naW4udXNlcm5hbWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGFOYW1lICs9IGEubG9naW4udXNlcm5hbWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChiLmxvZ2luLnVzZXJuYW1lICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBiTmFtZSArPSBiLmxvZ2luLnVzZXJuYW1lO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pMThuU2VydmljZS5jb2xsYXRvciA/IHRoaXMuaTE4blNlcnZpY2UuY29sbGF0b3IuY29tcGFyZShhTmFtZSwgYk5hbWUpIDpcbiAgICAgICAgICAgICAgICBhTmFtZS5sb2NhbGVDb21wYXJlKGJOYW1lKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBhc3luYyBzb2Z0RGVsZXRlKGlkOiBzdHJpbmcgfCBzdHJpbmdbXSk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIGNvbnN0IHVzZXJJZCA9IGF3YWl0IHRoaXMudXNlclNlcnZpY2UuZ2V0VXNlcklkKCk7XG4gICAgICAgIGNvbnN0IGNpcGhlcnMgPSBhd2FpdCB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldDx7IFtpZDogc3RyaW5nXTogQ2lwaGVyRGF0YTsgfT4oXG4gICAgICAgICAgICBLZXlzLmNpcGhlcnNQcmVmaXggKyB1c2VySWQpO1xuICAgICAgICBpZiAoY2lwaGVycyA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzZXREZWxldGVkRGF0ZSA9IChjaXBoZXJJZDogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICBpZiAoY2lwaGVyc1tjaXBoZXJJZF0gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNpcGhlcnNbY2lwaGVySWRdLmRlbGV0ZWREYXRlID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGlmICh0eXBlb2YgaWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBzZXREZWxldGVkRGF0ZShpZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAoaWQgYXMgc3RyaW5nW10pLmZvckVhY2goc2V0RGVsZXRlZERhdGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgdGhpcy5zdG9yYWdlU2VydmljZS5zYXZlKEtleXMuY2lwaGVyc1ByZWZpeCArIHVzZXJJZCwgY2lwaGVycyk7XG4gICAgICAgIHRoaXMuZGVjcnlwdGVkQ2lwaGVyQ2FjaGUgPSBudWxsO1xuICAgIH1cblxuICAgIGFzeW5jIHNvZnREZWxldGVXaXRoU2VydmVyKGlkOiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICBhd2FpdCB0aGlzLmFwaVNlcnZpY2UucHV0RGVsZXRlQ2lwaGVyKGlkKTtcbiAgICAgICAgYXdhaXQgdGhpcy5zb2Z0RGVsZXRlKGlkKTtcbiAgICB9XG5cbiAgICBhc3luYyBzb2Z0RGVsZXRlTWFueVdpdGhTZXJ2ZXIoaWRzOiBzdHJpbmdbXSk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIGF3YWl0IHRoaXMuYXBpU2VydmljZS5wdXREZWxldGVNYW55Q2lwaGVycyhuZXcgQ2lwaGVyQnVsa0RlbGV0ZVJlcXVlc3QoaWRzKSk7XG4gICAgICAgIGF3YWl0IHRoaXMuc29mdERlbGV0ZShpZHMpO1xuICAgIH1cblxuICAgIGFzeW5jIHJlc3RvcmUoY2lwaGVyOiB7IGlkOiBzdHJpbmcsIHJldmlzaW9uRGF0ZTogc3RyaW5nOyB9IHwgeyBpZDogc3RyaW5nLCByZXZpc2lvbkRhdGU6IHN0cmluZzsgfVtdKSB7XG4gICAgICAgIGNvbnN0IHVzZXJJZCA9IGF3YWl0IHRoaXMudXNlclNlcnZpY2UuZ2V0VXNlcklkKCk7XG4gICAgICAgIGNvbnN0IGNpcGhlcnMgPSBhd2FpdCB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldDx7IFtpZDogc3RyaW5nXTogQ2lwaGVyRGF0YTsgfT4oXG4gICAgICAgICAgICBLZXlzLmNpcGhlcnNQcmVmaXggKyB1c2VySWQpO1xuICAgICAgICBpZiAoY2lwaGVycyA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjbGVhckRlbGV0ZWREYXRlID0gKGM6IHsgaWQ6IHN0cmluZywgcmV2aXNpb25EYXRlOiBzdHJpbmc7IH0pID0+IHtcbiAgICAgICAgICAgIGlmIChjaXBoZXJzW2MuaWRdID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjaXBoZXJzW2MuaWRdLmRlbGV0ZWREYXRlID0gbnVsbDtcbiAgICAgICAgICAgIGNpcGhlcnNbYy5pZF0ucmV2aXNpb25EYXRlID0gYy5yZXZpc2lvbkRhdGU7XG4gICAgICAgIH07XG5cblxuICAgICAgICBpZiAoY2lwaGVyLmNvbnN0cnVjdG9yLm5hbWUgPT09ICdBcnJheScpIHtcbiAgICAgICAgICAgIChjaXBoZXIgYXMgeyBpZDogc3RyaW5nLCByZXZpc2lvbkRhdGU6IHN0cmluZzsgfVtdKS5mb3JFYWNoKGNsZWFyRGVsZXRlZERhdGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2xlYXJEZWxldGVkRGF0ZShjaXBoZXIgYXMgeyBpZDogc3RyaW5nLCByZXZpc2lvbkRhdGU6IHN0cmluZzsgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNhdmUoS2V5cy5jaXBoZXJzUHJlZml4ICsgdXNlcklkLCBjaXBoZXJzKTtcbiAgICAgICAgdGhpcy5kZWNyeXB0ZWRDaXBoZXJDYWNoZSA9IG51bGw7XG4gICAgfVxuXG4gICAgYXN5bmMgcmVzdG9yZVdpdGhTZXJ2ZXIoaWQ6IHN0cmluZyk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5hcGlTZXJ2aWNlLnB1dFJlc3RvcmVDaXBoZXIoaWQpO1xuICAgICAgICBhd2FpdCB0aGlzLnJlc3RvcmUoeyBpZDogaWQsIHJldmlzaW9uRGF0ZTogcmVzcG9uc2UucmV2aXNpb25EYXRlIH0pO1xuICAgIH1cblxuICAgIGFzeW5jIHJlc3RvcmVNYW55V2l0aFNlcnZlcihpZHM6IHN0cmluZ1tdKTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmFwaVNlcnZpY2UucHV0UmVzdG9yZU1hbnlDaXBoZXJzKG5ldyBDaXBoZXJCdWxrUmVzdG9yZVJlcXVlc3QoaWRzKSk7XG4gICAgICAgIGNvbnN0IHJlc3RvcmVzOiB7IGlkOiBzdHJpbmcsIHJldmlzaW9uRGF0ZTogc3RyaW5nOyB9W10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBjaXBoZXIgb2YgcmVzcG9uc2UuZGF0YSkge1xuICAgICAgICAgICAgcmVzdG9yZXMucHVzaCh7IGlkOiBjaXBoZXIuaWQsIHJldmlzaW9uRGF0ZTogY2lwaGVyLnJldmlzaW9uRGF0ZSB9KTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLnJlc3RvcmUocmVzdG9yZXMpO1xuICAgIH1cblxuICAgIC8vIEhlbHBlcnNcblxuICAgIHByaXZhdGUgYXN5bmMgc2hhcmVBdHRhY2htZW50V2l0aFNlcnZlcihhdHRhY2htZW50VmlldzogQXR0YWNobWVudFZpZXcsIGNpcGhlcklkOiBzdHJpbmcsXG4gICAgICAgIG9yZ2FuaXphdGlvbklkOiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICBjb25zdCBhdHRhY2htZW50UmVzcG9uc2UgPSBhd2FpdCB0aGlzLmFwaVNlcnZpY2UubmF0aXZlRmV0Y2goXG4gICAgICAgICAgICBuZXcgUmVxdWVzdChhdHRhY2htZW50Vmlldy51cmwsIHsgY2FjaGU6ICduby1zdG9yZScgfSkpO1xuICAgICAgICBpZiAoYXR0YWNobWVudFJlc3BvbnNlLnN0YXR1cyAhPT0gMjAwKSB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcignRmFpbGVkIHRvIGRvd25sb2FkIGF0dGFjaG1lbnQ6ICcgKyBhdHRhY2htZW50UmVzcG9uc2Uuc3RhdHVzLnRvU3RyaW5nKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYnVmID0gYXdhaXQgYXR0YWNobWVudFJlc3BvbnNlLmFycmF5QnVmZmVyKCk7XG4gICAgICAgIGNvbnN0IGRlY0J1ZiA9IGF3YWl0IHRoaXMuY3J5cHRvU2VydmljZS5kZWNyeXB0RnJvbUJ5dGVzKGJ1ZiwgbnVsbCk7XG4gICAgICAgIGNvbnN0IGtleSA9IGF3YWl0IHRoaXMuY3J5cHRvU2VydmljZS5nZXRPcmdLZXkob3JnYW5pemF0aW9uSWQpO1xuICAgICAgICBjb25zdCBlbmNGaWxlTmFtZSA9IGF3YWl0IHRoaXMuY3J5cHRvU2VydmljZS5lbmNyeXB0KGF0dGFjaG1lbnRWaWV3LmZpbGVOYW1lLCBrZXkpO1xuXG4gICAgICAgIGNvbnN0IGRhdGFFbmNLZXkgPSBhd2FpdCB0aGlzLmNyeXB0b1NlcnZpY2UubWFrZUVuY0tleShrZXkpO1xuICAgICAgICBjb25zdCBlbmNEYXRhID0gYXdhaXQgdGhpcy5jcnlwdG9TZXJ2aWNlLmVuY3J5cHRUb0J5dGVzKGRlY0J1ZiwgZGF0YUVuY0tleVswXSk7XG5cbiAgICAgICAgY29uc3QgZmQgPSBuZXcgRm9ybURhdGEoKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbZW5jRGF0YS5idWZmZXJdLCB7IHR5cGU6ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nIH0pO1xuICAgICAgICAgICAgZmQuYXBwZW5kKCdrZXknLCBkYXRhRW5jS2V5WzFdLmVuY3J5cHRlZFN0cmluZyk7XG4gICAgICAgICAgICBmZC5hcHBlbmQoJ2RhdGEnLCBibG9iLCBlbmNGaWxlTmFtZS5lbmNyeXB0ZWRTdHJpbmcpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBpZiAoVXRpbHMuaXNOb2RlICYmICFVdGlscy5pc0Jyb3dzZXIpIHtcbiAgICAgICAgICAgICAgICBmZC5hcHBlbmQoJ2tleScsIGRhdGFFbmNLZXlbMV0uZW5jcnlwdGVkU3RyaW5nKTtcbiAgICAgICAgICAgICAgICBmZC5hcHBlbmQoJ2RhdGEnLCBCdWZmZXIuZnJvbShlbmNEYXRhLmJ1ZmZlcikgYXMgYW55LCB7XG4gICAgICAgICAgICAgICAgICAgIGZpbGVwYXRoOiBlbmNGaWxlTmFtZS5lbmNyeXB0ZWRTdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRUeXBlOiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJyxcbiAgICAgICAgICAgICAgICB9IGFzIGFueSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5hcGlTZXJ2aWNlLnBvc3RTaGFyZUNpcGhlckF0dGFjaG1lbnQoY2lwaGVySWQsIGF0dGFjaG1lbnRWaWV3LmlkLCBmZCwgb3JnYW5pemF0aW9uSWQpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoKGUgYXMgRXJyb3JSZXNwb25zZSkuZ2V0U2luZ2xlTWVzc2FnZSgpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgZW5jcnlwdE9ialByb3BlcnR5PFYgZXh0ZW5kcyBWaWV3LCBEIGV4dGVuZHMgRG9tYWluPihtb2RlbDogViwgb2JqOiBELFxuICAgICAgICBtYXA6IGFueSwga2V5OiBTeW1tZXRyaWNDcnlwdG9LZXkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgcHJvbWlzZXMgPSBbXTtcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG5cbiAgICAgICAgZm9yIChjb25zdCBwcm9wIGluIG1hcCkge1xuICAgICAgICAgICAgaWYgKCFtYXAuaGFzT3duUHJvcGVydHkocHJvcCkpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lXG4gICAgICAgICAgICAoZnVuY3Rpb24gKHRoZVByb3AsIHRoZU9iaikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHAgPSBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbW9kZWxQcm9wID0gKG1vZGVsIGFzIGFueSlbKG1hcFt0aGVQcm9wXSB8fCB0aGVQcm9wKV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChtb2RlbFByb3AgJiYgbW9kZWxQcm9wICE9PSAnJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuY3J5cHRvU2VydmljZS5lbmNyeXB0KG1vZGVsUHJvcCwga2V5KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICB9KS50aGVuKCh2YWw6IEVuY1N0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAodGhlT2JqIGFzIGFueSlbdGhlUHJvcF0gPSB2YWw7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcHJvbWlzZXMucHVzaChwKTtcbiAgICAgICAgICAgIH0pKHByb3AsIG9iaik7XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBlbmNyeXB0Q2lwaGVyRGF0YShjaXBoZXI6IENpcGhlciwgbW9kZWw6IENpcGhlclZpZXcsIGtleTogU3ltbWV0cmljQ3J5cHRvS2V5KSB7XG4gICAgICAgIHN3aXRjaCAoY2lwaGVyLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgQ2lwaGVyVHlwZS5Mb2dpbjpcbiAgICAgICAgICAgICAgICBjaXBoZXIubG9naW4gPSBuZXcgTG9naW4oKTtcbiAgICAgICAgICAgICAgICBjaXBoZXIubG9naW4ucGFzc3dvcmRSZXZpc2lvbkRhdGUgPSBtb2RlbC5sb2dpbi5wYXNzd29yZFJldmlzaW9uRGF0ZTtcbiAgICAgICAgICAgICAgICBjaXBoZXIubG9naW4uYXV0b2ZpbGxPblBhZ2VMb2FkID0gbW9kZWwubG9naW4uYXV0b2ZpbGxPblBhZ2VMb2FkO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZW5jcnlwdE9ialByb3BlcnR5KG1vZGVsLmxvZ2luLCBjaXBoZXIubG9naW4sIHtcbiAgICAgICAgICAgICAgICAgICAgdXNlcm5hbWU6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIHBhc3N3b3JkOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICB0b3RwOiBudWxsLFxuICAgICAgICAgICAgICAgIH0sIGtleSk7XG5cbiAgICAgICAgICAgICAgICBpZiAobW9kZWwubG9naW4udXJpcyAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNpcGhlci5sb2dpbi51cmlzID0gW107XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbW9kZWwubG9naW4udXJpcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbG9naW5VcmkgPSBuZXcgTG9naW5VcmkoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2luVXJpLm1hdGNoID0gbW9kZWwubG9naW4udXJpc1tpXS5tYXRjaDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZW5jcnlwdE9ialByb3BlcnR5KG1vZGVsLmxvZ2luLnVyaXNbaV0sIGxvZ2luVXJpLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJpOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSwga2V5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNpcGhlci5sb2dpbi51cmlzLnB1c2gobG9naW5VcmkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGNhc2UgQ2lwaGVyVHlwZS5TZWN1cmVOb3RlOlxuICAgICAgICAgICAgICAgIGNpcGhlci5zZWN1cmVOb3RlID0gbmV3IFNlY3VyZU5vdGUoKTtcbiAgICAgICAgICAgICAgICBjaXBoZXIuc2VjdXJlTm90ZS50eXBlID0gbW9kZWwuc2VjdXJlTm90ZS50eXBlO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGNhc2UgQ2lwaGVyVHlwZS5DYXJkOlxuICAgICAgICAgICAgICAgIGNpcGhlci5jYXJkID0gbmV3IENhcmQoKTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmVuY3J5cHRPYmpQcm9wZXJ0eShtb2RlbC5jYXJkLCBjaXBoZXIuY2FyZCwge1xuICAgICAgICAgICAgICAgICAgICBjYXJkaG9sZGVyTmFtZTogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgYnJhbmQ6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIG51bWJlcjogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgZXhwTW9udGg6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGV4cFllYXI6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGNvZGU6IG51bGwsXG4gICAgICAgICAgICAgICAgfSwga2V5KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBjYXNlIENpcGhlclR5cGUuSWRlbnRpdHk6XG4gICAgICAgICAgICAgICAgY2lwaGVyLmlkZW50aXR5ID0gbmV3IElkZW50aXR5KCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5lbmNyeXB0T2JqUHJvcGVydHkobW9kZWwuaWRlbnRpdHksIGNpcGhlci5pZGVudGl0eSwge1xuICAgICAgICAgICAgICAgICAgICB0aXRsZTogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgZmlyc3ROYW1lOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBtaWRkbGVOYW1lOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBsYXN0TmFtZTogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgYWRkcmVzczE6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGFkZHJlc3MyOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBhZGRyZXNzMzogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgY2l0eTogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgc3RhdGU6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIHBvc3RhbENvZGU6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGNvdW50cnk6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGNvbXBhbnk6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGVtYWlsOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBwaG9uZTogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgc3NuOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICB1c2VybmFtZTogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgcGFzc3BvcnROdW1iZXI6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGxpY2Vuc2VOdW1iZXI6IG51bGwsXG4gICAgICAgICAgICAgICAgfSwga2V5KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biBjaXBoZXIgdHlwZS4nKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgZ2V0Q2lwaGVyRm9yVXJsKHVybDogc3RyaW5nLCBsYXN0VXNlZDogYm9vbGVhbiwgbGFzdExhdW5jaGVkOiBib29sZWFuLCBhdXRvZmlsbE9uUGFnZUxvYWQ6IGJvb2xlYW4pOiBQcm9taXNlPENpcGhlclZpZXc+IHtcbiAgICAgICAgY29uc3QgY2FjaGVLZXkgPSBhdXRvZmlsbE9uUGFnZUxvYWQgPyAnYXV0b2ZpbGxPblBhZ2VMb2FkLScgKyB1cmwgOiB1cmw7XG5cbiAgICAgICAgaWYgKCF0aGlzLnNvcnRlZENpcGhlcnNDYWNoZS5pc0NhY2hlZChjYWNoZUtleSkpIHtcbiAgICAgICAgICAgIGxldCBjaXBoZXJzID0gYXdhaXQgdGhpcy5nZXRBbGxEZWNyeXB0ZWRGb3JVcmwodXJsKTtcbiAgICAgICAgICAgIGlmICghY2lwaGVycykge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoYXV0b2ZpbGxPblBhZ2VMb2FkKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYXV0b2ZpbGxPblBhZ2VMb2FkRGVmYXVsdCA9IGF3YWl0IHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0KENvbnN0YW50c1NlcnZpY2UuYXV0b0ZpbGxPblBhZ2VMb2FkRGVmYXVsdEtleSk7XG4gICAgICAgICAgICAgICAgY2lwaGVycyA9IGNpcGhlcnMuZmlsdGVyKGNpcGhlciA9PiBjaXBoZXIubG9naW4uYXV0b2ZpbGxPblBhZ2VMb2FkIHx8XG4gICAgICAgICAgICAgICAgICAgIChjaXBoZXIubG9naW4uYXV0b2ZpbGxPblBhZ2VMb2FkID09IG51bGwgJiYgYXV0b2ZpbGxPblBhZ2VMb2FkRGVmYXVsdCAhPT0gZmFsc2UpKTtcbiAgICAgICAgICAgICAgICBpZiAoY2lwaGVycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnNvcnRlZENpcGhlcnNDYWNoZS5hZGRDaXBoZXJzKGNhY2hlS2V5LCBjaXBoZXJzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChsYXN0TGF1bmNoZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNvcnRlZENpcGhlcnNDYWNoZS5nZXRMYXN0TGF1bmNoZWQoY2FjaGVLZXkpO1xuICAgICAgICB9IGVsc2UgaWYgKGxhc3RVc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zb3J0ZWRDaXBoZXJzQ2FjaGUuZ2V0TGFzdFVzZWQoY2FjaGVLZXkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc29ydGVkQ2lwaGVyc0NhY2hlLmdldE5leHQoY2FjaGVLZXkpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgQ29sbGVjdGlvbkRhdGEgfSBmcm9tICcuLi9tb2RlbHMvZGF0YS9jb2xsZWN0aW9uRGF0YSc7XG5cbmltcG9ydCB7IENvbGxlY3Rpb24gfSBmcm9tICcuLi9tb2RlbHMvZG9tYWluL2NvbGxlY3Rpb24nO1xuaW1wb3J0IHsgVHJlZU5vZGUgfSBmcm9tICcuLi9tb2RlbHMvZG9tYWluL3RyZWVOb2RlJztcblxuaW1wb3J0IHsgQ29sbGVjdGlvblZpZXcgfSBmcm9tICcuLi9tb2RlbHMvdmlldy9jb2xsZWN0aW9uVmlldyc7XG5cbmltcG9ydCB7IENvbGxlY3Rpb25TZXJ2aWNlIGFzIENvbGxlY3Rpb25TZXJ2aWNlQWJzdHJhY3Rpb24gfSBmcm9tICcuLi9hYnN0cmFjdGlvbnMvY29sbGVjdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IENyeXB0b1NlcnZpY2UgfSBmcm9tICcuLi9hYnN0cmFjdGlvbnMvY3J5cHRvLnNlcnZpY2UnO1xuaW1wb3J0IHsgSTE4blNlcnZpY2UgfSBmcm9tICcuLi9hYnN0cmFjdGlvbnMvaTE4bi5zZXJ2aWNlJztcbmltcG9ydCB7IFN0b3JhZ2VTZXJ2aWNlIH0gZnJvbSAnLi4vYWJzdHJhY3Rpb25zL3N0b3JhZ2Uuc2VydmljZSc7XG5pbXBvcnQgeyBVc2VyU2VydmljZSB9IGZyb20gJy4uL2Fic3RyYWN0aW9ucy91c2VyLnNlcnZpY2UnO1xuXG5pbXBvcnQgeyBTZXJ2aWNlVXRpbHMgfSBmcm9tICcuLi9taXNjL3NlcnZpY2VVdGlscyc7XG5pbXBvcnQgeyBVdGlscyB9IGZyb20gJy4uL21pc2MvdXRpbHMnO1xuXG5jb25zdCBLZXlzID0ge1xuICAgIGNvbGxlY3Rpb25zUHJlZml4OiAnY29sbGVjdGlvbnNfJyxcbn07XG5jb25zdCBOZXN0aW5nRGVsaW1pdGVyID0gJy8nO1xuXG5leHBvcnQgY2xhc3MgQ29sbGVjdGlvblNlcnZpY2UgaW1wbGVtZW50cyBDb2xsZWN0aW9uU2VydmljZUFic3RyYWN0aW9uIHtcbiAgICBkZWNyeXB0ZWRDb2xsZWN0aW9uQ2FjaGU6IENvbGxlY3Rpb25WaWV3W107XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNyeXB0b1NlcnZpY2U6IENyeXB0b1NlcnZpY2UsIHByaXZhdGUgdXNlclNlcnZpY2U6IFVzZXJTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHN0b3JhZ2VTZXJ2aWNlOiBTdG9yYWdlU2VydmljZSwgcHJpdmF0ZSBpMThuU2VydmljZTogSTE4blNlcnZpY2UpIHtcbiAgICB9XG5cbiAgICBjbGVhckNhY2hlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmRlY3J5cHRlZENvbGxlY3Rpb25DYWNoZSA9IG51bGw7XG4gICAgfVxuXG4gICAgYXN5bmMgZW5jcnlwdChtb2RlbDogQ29sbGVjdGlvblZpZXcpOiBQcm9taXNlPENvbGxlY3Rpb24+IHtcbiAgICAgICAgaWYgKG1vZGVsLm9yZ2FuaXphdGlvbklkID09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ29sbGVjdGlvbiBoYXMgbm8gb3JnYW5pemF0aW9uIGlkLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGtleSA9IGF3YWl0IHRoaXMuY3J5cHRvU2VydmljZS5nZXRPcmdLZXkobW9kZWwub3JnYW5pemF0aW9uSWQpO1xuICAgICAgICBpZiAoa2V5ID09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTm8ga2V5IGZvciB0aGlzIGNvbGxlY3Rpb25cXCdzIG9yZ2FuaXphdGlvbi4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb2xsZWN0aW9uID0gbmV3IENvbGxlY3Rpb24oKTtcbiAgICAgICAgY29sbGVjdGlvbi5pZCA9IG1vZGVsLmlkO1xuICAgICAgICBjb2xsZWN0aW9uLm9yZ2FuaXphdGlvbklkID0gbW9kZWwub3JnYW5pemF0aW9uSWQ7XG4gICAgICAgIGNvbGxlY3Rpb24ucmVhZE9ubHkgPSBtb2RlbC5yZWFkT25seTtcbiAgICAgICAgY29sbGVjdGlvbi5uYW1lID0gYXdhaXQgdGhpcy5jcnlwdG9TZXJ2aWNlLmVuY3J5cHQobW9kZWwubmFtZSwga2V5KTtcbiAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb247XG4gICAgfVxuXG4gICAgYXN5bmMgZGVjcnlwdE1hbnkoY29sbGVjdGlvbnM6IENvbGxlY3Rpb25bXSk6IFByb21pc2U8Q29sbGVjdGlvblZpZXdbXT4ge1xuICAgICAgICBpZiAoY29sbGVjdGlvbnMgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRlY0NvbGxlY3Rpb25zOiBDb2xsZWN0aW9uVmlld1tdID0gW107XG4gICAgICAgIGNvbnN0IHByb21pc2VzOiBQcm9taXNlPGFueT5bXSA9IFtdO1xuICAgICAgICBjb2xsZWN0aW9ucy5mb3JFYWNoKGNvbGxlY3Rpb24gPT4ge1xuICAgICAgICAgICAgcHJvbWlzZXMucHVzaChjb2xsZWN0aW9uLmRlY3J5cHQoKS50aGVuKGMgPT4gZGVjQ29sbGVjdGlvbnMucHVzaChjKSkpO1xuICAgICAgICB9KTtcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICAgICAgICByZXR1cm4gZGVjQ29sbGVjdGlvbnMuc29ydChVdGlscy5nZXRTb3J0RnVuY3Rpb24odGhpcy5pMThuU2VydmljZSwgJ25hbWUnKSk7XG4gICAgfVxuXG4gICAgYXN5bmMgZ2V0KGlkOiBzdHJpbmcpOiBQcm9taXNlPENvbGxlY3Rpb24+IHtcbiAgICAgICAgY29uc3QgdXNlcklkID0gYXdhaXQgdGhpcy51c2VyU2VydmljZS5nZXRVc2VySWQoKTtcbiAgICAgICAgY29uc3QgY29sbGVjdGlvbnMgPSBhd2FpdCB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldDx7IFtpZDogc3RyaW5nXTogQ29sbGVjdGlvbkRhdGE7IH0+KFxuICAgICAgICAgICAgS2V5cy5jb2xsZWN0aW9uc1ByZWZpeCArIHVzZXJJZCk7XG4gICAgICAgIGlmIChjb2xsZWN0aW9ucyA9PSBudWxsIHx8ICFjb2xsZWN0aW9ucy5oYXNPd25Qcm9wZXJ0eShpZCkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBDb2xsZWN0aW9uKGNvbGxlY3Rpb25zW2lkXSk7XG4gICAgfVxuXG4gICAgYXN5bmMgZ2V0QWxsKCk6IFByb21pc2U8Q29sbGVjdGlvbltdPiB7XG4gICAgICAgIGNvbnN0IHVzZXJJZCA9IGF3YWl0IHRoaXMudXNlclNlcnZpY2UuZ2V0VXNlcklkKCk7XG4gICAgICAgIGNvbnN0IGNvbGxlY3Rpb25zID0gYXdhaXQgdGhpcy5zdG9yYWdlU2VydmljZS5nZXQ8eyBbaWQ6IHN0cmluZ106IENvbGxlY3Rpb25EYXRhOyB9PihcbiAgICAgICAgICAgIEtleXMuY29sbGVjdGlvbnNQcmVmaXggKyB1c2VySWQpO1xuICAgICAgICBjb25zdCByZXNwb25zZTogQ29sbGVjdGlvbltdID0gW107XG4gICAgICAgIGZvciAoY29uc3QgaWQgaW4gY29sbGVjdGlvbnMpIHtcbiAgICAgICAgICAgIGlmIChjb2xsZWN0aW9ucy5oYXNPd25Qcm9wZXJ0eShpZCkpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZS5wdXNoKG5ldyBDb2xsZWN0aW9uKGNvbGxlY3Rpb25zW2lkXSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICB9XG5cbiAgICBhc3luYyBnZXRBbGxEZWNyeXB0ZWQoKTogUHJvbWlzZTxDb2xsZWN0aW9uVmlld1tdPiB7XG4gICAgICAgIGlmICh0aGlzLmRlY3J5cHRlZENvbGxlY3Rpb25DYWNoZSAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kZWNyeXB0ZWRDb2xsZWN0aW9uQ2FjaGU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBoYXNLZXkgPSBhd2FpdCB0aGlzLmNyeXB0b1NlcnZpY2UuaGFzS2V5KCk7XG4gICAgICAgIGlmICghaGFzS2V5KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGtleS4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvbGxlY3Rpb25zID0gYXdhaXQgdGhpcy5nZXRBbGwoKTtcbiAgICAgICAgdGhpcy5kZWNyeXB0ZWRDb2xsZWN0aW9uQ2FjaGUgPSBhd2FpdCB0aGlzLmRlY3J5cHRNYW55KGNvbGxlY3Rpb25zKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGVjcnlwdGVkQ29sbGVjdGlvbkNhY2hlO1xuICAgIH1cblxuICAgIGFzeW5jIGdldEFsbE5lc3RlZChjb2xsZWN0aW9uczogQ29sbGVjdGlvblZpZXdbXSA9IG51bGwpOiBQcm9taXNlPFRyZWVOb2RlPENvbGxlY3Rpb25WaWV3PltdPiB7XG4gICAgICAgIGlmIChjb2xsZWN0aW9ucyA9PSBudWxsKSB7XG4gICAgICAgICAgICBjb2xsZWN0aW9ucyA9IGF3YWl0IHRoaXMuZ2V0QWxsRGVjcnlwdGVkKCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgbm9kZXM6IFRyZWVOb2RlPENvbGxlY3Rpb25WaWV3PltdID0gW107XG4gICAgICAgIGNvbGxlY3Rpb25zLmZvckVhY2goYyA9PiB7XG4gICAgICAgICAgICBjb25zdCBjb2xsZWN0aW9uQ29weSA9IG5ldyBDb2xsZWN0aW9uVmlldygpO1xuICAgICAgICAgICAgY29sbGVjdGlvbkNvcHkuaWQgPSBjLmlkO1xuICAgICAgICAgICAgY29sbGVjdGlvbkNvcHkub3JnYW5pemF0aW9uSWQgPSBjLm9yZ2FuaXphdGlvbklkO1xuICAgICAgICAgICAgY29uc3QgcGFydHMgPSBjLm5hbWUgIT0gbnVsbCA/IGMubmFtZS5yZXBsYWNlKC9eXFwvK3xcXC8rJC9nLCAnJykuc3BsaXQoTmVzdGluZ0RlbGltaXRlcikgOiBbXTtcbiAgICAgICAgICAgIFNlcnZpY2VVdGlscy5uZXN0ZWRUcmF2ZXJzZShub2RlcywgMCwgcGFydHMsIGNvbGxlY3Rpb25Db3B5LCBudWxsLCBOZXN0aW5nRGVsaW1pdGVyKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBub2RlcztcbiAgICB9XG5cbiAgICBhc3luYyBnZXROZXN0ZWQoaWQ6IHN0cmluZyk6IFByb21pc2U8VHJlZU5vZGU8Q29sbGVjdGlvblZpZXc+PiB7XG4gICAgICAgIGNvbnN0IGNvbGxlY3Rpb25zID0gYXdhaXQgdGhpcy5nZXRBbGxOZXN0ZWQoKTtcbiAgICAgICAgcmV0dXJuIFNlcnZpY2VVdGlscy5nZXRUcmVlTm9kZU9iamVjdChjb2xsZWN0aW9ucywgaWQpIGFzIFRyZWVOb2RlPENvbGxlY3Rpb25WaWV3PjtcbiAgICB9XG5cbiAgICBhc3luYyB1cHNlcnQoY29sbGVjdGlvbjogQ29sbGVjdGlvbkRhdGEgfCBDb2xsZWN0aW9uRGF0YVtdKTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgY29uc3QgdXNlcklkID0gYXdhaXQgdGhpcy51c2VyU2VydmljZS5nZXRVc2VySWQoKTtcbiAgICAgICAgbGV0IGNvbGxlY3Rpb25zID0gYXdhaXQgdGhpcy5zdG9yYWdlU2VydmljZS5nZXQ8eyBbaWQ6IHN0cmluZ106IENvbGxlY3Rpb25EYXRhOyB9PihcbiAgICAgICAgICAgIEtleXMuY29sbGVjdGlvbnNQcmVmaXggKyB1c2VySWQpO1xuICAgICAgICBpZiAoY29sbGVjdGlvbnMgPT0gbnVsbCkge1xuICAgICAgICAgICAgY29sbGVjdGlvbnMgPSB7fTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb2xsZWN0aW9uIGluc3RhbmNlb2YgQ29sbGVjdGlvbkRhdGEpIHtcbiAgICAgICAgICAgIGNvbnN0IGMgPSBjb2xsZWN0aW9uIGFzIENvbGxlY3Rpb25EYXRhO1xuICAgICAgICAgICAgY29sbGVjdGlvbnNbYy5pZF0gPSBjO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgKGNvbGxlY3Rpb24gYXMgQ29sbGVjdGlvbkRhdGFbXSkuZm9yRWFjaChjID0+IHtcbiAgICAgICAgICAgICAgICBjb2xsZWN0aW9uc1tjLmlkXSA9IGM7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2F2ZShLZXlzLmNvbGxlY3Rpb25zUHJlZml4ICsgdXNlcklkLCBjb2xsZWN0aW9ucyk7XG4gICAgICAgIHRoaXMuZGVjcnlwdGVkQ29sbGVjdGlvbkNhY2hlID0gbnVsbDtcbiAgICB9XG5cbiAgICBhc3luYyByZXBsYWNlKGNvbGxlY3Rpb25zOiB7IFtpZDogc3RyaW5nXTogQ29sbGVjdGlvbkRhdGE7IH0pOiBQcm9taXNlPGFueT4ge1xuICAgICAgICBjb25zdCB1c2VySWQgPSBhd2FpdCB0aGlzLnVzZXJTZXJ2aWNlLmdldFVzZXJJZCgpO1xuICAgICAgICBhd2FpdCB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNhdmUoS2V5cy5jb2xsZWN0aW9uc1ByZWZpeCArIHVzZXJJZCwgY29sbGVjdGlvbnMpO1xuICAgICAgICB0aGlzLmRlY3J5cHRlZENvbGxlY3Rpb25DYWNoZSA9IG51bGw7XG4gICAgfVxuXG4gICAgYXN5bmMgY2xlYXIodXNlcklkOiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICBhd2FpdCB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnJlbW92ZShLZXlzLmNvbGxlY3Rpb25zUHJlZml4ICsgdXNlcklkKTtcbiAgICAgICAgdGhpcy5kZWNyeXB0ZWRDb2xsZWN0aW9uQ2FjaGUgPSBudWxsO1xuICAgIH1cblxuICAgIGFzeW5jIGRlbGV0ZShpZDogc3RyaW5nIHwgc3RyaW5nW10pOiBQcm9taXNlPGFueT4ge1xuICAgICAgICBjb25zdCB1c2VySWQgPSBhd2FpdCB0aGlzLnVzZXJTZXJ2aWNlLmdldFVzZXJJZCgpO1xuICAgICAgICBjb25zdCBjb2xsZWN0aW9ucyA9IGF3YWl0IHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0PHsgW2lkOiBzdHJpbmddOiBDb2xsZWN0aW9uRGF0YTsgfT4oXG4gICAgICAgICAgICBLZXlzLmNvbGxlY3Rpb25zUHJlZml4ICsgdXNlcklkKTtcbiAgICAgICAgaWYgKGNvbGxlY3Rpb25zID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgaWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBjb25zdCBpID0gaWQgYXMgc3RyaW5nO1xuICAgICAgICAgICAgZGVsZXRlIGNvbGxlY3Rpb25zW2lkXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIChpZCBhcyBzdHJpbmdbXSkuZm9yRWFjaChpID0+IHtcbiAgICAgICAgICAgICAgICBkZWxldGUgY29sbGVjdGlvbnNbaV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2F2ZShLZXlzLmNvbGxlY3Rpb25zUHJlZml4ICsgdXNlcklkLCBjb2xsZWN0aW9ucyk7XG4gICAgICAgIHRoaXMuZGVjcnlwdGVkQ29sbGVjdGlvbkNhY2hlID0gbnVsbDtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBMb2dMZXZlbFR5cGUgfSBmcm9tICcuLi9lbnVtcy9sb2dMZXZlbFR5cGUnO1xuXG5pbXBvcnQgeyBMb2dTZXJ2aWNlIGFzIExvZ1NlcnZpY2VBYnN0cmFjdGlvbiB9IGZyb20gJy4uL2Fic3RyYWN0aW9ucy9sb2cuc2VydmljZSc7XG5cbmltcG9ydCAqIGFzIGhydGltZSBmcm9tICdicm93c2VyLWhydGltZSc7XG5cbmV4cG9ydCBjbGFzcyBDb25zb2xlTG9nU2VydmljZSBpbXBsZW1lbnRzIExvZ1NlcnZpY2VBYnN0cmFjdGlvbiB7XG4gICAgcHJvdGVjdGVkIHRpbWVyc01hcDogTWFwPHN0cmluZywgW251bWJlciwgbnVtYmVyXT4gPSBuZXcgTWFwKCk7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgaXNEZXY6IGJvb2xlYW4sIHByb3RlY3RlZCBmaWx0ZXI6IChsZXZlbDogTG9nTGV2ZWxUeXBlKSA9PiBib29sZWFuID0gbnVsbCkgeyB9XG5cbiAgICBkZWJ1ZyhtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzRGV2KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy53cml0ZShMb2dMZXZlbFR5cGUuRGVidWcsIG1lc3NhZ2UpO1xuICAgIH1cblxuICAgIGluZm8obWVzc2FnZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMud3JpdGUoTG9nTGV2ZWxUeXBlLkluZm8sIG1lc3NhZ2UpO1xuICAgIH1cblxuICAgIHdhcm5pbmcobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMud3JpdGUoTG9nTGV2ZWxUeXBlLldhcm5pbmcsIG1lc3NhZ2UpO1xuICAgIH1cblxuICAgIGVycm9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgICAgICB0aGlzLndyaXRlKExvZ0xldmVsVHlwZS5FcnJvciwgbWVzc2FnZSk7XG4gICAgfVxuXG4gICAgd3JpdGUobGV2ZWw6IExvZ0xldmVsVHlwZSwgbWVzc2FnZTogc3RyaW5nKSB7XG4gICAgICAgIGlmICh0aGlzLmZpbHRlciAhPSBudWxsICYmIHRoaXMuZmlsdGVyKGxldmVsKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgc3dpdGNoIChsZXZlbCkge1xuICAgICAgICAgICAgY2FzZSBMb2dMZXZlbFR5cGUuRGVidWc6XG4gICAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2cobWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIExvZ0xldmVsVHlwZS5JbmZvOlxuICAgICAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZVxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBMb2dMZXZlbFR5cGUuV2FybmluZzpcbiAgICAgICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4obWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIExvZ0xldmVsVHlwZS5FcnJvcjpcbiAgICAgICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHRpbWUobGFiZWw6IHN0cmluZyA9ICdkZWZhdWx0Jykge1xuICAgICAgICBpZiAoIXRoaXMudGltZXJzTWFwLmhhcyhsYWJlbCkpIHtcbiAgICAgICAgICAgIHRoaXMudGltZXJzTWFwLnNldChsYWJlbCwgaHJ0aW1lKCkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdGltZUVuZChsYWJlbDogc3RyaW5nID0gJ2RlZmF1bHQnKTogW251bWJlciwgbnVtYmVyXSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWQgPSBocnRpbWUodGhpcy50aW1lcnNNYXAuZ2V0KGxhYmVsKSk7XG4gICAgICAgIHRoaXMudGltZXJzTWFwLmRlbGV0ZShsYWJlbCk7XG4gICAgICAgIHRoaXMud3JpdGUoTG9nTGV2ZWxUeXBlLkluZm8sIGAke2xhYmVsfTogJHtlbGFwc2VkWzBdICogMTAwMCArIGVsYXBzZWRbMV0gLyAxMGU2fW1zYCk7XG4gICAgICAgIHJldHVybiBlbGFwc2VkO1xuICAgIH1cbn1cbiIsImV4cG9ydCBjbGFzcyBDb25zdGFudHNTZXJ2aWNlIHtcbiAgICBzdGF0aWMgcmVhZG9ubHkgZW52aXJvbm1lbnRVcmxzS2V5OiBzdHJpbmcgPSAnZW52aXJvbm1lbnRVcmxzJztcbiAgICBzdGF0aWMgcmVhZG9ubHkgZGlzYWJsZUdhS2V5OiBzdHJpbmcgPSAnZGlzYWJsZUdhJztcbiAgICBzdGF0aWMgcmVhZG9ubHkgZGlzYWJsZUFkZExvZ2luTm90aWZpY2F0aW9uS2V5OiBzdHJpbmcgPSAnZGlzYWJsZUFkZExvZ2luTm90aWZpY2F0aW9uJztcbiAgICBzdGF0aWMgcmVhZG9ubHkgZGlzYWJsZUNoYW5nZWRQYXNzd29yZE5vdGlmaWNhdGlvbktleTogc3RyaW5nID0gJ2Rpc2FibGVDaGFuZ2VkUGFzc3dvcmROb3RpZmljYXRpb24nO1xuICAgIHN0YXRpYyByZWFkb25seSBkaXNhYmxlQ29udGV4dE1lbnVJdGVtS2V5OiBzdHJpbmcgPSAnZGlzYWJsZUNvbnRleHRNZW51SXRlbSc7XG4gICAgc3RhdGljIHJlYWRvbmx5IGRpc2FibGVGYXZpY29uS2V5OiBzdHJpbmcgPSAnZGlzYWJsZUZhdmljb24nO1xuICAgIHN0YXRpYyByZWFkb25seSBkaXNhYmxlQmFkZ2VDb3VudGVyS2V5OiBzdHJpbmcgPSAnZGlzYWJsZUJhZGdlQ291bnRlcic7XG4gICAgc3RhdGljIHJlYWRvbmx5IGRpc2FibGVBdXRvVG90cENvcHlLZXk6IHN0cmluZyA9ICdkaXNhYmxlQXV0b1RvdHBDb3B5JztcbiAgICBzdGF0aWMgcmVhZG9ubHkgZGlzYWJsZUF1dG9CaW9tZXRyaWNzUHJvbXB0S2V5OiBzdHJpbmcgPSAnbm9BdXRvUHJvbXB0QmlvbWV0cmljcyc7XG4gICAgc3RhdGljIHJlYWRvbmx5IGVuYWJsZUF1dG9GaWxsT25QYWdlTG9hZEtleTogc3RyaW5nID0gJ2VuYWJsZUF1dG9GaWxsT25QYWdlTG9hZCc7XG4gICAgc3RhdGljIHJlYWRvbmx5IGF1dG9GaWxsT25QYWdlTG9hZERlZmF1bHRLZXk6IHN0cmluZyA9ICdhdXRvRmlsbE9uUGFnZUxvYWREZWZhdWx0JztcbiAgICBzdGF0aWMgcmVhZG9ubHkgdmF1bHRUaW1lb3V0S2V5OiBzdHJpbmcgPSAnbG9ja09wdGlvbic7XG4gICAgc3RhdGljIHJlYWRvbmx5IHZhdWx0VGltZW91dEFjdGlvbktleTogc3RyaW5nID0gJ3ZhdWx0VGltZW91dEFjdGlvbic7XG4gICAgc3RhdGljIHJlYWRvbmx5IGxhc3RBY3RpdmVLZXk6IHN0cmluZyA9ICdsYXN0QWN0aXZlJztcbiAgICBzdGF0aWMgcmVhZG9ubHkgbmV2ZXJEb21haW5zS2V5OiBzdHJpbmcgPSAnbmV2ZXJEb21haW5zJztcbiAgICBzdGF0aWMgcmVhZG9ubHkgaW5zdGFsbGVkVmVyc2lvbktleTogc3RyaW5nID0gJ2luc3RhbGxlZFZlcnNpb24nO1xuICAgIHN0YXRpYyByZWFkb25seSBsb2NhbGVLZXk6IHN0cmluZyA9ICdsb2NhbGUnO1xuICAgIHN0YXRpYyByZWFkb25seSB0aGVtZUtleTogc3RyaW5nID0gJ3RoZW1lJztcbiAgICBzdGF0aWMgcmVhZG9ubHkgY29sbGFwc2VkR3JvdXBpbmdzS2V5OiBzdHJpbmcgPSAnY29sbGFwc2VkR3JvdXBpbmdzJztcbiAgICBzdGF0aWMgcmVhZG9ubHkgYXV0b0NvbmZpcm1GaW5nZXJwcmludHM6IHN0cmluZyA9ICdhdXRvQ29uZmlybUZpbmdlcnByaW50cyc7XG4gICAgc3RhdGljIHJlYWRvbmx5IGRvbnRTaG93Q2FyZHNDdXJyZW50VGFiOiBzdHJpbmcgPSAnZG9udFNob3dDYXJkc0N1cnJlbnRUYWInO1xuICAgIHN0YXRpYyByZWFkb25seSBkb250U2hvd0lkZW50aXRpZXNDdXJyZW50VGFiOiBzdHJpbmcgPSAnZG9udFNob3dJZGVudGl0aWVzQ3VycmVudFRhYic7XG4gICAgc3RhdGljIHJlYWRvbmx5IGRlZmF1bHRVcmlNYXRjaDogc3RyaW5nID0gJ2RlZmF1bHRVcmlNYXRjaCc7XG4gICAgc3RhdGljIHJlYWRvbmx5IHBpblByb3RlY3RlZEtleTogc3RyaW5nID0gJ3BpblByb3RlY3RlZEtleSc7XG4gICAgc3RhdGljIHJlYWRvbmx5IHByb3RlY3RlZFBpbjogc3RyaW5nID0gJ3Byb3RlY3RlZFBpbic7XG4gICAgc3RhdGljIHJlYWRvbmx5IGNsZWFyQ2xpcGJvYXJkS2V5OiBzdHJpbmcgPSAnY2xlYXJDbGlwYm9hcmRLZXknO1xuICAgIHN0YXRpYyByZWFkb25seSBldmVudENvbGxlY3Rpb25LZXk6IHN0cmluZyA9ICdldmVudENvbGxlY3Rpb24nO1xuICAgIHN0YXRpYyByZWFkb25seSBzc29Db2RlVmVyaWZpZXJLZXk6IHN0cmluZyA9ICdzc29Db2RlVmVyaWZpZXInO1xuICAgIHN0YXRpYyByZWFkb25seSBzc29TdGF0ZUtleTogc3RyaW5nID0gJ3Nzb1N0YXRlJztcbiAgICBzdGF0aWMgcmVhZG9ubHkgYmlvbWV0cmljVW5sb2NrS2V5OiBzdHJpbmcgPSAnYmlvbWV0cmljJztcbiAgICBzdGF0aWMgcmVhZG9ubHkgYmlvbWV0cmljVGV4dDogc3RyaW5nID0gJ2Jpb21ldHJpY1RleHQnO1xuICAgIHN0YXRpYyByZWFkb25seSBiaW9tZXRyaWNBd2FpdGluZ0FjY2VwdGFuY2U6IHN0cmluZyA9ICdiaW9tZXRyaWNBd2FpdGluZ0FjY2VwdGFuY2UnO1xuICAgIHN0YXRpYyByZWFkb25seSBiaW9tZXRyaWNGaW5nZXJwcmludFZhbGlkYXRlZDogc3RyaW5nID0gJ2Jpb21ldHJpY0ZpbmdlcnByaW50VmFsaWRhdGVkJztcblxuICAgIHJlYWRvbmx5IGVudmlyb25tZW50VXJsc0tleTogc3RyaW5nID0gQ29uc3RhbnRzU2VydmljZS5lbnZpcm9ubWVudFVybHNLZXk7XG4gICAgcmVhZG9ubHkgZGlzYWJsZUdhS2V5OiBzdHJpbmcgPSBDb25zdGFudHNTZXJ2aWNlLmRpc2FibGVHYUtleTtcbiAgICByZWFkb25seSBkaXNhYmxlQWRkTG9naW5Ob3RpZmljYXRpb25LZXk6IHN0cmluZyA9IENvbnN0YW50c1NlcnZpY2UuZGlzYWJsZUFkZExvZ2luTm90aWZpY2F0aW9uS2V5O1xuICAgIHJlYWRvbmx5IGRpc2FibGVDb250ZXh0TWVudUl0ZW1LZXk6IHN0cmluZyA9IENvbnN0YW50c1NlcnZpY2UuZGlzYWJsZUNvbnRleHRNZW51SXRlbUtleTtcbiAgICByZWFkb25seSBkaXNhYmxlRmF2aWNvbktleTogc3RyaW5nID0gQ29uc3RhbnRzU2VydmljZS5kaXNhYmxlRmF2aWNvbktleTtcbiAgICByZWFkb25seSBkaXNhYmxlQmFkZ2VDb3VudGVyS2V5OiBzdHJpbmcgPSBDb25zdGFudHNTZXJ2aWNlLmRpc2FibGVCYWRnZUNvdW50ZXJLZXk7XG4gICAgcmVhZG9ubHkgZGlzYWJsZUF1dG9Ub3RwQ29weUtleTogc3RyaW5nID0gQ29uc3RhbnRzU2VydmljZS5kaXNhYmxlQXV0b1RvdHBDb3B5S2V5O1xuICAgIHJlYWRvbmx5IGRpc2FibGVBdXRvQmlvbWV0cmljc1Byb21wdEtleTogc3RyaW5nID0gQ29uc3RhbnRzU2VydmljZS5kaXNhYmxlQXV0b0Jpb21ldHJpY3NQcm9tcHRLZXk7XG4gICAgcmVhZG9ubHkgZW5hYmxlQXV0b0ZpbGxPblBhZ2VMb2FkS2V5OiBzdHJpbmcgPSBDb25zdGFudHNTZXJ2aWNlLmVuYWJsZUF1dG9GaWxsT25QYWdlTG9hZEtleTtcbiAgICByZWFkb25seSBhdXRvRmlsbE9uUGFnZUxvYWREZWZhdWx0S2V5OiBzdHJpbmcgPSBDb25zdGFudHNTZXJ2aWNlLmF1dG9GaWxsT25QYWdlTG9hZERlZmF1bHRLZXk7XG4gICAgcmVhZG9ubHkgdmF1bHRUaW1lb3V0S2V5OiBzdHJpbmcgPSBDb25zdGFudHNTZXJ2aWNlLnZhdWx0VGltZW91dEtleTtcbiAgICByZWFkb25seSB2YXVsdFRpbWVvdXRBY3Rpb25LZXk6IHN0cmluZyA9IENvbnN0YW50c1NlcnZpY2UudmF1bHRUaW1lb3V0QWN0aW9uS2V5O1xuICAgIHJlYWRvbmx5IGxhc3RBY3RpdmVLZXk6IHN0cmluZyA9IENvbnN0YW50c1NlcnZpY2UubGFzdEFjdGl2ZUtleTtcbiAgICByZWFkb25seSBuZXZlckRvbWFpbnNLZXk6IHN0cmluZyA9IENvbnN0YW50c1NlcnZpY2UubmV2ZXJEb21haW5zS2V5O1xuICAgIHJlYWRvbmx5IGluc3RhbGxlZFZlcnNpb25LZXk6IHN0cmluZyA9IENvbnN0YW50c1NlcnZpY2UuaW5zdGFsbGVkVmVyc2lvbktleTtcbiAgICByZWFkb25seSBsb2NhbGVLZXk6IHN0cmluZyA9IENvbnN0YW50c1NlcnZpY2UubG9jYWxlS2V5O1xuICAgIHJlYWRvbmx5IHRoZW1lS2V5OiBzdHJpbmcgPSBDb25zdGFudHNTZXJ2aWNlLnRoZW1lS2V5O1xuICAgIHJlYWRvbmx5IGNvbGxhcHNlZEdyb3VwaW5nc0tleTogc3RyaW5nID0gQ29uc3RhbnRzU2VydmljZS5jb2xsYXBzZWRHcm91cGluZ3NLZXk7XG4gICAgcmVhZG9ubHkgYXV0b0NvbmZpcm1GaW5nZXJwcmludHM6IHN0cmluZyA9IENvbnN0YW50c1NlcnZpY2UuYXV0b0NvbmZpcm1GaW5nZXJwcmludHM7XG4gICAgcmVhZG9ubHkgZG9udFNob3dDYXJkc0N1cnJlbnRUYWI6IHN0cmluZyA9IENvbnN0YW50c1NlcnZpY2UuZG9udFNob3dDYXJkc0N1cnJlbnRUYWI7XG4gICAgcmVhZG9ubHkgZG9udFNob3dJZGVudGl0aWVzQ3VycmVudFRhYjogc3RyaW5nID0gQ29uc3RhbnRzU2VydmljZS5kb250U2hvd0lkZW50aXRpZXNDdXJyZW50VGFiO1xuICAgIHJlYWRvbmx5IGRlZmF1bHRVcmlNYXRjaDogc3RyaW5nID0gQ29uc3RhbnRzU2VydmljZS5kZWZhdWx0VXJpTWF0Y2g7XG4gICAgcmVhZG9ubHkgcGluUHJvdGVjdGVkS2V5OiBzdHJpbmcgPSBDb25zdGFudHNTZXJ2aWNlLnBpblByb3RlY3RlZEtleTtcbiAgICByZWFkb25seSBwcm90ZWN0ZWRQaW46IHN0cmluZyA9IENvbnN0YW50c1NlcnZpY2UucHJvdGVjdGVkUGluO1xuICAgIHJlYWRvbmx5IGNsZWFyQ2xpcGJvYXJkS2V5OiBzdHJpbmcgPSBDb25zdGFudHNTZXJ2aWNlLmNsZWFyQ2xpcGJvYXJkS2V5O1xuICAgIHJlYWRvbmx5IGV2ZW50Q29sbGVjdGlvbktleTogc3RyaW5nID0gQ29uc3RhbnRzU2VydmljZS5ldmVudENvbGxlY3Rpb25LZXk7XG4gICAgcmVhZG9ubHkgc3NvQ29kZVZlcmlmaWVyS2V5OiBzdHJpbmcgPSBDb25zdGFudHNTZXJ2aWNlLnNzb0NvZGVWZXJpZmllcktleTtcbiAgICByZWFkb25seSBzc29TdGF0ZUtleTogc3RyaW5nID0gQ29uc3RhbnRzU2VydmljZS5zc29TdGF0ZUtleTtcbiAgICByZWFkb25seSBiaW9tZXRyaWNVbmxvY2tLZXk6IHN0cmluZyA9IENvbnN0YW50c1NlcnZpY2UuYmlvbWV0cmljVW5sb2NrS2V5O1xuICAgIHJlYWRvbmx5IGJpb21ldHJpY1RleHQ6IHN0cmluZyA9IENvbnN0YW50c1NlcnZpY2UuYmlvbWV0cmljVGV4dDtcbiAgICByZWFkb25seSBiaW9tZXRyaWNBd2FpdGluZ0FjY2VwdGFuY2U6IHN0cmluZyA9IENvbnN0YW50c1NlcnZpY2UuYmlvbWV0cmljQXdhaXRpbmdBY2NlcHRhbmNlO1xuICAgIHJlYWRvbmx5IGJpb21ldHJpY0ZpbmdlcnByaW50VmFsaWRhdGVkOiBzdHJpbmcgPSBDb25zdGFudHNTZXJ2aWNlLmJpb21ldHJpY0ZpbmdlcnByaW50VmFsaWRhdGVkO1xufVxuIiwiaW1wb3J0IHsgQ3J5cHRvU2VydmljZSB9IGZyb20gJy4uL2Fic3RyYWN0aW9ucy9jcnlwdG8uc2VydmljZSc7XG5cbmV4cG9ydCBjbGFzcyBDb250YWluZXJTZXJ2aWNlIHtcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNyeXB0b1NlcnZpY2U6IENyeXB0b1NlcnZpY2UpIHtcbiAgICB9XG5cbiAgICAvLyBkZXByZWNhdGVkLCB1c2UgYXR0YWNoVG9HbG9iYWwgaW5zdGVhZFxuICAgIGF0dGFjaFRvV2luZG93KHdpbjogYW55KSB7XG4gICAgICAgIHRoaXMuYXR0YWNoVG9HbG9iYWwod2luKTtcbiAgICB9XG5cbiAgICBhdHRhY2hUb0dsb2JhbChnbG9iYWw6IGFueSkge1xuICAgICAgICBpZiAoIWdsb2JhbC5iaXR3YXJkZW5Db250YWluZXJTZXJ2aWNlKSB7XG4gICAgICAgICAgICBnbG9iYWwuYml0d2FyZGVuQ29udGFpbmVyU2VydmljZSA9IHRoaXM7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRDcnlwdG9TZXJ2aWNlKCk6IENyeXB0b1NlcnZpY2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5jcnlwdG9TZXJ2aWNlO1xuICAgIH1cbn1cbiIsImltcG9ydCAqIGFzIGJpZ0ludCBmcm9tICdiaWctaW50ZWdlcic7XG5cbmltcG9ydCB7IEVuY3J5cHRpb25UeXBlIH0gZnJvbSAnLi4vZW51bXMvZW5jcnlwdGlvblR5cGUnO1xuaW1wb3J0IHsgSGFzaFB1cnBvc2UgfSBmcm9tICcuLi9lbnVtcy9oYXNoUHVycG9zZSc7XG5pbXBvcnQgeyBLZGZUeXBlIH0gZnJvbSAnLi4vZW51bXMva2RmVHlwZSc7XG5cbmltcG9ydCB7IEVuY0FycmF5QnVmZmVyIH0gZnJvbSAnLi4vbW9kZWxzL2RvbWFpbi9lbmNBcnJheUJ1ZmZlcic7XG5pbXBvcnQgeyBFbmNyeXB0ZWRPYmplY3QgfSBmcm9tICcuLi9tb2RlbHMvZG9tYWluL2VuY3J5cHRlZE9iamVjdCc7XG5pbXBvcnQgeyBFbmNTdHJpbmcgfSBmcm9tICcuLi9tb2RlbHMvZG9tYWluL2VuY1N0cmluZyc7XG5pbXBvcnQgeyBTeW1tZXRyaWNDcnlwdG9LZXkgfSBmcm9tICcuLi9tb2RlbHMvZG9tYWluL3N5bW1ldHJpY0NyeXB0b0tleSc7XG5pbXBvcnQgeyBQcm9maWxlT3JnYW5pemF0aW9uUmVzcG9uc2UgfSBmcm9tICcuLi9tb2RlbHMvcmVzcG9uc2UvcHJvZmlsZU9yZ2FuaXphdGlvblJlc3BvbnNlJztcblxuaW1wb3J0IHsgQ3J5cHRvU2VydmljZSBhcyBDcnlwdG9TZXJ2aWNlQWJzdHJhY3Rpb24gfSBmcm9tICcuLi9hYnN0cmFjdGlvbnMvY3J5cHRvLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ3J5cHRvRnVuY3Rpb25TZXJ2aWNlIH0gZnJvbSAnLi4vYWJzdHJhY3Rpb25zL2NyeXB0b0Z1bmN0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgTG9nU2VydmljZSB9IGZyb20gJy4uL2Fic3RyYWN0aW9ucy9sb2cuc2VydmljZSc7XG5pbXBvcnQgeyBQbGF0Zm9ybVV0aWxzU2VydmljZSB9IGZyb20gJy4uL2Fic3RyYWN0aW9ucy9wbGF0Zm9ybVV0aWxzLnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgICBLZXlTdWZmaXhPcHRpb25zLFxuICAgIFN0b3JhZ2VTZXJ2aWNlLFxufSBmcm9tICcuLi9hYnN0cmFjdGlvbnMvc3RvcmFnZS5zZXJ2aWNlJztcblxuaW1wb3J0IHsgQ29uc3RhbnRzU2VydmljZSB9IGZyb20gJy4vY29uc3RhbnRzLnNlcnZpY2UnO1xuXG5pbXBvcnQgeyBzZXF1ZW50aWFsaXplIH0gZnJvbSAnLi4vbWlzYy9zZXF1ZW50aWFsaXplJztcbmltcG9ydCB7IFV0aWxzIH0gZnJvbSAnLi4vbWlzYy91dGlscyc7XG5pbXBvcnQgeyBFRUZMb25nV29yZExpc3QgfSBmcm9tICcuLi9taXNjL3dvcmRsaXN0JztcbmltcG9ydCB7IFByb2ZpbGVQcm92aWRlck9yZ2FuaXphdGlvblJlc3BvbnNlIH0gZnJvbSAnLi4vbW9kZWxzL3Jlc3BvbnNlL3Byb2ZpbGVQcm92aWRlck9yZ2FuaXphdGlvblJlc3BvbnNlJztcbmltcG9ydCB7IFByb2ZpbGVQcm92aWRlclJlc3BvbnNlIH0gZnJvbSAnLi4vbW9kZWxzL3Jlc3BvbnNlL3Byb2ZpbGVQcm92aWRlclJlc3BvbnNlJztcblxuZXhwb3J0IGNvbnN0IEtleXMgPSB7XG4gICAga2V5OiAna2V5JywgLy8gTWFzdGVyIEtleVxuICAgIGVuY09yZ0tleXM6ICdlbmNPcmdLZXlzJyxcbiAgICBlbmNQcm92aWRlcktleXM6ICdlbmNQcm92aWRlcktleXMnLFxuICAgIGVuY1ByaXZhdGVLZXk6ICdlbmNQcml2YXRlS2V5JyxcbiAgICBlbmNLZXk6ICdlbmNLZXknLCAvLyBHZW5lcmF0ZWQgU3ltbWV0cmljIEtleVxuICAgIGtleUhhc2g6ICdrZXlIYXNoJyxcbn07XG5cbmV4cG9ydCBjbGFzcyBDcnlwdG9TZXJ2aWNlIGltcGxlbWVudHMgQ3J5cHRvU2VydmljZUFic3RyYWN0aW9uIHtcbiAgICBwcml2YXRlIGtleTogU3ltbWV0cmljQ3J5cHRvS2V5O1xuICAgIHByaXZhdGUgZW5jS2V5OiBTeW1tZXRyaWNDcnlwdG9LZXk7XG4gICAgcHJpdmF0ZSBsZWdhY3lFdG1LZXk6IFN5bW1ldHJpY0NyeXB0b0tleTtcbiAgICBwcml2YXRlIGtleUhhc2g6IHN0cmluZztcbiAgICBwcml2YXRlIHB1YmxpY0tleTogQXJyYXlCdWZmZXI7XG4gICAgcHJpdmF0ZSBwcml2YXRlS2V5OiBBcnJheUJ1ZmZlcjtcbiAgICBwcml2YXRlIG9yZ0tleXM6IE1hcDxzdHJpbmcsIFN5bW1ldHJpY0NyeXB0b0tleT47XG4gICAgcHJpdmF0ZSBwcm92aWRlcktleXM6IE1hcDxzdHJpbmcsIFN5bW1ldHJpY0NyeXB0b0tleT47XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHN0b3JhZ2VTZXJ2aWNlOiBTdG9yYWdlU2VydmljZSwgcHJvdGVjdGVkIHNlY3VyZVN0b3JhZ2VTZXJ2aWNlOiBTdG9yYWdlU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBjcnlwdG9GdW5jdGlvblNlcnZpY2U6IENyeXB0b0Z1bmN0aW9uU2VydmljZSwgcHJvdGVjdGVkIHBsYXRmb3JtVXRpbFNlcnZpY2U6IFBsYXRmb3JtVXRpbHNTZXJ2aWNlLFxuICAgICAgICBwcm90ZWN0ZWQgbG9nU2VydmljZTogTG9nU2VydmljZSkge1xuICAgIH1cblxuICAgIGFzeW5jIHNldEtleShrZXk6IFN5bW1ldHJpY0NyeXB0b0tleSk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIHRoaXMua2V5ID0ga2V5O1xuXG4gICAgICAgIGF3YWl0IHRoaXMuc3RvcmVLZXkoa2V5KTtcbiAgICB9XG5cbiAgICBzZXRLZXlIYXNoKGtleUhhc2g6IHN0cmluZyk6IFByb21pc2U8e30+IHtcbiAgICAgICAgdGhpcy5rZXlIYXNoID0ga2V5SGFzaDtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2F2ZShLZXlzLmtleUhhc2gsIGtleUhhc2gpO1xuICAgIH1cblxuICAgIGFzeW5jIHNldEVuY0tleShlbmNLZXk6IHN0cmluZyk6IFByb21pc2U8e30+IHtcbiAgICAgICAgaWYgKGVuY0tleSA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNhdmUoS2V5cy5lbmNLZXksIGVuY0tleSk7XG4gICAgICAgIHRoaXMuZW5jS2V5ID0gbnVsbDtcbiAgICB9XG5cbiAgICBhc3luYyBzZXRFbmNQcml2YXRlS2V5KGVuY1ByaXZhdGVLZXk6IHN0cmluZyk6IFByb21pc2U8e30+IHtcbiAgICAgICAgaWYgKGVuY1ByaXZhdGVLZXkgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgdGhpcy5zdG9yYWdlU2VydmljZS5zYXZlKEtleXMuZW5jUHJpdmF0ZUtleSwgZW5jUHJpdmF0ZUtleSk7XG4gICAgICAgIHRoaXMucHJpdmF0ZUtleSA9IG51bGw7XG4gICAgfVxuXG4gICAgYXN5bmMgc2V0T3JnS2V5cyhvcmdzOiBQcm9maWxlT3JnYW5pemF0aW9uUmVzcG9uc2VbXSwgcHJvdmlkZXJPcmdzOiBQcm9maWxlUHJvdmlkZXJPcmdhbml6YXRpb25SZXNwb25zZVtdKTogUHJvbWlzZTx7fT4ge1xuICAgICAgICBjb25zdCBvcmdLZXlzOiBhbnkgPSB7fTtcbiAgICAgICAgb3Jncy5mb3JFYWNoKG9yZyA9PiB7XG4gICAgICAgICAgICBvcmdLZXlzW29yZy5pZF0gPSBvcmcua2V5O1xuICAgICAgICB9KTtcblxuICAgICAgICBmb3IgKGNvbnN0IHByb3ZpZGVyT3JnIG9mIHByb3ZpZGVyT3Jncykge1xuICAgICAgICAgICAgLy8gQ29udmVydCBwcm92aWRlciBlbmNyeXB0ZWQga2V5cyB0byB1c2VyIGVuY3J5cHRlZC5cbiAgICAgICAgICAgIGNvbnN0IHByb3ZpZGVyS2V5ID0gYXdhaXQgdGhpcy5nZXRQcm92aWRlcktleShwcm92aWRlck9yZy5wcm92aWRlcklkKTtcbiAgICAgICAgICAgIGNvbnN0IGRlY1ZhbHVlID0gYXdhaXQgdGhpcy5kZWNyeXB0VG9CeXRlcyhuZXcgRW5jU3RyaW5nKHByb3ZpZGVyT3JnLmtleSksIHByb3ZpZGVyS2V5KTtcbiAgICAgICAgICAgIG9yZ0tleXNbcHJvdmlkZXJPcmcuaWRdID0gYXdhaXQgKGF3YWl0IHRoaXMucnNhRW5jcnlwdChkZWNWYWx1ZSkpLmVuY3J5cHRlZFN0cmluZztcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMub3JnS2V5cyA9IG51bGw7XG4gICAgICAgIHJldHVybiB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNhdmUoS2V5cy5lbmNPcmdLZXlzLCBvcmdLZXlzKTtcbiAgICB9XG5cbiAgICBzZXRQcm92aWRlcktleXMocHJvdmlkZXJzOiBQcm9maWxlUHJvdmlkZXJSZXNwb25zZVtdKTogUHJvbWlzZTx7fT4ge1xuICAgICAgICBjb25zdCBwcm92aWRlcktleXM6IGFueSA9IHt9O1xuICAgICAgICBwcm92aWRlcnMuZm9yRWFjaChwcm92aWRlciA9PiB7XG4gICAgICAgICAgICBwcm92aWRlcktleXNbcHJvdmlkZXIuaWRdID0gcHJvdmlkZXIua2V5O1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnByb3ZpZGVyS2V5cyA9IG51bGw7XG4gICAgICAgIHJldHVybiB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNhdmUoS2V5cy5lbmNQcm92aWRlcktleXMsIHByb3ZpZGVyS2V5cyk7XG4gICAgfVxuXG4gICAgYXN5bmMgZ2V0S2V5KGtleVN1ZmZpeD86IEtleVN1ZmZpeE9wdGlvbnMpOiBQcm9taXNlPFN5bW1ldHJpY0NyeXB0b0tleT4ge1xuICAgICAgICBpZiAodGhpcy5rZXkgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMua2V5O1xuICAgICAgICB9XG5cbiAgICAgICAga2V5U3VmZml4IHx8PSAnYXV0byc7XG4gICAgICAgIGNvbnN0IHN5bW1ldHJpY0tleSA9IGF3YWl0IHRoaXMuZ2V0S2V5RnJvbVN0b3JhZ2Uoa2V5U3VmZml4KTtcblxuICAgICAgICBpZiAoc3ltbWV0cmljS2V5ICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0S2V5KHN5bW1ldHJpY0tleSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc3ltbWV0cmljS2V5O1xuICAgIH1cblxuICAgIGFzeW5jIGdldEtleUZyb21TdG9yYWdlKGtleVN1ZmZpeDogS2V5U3VmZml4T3B0aW9ucyk6IFByb21pc2U8U3ltbWV0cmljQ3J5cHRvS2V5PiB7XG4gICAgICAgIGNvbnN0IGtleSA9IGF3YWl0IHRoaXMucmV0cmlldmVLZXlGcm9tU3RvcmFnZShrZXlTdWZmaXgpO1xuICAgICAgICBpZiAoa2V5ICE9IG51bGwpIHtcblxuICAgICAgICAgICAgY29uc3Qgc3ltbWV0cmljS2V5ID0gbmV3IFN5bW1ldHJpY0NyeXB0b0tleShVdGlscy5mcm9tQjY0VG9BcnJheShrZXkpLmJ1ZmZlcik7XG5cbiAgICAgICAgICAgIGlmICghYXdhaXQgdGhpcy52YWxpZGF0ZUtleShzeW1tZXRyaWNLZXkpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dTZXJ2aWNlLndhcm5pbmcoJ1dyb25nIGtleSwgdGhyb3dpbmcgYXdheSBzdG9yZWQga2V5Jyk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWN1cmVTdG9yYWdlU2VydmljZS5yZW1vdmUoS2V5cy5rZXksIHsga2V5U3VmZml4OiBrZXlTdWZmaXggfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBzeW1tZXRyaWNLZXk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgYXN5bmMgZ2V0S2V5SGFzaCgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBpZiAodGhpcy5rZXlIYXNoICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmtleUhhc2g7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBrZXlIYXNoID0gYXdhaXQgdGhpcy5zdG9yYWdlU2VydmljZS5nZXQ8c3RyaW5nPihLZXlzLmtleUhhc2gpO1xuICAgICAgICBpZiAoa2V5SGFzaCAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmtleUhhc2ggPSBrZXlIYXNoO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGtleUhhc2ggPT0gbnVsbCA/IG51bGwgOiB0aGlzLmtleUhhc2g7XG4gICAgfVxuXG4gICAgYXN5bmMgY29tcGFyZUFuZFVwZGF0ZUtleUhhc2gobWFzdGVyUGFzc3dvcmQ6IHN0cmluZywga2V5OiBTeW1tZXRyaWNDcnlwdG9LZXkpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgY29uc3Qgc3RvcmVkS2V5SGFzaCA9IGF3YWl0IHRoaXMuZ2V0S2V5SGFzaCgpO1xuICAgICAgICBpZiAobWFzdGVyUGFzc3dvcmQgIT0gbnVsbCAmJiBzdG9yZWRLZXlIYXNoICE9IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsS2V5SGFzaCA9IGF3YWl0IHRoaXMuaGFzaFBhc3N3b3JkKG1hc3RlclBhc3N3b3JkLCBrZXksIEhhc2hQdXJwb3NlLkxvY2FsQXV0aG9yaXphdGlvbik7XG4gICAgICAgICAgICBpZiAobG9jYWxLZXlIYXNoICE9IG51bGwgJiYgc3RvcmVkS2V5SGFzaCA9PT0gbG9jYWxLZXlIYXNoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFRPRE86IHJlbW92ZSBzZXJ2ZXJLZXlIYXNoIGNoZWNrIGluIDEtMiByZWxlYXNlcyBhZnRlciBldmVyeW9uZSdzIGtleUhhc2ggaGFzIGJlZW4gdXBkYXRlZFxuICAgICAgICAgICAgY29uc3Qgc2VydmVyS2V5SGFzaCA9IGF3YWl0IHRoaXMuaGFzaFBhc3N3b3JkKG1hc3RlclBhc3N3b3JkLCBrZXksIEhhc2hQdXJwb3NlLlNlcnZlckF1dGhvcml6YXRpb24pO1xuICAgICAgICAgICAgaWYgKHNlcnZlcktleUhhc2ggIT0gbnVsbCAmJiBzdG9yZWRLZXlIYXNoID09PSBzZXJ2ZXJLZXlIYXNoKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXRLZXlIYXNoKGxvY2FsS2V5SGFzaCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgQHNlcXVlbnRpYWxpemUoKCkgPT4gJ2dldEVuY0tleScpXG4gICAgYXN5bmMgZ2V0RW5jS2V5KGtleTogU3ltbWV0cmljQ3J5cHRvS2V5ID0gbnVsbCk6IFByb21pc2U8U3ltbWV0cmljQ3J5cHRvS2V5PiB7XG4gICAgICAgIGlmICh0aGlzLmVuY0tleSAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5lbmNLZXk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBlbmNLZXkgPSBhd2FpdCB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldDxzdHJpbmc+KEtleXMuZW5jS2V5KTtcbiAgICAgICAgaWYgKGVuY0tleSA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChrZXkgPT0gbnVsbCkge1xuICAgICAgICAgICAga2V5ID0gYXdhaXQgdGhpcy5nZXRLZXkoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoa2V5ID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGRlY0VuY0tleTogQXJyYXlCdWZmZXI7XG4gICAgICAgIGNvbnN0IGVuY0tleUNpcGhlciA9IG5ldyBFbmNTdHJpbmcoZW5jS2V5KTtcbiAgICAgICAgaWYgKGVuY0tleUNpcGhlci5lbmNyeXB0aW9uVHlwZSA9PT0gRW5jcnlwdGlvblR5cGUuQWVzQ2JjMjU2X0I2NCkge1xuICAgICAgICAgICAgZGVjRW5jS2V5ID0gYXdhaXQgdGhpcy5kZWNyeXB0VG9CeXRlcyhlbmNLZXlDaXBoZXIsIGtleSk7XG4gICAgICAgIH0gZWxzZSBpZiAoZW5jS2V5Q2lwaGVyLmVuY3J5cHRpb25UeXBlID09PSBFbmNyeXB0aW9uVHlwZS5BZXNDYmMyNTZfSG1hY1NoYTI1Nl9CNjQpIHtcbiAgICAgICAgICAgIGNvbnN0IG5ld0tleSA9IGF3YWl0IHRoaXMuc3RyZXRjaEtleShrZXkpO1xuICAgICAgICAgICAgZGVjRW5jS2V5ID0gYXdhaXQgdGhpcy5kZWNyeXB0VG9CeXRlcyhlbmNLZXlDaXBoZXIsIG5ld0tleSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIGVuY0tleSB0eXBlLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRlY0VuY0tleSA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVuY0tleSA9IG5ldyBTeW1tZXRyaWNDcnlwdG9LZXkoZGVjRW5jS2V5KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW5jS2V5O1xuICAgIH1cblxuICAgIGFzeW5jIGdldFB1YmxpY0tleSgpOiBQcm9taXNlPEFycmF5QnVmZmVyPiB7XG4gICAgICAgIGlmICh0aGlzLnB1YmxpY0tleSAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wdWJsaWNLZXk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwcml2YXRlS2V5ID0gYXdhaXQgdGhpcy5nZXRQcml2YXRlS2V5KCk7XG4gICAgICAgIGlmIChwcml2YXRlS2V5ID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5wdWJsaWNLZXkgPSBhd2FpdCB0aGlzLmNyeXB0b0Z1bmN0aW9uU2VydmljZS5yc2FFeHRyYWN0UHVibGljS2V5KHByaXZhdGVLZXkpO1xuICAgICAgICByZXR1cm4gdGhpcy5wdWJsaWNLZXk7XG4gICAgfVxuXG4gICAgYXN5bmMgZ2V0UHJpdmF0ZUtleSgpOiBQcm9taXNlPEFycmF5QnVmZmVyPiB7XG4gICAgICAgIGlmICh0aGlzLnByaXZhdGVLZXkgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJpdmF0ZUtleTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGVuY1ByaXZhdGVLZXkgPSBhd2FpdCB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldDxzdHJpbmc+KEtleXMuZW5jUHJpdmF0ZUtleSk7XG4gICAgICAgIGlmIChlbmNQcml2YXRlS2V5ID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5wcml2YXRlS2V5ID0gYXdhaXQgdGhpcy5kZWNyeXB0VG9CeXRlcyhuZXcgRW5jU3RyaW5nKGVuY1ByaXZhdGVLZXkpLCBudWxsKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJpdmF0ZUtleTtcbiAgICB9XG5cbiAgICBhc3luYyBnZXRGaW5nZXJwcmludCh1c2VySWQ6IHN0cmluZywgcHVibGljS2V5PzogQXJyYXlCdWZmZXIpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgICAgIGlmIChwdWJsaWNLZXkgPT0gbnVsbCkge1xuICAgICAgICAgICAgcHVibGljS2V5ID0gYXdhaXQgdGhpcy5nZXRQdWJsaWNLZXkoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHVibGljS2V5ID09PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHB1YmxpYyBrZXkgYXZhaWxhYmxlLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGtleUZpbmdlcnByaW50ID0gYXdhaXQgdGhpcy5jcnlwdG9GdW5jdGlvblNlcnZpY2UuaGFzaChwdWJsaWNLZXksICdzaGEyNTYnKTtcbiAgICAgICAgY29uc3QgdXNlckZpbmdlcnByaW50ID0gYXdhaXQgdGhpcy5jcnlwdG9GdW5jdGlvblNlcnZpY2UuaGtkZkV4cGFuZChrZXlGaW5nZXJwcmludCwgdXNlcklkLCAzMiwgJ3NoYTI1NicpO1xuICAgICAgICByZXR1cm4gdGhpcy5oYXNoUGhyYXNlKHVzZXJGaW5nZXJwcmludCk7XG4gICAgfVxuXG4gICAgQHNlcXVlbnRpYWxpemUoKCkgPT4gJ2dldE9yZ0tleXMnKVxuICAgIGFzeW5jIGdldE9yZ0tleXMoKTogUHJvbWlzZTxNYXA8c3RyaW5nLCBTeW1tZXRyaWNDcnlwdG9LZXk+PiB7XG4gICAgICAgIGlmICh0aGlzLm9yZ0tleXMgIT0gbnVsbCAmJiB0aGlzLm9yZ0tleXMuc2l6ZSA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm9yZ0tleXM7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBlbmNPcmdLZXlzID0gYXdhaXQgdGhpcy5zdG9yYWdlU2VydmljZS5nZXQ8YW55PihLZXlzLmVuY09yZ0tleXMpO1xuICAgICAgICBpZiAoZW5jT3JnS2V5cyA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG9yZ0tleXM6IE1hcDxzdHJpbmcsIFN5bW1ldHJpY0NyeXB0b0tleT4gPSBuZXcgTWFwPHN0cmluZywgU3ltbWV0cmljQ3J5cHRvS2V5PigpO1xuICAgICAgICBsZXQgc2V0S2V5ID0gZmFsc2U7XG5cbiAgICAgICAgZm9yIChjb25zdCBvcmdJZCBpbiBlbmNPcmdLZXlzKSB7XG4gICAgICAgICAgICBpZiAoIWVuY09yZ0tleXMuaGFzT3duUHJvcGVydHkob3JnSWQpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGRlY1ZhbHVlID0gYXdhaXQgdGhpcy5yc2FEZWNyeXB0KGVuY09yZ0tleXNbb3JnSWRdKTtcbiAgICAgICAgICAgIG9yZ0tleXMuc2V0KG9yZ0lkLCBuZXcgU3ltbWV0cmljQ3J5cHRvS2V5KGRlY1ZhbHVlKSk7XG4gICAgICAgICAgICBzZXRLZXkgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNldEtleSkge1xuICAgICAgICAgICAgdGhpcy5vcmdLZXlzID0gb3JnS2V5cztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLm9yZ0tleXM7XG4gICAgfVxuXG4gICAgYXN5bmMgZ2V0T3JnS2V5KG9yZ0lkOiBzdHJpbmcpOiBQcm9taXNlPFN5bW1ldHJpY0NyeXB0b0tleT4ge1xuICAgICAgICBpZiAob3JnSWQgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBvcmdLZXlzID0gYXdhaXQgdGhpcy5nZXRPcmdLZXlzKCk7XG4gICAgICAgIGlmIChvcmdLZXlzID09IG51bGwgfHwgIW9yZ0tleXMuaGFzKG9yZ0lkKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gb3JnS2V5cy5nZXQob3JnSWQpO1xuICAgIH1cblxuICAgIEBzZXF1ZW50aWFsaXplKCgpID0+ICdnZXRQcm92aWRlcktleXMnKVxuICAgIGFzeW5jIGdldFByb3ZpZGVyS2V5cygpOiBQcm9taXNlPE1hcDxzdHJpbmcsIFN5bW1ldHJpY0NyeXB0b0tleT4+IHtcbiAgICAgICAgaWYgKHRoaXMucHJvdmlkZXJLZXlzICE9IG51bGwgJiYgdGhpcy5wcm92aWRlcktleXMuc2l6ZSA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnByb3ZpZGVyS2V5cztcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGVuY1Byb3ZpZGVyS2V5cyA9IGF3YWl0IHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0PGFueT4oS2V5cy5lbmNQcm92aWRlcktleXMpO1xuICAgICAgICBpZiAoZW5jUHJvdmlkZXJLZXlzID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcHJvdmlkZXJLZXlzOiBNYXA8c3RyaW5nLCBTeW1tZXRyaWNDcnlwdG9LZXk+ID0gbmV3IE1hcDxzdHJpbmcsIFN5bW1ldHJpY0NyeXB0b0tleT4oKTtcbiAgICAgICAgbGV0IHNldEtleSA9IGZhbHNlO1xuXG4gICAgICAgIGZvciAoY29uc3Qgb3JnSWQgaW4gZW5jUHJvdmlkZXJLZXlzKSB7XG4gICAgICAgICAgICBpZiAoIWVuY1Byb3ZpZGVyS2V5cy5oYXNPd25Qcm9wZXJ0eShvcmdJZCkpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgZGVjVmFsdWUgPSBhd2FpdCB0aGlzLnJzYURlY3J5cHQoZW5jUHJvdmlkZXJLZXlzW29yZ0lkXSk7XG4gICAgICAgICAgICBwcm92aWRlcktleXMuc2V0KG9yZ0lkLCBuZXcgU3ltbWV0cmljQ3J5cHRvS2V5KGRlY1ZhbHVlKSk7XG4gICAgICAgICAgICBzZXRLZXkgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNldEtleSkge1xuICAgICAgICAgICAgdGhpcy5wcm92aWRlcktleXMgPSBwcm92aWRlcktleXM7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5wcm92aWRlcktleXM7XG4gICAgfVxuXG4gICAgYXN5bmMgZ2V0UHJvdmlkZXJLZXkocHJvdmlkZXJJZDogc3RyaW5nKTogUHJvbWlzZTxTeW1tZXRyaWNDcnlwdG9LZXk+IHtcbiAgICAgICAgaWYgKHByb3ZpZGVySWQgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwcm92aWRlcktleXMgPSBhd2FpdCB0aGlzLmdldFByb3ZpZGVyS2V5cygpO1xuICAgICAgICBpZiAocHJvdmlkZXJLZXlzID09IG51bGwgfHwgIXByb3ZpZGVyS2V5cy5oYXMocHJvdmlkZXJJZCkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHByb3ZpZGVyS2V5cy5nZXQocHJvdmlkZXJJZCk7XG4gICAgfVxuXG4gICAgYXN5bmMgaGFzS2V5KCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICByZXR1cm4gdGhpcy5oYXNLZXlJbk1lbW9yeSgpIHx8IGF3YWl0IHRoaXMuaGFzS2V5U3RvcmVkKCdhdXRvJykgfHwgYXdhaXQgdGhpcy5oYXNLZXlTdG9yZWQoJ2Jpb21ldHJpYycpO1xuICAgIH1cblxuICAgIGhhc0tleUluTWVtb3J5KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5rZXkgIT0gbnVsbDtcbiAgICB9XG5cbiAgICBoYXNLZXlTdG9yZWQoa2V5U3VmZml4OiBLZXlTdWZmaXhPcHRpb25zKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlY3VyZVN0b3JhZ2VTZXJ2aWNlLmhhcyhLZXlzLmtleSwgeyBrZXlTdWZmaXg6IGtleVN1ZmZpeCB9KTtcbiAgICB9XG5cbiAgICBhc3luYyBoYXNFbmNLZXkoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGNvbnN0IGVuY0tleSA9IGF3YWl0IHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0PHN0cmluZz4oS2V5cy5lbmNLZXkpO1xuICAgICAgICByZXR1cm4gZW5jS2V5ICE9IG51bGw7XG4gICAgfVxuXG4gICAgYXN5bmMgY2xlYXJLZXkoY2xlYXJTZWNyZXRTdG9yYWdlOiBib29sZWFuID0gdHJ1ZSk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIHRoaXMua2V5ID0gdGhpcy5sZWdhY3lFdG1LZXkgPSBudWxsO1xuICAgICAgICBpZiAoY2xlYXJTZWNyZXRTdG9yYWdlKSB7XG4gICAgICAgICAgICB0aGlzLmNsZWFyU3RvcmVkS2V5KCdhdXRvJyk7XG4gICAgICAgICAgICB0aGlzLmNsZWFyU3RvcmVkS2V5KCdiaW9tZXRyaWMnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIGNsZWFyU3RvcmVkS2V5KGtleVN1ZmZpeDogS2V5U3VmZml4T3B0aW9ucykge1xuICAgICAgICBhd2FpdCB0aGlzLnNlY3VyZVN0b3JhZ2VTZXJ2aWNlLnJlbW92ZShLZXlzLmtleSwgeyBrZXlTdWZmaXg6IGtleVN1ZmZpeCB9KTtcbiAgICB9XG5cbiAgICBjbGVhcktleUhhc2goKTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgdGhpcy5rZXlIYXNoID0gbnVsbDtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmFnZVNlcnZpY2UucmVtb3ZlKEtleXMua2V5SGFzaCk7XG4gICAgfVxuXG4gICAgY2xlYXJFbmNLZXkobWVtb3J5T25seT86IGJvb2xlYW4pOiBQcm9taXNlPGFueT4ge1xuICAgICAgICB0aGlzLmVuY0tleSA9IG51bGw7XG4gICAgICAgIGlmIChtZW1vcnlPbmx5KSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmFnZVNlcnZpY2UucmVtb3ZlKEtleXMuZW5jS2V5KTtcbiAgICB9XG5cbiAgICBjbGVhcktleVBhaXIobWVtb3J5T25seT86IGJvb2xlYW4pOiBQcm9taXNlPGFueT4ge1xuICAgICAgICB0aGlzLnByaXZhdGVLZXkgPSBudWxsO1xuICAgICAgICB0aGlzLnB1YmxpY0tleSA9IG51bGw7XG4gICAgICAgIGlmIChtZW1vcnlPbmx5KSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmFnZVNlcnZpY2UucmVtb3ZlKEtleXMuZW5jUHJpdmF0ZUtleSk7XG4gICAgfVxuXG4gICAgY2xlYXJPcmdLZXlzKG1lbW9yeU9ubHk/OiBib29sZWFuKTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgdGhpcy5vcmdLZXlzID0gbnVsbDtcbiAgICAgICAgaWYgKG1lbW9yeU9ubHkpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5zdG9yYWdlU2VydmljZS5yZW1vdmUoS2V5cy5lbmNPcmdLZXlzKTtcbiAgICB9XG5cbiAgICBjbGVhclByb3ZpZGVyS2V5cyhtZW1vcnlPbmx5PzogYm9vbGVhbik6IFByb21pc2U8YW55PiB7XG4gICAgICAgIHRoaXMucHJvdmlkZXJLZXlzID0gbnVsbDtcbiAgICAgICAgaWYgKG1lbW9yeU9ubHkpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5zdG9yYWdlU2VydmljZS5yZW1vdmUoS2V5cy5lbmNPcmdLZXlzKTtcbiAgICB9XG5cbiAgICBjbGVhclBpblByb3RlY3RlZEtleSgpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zdG9yYWdlU2VydmljZS5yZW1vdmUoQ29uc3RhbnRzU2VydmljZS5waW5Qcm90ZWN0ZWRLZXkpO1xuICAgIH1cblxuICAgIGFzeW5jIGNsZWFyS2V5cygpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICBhd2FpdCB0aGlzLmNsZWFyS2V5KCk7XG4gICAgICAgIGF3YWl0IHRoaXMuY2xlYXJLZXlIYXNoKCk7XG4gICAgICAgIGF3YWl0IHRoaXMuY2xlYXJPcmdLZXlzKCk7XG4gICAgICAgIGF3YWl0IHRoaXMuY2xlYXJQcm92aWRlcktleXMoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5jbGVhckVuY0tleSgpO1xuICAgICAgICBhd2FpdCB0aGlzLmNsZWFyS2V5UGFpcigpO1xuICAgICAgICBhd2FpdCB0aGlzLmNsZWFyUGluUHJvdGVjdGVkS2V5KCk7XG4gICAgfVxuXG4gICAgYXN5bmMgdG9nZ2xlS2V5KCk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIGNvbnN0IGtleSA9IGF3YWl0IHRoaXMuZ2V0S2V5KCk7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5zZXRLZXkoa2V5KTtcbiAgICB9XG5cbiAgICBhc3luYyBtYWtlS2V5KHBhc3N3b3JkOiBzdHJpbmcsIHNhbHQ6IHN0cmluZywga2RmOiBLZGZUeXBlLCBrZGZJdGVyYXRpb25zOiBudW1iZXIpOlxuICAgICAgICBQcm9taXNlPFN5bW1ldHJpY0NyeXB0b0tleT4ge1xuICAgICAgICBsZXQga2V5OiBBcnJheUJ1ZmZlciA9IG51bGw7XG4gICAgICAgIGlmIChrZGYgPT0gbnVsbCB8fCBrZGYgPT09IEtkZlR5cGUuUEJLREYyX1NIQTI1Nikge1xuICAgICAgICAgICAgaWYgKGtkZkl0ZXJhdGlvbnMgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGtkZkl0ZXJhdGlvbnMgPSA1MDAwO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChrZGZJdGVyYXRpb25zIDwgNTAwMCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUEJLREYyIGl0ZXJhdGlvbiBtaW5pbXVtIGlzIDUwMDAuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBrZXkgPSBhd2FpdCB0aGlzLmNyeXB0b0Z1bmN0aW9uU2VydmljZS5wYmtkZjIocGFzc3dvcmQsIHNhbHQsICdzaGEyNTYnLCBrZGZJdGVyYXRpb25zKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biBLZGYuJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBTeW1tZXRyaWNDcnlwdG9LZXkoa2V5KTtcbiAgICB9XG5cbiAgICBhc3luYyBtYWtlS2V5RnJvbVBpbihwaW46IHN0cmluZywgc2FsdDogc3RyaW5nLCBrZGY6IEtkZlR5cGUsIGtkZkl0ZXJhdGlvbnM6IG51bWJlcixcbiAgICAgICAgcHJvdGVjdGVkS2V5Q3M6IEVuY1N0cmluZyA9IG51bGwpOlxuICAgICAgICBQcm9taXNlPFN5bW1ldHJpY0NyeXB0b0tleT4ge1xuICAgICAgICBpZiAocHJvdGVjdGVkS2V5Q3MgPT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgcGluUHJvdGVjdGVkS2V5ID0gYXdhaXQgdGhpcy5zdG9yYWdlU2VydmljZS5nZXQ8c3RyaW5nPihDb25zdGFudHNTZXJ2aWNlLnBpblByb3RlY3RlZEtleSk7XG4gICAgICAgICAgICBpZiAocGluUHJvdGVjdGVkS2V5ID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIFBJTiBwcm90ZWN0ZWQga2V5IGZvdW5kLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcHJvdGVjdGVkS2V5Q3MgPSBuZXcgRW5jU3RyaW5nKHBpblByb3RlY3RlZEtleSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGluS2V5ID0gYXdhaXQgdGhpcy5tYWtlUGluS2V5KHBpbiwgc2FsdCwga2RmLCBrZGZJdGVyYXRpb25zKTtcbiAgICAgICAgY29uc3QgZGVjS2V5ID0gYXdhaXQgdGhpcy5kZWNyeXB0VG9CeXRlcyhwcm90ZWN0ZWRLZXlDcywgcGluS2V5KTtcbiAgICAgICAgcmV0dXJuIG5ldyBTeW1tZXRyaWNDcnlwdG9LZXkoZGVjS2V5KTtcbiAgICB9XG5cbiAgICBhc3luYyBtYWtlU2hhcmVLZXkoKTogUHJvbWlzZTxbRW5jU3RyaW5nLCBTeW1tZXRyaWNDcnlwdG9LZXldPiB7XG4gICAgICAgIGNvbnN0IHNoYXJlS2V5ID0gYXdhaXQgdGhpcy5jcnlwdG9GdW5jdGlvblNlcnZpY2UucmFuZG9tQnl0ZXMoNjQpO1xuICAgICAgICBjb25zdCBwdWJsaWNLZXkgPSBhd2FpdCB0aGlzLmdldFB1YmxpY0tleSgpO1xuICAgICAgICBjb25zdCBlbmNTaGFyZUtleSA9IGF3YWl0IHRoaXMucnNhRW5jcnlwdChzaGFyZUtleSwgcHVibGljS2V5KTtcbiAgICAgICAgcmV0dXJuIFtlbmNTaGFyZUtleSwgbmV3IFN5bW1ldHJpY0NyeXB0b0tleShzaGFyZUtleSldO1xuICAgIH1cblxuICAgIGFzeW5jIG1ha2VLZXlQYWlyKGtleT86IFN5bW1ldHJpY0NyeXB0b0tleSk6IFByb21pc2U8W3N0cmluZywgRW5jU3RyaW5nXT4ge1xuICAgICAgICBjb25zdCBrZXlQYWlyID0gYXdhaXQgdGhpcy5jcnlwdG9GdW5jdGlvblNlcnZpY2UucnNhR2VuZXJhdGVLZXlQYWlyKDIwNDgpO1xuICAgICAgICBjb25zdCBwdWJsaWNCNjQgPSBVdGlscy5mcm9tQnVmZmVyVG9CNjQoa2V5UGFpclswXSk7XG4gICAgICAgIGNvbnN0IHByaXZhdGVFbmMgPSBhd2FpdCB0aGlzLmVuY3J5cHQoa2V5UGFpclsxXSwga2V5KTtcbiAgICAgICAgcmV0dXJuIFtwdWJsaWNCNjQsIHByaXZhdGVFbmNdO1xuICAgIH1cblxuICAgIGFzeW5jIG1ha2VQaW5LZXkocGluOiBzdHJpbmcsIHNhbHQ6IHN0cmluZywga2RmOiBLZGZUeXBlLCBrZGZJdGVyYXRpb25zOiBudW1iZXIpOiBQcm9taXNlPFN5bW1ldHJpY0NyeXB0b0tleT4ge1xuICAgICAgICBjb25zdCBwaW5LZXkgPSBhd2FpdCB0aGlzLm1ha2VLZXkocGluLCBzYWx0LCBrZGYsIGtkZkl0ZXJhdGlvbnMpO1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5zdHJldGNoS2V5KHBpbktleSk7XG4gICAgfVxuXG4gICAgYXN5bmMgbWFrZVNlbmRLZXkoa2V5TWF0ZXJpYWw6IEFycmF5QnVmZmVyKTogUHJvbWlzZTxTeW1tZXRyaWNDcnlwdG9LZXk+IHtcbiAgICAgICAgY29uc3Qgc2VuZEtleSA9IGF3YWl0IHRoaXMuY3J5cHRvRnVuY3Rpb25TZXJ2aWNlLmhrZGYoa2V5TWF0ZXJpYWwsICdiaXR3YXJkZW4tc2VuZCcsICdzZW5kJywgNjQsICdzaGEyNTYnKTtcbiAgICAgICAgcmV0dXJuIG5ldyBTeW1tZXRyaWNDcnlwdG9LZXkoc2VuZEtleSk7XG4gICAgfVxuXG4gICAgYXN5bmMgaGFzaFBhc3N3b3JkKHBhc3N3b3JkOiBzdHJpbmcsIGtleTogU3ltbWV0cmljQ3J5cHRvS2V5LCBoYXNoUHVycG9zZT86IEhhc2hQdXJwb3NlKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgaWYgKGtleSA9PSBudWxsKSB7XG4gICAgICAgICAgICBrZXkgPSBhd2FpdCB0aGlzLmdldEtleSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXNzd29yZCA9PSBudWxsIHx8IGtleSA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgcGFyYW1ldGVycy4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGl0ZXJhdGlvbnMgPSBoYXNoUHVycG9zZSA9PT0gSGFzaFB1cnBvc2UuTG9jYWxBdXRob3JpemF0aW9uID8gMiA6IDE7XG4gICAgICAgIGNvbnN0IGhhc2ggPSBhd2FpdCB0aGlzLmNyeXB0b0Z1bmN0aW9uU2VydmljZS5wYmtkZjIoa2V5LmtleSwgcGFzc3dvcmQsICdzaGEyNTYnLCBpdGVyYXRpb25zKTtcbiAgICAgICAgcmV0dXJuIFV0aWxzLmZyb21CdWZmZXJUb0I2NChoYXNoKTtcbiAgICB9XG5cbiAgICBhc3luYyBtYWtlRW5jS2V5KGtleTogU3ltbWV0cmljQ3J5cHRvS2V5KTogUHJvbWlzZTxbU3ltbWV0cmljQ3J5cHRvS2V5LCBFbmNTdHJpbmddPiB7XG4gICAgICAgIGNvbnN0IHRoZUtleSA9IGF3YWl0IHRoaXMuZ2V0S2V5Rm9yRW5jcnlwdGlvbihrZXkpO1xuICAgICAgICBjb25zdCBlbmNLZXkgPSBhd2FpdCB0aGlzLmNyeXB0b0Z1bmN0aW9uU2VydmljZS5yYW5kb21CeXRlcyg2NCk7XG4gICAgICAgIHJldHVybiB0aGlzLmJ1aWxkRW5jS2V5KHRoZUtleSwgZW5jS2V5KTtcbiAgICB9XG5cbiAgICBhc3luYyByZW1ha2VFbmNLZXkoa2V5OiBTeW1tZXRyaWNDcnlwdG9LZXksIGVuY0tleT86IFN5bW1ldHJpY0NyeXB0b0tleSk6IFByb21pc2U8W1N5bW1ldHJpY0NyeXB0b0tleSwgRW5jU3RyaW5nXT4ge1xuICAgICAgICBpZiAoZW5jS2V5ID09IG51bGwpIHtcbiAgICAgICAgICAgIGVuY0tleSA9IGF3YWl0IHRoaXMuZ2V0RW5jS2V5KCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuYnVpbGRFbmNLZXkoa2V5LCBlbmNLZXkua2V5KTtcbiAgICB9XG5cbiAgICBhc3luYyBlbmNyeXB0KHBsYWluVmFsdWU6IHN0cmluZyB8IEFycmF5QnVmZmVyLCBrZXk/OiBTeW1tZXRyaWNDcnlwdG9LZXkpOiBQcm9taXNlPEVuY1N0cmluZz4ge1xuICAgICAgICBpZiAocGxhaW5WYWx1ZSA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBsYWluQnVmOiBBcnJheUJ1ZmZlcjtcbiAgICAgICAgaWYgKHR5cGVvZiAocGxhaW5WYWx1ZSkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBwbGFpbkJ1ZiA9IFV0aWxzLmZyb21VdGY4VG9BcnJheShwbGFpblZhbHVlKS5idWZmZXI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwbGFpbkJ1ZiA9IHBsYWluVmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBlbmNPYmogPSBhd2FpdCB0aGlzLmFlc0VuY3J5cHQocGxhaW5CdWYsIGtleSk7XG4gICAgICAgIGNvbnN0IGl2ID0gVXRpbHMuZnJvbUJ1ZmZlclRvQjY0KGVuY09iai5pdik7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBVdGlscy5mcm9tQnVmZmVyVG9CNjQoZW5jT2JqLmRhdGEpO1xuICAgICAgICBjb25zdCBtYWMgPSBlbmNPYmoubWFjICE9IG51bGwgPyBVdGlscy5mcm9tQnVmZmVyVG9CNjQoZW5jT2JqLm1hYykgOiBudWxsO1xuICAgICAgICByZXR1cm4gbmV3IEVuY1N0cmluZyhlbmNPYmoua2V5LmVuY1R5cGUsIGRhdGEsIGl2LCBtYWMpO1xuICAgIH1cblxuICAgIGFzeW5jIGVuY3J5cHRUb0J5dGVzKHBsYWluVmFsdWU6IEFycmF5QnVmZmVyLCBrZXk/OiBTeW1tZXRyaWNDcnlwdG9LZXkpOiBQcm9taXNlPEVuY0FycmF5QnVmZmVyPiB7XG4gICAgICAgIGNvbnN0IGVuY1ZhbHVlID0gYXdhaXQgdGhpcy5hZXNFbmNyeXB0KHBsYWluVmFsdWUsIGtleSk7XG4gICAgICAgIGxldCBtYWNMZW4gPSAwO1xuICAgICAgICBpZiAoZW5jVmFsdWUubWFjICE9IG51bGwpIHtcbiAgICAgICAgICAgIG1hY0xlbiA9IGVuY1ZhbHVlLm1hYy5ieXRlTGVuZ3RoO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZW5jQnl0ZXMgPSBuZXcgVWludDhBcnJheSgxICsgZW5jVmFsdWUuaXYuYnl0ZUxlbmd0aCArIG1hY0xlbiArIGVuY1ZhbHVlLmRhdGEuYnl0ZUxlbmd0aCk7XG4gICAgICAgIGVuY0J5dGVzLnNldChbZW5jVmFsdWUua2V5LmVuY1R5cGVdKTtcbiAgICAgICAgZW5jQnl0ZXMuc2V0KG5ldyBVaW50OEFycmF5KGVuY1ZhbHVlLml2KSwgMSk7XG4gICAgICAgIGlmIChlbmNWYWx1ZS5tYWMgIT0gbnVsbCkge1xuICAgICAgICAgICAgZW5jQnl0ZXMuc2V0KG5ldyBVaW50OEFycmF5KGVuY1ZhbHVlLm1hYyksIDEgKyBlbmNWYWx1ZS5pdi5ieXRlTGVuZ3RoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGVuY0J5dGVzLnNldChuZXcgVWludDhBcnJheShlbmNWYWx1ZS5kYXRhKSwgMSArIGVuY1ZhbHVlLml2LmJ5dGVMZW5ndGggKyBtYWNMZW4pO1xuICAgICAgICByZXR1cm4gbmV3IEVuY0FycmF5QnVmZmVyKGVuY0J5dGVzLmJ1ZmZlcik7XG4gICAgfVxuXG4gICAgYXN5bmMgcnNhRW5jcnlwdChkYXRhOiBBcnJheUJ1ZmZlciwgcHVibGljS2V5PzogQXJyYXlCdWZmZXIpOiBQcm9taXNlPEVuY1N0cmluZz4ge1xuICAgICAgICBpZiAocHVibGljS2V5ID09IG51bGwpIHtcbiAgICAgICAgICAgIHB1YmxpY0tleSA9IGF3YWl0IHRoaXMuZ2V0UHVibGljS2V5KCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHB1YmxpY0tleSA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1B1YmxpYyBrZXkgdW5hdmFpbGFibGUuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBlbmNCeXRlcyA9IGF3YWl0IHRoaXMuY3J5cHRvRnVuY3Rpb25TZXJ2aWNlLnJzYUVuY3J5cHQoZGF0YSwgcHVibGljS2V5LCAnc2hhMScpO1xuICAgICAgICByZXR1cm4gbmV3IEVuY1N0cmluZyhFbmNyeXB0aW9uVHlwZS5Sc2EyMDQ4X09hZXBTaGExX0I2NCwgVXRpbHMuZnJvbUJ1ZmZlclRvQjY0KGVuY0J5dGVzKSk7XG4gICAgfVxuXG4gICAgYXN5bmMgcnNhRGVjcnlwdChlbmNWYWx1ZTogc3RyaW5nLCBwcml2YXRlS2V5VmFsdWU/OiBBcnJheUJ1ZmZlcik6IFByb21pc2U8QXJyYXlCdWZmZXI+IHtcbiAgICAgICAgY29uc3QgaGVhZGVyUGllY2VzID0gZW5jVmFsdWUuc3BsaXQoJy4nKTtcbiAgICAgICAgbGV0IGVuY1R5cGU6IEVuY3J5cHRpb25UeXBlID0gbnVsbDtcbiAgICAgICAgbGV0IGVuY1BpZWNlczogc3RyaW5nW107XG5cbiAgICAgICAgaWYgKGhlYWRlclBpZWNlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIGVuY1R5cGUgPSBFbmNyeXB0aW9uVHlwZS5Sc2EyMDQ4X09hZXBTaGEyNTZfQjY0O1xuICAgICAgICAgICAgZW5jUGllY2VzID0gW2hlYWRlclBpZWNlc1swXV07XG4gICAgICAgIH0gZWxzZSBpZiAoaGVhZGVyUGllY2VzLmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBlbmNUeXBlID0gcGFyc2VJbnQoaGVhZGVyUGllY2VzWzBdLCBudWxsKTtcbiAgICAgICAgICAgICAgICBlbmNQaWVjZXMgPSBoZWFkZXJQaWVjZXNbMV0uc3BsaXQoJ3wnKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ1NlcnZpY2UuZXJyb3IoZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBzd2l0Y2ggKGVuY1R5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgRW5jcnlwdGlvblR5cGUuUnNhMjA0OF9PYWVwU2hhMjU2X0I2NDpcbiAgICAgICAgICAgIGNhc2UgRW5jcnlwdGlvblR5cGUuUnNhMjA0OF9PYWVwU2hhMV9CNjQ6XG4gICAgICAgICAgICAvLyBIbWFjU2hhMjU2IHR5cGVzIGFyZSBkZXByZWNhdGVkXG4gICAgICAgICAgICBjYXNlIEVuY3J5cHRpb25UeXBlLlJzYTIwNDhfT2FlcFNoYTI1Nl9IbWFjU2hhMjU2X0I2NDpcbiAgICAgICAgICAgIGNhc2UgRW5jcnlwdGlvblR5cGUuUnNhMjA0OF9PYWVwU2hhMV9IbWFjU2hhMjU2X0I2NDpcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdlbmNUeXBlIHVuYXZhaWxhYmxlLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVuY1BpZWNlcyA9PSBudWxsIHx8IGVuY1BpZWNlcy5sZW5ndGggPD0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdlbmNQaWVjZXMgdW5hdmFpbGFibGUuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkYXRhID0gVXRpbHMuZnJvbUI2NFRvQXJyYXkoZW5jUGllY2VzWzBdKS5idWZmZXI7XG4gICAgICAgIGNvbnN0IHByaXZhdGVLZXkgPSBwcml2YXRlS2V5VmFsdWUgPz8gYXdhaXQgdGhpcy5nZXRQcml2YXRlS2V5KCk7XG4gICAgICAgIGlmIChwcml2YXRlS2V5ID09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gcHJpdmF0ZSBrZXkuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgYWxnOiAnc2hhMScgfCAnc2hhMjU2JyA9ICdzaGExJztcbiAgICAgICAgc3dpdGNoIChlbmNUeXBlKSB7XG4gICAgICAgICAgICBjYXNlIEVuY3J5cHRpb25UeXBlLlJzYTIwNDhfT2FlcFNoYTI1Nl9CNjQ6XG4gICAgICAgICAgICBjYXNlIEVuY3J5cHRpb25UeXBlLlJzYTIwNDhfT2FlcFNoYTI1Nl9IbWFjU2hhMjU2X0I2NDpcbiAgICAgICAgICAgICAgICBhbGcgPSAnc2hhMjU2JztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgRW5jcnlwdGlvblR5cGUuUnNhMjA0OF9PYWVwU2hhMV9CNjQ6XG4gICAgICAgICAgICBjYXNlIEVuY3J5cHRpb25UeXBlLlJzYTIwNDhfT2FlcFNoYTFfSG1hY1NoYTI1Nl9CNjQ6XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignZW5jVHlwZSB1bmF2YWlsYWJsZS4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmNyeXB0b0Z1bmN0aW9uU2VydmljZS5yc2FEZWNyeXB0KGRhdGEsIHByaXZhdGVLZXksIGFsZyk7XG4gICAgfVxuXG4gICAgYXN5bmMgZGVjcnlwdFRvQnl0ZXMoZW5jU3RyaW5nOiBFbmNTdHJpbmcsIGtleT86IFN5bW1ldHJpY0NyeXB0b0tleSk6IFByb21pc2U8QXJyYXlCdWZmZXI+IHtcbiAgICAgICAgY29uc3QgaXYgPSBVdGlscy5mcm9tQjY0VG9BcnJheShlbmNTdHJpbmcuaXYpLmJ1ZmZlcjtcbiAgICAgICAgY29uc3QgZGF0YSA9IFV0aWxzLmZyb21CNjRUb0FycmF5KGVuY1N0cmluZy5kYXRhKS5idWZmZXI7XG4gICAgICAgIGNvbnN0IG1hYyA9IGVuY1N0cmluZy5tYWMgPyBVdGlscy5mcm9tQjY0VG9BcnJheShlbmNTdHJpbmcubWFjKS5idWZmZXIgOiBudWxsO1xuICAgICAgICBjb25zdCBkZWNpcGhlciA9IGF3YWl0IHRoaXMuYWVzRGVjcnlwdFRvQnl0ZXMoZW5jU3RyaW5nLmVuY3J5cHRpb25UeXBlLCBkYXRhLCBpdiwgbWFjLCBrZXkpO1xuICAgICAgICBpZiAoZGVjaXBoZXIgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGVjaXBoZXI7XG4gICAgfVxuXG4gICAgYXN5bmMgZGVjcnlwdFRvVXRmOChlbmNTdHJpbmc6IEVuY1N0cmluZywga2V5PzogU3ltbWV0cmljQ3J5cHRvS2V5KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuYWVzRGVjcnlwdFRvVXRmOChlbmNTdHJpbmcuZW5jcnlwdGlvblR5cGUsIGVuY1N0cmluZy5kYXRhLFxuICAgICAgICAgICAgZW5jU3RyaW5nLml2LCBlbmNTdHJpbmcubWFjLCBrZXkpO1xuICAgIH1cblxuICAgIGFzeW5jIGRlY3J5cHRGcm9tQnl0ZXMoZW5jQnVmOiBBcnJheUJ1ZmZlciwga2V5OiBTeW1tZXRyaWNDcnlwdG9LZXkpOiBQcm9taXNlPEFycmF5QnVmZmVyPiB7XG4gICAgICAgIGlmIChlbmNCdWYgPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdubyBlbmNCdWYuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBlbmNCeXRlcyA9IG5ldyBVaW50OEFycmF5KGVuY0J1Zik7XG4gICAgICAgIGNvbnN0IGVuY1R5cGUgPSBlbmNCeXRlc1swXTtcbiAgICAgICAgbGV0IGN0Qnl0ZXM6IFVpbnQ4QXJyYXkgPSBudWxsO1xuICAgICAgICBsZXQgaXZCeXRlczogVWludDhBcnJheSA9IG51bGw7XG4gICAgICAgIGxldCBtYWNCeXRlczogVWludDhBcnJheSA9IG51bGw7XG5cbiAgICAgICAgc3dpdGNoIChlbmNUeXBlKSB7XG4gICAgICAgICAgICBjYXNlIEVuY3J5cHRpb25UeXBlLkFlc0NiYzEyOF9IbWFjU2hhMjU2X0I2NDpcbiAgICAgICAgICAgIGNhc2UgRW5jcnlwdGlvblR5cGUuQWVzQ2JjMjU2X0htYWNTaGEyNTZfQjY0OlxuICAgICAgICAgICAgICAgIGlmIChlbmNCeXRlcy5sZW5ndGggPD0gNDkpIHsgLy8gMSArIDE2ICsgMzIgKyBjdExlbmd0aFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpdkJ5dGVzID0gZW5jQnl0ZXMuc2xpY2UoMSwgMTcpO1xuICAgICAgICAgICAgICAgIG1hY0J5dGVzID0gZW5jQnl0ZXMuc2xpY2UoMTcsIDQ5KTtcbiAgICAgICAgICAgICAgICBjdEJ5dGVzID0gZW5jQnl0ZXMuc2xpY2UoNDkpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBFbmNyeXB0aW9uVHlwZS5BZXNDYmMyNTZfQjY0OlxuICAgICAgICAgICAgICAgIGlmIChlbmNCeXRlcy5sZW5ndGggPD0gMTcpIHsgLy8gMSArIDE2ICsgY3RMZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaXZCeXRlcyA9IGVuY0J5dGVzLnNsaWNlKDEsIDE3KTtcbiAgICAgICAgICAgICAgICBjdEJ5dGVzID0gZW5jQnl0ZXMuc2xpY2UoMTcpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmFlc0RlY3J5cHRUb0J5dGVzKGVuY1R5cGUsIGN0Qnl0ZXMuYnVmZmVyLCBpdkJ5dGVzLmJ1ZmZlcixcbiAgICAgICAgICAgIG1hY0J5dGVzICE9IG51bGwgPyBtYWNCeXRlcy5idWZmZXIgOiBudWxsLCBrZXkpO1xuICAgIH1cblxuICAgIC8vIEVGRm9yZy9PcGVuV2lyZWxlc3NcbiAgICAvLyByZWYgaHR0cHM6Ly9naXRodWIuY29tL0VGRm9yZy9PcGVuV2lyZWxlc3MvYmxvYi9tYXN0ZXIvYXBwL2pzL2RpY2V3YXJlLmpzXG4gICAgYXN5bmMgcmFuZG9tTnVtYmVyKG1pbjogbnVtYmVyLCBtYXg6IG51bWJlcik6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgICAgIGxldCBydmFsID0gMDtcbiAgICAgICAgY29uc3QgcmFuZ2UgPSBtYXggLSBtaW4gKyAxO1xuICAgICAgICBjb25zdCBiaXRzTmVlZGVkID0gTWF0aC5jZWlsKE1hdGgubG9nMihyYW5nZSkpO1xuICAgICAgICBpZiAoYml0c05lZWRlZCA+IDUzKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dlIGNhbm5vdCBnZW5lcmF0ZSBudW1iZXJzIGxhcmdlciB0aGFuIDUzIGJpdHMuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBieXRlc05lZWRlZCA9IE1hdGguY2VpbChiaXRzTmVlZGVkIC8gOCk7XG4gICAgICAgIGNvbnN0IG1hc2sgPSBNYXRoLnBvdygyLCBiaXRzTmVlZGVkKSAtIDE7XG4gICAgICAgIC8vIDc3NzYgLT4gKDJeMTMgPSA4MTkyKSAtMSA9PSA4MTkxIG9yIDB4MDAwMDExMTEgMTExMTExMTFcblxuICAgICAgICAvLyBGaWxsIGEgYnl0ZSBhcnJheSB3aXRoIE4gcmFuZG9tIG51bWJlcnNcbiAgICAgICAgY29uc3QgYnl0ZUFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoYXdhaXQgdGhpcy5jcnlwdG9GdW5jdGlvblNlcnZpY2UucmFuZG9tQnl0ZXMoYnl0ZXNOZWVkZWQpKTtcblxuICAgICAgICBsZXQgcCA9IChieXRlc05lZWRlZCAtIDEpICogODtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBieXRlc05lZWRlZDsgaSsrKSB7XG4gICAgICAgICAgICBydmFsICs9IGJ5dGVBcnJheVtpXSAqIE1hdGgucG93KDIsIHApO1xuICAgICAgICAgICAgcCAtPSA4O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVXNlICYgdG8gYXBwbHkgdGhlIG1hc2sgYW5kIHJlZHVjZSB0aGUgbnVtYmVyIG9mIHJlY3Vyc2l2ZSBsb29rdXBzXG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZVxuICAgICAgICBydmFsID0gcnZhbCAmIG1hc2s7XG5cbiAgICAgICAgaWYgKHJ2YWwgPj0gcmFuZ2UpIHtcbiAgICAgICAgICAgIC8vIEludGVnZXIgb3V0IG9mIGFjY2VwdGFibGUgcmFuZ2VcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJhbmRvbU51bWJlcihtaW4sIG1heCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZXR1cm4gYW4gaW50ZWdlciB0aGF0IGZhbGxzIHdpdGhpbiB0aGUgcmFuZ2VcbiAgICAgICAgcmV0dXJuIG1pbiArIHJ2YWw7XG4gICAgfVxuXG4gICAgYXN5bmMgdmFsaWRhdGVLZXkoa2V5OiBTeW1tZXRyaWNDcnlwdG9LZXkpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGVuY1ByaXZhdGVLZXkgPSBhd2FpdCB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldDxzdHJpbmc+KEtleXMuZW5jUHJpdmF0ZUtleSk7XG4gICAgICAgICAgICBjb25zdCBlbmNLZXkgPSBhd2FpdCB0aGlzLmdldEVuY0tleShrZXkpO1xuICAgICAgICAgICAgaWYgKGVuY1ByaXZhdGVLZXkgPT0gbnVsbCB8fCBlbmNLZXkgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgcHJpdmF0ZUtleSA9IGF3YWl0IHRoaXMuZGVjcnlwdFRvQnl0ZXMobmV3IEVuY1N0cmluZyhlbmNQcml2YXRlS2V5KSwgZW5jS2V5KTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY3J5cHRvRnVuY3Rpb25TZXJ2aWNlLnJzYUV4dHJhY3RQdWJsaWNLZXkocHJpdmF0ZUtleSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIEhlbHBlcnNcblxuICAgIHByb3RlY3RlZCBhc3luYyBzdG9yZUtleShrZXk6IFN5bW1ldHJpY0NyeXB0b0tleSkge1xuICAgICAgICBpZiAoYXdhaXQgdGhpcy5zaG91bGRTdG9yZUtleSgnYXV0bycpIHx8IGF3YWl0IHRoaXMuc2hvdWxkU3RvcmVLZXkoJ2Jpb21ldHJpYycpKSB7XG4gICAgICAgICAgICB0aGlzLnNlY3VyZVN0b3JhZ2VTZXJ2aWNlLnNhdmUoS2V5cy5rZXksIGtleS5rZXlCNjQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZWN1cmVTdG9yYWdlU2VydmljZS5yZW1vdmUoS2V5cy5rZXkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGFzeW5jIHNob3VsZFN0b3JlS2V5KGtleVN1ZmZpeDogS2V5U3VmZml4T3B0aW9ucykge1xuICAgICAgICBsZXQgc2hvdWxkU3RvcmVLZXkgPSBmYWxzZTtcbiAgICAgICAgaWYgKGtleVN1ZmZpeCA9PT0gJ2F1dG8nKSB7XG4gICAgICAgICAgICBjb25zdCB2YXVsdFRpbWVvdXQgPSBhd2FpdCB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldDxudW1iZXI+KENvbnN0YW50c1NlcnZpY2UudmF1bHRUaW1lb3V0S2V5KTtcbiAgICAgICAgICAgIHNob3VsZFN0b3JlS2V5ID0gdmF1bHRUaW1lb3V0ID09IG51bGw7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5U3VmZml4ID09PSAnYmlvbWV0cmljJykge1xuICAgICAgICAgICAgY29uc3QgYmlvbWV0cmljVW5sb2NrID0gYXdhaXQgdGhpcy5zdG9yYWdlU2VydmljZS5nZXQ8Ym9vbGVhbj4oQ29uc3RhbnRzU2VydmljZS5iaW9tZXRyaWNVbmxvY2tLZXkpO1xuICAgICAgICAgICAgc2hvdWxkU3RvcmVLZXkgPSBiaW9tZXRyaWNVbmxvY2sgJiYgdGhpcy5wbGF0Zm9ybVV0aWxTZXJ2aWNlLnN1cHBvcnRzU2VjdXJlU3RvcmFnZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzaG91bGRTdG9yZUtleTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcmV0cmlldmVLZXlGcm9tU3RvcmFnZShrZXlTdWZmaXg6IEtleVN1ZmZpeE9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VjdXJlU3RvcmFnZVNlcnZpY2UuZ2V0PHN0cmluZz4oS2V5cy5rZXksIHsga2V5U3VmZml4OiBrZXlTdWZmaXggfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBhZXNFbmNyeXB0KGRhdGE6IEFycmF5QnVmZmVyLCBrZXk6IFN5bW1ldHJpY0NyeXB0b0tleSk6IFByb21pc2U8RW5jcnlwdGVkT2JqZWN0PiB7XG4gICAgICAgIGNvbnN0IG9iaiA9IG5ldyBFbmNyeXB0ZWRPYmplY3QoKTtcbiAgICAgICAgb2JqLmtleSA9IGF3YWl0IHRoaXMuZ2V0S2V5Rm9yRW5jcnlwdGlvbihrZXkpO1xuICAgICAgICBvYmouaXYgPSBhd2FpdCB0aGlzLmNyeXB0b0Z1bmN0aW9uU2VydmljZS5yYW5kb21CeXRlcygxNik7XG4gICAgICAgIG9iai5kYXRhID0gYXdhaXQgdGhpcy5jcnlwdG9GdW5jdGlvblNlcnZpY2UuYWVzRW5jcnlwdChkYXRhLCBvYmouaXYsIG9iai5rZXkuZW5jS2V5KTtcblxuICAgICAgICBpZiAob2JqLmtleS5tYWNLZXkgIT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgbWFjRGF0YSA9IG5ldyBVaW50OEFycmF5KG9iai5pdi5ieXRlTGVuZ3RoICsgb2JqLmRhdGEuYnl0ZUxlbmd0aCk7XG4gICAgICAgICAgICBtYWNEYXRhLnNldChuZXcgVWludDhBcnJheShvYmouaXYpLCAwKTtcbiAgICAgICAgICAgIG1hY0RhdGEuc2V0KG5ldyBVaW50OEFycmF5KG9iai5kYXRhKSwgb2JqLml2LmJ5dGVMZW5ndGgpO1xuICAgICAgICAgICAgb2JqLm1hYyA9IGF3YWl0IHRoaXMuY3J5cHRvRnVuY3Rpb25TZXJ2aWNlLmhtYWMobWFjRGF0YS5idWZmZXIsIG9iai5rZXkubWFjS2V5LCAnc2hhMjU2Jyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gb2JqO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgYWVzRGVjcnlwdFRvVXRmOChlbmNUeXBlOiBFbmNyeXB0aW9uVHlwZSwgZGF0YTogc3RyaW5nLCBpdjogc3RyaW5nLCBtYWM6IHN0cmluZyxcbiAgICAgICAga2V5OiBTeW1tZXRyaWNDcnlwdG9LZXkpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBjb25zdCBrZXlGb3JFbmMgPSBhd2FpdCB0aGlzLmdldEtleUZvckVuY3J5cHRpb24oa2V5KTtcbiAgICAgICAgY29uc3QgdGhlS2V5ID0gdGhpcy5yZXNvbHZlTGVnYWN5S2V5KGVuY1R5cGUsIGtleUZvckVuYyk7XG5cbiAgICAgICAgaWYgKHRoZUtleS5tYWNLZXkgIT0gbnVsbCAmJiBtYWMgPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5sb2dTZXJ2aWNlLmVycm9yKCdtYWMgcmVxdWlyZWQuJyk7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGVLZXkuZW5jVHlwZSAhPT0gZW5jVHlwZSkge1xuICAgICAgICAgICAgdGhpcy5sb2dTZXJ2aWNlLmVycm9yKCdlbmNUeXBlIHVuYXZhaWxhYmxlLicpO1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmYXN0UGFyYW1zID0gdGhpcy5jcnlwdG9GdW5jdGlvblNlcnZpY2UuYWVzRGVjcnlwdEZhc3RQYXJhbWV0ZXJzKGRhdGEsIGl2LCBtYWMsIHRoZUtleSk7XG4gICAgICAgIGlmIChmYXN0UGFyYW1zLm1hY0tleSAhPSBudWxsICYmIGZhc3RQYXJhbXMubWFjICE9IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbXB1dGVkTWFjID0gYXdhaXQgdGhpcy5jcnlwdG9GdW5jdGlvblNlcnZpY2UuaG1hY0Zhc3QoZmFzdFBhcmFtcy5tYWNEYXRhLFxuICAgICAgICAgICAgICAgIGZhc3RQYXJhbXMubWFjS2V5LCAnc2hhMjU2Jyk7XG4gICAgICAgICAgICBjb25zdCBtYWNzRXF1YWwgPSBhd2FpdCB0aGlzLmNyeXB0b0Z1bmN0aW9uU2VydmljZS5jb21wYXJlRmFzdChmYXN0UGFyYW1zLm1hYywgY29tcHV0ZWRNYWMpO1xuICAgICAgICAgICAgaWYgKCFtYWNzRXF1YWwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ1NlcnZpY2UuZXJyb3IoJ21hYyBmYWlsZWQuJyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5jcnlwdG9GdW5jdGlvblNlcnZpY2UuYWVzRGVjcnlwdEZhc3QoZmFzdFBhcmFtcyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBhZXNEZWNyeXB0VG9CeXRlcyhlbmNUeXBlOiBFbmNyeXB0aW9uVHlwZSwgZGF0YTogQXJyYXlCdWZmZXIsIGl2OiBBcnJheUJ1ZmZlcixcbiAgICAgICAgbWFjOiBBcnJheUJ1ZmZlciwga2V5OiBTeW1tZXRyaWNDcnlwdG9LZXkpOiBQcm9taXNlPEFycmF5QnVmZmVyPiB7XG4gICAgICAgIGNvbnN0IGtleUZvckVuYyA9IGF3YWl0IHRoaXMuZ2V0S2V5Rm9yRW5jcnlwdGlvbihrZXkpO1xuICAgICAgICBjb25zdCB0aGVLZXkgPSB0aGlzLnJlc29sdmVMZWdhY3lLZXkoZW5jVHlwZSwga2V5Rm9yRW5jKTtcblxuICAgICAgICBpZiAodGhlS2V5Lm1hY0tleSAhPSBudWxsICYmIG1hYyA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGVLZXkuZW5jVHlwZSAhPT0gZW5jVHlwZSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhlS2V5Lm1hY0tleSAhPSBudWxsICYmIG1hYyAhPSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBtYWNEYXRhID0gbmV3IFVpbnQ4QXJyYXkoaXYuYnl0ZUxlbmd0aCArIGRhdGEuYnl0ZUxlbmd0aCk7XG4gICAgICAgICAgICBtYWNEYXRhLnNldChuZXcgVWludDhBcnJheShpdiksIDApO1xuICAgICAgICAgICAgbWFjRGF0YS5zZXQobmV3IFVpbnQ4QXJyYXkoZGF0YSksIGl2LmJ5dGVMZW5ndGgpO1xuICAgICAgICAgICAgY29uc3QgY29tcHV0ZWRNYWMgPSBhd2FpdCB0aGlzLmNyeXB0b0Z1bmN0aW9uU2VydmljZS5obWFjKG1hY0RhdGEuYnVmZmVyLCB0aGVLZXkubWFjS2V5LCAnc2hhMjU2Jyk7XG4gICAgICAgICAgICBpZiAoY29tcHV0ZWRNYWMgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbWFjc01hdGNoID0gYXdhaXQgdGhpcy5jcnlwdG9GdW5jdGlvblNlcnZpY2UuY29tcGFyZShtYWMsIGNvbXB1dGVkTWFjKTtcbiAgICAgICAgICAgIGlmICghbWFjc01hdGNoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dTZXJ2aWNlLmVycm9yKCdtYWMgZmFpbGVkLicpO1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY3J5cHRvRnVuY3Rpb25TZXJ2aWNlLmFlc0RlY3J5cHQoZGF0YSwgaXYsIHRoZUtleS5lbmNLZXkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgZ2V0S2V5Rm9yRW5jcnlwdGlvbihrZXk/OiBTeW1tZXRyaWNDcnlwdG9LZXkpOiBQcm9taXNlPFN5bW1ldHJpY0NyeXB0b0tleT4ge1xuICAgICAgICBpZiAoa2V5ICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBrZXk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBlbmNLZXkgPSBhd2FpdCB0aGlzLmdldEVuY0tleSgpO1xuICAgICAgICBpZiAoZW5jS2V5ICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBlbmNLZXk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXRLZXkoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlc29sdmVMZWdhY3lLZXkoZW5jVHlwZTogRW5jcnlwdGlvblR5cGUsIGtleTogU3ltbWV0cmljQ3J5cHRvS2V5KTogU3ltbWV0cmljQ3J5cHRvS2V5IHtcbiAgICAgICAgaWYgKGVuY1R5cGUgPT09IEVuY3J5cHRpb25UeXBlLkFlc0NiYzEyOF9IbWFjU2hhMjU2X0I2NCAmJlxuICAgICAgICAgICAga2V5LmVuY1R5cGUgPT09IEVuY3J5cHRpb25UeXBlLkFlc0NiYzI1Nl9CNjQpIHtcbiAgICAgICAgICAgIC8vIE9sZCBlbmNyeXB0LXRoZW4tbWFjIHNjaGVtZSwgbWFrZSBhIG5ldyBrZXlcbiAgICAgICAgICAgIGlmICh0aGlzLmxlZ2FjeUV0bUtleSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sZWdhY3lFdG1LZXkgPSBuZXcgU3ltbWV0cmljQ3J5cHRvS2V5KGtleS5rZXksIEVuY3J5cHRpb25UeXBlLkFlc0NiYzEyOF9IbWFjU2hhMjU2X0I2NCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sZWdhY3lFdG1LZXk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ga2V5O1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgc3RyZXRjaEtleShrZXk6IFN5bW1ldHJpY0NyeXB0b0tleSk6IFByb21pc2U8U3ltbWV0cmljQ3J5cHRvS2V5PiB7XG4gICAgICAgIGNvbnN0IG5ld0tleSA9IG5ldyBVaW50OEFycmF5KDY0KTtcbiAgICAgICAgY29uc3QgZW5jS2V5ID0gYXdhaXQgdGhpcy5jcnlwdG9GdW5jdGlvblNlcnZpY2UuaGtkZkV4cGFuZChrZXkua2V5LCAnZW5jJywgMzIsICdzaGEyNTYnKTtcbiAgICAgICAgY29uc3QgbWFjS2V5ID0gYXdhaXQgdGhpcy5jcnlwdG9GdW5jdGlvblNlcnZpY2UuaGtkZkV4cGFuZChrZXkua2V5LCAnbWFjJywgMzIsICdzaGEyNTYnKTtcbiAgICAgICAgbmV3S2V5LnNldChuZXcgVWludDhBcnJheShlbmNLZXkpKTtcbiAgICAgICAgbmV3S2V5LnNldChuZXcgVWludDhBcnJheShtYWNLZXkpLCAzMik7XG4gICAgICAgIHJldHVybiBuZXcgU3ltbWV0cmljQ3J5cHRvS2V5KG5ld0tleS5idWZmZXIpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgaGFzaFBocmFzZShoYXNoOiBBcnJheUJ1ZmZlciwgbWluaW11bUVudHJvcHk6IG51bWJlciA9IDY0KSB7XG4gICAgICAgIGNvbnN0IGVudHJvcHlQZXJXb3JkID0gTWF0aC5sb2coRUVGTG9uZ1dvcmRMaXN0Lmxlbmd0aCkgLyBNYXRoLmxvZygyKTtcbiAgICAgICAgbGV0IG51bVdvcmRzID0gTWF0aC5jZWlsKG1pbmltdW1FbnRyb3B5IC8gZW50cm9weVBlcldvcmQpO1xuXG4gICAgICAgIGNvbnN0IGhhc2hBcnIgPSBBcnJheS5mcm9tKG5ldyBVaW50OEFycmF5KGhhc2gpKTtcbiAgICAgICAgY29uc3QgZW50cm9weUF2YWlsYWJsZSA9IGhhc2hBcnIubGVuZ3RoICogNDtcbiAgICAgICAgaWYgKG51bVdvcmRzICogZW50cm9weVBlcldvcmQgPiBlbnRyb3B5QXZhaWxhYmxlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ091dHB1dCBlbnRyb3B5IG9mIGhhc2ggZnVuY3Rpb24gaXMgdG9vIHNtYWxsJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwaHJhc2U6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGxldCBoYXNoTnVtYmVyID0gYmlnSW50LmZyb21BcnJheShoYXNoQXJyLCAyNTYpO1xuICAgICAgICB3aGlsZSAobnVtV29yZHMtLSkge1xuICAgICAgICAgICAgY29uc3QgcmVtYWluZGVyID0gaGFzaE51bWJlci5tb2QoRUVGTG9uZ1dvcmRMaXN0Lmxlbmd0aCk7XG4gICAgICAgICAgICBoYXNoTnVtYmVyID0gaGFzaE51bWJlci5kaXZpZGUoRUVGTG9uZ1dvcmRMaXN0Lmxlbmd0aCk7XG4gICAgICAgICAgICBwaHJhc2UucHVzaChFRUZMb25nV29yZExpc3RbcmVtYWluZGVyIGFzIGFueV0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwaHJhc2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBidWlsZEVuY0tleShrZXk6IFN5bW1ldHJpY0NyeXB0b0tleSwgZW5jS2V5OiBBcnJheUJ1ZmZlcilcbiAgICAgICAgOiBQcm9taXNlPFtTeW1tZXRyaWNDcnlwdG9LZXksIEVuY1N0cmluZ10+IHtcbiAgICAgICAgbGV0IGVuY0tleUVuYzogRW5jU3RyaW5nID0gbnVsbDtcbiAgICAgICAgaWYgKGtleS5rZXkuYnl0ZUxlbmd0aCA9PT0gMzIpIHtcbiAgICAgICAgICAgIGNvbnN0IG5ld0tleSA9IGF3YWl0IHRoaXMuc3RyZXRjaEtleShrZXkpO1xuICAgICAgICAgICAgZW5jS2V5RW5jID0gYXdhaXQgdGhpcy5lbmNyeXB0KGVuY0tleSwgbmV3S2V5KTtcbiAgICAgICAgfSBlbHNlIGlmIChrZXkua2V5LmJ5dGVMZW5ndGggPT09IDY0KSB7XG4gICAgICAgICAgICBlbmNLZXlFbmMgPSBhd2FpdCB0aGlzLmVuY3J5cHQoZW5jS2V5LCBrZXkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGtleSBzaXplLicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbbmV3IFN5bW1ldHJpY0NyeXB0b0tleShlbmNLZXkpLCBlbmNLZXlFbmNdO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgRW52aXJvbm1lbnRVcmxzIH0gZnJvbSAnLi4vbW9kZWxzL2RvbWFpbi9lbnZpcm9ubWVudFVybHMnO1xuXG5pbXBvcnQgeyBDb25zdGFudHNTZXJ2aWNlIH0gZnJvbSAnLi9jb25zdGFudHMuc2VydmljZSc7XG5cbmltcG9ydCB7IEVudmlyb25tZW50U2VydmljZSBhcyBFbnZpcm9ubWVudFNlcnZpY2VBYnN0cmFjdGlvbiwgVXJscyB9IGZyb20gJy4uL2Fic3RyYWN0aW9ucy9lbnZpcm9ubWVudC5zZXJ2aWNlJztcbmltcG9ydCB7IFN0b3JhZ2VTZXJ2aWNlIH0gZnJvbSAnLi4vYWJzdHJhY3Rpb25zL3N0b3JhZ2Uuc2VydmljZSc7XG5cbmV4cG9ydCBjbGFzcyBFbnZpcm9ubWVudFNlcnZpY2UgaW1wbGVtZW50cyBFbnZpcm9ubWVudFNlcnZpY2VBYnN0cmFjdGlvbiB7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IHVybHNTdWJqZWN0ID0gbmV3IFN1YmplY3Q8VXJscz4oKTtcbiAgICB1cmxzOiBPYnNlcnZhYmxlPFVybHM+ID0gdGhpcy51cmxzU3ViamVjdDsgLy8gdHNsaW50OmRpc2FibGUtbGluZVxuXG4gICAgcHJpdmF0ZSBiYXNlVXJsOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSB3ZWJWYXVsdFVybDogc3RyaW5nO1xuICAgIHByaXZhdGUgYXBpVXJsOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBpZGVudGl0eVVybDogc3RyaW5nO1xuICAgIHByaXZhdGUgaWNvbnNVcmw6IHN0cmluZztcbiAgICBwcml2YXRlIG5vdGlmaWNhdGlvbnNVcmw6IHN0cmluZztcbiAgICBwcml2YXRlIGV2ZW50c1VybDogc3RyaW5nO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBzdG9yYWdlU2VydmljZTogU3RvcmFnZVNlcnZpY2UpIHt9XG5cbiAgICBoYXNCYXNlVXJsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5iYXNlVXJsICE9IG51bGw7XG4gICAgfVxuXG4gICAgZ2V0Tm90aWZpY2F0aW9uc1VybCgpIHtcbiAgICAgICAgaWYgKHRoaXMubm90aWZpY2F0aW9uc1VybCAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5ub3RpZmljYXRpb25zVXJsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuYmFzZVVybCAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5iYXNlVXJsICsgJy9ub3RpZmljYXRpb25zJztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAnaHR0cHM6Ly9ub3RpZmljYXRpb25zLmJpdHdhcmRlbi5jb20nO1xuICAgIH1cblxuICAgIGdldFdlYlZhdWx0VXJsKCkge1xuICAgICAgICBpZiAodGhpcy53ZWJWYXVsdFVybCAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy53ZWJWYXVsdFVybDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmJhc2VVcmwpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmJhc2VVcmw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICdodHRwczovL3ZhdWx0LmJpdHdhcmRlbi5jb20nO1xuICAgIH1cblxuICAgIGdldFNlbmRVcmwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFdlYlZhdWx0VXJsKCkgPT09ICdodHRwczovL3ZhdWx0LmJpdHdhcmRlbi5jb20nXG4gICAgICAgICAgICA/ICdodHRwczovL3NlbmQuYml0d2FyZGVuLmNvbS8jJ1xuICAgICAgICAgICAgOiB0aGlzLmdldFdlYlZhdWx0VXJsKCkgKyAnLyMvc2VuZC8nO1xuICAgIH1cblxuICAgIGdldEljb25zVXJsKCkge1xuICAgICAgICBpZiAodGhpcy5pY29uc1VybCAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pY29uc1VybDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmJhc2VVcmwpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmJhc2VVcmwgKyAnL2ljb25zJztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAnaHR0cHM6Ly9pY29ucy5iaXR3YXJkZW4ubmV0JztcbiAgICB9XG5cbiAgICBnZXRBcGlVcmwoKSB7XG4gICAgICAgIGlmICh0aGlzLmFwaVVybCAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hcGlVcmw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5iYXNlVXJsKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5iYXNlVXJsICsgJy9hcGknO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICdodHRwczovL2FwaS5iaXR3YXJkZW4uY29tJztcbiAgICB9XG5cbiAgICBnZXRJZGVudGl0eVVybCgpIHtcbiAgICAgICAgaWYgKHRoaXMuaWRlbnRpdHlVcmwgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaWRlbnRpdHlVcmw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5iYXNlVXJsKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5iYXNlVXJsICsgJy9pZGVudGl0eSc7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gJ2h0dHBzOi8vaWRlbnRpdHkuYml0d2FyZGVuLmNvbSc7XG4gICAgfVxuXG4gICAgZ2V0RXZlbnRzVXJsKCkge1xuICAgICAgICBpZiAodGhpcy5ldmVudHNVcmwgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXZlbnRzVXJsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuYmFzZVVybCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYmFzZVVybCArICcvZXZlbnRzJztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAnaHR0cHM6Ly9ldmVudHMuYml0d2FyZGVuLmNvbSc7XG4gICAgfVxuXG4gICAgYXN5bmMgc2V0VXJsc0Zyb21TdG9yYWdlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCB1cmxzT2JqOiBhbnkgPSBhd2FpdCB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldChDb25zdGFudHNTZXJ2aWNlLmVudmlyb25tZW50VXJsc0tleSk7XG4gICAgICAgIGNvbnN0IHVybHMgPSB1cmxzT2JqIHx8IHtcbiAgICAgICAgICAgIGJhc2U6IG51bGwsXG4gICAgICAgICAgICBhcGk6IG51bGwsXG4gICAgICAgICAgICBpZGVudGl0eTogbnVsbCxcbiAgICAgICAgICAgIGljb25zOiBudWxsLFxuICAgICAgICAgICAgbm90aWZpY2F0aW9uczogbnVsbCxcbiAgICAgICAgICAgIGV2ZW50czogbnVsbCxcbiAgICAgICAgICAgIHdlYlZhdWx0OiBudWxsLFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGVudlVybHMgPSBuZXcgRW52aXJvbm1lbnRVcmxzKCk7XG5cbiAgICAgICAgaWYgKHVybHMuYmFzZSkge1xuICAgICAgICAgICAgdGhpcy5iYXNlVXJsID0gZW52VXJscy5iYXNlID0gdXJscy5iYXNlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy53ZWJWYXVsdFVybCA9IHVybHMud2ViVmF1bHQ7XG4gICAgICAgIHRoaXMuYXBpVXJsID0gZW52VXJscy5hcGkgPSB1cmxzLmFwaTtcbiAgICAgICAgdGhpcy5pZGVudGl0eVVybCA9IGVudlVybHMuaWRlbnRpdHkgPSB1cmxzLmlkZW50aXR5O1xuICAgICAgICB0aGlzLmljb25zVXJsID0gdXJscy5pY29ucztcbiAgICAgICAgdGhpcy5ub3RpZmljYXRpb25zVXJsID0gdXJscy5ub3RpZmljYXRpb25zO1xuICAgICAgICB0aGlzLmV2ZW50c1VybCA9IGVudlVybHMuZXZlbnRzID0gdXJscy5ldmVudHM7XG4gICAgfVxuXG4gICAgYXN5bmMgc2V0VXJscyh1cmxzOiBVcmxzLCBzYXZlU2V0dGluZ3M6IGJvb2xlYW4gPSB0cnVlKTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgdXJscy5iYXNlID0gdGhpcy5mb3JtYXRVcmwodXJscy5iYXNlKTtcbiAgICAgICAgdXJscy53ZWJWYXVsdCA9IHRoaXMuZm9ybWF0VXJsKHVybHMud2ViVmF1bHQpO1xuICAgICAgICB1cmxzLmFwaSA9IHRoaXMuZm9ybWF0VXJsKHVybHMuYXBpKTtcbiAgICAgICAgdXJscy5pZGVudGl0eSA9IHRoaXMuZm9ybWF0VXJsKHVybHMuaWRlbnRpdHkpO1xuICAgICAgICB1cmxzLmljb25zID0gdGhpcy5mb3JtYXRVcmwodXJscy5pY29ucyk7XG4gICAgICAgIHVybHMubm90aWZpY2F0aW9ucyA9IHRoaXMuZm9ybWF0VXJsKHVybHMubm90aWZpY2F0aW9ucyk7XG4gICAgICAgIHVybHMuZXZlbnRzID0gdGhpcy5mb3JtYXRVcmwodXJscy5ldmVudHMpO1xuXG4gICAgICAgIGlmIChzYXZlU2V0dGluZ3MpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2F2ZShDb25zdGFudHNTZXJ2aWNlLmVudmlyb25tZW50VXJsc0tleSwge1xuICAgICAgICAgICAgICAgIGJhc2U6IHVybHMuYmFzZSxcbiAgICAgICAgICAgICAgICBhcGk6IHVybHMuYXBpLFxuICAgICAgICAgICAgICAgIGlkZW50aXR5OiB1cmxzLmlkZW50aXR5LFxuICAgICAgICAgICAgICAgIHdlYlZhdWx0OiB1cmxzLndlYlZhdWx0LFxuICAgICAgICAgICAgICAgIGljb25zOiB1cmxzLmljb25zLFxuICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbnM6IHVybHMubm90aWZpY2F0aW9ucyxcbiAgICAgICAgICAgICAgICBldmVudHM6IHVybHMuZXZlbnRzLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmJhc2VVcmwgPSB1cmxzLmJhc2U7XG4gICAgICAgIHRoaXMud2ViVmF1bHRVcmwgPSB1cmxzLndlYlZhdWx0O1xuICAgICAgICB0aGlzLmFwaVVybCA9IHVybHMuYXBpO1xuICAgICAgICB0aGlzLmlkZW50aXR5VXJsID0gdXJscy5pZGVudGl0eTtcbiAgICAgICAgdGhpcy5pY29uc1VybCA9IHVybHMuaWNvbnM7XG4gICAgICAgIHRoaXMubm90aWZpY2F0aW9uc1VybCA9IHVybHMubm90aWZpY2F0aW9ucztcbiAgICAgICAgdGhpcy5ldmVudHNVcmwgPSB1cmxzLmV2ZW50cztcblxuICAgICAgICB0aGlzLnVybHNTdWJqZWN0Lm5leHQodXJscyk7XG5cbiAgICAgICAgcmV0dXJuIHVybHM7XG4gICAgfVxuXG4gICAgZ2V0VXJscygpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGJhc2U6IHRoaXMuYmFzZVVybCxcbiAgICAgICAgICAgIHdlYlZhdWx0OiB0aGlzLndlYlZhdWx0VXJsLFxuICAgICAgICAgICAgYXBpOiB0aGlzLmFwaVVybCxcbiAgICAgICAgICAgIGlkZW50aXR5OiB0aGlzLmlkZW50aXR5VXJsLFxuICAgICAgICAgICAgaWNvbnM6IHRoaXMuaWNvbnNVcmwsXG4gICAgICAgICAgICBub3RpZmljYXRpb25zOiB0aGlzLm5vdGlmaWNhdGlvbnNVcmwsXG4gICAgICAgICAgICBldmVudHM6IHRoaXMuZXZlbnRzVXJsLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgZm9ybWF0VXJsKHVybDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKHVybCA9PSBudWxsIHx8IHVybCA9PT0gJycpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgdXJsID0gdXJsLnJlcGxhY2UoL1xcLyskL2csICcnKTtcbiAgICAgICAgaWYgKCF1cmwuc3RhcnRzV2l0aCgnaHR0cDovLycpICYmICF1cmwuc3RhcnRzV2l0aCgnaHR0cHM6Ly8nKSkge1xuICAgICAgICAgICAgdXJsID0gJ2h0dHBzOi8vJyArIHVybDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB1cmwudHJpbSgpO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IEV2ZW50VHlwZSB9IGZyb20gJy4uL2VudW1zL2V2ZW50VHlwZSc7XG5cbmltcG9ydCB7IEV2ZW50RGF0YSB9IGZyb20gJy4uL21vZGVscy9kYXRhL2V2ZW50RGF0YSc7XG5cbmltcG9ydCB7IEV2ZW50UmVxdWVzdCB9IGZyb20gJy4uL21vZGVscy9yZXF1ZXN0L2V2ZW50UmVxdWVzdCc7XG5cbmltcG9ydCB7IEFwaVNlcnZpY2UgfSBmcm9tICcuLi9hYnN0cmFjdGlvbnMvYXBpLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ2lwaGVyU2VydmljZSB9IGZyb20gJy4uL2Fic3RyYWN0aW9ucy9jaXBoZXIuc2VydmljZSc7XG5pbXBvcnQgeyBFdmVudFNlcnZpY2UgYXMgRXZlbnRTZXJ2aWNlQWJzdHJhY3Rpb24gfSBmcm9tICcuLi9hYnN0cmFjdGlvbnMvZXZlbnQuc2VydmljZSc7XG5pbXBvcnQgeyBTdG9yYWdlU2VydmljZSB9IGZyb20gJy4uL2Fic3RyYWN0aW9ucy9zdG9yYWdlLnNlcnZpY2UnO1xuaW1wb3J0IHsgVXNlclNlcnZpY2UgfSBmcm9tICcuLi9hYnN0cmFjdGlvbnMvdXNlci5zZXJ2aWNlJztcblxuaW1wb3J0IHsgTG9nU2VydmljZSB9IGZyb20gJy4uL2Fic3RyYWN0aW9ucy9sb2cuc2VydmljZSc7XG5pbXBvcnQgeyBDb25zdGFudHNTZXJ2aWNlIH0gZnJvbSAnLi9jb25zdGFudHMuc2VydmljZSc7XG5cbmV4cG9ydCBjbGFzcyBFdmVudFNlcnZpY2UgaW1wbGVtZW50cyBFdmVudFNlcnZpY2VBYnN0cmFjdGlvbiB7XG4gICAgcHJpdmF0ZSBpbml0ZWQgPSBmYWxzZTtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgc3RvcmFnZVNlcnZpY2U6IFN0b3JhZ2VTZXJ2aWNlLCBwcml2YXRlIGFwaVNlcnZpY2U6IEFwaVNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgdXNlclNlcnZpY2U6IFVzZXJTZXJ2aWNlLCBwcml2YXRlIGNpcGhlclNlcnZpY2U6IENpcGhlclNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgbG9nU2VydmljZTogTG9nU2VydmljZSkgeyB9XG5cbiAgICBpbml0KGNoZWNrT25JbnRlcnZhbDogYm9vbGVhbikge1xuICAgICAgICBpZiAodGhpcy5pbml0ZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaW5pdGVkID0gdHJ1ZTtcbiAgICAgICAgaWYgKGNoZWNrT25JbnRlcnZhbCkge1xuICAgICAgICAgICAgdGhpcy51cGxvYWRFdmVudHMoKTtcbiAgICAgICAgICAgIHNldEludGVydmFsKCgpID0+IHRoaXMudXBsb2FkRXZlbnRzKCksIDYwICogMTAwMCk7IC8vIGNoZWNrIGV2ZXJ5IDYwIHNlY29uZHNcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIGNvbGxlY3QoZXZlbnRUeXBlOiBFdmVudFR5cGUsIGNpcGhlcklkOiBzdHJpbmcgPSBudWxsLCB1cGxvYWRJbW1lZGlhdGVseSA9IGZhbHNlKTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgY29uc3QgYXV0aGVkID0gYXdhaXQgdGhpcy51c2VyU2VydmljZS5pc0F1dGhlbnRpY2F0ZWQoKTtcbiAgICAgICAgaWYgKCFhdXRoZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvcmdhbml6YXRpb25zID0gYXdhaXQgdGhpcy51c2VyU2VydmljZS5nZXRBbGxPcmdhbml6YXRpb25zKCk7XG4gICAgICAgIGlmIChvcmdhbml6YXRpb25zID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvcmdJZHMgPSBuZXcgU2V0PHN0cmluZz4ob3JnYW5pemF0aW9ucy5maWx0ZXIobyA9PiBvLnVzZUV2ZW50cykubWFwKG8gPT4gby5pZCkpO1xuICAgICAgICBpZiAob3JnSWRzLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2lwaGVySWQgIT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgY2lwaGVyID0gYXdhaXQgdGhpcy5jaXBoZXJTZXJ2aWNlLmdldChjaXBoZXJJZCk7XG4gICAgICAgICAgICBpZiAoY2lwaGVyID09IG51bGwgfHwgY2lwaGVyLm9yZ2FuaXphdGlvbklkID09IG51bGwgfHwgIW9yZ0lkcy5oYXMoY2lwaGVyLm9yZ2FuaXphdGlvbklkKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgZXZlbnRDb2xsZWN0aW9uID0gYXdhaXQgdGhpcy5zdG9yYWdlU2VydmljZS5nZXQ8RXZlbnREYXRhW10+KENvbnN0YW50c1NlcnZpY2UuZXZlbnRDb2xsZWN0aW9uS2V5KTtcbiAgICAgICAgaWYgKGV2ZW50Q29sbGVjdGlvbiA9PSBudWxsKSB7XG4gICAgICAgICAgICBldmVudENvbGxlY3Rpb24gPSBbXTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBldmVudCA9IG5ldyBFdmVudERhdGEoKTtcbiAgICAgICAgZXZlbnQudHlwZSA9IGV2ZW50VHlwZTtcbiAgICAgICAgZXZlbnQuY2lwaGVySWQgPSBjaXBoZXJJZDtcbiAgICAgICAgZXZlbnQuZGF0ZSA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKTtcbiAgICAgICAgZXZlbnRDb2xsZWN0aW9uLnB1c2goZXZlbnQpO1xuICAgICAgICBhd2FpdCB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNhdmUoQ29uc3RhbnRzU2VydmljZS5ldmVudENvbGxlY3Rpb25LZXksIGV2ZW50Q29sbGVjdGlvbik7XG4gICAgICAgIGlmICh1cGxvYWRJbW1lZGlhdGVseSkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy51cGxvYWRFdmVudHMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIHVwbG9hZEV2ZW50cygpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICBjb25zdCBhdXRoZWQgPSBhd2FpdCB0aGlzLnVzZXJTZXJ2aWNlLmlzQXV0aGVudGljYXRlZCgpO1xuICAgICAgICBpZiAoIWF1dGhlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGV2ZW50Q29sbGVjdGlvbiA9IGF3YWl0IHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0PEV2ZW50RGF0YVtdPihDb25zdGFudHNTZXJ2aWNlLmV2ZW50Q29sbGVjdGlvbktleSk7XG4gICAgICAgIGlmIChldmVudENvbGxlY3Rpb24gPT0gbnVsbCB8fCBldmVudENvbGxlY3Rpb24ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IGV2ZW50Q29sbGVjdGlvbi5tYXAoZSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXEgPSBuZXcgRXZlbnRSZXF1ZXN0KCk7XG4gICAgICAgICAgICByZXEudHlwZSA9IGUudHlwZTtcbiAgICAgICAgICAgIHJlcS5jaXBoZXJJZCA9IGUuY2lwaGVySWQ7XG4gICAgICAgICAgICByZXEuZGF0ZSA9IGUuZGF0ZTtcbiAgICAgICAgICAgIHJldHVybiByZXE7XG4gICAgICAgIH0pO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5hcGlTZXJ2aWNlLnBvc3RFdmVudHNDb2xsZWN0KHJlcXVlc3QpO1xuICAgICAgICAgICAgdGhpcy5jbGVhckV2ZW50cygpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ1NlcnZpY2UuZXJyb3IoZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBjbGVhckV2ZW50cygpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICBhd2FpdCB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnJlbW92ZShDb25zdGFudHNTZXJ2aWNlLmV2ZW50Q29sbGVjdGlvbktleSk7XG4gICAgfVxufVxuIiwiaW1wb3J0ICogYXMgcGFwYSBmcm9tICdwYXBhcGFyc2UnO1xuXG5pbXBvcnQgeyBDaXBoZXJUeXBlIH0gZnJvbSAnLi4vZW51bXMvY2lwaGVyVHlwZSc7XG5cbmltcG9ydCB7IEFwaVNlcnZpY2UgfSBmcm9tICcuLi9hYnN0cmFjdGlvbnMvYXBpLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ2lwaGVyU2VydmljZSB9IGZyb20gJy4uL2Fic3RyYWN0aW9ucy9jaXBoZXIuc2VydmljZSc7XG5pbXBvcnQgeyBDcnlwdG9TZXJ2aWNlIH0gZnJvbSAnLi4vYWJzdHJhY3Rpb25zL2NyeXB0by5zZXJ2aWNlJztcbmltcG9ydCB7IEV4cG9ydFNlcnZpY2UgYXMgRXhwb3J0U2VydmljZUFic3RyYWN0aW9uIH0gZnJvbSAnLi4vYWJzdHJhY3Rpb25zL2V4cG9ydC5zZXJ2aWNlJztcbmltcG9ydCB7IEZvbGRlclNlcnZpY2UgfSBmcm9tICcuLi9hYnN0cmFjdGlvbnMvZm9sZGVyLnNlcnZpY2UnO1xuXG5pbXBvcnQgeyBDaXBoZXJWaWV3IH0gZnJvbSAnLi4vbW9kZWxzL3ZpZXcvY2lwaGVyVmlldyc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uVmlldyB9IGZyb20gJy4uL21vZGVscy92aWV3L2NvbGxlY3Rpb25WaWV3JztcbmltcG9ydCB7IEZvbGRlclZpZXcgfSBmcm9tICcuLi9tb2RlbHMvdmlldy9mb2xkZXJWaWV3JztcblxuaW1wb3J0IHsgQ2lwaGVyIH0gZnJvbSAnLi4vbW9kZWxzL2RvbWFpbi9jaXBoZXInO1xuaW1wb3J0IHsgQ29sbGVjdGlvbiB9IGZyb20gJy4uL21vZGVscy9kb21haW4vY29sbGVjdGlvbic7XG5pbXBvcnQgeyBGb2xkZXIgfSBmcm9tICcuLi9tb2RlbHMvZG9tYWluL2ZvbGRlcic7XG5cbmltcG9ydCB7IENpcGhlckRhdGEgfSBmcm9tICcuLi9tb2RlbHMvZGF0YS9jaXBoZXJEYXRhJztcbmltcG9ydCB7IENvbGxlY3Rpb25EYXRhIH0gZnJvbSAnLi4vbW9kZWxzL2RhdGEvY29sbGVjdGlvbkRhdGEnO1xuaW1wb3J0IHsgQ29sbGVjdGlvbkRldGFpbHNSZXNwb25zZSB9IGZyb20gJy4uL21vZGVscy9yZXNwb25zZS9jb2xsZWN0aW9uUmVzcG9uc2UnO1xuXG5pbXBvcnQgeyBDaXBoZXJXaXRoSWRzIGFzIENpcGhlckV4cG9ydCB9IGZyb20gJy4uL21vZGVscy9leHBvcnQvY2lwaGVyV2l0aElkcyc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uV2l0aElkIGFzIENvbGxlY3Rpb25FeHBvcnQgfSBmcm9tICcuLi9tb2RlbHMvZXhwb3J0L2NvbGxlY3Rpb25XaXRoSWQnO1xuaW1wb3J0IHsgRXZlbnQgfSBmcm9tICcuLi9tb2RlbHMvZXhwb3J0L2V2ZW50JztcbmltcG9ydCB7IEZvbGRlcldpdGhJZCBhcyBGb2xkZXJFeHBvcnQgfSBmcm9tICcuLi9tb2RlbHMvZXhwb3J0L2ZvbGRlcldpdGhJZCc7XG5pbXBvcnQgeyBFdmVudFZpZXcgfSBmcm9tICcuLi9tb2RlbHMvdmlldy9ldmVudFZpZXcnO1xuXG5pbXBvcnQgeyBVdGlscyB9IGZyb20gJy4uL21pc2MvdXRpbHMnO1xuXG5leHBvcnQgY2xhc3MgRXhwb3J0U2VydmljZSBpbXBsZW1lbnRzIEV4cG9ydFNlcnZpY2VBYnN0cmFjdGlvbiB7XG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBmb2xkZXJTZXJ2aWNlOiBGb2xkZXJTZXJ2aWNlLCBwcml2YXRlIGNpcGhlclNlcnZpY2U6IENpcGhlclNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgYXBpU2VydmljZTogQXBpU2VydmljZSwgcHJpdmF0ZSBjcnlwdG9TZXJ2aWNlOiBDcnlwdG9TZXJ2aWNlKSB7IH1cblxuICAgIGFzeW5jIGdldEV4cG9ydChmb3JtYXQ6ICdjc3YnIHwgJ2pzb24nIHwgJ2VuY3J5cHRlZF9qc29uJyA9ICdjc3YnKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgaWYgKGZvcm1hdCA9PT0gJ2VuY3J5cHRlZF9qc29uJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RW5jcnlwdGVkRXhwb3J0KCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXREZWNyeXB0ZWRFeHBvcnQoZm9ybWF0KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIGdldE9yZ2FuaXphdGlvbkV4cG9ydChvcmdhbml6YXRpb25JZDogc3RyaW5nLFxuICAgICAgICBmb3JtYXQ6ICdjc3YnIHwgJ2pzb24nIHwgJ2VuY3J5cHRlZF9qc29uJyA9ICdjc3YnKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgaWYgKGZvcm1hdCA9PT0gJ2VuY3J5cHRlZF9qc29uJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T3JnYW5pemF0aW9uRW5jcnlwdGVkRXhwb3J0KG9yZ2FuaXphdGlvbklkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldE9yZ2FuaXphdGlvbkRlY3J5cHRlZEV4cG9ydChvcmdhbml6YXRpb25JZCwgZm9ybWF0KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIGdldEV2ZW50RXhwb3J0KGV2ZW50czogRXZlbnRWaWV3W10pOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICByZXR1cm4gcGFwYS51bnBhcnNlKGV2ZW50cy5tYXAoZSA9PiBuZXcgRXZlbnQoZSkpKTtcbiAgICB9XG5cbiAgICBnZXRGaWxlTmFtZShwcmVmaXg6IHN0cmluZyA9IG51bGwsIGV4dGVuc2lvbjogc3RyaW5nID0gJ2NzdicpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuICAgICAgICBjb25zdCBkYXRlU3RyaW5nID1cbiAgICAgICAgICAgIG5vdy5nZXRGdWxsWWVhcigpICsgJycgKyB0aGlzLnBhZE51bWJlcihub3cuZ2V0TW9udGgoKSArIDEsIDIpICsgJycgKyB0aGlzLnBhZE51bWJlcihub3cuZ2V0RGF0ZSgpLCAyKSArXG4gICAgICAgICAgICB0aGlzLnBhZE51bWJlcihub3cuZ2V0SG91cnMoKSwgMikgKyAnJyArIHRoaXMucGFkTnVtYmVyKG5vdy5nZXRNaW51dGVzKCksIDIpICtcbiAgICAgICAgICAgIHRoaXMucGFkTnVtYmVyKG5vdy5nZXRTZWNvbmRzKCksIDIpO1xuXG4gICAgICAgIHJldHVybiAnYml0d2FyZGVuJyArIChwcmVmaXggPyAoJ18nICsgcHJlZml4KSA6ICcnKSArICdfZXhwb3J0XycgKyBkYXRlU3RyaW5nICsgJy4nICsgZXh0ZW5zaW9uO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgZ2V0RGVjcnlwdGVkRXhwb3J0KGZvcm1hdDogJ2pzb24nIHwgJ2NzdicpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBsZXQgZGVjRm9sZGVyczogRm9sZGVyVmlld1tdID0gW107XG4gICAgICAgIGxldCBkZWNDaXBoZXJzOiBDaXBoZXJWaWV3W10gPSBbXTtcbiAgICAgICAgY29uc3QgcHJvbWlzZXMgPSBbXTtcblxuICAgICAgICBwcm9taXNlcy5wdXNoKHRoaXMuZm9sZGVyU2VydmljZS5nZXRBbGxEZWNyeXB0ZWQoKS50aGVuKGZvbGRlcnMgPT4ge1xuICAgICAgICAgICAgZGVjRm9sZGVycyA9IGZvbGRlcnM7XG4gICAgICAgIH0pKTtcblxuICAgICAgICBwcm9taXNlcy5wdXNoKHRoaXMuY2lwaGVyU2VydmljZS5nZXRBbGxEZWNyeXB0ZWQoKS50aGVuKGNpcGhlcnMgPT4ge1xuICAgICAgICAgICAgZGVjQ2lwaGVycyA9IGNpcGhlcnMuZmlsdGVyKGYgPT4gZi5kZWxldGVkRGF0ZSA9PSBudWxsKTtcbiAgICAgICAgfSkpO1xuXG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcblxuICAgICAgICBpZiAoZm9ybWF0ID09PSAnY3N2Jykge1xuICAgICAgICAgICAgY29uc3QgZm9sZGVyc01hcCA9IG5ldyBNYXA8c3RyaW5nLCBGb2xkZXJWaWV3PigpO1xuICAgICAgICAgICAgZGVjRm9sZGVycy5mb3JFYWNoKGYgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChmLmlkICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9sZGVyc01hcC5zZXQoZi5pZCwgZik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGNvbnN0IGV4cG9ydENpcGhlcnM6IGFueVtdID0gW107XG4gICAgICAgICAgICBkZWNDaXBoZXJzLmZvckVhY2goYyA9PiB7XG4gICAgICAgICAgICAgICAgLy8gb25seSBleHBvcnQgbG9naW5zIGFuZCBzZWN1cmUgbm90ZXNcbiAgICAgICAgICAgICAgICBpZiAoYy50eXBlICE9PSBDaXBoZXJUeXBlLkxvZ2luICYmIGMudHlwZSAhPT0gQ2lwaGVyVHlwZS5TZWN1cmVOb3RlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGMub3JnYW5pemF0aW9uSWQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgY2lwaGVyOiBhbnkgPSB7fTtcbiAgICAgICAgICAgICAgICBjaXBoZXIuZm9sZGVyID0gYy5mb2xkZXJJZCAhPSBudWxsICYmIGZvbGRlcnNNYXAuaGFzKGMuZm9sZGVySWQpID9cbiAgICAgICAgICAgICAgICAgICAgZm9sZGVyc01hcC5nZXQoYy5mb2xkZXJJZCkubmFtZSA6IG51bGw7XG4gICAgICAgICAgICAgICAgY2lwaGVyLmZhdm9yaXRlID0gYy5mYXZvcml0ZSA/IDEgOiBudWxsO1xuICAgICAgICAgICAgICAgIHRoaXMuYnVpbGRDb21tb25DaXBoZXIoY2lwaGVyLCBjKTtcbiAgICAgICAgICAgICAgICBleHBvcnRDaXBoZXJzLnB1c2goY2lwaGVyKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZXR1cm4gcGFwYS51bnBhcnNlKGV4cG9ydENpcGhlcnMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QganNvbkRvYzogYW55ID0ge1xuICAgICAgICAgICAgICAgIGVuY3J5cHRlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgZm9sZGVyczogW10sXG4gICAgICAgICAgICAgICAgaXRlbXM6IFtdLFxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgZGVjRm9sZGVycy5mb3JFYWNoKGYgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChmLmlkID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBmb2xkZXIgPSBuZXcgRm9sZGVyRXhwb3J0KCk7XG4gICAgICAgICAgICAgICAgZm9sZGVyLmJ1aWxkKGYpO1xuICAgICAgICAgICAgICAgIGpzb25Eb2MuZm9sZGVycy5wdXNoKGZvbGRlcik7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgZGVjQ2lwaGVycy5mb3JFYWNoKGMgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjLm9yZ2FuaXphdGlvbklkICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBjaXBoZXIgPSBuZXcgQ2lwaGVyRXhwb3J0KCk7XG4gICAgICAgICAgICAgICAgY2lwaGVyLmJ1aWxkKGMpO1xuICAgICAgICAgICAgICAgIGNpcGhlci5jb2xsZWN0aW9uSWRzID0gbnVsbDtcbiAgICAgICAgICAgICAgICBqc29uRG9jLml0ZW1zLnB1c2goY2lwaGVyKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoanNvbkRvYywgbnVsbCwgJyAgJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGdldEVuY3J5cHRlZEV4cG9ydCgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBsZXQgZm9sZGVyczogRm9sZGVyW10gPSBbXTtcbiAgICAgICAgbGV0IGNpcGhlcnM6IENpcGhlcltdID0gW107XG4gICAgICAgIGNvbnN0IHByb21pc2VzID0gW107XG5cbiAgICAgICAgcHJvbWlzZXMucHVzaCh0aGlzLmZvbGRlclNlcnZpY2UuZ2V0QWxsKCkudGhlbihmID0+IHtcbiAgICAgICAgICAgIGZvbGRlcnMgPSBmO1xuICAgICAgICB9KSk7XG5cbiAgICAgICAgcHJvbWlzZXMucHVzaCh0aGlzLmNpcGhlclNlcnZpY2UuZ2V0QWxsKCkudGhlbihjID0+IHtcbiAgICAgICAgICAgIGNpcGhlcnMgPSBjLmZpbHRlcihmID0+IGYuZGVsZXRlZERhdGUgPT0gbnVsbCk7XG4gICAgICAgIH0pKTtcblxuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG5cbiAgICAgICAgY29uc3QgZW5jS2V5VmFsaWRhdGlvbiA9IGF3YWl0IHRoaXMuY3J5cHRvU2VydmljZS5lbmNyeXB0KFV0aWxzLm5ld0d1aWQoKSk7XG5cbiAgICAgICAgY29uc3QganNvbkRvYzogYW55ID0ge1xuICAgICAgICAgICAgZW5jcnlwdGVkOiB0cnVlLFxuICAgICAgICAgICAgZW5jS2V5VmFsaWRhdGlvbl9ET19OT1RfRURJVDogZW5jS2V5VmFsaWRhdGlvbi5lbmNyeXB0ZWRTdHJpbmcsXG4gICAgICAgICAgICBmb2xkZXJzOiBbXSxcbiAgICAgICAgICAgIGl0ZW1zOiBbXSxcbiAgICAgICAgfTtcblxuICAgICAgICBmb2xkZXJzLmZvckVhY2goZiA9PiB7XG4gICAgICAgICAgICBpZiAoZi5pZCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZm9sZGVyID0gbmV3IEZvbGRlckV4cG9ydCgpO1xuICAgICAgICAgICAgZm9sZGVyLmJ1aWxkKGYpO1xuICAgICAgICAgICAganNvbkRvYy5mb2xkZXJzLnB1c2goZm9sZGVyKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY2lwaGVycy5mb3JFYWNoKGMgPT4ge1xuICAgICAgICAgICAgaWYgKGMub3JnYW5pemF0aW9uSWQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGNpcGhlciA9IG5ldyBDaXBoZXJFeHBvcnQoKTtcbiAgICAgICAgICAgIGNpcGhlci5idWlsZChjKTtcbiAgICAgICAgICAgIGNpcGhlci5jb2xsZWN0aW9uSWRzID0gbnVsbDtcbiAgICAgICAgICAgIGpzb25Eb2MuaXRlbXMucHVzaChjaXBoZXIpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoanNvbkRvYywgbnVsbCwgJyAgJyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBnZXRPcmdhbml6YXRpb25EZWNyeXB0ZWRFeHBvcnQob3JnYW5pemF0aW9uSWQ6IHN0cmluZywgZm9ybWF0OiAnanNvbicgfCAnY3N2Jyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIGNvbnN0IGRlY0NvbGxlY3Rpb25zOiBDb2xsZWN0aW9uVmlld1tdID0gW107XG4gICAgICAgIGNvbnN0IGRlY0NpcGhlcnM6IENpcGhlclZpZXdbXSA9IFtdO1xuICAgICAgICBjb25zdCBwcm9taXNlcyA9IFtdO1xuXG4gICAgICAgIHByb21pc2VzLnB1c2godGhpcy5hcGlTZXJ2aWNlLmdldENvbGxlY3Rpb25zKG9yZ2FuaXphdGlvbklkKS50aGVuKGNvbGxlY3Rpb25zID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNvbGxlY3Rpb25Qcm9taXNlczogYW55ID0gW107XG4gICAgICAgICAgICBpZiAoY29sbGVjdGlvbnMgIT0gbnVsbCAmJiBjb2xsZWN0aW9ucy5kYXRhICE9IG51bGwgJiYgY29sbGVjdGlvbnMuZGF0YS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgY29sbGVjdGlvbnMuZGF0YS5mb3JFYWNoKGMgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb2xsZWN0aW9uID0gbmV3IENvbGxlY3Rpb24obmV3IENvbGxlY3Rpb25EYXRhKGMgYXMgQ29sbGVjdGlvbkRldGFpbHNSZXNwb25zZSkpO1xuICAgICAgICAgICAgICAgICAgICBjb2xsZWN0aW9uUHJvbWlzZXMucHVzaChjb2xsZWN0aW9uLmRlY3J5cHQoKS50aGVuKGRlY0NvbCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWNDb2xsZWN0aW9ucy5wdXNoKGRlY0NvbCk7XG4gICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLmFsbChjb2xsZWN0aW9uUHJvbWlzZXMpO1xuICAgICAgICB9KSk7XG5cbiAgICAgICAgcHJvbWlzZXMucHVzaCh0aGlzLmFwaVNlcnZpY2UuZ2V0Q2lwaGVyc09yZ2FuaXphdGlvbihvcmdhbml6YXRpb25JZCkudGhlbihjaXBoZXJzID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNpcGhlclByb21pc2VzOiBhbnkgPSBbXTtcbiAgICAgICAgICAgIGlmIChjaXBoZXJzICE9IG51bGwgJiYgY2lwaGVycy5kYXRhICE9IG51bGwgJiYgY2lwaGVycy5kYXRhLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBjaXBoZXJzLmRhdGEuZmlsdGVyKGMgPT4gYy5kZWxldGVkRGF0ZSA9PT0gbnVsbCkuZm9yRWFjaChjID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2lwaGVyID0gbmV3IENpcGhlcihuZXcgQ2lwaGVyRGF0YShjKSk7XG4gICAgICAgICAgICAgICAgICAgIGNpcGhlclByb21pc2VzLnB1c2goY2lwaGVyLmRlY3J5cHQoKS50aGVuKGRlY0NpcGhlciA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWNDaXBoZXJzLnB1c2goZGVjQ2lwaGVyKTtcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKGNpcGhlclByb21pc2VzKTtcbiAgICAgICAgfSkpO1xuXG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcblxuICAgICAgICBpZiAoZm9ybWF0ID09PSAnY3N2Jykge1xuICAgICAgICAgICAgY29uc3QgY29sbGVjdGlvbnNNYXAgPSBuZXcgTWFwPHN0cmluZywgQ29sbGVjdGlvblZpZXc+KCk7XG4gICAgICAgICAgICBkZWNDb2xsZWN0aW9ucy5mb3JFYWNoKGMgPT4ge1xuICAgICAgICAgICAgICAgIGNvbGxlY3Rpb25zTWFwLnNldChjLmlkLCBjKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBjb25zdCBleHBvcnRDaXBoZXJzOiBhbnlbXSA9IFtdO1xuICAgICAgICAgICAgZGVjQ2lwaGVycy5mb3JFYWNoKGMgPT4ge1xuICAgICAgICAgICAgICAgIC8vIG9ubHkgZXhwb3J0IGxvZ2lucyBhbmQgc2VjdXJlIG5vdGVzXG4gICAgICAgICAgICAgICAgaWYgKGMudHlwZSAhPT0gQ2lwaGVyVHlwZS5Mb2dpbiAmJiBjLnR5cGUgIT09IENpcGhlclR5cGUuU2VjdXJlTm90ZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgY2lwaGVyOiBhbnkgPSB7fTtcbiAgICAgICAgICAgICAgICBjaXBoZXIuY29sbGVjdGlvbnMgPSBbXTtcbiAgICAgICAgICAgICAgICBpZiAoYy5jb2xsZWN0aW9uSWRzICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2lwaGVyLmNvbGxlY3Rpb25zID0gYy5jb2xsZWN0aW9uSWRzLmZpbHRlcihpZCA9PiBjb2xsZWN0aW9uc01hcC5oYXMoaWQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgLm1hcChpZCA9PiBjb2xsZWN0aW9uc01hcC5nZXQoaWQpLm5hbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmJ1aWxkQ29tbW9uQ2lwaGVyKGNpcGhlciwgYyk7XG4gICAgICAgICAgICAgICAgZXhwb3J0Q2lwaGVycy5wdXNoKGNpcGhlcik7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmV0dXJuIHBhcGEudW5wYXJzZShleHBvcnRDaXBoZXJzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGpzb25Eb2M6IGFueSA9IHtcbiAgICAgICAgICAgICAgICBlbmNyeXB0ZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGNvbGxlY3Rpb25zOiBbXSxcbiAgICAgICAgICAgICAgICBpdGVtczogW10sXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBkZWNDb2xsZWN0aW9ucy5mb3JFYWNoKGMgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbGxlY3Rpb24gPSBuZXcgQ29sbGVjdGlvbkV4cG9ydCgpO1xuICAgICAgICAgICAgICAgIGNvbGxlY3Rpb24uYnVpbGQoYyk7XG4gICAgICAgICAgICAgICAganNvbkRvYy5jb2xsZWN0aW9ucy5wdXNoKGNvbGxlY3Rpb24pO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGRlY0NpcGhlcnMuZm9yRWFjaChjID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjaXBoZXIgPSBuZXcgQ2lwaGVyRXhwb3J0KCk7XG4gICAgICAgICAgICAgICAgY2lwaGVyLmJ1aWxkKGMpO1xuICAgICAgICAgICAgICAgIGpzb25Eb2MuaXRlbXMucHVzaChjaXBoZXIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoanNvbkRvYywgbnVsbCwgJyAgJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGdldE9yZ2FuaXphdGlvbkVuY3J5cHRlZEV4cG9ydChvcmdhbml6YXRpb25JZDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgY29uc3QgY29sbGVjdGlvbnM6IENvbGxlY3Rpb25bXSA9IFtdO1xuICAgICAgICBjb25zdCBjaXBoZXJzOiBDaXBoZXJbXSA9IFtdO1xuICAgICAgICBjb25zdCBwcm9taXNlcyA9IFtdO1xuXG4gICAgICAgIHByb21pc2VzLnB1c2godGhpcy5hcGlTZXJ2aWNlLmdldENvbGxlY3Rpb25zKG9yZ2FuaXphdGlvbklkKS50aGVuKGMgPT4ge1xuICAgICAgICAgICAgY29uc3QgY29sbGVjdGlvblByb21pc2VzOiBhbnkgPSBbXTtcbiAgICAgICAgICAgIGlmIChjICE9IG51bGwgJiYgYy5kYXRhICE9IG51bGwgJiYgYy5kYXRhLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBjLmRhdGEuZm9yRWFjaChyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29sbGVjdGlvbiA9IG5ldyBDb2xsZWN0aW9uKG5ldyBDb2xsZWN0aW9uRGF0YShyIGFzIENvbGxlY3Rpb25EZXRhaWxzUmVzcG9uc2UpKTtcbiAgICAgICAgICAgICAgICAgICAgY29sbGVjdGlvbnMucHVzaChjb2xsZWN0aW9uKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLmFsbChjb2xsZWN0aW9uUHJvbWlzZXMpO1xuICAgICAgICB9KSk7XG5cbiAgICAgICAgcHJvbWlzZXMucHVzaCh0aGlzLmFwaVNlcnZpY2UuZ2V0Q2lwaGVyc09yZ2FuaXphdGlvbihvcmdhbml6YXRpb25JZCkudGhlbihjID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNpcGhlclByb21pc2VzOiBhbnkgPSBbXTtcbiAgICAgICAgICAgIGlmIChjICE9IG51bGwgJiYgYy5kYXRhICE9IG51bGwgJiYgYy5kYXRhLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBjLmRhdGEuZmlsdGVyKGl0ZW0gPT4gaXRlbS5kZWxldGVkRGF0ZSA9PT0gbnVsbCkuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2lwaGVyID0gbmV3IENpcGhlcihuZXcgQ2lwaGVyRGF0YShpdGVtKSk7XG4gICAgICAgICAgICAgICAgICAgIGNpcGhlcnMucHVzaChjaXBoZXIpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKGNpcGhlclByb21pc2VzKTtcbiAgICAgICAgfSkpO1xuXG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcblxuICAgICAgICBjb25zdCBvcmdLZXkgPSBhd2FpdCB0aGlzLmNyeXB0b1NlcnZpY2UuZ2V0T3JnS2V5KG9yZ2FuaXphdGlvbklkKTtcbiAgICAgICAgY29uc3QgZW5jS2V5VmFsaWRhdGlvbiA9IGF3YWl0IHRoaXMuY3J5cHRvU2VydmljZS5lbmNyeXB0KFV0aWxzLm5ld0d1aWQoKSwgb3JnS2V5KTtcblxuICAgICAgICBjb25zdCBqc29uRG9jOiBhbnkgPSB7XG4gICAgICAgICAgICBlbmNyeXB0ZWQ6IHRydWUsXG4gICAgICAgICAgICBlbmNLZXlWYWxpZGF0aW9uX0RPX05PVF9FRElUOiBlbmNLZXlWYWxpZGF0aW9uLmVuY3J5cHRlZFN0cmluZyxcbiAgICAgICAgICAgIGNvbGxlY3Rpb25zOiBbXSxcbiAgICAgICAgICAgIGl0ZW1zOiBbXSxcbiAgICAgICAgfTtcblxuICAgICAgICBjb2xsZWN0aW9ucy5mb3JFYWNoKGMgPT4ge1xuICAgICAgICAgICAgY29uc3QgY29sbGVjdGlvbiA9IG5ldyBDb2xsZWN0aW9uRXhwb3J0KCk7XG4gICAgICAgICAgICBjb2xsZWN0aW9uLmJ1aWxkKGMpO1xuICAgICAgICAgICAganNvbkRvYy5jb2xsZWN0aW9ucy5wdXNoKGNvbGxlY3Rpb24pO1xuICAgICAgICB9KTtcblxuICAgICAgICBjaXBoZXJzLmZvckVhY2goYyA9PiB7XG4gICAgICAgICAgICBjb25zdCBjaXBoZXIgPSBuZXcgQ2lwaGVyRXhwb3J0KCk7XG4gICAgICAgICAgICBjaXBoZXIuYnVpbGQoYyk7XG4gICAgICAgICAgICBqc29uRG9jLml0ZW1zLnB1c2goY2lwaGVyKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShqc29uRG9jLCBudWxsLCAnICAnKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHBhZE51bWJlcihudW06IG51bWJlciwgd2lkdGg6IG51bWJlciwgcGFkQ2hhcmFjdGVyOiBzdHJpbmcgPSAnMCcpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBudW1TdHJpbmcgPSBudW0udG9TdHJpbmcoKTtcbiAgICAgICAgcmV0dXJuIG51bVN0cmluZy5sZW5ndGggPj0gd2lkdGggPyBudW1TdHJpbmcgOlxuICAgICAgICAgICAgbmV3IEFycmF5KHdpZHRoIC0gbnVtU3RyaW5nLmxlbmd0aCArIDEpLmpvaW4ocGFkQ2hhcmFjdGVyKSArIG51bVN0cmluZztcbiAgICB9XG5cbiAgICBwcml2YXRlIGJ1aWxkQ29tbW9uQ2lwaGVyKGNpcGhlcjogYW55LCBjOiBDaXBoZXJWaWV3KSB7XG4gICAgICAgIGNpcGhlci50eXBlID0gbnVsbDtcbiAgICAgICAgY2lwaGVyLm5hbWUgPSBjLm5hbWU7XG4gICAgICAgIGNpcGhlci5ub3RlcyA9IGMubm90ZXM7XG4gICAgICAgIGNpcGhlci5maWVsZHMgPSBudWxsO1xuICAgICAgICBjaXBoZXIucmVwcm9tcHQgPSBjLnJlcHJvbXB0O1xuICAgICAgICAvLyBMb2dpbiBwcm9wc1xuICAgICAgICBjaXBoZXIubG9naW5fdXJpID0gbnVsbDtcbiAgICAgICAgY2lwaGVyLmxvZ2luX3VzZXJuYW1lID0gbnVsbDtcbiAgICAgICAgY2lwaGVyLmxvZ2luX3Bhc3N3b3JkID0gbnVsbDtcbiAgICAgICAgY2lwaGVyLmxvZ2luX3RvdHAgPSBudWxsO1xuXG4gICAgICAgIGlmIChjLmZpZWxkcykge1xuICAgICAgICAgICAgYy5maWVsZHMuZm9yRWFjaCgoZjogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFjaXBoZXIuZmllbGRzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNpcGhlci5maWVsZHMgPSAnJztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjaXBoZXIuZmllbGRzICs9ICdcXG4nO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNpcGhlci5maWVsZHMgKz0gKChmLm5hbWUgfHwgJycpICsgJzogJyArIGYudmFsdWUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBzd2l0Y2ggKGMudHlwZSkge1xuICAgICAgICAgICAgY2FzZSBDaXBoZXJUeXBlLkxvZ2luOlxuICAgICAgICAgICAgICAgIGNpcGhlci50eXBlID0gJ2xvZ2luJztcbiAgICAgICAgICAgICAgICBjaXBoZXIubG9naW5fdXNlcm5hbWUgPSBjLmxvZ2luLnVzZXJuYW1lO1xuICAgICAgICAgICAgICAgIGNpcGhlci5sb2dpbl9wYXNzd29yZCA9IGMubG9naW4ucGFzc3dvcmQ7XG4gICAgICAgICAgICAgICAgY2lwaGVyLmxvZ2luX3RvdHAgPSBjLmxvZ2luLnRvdHA7XG5cbiAgICAgICAgICAgICAgICBpZiAoYy5sb2dpbi51cmlzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNpcGhlci5sb2dpbl91cmkgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgYy5sb2dpbi51cmlzLmZvckVhY2godSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjaXBoZXIubG9naW5fdXJpLnB1c2godS51cmkpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIENpcGhlclR5cGUuU2VjdXJlTm90ZTpcbiAgICAgICAgICAgICAgICBjaXBoZXIudHlwZSA9ICdub3RlJztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNpcGhlcjtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBBcGlTZXJ2aWNlIH0gZnJvbSAnLi4vYWJzdHJhY3Rpb25zL2FwaS5zZXJ2aWNlJztcbmltcG9ydCB7IEZpbGVVcGxvYWRTZXJ2aWNlIGFzIEZpbGVVcGxvYWRTZXJ2aWNlQWJzdHJhY3Rpb24gfSBmcm9tICcuLi9hYnN0cmFjdGlvbnMvZmlsZVVwbG9hZC5zZXJ2aWNlJztcbmltcG9ydCB7IExvZ1NlcnZpY2UgfSBmcm9tICcuLi9hYnN0cmFjdGlvbnMvbG9nLnNlcnZpY2UnO1xuXG5pbXBvcnQgeyBGaWxlVXBsb2FkVHlwZSB9IGZyb20gJy4uL2VudW1zL2ZpbGVVcGxvYWRUeXBlJztcblxuaW1wb3J0IHsgRW5jQXJyYXlCdWZmZXIgfSBmcm9tICcuLi9tb2RlbHMvZG9tYWluL2VuY0FycmF5QnVmZmVyJztcbmltcG9ydCB7IEVuY1N0cmluZyB9IGZyb20gJy4uL21vZGVscy9kb21haW4vZW5jU3RyaW5nJztcblxuaW1wb3J0IHsgQXR0YWNobWVudFVwbG9hZERhdGFSZXNwb25zZSB9IGZyb20gJy4uL21vZGVscy9yZXNwb25zZS9hdHRhY2htZW50VXBsb2FkRGF0YVJlc3BvbnNlJztcbmltcG9ydCB7IFNlbmRGaWxlVXBsb2FkRGF0YVJlc3BvbnNlIH0gZnJvbSAnLi4vbW9kZWxzL3Jlc3BvbnNlL3NlbmRGaWxlVXBsb2FkRGF0YVJlc3BvbnNlJztcblxuaW1wb3J0IHsgQXp1cmVGaWxlVXBsb2FkU2VydmljZSB9IGZyb20gJy4vYXp1cmVGaWxlVXBsb2FkLnNlcnZpY2UnO1xuaW1wb3J0IHsgQml0d2FyZGVuRmlsZVVwbG9hZFNlcnZpY2UgfSBmcm9tICcuL2JpdHdhcmRlbkZpbGVVcGxvYWQuc2VydmljZSc7XG5cbmV4cG9ydCBjbGFzcyBGaWxlVXBsb2FkU2VydmljZSBpbXBsZW1lbnRzIEZpbGVVcGxvYWRTZXJ2aWNlQWJzdHJhY3Rpb24ge1xuICAgIHByaXZhdGUgYXp1cmVGaWxlVXBsb2FkU2VydmljZTogQXp1cmVGaWxlVXBsb2FkU2VydmljZTtcbiAgICBwcml2YXRlIGJpdHdhcmRlbkZpbGVVcGxvYWRTZXJ2aWNlOiBCaXR3YXJkZW5GaWxlVXBsb2FkU2VydmljZTtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgbG9nU2VydmljZTogTG9nU2VydmljZSwgcHJpdmF0ZSBhcGlTZXJ2aWNlOiBBcGlTZXJ2aWNlKSB7XG4gICAgICAgIHRoaXMuYXp1cmVGaWxlVXBsb2FkU2VydmljZSA9IG5ldyBBenVyZUZpbGVVcGxvYWRTZXJ2aWNlKGxvZ1NlcnZpY2UpO1xuICAgICAgICB0aGlzLmJpdHdhcmRlbkZpbGVVcGxvYWRTZXJ2aWNlID0gbmV3IEJpdHdhcmRlbkZpbGVVcGxvYWRTZXJ2aWNlKGFwaVNlcnZpY2UpO1xuICAgIH1cblxuICAgIGFzeW5jIHVwbG9hZFNlbmRGaWxlKHVwbG9hZERhdGE6IFNlbmRGaWxlVXBsb2FkRGF0YVJlc3BvbnNlLCBmaWxlTmFtZTogRW5jU3RyaW5nLCBlbmNyeXB0ZWRGaWxlRGF0YTogRW5jQXJyYXlCdWZmZXIpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHN3aXRjaCAodXBsb2FkRGF0YS5maWxlVXBsb2FkVHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgRmlsZVVwbG9hZFR5cGUuRGlyZWN0OlxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmJpdHdhcmRlbkZpbGVVcGxvYWRTZXJ2aWNlLnVwbG9hZChmaWxlTmFtZS5lbmNyeXB0ZWRTdHJpbmcsIGVuY3J5cHRlZEZpbGVEYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgZmQgPT4gdGhpcy5hcGlTZXJ2aWNlLnBvc3RTZW5kRmlsZSh1cGxvYWREYXRhLnNlbmRSZXNwb25zZS5pZCwgdXBsb2FkRGF0YS5zZW5kUmVzcG9uc2UuZmlsZS5pZCwgZmQpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBGaWxlVXBsb2FkVHlwZS5BenVyZTpcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVuZXdhbENhbGxiYWNrID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVuZXdhbFJlc3BvbnNlID0gYXdhaXQgdGhpcy5hcGlTZXJ2aWNlLnJlbmV3U2VuZEZpbGVVcGxvYWRVcmwodXBsb2FkRGF0YS5zZW5kUmVzcG9uc2UuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBsb2FkRGF0YS5zZW5kUmVzcG9uc2UuZmlsZS5pZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVuZXdhbFJlc3BvbnNlLnVybDtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5henVyZUZpbGVVcGxvYWRTZXJ2aWNlLnVwbG9hZCh1cGxvYWREYXRhLnVybCwgZW5jcnlwdGVkRmlsZURhdGEsXG4gICAgICAgICAgICAgICAgICAgICAgICByZW5ld2FsQ2FsbGJhY2spO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gZmlsZSB1cGxvYWQgdHlwZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmFwaVNlcnZpY2UuZGVsZXRlU2VuZCh1cGxvYWREYXRhLnNlbmRSZXNwb25zZS5pZCk7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgdXBsb2FkQ2lwaGVyQXR0YWNobWVudChhZG1pbjogYm9vbGVhbiwgdXBsb2FkRGF0YTogQXR0YWNobWVudFVwbG9hZERhdGFSZXNwb25zZSwgZW5jcnlwdGVkRmlsZU5hbWU6IEVuY1N0cmluZyxcbiAgICAgICAgZW5jcnlwdGVkRmlsZURhdGE6IEVuY0FycmF5QnVmZmVyKSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYWRtaW4gPyB1cGxvYWREYXRhLmNpcGhlck1pbmlSZXNwb25zZSA6IHVwbG9hZERhdGEuY2lwaGVyUmVzcG9uc2U7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHVwbG9hZERhdGEuZmlsZVVwbG9hZFR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlIEZpbGVVcGxvYWRUeXBlLkRpcmVjdDpcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5iaXR3YXJkZW5GaWxlVXBsb2FkU2VydmljZS51cGxvYWQoZW5jcnlwdGVkRmlsZU5hbWUuZW5jcnlwdGVkU3RyaW5nLCBlbmNyeXB0ZWRGaWxlRGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZkID0+IHRoaXMuYXBpU2VydmljZS5wb3N0QXR0YWNobWVudEZpbGUocmVzcG9uc2UuaWQsIHVwbG9hZERhdGEuYXR0YWNobWVudElkLCBmZCkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIEZpbGVVcGxvYWRUeXBlLkF6dXJlOlxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZW5ld2FsQ2FsbGJhY2sgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZW5ld2FsUmVzcG9uc2UgPSBhd2FpdCB0aGlzLmFwaVNlcnZpY2UucmVuZXdBdHRhY2htZW50VXBsb2FkVXJsKHJlc3BvbnNlLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwbG9hZERhdGEuYXR0YWNobWVudElkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZW5ld2FsUmVzcG9uc2UudXJsO1xuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmF6dXJlRmlsZVVwbG9hZFNlcnZpY2UudXBsb2FkKHVwbG9hZERhdGEudXJsLCBlbmNyeXB0ZWRGaWxlRGF0YSwgcmVuZXdhbENhbGxiYWNrKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIGZpbGUgdXBsb2FkIHR5cGUuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGlmIChhZG1pbikge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuYXBpU2VydmljZS5kZWxldGVDaXBoZXJBdHRhY2htZW50QWRtaW4ocmVzcG9uc2UuaWQsIHVwbG9hZERhdGEuYXR0YWNobWVudElkKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5hcGlTZXJ2aWNlLmRlbGV0ZUNpcGhlckF0dGFjaG1lbnQocmVzcG9uc2UuaWQsIHVwbG9hZERhdGEuYXR0YWNobWVudElkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgeyBGb2xkZXJEYXRhIH0gZnJvbSAnLi4vbW9kZWxzL2RhdGEvZm9sZGVyRGF0YSc7XG5cbmltcG9ydCB7IEZvbGRlciB9IGZyb20gJy4uL21vZGVscy9kb21haW4vZm9sZGVyJztcbmltcG9ydCB7IFN5bW1ldHJpY0NyeXB0b0tleSB9IGZyb20gJy4uL21vZGVscy9kb21haW4vc3ltbWV0cmljQ3J5cHRvS2V5JztcbmltcG9ydCB7IFRyZWVOb2RlIH0gZnJvbSAnLi4vbW9kZWxzL2RvbWFpbi90cmVlTm9kZSc7XG5cbmltcG9ydCB7IEZvbGRlclJlcXVlc3QgfSBmcm9tICcuLi9tb2RlbHMvcmVxdWVzdC9mb2xkZXJSZXF1ZXN0JztcblxuaW1wb3J0IHsgRm9sZGVyUmVzcG9uc2UgfSBmcm9tICcuLi9tb2RlbHMvcmVzcG9uc2UvZm9sZGVyUmVzcG9uc2UnO1xuXG5pbXBvcnQgeyBGb2xkZXJWaWV3IH0gZnJvbSAnLi4vbW9kZWxzL3ZpZXcvZm9sZGVyVmlldyc7XG5cbmltcG9ydCB7IEFwaVNlcnZpY2UgfSBmcm9tICcuLi9hYnN0cmFjdGlvbnMvYXBpLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ2lwaGVyU2VydmljZSB9IGZyb20gJy4uL2Fic3RyYWN0aW9ucy9jaXBoZXIuc2VydmljZSc7XG5pbXBvcnQgeyBDcnlwdG9TZXJ2aWNlIH0gZnJvbSAnLi4vYWJzdHJhY3Rpb25zL2NyeXB0by5zZXJ2aWNlJztcbmltcG9ydCB7IEZvbGRlclNlcnZpY2UgYXMgRm9sZGVyU2VydmljZUFic3RyYWN0aW9uIH0gZnJvbSAnLi4vYWJzdHJhY3Rpb25zL2ZvbGRlci5zZXJ2aWNlJztcbmltcG9ydCB7IEkxOG5TZXJ2aWNlIH0gZnJvbSAnLi4vYWJzdHJhY3Rpb25zL2kxOG4uc2VydmljZSc7XG5pbXBvcnQgeyBTdG9yYWdlU2VydmljZSB9IGZyb20gJy4uL2Fic3RyYWN0aW9ucy9zdG9yYWdlLnNlcnZpY2UnO1xuaW1wb3J0IHsgVXNlclNlcnZpY2UgfSBmcm9tICcuLi9hYnN0cmFjdGlvbnMvdXNlci5zZXJ2aWNlJztcbmltcG9ydCB7IENpcGhlckRhdGEgfSBmcm9tICcuLi9tb2RlbHMvZGF0YS9jaXBoZXJEYXRhJztcblxuaW1wb3J0IHsgU2VydmljZVV0aWxzIH0gZnJvbSAnLi4vbWlzYy9zZXJ2aWNlVXRpbHMnO1xuaW1wb3J0IHsgVXRpbHMgfSBmcm9tICcuLi9taXNjL3V0aWxzJztcblxuY29uc3QgS2V5cyA9IHtcbiAgICBmb2xkZXJzUHJlZml4OiAnZm9sZGVyc18nLFxuICAgIGNpcGhlcnNQcmVmaXg6ICdjaXBoZXJzXycsXG59O1xuY29uc3QgTmVzdGluZ0RlbGltaXRlciA9ICcvJztcblxuZXhwb3J0IGNsYXNzIEZvbGRlclNlcnZpY2UgaW1wbGVtZW50cyBGb2xkZXJTZXJ2aWNlQWJzdHJhY3Rpb24ge1xuICAgIGRlY3J5cHRlZEZvbGRlckNhY2hlOiBGb2xkZXJWaWV3W107XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNyeXB0b1NlcnZpY2U6IENyeXB0b1NlcnZpY2UsIHByaXZhdGUgdXNlclNlcnZpY2U6IFVzZXJTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGFwaVNlcnZpY2U6IEFwaVNlcnZpY2UsIHByaXZhdGUgc3RvcmFnZVNlcnZpY2U6IFN0b3JhZ2VTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGkxOG5TZXJ2aWNlOiBJMThuU2VydmljZSwgcHJpdmF0ZSBjaXBoZXJTZXJ2aWNlOiBDaXBoZXJTZXJ2aWNlKSB7IH1cblxuICAgIGNsZWFyQ2FjaGUoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGVjcnlwdGVkRm9sZGVyQ2FjaGUgPSBudWxsO1xuICAgIH1cblxuICAgIGFzeW5jIGVuY3J5cHQobW9kZWw6IEZvbGRlclZpZXcsIGtleT86IFN5bW1ldHJpY0NyeXB0b0tleSk6IFByb21pc2U8Rm9sZGVyPiB7XG4gICAgICAgIGNvbnN0IGZvbGRlciA9IG5ldyBGb2xkZXIoKTtcbiAgICAgICAgZm9sZGVyLmlkID0gbW9kZWwuaWQ7XG4gICAgICAgIGZvbGRlci5uYW1lID0gYXdhaXQgdGhpcy5jcnlwdG9TZXJ2aWNlLmVuY3J5cHQobW9kZWwubmFtZSwga2V5KTtcbiAgICAgICAgcmV0dXJuIGZvbGRlcjtcbiAgICB9XG5cbiAgICBhc3luYyBnZXQoaWQ6IHN0cmluZyk6IFByb21pc2U8Rm9sZGVyPiB7XG4gICAgICAgIGNvbnN0IHVzZXJJZCA9IGF3YWl0IHRoaXMudXNlclNlcnZpY2UuZ2V0VXNlcklkKCk7XG4gICAgICAgIGNvbnN0IGZvbGRlcnMgPSBhd2FpdCB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldDx7IFtpZDogc3RyaW5nXTogRm9sZGVyRGF0YTsgfT4oXG4gICAgICAgICAgICBLZXlzLmZvbGRlcnNQcmVmaXggKyB1c2VySWQpO1xuICAgICAgICBpZiAoZm9sZGVycyA9PSBudWxsIHx8ICFmb2xkZXJzLmhhc093blByb3BlcnR5KGlkKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IEZvbGRlcihmb2xkZXJzW2lkXSk7XG4gICAgfVxuXG4gICAgYXN5bmMgZ2V0QWxsKCk6IFByb21pc2U8Rm9sZGVyW10+IHtcbiAgICAgICAgY29uc3QgdXNlcklkID0gYXdhaXQgdGhpcy51c2VyU2VydmljZS5nZXRVc2VySWQoKTtcbiAgICAgICAgY29uc3QgZm9sZGVycyA9IGF3YWl0IHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0PHsgW2lkOiBzdHJpbmddOiBGb2xkZXJEYXRhOyB9PihcbiAgICAgICAgICAgIEtleXMuZm9sZGVyc1ByZWZpeCArIHVzZXJJZCk7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlOiBGb2xkZXJbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGlkIGluIGZvbGRlcnMpIHtcbiAgICAgICAgICAgIGlmIChmb2xkZXJzLmhhc093blByb3BlcnR5KGlkKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlLnB1c2gobmV3IEZvbGRlcihmb2xkZXJzW2lkXSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICB9XG5cbiAgICBhc3luYyBnZXRBbGxEZWNyeXB0ZWQoKTogUHJvbWlzZTxGb2xkZXJWaWV3W10+IHtcbiAgICAgICAgaWYgKHRoaXMuZGVjcnlwdGVkRm9sZGVyQ2FjaGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGVjcnlwdGVkRm9sZGVyQ2FjaGU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBoYXNLZXkgPSBhd2FpdCB0aGlzLmNyeXB0b1NlcnZpY2UuaGFzS2V5KCk7XG4gICAgICAgIGlmICghaGFzS2V5KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGtleS4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRlY0ZvbGRlcnM6IEZvbGRlclZpZXdbXSA9IFtdO1xuICAgICAgICBjb25zdCBwcm9taXNlczogUHJvbWlzZTxhbnk+W10gPSBbXTtcbiAgICAgICAgY29uc3QgZm9sZGVycyA9IGF3YWl0IHRoaXMuZ2V0QWxsKCk7XG4gICAgICAgIGZvbGRlcnMuZm9yRWFjaChmb2xkZXIgPT4ge1xuICAgICAgICAgICAgcHJvbWlzZXMucHVzaChmb2xkZXIuZGVjcnlwdCgpLnRoZW4oZiA9PiBkZWNGb2xkZXJzLnB1c2goZikpKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICAgICAgICBkZWNGb2xkZXJzLnNvcnQoVXRpbHMuZ2V0U29ydEZ1bmN0aW9uKHRoaXMuaTE4blNlcnZpY2UsICduYW1lJykpO1xuXG4gICAgICAgIGNvbnN0IG5vbmVGb2xkZXIgPSBuZXcgRm9sZGVyVmlldygpO1xuICAgICAgICBub25lRm9sZGVyLm5hbWUgPSB0aGlzLmkxOG5TZXJ2aWNlLnQoJ25vbmVGb2xkZXInKTtcbiAgICAgICAgZGVjRm9sZGVycy5wdXNoKG5vbmVGb2xkZXIpO1xuXG4gICAgICAgIHRoaXMuZGVjcnlwdGVkRm9sZGVyQ2FjaGUgPSBkZWNGb2xkZXJzO1xuICAgICAgICByZXR1cm4gdGhpcy5kZWNyeXB0ZWRGb2xkZXJDYWNoZTtcbiAgICB9XG5cbiAgICBhc3luYyBnZXRBbGxOZXN0ZWQoKTogUHJvbWlzZTxUcmVlTm9kZTxGb2xkZXJWaWV3PltdPiB7XG4gICAgICAgIGNvbnN0IGZvbGRlcnMgPSBhd2FpdCB0aGlzLmdldEFsbERlY3J5cHRlZCgpO1xuICAgICAgICBjb25zdCBub2RlczogVHJlZU5vZGU8Rm9sZGVyVmlldz5bXSA9IFtdO1xuICAgICAgICBmb2xkZXJzLmZvckVhY2goZiA9PiB7XG4gICAgICAgICAgICBjb25zdCBmb2xkZXJDb3B5ID0gbmV3IEZvbGRlclZpZXcoKTtcbiAgICAgICAgICAgIGZvbGRlckNvcHkuaWQgPSBmLmlkO1xuICAgICAgICAgICAgZm9sZGVyQ29weS5yZXZpc2lvbkRhdGUgPSBmLnJldmlzaW9uRGF0ZTtcbiAgICAgICAgICAgIGNvbnN0IHBhcnRzID0gZi5uYW1lICE9IG51bGwgPyBmLm5hbWUucmVwbGFjZSgvXlxcLyt8XFwvKyQvZywgJycpLnNwbGl0KE5lc3RpbmdEZWxpbWl0ZXIpIDogW107XG4gICAgICAgICAgICBTZXJ2aWNlVXRpbHMubmVzdGVkVHJhdmVyc2Uobm9kZXMsIDAsIHBhcnRzLCBmb2xkZXJDb3B5LCBudWxsLCBOZXN0aW5nRGVsaW1pdGVyKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBub2RlcztcbiAgICB9XG5cbiAgICBhc3luYyBnZXROZXN0ZWQoaWQ6IHN0cmluZyk6IFByb21pc2U8VHJlZU5vZGU8Rm9sZGVyVmlldz4+IHtcbiAgICAgICAgY29uc3QgZm9sZGVycyA9IGF3YWl0IHRoaXMuZ2V0QWxsTmVzdGVkKCk7XG4gICAgICAgIHJldHVybiBTZXJ2aWNlVXRpbHMuZ2V0VHJlZU5vZGVPYmplY3QoZm9sZGVycywgaWQpIGFzIFRyZWVOb2RlPEZvbGRlclZpZXc+O1xuICAgIH1cblxuICAgIGFzeW5jIHNhdmVXaXRoU2VydmVyKGZvbGRlcjogRm9sZGVyKTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IG5ldyBGb2xkZXJSZXF1ZXN0KGZvbGRlcik7XG5cbiAgICAgICAgbGV0IHJlc3BvbnNlOiBGb2xkZXJSZXNwb25zZTtcbiAgICAgICAgaWYgKGZvbGRlci5pZCA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXNwb25zZSA9IGF3YWl0IHRoaXMuYXBpU2VydmljZS5wb3N0Rm9sZGVyKHJlcXVlc3QpO1xuICAgICAgICAgICAgZm9sZGVyLmlkID0gcmVzcG9uc2UuaWQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXNwb25zZSA9IGF3YWl0IHRoaXMuYXBpU2VydmljZS5wdXRGb2xkZXIoZm9sZGVyLmlkLCByZXF1ZXN0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHVzZXJJZCA9IGF3YWl0IHRoaXMudXNlclNlcnZpY2UuZ2V0VXNlcklkKCk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBuZXcgRm9sZGVyRGF0YShyZXNwb25zZSwgdXNlcklkKTtcbiAgICAgICAgYXdhaXQgdGhpcy51cHNlcnQoZGF0YSk7XG4gICAgfVxuXG4gICAgYXN5bmMgdXBzZXJ0KGZvbGRlcjogRm9sZGVyRGF0YSB8IEZvbGRlckRhdGFbXSk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIGNvbnN0IHVzZXJJZCA9IGF3YWl0IHRoaXMudXNlclNlcnZpY2UuZ2V0VXNlcklkKCk7XG4gICAgICAgIGxldCBmb2xkZXJzID0gYXdhaXQgdGhpcy5zdG9yYWdlU2VydmljZS5nZXQ8eyBbaWQ6IHN0cmluZ106IEZvbGRlckRhdGE7IH0+KFxuICAgICAgICAgICAgS2V5cy5mb2xkZXJzUHJlZml4ICsgdXNlcklkKTtcbiAgICAgICAgaWYgKGZvbGRlcnMgPT0gbnVsbCkge1xuICAgICAgICAgICAgZm9sZGVycyA9IHt9O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZvbGRlciBpbnN0YW5jZW9mIEZvbGRlckRhdGEpIHtcbiAgICAgICAgICAgIGNvbnN0IGYgPSBmb2xkZXIgYXMgRm9sZGVyRGF0YTtcbiAgICAgICAgICAgIGZvbGRlcnNbZi5pZF0gPSBmO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgKGZvbGRlciBhcyBGb2xkZXJEYXRhW10pLmZvckVhY2goZiA9PiB7XG4gICAgICAgICAgICAgICAgZm9sZGVyc1tmLmlkXSA9IGY7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2F2ZShLZXlzLmZvbGRlcnNQcmVmaXggKyB1c2VySWQsIGZvbGRlcnMpO1xuICAgICAgICB0aGlzLmRlY3J5cHRlZEZvbGRlckNhY2hlID0gbnVsbDtcbiAgICB9XG5cbiAgICBhc3luYyByZXBsYWNlKGZvbGRlcnM6IHsgW2lkOiBzdHJpbmddOiBGb2xkZXJEYXRhOyB9KTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgY29uc3QgdXNlcklkID0gYXdhaXQgdGhpcy51c2VyU2VydmljZS5nZXRVc2VySWQoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5zdG9yYWdlU2VydmljZS5zYXZlKEtleXMuZm9sZGVyc1ByZWZpeCArIHVzZXJJZCwgZm9sZGVycyk7XG4gICAgICAgIHRoaXMuZGVjcnlwdGVkRm9sZGVyQ2FjaGUgPSBudWxsO1xuICAgIH1cblxuICAgIGFzeW5jIGNsZWFyKHVzZXJJZDogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5zdG9yYWdlU2VydmljZS5yZW1vdmUoS2V5cy5mb2xkZXJzUHJlZml4ICsgdXNlcklkKTtcbiAgICAgICAgdGhpcy5kZWNyeXB0ZWRGb2xkZXJDYWNoZSA9IG51bGw7XG4gICAgfVxuXG4gICAgYXN5bmMgZGVsZXRlKGlkOiBzdHJpbmcgfCBzdHJpbmdbXSk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIGNvbnN0IHVzZXJJZCA9IGF3YWl0IHRoaXMudXNlclNlcnZpY2UuZ2V0VXNlcklkKCk7XG4gICAgICAgIGNvbnN0IGZvbGRlcnMgPSBhd2FpdCB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldDx7IFtpZDogc3RyaW5nXTogRm9sZGVyRGF0YTsgfT4oXG4gICAgICAgICAgICBLZXlzLmZvbGRlcnNQcmVmaXggKyB1c2VySWQpO1xuICAgICAgICBpZiAoZm9sZGVycyA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGlkID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgaWYgKGZvbGRlcnNbaWRdID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWxldGUgZm9sZGVyc1tpZF07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAoaWQgYXMgc3RyaW5nW10pLmZvckVhY2goaSA9PiB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIGZvbGRlcnNbaV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2F2ZShLZXlzLmZvbGRlcnNQcmVmaXggKyB1c2VySWQsIGZvbGRlcnMpO1xuICAgICAgICB0aGlzLmRlY3J5cHRlZEZvbGRlckNhY2hlID0gbnVsbDtcblxuICAgICAgICAvLyBJdGVtcyBpbiBhIGRlbGV0ZWQgZm9sZGVyIGFyZSByZS1hc3NpZ25lZCB0byBcIk5vIEZvbGRlclwiXG4gICAgICAgIGNvbnN0IGNpcGhlcnMgPSBhd2FpdCB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldDx7IFtpZDogc3RyaW5nXTogQ2lwaGVyRGF0YTsgfT4oS2V5cy5jaXBoZXJzUHJlZml4ICsgdXNlcklkKTtcbiAgICAgICAgaWYgKGNpcGhlcnMgIT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgdXBkYXRlczogQ2lwaGVyRGF0YVtdID0gW107XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNJZCBpbiBjaXBoZXJzKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNpcGhlcnNbY0lkXS5mb2xkZXJJZCA9PT0gaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY2lwaGVyc1tjSWRdLmZvbGRlcklkID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlcy5wdXNoKGNpcGhlcnNbY0lkXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHVwZGF0ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2lwaGVyU2VydmljZS51cHNlcnQodXBkYXRlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBkZWxldGVXaXRoU2VydmVyKGlkOiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICBhd2FpdCB0aGlzLmFwaVNlcnZpY2UuZGVsZXRlRm9sZGVyKGlkKTtcbiAgICAgICAgYXdhaXQgdGhpcy5kZWxldGUoaWQpO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IEkxOG5TZXJ2aWNlIGFzIEkxOG5TZXJ2aWNlQWJzdHJhY3Rpb24gfSBmcm9tICcuLi9hYnN0cmFjdGlvbnMvaTE4bi5zZXJ2aWNlJztcblxuZXhwb3J0IGNsYXNzIEkxOG5TZXJ2aWNlIGltcGxlbWVudHMgSTE4blNlcnZpY2VBYnN0cmFjdGlvbiB7XG4gICAgbG9jYWxlOiBzdHJpbmc7XG4gICAgLy8gRmlyc3QgbG9jYWxlIGlzIHRoZSBkZWZhdWx0IChFbmdsaXNoKVxuICAgIHN1cHBvcnRlZFRyYW5zbGF0aW9uTG9jYWxlczogc3RyaW5nW10gPSBbJ2VuJ107XG4gICAgdHJhbnNsYXRpb25Mb2NhbGU6IHN0cmluZztcbiAgICBjb2xsYXRvcjogSW50bC5Db2xsYXRvcjtcbiAgICBsb2NhbGVOYW1lcyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KFtcbiAgICAgICAgWydhZicsICdBZnJpa2FhbnMnXSxcbiAgICAgICAgWydheicsICdBesmZcmJheWNhbmNhJ10sXG4gICAgICAgIFsnYmUnLCAn0JHQtdC70LDRgNGD0YHQutCw0Y8nXSxcbiAgICAgICAgWydiZycsICfQsdGK0LvQs9Cw0YDRgdC60LgnXSxcbiAgICAgICAgWydjYScsICdjYXRhbMOgJ10sXG4gICAgICAgIFsnY3MnLCAnxI1lxaF0aW5hJ10sXG4gICAgICAgIFsnZGEnLCAnZGFuc2snXSxcbiAgICAgICAgWydkZScsICdEZXV0c2NoJ10sXG4gICAgICAgIFsnZWwnLCAnzpXOu867zrfOvc65zrrOrCddLFxuICAgICAgICBbJ2VuJywgJ0VuZ2xpc2gnXSxcbiAgICAgICAgWydlbi1HQicsICdFbmdsaXNoIChCcml0aXNoKSddLFxuICAgICAgICBbJ2VvJywgJ0VzcGVyYW50byddLFxuICAgICAgICBbJ2VzJywgJ2VzcGHDsW9sJ10sXG4gICAgICAgIFsnZXQnLCAnZWVzdGknXSxcbiAgICAgICAgWydmYScsICfZgdin2LHYs9uMJ10sXG4gICAgICAgIFsnZmknLCAnc3VvbWknXSxcbiAgICAgICAgWydmcicsICdmcmFuw6dhaXMnXSxcbiAgICAgICAgWydoZScsICfXoteR16jXmdeqJ10sXG4gICAgICAgIFsnaGknLCAn4KS54KS/4KSo4KWN4KSm4KWAJ10sXG4gICAgICAgIFsnaHInLCAnaHJ2YXRza2knXSxcbiAgICAgICAgWydodScsICdtYWd5YXInXSxcbiAgICAgICAgWydpZCcsICdCYWhhc2EgSW5kb25lc2lhJ10sXG4gICAgICAgIFsnaXQnLCAnaXRhbGlhbm8nXSxcbiAgICAgICAgWydqYScsICfml6XmnKzoqp4nXSxcbiAgICAgICAgWydrbycsICftlZzqta3slrQnXSxcbiAgICAgICAgWydsdicsICdMYXR2aWV0aXMnXSxcbiAgICAgICAgWydtbCcsICfgtK7gtLLgtK/gtL7gtLPgtIInXSxcbiAgICAgICAgWyduYicsICdub3JzayAoYm9rbcOlbCknXSxcbiAgICAgICAgWydubCcsICdOZWRlcmxhbmRzJ10sXG4gICAgICAgIFsncGwnLCAncG9sc2tpJ10sXG4gICAgICAgIFsncHQtQlInLCAncG9ydHVndcOqcyBkbyBCcmFzaWwnXSxcbiAgICAgICAgWydwdC1QVCcsICdwb3J0dWd1w6pzJ10sXG4gICAgICAgIFsncm8nLCAncm9tw6JuxIMnXSxcbiAgICAgICAgWydydScsICfRgNGD0YHRgdC60LjQuSddLFxuICAgICAgICBbJ3NrJywgJ3Nsb3ZlbsSNaW5hJ10sXG4gICAgICAgIFsnc3InLCAn0KHRgNC/0YHQutC4J10sXG4gICAgICAgIFsnc3YnLCAnc3ZlbnNrYSddLFxuICAgICAgICBbJ3RoJywgJ+C5hOC4l+C4oiddLFxuICAgICAgICBbJ3RyJywgJ1TDvHJrw6dlJ10sXG4gICAgICAgIFsndWsnLCAn0YPQutGA0LDRl9C90YHRjNC60LAnXSxcbiAgICAgICAgWyd2aScsICdUaeG6v25nIFZp4buHdCddLFxuICAgICAgICBbJ3poLUNOJywgJ+S4reaWh++8iOS4reWbveWkp+mZhu+8iSddLFxuICAgICAgICBbJ3poLVRXJywgJ+S4reaWh++8iOWPsOeBo++8iSddLFxuICAgIF0pO1xuXG4gICAgcHJvdGVjdGVkIGluaXRlZDogYm9vbGVhbjtcbiAgICBwcm90ZWN0ZWQgZGVmYXVsdE1lc3NhZ2VzOiBhbnkgPSB7fTtcbiAgICBwcm90ZWN0ZWQgbG9jYWxlTWVzc2FnZXM6IGFueSA9IHt9O1xuXG4gICAgY29uc3RydWN0b3IocHJvdGVjdGVkIHN5c3RlbUxhbmd1YWdlOiBzdHJpbmcsIHByb3RlY3RlZCBsb2NhbGVzRGlyZWN0b3J5OiBzdHJpbmcsXG4gICAgICAgIHByb3RlY3RlZCBnZXRMb2NhbGVzSnNvbjogKGZvcm1hdHRlZExvY2FsZTogc3RyaW5nKSA9PiBQcm9taXNlPGFueT4pIHtcbiAgICAgICAgdGhpcy5zeXN0ZW1MYW5ndWFnZSA9IHN5c3RlbUxhbmd1YWdlLnJlcGxhY2UoJ18nLCAnLScpO1xuICAgIH1cblxuICAgIGFzeW5jIGluaXQobG9jYWxlPzogc3RyaW5nKSB7XG4gICAgICAgIGlmICh0aGlzLmluaXRlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpMThuIGFscmVhZHkgaW5pdGlhbGl6ZWQuJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuc3VwcG9ydGVkVHJhbnNsYXRpb25Mb2NhbGVzID09IG51bGwgfHwgdGhpcy5zdXBwb3J0ZWRUcmFuc2xhdGlvbkxvY2FsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3N1cHBvcnRlZFRyYW5zbGF0aW9uTG9jYWxlcyBub3Qgc2V0LicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pbml0ZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLmxvY2FsZSA9IHRoaXMudHJhbnNsYXRpb25Mb2NhbGUgPSBsb2NhbGUgIT0gbnVsbCA/IGxvY2FsZSA6IHRoaXMuc3lzdGVtTGFuZ3VhZ2U7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuY29sbGF0b3IgPSBuZXcgSW50bC5Db2xsYXRvcih0aGlzLmxvY2FsZSwgeyBudW1lcmljOiB0cnVlLCBzZW5zaXRpdml0eTogJ2Jhc2UnIH0pO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIHRoaXMuY29sbGF0b3IgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuc3VwcG9ydGVkVHJhbnNsYXRpb25Mb2NhbGVzLmluZGV4T2YodGhpcy50cmFuc2xhdGlvbkxvY2FsZSkgPT09IC0xKSB7XG4gICAgICAgICAgICB0aGlzLnRyYW5zbGF0aW9uTG9jYWxlID0gdGhpcy50cmFuc2xhdGlvbkxvY2FsZS5zbGljZSgwLCAyKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuc3VwcG9ydGVkVHJhbnNsYXRpb25Mb2NhbGVzLmluZGV4T2YodGhpcy50cmFuc2xhdGlvbkxvY2FsZSkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50cmFuc2xhdGlvbkxvY2FsZSA9IHRoaXMuc3VwcG9ydGVkVHJhbnNsYXRpb25Mb2NhbGVzWzBdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMubG9jYWxlc0RpcmVjdG9yeSAhPSBudWxsKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmxvYWRNZXNzYWdlcyh0aGlzLnRyYW5zbGF0aW9uTG9jYWxlLCB0aGlzLmxvY2FsZU1lc3NhZ2VzKTtcbiAgICAgICAgICAgIGlmICh0aGlzLnRyYW5zbGF0aW9uTG9jYWxlICE9PSB0aGlzLnN1cHBvcnRlZFRyYW5zbGF0aW9uTG9jYWxlc1swXSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMubG9hZE1lc3NhZ2VzKHRoaXMuc3VwcG9ydGVkVHJhbnNsYXRpb25Mb2NhbGVzWzBdLCB0aGlzLmRlZmF1bHRNZXNzYWdlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0KGlkOiBzdHJpbmcsIHAxPzogc3RyaW5nLCBwMj86IHN0cmluZywgcDM/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy50cmFuc2xhdGUoaWQsIHAxLCBwMiwgcDMpO1xuICAgIH1cblxuICAgIHRyYW5zbGF0ZShpZDogc3RyaW5nLCBwMT86IHN0cmluZywgcDI/OiBzdHJpbmcsIHAzPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IHJlc3VsdDogc3RyaW5nO1xuICAgICAgICBpZiAodGhpcy5sb2NhbGVNZXNzYWdlcy5oYXNPd25Qcm9wZXJ0eShpZCkgJiYgdGhpcy5sb2NhbGVNZXNzYWdlc1tpZF0pIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMubG9jYWxlTWVzc2FnZXNbaWRdO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZGVmYXVsdE1lc3NhZ2VzLmhhc093blByb3BlcnR5KGlkKSAmJiB0aGlzLmRlZmF1bHRNZXNzYWdlc1tpZF0pIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMuZGVmYXVsdE1lc3NhZ2VzW2lkXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc3VsdCA9ICcnO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlc3VsdCAhPT0gJycpIHtcbiAgICAgICAgICAgIGlmIChwMSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnNwbGl0KCdfXyQxX18nKS5qb2luKHAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwMiAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnNwbGl0KCdfXyQyX18nKS5qb2luKHAyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwMyAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnNwbGl0KCdfXyQzX18nKS5qb2luKHAzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBsb2FkTWVzc2FnZXMobG9jYWxlOiBzdHJpbmcsIG1lc3NhZ2VzT2JqOiBhbnkpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICBjb25zdCBmb3JtYXR0ZWRMb2NhbGUgPSBsb2NhbGUucmVwbGFjZSgnLScsICdfJyk7XG4gICAgICAgIGNvbnN0IGxvY2FsZXMgPSBhd2FpdCB0aGlzLmdldExvY2FsZXNKc29uKGZvcm1hdHRlZExvY2FsZSk7XG4gICAgICAgIGZvciAoY29uc3QgcHJvcCBpbiBsb2NhbGVzKSB7XG4gICAgICAgICAgICBpZiAoIWxvY2FsZXMuaGFzT3duUHJvcGVydHkocHJvcCkpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG1lc3NhZ2VzT2JqW3Byb3BdID0gbG9jYWxlc1twcm9wXS5tZXNzYWdlO1xuXG4gICAgICAgICAgICBpZiAobG9jYWxlc1twcm9wXS5wbGFjZWhvbGRlcnMpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHBsYWNlUHJvcCBpbiBsb2NhbGVzW3Byb3BdLnBsYWNlaG9sZGVycykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWxvY2FsZXNbcHJvcF0ucGxhY2Vob2xkZXJzLmhhc093blByb3BlcnR5KHBsYWNlUHJvcCkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICFsb2NhbGVzW3Byb3BdLnBsYWNlaG9sZGVyc1twbGFjZVByb3BdLmNvbnRlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVwbGFjZVRva2VuID0gJ1xcXFwkJyArIHBsYWNlUHJvcC50b1VwcGVyQ2FzZSgpICsgJ1xcXFwkJztcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlcGxhY2VDb250ZW50ID0gbG9jYWxlc1twcm9wXS5wbGFjZWhvbGRlcnNbcGxhY2VQcm9wXS5jb250ZW50O1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVwbGFjZUNvbnRlbnQgPT09ICckMScgfHwgcmVwbGFjZUNvbnRlbnQgPT09ICckMicgfHwgcmVwbGFjZUNvbnRlbnQgPT09ICckMycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VDb250ZW50ID0gJ19fJCcgKyByZXBsYWNlQ29udGVudCArICdfXyc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXNPYmpbcHJvcF0gPSBtZXNzYWdlc09ialtwcm9wXS5yZXBsYWNlKG5ldyBSZWdFeHAocmVwbGFjZVRva2VuLCAnZycpLCByZXBsYWNlQ29udGVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG59XG4iLCJpbXBvcnQgKiBhcyBzaWduYWxSIGZyb20gJ0BtaWNyb3NvZnQvc2lnbmFscic7XG5pbXBvcnQgKiBhcyBzaWduYWxSTXNnUGFjayBmcm9tICdAbWljcm9zb2Z0L3NpZ25hbHItcHJvdG9jb2wtbXNncGFjayc7XG5cbmltcG9ydCB7IE5vdGlmaWNhdGlvblR5cGUgfSBmcm9tICcuLi9lbnVtcy9ub3RpZmljYXRpb25UeXBlJztcblxuaW1wb3J0IHsgQXBpU2VydmljZSB9IGZyb20gJy4uL2Fic3RyYWN0aW9ucy9hcGkuc2VydmljZSc7XG5pbXBvcnQgeyBBcHBJZFNlcnZpY2UgfSBmcm9tICcuLi9hYnN0cmFjdGlvbnMvYXBwSWQuc2VydmljZSc7XG5pbXBvcnQgeyBFbnZpcm9ubWVudFNlcnZpY2UgfSBmcm9tICcuLi9hYnN0cmFjdGlvbnMvZW52aXJvbm1lbnQuc2VydmljZSc7XG5pbXBvcnQgeyBMb2dTZXJ2aWNlIH0gZnJvbSAnLi4vYWJzdHJhY3Rpb25zL2xvZy5zZXJ2aWNlJztcbmltcG9ydCB7IE5vdGlmaWNhdGlvbnNTZXJ2aWNlIGFzIE5vdGlmaWNhdGlvbnNTZXJ2aWNlQWJzdHJhY3Rpb24gfSBmcm9tICcuLi9hYnN0cmFjdGlvbnMvbm90aWZpY2F0aW9ucy5zZXJ2aWNlJztcbmltcG9ydCB7IFN5bmNTZXJ2aWNlIH0gZnJvbSAnLi4vYWJzdHJhY3Rpb25zL3N5bmMuc2VydmljZSc7XG5pbXBvcnQgeyBVc2VyU2VydmljZSB9IGZyb20gJy4uL2Fic3RyYWN0aW9ucy91c2VyLnNlcnZpY2UnO1xuaW1wb3J0IHsgVmF1bHRUaW1lb3V0U2VydmljZSB9IGZyb20gJy4uL2Fic3RyYWN0aW9ucy92YXVsdFRpbWVvdXQuc2VydmljZSc7XG5cbmltcG9ydCB7XG4gICAgTm90aWZpY2F0aW9uUmVzcG9uc2UsXG4gICAgU3luY0NpcGhlck5vdGlmaWNhdGlvbixcbiAgICBTeW5jRm9sZGVyTm90aWZpY2F0aW9uLFxuICAgIFN5bmNTZW5kTm90aWZpY2F0aW9uLFxufSBmcm9tICcuLi9tb2RlbHMvcmVzcG9uc2Uvbm90aWZpY2F0aW9uUmVzcG9uc2UnO1xuXG5leHBvcnQgY2xhc3MgTm90aWZpY2F0aW9uc1NlcnZpY2UgaW1wbGVtZW50cyBOb3RpZmljYXRpb25zU2VydmljZUFic3RyYWN0aW9uIHtcbiAgICBwcml2YXRlIHNpZ25hbHJDb25uZWN0aW9uOiBzaWduYWxSLkh1YkNvbm5lY3Rpb247XG4gICAgcHJpdmF0ZSB1cmw6IHN0cmluZztcbiAgICBwcml2YXRlIGNvbm5lY3RlZCA9IGZhbHNlO1xuICAgIHByaXZhdGUgaW5pdGVkID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBpbmFjdGl2ZSA9IGZhbHNlO1xuICAgIHByaXZhdGUgcmVjb25uZWN0VGltZXI6IGFueSA9IG51bGw7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHVzZXJTZXJ2aWNlOiBVc2VyU2VydmljZSwgcHJpdmF0ZSBzeW5jU2VydmljZTogU3luY1NlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgYXBwSWRTZXJ2aWNlOiBBcHBJZFNlcnZpY2UsIHByaXZhdGUgYXBpU2VydmljZTogQXBpU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSB2YXVsdFRpbWVvdXRTZXJ2aWNlOiBWYXVsdFRpbWVvdXRTZXJ2aWNlLCBwcml2YXRlIGVudmlyb25tZW50U2VydmljZTogRW52aXJvbm1lbnRTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGxvZ291dENhbGxiYWNrOiAoKSA9PiBQcm9taXNlPHZvaWQ+LCBwcml2YXRlIGxvZ1NlcnZpY2U6IExvZ1NlcnZpY2UpIHtcbiAgICAgICAgdGhpcy5lbnZpcm9ubWVudFNlcnZpY2UudXJscy5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmluaXRlZCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5pbml0KCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGFzeW5jIGluaXQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMuaW5pdGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMudXJsID0gdGhpcy5lbnZpcm9ubWVudFNlcnZpY2UuZ2V0Tm90aWZpY2F0aW9uc1VybCgpO1xuXG4gICAgICAgIC8vIFNldCBub3RpZmljYXRpb25zIHNlcnZlciBVUkwgdG8gYGh0dHBzOi8vLWAgdG8gZWZmZWN0aXZlbHkgZGlzYWJsZSBjb21tdW5pY2F0aW9uXG4gICAgICAgIC8vIHdpdGggdGhlIG5vdGlmaWNhdGlvbnMgc2VydmVyIGZyb20gdGhlIGNsaWVudCBhcHBcbiAgICAgICAgaWYgKHRoaXMudXJsID09PSAnaHR0cHM6Ly8tJykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuc2lnbmFsckNvbm5lY3Rpb24gIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5zaWduYWxyQ29ubmVjdGlvbi5vZmYoJ1JlY2VpdmVNZXNzYWdlJyk7XG4gICAgICAgICAgICB0aGlzLnNpZ25hbHJDb25uZWN0aW9uLm9mZignSGVhcnRiZWF0Jyk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNpZ25hbHJDb25uZWN0aW9uLnN0b3AoKTtcbiAgICAgICAgICAgIHRoaXMuY29ubmVjdGVkID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLnNpZ25hbHJDb25uZWN0aW9uID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2lnbmFsckNvbm5lY3Rpb24gPSBuZXcgc2lnbmFsUi5IdWJDb25uZWN0aW9uQnVpbGRlcigpXG4gICAgICAgICAgICAud2l0aFVybCh0aGlzLnVybCArICcvaHViJywge1xuICAgICAgICAgICAgICAgIGFjY2Vzc1Rva2VuRmFjdG9yeTogKCkgPT4gdGhpcy5hcGlTZXJ2aWNlLmdldEFjdGl2ZUJlYXJlclRva2VuKCksXG4gICAgICAgICAgICAgICAgc2tpcE5lZ290aWF0aW9uOiB0cnVlLFxuICAgICAgICAgICAgICAgIHRyYW5zcG9ydDogc2lnbmFsUi5IdHRwVHJhbnNwb3J0VHlwZS5XZWJTb2NrZXRzLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC53aXRoSHViUHJvdG9jb2wobmV3IHNpZ25hbFJNc2dQYWNrLk1lc3NhZ2VQYWNrSHViUHJvdG9jb2woKSBhcyBzaWduYWxSLklIdWJQcm90b2NvbClcbiAgICAgICAgICAgIC8vIC5jb25maWd1cmVMb2dnaW5nKHNpZ25hbFIuTG9nTGV2ZWwuVHJhY2UpXG4gICAgICAgICAgICAuYnVpbGQoKTtcblxuICAgICAgICB0aGlzLnNpZ25hbHJDb25uZWN0aW9uLm9uKCdSZWNlaXZlTWVzc2FnZScsXG4gICAgICAgICAgICAoZGF0YTogYW55KSA9PiB0aGlzLnByb2Nlc3NOb3RpZmljYXRpb24obmV3IE5vdGlmaWNhdGlvblJlc3BvbnNlKGRhdGEpKSk7XG4gICAgICAgIHRoaXMuc2lnbmFsckNvbm5lY3Rpb24ub24oJ0hlYXJ0YmVhdCcsXG4gICAgICAgICAgICAoZGF0YTogYW55KSA9PiB7IC8qY29uc29sZS5sb2coJ0hlYXJ0YmVhdCEnKTsqLyB9KTtcbiAgICAgICAgdGhpcy5zaWduYWxyQ29ubmVjdGlvbi5vbmNsb3NlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY29ubmVjdGVkID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLnJlY29ubmVjdCh0cnVlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuaW5pdGVkID0gdHJ1ZTtcbiAgICAgICAgaWYgKGF3YWl0IHRoaXMuaXNBdXRoZWRBbmRVbmxvY2tlZCgpKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnJlY29ubmVjdChmYWxzZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyB1cGRhdGVDb25uZWN0aW9uKHN5bmMgPSBmYWxzZSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAoIXRoaXMuaW5pdGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChhd2FpdCB0aGlzLmlzQXV0aGVkQW5kVW5sb2NrZWQoKSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucmVjb25uZWN0KHN5bmMpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnNpZ25hbHJDb25uZWN0aW9uLnN0b3AoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5sb2dTZXJ2aWNlLmVycm9yKGUudG9TdHJpbmcoKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyByZWNvbm5lY3RGcm9tQWN0aXZpdHkoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMuaW5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMuaW5pdGVkICYmICF0aGlzLmNvbm5lY3RlZCkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5yZWNvbm5lY3QodHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBkaXNjb25uZWN0RnJvbUluYWN0aXZpdHkoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMuaW5hY3RpdmUgPSB0cnVlO1xuICAgICAgICBpZiAodGhpcy5pbml0ZWQgJiYgdGhpcy5jb25uZWN0ZWQpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc2lnbmFsckNvbm5lY3Rpb24uc3RvcCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBwcm9jZXNzTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbjogTm90aWZpY2F0aW9uUmVzcG9uc2UpIHtcbiAgICAgICAgY29uc3QgYXBwSWQgPSBhd2FpdCB0aGlzLmFwcElkU2VydmljZS5nZXRBcHBJZCgpO1xuICAgICAgICBpZiAobm90aWZpY2F0aW9uID09IG51bGwgfHwgbm90aWZpY2F0aW9uLmNvbnRleHRJZCA9PT0gYXBwSWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGlzQXV0aGVudGljYXRlZCA9IGF3YWl0IHRoaXMudXNlclNlcnZpY2UuaXNBdXRoZW50aWNhdGVkKCk7XG4gICAgICAgIGNvbnN0IHBheWxvYWRVc2VySWQgPSBub3RpZmljYXRpb24ucGF5bG9hZC51c2VySWQgfHwgbm90aWZpY2F0aW9uLnBheWxvYWQuVXNlcklkO1xuICAgICAgICBjb25zdCBteVVzZXJJZCA9IGF3YWl0IHRoaXMudXNlclNlcnZpY2UuZ2V0VXNlcklkKCk7XG4gICAgICAgIGlmIChpc0F1dGhlbnRpY2F0ZWQgJiYgcGF5bG9hZFVzZXJJZCAhPSBudWxsICYmIHBheWxvYWRVc2VySWQgIT09IG15VXNlcklkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBzd2l0Y2ggKG5vdGlmaWNhdGlvbi50eXBlKSB7XG4gICAgICAgICAgICBjYXNlIE5vdGlmaWNhdGlvblR5cGUuU3luY0NpcGhlckNyZWF0ZTpcbiAgICAgICAgICAgIGNhc2UgTm90aWZpY2F0aW9uVHlwZS5TeW5jQ2lwaGVyVXBkYXRlOlxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc3luY1NlcnZpY2Uuc3luY1Vwc2VydENpcGhlcihub3RpZmljYXRpb24ucGF5bG9hZCBhcyBTeW5jQ2lwaGVyTm90aWZpY2F0aW9uLFxuICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb24udHlwZSA9PT0gTm90aWZpY2F0aW9uVHlwZS5TeW5jQ2lwaGVyVXBkYXRlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgTm90aWZpY2F0aW9uVHlwZS5TeW5jQ2lwaGVyRGVsZXRlOlxuICAgICAgICAgICAgY2FzZSBOb3RpZmljYXRpb25UeXBlLlN5bmNMb2dpbkRlbGV0ZTpcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnN5bmNTZXJ2aWNlLnN5bmNEZWxldGVDaXBoZXIobm90aWZpY2F0aW9uLnBheWxvYWQgYXMgU3luY0NpcGhlck5vdGlmaWNhdGlvbik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIE5vdGlmaWNhdGlvblR5cGUuU3luY0ZvbGRlckNyZWF0ZTpcbiAgICAgICAgICAgIGNhc2UgTm90aWZpY2F0aW9uVHlwZS5TeW5jRm9sZGVyVXBkYXRlOlxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc3luY1NlcnZpY2Uuc3luY1Vwc2VydEZvbGRlcihub3RpZmljYXRpb24ucGF5bG9hZCBhcyBTeW5jRm9sZGVyTm90aWZpY2F0aW9uLFxuICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb24udHlwZSA9PT0gTm90aWZpY2F0aW9uVHlwZS5TeW5jRm9sZGVyVXBkYXRlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgTm90aWZpY2F0aW9uVHlwZS5TeW5jRm9sZGVyRGVsZXRlOlxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc3luY1NlcnZpY2Uuc3luY0RlbGV0ZUZvbGRlcihub3RpZmljYXRpb24ucGF5bG9hZCBhcyBTeW5jRm9sZGVyTm90aWZpY2F0aW9uKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgTm90aWZpY2F0aW9uVHlwZS5TeW5jVmF1bHQ6XG4gICAgICAgICAgICBjYXNlIE5vdGlmaWNhdGlvblR5cGUuU3luY0NpcGhlcnM6XG4gICAgICAgICAgICBjYXNlIE5vdGlmaWNhdGlvblR5cGUuU3luY1NldHRpbmdzOlxuICAgICAgICAgICAgICAgIGlmIChpc0F1dGhlbnRpY2F0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zeW5jU2VydmljZS5mdWxsU3luYyhmYWxzZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBOb3RpZmljYXRpb25UeXBlLlN5bmNPcmdLZXlzOlxuICAgICAgICAgICAgICAgIGlmIChpc0F1dGhlbnRpY2F0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zeW5jU2VydmljZS5mdWxsU3luYyh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gU3RvcCBzbyBhIHJlY29ubmVjdCBjYW4gYmUgbWFkZVxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnNpZ25hbHJDb25uZWN0aW9uLnN0b3AoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIE5vdGlmaWNhdGlvblR5cGUuTG9nT3V0OlxuICAgICAgICAgICAgICAgIGlmIChpc0F1dGhlbnRpY2F0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dvdXRDYWxsYmFjaygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgTm90aWZpY2F0aW9uVHlwZS5TeW5jU2VuZENyZWF0ZTpcbiAgICAgICAgICAgIGNhc2UgTm90aWZpY2F0aW9uVHlwZS5TeW5jU2VuZFVwZGF0ZTpcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnN5bmNTZXJ2aWNlLnN5bmNVcHNlcnRTZW5kKG5vdGlmaWNhdGlvbi5wYXlsb2FkIGFzIFN5bmNTZW5kTm90aWZpY2F0aW9uLFxuICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb24udHlwZSA9PT0gTm90aWZpY2F0aW9uVHlwZS5TeW5jU2VuZFVwZGF0ZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIE5vdGlmaWNhdGlvblR5cGUuU3luY1NlbmREZWxldGU6XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zeW5jU2VydmljZS5zeW5jRGVsZXRlU2VuZChub3RpZmljYXRpb24ucGF5bG9hZCBhcyBTeW5jU2VuZE5vdGlmaWNhdGlvbik7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyByZWNvbm5lY3Qoc3luYzogYm9vbGVhbikge1xuICAgICAgICBpZiAodGhpcy5yZWNvbm5lY3RUaW1lciAhPSBudWxsKSB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5yZWNvbm5lY3RUaW1lcik7XG4gICAgICAgICAgICB0aGlzLnJlY29ubmVjdFRpbWVyID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jb25uZWN0ZWQgfHwgIXRoaXMuaW5pdGVkIHx8IHRoaXMuaW5hY3RpdmUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhdXRoZWRBbmRVbmxvY2tlZCA9IGF3YWl0IHRoaXMuaXNBdXRoZWRBbmRVbmxvY2tlZCgpO1xuICAgICAgICBpZiAoIWF1dGhlZEFuZFVubG9ja2VkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5zaWduYWxyQ29ubmVjdGlvbi5zdGFydCgpO1xuICAgICAgICAgICAgdGhpcy5jb25uZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKHN5bmMpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnN5bmNTZXJ2aWNlLmZ1bGxTeW5jKGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5sb2dTZXJ2aWNlLmVycm9yKGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLmNvbm5lY3RlZCkge1xuICAgICAgICAgICAgdGhpcy5yZWNvbm5lY3RUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5yZWNvbm5lY3Qoc3luYyksIHRoaXMucmFuZG9tKDEyMDAwMCwgMzAwMDAwKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGlzQXV0aGVkQW5kVW5sb2NrZWQoKSB7XG4gICAgICAgIGlmIChhd2FpdCB0aGlzLnVzZXJTZXJ2aWNlLmlzQXV0aGVudGljYXRlZCgpKSB7XG4gICAgICAgICAgICBjb25zdCBsb2NrZWQgPSBhd2FpdCB0aGlzLnZhdWx0VGltZW91dFNlcnZpY2UuaXNMb2NrZWQoKTtcbiAgICAgICAgICAgIHJldHVybiAhbG9ja2VkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJhbmRvbShtaW46IG51bWJlciwgbWF4OiBudW1iZXIpIHtcbiAgICAgICAgbWluID0gTWF0aC5jZWlsKG1pbik7XG4gICAgICAgIG1heCA9IE1hdGguZmxvb3IobWF4KTtcbiAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChtYXggLSBtaW4gKyAxKSkgKyBtaW47XG4gICAgfVxufVxuIiwiaW1wb3J0ICogYXMgenhjdmJuIGZyb20gJ3p4Y3Zibic7XG5cbmltcG9ydCB7IEVuY1N0cmluZyB9IGZyb20gJy4uL21vZGVscy9kb21haW4vZW5jU3RyaW5nJztcbmltcG9ydCB7IEdlbmVyYXRlZFBhc3N3b3JkSGlzdG9yeSB9IGZyb20gJy4uL21vZGVscy9kb21haW4vZ2VuZXJhdGVkUGFzc3dvcmRIaXN0b3J5JztcbmltcG9ydCB7IFBhc3N3b3JkR2VuZXJhdG9yUG9saWN5T3B0aW9ucyB9IGZyb20gJy4uL21vZGVscy9kb21haW4vcGFzc3dvcmRHZW5lcmF0b3JQb2xpY3lPcHRpb25zJztcbmltcG9ydCB7IFBvbGljeSB9IGZyb20gJy4uL21vZGVscy9kb21haW4vcG9saWN5JztcblxuaW1wb3J0IHsgQ3J5cHRvU2VydmljZSB9IGZyb20gJy4uL2Fic3RyYWN0aW9ucy9jcnlwdG8uc2VydmljZSc7XG5pbXBvcnQge1xuICAgIFBhc3N3b3JkR2VuZXJhdGlvblNlcnZpY2UgYXMgUGFzc3dvcmRHZW5lcmF0aW9uU2VydmljZUFic3RyYWN0aW9uLFxufSBmcm9tICcuLi9hYnN0cmFjdGlvbnMvcGFzc3dvcmRHZW5lcmF0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgUG9saWN5U2VydmljZSB9IGZyb20gJy4uL2Fic3RyYWN0aW9ucy9wb2xpY3kuc2VydmljZSc7XG5pbXBvcnQgeyBTdG9yYWdlU2VydmljZSB9IGZyb20gJy4uL2Fic3RyYWN0aW9ucy9zdG9yYWdlLnNlcnZpY2UnO1xuXG5pbXBvcnQgeyBFRUZMb25nV29yZExpc3QgfSBmcm9tICcuLi9taXNjL3dvcmRsaXN0JztcblxuaW1wb3J0IHsgUG9saWN5VHlwZSB9IGZyb20gJy4uL2VudW1zL3BvbGljeVR5cGUnO1xuXG5jb25zdCBEZWZhdWx0T3B0aW9ucyA9IHtcbiAgICBsZW5ndGg6IDE0LFxuICAgIGFtYmlndW91czogZmFsc2UsXG4gICAgbnVtYmVyOiB0cnVlLFxuICAgIG1pbk51bWJlcjogMSxcbiAgICB1cHBlcmNhc2U6IHRydWUsXG4gICAgbWluVXBwZXJjYXNlOiAwLFxuICAgIGxvd2VyY2FzZTogdHJ1ZSxcbiAgICBtaW5Mb3dlcmNhc2U6IDAsXG4gICAgc3BlY2lhbDogZmFsc2UsXG4gICAgbWluU3BlY2lhbDogMSxcbiAgICB0eXBlOiAncGFzc3dvcmQnLFxuICAgIG51bVdvcmRzOiAzLFxuICAgIHdvcmRTZXBhcmF0b3I6ICctJyxcbiAgICBjYXBpdGFsaXplOiBmYWxzZSxcbiAgICBpbmNsdWRlTnVtYmVyOiBmYWxzZSxcbn07XG5cbmNvbnN0IEtleXMgPSB7XG4gICAgb3B0aW9uczogJ3Bhc3N3b3JkR2VuZXJhdGlvbk9wdGlvbnMnLFxuICAgIGhpc3Rvcnk6ICdnZW5lcmF0ZWRQYXNzd29yZEhpc3RvcnknLFxufTtcblxuY29uc3QgTWF4UGFzc3dvcmRzSW5IaXN0b3J5ID0gMTAwO1xuXG5leHBvcnQgY2xhc3MgUGFzc3dvcmRHZW5lcmF0aW9uU2VydmljZSBpbXBsZW1lbnRzIFBhc3N3b3JkR2VuZXJhdGlvblNlcnZpY2VBYnN0cmFjdGlvbiB7XG4gICAgcHJpdmF0ZSBvcHRpb25zQ2FjaGU6IGFueTtcbiAgICBwcml2YXRlIGhpc3Rvcnk6IEdlbmVyYXRlZFBhc3N3b3JkSGlzdG9yeVtdO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBjcnlwdG9TZXJ2aWNlOiBDcnlwdG9TZXJ2aWNlLCBwcml2YXRlIHN0b3JhZ2VTZXJ2aWNlOiBTdG9yYWdlU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBwb2xpY3lTZXJ2aWNlOiBQb2xpY3lTZXJ2aWNlKSB7IH1cblxuICAgIGFzeW5jIGdlbmVyYXRlUGFzc3dvcmQob3B0aW9uczogYW55KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgLy8gb3ZlcmxvYWQgZGVmYXVsdHMgd2l0aCBnaXZlbiBvcHRpb25zXG4gICAgICAgIGNvbnN0IG8gPSBPYmplY3QuYXNzaWduKHt9LCBEZWZhdWx0T3B0aW9ucywgb3B0aW9ucyk7XG5cbiAgICAgICAgaWYgKG8udHlwZSA9PT0gJ3Bhc3NwaHJhc2UnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZVBhc3NwaHJhc2Uob3B0aW9ucyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBzYW5pdGl6ZVxuICAgICAgICB0aGlzLnNhbml0aXplUGFzc3dvcmRMZW5ndGgobywgdHJ1ZSk7XG5cbiAgICAgICAgY29uc3QgbWluTGVuZ3RoOiBudW1iZXIgPSBvLm1pblVwcGVyY2FzZSArIG8ubWluTG93ZXJjYXNlICsgby5taW5OdW1iZXIgKyBvLm1pblNwZWNpYWw7XG4gICAgICAgIGlmIChvLmxlbmd0aCA8IG1pbkxlbmd0aCkge1xuICAgICAgICAgICAgby5sZW5ndGggPSBtaW5MZW5ndGg7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwb3NpdGlvbnM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGlmIChvLmxvd2VyY2FzZSAmJiBvLm1pbkxvd2VyY2FzZSA+IDApIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgby5taW5Mb3dlcmNhc2U7IGkrKykge1xuICAgICAgICAgICAgICAgIHBvc2l0aW9ucy5wdXNoKCdsJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG8udXBwZXJjYXNlICYmIG8ubWluVXBwZXJjYXNlID4gMCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvLm1pblVwcGVyY2FzZTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgcG9zaXRpb25zLnB1c2goJ3UnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoby5udW1iZXIgJiYgby5taW5OdW1iZXIgPiAwKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG8ubWluTnVtYmVyOyBpKyspIHtcbiAgICAgICAgICAgICAgICBwb3NpdGlvbnMucHVzaCgnbicpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChvLnNwZWNpYWwgJiYgby5taW5TcGVjaWFsID4gMCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvLm1pblNwZWNpYWw7IGkrKykge1xuICAgICAgICAgICAgICAgIHBvc2l0aW9ucy5wdXNoKCdzJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKHBvc2l0aW9ucy5sZW5ndGggPCBvLmxlbmd0aCkge1xuICAgICAgICAgICAgcG9zaXRpb25zLnB1c2goJ2EnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHNodWZmbGVcbiAgICAgICAgYXdhaXQgdGhpcy5zaHVmZmxlQXJyYXkocG9zaXRpb25zKTtcblxuICAgICAgICAvLyBidWlsZCBvdXQgdGhlIGNoYXIgc2V0c1xuICAgICAgICBsZXQgYWxsQ2hhclNldCA9ICcnO1xuXG4gICAgICAgIGxldCBsb3dlcmNhc2VDaGFyU2V0ID0gJ2FiY2RlZmdoaWprbW5vcHFyc3R1dnd4eXonO1xuICAgICAgICBpZiAoby5hbWJpZ3VvdXMpIHtcbiAgICAgICAgICAgIGxvd2VyY2FzZUNoYXJTZXQgKz0gJ2wnO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvLmxvd2VyY2FzZSkge1xuICAgICAgICAgICAgYWxsQ2hhclNldCArPSBsb3dlcmNhc2VDaGFyU2V0O1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHVwcGVyY2FzZUNoYXJTZXQgPSAnQUJDREVGR0hKS0xNTlBRUlNUVVZXWFlaJztcbiAgICAgICAgaWYgKG8uYW1iaWd1b3VzKSB7XG4gICAgICAgICAgICB1cHBlcmNhc2VDaGFyU2V0ICs9ICdJTyc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG8udXBwZXJjYXNlKSB7XG4gICAgICAgICAgICBhbGxDaGFyU2V0ICs9IHVwcGVyY2FzZUNoYXJTZXQ7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbnVtYmVyQ2hhclNldCA9ICcyMzQ1Njc4OSc7XG4gICAgICAgIGlmIChvLmFtYmlndW91cykge1xuICAgICAgICAgICAgbnVtYmVyQ2hhclNldCArPSAnMDEnO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvLm51bWJlcikge1xuICAgICAgICAgICAgYWxsQ2hhclNldCArPSBudW1iZXJDaGFyU2V0O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3BlY2lhbENoYXJTZXQgPSAnIUAjJCVeJionO1xuICAgICAgICBpZiAoby5zcGVjaWFsKSB7XG4gICAgICAgICAgICBhbGxDaGFyU2V0ICs9IHNwZWNpYWxDaGFyU2V0O1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBhc3N3b3JkID0gJyc7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgby5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IHBvc2l0aW9uQ2hhcnM6IHN0cmluZztcbiAgICAgICAgICAgIHN3aXRjaCAocG9zaXRpb25zW2ldKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnbCc6XG4gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uQ2hhcnMgPSBsb3dlcmNhc2VDaGFyU2V0O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICd1JzpcbiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25DaGFycyA9IHVwcGVyY2FzZUNoYXJTZXQ7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ24nOlxuICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbkNoYXJzID0gbnVtYmVyQ2hhclNldDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAncyc6XG4gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uQ2hhcnMgPSBzcGVjaWFsQ2hhclNldDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnYSc6XG4gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uQ2hhcnMgPSBhbGxDaGFyU2V0O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgcmFuZG9tQ2hhckluZGV4ID0gYXdhaXQgdGhpcy5jcnlwdG9TZXJ2aWNlLnJhbmRvbU51bWJlcigwLCBwb3NpdGlvbkNoYXJzLmxlbmd0aCAtIDEpO1xuICAgICAgICAgICAgcGFzc3dvcmQgKz0gcG9zaXRpb25DaGFycy5jaGFyQXQocmFuZG9tQ2hhckluZGV4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBwYXNzd29yZDtcbiAgICB9XG5cbiAgICBhc3luYyBnZW5lcmF0ZVBhc3NwaHJhc2Uob3B0aW9uczogYW55KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgY29uc3QgbyA9IE9iamVjdC5hc3NpZ24oe30sIERlZmF1bHRPcHRpb25zLCBvcHRpb25zKTtcblxuICAgICAgICBpZiAoby5udW1Xb3JkcyA9PSBudWxsIHx8IG8ubnVtV29yZHMgPD0gMikge1xuICAgICAgICAgICAgby5udW1Xb3JkcyA9IERlZmF1bHRPcHRpb25zLm51bVdvcmRzO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvLndvcmRTZXBhcmF0b3IgPT0gbnVsbCB8fCBvLndvcmRTZXBhcmF0b3IubGVuZ3RoID09PSAwIHx8IG8ud29yZFNlcGFyYXRvci5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICBvLndvcmRTZXBhcmF0b3IgPSAnICc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG8uY2FwaXRhbGl6ZSA9PSBudWxsKSB7XG4gICAgICAgICAgICBvLmNhcGl0YWxpemUgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoby5pbmNsdWRlTnVtYmVyID09IG51bGwpIHtcbiAgICAgICAgICAgIG8uaW5jbHVkZU51bWJlciA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbGlzdExlbmd0aCA9IEVFRkxvbmdXb3JkTGlzdC5sZW5ndGggLSAxO1xuICAgICAgICBjb25zdCB3b3JkTGlzdCA9IG5ldyBBcnJheShvLm51bVdvcmRzKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvLm51bVdvcmRzOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHdvcmRJbmRleCA9IGF3YWl0IHRoaXMuY3J5cHRvU2VydmljZS5yYW5kb21OdW1iZXIoMCwgbGlzdExlbmd0aCk7XG4gICAgICAgICAgICBpZiAoby5jYXBpdGFsaXplKSB7XG4gICAgICAgICAgICAgICAgd29yZExpc3RbaV0gPSB0aGlzLmNhcGl0YWxpemUoRUVGTG9uZ1dvcmRMaXN0W3dvcmRJbmRleF0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB3b3JkTGlzdFtpXSA9IEVFRkxvbmdXb3JkTGlzdFt3b3JkSW5kZXhdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG8uaW5jbHVkZU51bWJlcikge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5hcHBlbmRSYW5kb21OdW1iZXJUb1JhbmRvbVdvcmQod29yZExpc3QpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3b3JkTGlzdC5qb2luKG8ud29yZFNlcGFyYXRvcik7XG4gICAgfVxuXG4gICAgYXN5bmMgZ2V0T3B0aW9ucygpOiBQcm9taXNlPFthbnksIFBhc3N3b3JkR2VuZXJhdG9yUG9saWN5T3B0aW9uc10+IHtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9uc0NhY2hlID09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSBhd2FpdCB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldChLZXlzLm9wdGlvbnMpO1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMub3B0aW9uc0NhY2hlID0gRGVmYXVsdE9wdGlvbnM7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMub3B0aW9uc0NhY2hlID0gT2JqZWN0LmFzc2lnbih7fSwgRGVmYXVsdE9wdGlvbnMsIG9wdGlvbnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGVuZm9yY2VkT3B0aW9ucyA9IGF3YWl0IHRoaXMuZW5mb3JjZVBhc3N3b3JkR2VuZXJhdG9yUG9saWNpZXNPbk9wdGlvbnModGhpcy5vcHRpb25zQ2FjaGUpO1xuICAgICAgICB0aGlzLm9wdGlvbnNDYWNoZSA9IGVuZm9yY2VkT3B0aW9uc1swXTtcbiAgICAgICAgcmV0dXJuIFt0aGlzLm9wdGlvbnNDYWNoZSwgZW5mb3JjZWRPcHRpb25zWzFdXTtcbiAgICB9XG5cbiAgICBhc3luYyBlbmZvcmNlUGFzc3dvcmRHZW5lcmF0b3JQb2xpY2llc09uT3B0aW9ucyhvcHRpb25zOiBhbnkpOiBQcm9taXNlPFthbnksIFBhc3N3b3JkR2VuZXJhdG9yUG9saWN5T3B0aW9uc10+IHtcbiAgICAgICAgbGV0IGVuZm9yY2VkUG9saWN5T3B0aW9ucyA9IGF3YWl0IHRoaXMuZ2V0UGFzc3dvcmRHZW5lcmF0b3JQb2xpY3lPcHRpb25zKCk7XG4gICAgICAgIGlmIChlbmZvcmNlZFBvbGljeU9wdGlvbnMgIT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMubGVuZ3RoIDwgZW5mb3JjZWRQb2xpY3lPcHRpb25zLm1pbkxlbmd0aCkge1xuICAgICAgICAgICAgICAgIG9wdGlvbnMubGVuZ3RoID0gZW5mb3JjZWRQb2xpY3lPcHRpb25zLm1pbkxlbmd0aDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGVuZm9yY2VkUG9saWN5T3B0aW9ucy51c2VVcHBlcmNhc2UpIHtcbiAgICAgICAgICAgICAgICBvcHRpb25zLnVwcGVyY2FzZSA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChlbmZvcmNlZFBvbGljeU9wdGlvbnMudXNlTG93ZXJjYXNlKSB7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5sb3dlcmNhc2UgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZW5mb3JjZWRQb2xpY3lPcHRpb25zLnVzZU51bWJlcnMpIHtcbiAgICAgICAgICAgICAgICBvcHRpb25zLm51bWJlciA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChvcHRpb25zLm1pbk51bWJlciA8IGVuZm9yY2VkUG9saWN5T3B0aW9ucy5udW1iZXJDb3VudCkge1xuICAgICAgICAgICAgICAgIG9wdGlvbnMubWluTnVtYmVyID0gZW5mb3JjZWRQb2xpY3lPcHRpb25zLm51bWJlckNvdW50O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZW5mb3JjZWRQb2xpY3lPcHRpb25zLnVzZVNwZWNpYWwpIHtcbiAgICAgICAgICAgICAgICBvcHRpb25zLnNwZWNpYWwgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5taW5TcGVjaWFsIDwgZW5mb3JjZWRQb2xpY3lPcHRpb25zLnNwZWNpYWxDb3VudCkge1xuICAgICAgICAgICAgICAgIG9wdGlvbnMubWluU3BlY2lhbCA9IGVuZm9yY2VkUG9saWN5T3B0aW9ucy5zcGVjaWFsQ291bnQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIE11c3Qgbm9ybWFsaXplIHRoZXNlIGZpZWxkcyBiZWNhdXNlIHRoZSByZWNlaXZpbmcgY2FsbCBleHBlY3RzIGFsbCBvcHRpb25zIHRvIHBhc3MgdGhlIGN1cnJlbnQgcnVsZXNcbiAgICAgICAgICAgIGlmIChvcHRpb25zLm1pblNwZWNpYWwgKyBvcHRpb25zLm1pbk51bWJlciA+IG9wdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5taW5TcGVjaWFsID0gb3B0aW9ucy5sZW5ndGggLSBvcHRpb25zLm1pbk51bWJlcjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG9wdGlvbnMubnVtV29yZHMgPCBlbmZvcmNlZFBvbGljeU9wdGlvbnMubWluTnVtYmVyV29yZHMpIHtcbiAgICAgICAgICAgICAgICBvcHRpb25zLm51bVdvcmRzID0gZW5mb3JjZWRQb2xpY3lPcHRpb25zLm1pbk51bWJlcldvcmRzO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZW5mb3JjZWRQb2xpY3lPcHRpb25zLmNhcGl0YWxpemUpIHtcbiAgICAgICAgICAgICAgICBvcHRpb25zLmNhcGl0YWxpemUgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZW5mb3JjZWRQb2xpY3lPcHRpb25zLmluY2x1ZGVOdW1iZXIpIHtcbiAgICAgICAgICAgICAgICBvcHRpb25zLmluY2x1ZGVOdW1iZXIgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBGb3JjZSBkZWZhdWx0IHR5cGUgaWYgcGFzc3dvcmQvcGFzc3BocmFzZSBzZWxlY3RlZCB2aWEgcG9saWN5XG4gICAgICAgICAgICBpZiAoZW5mb3JjZWRQb2xpY3lPcHRpb25zLmRlZmF1bHRUeXBlID09PSAncGFzc3dvcmQnIHx8XG4gICAgICAgICAgICAgICAgZW5mb3JjZWRQb2xpY3lPcHRpb25zLmRlZmF1bHRUeXBlID09PSAncGFzc3BocmFzZScpIHtcbiAgICAgICAgICAgICAgICBvcHRpb25zLnR5cGUgPSBlbmZvcmNlZFBvbGljeU9wdGlvbnMuZGVmYXVsdFR5cGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7IC8vIFVJIGxheWVyIGV4cGVjdHMgYW4gaW5zdGFudGlhdGVkIG9iamVjdCB0byBwcmV2ZW50IG1vcmUgZXhwbGljaXQgbnVsbCBjaGVja3NcbiAgICAgICAgICAgIGVuZm9yY2VkUG9saWN5T3B0aW9ucyA9IG5ldyBQYXNzd29yZEdlbmVyYXRvclBvbGljeU9wdGlvbnMoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW29wdGlvbnMsIGVuZm9yY2VkUG9saWN5T3B0aW9uc107XG4gICAgfVxuXG4gICAgYXN5bmMgZ2V0UGFzc3dvcmRHZW5lcmF0b3JQb2xpY3lPcHRpb25zKCk6IFByb21pc2U8UGFzc3dvcmRHZW5lcmF0b3JQb2xpY3lPcHRpb25zPiB7XG4gICAgICAgIGNvbnN0IHBvbGljaWVzOiBQb2xpY3lbXSA9IHRoaXMucG9saWN5U2VydmljZSA9PSBudWxsID8gbnVsbCA6XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnBvbGljeVNlcnZpY2UuZ2V0QWxsKFBvbGljeVR5cGUuUGFzc3dvcmRHZW5lcmF0b3IpO1xuICAgICAgICBsZXQgZW5mb3JjZWRPcHRpb25zOiBQYXNzd29yZEdlbmVyYXRvclBvbGljeU9wdGlvbnMgPSBudWxsO1xuXG4gICAgICAgIGlmIChwb2xpY2llcyA9PSBudWxsIHx8IHBvbGljaWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGVuZm9yY2VkT3B0aW9ucztcbiAgICAgICAgfVxuXG4gICAgICAgIHBvbGljaWVzLmZvckVhY2goY3VycmVudFBvbGljeSA9PiB7XG4gICAgICAgICAgICBpZiAoIWN1cnJlbnRQb2xpY3kuZW5hYmxlZCB8fCBjdXJyZW50UG9saWN5LmRhdGEgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGVuZm9yY2VkT3B0aW9ucyA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgZW5mb3JjZWRPcHRpb25zID0gbmV3IFBhc3N3b3JkR2VuZXJhdG9yUG9saWN5T3B0aW9ucygpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBQYXNzd29yZCB3aW5zIGluIG11bHRpLW9yZyBjb2xsaXNpb25zXG4gICAgICAgICAgICBpZiAoY3VycmVudFBvbGljeS5kYXRhLmRlZmF1bHRUeXBlICE9IG51bGwgJiYgZW5mb3JjZWRPcHRpb25zLmRlZmF1bHRUeXBlICE9PSAncGFzc3dvcmQnKSB7XG4gICAgICAgICAgICAgICAgZW5mb3JjZWRPcHRpb25zLmRlZmF1bHRUeXBlID0gY3VycmVudFBvbGljeS5kYXRhLmRlZmF1bHRUeXBlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY3VycmVudFBvbGljeS5kYXRhLm1pbkxlbmd0aCAhPSBudWxsXG4gICAgICAgICAgICAgICAgJiYgY3VycmVudFBvbGljeS5kYXRhLm1pbkxlbmd0aCA+IGVuZm9yY2VkT3B0aW9ucy5taW5MZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBlbmZvcmNlZE9wdGlvbnMubWluTGVuZ3RoID0gY3VycmVudFBvbGljeS5kYXRhLm1pbkxlbmd0aDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGN1cnJlbnRQb2xpY3kuZGF0YS51c2VVcHBlcikge1xuICAgICAgICAgICAgICAgIGVuZm9yY2VkT3B0aW9ucy51c2VVcHBlcmNhc2UgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY3VycmVudFBvbGljeS5kYXRhLnVzZUxvd2VyKSB7XG4gICAgICAgICAgICAgICAgZW5mb3JjZWRPcHRpb25zLnVzZUxvd2VyY2FzZSA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjdXJyZW50UG9saWN5LmRhdGEudXNlTnVtYmVycykge1xuICAgICAgICAgICAgICAgIGVuZm9yY2VkT3B0aW9ucy51c2VOdW1iZXJzID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGN1cnJlbnRQb2xpY3kuZGF0YS5taW5OdW1iZXJzICE9IG51bGxcbiAgICAgICAgICAgICAgICAmJiBjdXJyZW50UG9saWN5LmRhdGEubWluTnVtYmVycyA+IGVuZm9yY2VkT3B0aW9ucy5udW1iZXJDb3VudCkge1xuICAgICAgICAgICAgICAgIGVuZm9yY2VkT3B0aW9ucy5udW1iZXJDb3VudCA9IGN1cnJlbnRQb2xpY3kuZGF0YS5taW5OdW1iZXJzO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY3VycmVudFBvbGljeS5kYXRhLnVzZVNwZWNpYWwpIHtcbiAgICAgICAgICAgICAgICBlbmZvcmNlZE9wdGlvbnMudXNlU3BlY2lhbCA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjdXJyZW50UG9saWN5LmRhdGEubWluU3BlY2lhbCAhPSBudWxsXG4gICAgICAgICAgICAgICAgJiYgY3VycmVudFBvbGljeS5kYXRhLm1pblNwZWNpYWwgPiBlbmZvcmNlZE9wdGlvbnMuc3BlY2lhbENvdW50KSB7XG4gICAgICAgICAgICAgICAgZW5mb3JjZWRPcHRpb25zLnNwZWNpYWxDb3VudCA9IGN1cnJlbnRQb2xpY3kuZGF0YS5taW5TcGVjaWFsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY3VycmVudFBvbGljeS5kYXRhLm1pbk51bWJlcldvcmRzICE9IG51bGxcbiAgICAgICAgICAgICAgICAmJiBjdXJyZW50UG9saWN5LmRhdGEubWluTnVtYmVyV29yZHMgPiBlbmZvcmNlZE9wdGlvbnMubWluTnVtYmVyV29yZHMpIHtcbiAgICAgICAgICAgICAgICBlbmZvcmNlZE9wdGlvbnMubWluTnVtYmVyV29yZHMgPSBjdXJyZW50UG9saWN5LmRhdGEubWluTnVtYmVyV29yZHM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjdXJyZW50UG9saWN5LmRhdGEuY2FwaXRhbGl6ZSkge1xuICAgICAgICAgICAgICAgIGVuZm9yY2VkT3B0aW9ucy5jYXBpdGFsaXplID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGN1cnJlbnRQb2xpY3kuZGF0YS5pbmNsdWRlTnVtYmVyKSB7XG4gICAgICAgICAgICAgICAgZW5mb3JjZWRPcHRpb25zLmluY2x1ZGVOdW1iZXIgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gZW5mb3JjZWRPcHRpb25zO1xuICAgIH1cblxuICAgIGFzeW5jIHNhdmVPcHRpb25zKG9wdGlvbnM6IGFueSkge1xuICAgICAgICBhd2FpdCB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNhdmUoS2V5cy5vcHRpb25zLCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy5vcHRpb25zQ2FjaGUgPSBvcHRpb25zO1xuICAgIH1cblxuICAgIGFzeW5jIGdldEhpc3RvcnkoKTogUHJvbWlzZTxHZW5lcmF0ZWRQYXNzd29yZEhpc3RvcnlbXT4ge1xuICAgICAgICBjb25zdCBoYXNLZXkgPSBhd2FpdCB0aGlzLmNyeXB0b1NlcnZpY2UuaGFzS2V5KCk7XG4gICAgICAgIGlmICghaGFzS2V5KSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEFycmF5PEdlbmVyYXRlZFBhc3N3b3JkSGlzdG9yeT4oKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5oaXN0b3J5KSB7XG4gICAgICAgICAgICBjb25zdCBlbmNyeXB0ZWQgPSBhd2FpdCB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldDxHZW5lcmF0ZWRQYXNzd29yZEhpc3RvcnlbXT4oS2V5cy5oaXN0b3J5KTtcbiAgICAgICAgICAgIHRoaXMuaGlzdG9yeSA9IGF3YWl0IHRoaXMuZGVjcnlwdEhpc3RvcnkoZW5jcnlwdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmhpc3RvcnkgfHwgbmV3IEFycmF5PEdlbmVyYXRlZFBhc3N3b3JkSGlzdG9yeT4oKTtcbiAgICB9XG5cbiAgICBhc3luYyBhZGRIaXN0b3J5KHBhc3N3b3JkOiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICAvLyBDYW5ub3QgYWRkIG5ldyBoaXN0b3J5IGlmIG5vIGtleSBpcyBhdmFpbGFibGVcbiAgICAgICAgY29uc3QgaGFzS2V5ID0gYXdhaXQgdGhpcy5jcnlwdG9TZXJ2aWNlLmhhc0tleSgpO1xuICAgICAgICBpZiAoIWhhc0tleSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY3VycmVudEhpc3RvcnkgPSBhd2FpdCB0aGlzLmdldEhpc3RvcnkoKTtcblxuICAgICAgICAvLyBQcmV2ZW50IGR1cGxpY2F0ZXNcbiAgICAgICAgaWYgKHRoaXMubWF0Y2hlc1ByZXZpb3VzKHBhc3N3b3JkLCBjdXJyZW50SGlzdG9yeSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGN1cnJlbnRIaXN0b3J5LnVuc2hpZnQobmV3IEdlbmVyYXRlZFBhc3N3b3JkSGlzdG9yeShwYXNzd29yZCwgRGF0ZS5ub3coKSkpO1xuXG4gICAgICAgIC8vIFJlbW92ZSBvbGQgaXRlbXMuXG4gICAgICAgIGlmIChjdXJyZW50SGlzdG9yeS5sZW5ndGggPiBNYXhQYXNzd29yZHNJbkhpc3RvcnkpIHtcbiAgICAgICAgICAgIGN1cnJlbnRIaXN0b3J5LnBvcCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbmV3SGlzdG9yeSA9IGF3YWl0IHRoaXMuZW5jcnlwdEhpc3RvcnkoY3VycmVudEhpc3RvcnkpO1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5zdG9yYWdlU2VydmljZS5zYXZlKEtleXMuaGlzdG9yeSwgbmV3SGlzdG9yeSk7XG4gICAgfVxuXG4gICAgYXN5bmMgY2xlYXIoKTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgdGhpcy5oaXN0b3J5ID0gW107XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnJlbW92ZShLZXlzLmhpc3RvcnkpO1xuICAgIH1cblxuICAgIHBhc3N3b3JkU3RyZW5ndGgocGFzc3dvcmQ6IHN0cmluZywgdXNlcklucHV0czogc3RyaW5nW10gPSBudWxsKTogenhjdmJuLlpYQ1ZCTlJlc3VsdCB7XG4gICAgICAgIGlmIChwYXNzd29yZCA9PSBudWxsIHx8IHBhc3N3b3JkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGdsb2JhbFVzZXJJbnB1dHMgPSBbJ2JpdHdhcmRlbicsICdiaXQnLCAnd2FyZGVuJ107XG4gICAgICAgIGlmICh1c2VySW5wdXRzICE9IG51bGwgJiYgdXNlcklucHV0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBnbG9iYWxVc2VySW5wdXRzID0gZ2xvYmFsVXNlcklucHV0cy5jb25jYXQodXNlcklucHV0cyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVXNlIGEgaGFzaCBzZXQgdG8gZ2V0IHJpZCBvZiBhbnkgZHVwbGljYXRlIHVzZXIgaW5wdXRzXG4gICAgICAgIGNvbnN0IGZpbmFsVXNlcklucHV0cyA9IEFycmF5LmZyb20obmV3IFNldChnbG9iYWxVc2VySW5wdXRzKSk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHp4Y3ZibihwYXNzd29yZCwgZmluYWxVc2VySW5wdXRzKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBub3JtYWxpemVPcHRpb25zKG9wdGlvbnM6IGFueSwgZW5mb3JjZWRQb2xpY3lPcHRpb25zOiBQYXNzd29yZEdlbmVyYXRvclBvbGljeU9wdGlvbnMpIHtcbiAgICAgICAgb3B0aW9ucy5taW5Mb3dlcmNhc2UgPSAwO1xuICAgICAgICBvcHRpb25zLm1pblVwcGVyY2FzZSA9IDA7XG5cbiAgICAgICAgaWYgKCFvcHRpb25zLmxlbmd0aCB8fCBvcHRpb25zLmxlbmd0aCA8IDUpIHtcbiAgICAgICAgICAgIG9wdGlvbnMubGVuZ3RoID0gNTtcbiAgICAgICAgfSBlbHNlIGlmIChvcHRpb25zLmxlbmd0aCA+IDEyOCkge1xuICAgICAgICAgICAgb3B0aW9ucy5sZW5ndGggPSAxMjg7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucy5sZW5ndGggPCBlbmZvcmNlZFBvbGljeU9wdGlvbnMubWluTGVuZ3RoKSB7XG4gICAgICAgICAgICBvcHRpb25zLmxlbmd0aCA9IGVuZm9yY2VkUG9saWN5T3B0aW9ucy5taW5MZW5ndGg7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIW9wdGlvbnMubWluTnVtYmVyKSB7XG4gICAgICAgICAgICBvcHRpb25zLm1pbk51bWJlciA9IDA7XG4gICAgICAgIH0gZWxzZSBpZiAob3B0aW9ucy5taW5OdW1iZXIgPiBvcHRpb25zLmxlbmd0aCkge1xuICAgICAgICAgICAgb3B0aW9ucy5taW5OdW1iZXIgPSBvcHRpb25zLmxlbmd0aDtcbiAgICAgICAgfSBlbHNlIGlmIChvcHRpb25zLm1pbk51bWJlciA+IDkpIHtcbiAgICAgICAgICAgIG9wdGlvbnMubWluTnVtYmVyID0gOTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRpb25zLm1pbk51bWJlciA8IGVuZm9yY2VkUG9saWN5T3B0aW9ucy5udW1iZXJDb3VudCkge1xuICAgICAgICAgICAgb3B0aW9ucy5taW5OdW1iZXIgPSBlbmZvcmNlZFBvbGljeU9wdGlvbnMubnVtYmVyQ291bnQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIW9wdGlvbnMubWluU3BlY2lhbCkge1xuICAgICAgICAgICAgb3B0aW9ucy5taW5TcGVjaWFsID0gMDtcbiAgICAgICAgfSBlbHNlIGlmIChvcHRpb25zLm1pblNwZWNpYWwgPiBvcHRpb25zLmxlbmd0aCkge1xuICAgICAgICAgICAgb3B0aW9ucy5taW5TcGVjaWFsID0gb3B0aW9ucy5sZW5ndGg7XG4gICAgICAgIH0gZWxzZSBpZiAob3B0aW9ucy5taW5TcGVjaWFsID4gOSkge1xuICAgICAgICAgICAgb3B0aW9ucy5taW5TcGVjaWFsID0gOTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRpb25zLm1pblNwZWNpYWwgPCBlbmZvcmNlZFBvbGljeU9wdGlvbnMuc3BlY2lhbENvdW50KSB7XG4gICAgICAgICAgICBvcHRpb25zLm1pblNwZWNpYWwgPSBlbmZvcmNlZFBvbGljeU9wdGlvbnMuc3BlY2lhbENvdW50O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnMubWluU3BlY2lhbCArIG9wdGlvbnMubWluTnVtYmVyID4gb3B0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgIG9wdGlvbnMubWluU3BlY2lhbCA9IG9wdGlvbnMubGVuZ3RoIC0gb3B0aW9ucy5taW5OdW1iZXI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucy5udW1Xb3JkcyA9PSBudWxsIHx8IG9wdGlvbnMubGVuZ3RoIDwgMykge1xuICAgICAgICAgICAgb3B0aW9ucy5udW1Xb3JkcyA9IDM7XG4gICAgICAgIH0gZWxzZSBpZiAob3B0aW9ucy5udW1Xb3JkcyA+IDIwKSB7XG4gICAgICAgICAgICBvcHRpb25zLm51bVdvcmRzID0gMjA7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucy5udW1Xb3JkcyA8IGVuZm9yY2VkUG9saWN5T3B0aW9ucy5taW5OdW1iZXJXb3Jkcykge1xuICAgICAgICAgICAgb3B0aW9ucy5udW1Xb3JkcyA9IGVuZm9yY2VkUG9saWN5T3B0aW9ucy5taW5OdW1iZXJXb3JkcztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRpb25zLndvcmRTZXBhcmF0b3IgIT0gbnVsbCAmJiBvcHRpb25zLndvcmRTZXBhcmF0b3IubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgb3B0aW9ucy53b3JkU2VwYXJhdG9yID0gb3B0aW9ucy53b3JkU2VwYXJhdG9yWzBdO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zYW5pdGl6ZVBhc3N3b3JkTGVuZ3RoKG9wdGlvbnMsIGZhbHNlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNhcGl0YWxpemUoc3RyOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHN0ci5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHN0ci5zbGljZSgxKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGFwcGVuZFJhbmRvbU51bWJlclRvUmFuZG9tV29yZCh3b3JkTGlzdDogc3RyaW5nW10pIHtcbiAgICAgICAgaWYgKHdvcmRMaXN0ID09IG51bGwgfHwgd29yZExpc3QubGVuZ3RoIDw9IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpbmRleCA9IGF3YWl0IHRoaXMuY3J5cHRvU2VydmljZS5yYW5kb21OdW1iZXIoMCwgd29yZExpc3QubGVuZ3RoIC0gMSk7XG4gICAgICAgIGNvbnN0IG51bSA9IGF3YWl0IHRoaXMuY3J5cHRvU2VydmljZS5yYW5kb21OdW1iZXIoMCwgOSk7XG4gICAgICAgIHdvcmRMaXN0W2luZGV4XSA9IHdvcmRMaXN0W2luZGV4XSArIG51bTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGVuY3J5cHRIaXN0b3J5KGhpc3Rvcnk6IEdlbmVyYXRlZFBhc3N3b3JkSGlzdG9yeVtdKTogUHJvbWlzZTxHZW5lcmF0ZWRQYXNzd29yZEhpc3RvcnlbXT4ge1xuICAgICAgICBpZiAoaGlzdG9yeSA9PSBudWxsIHx8IGhpc3RvcnkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFtdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHByb21pc2VzID0gaGlzdG9yeS5tYXAoYXN5bmMgaXRlbSA9PiB7XG4gICAgICAgICAgICBjb25zdCBlbmNyeXB0ZWQgPSBhd2FpdCB0aGlzLmNyeXB0b1NlcnZpY2UuZW5jcnlwdChpdGVtLnBhc3N3b3JkKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgR2VuZXJhdGVkUGFzc3dvcmRIaXN0b3J5KGVuY3J5cHRlZC5lbmNyeXB0ZWRTdHJpbmcsIGl0ZW0uZGF0ZSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBkZWNyeXB0SGlzdG9yeShoaXN0b3J5OiBHZW5lcmF0ZWRQYXNzd29yZEhpc3RvcnlbXSk6IFByb21pc2U8R2VuZXJhdGVkUGFzc3dvcmRIaXN0b3J5W10+IHtcbiAgICAgICAgaWYgKGhpc3RvcnkgPT0gbnVsbCB8fCBoaXN0b3J5Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShbXSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwcm9taXNlcyA9IGhpc3RvcnkubWFwKGFzeW5jIGl0ZW0gPT4ge1xuICAgICAgICAgICAgY29uc3QgZGVjcnlwdGVkID0gYXdhaXQgdGhpcy5jcnlwdG9TZXJ2aWNlLmRlY3J5cHRUb1V0ZjgobmV3IEVuY1N0cmluZyhpdGVtLnBhc3N3b3JkKSk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEdlbmVyYXRlZFBhc3N3b3JkSGlzdG9yeShkZWNyeXB0ZWQsIGl0ZW0uZGF0ZSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBtYXRjaGVzUHJldmlvdXMocGFzc3dvcmQ6IHN0cmluZywgaGlzdG9yeTogR2VuZXJhdGVkUGFzc3dvcmRIaXN0b3J5W10pOiBib29sZWFuIHtcbiAgICAgICAgaWYgKGhpc3RvcnkgPT0gbnVsbCB8fCBoaXN0b3J5Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGhpc3RvcnlbaGlzdG9yeS5sZW5ndGggLSAxXS5wYXNzd29yZCA9PT0gcGFzc3dvcmQ7XG4gICAgfVxuXG4gICAgLy8gcmVmOiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMTI2NDY4NjQvMTA5MDM1OVxuICAgIHByaXZhdGUgYXN5bmMgc2h1ZmZsZUFycmF5KGFycmF5OiBzdHJpbmdbXSkge1xuICAgICAgICBmb3IgKGxldCBpID0gYXJyYXkubGVuZ3RoIC0gMTsgaSA+IDA7IGktLSkge1xuICAgICAgICAgICAgY29uc3QgaiA9IGF3YWl0IHRoaXMuY3J5cHRvU2VydmljZS5yYW5kb21OdW1iZXIoMCwgaSk7XG4gICAgICAgICAgICBbYXJyYXlbaV0sIGFycmF5W2pdXSA9IFthcnJheVtqXSwgYXJyYXlbaV1dO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzYW5pdGl6ZVBhc3N3b3JkTGVuZ3RoKG9wdGlvbnM6IGFueSwgZm9yR2VuZXJhdGlvbjogYm9vbGVhbikge1xuICAgICAgICBsZXQgbWluVXBwZXJjYXNlQ2FsYyA9IDA7XG4gICAgICAgIGxldCBtaW5Mb3dlcmNhc2VDYWxjID0gMDtcbiAgICAgICAgbGV0IG1pbk51bWJlckNhbGM6IG51bWJlciA9IG9wdGlvbnMubWluTnVtYmVyO1xuICAgICAgICBsZXQgbWluU3BlY2lhbENhbGM6IG51bWJlciA9IG9wdGlvbnMubWluU3BlY2lhbDtcblxuICAgICAgICBpZiAob3B0aW9ucy51cHBlcmNhc2UgJiYgb3B0aW9ucy5taW5VcHBlcmNhc2UgPD0gMCkge1xuICAgICAgICAgICAgbWluVXBwZXJjYXNlQ2FsYyA9IDE7XG4gICAgICAgIH0gZWxzZSBpZiAoIW9wdGlvbnMudXBwZXJjYXNlKSB7XG4gICAgICAgICAgICBtaW5VcHBlcmNhc2VDYWxjID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRpb25zLmxvd2VyY2FzZSAmJiBvcHRpb25zLm1pbkxvd2VyY2FzZSA8PSAwKSB7XG4gICAgICAgICAgICBtaW5Mb3dlcmNhc2VDYWxjID0gMTtcbiAgICAgICAgfSBlbHNlIGlmICghb3B0aW9ucy5sb3dlcmNhc2UpIHtcbiAgICAgICAgICAgIG1pbkxvd2VyY2FzZUNhbGMgPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnMubnVtYmVyICYmIG9wdGlvbnMubWluTnVtYmVyIDw9IDApIHtcbiAgICAgICAgICAgIG1pbk51bWJlckNhbGMgPSAxO1xuICAgICAgICB9IGVsc2UgaWYgKCFvcHRpb25zLm51bWJlcikge1xuICAgICAgICAgICAgbWluTnVtYmVyQ2FsYyA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucy5zcGVjaWFsICYmIG9wdGlvbnMubWluU3BlY2lhbCA8PSAwKSB7XG4gICAgICAgICAgICBtaW5TcGVjaWFsQ2FsYyA9IDE7XG4gICAgICAgIH0gZWxzZSBpZiAoIW9wdGlvbnMuc3BlY2lhbCkge1xuICAgICAgICAgICAgbWluU3BlY2lhbENhbGMgPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIGJ1dCBpcyBhIGZpbmFsIHNhZmV0eSBuZXRcbiAgICAgICAgaWYgKCFvcHRpb25zLmxlbmd0aCB8fCBvcHRpb25zLmxlbmd0aCA8IDEpIHtcbiAgICAgICAgICAgIG9wdGlvbnMubGVuZ3RoID0gMTA7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtaW5MZW5ndGg6IG51bWJlciA9IG1pblVwcGVyY2FzZUNhbGMgKyBtaW5Mb3dlcmNhc2VDYWxjICsgbWluTnVtYmVyQ2FsYyArIG1pblNwZWNpYWxDYWxjO1xuICAgICAgICAvLyBOb3JtYWxpemUgYW5kIEdlbmVyYXRpb24gYm90aCByZXF1aXJlIHRoaXMgbW9kaWZpY2F0aW9uXG4gICAgICAgIGlmIChvcHRpb25zLmxlbmd0aCA8IG1pbkxlbmd0aCkge1xuICAgICAgICAgICAgb3B0aW9ucy5sZW5ndGggPSBtaW5MZW5ndGg7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBcHBseSBvdGhlciBjaGFuZ2VzIGlmIHRoZSBvcHRpb25zIG9iamVjdCBwYXNzZWQgaW4gaXMgZm9yIGdlbmVyYXRpb25cbiAgICAgICAgaWYgKGZvckdlbmVyYXRpb24pIHtcbiAgICAgICAgICAgIG9wdGlvbnMubWluVXBwZXJjYXNlID0gbWluVXBwZXJjYXNlQ2FsYztcbiAgICAgICAgICAgIG9wdGlvbnMubWluTG93ZXJjYXNlID0gbWluTG93ZXJjYXNlQ2FsYztcbiAgICAgICAgICAgIG9wdGlvbnMubWluTnVtYmVyID0gbWluTnVtYmVyQ2FsYztcbiAgICAgICAgICAgIG9wdGlvbnMubWluU3BlY2lhbCA9IG1pblNwZWNpYWxDYWxjO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgUG9saWN5U2VydmljZSBhcyBQb2xpY3lTZXJ2aWNlQWJzdHJhY3Rpb24gfSBmcm9tICcuLi9hYnN0cmFjdGlvbnMvcG9saWN5LnNlcnZpY2UnO1xuaW1wb3J0IHsgU3RvcmFnZVNlcnZpY2UgfSBmcm9tICcuLi9hYnN0cmFjdGlvbnMvc3RvcmFnZS5zZXJ2aWNlJztcbmltcG9ydCB7IFVzZXJTZXJ2aWNlIH0gZnJvbSAnLi4vYWJzdHJhY3Rpb25zL3VzZXIuc2VydmljZSc7XG5cbmltcG9ydCB7IFBvbGljeURhdGEgfSBmcm9tICcuLi9tb2RlbHMvZGF0YS9wb2xpY3lEYXRhJztcblxuaW1wb3J0IHsgTWFzdGVyUGFzc3dvcmRQb2xpY3lPcHRpb25zIH0gZnJvbSAnLi4vbW9kZWxzL2RvbWFpbi9tYXN0ZXJQYXNzd29yZFBvbGljeU9wdGlvbnMnO1xuaW1wb3J0IHsgT3JnYW5pemF0aW9uIH0gZnJvbSAnLi4vbW9kZWxzL2RvbWFpbi9vcmdhbml6YXRpb24nO1xuaW1wb3J0IHsgUG9saWN5IH0gZnJvbSAnLi4vbW9kZWxzL2RvbWFpbi9wb2xpY3knO1xuaW1wb3J0IHsgUmVzZXRQYXNzd29yZFBvbGljeU9wdGlvbnMgfSBmcm9tICcuLi9tb2RlbHMvZG9tYWluL3Jlc2V0UGFzc3dvcmRQb2xpY3lPcHRpb25zJztcblxuaW1wb3J0IHsgT3JnYW5pemF0aW9uVXNlclN0YXR1c1R5cGUgfSBmcm9tICcuLi9lbnVtcy9vcmdhbml6YXRpb25Vc2VyU3RhdHVzVHlwZSc7XG5pbXBvcnQgeyBPcmdhbml6YXRpb25Vc2VyVHlwZSB9IGZyb20gJy4uL2VudW1zL29yZ2FuaXphdGlvblVzZXJUeXBlJztcbmltcG9ydCB7IFBvbGljeVR5cGUgfSBmcm9tICcuLi9lbnVtcy9wb2xpY3lUeXBlJztcblxuaW1wb3J0IHsgQXBpU2VydmljZSB9IGZyb20gJy4uL2Fic3RyYWN0aW9ucy9hcGkuc2VydmljZSc7XG5pbXBvcnQgeyBMaXN0UmVzcG9uc2UgfSBmcm9tICcuLi9tb2RlbHMvcmVzcG9uc2UvbGlzdFJlc3BvbnNlJztcbmltcG9ydCB7IFBvbGljeVJlc3BvbnNlIH0gZnJvbSAnLi4vbW9kZWxzL3Jlc3BvbnNlL3BvbGljeVJlc3BvbnNlJztcblxuY29uc3QgS2V5cyA9IHtcbiAgICBwb2xpY2llc1ByZWZpeDogJ3BvbGljaWVzXycsXG59O1xuXG5leHBvcnQgY2xhc3MgUG9saWN5U2VydmljZSBpbXBsZW1lbnRzIFBvbGljeVNlcnZpY2VBYnN0cmFjdGlvbiB7XG4gICAgcG9saWN5Q2FjaGU6IFBvbGljeVtdO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSB1c2VyU2VydmljZTogVXNlclNlcnZpY2UsIHByaXZhdGUgc3RvcmFnZVNlcnZpY2U6IFN0b3JhZ2VTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGFwaVNlcnZpY2U6IEFwaVNlcnZpY2UpIHtcbiAgICB9XG5cbiAgICBjbGVhckNhY2hlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnBvbGljeUNhY2hlID0gbnVsbDtcbiAgICB9XG5cbiAgICBhc3luYyBnZXRBbGwodHlwZT86IFBvbGljeVR5cGUpOiBQcm9taXNlPFBvbGljeVtdPiB7XG4gICAgICAgIGlmICh0aGlzLnBvbGljeUNhY2hlID09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IHVzZXJJZCA9IGF3YWl0IHRoaXMudXNlclNlcnZpY2UuZ2V0VXNlcklkKCk7XG4gICAgICAgICAgICBjb25zdCBwb2xpY2llcyA9IGF3YWl0IHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0PHsgW2lkOiBzdHJpbmddOiBQb2xpY3lEYXRhOyB9PihcbiAgICAgICAgICAgICAgICBLZXlzLnBvbGljaWVzUHJlZml4ICsgdXNlcklkKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlOiBQb2xpY3lbXSA9IFtdO1xuICAgICAgICAgICAgZm9yIChjb25zdCBpZCBpbiBwb2xpY2llcykge1xuICAgICAgICAgICAgICAgIGlmIChwb2xpY2llcy5oYXNPd25Qcm9wZXJ0eShpZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UucHVzaChuZXcgUG9saWN5KHBvbGljaWVzW2lkXSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucG9saWN5Q2FjaGUgPSByZXNwb25zZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZSAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wb2xpY3lDYWNoZS5maWx0ZXIocCA9PiBwLnR5cGUgPT09IHR5cGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucG9saWN5Q2FjaGU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBnZXRQb2xpY3lGb3JPcmdhbml6YXRpb24ocG9saWN5VHlwZTogUG9saWN5VHlwZSwgb3JnYW5pemF0aW9uSWQ6IHN0cmluZyk6IFByb21pc2U8UG9saWN5PiB7XG4gICAgICAgIGNvbnN0IG9yZyA9IGF3YWl0IHRoaXMudXNlclNlcnZpY2UuZ2V0T3JnYW5pemF0aW9uKG9yZ2FuaXphdGlvbklkKTtcbiAgICAgICAgaWYgKG9yZz8uaXNQcm92aWRlclVzZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IG9yZ1BvbGljaWVzID0gYXdhaXQgdGhpcy5hcGlTZXJ2aWNlLmdldFBvbGljaWVzKG9yZ2FuaXphdGlvbklkKTtcbiAgICAgICAgICAgIGNvbnN0IHBvbGljeSA9IG9yZ1BvbGljaWVzLmRhdGEuZmluZChwID0+IHAub3JnYW5pemF0aW9uSWQgPT09IG9yZ2FuaXphdGlvbklkKTtcblxuICAgICAgICAgICAgaWYgKHBvbGljeSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBuZXcgUG9saWN5KG5ldyBQb2xpY3lEYXRhKHBvbGljeSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcG9saWNpZXMgPSBhd2FpdCB0aGlzLmdldEFsbChwb2xpY3lUeXBlKTtcbiAgICAgICAgcmV0dXJuIHBvbGljaWVzLmZpbmQocCA9PiBwLm9yZ2FuaXphdGlvbklkID09PSBvcmdhbml6YXRpb25JZCk7XG4gICAgfVxuXG4gICAgYXN5bmMgcmVwbGFjZShwb2xpY2llczogeyBbaWQ6IHN0cmluZ106IFBvbGljeURhdGE7IH0pOiBQcm9taXNlPGFueT4ge1xuICAgICAgICBjb25zdCB1c2VySWQgPSBhd2FpdCB0aGlzLnVzZXJTZXJ2aWNlLmdldFVzZXJJZCgpO1xuICAgICAgICBhd2FpdCB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNhdmUoS2V5cy5wb2xpY2llc1ByZWZpeCArIHVzZXJJZCwgcG9saWNpZXMpO1xuICAgICAgICB0aGlzLnBvbGljeUNhY2hlID0gbnVsbDtcbiAgICB9XG5cbiAgICBhc3luYyBjbGVhcih1c2VySWQ6IHN0cmluZyk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIGF3YWl0IHRoaXMuc3RvcmFnZVNlcnZpY2UucmVtb3ZlKEtleXMucG9saWNpZXNQcmVmaXggKyB1c2VySWQpO1xuICAgICAgICB0aGlzLnBvbGljeUNhY2hlID0gbnVsbDtcbiAgICB9XG5cbiAgICBhc3luYyBnZXRNYXN0ZXJQYXNzd29yZFBvbGljeU9wdGlvbnMocG9saWNpZXM/OiBQb2xpY3lbXSk6IFByb21pc2U8TWFzdGVyUGFzc3dvcmRQb2xpY3lPcHRpb25zPiB7XG4gICAgICAgIGxldCBlbmZvcmNlZE9wdGlvbnM6IE1hc3RlclBhc3N3b3JkUG9saWN5T3B0aW9ucyA9IG51bGw7XG5cbiAgICAgICAgaWYgKHBvbGljaWVzID09IG51bGwpIHtcbiAgICAgICAgICAgIHBvbGljaWVzID0gYXdhaXQgdGhpcy5nZXRBbGwoUG9saWN5VHlwZS5NYXN0ZXJQYXNzd29yZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwb2xpY2llcyA9IHBvbGljaWVzLmZpbHRlcihwID0+IHAudHlwZSA9PT0gUG9saWN5VHlwZS5NYXN0ZXJQYXNzd29yZCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocG9saWNpZXMgPT0gbnVsbCB8fCBwb2xpY2llcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBlbmZvcmNlZE9wdGlvbnM7XG4gICAgICAgIH1cblxuICAgICAgICBwb2xpY2llcy5mb3JFYWNoKGN1cnJlbnRQb2xpY3kgPT4ge1xuICAgICAgICAgICAgaWYgKCFjdXJyZW50UG9saWN5LmVuYWJsZWQgfHwgY3VycmVudFBvbGljeS5kYXRhID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChlbmZvcmNlZE9wdGlvbnMgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGVuZm9yY2VkT3B0aW9ucyA9IG5ldyBNYXN0ZXJQYXNzd29yZFBvbGljeU9wdGlvbnMoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGN1cnJlbnRQb2xpY3kuZGF0YS5taW5Db21wbGV4aXR5ICE9IG51bGxcbiAgICAgICAgICAgICAgICAmJiBjdXJyZW50UG9saWN5LmRhdGEubWluQ29tcGxleGl0eSA+IGVuZm9yY2VkT3B0aW9ucy5taW5Db21wbGV4aXR5KSB7XG4gICAgICAgICAgICAgICAgZW5mb3JjZWRPcHRpb25zLm1pbkNvbXBsZXhpdHkgPSBjdXJyZW50UG9saWN5LmRhdGEubWluQ29tcGxleGl0eTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGN1cnJlbnRQb2xpY3kuZGF0YS5taW5MZW5ndGggIT0gbnVsbFxuICAgICAgICAgICAgICAgICYmIGN1cnJlbnRQb2xpY3kuZGF0YS5taW5MZW5ndGggPiBlbmZvcmNlZE9wdGlvbnMubWluTGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgZW5mb3JjZWRPcHRpb25zLm1pbkxlbmd0aCA9IGN1cnJlbnRQb2xpY3kuZGF0YS5taW5MZW5ndGg7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjdXJyZW50UG9saWN5LmRhdGEucmVxdWlyZVVwcGVyKSB7XG4gICAgICAgICAgICAgICAgZW5mb3JjZWRPcHRpb25zLnJlcXVpcmVVcHBlciA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjdXJyZW50UG9saWN5LmRhdGEucmVxdWlyZUxvd2VyKSB7XG4gICAgICAgICAgICAgICAgZW5mb3JjZWRPcHRpb25zLnJlcXVpcmVMb3dlciA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjdXJyZW50UG9saWN5LmRhdGEucmVxdWlyZU51bWJlcnMpIHtcbiAgICAgICAgICAgICAgICBlbmZvcmNlZE9wdGlvbnMucmVxdWlyZU51bWJlcnMgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY3VycmVudFBvbGljeS5kYXRhLnJlcXVpcmVTcGVjaWFsKSB7XG4gICAgICAgICAgICAgICAgZW5mb3JjZWRPcHRpb25zLnJlcXVpcmVTcGVjaWFsID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGVuZm9yY2VkT3B0aW9ucztcbiAgICB9XG5cbiAgICBldmFsdWF0ZU1hc3RlclBhc3N3b3JkKHBhc3N3b3JkU3RyZW5ndGg6IG51bWJlciwgbmV3UGFzc3dvcmQ6IHN0cmluZyxcbiAgICAgICAgZW5mb3JjZWRQb2xpY3lPcHRpb25zOiBNYXN0ZXJQYXNzd29yZFBvbGljeU9wdGlvbnMpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKGVuZm9yY2VkUG9saWN5T3B0aW9ucyA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlbmZvcmNlZFBvbGljeU9wdGlvbnMubWluQ29tcGxleGl0eSA+IDAgJiYgZW5mb3JjZWRQb2xpY3lPcHRpb25zLm1pbkNvbXBsZXhpdHkgPiBwYXNzd29yZFN0cmVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZW5mb3JjZWRQb2xpY3lPcHRpb25zLm1pbkxlbmd0aCA+IDAgJiYgZW5mb3JjZWRQb2xpY3lPcHRpb25zLm1pbkxlbmd0aCA+IG5ld1Bhc3N3b3JkLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVuZm9yY2VkUG9saWN5T3B0aW9ucy5yZXF1aXJlVXBwZXIgJiYgbmV3UGFzc3dvcmQudG9Mb2NhbGVMb3dlckNhc2UoKSA9PT0gbmV3UGFzc3dvcmQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlbmZvcmNlZFBvbGljeU9wdGlvbnMucmVxdWlyZUxvd2VyICYmIG5ld1Bhc3N3b3JkLnRvTG9jYWxlVXBwZXJDYXNlKCkgPT09IG5ld1Bhc3N3b3JkKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZW5mb3JjZWRQb2xpY3lPcHRpb25zLnJlcXVpcmVOdW1iZXJzICYmICEoL1swLTldLy50ZXN0KG5ld1Bhc3N3b3JkKSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlbmZvcmNlZFBvbGljeU9wdGlvbnMucmVxdWlyZVNwZWNpYWwgJiYgISgvWyFAIyQlXFxeJipdL2cudGVzdChuZXdQYXNzd29yZCkpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBnZXRSZXNldFBhc3N3b3JkUG9saWN5T3B0aW9ucyhwb2xpY2llczogUG9saWN5W10sIG9yZ0lkOiBzdHJpbmcpOiBbUmVzZXRQYXNzd29yZFBvbGljeU9wdGlvbnMsIGJvb2xlYW5dIHtcbiAgICAgICAgY29uc3QgcmVzZXRQYXNzd29yZFBvbGljeU9wdGlvbnMgPSBuZXcgUmVzZXRQYXNzd29yZFBvbGljeU9wdGlvbnMoKTtcblxuICAgICAgICBpZiAocG9saWNpZXMgPT0gbnVsbCB8fCBvcmdJZCA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gW3Jlc2V0UGFzc3dvcmRQb2xpY3lPcHRpb25zLCBmYWxzZV07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwb2xpY3kgPSBwb2xpY2llcy5maW5kKHAgPT4gcC5vcmdhbml6YXRpb25JZCA9PT0gb3JnSWQgJiYgcC50eXBlID09PSBQb2xpY3lUeXBlLlJlc2V0UGFzc3dvcmQgJiYgcC5lbmFibGVkKTtcbiAgICAgICAgcmVzZXRQYXNzd29yZFBvbGljeU9wdGlvbnMuYXV0b0Vucm9sbEVuYWJsZWQgPSBwb2xpY3k/LmRhdGE/LmF1dG9FbnJvbGxFbmFibGVkID8/IGZhbHNlO1xuXG4gICAgICAgIHJldHVybiBbcmVzZXRQYXNzd29yZFBvbGljeU9wdGlvbnMsIHBvbGljeT8uZW5hYmxlZCA/PyBmYWxzZV07XG4gICAgfVxuXG4gICAgbWFwUG9saWNpZXNGcm9tVG9rZW4ocG9saWNpZXNSZXNwb25zZTogTGlzdFJlc3BvbnNlPFBvbGljeVJlc3BvbnNlPik6IFBvbGljeVtdIHtcbiAgICAgICAgaWYgKHBvbGljaWVzUmVzcG9uc2UgPT0gbnVsbCB8fCBwb2xpY2llc1Jlc3BvbnNlLmRhdGEgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwb2xpY2llc0RhdGEgPSBwb2xpY2llc1Jlc3BvbnNlLmRhdGEubWFwKHAgPT4gbmV3IFBvbGljeURhdGEocCkpO1xuICAgICAgICByZXR1cm4gcG9saWNpZXNEYXRhLm1hcChwID0+IG5ldyBQb2xpY3kocCkpO1xuICAgIH1cblxuICAgIGFzeW5jIHBvbGljeUFwcGxpZXNUb1VzZXIocG9saWN5VHlwZTogUG9saWN5VHlwZSwgcG9saWN5RmlsdGVyPzogKHBvbGljeTogUG9saWN5KSA9PiBib29sZWFuKSB7XG4gICAgICAgIGNvbnN0IHBvbGljaWVzID0gYXdhaXQgdGhpcy5nZXRBbGwocG9saWN5VHlwZSk7XG4gICAgICAgIGNvbnN0IG9yZ2FuaXphdGlvbnMgPSBhd2FpdCB0aGlzLnVzZXJTZXJ2aWNlLmdldEFsbE9yZ2FuaXphdGlvbnMoKTtcbiAgICAgICAgbGV0IGZpbHRlcmVkUG9saWNpZXM7XG5cbiAgICAgICAgaWYgKHBvbGljeUZpbHRlciAhPSBudWxsKSB7XG4gICAgICAgICAgICBmaWx0ZXJlZFBvbGljaWVzID0gcG9saWNpZXMuZmlsdGVyKHAgPT4gcC5lbmFibGVkICYmIHBvbGljeUZpbHRlcihwKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBmaWx0ZXJlZFBvbGljaWVzID0gcG9saWNpZXMuZmlsdGVyKHAgPT4gcC5lbmFibGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBvbGljeVNldCA9IG5ldyBTZXQoZmlsdGVyZWRQb2xpY2llcy5tYXAocCA9PiBwLm9yZ2FuaXphdGlvbklkKSk7XG5cbiAgICAgICAgcmV0dXJuIG9yZ2FuaXphdGlvbnMuc29tZShvID0+XG4gICAgICAgICAgICBvLmVuYWJsZWQgJiZcbiAgICAgICAgICAgIG8uc3RhdHVzID49IE9yZ2FuaXphdGlvblVzZXJTdGF0dXNUeXBlLkFjY2VwdGVkICYmXG4gICAgICAgICAgICBvLnVzZVBvbGljaWVzICYmXG4gICAgICAgICAgICAhdGhpcy5pc0V4Y2VtcHRGcm9tUG9saWNpZXMobywgcG9saWN5VHlwZSkgJiZcbiAgICAgICAgICAgIHBvbGljeVNldC5oYXMoby5pZCkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNFeGNlbXB0RnJvbVBvbGljaWVzKG9yZ2FuaXphdGlvbjogT3JnYW5pemF0aW9uLCBwb2xpY3lUeXBlOiBQb2xpY3lUeXBlKSB7XG4gICAgICAgIGlmIChwb2xpY3lUeXBlID09PSBQb2xpY3lUeXBlLk1heGltdW1WYXVsdFRpbWVvdXQpIHtcbiAgICAgICAgICAgIHJldHVybiBvcmdhbml6YXRpb24udHlwZSA9PT0gT3JnYW5pemF0aW9uVXNlclR5cGUuT3duZXI7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gb3JnYW5pemF0aW9uLmlzRXhlbXB0RnJvbVBvbGljaWVzO1xuICAgIH1cbn1cbiIsImltcG9ydCAqIGFzIGx1bnIgZnJvbSAnbHVucic7XG5cbmltcG9ydCB7IENpcGhlclZpZXcgfSBmcm9tICcuLi9tb2RlbHMvdmlldy9jaXBoZXJWaWV3JztcblxuaW1wb3J0IHsgQ2lwaGVyU2VydmljZSB9IGZyb20gJy4uL2Fic3RyYWN0aW9ucy9jaXBoZXIuc2VydmljZSc7XG5pbXBvcnQgeyBJMThuU2VydmljZSB9IGZyb20gJy4uL2Fic3RyYWN0aW9ucy9pMThuLnNlcnZpY2UnO1xuaW1wb3J0IHsgTG9nU2VydmljZSB9IGZyb20gJy4uL2Fic3RyYWN0aW9ucy9sb2cuc2VydmljZSc7XG5pbXBvcnQgeyBTZWFyY2hTZXJ2aWNlIGFzIFNlYXJjaFNlcnZpY2VBYnN0cmFjdGlvbiB9IGZyb20gJy4uL2Fic3RyYWN0aW9ucy9zZWFyY2guc2VydmljZSc7XG5cbmltcG9ydCB7IENpcGhlclR5cGUgfSBmcm9tICcuLi9lbnVtcy9jaXBoZXJUeXBlJztcbmltcG9ydCB7IEZpZWxkVHlwZSB9IGZyb20gJy4uL2VudW1zL2ZpZWxkVHlwZSc7XG5pbXBvcnQgeyBVcmlNYXRjaFR5cGUgfSBmcm9tICcuLi9lbnVtcy91cmlNYXRjaFR5cGUnO1xuaW1wb3J0IHsgU2VuZFZpZXcgfSBmcm9tICcuLi9tb2RlbHMvdmlldy9zZW5kVmlldyc7XG5cbmV4cG9ydCBjbGFzcyBTZWFyY2hTZXJ2aWNlIGltcGxlbWVudHMgU2VhcmNoU2VydmljZUFic3RyYWN0aW9uIHtcbiAgICBpbmRleGVkRW50aXR5SWQ/OiBzdHJpbmcgPSBudWxsO1xuICAgIHByaXZhdGUgaW5kZXhpbmcgPSBmYWxzZTtcbiAgICBwcml2YXRlIGluZGV4OiBsdW5yLkluZGV4ID0gbnVsbDtcbiAgICBwcml2YXRlIHNlYXJjaGFibGVNaW5MZW5ndGggPSAyO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBjaXBoZXJTZXJ2aWNlOiBDaXBoZXJTZXJ2aWNlLCBwcml2YXRlIGxvZ1NlcnZpY2U6IExvZ1NlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgaTE4blNlcnZpY2U6IEkxOG5TZXJ2aWNlKSB7XG4gICAgICAgIGlmIChbJ3poLUNOJywgJ3poLVRXJ10uaW5kZXhPZihpMThuU2VydmljZS5sb2NhbGUpICE9PSAtMSkge1xuICAgICAgICAgICAgdGhpcy5zZWFyY2hhYmxlTWluTGVuZ3RoID0gMTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNsZWFySW5kZXgoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaW5kZXhlZEVudGl0eUlkID0gbnVsbDtcbiAgICAgICAgdGhpcy5pbmRleCA9IG51bGw7XG4gICAgfVxuXG4gICAgaXNTZWFyY2hhYmxlKHF1ZXJ5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3Qgbm90U2VhcmNoYWJsZSA9IHF1ZXJ5ID09IG51bGwgfHwgKHRoaXMuaW5kZXggPT0gbnVsbCAmJiBxdWVyeS5sZW5ndGggPCB0aGlzLnNlYXJjaGFibGVNaW5MZW5ndGgpIHx8XG4gICAgICAgICAgICAodGhpcy5pbmRleCAhPSBudWxsICYmIHF1ZXJ5Lmxlbmd0aCA8IHRoaXMuc2VhcmNoYWJsZU1pbkxlbmd0aCAmJiBxdWVyeS5pbmRleE9mKCc+JykgIT09IDApO1xuICAgICAgICByZXR1cm4gIW5vdFNlYXJjaGFibGU7XG4gICAgfVxuXG4gICAgYXN5bmMgaW5kZXhDaXBoZXJzKGluZGV4ZWRFbnRpdHlJZD86IHN0cmluZywgY2lwaGVycz86IENpcGhlclZpZXdbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy5pbmRleGluZykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5sb2dTZXJ2aWNlLnRpbWUoJ3NlYXJjaCBpbmRleGluZycpO1xuICAgICAgICB0aGlzLmluZGV4aW5nID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5pbmRleGVkRW50aXR5SWQgPSBpbmRleGVkRW50aXR5SWQ7XG4gICAgICAgIHRoaXMuaW5kZXggPSBudWxsO1xuICAgICAgICBjb25zdCBidWlsZGVyID0gbmV3IGx1bnIuQnVpbGRlcigpO1xuICAgICAgICBidWlsZGVyLnJlZignaWQnKTtcbiAgICAgICAgYnVpbGRlci5maWVsZCgnc2hvcnRpZCcsIHsgYm9vc3Q6IDEwMCwgZXh0cmFjdG9yOiAoYzogQ2lwaGVyVmlldykgPT4gYy5pZC5zdWJzdHIoMCwgOCkgfSk7XG4gICAgICAgIGJ1aWxkZXIuZmllbGQoJ25hbWUnLCB7IGJvb3N0OiAxMCB9KTtcbiAgICAgICAgYnVpbGRlci5maWVsZCgnc3VidGl0bGUnLCB7XG4gICAgICAgICAgICBib29zdDogNSxcbiAgICAgICAgICAgIGV4dHJhY3RvcjogKGM6IENpcGhlclZpZXcpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoYy5zdWJUaXRsZSAhPSBudWxsICYmIGMudHlwZSA9PT0gQ2lwaGVyVHlwZS5DYXJkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjLnN1YlRpdGxlLnJlcGxhY2UoL1xcKi9nLCAnJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBjLnN1YlRpdGxlO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIGJ1aWxkZXIuZmllbGQoJ25vdGVzJyk7XG4gICAgICAgIGJ1aWxkZXIuZmllbGQoJ2xvZ2luLnVzZXJuYW1lJywge1xuICAgICAgICAgICAgZXh0cmFjdG9yOiAoYzogQ2lwaGVyVmlldykgPT4gYy50eXBlID09PSBDaXBoZXJUeXBlLkxvZ2luICYmIGMubG9naW4gIT0gbnVsbCA/IGMubG9naW4udXNlcm5hbWUgOiBudWxsLFxuICAgICAgICB9KTtcbiAgICAgICAgYnVpbGRlci5maWVsZCgnbG9naW4udXJpcycsIHsgYm9vc3Q6IDIsIGV4dHJhY3RvcjogKGM6IENpcGhlclZpZXcpID0+IHRoaXMudXJpRXh0cmFjdG9yKGMpIH0pO1xuICAgICAgICBidWlsZGVyLmZpZWxkKCdmaWVsZHMnLCB7IGV4dHJhY3RvcjogKGM6IENpcGhlclZpZXcpID0+IHRoaXMuZmllbGRFeHRyYWN0b3IoYywgZmFsc2UpIH0pO1xuICAgICAgICBidWlsZGVyLmZpZWxkKCdmaWVsZHNfam9pbmVkJywgeyBleHRyYWN0b3I6IChjOiBDaXBoZXJWaWV3KSA9PiB0aGlzLmZpZWxkRXh0cmFjdG9yKGMsIHRydWUpIH0pO1xuICAgICAgICBidWlsZGVyLmZpZWxkKCdhdHRhY2htZW50cycsIHsgZXh0cmFjdG9yOiAoYzogQ2lwaGVyVmlldykgPT4gdGhpcy5hdHRhY2htZW50RXh0cmFjdG9yKGMsIGZhbHNlKSB9KTtcbiAgICAgICAgYnVpbGRlci5maWVsZCgnYXR0YWNobWVudHNfam9pbmVkJyxcbiAgICAgICAgICAgIHsgZXh0cmFjdG9yOiAoYzogQ2lwaGVyVmlldykgPT4gdGhpcy5hdHRhY2htZW50RXh0cmFjdG9yKGMsIHRydWUpIH0pO1xuICAgICAgICBidWlsZGVyLmZpZWxkKCdvcmdhbml6YXRpb25pZCcsIHsgZXh0cmFjdG9yOiAoYzogQ2lwaGVyVmlldykgPT4gYy5vcmdhbml6YXRpb25JZCB9KTtcbiAgICAgICAgY2lwaGVycyA9IGNpcGhlcnMgfHwgYXdhaXQgdGhpcy5jaXBoZXJTZXJ2aWNlLmdldEFsbERlY3J5cHRlZCgpO1xuICAgICAgICBjaXBoZXJzLmZvckVhY2goYyA9PiBidWlsZGVyLmFkZChjKSk7XG4gICAgICAgIHRoaXMuaW5kZXggPSBidWlsZGVyLmJ1aWxkKCk7XG5cbiAgICAgICAgdGhpcy5pbmRleGluZyA9IGZhbHNlO1xuXG4gICAgICAgIHRoaXMubG9nU2VydmljZS50aW1lRW5kKCdzZWFyY2ggaW5kZXhpbmcnKTtcbiAgICB9XG5cbiAgICBhc3luYyBzZWFyY2hDaXBoZXJzKHF1ZXJ5OiBzdHJpbmcsXG4gICAgICAgIGZpbHRlcjogKCgoY2lwaGVyOiBDaXBoZXJWaWV3KSA9PiBib29sZWFuKSB8ICgoKGNpcGhlcjogQ2lwaGVyVmlldykgPT4gYm9vbGVhbilbXSkpID0gbnVsbCxcbiAgICAgICAgY2lwaGVyczogQ2lwaGVyVmlld1tdID0gbnVsbCk6XG4gICAgICAgIFByb21pc2U8Q2lwaGVyVmlld1tdPiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdHM6IENpcGhlclZpZXdbXSA9IFtdO1xuICAgICAgICBpZiAocXVlcnkgIT0gbnVsbCkge1xuICAgICAgICAgICAgcXVlcnkgPSBxdWVyeS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocXVlcnkgPT09ICcnKSB7XG4gICAgICAgICAgICBxdWVyeSA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2lwaGVycyA9PSBudWxsKSB7XG4gICAgICAgICAgICBjaXBoZXJzID0gYXdhaXQgdGhpcy5jaXBoZXJTZXJ2aWNlLmdldEFsbERlY3J5cHRlZCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZpbHRlciAhPSBudWxsICYmIEFycmF5LmlzQXJyYXkoZmlsdGVyKSAmJiBmaWx0ZXIubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY2lwaGVycyA9IGNpcGhlcnMuZmlsdGVyKGMgPT4gZmlsdGVyLmV2ZXJ5KGYgPT4gZiA9PSBudWxsIHx8IGYoYykpKTtcbiAgICAgICAgfSBlbHNlIGlmIChmaWx0ZXIgIT0gbnVsbCkge1xuICAgICAgICAgICAgY2lwaGVycyA9IGNpcGhlcnMuZmlsdGVyKGZpbHRlciBhcyAoY2lwaGVyOiBDaXBoZXJWaWV3KSA9PiBib29sZWFuKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5pc1NlYXJjaGFibGUocXVlcnkpKSB7XG4gICAgICAgICAgICByZXR1cm4gY2lwaGVycztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmluZGV4aW5nKSB7XG4gICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyID0+IHNldFRpbWVvdXQociwgMjUwKSk7XG4gICAgICAgICAgICBpZiAodGhpcy5pbmRleGluZykge1xuICAgICAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHIgPT4gc2V0VGltZW91dChyLCA1MDApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5nZXRJbmRleEZvclNlYXJjaCgpO1xuICAgICAgICBpZiAoaW5kZXggPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gRmFsbCBiYWNrIHRvIGJhc2ljIHNlYXJjaCBpZiBpbmRleCBpcyBub3QgYXZhaWxhYmxlXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zZWFyY2hDaXBoZXJzQmFzaWMoY2lwaGVycywgcXVlcnkpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2lwaGVyc01hcCA9IG5ldyBNYXA8c3RyaW5nLCBDaXBoZXJWaWV3PigpO1xuICAgICAgICBjaXBoZXJzLmZvckVhY2goYyA9PiBjaXBoZXJzTWFwLnNldChjLmlkLCBjKSk7XG5cbiAgICAgICAgbGV0IHNlYXJjaFJlc3VsdHM6IGx1bnIuSW5kZXguUmVzdWx0W10gPSBudWxsO1xuICAgICAgICBjb25zdCBpc1F1ZXJ5U3RyaW5nID0gcXVlcnkgIT0gbnVsbCAmJiBxdWVyeS5sZW5ndGggPiAxICYmIHF1ZXJ5LmluZGV4T2YoJz4nKSA9PT0gMDtcbiAgICAgICAgaWYgKGlzUXVlcnlTdHJpbmcpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgc2VhcmNoUmVzdWx0cyA9IGluZGV4LnNlYXJjaChxdWVyeS5zdWJzdHIoMSkudHJpbSgpKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ1NlcnZpY2UuZXJyb3IoZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAgICAgICAgIGNvbnN0IHNvV2lsZCA9IGx1bnIuUXVlcnkud2lsZGNhcmQuTEVBRElORyB8IGx1bnIuUXVlcnkud2lsZGNhcmQuVFJBSUxJTkc7XG4gICAgICAgICAgICBzZWFyY2hSZXN1bHRzID0gaW5kZXgucXVlcnkocSA9PiB7XG4gICAgICAgICAgICAgICAgbHVuci50b2tlbml6ZXIocXVlcnkpLmZvckVhY2godG9rZW4gPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0ID0gdG9rZW4udG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgcS50ZXJtKHQsIHsgZmllbGRzOiBbJ25hbWUnXSwgd2lsZGNhcmQ6IHNvV2lsZCB9KTtcbiAgICAgICAgICAgICAgICAgICAgcS50ZXJtKHQsIHsgZmllbGRzOiBbJ3N1YnRpdGxlJ10sIHdpbGRjYXJkOiBzb1dpbGQgfSk7XG4gICAgICAgICAgICAgICAgICAgIHEudGVybSh0LCB7IGZpZWxkczogWydsb2dpbi51cmlzJ10sIHdpbGRjYXJkOiBzb1dpbGQgfSk7XG4gICAgICAgICAgICAgICAgICAgIHEudGVybSh0LCB7fSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzZWFyY2hSZXN1bHRzICE9IG51bGwpIHtcbiAgICAgICAgICAgIHNlYXJjaFJlc3VsdHMuZm9yRWFjaChyID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY2lwaGVyc01hcC5oYXMoci5yZWYpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaChjaXBoZXJzTWFwLmdldChyLnJlZikpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHRzO1xuICAgIH1cblxuICAgIHNlYXJjaENpcGhlcnNCYXNpYyhjaXBoZXJzOiBDaXBoZXJWaWV3W10sIHF1ZXJ5OiBzdHJpbmcsIGRlbGV0ZWQ6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgICAgICBxdWVyeSA9IHF1ZXJ5LnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICByZXR1cm4gY2lwaGVycy5maWx0ZXIoYyA9PiB7XG4gICAgICAgICAgICBpZiAoZGVsZXRlZCAhPT0gYy5pc0RlbGV0ZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYy5uYW1lICE9IG51bGwgJiYgYy5uYW1lLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihxdWVyeSkgPiAtMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHF1ZXJ5Lmxlbmd0aCA+PSA4ICYmIGMuaWQuc3RhcnRzV2l0aChxdWVyeSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjLnN1YlRpdGxlICE9IG51bGwgJiYgYy5zdWJUaXRsZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YocXVlcnkpID4gLTEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjLmxvZ2luICYmIGMubG9naW4udXJpICE9IG51bGwgJiYgYy5sb2dpbi51cmkudG9Mb3dlckNhc2UoKS5pbmRleE9mKHF1ZXJ5KSA+IC0xKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHNlYXJjaFNlbmRzKHNlbmRzOiBTZW5kVmlld1tdLCBxdWVyeTogc3RyaW5nKSB7XG4gICAgICAgIHF1ZXJ5ID0gcXVlcnkudHJpbSgpLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgcmV0dXJuIHNlbmRzLmZpbHRlcihzID0+IHtcbiAgICAgICAgICAgIGlmIChzLm5hbWUgIT0gbnVsbCAmJiBzLm5hbWUudG9Mb3dlckNhc2UoKS5pbmRleE9mKHF1ZXJ5KSA+IC0xKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocXVlcnkubGVuZ3RoID49IDggJiYgKHMuaWQuc3RhcnRzV2l0aChxdWVyeSkgfHwgcy5hY2Nlc3NJZC50b0xvY2FsZUxvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgocXVlcnkpIHx8IChzLmZpbGU/LmlkICE9IG51bGwgJiYgcy5maWxlLmlkLnN0YXJ0c1dpdGgocXVlcnkpKSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzLm5vdGVzICE9IG51bGwgJiYgcy5ub3Rlcy50b0xvd2VyQ2FzZSgpLmluZGV4T2YocXVlcnkpID4gLTEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzLnRleHQ/LnRleHQgIT0gbnVsbCAmJiBzLnRleHQudGV4dC50b0xvd2VyQ2FzZSgpLmluZGV4T2YocXVlcnkpID4gLTEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzLmZpbGU/LmZpbGVOYW1lICE9IG51bGwgJiYgcy5maWxlLmZpbGVOYW1lLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihxdWVyeSkgPiAtMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBnZXRJbmRleEZvclNlYXJjaCgpOiBsdW5yLkluZGV4IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5kZXg7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmaWVsZEV4dHJhY3RvcihjOiBDaXBoZXJWaWV3LCBqb2luZWQ6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKCFjLmhhc0ZpZWxkcykge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGZpZWxkczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgYy5maWVsZHMuZm9yRWFjaChmID0+IHtcbiAgICAgICAgICAgIGlmIChmLm5hbWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGZpZWxkcy5wdXNoKGYubmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZi50eXBlID09PSBGaWVsZFR5cGUuVGV4dCAmJiBmLnZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBmaWVsZHMucHVzaChmLnZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGZpZWxkcyA9IGZpZWxkcy5maWx0ZXIoZiA9PiBmLnRyaW0oKSAhPT0gJycpO1xuICAgICAgICBpZiAoZmllbGRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGpvaW5lZCA/IGZpZWxkcy5qb2luKCcgJykgOiBmaWVsZHM7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhdHRhY2htZW50RXh0cmFjdG9yKGM6IENpcGhlclZpZXcsIGpvaW5lZDogYm9vbGVhbikge1xuICAgICAgICBpZiAoIWMuaGFzQXR0YWNobWVudHMpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGxldCBhdHRhY2htZW50czogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgYy5hdHRhY2htZW50cy5mb3JFYWNoKGEgPT4ge1xuICAgICAgICAgICAgaWYgKGEgIT0gbnVsbCAmJiBhLmZpbGVOYW1lICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBpZiAoam9pbmVkICYmIGEuZmlsZU5hbWUuaW5kZXhPZignLicpID4gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgYXR0YWNobWVudHMucHVzaChhLmZpbGVOYW1lLnN1YnN0cigwLCBhLmZpbGVOYW1lLmxhc3RJbmRleE9mKCcuJykpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBhdHRhY2htZW50cy5wdXNoKGEuZmlsZU5hbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGF0dGFjaG1lbnRzID0gYXR0YWNobWVudHMuZmlsdGVyKGYgPT4gZi50cmltKCkgIT09ICcnKTtcbiAgICAgICAgaWYgKGF0dGFjaG1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGpvaW5lZCA/IGF0dGFjaG1lbnRzLmpvaW4oJyAnKSA6IGF0dGFjaG1lbnRzO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXJpRXh0cmFjdG9yKGM6IENpcGhlclZpZXcpIHtcbiAgICAgICAgaWYgKGMudHlwZSAhPT0gQ2lwaGVyVHlwZS5Mb2dpbiB8fCBjLmxvZ2luID09IG51bGwgfHwgIWMubG9naW4uaGFzVXJpcykge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXJpczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgYy5sb2dpbi51cmlzLmZvckVhY2godSA9PiB7XG4gICAgICAgICAgICBpZiAodS51cmkgPT0gbnVsbCB8fCB1LnVyaSA9PT0gJycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodS5ob3N0bmFtZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdXJpcy5wdXNoKHUuaG9zdG5hbWUpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCB1cmkgPSB1LnVyaTtcbiAgICAgICAgICAgIGlmICh1Lm1hdGNoICE9PSBVcmlNYXRjaFR5cGUuUmVndWxhckV4cHJlc3Npb24pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwcm90b2NvbEluZGV4ID0gdXJpLmluZGV4T2YoJzovLycpO1xuICAgICAgICAgICAgICAgIGlmIChwcm90b2NvbEluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgdXJpID0gdXJpLnN1YnN0cihwcm90b2NvbEluZGV4ICsgMyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHF1ZXJ5SW5kZXggPSB1cmkuc2VhcmNoKC9cXD98JnwjLyk7XG4gICAgICAgICAgICAgICAgaWYgKHF1ZXJ5SW5kZXggPiAtMSkge1xuICAgICAgICAgICAgICAgICAgICB1cmkgPSB1cmkuc3Vic3RyaW5nKDAsIHF1ZXJ5SW5kZXgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHVyaXMucHVzaCh1cmkpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHVyaXMubGVuZ3RoID4gMCA/IHVyaXMgOiBudWxsO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IFNlbmREYXRhIH0gZnJvbSAnLi4vbW9kZWxzL2RhdGEvc2VuZERhdGEnO1xuXG5pbXBvcnQgeyBTZW5kUmVxdWVzdCB9IGZyb20gJy4uL21vZGVscy9yZXF1ZXN0L3NlbmRSZXF1ZXN0JztcblxuaW1wb3J0IHsgRXJyb3JSZXNwb25zZSB9IGZyb20gJy4uL21vZGVscy9yZXNwb25zZS9lcnJvclJlc3BvbnNlJztcbmltcG9ydCB7IFNlbmRSZXNwb25zZSB9IGZyb20gJy4uL21vZGVscy9yZXNwb25zZS9zZW5kUmVzcG9uc2UnO1xuXG5pbXBvcnQgeyBFbmNBcnJheUJ1ZmZlciB9IGZyb20gJy4uL21vZGVscy9kb21haW4vZW5jQXJyYXlCdWZmZXInO1xuaW1wb3J0IHsgRW5jU3RyaW5nIH0gZnJvbSAnLi4vbW9kZWxzL2RvbWFpbi9lbmNTdHJpbmcnO1xuaW1wb3J0IHsgU2VuZCB9IGZyb20gJy4uL21vZGVscy9kb21haW4vc2VuZCc7XG5pbXBvcnQgeyBTZW5kRmlsZSB9IGZyb20gJy4uL21vZGVscy9kb21haW4vc2VuZEZpbGUnO1xuaW1wb3J0IHsgU2VuZFRleHQgfSBmcm9tICcuLi9tb2RlbHMvZG9tYWluL3NlbmRUZXh0JztcbmltcG9ydCB7IFN5bW1ldHJpY0NyeXB0b0tleSB9IGZyb20gJy4uL21vZGVscy9kb21haW4vc3ltbWV0cmljQ3J5cHRvS2V5JztcblxuaW1wb3J0IHsgRmlsZVVwbG9hZFR5cGUgfSBmcm9tICcuLi9lbnVtcy9maWxlVXBsb2FkVHlwZSc7XG5pbXBvcnQgeyBTZW5kVHlwZSB9IGZyb20gJy4uL2VudW1zL3NlbmRUeXBlJztcblxuaW1wb3J0IHsgU2VuZFZpZXcgfSBmcm9tICcuLi9tb2RlbHMvdmlldy9zZW5kVmlldyc7XG5cbmltcG9ydCB7IEFwaVNlcnZpY2UgfSBmcm9tICcuLi9hYnN0cmFjdGlvbnMvYXBpLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ3J5cHRvU2VydmljZSB9IGZyb20gJy4uL2Fic3RyYWN0aW9ucy9jcnlwdG8uc2VydmljZSc7XG5pbXBvcnQgeyBDcnlwdG9GdW5jdGlvblNlcnZpY2UgfSBmcm9tICcuLi9hYnN0cmFjdGlvbnMvY3J5cHRvRnVuY3Rpb24uc2VydmljZSc7XG5pbXBvcnQgeyBGaWxlVXBsb2FkU2VydmljZSB9IGZyb20gJy4uL2Fic3RyYWN0aW9ucy9maWxlVXBsb2FkLnNlcnZpY2UnO1xuaW1wb3J0IHsgSTE4blNlcnZpY2UgfSBmcm9tICcuLi9hYnN0cmFjdGlvbnMvaTE4bi5zZXJ2aWNlJztcbmltcG9ydCB7IFNlbmRTZXJ2aWNlIGFzIFNlbmRTZXJ2aWNlQWJzdHJhY3Rpb24gfSBmcm9tICcuLi9hYnN0cmFjdGlvbnMvc2VuZC5zZXJ2aWNlJztcbmltcG9ydCB7IFN0b3JhZ2VTZXJ2aWNlIH0gZnJvbSAnLi4vYWJzdHJhY3Rpb25zL3N0b3JhZ2Uuc2VydmljZSc7XG5pbXBvcnQgeyBVc2VyU2VydmljZSB9IGZyb20gJy4uL2Fic3RyYWN0aW9ucy91c2VyLnNlcnZpY2UnO1xuXG5pbXBvcnQgeyBVdGlscyB9IGZyb20gJy4uL21pc2MvdXRpbHMnO1xuXG5jb25zdCBLZXlzID0ge1xuICAgIHNlbmRzUHJlZml4OiAnc2VuZHNfJyxcbn07XG5cbmV4cG9ydCBjbGFzcyBTZW5kU2VydmljZSBpbXBsZW1lbnRzIFNlbmRTZXJ2aWNlQWJzdHJhY3Rpb24ge1xuICAgIGRlY3J5cHRlZFNlbmRDYWNoZTogU2VuZFZpZXdbXTtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgY3J5cHRvU2VydmljZTogQ3J5cHRvU2VydmljZSwgcHJpdmF0ZSB1c2VyU2VydmljZTogVXNlclNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgYXBpU2VydmljZTogQXBpU2VydmljZSwgcHJpdmF0ZSBmaWxlVXBsb2FkU2VydmljZTogRmlsZVVwbG9hZFNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgc3RvcmFnZVNlcnZpY2U6IFN0b3JhZ2VTZXJ2aWNlLCBwcml2YXRlIGkxOG5TZXJ2aWNlOiBJMThuU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBjcnlwdG9GdW5jdGlvblNlcnZpY2U6IENyeXB0b0Z1bmN0aW9uU2VydmljZSkgeyB9XG5cbiAgICBjbGVhckNhY2hlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmRlY3J5cHRlZFNlbmRDYWNoZSA9IG51bGw7XG4gICAgfVxuXG4gICAgYXN5bmMgZW5jcnlwdChtb2RlbDogU2VuZFZpZXcsIGZpbGU6IEZpbGUgfCBBcnJheUJ1ZmZlciwgcGFzc3dvcmQ6IHN0cmluZyxcbiAgICAgICAga2V5PzogU3ltbWV0cmljQ3J5cHRvS2V5KTogUHJvbWlzZTxbU2VuZCwgRW5jQXJyYXlCdWZmZXJdPiB7XG4gICAgICAgIGxldCBmaWxlRGF0YTogRW5jQXJyYXlCdWZmZXIgPSBudWxsO1xuICAgICAgICBjb25zdCBzZW5kID0gbmV3IFNlbmQoKTtcbiAgICAgICAgc2VuZC5pZCA9IG1vZGVsLmlkO1xuICAgICAgICBzZW5kLnR5cGUgPSBtb2RlbC50eXBlO1xuICAgICAgICBzZW5kLmRpc2FibGVkID0gbW9kZWwuZGlzYWJsZWQ7XG4gICAgICAgIHNlbmQuaGlkZUVtYWlsID0gbW9kZWwuaGlkZUVtYWlsO1xuICAgICAgICBzZW5kLm1heEFjY2Vzc0NvdW50ID0gbW9kZWwubWF4QWNjZXNzQ291bnQ7XG4gICAgICAgIGlmIChtb2RlbC5rZXkgPT0gbnVsbCkge1xuICAgICAgICAgICAgbW9kZWwua2V5ID0gYXdhaXQgdGhpcy5jcnlwdG9GdW5jdGlvblNlcnZpY2UucmFuZG9tQnl0ZXMoMTYpO1xuICAgICAgICAgICAgbW9kZWwuY3J5cHRvS2V5ID0gYXdhaXQgdGhpcy5jcnlwdG9TZXJ2aWNlLm1ha2VTZW5kS2V5KG1vZGVsLmtleSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhc3N3b3JkICE9IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhc3N3b3JkSGFzaCA9IGF3YWl0IHRoaXMuY3J5cHRvRnVuY3Rpb25TZXJ2aWNlLnBia2RmMihwYXNzd29yZCwgbW9kZWwua2V5LCAnc2hhMjU2JywgMTAwMDAwKTtcbiAgICAgICAgICAgIHNlbmQucGFzc3dvcmQgPSBVdGlscy5mcm9tQnVmZmVyVG9CNjQocGFzc3dvcmRIYXNoKTtcbiAgICAgICAgfVxuICAgICAgICBzZW5kLmtleSA9IGF3YWl0IHRoaXMuY3J5cHRvU2VydmljZS5lbmNyeXB0KG1vZGVsLmtleSwga2V5KTtcbiAgICAgICAgc2VuZC5uYW1lID0gYXdhaXQgdGhpcy5jcnlwdG9TZXJ2aWNlLmVuY3J5cHQobW9kZWwubmFtZSwgbW9kZWwuY3J5cHRvS2V5KTtcbiAgICAgICAgc2VuZC5ub3RlcyA9IGF3YWl0IHRoaXMuY3J5cHRvU2VydmljZS5lbmNyeXB0KG1vZGVsLm5vdGVzLCBtb2RlbC5jcnlwdG9LZXkpO1xuICAgICAgICBpZiAoc2VuZC50eXBlID09PSBTZW5kVHlwZS5UZXh0KSB7XG4gICAgICAgICAgICBzZW5kLnRleHQgPSBuZXcgU2VuZFRleHQoKTtcbiAgICAgICAgICAgIHNlbmQudGV4dC50ZXh0ID0gYXdhaXQgdGhpcy5jcnlwdG9TZXJ2aWNlLmVuY3J5cHQobW9kZWwudGV4dC50ZXh0LCBtb2RlbC5jcnlwdG9LZXkpO1xuICAgICAgICAgICAgc2VuZC50ZXh0LmhpZGRlbiA9IG1vZGVsLnRleHQuaGlkZGVuO1xuICAgICAgICB9IGVsc2UgaWYgKHNlbmQudHlwZSA9PT0gU2VuZFR5cGUuRmlsZSkge1xuICAgICAgICAgICAgc2VuZC5maWxlID0gbmV3IFNlbmRGaWxlKCk7XG4gICAgICAgICAgICBpZiAoZmlsZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKGZpbGUgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBbbmFtZSwgZGF0YV0gPSBhd2FpdCB0aGlzLmVuY3J5cHRGaWxlRGF0YShtb2RlbC5maWxlLmZpbGVOYW1lLCBmaWxlLCBtb2RlbC5jcnlwdG9LZXkpO1xuICAgICAgICAgICAgICAgICAgICBzZW5kLmZpbGUuZmlsZU5hbWUgPSBuYW1lO1xuICAgICAgICAgICAgICAgICAgICBmaWxlRGF0YSA9IGRhdGE7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZmlsZURhdGEgPSBhd2FpdCB0aGlzLnBhcnNlRmlsZShzZW5kLCBmaWxlLCBtb2RlbC5jcnlwdG9LZXkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBbc2VuZCwgZmlsZURhdGFdO1xuICAgIH1cblxuICAgIGFzeW5jIGdldChpZDogc3RyaW5nKTogUHJvbWlzZTxTZW5kPiB7XG4gICAgICAgIGNvbnN0IHVzZXJJZCA9IGF3YWl0IHRoaXMudXNlclNlcnZpY2UuZ2V0VXNlcklkKCk7XG4gICAgICAgIGNvbnN0IHNlbmRzID0gYXdhaXQgdGhpcy5zdG9yYWdlU2VydmljZS5nZXQ8eyBbaWQ6IHN0cmluZ106IFNlbmREYXRhOyB9PihcbiAgICAgICAgICAgIEtleXMuc2VuZHNQcmVmaXggKyB1c2VySWQpO1xuICAgICAgICBpZiAoc2VuZHMgPT0gbnVsbCB8fCAhc2VuZHMuaGFzT3duUHJvcGVydHkoaWQpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgU2VuZChzZW5kc1tpZF0pO1xuICAgIH1cblxuICAgIGFzeW5jIGdldEFsbCgpOiBQcm9taXNlPFNlbmRbXT4ge1xuICAgICAgICBjb25zdCB1c2VySWQgPSBhd2FpdCB0aGlzLnVzZXJTZXJ2aWNlLmdldFVzZXJJZCgpO1xuICAgICAgICBjb25zdCBzZW5kcyA9IGF3YWl0IHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0PHsgW2lkOiBzdHJpbmddOiBTZW5kRGF0YTsgfT4oXG4gICAgICAgICAgICBLZXlzLnNlbmRzUHJlZml4ICsgdXNlcklkKTtcbiAgICAgICAgY29uc3QgcmVzcG9uc2U6IFNlbmRbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGlkIGluIHNlbmRzKSB7XG4gICAgICAgICAgICBpZiAoc2VuZHMuaGFzT3duUHJvcGVydHkoaWQpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2UucHVzaChuZXcgU2VuZChzZW5kc1tpZF0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgfVxuXG4gICAgYXN5bmMgZ2V0QWxsRGVjcnlwdGVkKCk6IFByb21pc2U8U2VuZFZpZXdbXT4ge1xuICAgICAgICBpZiAodGhpcy5kZWNyeXB0ZWRTZW5kQ2FjaGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGVjcnlwdGVkU2VuZENhY2hlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaGFzS2V5ID0gYXdhaXQgdGhpcy5jcnlwdG9TZXJ2aWNlLmhhc0tleSgpO1xuICAgICAgICBpZiAoIWhhc0tleSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBrZXkuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkZWNTZW5kczogU2VuZFZpZXdbXSA9IFtdO1xuICAgICAgICBjb25zdCBwcm9taXNlczogUHJvbWlzZTxhbnk+W10gPSBbXTtcbiAgICAgICAgY29uc3Qgc2VuZHMgPSBhd2FpdCB0aGlzLmdldEFsbCgpO1xuICAgICAgICBzZW5kcy5mb3JFYWNoKHNlbmQgPT4ge1xuICAgICAgICAgICAgcHJvbWlzZXMucHVzaChzZW5kLmRlY3J5cHQoKS50aGVuKGYgPT4gZGVjU2VuZHMucHVzaChmKSkpO1xuICAgICAgICB9KTtcblxuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gICAgICAgIGRlY1NlbmRzLnNvcnQoVXRpbHMuZ2V0U29ydEZ1bmN0aW9uKHRoaXMuaTE4blNlcnZpY2UsICduYW1lJykpO1xuXG4gICAgICAgIHRoaXMuZGVjcnlwdGVkU2VuZENhY2hlID0gZGVjU2VuZHM7XG4gICAgICAgIHJldHVybiB0aGlzLmRlY3J5cHRlZFNlbmRDYWNoZTtcbiAgICB9XG5cbiAgICBhc3luYyBzYXZlV2l0aFNlcnZlcihzZW5kRGF0YTogW1NlbmQsIEVuY0FycmF5QnVmZmVyXSk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSBuZXcgU2VuZFJlcXVlc3Qoc2VuZERhdGFbMF0sIHNlbmREYXRhWzFdPy5idWZmZXIuYnl0ZUxlbmd0aCk7XG4gICAgICAgIGxldCByZXNwb25zZTogU2VuZFJlc3BvbnNlO1xuICAgICAgICBpZiAoc2VuZERhdGFbMF0uaWQgPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKHNlbmREYXRhWzBdLnR5cGUgPT09IFNlbmRUeXBlLlRleHQpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZSA9IGF3YWl0IHRoaXMuYXBpU2VydmljZS5wb3N0U2VuZChyZXF1ZXN0KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdXBsb2FkRGF0YVJlc3BvbnNlID0gYXdhaXQgdGhpcy5hcGlTZXJ2aWNlLnBvc3RGaWxlVHlwZVNlbmQocmVxdWVzdCk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gdXBsb2FkRGF0YVJlc3BvbnNlLnNlbmRSZXNwb25zZTtcblxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmZpbGVVcGxvYWRTZXJ2aWNlLnVwbG9hZFNlbmRGaWxlKHVwbG9hZERhdGFSZXNwb25zZSwgc2VuZERhdGFbMF0uZmlsZS5maWxlTmFtZSwgc2VuZERhdGFbMV0pO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBFcnJvclJlc3BvbnNlICYmIChlIGFzIEVycm9yUmVzcG9uc2UpLnN0YXR1c0NvZGUgPT09IDQwNCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmxlZ2FjeVNlcnZlclNlbmRGaWxlVXBsb2FkKHNlbmREYXRhLCByZXF1ZXN0KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlIGluc3RhbmNlb2YgRXJyb3JSZXNwb25zZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKChlIGFzIEVycm9yUmVzcG9uc2UpLmdldFNpbmdsZU1lc3NhZ2UoKSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2VuZERhdGFbMF0uaWQgPSByZXNwb25zZS5pZDtcbiAgICAgICAgICAgIHNlbmREYXRhWzBdLmFjY2Vzc0lkID0gcmVzcG9uc2UuYWNjZXNzSWQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXNwb25zZSA9IGF3YWl0IHRoaXMuYXBpU2VydmljZS5wdXRTZW5kKHNlbmREYXRhWzBdLmlkLCByZXF1ZXN0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHVzZXJJZCA9IGF3YWl0IHRoaXMudXNlclNlcnZpY2UuZ2V0VXNlcklkKCk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBuZXcgU2VuZERhdGEocmVzcG9uc2UsIHVzZXJJZCk7XG4gICAgICAgIGF3YWl0IHRoaXMudXBzZXJ0KGRhdGEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIE1hciAyNSAyMDIxOiBUaGlzIG1ldGhvZCBoYXMgYmVlbiBkZXByZWNhdGVkIGluIGZhdm9yIG9mIGRpcmVjdCB1cGxvYWRzLlxuICAgICAqIFRoaXMgbWV0aG9kIHN0aWxsIGV4aXN0cyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIG9sZCBzZXJ2ZXIgdmVyc2lvbnMuXG4gICAgICovXG4gICAgYXN5bmMgbGVnYWN5U2VydmVyU2VuZEZpbGVVcGxvYWQoc2VuZERhdGE6IFtTZW5kLCBFbmNBcnJheUJ1ZmZlcl0sIHJlcXVlc3Q6IFNlbmRSZXF1ZXN0KTogUHJvbWlzZTxTZW5kUmVzcG9uc2U+XG4gICAge1xuICAgICAgICBjb25zdCBmZCA9IG5ldyBGb3JtRGF0YSgpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtzZW5kRGF0YVsxXS5idWZmZXJdLCB7IHR5cGU6ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nIH0pO1xuICAgICAgICAgICAgZmQuYXBwZW5kKCdtb2RlbCcsIEpTT04uc3RyaW5naWZ5KHJlcXVlc3QpKTtcbiAgICAgICAgICAgIGZkLmFwcGVuZCgnZGF0YScsIGJsb2IsIHNlbmREYXRhWzBdLmZpbGUuZmlsZU5hbWUuZW5jcnlwdGVkU3RyaW5nKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgaWYgKFV0aWxzLmlzTm9kZSAmJiAhVXRpbHMuaXNCcm93c2VyKSB7XG4gICAgICAgICAgICAgICAgZmQuYXBwZW5kKCdtb2RlbCcsIEpTT04uc3RyaW5naWZ5KHJlcXVlc3QpKTtcbiAgICAgICAgICAgICAgICBmZC5hcHBlbmQoJ2RhdGEnLCBCdWZmZXIuZnJvbShzZW5kRGF0YVsxXS5idWZmZXIpIGFzIGFueSwge1xuICAgICAgICAgICAgICAgICAgICBmaWxlcGF0aDogc2VuZERhdGFbMF0uZmlsZS5maWxlTmFtZS5lbmNyeXB0ZWRTdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRUeXBlOiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJyxcbiAgICAgICAgICAgICAgICB9IGFzIGFueSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuYXBpU2VydmljZS5wb3N0U2VuZEZpbGVMZWdhY3koZmQpO1xuICAgIH1cblxuICAgIGFzeW5jIHVwc2VydChzZW5kOiBTZW5kRGF0YSB8IFNlbmREYXRhW10pOiBQcm9taXNlPGFueT4ge1xuICAgICAgICBjb25zdCB1c2VySWQgPSBhd2FpdCB0aGlzLnVzZXJTZXJ2aWNlLmdldFVzZXJJZCgpO1xuICAgICAgICBsZXQgc2VuZHMgPSBhd2FpdCB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldDx7IFtpZDogc3RyaW5nXTogU2VuZERhdGE7IH0+KFxuICAgICAgICAgICAgS2V5cy5zZW5kc1ByZWZpeCArIHVzZXJJZCk7XG4gICAgICAgIGlmIChzZW5kcyA9PSBudWxsKSB7XG4gICAgICAgICAgICBzZW5kcyA9IHt9O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNlbmQgaW5zdGFuY2VvZiBTZW5kRGF0YSkge1xuICAgICAgICAgICAgY29uc3QgcyA9IHNlbmQgYXMgU2VuZERhdGE7XG4gICAgICAgICAgICBzZW5kc1tzLmlkXSA9IHM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAoc2VuZCBhcyBTZW5kRGF0YVtdKS5mb3JFYWNoKHMgPT4ge1xuICAgICAgICAgICAgICAgIHNlbmRzW3MuaWRdID0gcztcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgdGhpcy5zdG9yYWdlU2VydmljZS5zYXZlKEtleXMuc2VuZHNQcmVmaXggKyB1c2VySWQsIHNlbmRzKTtcbiAgICAgICAgdGhpcy5kZWNyeXB0ZWRTZW5kQ2FjaGUgPSBudWxsO1xuICAgIH1cblxuICAgIGFzeW5jIHJlcGxhY2Uoc2VuZHM6IHsgW2lkOiBzdHJpbmddOiBTZW5kRGF0YTsgfSk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIGNvbnN0IHVzZXJJZCA9IGF3YWl0IHRoaXMudXNlclNlcnZpY2UuZ2V0VXNlcklkKCk7XG4gICAgICAgIGF3YWl0IHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2F2ZShLZXlzLnNlbmRzUHJlZml4ICsgdXNlcklkLCBzZW5kcyk7XG4gICAgICAgIHRoaXMuZGVjcnlwdGVkU2VuZENhY2hlID0gbnVsbDtcbiAgICB9XG5cbiAgICBhc3luYyBjbGVhcih1c2VySWQ6IHN0cmluZyk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIGF3YWl0IHRoaXMuc3RvcmFnZVNlcnZpY2UucmVtb3ZlKEtleXMuc2VuZHNQcmVmaXggKyB1c2VySWQpO1xuICAgICAgICB0aGlzLmRlY3J5cHRlZFNlbmRDYWNoZSA9IG51bGw7XG4gICAgfVxuXG4gICAgYXN5bmMgZGVsZXRlKGlkOiBzdHJpbmcgfCBzdHJpbmdbXSk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIGNvbnN0IHVzZXJJZCA9IGF3YWl0IHRoaXMudXNlclNlcnZpY2UuZ2V0VXNlcklkKCk7XG4gICAgICAgIGNvbnN0IHNlbmRzID0gYXdhaXQgdGhpcy5zdG9yYWdlU2VydmljZS5nZXQ8eyBbaWQ6IHN0cmluZ106IFNlbmREYXRhOyB9PihcbiAgICAgICAgICAgIEtleXMuc2VuZHNQcmVmaXggKyB1c2VySWQpO1xuICAgICAgICBpZiAoc2VuZHMgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBpZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGlmIChzZW5kc1tpZF0gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlbGV0ZSBzZW5kc1tpZF07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAoaWQgYXMgc3RyaW5nW10pLmZvckVhY2goaSA9PiB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIHNlbmRzW2ldO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNhdmUoS2V5cy5zZW5kc1ByZWZpeCArIHVzZXJJZCwgc2VuZHMpO1xuICAgICAgICB0aGlzLmRlY3J5cHRlZFNlbmRDYWNoZSA9IG51bGw7XG4gICAgfVxuXG4gICAgYXN5bmMgZGVsZXRlV2l0aFNlcnZlcihpZDogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5hcGlTZXJ2aWNlLmRlbGV0ZVNlbmQoaWQpO1xuICAgICAgICBhd2FpdCB0aGlzLmRlbGV0ZShpZCk7XG4gICAgfVxuXG4gICAgYXN5bmMgcmVtb3ZlUGFzc3dvcmRXaXRoU2VydmVyKGlkOiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuYXBpU2VydmljZS5wdXRTZW5kUmVtb3ZlUGFzc3dvcmQoaWQpO1xuICAgICAgICBjb25zdCB1c2VySWQgPSBhd2FpdCB0aGlzLnVzZXJTZXJ2aWNlLmdldFVzZXJJZCgpO1xuICAgICAgICBjb25zdCBkYXRhID0gbmV3IFNlbmREYXRhKHJlc3BvbnNlLCB1c2VySWQpO1xuICAgICAgICBhd2FpdCB0aGlzLnVwc2VydChkYXRhKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHBhcnNlRmlsZShzZW5kOiBTZW5kLCBmaWxlOiBGaWxlLCBrZXk6IFN5bW1ldHJpY0NyeXB0b0tleSk6IFByb21pc2U8RW5jQXJyYXlCdWZmZXI+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgICAgICAgICByZWFkZXIucmVhZEFzQXJyYXlCdWZmZXIoZmlsZSk7XG4gICAgICAgICAgICByZWFkZXIub25sb2FkID0gYXN5bmMgZXZ0ID0+IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBbbmFtZSwgZGF0YV0gPSBhd2FpdCB0aGlzLmVuY3J5cHRGaWxlRGF0YShmaWxlLm5hbWUsIGV2dC50YXJnZXQucmVzdWx0IGFzIEFycmF5QnVmZmVyLCBrZXkpO1xuICAgICAgICAgICAgICAgICAgICBzZW5kLmZpbGUuZmlsZU5hbWUgPSBuYW1lO1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZWFkZXIub25lcnJvciA9IGV2dCA9PiB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KCdFcnJvciByZWFkaW5nIGZpbGUuJyk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGVuY3J5cHRGaWxlRGF0YShmaWxlTmFtZTogc3RyaW5nLCBkYXRhOiBBcnJheUJ1ZmZlcixcbiAgICAgICAga2V5OiBTeW1tZXRyaWNDcnlwdG9LZXkpOiBQcm9taXNlPFtFbmNTdHJpbmcsIEVuY0FycmF5QnVmZmVyXT4ge1xuICAgICAgICBjb25zdCBlbmNGaWxlTmFtZSA9IGF3YWl0IHRoaXMuY3J5cHRvU2VydmljZS5lbmNyeXB0KGZpbGVOYW1lLCBrZXkpO1xuICAgICAgICBjb25zdCBlbmNGaWxlRGF0YSA9IGF3YWl0IHRoaXMuY3J5cHRvU2VydmljZS5lbmNyeXB0VG9CeXRlcyhkYXRhLCBrZXkpO1xuICAgICAgICByZXR1cm4gW2VuY0ZpbGVOYW1lLCBlbmNGaWxlRGF0YV07XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgU2V0dGluZ3NTZXJ2aWNlIGFzIFNldHRpbmdzU2VydmljZUFic3RyYWN0aW9uIH0gZnJvbSAnLi4vYWJzdHJhY3Rpb25zL3NldHRpbmdzLnNlcnZpY2UnO1xuaW1wb3J0IHsgU3RvcmFnZVNlcnZpY2UgfSBmcm9tICcuLi9hYnN0cmFjdGlvbnMvc3RvcmFnZS5zZXJ2aWNlJztcbmltcG9ydCB7IFVzZXJTZXJ2aWNlIH0gZnJvbSAnLi4vYWJzdHJhY3Rpb25zL3VzZXIuc2VydmljZSc7XG5cbmNvbnN0IEtleXMgPSB7XG4gICAgc2V0dGluZ3NQcmVmaXg6ICdzZXR0aW5nc18nLFxuICAgIGVxdWl2YWxlbnREb21haW5zOiAnZXF1aXZhbGVudERvbWFpbnMnLFxufTtcblxuZXhwb3J0IGNsYXNzIFNldHRpbmdzU2VydmljZSBpbXBsZW1lbnRzIFNldHRpbmdzU2VydmljZUFic3RyYWN0aW9uIHtcbiAgICBwcml2YXRlIHNldHRpbmdzQ2FjaGU6IGFueTtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgdXNlclNlcnZpY2U6IFVzZXJTZXJ2aWNlLCBwcml2YXRlIHN0b3JhZ2VTZXJ2aWNlOiBTdG9yYWdlU2VydmljZSkge1xuICAgIH1cblxuICAgIGNsZWFyQ2FjaGUoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2V0dGluZ3NDYWNoZSA9IG51bGw7XG4gICAgfVxuXG4gICAgZ2V0RXF1aXZhbGVudERvbWFpbnMoKTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U2V0dGluZ3NLZXkoS2V5cy5lcXVpdmFsZW50RG9tYWlucyk7XG4gICAgfVxuXG4gICAgYXN5bmMgc2V0RXF1aXZhbGVudERvbWFpbnMoZXF1aXZhbGVudERvbWFpbnM6IHN0cmluZ1tdW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5zZXRTZXR0aW5nc0tleShLZXlzLmVxdWl2YWxlbnREb21haW5zLCBlcXVpdmFsZW50RG9tYWlucyk7XG4gICAgfVxuXG4gICAgYXN5bmMgY2xlYXIodXNlcklkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5zdG9yYWdlU2VydmljZS5yZW1vdmUoS2V5cy5zZXR0aW5nc1ByZWZpeCArIHVzZXJJZCk7XG4gICAgICAgIHRoaXMuY2xlYXJDYWNoZSgpO1xuICAgIH1cblxuICAgIC8vIEhlbHBlcnNcblxuICAgIHByaXZhdGUgYXN5bmMgZ2V0U2V0dGluZ3MoKTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgaWYgKHRoaXMuc2V0dGluZ3NDYWNoZSA9PSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCB1c2VySWQgPSBhd2FpdCB0aGlzLnVzZXJTZXJ2aWNlLmdldFVzZXJJZCgpO1xuICAgICAgICAgICAgdGhpcy5zZXR0aW5nc0NhY2hlID0gdGhpcy5zdG9yYWdlU2VydmljZS5nZXQoS2V5cy5zZXR0aW5nc1ByZWZpeCArIHVzZXJJZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0dGluZ3NDYWNoZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGdldFNldHRpbmdzS2V5KGtleTogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgY29uc3Qgc2V0dGluZ3MgPSBhd2FpdCB0aGlzLmdldFNldHRpbmdzKCk7XG4gICAgICAgIGlmIChzZXR0aW5ncyAhPSBudWxsICYmIHNldHRpbmdzW2tleV0pIHtcbiAgICAgICAgICAgIHJldHVybiBzZXR0aW5nc1trZXldO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgc2V0U2V0dGluZ3NLZXkoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgdXNlcklkID0gYXdhaXQgdGhpcy51c2VyU2VydmljZS5nZXRVc2VySWQoKTtcbiAgICAgICAgbGV0IHNldHRpbmdzID0gYXdhaXQgdGhpcy5nZXRTZXR0aW5ncygpO1xuICAgICAgICBpZiAoIXNldHRpbmdzKSB7XG4gICAgICAgICAgICBzZXR0aW5ncyA9IHt9O1xuICAgICAgICB9XG5cbiAgICAgICAgc2V0dGluZ3Nba2V5XSA9IHZhbHVlO1xuICAgICAgICBhd2FpdCB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNhdmUoS2V5cy5zZXR0aW5nc1ByZWZpeCArIHVzZXJJZCwgc2V0dGluZ3MpO1xuICAgICAgICB0aGlzLnNldHRpbmdzQ2FjaGUgPSBzZXR0aW5ncztcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBTdGF0ZVNlcnZpY2UgYXMgU3RhdGVTZXJ2aWNlQWJzdHJhY3Rpb24gfSBmcm9tICcuLi9hYnN0cmFjdGlvbnMvc3RhdGUuc2VydmljZSc7XG5cbmV4cG9ydCBjbGFzcyBTdGF0ZVNlcnZpY2UgaW1wbGVtZW50cyBTdGF0ZVNlcnZpY2VBYnN0cmFjdGlvbiB7XG4gICAgcHJpdmF0ZSBzdGF0ZTogYW55ID0ge307XG5cbiAgICBnZXQ8VD4oa2V5OiBzdHJpbmcpOiBQcm9taXNlPFQ+IHtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLnN0YXRlW2tleV0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7XG4gICAgfVxuXG4gICAgc2F2ZShrZXk6IHN0cmluZywgb2JqOiBhbnkpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICB0aGlzLnN0YXRlW2tleV0gPSBvYmo7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB9XG5cbiAgICByZW1vdmUoa2V5OiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICBkZWxldGUgdGhpcy5zdGF0ZVtrZXldO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfVxuXG4gICAgcHVyZ2UoKTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHt9O1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgQXBpU2VydmljZSB9IGZyb20gJy4uL2Fic3RyYWN0aW9ucy9hcGkuc2VydmljZSc7XG5pbXBvcnQgeyBDaXBoZXJTZXJ2aWNlIH0gZnJvbSAnLi4vYWJzdHJhY3Rpb25zL2NpcGhlci5zZXJ2aWNlJztcbmltcG9ydCB7IENvbGxlY3Rpb25TZXJ2aWNlIH0gZnJvbSAnLi4vYWJzdHJhY3Rpb25zL2NvbGxlY3Rpb24uc2VydmljZSc7XG5pbXBvcnQgeyBDcnlwdG9TZXJ2aWNlIH0gZnJvbSAnLi4vYWJzdHJhY3Rpb25zL2NyeXB0by5zZXJ2aWNlJztcbmltcG9ydCB7IEZvbGRlclNlcnZpY2UgfSBmcm9tICcuLi9hYnN0cmFjdGlvbnMvZm9sZGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgTG9nU2VydmljZSB9IGZyb20gJy4uL2Fic3RyYWN0aW9ucy9sb2cuc2VydmljZSc7XG5pbXBvcnQgeyBNZXNzYWdpbmdTZXJ2aWNlIH0gZnJvbSAnLi4vYWJzdHJhY3Rpb25zL21lc3NhZ2luZy5zZXJ2aWNlJztcbmltcG9ydCB7IFBvbGljeVNlcnZpY2UgfSBmcm9tICcuLi9hYnN0cmFjdGlvbnMvcG9saWN5LnNlcnZpY2UnO1xuaW1wb3J0IHsgU2VuZFNlcnZpY2UgfSBmcm9tICcuLi9hYnN0cmFjdGlvbnMvc2VuZC5zZXJ2aWNlJztcbmltcG9ydCB7IFNldHRpbmdzU2VydmljZSB9IGZyb20gJy4uL2Fic3RyYWN0aW9ucy9zZXR0aW5ncy5zZXJ2aWNlJztcbmltcG9ydCB7IFN0b3JhZ2VTZXJ2aWNlIH0gZnJvbSAnLi4vYWJzdHJhY3Rpb25zL3N0b3JhZ2Uuc2VydmljZSc7XG5pbXBvcnQgeyBTeW5jU2VydmljZSBhcyBTeW5jU2VydmljZUFic3RyYWN0aW9uIH0gZnJvbSAnLi4vYWJzdHJhY3Rpb25zL3N5bmMuc2VydmljZSc7XG5pbXBvcnQgeyBVc2VyU2VydmljZSB9IGZyb20gJy4uL2Fic3RyYWN0aW9ucy91c2VyLnNlcnZpY2UnO1xuXG5pbXBvcnQgeyBDaXBoZXJEYXRhIH0gZnJvbSAnLi4vbW9kZWxzL2RhdGEvY2lwaGVyRGF0YSc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uRGF0YSB9IGZyb20gJy4uL21vZGVscy9kYXRhL2NvbGxlY3Rpb25EYXRhJztcbmltcG9ydCB7IEZvbGRlckRhdGEgfSBmcm9tICcuLi9tb2RlbHMvZGF0YS9mb2xkZXJEYXRhJztcbmltcG9ydCB7IE9yZ2FuaXphdGlvbkRhdGEgfSBmcm9tICcuLi9tb2RlbHMvZGF0YS9vcmdhbml6YXRpb25EYXRhJztcbmltcG9ydCB7IFBvbGljeURhdGEgfSBmcm9tICcuLi9tb2RlbHMvZGF0YS9wb2xpY3lEYXRhJztcbmltcG9ydCB7IFByb3ZpZGVyRGF0YSB9IGZyb20gJy4uL21vZGVscy9kYXRhL3Byb3ZpZGVyRGF0YSc7XG5pbXBvcnQgeyBTZW5kRGF0YSB9IGZyb20gJy4uL21vZGVscy9kYXRhL3NlbmREYXRhJztcblxuaW1wb3J0IHsgQ2lwaGVyUmVzcG9uc2UgfSBmcm9tICcuLi9tb2RlbHMvcmVzcG9uc2UvY2lwaGVyUmVzcG9uc2UnO1xuaW1wb3J0IHsgQ29sbGVjdGlvbkRldGFpbHNSZXNwb25zZSB9IGZyb20gJy4uL21vZGVscy9yZXNwb25zZS9jb2xsZWN0aW9uUmVzcG9uc2UnO1xuaW1wb3J0IHsgRG9tYWluc1Jlc3BvbnNlIH0gZnJvbSAnLi4vbW9kZWxzL3Jlc3BvbnNlL2RvbWFpbnNSZXNwb25zZSc7XG5pbXBvcnQgeyBGb2xkZXJSZXNwb25zZSB9IGZyb20gJy4uL21vZGVscy9yZXNwb25zZS9mb2xkZXJSZXNwb25zZSc7XG5pbXBvcnQge1xuICAgIFN5bmNDaXBoZXJOb3RpZmljYXRpb24sXG4gICAgU3luY0ZvbGRlck5vdGlmaWNhdGlvbixcbiAgICBTeW5jU2VuZE5vdGlmaWNhdGlvbixcbn0gZnJvbSAnLi4vbW9kZWxzL3Jlc3BvbnNlL25vdGlmaWNhdGlvblJlc3BvbnNlJztcbmltcG9ydCB7IFBvbGljeVJlc3BvbnNlIH0gZnJvbSAnLi4vbW9kZWxzL3Jlc3BvbnNlL3BvbGljeVJlc3BvbnNlJztcbmltcG9ydCB7IFByb2ZpbGVSZXNwb25zZSB9IGZyb20gJy4uL21vZGVscy9yZXNwb25zZS9wcm9maWxlUmVzcG9uc2UnO1xuaW1wb3J0IHsgU2VuZFJlc3BvbnNlIH0gZnJvbSAnLi4vbW9kZWxzL3Jlc3BvbnNlL3NlbmRSZXNwb25zZSc7XG5cbmNvbnN0IEtleXMgPSB7XG4gICAgbGFzdFN5bmNQcmVmaXg6ICdsYXN0U3luY18nLFxufTtcblxuZXhwb3J0IGNsYXNzIFN5bmNTZXJ2aWNlIGltcGxlbWVudHMgU3luY1NlcnZpY2VBYnN0cmFjdGlvbiB7XG4gICAgc3luY0luUHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgdXNlclNlcnZpY2U6IFVzZXJTZXJ2aWNlLCBwcml2YXRlIGFwaVNlcnZpY2U6IEFwaVNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgc2V0dGluZ3NTZXJ2aWNlOiBTZXR0aW5nc1NlcnZpY2UsIHByaXZhdGUgZm9sZGVyU2VydmljZTogRm9sZGVyU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBjaXBoZXJTZXJ2aWNlOiBDaXBoZXJTZXJ2aWNlLCBwcml2YXRlIGNyeXB0b1NlcnZpY2U6IENyeXB0b1NlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgY29sbGVjdGlvblNlcnZpY2U6IENvbGxlY3Rpb25TZXJ2aWNlLCBwcml2YXRlIHN0b3JhZ2VTZXJ2aWNlOiBTdG9yYWdlU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBtZXNzYWdpbmdTZXJ2aWNlOiBNZXNzYWdpbmdTZXJ2aWNlLCBwcml2YXRlIHBvbGljeVNlcnZpY2U6IFBvbGljeVNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgc2VuZFNlcnZpY2U6IFNlbmRTZXJ2aWNlLCBwcml2YXRlIGxvZ1NlcnZpY2U6IExvZ1NlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgbG9nb3V0Q2FsbGJhY2s6IChleHBpcmVkOiBib29sZWFuKSA9PiBQcm9taXNlPHZvaWQ+KSB7XG4gICAgfVxuXG4gICAgYXN5bmMgZ2V0TGFzdFN5bmMoKTogUHJvbWlzZTxEYXRlPiB7XG4gICAgICAgIGNvbnN0IHVzZXJJZCA9IGF3YWl0IHRoaXMudXNlclNlcnZpY2UuZ2V0VXNlcklkKCk7XG4gICAgICAgIGlmICh1c2VySWQgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsYXN0U3luYyA9IGF3YWl0IHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0PGFueT4oS2V5cy5sYXN0U3luY1ByZWZpeCArIHVzZXJJZCk7XG4gICAgICAgIGlmIChsYXN0U3luYykge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKGxhc3RTeW5jKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGFzeW5jIHNldExhc3RTeW5jKGRhdGU6IERhdGUpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICBjb25zdCB1c2VySWQgPSBhd2FpdCB0aGlzLnVzZXJTZXJ2aWNlLmdldFVzZXJJZCgpO1xuICAgICAgICBpZiAodXNlcklkID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2F2ZShLZXlzLmxhc3RTeW5jUHJlZml4ICsgdXNlcklkLCBkYXRlLnRvSlNPTigpKTtcbiAgICB9XG5cbiAgICBhc3luYyBmdWxsU3luYyhmb3JjZVN5bmM6IGJvb2xlYW4sIGFsbG93VGhyb3dPbkVycm9yID0gZmFsc2UpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgdGhpcy5zeW5jU3RhcnRlZCgpO1xuICAgICAgICBjb25zdCBpc0F1dGhlbnRpY2F0ZWQgPSBhd2FpdCB0aGlzLnVzZXJTZXJ2aWNlLmlzQXV0aGVudGljYXRlZCgpO1xuICAgICAgICBpZiAoIWlzQXV0aGVudGljYXRlZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3luY0NvbXBsZXRlZChmYWxzZSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuICAgICAgICBsZXQgbmVlZHNTeW5jID0gZmFsc2U7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBuZWVkc1N5bmMgPSBhd2FpdCB0aGlzLm5lZWRzU3luY2luZyhmb3JjZVN5bmMpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBpZiAoYWxsb3dUaHJvd09uRXJyb3IpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFuZWVkc1N5bmMpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0TGFzdFN5bmMobm93KTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnN5bmNDb21wbGV0ZWQoZmFsc2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdXNlcklkID0gYXdhaXQgdGhpcy51c2VyU2VydmljZS5nZXRVc2VySWQoKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuYXBpU2VydmljZS5yZWZyZXNoSWRlbnRpdHlUb2tlbigpO1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmFwaVNlcnZpY2UuZ2V0U3luYygpO1xuXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnN5bmNQcm9maWxlKHJlc3BvbnNlLnByb2ZpbGUpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5zeW5jRm9sZGVycyh1c2VySWQsIHJlc3BvbnNlLmZvbGRlcnMpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5zeW5jQ29sbGVjdGlvbnMocmVzcG9uc2UuY29sbGVjdGlvbnMpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5zeW5jQ2lwaGVycyh1c2VySWQsIHJlc3BvbnNlLmNpcGhlcnMpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5zeW5jU2VuZHModXNlcklkLCByZXNwb25zZS5zZW5kcyk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnN5bmNTZXR0aW5ncyh1c2VySWQsIHJlc3BvbnNlLmRvbWFpbnMpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5zeW5jUG9saWNpZXMocmVzcG9uc2UucG9saWNpZXMpO1xuXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNldExhc3RTeW5jKG5vdyk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zeW5jQ29tcGxldGVkKHRydWUpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBpZiAoYWxsb3dUaHJvd09uRXJyb3IpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zeW5jQ29tcGxldGVkKGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIHN5bmNVcHNlcnRGb2xkZXIobm90aWZpY2F0aW9uOiBTeW5jRm9sZGVyTm90aWZpY2F0aW9uLCBpc0VkaXQ6IGJvb2xlYW4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgdGhpcy5zeW5jU3RhcnRlZCgpO1xuICAgICAgICBpZiAoYXdhaXQgdGhpcy51c2VyU2VydmljZS5pc0F1dGhlbnRpY2F0ZWQoKSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCBsb2NhbEZvbGRlciA9IGF3YWl0IHRoaXMuZm9sZGVyU2VydmljZS5nZXQobm90aWZpY2F0aW9uLmlkKTtcbiAgICAgICAgICAgICAgICBpZiAoKCFpc0VkaXQgJiYgbG9jYWxGb2xkZXIgPT0gbnVsbCkgfHxcbiAgICAgICAgICAgICAgICAgICAgKGlzRWRpdCAmJiBsb2NhbEZvbGRlciAhPSBudWxsICYmIGxvY2FsRm9sZGVyLnJldmlzaW9uRGF0ZSA8IG5vdGlmaWNhdGlvbi5yZXZpc2lvbkRhdGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlbW90ZUZvbGRlciA9IGF3YWl0IHRoaXMuYXBpU2VydmljZS5nZXRGb2xkZXIobm90aWZpY2F0aW9uLmlkKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlbW90ZUZvbGRlciAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1c2VySWQgPSBhd2FpdCB0aGlzLnVzZXJTZXJ2aWNlLmdldFVzZXJJZCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5mb2xkZXJTZXJ2aWNlLnVwc2VydChuZXcgRm9sZGVyRGF0YShyZW1vdGVGb2xkZXIsIHVzZXJJZCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdpbmdTZXJ2aWNlLnNlbmQoJ3N5bmNlZFVwc2VydGVkRm9sZGVyJywgeyBmb2xkZXJJZDogbm90aWZpY2F0aW9uLmlkIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3luY0NvbXBsZXRlZCh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ1NlcnZpY2UuZXJyb3IoZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuc3luY0NvbXBsZXRlZChmYWxzZSk7XG4gICAgfVxuXG4gICAgYXN5bmMgc3luY0RlbGV0ZUZvbGRlcihub3RpZmljYXRpb246IFN5bmNGb2xkZXJOb3RpZmljYXRpb24pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgdGhpcy5zeW5jU3RhcnRlZCgpO1xuICAgICAgICBpZiAoYXdhaXQgdGhpcy51c2VyU2VydmljZS5pc0F1dGhlbnRpY2F0ZWQoKSkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5mb2xkZXJTZXJ2aWNlLmRlbGV0ZShub3RpZmljYXRpb24uaWQpO1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdpbmdTZXJ2aWNlLnNlbmQoJ3N5bmNlZERlbGV0ZWRGb2xkZXInLCB7IGZvbGRlcklkOiBub3RpZmljYXRpb24uaWQgfSk7XG4gICAgICAgICAgICB0aGlzLnN5bmNDb21wbGV0ZWQodHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5zeW5jQ29tcGxldGVkKGZhbHNlKTtcbiAgICB9XG5cbiAgICBhc3luYyBzeW5jVXBzZXJ0Q2lwaGVyKG5vdGlmaWNhdGlvbjogU3luY0NpcGhlck5vdGlmaWNhdGlvbiwgaXNFZGl0OiBib29sZWFuKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHRoaXMuc3luY1N0YXJ0ZWQoKTtcbiAgICAgICAgaWYgKGF3YWl0IHRoaXMudXNlclNlcnZpY2UuaXNBdXRoZW50aWNhdGVkKCkpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgbGV0IHNob3VsZFVwZGF0ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgY29uc3QgbG9jYWxDaXBoZXIgPSBhd2FpdCB0aGlzLmNpcGhlclNlcnZpY2UuZ2V0KG5vdGlmaWNhdGlvbi5pZCk7XG4gICAgICAgICAgICAgICAgaWYgKGxvY2FsQ2lwaGVyICE9IG51bGwgJiYgbG9jYWxDaXBoZXIucmV2aXNpb25EYXRlID49IG5vdGlmaWNhdGlvbi5yZXZpc2lvbkRhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgc2hvdWxkVXBkYXRlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGV0IGNoZWNrQ29sbGVjdGlvbnMgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBpZiAoc2hvdWxkVXBkYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc0VkaXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZFVwZGF0ZSA9IGxvY2FsQ2lwaGVyICE9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICBjaGVja0NvbGxlY3Rpb25zID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub3RpZmljYXRpb24uY29sbGVjdGlvbklkcyA9PSBudWxsIHx8IG5vdGlmaWNhdGlvbi5vcmdhbml6YXRpb25JZCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkVXBkYXRlID0gbG9jYWxDaXBoZXIgPT0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkVXBkYXRlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tDb2xsZWN0aW9ucyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoIXNob3VsZFVwZGF0ZSAmJiBjaGVja0NvbGxlY3Rpb25zICYmIG5vdGlmaWNhdGlvbi5vcmdhbml6YXRpb25JZCAhPSBudWxsICYmXG4gICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbi5jb2xsZWN0aW9uSWRzICE9IG51bGwgJiYgbm90aWZpY2F0aW9uLmNvbGxlY3Rpb25JZHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb2xsZWN0aW9ucyA9IGF3YWl0IHRoaXMuY29sbGVjdGlvblNlcnZpY2UuZ2V0QWxsKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb2xsZWN0aW9ucyAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbGxlY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vdGlmaWNhdGlvbi5jb2xsZWN0aW9uSWRzLmluZGV4T2YoY29sbGVjdGlvbnNbaV0uaWQpID4gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkVXBkYXRlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHNob3VsZFVwZGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZW1vdGVDaXBoZXIgPSBhd2FpdCB0aGlzLmFwaVNlcnZpY2UuZ2V0Q2lwaGVyKG5vdGlmaWNhdGlvbi5pZCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZW1vdGVDaXBoZXIgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdXNlcklkID0gYXdhaXQgdGhpcy51c2VyU2VydmljZS5nZXRVc2VySWQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuY2lwaGVyU2VydmljZS51cHNlcnQobmV3IENpcGhlckRhdGEocmVtb3RlQ2lwaGVyLCB1c2VySWQpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnaW5nU2VydmljZS5zZW5kKCdzeW5jZWRVcHNlcnRlZENpcGhlcicsIHsgY2lwaGVySWQ6IG5vdGlmaWNhdGlvbi5pZCB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnN5bmNDb21wbGV0ZWQodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGUgIT0gbnVsbCAmJiBlLnN0YXR1c0NvZGUgPT09IDQwNCAmJiBpc0VkaXQpIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jaXBoZXJTZXJ2aWNlLmRlbGV0ZShub3RpZmljYXRpb24uaWQpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2luZ1NlcnZpY2Uuc2VuZCgnc3luY2VkRGVsZXRlZENpcGhlcicsIHsgY2lwaGVySWQ6IG5vdGlmaWNhdGlvbi5pZCB9KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3luY0NvbXBsZXRlZCh0cnVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuc3luY0NvbXBsZXRlZChmYWxzZSk7XG4gICAgfVxuXG4gICAgYXN5bmMgc3luY0RlbGV0ZUNpcGhlcihub3RpZmljYXRpb246IFN5bmNDaXBoZXJOb3RpZmljYXRpb24pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgdGhpcy5zeW5jU3RhcnRlZCgpO1xuICAgICAgICBpZiAoYXdhaXQgdGhpcy51c2VyU2VydmljZS5pc0F1dGhlbnRpY2F0ZWQoKSkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5jaXBoZXJTZXJ2aWNlLmRlbGV0ZShub3RpZmljYXRpb24uaWQpO1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdpbmdTZXJ2aWNlLnNlbmQoJ3N5bmNlZERlbGV0ZWRDaXBoZXInLCB7IGNpcGhlcklkOiBub3RpZmljYXRpb24uaWQgfSk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zeW5jQ29tcGxldGVkKHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnN5bmNDb21wbGV0ZWQoZmFsc2UpO1xuICAgIH1cblxuICAgIGFzeW5jIHN5bmNVcHNlcnRTZW5kKG5vdGlmaWNhdGlvbjogU3luY1NlbmROb3RpZmljYXRpb24sIGlzRWRpdDogYm9vbGVhbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICB0aGlzLnN5bmNTdGFydGVkKCk7XG4gICAgICAgIGlmIChhd2FpdCB0aGlzLnVzZXJTZXJ2aWNlLmlzQXV0aGVudGljYXRlZCgpKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxvY2FsU2VuZCA9IGF3YWl0IHRoaXMuc2VuZFNlcnZpY2UuZ2V0KG5vdGlmaWNhdGlvbi5pZCk7XG4gICAgICAgICAgICAgICAgaWYgKCghaXNFZGl0ICYmIGxvY2FsU2VuZCA9PSBudWxsKSB8fFxuICAgICAgICAgICAgICAgICAgICAoaXNFZGl0ICYmIGxvY2FsU2VuZCAhPSBudWxsICYmIGxvY2FsU2VuZC5yZXZpc2lvbkRhdGUgPCBub3RpZmljYXRpb24ucmV2aXNpb25EYXRlKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZW1vdGVTZW5kID0gYXdhaXQgdGhpcy5hcGlTZXJ2aWNlLmdldFNlbmQobm90aWZpY2F0aW9uLmlkKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlbW90ZVNlbmQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdXNlcklkID0gYXdhaXQgdGhpcy51c2VyU2VydmljZS5nZXRVc2VySWQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc2VuZFNlcnZpY2UudXBzZXJ0KG5ldyBTZW5kRGF0YShyZW1vdGVTZW5kLCB1c2VySWQpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnaW5nU2VydmljZS5zZW5kKCdzeW5jZWRVcHNlcnRlZFNlbmQnLCB7IHNlbmRJZDogbm90aWZpY2F0aW9uLmlkIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3luY0NvbXBsZXRlZCh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ1NlcnZpY2UuZXJyb3IoZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuc3luY0NvbXBsZXRlZChmYWxzZSk7XG4gICAgfVxuXG4gICAgYXN5bmMgc3luY0RlbGV0ZVNlbmQobm90aWZpY2F0aW9uOiBTeW5jU2VuZE5vdGlmaWNhdGlvbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICB0aGlzLnN5bmNTdGFydGVkKCk7XG4gICAgICAgIGlmIChhd2FpdCB0aGlzLnVzZXJTZXJ2aWNlLmlzQXV0aGVudGljYXRlZCgpKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNlbmRTZXJ2aWNlLmRlbGV0ZShub3RpZmljYXRpb24uaWQpO1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdpbmdTZXJ2aWNlLnNlbmQoJ3N5bmNlZERlbGV0ZWRTZW5kJywgeyBzZW5kSWQ6IG5vdGlmaWNhdGlvbi5pZCB9KTtcbiAgICAgICAgICAgIHRoaXMuc3luY0NvbXBsZXRlZCh0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnN5bmNDb21wbGV0ZWQoZmFsc2UpO1xuICAgIH1cblxuICAgIC8vIEhlbHBlcnNcblxuICAgIHByaXZhdGUgc3luY1N0YXJ0ZWQoKSB7XG4gICAgICAgIHRoaXMuc3luY0luUHJvZ3Jlc3MgPSB0cnVlO1xuICAgICAgICB0aGlzLm1lc3NhZ2luZ1NlcnZpY2Uuc2VuZCgnc3luY1N0YXJ0ZWQnKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN5bmNDb21wbGV0ZWQoc3VjY2Vzc2Z1bGx5OiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgICAgIHRoaXMuc3luY0luUHJvZ3Jlc3MgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5tZXNzYWdpbmdTZXJ2aWNlLnNlbmQoJ3N5bmNDb21wbGV0ZWQnLCB7IHN1Y2Nlc3NmdWxseTogc3VjY2Vzc2Z1bGx5IH0pO1xuICAgICAgICByZXR1cm4gc3VjY2Vzc2Z1bGx5O1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgbmVlZHNTeW5jaW5nKGZvcmNlU3luYzogYm9vbGVhbikge1xuICAgICAgICBpZiAoZm9yY2VTeW5jKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGxhc3RTeW5jID0gYXdhaXQgdGhpcy5nZXRMYXN0U3luYygpO1xuICAgICAgICBpZiAobGFzdFN5bmMgPT0gbnVsbCB8fCBsYXN0U3luYy5nZXRUaW1lKCkgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmFwaVNlcnZpY2UuZ2V0QWNjb3VudFJldmlzaW9uRGF0ZSgpO1xuICAgICAgICBpZiAobmV3IERhdGUocmVzcG9uc2UpIDw9IGxhc3RTeW5jKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBzeW5jUHJvZmlsZShyZXNwb25zZTogUHJvZmlsZVJlc3BvbnNlKSB7XG4gICAgICAgIGNvbnN0IHN0YW1wID0gYXdhaXQgdGhpcy51c2VyU2VydmljZS5nZXRTZWN1cml0eVN0YW1wKCk7XG4gICAgICAgIGlmIChzdGFtcCAhPSBudWxsICYmIHN0YW1wICE9PSByZXNwb25zZS5zZWN1cml0eVN0YW1wKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5sb2dvdXRDYWxsYmFjayAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5sb2dvdXRDYWxsYmFjayh0cnVlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTdGFtcCBoYXMgY2hhbmdlZCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgdGhpcy5jcnlwdG9TZXJ2aWNlLnNldEVuY0tleShyZXNwb25zZS5rZXkpO1xuICAgICAgICBhd2FpdCB0aGlzLmNyeXB0b1NlcnZpY2Uuc2V0RW5jUHJpdmF0ZUtleShyZXNwb25zZS5wcml2YXRlS2V5KTtcbiAgICAgICAgYXdhaXQgdGhpcy5jcnlwdG9TZXJ2aWNlLnNldFByb3ZpZGVyS2V5cyhyZXNwb25zZS5wcm92aWRlcnMpO1xuICAgICAgICBhd2FpdCB0aGlzLmNyeXB0b1NlcnZpY2Uuc2V0T3JnS2V5cyhyZXNwb25zZS5vcmdhbml6YXRpb25zLCByZXNwb25zZS5wcm92aWRlck9yZ2FuaXphdGlvbnMpO1xuICAgICAgICBhd2FpdCB0aGlzLnVzZXJTZXJ2aWNlLnNldFNlY3VyaXR5U3RhbXAocmVzcG9uc2Uuc2VjdXJpdHlTdGFtcCk7XG4gICAgICAgIGF3YWl0IHRoaXMudXNlclNlcnZpY2Uuc2V0RW1haWxWZXJpZmllZChyZXNwb25zZS5lbWFpbFZlcmlmaWVkKTtcbiAgICAgICAgYXdhaXQgdGhpcy51c2VyU2VydmljZS5zZXRGb3JjZVBhc3N3b3JkUmVzZXQocmVzcG9uc2UuZm9yY2VQYXNzd29yZFJlc2V0KTtcblxuICAgICAgICBjb25zdCBvcmdhbml6YXRpb25zOiB7IFtpZDogc3RyaW5nXTogT3JnYW5pemF0aW9uRGF0YTsgfSA9IHt9O1xuICAgICAgICByZXNwb25zZS5vcmdhbml6YXRpb25zLmZvckVhY2gobyA9PiB7XG4gICAgICAgICAgICBvcmdhbml6YXRpb25zW28uaWRdID0gbmV3IE9yZ2FuaXphdGlvbkRhdGEobyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHByb3ZpZGVyczogeyBbaWQ6IHN0cmluZ106IFByb3ZpZGVyRGF0YTsgfSA9IHt9O1xuICAgICAgICByZXNwb25zZS5wcm92aWRlcnMuZm9yRWFjaChwID0+IHtcbiAgICAgICAgICAgIHByb3ZpZGVyc1twLmlkXSA9IG5ldyBQcm92aWRlckRhdGEocCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJlc3BvbnNlLnByb3ZpZGVyT3JnYW5pemF0aW9ucy5mb3JFYWNoKG8gPT4ge1xuICAgICAgICAgICAgaWYgKG9yZ2FuaXphdGlvbnNbby5pZF0gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIG9yZ2FuaXphdGlvbnNbby5pZF0gPSBuZXcgT3JnYW5pemF0aW9uRGF0YShvKTtcbiAgICAgICAgICAgICAgICBvcmdhbml6YXRpb25zW28uaWRdLmlzUHJvdmlkZXJVc2VyID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICB0aGlzLnVzZXJTZXJ2aWNlLnJlcGxhY2VPcmdhbml6YXRpb25zKG9yZ2FuaXphdGlvbnMpLFxuICAgICAgICAgICAgdGhpcy51c2VyU2VydmljZS5yZXBsYWNlUHJvdmlkZXJzKHByb3ZpZGVycyksXG4gICAgICAgIF0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgc3luY0ZvbGRlcnModXNlcklkOiBzdHJpbmcsIHJlc3BvbnNlOiBGb2xkZXJSZXNwb25zZVtdKSB7XG4gICAgICAgIGNvbnN0IGZvbGRlcnM6IHsgW2lkOiBzdHJpbmddOiBGb2xkZXJEYXRhOyB9ID0ge307XG4gICAgICAgIHJlc3BvbnNlLmZvckVhY2goZiA9PiB7XG4gICAgICAgICAgICBmb2xkZXJzW2YuaWRdID0gbmV3IEZvbGRlckRhdGEoZiwgdXNlcklkKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmZvbGRlclNlcnZpY2UucmVwbGFjZShmb2xkZXJzKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHN5bmNDb2xsZWN0aW9ucyhyZXNwb25zZTogQ29sbGVjdGlvbkRldGFpbHNSZXNwb25zZVtdKSB7XG4gICAgICAgIGNvbnN0IGNvbGxlY3Rpb25zOiB7IFtpZDogc3RyaW5nXTogQ29sbGVjdGlvbkRhdGE7IH0gPSB7fTtcbiAgICAgICAgcmVzcG9uc2UuZm9yRWFjaChjID0+IHtcbiAgICAgICAgICAgIGNvbGxlY3Rpb25zW2MuaWRdID0gbmV3IENvbGxlY3Rpb25EYXRhKGMpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY29sbGVjdGlvblNlcnZpY2UucmVwbGFjZShjb2xsZWN0aW9ucyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBzeW5jQ2lwaGVycyh1c2VySWQ6IHN0cmluZywgcmVzcG9uc2U6IENpcGhlclJlc3BvbnNlW10pIHtcbiAgICAgICAgY29uc3QgY2lwaGVyczogeyBbaWQ6IHN0cmluZ106IENpcGhlckRhdGE7IH0gPSB7fTtcbiAgICAgICAgcmVzcG9uc2UuZm9yRWFjaChjID0+IHtcbiAgICAgICAgICAgIGNpcGhlcnNbYy5pZF0gPSBuZXcgQ2lwaGVyRGF0YShjLCB1c2VySWQpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2lwaGVyU2VydmljZS5yZXBsYWNlKGNpcGhlcnMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgc3luY1NlbmRzKHVzZXJJZDogc3RyaW5nLCByZXNwb25zZTogU2VuZFJlc3BvbnNlW10pIHtcbiAgICAgICAgY29uc3Qgc2VuZHM6IHsgW2lkOiBzdHJpbmddOiBTZW5kRGF0YTsgfSA9IHt9O1xuICAgICAgICByZXNwb25zZS5mb3JFYWNoKHMgPT4ge1xuICAgICAgICAgICAgc2VuZHNbcy5pZF0gPSBuZXcgU2VuZERhdGEocywgdXNlcklkKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnNlbmRTZXJ2aWNlLnJlcGxhY2Uoc2VuZHMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgc3luY1NldHRpbmdzKHVzZXJJZDogc3RyaW5nLCByZXNwb25zZTogRG9tYWluc1Jlc3BvbnNlKSB7XG4gICAgICAgIGxldCBlcURvbWFpbnM6IHN0cmluZ1tdW10gPSBbXTtcbiAgICAgICAgaWYgKHJlc3BvbnNlICE9IG51bGwgJiYgcmVzcG9uc2UuZXF1aXZhbGVudERvbWFpbnMgIT0gbnVsbCkge1xuICAgICAgICAgICAgZXFEb21haW5zID0gZXFEb21haW5zLmNvbmNhdChyZXNwb25zZS5lcXVpdmFsZW50RG9tYWlucyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVzcG9uc2UgIT0gbnVsbCAmJiByZXNwb25zZS5nbG9iYWxFcXVpdmFsZW50RG9tYWlucyAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXNwb25zZS5nbG9iYWxFcXVpdmFsZW50RG9tYWlucy5mb3JFYWNoKGdsb2JhbCA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGdsb2JhbC5kb21haW5zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZXFEb21haW5zLnB1c2goZ2xvYmFsLmRvbWFpbnMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0dGluZ3NTZXJ2aWNlLnNldEVxdWl2YWxlbnREb21haW5zKGVxRG9tYWlucyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBzeW5jUG9saWNpZXMocmVzcG9uc2U6IFBvbGljeVJlc3BvbnNlW10pIHtcbiAgICAgICAgY29uc3QgcG9saWNpZXM6IHsgW2lkOiBzdHJpbmddOiBQb2xpY3lEYXRhOyB9ID0ge307XG4gICAgICAgIGlmIChyZXNwb25zZSAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXNwb25zZS5mb3JFYWNoKHAgPT4ge1xuICAgICAgICAgICAgICAgIHBvbGljaWVzW3AuaWRdID0gbmV3IFBvbGljeURhdGEocCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5wb2xpY3lTZXJ2aWNlLnJlcGxhY2UocG9saWNpZXMpO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IE1lc3NhZ2luZ1NlcnZpY2UgfSBmcm9tICcuLi9hYnN0cmFjdGlvbnMvbWVzc2FnaW5nLnNlcnZpY2UnO1xuaW1wb3J0IHsgUGxhdGZvcm1VdGlsc1NlcnZpY2UgfSBmcm9tICcuLi9hYnN0cmFjdGlvbnMvcGxhdGZvcm1VdGlscy5zZXJ2aWNlJztcbmltcG9ydCB7IFN0b3JhZ2VTZXJ2aWNlIH0gZnJvbSAnLi4vYWJzdHJhY3Rpb25zL3N0b3JhZ2Uuc2VydmljZSc7XG5pbXBvcnQgeyBTeXN0ZW1TZXJ2aWNlIGFzIFN5c3RlbVNlcnZpY2VBYnN0cmFjdGlvbiB9IGZyb20gJy4uL2Fic3RyYWN0aW9ucy9zeXN0ZW0uc2VydmljZSc7XG5pbXBvcnQgeyBWYXVsdFRpbWVvdXRTZXJ2aWNlIH0gZnJvbSAnLi4vYWJzdHJhY3Rpb25zL3ZhdWx0VGltZW91dC5zZXJ2aWNlJztcblxuaW1wb3J0IHsgQ29uc3RhbnRzU2VydmljZSB9IGZyb20gJy4vY29uc3RhbnRzLnNlcnZpY2UnO1xuXG5pbXBvcnQgeyBVdGlscyB9IGZyb20gJy4uL21pc2MvdXRpbHMnO1xuXG5leHBvcnQgY2xhc3MgU3lzdGVtU2VydmljZSBpbXBsZW1lbnRzIFN5c3RlbVNlcnZpY2VBYnN0cmFjdGlvbiB7XG4gICAgcHJpdmF0ZSByZWxvYWRJbnRlcnZhbDogYW55ID0gbnVsbDtcbiAgICBwcml2YXRlIGNsZWFyQ2xpcGJvYXJkVGltZW91dDogYW55ID0gbnVsbDtcbiAgICBwcml2YXRlIGNsZWFyQ2xpcGJvYXJkVGltZW91dEZ1bmN0aW9uOiAoKSA9PiBQcm9taXNlPGFueT4gPSBudWxsO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBzdG9yYWdlU2VydmljZTogU3RvcmFnZVNlcnZpY2UsIHByaXZhdGUgdmF1bHRUaW1lb3V0U2VydmljZTogVmF1bHRUaW1lb3V0U2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBtZXNzYWdpbmdTZXJ2aWNlOiBNZXNzYWdpbmdTZXJ2aWNlLCBwcml2YXRlIHBsYXRmb3JtVXRpbHNTZXJ2aWNlOiBQbGF0Zm9ybVV0aWxzU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSByZWxvYWRDYWxsYmFjazogKCkgPT4gUHJvbWlzZTx2b2lkPiA9IG51bGwpIHtcbiAgICB9XG5cbiAgICBzdGFydFByb2Nlc3NSZWxvYWQoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnZhdWx0VGltZW91dFNlcnZpY2UucGluUHJvdGVjdGVkS2V5ICE9IG51bGwgfHxcbiAgICAgICAgICAgIHRoaXMudmF1bHRUaW1lb3V0U2VydmljZS5iaW9tZXRyaWNMb2NrZWQgfHxcbiAgICAgICAgICAgIHRoaXMucmVsb2FkSW50ZXJ2YWwgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2FuY2VsUHJvY2Vzc1JlbG9hZCgpO1xuICAgICAgICB0aGlzLnJlbG9hZEludGVydmFsID0gc2V0SW50ZXJ2YWwoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgbGV0IGRvUmVmcmVzaCA9IGZhbHNlO1xuICAgICAgICAgICAgY29uc3QgbGFzdEFjdGl2ZSA9IGF3YWl0IHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0PG51bWJlcj4oQ29uc3RhbnRzU2VydmljZS5sYXN0QWN0aXZlS2V5KTtcbiAgICAgICAgICAgIGlmIChsYXN0QWN0aXZlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkaWZmU2Vjb25kcyA9IChuZXcgRGF0ZSgpKS5nZXRUaW1lKCkgLSBsYXN0QWN0aXZlO1xuICAgICAgICAgICAgICAgIC8vIERvbid0IHJlZnJlc2ggaWYgdGhleSBhcmUgc3RpbGwgYWN0aXZlIGluIHRoZSB3aW5kb3dcbiAgICAgICAgICAgICAgICBkb1JlZnJlc2ggPSBkaWZmU2Vjb25kcyA+PSA1MDAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgYmlvbWV0cmljTG9ja2VkRmluZ2VycHJpbnRWYWxpZGF0ZWQgPVxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0PGJvb2xlYW4+KENvbnN0YW50c1NlcnZpY2UuYmlvbWV0cmljRmluZ2VycHJpbnRWYWxpZGF0ZWQpICYmIHRoaXMudmF1bHRUaW1lb3V0U2VydmljZS5iaW9tZXRyaWNMb2NrZWQ7XG4gICAgICAgICAgICBpZiAoZG9SZWZyZXNoICYmICFiaW9tZXRyaWNMb2NrZWRGaW5nZXJwcmludFZhbGlkYXRlZCkge1xuICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5yZWxvYWRJbnRlcnZhbCk7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWxvYWRJbnRlcnZhbCA9IG51bGw7XG4gICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdpbmdTZXJ2aWNlLnNlbmQoJ3JlbG9hZFByb2Nlc3MnKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yZWxvYWRDYWxsYmFjayAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucmVsb2FkQ2FsbGJhY2soKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIDEwMDAwKTtcbiAgICB9XG5cbiAgICBjYW5jZWxQcm9jZXNzUmVsb2FkKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5yZWxvYWRJbnRlcnZhbCAhPSBudWxsKSB7XG4gICAgICAgICAgICBjbGVhckludGVydmFsKHRoaXMucmVsb2FkSW50ZXJ2YWwpO1xuICAgICAgICAgICAgdGhpcy5yZWxvYWRJbnRlcnZhbCA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjbGVhckNsaXBib2FyZChjbGlwYm9hcmRWYWx1ZTogc3RyaW5nLCB0aW1lb3V0TXM6IG51bWJlciA9IG51bGwpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuY2xlYXJDbGlwYm9hcmRUaW1lb3V0ICE9IG51bGwpIHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmNsZWFyQ2xpcGJvYXJkVGltZW91dCk7XG4gICAgICAgICAgICB0aGlzLmNsZWFyQ2xpcGJvYXJkVGltZW91dCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFV0aWxzLmlzTnVsbE9yV2hpdGVzcGFjZShjbGlwYm9hcmRWYWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldDxudW1iZXI+KENvbnN0YW50c1NlcnZpY2UuY2xlYXJDbGlwYm9hcmRLZXkpLnRoZW4oY2xlYXJTZWNvbmRzID0+IHtcbiAgICAgICAgICAgIGlmIChjbGVhclNlY29uZHMgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aW1lb3V0TXMgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRpbWVvdXRNcyA9IGNsZWFyU2Vjb25kcyAqIDEwMDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmNsZWFyQ2xpcGJvYXJkVGltZW91dEZ1bmN0aW9uID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNsaXBib2FyZFZhbHVlTm93ID0gYXdhaXQgdGhpcy5wbGF0Zm9ybVV0aWxzU2VydmljZS5yZWFkRnJvbUNsaXBib2FyZCgpO1xuICAgICAgICAgICAgICAgIGlmIChjbGlwYm9hcmRWYWx1ZSA9PT0gY2xpcGJvYXJkVmFsdWVOb3cpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbGF0Zm9ybVV0aWxzU2VydmljZS5jb3B5VG9DbGlwYm9hcmQoJycsIHsgY2xlYXJpbmc6IHRydWUgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMuY2xlYXJDbGlwYm9hcmRUaW1lb3V0ID0gc2V0VGltZW91dChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jbGVhclBlbmRpbmdDbGlwYm9hcmQoKTtcbiAgICAgICAgICAgIH0sIHRpbWVvdXRNcyk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGFzeW5jIGNsZWFyUGVuZGluZ0NsaXBib2FyZCgpIHtcbiAgICAgICAgaWYgKHRoaXMuY2xlYXJDbGlwYm9hcmRUaW1lb3V0RnVuY3Rpb24gIT0gbnVsbCkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5jbGVhckNsaXBib2FyZFRpbWVvdXRGdW5jdGlvbigpO1xuICAgICAgICAgICAgdGhpcy5jbGVhckNsaXBib2FyZFRpbWVvdXRGdW5jdGlvbiA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgeyBDb25zdGFudHNTZXJ2aWNlIH0gZnJvbSAnLi9jb25zdGFudHMuc2VydmljZSc7XG5cbmltcG9ydCB7IFN0b3JhZ2VTZXJ2aWNlIH0gZnJvbSAnLi4vYWJzdHJhY3Rpb25zL3N0b3JhZ2Uuc2VydmljZSc7XG5pbXBvcnQgeyBUb2tlblNlcnZpY2UgYXMgVG9rZW5TZXJ2aWNlQWJzdHJhY3Rpb24gfSBmcm9tICcuLi9hYnN0cmFjdGlvbnMvdG9rZW4uc2VydmljZSc7XG5cbmltcG9ydCB7IFV0aWxzIH0gZnJvbSAnLi4vbWlzYy91dGlscyc7XG5cbmNvbnN0IEtleXMgPSB7XG4gICAgYWNjZXNzVG9rZW46ICdhY2Nlc3NUb2tlbicsXG4gICAgcmVmcmVzaFRva2VuOiAncmVmcmVzaFRva2VuJyxcbiAgICB0d29GYWN0b3JUb2tlblByZWZpeDogJ3R3b0ZhY3RvclRva2VuXycsXG4gICAgY2xpZW50SWQ6ICdhcGlrZXlfY2xpZW50SWQnLFxuICAgIGNsaWVudFNlY3JldDogJ2FwaWtleV9jbGllbnRTZWNyZXQnLFxufTtcblxuZXhwb3J0IGNsYXNzIFRva2VuU2VydmljZSBpbXBsZW1lbnRzIFRva2VuU2VydmljZUFic3RyYWN0aW9uIHtcbiAgICB0b2tlbjogc3RyaW5nO1xuICAgIGRlY29kZWRUb2tlbjogYW55O1xuICAgIHJlZnJlc2hUb2tlbjogc3RyaW5nO1xuICAgIGNsaWVudElkOiBzdHJpbmc7XG4gICAgY2xpZW50U2VjcmV0OiBzdHJpbmc7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHN0b3JhZ2VTZXJ2aWNlOiBTdG9yYWdlU2VydmljZSkge1xuICAgIH1cblxuICAgIGFzeW5jIHNldFRva2VucyhhY2Nlc3NUb2tlbjogc3RyaW5nLCByZWZyZXNoVG9rZW46IHN0cmluZywgY2xpZW50SWRDbGllbnRTZWNyZXQ6IFtzdHJpbmcsIHN0cmluZ10pOiBQcm9taXNlPGFueT4ge1xuICAgICAgICBhd2FpdCB0aGlzLnNldFRva2VuKGFjY2Vzc1Rva2VuKTtcbiAgICAgICAgYXdhaXQgdGhpcy5zZXRSZWZyZXNoVG9rZW4ocmVmcmVzaFRva2VuKTtcbiAgICAgICAgaWYgKGNsaWVudElkQ2xpZW50U2VjcmV0ICE9IG51bGwpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0Q2xpZW50SWQoY2xpZW50SWRDbGllbnRTZWNyZXRbMF0pO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXRDbGllbnRTZWNyZXQoY2xpZW50SWRDbGllbnRTZWNyZXRbMV0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgc2V0Q2xpZW50SWQoY2xpZW50SWQ6IHN0cmluZyk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIHRoaXMuY2xpZW50SWQgPSBjbGllbnRJZDtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmVUb2tlblZhbHVlKEtleXMuY2xpZW50SWQsIGNsaWVudElkKTtcbiAgICB9XG5cbiAgICBhc3luYyBnZXRDbGllbnRJZCgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBpZiAodGhpcy5jbGllbnRJZCAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jbGllbnRJZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2xpZW50SWQgPSBhd2FpdCB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldDxzdHJpbmc+KEtleXMuY2xpZW50SWQpO1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnRJZDtcbiAgICB9XG5cbiAgICBhc3luYyBzZXRDbGllbnRTZWNyZXQoY2xpZW50U2VjcmV0OiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICB0aGlzLmNsaWVudFNlY3JldCA9IGNsaWVudFNlY3JldDtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmVUb2tlblZhbHVlKEtleXMuY2xpZW50U2VjcmV0LCBjbGllbnRTZWNyZXQpO1xuICAgIH1cblxuICAgIGFzeW5jIGdldENsaWVudFNlY3JldCgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBpZiAodGhpcy5jbGllbnRTZWNyZXQgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50U2VjcmV0O1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jbGllbnRTZWNyZXQgPSBhd2FpdCB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldDxzdHJpbmc+KEtleXMuY2xpZW50U2VjcmV0KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50U2VjcmV0O1xuICAgIH1cblxuICAgIGFzeW5jIHNldFRva2VuKHRva2VuOiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICB0aGlzLnRva2VuID0gdG9rZW47XG4gICAgICAgIHRoaXMuZGVjb2RlZFRva2VuID0gbnVsbDtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmVUb2tlblZhbHVlKEtleXMuYWNjZXNzVG9rZW4sIHRva2VuKTtcbiAgICB9XG5cbiAgICBhc3luYyBnZXRUb2tlbigpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBpZiAodGhpcy50b2tlbiAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50b2tlbjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudG9rZW4gPSBhd2FpdCB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldDxzdHJpbmc+KEtleXMuYWNjZXNzVG9rZW4pO1xuICAgICAgICByZXR1cm4gdGhpcy50b2tlbjtcbiAgICB9XG5cbiAgICBhc3luYyBzZXRSZWZyZXNoVG9rZW4ocmVmcmVzaFRva2VuOiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICB0aGlzLnJlZnJlc2hUb2tlbiA9IHJlZnJlc2hUb2tlbjtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmVUb2tlblZhbHVlKEtleXMucmVmcmVzaFRva2VuLCByZWZyZXNoVG9rZW4pO1xuICAgIH1cblxuICAgIGFzeW5jIGdldFJlZnJlc2hUb2tlbigpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBpZiAodGhpcy5yZWZyZXNoVG9rZW4gIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVmcmVzaFRva2VuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZWZyZXNoVG9rZW4gPSBhd2FpdCB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldDxzdHJpbmc+KEtleXMucmVmcmVzaFRva2VuKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVmcmVzaFRva2VuO1xuICAgIH1cblxuICAgIGFzeW5jIHRvZ2dsZVRva2VucygpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICBjb25zdCB0b2tlbiA9IGF3YWl0IHRoaXMuZ2V0VG9rZW4oKTtcbiAgICAgICAgY29uc3QgcmVmcmVzaFRva2VuID0gYXdhaXQgdGhpcy5nZXRSZWZyZXNoVG9rZW4oKTtcbiAgICAgICAgY29uc3QgY2xpZW50SWQgPSBhd2FpdCB0aGlzLmdldENsaWVudElkKCk7XG4gICAgICAgIGNvbnN0IGNsaWVudFNlY3JldCA9IGF3YWl0IHRoaXMuZ2V0Q2xpZW50U2VjcmV0KCk7XG4gICAgICAgIGNvbnN0IHRpbWVvdXQgPSBhd2FpdCB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldChDb25zdGFudHNTZXJ2aWNlLnZhdWx0VGltZW91dEtleSk7XG4gICAgICAgIGNvbnN0IGFjdGlvbiA9IGF3YWl0IHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0KENvbnN0YW50c1NlcnZpY2UudmF1bHRUaW1lb3V0QWN0aW9uS2V5KTtcbiAgICAgICAgaWYgKCh0aW1lb3V0ICE9IG51bGwgfHwgdGltZW91dCA9PT0gMCkgJiYgYWN0aW9uID09PSAnbG9nT3V0Jykge1xuICAgICAgICAgICAgLy8gaWYgd2UgaGF2ZSBhIHZhdWx0IHRpbWVvdXQgYW5kIHRoZSBhY3Rpb24gaXMgbG9nIG91dCwgcmVzZXQgdG9rZW5zXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNsZWFyVG9rZW4oKTtcbiAgICAgICAgICAgIHRoaXMudG9rZW4gPSB0b2tlbjtcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaFRva2VuID0gcmVmcmVzaFRva2VuO1xuICAgICAgICAgICAgdGhpcy5jbGllbnRJZCA9IGNsaWVudElkO1xuICAgICAgICAgICAgdGhpcy5jbGllbnRTZWNyZXQgPSBjbGllbnRTZWNyZXQ7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCB0aGlzLnNldFRva2VuKHRva2VuKTtcbiAgICAgICAgYXdhaXQgdGhpcy5zZXRSZWZyZXNoVG9rZW4ocmVmcmVzaFRva2VuKTtcbiAgICAgICAgYXdhaXQgdGhpcy5zZXRDbGllbnRJZChjbGllbnRJZCk7XG4gICAgICAgIGF3YWl0IHRoaXMuc2V0Q2xpZW50U2VjcmV0KGNsaWVudFNlY3JldCk7XG4gICAgfVxuXG4gICAgc2V0VHdvRmFjdG9yVG9rZW4odG9rZW46IHN0cmluZywgZW1haWw6IHN0cmluZyk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNhdmUoS2V5cy50d29GYWN0b3JUb2tlblByZWZpeCArIGVtYWlsLCB0b2tlbik7XG4gICAgfVxuXG4gICAgZ2V0VHdvRmFjdG9yVG9rZW4oZW1haWw6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldDxzdHJpbmc+KEtleXMudHdvRmFjdG9yVG9rZW5QcmVmaXggKyBlbWFpbCk7XG4gICAgfVxuXG4gICAgY2xlYXJUd29GYWN0b3JUb2tlbihlbWFpbDogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmFnZVNlcnZpY2UucmVtb3ZlKEtleXMudHdvRmFjdG9yVG9rZW5QcmVmaXggKyBlbWFpbCk7XG4gICAgfVxuXG4gICAgYXN5bmMgY2xlYXJUb2tlbigpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICB0aGlzLnRva2VuID0gbnVsbDtcbiAgICAgICAgdGhpcy5kZWNvZGVkVG9rZW4gPSBudWxsO1xuICAgICAgICB0aGlzLnJlZnJlc2hUb2tlbiA9IG51bGw7XG4gICAgICAgIHRoaXMuY2xpZW50SWQgPSBudWxsO1xuICAgICAgICB0aGlzLmNsaWVudFNlY3JldCA9IG51bGw7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5zdG9yYWdlU2VydmljZS5yZW1vdmUoS2V5cy5hY2Nlc3NUb2tlbik7XG4gICAgICAgIGF3YWl0IHRoaXMuc3RvcmFnZVNlcnZpY2UucmVtb3ZlKEtleXMucmVmcmVzaFRva2VuKTtcbiAgICAgICAgYXdhaXQgdGhpcy5zdG9yYWdlU2VydmljZS5yZW1vdmUoS2V5cy5jbGllbnRJZCk7XG4gICAgICAgIGF3YWl0IHRoaXMuc3RvcmFnZVNlcnZpY2UucmVtb3ZlKEtleXMuY2xpZW50U2VjcmV0KTtcbiAgICB9XG5cbiAgICAvLyBqd3RoZWxwZXIgbWV0aG9kc1xuICAgIC8vIHJlZiBodHRwczovL2dpdGh1Yi5jb20vYXV0aDAvYW5ndWxhci1qd3QvYmxvYi9tYXN0ZXIvc3JjL2FuZ3VsYXJKd3Qvc2VydmljZXMvand0LmpzXG5cbiAgICBkZWNvZGVUb2tlbigpOiBhbnkge1xuICAgICAgICBpZiAodGhpcy5kZWNvZGVkVG9rZW4pIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRlY29kZWRUb2tlbjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnRva2VuID09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVG9rZW4gbm90IGZvdW5kLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGFydHMgPSB0aGlzLnRva2VuLnNwbGl0KCcuJyk7XG4gICAgICAgIGlmIChwYXJ0cy5sZW5ndGggIT09IDMpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSldUIG11c3QgaGF2ZSAzIHBhcnRzJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkZWNvZGVkID0gVXRpbHMuZnJvbVVybEI2NFRvVXRmOChwYXJ0c1sxXSk7XG4gICAgICAgIGlmIChkZWNvZGVkID09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGRlY29kZSB0aGUgdG9rZW4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZGVjb2RlZFRva2VuID0gSlNPTi5wYXJzZShkZWNvZGVkKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGVjb2RlZFRva2VuO1xuICAgIH1cblxuICAgIGdldFRva2VuRXhwaXJhdGlvbkRhdGUoKTogRGF0ZSB7XG4gICAgICAgIGNvbnN0IGRlY29kZWQgPSB0aGlzLmRlY29kZVRva2VuKCk7XG4gICAgICAgIGlmICh0eXBlb2YgZGVjb2RlZC5leHAgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGQgPSBuZXcgRGF0ZSgwKTsgLy8gVGhlIDAgaGVyZSBpcyB0aGUga2V5LCB3aGljaCBzZXRzIHRoZSBkYXRlIHRvIHRoZSBlcG9jaFxuICAgICAgICBkLnNldFVUQ1NlY29uZHMoZGVjb2RlZC5leHApO1xuICAgICAgICByZXR1cm4gZDtcbiAgICB9XG5cbiAgICB0b2tlblNlY29uZHNSZW1haW5pbmcob2Zmc2V0U2Vjb25kczogbnVtYmVyID0gMCk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IGQgPSB0aGlzLmdldFRva2VuRXhwaXJhdGlvbkRhdGUoKTtcbiAgICAgICAgaWYgKGQgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtc1JlbWFpbmluZyA9IGQudmFsdWVPZigpIC0gKG5ldyBEYXRlKCkudmFsdWVPZigpICsgKG9mZnNldFNlY29uZHMgKiAxMDAwKSk7XG4gICAgICAgIHJldHVybiBNYXRoLnJvdW5kKG1zUmVtYWluaW5nIC8gMTAwMCk7XG4gICAgfVxuXG4gICAgdG9rZW5OZWVkc1JlZnJlc2gobWludXRlczogbnVtYmVyID0gNSk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBzUmVtYWluaW5nID0gdGhpcy50b2tlblNlY29uZHNSZW1haW5pbmcoKTtcbiAgICAgICAgcmV0dXJuIHNSZW1haW5pbmcgPCAoNjAgKiBtaW51dGVzKTtcbiAgICB9XG5cbiAgICBnZXRVc2VySWQoKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgZGVjb2RlZCA9IHRoaXMuZGVjb2RlVG9rZW4oKTtcbiAgICAgICAgaWYgKHR5cGVvZiBkZWNvZGVkLnN1YiA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gdXNlciBpZCBmb3VuZCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRlY29kZWQuc3ViIGFzIHN0cmluZztcbiAgICB9XG5cbiAgICBnZXRFbWFpbCgpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBkZWNvZGVkID0gdGhpcy5kZWNvZGVUb2tlbigpO1xuICAgICAgICBpZiAodHlwZW9mIGRlY29kZWQuZW1haWwgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGVtYWlsIGZvdW5kJyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGVjb2RlZC5lbWFpbCBhcyBzdHJpbmc7XG4gICAgfVxuXG4gICAgZ2V0RW1haWxWZXJpZmllZCgpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgZGVjb2RlZCA9IHRoaXMuZGVjb2RlVG9rZW4oKTtcbiAgICAgICAgaWYgKHR5cGVvZiBkZWNvZGVkLmVtYWlsX3ZlcmlmaWVkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBlbWFpbCB2ZXJpZmljYXRpb24gZm91bmQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkZWNvZGVkLmVtYWlsX3ZlcmlmaWVkIGFzIGJvb2xlYW47XG4gICAgfVxuXG4gICAgZ2V0TmFtZSgpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBkZWNvZGVkID0gdGhpcy5kZWNvZGVUb2tlbigpO1xuICAgICAgICBpZiAodHlwZW9mIGRlY29kZWQubmFtZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRlY29kZWQubmFtZSBhcyBzdHJpbmc7XG4gICAgfVxuXG4gICAgZ2V0UHJlbWl1bSgpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgZGVjb2RlZCA9IHRoaXMuZGVjb2RlVG9rZW4oKTtcbiAgICAgICAgaWYgKHR5cGVvZiBkZWNvZGVkLnByZW1pdW0gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGVjb2RlZC5wcmVtaXVtIGFzIGJvb2xlYW47XG4gICAgfVxuXG4gICAgZ2V0SXNzdWVyKCk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IGRlY29kZWQgPSB0aGlzLmRlY29kZVRva2VuKCk7XG4gICAgICAgIGlmICh0eXBlb2YgZGVjb2RlZC5pc3MgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGlzc3VlciBmb3VuZCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRlY29kZWQuaXNzIGFzIHN0cmluZztcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHN0b3JlVG9rZW5WYWx1ZShrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZykge1xuICAgICAgICBpZiAoYXdhaXQgdGhpcy5za2lwVG9rZW5TdG9yYWdlKCkpIHtcbiAgICAgICAgICAgIC8vIGlmIHdlIGhhdmUgYSB2YXVsdCB0aW1lb3V0IGFuZCB0aGUgYWN0aW9uIGlzIGxvZyBvdXQsIGRvbid0IHN0b3JlIHRva2VuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5zdG9yYWdlU2VydmljZS5zYXZlKGtleSwgdmFsdWUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgc2tpcFRva2VuU3RvcmFnZSgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgY29uc3QgdGltZW91dCA9IGF3YWl0IHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0PG51bWJlcj4oQ29uc3RhbnRzU2VydmljZS52YXVsdFRpbWVvdXRLZXkpO1xuICAgICAgICBjb25zdCBhY3Rpb24gPSBhd2FpdCB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldDxzdHJpbmc+KENvbnN0YW50c1NlcnZpY2UudmF1bHRUaW1lb3V0QWN0aW9uS2V5KTtcbiAgICAgICAgcmV0dXJuIHRpbWVvdXQgIT0gbnVsbCAmJiBhY3Rpb24gPT09ICdsb2dPdXQnO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IENvbnN0YW50c1NlcnZpY2UgfSBmcm9tICcuL2NvbnN0YW50cy5zZXJ2aWNlJztcblxuaW1wb3J0IHsgQ3J5cHRvRnVuY3Rpb25TZXJ2aWNlIH0gZnJvbSAnLi4vYWJzdHJhY3Rpb25zL2NyeXB0b0Z1bmN0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgTG9nU2VydmljZSB9IGZyb20gJy4uL2Fic3RyYWN0aW9ucy9sb2cuc2VydmljZSc7XG5pbXBvcnQgeyBTdG9yYWdlU2VydmljZSB9IGZyb20gJy4uL2Fic3RyYWN0aW9ucy9zdG9yYWdlLnNlcnZpY2UnO1xuaW1wb3J0IHsgVG90cFNlcnZpY2UgYXMgVG90cFNlcnZpY2VBYnN0cmFjdGlvbiB9IGZyb20gJy4uL2Fic3RyYWN0aW9ucy90b3RwLnNlcnZpY2UnO1xuXG5pbXBvcnQgeyBVdGlscyB9IGZyb20gJy4uL21pc2MvdXRpbHMnO1xuXG5jb25zdCBCMzJDaGFycyA9ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWjIzNDU2Nyc7XG5jb25zdCBTdGVhbUNoYXJzID0gJzIzNDU2Nzg5QkNERkdISktNTlBRUlRWV1hZJztcblxuZXhwb3J0IGNsYXNzIFRvdHBTZXJ2aWNlIGltcGxlbWVudHMgVG90cFNlcnZpY2VBYnN0cmFjdGlvbiB7XG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBzdG9yYWdlU2VydmljZTogU3RvcmFnZVNlcnZpY2UsIHByaXZhdGUgY3J5cHRvRnVuY3Rpb25TZXJ2aWNlOiBDcnlwdG9GdW5jdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBsb2dTZXJ2aWNlOiBMb2dTZXJ2aWNlKSB7IH1cblxuICAgIGFzeW5jIGdldENvZGUoa2V5OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBpZiAoa2V5ID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGxldCBwZXJpb2QgPSAzMDtcbiAgICAgICAgbGV0IGFsZzogJ3NoYTEnIHwgJ3NoYTI1NicgfCAnc2hhNTEyJyA9ICdzaGExJztcbiAgICAgICAgbGV0IGRpZ2l0cyA9IDY7XG4gICAgICAgIGxldCBrZXlCMzIgPSBrZXk7XG4gICAgICAgIGNvbnN0IGlzT3RwQXV0aCA9IGtleS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoJ290cGF1dGg6Ly8nKSA9PT0gMDtcbiAgICAgICAgY29uc3QgaXNTdGVhbUF1dGggPSAhaXNPdHBBdXRoICYmIGtleS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoJ3N0ZWFtOi8vJykgPT09IDA7XG4gICAgICAgIGlmIChpc090cEF1dGgpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmFtcyA9IFV0aWxzLmdldFF1ZXJ5UGFyYW1zKGtleSk7XG4gICAgICAgICAgICBpZiAocGFyYW1zLmhhcygnZGlnaXRzJykgJiYgcGFyYW1zLmdldCgnZGlnaXRzJykgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRpZ2l0UGFyYW1zID0gcGFyc2VJbnQocGFyYW1zLmdldCgnZGlnaXRzJykudHJpbSgpLCBudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRpZ2l0UGFyYW1zID4gMTApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpZ2l0cyA9IDEwO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRpZ2l0UGFyYW1zID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGlnaXRzID0gZGlnaXRQYXJhbXM7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dTZXJ2aWNlLmVycm9yKCdJbnZhbGlkIGRpZ2l0cyBwYXJhbS4nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocGFyYW1zLmhhcygncGVyaW9kJykgJiYgcGFyYW1zLmdldCgncGVyaW9kJykgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBlcmlvZFBhcmFtID0gcGFyc2VJbnQocGFyYW1zLmdldCgncGVyaW9kJykudHJpbSgpLCBudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBlcmlvZFBhcmFtID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGVyaW9kID0gcGVyaW9kUGFyYW07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dTZXJ2aWNlLmVycm9yKCdJbnZhbGlkIHBlcmlvZCBwYXJhbS4nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocGFyYW1zLmhhcygnc2VjcmV0JykgJiYgcGFyYW1zLmdldCgnc2VjcmV0JykgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGtleUIzMiA9IHBhcmFtcy5nZXQoJ3NlY3JldCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHBhcmFtcy5oYXMoJ2FsZ29yaXRobScpICYmIHBhcmFtcy5nZXQoJ2FsZ29yaXRobScpICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhbGdQYXJhbSA9IHBhcmFtcy5nZXQoJ2FsZ29yaXRobScpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgaWYgKGFsZ1BhcmFtID09PSAnc2hhMScgfHwgYWxnUGFyYW0gPT09ICdzaGEyNTYnIHx8IGFsZ1BhcmFtID09PSAnc2hhNTEyJykge1xuICAgICAgICAgICAgICAgICAgICBhbGcgPSBhbGdQYXJhbTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoaXNTdGVhbUF1dGgpIHtcbiAgICAgICAgICAgIGtleUIzMiA9IGtleS5zdWJzdHIoJ3N0ZWFtOi8vJy5sZW5ndGgpO1xuICAgICAgICAgICAgZGlnaXRzID0gNTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGVwb2NoID0gTWF0aC5yb3VuZChuZXcgRGF0ZSgpLmdldFRpbWUoKSAvIDEwMDAuMCk7XG4gICAgICAgIGNvbnN0IHRpbWVIZXggPSB0aGlzLmxlZnRQYWQodGhpcy5kZWNUb0hleChNYXRoLmZsb29yKGVwb2NoIC8gcGVyaW9kKSksIDE2LCAnMCcpO1xuICAgICAgICBjb25zdCB0aW1lQnl0ZXMgPSBVdGlscy5mcm9tSGV4VG9BcnJheSh0aW1lSGV4KTtcbiAgICAgICAgY29uc3Qga2V5Qnl0ZXMgPSB0aGlzLmIzMlRvQnl0ZXMoa2V5QjMyKTtcblxuICAgICAgICBpZiAoIWtleUJ5dGVzLmxlbmd0aCB8fCAhdGltZUJ5dGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBoYXNoID0gYXdhaXQgdGhpcy5zaWduKGtleUJ5dGVzLCB0aW1lQnl0ZXMsIGFsZyk7XG4gICAgICAgIGlmIChoYXNoLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvKiB0c2xpbnQ6ZGlzYWJsZSAqL1xuICAgICAgICBjb25zdCBvZmZzZXQgPSAoaGFzaFtoYXNoLmxlbmd0aCAtIDFdICYgMHhmKTtcbiAgICAgICAgY29uc3QgYmluYXJ5ID0gKChoYXNoW29mZnNldF0gJiAweDdmKSA8PCAyNCkgfCAoKGhhc2hbb2Zmc2V0ICsgMV0gJiAweGZmKSA8PCAxNikgfFxuICAgICAgICAgICAgKChoYXNoW29mZnNldCArIDJdICYgMHhmZikgPDwgOCkgfCAoaGFzaFtvZmZzZXQgKyAzXSAmIDB4ZmYpO1xuICAgICAgICAvKiB0c2xpbnQ6ZW5hYmxlICovXG5cbiAgICAgICAgbGV0IG90cCA9ICcnO1xuICAgICAgICBpZiAoaXNTdGVhbUF1dGgpIHtcbiAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZVxuICAgICAgICAgICAgbGV0IGZ1bGxDb2RlID0gYmluYXJ5ICYgMHg3ZmZmZmZmZjtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGlnaXRzOyBpKyspIHtcbiAgICAgICAgICAgICAgICBvdHAgKz0gU3RlYW1DaGFyc1tmdWxsQ29kZSAlIFN0ZWFtQ2hhcnMubGVuZ3RoXTtcbiAgICAgICAgICAgICAgICBmdWxsQ29kZSA9IE1hdGgudHJ1bmMoZnVsbENvZGUgLyBTdGVhbUNoYXJzLmxlbmd0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBvdHAgPSAoYmluYXJ5ICUgTWF0aC5wb3coMTAsIGRpZ2l0cykpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICBvdHAgPSB0aGlzLmxlZnRQYWQob3RwLCBkaWdpdHMsICcwJyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gb3RwO1xuICAgIH1cblxuICAgIGdldFRpbWVJbnRlcnZhbChrZXk6IHN0cmluZyk6IG51bWJlciB7XG4gICAgICAgIGxldCBwZXJpb2QgPSAzMDtcbiAgICAgICAgaWYgKGtleSAhPSBudWxsICYmIGtleS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoJ290cGF1dGg6Ly8nKSA9PT0gMCkge1xuICAgICAgICAgICAgY29uc3QgcGFyYW1zID0gVXRpbHMuZ2V0UXVlcnlQYXJhbXMoa2V5KTtcbiAgICAgICAgICAgIGlmIChwYXJhbXMuaGFzKCdwZXJpb2QnKSAmJiBwYXJhbXMuZ2V0KCdwZXJpb2QnKSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcGVyaW9kID0gcGFyc2VJbnQocGFyYW1zLmdldCgncGVyaW9kJykudHJpbSgpLCBudWxsKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dTZXJ2aWNlLmVycm9yKCdJbnZhbGlkIHBlcmlvZCBwYXJhbS4nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBlcmlvZDtcbiAgICB9XG5cbiAgICBhc3luYyBpc0F1dG9Db3B5RW5hYmxlZCgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgcmV0dXJuICEoYXdhaXQgdGhpcy5zdG9yYWdlU2VydmljZS5nZXQ8Ym9vbGVhbj4oQ29uc3RhbnRzU2VydmljZS5kaXNhYmxlQXV0b1RvdHBDb3B5S2V5KSk7XG4gICAgfVxuXG4gICAgLy8gSGVscGVyc1xuXG4gICAgcHJpdmF0ZSBsZWZ0UGFkKHM6IHN0cmluZywgbDogbnVtYmVyLCBwOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBpZiAobCArIDEgPj0gcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHMgPSBBcnJheShsICsgMSAtIHMubGVuZ3RoKS5qb2luKHApICsgcztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcztcbiAgICB9XG5cbiAgICBwcml2YXRlIGRlY1RvSGV4KGQ6IG51bWJlcik6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiAoZCA8IDE1LjUgPyAnMCcgOiAnJykgKyBNYXRoLnJvdW5kKGQpLnRvU3RyaW5nKDE2KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGIzMlRvSGV4KHM6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIHMgPSBzLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgIGxldCBjbGVhbmVkSW5wdXQgPSAnJztcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChCMzJDaGFycy5pbmRleE9mKHNbaV0pIDwgMCkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjbGVhbmVkSW5wdXQgKz0gc1tpXTtcbiAgICAgICAgfVxuICAgICAgICBzID0gY2xlYW5lZElucHV0O1xuXG4gICAgICAgIGxldCBiaXRzID0gJyc7XG4gICAgICAgIGxldCBoZXggPSAnJztcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBieXRlSW5kZXggPSBCMzJDaGFycy5pbmRleE9mKHMuY2hhckF0KGkpKTtcbiAgICAgICAgICAgIGlmIChieXRlSW5kZXggPCAwKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBiaXRzICs9IHRoaXMubGVmdFBhZChieXRlSW5kZXgudG9TdHJpbmcoMiksIDUsICcwJyk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgKyA0IDw9IGJpdHMubGVuZ3RoOyBpICs9IDQpIHtcbiAgICAgICAgICAgIGNvbnN0IGNodW5rID0gYml0cy5zdWJzdHIoaSwgNCk7XG4gICAgICAgICAgICBoZXggPSBoZXggKyBwYXJzZUludChjaHVuaywgMikudG9TdHJpbmcoMTYpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBoZXg7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBiMzJUb0J5dGVzKHM6IHN0cmluZyk6IFVpbnQ4QXJyYXkge1xuICAgICAgICByZXR1cm4gVXRpbHMuZnJvbUhleFRvQXJyYXkodGhpcy5iMzJUb0hleChzKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBzaWduKGtleUJ5dGVzOiBVaW50OEFycmF5LCB0aW1lQnl0ZXM6IFVpbnQ4QXJyYXksIGFsZzogJ3NoYTEnIHwgJ3NoYTI1NicgfCAnc2hhNTEyJykge1xuICAgICAgICBjb25zdCBzaWduYXR1cmUgPSBhd2FpdCB0aGlzLmNyeXB0b0Z1bmN0aW9uU2VydmljZS5obWFjKHRpbWVCeXRlcy5idWZmZXIsIGtleUJ5dGVzLmJ1ZmZlciwgYWxnKTtcbiAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KHNpZ25hdHVyZSk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgU3RvcmFnZVNlcnZpY2UgfSBmcm9tICcuLi9hYnN0cmFjdGlvbnMvc3RvcmFnZS5zZXJ2aWNlJztcbmltcG9ydCB7IFRva2VuU2VydmljZSB9IGZyb20gJy4uL2Fic3RyYWN0aW9ucy90b2tlbi5zZXJ2aWNlJztcbmltcG9ydCB7IFVzZXJTZXJ2aWNlIGFzIFVzZXJTZXJ2aWNlQWJzdHJhY3Rpb24gfSBmcm9tICcuLi9hYnN0cmFjdGlvbnMvdXNlci5zZXJ2aWNlJztcblxuaW1wb3J0IHsgT3JnYW5pemF0aW9uRGF0YSB9IGZyb20gJy4uL21vZGVscy9kYXRhL29yZ2FuaXphdGlvbkRhdGEnO1xuaW1wb3J0IHsgT3JnYW5pemF0aW9uIH0gZnJvbSAnLi4vbW9kZWxzL2RvbWFpbi9vcmdhbml6YXRpb24nO1xuXG5pbXBvcnQgeyBLZGZUeXBlIH0gZnJvbSAnLi4vZW51bXMva2RmVHlwZSc7XG5pbXBvcnQgeyBQcm92aWRlckRhdGEgfSBmcm9tICcuLi9tb2RlbHMvZGF0YS9wcm92aWRlckRhdGEnO1xuaW1wb3J0IHsgUHJvdmlkZXIgfSBmcm9tICcuLi9tb2RlbHMvZG9tYWluL3Byb3ZpZGVyJztcblxuY29uc3QgS2V5cyA9IHtcbiAgICB1c2VySWQ6ICd1c2VySWQnLFxuICAgIHVzZXJFbWFpbDogJ3VzZXJFbWFpbCcsXG4gICAgc3RhbXA6ICdzZWN1cml0eVN0YW1wJyxcbiAgICBrZGY6ICdrZGYnLFxuICAgIGtkZkl0ZXJhdGlvbnM6ICdrZGZJdGVyYXRpb25zJyxcbiAgICBvcmdhbml6YXRpb25zUHJlZml4OiAnb3JnYW5pemF0aW9uc18nLFxuICAgIHByb3ZpZGVyc1ByZWZpeDogJ3Byb3ZpZGVyc18nLFxuICAgIGVtYWlsVmVyaWZpZWQ6ICdlbWFpbFZlcmlmaWVkJyxcbiAgICBmb3JjZVBhc3N3b3JkUmVzZXQ6ICdmb3JjZVBhc3N3b3JkUmVzZXQnLFxufTtcblxuZXhwb3J0IGNsYXNzIFVzZXJTZXJ2aWNlIGltcGxlbWVudHMgVXNlclNlcnZpY2VBYnN0cmFjdGlvbiB7XG4gICAgcHJpdmF0ZSB1c2VySWQ6IHN0cmluZztcbiAgICBwcml2YXRlIGVtYWlsOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBzdGFtcDogc3RyaW5nO1xuICAgIHByaXZhdGUga2RmOiBLZGZUeXBlO1xuICAgIHByaXZhdGUga2RmSXRlcmF0aW9uczogbnVtYmVyO1xuICAgIHByaXZhdGUgZW1haWxWZXJpZmllZDogYm9vbGVhbjtcbiAgICBwcml2YXRlIGZvcmNlUGFzc3dvcmRSZXNldDogYm9vbGVhbjtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgdG9rZW5TZXJ2aWNlOiBUb2tlblNlcnZpY2UsIHByaXZhdGUgc3RvcmFnZVNlcnZpY2U6IFN0b3JhZ2VTZXJ2aWNlKSB7IH1cblxuICAgIGFzeW5jIHNldEluZm9ybWF0aW9uKHVzZXJJZDogc3RyaW5nLCBlbWFpbDogc3RyaW5nLCBrZGY6IEtkZlR5cGUsIGtkZkl0ZXJhdGlvbnM6IG51bWJlcik6IFByb21pc2U8YW55PiB7XG4gICAgICAgIHRoaXMuZW1haWwgPSBlbWFpbDtcbiAgICAgICAgdGhpcy51c2VySWQgPSB1c2VySWQ7XG4gICAgICAgIHRoaXMua2RmID0ga2RmO1xuICAgICAgICB0aGlzLmtkZkl0ZXJhdGlvbnMgPSBrZGZJdGVyYXRpb25zO1xuXG4gICAgICAgIGF3YWl0IHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2F2ZShLZXlzLnVzZXJFbWFpbCwgZW1haWwpO1xuICAgICAgICBhd2FpdCB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNhdmUoS2V5cy51c2VySWQsIHVzZXJJZCk7XG4gICAgICAgIGF3YWl0IHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2F2ZShLZXlzLmtkZiwga2RmKTtcbiAgICAgICAgYXdhaXQgdGhpcy5zdG9yYWdlU2VydmljZS5zYXZlKEtleXMua2RmSXRlcmF0aW9ucywga2RmSXRlcmF0aW9ucyk7XG4gICAgfVxuXG4gICAgc2V0U2VjdXJpdHlTdGFtcChzdGFtcDogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgdGhpcy5zdGFtcCA9IHN0YW1wO1xuICAgICAgICByZXR1cm4gdGhpcy5zdG9yYWdlU2VydmljZS5zYXZlKEtleXMuc3RhbXAsIHN0YW1wKTtcbiAgICB9XG5cbiAgICBzZXRFbWFpbFZlcmlmaWVkKGVtYWlsVmVyaWZpZWQ6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5lbWFpbFZlcmlmaWVkID0gZW1haWxWZXJpZmllZDtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2F2ZShLZXlzLmVtYWlsVmVyaWZpZWQsIGVtYWlsVmVyaWZpZWQpO1xuICAgIH1cblxuICAgIHNldEZvcmNlUGFzc3dvcmRSZXNldChmb3JjZVBhc3N3b3JkUmVzZXQ6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5mb3JjZVBhc3N3b3JkUmVzZXQgPSBmb3JjZVBhc3N3b3JkUmVzZXQ7XG4gICAgICAgIHJldHVybiB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNhdmUoS2V5cy5mb3JjZVBhc3N3b3JkUmVzZXQsIGZvcmNlUGFzc3dvcmRSZXNldCk7XG4gICAgfVxuXG4gICAgYXN5bmMgZ2V0VXNlcklkKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIGlmICh0aGlzLnVzZXJJZCA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnVzZXJJZCA9IGF3YWl0IHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0PHN0cmluZz4oS2V5cy51c2VySWQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnVzZXJJZDtcbiAgICB9XG5cbiAgICBhc3luYyBnZXRFbWFpbCgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBpZiAodGhpcy5lbWFpbCA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmVtYWlsID0gYXdhaXQgdGhpcy5zdG9yYWdlU2VydmljZS5nZXQ8c3RyaW5nPihLZXlzLnVzZXJFbWFpbCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZW1haWw7XG4gICAgfVxuXG4gICAgYXN5bmMgZ2V0U2VjdXJpdHlTdGFtcCgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBpZiAodGhpcy5zdGFtcCA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnN0YW1wID0gYXdhaXQgdGhpcy5zdG9yYWdlU2VydmljZS5nZXQ8c3RyaW5nPihLZXlzLnN0YW1wKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5zdGFtcDtcbiAgICB9XG5cbiAgICBhc3luYyBnZXRLZGYoKTogUHJvbWlzZTxLZGZUeXBlPiB7XG4gICAgICAgIGlmICh0aGlzLmtkZiA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmtkZiA9IGF3YWl0IHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0PEtkZlR5cGU+KEtleXMua2RmKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5rZGY7XG4gICAgfVxuXG4gICAgYXN5bmMgZ2V0S2RmSXRlcmF0aW9ucygpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgICAgICBpZiAodGhpcy5rZGZJdGVyYXRpb25zID09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMua2RmSXRlcmF0aW9ucyA9IGF3YWl0IHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0PG51bWJlcj4oS2V5cy5rZGZJdGVyYXRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5rZGZJdGVyYXRpb25zO1xuICAgIH1cblxuICAgIGFzeW5jIGdldEVtYWlsVmVyaWZpZWQoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGlmICh0aGlzLmVtYWlsVmVyaWZpZWQgPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5lbWFpbFZlcmlmaWVkID0gYXdhaXQgdGhpcy5zdG9yYWdlU2VydmljZS5nZXQ8Ym9vbGVhbj4oS2V5cy5lbWFpbFZlcmlmaWVkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5lbWFpbFZlcmlmaWVkO1xuICAgIH1cblxuICAgIGFzeW5jIGdldEZvcmNlUGFzc3dvcmRSZXNldCgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgaWYgKHRoaXMuZm9yY2VQYXNzd29yZFJlc2V0ID09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuZm9yY2VQYXNzd29yZFJlc2V0ID0gYXdhaXQgdGhpcy5zdG9yYWdlU2VydmljZS5nZXQ8Ym9vbGVhbj4oS2V5cy5mb3JjZVBhc3N3b3JkUmVzZXQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmZvcmNlUGFzc3dvcmRSZXNldDtcbiAgICB9XG5cbiAgICBhc3luYyBjbGVhcigpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICBjb25zdCB1c2VySWQgPSBhd2FpdCB0aGlzLmdldFVzZXJJZCgpO1xuXG4gICAgICAgIGF3YWl0IHRoaXMuc3RvcmFnZVNlcnZpY2UucmVtb3ZlKEtleXMudXNlcklkKTtcbiAgICAgICAgYXdhaXQgdGhpcy5zdG9yYWdlU2VydmljZS5yZW1vdmUoS2V5cy51c2VyRW1haWwpO1xuICAgICAgICBhd2FpdCB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnJlbW92ZShLZXlzLnN0YW1wKTtcbiAgICAgICAgYXdhaXQgdGhpcy5zdG9yYWdlU2VydmljZS5yZW1vdmUoS2V5cy5rZGYpO1xuICAgICAgICBhd2FpdCB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnJlbW92ZShLZXlzLmtkZkl0ZXJhdGlvbnMpO1xuICAgICAgICBhd2FpdCB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnJlbW92ZShLZXlzLmZvcmNlUGFzc3dvcmRSZXNldCk7XG4gICAgICAgIGF3YWl0IHRoaXMuY2xlYXJPcmdhbml6YXRpb25zKHVzZXJJZCk7XG4gICAgICAgIGF3YWl0IHRoaXMuY2xlYXJQcm92aWRlcnModXNlcklkKTtcblxuICAgICAgICB0aGlzLnVzZXJJZCA9IHRoaXMuZW1haWwgPSB0aGlzLnN0YW1wID0gbnVsbDtcbiAgICAgICAgdGhpcy5rZGYgPSBudWxsO1xuICAgICAgICB0aGlzLmtkZkl0ZXJhdGlvbnMgPSBudWxsO1xuICAgIH1cblxuICAgIGFzeW5jIGlzQXV0aGVudGljYXRlZCgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgY29uc3QgdG9rZW4gPSBhd2FpdCB0aGlzLnRva2VuU2VydmljZS5nZXRUb2tlbigpO1xuICAgICAgICBpZiAodG9rZW4gPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdXNlcklkID0gYXdhaXQgdGhpcy5nZXRVc2VySWQoKTtcbiAgICAgICAgcmV0dXJuIHVzZXJJZCAhPSBudWxsO1xuICAgIH1cblxuICAgIGFzeW5jIGNhbkFjY2Vzc1ByZW1pdW0oKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGNvbnN0IGF1dGhlZCA9IGF3YWl0IHRoaXMuaXNBdXRoZW50aWNhdGVkKCk7XG4gICAgICAgIGlmICghYXV0aGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0b2tlblByZW1pdW0gPSB0aGlzLnRva2VuU2VydmljZS5nZXRQcmVtaXVtKCk7XG4gICAgICAgIGlmICh0b2tlblByZW1pdW0pIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgb3JncyA9IGF3YWl0IHRoaXMuZ2V0QWxsT3JnYW5pemF0aW9ucygpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9yZ3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChvcmdzW2ldLnVzZXJzR2V0UHJlbWl1bSAmJiBvcmdzW2ldLmVuYWJsZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgYXN5bmMgZ2V0T3JnYW5pemF0aW9uKGlkOiBzdHJpbmcpOiBQcm9taXNlPE9yZ2FuaXphdGlvbj4ge1xuICAgICAgICBjb25zdCB1c2VySWQgPSBhd2FpdCB0aGlzLmdldFVzZXJJZCgpO1xuICAgICAgICBjb25zdCBvcmdhbml6YXRpb25zID0gYXdhaXQgdGhpcy5zdG9yYWdlU2VydmljZS5nZXQ8eyBbaWQ6IHN0cmluZ106IE9yZ2FuaXphdGlvbkRhdGE7IH0+KFxuICAgICAgICAgICAgS2V5cy5vcmdhbml6YXRpb25zUHJlZml4ICsgdXNlcklkKTtcbiAgICAgICAgaWYgKG9yZ2FuaXphdGlvbnMgPT0gbnVsbCB8fCAhb3JnYW5pemF0aW9ucy5oYXNPd25Qcm9wZXJ0eShpZCkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBPcmdhbml6YXRpb24ob3JnYW5pemF0aW9uc1tpZF0pO1xuICAgIH1cblxuICAgIGFzeW5jIGdldE9yZ2FuaXphdGlvbkJ5SWRlbnRpZmllcihpZGVudGlmaWVyOiBzdHJpbmcpOiBQcm9taXNlPE9yZ2FuaXphdGlvbj4ge1xuICAgICAgICBjb25zdCBvcmdhbml6YXRpb25zID0gYXdhaXQgdGhpcy5nZXRBbGxPcmdhbml6YXRpb25zKCk7XG4gICAgICAgIGlmIChvcmdhbml6YXRpb25zID09IG51bGwgfHwgb3JnYW5pemF0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG9yZ2FuaXphdGlvbnMuZmluZChvID0+IG8uaWRlbnRpZmllciA9PT0gaWRlbnRpZmllcik7XG4gICAgfVxuXG4gICAgYXN5bmMgZ2V0QWxsT3JnYW5pemF0aW9ucygpOiBQcm9taXNlPE9yZ2FuaXphdGlvbltdPiB7XG4gICAgICAgIGNvbnN0IHVzZXJJZCA9IGF3YWl0IHRoaXMuZ2V0VXNlcklkKCk7XG4gICAgICAgIGNvbnN0IG9yZ2FuaXphdGlvbnMgPSBhd2FpdCB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldDx7IFtpZDogc3RyaW5nXTogT3JnYW5pemF0aW9uRGF0YTsgfT4oXG4gICAgICAgICAgICBLZXlzLm9yZ2FuaXphdGlvbnNQcmVmaXggKyB1c2VySWQpO1xuICAgICAgICBjb25zdCByZXNwb25zZTogT3JnYW5pemF0aW9uW10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBpZCBpbiBvcmdhbml6YXRpb25zKSB7XG4gICAgICAgICAgICBpZiAob3JnYW5pemF0aW9ucy5oYXNPd25Qcm9wZXJ0eShpZCkgJiYgIW9yZ2FuaXphdGlvbnNbaWRdLmlzUHJvdmlkZXJVc2VyKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2UucHVzaChuZXcgT3JnYW5pemF0aW9uKG9yZ2FuaXphdGlvbnNbaWRdKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgIH1cblxuICAgIGFzeW5jIHJlcGxhY2VPcmdhbml6YXRpb25zKG9yZ2FuaXphdGlvbnM6IHsgW2lkOiBzdHJpbmddOiBPcmdhbml6YXRpb25EYXRhOyB9KTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgY29uc3QgdXNlcklkID0gYXdhaXQgdGhpcy5nZXRVc2VySWQoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5zdG9yYWdlU2VydmljZS5zYXZlKEtleXMub3JnYW5pemF0aW9uc1ByZWZpeCArIHVzZXJJZCwgb3JnYW5pemF0aW9ucyk7XG4gICAgfVxuXG4gICAgYXN5bmMgY2xlYXJPcmdhbml6YXRpb25zKHVzZXJJZDogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5zdG9yYWdlU2VydmljZS5yZW1vdmUoS2V5cy5vcmdhbml6YXRpb25zUHJlZml4ICsgdXNlcklkKTtcbiAgICB9XG5cbiAgICBhc3luYyBnZXRQcm92aWRlcihpZDogc3RyaW5nKTogUHJvbWlzZTxQcm92aWRlcj4ge1xuICAgICAgICBjb25zdCB1c2VySWQgPSBhd2FpdCB0aGlzLmdldFVzZXJJZCgpO1xuICAgICAgICBjb25zdCBwcm92aWRlcnMgPSBhd2FpdCB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldDx7IFtpZDogc3RyaW5nXTogUHJvdmlkZXJEYXRhOyB9PihcbiAgICAgICAgICAgIEtleXMucHJvdmlkZXJzUHJlZml4ICsgdXNlcklkKTtcbiAgICAgICAgaWYgKHByb3ZpZGVycyA9PSBudWxsIHx8ICFwcm92aWRlcnMuaGFzT3duUHJvcGVydHkoaWQpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgUHJvdmlkZXIocHJvdmlkZXJzW2lkXSk7XG4gICAgfVxuXG4gICAgYXN5bmMgZ2V0QWxsUHJvdmlkZXJzKCk6IFByb21pc2U8UHJvdmlkZXJbXT4ge1xuICAgICAgICBjb25zdCB1c2VySWQgPSBhd2FpdCB0aGlzLmdldFVzZXJJZCgpO1xuICAgICAgICBjb25zdCBwcm92aWRlcnMgPSBhd2FpdCB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldDx7IFtpZDogc3RyaW5nXTogUHJvdmlkZXJEYXRhOyB9PihcbiAgICAgICAgICAgIEtleXMucHJvdmlkZXJzUHJlZml4ICsgdXNlcklkKTtcbiAgICAgICAgY29uc3QgcmVzcG9uc2U6IFByb3ZpZGVyW10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBpZCBpbiBwcm92aWRlcnMpIHtcbiAgICAgICAgICAgIGlmIChwcm92aWRlcnMuaGFzT3duUHJvcGVydHkoaWQpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2UucHVzaChuZXcgUHJvdmlkZXIocHJvdmlkZXJzW2lkXSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICB9XG5cbiAgICBhc3luYyByZXBsYWNlUHJvdmlkZXJzKHByb3ZpZGVyczogeyBbaWQ6IHN0cmluZ106IFByb3ZpZGVyRGF0YTsgfSk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIGNvbnN0IHVzZXJJZCA9IGF3YWl0IHRoaXMuZ2V0VXNlcklkKCk7XG4gICAgICAgIGF3YWl0IHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2F2ZShLZXlzLnByb3ZpZGVyc1ByZWZpeCArIHVzZXJJZCwgcHJvdmlkZXJzKTtcbiAgICB9XG5cbiAgICBhc3luYyBjbGVhclByb3ZpZGVycyh1c2VySWQ6IHN0cmluZyk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIGF3YWl0IHRoaXMuc3RvcmFnZVNlcnZpY2UucmVtb3ZlKEtleXMucHJvdmlkZXJzUHJlZml4ICsgdXNlcklkKTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBDb25zdGFudHNTZXJ2aWNlIH0gZnJvbSAnLi9jb25zdGFudHMuc2VydmljZSc7XG5cbmltcG9ydCB7IENpcGhlclNlcnZpY2UgfSBmcm9tICcuLi9hYnN0cmFjdGlvbnMvY2lwaGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ29sbGVjdGlvblNlcnZpY2UgfSBmcm9tICcuLi9hYnN0cmFjdGlvbnMvY29sbGVjdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IENyeXB0b1NlcnZpY2UgfSBmcm9tICcuLi9hYnN0cmFjdGlvbnMvY3J5cHRvLnNlcnZpY2UnO1xuaW1wb3J0IHsgRm9sZGVyU2VydmljZSB9IGZyb20gJy4uL2Fic3RyYWN0aW9ucy9mb2xkZXIuc2VydmljZSc7XG5pbXBvcnQgeyBNZXNzYWdpbmdTZXJ2aWNlIH0gZnJvbSAnLi4vYWJzdHJhY3Rpb25zL21lc3NhZ2luZy5zZXJ2aWNlJztcbmltcG9ydCB7IFBsYXRmb3JtVXRpbHNTZXJ2aWNlIH0gZnJvbSAnLi4vYWJzdHJhY3Rpb25zL3BsYXRmb3JtVXRpbHMuc2VydmljZSc7XG5pbXBvcnQgeyBQb2xpY3lTZXJ2aWNlIH0gZnJvbSAnLi4vYWJzdHJhY3Rpb25zL3BvbGljeS5zZXJ2aWNlJztcbmltcG9ydCB7IFNlYXJjaFNlcnZpY2UgfSBmcm9tICcuLi9hYnN0cmFjdGlvbnMvc2VhcmNoLnNlcnZpY2UnO1xuaW1wb3J0IHsgU3RvcmFnZVNlcnZpY2UgfSBmcm9tICcuLi9hYnN0cmFjdGlvbnMvc3RvcmFnZS5zZXJ2aWNlJztcbmltcG9ydCB7IFRva2VuU2VydmljZSB9IGZyb20gJy4uL2Fic3RyYWN0aW9ucy90b2tlbi5zZXJ2aWNlJztcbmltcG9ydCB7IFVzZXJTZXJ2aWNlIH0gZnJvbSAnLi4vYWJzdHJhY3Rpb25zL3VzZXIuc2VydmljZSc7XG5pbXBvcnQgeyBWYXVsdFRpbWVvdXRTZXJ2aWNlIGFzIFZhdWx0VGltZW91dFNlcnZpY2VBYnN0cmFjdGlvbiB9IGZyb20gJy4uL2Fic3RyYWN0aW9ucy92YXVsdFRpbWVvdXQuc2VydmljZSc7XG5cbmltcG9ydCB7IFBvbGljeVR5cGUgfSBmcm9tICcuLi9lbnVtcy9wb2xpY3lUeXBlJztcbmltcG9ydCB7IEVuY1N0cmluZyB9IGZyb20gJy4uL21vZGVscy9kb21haW4vZW5jU3RyaW5nJztcblxuZXhwb3J0IGNsYXNzIFZhdWx0VGltZW91dFNlcnZpY2UgaW1wbGVtZW50cyBWYXVsdFRpbWVvdXRTZXJ2aWNlQWJzdHJhY3Rpb24ge1xuICAgIHBpblByb3RlY3RlZEtleTogRW5jU3RyaW5nID0gbnVsbDtcbiAgICBiaW9tZXRyaWNMb2NrZWQ6IGJvb2xlYW4gPSB0cnVlO1xuICAgIGV2ZXJCZWVuVW5sb2NrZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIHByaXZhdGUgaW5pdGVkID0gZmFsc2U7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNpcGhlclNlcnZpY2U6IENpcGhlclNlcnZpY2UsIHByaXZhdGUgZm9sZGVyU2VydmljZTogRm9sZGVyU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBjb2xsZWN0aW9uU2VydmljZTogQ29sbGVjdGlvblNlcnZpY2UsIHByaXZhdGUgY3J5cHRvU2VydmljZTogQ3J5cHRvU2VydmljZSxcbiAgICAgICAgcHJvdGVjdGVkIHBsYXRmb3JtVXRpbHNTZXJ2aWNlOiBQbGF0Zm9ybVV0aWxzU2VydmljZSwgcHJpdmF0ZSBzdG9yYWdlU2VydmljZTogU3RvcmFnZVNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgbWVzc2FnaW5nU2VydmljZTogTWVzc2FnaW5nU2VydmljZSwgcHJpdmF0ZSBzZWFyY2hTZXJ2aWNlOiBTZWFyY2hTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHVzZXJTZXJ2aWNlOiBVc2VyU2VydmljZSwgcHJpdmF0ZSB0b2tlblNlcnZpY2U6IFRva2VuU2VydmljZSwgcHJpdmF0ZSBwb2xpY3lTZXJ2aWNlOiBQb2xpY3lTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGxvY2tlZENhbGxiYWNrOiAoKSA9PiBQcm9taXNlPHZvaWQ+ID0gbnVsbCwgcHJpdmF0ZSBsb2dnZWRPdXRDYWxsYmFjazogKCkgPT4gUHJvbWlzZTx2b2lkPiA9IG51bGwpIHtcbiAgICB9XG5cbiAgICBpbml0KGNoZWNrT25JbnRlcnZhbDogYm9vbGVhbikge1xuICAgICAgICBpZiAodGhpcy5pbml0ZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaW5pdGVkID0gdHJ1ZTtcbiAgICAgICAgaWYgKGNoZWNrT25JbnRlcnZhbCkge1xuICAgICAgICAgICAgdGhpcy5zdGFydENoZWNrKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGFydENoZWNrKCkge1xuICAgICAgICB0aGlzLmNoZWNrVmF1bHRUaW1lb3V0KCk7XG4gICAgICAgIHNldEludGVydmFsKCgpID0+IHRoaXMuY2hlY2tWYXVsdFRpbWVvdXQoKSwgMTAgKiAxMDAwKTsgLy8gY2hlY2sgZXZlcnkgMTAgc2Vjb25kc1xuICAgIH1cblxuICAgIC8vIEtleXMgYXJlbid0IHN0b3JlZCBmb3IgYSBkZXZpY2UgdGhhdCBpcyBsb2NrZWQgb3IgbG9nZ2VkIG91dC5cbiAgICBhc3luYyBpc0xvY2tlZCgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgLy8gSGFuZGxlIG5ldmVyIGxvY2sgc3RhcnR1cCBzaXR1YXRpb25cbiAgICAgICAgaWYgKGF3YWl0IHRoaXMuY3J5cHRvU2VydmljZS5oYXNLZXlTdG9yZWQoJ2F1dG8nKSAmJiAhdGhpcy5ldmVyQmVlblVubG9ja2VkKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNyeXB0b1NlcnZpY2UuZ2V0S2V5KCdhdXRvJyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gIXRoaXMuY3J5cHRvU2VydmljZS5oYXNLZXlJbk1lbW9yeSgpO1xuICAgIH1cblxuICAgIGFzeW5jIGNoZWNrVmF1bHRUaW1lb3V0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAoYXdhaXQgdGhpcy5wbGF0Zm9ybVV0aWxzU2VydmljZS5pc1ZpZXdPcGVuKCkpIHtcbiAgICAgICAgICAgIC8vIERvIG5vdCBsb2NrXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBcImlzIGxvZ2dlZCBvdXQgY2hlY2tcIiAtIHNpbWlsYXIgdG8gaXNMb2NrZWQsIGJlbG93XG4gICAgICAgIGNvbnN0IGF1dGhlZCA9IGF3YWl0IHRoaXMudXNlclNlcnZpY2UuaXNBdXRoZW50aWNhdGVkKCk7XG4gICAgICAgIGlmICghYXV0aGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYXdhaXQgdGhpcy5pc0xvY2tlZCgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB2YXVsdFRpbWVvdXQgPSBhd2FpdCB0aGlzLmdldFZhdWx0VGltZW91dCgpO1xuICAgICAgICBpZiAodmF1bHRUaW1lb3V0ID09IG51bGwgfHwgdmF1bHRUaW1lb3V0IDwgMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbGFzdEFjdGl2ZSA9IGF3YWl0IHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0PG51bWJlcj4oQ29uc3RhbnRzU2VydmljZS5sYXN0QWN0aXZlS2V5KTtcbiAgICAgICAgaWYgKGxhc3RBY3RpdmUgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdmF1bHRUaW1lb3V0U2Vjb25kcyA9IHZhdWx0VGltZW91dCAqIDYwO1xuICAgICAgICBjb25zdCBkaWZmU2Vjb25kcyA9ICgobmV3IERhdGUoKSkuZ2V0VGltZSgpIC0gbGFzdEFjdGl2ZSkgLyAxMDAwO1xuICAgICAgICBpZiAoZGlmZlNlY29uZHMgPj0gdmF1bHRUaW1lb3V0U2Vjb25kcykge1xuICAgICAgICAgICAgLy8gUGl2b3QgYmFzZWQgb24gdGhlIHNhdmVkIHZhdWx0IHRpbWVvdXQgYWN0aW9uXG4gICAgICAgICAgICBjb25zdCB0aW1lb3V0QWN0aW9uID0gYXdhaXQgdGhpcy5zdG9yYWdlU2VydmljZS5nZXQ8c3RyaW5nPihDb25zdGFudHNTZXJ2aWNlLnZhdWx0VGltZW91dEFjdGlvbktleSk7XG4gICAgICAgICAgICB0aW1lb3V0QWN0aW9uID09PSAnbG9nT3V0JyA/IGF3YWl0IHRoaXMubG9nT3V0KCkgOiBhd2FpdCB0aGlzLmxvY2sodHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBsb2NrKGFsbG93U29mdExvY2sgPSBmYWxzZSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBhdXRoZWQgPSBhd2FpdCB0aGlzLnVzZXJTZXJ2aWNlLmlzQXV0aGVudGljYXRlZCgpO1xuICAgICAgICBpZiAoIWF1dGhlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5iaW9tZXRyaWNMb2NrZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLmV2ZXJCZWVuVW5sb2NrZWQgPSB0cnVlO1xuICAgICAgICBhd2FpdCB0aGlzLmNyeXB0b1NlcnZpY2UuY2xlYXJLZXkoZmFsc2UpO1xuICAgICAgICBhd2FpdCB0aGlzLmNyeXB0b1NlcnZpY2UuY2xlYXJPcmdLZXlzKHRydWUpO1xuICAgICAgICBhd2FpdCB0aGlzLmNyeXB0b1NlcnZpY2UuY2xlYXJLZXlQYWlyKHRydWUpO1xuICAgICAgICBhd2FpdCB0aGlzLmNyeXB0b1NlcnZpY2UuY2xlYXJFbmNLZXkodHJ1ZSk7XG5cbiAgICAgICAgdGhpcy5mb2xkZXJTZXJ2aWNlLmNsZWFyQ2FjaGUoKTtcbiAgICAgICAgdGhpcy5jaXBoZXJTZXJ2aWNlLmNsZWFyQ2FjaGUoKTtcbiAgICAgICAgdGhpcy5jb2xsZWN0aW9uU2VydmljZS5jbGVhckNhY2hlKCk7XG4gICAgICAgIHRoaXMuc2VhcmNoU2VydmljZS5jbGVhckluZGV4KCk7XG4gICAgICAgIHRoaXMubWVzc2FnaW5nU2VydmljZS5zZW5kKCdsb2NrZWQnKTtcbiAgICAgICAgaWYgKHRoaXMubG9ja2VkQ2FsbGJhY2sgIT0gbnVsbCkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5sb2NrZWRDYWxsYmFjaygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgbG9nT3V0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy5sb2dnZWRPdXRDYWxsYmFjayAhPSBudWxsKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmxvZ2dlZE91dENhbGxiYWNrKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBzZXRWYXVsdFRpbWVvdXRPcHRpb25zKHRpbWVvdXQ6IG51bWJlciwgYWN0aW9uOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5zdG9yYWdlU2VydmljZS5zYXZlKENvbnN0YW50c1NlcnZpY2UudmF1bHRUaW1lb3V0S2V5LCB0aW1lb3V0KTtcbiAgICAgICAgYXdhaXQgdGhpcy5zdG9yYWdlU2VydmljZS5zYXZlKENvbnN0YW50c1NlcnZpY2UudmF1bHRUaW1lb3V0QWN0aW9uS2V5LCBhY3Rpb24pO1xuICAgICAgICBhd2FpdCB0aGlzLmNyeXB0b1NlcnZpY2UudG9nZ2xlS2V5KCk7XG4gICAgICAgIGF3YWl0IHRoaXMudG9rZW5TZXJ2aWNlLnRvZ2dsZVRva2VucygpO1xuICAgIH1cblxuICAgIGFzeW5jIGlzUGluTG9ja1NldCgpOiBQcm9taXNlPFtib29sZWFuLCBib29sZWFuXT4ge1xuICAgICAgICBjb25zdCBwcm90ZWN0ZWRQaW4gPSBhd2FpdCB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldDxzdHJpbmc+KENvbnN0YW50c1NlcnZpY2UucHJvdGVjdGVkUGluKTtcbiAgICAgICAgY29uc3QgcGluUHJvdGVjdGVkS2V5ID0gYXdhaXQgdGhpcy5zdG9yYWdlU2VydmljZS5nZXQ8c3RyaW5nPihDb25zdGFudHNTZXJ2aWNlLnBpblByb3RlY3RlZEtleSk7XG4gICAgICAgIHJldHVybiBbcHJvdGVjdGVkUGluICE9IG51bGwsIHBpblByb3RlY3RlZEtleSAhPSBudWxsXTtcbiAgICB9XG5cbiAgICBhc3luYyBpc0Jpb21ldHJpY0xvY2tTZXQoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldDxib29sZWFuPihDb25zdGFudHNTZXJ2aWNlLmJpb21ldHJpY1VubG9ja0tleSk7XG4gICAgfVxuXG4gICAgYXN5bmMgZ2V0VmF1bHRUaW1lb3V0KCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgICAgIGNvbnN0IHZhdWx0VGltZW91dCA9IGF3YWl0IHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0PG51bWJlcj4oQ29uc3RhbnRzU2VydmljZS52YXVsdFRpbWVvdXRLZXkpO1xuXG4gICAgICAgIGlmIChhd2FpdCB0aGlzLnBvbGljeVNlcnZpY2UucG9saWN5QXBwbGllc1RvVXNlcihQb2xpY3lUeXBlLk1heGltdW1WYXVsdFRpbWVvdXQpKSB7XG4gICAgICAgICAgICBjb25zdCBwb2xpY3kgPSBhd2FpdCB0aGlzLnBvbGljeVNlcnZpY2UuZ2V0QWxsKFBvbGljeVR5cGUuTWF4aW11bVZhdWx0VGltZW91dCk7XG4gICAgICAgICAgICAvLyBSZW1vdmUgbmVnYXRpdmUgdmFsdWVzLCBhbmQgZW5zdXJlIGl0J3Mgc21hbGxlciB0aGFuIG1heGltdW0gYWxsb3dlZCB2YWx1ZSBhY2NvcmRpbmcgdG8gcG9saWN5XG4gICAgICAgICAgICBsZXQgdGltZW91dCA9IE1hdGgubWluKHZhdWx0VGltZW91dCwgcG9saWN5WzBdLmRhdGEubWludXRlcyk7XG5cbiAgICAgICAgICAgIGlmICh2YXVsdFRpbWVvdXQgPT0gbnVsbCB8fCB0aW1lb3V0IDwgMCkge1xuICAgICAgICAgICAgICAgIHRpbWVvdXQgPSBwb2xpY3lbMF0uZGF0YS5taW51dGVzO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBXZSByZWFsbHkgc2hvdWxkbid0IG5lZWQgdG8gc2V0IHRoZSB2YWx1ZSBoZXJlLCBidXQgbXVsdGlwbGUgc2VydmljZXMgcmVsaWVzIG9uIHRoaXMgdmFsdWUgYmVpbmcgY29ycmVjdC5cbiAgICAgICAgICAgIGlmICh2YXVsdFRpbWVvdXQgIT09IHRpbWVvdXQpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNhdmUoQ29uc3RhbnRzU2VydmljZS52YXVsdFRpbWVvdXRLZXksIHRpbWVvdXQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdGltZW91dDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB2YXVsdFRpbWVvdXQ7XG4gICAgfVxuXG4gICAgY2xlYXIoKTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgdGhpcy5ldmVyQmVlblVubG9ja2VkID0gZmFsc2U7XG4gICAgICAgIHRoaXMucGluUHJvdGVjdGVkS2V5ID0gbnVsbDtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmFnZVNlcnZpY2UucmVtb3ZlKENvbnN0YW50c1NlcnZpY2UucHJvdGVjdGVkUGluKTtcbiAgICB9XG59XG4iLCJpbXBvcnQgKiBhcyBmb3JnZSBmcm9tICdub2RlLWZvcmdlJztcblxuaW1wb3J0IHsgQ3J5cHRvRnVuY3Rpb25TZXJ2aWNlIH0gZnJvbSAnLi4vYWJzdHJhY3Rpb25zL2NyeXB0b0Z1bmN0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgUGxhdGZvcm1VdGlsc1NlcnZpY2UgfSBmcm9tICcuLi9hYnN0cmFjdGlvbnMvcGxhdGZvcm1VdGlscy5zZXJ2aWNlJztcblxuaW1wb3J0IHsgVXRpbHMgfSBmcm9tICcuLi9taXNjL3V0aWxzJztcblxuaW1wb3J0IHsgRGVjcnlwdFBhcmFtZXRlcnMgfSBmcm9tICcuLi9tb2RlbHMvZG9tYWluL2RlY3J5cHRQYXJhbWV0ZXJzJztcbmltcG9ydCB7IFN5bW1ldHJpY0NyeXB0b0tleSB9IGZyb20gJy4uL21vZGVscy9kb21haW4vc3ltbWV0cmljQ3J5cHRvS2V5JztcblxuZXhwb3J0IGNsYXNzIFdlYkNyeXB0b0Z1bmN0aW9uU2VydmljZSBpbXBsZW1lbnRzIENyeXB0b0Z1bmN0aW9uU2VydmljZSB7XG4gICAgcHJpdmF0ZSBjcnlwdG86IENyeXB0bztcbiAgICBwcml2YXRlIHN1YnRsZTogU3VidGxlQ3J5cHRvO1xuICAgIHByaXZhdGUgaXNJRTogYm9vbGVhbjtcbiAgICBwcml2YXRlIGlzT2xkU2FmYXJpOiBib29sZWFuO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSB3aW46IFdpbmRvdywgcHJpdmF0ZSBwbGF0Zm9ybVV0aWxzU2VydmljZTogUGxhdGZvcm1VdGlsc1NlcnZpY2UpIHtcbiAgICAgICAgdGhpcy5jcnlwdG8gPSB0eXBlb2Ygd2luLmNyeXB0byAhPT0gJ3VuZGVmaW5lZCcgPyB3aW4uY3J5cHRvIDogbnVsbDtcbiAgICAgICAgdGhpcy5zdWJ0bGUgPSAoISF0aGlzLmNyeXB0byAmJiB0eXBlb2Ygd2luLmNyeXB0by5zdWJ0bGUgIT09ICd1bmRlZmluZWQnKSA/IHdpbi5jcnlwdG8uc3VidGxlIDogbnVsbDtcbiAgICAgICAgdGhpcy5pc0lFID0gcGxhdGZvcm1VdGlsc1NlcnZpY2UuaXNJRSgpO1xuICAgICAgICBjb25zdCB1YSA9IHdpbi5uYXZpZ2F0b3IudXNlckFnZW50O1xuICAgICAgICB0aGlzLmlzT2xkU2FmYXJpID0gcGxhdGZvcm1VdGlsc1NlcnZpY2UuaXNTYWZhcmkoKSAmJlxuICAgICAgICAgICAgKHVhLmluZGV4T2YoJyBWZXJzaW9uLzEwLicpID4gLTEgfHwgdWEuaW5kZXhPZignIFZlcnNpb24vOS4nKSA+IC0xKTtcbiAgICB9XG5cbiAgICBhc3luYyBwYmtkZjIocGFzc3dvcmQ6IHN0cmluZyB8IEFycmF5QnVmZmVyLCBzYWx0OiBzdHJpbmcgfCBBcnJheUJ1ZmZlciwgYWxnb3JpdGhtOiAnc2hhMjU2JyB8ICdzaGE1MTInLFxuICAgICAgICBpdGVyYXRpb25zOiBudW1iZXIpOiBQcm9taXNlPEFycmF5QnVmZmVyPiB7XG4gICAgICAgIGlmICh0aGlzLmlzSUUgfHwgdGhpcy5pc09sZFNhZmFyaSkge1xuICAgICAgICAgICAgY29uc3QgZm9yZ2VMZW4gPSBhbGdvcml0aG0gPT09ICdzaGEyNTYnID8gMzIgOiA2NDtcbiAgICAgICAgICAgIGNvbnN0IHBhc3N3b3JkQnl0ZXMgPSB0aGlzLnRvQnl0ZVN0cmluZyhwYXNzd29yZCk7XG4gICAgICAgICAgICBjb25zdCBzYWx0Qnl0ZXMgPSB0aGlzLnRvQnl0ZVN0cmluZyhzYWx0KTtcbiAgICAgICAgICAgIGNvbnN0IGRlcml2ZWRLZXlCeXRlcyA9IChmb3JnZSBhcyBhbnkpLnBia2RmMihwYXNzd29yZEJ5dGVzLCBzYWx0Qnl0ZXMsIGl0ZXJhdGlvbnMsIGZvcmdlTGVuLCBhbGdvcml0aG0pO1xuICAgICAgICAgICAgcmV0dXJuIFV0aWxzLmZyb21CeXRlU3RyaW5nVG9BcnJheShkZXJpdmVkS2V5Qnl0ZXMpLmJ1ZmZlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHdjTGVuID0gYWxnb3JpdGhtID09PSAnc2hhMjU2JyA/IDI1NiA6IDUxMjtcbiAgICAgICAgY29uc3QgcGFzc3dvcmRCdWYgPSB0aGlzLnRvQnVmKHBhc3N3b3JkKTtcbiAgICAgICAgY29uc3Qgc2FsdEJ1ZiA9IHRoaXMudG9CdWYoc2FsdCk7XG5cbiAgICAgICAgY29uc3QgcGJrZGYyUGFyYW1zOiBQYmtkZjJQYXJhbXMgPSB7XG4gICAgICAgICAgICBuYW1lOiAnUEJLREYyJyxcbiAgICAgICAgICAgIHNhbHQ6IHNhbHRCdWYsXG4gICAgICAgICAgICBpdGVyYXRpb25zOiBpdGVyYXRpb25zLFxuICAgICAgICAgICAgaGFzaDogeyBuYW1lOiB0aGlzLnRvV2ViQ3J5cHRvQWxnb3JpdGhtKGFsZ29yaXRobSkgfSxcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBpbXBLZXkgPSBhd2FpdCB0aGlzLnN1YnRsZS5pbXBvcnRLZXkoJ3JhdycsIHBhc3N3b3JkQnVmLCB7IG5hbWU6ICdQQktERjInIH0gYXMgYW55LFxuICAgICAgICAgICAgZmFsc2UsIFsnZGVyaXZlQml0cyddKTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuc3VidGxlLmRlcml2ZUJpdHMocGJrZGYyUGFyYW1zLCBpbXBLZXksIHdjTGVuKTtcbiAgICB9XG5cbiAgICBhc3luYyBoa2RmKGlrbTogQXJyYXlCdWZmZXIsIHNhbHQ6IHN0cmluZyB8IEFycmF5QnVmZmVyLCBpbmZvOiBzdHJpbmcgfCBBcnJheUJ1ZmZlcixcbiAgICAgICAgb3V0cHV0Qnl0ZVNpemU6IG51bWJlciwgYWxnb3JpdGhtOiAnc2hhMjU2JyB8ICdzaGE1MTInKTogUHJvbWlzZTxBcnJheUJ1ZmZlcj4ge1xuICAgICAgICBjb25zdCBzYWx0QnVmID0gdGhpcy50b0J1ZihzYWx0KTtcbiAgICAgICAgY29uc3QgaW5mb0J1ZiA9IHRoaXMudG9CdWYoaW5mbyk7XG5cbiAgICAgICAgY29uc3QgaGtkZlBhcmFtczogSGtkZlBhcmFtcyA9IHtcbiAgICAgICAgICAgIG5hbWU6ICdIS0RGJyxcbiAgICAgICAgICAgIHNhbHQ6IHNhbHRCdWYsXG4gICAgICAgICAgICBpbmZvOiBpbmZvQnVmLFxuICAgICAgICAgICAgaGFzaDogeyBuYW1lOiB0aGlzLnRvV2ViQ3J5cHRvQWxnb3JpdGhtKGFsZ29yaXRobSkgfSxcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBpbXBLZXkgPSBhd2FpdCB0aGlzLnN1YnRsZS5pbXBvcnRLZXkoJ3JhdycsIGlrbSwgeyBuYW1lOiAnSEtERicgfSBhcyBhbnksXG4gICAgICAgICAgICBmYWxzZSwgWydkZXJpdmVCaXRzJ10pO1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5zdWJ0bGUuZGVyaXZlQml0cyhoa2RmUGFyYW1zIGFzIGFueSwgaW1wS2V5LCBvdXRwdXRCeXRlU2l6ZSAqIDgpO1xuICAgIH1cblxuICAgIC8vIHJlZjogaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzU4NjlcbiAgICBhc3luYyBoa2RmRXhwYW5kKHByazogQXJyYXlCdWZmZXIsIGluZm86IHN0cmluZyB8IEFycmF5QnVmZmVyLCBvdXRwdXRCeXRlU2l6ZTogbnVtYmVyLFxuICAgICAgICBhbGdvcml0aG06ICdzaGEyNTYnIHwgJ3NoYTUxMicpOiBQcm9taXNlPEFycmF5QnVmZmVyPiB7XG4gICAgICAgIGNvbnN0IGhhc2hMZW4gPSBhbGdvcml0aG0gPT09ICdzaGEyNTYnID8gMzIgOiA2NDtcbiAgICAgICAgaWYgKG91dHB1dEJ5dGVTaXplID4gMjU1ICogaGFzaExlbikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdvdXRwdXRCeXRlU2l6ZSBpcyB0b28gbGFyZ2UuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcHJrQXJyID0gbmV3IFVpbnQ4QXJyYXkocHJrKTtcbiAgICAgICAgaWYgKHBya0Fyci5sZW5ndGggPCBoYXNoTGVuKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3ByayBpcyB0b28gc21hbGwuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaW5mb0J1ZiA9IHRoaXMudG9CdWYoaW5mbyk7XG4gICAgICAgIGNvbnN0IGluZm9BcnIgPSBuZXcgVWludDhBcnJheShpbmZvQnVmKTtcbiAgICAgICAgbGV0IHJ1bm5pbmdPa21MZW5ndGggPSAwO1xuICAgICAgICBsZXQgcHJldmlvdXNUID0gbmV3IFVpbnQ4QXJyYXkoMCk7XG4gICAgICAgIGNvbnN0IG4gPSBNYXRoLmNlaWwob3V0cHV0Qnl0ZVNpemUgLyBoYXNoTGVuKTtcbiAgICAgICAgY29uc3Qgb2ttID0gbmV3IFVpbnQ4QXJyYXkobiAqIGhhc2hMZW4pO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG47IGkrKykge1xuICAgICAgICAgICAgY29uc3QgdCA9IG5ldyBVaW50OEFycmF5KHByZXZpb3VzVC5sZW5ndGggKyBpbmZvQXJyLmxlbmd0aCArIDEpO1xuICAgICAgICAgICAgdC5zZXQocHJldmlvdXNUKTtcbiAgICAgICAgICAgIHQuc2V0KGluZm9BcnIsIHByZXZpb3VzVC5sZW5ndGgpO1xuICAgICAgICAgICAgdC5zZXQoW2kgKyAxXSwgdC5sZW5ndGggLSAxKTtcbiAgICAgICAgICAgIHByZXZpb3VzVCA9IG5ldyBVaW50OEFycmF5KGF3YWl0IHRoaXMuaG1hYyh0LmJ1ZmZlciwgcHJrLCBhbGdvcml0aG0pKTtcbiAgICAgICAgICAgIG9rbS5zZXQocHJldmlvdXNULCBydW5uaW5nT2ttTGVuZ3RoKTtcbiAgICAgICAgICAgIHJ1bm5pbmdPa21MZW5ndGggKz0gcHJldmlvdXNULmxlbmd0aDtcbiAgICAgICAgICAgIGlmIChydW5uaW5nT2ttTGVuZ3RoID49IG91dHB1dEJ5dGVTaXplKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9rbS5zbGljZSgwLCBvdXRwdXRCeXRlU2l6ZSkuYnVmZmVyO1xuICAgIH1cblxuICAgIGFzeW5jIGhhc2godmFsdWU6IHN0cmluZyB8IEFycmF5QnVmZmVyLCBhbGdvcml0aG06ICdzaGExJyB8ICdzaGEyNTYnIHwgJ3NoYTUxMicgfCAnbWQ1Jyk6IFByb21pc2U8QXJyYXlCdWZmZXI+IHtcbiAgICAgICAgaWYgKCh0aGlzLmlzSUUgJiYgYWxnb3JpdGhtID09PSAnc2hhMScpIHx8IGFsZ29yaXRobSA9PT0gJ21kNScpIHtcbiAgICAgICAgICAgIGNvbnN0IG1kID0gYWxnb3JpdGhtID09PSAnbWQ1JyA/IGZvcmdlLm1kLm1kNS5jcmVhdGUoKSA6IGZvcmdlLm1kLnNoYTEuY3JlYXRlKCk7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZUJ5dGVzID0gdGhpcy50b0J5dGVTdHJpbmcodmFsdWUpO1xuICAgICAgICAgICAgbWQudXBkYXRlKHZhbHVlQnl0ZXMsICdyYXcnKTtcbiAgICAgICAgICAgIHJldHVybiBVdGlscy5mcm9tQnl0ZVN0cmluZ1RvQXJyYXkobWQuZGlnZXN0KCkuZGF0YSkuYnVmZmVyO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdmFsdWVCdWYgPSB0aGlzLnRvQnVmKHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuc3VidGxlLmRpZ2VzdCh7IG5hbWU6IHRoaXMudG9XZWJDcnlwdG9BbGdvcml0aG0oYWxnb3JpdGhtKSB9LCB2YWx1ZUJ1Zik7XG4gICAgfVxuXG4gICAgYXN5bmMgaG1hYyh2YWx1ZTogQXJyYXlCdWZmZXIsIGtleTogQXJyYXlCdWZmZXIsIGFsZ29yaXRobTogJ3NoYTEnIHwgJ3NoYTI1NicgfCAnc2hhNTEyJyk6IFByb21pc2U8QXJyYXlCdWZmZXI+IHtcbiAgICAgICAgaWYgKHRoaXMuaXNJRSAmJiBhbGdvcml0aG0gPT09ICdzaGE1MTInKSB7XG4gICAgICAgICAgICBjb25zdCBobWFjID0gKGZvcmdlIGFzIGFueSkuaG1hYy5jcmVhdGUoKTtcbiAgICAgICAgICAgIGNvbnN0IGtleUJ5dGVzID0gdGhpcy50b0J5dGVTdHJpbmcoa2V5KTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlQnl0ZXMgPSB0aGlzLnRvQnl0ZVN0cmluZyh2YWx1ZSk7XG4gICAgICAgICAgICBobWFjLnN0YXJ0KGFsZ29yaXRobSwga2V5Qnl0ZXMpO1xuICAgICAgICAgICAgaG1hYy51cGRhdGUodmFsdWVCeXRlcywgJ3JhdycpO1xuICAgICAgICAgICAgcmV0dXJuIFV0aWxzLmZyb21CeXRlU3RyaW5nVG9BcnJheShobWFjLmRpZ2VzdCgpLmRhdGEpLmJ1ZmZlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNpZ25pbmdBbGdvcml0aG0gPSB7XG4gICAgICAgICAgICBuYW1lOiAnSE1BQycsXG4gICAgICAgICAgICBoYXNoOiB7IG5hbWU6IHRoaXMudG9XZWJDcnlwdG9BbGdvcml0aG0oYWxnb3JpdGhtKSB9LFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGltcEtleSA9IGF3YWl0IHRoaXMuc3VidGxlLmltcG9ydEtleSgncmF3Jywga2V5LCBzaWduaW5nQWxnb3JpdGhtLCBmYWxzZSwgWydzaWduJ10pO1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5zdWJ0bGUuc2lnbihzaWduaW5nQWxnb3JpdGhtLCBpbXBLZXksIHZhbHVlKTtcbiAgICB9XG5cbiAgICAvLyBTYWZlbHkgY29tcGFyZSB0d28gdmFsdWVzIGluIGEgd2F5IHRoYXQgcHJvdGVjdHMgYWdhaW5zdCB0aW1pbmcgYXR0YWNrcyAoRG91YmxlIEhNQUMgVmVyaWZpY2F0aW9uKS5cbiAgICAvLyByZWY6IGh0dHBzOi8vd3d3Lm5jY2dyb3VwLnRydXN0L3VzL2Fib3V0LXVzL25ld3Nyb29tLWFuZC1ldmVudHMvYmxvZy8yMDExL2ZlYnJ1YXJ5L2RvdWJsZS1obWFjLXZlcmlmaWNhdGlvbi9cbiAgICAvLyByZWY6IGh0dHBzOi8vcGFyYWdvbmllLmNvbS9ibG9nLzIwMTUvMTEvcHJldmVudGluZy10aW1pbmctYXR0YWNrcy1vbi1zdHJpbmctY29tcGFyaXNvbi13aXRoLWRvdWJsZS1obWFjLXN0cmF0ZWd5XG4gICAgYXN5bmMgY29tcGFyZShhOiBBcnJheUJ1ZmZlciwgYjogQXJyYXlCdWZmZXIpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgY29uc3QgbWFjS2V5ID0gYXdhaXQgdGhpcy5yYW5kb21CeXRlcygzMik7XG4gICAgICAgIGNvbnN0IHNpZ25pbmdBbGdvcml0aG0gPSB7XG4gICAgICAgICAgICBuYW1lOiAnSE1BQycsXG4gICAgICAgICAgICBoYXNoOiB7IG5hbWU6ICdTSEEtMjU2JyB9LFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBpbXBLZXkgPSBhd2FpdCB0aGlzLnN1YnRsZS5pbXBvcnRLZXkoJ3JhdycsIG1hY0tleSwgc2lnbmluZ0FsZ29yaXRobSwgZmFsc2UsIFsnc2lnbiddKTtcbiAgICAgICAgY29uc3QgbWFjMSA9IGF3YWl0IHRoaXMuc3VidGxlLnNpZ24oc2lnbmluZ0FsZ29yaXRobSwgaW1wS2V5LCBhKTtcbiAgICAgICAgY29uc3QgbWFjMiA9IGF3YWl0IHRoaXMuc3VidGxlLnNpZ24oc2lnbmluZ0FsZ29yaXRobSwgaW1wS2V5LCBiKTtcblxuICAgICAgICBpZiAobWFjMS5ieXRlTGVuZ3RoICE9PSBtYWMyLmJ5dGVMZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGFycjEgPSBuZXcgVWludDhBcnJheShtYWMxKTtcbiAgICAgICAgY29uc3QgYXJyMiA9IG5ldyBVaW50OEFycmF5KG1hYzIpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFycjIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChhcnIxW2ldICE9PSBhcnIyW2ldKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaG1hY0Zhc3QodmFsdWU6IHN0cmluZywga2V5OiBzdHJpbmcsIGFsZ29yaXRobTogJ3NoYTEnIHwgJ3NoYTI1NicgfCAnc2hhNTEyJyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIGNvbnN0IGhtYWMgPSAoZm9yZ2UgYXMgYW55KS5obWFjLmNyZWF0ZSgpO1xuICAgICAgICBobWFjLnN0YXJ0KGFsZ29yaXRobSwga2V5KTtcbiAgICAgICAgaG1hYy51cGRhdGUodmFsdWUpO1xuICAgICAgICBjb25zdCBieXRlcyA9IGhtYWMuZGlnZXN0KCkuZ2V0Qnl0ZXMoKTtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShieXRlcyk7XG4gICAgfVxuXG4gICAgYXN5bmMgY29tcGFyZUZhc3QoYTogc3RyaW5nLCBiOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgY29uc3QgcmFuZCA9IGF3YWl0IHRoaXMucmFuZG9tQnl0ZXMoMzIpO1xuICAgICAgICBjb25zdCBieXRlcyA9IG5ldyBVaW50MzJBcnJheShyYW5kKTtcbiAgICAgICAgY29uc3QgYnVmZmVyID0gZm9yZ2UudXRpbC5jcmVhdGVCdWZmZXIoKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYnVmZmVyLnB1dEludDMyKGJ5dGVzW2ldKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtYWNLZXkgPSBidWZmZXIuZ2V0Qnl0ZXMoKTtcblxuICAgICAgICBjb25zdCBobWFjID0gKGZvcmdlIGFzIGFueSkuaG1hYy5jcmVhdGUoKTtcbiAgICAgICAgaG1hYy5zdGFydCgnc2hhMjU2JywgbWFjS2V5KTtcbiAgICAgICAgaG1hYy51cGRhdGUoYSk7XG4gICAgICAgIGNvbnN0IG1hYzEgPSBobWFjLmRpZ2VzdCgpLmdldEJ5dGVzKCk7XG5cbiAgICAgICAgaG1hYy5zdGFydChudWxsLCBudWxsKTtcbiAgICAgICAgaG1hYy51cGRhdGUoYik7XG4gICAgICAgIGNvbnN0IG1hYzIgPSBobWFjLmRpZ2VzdCgpLmdldEJ5dGVzKCk7XG5cbiAgICAgICAgY29uc3QgZXF1YWxzID0gbWFjMSA9PT0gbWFjMjtcbiAgICAgICAgcmV0dXJuIGVxdWFscztcbiAgICB9XG5cbiAgICBhc3luYyBhZXNFbmNyeXB0KGRhdGE6IEFycmF5QnVmZmVyLCBpdjogQXJyYXlCdWZmZXIsIGtleTogQXJyYXlCdWZmZXIpOiBQcm9taXNlPEFycmF5QnVmZmVyPiB7XG4gICAgICAgIGNvbnN0IGltcEtleSA9IGF3YWl0IHRoaXMuc3VidGxlLmltcG9ydEtleSgncmF3Jywga2V5LCB7IG5hbWU6ICdBRVMtQ0JDJyB9IGFzIGFueSwgZmFsc2UsIFsnZW5jcnlwdCddKTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuc3VidGxlLmVuY3J5cHQoeyBuYW1lOiAnQUVTLUNCQycsIGl2OiBpdiB9LCBpbXBLZXksIGRhdGEpO1xuICAgIH1cblxuICAgIGFlc0RlY3J5cHRGYXN0UGFyYW1ldGVycyhkYXRhOiBzdHJpbmcsIGl2OiBzdHJpbmcsIG1hYzogc3RyaW5nLCBrZXk6IFN5bW1ldHJpY0NyeXB0b0tleSk6XG4gICAgICAgIERlY3J5cHRQYXJhbWV0ZXJzPHN0cmluZz4ge1xuICAgICAgICBjb25zdCBwID0gbmV3IERlY3J5cHRQYXJhbWV0ZXJzPHN0cmluZz4oKTtcbiAgICAgICAgaWYgKGtleS5tZXRhICE9IG51bGwpIHtcbiAgICAgICAgICAgIHAuZW5jS2V5ID0ga2V5Lm1ldGEuZW5jS2V5Qnl0ZVN0cmluZztcbiAgICAgICAgICAgIHAubWFjS2V5ID0ga2V5Lm1ldGEubWFjS2V5Qnl0ZVN0cmluZztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwLmVuY0tleSA9PSBudWxsKSB7XG4gICAgICAgICAgICBwLmVuY0tleSA9IGZvcmdlLnV0aWwuZGVjb2RlNjQoa2V5LmVuY0tleUI2NCk7XG4gICAgICAgIH1cbiAgICAgICAgcC5kYXRhID0gZm9yZ2UudXRpbC5kZWNvZGU2NChkYXRhKTtcbiAgICAgICAgcC5pdiA9IGZvcmdlLnV0aWwuZGVjb2RlNjQoaXYpO1xuICAgICAgICBwLm1hY0RhdGEgPSBwLml2ICsgcC5kYXRhO1xuICAgICAgICBpZiAocC5tYWNLZXkgPT0gbnVsbCAmJiBrZXkubWFjS2V5QjY0ICE9IG51bGwpIHtcbiAgICAgICAgICAgIHAubWFjS2V5ID0gZm9yZ2UudXRpbC5kZWNvZGU2NChrZXkubWFjS2V5QjY0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWFjICE9IG51bGwpIHtcbiAgICAgICAgICAgIHAubWFjID0gZm9yZ2UudXRpbC5kZWNvZGU2NChtYWMpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY2FjaGUgYnl0ZSBzdHJpbmcga2V5cyBmb3IgbGF0ZXJcbiAgICAgICAgaWYgKGtleS5tZXRhID09IG51bGwpIHtcbiAgICAgICAgICAgIGtleS5tZXRhID0ge307XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGtleS5tZXRhLmVuY0tleUJ5dGVTdHJpbmcgPT0gbnVsbCkge1xuICAgICAgICAgICAga2V5Lm1ldGEuZW5jS2V5Qnl0ZVN0cmluZyA9IHAuZW5jS2V5O1xuICAgICAgICB9XG4gICAgICAgIGlmIChwLm1hY0tleSAhPSBudWxsICYmIGtleS5tZXRhLm1hY0tleUJ5dGVTdHJpbmcgPT0gbnVsbCkge1xuICAgICAgICAgICAga2V5Lm1ldGEubWFjS2V5Qnl0ZVN0cmluZyA9IHAubWFjS2V5O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHA7XG4gICAgfVxuXG4gICAgYWVzRGVjcnlwdEZhc3QocGFyYW1ldGVyczogRGVjcnlwdFBhcmFtZXRlcnM8c3RyaW5nPik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIGNvbnN0IGRhdGFCdWZmZXIgPSAoZm9yZ2UgYXMgYW55KS51dGlsLmNyZWF0ZUJ1ZmZlcihwYXJhbWV0ZXJzLmRhdGEpO1xuICAgICAgICBjb25zdCBkZWNpcGhlciA9IChmb3JnZSBhcyBhbnkpLmNpcGhlci5jcmVhdGVEZWNpcGhlcignQUVTLUNCQycsIHBhcmFtZXRlcnMuZW5jS2V5KTtcbiAgICAgICAgZGVjaXBoZXIuc3RhcnQoeyBpdjogcGFyYW1ldGVycy5pdiB9KTtcbiAgICAgICAgZGVjaXBoZXIudXBkYXRlKGRhdGFCdWZmZXIpO1xuICAgICAgICBkZWNpcGhlci5maW5pc2goKTtcbiAgICAgICAgY29uc3QgdmFsID0gZGVjaXBoZXIub3V0cHV0LnRvU3RyaW5nKCd1dGY4Jyk7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodmFsKTtcbiAgICB9XG5cbiAgICBhc3luYyBhZXNEZWNyeXB0KGRhdGE6IEFycmF5QnVmZmVyLCBpdjogQXJyYXlCdWZmZXIsIGtleTogQXJyYXlCdWZmZXIpOiBQcm9taXNlPEFycmF5QnVmZmVyPiB7XG4gICAgICAgIGNvbnN0IGltcEtleSA9IGF3YWl0IHRoaXMuc3VidGxlLmltcG9ydEtleSgncmF3Jywga2V5LCB7IG5hbWU6ICdBRVMtQ0JDJyB9IGFzIGFueSwgZmFsc2UsIFsnZGVjcnlwdCddKTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuc3VidGxlLmRlY3J5cHQoeyBuYW1lOiAnQUVTLUNCQycsIGl2OiBpdiB9LCBpbXBLZXksIGRhdGEpO1xuICAgIH1cblxuICAgIGFzeW5jIHJzYUVuY3J5cHQoZGF0YTogQXJyYXlCdWZmZXIsIHB1YmxpY0tleTogQXJyYXlCdWZmZXIsIGFsZ29yaXRobTogJ3NoYTEnIHwgJ3NoYTI1NicpOiBQcm9taXNlPEFycmF5QnVmZmVyPiB7XG4gICAgICAgIC8vIE5vdGU6IEVkZ2UgYnJvd3NlciByZXF1aXJlcyB0aGF0IHdlIHNwZWNpZnkgbmFtZSBhbmQgaGFzaCBmb3IgYm90aCBrZXkgaW1wb3J0IGFuZCBkZWNyeXB0LlxuICAgICAgICAvLyBXZSBjYW5ub3QgdXNlIHRoZSBwcm9wZXIgdHlwZXMgaGVyZS5cbiAgICAgICAgY29uc3QgcnNhUGFyYW1zID0ge1xuICAgICAgICAgICAgbmFtZTogJ1JTQS1PQUVQJyxcbiAgICAgICAgICAgIGhhc2g6IHsgbmFtZTogdGhpcy50b1dlYkNyeXB0b0FsZ29yaXRobShhbGdvcml0aG0pIH0sXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGltcEtleSA9IGF3YWl0IHRoaXMuc3VidGxlLmltcG9ydEtleSgnc3BraScsIHB1YmxpY0tleSwgcnNhUGFyYW1zLCBmYWxzZSwgWydlbmNyeXB0J10pO1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5zdWJ0bGUuZW5jcnlwdChyc2FQYXJhbXMsIGltcEtleSwgZGF0YSk7XG4gICAgfVxuXG4gICAgYXN5bmMgcnNhRGVjcnlwdChkYXRhOiBBcnJheUJ1ZmZlciwgcHJpdmF0ZUtleTogQXJyYXlCdWZmZXIsIGFsZ29yaXRobTogJ3NoYTEnIHwgJ3NoYTI1NicpOiBQcm9taXNlPEFycmF5QnVmZmVyPiB7XG4gICAgICAgIC8vIE5vdGU6IEVkZ2UgYnJvd3NlciByZXF1aXJlcyB0aGF0IHdlIHNwZWNpZnkgbmFtZSBhbmQgaGFzaCBmb3IgYm90aCBrZXkgaW1wb3J0IGFuZCBkZWNyeXB0LlxuICAgICAgICAvLyBXZSBjYW5ub3QgdXNlIHRoZSBwcm9wZXIgdHlwZXMgaGVyZS5cbiAgICAgICAgY29uc3QgcnNhUGFyYW1zID0ge1xuICAgICAgICAgICAgbmFtZTogJ1JTQS1PQUVQJyxcbiAgICAgICAgICAgIGhhc2g6IHsgbmFtZTogdGhpcy50b1dlYkNyeXB0b0FsZ29yaXRobShhbGdvcml0aG0pIH0sXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGltcEtleSA9IGF3YWl0IHRoaXMuc3VidGxlLmltcG9ydEtleSgncGtjczgnLCBwcml2YXRlS2V5LCByc2FQYXJhbXMsIGZhbHNlLCBbJ2RlY3J5cHQnXSk7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnN1YnRsZS5kZWNyeXB0KHJzYVBhcmFtcywgaW1wS2V5LCBkYXRhKTtcbiAgICB9XG5cbiAgICBhc3luYyByc2FFeHRyYWN0UHVibGljS2V5KHByaXZhdGVLZXk6IEFycmF5QnVmZmVyKTogUHJvbWlzZTxBcnJheUJ1ZmZlcj4ge1xuICAgICAgICBjb25zdCByc2FQYXJhbXMgPSB7XG4gICAgICAgICAgICBuYW1lOiAnUlNBLU9BRVAnLFxuICAgICAgICAgICAgLy8gSGF2ZSB0byBzcGVjaWZ5IHNvbWUgYWxnb3JpdGhtXG4gICAgICAgICAgICBoYXNoOiB7IG5hbWU6IHRoaXMudG9XZWJDcnlwdG9BbGdvcml0aG0oJ3NoYTEnKSB9LFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBpbXBQcml2YXRlS2V5ID0gYXdhaXQgdGhpcy5zdWJ0bGUuaW1wb3J0S2V5KCdwa2NzOCcsIHByaXZhdGVLZXksIHJzYVBhcmFtcywgdHJ1ZSwgWydkZWNyeXB0J10pO1xuICAgICAgICBjb25zdCBqd2tQcml2YXRlS2V5ID0gYXdhaXQgdGhpcy5zdWJ0bGUuZXhwb3J0S2V5KCdqd2snLCBpbXBQcml2YXRlS2V5KTtcbiAgICAgICAgY29uc3QgandrUHVibGljS2V5UGFyYW1zID0ge1xuICAgICAgICAgICAga3R5OiAnUlNBJyxcbiAgICAgICAgICAgIGU6IGp3a1ByaXZhdGVLZXkuZSxcbiAgICAgICAgICAgIG46IGp3a1ByaXZhdGVLZXkubixcbiAgICAgICAgICAgIGFsZzogJ1JTQS1PQUVQJyxcbiAgICAgICAgICAgIGV4dDogdHJ1ZSxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgaW1wUHVibGljS2V5ID0gYXdhaXQgdGhpcy5zdWJ0bGUuaW1wb3J0S2V5KCdqd2snLCBqd2tQdWJsaWNLZXlQYXJhbXMsIHJzYVBhcmFtcywgdHJ1ZSwgWydlbmNyeXB0J10pO1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5zdWJ0bGUuZXhwb3J0S2V5KCdzcGtpJywgaW1wUHVibGljS2V5KTtcbiAgICB9XG5cbiAgICBhc3luYyByc2FHZW5lcmF0ZUtleVBhaXIobGVuZ3RoOiAxMDI0IHwgMjA0OCB8IDQwOTYpOiBQcm9taXNlPFtBcnJheUJ1ZmZlciwgQXJyYXlCdWZmZXJdPiB7XG4gICAgICAgIGNvbnN0IHJzYVBhcmFtcyA9IHtcbiAgICAgICAgICAgIG5hbWU6ICdSU0EtT0FFUCcsXG4gICAgICAgICAgICBtb2R1bHVzTGVuZ3RoOiBsZW5ndGgsXG4gICAgICAgICAgICBwdWJsaWNFeHBvbmVudDogbmV3IFVpbnQ4QXJyYXkoWzB4MDEsIDB4MDAsIDB4MDFdKSwgLy8gNjU1MzdcbiAgICAgICAgICAgIC8vIEhhdmUgdG8gc3BlY2lmeSBzb21lIGFsZ29yaXRobVxuICAgICAgICAgICAgaGFzaDogeyBuYW1lOiB0aGlzLnRvV2ViQ3J5cHRvQWxnb3JpdGhtKCdzaGExJykgfSxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3Qga2V5UGFpciA9IChhd2FpdCB0aGlzLnN1YnRsZS5nZW5lcmF0ZUtleShyc2FQYXJhbXMsIHRydWUsIFsnZW5jcnlwdCcsICdkZWNyeXB0J10pKSBhcyBDcnlwdG9LZXlQYWlyO1xuICAgICAgICBjb25zdCBwdWJsaWNLZXkgPSBhd2FpdCB0aGlzLnN1YnRsZS5leHBvcnRLZXkoJ3Nwa2knLCBrZXlQYWlyLnB1YmxpY0tleSk7XG4gICAgICAgIGNvbnN0IHByaXZhdGVLZXkgPSBhd2FpdCB0aGlzLnN1YnRsZS5leHBvcnRLZXkoJ3BrY3M4Jywga2V5UGFpci5wcml2YXRlS2V5KTtcbiAgICAgICAgcmV0dXJuIFtwdWJsaWNLZXksIHByaXZhdGVLZXldO1xuICAgIH1cblxuICAgIHJhbmRvbUJ5dGVzKGxlbmd0aDogbnVtYmVyKTogUHJvbWlzZTxBcnJheUJ1ZmZlcj4ge1xuICAgICAgICBjb25zdCBhcnIgPSBuZXcgVWludDhBcnJheShsZW5ndGgpO1xuICAgICAgICB0aGlzLmNyeXB0by5nZXRSYW5kb21WYWx1ZXMoYXJyKTtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShhcnIuYnVmZmVyKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHRvQnVmKHZhbHVlOiBzdHJpbmcgfCBBcnJheUJ1ZmZlcik6IEFycmF5QnVmZmVyIHtcbiAgICAgICAgbGV0IGJ1ZjogQXJyYXlCdWZmZXI7XG4gICAgICAgIGlmICh0eXBlb2YgKHZhbHVlKSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGJ1ZiA9IFV0aWxzLmZyb21VdGY4VG9BcnJheSh2YWx1ZSkuYnVmZmVyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYnVmID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJ1ZjtcbiAgICB9XG5cbiAgICBwcml2YXRlIHRvQnl0ZVN0cmluZyh2YWx1ZTogc3RyaW5nIHwgQXJyYXlCdWZmZXIpOiBzdHJpbmcge1xuICAgICAgICBsZXQgYnl0ZXM6IHN0cmluZztcbiAgICAgICAgaWYgKHR5cGVvZiAodmFsdWUpID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgYnl0ZXMgPSBmb3JnZS51dGlsLmVuY29kZVV0ZjgodmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYnl0ZXMgPSBVdGlscy5mcm9tQnVmZmVyVG9CeXRlU3RyaW5nKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnl0ZXM7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB0b1dlYkNyeXB0b0FsZ29yaXRobShhbGdvcml0aG06ICdzaGExJyB8ICdzaGEyNTYnIHwgJ3NoYTUxMicgfCAnbWQ1Jyk6IHN0cmluZyB7XG4gICAgICAgIGlmIChhbGdvcml0aG0gPT09ICdtZDUnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01ENSBpcyBub3Qgc3VwcG9ydGVkIGluIFdlYkNyeXB0by4nKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWxnb3JpdGhtID09PSAnc2hhMScgPyAnU0hBLTEnIDogYWxnb3JpdGhtID09PSAnc2hhMjU2JyA/ICdTSEEtMjU2JyA6ICdTSEEtNTEyJztcbiAgICB9XG59XG4iLCJpbXBvcnQgTWFpbkJhY2tncm91bmQgZnJvbSAnLi9iYWNrZ3JvdW5kL21haW4uYmFja2dyb3VuZCc7XG5cbmNvbnN0IGJpdHdhcmRlbk1haW4gPSAod2luZG93IGFzIGFueSkuYml0d2FyZGVuTWFpbiA9IG5ldyBNYWluQmFja2dyb3VuZCgpO1xuYml0d2FyZGVuTWFpbi5ib290c3RyYXAoKS50aGVuKCgpID0+IHtcbiAgICAvLyBGaW5pc2hlZCBib290c3RyYXBwaW5nXG59KTtcbiIsImltcG9ydCB7IEJyb3dzZXJBcGkgfSBmcm9tICcuLi9icm93c2VyL2Jyb3dzZXJBcGknO1xuXG5pbXBvcnQgTWFpbkJhY2tncm91bmQgZnJvbSAnLi9tYWluLmJhY2tncm91bmQnO1xuXG5pbXBvcnQgeyBQYXNzd29yZEdlbmVyYXRpb25TZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9wYXNzd29yZEdlbmVyYXRpb24uc2VydmljZSc7XG5pbXBvcnQgeyBQbGF0Zm9ybVV0aWxzU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvcGxhdGZvcm1VdGlscy5zZXJ2aWNlJztcbmltcG9ydCB7IFZhdWx0VGltZW91dFNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL3ZhdWx0VGltZW91dC5zZXJ2aWNlJztcbmltcG9ydCBMb2NrZWRWYXVsdFBlbmRpbmdOb3RpZmljYXRpb25zSXRlbSBmcm9tICcuL21vZGVscy9sb2NrZWRWYXVsdFBlbmRpbmdOb3RpZmljYXRpb25zSXRlbSc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvbW1hbmRzQmFja2dyb3VuZCB7XG4gICAgcHJpdmF0ZSBpc1NhZmFyaTogYm9vbGVhbjtcbiAgICBwcml2YXRlIGlzVml2YWxkaTogYm9vbGVhbjtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgbWFpbjogTWFpbkJhY2tncm91bmQsIHByaXZhdGUgcGFzc3dvcmRHZW5lcmF0aW9uU2VydmljZTogUGFzc3dvcmRHZW5lcmF0aW9uU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBwbGF0Zm9ybVV0aWxzU2VydmljZTogUGxhdGZvcm1VdGlsc1NlcnZpY2UsIHByaXZhdGUgdmF1bHRUaW1lb3V0U2VydmljZTogVmF1bHRUaW1lb3V0U2VydmljZSkge1xuICAgICAgICB0aGlzLmlzU2FmYXJpID0gdGhpcy5wbGF0Zm9ybVV0aWxzU2VydmljZS5pc1NhZmFyaSgpO1xuICAgICAgICB0aGlzLmlzVml2YWxkaSA9IHRoaXMucGxhdGZvcm1VdGlsc1NlcnZpY2UuaXNWaXZhbGRpKCk7XG4gICAgfVxuXG4gICAgYXN5bmMgaW5pdCgpIHtcbiAgICAgICAgQnJvd3NlckFwaS5tZXNzYWdlTGlzdGVuZXIoJ2NvbW1hbmRzLmJhY2tncm91bmQnLCBhc3luYyAobXNnOiBhbnksIHNlbmRlcjogY2hyb21lLnJ1bnRpbWUuTWVzc2FnZVNlbmRlciwgc2VuZFJlc3BvbnNlOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChtc2cuY29tbWFuZCA9PT0gJ3VubG9ja0NvbXBsZXRlZCcgJiYgbXNnLmRhdGEudGFyZ2V0ID09PSAnY29tbWFuZHMuYmFja2dyb3VuZCcpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnByb2Nlc3NDb21tYW5kKG1zZy5kYXRhLmNvbW1hbmRUb1JldHJ5Lm1zZy5jb21tYW5kLCBtc2cuZGF0YS5jb21tYW5kVG9SZXRyeS5zZW5kZXIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5pc1ZpdmFsZGkgJiYgbXNnLmNvbW1hbmQgPT09ICdrZXlib2FyZFNob3J0Y3V0VHJpZ2dlcmVkJyAmJiBtc2cuc2hvcnRjdXQpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnByb2Nlc3NDb21tYW5kKG1zZy5zaG9ydGN1dCwgc2VuZGVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKCF0aGlzLmlzVml2YWxkaSAmJiBjaHJvbWUgJiYgY2hyb21lLmNvbW1hbmRzKSB7XG4gICAgICAgICAgICBjaHJvbWUuY29tbWFuZHMub25Db21tYW5kLmFkZExpc3RlbmVyKGFzeW5jIChjb21tYW5kOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnByb2Nlc3NDb21tYW5kKGNvbW1hbmQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHByb2Nlc3NDb21tYW5kKGNvbW1hbmQ6IHN0cmluZywgc2VuZGVyPzogY2hyb21lLnJ1bnRpbWUuTWVzc2FnZVNlbmRlcikge1xuICAgICAgICBzd2l0Y2ggKGNvbW1hbmQpIHtcbiAgICAgICAgICAgIGNhc2UgJ2dlbmVyYXRlX3Bhc3N3b3JkJzpcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmdlbmVyYXRlUGFzc3dvcmRUb0NsaXBib2FyZCgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnYXV0b2ZpbGxfbG9naW4nOlxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuYXV0b0ZpbGxMb2dpbihzZW5kZXIgPyBzZW5kZXIudGFiIDogbnVsbCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdvcGVuX3BvcHVwJzpcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLm9wZW5Qb3B1cCgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnbG9ja192YXVsdCc6XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy52YXVsdFRpbWVvdXRTZXJ2aWNlLmxvY2sodHJ1ZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBnZW5lcmF0ZVBhc3N3b3JkVG9DbGlwYm9hcmQoKSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSAoYXdhaXQgdGhpcy5wYXNzd29yZEdlbmVyYXRpb25TZXJ2aWNlLmdldE9wdGlvbnMoKSlbMF07XG4gICAgICAgIGNvbnN0IHBhc3N3b3JkID0gYXdhaXQgdGhpcy5wYXNzd29yZEdlbmVyYXRpb25TZXJ2aWNlLmdlbmVyYXRlUGFzc3dvcmQob3B0aW9ucyk7XG4gICAgICAgIHRoaXMucGxhdGZvcm1VdGlsc1NlcnZpY2UuY29weVRvQ2xpcGJvYXJkKHBhc3N3b3JkLCB7IHdpbmRvdzogd2luZG93IH0pO1xuICAgICAgICB0aGlzLnBhc3N3b3JkR2VuZXJhdGlvblNlcnZpY2UuYWRkSGlzdG9yeShwYXNzd29yZCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBhdXRvRmlsbExvZ2luKHRhYj86IGNocm9tZS50YWJzLlRhYikge1xuICAgICAgICBpZiAoIXRhYikge1xuICAgICAgICAgICAgdGFiID0gYXdhaXQgQnJvd3NlckFwaS5nZXRUYWJGcm9tQ3VycmVudFdpbmRvd0lkKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGFiID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhd2FpdCB0aGlzLnZhdWx0VGltZW91dFNlcnZpY2UuaXNMb2NrZWQoKSkge1xuICAgICAgICAgICAgY29uc3QgcmV0cnlNZXNzYWdlOiBMb2NrZWRWYXVsdFBlbmRpbmdOb3RpZmljYXRpb25zSXRlbSA9IHtcbiAgICAgICAgICAgICAgICBjb21tYW5kVG9SZXRyeToge1xuICAgICAgICAgICAgICAgICAgICBtc2c6IHsgY29tbWFuZDogJ2F1dG9maWxsX2xvZ2luJyB9LFxuICAgICAgICAgICAgICAgICAgICBzZW5kZXI6IHsgdGFiOiB0YWIgfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHRhcmdldDogJ2NvbW1hbmRzLmJhY2tncm91bmQnLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGF3YWl0IEJyb3dzZXJBcGkudGFiU2VuZE1lc3NhZ2VEYXRhKHRhYiwgJ2FkZFRvTG9ja2VkVmF1bHRQZW5kaW5nTm90aWZpY2F0aW9ucycsIHJldHJ5TWVzc2FnZSk7XG5cbiAgICAgICAgICAgIEJyb3dzZXJBcGkudGFiU2VuZE1lc3NhZ2VEYXRhKHRhYiwgJ3Byb21wdEZvckxvZ2luJyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCB0aGlzLm1haW4uY29sbGVjdFBhZ2VEZXRhaWxzRm9yQ29udGVudFNjcmlwdCh0YWIsICdhdXRvZmlsbF9jbWQnKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIG9wZW5Qb3B1cCgpIHtcbiAgICAgICAgLy8gQ2hyb21lIEFQSXMgY2Fubm90IG9wZW4gcG9wdXBcbiAgICAgICAgaWYgKCF0aGlzLmlzU2FmYXJpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm1haW4ub3BlblBvcHVwKCk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgQnJvd3NlckFwaSB9IGZyb20gJy4uL2Jyb3dzZXIvYnJvd3NlckFwaSc7XG5cbmltcG9ydCBNYWluQmFja2dyb3VuZCBmcm9tICcuL21haW4uYmFja2dyb3VuZCc7XG5cbmltcG9ydCB7IENpcGhlclNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL2NpcGhlci5zZXJ2aWNlJztcbmltcG9ydCB7IEV2ZW50U2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvZXZlbnQuc2VydmljZSc7XG5pbXBvcnQgeyBQYXNzd29yZEdlbmVyYXRpb25TZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9wYXNzd29yZEdlbmVyYXRpb24uc2VydmljZSc7XG5pbXBvcnQgeyBQbGF0Zm9ybVV0aWxzU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvcGxhdGZvcm1VdGlscy5zZXJ2aWNlJztcbmltcG9ydCB7IFRvdHBTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy90b3RwLnNlcnZpY2UnO1xuaW1wb3J0IHsgVmF1bHRUaW1lb3V0U2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvdmF1bHRUaW1lb3V0LnNlcnZpY2UnO1xuXG5pbXBvcnQgeyBFdmVudFR5cGUgfSBmcm9tICdqc2xpYi1jb21tb24vZW51bXMvZXZlbnRUeXBlJztcbmltcG9ydCB7IENpcGhlclZpZXcgfSBmcm9tICdqc2xpYi1jb21tb24vbW9kZWxzL3ZpZXcvY2lwaGVyVmlldyc7XG5pbXBvcnQgTG9ja2VkVmF1bHRQZW5kaW5nTm90aWZpY2F0aW9uc0l0ZW0gZnJvbSAnLi9tb2RlbHMvbG9ja2VkVmF1bHRQZW5kaW5nTm90aWZpY2F0aW9uc0l0ZW0nO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDb250ZXh0TWVudXNCYWNrZ3JvdW5kIHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IG5vb3BDb21tYW5kU3VmZml4ID0gJ25vb3AnO1xuICAgIHByaXZhdGUgY29udGV4dE1lbnVzOiBhbnk7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIG1haW46IE1haW5CYWNrZ3JvdW5kLCBwcml2YXRlIGNpcGhlclNlcnZpY2U6IENpcGhlclNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgcGFzc3dvcmRHZW5lcmF0aW9uU2VydmljZTogUGFzc3dvcmRHZW5lcmF0aW9uU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBwbGF0Zm9ybVV0aWxzU2VydmljZTogUGxhdGZvcm1VdGlsc1NlcnZpY2UsIHByaXZhdGUgdmF1bHRUaW1lb3V0U2VydmljZTogVmF1bHRUaW1lb3V0U2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBldmVudFNlcnZpY2U6IEV2ZW50U2VydmljZSwgcHJpdmF0ZSB0b3RwU2VydmljZTogVG90cFNlcnZpY2UpIHtcbiAgICAgICAgdGhpcy5jb250ZXh0TWVudXMgPSBjaHJvbWUuY29udGV4dE1lbnVzO1xuICAgIH1cblxuICAgIGFzeW5jIGluaXQoKSB7XG4gICAgICAgIGlmICghdGhpcy5jb250ZXh0TWVudXMpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29udGV4dE1lbnVzLm9uQ2xpY2tlZC5hZGRMaXN0ZW5lcihhc3luYyAoaW5mbzogY2hyb21lLmNvbnRleHRNZW51cy5PbkNsaWNrRGF0YSwgdGFiOiBjaHJvbWUudGFicy5UYWIpID0+IHtcbiAgICAgICAgICAgIGlmIChpbmZvLm1lbnVJdGVtSWQgPT09ICdnZW5lcmF0ZS1wYXNzd29yZCcpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmdlbmVyYXRlUGFzc3dvcmRUb0NsaXBib2FyZCgpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChpbmZvLm1lbnVJdGVtSWQgPT09ICdjb3B5LWlkZW50aWZpZXInKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5nZXRDbGlja2VkRWxlbWVudCh0YWIsIGluZm8uZnJhbWVJZCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGluZm8ucGFyZW50TWVudUl0ZW1JZCA9PT0gJ2F1dG9maWxsJyB8fFxuICAgICAgICAgICAgICAgIGluZm8ucGFyZW50TWVudUl0ZW1JZCA9PT0gJ2NvcHktdXNlcm5hbWUnIHx8XG4gICAgICAgICAgICAgICAgaW5mby5wYXJlbnRNZW51SXRlbUlkID09PSAnY29weS1wYXNzd29yZCcgfHxcbiAgICAgICAgICAgICAgICBpbmZvLnBhcmVudE1lbnVJdGVtSWQgPT09ICdjb3B5LXRvdHAnKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jaXBoZXJBY3Rpb24odGFiLCBpbmZvKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgQnJvd3NlckFwaS5tZXNzYWdlTGlzdGVuZXIoJ2NvbnRleHRtZW51cy5iYWNrZ3JvdW5kJywgYXN5bmMgKG1zZzogYW55LCBzZW5kZXI6IGNocm9tZS5ydW50aW1lLk1lc3NhZ2VTZW5kZXIsIHNlbmRSZXNwb25zZTogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAobXNnLmNvbW1hbmQgPT09ICd1bmxvY2tDb21wbGV0ZWQnICYmIG1zZy5kYXRhLnRhcmdldCA9PT0gJ2NvbnRleHRtZW51cy5iYWNrZ3JvdW5kJykge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuY2lwaGVyQWN0aW9uKG1zZy5kYXRhLmNvbW1hbmRUb1JldHJ5LnNlbmRlci50YWIsIG1zZy5kYXRhLmNvbW1hbmRUb1JldHJ5Lm1zZy5kYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBnZW5lcmF0ZVBhc3N3b3JkVG9DbGlwYm9hcmQoKSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSAoYXdhaXQgdGhpcy5wYXNzd29yZEdlbmVyYXRpb25TZXJ2aWNlLmdldE9wdGlvbnMoKSlbMF07XG4gICAgICAgIGNvbnN0IHBhc3N3b3JkID0gYXdhaXQgdGhpcy5wYXNzd29yZEdlbmVyYXRpb25TZXJ2aWNlLmdlbmVyYXRlUGFzc3dvcmQob3B0aW9ucyk7XG4gICAgICAgIHRoaXMucGxhdGZvcm1VdGlsc1NlcnZpY2UuY29weVRvQ2xpcGJvYXJkKHBhc3N3b3JkLCB7IHdpbmRvdzogd2luZG93IH0pO1xuICAgICAgICB0aGlzLnBhc3N3b3JkR2VuZXJhdGlvblNlcnZpY2UuYWRkSGlzdG9yeShwYXNzd29yZCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBnZXRDbGlja2VkRWxlbWVudCh0YWI6IGNocm9tZS50YWJzLlRhYiwgZnJhbWVJZDogbnVtYmVyKSB7XG4gICAgICAgIGlmICh0YWIgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgQnJvd3NlckFwaS50YWJTZW5kTWVzc2FnZSh0YWIsIHsgY29tbWFuZDogJ2dldENsaWNrZWRFbGVtZW50JyB9LCB7IGZyYW1lSWQ6IGZyYW1lSWQgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBjaXBoZXJBY3Rpb24odGFiOiBjaHJvbWUudGFicy5UYWIsIGluZm86IGNocm9tZS5jb250ZXh0TWVudXMuT25DbGlja0RhdGEpIHtcbiAgICAgICAgY29uc3QgaWQgPSBpbmZvLm1lbnVJdGVtSWQuc3BsaXQoJ18nKVsxXTtcblxuICAgICAgICBpZiAoYXdhaXQgdGhpcy52YXVsdFRpbWVvdXRTZXJ2aWNlLmlzTG9ja2VkKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHJldHJ5TWVzc2FnZTogTG9ja2VkVmF1bHRQZW5kaW5nTm90aWZpY2F0aW9uc0l0ZW0gPSB7XG4gICAgICAgICAgICAgICAgY29tbWFuZFRvUmV0cnk6IHtcbiAgICAgICAgICAgICAgICAgICAgbXNnOiB7IGNvbW1hbmQ6IHRoaXMubm9vcENvbW1hbmRTdWZmaXgsIGRhdGE6IGluZm8gfSxcbiAgICAgICAgICAgICAgICAgICAgc2VuZGVyOiB7IHRhYjogdGFiIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB0YXJnZXQ6ICdjb250ZXh0bWVudXMuYmFja2dyb3VuZCcsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgYXdhaXQgQnJvd3NlckFwaS50YWJTZW5kTWVzc2FnZURhdGEodGFiLCAnYWRkVG9Mb2NrZWRWYXVsdFBlbmRpbmdOb3RpZmljYXRpb25zJywgcmV0cnlNZXNzYWdlKTtcblxuICAgICAgICAgICAgQnJvd3NlckFwaS50YWJTZW5kTWVzc2FnZURhdGEodGFiLCAncHJvbXB0Rm9yTG9naW4nKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBjaXBoZXI6IENpcGhlclZpZXc7XG4gICAgICAgIGlmIChpZCA9PT0gdGhpcy5ub29wQ29tbWFuZFN1ZmZpeCkge1xuICAgICAgICAgICAgY29uc3QgY2lwaGVycyA9IGF3YWl0IHRoaXMuY2lwaGVyU2VydmljZS5nZXRBbGxEZWNyeXB0ZWRGb3JVcmwodGFiLnVybCk7XG4gICAgICAgICAgICBjaXBoZXIgPSBjaXBoZXJzLmxlbmd0aCA+IDAgPyBjaXBoZXJzWzBdIDogbnVsbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGNpcGhlcnMgPSBhd2FpdCB0aGlzLmNpcGhlclNlcnZpY2UuZ2V0QWxsRGVjcnlwdGVkKCk7XG4gICAgICAgICAgICBjaXBoZXIgPSBjaXBoZXJzLmZpbmQoYyA9PiBjLmlkID09PSBpZCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2lwaGVyID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpbmZvLnBhcmVudE1lbnVJdGVtSWQgPT09ICdhdXRvZmlsbCcpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc3RhcnRBdXRvZmlsbFBhZ2UodGFiLCBjaXBoZXIpO1xuICAgICAgICB9IGVsc2UgaWYgKGluZm8ucGFyZW50TWVudUl0ZW1JZCA9PT0gJ2NvcHktdXNlcm5hbWUnKSB7XG4gICAgICAgICAgICB0aGlzLnBsYXRmb3JtVXRpbHNTZXJ2aWNlLmNvcHlUb0NsaXBib2FyZChjaXBoZXIubG9naW4udXNlcm5hbWUsIHsgd2luZG93OiB3aW5kb3cgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoaW5mby5wYXJlbnRNZW51SXRlbUlkID09PSAnY29weS1wYXNzd29yZCcpIHtcbiAgICAgICAgICAgIHRoaXMucGxhdGZvcm1VdGlsc1NlcnZpY2UuY29weVRvQ2xpcGJvYXJkKGNpcGhlci5sb2dpbi5wYXNzd29yZCwgeyB3aW5kb3c6IHdpbmRvdyB9KTtcbiAgICAgICAgICAgIHRoaXMuZXZlbnRTZXJ2aWNlLmNvbGxlY3QoRXZlbnRUeXBlLkNpcGhlcl9DbGllbnRDb3BpZWRQYXNzd29yZCwgY2lwaGVyLmlkKTtcbiAgICAgICAgfSBlbHNlIGlmIChpbmZvLnBhcmVudE1lbnVJdGVtSWQgPT09ICdjb3B5LXRvdHAnKSB7XG4gICAgICAgICAgICBjb25zdCB0b3RwVmFsdWUgPSBhd2FpdCB0aGlzLnRvdHBTZXJ2aWNlLmdldENvZGUoY2lwaGVyLmxvZ2luLnRvdHApO1xuICAgICAgICAgICAgdGhpcy5wbGF0Zm9ybVV0aWxzU2VydmljZS5jb3B5VG9DbGlwYm9hcmQodG90cFZhbHVlLCB7IHdpbmRvdzogd2luZG93IH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBzdGFydEF1dG9maWxsUGFnZSh0YWI6IGNocm9tZS50YWJzLlRhYiwgY2lwaGVyOiBDaXBoZXJWaWV3KSB7XG4gICAgICAgIHRoaXMubWFpbi5sb2dpblRvQXV0b0ZpbGwgPSBjaXBoZXI7XG4gICAgICAgIGlmICh0YWIgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgQnJvd3NlckFwaS50YWJTZW5kTWVzc2FnZSh0YWIsIHtcbiAgICAgICAgICAgIGNvbW1hbmQ6ICdjb2xsZWN0UGFnZURldGFpbHMnLFxuICAgICAgICAgICAgdGFiOiB0YWIsXG4gICAgICAgICAgICBzZW5kZXI6ICdjb250ZXh0TWVudScsXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IE5vdGlmaWNhdGlvbnNTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9ub3RpZmljYXRpb25zLnNlcnZpY2UnO1xuaW1wb3J0IHsgU3RvcmFnZVNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL3N0b3JhZ2Uuc2VydmljZSc7XG5pbXBvcnQgeyBWYXVsdFRpbWVvdXRTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy92YXVsdFRpbWVvdXQuc2VydmljZSc7XG5cbmltcG9ydCB7IENvbnN0YW50c1NlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vc2VydmljZXMvY29uc3RhbnRzLnNlcnZpY2UnO1xuXG5jb25zdCBJZGxlSW50ZXJ2YWwgPSA2MCAqIDU7IC8vIDUgbWludXRlc1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBJZGxlQmFja2dyb3VuZCB7XG4gICAgcHJpdmF0ZSBpZGxlOiBhbnk7XG4gICAgcHJpdmF0ZSBpZGxlVGltZXI6IG51bWJlciA9IG51bGw7XG4gICAgcHJpdmF0ZSBpZGxlU3RhdGUgPSAnYWN0aXZlJztcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgdmF1bHRUaW1lb3V0U2VydmljZTogVmF1bHRUaW1lb3V0U2VydmljZSwgcHJpdmF0ZSBzdG9yYWdlU2VydmljZTogU3RvcmFnZVNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgbm90aWZpY2F0aW9uc1NlcnZpY2U6IE5vdGlmaWNhdGlvbnNTZXJ2aWNlKSB7XG4gICAgICAgIHRoaXMuaWRsZSA9IGNocm9tZS5pZGxlIHx8IChicm93c2VyICE9IG51bGwgPyBicm93c2VyLmlkbGUgOiBudWxsKTtcbiAgICB9XG5cbiAgICBhc3luYyBpbml0KCkge1xuICAgICAgICBpZiAoIXRoaXMuaWRsZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaWRsZUhhbmRsZXIgPSAobmV3U3RhdGU6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgaWYgKG5ld1N0YXRlID09PSAnYWN0aXZlJykge1xuICAgICAgICAgICAgICAgIHRoaXMubm90aWZpY2F0aW9uc1NlcnZpY2UucmVjb25uZWN0RnJvbUFjdGl2aXR5KCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMubm90aWZpY2F0aW9uc1NlcnZpY2UuZGlzY29ubmVjdEZyb21JbmFjdGl2aXR5KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGlmICh0aGlzLmlkbGUub25TdGF0ZUNoYW5nZWQgJiYgdGhpcy5pZGxlLnNldERldGVjdGlvbkludGVydmFsKSB7XG4gICAgICAgICAgICB0aGlzLmlkbGUuc2V0RGV0ZWN0aW9uSW50ZXJ2YWwoSWRsZUludGVydmFsKTtcbiAgICAgICAgICAgIHRoaXMuaWRsZS5vblN0YXRlQ2hhbmdlZC5hZGRMaXN0ZW5lcihpZGxlSGFuZGxlcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnBvbGxJZGxlKGlkbGVIYW5kbGVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmlkbGUub25TdGF0ZUNoYW5nZWQpIHtcbiAgICAgICAgICAgIHRoaXMuaWRsZS5vblN0YXRlQ2hhbmdlZC5hZGRMaXN0ZW5lcihhc3luYyAobmV3U3RhdGU6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChuZXdTdGF0ZSA9PT0gJ2xvY2tlZCcpIHsgLy8gSWYgdGhlIHNjcmVlbiBpcyBsb2NrZWQgb3IgdGhlIHNjcmVlbnNhdmVyIGFjdGl2YXRlc1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0aW1lb3V0ID0gYXdhaXQgdGhpcy5zdG9yYWdlU2VydmljZS5nZXQ8bnVtYmVyPihDb25zdGFudHNTZXJ2aWNlLnZhdWx0VGltZW91dEtleSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aW1lb3V0ID09PSAtMikgeyAvLyBPbiBTeXN0ZW0gTG9jayB2YXVsdCB0aW1lb3V0IG9wdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYWN0aW9uID0gYXdhaXQgdGhpcy5zdG9yYWdlU2VydmljZS5nZXQ8c3RyaW5nPihDb25zdGFudHNTZXJ2aWNlLnZhdWx0VGltZW91dEFjdGlvbktleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uID09PSAnbG9nT3V0Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMudmF1bHRUaW1lb3V0U2VydmljZS5sb2dPdXQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy52YXVsdFRpbWVvdXRTZXJ2aWNlLmxvY2sodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgcG9sbElkbGUoaGFuZGxlcjogKG5ld1N0YXRlOiBzdHJpbmcpID0+IHZvaWQpIHtcbiAgICAgICAgaWYgKHRoaXMuaWRsZVRpbWVyICE9IG51bGwpIHtcbiAgICAgICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5pZGxlVGltZXIpO1xuICAgICAgICAgICAgdGhpcy5pZGxlVGltZXIgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaWRsZS5xdWVyeVN0YXRlKElkbGVJbnRlcnZhbCwgKHN0YXRlOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIGlmIChzdGF0ZSAhPT0gdGhpcy5pZGxlU3RhdGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmlkbGVTdGF0ZSA9IHN0YXRlO1xuICAgICAgICAgICAgICAgIGhhbmRsZXIoc3RhdGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5pZGxlVGltZXIgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB0aGlzLnBvbGxJZGxlKGhhbmRsZXIpLCA1MDAwKTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgQ2lwaGVyUmVwcm9tcHRUeXBlIH0gZnJvbSAnanNsaWItY29tbW9uL2VudW1zL2NpcGhlclJlcHJvbXB0VHlwZSc7XG5pbXBvcnQgeyBDaXBoZXJUeXBlIH0gZnJvbSAnanNsaWItY29tbW9uL2VudW1zL2NpcGhlclR5cGUnO1xuXG5pbXBvcnQgeyBDaXBoZXJWaWV3IH0gZnJvbSAnanNsaWItY29tbW9uL21vZGVscy92aWV3L2NpcGhlclZpZXcnO1xuXG5pbXBvcnQgeyBBcGlTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL3NlcnZpY2VzL2FwaS5zZXJ2aWNlJztcbmltcG9ydCB7IEFwcElkU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9zZXJ2aWNlcy9hcHBJZC5zZXJ2aWNlJztcbmltcG9ydCB7IEF1ZGl0U2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9zZXJ2aWNlcy9hdWRpdC5zZXJ2aWNlJztcbmltcG9ydCB7IEF1dGhTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL3NlcnZpY2VzL2F1dGguc2VydmljZSc7XG5pbXBvcnQgeyBDaXBoZXJTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL3NlcnZpY2VzL2NpcGhlci5zZXJ2aWNlJztcbmltcG9ydCB7IENvbGxlY3Rpb25TZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL3NlcnZpY2VzL2NvbGxlY3Rpb24uc2VydmljZSc7XG5pbXBvcnQgeyBDb25zb2xlTG9nU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9zZXJ2aWNlcy9jb25zb2xlTG9nLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ29uc3RhbnRzU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9zZXJ2aWNlcy9jb25zdGFudHMuc2VydmljZSc7XG5pbXBvcnQgeyBDb250YWluZXJTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL3NlcnZpY2VzL2NvbnRhaW5lci5zZXJ2aWNlJztcbmltcG9ydCB7IEVudmlyb25tZW50U2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9zZXJ2aWNlcy9lbnZpcm9ubWVudC5zZXJ2aWNlJztcbmltcG9ydCB7IEV2ZW50U2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9zZXJ2aWNlcy9ldmVudC5zZXJ2aWNlJztcbmltcG9ydCB7IEV4cG9ydFNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vc2VydmljZXMvZXhwb3J0LnNlcnZpY2UnO1xuaW1wb3J0IHsgRmlsZVVwbG9hZFNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vc2VydmljZXMvZmlsZVVwbG9hZC5zZXJ2aWNlJztcbmltcG9ydCB7IEZvbGRlclNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vc2VydmljZXMvZm9sZGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgTm90aWZpY2F0aW9uc1NlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vc2VydmljZXMvbm90aWZpY2F0aW9ucy5zZXJ2aWNlJztcbmltcG9ydCB7IFBhc3N3b3JkR2VuZXJhdGlvblNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vc2VydmljZXMvcGFzc3dvcmRHZW5lcmF0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgUG9saWN5U2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9zZXJ2aWNlcy9wb2xpY3kuc2VydmljZSc7XG5pbXBvcnQgeyBTZWFyY2hTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL3NlcnZpY2VzL3NlYXJjaC5zZXJ2aWNlJztcbmltcG9ydCB7IFNlbmRTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL3NlcnZpY2VzL3NlbmQuc2VydmljZSc7XG5pbXBvcnQgeyBTZXR0aW5nc1NlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vc2VydmljZXMvc2V0dGluZ3Muc2VydmljZSc7XG5pbXBvcnQgeyBTdGF0ZVNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vc2VydmljZXMvc3RhdGUuc2VydmljZSc7XG5pbXBvcnQgeyBTeW5jU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9zZXJ2aWNlcy9zeW5jLnNlcnZpY2UnO1xuaW1wb3J0IHsgU3lzdGVtU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9zZXJ2aWNlcy9zeXN0ZW0uc2VydmljZSc7XG5pbXBvcnQgeyBUb2tlblNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vc2VydmljZXMvdG9rZW4uc2VydmljZSc7XG5pbXBvcnQgeyBUb3RwU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9zZXJ2aWNlcy90b3RwLnNlcnZpY2UnO1xuaW1wb3J0IHsgVXNlclNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vc2VydmljZXMvdXNlci5zZXJ2aWNlJztcbmltcG9ydCB7IFdlYkNyeXB0b0Z1bmN0aW9uU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9zZXJ2aWNlcy93ZWJDcnlwdG9GdW5jdGlvbi5zZXJ2aWNlJztcblxuaW1wb3J0IHsgQXBpU2VydmljZSBhcyBBcGlTZXJ2aWNlQWJzdHJhY3Rpb24gfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL2FwaS5zZXJ2aWNlJztcbmltcG9ydCB7IEFwcElkU2VydmljZSBhcyBBcHBJZFNlcnZpY2VBYnN0cmFjdGlvbiB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvYXBwSWQuc2VydmljZSc7XG5pbXBvcnQgeyBBdWRpdFNlcnZpY2UgYXMgQXVkaXRTZXJ2aWNlQWJzdHJhY3Rpb24gfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL2F1ZGl0LnNlcnZpY2UnO1xuaW1wb3J0IHsgQXV0aFNlcnZpY2UgYXMgQXV0aFNlcnZpY2VBYnN0cmFjdGlvbiB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvYXV0aC5zZXJ2aWNlJztcbmltcG9ydCB7IENpcGhlclNlcnZpY2UgYXMgQ2lwaGVyU2VydmljZUFic3RyYWN0aW9uIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9jaXBoZXIuc2VydmljZSc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uU2VydmljZSBhcyBDb2xsZWN0aW9uU2VydmljZUFic3RyYWN0aW9uIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9jb2xsZWN0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ3J5cHRvU2VydmljZSBhcyBDcnlwdG9TZXJ2aWNlQWJzdHJhY3Rpb24gfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL2NyeXB0by5zZXJ2aWNlJztcbmltcG9ydCB7IENyeXB0b0Z1bmN0aW9uU2VydmljZSBhcyBDcnlwdG9GdW5jdGlvblNlcnZpY2VBYnN0cmFjdGlvbiB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvY3J5cHRvRnVuY3Rpb24uc2VydmljZSc7XG5pbXBvcnQgeyBFbnZpcm9ubWVudFNlcnZpY2UgYXMgRW52aXJvbm1lbnRTZXJ2aWNlQWJzdHJhY3Rpb24gfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL2Vudmlyb25tZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgRXZlbnRTZXJ2aWNlIGFzIEV2ZW50U2VydmljZUFic3RyYWN0aW9uIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9ldmVudC5zZXJ2aWNlJztcbmltcG9ydCB7IEV4cG9ydFNlcnZpY2UgYXMgRXhwb3J0U2VydmljZUFic3RyYWN0aW9uIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9leHBvcnQuc2VydmljZSc7XG5pbXBvcnQgeyBGaWxlVXBsb2FkU2VydmljZSBhcyBGaWxlVXBsb2FkU2VydmljZUFic3RyYWN0aW9uIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9maWxlVXBsb2FkLnNlcnZpY2UnO1xuaW1wb3J0IHsgRm9sZGVyU2VydmljZSBhcyBGb2xkZXJTZXJ2aWNlQWJzdHJhY3Rpb24gfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL2ZvbGRlci5zZXJ2aWNlJztcbmltcG9ydCB7IEkxOG5TZXJ2aWNlIGFzIEkxOG5TZXJ2aWNlQWJzdHJhY3Rpb24gfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL2kxOG4uc2VydmljZSc7XG5pbXBvcnQgeyBMb2dTZXJ2aWNlIGFzIExvZ1NlcnZpY2VBYnN0cmFjdGlvbiB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvbG9nLnNlcnZpY2UnO1xuaW1wb3J0IHsgTWVzc2FnaW5nU2VydmljZSBhcyBNZXNzYWdpbmdTZXJ2aWNlQWJzdHJhY3Rpb24gfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL21lc3NhZ2luZy5zZXJ2aWNlJztcbmltcG9ydCB7IE5vdGlmaWNhdGlvbnNTZXJ2aWNlIGFzIE5vdGlmaWNhdGlvbnNTZXJ2aWNlQWJzdHJhY3Rpb24gfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL25vdGlmaWNhdGlvbnMuc2VydmljZSc7XG5pbXBvcnQgeyBQYXNzd29yZEdlbmVyYXRpb25TZXJ2aWNlIGFzIFBhc3N3b3JkR2VuZXJhdGlvblNlcnZpY2VBYnN0cmFjdGlvbiB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvcGFzc3dvcmRHZW5lcmF0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgUGxhdGZvcm1VdGlsc1NlcnZpY2UgYXMgUGxhdGZvcm1VdGlsc1NlcnZpY2VBYnN0cmFjdGlvbiB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvcGxhdGZvcm1VdGlscy5zZXJ2aWNlJztcbmltcG9ydCB7IFBvbGljeVNlcnZpY2UgYXMgUG9saWN5U2VydmljZUFic3RyYWN0aW9uIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9wb2xpY3kuc2VydmljZSc7XG5pbXBvcnQgeyBTZWFyY2hTZXJ2aWNlIGFzIFNlYXJjaFNlcnZpY2VBYnN0cmFjdGlvbiB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvc2VhcmNoLnNlcnZpY2UnO1xuaW1wb3J0IHsgU2VuZFNlcnZpY2UgYXMgU2VuZFNlcnZpY2VBYnN0cmFjdGlvbiB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvc2VuZC5zZXJ2aWNlJztcbmltcG9ydCB7IFNldHRpbmdzU2VydmljZSBhcyBTZXR0aW5nc1NlcnZpY2VBYnN0cmFjdGlvbiB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvc2V0dGluZ3Muc2VydmljZSc7XG5pbXBvcnQgeyBTdGF0ZVNlcnZpY2UgYXMgU3RhdGVTZXJ2aWNlQWJzdHJhY3Rpb24gfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL3N0YXRlLnNlcnZpY2UnO1xuaW1wb3J0IHsgU3RvcmFnZVNlcnZpY2UgYXMgU3RvcmFnZVNlcnZpY2VBYnN0cmFjdGlvbiB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvc3RvcmFnZS5zZXJ2aWNlJztcbmltcG9ydCB7IFN5bmNTZXJ2aWNlIGFzIFN5bmNTZXJ2aWNlQWJzdHJhY3Rpb24gfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL3N5bmMuc2VydmljZSc7XG5pbXBvcnQgeyBTeXN0ZW1TZXJ2aWNlIGFzIFN5c3RlbVNlcnZpY2VBYnN0cmFjdGlvbiB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvc3lzdGVtLnNlcnZpY2UnO1xuaW1wb3J0IHsgVG9rZW5TZXJ2aWNlIGFzIFRva2VuU2VydmljZUFic3RyYWN0aW9uIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy90b2tlbi5zZXJ2aWNlJztcbmltcG9ydCB7IFRvdHBTZXJ2aWNlIGFzIFRvdHBTZXJ2aWNlQWJzdHJhY3Rpb24gfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL3RvdHAuc2VydmljZSc7XG5pbXBvcnQgeyBVc2VyU2VydmljZSBhcyBVc2VyU2VydmljZUFic3RyYWN0aW9uIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy91c2VyLnNlcnZpY2UnO1xuaW1wb3J0IHsgVmF1bHRUaW1lb3V0U2VydmljZSBhcyBWYXVsdFRpbWVvdXRTZXJ2aWNlQWJzdHJhY3Rpb24gfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL3ZhdWx0VGltZW91dC5zZXJ2aWNlJztcbmltcG9ydCB7IEF1dG9maWxsU2VydmljZSBhcyBBdXRvZmlsbFNlcnZpY2VBYnN0cmFjdGlvbiB9IGZyb20gJy4uL3NlcnZpY2VzL2Fic3RyYWN0aW9ucy9hdXRvZmlsbC5zZXJ2aWNlJztcblxuaW1wb3J0IHsgVXRpbHMgfSBmcm9tICdqc2xpYi1jb21tb24vbWlzYy91dGlscyc7XG5cbmltcG9ydCB7IEJyb3dzZXJBcGkgfSBmcm9tICcuLi9icm93c2VyL2Jyb3dzZXJBcGknO1xuaW1wb3J0IHsgU2FmYXJpQXBwIH0gZnJvbSAnLi4vYnJvd3Nlci9zYWZhcmlBcHAnO1xuXG5pbXBvcnQgQ29tbWFuZHNCYWNrZ3JvdW5kIGZyb20gJy4vY29tbWFuZHMuYmFja2dyb3VuZCc7XG5pbXBvcnQgQ29udGV4dE1lbnVzQmFja2dyb3VuZCBmcm9tICcuL2NvbnRleHRNZW51cy5iYWNrZ3JvdW5kJztcbmltcG9ydCBJZGxlQmFja2dyb3VuZCBmcm9tICcuL2lkbGUuYmFja2dyb3VuZCc7XG5pbXBvcnQgeyBOYXRpdmVNZXNzYWdpbmdCYWNrZ3JvdW5kIH0gZnJvbSAnLi9uYXRpdmVNZXNzYWdpbmcuYmFja2dyb3VuZCc7XG5pbXBvcnQgTm90aWZpY2F0aW9uQmFja2dyb3VuZCBmcm9tICcuL25vdGlmaWNhdGlvbi5iYWNrZ3JvdW5kJztcbmltcG9ydCBSdW50aW1lQmFja2dyb3VuZCBmcm9tICcuL3J1bnRpbWUuYmFja2dyb3VuZCc7XG5pbXBvcnQgVGFic0JhY2tncm91bmQgZnJvbSAnLi90YWJzLmJhY2tncm91bmQnO1xuaW1wb3J0IFdlYlJlcXVlc3RCYWNrZ3JvdW5kIGZyb20gJy4vd2ViUmVxdWVzdC5iYWNrZ3JvdW5kJztcbmltcG9ydCBXaW5kb3dzQmFja2dyb3VuZCBmcm9tICcuL3dpbmRvd3MuYmFja2dyb3VuZCc7XG5cbmltcG9ydCB7IFBvcHVwVXRpbHNTZXJ2aWNlIH0gZnJvbSAnLi4vcG9wdXAvc2VydmljZXMvcG9wdXAtdXRpbHMuc2VydmljZSc7XG5pbXBvcnQgQXV0b2ZpbGxTZXJ2aWNlIGZyb20gJy4uL3NlcnZpY2VzL2F1dG9maWxsLnNlcnZpY2UnO1xuaW1wb3J0IHsgQnJvd3NlckNyeXB0b1NlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9icm93c2VyQ3J5cHRvLnNlcnZpY2UnO1xuaW1wb3J0IEJyb3dzZXJNZXNzYWdpbmdTZXJ2aWNlIGZyb20gJy4uL3NlcnZpY2VzL2Jyb3dzZXJNZXNzYWdpbmcuc2VydmljZSc7XG5pbXBvcnQgQnJvd3NlclBsYXRmb3JtVXRpbHNTZXJ2aWNlIGZyb20gJy4uL3NlcnZpY2VzL2Jyb3dzZXJQbGF0Zm9ybVV0aWxzLnNlcnZpY2UnO1xuaW1wb3J0IEJyb3dzZXJTdG9yYWdlU2VydmljZSBmcm9tICcuLi9zZXJ2aWNlcy9icm93c2VyU3RvcmFnZS5zZXJ2aWNlJztcbmltcG9ydCBJMThuU2VydmljZSBmcm9tICcuLi9zZXJ2aWNlcy9pMThuLnNlcnZpY2UnO1xuaW1wb3J0IFZhdWx0VGltZW91dFNlcnZpY2UgZnJvbSAnLi4vc2VydmljZXMvdmF1bHRUaW1lb3V0LnNlcnZpY2UnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBNYWluQmFja2dyb3VuZCB7XG4gICAgbWVzc2FnaW5nU2VydmljZTogTWVzc2FnaW5nU2VydmljZUFic3RyYWN0aW9uO1xuICAgIHN0b3JhZ2VTZXJ2aWNlOiBTdG9yYWdlU2VydmljZUFic3RyYWN0aW9uO1xuICAgIHNlY3VyZVN0b3JhZ2VTZXJ2aWNlOiBTdG9yYWdlU2VydmljZUFic3RyYWN0aW9uO1xuICAgIGkxOG5TZXJ2aWNlOiBJMThuU2VydmljZUFic3RyYWN0aW9uO1xuICAgIHBsYXRmb3JtVXRpbHNTZXJ2aWNlOiBQbGF0Zm9ybVV0aWxzU2VydmljZUFic3RyYWN0aW9uO1xuICAgIGNvbnN0YW50c1NlcnZpY2U6IENvbnN0YW50c1NlcnZpY2U7XG4gICAgbG9nU2VydmljZTogTG9nU2VydmljZUFic3RyYWN0aW9uO1xuICAgIGNyeXB0b1NlcnZpY2U6IENyeXB0b1NlcnZpY2VBYnN0cmFjdGlvbjtcbiAgICBjcnlwdG9GdW5jdGlvblNlcnZpY2U6IENyeXB0b0Z1bmN0aW9uU2VydmljZUFic3RyYWN0aW9uO1xuICAgIHRva2VuU2VydmljZTogVG9rZW5TZXJ2aWNlQWJzdHJhY3Rpb247XG4gICAgYXBwSWRTZXJ2aWNlOiBBcHBJZFNlcnZpY2VBYnN0cmFjdGlvbjtcbiAgICBhcGlTZXJ2aWNlOiBBcGlTZXJ2aWNlQWJzdHJhY3Rpb247XG4gICAgZW52aXJvbm1lbnRTZXJ2aWNlOiBFbnZpcm9ubWVudFNlcnZpY2VBYnN0cmFjdGlvbjtcbiAgICB1c2VyU2VydmljZTogVXNlclNlcnZpY2VBYnN0cmFjdGlvbjtcbiAgICBzZXR0aW5nc1NlcnZpY2U6IFNldHRpbmdzU2VydmljZUFic3RyYWN0aW9uO1xuICAgIGNpcGhlclNlcnZpY2U6IENpcGhlclNlcnZpY2VBYnN0cmFjdGlvbjtcbiAgICBmb2xkZXJTZXJ2aWNlOiBGb2xkZXJTZXJ2aWNlQWJzdHJhY3Rpb247XG4gICAgY29sbGVjdGlvblNlcnZpY2U6IENvbGxlY3Rpb25TZXJ2aWNlQWJzdHJhY3Rpb247XG4gICAgdmF1bHRUaW1lb3V0U2VydmljZTogVmF1bHRUaW1lb3V0U2VydmljZUFic3RyYWN0aW9uO1xuICAgIHN5bmNTZXJ2aWNlOiBTeW5jU2VydmljZUFic3RyYWN0aW9uO1xuICAgIHBhc3N3b3JkR2VuZXJhdGlvblNlcnZpY2U6IFBhc3N3b3JkR2VuZXJhdGlvblNlcnZpY2VBYnN0cmFjdGlvbjtcbiAgICB0b3RwU2VydmljZTogVG90cFNlcnZpY2VBYnN0cmFjdGlvbjtcbiAgICBhdXRvZmlsbFNlcnZpY2U6IEF1dG9maWxsU2VydmljZUFic3RyYWN0aW9uO1xuICAgIGNvbnRhaW5lclNlcnZpY2U6IENvbnRhaW5lclNlcnZpY2U7XG4gICAgYXVkaXRTZXJ2aWNlOiBBdWRpdFNlcnZpY2VBYnN0cmFjdGlvbjtcbiAgICBhdXRoU2VydmljZTogQXV0aFNlcnZpY2VBYnN0cmFjdGlvbjtcbiAgICBleHBvcnRTZXJ2aWNlOiBFeHBvcnRTZXJ2aWNlQWJzdHJhY3Rpb247XG4gICAgc2VhcmNoU2VydmljZTogU2VhcmNoU2VydmljZUFic3RyYWN0aW9uO1xuICAgIG5vdGlmaWNhdGlvbnNTZXJ2aWNlOiBOb3RpZmljYXRpb25zU2VydmljZUFic3RyYWN0aW9uO1xuICAgIHN0YXRlU2VydmljZTogU3RhdGVTZXJ2aWNlQWJzdHJhY3Rpb247XG4gICAgc3lzdGVtU2VydmljZTogU3lzdGVtU2VydmljZUFic3RyYWN0aW9uO1xuICAgIGV2ZW50U2VydmljZTogRXZlbnRTZXJ2aWNlQWJzdHJhY3Rpb247XG4gICAgcG9saWN5U2VydmljZTogUG9saWN5U2VydmljZUFic3RyYWN0aW9uO1xuICAgIHBvcHVwVXRpbHNTZXJ2aWNlOiBQb3B1cFV0aWxzU2VydmljZTtcbiAgICBzZW5kU2VydmljZTogU2VuZFNlcnZpY2VBYnN0cmFjdGlvbjtcbiAgICBmaWxlVXBsb2FkU2VydmljZTogRmlsZVVwbG9hZFNlcnZpY2VBYnN0cmFjdGlvbjtcblxuICAgIG9uVXBkYXRlZFJhbjogYm9vbGVhbjtcbiAgICBvblJlcGxhY2VkUmFuOiBib29sZWFuO1xuICAgIGxvZ2luVG9BdXRvRmlsbDogQ2lwaGVyVmlldyA9IG51bGw7XG5cbiAgICBwcml2YXRlIGNvbW1hbmRzQmFja2dyb3VuZDogQ29tbWFuZHNCYWNrZ3JvdW5kO1xuICAgIHByaXZhdGUgY29udGV4dE1lbnVzQmFja2dyb3VuZDogQ29udGV4dE1lbnVzQmFja2dyb3VuZDtcbiAgICBwcml2YXRlIGlkbGVCYWNrZ3JvdW5kOiBJZGxlQmFja2dyb3VuZDtcbiAgICBwcml2YXRlIG5vdGlmaWNhdGlvbkJhY2tncm91bmQ6IE5vdGlmaWNhdGlvbkJhY2tncm91bmQ7XG4gICAgcHJpdmF0ZSBydW50aW1lQmFja2dyb3VuZDogUnVudGltZUJhY2tncm91bmQ7XG4gICAgcHJpdmF0ZSB0YWJzQmFja2dyb3VuZDogVGFic0JhY2tncm91bmQ7XG4gICAgcHJpdmF0ZSB3ZWJSZXF1ZXN0QmFja2dyb3VuZDogV2ViUmVxdWVzdEJhY2tncm91bmQ7XG4gICAgcHJpdmF0ZSB3aW5kb3dzQmFja2dyb3VuZDogV2luZG93c0JhY2tncm91bmQ7XG5cbiAgICBwcml2YXRlIHNpZGViYXJBY3Rpb246IGFueTtcbiAgICBwcml2YXRlIGJ1aWxkaW5nQ29udGV4dE1lbnU6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSBtZW51T3B0aW9uc0xvYWRlZDogYW55W10gPSBbXTtcbiAgICBwcml2YXRlIHN5bmNUaW1lb3V0OiBhbnk7XG4gICAgcHJpdmF0ZSBpc1NhZmFyaTogYm9vbGVhbjtcbiAgICBwcml2YXRlIG5hdGl2ZU1lc3NhZ2luZ0JhY2tncm91bmQ6IE5hdGl2ZU1lc3NhZ2luZ0JhY2tncm91bmQ7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgLy8gU2VydmljZXNcbiAgICAgICAgdGhpcy5tZXNzYWdpbmdTZXJ2aWNlID0gbmV3IEJyb3dzZXJNZXNzYWdpbmdTZXJ2aWNlKCk7XG4gICAgICAgIHRoaXMuc3RvcmFnZVNlcnZpY2UgPSBuZXcgQnJvd3NlclN0b3JhZ2VTZXJ2aWNlKCk7XG4gICAgICAgIHRoaXMucGxhdGZvcm1VdGlsc1NlcnZpY2UgPSBuZXcgQnJvd3NlclBsYXRmb3JtVXRpbHNTZXJ2aWNlKHRoaXMubWVzc2FnaW5nU2VydmljZSwgdGhpcy5zdG9yYWdlU2VydmljZSxcbiAgICAgICAgICAgIChjbGlwYm9hcmRWYWx1ZSwgY2xlYXJNcykgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnN5c3RlbVNlcnZpY2UgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnN5c3RlbVNlcnZpY2UuY2xlYXJDbGlwYm9hcmQoY2xpcGJvYXJkVmFsdWUsIGNsZWFyTXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubmF0aXZlTWVzc2FnaW5nQmFja2dyb3VuZCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHByb21pc2UgPSB0aGlzLm5hdGl2ZU1lc3NhZ2luZ0JhY2tncm91bmQuZ2V0UmVzcG9uc2UoKTtcblxuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5uYXRpdmVNZXNzYWdpbmdCYWNrZ3JvdW5kLnNlbmQoeyBjb21tYW5kOiAnYmlvbWV0cmljVW5sb2NrJyB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByb21pc2UudGhlbihyZXN1bHQgPT4gcmVzdWx0LnJlc3BvbnNlID09PSAndW5sb2NrZWQnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5zZWN1cmVTdG9yYWdlU2VydmljZSA9IG5ldyBCcm93c2VyU3RvcmFnZVNlcnZpY2UoKTtcbiAgICAgICAgdGhpcy5pMThuU2VydmljZSA9IG5ldyBJMThuU2VydmljZShCcm93c2VyQXBpLmdldFVJTGFuZ3VhZ2Uod2luZG93KSk7XG4gICAgICAgIHRoaXMuY3J5cHRvRnVuY3Rpb25TZXJ2aWNlID0gbmV3IFdlYkNyeXB0b0Z1bmN0aW9uU2VydmljZSh3aW5kb3csIHRoaXMucGxhdGZvcm1VdGlsc1NlcnZpY2UpO1xuICAgICAgICB0aGlzLmxvZ1NlcnZpY2UgPSBuZXcgQ29uc29sZUxvZ1NlcnZpY2UoZmFsc2UpO1xuICAgICAgICB0aGlzLmNyeXB0b1NlcnZpY2UgPSBuZXcgQnJvd3NlckNyeXB0b1NlcnZpY2UodGhpcy5zdG9yYWdlU2VydmljZSwgdGhpcy5zZWN1cmVTdG9yYWdlU2VydmljZSxcbiAgICAgICAgICAgIHRoaXMuY3J5cHRvRnVuY3Rpb25TZXJ2aWNlLCB0aGlzLnBsYXRmb3JtVXRpbHNTZXJ2aWNlLCB0aGlzLmxvZ1NlcnZpY2UpO1xuICAgICAgICB0aGlzLnRva2VuU2VydmljZSA9IG5ldyBUb2tlblNlcnZpY2UodGhpcy5zdG9yYWdlU2VydmljZSk7XG4gICAgICAgIHRoaXMuYXBwSWRTZXJ2aWNlID0gbmV3IEFwcElkU2VydmljZSh0aGlzLnN0b3JhZ2VTZXJ2aWNlKTtcbiAgICAgICAgdGhpcy5lbnZpcm9ubWVudFNlcnZpY2UgPSBuZXcgRW52aXJvbm1lbnRTZXJ2aWNlKHRoaXMuc3RvcmFnZVNlcnZpY2UpO1xuICAgICAgICB0aGlzLmFwaVNlcnZpY2UgPSBuZXcgQXBpU2VydmljZSh0aGlzLnRva2VuU2VydmljZSwgdGhpcy5wbGF0Zm9ybVV0aWxzU2VydmljZSwgdGhpcy5lbnZpcm9ubWVudFNlcnZpY2UsXG4gICAgICAgICAgICAoZXhwaXJlZDogYm9vbGVhbikgPT4gdGhpcy5sb2dvdXQoZXhwaXJlZCkpO1xuICAgICAgICB0aGlzLnVzZXJTZXJ2aWNlID0gbmV3IFVzZXJTZXJ2aWNlKHRoaXMudG9rZW5TZXJ2aWNlLCB0aGlzLnN0b3JhZ2VTZXJ2aWNlKTtcbiAgICAgICAgdGhpcy5zZXR0aW5nc1NlcnZpY2UgPSBuZXcgU2V0dGluZ3NTZXJ2aWNlKHRoaXMudXNlclNlcnZpY2UsIHRoaXMuc3RvcmFnZVNlcnZpY2UpO1xuICAgICAgICB0aGlzLmZpbGVVcGxvYWRTZXJ2aWNlID0gbmV3IEZpbGVVcGxvYWRTZXJ2aWNlKHRoaXMubG9nU2VydmljZSwgdGhpcy5hcGlTZXJ2aWNlKTtcbiAgICAgICAgdGhpcy5jaXBoZXJTZXJ2aWNlID0gbmV3IENpcGhlclNlcnZpY2UodGhpcy5jcnlwdG9TZXJ2aWNlLCB0aGlzLnVzZXJTZXJ2aWNlLCB0aGlzLnNldHRpbmdzU2VydmljZSxcbiAgICAgICAgICAgIHRoaXMuYXBpU2VydmljZSwgdGhpcy5maWxlVXBsb2FkU2VydmljZSwgdGhpcy5zdG9yYWdlU2VydmljZSwgdGhpcy5pMThuU2VydmljZSwgKCkgPT4gdGhpcy5zZWFyY2hTZXJ2aWNlLFxuICAgICAgICAgICAgdGhpcy5sb2dTZXJ2aWNlKTtcbiAgICAgICAgdGhpcy5mb2xkZXJTZXJ2aWNlID0gbmV3IEZvbGRlclNlcnZpY2UodGhpcy5jcnlwdG9TZXJ2aWNlLCB0aGlzLnVzZXJTZXJ2aWNlLCB0aGlzLmFwaVNlcnZpY2UsXG4gICAgICAgICAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLCB0aGlzLmkxOG5TZXJ2aWNlLCB0aGlzLmNpcGhlclNlcnZpY2UpO1xuICAgICAgICB0aGlzLmNvbGxlY3Rpb25TZXJ2aWNlID0gbmV3IENvbGxlY3Rpb25TZXJ2aWNlKHRoaXMuY3J5cHRvU2VydmljZSwgdGhpcy51c2VyU2VydmljZSwgdGhpcy5zdG9yYWdlU2VydmljZSxcbiAgICAgICAgICAgIHRoaXMuaTE4blNlcnZpY2UpO1xuICAgICAgICB0aGlzLnNlYXJjaFNlcnZpY2UgPSBuZXcgU2VhcmNoU2VydmljZSh0aGlzLmNpcGhlclNlcnZpY2UsIHRoaXMubG9nU2VydmljZSwgdGhpcy5pMThuU2VydmljZSk7XG4gICAgICAgIHRoaXMuc2VuZFNlcnZpY2UgPSBuZXcgU2VuZFNlcnZpY2UodGhpcy5jcnlwdG9TZXJ2aWNlLCB0aGlzLnVzZXJTZXJ2aWNlLCB0aGlzLmFwaVNlcnZpY2UsIHRoaXMuZmlsZVVwbG9hZFNlcnZpY2UsXG4gICAgICAgICAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLCB0aGlzLmkxOG5TZXJ2aWNlLCB0aGlzLmNyeXB0b0Z1bmN0aW9uU2VydmljZSk7XG4gICAgICAgIHRoaXMuc3RhdGVTZXJ2aWNlID0gbmV3IFN0YXRlU2VydmljZSgpO1xuICAgICAgICB0aGlzLnBvbGljeVNlcnZpY2UgPSBuZXcgUG9saWN5U2VydmljZSh0aGlzLnVzZXJTZXJ2aWNlLCB0aGlzLnN0b3JhZ2VTZXJ2aWNlLCB0aGlzLmFwaVNlcnZpY2UpO1xuICAgICAgICB0aGlzLnZhdWx0VGltZW91dFNlcnZpY2UgPSBuZXcgVmF1bHRUaW1lb3V0U2VydmljZSh0aGlzLmNpcGhlclNlcnZpY2UsIHRoaXMuZm9sZGVyU2VydmljZSxcbiAgICAgICAgICAgIHRoaXMuY29sbGVjdGlvblNlcnZpY2UsIHRoaXMuY3J5cHRvU2VydmljZSwgdGhpcy5wbGF0Zm9ybVV0aWxzU2VydmljZSwgdGhpcy5zdG9yYWdlU2VydmljZSxcbiAgICAgICAgICAgIHRoaXMubWVzc2FnaW5nU2VydmljZSwgdGhpcy5zZWFyY2hTZXJ2aWNlLCB0aGlzLnVzZXJTZXJ2aWNlLCB0aGlzLnRva2VuU2VydmljZSwgdGhpcy5wb2xpY3lTZXJ2aWNlLFxuICAgICAgICAgICAgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm5vdGlmaWNhdGlvbnNTZXJ2aWNlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25zU2VydmljZS51cGRhdGVDb25uZWN0aW9uKGZhbHNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXRJY29uKCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5yZWZyZXNoQmFkZ2VBbmRNZW51KHRydWUpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnN5c3RlbVNlcnZpY2UgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnN5c3RlbVNlcnZpY2Uuc3RhcnRQcm9jZXNzUmVsb2FkKCk7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc3lzdGVtU2VydmljZS5jbGVhclBlbmRpbmdDbGlwYm9hcmQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCBhc3luYyAoKSA9PiBhd2FpdCB0aGlzLmxvZ291dChmYWxzZSkpO1xuICAgICAgICB0aGlzLnN5bmNTZXJ2aWNlID0gbmV3IFN5bmNTZXJ2aWNlKHRoaXMudXNlclNlcnZpY2UsIHRoaXMuYXBpU2VydmljZSwgdGhpcy5zZXR0aW5nc1NlcnZpY2UsXG4gICAgICAgICAgICB0aGlzLmZvbGRlclNlcnZpY2UsIHRoaXMuY2lwaGVyU2VydmljZSwgdGhpcy5jcnlwdG9TZXJ2aWNlLCB0aGlzLmNvbGxlY3Rpb25TZXJ2aWNlLFxuICAgICAgICAgICAgdGhpcy5zdG9yYWdlU2VydmljZSwgdGhpcy5tZXNzYWdpbmdTZXJ2aWNlLCB0aGlzLnBvbGljeVNlcnZpY2UsIHRoaXMuc2VuZFNlcnZpY2UsXG4gICAgICAgICAgICB0aGlzLmxvZ1NlcnZpY2UsIGFzeW5jIChleHBpcmVkOiBib29sZWFuKSA9PiBhd2FpdCB0aGlzLmxvZ291dChleHBpcmVkKSk7XG4gICAgICAgIHRoaXMuZXZlbnRTZXJ2aWNlID0gbmV3IEV2ZW50U2VydmljZSh0aGlzLnN0b3JhZ2VTZXJ2aWNlLCB0aGlzLmFwaVNlcnZpY2UsIHRoaXMudXNlclNlcnZpY2UsXG4gICAgICAgICAgICB0aGlzLmNpcGhlclNlcnZpY2UsIHRoaXMubG9nU2VydmljZSk7XG4gICAgICAgIHRoaXMucGFzc3dvcmRHZW5lcmF0aW9uU2VydmljZSA9IG5ldyBQYXNzd29yZEdlbmVyYXRpb25TZXJ2aWNlKHRoaXMuY3J5cHRvU2VydmljZSwgdGhpcy5zdG9yYWdlU2VydmljZSxcbiAgICAgICAgICAgIHRoaXMucG9saWN5U2VydmljZSk7XG4gICAgICAgIHRoaXMudG90cFNlcnZpY2UgPSBuZXcgVG90cFNlcnZpY2UodGhpcy5zdG9yYWdlU2VydmljZSwgdGhpcy5jcnlwdG9GdW5jdGlvblNlcnZpY2UsIHRoaXMubG9nU2VydmljZSk7XG4gICAgICAgIHRoaXMuYXV0b2ZpbGxTZXJ2aWNlID0gbmV3IEF1dG9maWxsU2VydmljZSh0aGlzLmNpcGhlclNlcnZpY2UsIHRoaXMudXNlclNlcnZpY2UsIHRoaXMudG90cFNlcnZpY2UsXG4gICAgICAgICAgICB0aGlzLmV2ZW50U2VydmljZSwgdGhpcy5sb2dTZXJ2aWNlKTtcbiAgICAgICAgdGhpcy5jb250YWluZXJTZXJ2aWNlID0gbmV3IENvbnRhaW5lclNlcnZpY2UodGhpcy5jcnlwdG9TZXJ2aWNlKTtcbiAgICAgICAgdGhpcy5hdWRpdFNlcnZpY2UgPSBuZXcgQXVkaXRTZXJ2aWNlKHRoaXMuY3J5cHRvRnVuY3Rpb25TZXJ2aWNlLCB0aGlzLmFwaVNlcnZpY2UpO1xuICAgICAgICB0aGlzLmV4cG9ydFNlcnZpY2UgPSBuZXcgRXhwb3J0U2VydmljZSh0aGlzLmZvbGRlclNlcnZpY2UsIHRoaXMuY2lwaGVyU2VydmljZSwgdGhpcy5hcGlTZXJ2aWNlLFxuICAgICAgICAgICAgdGhpcy5jcnlwdG9TZXJ2aWNlKTtcbiAgICAgICAgdGhpcy5ub3RpZmljYXRpb25zU2VydmljZSA9IG5ldyBOb3RpZmljYXRpb25zU2VydmljZSh0aGlzLnVzZXJTZXJ2aWNlLCB0aGlzLnN5bmNTZXJ2aWNlLCB0aGlzLmFwcElkU2VydmljZSxcbiAgICAgICAgICAgIHRoaXMuYXBpU2VydmljZSwgdGhpcy52YXVsdFRpbWVvdXRTZXJ2aWNlLCB0aGlzLmVudmlyb25tZW50U2VydmljZSwgKCkgPT4gdGhpcy5sb2dvdXQodHJ1ZSksIHRoaXMubG9nU2VydmljZSk7XG4gICAgICAgIHRoaXMucG9wdXBVdGlsc1NlcnZpY2UgPSBuZXcgUG9wdXBVdGlsc1NlcnZpY2UodGhpcy5wbGF0Zm9ybVV0aWxzU2VydmljZSk7XG4gICAgICAgIHRoaXMuc3lzdGVtU2VydmljZSA9IG5ldyBTeXN0ZW1TZXJ2aWNlKHRoaXMuc3RvcmFnZVNlcnZpY2UsIHRoaXMudmF1bHRUaW1lb3V0U2VydmljZSxcbiAgICAgICAgICAgIHRoaXMubWVzc2FnaW5nU2VydmljZSwgdGhpcy5wbGF0Zm9ybVV0aWxzU2VydmljZSwgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZvcmNlV2luZG93UmVsb2FkID0gdGhpcy5wbGF0Zm9ybVV0aWxzU2VydmljZS5pc1NhZmFyaSgpIHx8XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGxhdGZvcm1VdGlsc1NlcnZpY2UuaXNGaXJlZm94KCkgfHwgdGhpcy5wbGF0Zm9ybVV0aWxzU2VydmljZS5pc09wZXJhKCk7XG4gICAgICAgICAgICAgICAgQnJvd3NlckFwaS5yZWxvYWRFeHRlbnNpb24oZm9yY2VXaW5kb3dSZWxvYWQgPyB3aW5kb3cgOiBudWxsKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAvLyBPdGhlciBmaWVsZHNcbiAgICAgICAgdGhpcy5pc1NhZmFyaSA9IHRoaXMucGxhdGZvcm1VdGlsc1NlcnZpY2UuaXNTYWZhcmkoKTtcbiAgICAgICAgdGhpcy5zaWRlYmFyQWN0aW9uID0gdGhpcy5pc1NhZmFyaSA/IG51bGwgOiAodHlwZW9mIG9wciAhPT0gJ3VuZGVmaW5lZCcpICYmIG9wci5zaWRlYmFyQWN0aW9uID9cbiAgICAgICAgICAgIG9wci5zaWRlYmFyQWN0aW9uIDogKHdpbmRvdyBhcyBhbnkpLmNocm9tZS5zaWRlYmFyQWN0aW9uO1xuXG4gICAgICAgIC8vIEJhY2tncm91bmRcbiAgICAgICAgdGhpcy5ydW50aW1lQmFja2dyb3VuZCA9IG5ldyBSdW50aW1lQmFja2dyb3VuZCh0aGlzLCB0aGlzLmF1dG9maWxsU2VydmljZSxcbiAgICAgICAgICAgIHRoaXMucGxhdGZvcm1VdGlsc1NlcnZpY2UgYXMgQnJvd3NlclBsYXRmb3JtVXRpbHNTZXJ2aWNlLCB0aGlzLnN0b3JhZ2VTZXJ2aWNlLCB0aGlzLmkxOG5TZXJ2aWNlLFxuICAgICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25zU2VydmljZSwgdGhpcy5zeXN0ZW1TZXJ2aWNlLCB0aGlzLmVudmlyb25tZW50U2VydmljZSwgdGhpcy5tZXNzYWdpbmdTZXJ2aWNlLFxuICAgICAgICAgICAgdGhpcy5sb2dTZXJ2aWNlKTtcbiAgICAgICAgdGhpcy5uYXRpdmVNZXNzYWdpbmdCYWNrZ3JvdW5kID0gbmV3IE5hdGl2ZU1lc3NhZ2luZ0JhY2tncm91bmQodGhpcy5zdG9yYWdlU2VydmljZSwgdGhpcy5jcnlwdG9TZXJ2aWNlLCB0aGlzLmNyeXB0b0Z1bmN0aW9uU2VydmljZSxcbiAgICAgICAgICAgIHRoaXMudmF1bHRUaW1lb3V0U2VydmljZSwgdGhpcy5ydW50aW1lQmFja2dyb3VuZCwgdGhpcy5pMThuU2VydmljZSwgdGhpcy51c2VyU2VydmljZSwgdGhpcy5tZXNzYWdpbmdTZXJ2aWNlLCB0aGlzLmFwcElkU2VydmljZSxcbiAgICAgICAgICAgIHRoaXMucGxhdGZvcm1VdGlsc1NlcnZpY2UpO1xuICAgICAgICB0aGlzLmNvbW1hbmRzQmFja2dyb3VuZCA9IG5ldyBDb21tYW5kc0JhY2tncm91bmQodGhpcywgdGhpcy5wYXNzd29yZEdlbmVyYXRpb25TZXJ2aWNlLFxuICAgICAgICAgICAgdGhpcy5wbGF0Zm9ybVV0aWxzU2VydmljZSwgdGhpcy52YXVsdFRpbWVvdXRTZXJ2aWNlKTtcbiAgICAgICAgdGhpcy5ub3RpZmljYXRpb25CYWNrZ3JvdW5kID0gbmV3IE5vdGlmaWNhdGlvbkJhY2tncm91bmQodGhpcywgdGhpcy5hdXRvZmlsbFNlcnZpY2UsIHRoaXMuY2lwaGVyU2VydmljZSxcbiAgICAgICAgICAgIHRoaXMuc3RvcmFnZVNlcnZpY2UsIHRoaXMudmF1bHRUaW1lb3V0U2VydmljZSwgdGhpcy5wb2xpY3lTZXJ2aWNlLCB0aGlzLmZvbGRlclNlcnZpY2UpO1xuXG4gICAgICAgIHRoaXMudGFic0JhY2tncm91bmQgPSBuZXcgVGFic0JhY2tncm91bmQodGhpcywgdGhpcy5ub3RpZmljYXRpb25CYWNrZ3JvdW5kKTtcbiAgICAgICAgdGhpcy5jb250ZXh0TWVudXNCYWNrZ3JvdW5kID0gbmV3IENvbnRleHRNZW51c0JhY2tncm91bmQodGhpcywgdGhpcy5jaXBoZXJTZXJ2aWNlLCB0aGlzLnBhc3N3b3JkR2VuZXJhdGlvblNlcnZpY2UsXG4gICAgICAgICAgICB0aGlzLnBsYXRmb3JtVXRpbHNTZXJ2aWNlLCB0aGlzLnZhdWx0VGltZW91dFNlcnZpY2UsIHRoaXMuZXZlbnRTZXJ2aWNlLCB0aGlzLnRvdHBTZXJ2aWNlKTtcbiAgICAgICAgdGhpcy5pZGxlQmFja2dyb3VuZCA9IG5ldyBJZGxlQmFja2dyb3VuZCh0aGlzLnZhdWx0VGltZW91dFNlcnZpY2UsIHRoaXMuc3RvcmFnZVNlcnZpY2UsXG4gICAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvbnNTZXJ2aWNlKTtcbiAgICAgICAgdGhpcy53ZWJSZXF1ZXN0QmFja2dyb3VuZCA9IG5ldyBXZWJSZXF1ZXN0QmFja2dyb3VuZCh0aGlzLnBsYXRmb3JtVXRpbHNTZXJ2aWNlLCB0aGlzLmNpcGhlclNlcnZpY2UsXG4gICAgICAgICAgICB0aGlzLnZhdWx0VGltZW91dFNlcnZpY2UpO1xuICAgICAgICB0aGlzLndpbmRvd3NCYWNrZ3JvdW5kID0gbmV3IFdpbmRvd3NCYWNrZ3JvdW5kKHRoaXMpO1xuXG4gICAgICAgIGNvbnN0IHRoYXQgPSB0aGlzO1xuICAgICAgICB0aGlzLmF1dGhTZXJ2aWNlID0gbmV3IEF1dGhTZXJ2aWNlKHRoaXMuY3J5cHRvU2VydmljZSwgdGhpcy5hcGlTZXJ2aWNlLCB0aGlzLnVzZXJTZXJ2aWNlLFxuICAgICAgICAgICAgdGhpcy50b2tlblNlcnZpY2UsIHRoaXMuYXBwSWRTZXJ2aWNlLCB0aGlzLmkxOG5TZXJ2aWNlLCB0aGlzLnBsYXRmb3JtVXRpbHNTZXJ2aWNlLFxuICAgICAgICAgICAgbmV3IGNsYXNzIGV4dGVuZHMgTWVzc2FnaW5nU2VydmljZUFic3RyYWN0aW9uIHtcbiAgICAgICAgICAgICAgICAvLyBBdXRoU2VydmljZSBzaG91bGQgc2VuZCB0aGUgbWVzc2FnZXMgdG8gdGhlIGJhY2tncm91bmQgbm90IHBvcHVwLlxuICAgICAgICAgICAgICAgIHNlbmQgPSAoc3Vic2NyaWJlcjogc3RyaW5nLCBhcmc6IGFueSA9IHt9KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBPYmplY3QuYXNzaWduKHt9LCB7IGNvbW1hbmQ6IHN1YnNjcmliZXIgfSwgYXJnKTtcbiAgICAgICAgICAgICAgICAgICAgdGhhdC5ydW50aW1lQmFja2dyb3VuZC5wcm9jZXNzTWVzc2FnZShtZXNzYWdlLCB0aGF0LCBudWxsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KCksIHRoaXMudmF1bHRUaW1lb3V0U2VydmljZSwgdGhpcy5sb2dTZXJ2aWNlLCB0aGlzLmNyeXB0b0Z1bmN0aW9uU2VydmljZSk7XG4gICAgfVxuXG4gICAgYXN5bmMgYm9vdHN0cmFwKCkge1xuICAgICAgICB0aGlzLmNvbnRhaW5lclNlcnZpY2UuYXR0YWNoVG9XaW5kb3cod2luZG93KTtcblxuICAgICAgICAodGhpcy5hdXRoU2VydmljZSBhcyBBdXRoU2VydmljZSkuaW5pdCgpO1xuICAgICAgICBhd2FpdCAodGhpcy52YXVsdFRpbWVvdXRTZXJ2aWNlIGFzIFZhdWx0VGltZW91dFNlcnZpY2UpLmluaXQodHJ1ZSk7XG4gICAgICAgIGF3YWl0ICh0aGlzLmkxOG5TZXJ2aWNlIGFzIEkxOG5TZXJ2aWNlKS5pbml0KCk7XG4gICAgICAgIGF3YWl0ICh0aGlzLmV2ZW50U2VydmljZSBhcyBFdmVudFNlcnZpY2UpLmluaXQodHJ1ZSk7XG4gICAgICAgIGF3YWl0IHRoaXMucnVudGltZUJhY2tncm91bmQuaW5pdCgpO1xuICAgICAgICBhd2FpdCB0aGlzLm5vdGlmaWNhdGlvbkJhY2tncm91bmQuaW5pdCgpO1xuICAgICAgICBhd2FpdCB0aGlzLmNvbW1hbmRzQmFja2dyb3VuZC5pbml0KCk7XG5cbiAgICAgICAgYXdhaXQgdGhpcy50YWJzQmFja2dyb3VuZC5pbml0KCk7XG4gICAgICAgIGF3YWl0IHRoaXMuY29udGV4dE1lbnVzQmFja2dyb3VuZC5pbml0KCk7XG4gICAgICAgIGF3YWl0IHRoaXMuaWRsZUJhY2tncm91bmQuaW5pdCgpO1xuICAgICAgICBhd2FpdCB0aGlzLndlYlJlcXVlc3RCYWNrZ3JvdW5kLmluaXQoKTtcbiAgICAgICAgYXdhaXQgdGhpcy53aW5kb3dzQmFja2dyb3VuZC5pbml0KCk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KHJlc29sdmUgPT4ge1xuICAgICAgICAgICAgc2V0VGltZW91dChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5lbnZpcm9ubWVudFNlcnZpY2Uuc2V0VXJsc0Zyb21TdG9yYWdlKCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXRJY29uKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5mdWxsU3luYyh0cnVlKTtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMubm90aWZpY2F0aW9uc1NlcnZpY2UuaW5pdCgpLCAyNTAwKTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICB9LCA1MDApO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBhc3luYyBzZXRJY29uKCkge1xuICAgICAgICBpZiAoIWNocm9tZS5icm93c2VyQWN0aW9uICYmICF0aGlzLnNpZGViYXJBY3Rpb24pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGlzQXV0aGVudGljYXRlZCA9IGF3YWl0IHRoaXMudXNlclNlcnZpY2UuaXNBdXRoZW50aWNhdGVkKCk7XG4gICAgICAgIGNvbnN0IGxvY2tlZCA9IGF3YWl0IHRoaXMudmF1bHRUaW1lb3V0U2VydmljZS5pc0xvY2tlZCgpO1xuXG4gICAgICAgIGxldCBzdWZmaXggPSAnJztcbiAgICAgICAgaWYgKCFpc0F1dGhlbnRpY2F0ZWQpIHtcbiAgICAgICAgICAgIHN1ZmZpeCA9ICdfZ3JheSc7XG4gICAgICAgIH0gZWxzZSBpZiAobG9ja2VkKSB7XG4gICAgICAgICAgICBzdWZmaXggPSAnX2xvY2tlZCc7XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCB0aGlzLmFjdGlvblNldEljb24oY2hyb21lLmJyb3dzZXJBY3Rpb24sIHN1ZmZpeCk7XG4gICAgICAgIGF3YWl0IHRoaXMuYWN0aW9uU2V0SWNvbih0aGlzLnNpZGViYXJBY3Rpb24sIHN1ZmZpeCk7XG4gICAgfVxuXG4gICAgYXN5bmMgcmVmcmVzaEJhZGdlQW5kTWVudShmb3JMb2NrZWQ6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgICAgICBpZiAoIWNocm9tZS53aW5kb3dzIHx8ICFjaHJvbWUuY29udGV4dE1lbnVzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtZW51RGlzYWJsZWQgPSBhd2FpdCB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldDxib29sZWFuPihDb25zdGFudHNTZXJ2aWNlLmRpc2FibGVDb250ZXh0TWVudUl0ZW1LZXkpO1xuICAgICAgICBpZiAoIW1lbnVEaXNhYmxlZCkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5idWlsZENvbnRleHRNZW51KCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNvbnRleHRNZW51c1JlbW92ZUFsbCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZvckxvY2tlZCkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5sb2FkTWVudUFuZFVwZGF0ZUJhZGdlRm9yTm9BY2Nlc3NTdGF0ZSghbWVudURpc2FibGVkKTtcbiAgICAgICAgICAgIHRoaXMub25VcGRhdGVkUmFuID0gdGhpcy5vblJlcGxhY2VkUmFuID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0YWIgPSBhd2FpdCBCcm93c2VyQXBpLmdldFRhYkZyb21DdXJyZW50V2luZG93KCk7XG4gICAgICAgIGlmICh0YWIpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY29udGV4dE1lbnVSZWFkeSh0YWIsICFtZW51RGlzYWJsZWQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgbG9nb3V0KGV4cGlyZWQ6IGJvb2xlYW4pIHtcbiAgICAgICAgYXdhaXQgdGhpcy5ldmVudFNlcnZpY2UudXBsb2FkRXZlbnRzKCk7XG4gICAgICAgIGNvbnN0IHVzZXJJZCA9IGF3YWl0IHRoaXMudXNlclNlcnZpY2UuZ2V0VXNlcklkKCk7XG5cbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgdGhpcy5ldmVudFNlcnZpY2UuY2xlYXJFdmVudHMoKSxcbiAgICAgICAgICAgIHRoaXMuc3luY1NlcnZpY2Uuc2V0TGFzdFN5bmMobmV3IERhdGUoMCkpLFxuICAgICAgICAgICAgdGhpcy50b2tlblNlcnZpY2UuY2xlYXJUb2tlbigpLFxuICAgICAgICAgICAgdGhpcy5jcnlwdG9TZXJ2aWNlLmNsZWFyS2V5cygpLFxuICAgICAgICAgICAgdGhpcy51c2VyU2VydmljZS5jbGVhcigpLFxuICAgICAgICAgICAgdGhpcy5zZXR0aW5nc1NlcnZpY2UuY2xlYXIodXNlcklkKSxcbiAgICAgICAgICAgIHRoaXMuY2lwaGVyU2VydmljZS5jbGVhcih1c2VySWQpLFxuICAgICAgICAgICAgdGhpcy5mb2xkZXJTZXJ2aWNlLmNsZWFyKHVzZXJJZCksXG4gICAgICAgICAgICB0aGlzLmNvbGxlY3Rpb25TZXJ2aWNlLmNsZWFyKHVzZXJJZCksXG4gICAgICAgICAgICB0aGlzLnBvbGljeVNlcnZpY2UuY2xlYXIodXNlcklkKSxcbiAgICAgICAgICAgIHRoaXMucGFzc3dvcmRHZW5lcmF0aW9uU2VydmljZS5jbGVhcigpLFxuICAgICAgICAgICAgdGhpcy52YXVsdFRpbWVvdXRTZXJ2aWNlLmNsZWFyKCksXG4gICAgICAgIF0pO1xuXG4gICAgICAgIHRoaXMuc2VhcmNoU2VydmljZS5jbGVhckluZGV4KCk7XG4gICAgICAgIHRoaXMubWVzc2FnaW5nU2VydmljZS5zZW5kKCdkb25lTG9nZ2luZ091dCcsIHsgZXhwaXJlZDogZXhwaXJlZCB9KTtcblxuICAgICAgICBhd2FpdCB0aGlzLnNldEljb24oKTtcbiAgICAgICAgYXdhaXQgdGhpcy5yZWZyZXNoQmFkZ2VBbmRNZW51KCk7XG4gICAgICAgIGF3YWl0IHRoaXMucmVzZWVkU3RvcmFnZSgpO1xuICAgICAgICB0aGlzLm5vdGlmaWNhdGlvbnNTZXJ2aWNlLnVwZGF0ZUNvbm5lY3Rpb24oZmFsc2UpO1xuICAgICAgICB0aGlzLnN5c3RlbVNlcnZpY2Uuc3RhcnRQcm9jZXNzUmVsb2FkKCk7XG4gICAgICAgIGF3YWl0IHRoaXMuc3lzdGVtU2VydmljZS5jbGVhclBlbmRpbmdDbGlwYm9hcmQoKTtcbiAgICB9XG5cbiAgICBhc3luYyBjb2xsZWN0UGFnZURldGFpbHNGb3JDb250ZW50U2NyaXB0KHRhYjogYW55LCBzZW5kZXI6IHN0cmluZywgZnJhbWVJZDogbnVtYmVyID0gbnVsbCkge1xuICAgICAgICBpZiAodGFiID09IG51bGwgfHwgIXRhYi5pZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgb3B0aW9uczogYW55ID0ge307XG4gICAgICAgIGlmIChmcmFtZUlkICE9IG51bGwpIHtcbiAgICAgICAgICAgIG9wdGlvbnMuZnJhbWVJZCA9IGZyYW1lSWQ7XG4gICAgICAgIH1cblxuICAgICAgICBCcm93c2VyQXBpLnRhYlNlbmRNZXNzYWdlKHRhYiwge1xuICAgICAgICAgICAgY29tbWFuZDogJ2NvbGxlY3RQYWdlRGV0YWlscycsXG4gICAgICAgICAgICB0YWI6IHRhYixcbiAgICAgICAgICAgIHNlbmRlcjogc2VuZGVyLFxuICAgICAgICB9LCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICBhc3luYyBvcGVuUG9wdXAoKSB7XG4gICAgICAgIC8vIENocm9tZSBBUElzIGNhbm5vdCBvcGVuIHBvcHVwXG5cbiAgICAgICAgLy8gVE9ETzogRG8gd2UgbmVlZCB0byBvcGVuIHRoaXMgcG9wdXA/XG4gICAgICAgIGlmICghdGhpcy5pc1NhZmFyaSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IFNhZmFyaUFwcC5zZW5kTWVzc2FnZVRvQXBwKCdzaG93UG9wb3ZlcicsIG51bGwsIHRydWUpO1xuICAgIH1cblxuICAgIGFzeW5jIHJlc2VlZFN0b3JhZ2UoKSB7XG4gICAgICAgIGlmICghdGhpcy5wbGF0Zm9ybVV0aWxzU2VydmljZS5pc0Nocm9tZSgpICYmICF0aGlzLnBsYXRmb3JtVXRpbHNTZXJ2aWNlLmlzVml2YWxkaSgpICYmXG4gICAgICAgICAgICAhdGhpcy5wbGF0Zm9ybVV0aWxzU2VydmljZS5pc09wZXJhKCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGN1cnJlbnRWYXVsdFRpbWVvdXQgPSBhd2FpdCB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldDxudW1iZXI+KENvbnN0YW50c1NlcnZpY2UudmF1bHRUaW1lb3V0S2V5KTtcbiAgICAgICAgaWYgKGN1cnJlbnRWYXVsdFRpbWVvdXQgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZ2V0U3RvcmFnZSA9ICgpOiBQcm9taXNlPGFueT4gPT4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAgICAgICBjaHJvbWUuc3RvcmFnZS5sb2NhbC5nZXQobnVsbCwgKG86IGFueSkgPT4gcmVzb2x2ZShvKSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGNsZWFyU3RvcmFnZSA9ICgpOiBQcm9taXNlPHZvaWQ+ID0+IG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgICAgICAgY2hyb21lLnN0b3JhZ2UubG9jYWwuY2xlYXIoKCkgPT4gcmVzb2x2ZSgpKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3Qgc3RvcmFnZSA9IGF3YWl0IGdldFN0b3JhZ2UoKTtcbiAgICAgICAgYXdhaXQgY2xlYXJTdG9yYWdlKCk7XG5cbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gc3RvcmFnZSkge1xuICAgICAgICAgICAgaWYgKCFzdG9yYWdlLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2F2ZShrZXksIHN0b3JhZ2Vba2V5XSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGJ1aWxkQ29udGV4dE1lbnUoKSB7XG4gICAgICAgIGlmICghY2hyb21lLmNvbnRleHRNZW51cyB8fCB0aGlzLmJ1aWxkaW5nQ29udGV4dE1lbnUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuYnVpbGRpbmdDb250ZXh0TWVudSA9IHRydWU7XG4gICAgICAgIGF3YWl0IHRoaXMuY29udGV4dE1lbnVzUmVtb3ZlQWxsKCk7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5jb250ZXh0TWVudXNDcmVhdGUoe1xuICAgICAgICAgICAgdHlwZTogJ25vcm1hbCcsXG4gICAgICAgICAgICBpZDogJ3Jvb3QnLFxuICAgICAgICAgICAgY29udGV4dHM6IFsnYWxsJ10sXG4gICAgICAgICAgICB0aXRsZTogJ0JpdHdhcmRlbicsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGF3YWl0IHRoaXMuY29udGV4dE1lbnVzQ3JlYXRlKHtcbiAgICAgICAgICAgIHR5cGU6ICdub3JtYWwnLFxuICAgICAgICAgICAgaWQ6ICdhdXRvZmlsbCcsXG4gICAgICAgICAgICBwYXJlbnRJZDogJ3Jvb3QnLFxuICAgICAgICAgICAgY29udGV4dHM6IFsnYWxsJ10sXG4gICAgICAgICAgICB0aXRsZTogdGhpcy5pMThuU2VydmljZS50KCdhdXRvRmlsbCcpLFxuICAgICAgICB9KTtcblxuICAgICAgICBhd2FpdCB0aGlzLmNvbnRleHRNZW51c0NyZWF0ZSh7XG4gICAgICAgICAgICB0eXBlOiAnbm9ybWFsJyxcbiAgICAgICAgICAgIGlkOiAnY29weS11c2VybmFtZScsXG4gICAgICAgICAgICBwYXJlbnRJZDogJ3Jvb3QnLFxuICAgICAgICAgICAgY29udGV4dHM6IFsnYWxsJ10sXG4gICAgICAgICAgICB0aXRsZTogdGhpcy5pMThuU2VydmljZS50KCdjb3B5VXNlcm5hbWUnKSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5jb250ZXh0TWVudXNDcmVhdGUoe1xuICAgICAgICAgICAgdHlwZTogJ25vcm1hbCcsXG4gICAgICAgICAgICBpZDogJ2NvcHktcGFzc3dvcmQnLFxuICAgICAgICAgICAgcGFyZW50SWQ6ICdyb290JyxcbiAgICAgICAgICAgIGNvbnRleHRzOiBbJ2FsbCddLFxuICAgICAgICAgICAgdGl0bGU6IHRoaXMuaTE4blNlcnZpY2UudCgnY29weVBhc3N3b3JkJyksXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChhd2FpdCB0aGlzLnVzZXJTZXJ2aWNlLmNhbkFjY2Vzc1ByZW1pdW0oKSkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5jb250ZXh0TWVudXNDcmVhdGUoe1xuICAgICAgICAgICAgICAgIHR5cGU6ICdub3JtYWwnLFxuICAgICAgICAgICAgICAgIGlkOiAnY29weS10b3RwJyxcbiAgICAgICAgICAgICAgICBwYXJlbnRJZDogJ3Jvb3QnLFxuICAgICAgICAgICAgICAgIGNvbnRleHRzOiBbJ2FsbCddLFxuICAgICAgICAgICAgICAgIHRpdGxlOiB0aGlzLmkxOG5TZXJ2aWNlLnQoJ2NvcHlWZXJpZmljYXRpb25Db2RlJyksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IHRoaXMuY29udGV4dE1lbnVzQ3JlYXRlKHtcbiAgICAgICAgICAgIHR5cGU6ICdzZXBhcmF0b3InLFxuICAgICAgICAgICAgcGFyZW50SWQ6ICdyb290JyxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5jb250ZXh0TWVudXNDcmVhdGUoe1xuICAgICAgICAgICAgdHlwZTogJ25vcm1hbCcsXG4gICAgICAgICAgICBpZDogJ2dlbmVyYXRlLXBhc3N3b3JkJyxcbiAgICAgICAgICAgIHBhcmVudElkOiAncm9vdCcsXG4gICAgICAgICAgICBjb250ZXh0czogWydhbGwnXSxcbiAgICAgICAgICAgIHRpdGxlOiB0aGlzLmkxOG5TZXJ2aWNlLnQoJ2dlbmVyYXRlUGFzc3dvcmRDb3BpZWQnKSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5jb250ZXh0TWVudXNDcmVhdGUoe1xuICAgICAgICAgICAgdHlwZTogJ25vcm1hbCcsXG4gICAgICAgICAgICBpZDogJ2NvcHktaWRlbnRpZmllcicsXG4gICAgICAgICAgICBwYXJlbnRJZDogJ3Jvb3QnLFxuICAgICAgICAgICAgY29udGV4dHM6IFsnYWxsJ10sXG4gICAgICAgICAgICB0aXRsZTogdGhpcy5pMThuU2VydmljZS50KCdjb3B5RWxlbWVudElkZW50aWZpZXInKSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5idWlsZGluZ0NvbnRleHRNZW51ID0gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBjb250ZXh0TWVudVJlYWR5KHRhYjogYW55LCBjb250ZXh0TWVudUVuYWJsZWQ6IGJvb2xlYW4pIHtcbiAgICAgICAgYXdhaXQgdGhpcy5sb2FkTWVudUFuZFVwZGF0ZUJhZGdlKHRhYi51cmwsIHRhYi5pZCwgY29udGV4dE1lbnVFbmFibGVkKTtcbiAgICAgICAgdGhpcy5vblVwZGF0ZWRSYW4gPSB0aGlzLm9uUmVwbGFjZWRSYW4gPSBmYWxzZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGxvYWRNZW51QW5kVXBkYXRlQmFkZ2UodXJsOiBzdHJpbmcsIHRhYklkOiBudW1iZXIsIGNvbnRleHRNZW51RW5hYmxlZDogYm9vbGVhbikge1xuICAgICAgICBpZiAoIXVybCB8fCAoIWNocm9tZS5icm93c2VyQWN0aW9uICYmICF0aGlzLnNpZGViYXJBY3Rpb24pKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmFjdGlvblNldEJhZGdlQmFja2dyb3VuZENvbG9yKGNocm9tZS5icm93c2VyQWN0aW9uKTtcbiAgICAgICAgdGhpcy5hY3Rpb25TZXRCYWRnZUJhY2tncm91bmRDb2xvcih0aGlzLnNpZGViYXJBY3Rpb24pO1xuXG4gICAgICAgIHRoaXMubWVudU9wdGlvbnNMb2FkZWQgPSBbXTtcbiAgICAgICAgY29uc3QgbG9ja2VkID0gYXdhaXQgdGhpcy52YXVsdFRpbWVvdXRTZXJ2aWNlLmlzTG9ja2VkKCk7XG4gICAgICAgIGlmICghbG9ja2VkKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNpcGhlcnMgPSBhd2FpdCB0aGlzLmNpcGhlclNlcnZpY2UuZ2V0QWxsRGVjcnlwdGVkRm9yVXJsKHVybCk7XG4gICAgICAgICAgICAgICAgY2lwaGVycy5zb3J0KChhLCBiKSA9PiB0aGlzLmNpcGhlclNlcnZpY2Uuc29ydENpcGhlcnNCeUxhc3RVc2VkVGhlbk5hbWUoYSwgYikpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGNvbnRleHRNZW51RW5hYmxlZCkge1xuICAgICAgICAgICAgICAgICAgICBjaXBoZXJzLmZvckVhY2goY2lwaGVyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZExvZ2luQ29udGV4dE1lbnVPcHRpb25zKGNpcGhlcik7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGRpc2FibGVCYWRnZUNvdW50ZXIgPSBhd2FpdCB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldDxib29sZWFuPihDb25zdGFudHNTZXJ2aWNlLmRpc2FibGVCYWRnZUNvdW50ZXJLZXkpO1xuICAgICAgICAgICAgICAgIGxldCB0aGVUZXh0ID0gJyc7XG5cbiAgICAgICAgICAgICAgICBpZiAoIWRpc2FibGVCYWRnZUNvdW50ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNpcGhlcnMubGVuZ3RoID4gMCAmJiBjaXBoZXJzLmxlbmd0aCA8PSA5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGVUZXh0ID0gY2lwaGVycy5sZW5ndGgudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaXBoZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoZVRleHQgPSAnOSsnO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGNvbnRleHRNZW51RW5hYmxlZCAmJiBjaXBoZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmxvYWROb0xvZ2luc0NvbnRleHRNZW51T3B0aW9ucyh0aGlzLmkxOG5TZXJ2aWNlLnQoJ25vTWF0Y2hpbmdMb2dpbnMnKSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5zaWRlYmFyQWN0aW9uU2V0QmFkZ2VUZXh0KHRoZVRleHQsIHRhYklkKTtcbiAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXJBY3Rpb25TZXRCYWRnZVRleHQodGhlVGV4dCwgdGFiSWQpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nU2VydmljZS5lcnJvcihlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IHRoaXMubG9hZE1lbnVBbmRVcGRhdGVCYWRnZUZvck5vQWNjZXNzU3RhdGUoY29udGV4dE1lbnVFbmFibGVkKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGxvYWRNZW51QW5kVXBkYXRlQmFkZ2VGb3JOb0FjY2Vzc1N0YXRlKGNvbnRleHRNZW51RW5hYmxlZDogYm9vbGVhbikge1xuICAgICAgICBpZiAoY29udGV4dE1lbnVFbmFibGVkKSB7XG4gICAgICAgICAgICBjb25zdCBhdXRoZWQgPSBhd2FpdCB0aGlzLnVzZXJTZXJ2aWNlLmlzQXV0aGVudGljYXRlZCgpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5sb2FkTm9Mb2dpbnNDb250ZXh0TWVudU9wdGlvbnModGhpcy5pMThuU2VydmljZS50KGF1dGhlZCA/ICd2YXVsdExvY2tlZCcgOiAndmF1bHRMb2dnZWRPdXQnKSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0YWJzID0gYXdhaXQgQnJvd3NlckFwaS5nZXRBY3RpdmVUYWJzKCk7XG4gICAgICAgIGlmICh0YWJzICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRhYnMuZm9yRWFjaCh0YWIgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0YWIuaWQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXJBY3Rpb25TZXRCYWRnZVRleHQoJycsIHRhYi5pZCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2lkZWJhckFjdGlvblNldEJhZGdlVGV4dCgnJywgdGFiLmlkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgbG9hZExvZ2luQ29udGV4dE1lbnVPcHRpb25zKGNpcGhlcjogYW55KSB7XG4gICAgICAgIGlmIChjaXBoZXIgPT0gbnVsbCB8fCBjaXBoZXIudHlwZSAhPT0gQ2lwaGVyVHlwZS5Mb2dpbiB8fCBjaXBoZXIucmVwcm9tcHQgIT09IENpcGhlclJlcHJvbXB0VHlwZS5Ob25lKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgdGl0bGUgPSBjaXBoZXIubmFtZTtcbiAgICAgICAgaWYgKGNpcGhlci5sb2dpbi51c2VybmFtZSAmJiBjaXBoZXIubG9naW4udXNlcm5hbWUgIT09ICcnKSB7XG4gICAgICAgICAgICB0aXRsZSArPSAoJyAoJyArIGNpcGhlci5sb2dpbi51c2VybmFtZSArICcpJyk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGhpcy5sb2FkQ29udGV4dE1lbnVPcHRpb25zKHRpdGxlLCBjaXBoZXIuaWQsIGNpcGhlcik7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBsb2FkTm9Mb2dpbnNDb250ZXh0TWVudU9wdGlvbnMobm9Mb2dpbnNNZXNzYWdlOiBzdHJpbmcpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5sb2FkQ29udGV4dE1lbnVPcHRpb25zKG5vTG9naW5zTWVzc2FnZSwgJ25vb3AnLCBudWxsKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGxvYWRDb250ZXh0TWVudU9wdGlvbnModGl0bGU6IHN0cmluZywgaWRTdWZmaXg6IHN0cmluZywgY2lwaGVyOiBhbnkpIHtcbiAgICAgICAgaWYgKCFjaHJvbWUuY29udGV4dE1lbnVzIHx8IHRoaXMubWVudU9wdGlvbnNMb2FkZWQuaW5kZXhPZihpZFN1ZmZpeCkgPiAtMSB8fFxuICAgICAgICAgICAgKGNpcGhlciAhPSBudWxsICYmIGNpcGhlci50eXBlICE9PSBDaXBoZXJUeXBlLkxvZ2luKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5tZW51T3B0aW9uc0xvYWRlZC5wdXNoKGlkU3VmZml4KTtcblxuICAgICAgICBpZiAoY2lwaGVyID09IG51bGwgfHwgKGNpcGhlci5sb2dpbi5wYXNzd29yZCAmJiBjaXBoZXIubG9naW4ucGFzc3dvcmQgIT09ICcnKSkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5jb250ZXh0TWVudXNDcmVhdGUoe1xuICAgICAgICAgICAgICAgIHR5cGU6ICdub3JtYWwnLFxuICAgICAgICAgICAgICAgIGlkOiAnYXV0b2ZpbGxfJyArIGlkU3VmZml4LFxuICAgICAgICAgICAgICAgIHBhcmVudElkOiAnYXV0b2ZpbGwnLFxuICAgICAgICAgICAgICAgIGNvbnRleHRzOiBbJ2FsbCddLFxuICAgICAgICAgICAgICAgIHRpdGxlOiB0aGlzLnNhbml0aXplQ29udGV4dE1lbnVUaXRsZSh0aXRsZSksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjaXBoZXIgPT0gbnVsbCB8fCAoY2lwaGVyLmxvZ2luLnVzZXJuYW1lICYmIGNpcGhlci5sb2dpbi51c2VybmFtZSAhPT0gJycpKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNvbnRleHRNZW51c0NyZWF0ZSh7XG4gICAgICAgICAgICAgICAgdHlwZTogJ25vcm1hbCcsXG4gICAgICAgICAgICAgICAgaWQ6ICdjb3B5LXVzZXJuYW1lXycgKyBpZFN1ZmZpeCxcbiAgICAgICAgICAgICAgICBwYXJlbnRJZDogJ2NvcHktdXNlcm5hbWUnLFxuICAgICAgICAgICAgICAgIGNvbnRleHRzOiBbJ2FsbCddLFxuICAgICAgICAgICAgICAgIHRpdGxlOiB0aGlzLnNhbml0aXplQ29udGV4dE1lbnVUaXRsZSh0aXRsZSksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjaXBoZXIgPT0gbnVsbCB8fCAoY2lwaGVyLmxvZ2luLnBhc3N3b3JkICYmIGNpcGhlci5sb2dpbi5wYXNzd29yZCAhPT0gJycgJiYgY2lwaGVyLnZpZXdQYXNzd29yZCkpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY29udGV4dE1lbnVzQ3JlYXRlKHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnbm9ybWFsJyxcbiAgICAgICAgICAgICAgICBpZDogJ2NvcHktcGFzc3dvcmRfJyArIGlkU3VmZml4LFxuICAgICAgICAgICAgICAgIHBhcmVudElkOiAnY29weS1wYXNzd29yZCcsXG4gICAgICAgICAgICAgICAgY29udGV4dHM6IFsnYWxsJ10sXG4gICAgICAgICAgICAgICAgdGl0bGU6IHRoaXMuc2FuaXRpemVDb250ZXh0TWVudVRpdGxlKHRpdGxlKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2FuQWNjZXNzUHJlbWl1bSA9IGF3YWl0IHRoaXMudXNlclNlcnZpY2UuY2FuQWNjZXNzUHJlbWl1bSgpO1xuICAgICAgICBpZiAoY2FuQWNjZXNzUHJlbWl1bSAmJiAoY2lwaGVyID09IG51bGwgfHwgKGNpcGhlci5sb2dpbi50b3RwICYmIGNpcGhlci5sb2dpbi50b3RwICE9PSAnJykpKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNvbnRleHRNZW51c0NyZWF0ZSh7XG4gICAgICAgICAgICAgICAgdHlwZTogJ25vcm1hbCcsXG4gICAgICAgICAgICAgICAgaWQ6ICdjb3B5LXRvdHBfJyArIGlkU3VmZml4LFxuICAgICAgICAgICAgICAgIHBhcmVudElkOiAnY29weS10b3RwJyxcbiAgICAgICAgICAgICAgICBjb250ZXh0czogWydhbGwnXSxcbiAgICAgICAgICAgICAgICB0aXRsZTogdGhpcy5zYW5pdGl6ZUNvbnRleHRNZW51VGl0bGUodGl0bGUpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHNhbml0aXplQ29udGV4dE1lbnVUaXRsZSh0aXRsZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRpdGxlLnJlcGxhY2UoLyYvZywgJyYmJyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBmdWxsU3luYyhvdmVycmlkZTogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgICAgIGNvbnN0IHN5bmNJbnRlcm5hbCA9IDYgKiA2MCAqIDYwICogMTAwMDsgLy8gNiBob3Vyc1xuICAgICAgICBjb25zdCBsYXN0U3luYyA9IGF3YWl0IHRoaXMuc3luY1NlcnZpY2UuZ2V0TGFzdFN5bmMoKTtcblxuICAgICAgICBsZXQgbGFzdFN5bmNBZ28gPSBzeW5jSW50ZXJuYWwgKyAxO1xuICAgICAgICBpZiAobGFzdFN5bmMgIT0gbnVsbCkge1xuICAgICAgICAgICAgbGFzdFN5bmNBZ28gPSBuZXcgRGF0ZSgpLmdldFRpbWUoKSAtIGxhc3RTeW5jLmdldFRpbWUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvdmVycmlkZSB8fCBsYXN0U3luY0FnbyA+PSBzeW5jSW50ZXJuYWwpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc3luY1NlcnZpY2UuZnVsbFN5bmMob3ZlcnJpZGUpO1xuICAgICAgICAgICAgdGhpcy5zY2hlZHVsZU5leHRTeW5jKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNjaGVkdWxlTmV4dFN5bmMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc2NoZWR1bGVOZXh0U3luYygpIHtcbiAgICAgICAgaWYgKHRoaXMuc3luY1RpbWVvdXQpIHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnN5bmNUaW1lb3V0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc3luY1RpbWVvdXQgPSBzZXRUaW1lb3V0KGFzeW5jICgpID0+IGF3YWl0IHRoaXMuZnVsbFN5bmMoKSwgNSAqIDYwICogMTAwMCk7IC8vIGNoZWNrIGV2ZXJ5IDUgbWludXRlc1xuICAgIH1cblxuICAgIC8vIEJyb3dzZXIgQVBJIEhlbHBlcnNcblxuICAgIHByaXZhdGUgY29udGV4dE1lbnVzUmVtb3ZlQWxsKCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4ocmVzb2x2ZSA9PiB7XG4gICAgICAgICAgICBjaHJvbWUuY29udGV4dE1lbnVzLnJlbW92ZUFsbCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIGlmIChjaHJvbWUucnVudGltZS5sYXN0RXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNvbnRleHRNZW51c0NyZWF0ZShvcHRpb25zOiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KHJlc29sdmUgPT4ge1xuICAgICAgICAgICAgY2hyb21lLmNvbnRleHRNZW51cy5jcmVhdGUob3B0aW9ucywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICBpZiAoY2hyb21lLnJ1bnRpbWUubGFzdEVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBhY3Rpb25TZXRJY29uKHRoZUFjdGlvbjogYW55LCBzdWZmaXg6IHN0cmluZyk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIGlmICghdGhlQWN0aW9uIHx8ICF0aGVBY3Rpb24uc2V0SWNvbikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIHBhdGg6IHtcbiAgICAgICAgICAgICAgICAxOTogJ2ltYWdlcy9pY29uMTknICsgc3VmZml4ICsgJy5wbmcnLFxuICAgICAgICAgICAgICAgIDM4OiAnaW1hZ2VzL2ljb24zOCcgKyBzdWZmaXggKyAnLnBuZycsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuXG4gICAgICAgIGlmICh0aGlzLnBsYXRmb3JtVXRpbHNTZXJ2aWNlLmlzRmlyZWZveCgpKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGVBY3Rpb24uc2V0SWNvbihvcHRpb25zKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnBsYXRmb3JtVXRpbHNTZXJ2aWNlLmlzU2FmYXJpKCkpIHtcbiAgICAgICAgICAgIC8vIFdvcmthcm91bmQgc2luY2UgU2FmYXJpIDE0LjAuMyByZXR1cm5zIGEgcGVuZGluZyBwcm9taXNlXG4gICAgICAgICAgICAvLyB3aGljaCBkb2Vzbid0IHJlc29sdmUgd2l0aGluIGEgcmVhc29uYWJsZSB0aW1lLlxuICAgICAgICAgICAgdGhlQWN0aW9uLnNldEljb24ob3B0aW9ucyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4ocmVzb2x2ZSA9PiB7XG4gICAgICAgICAgICAgICAgdGhlQWN0aW9uLnNldEljb24ob3B0aW9ucywgKCkgPT4gcmVzb2x2ZSgpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhY3Rpb25TZXRCYWRnZUJhY2tncm91bmRDb2xvcihhY3Rpb246IGFueSkge1xuICAgICAgICBpZiAoYWN0aW9uICYmIGFjdGlvbi5zZXRCYWRnZUJhY2tncm91bmRDb2xvcikge1xuICAgICAgICAgICAgYWN0aW9uLnNldEJhZGdlQmFja2dyb3VuZENvbG9yKHsgY29sb3I6ICcjMjk0ZTVmJyB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYnJvd3NlckFjdGlvblNldEJhZGdlVGV4dCh0ZXh0OiBzdHJpbmcsIHRhYklkOiBudW1iZXIpIHtcbiAgICAgICAgaWYgKGNocm9tZS5icm93c2VyQWN0aW9uICYmIGNocm9tZS5icm93c2VyQWN0aW9uLnNldEJhZGdlVGV4dCkge1xuICAgICAgICAgICAgY2hyb21lLmJyb3dzZXJBY3Rpb24uc2V0QmFkZ2VUZXh0KHtcbiAgICAgICAgICAgICAgICB0ZXh0OiB0ZXh0LFxuICAgICAgICAgICAgICAgIHRhYklkOiB0YWJJZCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzaWRlYmFyQWN0aW9uU2V0QmFkZ2VUZXh0KHRleHQ6IHN0cmluZywgdGFiSWQ6IG51bWJlcikge1xuICAgICAgICBpZiAoIXRoaXMuc2lkZWJhckFjdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuc2lkZWJhckFjdGlvbi5zZXRCYWRnZVRleHQpIHtcbiAgICAgICAgICAgIHRoaXMuc2lkZWJhckFjdGlvbi5zZXRCYWRnZVRleHQoe1xuICAgICAgICAgICAgICAgIHRleHQ6IHRleHQsXG4gICAgICAgICAgICAgICAgdGFiSWQ6IHRhYklkLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zaWRlYmFyQWN0aW9uLnNldFRpdGxlKSB7XG4gICAgICAgICAgICBsZXQgdGl0bGUgPSAnQml0d2FyZGVuJztcbiAgICAgICAgICAgIGlmICh0ZXh0ICYmIHRleHQgIT09ICcnKSB7XG4gICAgICAgICAgICAgICAgdGl0bGUgKz0gKCcgWycgKyB0ZXh0ICsgJ10nKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5zaWRlYmFyQWN0aW9uLnNldFRpdGxlKHtcbiAgICAgICAgICAgICAgICB0aXRsZTogdGl0bGUsXG4gICAgICAgICAgICAgICAgdGFiSWQ6IHRhYklkLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJleHBvcnQgZW51bSBOb3RpZmljYXRpb25RdWV1ZU1lc3NhZ2VUeXBlIHtcbiAgICBhZGRMb2dpbiA9ICdhZGRMb2dpbicsXG4gICAgY2hhbmdlUGFzc3dvcmQgPSAnY2hhbmdlUGFzc3dvcmQnLFxufVxuIiwiaW1wb3J0IHsgQXBwSWRTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9hcHBJZC5zZXJ2aWNlJztcbmltcG9ydCB7IENyeXB0b1NlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL2NyeXB0by5zZXJ2aWNlJztcbmltcG9ydCB7IENyeXB0b0Z1bmN0aW9uU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvY3J5cHRvRnVuY3Rpb24uc2VydmljZSc7XG5pbXBvcnQgeyBJMThuU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvaTE4bi5zZXJ2aWNlJztcbmltcG9ydCB7IE1lc3NhZ2luZ1NlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL21lc3NhZ2luZy5zZXJ2aWNlJztcbmltcG9ydCB7IFBsYXRmb3JtVXRpbHNTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9wbGF0Zm9ybVV0aWxzLnNlcnZpY2UnO1xuaW1wb3J0IHsgU3RvcmFnZVNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL3N0b3JhZ2Uuc2VydmljZSc7XG5pbXBvcnQgeyBVc2VyU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvdXNlci5zZXJ2aWNlJztcbmltcG9ydCB7IFZhdWx0VGltZW91dFNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL3ZhdWx0VGltZW91dC5zZXJ2aWNlJztcbmltcG9ydCB7IENvbnN0YW50c1NlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vc2VydmljZXMvY29uc3RhbnRzLnNlcnZpY2UnO1xuXG5pbXBvcnQgeyBVdGlscyB9IGZyb20gJ2pzbGliLWNvbW1vbi9taXNjL3V0aWxzJztcbmltcG9ydCB7IFN5bW1ldHJpY0NyeXB0b0tleSB9IGZyb20gJ2pzbGliLWNvbW1vbi9tb2RlbHMvZG9tYWluL3N5bW1ldHJpY0NyeXB0b0tleSc7XG5cbmltcG9ydCB7IEJyb3dzZXJBcGkgfSBmcm9tICcuLi9icm93c2VyL2Jyb3dzZXJBcGknO1xuaW1wb3J0IFJ1bnRpbWVCYWNrZ3JvdW5kIGZyb20gJy4vcnVudGltZS5iYWNrZ3JvdW5kJztcblxuY29uc3QgTWVzc2FnZVZhbGlkVGltZW91dCA9IDEwICogMTAwMDtcbmNvbnN0IEVuY3J5cHRpb25BbGdvcml0aG0gPSAnc2hhMSc7XG5cbmV4cG9ydCBjbGFzcyBOYXRpdmVNZXNzYWdpbmdCYWNrZ3JvdW5kIHtcbiAgICBwcml2YXRlIGNvbm5lY3RlZCA9IGZhbHNlO1xuICAgIHByaXZhdGUgY29ubmVjdGluZzogYm9vbGVhbjtcbiAgICBwcml2YXRlIHBvcnQ6IGJyb3dzZXIucnVudGltZS5Qb3J0IHwgY2hyb21lLnJ1bnRpbWUuUG9ydDtcblxuICAgIHByaXZhdGUgcmVzb2x2ZXI6IGFueSA9IG51bGw7XG4gICAgcHJpdmF0ZSBwcml2YXRlS2V5OiBBcnJheUJ1ZmZlciA9IG51bGw7XG4gICAgcHJpdmF0ZSBwdWJsaWNLZXk6IEFycmF5QnVmZmVyID0gbnVsbDtcbiAgICBwcml2YXRlIHNlY3VyZVNldHVwUmVzb2x2ZTogYW55ID0gbnVsbDtcbiAgICBwcml2YXRlIHNoYXJlZFNlY3JldDogU3ltbWV0cmljQ3J5cHRvS2V5O1xuICAgIHByaXZhdGUgYXBwSWQ6IHN0cmluZztcbiAgICBwcml2YXRlIHZhbGlkYXRpbmdGaW5nZXJwcmludDogYm9vbGVhbjtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgc3RvcmFnZVNlcnZpY2U6IFN0b3JhZ2VTZXJ2aWNlLCBwcml2YXRlIGNyeXB0b1NlcnZpY2U6IENyeXB0b1NlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgY3J5cHRvRnVuY3Rpb25TZXJ2aWNlOiBDcnlwdG9GdW5jdGlvblNlcnZpY2UsIHByaXZhdGUgdmF1bHRUaW1lb3V0U2VydmljZTogVmF1bHRUaW1lb3V0U2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBydW50aW1lQmFja2dyb3VuZDogUnVudGltZUJhY2tncm91bmQsIHByaXZhdGUgaTE4blNlcnZpY2U6IEkxOG5TZXJ2aWNlLCBwcml2YXRlIHVzZXJTZXJ2aWNlOiBVc2VyU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBtZXNzYWdpbmdTZXJ2aWNlOiBNZXNzYWdpbmdTZXJ2aWNlLCBwcml2YXRlIGFwcElkU2VydmljZTogQXBwSWRTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHBsYXRmb3JtVXRpbHNTZXJ2aWNlOiBQbGF0Zm9ybVV0aWxzU2VydmljZSkge1xuICAgICAgICAgICAgdGhpcy5zdG9yYWdlU2VydmljZS5zYXZlKENvbnN0YW50c1NlcnZpY2UuYmlvbWV0cmljRmluZ2VycHJpbnRWYWxpZGF0ZWQsIGZhbHNlKTtcblxuICAgICAgICAgICAgaWYgKGNocm9tZT8ucGVybWlzc2lvbnM/Lm9uQWRkZWQpIHtcbiAgICAgICAgICAgICAgICAvLyBSZWxvYWQgZXh0ZW5zaW9uIHRvIGFjdGl2YXRlIG5hdGl2ZU1lc3NhZ2luZ1xuICAgICAgICAgICAgICAgIGNocm9tZS5wZXJtaXNzaW9ucy5vbkFkZGVkLmFkZExpc3RlbmVyKHBlcm1pc3Npb25zID0+IHtcbiAgICAgICAgICAgICAgICAgICAgQnJvd3NlckFwaS5yZWxvYWRFeHRlbnNpb24obnVsbCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgIGFzeW5jIGNvbm5lY3QoKSB7XG4gICAgICAgIHRoaXMuYXBwSWQgPSBhd2FpdCB0aGlzLmFwcElkU2VydmljZS5nZXRBcHBJZCgpO1xuICAgICAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNhdmUoQ29uc3RhbnRzU2VydmljZS5iaW9tZXRyaWNGaW5nZXJwcmludFZhbGlkYXRlZCwgZmFsc2UpO1xuXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLnBvcnQgPSBCcm93c2VyQXBpLmNvbm5lY3ROYXRpdmUoJ2NvbS44Yml0LmJpdHdhcmRlbicpO1xuXG4gICAgICAgICAgICB0aGlzLmNvbm5lY3RpbmcgPSB0cnVlO1xuXG4gICAgICAgICAgICBjb25zdCBjb25uZWN0ZWRDYWxsYmFjayA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3RlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5jb25uZWN0aW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgLy8gU2FmYXJpIGhhcyBhIGJ1bmRsZWQgbmF0aXZlIGNvbXBvbmVudCB3aGljaCBpcyBhbHdheXMgYXZhaWxhYmxlLCBubyBuZWVkIHRvXG4gICAgICAgICAgICAvLyBjaGVjayBpZiB0aGUgZGVza3RvcCBhcHAgaXMgcnVubmluZy5cbiAgICAgICAgICAgIGlmICh0aGlzLnBsYXRmb3JtVXRpbHNTZXJ2aWNlLmlzU2FmYXJpKCkpIHtcbiAgICAgICAgICAgICAgICBjb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnBvcnQub25NZXNzYWdlLmFkZExpc3RlbmVyKGFzeW5jIChtZXNzYWdlOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKG1lc3NhZ2UuY29tbWFuZCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdjb25uZWN0ZWQnOlxuICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdkaXNjb25uZWN0ZWQnOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY29ubmVjdGluZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnaW5nU2VydmljZS5zZW5kKCdzaG93RGlhbG9nJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiB0aGlzLmkxOG5TZXJ2aWNlLnQoJ3N0YXJ0RGVza3RvcERlc2MnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHRoaXMuaTE4blNlcnZpY2UudCgnc3RhcnREZXNrdG9wVGl0bGUnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlybVRleHQ6IHRoaXMuaTE4blNlcnZpY2UudCgnb2snKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBvcnQuZGlzY29ubmVjdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3NldHVwRW5jcnlwdGlvbic6XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUgc2luY2UgaXQgYmVsb25ncyB0byBhbm90aGVyIGRldmljZVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuYXBwSWQgIT09IHRoaXMuYXBwSWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuY3J5cHRlZCA9IFV0aWxzLmZyb21CNjRUb0FycmF5KG1lc3NhZ2Uuc2hhcmVkU2VjcmV0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlY3J5cHRlZCA9IGF3YWl0IHRoaXMuY3J5cHRvRnVuY3Rpb25TZXJ2aWNlLnJzYURlY3J5cHQoZW5jcnlwdGVkLmJ1ZmZlciwgdGhpcy5wcml2YXRlS2V5LCBFbmNyeXB0aW9uQWxnb3JpdGhtKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudmFsaWRhdGluZ0ZpbmdlcnByaW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52YWxpZGF0aW5nRmluZ2VycHJpbnQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNhdmUoQ29uc3RhbnRzU2VydmljZS5iaW9tZXRyaWNGaW5nZXJwcmludFZhbGlkYXRlZCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNoYXJlZFNlY3JldCA9IG5ldyBTeW1tZXRyaWNDcnlwdG9LZXkoZGVjcnlwdGVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VjdXJlU2V0dXBSZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnaW52YWxpZGF0ZUVuY3J5cHRpb24nOlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlIHNpbmNlIGl0IGJlbG9uZ3MgdG8gYW5vdGhlciBkZXZpY2VcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLmFwcElkICE9PSB0aGlzLmFwcElkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNoYXJlZFNlY3JldCA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByaXZhdGVLZXkgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25uZWN0ZWQgPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdpbmdTZXJ2aWNlLnNlbmQoJ3Nob3dEaWFsb2cnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogdGhpcy5pMThuU2VydmljZS50KCduYXRpdmVNZXNzYWdpbmdJbnZhbGlkRW5jcnlwdGlvbkRlc2MnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogdGhpcy5pMThuU2VydmljZS50KCduYXRpdmVNZXNzYWdpbmdJbnZhbGlkRW5jcnlwdGlvblRpdGxlJyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlybVRleHQ6IHRoaXMuaTE4blNlcnZpY2UudCgnb2snKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAndmVyaWZ5RmluZ2VycHJpbnQnOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zaGFyZWRTZWNyZXQgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudmFsaWRhdGluZ0ZpbmdlcnByaW50ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNob3dGaW5nZXJwcmludERpYWxvZygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnd3JvbmdVc2VySWQnOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zaG93V3JvbmdVc2VyRGlhbG9nKCk7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUgc2luY2UgaXQgYmVsb25ncyB0byBhbm90aGVyIGRldmljZVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLnBsYXRmb3JtVXRpbHNTZXJ2aWNlLmlzU2FmYXJpKCkgJiYgbWVzc2FnZS5hcHBJZCAhPT0gdGhpcy5hcHBJZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vbk1lc3NhZ2UobWVzc2FnZS5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdGhpcy5wb3J0Lm9uRGlzY29ubmVjdC5hZGRMaXN0ZW5lcigocDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IGVycm9yO1xuICAgICAgICAgICAgICAgIGlmIChCcm93c2VyQXBpLmlzV2ViRXh0ZW5zaW9uc0FwaSkge1xuICAgICAgICAgICAgICAgICAgICBlcnJvciA9IHAuZXJyb3IubWVzc2FnZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBlcnJvciA9IGNocm9tZS5ydW50aW1lLmxhc3RFcnJvci5tZXNzYWdlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChlcnJvciAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnaW5nU2VydmljZS5zZW5kKCdzaG93RGlhbG9nJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogdGhpcy5pMThuU2VydmljZS50KCdkZXNrdG9wSW50ZWdyYXRpb25EaXNhYmxlZERlc2MnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiB0aGlzLmkxOG5TZXJ2aWNlLnQoJ2Rlc2t0b3BJbnRlZ3JhdGlvbkRpc2FibGVkVGl0bGUnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpcm1UZXh0OiB0aGlzLmkxOG5TZXJ2aWNlLnQoJ29rJyksXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5zaGFyZWRTZWNyZXQgPSBudWxsO1xuICAgICAgICAgICAgICAgIHRoaXMucHJpdmF0ZUtleSA9IG51bGw7XG4gICAgICAgICAgICAgICAgdGhpcy5jb25uZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICByZWplY3QoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzaG93V3JvbmdVc2VyRGlhbG9nKCkge1xuICAgICAgICB0aGlzLm1lc3NhZ2luZ1NlcnZpY2Uuc2VuZCgnc2hvd0RpYWxvZycsIHtcbiAgICAgICAgICAgIHRleHQ6IHRoaXMuaTE4blNlcnZpY2UudCgnbmF0aXZlTWVzc2FnaW5nV3JvbmdVc2VyRGVzYycpLFxuICAgICAgICAgICAgdGl0bGU6IHRoaXMuaTE4blNlcnZpY2UudCgnbmF0aXZlTWVzc2FnaW5nV3JvbmdVc2VyVGl0bGUnKSxcbiAgICAgICAgICAgIGNvbmZpcm1UZXh0OiB0aGlzLmkxOG5TZXJ2aWNlLnQoJ29rJyksXG4gICAgICAgICAgICB0eXBlOiAnZXJyb3InLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBhc3luYyBzZW5kKG1lc3NhZ2U6IGFueSkge1xuICAgICAgICBpZiAoIXRoaXMuY29ubmVjdGVkKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNvbm5lY3QoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnBsYXRmb3JtVXRpbHNTZXJ2aWNlLmlzU2FmYXJpKCkpIHtcbiAgICAgICAgICAgIHRoaXMucG9zdE1lc3NhZ2UobWVzc2FnZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnBvc3RNZXNzYWdlKHthcHBJZDogdGhpcy5hcHBJZCwgbWVzc2FnZTogYXdhaXQgdGhpcy5lbmNyeXB0TWVzc2FnZShtZXNzYWdlKX0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgZW5jcnlwdE1lc3NhZ2UobWVzc2FnZTogYW55KSB7XG4gICAgICAgIGlmICh0aGlzLnNoYXJlZFNlY3JldCA9PSBudWxsKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNlY3VyZUNvbW11bmljYXRpb24oKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG1lc3NhZ2UudGltZXN0YW1wID0gRGF0ZS5ub3coKTtcblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jcnlwdG9TZXJ2aWNlLmVuY3J5cHQoSlNPTi5zdHJpbmdpZnkobWVzc2FnZSksIHRoaXMuc2hhcmVkU2VjcmV0KTtcbiAgICB9XG5cbiAgICBnZXRSZXNwb25zZSgpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZXNvbHZlciA9IHJlc29sdmU7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgcG9zdE1lc3NhZ2UobWVzc2FnZTogYW55KSB7XG4gICAgICAgIC8vIFdyYXAgaW4gdHJ5LWNhdGNoIHRvIHdoZW4gdGhlIHBvcnQgZGlzY29ubmVjdGVkIHdpdGhvdXQgdHJpZ2dlcmluZyBgb25EaXNjb25uZWN0YC5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMucG9ydC5wb3N0TWVzc2FnZShtZXNzYWdlKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiTmF0aXZlTWVzc2FnaW5nIHBvcnQgZGlzY29ubmVjdGVkLCBkaXNjb25uZWN0aW5nLlwiKTtcblxuICAgICAgICAgICAgdGhpcy5zaGFyZWRTZWNyZXQgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5wcml2YXRlS2V5ID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuY29ubmVjdGVkID0gZmFsc2U7XG5cbiAgICAgICAgICAgIHRoaXMubWVzc2FnaW5nU2VydmljZS5zZW5kKCdzaG93RGlhbG9nJywge1xuICAgICAgICAgICAgICAgIHRleHQ6IHRoaXMuaTE4blNlcnZpY2UudCgnbmF0aXZlTWVzc2FnaW5nSW52YWxpZEVuY3J5cHRpb25EZXNjJyksXG4gICAgICAgICAgICAgICAgdGl0bGU6IHRoaXMuaTE4blNlcnZpY2UudCgnbmF0aXZlTWVzc2FnaW5nSW52YWxpZEVuY3J5cHRpb25UaXRsZScpLFxuICAgICAgICAgICAgICAgIGNvbmZpcm1UZXh0OiB0aGlzLmkxOG5TZXJ2aWNlLnQoJ29rJyksXG4gICAgICAgICAgICAgICAgdHlwZTogJ2Vycm9yJyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBvbk1lc3NhZ2UocmF3TWVzc2FnZTogYW55KSB7XG4gICAgICAgIGxldCBtZXNzYWdlID0gcmF3TWVzc2FnZTtcbiAgICAgICAgaWYgKCF0aGlzLnBsYXRmb3JtVXRpbHNTZXJ2aWNlLmlzU2FmYXJpKCkpIHtcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBKU09OLnBhcnNlKGF3YWl0IHRoaXMuY3J5cHRvU2VydmljZS5kZWNyeXB0VG9VdGY4KHJhd01lc3NhZ2UsIHRoaXMuc2hhcmVkU2VjcmV0KSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoTWF0aC5hYnMobWVzc2FnZS50aW1lc3RhbXAgLSBEYXRlLm5vdygpKSA+IE1lc3NhZ2VWYWxpZFRpbWVvdXQpIHtcbiAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZVxuICAgICAgICAgICAgY29uc29sZS5lcnJvcignTmF0aXZlTWVzc2FnZSBpcyB0byBvbGQsIGlnbm9yaW5nLicpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgc3dpdGNoIChtZXNzYWdlLmNvbW1hbmQpIHtcbiAgICAgICAgICAgIGNhc2UgJ2Jpb21ldHJpY1VubG9jayc6XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zdG9yYWdlU2VydmljZS5yZW1vdmUoQ29uc3RhbnRzU2VydmljZS5iaW9tZXRyaWNBd2FpdGluZ0FjY2VwdGFuY2UpO1xuXG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UucmVzcG9uc2UgPT09ICdub3QgZW5hYmxlZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdpbmdTZXJ2aWNlLnNlbmQoJ3Nob3dEaWFsb2cnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiB0aGlzLmkxOG5TZXJ2aWNlLnQoJ2Jpb21ldHJpY3NOb3RFbmFibGVkRGVzYycpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHRoaXMuaTE4blNlcnZpY2UudCgnYmlvbWV0cmljc05vdEVuYWJsZWRUaXRsZScpLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlybVRleHQ6IHRoaXMuaTE4blNlcnZpY2UudCgnb2snKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1lc3NhZ2UucmVzcG9uc2UgPT09ICdub3Qgc3VwcG9ydGVkJykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2luZ1NlcnZpY2Uuc2VuZCgnc2hvd0RpYWxvZycsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6IHRoaXMuaTE4blNlcnZpY2UudCgnYmlvbWV0cmljc05vdFN1cHBvcnRlZERlc2MnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiB0aGlzLmkxOG5TZXJ2aWNlLnQoJ2Jpb21ldHJpY3NOb3RTdXBwb3J0ZWRUaXRsZScpLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlybVRleHQ6IHRoaXMuaTE4blNlcnZpY2UudCgnb2snKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBlbmFibGVkID0gYXdhaXQgdGhpcy5zdG9yYWdlU2VydmljZS5nZXQoQ29uc3RhbnRzU2VydmljZS5iaW9tZXRyaWNVbmxvY2tLZXkpO1xuICAgICAgICAgICAgICAgIGlmIChlbmFibGVkID09PSBudWxsIHx8IGVuYWJsZWQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLnJlc3BvbnNlID09PSAndW5sb2NrZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNhdmUoQ29uc3RhbnRzU2VydmljZS5iaW9tZXRyaWNVbmxvY2tLZXksIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIElnbm9yZSB1bmxvY2sgaWYgYWxyZWFkeSB1bmxvY2tlZGVkXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLnZhdWx0VGltZW91dFNlcnZpY2UuYmlvbWV0cmljTG9ja2VkKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLnJlc3BvbnNlID09PSAndW5sb2NrZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuY3J5cHRvU2VydmljZS5zZXRLZXkobmV3IFN5bW1ldHJpY0NyeXB0b0tleShVdGlscy5mcm9tQjY0VG9BcnJheShtZXNzYWdlLmtleUI2NCkuYnVmZmVyKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gVmVyaWZ5IGtleSBpcyBjb3JyZWN0IGJ5IGF0dGVtcHRpbmcgdG8gZGVjcnlwdCBhIHNlY3JldFxuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jcnlwdG9TZXJ2aWNlLmdldEZpbmdlcnByaW50KGF3YWl0IHRoaXMudXNlclNlcnZpY2UuZ2V0VXNlcklkKCkpO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1VuYWJsZSB0byB2ZXJpZnkga2V5OicsIGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jcnlwdG9TZXJ2aWNlLmNsZWFyS2V5KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNob3dXcm9uZ1VzZXJEaWFsb2coKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB0aGlzLnZhdWx0VGltZW91dFNlcnZpY2UuYmlvbWV0cmljTG9ja2VkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucnVudGltZUJhY2tncm91bmQucHJvY2Vzc01lc3NhZ2Uoe2NvbW1hbmQ6ICd1bmxvY2tlZCd9LCBudWxsLCBudWxsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZVxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ05hdGl2ZU1lc3NhZ2UsIGdvdCB1bmtub3duIGNvbW1hbmQ6ICcsIG1lc3NhZ2UuY29tbWFuZCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5yZXNvbHZlcikge1xuICAgICAgICAgICAgdGhpcy5yZXNvbHZlcihtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgc2VjdXJlQ29tbXVuaWNhdGlvbigpIHtcbiAgICAgICAgY29uc3QgW3B1YmxpY0tleSwgcHJpdmF0ZUtleV0gPSBhd2FpdCB0aGlzLmNyeXB0b0Z1bmN0aW9uU2VydmljZS5yc2FHZW5lcmF0ZUtleVBhaXIoMjA0OCk7XG4gICAgICAgIHRoaXMucHVibGljS2V5ID0gcHVibGljS2V5O1xuICAgICAgICB0aGlzLnByaXZhdGVLZXkgPSBwcml2YXRlS2V5O1xuXG4gICAgICAgIHRoaXMuc2VuZFVuZW5jcnlwdGVkKHtcbiAgICAgICAgICAgIGNvbW1hbmQ6ICdzZXR1cEVuY3J5cHRpb24nLFxuICAgICAgICAgICAgcHVibGljS2V5OiBVdGlscy5mcm9tQnVmZmVyVG9CNjQocHVibGljS2V5KSxcbiAgICAgICAgICAgIHVzZXJJZDogYXdhaXQgdGhpcy51c2VyU2VydmljZS5nZXRVc2VySWQoKSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHRoaXMuc2VjdXJlU2V0dXBSZXNvbHZlID0gcmVzb2x2ZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBzZW5kVW5lbmNyeXB0ZWQobWVzc2FnZTogYW55KSB7XG4gICAgICAgIGlmICghdGhpcy5jb25uZWN0ZWQpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY29ubmVjdCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgbWVzc2FnZS50aW1lc3RhbXAgPSBEYXRlLm5vdygpO1xuXG4gICAgICAgIHRoaXMucG9zdE1lc3NhZ2Uoe2FwcElkOiB0aGlzLmFwcElkLCBtZXNzYWdlOiBtZXNzYWdlfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBzaG93RmluZ2VycHJpbnREaWFsb2coKSB7XG4gICAgICAgIGNvbnN0IGZpbmdlcnByaW50ID0gKGF3YWl0IHRoaXMuY3J5cHRvU2VydmljZS5nZXRGaW5nZXJwcmludChhd2FpdCB0aGlzLnVzZXJTZXJ2aWNlLmdldFVzZXJJZCgpLCB0aGlzLnB1YmxpY0tleSkpLmpvaW4oJyAnKTtcblxuICAgICAgICB0aGlzLm1lc3NhZ2luZ1NlcnZpY2Uuc2VuZCgnc2hvd0RpYWxvZycsIHtcbiAgICAgICAgICAgIGh0bWw6IGAke3RoaXMuaTE4blNlcnZpY2UudCgnZGVza3RvcEludGVncmF0aW9uVmVyaWZpY2F0aW9uVGV4dCcpfTxicj48YnI+PHN0cm9uZz4ke2ZpbmdlcnByaW50fTwvc3Ryb25nPmAsXG4gICAgICAgICAgICB0aXRsZTogdGhpcy5pMThuU2VydmljZS50KCdkZXNrdG9wU3luY1ZlcmlmaWNhdGlvblRpdGxlJyksXG4gICAgICAgICAgICBjb25maXJtVGV4dDogdGhpcy5pMThuU2VydmljZS50KCdvaycpLFxuICAgICAgICAgICAgdHlwZTogJ3dhcm5pbmcnLFxuICAgICAgICB9KTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBDaXBoZXJUeXBlIH0gZnJvbSAnanNsaWItY29tbW9uL2VudW1zL2NpcGhlclR5cGUnO1xuXG5pbXBvcnQgeyBDaXBoZXJWaWV3IH0gZnJvbSAnanNsaWItY29tbW9uL21vZGVscy92aWV3L2NpcGhlclZpZXcnO1xuaW1wb3J0IHsgTG9naW5VcmlWaWV3IH0gZnJvbSAnanNsaWItY29tbW9uL21vZGVscy92aWV3L2xvZ2luVXJpVmlldyc7XG5pbXBvcnQgeyBMb2dpblZpZXcgfSBmcm9tICdqc2xpYi1jb21tb24vbW9kZWxzL3ZpZXcvbG9naW5WaWV3JztcblxuaW1wb3J0IHsgQ2lwaGVyU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvY2lwaGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgRm9sZGVyU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvZm9sZGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgUG9saWN5U2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvcG9saWN5LnNlcnZpY2UnO1xuaW1wb3J0IHsgU3RvcmFnZVNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL3N0b3JhZ2Uuc2VydmljZSc7XG5pbXBvcnQgeyBWYXVsdFRpbWVvdXRTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy92YXVsdFRpbWVvdXQuc2VydmljZSc7XG5pbXBvcnQgeyBDb25zdGFudHNTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL3NlcnZpY2VzL2NvbnN0YW50cy5zZXJ2aWNlJztcbmltcG9ydCB7IEF1dG9maWxsU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2Fic3RyYWN0aW9ucy9hdXRvZmlsbC5zZXJ2aWNlJztcblxuaW1wb3J0IHsgQnJvd3NlckFwaSB9IGZyb20gJy4uL2Jyb3dzZXIvYnJvd3NlckFwaSc7XG5cbmltcG9ydCBNYWluQmFja2dyb3VuZCBmcm9tICcuL21haW4uYmFja2dyb3VuZCc7XG5cbmltcG9ydCB7IFV0aWxzIH0gZnJvbSAnanNsaWItY29tbW9uL21pc2MvdXRpbHMnO1xuXG5pbXBvcnQgeyBQb2xpY3lUeXBlIH0gZnJvbSAnanNsaWItY29tbW9uL2VudW1zL3BvbGljeVR5cGUnO1xuXG5pbXBvcnQgQWRkQ2hhbmdlUGFzc3dvcmRRdWV1ZU1lc3NhZ2UgZnJvbSAnLi9tb2RlbHMvYWRkQ2hhbmdlUGFzc3dvcmRRdWV1ZU1lc3NhZ2UnO1xuaW1wb3J0IEFkZExvZ2luUXVldWVNZXNzYWdlIGZyb20gJy4vbW9kZWxzL2FkZExvZ2luUXVldWVNZXNzYWdlJztcbmltcG9ydCBBZGRMb2dpblJ1bnRpbWVNZXNzYWdlIGZyb20gJy4vbW9kZWxzL2FkZExvZ2luUnVudGltZU1lc3NhZ2UnO1xuaW1wb3J0IENoYW5nZVBhc3N3b3JkUnVudGltZU1lc3NhZ2UgZnJvbSAnLi9tb2RlbHMvY2hhbmdlUGFzc3dvcmRSdW50aW1lTWVzc2FnZSc7XG5pbXBvcnQgTG9ja2VkVmF1bHRQZW5kaW5nTm90aWZpY2F0aW9uc0l0ZW0gZnJvbSAnLi9tb2RlbHMvbG9ja2VkVmF1bHRQZW5kaW5nTm90aWZpY2F0aW9uc0l0ZW0nO1xuaW1wb3J0IHsgTm90aWZpY2F0aW9uUXVldWVNZXNzYWdlVHlwZSB9IGZyb20gJy4vbW9kZWxzL25vdGlmaWNhdGlvblF1ZXVlTWVzc2FnZVR5cGUnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBOb3RpZmljYXRpb25CYWNrZ3JvdW5kIHtcblxuICAgIHByaXZhdGUgbm90aWZpY2F0aW9uUXVldWU6IChBZGRMb2dpblF1ZXVlTWVzc2FnZSB8IEFkZENoYW5nZVBhc3N3b3JkUXVldWVNZXNzYWdlKVtdID0gW107XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIG1haW46IE1haW5CYWNrZ3JvdW5kLCBwcml2YXRlIGF1dG9maWxsU2VydmljZTogQXV0b2ZpbGxTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGNpcGhlclNlcnZpY2U6IENpcGhlclNlcnZpY2UsIHByaXZhdGUgc3RvcmFnZVNlcnZpY2U6IFN0b3JhZ2VTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHZhdWx0VGltZW91dFNlcnZpY2U6IFZhdWx0VGltZW91dFNlcnZpY2UsIHByaXZhdGUgcG9saWN5U2VydmljZTogUG9saWN5U2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBmb2xkZXJTZXJ2aWNlOiBGb2xkZXJTZXJ2aWNlKSB7XG4gICAgfVxuXG4gICAgYXN5bmMgaW5pdCgpIHtcbiAgICAgICAgaWYgKGNocm9tZS5ydW50aW1lID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIEJyb3dzZXJBcGkubWVzc2FnZUxpc3RlbmVyKCdub3RpZmljYXRpb24uYmFja2dyb3VuZCcsIGFzeW5jIChtc2c6IGFueSwgc2VuZGVyOiBjaHJvbWUucnVudGltZS5NZXNzYWdlU2VuZGVyKSA9PiB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnByb2Nlc3NNZXNzYWdlKG1zZywgc2VuZGVyKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5jbGVhbnVwTm90aWZpY2F0aW9uUXVldWUoKTtcbiAgICB9XG5cbiAgICBhc3luYyBwcm9jZXNzTWVzc2FnZShtc2c6IGFueSwgc2VuZGVyOiBjaHJvbWUucnVudGltZS5NZXNzYWdlU2VuZGVyKSB7XG4gICAgICAgIHN3aXRjaCAobXNnLmNvbW1hbmQpIHtcbiAgICAgICAgICAgIGNhc2UgJ3VubG9ja0NvbXBsZXRlZCc6XG4gICAgICAgICAgICAgICAgaWYgKG1zZy5kYXRhLnRhcmdldCAhPT0gJ25vdGlmaWNhdGlvbi5iYWNrZ3JvdW5kJykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucHJvY2Vzc01lc3NhZ2UobXNnLmRhdGEuY29tbWFuZFRvUmV0cnkubXNnLCBtc2cuZGF0YS5jb21tYW5kVG9SZXRyeS5zZW5kZXIpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnYmdHZXREYXRhRm9yVGFiJzpcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmdldERhdGFGb3JUYWIoc2VuZGVyLnRhYiwgbXNnLnJlc3BvbnNlQ29tbWFuZCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdiZ0Nsb3NlTm90aWZpY2F0aW9uQmFyJzpcbiAgICAgICAgICAgICAgICBhd2FpdCBCcm93c2VyQXBpLnRhYlNlbmRNZXNzYWdlRGF0YShzZW5kZXIudGFiLCAnY2xvc2VOb3RpZmljYXRpb25CYXInKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2JnQWRqdXN0Tm90aWZpY2F0aW9uQmFyJzpcbiAgICAgICAgICAgICAgICBhd2FpdCBCcm93c2VyQXBpLnRhYlNlbmRNZXNzYWdlRGF0YShzZW5kZXIudGFiLCAnYWRqdXN0Tm90aWZpY2F0aW9uQmFyJywgbXNnLmRhdGEpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnYmdBZGRMb2dpbic6XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5hZGRMb2dpbihtc2cubG9naW4sIHNlbmRlci50YWIpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnYmdDaGFuZ2VkUGFzc3dvcmQnOlxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuY2hhbmdlZFBhc3N3b3JkKG1zZy5kYXRhLCBzZW5kZXIudGFiKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2JnQWRkQ2xvc2UnOlxuICAgICAgICAgICAgY2FzZSAnYmdDaGFuZ2VDbG9zZSc6XG4gICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVUYWJGcm9tTm90aWZpY2F0aW9uUXVldWUoc2VuZGVyLnRhYik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdiZ0FkZFNhdmUnOlxuICAgICAgICAgICAgY2FzZSAnYmdDaGFuZ2VTYXZlJzpcbiAgICAgICAgICAgICAgICBpZiAoYXdhaXQgdGhpcy52YXVsdFRpbWVvdXRTZXJ2aWNlLmlzTG9ja2VkKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmV0cnlNZXNzYWdlOiBMb2NrZWRWYXVsdFBlbmRpbmdOb3RpZmljYXRpb25zSXRlbSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRUb1JldHJ5OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnOiBtc2csXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZGVyOiBzZW5kZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiAnbm90aWZpY2F0aW9uLmJhY2tncm91bmQnLFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBCcm93c2VyQXBpLnRhYlNlbmRNZXNzYWdlRGF0YShzZW5kZXIudGFiLCAnYWRkVG9Mb2NrZWRWYXVsdFBlbmRpbmdOb3RpZmljYXRpb25zJywgcmV0cnlNZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgQnJvd3NlckFwaS50YWJTZW5kTWVzc2FnZURhdGEoc2VuZGVyLnRhYiwgJ3Byb21wdEZvckxvZ2luJyk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zYXZlT3JVcGRhdGVDcmVkZW50aWFscyhzZW5kZXIudGFiLCBtc2cuZm9sZGVyKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2JnTmV2ZXJTYXZlJzpcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnNhdmVOZXZlcihzZW5kZXIudGFiKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2NvbGxlY3RQYWdlRGV0YWlsc1Jlc3BvbnNlJzpcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZy5zZW5kZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnbm90aWZpY2F0aW9uQmFyJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZvcm1zID0gdGhpcy5hdXRvZmlsbFNlcnZpY2UuZ2V0Rm9ybXNXaXRoUGFzc3dvcmRGaWVsZHMobXNnLmRldGFpbHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgQnJvd3NlckFwaS50YWJTZW5kTWVzc2FnZURhdGEobXNnLnRhYiwgJ25vdGlmaWNhdGlvbkJhclBhZ2VEZXRhaWxzJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbHM6IG1zZy5kZXRhaWxzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1zOiBmb3JtcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgY2hlY2tOb3RpZmljYXRpb25RdWV1ZSh0YWI6IGNocm9tZS50YWJzLlRhYiA9IG51bGwpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMubm90aWZpY2F0aW9uUXVldWUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGFiICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuZG9Ob3RpZmljYXRpb25RdWV1ZUNoZWNrKHRhYik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjdXJyZW50VGFiID0gYXdhaXQgQnJvd3NlckFwaS5nZXRUYWJGcm9tQ3VycmVudFdpbmRvdygpO1xuICAgICAgICBpZiAoY3VycmVudFRhYiAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmRvTm90aWZpY2F0aW9uUXVldWVDaGVjayhjdXJyZW50VGFiKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgY2xlYW51cE5vdGlmaWNhdGlvblF1ZXVlKCkge1xuICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5ub3RpZmljYXRpb25RdWV1ZS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgaWYgKHRoaXMubm90aWZpY2F0aW9uUXVldWVbaV0uZXhwaXJlcyA8IG5ldyBEYXRlKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvblF1ZXVlLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuY2xlYW51cE5vdGlmaWNhdGlvblF1ZXVlKCksIDIgKiA2MCAqIDEwMDApOyAvLyBjaGVjayBldmVyeSAyIG1pbnV0ZXNcbiAgICB9XG5cbiAgICBwcml2YXRlIGRvTm90aWZpY2F0aW9uUXVldWVDaGVjayh0YWI6IGNocm9tZS50YWJzLlRhYik6IHZvaWQge1xuICAgICAgICBpZiAodGFiID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRhYkRvbWFpbiA9IFV0aWxzLmdldERvbWFpbih0YWIudXJsKTtcbiAgICAgICAgaWYgKHRhYkRvbWFpbiA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubm90aWZpY2F0aW9uUXVldWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm5vdGlmaWNhdGlvblF1ZXVlW2ldLnRhYklkICE9PSB0YWIuaWQgfHwgdGhpcy5ub3RpZmljYXRpb25RdWV1ZVtpXS5kb21haW4gIT09IHRhYkRvbWFpbikge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5ub3RpZmljYXRpb25RdWV1ZVtpXS50eXBlID09PSBOb3RpZmljYXRpb25RdWV1ZU1lc3NhZ2VUeXBlLmFkZExvZ2luKSB7XG4gICAgICAgICAgICAgICAgQnJvd3NlckFwaS50YWJTZW5kTWVzc2FnZURhdGEodGFiLCAnb3Blbk5vdGlmaWNhdGlvbkJhcicsIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2FkZCcsXG4gICAgICAgICAgICAgICAgICAgIHR5cGVEYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpc1ZhdWx0TG9ja2VkOiB0aGlzLm5vdGlmaWNhdGlvblF1ZXVlW2ldLndhc1ZhdWx0TG9ja2VkLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLm5vdGlmaWNhdGlvblF1ZXVlW2ldLnR5cGUgPT09IE5vdGlmaWNhdGlvblF1ZXVlTWVzc2FnZVR5cGUuY2hhbmdlUGFzc3dvcmQpIHtcbiAgICAgICAgICAgICAgICBCcm93c2VyQXBpLnRhYlNlbmRNZXNzYWdlRGF0YSh0YWIsICdvcGVuTm90aWZpY2F0aW9uQmFyJywge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnY2hhbmdlJyxcbiAgICAgICAgICAgICAgICAgICAgdHlwZURhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzVmF1bHRMb2NrZWQ6IHRoaXMubm90aWZpY2F0aW9uUXVldWVbaV0ud2FzVmF1bHRMb2NrZWQsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgcmVtb3ZlVGFiRnJvbU5vdGlmaWNhdGlvblF1ZXVlKHRhYjogY2hyb21lLnRhYnMuVGFiKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSB0aGlzLm5vdGlmaWNhdGlvblF1ZXVlLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5ub3RpZmljYXRpb25RdWV1ZVtpXS50YWJJZCA9PT0gdGFiLmlkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25RdWV1ZS5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGFkZExvZ2luKGxvZ2luSW5mbzogQWRkTG9naW5SdW50aW1lTWVzc2FnZSwgdGFiOiBjaHJvbWUudGFicy5UYWIpIHtcbiAgICAgICAgY29uc3QgbG9naW5Eb21haW4gPSBVdGlscy5nZXREb21haW4obG9naW5JbmZvLnVybCk7XG4gICAgICAgIGlmIChsb2dpbkRvbWFpbiA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbm9ybWFsaXplZFVzZXJuYW1lID0gbG9naW5JbmZvLnVzZXJuYW1lO1xuICAgICAgICBpZiAobm9ybWFsaXplZFVzZXJuYW1lICE9IG51bGwpIHtcbiAgICAgICAgICAgIG5vcm1hbGl6ZWRVc2VybmFtZSA9IG5vcm1hbGl6ZWRVc2VybmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGF3YWl0IHRoaXMudmF1bHRUaW1lb3V0U2VydmljZS5pc0xvY2tlZCgpKSB7XG4gICAgICAgICAgICBpZiAoIWF3YWl0IHRoaXMuYWxsb3dQZXJzb25hbE93bmVyc2hpcCgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnB1c2hBZGRMb2dpblRvUXVldWUobG9naW5Eb21haW4sIGxvZ2luSW5mbywgdGFiLCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNpcGhlcnMgPSBhd2FpdCB0aGlzLmNpcGhlclNlcnZpY2UuZ2V0QWxsRGVjcnlwdGVkRm9yVXJsKGxvZ2luSW5mby51cmwpO1xuICAgICAgICBjb25zdCB1c2VybmFtZU1hdGNoZXMgPSBjaXBoZXJzLmZpbHRlcihjID0+XG4gICAgICAgICAgICBjLmxvZ2luLnVzZXJuYW1lICE9IG51bGwgJiYgYy5sb2dpbi51c2VybmFtZS50b0xvd2VyQ2FzZSgpID09PSBub3JtYWxpemVkVXNlcm5hbWUpO1xuICAgICAgICBpZiAodXNlcm5hbWVNYXRjaGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgY29uc3QgZGlzYWJsZWRBZGRMb2dpbiA9IGF3YWl0IHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0PGJvb2xlYW4+KFxuICAgICAgICAgICAgICAgIENvbnN0YW50c1NlcnZpY2UuZGlzYWJsZUFkZExvZ2luTm90aWZpY2F0aW9uS2V5KTtcbiAgICAgICAgICAgIGlmIChkaXNhYmxlZEFkZExvZ2luKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIWF3YWl0IHRoaXMuYWxsb3dQZXJzb25hbE93bmVyc2hpcCgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnB1c2hBZGRMb2dpblRvUXVldWUobG9naW5Eb21haW4sIGxvZ2luSW5mbywgdGFiKTtcblxuICAgICAgICB9IGVsc2UgaWYgKHVzZXJuYW1lTWF0Y2hlcy5sZW5ndGggPT09IDEgJiYgdXNlcm5hbWVNYXRjaGVzWzBdLmxvZ2luLnBhc3N3b3JkICE9PSBsb2dpbkluZm8ucGFzc3dvcmQpIHtcbiAgICAgICAgICAgIGNvbnN0IGRpc2FibGVkQ2hhbmdlUGFzc3dvcmQgPSBhd2FpdCB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldDxib29sZWFuPihcbiAgICAgICAgICAgICAgICBDb25zdGFudHNTZXJ2aWNlLmRpc2FibGVDaGFuZ2VkUGFzc3dvcmROb3RpZmljYXRpb25LZXkpO1xuICAgICAgICAgICAgaWYgKGRpc2FibGVkQ2hhbmdlUGFzc3dvcmQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnB1c2hDaGFuZ2VQYXNzd29yZFRvUXVldWUodXNlcm5hbWVNYXRjaGVzWzBdLmlkLCBsb2dpbkRvbWFpbiwgbG9naW5JbmZvLnBhc3N3b3JkLCB0YWIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBwdXNoQWRkTG9naW5Ub1F1ZXVlKGxvZ2luRG9tYWluOiBzdHJpbmcsIGxvZ2luSW5mbzogQWRkTG9naW5SdW50aW1lTWVzc2FnZSwgdGFiOiBjaHJvbWUudGFicy5UYWIsIGlzVmF1bHRMb2NrZWQ6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgICAgICAvLyByZW1vdmUgYW55IG9sZCBtZXNzYWdlcyBmb3IgdGhpcyB0YWJcbiAgICAgICAgdGhpcy5yZW1vdmVUYWJGcm9tTm90aWZpY2F0aW9uUXVldWUodGFiKTtcbiAgICAgICAgY29uc3QgbWVzc2FnZTogQWRkTG9naW5RdWV1ZU1lc3NhZ2UgPSB7XG4gICAgICAgICAgICB0eXBlOiBOb3RpZmljYXRpb25RdWV1ZU1lc3NhZ2VUeXBlLmFkZExvZ2luLFxuICAgICAgICAgICAgdXNlcm5hbWU6IGxvZ2luSW5mby51c2VybmFtZSxcbiAgICAgICAgICAgIHBhc3N3b3JkOiBsb2dpbkluZm8ucGFzc3dvcmQsXG4gICAgICAgICAgICBkb21haW46IGxvZ2luRG9tYWluLFxuICAgICAgICAgICAgdXJpOiBsb2dpbkluZm8udXJsLFxuICAgICAgICAgICAgdGFiSWQ6IHRhYi5pZCxcbiAgICAgICAgICAgIGV4cGlyZXM6IG5ldyBEYXRlKChuZXcgRGF0ZSgpKS5nZXRUaW1lKCkgKyA1ICogNjAwMDApLCAvLyA1IG1pbnV0ZXNcbiAgICAgICAgICAgIHdhc1ZhdWx0TG9ja2VkOiBpc1ZhdWx0TG9ja2VkLFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLm5vdGlmaWNhdGlvblF1ZXVlLnB1c2gobWVzc2FnZSk7XG4gICAgICAgIGF3YWl0IHRoaXMuY2hlY2tOb3RpZmljYXRpb25RdWV1ZSh0YWIpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgY2hhbmdlZFBhc3N3b3JkKGNoYW5nZURhdGE6IENoYW5nZVBhc3N3b3JkUnVudGltZU1lc3NhZ2UsIHRhYjogY2hyb21lLnRhYnMuVGFiKSB7XG4gICAgICAgIGNvbnN0IGxvZ2luRG9tYWluID0gVXRpbHMuZ2V0RG9tYWluKGNoYW5nZURhdGEudXJsKTtcbiAgICAgICAgaWYgKGxvZ2luRG9tYWluID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhd2FpdCB0aGlzLnZhdWx0VGltZW91dFNlcnZpY2UuaXNMb2NrZWQoKSkge1xuICAgICAgICAgICAgdGhpcy5wdXNoQ2hhbmdlUGFzc3dvcmRUb1F1ZXVlKG51bGwsIGxvZ2luRG9tYWluLCBjaGFuZ2VEYXRhLm5ld1Bhc3N3b3JkLCB0YWIsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGlkOiBzdHJpbmcgPSBudWxsO1xuICAgICAgICBjb25zdCBjaXBoZXJzID0gYXdhaXQgdGhpcy5jaXBoZXJTZXJ2aWNlLmdldEFsbERlY3J5cHRlZEZvclVybChjaGFuZ2VEYXRhLnVybCk7XG4gICAgICAgIGlmIChjaGFuZ2VEYXRhLmN1cnJlbnRQYXNzd29yZCAhPSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBwYXNzd29yZE1hdGNoZXMgPSBjaXBoZXJzLmZpbHRlcihjID0+IGMubG9naW4ucGFzc3dvcmQgPT09IGNoYW5nZURhdGEuY3VycmVudFBhc3N3b3JkKTtcbiAgICAgICAgICAgIGlmIChwYXNzd29yZE1hdGNoZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgaWQgPSBwYXNzd29yZE1hdGNoZXNbMF0uaWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoY2lwaGVycy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIGlkID0gY2lwaGVyc1swXS5pZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaWQgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5wdXNoQ2hhbmdlUGFzc3dvcmRUb1F1ZXVlKGlkLCBsb2dpbkRvbWFpbiwgY2hhbmdlRGF0YS5uZXdQYXNzd29yZCwgdGFiKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgcHVzaENoYW5nZVBhc3N3b3JkVG9RdWV1ZShjaXBoZXJJZDogc3RyaW5nLCBsb2dpbkRvbWFpbjogc3RyaW5nLCBuZXdQYXNzd29yZDogc3RyaW5nLCB0YWI6IGNocm9tZS50YWJzLlRhYiwgaXNWYXVsdExvY2tlZDogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgICAgIC8vIHJlbW92ZSBhbnkgb2xkIG1lc3NhZ2VzIGZvciB0aGlzIHRhYlxuICAgICAgICB0aGlzLnJlbW92ZVRhYkZyb21Ob3RpZmljYXRpb25RdWV1ZSh0YWIpO1xuICAgICAgICBjb25zdCBtZXNzYWdlOiBBZGRDaGFuZ2VQYXNzd29yZFF1ZXVlTWVzc2FnZSA9IHtcbiAgICAgICAgICAgIHR5cGU6IE5vdGlmaWNhdGlvblF1ZXVlTWVzc2FnZVR5cGUuY2hhbmdlUGFzc3dvcmQsXG4gICAgICAgICAgICBjaXBoZXJJZDogY2lwaGVySWQsXG4gICAgICAgICAgICBuZXdQYXNzd29yZDogbmV3UGFzc3dvcmQsXG4gICAgICAgICAgICBkb21haW46IGxvZ2luRG9tYWluLFxuICAgICAgICAgICAgdGFiSWQ6IHRhYi5pZCxcbiAgICAgICAgICAgIGV4cGlyZXM6IG5ldyBEYXRlKChuZXcgRGF0ZSgpKS5nZXRUaW1lKCkgKyA1ICogNjAwMDApLCAvLyA1IG1pbnV0ZXNcbiAgICAgICAgICAgIHdhc1ZhdWx0TG9ja2VkOiBpc1ZhdWx0TG9ja2VkLFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLm5vdGlmaWNhdGlvblF1ZXVlLnB1c2gobWVzc2FnZSk7XG4gICAgICAgIGF3YWl0IHRoaXMuY2hlY2tOb3RpZmljYXRpb25RdWV1ZSh0YWIpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgc2F2ZU9yVXBkYXRlQ3JlZGVudGlhbHModGFiOiBjaHJvbWUudGFicy5UYWIsIGZvbGRlcklkPzogc3RyaW5nKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSB0aGlzLm5vdGlmaWNhdGlvblF1ZXVlLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICBjb25zdCBxdWV1ZU1lc3NhZ2UgPSB0aGlzLm5vdGlmaWNhdGlvblF1ZXVlW2ldO1xuICAgICAgICAgICAgaWYgKHF1ZXVlTWVzc2FnZS50YWJJZCAhPT0gdGFiLmlkIHx8XG4gICAgICAgICAgICAgICAgKHF1ZXVlTWVzc2FnZS50eXBlICE9PSBOb3RpZmljYXRpb25RdWV1ZU1lc3NhZ2VUeXBlLmFkZExvZ2luICYmIHF1ZXVlTWVzc2FnZS50eXBlICE9PSBOb3RpZmljYXRpb25RdWV1ZU1lc3NhZ2VUeXBlLmNoYW5nZVBhc3N3b3JkKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCB0YWJEb21haW4gPSBVdGlscy5nZXREb21haW4odGFiLnVybCk7XG4gICAgICAgICAgICBpZiAodGFiRG9tYWluICE9IG51bGwgJiYgdGFiRG9tYWluICE9PSBxdWV1ZU1lc3NhZ2UuZG9tYWluKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMubm90aWZpY2F0aW9uUXVldWUuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgQnJvd3NlckFwaS50YWJTZW5kTWVzc2FnZURhdGEodGFiLCAnY2xvc2VOb3RpZmljYXRpb25CYXInKTtcblxuICAgICAgICAgICAgaWYgKHF1ZXVlTWVzc2FnZS50eXBlID09PSBOb3RpZmljYXRpb25RdWV1ZU1lc3NhZ2VUeXBlLmNoYW5nZVBhc3N3b3JkKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IChxdWV1ZU1lc3NhZ2UgYXMgQWRkQ2hhbmdlUGFzc3dvcmRRdWV1ZU1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNpcGhlciA9IGF3YWl0IHRoaXMuZ2V0RGVjcnlwdGVkQ2lwaGVyQnlJZChtZXNzYWdlLmNpcGhlcklkKTtcbiAgICAgICAgICAgICAgICBpZiAoY2lwaGVyID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnVwZGF0ZUNpcGhlcihjaXBoZXIsIG1lc3NhZ2UubmV3UGFzc3dvcmQpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFxdWV1ZU1lc3NhZ2Uud2FzVmF1bHRMb2NrZWQpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNyZWF0ZU5ld0NpcGhlcihxdWV1ZU1lc3NhZ2UgYXMgQWRkTG9naW5RdWV1ZU1lc3NhZ2UsIGZvbGRlcklkKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSWYgdGhlIHZhdWx0IHdhcyBsb2NrZWQsIGNoZWNrIGlmIGEgY2lwaGVyIG5lZWRzIHVwZGF0aW5nIGluc3RlYWQgb2YgY3JlYXRpbmcgYSBuZXcgb25lXG4gICAgICAgICAgICBpZiAocXVldWVNZXNzYWdlLnR5cGUgPT09IE5vdGlmaWNhdGlvblF1ZXVlTWVzc2FnZVR5cGUuYWRkTG9naW4gJiYgcXVldWVNZXNzYWdlLndhc1ZhdWx0TG9ja2VkID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IChxdWV1ZU1lc3NhZ2UgYXMgQWRkTG9naW5RdWV1ZU1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNpcGhlcnMgPSBhd2FpdCB0aGlzLmNpcGhlclNlcnZpY2UuZ2V0QWxsRGVjcnlwdGVkRm9yVXJsKG1lc3NhZ2UudXJpKTtcbiAgICAgICAgICAgICAgICBjb25zdCB1c2VybmFtZU1hdGNoZXMgPSBjaXBoZXJzLmZpbHRlcihjID0+IGMubG9naW4udXNlcm5hbWUgIT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgICAgICBjLmxvZ2luLnVzZXJuYW1lLnRvTG93ZXJDYXNlKCkgPT09IG1lc3NhZ2UudXNlcm5hbWUpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHVzZXJuYW1lTWF0Y2hlcy5sZW5ndGggPj0gMSkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnVwZGF0ZUNpcGhlcih1c2VybmFtZU1hdGNoZXNbMF0sIG1lc3NhZ2UucGFzc3dvcmQpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jcmVhdGVOZXdDaXBoZXIobWVzc2FnZSwgZm9sZGVySWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBjcmVhdGVOZXdDaXBoZXIocXVldWVNZXNzYWdlOiBBZGRMb2dpblF1ZXVlTWVzc2FnZSwgZm9sZGVySWQ6IHN0cmluZykge1xuICAgICAgICBjb25zdCBsb2dpbk1vZGVsID0gbmV3IExvZ2luVmlldygpO1xuICAgICAgICBjb25zdCBsb2dpblVyaSA9IG5ldyBMb2dpblVyaVZpZXcoKTtcbiAgICAgICAgbG9naW5VcmkudXJpID0gcXVldWVNZXNzYWdlLnVyaTtcbiAgICAgICAgbG9naW5Nb2RlbC51cmlzID0gW2xvZ2luVXJpXTtcbiAgICAgICAgbG9naW5Nb2RlbC51c2VybmFtZSA9IHF1ZXVlTWVzc2FnZS51c2VybmFtZTtcbiAgICAgICAgbG9naW5Nb2RlbC5wYXNzd29yZCA9IHF1ZXVlTWVzc2FnZS5wYXNzd29yZDtcbiAgICAgICAgY29uc3QgbW9kZWwgPSBuZXcgQ2lwaGVyVmlldygpO1xuICAgICAgICBtb2RlbC5uYW1lID0gVXRpbHMuZ2V0SG9zdG5hbWUocXVldWVNZXNzYWdlLnVyaSkgfHwgcXVldWVNZXNzYWdlLmRvbWFpbjtcbiAgICAgICAgbW9kZWwubmFtZSA9IG1vZGVsLm5hbWUucmVwbGFjZSgvXnd3d1xcLi8sICcnKTtcbiAgICAgICAgbW9kZWwudHlwZSA9IENpcGhlclR5cGUuTG9naW47XG4gICAgICAgIG1vZGVsLmxvZ2luID0gbG9naW5Nb2RlbDtcblxuICAgICAgICBpZiAoIVV0aWxzLmlzTnVsbE9yV2hpdGVzcGFjZShmb2xkZXJJZCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGZvbGRlcnMgPSBhd2FpdCB0aGlzLmZvbGRlclNlcnZpY2UuZ2V0QWxsRGVjcnlwdGVkKCk7XG4gICAgICAgICAgICBpZiAoZm9sZGVycy5zb21lKHggPT4geC5pZCA9PT0gZm9sZGVySWQpKSB7XG4gICAgICAgICAgICAgICAgbW9kZWwuZm9sZGVySWQgPSBmb2xkZXJJZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNpcGhlciA9IGF3YWl0IHRoaXMuY2lwaGVyU2VydmljZS5lbmNyeXB0KG1vZGVsKTtcbiAgICAgICAgYXdhaXQgdGhpcy5jaXBoZXJTZXJ2aWNlLnNhdmVXaXRoU2VydmVyKGNpcGhlcik7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBnZXREZWNyeXB0ZWRDaXBoZXJCeUlkKGNpcGhlcklkOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgY2lwaGVyID0gYXdhaXQgdGhpcy5jaXBoZXJTZXJ2aWNlLmdldChjaXBoZXJJZCk7XG4gICAgICAgIGlmIChjaXBoZXIgIT0gbnVsbCAmJiBjaXBoZXIudHlwZSA9PT0gQ2lwaGVyVHlwZS5Mb2dpbikge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGNpcGhlci5kZWNyeXB0KCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyB1cGRhdGVDaXBoZXIoY2lwaGVyOiBDaXBoZXJWaWV3LCBuZXdQYXNzd29yZDogc3RyaW5nKSB7XG4gICAgICAgIGlmIChjaXBoZXIgIT0gbnVsbCAmJiBjaXBoZXIudHlwZSA9PT0gQ2lwaGVyVHlwZS5Mb2dpbikge1xuICAgICAgICAgICAgY2lwaGVyLmxvZ2luLnBhc3N3b3JkID0gbmV3UGFzc3dvcmQ7XG4gICAgICAgICAgICBjb25zdCBuZXdDaXBoZXIgPSBhd2FpdCB0aGlzLmNpcGhlclNlcnZpY2UuZW5jcnlwdChjaXBoZXIpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5jaXBoZXJTZXJ2aWNlLnNhdmVXaXRoU2VydmVyKG5ld0NpcGhlcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHNhdmVOZXZlcih0YWI6IGNocm9tZS50YWJzLlRhYikge1xuICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5ub3RpZmljYXRpb25RdWV1ZS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgY29uc3QgcXVldWVNZXNzYWdlID0gdGhpcy5ub3RpZmljYXRpb25RdWV1ZVtpXTtcbiAgICAgICAgICAgIGlmIChxdWV1ZU1lc3NhZ2UudGFiSWQgIT09IHRhYi5pZCB8fCBxdWV1ZU1lc3NhZ2UudHlwZSAhPT0gTm90aWZpY2F0aW9uUXVldWVNZXNzYWdlVHlwZS5hZGRMb2dpbikge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCB0YWJEb21haW4gPSBVdGlscy5nZXREb21haW4odGFiLnVybCk7XG4gICAgICAgICAgICBpZiAodGFiRG9tYWluICE9IG51bGwgJiYgdGFiRG9tYWluICE9PSBxdWV1ZU1lc3NhZ2UuZG9tYWluKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMubm90aWZpY2F0aW9uUXVldWUuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgQnJvd3NlckFwaS50YWJTZW5kTWVzc2FnZURhdGEodGFiLCAnY2xvc2VOb3RpZmljYXRpb25CYXInKTtcblxuICAgICAgICAgICAgY29uc3QgaG9zdG5hbWUgPSBVdGlscy5nZXRIb3N0bmFtZSh0YWIudXJsKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY2lwaGVyU2VydmljZS5zYXZlTmV2ZXJEb21haW4oaG9zdG5hbWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBnZXREYXRhRm9yVGFiKHRhYjogY2hyb21lLnRhYnMuVGFiLCByZXNwb25zZUNvbW1hbmQ6IHN0cmluZykge1xuICAgICAgICBjb25zdCByZXNwb25zZURhdGE6IGFueSA9IHt9O1xuICAgICAgICBpZiAocmVzcG9uc2VDb21tYW5kID09PSAnbm90aWZpY2F0aW9uQmFyR2V0Rm9sZGVyc0xpc3QnKSB7XG4gICAgICAgICAgICByZXNwb25zZURhdGEuZm9sZGVycyA9IGF3YWl0IHRoaXMuZm9sZGVyU2VydmljZS5nZXRBbGxEZWNyeXB0ZWQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IEJyb3dzZXJBcGkudGFiU2VuZE1lc3NhZ2VEYXRhKHRhYiwgcmVzcG9uc2VDb21tYW5kLCByZXNwb25zZURhdGEpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgYWxsb3dQZXJzb25hbE93bmVyc2hpcCgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgcmV0dXJuICFhd2FpdCB0aGlzLnBvbGljeVNlcnZpY2UucG9saWN5QXBwbGllc1RvVXNlcihQb2xpY3lUeXBlLlBlcnNvbmFsT3duZXJzaGlwKTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBFbnZpcm9ubWVudFNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL2Vudmlyb25tZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgSTE4blNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL2kxOG4uc2VydmljZSc7XG5pbXBvcnQgeyBMb2dTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9sb2cuc2VydmljZSc7XG5pbXBvcnQgeyBNZXNzYWdpbmdTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9tZXNzYWdpbmcuc2VydmljZSc7XG5pbXBvcnQgeyBOb3RpZmljYXRpb25zU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvbm90aWZpY2F0aW9ucy5zZXJ2aWNlJztcbmltcG9ydCB7IFN0b3JhZ2VTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9zdG9yYWdlLnNlcnZpY2UnO1xuaW1wb3J0IHsgU3lzdGVtU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvc3lzdGVtLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ29uc3RhbnRzU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9zZXJ2aWNlcy9jb25zdGFudHMuc2VydmljZSc7XG5cbmltcG9ydCB7IEF1dG9maWxsU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2Fic3RyYWN0aW9ucy9hdXRvZmlsbC5zZXJ2aWNlJztcbmltcG9ydCBCcm93c2VyUGxhdGZvcm1VdGlsc1NlcnZpY2UgZnJvbSAnLi4vc2VydmljZXMvYnJvd3NlclBsYXRmb3JtVXRpbHMuc2VydmljZSc7XG5cbmltcG9ydCB7IEJyb3dzZXJBcGkgfSBmcm9tICcuLi9icm93c2VyL2Jyb3dzZXJBcGknO1xuXG5pbXBvcnQgTWFpbkJhY2tncm91bmQgZnJvbSAnLi9tYWluLmJhY2tncm91bmQnO1xuXG5pbXBvcnQgeyBVdGlscyB9IGZyb20gJ2pzbGliLWNvbW1vbi9taXNjL3V0aWxzJztcbmltcG9ydCBMb2NrZWRWYXVsdFBlbmRpbmdOb3RpZmljYXRpb25zSXRlbSBmcm9tICcuL21vZGVscy9sb2NrZWRWYXVsdFBlbmRpbmdOb3RpZmljYXRpb25zSXRlbSc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJ1bnRpbWVCYWNrZ3JvdW5kIHtcbiAgICBwcml2YXRlIGF1dG9maWxsVGltZW91dDogYW55O1xuICAgIHByaXZhdGUgcGFnZURldGFpbHNUb0F1dG9GaWxsOiBhbnlbXSA9IFtdO1xuICAgIHByaXZhdGUgb25JbnN0YWxsZWRSZWFzb246IHN0cmluZyA9IG51bGw7XG4gICAgcHJpdmF0ZSBsb2NrZWRWYXVsdFBlbmRpbmdOb3RpZmljYXRpb25zOiBMb2NrZWRWYXVsdFBlbmRpbmdOb3RpZmljYXRpb25zSXRlbVtdID0gW107XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIG1haW46IE1haW5CYWNrZ3JvdW5kLCBwcml2YXRlIGF1dG9maWxsU2VydmljZTogQXV0b2ZpbGxTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHBsYXRmb3JtVXRpbHNTZXJ2aWNlOiBCcm93c2VyUGxhdGZvcm1VdGlsc1NlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgc3RvcmFnZVNlcnZpY2U6IFN0b3JhZ2VTZXJ2aWNlLCBwcml2YXRlIGkxOG5TZXJ2aWNlOiBJMThuU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBub3RpZmljYXRpb25zU2VydmljZTogTm90aWZpY2F0aW9uc1NlcnZpY2UsIHByaXZhdGUgc3lzdGVtU2VydmljZTogU3lzdGVtU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBlbnZpcm9ubWVudFNlcnZpY2U6IEVudmlyb25tZW50U2VydmljZSwgcHJpdmF0ZSBtZXNzYWdpbmdTZXJ2aWNlOiBNZXNzYWdpbmdTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGxvZ1NlcnZpY2U6IExvZ1NlcnZpY2UpIHtcblxuICAgICAgICAvLyBvbkluc3RhbGxlZCBsaXN0ZW5lciBtdXN0IGJlIHdpcmVkIHVwIGJlZm9yZSBhbnl0aGluZyBlbHNlLCBzbyB3ZSBkbyBpdCBpbiB0aGUgY3RvclxuICAgICAgICBjaHJvbWUucnVudGltZS5vbkluc3RhbGxlZC5hZGRMaXN0ZW5lcigoZGV0YWlsczogYW55KSA9PiB7XG4gICAgICAgICAgICB0aGlzLm9uSW5zdGFsbGVkUmVhc29uID0gZGV0YWlscy5yZWFzb247XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGFzeW5jIGluaXQoKSB7XG4gICAgICAgIGlmICghY2hyb21lLnJ1bnRpbWUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IHRoaXMuY2hlY2tPbkluc3RhbGxlZCgpO1xuICAgICAgICBCcm93c2VyQXBpLm1lc3NhZ2VMaXN0ZW5lcigncnVudGltZS5iYWNrZ3JvdW5kJywgYXN5bmMgKG1zZzogYW55LCBzZW5kZXI6IGNocm9tZS5ydW50aW1lLk1lc3NhZ2VTZW5kZXIsIHNlbmRSZXNwb25zZTogYW55KSA9PiB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnByb2Nlc3NNZXNzYWdlKG1zZywgc2VuZGVyLCBzZW5kUmVzcG9uc2UpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBhc3luYyBwcm9jZXNzTWVzc2FnZShtc2c6IGFueSwgc2VuZGVyOiBhbnksIHNlbmRSZXNwb25zZTogYW55KSB7XG4gICAgICAgIHN3aXRjaCAobXNnLmNvbW1hbmQpIHtcbiAgICAgICAgICAgIGNhc2UgJ2xvZ2dlZEluJzpcbiAgICAgICAgICAgIGNhc2UgJ3VubG9ja2VkJzpcbiAgICAgICAgICAgICAgICBsZXQgaXRlbTogTG9ja2VkVmF1bHRQZW5kaW5nTm90aWZpY2F0aW9uc0l0ZW07XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5sb2NrZWRWYXVsdFBlbmRpbmdOb3RpZmljYXRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgQnJvd3NlckFwaS5jbG9zZUxvZ2luVGFiKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgaXRlbSA9IHRoaXMubG9ja2VkVmF1bHRQZW5kaW5nTm90aWZpY2F0aW9ucy5wb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0uY29tbWFuZFRvUmV0cnkuc2VuZGVyPy50YWI/LmlkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBCcm93c2VyQXBpLmZvY3VzU3BlY2lmaWVkVGFiKGl0ZW0uY29tbWFuZFRvUmV0cnkuc2VuZGVyLnRhYi5pZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLm1haW4uc2V0SWNvbigpO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMubWFpbi5yZWZyZXNoQmFkZ2VBbmRNZW51KGZhbHNlKTtcbiAgICAgICAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvbnNTZXJ2aWNlLnVwZGF0ZUNvbm5lY3Rpb24obXNnLmNvbW1hbmQgPT09ICd1bmxvY2tlZCcpO1xuICAgICAgICAgICAgICAgIHRoaXMuc3lzdGVtU2VydmljZS5jYW5jZWxQcm9jZXNzUmVsb2FkKCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoaXRlbSkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBCcm93c2VyQXBpLnRhYlNlbmRNZXNzYWdlRGF0YShpdGVtLmNvbW1hbmRUb1JldHJ5LnNlbmRlci50YWIsICd1bmxvY2tDb21wbGV0ZWQnLCBpdGVtKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdhZGRUb0xvY2tlZFZhdWx0UGVuZGluZ05vdGlmaWNhdGlvbnMnOlxuICAgICAgICAgICAgICAgIHRoaXMubG9ja2VkVmF1bHRQZW5kaW5nTm90aWZpY2F0aW9ucy5wdXNoKG1zZy5kYXRhKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2xvZ291dCc6XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5tYWluLmxvZ291dChtc2cuZXhwaXJlZCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdzeW5jQ29tcGxldGVkJzpcbiAgICAgICAgICAgICAgICBpZiAobXNnLnN1Y2Nlc3NmdWxseSkge1xuICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGFzeW5jICgpID0+IGF3YWl0IHRoaXMubWFpbi5yZWZyZXNoQmFkZ2VBbmRNZW51KCksIDIwMDApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ29wZW5Qb3B1cCc6XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5tYWluLm9wZW5Qb3B1cCgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAncHJvbXB0Rm9yTG9naW4nOlxuICAgICAgICAgICAgICAgIGF3YWl0IEJyb3dzZXJBcGkuY3JlYXRlTmV3VGFiKCdwb3B1cC9pbmRleC5odG1sP3VpbG9jYXRpb249cG9wb3V0JywgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdzaG93RGlhbG9nUmVzb2x2ZSc6XG4gICAgICAgICAgICAgICAgdGhpcy5wbGF0Zm9ybVV0aWxzU2VydmljZS5yZXNvbHZlRGlhbG9nUHJvbWlzZShtc2cuZGlhbG9nSWQsIG1zZy5jb25maXJtZWQpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnYmdDb2xsZWN0UGFnZURldGFpbHMnOlxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMubWFpbi5jb2xsZWN0UGFnZURldGFpbHNGb3JDb250ZW50U2NyaXB0KHNlbmRlci50YWIsIG1zZy5zZW5kZXIsIHNlbmRlci5mcmFtZUlkKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2JnVXBkYXRlQ29udGV4dE1lbnUnOlxuICAgICAgICAgICAgY2FzZSAnZWRpdGVkQ2lwaGVyJzpcbiAgICAgICAgICAgIGNhc2UgJ2FkZGVkQ2lwaGVyJzpcbiAgICAgICAgICAgIGNhc2UgJ2RlbGV0ZWRDaXBoZXInOlxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMubWFpbi5yZWZyZXNoQmFkZ2VBbmRNZW51KCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdiZ1Jlc2VlZFN0b3JhZ2UnOlxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMubWFpbi5yZXNlZWRTdG9yYWdlKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdjb2xsZWN0UGFnZURldGFpbHNSZXNwb25zZSc6XG4gICAgICAgICAgICAgICAgc3dpdGNoIChtc2cuc2VuZGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2F1dG9maWxsZXInOlxuICAgICAgICAgICAgICAgICAgICBjYXNlICdhdXRvZmlsbF9jbWQnOlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdG90cENvZGUgPSBhd2FpdCB0aGlzLmF1dG9maWxsU2VydmljZS5kb0F1dG9GaWxsQWN0aXZlVGFiKFt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVJZDogc2VuZGVyLmZyYW1lSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFiOiBtc2cudGFiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbHM6IG1zZy5kZXRhaWxzLFxuICAgICAgICAgICAgICAgICAgICAgICAgfV0sIG1zZy5zZW5kZXIgPT09ICdhdXRvZmlsbF9jbWQnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0b3RwQ29kZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbGF0Zm9ybVV0aWxzU2VydmljZS5jb3B5VG9DbGlwYm9hcmQodG90cENvZGUsIHsgd2luZG93OiB3aW5kb3cgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnY29udGV4dE1lbnUnOlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuYXV0b2ZpbGxUaW1lb3V0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGFnZURldGFpbHNUb0F1dG9GaWxsLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lSWQ6IHNlbmRlci5mcmFtZUlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYjogbXNnLnRhYixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWxzOiBtc2cuZGV0YWlscyxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hdXRvZmlsbFRpbWVvdXQgPSBzZXRUaW1lb3V0KGFzeW5jICgpID0+IGF3YWl0IHRoaXMuYXV0b2ZpbGxQYWdlKCksIDMwMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2F1dGhSZXN1bHQnOlxuICAgICAgICAgICAgICAgIGNvbnN0IHZhdWx0VXJsID0gdGhpcy5lbnZpcm9ubWVudFNlcnZpY2UuZ2V0V2ViVmF1bHRVcmwoKTtcblxuICAgICAgICAgICAgICAgIGlmIChtc2cucmVmZXJyZXIgPT0gbnVsbCB8fCBVdGlscy5nZXRIb3N0bmFtZSh2YXVsdFVybCkgIT09IG1zZy5yZWZlcnJlcikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgQnJvd3NlckFwaS5jcmVhdGVOZXdUYWIoJ3BvcHVwL2luZGV4Lmh0bWw/dWlsb2NhdGlvbj1wb3BvdXQjL3Nzbz9jb2RlPScgK1xuICAgICAgICAgICAgICAgICAgICAgICAgbXNnLmNvZGUgKyAnJnN0YXRlPScgKyBtc2cuc3RhdGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nU2VydmljZS5lcnJvcignVW5hYmxlIHRvIG9wZW4gc3NvIHBvcG91dCB0YWInKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICd3ZWJBdXRoblJlc3VsdCc6XG4gICAgICAgICAgICAgICAgY29uc3QgdmF1bHRVcmwyID0gdGhpcy5lbnZpcm9ubWVudFNlcnZpY2UuZ2V0V2ViVmF1bHRVcmwoKTtcblxuICAgICAgICAgICAgICAgIGlmIChtc2cucmVmZXJyZXIgPT0gbnVsbCB8fCBVdGlscy5nZXRIb3N0bmFtZSh2YXVsdFVybDIpICE9PSBtc2cucmVmZXJyZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmFtcyA9IGB3ZWJBdXRoblJlc3BvbnNlPSR7ZW5jb2RlVVJJQ29tcG9uZW50KG1zZy5kYXRhKX07cmVtZW1iZXI9JHttc2cucmVtZW1iZXJ9YDtcbiAgICAgICAgICAgICAgICBCcm93c2VyQXBpLmNyZWF0ZU5ld1RhYihgcG9wdXAvaW5kZXguaHRtbD91aWxvY2F0aW9uPXBvcG91dCMvMmZhOyR7cGFyYW1zfWAsIHVuZGVmaW5lZCwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAncmVsb2FkUG9wdXAnOlxuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnaW5nU2VydmljZS5zZW5kKCdyZWxvYWRQb3B1cCcpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnZW1haWxWZXJpZmljYXRpb25SZXF1aXJlZCc6XG4gICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdpbmdTZXJ2aWNlLnNlbmQoJ3Nob3dEaWFsb2cnLCB7XG4gICAgICAgICAgICAgICAgICAgIGRpYWxvZ0lkOiAnZW1haWxWZXJpZmljYXRpb25SZXF1aXJlZCcsXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiB0aGlzLmkxOG5TZXJ2aWNlLnQoJ2VtYWlsVmVyaWZpY2F0aW9uUmVxdWlyZWQnKSxcbiAgICAgICAgICAgICAgICAgICAgdGV4dDogdGhpcy5pMThuU2VydmljZS50KCdlbWFpbFZlcmlmaWNhdGlvblJlcXVpcmVkRGVzYycpLFxuICAgICAgICAgICAgICAgICAgICBjb25maXJtVGV4dDogdGhpcy5pMThuU2VydmljZS50KCdvaycpLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnaW5mbycsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdnZXRDbGlja2VkRWxlbWVudFJlc3BvbnNlJzpcbiAgICAgICAgICAgICAgICB0aGlzLnBsYXRmb3JtVXRpbHNTZXJ2aWNlLmNvcHlUb0NsaXBib2FyZChtc2cuaWRlbnRpZmllciwgeyB3aW5kb3c6IHdpbmRvdyB9KTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGF1dG9maWxsUGFnZSgpIHtcbiAgICAgICAgY29uc3QgdG90cENvZGUgPSBhd2FpdCB0aGlzLmF1dG9maWxsU2VydmljZS5kb0F1dG9GaWxsKHtcbiAgICAgICAgICAgIGNpcGhlcjogdGhpcy5tYWluLmxvZ2luVG9BdXRvRmlsbCxcbiAgICAgICAgICAgIHBhZ2VEZXRhaWxzOiB0aGlzLnBhZ2VEZXRhaWxzVG9BdXRvRmlsbCxcbiAgICAgICAgICAgIGZpbGxOZXdQYXNzd29yZDogdHJ1ZSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHRvdHBDb2RlICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMucGxhdGZvcm1VdGlsc1NlcnZpY2UuY29weVRvQ2xpcGJvYXJkKHRvdHBDb2RlLCB7IHdpbmRvdzogd2luZG93IH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gcmVzZXRcbiAgICAgICAgdGhpcy5tYWluLmxvZ2luVG9BdXRvRmlsbCA9IG51bGw7XG4gICAgICAgIHRoaXMucGFnZURldGFpbHNUb0F1dG9GaWxsID0gW107XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBjaGVja09uSW5zdGFsbGVkKCkge1xuICAgICAgICBzZXRUaW1lb3V0KGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLm9uSW5zdGFsbGVkUmVhc29uICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vbkluc3RhbGxlZFJlYXNvbiA9PT0gJ2luc3RhbGwnKSB7XG4gICAgICAgICAgICAgICAgICAgIEJyb3dzZXJBcGkuY3JlYXRlTmV3VGFiKCdodHRwczovL2JpdHdhcmRlbi5jb20vYnJvd3Nlci1zdGFydC8nKTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXREZWZhdWx0U2V0dGluZ3MoKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLm9uSW5zdGFsbGVkUmVhc29uID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgMTAwKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHNldERlZmF1bHRTZXR0aW5ncygpIHtcbiAgICAgICAgLy8gRGVmYXVsdCB0aW1lb3V0IG9wdGlvbiB0byBcIm9uIHJlc3RhcnRcIi5cbiAgICAgICAgY29uc3QgY3VycmVudFZhdWx0VGltZW91dCA9IGF3YWl0IHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0PG51bWJlcj4oQ29uc3RhbnRzU2VydmljZS52YXVsdFRpbWVvdXRLZXkpO1xuICAgICAgICBpZiAoY3VycmVudFZhdWx0VGltZW91dCA9PSBudWxsKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNhdmUoQ29uc3RhbnRzU2VydmljZS52YXVsdFRpbWVvdXRLZXksIC0xKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERlZmF1bHQgYWN0aW9uIHRvIFwibG9ja1wiLlxuICAgICAgICBjb25zdCBjdXJyZW50VmF1bHRUaW1lb3V0QWN0aW9uID0gYXdhaXQgdGhpcy5zdG9yYWdlU2VydmljZS5nZXQ8c3RyaW5nPihDb25zdGFudHNTZXJ2aWNlLnZhdWx0VGltZW91dEFjdGlvbktleSk7XG4gICAgICAgIGlmIChjdXJyZW50VmF1bHRUaW1lb3V0QWN0aW9uID09IG51bGwpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2F2ZShDb25zdGFudHNTZXJ2aWNlLnZhdWx0VGltZW91dEFjdGlvbktleSwgJ2xvY2snKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCBNYWluQmFja2dyb3VuZCBmcm9tICcuL21haW4uYmFja2dyb3VuZCc7XG5pbXBvcnQgTm90aWZpY2F0aW9uQmFja2dyb3VuZCBmcm9tICcuL25vdGlmaWNhdGlvbi5iYWNrZ3JvdW5kJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGFic0JhY2tncm91bmQge1xuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgbWFpbjogTWFpbkJhY2tncm91bmQsIHByaXZhdGUgbm90aWZpY2F0aW9uQmFja2dyb3VuZDogTm90aWZpY2F0aW9uQmFja2dyb3VuZCkge1xuICAgIH1cblxuICAgIGFzeW5jIGluaXQoKSB7XG4gICAgICAgIGlmICghY2hyb21lLnRhYnMpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNocm9tZS50YWJzLm9uQWN0aXZhdGVkLmFkZExpc3RlbmVyKGFzeW5jIChhY3RpdmVJbmZvOiBjaHJvbWUudGFicy5UYWJBY3RpdmVJbmZvKSA9PiB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLm1haW4ucmVmcmVzaEJhZGdlQW5kTWVudSgpO1xuICAgICAgICAgICAgdGhpcy5tYWluLm1lc3NhZ2luZ1NlcnZpY2Uuc2VuZCgndGFiQWN0aXZhdGVkJyk7XG4gICAgICAgICAgICB0aGlzLm1haW4ubWVzc2FnaW5nU2VydmljZS5zZW5kKCd0YWJDaGFuZ2VkJyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNocm9tZS50YWJzLm9uUmVwbGFjZWQuYWRkTGlzdGVuZXIoYXN5bmMgKGFkZGVkVGFiSWQ6IG51bWJlciwgcmVtb3ZlZFRhYklkOiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLm1haW4ub25SZXBsYWNlZFJhbikge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMubWFpbi5vblJlcGxhY2VkUmFuID0gdHJ1ZTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMubm90aWZpY2F0aW9uQmFja2dyb3VuZC5jaGVja05vdGlmaWNhdGlvblF1ZXVlKCk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLm1haW4ucmVmcmVzaEJhZGdlQW5kTWVudSgpO1xuICAgICAgICAgICAgdGhpcy5tYWluLm1lc3NhZ2luZ1NlcnZpY2Uuc2VuZCgndGFiUmVwbGFjZWQnKTtcbiAgICAgICAgICAgIHRoaXMubWFpbi5tZXNzYWdpbmdTZXJ2aWNlLnNlbmQoJ3RhYkNoYW5nZWQnKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY2hyb21lLnRhYnMub25VcGRhdGVkLmFkZExpc3RlbmVyKGFzeW5jICh0YWJJZDogbnVtYmVyLCBjaGFuZ2VJbmZvOiBjaHJvbWUudGFicy5UYWJDaGFuZ2VJbmZvLCB0YWI6IGNocm9tZS50YWJzLlRhYikgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMubWFpbi5vblVwZGF0ZWRSYW4pIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm1haW4ub25VcGRhdGVkUmFuID0gdHJ1ZTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMubm90aWZpY2F0aW9uQmFja2dyb3VuZC5jaGVja05vdGlmaWNhdGlvblF1ZXVlKHRhYik7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLm1haW4ucmVmcmVzaEJhZGdlQW5kTWVudSgpO1xuICAgICAgICAgICAgdGhpcy5tYWluLm1lc3NhZ2luZ1NlcnZpY2Uuc2VuZCgndGFiVXBkYXRlZCcpO1xuICAgICAgICAgICAgdGhpcy5tYWluLm1lc3NhZ2luZ1NlcnZpY2Uuc2VuZCgndGFiQ2hhbmdlZCcpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBDaXBoZXJTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9jaXBoZXIuc2VydmljZSc7XG5pbXBvcnQgeyBQbGF0Zm9ybVV0aWxzU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvcGxhdGZvcm1VdGlscy5zZXJ2aWNlJztcbmltcG9ydCB7IFZhdWx0VGltZW91dFNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL3ZhdWx0VGltZW91dC5zZXJ2aWNlJztcblxuaW1wb3J0IHsgVXJpTWF0Y2hUeXBlIH0gZnJvbSAnanNsaWItY29tbW9uL2VudW1zL3VyaU1hdGNoVHlwZSc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFdlYlJlcXVlc3RCYWNrZ3JvdW5kIHtcbiAgICBwcml2YXRlIHBlbmRpbmdBdXRoUmVxdWVzdHM6IGFueVtdID0gW107XG4gICAgcHJpdmF0ZSB3ZWJSZXF1ZXN0OiBhbnk7XG4gICAgcHJpdmF0ZSBpc0ZpcmVmb3g6IGJvb2xlYW47XG5cbiAgICBjb25zdHJ1Y3RvcihwbGF0Zm9ybVV0aWxzU2VydmljZTogUGxhdGZvcm1VdGlsc1NlcnZpY2UsIHByaXZhdGUgY2lwaGVyU2VydmljZTogQ2lwaGVyU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSB2YXVsdFRpbWVvdXRTZXJ2aWNlOiBWYXVsdFRpbWVvdXRTZXJ2aWNlKSB7XG4gICAgICAgIHRoaXMud2ViUmVxdWVzdCA9ICh3aW5kb3cgYXMgYW55KS5jaHJvbWUud2ViUmVxdWVzdDtcbiAgICAgICAgdGhpcy5pc0ZpcmVmb3ggPSBwbGF0Zm9ybVV0aWxzU2VydmljZS5pc0ZpcmVmb3goKTtcbiAgICB9XG5cbiAgICBhc3luYyBpbml0KCkge1xuICAgICAgICBpZiAoIXRoaXMud2ViUmVxdWVzdCB8fCAhdGhpcy53ZWJSZXF1ZXN0Lm9uQXV0aFJlcXVpcmVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLndlYlJlcXVlc3Qub25BdXRoUmVxdWlyZWQuYWRkTGlzdGVuZXIoYXN5bmMgKGRldGFpbHM6IGFueSwgY2FsbGJhY2s6IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKCFkZXRhaWxzLnVybCB8fCB0aGlzLnBlbmRpbmdBdXRoUmVxdWVzdHMuaW5kZXhPZihkZXRhaWxzLnJlcXVlc3RJZCkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5wZW5kaW5nQXV0aFJlcXVlc3RzLnB1c2goZGV0YWlscy5yZXF1ZXN0SWQpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5pc0ZpcmVmb3gpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnJlc29sdmVBdXRoQ3JlZGVudGlhbHMoZGV0YWlscy51cmwsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucmVzb2x2ZUF1dGhDcmVkZW50aWFscyhkZXRhaWxzLnVybCwgY2FsbGJhY2ssIGNhbGxiYWNrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgeyB1cmxzOiBbJ2h0dHA6Ly8qLyonLCAnaHR0cHM6Ly8qLyonXSB9LCBbdGhpcy5pc0ZpcmVmb3ggPyAnYmxvY2tpbmcnIDogJ2FzeW5jQmxvY2tpbmcnXSk7XG5cbiAgICAgICAgdGhpcy53ZWJSZXF1ZXN0Lm9uQ29tcGxldGVkLmFkZExpc3RlbmVyKFxuICAgICAgICAgICAgKGRldGFpbHM6IGFueSkgPT4gdGhpcy5jb21wbGV0ZUF1dGhSZXF1ZXN0KGRldGFpbHMpLCB7IHVybHM6IFsnaHR0cDovLyovKiddIH0pO1xuICAgICAgICB0aGlzLndlYlJlcXVlc3Qub25FcnJvck9jY3VycmVkLmFkZExpc3RlbmVyKFxuICAgICAgICAgICAgKGRldGFpbHM6IGFueSkgPT4gdGhpcy5jb21wbGV0ZUF1dGhSZXF1ZXN0KGRldGFpbHMpLCB7IHVybHM6IFsnaHR0cDovLyovKiddIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgcmVzb2x2ZUF1dGhDcmVkZW50aWFscyhkb21haW46IHN0cmluZywgc3VjY2VzczogRnVuY3Rpb24sIGVycm9yOiBGdW5jdGlvbikge1xuICAgICAgICBpZiAoYXdhaXQgdGhpcy52YXVsdFRpbWVvdXRTZXJ2aWNlLmlzTG9ja2VkKCkpIHtcbiAgICAgICAgICAgIGVycm9yKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgY2lwaGVycyA9IGF3YWl0IHRoaXMuY2lwaGVyU2VydmljZS5nZXRBbGxEZWNyeXB0ZWRGb3JVcmwoZG9tYWluLCBudWxsLCBVcmlNYXRjaFR5cGUuSG9zdCk7XG4gICAgICAgICAgICBpZiAoY2lwaGVycyA9PSBudWxsIHx8IGNpcGhlcnMubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgICAgICAgICAgZXJyb3IoKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHN1Y2Nlc3Moe1xuICAgICAgICAgICAgICAgIGF1dGhDcmVkZW50aWFsczoge1xuICAgICAgICAgICAgICAgICAgICB1c2VybmFtZTogY2lwaGVyc1swXS5sb2dpbi51c2VybmFtZSxcbiAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmQ6IGNpcGhlcnNbMF0ubG9naW4ucGFzc3dvcmQsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIGVycm9yKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGNvbXBsZXRlQXV0aFJlcXVlc3QoZGV0YWlsczogYW55KSB7XG4gICAgICAgIGNvbnN0IGkgPSB0aGlzLnBlbmRpbmdBdXRoUmVxdWVzdHMuaW5kZXhPZihkZXRhaWxzLnJlcXVlc3RJZCk7XG4gICAgICAgIGlmIChpID4gLTEpIHtcbiAgICAgICAgICAgIHRoaXMucGVuZGluZ0F1dGhSZXF1ZXN0cy5zcGxpY2UoaSwgMSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgTWFpbkJhY2tncm91bmQgZnJvbSAnLi9tYWluLmJhY2tncm91bmQnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBXaW5kb3dzQmFja2dyb3VuZCB7XG4gICAgcHJpdmF0ZSB3aW5kb3dzOiBhbnk7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIG1haW46IE1haW5CYWNrZ3JvdW5kKSB7XG4gICAgICAgIHRoaXMud2luZG93cyA9IGNocm9tZS53aW5kb3dzO1xuICAgIH1cblxuICAgIGFzeW5jIGluaXQoKSB7XG4gICAgICAgIGlmICghdGhpcy53aW5kb3dzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLndpbmRvd3Mub25Gb2N1c0NoYW5nZWQuYWRkTGlzdGVuZXIoYXN5bmMgKHdpbmRvd0lkOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmICh3aW5kb3dJZCA9PT0gbnVsbCB8fCB3aW5kb3dJZCA8IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGF3YWl0IHRoaXMubWFpbi5yZWZyZXNoQmFkZ2VBbmRNZW51KCk7XG4gICAgICAgICAgICB0aGlzLm1haW4ubWVzc2FnaW5nU2VydmljZS5zZW5kKCd3aW5kb3dGb2N1c2VkJyk7XG4gICAgICAgICAgICB0aGlzLm1haW4ubWVzc2FnaW5nU2VydmljZS5zZW5kKCd3aW5kb3dDaGFuZ2VkJyk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IFNhZmFyaUFwcCB9IGZyb20gJy4vc2FmYXJpQXBwJztcblxuaW1wb3J0IHsgVXRpbHMgfSBmcm9tICdqc2xpYi1jb21tb24vbWlzYy91dGlscyc7XG5cbmV4cG9ydCBjbGFzcyBCcm93c2VyQXBpIHtcbiAgICBzdGF0aWMgaXNXZWJFeHRlbnNpb25zQXBpOiBib29sZWFuID0gKHR5cGVvZiBicm93c2VyICE9PSAndW5kZWZpbmVkJyk7XG4gICAgc3RhdGljIGlzU2FmYXJpQXBpOiBib29sZWFuID0gbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCcgU2FmYXJpLycpICE9PSAtMSAmJlxuICAgICAgICBuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJyBDaHJvbWUvJykgPT09IC0xICYmXG4gICAgICAgIG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignIENocm9taXVtLycpID09PSAtMTtcbiAgICBzdGF0aWMgaXNDaHJvbWVBcGk6IGJvb2xlYW4gPSAhQnJvd3NlckFwaS5pc1NhZmFyaUFwaSAmJiAodHlwZW9mIGNocm9tZSAhPT0gJ3VuZGVmaW5lZCcpO1xuICAgIHN0YXRpYyBpc0ZpcmVmb3hPbkFuZHJvaWQ6IGJvb2xlYW4gPSBuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ0ZpcmVmb3gvJykgIT09IC0xICYmXG4gICAgICAgIG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignQW5kcm9pZCcpICE9PSAtMTtcblxuICAgIHN0YXRpYyBhc3luYyBnZXRUYWJGcm9tQ3VycmVudFdpbmRvd0lkKCk6IFByb21pc2U8Y2hyb21lLnRhYnMuVGFiPiB8IG51bGwge1xuICAgICAgICByZXR1cm4gYXdhaXQgQnJvd3NlckFwaS50YWJzUXVlcnlGaXJzdCh7XG4gICAgICAgICAgICBhY3RpdmU6IHRydWUsXG4gICAgICAgICAgICB3aW5kb3dJZDogY2hyb21lLndpbmRvd3MuV0lORE9XX0lEX0NVUlJFTlQsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHN0YXRpYyBhc3luYyBnZXRUYWJGcm9tQ3VycmVudFdpbmRvdygpOiBQcm9taXNlPGNocm9tZS50YWJzLlRhYj4gfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IEJyb3dzZXJBcGkudGFic1F1ZXJ5Rmlyc3Qoe1xuICAgICAgICAgICAgYWN0aXZlOiB0cnVlLFxuICAgICAgICAgICAgY3VycmVudFdpbmRvdzogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc3RhdGljIGFzeW5jIGdldEFjdGl2ZVRhYnMoKTogUHJvbWlzZTxjaHJvbWUudGFicy5UYWJbXT4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgQnJvd3NlckFwaS50YWJzUXVlcnkoe1xuICAgICAgICAgICAgYWN0aXZlOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzdGF0aWMgYXN5bmMgdGFic1F1ZXJ5KG9wdGlvbnM6IGNocm9tZS50YWJzLlF1ZXJ5SW5mbyk6IFByb21pc2U8Y2hyb21lLnRhYnMuVGFiW10+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgICAgICAgY2hyb21lLnRhYnMucXVlcnkob3B0aW9ucywgKHRhYnM6IGFueVtdKSA9PiB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh0YWJzKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzdGF0aWMgYXN5bmMgdGFic1F1ZXJ5Rmlyc3Qob3B0aW9uczogY2hyb21lLnRhYnMuUXVlcnlJbmZvKTogUHJvbWlzZTxjaHJvbWUudGFicy5UYWI+IHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IHRhYnMgPSBhd2FpdCBCcm93c2VyQXBpLnRhYnNRdWVyeShvcHRpb25zKTtcbiAgICAgICAgaWYgKHRhYnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHRhYnNbMF07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBzdGF0aWMgdGFiU2VuZE1lc3NhZ2VEYXRhKHRhYjogY2hyb21lLnRhYnMuVGFiLCBjb21tYW5kOiBzdHJpbmcsIGRhdGE6IGFueSA9IG51bGwpOiBQcm9taXNlPGFueVtdPiB7XG4gICAgICAgIGNvbnN0IG9iajogYW55ID0ge1xuICAgICAgICAgICAgY29tbWFuZDogY29tbWFuZCxcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoZGF0YSAhPSBudWxsKSB7XG4gICAgICAgICAgICBvYmouZGF0YSA9IGRhdGE7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gQnJvd3NlckFwaS50YWJTZW5kTWVzc2FnZSh0YWIsIG9iaik7XG4gICAgfVxuXG4gICAgc3RhdGljIGFzeW5jIHRhYlNlbmRNZXNzYWdlKHRhYjogY2hyb21lLnRhYnMuVGFiLCBvYmo6IGFueSwgb3B0aW9uczogY2hyb21lLnRhYnMuTWVzc2FnZVNlbmRPcHRpb25zID0gbnVsbCk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIGlmICghdGFiIHx8ICF0YWIuaWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPihyZXNvbHZlID0+IHtcbiAgICAgICAgICAgIGNocm9tZS50YWJzLnNlbmRNZXNzYWdlKHRhYi5pZCwgb2JqLCBvcHRpb25zLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGNocm9tZS5ydW50aW1lLmxhc3RFcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAvLyBTb21lIGVycm9yIGhhcHBlbmVkXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0QmFja2dyb3VuZFBhZ2UoKTogYW55IHtcbiAgICAgICAgcmV0dXJuIGNocm9tZS5leHRlbnNpb24uZ2V0QmFja2dyb3VuZFBhZ2UoKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0QXBwbGljYXRpb25WZXJzaW9uKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBjaHJvbWUucnVudGltZS5nZXRNYW5pZmVzdCgpLnZlcnNpb247XG4gICAgfVxuXG4gICAgc3RhdGljIGFzeW5jIGlzUG9wdXBPcGVuKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGNocm9tZS5leHRlbnNpb24uZ2V0Vmlld3MoeyB0eXBlOiAncG9wdXAnIH0pLmxlbmd0aCA+IDApO1xuICAgIH1cblxuICAgIHN0YXRpYyBjcmVhdGVOZXdUYWIodXJsOiBzdHJpbmcsIGV4dGVuc2lvblBhZ2U6IGJvb2xlYW4gPSBmYWxzZSwgYWN0aXZlOiBib29sZWFuID0gdHJ1ZSkge1xuICAgICAgICBjaHJvbWUudGFicy5jcmVhdGUoeyB1cmw6IHVybCwgYWN0aXZlOiBhY3RpdmUgfSk7XG4gICAgfVxuXG4gICAgc3RhdGljIG1lc3NhZ2VMaXN0ZW5lcihuYW1lOiBzdHJpbmcsIGNhbGxiYWNrOiAobWVzc2FnZTogYW55LCBzZW5kZXI6IGNocm9tZS5ydW50aW1lLk1lc3NhZ2VTZW5kZXIsIHJlc3BvbnNlOiBhbnkpID0+IHZvaWQpIHtcbiAgICAgICAgY2hyb21lLnJ1bnRpbWUub25NZXNzYWdlLmFkZExpc3RlbmVyKChtc2c6IGFueSwgc2VuZGVyOiBjaHJvbWUucnVudGltZS5NZXNzYWdlU2VuZGVyLCByZXNwb25zZTogYW55KSA9PiB7XG4gICAgICAgICAgICBjYWxsYmFjayhtc2csIHNlbmRlciwgcmVzcG9uc2UpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzdGF0aWMgYXN5bmMgY2xvc2VMb2dpblRhYigpIHtcbiAgICAgICAgY29uc3QgdGFicyA9IGF3YWl0IEJyb3dzZXJBcGkudGFic1F1ZXJ5KHtcbiAgICAgICAgICAgIGFjdGl2ZTogdHJ1ZSxcbiAgICAgICAgICAgIHRpdGxlOiAnQml0d2FyZGVuJyxcbiAgICAgICAgICAgIHdpbmRvd1R5cGU6ICdub3JtYWwnLFxuICAgICAgICAgICAgY3VycmVudFdpbmRvdzogdHJ1ZSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHRhYnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0YWJUb0Nsb3NlID0gdGFic1t0YWJzLmxlbmd0aCAtIDFdLmlkO1xuICAgICAgICBjaHJvbWUudGFicy5yZW1vdmUodGFiVG9DbG9zZSk7XG4gICAgfVxuXG4gICAgc3RhdGljIGFzeW5jIGZvY3VzU3BlY2lmaWVkVGFiKHRhYklkOiBudW1iZXIpIHtcbiAgICAgICAgY2hyb21lLnRhYnMudXBkYXRlKHRhYklkLCB7IGFjdGl2ZTogdHJ1ZSwgaGlnaGxpZ2h0ZWQ6IHRydWUgfSk7XG4gICAgfVxuXG4gICAgc3RhdGljIGNsb3NlUG9wdXAod2luOiBXaW5kb3cpIHtcbiAgICAgICAgaWYgKEJyb3dzZXJBcGkuaXNXZWJFeHRlbnNpb25zQXBpICYmIEJyb3dzZXJBcGkuaXNGaXJlZm94T25BbmRyb2lkKSB7XG4gICAgICAgICAgICAvLyBSZWFjdGl2YXRpbmcgdGhlIGFjdGl2ZSB0YWIgZGlzbWlzc2VzIHRoZSBwb3B1cCB0YWIuIFRoZSBwcm9taXNlIGZpbmFsXG4gICAgICAgICAgICAvLyBjb25kaXRpb24gaXMgb25seSBjYWxsZWQgaWYgdGhlIHBvcHVwIHdhc24ndCBhbHJlYWR5IGRpc21pc3NlZCAoZnV0dXJlIHByb29maW5nKS5cbiAgICAgICAgICAgIC8vIHJlZjogaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTQzMzYwNFxuICAgICAgICAgICAgYnJvd3Nlci50YWJzLnVwZGF0ZSh7IGFjdGl2ZTogdHJ1ZSB9KS5maW5hbGx5KHdpbi5jbG9zZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB3aW4uY2xvc2UoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBkb3dubG9hZEZpbGUod2luOiBXaW5kb3csIGJsb2JEYXRhOiBhbnksIGJsb2JPcHRpb25zOiBhbnksIGZpbGVOYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKEJyb3dzZXJBcGkuaXNTYWZhcmlBcGkpIHtcbiAgICAgICAgICAgIGNvbnN0IHR5cGUgPSBibG9iT3B0aW9ucyAhPSBudWxsID8gYmxvYk9wdGlvbnMudHlwZSA6IG51bGw7XG4gICAgICAgICAgICBsZXQgZGF0YTogc3RyaW5nID0gbnVsbDtcbiAgICAgICAgICAgIGlmICh0eXBlID09PSAndGV4dC9wbGFpbicgJiYgdHlwZW9mIChibG9iRGF0YSkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgZGF0YSA9IGJsb2JEYXRhO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkYXRhID0gVXRpbHMuZnJvbUJ1ZmZlclRvQjY0KGJsb2JEYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFNhZmFyaUFwcC5zZW5kTWVzc2FnZVRvQXBwKCdkb3dubG9hZEZpbGUnLCBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgYmxvYkRhdGE6IGRhdGEsXG4gICAgICAgICAgICAgICAgYmxvYk9wdGlvbnM6IGJsb2JPcHRpb25zLFxuICAgICAgICAgICAgICAgIGZpbGVOYW1lOiBmaWxlTmFtZSxcbiAgICAgICAgICAgIH0pLCB0cnVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbYmxvYkRhdGFdLCBibG9iT3B0aW9ucyk7XG4gICAgICAgICAgICBpZiAobmF2aWdhdG9yLm1zU2F2ZU9yT3BlbkJsb2IpIHtcbiAgICAgICAgICAgICAgICBuYXZpZ2F0b3IubXNTYXZlQmxvYihibG9iLCBmaWxlTmFtZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGEgPSB3aW4uZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgICAgICAgICAgICAgIGEuaHJlZiA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG4gICAgICAgICAgICAgICAgYS5kb3dubG9hZCA9IGZpbGVOYW1lO1xuICAgICAgICAgICAgICAgIHdpbi5kb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpO1xuICAgICAgICAgICAgICAgIGEuY2xpY2soKTtcbiAgICAgICAgICAgICAgICB3aW4uZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBnYUZpbHRlcigpIHtcbiAgICAgICAgcmV0dXJuIHByb2Nlc3MuZW52LkVOViAhPT0gJ3Byb2R1Y3Rpb24nO1xuICAgIH1cblxuICAgIHN0YXRpYyBnZXRVSUxhbmd1YWdlKHdpbjogV2luZG93KSB7XG4gICAgICAgIHJldHVybiBjaHJvbWUuaTE4bi5nZXRVSUxhbmd1YWdlKCk7XG4gICAgfVxuXG4gICAgc3RhdGljIHJlbG9hZEV4dGVuc2lvbih3aW46IFdpbmRvdykge1xuICAgICAgICBpZiAod2luICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB3aW4ubG9jYXRpb24ucmVsb2FkKHRydWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGNocm9tZS5ydW50aW1lLnJlbG9hZCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIHJlbG9hZE9wZW5XaW5kb3dzKCkge1xuICAgICAgICBjb25zdCB2aWV3cyA9IGNocm9tZS5leHRlbnNpb24uZ2V0Vmlld3MoKSBhcyBXaW5kb3dbXTtcbiAgICAgICAgdmlld3MuZmlsdGVyKHcgPT4gdy5sb2NhdGlvbi5ocmVmICE9IG51bGwpLmZvckVhY2godyA9PiB7XG4gICAgICAgICAgICB3LmxvY2F0aW9uLnJlbG9hZCgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzdGF0aWMgY29ubmVjdE5hdGl2ZShhcHBsaWNhdGlvbjogc3RyaW5nKTogYnJvd3Nlci5ydW50aW1lLlBvcnQgfCBjaHJvbWUucnVudGltZS5Qb3J0IHtcbiAgICAgICAgaWYgKEJyb3dzZXJBcGkuaXNXZWJFeHRlbnNpb25zQXBpKSB7XG4gICAgICAgICAgICByZXR1cm4gYnJvd3Nlci5ydW50aW1lLmNvbm5lY3ROYXRpdmUoYXBwbGljYXRpb24pO1xuICAgICAgICB9IGVsc2UgaWYgKEJyb3dzZXJBcGkuaXNDaHJvbWVBcGkpIHtcbiAgICAgICAgICAgIHJldHVybiBjaHJvbWUucnVudGltZS5jb25uZWN0TmF0aXZlKGFwcGxpY2F0aW9uKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyByZXF1ZXN0UGVybWlzc2lvbihwZXJtaXNzaW9uOiBhbnkpIHtcbiAgICAgICAgaWYgKEJyb3dzZXJBcGkuaXNXZWJFeHRlbnNpb25zQXBpKSB7XG4gICAgICAgICAgICByZXR1cm4gYnJvd3Nlci5wZXJtaXNzaW9ucy5yZXF1ZXN0KHBlcm1pc3Npb24pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBjaHJvbWUucGVybWlzc2lvbnMucmVxdWVzdChwZXJtaXNzaW9uLCByZXNvbHZlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc3RhdGljIGdldFBsYXRmb3JtSW5mbygpOiBQcm9taXNlPGJyb3dzZXIucnVudGltZS5QbGF0Zm9ybUluZm8gfCBjaHJvbWUucnVudGltZS5QbGF0Zm9ybUluZm8+IHtcbiAgICAgICAgaWYgKEJyb3dzZXJBcGkuaXNXZWJFeHRlbnNpb25zQXBpKSB7XG4gICAgICAgICAgICByZXR1cm4gYnJvd3Nlci5ydW50aW1lLmdldFBsYXRmb3JtSW5mbygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgICAgIGNocm9tZS5ydW50aW1lLmdldFBsYXRmb3JtSW5mbyhyZXNvbHZlKTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgQnJvd3NlckFwaSB9IGZyb20gJy4vYnJvd3NlckFwaSc7XG5cbmV4cG9ydCBjbGFzcyBTYWZhcmlBcHAge1xuICAgIHN0YXRpYyBzZW5kTWVzc2FnZVRvQXBwKGNvbW1hbmQ6IHN0cmluZywgZGF0YTogYW55ID0gbnVsbCwgcmVzb2x2ZU5vdyA9IGZhbHNlKTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgaWYgKCFCcm93c2VyQXBpLmlzU2FmYXJpQXBpKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlSWQgPSBub3cuZ2V0VGltZSgpLnRvU3RyaW5nKCkgKyAnXycgKyBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUik7XG4gICAgICAgICAgICAoYnJvd3NlciBhcyBhbnkpLnJ1bnRpbWUuc2VuZE5hdGl2ZU1lc3NhZ2UoJ2NvbS5iaXR3YXJkZW4uZGVza3RvcCcsIHtcbiAgICAgICAgICAgICAgICBpZDogbWVzc2FnZUlkLFxuICAgICAgICAgICAgICAgIGNvbW1hbmQ6IGNvbW1hbmQsXG4gICAgICAgICAgICAgICAgZGF0YTogZGF0YSxcbiAgICAgICAgICAgICAgICByZXNwb25zZURhdGE6IG51bGwsXG4gICAgICAgICAgICB9LCAocmVzcG9uc2U6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIHJlc29sdmUocmVzcG9uc2UpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIEF1dG9maWxsU2NyaXB0IHtcbiAgICBzY3JpcHQ6IHN0cmluZ1tdW10gPSBbXTtcbiAgICBkb2N1bWVudFVVSUQ6IGFueSA9IHt9O1xuICAgIHByb3BlcnRpZXM6IGFueSA9IHt9O1xuICAgIG9wdGlvbnM6IGFueSA9IHt9O1xuICAgIG1ldGFkYXRhOiBhbnkgPSB7fTtcbiAgICBhdXRvc3VibWl0OiBhbnkgPSBudWxsO1xuXG4gICAgY29uc3RydWN0b3IoZG9jdW1lbnRVVUlEOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5kb2N1bWVudFVVSUQgPSBkb2N1bWVudFVVSUQ7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBCcm93c2VyQXBpIH0gZnJvbSAnLi4vLi4vYnJvd3Nlci9icm93c2VyQXBpJztcblxuaW1wb3J0IHsgUGxhdGZvcm1VdGlsc1NlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL3BsYXRmb3JtVXRpbHMuc2VydmljZSc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBQb3B1cFV0aWxzU2VydmljZSB7XG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBwbGF0Zm9ybVV0aWxzU2VydmljZTogUGxhdGZvcm1VdGlsc1NlcnZpY2UpIHsgfVxuXG4gICAgaW5TaWRlYmFyKHdpbjogV2luZG93KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB3aW4ubG9jYXRpb24uc2VhcmNoICE9PSAnJyAmJiB3aW4ubG9jYXRpb24uc2VhcmNoLmluZGV4T2YoJ3VpbG9jYXRpb249c2lkZWJhcicpID4gLTE7XG4gICAgfVxuXG4gICAgaW5UYWIod2luOiBXaW5kb3cpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHdpbi5sb2NhdGlvbi5zZWFyY2ggIT09ICcnICYmIHdpbi5sb2NhdGlvbi5zZWFyY2guaW5kZXhPZigndWlsb2NhdGlvbj10YWInKSA+IC0xO1xuICAgIH1cblxuICAgIGluUG9wb3V0KHdpbjogV2luZG93KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB3aW4ubG9jYXRpb24uc2VhcmNoICE9PSAnJyAmJiB3aW4ubG9jYXRpb24uc2VhcmNoLmluZGV4T2YoJ3VpbG9jYXRpb249cG9wb3V0JykgPiAtMTtcbiAgICB9XG5cbiAgICBpblBvcHVwKHdpbjogV2luZG93KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB3aW4ubG9jYXRpb24uc2VhcmNoID09PSAnJyB8fCB3aW4ubG9jYXRpb24uc2VhcmNoLmluZGV4T2YoJ3VpbG9jYXRpb249JykgPT09IC0xIHx8XG4gICAgICAgICAgICB3aW4ubG9jYXRpb24uc2VhcmNoLmluZGV4T2YoJ3VpbG9jYXRpb249cG9wdXAnKSA+IC0xO1xuICAgIH1cblxuICAgIGdldENvbnRlbnRTY3JvbGxZKHdpbjogV2luZG93LCBzY3JvbGxpbmdDb250YWluZXI6IHN0cmluZyA9ICdjb250ZW50Jyk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSB3aW4uZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoc2Nyb2xsaW5nQ29udGFpbmVyKVswXTtcbiAgICAgICAgcmV0dXJuIGNvbnRlbnQuc2Nyb2xsVG9wO1xuICAgIH1cblxuICAgIHNldENvbnRlbnRTY3JvbGxZKHdpbjogV2luZG93LCBzY3JvbGxZOiBudW1iZXIsIHNjcm9sbGluZ0NvbnRhaW5lcjogc3RyaW5nID0gJ2NvbnRlbnQnKTogdm9pZCB7XG4gICAgICAgIGlmIChzY3JvbGxZICE9IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSB3aW4uZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoc2Nyb2xsaW5nQ29udGFpbmVyKVswXTtcbiAgICAgICAgICAgIGNvbnRlbnQuc2Nyb2xsVG9wID0gc2Nyb2xsWTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHBvcE91dCh3aW46IFdpbmRvdywgaHJlZjogc3RyaW5nID0gbnVsbCk6IHZvaWQge1xuXG4gICAgICAgIGlmIChocmVmID09PSBudWxsKSB7XG4gICAgICAgICAgICBocmVmID0gd2luLmxvY2F0aW9uLmhyZWY7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoKHR5cGVvZiBjaHJvbWUgIT09ICd1bmRlZmluZWQnKSAmJiBjaHJvbWUud2luZG93cyAmJiBjaHJvbWUud2luZG93cy5jcmVhdGUpIHtcbiAgICAgICAgICAgIGlmIChocmVmLmluZGV4T2YoJz91aWxvY2F0aW9uPScpID4gLTEpIHtcbiAgICAgICAgICAgICAgICBocmVmID0gaHJlZi5yZXBsYWNlKCd1aWxvY2F0aW9uPXBvcHVwJywgJ3VpbG9jYXRpb249cG9wb3V0JylcbiAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoJ3VpbG9jYXRpb249dGFiJywgJ3VpbG9jYXRpb249cG9wb3V0JylcbiAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoJ3VpbG9jYXRpb249c2lkZWJhcicsICd1aWxvY2F0aW9uPXBvcG91dCcpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBocmVmUGFydHMgPSBocmVmLnNwbGl0KCcjJyk7XG4gICAgICAgICAgICAgICAgaHJlZiA9IGhyZWZQYXJ0c1swXSArICc/dWlsb2NhdGlvbj1wb3BvdXQnICsgKGhyZWZQYXJ0cy5sZW5ndGggPiAwID8gJyMnICsgaHJlZlBhcnRzWzFdIDogJycpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBib2R5UmVjdCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2JvZHknKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgIGNocm9tZS53aW5kb3dzLmNyZWF0ZSh7XG4gICAgICAgICAgICAgICAgdXJsOiBocmVmLFxuICAgICAgICAgICAgICAgIHR5cGU6ICdwb3B1cCcsXG4gICAgICAgICAgICAgICAgd2lkdGg6IE1hdGgucm91bmQoYm9keVJlY3Qud2lkdGggPyBib2R5UmVjdC53aWR0aCArIDYwIDogMzc1KSxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IE1hdGgucm91bmQoYm9keVJlY3QuaGVpZ2h0IHx8IDYwMCksXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuaW5Qb3B1cCh3aW4pKSB7XG4gICAgICAgICAgICAgICAgQnJvd3NlckFwaS5jbG9zZVBvcHVwKHdpbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoKHR5cGVvZiBjaHJvbWUgIT09ICd1bmRlZmluZWQnKSAmJiBjaHJvbWUudGFicyAmJiBjaHJvbWUudGFicy5jcmVhdGUpIHtcbiAgICAgICAgICAgIGhyZWYgPSBocmVmLnJlcGxhY2UoJ3VpbG9jYXRpb249cG9wdXAnLCAndWlsb2NhdGlvbj10YWInKVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKCd1aWxvY2F0aW9uPXBvcG91dCcsICd1aWxvY2F0aW9uPXRhYicpXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoJ3VpbG9jYXRpb249c2lkZWJhcicsICd1aWxvY2F0aW9uPXRhYicpO1xuICAgICAgICAgICAgY2hyb21lLnRhYnMuY3JlYXRlKHtcbiAgICAgICAgICAgICAgICB1cmw6IGhyZWYsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCB7IENpcGhlclNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL2NpcGhlci5zZXJ2aWNlJztcbmltcG9ydCB7IEV2ZW50U2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvZXZlbnQuc2VydmljZSc7XG5pbXBvcnQgeyBMb2dTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9sb2cuc2VydmljZSc7XG5pbXBvcnQgeyBUb3RwU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvdG90cC5zZXJ2aWNlJztcbmltcG9ydCB7IFVzZXJTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy91c2VyLnNlcnZpY2UnO1xuXG5pbXBvcnQgeyBBdXRvZmlsbFNlcnZpY2UgYXMgQXV0b2ZpbGxTZXJ2aWNlSW50ZXJmYWNlIH0gZnJvbSAnLi9hYnN0cmFjdGlvbnMvYXV0b2ZpbGwuc2VydmljZSc7XG5cbmltcG9ydCB7IENpcGhlclJlcHJvbXB0VHlwZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9lbnVtcy9jaXBoZXJSZXByb21wdFR5cGUnO1xuaW1wb3J0IHsgQ2lwaGVyVHlwZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9lbnVtcy9jaXBoZXJUeXBlJztcbmltcG9ydCB7IEV2ZW50VHlwZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9lbnVtcy9ldmVudFR5cGUnO1xuaW1wb3J0IHsgRmllbGRUeXBlIH0gZnJvbSAnanNsaWItY29tbW9uL2VudW1zL2ZpZWxkVHlwZSc7XG5cbmltcG9ydCB7IENpcGhlclZpZXcgfSBmcm9tICdqc2xpYi1jb21tb24vbW9kZWxzL3ZpZXcvY2lwaGVyVmlldyc7XG5pbXBvcnQgeyBGaWVsZFZpZXcgfSBmcm9tICdqc2xpYi1jb21tb24vbW9kZWxzL3ZpZXcvZmllbGRWaWV3JztcblxuaW1wb3J0IEF1dG9maWxsRmllbGQgZnJvbSAnLi4vbW9kZWxzL2F1dG9maWxsRmllbGQnO1xuaW1wb3J0IEF1dG9maWxsUGFnZURldGFpbHMgZnJvbSAnLi4vbW9kZWxzL2F1dG9maWxsUGFnZURldGFpbHMnO1xuaW1wb3J0IEF1dG9maWxsU2NyaXB0IGZyb20gJy4uL21vZGVscy9hdXRvZmlsbFNjcmlwdCc7XG5cbmltcG9ydCB7IEJyb3dzZXJBcGkgfSBmcm9tICcuLi9icm93c2VyL2Jyb3dzZXJBcGknO1xuXG5jb25zdCBDYXJkQXR0cmlidXRlczogc3RyaW5nW10gPSBbJ2F1dG9Db21wbGV0ZVR5cGUnLCAnZGF0YS1zdHJpcGUnLCAnaHRtbE5hbWUnLCAnaHRtbElEJywgJ2xhYmVsLXRhZycsXG4gICAgJ3BsYWNlaG9sZGVyJywgJ2xhYmVsLWxlZnQnLCAnbGFiZWwtdG9wJywgJ2RhdGEtcmVjdXJseSddO1xuXG5jb25zdCBDYXJkQXR0cmlidXRlc0V4dGVuZGVkOiBzdHJpbmdbXSA9IFsuLi5DYXJkQXR0cmlidXRlcywgJ2xhYmVsLXJpZ2h0J107XG5cbmNvbnN0IElkZW50aXR5QXR0cmlidXRlczogc3RyaW5nW10gPSBbJ2F1dG9Db21wbGV0ZVR5cGUnLCAnZGF0YS1zdHJpcGUnLCAnaHRtbE5hbWUnLCAnaHRtbElEJywgJ2xhYmVsLXRhZycsXG4gICAgJ3BsYWNlaG9sZGVyJywgJ2xhYmVsLWxlZnQnLCAnbGFiZWwtdG9wJywgJ2RhdGEtcmVjdXJseSddO1xuXG5jb25zdCBVc2VybmFtZUZpZWxkTmFtZXM6IHN0cmluZ1tdID0gW1xuICAgIC8vIEVuZ2xpc2hcbiAgICAndXNlcm5hbWUnLCAndXNlciBuYW1lJywgJ2VtYWlsJywgJ2VtYWlsIGFkZHJlc3MnLCAnZS1tYWlsJywgJ2UtbWFpbCBhZGRyZXNzJywgJ3VzZXJpZCcsICd1c2VyIGlkJyxcbiAgICAnY3VzdG9tZXIgaWQnLCAnbG9naW4gaWQnLFxuICAgIC8vIEdlcm1hblxuICAgICdiZW51dHplcm5hbWUnLCAnYmVudXR6ZXIgbmFtZScsICdlbWFpbCBhZHJlc3NlJywgJ2UtbWFpbCBhZHJlc3NlJywgJ2JlbnV0emVyaWQnLCAnYmVudXR6ZXIgaWQnXTtcblxuY29uc3QgRmlyc3RuYW1lRmllbGROYW1lczogc3RyaW5nW10gPSBbXG4gICAgLy8gRW5nbGlzaFxuICAgICdmLW5hbWUnLCAnZmlyc3QtbmFtZScsICdnaXZlbi1uYW1lJywgJ2ZpcnN0LW4nLFxuICAgIC8vIEdlcm1hblxuICAgICd2b3JuYW1lJyxcbl07XG5cbmNvbnN0IExhc3RuYW1lRmllbGROYW1lczogc3RyaW5nW10gPSBbXG4gICAgLy8gRW5nbGlzaFxuICAgICdsLW5hbWUnLCAnbGFzdC1uYW1lJywgJ3MtbmFtZScsICdzdXJuYW1lJywgJ2ZhbWlseS1uYW1lJywgJ2ZhbWlseS1uJywgJ2xhc3QtbicsXG4gICAgLy8gR2VybWFuXG4gICAgJ25hY2huYW1lJywgJ2ZhbWlsaWVubmFtZScsXG5dO1xuXG5jb25zdCBFeGNsdWRlZEF1dG9maWxsVHlwZXM6IHN0cmluZ1tdID0gWydyYWRpbycsICdjaGVja2JveCcsICdoaWRkZW4nLCAnZmlsZScsICdidXR0b24nLCAnaW1hZ2UnLCAncmVzZXQnLCAnc2VhcmNoJ107XG5cbi8vIEVhY2ggaW5kZXggcmVwcmVzZW50cyBhIGxhbmd1YWdlLiBUaGVzZSB0aHJlZSBhcnJheXMgc2hvdWxkIGFsbCBiZSB0aGUgc2FtZSBsZW5ndGguXG4vLyAwOiBFbmdsaXNoLCAxOiBEYW5pc2gsIDI6IEdlcm1hbi9EdXRjaCwgMzogRnJlbmNoL1NwYW5pc2gvSXRhbGlhbiwgNDogUnVzc2lhbiwgNTogUG9ydHVndWVzZVxuY29uc3QgTW9udGhBYmJyID0gWydtbScsICdtbScsICdtbScsICdtbScsICdtbScsICdtbSddO1xuY29uc3QgWWVhckFiYnJTaG9ydCA9IFsneXknLCAnw6XDpScsICdqaicsICdhYScsICfQs9CzJywgJ3JyJ107XG5jb25zdCBZZWFyQWJickxvbmcgPSBbJ3l5eXknLCAnw6XDpcOlw6UnLCAnampqaicsICdhYScsICfQs9Cz0LPQsycsICdycnJyJ107XG5cbmNvbnN0IE9wZXJhdGlvbkRlbGF5cyA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KFtcbiAgICBbJ2J1enpzcHJvdXQuY29tJywgMTAwXSxcbl0pO1xuXG4vKiB0c2xpbnQ6ZGlzYWJsZSAqL1xuY29uc3QgSXNvQ291bnRyaWVzOiB7IFtpZDogc3RyaW5nXTogc3RyaW5nOyB9ID0ge1xuICAgIGFmZ2hhbmlzdGFuOiBcIkFGXCIsIFwiYWxhbmQgaXNsYW5kc1wiOiBcIkFYXCIsIGFsYmFuaWE6IFwiQUxcIiwgYWxnZXJpYTogXCJEWlwiLCBcImFtZXJpY2FuIHNhbW9hXCI6IFwiQVNcIiwgYW5kb3JyYTogXCJBRFwiLFxuICAgIGFuZ29sYTogXCJBT1wiLCBhbmd1aWxsYTogXCJBSVwiLCBhbnRhcmN0aWNhOiBcIkFRXCIsIFwiYW50aWd1YSBhbmQgYmFyYnVkYVwiOiBcIkFHXCIsIGFyZ2VudGluYTogXCJBUlwiLCBhcm1lbmlhOiBcIkFNXCIsXG4gICAgYXJ1YmE6IFwiQVdcIiwgYXVzdHJhbGlhOiBcIkFVXCIsIGF1c3RyaWE6IFwiQVRcIiwgYXplcmJhaWphbjogXCJBWlwiLCBiYWhhbWFzOiBcIkJTXCIsIGJhaHJhaW46IFwiQkhcIiwgYmFuZ2xhZGVzaDogXCJCRFwiLFxuICAgIGJhcmJhZG9zOiBcIkJCXCIsIGJlbGFydXM6IFwiQllcIiwgYmVsZ2l1bTogXCJCRVwiLCBiZWxpemU6IFwiQlpcIiwgYmVuaW46IFwiQkpcIiwgYmVybXVkYTogXCJCTVwiLCBiaHV0YW46IFwiQlRcIixcbiAgICBib2xpdmlhOiBcIkJPXCIsIFwiYm9zbmlhIGFuZCBoZXJ6ZWdvdmluYVwiOiBcIkJBXCIsIGJvdHN3YW5hOiBcIkJXXCIsIFwiYm91dmV0IGlzbGFuZFwiOiBcIkJWXCIsIGJyYXppbDogXCJCUlwiLFxuICAgIFwiYnJpdGlzaCBpbmRpYW4gb2NlYW4gdGVycml0b3J5XCI6IFwiSU9cIiwgXCJicnVuZWkgZGFydXNzYWxhbVwiOiBcIkJOXCIsIGJ1bGdhcmlhOiBcIkJHXCIsIFwiYnVya2luYSBmYXNvXCI6IFwiQkZcIixcbiAgICBidXJ1bmRpOiBcIkJJXCIsIGNhbWJvZGlhOiBcIktIXCIsIGNhbWVyb29uOiBcIkNNXCIsIGNhbmFkYTogXCJDQVwiLCBcImNhcGUgdmVyZGVcIjogXCJDVlwiLCBcImNheW1hbiBpc2xhbmRzXCI6IFwiS1lcIixcbiAgICBcImNlbnRyYWwgYWZyaWNhbiByZXB1YmxpY1wiOiBcIkNGXCIsIGNoYWQ6IFwiVERcIiwgY2hpbGU6IFwiQ0xcIiwgY2hpbmE6IFwiQ05cIiwgXCJjaHJpc3RtYXMgaXNsYW5kXCI6IFwiQ1hcIixcbiAgICBcImNvY29zIChrZWVsaW5nKSBpc2xhbmRzXCI6IFwiQ0NcIiwgY29sb21iaWE6IFwiQ09cIiwgY29tb3JvczogXCJLTVwiLCBjb25nbzogXCJDR1wiLCBcImNvbmdvLCBkZW1vY3JhdGljIHJlcHVibGljXCI6IFwiQ0RcIixcbiAgICBcImNvb2sgaXNsYW5kc1wiOiBcIkNLXCIsIFwiY29zdGEgcmljYVwiOiBcIkNSXCIsIFwiY290ZSBkJ2l2b2lyZVwiOiBcIkNJXCIsIGNyb2F0aWE6IFwiSFJcIiwgY3ViYTogXCJDVVwiLCBjeXBydXM6IFwiQ1lcIixcbiAgICBcImN6ZWNoIHJlcHVibGljXCI6IFwiQ1pcIiwgZGVubWFyazogXCJES1wiLCBkamlib3V0aTogXCJESlwiLCBkb21pbmljYTogXCJETVwiLCBcImRvbWluaWNhbiByZXB1YmxpY1wiOiBcIkRPXCIsIGVjdWFkb3I6IFwiRUNcIixcbiAgICBlZ3lwdDogXCJFR1wiLCBcImVsIHNhbHZhZG9yXCI6IFwiU1ZcIiwgXCJlcXVhdG9yaWFsIGd1aW5lYVwiOiBcIkdRXCIsIGVyaXRyZWE6IFwiRVJcIiwgZXN0b25pYTogXCJFRVwiLCBldGhpb3BpYTogXCJFVFwiLFxuICAgIFwiZmFsa2xhbmQgaXNsYW5kc1wiOiBcIkZLXCIsIFwiZmFyb2UgaXNsYW5kc1wiOiBcIkZPXCIsIGZpamk6IFwiRkpcIiwgZmlubGFuZDogXCJGSVwiLCBmcmFuY2U6IFwiRlJcIiwgXCJmcmVuY2ggZ3VpYW5hXCI6IFwiR0ZcIixcbiAgICBcImZyZW5jaCBwb2x5bmVzaWFcIjogXCJQRlwiLCBcImZyZW5jaCBzb3V0aGVybiB0ZXJyaXRvcmllc1wiOiBcIlRGXCIsIGdhYm9uOiBcIkdBXCIsIGdhbWJpYTogXCJHTVwiLCBnZW9yZ2lhOiBcIkdFXCIsXG4gICAgZ2VybWFueTogXCJERVwiLCBnaGFuYTogXCJHSFwiLCBnaWJyYWx0YXI6IFwiR0lcIiwgZ3JlZWNlOiBcIkdSXCIsIGdyZWVubGFuZDogXCJHTFwiLCBncmVuYWRhOiBcIkdEXCIsIGd1YWRlbG91cGU6IFwiR1BcIixcbiAgICBndWFtOiBcIkdVXCIsIGd1YXRlbWFsYTogXCJHVFwiLCBndWVybnNleTogXCJHR1wiLCBndWluZWE6IFwiR05cIiwgXCJndWluZWEtYmlzc2F1XCI6IFwiR1dcIiwgZ3V5YW5hOiBcIkdZXCIsIGhhaXRpOiBcIkhUXCIsXG4gICAgXCJoZWFyZCBpc2xhbmQgJiBtY2RvbmFsZCBpc2xhbmRzXCI6IFwiSE1cIiwgXCJob2x5IHNlZSAodmF0aWNhbiBjaXR5IHN0YXRlKVwiOiBcIlZBXCIsIGhvbmR1cmFzOiBcIkhOXCIsIFwiaG9uZyBrb25nXCI6IFwiSEtcIixcbiAgICBodW5nYXJ5OiBcIkhVXCIsIGljZWxhbmQ6IFwiSVNcIiwgaW5kaWE6IFwiSU5cIiwgaW5kb25lc2lhOiBcIklEXCIsIFwiaXJhbiwgaXNsYW1pYyByZXB1YmxpYyBvZlwiOiBcIklSXCIsIGlyYXE6IFwiSVFcIixcbiAgICBpcmVsYW5kOiBcIklFXCIsIFwiaXNsZSBvZiBtYW5cIjogXCJJTVwiLCBpc3JhZWw6IFwiSUxcIiwgaXRhbHk6IFwiSVRcIiwgamFtYWljYTogXCJKTVwiLCBqYXBhbjogXCJKUFwiLCBqZXJzZXk6IFwiSkVcIixcbiAgICBqb3JkYW46IFwiSk9cIiwga2F6YWtoc3RhbjogXCJLWlwiLCBrZW55YTogXCJLRVwiLCBraXJpYmF0aTogXCJLSVwiLCBcInJlcHVibGljIG9mIGtvcmVhXCI6IFwiS1JcIiwgXCJzb3V0aCBrb3JlYVwiOiBcIktSXCIsXG4gICAgXCJkZW1vY3JhdGljIHBlb3BsZSdzIHJlcHVibGljIG9mIGtvcmVhXCI6IFwiS1BcIiwgXCJub3J0aCBrb3JlYVwiOiBcIktQXCIsIGt1d2FpdDogXCJLV1wiLCBreXJneXpzdGFuOiBcIktHXCIsXG4gICAgXCJsYW8gcGVvcGxlJ3MgZGVtb2NyYXRpYyByZXB1YmxpY1wiOiBcIkxBXCIsIGxhdHZpYTogXCJMVlwiLCBsZWJhbm9uOiBcIkxCXCIsIGxlc290aG86IFwiTFNcIiwgbGliZXJpYTogXCJMUlwiLFxuICAgIFwibGlieWFuIGFyYWIgamFtYWhpcml5YVwiOiBcIkxZXCIsIGxpZWNodGVuc3RlaW46IFwiTElcIiwgbGl0aHVhbmlhOiBcIkxUXCIsIGx1eGVtYm91cmc6IFwiTFVcIiwgbWFjYW86IFwiTU9cIixcbiAgICBtYWNlZG9uaWE6IFwiTUtcIiwgbWFkYWdhc2NhcjogXCJNR1wiLCBtYWxhd2k6IFwiTVdcIiwgbWFsYXlzaWE6IFwiTVlcIiwgbWFsZGl2ZXM6IFwiTVZcIiwgbWFsaTogXCJNTFwiLCBtYWx0YTogXCJNVFwiLFxuICAgIFwibWFyc2hhbGwgaXNsYW5kc1wiOiBcIk1IXCIsIG1hcnRpbmlxdWU6IFwiTVFcIiwgbWF1cml0YW5pYTogXCJNUlwiLCBtYXVyaXRpdXM6IFwiTVVcIiwgbWF5b3R0ZTogXCJZVFwiLCBtZXhpY286IFwiTVhcIixcbiAgICBcIm1pY3JvbmVzaWEsIGZlZGVyYXRlZCBzdGF0ZXMgb2ZcIjogXCJGTVwiLCBtb2xkb3ZhOiBcIk1EXCIsIG1vbmFjbzogXCJNQ1wiLCBtb25nb2xpYTogXCJNTlwiLCBtb250ZW5lZ3JvOiBcIk1FXCIsXG4gICAgbW9udHNlcnJhdDogXCJNU1wiLCBtb3JvY2NvOiBcIk1BXCIsIG1vemFtYmlxdWU6IFwiTVpcIiwgbXlhbm1hcjogXCJNTVwiLCBuYW1pYmlhOiBcIk5BXCIsIG5hdXJ1OiBcIk5SXCIsIG5lcGFsOiBcIk5QXCIsXG4gICAgbmV0aGVybGFuZHM6IFwiTkxcIiwgXCJuZXRoZXJsYW5kcyBhbnRpbGxlc1wiOiBcIkFOXCIsIFwibmV3IGNhbGVkb25pYVwiOiBcIk5DXCIsIFwibmV3IHplYWxhbmRcIjogXCJOWlwiLCBuaWNhcmFndWE6IFwiTklcIixcbiAgICBuaWdlcjogXCJORVwiLCBuaWdlcmlhOiBcIk5HXCIsIG5pdWU6IFwiTlVcIiwgXCJub3Jmb2xrIGlzbGFuZFwiOiBcIk5GXCIsIFwibm9ydGhlcm4gbWFyaWFuYSBpc2xhbmRzXCI6IFwiTVBcIiwgbm9yd2F5OiBcIk5PXCIsXG4gICAgb21hbjogXCJPTVwiLCBwYWtpc3RhbjogXCJQS1wiLCBwYWxhdTogXCJQV1wiLCBcInBhbGVzdGluaWFuIHRlcnJpdG9yeSwgb2NjdXBpZWRcIjogXCJQU1wiLCBwYW5hbWE6IFwiUEFcIixcbiAgICBcInBhcHVhIG5ldyBndWluZWFcIjogXCJQR1wiLCBwYXJhZ3VheTogXCJQWVwiLCBwZXJ1OiBcIlBFXCIsIHBoaWxpcHBpbmVzOiBcIlBIXCIsIHBpdGNhaXJuOiBcIlBOXCIsIHBvbGFuZDogXCJQTFwiLFxuICAgIHBvcnR1Z2FsOiBcIlBUXCIsIFwicHVlcnRvIHJpY29cIjogXCJQUlwiLCBxYXRhcjogXCJRQVwiLCByZXVuaW9uOiBcIlJFXCIsIHJvbWFuaWE6IFwiUk9cIiwgXCJydXNzaWFuIGZlZGVyYXRpb25cIjogXCJSVVwiLFxuICAgIHJ3YW5kYTogXCJSV1wiLCBcInNhaW50IGJhcnRoZWxlbXlcIjogXCJCTFwiLCBcInNhaW50IGhlbGVuYVwiOiBcIlNIXCIsIFwic2FpbnQga2l0dHMgYW5kIG5ldmlzXCI6IFwiS05cIiwgXCJzYWludCBsdWNpYVwiOiBcIkxDXCIsXG4gICAgXCJzYWludCBtYXJ0aW5cIjogXCJNRlwiLCBcInNhaW50IHBpZXJyZSBhbmQgbWlxdWVsb25cIjogXCJQTVwiLCBcInNhaW50IHZpbmNlbnQgYW5kIGdyZW5hZGluZXNcIjogXCJWQ1wiLCBzYW1vYTogXCJXU1wiLFxuICAgIFwic2FuIG1hcmlub1wiOiBcIlNNXCIsIFwic2FvIHRvbWUgYW5kIHByaW5jaXBlXCI6IFwiU1RcIiwgXCJzYXVkaSBhcmFiaWFcIjogXCJTQVwiLCBzZW5lZ2FsOiBcIlNOXCIsIHNlcmJpYTogXCJSU1wiLFxuICAgIHNleWNoZWxsZXM6IFwiU0NcIiwgXCJzaWVycmEgbGVvbmVcIjogXCJTTFwiLCBzaW5nYXBvcmU6IFwiU0dcIiwgc2xvdmFraWE6IFwiU0tcIiwgc2xvdmVuaWE6IFwiU0lcIiwgXCJzb2xvbW9uIGlzbGFuZHNcIjogXCJTQlwiLFxuICAgIHNvbWFsaWE6IFwiU09cIiwgXCJzb3V0aCBhZnJpY2FcIjogXCJaQVwiLCBcInNvdXRoIGdlb3JnaWEgYW5kIHNhbmR3aWNoIGlzbC5cIjogXCJHU1wiLCBzcGFpbjogXCJFU1wiLCBcInNyaSBsYW5rYVwiOiBcIkxLXCIsXG4gICAgc3VkYW46IFwiU0RcIiwgc3VyaW5hbWU6IFwiU1JcIiwgXCJzdmFsYmFyZCBhbmQgamFuIG1heWVuXCI6IFwiU0pcIiwgc3dhemlsYW5kOiBcIlNaXCIsIHN3ZWRlbjogXCJTRVwiLCBzd2l0emVybGFuZDogXCJDSFwiLFxuICAgIFwic3lyaWFuIGFyYWIgcmVwdWJsaWNcIjogXCJTWVwiLCB0YWl3YW46IFwiVFdcIiwgdGFqaWtpc3RhbjogXCJUSlwiLCB0YW56YW5pYTogXCJUWlwiLCB0aGFpbGFuZDogXCJUSFwiLCBcInRpbW9yLWxlc3RlXCI6IFwiVExcIixcbiAgICB0b2dvOiBcIlRHXCIsIHRva2VsYXU6IFwiVEtcIiwgdG9uZ2E6IFwiVE9cIiwgXCJ0cmluaWRhZCBhbmQgdG9iYWdvXCI6IFwiVFRcIiwgdHVuaXNpYTogXCJUTlwiLCB0dXJrZXk6IFwiVFJcIixcbiAgICB0dXJrbWVuaXN0YW46IFwiVE1cIiwgXCJ0dXJrcyBhbmQgY2FpY29zIGlzbGFuZHNcIjogXCJUQ1wiLCB0dXZhbHU6IFwiVFZcIiwgdWdhbmRhOiBcIlVHXCIsIHVrcmFpbmU6IFwiVUFcIixcbiAgICBcInVuaXRlZCBhcmFiIGVtaXJhdGVzXCI6IFwiQUVcIiwgXCJ1bml0ZWQga2luZ2RvbVwiOiBcIkdCXCIsIFwidW5pdGVkIHN0YXRlc1wiOiBcIlVTXCIsXG4gICAgXCJ1bml0ZWQgc3RhdGVzIG91dGx5aW5nIGlzbGFuZHNcIjogXCJVTVwiLCB1cnVndWF5OiBcIlVZXCIsIHV6YmVraXN0YW46IFwiVVpcIiwgdmFudWF0dTogXCJWVVwiLCB2ZW5lenVlbGE6IFwiVkVcIixcbiAgICB2aWV0bmFtOiBcIlZOXCIsIFwidmlyZ2luIGlzbGFuZHMsIGJyaXRpc2hcIjogXCJWR1wiLCBcInZpcmdpbiBpc2xhbmRzLCB1LnMuXCI6IFwiVklcIiwgXCJ3YWxsaXMgYW5kIGZ1dHVuYVwiOiBcIldGXCIsXG4gICAgXCJ3ZXN0ZXJuIHNhaGFyYVwiOiBcIkVIXCIsIHllbWVuOiBcIllFXCIsIHphbWJpYTogXCJaTVwiLCB6aW1iYWJ3ZTogXCJaV1wiLFxufTtcblxuY29uc3QgSXNvU3RhdGVzOiB7IFtpZDogc3RyaW5nXTogc3RyaW5nOyB9ID0ge1xuICAgIGFsYWJhbWE6ICdBTCcsIGFsYXNrYTogJ0FLJywgJ2FtZXJpY2FuIHNhbW9hJzogJ0FTJywgYXJpem9uYTogJ0FaJywgYXJrYW5zYXM6ICdBUicsIGNhbGlmb3JuaWE6ICdDQScsXG4gICAgY29sb3JhZG86ICdDTycsIGNvbm5lY3RpY3V0OiAnQ1QnLCBkZWxhd2FyZTogJ0RFJywgJ2Rpc3RyaWN0IG9mIGNvbHVtYmlhJzogJ0RDJyxcbiAgICAnZmVkZXJhdGVkIHN0YXRlcyBvZiBtaWNyb25lc2lhJzogJ0ZNJywgZmxvcmlkYTogJ0ZMJywgZ2VvcmdpYTogJ0dBJywgZ3VhbTogJ0dVJywgaGF3YWlpOiAnSEknLCBpZGFobzogJ0lEJyxcbiAgICBpbGxpbm9pczogJ0lMJywgaW5kaWFuYTogJ0lOJywgaW93YTogJ0lBJywga2Fuc2FzOiAnS1MnLCBrZW50dWNreTogJ0tZJywgbG91aXNpYW5hOiAnTEEnLCBtYWluZTogJ01FJyxcbiAgICAnbWFyc2hhbGwgaXNsYW5kcyc6ICdNSCcsIG1hcnlsYW5kOiAnTUQnLCBtYXNzYWNodXNldHRzOiAnTUEnLCBtaWNoaWdhbjogJ01JJywgbWlubmVzb3RhOiAnTU4nLCBtaXNzaXNzaXBwaTogJ01TJyxcbiAgICBtaXNzb3VyaTogJ01PJywgbW9udGFuYTogJ01UJywgbmVicmFza2E6ICdORScsIG5ldmFkYTogJ05WJywgJ25ldyBoYW1wc2hpcmUnOiAnTkgnLCAnbmV3IGplcnNleSc6ICdOSicsXG4gICAgJ25ldyBtZXhpY28nOiAnTk0nLCAnbmV3IHlvcmsnOiAnTlknLCAnbm9ydGggY2Fyb2xpbmEnOiAnTkMnLCAnbm9ydGggZGFrb3RhJzogJ05EJyxcbiAgICAnbm9ydGhlcm4gbWFyaWFuYSBpc2xhbmRzJzogJ01QJywgb2hpbzogJ09IJywgb2tsYWhvbWE6ICdPSycsIG9yZWdvbjogJ09SJywgcGFsYXU6ICdQVycsIHBlbm5zeWx2YW5pYTogJ1BBJyxcbiAgICAncHVlcnRvIHJpY28nOiAnUFInLCAncmhvZGUgaXNsYW5kJzogJ1JJJywgJ3NvdXRoIGNhcm9saW5hJzogJ1NDJywgJ3NvdXRoIGRha290YSc6ICdTRCcsIHRlbm5lc3NlZTogJ1ROJyxcbiAgICB0ZXhhczogJ1RYJywgdXRhaDogJ1VUJywgdmVybW9udDogJ1ZUJywgJ3ZpcmdpbiBpc2xhbmRzJzogJ1ZJJywgdmlyZ2luaWE6ICdWQScsIHdhc2hpbmd0b246ICdXQScsXG4gICAgJ3dlc3QgdmlyZ2luaWEnOiAnV1YnLCB3aXNjb25zaW46ICdXSScsIHd5b21pbmc6ICdXWScsXG59O1xuXG52YXIgSXNvUHJvdmluY2VzOiB7IFtpZDogc3RyaW5nXTogc3RyaW5nOyB9ID0ge1xuICAgIGFsYmVydGE6ICdBQicsICdicml0aXNoIGNvbHVtYmlhJzogJ0JDJywgbWFuaXRvYmE6ICdNQicsICduZXcgYnJ1bnN3aWNrJzogJ05CJywgJ25ld2ZvdW5kbGFuZCBhbmQgbGFicmFkb3InOiAnTkwnLFxuICAgICdub3ZhIHNjb3RpYSc6ICdOUycsIG9udGFyaW86ICdPTicsICdwcmluY2UgZWR3YXJkIGlzbGFuZCc6ICdQRScsIHF1ZWJlYzogJ1FDJywgc2Fza2F0Y2hld2FuOiAnU0snLFxufTtcbi8qIHRzbGludDplbmFibGUgKi9cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQXV0b2ZpbGxTZXJ2aWNlIGltcGxlbWVudHMgQXV0b2ZpbGxTZXJ2aWNlSW50ZXJmYWNlIHtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgY2lwaGVyU2VydmljZTogQ2lwaGVyU2VydmljZSwgcHJpdmF0ZSB1c2VyU2VydmljZTogVXNlclNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgdG90cFNlcnZpY2U6IFRvdHBTZXJ2aWNlLCBwcml2YXRlIGV2ZW50U2VydmljZTogRXZlbnRTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGxvZ1NlcnZpY2U6IExvZ1NlcnZpY2UpIHsgfVxuXG4gICAgZ2V0Rm9ybXNXaXRoUGFzc3dvcmRGaWVsZHMocGFnZURldGFpbHM6IEF1dG9maWxsUGFnZURldGFpbHMpOiBhbnlbXSB7XG4gICAgICAgIGNvbnN0IGZvcm1EYXRhOiBhbnlbXSA9IFtdO1xuXG4gICAgICAgIGNvbnN0IHBhc3N3b3JkRmllbGRzID0gdGhpcy5sb2FkUGFzc3dvcmRGaWVsZHMocGFnZURldGFpbHMsIHRydWUsIHRydWUsIGZhbHNlLCBmYWxzZSk7XG4gICAgICAgIGlmIChwYXNzd29yZEZpZWxkcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBmb3JtRGF0YTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgZm9ybUtleSBpbiBwYWdlRGV0YWlscy5mb3Jtcykge1xuICAgICAgICAgICAgaWYgKCFwYWdlRGV0YWlscy5mb3Jtcy5oYXNPd25Qcm9wZXJ0eShmb3JtS2V5KSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBmb3JtUGFzc3dvcmRGaWVsZHMgPSBwYXNzd29yZEZpZWxkcy5maWx0ZXIocGYgPT4gZm9ybUtleSA9PT0gcGYuZm9ybSk7XG4gICAgICAgICAgICBpZiAoZm9ybVBhc3N3b3JkRmllbGRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBsZXQgdWYgPSB0aGlzLmZpbmRVc2VybmFtZUZpZWxkKHBhZ2VEZXRhaWxzLCBmb3JtUGFzc3dvcmRGaWVsZHNbMF0sIGZhbHNlLCBmYWxzZSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIGlmICh1ZiA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIG5vdCBhYmxlIHRvIGZpbmQgYW55IHZpZXdhYmxlIHVzZXJuYW1lIGZpZWxkcy4gbWF5YmUgdGhlcmUgYXJlIHNvbWUgXCJoaWRkZW5cIiBvbmVzP1xuICAgICAgICAgICAgICAgICAgICB1ZiA9IHRoaXMuZmluZFVzZXJuYW1lRmllbGQocGFnZURldGFpbHMsIGZvcm1QYXNzd29yZEZpZWxkc1swXSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmb3JtRGF0YS5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgZm9ybTogcGFnZURldGFpbHMuZm9ybXNbZm9ybUtleV0sXG4gICAgICAgICAgICAgICAgICAgIHBhc3N3b3JkOiBmb3JtUGFzc3dvcmRGaWVsZHNbMF0sXG4gICAgICAgICAgICAgICAgICAgIHVzZXJuYW1lOiB1ZixcbiAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmRzOiBmb3JtUGFzc3dvcmRGaWVsZHMsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZm9ybURhdGE7XG4gICAgfVxuXG4gICAgYXN5bmMgZG9BdXRvRmlsbChvcHRpb25zOiBhbnkpIHtcbiAgICAgICAgbGV0IHRvdHBQcm9taXNlOiBQcm9taXNlPHN0cmluZz4gPSBudWxsO1xuICAgICAgICBjb25zdCB0YWIgPSBhd2FpdCB0aGlzLmdldEFjdGl2ZVRhYigpO1xuICAgICAgICBpZiAoIXRhYiB8fCAhb3B0aW9ucy5jaXBoZXIgfHwgIW9wdGlvbnMucGFnZURldGFpbHMgfHwgIW9wdGlvbnMucGFnZURldGFpbHMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdGhpbmcgdG8gYXV0by1maWxsLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2FuQWNjZXNzUHJlbWl1bSA9IGF3YWl0IHRoaXMudXNlclNlcnZpY2UuY2FuQWNjZXNzUHJlbWl1bSgpO1xuICAgICAgICBsZXQgZGlkQXV0b2ZpbGwgPSBmYWxzZTtcbiAgICAgICAgb3B0aW9ucy5wYWdlRGV0YWlscy5mb3JFYWNoKChwZDogYW55KSA9PiB7XG4gICAgICAgICAgICAvLyBtYWtlIHN1cmUgd2UncmUgc3RpbGwgb24gY29ycmVjdCB0YWJcbiAgICAgICAgICAgIGlmIChwZC50YWIuaWQgIT09IHRhYi5pZCB8fCBwZC50YWIudXJsICE9PSB0YWIudXJsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBmaWxsU2NyaXB0ID0gdGhpcy5nZW5lcmF0ZUZpbGxTY3JpcHQocGQuZGV0YWlscywge1xuICAgICAgICAgICAgICAgIHNraXBVc2VybmFtZU9ubHlGaWxsOiBvcHRpb25zLnNraXBVc2VybmFtZU9ubHlGaWxsIHx8IGZhbHNlLFxuICAgICAgICAgICAgICAgIG9ubHlFbXB0eUZpZWxkczogb3B0aW9ucy5vbmx5RW1wdHlGaWVsZHMgfHwgZmFsc2UsXG4gICAgICAgICAgICAgICAgb25seVZpc2libGVGaWVsZHM6IG9wdGlvbnMub25seVZpc2libGVGaWVsZHMgfHwgZmFsc2UsXG4gICAgICAgICAgICAgICAgZmlsbE5ld1Bhc3N3b3JkOiBvcHRpb25zLmZpbGxOZXdQYXNzd29yZCB8fCBmYWxzZSxcbiAgICAgICAgICAgICAgICBjaXBoZXI6IG9wdGlvbnMuY2lwaGVyLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmICghZmlsbFNjcmlwdCB8fCAhZmlsbFNjcmlwdC5zY3JpcHQgfHwgIWZpbGxTY3JpcHQuc2NyaXB0Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQWRkIGEgc21hbGwgZGVsYXkgYmV0d2VlbiBvcGVyYXRpb25zXG4gICAgICAgICAgICBmaWxsU2NyaXB0LnByb3BlcnRpZXMuZGVsYXlfYmV0d2Vlbl9vcGVyYXRpb25zID0gMjA7XG5cbiAgICAgICAgICAgIGRpZEF1dG9maWxsID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmICghb3B0aW9ucy5za2lwTGFzdFVzZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNpcGhlclNlcnZpY2UudXBkYXRlTGFzdFVzZWREYXRlKG9wdGlvbnMuY2lwaGVyLmlkKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgQnJvd3NlckFwaS50YWJTZW5kTWVzc2FnZSh0YWIsIHtcbiAgICAgICAgICAgICAgICBjb21tYW5kOiAnZmlsbEZvcm0nLFxuICAgICAgICAgICAgICAgIGZpbGxTY3JpcHQ6IGZpbGxTY3JpcHQsXG4gICAgICAgICAgICAgICAgdXJsOiB0YWIudXJsLFxuICAgICAgICAgICAgfSwgeyBmcmFtZUlkOiBwZC5mcmFtZUlkIH0pO1xuXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5jaXBoZXIudHlwZSAhPT0gQ2lwaGVyVHlwZS5Mb2dpbiB8fCB0b3RwUHJvbWlzZSB8fCAhb3B0aW9ucy5jaXBoZXIubG9naW4udG90cCB8fFxuICAgICAgICAgICAgICAgICghY2FuQWNjZXNzUHJlbWl1bSAmJiAhb3B0aW9ucy5jaXBoZXIub3JnYW5pemF0aW9uVXNlVG90cCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRvdHBQcm9taXNlID0gdGhpcy50b3RwU2VydmljZS5pc0F1dG9Db3B5RW5hYmxlZCgpLnRoZW4oZW5hYmxlZCA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGVuYWJsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudG90cFNlcnZpY2UuZ2V0Q29kZShvcHRpb25zLmNpcGhlci5sb2dpbi50b3RwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGRpZEF1dG9maWxsKSB7XG4gICAgICAgICAgICB0aGlzLmV2ZW50U2VydmljZS5jb2xsZWN0KEV2ZW50VHlwZS5DaXBoZXJfQ2xpZW50QXV0b2ZpbGxlZCwgb3B0aW9ucy5jaXBoZXIuaWQpO1xuICAgICAgICAgICAgaWYgKHRvdHBQcm9taXNlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgdG90cFByb21pc2U7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdEaWQgbm90IGF1dG8tZmlsbC4nKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIGRvQXV0b0ZpbGxBY3RpdmVUYWIocGFnZURldGFpbHM6IGFueSwgZnJvbUNvbW1hbmQ6IGJvb2xlYW4pIHtcbiAgICAgICAgY29uc3QgdGFiID0gYXdhaXQgdGhpcy5nZXRBY3RpdmVUYWIoKTtcbiAgICAgICAgaWYgKCF0YWIgfHwgIXRhYi51cmwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBjaXBoZXI6IENpcGhlclZpZXc7XG4gICAgICAgIGlmIChmcm9tQ29tbWFuZCkge1xuICAgICAgICAgICAgY2lwaGVyID0gYXdhaXQgdGhpcy5jaXBoZXJTZXJ2aWNlLmdldE5leHRDaXBoZXJGb3JVcmwodGFiLnVybCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBsYXN0TGF1bmNoZWRDaXBoZXIgPSBhd2FpdCB0aGlzLmNpcGhlclNlcnZpY2UuZ2V0TGFzdExhdW5jaGVkRm9yVXJsKHRhYi51cmwsIHRydWUpO1xuICAgICAgICAgICAgaWYgKGxhc3RMYXVuY2hlZENpcGhlciAmJiBEYXRlLm5vdygpLnZhbHVlT2YoKSAtIGxhc3RMYXVuY2hlZENpcGhlci5sb2NhbERhdGE/Lmxhc3RMYXVuY2hlZD8udmFsdWVPZigpIDwgMzAwMDApIHtcbiAgICAgICAgICAgICAgICBjaXBoZXIgPSBsYXN0TGF1bmNoZWRDaXBoZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjaXBoZXIgPSBhd2FpdCB0aGlzLmNpcGhlclNlcnZpY2UuZ2V0TGFzdFVzZWRGb3JVcmwodGFiLnVybCwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjaXBoZXIgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNpcGhlci5yZXByb21wdCAhPT0gQ2lwaGVyUmVwcm9tcHRUeXBlLk5vbmUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRvdHBDb2RlID0gYXdhaXQgdGhpcy5kb0F1dG9GaWxsKHtcbiAgICAgICAgICAgIGNpcGhlcjogY2lwaGVyLFxuICAgICAgICAgICAgcGFnZURldGFpbHM6IHBhZ2VEZXRhaWxzLFxuICAgICAgICAgICAgc2tpcExhc3RVc2VkOiAhZnJvbUNvbW1hbmQsXG4gICAgICAgICAgICBza2lwVXNlcm5hbWVPbmx5RmlsbDogIWZyb21Db21tYW5kLFxuICAgICAgICAgICAgb25seUVtcHR5RmllbGRzOiAhZnJvbUNvbW1hbmQsXG4gICAgICAgICAgICBvbmx5VmlzaWJsZUZpZWxkczogIWZyb21Db21tYW5kLFxuICAgICAgICAgICAgZmlsbE5ld1Bhc3N3b3JkOiBmcm9tQ29tbWFuZCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gVXBkYXRlIGxhc3QgdXNlZCBpbmRleCBhcyBhdXRvZmlsbCBoYXMgc3VjY2VlZFxuICAgICAgICBpZiAoZnJvbUNvbW1hbmQpIHtcbiAgICAgICAgICAgIHRoaXMuY2lwaGVyU2VydmljZS51cGRhdGVMYXN0VXNlZEluZGV4Rm9yVXJsKHRhYi51cmwpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRvdHBDb2RlO1xuICAgIH1cblxuICAgIC8vIEhlbHBlcnNcblxuICAgIHByaXZhdGUgYXN5bmMgZ2V0QWN0aXZlVGFiKCk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIGNvbnN0IHRhYiA9IGF3YWl0IEJyb3dzZXJBcGkuZ2V0VGFiRnJvbUN1cnJlbnRXaW5kb3coKTtcbiAgICAgICAgaWYgKCF0YWIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gdGFiIGZvdW5kLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRhYjtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdlbmVyYXRlRmlsbFNjcmlwdChwYWdlRGV0YWlsczogQXV0b2ZpbGxQYWdlRGV0YWlscywgb3B0aW9uczogYW55KTogQXV0b2ZpbGxTY3JpcHQge1xuICAgICAgICBpZiAoIXBhZ2VEZXRhaWxzIHx8ICFvcHRpb25zLmNpcGhlcikge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZmlsbFNjcmlwdCA9IG5ldyBBdXRvZmlsbFNjcmlwdChwYWdlRGV0YWlscy5kb2N1bWVudFVVSUQpO1xuICAgICAgICBjb25zdCBmaWxsZWRGaWVsZHM6IHsgW2lkOiBzdHJpbmddOiBBdXRvZmlsbEZpZWxkOyB9ID0ge307XG4gICAgICAgIGNvbnN0IGZpZWxkcyA9IG9wdGlvbnMuY2lwaGVyLmZpZWxkcztcblxuICAgICAgICBpZiAoZmllbGRzICYmIGZpZWxkcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGZpZWxkTmFtZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICAgICAgICAgIGZpZWxkcy5mb3JFYWNoKChmOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5oYXNWYWx1ZShmLm5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkTmFtZXMucHVzaChmLm5hbWUudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHBhZ2VEZXRhaWxzLmZpZWxkcy5mb3JFYWNoKChmaWVsZDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGZpbGxlZEZpZWxkcy5oYXNPd25Qcm9wZXJ0eShmaWVsZC5vcGlkKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKCFmaWVsZC52aWV3YWJsZSAmJiBmaWVsZC50YWdOYW1lICE9PSAnc3BhbicpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoaW5nSW5kZXggPSB0aGlzLmZpbmRNYXRjaGluZ0ZpZWxkSW5kZXgoZmllbGQsIGZpZWxkTmFtZXMpO1xuICAgICAgICAgICAgICAgIGlmIChtYXRjaGluZ0luZGV4ID4gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbWF0Y2hpbmdGaWVsZDogRmllbGRWaWV3ID0gZmllbGRzW21hdGNoaW5nSW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICBsZXQgdmFsO1xuICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2hpbmdGaWVsZC50eXBlID09PSBGaWVsZFR5cGUuTGlua2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBBc3N1bXB0aW9uOiBMaW5rZWQgRmllbGQgaXMgbm90IGJlaW5nIHVzZWQgdG8gYXV0b2ZpbGwgYSBib29sZWFuIHZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBvcHRpb25zLmNpcGhlci5saW5rZWRGaWVsZFZhbHVlKG1hdGNoaW5nRmllbGQubGlua2VkSWQpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gbWF0Y2hpbmdGaWVsZC52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWwgPT0gbnVsbCAmJiBtYXRjaGluZ0ZpZWxkLnR5cGUgPT09IEZpZWxkVHlwZS5Cb29sZWFuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gJ2ZhbHNlJztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGZpbGxlZEZpZWxkc1tmaWVsZC5vcGlkXSA9IGZpZWxkO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbGxCeU9waWQoZmlsbFNjcmlwdCwgZmllbGQsIHZhbCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBzd2l0Y2ggKG9wdGlvbnMuY2lwaGVyLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgQ2lwaGVyVHlwZS5Mb2dpbjpcbiAgICAgICAgICAgICAgICBmaWxsU2NyaXB0ID0gdGhpcy5nZW5lcmF0ZUxvZ2luRmlsbFNjcmlwdChmaWxsU2NyaXB0LCBwYWdlRGV0YWlscywgZmlsbGVkRmllbGRzLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgQ2lwaGVyVHlwZS5DYXJkOlxuICAgICAgICAgICAgICAgIGZpbGxTY3JpcHQgPSB0aGlzLmdlbmVyYXRlQ2FyZEZpbGxTY3JpcHQoZmlsbFNjcmlwdCwgcGFnZURldGFpbHMsIGZpbGxlZEZpZWxkcywgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIENpcGhlclR5cGUuSWRlbnRpdHk6XG4gICAgICAgICAgICAgICAgZmlsbFNjcmlwdCA9IHRoaXMuZ2VuZXJhdGVJZGVudGl0eUZpbGxTY3JpcHQoZmlsbFNjcmlwdCwgcGFnZURldGFpbHMsIGZpbGxlZEZpZWxkcywgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZpbGxTY3JpcHQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZW5lcmF0ZUxvZ2luRmlsbFNjcmlwdChmaWxsU2NyaXB0OiBBdXRvZmlsbFNjcmlwdCwgcGFnZURldGFpbHM6IGFueSxcbiAgICAgICAgZmlsbGVkRmllbGRzOiB7IFtpZDogc3RyaW5nXTogQXV0b2ZpbGxGaWVsZDsgfSwgb3B0aW9uczogYW55KTogQXV0b2ZpbGxTY3JpcHQge1xuICAgICAgICBpZiAoIW9wdGlvbnMuY2lwaGVyLmxvZ2luKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBhc3N3b3JkczogQXV0b2ZpbGxGaWVsZFtdID0gW107XG4gICAgICAgIGNvbnN0IHVzZXJuYW1lczogQXV0b2ZpbGxGaWVsZFtdID0gW107XG4gICAgICAgIGxldCBwZjogQXV0b2ZpbGxGaWVsZCA9IG51bGw7XG4gICAgICAgIGxldCB1c2VybmFtZTogQXV0b2ZpbGxGaWVsZCA9IG51bGw7XG4gICAgICAgIGNvbnN0IGxvZ2luID0gb3B0aW9ucy5jaXBoZXIubG9naW47XG5cbiAgICAgICAgaWYgKCFsb2dpbi5wYXNzd29yZCB8fCBsb2dpbi5wYXNzd29yZCA9PT0gJycpIHtcbiAgICAgICAgICAgIC8vIE5vIHBhc3N3b3JkIGZvciB0aGlzIGxvZ2luLiBNYXliZSB0aGV5IGp1c3Qgd2FudGVkIHRvIGF1dG8tZmlsbCBzb21lIGN1c3RvbSBmaWVsZHM/XG4gICAgICAgICAgICBmaWxsU2NyaXB0ID0gdGhpcy5zZXRGaWxsU2NyaXB0Rm9yRm9jdXMoZmlsbGVkRmllbGRzLCBmaWxsU2NyaXB0KTtcbiAgICAgICAgICAgIHJldHVybiBmaWxsU2NyaXB0O1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBhc3N3b3JkRmllbGRzID0gdGhpcy5sb2FkUGFzc3dvcmRGaWVsZHMocGFnZURldGFpbHMsIGZhbHNlLCBmYWxzZSwgb3B0aW9ucy5vbmx5RW1wdHlGaWVsZHMsXG4gICAgICAgICAgICBvcHRpb25zLmZpbGxOZXdQYXNzd29yZCk7XG4gICAgICAgIGlmICghcGFzc3dvcmRGaWVsZHMubGVuZ3RoICYmICFvcHRpb25zLm9ubHlWaXNpYmxlRmllbGRzKSB7XG4gICAgICAgICAgICAvLyBub3QgYWJsZSB0byBmaW5kIGFueSB2aWV3YWJsZSBwYXNzd29yZCBmaWVsZHMuIG1heWJlIHRoZXJlIGFyZSBzb21lIFwiaGlkZGVuXCIgb25lcz9cbiAgICAgICAgICAgIHBhc3N3b3JkRmllbGRzID0gdGhpcy5sb2FkUGFzc3dvcmRGaWVsZHMocGFnZURldGFpbHMsIHRydWUsIHRydWUsIG9wdGlvbnMub25seUVtcHR5RmllbGRzLFxuICAgICAgICAgICAgICAgIG9wdGlvbnMuZmlsbE5ld1Bhc3N3b3JkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgZm9ybUtleSBpbiBwYWdlRGV0YWlscy5mb3Jtcykge1xuICAgICAgICAgICAgaWYgKCFwYWdlRGV0YWlscy5mb3Jtcy5oYXNPd25Qcm9wZXJ0eShmb3JtS2V5KSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBwYXNzd29yZEZpZWxkc0ZvckZvcm06IEF1dG9maWxsRmllbGRbXSA9IFtdO1xuICAgICAgICAgICAgcGFzc3dvcmRGaWVsZHMuZm9yRWFjaChwYXNzRmllbGQgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChmb3JtS2V5ID09PSBwYXNzRmllbGQuZm9ybSkge1xuICAgICAgICAgICAgICAgICAgICBwYXNzd29yZEZpZWxkc0ZvckZvcm0ucHVzaChwYXNzRmllbGQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBwYXNzd29yZEZpZWxkcy5mb3JFYWNoKHBhc3NGaWVsZCA9PiB7XG4gICAgICAgICAgICAgICAgcGYgPSBwYXNzRmllbGQ7XG4gICAgICAgICAgICAgICAgcGFzc3dvcmRzLnB1c2gocGYpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGxvZ2luLnVzZXJuYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIHVzZXJuYW1lID0gdGhpcy5maW5kVXNlcm5hbWVGaWVsZChwYWdlRGV0YWlscywgcGYsIGZhbHNlLCBmYWxzZSwgZmFsc2UpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICghdXNlcm5hbWUgJiYgIW9wdGlvbnMub25seVZpc2libGVGaWVsZHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdCBhYmxlIHRvIGZpbmQgYW55IHZpZXdhYmxlIHVzZXJuYW1lIGZpZWxkcy4gbWF5YmUgdGhlcmUgYXJlIHNvbWUgXCJoaWRkZW5cIiBvbmVzP1xuICAgICAgICAgICAgICAgICAgICAgICAgdXNlcm5hbWUgPSB0aGlzLmZpbmRVc2VybmFtZUZpZWxkKHBhZ2VEZXRhaWxzLCBwZiwgdHJ1ZSwgdHJ1ZSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHVzZXJuYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB1c2VybmFtZXMucHVzaCh1c2VybmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXNzd29yZEZpZWxkcy5sZW5ndGggJiYgIXBhc3N3b3Jkcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIC8vIFRoZSBwYWdlIGRvZXMgbm90IGhhdmUgYW55IGZvcm1zIHdpdGggcGFzc3dvcmQgZmllbGRzLiBVc2UgdGhlIGZpcnN0IHBhc3N3b3JkIGZpZWxkIG9uIHRoZSBwYWdlIGFuZCB0aGVcbiAgICAgICAgICAgIC8vIGlucHV0IGZpZWxkIGp1c3QgYmVmb3JlIGl0IGFzIHRoZSB1c2VybmFtZS5cblxuICAgICAgICAgICAgcGYgPSBwYXNzd29yZEZpZWxkc1swXTtcbiAgICAgICAgICAgIHBhc3N3b3Jkcy5wdXNoKHBmKTtcblxuICAgICAgICAgICAgaWYgKGxvZ2luLnVzZXJuYW1lICYmIHBmLmVsZW1lbnROdW1iZXIgPiAwKSB7XG4gICAgICAgICAgICAgICAgdXNlcm5hbWUgPSB0aGlzLmZpbmRVc2VybmFtZUZpZWxkKHBhZ2VEZXRhaWxzLCBwZiwgZmFsc2UsIGZhbHNlLCB0cnVlKTtcblxuICAgICAgICAgICAgICAgIGlmICghdXNlcm5hbWUgJiYgIW9wdGlvbnMub25seVZpc2libGVGaWVsZHMpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gbm90IGFibGUgdG8gZmluZCBhbnkgdmlld2FibGUgdXNlcm5hbWUgZmllbGRzLiBtYXliZSB0aGVyZSBhcmUgc29tZSBcImhpZGRlblwiIG9uZXM/XG4gICAgICAgICAgICAgICAgICAgIHVzZXJuYW1lID0gdGhpcy5maW5kVXNlcm5hbWVGaWVsZChwYWdlRGV0YWlscywgcGYsIHRydWUsIHRydWUsIHRydWUpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh1c2VybmFtZSkge1xuICAgICAgICAgICAgICAgICAgICB1c2VybmFtZXMucHVzaCh1c2VybmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFwYXNzd29yZEZpZWxkcy5sZW5ndGggJiYgIW9wdGlvbnMuc2tpcFVzZXJuYW1lT25seUZpbGwpIHtcbiAgICAgICAgICAgIC8vIE5vIHBhc3N3b3JkIGZpZWxkcyBvbiB0aGlzIHBhZ2UuIExldCdzIHRyeSB0byBqdXN0IGZ1enp5IGZpbGwgdGhlIHVzZXJuYW1lLlxuICAgICAgICAgICAgcGFnZURldGFpbHMuZmllbGRzLmZvckVhY2goKGY6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChmLnZpZXdhYmxlICYmIChmLnR5cGUgPT09ICd0ZXh0JyB8fCBmLnR5cGUgPT09ICdlbWFpbCcgfHwgZi50eXBlID09PSAndGVsJykgJiZcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maWVsZElzRnV6enlNYXRjaChmLCBVc2VybmFtZUZpZWxkTmFtZXMpKSB7XG4gICAgICAgICAgICAgICAgICAgIHVzZXJuYW1lcy5wdXNoKGYpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdXNlcm5hbWVzLmZvckVhY2godSA9PiB7XG4gICAgICAgICAgICBpZiAoZmlsbGVkRmllbGRzLmhhc093blByb3BlcnR5KHUub3BpZCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZpbGxlZEZpZWxkc1t1Lm9waWRdID0gdTtcbiAgICAgICAgICAgIHRoaXMuZmlsbEJ5T3BpZChmaWxsU2NyaXB0LCB1LCBsb2dpbi51c2VybmFtZSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHBhc3N3b3Jkcy5mb3JFYWNoKHAgPT4ge1xuICAgICAgICAgICAgaWYgKGZpbGxlZEZpZWxkcy5oYXNPd25Qcm9wZXJ0eShwLm9waWQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmaWxsZWRGaWVsZHNbcC5vcGlkXSA9IHA7XG4gICAgICAgICAgICB0aGlzLmZpbGxCeU9waWQoZmlsbFNjcmlwdCwgcCwgbG9naW4ucGFzc3dvcmQpO1xuICAgICAgICB9KTtcblxuICAgICAgICBmaWxsU2NyaXB0ID0gdGhpcy5zZXRGaWxsU2NyaXB0Rm9yRm9jdXMoZmlsbGVkRmllbGRzLCBmaWxsU2NyaXB0KTtcbiAgICAgICAgcmV0dXJuIGZpbGxTY3JpcHQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZW5lcmF0ZUNhcmRGaWxsU2NyaXB0KGZpbGxTY3JpcHQ6IEF1dG9maWxsU2NyaXB0LCBwYWdlRGV0YWlsczogYW55LFxuICAgICAgICBmaWxsZWRGaWVsZHM6IHsgW2lkOiBzdHJpbmddOiBBdXRvZmlsbEZpZWxkOyB9LCBvcHRpb25zOiBhbnkpOiBBdXRvZmlsbFNjcmlwdCB7XG4gICAgICAgIGlmICghb3B0aW9ucy5jaXBoZXIuY2FyZCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaWxsRmllbGRzOiB7IFtpZDogc3RyaW5nXTogQXV0b2ZpbGxGaWVsZDsgfSA9IHt9O1xuXG4gICAgICAgIHBhZ2VEZXRhaWxzLmZpZWxkcy5mb3JFYWNoKChmOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmZvckN1c3RvbUZpZWxkc09ubHkoZikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmlzRXhjbHVkZWRUeXBlKGYudHlwZSwgRXhjbHVkZWRBdXRvZmlsbFR5cGVzKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBDYXJkQXR0cmlidXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGF0dHIgPSBDYXJkQXR0cmlidXRlc1tpXTtcbiAgICAgICAgICAgICAgICBpZiAoIWYuaGFzT3duUHJvcGVydHkoYXR0cikgfHwgIWZbYXR0cl0gfHwgIWYudmlld2FibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gcmVmIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2Zvcm0tY29udHJvbC1pbmZyYXN0cnVjdHVyZS5odG1sI2F1dG9maWxsXG4gICAgICAgICAgICAgICAgLy8gcmVmIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3dlYi9mdW5kYW1lbnRhbHMvZGVzaWduLWFuZC11eC9pbnB1dC9mb3Jtcy9cbiAgICAgICAgICAgICAgICBpZiAoIWZpbGxGaWVsZHMuY2FyZGhvbGRlck5hbWUgJiYgdGhpcy5pc0ZpZWxkTWF0Y2goZlthdHRyXSxcbiAgICAgICAgICAgICAgICAgICAgWydjYy1uYW1lJywgJ2NhcmQtbmFtZScsICdjYXJkaG9sZGVyLW5hbWUnLCAnY2FyZGhvbGRlcicsICduYW1lJywgJ25vbSddLFxuICAgICAgICAgICAgICAgICAgICBbJ2NjLW5hbWUnLCAnY2FyZC1uYW1lJywgJ2NhcmRob2xkZXItbmFtZScsICdjYXJkaG9sZGVyJywgJ3RiTmFtZSddKSkge1xuICAgICAgICAgICAgICAgICAgICBmaWxsRmllbGRzLmNhcmRob2xkZXJOYW1lID0gZjtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghZmlsbEZpZWxkcy5udW1iZXIgJiYgdGhpcy5pc0ZpZWxkTWF0Y2goZlthdHRyXSxcbiAgICAgICAgICAgICAgICAgICAgWydjYy1udW1iZXInLCAnY2MtbnVtJywgJ2NhcmQtbnVtYmVyJywgJ2NhcmQtbnVtJywgJ251bWJlcicsICdjYycsICdjYy1ubycsICdjYXJkLW5vJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdjcmVkaXQtY2FyZCcsICdudW1lcm8tY2FydGUnLCAnY2FydGUnLCAnY2FydGUtY3JlZGl0JywgJ251bS1jYXJ0ZScsICdjYi1udW0nXSxcbiAgICAgICAgICAgICAgICAgICAgWydjYy1udW1iZXInLCAnY2MtbnVtJywgJ2NhcmQtbnVtYmVyJywgJ2NhcmQtbnVtJywgJ2NjLW5vJywgJ2NhcmQtbm8nLCAnbnVtZXJvLWNhcnRlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdudW0tY2FydGUnLCAnY2ItbnVtJ10pKSB7XG4gICAgICAgICAgICAgICAgICAgIGZpbGxGaWVsZHMubnVtYmVyID0gZjtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghZmlsbEZpZWxkcy5leHAgJiYgdGhpcy5pc0ZpZWxkTWF0Y2goZlthdHRyXSxcbiAgICAgICAgICAgICAgICAgICAgWydjYy1leHAnLCAnY2FyZC1leHAnLCAnY2MtZXhwaXJhdGlvbicsICdjYXJkLWV4cGlyYXRpb24nLCAnY2MtZXgnLCAnY2FyZC1leCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAnY2FyZC1leHBpcmUnLCAnY2FyZC1leHBpcnknLCAndmFsaWRpdGUnLCAnZXhwaXJhdGlvbicsICdleHBpcnknLCAnbW0teXknLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ21tLXl5eXknLCAneXktbW0nLCAneXl5eS1tbScsICdleHBpcmF0aW9uLWRhdGUnLCAncGF5bWVudC1jYXJkLWV4cGlyYXRpb24nLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ3BheW1lbnQtY2MtZGF0ZSddLFxuICAgICAgICAgICAgICAgICAgICBbJ21tLXl5JywgJ21tLXl5eXknLCAneXktbW0nLCAneXl5eS1tbScsICdleHBpcmF0aW9uLWRhdGUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ3BheW1lbnQtY2FyZC1leHBpcmF0aW9uJ10pKSB7XG4gICAgICAgICAgICAgICAgICAgIGZpbGxGaWVsZHMuZXhwID0gZjtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghZmlsbEZpZWxkcy5leHBNb250aCAmJiB0aGlzLmlzRmllbGRNYXRjaChmW2F0dHJdLFxuICAgICAgICAgICAgICAgICAgICBbJ2V4cC1tb250aCcsICdjYy1leHAtbW9udGgnLCAnY2MtbW9udGgnLCAnY2FyZC1tb250aCcsICdjYy1tbycsICdjYXJkLW1vJywgJ2V4cC1tbycsXG4gICAgICAgICAgICAgICAgICAgICAgICAnY2FyZC1leHAtbW8nLCAnY2MtZXhwLW1vJywgJ2NhcmQtZXhwaXJhdGlvbi1tb250aCcsICdleHBpcmF0aW9uLW1vbnRoJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdjYy1tbScsICdjYy1tJywgJ2NhcmQtbW0nLCAnY2FyZC1tJywgJ2NhcmQtZXhwLW1tJywgJ2NjLWV4cC1tbScsICdleHAtbW0nLCAnZXhwLW0nLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ2V4cGlyZS1tb250aCcsICdleHBpcmUtbW8nLCAnZXhwaXJ5LW1vbnRoJywgJ2V4cGlyeS1tbycsICdjYXJkLWV4cGlyZS1tb250aCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAnY2FyZC1leHBpcmUtbW8nLCAnY2FyZC1leHBpcnktbW9udGgnLCAnY2FyZC1leHBpcnktbW8nLCAnbW9pcy12YWxpZGl0ZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAnbW9pcy1leHBpcmF0aW9uJywgJ20tdmFsaWRpdGUnLCAnbS1leHBpcmF0aW9uJywgJ2V4cGlyeS1kYXRlLWZpZWxkLW1vbnRoJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdleHBpcmF0aW9uLWRhdGUtbW9udGgnLCAnZXhwaXJhdGlvbi1kYXRlLW1tJywgJ2V4cC1tb24nLCAndmFsaWRpdHktbW8nLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ2V4cC1kYXRlLW1vJywgJ2NiLWRhdGUtbW9pcycsICdkYXRlLW0nXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgZmlsbEZpZWxkcy5leHBNb250aCA9IGY7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWZpbGxGaWVsZHMuZXhwWWVhciAmJiB0aGlzLmlzRmllbGRNYXRjaChmW2F0dHJdLFxuICAgICAgICAgICAgICAgICAgICBbJ2V4cC15ZWFyJywgJ2NjLWV4cC15ZWFyJywgJ2NjLXllYXInLCAnY2FyZC15ZWFyJywgJ2NjLXlyJywgJ2NhcmQteXInLCAnZXhwLXlyJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdjYXJkLWV4cC15cicsICdjYy1leHAteXInLCAnY2FyZC1leHBpcmF0aW9uLXllYXInLCAnZXhwaXJhdGlvbi15ZWFyJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdjYy15eScsICdjYy15JywgJ2NhcmQteXknLCAnY2FyZC15JywgJ2NhcmQtZXhwLXl5JywgJ2NjLWV4cC15eScsICdleHAteXknLCAnZXhwLXknLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ2NjLXl5eXknLCAnY2FyZC15eXl5JywgJ2NhcmQtZXhwLXl5eXknLCAnY2MtZXhwLXl5eXknLCAnZXhwaXJlLXllYXInLCAnZXhwaXJlLXlyJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdleHBpcnkteWVhcicsICdleHBpcnkteXInLCAnY2FyZC1leHBpcmUteWVhcicsICdjYXJkLWV4cGlyZS15cicsICdjYXJkLWV4cGlyeS15ZWFyJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdjYXJkLWV4cGlyeS15cicsICdhbi12YWxpZGl0ZScsICdhbi1leHBpcmF0aW9uJywgJ2FubmVlLXZhbGlkaXRlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdhbm5lZS1leHBpcmF0aW9uJywgJ2V4cGlyeS1kYXRlLWZpZWxkLXllYXInLCAnZXhwaXJhdGlvbi1kYXRlLXllYXInLCAnY2ItZGF0ZS1hbm4nLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ2V4cGlyYXRpb24tZGF0ZS15eScsICdleHBpcmF0aW9uLWRhdGUteXl5eScsICd2YWxpZGl0eS15ZWFyJywgJ2V4cC1kYXRlLXllYXInLCAnZGF0ZS15J10pKSB7XG4gICAgICAgICAgICAgICAgICAgIGZpbGxGaWVsZHMuZXhwWWVhciA9IGY7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWZpbGxGaWVsZHMuY29kZSAmJiB0aGlzLmlzRmllbGRNYXRjaChmW2F0dHJdLFxuICAgICAgICAgICAgICAgICAgICBbJ2N2dicsICdjdmMnLCAnY3Z2MicsICdjYy1jc2MnLCAnY2MtY3Z2JywgJ2NhcmQtY3NjJywgJ2NhcmQtY3Z2JywgJ2N2ZCcsICdjaWQnLCAnY3ZjMicsXG4gICAgICAgICAgICAgICAgICAgICAgICAnY252JywgJ2N2bjInLCAnY2MtY29kZScsICdjYXJkLWNvZGUnLCAnY29kZS1zZWN1cml0ZScsICdzZWN1cml0eS1jb2RlJywgJ2NyeXB0bycsXG4gICAgICAgICAgICAgICAgICAgICAgICAnY2FyZC12ZXJpZicsICd2ZXJpZmljYXRpb24tY29kZScsICdjc2MnLCAnY2N2J10pKSB7XG4gICAgICAgICAgICAgICAgICAgIGZpbGxGaWVsZHMuY29kZSA9IGY7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWZpbGxGaWVsZHMuYnJhbmQgJiYgdGhpcy5pc0ZpZWxkTWF0Y2goZlthdHRyXSxcbiAgICAgICAgICAgICAgICAgICAgWydjYy10eXBlJywgJ2NhcmQtdHlwZScsICdjYXJkLWJyYW5kJywgJ2NjLWJyYW5kJywgJ2NiLXR5cGUnXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgZmlsbEZpZWxkcy5icmFuZCA9IGY7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgY2FyZCA9IG9wdGlvbnMuY2lwaGVyLmNhcmQ7XG4gICAgICAgIHRoaXMubWFrZVNjcmlwdEFjdGlvbihmaWxsU2NyaXB0LCBjYXJkLCBmaWxsRmllbGRzLCBmaWxsZWRGaWVsZHMsICdjYXJkaG9sZGVyTmFtZScpO1xuICAgICAgICB0aGlzLm1ha2VTY3JpcHRBY3Rpb24oZmlsbFNjcmlwdCwgY2FyZCwgZmlsbEZpZWxkcywgZmlsbGVkRmllbGRzLCAnbnVtYmVyJyk7XG4gICAgICAgIHRoaXMubWFrZVNjcmlwdEFjdGlvbihmaWxsU2NyaXB0LCBjYXJkLCBmaWxsRmllbGRzLCBmaWxsZWRGaWVsZHMsICdjb2RlJyk7XG4gICAgICAgIHRoaXMubWFrZVNjcmlwdEFjdGlvbihmaWxsU2NyaXB0LCBjYXJkLCBmaWxsRmllbGRzLCBmaWxsZWRGaWVsZHMsICdicmFuZCcpO1xuXG4gICAgICAgIGlmIChmaWxsRmllbGRzLmV4cE1vbnRoICYmIHRoaXMuaGFzVmFsdWUoY2FyZC5leHBNb250aCkpIHtcbiAgICAgICAgICAgIGxldCBleHBNb250aDogc3RyaW5nID0gY2FyZC5leHBNb250aDtcblxuICAgICAgICAgICAgaWYgKGZpbGxGaWVsZHMuZXhwTW9udGguc2VsZWN0SW5mbyAmJiBmaWxsRmllbGRzLmV4cE1vbnRoLnNlbGVjdEluZm8ub3B0aW9ucykge1xuICAgICAgICAgICAgICAgIGxldCBpbmRleDogbnVtYmVyID0gbnVsbDtcbiAgICAgICAgICAgICAgICBjb25zdCBzaU9wdGlvbnMgPSBmaWxsRmllbGRzLmV4cE1vbnRoLnNlbGVjdEluZm8ub3B0aW9ucztcbiAgICAgICAgICAgICAgICBpZiAoc2lPcHRpb25zLmxlbmd0aCA9PT0gMTIpIHtcbiAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBwYXJzZUludChjYXJkLmV4cE1vbnRoLCBudWxsKSAtIDE7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzaU9wdGlvbnMubGVuZ3RoID09PSAxMykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2lPcHRpb25zWzBdWzBdICE9IG51bGwgJiYgc2lPcHRpb25zWzBdWzBdICE9PSAnJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgKHNpT3B0aW9uc1sxMl1bMF0gPT0gbnVsbCB8fCBzaU9wdGlvbnNbMTJdWzBdID09PSAnJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gcGFyc2VJbnQoY2FyZC5leHBNb250aCwgbnVsbCkgLSAxO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBwYXJzZUludChjYXJkLmV4cE1vbnRoLCBudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG9wdGlvbiA9IHNpT3B0aW9uc1tpbmRleF07XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb24ubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXhwTW9udGggPSBvcHRpb25bMV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCh0aGlzLmZpZWxkQXR0cnNDb250YWluKGZpbGxGaWVsZHMuZXhwTW9udGgsICdtbScpIHx8IGZpbGxGaWVsZHMuZXhwTW9udGgubWF4TGVuZ3RoID09PSAyKVxuICAgICAgICAgICAgICAgICYmIGV4cE1vbnRoLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIGV4cE1vbnRoID0gJzAnICsgZXhwTW9udGg7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZpbGxlZEZpZWxkc1tmaWxsRmllbGRzLmV4cE1vbnRoLm9waWRdID0gZmlsbEZpZWxkcy5leHBNb250aDtcbiAgICAgICAgICAgIHRoaXMuZmlsbEJ5T3BpZChmaWxsU2NyaXB0LCBmaWxsRmllbGRzLmV4cE1vbnRoLCBleHBNb250aCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZmlsbEZpZWxkcy5leHBZZWFyICYmIHRoaXMuaGFzVmFsdWUoY2FyZC5leHBZZWFyKSkge1xuICAgICAgICAgICAgbGV0IGV4cFllYXI6IHN0cmluZyA9IGNhcmQuZXhwWWVhcjtcbiAgICAgICAgICAgIGlmIChmaWxsRmllbGRzLmV4cFllYXIuc2VsZWN0SW5mbyAmJiBmaWxsRmllbGRzLmV4cFllYXIuc2VsZWN0SW5mby5vcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaWxsRmllbGRzLmV4cFllYXIuc2VsZWN0SW5mby5vcHRpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG86IFtzdHJpbmcsIHN0cmluZ10gPSBmaWxsRmllbGRzLmV4cFllYXIuc2VsZWN0SW5mby5vcHRpb25zW2ldO1xuICAgICAgICAgICAgICAgICAgICBpZiAob1swXSA9PT0gY2FyZC5leHBZZWFyIHx8IG9bMV0gPT09IGNhcmQuZXhwWWVhcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXhwWWVhciA9IG9bMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAob1sxXS5sZW5ndGggPT09IDIgJiYgY2FyZC5leHBZZWFyLmxlbmd0aCA9PT0gNCAmJiBvWzFdID09PSBjYXJkLmV4cFllYXIuc3Vic3RyaW5nKDIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBleHBZZWFyID0gb1sxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbG9uSW5kZXggPSBvWzFdLmluZGV4T2YoJzonKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbG9uSW5kZXggPiAtMSAmJiBvWzFdLmxlbmd0aCA+IGNvbG9uSW5kZXggKyAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWwgPSBvWzFdLnN1YnN0cmluZyhjb2xvbkluZGV4ICsgMik7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsICE9IG51bGwgJiYgdmFsLnRyaW0oKSAhPT0gJycgJiYgdmFsID09PSBjYXJkLmV4cFllYXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBZZWFyID0gb1sxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5maWVsZEF0dHJzQ29udGFpbihmaWxsRmllbGRzLmV4cFllYXIsICd5eXl5JykgfHwgZmlsbEZpZWxkcy5leHBZZWFyLm1heExlbmd0aCA9PT0gNCkge1xuICAgICAgICAgICAgICAgIGlmIChleHBZZWFyLmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgICAgICAgICAgICBleHBZZWFyID0gJzIwJyArIGV4cFllYXI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmZpZWxkQXR0cnNDb250YWluKGZpbGxGaWVsZHMuZXhwWWVhciwgJ3l5JykgfHwgZmlsbEZpZWxkcy5leHBZZWFyLm1heExlbmd0aCA9PT0gMikge1xuICAgICAgICAgICAgICAgIGlmIChleHBZZWFyLmxlbmd0aCA9PT0gNCkge1xuICAgICAgICAgICAgICAgICAgICBleHBZZWFyID0gZXhwWWVhci5zdWJzdHIoMik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmaWxsZWRGaWVsZHNbZmlsbEZpZWxkcy5leHBZZWFyLm9waWRdID0gZmlsbEZpZWxkcy5leHBZZWFyO1xuICAgICAgICAgICAgdGhpcy5maWxsQnlPcGlkKGZpbGxTY3JpcHQsIGZpbGxGaWVsZHMuZXhwWWVhciwgZXhwWWVhcik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZmlsbEZpZWxkcy5leHAgJiYgdGhpcy5oYXNWYWx1ZShjYXJkLmV4cE1vbnRoKSAmJiB0aGlzLmhhc1ZhbHVlKGNhcmQuZXhwWWVhcikpIHtcbiAgICAgICAgICAgIGNvbnN0IGZ1bGxNb250aCA9ICgnMCcgKyBjYXJkLmV4cE1vbnRoKS5zbGljZSgtMik7XG5cbiAgICAgICAgICAgIGxldCBmdWxsWWVhcjogc3RyaW5nID0gY2FyZC5leHBZZWFyO1xuICAgICAgICAgICAgbGV0IHBhcnRZZWFyOiBzdHJpbmcgPSBudWxsO1xuICAgICAgICAgICAgaWYgKGZ1bGxZZWFyLmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgICAgICAgIHBhcnRZZWFyID0gZnVsbFllYXI7XG4gICAgICAgICAgICAgICAgZnVsbFllYXIgPSAnMjAnICsgZnVsbFllYXI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGZ1bGxZZWFyLmxlbmd0aCA9PT0gNCkge1xuICAgICAgICAgICAgICAgIHBhcnRZZWFyID0gZnVsbFllYXIuc3Vic3RyKDIsIDIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgZXhwOiBzdHJpbmcgPSBudWxsO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBNb250aEFiYnIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5maWVsZEF0dHJzQ29udGFpbihmaWxsRmllbGRzLmV4cCwgTW9udGhBYmJyW2ldICsgJy8nICsgWWVhckFiYnJTaG9ydFtpXSkgJiZcbiAgICAgICAgICAgICAgICAgICAgcGFydFllYXIgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBleHAgPSBmdWxsTW9udGggKyAnLycgKyBwYXJ0WWVhcjtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZmllbGRBdHRyc0NvbnRhaW4oZmlsbEZpZWxkcy5leHAsIE1vbnRoQWJicltpXSArICcvJyArIFllYXJBYmJyTG9uZ1tpXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgZXhwID0gZnVsbE1vbnRoICsgJy8nICsgZnVsbFllYXI7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmZpZWxkQXR0cnNDb250YWluKGZpbGxGaWVsZHMuZXhwLCBZZWFyQWJiclNob3J0W2ldICsgJy8nICsgTW9udGhBYmJyW2ldKSAmJlxuICAgICAgICAgICAgICAgICAgICBwYXJ0WWVhciAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4cCA9IHBhcnRZZWFyICsgJy8nICsgZnVsbE1vbnRoO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5maWVsZEF0dHJzQ29udGFpbihmaWxsRmllbGRzLmV4cCwgWWVhckFiYnJMb25nW2ldICsgJy8nICsgTW9udGhBYmJyW2ldKSkge1xuICAgICAgICAgICAgICAgICAgICBleHAgPSBmdWxsWWVhciArICcvJyArIGZ1bGxNb250aDtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZmllbGRBdHRyc0NvbnRhaW4oZmlsbEZpZWxkcy5leHAsIE1vbnRoQWJicltpXSArICctJyArIFllYXJBYmJyU2hvcnRbaV0pICYmXG4gICAgICAgICAgICAgICAgICAgIHBhcnRZZWFyICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgZXhwID0gZnVsbE1vbnRoICsgJy0nICsgcGFydFllYXI7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmZpZWxkQXR0cnNDb250YWluKGZpbGxGaWVsZHMuZXhwLCBNb250aEFiYnJbaV0gKyAnLScgKyBZZWFyQWJickxvbmdbaV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4cCA9IGZ1bGxNb250aCArICctJyArIGZ1bGxZZWFyO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5maWVsZEF0dHJzQ29udGFpbihmaWxsRmllbGRzLmV4cCwgWWVhckFiYnJTaG9ydFtpXSArICctJyArIE1vbnRoQWJicltpXSkgJiZcbiAgICAgICAgICAgICAgICAgICAgcGFydFllYXIgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBleHAgPSBwYXJ0WWVhciArICctJyArIGZ1bGxNb250aDtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZmllbGRBdHRyc0NvbnRhaW4oZmlsbEZpZWxkcy5leHAsIFllYXJBYmJyTG9uZ1tpXSArICctJyArIE1vbnRoQWJicltpXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgZXhwID0gZnVsbFllYXIgKyAnLScgKyBmdWxsTW9udGg7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmZpZWxkQXR0cnNDb250YWluKGZpbGxGaWVsZHMuZXhwLCBZZWFyQWJiclNob3J0W2ldICsgTW9udGhBYmJyW2ldKSAmJlxuICAgICAgICAgICAgICAgICAgICBwYXJ0WWVhciAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4cCA9IHBhcnRZZWFyICsgZnVsbE1vbnRoO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5maWVsZEF0dHJzQ29udGFpbihmaWxsRmllbGRzLmV4cCwgWWVhckFiYnJMb25nW2ldICsgTW9udGhBYmJyW2ldKSkge1xuICAgICAgICAgICAgICAgICAgICBleHAgPSBmdWxsWWVhciArIGZ1bGxNb250aDtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZmllbGRBdHRyc0NvbnRhaW4oZmlsbEZpZWxkcy5leHAsIE1vbnRoQWJicltpXSArIFllYXJBYmJyU2hvcnRbaV0pICYmXG4gICAgICAgICAgICAgICAgICAgIHBhcnRZZWFyICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgZXhwID0gZnVsbE1vbnRoICsgcGFydFllYXI7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmZpZWxkQXR0cnNDb250YWluKGZpbGxGaWVsZHMuZXhwLCBNb250aEFiYnJbaV0gKyBZZWFyQWJickxvbmdbaV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4cCA9IGZ1bGxNb250aCArIGZ1bGxZZWFyO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChleHAgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChleHAgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGV4cCA9IGZ1bGxZZWFyICsgJy0nICsgZnVsbE1vbnRoO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLm1ha2VTY3JpcHRBY3Rpb25XaXRoVmFsdWUoZmlsbFNjcmlwdCwgZXhwLCBmaWxsRmllbGRzLmV4cCwgZmlsbGVkRmllbGRzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmaWxsU2NyaXB0O1xuICAgIH1cblxuICAgIHByaXZhdGUgZmllbGRBdHRyc0NvbnRhaW4oZmllbGQ6IGFueSwgY29udGFpbnNWYWw6IHN0cmluZykge1xuICAgICAgICBpZiAoIWZpZWxkKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZG9lc0NvbnRhaW4gPSBmYWxzZTtcbiAgICAgICAgQ2FyZEF0dHJpYnV0ZXNFeHRlbmRlZC5mb3JFYWNoKGF0dHIgPT4ge1xuICAgICAgICAgICAgaWYgKGRvZXNDb250YWluIHx8ICFmaWVsZC5oYXNPd25Qcm9wZXJ0eShhdHRyKSB8fCAhZmllbGRbYXR0cl0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCB2YWwgPSBmaWVsZFthdHRyXTtcbiAgICAgICAgICAgIHZhbCA9IHZhbC5yZXBsYWNlKC8gL2csICcnKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgZG9lc0NvbnRhaW4gPSB2YWwuaW5kZXhPZihjb250YWluc1ZhbCkgPiAtMTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGRvZXNDb250YWluO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2VuZXJhdGVJZGVudGl0eUZpbGxTY3JpcHQoZmlsbFNjcmlwdDogQXV0b2ZpbGxTY3JpcHQsIHBhZ2VEZXRhaWxzOiBhbnksXG4gICAgICAgIGZpbGxlZEZpZWxkczogeyBbaWQ6IHN0cmluZ106IEF1dG9maWxsRmllbGQ7IH0sIG9wdGlvbnM6IGFueSk6IEF1dG9maWxsU2NyaXB0IHtcbiAgICAgICAgaWYgKCFvcHRpb25zLmNpcGhlci5pZGVudGl0eSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaWxsRmllbGRzOiB7IFtpZDogc3RyaW5nXTogQXV0b2ZpbGxGaWVsZDsgfSA9IHt9O1xuXG4gICAgICAgIHBhZ2VEZXRhaWxzLmZpZWxkcy5mb3JFYWNoKChmOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmZvckN1c3RvbUZpZWxkc09ubHkoZikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmlzRXhjbHVkZWRUeXBlKGYudHlwZSwgRXhjbHVkZWRBdXRvZmlsbFR5cGVzKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBJZGVudGl0eUF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhdHRyID0gSWRlbnRpdHlBdHRyaWJ1dGVzW2ldO1xuICAgICAgICAgICAgICAgIGlmICghZi5oYXNPd25Qcm9wZXJ0eShhdHRyKSB8fCAhZlthdHRyXSB8fCAhZi52aWV3YWJsZSkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyByZWYgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvZm9ybS1jb250cm9sLWluZnJhc3RydWN0dXJlLmh0bWwjYXV0b2ZpbGxcbiAgICAgICAgICAgICAgICAvLyByZWYgaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vd2ViL2Z1bmRhbWVudGFscy9kZXNpZ24tYW5kLXV4L2lucHV0L2Zvcm1zL1xuICAgICAgICAgICAgICAgIGlmICghZmlsbEZpZWxkcy5uYW1lICYmIHRoaXMuaXNGaWVsZE1hdGNoKGZbYXR0cl0sXG4gICAgICAgICAgICAgICAgICAgIFsnbmFtZScsICdmdWxsLW5hbWUnLCAneW91ci1uYW1lJ10sIFsnZnVsbC1uYW1lJywgJ3lvdXItbmFtZSddKSkge1xuICAgICAgICAgICAgICAgICAgICBmaWxsRmllbGRzLm5hbWUgPSBmO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFmaWxsRmllbGRzLmZpcnN0TmFtZSAmJiB0aGlzLmlzRmllbGRNYXRjaChmW2F0dHJdLFxuICAgICAgICAgICAgICAgICAgICBGaXJzdG5hbWVGaWVsZE5hbWVzKSkge1xuICAgICAgICAgICAgICAgICAgICBmaWxsRmllbGRzLmZpcnN0TmFtZSA9IGY7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWZpbGxGaWVsZHMubWlkZGxlTmFtZSAmJiB0aGlzLmlzRmllbGRNYXRjaChmW2F0dHJdLFxuICAgICAgICAgICAgICAgICAgICBbJ20tbmFtZScsICdtaWRkbGUtbmFtZScsICdhZGRpdGlvbmFsLW5hbWUnLCAnbWlkZGxlLWluaXRpYWwnLCAnbWlkZGxlLW4nLCAnbWlkZGxlLWknXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgZmlsbEZpZWxkcy5taWRkbGVOYW1lID0gZjtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghZmlsbEZpZWxkcy5sYXN0TmFtZSAmJiB0aGlzLmlzRmllbGRNYXRjaChmW2F0dHJdLFxuICAgICAgICAgICAgICAgICAgICBMYXN0bmFtZUZpZWxkTmFtZXMpKSB7XG4gICAgICAgICAgICAgICAgICAgIGZpbGxGaWVsZHMubGFzdE5hbWUgPSBmO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFmaWxsRmllbGRzLnRpdGxlICYmIHRoaXMuaXNGaWVsZE1hdGNoKGZbYXR0cl0sXG4gICAgICAgICAgICAgICAgICAgIFsnaG9ub3JpZmljLXByZWZpeCcsICdwcmVmaXgnLCAndGl0bGUnXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgZmlsbEZpZWxkcy50aXRsZSA9IGY7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWZpbGxGaWVsZHMuZW1haWwgJiYgdGhpcy5pc0ZpZWxkTWF0Y2goZlthdHRyXSxcbiAgICAgICAgICAgICAgICAgICAgWydlLW1haWwnLCAnZW1haWwtYWRkcmVzcyddKSkge1xuICAgICAgICAgICAgICAgICAgICBmaWxsRmllbGRzLmVtYWlsID0gZjtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghZmlsbEZpZWxkcy5hZGRyZXNzICYmIHRoaXMuaXNGaWVsZE1hdGNoKGZbYXR0cl0sXG4gICAgICAgICAgICAgICAgICAgIFsnYWRkcmVzcycsICdzdHJlZXQtYWRkcmVzcycsICdhZGRyJywgJ3N0cmVldCcsICdtYWlsaW5nLWFkZHInLCAnYmlsbGluZy1hZGRyJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdtYWlsLWFkZHInLCAnYmlsbC1hZGRyJ10sIFsnbWFpbGluZy1hZGRyJywgJ2JpbGxpbmctYWRkcicsICdtYWlsLWFkZHInLCAnYmlsbC1hZGRyJ10pKSB7XG4gICAgICAgICAgICAgICAgICAgIGZpbGxGaWVsZHMuYWRkcmVzcyA9IGY7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWZpbGxGaWVsZHMuYWRkcmVzczEgJiYgdGhpcy5pc0ZpZWxkTWF0Y2goZlthdHRyXSxcbiAgICAgICAgICAgICAgICAgICAgWydhZGRyZXNzLTEnLCAnYWRkcmVzcy1saW5lLTEnLCAnYWRkci0xJywgJ3N0cmVldC0xJ10pKSB7XG4gICAgICAgICAgICAgICAgICAgIGZpbGxGaWVsZHMuYWRkcmVzczEgPSBmO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFmaWxsRmllbGRzLmFkZHJlc3MyICYmIHRoaXMuaXNGaWVsZE1hdGNoKGZbYXR0cl0sXG4gICAgICAgICAgICAgICAgICAgIFsnYWRkcmVzcy0yJywgJ2FkZHJlc3MtbGluZS0yJywgJ2FkZHItMicsICdzdHJlZXQtMiddKSkge1xuICAgICAgICAgICAgICAgICAgICBmaWxsRmllbGRzLmFkZHJlc3MyID0gZjtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghZmlsbEZpZWxkcy5hZGRyZXNzMyAmJiB0aGlzLmlzRmllbGRNYXRjaChmW2F0dHJdLFxuICAgICAgICAgICAgICAgICAgICBbJ2FkZHJlc3MtMycsICdhZGRyZXNzLWxpbmUtMycsICdhZGRyLTMnLCAnc3RyZWV0LTMnXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgZmlsbEZpZWxkcy5hZGRyZXNzMyA9IGY7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWZpbGxGaWVsZHMucG9zdGFsQ29kZSAmJiB0aGlzLmlzRmllbGRNYXRjaChmW2F0dHJdLFxuICAgICAgICAgICAgICAgICAgICBbJ3Bvc3RhbCcsICd6aXAnLCAnemlwMicsICd6aXAtY29kZScsICdwb3N0YWwtY29kZScsICdwb3N0LWNvZGUnLCAnYWRkcmVzcy16aXAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ2FkZHJlc3MtcG9zdGFsJywgJ2FkZHJlc3MtY29kZScsICdhZGRyZXNzLXBvc3RhbC1jb2RlJywgJ2FkZHJlc3MtemlwLWNvZGUnXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgZmlsbEZpZWxkcy5wb3N0YWxDb2RlID0gZjtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghZmlsbEZpZWxkcy5jaXR5ICYmIHRoaXMuaXNGaWVsZE1hdGNoKGZbYXR0cl0sXG4gICAgICAgICAgICAgICAgICAgIFsnY2l0eScsICd0b3duJywgJ2FkZHJlc3MtbGV2ZWwtMicsICdhZGRyZXNzLWNpdHknLCAnYWRkcmVzcy10b3duJ10pKSB7XG4gICAgICAgICAgICAgICAgICAgIGZpbGxGaWVsZHMuY2l0eSA9IGY7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWZpbGxGaWVsZHMuc3RhdGUgJiYgdGhpcy5pc0ZpZWxkTWF0Y2goZlthdHRyXSxcbiAgICAgICAgICAgICAgICAgICAgWydzdGF0ZScsICdwcm92aW5jZScsICdwcm92ZW5jZScsICdhZGRyZXNzLWxldmVsLTEnLCAnYWRkcmVzcy1zdGF0ZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAnYWRkcmVzcy1wcm92aW5jZSddKSkge1xuICAgICAgICAgICAgICAgICAgICBmaWxsRmllbGRzLnN0YXRlID0gZjtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghZmlsbEZpZWxkcy5jb3VudHJ5ICYmIHRoaXMuaXNGaWVsZE1hdGNoKGZbYXR0cl0sXG4gICAgICAgICAgICAgICAgICAgIFsnY291bnRyeScsICdjb3VudHJ5LWNvZGUnLCAnY291bnRyeS1uYW1lJywgJ2FkZHJlc3MtY291bnRyeScsICdhZGRyZXNzLWNvdW50cnktbmFtZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAnYWRkcmVzcy1jb3VudHJ5LWNvZGUnXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgZmlsbEZpZWxkcy5jb3VudHJ5ID0gZjtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghZmlsbEZpZWxkcy5waG9uZSAmJiB0aGlzLmlzRmllbGRNYXRjaChmW2F0dHJdLFxuICAgICAgICAgICAgICAgICAgICBbJ3Bob25lJywgJ21vYmlsZScsICdtb2JpbGUtcGhvbmUnLCAndGVsJywgJ3RlbGVwaG9uZScsICdwaG9uZS1udW1iZXInXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgZmlsbEZpZWxkcy5waG9uZSA9IGY7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWZpbGxGaWVsZHMudXNlcm5hbWUgJiYgdGhpcy5pc0ZpZWxkTWF0Y2goZlthdHRyXSxcbiAgICAgICAgICAgICAgICAgICAgWyd1c2VyLW5hbWUnLCAndXNlci1pZCcsICdzY3JlZW4tbmFtZSddKSkge1xuICAgICAgICAgICAgICAgICAgICBmaWxsRmllbGRzLnVzZXJuYW1lID0gZjtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghZmlsbEZpZWxkcy5jb21wYW55ICYmIHRoaXMuaXNGaWVsZE1hdGNoKGZbYXR0cl0sXG4gICAgICAgICAgICAgICAgICAgIFsnY29tcGFueScsICdjb21wYW55LW5hbWUnLCAnb3JnYW5pemF0aW9uJywgJ29yZ2FuaXphdGlvbi1uYW1lJ10pKSB7XG4gICAgICAgICAgICAgICAgICAgIGZpbGxGaWVsZHMuY29tcGFueSA9IGY7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgaWRlbnRpdHkgPSBvcHRpb25zLmNpcGhlci5pZGVudGl0eTtcbiAgICAgICAgdGhpcy5tYWtlU2NyaXB0QWN0aW9uKGZpbGxTY3JpcHQsIGlkZW50aXR5LCBmaWxsRmllbGRzLCBmaWxsZWRGaWVsZHMsICd0aXRsZScpO1xuICAgICAgICB0aGlzLm1ha2VTY3JpcHRBY3Rpb24oZmlsbFNjcmlwdCwgaWRlbnRpdHksIGZpbGxGaWVsZHMsIGZpbGxlZEZpZWxkcywgJ2ZpcnN0TmFtZScpO1xuICAgICAgICB0aGlzLm1ha2VTY3JpcHRBY3Rpb24oZmlsbFNjcmlwdCwgaWRlbnRpdHksIGZpbGxGaWVsZHMsIGZpbGxlZEZpZWxkcywgJ21pZGRsZU5hbWUnKTtcbiAgICAgICAgdGhpcy5tYWtlU2NyaXB0QWN0aW9uKGZpbGxTY3JpcHQsIGlkZW50aXR5LCBmaWxsRmllbGRzLCBmaWxsZWRGaWVsZHMsICdsYXN0TmFtZScpO1xuICAgICAgICB0aGlzLm1ha2VTY3JpcHRBY3Rpb24oZmlsbFNjcmlwdCwgaWRlbnRpdHksIGZpbGxGaWVsZHMsIGZpbGxlZEZpZWxkcywgJ2FkZHJlc3MxJyk7XG4gICAgICAgIHRoaXMubWFrZVNjcmlwdEFjdGlvbihmaWxsU2NyaXB0LCBpZGVudGl0eSwgZmlsbEZpZWxkcywgZmlsbGVkRmllbGRzLCAnYWRkcmVzczInKTtcbiAgICAgICAgdGhpcy5tYWtlU2NyaXB0QWN0aW9uKGZpbGxTY3JpcHQsIGlkZW50aXR5LCBmaWxsRmllbGRzLCBmaWxsZWRGaWVsZHMsICdhZGRyZXNzMycpO1xuICAgICAgICB0aGlzLm1ha2VTY3JpcHRBY3Rpb24oZmlsbFNjcmlwdCwgaWRlbnRpdHksIGZpbGxGaWVsZHMsIGZpbGxlZEZpZWxkcywgJ2NpdHknKTtcbiAgICAgICAgdGhpcy5tYWtlU2NyaXB0QWN0aW9uKGZpbGxTY3JpcHQsIGlkZW50aXR5LCBmaWxsRmllbGRzLCBmaWxsZWRGaWVsZHMsICdwb3N0YWxDb2RlJyk7XG4gICAgICAgIHRoaXMubWFrZVNjcmlwdEFjdGlvbihmaWxsU2NyaXB0LCBpZGVudGl0eSwgZmlsbEZpZWxkcywgZmlsbGVkRmllbGRzLCAnY29tcGFueScpO1xuICAgICAgICB0aGlzLm1ha2VTY3JpcHRBY3Rpb24oZmlsbFNjcmlwdCwgaWRlbnRpdHksIGZpbGxGaWVsZHMsIGZpbGxlZEZpZWxkcywgJ2VtYWlsJyk7XG4gICAgICAgIHRoaXMubWFrZVNjcmlwdEFjdGlvbihmaWxsU2NyaXB0LCBpZGVudGl0eSwgZmlsbEZpZWxkcywgZmlsbGVkRmllbGRzLCAncGhvbmUnKTtcbiAgICAgICAgdGhpcy5tYWtlU2NyaXB0QWN0aW9uKGZpbGxTY3JpcHQsIGlkZW50aXR5LCBmaWxsRmllbGRzLCBmaWxsZWRGaWVsZHMsICd1c2VybmFtZScpO1xuXG4gICAgICAgIGxldCBmaWxsZWRTdGF0ZSA9IGZhbHNlO1xuICAgICAgICBpZiAoZmlsbEZpZWxkcy5zdGF0ZSAmJiBpZGVudGl0eS5zdGF0ZSAmJiBpZGVudGl0eS5zdGF0ZS5sZW5ndGggPiAyKSB7XG4gICAgICAgICAgICBjb25zdCBzdGF0ZUxvd2VyID0gaWRlbnRpdHkuc3RhdGUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIGNvbnN0IGlzb1N0YXRlID0gSXNvU3RhdGVzW3N0YXRlTG93ZXJdIHx8IElzb1Byb3ZpbmNlc1tzdGF0ZUxvd2VyXTtcbiAgICAgICAgICAgIGlmIChpc29TdGF0ZSkge1xuICAgICAgICAgICAgICAgIGZpbGxlZFN0YXRlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLm1ha2VTY3JpcHRBY3Rpb25XaXRoVmFsdWUoZmlsbFNjcmlwdCwgaXNvU3RhdGUsIGZpbGxGaWVsZHMuc3RhdGUsIGZpbGxlZEZpZWxkcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWZpbGxlZFN0YXRlKSB7XG4gICAgICAgICAgICB0aGlzLm1ha2VTY3JpcHRBY3Rpb24oZmlsbFNjcmlwdCwgaWRlbnRpdHksIGZpbGxGaWVsZHMsIGZpbGxlZEZpZWxkcywgJ3N0YXRlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZmlsbGVkQ291bnRyeSA9IGZhbHNlO1xuICAgICAgICBpZiAoZmlsbEZpZWxkcy5jb3VudHJ5ICYmIGlkZW50aXR5LmNvdW50cnkgJiYgaWRlbnRpdHkuY291bnRyeS5sZW5ndGggPiAyKSB7XG4gICAgICAgICAgICBjb25zdCBjb3VudHJ5TG93ZXIgPSBpZGVudGl0eS5jb3VudHJ5LnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICBjb25zdCBpc29Db3VudHJ5ID0gSXNvQ291bnRyaWVzW2NvdW50cnlMb3dlcl07XG4gICAgICAgICAgICBpZiAoaXNvQ291bnRyeSkge1xuICAgICAgICAgICAgICAgIGZpbGxlZENvdW50cnkgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMubWFrZVNjcmlwdEFjdGlvbldpdGhWYWx1ZShmaWxsU2NyaXB0LCBpc29Db3VudHJ5LCBmaWxsRmllbGRzLmNvdW50cnksIGZpbGxlZEZpZWxkcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWZpbGxlZENvdW50cnkpIHtcbiAgICAgICAgICAgIHRoaXMubWFrZVNjcmlwdEFjdGlvbihmaWxsU2NyaXB0LCBpZGVudGl0eSwgZmlsbEZpZWxkcywgZmlsbGVkRmllbGRzLCAnY291bnRyeScpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZpbGxGaWVsZHMubmFtZSAmJiAoaWRlbnRpdHkuZmlyc3ROYW1lIHx8IGlkZW50aXR5Lmxhc3ROYW1lKSkge1xuICAgICAgICAgICAgbGV0IGZ1bGxOYW1lID0gJyc7XG4gICAgICAgICAgICBpZiAodGhpcy5oYXNWYWx1ZShpZGVudGl0eS5maXJzdE5hbWUpKSB7XG4gICAgICAgICAgICAgICAgZnVsbE5hbWUgPSBpZGVudGl0eS5maXJzdE5hbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5oYXNWYWx1ZShpZGVudGl0eS5taWRkbGVOYW1lKSkge1xuICAgICAgICAgICAgICAgIGlmIChmdWxsTmFtZSAhPT0gJycpIHtcbiAgICAgICAgICAgICAgICAgICAgZnVsbE5hbWUgKz0gJyAnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmdWxsTmFtZSArPSBpZGVudGl0eS5taWRkbGVOYW1lO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuaGFzVmFsdWUoaWRlbnRpdHkubGFzdE5hbWUpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGZ1bGxOYW1lICE9PSAnJykge1xuICAgICAgICAgICAgICAgICAgICBmdWxsTmFtZSArPSAnICc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZ1bGxOYW1lICs9IGlkZW50aXR5Lmxhc3ROYW1lO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLm1ha2VTY3JpcHRBY3Rpb25XaXRoVmFsdWUoZmlsbFNjcmlwdCwgZnVsbE5hbWUsIGZpbGxGaWVsZHMubmFtZSwgZmlsbGVkRmllbGRzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmaWxsRmllbGRzLmFkZHJlc3MgJiYgdGhpcy5oYXNWYWx1ZShpZGVudGl0eS5hZGRyZXNzMSkpIHtcbiAgICAgICAgICAgIGxldCBhZGRyZXNzID0gJyc7XG4gICAgICAgICAgICBpZiAodGhpcy5oYXNWYWx1ZShpZGVudGl0eS5hZGRyZXNzMSkpIHtcbiAgICAgICAgICAgICAgICBhZGRyZXNzID0gaWRlbnRpdHkuYWRkcmVzczE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5oYXNWYWx1ZShpZGVudGl0eS5hZGRyZXNzMikpIHtcbiAgICAgICAgICAgICAgICBpZiAoYWRkcmVzcyAhPT0gJycpIHtcbiAgICAgICAgICAgICAgICAgICAgYWRkcmVzcyArPSAnLCAnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhZGRyZXNzICs9IGlkZW50aXR5LmFkZHJlc3MyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuaGFzVmFsdWUoaWRlbnRpdHkuYWRkcmVzczMpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGFkZHJlc3MgIT09ICcnKSB7XG4gICAgICAgICAgICAgICAgICAgIGFkZHJlc3MgKz0gJywgJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYWRkcmVzcyArPSBpZGVudGl0eS5hZGRyZXNzMztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5tYWtlU2NyaXB0QWN0aW9uV2l0aFZhbHVlKGZpbGxTY3JpcHQsIGFkZHJlc3MsIGZpbGxGaWVsZHMuYWRkcmVzcywgZmlsbGVkRmllbGRzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmaWxsU2NyaXB0O1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNFeGNsdWRlZFR5cGUodHlwZTogc3RyaW5nLCBleGNsdWRlZFR5cGVzOiBzdHJpbmdbXSkge1xuICAgICAgICByZXR1cm4gZXhjbHVkZWRUeXBlcy5pbmRleE9mKHR5cGUpID4gLTE7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc0ZpZWxkTWF0Y2godmFsdWU6IHN0cmluZywgb3B0aW9uczogc3RyaW5nW10sIGNvbnRhaW5zT3B0aW9ucz86IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gICAgICAgIHZhbHVlID0gdmFsdWUudHJpbSgpLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvW15hLXpBLVowLTldKy9nLCAnJyk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3B0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IG9wdGlvbiA9IG9wdGlvbnNbaV07XG4gICAgICAgICAgICBjb25zdCBjaGVja1ZhbHVlQ29udGFpbnMgPSBjb250YWluc09wdGlvbnMgPT0gbnVsbCB8fCBjb250YWluc09wdGlvbnMuaW5kZXhPZihvcHRpb24pID4gLTE7XG4gICAgICAgICAgICBvcHRpb24gPSBvcHRpb24udG9Mb3dlckNhc2UoKS5yZXBsYWNlKC8tL2csICcnKTtcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gb3B0aW9uIHx8IChjaGVja1ZhbHVlQ29udGFpbnMgJiYgdmFsdWUuaW5kZXhPZihvcHRpb24pID4gLTEpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBtYWtlU2NyaXB0QWN0aW9uKGZpbGxTY3JpcHQ6IEF1dG9maWxsU2NyaXB0LCBjaXBoZXJEYXRhOiBhbnksIGZpbGxGaWVsZHM6IHsgW2lkOiBzdHJpbmddOiBBdXRvZmlsbEZpZWxkOyB9LFxuICAgICAgICBmaWxsZWRGaWVsZHM6IHsgW2lkOiBzdHJpbmddOiBBdXRvZmlsbEZpZWxkOyB9LCBkYXRhUHJvcDogc3RyaW5nLCBmaWVsZFByb3A/OiBzdHJpbmcpIHtcbiAgICAgICAgZmllbGRQcm9wID0gZmllbGRQcm9wIHx8IGRhdGFQcm9wO1xuICAgICAgICB0aGlzLm1ha2VTY3JpcHRBY3Rpb25XaXRoVmFsdWUoZmlsbFNjcmlwdCwgY2lwaGVyRGF0YVtkYXRhUHJvcF0sIGZpbGxGaWVsZHNbZmllbGRQcm9wXSwgZmlsbGVkRmllbGRzKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG1ha2VTY3JpcHRBY3Rpb25XaXRoVmFsdWUoZmlsbFNjcmlwdDogQXV0b2ZpbGxTY3JpcHQsIGRhdGFWYWx1ZTogYW55LCBmaWVsZDogQXV0b2ZpbGxGaWVsZCxcbiAgICAgICAgZmlsbGVkRmllbGRzOiB7IFtpZDogc3RyaW5nXTogQXV0b2ZpbGxGaWVsZDsgfSkge1xuXG4gICAgICAgIGxldCBkb0ZpbGwgPSBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMuaGFzVmFsdWUoZGF0YVZhbHVlKSAmJiBmaWVsZCkge1xuICAgICAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT09ICdzZWxlY3Qtb25lJyAmJiBmaWVsZC5zZWxlY3RJbmZvICYmIGZpZWxkLnNlbGVjdEluZm8ub3B0aW9ucykge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmllbGQuc2VsZWN0SW5mby5vcHRpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG9wdGlvbiA9IGZpZWxkLnNlbGVjdEluZm8ub3B0aW9uc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBvcHRpb24ubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmhhc1ZhbHVlKG9wdGlvbltqXSkgJiYgb3B0aW9uW2pdLnRvTG93ZXJDYXNlKCkgPT09IGRhdGFWYWx1ZS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9GaWxsID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9uLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVZhbHVlID0gb3B0aW9uWzFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChkb0ZpbGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkb0ZpbGwgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRvRmlsbCkge1xuICAgICAgICAgICAgZmlsbGVkRmllbGRzW2ZpZWxkLm9waWRdID0gZmllbGQ7XG4gICAgICAgICAgICB0aGlzLmZpbGxCeU9waWQoZmlsbFNjcmlwdCwgZmllbGQsIGRhdGFWYWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGxvYWRQYXNzd29yZEZpZWxkcyhwYWdlRGV0YWlsczogQXV0b2ZpbGxQYWdlRGV0YWlscywgY2FuQmVIaWRkZW46IGJvb2xlYW4sIGNhbkJlUmVhZE9ubHk6IGJvb2xlYW4sXG4gICAgICAgIG11c3RCZUVtcHR5OiBib29sZWFuLCBmaWxsTmV3UGFzc3dvcmQ6IGJvb2xlYW4pIHtcbiAgICAgICAgY29uc3QgYXJyOiBBdXRvZmlsbEZpZWxkW10gPSBbXTtcbiAgICAgICAgcGFnZURldGFpbHMuZmllbGRzLmZvckVhY2goZiA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5mb3JDdXN0b21GaWVsZHNPbmx5KGYpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBpc1Bhc3N3b3JkID0gZi50eXBlID09PSAncGFzc3dvcmQnO1xuICAgICAgICAgICAgY29uc3QgdmFsdWVJc0xpa2VQYXNzd29yZCA9ICh2YWx1ZTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBSZW1vdmVzIGFsbCB3aGl0ZXNwYWNlLCBfIGFuZCAtIGNoYXJhY3RlcnNcbiAgICAgICAgICAgICAgICBjb25zdCBjbGVhbmVkVmFsdWUgPSB2YWx1ZS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1tcXHNfXFwtXS9nLCAnJyk7XG5cbiAgICAgICAgICAgICAgICBpZiAoY2xlYW5lZFZhbHVlLmluZGV4T2YoJ3Bhc3N3b3JkJykgPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBpZ25vcmVMaXN0ID0gWydvbmV0aW1lcGFzc3dvcmQnLCAnY2FwdGNoYScsICdmaW5kYW55dGhpbmcnLCAnZm9yZ290J107XG4gICAgICAgICAgICAgICAgaWYgKGlnbm9yZUxpc3Quc29tZShpID0+IGNsZWFuZWRWYWx1ZS5pbmRleE9mKGkpID4gLTEpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb25zdCBpc0xpa2VQYXNzd29yZCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZi50eXBlICE9PSAndGV4dCcpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodmFsdWVJc0xpa2VQYXNzd29yZChmLmh0bWxJRCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZUlzTGlrZVBhc3N3b3JkKGYuaHRtbE5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodmFsdWVJc0xpa2VQYXNzd29yZChmLnBsYWNlaG9sZGVyKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGlmICghZi5kaXNhYmxlZCAmJiAoY2FuQmVSZWFkT25seSB8fCAhZi5yZWFkb25seSkgJiYgKGlzUGFzc3dvcmQgfHwgaXNMaWtlUGFzc3dvcmQoKSlcbiAgICAgICAgICAgICAgICAmJiAoY2FuQmVIaWRkZW4gfHwgZi52aWV3YWJsZSkgJiYgKCFtdXN0QmVFbXB0eSB8fCBmLnZhbHVlID09IG51bGwgfHwgZi52YWx1ZS50cmltKCkgPT09ICcnKVxuICAgICAgICAgICAgICAgICYmIChmaWxsTmV3UGFzc3dvcmQgfHwgZi5hdXRvQ29tcGxldGVUeXBlICE9PSAnbmV3LXBhc3N3b3JkJykpIHtcbiAgICAgICAgICAgICAgICBhcnIucHVzaChmKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBhcnI7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmaW5kVXNlcm5hbWVGaWVsZChwYWdlRGV0YWlsczogQXV0b2ZpbGxQYWdlRGV0YWlscywgcGFzc3dvcmRGaWVsZDogQXV0b2ZpbGxGaWVsZCwgY2FuQmVIaWRkZW46IGJvb2xlYW4sXG4gICAgICAgIGNhbkJlUmVhZE9ubHk6IGJvb2xlYW4sIHdpdGhvdXRGb3JtOiBib29sZWFuKSB7XG4gICAgICAgIGxldCB1c2VybmFtZUZpZWxkOiBBdXRvZmlsbEZpZWxkID0gbnVsbDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYWdlRGV0YWlscy5maWVsZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGYgPSBwYWdlRGV0YWlscy5maWVsZHNbaV07XG4gICAgICAgICAgICBpZiAodGhpcy5mb3JDdXN0b21GaWVsZHNPbmx5KGYpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChmLmVsZW1lbnROdW1iZXIgPj0gcGFzc3dvcmRGaWVsZC5lbGVtZW50TnVtYmVyKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghZi5kaXNhYmxlZCAmJiAoY2FuQmVSZWFkT25seSB8fCAhZi5yZWFkb25seSkgJiZcbiAgICAgICAgICAgICAgICAod2l0aG91dEZvcm0gfHwgZi5mb3JtID09PSBwYXNzd29yZEZpZWxkLmZvcm0pICYmIChjYW5CZUhpZGRlbiB8fCBmLnZpZXdhYmxlKSAmJlxuICAgICAgICAgICAgICAgIChmLnR5cGUgPT09ICd0ZXh0JyB8fCBmLnR5cGUgPT09ICdlbWFpbCcgfHwgZi50eXBlID09PSAndGVsJykpIHtcbiAgICAgICAgICAgICAgICB1c2VybmFtZUZpZWxkID0gZjtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmZpbmRNYXRjaGluZ0ZpZWxkSW5kZXgoZiwgVXNlcm5hbWVGaWVsZE5hbWVzKSA+IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFdlIGZvdW5kIGFuIGV4YWN0IG1hdGNoLiBObyBuZWVkIHRvIGtlZXAgbG9va2luZy5cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHVzZXJuYW1lRmllbGQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmaW5kTWF0Y2hpbmdGaWVsZEluZGV4KGZpZWxkOiBBdXRvZmlsbEZpZWxkLCBuYW1lczogc3RyaW5nW10pOiBudW1iZXIge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAobmFtZXNbaV0uaW5kZXhPZignPScpID4gLTEpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5maWVsZFByb3BlcnR5SXNQcmVmaXhNYXRjaChmaWVsZCwgJ2h0bWxJRCcsIG5hbWVzW2ldLCAnaWQnKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZmllbGRQcm9wZXJ0eUlzUHJlZml4TWF0Y2goZmllbGQsICdodG1sTmFtZScsIG5hbWVzW2ldLCAnbmFtZScpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5maWVsZFByb3BlcnR5SXNQcmVmaXhNYXRjaChmaWVsZCwgJ2xhYmVsLXRhZycsIG5hbWVzW2ldLCAnbGFiZWwnKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZmllbGRQcm9wZXJ0eUlzUHJlZml4TWF0Y2goZmllbGQsICdsYWJlbC1hcmlhJywgbmFtZXNbaV0sICdsYWJlbCcpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5maWVsZFByb3BlcnR5SXNQcmVmaXhNYXRjaChmaWVsZCwgJ3BsYWNlaG9sZGVyJywgbmFtZXNbaV0sICdwbGFjZWhvbGRlcicpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuZmllbGRQcm9wZXJ0eUlzTWF0Y2goZmllbGQsICdodG1sSUQnLCBuYW1lc1tpXSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmZpZWxkUHJvcGVydHlJc01hdGNoKGZpZWxkLCAnaHRtbE5hbWUnLCBuYW1lc1tpXSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmZpZWxkUHJvcGVydHlJc01hdGNoKGZpZWxkLCAnbGFiZWwtdGFnJywgbmFtZXNbaV0pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5maWVsZFByb3BlcnR5SXNNYXRjaChmaWVsZCwgJ2xhYmVsLWFyaWEnLCBuYW1lc1tpXSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmZpZWxkUHJvcGVydHlJc01hdGNoKGZpZWxkLCAncGxhY2Vob2xkZXInLCBuYW1lc1tpXSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAtMTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGZpZWxkUHJvcGVydHlJc1ByZWZpeE1hdGNoKGZpZWxkOiBhbnksIHByb3BlcnR5OiBzdHJpbmcsIG5hbWU6IHN0cmluZywgcHJlZml4OiBzdHJpbmcsXG4gICAgICAgIHNlcGFyYXRvciA9ICc9Jyk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAobmFtZS5pbmRleE9mKHByZWZpeCArIHNlcGFyYXRvcikgPT09IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHNlcEluZGV4ID0gbmFtZS5pbmRleE9mKHNlcGFyYXRvcik7XG4gICAgICAgICAgICBjb25zdCB2YWwgPSBuYW1lLnN1YnN0cmluZyhzZXBJbmRleCArIDEpO1xuICAgICAgICAgICAgcmV0dXJuIHZhbCAhPSBudWxsICYmIHRoaXMuZmllbGRQcm9wZXJ0eUlzTWF0Y2goZmllbGQsIHByb3BlcnR5LCB2YWwpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGZpZWxkUHJvcGVydHlJc01hdGNoKGZpZWxkOiBhbnksIHByb3BlcnR5OiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBsZXQgZmllbGRWYWwgPSBmaWVsZFtwcm9wZXJ0eV0gYXMgc3RyaW5nO1xuICAgICAgICBpZiAoIXRoaXMuaGFzVmFsdWUoZmllbGRWYWwpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBmaWVsZFZhbCA9IGZpZWxkVmFsLnRyaW0oKS5yZXBsYWNlKC8oPzpcXHJcXG58XFxyfFxcbikvZywgJycpO1xuICAgICAgICBpZiAobmFtZS5zdGFydHNXaXRoKCdyZWdleD0nKSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCByZWdleFBhcnRzID0gbmFtZS5zcGxpdCgnPScsIDIpO1xuICAgICAgICAgICAgICAgIGlmIChyZWdleFBhcnRzLmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZWdleCA9IG5ldyBSZWdFeHAocmVnZXhQYXJ0c1sxXSwgJ2knKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlZ2V4LnRlc3QoZmllbGRWYWwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ1NlcnZpY2UuZXJyb3IoZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAobmFtZS5zdGFydHNXaXRoKCdjc3Y9JykpIHtcbiAgICAgICAgICAgIGNvbnN0IGNzdlBhcnRzID0gbmFtZS5zcGxpdCgnPScsIDIpO1xuICAgICAgICAgICAgaWYgKGNzdlBhcnRzLmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNzdlZhbHMgPSBjc3ZQYXJ0c1sxXS5zcGxpdCgnLCcpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY3N2VmFscy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWwgPSBjc3ZWYWxzW2ldO1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsICE9IG51bGwgJiYgdmFsLnRyaW0oKS50b0xvd2VyQ2FzZSgpID09PSBmaWVsZFZhbC50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmllbGRWYWwudG9Mb3dlckNhc2UoKSA9PT0gbmFtZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGZpZWxkSXNGdXp6eU1hdGNoKGZpZWxkOiBBdXRvZmlsbEZpZWxkLCBuYW1lczogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzVmFsdWUoZmllbGQuaHRtbElEKSAmJiB0aGlzLmZ1enp5TWF0Y2gobmFtZXMsIGZpZWxkLmh0bWxJRCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmhhc1ZhbHVlKGZpZWxkLmh0bWxOYW1lKSAmJiB0aGlzLmZ1enp5TWF0Y2gobmFtZXMsIGZpZWxkLmh0bWxOYW1lKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaGFzVmFsdWUoZmllbGRbJ2xhYmVsLXRhZyddKSAmJiB0aGlzLmZ1enp5TWF0Y2gobmFtZXMsIGZpZWxkWydsYWJlbC10YWcnXSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmhhc1ZhbHVlKGZpZWxkLnBsYWNlaG9sZGVyKSAmJiB0aGlzLmZ1enp5TWF0Y2gobmFtZXMsIGZpZWxkLnBsYWNlaG9sZGVyKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaGFzVmFsdWUoZmllbGRbJ2xhYmVsLWxlZnQnXSkgJiYgdGhpcy5mdXp6eU1hdGNoKG5hbWVzLCBmaWVsZFsnbGFiZWwtbGVmdCddKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaGFzVmFsdWUoZmllbGRbJ2xhYmVsLXRvcCddKSAmJiB0aGlzLmZ1enp5TWF0Y2gobmFtZXMsIGZpZWxkWydsYWJlbC10b3AnXSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmhhc1ZhbHVlKGZpZWxkWydsYWJlbC1hcmlhJ10pICYmIHRoaXMuZnV6enlNYXRjaChuYW1lcywgZmllbGRbJ2xhYmVsLWFyaWEnXSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgZnV6enlNYXRjaChvcHRpb25zOiBzdHJpbmdbXSwgdmFsdWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAob3B0aW9ucyA9PSBudWxsIHx8IG9wdGlvbnMubGVuZ3RoID09PSAwIHx8IHZhbHVlID09IG51bGwgfHwgdmFsdWUgPT09ICcnKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoLyg/OlxcclxcbnxcXHJ8XFxuKS9nLCAnJykudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvcHRpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodmFsdWUuaW5kZXhPZihvcHRpb25zW2ldKSA+IC0xKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoYXNWYWx1ZShzdHI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gc3RyICYmIHN0ciAhPT0gJyc7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRGaWxsU2NyaXB0Rm9yRm9jdXMoZmlsbGVkRmllbGRzOiB7IFtpZDogc3RyaW5nXTogQXV0b2ZpbGxGaWVsZDsgfSxcbiAgICAgICAgZmlsbFNjcmlwdDogQXV0b2ZpbGxTY3JpcHQpOiBBdXRvZmlsbFNjcmlwdCB7XG4gICAgICAgIGxldCBsYXN0RmllbGQ6IEF1dG9maWxsRmllbGQgPSBudWxsO1xuICAgICAgICBsZXQgbGFzdFBhc3N3b3JkRmllbGQ6IEF1dG9maWxsRmllbGQgPSBudWxsO1xuXG4gICAgICAgIGZvciAoY29uc3Qgb3BpZCBpbiBmaWxsZWRGaWVsZHMpIHtcbiAgICAgICAgICAgIGlmIChmaWxsZWRGaWVsZHMuaGFzT3duUHJvcGVydHkob3BpZCkgJiYgZmlsbGVkRmllbGRzW29waWRdLnZpZXdhYmxlKSB7XG4gICAgICAgICAgICAgICAgbGFzdEZpZWxkID0gZmlsbGVkRmllbGRzW29waWRdO1xuXG4gICAgICAgICAgICAgICAgaWYgKGZpbGxlZEZpZWxkc1tvcGlkXS50eXBlID09PSAncGFzc3dvcmQnKSB7XG4gICAgICAgICAgICAgICAgICAgIGxhc3RQYXNzd29yZEZpZWxkID0gZmlsbGVkRmllbGRzW29waWRdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFByaW9yaXRpemUgcGFzc3dvcmQgZmllbGQgb3ZlciBvdGhlcnMuXG4gICAgICAgIGlmIChsYXN0UGFzc3dvcmRGaWVsZCkge1xuICAgICAgICAgICAgZmlsbFNjcmlwdC5zY3JpcHQucHVzaChbJ2ZvY3VzX2J5X29waWQnLCBsYXN0UGFzc3dvcmRGaWVsZC5vcGlkXSk7XG4gICAgICAgIH0gZWxzZSBpZiAobGFzdEZpZWxkKSB7XG4gICAgICAgICAgICBmaWxsU2NyaXB0LnNjcmlwdC5wdXNoKFsnZm9jdXNfYnlfb3BpZCcsIGxhc3RGaWVsZC5vcGlkXSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmlsbFNjcmlwdDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGZpbGxCeU9waWQoZmlsbFNjcmlwdDogQXV0b2ZpbGxTY3JpcHQsIGZpZWxkOiBBdXRvZmlsbEZpZWxkLCB2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGlmIChmaWVsZC5tYXhMZW5ndGggJiYgdmFsdWUgJiYgdmFsdWUubGVuZ3RoID4gZmllbGQubWF4TGVuZ3RoKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnN1YnN0cigwLCB2YWx1ZS5sZW5ndGgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmaWVsZC50YWdOYW1lICE9PSAnc3BhbicpIHtcbiAgICAgICAgICAgIGZpbGxTY3JpcHQuc2NyaXB0LnB1c2goWydjbGlja19vbl9vcGlkJywgZmllbGQub3BpZF0pO1xuICAgICAgICAgICAgZmlsbFNjcmlwdC5zY3JpcHQucHVzaChbJ2ZvY3VzX2J5X29waWQnLCBmaWVsZC5vcGlkXSk7XG4gICAgICAgIH1cbiAgICAgICAgZmlsbFNjcmlwdC5zY3JpcHQucHVzaChbJ2ZpbGxfYnlfb3BpZCcsIGZpZWxkLm9waWQsIHZhbHVlXSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmb3JDdXN0b21GaWVsZHNPbmx5KGZpZWxkOiBBdXRvZmlsbEZpZWxkKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBmaWVsZC50YWdOYW1lID09PSAnc3Bhbic7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgS2V5U3VmZml4T3B0aW9ucyB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvc3RvcmFnZS5zZXJ2aWNlJztcbmltcG9ydCB7IENyeXB0b1NlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vc2VydmljZXMvY3J5cHRvLnNlcnZpY2UnO1xuXG5leHBvcnQgY2xhc3MgQnJvd3NlckNyeXB0b1NlcnZpY2UgZXh0ZW5kcyBDcnlwdG9TZXJ2aWNlIHtcbiAgICBwcm90ZWN0ZWQgYXN5bmMgcmV0cmlldmVLZXlGcm9tU3RvcmFnZShrZXlTdWZmaXg6IEtleVN1ZmZpeE9wdGlvbnMpIHtcbiAgICAgICAgaWYgKGtleVN1ZmZpeCA9PT0gJ2Jpb21ldHJpYycpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucGxhdGZvcm1VdGlsU2VydmljZS5hdXRoZW50aWNhdGVCaW9tZXRyaWMoKTtcbiAgICAgICAgICAgIHJldHVybiAoYXdhaXQgdGhpcy5nZXRLZXkoKSk/LmtleUI2NDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhd2FpdCBzdXBlci5yZXRyaWV2ZUtleUZyb21TdG9yYWdlKGtleVN1ZmZpeCk7XG4gICAgfVxuXG59XG4iLCJpbXBvcnQgeyBNZXNzYWdpbmdTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9tZXNzYWdpbmcuc2VydmljZSc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJyb3dzZXJNZXNzYWdpbmdTZXJ2aWNlIGltcGxlbWVudHMgTWVzc2FnaW5nU2VydmljZSB7XG4gICAgc2VuZChzdWJzY3JpYmVyOiBzdHJpbmcsIGFyZzogYW55ID0ge30pIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IE9iamVjdC5hc3NpZ24oe30sIHsgY29tbWFuZDogc3Vic2NyaWJlciB9LCBhcmcpO1xuICAgICAgICBjaHJvbWUucnVudGltZS5zZW5kTWVzc2FnZShtZXNzYWdlKTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBCcm93c2VyQXBpIH0gZnJvbSAnLi4vYnJvd3Nlci9icm93c2VyQXBpJztcbmltcG9ydCB7IFNhZmFyaUFwcCB9IGZyb20gJy4uL2Jyb3dzZXIvc2FmYXJpQXBwJztcblxuaW1wb3J0IHsgRGV2aWNlVHlwZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9lbnVtcy9kZXZpY2VUeXBlJztcbmltcG9ydCB7IFRoZW1lVHlwZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9lbnVtcy90aGVtZVR5cGUnO1xuXG5pbXBvcnQgeyBNZXNzYWdpbmdTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9tZXNzYWdpbmcuc2VydmljZSc7XG5pbXBvcnQgeyBQbGF0Zm9ybVV0aWxzU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvcGxhdGZvcm1VdGlscy5zZXJ2aWNlJztcbmltcG9ydCB7IFN0b3JhZ2VTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9zdG9yYWdlLnNlcnZpY2UnO1xuXG5pbXBvcnQgeyBDb25zdGFudHNTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL3NlcnZpY2VzL2NvbnN0YW50cy5zZXJ2aWNlJztcblxuY29uc3QgRGlhbG9nUHJvbWlzZUV4cGlyYXRpb24gPSA2MDAwMDA7IC8vIDEwIG1pbnV0ZXNcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQnJvd3NlclBsYXRmb3JtVXRpbHNTZXJ2aWNlIGltcGxlbWVudHMgUGxhdGZvcm1VdGlsc1NlcnZpY2Uge1xuICAgIGlkZW50aXR5Q2xpZW50SWQ6IHN0cmluZyA9ICdicm93c2VyJztcblxuICAgIHByaXZhdGUgc2hvd0RpYWxvZ1Jlc29sdmVzID0gbmV3IE1hcDxudW1iZXIsIHsgcmVzb2x2ZTogKHZhbHVlOiBib29sZWFuKSA9PiB2b2lkLCBkYXRlOiBEYXRlIH0+KCk7XG4gICAgcHJpdmF0ZSBwYXNzd29yZERpYWxvZ1Jlc29sdmVzID0gbmV3IE1hcDxudW1iZXIsIHsgdHJ5UmVzb2x2ZTogKGNhbmNlbGVkOiBib29sZWFuLCBwYXNzd29yZDogc3RyaW5nKSA9PiBQcm9taXNlPGJvb2xlYW4+LCBkYXRlOiBEYXRlIH0+KCk7XG4gICAgcHJpdmF0ZSBkZXZpY2VDYWNoZTogRGV2aWNlVHlwZSA9IG51bGw7XG4gICAgcHJpdmF0ZSBwcmVmZXJzQ29sb3JTY2hlbWVEYXJrID0gd2luZG93Lm1hdGNoTWVkaWEoJyhwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyayknKTtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgbWVzc2FnaW5nU2VydmljZTogTWVzc2FnaW5nU2VydmljZSwgcHJpdmF0ZSBzdG9yYWdlU2VydmljZTogU3RvcmFnZVNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgY2xpcGJvYXJkV3JpdGVDYWxsYmFjazogKGNsaXBib2FyZFZhbHVlOiBzdHJpbmcsIGNsZWFyTXM6IG51bWJlcikgPT4gdm9pZCxcbiAgICAgICAgcHJpdmF0ZSBiaW9tZXRyaWNDYWxsYmFjazogKCkgPT4gUHJvbWlzZTxib29sZWFuPikgeyB9XG5cbiAgICBnZXREZXZpY2UoKTogRGV2aWNlVHlwZSB7XG4gICAgICAgIGlmICh0aGlzLmRldmljZUNhY2hlKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kZXZpY2VDYWNoZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJyBGaXJlZm94LycpICE9PSAtMSB8fCBuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJyBHZWNrby8nKSAhPT0gLTEpIHtcbiAgICAgICAgICAgIHRoaXMuZGV2aWNlQ2FjaGUgPSBEZXZpY2VUeXBlLkZpcmVmb3hFeHRlbnNpb247XG4gICAgICAgIH0gZWxzZSBpZiAoKCEhKHdpbmRvdyBhcyBhbnkpLm9wciAmJiAhIW9wci5hZGRvbnMpIHx8ICEhKHdpbmRvdyBhcyBhbnkpLm9wZXJhIHx8XG4gICAgICAgICAgICBuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJyBPUFIvJykgPj0gMCkge1xuICAgICAgICAgICAgdGhpcy5kZXZpY2VDYWNoZSA9IERldmljZVR5cGUuT3BlcmFFeHRlbnNpb247XG4gICAgICAgIH0gZWxzZSBpZiAobmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCcgRWRnLycpICE9PSAtMSkge1xuICAgICAgICAgICAgdGhpcy5kZXZpY2VDYWNoZSA9IERldmljZVR5cGUuRWRnZUV4dGVuc2lvbjtcbiAgICAgICAgfSBlbHNlIGlmIChuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJyBWaXZhbGRpLycpICE9PSAtMSkge1xuICAgICAgICAgICAgdGhpcy5kZXZpY2VDYWNoZSA9IERldmljZVR5cGUuVml2YWxkaUV4dGVuc2lvbjtcbiAgICAgICAgfSBlbHNlIGlmICgod2luZG93IGFzIGFueSkuY2hyb21lICYmIG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignIENocm9tZS8nKSAhPT0gLTEpIHtcbiAgICAgICAgICAgIHRoaXMuZGV2aWNlQ2FjaGUgPSBEZXZpY2VUeXBlLkNocm9tZUV4dGVuc2lvbjtcbiAgICAgICAgfSBlbHNlIGlmIChuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJyBTYWZhcmkvJykgIT09IC0xKSB7XG4gICAgICAgICAgICB0aGlzLmRldmljZUNhY2hlID0gRGV2aWNlVHlwZS5TYWZhcmlFeHRlbnNpb247XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5kZXZpY2VDYWNoZTtcbiAgICB9XG5cbiAgICBnZXREZXZpY2VTdHJpbmcoKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgZGV2aWNlID0gRGV2aWNlVHlwZVt0aGlzLmdldERldmljZSgpXS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICByZXR1cm4gZGV2aWNlLnJlcGxhY2UoJ2V4dGVuc2lvbicsICcnKTtcbiAgICB9XG5cbiAgICBpc0ZpcmVmb3goKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldERldmljZSgpID09PSBEZXZpY2VUeXBlLkZpcmVmb3hFeHRlbnNpb247XG4gICAgfVxuXG4gICAgaXNDaHJvbWUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldERldmljZSgpID09PSBEZXZpY2VUeXBlLkNocm9tZUV4dGVuc2lvbjtcbiAgICB9XG5cbiAgICBpc0VkZ2UoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldERldmljZSgpID09PSBEZXZpY2VUeXBlLkVkZ2VFeHRlbnNpb247XG4gICAgfVxuXG4gICAgaXNPcGVyYSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RGV2aWNlKCkgPT09IERldmljZVR5cGUuT3BlcmFFeHRlbnNpb247XG4gICAgfVxuXG4gICAgaXNWaXZhbGRpKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXREZXZpY2UoKSA9PT0gRGV2aWNlVHlwZS5WaXZhbGRpRXh0ZW5zaW9uO1xuICAgIH1cblxuICAgIGlzU2FmYXJpKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXREZXZpY2UoKSA9PT0gRGV2aWNlVHlwZS5TYWZhcmlFeHRlbnNpb247XG4gICAgfVxuXG4gICAgaXNJRSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlzTWFjQXBwU3RvcmUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBhc3luYyBpc1ZpZXdPcGVuKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICBpZiAoYXdhaXQgQnJvd3NlckFwaS5pc1BvcHVwT3BlbigpKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmlzU2FmYXJpKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNpZGViYXJWaWV3ID0gdGhpcy5zaWRlYmFyVmlld05hbWUoKTtcbiAgICAgICAgY29uc3Qgc2lkZWJhck9wZW4gPSBzaWRlYmFyVmlldyAhPSBudWxsICYmIGNocm9tZS5leHRlbnNpb24uZ2V0Vmlld3MoeyB0eXBlOiBzaWRlYmFyVmlldyB9KS5sZW5ndGggPiAwO1xuICAgICAgICBpZiAoc2lkZWJhck9wZW4pIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdGFiT3BlbiA9IGNocm9tZS5leHRlbnNpb24uZ2V0Vmlld3MoeyB0eXBlOiAndGFiJyB9KS5sZW5ndGggPiAwO1xuICAgICAgICByZXR1cm4gdGFiT3BlbjtcbiAgICB9XG5cbiAgICBsb2NrVGltZW91dCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBsYXVuY2hVcmkodXJpOiBzdHJpbmcsIG9wdGlvbnM/OiBhbnkpOiB2b2lkIHtcbiAgICAgICAgQnJvd3NlckFwaS5jcmVhdGVOZXdUYWIodXJpLCBvcHRpb25zICYmIG9wdGlvbnMuZXh0ZW5zaW9uUGFnZSA9PT0gdHJ1ZSk7XG4gICAgfVxuXG4gICAgc2F2ZUZpbGUod2luOiBXaW5kb3csIGJsb2JEYXRhOiBhbnksIGJsb2JPcHRpb25zOiBhbnksIGZpbGVOYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgQnJvd3NlckFwaS5kb3dubG9hZEZpbGUod2luLCBibG9iRGF0YSwgYmxvYk9wdGlvbnMsIGZpbGVOYW1lKTtcbiAgICB9XG5cbiAgICBnZXRBcHBsaWNhdGlvblZlcnNpb24oKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShCcm93c2VyQXBpLmdldEFwcGxpY2F0aW9uVmVyc2lvbigpKTtcbiAgICB9XG5cbiAgICBzdXBwb3J0c1dlYkF1dGhuKHdpbjogV2luZG93KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAodHlwZW9mKFB1YmxpY0tleUNyZWRlbnRpYWwpICE9PSAndW5kZWZpbmVkJyk7XG4gICAgfVxuXG4gICAgc3VwcG9ydHNEdW8oKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHNob3dUb2FzdCh0eXBlOiAnZXJyb3InIHwgJ3N1Y2Nlc3MnIHwgJ3dhcm5pbmcnIHwgJ2luZm8nLCB0aXRsZTogc3RyaW5nLCB0ZXh0OiBzdHJpbmcgfCBzdHJpbmdbXSxcbiAgICAgICAgb3B0aW9ucz86IGFueSk6IHZvaWQge1xuICAgICAgICB0aGlzLm1lc3NhZ2luZ1NlcnZpY2Uuc2VuZCgnc2hvd1RvYXN0Jywge1xuICAgICAgICAgICAgdGV4dDogdGV4dCxcbiAgICAgICAgICAgIHRpdGxlOiB0aXRsZSxcbiAgICAgICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgICAgICBvcHRpb25zOiBvcHRpb25zLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzaG93RGlhbG9nKGJvZHk6IHN0cmluZywgdGl0bGU/OiBzdHJpbmcsIGNvbmZpcm1UZXh0Pzogc3RyaW5nLCBjYW5jZWxUZXh0Pzogc3RyaW5nLCB0eXBlPzogc3RyaW5nLFxuICAgICAgICBib2R5SXNIdG1sOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICAgICAgY29uc3QgZGlhbG9nSWQgPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUik7XG4gICAgICAgIHRoaXMubWVzc2FnaW5nU2VydmljZS5zZW5kKCdzaG93RGlhbG9nJywge1xuICAgICAgICAgICAgdGV4dDogYm9keUlzSHRtbCA/IG51bGwgOiBib2R5LFxuICAgICAgICAgICAgaHRtbDogYm9keUlzSHRtbCA/IGJvZHkgOiBudWxsLFxuICAgICAgICAgICAgdGl0bGU6IHRpdGxlLFxuICAgICAgICAgICAgY29uZmlybVRleHQ6IGNvbmZpcm1UZXh0LFxuICAgICAgICAgICAgY2FuY2VsVGV4dDogY2FuY2VsVGV4dCxcbiAgICAgICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgICAgICBkaWFsb2dJZDogZGlhbG9nSWQsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8Ym9vbGVhbj4ocmVzb2x2ZSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNob3dEaWFsb2dSZXNvbHZlcy5zZXQoZGlhbG9nSWQsIHsgcmVzb2x2ZTogcmVzb2x2ZSwgZGF0ZTogbmV3IERhdGUoKSB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgaXNEZXYoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBwcm9jZXNzLmVudi5FTlYgPT09ICdkZXZlbG9wbWVudCc7XG4gICAgfVxuXG4gICAgaXNTZWxmSG9zdCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvcHlUb0NsaXBib2FyZCh0ZXh0OiBzdHJpbmcsIG9wdGlvbnM/OiBhbnkpOiB2b2lkIHtcbiAgICAgICAgbGV0IHdpbiA9IHdpbmRvdztcbiAgICAgICAgbGV0IGRvYyA9IHdpbmRvdy5kb2N1bWVudDtcbiAgICAgICAgaWYgKG9wdGlvbnMgJiYgKG9wdGlvbnMud2luZG93IHx8IG9wdGlvbnMud2luKSkge1xuICAgICAgICAgICAgd2luID0gb3B0aW9ucy53aW5kb3cgfHwgb3B0aW9ucy53aW47XG4gICAgICAgICAgICBkb2MgPSB3aW4uZG9jdW1lbnQ7XG4gICAgICAgIH0gZWxzZSBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmRvYykge1xuICAgICAgICAgICAgZG9jID0gb3B0aW9ucy5kb2M7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2xlYXJpbmcgPSBvcHRpb25zID8gISFvcHRpb25zLmNsZWFyaW5nIDogZmFsc2U7XG4gICAgICAgIGNvbnN0IGNsZWFyTXM6IG51bWJlciA9IG9wdGlvbnMgJiYgb3B0aW9ucy5jbGVhck1zID8gb3B0aW9ucy5jbGVhck1zIDogbnVsbDtcblxuICAgICAgICBpZiAodGhpcy5pc1NhZmFyaSgpKSB7XG4gICAgICAgICAgICBTYWZhcmlBcHAuc2VuZE1lc3NhZ2VUb0FwcCgnY29weVRvQ2xpcGJvYXJkJywgdGV4dCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFjbGVhcmluZyAmJiB0aGlzLmNsaXBib2FyZFdyaXRlQ2FsbGJhY2sgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNsaXBib2FyZFdyaXRlQ2FsbGJhY2sodGV4dCwgY2xlYXJNcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc0ZpcmVmb3goKSAmJiAod2luIGFzIGFueSkubmF2aWdhdG9yLmNsaXBib2FyZCAmJiAod2luIGFzIGFueSkubmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQpIHtcbiAgICAgICAgICAgICh3aW4gYXMgYW55KS5uYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dCh0ZXh0KS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWNsZWFyaW5nICYmIHRoaXMuY2xpcGJvYXJkV3JpdGVDYWxsYmFjayAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2xpcGJvYXJkV3JpdGVDYWxsYmFjayh0ZXh0LCBjbGVhck1zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmICgod2luIGFzIGFueSkuY2xpcGJvYXJkRGF0YSAmJiAod2luIGFzIGFueSkuY2xpcGJvYXJkRGF0YS5zZXREYXRhKSB7XG4gICAgICAgICAgICAvLyBJRSBzcGVjaWZpYyBjb2RlIHBhdGggdG8gcHJldmVudCB0ZXh0YXJlYSBiZWluZyBzaG93biB3aGlsZSBkaWFsb2cgaXMgdmlzaWJsZS5cbiAgICAgICAgICAgICh3aW4gYXMgYW55KS5jbGlwYm9hcmREYXRhLnNldERhdGEoJ1RleHQnLCB0ZXh0KTtcbiAgICAgICAgICAgIGlmICghY2xlYXJpbmcgJiYgdGhpcy5jbGlwYm9hcmRXcml0ZUNhbGxiYWNrICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNsaXBib2FyZFdyaXRlQ2FsbGJhY2sodGV4dCwgY2xlYXJNcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZG9jLnF1ZXJ5Q29tbWFuZFN1cHBvcnRlZCAmJiBkb2MucXVlcnlDb21tYW5kU3VwcG9ydGVkKCdjb3B5JykpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzQ2hyb21lKCkgJiYgdGV4dCA9PT0gJycpIHtcbiAgICAgICAgICAgICAgICB0ZXh0ID0gJ1xcdTAwMDAnO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCB0ZXh0YXJlYSA9IGRvYy5jcmVhdGVFbGVtZW50KCd0ZXh0YXJlYScpO1xuICAgICAgICAgICAgdGV4dGFyZWEudGV4dENvbnRlbnQgPSB0ZXh0ID09IG51bGwgfHwgdGV4dCA9PT0gJycgPyAnICcgOiB0ZXh0O1xuICAgICAgICAgICAgLy8gUHJldmVudCBzY3JvbGxpbmcgdG8gYm90dG9tIG9mIHBhZ2UgaW4gTVMgRWRnZS5cbiAgICAgICAgICAgIHRleHRhcmVhLnN0eWxlLnBvc2l0aW9uID0gJ2ZpeGVkJztcbiAgICAgICAgICAgIGRvYy5ib2R5LmFwcGVuZENoaWxkKHRleHRhcmVhKTtcbiAgICAgICAgICAgIHRleHRhcmVhLnNlbGVjdCgpO1xuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIC8vIFNlY3VyaXR5IGV4Y2VwdGlvbiBtYXkgYmUgdGhyb3duIGJ5IHNvbWUgYnJvd3NlcnMuXG4gICAgICAgICAgICAgICAgaWYgKGRvYy5leGVjQ29tbWFuZCgnY29weScpICYmICFjbGVhcmluZyAmJiB0aGlzLmNsaXBib2FyZFdyaXRlQ2FsbGJhY2sgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNsaXBib2FyZFdyaXRlQ2FsbGJhY2sodGV4dCwgY2xlYXJNcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZVxuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignQ29weSB0byBjbGlwYm9hcmQgZmFpbGVkLicsIGUpO1xuICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICBkb2MuYm9keS5yZW1vdmVDaGlsZCh0ZXh0YXJlYSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyByZWFkRnJvbUNsaXBib2FyZChvcHRpb25zPzogYW55KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgbGV0IHdpbiA9IHdpbmRvdztcbiAgICAgICAgbGV0IGRvYyA9IHdpbmRvdy5kb2N1bWVudDtcbiAgICAgICAgaWYgKG9wdGlvbnMgJiYgKG9wdGlvbnMud2luZG93IHx8IG9wdGlvbnMud2luKSkge1xuICAgICAgICAgICAgd2luID0gb3B0aW9ucy53aW5kb3cgfHwgb3B0aW9ucy53aW47XG4gICAgICAgICAgICBkb2MgPSB3aW4uZG9jdW1lbnQ7XG4gICAgICAgIH0gZWxzZSBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmRvYykge1xuICAgICAgICAgICAgZG9jID0gb3B0aW9ucy5kb2M7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5pc1NhZmFyaSgpKSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgU2FmYXJpQXBwLnNlbmRNZXNzYWdlVG9BcHAoJ3JlYWRGcm9tQ2xpcGJvYXJkJyk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc0ZpcmVmb3goKSAmJiAod2luIGFzIGFueSkubmF2aWdhdG9yLmNsaXBib2FyZCAmJiAod2luIGFzIGFueSkubmF2aWdhdG9yLmNsaXBib2FyZC5yZWFkVGV4dCkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0ICh3aW4gYXMgYW55KS5uYXZpZ2F0b3IuY2xpcGJvYXJkLnJlYWRUZXh0KCk7XG4gICAgICAgIH0gZWxzZSBpZiAoZG9jLnF1ZXJ5Q29tbWFuZFN1cHBvcnRlZCAmJiBkb2MucXVlcnlDb21tYW5kU3VwcG9ydGVkKCdwYXN0ZScpKSB7XG4gICAgICAgICAgICBjb25zdCB0ZXh0YXJlYSA9IGRvYy5jcmVhdGVFbGVtZW50KCd0ZXh0YXJlYScpO1xuICAgICAgICAgICAgLy8gUHJldmVudCBzY3JvbGxpbmcgdG8gYm90dG9tIG9mIHBhZ2UgaW4gTVMgRWRnZS5cbiAgICAgICAgICAgIHRleHRhcmVhLnN0eWxlLnBvc2l0aW9uID0gJ2ZpeGVkJztcbiAgICAgICAgICAgIGRvYy5ib2R5LmFwcGVuZENoaWxkKHRleHRhcmVhKTtcbiAgICAgICAgICAgIHRleHRhcmVhLmZvY3VzKCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIC8vIFNlY3VyaXR5IGV4Y2VwdGlvbiBtYXkgYmUgdGhyb3duIGJ5IHNvbWUgYnJvd3NlcnMuXG4gICAgICAgICAgICAgICAgaWYgKGRvYy5leGVjQ29tbWFuZCgncGFzdGUnKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGV4dGFyZWEudmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZVxuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignUmVhZCBmcm9tIGNsaXBib2FyZCBmYWlsZWQuJywgZSk7XG4gICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIGRvYy5ib2R5LnJlbW92ZUNoaWxkKHRleHRhcmVhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXNvbHZlRGlhbG9nUHJvbWlzZShkaWFsb2dJZDogbnVtYmVyLCBjb25maXJtZWQ6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKHRoaXMuc2hvd0RpYWxvZ1Jlc29sdmVzLmhhcyhkaWFsb2dJZCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc29sdmVPYmogPSB0aGlzLnNob3dEaWFsb2dSZXNvbHZlcy5nZXQoZGlhbG9nSWQpO1xuICAgICAgICAgICAgcmVzb2x2ZU9iai5yZXNvbHZlKGNvbmZpcm1lZCk7XG4gICAgICAgICAgICB0aGlzLnNob3dEaWFsb2dSZXNvbHZlcy5kZWxldGUoZGlhbG9nSWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2xlYW4gdXAgb2xkIHByb21pc2VzXG4gICAgICAgIHRoaXMuc2hvd0RpYWxvZ1Jlc29sdmVzLmZvckVhY2goKHZhbCwga2V5KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhZ2UgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKSAtIHZhbC5kYXRlLmdldFRpbWUoKTtcbiAgICAgICAgICAgIGlmIChhZ2UgPiBEaWFsb2dQcm9taXNlRXhwaXJhdGlvbikge1xuICAgICAgICAgICAgICAgIHRoaXMuc2hvd0RpYWxvZ1Jlc29sdmVzLmRlbGV0ZShrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBhc3luYyByZXNvbHZlUGFzc3dvcmREaWFsb2dQcm9taXNlKGRpYWxvZ0lkOiBudW1iZXIsIGNhbmNlbGVkOiBib29sZWFuLCBwYXNzd29yZDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGxldCByZXN1bHQgPSBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMucGFzc3dvcmREaWFsb2dSZXNvbHZlcy5oYXMoZGlhbG9nSWQpKSB7XG4gICAgICAgICAgICBjb25zdCByZXNvbHZlT2JqID0gdGhpcy5wYXNzd29yZERpYWxvZ1Jlc29sdmVzLmdldChkaWFsb2dJZCk7XG4gICAgICAgICAgICBpZiAoYXdhaXQgcmVzb2x2ZU9iai50cnlSZXNvbHZlKGNhbmNlbGVkLCBwYXNzd29yZCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBhc3N3b3JkRGlhbG9nUmVzb2x2ZXMuZGVsZXRlKGRpYWxvZ0lkKTtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2xlYW4gdXAgb2xkIHByb21pc2VzXG4gICAgICAgIHRoaXMucGFzc3dvcmREaWFsb2dSZXNvbHZlcy5mb3JFYWNoKCh2YWwsIGtleSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgYWdlID0gbmV3IERhdGUoKS5nZXRUaW1lKCkgLSB2YWwuZGF0ZS5nZXRUaW1lKCk7XG4gICAgICAgICAgICBpZiAoYWdlID4gRGlhbG9nUHJvbWlzZUV4cGlyYXRpb24pIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBhc3N3b3JkRGlhbG9nUmVzb2x2ZXMuZGVsZXRlKGtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgYXN5bmMgc3VwcG9ydHNCaW9tZXRyaWMoKSB7XG4gICAgICAgIGNvbnN0IHBsYXRmb3JtSW5mbyA9IGF3YWl0IEJyb3dzZXJBcGkuZ2V0UGxhdGZvcm1JbmZvKCk7XG4gICAgICAgIGlmIChwbGF0Zm9ybUluZm8ub3MgPT09ICdhbmRyb2lkJykge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaXNGaXJlZm94KCkpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJzZUludCgoYXdhaXQgYnJvd3Nlci5ydW50aW1lLmdldEJyb3dzZXJJbmZvKCkpLnZlcnNpb24uc3BsaXQoJy4nKVswXSwgMTApID49IDg3O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgYXV0aGVudGljYXRlQmlvbWV0cmljKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5iaW9tZXRyaWNDYWxsYmFjaygpO1xuICAgIH1cblxuICAgIHNpZGViYXJWaWV3TmFtZSgpOiBzdHJpbmcge1xuICAgICAgICBpZiAoKHdpbmRvdyBhcyBhbnkpLmNocm9tZS5zaWRlYmFyQWN0aW9uICYmIHRoaXMuaXNGaXJlZm94KCkpIHtcbiAgICAgICAgICAgIHJldHVybiAnc2lkZWJhcic7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc09wZXJhKCkgJiYgKHR5cGVvZiBvcHIgIT09ICd1bmRlZmluZWQnKSAmJiBvcHIuc2lkZWJhckFjdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuICdzaWRlYmFyX3BhbmVsJztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHN1cHBvcnRzU2VjdXJlU3RvcmFnZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGdldERlZmF1bHRTeXN0ZW1UaGVtZSgpOiBQcm9taXNlPFRoZW1lVHlwZS5MaWdodCB8IFRoZW1lVHlwZS5EYXJrPiB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5wcmVmZXJzQ29sb3JTY2hlbWVEYXJrLm1hdGNoZXMgPyBUaGVtZVR5cGUuRGFyayA6IFRoZW1lVHlwZS5MaWdodCk7XG4gICAgfVxuXG4gICAgb25EZWZhdWx0U3lzdGVtVGhlbWVDaGFuZ2UoY2FsbGJhY2s6ICgodGhlbWU6IFRoZW1lVHlwZS5MaWdodCB8IFRoZW1lVHlwZS5EYXJrKSA9PiB1bmtub3duKSkge1xuICAgICAgICB0aGlzLnByZWZlcnNDb2xvclNjaGVtZURhcmsuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKHsgbWF0Y2hlcyB9KSA9PiB7XG4gICAgICAgICAgICBjYWxsYmFjayhtYXRjaGVzID8gVGhlbWVUeXBlLkRhcmsgOiBUaGVtZVR5cGUuTGlnaHQpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBhc3luYyBnZXRFZmZlY3RpdmVUaGVtZSgpIHtcbiAgICAgICAgY29uc3QgdGhlbWUgPSBhd2FpdCB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldDxUaGVtZVR5cGU+KENvbnN0YW50c1NlcnZpY2UudGhlbWVLZXkpO1xuICAgICAgICBpZiAodGhlbWUgPT0gbnVsbCB8fCB0aGVtZSA9PT0gVGhlbWVUeXBlLlN5c3RlbSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RGVmYXVsdFN5c3RlbVRoZW1lKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhlbWU7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgeyBTdG9yYWdlU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvc3RvcmFnZS5zZXJ2aWNlJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQnJvd3NlclN0b3JhZ2VTZXJ2aWNlIGltcGxlbWVudHMgU3RvcmFnZVNlcnZpY2Uge1xuICAgIHByaXZhdGUgY2hyb21lU3RvcmFnZUFwaTogYW55O1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuY2hyb21lU3RvcmFnZUFwaSA9IGNocm9tZS5zdG9yYWdlLmxvY2FsO1xuICAgIH1cblxuICAgIGFzeW5jIGdldDxUPihrZXk6IHN0cmluZyk6IFByb21pc2U8VD4ge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNocm9tZVN0b3JhZ2VBcGkuZ2V0KGtleSwgKG9iajogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKG9iaiAhPSBudWxsICYmIG9ialtrZXldICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShvYmpba2V5XSBhcyBUKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXNvbHZlKG51bGwpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGFzeW5jIGhhcyhrZXk6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXQoa2V5KSAhPSBudWxsO1xuICAgIH1cblxuICAgIGFzeW5jIHNhdmUoa2V5OiBzdHJpbmcsIG9iajogYW55KTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgaWYgKG9iaiA9PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBGaXggc2FmYXJpIG5vdCBsaWtpbmcgbnVsbCBpbiBzZXRcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPihyZXNvbHZlID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNocm9tZVN0b3JhZ2VBcGkucmVtb3ZlKGtleSwgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBTZXQpIHtcbiAgICAgICAgICAgIG9iaiA9IEFycmF5LmZyb20ob2JqKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGtleWVkT2JqID0geyBba2V5XTogb2JqIH07XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPihyZXNvbHZlID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2hyb21lU3RvcmFnZUFwaS5zZXQoa2V5ZWRPYmosICgpID0+IHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgYXN5bmMgcmVtb3ZlKGtleTogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KHJlc29sdmUgPT4ge1xuICAgICAgICAgICAgdGhpcy5jaHJvbWVTdG9yYWdlQXBpLnJlbW92ZShrZXksICgpID0+IHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgSTE4blNlcnZpY2UgYXMgQmFzZUkxOG5TZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL3NlcnZpY2VzL2kxOG4uc2VydmljZSc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEkxOG5TZXJ2aWNlIGV4dGVuZHMgQmFzZUkxOG5TZXJ2aWNlIHtcbiAgICBjb25zdHJ1Y3RvcihzeXN0ZW1MYW5ndWFnZTogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKHN5c3RlbUxhbmd1YWdlLCBudWxsLCBhc3luYyAoZm9ybWF0dGVkTG9jYWxlOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIC8vIERlcHJlY2F0ZWRcbiAgICAgICAgICAgIGNvbnN0IGZpbGUgPSBhd2FpdCBmZXRjaCh0aGlzLmxvY2FsZXNEaXJlY3RvcnkgKyBmb3JtYXR0ZWRMb2NhbGUgKyAnL21lc3NhZ2VzLmpzb24nKTtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBmaWxlLmpzb24oKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gUGxlYXNlIGxlYXZlICdlbicgd2hlcmUgaXQgaXMsIGFzIGl0J3Mgb3VyIGZhbGxiYWNrIGxhbmd1YWdlIGluIGNhc2Ugbm8gdHJhbnNsYXRpb24gY2FuIGJlIGZvdW5kXG4gICAgICAgIHRoaXMuc3VwcG9ydGVkVHJhbnNsYXRpb25Mb2NhbGVzID0gW1xuICAgICAgICAgICAgJ2VuJywgJ2F6JywgJ2JlJywgJ2JnJywgJ2JuJywgJ2NhJywgJ2NzJywgJ2RhJywgJ2RlJywgJ2VsJywgJ2VuLUdCJywgJ2VuLUlOJywgJ2VzJywgJ2V0JywgJ2ZhJywgJ2ZpJywgJ2ZyJywgJ2hlJywgJ2hyJywgJ2h1JyxcbiAgICAgICAgICAgICdpZCcsICdpdCcsICdqYScsICdrbicsICdrbycsICdsdicsICdtbCcsICduYicsICdubCcsICdwbCcsICdwdC1CUicsICdwdC1QVCcsICdybycsICdydScsICdzaycsICdzcicsICdzdicsICd0aCcsICd0cicsICd1aycsXG4gICAgICAgICAgICAndmknLCAnemgtQ04nLCAnemgtVFcnLFxuICAgICAgICBdO1xuICAgIH1cblxuICAgIHQoaWQ6IHN0cmluZywgcDE/OiBzdHJpbmcsIHAyPzogc3RyaW5nLCBwMz86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZShpZCwgcDEsIHAyLCBwMyk7XG4gICAgfVxuXG4gICAgdHJhbnNsYXRlKGlkOiBzdHJpbmcsIHAxPzogc3RyaW5nLCBwMj86IHN0cmluZywgcDM/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBpZiAodGhpcy5sb2NhbGVzRGlyZWN0b3J5ID09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IHBsYWNlaG9sZGVyczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgICAgIGlmIChwMSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXJzLnB1c2gocDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHAyICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcnMucHVzaChwMik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocDMgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVycy5wdXNoKHAzKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHBsYWNlaG9sZGVycy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2hyb21lLmkxOG4uZ2V0TWVzc2FnZShpZCwgcGxhY2Vob2xkZXJzKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNocm9tZS5pMThuLmdldE1lc3NhZ2UoaWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHN1cGVyLnRyYW5zbGF0ZShpZCwgcDEsIHAyLCBwMyk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgVmF1bHRUaW1lb3V0U2VydmljZSBhcyBCYXNlVmF1bHRUaW1lb3V0U2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9zZXJ2aWNlcy92YXVsdFRpbWVvdXQuc2VydmljZSc7XG5pbXBvcnQgeyBTYWZhcmlBcHAgfSBmcm9tICcuLi9icm93c2VyL3NhZmFyaUFwcCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZhdWx0VGltZW91dFNlcnZpY2UgZXh0ZW5kcyBCYXNlVmF1bHRUaW1lb3V0U2VydmljZSB7XG5cbiAgICBzdGFydENoZWNrKCkge1xuICAgICAgICB0aGlzLmNoZWNrVmF1bHRUaW1lb3V0KCk7XG4gICAgICAgIGlmICh0aGlzLnBsYXRmb3JtVXRpbHNTZXJ2aWNlLmlzU2FmYXJpKCkpIHtcbiAgICAgICAgICAgIHRoaXMuY2hlY2tTYWZhcmkoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNldEludGVydmFsKCgpID0+IHRoaXMuY2hlY2tWYXVsdFRpbWVvdXQoKSwgMTAgKiAxMDAwKTsgLy8gY2hlY2sgZXZlcnkgMTAgc2Vjb25kc1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gVGhpcyBpcyBhIHdvcmstYXJvdW5kIHRvIHNhZmFyaSBhZGRpbmcgYW4gYXJiaXRhcnkgZGVsYXkgdG8gc2V0VGltZW91dCBhbmRcbiAgICAvLyAgc2V0SW50ZXJ2YWxzLiBJdCB3b3JrcyBieSBjYWxsaW5nIHRoZSBuYXRpdmUgZXh0ZW5zaW9uIHdoaWNoIHNsZWVwcyBmb3IgMTBzLFxuICAgIC8vICBlZmZpY2llbnRseSByZXBsaWNhdGluZyBzZXRJbnRlcnZhbC5cbiAgICBhc3luYyBjaGVja1NhZmFyaSgpIHtcbiAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgU2FmYXJpQXBwLnNlbmRNZXNzYWdlVG9BcHAoJ3NsZWVwJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGVja1ZhdWx0VGltZW91dCgpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZVxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdFeGNlcHRpb24gU2FmYXJpIFZhdWx0VGltZW91dCcsIGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuIiwiLyogKGlnbm9yZWQpICovIiwiLyogKGlnbm9yZWQpICovIiwiLyogKGlnbm9yZWQpICovIl0sInNvdXJjZVJvb3QiOiIifQ==
\ No newline at end of file
diff --git a/src/iOS.Safari/Resources/content/autofill.css b/src/iOS.Safari/Resources/content/autofill.css
new file mode 100644
index 000000000..453556777
--- /dev/null
+++ b/src/iOS.Safari/Resources/content/autofill.css
@@ -0,0 +1,36 @@
+@-webkit-keyframes bitwardenfill {
+ 0% {
+ -webkit-transform: scale(1.0, 1.0);
+ }
+
+ 50% {
+ -webkit-transform: scale(1.2, 1.2);
+ }
+
+ 100% {
+ -webkit-transform: scale(1.0, 1.0);
+ }
+}
+
+@-moz-keyframes bitwardenfill {
+ 0% {
+ transform: scale(1.0, 1.0);
+ }
+
+ 50% {
+ transform: scale(1.2, 1.2);
+ }
+
+ 100% {
+ transform: scale(1.0, 1.0);
+ }
+}
+
+span[data-bwautofill].com-bitwarden-browser-animated-fill {
+ display: inline-block;
+}
+
+.com-bitwarden-browser-animated-fill {
+ animation: bitwardenfill 200ms ease-in-out 0ms 1;
+ -webkit-animation: bitwardenfill 200ms ease-in-out 0ms 1;
+}
diff --git a/src/iOS.Safari/Resources/content/autofill.js b/src/iOS.Safari/Resources/content/autofill.js
new file mode 100644
index 000000000..1f0357990
--- /dev/null
+++ b/src/iOS.Safari/Resources/content/autofill.js
@@ -0,0 +1,1142 @@
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./src/content/autofill.js");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./src/content/autofill.js":
+/*!*********************************!*\
+ !*** ./src/content/autofill.js ***!
+ \*********************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+!(function () {
+ /*
+ 1Password Extension
+
+ Lovingly handcrafted by Dave Teare, Michael Fey, Rad Azzouz, and Roustem Karimov.
+ Copyright (c) 2014 AgileBits. All rights reserved.
+
+ ================================================================================
+
+ Copyright (c) 2014 AgileBits Inc.
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ SOFTWARE.
+ */
+
+ /*
+ MODIFICATIONS FROM ORIGINAL
+
+ 1. Populate isFirefox
+ 2. Remove isChrome and isSafari since they are not used.
+ 3. Unminify and format to meet Mozilla review requirements.
+ 4. Remove unnecessary input types from getFormElements query selector and limit number of elements returned.
+ 5. Remove fakeTested prop.
+ 6. Rename com.agilebits.* stuff to com.bitwarden.*
+ 7. Remove "some useful globals" on window
+ 8. Add ability to autofill span[data-bwautofill] elements
+ */
+
+ function collect(document, undefined) {
+ // START MODIFICATION
+ var isFirefox = navigator.userAgent.indexOf('Firefox') !== -1 || navigator.userAgent.indexOf('Gecko/') !== -1;
+ // END MODIFICATION
+
+ document.elementsByOPID = {};
+ document.addEventListener('input', function (inputevent) {
+ inputevent.a !== false &&
+ inputevent.target.tagName.toLowerCase() === 'input' &&
+ (inputevent.target.dataset['com.bitwarden.browser.userEdited'] = 'yes');
+ }, true);
+
+ function getPageDetails(theDoc, oneShotId) {
+ // start helpers
+
+ // get the value of a dom element's attribute
+ function getElementAttrValue(el, attrName) {
+ var attrVal = el[attrName];
+ if ('string' == typeof attrVal) {
+ return attrVal;
+ }
+ attrVal = el.getAttribute(attrName);
+ return 'string' == typeof attrVal ? attrVal : null;
+ }
+
+ // has the element been fake tested?
+ function checkIfFakeTested(field, el) {
+ if (-1 === ['text', 'password'].indexOf(el.type.toLowerCase()) ||
+ !(passwordRegEx.test(field.value) ||
+ passwordRegEx.test(field.htmlID) || passwordRegEx.test(field.htmlName) ||
+ passwordRegEx.test(field.placeholder) || passwordRegEx.test(field['label-tag']) ||
+ passwordRegEx.test(field['label-data']) || passwordRegEx.test(field['label-aria']))) {
+ return false;
+ }
+
+ if (!field.visible) {
+ return true;
+ }
+
+ if ('password' == el.type.toLowerCase()) {
+ return false;
+ }
+
+ var elType = el.type;
+ focusElement(el, true);
+ return elType !== el.type;
+ }
+
+ // get the value of a dom element
+ function getElementValue(el) {
+ switch (toLowerString(el.type)) {
+ case 'checkbox':
+ return el.checked ? '✓' : '';
+
+ case 'hidden':
+ el = el.value;
+ if (!el || 'number' != typeof el.length) {
+ return '';
+ }
+ 254 < el.length && (el = el.substr(0, 254) + '...SNIPPED');
+ return el;
+
+ default:
+ // START MODIFICATION
+ if (!el.type && el.tagName.toLowerCase() === 'span') {
+ return el.innerText;
+ }
+ // END MODIFICATION
+ return el.value;
+ }
+ }
+
+ // get all the options for a "select" element
+ function getSelectElementOptions(el) {
+ if (!el.options) {
+ return null;
+ }
+
+ var options = Array.prototype.slice.call(el.options).map(function (option) {
+ var optionText = option.text ?
+ toLowerString(option.text).replace(/\\s/gm, '').replace(/[~`!@$%^&*()\\-_+=:;'\"\\[\\]|\\\\,<.>\\?]/gm, '') :
+ null;
+
+ return [optionText ? optionText : null, option.value];
+ })
+
+ return {
+ options: options
+ };
+ }
+
+ // get the top label
+ function getLabelTop(el) {
+ var parent;
+ for (el = el.parentElement || el.parentNode; el && 'td' != toLowerString(el.tagName);) {
+ el = el.parentElement || el.parentNode;
+ }
+
+ if (!el || void 0 === el) {
+ return null;
+ }
+
+ parent = el.parentElement || el.parentNode;
+ if ('tr' != parent.tagName.toLowerCase()) {
+ return null;
+ }
+
+ parent = parent.previousElementSibling;
+ if (!parent || 'tr' != (parent.tagName + '').toLowerCase() ||
+ parent.cells && el.cellIndex >= parent.cells.length) {
+ return null;
+ }
+
+ el = parent.cells[el.cellIndex];
+ var elText = el.textContent || el.innerText;
+ return elText = cleanText(elText);
+ }
+
+ // get all the tags for a given label
+ function getLabelTag(el) {
+ var docLabel,
+ theLabels = [];
+
+ if (el.labels && el.labels.length && 0 < el.labels.length) {
+ theLabels = Array.prototype.slice.call(el.labels);
+ } else {
+ if (el.id) {
+ theLabels = theLabels.concat(Array.prototype.slice.call(
+ queryDoc(theDoc, 'label[for=' + JSON.stringify(el.id) + ']')));
+ }
+
+ if (el.name) {
+ docLabel = queryDoc(theDoc, 'label[for=' + JSON.stringify(el.name) + ']');
+
+ for (var labelIndex = 0; labelIndex < docLabel.length; labelIndex++) {
+ if (-1 === theLabels.indexOf(docLabel[labelIndex])) {
+ theLabels.push(docLabel[labelIndex])
+ }
+ }
+ }
+
+ for (var theEl = el; theEl && theEl != theDoc; theEl = theEl.parentNode) {
+ if ('label' === toLowerString(theEl.tagName) && -1 === theLabels.indexOf(theEl)) {
+ theLabels.push(theEl);
+ }
+ }
+ }
+
+ if (0 === theLabels.length) {
+ theEl = el.parentNode;
+ if ('dd' === theEl.tagName.toLowerCase() && null !== theEl.previousElementSibling
+ && 'dt' === theEl.previousElementSibling.tagName.toLowerCase()) {
+ theLabels.push(theEl.previousElementSibling);
+ }
+ }
+
+ if (0 > theLabels.length) {
+ return null;
+ }
+
+ return theLabels.map(function (l) {
+ return (l.textContent || l.innerText)
+ .replace(/^\\s+/, '').replace(/\\s+$/, '').replace('\\n', '').replace(/\\s{2,}/, ' ');
+ }).join('');
+ }
+
+ // add property and value to the object if there is a value
+ function addProp(obj, prop, val, d) {
+ if (0 !== d && d === val || null === val || void 0 === val) {
+ return;
+ }
+
+ obj[prop] = val;
+ }
+
+ // lowercase helper
+ function toLowerString(s) {
+ return 'string' === typeof s ? s.toLowerCase() : ('' + s).toLowerCase();
+ }
+
+ // query the document helper
+ function queryDoc(doc, query) {
+ var els = [];
+ try {
+ els = doc.querySelectorAll(query);
+ } catch (e) { }
+ return els;
+ }
+
+ // end helpers
+
+ var theView = theDoc.defaultView ? theDoc.defaultView : window,
+ passwordRegEx = RegExp('((\\\\b|_|-)pin(\\\\b|_|-)|password|passwort|kennwort|(\\\\b|_|-)passe(\\\\b|_|-)|contraseña|senha|密码|adgangskode|hasło|wachtwoord)', 'i');
+
+ // get all the docs
+ var theForms = Array.prototype.slice.call(queryDoc(theDoc, 'form')).map(function (formEl, elIndex) {
+ var op = {},
+ formOpId = '__form__' + elIndex;
+
+ formEl.opid = formOpId;
+ op.opid = formOpId;
+ addProp(op, 'htmlName', getElementAttrValue(formEl, 'name'));
+ addProp(op, 'htmlID', getElementAttrValue(formEl, 'id'));
+ formOpId = getElementAttrValue(formEl, 'action');
+ formOpId = new URL(formOpId, window.location.href);
+ addProp(op, 'htmlAction', formOpId ? formOpId.href : null);
+ addProp(op, 'htmlMethod', getElementAttrValue(formEl, 'method'));
+
+ return op;
+ });
+
+ // get all the form fields
+ var theFields = Array.prototype.slice.call(getFormElements(theDoc, 50)).map(function (el, elIndex) {
+ var field = {},
+ opId = '__' + elIndex,
+ elMaxLen = -1 == el.maxLength ? 999 : el.maxLength;
+
+ if (!elMaxLen || 'number' === typeof elMaxLen && isNaN(elMaxLen)) {
+ elMaxLen = 999;
+ }
+
+ theDoc.elementsByOPID[opId] = el;
+ el.opid = opId;
+ field.opid = opId;
+ field.elementNumber = elIndex;
+ addProp(field, 'maxLength', Math.min(elMaxLen, 999), 999);
+ field.visible = isElementVisible(el);
+ field.viewable = isElementViewable(el);
+ addProp(field, 'htmlID', getElementAttrValue(el, 'id'));
+ addProp(field, 'htmlName', getElementAttrValue(el, 'name'));
+ addProp(field, 'htmlClass', getElementAttrValue(el, 'class'));
+ addProp(field, 'tabindex', getElementAttrValue(el, 'tabindex'));
+ addProp(field, 'title', getElementAttrValue(el, 'title'));
+
+ // START MODIFICATION
+ addProp(field, 'userEdited', !!el.dataset['com.browser.browser.userEdited']);
+
+ var elTagName = el.tagName.toLowerCase();
+ addProp(field, 'tagName', elTagName);
+
+ if (elTagName === 'span') {
+ return field;
+ }
+ // END MODIFICATION
+
+ if ('hidden' != toLowerString(el.type)) {
+ addProp(field, 'label-tag', getLabelTag(el));
+ addProp(field, 'label-data', getElementAttrValue(el, 'data-label'));
+ addProp(field, 'label-aria', getElementAttrValue(el, 'aria-label'));
+ addProp(field, 'label-top', getLabelTop(el));
+ var labelArr = [];
+ for (var sib = el; sib && sib.nextSibling;) {
+ sib = sib.nextSibling;
+ if (isKnownTag(sib)) {
+ break;
+ }
+ checkNodeType(labelArr, sib);
+ }
+ addProp(field, 'label-right', labelArr.join(''));
+ labelArr = [];
+ shiftForLeftLabel(el, labelArr);
+ labelArr = labelArr.reverse().join('');
+ addProp(field, 'label-left', labelArr);
+ addProp(field, 'placeholder', getElementAttrValue(el, 'placeholder'));
+ }
+
+ addProp(field, 'rel', getElementAttrValue(el, 'rel'));
+ addProp(field, 'type', toLowerString(getElementAttrValue(el, 'type')));
+ addProp(field, 'value', getElementValue(el));
+ addProp(field, 'checked', el.checked, false);
+ addProp(field, 'autoCompleteType', el.getAttribute('x-autocompletetype') || el.getAttribute('autocompletetype') || el.getAttribute('autocomplete'), 'off');
+ addProp(field, 'disabled', el.disabled);
+ addProp(field, 'readonly', el.b || el.readOnly);
+ addProp(field, 'selectInfo', getSelectElementOptions(el));
+ addProp(field, 'aria-hidden', 'true' == el.getAttribute('aria-hidden'), false);
+ addProp(field, 'aria-disabled', 'true' == el.getAttribute('aria-disabled'), false);
+ addProp(field, 'aria-haspopup', 'true' == el.getAttribute('aria-haspopup'), false);
+ addProp(field, 'data-unmasked', el.dataset.unmasked);
+ addProp(field, 'data-stripe', getElementAttrValue(el, 'data-stripe'));
+ addProp(field, 'onepasswordFieldType', el.dataset.onepasswordFieldType || el.type);
+ addProp(field, 'onepasswordDesignation', el.dataset.onepasswordDesignation);
+ addProp(field, 'onepasswordSignInUrl', el.dataset.onepasswordSignInUrl);
+ addProp(field, 'onepasswordSectionTitle', el.dataset.onepasswordSectionTitle);
+ addProp(field, 'onepasswordSectionFieldKind', el.dataset.onepasswordSectionFieldKind);
+ addProp(field, 'onepasswordSectionFieldTitle', el.dataset.onepasswordSectionFieldTitle);
+ addProp(field, 'onepasswordSectionFieldValue', el.dataset.onepasswordSectionFieldValue);
+
+ if (el.form) {
+ field.form = getElementAttrValue(el.form, 'opid');
+ }
+
+ // START MODIFICATION
+ //addProp(field, 'fakeTested', checkIfFakeTested(field, el), false);
+ // END MODIFICATION
+
+ return field;
+ });
+
+ // test form fields
+ theFields.filter(function (f) {
+ return f.fakeTested;
+ }).forEach(function (f) {
+ var el = theDoc.elementsByOPID[f.opid];
+ el.getBoundingClientRect();
+
+ var originalValue = el.value;
+ // click it
+ !el || el && 'function' !== typeof el.click || el.click();
+ focusElement(el, false);
+
+ el.dispatchEvent(doEventOnElement(el, 'keydown'));
+ el.dispatchEvent(doEventOnElement(el, 'keypress'));
+ el.dispatchEvent(doEventOnElement(el, 'keyup'));
+
+ el.value !== originalValue && (el.value = originalValue);
+
+ el.click && el.click();
+ f.postFakeTestVisible = isElementVisible(el);
+ f.postFakeTestViewable = isElementViewable(el);
+ f.postFakeTestType = el.type;
+
+ var elValue = el.value;
+
+ var event1 = el.ownerDocument.createEvent('HTMLEvents'),
+ event2 = el.ownerDocument.createEvent('HTMLEvents');
+ el.dispatchEvent(doEventOnElement(el, 'keydown'));
+ el.dispatchEvent(doEventOnElement(el, 'keypress'));
+ el.dispatchEvent(doEventOnElement(el, 'keyup'));
+ event2.initEvent('input', true, true);
+ el.dispatchEvent(event2);
+ event1.initEvent('change', true, true);
+ el.dispatchEvent(event1);
+
+ el.blur();
+ el.value !== elValue && (el.value = elValue);
+ });
+
+ // build out the page details object. this is the final result
+ var pageDetails = {
+ documentUUID: oneShotId,
+ title: theDoc.title,
+ url: theView.location.href,
+ documentUrl: theDoc.location.href,
+ tabUrl: theView.location.href,
+ forms: function (forms) {
+ var formObj = {};
+ forms.forEach(function (f) {
+ formObj[f.opid] = f;
+ });
+ return formObj;
+ }(theForms),
+ fields: theFields,
+ collectedTimestamp: new Date().getTime()
+ };
+
+ // get proper page title. maybe they are using the special meta tag?
+ var theTitle = document.querySelector('[data-onepassword-title]')
+ if (theTitle && theTitle.dataset[DISPLAY_TITLE_ATTRIBUE]) {
+ pageDetails.displayTitle = theTitle.dataset.onepasswordTitle;
+ }
+
+ return pageDetails;
+ }
+
+ document.elementForOPID = getElementForOPID;
+
+ function doEventOnElement(kedol, fonor) {
+ var quebo;
+ isFirefox ? (quebo = document.createEvent('KeyboardEvent'), quebo.initKeyEvent(fonor, true, false, null, false, false, false, false, 0, 0)) : (quebo = kedol.ownerDocument.createEvent('Events'),
+ quebo.initEvent(fonor, true, false), quebo.charCode = 0, quebo.keyCode = 0, quebo.which = 0,
+ quebo.srcElement = kedol, quebo.target = kedol);
+ return quebo;
+ }
+
+ // clean up the text
+ function cleanText(s) {
+ var sVal = null;
+ s && (sVal = s.replace(/^\\s+|\\s+$|\\r?\\n.*$/gm, ''), sVal = 0 < sVal.length ? sVal : null);
+ return sVal;
+ }
+
+ // check the node type and adjust the array accordingly
+ function checkNodeType(arr, el) {
+ var theText = '';
+ 3 === el.nodeType ? theText = el.nodeValue : 1 === el.nodeType && (theText = el.textContent || el.innerText);
+ (theText = cleanText(theText)) && arr.push(theText);
+ }
+
+ function isKnownTag(el) {
+ if (el && void 0 !== el) {
+ var tags = 'select option input form textarea button table iframe body head script'.split(' ');
+
+ if (el) {
+ var elTag = el ? (el.tagName || '').toLowerCase() : '';
+ return tags.constructor == Array ? 0 <= tags.indexOf(elTag) : elTag === tags;
+ }
+ else {
+ return false;
+ }
+ }
+ else {
+ return true;
+ }
+ }
+
+ function shiftForLeftLabel(el, arr, steps) {
+ var sib;
+ for (steps || (steps = 0); el && el.previousSibling;) {
+ el = el.previousSibling;
+ if (isKnownTag(el)) {
+ return;
+ }
+
+ checkNodeType(arr, el);
+ }
+ if (el && 0 === arr.length) {
+ for (sib = null; !sib;) {
+ el = el.parentElement || el.parentNode;
+ if (!el) {
+ return;
+ }
+ for (sib = el.previousSibling; sib && !isKnownTag(sib) && sib.lastChild;) {
+ sib = sib.lastChild;
+ }
+ }
+
+ // base case and recurse
+ isKnownTag(sib) || (checkNodeType(arr, sib), 0 === arr.length && shiftForLeftLabel(sib, arr, steps + 1));
+ }
+ }
+
+ // is a dom element visible on screen?
+ function isElementVisible(el) {
+ var theEl = el;
+ el = (el = el.ownerDocument) ? el.defaultView : {};
+
+ // walk the dom tree
+ for (var elStyle; theEl && theEl !== document;) {
+ elStyle = el.getComputedStyle ? el.getComputedStyle(theEl, null) : theEl.style;
+ if (!elStyle) {
+ return true;
+ }
+
+ if ('none' === elStyle.display || 'hidden' == elStyle.visibility) {
+ return false;
+ }
+
+ // walk up
+ theEl = theEl.parentNode;
+ }
+
+ return theEl === document;
+ }
+
+ // is a dom element "viewable" on screen?
+ function isElementViewable(el) {
+ var theDoc = el.ownerDocument.documentElement,
+ rect = el.getBoundingClientRect(),
+ docScrollWidth = theDoc.scrollWidth,
+ docScrollHeight = theDoc.scrollHeight,
+ leftOffset = rect.left - theDoc.clientLeft,
+ topOffset = rect.top - theDoc.clientTop,
+ theRect;
+
+ if (!isElementVisible(el) || !el.offsetParent || 10 > el.clientWidth || 10 > el.clientHeight) {
+ return false;
+ }
+
+ var rects = el.getClientRects();
+ if (0 === rects.length) {
+ return false;
+ }
+
+ for (var i = 0; i < rects.length; i++) {
+ if (theRect = rects[i], theRect.left > docScrollWidth || 0 > theRect.right) {
+ return false;
+ }
+ }
+
+ if (0 > leftOffset || leftOffset > docScrollWidth || 0 > topOffset || topOffset > docScrollHeight) {
+ return false;
+ }
+
+ // walk the tree
+ for (var pointEl = el.ownerDocument.elementFromPoint(leftOffset + (rect.right > window.innerWidth ? (window.innerWidth - leftOffset) / 2 : rect.width / 2), topOffset + (rect.bottom > window.innerHeight ? (window.innerHeight - topOffset) / 2 : rect.height / 2)); pointEl && pointEl !== el && pointEl !== document;) {
+ if (pointEl.tagName && 'string' === typeof pointEl.tagName && 'label' === pointEl.tagName.toLowerCase()
+ && el.labels && 0 < el.labels.length) {
+ return 0 <= Array.prototype.slice.call(el.labels).indexOf(pointEl);
+ }
+
+ // walk up
+ pointEl = pointEl.parentNode;
+ }
+
+ return pointEl === el;
+ }
+
+ function getElementForOPID(opId) {
+ var theEl;
+ if (void 0 === opId || null === opId) {
+ return null;
+ }
+
+ try {
+ var formEls = Array.prototype.slice.call(getFormElements(document));
+ var filteredFormEls = formEls.filter(function (el) {
+ return el.opid == opId;
+ });
+
+ if (0 < filteredFormEls.length) {
+ theEl = filteredFormEls[0], 1 < filteredFormEls.length && console.warn('More than one element found with opid ' + opId);
+ } else {
+ var theIndex = parseInt(opId.split('__')[1], 10);
+ isNaN(theIndex) || (theEl = formEls[theIndex]);
+ }
+ } catch (e) {
+ console.error('An unexpected error occurred: ' + e);
+ } finally {
+ return theEl;
+ }
+ }
+
+ // get all the form elements that we care about
+ function getFormElements(theDoc, limit) {
+ // START MODIFICATION
+ var els = [];
+ try {
+ var elsList = theDoc.querySelectorAll('input:not([type="hidden"]):not([type="submit"]):not([type="reset"])' +
+ ':not([type="button"]):not([type="image"]):not([type="file"]):not([data-bwignore]), select, ' +
+ 'span[data-bwautofill]');
+ els = Array.prototype.slice.call(elsList);
+ } catch (e) { }
+
+ if (!limit || els.length <= limit) {
+ return els;
+ }
+
+ // non-checkboxes/radios have higher priority
+ var returnEls = [];
+ var unimportantEls = [];
+ for (var i = 0; i < els.length; i++) {
+ if (returnEls.length >= limit) {
+ break;
+ }
+
+ var el = els[i];
+ var type = el.type ? el.type.toLowerCase() : el.type;
+ if (type === 'checkbox' || type === 'radio') {
+ unimportantEls.push(el);
+ }
+ else {
+ returnEls.push(el);
+ }
+ }
+
+ var unimportantElsToAdd = limit - returnEls.length;
+ if (unimportantElsToAdd > 0) {
+ returnEls = returnEls.concat(unimportantEls.slice(0, unimportantElsToAdd));
+ }
+
+ return returnEls;
+ // END MODIFICATION
+ }
+
+ // focus the element and optionally restore its original value
+ function focusElement(el, setVal) {
+ if (setVal) {
+ var initialValue = el.value;
+ el.focus();
+
+ if (el.value !== initialValue) {
+ el.value = initialValue;
+ }
+ } else {
+ el.focus();
+ }
+ }
+
+ return JSON.stringify(getPageDetails(document, 'oneshotUUID'));
+ }
+
+ function fill(document, fillScript, undefined) {
+ var isFirefox = navigator.userAgent.indexOf('Firefox') !== -1 || navigator.userAgent.indexOf('Gecko/') !== -1;
+
+ var markTheFilling = true,
+ animateTheFilling = true;
+
+ // Check if URL is not secure when the original saved one was
+ function urlNotSecure(savedURL) {
+ var passwordInputs = null;
+ if (!savedURL) {
+ return false;
+ }
+
+ return 0 === savedURL.indexOf('https://') && 'http:' === document.location.protocol && (passwordInputs = document.querySelectorAll('input[type=password]'),
+ 0 < passwordInputs.length && (confirmResult = confirm('Warning: This is an unsecured HTTP page, and any information you submit can potentially be seen and changed by others. This Login was originally saved on a secure (HTTPS) page.\\n\\nDo you still wish to fill this login?'),
+ 0 == confirmResult)) ? true : false;
+ }
+
+ function doFill(fillScript) {
+ var fillScriptOps,
+ theOpIds = [],
+ fillScriptProperties = fillScript.properties,
+ operationDelayMs = 1,
+ doOperation,
+ operationsToDo = [];
+
+ fillScriptProperties &&
+ fillScriptProperties.delay_between_operations &&
+ (operationDelayMs = fillScriptProperties.delay_between_operations);
+
+ if (urlNotSecure(fillScript.savedURL)) {
+ return;
+ }
+
+ doOperation = function (ops, theOperation) {
+ var op = ops[0];
+ if (void 0 === op) {
+ theOperation();
+ } else {
+ // should we delay?
+ if ('delay' === op.operation || 'delay' === op[0]) {
+ operationDelayMs = op.parameters ? op.parameters[0] : op[1];
+ } else {
+ if (op = normalizeOp(op)) {
+ for (var opIndex = 0; opIndex < op.length; opIndex++) {
+ -1 === operationsToDo.indexOf(op[opIndex]) && operationsToDo.push(op[opIndex]);
+ }
+ }
+ theOpIds = theOpIds.concat(operationsToDo.map(function (operationToDo) {
+ return operationToDo && operationToDo.hasOwnProperty('opid') ? operationToDo.opid : null;
+ }));
+ }
+ setTimeout(function () {
+ doOperation(ops.slice(1), theOperation);
+ }, operationDelayMs);
+ }
+ };
+
+ if (fillScriptOps = fillScript.options) {
+ fillScriptOps.hasOwnProperty('animate') && (animateTheFilling = fillScriptOps.animate),
+ fillScriptOps.hasOwnProperty('markFilling') && (markTheFilling = fillScriptOps.markFilling);
+ }
+
+ // don't mark a password filling
+ fillScript.itemType && 'fillPassword' === fillScript.itemType && (markTheFilling = false);
+
+ if (!fillScript.hasOwnProperty('script')) {
+ return;
+ }
+
+ // custom fill script
+
+ fillScriptOps = fillScript.script;
+ doOperation(fillScriptOps, function () {
+ // Done now
+ // Do we have anything to autosubmit?
+ if (fillScript.hasOwnProperty('autosubmit') && 'function' == typeof autosubmit) {
+ fillScript.itemType && 'fillLogin' !== fillScript.itemType || (0 < operationsToDo.length ? setTimeout(function () {
+ autosubmit(fillScript.autosubmit, fillScriptProperties.allow_clicky_autosubmit, operationsToDo);
+ }, AUTOSUBMIT_DELAY) : DEBUG_AUTOSUBMIT && console.log('[AUTOSUBMIT] Not attempting to submit since no fields were filled: ', operationsToDo))
+ }
+
+ // handle protectedGlobalPage
+ if ('object' == typeof protectedGlobalPage) {
+ protectedGlobalPage.b('fillItemResults', {
+ documentUUID: documentUUID,
+ fillContextIdentifier: fillScript.fillContextIdentifier,
+ usedOpids: theOpIds
+ }, function () {
+ fillingItemType = null;
+ })
+ }
+ });
+ }
+
+ // fill for reference
+ var thisFill = {
+ fill_by_opid: doFillByOpId,
+ fill_by_query: doFillByQuery,
+ click_on_opid: doClickByOpId,
+ click_on_query: doClickByQuery,
+ touch_all_fields: touchAllFields,
+ simple_set_value_by_query: doSimpleSetByQuery,
+ focus_by_opid: doFocusByOpId,
+ delay: null
+ };
+
+ // normalize the op versus the reference
+ function normalizeOp(op) {
+ var thisOperation;
+ if (op.hasOwnProperty('operation') && op.hasOwnProperty('parameters')) {
+ thisOperation = op.operation, op = op.parameters;
+ } else {
+ if ('[object Array]' === Object.prototype.toString.call(op)) {
+ thisOperation = op[0],
+ op = op.splice(1);
+ } else {
+ return null;
+ }
+ }
+ return thisFill.hasOwnProperty(thisOperation) ? thisFill[thisOperation].apply(this, op) : null;
+ }
+
+ // do a fill by opid operation
+ function doFillByOpId(opId, op) {
+ var el = getElementByOpId(opId);
+ return el ? (fillTheElement(el, op), [el]) : null;
+ }
+
+ // do a fill by query operation
+ function doFillByQuery(query, op) {
+ var elements = selectAllFromDoc(query);
+ return Array.prototype.map.call(Array.prototype.slice.call(elements), function (el) {
+ fillTheElement(el, op);
+ return el;
+ }, this);
+ }
+
+ // do a simple set value by query
+ function doSimpleSetByQuery(query, valueToSet) {
+ var elements = selectAllFromDoc(query),
+ arr = [];
+ Array.prototype.forEach.call(Array.prototype.slice.call(elements), function (el) {
+ el.disabled || el.a || el.readOnly || void 0 === el.value || (el.value = valueToSet, arr.push(el));
+ });
+ return arr;
+ }
+
+ // focus by opid
+ function doFocusByOpId(opId) {
+ var el = getElementByOpId(opId)
+ if (el) {
+ 'function' === typeof el.click && el.click(),
+ 'function' === typeof el.focus && doFocusElement(el, true);
+ }
+
+ return null;
+ }
+
+ // do a click by opid operation
+ function doClickByOpId(opId) {
+ var el = getElementByOpId(opId);
+ return el ? clickElement(el) ? [el] : null : null;
+ }
+
+ // do a click by query operation
+ function doClickByQuery(query) {
+ query = selectAllFromDoc(query);
+ return Array.prototype.map.call(Array.prototype.slice.call(query), function (el) {
+ clickElement(el);
+ 'function' === typeof el.click && el.click();
+ 'function' === typeof el.focus && doFocusElement(el, true);
+ return [el];
+ }, this);
+ }
+
+ var checkRadioTrueOps = {
+ 'true': true,
+ y: true,
+ 1: true,
+ yes: true,
+ '✓': true
+ },
+ styleTimeout = 200;
+
+ // fill an element
+ function fillTheElement(el, op) {
+ var shouldCheck;
+ if (el && null !== op && void 0 !== op && !(el.disabled || el.a || el.readOnly)) {
+ switch (markTheFilling && el.form && !el.form.opfilled && (el.form.opfilled = true),
+ el.type ? el.type.toLowerCase() : null) {
+ case 'checkbox':
+ shouldCheck = op && 1 <= op.length && checkRadioTrueOps.hasOwnProperty(op.toLowerCase()) && true === checkRadioTrueOps[op.toLowerCase()];
+ el.checked === shouldCheck || doAllFillOperations(el, function (theEl) {
+ theEl.checked = shouldCheck;
+ });
+ break;
+ case 'radio':
+ true === checkRadioTrueOps[op.toLowerCase()] && el.click();
+ break;
+ default:
+ el.value == op || doAllFillOperations(el, function (theEl) {
+ // START MODIFICATION
+ if (!theEl.type && theEl.tagName.toLowerCase() === 'span') {
+ theEl.innerText = op;
+ return;
+ }
+ // END MODIFICATION
+ theEl.value = op;
+ });
+ }
+ }
+ }
+
+ // do all the full operations needed
+ function doAllFillOperations(el, afterValSetFunc) {
+ setValueForElement(el);
+ afterValSetFunc(el);
+ setValueForElementByEvent(el);
+
+ // START MODIFICATION
+ if (canSeeElementToStyle(el)) {
+ el.classList.add('com-bitwarden-browser-animated-fill');
+ setTimeout(function () {
+ if (el) {
+ el.classList.remove('com-bitwarden-browser-animated-fill');
+ }
+ }, styleTimeout);
+ }
+ // END MODIFICATION
+ }
+
+ document.elementForOPID = getElementByOpId;
+
+ // normalize the event based on API support
+ function normalizeEvent(el, eventName) {
+ var ev;
+ if ('KeyboardEvent' in window) {
+ ev = new window.KeyboardEvent(eventName, {
+ bubbles: true,
+ cancelable: false,
+ });
+ }
+ else {
+ ev = el.ownerDocument.createEvent('Events');
+ ev.initEvent(eventName, true, false);
+ ev.charCode = 0;
+ ev.keyCode = 0;
+ ev.which = 0;
+ ev.srcElement = el;
+ ev.target = el;
+ }
+
+ return ev;
+ }
+
+ // set value of the given element
+ function setValueForElement(el) {
+ var valueToSet = el.value;
+ clickElement(el);
+ doFocusElement(el, false);
+ el.dispatchEvent(normalizeEvent(el, 'keydown'));
+ el.dispatchEvent(normalizeEvent(el, 'keypress'));
+ el.dispatchEvent(normalizeEvent(el, 'keyup'));
+ el.value !== valueToSet && (el.value = valueToSet);
+ }
+
+ // set value of the given element by using events
+ function setValueForElementByEvent(el) {
+ var valueToSet = el.value,
+ ev1 = el.ownerDocument.createEvent('HTMLEvents'),
+ ev2 = el.ownerDocument.createEvent('HTMLEvents');
+
+ el.dispatchEvent(normalizeEvent(el, 'keydown'));
+ el.dispatchEvent(normalizeEvent(el, 'keypress'));
+ el.dispatchEvent(normalizeEvent(el, 'keyup'));
+ ev2.initEvent('input', true, true);
+ el.dispatchEvent(ev2);
+ ev1.initEvent('change', true, true);
+ el.dispatchEvent(ev1);
+ el.blur();
+ el.value !== valueToSet && (el.value = valueToSet);
+ }
+
+ // click on an element
+ function clickElement(el) {
+ if (!el || el && 'function' !== typeof el.click) {
+ return false;
+ }
+ el.click();
+ return true;
+ }
+
+ // get all fields we care about
+ function getAllFields() {
+ var r = RegExp('((\\\\b|_|-)pin(\\\\b|_|-)|password|passwort|kennwort|passe|contraseña|senha|密码|adgangskode|hasło|wachtwoord)', 'i');
+ return Array.prototype.slice.call(selectAllFromDoc("input[type='text']")).filter(function (el) {
+ return el.value && r.test(el.value);
+ }, this);
+ }
+
+ // touch all the fields
+ function touchAllFields() {
+ getAllFields().forEach(function (el) {
+ setValueForElement(el);
+ el.click && el.click();
+ setValueForElementByEvent(el);
+ });
+ }
+
+ // can we see the element to apply some styling?
+ function canSeeElementToStyle(el) {
+ var currentEl;
+ if (currentEl = animateTheFilling) {
+ a: {
+ currentEl = el;
+ for (var owner = el.ownerDocument, owner = owner ? owner.defaultView : {}, theStyle; currentEl && currentEl !== document;) {
+ theStyle = owner.getComputedStyle ? owner.getComputedStyle(currentEl, null) : currentEl.style;
+ if (!theStyle) {
+ currentEl = true;
+ break a;
+ }
+ if ('none' === theStyle.display || 'hidden' == theStyle.visibility) {
+ currentEl = false;
+ break a;
+ }
+ currentEl = currentEl.parentNode;
+ }
+ currentEl = currentEl === document;
+ }
+ }
+ // START MODIFICATION
+ if (el && !el.type && el.tagName.toLowerCase() === 'span') {
+ return true;
+ }
+ // END MODIFICATION
+ return currentEl ? -1 !== 'email text password number tel url'.split(' ').indexOf(el.type || '') : false;
+ }
+
+ // find the element for this operation
+ function getElementByOpId(theOpId) {
+ var theElement;
+ if (void 0 === theOpId || null === theOpId) {
+ return null;
+ }
+ try {
+ // START MODIFICATION
+ var elements = Array.prototype.slice.call(selectAllFromDoc('input, select, button, ' +
+ 'span[data-bwautofill]'));
+ // END MODIFICATION
+ var filteredElements = elements.filter(function (o) {
+ return o.opid == theOpId;
+ });
+ if (0 < filteredElements.length) {
+ theElement = filteredElements[0],
+ 1 < filteredElements.length && console.warn('More than one element found with opid ' + theOpId);
+ } else {
+ var elIndex = parseInt(theOpId.split('__')[1], 10);
+ isNaN(elIndex) || (theElement = elements[elIndex]);
+ }
+ } catch (e) {
+ console.error('An unexpected error occurred: ' + e);
+ } finally {
+ return theElement;
+ }
+ }
+
+ // helper for doc.querySelectorAll
+ function selectAllFromDoc(theSelector) {
+ var d = document, elements = [];
+ try {
+ elements = d.querySelectorAll(theSelector);
+ } catch (e) { }
+ return elements;
+ }
+
+ // focus an element and optionally re-set its value after focusing
+ function doFocusElement(el, setValue) {
+ if (setValue) {
+ var existingValue = el.value;
+ el.focus();
+ el.value !== existingValue && (el.value = existingValue);
+ } else {
+ el.focus();
+ }
+ }
+
+ doFill(fillScript);
+
+ return JSON.stringify({
+ success: true
+ });
+ }
+
+ /*
+ End 1Password Extension
+ */
+
+ chrome.runtime.onMessage.addListener(function (msg, sender, sendResponse) {
+ if (msg.command === 'collectPageDetails') {
+ var pageDetails = collect(document);
+ var pageDetailsObj = JSON.parse(pageDetails);
+ chrome.runtime.sendMessage({
+ command: 'collectPageDetailsResponse',
+ tab: msg.tab,
+ details: pageDetailsObj,
+ sender: msg.sender
+ });
+ sendResponse();
+ return true;
+ }
+ else if (msg.command === 'fillForm') {
+ fill(document, msg.fillScript);
+ sendResponse();
+ return true;
+ }
+ });
+})();
+
+
+/***/ })
+
+/******/ });
\ No newline at end of file
diff --git a/src/iOS.Safari/Resources/content/autofiller.js b/src/iOS.Safari/Resources/content/autofiller.js
new file mode 100644
index 000000000..4ae76b2ae
--- /dev/null
+++ b/src/iOS.Safari/Resources/content/autofiller.js
@@ -0,0 +1,139 @@
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./src/content/autofiller.ts");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./src/content/autofiller.ts":
+/*!***********************************!*\
+ !*** ./src/content/autofiller.ts ***!
+ \***********************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+document.addEventListener('DOMContentLoaded', event => {
+ let pageHref = null;
+ let filledThisHref = false;
+ let delayFillTimeout;
+ const enabledKey = 'enableAutoFillOnPageLoad';
+ chrome.storage.local.get(enabledKey, (obj) => {
+ if (obj != null && obj[enabledKey] === true) {
+ setInterval(() => doFillIfNeeded(), 500);
+ }
+ });
+ chrome.runtime.onMessage.addListener((msg, sender, sendResponse) => {
+ if (msg.command === 'fillForm' && pageHref === msg.url) {
+ filledThisHref = true;
+ }
+ });
+ function doFillIfNeeded(force = false) {
+ if (force || pageHref !== window.location.href) {
+ if (!force) {
+ // Some websites are slow and rendering all page content. Try to fill again later
+ // if we haven't already.
+ filledThisHref = false;
+ if (delayFillTimeout != null) {
+ window.clearTimeout(delayFillTimeout);
+ }
+ delayFillTimeout = window.setTimeout(() => {
+ if (!filledThisHref) {
+ doFillIfNeeded(true);
+ }
+ }, 1500);
+ }
+ pageHref = window.location.href;
+ const msg = {
+ command: 'bgCollectPageDetails',
+ sender: 'autofiller',
+ };
+ chrome.runtime.sendMessage(msg);
+ }
+ }
+});
+
+
+/***/ })
+
+/******/ });
\ No newline at end of file
diff --git a/src/iOS.Safari/Resources/content/contextMenuHandler.js b/src/iOS.Safari/Resources/content/contextMenuHandler.js
new file mode 100644
index 000000000..57dc6d31f
--- /dev/null
+++ b/src/iOS.Safari/Resources/content/contextMenuHandler.js
@@ -0,0 +1,159 @@
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./src/content/contextMenuHandler.ts");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./src/content/contextMenuHandler.ts":
+/*!*******************************************!*\
+ !*** ./src/content/contextMenuHandler.ts ***!
+ \*******************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+const inputTags = ['input', 'textarea', 'select'];
+const labelTags = ['label', 'span'];
+const attributes = ['id', 'name', 'label-aria', 'placeholder'];
+const invalidElement = chrome.i18n.getMessage('copyCustomFieldNameInvalidElement');
+const noUniqueIdentifier = chrome.i18n.getMessage('copyCustomFieldNameNotUnique');
+let clickedEl = null;
+// Find the best attribute to be used as the Name for an element in a custom field.
+function getClickedElementIdentifier() {
+ var _a, _b;
+ if (clickedEl == null) {
+ return invalidElement;
+ }
+ const clickedTag = clickedEl.nodeName.toLowerCase();
+ let inputEl = null;
+ // Try to identify the input element (which may not be the clicked element)
+ if (labelTags.includes(clickedTag)) {
+ let inputId = null;
+ if (clickedTag === 'label') {
+ inputId = clickedEl.getAttribute('for');
+ }
+ else {
+ inputId = (_a = clickedEl.closest('label')) === null || _a === void 0 ? void 0 : _a.getAttribute('for');
+ }
+ inputEl = document.getElementById(inputId);
+ }
+ else {
+ inputEl = clickedEl;
+ }
+ if (inputEl == null || !inputTags.includes(inputEl.nodeName.toLowerCase())) {
+ return invalidElement;
+ }
+ for (const attr of attributes) {
+ const attributeValue = inputEl.getAttribute(attr);
+ const selector = '[' + attr + '="' + attributeValue + '"]';
+ if (!isNullOrEmpty(attributeValue) && ((_b = document.querySelectorAll(selector)) === null || _b === void 0 ? void 0 : _b.length) === 1) {
+ return attributeValue;
+ }
+ }
+ return noUniqueIdentifier;
+}
+function isNullOrEmpty(s) {
+ return s == null || s === '';
+}
+// We only have access to the element that's been clicked when the context menu is first opened.
+// Remember it for use later.
+document.addEventListener('contextmenu', event => {
+ clickedEl = event.target;
+});
+// Runs when the 'Copy Custom Field Name' context menu item is actually clicked.
+chrome.runtime.onMessage.addListener(event => {
+ if (event.command === 'getClickedElement') {
+ const identifier = getClickedElementIdentifier();
+ chrome.runtime.sendMessage({
+ command: 'getClickedElementResponse',
+ sender: 'contextMenuHandler',
+ identifier: identifier,
+ });
+ }
+});
+
+
+/***/ })
+
+/******/ });
\ No newline at end of file
diff --git a/src/iOS.Safari/Resources/content/message_handler.js b/src/iOS.Safari/Resources/content/message_handler.js
new file mode 100644
index 000000000..0cdfa1634
--- /dev/null
+++ b/src/iOS.Safari/Resources/content/message_handler.js
@@ -0,0 +1,126 @@
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./src/content/message_handler.ts");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./src/content/message_handler.ts":
+/*!****************************************!*\
+ !*** ./src/content/message_handler.ts ***!
+ \****************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+window.addEventListener('message', event => {
+ if (event.source !== window)
+ return;
+ if (event.data.command && (event.data.command === 'authResult')) {
+ chrome.runtime.sendMessage({
+ command: event.data.command,
+ code: event.data.code,
+ state: event.data.state,
+ referrer: event.source.location.hostname,
+ });
+ }
+ if (event.data.command && (event.data.command === 'webAuthnResult')) {
+ chrome.runtime.sendMessage({
+ command: event.data.command,
+ data: event.data.data,
+ remember: event.data.remember,
+ referrer: event.source.location.hostname,
+ });
+ }
+}, false);
+const forwardCommands = ['promptForLogin', 'addToLockedVaultPendingNotifications', 'unlockCompleted'];
+chrome.runtime.onMessage.addListener(event => {
+ if (forwardCommands.includes(event.command)) {
+ chrome.runtime.sendMessage(event);
+ }
+});
+
+
+/***/ })
+
+/******/ });
\ No newline at end of file
diff --git a/src/iOS.Safari/Resources/content/notificationBar.js b/src/iOS.Safari/Resources/content/notificationBar.js
new file mode 100644
index 000000000..3ffd7adc7
--- /dev/null
+++ b/src/iOS.Safari/Resources/content/notificationBar.js
@@ -0,0 +1,592 @@
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./src/content/notificationBar.ts");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./src/content/notificationBar.ts":
+/*!****************************************!*\
+ !*** ./src/content/notificationBar.ts ***!
+ \****************************************/
+/*! no exports provided */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+document.addEventListener('DOMContentLoaded', event => {
+ if (window.location.hostname.indexOf('vault.bitwarden.com') > -1) {
+ return;
+ }
+ const pageDetails = [];
+ const formData = [];
+ let barType = null;
+ let pageHref = null;
+ let observer = null;
+ const observeIgnoredElements = new Set(['a', 'i', 'b', 'strong', 'span', 'code', 'br', 'img', 'small', 'em', 'hr']);
+ let domObservationCollectTimeout = null;
+ let collectIfNeededTimeout = null;
+ let observeDomTimeout = null;
+ const inIframe = isInIframe();
+ const cancelButtonNames = new Set(['cancel', 'close', 'back']);
+ const logInButtonNames = new Set(['log in', 'sign in', 'login', 'go', 'submit', 'continue', 'next']);
+ const changePasswordButtonNames = new Set(['save password', 'update password', 'change password', 'change']);
+ const changePasswordButtonContainsNames = new Set(['pass', 'change', 'contras', 'senha']);
+ let disabledAddLoginNotification = false;
+ let disabledChangedPasswordNotification = false;
+ chrome.storage.local.get('neverDomains', (ndObj) => {
+ const domains = ndObj.neverDomains;
+ if (domains != null && domains.hasOwnProperty(window.location.hostname)) {
+ return;
+ }
+ chrome.storage.local.get('disableAddLoginNotification', (disAddObj) => {
+ disabledAddLoginNotification = disAddObj != null && disAddObj.disableAddLoginNotification === true;
+ chrome.storage.local.get('disableChangedPasswordNotification', (disChangedObj) => {
+ disabledChangedPasswordNotification = disChangedObj != null &&
+ disChangedObj.disableChangedPasswordNotification === true;
+ if (!disabledAddLoginNotification || !disabledChangedPasswordNotification) {
+ collectIfNeededWithTimeout();
+ }
+ });
+ });
+ });
+ chrome.runtime.onMessage.addListener((msg, sender, sendResponse) => {
+ processMessages(msg, sendResponse);
+ });
+ function processMessages(msg, sendResponse) {
+ if (msg.command === 'openNotificationBar') {
+ if (inIframe) {
+ return;
+ }
+ closeExistingAndOpenBar(msg.data.type, msg.data.typeData);
+ sendResponse();
+ return true;
+ }
+ else if (msg.command === 'closeNotificationBar') {
+ if (inIframe) {
+ return;
+ }
+ closeBar(true);
+ sendResponse();
+ return true;
+ }
+ else if (msg.command === 'adjustNotificationBar') {
+ if (inIframe) {
+ return;
+ }
+ adjustBar(msg.data);
+ sendResponse();
+ return true;
+ }
+ else if (msg.command === 'notificationBarPageDetails') {
+ pageDetails.push(msg.data.details);
+ watchForms(msg.data.forms);
+ sendResponse();
+ return true;
+ }
+ }
+ function isInIframe() {
+ try {
+ return window.self !== window.top;
+ }
+ catch (_a) {
+ return true;
+ }
+ }
+ function observeDom() {
+ const bodies = document.querySelectorAll('body');
+ if (bodies && bodies.length > 0) {
+ observer = new MutationObserver(mutations => {
+ if (mutations == null || mutations.length === 0 || pageHref !== window.location.href) {
+ return;
+ }
+ let doCollect = false;
+ for (let i = 0; i < mutations.length; i++) {
+ const mutation = mutations[i];
+ if (mutation.addedNodes == null || mutation.addedNodes.length === 0) {
+ continue;
+ }
+ for (let j = 0; j < mutation.addedNodes.length; j++) {
+ const addedNode = mutation.addedNodes[j];
+ if (addedNode == null) {
+ continue;
+ }
+ const tagName = addedNode.tagName != null ? addedNode.tagName.toLowerCase() : null;
+ if (tagName != null && tagName === 'form' &&
+ (addedNode.dataset == null || !addedNode.dataset.bitwardenWatching)) {
+ doCollect = true;
+ break;
+ }
+ if ((tagName != null && observeIgnoredElements.has(tagName)) ||
+ addedNode.querySelectorAll == null) {
+ continue;
+ }
+ const forms = addedNode.querySelectorAll('form:not([data-bitwarden-watching])');
+ if (forms != null && forms.length > 0) {
+ doCollect = true;
+ break;
+ }
+ }
+ if (doCollect) {
+ break;
+ }
+ }
+ if (doCollect) {
+ if (domObservationCollectTimeout != null) {
+ window.clearTimeout(domObservationCollectTimeout);
+ }
+ domObservationCollectTimeout = window.setTimeout(collect, 1000);
+ }
+ });
+ observer.observe(bodies[0], { childList: true, subtree: true });
+ }
+ }
+ function collectIfNeededWithTimeout() {
+ if (collectIfNeededTimeout != null) {
+ window.clearTimeout(collectIfNeededTimeout);
+ }
+ collectIfNeededTimeout = window.setTimeout(collectIfNeeded, 1000);
+ }
+ function collectIfNeeded() {
+ if (pageHref !== window.location.href) {
+ pageHref = window.location.href;
+ if (observer) {
+ observer.disconnect();
+ observer = null;
+ }
+ collect();
+ if (observeDomTimeout != null) {
+ window.clearTimeout(observeDomTimeout);
+ }
+ observeDomTimeout = window.setTimeout(observeDom, 1000);
+ }
+ if (collectIfNeededTimeout != null) {
+ window.clearTimeout(collectIfNeededTimeout);
+ }
+ collectIfNeededTimeout = window.setTimeout(collectIfNeeded, 1000);
+ }
+ function collect() {
+ sendPlatformMessage({
+ command: 'bgCollectPageDetails',
+ sender: 'notificationBar',
+ });
+ }
+ function watchForms(forms) {
+ if (forms == null || forms.length === 0) {
+ return;
+ }
+ forms.forEach((f) => {
+ const formId = f.form != null ? f.form.htmlID : null;
+ let formEl = null;
+ if (formId != null && formId !== '') {
+ formEl = document.getElementById(formId);
+ }
+ if (formEl == null) {
+ const index = parseInt(f.form.opid.split('__')[2], null);
+ formEl = document.getElementsByTagName('form')[index];
+ }
+ if (formEl != null && formEl.dataset.bitwardenWatching !== '1') {
+ const formDataObj = {
+ data: f,
+ formEl: formEl,
+ usernameEl: null,
+ passwordEl: null,
+ passwordEls: null,
+ };
+ locateFields(formDataObj);
+ formData.push(formDataObj);
+ listen(formEl);
+ formEl.dataset.bitwardenWatching = '1';
+ }
+ });
+ }
+ function listen(form) {
+ form.removeEventListener('submit', formSubmitted, false);
+ form.addEventListener('submit', formSubmitted, false);
+ const submitButton = getSubmitButton(form, logInButtonNames);
+ if (submitButton != null) {
+ submitButton.removeEventListener('click', formSubmitted, false);
+ submitButton.addEventListener('click', formSubmitted, false);
+ }
+ }
+ function locateFields(formDataObj) {
+ const inputs = Array.from(document.getElementsByTagName('input'));
+ formDataObj.usernameEl = locateField(formDataObj.formEl, formDataObj.data.username, inputs);
+ if (formDataObj.usernameEl != null && formDataObj.data.password != null) {
+ formDataObj.passwordEl = locatePassword(formDataObj.formEl, formDataObj.data.password, inputs, true);
+ }
+ else if (formDataObj.data.passwords != null) {
+ formDataObj.passwordEls = [];
+ formDataObj.data.passwords.forEach((pData) => {
+ const el = locatePassword(formDataObj.formEl, pData, inputs, false);
+ if (el != null) {
+ formDataObj.passwordEls.push(el);
+ }
+ });
+ if (formDataObj.passwordEls.length === 0) {
+ formDataObj.passwordEls = null;
+ }
+ }
+ }
+ function locatePassword(form, passwordData, inputs, doLastFallback) {
+ let el = locateField(form, passwordData, inputs);
+ if (el != null && el.type !== 'password') {
+ el = null;
+ }
+ if (doLastFallback && el == null) {
+ el = form.querySelector('input[type="password"]');
+ }
+ return el;
+ }
+ function locateField(form, fieldData, inputs) {
+ if (fieldData == null) {
+ return;
+ }
+ let el = null;
+ if (fieldData.htmlID != null && fieldData.htmlID !== '') {
+ try {
+ el = form.querySelector('#' + fieldData.htmlID);
+ }
+ catch (_a) {
+ // Ignore error, we perform fallbacks below.
+ }
+ }
+ if (el == null && fieldData.htmlName != null && fieldData.htmlName !== '') {
+ el = form.querySelector('input[name="' + fieldData.htmlName + '"]');
+ }
+ if (el == null && fieldData.elementNumber != null) {
+ el = inputs[fieldData.elementNumber];
+ }
+ return el;
+ }
+ function formSubmitted(e) {
+ let form = null;
+ if (e.type === 'click') {
+ form = e.target.closest('form');
+ if (form == null) {
+ const parentModal = e.target.closest('div.modal');
+ if (parentModal != null) {
+ const modalForms = parentModal.querySelectorAll('form');
+ if (modalForms.length === 1) {
+ form = modalForms[0];
+ }
+ }
+ }
+ }
+ else {
+ form = e.target;
+ }
+ if (form == null || form.dataset.bitwardenProcessed === '1') {
+ return;
+ }
+ for (let i = 0; i < formData.length; i++) {
+ if (formData[i].formEl !== form) {
+ continue;
+ }
+ const disabledBoth = disabledChangedPasswordNotification && disabledAddLoginNotification;
+ if (!disabledBoth && formData[i].usernameEl != null && formData[i].passwordEl != null) {
+ const login = {
+ username: formData[i].usernameEl.value,
+ password: formData[i].passwordEl.value,
+ url: document.URL,
+ };
+ if (login.username != null && login.username !== '' &&
+ login.password != null && login.password !== '') {
+ processedForm(form);
+ sendPlatformMessage({
+ command: 'bgAddLogin',
+ login: login,
+ });
+ break;
+ }
+ }
+ if (!disabledChangedPasswordNotification && formData[i].passwordEls != null) {
+ const passwords = formData[i].passwordEls
+ .filter((el) => el.value != null && el.value !== '')
+ .map((el) => el.value);
+ let curPass = null;
+ let newPass = null;
+ let newPassOnly = false;
+ if (formData[i].passwordEls.length === 3 && passwords.length === 3) {
+ newPass = passwords[1];
+ if (passwords[0] !== newPass && newPass === passwords[2]) {
+ curPass = passwords[0];
+ }
+ else if (newPass !== passwords[2] && passwords[0] === newPass) {
+ curPass = passwords[2];
+ }
+ }
+ else if (formData[i].passwordEls.length === 2 && passwords.length === 2) {
+ if (passwords[0] === passwords[1]) {
+ newPassOnly = true;
+ newPass = passwords[0];
+ curPass = null;
+ }
+ else {
+ const buttonText = getButtonText(getSubmitButton(form, changePasswordButtonNames));
+ const matches = Array.from(changePasswordButtonContainsNames)
+ .filter(n => buttonText.indexOf(n) > -1);
+ if (matches.length > 0) {
+ curPass = passwords[0];
+ newPass = passwords[1];
+ }
+ }
+ }
+ if (newPass != null && curPass != null || (newPassOnly && newPass != null)) {
+ processedForm(form);
+ const changePasswordRuntimeMessage = {
+ newPassword: newPass,
+ currentPassword: curPass,
+ url: document.URL,
+ };
+ sendPlatformMessage({
+ command: 'bgChangedPassword',
+ data: changePasswordRuntimeMessage,
+ });
+ break;
+ }
+ }
+ }
+ }
+ function getSubmitButton(wrappingEl, buttonNames) {
+ if (wrappingEl == null) {
+ return null;
+ }
+ const wrappingElIsForm = wrappingEl.tagName.toLowerCase() === 'form';
+ let submitButton = wrappingEl.querySelector('input[type="submit"], input[type="image"], ' +
+ 'button[type="submit"]');
+ if (submitButton == null && wrappingElIsForm) {
+ submitButton = wrappingEl.querySelector('button:not([type])');
+ if (submitButton != null) {
+ const buttonText = getButtonText(submitButton);
+ if (buttonText != null && cancelButtonNames.has(buttonText.trim().toLowerCase())) {
+ submitButton = null;
+ }
+ }
+ }
+ if (submitButton == null) {
+ const possibleSubmitButtons = Array.from(wrappingEl.querySelectorAll('a, span, button[type="button"], ' +
+ 'input[type="button"], button:not([type])'));
+ let typelessButton = null;
+ possibleSubmitButtons.forEach(button => {
+ if (submitButton != null || button == null || button.tagName == null) {
+ return;
+ }
+ const buttonText = getButtonText(button);
+ if (buttonText != null) {
+ if (typelessButton != null && button.tagName.toLowerCase() === 'button' &&
+ button.getAttribute('type') == null &&
+ !cancelButtonNames.has(buttonText.trim().toLowerCase())) {
+ typelessButton = button;
+ }
+ else if (buttonNames.has(buttonText.trim().toLowerCase())) {
+ submitButton = button;
+ }
+ }
+ });
+ if (submitButton == null && typelessButton != null) {
+ submitButton = typelessButton;
+ }
+ }
+ if (submitButton == null && wrappingElIsForm) {
+ // Maybe it's in a modal?
+ const parentModal = wrappingEl.closest('div.modal');
+ if (parentModal != null) {
+ const modalForms = parentModal.querySelectorAll('form');
+ if (modalForms.length === 1) {
+ submitButton = getSubmitButton(parentModal, buttonNames);
+ }
+ }
+ }
+ return submitButton;
+ }
+ function getButtonText(button) {
+ let buttonText = null;
+ if (button.tagName.toLowerCase() === 'input') {
+ buttonText = button.value;
+ }
+ else {
+ buttonText = button.innerText;
+ }
+ return buttonText;
+ }
+ function processedForm(form) {
+ form.dataset.bitwardenProcessed = '1';
+ window.setTimeout(() => {
+ form.dataset.bitwardenProcessed = '0';
+ }, 500);
+ }
+ function closeExistingAndOpenBar(type, typeData) {
+ let barPage = 'notification/bar.html';
+ switch (type) {
+ case 'add':
+ barPage = barPage + '?add=1&isVaultLocked=' + typeData.isVaultLocked;
+ break;
+ case 'change':
+ barPage = barPage + '?change=1&isVaultLocked=' + typeData.isVaultLocked;
+ break;
+ default:
+ break;
+ }
+ const frame = document.getElementById('bit-notification-bar-iframe');
+ if (frame != null && frame.src.indexOf(barPage) >= 0) {
+ return;
+ }
+ closeBar(false);
+ openBar(type, barPage);
+ }
+ function openBar(type, barPage) {
+ barType = type;
+ if (document.body == null) {
+ return;
+ }
+ const barPageUrl = chrome.extension.getURL(barPage);
+ const iframe = document.createElement('iframe');
+ iframe.style.cssText = 'height: 42px; width: 100%; border: 0; min-height: initial;';
+ iframe.id = 'bit-notification-bar-iframe';
+ iframe.src = barPageUrl;
+ const frameDiv = document.createElement('div');
+ frameDiv.setAttribute('aria-live', 'polite');
+ frameDiv.id = 'bit-notification-bar';
+ frameDiv.style.cssText = 'height: 42px; width: 100%; top: 0; left: 0; padding: 0; position: fixed; ' +
+ 'z-index: 2147483647; visibility: visible;';
+ frameDiv.appendChild(iframe);
+ document.body.appendChild(frameDiv);
+ iframe.contentWindow.location = barPageUrl;
+ const spacer = document.createElement('div');
+ spacer.id = 'bit-notification-bar-spacer';
+ spacer.style.cssText = 'height: 42px;';
+ document.body.insertBefore(spacer, document.body.firstChild);
+ }
+ function closeBar(explicitClose) {
+ const barEl = document.getElementById('bit-notification-bar');
+ if (barEl != null) {
+ barEl.parentElement.removeChild(barEl);
+ }
+ const spacerEl = document.getElementById('bit-notification-bar-spacer');
+ if (spacerEl) {
+ spacerEl.parentElement.removeChild(spacerEl);
+ }
+ if (!explicitClose) {
+ return;
+ }
+ switch (barType) {
+ case 'add':
+ sendPlatformMessage({
+ command: 'bgAddClose',
+ });
+ break;
+ case 'change':
+ sendPlatformMessage({
+ command: 'bgChangeClose',
+ });
+ break;
+ default:
+ break;
+ }
+ }
+ function adjustBar(data) {
+ if (data != null && data.height !== 42) {
+ const newHeight = data.height + 'px';
+ doHeightAdjustment('bit-notification-bar-iframe', newHeight);
+ doHeightAdjustment('bit-notification-bar', newHeight);
+ doHeightAdjustment('bit-notification-bar-spacer', newHeight);
+ }
+ }
+ function doHeightAdjustment(elId, heightStyle) {
+ const el = document.getElementById(elId);
+ if (el != null) {
+ el.style.height = heightStyle;
+ }
+ }
+ function sendPlatformMessage(msg) {
+ chrome.runtime.sendMessage(msg);
+ }
+});
+
+
+
+/***/ })
+
+/******/ });
\ No newline at end of file
diff --git a/src/iOS.Safari/Resources/content/shortcuts.js b/src/iOS.Safari/Resources/content/shortcuts.js
new file mode 100644
index 000000000..bb50c5c24
--- /dev/null
+++ b/src/iOS.Safari/Resources/content/shortcuts.js
@@ -0,0 +1,1216 @@
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./src/content/shortcuts.ts");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./node_modules/mousetrap/mousetrap.js":
+/*!*********************************************!*\
+ !*** ./node_modules/mousetrap/mousetrap.js ***!
+ \*********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __WEBPACK_AMD_DEFINE_RESULT__;/*global define:false */
+/**
+ * Copyright 2012-2017 Craig Campbell
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * Mousetrap is a simple keyboard shortcut library for Javascript with
+ * no external dependencies
+ *
+ * @version 1.6.5
+ * @url craig.is/killing/mice
+ */
+(function(window, document, undefined) {
+
+ // Check if mousetrap is used inside browser, if not, return
+ if (!window) {
+ return;
+ }
+
+ /**
+ * mapping of special keycodes to their corresponding keys
+ *
+ * everything in this dictionary cannot use keypress events
+ * so it has to be here to map to the correct keycodes for
+ * keyup/keydown events
+ *
+ * @type {Object}
+ */
+ var _MAP = {
+ 8: 'backspace',
+ 9: 'tab',
+ 13: 'enter',
+ 16: 'shift',
+ 17: 'ctrl',
+ 18: 'alt',
+ 20: 'capslock',
+ 27: 'esc',
+ 32: 'space',
+ 33: 'pageup',
+ 34: 'pagedown',
+ 35: 'end',
+ 36: 'home',
+ 37: 'left',
+ 38: 'up',
+ 39: 'right',
+ 40: 'down',
+ 45: 'ins',
+ 46: 'del',
+ 91: 'meta',
+ 93: 'meta',
+ 224: 'meta'
+ };
+
+ /**
+ * mapping for special characters so they can support
+ *
+ * this dictionary is only used incase you want to bind a
+ * keyup or keydown event to one of these keys
+ *
+ * @type {Object}
+ */
+ var _KEYCODE_MAP = {
+ 106: '*',
+ 107: '+',
+ 109: '-',
+ 110: '.',
+ 111 : '/',
+ 186: ';',
+ 187: '=',
+ 188: ',',
+ 189: '-',
+ 190: '.',
+ 191: '/',
+ 192: '`',
+ 219: '[',
+ 220: '\\',
+ 221: ']',
+ 222: '\''
+ };
+
+ /**
+ * this is a mapping of keys that require shift on a US keypad
+ * back to the non shift equivelents
+ *
+ * this is so you can use keyup events with these keys
+ *
+ * note that this will only work reliably on US keyboards
+ *
+ * @type {Object}
+ */
+ var _SHIFT_MAP = {
+ '~': '`',
+ '!': '1',
+ '@': '2',
+ '#': '3',
+ '$': '4',
+ '%': '5',
+ '^': '6',
+ '&': '7',
+ '*': '8',
+ '(': '9',
+ ')': '0',
+ '_': '-',
+ '+': '=',
+ ':': ';',
+ '\"': '\'',
+ '<': ',',
+ '>': '.',
+ '?': '/',
+ '|': '\\'
+ };
+
+ /**
+ * this is a list of special strings you can use to map
+ * to modifier keys when you specify your keyboard shortcuts
+ *
+ * @type {Object}
+ */
+ var _SPECIAL_ALIASES = {
+ 'option': 'alt',
+ 'command': 'meta',
+ 'return': 'enter',
+ 'escape': 'esc',
+ 'plus': '+',
+ 'mod': /Mac|iPod|iPhone|iPad/.test(navigator.platform) ? 'meta' : 'ctrl'
+ };
+
+ /**
+ * variable to store the flipped version of _MAP from above
+ * needed to check if we should use keypress or not when no action
+ * is specified
+ *
+ * @type {Object|undefined}
+ */
+ var _REVERSE_MAP;
+
+ /**
+ * loop through the f keys, f1 to f19 and add them to the map
+ * programatically
+ */
+ for (var i = 1; i < 20; ++i) {
+ _MAP[111 + i] = 'f' + i;
+ }
+
+ /**
+ * loop through to map numbers on the numeric keypad
+ */
+ for (i = 0; i <= 9; ++i) {
+
+ // This needs to use a string cause otherwise since 0 is falsey
+ // mousetrap will never fire for numpad 0 pressed as part of a keydown
+ // event.
+ //
+ // @see https://github.com/ccampbell/mousetrap/pull/258
+ _MAP[i + 96] = i.toString();
+ }
+
+ /**
+ * cross browser add event method
+ *
+ * @param {Element|HTMLDocument} object
+ * @param {string} type
+ * @param {Function} callback
+ * @returns void
+ */
+ function _addEvent(object, type, callback) {
+ if (object.addEventListener) {
+ object.addEventListener(type, callback, false);
+ return;
+ }
+
+ object.attachEvent('on' + type, callback);
+ }
+
+ /**
+ * takes the event and returns the key character
+ *
+ * @param {Event} e
+ * @return {string}
+ */
+ function _characterFromEvent(e) {
+
+ // for keypress events we should return the character as is
+ if (e.type == 'keypress') {
+ var character = String.fromCharCode(e.which);
+
+ // if the shift key is not pressed then it is safe to assume
+ // that we want the character to be lowercase. this means if
+ // you accidentally have caps lock on then your key bindings
+ // will continue to work
+ //
+ // the only side effect that might not be desired is if you
+ // bind something like 'A' cause you want to trigger an
+ // event when capital A is pressed caps lock will no longer
+ // trigger the event. shift+a will though.
+ if (!e.shiftKey) {
+ character = character.toLowerCase();
+ }
+
+ return character;
+ }
+
+ // for non keypress events the special maps are needed
+ if (_MAP[e.which]) {
+ return _MAP[e.which];
+ }
+
+ if (_KEYCODE_MAP[e.which]) {
+ return _KEYCODE_MAP[e.which];
+ }
+
+ // if it is not in the special map
+
+ // with keydown and keyup events the character seems to always
+ // come in as an uppercase character whether you are pressing shift
+ // or not. we should make sure it is always lowercase for comparisons
+ return String.fromCharCode(e.which).toLowerCase();
+ }
+
+ /**
+ * checks if two arrays are equal
+ *
+ * @param {Array} modifiers1
+ * @param {Array} modifiers2
+ * @returns {boolean}
+ */
+ function _modifiersMatch(modifiers1, modifiers2) {
+ return modifiers1.sort().join(',') === modifiers2.sort().join(',');
+ }
+
+ /**
+ * takes a key event and figures out what the modifiers are
+ *
+ * @param {Event} e
+ * @returns {Array}
+ */
+ function _eventModifiers(e) {
+ var modifiers = [];
+
+ if (e.shiftKey) {
+ modifiers.push('shift');
+ }
+
+ if (e.altKey) {
+ modifiers.push('alt');
+ }
+
+ if (e.ctrlKey) {
+ modifiers.push('ctrl');
+ }
+
+ if (e.metaKey) {
+ modifiers.push('meta');
+ }
+
+ return modifiers;
+ }
+
+ /**
+ * prevents default for this event
+ *
+ * @param {Event} e
+ * @returns void
+ */
+ function _preventDefault(e) {
+ if (e.preventDefault) {
+ e.preventDefault();
+ return;
+ }
+
+ e.returnValue = false;
+ }
+
+ /**
+ * stops propogation for this event
+ *
+ * @param {Event} e
+ * @returns void
+ */
+ function _stopPropagation(e) {
+ if (e.stopPropagation) {
+ e.stopPropagation();
+ return;
+ }
+
+ e.cancelBubble = true;
+ }
+
+ /**
+ * determines if the keycode specified is a modifier key or not
+ *
+ * @param {string} key
+ * @returns {boolean}
+ */
+ function _isModifier(key) {
+ return key == 'shift' || key == 'ctrl' || key == 'alt' || key == 'meta';
+ }
+
+ /**
+ * reverses the map lookup so that we can look for specific keys
+ * to see what can and can't use keypress
+ *
+ * @return {Object}
+ */
+ function _getReverseMap() {
+ if (!_REVERSE_MAP) {
+ _REVERSE_MAP = {};
+ for (var key in _MAP) {
+
+ // pull out the numeric keypad from here cause keypress should
+ // be able to detect the keys from the character
+ if (key > 95 && key < 112) {
+ continue;
+ }
+
+ if (_MAP.hasOwnProperty(key)) {
+ _REVERSE_MAP[_MAP[key]] = key;
+ }
+ }
+ }
+ return _REVERSE_MAP;
+ }
+
+ /**
+ * picks the best action based on the key combination
+ *
+ * @param {string} key - character for key
+ * @param {Array} modifiers
+ * @param {string=} action passed in
+ */
+ function _pickBestAction(key, modifiers, action) {
+
+ // if no action was picked in we should try to pick the one
+ // that we think would work best for this key
+ if (!action) {
+ action = _getReverseMap()[key] ? 'keydown' : 'keypress';
+ }
+
+ // modifier keys don't work as expected with keypress,
+ // switch to keydown
+ if (action == 'keypress' && modifiers.length) {
+ action = 'keydown';
+ }
+
+ return action;
+ }
+
+ /**
+ * Converts from a string key combination to an array
+ *
+ * @param {string} combination like "command+shift+l"
+ * @return {Array}
+ */
+ function _keysFromString(combination) {
+ if (combination === '+') {
+ return ['+'];
+ }
+
+ combination = combination.replace(/\+{2}/g, '+plus');
+ return combination.split('+');
+ }
+
+ /**
+ * Gets info for a specific key combination
+ *
+ * @param {string} combination key combination ("command+s" or "a" or "*")
+ * @param {string=} action
+ * @returns {Object}
+ */
+ function _getKeyInfo(combination, action) {
+ var keys;
+ var key;
+ var i;
+ var modifiers = [];
+
+ // take the keys from this pattern and figure out what the actual
+ // pattern is all about
+ keys = _keysFromString(combination);
+
+ for (i = 0; i < keys.length; ++i) {
+ key = keys[i];
+
+ // normalize key names
+ if (_SPECIAL_ALIASES[key]) {
+ key = _SPECIAL_ALIASES[key];
+ }
+
+ // if this is not a keypress event then we should
+ // be smart about using shift keys
+ // this will only work for US keyboards however
+ if (action && action != 'keypress' && _SHIFT_MAP[key]) {
+ key = _SHIFT_MAP[key];
+ modifiers.push('shift');
+ }
+
+ // if this key is a modifier then add it to the list of modifiers
+ if (_isModifier(key)) {
+ modifiers.push(key);
+ }
+ }
+
+ // depending on what the key combination is
+ // we will try to pick the best event for it
+ action = _pickBestAction(key, modifiers, action);
+
+ return {
+ key: key,
+ modifiers: modifiers,
+ action: action
+ };
+ }
+
+ function _belongsTo(element, ancestor) {
+ if (element === null || element === document) {
+ return false;
+ }
+
+ if (element === ancestor) {
+ return true;
+ }
+
+ return _belongsTo(element.parentNode, ancestor);
+ }
+
+ function Mousetrap(targetElement) {
+ var self = this;
+
+ targetElement = targetElement || document;
+
+ if (!(self instanceof Mousetrap)) {
+ return new Mousetrap(targetElement);
+ }
+
+ /**
+ * element to attach key events to
+ *
+ * @type {Element}
+ */
+ self.target = targetElement;
+
+ /**
+ * a list of all the callbacks setup via Mousetrap.bind()
+ *
+ * @type {Object}
+ */
+ self._callbacks = {};
+
+ /**
+ * direct map of string combinations to callbacks used for trigger()
+ *
+ * @type {Object}
+ */
+ self._directMap = {};
+
+ /**
+ * keeps track of what level each sequence is at since multiple
+ * sequences can start out with the same sequence
+ *
+ * @type {Object}
+ */
+ var _sequenceLevels = {};
+
+ /**
+ * variable to store the setTimeout call
+ *
+ * @type {null|number}
+ */
+ var _resetTimer;
+
+ /**
+ * temporary state where we will ignore the next keyup
+ *
+ * @type {boolean|string}
+ */
+ var _ignoreNextKeyup = false;
+
+ /**
+ * temporary state where we will ignore the next keypress
+ *
+ * @type {boolean}
+ */
+ var _ignoreNextKeypress = false;
+
+ /**
+ * are we currently inside of a sequence?
+ * type of action ("keyup" or "keydown" or "keypress") or false
+ *
+ * @type {boolean|string}
+ */
+ var _nextExpectedAction = false;
+
+ /**
+ * resets all sequence counters except for the ones passed in
+ *
+ * @param {Object} doNotReset
+ * @returns void
+ */
+ function _resetSequences(doNotReset) {
+ doNotReset = doNotReset || {};
+
+ var activeSequences = false,
+ key;
+
+ for (key in _sequenceLevels) {
+ if (doNotReset[key]) {
+ activeSequences = true;
+ continue;
+ }
+ _sequenceLevels[key] = 0;
+ }
+
+ if (!activeSequences) {
+ _nextExpectedAction = false;
+ }
+ }
+
+ /**
+ * finds all callbacks that match based on the keycode, modifiers,
+ * and action
+ *
+ * @param {string} character
+ * @param {Array} modifiers
+ * @param {Event|Object} e
+ * @param {string=} sequenceName - name of the sequence we are looking for
+ * @param {string=} combination
+ * @param {number=} level
+ * @returns {Array}
+ */
+ function _getMatches(character, modifiers, e, sequenceName, combination, level) {
+ var i;
+ var callback;
+ var matches = [];
+ var action = e.type;
+
+ // if there are no events related to this keycode
+ if (!self._callbacks[character]) {
+ return [];
+ }
+
+ // if a modifier key is coming up on its own we should allow it
+ if (action == 'keyup' && _isModifier(character)) {
+ modifiers = [character];
+ }
+
+ // loop through all callbacks for the key that was pressed
+ // and see if any of them match
+ for (i = 0; i < self._callbacks[character].length; ++i) {
+ callback = self._callbacks[character][i];
+
+ // if a sequence name is not specified, but this is a sequence at
+ // the wrong level then move onto the next match
+ if (!sequenceName && callback.seq && _sequenceLevels[callback.seq] != callback.level) {
+ continue;
+ }
+
+ // if the action we are looking for doesn't match the action we got
+ // then we should keep going
+ if (action != callback.action) {
+ continue;
+ }
+
+ // if this is a keypress event and the meta key and control key
+ // are not pressed that means that we need to only look at the
+ // character, otherwise check the modifiers as well
+ //
+ // chrome will not fire a keypress if meta or control is down
+ // safari will fire a keypress if meta or meta+shift is down
+ // firefox will fire a keypress if meta or control is down
+ if ((action == 'keypress' && !e.metaKey && !e.ctrlKey) || _modifiersMatch(modifiers, callback.modifiers)) {
+
+ // when you bind a combination or sequence a second time it
+ // should overwrite the first one. if a sequenceName or
+ // combination is specified in this call it does just that
+ //
+ // @todo make deleting its own method?
+ var deleteCombo = !sequenceName && callback.combo == combination;
+ var deleteSequence = sequenceName && callback.seq == sequenceName && callback.level == level;
+ if (deleteCombo || deleteSequence) {
+ self._callbacks[character].splice(i, 1);
+ }
+
+ matches.push(callback);
+ }
+ }
+
+ return matches;
+ }
+
+ /**
+ * actually calls the callback function
+ *
+ * if your callback function returns false this will use the jquery
+ * convention - prevent default and stop propogation on the event
+ *
+ * @param {Function} callback
+ * @param {Event} e
+ * @returns void
+ */
+ function _fireCallback(callback, e, combo, sequence) {
+
+ // if this event should not happen stop here
+ if (self.stopCallback(e, e.target || e.srcElement, combo, sequence)) {
+ return;
+ }
+
+ if (callback(e, combo) === false) {
+ _preventDefault(e);
+ _stopPropagation(e);
+ }
+ }
+
+ /**
+ * handles a character key event
+ *
+ * @param {string} character
+ * @param {Array} modifiers
+ * @param {Event} e
+ * @returns void
+ */
+ self._handleKey = function(character, modifiers, e) {
+ var callbacks = _getMatches(character, modifiers, e);
+ var i;
+ var doNotReset = {};
+ var maxLevel = 0;
+ var processedSequenceCallback = false;
+
+ // Calculate the maxLevel for sequences so we can only execute the longest callback sequence
+ for (i = 0; i < callbacks.length; ++i) {
+ if (callbacks[i].seq) {
+ maxLevel = Math.max(maxLevel, callbacks[i].level);
+ }
+ }
+
+ // loop through matching callbacks for this key event
+ for (i = 0; i < callbacks.length; ++i) {
+
+ // fire for all sequence callbacks
+ // this is because if for example you have multiple sequences
+ // bound such as "g i" and "g t" they both need to fire the
+ // callback for matching g cause otherwise you can only ever
+ // match the first one
+ if (callbacks[i].seq) {
+
+ // only fire callbacks for the maxLevel to prevent
+ // subsequences from also firing
+ //
+ // for example 'a option b' should not cause 'option b' to fire
+ // even though 'option b' is part of the other sequence
+ //
+ // any sequences that do not match here will be discarded
+ // below by the _resetSequences call
+ if (callbacks[i].level != maxLevel) {
+ continue;
+ }
+
+ processedSequenceCallback = true;
+
+ // keep a list of which sequences were matches for later
+ doNotReset[callbacks[i].seq] = 1;
+ _fireCallback(callbacks[i].callback, e, callbacks[i].combo, callbacks[i].seq);
+ continue;
+ }
+
+ // if there were no sequence matches but we are still here
+ // that means this is a regular match so we should fire that
+ if (!processedSequenceCallback) {
+ _fireCallback(callbacks[i].callback, e, callbacks[i].combo);
+ }
+ }
+
+ // if the key you pressed matches the type of sequence without
+ // being a modifier (ie "keyup" or "keypress") then we should
+ // reset all sequences that were not matched by this event
+ //
+ // this is so, for example, if you have the sequence "h a t" and you
+ // type "h e a r t" it does not match. in this case the "e" will
+ // cause the sequence to reset
+ //
+ // modifier keys are ignored because you can have a sequence
+ // that contains modifiers such as "enter ctrl+space" and in most
+ // cases the modifier key will be pressed before the next key
+ //
+ // also if you have a sequence such as "ctrl+b a" then pressing the
+ // "b" key will trigger a "keypress" and a "keydown"
+ //
+ // the "keydown" is expected when there is a modifier, but the
+ // "keypress" ends up matching the _nextExpectedAction since it occurs
+ // after and that causes the sequence to reset
+ //
+ // we ignore keypresses in a sequence that directly follow a keydown
+ // for the same character
+ var ignoreThisKeypress = e.type == 'keypress' && _ignoreNextKeypress;
+ if (e.type == _nextExpectedAction && !_isModifier(character) && !ignoreThisKeypress) {
+ _resetSequences(doNotReset);
+ }
+
+ _ignoreNextKeypress = processedSequenceCallback && e.type == 'keydown';
+ };
+
+ /**
+ * handles a keydown event
+ *
+ * @param {Event} e
+ * @returns void
+ */
+ function _handleKeyEvent(e) {
+
+ // normalize e.which for key events
+ // @see http://stackoverflow.com/questions/4285627/javascript-keycode-vs-charcode-utter-confusion
+ if (typeof e.which !== 'number') {
+ e.which = e.keyCode;
+ }
+
+ var character = _characterFromEvent(e);
+
+ // no character found then stop
+ if (!character) {
+ return;
+ }
+
+ // need to use === for the character check because the character can be 0
+ if (e.type == 'keyup' && _ignoreNextKeyup === character) {
+ _ignoreNextKeyup = false;
+ return;
+ }
+
+ self.handleKey(character, _eventModifiers(e), e);
+ }
+
+ /**
+ * called to set a 1 second timeout on the specified sequence
+ *
+ * this is so after each key press in the sequence you have 1 second
+ * to press the next key before you have to start over
+ *
+ * @returns void
+ */
+ function _resetSequenceTimer() {
+ clearTimeout(_resetTimer);
+ _resetTimer = setTimeout(_resetSequences, 1000);
+ }
+
+ /**
+ * binds a key sequence to an event
+ *
+ * @param {string} combo - combo specified in bind call
+ * @param {Array} keys
+ * @param {Function} callback
+ * @param {string=} action
+ * @returns void
+ */
+ function _bindSequence(combo, keys, callback, action) {
+
+ // start off by adding a sequence level record for this combination
+ // and setting the level to 0
+ _sequenceLevels[combo] = 0;
+
+ /**
+ * callback to increase the sequence level for this sequence and reset
+ * all other sequences that were active
+ *
+ * @param {string} nextAction
+ * @returns {Function}
+ */
+ function _increaseSequence(nextAction) {
+ return function() {
+ _nextExpectedAction = nextAction;
+ ++_sequenceLevels[combo];
+ _resetSequenceTimer();
+ };
+ }
+
+ /**
+ * wraps the specified callback inside of another function in order
+ * to reset all sequence counters as soon as this sequence is done
+ *
+ * @param {Event} e
+ * @returns void
+ */
+ function _callbackAndReset(e) {
+ _fireCallback(callback, e, combo);
+
+ // we should ignore the next key up if the action is key down
+ // or keypress. this is so if you finish a sequence and
+ // release the key the final key will not trigger a keyup
+ if (action !== 'keyup') {
+ _ignoreNextKeyup = _characterFromEvent(e);
+ }
+
+ // weird race condition if a sequence ends with the key
+ // another sequence begins with
+ setTimeout(_resetSequences, 10);
+ }
+
+ // loop through keys one at a time and bind the appropriate callback
+ // function. for any key leading up to the final one it should
+ // increase the sequence. after the final, it should reset all sequences
+ //
+ // if an action is specified in the original bind call then that will
+ // be used throughout. otherwise we will pass the action that the
+ // next key in the sequence should match. this allows a sequence
+ // to mix and match keypress and keydown events depending on which
+ // ones are better suited to the key provided
+ for (var i = 0; i < keys.length; ++i) {
+ var isFinal = i + 1 === keys.length;
+ var wrappedCallback = isFinal ? _callbackAndReset : _increaseSequence(action || _getKeyInfo(keys[i + 1]).action);
+ _bindSingle(keys[i], wrappedCallback, action, combo, i);
+ }
+ }
+
+ /**
+ * binds a single keyboard combination
+ *
+ * @param {string} combination
+ * @param {Function} callback
+ * @param {string=} action
+ * @param {string=} sequenceName - name of sequence if part of sequence
+ * @param {number=} level - what part of the sequence the command is
+ * @returns void
+ */
+ function _bindSingle(combination, callback, action, sequenceName, level) {
+
+ // store a direct mapped reference for use with Mousetrap.trigger
+ self._directMap[combination + ':' + action] = callback;
+
+ // make sure multiple spaces in a row become a single space
+ combination = combination.replace(/\s+/g, ' ');
+
+ var sequence = combination.split(' ');
+ var info;
+
+ // if this pattern is a sequence of keys then run through this method
+ // to reprocess each pattern one key at a time
+ if (sequence.length > 1) {
+ _bindSequence(combination, sequence, callback, action);
+ return;
+ }
+
+ info = _getKeyInfo(combination, action);
+
+ // make sure to initialize array if this is the first time
+ // a callback is added for this key
+ self._callbacks[info.key] = self._callbacks[info.key] || [];
+
+ // remove an existing match if there is one
+ _getMatches(info.key, info.modifiers, {type: info.action}, sequenceName, combination, level);
+
+ // add this call back to the array
+ // if it is a sequence put it at the beginning
+ // if not put it at the end
+ //
+ // this is important because the way these are processed expects
+ // the sequence ones to come first
+ self._callbacks[info.key][sequenceName ? 'unshift' : 'push']({
+ callback: callback,
+ modifiers: info.modifiers,
+ action: info.action,
+ seq: sequenceName,
+ level: level,
+ combo: combination
+ });
+ }
+
+ /**
+ * binds multiple combinations to the same callback
+ *
+ * @param {Array} combinations
+ * @param {Function} callback
+ * @param {string|undefined} action
+ * @returns void
+ */
+ self._bindMultiple = function(combinations, callback, action) {
+ for (var i = 0; i < combinations.length; ++i) {
+ _bindSingle(combinations[i], callback, action);
+ }
+ };
+
+ // start!
+ _addEvent(targetElement, 'keypress', _handleKeyEvent);
+ _addEvent(targetElement, 'keydown', _handleKeyEvent);
+ _addEvent(targetElement, 'keyup', _handleKeyEvent);
+ }
+
+ /**
+ * binds an event to mousetrap
+ *
+ * can be a single key, a combination of keys separated with +,
+ * an array of keys, or a sequence of keys separated by spaces
+ *
+ * be sure to list the modifier keys first to make sure that the
+ * correct key ends up getting bound (the last key in the pattern)
+ *
+ * @param {string|Array} keys
+ * @param {Function} callback
+ * @param {string=} action - 'keypress', 'keydown', or 'keyup'
+ * @returns void
+ */
+ Mousetrap.prototype.bind = function(keys, callback, action) {
+ var self = this;
+ keys = keys instanceof Array ? keys : [keys];
+ self._bindMultiple.call(self, keys, callback, action);
+ return self;
+ };
+
+ /**
+ * unbinds an event to mousetrap
+ *
+ * the unbinding sets the callback function of the specified key combo
+ * to an empty function and deletes the corresponding key in the
+ * _directMap dict.
+ *
+ * TODO: actually remove this from the _callbacks dictionary instead
+ * of binding an empty function
+ *
+ * the keycombo+action has to be exactly the same as
+ * it was defined in the bind method
+ *
+ * @param {string|Array} keys
+ * @param {string} action
+ * @returns void
+ */
+ Mousetrap.prototype.unbind = function(keys, action) {
+ var self = this;
+ return self.bind.call(self, keys, function() {}, action);
+ };
+
+ /**
+ * triggers an event that has already been bound
+ *
+ * @param {string} keys
+ * @param {string=} action
+ * @returns void
+ */
+ Mousetrap.prototype.trigger = function(keys, action) {
+ var self = this;
+ if (self._directMap[keys + ':' + action]) {
+ self._directMap[keys + ':' + action]({}, keys);
+ }
+ return self;
+ };
+
+ /**
+ * resets the library back to its initial state. this is useful
+ * if you want to clear out the current keyboard shortcuts and bind
+ * new ones - for example if you switch to another page
+ *
+ * @returns void
+ */
+ Mousetrap.prototype.reset = function() {
+ var self = this;
+ self._callbacks = {};
+ self._directMap = {};
+ return self;
+ };
+
+ /**
+ * should we stop this event before firing off callbacks
+ *
+ * @param {Event} e
+ * @param {Element} element
+ * @return {boolean}
+ */
+ Mousetrap.prototype.stopCallback = function(e, element) {
+ var self = this;
+
+ // if the element has the class "mousetrap" then no need to stop
+ if ((' ' + element.className + ' ').indexOf(' mousetrap ') > -1) {
+ return false;
+ }
+
+ if (_belongsTo(element, self.target)) {
+ return false;
+ }
+
+ // Events originating from a shadow DOM are re-targetted and `e.target` is the shadow host,
+ // not the initial event target in the shadow tree. Note that not all events cross the
+ // shadow boundary.
+ // For shadow trees with `mode: 'open'`, the initial event target is the first element in
+ // the event’s composed path. For shadow trees with `mode: 'closed'`, the initial event
+ // target cannot be obtained.
+ if ('composedPath' in e && typeof e.composedPath === 'function') {
+ // For open shadow trees, update `element` so that the following check works.
+ var initialEventTarget = e.composedPath()[0];
+ if (initialEventTarget !== e.target) {
+ element = initialEventTarget;
+ }
+ }
+
+ // stop for input, select, and textarea
+ return element.tagName == 'INPUT' || element.tagName == 'SELECT' || element.tagName == 'TEXTAREA' || element.isContentEditable;
+ };
+
+ /**
+ * exposes _handleKey publicly so it can be overwritten by extensions
+ */
+ Mousetrap.prototype.handleKey = function() {
+ var self = this;
+ return self._handleKey.apply(self, arguments);
+ };
+
+ /**
+ * allow custom key mappings
+ */
+ Mousetrap.addKeycodes = function(object) {
+ for (var key in object) {
+ if (object.hasOwnProperty(key)) {
+ _MAP[key] = object[key];
+ }
+ }
+ _REVERSE_MAP = null;
+ };
+
+ /**
+ * Init the global mousetrap functions
+ *
+ * This method is needed to allow the global mousetrap functions to work
+ * now that mousetrap is a constructor function.
+ */
+ Mousetrap.init = function() {
+ var documentMousetrap = Mousetrap(document);
+ for (var method in documentMousetrap) {
+ if (method.charAt(0) !== '_') {
+ Mousetrap[method] = (function(method) {
+ return function() {
+ return documentMousetrap[method].apply(documentMousetrap, arguments);
+ };
+ } (method));
+ }
+ }
+ };
+
+ Mousetrap.init();
+
+ // expose mousetrap to the global object
+ window.Mousetrap = Mousetrap;
+
+ // expose as a common js module
+ if ( true && module.exports) {
+ module.exports = Mousetrap;
+ }
+
+ // expose mousetrap as an AMD module
+ if (true) {
+ !(__WEBPACK_AMD_DEFINE_RESULT__ = (function() {
+ return Mousetrap;
+ }).call(exports, __webpack_require__, exports, module),
+ __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+ }
+}) (typeof window !== 'undefined' ? window : null, typeof window !== 'undefined' ? document : null);
+
+
+/***/ }),
+
+/***/ "./src/content/shortcuts.ts":
+/*!**********************************!*\
+ !*** ./src/content/shortcuts.ts ***!
+ \**********************************/
+/*! no exports provided */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var mousetrap__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! mousetrap */ "./node_modules/mousetrap/mousetrap.js");
+/* harmony import */ var mousetrap__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(mousetrap__WEBPACK_IMPORTED_MODULE_0__);
+
+document.addEventListener('DOMContentLoaded', event => {
+ const isSafari = (typeof safari !== 'undefined') && navigator.userAgent.indexOf(' Safari/') !== -1 &&
+ navigator.userAgent.indexOf('Chrome') === -1;
+ const isVivaldi = !isSafari && navigator.userAgent.indexOf(' Vivaldi/') !== -1;
+ if (!isSafari && !isVivaldi) {
+ return;
+ }
+ if (isSafari && window.__bitwardenFrameId == null) {
+ window.__bitwardenFrameId = Math.floor(Math.random() * Math.floor(99999999));
+ }
+ mousetrap__WEBPACK_IMPORTED_MODULE_0__["prototype"].stopCallback = () => {
+ return false;
+ };
+ let autofillCommand = ['mod+shift+l'];
+ if (isSafari) {
+ autofillCommand = ['mod+\\', 'mod+8', 'mod+shift+p'];
+ }
+ mousetrap__WEBPACK_IMPORTED_MODULE_0__["bind"](autofillCommand, () => {
+ sendMessage('autofill_login');
+ });
+ if (isSafari) {
+ mousetrap__WEBPACK_IMPORTED_MODULE_0__["bind"]('mod+shift+y', () => {
+ sendMessage('open_popup');
+ });
+ mousetrap__WEBPACK_IMPORTED_MODULE_0__["bind"]('mod+shift+s', () => {
+ sendMessage('lock_vault');
+ });
+ }
+ else {
+ mousetrap__WEBPACK_IMPORTED_MODULE_0__["bind"]('mod+shift+9', () => {
+ sendMessage('generate_password');
+ });
+ }
+ function sendMessage(shortcut) {
+ const msg = {
+ command: 'keyboardShortcutTriggered',
+ shortcut: shortcut,
+ };
+ chrome.runtime.sendMessage(msg);
+ }
+});
+
+
+/***/ })
+
+/******/ });
\ No newline at end of file
diff --git a/src/iOS.Safari/Resources/images/close.png b/src/iOS.Safari/Resources/images/close.png
new file mode 100644
index 000000000..ccbb3b1d5
Binary files /dev/null and b/src/iOS.Safari/Resources/images/close.png differ
diff --git a/src/iOS.Safari/Resources/images/icon128.png b/src/iOS.Safari/Resources/images/icon128.png
new file mode 100644
index 000000000..914b3e389
Binary files /dev/null and b/src/iOS.Safari/Resources/images/icon128.png differ
diff --git a/src/iOS.Safari/Resources/images/icon128_gray.png b/src/iOS.Safari/Resources/images/icon128_gray.png
new file mode 100644
index 000000000..4b8fb4268
Binary files /dev/null and b/src/iOS.Safari/Resources/images/icon128_gray.png differ
diff --git a/src/iOS.Safari/Resources/images/icon16.png b/src/iOS.Safari/Resources/images/icon16.png
new file mode 100644
index 000000000..3acbfd143
Binary files /dev/null and b/src/iOS.Safari/Resources/images/icon16.png differ
diff --git a/src/iOS.Safari/Resources/images/icon16_gray.png b/src/iOS.Safari/Resources/images/icon16_gray.png
new file mode 100644
index 000000000..ad9da3296
Binary files /dev/null and b/src/iOS.Safari/Resources/images/icon16_gray.png differ
diff --git a/src/iOS.Safari/Resources/images/icon18_safari.png b/src/iOS.Safari/Resources/images/icon18_safari.png
new file mode 100644
index 000000000..aaca663c9
Binary files /dev/null and b/src/iOS.Safari/Resources/images/icon18_safari.png differ
diff --git a/src/iOS.Safari/Resources/images/icon18_safari@2x.png b/src/iOS.Safari/Resources/images/icon18_safari@2x.png
new file mode 100644
index 000000000..ea812a085
Binary files /dev/null and b/src/iOS.Safari/Resources/images/icon18_safari@2x.png differ
diff --git a/src/iOS.Safari/Resources/images/icon18_safari_locked.png b/src/iOS.Safari/Resources/images/icon18_safari_locked.png
new file mode 100644
index 000000000..eeaf57334
Binary files /dev/null and b/src/iOS.Safari/Resources/images/icon18_safari_locked.png differ
diff --git a/src/iOS.Safari/Resources/images/icon18_safari_locked@2x.png b/src/iOS.Safari/Resources/images/icon18_safari_locked@2x.png
new file mode 100644
index 000000000..3c773d344
Binary files /dev/null and b/src/iOS.Safari/Resources/images/icon18_safari_locked@2x.png differ
diff --git a/src/iOS.Safari/Resources/images/icon19.png b/src/iOS.Safari/Resources/images/icon19.png
new file mode 100644
index 000000000..5bf18c7a2
Binary files /dev/null and b/src/iOS.Safari/Resources/images/icon19.png differ
diff --git a/src/iOS.Safari/Resources/images/icon19_gray.png b/src/iOS.Safari/Resources/images/icon19_gray.png
new file mode 100644
index 000000000..a6df4d7d5
Binary files /dev/null and b/src/iOS.Safari/Resources/images/icon19_gray.png differ
diff --git a/src/iOS.Safari/Resources/images/icon19_locked.png b/src/iOS.Safari/Resources/images/icon19_locked.png
new file mode 100644
index 000000000..5335a4af6
Binary files /dev/null and b/src/iOS.Safari/Resources/images/icon19_locked.png differ
diff --git a/src/iOS.Safari/Resources/images/icon32.png b/src/iOS.Safari/Resources/images/icon32.png
new file mode 100644
index 000000000..35008195d
Binary files /dev/null and b/src/iOS.Safari/Resources/images/icon32.png differ
diff --git a/src/iOS.Safari/Resources/images/icon32_gray.png b/src/iOS.Safari/Resources/images/icon32_gray.png
new file mode 100644
index 000000000..6e0c4323b
Binary files /dev/null and b/src/iOS.Safari/Resources/images/icon32_gray.png differ
diff --git a/src/iOS.Safari/Resources/images/icon38.png b/src/iOS.Safari/Resources/images/icon38.png
new file mode 100644
index 000000000..a9a8d3eda
Binary files /dev/null and b/src/iOS.Safari/Resources/images/icon38.png differ
diff --git a/src/iOS.Safari/Resources/images/icon38_gray.png b/src/iOS.Safari/Resources/images/icon38_gray.png
new file mode 100644
index 000000000..c506e6d3d
Binary files /dev/null and b/src/iOS.Safari/Resources/images/icon38_gray.png differ
diff --git a/src/iOS.Safari/Resources/images/icon38_locked.png b/src/iOS.Safari/Resources/images/icon38_locked.png
new file mode 100644
index 000000000..9b54be314
Binary files /dev/null and b/src/iOS.Safari/Resources/images/icon38_locked.png differ
diff --git a/src/iOS.Safari/Resources/images/icon48.png b/src/iOS.Safari/Resources/images/icon48.png
new file mode 100644
index 000000000..0de0da04f
Binary files /dev/null and b/src/iOS.Safari/Resources/images/icon48.png differ
diff --git a/src/iOS.Safari/Resources/images/icon48_gray.png b/src/iOS.Safari/Resources/images/icon48_gray.png
new file mode 100644
index 000000000..5f694d8c9
Binary files /dev/null and b/src/iOS.Safari/Resources/images/icon48_gray.png differ
diff --git a/src/iOS.Safari/Resources/images/icon96.png b/src/iOS.Safari/Resources/images/icon96.png
new file mode 100644
index 000000000..af7180432
Binary files /dev/null and b/src/iOS.Safari/Resources/images/icon96.png differ
diff --git a/src/iOS.Safari/Resources/images/icon96_gray.png b/src/iOS.Safari/Resources/images/icon96_gray.png
new file mode 100644
index 000000000..a1b788675
Binary files /dev/null and b/src/iOS.Safari/Resources/images/icon96_gray.png differ
diff --git a/src/iOS.Safari/Resources/manifest.json b/src/iOS.Safari/Resources/manifest.json
new file mode 100644
index 000000000..6ab212775
--- /dev/null
+++ b/src/iOS.Safari/Resources/manifest.json
@@ -0,0 +1,144 @@
+{
+ "manifest_version": 2,
+ "name": "__MSG_extName__",
+ "short_name": "__MSG_appName__",
+ "version": "1.54.0",
+ "description": "__MSG_extDesc__",
+ "default_locale": "en",
+ "author": "Bitwarden Inc.",
+ "homepage_url": "https://bitwarden.com",
+ "icons": {
+ "16": "images/icon16.png",
+ "32": "images/icon32.png",
+ "48": "images/icon48.png",
+ "96": "images/icon96.png",
+ "128": "images/icon128.png"
+ },
+ "content_scripts": [
+ {
+ "all_frames": true,
+ "js": [
+ "content/autofill.js",
+ "content/autofiller.js",
+ "content/notificationBar.js",
+ "content/contextMenuHandler.js"
+ ],
+ "matches": [
+ "http://*/*",
+ "https://*/*",
+ "file:///*"
+ ],
+ "run_at": "document_start"
+ },
+ {
+ "all_frames": false,
+ "js": [
+ "content/shortcuts.js"
+ ],
+ "matches": [
+ "http://*/*",
+ "https://*/*",
+ "file:///*"
+ ],
+ "run_at": "document_start"
+ },
+ {
+ "all_frames": false,
+ "js": [
+ "content/message_handler.js"
+ ],
+ "matches": [
+ "http://*/*",
+ "https://*/*",
+ "file:///*"
+ ],
+ "run_at": "document_start"
+ },
+ {
+ "all_frames": true,
+ "css": [
+ "content/autofill.css"
+ ],
+ "matches": [
+ "http://*/*",
+ "https://*/*",
+ "file:///*"
+ ],
+ "run_at": "document_end"
+ }
+ ],
+ "background": {
+ "page": "background.html",
+ "persistent": false
+ },
+ "browser_action": {
+ "default_icon": {
+ "19": "images/icon19.png",
+ "38": "images/icon38.png"
+ },
+ "default_title": "Bitwarden",
+ "default_popup": "popup/index.html"
+ },
+ "permissions": [
+ "tabs",
+ "contextMenus",
+ "storage",
+ "unlimitedStorage",
+ "clipboardRead",
+ "clipboardWrite",
+ "idle",
+ "http://*/*",
+ "https://*/*",
+ "webRequestBlocking",
+ "nativeMessaging"
+ ],
+ "content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self'",
+ "commands": {
+ "_execute_browser_action": {
+ "suggested_key": {
+ "default": "Ctrl+Shift+Y",
+ "linux": "Ctrl+Shift+U"
+ },
+ "description": "__MSG_commandOpenPopup__"
+ },
+ "_execute_sidebar_action": {
+ "suggested_key": {
+ "default": "Alt+Shift+Y",
+ "linux": "Alt+Shift+U"
+ },
+ "description": "__MSG_commandOpenSidebar__"
+ },
+ "autofill_login": {
+ "suggested_key": {
+ "default": "Ctrl+Shift+L"
+ },
+ "description": "__MSG_commandAutofillDesc__"
+ },
+ "generate_password": {
+ "suggested_key": {
+ "default": "Ctrl+Shift+9"
+ },
+ "description": "__MSG_commandGeneratePasswordDesc__"
+ },
+ "lock_vault": {
+ "description": "__MSG_commandLockVaultDesc__"
+ }
+ },
+ "web_accessible_resources": [
+ "notification/bar.html",
+ "images/icon38.png",
+ "images/icon38_locked.png",
+ "images/close.png"
+ ],
+ "applications": {
+ "gecko": {
+ "id": "{446900e4-71c2-419f-a6a7-df9c091e268b}",
+ "strict_min_version": "42.0"
+ }
+ },
+ "sidebar_action": {
+ "default_title": "Bitwarden",
+ "default_panel": "popup/index.html?uilocation=sidebar",
+ "default_icon": "images/icon19.png"
+ }
+}
diff --git a/src/iOS.Safari/Resources/notification/bar.css b/src/iOS.Safari/Resources/notification/bar.css
new file mode 100644
index 000000000..769dc4522
--- /dev/null
+++ b/src/iOS.Safari/Resources/notification/bar.css
@@ -0,0 +1,92 @@
+body {
+ background-color: #ffffff;
+ padding: 0;
+ margin: 0;
+ height: 100%;
+ font-size: 14px;
+ line-height: 16px;
+ color: #333333;
+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+}
+
+.outer-wrapper {
+ padding: 0 10px;
+ border-bottom: 2px solid #175ddc;
+ display: grid;
+ grid-template-columns: 24px auto 55px;
+ grid-column-gap: 10px;
+ box-sizing: border-box;
+ min-height: 42px;
+}
+
+.inner-wrapper {
+ display: grid;
+ grid-template-columns: auto max-content;
+}
+
+.outer-wrapper > *, .inner-wrapper > * {
+ align-self: center;
+}
+
+img {
+ border: 0;
+ margin: 0;
+ padding: 0;
+}
+
+#logo {
+ width: 24px;
+ height: 24px;
+ display: block;
+}
+
+#close {
+ width: 15px;
+ height: 15px;
+ display: block;
+ padding: 5px 0;
+ margin-right: 10px;
+}
+
+button:not(.link),
+button:not(.neutral) {
+ background-color: #175DDC;
+ padding: 5px 15px;
+ border-radius: 3px;
+ color: #ffffff;
+ border: 0;
+}
+button:not(.link):hover,
+button:not(.neutral):hover {
+ cursor: pointer;
+ background-color: #1751bd;
+}
+
+button.link,
+button.neutral {
+ background: none;
+ padding: 5px 15px;
+ color: #175DDC;
+ border: 0;
+}
+button.link:hover,
+button.neutral:hover {
+ cursor: pointer;
+ background: none;
+ text-decoration: underline;
+}
+
+.select-folder[isVaultLocked=true] {
+ display: none;
+}
+
+@media screen and (max-width: 768px) {
+ .select-folder {
+ display: none;
+ }
+}
+@media (print) {
+ body {
+ display: none;
+ }
+}
diff --git a/src/iOS.Safari/Resources/notification/bar.html b/src/iOS.Safari/Resources/notification/bar.html
new file mode 100644
index 000000000..523aaf65a
--- /dev/null
+++ b/src/iOS.Safari/Resources/notification/bar.html
@@ -0,0 +1,41 @@
+
+
+
+
+ Bitwarden
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/iOS.Safari/Resources/notification/bar.js b/src/iOS.Safari/Resources/notification/bar.js
new file mode 100644
index 000000000..9883163db
--- /dev/null
+++ b/src/iOS.Safari/Resources/notification/bar.js
@@ -0,0 +1,273 @@
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./src/notification/bar.js");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./src/notification/bar.js":
+/*!*********************************!*\
+ !*** ./src/notification/bar.js ***!
+ \*********************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+__webpack_require__(/*! ./bar.scss */ "./src/notification/bar.scss");
+
+document.addEventListener('DOMContentLoaded', () => {
+ var i18n = {};
+ var lang = window.navigator.language;
+
+ i18n.appName = chrome.i18n.getMessage('appName');
+ i18n.close = chrome.i18n.getMessage('close');
+ i18n.never = chrome.i18n.getMessage('never');
+ i18n.folder = chrome.i18n.getMessage('folder');
+ i18n.notificationAddSave = chrome.i18n.getMessage('notificationAddSave');
+ i18n.notificationAddDesc = chrome.i18n.getMessage('notificationAddDesc');
+ i18n.notificationChangeSave = chrome.i18n.getMessage('notificationChangeSave');
+ i18n.notificationChangeDesc = chrome.i18n.getMessage('notificationChangeDesc');
+ lang = chrome.i18n.getUILanguage();
+
+ // delay 50ms so that we get proper body dimensions
+ setTimeout(load, 50);
+
+ function load() {
+ const isVaultLocked = getQueryVariable('isVaultLocked') == 'true';
+ document.getElementById('logo').src = isVaultLocked
+ ? chrome.runtime.getURL('images/icon38_locked.png')
+ : chrome.runtime.getURL('images/icon38.png');
+
+ document.getElementById('logo-link').title = i18n.appName;
+
+ var neverButton = document.querySelector('#template-add .never-save');
+ neverButton.textContent = i18n.never;
+
+ var selectFolder = document.querySelector('#template-add .select-folder');
+ selectFolder.setAttribute('aria-label', i18n.folder);
+ selectFolder.setAttribute('isVaultLocked', isVaultLocked.toString());
+
+ var addButton = document.querySelector('#template-add .add-save');
+ addButton.textContent = i18n.notificationAddSave;
+
+ var changeButton = document.querySelector('#template-change .change-save');
+ changeButton.textContent = i18n.notificationChangeSave;
+
+ var closeIcon = document.getElementById('close');
+ closeIcon.src = chrome.runtime.getURL('images/close.png');
+ closeIcon.alt = i18n.close;
+
+ var closeButton = document.getElementById('close-button')
+ closeButton.title = i18n.close;
+ closeButton.setAttribute('aria-label', i18n.close);
+
+ document.querySelector('#template-add .add-text').textContent = i18n.notificationAddDesc;
+ document.querySelector('#template-change .change-text').textContent = i18n.notificationChangeDesc;
+
+ if (getQueryVariable('add')) {
+ setContent(document.getElementById('template-add'));
+
+ var addButton = document.querySelector('#template-add-clone .add-save'),
+ neverButton = document.querySelector('#template-add-clone .never-save');
+
+ addButton.addEventListener('click', (e) => {
+ e.preventDefault();
+
+ const folderId = document.querySelector('#template-add-clone .select-folder').value;
+
+ const bgAddSaveMessage = {
+ command: 'bgAddSave',
+ folder: folderId,
+ };
+ sendPlatformMessage(bgAddSaveMessage);
+ });
+
+ neverButton.addEventListener('click', (e) => {
+ e.preventDefault();
+ sendPlatformMessage({
+ command: 'bgNeverSave'
+ });
+ });
+
+ if (!isVaultLocked) {
+ const responseFoldersCommand = 'notificationBarGetFoldersList';
+ chrome.runtime.onMessage.addListener((msg) => {
+ if (msg.command === responseFoldersCommand && msg.data) {
+ fillSelectorWithFolders(msg.data.folders);
+ }
+ });
+ sendPlatformMessage({
+ command: 'bgGetDataForTab',
+ responseCommand: responseFoldersCommand
+ });
+ }
+ } else if (getQueryVariable('change')) {
+ setContent(document.getElementById('template-change'));
+ var changeButton = document.querySelector('#template-change-clone .change-save');
+ changeButton.addEventListener('click', (e) => {
+ e.preventDefault();
+
+ const bgChangeSaveMessage = {
+ command: 'bgChangeSave'
+ };
+ sendPlatformMessage(bgChangeSaveMessage);
+ });
+ }
+
+ closeButton.addEventListener('click', (e) => {
+ e.preventDefault();
+ sendPlatformMessage({
+ command: 'bgCloseNotificationBar'
+ });
+ });
+
+ window.addEventListener("resize", adjustHeight);
+ adjustHeight();
+ }
+
+ function getQueryVariable(variable) {
+ var query = window.location.search.substring(1);
+ var vars = query.split('&');
+
+ for (var i = 0; i < vars.length; i++) {
+ var pair = vars[i].split('=');
+ if (pair[0] === variable) {
+ return pair[1];
+ }
+ }
+
+ return null;
+ }
+
+ function setContent(element) {
+ const content = document.getElementById('content');
+ while (content.firstChild) {
+ content.removeChild(content.firstChild);
+ }
+
+ var newElement = element.cloneNode(true);
+ newElement.id = newElement.id + '-clone';
+ content.appendChild(newElement);
+ }
+
+ function sendPlatformMessage(msg) {
+ chrome.runtime.sendMessage(msg);
+ }
+
+ function fillSelectorWithFolders(folders) {
+ const select = document.querySelector('#template-add-clone .select-folder');
+ select.appendChild(new Option(chrome.i18n.getMessage('selectFolder'), null, true));
+ folders.forEach((folder) => {
+ //Select "No Folder" (id=null) folder by default
+ select.appendChild(new Option(folder.name, folder.id || '', false));
+ });
+ }
+
+ function adjustHeight() {
+ sendPlatformMessage({
+ command: 'bgAdjustNotificationBar',
+ data: {
+ height: document.querySelector('body').scrollHeight
+ }
+ });
+ }
+});
+
+
+/***/ }),
+
+/***/ "./src/notification/bar.scss":
+/*!***********************************!*\
+ !*** ./src/notification/bar.scss ***!
+ \***********************************/
+/*! no exports provided */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+// extracted by mini-css-extract-plugin
+
+
+/***/ })
+
+/******/ });
\ No newline at end of file
diff --git a/src/iOS.Safari/Resources/popup/fonts/Open_Sans-italic-300.woff b/src/iOS.Safari/Resources/popup/fonts/Open_Sans-italic-300.woff
new file mode 100644
index 000000000..8f8e97cfe
Binary files /dev/null and b/src/iOS.Safari/Resources/popup/fonts/Open_Sans-italic-300.woff differ
diff --git a/src/iOS.Safari/Resources/popup/fonts/Open_Sans-italic-400.woff b/src/iOS.Safari/Resources/popup/fonts/Open_Sans-italic-400.woff
new file mode 100644
index 000000000..f90b99608
Binary files /dev/null and b/src/iOS.Safari/Resources/popup/fonts/Open_Sans-italic-400.woff differ
diff --git a/src/iOS.Safari/Resources/popup/fonts/Open_Sans-italic-600.woff b/src/iOS.Safari/Resources/popup/fonts/Open_Sans-italic-600.woff
new file mode 100644
index 000000000..c262a9c88
Binary files /dev/null and b/src/iOS.Safari/Resources/popup/fonts/Open_Sans-italic-600.woff differ
diff --git a/src/iOS.Safari/Resources/popup/fonts/Open_Sans-italic-700.woff b/src/iOS.Safari/Resources/popup/fonts/Open_Sans-italic-700.woff
new file mode 100644
index 000000000..8526ac3d1
Binary files /dev/null and b/src/iOS.Safari/Resources/popup/fonts/Open_Sans-italic-700.woff differ
diff --git a/src/iOS.Safari/Resources/popup/fonts/Open_Sans-italic-800.woff b/src/iOS.Safari/Resources/popup/fonts/Open_Sans-italic-800.woff
new file mode 100644
index 000000000..c389a1256
Binary files /dev/null and b/src/iOS.Safari/Resources/popup/fonts/Open_Sans-italic-800.woff differ
diff --git a/src/iOS.Safari/Resources/popup/fonts/Open_Sans-normal-300.woff b/src/iOS.Safari/Resources/popup/fonts/Open_Sans-normal-300.woff
new file mode 100644
index 000000000..9f56d335b
Binary files /dev/null and b/src/iOS.Safari/Resources/popup/fonts/Open_Sans-normal-300.woff differ
diff --git a/src/iOS.Safari/Resources/popup/fonts/Open_Sans-normal-400.woff b/src/iOS.Safari/Resources/popup/fonts/Open_Sans-normal-400.woff
new file mode 100644
index 000000000..153a1d63a
Binary files /dev/null and b/src/iOS.Safari/Resources/popup/fonts/Open_Sans-normal-400.woff differ
diff --git a/src/iOS.Safari/Resources/popup/fonts/Open_Sans-normal-600.woff b/src/iOS.Safari/Resources/popup/fonts/Open_Sans-normal-600.woff
new file mode 100644
index 000000000..8271bb4a7
Binary files /dev/null and b/src/iOS.Safari/Resources/popup/fonts/Open_Sans-normal-600.woff differ
diff --git a/src/iOS.Safari/Resources/popup/fonts/Open_Sans-normal-700.woff b/src/iOS.Safari/Resources/popup/fonts/Open_Sans-normal-700.woff
new file mode 100644
index 000000000..101c0be6e
Binary files /dev/null and b/src/iOS.Safari/Resources/popup/fonts/Open_Sans-normal-700.woff differ
diff --git a/src/iOS.Safari/Resources/popup/fonts/Open_Sans-normal-800.woff b/src/iOS.Safari/Resources/popup/fonts/Open_Sans-normal-800.woff
new file mode 100644
index 000000000..724c2e64b
Binary files /dev/null and b/src/iOS.Safari/Resources/popup/fonts/Open_Sans-normal-800.woff differ
diff --git a/src/iOS.Safari/Resources/popup/fonts/fontawesome-webfont.eot b/src/iOS.Safari/Resources/popup/fonts/fontawesome-webfont.eot
new file mode 100644
index 000000000..e9f60ca95
Binary files /dev/null and b/src/iOS.Safari/Resources/popup/fonts/fontawesome-webfont.eot differ
diff --git a/src/iOS.Safari/Resources/popup/fonts/fontawesome-webfont.svg b/src/iOS.Safari/Resources/popup/fonts/fontawesome-webfont.svg
new file mode 100644
index 000000000..855c845e5
--- /dev/null
+++ b/src/iOS.Safari/Resources/popup/fonts/fontawesome-webfont.svg
@@ -0,0 +1,2671 @@
+
+
+
diff --git a/src/iOS.Safari/Resources/popup/fonts/fontawesome-webfont.ttf b/src/iOS.Safari/Resources/popup/fonts/fontawesome-webfont.ttf
new file mode 100644
index 000000000..35acda2fa
Binary files /dev/null and b/src/iOS.Safari/Resources/popup/fonts/fontawesome-webfont.ttf differ
diff --git a/src/iOS.Safari/Resources/popup/fonts/fontawesome-webfont.woff b/src/iOS.Safari/Resources/popup/fonts/fontawesome-webfont.woff
new file mode 100644
index 000000000..400014a4b
Binary files /dev/null and b/src/iOS.Safari/Resources/popup/fonts/fontawesome-webfont.woff differ
diff --git a/src/iOS.Safari/Resources/popup/fonts/fontawesome-webfont.woff2 b/src/iOS.Safari/Resources/popup/fonts/fontawesome-webfont.woff2
new file mode 100644
index 000000000..4d13fc604
Binary files /dev/null and b/src/iOS.Safari/Resources/popup/fonts/fontawesome-webfont.woff2 differ
diff --git a/src/iOS.Safari/Resources/popup/images/fa-globe.png b/src/iOS.Safari/Resources/popup/images/fa-globe.png
new file mode 100644
index 000000000..7ba709fd1
Binary files /dev/null and b/src/iOS.Safari/Resources/popup/images/fa-globe.png differ
diff --git a/src/iOS.Safari/Resources/popup/images/loading.svg b/src/iOS.Safari/Resources/popup/images/loading.svg
new file mode 100644
index 000000000..707631051
--- /dev/null
+++ b/src/iOS.Safari/Resources/popup/images/loading.svg
@@ -0,0 +1,6 @@
+
diff --git a/src/iOS.Safari/Resources/popup/images/logo-dark@2x.png b/src/iOS.Safari/Resources/popup/images/logo-dark@2x.png
new file mode 100644
index 000000000..3fc3c6d7a
Binary files /dev/null and b/src/iOS.Safari/Resources/popup/images/logo-dark@2x.png differ
diff --git a/src/iOS.Safari/Resources/popup/images/logo-white@2x.png b/src/iOS.Safari/Resources/popup/images/logo-white@2x.png
new file mode 100644
index 000000000..519cbc75e
Binary files /dev/null and b/src/iOS.Safari/Resources/popup/images/logo-white@2x.png differ
diff --git a/src/iOS.Safari/Resources/popup/images/u2fkey.jpg b/src/iOS.Safari/Resources/popup/images/u2fkey.jpg
new file mode 100644
index 000000000..8013df0e5
Binary files /dev/null and b/src/iOS.Safari/Resources/popup/images/u2fkey.jpg differ
diff --git a/src/iOS.Safari/Resources/popup/images/yubikey.jpg b/src/iOS.Safari/Resources/popup/images/yubikey.jpg
new file mode 100644
index 000000000..9ddf755de
Binary files /dev/null and b/src/iOS.Safari/Resources/popup/images/yubikey.jpg differ
diff --git a/src/iOS.Safari/Resources/popup/index.html b/src/iOS.Safari/Resources/popup/index.html
new file mode 100644
index 000000000..9141f6b8e
--- /dev/null
+++ b/src/iOS.Safari/Resources/popup/index.html
@@ -0,0 +1,14 @@
+
+
+
+
+
+ Bitwarden
+
+
+
+
+
+
+
+
diff --git a/src/iOS.Safari/Resources/popup/main.css b/src/iOS.Safari/Resources/popup/main.css
new file mode 100644
index 000000000..5d6320e7f
--- /dev/null
+++ b/src/iOS.Safari/Resources/popup/main.css
@@ -0,0 +1,7380 @@
+@font-face {
+ font-family: 'Open Sans';
+ font-style: italic;
+ font-weight: 300;
+ font-display: auto;
+ src: url(./fonts/Open_Sans-italic-300.woff) format('woff');
+ unicode-range: U+0-10FFFF;
+}
+
+@font-face {
+ font-family: 'Open Sans';
+ font-style: italic;
+ font-weight: 400;
+ font-display: auto;
+ src: url(./fonts/Open_Sans-italic-400.woff) format('woff');
+ unicode-range: U+0-10FFFF;
+}
+
+@font-face {
+ font-family: 'Open Sans';
+ font-style: italic;
+ font-weight: 600;
+ font-display: auto;
+ src: url(./fonts/Open_Sans-italic-600.woff) format('woff');
+ unicode-range: U+0-10FFFF;
+}
+
+@font-face {
+ font-family: 'Open Sans';
+ font-style: italic;
+ font-weight: 700;
+ font-display: auto;
+ src: url(./fonts/Open_Sans-italic-700.woff) format('woff');
+ unicode-range: U+0-10FFFF;
+}
+
+@font-face {
+ font-family: 'Open Sans';
+ font-style: italic;
+ font-weight: 800;
+ font-display: auto;
+ src: url(./fonts/Open_Sans-italic-800.woff) format('woff');
+ unicode-range: U+0-10FFFF;
+}
+
+@font-face {
+ font-family: 'Open Sans';
+ font-style: normal;
+ font-weight: 300;
+ font-display: auto;
+ src: url(./fonts/Open_Sans-normal-300.woff) format('woff');
+ unicode-range: U+0-10FFFF;
+}
+
+@font-face {
+ font-family: 'Open Sans';
+ font-style: normal;
+ font-weight: 400;
+ font-display: auto;
+ src: url(./fonts/Open_Sans-normal-400.woff) format('woff');
+ unicode-range: U+0-10FFFF;
+}
+
+@font-face {
+ font-family: 'Open Sans';
+ font-style: normal;
+ font-weight: 600;
+ font-display: auto;
+ src: url(./fonts/Open_Sans-normal-600.woff) format('woff');
+ unicode-range: U+0-10FFFF;
+}
+
+@font-face {
+ font-family: 'Open Sans';
+ font-style: normal;
+ font-weight: 700;
+ font-display: auto;
+ src: url(./fonts/Open_Sans-normal-700.woff) format('woff');
+ unicode-range: U+0-10FFFF;
+}
+
+@font-face {
+ font-family: 'Open Sans';
+ font-style: normal;
+ font-weight: 800;
+ font-display: auto;
+ src: url(./fonts/Open_Sans-normal-800.woff) format('woff');
+ unicode-range: U+0-10FFFF;
+}
+
+
+* {
+ box-sizing: border-box;
+ padding: 0;
+ margin: 0;
+}
+
+html, body {
+ font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;
+ font-size: 14px;
+ line-height: 1.42857143;
+ -webkit-font-smoothing: antialiased;
+}
+
+body {
+ width: 375px !important;
+ height: 600px !important;
+ overflow: hidden;
+ color: #000000;
+ background-color: #f0f0f0;
+}
+html.theme_light body {
+ color: #000000;
+ background-color: #f0f0f0;
+}
+html.theme_dark body {
+ color: #ffffff;
+ background-color: #222222;
+}
+html.theme_nord body {
+ color: #E5E9F0;
+ background-color: #3B4252;
+}
+html.theme_solarizedDark body {
+ color: #eee8d5;
+ background-color: #002b36;
+}
+body.body-sm {
+ width: 375px !important;
+ height: 500px !important;
+}
+body.body-xs {
+ width: 375px !important;
+ height: 300px !important;
+}
+body.body-full {
+ width: 100% !important;
+ height: 100% !important;
+}
+
+h1, h2, h3, h4, h5, h6 {
+ font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;
+}
+html.theme_light h1, html.theme_light h2, html.theme_light h3, html.theme_light h4, html.theme_light h5, html.theme_light h6 {
+ color: #000000;
+}
+html.theme_dark h1, html.theme_dark h2, html.theme_dark h3, html.theme_dark h4, html.theme_dark h5, html.theme_dark h6 {
+ color: #ffffff;
+}
+html.theme_nord h1, html.theme_nord h2, html.theme_nord h3, html.theme_nord h4, html.theme_nord h5, html.theme_nord h6 {
+ color: #E5E9F0;
+}
+html.theme_solarizedDark h1, html.theme_solarizedDark h2, html.theme_solarizedDark h3, html.theme_solarizedDark h4, html.theme_solarizedDark h5, html.theme_solarizedDark h6 {
+ color: #eee8d5;
+}
+
+p {
+ margin-bottom: 10px;
+}
+
+ul, ol {
+ margin-bottom: 10px;
+}
+
+img {
+ border: none;
+}
+
+a {
+ text-decoration: none;
+}
+html.theme_light a {
+ color: #175DDC;
+}
+html.theme_dark a {
+ color: #52bdfb;
+}
+html.theme_nord a {
+ color: #81A1C1;
+}
+html.theme_solarizedDark a {
+ color: #859900;
+}
+html.theme_light a:hover, html.theme_light a:focus {
+ color: #1451c0;
+}
+html.theme_dark a:hover, html.theme_dark a:focus {
+ color: #34b2fa;
+}
+html.theme_nord a:hover, html.theme_nord a:focus {
+ color: #6c92b7;
+}
+html.theme_solarizedDark a:hover, html.theme_solarizedDark a:focus {
+ color: #6a7a00;
+}
+
+html.theme_light input, html.theme_light select, html.theme_light textarea {
+ color: #000000;
+ background-color: #ffffff;
+}
+html.theme_dark input, html.theme_dark select, html.theme_dark textarea {
+ color: #ffffff;
+ background-color: #363636;
+}
+html.theme_nord input, html.theme_nord select, html.theme_nord textarea {
+ color: #E5E9F0;
+ background-color: #434C5E;
+}
+html.theme_solarizedDark input, html.theme_solarizedDark select, html.theme_solarizedDark textarea {
+ color: #eee8d5;
+ background-color: #586e75;
+}
+
+input, select, textarea, button {
+ font-size: 14px;
+ font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;
+}
+
+button {
+ white-space: nowrap;
+ cursor: pointer;
+}
+
+textarea {
+ resize: vertical;
+}
+
+main {
+ height: 100%;
+}
+
+content::-webkit-scrollbar, cdk-virtual-scroll-viewport::-webkit-scrollbar {
+ width: 10px;
+ height: 10px;
+}
+
+content::-webkit-scrollbar-track {
+ background-color: transparent;
+}
+
+html.theme_light cdk-virtual-scroll-viewport::-webkit-scrollbar-track {
+ background-color: #f0f0f0;
+}
+html.theme_dark cdk-virtual-scroll-viewport::-webkit-scrollbar-track {
+ background-color: #222222;
+}
+html.theme_nord cdk-virtual-scroll-viewport::-webkit-scrollbar-track {
+ background-color: #3B4252;
+}
+html.theme_solarizedDark cdk-virtual-scroll-viewport::-webkit-scrollbar-track {
+ background-color: #002b36;
+}
+
+content::-webkit-scrollbar-thumb, cdk-virtual-scroll-viewport::-webkit-scrollbar-thumb {
+ border-radius: 10px;
+ margin-right: 1px;
+}
+html.theme_light content::-webkit-scrollbar-thumb, html.theme_light cdk-virtual-scroll-viewport::-webkit-scrollbar-thumb {
+ background-color: rgba(100, 100, 100, 0.2);
+}
+html.theme_dark content::-webkit-scrollbar-thumb, html.theme_dark cdk-virtual-scroll-viewport::-webkit-scrollbar-thumb {
+ background-color: #4d4d4d;
+}
+html.theme_nord content::-webkit-scrollbar-thumb, html.theme_nord cdk-virtual-scroll-viewport::-webkit-scrollbar-thumb {
+ background-color: #D8DEE9;
+}
+html.theme_solarizedDark content::-webkit-scrollbar-thumb, html.theme_solarizedDark cdk-virtual-scroll-viewport::-webkit-scrollbar-thumb {
+ background-color: #839496;
+}
+html.theme_light content::-webkit-scrollbar-thumb:hover, html.theme_light cdk-virtual-scroll-viewport::-webkit-scrollbar-thumb:hover {
+ background-color: rgba(100, 100, 100, 0.4);
+}
+html.theme_dark content::-webkit-scrollbar-thumb:hover, html.theme_dark cdk-virtual-scroll-viewport::-webkit-scrollbar-thumb:hover {
+ background-color: #5f5f5f;
+}
+html.theme_nord content::-webkit-scrollbar-thumb:hover, html.theme_nord cdk-virtual-scroll-viewport::-webkit-scrollbar-thumb:hover {
+ background-color: #ECEFF4;
+}
+html.theme_solarizedDark content::-webkit-scrollbar-thumb:hover, html.theme_solarizedDark cdk-virtual-scroll-viewport::-webkit-scrollbar-thumb:hover {
+ background-color: #eee8d5;
+}
+
+header {
+ min-height: 44px;
+ max-height: 44px;
+ display: flex;
+ border-bottom: 1px solid #000000;
+}
+html.theme_light header {
+ color: #ffffff;
+ background-color: #175DDC;
+ border-bottom-color: #175DDC;
+}
+html.theme_dark header {
+ color: #ffffff;
+ background-color: #363636;
+ border-bottom-color: #111111;
+}
+html.theme_nord header {
+ color: #E5E9F0;
+ background-color: #3B4252;
+ border-bottom-color: #2E3440;
+}
+html.theme_solarizedDark header {
+ color: #93a1a1;
+ background-color: #073642;
+ border-bottom-color: #002b36;
+}
+header .left, header .right {
+ flex: 1;
+ display: flex;
+ min-width: -webkit-min-content;
+ /* Workaround to Chrome bug */
+}
+header .left .header-icon, header .right .header-icon {
+ margin-right: 5px;
+}
+header .right {
+ justify-content: flex-end;
+}
+header .center {
+ display: flex;
+ align-items: center;
+ text-align: center;
+ min-width: 0;
+}
+header app-pop-out > button, header div > button, header div > a {
+ border: none;
+ padding: 0 10px;
+ text-decoration: none;
+ display: flex;
+ flex-direction: row;
+ justify-content: center;
+ align-items: center;
+}
+html.theme_light header app-pop-out > button, html.theme_light header div > button, html.theme_light header div > a {
+ color: #ffffff;
+ background-color: #175DDC;
+}
+html.theme_dark header app-pop-out > button, html.theme_dark header div > button, html.theme_dark header div > a {
+ color: #ffffff;
+ background-color: #363636;
+}
+html.theme_nord header app-pop-out > button, html.theme_nord header div > button, html.theme_nord header div > a {
+ color: #E5E9F0;
+ background-color: #3B4252;
+}
+html.theme_solarizedDark header app-pop-out > button, html.theme_solarizedDark header div > button, html.theme_solarizedDark header div > a {
+ color: #93a1a1;
+ background-color: #073642;
+}
+html.theme_light header app-pop-out > button:hover, html.theme_light header app-pop-out > button:focus, html.theme_light header div > button:hover, html.theme_light header div > button:focus, html.theme_light header div > a:hover, html.theme_light header div > a:focus {
+ background-color: rgba(255, 255, 255, 0.1);
+ color: #ffffff;
+}
+html.theme_dark header app-pop-out > button:hover, html.theme_dark header app-pop-out > button:focus, html.theme_dark header div > button:hover, html.theme_dark header div > button:focus, html.theme_dark header div > a:hover, html.theme_dark header div > a:focus {
+ background-color: #3f3f3f;
+ color: #ffffff;
+}
+html.theme_nord header app-pop-out > button:hover, html.theme_nord header app-pop-out > button:focus, html.theme_nord header div > button:hover, html.theme_nord header div > button:focus, html.theme_nord header div > a:hover, html.theme_nord header div > a:focus {
+ background-color: #434C5E;
+ color: #E5E9F0;
+}
+html.theme_solarizedDark header app-pop-out > button:hover, html.theme_solarizedDark header app-pop-out > button:focus, html.theme_solarizedDark header div > button:hover, html.theme_solarizedDark header div > button:focus, html.theme_solarizedDark header div > a:hover, html.theme_solarizedDark header div > a:focus {
+ background-color: #586e75;
+ color: #93a1a1;
+}
+header app-pop-out > button:focus, header div > button:focus, header div > a:focus {
+ text-decoration: underline;
+}
+header app-pop-out > button[disabled], header div > button[disabled], header div > a[disabled] {
+ opacity: 0.65;
+ cursor: default !important;
+}
+header app-pop-out > button i + span, header div > button i + span, header div > a i + span {
+ margin-left: 5px;
+}
+header app-pop-out {
+ display: flex;
+}
+header .title {
+ font-weight: bold;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+header .search {
+ padding: 7px 10px;
+ width: 100%;
+ text-align: left;
+ position: relative;
+ display: flex;
+}
+header .search .fa {
+ position: absolute;
+ top: 15px;
+ left: 20px;
+}
+html.theme_light header .search .fa {
+ color: #afc8f7;
+}
+html.theme_dark header .search .fa {
+ color: #707070;
+}
+html.theme_nord header .search .fa {
+ color: #4C566A;
+}
+html.theme_solarizedDark header .search .fa {
+ color: #657b83;
+}
+header .search input {
+ width: 100%;
+ margin: 0;
+ border: none;
+ padding: 5px 10px 5px 30px;
+ border-radius: 3px;
+}
+html.theme_light header .search input {
+ background-color: #134db7;
+ color: #ffffff;
+}
+html.theme_dark header .search input {
+ background-color: #222222;
+ color: #ffffff;
+}
+html.theme_nord header .search input {
+ background-color: #ECEFF4;
+ color: #434C5E;
+}
+html.theme_solarizedDark header .search input {
+ background-color: #eee8d5;
+ color: #586e75;
+}
+header .search input:focus {
+ border-radius: 3px;
+ outline: none;
+}
+html.theme_light header .search input:focus {
+ background-color: #1249ae;
+}
+html.theme_dark header .search input:focus {
+ background-color: #1d1d1d;
+}
+html.theme_nord header .search input:focus {
+ background-color: #E5E9F0;
+}
+html.theme_solarizedDark header .search input:focus {
+ background-color: #93a1a1;
+}
+html.theme_light header .search input::-webkit-input-placeholder {
+ color: #afc8f7;
+}
+html.theme_dark header .search input::-webkit-input-placeholder {
+ color: #707070;
+}
+html.theme_nord header .search input::-webkit-input-placeholder {
+ color: #4C566A;
+}
+html.theme_solarizedDark header .search input::-webkit-input-placeholder {
+ color: #657b83;
+}
+header .left + .search {
+ padding-left: 0;
+}
+header .left + .search .fa {
+ left: 10px;
+}
+header .search + .right {
+ margin-left: -10px;
+}
+
+.content {
+ padding: 15px;
+}
+
+.tabs {
+ width: 100%;
+ height: 55px;
+ border-top: 1px solid #000000;
+ position: absolute;
+ bottom: 0;
+ left: 0;
+ right: 0;
+ overflow: hidden;
+}
+html.theme_light .tabs {
+ background-color: #ffffff;
+ border-top-color: #ddd;
+}
+html.theme_dark .tabs {
+ background-color: #363636;
+ border-top-color: #111111;
+}
+html.theme_nord .tabs {
+ background-color: #3B4252;
+ border-top-color: #2E3440;
+}
+html.theme_solarizedDark .tabs {
+ background-color: #073642;
+ border-top-color: #002b36;
+}
+.tabs ul {
+ display: flex;
+ list-style: none;
+ padding: 0;
+ margin: 0;
+}
+.tabs ul li {
+ flex: 1;
+ display: inline-block;
+ padding: 0;
+ margin: 0;
+}
+.tabs ul li a {
+ text-align: center;
+ display: block;
+ padding: 7px 0;
+ text-decoration: none;
+ font-size: 12px;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+html.theme_light .tabs ul li a {
+ color: #777;
+}
+html.theme_dark .tabs ul li a {
+ color: #a3a3a3;
+}
+html.theme_nord .tabs ul li a {
+ color: #D8DEE9;
+}
+html.theme_solarizedDark .tabs ul li a {
+ color: #839496;
+}
+html.theme_light .tabs ul li a:hover, html.theme_light .tabs ul li a:focus {
+ background-color: #fbfbfb;
+}
+html.theme_dark .tabs ul li a:hover, html.theme_dark .tabs ul li a:focus {
+ background-color: #3f3f3f;
+}
+html.theme_nord .tabs ul li a:hover, html.theme_nord .tabs ul li a:focus {
+ background-color: #434C5E;
+}
+html.theme_solarizedDark .tabs ul li a:hover, html.theme_solarizedDark .tabs ul li a:focus {
+ background-color: #586e75;
+}
+.tabs ul li a i {
+ display: block;
+ margin-bottom: 2px;
+ text-align: center;
+}
+html.theme_light .tabs ul li.active a {
+ color: #175DDC;
+}
+html.theme_dark .tabs ul li.active a {
+ color: #52bdfb;
+}
+html.theme_nord .tabs ul li.active a {
+ color: #81A1C1;
+}
+html.theme_solarizedDark .tabs ul li.active a {
+ color: #859900;
+}
+
+app-root {
+ position: absolute;
+ width: 100%;
+ height: 100%;
+ z-index: 980;
+}
+html.theme_light app-root {
+ background-color: #f0f0f0;
+}
+html.theme_dark app-root {
+ background-color: #222222;
+}
+html.theme_nord app-root {
+ background-color: #3B4252;
+}
+html.theme_solarizedDark app-root {
+ background-color: #002b36;
+}
+
+@media only screen and (min-width: 601px) {
+ app-lock header {
+ padding: 0 calc((100% - 500px) / 2);
+ }
+
+ app-lock content {
+ padding: 0 calc((100% - 500px) / 2);
+ }
+}
+content {
+ position: absolute;
+ top: 44px;
+ bottom: 0;
+ left: 0;
+ right: 0;
+ overflow-y: auto;
+ overflow-x: hidden;
+}
+html.theme_light content {
+ background-color: #f0f0f0;
+}
+html.theme_dark content {
+ background-color: #222222;
+}
+html.theme_nord content {
+ background-color: #3B4252;
+}
+html.theme_solarizedDark content {
+ background-color: #002b36;
+}
+content.no-header {
+ top: 0;
+}
+content.flex {
+ display: flex;
+ flex-flow: column;
+ height: calc(100% - 44px);
+}
+content.flex.tab-page {
+ height: calc(100% - 99px);
+}
+
+.tab-page content {
+ bottom: 55px;
+}
+
+.center-content, .no-items, .full-loading-spinner {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ height: 100%;
+ flex-direction: column;
+ flex-grow: 1;
+}
+
+.no-items, .full-loading-spinner {
+ text-align: center;
+}
+.no-items .fa, .full-loading-spinner .fa {
+ margin-bottom: 10px;
+}
+html.theme_light .no-items .fa, html.theme_light .full-loading-spinner .fa {
+ color: #767679;
+}
+html.theme_dark .no-items .fa, html.theme_dark .full-loading-spinner .fa {
+ color: #cacaca;
+}
+html.theme_nord .no-items .fa, html.theme_nord .full-loading-spinner .fa {
+ color: #D8DEE9;
+}
+html.theme_solarizedDark .no-items .fa, html.theme_solarizedDark .full-loading-spinner .fa {
+ color: #839496;
+}
+
+.cdk-virtual-scroll-viewport {
+ width: 100%;
+ height: 100%;
+ overflow-y: auto;
+ overflow-x: hidden;
+}
+
+.cdk-virtual-scroll-content-wrapper {
+ width: 100%;
+}
+
+.row {
+ display: flex;
+ margin: 0 -15px;
+ width: 100%;
+}
+
+.col {
+ flex-basis: 0;
+ flex-grow: 1;
+ padding: 0 15px;
+}
+
+.box {
+ position: relative;
+ width: 100%;
+ margin: 10px 0;
+}
+.box.first {
+ margin-top: 0;
+}
+.box .box-header {
+ margin: 0 10px 5px 10px;
+ text-transform: uppercase;
+ display: flex;
+}
+html.theme_light .box .box-header {
+ color: #777;
+}
+html.theme_dark .box .box-header {
+ color: #a3a3a3;
+}
+html.theme_nord .box .box-header {
+ color: #D8DEE9;
+}
+html.theme_solarizedDark .box .box-header {
+ color: #839496;
+}
+.box .box-header-expandable {
+ margin: 0 10px 5px 10px;
+ text-transform: uppercase;
+ display: flex;
+}
+html.theme_light .box .box-header-expandable {
+ color: #777;
+}
+html.theme_dark .box .box-header-expandable {
+ color: #a3a3a3;
+}
+html.theme_nord .box .box-header-expandable {
+ color: #D8DEE9;
+}
+html.theme_solarizedDark .box .box-header-expandable {
+ color: #839496;
+}
+html.theme_light .box .box-header-expandable:hover, html.theme_light .box .box-header-expandable:focus, html.theme_light .box .box-header-expandable.active {
+ background-color: #fbfbfb;
+}
+html.theme_dark .box .box-header-expandable:hover, html.theme_dark .box .box-header-expandable:focus, html.theme_dark .box .box-header-expandable.active {
+ background-color: #3f3f3f;
+}
+html.theme_nord .box .box-header-expandable:hover, html.theme_nord .box .box-header-expandable:focus, html.theme_nord .box .box-header-expandable.active {
+ background-color: #4C566A;
+}
+html.theme_solarizedDark .box .box-header-expandable:hover, html.theme_solarizedDark .box .box-header-expandable:focus, html.theme_solarizedDark .box .box-header-expandable.active {
+ background-color: #073642;
+}
+.box .box-header-expandable .icon {
+ display: flex;
+ align-items: center;
+ margin-left: 5px;
+}
+html.theme_light .box .box-header-expandable .icon {
+ color: #777;
+}
+html.theme_dark .box .box-header-expandable .icon {
+ color: #a3a3a3;
+}
+html.theme_nord .box .box-header-expandable .icon {
+ color: #D8DEE9;
+}
+html.theme_solarizedDark .box .box-header-expandable .icon {
+ color: #839496;
+}
+.box .box-content {
+ border-top: 1px solid #000000;
+ border-bottom: 1px solid #000000;
+}
+html.theme_light .box .box-content {
+ background-color: white;
+ border-color: #ddd;
+}
+html.theme_dark .box .box-content {
+ background-color: #363636;
+ border-color: #111111;
+}
+html.theme_nord .box .box-content {
+ background-color: #434C5E;
+ border-color: #2E3440;
+}
+html.theme_solarizedDark .box .box-content {
+ background-color: #002b36;
+ border-color: #002b36;
+}
+.box .box-content.box-content-padded {
+ padding: 10px 15px;
+}
+.box .box-content.condensed .box-content-row, .box .box-content .box-content-row.condensed {
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+.box .box-content.no-hover .box-content-row:hover, .box .box-content.no-hover .box-content-row:focus, .box .box-content .box-content-row.no-hover:hover, .box .box-content .box-content-row.no-hover:focus {
+ background-color: initial !important;
+}
+.box .box-footer {
+ margin: 5px 10px;
+ font-size: 12px;
+}
+html.theme_light .box .box-footer {
+ color: #777;
+}
+html.theme_dark .box .box-footer {
+ color: #a3a3a3;
+}
+html.theme_nord .box .box-footer {
+ color: #D8DEE9;
+}
+html.theme_solarizedDark .box .box-footer {
+ color: #839496;
+}
+.box.list .box-content .box-content-row {
+ padding: 3px 10px;
+ text-decoration: none;
+}
+html.theme_light .box.list .box-content .box-content-row {
+ color: #000000;
+}
+html.theme_dark .box.list .box-content .box-content-row {
+ color: #ffffff;
+}
+html.theme_nord .box.list .box-content .box-content-row {
+ color: #E5E9F0;
+}
+html.theme_solarizedDark .box.list .box-content .box-content-row {
+ color: #eee8d5;
+}
+.box.list .box-content .box-content-row.padded {
+ padding-top: 10px;
+ padding-bottom: 10px;
+}
+html.theme_light .box.list .box-content .box-content-row:hover, html.theme_light .box.list .box-content .box-content-row:focus, html.theme_light .box.list .box-content .box-content-row.active {
+ background-color: #fbfbfb;
+}
+html.theme_dark .box.list .box-content .box-content-row:hover, html.theme_dark .box.list .box-content .box-content-row:focus, html.theme_dark .box.list .box-content .box-content-row.active {
+ background-color: #3c3c3c;
+}
+html.theme_nord .box.list .box-content .box-content-row:hover, html.theme_nord .box.list .box-content .box-content-row:focus, html.theme_nord .box.list .box-content .box-content-row.active {
+ background-color: #4C566A;
+}
+html.theme_solarizedDark .box.list .box-content .box-content-row:hover, html.theme_solarizedDark .box.list .box-content .box-content-row:focus, html.theme_solarizedDark .box.list .box-content .box-content-row.active {
+ background-color: #073642;
+}
+.box.list .box-content .box-content-row:focus {
+ border-left: 5px solid #000000;
+ padding-left: 5px;
+}
+html.theme_light .box.list .box-content .box-content-row:focus {
+ border-left-color: #777;
+}
+html.theme_dark .box.list .box-content .box-content-row:focus {
+ border-left-color: #a3a3a3;
+}
+html.theme_nord .box.list .box-content .box-content-row:focus {
+ border-left-color: #D8DEE9;
+}
+html.theme_solarizedDark .box.list .box-content .box-content-row:focus {
+ border-left-color: #839496;
+}
+.box.list .box-content .box-content-row .action-buttons .row-btn {
+ padding-left: 5px;
+ padding-right: 5px;
+}
+.box.list .box-content .box-content-row .text:not(.no-ellipsis), .box.list .box-content .box-content-row .detail {
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+.box.list .box-content .box-content-row .row-main {
+ display: flex;
+ min-width: 0;
+}
+.box.list .box-content .box-content-row .row-main .row-main-content {
+ min-width: 0;
+}
+.box.list .box-content.single-line .box-content-row {
+ display: flex;
+ padding-top: 10px;
+ padding-bottom: 10px;
+}
+.box.only-list {
+ margin-bottom: 0;
+}
+.box.only-list .box-content {
+ border-bottom: none;
+}
+.box.full-list {
+ margin: 0;
+}
+.box.full-list .box-content {
+ border: none;
+}
+
+.stacked-boxes {
+ display: flex;
+ flex-direction: column;
+}
+
+.box-section-divider {
+ border-top: 1px solid #000000;
+ padding-top: 10px;
+}
+html.theme_light .box-section-divider {
+ border-color: #ddd;
+}
+html.theme_dark .box-section-divider {
+ border-color: #111111;
+}
+html.theme_nord .box-section-divider {
+ border-color: #2E3440;
+}
+html.theme_solarizedDark .box-section-divider {
+ border-color: #002b36;
+}
+
+.box-content-row {
+ display: block;
+ padding: 10px 15px;
+ position: relative;
+ z-index: 1;
+}
+.box-content-row:before {
+ content: "";
+ position: absolute;
+ right: 0;
+ bottom: 0;
+ height: 1px;
+ width: calc(100% - 10px);
+ border-bottom: 1px solid #000000;
+}
+html.theme_light .box-content-row:before {
+ border-bottom-color: #f0f0f0;
+}
+html.theme_dark .box-content-row:before {
+ border-bottom-color: #2f2f2f;
+}
+html.theme_nord .box-content-row:before {
+ border-bottom-color: #3B4252;
+}
+html.theme_solarizedDark .box-content-row:before {
+ border-bottom-color: #073642;
+}
+.box-content-row:last-child:before {
+ border: none;
+ height: 0;
+}
+.box-content-row.last:last-child:before {
+ border-bottom: 1px solid #000000;
+}
+html.theme_light .box-content-row.last:last-child:before {
+ border-bottom-color: #f0f0f0;
+}
+html.theme_dark .box-content-row.last:last-child:before {
+ border-bottom-color: #2f2f2f;
+}
+html.theme_nord .box-content-row.last:last-child:before {
+ border-bottom-color: #3B4252;
+}
+html.theme_solarizedDark .box-content-row.last:last-child:before {
+ border-bottom-color: #073642;
+}
+.box-content-row:after {
+ content: "";
+ display: table;
+ clear: both;
+}
+html.theme_light .box-content-row:hover, html.theme_light .box-content-row:focus, html.theme_light .box-content-row.active {
+ background-color: #fbfbfb;
+}
+html.theme_dark .box-content-row:hover, html.theme_dark .box-content-row:focus, html.theme_dark .box-content-row.active {
+ background-color: #3f3f3f;
+}
+html.theme_nord .box-content-row:hover, html.theme_nord .box-content-row:focus, html.theme_nord .box-content-row.active {
+ background-color: #4C566A;
+}
+html.theme_solarizedDark .box-content-row:hover, html.theme_solarizedDark .box-content-row:focus, html.theme_solarizedDark .box-content-row.active {
+ background-color: #073642;
+}
+.box-content-row.pre {
+ white-space: pre;
+ overflow-x: auto;
+}
+.box-content-row.pre-wrap {
+ white-space: pre-wrap;
+ overflow-x: auto;
+}
+.box-content-row .row-label, .box-content-row label {
+ font-size: 12px;
+ display: block;
+ width: 100%;
+ margin-bottom: 5px;
+}
+html.theme_light .box-content-row .row-label, html.theme_light .box-content-row label {
+ color: #777;
+}
+html.theme_dark .box-content-row .row-label, html.theme_dark .box-content-row label {
+ color: #a3a3a3;
+}
+html.theme_nord .box-content-row .row-label, html.theme_nord .box-content-row label {
+ color: #D8DEE9;
+}
+html.theme_solarizedDark .box-content-row .row-label, html.theme_solarizedDark .box-content-row label {
+ color: #839496;
+}
+.box-content-row .row-label .sub-label, .box-content-row label .sub-label {
+ margin-left: 10px;
+}
+.box-content-row .flex-label {
+ font-size: 12px;
+ display: flex;
+ flex-grow: 1;
+ margin-bottom: 5px;
+}
+html.theme_light .box-content-row .flex-label {
+ color: #777;
+}
+html.theme_dark .box-content-row .flex-label {
+ color: #a3a3a3;
+}
+html.theme_nord .box-content-row .flex-label {
+ color: #D8DEE9;
+}
+html.theme_solarizedDark .box-content-row .flex-label {
+ color: #839496;
+}
+.box-content-row .flex-label > a {
+ flex-grow: 0;
+}
+.box-content-row .text, .box-content-row .detail {
+ display: block;
+}
+html.theme_light .box-content-row .text, html.theme_light .box-content-row .detail {
+ color: #000000;
+}
+html.theme_dark .box-content-row .text, html.theme_dark .box-content-row .detail {
+ color: #ffffff;
+}
+html.theme_nord .box-content-row .text, html.theme_nord .box-content-row .detail {
+ color: #E5E9F0;
+}
+html.theme_solarizedDark .box-content-row .text, html.theme_solarizedDark .box-content-row .detail {
+ color: #eee8d5;
+}
+.box-content-row .detail {
+ font-size: 12px;
+}
+html.theme_light .box-content-row .detail {
+ color: #777;
+}
+html.theme_dark .box-content-row .detail {
+ color: #a3a3a3;
+}
+html.theme_nord .box-content-row .detail {
+ color: #D8DEE9;
+}
+html.theme_solarizedDark .box-content-row .detail {
+ color: #839496;
+}
+.box-content-row .img-right {
+ float: right;
+ margin-left: 10px;
+}
+.box-content-row .row-main {
+ flex-grow: 1;
+ min-width: 0;
+}
+.box-content-row.box-content-row-flex, .box-content-row .box-content-row-flex, .box-content-row.box-content-row-checkbox, .box-content-row.box-content-row-input, .box-content-row.box-content-row-slider, .box-content-row.box-content-row-multi {
+ display: flex;
+ align-items: center;
+ word-break: break-all;
+}
+.box-content-row.box-content-row-flex.box-content-row-word-break, .box-content-row .box-content-row-flex.box-content-row-word-break, .box-content-row.box-content-row-checkbox.box-content-row-word-break, .box-content-row.box-content-row-input.box-content-row-word-break, .box-content-row.box-content-row-slider.box-content-row-word-break, .box-content-row.box-content-row-multi.box-content-row-word-break {
+ word-break: normal;
+}
+.box-content-row.box-content-row-multi {
+ width: 100%;
+}
+.box-content-row.box-content-row-multi input:not([type=checkbox]) {
+ width: 100%;
+}
+.box-content-row.box-content-row-multi input + label.sr-only + select {
+ margin-top: 5px;
+}
+.box-content-row.box-content-row-multi > a,
+.box-content-row.box-content-row-multi > button {
+ padding: 8px 8px 8px 4px;
+ margin: 0;
+}
+html.theme_light .box-content-row.box-content-row-multi > a,
+html.theme_light .box-content-row.box-content-row-multi > button {
+ color: #dd4b39;
+}
+html.theme_dark .box-content-row.box-content-row-multi > a,
+html.theme_dark .box-content-row.box-content-row-multi > button {
+ color: #ff3e24;
+}
+html.theme_nord .box-content-row.box-content-row-multi > a,
+html.theme_nord .box-content-row.box-content-row-multi > button {
+ color: #BF616A;
+}
+html.theme_solarizedDark .box-content-row.box-content-row-multi > a,
+html.theme_solarizedDark .box-content-row.box-content-row-multi > button {
+ color: #dc322f;
+}
+.box-content-row.box-content-row-multi, .box-content-row.box-content-row-newmulti {
+ padding-left: 10px;
+}
+html.theme_light .box-content-row.box-content-row-newmulti {
+ color: #175DDC;
+}
+html.theme_dark .box-content-row.box-content-row-newmulti {
+ color: #52bdfb;
+}
+html.theme_nord .box-content-row.box-content-row-newmulti {
+ color: #81A1C1;
+}
+html.theme_solarizedDark .box-content-row.box-content-row-newmulti {
+ color: #859900;
+}
+.box-content-row.box-content-row-checkbox label, .box-content-row.box-content-row-checkbox .row-label, .box-content-row.box-content-row-input label, .box-content-row.box-content-row-input .row-label, .box-content-row.box-content-row-slider label, .box-content-row.box-content-row-slider .row-label {
+ font-size: 14px;
+ display: block;
+ width: initial;
+ margin-bottom: 0;
+}
+html.theme_light .box-content-row.box-content-row-checkbox label, html.theme_light .box-content-row.box-content-row-checkbox .row-label, html.theme_light .box-content-row.box-content-row-input label, html.theme_light .box-content-row.box-content-row-input .row-label, html.theme_light .box-content-row.box-content-row-slider label, html.theme_light .box-content-row.box-content-row-slider .row-label {
+ color: #000000;
+}
+html.theme_dark .box-content-row.box-content-row-checkbox label, html.theme_dark .box-content-row.box-content-row-checkbox .row-label, html.theme_dark .box-content-row.box-content-row-input label, html.theme_dark .box-content-row.box-content-row-input .row-label, html.theme_dark .box-content-row.box-content-row-slider label, html.theme_dark .box-content-row.box-content-row-slider .row-label {
+ color: #ffffff;
+}
+html.theme_nord .box-content-row.box-content-row-checkbox label, html.theme_nord .box-content-row.box-content-row-checkbox .row-label, html.theme_nord .box-content-row.box-content-row-input label, html.theme_nord .box-content-row.box-content-row-input .row-label, html.theme_nord .box-content-row.box-content-row-slider label, html.theme_nord .box-content-row.box-content-row-slider .row-label {
+ color: #E5E9F0;
+}
+html.theme_solarizedDark .box-content-row.box-content-row-checkbox label, html.theme_solarizedDark .box-content-row.box-content-row-checkbox .row-label, html.theme_solarizedDark .box-content-row.box-content-row-input label, html.theme_solarizedDark .box-content-row.box-content-row-input .row-label, html.theme_solarizedDark .box-content-row.box-content-row-slider label, html.theme_solarizedDark .box-content-row.box-content-row-slider .row-label {
+ color: #eee8d5;
+}
+html.theme_light .box-content-row.box-content-row-checkbox > span, html.theme_light .box-content-row.box-content-row-input > span, html.theme_light .box-content-row.box-content-row-slider > span {
+ color: #777;
+}
+html.theme_dark .box-content-row.box-content-row-checkbox > span, html.theme_dark .box-content-row.box-content-row-input > span, html.theme_dark .box-content-row.box-content-row-slider > span {
+ color: #a3a3a3;
+}
+html.theme_nord .box-content-row.box-content-row-checkbox > span, html.theme_nord .box-content-row.box-content-row-input > span, html.theme_nord .box-content-row.box-content-row-slider > span {
+ color: #D8DEE9;
+}
+html.theme_solarizedDark .box-content-row.box-content-row-checkbox > span, html.theme_solarizedDark .box-content-row.box-content-row-input > span, html.theme_solarizedDark .box-content-row.box-content-row-slider > span {
+ color: #839496;
+}
+.box-content-row.box-content-row-checkbox > input, .box-content-row.box-content-row-input > input, .box-content-row.box-content-row-slider > input {
+ margin: 0 0 0 auto;
+ padding: 0;
+}
+.box-content-row.box-content-row-checkbox > *, .box-content-row.box-content-row-input > *, .box-content-row.box-content-row-slider > * {
+ margin-right: 15px;
+}
+.box-content-row.box-content-row-checkbox > *:last-child, .box-content-row.box-content-row-input > *:last-child, .box-content-row.box-content-row-slider > *:last-child {
+ margin-right: 0;
+}
+.box-content-row.box-content-row-checkbox-left {
+ justify-content: flex-start;
+}
+.box-content-row.box-content-row-checkbox-left > input {
+ margin: 0 15px 0 0;
+}
+.box-content-row.box-content-row-input label {
+ white-space: nowrap;
+}
+.box-content-row.box-content-row-input input {
+ text-align: right;
+}
+.box-content-row.box-content-row-input input[type=number] {
+ max-width: 50px;
+}
+.box-content-row.box-content-row-slider input[type=range] {
+ height: 10px;
+}
+.box-content-row.box-content-row-slider input[type=number] {
+ width: 45px;
+}
+.box-content-row.box-content-row-slider label {
+ white-space: nowrap;
+}
+.box-content-row input:not([type=checkbox]):not([type=radio]), .box-content-row textarea {
+ border: none;
+ width: 100%;
+ background-color: transparent !important;
+}
+html.theme_light .box-content-row input:not([type=checkbox]):not([type=radio])::-webkit-input-placeholder, html.theme_light .box-content-row textarea::-webkit-input-placeholder {
+ color: #d0d0d0;
+}
+html.theme_dark .box-content-row input:not([type=checkbox]):not([type=radio])::-webkit-input-placeholder, html.theme_dark .box-content-row textarea::-webkit-input-placeholder {
+ color: #707070;
+}
+html.theme_nord .box-content-row input:not([type=checkbox]):not([type=radio])::-webkit-input-placeholder, html.theme_nord .box-content-row textarea::-webkit-input-placeholder {
+ color: #7b88a1;
+}
+html.theme_solarizedDark .box-content-row input:not([type=checkbox]):not([type=radio])::-webkit-input-placeholder, html.theme_solarizedDark .box-content-row textarea::-webkit-input-placeholder {
+ color: #9cacb2;
+}
+.box-content-row input:not([type=checkbox]):not([type=radio]):focus, .box-content-row textarea:focus {
+ outline: none;
+}
+.box-content-row select {
+ width: 100%;
+ border: 1px solid #000000;
+ border-radius: 3px;
+}
+html.theme_light .box-content-row select {
+ border-color: #cbcbcb;
+}
+html.theme_dark .box-content-row select {
+ border-color: #222222;
+}
+html.theme_nord .box-content-row select {
+ border-color: #2E3440;
+}
+html.theme_solarizedDark .box-content-row select {
+ border-color: #002b36;
+}
+.box-content-row .action-buttons {
+ display: flex;
+ margin-left: 5px;
+}
+.box-content-row .action-buttons .row-btn {
+ cursor: pointer;
+ padding: 10px 8px;
+ background: none;
+ border: none;
+}
+html.theme_light .box-content-row .action-buttons .row-btn {
+ color: #175DDC;
+}
+html.theme_dark .box-content-row .action-buttons .row-btn {
+ color: #cacaca;
+}
+html.theme_nord .box-content-row .action-buttons .row-btn {
+ color: #D8DEE9;
+}
+html.theme_solarizedDark .box-content-row .action-buttons .row-btn {
+ color: #839496;
+}
+html.theme_light .box-content-row .action-buttons .row-btn:hover, html.theme_light .box-content-row .action-buttons .row-btn:focus {
+ color: #1249ae;
+}
+html.theme_dark .box-content-row .action-buttons .row-btn:hover, html.theme_dark .box-content-row .action-buttons .row-btn:focus {
+ color: #ffffff;
+}
+html.theme_nord .box-content-row .action-buttons .row-btn:hover, html.theme_nord .box-content-row .action-buttons .row-btn:focus {
+ color: #ECEFF4;
+}
+html.theme_solarizedDark .box-content-row .action-buttons .row-btn:hover, html.theme_solarizedDark .box-content-row .action-buttons .row-btn:focus {
+ color: #eee8d5;
+}
+.box-content-row .action-buttons .row-btn.disabled {
+ cursor: default !important;
+}
+html.theme_light .box-content-row .action-buttons .row-btn.disabled {
+ color: #767679;
+ opacity: 1;
+}
+html.theme_dark .box-content-row .action-buttons .row-btn.disabled {
+ color: #cacaca;
+ opacity: 0.5;
+}
+html.theme_nord .box-content-row .action-buttons .row-btn.disabled {
+ color: #D8DEE9;
+ opacity: 0.5;
+}
+html.theme_solarizedDark .box-content-row .action-buttons .row-btn.disabled {
+ color: #839496;
+ opacity: 0.5;
+}
+html.theme_light .box-content-row .action-buttons .row-btn.disabled:hover {
+ color: #767679;
+ opacity: 1;
+}
+html.theme_dark .box-content-row .action-buttons .row-btn.disabled:hover {
+ color: #cacaca;
+ opacity: 0.5;
+}
+html.theme_nord .box-content-row .action-buttons .row-btn.disabled:hover {
+ color: #D8DEE9;
+ opacity: 0.5;
+}
+html.theme_solarizedDark .box-content-row .action-buttons .row-btn.disabled:hover {
+ color: #839496;
+ opacity: 0.5;
+}
+.box-content-row .action-buttons.no-pad .row-btn {
+ padding-top: 0;
+ padding-bottom: 0;
+}
+.box-content-row:not(.box-draggable-row) .action-buttons .row-btn:last-child {
+ padding-right: 2px !important;
+}
+.box-content-row.box-draggable-row.box-content-row-checkbox input[type=checkbox] + .drag-handle {
+ margin-left: 10px;
+}
+.box-content-row .drag-handle {
+ cursor: move;
+ padding: 10px 2px 10px 8px;
+ user-select: none;
+}
+html.theme_light .box-content-row .drag-handle {
+ color: #777;
+}
+html.theme_dark .box-content-row .drag-handle {
+ color: #a3a3a3;
+}
+html.theme_nord .box-content-row .drag-handle {
+ color: #D8DEE9;
+}
+html.theme_solarizedDark .box-content-row .drag-handle {
+ color: #839496;
+}
+.box-content-row.cdk-drag-preview {
+ position: relative;
+ display: flex;
+ align-items: center;
+ opacity: 0.8;
+}
+html.theme_light .box-content-row.cdk-drag-preview {
+ background-color: white;
+}
+html.theme_dark .box-content-row.cdk-drag-preview {
+ background-color: #363636;
+}
+html.theme_nord .box-content-row.cdk-drag-preview {
+ background-color: #434C5E;
+}
+html.theme_solarizedDark .box-content-row.cdk-drag-preview {
+ background-color: #002b36;
+}
+.box-content-row select.field-type {
+ margin: 5px 0 0 25px;
+ width: calc(100% - 25px);
+}
+html.theme_light .box-content-row .row-sub-icon, html.theme_light .box-content-row .row-sub-label + i.fa {
+ color: #767679;
+}
+html.theme_dark .box-content-row .row-sub-icon, html.theme_dark .box-content-row .row-sub-label + i.fa {
+ color: #cacaca;
+}
+html.theme_nord .box-content-row .row-sub-icon, html.theme_nord .box-content-row .row-sub-label + i.fa {
+ color: #D8DEE9;
+}
+html.theme_solarizedDark .box-content-row .row-sub-icon, html.theme_solarizedDark .box-content-row .row-sub-label + i.fa {
+ color: #839496;
+}
+.box-content-row .row-sub-label {
+ margin: 0 15px;
+ white-space: nowrap;
+}
+html.theme_light .box-content-row .row-sub-label {
+ color: #777;
+}
+html.theme_dark .box-content-row .row-sub-label {
+ color: #a3a3a3;
+}
+html.theme_nord .box-content-row .row-sub-label {
+ color: #D8DEE9;
+}
+html.theme_solarizedDark .box-content-row .row-sub-label {
+ color: #839496;
+}
+.box-content-row .icon {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ min-width: 34px;
+ margin-left: -5px;
+}
+html.theme_light .box-content-row .icon {
+ color: #777;
+}
+html.theme_dark .box-content-row .icon {
+ color: #a3a3a3;
+}
+html.theme_nord .box-content-row .icon {
+ color: #D8DEE9;
+}
+html.theme_solarizedDark .box-content-row .icon {
+ color: #839496;
+}
+.box-content-row .icon.icon-small {
+ min-width: 25px;
+}
+.box-content-row .icon img {
+ border-radius: 3px;
+ max-height: 20px;
+ max-width: 20px;
+}
+.box-content-row.totp .totp-code {
+ font-family: Menlo, Monaco, Consolas, "Courier New", monospace;
+ font-size: 1.1em;
+}
+.box-content-row.totp .totp-countdown {
+ margin: 3px 3px 0 0;
+ display: block;
+ user-select: none;
+}
+.box-content-row.totp .totp-countdown .totp-sec {
+ font-size: 0.85em;
+ position: absolute;
+ line-height: 32px;
+ width: 32px;
+ text-align: center;
+}
+.box-content-row.totp .totp-countdown svg {
+ width: 32px;
+ height: 32px;
+ transform: rotate(-90deg);
+}
+.box-content-row.totp .totp-countdown .totp-circle {
+ fill: none;
+}
+html.theme_light .box-content-row.totp .totp-countdown .totp-circle {
+ stroke: #175DDC;
+}
+html.theme_dark .box-content-row.totp .totp-countdown .totp-circle {
+ stroke: #cacaca;
+}
+html.theme_nord .box-content-row.totp .totp-countdown .totp-circle {
+ stroke: #D8DEE9;
+}
+html.theme_solarizedDark .box-content-row.totp .totp-countdown .totp-circle {
+ stroke: #839496;
+}
+.box-content-row.totp .totp-countdown .totp-circle.inner {
+ stroke-width: 3;
+ stroke-dasharray: 78.6;
+ stroke-dashoffset: 0;
+}
+.box-content-row.totp .totp-countdown .totp-circle.outer {
+ stroke-width: 2;
+ stroke-dasharray: 88;
+ stroke-dashoffset: 0;
+}
+html.theme_light .box-content-row.totp.low .totp-sec, html.theme_light .box-content-row.totp.low .totp-code {
+ color: #dd4b39;
+}
+html.theme_dark .box-content-row.totp.low .totp-sec, html.theme_dark .box-content-row.totp.low .totp-code {
+ color: #ff3e24;
+}
+html.theme_nord .box-content-row.totp.low .totp-sec, html.theme_nord .box-content-row.totp.low .totp-code {
+ color: #BF616A;
+}
+html.theme_solarizedDark .box-content-row.totp.low .totp-sec, html.theme_solarizedDark .box-content-row.totp.low .totp-code {
+ color: #dc322f;
+}
+html.theme_light .box-content-row.totp.low .totp-circle {
+ stroke: #dd4b39;
+}
+html.theme_dark .box-content-row.totp.low .totp-circle {
+ stroke: #ff3e24;
+}
+html.theme_nord .box-content-row.totp.low .totp-circle {
+ stroke: #BF616A;
+}
+html.theme_solarizedDark .box-content-row.totp.low .totp-circle {
+ stroke: #dc322f;
+}
+.box-content-row .progress {
+ display: flex;
+ height: 5px;
+ overflow: hidden;
+ margin: 5px -15px -10px;
+}
+.box-content-row .progress .progress-bar {
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ white-space: nowrap;
+ background-color: #175DDC;
+}
+.box-content-row .radio-group {
+ display: flex;
+ justify-content: flex-start;
+ align-items: center;
+ margin-bottom: 5px;
+}
+.box-content-row .radio-group input {
+ flex-grow: 0;
+}
+.box-content-row .radio-group label {
+ margin: 0 0 0 5px;
+ flex-grow: 1;
+ font-size: 14px;
+ display: block;
+ width: 100%;
+}
+html.theme_light .box-content-row .radio-group label {
+ color: #000000;
+}
+html.theme_dark .box-content-row .radio-group label {
+ color: #ffffff;
+}
+html.theme_nord .box-content-row .radio-group label {
+ color: #E5E9F0;
+}
+html.theme_solarizedDark .box-content-row .radio-group label {
+ color: #eee8d5;
+}
+
+.btn, .swal2-popup .swal2-actions button.swal2-confirm, .swal2-popup .swal2-actions button {
+ border-radius: 3px;
+ padding: 7px 15px;
+ border: 1px solid #000000;
+ font-size: 14px;
+ white-space: nowrap;
+ text-align: center;
+ cursor: pointer;
+}
+html.theme_light .btn, html.theme_light .swal2-popup .swal2-actions button, .swal2-popup .swal2-actions html.theme_light button {
+ background-color: white;
+ border-color: #bebebe;
+ color: #666666;
+}
+html.theme_dark .btn, html.theme_dark .swal2-popup .swal2-actions button, .swal2-popup .swal2-actions html.theme_dark button {
+ background-color: #363636;
+ border-color: #1f1f1f;
+ color: #e0e0e0;
+}
+html.theme_nord .btn, html.theme_nord .swal2-popup .swal2-actions button, .swal2-popup .swal2-actions html.theme_nord button {
+ background-color: #4C566A;
+ border-color: #2E3440;
+ color: #E5E9F0;
+}
+html.theme_solarizedDark .btn, html.theme_solarizedDark .swal2-popup .swal2-actions button, .swal2-popup .swal2-actions html.theme_solarizedDark button {
+ background-color: #657b83;
+ border-color: #002b36;
+ color: #93a1a1;
+}
+html.theme_light .btn.primary, html.theme_light .swal2-popup .swal2-actions button.primary, html.theme_light .swal2-popup .swal2-actions button.swal2-confirm, .swal2-popup .swal2-actions html.theme_light button.primary, .swal2-popup .swal2-actions html.theme_light button.swal2-confirm {
+ color: #134db7;
+}
+html.theme_dark .btn.primary, html.theme_dark .swal2-popup .swal2-actions button.primary, html.theme_dark .swal2-popup .swal2-actions button.swal2-confirm, .swal2-popup .swal2-actions html.theme_dark button.primary, .swal2-popup .swal2-actions html.theme_dark button.swal2-confirm {
+ color: #46ace7;
+}
+html.theme_nord .btn.primary, html.theme_nord .swal2-popup .swal2-actions button.primary, html.theme_nord .swal2-popup .swal2-actions button.swal2-confirm, .swal2-popup .swal2-actions html.theme_nord button.primary, .swal2-popup .swal2-actions html.theme_nord button.swal2-confirm {
+ color: #88C0D0;
+}
+html.theme_solarizedDark .btn.primary, html.theme_solarizedDark .swal2-popup .swal2-actions button.primary, html.theme_solarizedDark .swal2-popup .swal2-actions button.swal2-confirm, .swal2-popup .swal2-actions html.theme_solarizedDark button.primary, .swal2-popup .swal2-actions html.theme_solarizedDark button.swal2-confirm {
+ color: #2aa198;
+}
+html.theme_light .btn.danger, html.theme_light .swal2-popup .swal2-actions button.danger, .swal2-popup .swal2-actions html.theme_light button.danger {
+ color: #c23321;
+}
+html.theme_dark .btn.danger, html.theme_dark .swal2-popup .swal2-actions button.danger, .swal2-popup .swal2-actions html.theme_dark button.danger {
+ color: #ff3e24;
+}
+html.theme_nord .btn.danger, html.theme_nord .swal2-popup .swal2-actions button.danger, .swal2-popup .swal2-actions html.theme_nord button.danger {
+ color: #BF616A;
+}
+html.theme_solarizedDark .btn.danger, html.theme_solarizedDark .swal2-popup .swal2-actions button.danger, .swal2-popup .swal2-actions html.theme_solarizedDark button.danger {
+ color: #dc322f;
+}
+.btn:hover:not([disabled]), .swal2-popup .swal2-actions button:hover:not([disabled]) {
+ cursor: pointer;
+}
+html.theme_light .btn:hover:not([disabled]), html.theme_light .swal2-popup .swal2-actions button:hover:not([disabled]), .swal2-popup .swal2-actions html.theme_light button:hover:not([disabled]) {
+ background-color: #fbfbfb;
+ border-color: #939393;
+ color: #4d4d4d;
+}
+html.theme_dark .btn:hover:not([disabled]), html.theme_dark .swal2-popup .swal2-actions button:hover:not([disabled]), .swal2-popup .swal2-actions html.theme_dark button:hover:not([disabled]) {
+ background-color: #323232;
+ border-color: black;
+ color: #c7c7c7;
+}
+html.theme_nord .btn:hover:not([disabled]), html.theme_nord .swal2-popup .swal2-actions button:hover:not([disabled]), .swal2-popup .swal2-actions html.theme_nord button:hover:not([disabled]) {
+ background-color: #495266;
+ border-color: #0a0b0e;
+ color: #c5cedd;
+}
+html.theme_solarizedDark .btn:hover:not([disabled]), html.theme_solarizedDark .swal2-popup .swal2-actions button:hover:not([disabled]), .swal2-popup .swal2-actions html.theme_solarizedDark button:hover:not([disabled]) {
+ background-color: #62777f;
+ border-color: black;
+ color: #788989;
+}
+html.theme_light .btn:hover:not([disabled]).primary, html.theme_light .swal2-popup .swal2-actions button:hover:not([disabled]).primary, html.theme_light .swal2-popup .swal2-actions button.swal2-confirm:hover:not([disabled]), .swal2-popup .swal2-actions html.theme_light button:hover:not([disabled]).primary, .swal2-popup .swal2-actions html.theme_light button.swal2-confirm:hover:not([disabled]) {
+ color: #10429b;
+}
+html.theme_dark .btn:hover:not([disabled]).primary, html.theme_dark .swal2-popup .swal2-actions button:hover:not([disabled]).primary, html.theme_dark .swal2-popup .swal2-actions button.swal2-confirm:hover:not([disabled]), .swal2-popup .swal2-actions html.theme_dark button:hover:not([disabled]).primary, .swal2-popup .swal2-actions html.theme_dark button.swal2-confirm:hover:not([disabled]) {
+ color: #2ba0e3;
+}
+html.theme_nord .btn:hover:not([disabled]).primary, html.theme_nord .swal2-popup .swal2-actions button:hover:not([disabled]).primary, html.theme_nord .swal2-popup .swal2-actions button.swal2-confirm:hover:not([disabled]), .swal2-popup .swal2-actions html.theme_nord button:hover:not([disabled]).primary, .swal2-popup .swal2-actions html.theme_nord button.swal2-confirm:hover:not([disabled]) {
+ color: #72b4c7;
+}
+html.theme_solarizedDark .btn:hover:not([disabled]).primary, html.theme_solarizedDark .swal2-popup .swal2-actions button:hover:not([disabled]).primary, html.theme_solarizedDark .swal2-popup .swal2-actions button.swal2-confirm:hover:not([disabled]), .swal2-popup .swal2-actions html.theme_solarizedDark button:hover:not([disabled]).primary, .swal2-popup .swal2-actions html.theme_solarizedDark button.swal2-confirm:hover:not([disabled]) {
+ color: #248981;
+}
+html.theme_light .btn:hover:not([disabled]).danger, html.theme_light .swal2-popup .swal2-actions button:hover:not([disabled]).danger, .swal2-popup .swal2-actions html.theme_light button:hover:not([disabled]).danger {
+ color: #a82c1d;
+}
+html.theme_dark .btn:hover:not([disabled]).danger, html.theme_dark .swal2-popup .swal2-actions button:hover:not([disabled]).danger, .swal2-popup .swal2-actions html.theme_dark button:hover:not([disabled]).danger {
+ color: #ff2305;
+}
+html.theme_nord .btn:hover:not([disabled]).danger, html.theme_nord .swal2-popup .swal2-actions button:hover:not([disabled]).danger, .swal2-popup .swal2-actions html.theme_nord button:hover:not([disabled]).danger {
+ color: #b64b55;
+}
+html.theme_solarizedDark .btn:hover:not([disabled]).danger, html.theme_solarizedDark .swal2-popup .swal2-actions button:hover:not([disabled]).danger, .swal2-popup .swal2-actions html.theme_solarizedDark button:hover:not([disabled]).danger {
+ color: #ca2522;
+}
+.btn:focus:not([disabled]), .swal2-popup .swal2-actions button:focus:not([disabled]) {
+ cursor: pointer;
+ outline: 0;
+}
+html.theme_light .btn:focus:not([disabled]), html.theme_light .swal2-popup .swal2-actions button:focus:not([disabled]), .swal2-popup .swal2-actions html.theme_light button:focus:not([disabled]) {
+ background-color: #f0f0f0;
+ border-color: #7f7f7f;
+}
+html.theme_dark .btn:focus:not([disabled]), html.theme_dark .swal2-popup .swal2-actions button:focus:not([disabled]), .swal2-popup .swal2-actions html.theme_dark button:focus:not([disabled]) {
+ background-color: #272727;
+ border-color: black;
+}
+html.theme_nord .btn:focus:not([disabled]), html.theme_nord .swal2-popup .swal2-actions button:focus:not([disabled]), .swal2-popup .swal2-actions html.theme_nord button:focus:not([disabled]) {
+ background-color: #3f4858;
+ border-color: black;
+}
+html.theme_solarizedDark .btn:focus:not([disabled]), html.theme_solarizedDark .swal2-popup .swal2-actions button:focus:not([disabled]), .swal2-popup .swal2-actions html.theme_solarizedDark button:focus:not([disabled]) {
+ background-color: #586b72;
+ border-color: black;
+}
+.btn[disabled], .swal2-popup .swal2-actions button[disabled] {
+ opacity: 0.65;
+ cursor: default !important;
+}
+.btn.block, .swal2-popup .swal2-actions button.block {
+ display: block;
+ width: 100%;
+}
+.btn.link, .swal2-popup .swal2-actions button.link, .btn.neutral, .swal2-popup .swal2-actions button.neutral {
+ border: none !important;
+ background: none !important;
+}
+.btn.link:focus, .swal2-popup .swal2-actions button.link:focus, .btn.neutral:focus, .swal2-popup .swal2-actions button.neutral:focus {
+ text-decoration: underline;
+}
+
+.action-buttons .btn:focus, .action-buttons .swal2-popup .swal2-actions button:focus, .swal2-popup .swal2-actions .action-buttons button:focus {
+ outline: auto;
+}
+
+button.box-content-row {
+ display: block;
+ width: 100%;
+ text-align: left;
+}
+
+button {
+ border: none;
+ background: transparent;
+ color: inherit;
+}
+
+small, .small {
+ font-size: 12px;
+}
+
+html.theme_light .bg-primary {
+ background-color: #175DDC !important;
+}
+html.theme_dark .bg-primary {
+ background-color: #52bdfb !important;
+}
+html.theme_nord .bg-primary {
+ background-color: #81A1C1 !important;
+}
+html.theme_solarizedDark .bg-primary {
+ background-color: #859900 !important;
+}
+
+html.theme_light .bg-success {
+ background-color: #00a65a !important;
+}
+html.theme_dark .bg-success {
+ background-color: #00a65a !important;
+}
+html.theme_nord .bg-success {
+ background-color: #A3BE8C !important;
+}
+html.theme_solarizedDark .bg-success {
+ background-color: #859900 !important;
+}
+
+html.theme_light .bg-danger {
+ background-color: #dd4b39 !important;
+}
+html.theme_dark .bg-danger {
+ background-color: #ff3e24 !important;
+}
+html.theme_nord .bg-danger {
+ background-color: #BF616A !important;
+}
+html.theme_solarizedDark .bg-danger {
+ background-color: #dc322f !important;
+}
+
+html.theme_light .bg-info {
+ background-color: #555555 !important;
+}
+html.theme_dark .bg-info {
+ background-color: #555555 !important;
+}
+html.theme_nord .bg-info {
+ background-color: #81A1C1 !important;
+}
+html.theme_solarizedDark .bg-info {
+ background-color: #859900 !important;
+}
+
+html.theme_light .bg-warning {
+ background-color: #bf7e16 !important;
+}
+html.theme_dark .bg-warning {
+ background-color: #bf7e16 !important;
+}
+html.theme_nord .bg-warning {
+ background-color: #D08770 !important;
+}
+html.theme_solarizedDark .bg-warning {
+ background-color: #b58900 !important;
+}
+
+html.theme_light .text-primary {
+ color: #175DDC !important;
+}
+html.theme_dark .text-primary {
+ color: #52bdfb !important;
+}
+html.theme_nord .text-primary {
+ color: #81A1C1 !important;
+}
+html.theme_solarizedDark .text-primary {
+ color: #859900 !important;
+}
+
+html.theme_light .text-success {
+ color: #00a65a !important;
+}
+html.theme_dark .text-success {
+ color: #00a65a !important;
+}
+html.theme_nord .text-success {
+ color: #A3BE8C !important;
+}
+html.theme_solarizedDark .text-success {
+ color: #859900 !important;
+}
+
+html.theme_light .text-muted {
+ color: #777 !important;
+}
+html.theme_dark .text-muted {
+ color: #a3a3a3 !important;
+}
+html.theme_nord .text-muted {
+ color: #D8DEE9 !important;
+}
+html.theme_solarizedDark .text-muted {
+ color: #839496 !important;
+}
+
+html.theme_light .text-default {
+ color: #000000 !important;
+}
+html.theme_dark .text-default {
+ color: #ffffff !important;
+}
+html.theme_nord .text-default {
+ color: #E5E9F0 !important;
+}
+html.theme_solarizedDark .text-default {
+ color: #eee8d5 !important;
+}
+
+html.theme_light .text-danger {
+ color: #dd4b39 !important;
+}
+html.theme_dark .text-danger {
+ color: #ff3e24 !important;
+}
+html.theme_nord .text-danger {
+ color: #BF616A !important;
+}
+html.theme_solarizedDark .text-danger {
+ color: #dc322f !important;
+}
+
+html.theme_light .text-info {
+ color: #555555 !important;
+}
+html.theme_dark .text-info {
+ color: #555555 !important;
+}
+html.theme_nord .text-info {
+ color: #81A1C1 !important;
+}
+html.theme_solarizedDark .text-info {
+ color: #859900 !important;
+}
+
+html.theme_light .text-warning {
+ color: #bf7e16 !important;
+}
+html.theme_dark .text-warning {
+ color: #bf7e16 !important;
+}
+html.theme_nord .text-warning {
+ color: #D08770 !important;
+}
+html.theme_solarizedDark .text-warning {
+ color: #b58900 !important;
+}
+
+.text-center {
+ text-align: center;
+}
+
+.font-weight-semibold {
+ font-weight: 600;
+}
+
+p.lead {
+ font-size: 18px;
+ margin-bottom: 20px;
+ font-weight: normal;
+}
+
+.flex-right {
+ margin-left: auto;
+}
+
+.flex-bottom {
+ margin-top: auto;
+}
+
+.no-margin {
+ margin: 0 !important;
+}
+
+.no-vmargin {
+ margin-top: 0 !important;
+ margin-bottom: 0 !important;
+}
+
+.no-vpad {
+ padding-top: 0 !important;
+ padding-bottom: 0 !important;
+}
+
+.display-block {
+ display: block !important;
+}
+
+.monospaced {
+ font-family: Menlo, Monaco, Consolas, "Courier New", monospace;
+}
+
+.show-whitespace {
+ white-space: pre-wrap;
+}
+
+.img-responsive {
+ display: block;
+ max-width: 100%;
+ height: auto;
+}
+
+.img-rounded {
+ border-radius: 6px;
+}
+
+.sr-only {
+ position: absolute !important;
+ width: 1px !important;
+ height: 1px !important;
+ padding: 0 !important;
+ margin: -1px !important;
+ overflow: hidden !important;
+ clip: rect(0, 0, 0, 0) !important;
+ border: 0 !important;
+}
+
+.password-wrapper {
+ overflow-wrap: break-word;
+ white-space: pre-wrap;
+ min-width: 0;
+}
+
+html.theme_light .password-number {
+ color: #007fde;
+}
+html.theme_dark .password-number {
+ color: #52bdfb;
+}
+html.theme_nord .password-number {
+ color: #88C0D0;
+}
+html.theme_solarizedDark .password-number {
+ color: #2aa198;
+}
+
+html.theme_light .password-special {
+ color: #c40800;
+}
+html.theme_dark .password-special {
+ color: #ff7c70;
+}
+html.theme_nord .password-special {
+ color: #D08770;
+}
+html.theme_solarizedDark .password-special {
+ color: #b58900;
+}
+
+#duo-frame {
+ background: url(./images/loading.svg) 0 0 no-repeat;
+ width: 100%;
+ height: 470px;
+ margin-bottom: -10px;
+}
+#duo-frame iframe {
+ width: 100%;
+ height: 100%;
+ border: none;
+}
+
+#web-authn-frame {
+ background: url(./images/loading.svg) 0 0 no-repeat;
+ width: 100%;
+ height: 310px;
+ margin-bottom: -10px;
+}
+#web-authn-frame iframe {
+ width: 100%;
+ height: 100%;
+ border: none;
+}
+
+#hcaptcha_iframe {
+ width: 100%;
+ border: none;
+ transition: height 0.25s linear;
+}
+
+body.linux-webauthn {
+ width: 485px !important;
+}
+body.linux-webauthn #web-authn-frame iframe {
+ width: 375px;
+ margin: 0 55px;
+}
+
+app-root > #loading {
+ display: flex;
+ text-align: center;
+ justify-content: center;
+ align-items: center;
+ height: 100%;
+ width: 100%;
+ color: #777;
+}
+html.theme_light app-root > #loading {
+ color: #777;
+}
+html.theme_dark app-root > #loading {
+ color: #a3a3a3;
+}
+html.theme_nord app-root > #loading {
+ color: #D8DEE9;
+}
+html.theme_solarizedDark app-root > #loading {
+ color: #839496;
+}
+
+app-vault-icon {
+ display: flex;
+}
+
+.logo-image {
+ margin: 0 auto;
+ width: 142px;
+ height: 21px;
+ background-size: 142px 21px;
+ background-repeat: no-repeat;
+}
+html.theme_light .logo-image {
+ background-image: url(./images/logo-dark@2x.png);
+}
+html.theme_dark .logo-image {
+ background-image: url(./images/logo-white@2x.png);
+}
+html.theme_nord .logo-image {
+ background-image: url(./images/logo-white@2x.png);
+}
+html.theme_solarizedDark .logo-image {
+ background-image: url(./images/logo-white@2x.png);
+}
+@media (min-width: 219px) {
+ .logo-image {
+ width: 189px;
+ height: 28px;
+ background-size: 189px 28px;
+ }
+}
+@media (min-width: 314px) {
+ .logo-image {
+ width: 284px;
+ height: 43px;
+ background-size: 284px 43px;
+ }
+}
+
+[hidden] {
+ display: none !important;
+}
+
+.draggable {
+ cursor: move;
+}
+
+.callout {
+ padding: 10px;
+ margin: 10px;
+ border: 1px solid #000000;
+ border-left-width: 5px;
+ border-radius: 3px;
+}
+html.theme_light .callout {
+ border-color: #ddd;
+ background-color: white;
+}
+html.theme_dark .callout {
+ border-color: #111111;
+ background-color: #3d3d3d;
+}
+html.theme_nord .callout {
+ border-color: #2E3440;
+ background-color: #434C5E;
+}
+html.theme_solarizedDark .callout {
+ border-color: #002b36;
+ background-color: #586e75;
+}
+.callout .callout-heading {
+ margin-top: 0;
+}
+.callout h3.callout-heading {
+ font-weight: bold;
+ text-transform: uppercase;
+}
+html.theme_light .callout.callout-primary {
+ border-left-color: #175DDC;
+}
+html.theme_dark .callout.callout-primary {
+ border-left-color: #52bdfb;
+}
+html.theme_nord .callout.callout-primary {
+ border-left-color: #81A1C1;
+}
+html.theme_solarizedDark .callout.callout-primary {
+ border-left-color: #859900;
+}
+html.theme_light .callout.callout-primary .callout-heading {
+ color: #175DDC;
+}
+html.theme_dark .callout.callout-primary .callout-heading {
+ color: #52bdfb;
+}
+html.theme_nord .callout.callout-primary .callout-heading {
+ color: #81A1C1;
+}
+html.theme_solarizedDark .callout.callout-primary .callout-heading {
+ color: #859900;
+}
+html.theme_light .callout.callout-info {
+ border-left-color: #555555;
+}
+html.theme_dark .callout.callout-info {
+ border-left-color: #555555;
+}
+html.theme_nord .callout.callout-info {
+ border-left-color: #81A1C1;
+}
+html.theme_solarizedDark .callout.callout-info {
+ border-left-color: #859900;
+}
+html.theme_light .callout.callout-info .callout-heading {
+ color: #555555;
+}
+html.theme_dark .callout.callout-info .callout-heading {
+ color: #555555;
+}
+html.theme_nord .callout.callout-info .callout-heading {
+ color: #81A1C1;
+}
+html.theme_solarizedDark .callout.callout-info .callout-heading {
+ color: #859900;
+}
+html.theme_light .callout.callout-danger {
+ border-left-color: #dd4b39;
+}
+html.theme_dark .callout.callout-danger {
+ border-left-color: #ff3e24;
+}
+html.theme_nord .callout.callout-danger {
+ border-left-color: #BF616A;
+}
+html.theme_solarizedDark .callout.callout-danger {
+ border-left-color: #dc322f;
+}
+html.theme_light .callout.callout-danger .callout-heading {
+ color: #dd4b39;
+}
+html.theme_dark .callout.callout-danger .callout-heading {
+ color: #ff3e24;
+}
+html.theme_nord .callout.callout-danger .callout-heading {
+ color: #BF616A;
+}
+html.theme_solarizedDark .callout.callout-danger .callout-heading {
+ color: #dc322f;
+}
+html.theme_light .callout.callout-success {
+ border-left-color: #00a65a;
+}
+html.theme_dark .callout.callout-success {
+ border-left-color: #00a65a;
+}
+html.theme_nord .callout.callout-success {
+ border-left-color: #A3BE8C;
+}
+html.theme_solarizedDark .callout.callout-success {
+ border-left-color: #859900;
+}
+html.theme_light .callout.callout-success .callout-heading {
+ color: #00a65a;
+}
+html.theme_dark .callout.callout-success .callout-heading {
+ color: #00a65a;
+}
+html.theme_nord .callout.callout-success .callout-heading {
+ color: #A3BE8C;
+}
+html.theme_solarizedDark .callout.callout-success .callout-heading {
+ color: #859900;
+}
+html.theme_light .callout.callout-warning {
+ border-left-color: #bf7e16;
+}
+html.theme_dark .callout.callout-warning {
+ border-left-color: #bf7e16;
+}
+html.theme_nord .callout.callout-warning {
+ border-left-color: #D08770;
+}
+html.theme_solarizedDark .callout.callout-warning {
+ border-left-color: #b58900;
+}
+html.theme_light .callout.callout-warning .callout-heading {
+ color: #bf7e16;
+}
+html.theme_dark .callout.callout-warning .callout-heading {
+ color: #bf7e16;
+}
+html.theme_nord .callout.callout-warning .callout-heading {
+ color: #D08770;
+}
+html.theme_solarizedDark .callout.callout-warning .callout-heading {
+ color: #b58900;
+}
+html.theme_light .callout.clickable:hover, html.theme_light .callout.clickable:focus, html.theme_light .callout.clickable.active {
+ background-color: #fbfbfb;
+}
+html.theme_dark .callout.clickable:hover, html.theme_dark .callout.clickable:focus, html.theme_dark .callout.clickable.active {
+ background-color: #3f3f3f;
+}
+html.theme_nord .callout.clickable:hover, html.theme_nord .callout.clickable:focus, html.theme_nord .callout.clickable.active {
+ background-color: #4C566A;
+}
+html.theme_solarizedDark .callout.clickable:hover, html.theme_solarizedDark .callout.clickable:focus, html.theme_solarizedDark .callout.clickable.active {
+ background-color: #073642;
+}
+.callout .enforced-policy-options ul {
+ padding-left: 30px;
+ margin: 0;
+}
+
+input[type=password]::-ms-reveal {
+ display: none;
+}
+
+.flex {
+ display: flex;
+}
+.flex.flex-grow > * {
+ flex: 1;
+}
+
+html.theme_light select option {
+ background-color: #fcfcfc;
+}
+html.theme_dark select option {
+ background-color: #333333;
+}
+html.theme_nord select option {
+ background-color: #414a5b;
+}
+html.theme_solarizedDark select option {
+ background-color: #566b72;
+}
+
+@keyframes redraw {
+ 0% {
+ opacity: 0.99;
+ }
+ 100% {
+ opacity: 1;
+ }
+}
+html.force_redraw {
+ animation: redraw 1s linear infinite;
+}
+
+@keyframes modalshow {
+ 0% {
+ opacity: 0;
+ transform: translate(0, -25%);
+ }
+ 100% {
+ opacity: 1;
+ transform: translate(0, 0);
+ }
+}
+@keyframes backdropshow {
+ 0% {
+ opacity: 0;
+ }
+ 100% {
+ opacity: 0.5;
+ }
+}
+.modal-open {
+ overflow: hidden;
+}
+
+.modal {
+ position: fixed;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ z-index: 1050;
+ overflow: hidden;
+ outline: 0;
+}
+.modal-open .modal {
+ overflow-x: hidden;
+ overflow-y: auto;
+}
+
+.modal-dialog {
+ position: relative;
+ width: auto;
+ margin: 0.5rem;
+ pointer-events: none;
+ transform: translate(0, 0);
+}
+.modal.fade .modal-dialog {
+ animation: modalshow 0.3s ease-in;
+}
+
+.modal-dialog-centered {
+ display: flex;
+ align-items: center;
+ min-height: calc(100% - (0.5rem * 2));
+}
+
+.modal-content {
+ position: relative;
+ display: flex;
+ flex-direction: column;
+ width: 100%;
+ pointer-events: auto;
+ background-clip: padding-box;
+ border: 1px solid rgba(0, 0, 0, 0.2);
+ border-radius: 3px;
+ box-shadow: none;
+ outline: 0;
+}
+html.theme_light .modal-content {
+ background-color: #ffffff;
+}
+html.theme_dark .modal-content {
+ background-color: #3d3d3d;
+}
+html.theme_nord .modal-content {
+ background-color: #434C5E;
+}
+html.theme_solarizedDark .modal-content {
+ background-color: #073642;
+}
+
+.modal-backdrop {
+ position: fixed;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ z-index: 1040;
+ background-color: black;
+ opacity: 0.5;
+}
+.modal-backdrop.fade {
+ animation: backdropshow 0.1s ease-in;
+}
+
+.modal-header {
+ display: flex;
+ align-items: flex-start;
+ justify-content: space-between;
+ padding: 12px 10px;
+ border-bottom: 1px solid #ddd;
+}
+html.theme_light .modal-header {
+ border-bottom-color: #ddd;
+}
+html.theme_dark .modal-header {
+ border-bottom-color: #111111;
+}
+html.theme_nord .modal-header {
+ border-bottom-color: #2E3440;
+}
+html.theme_solarizedDark .modal-header {
+ border-bottom-color: #002b36;
+}
+.modal-header .close {
+ padding: 12px 10px;
+ margin: -12px -10px -12px auto;
+}
+.modal-header h5 {
+ font-size: 14px;
+ font-weight: bold;
+ display: flex;
+ align-items: center;
+}
+.modal-header h5 .fa {
+ margin-right: 5px;
+}
+
+.modal-title {
+ margin-bottom: 0;
+ line-height: 14px;
+}
+
+.modal-body {
+ position: relative;
+ flex: 1 1 auto;
+ padding: 10px;
+}
+
+.modal-footer {
+ display: flex;
+ align-items: center;
+ padding: 10px;
+ border-top: 1px solid #ddd;
+}
+html.theme_light .modal-footer {
+ border-top-color: #ddd;
+}
+html.theme_dark .modal-footer {
+ border-top-color: #111111;
+}
+html.theme_nord .modal-footer {
+ border-top-color: #2E3440;
+}
+html.theme_solarizedDark .modal-footer {
+ border-top-color: #002b36;
+}
+.modal-footer button {
+ margin-right: 10px;
+}
+.modal-footer button:last-child {
+ margin-right: 0;
+}
+.modal-footer .right {
+ margin-left: auto;
+ display: flex;
+}
+
+.modal-scrollbar-measure {
+ position: absolute;
+ top: -9999px;
+ width: 50px;
+ height: 50px;
+ overflow: scroll;
+}
+
+@media (min-width: 576px) {
+ .modal-dialog {
+ max-width: 500px;
+ margin: 1.75rem auto;
+ }
+
+ .modal-dialog-centered {
+ min-height: calc(100% - (1.75rem * 2));
+ }
+
+ .modal-content {
+ box-shadow: none;
+ }
+
+ .modal-sm {
+ max-width: 300px;
+ }
+}
+@media (min-width: 992px) {
+ .modal-lg {
+ max-width: 800px;
+ }
+}
+.close {
+ float: right;
+ font-size: 21px;
+ font-weight: bold;
+ line-height: 1;
+ color: black;
+ text-shadow: 0 1px 0 white;
+ opacity: 0.5;
+}
+.close:hover, .close:focus {
+ color: black;
+ text-decoration: none;
+ opacity: 0.75;
+}
+.close:not(:disabled):not(.disabled) {
+ cursor: pointer;
+}
+
+button.close {
+ padding: 0;
+ background-color: transparent;
+ border: 0;
+ -webkit-appearance: none;
+}
+
+.modal-content .box {
+ margin-top: 20px;
+}
+.modal-content .box:first-child {
+ margin-top: 0;
+}
+
+/*!
+ * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome
+ * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
+ */
+/* FONT PATH
+ * -------------------------- */
+@font-face {
+ font-family: "FontAwesome";
+ src: url(./fonts/fontawesome-webfont.eot);
+ src: url(./fonts/fontawesome-webfont.eot?#iefix&v=4.7.0) format("embedded-opentype"), url(./fonts/fontawesome-webfont.woff2) format("woff2"), url(./fonts/fontawesome-webfont.woff) format("woff"), url(./fonts/fontawesome-webfont.ttf) format("truetype"), url(./fonts/fontawesome-webfont.svg#fontawesomeregular) format("svg");
+ font-weight: normal;
+ font-style: normal;
+}
+.fa {
+ display: inline-block;
+ font: normal normal normal 14px/1 FontAwesome;
+ font-size: inherit;
+ text-rendering: auto;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+/* makes the font 33% larger relative to the icon container */
+.fa-lg {
+ font-size: 1.3333333333em;
+ line-height: 0.75em;
+ vertical-align: -15%;
+}
+
+.fa-2x {
+ font-size: 2em;
+}
+
+.fa-3x {
+ font-size: 3em;
+}
+
+.fa-4x {
+ font-size: 4em;
+}
+
+.fa-5x {
+ font-size: 5em;
+}
+
+.fa-fw {
+ width: 1.2857142857em;
+ text-align: center;
+}
+
+.fa-ul {
+ padding-left: 0;
+ margin-left: 2.1428571429em;
+ list-style-type: none;
+}
+.fa-ul > li {
+ position: relative;
+}
+
+.fa-li {
+ position: absolute;
+ left: -2.1428571429em;
+ width: 2.1428571429em;
+ top: 0.1428571429em;
+ text-align: center;
+}
+.fa-li.fa-lg {
+ left: -1.8571428571em;
+}
+
+.fa-border {
+ padding: 0.2em 0.25em 0.15em;
+ border: solid 0.08em #eee;
+ border-radius: 0.1em;
+}
+
+.fa-pull-left {
+ float: left;
+}
+
+.fa-pull-right {
+ float: right;
+}
+
+.fa.fa-pull-left {
+ margin-right: 0.3em;
+}
+.fa.fa-pull-right {
+ margin-left: 0.3em;
+}
+
+/* Deprecated as of 4.4.0 */
+.pull-right {
+ float: right;
+}
+
+.pull-left {
+ float: left;
+}
+
+.fa.pull-left {
+ margin-right: 0.3em;
+}
+.fa.pull-right {
+ margin-left: 0.3em;
+}
+
+.fa-spin {
+ -webkit-animation: fa-spin 2s infinite linear;
+ animation: fa-spin 2s infinite linear;
+}
+
+.fa-pulse {
+ -webkit-animation: fa-spin 1s infinite steps(8);
+ animation: fa-spin 1s infinite steps(8);
+}
+
+@-webkit-keyframes fa-spin {
+ 0% {
+ -webkit-transform: rotate(0deg);
+ transform: rotate(0deg);
+ }
+ 100% {
+ -webkit-transform: rotate(359deg);
+ transform: rotate(359deg);
+ }
+}
+@keyframes fa-spin {
+ 0% {
+ -webkit-transform: rotate(0deg);
+ transform: rotate(0deg);
+ }
+ 100% {
+ -webkit-transform: rotate(359deg);
+ transform: rotate(359deg);
+ }
+}
+.fa-rotate-90 {
+ -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";
+ -webkit-transform: rotate(90deg);
+ -ms-transform: rotate(90deg);
+ transform: rotate(90deg);
+}
+
+.fa-rotate-180 {
+ -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";
+ -webkit-transform: rotate(180deg);
+ -ms-transform: rotate(180deg);
+ transform: rotate(180deg);
+}
+
+.fa-rotate-270 {
+ -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";
+ -webkit-transform: rotate(270deg);
+ -ms-transform: rotate(270deg);
+ transform: rotate(270deg);
+}
+
+.fa-flip-horizontal {
+ -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";
+ -webkit-transform: scale(-1, 1);
+ -ms-transform: scale(-1, 1);
+ transform: scale(-1, 1);
+}
+
+.fa-flip-vertical {
+ -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";
+ -webkit-transform: scale(1, -1);
+ -ms-transform: scale(1, -1);
+ transform: scale(1, -1);
+}
+
+:root .fa-rotate-90,
+:root .fa-rotate-180,
+:root .fa-rotate-270,
+:root .fa-flip-horizontal,
+:root .fa-flip-vertical {
+ filter: none;
+}
+
+.fa-stack {
+ position: relative;
+ display: inline-block;
+ width: 2em;
+ height: 2em;
+ line-height: 2em;
+ vertical-align: middle;
+}
+
+.fa-stack-1x, .fa-stack-2x {
+ position: absolute;
+ left: 0;
+ width: 100%;
+ text-align: center;
+}
+
+.fa-stack-1x {
+ line-height: inherit;
+}
+
+.fa-stack-2x {
+ font-size: 2em;
+}
+
+.fa-inverse {
+ color: #fff;
+}
+
+/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen
+ readers do not read off random characters that represent icons */
+.fa-glass:before {
+ content: "\f000";
+}
+
+.fa-music:before {
+ content: "\f001";
+}
+
+.fa-search:before {
+ content: "\f002";
+}
+
+.fa-envelope-o:before {
+ content: "\f003";
+}
+
+.fa-heart:before {
+ content: "\f004";
+}
+
+.fa-star:before {
+ content: "\f005";
+}
+
+.fa-star-o:before {
+ content: "\f006";
+}
+
+.fa-user:before {
+ content: "\f007";
+}
+
+.fa-film:before {
+ content: "\f008";
+}
+
+.fa-th-large:before {
+ content: "\f009";
+}
+
+.fa-th:before {
+ content: "\f00a";
+}
+
+.fa-th-list:before {
+ content: "\f00b";
+}
+
+.fa-check:before {
+ content: "\f00c";
+}
+
+.fa-remove:before,
+.fa-close:before,
+.fa-times:before {
+ content: "\f00d";
+}
+
+.fa-search-plus:before {
+ content: "\f00e";
+}
+
+.fa-search-minus:before {
+ content: "\f010";
+}
+
+.fa-power-off:before {
+ content: "\f011";
+}
+
+.fa-signal:before {
+ content: "\f012";
+}
+
+.fa-gear:before,
+.fa-cog:before {
+ content: "\f013";
+}
+
+.fa-trash-o:before {
+ content: "\f014";
+}
+
+.fa-home:before {
+ content: "\f015";
+}
+
+.fa-file-o:before {
+ content: "\f016";
+}
+
+.fa-clock-o:before {
+ content: "\f017";
+}
+
+.fa-road:before {
+ content: "\f018";
+}
+
+.fa-download:before {
+ content: "\f019";
+}
+
+.fa-arrow-circle-o-down:before {
+ content: "\f01a";
+}
+
+.fa-arrow-circle-o-up:before {
+ content: "\f01b";
+}
+
+.fa-inbox:before {
+ content: "\f01c";
+}
+
+.fa-play-circle-o:before {
+ content: "\f01d";
+}
+
+.fa-rotate-right:before,
+.fa-repeat:before {
+ content: "\f01e";
+}
+
+.fa-refresh:before {
+ content: "\f021";
+}
+
+.fa-list-alt:before {
+ content: "\f022";
+}
+
+.fa-lock:before {
+ content: "\f023";
+}
+
+.fa-flag:before {
+ content: "\f024";
+}
+
+.fa-headphones:before {
+ content: "\f025";
+}
+
+.fa-volume-off:before {
+ content: "\f026";
+}
+
+.fa-volume-down:before {
+ content: "\f027";
+}
+
+.fa-volume-up:before {
+ content: "\f028";
+}
+
+.fa-qrcode:before {
+ content: "\f029";
+}
+
+.fa-barcode:before {
+ content: "\f02a";
+}
+
+.fa-tag:before {
+ content: "\f02b";
+}
+
+.fa-tags:before {
+ content: "\f02c";
+}
+
+.fa-book:before {
+ content: "\f02d";
+}
+
+.fa-bookmark:before {
+ content: "\f02e";
+}
+
+.fa-print:before {
+ content: "\f02f";
+}
+
+.fa-camera:before {
+ content: "\f030";
+}
+
+.fa-font:before {
+ content: "\f031";
+}
+
+.fa-bold:before {
+ content: "\f032";
+}
+
+.fa-italic:before {
+ content: "\f033";
+}
+
+.fa-text-height:before {
+ content: "\f034";
+}
+
+.fa-text-width:before {
+ content: "\f035";
+}
+
+.fa-align-left:before {
+ content: "\f036";
+}
+
+.fa-align-center:before {
+ content: "\f037";
+}
+
+.fa-align-right:before {
+ content: "\f038";
+}
+
+.fa-align-justify:before {
+ content: "\f039";
+}
+
+.fa-list:before {
+ content: "\f03a";
+}
+
+.fa-dedent:before,
+.fa-outdent:before {
+ content: "\f03b";
+}
+
+.fa-indent:before {
+ content: "\f03c";
+}
+
+.fa-video-camera:before {
+ content: "\f03d";
+}
+
+.fa-photo:before,
+.fa-image:before,
+.fa-picture-o:before {
+ content: "\f03e";
+}
+
+.fa-pencil:before {
+ content: "\f040";
+}
+
+.fa-map-marker:before {
+ content: "\f041";
+}
+
+.fa-adjust:before {
+ content: "\f042";
+}
+
+.fa-tint:before {
+ content: "\f043";
+}
+
+.fa-edit:before,
+.fa-pencil-square-o:before {
+ content: "\f044";
+}
+
+.fa-share-square-o:before {
+ content: "\f045";
+}
+
+.fa-check-square-o:before {
+ content: "\f046";
+}
+
+.fa-arrows:before {
+ content: "\f047";
+}
+
+.fa-step-backward:before {
+ content: "\f048";
+}
+
+.fa-fast-backward:before {
+ content: "\f049";
+}
+
+.fa-backward:before {
+ content: "\f04a";
+}
+
+.fa-play:before {
+ content: "\f04b";
+}
+
+.fa-pause:before {
+ content: "\f04c";
+}
+
+.fa-stop:before {
+ content: "\f04d";
+}
+
+.fa-forward:before {
+ content: "\f04e";
+}
+
+.fa-fast-forward:before {
+ content: "\f050";
+}
+
+.fa-step-forward:before {
+ content: "\f051";
+}
+
+.fa-eject:before {
+ content: "\f052";
+}
+
+.fa-chevron-left:before {
+ content: "\f053";
+}
+
+.fa-chevron-right:before {
+ content: "\f054";
+}
+
+.fa-plus-circle:before {
+ content: "\f055";
+}
+
+.fa-minus-circle:before {
+ content: "\f056";
+}
+
+.fa-times-circle:before {
+ content: "\f057";
+}
+
+.fa-check-circle:before {
+ content: "\f058";
+}
+
+.fa-question-circle:before {
+ content: "\f059";
+}
+
+.fa-info-circle:before {
+ content: "\f05a";
+}
+
+.fa-crosshairs:before {
+ content: "\f05b";
+}
+
+.fa-times-circle-o:before {
+ content: "\f05c";
+}
+
+.fa-check-circle-o:before {
+ content: "\f05d";
+}
+
+.fa-ban:before {
+ content: "\f05e";
+}
+
+.fa-arrow-left:before {
+ content: "\f060";
+}
+
+.fa-arrow-right:before {
+ content: "\f061";
+}
+
+.fa-arrow-up:before {
+ content: "\f062";
+}
+
+.fa-arrow-down:before {
+ content: "\f063";
+}
+
+.fa-mail-forward:before,
+.fa-share:before {
+ content: "\f064";
+}
+
+.fa-expand:before {
+ content: "\f065";
+}
+
+.fa-compress:before {
+ content: "\f066";
+}
+
+.fa-plus:before {
+ content: "\f067";
+}
+
+.fa-minus:before {
+ content: "\f068";
+}
+
+.fa-asterisk:before {
+ content: "\f069";
+}
+
+.fa-exclamation-circle:before {
+ content: "\f06a";
+}
+
+.fa-gift:before {
+ content: "\f06b";
+}
+
+.fa-leaf:before {
+ content: "\f06c";
+}
+
+.fa-fire:before {
+ content: "\f06d";
+}
+
+.fa-eye:before {
+ content: "\f06e";
+}
+
+.fa-eye-slash:before {
+ content: "\f070";
+}
+
+.fa-warning:before,
+.fa-exclamation-triangle:before {
+ content: "\f071";
+}
+
+.fa-plane:before {
+ content: "\f072";
+}
+
+.fa-calendar:before {
+ content: "\f073";
+}
+
+.fa-random:before {
+ content: "\f074";
+}
+
+.fa-comment:before {
+ content: "\f075";
+}
+
+.fa-magnet:before {
+ content: "\f076";
+}
+
+.fa-chevron-up:before {
+ content: "\f077";
+}
+
+.fa-chevron-down:before {
+ content: "\f078";
+}
+
+.fa-retweet:before {
+ content: "\f079";
+}
+
+.fa-shopping-cart:before {
+ content: "\f07a";
+}
+
+.fa-folder:before {
+ content: "\f07b";
+}
+
+.fa-folder-open:before {
+ content: "\f07c";
+}
+
+.fa-arrows-v:before {
+ content: "\f07d";
+}
+
+.fa-arrows-h:before {
+ content: "\f07e";
+}
+
+.fa-bar-chart-o:before,
+.fa-bar-chart:before {
+ content: "\f080";
+}
+
+.fa-twitter-square:before {
+ content: "\f081";
+}
+
+.fa-facebook-square:before {
+ content: "\f082";
+}
+
+.fa-camera-retro:before {
+ content: "\f083";
+}
+
+.fa-key:before {
+ content: "\f084";
+}
+
+.fa-gears:before,
+.fa-cogs:before {
+ content: "\f085";
+}
+
+.fa-comments:before {
+ content: "\f086";
+}
+
+.fa-thumbs-o-up:before {
+ content: "\f087";
+}
+
+.fa-thumbs-o-down:before {
+ content: "\f088";
+}
+
+.fa-star-half:before {
+ content: "\f089";
+}
+
+.fa-heart-o:before {
+ content: "\f08a";
+}
+
+.fa-sign-out:before {
+ content: "\f08b";
+}
+
+.fa-linkedin-square:before {
+ content: "\f08c";
+}
+
+.fa-thumb-tack:before {
+ content: "\f08d";
+}
+
+.fa-external-link:before {
+ content: "\f08e";
+}
+
+.fa-sign-in:before {
+ content: "\f090";
+}
+
+.fa-trophy:before {
+ content: "\f091";
+}
+
+.fa-github-square:before {
+ content: "\f092";
+}
+
+.fa-upload:before {
+ content: "\f093";
+}
+
+.fa-lemon-o:before {
+ content: "\f094";
+}
+
+.fa-phone:before {
+ content: "\f095";
+}
+
+.fa-square-o:before {
+ content: "\f096";
+}
+
+.fa-bookmark-o:before {
+ content: "\f097";
+}
+
+.fa-phone-square:before {
+ content: "\f098";
+}
+
+.fa-twitter:before {
+ content: "\f099";
+}
+
+.fa-facebook-f:before,
+.fa-facebook:before {
+ content: "\f09a";
+}
+
+.fa-github:before {
+ content: "\f09b";
+}
+
+.fa-unlock:before {
+ content: "\f09c";
+}
+
+.fa-credit-card:before {
+ content: "\f09d";
+}
+
+.fa-feed:before,
+.fa-rss:before {
+ content: "\f09e";
+}
+
+.fa-hdd-o:before {
+ content: "\f0a0";
+}
+
+.fa-bullhorn:before {
+ content: "\f0a1";
+}
+
+.fa-bell:before {
+ content: "\f0f3";
+}
+
+.fa-certificate:before {
+ content: "\f0a3";
+}
+
+.fa-hand-o-right:before {
+ content: "\f0a4";
+}
+
+.fa-hand-o-left:before {
+ content: "\f0a5";
+}
+
+.fa-hand-o-up:before {
+ content: "\f0a6";
+}
+
+.fa-hand-o-down:before {
+ content: "\f0a7";
+}
+
+.fa-arrow-circle-left:before {
+ content: "\f0a8";
+}
+
+.fa-arrow-circle-right:before {
+ content: "\f0a9";
+}
+
+.fa-arrow-circle-up:before {
+ content: "\f0aa";
+}
+
+.fa-arrow-circle-down:before {
+ content: "\f0ab";
+}
+
+.fa-globe:before {
+ content: "\f0ac";
+}
+
+.fa-wrench:before {
+ content: "\f0ad";
+}
+
+.fa-tasks:before {
+ content: "\f0ae";
+}
+
+.fa-filter:before {
+ content: "\f0b0";
+}
+
+.fa-briefcase:before {
+ content: "\f0b1";
+}
+
+.fa-arrows-alt:before {
+ content: "\f0b2";
+}
+
+.fa-group:before,
+.fa-users:before {
+ content: "\f0c0";
+}
+
+.fa-chain:before,
+.fa-link:before {
+ content: "\f0c1";
+}
+
+.fa-cloud:before {
+ content: "\f0c2";
+}
+
+.fa-flask:before {
+ content: "\f0c3";
+}
+
+.fa-cut:before,
+.fa-scissors:before {
+ content: "\f0c4";
+}
+
+.fa-copy:before,
+.fa-files-o:before {
+ content: "\f0c5";
+}
+
+.fa-paperclip:before {
+ content: "\f0c6";
+}
+
+.fa-save:before,
+.fa-floppy-o:before {
+ content: "\f0c7";
+}
+
+.fa-square:before {
+ content: "\f0c8";
+}
+
+.fa-navicon:before,
+.fa-reorder:before,
+.fa-bars:before {
+ content: "\f0c9";
+}
+
+.fa-list-ul:before {
+ content: "\f0ca";
+}
+
+.fa-list-ol:before {
+ content: "\f0cb";
+}
+
+.fa-strikethrough:before {
+ content: "\f0cc";
+}
+
+.fa-underline:before {
+ content: "\f0cd";
+}
+
+.fa-table:before {
+ content: "\f0ce";
+}
+
+.fa-magic:before {
+ content: "\f0d0";
+}
+
+.fa-truck:before {
+ content: "\f0d1";
+}
+
+.fa-pinterest:before {
+ content: "\f0d2";
+}
+
+.fa-pinterest-square:before {
+ content: "\f0d3";
+}
+
+.fa-google-plus-square:before {
+ content: "\f0d4";
+}
+
+.fa-google-plus:before {
+ content: "\f0d5";
+}
+
+.fa-money:before {
+ content: "\f0d6";
+}
+
+.fa-caret-down:before {
+ content: "\f0d7";
+}
+
+.fa-caret-up:before {
+ content: "\f0d8";
+}
+
+.fa-caret-left:before {
+ content: "\f0d9";
+}
+
+.fa-caret-right:before {
+ content: "\f0da";
+}
+
+.fa-columns:before {
+ content: "\f0db";
+}
+
+.fa-unsorted:before,
+.fa-sort:before {
+ content: "\f0dc";
+}
+
+.fa-sort-down:before,
+.fa-sort-desc:before {
+ content: "\f0dd";
+}
+
+.fa-sort-up:before,
+.fa-sort-asc:before {
+ content: "\f0de";
+}
+
+.fa-envelope:before {
+ content: "\f0e0";
+}
+
+.fa-linkedin:before {
+ content: "\f0e1";
+}
+
+.fa-rotate-left:before,
+.fa-undo:before {
+ content: "\f0e2";
+}
+
+.fa-legal:before,
+.fa-gavel:before {
+ content: "\f0e3";
+}
+
+.fa-dashboard:before,
+.fa-tachometer:before {
+ content: "\f0e4";
+}
+
+.fa-comment-o:before {
+ content: "\f0e5";
+}
+
+.fa-comments-o:before {
+ content: "\f0e6";
+}
+
+.fa-flash:before,
+.fa-bolt:before {
+ content: "\f0e7";
+}
+
+.fa-sitemap:before {
+ content: "\f0e8";
+}
+
+.fa-umbrella:before {
+ content: "\f0e9";
+}
+
+.fa-paste:before,
+.fa-clipboard:before {
+ content: "\f0ea";
+}
+
+.fa-lightbulb-o:before {
+ content: "\f0eb";
+}
+
+.fa-exchange:before {
+ content: "\f0ec";
+}
+
+.fa-cloud-download:before {
+ content: "\f0ed";
+}
+
+.fa-cloud-upload:before {
+ content: "\f0ee";
+}
+
+.fa-user-md:before {
+ content: "\f0f0";
+}
+
+.fa-stethoscope:before {
+ content: "\f0f1";
+}
+
+.fa-suitcase:before {
+ content: "\f0f2";
+}
+
+.fa-bell-o:before {
+ content: "\f0a2";
+}
+
+.fa-coffee:before {
+ content: "\f0f4";
+}
+
+.fa-cutlery:before {
+ content: "\f0f5";
+}
+
+.fa-file-text-o:before {
+ content: "\f0f6";
+}
+
+.fa-building-o:before {
+ content: "\f0f7";
+}
+
+.fa-hospital-o:before {
+ content: "\f0f8";
+}
+
+.fa-ambulance:before {
+ content: "\f0f9";
+}
+
+.fa-medkit:before {
+ content: "\f0fa";
+}
+
+.fa-fighter-jet:before {
+ content: "\f0fb";
+}
+
+.fa-beer:before {
+ content: "\f0fc";
+}
+
+.fa-h-square:before {
+ content: "\f0fd";
+}
+
+.fa-plus-square:before {
+ content: "\f0fe";
+}
+
+.fa-angle-double-left:before {
+ content: "\f100";
+}
+
+.fa-angle-double-right:before {
+ content: "\f101";
+}
+
+.fa-angle-double-up:before {
+ content: "\f102";
+}
+
+.fa-angle-double-down:before {
+ content: "\f103";
+}
+
+.fa-angle-left:before {
+ content: "\f104";
+}
+
+.fa-angle-right:before {
+ content: "\f105";
+}
+
+.fa-angle-up:before {
+ content: "\f106";
+}
+
+.fa-angle-down:before {
+ content: "\f107";
+}
+
+.fa-desktop:before {
+ content: "\f108";
+}
+
+.fa-laptop:before {
+ content: "\f109";
+}
+
+.fa-tablet:before {
+ content: "\f10a";
+}
+
+.fa-mobile-phone:before,
+.fa-mobile:before {
+ content: "\f10b";
+}
+
+.fa-circle-o:before {
+ content: "\f10c";
+}
+
+.fa-quote-left:before {
+ content: "\f10d";
+}
+
+.fa-quote-right:before {
+ content: "\f10e";
+}
+
+.fa-spinner:before {
+ content: "\f110";
+}
+
+.fa-circle:before {
+ content: "\f111";
+}
+
+.fa-mail-reply:before,
+.fa-reply:before {
+ content: "\f112";
+}
+
+.fa-github-alt:before {
+ content: "\f113";
+}
+
+.fa-folder-o:before {
+ content: "\f114";
+}
+
+.fa-folder-open-o:before {
+ content: "\f115";
+}
+
+.fa-smile-o:before {
+ content: "\f118";
+}
+
+.fa-frown-o:before {
+ content: "\f119";
+}
+
+.fa-meh-o:before {
+ content: "\f11a";
+}
+
+.fa-gamepad:before {
+ content: "\f11b";
+}
+
+.fa-keyboard-o:before {
+ content: "\f11c";
+}
+
+.fa-flag-o:before {
+ content: "\f11d";
+}
+
+.fa-flag-checkered:before {
+ content: "\f11e";
+}
+
+.fa-terminal:before {
+ content: "\f120";
+}
+
+.fa-code:before {
+ content: "\f121";
+}
+
+.fa-mail-reply-all:before,
+.fa-reply-all:before {
+ content: "\f122";
+}
+
+.fa-star-half-empty:before,
+.fa-star-half-full:before,
+.fa-star-half-o:before {
+ content: "\f123";
+}
+
+.fa-location-arrow:before {
+ content: "\f124";
+}
+
+.fa-crop:before {
+ content: "\f125";
+}
+
+.fa-code-fork:before {
+ content: "\f126";
+}
+
+.fa-unlink:before,
+.fa-chain-broken:before {
+ content: "\f127";
+}
+
+.fa-question:before {
+ content: "\f128";
+}
+
+.fa-info:before {
+ content: "\f129";
+}
+
+.fa-exclamation:before {
+ content: "\f12a";
+}
+
+.fa-superscript:before {
+ content: "\f12b";
+}
+
+.fa-subscript:before {
+ content: "\f12c";
+}
+
+.fa-eraser:before {
+ content: "\f12d";
+}
+
+.fa-puzzle-piece:before {
+ content: "\f12e";
+}
+
+.fa-microphone:before {
+ content: "\f130";
+}
+
+.fa-microphone-slash:before {
+ content: "\f131";
+}
+
+.fa-shield:before {
+ content: "\f132";
+}
+
+.fa-calendar-o:before {
+ content: "\f133";
+}
+
+.fa-fire-extinguisher:before {
+ content: "\f134";
+}
+
+.fa-rocket:before {
+ content: "\f135";
+}
+
+.fa-maxcdn:before {
+ content: "\f136";
+}
+
+.fa-chevron-circle-left:before {
+ content: "\f137";
+}
+
+.fa-chevron-circle-right:before {
+ content: "\f138";
+}
+
+.fa-chevron-circle-up:before {
+ content: "\f139";
+}
+
+.fa-chevron-circle-down:before {
+ content: "\f13a";
+}
+
+.fa-html5:before {
+ content: "\f13b";
+}
+
+.fa-css3:before {
+ content: "\f13c";
+}
+
+.fa-anchor:before {
+ content: "\f13d";
+}
+
+.fa-unlock-alt:before {
+ content: "\f13e";
+}
+
+.fa-bullseye:before {
+ content: "\f140";
+}
+
+.fa-ellipsis-h:before {
+ content: "\f141";
+}
+
+.fa-ellipsis-v:before {
+ content: "\f142";
+}
+
+.fa-rss-square:before {
+ content: "\f143";
+}
+
+.fa-play-circle:before {
+ content: "\f144";
+}
+
+.fa-ticket:before {
+ content: "\f145";
+}
+
+.fa-minus-square:before {
+ content: "\f146";
+}
+
+.fa-minus-square-o:before {
+ content: "\f147";
+}
+
+.fa-level-up:before {
+ content: "\f148";
+}
+
+.fa-level-down:before {
+ content: "\f149";
+}
+
+.fa-check-square:before {
+ content: "\f14a";
+}
+
+.fa-pencil-square:before {
+ content: "\f14b";
+}
+
+.fa-external-link-square:before {
+ content: "\f14c";
+}
+
+.fa-share-square:before {
+ content: "\f14d";
+}
+
+.fa-compass:before {
+ content: "\f14e";
+}
+
+.fa-toggle-down:before,
+.fa-caret-square-o-down:before {
+ content: "\f150";
+}
+
+.fa-toggle-up:before,
+.fa-caret-square-o-up:before {
+ content: "\f151";
+}
+
+.fa-toggle-right:before,
+.fa-caret-square-o-right:before {
+ content: "\f152";
+}
+
+.fa-euro:before,
+.fa-eur:before {
+ content: "\f153";
+}
+
+.fa-gbp:before {
+ content: "\f154";
+}
+
+.fa-dollar:before,
+.fa-usd:before {
+ content: "\f155";
+}
+
+.fa-rupee:before,
+.fa-inr:before {
+ content: "\f156";
+}
+
+.fa-cny:before,
+.fa-rmb:before,
+.fa-yen:before,
+.fa-jpy:before {
+ content: "\f157";
+}
+
+.fa-ruble:before,
+.fa-rouble:before,
+.fa-rub:before {
+ content: "\f158";
+}
+
+.fa-won:before,
+.fa-krw:before {
+ content: "\f159";
+}
+
+.fa-bitcoin:before,
+.fa-btc:before {
+ content: "\f15a";
+}
+
+.fa-file:before {
+ content: "\f15b";
+}
+
+.fa-file-text:before {
+ content: "\f15c";
+}
+
+.fa-sort-alpha-asc:before {
+ content: "\f15d";
+}
+
+.fa-sort-alpha-desc:before {
+ content: "\f15e";
+}
+
+.fa-sort-amount-asc:before {
+ content: "\f160";
+}
+
+.fa-sort-amount-desc:before {
+ content: "\f161";
+}
+
+.fa-sort-numeric-asc:before {
+ content: "\f162";
+}
+
+.fa-sort-numeric-desc:before {
+ content: "\f163";
+}
+
+.fa-thumbs-up:before {
+ content: "\f164";
+}
+
+.fa-thumbs-down:before {
+ content: "\f165";
+}
+
+.fa-youtube-square:before {
+ content: "\f166";
+}
+
+.fa-youtube:before {
+ content: "\f167";
+}
+
+.fa-xing:before {
+ content: "\f168";
+}
+
+.fa-xing-square:before {
+ content: "\f169";
+}
+
+.fa-youtube-play:before {
+ content: "\f16a";
+}
+
+.fa-dropbox:before {
+ content: "\f16b";
+}
+
+.fa-stack-overflow:before {
+ content: "\f16c";
+}
+
+.fa-instagram:before {
+ content: "\f16d";
+}
+
+.fa-flickr:before {
+ content: "\f16e";
+}
+
+.fa-adn:before {
+ content: "\f170";
+}
+
+.fa-bitbucket:before {
+ content: "\f171";
+}
+
+.fa-bitbucket-square:before {
+ content: "\f172";
+}
+
+.fa-tumblr:before {
+ content: "\f173";
+}
+
+.fa-tumblr-square:before {
+ content: "\f174";
+}
+
+.fa-long-arrow-down:before {
+ content: "\f175";
+}
+
+.fa-long-arrow-up:before {
+ content: "\f176";
+}
+
+.fa-long-arrow-left:before {
+ content: "\f177";
+}
+
+.fa-long-arrow-right:before {
+ content: "\f178";
+}
+
+.fa-apple:before {
+ content: "\f179";
+}
+
+.fa-windows:before {
+ content: "\f17a";
+}
+
+.fa-android:before {
+ content: "\f17b";
+}
+
+.fa-linux:before {
+ content: "\f17c";
+}
+
+.fa-dribbble:before {
+ content: "\f17d";
+}
+
+.fa-skype:before {
+ content: "\f17e";
+}
+
+.fa-foursquare:before {
+ content: "\f180";
+}
+
+.fa-trello:before {
+ content: "\f181";
+}
+
+.fa-female:before {
+ content: "\f182";
+}
+
+.fa-male:before {
+ content: "\f183";
+}
+
+.fa-gittip:before,
+.fa-gratipay:before {
+ content: "\f184";
+}
+
+.fa-sun-o:before {
+ content: "\f185";
+}
+
+.fa-moon-o:before {
+ content: "\f186";
+}
+
+.fa-archive:before {
+ content: "\f187";
+}
+
+.fa-bug:before {
+ content: "\f188";
+}
+
+.fa-vk:before {
+ content: "\f189";
+}
+
+.fa-weibo:before {
+ content: "\f18a";
+}
+
+.fa-renren:before {
+ content: "\f18b";
+}
+
+.fa-pagelines:before {
+ content: "\f18c";
+}
+
+.fa-stack-exchange:before {
+ content: "\f18d";
+}
+
+.fa-arrow-circle-o-right:before {
+ content: "\f18e";
+}
+
+.fa-arrow-circle-o-left:before {
+ content: "\f190";
+}
+
+.fa-toggle-left:before,
+.fa-caret-square-o-left:before {
+ content: "\f191";
+}
+
+.fa-dot-circle-o:before {
+ content: "\f192";
+}
+
+.fa-wheelchair:before {
+ content: "\f193";
+}
+
+.fa-vimeo-square:before {
+ content: "\f194";
+}
+
+.fa-turkish-lira:before,
+.fa-try:before {
+ content: "\f195";
+}
+
+.fa-plus-square-o:before {
+ content: "\f196";
+}
+
+.fa-space-shuttle:before {
+ content: "\f197";
+}
+
+.fa-slack:before {
+ content: "\f198";
+}
+
+.fa-envelope-square:before {
+ content: "\f199";
+}
+
+.fa-wordpress:before {
+ content: "\f19a";
+}
+
+.fa-openid:before {
+ content: "\f19b";
+}
+
+.fa-institution:before,
+.fa-bank:before,
+.fa-university:before {
+ content: "\f19c";
+}
+
+.fa-mortar-board:before,
+.fa-graduation-cap:before {
+ content: "\f19d";
+}
+
+.fa-yahoo:before {
+ content: "\f19e";
+}
+
+.fa-google:before {
+ content: "\f1a0";
+}
+
+.fa-reddit:before {
+ content: "\f1a1";
+}
+
+.fa-reddit-square:before {
+ content: "\f1a2";
+}
+
+.fa-stumbleupon-circle:before {
+ content: "\f1a3";
+}
+
+.fa-stumbleupon:before {
+ content: "\f1a4";
+}
+
+.fa-delicious:before {
+ content: "\f1a5";
+}
+
+.fa-digg:before {
+ content: "\f1a6";
+}
+
+.fa-pied-piper-pp:before {
+ content: "\f1a7";
+}
+
+.fa-pied-piper-alt:before {
+ content: "\f1a8";
+}
+
+.fa-drupal:before {
+ content: "\f1a9";
+}
+
+.fa-joomla:before {
+ content: "\f1aa";
+}
+
+.fa-language:before {
+ content: "\f1ab";
+}
+
+.fa-fax:before {
+ content: "\f1ac";
+}
+
+.fa-building:before {
+ content: "\f1ad";
+}
+
+.fa-child:before {
+ content: "\f1ae";
+}
+
+.fa-paw:before {
+ content: "\f1b0";
+}
+
+.fa-spoon:before {
+ content: "\f1b1";
+}
+
+.fa-cube:before {
+ content: "\f1b2";
+}
+
+.fa-cubes:before {
+ content: "\f1b3";
+}
+
+.fa-behance:before {
+ content: "\f1b4";
+}
+
+.fa-behance-square:before {
+ content: "\f1b5";
+}
+
+.fa-steam:before {
+ content: "\f1b6";
+}
+
+.fa-steam-square:before {
+ content: "\f1b7";
+}
+
+.fa-recycle:before {
+ content: "\f1b8";
+}
+
+.fa-automobile:before,
+.fa-car:before {
+ content: "\f1b9";
+}
+
+.fa-cab:before,
+.fa-taxi:before {
+ content: "\f1ba";
+}
+
+.fa-tree:before {
+ content: "\f1bb";
+}
+
+.fa-spotify:before {
+ content: "\f1bc";
+}
+
+.fa-deviantart:before {
+ content: "\f1bd";
+}
+
+.fa-soundcloud:before {
+ content: "\f1be";
+}
+
+.fa-database:before {
+ content: "\f1c0";
+}
+
+.fa-file-pdf-o:before {
+ content: "\f1c1";
+}
+
+.fa-file-word-o:before {
+ content: "\f1c2";
+}
+
+.fa-file-excel-o:before {
+ content: "\f1c3";
+}
+
+.fa-file-powerpoint-o:before {
+ content: "\f1c4";
+}
+
+.fa-file-photo-o:before,
+.fa-file-picture-o:before,
+.fa-file-image-o:before {
+ content: "\f1c5";
+}
+
+.fa-file-zip-o:before,
+.fa-file-archive-o:before {
+ content: "\f1c6";
+}
+
+.fa-file-sound-o:before,
+.fa-file-audio-o:before {
+ content: "\f1c7";
+}
+
+.fa-file-movie-o:before,
+.fa-file-video-o:before {
+ content: "\f1c8";
+}
+
+.fa-file-code-o:before {
+ content: "\f1c9";
+}
+
+.fa-vine:before {
+ content: "\f1ca";
+}
+
+.fa-codepen:before {
+ content: "\f1cb";
+}
+
+.fa-jsfiddle:before {
+ content: "\f1cc";
+}
+
+.fa-life-bouy:before,
+.fa-life-buoy:before,
+.fa-life-saver:before,
+.fa-support:before,
+.fa-life-ring:before {
+ content: "\f1cd";
+}
+
+.fa-circle-o-notch:before {
+ content: "\f1ce";
+}
+
+.fa-ra:before,
+.fa-resistance:before,
+.fa-rebel:before {
+ content: "\f1d0";
+}
+
+.fa-ge:before,
+.fa-empire:before {
+ content: "\f1d1";
+}
+
+.fa-git-square:before {
+ content: "\f1d2";
+}
+
+.fa-git:before {
+ content: "\f1d3";
+}
+
+.fa-y-combinator-square:before,
+.fa-yc-square:before,
+.fa-hacker-news:before {
+ content: "\f1d4";
+}
+
+.fa-tencent-weibo:before {
+ content: "\f1d5";
+}
+
+.fa-qq:before {
+ content: "\f1d6";
+}
+
+.fa-wechat:before,
+.fa-weixin:before {
+ content: "\f1d7";
+}
+
+.fa-send:before,
+.fa-paper-plane:before {
+ content: "\f1d8";
+}
+
+.fa-send-o:before,
+.fa-paper-plane-o:before {
+ content: "\f1d9";
+}
+
+.fa-history:before {
+ content: "\f1da";
+}
+
+.fa-circle-thin:before {
+ content: "\f1db";
+}
+
+.fa-header:before {
+ content: "\f1dc";
+}
+
+.fa-paragraph:before {
+ content: "\f1dd";
+}
+
+.fa-sliders:before {
+ content: "\f1de";
+}
+
+.fa-share-alt:before {
+ content: "\f1e0";
+}
+
+.fa-share-alt-square:before {
+ content: "\f1e1";
+}
+
+.fa-bomb:before {
+ content: "\f1e2";
+}
+
+.fa-soccer-ball-o:before,
+.fa-futbol-o:before {
+ content: "\f1e3";
+}
+
+.fa-tty:before {
+ content: "\f1e4";
+}
+
+.fa-binoculars:before {
+ content: "\f1e5";
+}
+
+.fa-plug:before {
+ content: "\f1e6";
+}
+
+.fa-slideshare:before {
+ content: "\f1e7";
+}
+
+.fa-twitch:before {
+ content: "\f1e8";
+}
+
+.fa-yelp:before {
+ content: "\f1e9";
+}
+
+.fa-newspaper-o:before {
+ content: "\f1ea";
+}
+
+.fa-wifi:before {
+ content: "\f1eb";
+}
+
+.fa-calculator:before {
+ content: "\f1ec";
+}
+
+.fa-paypal:before {
+ content: "\f1ed";
+}
+
+.fa-google-wallet:before {
+ content: "\f1ee";
+}
+
+.fa-cc-visa:before {
+ content: "\f1f0";
+}
+
+.fa-cc-mastercard:before {
+ content: "\f1f1";
+}
+
+.fa-cc-discover:before {
+ content: "\f1f2";
+}
+
+.fa-cc-amex:before {
+ content: "\f1f3";
+}
+
+.fa-cc-paypal:before {
+ content: "\f1f4";
+}
+
+.fa-cc-stripe:before {
+ content: "\f1f5";
+}
+
+.fa-bell-slash:before {
+ content: "\f1f6";
+}
+
+.fa-bell-slash-o:before {
+ content: "\f1f7";
+}
+
+.fa-trash:before {
+ content: "\f1f8";
+}
+
+.fa-copyright:before {
+ content: "\f1f9";
+}
+
+.fa-at:before {
+ content: "\f1fa";
+}
+
+.fa-eyedropper:before {
+ content: "\f1fb";
+}
+
+.fa-paint-brush:before {
+ content: "\f1fc";
+}
+
+.fa-birthday-cake:before {
+ content: "\f1fd";
+}
+
+.fa-area-chart:before {
+ content: "\f1fe";
+}
+
+.fa-pie-chart:before {
+ content: "\f200";
+}
+
+.fa-line-chart:before {
+ content: "\f201";
+}
+
+.fa-lastfm:before {
+ content: "\f202";
+}
+
+.fa-lastfm-square:before {
+ content: "\f203";
+}
+
+.fa-toggle-off:before {
+ content: "\f204";
+}
+
+.fa-toggle-on:before {
+ content: "\f205";
+}
+
+.fa-bicycle:before {
+ content: "\f206";
+}
+
+.fa-bus:before {
+ content: "\f207";
+}
+
+.fa-ioxhost:before {
+ content: "\f208";
+}
+
+.fa-angellist:before {
+ content: "\f209";
+}
+
+.fa-cc:before {
+ content: "\f20a";
+}
+
+.fa-shekel:before,
+.fa-sheqel:before,
+.fa-ils:before {
+ content: "\f20b";
+}
+
+.fa-meanpath:before {
+ content: "\f20c";
+}
+
+.fa-buysellads:before {
+ content: "\f20d";
+}
+
+.fa-connectdevelop:before {
+ content: "\f20e";
+}
+
+.fa-dashcube:before {
+ content: "\f210";
+}
+
+.fa-forumbee:before {
+ content: "\f211";
+}
+
+.fa-leanpub:before {
+ content: "\f212";
+}
+
+.fa-sellsy:before {
+ content: "\f213";
+}
+
+.fa-shirtsinbulk:before {
+ content: "\f214";
+}
+
+.fa-simplybuilt:before {
+ content: "\f215";
+}
+
+.fa-skyatlas:before {
+ content: "\f216";
+}
+
+.fa-cart-plus:before {
+ content: "\f217";
+}
+
+.fa-cart-arrow-down:before {
+ content: "\f218";
+}
+
+.fa-diamond:before {
+ content: "\f219";
+}
+
+.fa-ship:before {
+ content: "\f21a";
+}
+
+.fa-user-secret:before {
+ content: "\f21b";
+}
+
+.fa-motorcycle:before {
+ content: "\f21c";
+}
+
+.fa-street-view:before {
+ content: "\f21d";
+}
+
+.fa-heartbeat:before {
+ content: "\f21e";
+}
+
+.fa-venus:before {
+ content: "\f221";
+}
+
+.fa-mars:before {
+ content: "\f222";
+}
+
+.fa-mercury:before {
+ content: "\f223";
+}
+
+.fa-intersex:before,
+.fa-transgender:before {
+ content: "\f224";
+}
+
+.fa-transgender-alt:before {
+ content: "\f225";
+}
+
+.fa-venus-double:before {
+ content: "\f226";
+}
+
+.fa-mars-double:before {
+ content: "\f227";
+}
+
+.fa-venus-mars:before {
+ content: "\f228";
+}
+
+.fa-mars-stroke:before {
+ content: "\f229";
+}
+
+.fa-mars-stroke-v:before {
+ content: "\f22a";
+}
+
+.fa-mars-stroke-h:before {
+ content: "\f22b";
+}
+
+.fa-neuter:before {
+ content: "\f22c";
+}
+
+.fa-genderless:before {
+ content: "\f22d";
+}
+
+.fa-facebook-official:before {
+ content: "\f230";
+}
+
+.fa-pinterest-p:before {
+ content: "\f231";
+}
+
+.fa-whatsapp:before {
+ content: "\f232";
+}
+
+.fa-server:before {
+ content: "\f233";
+}
+
+.fa-user-plus:before {
+ content: "\f234";
+}
+
+.fa-user-times:before {
+ content: "\f235";
+}
+
+.fa-hotel:before,
+.fa-bed:before {
+ content: "\f236";
+}
+
+.fa-viacoin:before {
+ content: "\f237";
+}
+
+.fa-train:before {
+ content: "\f238";
+}
+
+.fa-subway:before {
+ content: "\f239";
+}
+
+.fa-medium:before {
+ content: "\f23a";
+}
+
+.fa-yc:before,
+.fa-y-combinator:before {
+ content: "\f23b";
+}
+
+.fa-optin-monster:before {
+ content: "\f23c";
+}
+
+.fa-opencart:before {
+ content: "\f23d";
+}
+
+.fa-expeditedssl:before {
+ content: "\f23e";
+}
+
+.fa-battery-4:before,
+.fa-battery:before,
+.fa-battery-full:before {
+ content: "\f240";
+}
+
+.fa-battery-3:before,
+.fa-battery-three-quarters:before {
+ content: "\f241";
+}
+
+.fa-battery-2:before,
+.fa-battery-half:before {
+ content: "\f242";
+}
+
+.fa-battery-1:before,
+.fa-battery-quarter:before {
+ content: "\f243";
+}
+
+.fa-battery-0:before,
+.fa-battery-empty:before {
+ content: "\f244";
+}
+
+.fa-mouse-pointer:before {
+ content: "\f245";
+}
+
+.fa-i-cursor:before {
+ content: "\f246";
+}
+
+.fa-object-group:before {
+ content: "\f247";
+}
+
+.fa-object-ungroup:before {
+ content: "\f248";
+}
+
+.fa-sticky-note:before {
+ content: "\f249";
+}
+
+.fa-sticky-note-o:before {
+ content: "\f24a";
+}
+
+.fa-cc-jcb:before {
+ content: "\f24b";
+}
+
+.fa-cc-diners-club:before {
+ content: "\f24c";
+}
+
+.fa-clone:before {
+ content: "\f24d";
+}
+
+.fa-balance-scale:before {
+ content: "\f24e";
+}
+
+.fa-hourglass-o:before {
+ content: "\f250";
+}
+
+.fa-hourglass-1:before,
+.fa-hourglass-start:before {
+ content: "\f251";
+}
+
+.fa-hourglass-2:before,
+.fa-hourglass-half:before {
+ content: "\f252";
+}
+
+.fa-hourglass-3:before,
+.fa-hourglass-end:before {
+ content: "\f253";
+}
+
+.fa-hourglass:before {
+ content: "\f254";
+}
+
+.fa-hand-grab-o:before,
+.fa-hand-rock-o:before {
+ content: "\f255";
+}
+
+.fa-hand-stop-o:before,
+.fa-hand-paper-o:before {
+ content: "\f256";
+}
+
+.fa-hand-scissors-o:before {
+ content: "\f257";
+}
+
+.fa-hand-lizard-o:before {
+ content: "\f258";
+}
+
+.fa-hand-spock-o:before {
+ content: "\f259";
+}
+
+.fa-hand-pointer-o:before {
+ content: "\f25a";
+}
+
+.fa-hand-peace-o:before {
+ content: "\f25b";
+}
+
+.fa-trademark:before {
+ content: "\f25c";
+}
+
+.fa-registered:before {
+ content: "\f25d";
+}
+
+.fa-creative-commons:before {
+ content: "\f25e";
+}
+
+.fa-gg:before {
+ content: "\f260";
+}
+
+.fa-gg-circle:before {
+ content: "\f261";
+}
+
+.fa-tripadvisor:before {
+ content: "\f262";
+}
+
+.fa-odnoklassniki:before {
+ content: "\f263";
+}
+
+.fa-odnoklassniki-square:before {
+ content: "\f264";
+}
+
+.fa-get-pocket:before {
+ content: "\f265";
+}
+
+.fa-wikipedia-w:before {
+ content: "\f266";
+}
+
+.fa-safari:before {
+ content: "\f267";
+}
+
+.fa-chrome:before {
+ content: "\f268";
+}
+
+.fa-firefox:before {
+ content: "\f269";
+}
+
+.fa-opera:before {
+ content: "\f26a";
+}
+
+.fa-internet-explorer:before {
+ content: "\f26b";
+}
+
+.fa-tv:before,
+.fa-television:before {
+ content: "\f26c";
+}
+
+.fa-contao:before {
+ content: "\f26d";
+}
+
+.fa-500px:before {
+ content: "\f26e";
+}
+
+.fa-amazon:before {
+ content: "\f270";
+}
+
+.fa-calendar-plus-o:before {
+ content: "\f271";
+}
+
+.fa-calendar-minus-o:before {
+ content: "\f272";
+}
+
+.fa-calendar-times-o:before {
+ content: "\f273";
+}
+
+.fa-calendar-check-o:before {
+ content: "\f274";
+}
+
+.fa-industry:before {
+ content: "\f275";
+}
+
+.fa-map-pin:before {
+ content: "\f276";
+}
+
+.fa-map-signs:before {
+ content: "\f277";
+}
+
+.fa-map-o:before {
+ content: "\f278";
+}
+
+.fa-map:before {
+ content: "\f279";
+}
+
+.fa-commenting:before {
+ content: "\f27a";
+}
+
+.fa-commenting-o:before {
+ content: "\f27b";
+}
+
+.fa-houzz:before {
+ content: "\f27c";
+}
+
+.fa-vimeo:before {
+ content: "\f27d";
+}
+
+.fa-black-tie:before {
+ content: "\f27e";
+}
+
+.fa-fonticons:before {
+ content: "\f280";
+}
+
+.fa-reddit-alien:before {
+ content: "\f281";
+}
+
+.fa-edge:before {
+ content: "\f282";
+}
+
+.fa-credit-card-alt:before {
+ content: "\f283";
+}
+
+.fa-codiepie:before {
+ content: "\f284";
+}
+
+.fa-modx:before {
+ content: "\f285";
+}
+
+.fa-fort-awesome:before {
+ content: "\f286";
+}
+
+.fa-usb:before {
+ content: "\f287";
+}
+
+.fa-product-hunt:before {
+ content: "\f288";
+}
+
+.fa-mixcloud:before {
+ content: "\f289";
+}
+
+.fa-scribd:before {
+ content: "\f28a";
+}
+
+.fa-pause-circle:before {
+ content: "\f28b";
+}
+
+.fa-pause-circle-o:before {
+ content: "\f28c";
+}
+
+.fa-stop-circle:before {
+ content: "\f28d";
+}
+
+.fa-stop-circle-o:before {
+ content: "\f28e";
+}
+
+.fa-shopping-bag:before {
+ content: "\f290";
+}
+
+.fa-shopping-basket:before {
+ content: "\f291";
+}
+
+.fa-hashtag:before {
+ content: "\f292";
+}
+
+.fa-bluetooth:before {
+ content: "\f293";
+}
+
+.fa-bluetooth-b:before {
+ content: "\f294";
+}
+
+.fa-percent:before {
+ content: "\f295";
+}
+
+.fa-gitlab:before {
+ content: "\f296";
+}
+
+.fa-wpbeginner:before {
+ content: "\f297";
+}
+
+.fa-wpforms:before {
+ content: "\f298";
+}
+
+.fa-envira:before {
+ content: "\f299";
+}
+
+.fa-universal-access:before {
+ content: "\f29a";
+}
+
+.fa-wheelchair-alt:before {
+ content: "\f29b";
+}
+
+.fa-question-circle-o:before {
+ content: "\f29c";
+}
+
+.fa-blind:before {
+ content: "\f29d";
+}
+
+.fa-audio-description:before {
+ content: "\f29e";
+}
+
+.fa-volume-control-phone:before {
+ content: "\f2a0";
+}
+
+.fa-braille:before {
+ content: "\f2a1";
+}
+
+.fa-assistive-listening-systems:before {
+ content: "\f2a2";
+}
+
+.fa-asl-interpreting:before,
+.fa-american-sign-language-interpreting:before {
+ content: "\f2a3";
+}
+
+.fa-deafness:before,
+.fa-hard-of-hearing:before,
+.fa-deaf:before {
+ content: "\f2a4";
+}
+
+.fa-glide:before {
+ content: "\f2a5";
+}
+
+.fa-glide-g:before {
+ content: "\f2a6";
+}
+
+.fa-signing:before,
+.fa-sign-language:before {
+ content: "\f2a7";
+}
+
+.fa-low-vision:before {
+ content: "\f2a8";
+}
+
+.fa-viadeo:before {
+ content: "\f2a9";
+}
+
+.fa-viadeo-square:before {
+ content: "\f2aa";
+}
+
+.fa-snapchat:before {
+ content: "\f2ab";
+}
+
+.fa-snapchat-ghost:before {
+ content: "\f2ac";
+}
+
+.fa-snapchat-square:before {
+ content: "\f2ad";
+}
+
+.fa-pied-piper:before {
+ content: "\f2ae";
+}
+
+.fa-first-order:before {
+ content: "\f2b0";
+}
+
+.fa-yoast:before {
+ content: "\f2b1";
+}
+
+.fa-themeisle:before {
+ content: "\f2b2";
+}
+
+.fa-google-plus-circle:before,
+.fa-google-plus-official:before {
+ content: "\f2b3";
+}
+
+.fa-fa:before,
+.fa-font-awesome:before {
+ content: "\f2b4";
+}
+
+.fa-handshake-o:before {
+ content: "\f2b5";
+}
+
+.fa-envelope-open:before {
+ content: "\f2b6";
+}
+
+.fa-envelope-open-o:before {
+ content: "\f2b7";
+}
+
+.fa-linode:before {
+ content: "\f2b8";
+}
+
+.fa-address-book:before {
+ content: "\f2b9";
+}
+
+.fa-address-book-o:before {
+ content: "\f2ba";
+}
+
+.fa-vcard:before,
+.fa-address-card:before {
+ content: "\f2bb";
+}
+
+.fa-vcard-o:before,
+.fa-address-card-o:before {
+ content: "\f2bc";
+}
+
+.fa-user-circle:before {
+ content: "\f2bd";
+}
+
+.fa-user-circle-o:before {
+ content: "\f2be";
+}
+
+.fa-user-o:before {
+ content: "\f2c0";
+}
+
+.fa-id-badge:before {
+ content: "\f2c1";
+}
+
+.fa-drivers-license:before,
+.fa-id-card:before {
+ content: "\f2c2";
+}
+
+.fa-drivers-license-o:before,
+.fa-id-card-o:before {
+ content: "\f2c3";
+}
+
+.fa-quora:before {
+ content: "\f2c4";
+}
+
+.fa-free-code-camp:before {
+ content: "\f2c5";
+}
+
+.fa-telegram:before {
+ content: "\f2c6";
+}
+
+.fa-thermometer-4:before,
+.fa-thermometer:before,
+.fa-thermometer-full:before {
+ content: "\f2c7";
+}
+
+.fa-thermometer-3:before,
+.fa-thermometer-three-quarters:before {
+ content: "\f2c8";
+}
+
+.fa-thermometer-2:before,
+.fa-thermometer-half:before {
+ content: "\f2c9";
+}
+
+.fa-thermometer-1:before,
+.fa-thermometer-quarter:before {
+ content: "\f2ca";
+}
+
+.fa-thermometer-0:before,
+.fa-thermometer-empty:before {
+ content: "\f2cb";
+}
+
+.fa-shower:before {
+ content: "\f2cc";
+}
+
+.fa-bathtub:before,
+.fa-s15:before,
+.fa-bath:before {
+ content: "\f2cd";
+}
+
+.fa-podcast:before {
+ content: "\f2ce";
+}
+
+.fa-window-maximize:before {
+ content: "\f2d0";
+}
+
+.fa-window-minimize:before {
+ content: "\f2d1";
+}
+
+.fa-window-restore:before {
+ content: "\f2d2";
+}
+
+.fa-times-rectangle:before,
+.fa-window-close:before {
+ content: "\f2d3";
+}
+
+.fa-times-rectangle-o:before,
+.fa-window-close-o:before {
+ content: "\f2d4";
+}
+
+.fa-bandcamp:before {
+ content: "\f2d5";
+}
+
+.fa-grav:before {
+ content: "\f2d6";
+}
+
+.fa-etsy:before {
+ content: "\f2d7";
+}
+
+.fa-imdb:before {
+ content: "\f2d8";
+}
+
+.fa-ravelry:before {
+ content: "\f2d9";
+}
+
+.fa-eercast:before {
+ content: "\f2da";
+}
+
+.fa-microchip:before {
+ content: "\f2db";
+}
+
+.fa-snowflake-o:before {
+ content: "\f2dc";
+}
+
+.fa-superpowers:before {
+ content: "\f2dd";
+}
+
+.fa-wpexplorer:before {
+ content: "\f2de";
+}
+
+.fa-meetup:before {
+ content: "\f2e0";
+}
+
+.sr-only {
+ position: absolute;
+ width: 1px;
+ height: 1px;
+ padding: 0;
+ margin: -1px;
+ overflow: hidden;
+ clip: rect(0, 0, 0, 0);
+ border: 0;
+}
+
+.sr-only-focusable:active, .sr-only-focusable:focus {
+ position: static;
+ width: auto;
+ height: auto;
+ margin: 0;
+ overflow: visible;
+ clip: auto;
+}
+
+.toast {
+ display: flex;
+ flex-direction: row;
+ align-content: center;
+ justify-content: center;
+ position: relative;
+ background-color: #030303;
+}
+
+.toast-success {
+ background-color: #51a351;
+}
+
+.toast-error {
+ background-color: #bd362f;
+}
+
+.toast-info {
+ background-color: #2f96b4;
+}
+
+.toast-wait {
+ background-color: #2f96b4;
+}
+
+.toast-warning {
+ background-color: #f89406;
+}
+
+.icon-success {
+ background-repeat: no-repeat;
+ background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADsSURBVEhLY2AYBfQMgf///3P8+/evAIgvA/FsIF+BavYDDWMBGroaSMMBiE8VC7AZDrIFaMFnii3AZTjUgsUUWUDA8OdAH6iQbQEhw4HyGsPEcKBXBIC4ARhex4G4BsjmweU1soIFaGg/WtoFZRIZdEvIMhxkCCjXIVsATV6gFGACs4Rsw0EGgIIH3QJYJgHSARQZDrWAB+jawzgs+Q2UO49D7jnRSRGoEFRILcdmEMWGI0cm0JJ2QpYA1RDvcmzJEWhABhD/pqrL0S0CWuABKgnRki9lLseS7g2AlqwHWQSKH4oKLrILpRGhEQCw2LiRUIa4lwAAAABJRU5ErkJggg==") !important;
+}
+
+.icon-error {
+ background-repeat: no-repeat;
+ background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHOSURBVEhLrZa/SgNBEMZzh0WKCClSCKaIYOED+AAKeQQLG8HWztLCImBrYadgIdY+gIKNYkBFSwu7CAoqCgkkoGBI/E28PdbLZmeDLgzZzcx83/zZ2SSXC1j9fr+I1Hq93g2yxH4iwM1vkoBWAdxCmpzTxfkN2RcyZNaHFIkSo10+8kgxkXIURV5HGxTmFuc75B2RfQkpxHG8aAgaAFa0tAHqYFfQ7Iwe2yhODk8+J4C7yAoRTWI3w/4klGRgR4lO7Rpn9+gvMyWp+uxFh8+H+ARlgN1nJuJuQAYvNkEnwGFck18Er4q3egEc/oO+mhLdKgRyhdNFiacC0rlOCbhNVz4H9FnAYgDBvU3QIioZlJFLJtsoHYRDfiZoUyIxqCtRpVlANq0EU4dApjrtgezPFad5S19Wgjkc0hNVnuF4HjVA6C7QrSIbylB+oZe3aHgBsqlNqKYH48jXyJKMuAbiyVJ8KzaB3eRc0pg9VwQ4niFryI68qiOi3AbjwdsfnAtk0bCjTLJKr6mrD9g8iq/S/B81hguOMlQTnVyG40wAcjnmgsCNESDrjme7wfftP4P7SP4N3CJZdvzoNyGq2c/HWOXJGsvVg+RA/k2MC/wN6I2YA2Pt8GkAAAAASUVORK5CYII=") !important;
+}
+
+.icon-info {
+ background-repeat: no-repeat;
+ background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGwSURBVEhLtZa9SgNBEMc9sUxxRcoUKSzSWIhXpFMhhYWFhaBg4yPYiWCXZxBLERsLRS3EQkEfwCKdjWJAwSKCgoKCcudv4O5YLrt7EzgXhiU3/4+b2ckmwVjJSpKkQ6wAi4gwhT+z3wRBcEz0yjSseUTrcRyfsHsXmD0AmbHOC9Ii8VImnuXBPglHpQ5wwSVM7sNnTG7Za4JwDdCjxyAiH3nyA2mtaTJufiDZ5dCaqlItILh1NHatfN5skvjx9Z38m69CgzuXmZgVrPIGE763Jx9qKsRozWYw6xOHdER+nn2KkO+Bb+UV5CBN6WC6QtBgbRVozrahAbmm6HtUsgtPC19tFdxXZYBOfkbmFJ1VaHA1VAHjd0pp70oTZzvR+EVrx2Ygfdsq6eu55BHYR8hlcki+n+kERUFG8BrA0BwjeAv2M8WLQBtcy+SD6fNsmnB3AlBLrgTtVW1c2QN4bVWLATaIS60J2Du5y1TiJgjSBvFVZgTmwCU+dAZFoPxGEEs8nyHC9Bwe2GvEJv2WXZb0vjdyFT4Cxk3e/kIqlOGoVLwwPevpYHT+00T+hWwXDf4AJAOUqWcDhbwAAAAASUVORK5CYII=") !important;
+}
+
+.icon-wait {
+ background-repeat: no-repeat;
+ background-image: url("data:image/gif;base64,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") !important;
+}
+
+.icon-warning {
+ background-repeat: no-repeat;
+ background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGYSURBVEhL5ZSvTsNQFMbXZGICMYGYmJhAQIJAICYQPAACiSDB8AiICQQJT4CqQEwgJvYASAQCiZiYmJhAIBATCARJy+9rTsldd8sKu1M0+dLb057v6/lbq/2rK0mS/TRNj9cWNAKPYIJII7gIxCcQ51cvqID+GIEX8ASG4B1bK5gIZFeQfoJdEXOfgX4QAQg7kH2A65yQ87lyxb27sggkAzAuFhbbg1K2kgCkB1bVwyIR9m2L7PRPIhDUIXgGtyKw575yz3lTNs6X4JXnjV+LKM/m3MydnTbtOKIjtz6VhCBq4vSm3ncdrD2lk0VgUXSVKjVDJXJzijW1RQdsU7F77He8u68koNZTz8Oz5yGa6J3H3lZ0xYgXBK2QymlWWA+RWnYhskLBv2vmE+hBMCtbA7KX5drWyRT/2JsqZ2IvfB9Y4bWDNMFbJRFmC9E74SoS0CqulwjkC0+5bpcV1CZ8NMej4pjy0U+doDQsGyo1hzVJttIjhQ7GnBtRFN1UarUlH8F3xict+HY07rEzoUGPlWcjRFRr4/gChZgc3ZL2d8oAAAAASUVORK5CYII=") !important;
+}
+
+.toaster-icon {
+ font-weight: normal;
+ color: #ffffff;
+}
+
+.toast-content {
+ flex-grow: 1;
+ padding: 15px 15px 15px 50px;
+}
+
+.toast-title {
+ font-weight: bold;
+}
+
+.toast-message {
+ word-wrap: break-word;
+}
+.toast-message a, .toast-message label {
+ color: #ffffff;
+}
+.toast-message a:hover {
+ color: #cccccc;
+ text-decoration: none;
+}
+
+.toast-close-button, button.toast-close-button {
+ align-self: flex-start;
+ padding: 3px;
+ font-size: 23px;
+ line-height: 90%;
+ font-weight: bold;
+ color: #ffffff;
+ text-shadow: 0 1px 0 #ffffff;
+ opacity: 0.7;
+ z-index: 999;
+ cursor: pointer;
+ background: transparent;
+ border: 0;
+}
+.toast-close-button:hover, .toast-close-button:focus {
+ color: #000000;
+ text-decoration: none;
+ cursor: pointer;
+ opacity: 0.4;
+ border: none;
+}
+.toast-close-button span {
+ display: flex;
+ flex-direction: column;
+ align-items: flex-start;
+}
+
+.toast-progress-bar {
+ position: absolute;
+ left: 0;
+ bottom: 0;
+ height: 4px;
+ background-color: #000000;
+ opacity: 0.4;
+}
+
+/*Additional properties for button version
+ iOS requires the button element instead of an anchor tag.
+ If you want the anchor version, it requires `href="#"`.*/
+.toast-container {
+ position: fixed;
+ z-index: 999999;
+ /*overrides*/
+ pointer-events: auto;
+}
+
+.toast-container.toast-center,
+.toast-container.toast-top-center,
+.toast-container.toast-bottom-center {
+ width: 100%;
+ pointer-events: none;
+ left: 0;
+ right: 0;
+}
+
+.toast-container.toast-center > div,
+.toast-container.toast-top-center > div,
+.toast-container.toast-bottom-center > div {
+ margin: 6px auto;
+ pointer-events: auto;
+}
+
+.toast-container.toast-center > button,
+.toast-container.toast-top-center > button,
+.toast-container.toast-bottom-center > button {
+ pointer-events: auto;
+}
+
+.toast-container * {
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+}
+
+.toast-container > div {
+ margin: 0 0 6px;
+ width: 300px;
+ border-radius: 3px 3px 3px 3px;
+ background-position: 15px center;
+ background-repeat: no-repeat;
+ box-shadow: 0 0 12px #999999;
+ color: #ffffff;
+ opacity: 0.8;
+}
+
+.toast-container > :hover {
+ box-shadow: 0 0 12px #000000;
+ opacity: 1;
+ cursor: pointer;
+}
+
+.toast-container.toast-top-full-width > div,
+.toast-container.toast-bottom-full-width > div {
+ width: 96%;
+ margin: auto;
+}
+
+.toast-top-full-width {
+ top: 0;
+ right: 0;
+ width: 100%;
+}
+
+.toast-bottom-full-width {
+ bottom: 0;
+ right: 0;
+ width: 100%;
+}
+
+.toast-top-left {
+ top: 12px;
+ left: 12px;
+}
+
+.toast-top-center {
+ top: 12px;
+}
+
+.toast-top-right {
+ top: 12px;
+ right: 12px;
+}
+
+.toast-bottom-right {
+ right: 12px;
+ bottom: 12px;
+}
+
+.toast-bottom-center {
+ bottom: 12px;
+}
+
+.toast-bottom-left {
+ bottom: 12px;
+ left: 12px;
+}
+
+.toast-center {
+ top: 45%;
+}
+
+.swal2-popup.swal2-toast {
+ flex-direction: column;
+ align-items: stretch;
+ width: auto;
+ padding: 1.25em;
+ overflow-y: hidden;
+ background: #fff;
+ box-shadow: 0 0 0.625em #d9d9d9;
+}
+.swal2-popup.swal2-toast .swal2-header {
+ flex-direction: row;
+ padding: 0;
+}
+.swal2-popup.swal2-toast .swal2-title {
+ flex-grow: 1;
+ justify-content: flex-start;
+ margin: 0 0.625em;
+ font-size: 1em;
+}
+.swal2-popup.swal2-toast .swal2-loading {
+ justify-content: center;
+}
+.swal2-popup.swal2-toast .swal2-input {
+ height: 2em;
+ margin: 0.3125em auto;
+ font-size: 1em;
+}
+.swal2-popup.swal2-toast .swal2-validation-message {
+ font-size: 1em;
+}
+.swal2-popup.swal2-toast .swal2-footer {
+ margin: 0.5em 0 0;
+ padding: 0.5em 0 0;
+ font-size: 0.8em;
+}
+.swal2-popup.swal2-toast .swal2-close {
+ position: static;
+ width: 0.8em;
+ height: 0.8em;
+ line-height: 0.8;
+}
+.swal2-popup.swal2-toast .swal2-content {
+ justify-content: flex-start;
+ margin: 0 0.625em;
+ padding: 0;
+ font-size: 1em;
+ text-align: initial;
+}
+.swal2-popup.swal2-toast .swal2-html-container {
+ padding: 0.625em 0 0;
+}
+.swal2-popup.swal2-toast .swal2-html-container:empty {
+ padding: 0;
+}
+.swal2-popup.swal2-toast .swal2-icon {
+ width: 2em;
+ min-width: 2em;
+ height: 2em;
+ margin: 0 0.5em 0 0;
+}
+.swal2-popup.swal2-toast .swal2-icon .swal2-icon-content {
+ display: flex;
+ align-items: center;
+ font-size: 1.8em;
+ font-weight: bold;
+}
+@media all and (-ms-high-contrast: none), (-ms-high-contrast: active) {
+ .swal2-popup.swal2-toast .swal2-icon .swal2-icon-content {
+ font-size: 0.25em;
+ }
+}
+.swal2-popup.swal2-toast .swal2-icon.swal2-success .swal2-success-ring {
+ width: 2em;
+ height: 2em;
+}
+.swal2-popup.swal2-toast .swal2-icon.swal2-error [class^=swal2-x-mark-line] {
+ top: 0.875em;
+ width: 1.375em;
+}
+.swal2-popup.swal2-toast .swal2-icon.swal2-error [class^=swal2-x-mark-line][class$=left] {
+ left: 0.3125em;
+}
+.swal2-popup.swal2-toast .swal2-icon.swal2-error [class^=swal2-x-mark-line][class$=right] {
+ right: 0.3125em;
+}
+.swal2-popup.swal2-toast .swal2-actions {
+ flex: 1;
+ flex-basis: auto !important;
+ align-self: stretch;
+ width: auto;
+ height: 2.2em;
+ height: auto;
+ margin: 0 0.3125em;
+ margin-top: 0.3125em;
+ padding: 0;
+}
+.swal2-popup.swal2-toast .swal2-styled {
+ margin: 0.125em 0.3125em;
+ padding: 0.3125em 0.625em;
+ font-size: 1em;
+}
+.swal2-popup.swal2-toast .swal2-styled:focus {
+ box-shadow: 0 0 0 1px #fff, 0 0 0 3px rgba(100, 150, 200, 0.5);
+}
+.swal2-popup.swal2-toast .swal2-success {
+ border-color: #a5dc86;
+}
+.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-circular-line] {
+ position: absolute;
+ width: 1.6em;
+ height: 3em;
+ transform: rotate(45deg);
+ border-radius: 50%;
+}
+.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-circular-line][class$=left] {
+ top: -0.8em;
+ left: -0.5em;
+ transform: rotate(-45deg);
+ transform-origin: 2em 2em;
+ border-radius: 4em 0 0 4em;
+}
+.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-circular-line][class$=right] {
+ top: -0.25em;
+ left: 0.9375em;
+ transform-origin: 0 1.5em;
+ border-radius: 0 4em 4em 0;
+}
+.swal2-popup.swal2-toast .swal2-success .swal2-success-ring {
+ width: 2em;
+ height: 2em;
+}
+.swal2-popup.swal2-toast .swal2-success .swal2-success-fix {
+ top: 0;
+ left: 0.4375em;
+ width: 0.4375em;
+ height: 2.6875em;
+}
+.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-line] {
+ height: 0.3125em;
+}
+.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-line][class$=tip] {
+ top: 1.125em;
+ left: 0.1875em;
+ width: 0.75em;
+}
+.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-line][class$=long] {
+ top: 0.9375em;
+ right: 0.1875em;
+ width: 1.375em;
+}
+.swal2-popup.swal2-toast .swal2-success.swal2-icon-show .swal2-success-line-tip {
+ animation: swal2-toast-animate-success-line-tip 0.75s;
+}
+.swal2-popup.swal2-toast .swal2-success.swal2-icon-show .swal2-success-line-long {
+ animation: swal2-toast-animate-success-line-long 0.75s;
+}
+.swal2-popup.swal2-toast.swal2-show {
+ animation: swal2-toast-show 0.5s;
+}
+.swal2-popup.swal2-toast.swal2-hide {
+ animation: swal2-toast-hide 0.1s forwards;
+}
+
+.swal2-container {
+ display: flex;
+ position: fixed;
+ z-index: 1060;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ flex-direction: row;
+ align-items: center;
+ justify-content: center;
+ padding: 0.625em;
+ overflow-x: hidden;
+ transition: background-color 0.1s;
+ -webkit-overflow-scrolling: touch;
+}
+.swal2-container.swal2-backdrop-show, .swal2-container.swal2-noanimation {
+ background: rgba(0, 0, 0, 0.4);
+}
+.swal2-container.swal2-backdrop-hide {
+ background: transparent !important;
+}
+.swal2-container.swal2-top {
+ align-items: flex-start;
+}
+.swal2-container.swal2-top-start, .swal2-container.swal2-top-left {
+ align-items: flex-start;
+ justify-content: flex-start;
+}
+.swal2-container.swal2-top-end, .swal2-container.swal2-top-right {
+ align-items: flex-start;
+ justify-content: flex-end;
+}
+.swal2-container.swal2-center {
+ align-items: center;
+}
+.swal2-container.swal2-center-start, .swal2-container.swal2-center-left {
+ align-items: center;
+ justify-content: flex-start;
+}
+.swal2-container.swal2-center-end, .swal2-container.swal2-center-right {
+ align-items: center;
+ justify-content: flex-end;
+}
+.swal2-container.swal2-bottom {
+ align-items: flex-end;
+}
+.swal2-container.swal2-bottom-start, .swal2-container.swal2-bottom-left {
+ align-items: flex-end;
+ justify-content: flex-start;
+}
+.swal2-container.swal2-bottom-end, .swal2-container.swal2-bottom-right {
+ align-items: flex-end;
+ justify-content: flex-end;
+}
+.swal2-container.swal2-bottom > :first-child, .swal2-container.swal2-bottom-start > :first-child, .swal2-container.swal2-bottom-left > :first-child, .swal2-container.swal2-bottom-end > :first-child, .swal2-container.swal2-bottom-right > :first-child {
+ margin-top: auto;
+}
+.swal2-container.swal2-grow-fullscreen > .swal2-modal {
+ display: flex !important;
+ flex: 1;
+ align-self: stretch;
+ justify-content: center;
+}
+.swal2-container.swal2-grow-row > .swal2-modal {
+ display: flex !important;
+ flex: 1;
+ align-content: center;
+ justify-content: center;
+}
+.swal2-container.swal2-grow-column {
+ flex: 1;
+ flex-direction: column;
+}
+.swal2-container.swal2-grow-column.swal2-top, .swal2-container.swal2-grow-column.swal2-center, .swal2-container.swal2-grow-column.swal2-bottom {
+ align-items: center;
+}
+.swal2-container.swal2-grow-column.swal2-top-start, .swal2-container.swal2-grow-column.swal2-center-start, .swal2-container.swal2-grow-column.swal2-bottom-start, .swal2-container.swal2-grow-column.swal2-top-left, .swal2-container.swal2-grow-column.swal2-center-left, .swal2-container.swal2-grow-column.swal2-bottom-left {
+ align-items: flex-start;
+}
+.swal2-container.swal2-grow-column.swal2-top-end, .swal2-container.swal2-grow-column.swal2-center-end, .swal2-container.swal2-grow-column.swal2-bottom-end, .swal2-container.swal2-grow-column.swal2-top-right, .swal2-container.swal2-grow-column.swal2-center-right, .swal2-container.swal2-grow-column.swal2-bottom-right {
+ align-items: flex-end;
+}
+.swal2-container.swal2-grow-column > .swal2-modal {
+ display: flex !important;
+ flex: 1;
+ align-content: center;
+ justify-content: center;
+}
+.swal2-container.swal2-no-transition {
+ transition: none !important;
+}
+.swal2-container:not(.swal2-top):not(.swal2-top-start):not(.swal2-top-end):not(.swal2-top-left):not(.swal2-top-right):not(.swal2-center-start):not(.swal2-center-end):not(.swal2-center-left):not(.swal2-center-right):not(.swal2-bottom):not(.swal2-bottom-start):not(.swal2-bottom-end):not(.swal2-bottom-left):not(.swal2-bottom-right):not(.swal2-grow-fullscreen) > .swal2-modal {
+ margin: auto;
+}
+@media all and (-ms-high-contrast: none), (-ms-high-contrast: active) {
+ .swal2-container .swal2-modal {
+ margin: 0 !important;
+ }
+}
+
+.swal2-popup {
+ display: none;
+ position: relative;
+ box-sizing: border-box;
+ flex-direction: column;
+ justify-content: center;
+ width: 32em;
+ max-width: 100%;
+ padding: 1.25em;
+ border: none;
+ border-radius: 5px;
+ background: #fff;
+ font-family: inherit;
+ font-size: 1rem;
+}
+.swal2-popup:focus {
+ outline: none;
+}
+.swal2-popup.swal2-loading {
+ overflow-y: hidden;
+}
+
+.swal2-header {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ padding: 0 1.8em;
+}
+
+.swal2-title {
+ position: relative;
+ max-width: 100%;
+ margin: 0 0 0.4em;
+ padding: 0;
+ color: #595959;
+ font-size: 1.875em;
+ font-weight: 600;
+ text-align: center;
+ text-transform: none;
+ word-wrap: break-word;
+}
+
+.swal2-actions {
+ display: flex;
+ z-index: 1;
+ box-sizing: border-box;
+ flex-wrap: wrap;
+ align-items: center;
+ justify-content: center;
+ width: 100%;
+ margin: 1.25em auto 0;
+ padding: 0;
+}
+.swal2-actions:not(.swal2-loading) .swal2-styled[disabled] {
+ opacity: 0.4;
+}
+.swal2-actions:not(.swal2-loading) .swal2-styled:hover {
+ background-image: linear-gradient(rgba(0, 0, 0, 0.1), rgba(0, 0, 0, 0.1));
+}
+.swal2-actions:not(.swal2-loading) .swal2-styled:active {
+ background-image: linear-gradient(rgba(0, 0, 0, 0.2), rgba(0, 0, 0, 0.2));
+}
+
+.swal2-loader {
+ display: none;
+ align-items: center;
+ justify-content: center;
+ width: 2.2em;
+ height: 2.2em;
+ margin: 0 1.875em;
+ animation: swal2-rotate-loading 1.5s linear 0s infinite normal;
+ border-width: 0.25em;
+ border-style: solid;
+ border-radius: 100%;
+ border-color: #2778c4 transparent #2778c4 transparent;
+}
+
+.swal2-styled {
+ margin: 0.3125em;
+ padding: 0.625em 1.1em;
+ box-shadow: none;
+ font-weight: 500;
+}
+.swal2-styled:not([disabled]) {
+ cursor: pointer;
+}
+.swal2-styled.swal2-confirm {
+ border: 0;
+ border-radius: 0.25em;
+ background: initial;
+ background-color: #2778c4;
+ color: #fff;
+ font-size: 1em;
+}
+.swal2-styled.swal2-deny {
+ border: 0;
+ border-radius: 0.25em;
+ background: initial;
+ background-color: #d14529;
+ color: #fff;
+ font-size: 1em;
+}
+.swal2-styled.swal2-cancel {
+ border: 0;
+ border-radius: 0.25em;
+ background: initial;
+ background-color: #757575;
+ color: #fff;
+ font-size: 1em;
+}
+.swal2-styled:focus {
+ outline: none;
+ box-shadow: 0 0 0 3px rgba(100, 150, 200, 0.5);
+}
+.swal2-styled::-moz-focus-inner {
+ border: 0;
+}
+
+.swal2-footer {
+ justify-content: center;
+ margin: 1.25em 0 0;
+ padding: 1em 0 0;
+ border-top: 1px solid #eee;
+ color: #545454;
+ font-size: 1em;
+}
+
+.swal2-timer-progress-bar-container {
+ position: absolute;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ height: 0.25em;
+ overflow: hidden;
+ border-bottom-right-radius: 5px;
+ border-bottom-left-radius: 5px;
+}
+
+.swal2-timer-progress-bar {
+ width: 100%;
+ height: 0.25em;
+ background: rgba(0, 0, 0, 0.2);
+}
+
+.swal2-image {
+ max-width: 100%;
+ margin: 1.25em auto;
+}
+
+.swal2-close {
+ position: absolute;
+ z-index: 2;
+ top: 0;
+ right: 0;
+ align-items: center;
+ justify-content: center;
+ width: 1.2em;
+ height: 1.2em;
+ padding: 0;
+ overflow: hidden;
+ transition: color 0.1s ease-out;
+ border: none;
+ border-radius: 5px;
+ background: transparent;
+ color: #cccccc;
+ font-family: serif;
+ font-size: 2.5em;
+ line-height: 1.2;
+ cursor: pointer;
+}
+.swal2-close:hover {
+ transform: none;
+ background: transparent;
+ color: #f27474;
+}
+.swal2-close:focus {
+ outline: none;
+ box-shadow: inset 0 0 0 3px rgba(100, 150, 200, 0.5);
+}
+.swal2-close::-moz-focus-inner {
+ border: 0;
+}
+
+.swal2-content {
+ z-index: 1;
+ justify-content: center;
+ margin: 0;
+ padding: 0 1.6em;
+ color: #545454;
+ font-size: 1.125em;
+ font-weight: normal;
+ line-height: normal;
+ text-align: center;
+ word-wrap: break-word;
+}
+
+.swal2-input,
+.swal2-file,
+.swal2-textarea,
+.swal2-select,
+.swal2-radio,
+.swal2-checkbox {
+ margin: 1em auto;
+}
+
+.swal2-input,
+.swal2-file,
+.swal2-textarea {
+ box-sizing: border-box;
+ width: 100%;
+ transition: border-color 0.3s, box-shadow 0.3s;
+ border: 1px solid #d9d9d9;
+ border-radius: 0.1875em;
+ background: inherit;
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.06);
+ color: inherit;
+ font-size: 1.125em;
+}
+.swal2-input.swal2-inputerror,
+.swal2-file.swal2-inputerror,
+.swal2-textarea.swal2-inputerror {
+ border-color: #f27474 !important;
+ box-shadow: 0 0 2px #f27474 !important;
+}
+.swal2-input:focus,
+.swal2-file:focus,
+.swal2-textarea:focus {
+ border: 1px solid #b4dbed;
+ outline: none;
+ box-shadow: 0 0 0 3px rgba(100, 150, 200, 0.5);
+}
+.swal2-input::placeholder,
+.swal2-file::placeholder,
+.swal2-textarea::placeholder {
+ color: #cccccc;
+}
+
+.swal2-range {
+ margin: 1em auto;
+ background: #fff;
+}
+.swal2-range input {
+ width: 80%;
+}
+.swal2-range output {
+ width: 20%;
+ color: inherit;
+ font-weight: 600;
+ text-align: center;
+}
+.swal2-range input,
+.swal2-range output {
+ height: 2.625em;
+ padding: 0;
+ font-size: 1.125em;
+ line-height: 2.625em;
+}
+
+.swal2-input {
+ height: 2.625em;
+ padding: 0 0.75em;
+}
+.swal2-input[type=number] {
+ max-width: 10em;
+}
+
+.swal2-file {
+ background: inherit;
+ font-size: 1.125em;
+}
+
+.swal2-textarea {
+ height: 6.75em;
+ padding: 0.75em;
+}
+
+.swal2-select {
+ min-width: 50%;
+ max-width: 100%;
+ padding: 0.375em 0.625em;
+ background: inherit;
+ color: inherit;
+ font-size: 1.125em;
+}
+
+.swal2-radio,
+.swal2-checkbox {
+ align-items: center;
+ justify-content: center;
+ background: #fff;
+ color: inherit;
+}
+.swal2-radio label,
+.swal2-checkbox label {
+ margin: 0 0.6em;
+ font-size: 1.125em;
+}
+.swal2-radio input,
+.swal2-checkbox input {
+ flex-shrink: 0;
+ margin: 0 0.4em;
+}
+
+.swal2-input-label {
+ display: flex;
+ justify-content: center;
+ margin: 1em auto;
+}
+
+.swal2-validation-message {
+ align-items: center;
+ justify-content: center;
+ margin: 0 -2.7em;
+ padding: 0.625em;
+ overflow: hidden;
+ background: #f0f0f0;
+ color: #666666;
+ font-size: 1em;
+ font-weight: 300;
+}
+.swal2-validation-message::before {
+ content: "!";
+ display: inline-block;
+ width: 1.5em;
+ min-width: 1.5em;
+ height: 1.5em;
+ margin: 0 0.625em;
+ border-radius: 50%;
+ background-color: #f27474;
+ color: #fff;
+ font-weight: 600;
+ line-height: 1.5em;
+ text-align: center;
+}
+
+.swal2-icon {
+ position: relative;
+ box-sizing: content-box;
+ justify-content: center;
+ width: 5em;
+ height: 5em;
+ margin: 1.25em auto 1.875em;
+ border: 0.25em solid transparent;
+ border-radius: 50%;
+ border-color: #000;
+ font-family: inherit;
+ line-height: 5em;
+ cursor: default;
+ user-select: none;
+}
+.swal2-icon .swal2-icon-content {
+ display: flex;
+ align-items: center;
+ font-size: 3.75em;
+}
+.swal2-icon.swal2-error {
+ border-color: #f27474;
+ color: #f27474;
+}
+.swal2-icon.swal2-error .swal2-x-mark {
+ position: relative;
+ flex-grow: 1;
+}
+.swal2-icon.swal2-error [class^=swal2-x-mark-line] {
+ display: block;
+ position: absolute;
+ top: 2.3125em;
+ width: 2.9375em;
+ height: 0.3125em;
+ border-radius: 0.125em;
+ background-color: #f27474;
+}
+.swal2-icon.swal2-error [class^=swal2-x-mark-line][class$=left] {
+ left: 1.0625em;
+ transform: rotate(45deg);
+}
+.swal2-icon.swal2-error [class^=swal2-x-mark-line][class$=right] {
+ right: 1em;
+ transform: rotate(-45deg);
+}
+.swal2-icon.swal2-error.swal2-icon-show {
+ animation: swal2-animate-error-icon 0.5s;
+}
+.swal2-icon.swal2-error.swal2-icon-show .swal2-x-mark {
+ animation: swal2-animate-error-x-mark 0.5s;
+}
+.swal2-icon.swal2-warning {
+ border-color: #facea8;
+ color: #f8bb86;
+}
+.swal2-icon.swal2-info {
+ border-color: #9de0f6;
+ color: #3fc3ee;
+}
+.swal2-icon.swal2-question {
+ border-color: #c9dae1;
+ color: #87adbd;
+}
+.swal2-icon.swal2-success {
+ border-color: #a5dc86;
+ color: #a5dc86;
+}
+.swal2-icon.swal2-success [class^=swal2-success-circular-line] {
+ position: absolute;
+ width: 3.75em;
+ height: 7.5em;
+ transform: rotate(45deg);
+ border-radius: 50%;
+}
+.swal2-icon.swal2-success [class^=swal2-success-circular-line][class$=left] {
+ top: -0.4375em;
+ left: -2.0635em;
+ transform: rotate(-45deg);
+ transform-origin: 3.75em 3.75em;
+ border-radius: 7.5em 0 0 7.5em;
+}
+.swal2-icon.swal2-success [class^=swal2-success-circular-line][class$=right] {
+ top: -0.6875em;
+ left: 1.875em;
+ transform: rotate(-45deg);
+ transform-origin: 0 3.75em;
+ border-radius: 0 7.5em 7.5em 0;
+}
+.swal2-icon.swal2-success .swal2-success-ring {
+ position: absolute;
+ z-index: 2;
+ top: -0.25em;
+ left: -0.25em;
+ box-sizing: content-box;
+ width: 100%;
+ height: 100%;
+ border: 0.25em solid rgba(165, 220, 134, 0.3);
+ border-radius: 50%;
+}
+.swal2-icon.swal2-success .swal2-success-fix {
+ position: absolute;
+ z-index: 1;
+ top: 0.5em;
+ left: 1.625em;
+ width: 0.4375em;
+ height: 5.625em;
+ transform: rotate(-45deg);
+}
+.swal2-icon.swal2-success [class^=swal2-success-line] {
+ display: block;
+ position: absolute;
+ z-index: 2;
+ height: 0.3125em;
+ border-radius: 0.125em;
+ background-color: #a5dc86;
+}
+.swal2-icon.swal2-success [class^=swal2-success-line][class$=tip] {
+ top: 2.875em;
+ left: 0.8125em;
+ width: 1.5625em;
+ transform: rotate(45deg);
+}
+.swal2-icon.swal2-success [class^=swal2-success-line][class$=long] {
+ top: 2.375em;
+ right: 0.5em;
+ width: 2.9375em;
+ transform: rotate(-45deg);
+}
+.swal2-icon.swal2-success.swal2-icon-show .swal2-success-line-tip {
+ animation: swal2-animate-success-line-tip 0.75s;
+}
+.swal2-icon.swal2-success.swal2-icon-show .swal2-success-line-long {
+ animation: swal2-animate-success-line-long 0.75s;
+}
+.swal2-icon.swal2-success.swal2-icon-show .swal2-success-circular-line-right {
+ animation: swal2-rotate-success-circular-line 4.25s ease-in;
+}
+
+.swal2-progress-steps {
+ flex-wrap: wrap;
+ align-items: center;
+ max-width: 100%;
+ margin: 0 0 1.25em;
+ padding: 0;
+ background: inherit;
+ font-weight: 600;
+}
+.swal2-progress-steps li {
+ display: inline-block;
+ position: relative;
+}
+.swal2-progress-steps .swal2-progress-step {
+ z-index: 20;
+ flex-shrink: 0;
+ width: 2em;
+ height: 2em;
+ border-radius: 2em;
+ background: #2778c4;
+ color: #fff;
+ line-height: 2em;
+ text-align: center;
+}
+.swal2-progress-steps .swal2-progress-step.swal2-active-progress-step {
+ background: #2778c4;
+}
+.swal2-progress-steps .swal2-progress-step.swal2-active-progress-step ~ .swal2-progress-step {
+ background: #add8e6;
+ color: #fff;
+}
+.swal2-progress-steps .swal2-progress-step.swal2-active-progress-step ~ .swal2-progress-step-line {
+ background: #add8e6;
+}
+.swal2-progress-steps .swal2-progress-step-line {
+ z-index: 10;
+ flex-shrink: 0;
+ width: 2.5em;
+ height: 0.4em;
+ margin: 0 -1px;
+ background: #2778c4;
+}
+
+[class^=swal2] {
+ -webkit-tap-highlight-color: transparent;
+}
+
+.swal2-show {
+ animation: swal2-show 0.3s;
+}
+
+.swal2-hide {
+ animation: swal2-hide 0.15s forwards;
+}
+
+.swal2-noanimation {
+ transition: none;
+}
+
+.swal2-scrollbar-measure {
+ position: absolute;
+ top: -9999px;
+ width: 50px;
+ height: 50px;
+ overflow: scroll;
+}
+
+.swal2-rtl .swal2-close {
+ right: auto;
+ left: 0;
+}
+.swal2-rtl .swal2-timer-progress-bar {
+ right: 0;
+ left: auto;
+}
+
+@supports (-ms-accelerator: true) {
+ .swal2-range input {
+ width: 100% !important;
+ }
+ .swal2-range output {
+ display: none;
+ }
+}
+@media all and (-ms-high-contrast: none), (-ms-high-contrast: active) {
+ .swal2-range input {
+ width: 100% !important;
+ }
+ .swal2-range output {
+ display: none;
+ }
+}
+@keyframes swal2-toast-show {
+ 0% {
+ transform: translateY(-0.625em) rotateZ(2deg);
+ }
+ 33% {
+ transform: translateY(0) rotateZ(-2deg);
+ }
+ 66% {
+ transform: translateY(0.3125em) rotateZ(2deg);
+ }
+ 100% {
+ transform: translateY(0) rotateZ(0deg);
+ }
+}
+@keyframes swal2-toast-hide {
+ 100% {
+ transform: rotateZ(1deg);
+ opacity: 0;
+ }
+}
+@keyframes swal2-toast-animate-success-line-tip {
+ 0% {
+ top: 0.5625em;
+ left: 0.0625em;
+ width: 0;
+ }
+ 54% {
+ top: 0.125em;
+ left: 0.125em;
+ width: 0;
+ }
+ 70% {
+ top: 0.625em;
+ left: -0.25em;
+ width: 1.625em;
+ }
+ 84% {
+ top: 1.0625em;
+ left: 0.75em;
+ width: 0.5em;
+ }
+ 100% {
+ top: 1.125em;
+ left: 0.1875em;
+ width: 0.75em;
+ }
+}
+@keyframes swal2-toast-animate-success-line-long {
+ 0% {
+ top: 1.625em;
+ right: 1.375em;
+ width: 0;
+ }
+ 65% {
+ top: 1.25em;
+ right: 0.9375em;
+ width: 0;
+ }
+ 84% {
+ top: 0.9375em;
+ right: 0;
+ width: 1.125em;
+ }
+ 100% {
+ top: 0.9375em;
+ right: 0.1875em;
+ width: 1.375em;
+ }
+}
+@keyframes swal2-show {
+ 0% {
+ transform: scale(0.7);
+ }
+ 45% {
+ transform: scale(1.05);
+ }
+ 80% {
+ transform: scale(0.95);
+ }
+ 100% {
+ transform: scale(1);
+ }
+}
+@keyframes swal2-hide {
+ 0% {
+ transform: scale(1);
+ opacity: 1;
+ }
+ 100% {
+ transform: scale(0.5);
+ opacity: 0;
+ }
+}
+@keyframes swal2-animate-success-line-tip {
+ 0% {
+ top: 1.1875em;
+ left: 0.0625em;
+ width: 0;
+ }
+ 54% {
+ top: 1.0625em;
+ left: 0.125em;
+ width: 0;
+ }
+ 70% {
+ top: 2.1875em;
+ left: -0.375em;
+ width: 3.125em;
+ }
+ 84% {
+ top: 3em;
+ left: 1.3125em;
+ width: 1.0625em;
+ }
+ 100% {
+ top: 2.8125em;
+ left: 0.8125em;
+ width: 1.5625em;
+ }
+}
+@keyframes swal2-animate-success-line-long {
+ 0% {
+ top: 3.375em;
+ right: 2.875em;
+ width: 0;
+ }
+ 65% {
+ top: 3.375em;
+ right: 2.875em;
+ width: 0;
+ }
+ 84% {
+ top: 2.1875em;
+ right: 0;
+ width: 3.4375em;
+ }
+ 100% {
+ top: 2.375em;
+ right: 0.5em;
+ width: 2.9375em;
+ }
+}
+@keyframes swal2-rotate-success-circular-line {
+ 0% {
+ transform: rotate(-45deg);
+ }
+ 5% {
+ transform: rotate(-45deg);
+ }
+ 12% {
+ transform: rotate(-405deg);
+ }
+ 100% {
+ transform: rotate(-405deg);
+ }
+}
+@keyframes swal2-animate-error-x-mark {
+ 0% {
+ margin-top: 1.625em;
+ transform: scale(0.4);
+ opacity: 0;
+ }
+ 50% {
+ margin-top: 1.625em;
+ transform: scale(0.4);
+ opacity: 0;
+ }
+ 80% {
+ margin-top: -0.375em;
+ transform: scale(1.15);
+ }
+ 100% {
+ margin-top: 0;
+ transform: scale(1);
+ opacity: 1;
+ }
+}
+@keyframes swal2-animate-error-icon {
+ 0% {
+ transform: rotateX(100deg);
+ opacity: 0;
+ }
+ 100% {
+ transform: rotateX(0deg);
+ opacity: 1;
+ }
+}
+@keyframes swal2-rotate-loading {
+ 0% {
+ transform: rotate(0deg);
+ }
+ 100% {
+ transform: rotate(360deg);
+ }
+}
+body.swal2-shown:not(.swal2-no-backdrop):not(.swal2-toast-shown) {
+ overflow: hidden;
+}
+body.swal2-height-auto {
+ height: auto !important;
+}
+body.swal2-no-backdrop .swal2-container {
+ top: auto;
+ right: auto;
+ bottom: auto;
+ left: auto;
+ max-width: calc(100% - 0.625em * 2);
+ background-color: transparent !important;
+}
+body.swal2-no-backdrop .swal2-container > .swal2-modal {
+ box-shadow: 0 0 10px rgba(0, 0, 0, 0.4);
+}
+body.swal2-no-backdrop .swal2-container.swal2-top {
+ top: 0;
+ left: 50%;
+ transform: translateX(-50%);
+}
+body.swal2-no-backdrop .swal2-container.swal2-top-start, body.swal2-no-backdrop .swal2-container.swal2-top-left {
+ top: 0;
+ left: 0;
+}
+body.swal2-no-backdrop .swal2-container.swal2-top-end, body.swal2-no-backdrop .swal2-container.swal2-top-right {
+ top: 0;
+ right: 0;
+}
+body.swal2-no-backdrop .swal2-container.swal2-center {
+ top: 50%;
+ left: 50%;
+ transform: translate(-50%, -50%);
+}
+body.swal2-no-backdrop .swal2-container.swal2-center-start, body.swal2-no-backdrop .swal2-container.swal2-center-left {
+ top: 50%;
+ left: 0;
+ transform: translateY(-50%);
+}
+body.swal2-no-backdrop .swal2-container.swal2-center-end, body.swal2-no-backdrop .swal2-container.swal2-center-right {
+ top: 50%;
+ right: 0;
+ transform: translateY(-50%);
+}
+body.swal2-no-backdrop .swal2-container.swal2-bottom {
+ bottom: 0;
+ left: 50%;
+ transform: translateX(-50%);
+}
+body.swal2-no-backdrop .swal2-container.swal2-bottom-start, body.swal2-no-backdrop .swal2-container.swal2-bottom-left {
+ bottom: 0;
+ left: 0;
+}
+body.swal2-no-backdrop .swal2-container.swal2-bottom-end, body.swal2-no-backdrop .swal2-container.swal2-bottom-right {
+ right: 0;
+ bottom: 0;
+}
+@media print {
+ body.swal2-shown:not(.swal2-no-backdrop):not(.swal2-toast-shown) {
+ overflow-y: scroll !important;
+ }
+ body.swal2-shown:not(.swal2-no-backdrop):not(.swal2-toast-shown) > [aria-hidden=true] {
+ display: none;
+ }
+ body.swal2-shown:not(.swal2-no-backdrop):not(.swal2-toast-shown) .swal2-container {
+ position: static !important;
+ }
+}
+body.swal2-toast-shown .swal2-container {
+ background-color: transparent;
+}
+body.swal2-toast-shown .swal2-container.swal2-top {
+ top: 0;
+ right: auto;
+ bottom: auto;
+ left: 50%;
+ transform: translateX(-50%);
+}
+body.swal2-toast-shown .swal2-container.swal2-top-end, body.swal2-toast-shown .swal2-container.swal2-top-right {
+ top: 0;
+ right: 0;
+ bottom: auto;
+ left: auto;
+}
+body.swal2-toast-shown .swal2-container.swal2-top-start, body.swal2-toast-shown .swal2-container.swal2-top-left {
+ top: 0;
+ right: auto;
+ bottom: auto;
+ left: 0;
+}
+body.swal2-toast-shown .swal2-container.swal2-center-start, body.swal2-toast-shown .swal2-container.swal2-center-left {
+ top: 50%;
+ right: auto;
+ bottom: auto;
+ left: 0;
+ transform: translateY(-50%);
+}
+body.swal2-toast-shown .swal2-container.swal2-center {
+ top: 50%;
+ right: auto;
+ bottom: auto;
+ left: 50%;
+ transform: translate(-50%, -50%);
+}
+body.swal2-toast-shown .swal2-container.swal2-center-end, body.swal2-toast-shown .swal2-container.swal2-center-right {
+ top: 50%;
+ right: 0;
+ bottom: auto;
+ left: auto;
+ transform: translateY(-50%);
+}
+body.swal2-toast-shown .swal2-container.swal2-bottom-start, body.swal2-toast-shown .swal2-container.swal2-bottom-left {
+ top: auto;
+ right: auto;
+ bottom: 0;
+ left: 0;
+}
+body.swal2-toast-shown .swal2-container.swal2-bottom {
+ top: auto;
+ right: auto;
+ bottom: 0;
+ left: 50%;
+ transform: translateX(-50%);
+}
+body.swal2-toast-shown .swal2-container.swal2-bottom-end, body.swal2-toast-shown .swal2-container.swal2-bottom-right {
+ top: auto;
+ right: 0;
+ bottom: 0;
+ left: auto;
+}
+
+.btn, .swal2-popup .swal2-actions button.swal2-confirm, .swal2-popup .swal2-actions button {
+ border-radius: 3px;
+ padding: 7px 15px;
+ border: 1px solid #000000;
+ font-size: 14px;
+ white-space: nowrap;
+ text-align: center;
+ cursor: pointer;
+}
+html.theme_light .btn, html.theme_light .swal2-popup .swal2-actions button, .swal2-popup .swal2-actions html.theme_light button {
+ background-color: white;
+ border-color: #bebebe;
+ color: #666666;
+}
+html.theme_dark .btn, html.theme_dark .swal2-popup .swal2-actions button, .swal2-popup .swal2-actions html.theme_dark button {
+ background-color: #363636;
+ border-color: #1f1f1f;
+ color: #e0e0e0;
+}
+html.theme_nord .btn, html.theme_nord .swal2-popup .swal2-actions button, .swal2-popup .swal2-actions html.theme_nord button {
+ background-color: #4C566A;
+ border-color: #2E3440;
+ color: #E5E9F0;
+}
+html.theme_solarizedDark .btn, html.theme_solarizedDark .swal2-popup .swal2-actions button, .swal2-popup .swal2-actions html.theme_solarizedDark button {
+ background-color: #657b83;
+ border-color: #002b36;
+ color: #93a1a1;
+}
+html.theme_light .btn.primary, html.theme_light .swal2-popup .swal2-actions button.primary, html.theme_light .swal2-popup .swal2-actions button.swal2-confirm, .swal2-popup .swal2-actions html.theme_light button.primary, .swal2-popup .swal2-actions html.theme_light button.swal2-confirm {
+ color: #134db7;
+}
+html.theme_dark .btn.primary, html.theme_dark .swal2-popup .swal2-actions button.primary, html.theme_dark .swal2-popup .swal2-actions button.swal2-confirm, .swal2-popup .swal2-actions html.theme_dark button.primary, .swal2-popup .swal2-actions html.theme_dark button.swal2-confirm {
+ color: #46ace7;
+}
+html.theme_nord .btn.primary, html.theme_nord .swal2-popup .swal2-actions button.primary, html.theme_nord .swal2-popup .swal2-actions button.swal2-confirm, .swal2-popup .swal2-actions html.theme_nord button.primary, .swal2-popup .swal2-actions html.theme_nord button.swal2-confirm {
+ color: #88C0D0;
+}
+html.theme_solarizedDark .btn.primary, html.theme_solarizedDark .swal2-popup .swal2-actions button.primary, html.theme_solarizedDark .swal2-popup .swal2-actions button.swal2-confirm, .swal2-popup .swal2-actions html.theme_solarizedDark button.primary, .swal2-popup .swal2-actions html.theme_solarizedDark button.swal2-confirm {
+ color: #2aa198;
+}
+html.theme_light .btn.danger, html.theme_light .swal2-popup .swal2-actions button.danger, .swal2-popup .swal2-actions html.theme_light button.danger {
+ color: #c23321;
+}
+html.theme_dark .btn.danger, html.theme_dark .swal2-popup .swal2-actions button.danger, .swal2-popup .swal2-actions html.theme_dark button.danger {
+ color: #ff3e24;
+}
+html.theme_nord .btn.danger, html.theme_nord .swal2-popup .swal2-actions button.danger, .swal2-popup .swal2-actions html.theme_nord button.danger {
+ color: #BF616A;
+}
+html.theme_solarizedDark .btn.danger, html.theme_solarizedDark .swal2-popup .swal2-actions button.danger, .swal2-popup .swal2-actions html.theme_solarizedDark button.danger {
+ color: #dc322f;
+}
+.btn:hover:not([disabled]), .swal2-popup .swal2-actions button:hover:not([disabled]) {
+ cursor: pointer;
+}
+html.theme_light .btn:hover:not([disabled]), html.theme_light .swal2-popup .swal2-actions button:hover:not([disabled]), .swal2-popup .swal2-actions html.theme_light button:hover:not([disabled]) {
+ background-color: #fbfbfb;
+ border-color: #939393;
+ color: #4d4d4d;
+}
+html.theme_dark .btn:hover:not([disabled]), html.theme_dark .swal2-popup .swal2-actions button:hover:not([disabled]), .swal2-popup .swal2-actions html.theme_dark button:hover:not([disabled]) {
+ background-color: #323232;
+ border-color: black;
+ color: #c7c7c7;
+}
+html.theme_nord .btn:hover:not([disabled]), html.theme_nord .swal2-popup .swal2-actions button:hover:not([disabled]), .swal2-popup .swal2-actions html.theme_nord button:hover:not([disabled]) {
+ background-color: #495266;
+ border-color: #0a0b0e;
+ color: #c5cedd;
+}
+html.theme_solarizedDark .btn:hover:not([disabled]), html.theme_solarizedDark .swal2-popup .swal2-actions button:hover:not([disabled]), .swal2-popup .swal2-actions html.theme_solarizedDark button:hover:not([disabled]) {
+ background-color: #62777f;
+ border-color: black;
+ color: #788989;
+}
+html.theme_light .btn:hover:not([disabled]).primary, html.theme_light .swal2-popup .swal2-actions button:hover:not([disabled]).primary, html.theme_light .swal2-popup .swal2-actions button.swal2-confirm:hover:not([disabled]), .swal2-popup .swal2-actions html.theme_light button:hover:not([disabled]).primary, .swal2-popup .swal2-actions html.theme_light button.swal2-confirm:hover:not([disabled]) {
+ color: #10429b;
+}
+html.theme_dark .btn:hover:not([disabled]).primary, html.theme_dark .swal2-popup .swal2-actions button:hover:not([disabled]).primary, html.theme_dark .swal2-popup .swal2-actions button.swal2-confirm:hover:not([disabled]), .swal2-popup .swal2-actions html.theme_dark button:hover:not([disabled]).primary, .swal2-popup .swal2-actions html.theme_dark button.swal2-confirm:hover:not([disabled]) {
+ color: #2ba0e3;
+}
+html.theme_nord .btn:hover:not([disabled]).primary, html.theme_nord .swal2-popup .swal2-actions button:hover:not([disabled]).primary, html.theme_nord .swal2-popup .swal2-actions button.swal2-confirm:hover:not([disabled]), .swal2-popup .swal2-actions html.theme_nord button:hover:not([disabled]).primary, .swal2-popup .swal2-actions html.theme_nord button.swal2-confirm:hover:not([disabled]) {
+ color: #72b4c7;
+}
+html.theme_solarizedDark .btn:hover:not([disabled]).primary, html.theme_solarizedDark .swal2-popup .swal2-actions button:hover:not([disabled]).primary, html.theme_solarizedDark .swal2-popup .swal2-actions button.swal2-confirm:hover:not([disabled]), .swal2-popup .swal2-actions html.theme_solarizedDark button:hover:not([disabled]).primary, .swal2-popup .swal2-actions html.theme_solarizedDark button.swal2-confirm:hover:not([disabled]) {
+ color: #248981;
+}
+html.theme_light .btn:hover:not([disabled]).danger, html.theme_light .swal2-popup .swal2-actions button:hover:not([disabled]).danger, .swal2-popup .swal2-actions html.theme_light button:hover:not([disabled]).danger {
+ color: #a82c1d;
+}
+html.theme_dark .btn:hover:not([disabled]).danger, html.theme_dark .swal2-popup .swal2-actions button:hover:not([disabled]).danger, .swal2-popup .swal2-actions html.theme_dark button:hover:not([disabled]).danger {
+ color: #ff2305;
+}
+html.theme_nord .btn:hover:not([disabled]).danger, html.theme_nord .swal2-popup .swal2-actions button:hover:not([disabled]).danger, .swal2-popup .swal2-actions html.theme_nord button:hover:not([disabled]).danger {
+ color: #b64b55;
+}
+html.theme_solarizedDark .btn:hover:not([disabled]).danger, html.theme_solarizedDark .swal2-popup .swal2-actions button:hover:not([disabled]).danger, .swal2-popup .swal2-actions html.theme_solarizedDark button:hover:not([disabled]).danger {
+ color: #ca2522;
+}
+.btn:focus:not([disabled]), .swal2-popup .swal2-actions button:focus:not([disabled]) {
+ cursor: pointer;
+ outline: 0;
+}
+html.theme_light .btn:focus:not([disabled]), html.theme_light .swal2-popup .swal2-actions button:focus:not([disabled]), .swal2-popup .swal2-actions html.theme_light button:focus:not([disabled]) {
+ background-color: #f0f0f0;
+ border-color: #7f7f7f;
+}
+html.theme_dark .btn:focus:not([disabled]), html.theme_dark .swal2-popup .swal2-actions button:focus:not([disabled]), .swal2-popup .swal2-actions html.theme_dark button:focus:not([disabled]) {
+ background-color: #272727;
+ border-color: black;
+}
+html.theme_nord .btn:focus:not([disabled]), html.theme_nord .swal2-popup .swal2-actions button:focus:not([disabled]), .swal2-popup .swal2-actions html.theme_nord button:focus:not([disabled]) {
+ background-color: #3f4858;
+ border-color: black;
+}
+html.theme_solarizedDark .btn:focus:not([disabled]), html.theme_solarizedDark .swal2-popup .swal2-actions button:focus:not([disabled]), .swal2-popup .swal2-actions html.theme_solarizedDark button:focus:not([disabled]) {
+ background-color: #586b72;
+ border-color: black;
+}
+.btn[disabled], .swal2-popup .swal2-actions button[disabled] {
+ opacity: 0.65;
+ cursor: default !important;
+}
+.btn.block, .swal2-popup .swal2-actions button.block {
+ display: block;
+ width: 100%;
+}
+.btn.link, .swal2-popup .swal2-actions button.link, .btn.neutral, .swal2-popup .swal2-actions button.neutral {
+ border: none !important;
+ background: none !important;
+}
+.btn.link:focus, .swal2-popup .swal2-actions button.link:focus, .btn.neutral:focus, .swal2-popup .swal2-actions button.neutral:focus {
+ text-decoration: underline;
+}
+
+.action-buttons .btn:focus, .action-buttons .swal2-popup .swal2-actions button:focus, .swal2-popup .swal2-actions .action-buttons button:focus {
+ outline: auto;
+}
+
+button.box-content-row {
+ display: block;
+ width: 100%;
+ text-align: left;
+}
+
+button {
+ border: none;
+ background: transparent;
+ color: inherit;
+}
+
+.toast-container.toast-bottom-full-width div.toast {
+ margin: 0 10px 10px;
+ width: calc(100% - 20px);
+ box-shadow: 0 0 8px rgba(0, 0, 0, 0.35);
+}
+.toast-container.toast-bottom-full-width div.toast:hover {
+ box-shadow: 0 0 10px rgba(0, 0, 0, 0.6);
+}
+.toast-container .toast:before {
+ font-family: FontAwesome;
+ font-size: 25px;
+ line-height: 20px;
+ float: left;
+ color: #ffffff;
+ margin: auto 0 auto 15px;
+}
+.toast-container .toast .toast-content {
+ padding: 15px;
+}
+.toast-container .toast .toaster-icon {
+ display: none;
+}
+.toast-container .toast .toast-message p {
+ margin-bottom: 0.5rem;
+}
+.toast-container .toast .toast-message p:last-child {
+ margin-bottom: 0;
+}
+.toast-container .toast.toast-danger, .toast-container .toast.toast-error {
+ background-image: none !important;
+}
+html.theme_light .toast-container .toast.toast-danger, html.theme_light .toast-container .toast.toast-error {
+ background-color: #dd4b39;
+}
+html.theme_dark .toast-container .toast.toast-danger, html.theme_dark .toast-container .toast.toast-error {
+ background-color: #ff3e24;
+}
+html.theme_nord .toast-container .toast.toast-danger, html.theme_nord .toast-container .toast.toast-error {
+ background-color: #BF616A;
+}
+html.theme_solarizedDark .toast-container .toast.toast-danger, html.theme_solarizedDark .toast-container .toast.toast-error {
+ background-color: #dc322f;
+}
+.toast-container .toast.toast-danger:before, .toast-container .toast.toast-error:before {
+ content: "\f0e7";
+}
+.toast-container .toast.toast-warning {
+ background-image: none !important;
+}
+html.theme_light .toast-container .toast.toast-warning {
+ background-color: #bf7e16;
+}
+html.theme_dark .toast-container .toast.toast-warning {
+ background-color: #bf7e16;
+}
+html.theme_nord .toast-container .toast.toast-warning {
+ background-color: #D08770;
+}
+html.theme_solarizedDark .toast-container .toast.toast-warning {
+ background-color: #b58900;
+}
+.toast-container .toast.toast-warning:before {
+ content: "\f071";
+}
+.toast-container .toast.toast-info {
+ background-image: none !important;
+}
+html.theme_light .toast-container .toast.toast-info {
+ background-color: #555555;
+}
+html.theme_dark .toast-container .toast.toast-info {
+ background-color: #555555;
+}
+html.theme_nord .toast-container .toast.toast-info {
+ background-color: #81A1C1;
+}
+html.theme_solarizedDark .toast-container .toast.toast-info {
+ background-color: #859900;
+}
+.toast-container .toast.toast-info:before {
+ content: "\f05a";
+}
+.toast-container .toast.toast-success {
+ background-image: none !important;
+}
+html.theme_light .toast-container .toast.toast-success {
+ background-color: #00a65a;
+}
+html.theme_dark .toast-container .toast.toast-success {
+ background-color: #00a65a;
+}
+html.theme_nord .toast-container .toast.toast-success {
+ background-color: #A3BE8C;
+}
+html.theme_solarizedDark .toast-container .toast.toast-success {
+ background-color: #859900;
+}
+.toast-container .toast.toast-success:before {
+ content: "\f00c";
+}
+
+.swal2-popup {
+ padding: 15px;
+ border-radius: 3px;
+ width: 34em;
+}
+html.theme_light .swal2-popup {
+ background-color: #ffffff;
+ color: #000000;
+}
+html.theme_dark .swal2-popup {
+ background-color: #3d3d3d;
+ color: #ffffff;
+}
+html.theme_nord .swal2-popup {
+ background-color: #434C5E;
+ color: #E5E9F0;
+}
+html.theme_solarizedDark .swal2-popup {
+ background-color: #073642;
+ color: #eee8d5;
+}
+.swal2-popup .swal2-icon {
+ margin: 0 auto;
+ width: auto;
+ height: auto;
+ border: none;
+}
+.swal2-popup .swal2-content {
+ margin: 0;
+ font-size: 14px;
+}
+html.theme_light .swal2-popup .swal2-content {
+ color: #000000;
+}
+html.theme_dark .swal2-popup .swal2-content {
+ color: #ffffff;
+}
+html.theme_nord .swal2-popup .swal2-content {
+ color: #E5E9F0;
+}
+html.theme_solarizedDark .swal2-popup .swal2-content {
+ color: #eee8d5;
+}
+.swal2-popup .swal2-content label.checkbox {
+ margin-top: 10px;
+ display: flex;
+ text-align: left;
+ align-items: top;
+}
+.swal2-popup .swal2-content label.checkbox input {
+ margin: 3px 5px 0 1px;
+}
+.swal2-popup .swal2-content .swal2-input, .swal2-popup .swal2-content .swal2-textarea {
+ border: 1px solid #000000;
+ border-radius: 3px;
+ margin-bottom: 0;
+ box-shadow: none;
+ font-size: inherit;
+}
+.swal2-popup .swal2-content .swal2-input:focus, .swal2-popup .swal2-content .swal2-textarea:focus {
+ box-shadow: none;
+}
+html.theme_light .swal2-popup .swal2-content .swal2-input, html.theme_light .swal2-popup .swal2-content .swal2-textarea {
+ border-color: #cbcbcb;
+ color: #000000;
+ background-color: #ffffff;
+}
+html.theme_dark .swal2-popup .swal2-content .swal2-input, html.theme_dark .swal2-popup .swal2-content .swal2-textarea {
+ border-color: #222222;
+ color: #ffffff;
+ background-color: #363636;
+}
+html.theme_nord .swal2-popup .swal2-content .swal2-input, html.theme_nord .swal2-popup .swal2-content .swal2-textarea {
+ border-color: #2E3440;
+ color: #E5E9F0;
+ background-color: #434C5E;
+}
+html.theme_solarizedDark .swal2-popup .swal2-content .swal2-input, html.theme_solarizedDark .swal2-popup .swal2-content .swal2-textarea {
+ border-color: #002b36;
+ color: #eee8d5;
+ background-color: #586e75;
+}
+html.theme_light .swal2-popup .swal2-content .swal2-input::-webkit-input-placeholder, html.theme_light .swal2-popup .swal2-content .swal2-textarea::-webkit-input-placeholder {
+ color: #d0d0d0;
+}
+html.theme_dark .swal2-popup .swal2-content .swal2-input::-webkit-input-placeholder, html.theme_dark .swal2-popup .swal2-content .swal2-textarea::-webkit-input-placeholder {
+ color: #707070;
+}
+html.theme_nord .swal2-popup .swal2-content .swal2-input::-webkit-input-placeholder, html.theme_nord .swal2-popup .swal2-content .swal2-textarea::-webkit-input-placeholder {
+ color: #7b88a1;
+}
+html.theme_solarizedDark .swal2-popup .swal2-content .swal2-input::-webkit-input-placeholder, html.theme_solarizedDark .swal2-popup .swal2-content .swal2-textarea::-webkit-input-placeholder {
+ color: #9cacb2;
+}
+.swal2-popup i.swal-custom-icon {
+ display: block;
+ margin: 0 auto;
+ font-size: 35px;
+}
+.swal2-popup .swal2-title {
+ padding: 10px 0 15px;
+ margin: 0;
+ font-size: 18px;
+}
+html.theme_light .swal2-popup .swal2-title {
+ color: #000000;
+}
+html.theme_dark .swal2-popup .swal2-title {
+ color: #ffffff;
+}
+html.theme_nord .swal2-popup .swal2-title {
+ color: #E5E9F0;
+}
+html.theme_solarizedDark .swal2-popup .swal2-title {
+ color: #eee8d5;
+}
+.swal2-popup .swal2-text {
+ text-align: left;
+ font-size: 14px;
+}
+html.theme_light .swal2-popup .swal2-text {
+ color: #000000;
+}
+html.theme_dark .swal2-popup .swal2-text {
+ color: #ffffff;
+}
+html.theme_nord .swal2-popup .swal2-text {
+ color: #E5E9F0;
+}
+html.theme_solarizedDark .swal2-popup .swal2-text {
+ color: #eee8d5;
+}
+.swal2-popup > .swal2-text:first-child {
+ margin-top: 20px;
+}
+.swal2-popup .swal2-actions {
+ margin: 20px auto 0;
+ justify-content: flex-start;
+ flex-direction: row-reverse;
+}
+.swal2-popup .swal2-actions button {
+ margin-left: 10px;
+}
+.swal2-popup .swal2-actions button.swal2-confirm {
+ font-weight: bold;
+}
+.swal2-popup .swal2-validation-message {
+ margin-top: 20px;
+}
+
+date-input-polyfill[data-open=true] {
+ z-index: 10000 !important;
+}
+
+html.browser_safari body {
+ height: 360px !important;
+}
+html.browser_safari body.body-xs {
+ height: 300px !important;
+}
+html.browser_safari body.body-full {
+ height: 100% !important;
+}
+html.browser_safari header .search .fa {
+ left: 20px;
+}
+html.browser_safari header .left + .search .fa {
+ left: 10px;
+}
+html.browser_safari app-root {
+ border-width: 1px;
+ border-style: solid;
+ border-color: #000000;
+}
+html.browser_safari.theme_light app-root {
+ border-color: #777777;
+}
+html.browser_safari.theme_nord app-root {
+ border-color: #2e3440;
+}
+
+app-sync content .btn, app-sync content .swal2-popup .swal2-actions button, .swal2-popup .swal2-actions app-sync content button, app-sync content .swal2-popup .swal2-actions button.swal2-confirm, .swal2-popup .swal2-actions app-sync content button.swal2-confirm {
+ margin-bottom: 10px;
+}
+
+app-password-generator .password-block {
+ font-size: 18px;
+ font-family: Menlo, Monaco, Consolas, "Courier New", monospace;
+ margin: 20px;
+}
+app-password-generator .password-block .password-wrapper {
+ text-align: center;
+}
+
+app-home {
+ position: fixed;
+ height: 100%;
+ width: 100%;
+}
+app-home .center-content {
+ margin-top: -50px;
+ height: calc(100% + 50px);
+}
+app-home img {
+ width: 284px;
+ margin: 0 auto;
+}
+app-home p.lead {
+ margin: 30px 0;
+}
+app-home .btn + .btn, app-home .swal2-popup .swal2-actions button + .btn, .swal2-popup .swal2-actions app-home button + .btn, app-home .swal2-popup .swal2-actions .btn + button, .swal2-popup .swal2-actions app-home .btn + button, app-home .swal2-popup .swal2-actions button + button, .swal2-popup .swal2-actions app-home button + button, app-home .swal2-popup .swal2-actions button.swal2-confirm + button, .swal2-popup .swal2-actions app-home button.swal2-confirm + button, app-home .swal2-popup .swal2-actions button + button.swal2-confirm, .swal2-popup .swal2-actions app-home button + button.swal2-confirm {
+ margin-top: 10px;
+}
+app-home a.settings-icon {
+ position: absolute;
+ top: 10px;
+ left: 10px;
+}
+html.theme_light app-home a.settings-icon {
+ color: #777;
+}
+html.theme_dark app-home a.settings-icon {
+ color: #a3a3a3;
+}
+html.theme_nord app-home a.settings-icon {
+ color: #D8DEE9;
+}
+html.theme_solarizedDark app-home a.settings-icon {
+ color: #839496;
+}
+app-home a.settings-icon:not(:hover):not(:focus) span {
+ clip: rect(0 0 0 0);
+ clip-path: inset(50%);
+ height: 1px;
+ overflow: hidden;
+ position: absolute;
+ white-space: nowrap;
+ width: 1px;
+}
+app-home a.settings-icon:hover, app-home a.settings-icon:focus {
+ text-decoration: none;
+}
+html.theme_light app-home a.settings-icon:hover, html.theme_light app-home a.settings-icon:focus {
+ color: #175DDC;
+}
+html.theme_dark app-home a.settings-icon:hover, html.theme_dark app-home a.settings-icon:focus {
+ color: #52bdfb;
+}
+html.theme_nord app-home a.settings-icon:hover, html.theme_nord app-home a.settings-icon:focus {
+ color: #81A1C1;
+}
+html.theme_solarizedDark app-home a.settings-icon:hover, html.theme_solarizedDark app-home a.settings-icon:focus {
+ color: #859900;
+}
+
+body.body-sm app-home .center-content, body.body-xs app-home .center-content {
+ margin-top: 0;
+ height: 100%;
+}
+body.body-sm app-home p.lead, body.body-xs app-home p.lead {
+ margin: 15px 0;
+}
+
+body.body-full app-home .center-content {
+ margin-top: -80px;
+ height: calc(100% + 80px);
+}
diff --git a/src/iOS.Safari/Resources/popup/main.js b/src/iOS.Safari/Resources/popup/main.js
new file mode 100644
index 000000000..b069c7934
--- /dev/null
+++ b/src/iOS.Safari/Resources/popup/main.js
@@ -0,0 +1,31990 @@
+/******/ (function(modules) { // webpackBootstrap
+/******/ // install a JSONP callback for chunk loading
+/******/ function webpackJsonpCallback(data) {
+/******/ var chunkIds = data[0];
+/******/ var moreModules = data[1];
+/******/ var executeModules = data[2];
+/******/
+/******/ // add "moreModules" to the modules object,
+/******/ // then flag all "chunkIds" as loaded and fire callback
+/******/ var moduleId, chunkId, i = 0, resolves = [];
+/******/ for(;i < chunkIds.length; i++) {
+/******/ chunkId = chunkIds[i];
+/******/ if(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {
+/******/ resolves.push(installedChunks[chunkId][0]);
+/******/ }
+/******/ installedChunks[chunkId] = 0;
+/******/ }
+/******/ for(moduleId in moreModules) {
+/******/ if(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {
+/******/ modules[moduleId] = moreModules[moduleId];
+/******/ }
+/******/ }
+/******/ if(parentJsonpFunction) parentJsonpFunction(data);
+/******/
+/******/ while(resolves.length) {
+/******/ resolves.shift()();
+/******/ }
+/******/
+/******/ // add entry modules from loaded chunk to deferred list
+/******/ deferredModules.push.apply(deferredModules, executeModules || []);
+/******/
+/******/ // run deferred modules when all chunks ready
+/******/ return checkDeferredModules();
+/******/ };
+/******/ function checkDeferredModules() {
+/******/ var result;
+/******/ for(var i = 0; i < deferredModules.length; i++) {
+/******/ var deferredModule = deferredModules[i];
+/******/ var fulfilled = true;
+/******/ for(var j = 1; j < deferredModule.length; j++) {
+/******/ var depId = deferredModule[j];
+/******/ if(installedChunks[depId] !== 0) fulfilled = false;
+/******/ }
+/******/ if(fulfilled) {
+/******/ deferredModules.splice(i--, 1);
+/******/ result = __webpack_require__(__webpack_require__.s = deferredModule[0]);
+/******/ }
+/******/ }
+/******/
+/******/ return result;
+/******/ }
+/******/
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // object to store loaded and loading chunks
+/******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched
+/******/ // Promise = chunk loading, 0 = chunk loaded
+/******/ var installedChunks = {
+/******/ "popup/main": 0
+/******/ };
+/******/
+/******/ var deferredModules = [];
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ var jsonpArray = window["webpackJsonp"] = window["webpackJsonp"] || [];
+/******/ var oldJsonpFunction = jsonpArray.push.bind(jsonpArray);
+/******/ jsonpArray.push = webpackJsonpCallback;
+/******/ jsonpArray = jsonpArray.slice();
+/******/ for(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);
+/******/ var parentJsonpFunction = oldJsonpFunction;
+/******/
+/******/
+/******/ // add entry module to deferred list
+/******/ deferredModules.push(["./src/popup/main.ts","popup/vendor","popup/vendor-angular"]);
+/******/ // run deferred modules when ready
+/******/ return checkDeferredModules();
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./$$_lazy_route_resource lazy recursive":
+/*!******************************************************!*\
+ !*** ./$$_lazy_route_resource lazy namespace object ***!
+ \******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+function webpackEmptyAsyncContext(req) {
+ // Here Promise.resolve().then() is used instead of new Promise() to prevent
+ // uncaught exception popping up in devtools
+ return Promise.resolve().then(function() {
+ var e = new Error("Cannot find module '" + req + "'");
+ e.code = 'MODULE_NOT_FOUND';
+ throw e;
+ });
+}
+webpackEmptyAsyncContext.keys = function() { return []; };
+webpackEmptyAsyncContext.resolve = webpackEmptyAsyncContext;
+module.exports = webpackEmptyAsyncContext;
+webpackEmptyAsyncContext.id = "./$$_lazy_route_resource lazy recursive";
+
+/***/ }),
+
+/***/ "./jslib/angular/src/components/add-edit-custom-fields.component.ts":
+/*!**************************************************************************!*\
+ !*** ./jslib/angular/src/components/add-edit-custom-fields.component.ts ***!
+ \**************************************************************************/
+/*! exports provided: AddEditCustomFieldsComponent */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AddEditCustomFieldsComponent", function() { return AddEditCustomFieldsComponent; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var _angular_cdk_drag_drop__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @angular/cdk/drag-drop */ "./node_modules/@angular/cdk/__ivy_ngcc__/fesm2015/drag-drop.js");
+/* harmony import */ var jslib_common_abstractions_event_service__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! jslib-common/abstractions/event.service */ "./jslib/common/src/abstractions/event.service.ts");
+/* harmony import */ var jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! jslib-common/abstractions/i18n.service */ "./jslib/common/src/abstractions/i18n.service.ts");
+/* harmony import */ var jslib_common_models_view_cipherView__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! jslib-common/models/view/cipherView */ "./jslib/common/src/models/view/cipherView.ts");
+/* harmony import */ var jslib_common_models_view_fieldView__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! jslib-common/models/view/fieldView */ "./jslib/common/src/models/view/fieldView.ts");
+/* harmony import */ var jslib_common_enums_cipherType__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! jslib-common/enums/cipherType */ "./jslib/common/src/enums/cipherType.ts");
+/* harmony import */ var jslib_common_enums_eventType__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! jslib-common/enums/eventType */ "./jslib/common/src/enums/eventType.ts");
+/* harmony import */ var jslib_common_enums_fieldType__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! jslib-common/enums/fieldType */ "./jslib/common/src/enums/fieldType.ts");
+/* harmony import */ var jslib_common_misc_utils__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! jslib-common/misc/utils */ "./jslib/common/src/misc/utils.ts");
+
+
+
+
+
+
+
+
+
+
+
+
+
+class AddEditCustomFieldsComponent {
+ constructor(i18nService, eventService) {
+ this.i18nService = i18nService;
+ this.eventService = eventService;
+ this.addFieldType = jslib_common_enums_fieldType__WEBPACK_IMPORTED_MODULE_8__["FieldType"].Text;
+ this.linkedFieldOptions = [];
+ this.cipherType = jslib_common_enums_cipherType__WEBPACK_IMPORTED_MODULE_6__["CipherType"];
+ this.fieldType = jslib_common_enums_fieldType__WEBPACK_IMPORTED_MODULE_8__["FieldType"];
+ this.eventType = jslib_common_enums_eventType__WEBPACK_IMPORTED_MODULE_7__["EventType"];
+ this.addFieldTypeOptions = [
+ { name: i18nService.t('cfTypeText'), value: jslib_common_enums_fieldType__WEBPACK_IMPORTED_MODULE_8__["FieldType"].Text },
+ { name: i18nService.t('cfTypeHidden'), value: jslib_common_enums_fieldType__WEBPACK_IMPORTED_MODULE_8__["FieldType"].Hidden },
+ { name: i18nService.t('cfTypeBoolean'), value: jslib_common_enums_fieldType__WEBPACK_IMPORTED_MODULE_8__["FieldType"].Boolean },
+ ];
+ this.addFieldLinkedTypeOption = { name: this.i18nService.t('cfTypeLinked'), value: jslib_common_enums_fieldType__WEBPACK_IMPORTED_MODULE_8__["FieldType"].Linked };
+ }
+ ngOnChanges(changes) {
+ if (changes.thisCipherType != null) {
+ this.setLinkedFieldOptions();
+ }
+ }
+ addField() {
+ if (this.cipher.fields == null) {
+ this.cipher.fields = [];
+ }
+ const f = new jslib_common_models_view_fieldView__WEBPACK_IMPORTED_MODULE_5__["FieldView"]();
+ f.type = this.addFieldType;
+ f.newField = true;
+ if (f.type === jslib_common_enums_fieldType__WEBPACK_IMPORTED_MODULE_8__["FieldType"].Linked) {
+ f.linkedId = this.linkedFieldOptions[0].value;
+ }
+ this.cipher.fields.push(f);
+ }
+ removeField(field) {
+ const i = this.cipher.fields.indexOf(field);
+ if (i > -1) {
+ this.cipher.fields.splice(i, 1);
+ }
+ }
+ toggleFieldValue(field) {
+ const f = field;
+ f.showValue = !f.showValue;
+ if (this.editMode && f.showValue) {
+ this.eventService.collect(jslib_common_enums_eventType__WEBPACK_IMPORTED_MODULE_7__["EventType"].Cipher_ClientToggledHiddenFieldVisible, this.cipher.id);
+ }
+ }
+ trackByFunction(index, item) {
+ return index;
+ }
+ drop(event) {
+ Object(_angular_cdk_drag_drop__WEBPACK_IMPORTED_MODULE_1__["moveItemInArray"])(this.cipher.fields, event.previousIndex, event.currentIndex);
+ }
+ setLinkedFieldOptions() {
+ // Delete any Linked custom fields if the item type does not support them
+ if (this.cipher.linkedFieldOptions == null) {
+ this.cipher.fields = this.cipher.fields.filter(f => f.type !== jslib_common_enums_fieldType__WEBPACK_IMPORTED_MODULE_8__["FieldType"].Linked);
+ return;
+ }
+ const options = [];
+ this.cipher.linkedFieldOptions.forEach((linkedFieldOption, id) => options.push({ name: this.i18nService.t(linkedFieldOption.i18nKey), value: id }));
+ this.linkedFieldOptions = options.sort(jslib_common_misc_utils__WEBPACK_IMPORTED_MODULE_9__["Utils"].getSortFunction(this.i18nService, 'name'));
+ if (!this.editMode) {
+ this.cipher.fields
+ .filter(f => f.type = jslib_common_enums_fieldType__WEBPACK_IMPORTED_MODULE_8__["FieldType"].Linked)
+ .forEach(f => f.linkedId = this.linkedFieldOptions[0].value);
+ }
+ }
+}
+AddEditCustomFieldsComponent.ɵfac = function AddEditCustomFieldsComponent_Factory(t) { return new (t || AddEditCustomFieldsComponent)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_3__["I18nService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_event_service__WEBPACK_IMPORTED_MODULE_2__["EventService"])); };
+AddEditCustomFieldsComponent.ɵdir = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineDirective"]({ type: AddEditCustomFieldsComponent, inputs: { cipher: "cipher", thisCipherType: "thisCipherType", editMode: "editMode" }, features: [_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵNgOnChangesFeature"]] });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](AddEditCustomFieldsComponent, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Directive"]
+ }], function () { return [{ type: jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_3__["I18nService"] }, { type: jslib_common_abstractions_event_service__WEBPACK_IMPORTED_MODULE_2__["EventService"] }]; }, { cipher: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"]
+ }], thisCipherType: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"]
+ }], editMode: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"]
+ }] }); })();
+
+
+/***/ }),
+
+/***/ "./jslib/angular/src/components/add-edit.component.ts":
+/*!************************************************************!*\
+ !*** ./jslib/angular/src/components/add-edit.component.ts ***!
+ \************************************************************/
+/*! exports provided: AddEditComponent */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AddEditComponent", function() { return AddEditComponent; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var jslib_common_enums_cipherRepromptType__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! jslib-common/enums/cipherRepromptType */ "./jslib/common/src/enums/cipherRepromptType.ts");
+/* harmony import */ var jslib_common_enums_cipherType__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! jslib-common/enums/cipherType */ "./jslib/common/src/enums/cipherType.ts");
+/* harmony import */ var jslib_common_enums_eventType__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! jslib-common/enums/eventType */ "./jslib/common/src/enums/eventType.ts");
+/* harmony import */ var jslib_common_enums_organizationUserStatusType__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! jslib-common/enums/organizationUserStatusType */ "./jslib/common/src/enums/organizationUserStatusType.ts");
+/* harmony import */ var jslib_common_enums_policyType__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! jslib-common/enums/policyType */ "./jslib/common/src/enums/policyType.ts");
+/* harmony import */ var jslib_common_enums_secureNoteType__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! jslib-common/enums/secureNoteType */ "./jslib/common/src/enums/secureNoteType.ts");
+/* harmony import */ var jslib_common_enums_uriMatchType__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! jslib-common/enums/uriMatchType */ "./jslib/common/src/enums/uriMatchType.ts");
+/* harmony import */ var jslib_common_abstractions_audit_service__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! jslib-common/abstractions/audit.service */ "./jslib/common/src/abstractions/audit.service.ts");
+/* harmony import */ var jslib_common_abstractions_cipher_service__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! jslib-common/abstractions/cipher.service */ "./jslib/common/src/abstractions/cipher.service.ts");
+/* harmony import */ var jslib_common_abstractions_collection_service__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! jslib-common/abstractions/collection.service */ "./jslib/common/src/abstractions/collection.service.ts");
+/* harmony import */ var jslib_common_abstractions_event_service__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! jslib-common/abstractions/event.service */ "./jslib/common/src/abstractions/event.service.ts");
+/* harmony import */ var jslib_common_abstractions_folder_service__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! jslib-common/abstractions/folder.service */ "./jslib/common/src/abstractions/folder.service.ts");
+/* harmony import */ var jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! jslib-common/abstractions/i18n.service */ "./jslib/common/src/abstractions/i18n.service.ts");
+/* harmony import */ var jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! jslib-common/abstractions/log.service */ "./jslib/common/src/abstractions/log.service.ts");
+/* harmony import */ var jslib_common_abstractions_messaging_service__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! jslib-common/abstractions/messaging.service */ "./jslib/common/src/abstractions/messaging.service.ts");
+/* harmony import */ var jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! jslib-common/abstractions/platformUtils.service */ "./jslib/common/src/abstractions/platformUtils.service.ts");
+/* harmony import */ var jslib_common_abstractions_policy_service__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! jslib-common/abstractions/policy.service */ "./jslib/common/src/abstractions/policy.service.ts");
+/* harmony import */ var jslib_common_abstractions_state_service__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! jslib-common/abstractions/state.service */ "./jslib/common/src/abstractions/state.service.ts");
+/* harmony import */ var jslib_common_abstractions_user_service__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! jslib-common/abstractions/user.service */ "./jslib/common/src/abstractions/user.service.ts");
+/* harmony import */ var jslib_common_models_view_cardView__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! jslib-common/models/view/cardView */ "./jslib/common/src/models/view/cardView.ts");
+/* harmony import */ var jslib_common_models_view_cipherView__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! jslib-common/models/view/cipherView */ "./jslib/common/src/models/view/cipherView.ts");
+/* harmony import */ var jslib_common_models_view_identityView__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! jslib-common/models/view/identityView */ "./jslib/common/src/models/view/identityView.ts");
+/* harmony import */ var jslib_common_models_view_loginUriView__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! jslib-common/models/view/loginUriView */ "./jslib/common/src/models/view/loginUriView.ts");
+/* harmony import */ var jslib_common_models_view_loginView__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! jslib-common/models/view/loginView */ "./jslib/common/src/models/view/loginView.ts");
+/* harmony import */ var jslib_common_models_view_secureNoteView__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! jslib-common/models/view/secureNoteView */ "./jslib/common/src/models/view/secureNoteView.ts");
+/* harmony import */ var jslib_common_misc_utils__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! jslib-common/misc/utils */ "./jslib/common/src/misc/utils.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+class AddEditComponent {
+ constructor(cipherService, folderService, i18nService, platformUtilsService, auditService, stateService, userService, collectionService, messagingService, eventService, policyService, logService) {
+ this.cipherService = cipherService;
+ this.folderService = folderService;
+ this.i18nService = i18nService;
+ this.platformUtilsService = platformUtilsService;
+ this.auditService = auditService;
+ this.stateService = stateService;
+ this.userService = userService;
+ this.collectionService = collectionService;
+ this.messagingService = messagingService;
+ this.eventService = eventService;
+ this.policyService = policyService;
+ this.logService = logService;
+ this.cloneMode = false;
+ this.folderId = null;
+ this.organizationId = null;
+ this.onSavedCipher = new _angular_core__WEBPACK_IMPORTED_MODULE_0__["EventEmitter"]();
+ this.onDeletedCipher = new _angular_core__WEBPACK_IMPORTED_MODULE_0__["EventEmitter"]();
+ this.onRestoredCipher = new _angular_core__WEBPACK_IMPORTED_MODULE_0__["EventEmitter"]();
+ this.onCancelled = new _angular_core__WEBPACK_IMPORTED_MODULE_0__["EventEmitter"]();
+ this.onEditAttachments = new _angular_core__WEBPACK_IMPORTED_MODULE_0__["EventEmitter"]();
+ this.onShareCipher = new _angular_core__WEBPACK_IMPORTED_MODULE_0__["EventEmitter"]();
+ this.onEditCollections = new _angular_core__WEBPACK_IMPORTED_MODULE_0__["EventEmitter"]();
+ this.onGeneratePassword = new _angular_core__WEBPACK_IMPORTED_MODULE_0__["EventEmitter"]();
+ this.editMode = false;
+ this.collections = [];
+ this.showPassword = false;
+ this.showCardNumber = false;
+ this.showCardCode = false;
+ this.cipherType = jslib_common_enums_cipherType__WEBPACK_IMPORTED_MODULE_2__["CipherType"];
+ this.ownershipOptions = [];
+ this.currentDate = new Date();
+ this.allowPersonal = true;
+ this.reprompt = false;
+ this.typeOptions = [
+ { name: i18nService.t('typeLogin'), value: jslib_common_enums_cipherType__WEBPACK_IMPORTED_MODULE_2__["CipherType"].Login },
+ { name: i18nService.t('typeCard'), value: jslib_common_enums_cipherType__WEBPACK_IMPORTED_MODULE_2__["CipherType"].Card },
+ { name: i18nService.t('typeIdentity'), value: jslib_common_enums_cipherType__WEBPACK_IMPORTED_MODULE_2__["CipherType"].Identity },
+ { name: i18nService.t('typeSecureNote'), value: jslib_common_enums_cipherType__WEBPACK_IMPORTED_MODULE_2__["CipherType"].SecureNote },
+ ];
+ this.cardBrandOptions = [
+ { name: '-- ' + i18nService.t('select') + ' --', value: null },
+ { name: 'Visa', value: 'Visa' },
+ { name: 'Mastercard', value: 'Mastercard' },
+ { name: 'American Express', value: 'Amex' },
+ { name: 'Discover', value: 'Discover' },
+ { name: 'Diners Club', value: 'Diners Club' },
+ { name: 'JCB', value: 'JCB' },
+ { name: 'Maestro', value: 'Maestro' },
+ { name: 'UnionPay', value: 'UnionPay' },
+ { name: i18nService.t('other'), value: 'Other' },
+ ];
+ this.cardExpMonthOptions = [
+ { name: '-- ' + i18nService.t('select') + ' --', value: null },
+ { name: '01 - ' + i18nService.t('january'), value: '1' },
+ { name: '02 - ' + i18nService.t('february'), value: '2' },
+ { name: '03 - ' + i18nService.t('march'), value: '3' },
+ { name: '04 - ' + i18nService.t('april'), value: '4' },
+ { name: '05 - ' + i18nService.t('may'), value: '5' },
+ { name: '06 - ' + i18nService.t('june'), value: '6' },
+ { name: '07 - ' + i18nService.t('july'), value: '7' },
+ { name: '08 - ' + i18nService.t('august'), value: '8' },
+ { name: '09 - ' + i18nService.t('september'), value: '9' },
+ { name: '10 - ' + i18nService.t('october'), value: '10' },
+ { name: '11 - ' + i18nService.t('november'), value: '11' },
+ { name: '12 - ' + i18nService.t('december'), value: '12' },
+ ];
+ this.identityTitleOptions = [
+ { name: '-- ' + i18nService.t('select') + ' --', value: null },
+ { name: i18nService.t('mr'), value: i18nService.t('mr') },
+ { name: i18nService.t('mrs'), value: i18nService.t('mrs') },
+ { name: i18nService.t('ms'), value: i18nService.t('ms') },
+ { name: i18nService.t('dr'), value: i18nService.t('dr') },
+ ];
+ this.uriMatchOptions = [
+ { name: i18nService.t('defaultMatchDetection'), value: null },
+ { name: i18nService.t('baseDomain'), value: jslib_common_enums_uriMatchType__WEBPACK_IMPORTED_MODULE_7__["UriMatchType"].Domain },
+ { name: i18nService.t('host'), value: jslib_common_enums_uriMatchType__WEBPACK_IMPORTED_MODULE_7__["UriMatchType"].Host },
+ { name: i18nService.t('startsWith'), value: jslib_common_enums_uriMatchType__WEBPACK_IMPORTED_MODULE_7__["UriMatchType"].StartsWith },
+ { name: i18nService.t('regEx'), value: jslib_common_enums_uriMatchType__WEBPACK_IMPORTED_MODULE_7__["UriMatchType"].RegularExpression },
+ { name: i18nService.t('exact'), value: jslib_common_enums_uriMatchType__WEBPACK_IMPORTED_MODULE_7__["UriMatchType"].Exact },
+ { name: i18nService.t('never'), value: jslib_common_enums_uriMatchType__WEBPACK_IMPORTED_MODULE_7__["UriMatchType"].Never },
+ ];
+ this.autofillOnPageLoadOptions = [
+ { name: i18nService.t('autoFillOnPageLoadUseDefault'), value: null },
+ { name: i18nService.t('autoFillOnPageLoadYes'), value: true },
+ { name: i18nService.t('autoFillOnPageLoadNo'), value: false },
+ ];
+ }
+ ngOnInit() {
+ return __awaiter(this, void 0, void 0, function* () {
+ yield this.init();
+ });
+ }
+ init() {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (yield this.policyService.policyAppliesToUser(jslib_common_enums_policyType__WEBPACK_IMPORTED_MODULE_5__["PolicyType"].PersonalOwnership)) {
+ this.allowPersonal = false;
+ }
+ else {
+ const myEmail = yield this.userService.getEmail();
+ this.ownershipOptions.push({ name: myEmail, value: null });
+ }
+ const orgs = yield this.userService.getAllOrganizations();
+ orgs.sort(jslib_common_misc_utils__WEBPACK_IMPORTED_MODULE_26__["Utils"].getSortFunction(this.i18nService, 'name')).forEach(o => {
+ if (o.enabled && o.status === jslib_common_enums_organizationUserStatusType__WEBPACK_IMPORTED_MODULE_4__["OrganizationUserStatusType"].Confirmed) {
+ this.ownershipOptions.push({ name: o.name, value: o.id });
+ }
+ });
+ if (!this.allowPersonal) {
+ this.organizationId = this.ownershipOptions[0].value;
+ }
+ this.writeableCollections = yield this.loadCollections();
+ });
+ }
+ load() {
+ return __awaiter(this, void 0, void 0, function* () {
+ this.editMode = this.cipherId != null;
+ if (this.editMode) {
+ this.editMode = true;
+ if (this.cloneMode) {
+ this.cloneMode = true;
+ this.title = this.i18nService.t('addItem');
+ }
+ else {
+ this.title = this.i18nService.t('editItem');
+ }
+ }
+ else {
+ this.title = this.i18nService.t('addItem');
+ }
+ const addEditCipherInfo = yield this.stateService.get('addEditCipherInfo');
+ if (addEditCipherInfo != null) {
+ this.cipher = addEditCipherInfo.cipher;
+ this.collectionIds = addEditCipherInfo.collectionIds;
+ }
+ yield this.stateService.remove('addEditCipherInfo');
+ if (this.cipher == null) {
+ if (this.editMode) {
+ const cipher = yield this.loadCipher();
+ this.cipher = yield cipher.decrypt();
+ // Adjust Cipher Name if Cloning
+ if (this.cloneMode) {
+ this.cipher.name += ' - ' + this.i18nService.t('clone');
+ // If not allowing personal ownership, update cipher's org Id to prompt downstream changes
+ if (this.cipher.organizationId == null && !this.allowPersonal) {
+ this.cipher.organizationId = this.organizationId;
+ }
+ }
+ }
+ else {
+ this.cipher = new jslib_common_models_view_cipherView__WEBPACK_IMPORTED_MODULE_21__["CipherView"]();
+ this.cipher.organizationId = this.organizationId == null ? null : this.organizationId;
+ this.cipher.folderId = this.folderId;
+ this.cipher.type = this.type == null ? jslib_common_enums_cipherType__WEBPACK_IMPORTED_MODULE_2__["CipherType"].Login : this.type;
+ this.cipher.login = new jslib_common_models_view_loginView__WEBPACK_IMPORTED_MODULE_24__["LoginView"]();
+ this.cipher.login.uris = [new jslib_common_models_view_loginUriView__WEBPACK_IMPORTED_MODULE_23__["LoginUriView"]()];
+ this.cipher.card = new jslib_common_models_view_cardView__WEBPACK_IMPORTED_MODULE_20__["CardView"]();
+ this.cipher.identity = new jslib_common_models_view_identityView__WEBPACK_IMPORTED_MODULE_22__["IdentityView"]();
+ this.cipher.secureNote = new jslib_common_models_view_secureNoteView__WEBPACK_IMPORTED_MODULE_25__["SecureNoteView"]();
+ this.cipher.secureNote.type = jslib_common_enums_secureNoteType__WEBPACK_IMPORTED_MODULE_6__["SecureNoteType"].Generic;
+ this.cipher.reprompt = jslib_common_enums_cipherRepromptType__WEBPACK_IMPORTED_MODULE_1__["CipherRepromptType"].None;
+ }
+ }
+ if (this.cipher != null && (!this.editMode || addEditCipherInfo != null || this.cloneMode)) {
+ yield this.organizationChanged();
+ if (this.collectionIds != null && this.collectionIds.length > 0 && this.collections.length > 0) {
+ this.collections.forEach(c => {
+ if (this.collectionIds.indexOf(c.id) > -1) {
+ c.checked = true;
+ }
+ });
+ }
+ }
+ this.folders = yield this.folderService.getAllDecrypted();
+ if (this.editMode && this.previousCipherId !== this.cipherId) {
+ this.eventService.collect(jslib_common_enums_eventType__WEBPACK_IMPORTED_MODULE_3__["EventType"].Cipher_ClientViewed, this.cipherId);
+ }
+ this.previousCipherId = this.cipherId;
+ this.reprompt = this.cipher.reprompt !== jslib_common_enums_cipherRepromptType__WEBPACK_IMPORTED_MODULE_1__["CipherRepromptType"].None;
+ });
+ }
+ submit() {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (this.cipher.isDeleted) {
+ return this.restore();
+ }
+ if (this.cipher.name == null || this.cipher.name === '') {
+ this.platformUtilsService.showToast('error', this.i18nService.t('errorOccurred'), this.i18nService.t('nameRequired'));
+ return false;
+ }
+ if ((!this.editMode || this.cloneMode) && !this.allowPersonal && this.cipher.organizationId == null) {
+ this.platformUtilsService.showToast('error', this.i18nService.t('errorOccurred'), this.i18nService.t('personalOwnershipSubmitError'));
+ return false;
+ }
+ if ((!this.editMode || this.cloneMode) && this.cipher.type === jslib_common_enums_cipherType__WEBPACK_IMPORTED_MODULE_2__["CipherType"].Login &&
+ this.cipher.login.uris != null && this.cipher.login.uris.length === 1 &&
+ (this.cipher.login.uris[0].uri == null || this.cipher.login.uris[0].uri === '')) {
+ this.cipher.login.uris = null;
+ }
+ // Allows saving of selected collections during "Add" and "Clone" flows
+ if ((!this.editMode || this.cloneMode) && this.cipher.organizationId != null) {
+ this.cipher.collectionIds = this.collections == null ? [] :
+ this.collections.filter(c => c.checked).map(c => c.id);
+ }
+ // Clear current Cipher Id to trigger "Add" cipher flow
+ if (this.cloneMode) {
+ this.cipher.id = null;
+ }
+ const cipher = yield this.encryptCipher();
+ try {
+ this.formPromise = this.saveCipher(cipher);
+ yield this.formPromise;
+ this.cipher.id = cipher.id;
+ this.platformUtilsService.showToast('success', null, this.i18nService.t(this.editMode && !this.cloneMode ? 'editedItem' : 'addedItem'));
+ this.onSavedCipher.emit(this.cipher);
+ this.messagingService.send(this.editMode && !this.cloneMode ? 'editedCipher' : 'addedCipher');
+ return true;
+ }
+ catch (e) {
+ this.logService.error(e);
+ }
+ return false;
+ });
+ }
+ addUri() {
+ if (this.cipher.type !== jslib_common_enums_cipherType__WEBPACK_IMPORTED_MODULE_2__["CipherType"].Login) {
+ return;
+ }
+ if (this.cipher.login.uris == null) {
+ this.cipher.login.uris = [];
+ }
+ this.cipher.login.uris.push(new jslib_common_models_view_loginUriView__WEBPACK_IMPORTED_MODULE_23__["LoginUriView"]());
+ }
+ removeUri(uri) {
+ if (this.cipher.type !== jslib_common_enums_cipherType__WEBPACK_IMPORTED_MODULE_2__["CipherType"].Login || this.cipher.login.uris == null) {
+ return;
+ }
+ const i = this.cipher.login.uris.indexOf(uri);
+ if (i > -1) {
+ this.cipher.login.uris.splice(i, 1);
+ }
+ }
+ trackByFunction(index, item) {
+ return index;
+ }
+ cancel() {
+ this.onCancelled.emit(this.cipher);
+ }
+ attachments() {
+ this.onEditAttachments.emit(this.cipher);
+ }
+ share() {
+ this.onShareCipher.emit(this.cipher);
+ }
+ editCollections() {
+ this.onEditCollections.emit(this.cipher);
+ }
+ delete() {
+ return __awaiter(this, void 0, void 0, function* () {
+ const confirmed = yield this.platformUtilsService.showDialog(this.i18nService.t(this.cipher.isDeleted ? 'permanentlyDeleteItemConfirmation' : 'deleteItemConfirmation'), this.i18nService.t('deleteItem'), this.i18nService.t('yes'), this.i18nService.t('no'), 'warning');
+ if (!confirmed) {
+ return false;
+ }
+ try {
+ this.deletePromise = this.deleteCipher();
+ yield this.deletePromise;
+ this.platformUtilsService.showToast('success', null, this.i18nService.t(this.cipher.isDeleted ? 'permanentlyDeletedItem' : 'deletedItem'));
+ this.onDeletedCipher.emit(this.cipher);
+ this.messagingService.send(this.cipher.isDeleted ? 'permanentlyDeletedCipher' : 'deletedCipher');
+ }
+ catch (e) {
+ this.logService.error(e);
+ }
+ return true;
+ });
+ }
+ restore() {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (!this.cipher.isDeleted) {
+ return false;
+ }
+ const confirmed = yield this.platformUtilsService.showDialog(this.i18nService.t('restoreItemConfirmation'), this.i18nService.t('restoreItem'), this.i18nService.t('yes'), this.i18nService.t('no'), 'warning');
+ if (!confirmed) {
+ return false;
+ }
+ try {
+ this.restorePromise = this.restoreCipher();
+ yield this.restorePromise;
+ this.platformUtilsService.showToast('success', null, this.i18nService.t('restoredItem'));
+ this.onRestoredCipher.emit(this.cipher);
+ this.messagingService.send('restoredCipher');
+ }
+ catch (e) {
+ this.logService.error(e);
+ }
+ return true;
+ });
+ }
+ generatePassword() {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (this.cipher.login != null && this.cipher.login.password != null && this.cipher.login.password.length) {
+ const confirmed = yield this.platformUtilsService.showDialog(this.i18nService.t('overwritePasswordConfirmation'), this.i18nService.t('overwritePassword'), this.i18nService.t('yes'), this.i18nService.t('no'));
+ if (!confirmed) {
+ return false;
+ }
+ }
+ this.onGeneratePassword.emit();
+ return true;
+ });
+ }
+ togglePassword() {
+ this.showPassword = !this.showPassword;
+ document.getElementById('loginPassword').focus();
+ if (this.editMode && this.showPassword) {
+ this.eventService.collect(jslib_common_enums_eventType__WEBPACK_IMPORTED_MODULE_3__["EventType"].Cipher_ClientToggledPasswordVisible, this.cipherId);
+ }
+ }
+ toggleCardNumber() {
+ return __awaiter(this, void 0, void 0, function* () {
+ this.showCardNumber = !this.showCardNumber;
+ if (this.showCardNumber) {
+ this.eventService.collect(jslib_common_enums_eventType__WEBPACK_IMPORTED_MODULE_3__["EventType"].Cipher_ClientToggledCardNumberVisible, this.cipherId);
+ }
+ });
+ }
+ toggleCardCode() {
+ this.showCardCode = !this.showCardCode;
+ document.getElementById('cardCode').focus();
+ if (this.editMode && this.showCardCode) {
+ this.eventService.collect(jslib_common_enums_eventType__WEBPACK_IMPORTED_MODULE_3__["EventType"].Cipher_ClientToggledCardCodeVisible, this.cipherId);
+ }
+ }
+ toggleUriOptions(uri) {
+ const u = uri;
+ u.showOptions = u.showOptions == null && uri.match != null ? false : !u.showOptions;
+ }
+ loginUriMatchChanged(uri) {
+ const u = uri;
+ u.showOptions = u.showOptions == null ? true : u.showOptions;
+ }
+ organizationChanged() {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (this.writeableCollections != null) {
+ this.writeableCollections.forEach(c => c.checked = false);
+ }
+ if (this.cipher.organizationId != null) {
+ this.collections = this.writeableCollections.filter(c => c.organizationId === this.cipher.organizationId);
+ const org = yield this.userService.getOrganization(this.cipher.organizationId);
+ if (org != null) {
+ this.cipher.organizationUseTotp = org.useTotp;
+ }
+ }
+ else {
+ this.collections = [];
+ }
+ });
+ }
+ checkPassword() {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (this.checkPasswordPromise != null) {
+ return;
+ }
+ if (this.cipher.login == null || this.cipher.login.password == null || this.cipher.login.password === '') {
+ return;
+ }
+ this.checkPasswordPromise = this.auditService.passwordLeaked(this.cipher.login.password);
+ const matches = yield this.checkPasswordPromise;
+ this.checkPasswordPromise = null;
+ if (matches > 0) {
+ this.platformUtilsService.showToast('warning', null, this.i18nService.t('passwordExposed', matches.toString()));
+ }
+ else {
+ this.platformUtilsService.showToast('success', null, this.i18nService.t('passwordSafe'));
+ }
+ });
+ }
+ repromptChanged() {
+ this.reprompt = !this.reprompt;
+ if (this.reprompt) {
+ this.cipher.reprompt = jslib_common_enums_cipherRepromptType__WEBPACK_IMPORTED_MODULE_1__["CipherRepromptType"].Password;
+ }
+ else {
+ this.cipher.reprompt = jslib_common_enums_cipherRepromptType__WEBPACK_IMPORTED_MODULE_1__["CipherRepromptType"].None;
+ }
+ }
+ loadCollections() {
+ return __awaiter(this, void 0, void 0, function* () {
+ const allCollections = yield this.collectionService.getAllDecrypted();
+ return allCollections.filter(c => !c.readOnly);
+ });
+ }
+ loadCipher() {
+ return this.cipherService.get(this.cipherId);
+ }
+ encryptCipher() {
+ return this.cipherService.encrypt(this.cipher);
+ }
+ saveCipher(cipher) {
+ return this.cipherService.saveWithServer(cipher);
+ }
+ deleteCipher() {
+ return this.cipher.isDeleted ? this.cipherService.deleteWithServer(this.cipher.id)
+ : this.cipherService.softDeleteWithServer(this.cipher.id);
+ }
+ restoreCipher() {
+ return this.cipherService.restoreWithServer(this.cipher.id);
+ }
+}
+AddEditComponent.ɵfac = function AddEditComponent_Factory(t) { return new (t || AddEditComponent)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_cipher_service__WEBPACK_IMPORTED_MODULE_9__["CipherService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_folder_service__WEBPACK_IMPORTED_MODULE_12__["FolderService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_13__["I18nService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_16__["PlatformUtilsService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_audit_service__WEBPACK_IMPORTED_MODULE_8__["AuditService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_state_service__WEBPACK_IMPORTED_MODULE_18__["StateService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_user_service__WEBPACK_IMPORTED_MODULE_19__["UserService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_collection_service__WEBPACK_IMPORTED_MODULE_10__["CollectionService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_messaging_service__WEBPACK_IMPORTED_MODULE_15__["MessagingService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_event_service__WEBPACK_IMPORTED_MODULE_11__["EventService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_policy_service__WEBPACK_IMPORTED_MODULE_17__["PolicyService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_14__["LogService"])); };
+AddEditComponent.ɵdir = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineDirective"]({ type: AddEditComponent, inputs: { cloneMode: "cloneMode", folderId: "folderId", cipherId: "cipherId", type: "type", collectionIds: "collectionIds", organizationId: "organizationId" }, outputs: { onSavedCipher: "onSavedCipher", onDeletedCipher: "onDeletedCipher", onRestoredCipher: "onRestoredCipher", onCancelled: "onCancelled", onEditAttachments: "onEditAttachments", onShareCipher: "onShareCipher", onEditCollections: "onEditCollections", onGeneratePassword: "onGeneratePassword" } });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](AddEditComponent, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Directive"]
+ }], function () { return [{ type: jslib_common_abstractions_cipher_service__WEBPACK_IMPORTED_MODULE_9__["CipherService"] }, { type: jslib_common_abstractions_folder_service__WEBPACK_IMPORTED_MODULE_12__["FolderService"] }, { type: jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_13__["I18nService"] }, { type: jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_16__["PlatformUtilsService"] }, { type: jslib_common_abstractions_audit_service__WEBPACK_IMPORTED_MODULE_8__["AuditService"] }, { type: jslib_common_abstractions_state_service__WEBPACK_IMPORTED_MODULE_18__["StateService"] }, { type: jslib_common_abstractions_user_service__WEBPACK_IMPORTED_MODULE_19__["UserService"] }, { type: jslib_common_abstractions_collection_service__WEBPACK_IMPORTED_MODULE_10__["CollectionService"] }, { type: jslib_common_abstractions_messaging_service__WEBPACK_IMPORTED_MODULE_15__["MessagingService"] }, { type: jslib_common_abstractions_event_service__WEBPACK_IMPORTED_MODULE_11__["EventService"] }, { type: jslib_common_abstractions_policy_service__WEBPACK_IMPORTED_MODULE_17__["PolicyService"] }, { type: jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_14__["LogService"] }]; }, { cloneMode: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"]
+ }], folderId: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"]
+ }], cipherId: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"]
+ }], type: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"]
+ }], collectionIds: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"]
+ }], organizationId: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"]
+ }], onSavedCipher: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Output"]
+ }], onDeletedCipher: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Output"]
+ }], onRestoredCipher: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Output"]
+ }], onCancelled: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Output"]
+ }], onEditAttachments: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Output"]
+ }], onShareCipher: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Output"]
+ }], onEditCollections: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Output"]
+ }], onGeneratePassword: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Output"]
+ }] }); })();
+
+
+/***/ }),
+
+/***/ "./jslib/angular/src/components/attachments.component.ts":
+/*!***************************************************************!*\
+ !*** ./jslib/angular/src/components/attachments.component.ts ***!
+ \***************************************************************/
+/*! exports provided: AttachmentsComponent */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AttachmentsComponent", function() { return AttachmentsComponent; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var jslib_common_abstractions_api_service__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! jslib-common/abstractions/api.service */ "./jslib/common/src/abstractions/api.service.ts");
+/* harmony import */ var jslib_common_abstractions_cipher_service__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! jslib-common/abstractions/cipher.service */ "./jslib/common/src/abstractions/cipher.service.ts");
+/* harmony import */ var jslib_common_abstractions_crypto_service__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! jslib-common/abstractions/crypto.service */ "./jslib/common/src/abstractions/crypto.service.ts");
+/* harmony import */ var jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! jslib-common/abstractions/i18n.service */ "./jslib/common/src/abstractions/i18n.service.ts");
+/* harmony import */ var jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! jslib-common/abstractions/log.service */ "./jslib/common/src/abstractions/log.service.ts");
+/* harmony import */ var jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! jslib-common/abstractions/platformUtils.service */ "./jslib/common/src/abstractions/platformUtils.service.ts");
+/* harmony import */ var jslib_common_abstractions_user_service__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! jslib-common/abstractions/user.service */ "./jslib/common/src/abstractions/user.service.ts");
+/* harmony import */ var jslib_common_models_response_errorResponse__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! jslib-common/models/response/errorResponse */ "./jslib/common/src/models/response/errorResponse.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+class AttachmentsComponent {
+ constructor(cipherService, i18nService, cryptoService, userService, platformUtilsService, apiService, win, logService) {
+ this.cipherService = cipherService;
+ this.i18nService = i18nService;
+ this.cryptoService = cryptoService;
+ this.userService = userService;
+ this.platformUtilsService = platformUtilsService;
+ this.apiService = apiService;
+ this.win = win;
+ this.logService = logService;
+ this.onUploadedAttachment = new _angular_core__WEBPACK_IMPORTED_MODULE_0__["EventEmitter"]();
+ this.onDeletedAttachment = new _angular_core__WEBPACK_IMPORTED_MODULE_0__["EventEmitter"]();
+ this.onReuploadedAttachment = new _angular_core__WEBPACK_IMPORTED_MODULE_0__["EventEmitter"]();
+ this.deletePromises = {};
+ this.reuploadPromises = {};
+ this.emergencyAccessId = null;
+ }
+ ngOnInit() {
+ return __awaiter(this, void 0, void 0, function* () {
+ yield this.init();
+ });
+ }
+ submit() {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (!this.hasUpdatedKey) {
+ this.platformUtilsService.showToast('error', this.i18nService.t('errorOccurred'), this.i18nService.t('updateKey'));
+ return;
+ }
+ const fileEl = document.getElementById('file');
+ const files = fileEl.files;
+ if (files == null || files.length === 0) {
+ this.platformUtilsService.showToast('error', this.i18nService.t('errorOccurred'), this.i18nService.t('selectFile'));
+ return;
+ }
+ if (files[0].size > 524288000) { // 500 MB
+ this.platformUtilsService.showToast('error', this.i18nService.t('errorOccurred'), this.i18nService.t('maxFileSize'));
+ return;
+ }
+ try {
+ this.formPromise = this.saveCipherAttachment(files[0]);
+ this.cipherDomain = yield this.formPromise;
+ this.cipher = yield this.cipherDomain.decrypt();
+ this.platformUtilsService.showToast('success', null, this.i18nService.t('attachmentSaved'));
+ this.onUploadedAttachment.emit();
+ }
+ catch (e) {
+ this.logService.error(e);
+ }
+ // reset file input
+ // ref: https://stackoverflow.com/a/20552042
+ fileEl.type = '';
+ fileEl.type = 'file';
+ fileEl.value = '';
+ });
+ }
+ delete(attachment) {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (this.deletePromises[attachment.id] != null) {
+ return;
+ }
+ const confirmed = yield this.platformUtilsService.showDialog(this.i18nService.t('deleteAttachmentConfirmation'), this.i18nService.t('deleteAttachment'), this.i18nService.t('yes'), this.i18nService.t('no'), 'warning');
+ if (!confirmed) {
+ return;
+ }
+ try {
+ this.deletePromises[attachment.id] = this.deleteCipherAttachment(attachment.id);
+ yield this.deletePromises[attachment.id];
+ this.platformUtilsService.showToast('success', null, this.i18nService.t('deletedAttachment'));
+ const i = this.cipher.attachments.indexOf(attachment);
+ if (i > -1) {
+ this.cipher.attachments.splice(i, 1);
+ }
+ }
+ catch (e) {
+ this.logService.error(e);
+ }
+ this.deletePromises[attachment.id] = null;
+ this.onDeletedAttachment.emit();
+ });
+ }
+ download(attachment) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const a = attachment;
+ if (a.downloading) {
+ return;
+ }
+ if (!this.canAccessAttachments) {
+ this.platformUtilsService.showToast('error', this.i18nService.t('premiumRequired'), this.i18nService.t('premiumRequiredDesc'));
+ return;
+ }
+ let url;
+ try {
+ const attachmentDownloadResponse = yield this.apiService.getAttachmentData(this.cipher.id, attachment.id, this.emergencyAccessId);
+ url = attachmentDownloadResponse.url;
+ }
+ catch (e) {
+ if (e instanceof jslib_common_models_response_errorResponse__WEBPACK_IMPORTED_MODULE_8__["ErrorResponse"] && e.statusCode === 404) {
+ url = attachment.url;
+ }
+ else if (e instanceof jslib_common_models_response_errorResponse__WEBPACK_IMPORTED_MODULE_8__["ErrorResponse"]) {
+ throw new Error(e.getSingleMessage());
+ }
+ else {
+ throw e;
+ }
+ }
+ a.downloading = true;
+ const response = yield fetch(new Request(url, { cache: 'no-store' }));
+ if (response.status !== 200) {
+ this.platformUtilsService.showToast('error', null, this.i18nService.t('errorOccurred'));
+ a.downloading = false;
+ return;
+ }
+ try {
+ const buf = yield response.arrayBuffer();
+ const key = attachment.key != null ? attachment.key :
+ yield this.cryptoService.getOrgKey(this.cipher.organizationId);
+ const decBuf = yield this.cryptoService.decryptFromBytes(buf, key);
+ this.platformUtilsService.saveFile(this.win, decBuf, null, attachment.fileName);
+ }
+ catch (e) {
+ this.platformUtilsService.showToast('error', null, this.i18nService.t('errorOccurred'));
+ }
+ a.downloading = false;
+ });
+ }
+ init() {
+ return __awaiter(this, void 0, void 0, function* () {
+ this.cipherDomain = yield this.loadCipher();
+ this.cipher = yield this.cipherDomain.decrypt();
+ this.hasUpdatedKey = yield this.cryptoService.hasEncKey();
+ const canAccessPremium = yield this.userService.canAccessPremium();
+ this.canAccessAttachments = canAccessPremium || this.cipher.organizationId != null;
+ if (!this.canAccessAttachments) {
+ const confirmed = yield this.platformUtilsService.showDialog(this.i18nService.t('premiumRequiredDesc'), this.i18nService.t('premiumRequired'), this.i18nService.t('learnMore'), this.i18nService.t('cancel'));
+ if (confirmed) {
+ this.platformUtilsService.launchUri('https://vault.bitwarden.com/#/?premium=purchase');
+ }
+ }
+ else if (!this.hasUpdatedKey) {
+ const confirmed = yield this.platformUtilsService.showDialog(this.i18nService.t('updateKey'), this.i18nService.t('featureUnavailable'), this.i18nService.t('learnMore'), this.i18nService.t('cancel'), 'warning');
+ if (confirmed) {
+ this.platformUtilsService.launchUri('https://help.bitwarden.com/article/update-encryption-key/');
+ }
+ }
+ });
+ }
+ reuploadCipherAttachment(attachment, admin) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const a = attachment;
+ if (attachment.key != null || a.downloading || this.reuploadPromises[attachment.id] != null) {
+ return;
+ }
+ try {
+ this.reuploadPromises[attachment.id] = Promise.resolve().then(() => __awaiter(this, void 0, void 0, function* () {
+ // 1. Download
+ a.downloading = true;
+ const response = yield fetch(new Request(attachment.url, { cache: 'no-store' }));
+ if (response.status !== 200) {
+ this.platformUtilsService.showToast('error', null, this.i18nService.t('errorOccurred'));
+ a.downloading = false;
+ return;
+ }
+ try {
+ // 2. Resave
+ const buf = yield response.arrayBuffer();
+ const key = attachment.key != null ? attachment.key :
+ yield this.cryptoService.getOrgKey(this.cipher.organizationId);
+ const decBuf = yield this.cryptoService.decryptFromBytes(buf, key);
+ this.cipherDomain = yield this.cipherService.saveAttachmentRawWithServer(this.cipherDomain, attachment.fileName, decBuf, admin);
+ this.cipher = yield this.cipherDomain.decrypt();
+ // 3. Delete old
+ this.deletePromises[attachment.id] = this.deleteCipherAttachment(attachment.id);
+ yield this.deletePromises[attachment.id];
+ const foundAttachment = this.cipher.attachments.filter(a2 => a2.id === attachment.id);
+ if (foundAttachment.length > 0) {
+ const i = this.cipher.attachments.indexOf(foundAttachment[0]);
+ if (i > -1) {
+ this.cipher.attachments.splice(i, 1);
+ }
+ }
+ this.platformUtilsService.showToast('success', null, this.i18nService.t('attachmentSaved'));
+ this.onReuploadedAttachment.emit();
+ }
+ catch (e) {
+ this.platformUtilsService.showToast('error', null, this.i18nService.t('errorOccurred'));
+ }
+ a.downloading = false;
+ }));
+ yield this.reuploadPromises[attachment.id];
+ }
+ catch (e) {
+ this.logService.error(e);
+ }
+ });
+ }
+ loadCipher() {
+ return this.cipherService.get(this.cipherId);
+ }
+ saveCipherAttachment(file) {
+ return this.cipherService.saveAttachmentWithServer(this.cipherDomain, file);
+ }
+ deleteCipherAttachment(attachmentId) {
+ return this.cipherService.deleteAttachmentWithServer(this.cipher.id, attachmentId);
+ }
+}
+AttachmentsComponent.ɵfac = function AttachmentsComponent_Factory(t) { return new (t || AttachmentsComponent)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_cipher_service__WEBPACK_IMPORTED_MODULE_2__["CipherService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_4__["I18nService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_crypto_service__WEBPACK_IMPORTED_MODULE_3__["CryptoService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_user_service__WEBPACK_IMPORTED_MODULE_7__["UserService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_6__["PlatformUtilsService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_api_service__WEBPACK_IMPORTED_MODULE_1__["ApiService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](Window), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_5__["LogService"])); };
+AttachmentsComponent.ɵdir = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineDirective"]({ type: AttachmentsComponent, inputs: { cipherId: "cipherId" }, outputs: { onUploadedAttachment: "onUploadedAttachment", onDeletedAttachment: "onDeletedAttachment", onReuploadedAttachment: "onReuploadedAttachment" } });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](AttachmentsComponent, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Directive"]
+ }], function () { return [{ type: jslib_common_abstractions_cipher_service__WEBPACK_IMPORTED_MODULE_2__["CipherService"] }, { type: jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_4__["I18nService"] }, { type: jslib_common_abstractions_crypto_service__WEBPACK_IMPORTED_MODULE_3__["CryptoService"] }, { type: jslib_common_abstractions_user_service__WEBPACK_IMPORTED_MODULE_7__["UserService"] }, { type: jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_6__["PlatformUtilsService"] }, { type: jslib_common_abstractions_api_service__WEBPACK_IMPORTED_MODULE_1__["ApiService"] }, { type: Window }, { type: jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_5__["LogService"] }]; }, { cipherId: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"]
+ }], onUploadedAttachment: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Output"]
+ }], onDeletedAttachment: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Output"]
+ }], onReuploadedAttachment: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Output"]
+ }] }); })();
+
+
+/***/ }),
+
+/***/ "./jslib/angular/src/components/callout.component.ts":
+/*!***********************************************************!*\
+ !*** ./jslib/angular/src/components/callout.component.ts ***!
+ \***********************************************************/
+/*! exports provided: CalloutComponent */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CalloutComponent", function() { return CalloutComponent; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! jslib-common/abstractions/i18n.service */ "./jslib/common/src/abstractions/i18n.service.ts");
+/* harmony import */ var jslib_common_models_domain_masterPasswordPolicyOptions__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! jslib-common/models/domain/masterPasswordPolicyOptions */ "./jslib/common/src/models/domain/masterPasswordPolicyOptions.ts");
+/* harmony import */ var _angular_common__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @angular/common */ "./node_modules/@angular/common/__ivy_ngcc__/fesm2015/common.js");
+/* harmony import */ var jslib_angular_pipes_i18n_pipe__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! jslib-angular/pipes/i18n.pipe */ "./jslib/angular/src/pipes/i18n.pipe.ts");
+
+
+
+
+
+
+
+function CalloutComponent_h3_3_i_2_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](0, "i", 6);
+} if (rf & 2) {
+ const ctx_r3 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵclassMapInterpolate1"]("fa ", ctx_r3.icon, "");
+} }
+function CalloutComponent_h3_3_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "h3", 4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](2, CalloutComponent_h3_3_i_2_Template, 1, 3, "i", 5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r1 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", ctx_r1.icon);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate1"]("\n ", ctx_r1.title, "\n ");
+} }
+function CalloutComponent_div_5_li_4_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "li");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](2, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r4 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate1"]("\n ", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind2"](2, 1, "policyInEffectMinComplexity", ctx_r4.getPasswordScoreAlertDisplay()), "\n ");
+} }
+function CalloutComponent_div_5_li_6_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "li");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](2, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r5 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate1"]("\n ", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind2"](2, 1, "policyInEffectMinLength", ctx_r5.enforcedPolicyOptions == null ? null : ctx_r5.enforcedPolicyOptions.minLength.toString()), "\n ");
+} }
+function CalloutComponent_div_5_li_8_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "li");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](2, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate1"]("\n ", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](2, 1, "policyInEffectUppercase"), "");
+} }
+function CalloutComponent_div_5_li_10_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "li");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](2, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate1"]("\n ", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](2, 1, "policyInEffectLowercase"), "");
+} }
+function CalloutComponent_div_5_li_12_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "li");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](2, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate1"]("\n ", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](2, 1, "policyInEffectNumbers"), "");
+} }
+function CalloutComponent_div_5_li_14_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "li");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](2, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate1"]("\n ", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind2"](2, 1, "policyInEffectSpecial", "!@#$%^&*"), "");
+} }
+function CalloutComponent_div_5_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "div", 7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](2, "ul");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](4, CalloutComponent_div_5_li_4_Template, 3, 4, "li", 8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](6, CalloutComponent_div_5_li_6_Template, 3, 4, "li", 8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](8, CalloutComponent_div_5_li_8_Template, 3, 3, "li", 8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](9, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](10, CalloutComponent_div_5_li_10_Template, 3, 3, "li", 8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](11, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](12, CalloutComponent_div_5_li_12_Template, 3, 3, "li", 8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](13, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](14, CalloutComponent_div_5_li_14_Template, 3, 4, "li", 8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](15, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](16, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r2 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate1"]("\n ", ctx_r2.enforcedPolicyMessage, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", (ctx_r2.enforcedPolicyOptions == null ? null : ctx_r2.enforcedPolicyOptions.minComplexity) > 0);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", (ctx_r2.enforcedPolicyOptions == null ? null : ctx_r2.enforcedPolicyOptions.minLength) > 0);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", ctx_r2.enforcedPolicyOptions == null ? null : ctx_r2.enforcedPolicyOptions.requireUpper);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", ctx_r2.enforcedPolicyOptions == null ? null : ctx_r2.enforcedPolicyOptions.requireLower);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", ctx_r2.enforcedPolicyOptions == null ? null : ctx_r2.enforcedPolicyOptions.requireNumbers);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", ctx_r2.enforcedPolicyOptions == null ? null : ctx_r2.enforcedPolicyOptions.requireSpecial);
+} }
+const _c0 = function (a0) { return { "clickable": a0 }; };
+const _c1 = ["*"];
+class CalloutComponent {
+ constructor(i18nService) {
+ this.i18nService = i18nService;
+ this.type = 'info';
+ this.useAlertRole = false;
+ }
+ ngOnInit() {
+ this.calloutStyle = this.type;
+ if (this.enforcedPolicyMessage === undefined) {
+ this.enforcedPolicyMessage = this.i18nService.t('masterPasswordPolicyInEffect');
+ }
+ if (this.type === 'warning' || this.type === 'danger') {
+ if (this.type === 'danger') {
+ this.calloutStyle = 'danger';
+ }
+ if (this.title === undefined) {
+ this.title = this.i18nService.t('warning');
+ }
+ if (this.icon === undefined) {
+ this.icon = 'fa-warning';
+ }
+ }
+ else if (this.type === 'error') {
+ this.calloutStyle = 'danger';
+ if (this.title === undefined) {
+ this.title = this.i18nService.t('error');
+ }
+ if (this.icon === undefined) {
+ this.icon = 'fa-bolt';
+ }
+ }
+ else if (this.type === 'tip') {
+ this.calloutStyle = 'success';
+ if (this.title === undefined) {
+ this.title = this.i18nService.t('tip');
+ }
+ if (this.icon === undefined) {
+ this.icon = 'fa-lightbulb-o';
+ }
+ }
+ }
+ getPasswordScoreAlertDisplay() {
+ if (this.enforcedPolicyOptions == null) {
+ return '';
+ }
+ let str;
+ switch (this.enforcedPolicyOptions.minComplexity) {
+ case 4:
+ str = this.i18nService.t('strong');
+ break;
+ case 3:
+ str = this.i18nService.t('good');
+ break;
+ default:
+ str = this.i18nService.t('weak');
+ break;
+ }
+ return str + ' (' + this.enforcedPolicyOptions.minComplexity + ')';
+ }
+}
+CalloutComponent.ɵfac = function CalloutComponent_Factory(t) { return new (t || CalloutComponent)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_1__["I18nService"])); };
+CalloutComponent.ɵcmp = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineComponent"]({ type: CalloutComponent, selectors: [["app-callout"]], inputs: { type: "type", icon: "icon", title: "title", clickable: "clickable", enforcedPolicyOptions: "enforcedPolicyOptions", enforcedPolicyMessage: "enforcedPolicyMessage", useAlertRole: "useAlertRole" }, ngContentSelectors: _c1, decls: 10, vars: 9, consts: [[3, "ngClass"], ["callout", ""], ["class", "callout-heading", 4, "ngIf"], ["class", "enforced-policy-options", 4, "ngIf"], [1, "callout-heading"], ["aria-hidden", "true", 3, "class", 4, "ngIf"], ["aria-hidden", "true"], [1, "enforced-policy-options"], [4, "ngIf"]], template: function CalloutComponent_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵprojectionDef"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "div", 0, 1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](2, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](3, CalloutComponent_h3_3_Template, 4, 2, "h3", 2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](4, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](5, CalloutComponent_div_5_Template, 17, 7, "div", 3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](6, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵprojection"](7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](8, "\n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](9, "\n");
+ } if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵclassMapInterpolate1"]("callout callout-", ctx.calloutStyle, "");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngClass", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpureFunction1"](7, _c0, ctx.clickable));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵattribute"]("role", ctx.useAlertRole ? "alert" : null);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", ctx.title);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", ctx.enforcedPolicyOptions);
+ } }, directives: [_angular_common__WEBPACK_IMPORTED_MODULE_3__["NgClass"], _angular_common__WEBPACK_IMPORTED_MODULE_3__["NgIf"]], pipes: [jslib_angular_pipes_i18n_pipe__WEBPACK_IMPORTED_MODULE_4__["I18nPipe"]], encapsulation: 2 });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](CalloutComponent, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Component"],
+ args: [{
+ selector: 'app-callout',
+ templateUrl: 'callout.component.html',
+ }]
+ }], function () { return [{ type: jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_1__["I18nService"] }]; }, { type: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"]
+ }], icon: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"]
+ }], title: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"]
+ }], clickable: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"]
+ }], enforcedPolicyOptions: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"]
+ }], enforcedPolicyMessage: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"]
+ }], useAlertRole: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"]
+ }] }); })();
+
+
+/***/ }),
+
+/***/ "./jslib/angular/src/components/captchaProtected.component.ts":
+/*!********************************************************************!*\
+ !*** ./jslib/angular/src/components/captchaProtected.component.ts ***!
+ \********************************************************************/
+/*! exports provided: CaptchaProtectedComponent */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CaptchaProtectedComponent", function() { return CaptchaProtectedComponent; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var jslib_common_abstractions_environment_service__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! jslib-common/abstractions/environment.service */ "./jslib/common/src/abstractions/environment.service.ts");
+/* harmony import */ var jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! jslib-common/abstractions/i18n.service */ "./jslib/common/src/abstractions/i18n.service.ts");
+/* harmony import */ var jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! jslib-common/abstractions/platformUtils.service */ "./jslib/common/src/abstractions/platformUtils.service.ts");
+/* harmony import */ var jslib_common_misc_captcha_iframe__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! jslib-common/misc/captcha_iframe */ "./jslib/common/src/misc/captcha_iframe.ts");
+/* harmony import */ var jslib_common_misc_utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! jslib-common/misc/utils */ "./jslib/common/src/misc/utils.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+
+
+
+
+
+
+
+
+class CaptchaProtectedComponent {
+ constructor(environmentService, i18nService, platformUtilsService) {
+ this.environmentService = environmentService;
+ this.i18nService = i18nService;
+ this.platformUtilsService = platformUtilsService;
+ this.captchaSiteKey = null;
+ this.captchaToken = null;
+ }
+ setupCaptcha() {
+ return __awaiter(this, void 0, void 0, function* () {
+ const webVaultUrl = this.environmentService.getWebVaultUrl();
+ this.captcha = new jslib_common_misc_captcha_iframe__WEBPACK_IMPORTED_MODULE_4__["CaptchaIFrame"](window, webVaultUrl, this.i18nService, (token) => {
+ this.captchaToken = token;
+ }, (error) => {
+ this.platformUtilsService.showToast('error', this.i18nService.t('errorOccurred'), error);
+ }, (info) => {
+ this.platformUtilsService.showToast('info', this.i18nService.t('info'), info);
+ });
+ });
+ }
+ showCaptcha() {
+ return !jslib_common_misc_utils__WEBPACK_IMPORTED_MODULE_5__["Utils"].isNullOrWhitespace(this.captchaSiteKey);
+ }
+ handleCaptchaRequired(response) {
+ if (jslib_common_misc_utils__WEBPACK_IMPORTED_MODULE_5__["Utils"].isNullOrWhitespace(response.captchaSiteKey)) {
+ return false;
+ }
+ this.captchaSiteKey = response.captchaSiteKey;
+ this.captcha.init(response.captchaSiteKey);
+ return true;
+ }
+}
+CaptchaProtectedComponent.ɵfac = function CaptchaProtectedComponent_Factory(t) { return new (t || CaptchaProtectedComponent)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_environment_service__WEBPACK_IMPORTED_MODULE_1__["EnvironmentService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_2__["I18nService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_3__["PlatformUtilsService"])); };
+CaptchaProtectedComponent.ɵdir = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineDirective"]({ type: CaptchaProtectedComponent, inputs: { captchaSiteKey: "captchaSiteKey" } });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](CaptchaProtectedComponent, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Directive"]
+ }], function () { return [{ type: jslib_common_abstractions_environment_service__WEBPACK_IMPORTED_MODULE_1__["EnvironmentService"] }, { type: jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_2__["I18nService"] }, { type: jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_3__["PlatformUtilsService"] }]; }, { captchaSiteKey: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"]
+ }] }); })();
+
+
+/***/ }),
+
+/***/ "./jslib/angular/src/components/change-password.component.ts":
+/*!*******************************************************************!*\
+ !*** ./jslib/angular/src/components/change-password.component.ts ***!
+ \*******************************************************************/
+/*! exports provided: ChangePasswordComponent */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ChangePasswordComponent", function() { return ChangePasswordComponent; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var jslib_common_abstractions_crypto_service__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! jslib-common/abstractions/crypto.service */ "./jslib/common/src/abstractions/crypto.service.ts");
+/* harmony import */ var jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! jslib-common/abstractions/i18n.service */ "./jslib/common/src/abstractions/i18n.service.ts");
+/* harmony import */ var jslib_common_abstractions_messaging_service__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! jslib-common/abstractions/messaging.service */ "./jslib/common/src/abstractions/messaging.service.ts");
+/* harmony import */ var jslib_common_abstractions_passwordGeneration_service__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! jslib-common/abstractions/passwordGeneration.service */ "./jslib/common/src/abstractions/passwordGeneration.service.ts");
+/* harmony import */ var jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! jslib-common/abstractions/platformUtils.service */ "./jslib/common/src/abstractions/platformUtils.service.ts");
+/* harmony import */ var jslib_common_abstractions_policy_service__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! jslib-common/abstractions/policy.service */ "./jslib/common/src/abstractions/policy.service.ts");
+/* harmony import */ var jslib_common_abstractions_user_service__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! jslib-common/abstractions/user.service */ "./jslib/common/src/abstractions/user.service.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+class ChangePasswordComponent {
+ constructor(i18nService, cryptoService, messagingService, userService, passwordGenerationService, platformUtilsService, policyService) {
+ this.i18nService = i18nService;
+ this.cryptoService = cryptoService;
+ this.messagingService = messagingService;
+ this.userService = userService;
+ this.passwordGenerationService = passwordGenerationService;
+ this.platformUtilsService = platformUtilsService;
+ this.policyService = policyService;
+ }
+ ngOnInit() {
+ return __awaiter(this, void 0, void 0, function* () {
+ this.email = yield this.userService.getEmail();
+ this.enforcedPolicyOptions = yield this.policyService.getMasterPasswordPolicyOptions();
+ });
+ }
+ submit() {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (!(yield this.strongPassword())) {
+ return;
+ }
+ if (!(yield this.setupSubmitActions())) {
+ return;
+ }
+ const email = yield this.userService.getEmail();
+ if (this.kdf == null) {
+ this.kdf = yield this.userService.getKdf();
+ }
+ if (this.kdfIterations == null) {
+ this.kdfIterations = yield this.userService.getKdfIterations();
+ }
+ const key = yield this.cryptoService.makeKey(this.masterPassword, email.trim().toLowerCase(), this.kdf, this.kdfIterations);
+ const masterPasswordHash = yield this.cryptoService.hashPassword(this.masterPassword, key);
+ let encKey = null;
+ const existingEncKey = yield this.cryptoService.getEncKey();
+ if (existingEncKey == null) {
+ encKey = yield this.cryptoService.makeEncKey(key);
+ }
+ else {
+ encKey = yield this.cryptoService.remakeEncKey(key);
+ }
+ yield this.performSubmitActions(masterPasswordHash, key, encKey);
+ });
+ }
+ setupSubmitActions() {
+ return __awaiter(this, void 0, void 0, function* () {
+ // Override in sub-class
+ // Can be used for additional validation and/or other processes the should occur before changing passwords
+ return true;
+ });
+ }
+ performSubmitActions(masterPasswordHash, key, encKey) {
+ return __awaiter(this, void 0, void 0, function* () {
+ // Override in sub-class
+ });
+ }
+ strongPassword() {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (this.masterPassword == null || this.masterPassword === '') {
+ this.platformUtilsService.showToast('error', this.i18nService.t('errorOccurred'), this.i18nService.t('masterPassRequired'));
+ return false;
+ }
+ if (this.masterPassword.length < 8) {
+ this.platformUtilsService.showToast('error', this.i18nService.t('errorOccurred'), this.i18nService.t('masterPassLength'));
+ return false;
+ }
+ if (this.masterPassword !== this.masterPasswordRetype) {
+ this.platformUtilsService.showToast('error', this.i18nService.t('errorOccurred'), this.i18nService.t('masterPassDoesntMatch'));
+ return false;
+ }
+ const strengthResult = this.passwordGenerationService.passwordStrength(this.masterPassword, this.getPasswordStrengthUserInput());
+ if (this.enforcedPolicyOptions != null &&
+ !this.policyService.evaluateMasterPassword(strengthResult.score, this.masterPassword, this.enforcedPolicyOptions)) {
+ this.platformUtilsService.showToast('error', this.i18nService.t('errorOccurred'), this.i18nService.t('masterPasswordPolicyRequirementsNotMet'));
+ return false;
+ }
+ if (strengthResult != null && strengthResult.score < 3) {
+ const result = yield this.platformUtilsService.showDialog(this.i18nService.t('weakMasterPasswordDesc'), this.i18nService.t('weakMasterPassword'), this.i18nService.t('yes'), this.i18nService.t('no'), 'warning');
+ if (!result) {
+ return false;
+ }
+ }
+ return true;
+ });
+ }
+ updatePasswordStrength() {
+ if (this.masterPasswordStrengthTimeout != null) {
+ clearTimeout(this.masterPasswordStrengthTimeout);
+ }
+ this.masterPasswordStrengthTimeout = setTimeout(() => {
+ const strengthResult = this.passwordGenerationService.passwordStrength(this.masterPassword, this.getPasswordStrengthUserInput());
+ this.masterPasswordScore = strengthResult == null ? null : strengthResult.score;
+ }, 300);
+ }
+ logOut() {
+ return __awaiter(this, void 0, void 0, function* () {
+ const confirmed = yield this.platformUtilsService.showDialog(this.i18nService.t('logOutConfirmation'), this.i18nService.t('logOut'), this.i18nService.t('logOut'), this.i18nService.t('cancel'));
+ if (confirmed) {
+ this.messagingService.send('logout');
+ }
+ });
+ }
+ getPasswordStrengthUserInput() {
+ let userInput = [];
+ const atPosition = this.email.indexOf('@');
+ if (atPosition > -1) {
+ userInput = userInput.concat(this.email.substr(0, atPosition).trim().toLowerCase().split(/[^A-Za-z0-9]/));
+ }
+ return userInput;
+ }
+}
+ChangePasswordComponent.ɵfac = function ChangePasswordComponent_Factory(t) { return new (t || ChangePasswordComponent)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_2__["I18nService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_crypto_service__WEBPACK_IMPORTED_MODULE_1__["CryptoService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_messaging_service__WEBPACK_IMPORTED_MODULE_3__["MessagingService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_user_service__WEBPACK_IMPORTED_MODULE_7__["UserService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_passwordGeneration_service__WEBPACK_IMPORTED_MODULE_4__["PasswordGenerationService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_5__["PlatformUtilsService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_policy_service__WEBPACK_IMPORTED_MODULE_6__["PolicyService"])); };
+ChangePasswordComponent.ɵdir = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineDirective"]({ type: ChangePasswordComponent });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](ChangePasswordComponent, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Directive"]
+ }], function () { return [{ type: jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_2__["I18nService"] }, { type: jslib_common_abstractions_crypto_service__WEBPACK_IMPORTED_MODULE_1__["CryptoService"] }, { type: jslib_common_abstractions_messaging_service__WEBPACK_IMPORTED_MODULE_3__["MessagingService"] }, { type: jslib_common_abstractions_user_service__WEBPACK_IMPORTED_MODULE_7__["UserService"] }, { type: jslib_common_abstractions_passwordGeneration_service__WEBPACK_IMPORTED_MODULE_4__["PasswordGenerationService"] }, { type: jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_5__["PlatformUtilsService"] }, { type: jslib_common_abstractions_policy_service__WEBPACK_IMPORTED_MODULE_6__["PolicyService"] }]; }, null); })();
+
+
+/***/ }),
+
+/***/ "./jslib/angular/src/components/ciphers.component.ts":
+/*!***********************************************************!*\
+ !*** ./jslib/angular/src/components/ciphers.component.ts ***!
+ \***********************************************************/
+/*! exports provided: CiphersComponent */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CiphersComponent", function() { return CiphersComponent; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var jslib_common_abstractions_search_service__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! jslib-common/abstractions/search.service */ "./jslib/common/src/abstractions/search.service.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+
+
+class CiphersComponent {
+ constructor(searchService) {
+ this.searchService = searchService;
+ this.activeCipherId = null;
+ this.onCipherClicked = new _angular_core__WEBPACK_IMPORTED_MODULE_0__["EventEmitter"]();
+ this.onCipherRightClicked = new _angular_core__WEBPACK_IMPORTED_MODULE_0__["EventEmitter"]();
+ this.onAddCipher = new _angular_core__WEBPACK_IMPORTED_MODULE_0__["EventEmitter"]();
+ this.onAddCipherOptions = new _angular_core__WEBPACK_IMPORTED_MODULE_0__["EventEmitter"]();
+ this.loaded = false;
+ this.ciphers = [];
+ this.searchPlaceholder = null;
+ this.filter = null;
+ this.deleted = false;
+ this.searchPending = false;
+ this.searchTimeout = null;
+ this.deletedFilter = c => c.isDeleted === this.deleted;
+ }
+ load(filter = null, deleted = false) {
+ return __awaiter(this, void 0, void 0, function* () {
+ this.deleted = deleted || false;
+ yield this.applyFilter(filter);
+ this.loaded = true;
+ });
+ }
+ reload(filter = null, deleted = false) {
+ return __awaiter(this, void 0, void 0, function* () {
+ this.loaded = false;
+ this.ciphers = [];
+ yield this.load(filter, deleted);
+ });
+ }
+ refresh() {
+ return __awaiter(this, void 0, void 0, function* () {
+ yield this.reload(this.filter, this.deleted);
+ });
+ }
+ applyFilter(filter = null) {
+ return __awaiter(this, void 0, void 0, function* () {
+ this.filter = filter;
+ yield this.search(null);
+ });
+ }
+ search(timeout = null, indexedCiphers) {
+ return __awaiter(this, void 0, void 0, function* () {
+ this.searchPending = false;
+ if (this.searchTimeout != null) {
+ clearTimeout(this.searchTimeout);
+ }
+ if (timeout == null) {
+ yield this.doSearch(indexedCiphers);
+ return;
+ }
+ this.searchPending = true;
+ this.searchTimeout = setTimeout(() => __awaiter(this, void 0, void 0, function* () {
+ yield this.doSearch(indexedCiphers);
+ this.searchPending = false;
+ }), timeout);
+ });
+ }
+ selectCipher(cipher) {
+ this.onCipherClicked.emit(cipher);
+ }
+ rightClickCipher(cipher) {
+ this.onCipherRightClicked.emit(cipher);
+ }
+ addCipher() {
+ this.onAddCipher.emit();
+ }
+ addCipherOptions() {
+ this.onAddCipherOptions.emit();
+ }
+ isSearching() {
+ return !this.searchPending && this.searchService.isSearchable(this.searchText);
+ }
+ doSearch(indexedCiphers) {
+ return __awaiter(this, void 0, void 0, function* () {
+ this.ciphers = yield this.searchService.searchCiphers(this.searchText, [this.filter, this.deletedFilter], indexedCiphers);
+ });
+ }
+}
+CiphersComponent.ɵfac = function CiphersComponent_Factory(t) { return new (t || CiphersComponent)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_search_service__WEBPACK_IMPORTED_MODULE_1__["SearchService"])); };
+CiphersComponent.ɵdir = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineDirective"]({ type: CiphersComponent, inputs: { activeCipherId: "activeCipherId" }, outputs: { onCipherClicked: "onCipherClicked", onCipherRightClicked: "onCipherRightClicked", onAddCipher: "onAddCipher", onAddCipherOptions: "onAddCipherOptions" } });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](CiphersComponent, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Directive"]
+ }], function () { return [{ type: jslib_common_abstractions_search_service__WEBPACK_IMPORTED_MODULE_1__["SearchService"] }]; }, { activeCipherId: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"]
+ }], onCipherClicked: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Output"]
+ }], onCipherRightClicked: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Output"]
+ }], onAddCipher: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Output"]
+ }], onAddCipherOptions: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Output"]
+ }] }); })();
+
+
+/***/ }),
+
+/***/ "./jslib/angular/src/components/collections.component.ts":
+/*!***************************************************************!*\
+ !*** ./jslib/angular/src/components/collections.component.ts ***!
+ \***************************************************************/
+/*! exports provided: CollectionsComponent */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CollectionsComponent", function() { return CollectionsComponent; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var jslib_common_abstractions_cipher_service__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! jslib-common/abstractions/cipher.service */ "./jslib/common/src/abstractions/cipher.service.ts");
+/* harmony import */ var jslib_common_abstractions_collection_service__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! jslib-common/abstractions/collection.service */ "./jslib/common/src/abstractions/collection.service.ts");
+/* harmony import */ var jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! jslib-common/abstractions/i18n.service */ "./jslib/common/src/abstractions/i18n.service.ts");
+/* harmony import */ var jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! jslib-common/abstractions/log.service */ "./jslib/common/src/abstractions/log.service.ts");
+/* harmony import */ var jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! jslib-common/abstractions/platformUtils.service */ "./jslib/common/src/abstractions/platformUtils.service.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+
+
+
+
+
+
+
+
+
+
+class CollectionsComponent {
+ constructor(collectionService, platformUtilsService, i18nService, cipherService, logService) {
+ this.collectionService = collectionService;
+ this.platformUtilsService = platformUtilsService;
+ this.i18nService = i18nService;
+ this.cipherService = cipherService;
+ this.logService = logService;
+ this.allowSelectNone = false;
+ this.onSavedCollections = new _angular_core__WEBPACK_IMPORTED_MODULE_0__["EventEmitter"]();
+ this.collections = [];
+ }
+ ngOnInit() {
+ return __awaiter(this, void 0, void 0, function* () {
+ yield this.load();
+ });
+ }
+ load() {
+ return __awaiter(this, void 0, void 0, function* () {
+ this.cipherDomain = yield this.loadCipher();
+ this.collectionIds = this.loadCipherCollections();
+ this.cipher = yield this.cipherDomain.decrypt();
+ this.collections = yield this.loadCollections();
+ this.collections.forEach(c => c.checked = false);
+ if (this.collectionIds != null) {
+ this.collections.forEach(c => {
+ c.checked = this.collectionIds != null && this.collectionIds.indexOf(c.id) > -1;
+ });
+ }
+ });
+ }
+ submit() {
+ return __awaiter(this, void 0, void 0, function* () {
+ const selectedCollectionIds = this.collections
+ .filter(c => !!c.checked)
+ .map(c => c.id);
+ if (!this.allowSelectNone && selectedCollectionIds.length === 0) {
+ this.platformUtilsService.showToast('error', this.i18nService.t('errorOccurred'), this.i18nService.t('selectOneCollection'));
+ return;
+ }
+ this.cipherDomain.collectionIds = selectedCollectionIds;
+ try {
+ this.formPromise = this.saveCollections();
+ yield this.formPromise;
+ this.onSavedCollections.emit();
+ this.platformUtilsService.showToast('success', null, this.i18nService.t('editedItem'));
+ }
+ catch (e) {
+ this.logService.error(e);
+ }
+ });
+ }
+ loadCipher() {
+ return this.cipherService.get(this.cipherId);
+ }
+ loadCipherCollections() {
+ return this.cipherDomain.collectionIds;
+ }
+ loadCollections() {
+ return __awaiter(this, void 0, void 0, function* () {
+ const allCollections = yield this.collectionService.getAllDecrypted();
+ return allCollections.filter(c => !c.readOnly && c.organizationId === this.cipher.organizationId);
+ });
+ }
+ saveCollections() {
+ return this.cipherService.saveCollectionsWithServer(this.cipherDomain);
+ }
+}
+CollectionsComponent.ɵfac = function CollectionsComponent_Factory(t) { return new (t || CollectionsComponent)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_collection_service__WEBPACK_IMPORTED_MODULE_2__["CollectionService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_5__["PlatformUtilsService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_3__["I18nService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_cipher_service__WEBPACK_IMPORTED_MODULE_1__["CipherService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_4__["LogService"])); };
+CollectionsComponent.ɵdir = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineDirective"]({ type: CollectionsComponent, inputs: { cipherId: "cipherId", allowSelectNone: "allowSelectNone" }, outputs: { onSavedCollections: "onSavedCollections" } });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](CollectionsComponent, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Directive"]
+ }], function () { return [{ type: jslib_common_abstractions_collection_service__WEBPACK_IMPORTED_MODULE_2__["CollectionService"] }, { type: jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_5__["PlatformUtilsService"] }, { type: jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_3__["I18nService"] }, { type: jslib_common_abstractions_cipher_service__WEBPACK_IMPORTED_MODULE_1__["CipherService"] }, { type: jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_4__["LogService"] }]; }, { cipherId: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"]
+ }], allowSelectNone: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"]
+ }], onSavedCollections: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Output"]
+ }] }); })();
+
+
+/***/ }),
+
+/***/ "./jslib/angular/src/components/environment.component.ts":
+/*!***************************************************************!*\
+ !*** ./jslib/angular/src/components/environment.component.ts ***!
+ \***************************************************************/
+/*! exports provided: EnvironmentComponent */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "EnvironmentComponent", function() { return EnvironmentComponent; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var jslib_common_abstractions_environment_service__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! jslib-common/abstractions/environment.service */ "./jslib/common/src/abstractions/environment.service.ts");
+/* harmony import */ var jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! jslib-common/abstractions/i18n.service */ "./jslib/common/src/abstractions/i18n.service.ts");
+/* harmony import */ var jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! jslib-common/abstractions/platformUtils.service */ "./jslib/common/src/abstractions/platformUtils.service.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+
+
+
+
+
+
+class EnvironmentComponent {
+ constructor(platformUtilsService, environmentService, i18nService) {
+ this.platformUtilsService = platformUtilsService;
+ this.environmentService = environmentService;
+ this.i18nService = i18nService;
+ this.onSaved = new _angular_core__WEBPACK_IMPORTED_MODULE_0__["EventEmitter"]();
+ this.showCustom = false;
+ const urls = this.environmentService.getUrls();
+ this.baseUrl = urls.base || '';
+ this.webVaultUrl = urls.webVault || '';
+ this.apiUrl = urls.api || '';
+ this.identityUrl = urls.identity || '';
+ this.iconsUrl = urls.icons || '';
+ this.notificationsUrl = urls.notifications || '';
+ }
+ submit() {
+ return __awaiter(this, void 0, void 0, function* () {
+ const resUrls = yield this.environmentService.setUrls({
+ base: this.baseUrl,
+ api: this.apiUrl,
+ identity: this.identityUrl,
+ webVault: this.webVaultUrl,
+ icons: this.iconsUrl,
+ notifications: this.notificationsUrl,
+ });
+ // re-set urls since service can change them, ex: prefixing https://
+ this.baseUrl = resUrls.base;
+ this.apiUrl = resUrls.api;
+ this.identityUrl = resUrls.identity;
+ this.webVaultUrl = resUrls.webVault;
+ this.iconsUrl = resUrls.icons;
+ this.notificationsUrl = resUrls.notifications;
+ this.platformUtilsService.showToast('success', null, this.i18nService.t('environmentSaved'));
+ this.saved();
+ });
+ }
+ toggleCustom() {
+ this.showCustom = !this.showCustom;
+ }
+ saved() {
+ this.onSaved.emit();
+ }
+}
+EnvironmentComponent.ɵfac = function EnvironmentComponent_Factory(t) { return new (t || EnvironmentComponent)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_3__["PlatformUtilsService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_environment_service__WEBPACK_IMPORTED_MODULE_1__["EnvironmentService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_2__["I18nService"])); };
+EnvironmentComponent.ɵdir = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineDirective"]({ type: EnvironmentComponent, outputs: { onSaved: "onSaved" } });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](EnvironmentComponent, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Directive"]
+ }], function () { return [{ type: jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_3__["PlatformUtilsService"] }, { type: jslib_common_abstractions_environment_service__WEBPACK_IMPORTED_MODULE_1__["EnvironmentService"] }, { type: jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_2__["I18nService"] }]; }, { onSaved: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Output"]
+ }] }); })();
+
+
+/***/ }),
+
+/***/ "./jslib/angular/src/components/export.component.ts":
+/*!**********************************************************!*\
+ !*** ./jslib/angular/src/components/export.component.ts ***!
+ \**********************************************************/
+/*! exports provided: ExportComponent */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ExportComponent", function() { return ExportComponent; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var jslib_common_abstractions_crypto_service__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! jslib-common/abstractions/crypto.service */ "./jslib/common/src/abstractions/crypto.service.ts");
+/* harmony import */ var jslib_common_abstractions_event_service__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! jslib-common/abstractions/event.service */ "./jslib/common/src/abstractions/event.service.ts");
+/* harmony import */ var jslib_common_abstractions_export_service__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! jslib-common/abstractions/export.service */ "./jslib/common/src/abstractions/export.service.ts");
+/* harmony import */ var jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! jslib-common/abstractions/i18n.service */ "./jslib/common/src/abstractions/i18n.service.ts");
+/* harmony import */ var jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! jslib-common/abstractions/log.service */ "./jslib/common/src/abstractions/log.service.ts");
+/* harmony import */ var jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! jslib-common/abstractions/platformUtils.service */ "./jslib/common/src/abstractions/platformUtils.service.ts");
+/* harmony import */ var jslib_common_abstractions_policy_service__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! jslib-common/abstractions/policy.service */ "./jslib/common/src/abstractions/policy.service.ts");
+/* harmony import */ var jslib_common_enums_eventType__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! jslib-common/enums/eventType */ "./jslib/common/src/enums/eventType.ts");
+/* harmony import */ var jslib_common_enums_policyType__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! jslib-common/enums/policyType */ "./jslib/common/src/enums/policyType.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+class ExportComponent {
+ constructor(cryptoService, i18nService, platformUtilsService, exportService, eventService, policyService, win, logService) {
+ this.cryptoService = cryptoService;
+ this.i18nService = i18nService;
+ this.platformUtilsService = platformUtilsService;
+ this.exportService = exportService;
+ this.eventService = eventService;
+ this.policyService = policyService;
+ this.win = win;
+ this.logService = logService;
+ this.onSaved = new _angular_core__WEBPACK_IMPORTED_MODULE_0__["EventEmitter"]();
+ this.format = 'json';
+ this.showPassword = false;
+ this.disabledByPolicy = false;
+ }
+ ngOnInit() {
+ return __awaiter(this, void 0, void 0, function* () {
+ yield this.checkExportDisabled();
+ });
+ }
+ checkExportDisabled() {
+ return __awaiter(this, void 0, void 0, function* () {
+ this.disabledByPolicy = yield this.policyService.policyAppliesToUser(jslib_common_enums_policyType__WEBPACK_IMPORTED_MODULE_9__["PolicyType"].DisablePersonalVaultExport);
+ });
+ }
+ get encryptedFormat() {
+ return this.format === 'encrypted_json';
+ }
+ submit() {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (this.disabledByPolicy) {
+ this.platformUtilsService.showToast('error', null, this.i18nService.t('personalVaultExportPolicyInEffect'));
+ return;
+ }
+ if (this.masterPassword == null || this.masterPassword === '') {
+ this.platformUtilsService.showToast('error', this.i18nService.t('errorOccurred'), this.i18nService.t('invalidMasterPassword'));
+ return;
+ }
+ const acceptedWarning = yield this.warningDialog();
+ if (!acceptedWarning) {
+ return;
+ }
+ const passwordValid = yield this.cryptoService.compareAndUpdateKeyHash(this.masterPassword, null);
+ if (passwordValid) {
+ try {
+ this.formPromise = this.getExportData();
+ const data = yield this.formPromise;
+ this.downloadFile(data);
+ this.saved();
+ yield this.collectEvent();
+ }
+ catch (e) {
+ this.logService.error(e);
+ }
+ }
+ else {
+ this.platformUtilsService.showToast('error', this.i18nService.t('errorOccurred'), this.i18nService.t('invalidMasterPassword'));
+ }
+ });
+ }
+ warningDialog() {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (this.encryptedFormat) {
+ return yield this.platformUtilsService.showDialog('' + this.i18nService.t('encExportKeyWarningDesc') +
+ '
' + this.i18nService.t('encExportAccountWarningDesc'), this.i18nService.t('confirmVaultExport'), this.i18nService.t('exportVault'), this.i18nService.t('cancel'), 'warning', true);
+ }
+ else {
+ return yield this.platformUtilsService.showDialog(this.i18nService.t('exportWarningDesc'), this.i18nService.t('confirmVaultExport'), this.i18nService.t('exportVault'), this.i18nService.t('cancel'), 'warning');
+ }
+ });
+ }
+ togglePassword() {
+ this.showPassword = !this.showPassword;
+ document.getElementById('masterPassword').focus();
+ }
+ saved() {
+ this.onSaved.emit();
+ }
+ getExportData() {
+ return this.exportService.getExport(this.format);
+ }
+ getFileName(prefix) {
+ let extension = this.format;
+ if (this.format === 'encrypted_json') {
+ if (prefix == null) {
+ prefix = 'encrypted';
+ }
+ else {
+ prefix = 'encrypted_' + prefix;
+ }
+ extension = 'json';
+ }
+ return this.exportService.getFileName(prefix, extension);
+ }
+ collectEvent() {
+ return __awaiter(this, void 0, void 0, function* () {
+ yield this.eventService.collect(jslib_common_enums_eventType__WEBPACK_IMPORTED_MODULE_8__["EventType"].User_ClientExportedVault);
+ });
+ }
+ downloadFile(csv) {
+ const fileName = this.getFileName();
+ this.platformUtilsService.saveFile(this.win, csv, { type: 'text/plain' }, fileName);
+ }
+}
+ExportComponent.ɵfac = function ExportComponent_Factory(t) { return new (t || ExportComponent)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_crypto_service__WEBPACK_IMPORTED_MODULE_1__["CryptoService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_4__["I18nService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_6__["PlatformUtilsService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_export_service__WEBPACK_IMPORTED_MODULE_3__["ExportService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_event_service__WEBPACK_IMPORTED_MODULE_2__["EventService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_policy_service__WEBPACK_IMPORTED_MODULE_7__["PolicyService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](Window), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_5__["LogService"])); };
+ExportComponent.ɵdir = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineDirective"]({ type: ExportComponent, outputs: { onSaved: "onSaved" } });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](ExportComponent, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Directive"]
+ }], function () { return [{ type: jslib_common_abstractions_crypto_service__WEBPACK_IMPORTED_MODULE_1__["CryptoService"] }, { type: jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_4__["I18nService"] }, { type: jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_6__["PlatformUtilsService"] }, { type: jslib_common_abstractions_export_service__WEBPACK_IMPORTED_MODULE_3__["ExportService"] }, { type: jslib_common_abstractions_event_service__WEBPACK_IMPORTED_MODULE_2__["EventService"] }, { type: jslib_common_abstractions_policy_service__WEBPACK_IMPORTED_MODULE_7__["PolicyService"] }, { type: Window }, { type: jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_5__["LogService"] }]; }, { onSaved: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Output"]
+ }] }); })();
+
+
+/***/ }),
+
+/***/ "./jslib/angular/src/components/folder-add-edit.component.ts":
+/*!*******************************************************************!*\
+ !*** ./jslib/angular/src/components/folder-add-edit.component.ts ***!
+ \*******************************************************************/
+/*! exports provided: FolderAddEditComponent */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FolderAddEditComponent", function() { return FolderAddEditComponent; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var jslib_common_abstractions_folder_service__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! jslib-common/abstractions/folder.service */ "./jslib/common/src/abstractions/folder.service.ts");
+/* harmony import */ var jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! jslib-common/abstractions/i18n.service */ "./jslib/common/src/abstractions/i18n.service.ts");
+/* harmony import */ var jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! jslib-common/abstractions/log.service */ "./jslib/common/src/abstractions/log.service.ts");
+/* harmony import */ var jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! jslib-common/abstractions/platformUtils.service */ "./jslib/common/src/abstractions/platformUtils.service.ts");
+/* harmony import */ var jslib_common_models_view_folderView__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! jslib-common/models/view/folderView */ "./jslib/common/src/models/view/folderView.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+
+
+
+
+
+
+
+
+
+class FolderAddEditComponent {
+ constructor(folderService, i18nService, platformUtilsService, logService) {
+ this.folderService = folderService;
+ this.i18nService = i18nService;
+ this.platformUtilsService = platformUtilsService;
+ this.logService = logService;
+ this.onSavedFolder = new _angular_core__WEBPACK_IMPORTED_MODULE_0__["EventEmitter"]();
+ this.onDeletedFolder = new _angular_core__WEBPACK_IMPORTED_MODULE_0__["EventEmitter"]();
+ this.editMode = false;
+ this.folder = new jslib_common_models_view_folderView__WEBPACK_IMPORTED_MODULE_5__["FolderView"]();
+ }
+ ngOnInit() {
+ return __awaiter(this, void 0, void 0, function* () {
+ yield this.init();
+ });
+ }
+ submit() {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (this.folder.name == null || this.folder.name === '') {
+ this.platformUtilsService.showToast('error', this.i18nService.t('errorOccurred'), this.i18nService.t('nameRequired'));
+ return false;
+ }
+ try {
+ const folder = yield this.folderService.encrypt(this.folder);
+ this.formPromise = this.folderService.saveWithServer(folder);
+ yield this.formPromise;
+ this.platformUtilsService.showToast('success', null, this.i18nService.t(this.editMode ? 'editedFolder' : 'addedFolder'));
+ this.onSavedFolder.emit(this.folder);
+ return true;
+ }
+ catch (e) {
+ this.logService.error(e);
+ }
+ return false;
+ });
+ }
+ delete() {
+ return __awaiter(this, void 0, void 0, function* () {
+ const confirmed = yield this.platformUtilsService.showDialog(this.i18nService.t('deleteFolderConfirmation'), this.i18nService.t('deleteFolder'), this.i18nService.t('yes'), this.i18nService.t('no'), 'warning');
+ if (!confirmed) {
+ return false;
+ }
+ try {
+ this.deletePromise = this.folderService.deleteWithServer(this.folder.id);
+ yield this.deletePromise;
+ this.platformUtilsService.showToast('success', null, this.i18nService.t('deletedFolder'));
+ this.onDeletedFolder.emit(this.folder);
+ }
+ catch (e) {
+ this.logService.error(e);
+ }
+ return true;
+ });
+ }
+ init() {
+ return __awaiter(this, void 0, void 0, function* () {
+ this.editMode = this.folderId != null;
+ if (this.editMode) {
+ this.editMode = true;
+ this.title = this.i18nService.t('editFolder');
+ const folder = yield this.folderService.get(this.folderId);
+ this.folder = yield folder.decrypt();
+ }
+ else {
+ this.title = this.i18nService.t('addFolder');
+ }
+ });
+ }
+}
+FolderAddEditComponent.ɵfac = function FolderAddEditComponent_Factory(t) { return new (t || FolderAddEditComponent)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_folder_service__WEBPACK_IMPORTED_MODULE_1__["FolderService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_2__["I18nService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_4__["PlatformUtilsService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_3__["LogService"])); };
+FolderAddEditComponent.ɵdir = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineDirective"]({ type: FolderAddEditComponent, inputs: { folderId: "folderId" }, outputs: { onSavedFolder: "onSavedFolder", onDeletedFolder: "onDeletedFolder" } });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](FolderAddEditComponent, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Directive"]
+ }], function () { return [{ type: jslib_common_abstractions_folder_service__WEBPACK_IMPORTED_MODULE_1__["FolderService"] }, { type: jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_2__["I18nService"] }, { type: jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_4__["PlatformUtilsService"] }, { type: jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_3__["LogService"] }]; }, { folderId: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"]
+ }], onSavedFolder: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Output"]
+ }], onDeletedFolder: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Output"]
+ }] }); })();
+
+
+/***/ }),
+
+/***/ "./jslib/angular/src/components/groupings.component.ts":
+/*!*************************************************************!*\
+ !*** ./jslib/angular/src/components/groupings.component.ts ***!
+ \*************************************************************/
+/*! exports provided: GroupingsComponent */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "GroupingsComponent", function() { return GroupingsComponent; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var jslib_common_enums_cipherType__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! jslib-common/enums/cipherType */ "./jslib/common/src/enums/cipherType.ts");
+/* harmony import */ var jslib_common_abstractions_collection_service__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! jslib-common/abstractions/collection.service */ "./jslib/common/src/abstractions/collection.service.ts");
+/* harmony import */ var jslib_common_abstractions_folder_service__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! jslib-common/abstractions/folder.service */ "./jslib/common/src/abstractions/folder.service.ts");
+/* harmony import */ var jslib_common_abstractions_storage_service__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! jslib-common/abstractions/storage.service */ "./jslib/common/src/abstractions/storage.service.ts");
+/* harmony import */ var jslib_common_abstractions_user_service__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! jslib-common/abstractions/user.service */ "./jslib/common/src/abstractions/user.service.ts");
+/* harmony import */ var jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! jslib-common/services/constants.service */ "./jslib/common/src/services/constants.service.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+
+
+
+
+
+
+
+
+
+
+class GroupingsComponent {
+ constructor(collectionService, folderService, storageService, userService) {
+ this.collectionService = collectionService;
+ this.folderService = folderService;
+ this.storageService = storageService;
+ this.userService = userService;
+ this.showFolders = true;
+ this.showCollections = true;
+ this.showFavorites = true;
+ this.showTrash = true;
+ this.onAllClicked = new _angular_core__WEBPACK_IMPORTED_MODULE_0__["EventEmitter"]();
+ this.onFavoritesClicked = new _angular_core__WEBPACK_IMPORTED_MODULE_0__["EventEmitter"]();
+ this.onTrashClicked = new _angular_core__WEBPACK_IMPORTED_MODULE_0__["EventEmitter"]();
+ this.onCipherTypeClicked = new _angular_core__WEBPACK_IMPORTED_MODULE_0__["EventEmitter"]();
+ this.onFolderClicked = new _angular_core__WEBPACK_IMPORTED_MODULE_0__["EventEmitter"]();
+ this.onAddFolder = new _angular_core__WEBPACK_IMPORTED_MODULE_0__["EventEmitter"]();
+ this.onEditFolder = new _angular_core__WEBPACK_IMPORTED_MODULE_0__["EventEmitter"]();
+ this.onCollectionClicked = new _angular_core__WEBPACK_IMPORTED_MODULE_0__["EventEmitter"]();
+ this.loaded = false;
+ this.cipherType = jslib_common_enums_cipherType__WEBPACK_IMPORTED_MODULE_1__["CipherType"];
+ this.selectedAll = false;
+ this.selectedFavorites = false;
+ this.selectedTrash = false;
+ this.selectedType = null;
+ this.selectedFolder = false;
+ this.selectedFolderId = null;
+ this.selectedCollectionId = null;
+ }
+ load(setLoaded = true) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const userId = yield this.userService.getUserId();
+ this.collapsedGroupingsKey = jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_6__["ConstantsService"].collapsedGroupingsKey + '_' + userId;
+ const collapsedGroupings = yield this.storageService.get(this.collapsedGroupingsKey);
+ if (collapsedGroupings == null) {
+ this.collapsedGroupings = new Set();
+ }
+ else {
+ this.collapsedGroupings = new Set(collapsedGroupings);
+ }
+ yield this.loadFolders();
+ yield this.loadCollections();
+ if (setLoaded) {
+ this.loaded = true;
+ }
+ });
+ }
+ loadCollections(organizationId) {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (!this.showCollections) {
+ return;
+ }
+ const collections = yield this.collectionService.getAllDecrypted();
+ if (organizationId != null) {
+ this.collections = collections.filter(c => c.organizationId === organizationId);
+ }
+ else {
+ this.collections = collections;
+ }
+ this.nestedCollections = yield this.collectionService.getAllNested(this.collections);
+ });
+ }
+ loadFolders() {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (!this.showFolders) {
+ return;
+ }
+ this.folders = yield this.folderService.getAllDecrypted();
+ this.nestedFolders = yield this.folderService.getAllNested();
+ });
+ }
+ selectAll() {
+ this.clearSelections();
+ this.selectedAll = true;
+ this.onAllClicked.emit();
+ }
+ selectFavorites() {
+ this.clearSelections();
+ this.selectedFavorites = true;
+ this.onFavoritesClicked.emit();
+ }
+ selectTrash() {
+ this.clearSelections();
+ this.selectedTrash = true;
+ this.onTrashClicked.emit();
+ }
+ selectType(type) {
+ this.clearSelections();
+ this.selectedType = type;
+ this.onCipherTypeClicked.emit(type);
+ }
+ selectFolder(folder) {
+ this.clearSelections();
+ this.selectedFolder = true;
+ this.selectedFolderId = folder.id;
+ this.onFolderClicked.emit(folder);
+ }
+ addFolder() {
+ this.onAddFolder.emit();
+ }
+ editFolder(folder) {
+ this.onEditFolder.emit(folder);
+ }
+ selectCollection(collection) {
+ this.clearSelections();
+ this.selectedCollectionId = collection.id;
+ this.onCollectionClicked.emit(collection);
+ }
+ clearSelections() {
+ this.selectedAll = false;
+ this.selectedFavorites = false;
+ this.selectedTrash = false;
+ this.selectedType = null;
+ this.selectedFolder = false;
+ this.selectedFolderId = null;
+ this.selectedCollectionId = null;
+ }
+ collapse(grouping, idPrefix = '') {
+ if (grouping.id == null) {
+ return;
+ }
+ const id = idPrefix + grouping.id;
+ if (this.isCollapsed(grouping, idPrefix)) {
+ this.collapsedGroupings.delete(id);
+ }
+ else {
+ this.collapsedGroupings.add(id);
+ }
+ this.storageService.save(this.collapsedGroupingsKey, this.collapsedGroupings);
+ }
+ isCollapsed(grouping, idPrefix = '') {
+ return this.collapsedGroupings.has(idPrefix + grouping.id);
+ }
+}
+GroupingsComponent.ɵfac = function GroupingsComponent_Factory(t) { return new (t || GroupingsComponent)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_collection_service__WEBPACK_IMPORTED_MODULE_2__["CollectionService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_folder_service__WEBPACK_IMPORTED_MODULE_3__["FolderService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_storage_service__WEBPACK_IMPORTED_MODULE_4__["StorageService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_user_service__WEBPACK_IMPORTED_MODULE_5__["UserService"])); };
+GroupingsComponent.ɵdir = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineDirective"]({ type: GroupingsComponent, inputs: { showFolders: "showFolders", showCollections: "showCollections", showFavorites: "showFavorites", showTrash: "showTrash" }, outputs: { onAllClicked: "onAllClicked", onFavoritesClicked: "onFavoritesClicked", onTrashClicked: "onTrashClicked", onCipherTypeClicked: "onCipherTypeClicked", onFolderClicked: "onFolderClicked", onAddFolder: "onAddFolder", onEditFolder: "onEditFolder", onCollectionClicked: "onCollectionClicked" } });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](GroupingsComponent, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Directive"]
+ }], function () { return [{ type: jslib_common_abstractions_collection_service__WEBPACK_IMPORTED_MODULE_2__["CollectionService"] }, { type: jslib_common_abstractions_folder_service__WEBPACK_IMPORTED_MODULE_3__["FolderService"] }, { type: jslib_common_abstractions_storage_service__WEBPACK_IMPORTED_MODULE_4__["StorageService"] }, { type: jslib_common_abstractions_user_service__WEBPACK_IMPORTED_MODULE_5__["UserService"] }]; }, { showFolders: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"]
+ }], showCollections: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"]
+ }], showFavorites: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"]
+ }], showTrash: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"]
+ }], onAllClicked: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Output"]
+ }], onFavoritesClicked: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Output"]
+ }], onTrashClicked: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Output"]
+ }], onCipherTypeClicked: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Output"]
+ }], onFolderClicked: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Output"]
+ }], onAddFolder: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Output"]
+ }], onEditFolder: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Output"]
+ }], onCollectionClicked: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Output"]
+ }] }); })();
+
+
+/***/ }),
+
+/***/ "./jslib/angular/src/components/hint.component.ts":
+/*!********************************************************!*\
+ !*** ./jslib/angular/src/components/hint.component.ts ***!
+ \********************************************************/
+/*! exports provided: HintComponent */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "HintComponent", function() { return HintComponent; });
+/* harmony import */ var jslib_common_models_request_passwordHintRequest__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jslib-common/models/request/passwordHintRequest */ "./jslib/common/src/models/request/passwordHintRequest.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+class HintComponent {
+ constructor(router, i18nService, apiService, platformUtilsService, logService) {
+ this.router = router;
+ this.i18nService = i18nService;
+ this.apiService = apiService;
+ this.platformUtilsService = platformUtilsService;
+ this.logService = logService;
+ this.email = '';
+ this.successRoute = 'login';
+ }
+ submit() {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (this.email == null || this.email === '') {
+ this.platformUtilsService.showToast('error', this.i18nService.t('errorOccurred'), this.i18nService.t('emailRequired'));
+ return;
+ }
+ if (this.email.indexOf('@') === -1) {
+ this.platformUtilsService.showToast('error', this.i18nService.t('errorOccurred'), this.i18nService.t('invalidEmail'));
+ return;
+ }
+ try {
+ this.formPromise = this.apiService.postPasswordHint(new jslib_common_models_request_passwordHintRequest__WEBPACK_IMPORTED_MODULE_0__["PasswordHintRequest"](this.email));
+ yield this.formPromise;
+ this.platformUtilsService.showToast('success', null, this.i18nService.t('masterPassSent'));
+ if (this.onSuccessfulSubmit != null) {
+ this.onSuccessfulSubmit();
+ }
+ else if (this.router != null) {
+ this.router.navigate([this.successRoute]);
+ }
+ }
+ catch (e) {
+ this.logService.error(e);
+ }
+ });
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/angular/src/components/icon.component.ts":
+/*!********************************************************!*\
+ !*** ./jslib/angular/src/components/icon.component.ts ***!
+ \********************************************************/
+/*! exports provided: IconComponent */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "IconComponent", function() { return IconComponent; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var jslib_common_enums_cipherType__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! jslib-common/enums/cipherType */ "./jslib/common/src/enums/cipherType.ts");
+/* harmony import */ var jslib_common_models_view_cipherView__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! jslib-common/models/view/cipherView */ "./jslib/common/src/models/view/cipherView.ts");
+/* harmony import */ var jslib_common_abstractions_environment_service__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! jslib-common/abstractions/environment.service */ "./jslib/common/src/abstractions/environment.service.ts");
+/* harmony import */ var jslib_common_abstractions_state_service__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! jslib-common/abstractions/state.service */ "./jslib/common/src/abstractions/state.service.ts");
+/* harmony import */ var jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! jslib-common/services/constants.service */ "./jslib/common/src/services/constants.service.ts");
+/* harmony import */ var jslib_common_misc_utils__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! jslib-common/misc/utils */ "./jslib/common/src/misc/utils.ts");
+/* harmony import */ var _angular_common__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @angular/common */ "./node_modules/@angular/common/__ivy_ngcc__/fesm2015/common.js");
+/* harmony import */ var jslib_angular_directives_fallback_src_directive__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! jslib-angular/directives/fallback-src.directive */ "./jslib/angular/src/directives/fallback-src.directive.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+
+
+
+
+
+
+
+
+
+
+function IconComponent_img_2_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](0, "img", 3);
+} if (rf & 2) {
+ const ctx_r0 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate"]("appFallbackSrc", ctx_r0.fallbackImage);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("src", ctx_r0.image, _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵsanitizeUrl"]);
+} }
+function IconComponent_i_4_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](0, "i");
+} if (rf & 2) {
+ const ctx_r1 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵclassMapInterpolate1"]("fa fa-fw fa-lg ", ctx_r1.icon, "");
+} }
+const IconMap = {
+ 'fa-globe': String.fromCharCode(0xf0ac),
+ 'fa-sticky-note-o': String.fromCharCode(0xf24a),
+ 'fa-id-card-o': String.fromCharCode(0xf2c3),
+ 'fa-credit-card': String.fromCharCode(0xf09d),
+ 'fa-android': String.fromCharCode(0xf17b),
+ 'fa-apple': String.fromCharCode(0xf179),
+};
+class IconComponent {
+ constructor(environmentService, stateService) {
+ this.stateService = stateService;
+ this.iconsUrl = environmentService.getIconsUrl();
+ }
+ ngOnChanges() {
+ return __awaiter(this, void 0, void 0, function* () {
+ // Components may be re-used when using cdk-virtual-scroll. Which puts the component in a weird state,
+ // to avoid this we reset all state variables.
+ this.image = null;
+ this.fallbackImage = null;
+ this.imageEnabled = !(yield this.stateService.get(jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_5__["ConstantsService"].disableFaviconKey));
+ this.load();
+ });
+ }
+ get iconCode() {
+ return IconMap[this.icon];
+ }
+ load() {
+ switch (this.cipher.type) {
+ case jslib_common_enums_cipherType__WEBPACK_IMPORTED_MODULE_1__["CipherType"].Login:
+ this.icon = 'fa-globe';
+ this.setLoginIcon();
+ break;
+ case jslib_common_enums_cipherType__WEBPACK_IMPORTED_MODULE_1__["CipherType"].SecureNote:
+ this.icon = 'fa-sticky-note-o';
+ break;
+ case jslib_common_enums_cipherType__WEBPACK_IMPORTED_MODULE_1__["CipherType"].Card:
+ this.icon = 'fa-credit-card';
+ break;
+ case jslib_common_enums_cipherType__WEBPACK_IMPORTED_MODULE_1__["CipherType"].Identity:
+ this.icon = 'fa-id-card-o';
+ break;
+ default:
+ break;
+ }
+ }
+ setLoginIcon() {
+ if (this.cipher.login.uri) {
+ let hostnameUri = this.cipher.login.uri;
+ let isWebsite = false;
+ if (hostnameUri.indexOf('androidapp://') === 0) {
+ this.icon = 'fa-android';
+ this.image = null;
+ }
+ else if (hostnameUri.indexOf('iosapp://') === 0) {
+ this.icon = 'fa-apple';
+ this.image = null;
+ }
+ else if (this.imageEnabled && hostnameUri.indexOf('://') === -1 && hostnameUri.indexOf('.') > -1) {
+ hostnameUri = 'http://' + hostnameUri;
+ isWebsite = true;
+ }
+ else if (this.imageEnabled) {
+ isWebsite = hostnameUri.indexOf('http') === 0 && hostnameUri.indexOf('.') > -1;
+ }
+ if (this.imageEnabled && isWebsite) {
+ try {
+ this.image = this.iconsUrl + '/' + jslib_common_misc_utils__WEBPACK_IMPORTED_MODULE_6__["Utils"].getHostname(hostnameUri) + '/icon.png';
+ this.fallbackImage = 'images/fa-globe.png';
+ }
+ catch (e) {
+ // Ignore error since the fallback icon will be shown if image is null.
+ }
+ }
+ }
+ else {
+ this.image = null;
+ }
+ }
+}
+IconComponent.ɵfac = function IconComponent_Factory(t) { return new (t || IconComponent)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_environment_service__WEBPACK_IMPORTED_MODULE_3__["EnvironmentService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_state_service__WEBPACK_IMPORTED_MODULE_4__["StateService"])); };
+IconComponent.ɵcmp = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineComponent"]({ type: IconComponent, selectors: [["app-vault-icon"]], inputs: { cipher: "cipher" }, features: [_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵNgOnChangesFeature"]], decls: 7, vars: 2, consts: [["aria-hidden", "true", 1, "icon"], ["alt", "", 3, "src", "appFallbackSrc", 4, "ngIf"], [3, "class", 4, "ngIf"], ["alt", "", 3, "src", "appFallbackSrc"]], template: function IconComponent_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "div", 0);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](2, IconComponent_img_2_Template, 1, 2, "img", 1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](4, IconComponent_i_4_Template, 1, 3, "i", 2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](5, "\n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](6, "\n");
+ } if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", ctx.imageEnabled && ctx.image);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", !ctx.imageEnabled || !ctx.image);
+ } }, directives: [_angular_common__WEBPACK_IMPORTED_MODULE_7__["NgIf"], jslib_angular_directives_fallback_src_directive__WEBPACK_IMPORTED_MODULE_8__["FallbackSrcDirective"]], encapsulation: 2 });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](IconComponent, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Component"],
+ args: [{
+ selector: 'app-vault-icon',
+ templateUrl: 'icon.component.html',
+ }]
+ }], function () { return [{ type: jslib_common_abstractions_environment_service__WEBPACK_IMPORTED_MODULE_3__["EnvironmentService"] }, { type: jslib_common_abstractions_state_service__WEBPACK_IMPORTED_MODULE_4__["StateService"] }]; }, { cipher: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"]
+ }] }); })();
+
+
+/***/ }),
+
+/***/ "./jslib/angular/src/components/lock.component.ts":
+/*!********************************************************!*\
+ !*** ./jslib/angular/src/components/lock.component.ts ***!
+ \********************************************************/
+/*! exports provided: LockComponent */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LockComponent", function() { return LockComponent; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var _angular_router__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @angular/router */ "./node_modules/@angular/router/__ivy_ngcc__/fesm2015/router.js");
+/* harmony import */ var jslib_common_abstractions_api_service__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! jslib-common/abstractions/api.service */ "./jslib/common/src/abstractions/api.service.ts");
+/* harmony import */ var jslib_common_abstractions_crypto_service__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! jslib-common/abstractions/crypto.service */ "./jslib/common/src/abstractions/crypto.service.ts");
+/* harmony import */ var jslib_common_abstractions_environment_service__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! jslib-common/abstractions/environment.service */ "./jslib/common/src/abstractions/environment.service.ts");
+/* harmony import */ var jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! jslib-common/abstractions/i18n.service */ "./jslib/common/src/abstractions/i18n.service.ts");
+/* harmony import */ var jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! jslib-common/abstractions/log.service */ "./jslib/common/src/abstractions/log.service.ts");
+/* harmony import */ var jslib_common_abstractions_messaging_service__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! jslib-common/abstractions/messaging.service */ "./jslib/common/src/abstractions/messaging.service.ts");
+/* harmony import */ var jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! jslib-common/abstractions/platformUtils.service */ "./jslib/common/src/abstractions/platformUtils.service.ts");
+/* harmony import */ var jslib_common_abstractions_state_service__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! jslib-common/abstractions/state.service */ "./jslib/common/src/abstractions/state.service.ts");
+/* harmony import */ var jslib_common_abstractions_storage_service__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! jslib-common/abstractions/storage.service */ "./jslib/common/src/abstractions/storage.service.ts");
+/* harmony import */ var jslib_common_abstractions_user_service__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! jslib-common/abstractions/user.service */ "./jslib/common/src/abstractions/user.service.ts");
+/* harmony import */ var jslib_common_abstractions_vaultTimeout_service__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! jslib-common/abstractions/vaultTimeout.service */ "./jslib/common/src/abstractions/vaultTimeout.service.ts");
+/* harmony import */ var jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! jslib-common/services/constants.service */ "./jslib/common/src/services/constants.service.ts");
+/* harmony import */ var jslib_common_models_domain_encString__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! jslib-common/models/domain/encString */ "./jslib/common/src/models/domain/encString.ts");
+/* harmony import */ var jslib_common_models_request_passwordVerificationRequest__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! jslib-common/models/request/passwordVerificationRequest */ "./jslib/common/src/models/request/passwordVerificationRequest.ts");
+/* harmony import */ var jslib_common_misc_utils__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! jslib-common/misc/utils */ "./jslib/common/src/misc/utils.ts");
+/* harmony import */ var jslib_common_enums_hashPurpose__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! jslib-common/enums/hashPurpose */ "./jslib/common/src/enums/hashPurpose.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+class LockComponent {
+ constructor(router, i18nService, platformUtilsService, messagingService, userService, cryptoService, storageService, vaultTimeoutService, environmentService, stateService, apiService, logService) {
+ this.router = router;
+ this.i18nService = i18nService;
+ this.platformUtilsService = platformUtilsService;
+ this.messagingService = messagingService;
+ this.userService = userService;
+ this.cryptoService = cryptoService;
+ this.storageService = storageService;
+ this.vaultTimeoutService = vaultTimeoutService;
+ this.environmentService = environmentService;
+ this.stateService = stateService;
+ this.apiService = apiService;
+ this.logService = logService;
+ this.masterPassword = '';
+ this.pin = '';
+ this.showPassword = false;
+ this.pinLock = false;
+ this.webVaultHostname = '';
+ this.successRoute = 'vault';
+ this.invalidPinAttempts = 0;
+ }
+ ngOnInit() {
+ return __awaiter(this, void 0, void 0, function* () {
+ this.pinSet = yield this.vaultTimeoutService.isPinLockSet();
+ this.pinLock = (this.pinSet[0] && this.vaultTimeoutService.pinProtectedKey != null) || this.pinSet[1];
+ this.supportsBiometric = yield this.platformUtilsService.supportsBiometric();
+ this.biometricLock = (yield this.vaultTimeoutService.isBiometricLockSet()) &&
+ ((yield this.cryptoService.hasKeyStored('biometric')) || !this.platformUtilsService.supportsSecureStorage());
+ this.biometricText = yield this.storageService.get(jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_13__["ConstantsService"].biometricText);
+ this.email = yield this.userService.getEmail();
+ const webVaultUrl = this.environmentService.getWebVaultUrl();
+ const vaultUrl = webVaultUrl === 'https://vault.bitwarden.com' ? 'https://bitwarden.com' : webVaultUrl;
+ this.webVaultHostname = jslib_common_misc_utils__WEBPACK_IMPORTED_MODULE_16__["Utils"].getHostname(vaultUrl);
+ });
+ }
+ submit() {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (this.pinLock && (this.pin == null || this.pin === '')) {
+ this.platformUtilsService.showToast('error', this.i18nService.t('errorOccurred'), this.i18nService.t('pinRequired'));
+ return;
+ }
+ if (!this.pinLock && (this.masterPassword == null || this.masterPassword === '')) {
+ this.platformUtilsService.showToast('error', this.i18nService.t('errorOccurred'), this.i18nService.t('masterPassRequired'));
+ return;
+ }
+ const kdf = yield this.userService.getKdf();
+ const kdfIterations = yield this.userService.getKdfIterations();
+ if (this.pinLock) {
+ let failed = true;
+ try {
+ if (this.pinSet[0]) {
+ const key = yield this.cryptoService.makeKeyFromPin(this.pin, this.email, kdf, kdfIterations, this.vaultTimeoutService.pinProtectedKey);
+ const encKey = yield this.cryptoService.getEncKey(key);
+ const protectedPin = yield this.storageService.get(jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_13__["ConstantsService"].protectedPin);
+ const decPin = yield this.cryptoService.decryptToUtf8(new jslib_common_models_domain_encString__WEBPACK_IMPORTED_MODULE_14__["EncString"](protectedPin), encKey);
+ failed = decPin !== this.pin;
+ if (!failed) {
+ yield this.setKeyAndContinue(key);
+ }
+ }
+ else {
+ const key = yield this.cryptoService.makeKeyFromPin(this.pin, this.email, kdf, kdfIterations);
+ failed = false;
+ yield this.setKeyAndContinue(key);
+ }
+ }
+ catch (_a) {
+ failed = true;
+ }
+ if (failed) {
+ this.invalidPinAttempts++;
+ if (this.invalidPinAttempts >= 5) {
+ this.messagingService.send('logout');
+ return;
+ }
+ this.platformUtilsService.showToast('error', this.i18nService.t('errorOccurred'), this.i18nService.t('invalidPin'));
+ }
+ }
+ else {
+ const key = yield this.cryptoService.makeKey(this.masterPassword, this.email, kdf, kdfIterations);
+ const storedKeyHash = yield this.cryptoService.getKeyHash();
+ let passwordValid = false;
+ if (storedKeyHash != null) {
+ passwordValid = yield this.cryptoService.compareAndUpdateKeyHash(this.masterPassword, key);
+ }
+ else {
+ const request = new jslib_common_models_request_passwordVerificationRequest__WEBPACK_IMPORTED_MODULE_15__["PasswordVerificationRequest"]();
+ const serverKeyHash = yield this.cryptoService.hashPassword(this.masterPassword, key, jslib_common_enums_hashPurpose__WEBPACK_IMPORTED_MODULE_17__["HashPurpose"].ServerAuthorization);
+ request.masterPasswordHash = serverKeyHash;
+ try {
+ this.formPromise = this.apiService.postAccountVerifyPassword(request);
+ yield this.formPromise;
+ passwordValid = true;
+ const localKeyHash = yield this.cryptoService.hashPassword(this.masterPassword, key, jslib_common_enums_hashPurpose__WEBPACK_IMPORTED_MODULE_17__["HashPurpose"].LocalAuthorization);
+ yield this.cryptoService.setKeyHash(localKeyHash);
+ }
+ catch (e) {
+ this.logService.error(e);
+ }
+ }
+ if (passwordValid) {
+ if (this.pinSet[0]) {
+ const protectedPin = yield this.storageService.get(jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_13__["ConstantsService"].protectedPin);
+ const encKey = yield this.cryptoService.getEncKey(key);
+ const decPin = yield this.cryptoService.decryptToUtf8(new jslib_common_models_domain_encString__WEBPACK_IMPORTED_MODULE_14__["EncString"](protectedPin), encKey);
+ const pinKey = yield this.cryptoService.makePinKey(decPin, this.email, kdf, kdfIterations);
+ this.vaultTimeoutService.pinProtectedKey = yield this.cryptoService.encrypt(key.key, pinKey);
+ }
+ this.setKeyAndContinue(key);
+ }
+ else {
+ this.platformUtilsService.showToast('error', this.i18nService.t('errorOccurred'), this.i18nService.t('invalidMasterPassword'));
+ }
+ }
+ });
+ }
+ logOut() {
+ return __awaiter(this, void 0, void 0, function* () {
+ const confirmed = yield this.platformUtilsService.showDialog(this.i18nService.t('logOutConfirmation'), this.i18nService.t('logOut'), this.i18nService.t('logOut'), this.i18nService.t('cancel'));
+ if (confirmed) {
+ this.messagingService.send('logout');
+ }
+ });
+ }
+ unlockBiometric() {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (!this.biometricLock) {
+ return;
+ }
+ const success = (yield this.cryptoService.getKey('biometric')) != null;
+ if (success) {
+ yield this.doContinue();
+ }
+ return success;
+ });
+ }
+ togglePassword() {
+ this.showPassword = !this.showPassword;
+ document.getElementById(this.pinLock ? 'pin' : 'masterPassword').focus();
+ }
+ setKeyAndContinue(key) {
+ return __awaiter(this, void 0, void 0, function* () {
+ yield this.cryptoService.setKey(key);
+ this.doContinue();
+ });
+ }
+ doContinue() {
+ return __awaiter(this, void 0, void 0, function* () {
+ this.vaultTimeoutService.biometricLocked = false;
+ this.vaultTimeoutService.everBeenUnlocked = true;
+ const disableFavicon = yield this.storageService.get(jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_13__["ConstantsService"].disableFaviconKey);
+ yield this.stateService.save(jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_13__["ConstantsService"].disableFaviconKey, !!disableFavicon);
+ this.messagingService.send('unlocked');
+ if (this.onSuccessfulSubmit != null) {
+ this.onSuccessfulSubmit();
+ }
+ else if (this.router != null) {
+ this.router.navigate([this.successRoute]);
+ }
+ });
+ }
+}
+LockComponent.ɵfac = function LockComponent_Factory(t) { return new (t || LockComponent)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_router__WEBPACK_IMPORTED_MODULE_1__["Router"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_5__["I18nService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_8__["PlatformUtilsService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_messaging_service__WEBPACK_IMPORTED_MODULE_7__["MessagingService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_user_service__WEBPACK_IMPORTED_MODULE_11__["UserService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_crypto_service__WEBPACK_IMPORTED_MODULE_3__["CryptoService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_storage_service__WEBPACK_IMPORTED_MODULE_10__["StorageService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_vaultTimeout_service__WEBPACK_IMPORTED_MODULE_12__["VaultTimeoutService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_environment_service__WEBPACK_IMPORTED_MODULE_4__["EnvironmentService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_state_service__WEBPACK_IMPORTED_MODULE_9__["StateService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_api_service__WEBPACK_IMPORTED_MODULE_2__["ApiService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_6__["LogService"])); };
+LockComponent.ɵdir = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineDirective"]({ type: LockComponent });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](LockComponent, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Directive"]
+ }], function () { return [{ type: _angular_router__WEBPACK_IMPORTED_MODULE_1__["Router"] }, { type: jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_5__["I18nService"] }, { type: jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_8__["PlatformUtilsService"] }, { type: jslib_common_abstractions_messaging_service__WEBPACK_IMPORTED_MODULE_7__["MessagingService"] }, { type: jslib_common_abstractions_user_service__WEBPACK_IMPORTED_MODULE_11__["UserService"] }, { type: jslib_common_abstractions_crypto_service__WEBPACK_IMPORTED_MODULE_3__["CryptoService"] }, { type: jslib_common_abstractions_storage_service__WEBPACK_IMPORTED_MODULE_10__["StorageService"] }, { type: jslib_common_abstractions_vaultTimeout_service__WEBPACK_IMPORTED_MODULE_12__["VaultTimeoutService"] }, { type: jslib_common_abstractions_environment_service__WEBPACK_IMPORTED_MODULE_4__["EnvironmentService"] }, { type: jslib_common_abstractions_state_service__WEBPACK_IMPORTED_MODULE_9__["StateService"] }, { type: jslib_common_abstractions_api_service__WEBPACK_IMPORTED_MODULE_2__["ApiService"] }, { type: jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_6__["LogService"] }]; }, null); })();
+
+
+/***/ }),
+
+/***/ "./jslib/angular/src/components/login.component.ts":
+/*!*********************************************************!*\
+ !*** ./jslib/angular/src/components/login.component.ts ***!
+ \*********************************************************/
+/*! exports provided: LoginComponent */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LoginComponent", function() { return LoginComponent; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var _angular_router__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @angular/router */ "./node_modules/@angular/router/__ivy_ngcc__/fesm2015/router.js");
+/* harmony import */ var jslib_common_abstractions_auth_service__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! jslib-common/abstractions/auth.service */ "./jslib/common/src/abstractions/auth.service.ts");
+/* harmony import */ var jslib_common_abstractions_cryptoFunction_service__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! jslib-common/abstractions/cryptoFunction.service */ "./jslib/common/src/abstractions/cryptoFunction.service.ts");
+/* harmony import */ var jslib_common_abstractions_environment_service__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! jslib-common/abstractions/environment.service */ "./jslib/common/src/abstractions/environment.service.ts");
+/* harmony import */ var jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! jslib-common/abstractions/i18n.service */ "./jslib/common/src/abstractions/i18n.service.ts");
+/* harmony import */ var jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! jslib-common/abstractions/log.service */ "./jslib/common/src/abstractions/log.service.ts");
+/* harmony import */ var jslib_common_abstractions_passwordGeneration_service__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! jslib-common/abstractions/passwordGeneration.service */ "./jslib/common/src/abstractions/passwordGeneration.service.ts");
+/* harmony import */ var jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! jslib-common/abstractions/platformUtils.service */ "./jslib/common/src/abstractions/platformUtils.service.ts");
+/* harmony import */ var jslib_common_abstractions_state_service__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! jslib-common/abstractions/state.service */ "./jslib/common/src/abstractions/state.service.ts");
+/* harmony import */ var jslib_common_abstractions_storage_service__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! jslib-common/abstractions/storage.service */ "./jslib/common/src/abstractions/storage.service.ts");
+/* harmony import */ var jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! jslib-common/services/constants.service */ "./jslib/common/src/services/constants.service.ts");
+/* harmony import */ var jslib_common_misc_utils__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! jslib-common/misc/utils */ "./jslib/common/src/misc/utils.ts");
+/* harmony import */ var _captchaProtected_component__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./captchaProtected.component */ "./jslib/angular/src/components/captchaProtected.component.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+const Keys = {
+ rememberedEmail: 'rememberedEmail',
+ rememberEmail: 'rememberEmail',
+};
+class LoginComponent extends _captchaProtected_component__WEBPACK_IMPORTED_MODULE_13__["CaptchaProtectedComponent"] {
+ constructor(authService, router, platformUtilsService, i18nService, stateService, environmentService, passwordGenerationService, cryptoFunctionService, storageService, logService) {
+ super(environmentService, i18nService, platformUtilsService);
+ this.authService = authService;
+ this.router = router;
+ this.stateService = stateService;
+ this.passwordGenerationService = passwordGenerationService;
+ this.cryptoFunctionService = cryptoFunctionService;
+ this.storageService = storageService;
+ this.logService = logService;
+ this.email = '';
+ this.rememberEmail = true;
+ this.masterPassword = '';
+ this.showPassword = false;
+ this.twoFactorRoute = '2fa';
+ this.successRoute = 'vault';
+ this.forcePasswordResetRoute = 'update-temp-password';
+ }
+ ngOnInit() {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (this.email == null || this.email === '') {
+ this.email = yield this.storageService.get(Keys.rememberedEmail);
+ if (this.email == null) {
+ this.email = '';
+ }
+ }
+ this.rememberEmail = yield this.storageService.get(Keys.rememberEmail);
+ if (this.rememberEmail == null) {
+ this.rememberEmail = true;
+ }
+ if (jslib_common_misc_utils__WEBPACK_IMPORTED_MODULE_12__["Utils"].isBrowser && !jslib_common_misc_utils__WEBPACK_IMPORTED_MODULE_12__["Utils"].isNode) {
+ this.focusInput();
+ }
+ });
+ }
+ submit() {
+ return __awaiter(this, void 0, void 0, function* () {
+ yield this.setupCaptcha();
+ if (this.email == null || this.email === '') {
+ this.platformUtilsService.showToast('error', this.i18nService.t('errorOccurred'), this.i18nService.t('emailRequired'));
+ return;
+ }
+ if (this.email.indexOf('@') === -1) {
+ this.platformUtilsService.showToast('error', this.i18nService.t('errorOccurred'), this.i18nService.t('invalidEmail'));
+ return;
+ }
+ if (this.masterPassword == null || this.masterPassword === '') {
+ this.platformUtilsService.showToast('error', this.i18nService.t('errorOccurred'), this.i18nService.t('masterPassRequired'));
+ return;
+ }
+ try {
+ this.formPromise = this.authService.logIn(this.email, this.masterPassword, this.captchaToken);
+ const response = yield this.formPromise;
+ yield this.storageService.save(Keys.rememberEmail, this.rememberEmail);
+ if (this.rememberEmail) {
+ yield this.storageService.save(Keys.rememberedEmail, this.email);
+ }
+ else {
+ yield this.storageService.remove(Keys.rememberedEmail);
+ }
+ if (this.handleCaptchaRequired(response)) {
+ return;
+ }
+ else if (response.twoFactor) {
+ if (this.onSuccessfulLoginTwoFactorNavigate != null) {
+ this.onSuccessfulLoginTwoFactorNavigate();
+ }
+ else {
+ this.router.navigate([this.twoFactorRoute]);
+ }
+ }
+ else if (response.forcePasswordReset) {
+ if (this.onSuccessfulLoginForceResetNavigate != null) {
+ this.onSuccessfulLoginForceResetNavigate();
+ }
+ else {
+ this.router.navigate([this.forcePasswordResetRoute]);
+ }
+ }
+ else {
+ const disableFavicon = yield this.storageService.get(jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_11__["ConstantsService"].disableFaviconKey);
+ yield this.stateService.save(jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_11__["ConstantsService"].disableFaviconKey, !!disableFavicon);
+ if (this.onSuccessfulLogin != null) {
+ this.onSuccessfulLogin();
+ }
+ if (this.onSuccessfulLoginNavigate != null) {
+ this.onSuccessfulLoginNavigate();
+ }
+ else {
+ this.router.navigate([this.successRoute]);
+ }
+ }
+ }
+ catch (e) {
+ this.logService.error(e);
+ }
+ });
+ }
+ togglePassword() {
+ this.showPassword = !this.showPassword;
+ document.getElementById('masterPassword').focus();
+ }
+ launchSsoBrowser(clientId, ssoRedirectUri) {
+ return __awaiter(this, void 0, void 0, function* () {
+ // Generate necessary sso params
+ const passwordOptions = {
+ type: 'password',
+ length: 64,
+ uppercase: true,
+ lowercase: true,
+ numbers: true,
+ special: false,
+ };
+ const state = yield this.passwordGenerationService.generatePassword(passwordOptions);
+ const ssoCodeVerifier = yield this.passwordGenerationService.generatePassword(passwordOptions);
+ const codeVerifierHash = yield this.cryptoFunctionService.hash(ssoCodeVerifier, 'sha256');
+ const codeChallenge = jslib_common_misc_utils__WEBPACK_IMPORTED_MODULE_12__["Utils"].fromBufferToUrlB64(codeVerifierHash);
+ // Save sso params
+ yield this.storageService.save(jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_11__["ConstantsService"].ssoStateKey, state);
+ yield this.storageService.save(jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_11__["ConstantsService"].ssoCodeVerifierKey, ssoCodeVerifier);
+ // Build URI
+ const webUrl = this.environmentService.getWebVaultUrl();
+ // Launch browser
+ this.platformUtilsService.launchUri(webUrl + '/#/sso?clientId=' + clientId +
+ '&redirectUri=' + encodeURIComponent(ssoRedirectUri) +
+ '&state=' + state + '&codeChallenge=' + codeChallenge);
+ });
+ }
+ focusInput() {
+ document.getElementById(this.email == null || this.email === '' ? 'email' : 'masterPassword').focus();
+ }
+}
+LoginComponent.ɵfac = function LoginComponent_Factory(t) { return new (t || LoginComponent)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_auth_service__WEBPACK_IMPORTED_MODULE_2__["AuthService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_router__WEBPACK_IMPORTED_MODULE_1__["Router"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_8__["PlatformUtilsService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_5__["I18nService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_state_service__WEBPACK_IMPORTED_MODULE_9__["StateService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_environment_service__WEBPACK_IMPORTED_MODULE_4__["EnvironmentService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_passwordGeneration_service__WEBPACK_IMPORTED_MODULE_7__["PasswordGenerationService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_cryptoFunction_service__WEBPACK_IMPORTED_MODULE_3__["CryptoFunctionService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_storage_service__WEBPACK_IMPORTED_MODULE_10__["StorageService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_6__["LogService"])); };
+LoginComponent.ɵdir = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineDirective"]({ type: LoginComponent, inputs: { email: "email", rememberEmail: "rememberEmail" }, features: [_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵInheritDefinitionFeature"]] });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](LoginComponent, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Directive"]
+ }], function () { return [{ type: jslib_common_abstractions_auth_service__WEBPACK_IMPORTED_MODULE_2__["AuthService"] }, { type: _angular_router__WEBPACK_IMPORTED_MODULE_1__["Router"] }, { type: jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_8__["PlatformUtilsService"] }, { type: jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_5__["I18nService"] }, { type: jslib_common_abstractions_state_service__WEBPACK_IMPORTED_MODULE_9__["StateService"] }, { type: jslib_common_abstractions_environment_service__WEBPACK_IMPORTED_MODULE_4__["EnvironmentService"] }, { type: jslib_common_abstractions_passwordGeneration_service__WEBPACK_IMPORTED_MODULE_7__["PasswordGenerationService"] }, { type: jslib_common_abstractions_cryptoFunction_service__WEBPACK_IMPORTED_MODULE_3__["CryptoFunctionService"] }, { type: jslib_common_abstractions_storage_service__WEBPACK_IMPORTED_MODULE_10__["StorageService"] }, { type: jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_6__["LogService"] }]; }, { email: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"]
+ }], rememberEmail: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"]
+ }] }); })();
+
+
+/***/ }),
+
+/***/ "./jslib/angular/src/components/modal/dynamic-modal.component.ts":
+/*!***********************************************************************!*\
+ !*** ./jslib/angular/src/components/modal/dynamic-modal.component.ts ***!
+ \***********************************************************************/
+/*! exports provided: DynamicModalComponent */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "DynamicModalComponent", function() { return DynamicModalComponent; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var _angular_cdk_a11y__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @angular/cdk/a11y */ "./node_modules/@angular/cdk/__ivy_ngcc__/fesm2015/a11y.js");
+/* harmony import */ var _services_modal_service__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../services/modal.service */ "./jslib/angular/src/services/modal.service.ts");
+/* harmony import */ var _modal_ref__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./modal.ref */ "./jslib/angular/src/components/modal/modal.ref.ts");
+
+
+
+
+
+
+
+
+const _c0 = ["modalContent"];
+function DynamicModalComponent_ng_template_0_Template(rf, ctx) { }
+class DynamicModalComponent {
+ constructor(modalService, cd, el, focusTrapFactory, modalRef) {
+ this.modalService = modalService;
+ this.cd = cd;
+ this.el = el;
+ this.focusTrapFactory = focusTrapFactory;
+ this.modalRef = modalRef;
+ }
+ ngAfterViewInit() {
+ this.loadChildComponent(this.childComponentType);
+ if (this.setComponentParameters != null) {
+ this.setComponentParameters(this.componentRef.instance);
+ }
+ this.cd.detectChanges();
+ this.modalRef.created(this.el.nativeElement);
+ this.focusTrap = this.focusTrapFactory.create(this.el.nativeElement.querySelector('.modal-dialog'));
+ if (this.el.nativeElement.querySelector('[appAutoFocus]') == null) {
+ this.focusTrap.focusFirstTabbableElementWhenReady();
+ }
+ }
+ loadChildComponent(componentType) {
+ const componentFactory = this.modalService.resolveComponentFactory(componentType);
+ this.modalContentRef.clear();
+ this.componentRef = this.modalContentRef.createComponent(componentFactory);
+ }
+ ngOnDestroy() {
+ if (this.componentRef) {
+ this.componentRef.destroy();
+ }
+ this.focusTrap.destroy();
+ }
+ close() {
+ this.modalRef.close();
+ }
+ getFocus() {
+ const autoFocusEl = this.el.nativeElement.querySelector('[appAutoFocus]');
+ autoFocusEl === null || autoFocusEl === void 0 ? void 0 : autoFocusEl.focus();
+ }
+}
+DynamicModalComponent.ɵfac = function DynamicModalComponent_Factory(t) { return new (t || DynamicModalComponent)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_services_modal_service__WEBPACK_IMPORTED_MODULE_2__["ModalService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ChangeDetectorRef"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ElementRef"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_cdk_a11y__WEBPACK_IMPORTED_MODULE_1__["ConfigurableFocusTrapFactory"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_modal_ref__WEBPACK_IMPORTED_MODULE_3__["ModalRef"])); };
+DynamicModalComponent.ɵcmp = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineComponent"]({ type: DynamicModalComponent, selectors: [["app-modal"]], viewQuery: function DynamicModalComponent_Query(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵviewQuery"](_c0, 3, _angular_core__WEBPACK_IMPORTED_MODULE_0__["ViewContainerRef"]);
+ } if (rf & 2) {
+ let _t;
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵqueryRefresh"](_t = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵloadQuery"]()) && (ctx.modalContentRef = _t.first);
+ } }, decls: 2, vars: 0, consts: [["modalContent", ""]], template: function DynamicModalComponent_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](0, DynamicModalComponent_ng_template_0_Template, 0, 0, "ng-template", null, 0, _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplateRefExtractor"]);
+ } }, encapsulation: 2 });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](DynamicModalComponent, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Component"],
+ args: [{
+ selector: 'app-modal',
+ template: '',
+ }]
+ }], function () { return [{ type: _services_modal_service__WEBPACK_IMPORTED_MODULE_2__["ModalService"] }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["ChangeDetectorRef"] }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["ElementRef"] }, { type: _angular_cdk_a11y__WEBPACK_IMPORTED_MODULE_1__["ConfigurableFocusTrapFactory"] }, { type: _modal_ref__WEBPACK_IMPORTED_MODULE_3__["ModalRef"] }]; }, { modalContentRef: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["ViewChild"],
+ args: ['modalContent', { read: _angular_core__WEBPACK_IMPORTED_MODULE_0__["ViewContainerRef"], static: true }]
+ }] }); })();
+
+
+/***/ }),
+
+/***/ "./jslib/angular/src/components/modal/modal-injector.ts":
+/*!**************************************************************!*\
+ !*** ./jslib/angular/src/components/modal/modal-injector.ts ***!
+ \**************************************************************/
+/*! exports provided: ModalInjector */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ModalInjector", function() { return ModalInjector; });
+class ModalInjector {
+ constructor(_parentInjector, _additionalTokens) {
+ this._parentInjector = _parentInjector;
+ this._additionalTokens = _additionalTokens;
+ }
+ get(token, notFoundValue, flags) {
+ var _a;
+ return (_a = this._additionalTokens.get(token)) !== null && _a !== void 0 ? _a : this._parentInjector.get(token, notFoundValue);
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/angular/src/components/modal/modal.ref.ts":
+/*!*********************************************************!*\
+ !*** ./jslib/angular/src/components/modal/modal.ref.ts ***!
+ \*********************************************************/
+/*! exports provided: ModalRef */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ModalRef", function() { return ModalRef; });
+/* harmony import */ var rxjs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! rxjs */ "./node_modules/rxjs/_esm5/index.js");
+/* harmony import */ var rxjs_operators__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! rxjs/operators */ "./node_modules/rxjs/_esm5/operators/index.js");
+
+
+class ModalRef {
+ constructor() {
+ this._onCreated = new rxjs__WEBPACK_IMPORTED_MODULE_0__["Subject"]();
+ this._onClose = new rxjs__WEBPACK_IMPORTED_MODULE_0__["Subject"]();
+ this._onClosed = new rxjs__WEBPACK_IMPORTED_MODULE_0__["Subject"]();
+ this._onShow = new rxjs__WEBPACK_IMPORTED_MODULE_0__["Subject"]();
+ this._onShown = new rxjs__WEBPACK_IMPORTED_MODULE_0__["Subject"]();
+ this.onCreated = this._onCreated.asObservable();
+ this.onClose = this._onClose.asObservable();
+ this.onClosed = this._onClosed.asObservable();
+ this.onShow = this._onShow.asObservable();
+ this.onShown = this._onShow.asObservable();
+ }
+ show() {
+ this._onShow.next();
+ }
+ shown() {
+ this._onShown.next();
+ }
+ close(result) {
+ this.lastResult = result;
+ this._onClose.next(result);
+ }
+ closed() {
+ this._onClosed.next(this.lastResult);
+ }
+ created(el) {
+ this._onCreated.next(el);
+ }
+ onClosedPromise() {
+ return this.onClosed.pipe(Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_1__["first"])()).toPromise();
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/angular/src/components/password-generator-history.component.ts":
+/*!******************************************************************************!*\
+ !*** ./jslib/angular/src/components/password-generator-history.component.ts ***!
+ \******************************************************************************/
+/*! exports provided: PasswordGeneratorHistoryComponent */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PasswordGeneratorHistoryComponent", function() { return PasswordGeneratorHistoryComponent; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! jslib-common/abstractions/i18n.service */ "./jslib/common/src/abstractions/i18n.service.ts");
+/* harmony import */ var jslib_common_abstractions_passwordGeneration_service__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! jslib-common/abstractions/passwordGeneration.service */ "./jslib/common/src/abstractions/passwordGeneration.service.ts");
+/* harmony import */ var jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! jslib-common/abstractions/platformUtils.service */ "./jslib/common/src/abstractions/platformUtils.service.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+
+
+
+
+
+
+class PasswordGeneratorHistoryComponent {
+ constructor(passwordGenerationService, platformUtilsService, i18nService, win) {
+ this.passwordGenerationService = passwordGenerationService;
+ this.platformUtilsService = platformUtilsService;
+ this.i18nService = i18nService;
+ this.win = win;
+ this.history = [];
+ }
+ ngOnInit() {
+ return __awaiter(this, void 0, void 0, function* () {
+ this.history = yield this.passwordGenerationService.getHistory();
+ });
+ }
+ clear() {
+ this.history = [];
+ this.passwordGenerationService.clear();
+ }
+ copy(password) {
+ const copyOptions = this.win != null ? { window: this.win } : null;
+ this.platformUtilsService.copyToClipboard(password, copyOptions);
+ this.platformUtilsService.showToast('info', null, this.i18nService.t('valueCopied', this.i18nService.t('password')));
+ }
+}
+PasswordGeneratorHistoryComponent.ɵfac = function PasswordGeneratorHistoryComponent_Factory(t) { return new (t || PasswordGeneratorHistoryComponent)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_passwordGeneration_service__WEBPACK_IMPORTED_MODULE_2__["PasswordGenerationService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_3__["PlatformUtilsService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_1__["I18nService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](Window)); };
+PasswordGeneratorHistoryComponent.ɵdir = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineDirective"]({ type: PasswordGeneratorHistoryComponent });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](PasswordGeneratorHistoryComponent, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Directive"]
+ }], function () { return [{ type: jslib_common_abstractions_passwordGeneration_service__WEBPACK_IMPORTED_MODULE_2__["PasswordGenerationService"] }, { type: jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_3__["PlatformUtilsService"] }, { type: jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_1__["I18nService"] }, { type: Window }]; }, null); })();
+
+
+/***/ }),
+
+/***/ "./jslib/angular/src/components/password-generator.component.ts":
+/*!**********************************************************************!*\
+ !*** ./jslib/angular/src/components/password-generator.component.ts ***!
+ \**********************************************************************/
+/*! exports provided: PasswordGeneratorComponent */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PasswordGeneratorComponent", function() { return PasswordGeneratorComponent; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! jslib-common/abstractions/i18n.service */ "./jslib/common/src/abstractions/i18n.service.ts");
+/* harmony import */ var jslib_common_abstractions_passwordGeneration_service__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! jslib-common/abstractions/passwordGeneration.service */ "./jslib/common/src/abstractions/passwordGeneration.service.ts");
+/* harmony import */ var jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! jslib-common/abstractions/platformUtils.service */ "./jslib/common/src/abstractions/platformUtils.service.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+
+
+
+
+
+
+class PasswordGeneratorComponent {
+ constructor(passwordGenerationService, platformUtilsService, i18nService, win) {
+ this.passwordGenerationService = passwordGenerationService;
+ this.platformUtilsService = platformUtilsService;
+ this.i18nService = i18nService;
+ this.win = win;
+ this.showSelect = false;
+ this.onSelected = new _angular_core__WEBPACK_IMPORTED_MODULE_0__["EventEmitter"]();
+ this.options = {};
+ this.password = '-';
+ this.showOptions = false;
+ this.avoidAmbiguous = false;
+ this.passTypeOptions = [
+ { name: i18nService.t('password'), value: 'password' },
+ { name: i18nService.t('passphrase'), value: 'passphrase' },
+ ];
+ }
+ ngOnInit() {
+ return __awaiter(this, void 0, void 0, function* () {
+ const optionsResponse = yield this.passwordGenerationService.getOptions();
+ this.options = optionsResponse[0];
+ this.enforcedPolicyOptions = optionsResponse[1];
+ this.avoidAmbiguous = !this.options.ambiguous;
+ this.options.type = this.options.type === 'passphrase' ? 'passphrase' : 'password';
+ this.password = yield this.passwordGenerationService.generatePassword(this.options);
+ yield this.passwordGenerationService.addHistory(this.password);
+ });
+ }
+ sliderChanged() {
+ return __awaiter(this, void 0, void 0, function* () {
+ this.saveOptions(false);
+ yield this.passwordGenerationService.addHistory(this.password);
+ });
+ }
+ sliderInput() {
+ return __awaiter(this, void 0, void 0, function* () {
+ this.normalizeOptions();
+ this.password = yield this.passwordGenerationService.generatePassword(this.options);
+ });
+ }
+ saveOptions(regenerate = true) {
+ return __awaiter(this, void 0, void 0, function* () {
+ this.normalizeOptions();
+ yield this.passwordGenerationService.saveOptions(this.options);
+ if (regenerate) {
+ yield this.regenerate();
+ }
+ });
+ }
+ regenerate() {
+ return __awaiter(this, void 0, void 0, function* () {
+ this.password = yield this.passwordGenerationService.generatePassword(this.options);
+ yield this.passwordGenerationService.addHistory(this.password);
+ });
+ }
+ copy() {
+ const copyOptions = this.win != null ? { window: this.win } : null;
+ this.platformUtilsService.copyToClipboard(this.password, copyOptions);
+ this.platformUtilsService.showToast('info', null, this.i18nService.t('valueCopied', this.i18nService.t('password')));
+ }
+ select() {
+ this.onSelected.emit(this.password);
+ }
+ toggleOptions() {
+ this.showOptions = !this.showOptions;
+ }
+ normalizeOptions() {
+ // Application level normalize options depedent on class variables
+ this.options.ambiguous = !this.avoidAmbiguous;
+ if (!this.options.uppercase && !this.options.lowercase && !this.options.number && !this.options.special) {
+ this.options.lowercase = true;
+ if (this.win != null) {
+ const lowercase = this.win.document.querySelector('#lowercase');
+ if (lowercase) {
+ lowercase.checked = true;
+ }
+ }
+ }
+ this.passwordGenerationService.normalizeOptions(this.options, this.enforcedPolicyOptions);
+ }
+}
+PasswordGeneratorComponent.ɵfac = function PasswordGeneratorComponent_Factory(t) { return new (t || PasswordGeneratorComponent)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_passwordGeneration_service__WEBPACK_IMPORTED_MODULE_2__["PasswordGenerationService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_3__["PlatformUtilsService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_1__["I18nService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](Window)); };
+PasswordGeneratorComponent.ɵdir = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineDirective"]({ type: PasswordGeneratorComponent, inputs: { showSelect: "showSelect" }, outputs: { onSelected: "onSelected" } });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](PasswordGeneratorComponent, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Directive"]
+ }], function () { return [{ type: jslib_common_abstractions_passwordGeneration_service__WEBPACK_IMPORTED_MODULE_2__["PasswordGenerationService"] }, { type: jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_3__["PlatformUtilsService"] }, { type: jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_1__["I18nService"] }, { type: Window }]; }, { showSelect: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"]
+ }], onSelected: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Output"]
+ }] }); })();
+
+
+/***/ }),
+
+/***/ "./jslib/angular/src/components/password-history.component.ts":
+/*!********************************************************************!*\
+ !*** ./jslib/angular/src/components/password-history.component.ts ***!
+ \********************************************************************/
+/*! exports provided: PasswordHistoryComponent */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PasswordHistoryComponent", function() { return PasswordHistoryComponent; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var jslib_common_abstractions_cipher_service__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! jslib-common/abstractions/cipher.service */ "./jslib/common/src/abstractions/cipher.service.ts");
+/* harmony import */ var jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! jslib-common/abstractions/i18n.service */ "./jslib/common/src/abstractions/i18n.service.ts");
+/* harmony import */ var jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! jslib-common/abstractions/platformUtils.service */ "./jslib/common/src/abstractions/platformUtils.service.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+
+
+
+
+
+
+class PasswordHistoryComponent {
+ constructor(cipherService, platformUtilsService, i18nService, win) {
+ this.cipherService = cipherService;
+ this.platformUtilsService = platformUtilsService;
+ this.i18nService = i18nService;
+ this.win = win;
+ this.history = [];
+ }
+ ngOnInit() {
+ return __awaiter(this, void 0, void 0, function* () {
+ yield this.init();
+ });
+ }
+ copy(password) {
+ const copyOptions = this.win != null ? { window: this.win } : null;
+ this.platformUtilsService.copyToClipboard(password, copyOptions);
+ this.platformUtilsService.showToast('info', null, this.i18nService.t('valueCopied', this.i18nService.t('password')));
+ }
+ init() {
+ return __awaiter(this, void 0, void 0, function* () {
+ const cipher = yield this.cipherService.get(this.cipherId);
+ const decCipher = yield cipher.decrypt();
+ this.history = decCipher.passwordHistory == null ? [] : decCipher.passwordHistory;
+ });
+ }
+}
+PasswordHistoryComponent.ɵfac = function PasswordHistoryComponent_Factory(t) { return new (t || PasswordHistoryComponent)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_cipher_service__WEBPACK_IMPORTED_MODULE_1__["CipherService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_3__["PlatformUtilsService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_2__["I18nService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](Window)); };
+PasswordHistoryComponent.ɵdir = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineDirective"]({ type: PasswordHistoryComponent });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](PasswordHistoryComponent, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Directive"]
+ }], function () { return [{ type: jslib_common_abstractions_cipher_service__WEBPACK_IMPORTED_MODULE_1__["CipherService"] }, { type: jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_3__["PlatformUtilsService"] }, { type: jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_2__["I18nService"] }, { type: Window }]; }, null); })();
+
+
+/***/ }),
+
+/***/ "./jslib/angular/src/components/password-reprompt.component.ts":
+/*!*********************************************************************!*\
+ !*** ./jslib/angular/src/components/password-reprompt.component.ts ***!
+ \*********************************************************************/
+/*! exports provided: PasswordRepromptComponent */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PasswordRepromptComponent", function() { return PasswordRepromptComponent; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var jslib_common_abstractions_crypto_service__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! jslib-common/abstractions/crypto.service */ "./jslib/common/src/abstractions/crypto.service.ts");
+/* harmony import */ var jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! jslib-common/abstractions/i18n.service */ "./jslib/common/src/abstractions/i18n.service.ts");
+/* harmony import */ var jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! jslib-common/abstractions/platformUtils.service */ "./jslib/common/src/abstractions/platformUtils.service.ts");
+/* harmony import */ var _modal_modal_ref__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./modal/modal.ref */ "./jslib/angular/src/components/modal/modal.ref.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+
+
+
+
+
+
+
+
+class PasswordRepromptComponent {
+ constructor(modalRef, cryptoService, platformUtilsService, i18nService) {
+ this.modalRef = modalRef;
+ this.cryptoService = cryptoService;
+ this.platformUtilsService = platformUtilsService;
+ this.i18nService = i18nService;
+ this.showPassword = false;
+ this.masterPassword = '';
+ }
+ togglePassword() {
+ this.showPassword = !this.showPassword;
+ }
+ submit() {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (!(yield this.cryptoService.compareAndUpdateKeyHash(this.masterPassword, null))) {
+ this.platformUtilsService.showToast('error', this.i18nService.t('errorOccurred'), this.i18nService.t('invalidMasterPassword'));
+ return;
+ }
+ this.modalRef.close(true);
+ });
+ }
+}
+PasswordRepromptComponent.ɵfac = function PasswordRepromptComponent_Factory(t) { return new (t || PasswordRepromptComponent)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_modal_modal_ref__WEBPACK_IMPORTED_MODULE_4__["ModalRef"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_crypto_service__WEBPACK_IMPORTED_MODULE_1__["CryptoService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_3__["PlatformUtilsService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_2__["I18nService"])); };
+PasswordRepromptComponent.ɵdir = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineDirective"]({ type: PasswordRepromptComponent });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](PasswordRepromptComponent, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Directive"]
+ }], function () { return [{ type: _modal_modal_ref__WEBPACK_IMPORTED_MODULE_4__["ModalRef"] }, { type: jslib_common_abstractions_crypto_service__WEBPACK_IMPORTED_MODULE_1__["CryptoService"] }, { type: jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_3__["PlatformUtilsService"] }, { type: jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_2__["I18nService"] }]; }, null); })();
+
+
+/***/ }),
+
+/***/ "./jslib/angular/src/components/premium.component.ts":
+/*!***********************************************************!*\
+ !*** ./jslib/angular/src/components/premium.component.ts ***!
+ \***********************************************************/
+/*! exports provided: PremiumComponent */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PremiumComponent", function() { return PremiumComponent; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var jslib_common_abstractions_api_service__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! jslib-common/abstractions/api.service */ "./jslib/common/src/abstractions/api.service.ts");
+/* harmony import */ var jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! jslib-common/abstractions/i18n.service */ "./jslib/common/src/abstractions/i18n.service.ts");
+/* harmony import */ var jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! jslib-common/abstractions/log.service */ "./jslib/common/src/abstractions/log.service.ts");
+/* harmony import */ var jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! jslib-common/abstractions/platformUtils.service */ "./jslib/common/src/abstractions/platformUtils.service.ts");
+/* harmony import */ var jslib_common_abstractions_user_service__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! jslib-common/abstractions/user.service */ "./jslib/common/src/abstractions/user.service.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+
+
+
+
+
+
+
+
+
+
+class PremiumComponent {
+ constructor(i18nService, platformUtilsService, apiService, userService, logService) {
+ this.i18nService = i18nService;
+ this.platformUtilsService = platformUtilsService;
+ this.apiService = apiService;
+ this.userService = userService;
+ this.logService = logService;
+ this.isPremium = false;
+ this.price = 10;
+ }
+ ngOnInit() {
+ return __awaiter(this, void 0, void 0, function* () {
+ this.isPremium = yield this.userService.canAccessPremium();
+ });
+ }
+ refresh() {
+ return __awaiter(this, void 0, void 0, function* () {
+ try {
+ this.refreshPromise = this.apiService.refreshIdentityToken();
+ yield this.refreshPromise;
+ this.platformUtilsService.showToast('success', null, this.i18nService.t('refreshComplete'));
+ this.isPremium = yield this.userService.canAccessPremium();
+ }
+ catch (e) {
+ this.logService.error(e);
+ }
+ });
+ }
+ purchase() {
+ return __awaiter(this, void 0, void 0, function* () {
+ const confirmed = yield this.platformUtilsService.showDialog(this.i18nService.t('premiumPurchaseAlert'), this.i18nService.t('premiumPurchase'), this.i18nService.t('yes'), this.i18nService.t('cancel'));
+ if (confirmed) {
+ this.platformUtilsService.launchUri('https://vault.bitwarden.com/#/?premium=purchase');
+ }
+ });
+ }
+ manage() {
+ return __awaiter(this, void 0, void 0, function* () {
+ const confirmed = yield this.platformUtilsService.showDialog(this.i18nService.t('premiumManageAlert'), this.i18nService.t('premiumManage'), this.i18nService.t('yes'), this.i18nService.t('cancel'));
+ if (confirmed) {
+ this.platformUtilsService.launchUri('https://vault.bitwarden.com/#/?premium=manage');
+ }
+ });
+ }
+}
+PremiumComponent.ɵfac = function PremiumComponent_Factory(t) { return new (t || PremiumComponent)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_2__["I18nService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_4__["PlatformUtilsService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_api_service__WEBPACK_IMPORTED_MODULE_1__["ApiService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_user_service__WEBPACK_IMPORTED_MODULE_5__["UserService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_3__["LogService"])); };
+PremiumComponent.ɵdir = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineDirective"]({ type: PremiumComponent });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](PremiumComponent, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Directive"]
+ }], function () { return [{ type: jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_2__["I18nService"] }, { type: jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_4__["PlatformUtilsService"] }, { type: jslib_common_abstractions_api_service__WEBPACK_IMPORTED_MODULE_1__["ApiService"] }, { type: jslib_common_abstractions_user_service__WEBPACK_IMPORTED_MODULE_5__["UserService"] }, { type: jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_3__["LogService"] }]; }, null); })();
+
+
+/***/ }),
+
+/***/ "./jslib/angular/src/components/register.component.ts":
+/*!************************************************************!*\
+ !*** ./jslib/angular/src/components/register.component.ts ***!
+ \************************************************************/
+/*! exports provided: RegisterComponent */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "RegisterComponent", function() { return RegisterComponent; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var _angular_router__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @angular/router */ "./node_modules/@angular/router/__ivy_ngcc__/fesm2015/router.js");
+/* harmony import */ var jslib_common_models_request_keysRequest__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! jslib-common/models/request/keysRequest */ "./jslib/common/src/models/request/keysRequest.ts");
+/* harmony import */ var jslib_common_models_request_registerRequest__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! jslib-common/models/request/registerRequest */ "./jslib/common/src/models/request/registerRequest.ts");
+/* harmony import */ var jslib_common_abstractions_api_service__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! jslib-common/abstractions/api.service */ "./jslib/common/src/abstractions/api.service.ts");
+/* harmony import */ var jslib_common_abstractions_auth_service__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! jslib-common/abstractions/auth.service */ "./jslib/common/src/abstractions/auth.service.ts");
+/* harmony import */ var jslib_common_abstractions_crypto_service__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! jslib-common/abstractions/crypto.service */ "./jslib/common/src/abstractions/crypto.service.ts");
+/* harmony import */ var jslib_common_abstractions_environment_service__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! jslib-common/abstractions/environment.service */ "./jslib/common/src/abstractions/environment.service.ts");
+/* harmony import */ var jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! jslib-common/abstractions/i18n.service */ "./jslib/common/src/abstractions/i18n.service.ts");
+/* harmony import */ var jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! jslib-common/abstractions/log.service */ "./jslib/common/src/abstractions/log.service.ts");
+/* harmony import */ var jslib_common_abstractions_passwordGeneration_service__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! jslib-common/abstractions/passwordGeneration.service */ "./jslib/common/src/abstractions/passwordGeneration.service.ts");
+/* harmony import */ var jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! jslib-common/abstractions/platformUtils.service */ "./jslib/common/src/abstractions/platformUtils.service.ts");
+/* harmony import */ var jslib_common_abstractions_state_service__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! jslib-common/abstractions/state.service */ "./jslib/common/src/abstractions/state.service.ts");
+/* harmony import */ var jslib_common_enums_kdfType__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! jslib-common/enums/kdfType */ "./jslib/common/src/enums/kdfType.ts");
+/* harmony import */ var _captchaProtected_component__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./captchaProtected.component */ "./jslib/angular/src/components/captchaProtected.component.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+class RegisterComponent extends _captchaProtected_component__WEBPACK_IMPORTED_MODULE_14__["CaptchaProtectedComponent"] {
+ constructor(authService, router, i18nService, cryptoService, apiService, stateService, platformUtilsService, passwordGenerationService, environmentService, logService) {
+ super(environmentService, i18nService, platformUtilsService);
+ this.authService = authService;
+ this.router = router;
+ this.cryptoService = cryptoService;
+ this.apiService = apiService;
+ this.stateService = stateService;
+ this.passwordGenerationService = passwordGenerationService;
+ this.logService = logService;
+ this.name = '';
+ this.email = '';
+ this.masterPassword = '';
+ this.confirmMasterPassword = '';
+ this.hint = '';
+ this.showPassword = false;
+ this.showTerms = true;
+ this.acceptPolicies = false;
+ this.successRoute = 'login';
+ this.showTerms = !platformUtilsService.isSelfHost();
+ }
+ ngOnInit() {
+ return __awaiter(this, void 0, void 0, function* () {
+ this.setupCaptcha();
+ });
+ }
+ get masterPasswordScoreWidth() {
+ return this.masterPasswordScore == null ? 0 : (this.masterPasswordScore + 1) * 20;
+ }
+ get masterPasswordScoreColor() {
+ switch (this.masterPasswordScore) {
+ case 4:
+ return 'success';
+ case 3:
+ return 'primary';
+ case 2:
+ return 'warning';
+ default:
+ return 'danger';
+ }
+ }
+ get masterPasswordScoreText() {
+ switch (this.masterPasswordScore) {
+ case 4:
+ return this.i18nService.t('strong');
+ case 3:
+ return this.i18nService.t('good');
+ case 2:
+ return this.i18nService.t('weak');
+ default:
+ return this.masterPasswordScore != null ? this.i18nService.t('weak') : null;
+ }
+ }
+ submit() {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (!this.acceptPolicies && this.showTerms) {
+ this.platformUtilsService.showToast('error', this.i18nService.t('errorOccurred'), this.i18nService.t('acceptPoliciesError'));
+ return;
+ }
+ if (this.email == null || this.email === '') {
+ this.platformUtilsService.showToast('error', this.i18nService.t('errorOccurred'), this.i18nService.t('emailRequired'));
+ return;
+ }
+ if (this.email.indexOf('@') === -1) {
+ this.platformUtilsService.showToast('error', this.i18nService.t('errorOccurred'), this.i18nService.t('invalidEmail'));
+ return;
+ }
+ if (this.masterPassword == null || this.masterPassword === '') {
+ this.platformUtilsService.showToast('error', this.i18nService.t('errorOccurred'), this.i18nService.t('masterPassRequired'));
+ return;
+ }
+ if (this.masterPassword.length < 8) {
+ this.platformUtilsService.showToast('error', this.i18nService.t('errorOccurred'), this.i18nService.t('masterPassLength'));
+ return;
+ }
+ if (this.masterPassword !== this.confirmMasterPassword) {
+ this.platformUtilsService.showToast('error', this.i18nService.t('errorOccurred'), this.i18nService.t('masterPassDoesntMatch'));
+ return;
+ }
+ const strengthResult = this.passwordGenerationService.passwordStrength(this.masterPassword, this.getPasswordStrengthUserInput());
+ if (strengthResult != null && strengthResult.score < 3) {
+ const result = yield this.platformUtilsService.showDialog(this.i18nService.t('weakMasterPasswordDesc'), this.i18nService.t('weakMasterPassword'), this.i18nService.t('yes'), this.i18nService.t('no'), 'warning');
+ if (!result) {
+ return;
+ }
+ }
+ if (this.hint === this.masterPassword) {
+ this.platformUtilsService.showToast('error', this.i18nService.t('errorOccurred'), this.i18nService.t('hintEqualsPassword'));
+ return;
+ }
+ this.name = this.name === '' ? null : this.name;
+ this.email = this.email.trim().toLowerCase();
+ const kdf = jslib_common_enums_kdfType__WEBPACK_IMPORTED_MODULE_13__["KdfType"].PBKDF2_SHA256;
+ const useLowerKdf = this.platformUtilsService.isIE();
+ const kdfIterations = useLowerKdf ? 10000 : 100000;
+ const key = yield this.cryptoService.makeKey(this.masterPassword, this.email, kdf, kdfIterations);
+ const encKey = yield this.cryptoService.makeEncKey(key);
+ const hashedPassword = yield this.cryptoService.hashPassword(this.masterPassword, key);
+ const keys = yield this.cryptoService.makeKeyPair(encKey[0]);
+ const request = new jslib_common_models_request_registerRequest__WEBPACK_IMPORTED_MODULE_3__["RegisterRequest"](this.email, this.name, hashedPassword, this.hint, encKey[1].encryptedString, kdf, kdfIterations, this.referenceData, this.captchaToken);
+ request.keys = new jslib_common_models_request_keysRequest__WEBPACK_IMPORTED_MODULE_2__["KeysRequest"](keys[0], keys[1].encryptedString);
+ const orgInvite = yield this.stateService.get('orgInvitation');
+ if (orgInvite != null && orgInvite.token != null && orgInvite.organizationUserId != null) {
+ request.token = orgInvite.token;
+ request.organizationUserId = orgInvite.organizationUserId;
+ }
+ try {
+ this.formPromise = this.apiService.postRegister(request);
+ try {
+ yield this.formPromise;
+ }
+ catch (e) {
+ if (this.handleCaptchaRequired(e)) {
+ return;
+ }
+ else {
+ throw e;
+ }
+ }
+ this.platformUtilsService.showToast('success', null, this.i18nService.t('newAccountCreated'));
+ this.router.navigate([this.successRoute], { queryParams: { email: this.email } });
+ }
+ catch (e) {
+ this.logService.error(e);
+ }
+ });
+ }
+ togglePassword(confirmField) {
+ this.showPassword = !this.showPassword;
+ document.getElementById(confirmField ? 'masterPasswordRetype' : 'masterPassword').focus();
+ }
+ updatePasswordStrength() {
+ if (this.masterPasswordStrengthTimeout != null) {
+ clearTimeout(this.masterPasswordStrengthTimeout);
+ }
+ this.masterPasswordStrengthTimeout = setTimeout(() => {
+ const strengthResult = this.passwordGenerationService.passwordStrength(this.masterPassword, this.getPasswordStrengthUserInput());
+ this.masterPasswordScore = strengthResult == null ? null : strengthResult.score;
+ }, 300);
+ }
+ getPasswordStrengthUserInput() {
+ let userInput = [];
+ const atPosition = this.email.indexOf('@');
+ if (atPosition > -1) {
+ userInput = userInput.concat(this.email.substr(0, atPosition).trim().toLowerCase().split(/[^A-Za-z0-9]/));
+ }
+ if (this.name != null && this.name !== '') {
+ userInput = userInput.concat(this.name.trim().toLowerCase().split(' '));
+ }
+ return userInput;
+ }
+}
+RegisterComponent.ɵfac = function RegisterComponent_Factory(t) { return new (t || RegisterComponent)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_auth_service__WEBPACK_IMPORTED_MODULE_5__["AuthService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_router__WEBPACK_IMPORTED_MODULE_1__["Router"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_8__["I18nService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_crypto_service__WEBPACK_IMPORTED_MODULE_6__["CryptoService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_api_service__WEBPACK_IMPORTED_MODULE_4__["ApiService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_state_service__WEBPACK_IMPORTED_MODULE_12__["StateService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_11__["PlatformUtilsService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_passwordGeneration_service__WEBPACK_IMPORTED_MODULE_10__["PasswordGenerationService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_environment_service__WEBPACK_IMPORTED_MODULE_7__["EnvironmentService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_9__["LogService"])); };
+RegisterComponent.ɵdir = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineDirective"]({ type: RegisterComponent, features: [_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵInheritDefinitionFeature"]] });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](RegisterComponent, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Directive"]
+ }], function () { return [{ type: jslib_common_abstractions_auth_service__WEBPACK_IMPORTED_MODULE_5__["AuthService"] }, { type: _angular_router__WEBPACK_IMPORTED_MODULE_1__["Router"] }, { type: jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_8__["I18nService"] }, { type: jslib_common_abstractions_crypto_service__WEBPACK_IMPORTED_MODULE_6__["CryptoService"] }, { type: jslib_common_abstractions_api_service__WEBPACK_IMPORTED_MODULE_4__["ApiService"] }, { type: jslib_common_abstractions_state_service__WEBPACK_IMPORTED_MODULE_12__["StateService"] }, { type: jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_11__["PlatformUtilsService"] }, { type: jslib_common_abstractions_passwordGeneration_service__WEBPACK_IMPORTED_MODULE_10__["PasswordGenerationService"] }, { type: jslib_common_abstractions_environment_service__WEBPACK_IMPORTED_MODULE_7__["EnvironmentService"] }, { type: jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_9__["LogService"] }]; }, null); })();
+
+
+/***/ }),
+
+/***/ "./jslib/angular/src/components/send/add-edit.component.ts":
+/*!*****************************************************************!*\
+ !*** ./jslib/angular/src/components/send/add-edit.component.ts ***!
+ \*****************************************************************/
+/*! exports provided: AddEditComponent */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AddEditComponent", function() { return AddEditComponent; });
+/* harmony import */ var _angular_common__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/common */ "./node_modules/@angular/common/__ivy_ngcc__/fesm2015/common.js");
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var jslib_common_enums_policyType__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! jslib-common/enums/policyType */ "./jslib/common/src/enums/policyType.ts");
+/* harmony import */ var jslib_common_enums_sendType__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! jslib-common/enums/sendType */ "./jslib/common/src/enums/sendType.ts");
+/* harmony import */ var jslib_common_abstractions_environment_service__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! jslib-common/abstractions/environment.service */ "./jslib/common/src/abstractions/environment.service.ts");
+/* harmony import */ var jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! jslib-common/abstractions/i18n.service */ "./jslib/common/src/abstractions/i18n.service.ts");
+/* harmony import */ var jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! jslib-common/abstractions/log.service */ "./jslib/common/src/abstractions/log.service.ts");
+/* harmony import */ var jslib_common_abstractions_messaging_service__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! jslib-common/abstractions/messaging.service */ "./jslib/common/src/abstractions/messaging.service.ts");
+/* harmony import */ var jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! jslib-common/abstractions/platformUtils.service */ "./jslib/common/src/abstractions/platformUtils.service.ts");
+/* harmony import */ var jslib_common_abstractions_policy_service__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! jslib-common/abstractions/policy.service */ "./jslib/common/src/abstractions/policy.service.ts");
+/* harmony import */ var jslib_common_abstractions_send_service__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! jslib-common/abstractions/send.service */ "./jslib/common/src/abstractions/send.service.ts");
+/* harmony import */ var jslib_common_abstractions_user_service__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! jslib-common/abstractions/user.service */ "./jslib/common/src/abstractions/user.service.ts");
+/* harmony import */ var jslib_common_models_view_sendFileView__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! jslib-common/models/view/sendFileView */ "./jslib/common/src/models/view/sendFileView.ts");
+/* harmony import */ var jslib_common_models_view_sendTextView__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! jslib-common/models/view/sendTextView */ "./jslib/common/src/models/view/sendTextView.ts");
+/* harmony import */ var jslib_common_models_view_sendView__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! jslib-common/models/view/sendView */ "./jslib/common/src/models/view/sendView.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+class AddEditComponent {
+ constructor(i18nService, platformUtilsService, environmentService, datePipe, sendService, userService, messagingService, policyService, logService) {
+ this.i18nService = i18nService;
+ this.platformUtilsService = platformUtilsService;
+ this.environmentService = environmentService;
+ this.datePipe = datePipe;
+ this.sendService = sendService;
+ this.userService = userService;
+ this.messagingService = messagingService;
+ this.policyService = policyService;
+ this.logService = logService;
+ this.onSavedSend = new _angular_core__WEBPACK_IMPORTED_MODULE_1__["EventEmitter"]();
+ this.onDeletedSend = new _angular_core__WEBPACK_IMPORTED_MODULE_1__["EventEmitter"]();
+ this.onCancelled = new _angular_core__WEBPACK_IMPORTED_MODULE_1__["EventEmitter"]();
+ this.copyLink = false;
+ this.disableSend = false;
+ this.disableHideEmail = false;
+ this.showPassword = false;
+ this.sendType = jslib_common_enums_sendType__WEBPACK_IMPORTED_MODULE_3__["SendType"];
+ this.canAccessPremium = true;
+ this.emailVerified = true;
+ this.alertShown = false;
+ this.showOptions = false;
+ this.typeOptions = [
+ { name: i18nService.t('sendTypeFile'), value: jslib_common_enums_sendType__WEBPACK_IMPORTED_MODULE_3__["SendType"].File },
+ { name: i18nService.t('sendTypeText'), value: jslib_common_enums_sendType__WEBPACK_IMPORTED_MODULE_3__["SendType"].Text },
+ ];
+ this.sendLinkBaseUrl = this.environmentService.getSendUrl();
+ }
+ get link() {
+ if (this.send.id != null && this.send.accessId != null) {
+ return this.sendLinkBaseUrl + this.send.accessId + '/' + this.send.urlB64Key;
+ }
+ return null;
+ }
+ get isSafari() {
+ return this.platformUtilsService.isSafari();
+ }
+ get isDateTimeLocalSupported() {
+ return !(this.platformUtilsService.isFirefox() || this.platformUtilsService.isSafari());
+ }
+ ngOnInit() {
+ return __awaiter(this, void 0, void 0, function* () {
+ yield this.load();
+ });
+ }
+ get editMode() {
+ return this.sendId != null;
+ }
+ get title() {
+ return this.i18nService.t(this.editMode ?
+ 'editSend' :
+ 'createSend');
+ }
+ setDates(event) {
+ this.deletionDate = event.deletionDate;
+ this.expirationDate = event.expirationDate;
+ }
+ load() {
+ return __awaiter(this, void 0, void 0, function* () {
+ this.disableSend = yield this.policyService.policyAppliesToUser(jslib_common_enums_policyType__WEBPACK_IMPORTED_MODULE_2__["PolicyType"].DisableSend);
+ this.disableHideEmail = yield this.policyService.policyAppliesToUser(jslib_common_enums_policyType__WEBPACK_IMPORTED_MODULE_2__["PolicyType"].SendOptions, p => p.data.disableHideEmail);
+ this.canAccessPremium = yield this.userService.canAccessPremium();
+ this.emailVerified = yield this.userService.getEmailVerified();
+ if (!this.canAccessPremium || !this.emailVerified) {
+ this.type = jslib_common_enums_sendType__WEBPACK_IMPORTED_MODULE_3__["SendType"].Text;
+ }
+ if (this.send == null) {
+ if (this.editMode) {
+ const send = yield this.loadSend();
+ this.send = yield send.decrypt();
+ }
+ else {
+ this.send = new jslib_common_models_view_sendView__WEBPACK_IMPORTED_MODULE_14__["SendView"]();
+ this.send.type = this.type == null ? jslib_common_enums_sendType__WEBPACK_IMPORTED_MODULE_3__["SendType"].File : this.type;
+ this.send.file = new jslib_common_models_view_sendFileView__WEBPACK_IMPORTED_MODULE_12__["SendFileView"]();
+ this.send.text = new jslib_common_models_view_sendTextView__WEBPACK_IMPORTED_MODULE_13__["SendTextView"]();
+ this.send.deletionDate = new Date();
+ this.send.deletionDate.setDate(this.send.deletionDate.getDate() + 7);
+ }
+ }
+ this.hasPassword = this.send.password != null && this.send.password.trim() !== '';
+ });
+ }
+ submit() {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (this.disableSend) {
+ this.platformUtilsService.showToast('error', this.i18nService.t('errorOccurred'), this.i18nService.t('sendDisabledWarning'));
+ return false;
+ }
+ if (this.send.name == null || this.send.name === '') {
+ this.platformUtilsService.showToast('error', this.i18nService.t('errorOccurred'), this.i18nService.t('nameRequired'));
+ return false;
+ }
+ let file = null;
+ if (this.send.type === jslib_common_enums_sendType__WEBPACK_IMPORTED_MODULE_3__["SendType"].File && !this.editMode) {
+ const fileEl = document.getElementById('file');
+ const files = fileEl.files;
+ if (files == null || files.length === 0) {
+ this.platformUtilsService.showToast('error', this.i18nService.t('errorOccurred'), this.i18nService.t('selectFile'));
+ return;
+ }
+ file = files[0];
+ if (files[0].size > 524288000) { // 500 MB
+ this.platformUtilsService.showToast('error', this.i18nService.t('errorOccurred'), this.i18nService.t('maxFileSize'));
+ return;
+ }
+ }
+ if (this.password != null && this.password.trim() === '') {
+ this.password = null;
+ }
+ this.formPromise = this.encryptSend(file)
+ .then((encSend) => __awaiter(this, void 0, void 0, function* () {
+ const uploadPromise = this.sendService.saveWithServer(encSend);
+ yield uploadPromise;
+ if (this.send.id == null) {
+ this.send.id = encSend[0].id;
+ }
+ if (this.send.accessId == null) {
+ this.send.accessId = encSend[0].accessId;
+ }
+ this.onSavedSend.emit(this.send);
+ if (this.copyLink && this.link != null) {
+ const copySuccess = yield this.copyLinkToClipboard(this.link);
+ if (copySuccess !== null && copySuccess !== void 0 ? copySuccess : true) {
+ this.platformUtilsService.showToast('success', null, this.i18nService.t(this.editMode ? 'editedSend' : 'createdSend'));
+ }
+ else {
+ yield this.platformUtilsService.showDialog(this.i18nService.t(this.editMode ? 'editedSend' : 'createdSend'), null, this.i18nService.t('ok'), null, 'success', null);
+ yield this.copyLinkToClipboard(this.link);
+ }
+ }
+ }));
+ try {
+ yield this.formPromise;
+ return true;
+ }
+ catch (e) {
+ this.logService.error(e);
+ }
+ return false;
+ });
+ }
+ copyLinkToClipboard(link) {
+ return __awaiter(this, void 0, void 0, function* () {
+ return Promise.resolve(this.platformUtilsService.copyToClipboard(link));
+ });
+ }
+ delete() {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (this.deletePromise != null) {
+ return false;
+ }
+ const confirmed = yield this.platformUtilsService.showDialog(this.i18nService.t('deleteSendConfirmation'), this.i18nService.t('deleteSend'), this.i18nService.t('yes'), this.i18nService.t('no'), 'warning');
+ if (!confirmed) {
+ return false;
+ }
+ try {
+ this.deletePromise = this.sendService.deleteWithServer(this.send.id);
+ yield this.deletePromise;
+ this.platformUtilsService.showToast('success', null, this.i18nService.t('deletedSend'));
+ yield this.load();
+ this.onDeletedSend.emit(this.send);
+ return true;
+ }
+ catch (e) {
+ this.logService.error(e);
+ }
+ return false;
+ });
+ }
+ typeChanged() {
+ if (this.send.type === jslib_common_enums_sendType__WEBPACK_IMPORTED_MODULE_3__["SendType"].File && !this.alertShown) {
+ if (!this.canAccessPremium) {
+ this.alertShown = true;
+ this.messagingService.send('premiumRequired');
+ }
+ else if (!this.emailVerified) {
+ this.alertShown = true;
+ this.messagingService.send('emailVerificationRequired');
+ }
+ }
+ }
+ toggleOptions() {
+ this.showOptions = !this.showOptions;
+ }
+ loadSend() {
+ return __awaiter(this, void 0, void 0, function* () {
+ return this.sendService.get(this.sendId);
+ });
+ }
+ encryptSend(file) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const sendData = yield this.sendService.encrypt(this.send, file, this.password, null);
+ // Parse dates
+ try {
+ sendData[0].deletionDate = this.deletionDate == null ? null : new Date(this.deletionDate);
+ }
+ catch (_a) {
+ sendData[0].deletionDate = null;
+ }
+ try {
+ sendData[0].expirationDate = this.expirationDate == null ? null : new Date(this.expirationDate);
+ }
+ catch (_b) {
+ sendData[0].expirationDate = null;
+ }
+ return sendData;
+ });
+ }
+ togglePasswordVisible() {
+ this.showPassword = !this.showPassword;
+ document.getElementById('password').focus();
+ }
+}
+AddEditComponent.ɵfac = function AddEditComponent_Factory(t) { return new (t || AddEditComponent)(_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_5__["I18nService"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_8__["PlatformUtilsService"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](jslib_common_abstractions_environment_service__WEBPACK_IMPORTED_MODULE_4__["EnvironmentService"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](_angular_common__WEBPACK_IMPORTED_MODULE_0__["DatePipe"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](jslib_common_abstractions_send_service__WEBPACK_IMPORTED_MODULE_10__["SendService"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](jslib_common_abstractions_user_service__WEBPACK_IMPORTED_MODULE_11__["UserService"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](jslib_common_abstractions_messaging_service__WEBPACK_IMPORTED_MODULE_7__["MessagingService"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](jslib_common_abstractions_policy_service__WEBPACK_IMPORTED_MODULE_9__["PolicyService"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_6__["LogService"])); };
+AddEditComponent.ɵdir = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdefineDirective"]({ type: AddEditComponent, inputs: { sendId: "sendId", type: "type" }, outputs: { onSavedSend: "onSavedSend", onDeletedSend: "onDeletedSend", onCancelled: "onCancelled" } });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵsetClassMetadata"](AddEditComponent, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Directive"]
+ }], function () { return [{ type: jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_5__["I18nService"] }, { type: jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_8__["PlatformUtilsService"] }, { type: jslib_common_abstractions_environment_service__WEBPACK_IMPORTED_MODULE_4__["EnvironmentService"] }, { type: _angular_common__WEBPACK_IMPORTED_MODULE_0__["DatePipe"] }, { type: jslib_common_abstractions_send_service__WEBPACK_IMPORTED_MODULE_10__["SendService"] }, { type: jslib_common_abstractions_user_service__WEBPACK_IMPORTED_MODULE_11__["UserService"] }, { type: jslib_common_abstractions_messaging_service__WEBPACK_IMPORTED_MODULE_7__["MessagingService"] }, { type: jslib_common_abstractions_policy_service__WEBPACK_IMPORTED_MODULE_9__["PolicyService"] }, { type: jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_6__["LogService"] }]; }, { sendId: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Input"]
+ }], type: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Input"]
+ }], onSavedSend: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Output"]
+ }], onDeletedSend: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Output"]
+ }], onCancelled: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Output"]
+ }] }); })();
+
+
+/***/ }),
+
+/***/ "./jslib/angular/src/components/send/efflux-dates.component.ts":
+/*!*********************************************************************!*\
+ !*** ./jslib/angular/src/components/send/efflux-dates.component.ts ***!
+ \*********************************************************************/
+/*! exports provided: EffluxDatesComponent */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "EffluxDatesComponent", function() { return EffluxDatesComponent; });
+/* harmony import */ var _angular_common__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/common */ "./node_modules/@angular/common/__ivy_ngcc__/fesm2015/common.js");
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var _angular_forms__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @angular/forms */ "./node_modules/@angular/forms/__ivy_ngcc__/fesm2015/forms.js");
+/* harmony import */ var jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! jslib-common/abstractions/i18n.service */ "./jslib/common/src/abstractions/i18n.service.ts");
+/* harmony import */ var jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! jslib-common/abstractions/platformUtils.service */ "./jslib/common/src/abstractions/platformUtils.service.ts");
+
+
+
+
+
+
+
+
+
+// Different BrowserPath = different controls.
+var BrowserPath;
+(function (BrowserPath) {
+ // Native datetime-locale.
+ // We are happy.
+ BrowserPath["Default"] = "default";
+ // Native date and time inputs, but no datetime-locale.
+ // We use individual date and time inputs and create a datetime programatically on submit.
+ BrowserPath["Firefox"] = "firefox";
+ // No native date, time, or datetime-locale inputs.
+ // We use a polyfill for dates and a dropdown for times.
+ BrowserPath["Safari"] = "safari";
+})(BrowserPath || (BrowserPath = {}));
+var DateField;
+(function (DateField) {
+ DateField["DeletionDate"] = "deletion";
+ DateField["ExpriationDate"] = "expiration";
+})(DateField || (DateField = {}));
+// Value = hours
+var DatePreset;
+(function (DatePreset) {
+ DatePreset[DatePreset["OneHour"] = 1] = "OneHour";
+ DatePreset[DatePreset["OneDay"] = 24] = "OneDay";
+ DatePreset[DatePreset["TwoDays"] = 48] = "TwoDays";
+ DatePreset[DatePreset["ThreeDays"] = 72] = "ThreeDays";
+ DatePreset[DatePreset["SevenDays"] = 168] = "SevenDays";
+ DatePreset[DatePreset["ThirtyDays"] = 720] = "ThirtyDays";
+ DatePreset[DatePreset["Custom"] = 0] = "Custom";
+ DatePreset[DatePreset["Never"] = null] = "Never";
+})(DatePreset || (DatePreset = {}));
+class EffluxDatesComponent {
+ constructor(i18nService, platformUtilsService, datePipe) {
+ this.i18nService = i18nService;
+ this.platformUtilsService = platformUtilsService;
+ this.datePipe = datePipe;
+ this.datesChanged = new _angular_core__WEBPACK_IMPORTED_MODULE_1__["EventEmitter"]();
+ this.datesForm = new _angular_forms__WEBPACK_IMPORTED_MODULE_2__["FormGroup"]({
+ selectedDeletionDatePreset: new _angular_forms__WEBPACK_IMPORTED_MODULE_2__["FormControl"](),
+ selectedExpirationDatePreset: new _angular_forms__WEBPACK_IMPORTED_MODULE_2__["FormControl"](),
+ defaultDeletionDateTime: new _angular_forms__WEBPACK_IMPORTED_MODULE_2__["FormControl"](),
+ defaultExpirationDateTime: new _angular_forms__WEBPACK_IMPORTED_MODULE_2__["FormControl"](),
+ fallbackDeletionDate: new _angular_forms__WEBPACK_IMPORTED_MODULE_2__["FormControl"](),
+ fallbackDeletionTime: new _angular_forms__WEBPACK_IMPORTED_MODULE_2__["FormControl"](),
+ fallbackExpirationDate: new _angular_forms__WEBPACK_IMPORTED_MODULE_2__["FormControl"](),
+ fallbackExpirationTime: new _angular_forms__WEBPACK_IMPORTED_MODULE_2__["FormControl"](),
+ });
+ this.deletionDatePresets = [
+ { name: this.i18nService.t('oneHour'), value: DatePreset.OneHour },
+ { name: this.i18nService.t('oneDay'), value: DatePreset.OneDay },
+ { name: this.i18nService.t('days', '2'), value: DatePreset.TwoDays },
+ { name: this.i18nService.t('days', '3'), value: DatePreset.ThreeDays },
+ { name: this.i18nService.t('days', '7'), value: DatePreset.SevenDays },
+ { name: this.i18nService.t('days', '30'), value: DatePreset.ThirtyDays },
+ { name: this.i18nService.t('custom'), value: DatePreset.Custom },
+ ];
+ this.expirationDatePresets = [
+ { name: this.i18nService.t('never'), value: DatePreset.Never },
+ ].concat([...this.deletionDatePresets]);
+ }
+ get browserPath() {
+ if (this.platformUtilsService.isFirefox()) {
+ return BrowserPath.Firefox;
+ }
+ else if (this.platformUtilsService.isSafari()) {
+ return BrowserPath.Safari;
+ }
+ return BrowserPath.Default;
+ }
+ get selectedDeletionDatePreset() {
+ return this.datesForm.get('selectedDeletionDatePreset');
+ }
+ get selectedExpirationDatePreset() {
+ return this.datesForm.get('selectedExpirationDatePreset');
+ }
+ get defaultDeletionDateTime() {
+ return this.datesForm.get('defaultDeletionDateTime');
+ }
+ get defaultExpirationDateTime() {
+ return this.datesForm.get('defaultExpirationDateTime');
+ }
+ get fallbackDeletionDate() {
+ return this.datesForm.get('fallbackDeletionDate');
+ }
+ get fallbackDeletionTime() {
+ return this.datesForm.get('fallbackDeletionTime');
+ }
+ get fallbackExpirationDate() {
+ return this.datesForm.get('fallbackExpirationDate');
+ }
+ get fallbackExpirationTime() {
+ return this.datesForm.get('fallbackExpirationTime');
+ }
+ // Should be able to call these at any time and compute a submitable value
+ get formattedDeletionDate() {
+ switch (this.selectedDeletionDatePreset.value) {
+ case DatePreset.Never:
+ this.selectedDeletionDatePreset.setValue(DatePreset.SevenDays);
+ return this.formattedDeletionDate;
+ case DatePreset.Custom:
+ switch (this.browserPath) {
+ case BrowserPath.Safari:
+ case BrowserPath.Firefox:
+ return this.fallbackDeletionDate.value + 'T' + this.fallbackDeletionTime.value;
+ default:
+ return this.defaultDeletionDateTime.value;
+ }
+ default:
+ const now = new Date();
+ const miliseconds = now.setTime(now.getTime() +
+ (this.selectedDeletionDatePreset.value * 60 * 60 * 1000));
+ return new Date(miliseconds).toString();
+ }
+ }
+ get formattedExpirationDate() {
+ switch (this.selectedExpirationDatePreset.value) {
+ case DatePreset.Never:
+ return null;
+ case DatePreset.Custom:
+ switch (this.browserPath) {
+ case BrowserPath.Safari:
+ case BrowserPath.Firefox:
+ if ((!this.fallbackExpirationDate.value || !this.fallbackExpirationTime.value) &&
+ this.editMode) {
+ return null;
+ }
+ return this.fallbackExpirationDate.value + 'T' + this.fallbackExpirationTime.value;
+ default:
+ if (!this.defaultExpirationDateTime.value) {
+ return null;
+ }
+ return this.defaultExpirationDateTime.value;
+ }
+ default:
+ const now = new Date();
+ const miliseconds = now.setTime(now.getTime() +
+ (this.selectedExpirationDatePreset.value * 60 * 60 * 1000));
+ return new Date(miliseconds).toString();
+ }
+ }
+ //
+ get safariDeletionTimePresetOptions() {
+ return this.safariTimePresetOptions(DateField.DeletionDate);
+ }
+ get safariExpirationTimePresetOptions() {
+ return this.safariTimePresetOptions(DateField.ExpriationDate);
+ }
+ get nextWeek() {
+ const nextWeek = new Date();
+ nextWeek.setDate(nextWeek.getDate() + 7);
+ return nextWeek;
+ }
+ ngOnInit() {
+ this.setInitialFormValues();
+ this.emitDates();
+ this.datesForm.valueChanges.subscribe(() => {
+ this.emitDates();
+ });
+ }
+ onDeletionDatePresetSelect(value) {
+ this.selectedDeletionDatePreset.setValue(value);
+ }
+ clearExpiration() {
+ switch (this.browserPath) {
+ case BrowserPath.Safari:
+ case BrowserPath.Firefox:
+ this.fallbackExpirationDate.setValue(null);
+ this.fallbackExpirationTime.setValue(null);
+ break;
+ case BrowserPath.Default:
+ this.defaultExpirationDateTime.setValue(null);
+ break;
+ }
+ }
+ emitDates() {
+ this.datesChanged.emit({
+ deletionDate: this.formattedDeletionDate,
+ expirationDate: this.formattedExpirationDate,
+ });
+ }
+ setInitialFormValues() {
+ if (this.editMode) {
+ this.selectedDeletionDatePreset.setValue(DatePreset.Custom);
+ this.selectedExpirationDatePreset.setValue(DatePreset.Custom);
+ switch (this.browserPath) {
+ case BrowserPath.Safari:
+ case BrowserPath.Firefox:
+ this.fallbackDeletionDate.setValue(this.initialDeletionDate.toISOString().slice(0, 10));
+ this.fallbackDeletionTime.setValue(this.initialDeletionDate.toTimeString().slice(0, 5));
+ if (this.initialExpirationDate != null) {
+ this.fallbackExpirationDate.setValue(this.initialExpirationDate.toISOString().slice(0, 10));
+ this.fallbackExpirationTime.setValue(this.initialExpirationDate.toTimeString().slice(0, 5));
+ }
+ break;
+ case BrowserPath.Default:
+ if (this.initialExpirationDate) {
+ this.defaultExpirationDateTime.setValue(this.datePipe.transform(new Date(this.initialExpirationDate), 'yyyy-MM-ddTHH:mm'));
+ }
+ this.defaultDeletionDateTime.setValue(this.datePipe.transform(new Date(this.initialDeletionDate), 'yyyy-MM-ddTHH:mm'));
+ break;
+ }
+ }
+ else {
+ this.selectedDeletionDatePreset.setValue(DatePreset.SevenDays);
+ this.selectedExpirationDatePreset.setValue(DatePreset.Never);
+ switch (this.browserPath) {
+ case BrowserPath.Safari:
+ this.fallbackDeletionDate.setValue(this.nextWeek.toISOString().slice(0, 10));
+ this.fallbackDeletionTime.setValue(this.safariTimePresetOptions(DateField.DeletionDate)[1].twentyFourHour);
+ break;
+ default:
+ break;
+ }
+ }
+ }
+ safariTimePresetOptions(field) {
+ // init individual arrays for major sort groups
+ const noon = [];
+ const midnight = [];
+ const ams = [];
+ const pms = [];
+ // determine minute skip (5 min, 10 min, 15 min, etc.)
+ const minuteIncrementer = 15;
+ // loop through each hour on a 12 hour system
+ for (let h = 1; h <= 12; h++) {
+ // loop through each minute in the hour using the skip to incriment
+ for (let m = 0; m < 60; m += minuteIncrementer) {
+ // init the final strings that will be added to the lists
+ let hour = h.toString();
+ let minutes = m.toString();
+ // add prepending 0s to single digit hours/minutes
+ if (h < 10) {
+ hour = '0' + hour;
+ }
+ if (m < 10) {
+ minutes = '0' + minutes;
+ }
+ // build time strings and push to relevant sort groups
+ if (h === 12) {
+ const midnightOption = {
+ twelveHour: `${hour}:${minutes} AM`,
+ twentyFourHour: `00:${minutes}`,
+ };
+ midnight.push(midnightOption);
+ const noonOption = {
+ twelveHour: `${hour}:${minutes} PM`,
+ twentyFourHour: `${hour}:${minutes}`,
+ };
+ noon.push(noonOption);
+ }
+ else {
+ const amOption = {
+ twelveHour: `${hour}:${minutes} AM`,
+ twentyFourHour: `${hour}:${minutes}`,
+ };
+ ams.push(amOption);
+ const pmOption = {
+ twelveHour: `${hour}:${minutes} PM`,
+ twentyFourHour: `${h + 12}:${minutes}`,
+ };
+ pms.push(pmOption);
+ }
+ }
+ }
+ // bring all the arrays together in the right order
+ const validTimes = [...midnight, ...ams, ...noon, ...pms];
+ // determine if an unsupported value already exists on the send & add that to the top of the option list
+ // example: if the Send was created with a different client
+ if (field === DateField.ExpriationDate && this.initialExpirationDate != null && this.editMode) {
+ const previousValue = {
+ twelveHour: this.datePipe.transform(this.initialExpirationDate, 'hh:mm a'),
+ twentyFourHour: this.datePipe.transform(this.initialExpirationDate, 'HH:mm'),
+ };
+ return [previousValue, { twelveHour: null, twentyFourHour: null }, ...validTimes];
+ }
+ else if (field === DateField.DeletionDate && this.initialDeletionDate != null && this.editMode) {
+ const previousValue = {
+ twelveHour: this.datePipe.transform(this.initialDeletionDate, 'hh:mm a'),
+ twentyFourHour: this.datePipe.transform(this.initialDeletionDate, 'HH:mm'),
+ };
+ return [previousValue, ...validTimes];
+ }
+ else {
+ return [{ twelveHour: null, twentyFourHour: null }, ...validTimes];
+ }
+ }
+}
+EffluxDatesComponent.ɵfac = function EffluxDatesComponent_Factory(t) { return new (t || EffluxDatesComponent)(_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_3__["I18nService"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_4__["PlatformUtilsService"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](_angular_common__WEBPACK_IMPORTED_MODULE_0__["DatePipe"])); };
+EffluxDatesComponent.ɵdir = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdefineDirective"]({ type: EffluxDatesComponent, inputs: { initialDeletionDate: "initialDeletionDate", initialExpirationDate: "initialExpirationDate", editMode: "editMode", disabled: "disabled" }, outputs: { datesChanged: "datesChanged" } });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵsetClassMetadata"](EffluxDatesComponent, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Directive"]
+ }], function () { return [{ type: jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_3__["I18nService"] }, { type: jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_4__["PlatformUtilsService"] }, { type: _angular_common__WEBPACK_IMPORTED_MODULE_0__["DatePipe"] }]; }, { initialDeletionDate: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Input"]
+ }], initialExpirationDate: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Input"]
+ }], editMode: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Input"]
+ }], disabled: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Input"]
+ }], datesChanged: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Output"]
+ }] }); })();
+
+
+/***/ }),
+
+/***/ "./jslib/angular/src/components/send/send.component.ts":
+/*!*************************************************************!*\
+ !*** ./jslib/angular/src/components/send/send.component.ts ***!
+ \*************************************************************/
+/*! exports provided: SendComponent */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SendComponent", function() { return SendComponent; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var jslib_common_enums_policyType__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! jslib-common/enums/policyType */ "./jslib/common/src/enums/policyType.ts");
+/* harmony import */ var jslib_common_enums_sendType__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! jslib-common/enums/sendType */ "./jslib/common/src/enums/sendType.ts");
+/* harmony import */ var jslib_common_abstractions_environment_service__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! jslib-common/abstractions/environment.service */ "./jslib/common/src/abstractions/environment.service.ts");
+/* harmony import */ var jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! jslib-common/abstractions/i18n.service */ "./jslib/common/src/abstractions/i18n.service.ts");
+/* harmony import */ var jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! jslib-common/abstractions/log.service */ "./jslib/common/src/abstractions/log.service.ts");
+/* harmony import */ var jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! jslib-common/abstractions/platformUtils.service */ "./jslib/common/src/abstractions/platformUtils.service.ts");
+/* harmony import */ var jslib_common_abstractions_policy_service__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! jslib-common/abstractions/policy.service */ "./jslib/common/src/abstractions/policy.service.ts");
+/* harmony import */ var jslib_common_abstractions_search_service__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! jslib-common/abstractions/search.service */ "./jslib/common/src/abstractions/search.service.ts");
+/* harmony import */ var jslib_common_abstractions_send_service__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! jslib-common/abstractions/send.service */ "./jslib/common/src/abstractions/send.service.ts");
+/* harmony import */ var jslib_common_abstractions_user_service__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! jslib-common/abstractions/user.service */ "./jslib/common/src/abstractions/user.service.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+class SendComponent {
+ constructor(sendService, i18nService, platformUtilsService, environmentService, ngZone, searchService, policyService, userService, logService) {
+ this.sendService = sendService;
+ this.i18nService = i18nService;
+ this.platformUtilsService = platformUtilsService;
+ this.environmentService = environmentService;
+ this.ngZone = ngZone;
+ this.searchService = searchService;
+ this.policyService = policyService;
+ this.userService = userService;
+ this.logService = logService;
+ this.disableSend = false;
+ this.sendType = jslib_common_enums_sendType__WEBPACK_IMPORTED_MODULE_2__["SendType"];
+ this.loaded = false;
+ this.loading = true;
+ this.refreshing = false;
+ this.expired = false;
+ this.type = null;
+ this.sends = [];
+ this.filteredSends = [];
+ this.searchPending = false;
+ this.hasSearched = false; // search() function called - returns true if text qualifies for search
+ }
+ ngOnInit() {
+ return __awaiter(this, void 0, void 0, function* () {
+ this.disableSend = yield this.policyService.policyAppliesToUser(jslib_common_enums_policyType__WEBPACK_IMPORTED_MODULE_1__["PolicyType"].DisableSend);
+ });
+ }
+ load(filter = null) {
+ return __awaiter(this, void 0, void 0, function* () {
+ this.loading = true;
+ const sends = yield this.sendService.getAllDecrypted();
+ this.sends = sends;
+ if (this.onSuccessfulLoad != null) {
+ yield this.onSuccessfulLoad();
+ }
+ else {
+ // Default action
+ this.selectAll();
+ }
+ this.loading = false;
+ this.loaded = true;
+ });
+ }
+ reload(filter = null) {
+ return __awaiter(this, void 0, void 0, function* () {
+ this.loaded = false;
+ this.sends = [];
+ yield this.load(filter);
+ });
+ }
+ refresh() {
+ return __awaiter(this, void 0, void 0, function* () {
+ try {
+ this.refreshing = true;
+ yield this.reload(this.filter);
+ }
+ finally {
+ this.refreshing = false;
+ }
+ });
+ }
+ applyFilter(filter = null) {
+ return __awaiter(this, void 0, void 0, function* () {
+ this.filter = filter;
+ yield this.search(null);
+ });
+ }
+ search(timeout = null) {
+ return __awaiter(this, void 0, void 0, function* () {
+ this.searchPending = false;
+ if (this.searchTimeout != null) {
+ clearTimeout(this.searchTimeout);
+ }
+ if (timeout == null) {
+ this.hasSearched = this.searchService.isSearchable(this.searchText);
+ this.filteredSends = this.sends.filter(s => this.filter == null || this.filter(s));
+ this.applyTextSearch();
+ return;
+ }
+ this.searchPending = true;
+ this.searchTimeout = setTimeout(() => __awaiter(this, void 0, void 0, function* () {
+ this.hasSearched = this.searchService.isSearchable(this.searchText);
+ this.filteredSends = this.sends.filter(s => this.filter == null || this.filter(s));
+ this.applyTextSearch();
+ this.searchPending = false;
+ }), timeout);
+ });
+ }
+ removePassword(s) {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (this.actionPromise != null || s.password == null) {
+ return;
+ }
+ const confirmed = yield this.platformUtilsService.showDialog(this.i18nService.t('removePasswordConfirmation'), this.i18nService.t('removePassword'), this.i18nService.t('yes'), this.i18nService.t('no'), 'warning');
+ if (!confirmed) {
+ return false;
+ }
+ try {
+ this.actionPromise = this.sendService.removePasswordWithServer(s.id);
+ yield this.actionPromise;
+ if (this.onSuccessfulRemovePassword != null) {
+ this.onSuccessfulRemovePassword();
+ }
+ else {
+ // Default actions
+ this.platformUtilsService.showToast('success', null, this.i18nService.t('removedPassword'));
+ yield this.load();
+ }
+ }
+ catch (e) {
+ this.logService.error(e);
+ }
+ this.actionPromise = null;
+ });
+ }
+ delete(s) {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (this.actionPromise != null) {
+ return false;
+ }
+ const confirmed = yield this.platformUtilsService.showDialog(this.i18nService.t('deleteSendConfirmation'), this.i18nService.t('deleteSend'), this.i18nService.t('yes'), this.i18nService.t('no'), 'warning');
+ if (!confirmed) {
+ return false;
+ }
+ try {
+ this.actionPromise = this.sendService.deleteWithServer(s.id);
+ yield this.actionPromise;
+ if (this.onSuccessfulDelete != null) {
+ this.onSuccessfulDelete();
+ }
+ else {
+ // Default actions
+ this.platformUtilsService.showToast('success', null, this.i18nService.t('deletedSend'));
+ yield this.refresh();
+ }
+ }
+ catch (e) {
+ this.logService.error(e);
+ }
+ this.actionPromise = null;
+ return true;
+ });
+ }
+ copy(s) {
+ const sendLinkBaseUrl = this.environmentService.getSendUrl();
+ const link = sendLinkBaseUrl + s.accessId + '/' + s.urlB64Key;
+ this.platformUtilsService.copyToClipboard(link);
+ this.platformUtilsService.showToast('success', null, this.i18nService.t('valueCopied', this.i18nService.t('sendLink')));
+ }
+ searchTextChanged() {
+ this.search(200);
+ }
+ selectAll() {
+ this.clearSelections();
+ this.selectedAll = true;
+ this.applyFilter(null);
+ }
+ selectType(type) {
+ this.clearSelections();
+ this.selectedType = type;
+ this.applyFilter(s => s.type === type);
+ }
+ clearSelections() {
+ this.selectedAll = false;
+ this.selectedType = null;
+ }
+ applyTextSearch() {
+ if (this.searchText != null) {
+ this.filteredSends = this.searchService.searchSends(this.filteredSends, this.searchText);
+ }
+ }
+}
+SendComponent.ɵfac = function SendComponent_Factory(t) { return new (t || SendComponent)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_send_service__WEBPACK_IMPORTED_MODULE_9__["SendService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_4__["I18nService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_6__["PlatformUtilsService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_environment_service__WEBPACK_IMPORTED_MODULE_3__["EnvironmentService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["NgZone"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_search_service__WEBPACK_IMPORTED_MODULE_8__["SearchService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_policy_service__WEBPACK_IMPORTED_MODULE_7__["PolicyService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_user_service__WEBPACK_IMPORTED_MODULE_10__["UserService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_5__["LogService"])); };
+SendComponent.ɵdir = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineDirective"]({ type: SendComponent });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](SendComponent, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Directive"]
+ }], function () { return [{ type: jslib_common_abstractions_send_service__WEBPACK_IMPORTED_MODULE_9__["SendService"] }, { type: jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_4__["I18nService"] }, { type: jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_6__["PlatformUtilsService"] }, { type: jslib_common_abstractions_environment_service__WEBPACK_IMPORTED_MODULE_3__["EnvironmentService"] }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["NgZone"] }, { type: jslib_common_abstractions_search_service__WEBPACK_IMPORTED_MODULE_8__["SearchService"] }, { type: jslib_common_abstractions_policy_service__WEBPACK_IMPORTED_MODULE_7__["PolicyService"] }, { type: jslib_common_abstractions_user_service__WEBPACK_IMPORTED_MODULE_10__["UserService"] }, { type: jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_5__["LogService"] }]; }, null); })();
+
+
+/***/ }),
+
+/***/ "./jslib/angular/src/components/set-password.component.ts":
+/*!****************************************************************!*\
+ !*** ./jslib/angular/src/components/set-password.component.ts ***!
+ \****************************************************************/
+/*! exports provided: SetPasswordComponent */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SetPasswordComponent", function() { return SetPasswordComponent; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var _angular_router__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @angular/router */ "./node_modules/@angular/router/__ivy_ngcc__/fesm2015/router.js");
+/* harmony import */ var rxjs_operators__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! rxjs/operators */ "./node_modules/rxjs/_esm5/operators/index.js");
+/* harmony import */ var jslib_common_abstractions_api_service__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! jslib-common/abstractions/api.service */ "./jslib/common/src/abstractions/api.service.ts");
+/* harmony import */ var jslib_common_abstractions_crypto_service__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! jslib-common/abstractions/crypto.service */ "./jslib/common/src/abstractions/crypto.service.ts");
+/* harmony import */ var jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! jslib-common/abstractions/i18n.service */ "./jslib/common/src/abstractions/i18n.service.ts");
+/* harmony import */ var jslib_common_abstractions_messaging_service__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! jslib-common/abstractions/messaging.service */ "./jslib/common/src/abstractions/messaging.service.ts");
+/* harmony import */ var jslib_common_abstractions_passwordGeneration_service__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! jslib-common/abstractions/passwordGeneration.service */ "./jslib/common/src/abstractions/passwordGeneration.service.ts");
+/* harmony import */ var jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! jslib-common/abstractions/platformUtils.service */ "./jslib/common/src/abstractions/platformUtils.service.ts");
+/* harmony import */ var jslib_common_abstractions_policy_service__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! jslib-common/abstractions/policy.service */ "./jslib/common/src/abstractions/policy.service.ts");
+/* harmony import */ var jslib_common_abstractions_sync_service__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! jslib-common/abstractions/sync.service */ "./jslib/common/src/abstractions/sync.service.ts");
+/* harmony import */ var jslib_common_abstractions_user_service__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! jslib-common/abstractions/user.service */ "./jslib/common/src/abstractions/user.service.ts");
+/* harmony import */ var jslib_common_models_request_keysRequest__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! jslib-common/models/request/keysRequest */ "./jslib/common/src/models/request/keysRequest.ts");
+/* harmony import */ var jslib_common_models_request_organizationUserResetPasswordEnrollmentRequest__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! jslib-common/models/request/organizationUserResetPasswordEnrollmentRequest */ "./jslib/common/src/models/request/organizationUserResetPasswordEnrollmentRequest.ts");
+/* harmony import */ var jslib_common_models_request_setPasswordRequest__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! jslib-common/models/request/setPasswordRequest */ "./jslib/common/src/models/request/setPasswordRequest.ts");
+/* harmony import */ var _change_password_component__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./change-password.component */ "./jslib/angular/src/components/change-password.component.ts");
+/* harmony import */ var jslib_common_enums_hashPurpose__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! jslib-common/enums/hashPurpose */ "./jslib/common/src/enums/hashPurpose.ts");
+/* harmony import */ var jslib_common_enums_kdfType__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! jslib-common/enums/kdfType */ "./jslib/common/src/enums/kdfType.ts");
+/* harmony import */ var jslib_common_misc_utils__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! jslib-common/misc/utils */ "./jslib/common/src/misc/utils.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+class SetPasswordComponent extends _change_password_component__WEBPACK_IMPORTED_MODULE_15__["ChangePasswordComponent"] {
+ constructor(i18nService, cryptoService, messagingService, userService, passwordGenerationService, platformUtilsService, policyService, router, apiService, syncService, route) {
+ super(i18nService, cryptoService, messagingService, userService, passwordGenerationService, platformUtilsService, policyService);
+ this.router = router;
+ this.apiService = apiService;
+ this.syncService = syncService;
+ this.route = route;
+ this.syncLoading = true;
+ this.showPassword = false;
+ this.hint = '';
+ this.identifier = null;
+ this.resetPasswordAutoEnroll = false;
+ this.successRoute = 'vault';
+ }
+ ngOnInit() {
+ const _super = Object.create(null, {
+ ngOnInit: { get: () => super.ngOnInit }
+ });
+ return __awaiter(this, void 0, void 0, function* () {
+ yield this.syncService.fullSync(true);
+ this.syncLoading = false;
+ this.route.queryParams.pipe(Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_2__["first"])()).subscribe((qParams) => __awaiter(this, void 0, void 0, function* () {
+ if (qParams.identifier != null) {
+ this.identifier = qParams.identifier;
+ }
+ }));
+ // Automatic Enrollment Detection
+ if (this.identifier != null) {
+ try {
+ const response = yield this.apiService.getOrganizationAutoEnrollStatus(this.identifier);
+ this.orgId = response.id;
+ this.resetPasswordAutoEnroll = response.resetPasswordEnabled;
+ }
+ catch (_a) {
+ this.platformUtilsService.showToast('error', null, this.i18nService.t('errorOccurred'));
+ }
+ }
+ _super.ngOnInit.call(this);
+ });
+ }
+ setupSubmitActions() {
+ return __awaiter(this, void 0, void 0, function* () {
+ this.kdf = jslib_common_enums_kdfType__WEBPACK_IMPORTED_MODULE_17__["KdfType"].PBKDF2_SHA256;
+ const useLowerKdf = this.platformUtilsService.isIE();
+ this.kdfIterations = useLowerKdf ? 10000 : 100000;
+ return true;
+ });
+ }
+ performSubmitActions(masterPasswordHash, key, encKey) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const keys = yield this.cryptoService.makeKeyPair(encKey[0]);
+ const request = new jslib_common_models_request_setPasswordRequest__WEBPACK_IMPORTED_MODULE_14__["SetPasswordRequest"](masterPasswordHash, encKey[1].encryptedString, this.hint, this.kdf, this.kdfIterations, this.identifier, new jslib_common_models_request_keysRequest__WEBPACK_IMPORTED_MODULE_12__["KeysRequest"](keys[0], keys[1].encryptedString));
+ try {
+ if (this.resetPasswordAutoEnroll) {
+ this.formPromise = this.apiService.setPassword(request).then(() => __awaiter(this, void 0, void 0, function* () {
+ yield this.onSetPasswordSuccess(key, encKey, keys);
+ return this.apiService.getOrganizationKeys(this.orgId);
+ })).then((response) => __awaiter(this, void 0, void 0, function* () {
+ if (response == null) {
+ throw new Error(this.i18nService.t('resetPasswordOrgKeysError'));
+ }
+ const userId = yield this.userService.getUserId();
+ const publicKey = jslib_common_misc_utils__WEBPACK_IMPORTED_MODULE_18__["Utils"].fromB64ToArray(response.publicKey);
+ // RSA Encrypt user's encKey.key with organization public key
+ const userEncKey = yield this.cryptoService.getEncKey();
+ const encryptedKey = yield this.cryptoService.rsaEncrypt(userEncKey.key, publicKey.buffer);
+ const resetRequest = new jslib_common_models_request_organizationUserResetPasswordEnrollmentRequest__WEBPACK_IMPORTED_MODULE_13__["OrganizationUserResetPasswordEnrollmentRequest"]();
+ resetRequest.resetPasswordKey = encryptedKey.encryptedString;
+ return this.apiService.putOrganizationUserResetPasswordEnrollment(this.orgId, userId, resetRequest);
+ }));
+ }
+ else {
+ this.formPromise = this.apiService.setPassword(request).then(() => __awaiter(this, void 0, void 0, function* () {
+ yield this.onSetPasswordSuccess(key, encKey, keys);
+ }));
+ }
+ yield this.formPromise;
+ if (this.onSuccessfulChangePassword != null) {
+ this.onSuccessfulChangePassword();
+ }
+ else {
+ this.router.navigate([this.successRoute]);
+ }
+ }
+ catch (_a) {
+ this.platformUtilsService.showToast('error', null, this.i18nService.t('errorOccurred'));
+ }
+ });
+ }
+ togglePassword(confirmField) {
+ this.showPassword = !this.showPassword;
+ document.getElementById(confirmField ? 'masterPasswordRetype' : 'masterPassword').focus();
+ }
+ onSetPasswordSuccess(key, encKey, keys) {
+ return __awaiter(this, void 0, void 0, function* () {
+ yield this.userService.setInformation(yield this.userService.getUserId(), yield this.userService.getEmail(), this.kdf, this.kdfIterations);
+ yield this.cryptoService.setKey(key);
+ yield this.cryptoService.setEncKey(encKey[1].encryptedString);
+ yield this.cryptoService.setEncPrivateKey(keys[1].encryptedString);
+ const localKeyHash = yield this.cryptoService.hashPassword(this.masterPassword, key, jslib_common_enums_hashPurpose__WEBPACK_IMPORTED_MODULE_16__["HashPurpose"].LocalAuthorization);
+ yield this.cryptoService.setKeyHash(localKeyHash);
+ });
+ }
+}
+SetPasswordComponent.ɵfac = function SetPasswordComponent_Factory(t) { return new (t || SetPasswordComponent)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_5__["I18nService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_crypto_service__WEBPACK_IMPORTED_MODULE_4__["CryptoService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_messaging_service__WEBPACK_IMPORTED_MODULE_6__["MessagingService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_user_service__WEBPACK_IMPORTED_MODULE_11__["UserService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_passwordGeneration_service__WEBPACK_IMPORTED_MODULE_7__["PasswordGenerationService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_8__["PlatformUtilsService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_policy_service__WEBPACK_IMPORTED_MODULE_9__["PolicyService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_router__WEBPACK_IMPORTED_MODULE_1__["Router"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_api_service__WEBPACK_IMPORTED_MODULE_3__["ApiService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_sync_service__WEBPACK_IMPORTED_MODULE_10__["SyncService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_router__WEBPACK_IMPORTED_MODULE_1__["ActivatedRoute"])); };
+SetPasswordComponent.ɵdir = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineDirective"]({ type: SetPasswordComponent, features: [_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵInheritDefinitionFeature"]] });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](SetPasswordComponent, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Directive"]
+ }], function () { return [{ type: jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_5__["I18nService"] }, { type: jslib_common_abstractions_crypto_service__WEBPACK_IMPORTED_MODULE_4__["CryptoService"] }, { type: jslib_common_abstractions_messaging_service__WEBPACK_IMPORTED_MODULE_6__["MessagingService"] }, { type: jslib_common_abstractions_user_service__WEBPACK_IMPORTED_MODULE_11__["UserService"] }, { type: jslib_common_abstractions_passwordGeneration_service__WEBPACK_IMPORTED_MODULE_7__["PasswordGenerationService"] }, { type: jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_8__["PlatformUtilsService"] }, { type: jslib_common_abstractions_policy_service__WEBPACK_IMPORTED_MODULE_9__["PolicyService"] }, { type: _angular_router__WEBPACK_IMPORTED_MODULE_1__["Router"] }, { type: jslib_common_abstractions_api_service__WEBPACK_IMPORTED_MODULE_3__["ApiService"] }, { type: jslib_common_abstractions_sync_service__WEBPACK_IMPORTED_MODULE_10__["SyncService"] }, { type: _angular_router__WEBPACK_IMPORTED_MODULE_1__["ActivatedRoute"] }]; }, null); })();
+
+
+/***/ }),
+
+/***/ "./jslib/angular/src/components/set-pin.component.ts":
+/*!***********************************************************!*\
+ !*** ./jslib/angular/src/components/set-pin.component.ts ***!
+ \***********************************************************/
+/*! exports provided: SetPinComponent */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SetPinComponent", function() { return SetPinComponent; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var jslib_common_abstractions_crypto_service__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! jslib-common/abstractions/crypto.service */ "./jslib/common/src/abstractions/crypto.service.ts");
+/* harmony import */ var jslib_common_abstractions_storage_service__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! jslib-common/abstractions/storage.service */ "./jslib/common/src/abstractions/storage.service.ts");
+/* harmony import */ var jslib_common_abstractions_user_service__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! jslib-common/abstractions/user.service */ "./jslib/common/src/abstractions/user.service.ts");
+/* harmony import */ var jslib_common_abstractions_vaultTimeout_service__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! jslib-common/abstractions/vaultTimeout.service */ "./jslib/common/src/abstractions/vaultTimeout.service.ts");
+/* harmony import */ var jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! jslib-common/services/constants.service */ "./jslib/common/src/services/constants.service.ts");
+/* harmony import */ var jslib_common_misc_utils__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! jslib-common/misc/utils */ "./jslib/common/src/misc/utils.ts");
+/* harmony import */ var _modal_modal_ref__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./modal/modal.ref */ "./jslib/angular/src/components/modal/modal.ref.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+class SetPinComponent {
+ constructor(modalRef, cryptoService, userService, storageService, vaultTimeoutService) {
+ this.modalRef = modalRef;
+ this.cryptoService = cryptoService;
+ this.userService = userService;
+ this.storageService = storageService;
+ this.vaultTimeoutService = vaultTimeoutService;
+ this.pin = '';
+ this.showPin = false;
+ this.masterPassOnRestart = true;
+ }
+ toggleVisibility() {
+ this.showPin = !this.showPin;
+ }
+ submit() {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (jslib_common_misc_utils__WEBPACK_IMPORTED_MODULE_6__["Utils"].isNullOrWhitespace(this.pin)) {
+ this.modalRef.close(false);
+ }
+ const kdf = yield this.userService.getKdf();
+ const kdfIterations = yield this.userService.getKdfIterations();
+ const email = yield this.userService.getEmail();
+ const pinKey = yield this.cryptoService.makePinKey(this.pin, email, kdf, kdfIterations);
+ const key = yield this.cryptoService.getKey();
+ const pinProtectedKey = yield this.cryptoService.encrypt(key.key, pinKey);
+ if (this.masterPassOnRestart) {
+ const encPin = yield this.cryptoService.encrypt(this.pin);
+ yield this.storageService.save(jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_5__["ConstantsService"].protectedPin, encPin.encryptedString);
+ this.vaultTimeoutService.pinProtectedKey = pinProtectedKey;
+ }
+ else {
+ yield this.storageService.save(jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_5__["ConstantsService"].pinProtectedKey, pinProtectedKey.encryptedString);
+ }
+ this.modalRef.close(true);
+ });
+ }
+}
+SetPinComponent.ɵfac = function SetPinComponent_Factory(t) { return new (t || SetPinComponent)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_modal_modal_ref__WEBPACK_IMPORTED_MODULE_7__["ModalRef"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_crypto_service__WEBPACK_IMPORTED_MODULE_1__["CryptoService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_user_service__WEBPACK_IMPORTED_MODULE_3__["UserService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_storage_service__WEBPACK_IMPORTED_MODULE_2__["StorageService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_vaultTimeout_service__WEBPACK_IMPORTED_MODULE_4__["VaultTimeoutService"])); };
+SetPinComponent.ɵdir = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineDirective"]({ type: SetPinComponent });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](SetPinComponent, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Directive"]
+ }], function () { return [{ type: _modal_modal_ref__WEBPACK_IMPORTED_MODULE_7__["ModalRef"] }, { type: jslib_common_abstractions_crypto_service__WEBPACK_IMPORTED_MODULE_1__["CryptoService"] }, { type: jslib_common_abstractions_user_service__WEBPACK_IMPORTED_MODULE_3__["UserService"] }, { type: jslib_common_abstractions_storage_service__WEBPACK_IMPORTED_MODULE_2__["StorageService"] }, { type: jslib_common_abstractions_vaultTimeout_service__WEBPACK_IMPORTED_MODULE_4__["VaultTimeoutService"] }]; }, null); })();
+
+
+/***/ }),
+
+/***/ "./jslib/angular/src/components/settings/vault-timeout-input.component.ts":
+/*!********************************************************************************!*\
+ !*** ./jslib/angular/src/components/settings/vault-timeout-input.component.ts ***!
+ \********************************************************************************/
+/*! exports provided: VaultTimeoutInputComponent */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "VaultTimeoutInputComponent", function() { return VaultTimeoutInputComponent; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var _angular_forms__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @angular/forms */ "./node_modules/@angular/forms/__ivy_ngcc__/fesm2015/forms.js");
+/* harmony import */ var jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! jslib-common/abstractions/i18n.service */ "./jslib/common/src/abstractions/i18n.service.ts");
+/* harmony import */ var jslib_common_abstractions_policy_service__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! jslib-common/abstractions/policy.service */ "./jslib/common/src/abstractions/policy.service.ts");
+/* harmony import */ var jslib_common_enums_policyType__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! jslib-common/enums/policyType */ "./jslib/common/src/enums/policyType.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+
+
+
+
+
+
+
+class VaultTimeoutInputComponent {
+ constructor(fb, policyService, i18nService) {
+ this.fb = fb;
+ this.policyService = policyService;
+ this.i18nService = i18nService;
+ this.form = this.fb.group({
+ vaultTimeout: [null],
+ custom: this.fb.group({
+ hours: [null],
+ minutes: [null],
+ }),
+ });
+ }
+ get showCustom() {
+ return this.form.get('vaultTimeout').value === VaultTimeoutInputComponent.CUSTOM_VALUE;
+ }
+ ngOnInit() {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (yield this.policyService.policyAppliesToUser(jslib_common_enums_policyType__WEBPACK_IMPORTED_MODULE_4__["PolicyType"].MaximumVaultTimeout)) {
+ const vaultTimeoutPolicy = yield this.policyService.getAll(jslib_common_enums_policyType__WEBPACK_IMPORTED_MODULE_4__["PolicyType"].MaximumVaultTimeout);
+ this.vaultTimeoutPolicy = vaultTimeoutPolicy[0];
+ this.vaultTimeoutPolicyHours = Math.floor(this.vaultTimeoutPolicy.data.minutes / 60);
+ this.vaultTimeoutPolicyMinutes = this.vaultTimeoutPolicy.data.minutes % 60;
+ this.vaultTimeouts = this.vaultTimeouts.filter(t => t.value <= this.vaultTimeoutPolicy.data.minutes &&
+ (t.value > 0 || t.value === VaultTimeoutInputComponent.CUSTOM_VALUE) &&
+ t.value != null);
+ this.validatorChange();
+ }
+ this.form.valueChanges.subscribe((value) => __awaiter(this, void 0, void 0, function* () {
+ this.onChange(this.getVaultTimeout(value));
+ }));
+ // Assign the previous value to the custom fields
+ this.form.get('vaultTimeout').valueChanges.subscribe(value => {
+ if (value !== VaultTimeoutInputComponent.CUSTOM_VALUE) {
+ return;
+ }
+ const current = Math.max(this.form.value.vaultTimeout, 0);
+ this.form.patchValue({
+ custom: {
+ hours: Math.floor(current / 60),
+ minutes: current % 60,
+ },
+ });
+ });
+ });
+ }
+ ngOnChanges() {
+ this.vaultTimeouts.push({ name: this.i18nService.t('custom'), value: VaultTimeoutInputComponent.CUSTOM_VALUE });
+ }
+ getVaultTimeout(value) {
+ if (value.vaultTimeout !== VaultTimeoutInputComponent.CUSTOM_VALUE) {
+ return value.vaultTimeout;
+ }
+ return value.custom.hours * 60 + value.custom.minutes;
+ }
+ writeValue(value) {
+ if (value == null) {
+ return;
+ }
+ if (this.vaultTimeouts.every(p => p.value !== value)) {
+ this.form.setValue({
+ vaultTimeout: VaultTimeoutInputComponent.CUSTOM_VALUE,
+ custom: {
+ hours: Math.floor(value / 60),
+ minutes: value % 60,
+ },
+ });
+ return;
+ }
+ this.form.patchValue({
+ vaultTimeout: value,
+ });
+ }
+ registerOnChange(onChange) {
+ this.onChange = onChange;
+ }
+ // tslint:disable-next-line
+ registerOnTouched(onTouched) { }
+ // tslint:disable-next-line
+ setDisabledState(isDisabled) { }
+ validate(control) {
+ var _a, _b;
+ if (this.vaultTimeoutPolicy && ((_b = (_a = this.vaultTimeoutPolicy) === null || _a === void 0 ? void 0 : _a.data) === null || _b === void 0 ? void 0 : _b.minutes) < control.value) {
+ return { policyError: true };
+ }
+ return null;
+ }
+ registerOnValidatorChange(fn) {
+ this.validatorChange = fn;
+ }
+}
+VaultTimeoutInputComponent.CUSTOM_VALUE = -100;
+VaultTimeoutInputComponent.ɵfac = function VaultTimeoutInputComponent_Factory(t) { return new (t || VaultTimeoutInputComponent)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_forms__WEBPACK_IMPORTED_MODULE_1__["FormBuilder"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_policy_service__WEBPACK_IMPORTED_MODULE_3__["PolicyService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_2__["I18nService"])); };
+VaultTimeoutInputComponent.ɵdir = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineDirective"]({ type: VaultTimeoutInputComponent, inputs: { vaultTimeouts: "vaultTimeouts" }, features: [_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵNgOnChangesFeature"]] });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](VaultTimeoutInputComponent, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Directive"]
+ }], function () { return [{ type: _angular_forms__WEBPACK_IMPORTED_MODULE_1__["FormBuilder"] }, { type: jslib_common_abstractions_policy_service__WEBPACK_IMPORTED_MODULE_3__["PolicyService"] }, { type: jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_2__["I18nService"] }]; }, { vaultTimeouts: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"]
+ }] }); })();
+
+
+/***/ }),
+
+/***/ "./jslib/angular/src/components/share.component.ts":
+/*!*********************************************************!*\
+ !*** ./jslib/angular/src/components/share.component.ts ***!
+ \*********************************************************/
+/*! exports provided: ShareComponent */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ShareComponent", function() { return ShareComponent; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var jslib_common_enums_organizationUserStatusType__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! jslib-common/enums/organizationUserStatusType */ "./jslib/common/src/enums/organizationUserStatusType.ts");
+/* harmony import */ var jslib_common_abstractions_cipher_service__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! jslib-common/abstractions/cipher.service */ "./jslib/common/src/abstractions/cipher.service.ts");
+/* harmony import */ var jslib_common_abstractions_collection_service__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! jslib-common/abstractions/collection.service */ "./jslib/common/src/abstractions/collection.service.ts");
+/* harmony import */ var jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! jslib-common/abstractions/i18n.service */ "./jslib/common/src/abstractions/i18n.service.ts");
+/* harmony import */ var jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! jslib-common/abstractions/log.service */ "./jslib/common/src/abstractions/log.service.ts");
+/* harmony import */ var jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! jslib-common/abstractions/platformUtils.service */ "./jslib/common/src/abstractions/platformUtils.service.ts");
+/* harmony import */ var jslib_common_abstractions_user_service__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! jslib-common/abstractions/user.service */ "./jslib/common/src/abstractions/user.service.ts");
+/* harmony import */ var jslib_common_misc_utils__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! jslib-common/misc/utils */ "./jslib/common/src/misc/utils.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+class ShareComponent {
+ constructor(collectionService, platformUtilsService, i18nService, userService, cipherService, logService) {
+ this.collectionService = collectionService;
+ this.platformUtilsService = platformUtilsService;
+ this.i18nService = i18nService;
+ this.userService = userService;
+ this.cipherService = cipherService;
+ this.logService = logService;
+ this.onSharedCipher = new _angular_core__WEBPACK_IMPORTED_MODULE_0__["EventEmitter"]();
+ this.collections = [];
+ this.organizations = [];
+ this.writeableCollections = [];
+ }
+ ngOnInit() {
+ return __awaiter(this, void 0, void 0, function* () {
+ yield this.load();
+ });
+ }
+ load() {
+ return __awaiter(this, void 0, void 0, function* () {
+ const allCollections = yield this.collectionService.getAllDecrypted();
+ this.writeableCollections = allCollections.map(c => c).filter(c => !c.readOnly);
+ const orgs = yield this.userService.getAllOrganizations();
+ this.organizations = orgs.sort(jslib_common_misc_utils__WEBPACK_IMPORTED_MODULE_8__["Utils"].getSortFunction(this.i18nService, 'name'))
+ .filter(o => o.enabled && o.status === jslib_common_enums_organizationUserStatusType__WEBPACK_IMPORTED_MODULE_1__["OrganizationUserStatusType"].Confirmed);
+ const cipherDomain = yield this.cipherService.get(this.cipherId);
+ this.cipher = yield cipherDomain.decrypt();
+ if (this.organizationId == null && this.organizations.length > 0) {
+ this.organizationId = this.organizations[0].id;
+ }
+ this.filterCollections();
+ });
+ }
+ filterCollections() {
+ this.writeableCollections.forEach(c => c.checked = false);
+ if (this.organizationId == null || this.writeableCollections.length === 0) {
+ this.collections = [];
+ }
+ else {
+ this.collections = this.writeableCollections.filter(c => c.organizationId === this.organizationId);
+ }
+ }
+ submit() {
+ var _a, _b;
+ return __awaiter(this, void 0, void 0, function* () {
+ const selectedCollectionIds = this.collections
+ .filter(c => !!c.checked)
+ .map(c => c.id);
+ if (selectedCollectionIds.length === 0) {
+ this.platformUtilsService.showToast('error', this.i18nService.t('errorOccurred'), this.i18nService.t('selectOneCollection'));
+ return;
+ }
+ const cipherDomain = yield this.cipherService.get(this.cipherId);
+ const cipherView = yield cipherDomain.decrypt();
+ const orgName = (_b = (_a = this.organizations.find(o => o.id === this.organizationId)) === null || _a === void 0 ? void 0 : _a.name) !== null && _b !== void 0 ? _b : this.i18nService.t('organization');
+ try {
+ this.formPromise = this.cipherService.shareWithServer(cipherView, this.organizationId, selectedCollectionIds).then(() => __awaiter(this, void 0, void 0, function* () {
+ this.onSharedCipher.emit();
+ this.platformUtilsService.showToast('success', null, this.i18nService.t('movedItemToOrg', cipherView.name, orgName));
+ }));
+ yield this.formPromise;
+ return true;
+ }
+ catch (e) {
+ this.logService.error(e);
+ }
+ return false;
+ });
+ }
+ get canSave() {
+ if (this.collections != null) {
+ for (let i = 0; i < this.collections.length; i++) {
+ if (this.collections[i].checked) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+}
+ShareComponent.ɵfac = function ShareComponent_Factory(t) { return new (t || ShareComponent)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_collection_service__WEBPACK_IMPORTED_MODULE_3__["CollectionService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_6__["PlatformUtilsService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_4__["I18nService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_user_service__WEBPACK_IMPORTED_MODULE_7__["UserService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_cipher_service__WEBPACK_IMPORTED_MODULE_2__["CipherService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_5__["LogService"])); };
+ShareComponent.ɵdir = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineDirective"]({ type: ShareComponent, inputs: { cipherId: "cipherId", organizationId: "organizationId" }, outputs: { onSharedCipher: "onSharedCipher" } });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](ShareComponent, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Directive"]
+ }], function () { return [{ type: jslib_common_abstractions_collection_service__WEBPACK_IMPORTED_MODULE_3__["CollectionService"] }, { type: jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_6__["PlatformUtilsService"] }, { type: jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_4__["I18nService"] }, { type: jslib_common_abstractions_user_service__WEBPACK_IMPORTED_MODULE_7__["UserService"] }, { type: jslib_common_abstractions_cipher_service__WEBPACK_IMPORTED_MODULE_2__["CipherService"] }, { type: jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_5__["LogService"] }]; }, { cipherId: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"]
+ }], organizationId: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"]
+ }], onSharedCipher: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Output"]
+ }] }); })();
+
+
+/***/ }),
+
+/***/ "./jslib/angular/src/components/sso.component.ts":
+/*!*******************************************************!*\
+ !*** ./jslib/angular/src/components/sso.component.ts ***!
+ \*******************************************************/
+/*! exports provided: SsoComponent */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SsoComponent", function() { return SsoComponent; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var _angular_router__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @angular/router */ "./node_modules/@angular/router/__ivy_ngcc__/fesm2015/router.js");
+/* harmony import */ var rxjs_operators__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! rxjs/operators */ "./node_modules/rxjs/_esm5/operators/index.js");
+/* harmony import */ var jslib_common_abstractions_api_service__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! jslib-common/abstractions/api.service */ "./jslib/common/src/abstractions/api.service.ts");
+/* harmony import */ var jslib_common_abstractions_auth_service__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! jslib-common/abstractions/auth.service */ "./jslib/common/src/abstractions/auth.service.ts");
+/* harmony import */ var jslib_common_abstractions_cryptoFunction_service__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! jslib-common/abstractions/cryptoFunction.service */ "./jslib/common/src/abstractions/cryptoFunction.service.ts");
+/* harmony import */ var jslib_common_abstractions_environment_service__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! jslib-common/abstractions/environment.service */ "./jslib/common/src/abstractions/environment.service.ts");
+/* harmony import */ var jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! jslib-common/abstractions/i18n.service */ "./jslib/common/src/abstractions/i18n.service.ts");
+/* harmony import */ var jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! jslib-common/abstractions/log.service */ "./jslib/common/src/abstractions/log.service.ts");
+/* harmony import */ var jslib_common_abstractions_passwordGeneration_service__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! jslib-common/abstractions/passwordGeneration.service */ "./jslib/common/src/abstractions/passwordGeneration.service.ts");
+/* harmony import */ var jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! jslib-common/abstractions/platformUtils.service */ "./jslib/common/src/abstractions/platformUtils.service.ts");
+/* harmony import */ var jslib_common_abstractions_state_service__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! jslib-common/abstractions/state.service */ "./jslib/common/src/abstractions/state.service.ts");
+/* harmony import */ var jslib_common_abstractions_storage_service__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! jslib-common/abstractions/storage.service */ "./jslib/common/src/abstractions/storage.service.ts");
+/* harmony import */ var jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! jslib-common/services/constants.service */ "./jslib/common/src/services/constants.service.ts");
+/* harmony import */ var jslib_common_misc_utils__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! jslib-common/misc/utils */ "./jslib/common/src/misc/utils.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+class SsoComponent {
+ constructor(authService, router, i18nService, route, storageService, stateService, platformUtilsService, apiService, cryptoFunctionService, environmentService, passwordGenerationService, logService) {
+ this.authService = authService;
+ this.router = router;
+ this.i18nService = i18nService;
+ this.route = route;
+ this.storageService = storageService;
+ this.stateService = stateService;
+ this.platformUtilsService = platformUtilsService;
+ this.apiService = apiService;
+ this.cryptoFunctionService = cryptoFunctionService;
+ this.environmentService = environmentService;
+ this.passwordGenerationService = passwordGenerationService;
+ this.logService = logService;
+ this.loggingIn = false;
+ this.twoFactorRoute = '2fa';
+ this.successRoute = 'lock';
+ this.changePasswordRoute = 'set-password';
+ this.forcePasswordResetRoute = 'update-temp-password';
+ }
+ ngOnInit() {
+ return __awaiter(this, void 0, void 0, function* () {
+ this.route.queryParams.pipe(Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_2__["first"])()).subscribe((qParams) => __awaiter(this, void 0, void 0, function* () {
+ if (qParams.code != null && qParams.state != null) {
+ const codeVerifier = yield this.storageService.get(jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_13__["ConstantsService"].ssoCodeVerifierKey);
+ const state = yield this.storageService.get(jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_13__["ConstantsService"].ssoStateKey);
+ yield this.storageService.remove(jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_13__["ConstantsService"].ssoCodeVerifierKey);
+ yield this.storageService.remove(jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_13__["ConstantsService"].ssoStateKey);
+ if (qParams.code != null && codeVerifier != null && state != null && this.checkState(state, qParams.state)) {
+ yield this.logIn(qParams.code, codeVerifier, this.getOrgIdentiferFromState(qParams.state));
+ }
+ }
+ else if (qParams.clientId != null && qParams.redirectUri != null && qParams.state != null &&
+ qParams.codeChallenge != null) {
+ this.redirectUri = qParams.redirectUri;
+ this.state = qParams.state;
+ this.codeChallenge = qParams.codeChallenge;
+ this.clientId = qParams.clientId;
+ }
+ }));
+ });
+ }
+ submit(returnUri, includeUserIdentifier) {
+ return __awaiter(this, void 0, void 0, function* () {
+ this.initiateSsoFormPromise = this.preValidate();
+ if (yield this.initiateSsoFormPromise) {
+ const authorizeUrl = yield this.buildAuthorizeUrl(returnUri, includeUserIdentifier);
+ this.platformUtilsService.launchUri(authorizeUrl, { sameWindow: true });
+ }
+ });
+ }
+ preValidate() {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (this.identifier == null || this.identifier === '') {
+ this.platformUtilsService.showToast('error', this.i18nService.t('ssoValidationFailed'), this.i18nService.t('ssoIdentifierRequired'));
+ return false;
+ }
+ return yield this.apiService.preValidateSso(this.identifier);
+ });
+ }
+ buildAuthorizeUrl(returnUri, includeUserIdentifier) {
+ return __awaiter(this, void 0, void 0, function* () {
+ let codeChallenge = this.codeChallenge;
+ let state = this.state;
+ const passwordOptions = {
+ type: 'password',
+ length: 64,
+ uppercase: true,
+ lowercase: true,
+ numbers: true,
+ special: false,
+ };
+ if (codeChallenge == null) {
+ const codeVerifier = yield this.passwordGenerationService.generatePassword(passwordOptions);
+ const codeVerifierHash = yield this.cryptoFunctionService.hash(codeVerifier, 'sha256');
+ codeChallenge = jslib_common_misc_utils__WEBPACK_IMPORTED_MODULE_14__["Utils"].fromBufferToUrlB64(codeVerifierHash);
+ yield this.storageService.save(jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_13__["ConstantsService"].ssoCodeVerifierKey, codeVerifier);
+ }
+ if (state == null) {
+ state = yield this.passwordGenerationService.generatePassword(passwordOptions);
+ if (returnUri) {
+ state += `_returnUri='${returnUri}'`;
+ }
+ }
+ // Add Organization Identifier to state
+ state += `_identifier=${this.identifier}`;
+ // Save state (regardless of new or existing)
+ yield this.storageService.save(jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_13__["ConstantsService"].ssoStateKey, state);
+ let authorizeUrl = this.environmentService.getIdentityUrl() + '/connect/authorize?' +
+ 'client_id=' + this.clientId + '&redirect_uri=' + encodeURIComponent(this.redirectUri) + '&' +
+ 'response_type=code&scope=api offline_access&' +
+ 'state=' + state + '&code_challenge=' + codeChallenge + '&' +
+ 'code_challenge_method=S256&response_mode=query&' +
+ 'domain_hint=' + encodeURIComponent(this.identifier);
+ if (includeUserIdentifier) {
+ const userIdentifier = yield this.apiService.getSsoUserIdentifier();
+ authorizeUrl += `&user_identifier=${encodeURIComponent(userIdentifier)}`;
+ }
+ return authorizeUrl;
+ });
+ }
+ logIn(code, codeVerifier, orgIdFromState) {
+ return __awaiter(this, void 0, void 0, function* () {
+ this.loggingIn = true;
+ try {
+ this.formPromise = this.authService.logInSso(code, codeVerifier, this.redirectUri, orgIdFromState);
+ const response = yield this.formPromise;
+ if (response.twoFactor) {
+ if (this.onSuccessfulLoginTwoFactorNavigate != null) {
+ this.onSuccessfulLoginTwoFactorNavigate();
+ }
+ else {
+ this.router.navigate([this.twoFactorRoute], {
+ queryParams: {
+ identifier: orgIdFromState,
+ sso: 'true',
+ },
+ });
+ }
+ }
+ else if (response.resetMasterPassword) {
+ if (this.onSuccessfulLoginChangePasswordNavigate != null) {
+ this.onSuccessfulLoginChangePasswordNavigate();
+ }
+ else {
+ this.router.navigate([this.changePasswordRoute], {
+ queryParams: {
+ identifier: orgIdFromState,
+ },
+ });
+ }
+ }
+ else if (response.forcePasswordReset) {
+ if (this.onSuccessfulLoginForceResetNavigate != null) {
+ this.onSuccessfulLoginForceResetNavigate();
+ }
+ else {
+ this.router.navigate([this.forcePasswordResetRoute]);
+ }
+ }
+ else {
+ const disableFavicon = yield this.storageService.get(jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_13__["ConstantsService"].disableFaviconKey);
+ yield this.stateService.save(jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_13__["ConstantsService"].disableFaviconKey, !!disableFavicon);
+ if (this.onSuccessfulLogin != null) {
+ this.onSuccessfulLogin();
+ }
+ if (this.onSuccessfulLoginNavigate != null) {
+ this.onSuccessfulLoginNavigate();
+ }
+ else {
+ this.router.navigate([this.successRoute]);
+ }
+ }
+ }
+ catch (e) {
+ this.logService.error(e);
+ if (e.message === 'Unable to reach crypto agent') {
+ this.platformUtilsService.showToast('error', null, this.i18nService.t('ssoCryptoAgentUnavailable'));
+ }
+ }
+ this.loggingIn = false;
+ });
+ }
+ getOrgIdentiferFromState(state) {
+ if (state === null || state === undefined) {
+ return null;
+ }
+ const stateSplit = state.split('_identifier=');
+ return stateSplit.length > 1 ? stateSplit[1] : null;
+ }
+ checkState(state, checkState) {
+ if (state === null || state === undefined) {
+ return false;
+ }
+ if (checkState === null || checkState === undefined) {
+ return false;
+ }
+ const stateSplit = state.split('_identifier=');
+ const checkStateSplit = checkState.split('_identifier=');
+ return stateSplit[0] === checkStateSplit[0];
+ }
+}
+SsoComponent.ɵfac = function SsoComponent_Factory(t) { return new (t || SsoComponent)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_auth_service__WEBPACK_IMPORTED_MODULE_4__["AuthService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_router__WEBPACK_IMPORTED_MODULE_1__["Router"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_7__["I18nService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_router__WEBPACK_IMPORTED_MODULE_1__["ActivatedRoute"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_storage_service__WEBPACK_IMPORTED_MODULE_12__["StorageService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_state_service__WEBPACK_IMPORTED_MODULE_11__["StateService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_10__["PlatformUtilsService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_api_service__WEBPACK_IMPORTED_MODULE_3__["ApiService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_cryptoFunction_service__WEBPACK_IMPORTED_MODULE_5__["CryptoFunctionService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_environment_service__WEBPACK_IMPORTED_MODULE_6__["EnvironmentService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_passwordGeneration_service__WEBPACK_IMPORTED_MODULE_9__["PasswordGenerationService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_8__["LogService"])); };
+SsoComponent.ɵdir = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineDirective"]({ type: SsoComponent });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](SsoComponent, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Directive"]
+ }], function () { return [{ type: jslib_common_abstractions_auth_service__WEBPACK_IMPORTED_MODULE_4__["AuthService"] }, { type: _angular_router__WEBPACK_IMPORTED_MODULE_1__["Router"] }, { type: jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_7__["I18nService"] }, { type: _angular_router__WEBPACK_IMPORTED_MODULE_1__["ActivatedRoute"] }, { type: jslib_common_abstractions_storage_service__WEBPACK_IMPORTED_MODULE_12__["StorageService"] }, { type: jslib_common_abstractions_state_service__WEBPACK_IMPORTED_MODULE_11__["StateService"] }, { type: jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_10__["PlatformUtilsService"] }, { type: jslib_common_abstractions_api_service__WEBPACK_IMPORTED_MODULE_3__["ApiService"] }, { type: jslib_common_abstractions_cryptoFunction_service__WEBPACK_IMPORTED_MODULE_5__["CryptoFunctionService"] }, { type: jslib_common_abstractions_environment_service__WEBPACK_IMPORTED_MODULE_6__["EnvironmentService"] }, { type: jslib_common_abstractions_passwordGeneration_service__WEBPACK_IMPORTED_MODULE_9__["PasswordGenerationService"] }, { type: jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_8__["LogService"] }]; }, null); })();
+
+
+/***/ }),
+
+/***/ "./jslib/angular/src/components/two-factor-options.component.ts":
+/*!**********************************************************************!*\
+ !*** ./jslib/angular/src/components/two-factor-options.component.ts ***!
+ \**********************************************************************/
+/*! exports provided: TwoFactorOptionsComponent */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TwoFactorOptionsComponent", function() { return TwoFactorOptionsComponent; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var _angular_router__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @angular/router */ "./node_modules/@angular/router/__ivy_ngcc__/fesm2015/router.js");
+/* harmony import */ var jslib_common_abstractions_auth_service__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! jslib-common/abstractions/auth.service */ "./jslib/common/src/abstractions/auth.service.ts");
+/* harmony import */ var jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! jslib-common/abstractions/i18n.service */ "./jslib/common/src/abstractions/i18n.service.ts");
+/* harmony import */ var jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! jslib-common/abstractions/platformUtils.service */ "./jslib/common/src/abstractions/platformUtils.service.ts");
+
+
+
+
+
+
+
+
+
+
+class TwoFactorOptionsComponent {
+ constructor(authService, router, i18nService, platformUtilsService, win) {
+ this.authService = authService;
+ this.router = router;
+ this.i18nService = i18nService;
+ this.platformUtilsService = platformUtilsService;
+ this.win = win;
+ this.onProviderSelected = new _angular_core__WEBPACK_IMPORTED_MODULE_0__["EventEmitter"]();
+ this.onRecoverSelected = new _angular_core__WEBPACK_IMPORTED_MODULE_0__["EventEmitter"]();
+ this.providers = [];
+ }
+ ngOnInit() {
+ this.providers = this.authService.getSupportedTwoFactorProviders(this.win);
+ }
+ choose(p) {
+ this.onProviderSelected.emit(p.type);
+ }
+ recover() {
+ this.platformUtilsService.launchUri('https://help.bitwarden.com/article/lost-two-step-device/');
+ this.onRecoverSelected.emit();
+ }
+}
+TwoFactorOptionsComponent.ɵfac = function TwoFactorOptionsComponent_Factory(t) { return new (t || TwoFactorOptionsComponent)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_auth_service__WEBPACK_IMPORTED_MODULE_2__["AuthService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_router__WEBPACK_IMPORTED_MODULE_1__["Router"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_3__["I18nService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_4__["PlatformUtilsService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](Window)); };
+TwoFactorOptionsComponent.ɵdir = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineDirective"]({ type: TwoFactorOptionsComponent, outputs: { onProviderSelected: "onProviderSelected", onRecoverSelected: "onRecoverSelected" } });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](TwoFactorOptionsComponent, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Directive"]
+ }], function () { return [{ type: jslib_common_abstractions_auth_service__WEBPACK_IMPORTED_MODULE_2__["AuthService"] }, { type: _angular_router__WEBPACK_IMPORTED_MODULE_1__["Router"] }, { type: jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_3__["I18nService"] }, { type: jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_4__["PlatformUtilsService"] }, { type: Window }]; }, { onProviderSelected: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Output"]
+ }], onRecoverSelected: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Output"]
+ }] }); })();
+
+
+/***/ }),
+
+/***/ "./jslib/angular/src/components/two-factor.component.ts":
+/*!**************************************************************!*\
+ !*** ./jslib/angular/src/components/two-factor.component.ts ***!
+ \**************************************************************/
+/*! exports provided: TwoFactorComponent */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TwoFactorComponent", function() { return TwoFactorComponent; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var _angular_router__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @angular/router */ "./node_modules/@angular/router/__ivy_ngcc__/fesm2015/router.js");
+/* harmony import */ var rxjs_operators__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! rxjs/operators */ "./node_modules/rxjs/_esm5/operators/index.js");
+/* harmony import */ var jslib_common_enums_twoFactorProviderType__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! jslib-common/enums/twoFactorProviderType */ "./jslib/common/src/enums/twoFactorProviderType.ts");
+/* harmony import */ var jslib_common_models_request_twoFactorEmailRequest__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! jslib-common/models/request/twoFactorEmailRequest */ "./jslib/common/src/models/request/twoFactorEmailRequest.ts");
+/* harmony import */ var jslib_common_abstractions_api_service__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! jslib-common/abstractions/api.service */ "./jslib/common/src/abstractions/api.service.ts");
+/* harmony import */ var jslib_common_abstractions_auth_service__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! jslib-common/abstractions/auth.service */ "./jslib/common/src/abstractions/auth.service.ts");
+/* harmony import */ var jslib_common_abstractions_environment_service__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! jslib-common/abstractions/environment.service */ "./jslib/common/src/abstractions/environment.service.ts");
+/* harmony import */ var jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! jslib-common/abstractions/i18n.service */ "./jslib/common/src/abstractions/i18n.service.ts");
+/* harmony import */ var jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! jslib-common/abstractions/log.service */ "./jslib/common/src/abstractions/log.service.ts");
+/* harmony import */ var jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! jslib-common/abstractions/platformUtils.service */ "./jslib/common/src/abstractions/platformUtils.service.ts");
+/* harmony import */ var jslib_common_abstractions_state_service__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! jslib-common/abstractions/state.service */ "./jslib/common/src/abstractions/state.service.ts");
+/* harmony import */ var jslib_common_abstractions_storage_service__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! jslib-common/abstractions/storage.service */ "./jslib/common/src/abstractions/storage.service.ts");
+/* harmony import */ var jslib_common_services_auth_service__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! jslib-common/services/auth.service */ "./jslib/common/src/services/auth.service.ts");
+/* harmony import */ var jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! jslib-common/services/constants.service */ "./jslib/common/src/services/constants.service.ts");
+/* harmony import */ var duo_web_sdk__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! duo_web_sdk */ "./node_modules/duo_web_sdk/index.js");
+/* harmony import */ var duo_web_sdk__WEBPACK_IMPORTED_MODULE_15___default = /*#__PURE__*/__webpack_require__.n(duo_web_sdk__WEBPACK_IMPORTED_MODULE_15__);
+/* harmony import */ var jslib_common_misc_webauthn_iframe__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! jslib-common/misc/webauthn_iframe */ "./jslib/common/src/misc/webauthn_iframe.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+class TwoFactorComponent {
+ constructor(authService, router, i18nService, apiService, platformUtilsService, win, environmentService, stateService, storageService, route, logService) {
+ this.authService = authService;
+ this.router = router;
+ this.i18nService = i18nService;
+ this.apiService = apiService;
+ this.platformUtilsService = platformUtilsService;
+ this.win = win;
+ this.environmentService = environmentService;
+ this.stateService = stateService;
+ this.storageService = storageService;
+ this.route = route;
+ this.logService = logService;
+ this.token = '';
+ this.remember = false;
+ this.webAuthnReady = false;
+ this.webAuthnNewTab = false;
+ this.providers = jslib_common_services_auth_service__WEBPACK_IMPORTED_MODULE_13__["TwoFactorProviders"];
+ this.providerType = jslib_common_enums_twoFactorProviderType__WEBPACK_IMPORTED_MODULE_3__["TwoFactorProviderType"];
+ this.selectedProviderType = jslib_common_enums_twoFactorProviderType__WEBPACK_IMPORTED_MODULE_3__["TwoFactorProviderType"].Authenticator;
+ this.webAuthnSupported = false;
+ this.webAuthn = null;
+ this.title = '';
+ this.twoFactorEmail = null;
+ this.identifier = null;
+ this.loginRoute = 'login';
+ this.successRoute = 'vault';
+ this.webAuthnSupported = this.platformUtilsService.supportsWebAuthn(win);
+ }
+ get webAuthnAllow() {
+ return `publickey-credentials-get ${this.environmentService.getWebVaultUrl()}`;
+ }
+ ngOnInit() {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (!this.authing || this.authService.twoFactorProvidersData == null) {
+ this.router.navigate([this.loginRoute]);
+ return;
+ }
+ this.route.queryParams.pipe(Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_2__["first"])()).subscribe(qParams => {
+ if (qParams.identifier != null) {
+ this.identifier = qParams.identifier;
+ }
+ });
+ if (this.needsLock) {
+ this.successRoute = 'lock';
+ }
+ if (this.win != null && this.webAuthnSupported) {
+ const webVaultUrl = this.environmentService.getWebVaultUrl();
+ this.webAuthn = new jslib_common_misc_webauthn_iframe__WEBPACK_IMPORTED_MODULE_16__["WebAuthnIFrame"](this.win, webVaultUrl, this.webAuthnNewTab, this.platformUtilsService, this.i18nService, (token) => {
+ this.token = token;
+ this.submit();
+ }, (error) => {
+ this.platformUtilsService.showToast('error', this.i18nService.t('errorOccurred'), error);
+ }, (info) => {
+ if (info === 'ready') {
+ this.webAuthnReady = true;
+ }
+ });
+ }
+ this.selectedProviderType = this.authService.getDefaultTwoFactorProvider(this.webAuthnSupported);
+ yield this.init();
+ });
+ }
+ ngOnDestroy() {
+ this.cleanupWebAuthn();
+ this.webAuthn = null;
+ }
+ init() {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (this.selectedProviderType == null) {
+ this.title = this.i18nService.t('loginUnavailable');
+ return;
+ }
+ this.cleanupWebAuthn();
+ this.title = jslib_common_services_auth_service__WEBPACK_IMPORTED_MODULE_13__["TwoFactorProviders"][this.selectedProviderType].name;
+ const providerData = this.authService.twoFactorProvidersData.get(this.selectedProviderType);
+ switch (this.selectedProviderType) {
+ case jslib_common_enums_twoFactorProviderType__WEBPACK_IMPORTED_MODULE_3__["TwoFactorProviderType"].WebAuthn:
+ if (!this.webAuthnNewTab) {
+ setTimeout(() => {
+ this.authWebAuthn();
+ }, 500);
+ }
+ break;
+ case jslib_common_enums_twoFactorProviderType__WEBPACK_IMPORTED_MODULE_3__["TwoFactorProviderType"].Duo:
+ case jslib_common_enums_twoFactorProviderType__WEBPACK_IMPORTED_MODULE_3__["TwoFactorProviderType"].OrganizationDuo:
+ setTimeout(() => {
+ duo_web_sdk__WEBPACK_IMPORTED_MODULE_15__["init"]({
+ iframe: undefined,
+ host: providerData.Host,
+ sig_request: providerData.Signature,
+ submit_callback: (f) => __awaiter(this, void 0, void 0, function* () {
+ const sig = f.querySelector('input[name="sig_response"]');
+ if (sig != null) {
+ this.token = sig.value;
+ yield this.submit();
+ }
+ }),
+ });
+ }, 0);
+ break;
+ case jslib_common_enums_twoFactorProviderType__WEBPACK_IMPORTED_MODULE_3__["TwoFactorProviderType"].Email:
+ this.twoFactorEmail = providerData.Email;
+ if (this.authService.twoFactorProvidersData.size > 1) {
+ yield this.sendEmail(false);
+ }
+ break;
+ default:
+ break;
+ }
+ });
+ }
+ submit() {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (this.token == null || this.token === '') {
+ this.platformUtilsService.showToast('error', this.i18nService.t('errorOccurred'), this.i18nService.t('verificationCodeRequired'));
+ return;
+ }
+ if (this.selectedProviderType === jslib_common_enums_twoFactorProviderType__WEBPACK_IMPORTED_MODULE_3__["TwoFactorProviderType"].WebAuthn) {
+ if (this.webAuthn != null) {
+ this.webAuthn.stop();
+ }
+ else {
+ return;
+ }
+ }
+ else if (this.selectedProviderType === jslib_common_enums_twoFactorProviderType__WEBPACK_IMPORTED_MODULE_3__["TwoFactorProviderType"].Email ||
+ this.selectedProviderType === jslib_common_enums_twoFactorProviderType__WEBPACK_IMPORTED_MODULE_3__["TwoFactorProviderType"].Authenticator) {
+ this.token = this.token.replace(' ', '').trim();
+ }
+ try {
+ yield this.doSubmit();
+ }
+ catch (_a) {
+ if (this.selectedProviderType === jslib_common_enums_twoFactorProviderType__WEBPACK_IMPORTED_MODULE_3__["TwoFactorProviderType"].WebAuthn && this.webAuthn != null) {
+ this.webAuthn.start();
+ }
+ }
+ });
+ }
+ doSubmit() {
+ return __awaiter(this, void 0, void 0, function* () {
+ this.formPromise = this.authService.logInTwoFactor(this.selectedProviderType, this.token, this.remember);
+ const response = yield this.formPromise;
+ const disableFavicon = yield this.storageService.get(jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_14__["ConstantsService"].disableFaviconKey);
+ yield this.stateService.save(jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_14__["ConstantsService"].disableFaviconKey, !!disableFavicon);
+ if (this.onSuccessfulLogin != null) {
+ this.onSuccessfulLogin();
+ }
+ if (response.resetMasterPassword) {
+ this.successRoute = 'set-password';
+ }
+ if (response.forcePasswordReset) {
+ this.successRoute = 'update-temp-password';
+ }
+ if (this.onSuccessfulLoginNavigate != null) {
+ this.onSuccessfulLoginNavigate();
+ }
+ else {
+ this.router.navigate([this.successRoute], {
+ queryParams: {
+ identifier: this.identifier,
+ },
+ });
+ }
+ });
+ }
+ sendEmail(doToast) {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (this.selectedProviderType !== jslib_common_enums_twoFactorProviderType__WEBPACK_IMPORTED_MODULE_3__["TwoFactorProviderType"].Email) {
+ return;
+ }
+ if (this.emailPromise != null) {
+ return;
+ }
+ try {
+ const request = new jslib_common_models_request_twoFactorEmailRequest__WEBPACK_IMPORTED_MODULE_4__["TwoFactorEmailRequest"](this.authService.email, this.authService.masterPasswordHash);
+ this.emailPromise = this.apiService.postTwoFactorEmail(request);
+ yield this.emailPromise;
+ if (doToast) {
+ this.platformUtilsService.showToast('success', null, this.i18nService.t('verificationCodeEmailSent', this.twoFactorEmail));
+ }
+ }
+ catch (e) {
+ this.logService.error(e);
+ }
+ this.emailPromise = null;
+ });
+ }
+ authWebAuthn() {
+ const providerData = this.authService.twoFactorProvidersData.get(this.selectedProviderType);
+ if (!this.webAuthnSupported || this.webAuthn == null) {
+ return;
+ }
+ this.webAuthn.init(providerData);
+ }
+ cleanupWebAuthn() {
+ if (this.webAuthn != null) {
+ this.webAuthn.stop();
+ this.webAuthn.cleanup();
+ }
+ }
+ get authing() {
+ return this.authService.authingWithPassword() || this.authService.authingWithSso() || this.authService.authingWithApiKey();
+ }
+ get needsLock() {
+ return this.authService.authingWithSso() || this.authService.authingWithApiKey();
+ }
+}
+TwoFactorComponent.ɵfac = function TwoFactorComponent_Factory(t) { return new (t || TwoFactorComponent)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_auth_service__WEBPACK_IMPORTED_MODULE_6__["AuthService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_router__WEBPACK_IMPORTED_MODULE_1__["Router"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_8__["I18nService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_api_service__WEBPACK_IMPORTED_MODULE_5__["ApiService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_10__["PlatformUtilsService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](Window), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_environment_service__WEBPACK_IMPORTED_MODULE_7__["EnvironmentService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_state_service__WEBPACK_IMPORTED_MODULE_11__["StateService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_storage_service__WEBPACK_IMPORTED_MODULE_12__["StorageService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_router__WEBPACK_IMPORTED_MODULE_1__["ActivatedRoute"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_9__["LogService"])); };
+TwoFactorComponent.ɵdir = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineDirective"]({ type: TwoFactorComponent });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](TwoFactorComponent, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Directive"]
+ }], function () { return [{ type: jslib_common_abstractions_auth_service__WEBPACK_IMPORTED_MODULE_6__["AuthService"] }, { type: _angular_router__WEBPACK_IMPORTED_MODULE_1__["Router"] }, { type: jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_8__["I18nService"] }, { type: jslib_common_abstractions_api_service__WEBPACK_IMPORTED_MODULE_5__["ApiService"] }, { type: jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_10__["PlatformUtilsService"] }, { type: Window }, { type: jslib_common_abstractions_environment_service__WEBPACK_IMPORTED_MODULE_7__["EnvironmentService"] }, { type: jslib_common_abstractions_state_service__WEBPACK_IMPORTED_MODULE_11__["StateService"] }, { type: jslib_common_abstractions_storage_service__WEBPACK_IMPORTED_MODULE_12__["StorageService"] }, { type: _angular_router__WEBPACK_IMPORTED_MODULE_1__["ActivatedRoute"] }, { type: jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_9__["LogService"] }]; }, null); })();
+
+
+/***/ }),
+
+/***/ "./jslib/angular/src/components/update-temp-password.component.ts":
+/*!************************************************************************!*\
+ !*** ./jslib/angular/src/components/update-temp-password.component.ts ***!
+ \************************************************************************/
+/*! exports provided: UpdateTempPasswordComponent */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "UpdateTempPasswordComponent", function() { return UpdateTempPasswordComponent; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var jslib_common_abstractions_api_service__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! jslib-common/abstractions/api.service */ "./jslib/common/src/abstractions/api.service.ts");
+/* harmony import */ var jslib_common_abstractions_crypto_service__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! jslib-common/abstractions/crypto.service */ "./jslib/common/src/abstractions/crypto.service.ts");
+/* harmony import */ var jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! jslib-common/abstractions/i18n.service */ "./jslib/common/src/abstractions/i18n.service.ts");
+/* harmony import */ var jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! jslib-common/abstractions/log.service */ "./jslib/common/src/abstractions/log.service.ts");
+/* harmony import */ var jslib_common_abstractions_messaging_service__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! jslib-common/abstractions/messaging.service */ "./jslib/common/src/abstractions/messaging.service.ts");
+/* harmony import */ var jslib_common_abstractions_passwordGeneration_service__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! jslib-common/abstractions/passwordGeneration.service */ "./jslib/common/src/abstractions/passwordGeneration.service.ts");
+/* harmony import */ var jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! jslib-common/abstractions/platformUtils.service */ "./jslib/common/src/abstractions/platformUtils.service.ts");
+/* harmony import */ var jslib_common_abstractions_policy_service__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! jslib-common/abstractions/policy.service */ "./jslib/common/src/abstractions/policy.service.ts");
+/* harmony import */ var jslib_common_abstractions_sync_service__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! jslib-common/abstractions/sync.service */ "./jslib/common/src/abstractions/sync.service.ts");
+/* harmony import */ var jslib_common_abstractions_user_service__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! jslib-common/abstractions/user.service */ "./jslib/common/src/abstractions/user.service.ts");
+/* harmony import */ var _change_password_component__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./change-password.component */ "./jslib/angular/src/components/change-password.component.ts");
+/* harmony import */ var jslib_common_models_request_updateTempPasswordRequest__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! jslib-common/models/request/updateTempPasswordRequest */ "./jslib/common/src/models/request/updateTempPasswordRequest.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+class UpdateTempPasswordComponent extends _change_password_component__WEBPACK_IMPORTED_MODULE_11__["ChangePasswordComponent"] {
+ constructor(i18nService, platformUtilsService, passwordGenerationService, policyService, cryptoService, userService, messagingService, apiService, syncService, logService) {
+ super(i18nService, cryptoService, messagingService, userService, passwordGenerationService, platformUtilsService, policyService);
+ this.apiService = apiService;
+ this.syncService = syncService;
+ this.logService = logService;
+ this.showPassword = false;
+ }
+ ngOnInit() {
+ const _super = Object.create(null, {
+ ngOnInit: { get: () => super.ngOnInit }
+ });
+ return __awaiter(this, void 0, void 0, function* () {
+ yield this.syncService.fullSync(true);
+ _super.ngOnInit.call(this);
+ });
+ }
+ togglePassword(confirmField) {
+ this.showPassword = !this.showPassword;
+ document.getElementById(confirmField ? 'masterPasswordRetype' : 'masterPassword').focus();
+ }
+ setupSubmitActions() {
+ return __awaiter(this, void 0, void 0, function* () {
+ this.enforcedPolicyOptions = yield this.policyService.getMasterPasswordPolicyOptions();
+ this.email = yield this.userService.getEmail();
+ this.kdf = yield this.userService.getKdf();
+ this.kdfIterations = yield this.userService.getKdfIterations();
+ return true;
+ });
+ }
+ submit() {
+ return __awaiter(this, void 0, void 0, function* () {
+ // Validation
+ if (!(yield this.strongPassword())) {
+ return;
+ }
+ if (!(yield this.setupSubmitActions())) {
+ return;
+ }
+ try {
+ // Create new key and hash new password
+ const newKey = yield this.cryptoService.makeKey(this.masterPassword, this.email.trim().toLowerCase(), this.kdf, this.kdfIterations);
+ const newPasswordHash = yield this.cryptoService.hashPassword(this.masterPassword, newKey);
+ // Grab user's current enc key
+ const userEncKey = yield this.cryptoService.getEncKey();
+ // Create new encKey for the User
+ const newEncKey = yield this.cryptoService.remakeEncKey(newKey, userEncKey);
+ yield this.performSubmitActions(newPasswordHash, newKey, newEncKey);
+ }
+ catch (e) {
+ this.logService.error(e);
+ }
+ });
+ }
+ performSubmitActions(masterPasswordHash, key, encKey) {
+ return __awaiter(this, void 0, void 0, function* () {
+ try {
+ // Create request
+ const request = new jslib_common_models_request_updateTempPasswordRequest__WEBPACK_IMPORTED_MODULE_12__["UpdateTempPasswordRequest"]();
+ request.key = encKey[1].encryptedString;
+ request.newMasterPasswordHash = masterPasswordHash;
+ request.masterPasswordHint = this.hint;
+ // Update user's password
+ this.formPromise = this.apiService.putUpdateTempPassword(request);
+ yield this.formPromise;
+ this.platformUtilsService.showToast('success', null, this.i18nService.t('updatedMasterPassword'));
+ if (this.onSuccessfulChangePassword != null) {
+ this.onSuccessfulChangePassword();
+ }
+ else {
+ this.messagingService.send('logout');
+ }
+ }
+ catch (e) {
+ this.logService.error(e);
+ }
+ });
+ }
+}
+UpdateTempPasswordComponent.ɵfac = function UpdateTempPasswordComponent_Factory(t) { return new (t || UpdateTempPasswordComponent)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_3__["I18nService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_7__["PlatformUtilsService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_passwordGeneration_service__WEBPACK_IMPORTED_MODULE_6__["PasswordGenerationService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_policy_service__WEBPACK_IMPORTED_MODULE_8__["PolicyService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_crypto_service__WEBPACK_IMPORTED_MODULE_2__["CryptoService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_user_service__WEBPACK_IMPORTED_MODULE_10__["UserService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_messaging_service__WEBPACK_IMPORTED_MODULE_5__["MessagingService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_api_service__WEBPACK_IMPORTED_MODULE_1__["ApiService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_sync_service__WEBPACK_IMPORTED_MODULE_9__["SyncService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_4__["LogService"])); };
+UpdateTempPasswordComponent.ɵdir = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineDirective"]({ type: UpdateTempPasswordComponent, features: [_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵInheritDefinitionFeature"]] });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](UpdateTempPasswordComponent, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Directive"]
+ }], function () { return [{ type: jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_3__["I18nService"] }, { type: jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_7__["PlatformUtilsService"] }, { type: jslib_common_abstractions_passwordGeneration_service__WEBPACK_IMPORTED_MODULE_6__["PasswordGenerationService"] }, { type: jslib_common_abstractions_policy_service__WEBPACK_IMPORTED_MODULE_8__["PolicyService"] }, { type: jslib_common_abstractions_crypto_service__WEBPACK_IMPORTED_MODULE_2__["CryptoService"] }, { type: jslib_common_abstractions_user_service__WEBPACK_IMPORTED_MODULE_10__["UserService"] }, { type: jslib_common_abstractions_messaging_service__WEBPACK_IMPORTED_MODULE_5__["MessagingService"] }, { type: jslib_common_abstractions_api_service__WEBPACK_IMPORTED_MODULE_1__["ApiService"] }, { type: jslib_common_abstractions_sync_service__WEBPACK_IMPORTED_MODULE_9__["SyncService"] }, { type: jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_4__["LogService"] }]; }, null); })();
+
+
+/***/ }),
+
+/***/ "./jslib/angular/src/components/view-custom-fields.component.ts":
+/*!**********************************************************************!*\
+ !*** ./jslib/angular/src/components/view-custom-fields.component.ts ***!
+ \**********************************************************************/
+/*! exports provided: ViewCustomFieldsComponent */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ViewCustomFieldsComponent", function() { return ViewCustomFieldsComponent; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var jslib_common_enums_eventType__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! jslib-common/enums/eventType */ "./jslib/common/src/enums/eventType.ts");
+/* harmony import */ var jslib_common_enums_fieldType__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! jslib-common/enums/fieldType */ "./jslib/common/src/enums/fieldType.ts");
+/* harmony import */ var jslib_common_abstractions_event_service__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! jslib-common/abstractions/event.service */ "./jslib/common/src/abstractions/event.service.ts");
+/* harmony import */ var jslib_common_models_view_cipherView__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! jslib-common/models/view/cipherView */ "./jslib/common/src/models/view/cipherView.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+
+
+
+
+
+class ViewCustomFieldsComponent {
+ constructor(eventService) {
+ this.eventService = eventService;
+ this.fieldType = jslib_common_enums_fieldType__WEBPACK_IMPORTED_MODULE_2__["FieldType"];
+ }
+ toggleFieldValue(field) {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (!(yield this.promptPassword())) {
+ return;
+ }
+ const f = field;
+ f.showValue = !f.showValue;
+ if (f.showValue) {
+ this.eventService.collect(jslib_common_enums_eventType__WEBPACK_IMPORTED_MODULE_1__["EventType"].Cipher_ClientToggledHiddenFieldVisible, this.cipher.id);
+ }
+ });
+ }
+}
+ViewCustomFieldsComponent.ɵfac = function ViewCustomFieldsComponent_Factory(t) { return new (t || ViewCustomFieldsComponent)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_event_service__WEBPACK_IMPORTED_MODULE_3__["EventService"])); };
+ViewCustomFieldsComponent.ɵdir = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineDirective"]({ type: ViewCustomFieldsComponent, inputs: { cipher: "cipher", promptPassword: "promptPassword", copy: "copy" } });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](ViewCustomFieldsComponent, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Directive"]
+ }], function () { return [{ type: jslib_common_abstractions_event_service__WEBPACK_IMPORTED_MODULE_3__["EventService"] }]; }, { cipher: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"]
+ }], promptPassword: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"]
+ }], copy: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"]
+ }] }); })();
+
+
+/***/ }),
+
+/***/ "./jslib/angular/src/components/view.component.ts":
+/*!********************************************************!*\
+ !*** ./jslib/angular/src/components/view.component.ts ***!
+ \********************************************************/
+/*! exports provided: ViewComponent */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ViewComponent", function() { return ViewComponent; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var jslib_common_enums_cipherRepromptType__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! jslib-common/enums/cipherRepromptType */ "./jslib/common/src/enums/cipherRepromptType.ts");
+/* harmony import */ var jslib_common_enums_cipherType__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! jslib-common/enums/cipherType */ "./jslib/common/src/enums/cipherType.ts");
+/* harmony import */ var jslib_common_enums_eventType__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! jslib-common/enums/eventType */ "./jslib/common/src/enums/eventType.ts");
+/* harmony import */ var jslib_common_enums_fieldType__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! jslib-common/enums/fieldType */ "./jslib/common/src/enums/fieldType.ts");
+/* harmony import */ var jslib_common_abstractions_api_service__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! jslib-common/abstractions/api.service */ "./jslib/common/src/abstractions/api.service.ts");
+/* harmony import */ var jslib_common_abstractions_audit_service__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! jslib-common/abstractions/audit.service */ "./jslib/common/src/abstractions/audit.service.ts");
+/* harmony import */ var jslib_common_abstractions_broadcaster_service__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! jslib-common/abstractions/broadcaster.service */ "./jslib/common/src/abstractions/broadcaster.service.ts");
+/* harmony import */ var jslib_common_abstractions_cipher_service__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! jslib-common/abstractions/cipher.service */ "./jslib/common/src/abstractions/cipher.service.ts");
+/* harmony import */ var jslib_common_abstractions_crypto_service__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! jslib-common/abstractions/crypto.service */ "./jslib/common/src/abstractions/crypto.service.ts");
+/* harmony import */ var jslib_common_abstractions_event_service__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! jslib-common/abstractions/event.service */ "./jslib/common/src/abstractions/event.service.ts");
+/* harmony import */ var jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! jslib-common/abstractions/i18n.service */ "./jslib/common/src/abstractions/i18n.service.ts");
+/* harmony import */ var jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! jslib-common/abstractions/log.service */ "./jslib/common/src/abstractions/log.service.ts");
+/* harmony import */ var jslib_common_abstractions_passwordReprompt_service__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! jslib-common/abstractions/passwordReprompt.service */ "./jslib/common/src/abstractions/passwordReprompt.service.ts");
+/* harmony import */ var jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! jslib-common/abstractions/platformUtils.service */ "./jslib/common/src/abstractions/platformUtils.service.ts");
+/* harmony import */ var jslib_common_abstractions_token_service__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! jslib-common/abstractions/token.service */ "./jslib/common/src/abstractions/token.service.ts");
+/* harmony import */ var jslib_common_abstractions_totp_service__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! jslib-common/abstractions/totp.service */ "./jslib/common/src/abstractions/totp.service.ts");
+/* harmony import */ var jslib_common_abstractions_user_service__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! jslib-common/abstractions/user.service */ "./jslib/common/src/abstractions/user.service.ts");
+/* harmony import */ var jslib_common_models_response_errorResponse__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! jslib-common/models/response/errorResponse */ "./jslib/common/src/models/response/errorResponse.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+const BroadcasterSubscriptionId = 'ViewComponent';
+class ViewComponent {
+ constructor(cipherService, totpService, tokenService, i18nService, cryptoService, platformUtilsService, auditService, win, broadcasterService, ngZone, changeDetectorRef, userService, eventService, apiService, passwordRepromptService, logService) {
+ this.cipherService = cipherService;
+ this.totpService = totpService;
+ this.tokenService = tokenService;
+ this.i18nService = i18nService;
+ this.cryptoService = cryptoService;
+ this.platformUtilsService = platformUtilsService;
+ this.auditService = auditService;
+ this.win = win;
+ this.broadcasterService = broadcasterService;
+ this.ngZone = ngZone;
+ this.changeDetectorRef = changeDetectorRef;
+ this.userService = userService;
+ this.eventService = eventService;
+ this.apiService = apiService;
+ this.passwordRepromptService = passwordRepromptService;
+ this.logService = logService;
+ this.onEditCipher = new _angular_core__WEBPACK_IMPORTED_MODULE_0__["EventEmitter"]();
+ this.onCloneCipher = new _angular_core__WEBPACK_IMPORTED_MODULE_0__["EventEmitter"]();
+ this.onShareCipher = new _angular_core__WEBPACK_IMPORTED_MODULE_0__["EventEmitter"]();
+ this.onDeletedCipher = new _angular_core__WEBPACK_IMPORTED_MODULE_0__["EventEmitter"]();
+ this.onRestoredCipher = new _angular_core__WEBPACK_IMPORTED_MODULE_0__["EventEmitter"]();
+ this.fieldType = jslib_common_enums_fieldType__WEBPACK_IMPORTED_MODULE_4__["FieldType"];
+ this.passwordReprompted = false;
+ }
+ ngOnInit() {
+ this.broadcasterService.subscribe(BroadcasterSubscriptionId, (message) => {
+ this.ngZone.run(() => __awaiter(this, void 0, void 0, function* () {
+ switch (message.command) {
+ case 'syncCompleted':
+ if (message.successfully) {
+ yield this.load();
+ this.changeDetectorRef.detectChanges();
+ }
+ break;
+ }
+ }));
+ });
+ }
+ ngOnDestroy() {
+ this.broadcasterService.unsubscribe(BroadcasterSubscriptionId);
+ this.cleanUp();
+ }
+ load() {
+ return __awaiter(this, void 0, void 0, function* () {
+ this.cleanUp();
+ const cipher = yield this.cipherService.get(this.cipherId);
+ this.cipher = yield cipher.decrypt();
+ this.canAccessPremium = yield this.userService.canAccessPremium();
+ if (this.cipher.type === jslib_common_enums_cipherType__WEBPACK_IMPORTED_MODULE_2__["CipherType"].Login && this.cipher.login.totp &&
+ (cipher.organizationUseTotp || this.canAccessPremium)) {
+ yield this.totpUpdateCode();
+ const interval = this.totpService.getTimeInterval(this.cipher.login.totp);
+ yield this.totpTick(interval);
+ this.totpInterval = setInterval(() => __awaiter(this, void 0, void 0, function* () {
+ yield this.totpTick(interval);
+ }), 1000);
+ }
+ if (this.previousCipherId !== this.cipherId) {
+ this.eventService.collect(jslib_common_enums_eventType__WEBPACK_IMPORTED_MODULE_3__["EventType"].Cipher_ClientViewed, this.cipherId);
+ }
+ this.previousCipherId = this.cipherId;
+ });
+ }
+ edit() {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (yield this.promptPassword()) {
+ this.onEditCipher.emit(this.cipher);
+ return true;
+ }
+ return false;
+ });
+ }
+ clone() {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (yield this.promptPassword()) {
+ this.onCloneCipher.emit(this.cipher);
+ return true;
+ }
+ return false;
+ });
+ }
+ share() {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (yield this.promptPassword()) {
+ this.onShareCipher.emit(this.cipher);
+ return true;
+ }
+ return false;
+ });
+ }
+ delete() {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (!(yield this.promptPassword())) {
+ return;
+ }
+ const confirmed = yield this.platformUtilsService.showDialog(this.i18nService.t(this.cipher.isDeleted ? 'permanentlyDeleteItemConfirmation' : 'deleteItemConfirmation'), this.i18nService.t('deleteItem'), this.i18nService.t('yes'), this.i18nService.t('no'), 'warning');
+ if (!confirmed) {
+ return false;
+ }
+ try {
+ yield this.deleteCipher();
+ this.platformUtilsService.showToast('success', null, this.i18nService.t(this.cipher.isDeleted ? 'permanentlyDeletedItem' : 'deletedItem'));
+ this.onDeletedCipher.emit(this.cipher);
+ }
+ catch (e) {
+ this.logService.error(e);
+ }
+ return true;
+ });
+ }
+ restore() {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (!this.cipher.isDeleted) {
+ return false;
+ }
+ const confirmed = yield this.platformUtilsService.showDialog(this.i18nService.t('restoreItemConfirmation'), this.i18nService.t('restoreItem'), this.i18nService.t('yes'), this.i18nService.t('no'), 'warning');
+ if (!confirmed) {
+ return false;
+ }
+ try {
+ yield this.restoreCipher();
+ this.platformUtilsService.showToast('success', null, this.i18nService.t('restoredItem'));
+ this.onRestoredCipher.emit(this.cipher);
+ }
+ catch (e) {
+ this.logService.error(e);
+ }
+ return true;
+ });
+ }
+ togglePassword() {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (!(yield this.promptPassword())) {
+ return;
+ }
+ this.showPassword = !this.showPassword;
+ if (this.showPassword) {
+ this.eventService.collect(jslib_common_enums_eventType__WEBPACK_IMPORTED_MODULE_3__["EventType"].Cipher_ClientToggledPasswordVisible, this.cipherId);
+ }
+ });
+ }
+ toggleCardNumber() {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (!(yield this.promptPassword())) {
+ return;
+ }
+ this.showCardNumber = !this.showCardNumber;
+ if (this.showCardNumber) {
+ this.eventService.collect(jslib_common_enums_eventType__WEBPACK_IMPORTED_MODULE_3__["EventType"].Cipher_ClientToggledCardCodeVisible, this.cipherId);
+ }
+ });
+ }
+ toggleCardCode() {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (!(yield this.promptPassword())) {
+ return;
+ }
+ this.showCardCode = !this.showCardCode;
+ if (this.showCardCode) {
+ this.eventService.collect(jslib_common_enums_eventType__WEBPACK_IMPORTED_MODULE_3__["EventType"].Cipher_ClientToggledCardCodeVisible, this.cipherId);
+ }
+ });
+ }
+ checkPassword() {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (this.cipher.login == null || this.cipher.login.password == null || this.cipher.login.password === '') {
+ return;
+ }
+ this.checkPasswordPromise = this.auditService.passwordLeaked(this.cipher.login.password);
+ const matches = yield this.checkPasswordPromise;
+ if (matches > 0) {
+ this.platformUtilsService.showToast('warning', null, this.i18nService.t('passwordExposed', matches.toString()));
+ }
+ else {
+ this.platformUtilsService.showToast('success', null, this.i18nService.t('passwordSafe'));
+ }
+ });
+ }
+ launch(uri, cipherId) {
+ if (!uri.canLaunch) {
+ return;
+ }
+ if (cipherId) {
+ this.cipherService.updateLastLaunchedDate(cipherId);
+ }
+ this.platformUtilsService.launchUri(uri.launchUri);
+ }
+ copy(value, typeI18nKey, aType) {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (value == null) {
+ return;
+ }
+ if (this.passwordRepromptService.protectedFields().includes(aType) && !(yield this.promptPassword())) {
+ return;
+ }
+ const copyOptions = this.win != null ? { window: this.win } : null;
+ this.platformUtilsService.copyToClipboard(value, copyOptions);
+ this.platformUtilsService.showToast('info', null, this.i18nService.t('valueCopied', this.i18nService.t(typeI18nKey)));
+ if (typeI18nKey === 'password') {
+ this.eventService.collect(jslib_common_enums_eventType__WEBPACK_IMPORTED_MODULE_3__["EventType"].Cipher_ClientToggledHiddenFieldVisible, this.cipherId);
+ }
+ else if (typeI18nKey === 'securityCode') {
+ this.eventService.collect(jslib_common_enums_eventType__WEBPACK_IMPORTED_MODULE_3__["EventType"].Cipher_ClientCopiedCardCode, this.cipherId);
+ }
+ else if (aType === 'H_Field') {
+ this.eventService.collect(jslib_common_enums_eventType__WEBPACK_IMPORTED_MODULE_3__["EventType"].Cipher_ClientCopiedHiddenField, this.cipherId);
+ }
+ });
+ }
+ setTextDataOnDrag(event, data) {
+ event.dataTransfer.setData('text', data);
+ }
+ downloadAttachment(attachment) {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (!(yield this.promptPassword())) {
+ return;
+ }
+ const a = attachment;
+ if (a.downloading) {
+ return;
+ }
+ if (this.cipher.organizationId == null && !this.canAccessPremium) {
+ this.platformUtilsService.showToast('error', this.i18nService.t('premiumRequired'), this.i18nService.t('premiumRequiredDesc'));
+ return;
+ }
+ let url;
+ try {
+ const attachmentDownloadResponse = yield this.apiService.getAttachmentData(this.cipher.id, attachment.id);
+ url = attachmentDownloadResponse.url;
+ }
+ catch (e) {
+ if (e instanceof jslib_common_models_response_errorResponse__WEBPACK_IMPORTED_MODULE_18__["ErrorResponse"] && e.statusCode === 404) {
+ url = attachment.url;
+ }
+ else if (e instanceof jslib_common_models_response_errorResponse__WEBPACK_IMPORTED_MODULE_18__["ErrorResponse"]) {
+ throw new Error(e.getSingleMessage());
+ }
+ else {
+ throw e;
+ }
+ }
+ a.downloading = true;
+ const response = yield fetch(new Request(url, { cache: 'no-store' }));
+ if (response.status !== 200) {
+ this.platformUtilsService.showToast('error', null, this.i18nService.t('errorOccurred'));
+ a.downloading = false;
+ return;
+ }
+ try {
+ const buf = yield response.arrayBuffer();
+ const key = attachment.key != null ? attachment.key :
+ yield this.cryptoService.getOrgKey(this.cipher.organizationId);
+ const decBuf = yield this.cryptoService.decryptFromBytes(buf, key);
+ this.platformUtilsService.saveFile(this.win, decBuf, null, attachment.fileName);
+ }
+ catch (e) {
+ this.platformUtilsService.showToast('error', null, this.i18nService.t('errorOccurred'));
+ }
+ a.downloading = false;
+ });
+ }
+ deleteCipher() {
+ return this.cipher.isDeleted ? this.cipherService.deleteWithServer(this.cipher.id)
+ : this.cipherService.softDeleteWithServer(this.cipher.id);
+ }
+ restoreCipher() {
+ return this.cipherService.restoreWithServer(this.cipher.id);
+ }
+ promptPassword() {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (this.cipher.reprompt === jslib_common_enums_cipherRepromptType__WEBPACK_IMPORTED_MODULE_1__["CipherRepromptType"].None || this.passwordReprompted) {
+ return true;
+ }
+ return this.passwordReprompted = yield this.passwordRepromptService.showPasswordPrompt();
+ });
+ }
+ cleanUp() {
+ this.totpCode = null;
+ this.cipher = null;
+ this.showPassword = false;
+ this.showCardNumber = false;
+ this.showCardCode = false;
+ this.passwordReprompted = false;
+ if (this.totpInterval) {
+ clearInterval(this.totpInterval);
+ }
+ }
+ totpUpdateCode() {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (this.cipher == null || this.cipher.type !== jslib_common_enums_cipherType__WEBPACK_IMPORTED_MODULE_2__["CipherType"].Login || this.cipher.login.totp == null) {
+ if (this.totpInterval) {
+ clearInterval(this.totpInterval);
+ }
+ return;
+ }
+ this.totpCode = yield this.totpService.getCode(this.cipher.login.totp);
+ if (this.totpCode != null) {
+ if (this.totpCode.length > 4) {
+ const half = Math.floor(this.totpCode.length / 2);
+ this.totpCodeFormatted = this.totpCode.substring(0, half) + ' ' + this.totpCode.substring(half);
+ }
+ else {
+ this.totpCodeFormatted = this.totpCode;
+ }
+ }
+ else {
+ this.totpCodeFormatted = null;
+ if (this.totpInterval) {
+ clearInterval(this.totpInterval);
+ }
+ }
+ });
+ }
+ totpTick(intervalSeconds) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const epoch = Math.round(new Date().getTime() / 1000.0);
+ const mod = epoch % intervalSeconds;
+ this.totpSec = intervalSeconds - mod;
+ this.totpDash = +(Math.round((((78.6 / intervalSeconds) * mod) + 'e+2')) + 'e-2');
+ this.totpLow = this.totpSec <= 7;
+ if (mod === 0) {
+ yield this.totpUpdateCode();
+ }
+ });
+ }
+}
+ViewComponent.ɵfac = function ViewComponent_Factory(t) { return new (t || ViewComponent)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_cipher_service__WEBPACK_IMPORTED_MODULE_8__["CipherService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_totp_service__WEBPACK_IMPORTED_MODULE_16__["TotpService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_token_service__WEBPACK_IMPORTED_MODULE_15__["TokenService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_11__["I18nService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_crypto_service__WEBPACK_IMPORTED_MODULE_9__["CryptoService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_14__["PlatformUtilsService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_audit_service__WEBPACK_IMPORTED_MODULE_6__["AuditService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](Window), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_broadcaster_service__WEBPACK_IMPORTED_MODULE_7__["BroadcasterService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["NgZone"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ChangeDetectorRef"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_user_service__WEBPACK_IMPORTED_MODULE_17__["UserService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_event_service__WEBPACK_IMPORTED_MODULE_10__["EventService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_api_service__WEBPACK_IMPORTED_MODULE_5__["ApiService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_passwordReprompt_service__WEBPACK_IMPORTED_MODULE_13__["PasswordRepromptService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_12__["LogService"])); };
+ViewComponent.ɵdir = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineDirective"]({ type: ViewComponent, inputs: { cipherId: "cipherId" }, outputs: { onEditCipher: "onEditCipher", onCloneCipher: "onCloneCipher", onShareCipher: "onShareCipher", onDeletedCipher: "onDeletedCipher", onRestoredCipher: "onRestoredCipher" } });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](ViewComponent, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Directive"]
+ }], function () { return [{ type: jslib_common_abstractions_cipher_service__WEBPACK_IMPORTED_MODULE_8__["CipherService"] }, { type: jslib_common_abstractions_totp_service__WEBPACK_IMPORTED_MODULE_16__["TotpService"] }, { type: jslib_common_abstractions_token_service__WEBPACK_IMPORTED_MODULE_15__["TokenService"] }, { type: jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_11__["I18nService"] }, { type: jslib_common_abstractions_crypto_service__WEBPACK_IMPORTED_MODULE_9__["CryptoService"] }, { type: jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_14__["PlatformUtilsService"] }, { type: jslib_common_abstractions_audit_service__WEBPACK_IMPORTED_MODULE_6__["AuditService"] }, { type: Window }, { type: jslib_common_abstractions_broadcaster_service__WEBPACK_IMPORTED_MODULE_7__["BroadcasterService"] }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["NgZone"] }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["ChangeDetectorRef"] }, { type: jslib_common_abstractions_user_service__WEBPACK_IMPORTED_MODULE_17__["UserService"] }, { type: jslib_common_abstractions_event_service__WEBPACK_IMPORTED_MODULE_10__["EventService"] }, { type: jslib_common_abstractions_api_service__WEBPACK_IMPORTED_MODULE_5__["ApiService"] }, { type: jslib_common_abstractions_passwordReprompt_service__WEBPACK_IMPORTED_MODULE_13__["PasswordRepromptService"] }, { type: jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_12__["LogService"] }]; }, { cipherId: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"]
+ }], onEditCipher: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Output"]
+ }], onCloneCipher: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Output"]
+ }], onShareCipher: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Output"]
+ }], onDeletedCipher: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Output"]
+ }], onRestoredCipher: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Output"]
+ }] }); })();
+
+
+/***/ }),
+
+/***/ "./jslib/angular/src/directives/a11y-title.directive.ts":
+/*!**************************************************************!*\
+ !*** ./jslib/angular/src/directives/a11y-title.directive.ts ***!
+ \**************************************************************/
+/*! exports provided: A11yTitleDirective */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "A11yTitleDirective", function() { return A11yTitleDirective; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+
+
+class A11yTitleDirective {
+ constructor(el, renderer) {
+ this.el = el;
+ this.renderer = renderer;
+ }
+ set appA11yTitle(title) {
+ this.title = title;
+ }
+ ngOnInit() {
+ if (!this.el.nativeElement.hasAttribute('title')) {
+ this.renderer.setAttribute(this.el.nativeElement, 'title', this.title);
+ }
+ if (!this.el.nativeElement.hasAttribute('aria-label')) {
+ this.renderer.setAttribute(this.el.nativeElement, 'aria-label', this.title);
+ }
+ }
+}
+A11yTitleDirective.ɵfac = function A11yTitleDirective_Factory(t) { return new (t || A11yTitleDirective)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ElementRef"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["Renderer2"])); };
+A11yTitleDirective.ɵdir = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineDirective"]({ type: A11yTitleDirective, selectors: [["", "appA11yTitle", ""]], inputs: { appA11yTitle: "appA11yTitle" } });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](A11yTitleDirective, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Directive"],
+ args: [{
+ selector: '[appA11yTitle]',
+ }]
+ }], function () { return [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["ElementRef"] }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Renderer2"] }]; }, { appA11yTitle: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"]
+ }] }); })();
+
+
+/***/ }),
+
+/***/ "./jslib/angular/src/directives/api-action.directive.ts":
+/*!**************************************************************!*\
+ !*** ./jslib/angular/src/directives/api-action.directive.ts ***!
+ \**************************************************************/
+/*! exports provided: ApiActionDirective */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ApiActionDirective", function() { return ApiActionDirective; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! jslib-common/abstractions/log.service */ "./jslib/common/src/abstractions/log.service.ts");
+/* harmony import */ var jslib_common_models_response_errorResponse__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! jslib-common/models/response/errorResponse */ "./jslib/common/src/models/response/errorResponse.ts");
+/* harmony import */ var _services_validation_service__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../services/validation.service */ "./jslib/angular/src/services/validation.service.ts");
+
+
+
+
+
+
+
+class ApiActionDirective {
+ constructor(el, validationService, logService) {
+ this.el = el;
+ this.validationService = validationService;
+ this.logService = logService;
+ }
+ ngOnChanges(changes) {
+ if (this.appApiAction == null || this.appApiAction.then == null) {
+ return;
+ }
+ this.el.nativeElement.loading = true;
+ this.appApiAction.then((response) => {
+ this.el.nativeElement.loading = false;
+ }, (e) => {
+ var _a;
+ this.el.nativeElement.loading = false;
+ if ((e instanceof jslib_common_models_response_errorResponse__WEBPACK_IMPORTED_MODULE_2__["ErrorResponse"] || e.constructor.name === 'ErrorResponse') && e.captchaRequired) {
+ this.logService.error('Captcha required error response: ' + e.getSingleMessage());
+ return;
+ }
+ (_a = this.logService) === null || _a === void 0 ? void 0 : _a.error(`Received API exception: ${e}`);
+ this.validationService.showError(e);
+ });
+ }
+}
+ApiActionDirective.ɵfac = function ApiActionDirective_Factory(t) { return new (t || ApiActionDirective)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ElementRef"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_services_validation_service__WEBPACK_IMPORTED_MODULE_3__["ValidationService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_1__["LogService"])); };
+ApiActionDirective.ɵdir = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineDirective"]({ type: ApiActionDirective, selectors: [["", "appApiAction", ""]], inputs: { appApiAction: "appApiAction" }, features: [_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵNgOnChangesFeature"]] });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](ApiActionDirective, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Directive"],
+ args: [{
+ selector: '[appApiAction]',
+ }]
+ }], function () { return [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["ElementRef"] }, { type: _services_validation_service__WEBPACK_IMPORTED_MODULE_3__["ValidationService"] }, { type: jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_1__["LogService"] }]; }, { appApiAction: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"]
+ }] }); })();
+
+
+/***/ }),
+
+/***/ "./jslib/angular/src/directives/autofocus.directive.ts":
+/*!*************************************************************!*\
+ !*** ./jslib/angular/src/directives/autofocus.directive.ts ***!
+ \*************************************************************/
+/*! exports provided: AutofocusDirective */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AutofocusDirective", function() { return AutofocusDirective; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var rxjs_operators__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! rxjs/operators */ "./node_modules/rxjs/_esm5/operators/index.js");
+/* harmony import */ var jslib_common_misc_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! jslib-common/misc/utils */ "./jslib/common/src/misc/utils.ts");
+
+
+
+
+class AutofocusDirective {
+ constructor(el, ngZone) {
+ this.el = el;
+ this.ngZone = ngZone;
+ }
+ set appAutofocus(condition) {
+ this.autofocus = condition === '' || condition === true;
+ }
+ ngOnInit() {
+ if (!jslib_common_misc_utils__WEBPACK_IMPORTED_MODULE_2__["Utils"].isMobileBrowser && this.autofocus) {
+ if (this.ngZone.isStable) {
+ this.el.nativeElement.focus();
+ }
+ else {
+ this.ngZone.onStable.pipe(Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_1__["take"])(1)).subscribe(() => this.el.nativeElement.focus());
+ }
+ }
+ }
+}
+AutofocusDirective.ɵfac = function AutofocusDirective_Factory(t) { return new (t || AutofocusDirective)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ElementRef"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["NgZone"])); };
+AutofocusDirective.ɵdir = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineDirective"]({ type: AutofocusDirective, selectors: [["", "appAutofocus", ""]], inputs: { appAutofocus: "appAutofocus" } });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](AutofocusDirective, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Directive"],
+ args: [{
+ selector: '[appAutofocus]',
+ }]
+ }], function () { return [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["ElementRef"] }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["NgZone"] }]; }, { appAutofocus: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"]
+ }] }); })();
+
+
+/***/ }),
+
+/***/ "./jslib/angular/src/directives/blur-click.directive.ts":
+/*!**************************************************************!*\
+ !*** ./jslib/angular/src/directives/blur-click.directive.ts ***!
+ \**************************************************************/
+/*! exports provided: BlurClickDirective */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BlurClickDirective", function() { return BlurClickDirective; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+
+
+class BlurClickDirective {
+ constructor(el) {
+ this.el = el;
+ }
+ onClick() {
+ this.el.nativeElement.blur();
+ }
+}
+BlurClickDirective.ɵfac = function BlurClickDirective_Factory(t) { return new (t || BlurClickDirective)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ElementRef"])); };
+BlurClickDirective.ɵdir = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineDirective"]({ type: BlurClickDirective, selectors: [["", "appBlurClick", ""]], hostBindings: function BlurClickDirective_HostBindings(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("click", function BlurClickDirective_click_HostBindingHandler() { return ctx.onClick(); });
+ } } });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](BlurClickDirective, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Directive"],
+ args: [{
+ selector: '[appBlurClick]',
+ }]
+ }], function () { return [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["ElementRef"] }]; }, { onClick: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["HostListener"],
+ args: ['click']
+ }] }); })();
+
+
+/***/ }),
+
+/***/ "./jslib/angular/src/directives/box-row.directive.ts":
+/*!***********************************************************!*\
+ !*** ./jslib/angular/src/directives/box-row.directive.ts ***!
+ \***********************************************************/
+/*! exports provided: BoxRowDirective */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BoxRowDirective", function() { return BoxRowDirective; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+
+
+class BoxRowDirective {
+ constructor(elRef) {
+ this.elRef = elRef;
+ this.el = null;
+ this.el = elRef.nativeElement;
+ }
+ ngOnInit() {
+ this.formEls = Array.from(this.el.querySelectorAll('input:not([type="hidden"]), select, textarea'));
+ this.formEls.forEach(formEl => {
+ formEl.addEventListener('focus', (event) => {
+ this.el.classList.add('active');
+ }, false);
+ formEl.addEventListener('blur', (event) => {
+ this.el.classList.remove('active');
+ }, false);
+ });
+ }
+ onClick(event) {
+ const target = event.target;
+ if (target !== this.el && !target.classList.contains('progress') &&
+ !target.classList.contains('progress-bar')) {
+ return;
+ }
+ if (this.formEls.length > 0) {
+ const formEl = this.formEls[0];
+ if (formEl.tagName.toLowerCase() === 'input') {
+ const inputEl = formEl;
+ if (inputEl.type != null && inputEl.type.toLowerCase() === 'checkbox') {
+ inputEl.click();
+ return;
+ }
+ }
+ formEl.focus();
+ }
+ }
+}
+BoxRowDirective.ɵfac = function BoxRowDirective_Factory(t) { return new (t || BoxRowDirective)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ElementRef"])); };
+BoxRowDirective.ɵdir = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineDirective"]({ type: BoxRowDirective, selectors: [["", "appBoxRow", ""]], hostBindings: function BoxRowDirective_HostBindings(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("click", function BoxRowDirective_click_HostBindingHandler($event) { return ctx.onClick($event); });
+ } } });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](BoxRowDirective, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Directive"],
+ args: [{
+ selector: '[appBoxRow]',
+ }]
+ }], function () { return [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["ElementRef"] }]; }, { onClick: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["HostListener"],
+ args: ['click', ['$event']]
+ }] }); })();
+
+
+/***/ }),
+
+/***/ "./jslib/angular/src/directives/cipherListVirtualScroll.directive.ts":
+/*!***************************************************************************!*\
+ !*** ./jslib/angular/src/directives/cipherListVirtualScroll.directive.ts ***!
+ \***************************************************************************/
+/*! exports provided: CipherListVirtualScrollStrategy, _cipherListVirtualScrollStrategyFactory, CipherListVirtualScroll */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CipherListVirtualScrollStrategy", function() { return CipherListVirtualScrollStrategy; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_cipherListVirtualScrollStrategyFactory", function() { return _cipherListVirtualScrollStrategyFactory; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CipherListVirtualScroll", function() { return CipherListVirtualScroll; });
+/* harmony import */ var _angular_cdk_scrolling__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/cdk/scrolling */ "./node_modules/@angular/cdk/__ivy_ngcc__/fesm2015/scrolling.js");
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+
+
+
+// Custom virtual scroll strategy for cdk-virtual-scroll
+// Uses a sample list item to set the itemSize for FixedSizeVirtualScrollStrategy
+// The use case is the same as FixedSizeVirtualScrollStrategy, but it avoids locking in pixel sizes in the template.
+class CipherListVirtualScrollStrategy extends _angular_cdk_scrolling__WEBPACK_IMPORTED_MODULE_0__["FixedSizeVirtualScrollStrategy"] {
+ constructor(itemSize, minBufferPx, maxBufferPx, checkItemSizeCallback) {
+ super(itemSize, minBufferPx, maxBufferPx);
+ this.checkItemSizeCallback = checkItemSizeCallback;
+ }
+ onContentRendered() {
+ if (this.timeout != null) {
+ clearTimeout(this.timeout);
+ }
+ this.timeout = setTimeout(this.checkItemSizeCallback, 500);
+ }
+}
+function _cipherListVirtualScrollStrategyFactory(cipherListDir) {
+ return cipherListDir._scrollStrategy;
+}
+class CipherListVirtualScroll extends _angular_cdk_scrolling__WEBPACK_IMPORTED_MODULE_0__["CdkFixedSizeVirtualScroll"] {
+ constructor() {
+ super();
+ this.checkAndUpdateItemSize = () => {
+ const sampleItem = document.querySelector('cdk-virtual-scroll-viewport .virtual-scroll-item');
+ const newItemSize = sampleItem === null || sampleItem === void 0 ? void 0 : sampleItem.offsetHeight;
+ if (newItemSize != null && newItemSize !== this.itemSize) {
+ this.itemSize = newItemSize;
+ this._scrollStrategy.updateItemAndBufferSize(this.itemSize, this.minBufferPx, this.maxBufferPx);
+ }
+ };
+ this._scrollStrategy = new CipherListVirtualScrollStrategy(this.itemSize, this.minBufferPx, this.maxBufferPx, this.checkAndUpdateItemSize);
+ }
+}
+CipherListVirtualScroll.ɵfac = function CipherListVirtualScroll_Factory(t) { return new (t || CipherListVirtualScroll)(); };
+CipherListVirtualScroll.ɵdir = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdefineDirective"]({ type: CipherListVirtualScroll, selectors: [["cdk-virtual-scroll-viewport", "itemSize", ""]], features: [_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵProvidersFeature"]([{
+ provide: _angular_cdk_scrolling__WEBPACK_IMPORTED_MODULE_0__["VIRTUAL_SCROLL_STRATEGY"],
+ useFactory: _cipherListVirtualScrollStrategyFactory,
+ deps: [Object(_angular_core__WEBPACK_IMPORTED_MODULE_1__["forwardRef"])(() => CipherListVirtualScroll)],
+ }]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵInheritDefinitionFeature"]] });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵsetClassMetadata"](CipherListVirtualScroll, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Directive"],
+ args: [{
+ selector: 'cdk-virtual-scroll-viewport[itemSize]',
+ providers: [{
+ provide: _angular_cdk_scrolling__WEBPACK_IMPORTED_MODULE_0__["VIRTUAL_SCROLL_STRATEGY"],
+ useFactory: _cipherListVirtualScrollStrategyFactory,
+ deps: [Object(_angular_core__WEBPACK_IMPORTED_MODULE_1__["forwardRef"])(() => CipherListVirtualScroll)],
+ }],
+ }]
+ }], function () { return []; }, null); })();
+
+
+/***/ }),
+
+/***/ "./jslib/angular/src/directives/fallback-src.directive.ts":
+/*!****************************************************************!*\
+ !*** ./jslib/angular/src/directives/fallback-src.directive.ts ***!
+ \****************************************************************/
+/*! exports provided: FallbackSrcDirective */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FallbackSrcDirective", function() { return FallbackSrcDirective; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+
+
+class FallbackSrcDirective {
+ constructor(el) {
+ this.el = el;
+ }
+ onError() {
+ this.el.nativeElement.src = this.appFallbackSrc;
+ }
+}
+FallbackSrcDirective.ɵfac = function FallbackSrcDirective_Factory(t) { return new (t || FallbackSrcDirective)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ElementRef"])); };
+FallbackSrcDirective.ɵdir = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineDirective"]({ type: FallbackSrcDirective, selectors: [["", "appFallbackSrc", ""]], hostBindings: function FallbackSrcDirective_HostBindings(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("error", function FallbackSrcDirective_error_HostBindingHandler() { return ctx.onError(); });
+ } }, inputs: { appFallbackSrc: "appFallbackSrc" } });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](FallbackSrcDirective, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Directive"],
+ args: [{
+ selector: '[appFallbackSrc]',
+ }]
+ }], function () { return [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["ElementRef"] }]; }, { appFallbackSrc: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"],
+ args: ['appFallbackSrc']
+ }], onError: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["HostListener"],
+ args: ['error']
+ }] }); })();
+
+
+/***/ }),
+
+/***/ "./jslib/angular/src/directives/input-verbatim.directive.ts":
+/*!******************************************************************!*\
+ !*** ./jslib/angular/src/directives/input-verbatim.directive.ts ***!
+ \******************************************************************/
+/*! exports provided: InputVerbatimDirective */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "InputVerbatimDirective", function() { return InputVerbatimDirective; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+
+
+class InputVerbatimDirective {
+ constructor(el, renderer) {
+ this.el = el;
+ this.renderer = renderer;
+ }
+ set appInputVerbatim(condition) {
+ this.disableComplete = condition === '' || condition === true;
+ }
+ ngOnInit() {
+ if (this.disableComplete && !this.el.nativeElement.hasAttribute('autocomplete')) {
+ this.renderer.setAttribute(this.el.nativeElement, 'autocomplete', 'off');
+ }
+ if (!this.el.nativeElement.hasAttribute('autocapitalize')) {
+ this.renderer.setAttribute(this.el.nativeElement, 'autocapitalize', 'none');
+ }
+ if (!this.el.nativeElement.hasAttribute('autocorrect')) {
+ this.renderer.setAttribute(this.el.nativeElement, 'autocorrect', 'none');
+ }
+ if (!this.el.nativeElement.hasAttribute('spellcheck')) {
+ this.renderer.setAttribute(this.el.nativeElement, 'spellcheck', 'false');
+ }
+ if (!this.el.nativeElement.hasAttribute('inputmode')) {
+ this.renderer.setAttribute(this.el.nativeElement, 'inputmode', 'verbatim');
+ }
+ }
+}
+InputVerbatimDirective.ɵfac = function InputVerbatimDirective_Factory(t) { return new (t || InputVerbatimDirective)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ElementRef"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["Renderer2"])); };
+InputVerbatimDirective.ɵdir = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineDirective"]({ type: InputVerbatimDirective, selectors: [["", "appInputVerbatim", ""]], inputs: { appInputVerbatim: "appInputVerbatim" } });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](InputVerbatimDirective, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Directive"],
+ args: [{
+ selector: '[appInputVerbatim]',
+ }]
+ }], function () { return [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["ElementRef"] }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Renderer2"] }]; }, { appInputVerbatim: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"]
+ }] }); })();
+
+
+/***/ }),
+
+/***/ "./jslib/angular/src/directives/select-copy.directive.ts":
+/*!***************************************************************!*\
+ !*** ./jslib/angular/src/directives/select-copy.directive.ts ***!
+ \***************************************************************/
+/*! exports provided: SelectCopyDirective */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SelectCopyDirective", function() { return SelectCopyDirective; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! jslib-common/abstractions/platformUtils.service */ "./jslib/common/src/abstractions/platformUtils.service.ts");
+
+
+
+
+class SelectCopyDirective {
+ constructor(el, platformUtilsService) {
+ this.el = el;
+ this.platformUtilsService = platformUtilsService;
+ }
+ onCopy() {
+ if (window == null) {
+ return;
+ }
+ let copyText = '';
+ const selection = window.getSelection();
+ for (let i = 0; i < selection.rangeCount; i++) {
+ const range = selection.getRangeAt(i);
+ const text = range.toString();
+ // The selection should only contain one line of text. In some cases however, the
+ // selection contains newlines and space characters from the indentation of following
+ // sibling nodes. To avoid copying passwords containing trailing newlines and spaces
+ // that aren't part of the password, the selection has to be trimmed.
+ let stringEndPos = text.length;
+ const newLinePos = text.search(/(?:\r\n|\r|\n)/);
+ if (newLinePos > -1) {
+ const otherPart = text.substr(newLinePos).trim();
+ if (otherPart === '') {
+ stringEndPos = newLinePos;
+ }
+ }
+ copyText += text.substring(0, stringEndPos);
+ }
+ this.platformUtilsService.copyToClipboard(copyText, { window: window });
+ }
+}
+SelectCopyDirective.ɵfac = function SelectCopyDirective_Factory(t) { return new (t || SelectCopyDirective)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ElementRef"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_1__["PlatformUtilsService"])); };
+SelectCopyDirective.ɵdir = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineDirective"]({ type: SelectCopyDirective, selectors: [["", "appSelectCopy", ""]], hostBindings: function SelectCopyDirective_HostBindings(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("copy", function SelectCopyDirective_copy_HostBindingHandler() { return ctx.onCopy(); });
+ } } });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](SelectCopyDirective, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Directive"],
+ args: [{
+ selector: '[appSelectCopy]',
+ }]
+ }], function () { return [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["ElementRef"] }, { type: jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_1__["PlatformUtilsService"] }]; }, { onCopy: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["HostListener"],
+ args: ['copy']
+ }] }); })();
+
+
+/***/ }),
+
+/***/ "./jslib/angular/src/directives/stop-click.directive.ts":
+/*!**************************************************************!*\
+ !*** ./jslib/angular/src/directives/stop-click.directive.ts ***!
+ \**************************************************************/
+/*! exports provided: StopClickDirective */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "StopClickDirective", function() { return StopClickDirective; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+
+
+class StopClickDirective {
+ onClick($event) {
+ $event.preventDefault();
+ }
+}
+StopClickDirective.ɵfac = function StopClickDirective_Factory(t) { return new (t || StopClickDirective)(); };
+StopClickDirective.ɵdir = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineDirective"]({ type: StopClickDirective, selectors: [["", "appStopClick", ""]], hostBindings: function StopClickDirective_HostBindings(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("click", function StopClickDirective_click_HostBindingHandler($event) { return ctx.onClick($event); });
+ } } });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](StopClickDirective, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Directive"],
+ args: [{
+ selector: '[appStopClick]',
+ }]
+ }], null, { onClick: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["HostListener"],
+ args: ['click', ['$event']]
+ }] }); })();
+
+
+/***/ }),
+
+/***/ "./jslib/angular/src/directives/stop-prop.directive.ts":
+/*!*************************************************************!*\
+ !*** ./jslib/angular/src/directives/stop-prop.directive.ts ***!
+ \*************************************************************/
+/*! exports provided: StopPropDirective */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "StopPropDirective", function() { return StopPropDirective; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+
+
+class StopPropDirective {
+ onClick($event) {
+ $event.stopPropagation();
+ }
+}
+StopPropDirective.ɵfac = function StopPropDirective_Factory(t) { return new (t || StopPropDirective)(); };
+StopPropDirective.ɵdir = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineDirective"]({ type: StopPropDirective, selectors: [["", "appStopProp", ""]], hostBindings: function StopPropDirective_HostBindings(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("click", function StopPropDirective_click_HostBindingHandler($event) { return ctx.onClick($event); });
+ } } });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](StopPropDirective, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Directive"],
+ args: [{
+ selector: '[appStopProp]',
+ }]
+ }], null, { onClick: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["HostListener"],
+ args: ['click', ['$event']]
+ }] }); })();
+
+
+/***/ }),
+
+/***/ "./jslib/angular/src/directives/true-false-value.directive.ts":
+/*!********************************************************************!*\
+ !*** ./jslib/angular/src/directives/true-false-value.directive.ts ***!
+ \********************************************************************/
+/*! exports provided: TrueFalseValueDirective */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TrueFalseValueDirective", function() { return TrueFalseValueDirective; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var _angular_forms__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @angular/forms */ "./node_modules/@angular/forms/__ivy_ngcc__/fesm2015/forms.js");
+
+
+
+// ref: https://juristr.com/blog/2018/02/ng-true-value-directive/
+class TrueFalseValueDirective {
+ constructor(elementRef, renderer) {
+ this.elementRef = elementRef;
+ this.renderer = renderer;
+ this.trueValue = true;
+ this.falseValue = false;
+ this.propagateChange = (_) => { };
+ }
+ onHostChange(ev) {
+ this.propagateChange(ev.target.checked ? this.trueValue : this.falseValue);
+ }
+ writeValue(obj) {
+ if (obj === this.trueValue) {
+ this.renderer.setProperty(this.elementRef.nativeElement, 'checked', true);
+ }
+ else {
+ this.renderer.setProperty(this.elementRef.nativeElement, 'checked', false);
+ }
+ }
+ registerOnChange(fn) {
+ this.propagateChange = fn;
+ }
+ registerOnTouched(fn) { }
+ setDisabledState(isDisabled) { }
+}
+TrueFalseValueDirective.ɵfac = function TrueFalseValueDirective_Factory(t) { return new (t || TrueFalseValueDirective)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ElementRef"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["Renderer2"])); };
+TrueFalseValueDirective.ɵdir = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineDirective"]({ type: TrueFalseValueDirective, selectors: [["input", "type", "checkbox", "appTrueFalseValue", ""]], hostBindings: function TrueFalseValueDirective_HostBindings(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("change", function TrueFalseValueDirective_change_HostBindingHandler($event) { return ctx.onHostChange($event); });
+ } }, inputs: { trueValue: "trueValue", falseValue: "falseValue" }, features: [_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵProvidersFeature"]([
+ {
+ provide: _angular_forms__WEBPACK_IMPORTED_MODULE_1__["NG_VALUE_ACCESSOR"],
+ useExisting: Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["forwardRef"])(() => TrueFalseValueDirective),
+ multi: true,
+ },
+ ])] });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](TrueFalseValueDirective, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Directive"],
+ args: [{
+ selector: 'input[type=checkbox][appTrueFalseValue]',
+ providers: [
+ {
+ provide: _angular_forms__WEBPACK_IMPORTED_MODULE_1__["NG_VALUE_ACCESSOR"],
+ useExisting: Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["forwardRef"])(() => TrueFalseValueDirective),
+ multi: true,
+ },
+ ],
+ }]
+ }], function () { return [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["ElementRef"] }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Renderer2"] }]; }, { trueValue: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"]
+ }], falseValue: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"]
+ }], onHostChange: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["HostListener"],
+ args: ['change', ['$event']]
+ }] }); })();
+
+
+/***/ }),
+
+/***/ "./jslib/angular/src/pipes/color-password.pipe.ts":
+/*!********************************************************!*\
+ !*** ./jslib/angular/src/pipes/color-password.pipe.ts ***!
+ \********************************************************/
+/*! exports provided: ColorPasswordPipe */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ColorPasswordPipe", function() { return ColorPasswordPipe; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var jslib_common_misc_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! jslib-common/misc/utils */ "./jslib/common/src/misc/utils.ts");
+
+
+
+/*
+ An updated pipe that sanitizes HTML, highlights numbers and special characters (in different colors each)
+ and handles Unicode / Emoji characters correctly.
+*/
+class ColorPasswordPipe {
+ transform(password) {
+ // Convert to an array to handle cases that stings have special characters, ie: emoji.
+ const passwordArray = Array.from(password);
+ let colorizedPassword = '';
+ for (let i = 0; i < passwordArray.length; i++) {
+ let character = passwordArray[i];
+ let isSpecial = false;
+ // Sanitize HTML first.
+ switch (character) {
+ case '&':
+ character = '&';
+ isSpecial = true;
+ break;
+ case '<':
+ character = '<';
+ isSpecial = true;
+ break;
+ case '>':
+ character = '>';
+ isSpecial = true;
+ break;
+ case ' ':
+ character = ' ';
+ isSpecial = true;
+ break;
+ default:
+ break;
+ }
+ let type = 'letter';
+ if (character.match(jslib_common_misc_utils__WEBPACK_IMPORTED_MODULE_1__["Utils"].regexpEmojiPresentation)) {
+ type = 'emoji';
+ }
+ else if (isSpecial || character.match(/[^\w ]/)) {
+ type = 'special';
+ }
+ else if (character.match(/\d/)) {
+ type = 'number';
+ }
+ colorizedPassword += '' + character + '';
+ }
+ return colorizedPassword;
+ }
+}
+ColorPasswordPipe.ɵfac = function ColorPasswordPipe_Factory(t) { return new (t || ColorPasswordPipe)(); };
+ColorPasswordPipe.ɵpipe = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefinePipe"]({ name: "colorPassword", type: ColorPasswordPipe, pure: true });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](ColorPasswordPipe, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Pipe"],
+ args: [{ name: 'colorPassword' }]
+ }], null, null); })();
+
+
+/***/ }),
+
+/***/ "./jslib/angular/src/pipes/i18n.pipe.ts":
+/*!**********************************************!*\
+ !*** ./jslib/angular/src/pipes/i18n.pipe.ts ***!
+ \**********************************************/
+/*! exports provided: I18nPipe */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "I18nPipe", function() { return I18nPipe; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! jslib-common/abstractions/i18n.service */ "./jslib/common/src/abstractions/i18n.service.ts");
+
+
+
+
+class I18nPipe {
+ constructor(i18nService) {
+ this.i18nService = i18nService;
+ }
+ transform(id, p1, p2, p3) {
+ return this.i18nService.t(id, p1, p2, p3);
+ }
+}
+I18nPipe.ɵfac = function I18nPipe_Factory(t) { return new (t || I18nPipe)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_1__["I18nService"])); };
+I18nPipe.ɵpipe = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefinePipe"]({ name: "i18n", type: I18nPipe, pure: true });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](I18nPipe, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Pipe"],
+ args: [{
+ name: 'i18n',
+ }]
+ }], function () { return [{ type: jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_1__["I18nService"] }]; }, null); })();
+
+
+/***/ }),
+
+/***/ "./jslib/angular/src/pipes/search-ciphers.pipe.ts":
+/*!********************************************************!*\
+ !*** ./jslib/angular/src/pipes/search-ciphers.pipe.ts ***!
+ \********************************************************/
+/*! exports provided: SearchCiphersPipe */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SearchCiphersPipe", function() { return SearchCiphersPipe; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+
+
+class SearchCiphersPipe {
+ transform(ciphers, searchText, deleted = false) {
+ if (ciphers == null || ciphers.length === 0) {
+ return [];
+ }
+ if (searchText == null || searchText.length < 2) {
+ return ciphers.filter(c => {
+ return deleted !== c.isDeleted;
+ });
+ }
+ searchText = searchText.trim().toLowerCase();
+ return ciphers.filter(c => {
+ if (deleted !== c.isDeleted) {
+ return false;
+ }
+ if (c.name != null && c.name.toLowerCase().indexOf(searchText) > -1) {
+ return true;
+ }
+ if (searchText.length >= 8 && c.id.startsWith(searchText)) {
+ return true;
+ }
+ if (c.subTitle != null && c.subTitle.toLowerCase().indexOf(searchText) > -1) {
+ return true;
+ }
+ if (c.login && c.login.uri != null && c.login.uri.toLowerCase().indexOf(searchText) > -1) {
+ return true;
+ }
+ return false;
+ });
+ }
+}
+SearchCiphersPipe.ɵfac = function SearchCiphersPipe_Factory(t) { return new (t || SearchCiphersPipe)(); };
+SearchCiphersPipe.ɵpipe = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefinePipe"]({ name: "searchCiphers", type: SearchCiphersPipe, pure: true });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](SearchCiphersPipe, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Pipe"],
+ args: [{
+ name: 'searchCiphers',
+ }]
+ }], null, null); })();
+
+
+/***/ }),
+
+/***/ "./jslib/angular/src/services/auth-guard.service.ts":
+/*!**********************************************************!*\
+ !*** ./jslib/angular/src/services/auth-guard.service.ts ***!
+ \**********************************************************/
+/*! exports provided: AuthGuardService */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AuthGuardService", function() { return AuthGuardService; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var _angular_router__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @angular/router */ "./node_modules/@angular/router/__ivy_ngcc__/fesm2015/router.js");
+/* harmony import */ var jslib_common_abstractions_messaging_service__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! jslib-common/abstractions/messaging.service */ "./jslib/common/src/abstractions/messaging.service.ts");
+/* harmony import */ var jslib_common_abstractions_user_service__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! jslib-common/abstractions/user.service */ "./jslib/common/src/abstractions/user.service.ts");
+/* harmony import */ var jslib_common_abstractions_vaultTimeout_service__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! jslib-common/abstractions/vaultTimeout.service */ "./jslib/common/src/abstractions/vaultTimeout.service.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+
+
+
+
+
+
+
+
+class AuthGuardService {
+ constructor(vaultTimeoutService, userService, router, messagingService) {
+ this.vaultTimeoutService = vaultTimeoutService;
+ this.userService = userService;
+ this.router = router;
+ this.messagingService = messagingService;
+ }
+ canActivate(route, routerState) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const isAuthed = yield this.userService.isAuthenticated();
+ if (!isAuthed) {
+ this.messagingService.send('authBlocked');
+ return false;
+ }
+ const locked = yield this.vaultTimeoutService.isLocked();
+ if (locked) {
+ if (routerState != null) {
+ this.messagingService.send('lockedUrl', { url: routerState.url });
+ }
+ this.router.navigate(['lock'], { queryParams: { promptBiometric: true } });
+ return false;
+ }
+ return true;
+ });
+ }
+}
+AuthGuardService.ɵfac = function AuthGuardService_Factory(t) { return new (t || AuthGuardService)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵinject"](jslib_common_abstractions_vaultTimeout_service__WEBPACK_IMPORTED_MODULE_4__["VaultTimeoutService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵinject"](jslib_common_abstractions_user_service__WEBPACK_IMPORTED_MODULE_3__["UserService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵinject"](_angular_router__WEBPACK_IMPORTED_MODULE_1__["Router"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵinject"](jslib_common_abstractions_messaging_service__WEBPACK_IMPORTED_MODULE_2__["MessagingService"])); };
+AuthGuardService.ɵprov = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineInjectable"]({ token: AuthGuardService, factory: AuthGuardService.ɵfac });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](AuthGuardService, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Injectable"]
+ }], function () { return [{ type: jslib_common_abstractions_vaultTimeout_service__WEBPACK_IMPORTED_MODULE_4__["VaultTimeoutService"] }, { type: jslib_common_abstractions_user_service__WEBPACK_IMPORTED_MODULE_3__["UserService"] }, { type: _angular_router__WEBPACK_IMPORTED_MODULE_1__["Router"] }, { type: jslib_common_abstractions_messaging_service__WEBPACK_IMPORTED_MODULE_2__["MessagingService"] }]; }, null); })();
+
+
+/***/ }),
+
+/***/ "./jslib/angular/src/services/broadcaster.service.ts":
+/*!***********************************************************!*\
+ !*** ./jslib/angular/src/services/broadcaster.service.ts ***!
+ \***********************************************************/
+/*! exports provided: BroadcasterService */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BroadcasterService", function() { return BroadcasterService; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var jslib_common_services_broadcaster_service__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! jslib-common/services/broadcaster.service */ "./jslib/common/src/services/broadcaster.service.ts");
+
+
+
+class BroadcasterService extends jslib_common_services_broadcaster_service__WEBPACK_IMPORTED_MODULE_1__["BroadcasterService"] {
+}
+BroadcasterService.ɵfac = function BroadcasterService_Factory(t) { return ɵBroadcasterService_BaseFactory(t || BroadcasterService); };
+BroadcasterService.ɵprov = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineInjectable"]({ token: BroadcasterService, factory: BroadcasterService.ɵfac });
+const ɵBroadcasterService_BaseFactory = /*@__PURE__*/ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵgetInheritedFactory"](BroadcasterService);
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](BroadcasterService, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Injectable"]
+ }], null, null); })();
+
+
+/***/ }),
+
+/***/ "./jslib/angular/src/services/lock-guard.service.ts":
+/*!**********************************************************!*\
+ !*** ./jslib/angular/src/services/lock-guard.service.ts ***!
+ \**********************************************************/
+/*! exports provided: LockGuardService */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LockGuardService", function() { return LockGuardService; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var _angular_router__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @angular/router */ "./node_modules/@angular/router/__ivy_ngcc__/fesm2015/router.js");
+/* harmony import */ var jslib_common_abstractions_user_service__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! jslib-common/abstractions/user.service */ "./jslib/common/src/abstractions/user.service.ts");
+/* harmony import */ var jslib_common_abstractions_vaultTimeout_service__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! jslib-common/abstractions/vaultTimeout.service */ "./jslib/common/src/abstractions/vaultTimeout.service.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+
+
+
+
+
+
+class LockGuardService {
+ constructor(vaultTimeoutService, userService, router) {
+ this.vaultTimeoutService = vaultTimeoutService;
+ this.userService = userService;
+ this.router = router;
+ this.homepage = 'vault';
+ }
+ canActivate() {
+ return __awaiter(this, void 0, void 0, function* () {
+ const isAuthed = yield this.userService.isAuthenticated();
+ if (isAuthed) {
+ const locked = yield this.vaultTimeoutService.isLocked();
+ if (locked) {
+ return true;
+ }
+ else {
+ this.router.navigate([this.homepage]);
+ return false;
+ }
+ }
+ this.router.navigate(['']);
+ return false;
+ });
+ }
+}
+LockGuardService.ɵfac = function LockGuardService_Factory(t) { return new (t || LockGuardService)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵinject"](jslib_common_abstractions_vaultTimeout_service__WEBPACK_IMPORTED_MODULE_3__["VaultTimeoutService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵinject"](jslib_common_abstractions_user_service__WEBPACK_IMPORTED_MODULE_2__["UserService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵinject"](_angular_router__WEBPACK_IMPORTED_MODULE_1__["Router"])); };
+LockGuardService.ɵprov = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineInjectable"]({ token: LockGuardService, factory: LockGuardService.ɵfac });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](LockGuardService, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Injectable"]
+ }], function () { return [{ type: jslib_common_abstractions_vaultTimeout_service__WEBPACK_IMPORTED_MODULE_3__["VaultTimeoutService"] }, { type: jslib_common_abstractions_user_service__WEBPACK_IMPORTED_MODULE_2__["UserService"] }, { type: _angular_router__WEBPACK_IMPORTED_MODULE_1__["Router"] }]; }, null); })();
+
+
+/***/ }),
+
+/***/ "./jslib/angular/src/services/modal.service.ts":
+/*!*****************************************************!*\
+ !*** ./jslib/angular/src/services/modal.service.ts ***!
+ \*****************************************************/
+/*! exports provided: ModalConfig, ModalService */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ModalConfig", function() { return ModalConfig; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ModalService", function() { return ModalService; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var rxjs_operators__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! rxjs/operators */ "./node_modules/rxjs/_esm5/operators/index.js");
+/* harmony import */ var _components_modal_dynamic_modal_component__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../components/modal/dynamic-modal.component */ "./jslib/angular/src/components/modal/dynamic-modal.component.ts");
+/* harmony import */ var _components_modal_modal_injector__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../components/modal/modal-injector */ "./jslib/angular/src/components/modal/modal-injector.ts");
+/* harmony import */ var _components_modal_modal_ref__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../components/modal/modal.ref */ "./jslib/angular/src/components/modal/modal.ref.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+
+
+
+
+class ModalConfig {
+ constructor() {
+ this.allowMultipleModals = false;
+ }
+}
+class ModalService {
+ constructor(componentFactoryResolver, applicationRef, injector) {
+ this.componentFactoryResolver = componentFactoryResolver;
+ this.applicationRef = applicationRef;
+ this.injector = injector;
+ this.modalList = [];
+ // Lazy loaded modules are not available in componentFactoryResolver,
+ // therefore modules needs to manually initialize their resolvers.
+ this.factoryResolvers = new Map();
+ document.addEventListener('keyup', event => {
+ if (event.key === 'Escape' && this.modalCount > 0) {
+ this.topModal.instance.close();
+ }
+ });
+ }
+ get modalCount() {
+ return this.modalList.length;
+ }
+ get topModal() {
+ return this.modalList[this.modalCount - 1];
+ }
+ openViewRef(componentType, viewContainerRef, setComponentParameters = null) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const [modalRef, modalComponentRef] = this.openInternal(componentType, null, false);
+ modalComponentRef.instance.setComponentParameters = setComponentParameters;
+ viewContainerRef.insert(modalComponentRef.hostView);
+ yield modalRef.onCreated.pipe(Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_1__["first"])()).toPromise();
+ return [modalRef, modalComponentRef.instance.componentRef.instance];
+ });
+ }
+ open(componentType, config) {
+ var _a;
+ if (!((_a = config === null || config === void 0 ? void 0 : config.allowMultipleModals) !== null && _a !== void 0 ? _a : false) && this.modalCount > 0) {
+ return;
+ }
+ const [modalRef, _] = this.openInternal(componentType, config, true);
+ return modalRef;
+ }
+ registerComponentFactoryResolver(componentType, componentFactoryResolver) {
+ this.factoryResolvers.set(componentType, componentFactoryResolver);
+ }
+ resolveComponentFactory(componentType) {
+ if (this.factoryResolvers.has(componentType)) {
+ return this.factoryResolvers.get(componentType).resolveComponentFactory(componentType);
+ }
+ return this.componentFactoryResolver.resolveComponentFactory(componentType);
+ }
+ openInternal(componentType, config, attachToDom) {
+ const [modalRef, componentRef] = this.createModalComponent(config);
+ componentRef.instance.childComponentType = componentType;
+ if (attachToDom) {
+ this.applicationRef.attachView(componentRef.hostView);
+ const domElem = componentRef.hostView.rootNodes[0];
+ document.body.appendChild(domElem);
+ }
+ modalRef.onClosed.pipe(Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_1__["first"])()).subscribe(() => {
+ if (attachToDom) {
+ this.applicationRef.detachView(componentRef.hostView);
+ }
+ componentRef.destroy();
+ this.modalList.pop();
+ if (this.modalCount > 0) {
+ this.topModal.instance.getFocus();
+ }
+ });
+ this.setupHandlers(modalRef);
+ this.modalList.push(componentRef);
+ return [modalRef, componentRef];
+ }
+ setupHandlers(modalRef) {
+ let backdrop = null;
+ // Add backdrop, setup [data-dismiss] handler.
+ modalRef.onCreated.pipe(Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_1__["first"])()).subscribe(el => {
+ document.body.classList.add('modal-open');
+ const modalEl = el.querySelector('.modal');
+ const dialogEl = modalEl.querySelector('.modal-dialog');
+ backdrop = document.createElement('div');
+ backdrop.className = 'modal-backdrop fade';
+ backdrop.style.zIndex = `${this.modalCount}040`;
+ modalEl.prepend(backdrop);
+ dialogEl.addEventListener('click', (e) => {
+ e.stopPropagation();
+ });
+ dialogEl.style.zIndex = `${this.modalCount}050`;
+ const modals = Array.from(el.querySelectorAll('.modal-backdrop, .modal *[data-dismiss="modal"]'));
+ for (const closeElement of modals) {
+ closeElement.addEventListener('click', event => {
+ modalRef.close();
+ });
+ }
+ });
+ // onClose is used in Web to hook into bootstrap. On other projects we pipe it directly to closed.
+ modalRef.onClose.pipe(Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_1__["first"])()).subscribe(() => {
+ modalRef.closed();
+ if (this.modalCount === 0) {
+ document.body.classList.remove('modal-open');
+ }
+ });
+ }
+ createModalComponent(config) {
+ const modalRef = new _components_modal_modal_ref__WEBPACK_IMPORTED_MODULE_4__["ModalRef"]();
+ const map = new WeakMap();
+ map.set(ModalConfig, config);
+ map.set(_components_modal_modal_ref__WEBPACK_IMPORTED_MODULE_4__["ModalRef"], modalRef);
+ const componentFactory = this.componentFactoryResolver.resolveComponentFactory(_components_modal_dynamic_modal_component__WEBPACK_IMPORTED_MODULE_2__["DynamicModalComponent"]);
+ const componentRef = componentFactory.create(new _components_modal_modal_injector__WEBPACK_IMPORTED_MODULE_3__["ModalInjector"](this.injector, map));
+ return [modalRef, componentRef];
+ }
+}
+ModalService.ɵfac = function ModalService_Factory(t) { return new (t || ModalService)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵinject"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ComponentFactoryResolver"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵinject"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ApplicationRef"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵinject"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["Injector"])); };
+ModalService.ɵprov = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineInjectable"]({ token: ModalService, factory: ModalService.ɵfac });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](ModalService, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Injectable"]
+ }], function () { return [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["ComponentFactoryResolver"] }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["ApplicationRef"] }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Injector"] }]; }, null); })();
+
+
+/***/ }),
+
+/***/ "./jslib/angular/src/services/passwordReprompt.service.ts":
+/*!****************************************************************!*\
+ !*** ./jslib/angular/src/services/passwordReprompt.service.ts ***!
+ \****************************************************************/
+/*! exports provided: PasswordRepromptService */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PasswordRepromptService", function() { return PasswordRepromptService; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var _components_password_reprompt_component__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../components/password-reprompt.component */ "./jslib/angular/src/components/password-reprompt.component.ts");
+/* harmony import */ var _modal_service__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./modal.service */ "./jslib/angular/src/services/modal.service.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+
+
+
+class PasswordRepromptService {
+ constructor(modalService) {
+ this.modalService = modalService;
+ this.component = _components_password_reprompt_component__WEBPACK_IMPORTED_MODULE_1__["PasswordRepromptComponent"];
+ }
+ protectedFields() {
+ return ['TOTP', 'Password', 'H_Field', 'Card Number', 'Security Code'];
+ }
+ showPasswordPrompt() {
+ return __awaiter(this, void 0, void 0, function* () {
+ const ref = this.modalService.open(this.component, { allowMultipleModals: true });
+ if (ref == null) {
+ return false;
+ }
+ const result = yield ref.onClosedPromise();
+ return result === true;
+ });
+ }
+}
+PasswordRepromptService.ɵfac = function PasswordRepromptService_Factory(t) { return new (t || PasswordRepromptService)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵinject"](_modal_service__WEBPACK_IMPORTED_MODULE_2__["ModalService"])); };
+PasswordRepromptService.ɵprov = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineInjectable"]({ token: PasswordRepromptService, factory: PasswordRepromptService.ɵfac });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](PasswordRepromptService, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Injectable"]
+ }], function () { return [{ type: _modal_service__WEBPACK_IMPORTED_MODULE_2__["ModalService"] }]; }, null); })();
+
+
+/***/ }),
+
+/***/ "./jslib/angular/src/services/unauth-guard.service.ts":
+/*!************************************************************!*\
+ !*** ./jslib/angular/src/services/unauth-guard.service.ts ***!
+ \************************************************************/
+/*! exports provided: UnauthGuardService */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "UnauthGuardService", function() { return UnauthGuardService; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var _angular_router__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @angular/router */ "./node_modules/@angular/router/__ivy_ngcc__/fesm2015/router.js");
+/* harmony import */ var jslib_common_abstractions_user_service__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! jslib-common/abstractions/user.service */ "./jslib/common/src/abstractions/user.service.ts");
+/* harmony import */ var jslib_common_abstractions_vaultTimeout_service__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! jslib-common/abstractions/vaultTimeout.service */ "./jslib/common/src/abstractions/vaultTimeout.service.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+
+
+
+
+
+
+class UnauthGuardService {
+ constructor(vaultTimeoutService, userService, router) {
+ this.vaultTimeoutService = vaultTimeoutService;
+ this.userService = userService;
+ this.router = router;
+ this.homepage = 'vault';
+ }
+ canActivate() {
+ return __awaiter(this, void 0, void 0, function* () {
+ const isAuthed = yield this.userService.isAuthenticated();
+ if (isAuthed) {
+ const locked = yield this.vaultTimeoutService.isLocked();
+ if (locked) {
+ this.router.navigate(['lock']);
+ }
+ else {
+ this.router.navigate([this.homepage]);
+ }
+ return false;
+ }
+ return true;
+ });
+ }
+}
+UnauthGuardService.ɵfac = function UnauthGuardService_Factory(t) { return new (t || UnauthGuardService)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵinject"](jslib_common_abstractions_vaultTimeout_service__WEBPACK_IMPORTED_MODULE_3__["VaultTimeoutService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵinject"](jslib_common_abstractions_user_service__WEBPACK_IMPORTED_MODULE_2__["UserService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵinject"](_angular_router__WEBPACK_IMPORTED_MODULE_1__["Router"])); };
+UnauthGuardService.ɵprov = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineInjectable"]({ token: UnauthGuardService, factory: UnauthGuardService.ɵfac });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](UnauthGuardService, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Injectable"]
+ }], function () { return [{ type: jslib_common_abstractions_vaultTimeout_service__WEBPACK_IMPORTED_MODULE_3__["VaultTimeoutService"] }, { type: jslib_common_abstractions_user_service__WEBPACK_IMPORTED_MODULE_2__["UserService"] }, { type: _angular_router__WEBPACK_IMPORTED_MODULE_1__["Router"] }]; }, null); })();
+
+
+/***/ }),
+
+/***/ "./jslib/angular/src/services/validation.service.ts":
+/*!**********************************************************!*\
+ !*** ./jslib/angular/src/services/validation.service.ts ***!
+ \**********************************************************/
+/*! exports provided: ValidationService */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ValidationService", function() { return ValidationService; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! jslib-common/abstractions/i18n.service */ "./jslib/common/src/abstractions/i18n.service.ts");
+/* harmony import */ var jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! jslib-common/abstractions/platformUtils.service */ "./jslib/common/src/abstractions/platformUtils.service.ts");
+
+
+
+
+
+
+class ValidationService {
+ constructor(i18nService, platformUtilsService) {
+ this.i18nService = i18nService;
+ this.platformUtilsService = platformUtilsService;
+ }
+ showError(data) {
+ const defaultErrorMessage = this.i18nService.t('unexpectedError');
+ let errors = [];
+ if (data != null && typeof data === 'string') {
+ errors.push(data);
+ }
+ else if (data == null || typeof data !== 'object') {
+ errors.push(defaultErrorMessage);
+ }
+ else if (data.validationErrors != null) {
+ errors = errors.concat(data.getAllMessages());
+ }
+ else {
+ errors.push(data.message ? data.message : defaultErrorMessage);
+ }
+ if (errors.length === 1) {
+ this.platformUtilsService.showToast('error', this.i18nService.t('errorOccurred'), errors[0]);
+ }
+ else if (errors.length > 1) {
+ this.platformUtilsService.showToast('error', this.i18nService.t('errorOccurred'), errors, {
+ timeout: 5000 * errors.length,
+ });
+ }
+ return errors;
+ }
+}
+ValidationService.ɵfac = function ValidationService_Factory(t) { return new (t || ValidationService)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵinject"](jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_1__["I18nService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵinject"](jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_2__["PlatformUtilsService"])); };
+ValidationService.ɵprov = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineInjectable"]({ token: ValidationService, factory: ValidationService.ɵfac });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](ValidationService, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Injectable"]
+ }], function () { return [{ type: jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_1__["I18nService"] }, { type: jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_2__["PlatformUtilsService"] }]; }, null); })();
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/abstractions/api.service.ts":
+/*!******************************************************!*\
+ !*** ./jslib/common/src/abstractions/api.service.ts ***!
+ \******************************************************/
+/*! exports provided: ApiService */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ApiService", function() { return ApiService; });
+class ApiService {
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/abstractions/appId.service.ts":
+/*!********************************************************!*\
+ !*** ./jslib/common/src/abstractions/appId.service.ts ***!
+ \********************************************************/
+/*! exports provided: AppIdService */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AppIdService", function() { return AppIdService; });
+class AppIdService {
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/abstractions/audit.service.ts":
+/*!********************************************************!*\
+ !*** ./jslib/common/src/abstractions/audit.service.ts ***!
+ \********************************************************/
+/*! exports provided: AuditService */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AuditService", function() { return AuditService; });
+class AuditService {
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/abstractions/auth.service.ts":
+/*!*******************************************************!*\
+ !*** ./jslib/common/src/abstractions/auth.service.ts ***!
+ \*******************************************************/
+/*! exports provided: AuthService */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AuthService", function() { return AuthService; });
+class AuthService {
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/abstractions/broadcaster.service.ts":
+/*!**************************************************************!*\
+ !*** ./jslib/common/src/abstractions/broadcaster.service.ts ***!
+ \**************************************************************/
+/*! exports provided: BroadcasterService */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BroadcasterService", function() { return BroadcasterService; });
+class BroadcasterService {
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/abstractions/cipher.service.ts":
+/*!*********************************************************!*\
+ !*** ./jslib/common/src/abstractions/cipher.service.ts ***!
+ \*********************************************************/
+/*! exports provided: CipherService */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CipherService", function() { return CipherService; });
+class CipherService {
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/abstractions/collection.service.ts":
+/*!*************************************************************!*\
+ !*** ./jslib/common/src/abstractions/collection.service.ts ***!
+ \*************************************************************/
+/*! exports provided: CollectionService */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CollectionService", function() { return CollectionService; });
+class CollectionService {
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/abstractions/crypto.service.ts":
+/*!*********************************************************!*\
+ !*** ./jslib/common/src/abstractions/crypto.service.ts ***!
+ \*********************************************************/
+/*! exports provided: CryptoService */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CryptoService", function() { return CryptoService; });
+class CryptoService {
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/abstractions/cryptoFunction.service.ts":
+/*!*****************************************************************!*\
+ !*** ./jslib/common/src/abstractions/cryptoFunction.service.ts ***!
+ \*****************************************************************/
+/*! exports provided: CryptoFunctionService */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CryptoFunctionService", function() { return CryptoFunctionService; });
+class CryptoFunctionService {
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/abstractions/environment.service.ts":
+/*!**************************************************************!*\
+ !*** ./jslib/common/src/abstractions/environment.service.ts ***!
+ \**************************************************************/
+/*! exports provided: EnvironmentService */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "EnvironmentService", function() { return EnvironmentService; });
+class EnvironmentService {
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/abstractions/event.service.ts":
+/*!********************************************************!*\
+ !*** ./jslib/common/src/abstractions/event.service.ts ***!
+ \********************************************************/
+/*! exports provided: EventService */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "EventService", function() { return EventService; });
+class EventService {
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/abstractions/export.service.ts":
+/*!*********************************************************!*\
+ !*** ./jslib/common/src/abstractions/export.service.ts ***!
+ \*********************************************************/
+/*! exports provided: ExportService */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ExportService", function() { return ExportService; });
+class ExportService {
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/abstractions/fileUpload.service.ts":
+/*!*************************************************************!*\
+ !*** ./jslib/common/src/abstractions/fileUpload.service.ts ***!
+ \*************************************************************/
+/*! exports provided: FileUploadService */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FileUploadService", function() { return FileUploadService; });
+class FileUploadService {
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/abstractions/folder.service.ts":
+/*!*********************************************************!*\
+ !*** ./jslib/common/src/abstractions/folder.service.ts ***!
+ \*********************************************************/
+/*! exports provided: FolderService */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FolderService", function() { return FolderService; });
+class FolderService {
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/abstractions/i18n.service.ts":
+/*!*******************************************************!*\
+ !*** ./jslib/common/src/abstractions/i18n.service.ts ***!
+ \*******************************************************/
+/*! exports provided: I18nService */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "I18nService", function() { return I18nService; });
+class I18nService {
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/abstractions/log.service.ts":
+/*!******************************************************!*\
+ !*** ./jslib/common/src/abstractions/log.service.ts ***!
+ \******************************************************/
+/*! exports provided: LogService */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LogService", function() { return LogService; });
+class LogService {
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/abstractions/messaging.service.ts":
+/*!************************************************************!*\
+ !*** ./jslib/common/src/abstractions/messaging.service.ts ***!
+ \************************************************************/
+/*! exports provided: MessagingService */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MessagingService", function() { return MessagingService; });
+class MessagingService {
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/abstractions/notifications.service.ts":
+/*!****************************************************************!*\
+ !*** ./jslib/common/src/abstractions/notifications.service.ts ***!
+ \****************************************************************/
+/*! exports provided: NotificationsService */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "NotificationsService", function() { return NotificationsService; });
+class NotificationsService {
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/abstractions/passwordGeneration.service.ts":
+/*!*********************************************************************!*\
+ !*** ./jslib/common/src/abstractions/passwordGeneration.service.ts ***!
+ \*********************************************************************/
+/*! exports provided: PasswordGenerationService */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PasswordGenerationService", function() { return PasswordGenerationService; });
+class PasswordGenerationService {
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/abstractions/passwordReprompt.service.ts":
+/*!*******************************************************************!*\
+ !*** ./jslib/common/src/abstractions/passwordReprompt.service.ts ***!
+ \*******************************************************************/
+/*! exports provided: PasswordRepromptService */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PasswordRepromptService", function() { return PasswordRepromptService; });
+class PasswordRepromptService {
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/abstractions/platformUtils.service.ts":
+/*!****************************************************************!*\
+ !*** ./jslib/common/src/abstractions/platformUtils.service.ts ***!
+ \****************************************************************/
+/*! exports provided: PlatformUtilsService */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PlatformUtilsService", function() { return PlatformUtilsService; });
+class PlatformUtilsService {
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/abstractions/policy.service.ts":
+/*!*********************************************************!*\
+ !*** ./jslib/common/src/abstractions/policy.service.ts ***!
+ \*********************************************************/
+/*! exports provided: PolicyService */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PolicyService", function() { return PolicyService; });
+class PolicyService {
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/abstractions/search.service.ts":
+/*!*********************************************************!*\
+ !*** ./jslib/common/src/abstractions/search.service.ts ***!
+ \*********************************************************/
+/*! exports provided: SearchService */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SearchService", function() { return SearchService; });
+class SearchService {
+ constructor() {
+ this.indexedEntityId = null;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/abstractions/send.service.ts":
+/*!*******************************************************!*\
+ !*** ./jslib/common/src/abstractions/send.service.ts ***!
+ \*******************************************************/
+/*! exports provided: SendService */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SendService", function() { return SendService; });
+class SendService {
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/abstractions/settings.service.ts":
+/*!***********************************************************!*\
+ !*** ./jslib/common/src/abstractions/settings.service.ts ***!
+ \***********************************************************/
+/*! exports provided: SettingsService */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SettingsService", function() { return SettingsService; });
+class SettingsService {
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/abstractions/state.service.ts":
+/*!********************************************************!*\
+ !*** ./jslib/common/src/abstractions/state.service.ts ***!
+ \********************************************************/
+/*! exports provided: StateService */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "StateService", function() { return StateService; });
+class StateService {
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/abstractions/storage.service.ts":
+/*!**********************************************************!*\
+ !*** ./jslib/common/src/abstractions/storage.service.ts ***!
+ \**********************************************************/
+/*! exports provided: StorageService */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "StorageService", function() { return StorageService; });
+class StorageService {
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/abstractions/sync.service.ts":
+/*!*******************************************************!*\
+ !*** ./jslib/common/src/abstractions/sync.service.ts ***!
+ \*******************************************************/
+/*! exports provided: SyncService */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SyncService", function() { return SyncService; });
+class SyncService {
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/abstractions/token.service.ts":
+/*!********************************************************!*\
+ !*** ./jslib/common/src/abstractions/token.service.ts ***!
+ \********************************************************/
+/*! exports provided: TokenService */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TokenService", function() { return TokenService; });
+class TokenService {
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/abstractions/totp.service.ts":
+/*!*******************************************************!*\
+ !*** ./jslib/common/src/abstractions/totp.service.ts ***!
+ \*******************************************************/
+/*! exports provided: TotpService */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TotpService", function() { return TotpService; });
+class TotpService {
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/abstractions/user.service.ts":
+/*!*******************************************************!*\
+ !*** ./jslib/common/src/abstractions/user.service.ts ***!
+ \*******************************************************/
+/*! exports provided: UserService */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "UserService", function() { return UserService; });
+class UserService {
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/abstractions/vaultTimeout.service.ts":
+/*!***************************************************************!*\
+ !*** ./jslib/common/src/abstractions/vaultTimeout.service.ts ***!
+ \***************************************************************/
+/*! exports provided: VaultTimeoutService */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "VaultTimeoutService", function() { return VaultTimeoutService; });
+class VaultTimeoutService {
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/enums/cipherRepromptType.ts":
+/*!******************************************************!*\
+ !*** ./jslib/common/src/enums/cipherRepromptType.ts ***!
+ \******************************************************/
+/*! exports provided: CipherRepromptType */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CipherRepromptType", function() { return CipherRepromptType; });
+var CipherRepromptType;
+(function (CipherRepromptType) {
+ CipherRepromptType[CipherRepromptType["None"] = 0] = "None";
+ CipherRepromptType[CipherRepromptType["Password"] = 1] = "Password";
+})(CipherRepromptType || (CipherRepromptType = {}));
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/enums/cipherType.ts":
+/*!**********************************************!*\
+ !*** ./jslib/common/src/enums/cipherType.ts ***!
+ \**********************************************/
+/*! exports provided: CipherType */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CipherType", function() { return CipherType; });
+var CipherType;
+(function (CipherType) {
+ CipherType[CipherType["Login"] = 1] = "Login";
+ CipherType[CipherType["SecureNote"] = 2] = "SecureNote";
+ CipherType[CipherType["Card"] = 3] = "Card";
+ CipherType[CipherType["Identity"] = 4] = "Identity";
+})(CipherType || (CipherType = {}));
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/enums/deviceType.ts":
+/*!**********************************************!*\
+ !*** ./jslib/common/src/enums/deviceType.ts ***!
+ \**********************************************/
+/*! exports provided: DeviceType */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "DeviceType", function() { return DeviceType; });
+var DeviceType;
+(function (DeviceType) {
+ DeviceType[DeviceType["Android"] = 0] = "Android";
+ DeviceType[DeviceType["iOS"] = 1] = "iOS";
+ DeviceType[DeviceType["ChromeExtension"] = 2] = "ChromeExtension";
+ DeviceType[DeviceType["FirefoxExtension"] = 3] = "FirefoxExtension";
+ DeviceType[DeviceType["OperaExtension"] = 4] = "OperaExtension";
+ DeviceType[DeviceType["EdgeExtension"] = 5] = "EdgeExtension";
+ DeviceType[DeviceType["WindowsDesktop"] = 6] = "WindowsDesktop";
+ DeviceType[DeviceType["MacOsDesktop"] = 7] = "MacOsDesktop";
+ DeviceType[DeviceType["LinuxDesktop"] = 8] = "LinuxDesktop";
+ DeviceType[DeviceType["ChromeBrowser"] = 9] = "ChromeBrowser";
+ DeviceType[DeviceType["FirefoxBrowser"] = 10] = "FirefoxBrowser";
+ DeviceType[DeviceType["OperaBrowser"] = 11] = "OperaBrowser";
+ DeviceType[DeviceType["EdgeBrowser"] = 12] = "EdgeBrowser";
+ DeviceType[DeviceType["IEBrowser"] = 13] = "IEBrowser";
+ DeviceType[DeviceType["UnknownBrowser"] = 14] = "UnknownBrowser";
+ DeviceType[DeviceType["AndroidAmazon"] = 15] = "AndroidAmazon";
+ DeviceType[DeviceType["UWP"] = 16] = "UWP";
+ DeviceType[DeviceType["SafariBrowser"] = 17] = "SafariBrowser";
+ DeviceType[DeviceType["VivaldiBrowser"] = 18] = "VivaldiBrowser";
+ DeviceType[DeviceType["VivaldiExtension"] = 19] = "VivaldiExtension";
+ DeviceType[DeviceType["SafariExtension"] = 20] = "SafariExtension";
+})(DeviceType || (DeviceType = {}));
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/enums/encryptionType.ts":
+/*!**************************************************!*\
+ !*** ./jslib/common/src/enums/encryptionType.ts ***!
+ \**************************************************/
+/*! exports provided: EncryptionType */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "EncryptionType", function() { return EncryptionType; });
+var EncryptionType;
+(function (EncryptionType) {
+ EncryptionType[EncryptionType["AesCbc256_B64"] = 0] = "AesCbc256_B64";
+ EncryptionType[EncryptionType["AesCbc128_HmacSha256_B64"] = 1] = "AesCbc128_HmacSha256_B64";
+ EncryptionType[EncryptionType["AesCbc256_HmacSha256_B64"] = 2] = "AesCbc256_HmacSha256_B64";
+ EncryptionType[EncryptionType["Rsa2048_OaepSha256_B64"] = 3] = "Rsa2048_OaepSha256_B64";
+ EncryptionType[EncryptionType["Rsa2048_OaepSha1_B64"] = 4] = "Rsa2048_OaepSha1_B64";
+ EncryptionType[EncryptionType["Rsa2048_OaepSha256_HmacSha256_B64"] = 5] = "Rsa2048_OaepSha256_HmacSha256_B64";
+ EncryptionType[EncryptionType["Rsa2048_OaepSha1_HmacSha256_B64"] = 6] = "Rsa2048_OaepSha1_HmacSha256_B64";
+})(EncryptionType || (EncryptionType = {}));
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/enums/eventType.ts":
+/*!*********************************************!*\
+ !*** ./jslib/common/src/enums/eventType.ts ***!
+ \*********************************************/
+/*! exports provided: EventType */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "EventType", function() { return EventType; });
+var EventType;
+(function (EventType) {
+ EventType[EventType["User_LoggedIn"] = 1000] = "User_LoggedIn";
+ EventType[EventType["User_ChangedPassword"] = 1001] = "User_ChangedPassword";
+ EventType[EventType["User_Updated2fa"] = 1002] = "User_Updated2fa";
+ EventType[EventType["User_Disabled2fa"] = 1003] = "User_Disabled2fa";
+ EventType[EventType["User_Recovered2fa"] = 1004] = "User_Recovered2fa";
+ EventType[EventType["User_FailedLogIn"] = 1005] = "User_FailedLogIn";
+ EventType[EventType["User_FailedLogIn2fa"] = 1006] = "User_FailedLogIn2fa";
+ EventType[EventType["User_ClientExportedVault"] = 1007] = "User_ClientExportedVault";
+ EventType[EventType["User_UpdatedTempPassword"] = 1008] = "User_UpdatedTempPassword";
+ EventType[EventType["Cipher_Created"] = 1100] = "Cipher_Created";
+ EventType[EventType["Cipher_Updated"] = 1101] = "Cipher_Updated";
+ EventType[EventType["Cipher_Deleted"] = 1102] = "Cipher_Deleted";
+ EventType[EventType["Cipher_AttachmentCreated"] = 1103] = "Cipher_AttachmentCreated";
+ EventType[EventType["Cipher_AttachmentDeleted"] = 1104] = "Cipher_AttachmentDeleted";
+ EventType[EventType["Cipher_Shared"] = 1105] = "Cipher_Shared";
+ EventType[EventType["Cipher_UpdatedCollections"] = 1106] = "Cipher_UpdatedCollections";
+ EventType[EventType["Cipher_ClientViewed"] = 1107] = "Cipher_ClientViewed";
+ EventType[EventType["Cipher_ClientToggledPasswordVisible"] = 1108] = "Cipher_ClientToggledPasswordVisible";
+ EventType[EventType["Cipher_ClientToggledHiddenFieldVisible"] = 1109] = "Cipher_ClientToggledHiddenFieldVisible";
+ EventType[EventType["Cipher_ClientToggledCardCodeVisible"] = 1110] = "Cipher_ClientToggledCardCodeVisible";
+ EventType[EventType["Cipher_ClientCopiedPassword"] = 1111] = "Cipher_ClientCopiedPassword";
+ EventType[EventType["Cipher_ClientCopiedHiddenField"] = 1112] = "Cipher_ClientCopiedHiddenField";
+ EventType[EventType["Cipher_ClientCopiedCardCode"] = 1113] = "Cipher_ClientCopiedCardCode";
+ EventType[EventType["Cipher_ClientAutofilled"] = 1114] = "Cipher_ClientAutofilled";
+ EventType[EventType["Cipher_SoftDeleted"] = 1115] = "Cipher_SoftDeleted";
+ EventType[EventType["Cipher_Restored"] = 1116] = "Cipher_Restored";
+ EventType[EventType["Cipher_ClientToggledCardNumberVisible"] = 1117] = "Cipher_ClientToggledCardNumberVisible";
+ EventType[EventType["Collection_Created"] = 1300] = "Collection_Created";
+ EventType[EventType["Collection_Updated"] = 1301] = "Collection_Updated";
+ EventType[EventType["Collection_Deleted"] = 1302] = "Collection_Deleted";
+ EventType[EventType["Group_Created"] = 1400] = "Group_Created";
+ EventType[EventType["Group_Updated"] = 1401] = "Group_Updated";
+ EventType[EventType["Group_Deleted"] = 1402] = "Group_Deleted";
+ EventType[EventType["OrganizationUser_Invited"] = 1500] = "OrganizationUser_Invited";
+ EventType[EventType["OrganizationUser_Confirmed"] = 1501] = "OrganizationUser_Confirmed";
+ EventType[EventType["OrganizationUser_Updated"] = 1502] = "OrganizationUser_Updated";
+ EventType[EventType["OrganizationUser_Removed"] = 1503] = "OrganizationUser_Removed";
+ EventType[EventType["OrganizationUser_UpdatedGroups"] = 1504] = "OrganizationUser_UpdatedGroups";
+ EventType[EventType["OrganizationUser_UnlinkedSso"] = 1505] = "OrganizationUser_UnlinkedSso";
+ EventType[EventType["OrganizationUser_ResetPassword_Enroll"] = 1506] = "OrganizationUser_ResetPassword_Enroll";
+ EventType[EventType["OrganizationUser_ResetPassword_Withdraw"] = 1507] = "OrganizationUser_ResetPassword_Withdraw";
+ EventType[EventType["OrganizationUser_AdminResetPassword"] = 1508] = "OrganizationUser_AdminResetPassword";
+ EventType[EventType["OrganizationUser_ResetSsoLink"] = 1509] = "OrganizationUser_ResetSsoLink";
+ EventType[EventType["Organization_Updated"] = 1600] = "Organization_Updated";
+ EventType[EventType["Organization_PurgedVault"] = 1601] = "Organization_PurgedVault";
+ // Organization_ClientExportedVault = 1602,
+ EventType[EventType["Organization_VaultAccessed"] = 1603] = "Organization_VaultAccessed";
+ EventType[EventType["Policy_Updated"] = 1700] = "Policy_Updated";
+ EventType[EventType["ProviderUser_Invited"] = 1800] = "ProviderUser_Invited";
+ EventType[EventType["ProviderUser_Confirmed"] = 1801] = "ProviderUser_Confirmed";
+ EventType[EventType["ProviderUser_Updated"] = 1802] = "ProviderUser_Updated";
+ EventType[EventType["ProviderUser_Removed"] = 1803] = "ProviderUser_Removed";
+ EventType[EventType["ProviderOrganization_Created"] = 1900] = "ProviderOrganization_Created";
+ EventType[EventType["ProviderOrganization_Added"] = 1901] = "ProviderOrganization_Added";
+ EventType[EventType["ProviderOrganization_Removed"] = 1902] = "ProviderOrganization_Removed";
+ EventType[EventType["ProviderOrganization_VaultAccessed"] = 1903] = "ProviderOrganization_VaultAccessed";
+})(EventType || (EventType = {}));
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/enums/fieldType.ts":
+/*!*********************************************!*\
+ !*** ./jslib/common/src/enums/fieldType.ts ***!
+ \*********************************************/
+/*! exports provided: FieldType */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FieldType", function() { return FieldType; });
+var FieldType;
+(function (FieldType) {
+ FieldType[FieldType["Text"] = 0] = "Text";
+ FieldType[FieldType["Hidden"] = 1] = "Hidden";
+ FieldType[FieldType["Boolean"] = 2] = "Boolean";
+ FieldType[FieldType["Linked"] = 3] = "Linked";
+})(FieldType || (FieldType = {}));
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/enums/hashPurpose.ts":
+/*!***********************************************!*\
+ !*** ./jslib/common/src/enums/hashPurpose.ts ***!
+ \***********************************************/
+/*! exports provided: HashPurpose */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "HashPurpose", function() { return HashPurpose; });
+var HashPurpose;
+(function (HashPurpose) {
+ HashPurpose[HashPurpose["ServerAuthorization"] = 1] = "ServerAuthorization";
+ HashPurpose[HashPurpose["LocalAuthorization"] = 2] = "LocalAuthorization";
+})(HashPurpose || (HashPurpose = {}));
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/enums/kdfType.ts":
+/*!*******************************************!*\
+ !*** ./jslib/common/src/enums/kdfType.ts ***!
+ \*******************************************/
+/*! exports provided: KdfType */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "KdfType", function() { return KdfType; });
+var KdfType;
+(function (KdfType) {
+ KdfType[KdfType["PBKDF2_SHA256"] = 0] = "PBKDF2_SHA256";
+})(KdfType || (KdfType = {}));
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/enums/linkedIdType.ts":
+/*!************************************************!*\
+ !*** ./jslib/common/src/enums/linkedIdType.ts ***!
+ \************************************************/
+/*! exports provided: LoginLinkedId, CardLinkedId, IdentityLinkedId */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LoginLinkedId", function() { return LoginLinkedId; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CardLinkedId", function() { return CardLinkedId; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "IdentityLinkedId", function() { return IdentityLinkedId; });
+// LoginView
+var LoginLinkedId;
+(function (LoginLinkedId) {
+ LoginLinkedId[LoginLinkedId["Username"] = 100] = "Username";
+ LoginLinkedId[LoginLinkedId["Password"] = 101] = "Password";
+})(LoginLinkedId || (LoginLinkedId = {}));
+// CardView
+var CardLinkedId;
+(function (CardLinkedId) {
+ CardLinkedId[CardLinkedId["CardholderName"] = 300] = "CardholderName";
+ CardLinkedId[CardLinkedId["ExpMonth"] = 301] = "ExpMonth";
+ CardLinkedId[CardLinkedId["ExpYear"] = 302] = "ExpYear";
+ CardLinkedId[CardLinkedId["Code"] = 303] = "Code";
+ CardLinkedId[CardLinkedId["Brand"] = 304] = "Brand";
+ CardLinkedId[CardLinkedId["Number"] = 305] = "Number";
+})(CardLinkedId || (CardLinkedId = {}));
+// IdentityView
+var IdentityLinkedId;
+(function (IdentityLinkedId) {
+ IdentityLinkedId[IdentityLinkedId["Title"] = 400] = "Title";
+ IdentityLinkedId[IdentityLinkedId["MiddleName"] = 401] = "MiddleName";
+ IdentityLinkedId[IdentityLinkedId["Address1"] = 402] = "Address1";
+ IdentityLinkedId[IdentityLinkedId["Address2"] = 403] = "Address2";
+ IdentityLinkedId[IdentityLinkedId["Address3"] = 404] = "Address3";
+ IdentityLinkedId[IdentityLinkedId["City"] = 405] = "City";
+ IdentityLinkedId[IdentityLinkedId["State"] = 406] = "State";
+ IdentityLinkedId[IdentityLinkedId["PostalCode"] = 407] = "PostalCode";
+ IdentityLinkedId[IdentityLinkedId["Country"] = 408] = "Country";
+ IdentityLinkedId[IdentityLinkedId["Company"] = 409] = "Company";
+ IdentityLinkedId[IdentityLinkedId["Email"] = 410] = "Email";
+ IdentityLinkedId[IdentityLinkedId["Phone"] = 411] = "Phone";
+ IdentityLinkedId[IdentityLinkedId["Ssn"] = 412] = "Ssn";
+ IdentityLinkedId[IdentityLinkedId["Username"] = 413] = "Username";
+ IdentityLinkedId[IdentityLinkedId["PassportNumber"] = 414] = "PassportNumber";
+ IdentityLinkedId[IdentityLinkedId["LicenseNumber"] = 415] = "LicenseNumber";
+ IdentityLinkedId[IdentityLinkedId["FirstName"] = 416] = "FirstName";
+ IdentityLinkedId[IdentityLinkedId["LastName"] = 417] = "LastName";
+ IdentityLinkedId[IdentityLinkedId["FullName"] = 418] = "FullName";
+})(IdentityLinkedId || (IdentityLinkedId = {}));
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/enums/organizationUserStatusType.ts":
+/*!**************************************************************!*\
+ !*** ./jslib/common/src/enums/organizationUserStatusType.ts ***!
+ \**************************************************************/
+/*! exports provided: OrganizationUserStatusType */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "OrganizationUserStatusType", function() { return OrganizationUserStatusType; });
+var OrganizationUserStatusType;
+(function (OrganizationUserStatusType) {
+ OrganizationUserStatusType[OrganizationUserStatusType["Invited"] = 0] = "Invited";
+ OrganizationUserStatusType[OrganizationUserStatusType["Accepted"] = 1] = "Accepted";
+ OrganizationUserStatusType[OrganizationUserStatusType["Confirmed"] = 2] = "Confirmed";
+})(OrganizationUserStatusType || (OrganizationUserStatusType = {}));
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/enums/policyType.ts":
+/*!**********************************************!*\
+ !*** ./jslib/common/src/enums/policyType.ts ***!
+ \**********************************************/
+/*! exports provided: PolicyType */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PolicyType", function() { return PolicyType; });
+var PolicyType;
+(function (PolicyType) {
+ PolicyType[PolicyType["TwoFactorAuthentication"] = 0] = "TwoFactorAuthentication";
+ PolicyType[PolicyType["MasterPassword"] = 1] = "MasterPassword";
+ PolicyType[PolicyType["PasswordGenerator"] = 2] = "PasswordGenerator";
+ PolicyType[PolicyType["SingleOrg"] = 3] = "SingleOrg";
+ PolicyType[PolicyType["RequireSso"] = 4] = "RequireSso";
+ PolicyType[PolicyType["PersonalOwnership"] = 5] = "PersonalOwnership";
+ PolicyType[PolicyType["DisableSend"] = 6] = "DisableSend";
+ PolicyType[PolicyType["SendOptions"] = 7] = "SendOptions";
+ PolicyType[PolicyType["ResetPassword"] = 8] = "ResetPassword";
+ PolicyType[PolicyType["MaximumVaultTimeout"] = 9] = "MaximumVaultTimeout";
+ PolicyType[PolicyType["DisablePersonalVaultExport"] = 10] = "DisablePersonalVaultExport";
+})(PolicyType || (PolicyType = {}));
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/enums/secureNoteType.ts":
+/*!**************************************************!*\
+ !*** ./jslib/common/src/enums/secureNoteType.ts ***!
+ \**************************************************/
+/*! exports provided: SecureNoteType */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SecureNoteType", function() { return SecureNoteType; });
+var SecureNoteType;
+(function (SecureNoteType) {
+ SecureNoteType[SecureNoteType["Generic"] = 0] = "Generic";
+})(SecureNoteType || (SecureNoteType = {}));
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/enums/sendType.ts":
+/*!********************************************!*\
+ !*** ./jslib/common/src/enums/sendType.ts ***!
+ \********************************************/
+/*! exports provided: SendType */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SendType", function() { return SendType; });
+var SendType;
+(function (SendType) {
+ SendType[SendType["Text"] = 0] = "Text";
+ SendType[SendType["File"] = 1] = "File";
+})(SendType || (SendType = {}));
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/enums/themeType.ts":
+/*!*********************************************!*\
+ !*** ./jslib/common/src/enums/themeType.ts ***!
+ \*********************************************/
+/*! exports provided: ThemeType */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ThemeType", function() { return ThemeType; });
+var ThemeType;
+(function (ThemeType) {
+ ThemeType["System"] = "system";
+ ThemeType["Light"] = "light";
+ ThemeType["Dark"] = "dark";
+ ThemeType["Nord"] = "nord";
+ ThemeType["SolarizedDark"] = "solarizedDark";
+})(ThemeType || (ThemeType = {}));
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/enums/twoFactorProviderType.ts":
+/*!*********************************************************!*\
+ !*** ./jslib/common/src/enums/twoFactorProviderType.ts ***!
+ \*********************************************************/
+/*! exports provided: TwoFactorProviderType */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TwoFactorProviderType", function() { return TwoFactorProviderType; });
+var TwoFactorProviderType;
+(function (TwoFactorProviderType) {
+ TwoFactorProviderType[TwoFactorProviderType["Authenticator"] = 0] = "Authenticator";
+ TwoFactorProviderType[TwoFactorProviderType["Email"] = 1] = "Email";
+ TwoFactorProviderType[TwoFactorProviderType["Duo"] = 2] = "Duo";
+ TwoFactorProviderType[TwoFactorProviderType["Yubikey"] = 3] = "Yubikey";
+ TwoFactorProviderType[TwoFactorProviderType["U2f"] = 4] = "U2f";
+ TwoFactorProviderType[TwoFactorProviderType["Remember"] = 5] = "Remember";
+ TwoFactorProviderType[TwoFactorProviderType["OrganizationDuo"] = 6] = "OrganizationDuo";
+ TwoFactorProviderType[TwoFactorProviderType["WebAuthn"] = 7] = "WebAuthn";
+})(TwoFactorProviderType || (TwoFactorProviderType = {}));
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/enums/uriMatchType.ts":
+/*!************************************************!*\
+ !*** ./jslib/common/src/enums/uriMatchType.ts ***!
+ \************************************************/
+/*! exports provided: UriMatchType */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "UriMatchType", function() { return UriMatchType; });
+var UriMatchType;
+(function (UriMatchType) {
+ UriMatchType[UriMatchType["Domain"] = 0] = "Domain";
+ UriMatchType[UriMatchType["Host"] = 1] = "Host";
+ UriMatchType[UriMatchType["StartsWith"] = 2] = "StartsWith";
+ UriMatchType[UriMatchType["Exact"] = 3] = "Exact";
+ UriMatchType[UriMatchType["RegularExpression"] = 4] = "RegularExpression";
+ UriMatchType[UriMatchType["Never"] = 5] = "Never";
+})(UriMatchType || (UriMatchType = {}));
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/misc/captcha_iframe.ts":
+/*!*************************************************!*\
+ !*** ./jslib/common/src/misc/captcha_iframe.ts ***!
+ \*************************************************/
+/*! exports provided: CaptchaIFrame */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CaptchaIFrame", function() { return CaptchaIFrame; });
+/* harmony import */ var _iframe_component__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./iframe_component */ "./jslib/common/src/misc/iframe_component.ts");
+
+class CaptchaIFrame extends _iframe_component__WEBPACK_IMPORTED_MODULE_0__["IFrameComponent"] {
+ constructor(win, webVaultUrl, i18nService, successCallback, errorCallback, infoCallback) {
+ super(win, webVaultUrl, 'captcha-connector.html', 'hcaptcha_iframe', successCallback, errorCallback, (message) => {
+ const parsedMessage = JSON.parse(message);
+ if (typeof (parsedMessage) !== 'string') {
+ this.iframe.height = (parsedMessage.height).toString();
+ this.iframe.width = (parsedMessage.width).toString();
+ }
+ else {
+ infoCallback(parsedMessage);
+ }
+ });
+ this.i18nService = i18nService;
+ }
+ init(siteKey) {
+ super.initComponent(this.createParams({ siteKey: siteKey, locale: this.i18nService.translationLocale }, 1));
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/misc/iframe_component.ts":
+/*!***************************************************!*\
+ !*** ./jslib/common/src/misc/iframe_component.ts ***!
+ \***************************************************/
+/*! exports provided: IFrameComponent */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "IFrameComponent", function() { return IFrameComponent; });
+class IFrameComponent {
+ constructor(win, webVaultUrl, path, iframeId, successCallback, errorCallback, infoCallback) {
+ this.win = win;
+ this.webVaultUrl = webVaultUrl;
+ this.path = path;
+ this.iframeId = iframeId;
+ this.successCallback = successCallback;
+ this.errorCallback = errorCallback;
+ this.infoCallback = infoCallback;
+ this.parseFunction = this.parseMessage.bind(this);
+ this.connectorLink = win.document.createElement('a');
+ }
+ stop() {
+ this.sendMessage('stop');
+ }
+ start() {
+ this.sendMessage('start');
+ }
+ sendMessage(message) {
+ if (!this.iframe || !this.iframe.src || !this.iframe.contentWindow) {
+ return;
+ }
+ this.iframe.contentWindow.postMessage(message, this.iframe.src);
+ }
+ base64Encode(str) {
+ return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, (match, p1) => {
+ return String.fromCharCode(('0x' + p1));
+ }));
+ }
+ cleanup() {
+ this.win.removeEventListener('message', this.parseFunction, false);
+ }
+ createParams(data, version) {
+ return new URLSearchParams({
+ data: this.base64Encode(JSON.stringify(data)),
+ parent: encodeURIComponent(this.win.document.location.href),
+ v: version.toString(),
+ });
+ }
+ initComponent(params) {
+ this.connectorLink.href = `${this.webVaultUrl}/${this.path}?${params}`;
+ this.iframe = this.win.document.getElementById(this.iframeId);
+ this.iframe.src = this.connectorLink.href;
+ this.win.addEventListener('message', this.parseFunction, false);
+ }
+ parseMessage(event) {
+ if (!this.validMessage(event)) {
+ return;
+ }
+ const parts = event.data.split('|');
+ if (parts[0] === 'success' && this.successCallback) {
+ this.successCallback(parts[1]);
+ }
+ else if (parts[0] === 'error' && this.errorCallback) {
+ this.errorCallback(parts[1]);
+ }
+ else if (parts[0] === 'info' && this.infoCallback) {
+ this.infoCallback(parts[1]);
+ }
+ }
+ validMessage(event) {
+ if (event.origin == null || event.origin === '' || event.origin !== this.connectorLink.origin ||
+ event.data == null || typeof (event.data) !== 'string') {
+ return false;
+ }
+ return event.data.indexOf('success|') === 0 || event.data.indexOf('error|') === 0 ||
+ event.data.indexOf('info|') === 0;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/misc/linkedFieldOption.decorator.ts":
+/*!**************************************************************!*\
+ !*** ./jslib/common/src/misc/linkedFieldOption.decorator.ts ***!
+ \**************************************************************/
+/*! exports provided: LinkedMetadata, linkedFieldOption */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LinkedMetadata", function() { return LinkedMetadata; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "linkedFieldOption", function() { return linkedFieldOption; });
+class LinkedMetadata {
+ constructor(propertyKey, _i18nKey) {
+ this.propertyKey = propertyKey;
+ this._i18nKey = _i18nKey;
+ }
+ get i18nKey() {
+ var _a;
+ return (_a = this._i18nKey) !== null && _a !== void 0 ? _a : this.propertyKey;
+ }
+}
+/**
+ * A decorator used to set metadata used by Linked custom fields. Apply it to a class property or getter to make it
+ * available as a Linked custom field option.
+ * @param id - A unique value that is saved in the Field model. It is used to look up the decorated class property.
+ * @param i18nKey - The i18n key used to describe the decorated class property in the UI. If it is null, then the name
+ * of the class property will be used as the i18n key.
+ */
+function linkedFieldOption(id, i18nKey) {
+ return (prototype, propertyKey) => {
+ if (prototype.linkedFieldOptions == null) {
+ prototype.linkedFieldOptions = new Map();
+ }
+ prototype.linkedFieldOptions.set(id, new LinkedMetadata(propertyKey, i18nKey));
+ };
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/misc/utils.ts":
+/*!****************************************!*\
+ !*** ./jslib/common/src/misc/utils.ts ***!
+ \****************************************/
+/*! exports provided: Utils */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* WEBPACK VAR INJECTION */(function(process, global, Buffer) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Utils", function() { return Utils; });
+/* harmony import */ var tldjs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tldjs */ "./node_modules/tldjs/index.js");
+/* harmony import */ var tldjs__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(tldjs__WEBPACK_IMPORTED_MODULE_0__);
+
+// tslint:disable-next-line
+const nodeURL = typeof window === 'undefined' ? __webpack_require__(/*! url */ "./node_modules/url/url.js") : null;
+class Utils {
+ static init() {
+ if (Utils.inited) {
+ return;
+ }
+ Utils.inited = true;
+ Utils.isNode = typeof process !== 'undefined' && process.release != null &&
+ process.release.name === 'node';
+ Utils.isBrowser = typeof window !== 'undefined';
+ Utils.isNativeScript = !Utils.isNode && !Utils.isBrowser;
+ Utils.isMobileBrowser = Utils.isBrowser && this.isMobile(window);
+ Utils.isAppleMobileBrowser = Utils.isBrowser && this.isAppleMobile(window);
+ Utils.global = Utils.isNativeScript ? global : (Utils.isNode && !Utils.isBrowser ? global : window);
+ }
+ static fromB64ToArray(str) {
+ if (Utils.isNode || Utils.isNativeScript) {
+ return new Uint8Array(Buffer.from(str, 'base64'));
+ }
+ else {
+ const binaryString = window.atob(str);
+ const bytes = new Uint8Array(binaryString.length);
+ for (let i = 0; i < binaryString.length; i++) {
+ bytes[i] = binaryString.charCodeAt(i);
+ }
+ return bytes;
+ }
+ }
+ static fromUrlB64ToArray(str) {
+ return Utils.fromB64ToArray(Utils.fromUrlB64ToB64(str));
+ }
+ static fromHexToArray(str) {
+ if (Utils.isNode || Utils.isNativeScript) {
+ return new Uint8Array(Buffer.from(str, 'hex'));
+ }
+ else {
+ const bytes = new Uint8Array(str.length / 2);
+ for (let i = 0; i < str.length; i += 2) {
+ bytes[i / 2] = parseInt(str.substr(i, 2), 16);
+ }
+ return bytes;
+ }
+ }
+ static fromUtf8ToArray(str) {
+ if (Utils.isNode || Utils.isNativeScript) {
+ return new Uint8Array(Buffer.from(str, 'utf8'));
+ }
+ else {
+ const strUtf8 = unescape(encodeURIComponent(str));
+ const arr = new Uint8Array(strUtf8.length);
+ for (let i = 0; i < strUtf8.length; i++) {
+ arr[i] = strUtf8.charCodeAt(i);
+ }
+ return arr;
+ }
+ }
+ static fromByteStringToArray(str) {
+ const arr = new Uint8Array(str.length);
+ for (let i = 0; i < str.length; i++) {
+ arr[i] = str.charCodeAt(i);
+ }
+ return arr;
+ }
+ static fromBufferToB64(buffer) {
+ if (Utils.isNode || Utils.isNativeScript) {
+ return Buffer.from(buffer).toString('base64');
+ }
+ else {
+ let binary = '';
+ const bytes = new Uint8Array(buffer);
+ for (let i = 0; i < bytes.byteLength; i++) {
+ binary += String.fromCharCode(bytes[i]);
+ }
+ return window.btoa(binary);
+ }
+ }
+ static fromBufferToUrlB64(buffer) {
+ return Utils.fromB64toUrlB64(Utils.fromBufferToB64(buffer));
+ }
+ static fromB64toUrlB64(b64Str) {
+ return b64Str.replace(/\+/g, '-')
+ .replace(/\//g, '_')
+ .replace(/=/g, '');
+ }
+ static fromBufferToUtf8(buffer) {
+ if (Utils.isNode || Utils.isNativeScript) {
+ return Buffer.from(buffer).toString('utf8');
+ }
+ else {
+ const bytes = new Uint8Array(buffer);
+ const encodedString = String.fromCharCode.apply(null, bytes);
+ return decodeURIComponent(escape(encodedString));
+ }
+ }
+ static fromBufferToByteString(buffer) {
+ return String.fromCharCode.apply(null, new Uint8Array(buffer));
+ }
+ // ref: https://stackoverflow.com/a/40031979/1090359
+ static fromBufferToHex(buffer) {
+ if (Utils.isNode || Utils.isNativeScript) {
+ return Buffer.from(buffer).toString('hex');
+ }
+ else {
+ const bytes = new Uint8Array(buffer);
+ return Array.prototype.map.call(bytes, (x) => ('00' + x.toString(16)).slice(-2)).join('');
+ }
+ }
+ static fromUrlB64ToB64(urlB64Str) {
+ let output = urlB64Str.replace(/-/g, '+').replace(/_/g, '/');
+ switch (output.length % 4) {
+ case 0:
+ break;
+ case 2:
+ output += '==';
+ break;
+ case 3:
+ output += '=';
+ break;
+ default:
+ throw new Error('Illegal base64url string!');
+ }
+ return output;
+ }
+ static fromUrlB64ToUtf8(urlB64Str) {
+ return Utils.fromB64ToUtf8(Utils.fromUrlB64ToB64(urlB64Str));
+ }
+ static fromUtf8ToB64(utfStr) {
+ if (Utils.isNode || Utils.isNativeScript) {
+ return Buffer.from(utfStr, 'utf8').toString('base64');
+ }
+ else {
+ return decodeURIComponent(escape(window.btoa(utfStr)));
+ }
+ }
+ static fromUtf8ToUrlB64(utfStr) {
+ return Utils.fromBufferToUrlB64(Utils.fromUtf8ToArray(utfStr));
+ }
+ static fromB64ToUtf8(b64Str) {
+ if (Utils.isNode || Utils.isNativeScript) {
+ return Buffer.from(b64Str, 'base64').toString('utf8');
+ }
+ else {
+ return decodeURIComponent(escape(window.atob(b64Str)));
+ }
+ }
+ // ref: http://stackoverflow.com/a/2117523/1090359
+ static newGuid() {
+ return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => {
+ // tslint:disable-next-line
+ const r = Math.random() * 16 | 0;
+ // tslint:disable-next-line
+ const v = c === 'x' ? r : (r & 0x3 | 0x8);
+ return v.toString(16);
+ });
+ }
+ static isGuid(id) {
+ return RegExp(/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/, 'i').test(id);
+ }
+ static getHostname(uriString) {
+ const url = Utils.getUrl(uriString);
+ try {
+ return url != null && url.hostname !== '' ? url.hostname : null;
+ }
+ catch (_a) {
+ return null;
+ }
+ }
+ static getHost(uriString) {
+ const url = Utils.getUrl(uriString);
+ try {
+ return url != null && url.host !== '' ? url.host : null;
+ }
+ catch (_a) {
+ return null;
+ }
+ }
+ static getDomain(uriString) {
+ if (uriString == null) {
+ return null;
+ }
+ uriString = uriString.trim();
+ if (uriString === '') {
+ return null;
+ }
+ if (uriString.startsWith('data:')) {
+ return null;
+ }
+ let httpUrl = uriString.startsWith('http://') || uriString.startsWith('https://');
+ if (!httpUrl && uriString.indexOf('://') < 0 && Utils.tldEndingRegex.test(uriString)) {
+ uriString = 'http://' + uriString;
+ httpUrl = true;
+ }
+ if (httpUrl) {
+ try {
+ const url = Utils.getUrlObject(uriString);
+ const validHostname = (tldjs__WEBPACK_IMPORTED_MODULE_0__ === null || tldjs__WEBPACK_IMPORTED_MODULE_0__ === void 0 ? void 0 : tldjs__WEBPACK_IMPORTED_MODULE_0__["isValid"]) != null ? tldjs__WEBPACK_IMPORTED_MODULE_0__["isValid"](url.hostname) : true;
+ if (!validHostname) {
+ return null;
+ }
+ if (url.hostname === 'localhost' || Utils.validIpAddress(url.hostname)) {
+ return url.hostname;
+ }
+ const urlDomain = tldjs__WEBPACK_IMPORTED_MODULE_0__ != null && tldjs__WEBPACK_IMPORTED_MODULE_0__["getDomain"] != null ? tldjs__WEBPACK_IMPORTED_MODULE_0__["getDomain"](url.hostname) : null;
+ return urlDomain != null ? urlDomain : url.hostname;
+ }
+ catch (e) {
+ // Invalid domain, try another approach below.
+ }
+ }
+ try {
+ const domain = tldjs__WEBPACK_IMPORTED_MODULE_0__ != null && tldjs__WEBPACK_IMPORTED_MODULE_0__["getDomain"] != null ? tldjs__WEBPACK_IMPORTED_MODULE_0__["getDomain"](uriString) : null;
+ if (domain != null) {
+ return domain;
+ }
+ }
+ catch (_a) {
+ return null;
+ }
+ return null;
+ }
+ static getQueryParams(uriString) {
+ const url = Utils.getUrl(uriString);
+ if (url == null || url.search == null || url.search === '') {
+ return null;
+ }
+ const map = new Map();
+ const pairs = (url.search[0] === '?' ? url.search.substr(1) : url.search).split('&');
+ pairs.forEach(pair => {
+ const parts = pair.split('=');
+ if (parts.length < 1) {
+ return;
+ }
+ map.set(decodeURIComponent(parts[0]).toLowerCase(), parts[1] == null ? '' : decodeURIComponent(parts[1]));
+ });
+ return map;
+ }
+ static getSortFunction(i18nService, prop) {
+ return (a, b) => {
+ if (a[prop] == null && b[prop] != null) {
+ return -1;
+ }
+ if (a[prop] != null && b[prop] == null) {
+ return 1;
+ }
+ if (a[prop] == null && b[prop] == null) {
+ return 0;
+ }
+ return i18nService.collator ? i18nService.collator.compare(a[prop], b[prop]) :
+ a[prop].localeCompare(b[prop]);
+ };
+ }
+ static isNullOrWhitespace(str) {
+ return str == null || typeof str !== 'string' || str.trim() === '';
+ }
+ static nameOf(name) {
+ return name;
+ }
+ static assign(target, source) {
+ return Object.assign(target, source);
+ }
+ static iterateEnum(obj) {
+ return Object.keys(obj).filter(k => Number.isNaN(+k)).map(k => obj[k]);
+ }
+ static getUrl(uriString) {
+ if (uriString == null) {
+ return null;
+ }
+ uriString = uriString.trim();
+ if (uriString === '') {
+ return null;
+ }
+ let url = Utils.getUrlObject(uriString);
+ if (url == null) {
+ const hasHttpProtocol = uriString.indexOf('http://') === 0 || uriString.indexOf('https://') === 0;
+ if (!hasHttpProtocol && uriString.indexOf('.') > -1) {
+ url = Utils.getUrlObject('http://' + uriString);
+ }
+ }
+ return url;
+ }
+ static camelToPascalCase(s) {
+ return s.charAt(0).toUpperCase() + s.slice(1);
+ }
+ static validIpAddress(ipString) {
+ // tslint:disable-next-line
+ const ipRegex = /^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/;
+ return ipRegex.test(ipString);
+ }
+ static isMobile(win) {
+ let mobile = false;
+ (a => {
+ // tslint:disable-next-line
+ if (/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0, 4))) {
+ mobile = true;
+ }
+ })(win.navigator.userAgent || win.navigator.vendor || win.opera);
+ return mobile || win.navigator.userAgent.match(/iPad/i) != null;
+ }
+ static isAppleMobile(win) {
+ return win.navigator.userAgent.match(/iPhone/i) != null || win.navigator.userAgent.match(/iPad/i) != null;
+ }
+ static getUrlObject(uriString) {
+ try {
+ if (nodeURL != null) {
+ return nodeURL.URL ? new nodeURL.URL(uriString) : nodeURL.parse(uriString);
+ }
+ else if (typeof URL === 'function') {
+ return new URL(uriString);
+ }
+ else if (window != null) {
+ const hasProtocol = uriString.indexOf('://') > -1;
+ if (!hasProtocol && uriString.indexOf('.') > -1) {
+ uriString = 'http://' + uriString;
+ }
+ else if (!hasProtocol) {
+ return null;
+ }
+ const anchor = window.document.createElement('a');
+ anchor.href = uriString;
+ return anchor;
+ }
+ }
+ catch (e) {
+ // Ignore error
+ }
+ return null;
+ }
+}
+Utils.inited = false;
+Utils.isNativeScript = false;
+Utils.isNode = false;
+Utils.isBrowser = true;
+Utils.isMobileBrowser = false;
+Utils.isAppleMobileBrowser = false;
+Utils.global = null;
+Utils.tldEndingRegex = /.*\.(com|net|org|edu|uk|gov|ca|de|jp|fr|au|ru|ch|io|es|us|co|xyz|info|ly|mil)$/;
+// Transpiled version of /\p{Emoji_Presentation}/gu using https://mothereff.in/regexpu. Used for compatability in older browsers.
+Utils.regexpEmojiPresentation = /(?:[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u270A\u270B\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55]|\uD83C[\uDC04\uDCCF\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF7C\uDF7E-\uDF93\uDFA0-\uDFCA\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF4\uDFF8-\uDFFF]|\uD83D[\uDC00-\uDC3E\uDC40\uDC42-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDD7A\uDD95\uDD96\uDDA4\uDDFB-\uDE4F\uDE80-\uDEC5\uDECC\uDED0-\uDED2\uDED5-\uDED7\uDEEB\uDEEC\uDEF4-\uDEFC\uDFE0-\uDFEB]|\uD83E[\uDD0C-\uDD3A\uDD3C-\uDD45\uDD47-\uDD78\uDD7A-\uDDCB\uDDCD-\uDDFF\uDE70-\uDE74\uDE78-\uDE7A\uDE80-\uDE86\uDE90-\uDEA8\uDEB0-\uDEB6\uDEC0-\uDEC2\uDED0-\uDED6])/g;
+Utils.init();
+
+/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../../node_modules/process/browser.js */ "./node_modules/process/browser.js"), __webpack_require__(/*! ./../../../../node_modules/webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js"), __webpack_require__(/*! ./../../../../node_modules/buffer/index.js */ "./node_modules/buffer/index.js").Buffer))
+
+/***/ }),
+
+/***/ "./jslib/common/src/misc/webauthn_iframe.ts":
+/*!**************************************************!*\
+ !*** ./jslib/common/src/misc/webauthn_iframe.ts ***!
+ \**************************************************/
+/*! exports provided: WebAuthnIFrame */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "WebAuthnIFrame", function() { return WebAuthnIFrame; });
+class WebAuthnIFrame {
+ constructor(win, webVaultUrl, webAuthnNewTab, platformUtilsService, i18nService, successCallback, errorCallback, infoCallback) {
+ this.win = win;
+ this.webVaultUrl = webVaultUrl;
+ this.webAuthnNewTab = webAuthnNewTab;
+ this.platformUtilsService = platformUtilsService;
+ this.i18nService = i18nService;
+ this.successCallback = successCallback;
+ this.errorCallback = errorCallback;
+ this.infoCallback = infoCallback;
+ this.iframe = null;
+ this.parseFunction = this.parseMessage.bind(this);
+ this.connectorLink = win.document.createElement('a');
+ }
+ init(data) {
+ const params = new URLSearchParams({
+ data: this.base64Encode(JSON.stringify(data)),
+ parent: encodeURIComponent(this.win.document.location.href),
+ btnText: encodeURIComponent(this.i18nService.t('webAuthnAuthenticate')),
+ v: '1',
+ });
+ if (this.webAuthnNewTab) {
+ // Firefox fallback which opens the webauthn page in a new tab
+ params.append('locale', this.i18nService.translationLocale);
+ this.platformUtilsService.launchUri(`${this.webVaultUrl}/webauthn-fallback-connector.html?${params}`);
+ }
+ else {
+ this.connectorLink.href = `${this.webVaultUrl}/webauthn-connector.html?${params}`;
+ this.iframe = this.win.document.getElementById('webauthn_iframe');
+ this.iframe.allow = 'publickey-credentials-get ' + new URL(this.webVaultUrl).origin;
+ this.iframe.src = this.connectorLink.href;
+ this.win.addEventListener('message', this.parseFunction, false);
+ }
+ }
+ stop() {
+ this.sendMessage('stop');
+ }
+ start() {
+ this.sendMessage('start');
+ }
+ sendMessage(message) {
+ if (!this.iframe || !this.iframe.src || !this.iframe.contentWindow) {
+ return;
+ }
+ this.iframe.contentWindow.postMessage(message, this.iframe.src);
+ }
+ base64Encode(str) {
+ return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, (match, p1) => {
+ return String.fromCharCode(('0x' + p1));
+ }));
+ }
+ cleanup() {
+ this.win.removeEventListener('message', this.parseFunction, false);
+ }
+ parseMessage(event) {
+ if (!this.validMessage(event)) {
+ return;
+ }
+ const parts = event.data.split('|');
+ if (parts[0] === 'success' && this.successCallback) {
+ this.successCallback(parts[1]);
+ }
+ else if (parts[0] === 'error' && this.errorCallback) {
+ this.errorCallback(parts[1]);
+ }
+ else if (parts[0] === 'info' && this.infoCallback) {
+ this.infoCallback(parts[1]);
+ }
+ }
+ validMessage(event) {
+ if (event.origin == null || event.origin === '' || event.origin !== this.connectorLink.origin ||
+ event.data == null || typeof (event.data) !== 'string') {
+ return false;
+ }
+ return event.data.indexOf('success|') === 0 || event.data.indexOf('error|') === 0 ||
+ event.data.indexOf('info|') === 0;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/domain/authResult.ts":
+/*!******************************************************!*\
+ !*** ./jslib/common/src/models/domain/authResult.ts ***!
+ \******************************************************/
+/*! exports provided: AuthResult */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AuthResult", function() { return AuthResult; });
+class AuthResult {
+ constructor() {
+ this.twoFactor = false;
+ this.captchaSiteKey = '';
+ this.resetMasterPassword = false;
+ this.forcePasswordReset = false;
+ this.twoFactorProviders = null;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/domain/domainBase.ts":
+/*!******************************************************!*\
+ !*** ./jslib/common/src/models/domain/domainBase.ts ***!
+ \******************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Domain; });
+/* harmony import */ var _encString__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./encString */ "./jslib/common/src/models/domain/encString.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+class Domain {
+ buildDomainModel(domain, dataObj, map, alreadyEncrypted, notEncList = []) {
+ for (const prop in map) {
+ if (!map.hasOwnProperty(prop)) {
+ continue;
+ }
+ const objProp = dataObj[(map[prop] || prop)];
+ if (alreadyEncrypted === true || notEncList.indexOf(prop) > -1) {
+ domain[prop] = objProp ? objProp : null;
+ }
+ else {
+ domain[prop] = objProp ? new _encString__WEBPACK_IMPORTED_MODULE_0__["EncString"](objProp) : null;
+ }
+ }
+ }
+ buildDataModel(domain, dataObj, map, notEncStringList = []) {
+ for (const prop in map) {
+ if (!map.hasOwnProperty(prop)) {
+ continue;
+ }
+ const objProp = domain[(map[prop] || prop)];
+ if (notEncStringList.indexOf(prop) > -1) {
+ dataObj[prop] = objProp != null ? objProp : null;
+ }
+ else {
+ dataObj[prop] = objProp != null ? objProp.encryptedString : null;
+ }
+ }
+ }
+ decryptObj(viewModel, map, orgId, key = null) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const promises = [];
+ const self = this;
+ for (const prop in map) {
+ if (!map.hasOwnProperty(prop)) {
+ continue;
+ }
+ // tslint:disable-next-line
+ (function (theProp) {
+ const p = Promise.resolve().then(() => {
+ const mapProp = map[theProp] || theProp;
+ if (self[mapProp]) {
+ return self[mapProp].decrypt(orgId, key);
+ }
+ return null;
+ }).then((val) => {
+ viewModel[theProp] = val;
+ });
+ promises.push(p);
+ })(prop);
+ }
+ yield Promise.all(promises);
+ return viewModel;
+ });
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/domain/encString.ts":
+/*!*****************************************************!*\
+ !*** ./jslib/common/src/models/domain/encString.ts ***!
+ \*****************************************************/
+/*! exports provided: EncString */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "EncString", function() { return EncString; });
+/* harmony import */ var _enums_encryptionType__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../enums/encryptionType */ "./jslib/common/src/enums/encryptionType.ts");
+/* harmony import */ var _misc_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../misc/utils */ "./jslib/common/src/misc/utils.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+class EncString {
+ constructor(encryptedStringOrType, data, iv, mac) {
+ if (data != null) {
+ // data and header
+ const encType = encryptedStringOrType;
+ if (iv != null) {
+ this.encryptedString = encType + '.' + iv + '|' + data;
+ }
+ else {
+ this.encryptedString = encType + '.' + data;
+ }
+ // mac
+ if (mac != null) {
+ this.encryptedString += ('|' + mac);
+ }
+ this.encryptionType = encType;
+ this.data = data;
+ this.iv = iv;
+ this.mac = mac;
+ return;
+ }
+ this.encryptedString = encryptedStringOrType;
+ if (!this.encryptedString) {
+ return;
+ }
+ const headerPieces = this.encryptedString.split('.');
+ let encPieces = null;
+ if (headerPieces.length === 2) {
+ try {
+ this.encryptionType = parseInt(headerPieces[0], null);
+ encPieces = headerPieces[1].split('|');
+ }
+ catch (e) {
+ return;
+ }
+ }
+ else {
+ encPieces = this.encryptedString.split('|');
+ this.encryptionType = encPieces.length === 3 ? _enums_encryptionType__WEBPACK_IMPORTED_MODULE_0__["EncryptionType"].AesCbc128_HmacSha256_B64 :
+ _enums_encryptionType__WEBPACK_IMPORTED_MODULE_0__["EncryptionType"].AesCbc256_B64;
+ }
+ switch (this.encryptionType) {
+ case _enums_encryptionType__WEBPACK_IMPORTED_MODULE_0__["EncryptionType"].AesCbc128_HmacSha256_B64:
+ case _enums_encryptionType__WEBPACK_IMPORTED_MODULE_0__["EncryptionType"].AesCbc256_HmacSha256_B64:
+ if (encPieces.length !== 3) {
+ return;
+ }
+ this.iv = encPieces[0];
+ this.data = encPieces[1];
+ this.mac = encPieces[2];
+ break;
+ case _enums_encryptionType__WEBPACK_IMPORTED_MODULE_0__["EncryptionType"].AesCbc256_B64:
+ if (encPieces.length !== 2) {
+ return;
+ }
+ this.iv = encPieces[0];
+ this.data = encPieces[1];
+ break;
+ case _enums_encryptionType__WEBPACK_IMPORTED_MODULE_0__["EncryptionType"].Rsa2048_OaepSha256_B64:
+ case _enums_encryptionType__WEBPACK_IMPORTED_MODULE_0__["EncryptionType"].Rsa2048_OaepSha1_B64:
+ if (encPieces.length !== 1) {
+ return;
+ }
+ this.data = encPieces[0];
+ break;
+ default:
+ return;
+ }
+ }
+ decrypt(orgId, key = null) {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (this.decryptedValue != null) {
+ return this.decryptedValue;
+ }
+ let cryptoService;
+ const containerService = _misc_utils__WEBPACK_IMPORTED_MODULE_1__["Utils"].global.bitwardenContainerService;
+ if (containerService) {
+ cryptoService = containerService.getCryptoService();
+ }
+ else {
+ throw new Error('global bitwardenContainerService not initialized.');
+ }
+ try {
+ if (key == null) {
+ key = yield cryptoService.getOrgKey(orgId);
+ }
+ this.decryptedValue = yield cryptoService.decryptToUtf8(this, key);
+ }
+ catch (e) {
+ this.decryptedValue = '[error: cannot decrypt]';
+ }
+ return this.decryptedValue;
+ });
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/domain/masterPasswordPolicyOptions.ts":
+/*!***********************************************************************!*\
+ !*** ./jslib/common/src/models/domain/masterPasswordPolicyOptions.ts ***!
+ \***********************************************************************/
+/*! exports provided: MasterPasswordPolicyOptions */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MasterPasswordPolicyOptions", function() { return MasterPasswordPolicyOptions; });
+/* harmony import */ var _domainBase__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./domainBase */ "./jslib/common/src/models/domain/domainBase.ts");
+
+class MasterPasswordPolicyOptions extends _domainBase__WEBPACK_IMPORTED_MODULE_0__["default"] {
+ constructor() {
+ super(...arguments);
+ this.minComplexity = 0;
+ this.minLength = 0;
+ this.requireUpper = false;
+ this.requireLower = false;
+ this.requireNumbers = false;
+ this.requireSpecial = false;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/domain/symmetricCryptoKey.ts":
+/*!**************************************************************!*\
+ !*** ./jslib/common/src/models/domain/symmetricCryptoKey.ts ***!
+ \**************************************************************/
+/*! exports provided: SymmetricCryptoKey */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SymmetricCryptoKey", function() { return SymmetricCryptoKey; });
+/* harmony import */ var _enums_encryptionType__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../enums/encryptionType */ "./jslib/common/src/enums/encryptionType.ts");
+/* harmony import */ var _misc_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../misc/utils */ "./jslib/common/src/misc/utils.ts");
+
+
+class SymmetricCryptoKey {
+ constructor(key, encType) {
+ if (key == null) {
+ throw new Error('Must provide key');
+ }
+ if (encType == null) {
+ if (key.byteLength === 32) {
+ encType = _enums_encryptionType__WEBPACK_IMPORTED_MODULE_0__["EncryptionType"].AesCbc256_B64;
+ }
+ else if (key.byteLength === 64) {
+ encType = _enums_encryptionType__WEBPACK_IMPORTED_MODULE_0__["EncryptionType"].AesCbc256_HmacSha256_B64;
+ }
+ else {
+ throw new Error('Unable to determine encType.');
+ }
+ }
+ this.key = key;
+ this.encType = encType;
+ if (encType === _enums_encryptionType__WEBPACK_IMPORTED_MODULE_0__["EncryptionType"].AesCbc256_B64 && key.byteLength === 32) {
+ this.encKey = key;
+ this.macKey = null;
+ }
+ else if (encType === _enums_encryptionType__WEBPACK_IMPORTED_MODULE_0__["EncryptionType"].AesCbc128_HmacSha256_B64 && key.byteLength === 32) {
+ this.encKey = key.slice(0, 16);
+ this.macKey = key.slice(16, 32);
+ }
+ else if (encType === _enums_encryptionType__WEBPACK_IMPORTED_MODULE_0__["EncryptionType"].AesCbc256_HmacSha256_B64 && key.byteLength === 64) {
+ this.encKey = key.slice(0, 32);
+ this.macKey = key.slice(32, 64);
+ }
+ else {
+ throw new Error('Unsupported encType/key length.');
+ }
+ if (this.key != null) {
+ this.keyB64 = _misc_utils__WEBPACK_IMPORTED_MODULE_1__["Utils"].fromBufferToB64(this.key);
+ }
+ if (this.encKey != null) {
+ this.encKeyB64 = _misc_utils__WEBPACK_IMPORTED_MODULE_1__["Utils"].fromBufferToB64(this.encKey);
+ }
+ if (this.macKey != null) {
+ this.macKeyB64 = _misc_utils__WEBPACK_IMPORTED_MODULE_1__["Utils"].fromBufferToB64(this.macKey);
+ }
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/request/account/setCryptoAgentKeyRequest.ts":
+/*!*****************************************************************************!*\
+ !*** ./jslib/common/src/models/request/account/setCryptoAgentKeyRequest.ts ***!
+ \*****************************************************************************/
+/*! exports provided: SetCryptoAgentKeyRequest */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SetCryptoAgentKeyRequest", function() { return SetCryptoAgentKeyRequest; });
+class SetCryptoAgentKeyRequest {
+ constructor(key, kdf, kdfIterations, orgIdentifier, keys) {
+ this.key = key;
+ this.kdf = kdf;
+ this.kdfIterations = kdfIterations;
+ this.orgIdentifier = orgIdentifier;
+ this.keys = keys;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/request/cryptoAgentUserKeyRequest.ts":
+/*!**********************************************************************!*\
+ !*** ./jslib/common/src/models/request/cryptoAgentUserKeyRequest.ts ***!
+ \**********************************************************************/
+/*! exports provided: CryptoAgentUserKeyRequest */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CryptoAgentUserKeyRequest", function() { return CryptoAgentUserKeyRequest; });
+class CryptoAgentUserKeyRequest {
+ constructor(key) {
+ this.key = key;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/request/deviceRequest.ts":
+/*!**********************************************************!*\
+ !*** ./jslib/common/src/models/request/deviceRequest.ts ***!
+ \**********************************************************/
+/*! exports provided: DeviceRequest */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "DeviceRequest", function() { return DeviceRequest; });
+class DeviceRequest {
+ constructor(appId, platformUtilsService) {
+ this.type = platformUtilsService.getDevice();
+ this.name = platformUtilsService.getDeviceString();
+ this.identifier = appId;
+ this.pushToken = null;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/request/keysRequest.ts":
+/*!********************************************************!*\
+ !*** ./jslib/common/src/models/request/keysRequest.ts ***!
+ \********************************************************/
+/*! exports provided: KeysRequest */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "KeysRequest", function() { return KeysRequest; });
+class KeysRequest {
+ constructor(publicKey, encryptedPrivateKey) {
+ this.publicKey = publicKey;
+ this.encryptedPrivateKey = encryptedPrivateKey;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/request/organizationUserResetPasswordEnrollmentRequest.ts":
+/*!*******************************************************************************************!*\
+ !*** ./jslib/common/src/models/request/organizationUserResetPasswordEnrollmentRequest.ts ***!
+ \*******************************************************************************************/
+/*! exports provided: OrganizationUserResetPasswordEnrollmentRequest */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "OrganizationUserResetPasswordEnrollmentRequest", function() { return OrganizationUserResetPasswordEnrollmentRequest; });
+class OrganizationUserResetPasswordEnrollmentRequest {
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/request/organizationUserResetPasswordRequest.ts":
+/*!*********************************************************************************!*\
+ !*** ./jslib/common/src/models/request/organizationUserResetPasswordRequest.ts ***!
+ \*********************************************************************************/
+/*! exports provided: OrganizationUserResetPasswordRequest */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "OrganizationUserResetPasswordRequest", function() { return OrganizationUserResetPasswordRequest; });
+class OrganizationUserResetPasswordRequest {
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/request/passwordHintRequest.ts":
+/*!****************************************************************!*\
+ !*** ./jslib/common/src/models/request/passwordHintRequest.ts ***!
+ \****************************************************************/
+/*! exports provided: PasswordHintRequest */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PasswordHintRequest", function() { return PasswordHintRequest; });
+class PasswordHintRequest {
+ constructor(email) {
+ this.email = email;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/request/passwordVerificationRequest.ts":
+/*!************************************************************************!*\
+ !*** ./jslib/common/src/models/request/passwordVerificationRequest.ts ***!
+ \************************************************************************/
+/*! exports provided: PasswordVerificationRequest */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PasswordVerificationRequest", function() { return PasswordVerificationRequest; });
+class PasswordVerificationRequest {
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/request/preloginRequest.ts":
+/*!************************************************************!*\
+ !*** ./jslib/common/src/models/request/preloginRequest.ts ***!
+ \************************************************************/
+/*! exports provided: PreloginRequest */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PreloginRequest", function() { return PreloginRequest; });
+class PreloginRequest {
+ constructor(email) {
+ this.email = email;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/request/registerRequest.ts":
+/*!************************************************************!*\
+ !*** ./jslib/common/src/models/request/registerRequest.ts ***!
+ \************************************************************/
+/*! exports provided: RegisterRequest */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "RegisterRequest", function() { return RegisterRequest; });
+class RegisterRequest {
+ constructor(email, name, masterPasswordHash, masterPasswordHint, key, kdf, kdfIterations, referenceData, captchaResponse) {
+ this.email = email;
+ this.name = name;
+ this.masterPasswordHash = masterPasswordHash;
+ this.key = key;
+ this.kdf = kdf;
+ this.kdfIterations = kdfIterations;
+ this.referenceData = referenceData;
+ this.captchaResponse = captchaResponse;
+ this.masterPasswordHint = masterPasswordHint ? masterPasswordHint : null;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/request/setPasswordRequest.ts":
+/*!***************************************************************!*\
+ !*** ./jslib/common/src/models/request/setPasswordRequest.ts ***!
+ \***************************************************************/
+/*! exports provided: SetPasswordRequest */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SetPasswordRequest", function() { return SetPasswordRequest; });
+class SetPasswordRequest {
+ constructor(masterPasswordHash, key, masterPasswordHint, kdf, kdfIterations, orgIdentifier, keys) {
+ this.masterPasswordHash = masterPasswordHash;
+ this.key = key;
+ this.masterPasswordHint = masterPasswordHint;
+ this.kdf = kdf;
+ this.kdfIterations = kdfIterations;
+ this.orgIdentifier = orgIdentifier;
+ this.keys = keys;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/request/tokenRequest.ts":
+/*!*********************************************************!*\
+ !*** ./jslib/common/src/models/request/tokenRequest.ts ***!
+ \*********************************************************/
+/*! exports provided: TokenRequest */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TokenRequest", function() { return TokenRequest; });
+/* harmony import */ var _misc_utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../misc/utils */ "./jslib/common/src/misc/utils.ts");
+
+class TokenRequest {
+ constructor(credentials, codes, clientIdClientSecret, provider, token, remember, captchaResponse, device) {
+ this.provider = provider;
+ this.token = token;
+ this.remember = remember;
+ this.captchaResponse = captchaResponse;
+ if (credentials != null && credentials.length > 1) {
+ this.email = credentials[0];
+ this.masterPasswordHash = credentials[1];
+ }
+ else if (codes != null && codes.length > 2) {
+ this.code = codes[0];
+ this.codeVerifier = codes[1];
+ this.redirectUri = codes[2];
+ }
+ else if (clientIdClientSecret != null && clientIdClientSecret.length > 1) {
+ this.clientId = clientIdClientSecret[0];
+ this.clientSecret = clientIdClientSecret[1];
+ }
+ this.device = device != null ? device : null;
+ }
+ toIdentityToken(clientId) {
+ const obj = {
+ scope: 'api offline_access',
+ client_id: clientId,
+ };
+ if (this.clientSecret != null) {
+ obj.scope = clientId.startsWith('organization') ? 'api.organization' : 'api';
+ obj.grant_type = 'client_credentials';
+ obj.client_secret = this.clientSecret;
+ }
+ else if (this.masterPasswordHash != null && this.email != null) {
+ obj.grant_type = 'password';
+ obj.username = this.email;
+ obj.password = this.masterPasswordHash;
+ }
+ else if (this.code != null && this.codeVerifier != null && this.redirectUri != null) {
+ obj.grant_type = 'authorization_code';
+ obj.code = this.code;
+ obj.code_verifier = this.codeVerifier;
+ obj.redirect_uri = this.redirectUri;
+ }
+ else {
+ throw new Error('must provide credentials or codes');
+ }
+ if (this.device) {
+ obj.deviceType = this.device.type;
+ obj.deviceIdentifier = this.device.identifier;
+ obj.deviceName = this.device.name;
+ // no push tokens for browser apps yet
+ // obj.devicePushToken = this.device.pushToken;
+ }
+ if (this.token && this.provider != null) {
+ obj.twoFactorToken = this.token;
+ obj.twoFactorProvider = this.provider;
+ obj.twoFactorRemember = this.remember ? '1' : '0';
+ }
+ if (this.captchaResponse != null) {
+ obj.captchaResponse = this.captchaResponse;
+ }
+ return obj;
+ }
+ alterIdentityTokenHeaders(headers) {
+ if (this.clientSecret == null && this.masterPasswordHash != null && this.email != null) {
+ headers.set('Auth-Email', _misc_utils__WEBPACK_IMPORTED_MODULE_0__["Utils"].fromUtf8ToUrlB64(this.email));
+ }
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/request/twoFactorEmailRequest.ts":
+/*!******************************************************************!*\
+ !*** ./jslib/common/src/models/request/twoFactorEmailRequest.ts ***!
+ \******************************************************************/
+/*! exports provided: TwoFactorEmailRequest */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TwoFactorEmailRequest", function() { return TwoFactorEmailRequest; });
+/* harmony import */ var _passwordVerificationRequest__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./passwordVerificationRequest */ "./jslib/common/src/models/request/passwordVerificationRequest.ts");
+
+class TwoFactorEmailRequest extends _passwordVerificationRequest__WEBPACK_IMPORTED_MODULE_0__["PasswordVerificationRequest"] {
+ constructor(email, masterPasswordHash) {
+ super();
+ this.masterPasswordHash = masterPasswordHash;
+ this.email = email;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/request/updateTempPasswordRequest.ts":
+/*!**********************************************************************!*\
+ !*** ./jslib/common/src/models/request/updateTempPasswordRequest.ts ***!
+ \**********************************************************************/
+/*! exports provided: UpdateTempPasswordRequest */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "UpdateTempPasswordRequest", function() { return UpdateTempPasswordRequest; });
+/* harmony import */ var _organizationUserResetPasswordRequest__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./organizationUserResetPasswordRequest */ "./jslib/common/src/models/request/organizationUserResetPasswordRequest.ts");
+
+class UpdateTempPasswordRequest extends _organizationUserResetPasswordRequest__WEBPACK_IMPORTED_MODULE_0__["OrganizationUserResetPasswordRequest"] {
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/response/baseResponse.ts":
+/*!**********************************************************!*\
+ !*** ./jslib/common/src/models/response/baseResponse.ts ***!
+ \**********************************************************/
+/*! exports provided: BaseResponse */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BaseResponse", function() { return BaseResponse; });
+class BaseResponse {
+ constructor(response) {
+ this.response = response;
+ }
+ getResponseProperty(propertyName, response = null, exactName = false) {
+ if (propertyName == null || propertyName === '') {
+ throw new Error('propertyName must not be null/empty.');
+ }
+ if (response == null && this.response != null) {
+ response = this.response;
+ }
+ if (response == null) {
+ return null;
+ }
+ if (!exactName && response[propertyName] === undefined) {
+ let otherCasePropertyName = null;
+ if (propertyName.charAt(0) === propertyName.charAt(0).toUpperCase()) {
+ otherCasePropertyName = propertyName.charAt(0).toLowerCase();
+ }
+ else {
+ otherCasePropertyName = propertyName.charAt(0).toUpperCase();
+ }
+ if (propertyName.length > 1) {
+ otherCasePropertyName += propertyName.slice(1);
+ }
+ propertyName = otherCasePropertyName;
+ if (response[propertyName] === undefined) {
+ propertyName = propertyName.toLowerCase();
+ }
+ if (response[propertyName] === undefined) {
+ propertyName = propertyName.toUpperCase();
+ }
+ }
+ return response[propertyName];
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/response/errorResponse.ts":
+/*!***********************************************************!*\
+ !*** ./jslib/common/src/models/response/errorResponse.ts ***!
+ \***********************************************************/
+/*! exports provided: ErrorResponse */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ErrorResponse", function() { return ErrorResponse; });
+/* harmony import */ var _misc_utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../misc/utils */ "./jslib/common/src/misc/utils.ts");
+/* harmony import */ var _baseResponse__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./baseResponse */ "./jslib/common/src/models/response/baseResponse.ts");
+
+
+class ErrorResponse extends _baseResponse__WEBPACK_IMPORTED_MODULE_1__["BaseResponse"] {
+ constructor(response, status, identityResponse) {
+ var _a, _b;
+ super(response);
+ let errorModel = null;
+ if (response != null) {
+ const responseErrorModel = this.getResponseProperty('ErrorModel');
+ if (responseErrorModel && identityResponse) {
+ errorModel = responseErrorModel;
+ }
+ else {
+ errorModel = response;
+ }
+ }
+ if (errorModel) {
+ this.message = this.getResponseProperty('Message', errorModel);
+ this.validationErrors = this.getResponseProperty('ValidationErrors', errorModel);
+ this.captchaSiteKey = (_b = (_a = this.validationErrors) === null || _a === void 0 ? void 0 : _a.HCaptcha_SiteKey) === null || _b === void 0 ? void 0 : _b[0];
+ this.captchaRequired = !_misc_utils__WEBPACK_IMPORTED_MODULE_0__["Utils"].isNullOrWhitespace(this.captchaSiteKey);
+ }
+ else {
+ if (status === 429) {
+ this.message = 'Rate limit exceeded. Try again later.';
+ }
+ }
+ this.statusCode = status;
+ }
+ getSingleMessage() {
+ if (this.validationErrors == null) {
+ return this.message;
+ }
+ for (const key in this.validationErrors) {
+ if (!this.validationErrors.hasOwnProperty(key)) {
+ continue;
+ }
+ if (this.validationErrors[key].length) {
+ return this.validationErrors[key][0];
+ }
+ }
+ return this.message;
+ }
+ getAllMessages() {
+ const messages = [];
+ if (this.validationErrors == null) {
+ return messages;
+ }
+ for (const key in this.validationErrors) {
+ if (!this.validationErrors.hasOwnProperty(key)) {
+ continue;
+ }
+ this.validationErrors[key].forEach((item) => {
+ let prefix = '';
+ if (key.indexOf('[') > -1 && key.indexOf(']') > -1) {
+ const lastSep = key.lastIndexOf('.');
+ prefix = key.substr(0, lastSep > -1 ? lastSep : key.length) + ': ';
+ }
+ messages.push(prefix + item);
+ });
+ }
+ return messages;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/view/cardView.ts":
+/*!**************************************************!*\
+ !*** ./jslib/common/src/models/view/cardView.ts ***!
+ \**************************************************/
+/*! exports provided: CardView */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CardView", function() { return CardView; });
+/* harmony import */ var _itemView__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./itemView */ "./jslib/common/src/models/view/itemView.ts");
+/* harmony import */ var _enums_linkedIdType__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../enums/linkedIdType */ "./jslib/common/src/enums/linkedIdType.ts");
+/* harmony import */ var _misc_linkedFieldOption_decorator__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../misc/linkedFieldOption.decorator */ "./jslib/common/src/misc/linkedFieldOption.decorator.ts");
+var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
+ 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;
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
+};
+var __metadata = (undefined && undefined.__metadata) || function (k, v) {
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
+};
+
+
+
+class CardView extends _itemView__WEBPACK_IMPORTED_MODULE_0__["ItemView"] {
+ // tslint:enable
+ constructor(c) {
+ super();
+ this.cardholderName = null;
+ this.expMonth = null;
+ this.expYear = null;
+ this.code = null;
+ // tslint:disable
+ this._brand = null;
+ this._number = null;
+ this._subTitle = null;
+ }
+ get maskedCode() {
+ return this.code != null ? '•'.repeat(this.code.length) : null;
+ }
+ get maskedNumber() {
+ return this.number != null ? '•'.repeat(this.number.length) : null;
+ }
+ get brand() {
+ return this._brand;
+ }
+ set brand(value) {
+ this._brand = value;
+ this._subTitle = null;
+ }
+ get number() {
+ return this._number;
+ }
+ set number(value) {
+ this._number = value;
+ this._subTitle = null;
+ }
+ get subTitle() {
+ if (this._subTitle == null) {
+ this._subTitle = this.brand;
+ if (this.number != null && this.number.length >= 4) {
+ if (this._subTitle != null && this._subTitle !== '') {
+ this._subTitle += ', ';
+ }
+ else {
+ this._subTitle = '';
+ }
+ // Show last 5 on amex, last 4 for all others
+ const count = this.number.length >= 5 && this.number.match(new RegExp('^3[47]')) != null ? 5 : 4;
+ this._subTitle += ('*' + this.number.substr(this.number.length - count));
+ }
+ }
+ return this._subTitle;
+ }
+ get expiration() {
+ if (!this.expMonth && !this.expYear) {
+ return null;
+ }
+ let exp = this.expMonth != null ? ('0' + this.expMonth).slice(-2) : '__';
+ exp += (' / ' + (this.expYear != null ? this.formatYear(this.expYear) : '____'));
+ return exp;
+ }
+ formatYear(year) {
+ return year.length === 2 ? '20' + year : year;
+ }
+}
+__decorate([
+ Object(_misc_linkedFieldOption_decorator__WEBPACK_IMPORTED_MODULE_2__["linkedFieldOption"])(_enums_linkedIdType__WEBPACK_IMPORTED_MODULE_1__["CardLinkedId"].CardholderName),
+ __metadata("design:type", String)
+], CardView.prototype, "cardholderName", void 0);
+__decorate([
+ Object(_misc_linkedFieldOption_decorator__WEBPACK_IMPORTED_MODULE_2__["linkedFieldOption"])(_enums_linkedIdType__WEBPACK_IMPORTED_MODULE_1__["CardLinkedId"].ExpMonth, 'expirationMonth'),
+ __metadata("design:type", String)
+], CardView.prototype, "expMonth", void 0);
+__decorate([
+ Object(_misc_linkedFieldOption_decorator__WEBPACK_IMPORTED_MODULE_2__["linkedFieldOption"])(_enums_linkedIdType__WEBPACK_IMPORTED_MODULE_1__["CardLinkedId"].ExpYear, 'expirationYear'),
+ __metadata("design:type", String)
+], CardView.prototype, "expYear", void 0);
+__decorate([
+ Object(_misc_linkedFieldOption_decorator__WEBPACK_IMPORTED_MODULE_2__["linkedFieldOption"])(_enums_linkedIdType__WEBPACK_IMPORTED_MODULE_1__["CardLinkedId"].Code, 'securityCode'),
+ __metadata("design:type", String)
+], CardView.prototype, "code", void 0);
+__decorate([
+ Object(_misc_linkedFieldOption_decorator__WEBPACK_IMPORTED_MODULE_2__["linkedFieldOption"])(_enums_linkedIdType__WEBPACK_IMPORTED_MODULE_1__["CardLinkedId"].Brand),
+ __metadata("design:type", String),
+ __metadata("design:paramtypes", [String])
+], CardView.prototype, "brand", null);
+__decorate([
+ Object(_misc_linkedFieldOption_decorator__WEBPACK_IMPORTED_MODULE_2__["linkedFieldOption"])(_enums_linkedIdType__WEBPACK_IMPORTED_MODULE_1__["CardLinkedId"].Number),
+ __metadata("design:type", String),
+ __metadata("design:paramtypes", [String])
+], CardView.prototype, "number", null);
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/view/cipherView.ts":
+/*!****************************************************!*\
+ !*** ./jslib/common/src/models/view/cipherView.ts ***!
+ \****************************************************/
+/*! exports provided: CipherView */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CipherView", function() { return CipherView; });
+/* harmony import */ var _enums_cipherRepromptType__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../enums/cipherRepromptType */ "./jslib/common/src/enums/cipherRepromptType.ts");
+/* harmony import */ var _enums_cipherType__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../enums/cipherType */ "./jslib/common/src/enums/cipherType.ts");
+/* harmony import */ var _cardView__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./cardView */ "./jslib/common/src/models/view/cardView.ts");
+/* harmony import */ var _identityView__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./identityView */ "./jslib/common/src/models/view/identityView.ts");
+/* harmony import */ var _loginView__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./loginView */ "./jslib/common/src/models/view/loginView.ts");
+/* harmony import */ var _secureNoteView__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./secureNoteView */ "./jslib/common/src/models/view/secureNoteView.ts");
+
+
+
+
+
+
+class CipherView {
+ constructor(c) {
+ var _a;
+ this.id = null;
+ this.organizationId = null;
+ this.folderId = null;
+ this.name = null;
+ this.notes = null;
+ this.type = null;
+ this.favorite = false;
+ this.organizationUseTotp = false;
+ this.edit = false;
+ this.viewPassword = true;
+ this.login = new _loginView__WEBPACK_IMPORTED_MODULE_4__["LoginView"]();
+ this.identity = new _identityView__WEBPACK_IMPORTED_MODULE_3__["IdentityView"]();
+ this.card = new _cardView__WEBPACK_IMPORTED_MODULE_2__["CardView"]();
+ this.secureNote = new _secureNoteView__WEBPACK_IMPORTED_MODULE_5__["SecureNoteView"]();
+ this.attachments = null;
+ this.fields = null;
+ this.passwordHistory = null;
+ this.collectionIds = null;
+ this.revisionDate = null;
+ this.deletedDate = null;
+ this.reprompt = _enums_cipherRepromptType__WEBPACK_IMPORTED_MODULE_0__["CipherRepromptType"].None;
+ if (!c) {
+ return;
+ }
+ this.id = c.id;
+ this.organizationId = c.organizationId;
+ this.folderId = c.folderId;
+ this.favorite = c.favorite;
+ this.organizationUseTotp = c.organizationUseTotp;
+ this.edit = c.edit;
+ this.viewPassword = c.viewPassword;
+ this.type = c.type;
+ this.localData = c.localData;
+ this.collectionIds = c.collectionIds;
+ this.revisionDate = c.revisionDate;
+ this.deletedDate = c.deletedDate;
+ // Old locally stored ciphers might have reprompt == null. If so set it to None.
+ this.reprompt = (_a = c.reprompt) !== null && _a !== void 0 ? _a : _enums_cipherRepromptType__WEBPACK_IMPORTED_MODULE_0__["CipherRepromptType"].None;
+ }
+ get item() {
+ switch (this.type) {
+ case _enums_cipherType__WEBPACK_IMPORTED_MODULE_1__["CipherType"].Login:
+ return this.login;
+ case _enums_cipherType__WEBPACK_IMPORTED_MODULE_1__["CipherType"].SecureNote:
+ return this.secureNote;
+ case _enums_cipherType__WEBPACK_IMPORTED_MODULE_1__["CipherType"].Card:
+ return this.card;
+ case _enums_cipherType__WEBPACK_IMPORTED_MODULE_1__["CipherType"].Identity:
+ return this.identity;
+ default:
+ break;
+ }
+ return null;
+ }
+ get subTitle() {
+ return this.item.subTitle;
+ }
+ get hasPasswordHistory() {
+ return this.passwordHistory && this.passwordHistory.length > 0;
+ }
+ get hasAttachments() {
+ return this.attachments && this.attachments.length > 0;
+ }
+ get hasOldAttachments() {
+ if (this.hasAttachments) {
+ for (let i = 0; i < this.attachments.length; i++) {
+ if (this.attachments[i].key == null) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+ get hasFields() {
+ return this.fields && this.fields.length > 0;
+ }
+ get passwordRevisionDisplayDate() {
+ if (this.type !== _enums_cipherType__WEBPACK_IMPORTED_MODULE_1__["CipherType"].Login || this.login == null) {
+ return null;
+ }
+ else if (this.login.password == null || this.login.password === '') {
+ return null;
+ }
+ return this.login.passwordRevisionDate;
+ }
+ get isDeleted() {
+ return this.deletedDate != null;
+ }
+ get linkedFieldOptions() {
+ return this.item.linkedFieldOptions;
+ }
+ linkedFieldValue(id) {
+ var _a;
+ const linkedFieldOption = (_a = this.linkedFieldOptions) === null || _a === void 0 ? void 0 : _a.get(id);
+ if (linkedFieldOption == null) {
+ return null;
+ }
+ const item = this.item;
+ return this.item[linkedFieldOption.propertyKey];
+ }
+ linkedFieldI18nKey(id) {
+ var _a;
+ return (_a = this.linkedFieldOptions.get(id)) === null || _a === void 0 ? void 0 : _a.i18nKey;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/view/fieldView.ts":
+/*!***************************************************!*\
+ !*** ./jslib/common/src/models/view/fieldView.ts ***!
+ \***************************************************/
+/*! exports provided: FieldView */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FieldView", function() { return FieldView; });
+class FieldView {
+ constructor(f) {
+ this.name = null;
+ this.value = null;
+ this.type = null;
+ this.newField = false; // Marks if the field is new and hasn't been saved
+ this.showValue = false;
+ this.linkedId = null;
+ if (!f) {
+ return;
+ }
+ this.type = f.type;
+ this.linkedId = f.linkedId;
+ }
+ get maskedValue() {
+ return this.value != null ? '••••••••' : null;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/view/folderView.ts":
+/*!****************************************************!*\
+ !*** ./jslib/common/src/models/view/folderView.ts ***!
+ \****************************************************/
+/*! exports provided: FolderView */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FolderView", function() { return FolderView; });
+class FolderView {
+ constructor(f) {
+ this.id = null;
+ this.name = null;
+ this.revisionDate = null;
+ if (!f) {
+ return;
+ }
+ this.id = f.id;
+ this.revisionDate = f.revisionDate;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/view/identityView.ts":
+/*!******************************************************!*\
+ !*** ./jslib/common/src/models/view/identityView.ts ***!
+ \******************************************************/
+/*! exports provided: IdentityView */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "IdentityView", function() { return IdentityView; });
+/* harmony import */ var _itemView__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./itemView */ "./jslib/common/src/models/view/itemView.ts");
+/* harmony import */ var _misc_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../misc/utils */ "./jslib/common/src/misc/utils.ts");
+/* harmony import */ var _enums_linkedIdType__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../enums/linkedIdType */ "./jslib/common/src/enums/linkedIdType.ts");
+/* harmony import */ var _misc_linkedFieldOption_decorator__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../misc/linkedFieldOption.decorator */ "./jslib/common/src/misc/linkedFieldOption.decorator.ts");
+var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
+ 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;
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
+};
+var __metadata = (undefined && undefined.__metadata) || function (k, v) {
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
+};
+
+
+
+
+class IdentityView extends _itemView__WEBPACK_IMPORTED_MODULE_0__["ItemView"] {
+ // tslint:enable
+ constructor(i) {
+ super();
+ this.title = null;
+ this.middleName = null;
+ this.address1 = null;
+ this.address2 = null;
+ this.address3 = null;
+ this.city = null;
+ this.state = null;
+ this.postalCode = null;
+ this.country = null;
+ this.company = null;
+ this.email = null;
+ this.phone = null;
+ this.ssn = null;
+ this.username = null;
+ this.passportNumber = null;
+ this.licenseNumber = null;
+ // tslint:disable
+ this._firstName = null;
+ this._lastName = null;
+ this._subTitle = null;
+ }
+ get firstName() {
+ return this._firstName;
+ }
+ set firstName(value) {
+ this._firstName = value;
+ this._subTitle = null;
+ }
+ get lastName() {
+ return this._lastName;
+ }
+ set lastName(value) {
+ this._lastName = value;
+ this._subTitle = null;
+ }
+ get subTitle() {
+ if (this._subTitle == null && (this.firstName != null || this.lastName != null)) {
+ this._subTitle = '';
+ if (this.firstName != null) {
+ this._subTitle = this.firstName;
+ }
+ if (this.lastName != null) {
+ if (this._subTitle !== '') {
+ this._subTitle += ' ';
+ }
+ this._subTitle += this.lastName;
+ }
+ }
+ return this._subTitle;
+ }
+ get fullName() {
+ if (this.title != null || this.firstName != null || this.middleName != null || this.lastName != null) {
+ let name = '';
+ if (this.title != null) {
+ name += (this.title + ' ');
+ }
+ if (this.firstName != null) {
+ name += (this.firstName + ' ');
+ }
+ if (this.middleName != null) {
+ name += (this.middleName + ' ');
+ }
+ if (this.lastName != null) {
+ name += this.lastName;
+ }
+ return name.trim();
+ }
+ return null;
+ }
+ get fullAddress() {
+ let address = this.address1;
+ if (!_misc_utils__WEBPACK_IMPORTED_MODULE_1__["Utils"].isNullOrWhitespace(this.address2)) {
+ if (!_misc_utils__WEBPACK_IMPORTED_MODULE_1__["Utils"].isNullOrWhitespace(address)) {
+ address += ', ';
+ }
+ address += this.address2;
+ }
+ if (!_misc_utils__WEBPACK_IMPORTED_MODULE_1__["Utils"].isNullOrWhitespace(this.address3)) {
+ if (!_misc_utils__WEBPACK_IMPORTED_MODULE_1__["Utils"].isNullOrWhitespace(address)) {
+ address += ', ';
+ }
+ address += this.address3;
+ }
+ return address;
+ }
+ get fullAddressPart2() {
+ if (this.city == null && this.state == null && this.postalCode == null) {
+ return null;
+ }
+ const city = this.city || '-';
+ const state = this.state;
+ const postalCode = this.postalCode || '-';
+ let addressPart2 = city;
+ if (!_misc_utils__WEBPACK_IMPORTED_MODULE_1__["Utils"].isNullOrWhitespace(state)) {
+ addressPart2 += ', ' + state;
+ }
+ addressPart2 += ', ' + postalCode;
+ return addressPart2;
+ }
+}
+__decorate([
+ Object(_misc_linkedFieldOption_decorator__WEBPACK_IMPORTED_MODULE_3__["linkedFieldOption"])(_enums_linkedIdType__WEBPACK_IMPORTED_MODULE_2__["IdentityLinkedId"].Title),
+ __metadata("design:type", String)
+], IdentityView.prototype, "title", void 0);
+__decorate([
+ Object(_misc_linkedFieldOption_decorator__WEBPACK_IMPORTED_MODULE_3__["linkedFieldOption"])(_enums_linkedIdType__WEBPACK_IMPORTED_MODULE_2__["IdentityLinkedId"].MiddleName),
+ __metadata("design:type", String)
+], IdentityView.prototype, "middleName", void 0);
+__decorate([
+ Object(_misc_linkedFieldOption_decorator__WEBPACK_IMPORTED_MODULE_3__["linkedFieldOption"])(_enums_linkedIdType__WEBPACK_IMPORTED_MODULE_2__["IdentityLinkedId"].Address1),
+ __metadata("design:type", String)
+], IdentityView.prototype, "address1", void 0);
+__decorate([
+ Object(_misc_linkedFieldOption_decorator__WEBPACK_IMPORTED_MODULE_3__["linkedFieldOption"])(_enums_linkedIdType__WEBPACK_IMPORTED_MODULE_2__["IdentityLinkedId"].Address2),
+ __metadata("design:type", String)
+], IdentityView.prototype, "address2", void 0);
+__decorate([
+ Object(_misc_linkedFieldOption_decorator__WEBPACK_IMPORTED_MODULE_3__["linkedFieldOption"])(_enums_linkedIdType__WEBPACK_IMPORTED_MODULE_2__["IdentityLinkedId"].Address3),
+ __metadata("design:type", String)
+], IdentityView.prototype, "address3", void 0);
+__decorate([
+ Object(_misc_linkedFieldOption_decorator__WEBPACK_IMPORTED_MODULE_3__["linkedFieldOption"])(_enums_linkedIdType__WEBPACK_IMPORTED_MODULE_2__["IdentityLinkedId"].City, 'cityTown'),
+ __metadata("design:type", String)
+], IdentityView.prototype, "city", void 0);
+__decorate([
+ Object(_misc_linkedFieldOption_decorator__WEBPACK_IMPORTED_MODULE_3__["linkedFieldOption"])(_enums_linkedIdType__WEBPACK_IMPORTED_MODULE_2__["IdentityLinkedId"].State, 'stateProvince'),
+ __metadata("design:type", String)
+], IdentityView.prototype, "state", void 0);
+__decorate([
+ Object(_misc_linkedFieldOption_decorator__WEBPACK_IMPORTED_MODULE_3__["linkedFieldOption"])(_enums_linkedIdType__WEBPACK_IMPORTED_MODULE_2__["IdentityLinkedId"].PostalCode, 'zipPostalCode'),
+ __metadata("design:type", String)
+], IdentityView.prototype, "postalCode", void 0);
+__decorate([
+ Object(_misc_linkedFieldOption_decorator__WEBPACK_IMPORTED_MODULE_3__["linkedFieldOption"])(_enums_linkedIdType__WEBPACK_IMPORTED_MODULE_2__["IdentityLinkedId"].Country),
+ __metadata("design:type", String)
+], IdentityView.prototype, "country", void 0);
+__decorate([
+ Object(_misc_linkedFieldOption_decorator__WEBPACK_IMPORTED_MODULE_3__["linkedFieldOption"])(_enums_linkedIdType__WEBPACK_IMPORTED_MODULE_2__["IdentityLinkedId"].Company),
+ __metadata("design:type", String)
+], IdentityView.prototype, "company", void 0);
+__decorate([
+ Object(_misc_linkedFieldOption_decorator__WEBPACK_IMPORTED_MODULE_3__["linkedFieldOption"])(_enums_linkedIdType__WEBPACK_IMPORTED_MODULE_2__["IdentityLinkedId"].Email),
+ __metadata("design:type", String)
+], IdentityView.prototype, "email", void 0);
+__decorate([
+ Object(_misc_linkedFieldOption_decorator__WEBPACK_IMPORTED_MODULE_3__["linkedFieldOption"])(_enums_linkedIdType__WEBPACK_IMPORTED_MODULE_2__["IdentityLinkedId"].Phone),
+ __metadata("design:type", String)
+], IdentityView.prototype, "phone", void 0);
+__decorate([
+ Object(_misc_linkedFieldOption_decorator__WEBPACK_IMPORTED_MODULE_3__["linkedFieldOption"])(_enums_linkedIdType__WEBPACK_IMPORTED_MODULE_2__["IdentityLinkedId"].Ssn),
+ __metadata("design:type", String)
+], IdentityView.prototype, "ssn", void 0);
+__decorate([
+ Object(_misc_linkedFieldOption_decorator__WEBPACK_IMPORTED_MODULE_3__["linkedFieldOption"])(_enums_linkedIdType__WEBPACK_IMPORTED_MODULE_2__["IdentityLinkedId"].Username),
+ __metadata("design:type", String)
+], IdentityView.prototype, "username", void 0);
+__decorate([
+ Object(_misc_linkedFieldOption_decorator__WEBPACK_IMPORTED_MODULE_3__["linkedFieldOption"])(_enums_linkedIdType__WEBPACK_IMPORTED_MODULE_2__["IdentityLinkedId"].PassportNumber),
+ __metadata("design:type", String)
+], IdentityView.prototype, "passportNumber", void 0);
+__decorate([
+ Object(_misc_linkedFieldOption_decorator__WEBPACK_IMPORTED_MODULE_3__["linkedFieldOption"])(_enums_linkedIdType__WEBPACK_IMPORTED_MODULE_2__["IdentityLinkedId"].LicenseNumber),
+ __metadata("design:type", String)
+], IdentityView.prototype, "licenseNumber", void 0);
+__decorate([
+ Object(_misc_linkedFieldOption_decorator__WEBPACK_IMPORTED_MODULE_3__["linkedFieldOption"])(_enums_linkedIdType__WEBPACK_IMPORTED_MODULE_2__["IdentityLinkedId"].FirstName),
+ __metadata("design:type", String),
+ __metadata("design:paramtypes", [String])
+], IdentityView.prototype, "firstName", null);
+__decorate([
+ Object(_misc_linkedFieldOption_decorator__WEBPACK_IMPORTED_MODULE_3__["linkedFieldOption"])(_enums_linkedIdType__WEBPACK_IMPORTED_MODULE_2__["IdentityLinkedId"].LastName),
+ __metadata("design:type", String),
+ __metadata("design:paramtypes", [String])
+], IdentityView.prototype, "lastName", null);
+__decorate([
+ Object(_misc_linkedFieldOption_decorator__WEBPACK_IMPORTED_MODULE_3__["linkedFieldOption"])(_enums_linkedIdType__WEBPACK_IMPORTED_MODULE_2__["IdentityLinkedId"].FullName),
+ __metadata("design:type", String),
+ __metadata("design:paramtypes", [])
+], IdentityView.prototype, "fullName", null);
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/view/itemView.ts":
+/*!**************************************************!*\
+ !*** ./jslib/common/src/models/view/itemView.ts ***!
+ \**************************************************/
+/*! exports provided: ItemView */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ItemView", function() { return ItemView; });
+class ItemView {
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/view/loginUriView.ts":
+/*!******************************************************!*\
+ !*** ./jslib/common/src/models/view/loginUriView.ts ***!
+ \******************************************************/
+/*! exports provided: LoginUriView */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LoginUriView", function() { return LoginUriView; });
+/* harmony import */ var _enums_uriMatchType__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../enums/uriMatchType */ "./jslib/common/src/enums/uriMatchType.ts");
+/* harmony import */ var _misc_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../misc/utils */ "./jslib/common/src/misc/utils.ts");
+
+
+const CanLaunchWhitelist = [
+ 'https://',
+ 'http://',
+ 'ssh://',
+ 'ftp://',
+ 'sftp://',
+ 'irc://',
+ 'vnc://',
+ // https://docs.microsoft.com/en-us/windows-server/remote/remote-desktop-services/clients/remote-desktop-uri
+ 'rdp://',
+ 'ms-rd:',
+ 'chrome://',
+ 'iosapp://',
+ 'androidapp://',
+];
+class LoginUriView {
+ // tslint:enable
+ constructor(u) {
+ this.match = null;
+ // tslint:disable
+ this._uri = null;
+ this._domain = null;
+ this._hostname = null;
+ this._host = null;
+ this._canLaunch = null;
+ if (!u) {
+ return;
+ }
+ this.match = u.match;
+ }
+ get uri() {
+ return this._uri;
+ }
+ set uri(value) {
+ this._uri = value;
+ this._domain = null;
+ this._canLaunch = null;
+ }
+ get domain() {
+ if (this._domain == null && this.uri != null) {
+ this._domain = _misc_utils__WEBPACK_IMPORTED_MODULE_1__["Utils"].getDomain(this.uri);
+ if (this._domain === '') {
+ this._domain = null;
+ }
+ }
+ return this._domain;
+ }
+ get hostname() {
+ if (this.match === _enums_uriMatchType__WEBPACK_IMPORTED_MODULE_0__["UriMatchType"].RegularExpression) {
+ return null;
+ }
+ if (this._hostname == null && this.uri != null) {
+ this._hostname = _misc_utils__WEBPACK_IMPORTED_MODULE_1__["Utils"].getHostname(this.uri);
+ if (this._hostname === '') {
+ this._hostname = null;
+ }
+ }
+ return this._hostname;
+ }
+ get host() {
+ if (this.match === _enums_uriMatchType__WEBPACK_IMPORTED_MODULE_0__["UriMatchType"].RegularExpression) {
+ return null;
+ }
+ if (this._host == null && this.uri != null) {
+ this._host = _misc_utils__WEBPACK_IMPORTED_MODULE_1__["Utils"].getHost(this.uri);
+ if (this._host === '') {
+ this._host = null;
+ }
+ }
+ return this._host;
+ }
+ get hostnameOrUri() {
+ return this.hostname != null ? this.hostname : this.uri;
+ }
+ get hostOrUri() {
+ return this.host != null ? this.host : this.uri;
+ }
+ get isWebsite() {
+ return this.uri != null && (this.uri.indexOf('http://') === 0 || this.uri.indexOf('https://') === 0 ||
+ (this.uri.indexOf('://') < 0 && _misc_utils__WEBPACK_IMPORTED_MODULE_1__["Utils"].tldEndingRegex.test(this.uri)));
+ }
+ get canLaunch() {
+ if (this._canLaunch != null) {
+ return this._canLaunch;
+ }
+ if (this.uri != null && this.match !== _enums_uriMatchType__WEBPACK_IMPORTED_MODULE_0__["UriMatchType"].RegularExpression) {
+ const uri = this.launchUri;
+ for (let i = 0; i < CanLaunchWhitelist.length; i++) {
+ if (uri.indexOf(CanLaunchWhitelist[i]) === 0) {
+ this._canLaunch = true;
+ return this._canLaunch;
+ }
+ }
+ }
+ this._canLaunch = false;
+ return this._canLaunch;
+ }
+ get launchUri() {
+ return this.uri.indexOf('://') < 0 && _misc_utils__WEBPACK_IMPORTED_MODULE_1__["Utils"].tldEndingRegex.test(this.uri) ? ('http://' + this.uri) : this.uri;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/view/loginView.ts":
+/*!***************************************************!*\
+ !*** ./jslib/common/src/models/view/loginView.ts ***!
+ \***************************************************/
+/*! exports provided: LoginView */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LoginView", function() { return LoginView; });
+/* harmony import */ var _itemView__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./itemView */ "./jslib/common/src/models/view/itemView.ts");
+/* harmony import */ var _misc_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../misc/utils */ "./jslib/common/src/misc/utils.ts");
+/* harmony import */ var _enums_linkedIdType__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../enums/linkedIdType */ "./jslib/common/src/enums/linkedIdType.ts");
+/* harmony import */ var _misc_linkedFieldOption_decorator__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../misc/linkedFieldOption.decorator */ "./jslib/common/src/misc/linkedFieldOption.decorator.ts");
+var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
+ 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;
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
+};
+var __metadata = (undefined && undefined.__metadata) || function (k, v) {
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
+};
+
+
+
+
+class LoginView extends _itemView__WEBPACK_IMPORTED_MODULE_0__["ItemView"] {
+ constructor(l) {
+ super();
+ this.username = null;
+ this.password = null;
+ this.passwordRevisionDate = null;
+ this.totp = null;
+ this.uris = null;
+ this.autofillOnPageLoad = null;
+ if (!l) {
+ return;
+ }
+ this.passwordRevisionDate = l.passwordRevisionDate;
+ this.autofillOnPageLoad = l.autofillOnPageLoad;
+ }
+ get uri() {
+ return this.hasUris ? this.uris[0].uri : null;
+ }
+ get maskedPassword() {
+ return this.password != null ? '••••••••' : null;
+ }
+ get subTitle() {
+ return this.username;
+ }
+ get canLaunch() {
+ return this.hasUris && this.uris.some(u => u.canLaunch);
+ }
+ get hasTotp() {
+ return !_misc_utils__WEBPACK_IMPORTED_MODULE_1__["Utils"].isNullOrWhitespace(this.totp);
+ }
+ get launchUri() {
+ if (this.hasUris) {
+ const uri = this.uris.find(u => u.canLaunch);
+ if (uri != null) {
+ return uri.launchUri;
+ }
+ }
+ return null;
+ }
+ get hasUris() {
+ return this.uris != null && this.uris.length > 0;
+ }
+}
+__decorate([
+ Object(_misc_linkedFieldOption_decorator__WEBPACK_IMPORTED_MODULE_3__["linkedFieldOption"])(_enums_linkedIdType__WEBPACK_IMPORTED_MODULE_2__["LoginLinkedId"].Username),
+ __metadata("design:type", String)
+], LoginView.prototype, "username", void 0);
+__decorate([
+ Object(_misc_linkedFieldOption_decorator__WEBPACK_IMPORTED_MODULE_3__["linkedFieldOption"])(_enums_linkedIdType__WEBPACK_IMPORTED_MODULE_2__["LoginLinkedId"].Password),
+ __metadata("design:type", String)
+], LoginView.prototype, "password", void 0);
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/view/secureNoteView.ts":
+/*!********************************************************!*\
+ !*** ./jslib/common/src/models/view/secureNoteView.ts ***!
+ \********************************************************/
+/*! exports provided: SecureNoteView */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SecureNoteView", function() { return SecureNoteView; });
+/* harmony import */ var _itemView__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./itemView */ "./jslib/common/src/models/view/itemView.ts");
+
+class SecureNoteView extends _itemView__WEBPACK_IMPORTED_MODULE_0__["ItemView"] {
+ constructor(n) {
+ super();
+ this.type = null;
+ if (!n) {
+ return;
+ }
+ this.type = n.type;
+ }
+ get subTitle() {
+ return null;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/view/sendFileView.ts":
+/*!******************************************************!*\
+ !*** ./jslib/common/src/models/view/sendFileView.ts ***!
+ \******************************************************/
+/*! exports provided: SendFileView */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SendFileView", function() { return SendFileView; });
+class SendFileView {
+ constructor(f) {
+ this.id = null;
+ this.size = null;
+ this.sizeName = null;
+ this.fileName = null;
+ if (!f) {
+ return;
+ }
+ this.id = f.id;
+ this.size = f.size;
+ this.sizeName = f.sizeName;
+ }
+ get fileSize() {
+ try {
+ if (this.size != null) {
+ return parseInt(this.size, null);
+ }
+ }
+ catch (_a) {
+ // Invalid file size.
+ }
+ return 0;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/view/sendTextView.ts":
+/*!******************************************************!*\
+ !*** ./jslib/common/src/models/view/sendTextView.ts ***!
+ \******************************************************/
+/*! exports provided: SendTextView */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SendTextView", function() { return SendTextView; });
+class SendTextView {
+ constructor(t) {
+ this.text = null;
+ if (!t) {
+ return;
+ }
+ this.hidden = t.hidden;
+ }
+ get maskedText() {
+ return this.text != null ? '••••••••' : null;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/models/view/sendView.ts":
+/*!**************************************************!*\
+ !*** ./jslib/common/src/models/view/sendView.ts ***!
+ \**************************************************/
+/*! exports provided: SendView */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SendView", function() { return SendView; });
+/* harmony import */ var _misc_utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../misc/utils */ "./jslib/common/src/misc/utils.ts");
+/* harmony import */ var _sendFileView__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./sendFileView */ "./jslib/common/src/models/view/sendFileView.ts");
+/* harmony import */ var _sendTextView__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./sendTextView */ "./jslib/common/src/models/view/sendTextView.ts");
+
+
+
+class SendView {
+ constructor(s) {
+ this.id = null;
+ this.accessId = null;
+ this.name = null;
+ this.notes = null;
+ this.type = null;
+ this.text = new _sendTextView__WEBPACK_IMPORTED_MODULE_2__["SendTextView"]();
+ this.file = new _sendFileView__WEBPACK_IMPORTED_MODULE_1__["SendFileView"]();
+ this.maxAccessCount = null;
+ this.accessCount = 0;
+ this.revisionDate = null;
+ this.deletionDate = null;
+ this.expirationDate = null;
+ this.password = null;
+ this.disabled = false;
+ this.hideEmail = false;
+ if (!s) {
+ return;
+ }
+ this.id = s.id;
+ this.accessId = s.accessId;
+ this.type = s.type;
+ this.maxAccessCount = s.maxAccessCount;
+ this.accessCount = s.accessCount;
+ this.revisionDate = s.revisionDate;
+ this.deletionDate = s.deletionDate;
+ this.expirationDate = s.expirationDate;
+ this.disabled = s.disabled;
+ this.password = s.password;
+ this.hideEmail = s.hideEmail;
+ }
+ get urlB64Key() {
+ return _misc_utils__WEBPACK_IMPORTED_MODULE_0__["Utils"].fromBufferToUrlB64(this.key);
+ }
+ get maxAccessCountReached() {
+ if (this.maxAccessCount == null) {
+ return false;
+ }
+ return this.accessCount >= this.maxAccessCount;
+ }
+ get expired() {
+ if (this.expirationDate == null) {
+ return false;
+ }
+ return this.expirationDate <= new Date();
+ }
+ get pendingDelete() {
+ return this.deletionDate <= new Date();
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/services/auth.service.ts":
+/*!***************************************************!*\
+ !*** ./jslib/common/src/services/auth.service.ts ***!
+ \***************************************************/
+/*! exports provided: TwoFactorProviders, AuthService */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TwoFactorProviders", function() { return TwoFactorProviders; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AuthService", function() { return AuthService; });
+/* harmony import */ var _enums_hashPurpose__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../enums/hashPurpose */ "./jslib/common/src/enums/hashPurpose.ts");
+/* harmony import */ var _enums_twoFactorProviderType__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../enums/twoFactorProviderType */ "./jslib/common/src/enums/twoFactorProviderType.ts");
+/* harmony import */ var _models_domain_authResult__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../models/domain/authResult */ "./jslib/common/src/models/domain/authResult.ts");
+/* harmony import */ var _models_domain_symmetricCryptoKey__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../models/domain/symmetricCryptoKey */ "./jslib/common/src/models/domain/symmetricCryptoKey.ts");
+/* harmony import */ var _models_request_account_setCryptoAgentKeyRequest__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../models/request/account/setCryptoAgentKeyRequest */ "./jslib/common/src/models/request/account/setCryptoAgentKeyRequest.ts");
+/* harmony import */ var _models_request_cryptoAgentUserKeyRequest__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../models/request/cryptoAgentUserKeyRequest */ "./jslib/common/src/models/request/cryptoAgentUserKeyRequest.ts");
+/* harmony import */ var _models_request_deviceRequest__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../models/request/deviceRequest */ "./jslib/common/src/models/request/deviceRequest.ts");
+/* harmony import */ var _models_request_keysRequest__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../models/request/keysRequest */ "./jslib/common/src/models/request/keysRequest.ts");
+/* harmony import */ var _models_request_preloginRequest__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../models/request/preloginRequest */ "./jslib/common/src/models/request/preloginRequest.ts");
+/* harmony import */ var _models_request_tokenRequest__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../models/request/tokenRequest */ "./jslib/common/src/models/request/tokenRequest.ts");
+/* harmony import */ var _misc_utils__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../misc/utils */ "./jslib/common/src/misc/utils.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+
+
+
+
+
+
+
+
+
+const TwoFactorProviders = {
+ [_enums_twoFactorProviderType__WEBPACK_IMPORTED_MODULE_1__["TwoFactorProviderType"].Authenticator]: {
+ type: _enums_twoFactorProviderType__WEBPACK_IMPORTED_MODULE_1__["TwoFactorProviderType"].Authenticator,
+ name: null,
+ description: null,
+ priority: 1,
+ sort: 1,
+ premium: false,
+ },
+ [_enums_twoFactorProviderType__WEBPACK_IMPORTED_MODULE_1__["TwoFactorProviderType"].Yubikey]: {
+ type: _enums_twoFactorProviderType__WEBPACK_IMPORTED_MODULE_1__["TwoFactorProviderType"].Yubikey,
+ name: null,
+ description: null,
+ priority: 3,
+ sort: 2,
+ premium: true,
+ },
+ [_enums_twoFactorProviderType__WEBPACK_IMPORTED_MODULE_1__["TwoFactorProviderType"].Duo]: {
+ type: _enums_twoFactorProviderType__WEBPACK_IMPORTED_MODULE_1__["TwoFactorProviderType"].Duo,
+ name: 'Duo',
+ description: null,
+ priority: 2,
+ sort: 3,
+ premium: true,
+ },
+ [_enums_twoFactorProviderType__WEBPACK_IMPORTED_MODULE_1__["TwoFactorProviderType"].OrganizationDuo]: {
+ type: _enums_twoFactorProviderType__WEBPACK_IMPORTED_MODULE_1__["TwoFactorProviderType"].OrganizationDuo,
+ name: 'Duo (Organization)',
+ description: null,
+ priority: 10,
+ sort: 4,
+ premium: false,
+ },
+ [_enums_twoFactorProviderType__WEBPACK_IMPORTED_MODULE_1__["TwoFactorProviderType"].Email]: {
+ type: _enums_twoFactorProviderType__WEBPACK_IMPORTED_MODULE_1__["TwoFactorProviderType"].Email,
+ name: null,
+ description: null,
+ priority: 0,
+ sort: 6,
+ premium: false,
+ },
+ [_enums_twoFactorProviderType__WEBPACK_IMPORTED_MODULE_1__["TwoFactorProviderType"].WebAuthn]: {
+ type: _enums_twoFactorProviderType__WEBPACK_IMPORTED_MODULE_1__["TwoFactorProviderType"].WebAuthn,
+ name: null,
+ description: null,
+ priority: 4,
+ sort: 5,
+ premium: true,
+ },
+};
+class AuthService {
+ constructor(cryptoService, apiService, userService, tokenService, appIdService, i18nService, platformUtilsService, messagingService, vaultTimeoutService, logService, cryptoFunctionService, setCryptoKeys = true) {
+ this.cryptoService = cryptoService;
+ this.apiService = apiService;
+ this.userService = userService;
+ this.tokenService = tokenService;
+ this.appIdService = appIdService;
+ this.i18nService = i18nService;
+ this.platformUtilsService = platformUtilsService;
+ this.messagingService = messagingService;
+ this.vaultTimeoutService = vaultTimeoutService;
+ this.logService = logService;
+ this.cryptoFunctionService = cryptoFunctionService;
+ this.setCryptoKeys = setCryptoKeys;
+ this.selectedTwoFactorProviderType = null;
+ }
+ init() {
+ TwoFactorProviders[_enums_twoFactorProviderType__WEBPACK_IMPORTED_MODULE_1__["TwoFactorProviderType"].Email].name = this.i18nService.t('emailTitle');
+ TwoFactorProviders[_enums_twoFactorProviderType__WEBPACK_IMPORTED_MODULE_1__["TwoFactorProviderType"].Email].description = this.i18nService.t('emailDesc');
+ TwoFactorProviders[_enums_twoFactorProviderType__WEBPACK_IMPORTED_MODULE_1__["TwoFactorProviderType"].Authenticator].name = this.i18nService.t('authenticatorAppTitle');
+ TwoFactorProviders[_enums_twoFactorProviderType__WEBPACK_IMPORTED_MODULE_1__["TwoFactorProviderType"].Authenticator].description =
+ this.i18nService.t('authenticatorAppDesc');
+ TwoFactorProviders[_enums_twoFactorProviderType__WEBPACK_IMPORTED_MODULE_1__["TwoFactorProviderType"].Duo].description = this.i18nService.t('duoDesc');
+ TwoFactorProviders[_enums_twoFactorProviderType__WEBPACK_IMPORTED_MODULE_1__["TwoFactorProviderType"].OrganizationDuo].name =
+ 'Duo (' + this.i18nService.t('organization') + ')';
+ TwoFactorProviders[_enums_twoFactorProviderType__WEBPACK_IMPORTED_MODULE_1__["TwoFactorProviderType"].OrganizationDuo].description =
+ this.i18nService.t('duoOrganizationDesc');
+ TwoFactorProviders[_enums_twoFactorProviderType__WEBPACK_IMPORTED_MODULE_1__["TwoFactorProviderType"].WebAuthn].name = this.i18nService.t('webAuthnTitle');
+ TwoFactorProviders[_enums_twoFactorProviderType__WEBPACK_IMPORTED_MODULE_1__["TwoFactorProviderType"].WebAuthn].description = this.i18nService.t('webAuthnDesc');
+ TwoFactorProviders[_enums_twoFactorProviderType__WEBPACK_IMPORTED_MODULE_1__["TwoFactorProviderType"].Yubikey].name = this.i18nService.t('yubiKeyTitle');
+ TwoFactorProviders[_enums_twoFactorProviderType__WEBPACK_IMPORTED_MODULE_1__["TwoFactorProviderType"].Yubikey].description = this.i18nService.t('yubiKeyDesc');
+ }
+ logIn(email, masterPassword, captchaToken) {
+ return __awaiter(this, void 0, void 0, function* () {
+ this.selectedTwoFactorProviderType = null;
+ const key = yield this.makePreloginKey(masterPassword, email);
+ const hashedPassword = yield this.cryptoService.hashPassword(masterPassword, key);
+ const localHashedPassword = yield this.cryptoService.hashPassword(masterPassword, key, _enums_hashPurpose__WEBPACK_IMPORTED_MODULE_0__["HashPurpose"].LocalAuthorization);
+ return yield this.logInHelper(email, hashedPassword, localHashedPassword, null, null, null, null, null, key, null, null, null, captchaToken, null);
+ });
+ }
+ logInSso(code, codeVerifier, redirectUrl, orgId) {
+ return __awaiter(this, void 0, void 0, function* () {
+ this.selectedTwoFactorProviderType = null;
+ return yield this.logInHelper(null, null, null, code, codeVerifier, redirectUrl, null, null, null, null, null, null, null, orgId);
+ });
+ }
+ logInApiKey(clientId, clientSecret) {
+ return __awaiter(this, void 0, void 0, function* () {
+ this.selectedTwoFactorProviderType = null;
+ return yield this.logInHelper(null, null, null, null, null, null, clientId, clientSecret, null, null, null, null, null, null);
+ });
+ }
+ logInTwoFactor(twoFactorProvider, twoFactorToken, remember) {
+ return __awaiter(this, void 0, void 0, function* () {
+ return yield this.logInHelper(this.email, this.masterPasswordHash, this.localMasterPasswordHash, this.code, this.codeVerifier, this.ssoRedirectUrl, this.clientId, this.clientSecret, this.key, twoFactorProvider, twoFactorToken, remember, this.captchaToken, null);
+ });
+ }
+ logInComplete(email, masterPassword, twoFactorProvider, twoFactorToken, remember, captchaToken) {
+ return __awaiter(this, void 0, void 0, function* () {
+ this.selectedTwoFactorProviderType = null;
+ const key = yield this.makePreloginKey(masterPassword, email);
+ const hashedPassword = yield this.cryptoService.hashPassword(masterPassword, key);
+ const localHashedPassword = yield this.cryptoService.hashPassword(masterPassword, key, _enums_hashPurpose__WEBPACK_IMPORTED_MODULE_0__["HashPurpose"].LocalAuthorization);
+ return yield this.logInHelper(email, hashedPassword, localHashedPassword, null, null, null, null, null, key, twoFactorProvider, twoFactorToken, remember, captchaToken, null);
+ });
+ }
+ logInSsoComplete(code, codeVerifier, redirectUrl, twoFactorProvider, twoFactorToken, remember) {
+ return __awaiter(this, void 0, void 0, function* () {
+ this.selectedTwoFactorProviderType = null;
+ return yield this.logInHelper(null, null, null, code, codeVerifier, redirectUrl, null, null, null, twoFactorProvider, twoFactorToken, remember, null, null);
+ });
+ }
+ logInApiKeyComplete(clientId, clientSecret, twoFactorProvider, twoFactorToken, remember) {
+ return __awaiter(this, void 0, void 0, function* () {
+ this.selectedTwoFactorProviderType = null;
+ return yield this.logInHelper(null, null, null, null, null, null, clientId, clientSecret, null, twoFactorProvider, twoFactorToken, remember, null, null);
+ });
+ }
+ logOut(callback) {
+ callback();
+ this.messagingService.send('loggedOut');
+ }
+ getSupportedTwoFactorProviders(win) {
+ const providers = [];
+ if (this.twoFactorProvidersData == null) {
+ return providers;
+ }
+ if (this.twoFactorProvidersData.has(_enums_twoFactorProviderType__WEBPACK_IMPORTED_MODULE_1__["TwoFactorProviderType"].OrganizationDuo) &&
+ this.platformUtilsService.supportsDuo()) {
+ providers.push(TwoFactorProviders[_enums_twoFactorProviderType__WEBPACK_IMPORTED_MODULE_1__["TwoFactorProviderType"].OrganizationDuo]);
+ }
+ if (this.twoFactorProvidersData.has(_enums_twoFactorProviderType__WEBPACK_IMPORTED_MODULE_1__["TwoFactorProviderType"].Authenticator)) {
+ providers.push(TwoFactorProviders[_enums_twoFactorProviderType__WEBPACK_IMPORTED_MODULE_1__["TwoFactorProviderType"].Authenticator]);
+ }
+ if (this.twoFactorProvidersData.has(_enums_twoFactorProviderType__WEBPACK_IMPORTED_MODULE_1__["TwoFactorProviderType"].Yubikey)) {
+ providers.push(TwoFactorProviders[_enums_twoFactorProviderType__WEBPACK_IMPORTED_MODULE_1__["TwoFactorProviderType"].Yubikey]);
+ }
+ if (this.twoFactorProvidersData.has(_enums_twoFactorProviderType__WEBPACK_IMPORTED_MODULE_1__["TwoFactorProviderType"].Duo) && this.platformUtilsService.supportsDuo()) {
+ providers.push(TwoFactorProviders[_enums_twoFactorProviderType__WEBPACK_IMPORTED_MODULE_1__["TwoFactorProviderType"].Duo]);
+ }
+ if (this.twoFactorProvidersData.has(_enums_twoFactorProviderType__WEBPACK_IMPORTED_MODULE_1__["TwoFactorProviderType"].WebAuthn) && this.platformUtilsService.supportsWebAuthn(win)) {
+ providers.push(TwoFactorProviders[_enums_twoFactorProviderType__WEBPACK_IMPORTED_MODULE_1__["TwoFactorProviderType"].WebAuthn]);
+ }
+ if (this.twoFactorProvidersData.has(_enums_twoFactorProviderType__WEBPACK_IMPORTED_MODULE_1__["TwoFactorProviderType"].Email)) {
+ providers.push(TwoFactorProviders[_enums_twoFactorProviderType__WEBPACK_IMPORTED_MODULE_1__["TwoFactorProviderType"].Email]);
+ }
+ return providers;
+ }
+ getDefaultTwoFactorProvider(webAuthnSupported) {
+ if (this.twoFactorProvidersData == null) {
+ return null;
+ }
+ if (this.selectedTwoFactorProviderType != null &&
+ this.twoFactorProvidersData.has(this.selectedTwoFactorProviderType)) {
+ return this.selectedTwoFactorProviderType;
+ }
+ let providerType = null;
+ let providerPriority = -1;
+ this.twoFactorProvidersData.forEach((value, type) => {
+ const provider = TwoFactorProviders[type];
+ if (provider != null && provider.priority > providerPriority) {
+ if (type === _enums_twoFactorProviderType__WEBPACK_IMPORTED_MODULE_1__["TwoFactorProviderType"].WebAuthn && !webAuthnSupported) {
+ return;
+ }
+ providerType = type;
+ providerPriority = provider.priority;
+ }
+ });
+ return providerType;
+ }
+ makePreloginKey(masterPassword, email) {
+ return __awaiter(this, void 0, void 0, function* () {
+ email = email.trim().toLowerCase();
+ let kdf = null;
+ let kdfIterations = null;
+ try {
+ const preloginResponse = yield this.apiService.postPrelogin(new _models_request_preloginRequest__WEBPACK_IMPORTED_MODULE_8__["PreloginRequest"](email));
+ if (preloginResponse != null) {
+ kdf = preloginResponse.kdf;
+ kdfIterations = preloginResponse.kdfIterations;
+ }
+ }
+ catch (e) {
+ if (e == null || e.statusCode !== 404) {
+ throw e;
+ }
+ }
+ return this.cryptoService.makeKey(masterPassword, email, kdf, kdfIterations);
+ });
+ }
+ authingWithApiKey() {
+ return this.clientId != null && this.clientSecret != null;
+ }
+ authingWithSso() {
+ return this.code != null && this.codeVerifier != null && this.ssoRedirectUrl != null;
+ }
+ authingWithPassword() {
+ return this.email != null && this.masterPasswordHash != null;
+ }
+ logInHelper(email, hashedPassword, localHashedPassword, code, codeVerifier, redirectUrl, clientId, clientSecret, key, twoFactorProvider, twoFactorToken, remember, captchaToken, orgId) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const storedTwoFactorToken = yield this.tokenService.getTwoFactorToken(email);
+ const appId = yield this.appIdService.getAppId();
+ const deviceRequest = new _models_request_deviceRequest__WEBPACK_IMPORTED_MODULE_6__["DeviceRequest"](appId, this.platformUtilsService);
+ let emailPassword = [];
+ let codeCodeVerifier = [];
+ let clientIdClientSecret = [null, null];
+ if (email != null && hashedPassword != null) {
+ emailPassword = [email, hashedPassword];
+ }
+ else {
+ emailPassword = null;
+ }
+ if (code != null && codeVerifier != null && redirectUrl != null) {
+ codeCodeVerifier = [code, codeVerifier, redirectUrl];
+ }
+ else {
+ codeCodeVerifier = null;
+ }
+ if (clientId != null && clientSecret != null) {
+ clientIdClientSecret = [clientId, clientSecret];
+ }
+ else {
+ clientIdClientSecret = null;
+ }
+ let request;
+ if (twoFactorToken != null && twoFactorProvider != null) {
+ request = new _models_request_tokenRequest__WEBPACK_IMPORTED_MODULE_9__["TokenRequest"](emailPassword, codeCodeVerifier, clientIdClientSecret, twoFactorProvider, twoFactorToken, remember, captchaToken, deviceRequest);
+ }
+ else if (storedTwoFactorToken != null) {
+ request = new _models_request_tokenRequest__WEBPACK_IMPORTED_MODULE_9__["TokenRequest"](emailPassword, codeCodeVerifier, clientIdClientSecret, _enums_twoFactorProviderType__WEBPACK_IMPORTED_MODULE_1__["TwoFactorProviderType"].Remember, storedTwoFactorToken, false, captchaToken, deviceRequest);
+ }
+ else {
+ request = new _models_request_tokenRequest__WEBPACK_IMPORTED_MODULE_9__["TokenRequest"](emailPassword, codeCodeVerifier, clientIdClientSecret, null, null, false, captchaToken, deviceRequest);
+ }
+ const response = yield this.apiService.postIdentityToken(request);
+ this.clearState();
+ const result = new _models_domain_authResult__WEBPACK_IMPORTED_MODULE_2__["AuthResult"]();
+ result.captchaSiteKey = response.siteKey;
+ if (!!result.captchaSiteKey) {
+ return result;
+ }
+ result.twoFactor = !!response.twoFactorProviders2;
+ if (result.twoFactor) {
+ // two factor required
+ this.email = email;
+ this.masterPasswordHash = hashedPassword;
+ this.localMasterPasswordHash = localHashedPassword;
+ this.code = code;
+ this.codeVerifier = codeVerifier;
+ this.ssoRedirectUrl = redirectUrl;
+ this.clientId = clientId;
+ this.clientSecret = clientSecret;
+ this.key = this.setCryptoKeys ? key : null;
+ const twoFactorResponse = response;
+ this.twoFactorProvidersData = twoFactorResponse.twoFactorProviders2;
+ result.twoFactorProviders = twoFactorResponse.twoFactorProviders2;
+ this.captchaToken = twoFactorResponse.captchaToken;
+ return result;
+ }
+ const tokenResponse = response;
+ result.resetMasterPassword = tokenResponse.resetMasterPassword;
+ result.forcePasswordReset = tokenResponse.forcePasswordReset;
+ if (tokenResponse.twoFactorToken != null) {
+ yield this.tokenService.setTwoFactorToken(tokenResponse.twoFactorToken, email);
+ }
+ yield this.tokenService.setTokens(tokenResponse.accessToken, tokenResponse.refreshToken, clientIdClientSecret);
+ yield this.userService.setInformation(this.tokenService.getUserId(), this.tokenService.getEmail(), tokenResponse.kdf, tokenResponse.kdfIterations);
+ if (this.setCryptoKeys) {
+ if (key != null) {
+ yield this.cryptoService.setKey(key);
+ }
+ if (localHashedPassword != null) {
+ yield this.cryptoService.setKeyHash(localHashedPassword);
+ }
+ // Skip this step during SSO new user flow. No key is returned from server.
+ if (code == null || tokenResponse.key != null) {
+ if (tokenResponse.cryptoAgentUrl != null) {
+ try {
+ const userKeyResponse = yield this.apiService.getUserKeyFromCryptoAgent(tokenResponse.cryptoAgentUrl);
+ const keyArr = _misc_utils__WEBPACK_IMPORTED_MODULE_10__["Utils"].fromB64ToArray(userKeyResponse.key);
+ const k = new _models_domain_symmetricCryptoKey__WEBPACK_IMPORTED_MODULE_3__["SymmetricCryptoKey"](keyArr);
+ yield this.cryptoService.setKey(k);
+ }
+ catch (e) {
+ this.logService.error(e);
+ throw new Error('Unable to reach crypto agent');
+ }
+ }
+ yield this.cryptoService.setEncKey(tokenResponse.key);
+ // User doesn't have a key pair yet (old account), let's generate one for them
+ if (tokenResponse.privateKey == null) {
+ try {
+ const keyPair = yield this.cryptoService.makeKeyPair();
+ yield this.apiService.postAccountKeys(new _models_request_keysRequest__WEBPACK_IMPORTED_MODULE_7__["KeysRequest"](keyPair[0], keyPair[1].encryptedString));
+ tokenResponse.privateKey = keyPair[1].encryptedString;
+ }
+ catch (e) {
+ this.logService.error(e);
+ }
+ }
+ yield this.cryptoService.setEncPrivateKey(tokenResponse.privateKey);
+ }
+ else if (tokenResponse.cryptoAgentUrl != null) {
+ const password = yield this.cryptoFunctionService.randomBytes(64);
+ const k = yield this.cryptoService.makeKey(_misc_utils__WEBPACK_IMPORTED_MODULE_10__["Utils"].fromBufferToB64(password), this.tokenService.getEmail(), tokenResponse.kdf, tokenResponse.kdfIterations);
+ const cryptoAgentRequest = new _models_request_cryptoAgentUserKeyRequest__WEBPACK_IMPORTED_MODULE_5__["CryptoAgentUserKeyRequest"](k.encKeyB64);
+ yield this.cryptoService.setKey(k);
+ const encKey = yield this.cryptoService.makeEncKey(k);
+ yield this.cryptoService.setEncKey(encKey[1].encryptedString);
+ const [pubKey, privKey] = yield this.cryptoService.makeKeyPair();
+ try {
+ yield this.apiService.postUserKeyToCryptoAgent(tokenResponse.cryptoAgentUrl, cryptoAgentRequest);
+ }
+ catch (e) {
+ throw new Error('Unable to reach crypto agent');
+ }
+ const keys = new _models_request_keysRequest__WEBPACK_IMPORTED_MODULE_7__["KeysRequest"](pubKey, privKey.encryptedString);
+ const setPasswordRequest = new _models_request_account_setCryptoAgentKeyRequest__WEBPACK_IMPORTED_MODULE_4__["SetCryptoAgentKeyRequest"](encKey[1].encryptedString, tokenResponse.kdf, tokenResponse.kdfIterations, orgId, keys);
+ yield this.apiService.postSetCryptoAgentKey(setPasswordRequest);
+ }
+ }
+ if (this.vaultTimeoutService != null) {
+ this.vaultTimeoutService.biometricLocked = false;
+ }
+ this.messagingService.send('loggedIn');
+ return result;
+ });
+ }
+ clearState() {
+ this.key = null;
+ this.email = null;
+ this.masterPasswordHash = null;
+ this.localMasterPasswordHash = null;
+ this.code = null;
+ this.codeVerifier = null;
+ this.ssoRedirectUrl = null;
+ this.clientId = null;
+ this.clientSecret = null;
+ this.twoFactorProvidersData = null;
+ this.selectedTwoFactorProviderType = null;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/services/broadcaster.service.ts":
+/*!**********************************************************!*\
+ !*** ./jslib/common/src/services/broadcaster.service.ts ***!
+ \**********************************************************/
+/*! exports provided: BroadcasterService */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BroadcasterService", function() { return BroadcasterService; });
+class BroadcasterService {
+ constructor() {
+ this.subscribers = new Map();
+ }
+ send(message, id) {
+ if (id != null) {
+ if (this.subscribers.has(id)) {
+ this.subscribers.get(id)(message);
+ }
+ return;
+ }
+ this.subscribers.forEach(value => {
+ value(message);
+ });
+ }
+ subscribe(id, messageCallback) {
+ this.subscribers.set(id, messageCallback);
+ }
+ unsubscribe(id) {
+ if (this.subscribers.has(id)) {
+ this.subscribers.delete(id);
+ }
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/services/constants.service.ts":
+/*!********************************************************!*\
+ !*** ./jslib/common/src/services/constants.service.ts ***!
+ \********************************************************/
+/*! exports provided: ConstantsService */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ConstantsService", function() { return ConstantsService; });
+class ConstantsService {
+ constructor() {
+ this.environmentUrlsKey = ConstantsService.environmentUrlsKey;
+ this.disableGaKey = ConstantsService.disableGaKey;
+ this.disableAddLoginNotificationKey = ConstantsService.disableAddLoginNotificationKey;
+ this.disableContextMenuItemKey = ConstantsService.disableContextMenuItemKey;
+ this.disableFaviconKey = ConstantsService.disableFaviconKey;
+ this.disableBadgeCounterKey = ConstantsService.disableBadgeCounterKey;
+ this.disableAutoTotpCopyKey = ConstantsService.disableAutoTotpCopyKey;
+ this.disableAutoBiometricsPromptKey = ConstantsService.disableAutoBiometricsPromptKey;
+ this.enableAutoFillOnPageLoadKey = ConstantsService.enableAutoFillOnPageLoadKey;
+ this.autoFillOnPageLoadDefaultKey = ConstantsService.autoFillOnPageLoadDefaultKey;
+ this.vaultTimeoutKey = ConstantsService.vaultTimeoutKey;
+ this.vaultTimeoutActionKey = ConstantsService.vaultTimeoutActionKey;
+ this.lastActiveKey = ConstantsService.lastActiveKey;
+ this.neverDomainsKey = ConstantsService.neverDomainsKey;
+ this.installedVersionKey = ConstantsService.installedVersionKey;
+ this.localeKey = ConstantsService.localeKey;
+ this.themeKey = ConstantsService.themeKey;
+ this.collapsedGroupingsKey = ConstantsService.collapsedGroupingsKey;
+ this.autoConfirmFingerprints = ConstantsService.autoConfirmFingerprints;
+ this.dontShowCardsCurrentTab = ConstantsService.dontShowCardsCurrentTab;
+ this.dontShowIdentitiesCurrentTab = ConstantsService.dontShowIdentitiesCurrentTab;
+ this.defaultUriMatch = ConstantsService.defaultUriMatch;
+ this.pinProtectedKey = ConstantsService.pinProtectedKey;
+ this.protectedPin = ConstantsService.protectedPin;
+ this.clearClipboardKey = ConstantsService.clearClipboardKey;
+ this.eventCollectionKey = ConstantsService.eventCollectionKey;
+ this.ssoCodeVerifierKey = ConstantsService.ssoCodeVerifierKey;
+ this.ssoStateKey = ConstantsService.ssoStateKey;
+ this.biometricUnlockKey = ConstantsService.biometricUnlockKey;
+ this.biometricText = ConstantsService.biometricText;
+ this.biometricAwaitingAcceptance = ConstantsService.biometricAwaitingAcceptance;
+ this.biometricFingerprintValidated = ConstantsService.biometricFingerprintValidated;
+ }
+}
+ConstantsService.environmentUrlsKey = 'environmentUrls';
+ConstantsService.disableGaKey = 'disableGa';
+ConstantsService.disableAddLoginNotificationKey = 'disableAddLoginNotification';
+ConstantsService.disableChangedPasswordNotificationKey = 'disableChangedPasswordNotification';
+ConstantsService.disableContextMenuItemKey = 'disableContextMenuItem';
+ConstantsService.disableFaviconKey = 'disableFavicon';
+ConstantsService.disableBadgeCounterKey = 'disableBadgeCounter';
+ConstantsService.disableAutoTotpCopyKey = 'disableAutoTotpCopy';
+ConstantsService.disableAutoBiometricsPromptKey = 'noAutoPromptBiometrics';
+ConstantsService.enableAutoFillOnPageLoadKey = 'enableAutoFillOnPageLoad';
+ConstantsService.autoFillOnPageLoadDefaultKey = 'autoFillOnPageLoadDefault';
+ConstantsService.vaultTimeoutKey = 'lockOption';
+ConstantsService.vaultTimeoutActionKey = 'vaultTimeoutAction';
+ConstantsService.lastActiveKey = 'lastActive';
+ConstantsService.neverDomainsKey = 'neverDomains';
+ConstantsService.installedVersionKey = 'installedVersion';
+ConstantsService.localeKey = 'locale';
+ConstantsService.themeKey = 'theme';
+ConstantsService.collapsedGroupingsKey = 'collapsedGroupings';
+ConstantsService.autoConfirmFingerprints = 'autoConfirmFingerprints';
+ConstantsService.dontShowCardsCurrentTab = 'dontShowCardsCurrentTab';
+ConstantsService.dontShowIdentitiesCurrentTab = 'dontShowIdentitiesCurrentTab';
+ConstantsService.defaultUriMatch = 'defaultUriMatch';
+ConstantsService.pinProtectedKey = 'pinProtectedKey';
+ConstantsService.protectedPin = 'protectedPin';
+ConstantsService.clearClipboardKey = 'clearClipboardKey';
+ConstantsService.eventCollectionKey = 'eventCollection';
+ConstantsService.ssoCodeVerifierKey = 'ssoCodeVerifier';
+ConstantsService.ssoStateKey = 'ssoState';
+ConstantsService.biometricUnlockKey = 'biometric';
+ConstantsService.biometricText = 'biometricText';
+ConstantsService.biometricAwaitingAcceptance = 'biometricAwaitingAcceptance';
+ConstantsService.biometricFingerprintValidated = 'biometricFingerprintValidated';
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/services/search.service.ts":
+/*!*****************************************************!*\
+ !*** ./jslib/common/src/services/search.service.ts ***!
+ \*****************************************************/
+/*! exports provided: SearchService */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SearchService", function() { return SearchService; });
+/* harmony import */ var lunr__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lunr */ "./node_modules/lunr/lunr.js");
+/* harmony import */ var lunr__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(lunr__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var _enums_cipherType__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../enums/cipherType */ "./jslib/common/src/enums/cipherType.ts");
+/* harmony import */ var _enums_fieldType__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../enums/fieldType */ "./jslib/common/src/enums/fieldType.ts");
+/* harmony import */ var _enums_uriMatchType__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../enums/uriMatchType */ "./jslib/common/src/enums/uriMatchType.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+
+
+class SearchService {
+ constructor(cipherService, logService, i18nService) {
+ this.cipherService = cipherService;
+ this.logService = logService;
+ this.i18nService = i18nService;
+ this.indexedEntityId = null;
+ this.indexing = false;
+ this.index = null;
+ this.searchableMinLength = 2;
+ if (['zh-CN', 'zh-TW'].indexOf(i18nService.locale) !== -1) {
+ this.searchableMinLength = 1;
+ }
+ }
+ clearIndex() {
+ this.indexedEntityId = null;
+ this.index = null;
+ }
+ isSearchable(query) {
+ const notSearchable = query == null || (this.index == null && query.length < this.searchableMinLength) ||
+ (this.index != null && query.length < this.searchableMinLength && query.indexOf('>') !== 0);
+ return !notSearchable;
+ }
+ indexCiphers(indexedEntityId, ciphers) {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (this.indexing) {
+ return;
+ }
+ this.logService.time('search indexing');
+ this.indexing = true;
+ this.indexedEntityId = indexedEntityId;
+ this.index = null;
+ const builder = new lunr__WEBPACK_IMPORTED_MODULE_0__["Builder"]();
+ builder.ref('id');
+ builder.field('shortid', { boost: 100, extractor: (c) => c.id.substr(0, 8) });
+ builder.field('name', { boost: 10 });
+ builder.field('subtitle', {
+ boost: 5,
+ extractor: (c) => {
+ if (c.subTitle != null && c.type === _enums_cipherType__WEBPACK_IMPORTED_MODULE_1__["CipherType"].Card) {
+ return c.subTitle.replace(/\*/g, '');
+ }
+ return c.subTitle;
+ },
+ });
+ builder.field('notes');
+ builder.field('login.username', {
+ extractor: (c) => c.type === _enums_cipherType__WEBPACK_IMPORTED_MODULE_1__["CipherType"].Login && c.login != null ? c.login.username : null,
+ });
+ builder.field('login.uris', { boost: 2, extractor: (c) => this.uriExtractor(c) });
+ builder.field('fields', { extractor: (c) => this.fieldExtractor(c, false) });
+ builder.field('fields_joined', { extractor: (c) => this.fieldExtractor(c, true) });
+ builder.field('attachments', { extractor: (c) => this.attachmentExtractor(c, false) });
+ builder.field('attachments_joined', { extractor: (c) => this.attachmentExtractor(c, true) });
+ builder.field('organizationid', { extractor: (c) => c.organizationId });
+ ciphers = ciphers || (yield this.cipherService.getAllDecrypted());
+ ciphers.forEach(c => builder.add(c));
+ this.index = builder.build();
+ this.indexing = false;
+ this.logService.timeEnd('search indexing');
+ });
+ }
+ searchCiphers(query, filter = null, ciphers = null) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const results = [];
+ if (query != null) {
+ query = query.trim().toLowerCase();
+ }
+ if (query === '') {
+ query = null;
+ }
+ if (ciphers == null) {
+ ciphers = yield this.cipherService.getAllDecrypted();
+ }
+ if (filter != null && Array.isArray(filter) && filter.length > 0) {
+ ciphers = ciphers.filter(c => filter.every(f => f == null || f(c)));
+ }
+ else if (filter != null) {
+ ciphers = ciphers.filter(filter);
+ }
+ if (!this.isSearchable(query)) {
+ return ciphers;
+ }
+ if (this.indexing) {
+ yield new Promise(r => setTimeout(r, 250));
+ if (this.indexing) {
+ yield new Promise(r => setTimeout(r, 500));
+ }
+ }
+ const index = this.getIndexForSearch();
+ if (index == null) {
+ // Fall back to basic search if index is not available
+ return this.searchCiphersBasic(ciphers, query);
+ }
+ const ciphersMap = new Map();
+ ciphers.forEach(c => ciphersMap.set(c.id, c));
+ let searchResults = null;
+ const isQueryString = query != null && query.length > 1 && query.indexOf('>') === 0;
+ if (isQueryString) {
+ try {
+ searchResults = index.search(query.substr(1).trim());
+ }
+ catch (e) {
+ this.logService.error(e);
+ }
+ }
+ else {
+ // tslint:disable-next-line
+ const soWild = lunr__WEBPACK_IMPORTED_MODULE_0__["Query"].wildcard.LEADING | lunr__WEBPACK_IMPORTED_MODULE_0__["Query"].wildcard.TRAILING;
+ searchResults = index.query(q => {
+ lunr__WEBPACK_IMPORTED_MODULE_0__["tokenizer"](query).forEach(token => {
+ const t = token.toString();
+ q.term(t, { fields: ['name'], wildcard: soWild });
+ q.term(t, { fields: ['subtitle'], wildcard: soWild });
+ q.term(t, { fields: ['login.uris'], wildcard: soWild });
+ q.term(t, {});
+ });
+ });
+ }
+ if (searchResults != null) {
+ searchResults.forEach(r => {
+ if (ciphersMap.has(r.ref)) {
+ results.push(ciphersMap.get(r.ref));
+ }
+ });
+ }
+ return results;
+ });
+ }
+ searchCiphersBasic(ciphers, query, deleted = false) {
+ query = query.trim().toLowerCase();
+ return ciphers.filter(c => {
+ if (deleted !== c.isDeleted) {
+ return false;
+ }
+ if (c.name != null && c.name.toLowerCase().indexOf(query) > -1) {
+ return true;
+ }
+ if (query.length >= 8 && c.id.startsWith(query)) {
+ return true;
+ }
+ if (c.subTitle != null && c.subTitle.toLowerCase().indexOf(query) > -1) {
+ return true;
+ }
+ if (c.login && c.login.uri != null && c.login.uri.toLowerCase().indexOf(query) > -1) {
+ return true;
+ }
+ return false;
+ });
+ }
+ searchSends(sends, query) {
+ query = query.trim().toLocaleLowerCase();
+ return sends.filter(s => {
+ var _a, _b, _c;
+ if (s.name != null && s.name.toLowerCase().indexOf(query) > -1) {
+ return true;
+ }
+ if (query.length >= 8 && (s.id.startsWith(query) || s.accessId.toLocaleLowerCase().startsWith(query) || (((_a = s.file) === null || _a === void 0 ? void 0 : _a.id) != null && s.file.id.startsWith(query)))) {
+ return true;
+ }
+ if (s.notes != null && s.notes.toLowerCase().indexOf(query) > -1) {
+ return true;
+ }
+ if (((_b = s.text) === null || _b === void 0 ? void 0 : _b.text) != null && s.text.text.toLowerCase().indexOf(query) > -1) {
+ return true;
+ }
+ if (((_c = s.file) === null || _c === void 0 ? void 0 : _c.fileName) != null && s.file.fileName.toLowerCase().indexOf(query) > -1) {
+ return true;
+ }
+ });
+ }
+ getIndexForSearch() {
+ return this.index;
+ }
+ fieldExtractor(c, joined) {
+ if (!c.hasFields) {
+ return null;
+ }
+ let fields = [];
+ c.fields.forEach(f => {
+ if (f.name != null) {
+ fields.push(f.name);
+ }
+ if (f.type === _enums_fieldType__WEBPACK_IMPORTED_MODULE_2__["FieldType"].Text && f.value != null) {
+ fields.push(f.value);
+ }
+ });
+ fields = fields.filter(f => f.trim() !== '');
+ if (fields.length === 0) {
+ return null;
+ }
+ return joined ? fields.join(' ') : fields;
+ }
+ attachmentExtractor(c, joined) {
+ if (!c.hasAttachments) {
+ return null;
+ }
+ let attachments = [];
+ c.attachments.forEach(a => {
+ if (a != null && a.fileName != null) {
+ if (joined && a.fileName.indexOf('.') > -1) {
+ attachments.push(a.fileName.substr(0, a.fileName.lastIndexOf('.')));
+ }
+ else {
+ attachments.push(a.fileName);
+ }
+ }
+ });
+ attachments = attachments.filter(f => f.trim() !== '');
+ if (attachments.length === 0) {
+ return null;
+ }
+ return joined ? attachments.join(' ') : attachments;
+ }
+ uriExtractor(c) {
+ if (c.type !== _enums_cipherType__WEBPACK_IMPORTED_MODULE_1__["CipherType"].Login || c.login == null || !c.login.hasUris) {
+ return null;
+ }
+ const uris = [];
+ c.login.uris.forEach(u => {
+ if (u.uri == null || u.uri === '') {
+ return;
+ }
+ if (u.hostname != null) {
+ uris.push(u.hostname);
+ return;
+ }
+ let uri = u.uri;
+ if (u.match !== _enums_uriMatchType__WEBPACK_IMPORTED_MODULE_3__["UriMatchType"].RegularExpression) {
+ const protocolIndex = uri.indexOf('://');
+ if (protocolIndex > -1) {
+ uri = uri.substr(protocolIndex + 3);
+ }
+ const queryIndex = uri.search(/\?|&|#/);
+ if (queryIndex > -1) {
+ uri = uri.substring(0, queryIndex);
+ }
+ }
+ uris.push(uri);
+ });
+ return uris.length > 0 ? uris : null;
+ }
+}
+
+
+/***/ }),
+
+/***/ "./jslib/common/src/services/state.service.ts":
+/*!****************************************************!*\
+ !*** ./jslib/common/src/services/state.service.ts ***!
+ \****************************************************/
+/*! exports provided: StateService */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "StateService", function() { return StateService; });
+class StateService {
+ constructor() {
+ this.state = {};
+ }
+ get(key) {
+ if (this.state.hasOwnProperty(key)) {
+ return Promise.resolve(this.state[key]);
+ }
+ return Promise.resolve(null);
+ }
+ save(key, obj) {
+ this.state[key] = obj;
+ return Promise.resolve();
+ }
+ remove(key) {
+ delete this.state[key];
+ return Promise.resolve();
+ }
+ purge() {
+ this.state = {};
+ return Promise.resolve();
+ }
+}
+
+
+/***/ }),
+
+/***/ "./src/browser/browserApi.ts":
+/*!***********************************!*\
+ !*** ./src/browser/browserApi.ts ***!
+ \***********************************/
+/*! exports provided: BrowserApi */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BrowserApi", function() { return BrowserApi; });
+/* harmony import */ var _safariApp__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./safariApp */ "./src/browser/safariApp.ts");
+/* harmony import */ var jslib_common_misc_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! jslib-common/misc/utils */ "./jslib/common/src/misc/utils.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+class BrowserApi {
+ static getTabFromCurrentWindowId() {
+ return __awaiter(this, void 0, void 0, function* () {
+ return yield BrowserApi.tabsQueryFirst({
+ active: true,
+ windowId: chrome.windows.WINDOW_ID_CURRENT,
+ });
+ });
+ }
+ static getTabFromCurrentWindow() {
+ return __awaiter(this, void 0, void 0, function* () {
+ return yield BrowserApi.tabsQueryFirst({
+ active: true,
+ currentWindow: true,
+ });
+ });
+ }
+ static getActiveTabs() {
+ return __awaiter(this, void 0, void 0, function* () {
+ return yield BrowserApi.tabsQuery({
+ active: true,
+ });
+ });
+ }
+ static tabsQuery(options) {
+ return __awaiter(this, void 0, void 0, function* () {
+ return new Promise(resolve => {
+ chrome.tabs.query(options, (tabs) => {
+ resolve(tabs);
+ });
+ });
+ });
+ }
+ static tabsQueryFirst(options) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const tabs = yield BrowserApi.tabsQuery(options);
+ if (tabs.length > 0) {
+ return tabs[0];
+ }
+ return null;
+ });
+ }
+ static tabSendMessageData(tab, command, data = null) {
+ const obj = {
+ command: command,
+ };
+ if (data != null) {
+ obj.data = data;
+ }
+ return BrowserApi.tabSendMessage(tab, obj);
+ }
+ static tabSendMessage(tab, obj, options = null) {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (!tab || !tab.id) {
+ return;
+ }
+ return new Promise(resolve => {
+ chrome.tabs.sendMessage(tab.id, obj, options, () => {
+ if (chrome.runtime.lastError) {
+ // Some error happened
+ }
+ resolve();
+ });
+ });
+ });
+ }
+ static getBackgroundPage() {
+ return chrome.extension.getBackgroundPage();
+ }
+ static getApplicationVersion() {
+ return chrome.runtime.getManifest().version;
+ }
+ static isPopupOpen() {
+ return __awaiter(this, void 0, void 0, function* () {
+ return Promise.resolve(chrome.extension.getViews({ type: 'popup' }).length > 0);
+ });
+ }
+ static createNewTab(url, extensionPage = false, active = true) {
+ chrome.tabs.create({ url: url, active: active });
+ }
+ static messageListener(name, callback) {
+ chrome.runtime.onMessage.addListener((msg, sender, response) => {
+ callback(msg, sender, response);
+ });
+ }
+ static closeLoginTab() {
+ return __awaiter(this, void 0, void 0, function* () {
+ const tabs = yield BrowserApi.tabsQuery({
+ active: true,
+ title: 'Bitwarden',
+ windowType: 'normal',
+ currentWindow: true,
+ });
+ if (tabs.length === 0) {
+ return;
+ }
+ const tabToClose = tabs[tabs.length - 1].id;
+ chrome.tabs.remove(tabToClose);
+ });
+ }
+ static focusSpecifiedTab(tabId) {
+ return __awaiter(this, void 0, void 0, function* () {
+ chrome.tabs.update(tabId, { active: true, highlighted: true });
+ });
+ }
+ static closePopup(win) {
+ if (BrowserApi.isWebExtensionsApi && BrowserApi.isFirefoxOnAndroid) {
+ // Reactivating the active tab dismisses the popup tab. The promise final
+ // condition is only called if the popup wasn't already dismissed (future proofing).
+ // ref: https://bugzilla.mozilla.org/show_bug.cgi?id=1433604
+ browser.tabs.update({ active: true }).finally(win.close);
+ }
+ else {
+ win.close();
+ }
+ }
+ static downloadFile(win, blobData, blobOptions, fileName) {
+ if (BrowserApi.isSafariApi) {
+ const type = blobOptions != null ? blobOptions.type : null;
+ let data = null;
+ if (type === 'text/plain' && typeof (blobData) === 'string') {
+ data = blobData;
+ }
+ else {
+ data = jslib_common_misc_utils__WEBPACK_IMPORTED_MODULE_1__["Utils"].fromBufferToB64(blobData);
+ }
+ _safariApp__WEBPACK_IMPORTED_MODULE_0__["SafariApp"].sendMessageToApp('downloadFile', JSON.stringify({
+ blobData: data,
+ blobOptions: blobOptions,
+ fileName: fileName,
+ }), true);
+ }
+ else {
+ const blob = new Blob([blobData], blobOptions);
+ if (navigator.msSaveOrOpenBlob) {
+ navigator.msSaveBlob(blob, fileName);
+ }
+ else {
+ const a = win.document.createElement('a');
+ a.href = URL.createObjectURL(blob);
+ a.download = fileName;
+ win.document.body.appendChild(a);
+ a.click();
+ win.document.body.removeChild(a);
+ }
+ }
+ }
+ static gaFilter() {
+ return "development" !== 'production';
+ }
+ static getUILanguage(win) {
+ return chrome.i18n.getUILanguage();
+ }
+ static reloadExtension(win) {
+ if (win != null) {
+ return win.location.reload(true);
+ }
+ else {
+ return chrome.runtime.reload();
+ }
+ }
+ static reloadOpenWindows() {
+ const views = chrome.extension.getViews();
+ views.filter(w => w.location.href != null).forEach(w => {
+ w.location.reload();
+ });
+ }
+ static connectNative(application) {
+ if (BrowserApi.isWebExtensionsApi) {
+ return browser.runtime.connectNative(application);
+ }
+ else if (BrowserApi.isChromeApi) {
+ return chrome.runtime.connectNative(application);
+ }
+ }
+ static requestPermission(permission) {
+ if (BrowserApi.isWebExtensionsApi) {
+ return browser.permissions.request(permission);
+ }
+ return new Promise((resolve, reject) => {
+ chrome.permissions.request(permission, resolve);
+ });
+ }
+ static getPlatformInfo() {
+ if (BrowserApi.isWebExtensionsApi) {
+ return browser.runtime.getPlatformInfo();
+ }
+ return new Promise(resolve => {
+ chrome.runtime.getPlatformInfo(resolve);
+ });
+ }
+}
+BrowserApi.isWebExtensionsApi = (typeof browser !== 'undefined');
+BrowserApi.isSafariApi = navigator.userAgent.indexOf(' Safari/') !== -1 &&
+ navigator.userAgent.indexOf(' Chrome/') === -1 &&
+ navigator.userAgent.indexOf(' Chromium/') === -1;
+BrowserApi.isChromeApi = !BrowserApi.isSafariApi && (typeof chrome !== 'undefined');
+BrowserApi.isFirefoxOnAndroid = navigator.userAgent.indexOf('Firefox/') !== -1 &&
+ navigator.userAgent.indexOf('Android') !== -1;
+
+
+/***/ }),
+
+/***/ "./src/browser/safariApp.ts":
+/*!**********************************!*\
+ !*** ./src/browser/safariApp.ts ***!
+ \**********************************/
+/*! exports provided: SafariApp */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SafariApp", function() { return SafariApp; });
+/* harmony import */ var _browserApi__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./browserApi */ "./src/browser/browserApi.ts");
+
+class SafariApp {
+ static sendMessageToApp(command, data = null, resolveNow = false) {
+ if (!_browserApi__WEBPACK_IMPORTED_MODULE_0__["BrowserApi"].isSafariApi) {
+ return Promise.resolve(null);
+ }
+ return new Promise(resolve => {
+ const now = new Date();
+ const messageId = now.getTime().toString() + '_' + Math.floor(Math.random() * Number.MAX_SAFE_INTEGER);
+ browser.runtime.sendNativeMessage('com.bitwarden.desktop', {
+ id: messageId,
+ command: command,
+ data: data,
+ responseData: null,
+ }, (response) => {
+ resolve(response);
+ });
+ });
+ }
+}
+
+
+/***/ }),
+
+/***/ "./src/popup/accounts/environment.component.ts":
+/*!*****************************************************!*\
+ !*** ./src/popup/accounts/environment.component.ts ***!
+ \*****************************************************/
+/*! exports provided: EnvironmentComponent */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "EnvironmentComponent", function() { return EnvironmentComponent; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var _angular_router__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @angular/router */ "./node_modules/@angular/router/__ivy_ngcc__/fesm2015/router.js");
+/* harmony import */ var jslib_common_abstractions_environment_service__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! jslib-common/abstractions/environment.service */ "./jslib/common/src/abstractions/environment.service.ts");
+/* harmony import */ var jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! jslib-common/abstractions/i18n.service */ "./jslib/common/src/abstractions/i18n.service.ts");
+/* harmony import */ var jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! jslib-common/abstractions/platformUtils.service */ "./jslib/common/src/abstractions/platformUtils.service.ts");
+/* harmony import */ var jslib_angular_components_environment_component__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! jslib-angular/components/environment.component */ "./jslib/angular/src/components/environment.component.ts");
+/* harmony import */ var _angular_forms__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @angular/forms */ "./node_modules/@angular/forms/__ivy_ngcc__/fesm2015/forms.js");
+/* harmony import */ var jslib_angular_directives_blur_click_directive__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! jslib-angular/directives/blur-click.directive */ "./jslib/angular/src/directives/blur-click.directive.ts");
+/* harmony import */ var jslib_angular_directives_box_row_directive__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! jslib-angular/directives/box-row.directive */ "./jslib/angular/src/directives/box-row.directive.ts");
+/* harmony import */ var jslib_angular_directives_input_verbatim_directive__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! jslib-angular/directives/input-verbatim.directive */ "./jslib/angular/src/directives/input-verbatim.directive.ts");
+/* harmony import */ var jslib_angular_pipes_i18n_pipe__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! jslib-angular/pipes/i18n.pipe */ "./jslib/angular/src/pipes/i18n.pipe.ts");
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+class EnvironmentComponent extends jslib_angular_components_environment_component__WEBPACK_IMPORTED_MODULE_5__["EnvironmentComponent"] {
+ constructor(platformUtilsService, environmentService, i18nService, router) {
+ super(platformUtilsService, environmentService, i18nService);
+ this.router = router;
+ this.showCustom = true;
+ }
+ saved() {
+ super.saved();
+ this.router.navigate(['']);
+ }
+}
+EnvironmentComponent.ɵfac = function EnvironmentComponent_Factory(t) { return new (t || EnvironmentComponent)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_4__["PlatformUtilsService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_environment_service__WEBPACK_IMPORTED_MODULE_2__["EnvironmentService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_3__["I18nService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_router__WEBPACK_IMPORTED_MODULE_1__["Router"])); };
+EnvironmentComponent.ɵcmp = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineComponent"]({ type: EnvironmentComponent, selectors: [["app-environment"]], features: [_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵInheritDefinitionFeature"]], decls: 118, vars: 50, consts: [[3, "ngSubmit"], ["form", ""], [1, "left"], ["routerLink", "/home"], [1, "center"], [1, "title"], [1, "right"], ["type", "submit", "appBlurClick", "", 3, "disabled"], [3, "hidden"], ["aria-hidden", "true", 1, "fa", "fa-spinner", "fa-lg", "fa-spin", 3, "hidden"], [1, "box"], [1, "box-header"], [1, "box-content"], ["appBoxRow", "", 1, "box-content-row"], ["for", "baseUrl"], ["id", "baseUrl", "type", "text", "name", "BaseUrl", "placeholder", "ex. https://bitwarden.company.com", "appInputVerbatim", "", 3, "ngModel", "ngModelChange"], [1, "box-footer"], [1, "box-content", 3, "hidden"], ["for", "webVaultUrl"], ["id", "webVaultUrl", "type", "text", "name", "WebVaultUrl", "inputmode", "url", "appInputVerbatim", "", 3, "ngModel", "ngModelChange"], ["for", "apiUrl"], ["id", "apiUrl", "type", "text", "name", "ApiUrl", "inputmode", "url", "appInputVerbatim", "", 3, "ngModel", "ngModelChange"], ["for", "identityUrl"], ["id", "identityUrl", "type", "text", "name", "IdentityUrl", "inputmode", "url", "appInputVerbatim", "", 3, "ngModel", "ngModelChange"], ["for", "notificationsUrl"], ["id", "notificationsUrl", "type", "text", "name", "NotificationsUrl", "inputmode", "url", "appInputVerbatim", "", 3, "ngModel", "ngModelChange"], ["for", "iconsUrl"], ["id", "iconsUrl", "type", "text", "name", "IconsUrl", "inputmode", "url", "appInputVerbatim", "", 3, "ngModel", "ngModelChange"], [1, "box-footer", 3, "hidden"]], template: function EnvironmentComponent_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "form", 0, 1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("ngSubmit", function EnvironmentComponent_Template_form_ngSubmit_0_listener() { return ctx.submit(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](2, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](3, "header");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](4, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](5, "div", 2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](6, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](7, "a", 3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](9, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](10, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](11, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](12, "div", 4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](13, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](14, "span", 5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](15);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](16, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](17, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](18, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](19, "div", 6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](20, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](21, "button", 7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](22, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](23, "span", 8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](24);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](25, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](26, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](27, "i", 9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](28, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](29, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](30, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](31, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](32, "content");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](33, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](34, "div", 10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](35, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](36, "div", 11);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](37);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](38, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](39, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](40, "div", 12);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](41, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](42, "div", 13);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](43, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](44, "label", 14);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](45);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](46, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](47, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](48, "input", 15);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("ngModelChange", function EnvironmentComponent_Template_input_ngModelChange_48_listener($event) { return ctx.baseUrl = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](49, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](50, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](51, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](52, "div", 16);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](53);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](54, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](55, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](56, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](57, "div", 10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](58, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](59, "div", 11);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](60);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](61, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](62, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](63, "div", 17);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](64, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](65, "div", 13);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](66, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](67, "label", 18);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](68);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](69, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](70, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](71, "input", 19);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("ngModelChange", function EnvironmentComponent_Template_input_ngModelChange_71_listener($event) { return ctx.webVaultUrl = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](72, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](73, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](74, "div", 13);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](75, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](76, "label", 20);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](77);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](78, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](79, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](80, "input", 21);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("ngModelChange", function EnvironmentComponent_Template_input_ngModelChange_80_listener($event) { return ctx.apiUrl = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](81, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](82, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](83, "div", 13);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](84, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](85, "label", 22);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](86);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](87, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](88, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](89, "input", 23);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("ngModelChange", function EnvironmentComponent_Template_input_ngModelChange_89_listener($event) { return ctx.identityUrl = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](90, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](91, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](92, "div", 13);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](93, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](94, "label", 24);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](95);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](96, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](97, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](98, "input", 25);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("ngModelChange", function EnvironmentComponent_Template_input_ngModelChange_98_listener($event) { return ctx.notificationsUrl = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](99, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](100, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](101, "div", 13);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](102, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](103, "label", 26);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](104);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](105, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](106, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](107, "input", 27);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("ngModelChange", function EnvironmentComponent_Template_input_ngModelChange_107_listener($event) { return ctx.iconsUrl = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](108, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](109, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](110, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](111, "div", 28);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](112);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](113, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](114, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](115, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](116, "\n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](117, "\n");
+ } if (rf & 2) {
+ const _r0 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵreference"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](9, 24, "close"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](16, 26, "appName"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("disabled", _r0.loading);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("hidden", _r0.loading);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](25, 28, "save"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("hidden", !_r0.loading);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate1"]("\n ", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](38, 30, "selfHostedEnvironment"), "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](46, 32, "baseUrl"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngModel", ctx.baseUrl);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate1"]("\n ", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](54, 34, "selfHostedEnvironmentFooter"), "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate1"]("\n ", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](61, 36, "customEnvironment"), "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("hidden", !ctx.showCustom);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](69, 38, "webVaultUrl"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngModel", ctx.webVaultUrl);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](78, 40, "apiUrl"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngModel", ctx.apiUrl);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](87, 42, "identityUrl"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngModel", ctx.identityUrl);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](96, 44, "notificationsUrl"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngModel", ctx.notificationsUrl);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](105, 46, "iconsUrl"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngModel", ctx.iconsUrl);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("hidden", !ctx.showCustom);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate1"]("\n ", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](113, 48, "customEnvironmentFooter"), "\n ");
+ } }, directives: [_angular_forms__WEBPACK_IMPORTED_MODULE_6__["ɵangular_packages_forms_forms_ba"], _angular_forms__WEBPACK_IMPORTED_MODULE_6__["NgControlStatusGroup"], _angular_forms__WEBPACK_IMPORTED_MODULE_6__["NgForm"], _angular_router__WEBPACK_IMPORTED_MODULE_1__["RouterLinkWithHref"], jslib_angular_directives_blur_click_directive__WEBPACK_IMPORTED_MODULE_7__["BlurClickDirective"], jslib_angular_directives_box_row_directive__WEBPACK_IMPORTED_MODULE_8__["BoxRowDirective"], _angular_forms__WEBPACK_IMPORTED_MODULE_6__["DefaultValueAccessor"], jslib_angular_directives_input_verbatim_directive__WEBPACK_IMPORTED_MODULE_9__["InputVerbatimDirective"], _angular_forms__WEBPACK_IMPORTED_MODULE_6__["NgControlStatus"], _angular_forms__WEBPACK_IMPORTED_MODULE_6__["NgModel"]], pipes: [jslib_angular_pipes_i18n_pipe__WEBPACK_IMPORTED_MODULE_10__["I18nPipe"]], encapsulation: 2 });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](EnvironmentComponent, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Component"],
+ args: [{
+ selector: 'app-environment',
+ templateUrl: 'environment.component.html',
+ }]
+ }], function () { return [{ type: jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_4__["PlatformUtilsService"] }, { type: jslib_common_abstractions_environment_service__WEBPACK_IMPORTED_MODULE_2__["EnvironmentService"] }, { type: jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_3__["I18nService"] }, { type: _angular_router__WEBPACK_IMPORTED_MODULE_1__["Router"] }]; }, null); })();
+
+
+/***/ }),
+
+/***/ "./src/popup/accounts/hint.component.ts":
+/*!**********************************************!*\
+ !*** ./src/popup/accounts/hint.component.ts ***!
+ \**********************************************/
+/*! exports provided: HintComponent */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "HintComponent", function() { return HintComponent; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var _angular_router__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @angular/router */ "./node_modules/@angular/router/__ivy_ngcc__/fesm2015/router.js");
+/* harmony import */ var jslib_common_abstractions_api_service__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! jslib-common/abstractions/api.service */ "./jslib/common/src/abstractions/api.service.ts");
+/* harmony import */ var jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! jslib-common/abstractions/i18n.service */ "./jslib/common/src/abstractions/i18n.service.ts");
+/* harmony import */ var jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! jslib-common/abstractions/log.service */ "./jslib/common/src/abstractions/log.service.ts");
+/* harmony import */ var jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! jslib-common/abstractions/platformUtils.service */ "./jslib/common/src/abstractions/platformUtils.service.ts");
+/* harmony import */ var jslib_angular_components_hint_component__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! jslib-angular/components/hint.component */ "./jslib/angular/src/components/hint.component.ts");
+/* harmony import */ var _angular_forms__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @angular/forms */ "./node_modules/@angular/forms/__ivy_ngcc__/fesm2015/forms.js");
+/* harmony import */ var jslib_angular_directives_api_action_directive__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! jslib-angular/directives/api-action.directive */ "./jslib/angular/src/directives/api-action.directive.ts");
+/* harmony import */ var jslib_angular_directives_blur_click_directive__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! jslib-angular/directives/blur-click.directive */ "./jslib/angular/src/directives/blur-click.directive.ts");
+/* harmony import */ var jslib_angular_directives_box_row_directive__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! jslib-angular/directives/box-row.directive */ "./jslib/angular/src/directives/box-row.directive.ts");
+/* harmony import */ var jslib_angular_directives_autofocus_directive__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! jslib-angular/directives/autofocus.directive */ "./jslib/angular/src/directives/autofocus.directive.ts");
+/* harmony import */ var jslib_angular_directives_input_verbatim_directive__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! jslib-angular/directives/input-verbatim.directive */ "./jslib/angular/src/directives/input-verbatim.directive.ts");
+/* harmony import */ var jslib_angular_pipes_i18n_pipe__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! jslib-angular/pipes/i18n.pipe */ "./jslib/angular/src/pipes/i18n.pipe.ts");
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+class HintComponent extends jslib_angular_components_hint_component__WEBPACK_IMPORTED_MODULE_6__["HintComponent"] {
+ constructor(router, platformUtilsService, i18nService, apiService, logService) {
+ super(router, i18nService, apiService, platformUtilsService, logService);
+ }
+}
+HintComponent.ɵfac = function HintComponent_Factory(t) { return new (t || HintComponent)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_router__WEBPACK_IMPORTED_MODULE_1__["Router"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_5__["PlatformUtilsService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_3__["I18nService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_api_service__WEBPACK_IMPORTED_MODULE_2__["ApiService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_4__["LogService"])); };
+HintComponent.ɵcmp = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineComponent"]({ type: HintComponent, selectors: [["app-hint"]], features: [_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵInheritDefinitionFeature"]], decls: 55, vars: 20, consts: [[3, "appApiAction", "ngSubmit"], ["form", ""], [1, "left"], ["routerLink", "/login"], [1, "center"], [1, "title"], [1, "right"], ["type", "submit", "appBlurClick", "", 3, "disabled"], [3, "hidden"], ["aria-hidden", "true", 1, "fa", "fa-spinner", "fa-lg", "fa-spin", 3, "hidden"], [1, "box"], [1, "box-content"], ["appBoxRow", "", 1, "box-content-row"], ["for", "email"], ["id", "email", "type", "text", "name", "Email", "required", "", "appAutofocus", "", "inputmode", "email", "appInputVerbatim", "false", 3, "ngModel", "ngModelChange"], [1, "box-footer"]], template: function HintComponent_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "form", 0, 1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("ngSubmit", function HintComponent_Template_form_ngSubmit_0_listener() { return ctx.submit(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](2, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](3, "header");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](4, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](5, "div", 2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](6, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](7, "a", 3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](9, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](10, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](11, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](12, "div", 4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](13, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](14, "span", 5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](15);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](16, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](17, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](18, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](19, "div", 6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](20, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](21, "button", 7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](22, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](23, "span", 8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](24);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](25, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](26, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](27, "i", 9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](28, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](29, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](30, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](31, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](32, "content");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](33, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](34, "div", 10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](35, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](36, "div", 11);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](37, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](38, "div", 12);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](39, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](40, "label", 13);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](41);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](42, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](43, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](44, "input", 14);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("ngModelChange", function HintComponent_Template_input_ngModelChange_44_listener($event) { return ctx.email = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](45, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](46, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](47, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](48, "div", 15);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](49);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](50, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](51, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](52, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](53, "\n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](54, "\n");
+ } if (rf & 2) {
+ const _r0 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵreference"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("appApiAction", ctx.formPromise);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](9, 10, "cancel"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](16, 12, "passwordHint"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("disabled", _r0.loading);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("hidden", _r0.loading);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](25, 14, "submit"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("hidden", !_r0.loading);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](14);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](42, 16, "emailAddress"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngModel", ctx.email);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate1"]("\n ", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](50, 18, "enterEmailToGetHint"), "\n ");
+ } }, directives: [_angular_forms__WEBPACK_IMPORTED_MODULE_7__["ɵangular_packages_forms_forms_ba"], _angular_forms__WEBPACK_IMPORTED_MODULE_7__["NgControlStatusGroup"], _angular_forms__WEBPACK_IMPORTED_MODULE_7__["NgForm"], jslib_angular_directives_api_action_directive__WEBPACK_IMPORTED_MODULE_8__["ApiActionDirective"], _angular_router__WEBPACK_IMPORTED_MODULE_1__["RouterLinkWithHref"], jslib_angular_directives_blur_click_directive__WEBPACK_IMPORTED_MODULE_9__["BlurClickDirective"], jslib_angular_directives_box_row_directive__WEBPACK_IMPORTED_MODULE_10__["BoxRowDirective"], _angular_forms__WEBPACK_IMPORTED_MODULE_7__["DefaultValueAccessor"], _angular_forms__WEBPACK_IMPORTED_MODULE_7__["RequiredValidator"], jslib_angular_directives_autofocus_directive__WEBPACK_IMPORTED_MODULE_11__["AutofocusDirective"], jslib_angular_directives_input_verbatim_directive__WEBPACK_IMPORTED_MODULE_12__["InputVerbatimDirective"], _angular_forms__WEBPACK_IMPORTED_MODULE_7__["NgControlStatus"], _angular_forms__WEBPACK_IMPORTED_MODULE_7__["NgModel"]], pipes: [jslib_angular_pipes_i18n_pipe__WEBPACK_IMPORTED_MODULE_13__["I18nPipe"]], encapsulation: 2 });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](HintComponent, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Component"],
+ args: [{
+ selector: 'app-hint',
+ templateUrl: 'hint.component.html',
+ }]
+ }], function () { return [{ type: _angular_router__WEBPACK_IMPORTED_MODULE_1__["Router"] }, { type: jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_5__["PlatformUtilsService"] }, { type: jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_3__["I18nService"] }, { type: jslib_common_abstractions_api_service__WEBPACK_IMPORTED_MODULE_2__["ApiService"] }, { type: jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_4__["LogService"] }]; }, null); })();
+
+
+/***/ }),
+
+/***/ "./src/popup/accounts/home.component.ts":
+/*!**********************************************!*\
+ !*** ./src/popup/accounts/home.component.ts ***!
+ \**********************************************/
+/*! exports provided: HomeComponent */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "HomeComponent", function() { return HomeComponent; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! jslib-common/services/constants.service */ "./jslib/common/src/services/constants.service.ts");
+/* harmony import */ var jslib_common_abstractions_cryptoFunction_service__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! jslib-common/abstractions/cryptoFunction.service */ "./jslib/common/src/abstractions/cryptoFunction.service.ts");
+/* harmony import */ var jslib_common_abstractions_environment_service__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! jslib-common/abstractions/environment.service */ "./jslib/common/src/abstractions/environment.service.ts");
+/* harmony import */ var jslib_common_abstractions_passwordGeneration_service__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! jslib-common/abstractions/passwordGeneration.service */ "./jslib/common/src/abstractions/passwordGeneration.service.ts");
+/* harmony import */ var jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! jslib-common/abstractions/platformUtils.service */ "./jslib/common/src/abstractions/platformUtils.service.ts");
+/* harmony import */ var jslib_common_abstractions_storage_service__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! jslib-common/abstractions/storage.service */ "./jslib/common/src/abstractions/storage.service.ts");
+/* harmony import */ var jslib_common_misc_utils__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! jslib-common/misc/utils */ "./jslib/common/src/misc/utils.ts");
+/* harmony import */ var _angular_router__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @angular/router */ "./node_modules/@angular/router/__ivy_ngcc__/fesm2015/router.js");
+/* harmony import */ var jslib_angular_pipes_i18n_pipe__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! jslib-angular/pipes/i18n.pipe */ "./jslib/angular/src/pipes/i18n.pipe.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+class HomeComponent {
+ constructor(platformUtilsService, passwordGenerationService, storageService, cryptoFunctionService, environmentService) {
+ this.platformUtilsService = platformUtilsService;
+ this.passwordGenerationService = passwordGenerationService;
+ this.storageService = storageService;
+ this.cryptoFunctionService = cryptoFunctionService;
+ this.environmentService = environmentService;
+ }
+ launchSsoBrowser() {
+ return __awaiter(this, void 0, void 0, function* () {
+ // Generate necessary sso params
+ const passwordOptions = {
+ type: 'password',
+ length: 64,
+ uppercase: true,
+ lowercase: true,
+ numbers: true,
+ special: false,
+ };
+ const state = (yield this.passwordGenerationService.generatePassword(passwordOptions)) + ':clientId=browser';
+ const codeVerifier = yield this.passwordGenerationService.generatePassword(passwordOptions);
+ const codeVerifierHash = yield this.cryptoFunctionService.hash(codeVerifier, 'sha256');
+ const codeChallenge = jslib_common_misc_utils__WEBPACK_IMPORTED_MODULE_7__["Utils"].fromBufferToUrlB64(codeVerifierHash);
+ yield this.storageService.save(jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_1__["ConstantsService"].ssoCodeVerifierKey, codeVerifier);
+ yield this.storageService.save(jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_1__["ConstantsService"].ssoStateKey, state);
+ let url = this.environmentService.getWebVaultUrl();
+ if (url == null) {
+ url = 'https://vault.bitwarden.com';
+ }
+ const redirectUri = url + '/sso-connector.html';
+ // Launch browser
+ this.platformUtilsService.launchUri(url + '/#/sso?clientId=browser' +
+ '&redirectUri=' + encodeURIComponent(redirectUri) +
+ '&state=' + state + '&codeChallenge=' + codeChallenge);
+ });
+ }
+}
+HomeComponent.ɵfac = function HomeComponent_Factory(t) { return new (t || HomeComponent)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_5__["PlatformUtilsService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_passwordGeneration_service__WEBPACK_IMPORTED_MODULE_4__["PasswordGenerationService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_storage_service__WEBPACK_IMPORTED_MODULE_6__["StorageService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_cryptoFunction_service__WEBPACK_IMPORTED_MODULE_2__["CryptoFunctionService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_environment_service__WEBPACK_IMPORTED_MODULE_3__["EnvironmentService"])); };
+HomeComponent.ɵcmp = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineComponent"]({ type: HomeComponent, selectors: [["app-home"]], decls: 35, vars: 15, consts: [[1, "center-content"], [1, "content"], [1, "logo-image"], [1, "lead", "text-center"], ["routerLink", "/login", 1, "btn", "primary", "block"], ["type", "button", 1, "btn", "block", 3, "click"], ["aria-hidden", "true", 1, "fa", "fa-bank"], ["routerLink", "/register", 1, "btn", "block"], ["routerLink", "/environment", 1, "settings-icon"], ["aria-hidden", "true", 1, "fa", "fa-cog", "fa-lg"]], template: function HomeComponent_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "div", 0);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](2, "div", 1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](4, "div", 2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](6, "p", 3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](8, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](9, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](10, "a", 4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](11, "b");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](12);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](13, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](14, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](15, "button", 5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("click", function HomeComponent_Template_button_click_15_listener() { return ctx.launchSsoBrowser(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](16, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](17, "i", 6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](18);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](19, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](20, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](21, "a", 7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](22);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](23, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](24, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](25, "\n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](26, "\n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](27, "a", 8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](28, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](29, "i", 9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](30, "span");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](31);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](32, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](33, "\n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](34, "\n");
+ } if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](8, 5, "loginOrCreateNewAccount"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](13, 7, "login"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate1"](" ", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](19, 9, "enterpriseSingleSignOn"), "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](23, 11, "createAccount"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate1"]("\u00A0", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](32, 13, "settings"), "");
+ } }, directives: [_angular_router__WEBPACK_IMPORTED_MODULE_8__["RouterLinkWithHref"]], pipes: [jslib_angular_pipes_i18n_pipe__WEBPACK_IMPORTED_MODULE_9__["I18nPipe"]], encapsulation: 2 });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](HomeComponent, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Component"],
+ args: [{
+ selector: 'app-home',
+ templateUrl: 'home.component.html',
+ }]
+ }], function () { return [{ type: jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_5__["PlatformUtilsService"] }, { type: jslib_common_abstractions_passwordGeneration_service__WEBPACK_IMPORTED_MODULE_4__["PasswordGenerationService"] }, { type: jslib_common_abstractions_storage_service__WEBPACK_IMPORTED_MODULE_6__["StorageService"] }, { type: jslib_common_abstractions_cryptoFunction_service__WEBPACK_IMPORTED_MODULE_2__["CryptoFunctionService"] }, { type: jslib_common_abstractions_environment_service__WEBPACK_IMPORTED_MODULE_3__["EnvironmentService"] }]; }, null); })();
+
+
+/***/ }),
+
+/***/ "./src/popup/accounts/lock.component.ts":
+/*!**********************************************!*\
+ !*** ./src/popup/accounts/lock.component.ts ***!
+ \**********************************************/
+/*! exports provided: LockComponent */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LockComponent", function() { return LockComponent; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var _angular_router__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @angular/router */ "./node_modules/@angular/router/__ivy_ngcc__/fesm2015/router.js");
+/* harmony import */ var sweetalert2__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! sweetalert2 */ "./node_modules/sweetalert2/dist/sweetalert2.all.js");
+/* harmony import */ var sweetalert2__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(sweetalert2__WEBPACK_IMPORTED_MODULE_2__);
+/* harmony import */ var jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! jslib-common/services/constants.service */ "./jslib/common/src/services/constants.service.ts");
+/* harmony import */ var jslib_common_abstractions_api_service__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! jslib-common/abstractions/api.service */ "./jslib/common/src/abstractions/api.service.ts");
+/* harmony import */ var jslib_common_abstractions_crypto_service__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! jslib-common/abstractions/crypto.service */ "./jslib/common/src/abstractions/crypto.service.ts");
+/* harmony import */ var jslib_common_abstractions_environment_service__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! jslib-common/abstractions/environment.service */ "./jslib/common/src/abstractions/environment.service.ts");
+/* harmony import */ var jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! jslib-common/abstractions/i18n.service */ "./jslib/common/src/abstractions/i18n.service.ts");
+/* harmony import */ var jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! jslib-common/abstractions/log.service */ "./jslib/common/src/abstractions/log.service.ts");
+/* harmony import */ var jslib_common_abstractions_messaging_service__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! jslib-common/abstractions/messaging.service */ "./jslib/common/src/abstractions/messaging.service.ts");
+/* harmony import */ var jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! jslib-common/abstractions/platformUtils.service */ "./jslib/common/src/abstractions/platformUtils.service.ts");
+/* harmony import */ var jslib_common_abstractions_state_service__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! jslib-common/abstractions/state.service */ "./jslib/common/src/abstractions/state.service.ts");
+/* harmony import */ var jslib_common_abstractions_storage_service__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! jslib-common/abstractions/storage.service */ "./jslib/common/src/abstractions/storage.service.ts");
+/* harmony import */ var jslib_common_abstractions_user_service__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! jslib-common/abstractions/user.service */ "./jslib/common/src/abstractions/user.service.ts");
+/* harmony import */ var jslib_common_abstractions_vaultTimeout_service__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! jslib-common/abstractions/vaultTimeout.service */ "./jslib/common/src/abstractions/vaultTimeout.service.ts");
+/* harmony import */ var jslib_angular_components_lock_component__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! jslib-angular/components/lock.component */ "./jslib/angular/src/components/lock.component.ts");
+/* harmony import */ var _angular_forms__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @angular/forms */ "./node_modules/@angular/forms/__ivy_ngcc__/fesm2015/forms.js");
+/* harmony import */ var jslib_angular_directives_blur_click_directive__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! jslib-angular/directives/blur-click.directive */ "./jslib/angular/src/directives/blur-click.directive.ts");
+/* harmony import */ var jslib_angular_directives_box_row_directive__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! jslib-angular/directives/box-row.directive */ "./jslib/angular/src/directives/box-row.directive.ts");
+/* harmony import */ var _angular_common__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! @angular/common */ "./node_modules/@angular/common/__ivy_ngcc__/fesm2015/common.js");
+/* harmony import */ var jslib_angular_directives_stop_click_directive__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! jslib-angular/directives/stop-click.directive */ "./jslib/angular/src/directives/stop-click.directive.ts");
+/* harmony import */ var jslib_angular_directives_a11y_title_directive__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! jslib-angular/directives/a11y-title.directive */ "./jslib/angular/src/directives/a11y-title.directive.ts");
+/* harmony import */ var jslib_angular_directives_input_verbatim_directive__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! jslib-angular/directives/input-verbatim.directive */ "./jslib/angular/src/directives/input-verbatim.directive.ts");
+/* harmony import */ var jslib_angular_pipes_i18n_pipe__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! jslib-angular/pipes/i18n.pipe */ "./jslib/angular/src/pipes/i18n.pipe.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+function LockComponent_div_29_Template(rf, ctx) { if (rf & 1) {
+ const _r4 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "div", 17);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](2, "label", 18);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](4, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](6, "input", 19);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("ngModelChange", function LockComponent_div_29_Template_input_ngModelChange_6_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r4); const ctx_r3 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](); return ctx_r3.pin = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r0 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](4, 3, "pin"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate"]("type", ctx_r0.showPassword ? "text" : "password");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngModel", ctx_r0.pin);
+} }
+function LockComponent_div_31_Template(rf, ctx) { if (rf & 1) {
+ const _r6 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "div", 17);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](2, "label", 20);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](4, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](6, "input", 21);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("ngModelChange", function LockComponent_div_31_Template_input_ngModelChange_6_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r6); const ctx_r5 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](); return ctx_r5.masterPassword = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r1 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](4, 3, "masterPass"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate"]("type", ctx_r1.showPassword ? "text" : "password");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngModel", ctx_r1.masterPassword);
+} }
+function LockComponent_div_53_Template(rf, ctx) { if (rf & 1) {
+ const _r8 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "div", 6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](2, "div", 13);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](4, "button", 22);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("click", function LockComponent_div_53_Template_button_click_4_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r8); const ctx_r7 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](); return ctx_r7.unlockBiometric(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](6, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](8, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](6, 1, "unlockWithBiometrics"));
+} }
+const _c0 = function (a0, a1) { return { "fa-eye": a0, "fa-eye-slash": a1 }; };
+class LockComponent extends jslib_angular_components_lock_component__WEBPACK_IMPORTED_MODULE_15__["LockComponent"] {
+ constructor(router, i18nService, platformUtilsService, messagingService, userService, cryptoService, storageService, vaultTimeoutService, environmentService, stateService, apiService, logService) {
+ super(router, i18nService, platformUtilsService, messagingService, userService, cryptoService, storageService, vaultTimeoutService, environmentService, stateService, apiService, logService);
+ this.successRoute = '/tabs/current';
+ this.isInitialLockScreen = window.previousPopupUrl == null;
+ }
+ ngOnInit() {
+ const _super = Object.create(null, {
+ ngOnInit: { get: () => super.ngOnInit }
+ });
+ var _a;
+ return __awaiter(this, void 0, void 0, function* () {
+ yield _super.ngOnInit.call(this);
+ const disableAutoBiometricsPrompt = (_a = yield this.storageService.get(jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_3__["ConstantsService"].disableAutoBiometricsPromptKey)) !== null && _a !== void 0 ? _a : true;
+ window.setTimeout(() => __awaiter(this, void 0, void 0, function* () {
+ document.getElementById(this.pinLock ? 'pin' : 'masterPassword').focus();
+ if (this.biometricLock && !disableAutoBiometricsPrompt && this.isInitialLockScreen) {
+ if (yield this.vaultTimeoutService.isLocked()) {
+ yield this.unlockBiometric();
+ }
+ }
+ }), 100);
+ });
+ }
+ unlockBiometric() {
+ const _super = Object.create(null, {
+ unlockBiometric: { get: () => super.unlockBiometric }
+ });
+ return __awaiter(this, void 0, void 0, function* () {
+ if (!this.biometricLock) {
+ return;
+ }
+ const div = document.createElement('div');
+ div.innerHTML = `
${this.i18nService.t('awaitDesktop')}
`;
+ sweetalert2__WEBPACK_IMPORTED_MODULE_2___default.a.fire({
+ heightAuto: false,
+ buttonsStyling: false,
+ html: div,
+ showCancelButton: true,
+ cancelButtonText: this.i18nService.t('cancel'),
+ showConfirmButton: false,
+ });
+ const success = yield _super.unlockBiometric.call(this);
+ // Avoid closing the error dialogs
+ if (success) {
+ sweetalert2__WEBPACK_IMPORTED_MODULE_2___default.a.close();
+ }
+ return success;
+ });
+ }
+}
+LockComponent.ɵfac = function LockComponent_Factory(t) { return new (t || LockComponent)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_router__WEBPACK_IMPORTED_MODULE_1__["Router"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_7__["I18nService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_10__["PlatformUtilsService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_messaging_service__WEBPACK_IMPORTED_MODULE_9__["MessagingService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_user_service__WEBPACK_IMPORTED_MODULE_13__["UserService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_crypto_service__WEBPACK_IMPORTED_MODULE_5__["CryptoService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_storage_service__WEBPACK_IMPORTED_MODULE_12__["StorageService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_vaultTimeout_service__WEBPACK_IMPORTED_MODULE_14__["VaultTimeoutService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_environment_service__WEBPACK_IMPORTED_MODULE_6__["EnvironmentService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_state_service__WEBPACK_IMPORTED_MODULE_11__["StateService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_api_service__WEBPACK_IMPORTED_MODULE_4__["ApiService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_8__["LogService"])); };
+LockComponent.ɵcmp = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineComponent"]({ type: LockComponent, selectors: [["app-lock"]], features: [_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵInheritDefinitionFeature"]], decls: 64, vars: 27, consts: [[3, "ngSubmit"], [1, "left"], [1, "center"], [1, "title"], [1, "right"], ["type", "submit", "appBlurClick", ""], [1, "box"], [1, "box-content"], ["appBoxRow", "", 1, "box-content-row", "box-content-row-flex"], ["class", "row-main", 4, "ngIf"], [1, "action-buttons"], ["type", "button", "appStopClick", "", "appBlurClick", "", 1, "row-btn", 3, "appA11yTitle", "click"], ["aria-hidden", "true", 1, "fa", "fa-lg", 3, "ngClass"], [1, "box-footer"], ["class", "box", 4, "ngIf"], [1, "text-center"], ["type", "button", "appStopClick", "", 3, "click"], [1, "row-main"], ["for", "pin"], ["id", "pin", "name", "PIN", "required", "", "appInputVerbatim", "", 1, "monospaced", 3, "type", "ngModel", "ngModelChange"], ["for", "masterPassword"], ["id", "masterPassword", "name", "MasterPassword", "required", "", "appInputVerbatim", "", 1, "monospaced", 3, "type", "ngModel", "ngModelChange"], ["type", "button", "appStopClick", "", 1, "btn", "primary", "block", 3, "click"]], template: function LockComponent_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "form", 0);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("ngSubmit", function LockComponent_Template_form_ngSubmit_0_listener() { return ctx.submit(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](2, "header");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](4, "div", 1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](6, "div", 2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](8, "span", 3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](10, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](11, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](12, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](13, "div", 4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](14, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](15, "button", 5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](16);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](17, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](18, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](19, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](20, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](21, "content");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](22, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](23, "div", 6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](24, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](25, "div", 7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](26, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](27, "div", 8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](28, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](29, LockComponent_div_29_Template, 8, 5, "div", 9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](30, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](31, LockComponent_div_31_Template, 8, 5, "div", 9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](32, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](33, "div", 10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](34, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](35, "button", 11);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("click", function LockComponent_Template_button_click_35_listener() { return ctx.togglePassword(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](36, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](37, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](38, "i", 12);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](39, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](40, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](41, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](42, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](43, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](44, "div", 13);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](45, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](46, "p");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](47);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](48, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](49);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](50, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](51, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](52, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](53, LockComponent_div_53_Template, 9, 3, "div", 14);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](54, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](55, "p", 15);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](56, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](57, "button", 16);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("click", function LockComponent_Template_button_click_57_listener() { return ctx.logOut(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](58);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](59, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](60, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](61, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](62, "\n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](63, "\n");
+ } if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](10, 10, ctx.pinLock ? "verifyPin" : "verifyMasterPassword"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](17, 12, "unlock"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](13);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", ctx.pinLock);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", !ctx.pinLock);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate"]("appA11yTitle", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](36, 14, "toggleVisibility"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngClass", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpureFunction2"](24, _c0, !ctx.showPassword, ctx.showPassword));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](48, 16, ctx.pinLock ? "yourVaultIsLockedPinCode" : "yourVaultIsLocked"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate1"]("\n ", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind3"](50, 18, "loggedInAsOn", ctx.email, ctx.webVaultHostname), "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", ctx.biometricLock);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](59, 22, "logOut"));
+ } }, directives: [_angular_forms__WEBPACK_IMPORTED_MODULE_16__["ɵangular_packages_forms_forms_ba"], _angular_forms__WEBPACK_IMPORTED_MODULE_16__["NgControlStatusGroup"], _angular_forms__WEBPACK_IMPORTED_MODULE_16__["NgForm"], jslib_angular_directives_blur_click_directive__WEBPACK_IMPORTED_MODULE_17__["BlurClickDirective"], jslib_angular_directives_box_row_directive__WEBPACK_IMPORTED_MODULE_18__["BoxRowDirective"], _angular_common__WEBPACK_IMPORTED_MODULE_19__["NgIf"], jslib_angular_directives_stop_click_directive__WEBPACK_IMPORTED_MODULE_20__["StopClickDirective"], jslib_angular_directives_a11y_title_directive__WEBPACK_IMPORTED_MODULE_21__["A11yTitleDirective"], _angular_common__WEBPACK_IMPORTED_MODULE_19__["NgClass"], _angular_forms__WEBPACK_IMPORTED_MODULE_16__["DefaultValueAccessor"], _angular_forms__WEBPACK_IMPORTED_MODULE_16__["RequiredValidator"], jslib_angular_directives_input_verbatim_directive__WEBPACK_IMPORTED_MODULE_22__["InputVerbatimDirective"], _angular_forms__WEBPACK_IMPORTED_MODULE_16__["NgControlStatus"], _angular_forms__WEBPACK_IMPORTED_MODULE_16__["NgModel"]], pipes: [jslib_angular_pipes_i18n_pipe__WEBPACK_IMPORTED_MODULE_23__["I18nPipe"]], encapsulation: 2 });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](LockComponent, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Component"],
+ args: [{
+ selector: 'app-lock',
+ templateUrl: 'lock.component.html',
+ }]
+ }], function () { return [{ type: _angular_router__WEBPACK_IMPORTED_MODULE_1__["Router"] }, { type: jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_7__["I18nService"] }, { type: jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_10__["PlatformUtilsService"] }, { type: jslib_common_abstractions_messaging_service__WEBPACK_IMPORTED_MODULE_9__["MessagingService"] }, { type: jslib_common_abstractions_user_service__WEBPACK_IMPORTED_MODULE_13__["UserService"] }, { type: jslib_common_abstractions_crypto_service__WEBPACK_IMPORTED_MODULE_5__["CryptoService"] }, { type: jslib_common_abstractions_storage_service__WEBPACK_IMPORTED_MODULE_12__["StorageService"] }, { type: jslib_common_abstractions_vaultTimeout_service__WEBPACK_IMPORTED_MODULE_14__["VaultTimeoutService"] }, { type: jslib_common_abstractions_environment_service__WEBPACK_IMPORTED_MODULE_6__["EnvironmentService"] }, { type: jslib_common_abstractions_state_service__WEBPACK_IMPORTED_MODULE_11__["StateService"] }, { type: jslib_common_abstractions_api_service__WEBPACK_IMPORTED_MODULE_4__["ApiService"] }, { type: jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_8__["LogService"] }]; }, null); })();
+
+
+/***/ }),
+
+/***/ "./src/popup/accounts/login.component.ts":
+/*!***********************************************!*\
+ !*** ./src/popup/accounts/login.component.ts ***!
+ \***********************************************/
+/*! exports provided: LoginComponent */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LoginComponent", function() { return LoginComponent; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var _angular_router__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @angular/router */ "./node_modules/@angular/router/__ivy_ngcc__/fesm2015/router.js");
+/* harmony import */ var jslib_common_abstractions_auth_service__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! jslib-common/abstractions/auth.service */ "./jslib/common/src/abstractions/auth.service.ts");
+/* harmony import */ var jslib_common_abstractions_cryptoFunction_service__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! jslib-common/abstractions/cryptoFunction.service */ "./jslib/common/src/abstractions/cryptoFunction.service.ts");
+/* harmony import */ var jslib_common_abstractions_environment_service__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! jslib-common/abstractions/environment.service */ "./jslib/common/src/abstractions/environment.service.ts");
+/* harmony import */ var jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! jslib-common/abstractions/i18n.service */ "./jslib/common/src/abstractions/i18n.service.ts");
+/* harmony import */ var jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! jslib-common/abstractions/log.service */ "./jslib/common/src/abstractions/log.service.ts");
+/* harmony import */ var jslib_common_abstractions_passwordGeneration_service__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! jslib-common/abstractions/passwordGeneration.service */ "./jslib/common/src/abstractions/passwordGeneration.service.ts");
+/* harmony import */ var jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! jslib-common/abstractions/platformUtils.service */ "./jslib/common/src/abstractions/platformUtils.service.ts");
+/* harmony import */ var jslib_common_abstractions_state_service__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! jslib-common/abstractions/state.service */ "./jslib/common/src/abstractions/state.service.ts");
+/* harmony import */ var jslib_common_abstractions_storage_service__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! jslib-common/abstractions/storage.service */ "./jslib/common/src/abstractions/storage.service.ts");
+/* harmony import */ var jslib_common_abstractions_sync_service__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! jslib-common/abstractions/sync.service */ "./jslib/common/src/abstractions/sync.service.ts");
+/* harmony import */ var jslib_angular_components_login_component__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! jslib-angular/components/login.component */ "./jslib/angular/src/components/login.component.ts");
+/* harmony import */ var _angular_forms__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @angular/forms */ "./node_modules/@angular/forms/__ivy_ngcc__/fesm2015/forms.js");
+/* harmony import */ var jslib_angular_directives_api_action_directive__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! jslib-angular/directives/api-action.directive */ "./jslib/angular/src/directives/api-action.directive.ts");
+/* harmony import */ var jslib_angular_directives_blur_click_directive__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! jslib-angular/directives/blur-click.directive */ "./jslib/angular/src/directives/blur-click.directive.ts");
+/* harmony import */ var jslib_angular_directives_box_row_directive__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! jslib-angular/directives/box-row.directive */ "./jslib/angular/src/directives/box-row.directive.ts");
+/* harmony import */ var jslib_angular_directives_input_verbatim_directive__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! jslib-angular/directives/input-verbatim.directive */ "./jslib/angular/src/directives/input-verbatim.directive.ts");
+/* harmony import */ var jslib_angular_directives_stop_click_directive__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! jslib-angular/directives/stop-click.directive */ "./jslib/angular/src/directives/stop-click.directive.ts");
+/* harmony import */ var jslib_angular_directives_a11y_title_directive__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! jslib-angular/directives/a11y-title.directive */ "./jslib/angular/src/directives/a11y-title.directive.ts");
+/* harmony import */ var _angular_common__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! @angular/common */ "./node_modules/@angular/common/__ivy_ngcc__/fesm2015/common.js");
+/* harmony import */ var jslib_angular_pipes_i18n_pipe__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! jslib-angular/pipes/i18n.pipe */ "./jslib/angular/src/pipes/i18n.pipe.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+const _c0 = function (a0, a1) { return { "fa-eye": a0, "fa-eye-slash": a1 }; };
+class LoginComponent extends jslib_angular_components_login_component__WEBPACK_IMPORTED_MODULE_12__["LoginComponent"] {
+ constructor(authService, router, platformUtilsService, i18nService, stateService, environmentService, passwordGenerationService, cryptoFunctionService, storageService, syncService, logService) {
+ super(authService, router, platformUtilsService, i18nService, stateService, environmentService, passwordGenerationService, cryptoFunctionService, storageService, logService);
+ this.platformUtilsService = platformUtilsService;
+ this.i18nService = i18nService;
+ this.stateService = stateService;
+ this.environmentService = environmentService;
+ this.passwordGenerationService = passwordGenerationService;
+ this.cryptoFunctionService = cryptoFunctionService;
+ super.onSuccessfulLogin = () => __awaiter(this, void 0, void 0, function* () {
+ yield syncService.fullSync(true);
+ });
+ super.successRoute = '/tabs/vault';
+ }
+ settings() {
+ this.router.navigate(['environment']);
+ }
+}
+LoginComponent.ɵfac = function LoginComponent_Factory(t) { return new (t || LoginComponent)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_auth_service__WEBPACK_IMPORTED_MODULE_2__["AuthService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_router__WEBPACK_IMPORTED_MODULE_1__["Router"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_8__["PlatformUtilsService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_5__["I18nService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_state_service__WEBPACK_IMPORTED_MODULE_9__["StateService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_environment_service__WEBPACK_IMPORTED_MODULE_4__["EnvironmentService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_passwordGeneration_service__WEBPACK_IMPORTED_MODULE_7__["PasswordGenerationService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_cryptoFunction_service__WEBPACK_IMPORTED_MODULE_3__["CryptoFunctionService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_storage_service__WEBPACK_IMPORTED_MODULE_10__["StorageService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_sync_service__WEBPACK_IMPORTED_MODULE_11__["SyncService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_6__["LogService"])); };
+LoginComponent.ɵcmp = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineComponent"]({ type: LoginComponent, selectors: [["app-login"]], features: [_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵInheritDefinitionFeature"]], decls: 84, vars: 33, consts: [[3, "appApiAction", "ngSubmit"], ["form", ""], [1, "left"], ["routerLink", "/home"], [1, "center"], [1, "title"], [1, "right"], ["type", "submit", "appBlurClick", "", 3, "disabled"], [3, "hidden"], ["aria-hidden", "true", 1, "fa", "fa-spinner", "fa-lg", "fa-spin", 3, "hidden"], [1, "box"], [1, "box-content"], ["appBoxRow", "", 1, "box-content-row"], ["for", "email"], ["id", "email", "type", "text", "name", "Email", "required", "", "inputmode", "email", "appInputVerbatim", "false", 3, "ngModel", "ngModelChange"], ["appBoxRow", "", 1, "box-content-row", "box-content-row-flex"], [1, "row-main"], ["for", "masterPassword"], ["id", "masterPassword", "name", "MasterPassword", "required", "", "appInputVerbatim", "", 1, "monospaced", 3, "type", "ngModel", "ngModelChange"], [1, "action-buttons"], ["type", "button", "appStopClick", "", "appBlurClick", "", 1, "row-btn", 3, "appA11yTitle", "click"], ["aria-hidden", "true", 1, "fa", "fa-lg", 3, "ngClass"], [1, "box-content-row", 3, "hidden"], ["id", "hcaptcha_iframe", "height", "80"], [1, "text-center"], ["routerLink", "/hint"]], template: function LoginComponent_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "form", 0, 1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("ngSubmit", function LoginComponent_Template_form_ngSubmit_0_listener() { return ctx.submit(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](2, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](3, "header");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](4, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](5, "div", 2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](6, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](7, "a", 3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](9, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](10, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](11, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](12, "div", 4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](13, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](14, "span", 5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](15);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](16, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](17, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](18, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](19, "div", 6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](20, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](21, "button", 7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](22, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](23, "span", 8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](24);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](25, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](26, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](27, "i", 9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](28, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](29, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](30, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](31, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](32, "content");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](33, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](34, "div", 10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](35, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](36, "div", 11);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](37, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](38, "div", 12);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](39, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](40, "label", 13);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](41);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](42, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](43, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](44, "input", 14);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("ngModelChange", function LoginComponent_Template_input_ngModelChange_44_listener($event) { return ctx.email = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](45, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](46, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](47, "div", 15);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](48, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](49, "div", 16);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](50, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](51, "label", 17);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](52);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](53, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](54, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](55, "input", 18);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("ngModelChange", function LoginComponent_Template_input_ngModelChange_55_listener($event) { return ctx.masterPassword = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](56, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](57, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](58, "div", 19);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](59, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](60, "button", 20);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("click", function LoginComponent_Template_button_click_60_listener() { return ctx.togglePassword(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](61, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](62, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](63, "i", 21);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](64, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](65, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](66, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](67, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](68, "div", 22);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](69, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](70, "iframe", 23);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](71, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](72, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](73, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](74, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](75, "p", 24);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](76, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](77, "a", 25);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](78);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](79, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](80, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](81, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](82, "\n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](83, "\n");
+ } if (rf & 2) {
+ const _r0 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵreference"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("appApiAction", ctx.formPromise);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](9, 16, "cancel"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](16, 18, "appName"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("disabled", _r0.loading);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("hidden", _r0.loading);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](25, 20, "login"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("hidden", !_r0.loading);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](14);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](42, 22, "emailAddress"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngModel", ctx.email);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](53, 24, "masterPass"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate"]("type", ctx.showPassword ? "text" : "password");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngModel", ctx.masterPassword);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate"]("appA11yTitle", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](61, 26, "toggleVisibility"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngClass", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpureFunction2"](30, _c0, !ctx.showPassword, ctx.showPassword));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("hidden", !ctx.showCaptcha());
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](79, 28, "getMasterPasswordHint"));
+ } }, directives: [_angular_forms__WEBPACK_IMPORTED_MODULE_13__["ɵangular_packages_forms_forms_ba"], _angular_forms__WEBPACK_IMPORTED_MODULE_13__["NgControlStatusGroup"], _angular_forms__WEBPACK_IMPORTED_MODULE_13__["NgForm"], jslib_angular_directives_api_action_directive__WEBPACK_IMPORTED_MODULE_14__["ApiActionDirective"], _angular_router__WEBPACK_IMPORTED_MODULE_1__["RouterLinkWithHref"], jslib_angular_directives_blur_click_directive__WEBPACK_IMPORTED_MODULE_15__["BlurClickDirective"], jslib_angular_directives_box_row_directive__WEBPACK_IMPORTED_MODULE_16__["BoxRowDirective"], _angular_forms__WEBPACK_IMPORTED_MODULE_13__["DefaultValueAccessor"], _angular_forms__WEBPACK_IMPORTED_MODULE_13__["RequiredValidator"], jslib_angular_directives_input_verbatim_directive__WEBPACK_IMPORTED_MODULE_17__["InputVerbatimDirective"], _angular_forms__WEBPACK_IMPORTED_MODULE_13__["NgControlStatus"], _angular_forms__WEBPACK_IMPORTED_MODULE_13__["NgModel"], jslib_angular_directives_stop_click_directive__WEBPACK_IMPORTED_MODULE_18__["StopClickDirective"], jslib_angular_directives_a11y_title_directive__WEBPACK_IMPORTED_MODULE_19__["A11yTitleDirective"], _angular_common__WEBPACK_IMPORTED_MODULE_20__["NgClass"]], pipes: [jslib_angular_pipes_i18n_pipe__WEBPACK_IMPORTED_MODULE_21__["I18nPipe"]], encapsulation: 2 });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](LoginComponent, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Component"],
+ args: [{
+ selector: 'app-login',
+ templateUrl: 'login.component.html',
+ }]
+ }], function () { return [{ type: jslib_common_abstractions_auth_service__WEBPACK_IMPORTED_MODULE_2__["AuthService"] }, { type: _angular_router__WEBPACK_IMPORTED_MODULE_1__["Router"] }, { type: jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_8__["PlatformUtilsService"] }, { type: jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_5__["I18nService"] }, { type: jslib_common_abstractions_state_service__WEBPACK_IMPORTED_MODULE_9__["StateService"] }, { type: jslib_common_abstractions_environment_service__WEBPACK_IMPORTED_MODULE_4__["EnvironmentService"] }, { type: jslib_common_abstractions_passwordGeneration_service__WEBPACK_IMPORTED_MODULE_7__["PasswordGenerationService"] }, { type: jslib_common_abstractions_cryptoFunction_service__WEBPACK_IMPORTED_MODULE_3__["CryptoFunctionService"] }, { type: jslib_common_abstractions_storage_service__WEBPACK_IMPORTED_MODULE_10__["StorageService"] }, { type: jslib_common_abstractions_sync_service__WEBPACK_IMPORTED_MODULE_11__["SyncService"] }, { type: jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_6__["LogService"] }]; }, null); })();
+
+
+/***/ }),
+
+/***/ "./src/popup/accounts/register.component.ts":
+/*!**************************************************!*\
+ !*** ./src/popup/accounts/register.component.ts ***!
+ \**************************************************/
+/*! exports provided: RegisterComponent */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "RegisterComponent", function() { return RegisterComponent; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var _angular_router__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @angular/router */ "./node_modules/@angular/router/__ivy_ngcc__/fesm2015/router.js");
+/* harmony import */ var jslib_common_abstractions_api_service__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! jslib-common/abstractions/api.service */ "./jslib/common/src/abstractions/api.service.ts");
+/* harmony import */ var jslib_common_abstractions_auth_service__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! jslib-common/abstractions/auth.service */ "./jslib/common/src/abstractions/auth.service.ts");
+/* harmony import */ var jslib_common_abstractions_crypto_service__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! jslib-common/abstractions/crypto.service */ "./jslib/common/src/abstractions/crypto.service.ts");
+/* harmony import */ var jslib_common_abstractions_environment_service__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! jslib-common/abstractions/environment.service */ "./jslib/common/src/abstractions/environment.service.ts");
+/* harmony import */ var jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! jslib-common/abstractions/i18n.service */ "./jslib/common/src/abstractions/i18n.service.ts");
+/* harmony import */ var jslib_common_abstractions_passwordGeneration_service__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! jslib-common/abstractions/passwordGeneration.service */ "./jslib/common/src/abstractions/passwordGeneration.service.ts");
+/* harmony import */ var jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! jslib-common/abstractions/platformUtils.service */ "./jslib/common/src/abstractions/platformUtils.service.ts");
+/* harmony import */ var jslib_common_abstractions_state_service__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! jslib-common/abstractions/state.service */ "./jslib/common/src/abstractions/state.service.ts");
+/* harmony import */ var jslib_angular_components_register_component__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! jslib-angular/components/register.component */ "./jslib/angular/src/components/register.component.ts");
+/* harmony import */ var jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! jslib-common/abstractions/log.service */ "./jslib/common/src/abstractions/log.service.ts");
+/* harmony import */ var _angular_forms__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @angular/forms */ "./node_modules/@angular/forms/__ivy_ngcc__/fesm2015/forms.js");
+/* harmony import */ var jslib_angular_directives_api_action_directive__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! jslib-angular/directives/api-action.directive */ "./jslib/angular/src/directives/api-action.directive.ts");
+/* harmony import */ var jslib_angular_directives_blur_click_directive__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! jslib-angular/directives/blur-click.directive */ "./jslib/angular/src/directives/blur-click.directive.ts");
+/* harmony import */ var jslib_angular_directives_box_row_directive__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! jslib-angular/directives/box-row.directive */ "./jslib/angular/src/directives/box-row.directive.ts");
+/* harmony import */ var jslib_angular_directives_input_verbatim_directive__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! jslib-angular/directives/input-verbatim.directive */ "./jslib/angular/src/directives/input-verbatim.directive.ts");
+/* harmony import */ var jslib_angular_directives_autofocus_directive__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! jslib-angular/directives/autofocus.directive */ "./jslib/angular/src/directives/autofocus.directive.ts");
+/* harmony import */ var _angular_common__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! @angular/common */ "./node_modules/@angular/common/__ivy_ngcc__/fesm2015/common.js");
+/* harmony import */ var jslib_angular_directives_stop_click_directive__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! jslib-angular/directives/stop-click.directive */ "./jslib/angular/src/directives/stop-click.directive.ts");
+/* harmony import */ var jslib_angular_directives_a11y_title_directive__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! jslib-angular/directives/a11y-title.directive */ "./jslib/angular/src/directives/a11y-title.directive.ts");
+/* harmony import */ var jslib_angular_pipes_i18n_pipe__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! jslib-angular/pipes/i18n.pipe */ "./jslib/angular/src/pipes/i18n.pipe.ts");
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+function RegisterComponent_strong_56_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "strong");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r1 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵclassMapInterpolate1"]("sub-label text-", ctx_r1.masterPasswordScoreColor, "");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate1"]("\n ", ctx_r1.masterPasswordScoreText, "\n ");
+} }
+function RegisterComponent_div_127_Template(rf, ctx) { if (rf & 1) {
+ const _r4 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "div", 33);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](2, "div", 11);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](4, "div", 34);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](6, "input", 35);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("ngModelChange", function RegisterComponent_div_127_Template_input_ngModelChange_6_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r4); const ctx_r3 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](); return ctx_r3.acceptPolicies = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](8, "label", 36);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](10, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](11, "br");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](12, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](13, "a", 37);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](14);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](15, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](16, ",\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](17, "a", 38);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](18);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](19, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](20, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](21, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](22, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](23, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r2 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngModel", ctx_r2.acceptPolicies);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate1"]("\n ", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](10, 4, "acceptPolicies"), "");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](15, 6, "termsOfService"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](19, 8, "privacyPolicy"));
+} }
+const _c0 = function (a0, a1) { return { "fa-eye": a0, "fa-eye-slash": a1 }; };
+const _c1 = function (a0) { return { width: a0 }; };
+class RegisterComponent extends jslib_angular_components_register_component__WEBPACK_IMPORTED_MODULE_10__["RegisterComponent"] {
+ constructor(authService, router, i18nService, cryptoService, apiService, stateService, platformUtilsService, passwordGenerationService, environmentService, logService) {
+ super(authService, router, i18nService, cryptoService, apiService, stateService, platformUtilsService, passwordGenerationService, environmentService, logService);
+ }
+}
+RegisterComponent.ɵfac = function RegisterComponent_Factory(t) { return new (t || RegisterComponent)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_auth_service__WEBPACK_IMPORTED_MODULE_3__["AuthService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_router__WEBPACK_IMPORTED_MODULE_1__["Router"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_6__["I18nService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_crypto_service__WEBPACK_IMPORTED_MODULE_4__["CryptoService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_api_service__WEBPACK_IMPORTED_MODULE_2__["ApiService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_state_service__WEBPACK_IMPORTED_MODULE_9__["StateService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_8__["PlatformUtilsService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_passwordGeneration_service__WEBPACK_IMPORTED_MODULE_7__["PasswordGenerationService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_environment_service__WEBPACK_IMPORTED_MODULE_5__["EnvironmentService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_11__["LogService"])); };
+RegisterComponent.ɵcmp = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineComponent"]({ type: RegisterComponent, selectors: [["app-register"]], features: [_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵInheritDefinitionFeature"]], decls: 131, vars: 63, consts: [[3, "appApiAction", "ngSubmit"], ["form", ""], [1, "left"], ["routerLink", "/home"], [1, "center"], [1, "title"], [1, "right"], ["type", "submit", "appBlurClick", "", 3, "disabled"], [3, "hidden"], ["aria-hidden", "true", 1, "fa", "fa-spinner", "fa-lg", "fa-spin", 3, "hidden"], [1, "box"], [1, "box-content"], ["appBoxRow", "", 1, "box-content-row"], ["for", "email"], ["id", "email", "type", "text", "name", "Email", "required", "", "inputmode", "email", "appInputVerbatim", "false", 3, "ngModel", "appAutofocus", "ngModelChange"], [1, "box-content-row-flex"], [1, "row-main"], ["for", "masterPassword"], [3, "class", 4, "ngIf"], ["id", "masterPassword", "name", "MasterPassword", "required", "", "appInputVerbatim", "", 1, "monospaced", 3, "type", "ngModel", "appAutofocus", "ngModelChange", "input"], [1, "action-buttons"], ["type", "button", "appStopClick", "", "appBlurClick", "", 1, "row-btn", 3, "appA11yTitle", "click"], ["aria-hidden", "true", 1, "fa", "fa-lg", 3, "ngClass"], [1, "progress"], ["role", "progressbar", "aria-valuenow", "0", "aria-valuemin", "0", "aria-valuemax", "100", 3, "ngStyle"], [1, "box-footer"], ["appBoxRow", "", 1, "box-content-row", "box-content-row-flex"], ["for", "masterPasswordRetype"], ["id", "masterPasswordRetype", "name", "MasterPasswordRetype", "required", "", "appInputVerbatim", "", 1, "monospaced", 3, "type", "ngModel", "ngModelChange"], ["for", "hint"], ["id", "hint", "type", "text", "name", "Hint", 3, "ngModel", "ngModelChange"], ["id", "hcaptcha_iframe", "height", "80"], ["class", "box last", 4, "ngIf"], [1, "box", "last"], ["appBoxRow", "", 1, "box-content-row", "box-content-row-checkbox", "box-content-row-checkbox-left", "box-content-row-word-break"], ["type", "checkbox", "id", "acceptPolicies", "name", "AcceptPolicies", 3, "ngModel", "ngModelChange"], ["for", "acceptPolicies"], ["href", "https://bitwarden.com/terms/", "target", "_blank", "rel", "noopener"], ["href", "https://bitwarden.com/privacy/", "target", "_blank", "rel", "noopener"]], template: function RegisterComponent_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "form", 0, 1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("ngSubmit", function RegisterComponent_Template_form_ngSubmit_0_listener() { return ctx.submit(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](2, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](3, "header");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](4, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](5, "div", 2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](6, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](7, "a", 3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](9, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](10, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](11, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](12, "div", 4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](13, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](14, "span", 5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](15);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](16, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](17, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](18, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](19, "div", 6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](20, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](21, "button", 7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](22, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](23, "span", 8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](24);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](25, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](26, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](27, "i", 9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](28, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](29, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](30, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](31, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](32, "content");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](33, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](34, "div", 10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](35, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](36, "div", 11);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](37, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](38, "div", 12);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](39, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](40, "label", 13);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](41);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](42, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](43, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](44, "input", 14);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("ngModelChange", function RegisterComponent_Template_input_ngModelChange_44_listener($event) { return ctx.email = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](45, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](46, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](47, "div", 12);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](48, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](49, "div", 15);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](50, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](51, "div", 16);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](52, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](53, "label", 17);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](54);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](55, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](56, RegisterComponent_strong_56_Template, 2, 4, "strong", 18);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](57, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](58, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](59, "input", 19);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("ngModelChange", function RegisterComponent_Template_input_ngModelChange_59_listener($event) { return ctx.masterPassword = $event; })("input", function RegisterComponent_Template_input_input_59_listener() { return ctx.updatePasswordStrength(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](60, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](61, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](62, "div", 20);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](63, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](64, "button", 21);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("click", function RegisterComponent_Template_button_click_64_listener() { return ctx.togglePassword(false); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](65, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](66, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](67, "i", 22);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](68, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](69, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](70, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](71, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](72, "div", 23);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](73, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](74, "div", 24);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](75, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](76, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](77, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](78, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](79, "div", 25);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](80);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](81, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](82, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](83, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](84, "div", 10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](85, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](86, "div", 11);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](87, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](88, "div", 26);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](89, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](90, "div", 16);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](91, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](92, "label", 27);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](93);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](94, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](95, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](96, "input", 28);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("ngModelChange", function RegisterComponent_Template_input_ngModelChange_96_listener($event) { return ctx.confirmMasterPassword = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](97, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](98, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](99, "div", 20);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](100, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](101, "button", 21);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("click", function RegisterComponent_Template_button_click_101_listener() { return ctx.togglePassword(true); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](102, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](103, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](104, "i", 22);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](105, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](106, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](107, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](108, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](109, "div", 12);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](110, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](111, "label", 29);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](112);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](113, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](114, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](115, "input", 30);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("ngModelChange", function RegisterComponent_Template_input_ngModelChange_115_listener($event) { return ctx.hint = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](116, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](117, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](118, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](119, "div", 25);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](120);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](121, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](122, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](123, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](124, "div", 8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](125, "iframe", 31);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](126, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](127, RegisterComponent_div_127_Template, 24, 10, "div", 32);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](128, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](129, "\n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](130, "\n");
+ } if (rf & 2) {
+ const _r0 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵreference"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("appApiAction", ctx.formPromise);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](9, 33, "cancel"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](16, 35, "createAccount"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("disabled", _r0.loading);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("hidden", _r0.loading);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](25, 37, "submit"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("hidden", !_r0.loading);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](14);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](42, 39, "emailAddress"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngModel", ctx.email)("appAutofocus", ctx.email === "");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate1"]("\n ", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](55, 41, "masterPass"), "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", ctx.masterPasswordScoreText);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate"]("type", ctx.showPassword ? "text" : "password");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngModel", ctx.masterPassword)("appAutofocus", ctx.email !== "");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate"]("appA11yTitle", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](65, 43, "toggleVisibility"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngClass", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpureFunction2"](55, _c0, !ctx.showPassword, ctx.showPassword));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵclassMapInterpolate1"]("progress-bar bg-", ctx.masterPasswordScoreColor, "");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngStyle", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpureFunction1"](58, _c1, ctx.masterPasswordScoreWidth + "%"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵattribute"]("aria-valuenow", ctx.masterPasswordScoreWidth);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate1"]("\n ", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](81, 45, "masterPassDesc"), "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](13);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](94, 47, "reTypeMasterPass"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate"]("type", ctx.showPassword ? "text" : "password");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngModel", ctx.confirmMasterPassword);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate"]("appA11yTitle", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](102, 49, "toggleVisibility"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngClass", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpureFunction2"](60, _c0, !ctx.showPassword, ctx.showPassword));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](113, 51, "masterPassHint"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngModel", ctx.hint);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate1"]("\n ", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](121, 53, "masterPassHintDesc"), "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("hidden", !ctx.showCaptcha());
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", ctx.showTerms);
+ } }, directives: [_angular_forms__WEBPACK_IMPORTED_MODULE_12__["ɵangular_packages_forms_forms_ba"], _angular_forms__WEBPACK_IMPORTED_MODULE_12__["NgControlStatusGroup"], _angular_forms__WEBPACK_IMPORTED_MODULE_12__["NgForm"], jslib_angular_directives_api_action_directive__WEBPACK_IMPORTED_MODULE_13__["ApiActionDirective"], _angular_router__WEBPACK_IMPORTED_MODULE_1__["RouterLinkWithHref"], jslib_angular_directives_blur_click_directive__WEBPACK_IMPORTED_MODULE_14__["BlurClickDirective"], jslib_angular_directives_box_row_directive__WEBPACK_IMPORTED_MODULE_15__["BoxRowDirective"], _angular_forms__WEBPACK_IMPORTED_MODULE_12__["DefaultValueAccessor"], _angular_forms__WEBPACK_IMPORTED_MODULE_12__["RequiredValidator"], jslib_angular_directives_input_verbatim_directive__WEBPACK_IMPORTED_MODULE_16__["InputVerbatimDirective"], _angular_forms__WEBPACK_IMPORTED_MODULE_12__["NgControlStatus"], _angular_forms__WEBPACK_IMPORTED_MODULE_12__["NgModel"], jslib_angular_directives_autofocus_directive__WEBPACK_IMPORTED_MODULE_17__["AutofocusDirective"], _angular_common__WEBPACK_IMPORTED_MODULE_18__["NgIf"], jslib_angular_directives_stop_click_directive__WEBPACK_IMPORTED_MODULE_19__["StopClickDirective"], jslib_angular_directives_a11y_title_directive__WEBPACK_IMPORTED_MODULE_20__["A11yTitleDirective"], _angular_common__WEBPACK_IMPORTED_MODULE_18__["NgClass"], _angular_common__WEBPACK_IMPORTED_MODULE_18__["NgStyle"], _angular_forms__WEBPACK_IMPORTED_MODULE_12__["CheckboxControlValueAccessor"]], pipes: [jslib_angular_pipes_i18n_pipe__WEBPACK_IMPORTED_MODULE_21__["I18nPipe"]], encapsulation: 2 });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](RegisterComponent, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Component"],
+ args: [{
+ selector: 'app-register',
+ templateUrl: 'register.component.html',
+ }]
+ }], function () { return [{ type: jslib_common_abstractions_auth_service__WEBPACK_IMPORTED_MODULE_3__["AuthService"] }, { type: _angular_router__WEBPACK_IMPORTED_MODULE_1__["Router"] }, { type: jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_6__["I18nService"] }, { type: jslib_common_abstractions_crypto_service__WEBPACK_IMPORTED_MODULE_4__["CryptoService"] }, { type: jslib_common_abstractions_api_service__WEBPACK_IMPORTED_MODULE_2__["ApiService"] }, { type: jslib_common_abstractions_state_service__WEBPACK_IMPORTED_MODULE_9__["StateService"] }, { type: jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_8__["PlatformUtilsService"] }, { type: jslib_common_abstractions_passwordGeneration_service__WEBPACK_IMPORTED_MODULE_7__["PasswordGenerationService"] }, { type: jslib_common_abstractions_environment_service__WEBPACK_IMPORTED_MODULE_5__["EnvironmentService"] }, { type: jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_11__["LogService"] }]; }, null); })();
+
+
+/***/ }),
+
+/***/ "./src/popup/accounts/set-password.component.ts":
+/*!******************************************************!*\
+ !*** ./src/popup/accounts/set-password.component.ts ***!
+ \******************************************************/
+/*! exports provided: SetPasswordComponent */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SetPasswordComponent", function() { return SetPasswordComponent; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var _angular_router__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @angular/router */ "./node_modules/@angular/router/__ivy_ngcc__/fesm2015/router.js");
+/* harmony import */ var jslib_common_abstractions_api_service__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! jslib-common/abstractions/api.service */ "./jslib/common/src/abstractions/api.service.ts");
+/* harmony import */ var jslib_common_abstractions_crypto_service__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! jslib-common/abstractions/crypto.service */ "./jslib/common/src/abstractions/crypto.service.ts");
+/* harmony import */ var jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! jslib-common/abstractions/i18n.service */ "./jslib/common/src/abstractions/i18n.service.ts");
+/* harmony import */ var jslib_common_abstractions_messaging_service__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! jslib-common/abstractions/messaging.service */ "./jslib/common/src/abstractions/messaging.service.ts");
+/* harmony import */ var jslib_common_abstractions_passwordGeneration_service__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! jslib-common/abstractions/passwordGeneration.service */ "./jslib/common/src/abstractions/passwordGeneration.service.ts");
+/* harmony import */ var jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! jslib-common/abstractions/platformUtils.service */ "./jslib/common/src/abstractions/platformUtils.service.ts");
+/* harmony import */ var jslib_common_abstractions_policy_service__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! jslib-common/abstractions/policy.service */ "./jslib/common/src/abstractions/policy.service.ts");
+/* harmony import */ var jslib_common_abstractions_sync_service__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! jslib-common/abstractions/sync.service */ "./jslib/common/src/abstractions/sync.service.ts");
+/* harmony import */ var jslib_common_abstractions_user_service__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! jslib-common/abstractions/user.service */ "./jslib/common/src/abstractions/user.service.ts");
+/* harmony import */ var jslib_angular_components_set_password_component__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! jslib-angular/components/set-password.component */ "./jslib/angular/src/components/set-password.component.ts");
+/* harmony import */ var _angular_forms__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @angular/forms */ "./node_modules/@angular/forms/__ivy_ngcc__/fesm2015/forms.js");
+/* harmony import */ var jslib_angular_directives_api_action_directive__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! jslib-angular/directives/api-action.directive */ "./jslib/angular/src/directives/api-action.directive.ts");
+/* harmony import */ var jslib_angular_directives_blur_click_directive__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! jslib-angular/directives/blur-click.directive */ "./jslib/angular/src/directives/blur-click.directive.ts");
+/* harmony import */ var _angular_common__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @angular/common */ "./node_modules/@angular/common/__ivy_ngcc__/fesm2015/common.js");
+/* harmony import */ var jslib_angular_components_callout_component__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! jslib-angular/components/callout.component */ "./jslib/angular/src/components/callout.component.ts");
+/* harmony import */ var jslib_angular_directives_box_row_directive__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! jslib-angular/directives/box-row.directive */ "./jslib/angular/src/directives/box-row.directive.ts");
+/* harmony import */ var jslib_angular_directives_input_verbatim_directive__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! jslib-angular/directives/input-verbatim.directive */ "./jslib/angular/src/directives/input-verbatim.directive.ts");
+/* harmony import */ var jslib_angular_directives_stop_click_directive__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! jslib-angular/directives/stop-click.directive */ "./jslib/angular/src/directives/stop-click.directive.ts");
+/* harmony import */ var jslib_angular_directives_a11y_title_directive__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! jslib-angular/directives/a11y-title.directive */ "./jslib/angular/src/directives/a11y-title.directive.ts");
+/* harmony import */ var jslib_angular_pipes_i18n_pipe__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! jslib-angular/pipes/i18n.pipe */ "./jslib/angular/src/pipes/i18n.pipe.ts");
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+function SetPasswordComponent_div_34_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "div", 12);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](2, "i", 13);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} }
+function SetPasswordComponent_div_36_app_callout_8_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "app-callout", 36);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](1, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](3, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate"]("title", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](1, 2, "resetPasswordPolicyAutoEnroll"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate1"]("\n ", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](3, 4, "resetPasswordAutoEnrollInviteWarning"), "\n ");
+} }
+function SetPasswordComponent_div_36_app_callout_10_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "app-callout", 37);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r4 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("enforcedPolicyOptions", ctx_r4.enforcedPolicyOptions);
+} }
+function SetPasswordComponent_div_36_strong_26_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "strong");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r5 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵclassMapInterpolate1"]("sub-label text-", ctx_r5.masterPasswordScoreColor, "");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate1"]("\n ", ctx_r5.masterPasswordScoreText, "\n ");
+} }
+const _c0 = function (a0, a1) { return { "fa-eye": a0, "fa-eye-slash": a1 }; };
+const _c1 = function (a0) { return { width: a0 }; };
+function SetPasswordComponent_div_36_Template(rf, ctx) { if (rf & 1) {
+ const _r7 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "div");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](2, "div", 14);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](4, "app-callout", 15);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](6, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](8, SetPasswordComponent_div_36_app_callout_8_Template, 4, 6, "app-callout", 16);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](9, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](10, SetPasswordComponent_div_36_app_callout_10_Template, 2, 1, "app-callout", 17);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](11, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](12, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](13, "div", 14);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](14, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](15, "div", 18);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](16, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](17, "div", 19);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](18, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](19, "div", 20);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](20, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](21, "div", 21);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](22, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](23, "label", 22);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](24);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](25, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](26, SetPasswordComponent_div_36_strong_26_Template, 2, 4, "strong", 23);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](27, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](28, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](29, "input", 24);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("ngModelChange", function SetPasswordComponent_div_36_Template_input_ngModelChange_29_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r7); const ctx_r6 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](); return ctx_r6.masterPassword = $event; })("input", function SetPasswordComponent_div_36_Template_input_input_29_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r7); const ctx_r8 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](); return ctx_r8.updatePasswordStrength(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](30, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](31, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](32, "div", 25);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](33, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](34, "button", 26);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("click", function SetPasswordComponent_div_36_Template_button_click_34_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r7); const ctx_r9 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](); return ctx_r9.togglePassword(false); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](35, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](36, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](37, "i", 27);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](38, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](39, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](40, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](41, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](42, "div", 28);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](43, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](44, "div", 29);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](45, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](46, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](47, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](48, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](49, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](50, "div", 30);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](51);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](52, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](53, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](54, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](55, "div", 14);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](56, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](57, "div", 18);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](58, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](59, "div", 19);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](60, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](61, "div", 20);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](62, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](63, "div", 21);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](64, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](65, "label", 31);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](66);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](67, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](68, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](69, "input", 32);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("ngModelChange", function SetPasswordComponent_div_36_Template_input_ngModelChange_69_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r7); const ctx_r10 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](); return ctx_r10.masterPasswordRetype = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](70, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](71, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](72, "div", 25);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](73, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](74, "button", 26);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("click", function SetPasswordComponent_div_36_Template_button_click_74_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r7); const ctx_r11 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](); return ctx_r11.togglePassword(true); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](75, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](76, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](77, "i", 27);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](78, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](79, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](80, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](81, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](82, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](83, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](84, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](85, "div", 33);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](86, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](87, "div", 18);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](88, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](89, "div", 19);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](90, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](91, "label", 34);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](92);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](93, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](94, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](95, "input", 35);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("ngModelChange", function SetPasswordComponent_div_36_Template_input_ngModelChange_95_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r7); const ctx_r12 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](); return ctx_r12.hint = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](96, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](97, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](98, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](99, "div", 30);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](100);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](101, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](102, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](103, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r2 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](6, 22, "ssoCompleteRegistration"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", ctx_r2.resetPasswordAutoEnroll);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", ctx_r2.enforcedPolicyOptions);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](14);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate1"]("", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](25, 24, "masterPass"), "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", ctx_r2.masterPasswordScoreText);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate"]("type", ctx_r2.showPassword ? "text" : "password");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngModel", ctx_r2.masterPassword);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate"]("appA11yTitle", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](35, 26, "toggleVisibility"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngClass", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpureFunction2"](38, _c0, !ctx_r2.showPassword, ctx_r2.showPassword));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵclassMapInterpolate1"]("progress-bar bg-", ctx_r2.masterPasswordScoreColor, "");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngStyle", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpureFunction1"](41, _c1, ctx_r2.masterPasswordScoreWidth + "%"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵattribute"]("aria-valuenow", ctx_r2.masterPasswordScoreWidth);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate1"]("\n ", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](52, 28, "masterPassDesc"), "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](15);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](67, 30, "reTypeMasterPass"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngModel", ctx_r2.masterPasswordRetype);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate"]("appA11yTitle", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](75, 32, "toggleVisibility"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngClass", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpureFunction2"](43, _c0, !ctx_r2.showPassword, ctx_r2.showPassword));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](15);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](93, 34, "masterPassHint"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngModel", ctx_r2.hint);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate1"]("\n ", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](101, 36, "masterPassHintDesc"), "\n ");
+} }
+class SetPasswordComponent extends jslib_angular_components_set_password_component__WEBPACK_IMPORTED_MODULE_11__["SetPasswordComponent"] {
+ constructor(apiService, i18nService, cryptoService, messagingService, userService, passwordGenerationService, platformUtilsService, policyService, router, syncService, route) {
+ super(i18nService, cryptoService, messagingService, userService, passwordGenerationService, platformUtilsService, policyService, router, apiService, syncService, route);
+ }
+ get masterPasswordScoreWidth() {
+ return this.masterPasswordScore == null ? 0 : (this.masterPasswordScore + 1) * 20;
+ }
+ get masterPasswordScoreColor() {
+ switch (this.masterPasswordScore) {
+ case 4:
+ return 'success';
+ case 3:
+ return 'primary';
+ case 2:
+ return 'warning';
+ default:
+ return 'danger';
+ }
+ }
+ get masterPasswordScoreText() {
+ switch (this.masterPasswordScore) {
+ case 4:
+ return this.i18nService.t('strong');
+ case 3:
+ return this.i18nService.t('good');
+ case 2:
+ return this.i18nService.t('weak');
+ default:
+ return this.masterPasswordScore != null ? this.i18nService.t('weak') : null;
+ }
+ }
+}
+SetPasswordComponent.ɵfac = function SetPasswordComponent_Factory(t) { return new (t || SetPasswordComponent)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_api_service__WEBPACK_IMPORTED_MODULE_2__["ApiService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_4__["I18nService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_crypto_service__WEBPACK_IMPORTED_MODULE_3__["CryptoService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_messaging_service__WEBPACK_IMPORTED_MODULE_5__["MessagingService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_user_service__WEBPACK_IMPORTED_MODULE_10__["UserService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_passwordGeneration_service__WEBPACK_IMPORTED_MODULE_6__["PasswordGenerationService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_7__["PlatformUtilsService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_policy_service__WEBPACK_IMPORTED_MODULE_8__["PolicyService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_router__WEBPACK_IMPORTED_MODULE_1__["Router"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_sync_service__WEBPACK_IMPORTED_MODULE_9__["SyncService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_router__WEBPACK_IMPORTED_MODULE_1__["ActivatedRoute"])); };
+SetPasswordComponent.ɵcmp = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineComponent"]({ type: SetPasswordComponent, selectors: [["app-set-password"]], features: [_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵInheritDefinitionFeature"]], decls: 40, vars: 15, consts: [[3, "appApiAction", "ngSubmit"], ["form", ""], [1, "left"], ["routerLink", "/home"], [1, "center"], [1, "title"], [1, "right"], ["type", "submit", "appBlurClick", "", 3, "disabled"], [3, "hidden"], ["aria-hidden", "true", 1, "fa", "fa-spinner", "fa-lg", "fa-spin", 3, "hidden"], ["class", "full-loading-spinner", 4, "ngIf"], [4, "ngIf"], [1, "full-loading-spinner"], ["aria-hidden", "true", 1, "fa", "fa-spinner", "fa-spin", "fa-3x"], [1, "box"], ["type", "tip"], ["type", "warning", 3, "title", 4, "ngIf"], ["type", "info", 3, "enforcedPolicyOptions", 4, "ngIf"], [1, "box-content"], ["appBoxRow", "", 1, "box-content-row"], [1, "box-content-row-flex"], [1, "row-main"], ["for", "masterPassword"], [3, "class", 4, "ngIf"], ["id", "masterPassword", "name", "MasterPassword", "required", "", "appInputVerbatim", "", 1, "monospaced", 3, "type", "ngModel", "ngModelChange", "input"], [1, "action-buttons"], ["type", "button", "appStopClick", "", "appBlurClick", "", "role", "button", 1, "row-btn", 3, "appA11yTitle", "click"], ["aria-hidden", "true", 1, "fa", "fa-lg", 3, "ngClass"], [1, "progress"], ["role", "progressbar", "aria-valuenow", "0", "aria-valuemin", "0", "aria-valuemax", "100", 3, "ngStyle"], [1, "box-footer"], ["for", "masterPasswordRetype"], ["id", "masterPasswordRetype", "type", "password", "name", "MasterPasswordRetype", "required", "", "appInputVerbatim", "", "autocomplete", "new-password", 1, "monospaced", 3, "ngModel", "ngModelChange"], [1, "box", "last"], ["for", "hint"], ["id", "hint", "type", "text", "name", "Hint", 3, "ngModel", "ngModelChange"], ["type", "warning", 3, "title"], ["type", "info", 3, "enforcedPolicyOptions"]], template: function SetPasswordComponent_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "form", 0, 1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("ngSubmit", function SetPasswordComponent_Template_form_ngSubmit_0_listener() { return ctx.submit(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](2, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](3, "header");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](4, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](5, "div", 2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](6, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](7, "a", 3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](9, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](10, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](11, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](12, "div", 4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](13, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](14, "span", 5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](15);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](16, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](17, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](18, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](19, "div", 6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](20, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](21, "button", 7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](22, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](23, "span", 8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](24);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](25, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](26, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](27, "i", 9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](28, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](29, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](30, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](31, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](32, "content");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](33, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](34, SetPasswordComponent_div_34_Template, 4, 0, "div", 10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](35, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](36, SetPasswordComponent_div_36_Template, 104, 46, "div", 11);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](37, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](38, "\n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](39, "\n");
+ } if (rf & 2) {
+ const _r0 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵreference"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("appApiAction", ctx.formPromise);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](9, 9, "cancel"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](16, 11, "setMasterPassword"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("disabled", _r0.loading);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("hidden", _r0.loading);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](25, 13, "submit"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("hidden", !_r0.loading);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", ctx.syncLoading);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", !ctx.syncLoading);
+ } }, directives: [_angular_forms__WEBPACK_IMPORTED_MODULE_12__["ɵangular_packages_forms_forms_ba"], _angular_forms__WEBPACK_IMPORTED_MODULE_12__["NgControlStatusGroup"], _angular_forms__WEBPACK_IMPORTED_MODULE_12__["NgForm"], jslib_angular_directives_api_action_directive__WEBPACK_IMPORTED_MODULE_13__["ApiActionDirective"], _angular_router__WEBPACK_IMPORTED_MODULE_1__["RouterLinkWithHref"], jslib_angular_directives_blur_click_directive__WEBPACK_IMPORTED_MODULE_14__["BlurClickDirective"], _angular_common__WEBPACK_IMPORTED_MODULE_15__["NgIf"], jslib_angular_components_callout_component__WEBPACK_IMPORTED_MODULE_16__["CalloutComponent"], jslib_angular_directives_box_row_directive__WEBPACK_IMPORTED_MODULE_17__["BoxRowDirective"], _angular_forms__WEBPACK_IMPORTED_MODULE_12__["DefaultValueAccessor"], _angular_forms__WEBPACK_IMPORTED_MODULE_12__["RequiredValidator"], jslib_angular_directives_input_verbatim_directive__WEBPACK_IMPORTED_MODULE_18__["InputVerbatimDirective"], _angular_forms__WEBPACK_IMPORTED_MODULE_12__["NgControlStatus"], _angular_forms__WEBPACK_IMPORTED_MODULE_12__["NgModel"], jslib_angular_directives_stop_click_directive__WEBPACK_IMPORTED_MODULE_19__["StopClickDirective"], jslib_angular_directives_a11y_title_directive__WEBPACK_IMPORTED_MODULE_20__["A11yTitleDirective"], _angular_common__WEBPACK_IMPORTED_MODULE_15__["NgClass"], _angular_common__WEBPACK_IMPORTED_MODULE_15__["NgStyle"]], pipes: [jslib_angular_pipes_i18n_pipe__WEBPACK_IMPORTED_MODULE_21__["I18nPipe"]], encapsulation: 2 });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](SetPasswordComponent, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Component"],
+ args: [{
+ selector: 'app-set-password',
+ templateUrl: 'set-password.component.html',
+ }]
+ }], function () { return [{ type: jslib_common_abstractions_api_service__WEBPACK_IMPORTED_MODULE_2__["ApiService"] }, { type: jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_4__["I18nService"] }, { type: jslib_common_abstractions_crypto_service__WEBPACK_IMPORTED_MODULE_3__["CryptoService"] }, { type: jslib_common_abstractions_messaging_service__WEBPACK_IMPORTED_MODULE_5__["MessagingService"] }, { type: jslib_common_abstractions_user_service__WEBPACK_IMPORTED_MODULE_10__["UserService"] }, { type: jslib_common_abstractions_passwordGeneration_service__WEBPACK_IMPORTED_MODULE_6__["PasswordGenerationService"] }, { type: jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_7__["PlatformUtilsService"] }, { type: jslib_common_abstractions_policy_service__WEBPACK_IMPORTED_MODULE_8__["PolicyService"] }, { type: _angular_router__WEBPACK_IMPORTED_MODULE_1__["Router"] }, { type: jslib_common_abstractions_sync_service__WEBPACK_IMPORTED_MODULE_9__["SyncService"] }, { type: _angular_router__WEBPACK_IMPORTED_MODULE_1__["ActivatedRoute"] }]; }, null); })();
+
+
+/***/ }),
+
+/***/ "./src/popup/accounts/sso.component.ts":
+/*!*********************************************!*\
+ !*** ./src/popup/accounts/sso.component.ts ***!
+ \*********************************************/
+/*! exports provided: SsoComponent */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SsoComponent", function() { return SsoComponent; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var _angular_router__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @angular/router */ "./node_modules/@angular/router/__ivy_ngcc__/fesm2015/router.js");
+/* harmony import */ var jslib_common_abstractions_api_service__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! jslib-common/abstractions/api.service */ "./jslib/common/src/abstractions/api.service.ts");
+/* harmony import */ var jslib_common_abstractions_auth_service__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! jslib-common/abstractions/auth.service */ "./jslib/common/src/abstractions/auth.service.ts");
+/* harmony import */ var jslib_common_abstractions_cryptoFunction_service__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! jslib-common/abstractions/cryptoFunction.service */ "./jslib/common/src/abstractions/cryptoFunction.service.ts");
+/* harmony import */ var jslib_common_abstractions_environment_service__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! jslib-common/abstractions/environment.service */ "./jslib/common/src/abstractions/environment.service.ts");
+/* harmony import */ var jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! jslib-common/abstractions/i18n.service */ "./jslib/common/src/abstractions/i18n.service.ts");
+/* harmony import */ var jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! jslib-common/abstractions/log.service */ "./jslib/common/src/abstractions/log.service.ts");
+/* harmony import */ var jslib_common_abstractions_passwordGeneration_service__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! jslib-common/abstractions/passwordGeneration.service */ "./jslib/common/src/abstractions/passwordGeneration.service.ts");
+/* harmony import */ var jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! jslib-common/abstractions/platformUtils.service */ "./jslib/common/src/abstractions/platformUtils.service.ts");
+/* harmony import */ var jslib_common_abstractions_state_service__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! jslib-common/abstractions/state.service */ "./jslib/common/src/abstractions/state.service.ts");
+/* harmony import */ var jslib_common_abstractions_storage_service__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! jslib-common/abstractions/storage.service */ "./jslib/common/src/abstractions/storage.service.ts");
+/* harmony import */ var jslib_common_abstractions_sync_service__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! jslib-common/abstractions/sync.service */ "./jslib/common/src/abstractions/sync.service.ts");
+/* harmony import */ var jslib_angular_components_sso_component__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! jslib-angular/components/sso.component */ "./jslib/angular/src/components/sso.component.ts");
+/* harmony import */ var _browser_browserApi__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../../browser/browserApi */ "./src/browser/browserApi.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+class SsoComponent extends jslib_angular_components_sso_component__WEBPACK_IMPORTED_MODULE_13__["SsoComponent"] {
+ constructor(authService, router, i18nService, route, storageService, stateService, platformUtilsService, apiService, cryptoFunctionService, passwordGenerationService, syncService, environmentService, logService) {
+ super(authService, router, i18nService, route, storageService, stateService, platformUtilsService, apiService, cryptoFunctionService, environmentService, passwordGenerationService, logService);
+ const url = this.environmentService.getWebVaultUrl();
+ this.redirectUri = url + '/sso-connector.html';
+ this.clientId = 'browser';
+ super.onSuccessfulLogin = () => __awaiter(this, void 0, void 0, function* () {
+ yield syncService.fullSync(true);
+ _browser_browserApi__WEBPACK_IMPORTED_MODULE_14__["BrowserApi"].reloadOpenWindows();
+ const thisWindow = window.open('', '_self');
+ thisWindow.close();
+ });
+ }
+}
+SsoComponent.ɵfac = function SsoComponent_Factory(t) { return new (t || SsoComponent)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_auth_service__WEBPACK_IMPORTED_MODULE_3__["AuthService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_router__WEBPACK_IMPORTED_MODULE_1__["Router"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_6__["I18nService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_router__WEBPACK_IMPORTED_MODULE_1__["ActivatedRoute"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_storage_service__WEBPACK_IMPORTED_MODULE_11__["StorageService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_state_service__WEBPACK_IMPORTED_MODULE_10__["StateService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_9__["PlatformUtilsService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_api_service__WEBPACK_IMPORTED_MODULE_2__["ApiService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_cryptoFunction_service__WEBPACK_IMPORTED_MODULE_4__["CryptoFunctionService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_passwordGeneration_service__WEBPACK_IMPORTED_MODULE_8__["PasswordGenerationService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_sync_service__WEBPACK_IMPORTED_MODULE_12__["SyncService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_environment_service__WEBPACK_IMPORTED_MODULE_5__["EnvironmentService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_7__["LogService"])); };
+SsoComponent.ɵcmp = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineComponent"]({ type: SsoComponent, selectors: [["app-sso"]], features: [_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵInheritDefinitionFeature"]], decls: 0, vars: 0, template: function SsoComponent_Template(rf, ctx) { }, encapsulation: 2 });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](SsoComponent, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Component"],
+ args: [{
+ selector: 'app-sso',
+ templateUrl: 'sso.component.html',
+ }]
+ }], function () { return [{ type: jslib_common_abstractions_auth_service__WEBPACK_IMPORTED_MODULE_3__["AuthService"] }, { type: _angular_router__WEBPACK_IMPORTED_MODULE_1__["Router"] }, { type: jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_6__["I18nService"] }, { type: _angular_router__WEBPACK_IMPORTED_MODULE_1__["ActivatedRoute"] }, { type: jslib_common_abstractions_storage_service__WEBPACK_IMPORTED_MODULE_11__["StorageService"] }, { type: jslib_common_abstractions_state_service__WEBPACK_IMPORTED_MODULE_10__["StateService"] }, { type: jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_9__["PlatformUtilsService"] }, { type: jslib_common_abstractions_api_service__WEBPACK_IMPORTED_MODULE_2__["ApiService"] }, { type: jslib_common_abstractions_cryptoFunction_service__WEBPACK_IMPORTED_MODULE_4__["CryptoFunctionService"] }, { type: jslib_common_abstractions_passwordGeneration_service__WEBPACK_IMPORTED_MODULE_8__["PasswordGenerationService"] }, { type: jslib_common_abstractions_sync_service__WEBPACK_IMPORTED_MODULE_12__["SyncService"] }, { type: jslib_common_abstractions_environment_service__WEBPACK_IMPORTED_MODULE_5__["EnvironmentService"] }, { type: jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_7__["LogService"] }]; }, null); })();
+
+
+/***/ }),
+
+/***/ "./src/popup/accounts/two-factor-options.component.ts":
+/*!************************************************************!*\
+ !*** ./src/popup/accounts/two-factor-options.component.ts ***!
+ \************************************************************/
+/*! exports provided: TwoFactorOptionsComponent */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TwoFactorOptionsComponent", function() { return TwoFactorOptionsComponent; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var _angular_router__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @angular/router */ "./node_modules/@angular/router/__ivy_ngcc__/fesm2015/router.js");
+/* harmony import */ var jslib_common_abstractions_auth_service__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! jslib-common/abstractions/auth.service */ "./jslib/common/src/abstractions/auth.service.ts");
+/* harmony import */ var jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! jslib-common/abstractions/i18n.service */ "./jslib/common/src/abstractions/i18n.service.ts");
+/* harmony import */ var jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! jslib-common/abstractions/platformUtils.service */ "./jslib/common/src/abstractions/platformUtils.service.ts");
+/* harmony import */ var jslib_angular_components_two_factor_options_component__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! jslib-angular/components/two-factor-options.component */ "./jslib/angular/src/components/two-factor-options.component.ts");
+/* harmony import */ var _angular_common__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @angular/common */ "./node_modules/@angular/common/__ivy_ngcc__/fesm2015/common.js");
+/* harmony import */ var jslib_angular_directives_stop_click_directive__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! jslib-angular/directives/stop-click.directive */ "./jslib/angular/src/directives/stop-click.directive.ts");
+/* harmony import */ var jslib_angular_pipes_i18n_pipe__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! jslib-angular/pipes/i18n.pipe */ "./jslib/angular/src/pipes/i18n.pipe.ts");
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+function TwoFactorOptionsComponent_button_25_Template(rf, ctx) { if (rf & 1) {
+ const _r3 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "button", 8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("click", function TwoFactorOptionsComponent_button_25_Template_button_click_0_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r3); const p_r1 = ctx.$implicit; const ctx_r2 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](); return ctx_r2.choose(p_r1); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](2, "span", 9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](4, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](5, "span", 10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const p_r1 = ctx.$implicit;
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](p_r1.name);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](p_r1.description);
+} }
+class TwoFactorOptionsComponent extends jslib_angular_components_two_factor_options_component__WEBPACK_IMPORTED_MODULE_5__["TwoFactorOptionsComponent"] {
+ constructor(authService, router, i18nService, platformUtilsService) {
+ super(authService, router, i18nService, platformUtilsService, window);
+ }
+ choose(p) {
+ super.choose(p);
+ this.authService.selectedTwoFactorProviderType = p.type;
+ this.router.navigate(['2fa']);
+ }
+}
+TwoFactorOptionsComponent.ɵfac = function TwoFactorOptionsComponent_Factory(t) { return new (t || TwoFactorOptionsComponent)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_auth_service__WEBPACK_IMPORTED_MODULE_2__["AuthService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_router__WEBPACK_IMPORTED_MODULE_1__["Router"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_3__["I18nService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_4__["PlatformUtilsService"])); };
+TwoFactorOptionsComponent.ɵcmp = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineComponent"]({ type: TwoFactorOptionsComponent, selectors: [["app-two-factor-options"]], features: [_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵInheritDefinitionFeature"]], decls: 41, vars: 13, consts: [[1, "left"], ["routerLink", "/2fa"], [1, "center"], [1, "title"], [1, "right"], [1, "box"], [1, "box-content"], ["type", "button", "appStopClick", "", "class", "box-content-row", 3, "click", 4, "ngFor", "ngForOf"], ["type", "button", "appStopClick", "", 1, "box-content-row", 3, "click"], [1, "text"], [1, "detail"]], template: function TwoFactorOptionsComponent_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "header");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](2, "div", 0);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](4, "a", 1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](6, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](8, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](9, "div", 2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](10, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](11, "span", 3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](12);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](13, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](14, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](15, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](16, "div", 4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](17, "\n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](18, "\n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](19, "content");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](20, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](21, "div", 5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](22, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](23, "div", 6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](24, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](25, TwoFactorOptionsComponent_button_25_Template, 8, 2, "button", 7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](26, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](27, "button", 8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("click", function TwoFactorOptionsComponent_Template_button_click_27_listener() { return ctx.recover(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](28, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](29, "span", 9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](30);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](31, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](32, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](33, "span", 10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](34);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](35, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](36, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](37, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](38, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](39, "\n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](40, "\n");
+ } if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](6, 5, "close"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](13, 7, "twoStepOptions"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](13);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngForOf", ctx.providers);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](31, 9, "recoveryCodeTitle"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](35, 11, "recoveryCodeDesc"));
+ } }, directives: [_angular_router__WEBPACK_IMPORTED_MODULE_1__["RouterLinkWithHref"], _angular_common__WEBPACK_IMPORTED_MODULE_6__["NgForOf"], jslib_angular_directives_stop_click_directive__WEBPACK_IMPORTED_MODULE_7__["StopClickDirective"]], pipes: [jslib_angular_pipes_i18n_pipe__WEBPACK_IMPORTED_MODULE_8__["I18nPipe"]], encapsulation: 2 });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](TwoFactorOptionsComponent, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Component"],
+ args: [{
+ selector: 'app-two-factor-options',
+ templateUrl: 'two-factor-options.component.html',
+ }]
+ }], function () { return [{ type: jslib_common_abstractions_auth_service__WEBPACK_IMPORTED_MODULE_2__["AuthService"] }, { type: _angular_router__WEBPACK_IMPORTED_MODULE_1__["Router"] }, { type: jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_3__["I18nService"] }, { type: jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_4__["PlatformUtilsService"] }]; }, null); })();
+
+
+/***/ }),
+
+/***/ "./src/popup/accounts/two-factor.component.ts":
+/*!****************************************************!*\
+ !*** ./src/popup/accounts/two-factor.component.ts ***!
+ \****************************************************/
+/*! exports provided: TwoFactorComponent */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TwoFactorComponent", function() { return TwoFactorComponent; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var _angular_router__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @angular/router */ "./node_modules/@angular/router/__ivy_ngcc__/fesm2015/router.js");
+/* harmony import */ var rxjs_operators__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! rxjs/operators */ "./node_modules/rxjs/_esm5/operators/index.js");
+/* harmony import */ var jslib_common_enums_twoFactorProviderType__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! jslib-common/enums/twoFactorProviderType */ "./jslib/common/src/enums/twoFactorProviderType.ts");
+/* harmony import */ var jslib_common_abstractions_api_service__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! jslib-common/abstractions/api.service */ "./jslib/common/src/abstractions/api.service.ts");
+/* harmony import */ var jslib_common_abstractions_auth_service__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! jslib-common/abstractions/auth.service */ "./jslib/common/src/abstractions/auth.service.ts");
+/* harmony import */ var jslib_common_abstractions_environment_service__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! jslib-common/abstractions/environment.service */ "./jslib/common/src/abstractions/environment.service.ts");
+/* harmony import */ var jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! jslib-common/abstractions/i18n.service */ "./jslib/common/src/abstractions/i18n.service.ts");
+/* harmony import */ var jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! jslib-common/abstractions/log.service */ "./jslib/common/src/abstractions/log.service.ts");
+/* harmony import */ var jslib_common_abstractions_messaging_service__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! jslib-common/abstractions/messaging.service */ "./jslib/common/src/abstractions/messaging.service.ts");
+/* harmony import */ var jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! jslib-common/abstractions/platformUtils.service */ "./jslib/common/src/abstractions/platformUtils.service.ts");
+/* harmony import */ var jslib_common_abstractions_state_service__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! jslib-common/abstractions/state.service */ "./jslib/common/src/abstractions/state.service.ts");
+/* harmony import */ var jslib_common_abstractions_storage_service__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! jslib-common/abstractions/storage.service */ "./jslib/common/src/abstractions/storage.service.ts");
+/* harmony import */ var jslib_common_abstractions_sync_service__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! jslib-common/abstractions/sync.service */ "./jslib/common/src/abstractions/sync.service.ts");
+/* harmony import */ var jslib_angular_services_broadcaster_service__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! jslib-angular/services/broadcaster.service */ "./jslib/angular/src/services/broadcaster.service.ts");
+/* harmony import */ var jslib_angular_components_two_factor_component__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! jslib-angular/components/two-factor.component */ "./jslib/angular/src/components/two-factor.component.ts");
+/* harmony import */ var _services_popup_utils_service__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../services/popup-utils.service */ "./src/popup/services/popup-utils.service.ts");
+/* harmony import */ var _browser_browserApi__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../../browser/browserApi */ "./src/browser/browserApi.ts");
+/* harmony import */ var _angular_forms__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! @angular/forms */ "./node_modules/@angular/forms/__ivy_ngcc__/fesm2015/forms.js");
+/* harmony import */ var jslib_angular_directives_api_action_directive__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! jslib-angular/directives/api-action.directive */ "./jslib/angular/src/directives/api-action.directive.ts");
+/* harmony import */ var _angular_common__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! @angular/common */ "./node_modules/@angular/common/__ivy_ngcc__/fesm2015/common.js");
+/* harmony import */ var jslib_angular_directives_blur_click_directive__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! jslib-angular/directives/blur-click.directive */ "./jslib/angular/src/directives/blur-click.directive.ts");
+/* harmony import */ var jslib_angular_directives_box_row_directive__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! jslib-angular/directives/box-row.directive */ "./jslib/angular/src/directives/box-row.directive.ts");
+/* harmony import */ var jslib_angular_directives_autofocus_directive__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! jslib-angular/directives/autofocus.directive */ "./jslib/angular/src/directives/autofocus.directive.ts");
+/* harmony import */ var jslib_angular_directives_input_verbatim_directive__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! jslib-angular/directives/input-verbatim.directive */ "./jslib/angular/src/directives/input-verbatim.directive.ts");
+/* harmony import */ var jslib_angular_directives_stop_click_directive__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! jslib-angular/directives/stop-click.directive */ "./jslib/angular/src/directives/stop-click.directive.ts");
+/* harmony import */ var jslib_angular_pipes_i18n_pipe__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! jslib-angular/pipes/i18n.pipe */ "./jslib/angular/src/pipes/i18n.pipe.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+function TwoFactorComponent_button_20_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "button", 11);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](2, "span", 12);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](4, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](6, "i", 13);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"]();
+ const _r0 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵreference"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("disabled", _r0.loading);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("hidden", _r0.loading);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](4, 4, "continue"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("hidden", !_r0.loading);
+} }
+function TwoFactorComponent_ng_container_26_span_4_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "span");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](2, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate1"]("\n ", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](2, 1, "enterVerificationCodeApp"), "\n ");
+} }
+function TwoFactorComponent_ng_container_26_span_6_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "span");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](2, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r10 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate1"]("\n ", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind2"](2, 1, "enterVerificationCodeEmail", ctx_r10.twoFactorEmail), "\n ");
+} }
+function TwoFactorComponent_ng_container_26_Template(rf, ctx) { if (rf & 1) {
+ const _r12 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementContainerStart"](0);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](2, "div", 14);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](4, TwoFactorComponent_ng_container_26_span_4_Template, 3, 3, "span", 8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](6, TwoFactorComponent_ng_container_26_span_6_Template, 3, 4, "span", 8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](8, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](9, "div", 15);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](10, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](11, "div", 16);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](12, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](13, "div", 17);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](14, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](15, "label", 18);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](16);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](17, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](18, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](19, "input", 19);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("ngModelChange", function TwoFactorComponent_ng_container_26_Template_input_ngModelChange_19_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r12); const ctx_r11 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](); return ctx_r11.token = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](20, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](21, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](22, "div", 20);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](23, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](24, "label", 21);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](25);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](26, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](27, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](28, "input", 22);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("ngModelChange", function TwoFactorComponent_ng_container_26_Template_input_ngModelChange_28_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r12); const ctx_r13 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](); return ctx_r13.remember = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](29, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](30, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](31, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](32, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementContainerEnd"]();
+} if (rf & 2) {
+ const ctx_r2 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", ctx_r2.selectedProviderType === ctx_r2.providerType.Authenticator);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", ctx_r2.selectedProviderType === ctx_r2.providerType.Email);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](17, 6, "verificationCode"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngModel", ctx_r2.token);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](26, 8, "rememberMe"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngModel", ctx_r2.remember);
+} }
+function TwoFactorComponent_ng_container_28_Template(rf, ctx) { if (rf & 1) {
+ const _r15 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementContainerStart"](0);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](2, "div", 14);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](4, "p", 23);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](6, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](8, "img", 24);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](9, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](10, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](11, "div", 15);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](12, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](13, "div", 16);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](14, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](15, "div", 17);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](16, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](17, "label", 25);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](18);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](19, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](20, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](21, "input", 26);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("ngModelChange", function TwoFactorComponent_ng_container_28_Template_input_ngModelChange_21_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r15); const ctx_r14 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](); return ctx_r14.token = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](22, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](23, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](24, "div", 20);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](25, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](26, "label", 21);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](27);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](28, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](29, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](30, "input", 22);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("ngModelChange", function TwoFactorComponent_ng_container_28_Template_input_ngModelChange_30_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r15); const ctx_r16 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](); return ctx_r16.remember = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](31, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](32, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](33, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](34, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementContainerEnd"]();
+} if (rf & 2) {
+ const ctx_r3 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](6, 5, "insertYubiKey"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](13);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](19, 7, "verificationCode"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngModel", ctx_r3.token);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](28, 9, "rememberMe"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngModel", ctx_r3.remember);
+} }
+function TwoFactorComponent_ng_container_30_Template(rf, ctx) { if (rf & 1) {
+ const _r18 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementContainerStart"](0);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](2, "div", 27);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](3, "iframe", 28);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](4, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](5, "div", 29);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](6, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](7, "div", 16);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](8, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](9, "div", 20);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](10, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](11, "label", 21);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](12);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](13, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](14, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](15, "input", 22);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("ngModelChange", function TwoFactorComponent_ng_container_30_Template_input_ngModelChange_15_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r18); const ctx_r17 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](); return ctx_r17.remember = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](16, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](17, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](18, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](19, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementContainerEnd"]();
+} if (rf & 2) {
+ const ctx_r4 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("allow", ctx_r4.webAuthnAllow);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](13, 3, "rememberMe"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngModel", ctx_r4.remember);
+} }
+function TwoFactorComponent_ng_container_32_div_2_Template(rf, ctx) { if (rf & 1) {
+ const _r21 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "div", 14);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](2, "p", 23);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](4, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](6, "button", 31);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("click", function TwoFactorComponent_ng_container_32_div_2_Template_button_click_6_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r21); const ctx_r20 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](2); return ctx_r20.authWebAuthn(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](8, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](9, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](4, 2, "webAuthnNewTab"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](8, 4, "webAuthnNewTabOpen"));
+} }
+function TwoFactorComponent_ng_container_32_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementContainerStart"](0);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](2, TwoFactorComponent_ng_container_32_div_2_Template, 10, 6, "div", 30);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementContainerEnd"]();
+} if (rf & 2) {
+ const ctx_r5 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", ctx_r5.webAuthnNewTab);
+} }
+function TwoFactorComponent_ng_container_34_Template(rf, ctx) { if (rf & 1) {
+ const _r23 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementContainerStart"](0);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](2, "div", 32);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](3, "iframe", 33);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](4, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](5, "div", 29);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](6, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](7, "div", 16);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](8, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](9, "div", 20);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](10, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](11, "label", 21);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](12);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](13, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](14, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](15, "input", 22);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("ngModelChange", function TwoFactorComponent_ng_container_34_Template_input_ngModelChange_15_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r23); const ctx_r22 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](); return ctx_r22.remember = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](16, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](17, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](18, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](19, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementContainerEnd"]();
+} if (rf & 2) {
+ const ctx_r6 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](12);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](13, 2, "rememberMe"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngModel", ctx_r6.remember);
+} }
+function TwoFactorComponent_div_36_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "div", 34);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](2, "p", 23);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](4, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](6, "p", 23);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](8, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](9, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](4, 2, "noTwoStepProviders"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](8, 4, "noTwoStepProviders2"));
+} }
+function TwoFactorComponent_div_38_p_9_Template(rf, ctx) { if (rf & 1) {
+ const _r26 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "p", 23);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](2, "button", 38);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("click", function TwoFactorComponent_div_38_p_9_Template_button_click_2_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r26); const ctx_r25 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](2); return ctx_r25.sendEmail(true); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](4, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r24 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("appApiAction", ctx_r24.emailPromise);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate1"]("\n ", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](4, 2, "sendVerificationCodeEmailAgain"), "\n ");
+} }
+function TwoFactorComponent_div_38_Template(rf, ctx) { if (rf & 1) {
+ const _r28 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "div", 35);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](2, "p", 23);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](4, "button", 36);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("click", function TwoFactorComponent_div_38_Template_button_click_4_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r28); const ctx_r27 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](); return ctx_r27.anotherMethod(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](6, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](8, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](9, TwoFactorComponent_div_38_p_9_Template, 6, 4, "p", 37);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](10, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r8 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](6, 2, "useAnotherTwoStepMethod"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", ctx_r8.selectedProviderType === ctx_r8.providerType.Email);
+} }
+const BroadcasterSubscriptionId = 'TwoFactorComponent';
+class TwoFactorComponent extends jslib_angular_components_two_factor_component__WEBPACK_IMPORTED_MODULE_15__["TwoFactorComponent"] {
+ constructor(authService, router, i18nService, apiService, platformUtilsService, syncService, environmentService, broadcasterService, popupUtilsService, stateService, storageService, route, messagingService, logService) {
+ super(authService, router, i18nService, apiService, platformUtilsService, window, environmentService, stateService, storageService, route, logService);
+ this.syncService = syncService;
+ this.broadcasterService = broadcasterService;
+ this.popupUtilsService = popupUtilsService;
+ this.messagingService = messagingService;
+ this.showNewWindowMessage = false;
+ super.onSuccessfulLogin = () => {
+ return syncService.fullSync(true);
+ };
+ super.successRoute = '/tabs/vault';
+ this.webAuthnNewTab = this.platformUtilsService.isFirefox() || this.platformUtilsService.isSafari();
+ }
+ ngOnInit() {
+ const _super = Object.create(null, {
+ onSuccessfulLogin: { get: () => super.onSuccessfulLogin, set: v => super.onSuccessfulLogin = v },
+ ngOnInit: { get: () => super.ngOnInit, set: v => super.ngOnInit = v }
+ });
+ return __awaiter(this, void 0, void 0, function* () {
+ if (this.route.snapshot.paramMap.has('webAuthnResponse')) {
+ // WebAuthn fallback response
+ this.selectedProviderType = jslib_common_enums_twoFactorProviderType__WEBPACK_IMPORTED_MODULE_3__["TwoFactorProviderType"].WebAuthn;
+ this.token = this.route.snapshot.paramMap.get('webAuthnResponse');
+ _super.onSuccessfulLogin = () => __awaiter(this, void 0, void 0, function* () {
+ this.syncService.fullSync(true);
+ this.messagingService.send('reloadPopup');
+ window.close();
+ });
+ this.remember = this.route.snapshot.paramMap.get('remember') === 'true';
+ yield this.doSubmit();
+ return;
+ }
+ yield _super.ngOnInit.call(this);
+ if (this.selectedProviderType == null) {
+ return;
+ }
+ // WebAuthn prompt appears inside the popup on linux, and requires a larger popup width
+ // than usual to avoid cutting off the dialog.
+ if (this.selectedProviderType === jslib_common_enums_twoFactorProviderType__WEBPACK_IMPORTED_MODULE_3__["TwoFactorProviderType"].WebAuthn && (yield this.isLinux())) {
+ document.body.classList.add('linux-webauthn');
+ }
+ if (this.selectedProviderType === jslib_common_enums_twoFactorProviderType__WEBPACK_IMPORTED_MODULE_3__["TwoFactorProviderType"].Email &&
+ this.popupUtilsService.inPopup(window)) {
+ const confirmed = yield this.platformUtilsService.showDialog(this.i18nService.t('popup2faCloseMessage'), null, this.i18nService.t('yes'), this.i18nService.t('no'));
+ if (confirmed) {
+ this.popupUtilsService.popOut(window);
+ }
+ }
+ this.route.queryParams.pipe(Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_2__["first"])()).subscribe((qParams) => __awaiter(this, void 0, void 0, function* () {
+ if (qParams.sso === 'true') {
+ _super.onSuccessfulLogin = () => {
+ _browser_browserApi__WEBPACK_IMPORTED_MODULE_17__["BrowserApi"].reloadOpenWindows();
+ const thisWindow = window.open('', '_self');
+ thisWindow.close();
+ return this.syncService.fullSync(true);
+ };
+ }
+ }));
+ });
+ }
+ ngOnDestroy() {
+ const _super = Object.create(null, {
+ ngOnDestroy: { get: () => super.ngOnDestroy }
+ });
+ return __awaiter(this, void 0, void 0, function* () {
+ this.broadcasterService.unsubscribe(BroadcasterSubscriptionId);
+ if (this.selectedProviderType === jslib_common_enums_twoFactorProviderType__WEBPACK_IMPORTED_MODULE_3__["TwoFactorProviderType"].WebAuthn && (yield this.isLinux())) {
+ document.body.classList.remove('linux-webauthn');
+ }
+ _super.ngOnDestroy.call(this);
+ });
+ }
+ anotherMethod() {
+ this.router.navigate(['2fa-options']);
+ }
+ isLinux() {
+ return __awaiter(this, void 0, void 0, function* () {
+ return (yield _browser_browserApi__WEBPACK_IMPORTED_MODULE_17__["BrowserApi"].getPlatformInfo()).os === 'linux';
+ });
+ }
+}
+TwoFactorComponent.ɵfac = function TwoFactorComponent_Factory(t) { return new (t || TwoFactorComponent)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_auth_service__WEBPACK_IMPORTED_MODULE_5__["AuthService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_router__WEBPACK_IMPORTED_MODULE_1__["Router"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_7__["I18nService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_api_service__WEBPACK_IMPORTED_MODULE_4__["ApiService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_10__["PlatformUtilsService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_sync_service__WEBPACK_IMPORTED_MODULE_13__["SyncService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_environment_service__WEBPACK_IMPORTED_MODULE_6__["EnvironmentService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_angular_services_broadcaster_service__WEBPACK_IMPORTED_MODULE_14__["BroadcasterService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_services_popup_utils_service__WEBPACK_IMPORTED_MODULE_16__["PopupUtilsService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_state_service__WEBPACK_IMPORTED_MODULE_11__["StateService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_storage_service__WEBPACK_IMPORTED_MODULE_12__["StorageService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_router__WEBPACK_IMPORTED_MODULE_1__["ActivatedRoute"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_messaging_service__WEBPACK_IMPORTED_MODULE_9__["MessagingService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_8__["LogService"])); };
+TwoFactorComponent.ɵcmp = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineComponent"]({ type: TwoFactorComponent, selectors: [["app-two-factor"]], features: [_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵInheritDefinitionFeature"]], decls: 42, vars: 13, consts: [["id", "two-factor-page", 3, "appApiAction", "ngSubmit"], ["form", ""], [1, "left"], ["routerLink", "/login"], [1, "center"], [1, "title"], [1, "right"], ["type", "submit", "appBlurClick", "", 3, "disabled", 4, "ngIf"], [4, "ngIf"], ["class", "content", 4, "ngIf"], ["class", "content no-vpad", 4, "ngIf"], ["type", "submit", "appBlurClick", "", 3, "disabled"], [3, "hidden"], ["aria-hidden", "true", 1, "fa", "fa-spinner", "fa-lg", "fa-spin", 3, "hidden"], [1, "content", "text-center"], [1, "box", "first"], [1, "box-content"], ["appBoxRow", "", 1, "box-content-row"], ["for", "code"], ["id", "code", "type", "text", "name", "Code", "required", "", "appAutofocus", "", "inputmode", "tel", "appInputVerbatim", "", 3, "ngModel", "ngModelChange"], ["appBoxRow", "", 1, "box-content-row", "box-content-row-checkbox"], ["for", "remember"], ["id", "remember", "type", "checkbox", "name", "Remember", 3, "ngModel", "ngModelChange"], [1, "text-center"], ["src", "./images/yubikey.jpg", "alt", "", 1, "img-rounded", "img-responsive"], ["for", "code", 1, "sr-only"], ["id", "code", "type", "password", "name", "Code", "required", "", "appAutofocus", "", "appInputVerbatim", "", 3, "ngModel", "ngModelChange"], ["id", "web-authn-frame"], ["id", "webauthn_iframe", 3, "allow"], [1, "box"], ["class", "content text-center", 4, "ngIf"], ["type", "button", "appStopClick", "", 1, "btn", "primary", "block", 3, "click"], ["id", "duo-frame"], ["id", "duo_iframe"], [1, "content"], [1, "content", "no-vpad"], ["type", "button", "appStopClick", "", 3, "click"], ["class", "text-center", 4, "ngIf"], ["type", "button", "appStopClick", "", 3, "appApiAction", "click"]], template: function TwoFactorComponent_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "form", 0, 1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("ngSubmit", function TwoFactorComponent_Template_form_ngSubmit_0_listener() { return ctx.submit(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](2, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](3, "header");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](4, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](5, "div", 2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](6, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](7, "a", 3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](9, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](10, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](11, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](12, "div", 4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](13, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](14, "span", 5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](15);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](16, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](17, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](18, "div", 6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](19, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](20, TwoFactorComponent_button_20_Template, 8, 6, "button", 7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](21, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](22, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](23, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](24, "content");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](25, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](26, TwoFactorComponent_ng_container_26_Template, 33, 10, "ng-container", 8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](27, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](28, TwoFactorComponent_ng_container_28_Template, 35, 11, "ng-container", 8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](29, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](30, TwoFactorComponent_ng_container_30_Template, 20, 5, "ng-container", 8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](31, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](32, TwoFactorComponent_ng_container_32_Template, 4, 1, "ng-container", 8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](33, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](34, TwoFactorComponent_ng_container_34_Template, 20, 4, "ng-container", 8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](35, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](36, TwoFactorComponent_div_36_Template, 10, 6, "div", 9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](37, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](38, TwoFactorComponent_div_38_Template, 11, 4, "div", 10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](39, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](40, "\n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](41, "\n");
+ } if (rf & 2) {
+ const _r0 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵreference"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("appApiAction", ctx.formPromise);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](9, 11, "back"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](ctx.title);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", ctx.selectedProviderType != null && ctx.selectedProviderType !== ctx.providerType.Duo && ctx.selectedProviderType !== ctx.providerType.OrganizationDuo && (ctx.selectedProviderType !== ctx.providerType.WebAuthn || _r0.loading));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", ctx.selectedProviderType === ctx.providerType.Authenticator || ctx.selectedProviderType === ctx.providerType.Email);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", ctx.selectedProviderType === ctx.providerType.Yubikey);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", ctx.selectedProviderType === ctx.providerType.WebAuthn && !ctx.webAuthnNewTab);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", ctx.selectedProviderType === ctx.providerType.WebAuthn && ctx.webAuthnNewTab);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", ctx.selectedProviderType === ctx.providerType.Duo || ctx.selectedProviderType === ctx.providerType.OrganizationDuo);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", ctx.selectedProviderType == null);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", ctx.selectedProviderType != null);
+ } }, directives: [_angular_forms__WEBPACK_IMPORTED_MODULE_18__["ɵangular_packages_forms_forms_ba"], _angular_forms__WEBPACK_IMPORTED_MODULE_18__["NgControlStatusGroup"], _angular_forms__WEBPACK_IMPORTED_MODULE_18__["NgForm"], jslib_angular_directives_api_action_directive__WEBPACK_IMPORTED_MODULE_19__["ApiActionDirective"], _angular_router__WEBPACK_IMPORTED_MODULE_1__["RouterLinkWithHref"], _angular_common__WEBPACK_IMPORTED_MODULE_20__["NgIf"], jslib_angular_directives_blur_click_directive__WEBPACK_IMPORTED_MODULE_21__["BlurClickDirective"], jslib_angular_directives_box_row_directive__WEBPACK_IMPORTED_MODULE_22__["BoxRowDirective"], _angular_forms__WEBPACK_IMPORTED_MODULE_18__["DefaultValueAccessor"], _angular_forms__WEBPACK_IMPORTED_MODULE_18__["RequiredValidator"], jslib_angular_directives_autofocus_directive__WEBPACK_IMPORTED_MODULE_23__["AutofocusDirective"], jslib_angular_directives_input_verbatim_directive__WEBPACK_IMPORTED_MODULE_24__["InputVerbatimDirective"], _angular_forms__WEBPACK_IMPORTED_MODULE_18__["NgControlStatus"], _angular_forms__WEBPACK_IMPORTED_MODULE_18__["NgModel"], _angular_forms__WEBPACK_IMPORTED_MODULE_18__["CheckboxControlValueAccessor"], jslib_angular_directives_stop_click_directive__WEBPACK_IMPORTED_MODULE_25__["StopClickDirective"]], pipes: [jslib_angular_pipes_i18n_pipe__WEBPACK_IMPORTED_MODULE_26__["I18nPipe"]], encapsulation: 2 });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](TwoFactorComponent, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Component"],
+ args: [{
+ selector: 'app-two-factor',
+ templateUrl: 'two-factor.component.html',
+ }]
+ }], function () { return [{ type: jslib_common_abstractions_auth_service__WEBPACK_IMPORTED_MODULE_5__["AuthService"] }, { type: _angular_router__WEBPACK_IMPORTED_MODULE_1__["Router"] }, { type: jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_7__["I18nService"] }, { type: jslib_common_abstractions_api_service__WEBPACK_IMPORTED_MODULE_4__["ApiService"] }, { type: jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_10__["PlatformUtilsService"] }, { type: jslib_common_abstractions_sync_service__WEBPACK_IMPORTED_MODULE_13__["SyncService"] }, { type: jslib_common_abstractions_environment_service__WEBPACK_IMPORTED_MODULE_6__["EnvironmentService"] }, { type: jslib_angular_services_broadcaster_service__WEBPACK_IMPORTED_MODULE_14__["BroadcasterService"] }, { type: _services_popup_utils_service__WEBPACK_IMPORTED_MODULE_16__["PopupUtilsService"] }, { type: jslib_common_abstractions_state_service__WEBPACK_IMPORTED_MODULE_11__["StateService"] }, { type: jslib_common_abstractions_storage_service__WEBPACK_IMPORTED_MODULE_12__["StorageService"] }, { type: _angular_router__WEBPACK_IMPORTED_MODULE_1__["ActivatedRoute"] }, { type: jslib_common_abstractions_messaging_service__WEBPACK_IMPORTED_MODULE_9__["MessagingService"] }, { type: jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_8__["LogService"] }]; }, null); })();
+
+
+/***/ }),
+
+/***/ "./src/popup/accounts/update-temp-password.component.ts":
+/*!**************************************************************!*\
+ !*** ./src/popup/accounts/update-temp-password.component.ts ***!
+ \**************************************************************/
+/*! exports provided: UpdateTempPasswordComponent */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "UpdateTempPasswordComponent", function() { return UpdateTempPasswordComponent; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var jslib_common_abstractions_api_service__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! jslib-common/abstractions/api.service */ "./jslib/common/src/abstractions/api.service.ts");
+/* harmony import */ var jslib_common_abstractions_crypto_service__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! jslib-common/abstractions/crypto.service */ "./jslib/common/src/abstractions/crypto.service.ts");
+/* harmony import */ var jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! jslib-common/abstractions/i18n.service */ "./jslib/common/src/abstractions/i18n.service.ts");
+/* harmony import */ var jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! jslib-common/abstractions/log.service */ "./jslib/common/src/abstractions/log.service.ts");
+/* harmony import */ var jslib_common_abstractions_messaging_service__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! jslib-common/abstractions/messaging.service */ "./jslib/common/src/abstractions/messaging.service.ts");
+/* harmony import */ var jslib_common_abstractions_passwordGeneration_service__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! jslib-common/abstractions/passwordGeneration.service */ "./jslib/common/src/abstractions/passwordGeneration.service.ts");
+/* harmony import */ var jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! jslib-common/abstractions/platformUtils.service */ "./jslib/common/src/abstractions/platformUtils.service.ts");
+/* harmony import */ var jslib_common_abstractions_policy_service__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! jslib-common/abstractions/policy.service */ "./jslib/common/src/abstractions/policy.service.ts");
+/* harmony import */ var jslib_common_abstractions_sync_service__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! jslib-common/abstractions/sync.service */ "./jslib/common/src/abstractions/sync.service.ts");
+/* harmony import */ var jslib_common_abstractions_user_service__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! jslib-common/abstractions/user.service */ "./jslib/common/src/abstractions/user.service.ts");
+/* harmony import */ var jslib_angular_components_update_temp_password_component__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! jslib-angular/components/update-temp-password.component */ "./jslib/angular/src/components/update-temp-password.component.ts");
+/* harmony import */ var _angular_forms__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @angular/forms */ "./node_modules/@angular/forms/__ivy_ngcc__/fesm2015/forms.js");
+/* harmony import */ var jslib_angular_directives_api_action_directive__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! jslib-angular/directives/api-action.directive */ "./jslib/angular/src/directives/api-action.directive.ts");
+/* harmony import */ var jslib_angular_directives_blur_click_directive__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! jslib-angular/directives/blur-click.directive */ "./jslib/angular/src/directives/blur-click.directive.ts");
+/* harmony import */ var jslib_angular_components_callout_component__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! jslib-angular/components/callout.component */ "./jslib/angular/src/components/callout.component.ts");
+/* harmony import */ var _angular_common__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @angular/common */ "./node_modules/@angular/common/__ivy_ngcc__/fesm2015/common.js");
+/* harmony import */ var jslib_angular_directives_box_row_directive__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! jslib-angular/directives/box-row.directive */ "./jslib/angular/src/directives/box-row.directive.ts");
+/* harmony import */ var jslib_angular_directives_input_verbatim_directive__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! jslib-angular/directives/input-verbatim.directive */ "./jslib/angular/src/directives/input-verbatim.directive.ts");
+/* harmony import */ var jslib_angular_directives_stop_click_directive__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! jslib-angular/directives/stop-click.directive */ "./jslib/angular/src/directives/stop-click.directive.ts");
+/* harmony import */ var jslib_angular_directives_a11y_title_directive__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! jslib-angular/directives/a11y-title.directive */ "./jslib/angular/src/directives/a11y-title.directive.ts");
+/* harmony import */ var jslib_angular_pipes_i18n_pipe__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! jslib-angular/pipes/i18n.pipe */ "./jslib/angular/src/pipes/i18n.pipe.ts");
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+function UpdateTempPasswordComponent_app_callout_39_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "app-callout", 31);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r1 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("enforcedPolicyOptions", ctx_r1.enforcedPolicyOptions);
+} }
+function UpdateTempPasswordComponent_strong_54_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "strong");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r2 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵclassMapInterpolate1"]("sub-label text-", ctx_r2.masterPasswordScoreStyle.Color, "");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate1"]("\n ", ctx_r2.masterPasswordScoreStyle.Text, "\n ");
+} }
+const _c0 = function (a0, a1) { return { "fa-eye": a0, "fa-eye-slash": a1 }; };
+const _c1 = function (a0) { return { width: a0 }; };
+class UpdateTempPasswordComponent extends jslib_angular_components_update_temp_password_component__WEBPACK_IMPORTED_MODULE_11__["UpdateTempPasswordComponent"] {
+ constructor(i18nService, platformUtilsService, passwordGenerationService, policyService, cryptoService, userService, messagingService, apiService, syncService, logService) {
+ super(i18nService, platformUtilsService, passwordGenerationService, policyService, cryptoService, userService, messagingService, apiService, syncService, logService);
+ }
+ get masterPasswordScoreStyle() {
+ const scoreWidth = this.masterPasswordScore == null ? 0 : (this.masterPasswordScore + 1) * 20;
+ switch (this.masterPasswordScore) {
+ case 4:
+ return {
+ Color: 'bg-success',
+ Text: 'strong',
+ Width: scoreWidth,
+ };
+ case 3:
+ return {
+ Color: 'bg-primary',
+ Text: 'good',
+ Width: scoreWidth,
+ };
+ case 2:
+ return {
+ Color: 'bg-warning',
+ Text: 'weak',
+ Width: scoreWidth,
+ };
+ default:
+ return {
+ Color: 'bg-danger',
+ Text: 'weak',
+ Width: scoreWidth,
+ };
+ }
+ }
+}
+UpdateTempPasswordComponent.ɵfac = function UpdateTempPasswordComponent_Factory(t) { return new (t || UpdateTempPasswordComponent)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_3__["I18nService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_7__["PlatformUtilsService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_passwordGeneration_service__WEBPACK_IMPORTED_MODULE_6__["PasswordGenerationService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_policy_service__WEBPACK_IMPORTED_MODULE_8__["PolicyService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_crypto_service__WEBPACK_IMPORTED_MODULE_2__["CryptoService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_user_service__WEBPACK_IMPORTED_MODULE_10__["UserService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_messaging_service__WEBPACK_IMPORTED_MODULE_5__["MessagingService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_api_service__WEBPACK_IMPORTED_MODULE_1__["ApiService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_sync_service__WEBPACK_IMPORTED_MODULE_9__["SyncService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_4__["LogService"])); };
+UpdateTempPasswordComponent.ɵcmp = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineComponent"]({ type: UpdateTempPasswordComponent, selectors: [["app-update-temp-password"]], features: [_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵInheritDefinitionFeature"]], decls: 126, vars: 59, consts: [[3, "appApiAction", "ngSubmit"], ["form", ""], [1, "left"], [3, "click"], [1, "center"], [1, "title"], [1, "right"], ["type", "submit", "appBlurClick", "", 3, "disabled"], [3, "hidden"], ["aria-hidden", "true", 1, "fa", "fa-spinner", "fa-lg", "fa-spin", 3, "hidden"], ["type", "warning", 3, "title"], ["type", "info", 3, "enforcedPolicyOptions", 4, "ngIf"], [1, "box"], [1, "box-content"], ["appBoxRow", "", 1, "box-content-row"], [1, "box-content-row-flex"], [1, "row-main"], ["for", "masterPassword"], [3, "class", 4, "ngIf"], ["id", "masterPassword", "name", "MasterPassword", "required", "", "appInputVerbatim", "", 1, "monospaced", 3, "type", "ngModel", "ngModelChange", "input"], [1, "action-buttons"], ["type", "button", "appStopClick", "", "appBlurClick", "", 1, "row-btn", 3, "appA11yTitle", "click"], ["aria-hidden", "true", 1, "fa", "fa-lg", 3, "ngClass"], [1, "progress"], ["role", "progressbar", "aria-valuenow", "0", "aria-valuemin", "0", "aria-valuemax", "100", 3, "ngStyle"], ["appBoxRow", "", 1, "box-content-row", "box-content-row-flex"], ["for", "masterPasswordRetype"], ["id", "masterPasswordRetype", "name", "MasterPasswordRetype", "required", "", "appInputVerbatim", "", 1, "monospaced", 3, "type", "ngModel", "ngModelChange"], ["for", "hint"], ["id", "hint", "type", "text", "name", "Hint", 3, "ngModel", "ngModelChange"], [1, "box-footer"], ["type", "info", 3, "enforcedPolicyOptions"]], template: function UpdateTempPasswordComponent_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "form", 0, 1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("ngSubmit", function UpdateTempPasswordComponent_Template_form_ngSubmit_0_listener() { return ctx.submit(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](2, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](3, "header");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](4, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](5, "div", 2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](6, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](7, "a", 3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("click", function UpdateTempPasswordComponent_Template_a_click_7_listener() { return ctx.logOut(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](9, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](10, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](11, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](12, "div", 4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](13, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](14, "span", 5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](15);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](16, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](17, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](18, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](19, "div", 6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](20, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](21, "button", 7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](22, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](23, "span", 8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](24);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](25, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](26, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](27, "i", 9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](28, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](29, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](30, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](31, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](32, "content");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](33, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](34, "app-callout", 10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](35, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](36);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](37, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](38, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](39, UpdateTempPasswordComponent_app_callout_39_Template, 2, 1, "app-callout", 11);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](40, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](41, "div", 12);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](42, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](43, "div", 13);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](44, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](45, "div", 14);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](46, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](47, "div", 15);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](48, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](49, "div", 16);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](50, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](51, "label", 17);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](52);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](53, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](54, UpdateTempPasswordComponent_strong_54_Template, 2, 4, "strong", 18);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](55, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](56, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](57, "input", 19);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("ngModelChange", function UpdateTempPasswordComponent_Template_input_ngModelChange_57_listener($event) { return ctx.masterPassword = $event; })("input", function UpdateTempPasswordComponent_Template_input_input_57_listener() { return ctx.updatePasswordStrength(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](58, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](59, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](60, "div", 20);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](61, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](62, "button", 21);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("click", function UpdateTempPasswordComponent_Template_button_click_62_listener() { return ctx.togglePassword(false); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](63, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](64, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](65, "i", 22);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](66, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](67, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](68, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](69, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](70, "div", 23);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](71, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](72, "div", 24);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](73, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](74, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](75, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](76, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](77, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](78, "div", 12);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](79, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](80, "div", 13);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](81, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](82, "div", 25);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](83, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](84, "div", 16);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](85, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](86, "label", 26);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](87);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](88, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](89, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](90, "input", 27);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("ngModelChange", function UpdateTempPasswordComponent_Template_input_ngModelChange_90_listener($event) { return ctx.masterPasswordRetype = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](91, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](92, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](93, "div", 20);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](94, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](95, "button", 21);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("click", function UpdateTempPasswordComponent_Template_button_click_95_listener() { return ctx.togglePassword(true); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](96, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](97, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](98, "i", 22);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](99, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](100, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](101, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](102, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](103, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](104, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](105, "div", 12);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](106, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](107, "div", 13);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](108, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](109, "div", 14);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](110, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](111, "label", 28);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](112);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](113, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](114, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](115, "input", 29);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("ngModelChange", function UpdateTempPasswordComponent_Template_input_ngModelChange_115_listener($event) { return ctx.hint = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](116, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](117, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](118, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](119, "div", 30);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](120);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](121, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](122, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](123, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](124, "\n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](125, "\n");
+ } if (rf & 2) {
+ const _r0 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵreference"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("appApiAction", ctx.formPromise);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](9, 29, "logOut"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](16, 31, "updateMasterPassword"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("disabled", _r0.loading);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("hidden", _r0.loading);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](25, 33, "submit"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("hidden", !_r0.loading);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate"]("title", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](35, 35, "updateMasterPassword"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate1"]("\n ", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](37, 37, "updateMasterPasswordWarning"), "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", ctx.enforcedPolicyOptions);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](13);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate1"]("\n ", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](53, 39, "masterPass"), "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", ctx.masterPasswordScoreStyle.Text);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate"]("type", ctx.showPassword ? "text" : "password");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngModel", ctx.masterPassword);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate"]("appA11yTitle", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](63, 41, "toggleVisibility"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngClass", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpureFunction2"](51, _c0, !ctx.showPassword, ctx.showPassword));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵclassMapInterpolate1"]("progress-bar bg-", ctx.masterPasswordScoreStyle.Color, "");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngStyle", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpureFunction1"](54, _c1, ctx.masterPasswordScoreStyle.Width + "%"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵattribute"]("aria-valuenow", ctx.masterPasswordScoreStyle.Width);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](15);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](88, 43, "reTypeMasterPass"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate"]("type", ctx.showPassword ? "text" : "password");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngModel", ctx.masterPasswordRetype);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate"]("appA11yTitle", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](96, 45, "toggleVisibility"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngClass", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpureFunction2"](56, _c0, !ctx.showPassword, ctx.showPassword));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](14);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](113, 47, "masterPassHint"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngModel", ctx.hint);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate1"]("\n ", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](121, 49, "masterPassHintDesc"), "\n ");
+ } }, directives: [_angular_forms__WEBPACK_IMPORTED_MODULE_12__["ɵangular_packages_forms_forms_ba"], _angular_forms__WEBPACK_IMPORTED_MODULE_12__["NgControlStatusGroup"], _angular_forms__WEBPACK_IMPORTED_MODULE_12__["NgForm"], jslib_angular_directives_api_action_directive__WEBPACK_IMPORTED_MODULE_13__["ApiActionDirective"], jslib_angular_directives_blur_click_directive__WEBPACK_IMPORTED_MODULE_14__["BlurClickDirective"], jslib_angular_components_callout_component__WEBPACK_IMPORTED_MODULE_15__["CalloutComponent"], _angular_common__WEBPACK_IMPORTED_MODULE_16__["NgIf"], jslib_angular_directives_box_row_directive__WEBPACK_IMPORTED_MODULE_17__["BoxRowDirective"], _angular_forms__WEBPACK_IMPORTED_MODULE_12__["DefaultValueAccessor"], _angular_forms__WEBPACK_IMPORTED_MODULE_12__["RequiredValidator"], jslib_angular_directives_input_verbatim_directive__WEBPACK_IMPORTED_MODULE_18__["InputVerbatimDirective"], _angular_forms__WEBPACK_IMPORTED_MODULE_12__["NgControlStatus"], _angular_forms__WEBPACK_IMPORTED_MODULE_12__["NgModel"], jslib_angular_directives_stop_click_directive__WEBPACK_IMPORTED_MODULE_19__["StopClickDirective"], jslib_angular_directives_a11y_title_directive__WEBPACK_IMPORTED_MODULE_20__["A11yTitleDirective"], _angular_common__WEBPACK_IMPORTED_MODULE_16__["NgClass"], _angular_common__WEBPACK_IMPORTED_MODULE_16__["NgStyle"]], pipes: [jslib_angular_pipes_i18n_pipe__WEBPACK_IMPORTED_MODULE_21__["I18nPipe"]], encapsulation: 2 });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](UpdateTempPasswordComponent, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Component"],
+ args: [{
+ selector: 'app-update-temp-password',
+ templateUrl: 'update-temp-password.component.html',
+ }]
+ }], function () { return [{ type: jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_3__["I18nService"] }, { type: jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_7__["PlatformUtilsService"] }, { type: jslib_common_abstractions_passwordGeneration_service__WEBPACK_IMPORTED_MODULE_6__["PasswordGenerationService"] }, { type: jslib_common_abstractions_policy_service__WEBPACK_IMPORTED_MODULE_8__["PolicyService"] }, { type: jslib_common_abstractions_crypto_service__WEBPACK_IMPORTED_MODULE_2__["CryptoService"] }, { type: jslib_common_abstractions_user_service__WEBPACK_IMPORTED_MODULE_10__["UserService"] }, { type: jslib_common_abstractions_messaging_service__WEBPACK_IMPORTED_MODULE_5__["MessagingService"] }, { type: jslib_common_abstractions_api_service__WEBPACK_IMPORTED_MODULE_1__["ApiService"] }, { type: jslib_common_abstractions_sync_service__WEBPACK_IMPORTED_MODULE_9__["SyncService"] }, { type: jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_4__["LogService"] }]; }, null); })();
+
+
+/***/ }),
+
+/***/ "./src/popup/app-routing.animations.ts":
+/*!*********************************************!*\
+ !*** ./src/popup/app-routing.animations.ts ***!
+ \*********************************************/
+/*! exports provided: queryTranslate, queryTranslateX, queryTranslateY, tabsToCiphers, ciphersToTabs, ciphersToView, viewToCiphers, routerTransition */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "queryTranslate", function() { return queryTranslate; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "queryTranslateX", function() { return queryTranslateX; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "queryTranslateY", function() { return queryTranslateY; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "tabsToCiphers", function() { return tabsToCiphers; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ciphersToTabs", function() { return ciphersToTabs; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ciphersToView", function() { return ciphersToView; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "viewToCiphers", function() { return viewToCiphers; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "routerTransition", function() { return routerTransition; });
+/* harmony import */ var _angular_animations__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/animations */ "./node_modules/@angular/animations/__ivy_ngcc__/fesm2015/animations.js");
+
+const queryShown = Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["query"])(':enter, :leave', [
+ Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["style"])({ position: 'fixed', width: '100%', height: '100%' }),
+], { optional: true });
+// ref: https://github.com/angular/angular/issues/15477
+const queryChildRoute = Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["query"])('router-outlet ~ *', [
+ Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["style"])({}),
+ Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["animate"])(1, Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["style"])({})),
+], { optional: true });
+const speed = '0.4s';
+function queryTranslate(direction, axis, from, to, zIndex = 1000) {
+ return Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["query"])(':' + direction, [
+ Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["style"])({ transform: 'translate' + axis + '(' + from + '%)', zIndex: zIndex, boxShadow: '0 3px 2px -2px gray' }),
+ Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["animate"])(speed + ' ease-in-out', Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["style"])({ transform: 'translate' + axis + '(' + to + '%)' })),
+ ], { optional: true });
+}
+function queryTranslateX(direction, from, to, zIndex = 1000) {
+ return queryTranslate(direction, 'X', from, to, zIndex);
+}
+function queryTranslateY(direction, from, to, zIndex = 1000) {
+ return queryTranslate(direction, 'Y', from, to, zIndex);
+}
+const inSlideLeft = [
+ queryShown,
+ Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["group"])([
+ queryTranslateX('enter', 100, 0),
+ queryTranslateX('leave', 0, -100),
+ queryChildRoute,
+ ]),
+];
+const outSlideRight = [
+ queryShown,
+ Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["group"])([
+ queryTranslateX('enter', -100, 0),
+ queryTranslateX('leave', 0, 100),
+ ]),
+];
+const inSlideUp = [
+ queryShown,
+ Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["group"])([
+ queryTranslateY('enter', 100, 0, 1010),
+ queryTranslateY('leave', 0, 0),
+ queryChildRoute,
+ ]),
+];
+const outSlideDown = [
+ queryShown,
+ Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["group"])([
+ queryTranslateY('enter', 0, 0),
+ queryTranslateY('leave', 0, 100, 1010),
+ ]),
+];
+const inSlideDown = [
+ queryShown,
+ Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["group"])([
+ queryTranslateY('enter', -100, 0, 1010),
+ queryTranslateY('leave', 0, 0),
+ queryChildRoute,
+ ]),
+];
+const outSlideUp = [
+ queryShown,
+ Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["group"])([
+ queryTranslateY('enter', 0, 0),
+ queryTranslateY('leave', 0, -100, 1010),
+ ]),
+];
+function tabsToCiphers(fromState, toState) {
+ if (fromState == null || toState === null || toState.indexOf('ciphers_') === -1) {
+ return false;
+ }
+ return (fromState.indexOf('ciphers_') === 0 && fromState.indexOf('ciphers_direction=b') === -1) ||
+ fromState === 'tabs';
+}
+function ciphersToTabs(fromState, toState) {
+ if (fromState == null || toState === null || fromState.indexOf('ciphers_') === -1) {
+ return false;
+ }
+ return toState.indexOf('ciphers_direction=b') === 0 || toState === 'tabs';
+}
+function ciphersToView(fromState, toState) {
+ if (fromState == null || toState === null) {
+ return false;
+ }
+ return fromState.indexOf('ciphers_') === 0 &&
+ (toState === 'view-cipher' || toState === 'add-cipher' || toState === 'clone-cipher');
+}
+function viewToCiphers(fromState, toState) {
+ if (fromState == null || toState === null) {
+ return false;
+ }
+ return (fromState === 'view-cipher' || fromState === 'add-cipher' || fromState === 'clone-cipher') &&
+ toState.indexOf('ciphers_') === 0;
+}
+const routerTransition = Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["trigger"])('routerTransition', [
+ Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["transition"])('void => home', inSlideLeft),
+ Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["transition"])('void => tabs', inSlideLeft),
+ Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["transition"])('home => environment, home => login, home => register', inSlideUp),
+ Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["transition"])('login => home', outSlideDown),
+ Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["transition"])('login => hint', inSlideUp),
+ Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["transition"])('login => tabs, login => 2fa', inSlideLeft),
+ Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["transition"])('hint => login, register => home, environment => home', outSlideDown),
+ Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["transition"])('2fa => login', outSlideRight),
+ Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["transition"])('2fa => 2fa-options', inSlideUp),
+ Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["transition"])('2fa-options => 2fa', outSlideDown),
+ Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["transition"])('2fa => tabs', inSlideLeft),
+ Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["transition"])(tabsToCiphers, inSlideLeft),
+ Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["transition"])(ciphersToTabs, outSlideRight),
+ Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["transition"])(ciphersToView, inSlideUp),
+ Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["transition"])(viewToCiphers, outSlideDown),
+ Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["transition"])('tabs => view-cipher', inSlideUp),
+ Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["transition"])('view-cipher => tabs', outSlideDown),
+ Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["transition"])('view-cipher => edit-cipher, view-cipher => cipher-password-history', inSlideUp),
+ Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["transition"])('edit-cipher => view-cipher, cipher-password-history => view-cipher, edit-cipher => tabs', outSlideDown),
+ Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["transition"])('view-cipher => clone-cipher', inSlideUp),
+ Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["transition"])('clone-cipher => view-cipher, clone-cipher => tabs', outSlideDown),
+ Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["transition"])('view-cipher => share-cipher', inSlideUp),
+ Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["transition"])('share-cipher => view-cipher', outSlideDown),
+ Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["transition"])('tabs => add-cipher', inSlideUp),
+ Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["transition"])('add-cipher => tabs', outSlideDown),
+ Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["transition"])('generator => generator-history, tabs => generator-history', inSlideLeft),
+ Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["transition"])('generator-history => generator, generator-history => tabs', outSlideRight),
+ Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["transition"])('add-cipher => generator, edit-cipher => generator, clone-cipher => generator', inSlideUp),
+ Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["transition"])('generator => add-cipher, generator => edit-cipher, generator => clone-cipher', outSlideDown),
+ Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["transition"])('edit-cipher => attachments, edit-cipher => collections', inSlideLeft),
+ Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["transition"])('attachments => edit-cipher, collections => edit-cipher', outSlideRight),
+ Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["transition"])('clone-cipher => attachments, clone-cipher => collections', inSlideLeft),
+ Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["transition"])('attachments => clone-cipher, collections => clone-cipher', outSlideRight),
+ Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["transition"])('tabs => export', inSlideLeft),
+ Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["transition"])('export => tabs', outSlideRight),
+ Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["transition"])('tabs => folders', inSlideLeft),
+ Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["transition"])('folders => tabs', outSlideRight),
+ Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["transition"])('folders => edit-folder, folders => add-folder', inSlideUp),
+ Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["transition"])('edit-folder => folders, add-folder => folders', outSlideDown),
+ Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["transition"])('tabs => sync', inSlideLeft),
+ Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["transition"])('sync => tabs', outSlideRight),
+ Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["transition"])('tabs => options', inSlideLeft),
+ Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["transition"])('options => tabs', outSlideRight),
+ Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["transition"])('tabs => premium', inSlideLeft),
+ Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["transition"])('premium => tabs', outSlideRight),
+ Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["transition"])('tabs => lock', inSlideDown),
+ Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["transition"])('tabs => send-type', inSlideLeft),
+ Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["transition"])('send-type => tabs', outSlideRight),
+ Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["transition"])('tabs => add-send, send-type => add-send', inSlideUp),
+ Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["transition"])('add-send => tabs, add-send => send-type', outSlideDown),
+ Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["transition"])('tabs => edit-send, send-type => edit-send', inSlideUp),
+ Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["transition"])('edit-send => tabs, edit-send => send-type', outSlideDown),
+]);
+
+
+/***/ }),
+
+/***/ "./src/popup/app-routing.module.ts":
+/*!*****************************************!*\
+ !*** ./src/popup/app-routing.module.ts ***!
+ \*****************************************/
+/*! exports provided: NoRouteReuseStrategy, AppRoutingModule */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "NoRouteReuseStrategy", function() { return NoRouteReuseStrategy; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AppRoutingModule", function() { return AppRoutingModule; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var _angular_router__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @angular/router */ "./node_modules/@angular/router/__ivy_ngcc__/fesm2015/router.js");
+/* harmony import */ var jslib_angular_services_auth_guard_service__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! jslib-angular/services/auth-guard.service */ "./jslib/angular/src/services/auth-guard.service.ts");
+/* harmony import */ var _services_debounceNavigationService__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./services/debounceNavigationService */ "./src/popup/services/debounceNavigationService.ts");
+/* harmony import */ var _services_launch_guard_service__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./services/launch-guard.service */ "./src/popup/services/launch-guard.service.ts");
+/* harmony import */ var _services_lock_guard_service__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./services/lock-guard.service */ "./src/popup/services/lock-guard.service.ts");
+/* harmony import */ var _accounts_environment_component__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./accounts/environment.component */ "./src/popup/accounts/environment.component.ts");
+/* harmony import */ var _accounts_hint_component__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./accounts/hint.component */ "./src/popup/accounts/hint.component.ts");
+/* harmony import */ var _accounts_home_component__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./accounts/home.component */ "./src/popup/accounts/home.component.ts");
+/* harmony import */ var _accounts_lock_component__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./accounts/lock.component */ "./src/popup/accounts/lock.component.ts");
+/* harmony import */ var _accounts_login_component__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./accounts/login.component */ "./src/popup/accounts/login.component.ts");
+/* harmony import */ var _accounts_register_component__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./accounts/register.component */ "./src/popup/accounts/register.component.ts");
+/* harmony import */ var _accounts_set_password_component__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./accounts/set-password.component */ "./src/popup/accounts/set-password.component.ts");
+/* harmony import */ var _accounts_sso_component__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./accounts/sso.component */ "./src/popup/accounts/sso.component.ts");
+/* harmony import */ var _accounts_two_factor_options_component__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./accounts/two-factor-options.component */ "./src/popup/accounts/two-factor-options.component.ts");
+/* harmony import */ var _accounts_two_factor_component__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./accounts/two-factor.component */ "./src/popup/accounts/two-factor.component.ts");
+/* harmony import */ var _accounts_update_temp_password_component__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./accounts/update-temp-password.component */ "./src/popup/accounts/update-temp-password.component.ts");
+/* harmony import */ var _generator_password_generator_history_component__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./generator/password-generator-history.component */ "./src/popup/generator/password-generator-history.component.ts");
+/* harmony import */ var _generator_password_generator_component__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./generator/password-generator.component */ "./src/popup/generator/password-generator.component.ts");
+/* harmony import */ var _private_mode_component__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./private-mode.component */ "./src/popup/private-mode.component.ts");
+/* harmony import */ var _tabs_component__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./tabs.component */ "./src/popup/tabs.component.ts");
+/* harmony import */ var _settings_excluded_domains_component__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./settings/excluded-domains.component */ "./src/popup/settings/excluded-domains.component.ts");
+/* harmony import */ var _settings_export_component__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./settings/export.component */ "./src/popup/settings/export.component.ts");
+/* harmony import */ var _settings_folder_add_edit_component__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./settings/folder-add-edit.component */ "./src/popup/settings/folder-add-edit.component.ts");
+/* harmony import */ var _settings_folders_component__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./settings/folders.component */ "./src/popup/settings/folders.component.ts");
+/* harmony import */ var _settings_options_component__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ./settings/options.component */ "./src/popup/settings/options.component.ts");
+/* harmony import */ var _settings_premium_component__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ./settings/premium.component */ "./src/popup/settings/premium.component.ts");
+/* harmony import */ var _settings_settings_component__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ./settings/settings.component */ "./src/popup/settings/settings.component.ts");
+/* harmony import */ var _settings_sync_component__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ./settings/sync.component */ "./src/popup/settings/sync.component.ts");
+/* harmony import */ var _vault_add_edit_component__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ./vault/add-edit.component */ "./src/popup/vault/add-edit.component.ts");
+/* harmony import */ var _vault_attachments_component__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ./vault/attachments.component */ "./src/popup/vault/attachments.component.ts");
+/* harmony import */ var _vault_ciphers_component__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ./vault/ciphers.component */ "./src/popup/vault/ciphers.component.ts");
+/* harmony import */ var _vault_collections_component__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ./vault/collections.component */ "./src/popup/vault/collections.component.ts");
+/* harmony import */ var _vault_current_tab_component__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! ./vault/current-tab.component */ "./src/popup/vault/current-tab.component.ts");
+/* harmony import */ var _vault_groupings_component__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! ./vault/groupings.component */ "./src/popup/vault/groupings.component.ts");
+/* harmony import */ var _vault_password_history_component__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! ./vault/password-history.component */ "./src/popup/vault/password-history.component.ts");
+/* harmony import */ var _vault_share_component__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! ./vault/share.component */ "./src/popup/vault/share.component.ts");
+/* harmony import */ var _vault_view_component__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! ./vault/view.component */ "./src/popup/vault/view.component.ts");
+/* harmony import */ var _send_send_add_edit_component__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(/*! ./send/send-add-edit.component */ "./src/popup/send/send-add-edit.component.ts");
+/* harmony import */ var _send_send_groupings_component__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(/*! ./send/send-groupings.component */ "./src/popup/send/send-groupings.component.ts");
+/* harmony import */ var _send_send_type_component__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(/*! ./send/send-type.component */ "./src/popup/send/send-type.component.ts");
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+const routes = [
+ {
+ path: '',
+ redirectTo: 'home',
+ pathMatch: 'full',
+ },
+ {
+ path: 'vault',
+ redirectTo: '/tabs/vault',
+ pathMatch: 'full',
+ },
+ {
+ path: 'home',
+ component: _accounts_home_component__WEBPACK_IMPORTED_MODULE_8__["HomeComponent"],
+ canActivate: [_services_launch_guard_service__WEBPACK_IMPORTED_MODULE_4__["LaunchGuardService"]],
+ data: { state: 'home' },
+ },
+ {
+ path: 'login',
+ component: _accounts_login_component__WEBPACK_IMPORTED_MODULE_10__["LoginComponent"],
+ canActivate: [_services_launch_guard_service__WEBPACK_IMPORTED_MODULE_4__["LaunchGuardService"]],
+ data: { state: 'login' },
+ },
+ {
+ path: 'lock',
+ component: _accounts_lock_component__WEBPACK_IMPORTED_MODULE_9__["LockComponent"],
+ canActivate: [_services_lock_guard_service__WEBPACK_IMPORTED_MODULE_5__["LockGuardService"]],
+ data: { state: 'lock' },
+ },
+ {
+ path: '2fa',
+ component: _accounts_two_factor_component__WEBPACK_IMPORTED_MODULE_15__["TwoFactorComponent"],
+ canActivate: [_services_launch_guard_service__WEBPACK_IMPORTED_MODULE_4__["LaunchGuardService"]],
+ data: { state: '2fa' },
+ },
+ {
+ path: '2fa-options',
+ component: _accounts_two_factor_options_component__WEBPACK_IMPORTED_MODULE_14__["TwoFactorOptionsComponent"],
+ canActivate: [_services_launch_guard_service__WEBPACK_IMPORTED_MODULE_4__["LaunchGuardService"]],
+ data: { state: '2fa-options' },
+ },
+ {
+ path: 'sso',
+ component: _accounts_sso_component__WEBPACK_IMPORTED_MODULE_13__["SsoComponent"],
+ canActivate: [_services_launch_guard_service__WEBPACK_IMPORTED_MODULE_4__["LaunchGuardService"]],
+ data: { state: 'sso' },
+ },
+ {
+ path: 'set-password',
+ component: _accounts_set_password_component__WEBPACK_IMPORTED_MODULE_12__["SetPasswordComponent"],
+ data: { state: 'set-password' },
+ },
+ {
+ path: 'register',
+ component: _accounts_register_component__WEBPACK_IMPORTED_MODULE_11__["RegisterComponent"],
+ canActivate: [_services_launch_guard_service__WEBPACK_IMPORTED_MODULE_4__["LaunchGuardService"]],
+ data: { state: 'register' },
+ },
+ {
+ path: 'hint',
+ component: _accounts_hint_component__WEBPACK_IMPORTED_MODULE_7__["HintComponent"],
+ canActivate: [_services_launch_guard_service__WEBPACK_IMPORTED_MODULE_4__["LaunchGuardService"]],
+ data: { state: 'hint' },
+ },
+ {
+ path: 'environment',
+ component: _accounts_environment_component__WEBPACK_IMPORTED_MODULE_6__["EnvironmentComponent"],
+ canActivate: [_services_launch_guard_service__WEBPACK_IMPORTED_MODULE_4__["LaunchGuardService"]],
+ data: { state: 'environment' },
+ },
+ {
+ path: 'ciphers',
+ component: _vault_ciphers_component__WEBPACK_IMPORTED_MODULE_31__["CiphersComponent"],
+ canActivate: [jslib_angular_services_auth_guard_service__WEBPACK_IMPORTED_MODULE_2__["AuthGuardService"]],
+ data: { state: 'ciphers' },
+ },
+ {
+ path: 'view-cipher',
+ component: _vault_view_component__WEBPACK_IMPORTED_MODULE_37__["ViewComponent"],
+ canActivate: [jslib_angular_services_auth_guard_service__WEBPACK_IMPORTED_MODULE_2__["AuthGuardService"]],
+ data: { state: 'view-cipher' },
+ },
+ {
+ path: 'cipher-password-history',
+ component: _vault_password_history_component__WEBPACK_IMPORTED_MODULE_35__["PasswordHistoryComponent"],
+ canActivate: [jslib_angular_services_auth_guard_service__WEBPACK_IMPORTED_MODULE_2__["AuthGuardService"]],
+ data: { state: 'cipher-password-history' },
+ },
+ {
+ path: 'add-cipher',
+ component: _vault_add_edit_component__WEBPACK_IMPORTED_MODULE_29__["AddEditComponent"],
+ canActivate: [jslib_angular_services_auth_guard_service__WEBPACK_IMPORTED_MODULE_2__["AuthGuardService"], _services_debounceNavigationService__WEBPACK_IMPORTED_MODULE_3__["DebounceNavigationService"]],
+ data: { state: 'add-cipher' },
+ runGuardsAndResolvers: 'always',
+ },
+ {
+ path: 'edit-cipher',
+ component: _vault_add_edit_component__WEBPACK_IMPORTED_MODULE_29__["AddEditComponent"],
+ canActivate: [jslib_angular_services_auth_guard_service__WEBPACK_IMPORTED_MODULE_2__["AuthGuardService"], _services_debounceNavigationService__WEBPACK_IMPORTED_MODULE_3__["DebounceNavigationService"]],
+ data: { state: 'edit-cipher' },
+ runGuardsAndResolvers: 'always',
+ },
+ {
+ path: 'share-cipher',
+ component: _vault_share_component__WEBPACK_IMPORTED_MODULE_36__["ShareComponent"],
+ canActivate: [jslib_angular_services_auth_guard_service__WEBPACK_IMPORTED_MODULE_2__["AuthGuardService"]],
+ data: { state: 'share-cipher' },
+ },
+ {
+ path: 'collections',
+ component: _vault_collections_component__WEBPACK_IMPORTED_MODULE_32__["CollectionsComponent"],
+ canActivate: [jslib_angular_services_auth_guard_service__WEBPACK_IMPORTED_MODULE_2__["AuthGuardService"]],
+ data: { state: 'collections' },
+ },
+ {
+ path: 'attachments',
+ component: _vault_attachments_component__WEBPACK_IMPORTED_MODULE_30__["AttachmentsComponent"],
+ canActivate: [jslib_angular_services_auth_guard_service__WEBPACK_IMPORTED_MODULE_2__["AuthGuardService"]],
+ data: { state: 'attachments' },
+ },
+ {
+ path: 'generator',
+ component: _generator_password_generator_component__WEBPACK_IMPORTED_MODULE_18__["PasswordGeneratorComponent"],
+ canActivate: [jslib_angular_services_auth_guard_service__WEBPACK_IMPORTED_MODULE_2__["AuthGuardService"]],
+ data: { state: 'generator' },
+ },
+ {
+ path: 'generator-history',
+ component: _generator_password_generator_history_component__WEBPACK_IMPORTED_MODULE_17__["PasswordGeneratorHistoryComponent"],
+ canActivate: [jslib_angular_services_auth_guard_service__WEBPACK_IMPORTED_MODULE_2__["AuthGuardService"]],
+ data: { state: 'generator-history' },
+ },
+ {
+ path: 'export',
+ component: _settings_export_component__WEBPACK_IMPORTED_MODULE_22__["ExportComponent"],
+ canActivate: [jslib_angular_services_auth_guard_service__WEBPACK_IMPORTED_MODULE_2__["AuthGuardService"]],
+ data: { state: 'export' },
+ },
+ {
+ path: 'folders',
+ component: _settings_folders_component__WEBPACK_IMPORTED_MODULE_24__["FoldersComponent"],
+ canActivate: [jslib_angular_services_auth_guard_service__WEBPACK_IMPORTED_MODULE_2__["AuthGuardService"]],
+ data: { state: 'folders' },
+ },
+ {
+ path: 'add-folder',
+ component: _settings_folder_add_edit_component__WEBPACK_IMPORTED_MODULE_23__["FolderAddEditComponent"],
+ canActivate: [jslib_angular_services_auth_guard_service__WEBPACK_IMPORTED_MODULE_2__["AuthGuardService"]],
+ data: { state: 'add-folder' },
+ },
+ {
+ path: 'edit-folder',
+ component: _settings_folder_add_edit_component__WEBPACK_IMPORTED_MODULE_23__["FolderAddEditComponent"],
+ canActivate: [jslib_angular_services_auth_guard_service__WEBPACK_IMPORTED_MODULE_2__["AuthGuardService"]],
+ data: { state: 'edit-folder' },
+ },
+ {
+ path: 'sync',
+ component: _settings_sync_component__WEBPACK_IMPORTED_MODULE_28__["SyncComponent"],
+ canActivate: [jslib_angular_services_auth_guard_service__WEBPACK_IMPORTED_MODULE_2__["AuthGuardService"]],
+ data: { state: 'sync' },
+ },
+ {
+ path: 'excluded-domains',
+ component: _settings_excluded_domains_component__WEBPACK_IMPORTED_MODULE_21__["ExcludedDomainsComponent"],
+ canActivate: [jslib_angular_services_auth_guard_service__WEBPACK_IMPORTED_MODULE_2__["AuthGuardService"]],
+ data: { state: 'excluded-domains' },
+ },
+ {
+ path: 'premium',
+ component: _settings_premium_component__WEBPACK_IMPORTED_MODULE_26__["PremiumComponent"],
+ canActivate: [jslib_angular_services_auth_guard_service__WEBPACK_IMPORTED_MODULE_2__["AuthGuardService"]],
+ data: { state: 'premium' },
+ },
+ {
+ path: 'options',
+ component: _settings_options_component__WEBPACK_IMPORTED_MODULE_25__["OptionsComponent"],
+ canActivate: [jslib_angular_services_auth_guard_service__WEBPACK_IMPORTED_MODULE_2__["AuthGuardService"]],
+ data: { state: 'options' },
+ },
+ {
+ path: 'private-mode',
+ component: _private_mode_component__WEBPACK_IMPORTED_MODULE_19__["PrivateModeComponent"],
+ data: { state: 'private-mode' },
+ },
+ {
+ path: 'clone-cipher',
+ component: _vault_add_edit_component__WEBPACK_IMPORTED_MODULE_29__["AddEditComponent"],
+ canActivate: [jslib_angular_services_auth_guard_service__WEBPACK_IMPORTED_MODULE_2__["AuthGuardService"]],
+ data: { state: 'clone-cipher' },
+ },
+ {
+ path: 'send-type',
+ component: _send_send_type_component__WEBPACK_IMPORTED_MODULE_40__["SendTypeComponent"],
+ canActivate: [jslib_angular_services_auth_guard_service__WEBPACK_IMPORTED_MODULE_2__["AuthGuardService"]],
+ data: { state: 'send-type' },
+ },
+ {
+ path: 'add-send',
+ component: _send_send_add_edit_component__WEBPACK_IMPORTED_MODULE_38__["SendAddEditComponent"],
+ canActivate: [jslib_angular_services_auth_guard_service__WEBPACK_IMPORTED_MODULE_2__["AuthGuardService"]],
+ data: { state: 'add-send' },
+ },
+ {
+ path: 'edit-send',
+ component: _send_send_add_edit_component__WEBPACK_IMPORTED_MODULE_38__["SendAddEditComponent"],
+ canActivate: [jslib_angular_services_auth_guard_service__WEBPACK_IMPORTED_MODULE_2__["AuthGuardService"]],
+ data: { state: 'edit-send' },
+ },
+ {
+ path: 'update-temp-password',
+ component: _accounts_update_temp_password_component__WEBPACK_IMPORTED_MODULE_16__["UpdateTempPasswordComponent"],
+ canActivate: [jslib_angular_services_auth_guard_service__WEBPACK_IMPORTED_MODULE_2__["AuthGuardService"]],
+ data: { state: 'update-temp-password' },
+ },
+ {
+ path: 'tabs',
+ component: _tabs_component__WEBPACK_IMPORTED_MODULE_20__["TabsComponent"],
+ data: { state: 'tabs' },
+ children: [
+ {
+ path: '',
+ redirectTo: '/tabs/vault',
+ pathMatch: 'full',
+ },
+ {
+ path: 'current',
+ component: _vault_current_tab_component__WEBPACK_IMPORTED_MODULE_33__["CurrentTabComponent"],
+ canActivate: [jslib_angular_services_auth_guard_service__WEBPACK_IMPORTED_MODULE_2__["AuthGuardService"]],
+ data: { state: 'tabs_current' },
+ runGuardsAndResolvers: 'always',
+ },
+ {
+ path: 'vault',
+ component: _vault_groupings_component__WEBPACK_IMPORTED_MODULE_34__["GroupingsComponent"],
+ canActivate: [jslib_angular_services_auth_guard_service__WEBPACK_IMPORTED_MODULE_2__["AuthGuardService"]],
+ data: { state: 'tabs_vault' },
+ },
+ {
+ path: 'generator',
+ component: _generator_password_generator_component__WEBPACK_IMPORTED_MODULE_18__["PasswordGeneratorComponent"],
+ canActivate: [jslib_angular_services_auth_guard_service__WEBPACK_IMPORTED_MODULE_2__["AuthGuardService"]],
+ data: { state: 'tabs_generator' },
+ },
+ {
+ path: 'settings',
+ component: _settings_settings_component__WEBPACK_IMPORTED_MODULE_27__["SettingsComponent"],
+ canActivate: [jslib_angular_services_auth_guard_service__WEBPACK_IMPORTED_MODULE_2__["AuthGuardService"]],
+ data: { state: 'tabs_settings' },
+ },
+ {
+ path: 'send',
+ component: _send_send_groupings_component__WEBPACK_IMPORTED_MODULE_39__["SendGroupingsComponent"],
+ canActivate: [jslib_angular_services_auth_guard_service__WEBPACK_IMPORTED_MODULE_2__["AuthGuardService"]],
+ data: { state: 'tabs_send' },
+ },
+ ],
+ },
+];
+class NoRouteReuseStrategy {
+ shouldDetach(route) {
+ return false;
+ }
+ store(route, handle) { }
+ shouldAttach(route) {
+ return false;
+ }
+ retrieve(route) {
+ return null;
+ }
+ shouldReuseRoute(future, curr) {
+ return false;
+ }
+}
+NoRouteReuseStrategy.ɵfac = function NoRouteReuseStrategy_Factory(t) { return new (t || NoRouteReuseStrategy)(); };
+NoRouteReuseStrategy.ɵprov = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineInjectable"]({ token: NoRouteReuseStrategy, factory: NoRouteReuseStrategy.ɵfac });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](NoRouteReuseStrategy, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Injectable"]
+ }], null, null); })();
+class AppRoutingModule {
+}
+AppRoutingModule.ɵfac = function AppRoutingModule_Factory(t) { return new (t || AppRoutingModule)(); };
+AppRoutingModule.ɵmod = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineNgModule"]({ type: AppRoutingModule });
+AppRoutingModule.ɵinj = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineInjector"]({ providers: [
+ { provide: _angular_router__WEBPACK_IMPORTED_MODULE_1__["RouteReuseStrategy"], useClass: NoRouteReuseStrategy },
+ ], imports: [[_angular_router__WEBPACK_IMPORTED_MODULE_1__["RouterModule"].forRoot(routes, {
+ useHash: true,
+ onSameUrlNavigation: 'reload',
+ })], _angular_router__WEBPACK_IMPORTED_MODULE_1__["RouterModule"]] });
+(function () { (typeof ngJitMode === "undefined" || ngJitMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵsetNgModuleScope"](AppRoutingModule, { imports: [_angular_router__WEBPACK_IMPORTED_MODULE_1__["RouterModule"]], exports: [_angular_router__WEBPACK_IMPORTED_MODULE_1__["RouterModule"]] }); })();
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](AppRoutingModule, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["NgModule"],
+ args: [{
+ imports: [_angular_router__WEBPACK_IMPORTED_MODULE_1__["RouterModule"].forRoot(routes, {
+ useHash: true,
+ onSameUrlNavigation: 'reload',
+ })],
+ exports: [_angular_router__WEBPACK_IMPORTED_MODULE_1__["RouterModule"]],
+ providers: [
+ { provide: _angular_router__WEBPACK_IMPORTED_MODULE_1__["RouteReuseStrategy"], useClass: NoRouteReuseStrategy },
+ ],
+ }]
+ }], null, null); })();
+
+
+/***/ }),
+
+/***/ "./src/popup/app.component.ts":
+/*!************************************!*\
+ !*** ./src/popup/app.component.ts ***!
+ \************************************/
+/*! exports provided: AppComponent */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AppComponent", function() { return AppComponent; });
+/* harmony import */ var _browser_browserApi__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../browser/browserApi */ "./src/browser/browserApi.ts");
+/* harmony import */ var angular2_toaster__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! angular2-toaster */ "./node_modules/angular2-toaster/__ivy_ngcc__/fesm2015/angular2-toaster.js");
+/* harmony import */ var sweetalert2_src_sweetalert2_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! sweetalert2/src/sweetalert2.js */ "./node_modules/sweetalert2/src/sweetalert2.js");
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var _angular_platform_browser__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @angular/platform-browser */ "./node_modules/@angular/platform-browser/__ivy_ngcc__/fesm2015/platform-browser.js");
+/* harmony import */ var _angular_router__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @angular/router */ "./node_modules/@angular/router/__ivy_ngcc__/fesm2015/router.js");
+/* harmony import */ var jslib_angular_services_broadcaster_service__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! jslib-angular/services/broadcaster.service */ "./jslib/angular/src/services/broadcaster.service.ts");
+/* harmony import */ var jslib_common_abstractions_auth_service__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! jslib-common/abstractions/auth.service */ "./jslib/common/src/abstractions/auth.service.ts");
+/* harmony import */ var jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! jslib-common/abstractions/i18n.service */ "./jslib/common/src/abstractions/i18n.service.ts");
+/* harmony import */ var jslib_common_abstractions_messaging_service__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! jslib-common/abstractions/messaging.service */ "./jslib/common/src/abstractions/messaging.service.ts");
+/* harmony import */ var jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! jslib-common/abstractions/platformUtils.service */ "./jslib/common/src/abstractions/platformUtils.service.ts");
+/* harmony import */ var jslib_common_abstractions_state_service__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! jslib-common/abstractions/state.service */ "./jslib/common/src/abstractions/state.service.ts");
+/* harmony import */ var jslib_common_abstractions_storage_service__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! jslib-common/abstractions/storage.service */ "./jslib/common/src/abstractions/storage.service.ts");
+/* harmony import */ var jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! jslib-common/services/constants.service */ "./jslib/common/src/services/constants.service.ts");
+/* harmony import */ var _app_routing_animations__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./app-routing.animations */ "./src/popup/app-routing.animations.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+class AppComponent {
+ constructor(toasterService, storageService, broadcasterService, authService, i18nService, router, stateService, messagingService, changeDetectorRef, ngZone, sanitizer, platformUtilsService) {
+ this.toasterService = toasterService;
+ this.storageService = storageService;
+ this.broadcasterService = broadcasterService;
+ this.authService = authService;
+ this.i18nService = i18nService;
+ this.router = router;
+ this.stateService = stateService;
+ this.messagingService = messagingService;
+ this.changeDetectorRef = changeDetectorRef;
+ this.ngZone = ngZone;
+ this.sanitizer = sanitizer;
+ this.platformUtilsService = platformUtilsService;
+ this.toasterConfig = new angular2_toaster__WEBPACK_IMPORTED_MODULE_1__["ToasterConfig"]({
+ showCloseButton: false,
+ mouseoverTimerStop: true,
+ animation: 'slideUp',
+ limit: 2,
+ positionClass: 'toast-bottom-full-width',
+ newestOnTop: false,
+ });
+ this.lastActivity = null;
+ }
+ ngOnInit() {
+ if (_browser_browserApi__WEBPACK_IMPORTED_MODULE_0__["BrowserApi"].getBackgroundPage() == null) {
+ return;
+ }
+ this.ngZone.runOutsideAngular(() => {
+ window.onmousemove = () => this.recordActivity();
+ window.onmousedown = () => this.recordActivity();
+ window.ontouchstart = () => this.recordActivity();
+ window.onclick = () => this.recordActivity();
+ window.onscroll = () => this.recordActivity();
+ window.onkeypress = () => this.recordActivity();
+ });
+ window.bitwardenPopupMainMessageListener = (msg, sender, sendResponse) => __awaiter(this, void 0, void 0, function* () {
+ if (msg.command === 'doneLoggingOut') {
+ this.ngZone.run(() => __awaiter(this, void 0, void 0, function* () {
+ this.authService.logOut(() => {
+ if (msg.expired) {
+ this.showToast({
+ type: 'warning',
+ title: this.i18nService.t('loggedOut'),
+ text: this.i18nService.t('loginExpired'),
+ });
+ }
+ this.router.navigate(['home']);
+ this.stateService.purge();
+ });
+ this.changeDetectorRef.detectChanges();
+ }));
+ }
+ else if (msg.command === 'authBlocked') {
+ this.ngZone.run(() => {
+ this.router.navigate(['home']);
+ });
+ }
+ else if (msg.command === 'locked') {
+ this.stateService.purge();
+ this.ngZone.run(() => {
+ this.router.navigate(['lock']);
+ });
+ }
+ else if (msg.command === 'showDialog') {
+ yield this.showDialog(msg);
+ }
+ else if (msg.command === 'showToast') {
+ this.ngZone.run(() => {
+ this.showToast(msg);
+ });
+ }
+ else if (msg.command === 'reloadProcess') {
+ const windowReload = this.platformUtilsService.isSafari() ||
+ this.platformUtilsService.isFirefox() || this.platformUtilsService.isOpera();
+ if (windowReload) {
+ // Wait to make sure background has reloaded first.
+ window.setTimeout(() => _browser_browserApi__WEBPACK_IMPORTED_MODULE_0__["BrowserApi"].reloadExtension(window), 2000);
+ }
+ }
+ else if (msg.command === 'reloadPopup') {
+ this.ngZone.run(() => {
+ this.router.navigate(['/']);
+ });
+ }
+ else {
+ msg.webExtSender = sender;
+ this.broadcasterService.send(msg);
+ }
+ });
+ _browser_browserApi__WEBPACK_IMPORTED_MODULE_0__["BrowserApi"].messageListener('app.component', window.bitwardenPopupMainMessageListener);
+ this.router.events.subscribe(event => {
+ if (event instanceof _angular_router__WEBPACK_IMPORTED_MODULE_5__["NavigationEnd"]) {
+ const url = event.urlAfterRedirects || event.url || '';
+ if (url.startsWith('/tabs/') && window.previousPopupUrl != null &&
+ window.previousPopupUrl.startsWith('/tabs/')) {
+ this.stateService.remove('GroupingsComponent');
+ this.stateService.remove('GroupingsComponentScope');
+ this.stateService.remove('CiphersComponent');
+ this.stateService.remove('SendGroupingsComponent');
+ this.stateService.remove('SendGroupingsComponentScope');
+ this.stateService.remove('SendTypeComponent');
+ }
+ if (url.startsWith('/tabs/')) {
+ this.stateService.remove('addEditCipherInfo');
+ }
+ window.previousPopupUrl = url;
+ // Clear route direction after animation (400ms)
+ if (window.routeDirection != null) {
+ window.setTimeout(() => {
+ window.routeDirection = null;
+ }, 400);
+ }
+ }
+ });
+ }
+ getState(outlet) {
+ if (outlet.activatedRouteData.state === 'ciphers') {
+ const routeDirection = window.routeDirection != null ? window.routeDirection : '';
+ return 'ciphers_direction=' + routeDirection + '_' +
+ outlet.activatedRoute.queryParams.value.folderId + '_' +
+ outlet.activatedRoute.queryParams.value.collectionId;
+ }
+ else {
+ return outlet.activatedRouteData.state;
+ }
+ }
+ recordActivity() {
+ return __awaiter(this, void 0, void 0, function* () {
+ const now = (new Date()).getTime();
+ if (this.lastActivity != null && now - this.lastActivity < 250) {
+ return;
+ }
+ this.lastActivity = now;
+ this.storageService.save(jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_13__["ConstantsService"].lastActiveKey, now);
+ });
+ }
+ showToast(msg) {
+ const toast = {
+ type: msg.type,
+ title: msg.title,
+ };
+ if (typeof (msg.text) === 'string') {
+ toast.body = msg.text;
+ }
+ else if (msg.text.length === 1) {
+ toast.body = msg.text[0];
+ }
+ else {
+ let message = '';
+ msg.text.forEach((t) => message += ('' + this.sanitizer.sanitize(_angular_core__WEBPACK_IMPORTED_MODULE_3__["SecurityContext"].HTML, t) + '
'));
+ toast.body = message;
+ toast.bodyOutputType = angular2_toaster__WEBPACK_IMPORTED_MODULE_1__["BodyOutputType"].TrustedHtml;
+ }
+ if (msg.options != null) {
+ if (msg.options.trustedHtml === true) {
+ toast.bodyOutputType = angular2_toaster__WEBPACK_IMPORTED_MODULE_1__["BodyOutputType"].TrustedHtml;
+ }
+ if (msg.options.timeout != null && msg.options.timeout > 0) {
+ toast.timeout = msg.options.timeout;
+ }
+ }
+ this.toasterService.popAsync(toast);
+ }
+ showDialog(msg) {
+ return __awaiter(this, void 0, void 0, function* () {
+ let iconClasses = null;
+ const type = msg.type;
+ if (type != null) {
+ // If you add custom types to this part, the type to SweetAlertIcon cast below needs to be changed.
+ switch (type) {
+ case 'success':
+ iconClasses = 'fa-check text-success';
+ break;
+ case 'warning':
+ iconClasses = 'fa-warning text-warning';
+ break;
+ case 'error':
+ iconClasses = 'fa-bolt text-danger';
+ break;
+ case 'info':
+ iconClasses = 'fa-info-circle text-info';
+ break;
+ default:
+ break;
+ }
+ }
+ const cancelText = msg.cancelText;
+ const confirmText = msg.confirmText;
+ const confirmed = yield sweetalert2_src_sweetalert2_js__WEBPACK_IMPORTED_MODULE_2__["default"].fire({
+ heightAuto: false,
+ buttonsStyling: false,
+ icon: type,
+ iconHtml: iconClasses != null ? `` : undefined,
+ text: msg.text,
+ html: msg.html,
+ titleText: msg.title,
+ showCancelButton: (cancelText != null),
+ cancelButtonText: cancelText,
+ showConfirmButton: true,
+ confirmButtonText: confirmText == null ? this.i18nService.t('ok') : confirmText,
+ timer: 300000,
+ });
+ this.messagingService.send('showDialogResolve', {
+ dialogId: msg.dialogId,
+ confirmed: confirmed.value,
+ });
+ });
+ }
+}
+AppComponent.ɵfac = function AppComponent_Factory(t) { return new (t || AppComponent)(_angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵɵdirectiveInject"](angular2_toaster__WEBPACK_IMPORTED_MODULE_1__["ToasterService"]), _angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵɵdirectiveInject"](jslib_common_abstractions_storage_service__WEBPACK_IMPORTED_MODULE_12__["StorageService"]), _angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵɵdirectiveInject"](jslib_angular_services_broadcaster_service__WEBPACK_IMPORTED_MODULE_6__["BroadcasterService"]), _angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵɵdirectiveInject"](jslib_common_abstractions_auth_service__WEBPACK_IMPORTED_MODULE_7__["AuthService"]), _angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵɵdirectiveInject"](jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_8__["I18nService"]), _angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵɵdirectiveInject"](_angular_router__WEBPACK_IMPORTED_MODULE_5__["Router"]), _angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵɵdirectiveInject"](jslib_common_abstractions_state_service__WEBPACK_IMPORTED_MODULE_11__["StateService"]), _angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵɵdirectiveInject"](jslib_common_abstractions_messaging_service__WEBPACK_IMPORTED_MODULE_9__["MessagingService"]), _angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵɵdirectiveInject"](_angular_core__WEBPACK_IMPORTED_MODULE_3__["ChangeDetectorRef"]), _angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵɵdirectiveInject"](_angular_core__WEBPACK_IMPORTED_MODULE_3__["NgZone"]), _angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵɵdirectiveInject"](_angular_platform_browser__WEBPACK_IMPORTED_MODULE_4__["DomSanitizer"]), _angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵɵdirectiveInject"](jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_10__["PlatformUtilsService"])); };
+AppComponent.ɵcmp = _angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵɵdefineComponent"]({ type: AppComponent, selectors: [["app-root"]], decls: 8, vars: 2, consts: [["aria-live", "polite", 3, "toasterconfig"], ["o", "outlet"]], template: function AppComponent_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵɵtext"](0, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵɵelement"](1, "toaster-container", 0);
+ _angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵɵtext"](2, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵɵelementStart"](3, "main");
+ _angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵɵtext"](4, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵɵelement"](5, "router-outlet", null, 1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵɵelementEnd"]();
+ } if (rf & 2) {
+ const _r0 = _angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵɵreference"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵɵproperty"]("toasterconfig", ctx.toasterConfig);
+ _angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵɵproperty"]("@routerTransition", ctx.getState(_r0));
+ } }, directives: [angular2_toaster__WEBPACK_IMPORTED_MODULE_1__["ToasterContainerComponent"], _angular_router__WEBPACK_IMPORTED_MODULE_5__["RouterOutlet"]], encapsulation: 2, data: { animation: [_app_routing_animations__WEBPACK_IMPORTED_MODULE_14__["routerTransition"]] } });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_3__["ɵsetClassMetadata"](AppComponent, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_3__["Component"],
+ args: [{
+ selector: 'app-root',
+ styles: [],
+ animations: [_app_routing_animations__WEBPACK_IMPORTED_MODULE_14__["routerTransition"]],
+ template: `
+
+
+
+ `,
+ }]
+ }], function () { return [{ type: angular2_toaster__WEBPACK_IMPORTED_MODULE_1__["ToasterService"] }, { type: jslib_common_abstractions_storage_service__WEBPACK_IMPORTED_MODULE_12__["StorageService"] }, { type: jslib_angular_services_broadcaster_service__WEBPACK_IMPORTED_MODULE_6__["BroadcasterService"] }, { type: jslib_common_abstractions_auth_service__WEBPACK_IMPORTED_MODULE_7__["AuthService"] }, { type: jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_8__["I18nService"] }, { type: _angular_router__WEBPACK_IMPORTED_MODULE_5__["Router"] }, { type: jslib_common_abstractions_state_service__WEBPACK_IMPORTED_MODULE_11__["StateService"] }, { type: jslib_common_abstractions_messaging_service__WEBPACK_IMPORTED_MODULE_9__["MessagingService"] }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_3__["ChangeDetectorRef"] }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_3__["NgZone"] }, { type: _angular_platform_browser__WEBPACK_IMPORTED_MODULE_4__["DomSanitizer"] }, { type: jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_10__["PlatformUtilsService"] }]; }, null); })();
+
+
+/***/ }),
+
+/***/ "./src/popup/app.module.ts":
+/*!*********************************!*\
+ !*** ./src/popup/app.module.ts ***!
+ \*********************************/
+/*! exports provided: AppModule */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AppModule", function() { return AppModule; });
+/* harmony import */ var _angular_cdk_a11y__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/cdk/a11y */ "./node_modules/@angular/cdk/__ivy_ngcc__/fesm2015/a11y.js");
+/* harmony import */ var _angular_cdk_drag_drop__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @angular/cdk/drag-drop */ "./node_modules/@angular/cdk/__ivy_ngcc__/fesm2015/drag-drop.js");
+/* harmony import */ var _angular_cdk_scrolling__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @angular/cdk/scrolling */ "./node_modules/@angular/cdk/__ivy_ngcc__/fesm2015/scrolling.js");
+/* harmony import */ var angular2_toaster__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! angular2-toaster */ "./node_modules/angular2-toaster/__ivy_ngcc__/fesm2015/angular2-toaster.js");
+/* harmony import */ var _app_routing_module__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./app-routing.module */ "./src/popup/app-routing.module.ts");
+/* harmony import */ var _services_services_module__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./services/services.module */ "./src/popup/services/services.module.ts");
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var _angular_forms__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @angular/forms */ "./node_modules/@angular/forms/__ivy_ngcc__/fesm2015/forms.js");
+/* harmony import */ var _angular_platform_browser__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @angular/platform-browser */ "./node_modules/@angular/platform-browser/__ivy_ngcc__/fesm2015/platform-browser.js");
+/* harmony import */ var _angular_platform_browser_animations__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @angular/platform-browser/animations */ "./node_modules/@angular/platform-browser/__ivy_ngcc__/fesm2015/animations.js");
+/* harmony import */ var _accounts_environment_component__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./accounts/environment.component */ "./src/popup/accounts/environment.component.ts");
+/* harmony import */ var _accounts_hint_component__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./accounts/hint.component */ "./src/popup/accounts/hint.component.ts");
+/* harmony import */ var _accounts_home_component__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./accounts/home.component */ "./src/popup/accounts/home.component.ts");
+/* harmony import */ var _accounts_lock_component__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./accounts/lock.component */ "./src/popup/accounts/lock.component.ts");
+/* harmony import */ var _accounts_login_component__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./accounts/login.component */ "./src/popup/accounts/login.component.ts");
+/* harmony import */ var _accounts_register_component__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./accounts/register.component */ "./src/popup/accounts/register.component.ts");
+/* harmony import */ var _accounts_set_password_component__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./accounts/set-password.component */ "./src/popup/accounts/set-password.component.ts");
+/* harmony import */ var _accounts_sso_component__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./accounts/sso.component */ "./src/popup/accounts/sso.component.ts");
+/* harmony import */ var _accounts_two_factor_options_component__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./accounts/two-factor-options.component */ "./src/popup/accounts/two-factor-options.component.ts");
+/* harmony import */ var _accounts_two_factor_component__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./accounts/two-factor.component */ "./src/popup/accounts/two-factor.component.ts");
+/* harmony import */ var _accounts_update_temp_password_component__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./accounts/update-temp-password.component */ "./src/popup/accounts/update-temp-password.component.ts");
+/* harmony import */ var _generator_password_generator_history_component__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./generator/password-generator-history.component */ "./src/popup/generator/password-generator-history.component.ts");
+/* harmony import */ var _generator_password_generator_component__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./generator/password-generator.component */ "./src/popup/generator/password-generator.component.ts");
+/* harmony import */ var _app_component__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./app.component */ "./src/popup/app.component.ts");
+/* harmony import */ var _private_mode_component__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./private-mode.component */ "./src/popup/private-mode.component.ts");
+/* harmony import */ var _tabs_component__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ./tabs.component */ "./src/popup/tabs.component.ts");
+/* harmony import */ var _settings_excluded_domains_component__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ./settings/excluded-domains.component */ "./src/popup/settings/excluded-domains.component.ts");
+/* harmony import */ var _settings_export_component__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ./settings/export.component */ "./src/popup/settings/export.component.ts");
+/* harmony import */ var _settings_folder_add_edit_component__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ./settings/folder-add-edit.component */ "./src/popup/settings/folder-add-edit.component.ts");
+/* harmony import */ var _settings_folders_component__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ./settings/folders.component */ "./src/popup/settings/folders.component.ts");
+/* harmony import */ var _settings_options_component__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ./settings/options.component */ "./src/popup/settings/options.component.ts");
+/* harmony import */ var _settings_premium_component__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ./settings/premium.component */ "./src/popup/settings/premium.component.ts");
+/* harmony import */ var _settings_settings_component__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ./settings/settings.component */ "./src/popup/settings/settings.component.ts");
+/* harmony import */ var _settings_sync_component__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! ./settings/sync.component */ "./src/popup/settings/sync.component.ts");
+/* harmony import */ var _settings_vault_timeout_input_component__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! ./settings/vault-timeout-input.component */ "./src/popup/settings/vault-timeout-input.component.ts");
+/* harmony import */ var _vault_add_edit_custom_fields_component__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! ./vault/add-edit-custom-fields.component */ "./src/popup/vault/add-edit-custom-fields.component.ts");
+/* harmony import */ var _vault_add_edit_component__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! ./vault/add-edit.component */ "./src/popup/vault/add-edit.component.ts");
+/* harmony import */ var _vault_attachments_component__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! ./vault/attachments.component */ "./src/popup/vault/attachments.component.ts");
+/* harmony import */ var _vault_ciphers_component__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(/*! ./vault/ciphers.component */ "./src/popup/vault/ciphers.component.ts");
+/* harmony import */ var _vault_collections_component__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(/*! ./vault/collections.component */ "./src/popup/vault/collections.component.ts");
+/* harmony import */ var _vault_current_tab_component__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(/*! ./vault/current-tab.component */ "./src/popup/vault/current-tab.component.ts");
+/* harmony import */ var _vault_groupings_component__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(/*! ./vault/groupings.component */ "./src/popup/vault/groupings.component.ts");
+/* harmony import */ var _vault_password_history_component__WEBPACK_IMPORTED_MODULE_42__ = __webpack_require__(/*! ./vault/password-history.component */ "./src/popup/vault/password-history.component.ts");
+/* harmony import */ var _vault_share_component__WEBPACK_IMPORTED_MODULE_43__ = __webpack_require__(/*! ./vault/share.component */ "./src/popup/vault/share.component.ts");
+/* harmony import */ var _vault_view_custom_fields_component__WEBPACK_IMPORTED_MODULE_44__ = __webpack_require__(/*! ./vault/view-custom-fields.component */ "./src/popup/vault/view-custom-fields.component.ts");
+/* harmony import */ var _vault_view_component__WEBPACK_IMPORTED_MODULE_45__ = __webpack_require__(/*! ./vault/view.component */ "./src/popup/vault/view.component.ts");
+/* harmony import */ var _send_efflux_dates_component__WEBPACK_IMPORTED_MODULE_46__ = __webpack_require__(/*! ./send/efflux-dates.component */ "./src/popup/send/efflux-dates.component.ts");
+/* harmony import */ var _send_send_add_edit_component__WEBPACK_IMPORTED_MODULE_47__ = __webpack_require__(/*! ./send/send-add-edit.component */ "./src/popup/send/send-add-edit.component.ts");
+/* harmony import */ var _send_send_groupings_component__WEBPACK_IMPORTED_MODULE_48__ = __webpack_require__(/*! ./send/send-groupings.component */ "./src/popup/send/send-groupings.component.ts");
+/* harmony import */ var _send_send_type_component__WEBPACK_IMPORTED_MODULE_49__ = __webpack_require__(/*! ./send/send-type.component */ "./src/popup/send/send-type.component.ts");
+/* harmony import */ var jslib_angular_directives_a11y_title_directive__WEBPACK_IMPORTED_MODULE_50__ = __webpack_require__(/*! jslib-angular/directives/a11y-title.directive */ "./jslib/angular/src/directives/a11y-title.directive.ts");
+/* harmony import */ var jslib_angular_directives_api_action_directive__WEBPACK_IMPORTED_MODULE_51__ = __webpack_require__(/*! jslib-angular/directives/api-action.directive */ "./jslib/angular/src/directives/api-action.directive.ts");
+/* harmony import */ var jslib_angular_directives_autofocus_directive__WEBPACK_IMPORTED_MODULE_52__ = __webpack_require__(/*! jslib-angular/directives/autofocus.directive */ "./jslib/angular/src/directives/autofocus.directive.ts");
+/* harmony import */ var jslib_angular_directives_blur_click_directive__WEBPACK_IMPORTED_MODULE_53__ = __webpack_require__(/*! jslib-angular/directives/blur-click.directive */ "./jslib/angular/src/directives/blur-click.directive.ts");
+/* harmony import */ var jslib_angular_directives_box_row_directive__WEBPACK_IMPORTED_MODULE_54__ = __webpack_require__(/*! jslib-angular/directives/box-row.directive */ "./jslib/angular/src/directives/box-row.directive.ts");
+/* harmony import */ var jslib_angular_directives_cipherListVirtualScroll_directive__WEBPACK_IMPORTED_MODULE_55__ = __webpack_require__(/*! jslib-angular/directives/cipherListVirtualScroll.directive */ "./jslib/angular/src/directives/cipherListVirtualScroll.directive.ts");
+/* harmony import */ var jslib_angular_directives_fallback_src_directive__WEBPACK_IMPORTED_MODULE_56__ = __webpack_require__(/*! jslib-angular/directives/fallback-src.directive */ "./jslib/angular/src/directives/fallback-src.directive.ts");
+/* harmony import */ var jslib_angular_directives_input_verbatim_directive__WEBPACK_IMPORTED_MODULE_57__ = __webpack_require__(/*! jslib-angular/directives/input-verbatim.directive */ "./jslib/angular/src/directives/input-verbatim.directive.ts");
+/* harmony import */ var jslib_angular_directives_select_copy_directive__WEBPACK_IMPORTED_MODULE_58__ = __webpack_require__(/*! jslib-angular/directives/select-copy.directive */ "./jslib/angular/src/directives/select-copy.directive.ts");
+/* harmony import */ var jslib_angular_directives_stop_click_directive__WEBPACK_IMPORTED_MODULE_59__ = __webpack_require__(/*! jslib-angular/directives/stop-click.directive */ "./jslib/angular/src/directives/stop-click.directive.ts");
+/* harmony import */ var jslib_angular_directives_stop_prop_directive__WEBPACK_IMPORTED_MODULE_60__ = __webpack_require__(/*! jslib-angular/directives/stop-prop.directive */ "./jslib/angular/src/directives/stop-prop.directive.ts");
+/* harmony import */ var jslib_angular_directives_true_false_value_directive__WEBPACK_IMPORTED_MODULE_61__ = __webpack_require__(/*! jslib-angular/directives/true-false-value.directive */ "./jslib/angular/src/directives/true-false-value.directive.ts");
+/* harmony import */ var jslib_angular_pipes_color_password_pipe__WEBPACK_IMPORTED_MODULE_62__ = __webpack_require__(/*! jslib-angular/pipes/color-password.pipe */ "./jslib/angular/src/pipes/color-password.pipe.ts");
+/* harmony import */ var jslib_angular_pipes_i18n_pipe__WEBPACK_IMPORTED_MODULE_63__ = __webpack_require__(/*! jslib-angular/pipes/i18n.pipe */ "./jslib/angular/src/pipes/i18n.pipe.ts");
+/* harmony import */ var jslib_angular_pipes_search_ciphers_pipe__WEBPACK_IMPORTED_MODULE_64__ = __webpack_require__(/*! jslib-angular/pipes/search-ciphers.pipe */ "./jslib/angular/src/pipes/search-ciphers.pipe.ts");
+/* harmony import */ var _components_action_buttons_component__WEBPACK_IMPORTED_MODULE_65__ = __webpack_require__(/*! ./components/action-buttons.component */ "./src/popup/components/action-buttons.component.ts");
+/* harmony import */ var _components_cipher_row_component__WEBPACK_IMPORTED_MODULE_66__ = __webpack_require__(/*! ./components/cipher-row.component */ "./src/popup/components/cipher-row.component.ts");
+/* harmony import */ var _components_password_reprompt_component__WEBPACK_IMPORTED_MODULE_67__ = __webpack_require__(/*! ./components/password-reprompt.component */ "./src/popup/components/password-reprompt.component.ts");
+/* harmony import */ var _components_pop_out_component__WEBPACK_IMPORTED_MODULE_68__ = __webpack_require__(/*! ./components/pop-out.component */ "./src/popup/components/pop-out.component.ts");
+/* harmony import */ var _components_send_list_component__WEBPACK_IMPORTED_MODULE_69__ = __webpack_require__(/*! ./components/send-list.component */ "./src/popup/components/send-list.component.ts");
+/* harmony import */ var _components_set_pin_component__WEBPACK_IMPORTED_MODULE_70__ = __webpack_require__(/*! ./components/set-pin.component */ "./src/popup/components/set-pin.component.ts");
+/* harmony import */ var jslib_angular_components_callout_component__WEBPACK_IMPORTED_MODULE_71__ = __webpack_require__(/*! jslib-angular/components/callout.component */ "./jslib/angular/src/components/callout.component.ts");
+/* harmony import */ var jslib_angular_components_icon_component__WEBPACK_IMPORTED_MODULE_72__ = __webpack_require__(/*! jslib-angular/components/icon.component */ "./jslib/angular/src/components/icon.component.ts");
+/* harmony import */ var _angular_common__WEBPACK_IMPORTED_MODULE_73__ = __webpack_require__(/*! @angular/common */ "./node_modules/@angular/common/__ivy_ngcc__/fesm2015/common.js");
+/* harmony import */ var _angular_common_locales_az__WEBPACK_IMPORTED_MODULE_74__ = __webpack_require__(/*! @angular/common/locales/az */ "./node_modules/@angular/common/locales/az.js");
+/* harmony import */ var _angular_common_locales_az__WEBPACK_IMPORTED_MODULE_74___default = /*#__PURE__*/__webpack_require__.n(_angular_common_locales_az__WEBPACK_IMPORTED_MODULE_74__);
+/* harmony import */ var _angular_common_locales_be__WEBPACK_IMPORTED_MODULE_75__ = __webpack_require__(/*! @angular/common/locales/be */ "./node_modules/@angular/common/locales/be.js");
+/* harmony import */ var _angular_common_locales_be__WEBPACK_IMPORTED_MODULE_75___default = /*#__PURE__*/__webpack_require__.n(_angular_common_locales_be__WEBPACK_IMPORTED_MODULE_75__);
+/* harmony import */ var _angular_common_locales_bg__WEBPACK_IMPORTED_MODULE_76__ = __webpack_require__(/*! @angular/common/locales/bg */ "./node_modules/@angular/common/locales/bg.js");
+/* harmony import */ var _angular_common_locales_bg__WEBPACK_IMPORTED_MODULE_76___default = /*#__PURE__*/__webpack_require__.n(_angular_common_locales_bg__WEBPACK_IMPORTED_MODULE_76__);
+/* harmony import */ var _angular_common_locales_bn__WEBPACK_IMPORTED_MODULE_77__ = __webpack_require__(/*! @angular/common/locales/bn */ "./node_modules/@angular/common/locales/bn.js");
+/* harmony import */ var _angular_common_locales_bn__WEBPACK_IMPORTED_MODULE_77___default = /*#__PURE__*/__webpack_require__.n(_angular_common_locales_bn__WEBPACK_IMPORTED_MODULE_77__);
+/* harmony import */ var _angular_common_locales_ca__WEBPACK_IMPORTED_MODULE_78__ = __webpack_require__(/*! @angular/common/locales/ca */ "./node_modules/@angular/common/locales/ca.js");
+/* harmony import */ var _angular_common_locales_ca__WEBPACK_IMPORTED_MODULE_78___default = /*#__PURE__*/__webpack_require__.n(_angular_common_locales_ca__WEBPACK_IMPORTED_MODULE_78__);
+/* harmony import */ var _angular_common_locales_cs__WEBPACK_IMPORTED_MODULE_79__ = __webpack_require__(/*! @angular/common/locales/cs */ "./node_modules/@angular/common/locales/cs.js");
+/* harmony import */ var _angular_common_locales_cs__WEBPACK_IMPORTED_MODULE_79___default = /*#__PURE__*/__webpack_require__.n(_angular_common_locales_cs__WEBPACK_IMPORTED_MODULE_79__);
+/* harmony import */ var _angular_common_locales_da__WEBPACK_IMPORTED_MODULE_80__ = __webpack_require__(/*! @angular/common/locales/da */ "./node_modules/@angular/common/locales/da.js");
+/* harmony import */ var _angular_common_locales_da__WEBPACK_IMPORTED_MODULE_80___default = /*#__PURE__*/__webpack_require__.n(_angular_common_locales_da__WEBPACK_IMPORTED_MODULE_80__);
+/* harmony import */ var _angular_common_locales_de__WEBPACK_IMPORTED_MODULE_81__ = __webpack_require__(/*! @angular/common/locales/de */ "./node_modules/@angular/common/locales/de.js");
+/* harmony import */ var _angular_common_locales_de__WEBPACK_IMPORTED_MODULE_81___default = /*#__PURE__*/__webpack_require__.n(_angular_common_locales_de__WEBPACK_IMPORTED_MODULE_81__);
+/* harmony import */ var _angular_common_locales_el__WEBPACK_IMPORTED_MODULE_82__ = __webpack_require__(/*! @angular/common/locales/el */ "./node_modules/@angular/common/locales/el.js");
+/* harmony import */ var _angular_common_locales_el__WEBPACK_IMPORTED_MODULE_82___default = /*#__PURE__*/__webpack_require__.n(_angular_common_locales_el__WEBPACK_IMPORTED_MODULE_82__);
+/* harmony import */ var _angular_common_locales_en_GB__WEBPACK_IMPORTED_MODULE_83__ = __webpack_require__(/*! @angular/common/locales/en-GB */ "./node_modules/@angular/common/locales/en-GB.js");
+/* harmony import */ var _angular_common_locales_en_GB__WEBPACK_IMPORTED_MODULE_83___default = /*#__PURE__*/__webpack_require__.n(_angular_common_locales_en_GB__WEBPACK_IMPORTED_MODULE_83__);
+/* harmony import */ var _angular_common_locales_en_IN__WEBPACK_IMPORTED_MODULE_84__ = __webpack_require__(/*! @angular/common/locales/en-IN */ "./node_modules/@angular/common/locales/en-IN.js");
+/* harmony import */ var _angular_common_locales_en_IN__WEBPACK_IMPORTED_MODULE_84___default = /*#__PURE__*/__webpack_require__.n(_angular_common_locales_en_IN__WEBPACK_IMPORTED_MODULE_84__);
+/* harmony import */ var _angular_common_locales_es__WEBPACK_IMPORTED_MODULE_85__ = __webpack_require__(/*! @angular/common/locales/es */ "./node_modules/@angular/common/locales/es.js");
+/* harmony import */ var _angular_common_locales_es__WEBPACK_IMPORTED_MODULE_85___default = /*#__PURE__*/__webpack_require__.n(_angular_common_locales_es__WEBPACK_IMPORTED_MODULE_85__);
+/* harmony import */ var _angular_common_locales_et__WEBPACK_IMPORTED_MODULE_86__ = __webpack_require__(/*! @angular/common/locales/et */ "./node_modules/@angular/common/locales/et.js");
+/* harmony import */ var _angular_common_locales_et__WEBPACK_IMPORTED_MODULE_86___default = /*#__PURE__*/__webpack_require__.n(_angular_common_locales_et__WEBPACK_IMPORTED_MODULE_86__);
+/* harmony import */ var _angular_common_locales_fa__WEBPACK_IMPORTED_MODULE_87__ = __webpack_require__(/*! @angular/common/locales/fa */ "./node_modules/@angular/common/locales/fa.js");
+/* harmony import */ var _angular_common_locales_fa__WEBPACK_IMPORTED_MODULE_87___default = /*#__PURE__*/__webpack_require__.n(_angular_common_locales_fa__WEBPACK_IMPORTED_MODULE_87__);
+/* harmony import */ var _angular_common_locales_fi__WEBPACK_IMPORTED_MODULE_88__ = __webpack_require__(/*! @angular/common/locales/fi */ "./node_modules/@angular/common/locales/fi.js");
+/* harmony import */ var _angular_common_locales_fi__WEBPACK_IMPORTED_MODULE_88___default = /*#__PURE__*/__webpack_require__.n(_angular_common_locales_fi__WEBPACK_IMPORTED_MODULE_88__);
+/* harmony import */ var _angular_common_locales_fr__WEBPACK_IMPORTED_MODULE_89__ = __webpack_require__(/*! @angular/common/locales/fr */ "./node_modules/@angular/common/locales/fr.js");
+/* harmony import */ var _angular_common_locales_fr__WEBPACK_IMPORTED_MODULE_89___default = /*#__PURE__*/__webpack_require__.n(_angular_common_locales_fr__WEBPACK_IMPORTED_MODULE_89__);
+/* harmony import */ var _angular_common_locales_he__WEBPACK_IMPORTED_MODULE_90__ = __webpack_require__(/*! @angular/common/locales/he */ "./node_modules/@angular/common/locales/he.js");
+/* harmony import */ var _angular_common_locales_he__WEBPACK_IMPORTED_MODULE_90___default = /*#__PURE__*/__webpack_require__.n(_angular_common_locales_he__WEBPACK_IMPORTED_MODULE_90__);
+/* harmony import */ var _angular_common_locales_hr__WEBPACK_IMPORTED_MODULE_91__ = __webpack_require__(/*! @angular/common/locales/hr */ "./node_modules/@angular/common/locales/hr.js");
+/* harmony import */ var _angular_common_locales_hr__WEBPACK_IMPORTED_MODULE_91___default = /*#__PURE__*/__webpack_require__.n(_angular_common_locales_hr__WEBPACK_IMPORTED_MODULE_91__);
+/* harmony import */ var _angular_common_locales_hu__WEBPACK_IMPORTED_MODULE_92__ = __webpack_require__(/*! @angular/common/locales/hu */ "./node_modules/@angular/common/locales/hu.js");
+/* harmony import */ var _angular_common_locales_hu__WEBPACK_IMPORTED_MODULE_92___default = /*#__PURE__*/__webpack_require__.n(_angular_common_locales_hu__WEBPACK_IMPORTED_MODULE_92__);
+/* harmony import */ var _angular_common_locales_id__WEBPACK_IMPORTED_MODULE_93__ = __webpack_require__(/*! @angular/common/locales/id */ "./node_modules/@angular/common/locales/id.js");
+/* harmony import */ var _angular_common_locales_id__WEBPACK_IMPORTED_MODULE_93___default = /*#__PURE__*/__webpack_require__.n(_angular_common_locales_id__WEBPACK_IMPORTED_MODULE_93__);
+/* harmony import */ var _angular_common_locales_it__WEBPACK_IMPORTED_MODULE_94__ = __webpack_require__(/*! @angular/common/locales/it */ "./node_modules/@angular/common/locales/it.js");
+/* harmony import */ var _angular_common_locales_it__WEBPACK_IMPORTED_MODULE_94___default = /*#__PURE__*/__webpack_require__.n(_angular_common_locales_it__WEBPACK_IMPORTED_MODULE_94__);
+/* harmony import */ var _angular_common_locales_ja__WEBPACK_IMPORTED_MODULE_95__ = __webpack_require__(/*! @angular/common/locales/ja */ "./node_modules/@angular/common/locales/ja.js");
+/* harmony import */ var _angular_common_locales_ja__WEBPACK_IMPORTED_MODULE_95___default = /*#__PURE__*/__webpack_require__.n(_angular_common_locales_ja__WEBPACK_IMPORTED_MODULE_95__);
+/* harmony import */ var _angular_common_locales_kn__WEBPACK_IMPORTED_MODULE_96__ = __webpack_require__(/*! @angular/common/locales/kn */ "./node_modules/@angular/common/locales/kn.js");
+/* harmony import */ var _angular_common_locales_kn__WEBPACK_IMPORTED_MODULE_96___default = /*#__PURE__*/__webpack_require__.n(_angular_common_locales_kn__WEBPACK_IMPORTED_MODULE_96__);
+/* harmony import */ var _angular_common_locales_ko__WEBPACK_IMPORTED_MODULE_97__ = __webpack_require__(/*! @angular/common/locales/ko */ "./node_modules/@angular/common/locales/ko.js");
+/* harmony import */ var _angular_common_locales_ko__WEBPACK_IMPORTED_MODULE_97___default = /*#__PURE__*/__webpack_require__.n(_angular_common_locales_ko__WEBPACK_IMPORTED_MODULE_97__);
+/* harmony import */ var _angular_common_locales_lv__WEBPACK_IMPORTED_MODULE_98__ = __webpack_require__(/*! @angular/common/locales/lv */ "./node_modules/@angular/common/locales/lv.js");
+/* harmony import */ var _angular_common_locales_lv__WEBPACK_IMPORTED_MODULE_98___default = /*#__PURE__*/__webpack_require__.n(_angular_common_locales_lv__WEBPACK_IMPORTED_MODULE_98__);
+/* harmony import */ var _angular_common_locales_ml__WEBPACK_IMPORTED_MODULE_99__ = __webpack_require__(/*! @angular/common/locales/ml */ "./node_modules/@angular/common/locales/ml.js");
+/* harmony import */ var _angular_common_locales_ml__WEBPACK_IMPORTED_MODULE_99___default = /*#__PURE__*/__webpack_require__.n(_angular_common_locales_ml__WEBPACK_IMPORTED_MODULE_99__);
+/* harmony import */ var _angular_common_locales_nb__WEBPACK_IMPORTED_MODULE_100__ = __webpack_require__(/*! @angular/common/locales/nb */ "./node_modules/@angular/common/locales/nb.js");
+/* harmony import */ var _angular_common_locales_nb__WEBPACK_IMPORTED_MODULE_100___default = /*#__PURE__*/__webpack_require__.n(_angular_common_locales_nb__WEBPACK_IMPORTED_MODULE_100__);
+/* harmony import */ var _angular_common_locales_nl__WEBPACK_IMPORTED_MODULE_101__ = __webpack_require__(/*! @angular/common/locales/nl */ "./node_modules/@angular/common/locales/nl.js");
+/* harmony import */ var _angular_common_locales_nl__WEBPACK_IMPORTED_MODULE_101___default = /*#__PURE__*/__webpack_require__.n(_angular_common_locales_nl__WEBPACK_IMPORTED_MODULE_101__);
+/* harmony import */ var _angular_common_locales_pl__WEBPACK_IMPORTED_MODULE_102__ = __webpack_require__(/*! @angular/common/locales/pl */ "./node_modules/@angular/common/locales/pl.js");
+/* harmony import */ var _angular_common_locales_pl__WEBPACK_IMPORTED_MODULE_102___default = /*#__PURE__*/__webpack_require__.n(_angular_common_locales_pl__WEBPACK_IMPORTED_MODULE_102__);
+/* harmony import */ var _angular_common_locales_pt__WEBPACK_IMPORTED_MODULE_103__ = __webpack_require__(/*! @angular/common/locales/pt */ "./node_modules/@angular/common/locales/pt.js");
+/* harmony import */ var _angular_common_locales_pt__WEBPACK_IMPORTED_MODULE_103___default = /*#__PURE__*/__webpack_require__.n(_angular_common_locales_pt__WEBPACK_IMPORTED_MODULE_103__);
+/* harmony import */ var _angular_common_locales_pt_PT__WEBPACK_IMPORTED_MODULE_104__ = __webpack_require__(/*! @angular/common/locales/pt-PT */ "./node_modules/@angular/common/locales/pt-PT.js");
+/* harmony import */ var _angular_common_locales_pt_PT__WEBPACK_IMPORTED_MODULE_104___default = /*#__PURE__*/__webpack_require__.n(_angular_common_locales_pt_PT__WEBPACK_IMPORTED_MODULE_104__);
+/* harmony import */ var _angular_common_locales_ro__WEBPACK_IMPORTED_MODULE_105__ = __webpack_require__(/*! @angular/common/locales/ro */ "./node_modules/@angular/common/locales/ro.js");
+/* harmony import */ var _angular_common_locales_ro__WEBPACK_IMPORTED_MODULE_105___default = /*#__PURE__*/__webpack_require__.n(_angular_common_locales_ro__WEBPACK_IMPORTED_MODULE_105__);
+/* harmony import */ var _angular_common_locales_ru__WEBPACK_IMPORTED_MODULE_106__ = __webpack_require__(/*! @angular/common/locales/ru */ "./node_modules/@angular/common/locales/ru.js");
+/* harmony import */ var _angular_common_locales_ru__WEBPACK_IMPORTED_MODULE_106___default = /*#__PURE__*/__webpack_require__.n(_angular_common_locales_ru__WEBPACK_IMPORTED_MODULE_106__);
+/* harmony import */ var _angular_common_locales_sk__WEBPACK_IMPORTED_MODULE_107__ = __webpack_require__(/*! @angular/common/locales/sk */ "./node_modules/@angular/common/locales/sk.js");
+/* harmony import */ var _angular_common_locales_sk__WEBPACK_IMPORTED_MODULE_107___default = /*#__PURE__*/__webpack_require__.n(_angular_common_locales_sk__WEBPACK_IMPORTED_MODULE_107__);
+/* harmony import */ var _angular_common_locales_sr__WEBPACK_IMPORTED_MODULE_108__ = __webpack_require__(/*! @angular/common/locales/sr */ "./node_modules/@angular/common/locales/sr.js");
+/* harmony import */ var _angular_common_locales_sr__WEBPACK_IMPORTED_MODULE_108___default = /*#__PURE__*/__webpack_require__.n(_angular_common_locales_sr__WEBPACK_IMPORTED_MODULE_108__);
+/* harmony import */ var _angular_common_locales_sv__WEBPACK_IMPORTED_MODULE_109__ = __webpack_require__(/*! @angular/common/locales/sv */ "./node_modules/@angular/common/locales/sv.js");
+/* harmony import */ var _angular_common_locales_sv__WEBPACK_IMPORTED_MODULE_109___default = /*#__PURE__*/__webpack_require__.n(_angular_common_locales_sv__WEBPACK_IMPORTED_MODULE_109__);
+/* harmony import */ var _angular_common_locales_th__WEBPACK_IMPORTED_MODULE_110__ = __webpack_require__(/*! @angular/common/locales/th */ "./node_modules/@angular/common/locales/th.js");
+/* harmony import */ var _angular_common_locales_th__WEBPACK_IMPORTED_MODULE_110___default = /*#__PURE__*/__webpack_require__.n(_angular_common_locales_th__WEBPACK_IMPORTED_MODULE_110__);
+/* harmony import */ var _angular_common_locales_tr__WEBPACK_IMPORTED_MODULE_111__ = __webpack_require__(/*! @angular/common/locales/tr */ "./node_modules/@angular/common/locales/tr.js");
+/* harmony import */ var _angular_common_locales_tr__WEBPACK_IMPORTED_MODULE_111___default = /*#__PURE__*/__webpack_require__.n(_angular_common_locales_tr__WEBPACK_IMPORTED_MODULE_111__);
+/* harmony import */ var _angular_common_locales_uk__WEBPACK_IMPORTED_MODULE_112__ = __webpack_require__(/*! @angular/common/locales/uk */ "./node_modules/@angular/common/locales/uk.js");
+/* harmony import */ var _angular_common_locales_uk__WEBPACK_IMPORTED_MODULE_112___default = /*#__PURE__*/__webpack_require__.n(_angular_common_locales_uk__WEBPACK_IMPORTED_MODULE_112__);
+/* harmony import */ var _angular_common_locales_vi__WEBPACK_IMPORTED_MODULE_113__ = __webpack_require__(/*! @angular/common/locales/vi */ "./node_modules/@angular/common/locales/vi.js");
+/* harmony import */ var _angular_common_locales_vi__WEBPACK_IMPORTED_MODULE_113___default = /*#__PURE__*/__webpack_require__.n(_angular_common_locales_vi__WEBPACK_IMPORTED_MODULE_113__);
+/* harmony import */ var _angular_common_locales_zh_Hans__WEBPACK_IMPORTED_MODULE_114__ = __webpack_require__(/*! @angular/common/locales/zh-Hans */ "./node_modules/@angular/common/locales/zh-Hans.js");
+/* harmony import */ var _angular_common_locales_zh_Hans__WEBPACK_IMPORTED_MODULE_114___default = /*#__PURE__*/__webpack_require__.n(_angular_common_locales_zh_Hans__WEBPACK_IMPORTED_MODULE_114__);
+/* harmony import */ var _angular_common_locales_zh_Hant__WEBPACK_IMPORTED_MODULE_115__ = __webpack_require__(/*! @angular/common/locales/zh-Hant */ "./node_modules/@angular/common/locales/zh-Hant.js");
+/* harmony import */ var _angular_common_locales_zh_Hant__WEBPACK_IMPORTED_MODULE_115___default = /*#__PURE__*/__webpack_require__.n(_angular_common_locales_zh_Hant__WEBPACK_IMPORTED_MODULE_115__);
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Object(_angular_common__WEBPACK_IMPORTED_MODULE_73__["registerLocaleData"])(_angular_common_locales_az__WEBPACK_IMPORTED_MODULE_74___default.a, 'az');
+Object(_angular_common__WEBPACK_IMPORTED_MODULE_73__["registerLocaleData"])(_angular_common_locales_be__WEBPACK_IMPORTED_MODULE_75___default.a, 'be');
+Object(_angular_common__WEBPACK_IMPORTED_MODULE_73__["registerLocaleData"])(_angular_common_locales_bg__WEBPACK_IMPORTED_MODULE_76___default.a, 'bg');
+Object(_angular_common__WEBPACK_IMPORTED_MODULE_73__["registerLocaleData"])(_angular_common_locales_bn__WEBPACK_IMPORTED_MODULE_77___default.a, 'bn');
+Object(_angular_common__WEBPACK_IMPORTED_MODULE_73__["registerLocaleData"])(_angular_common_locales_ca__WEBPACK_IMPORTED_MODULE_78___default.a, 'ca');
+Object(_angular_common__WEBPACK_IMPORTED_MODULE_73__["registerLocaleData"])(_angular_common_locales_cs__WEBPACK_IMPORTED_MODULE_79___default.a, 'cs');
+Object(_angular_common__WEBPACK_IMPORTED_MODULE_73__["registerLocaleData"])(_angular_common_locales_da__WEBPACK_IMPORTED_MODULE_80___default.a, 'da');
+Object(_angular_common__WEBPACK_IMPORTED_MODULE_73__["registerLocaleData"])(_angular_common_locales_de__WEBPACK_IMPORTED_MODULE_81___default.a, 'de');
+Object(_angular_common__WEBPACK_IMPORTED_MODULE_73__["registerLocaleData"])(_angular_common_locales_el__WEBPACK_IMPORTED_MODULE_82___default.a, 'el');
+Object(_angular_common__WEBPACK_IMPORTED_MODULE_73__["registerLocaleData"])(_angular_common_locales_en_GB__WEBPACK_IMPORTED_MODULE_83___default.a, 'en-GB');
+Object(_angular_common__WEBPACK_IMPORTED_MODULE_73__["registerLocaleData"])(_angular_common_locales_en_IN__WEBPACK_IMPORTED_MODULE_84___default.a, 'en-IN');
+Object(_angular_common__WEBPACK_IMPORTED_MODULE_73__["registerLocaleData"])(_angular_common_locales_es__WEBPACK_IMPORTED_MODULE_85___default.a, 'es');
+Object(_angular_common__WEBPACK_IMPORTED_MODULE_73__["registerLocaleData"])(_angular_common_locales_et__WEBPACK_IMPORTED_MODULE_86___default.a, 'et');
+Object(_angular_common__WEBPACK_IMPORTED_MODULE_73__["registerLocaleData"])(_angular_common_locales_fa__WEBPACK_IMPORTED_MODULE_87___default.a, 'fa');
+Object(_angular_common__WEBPACK_IMPORTED_MODULE_73__["registerLocaleData"])(_angular_common_locales_fi__WEBPACK_IMPORTED_MODULE_88___default.a, 'fi');
+Object(_angular_common__WEBPACK_IMPORTED_MODULE_73__["registerLocaleData"])(_angular_common_locales_fr__WEBPACK_IMPORTED_MODULE_89___default.a, 'fr');
+Object(_angular_common__WEBPACK_IMPORTED_MODULE_73__["registerLocaleData"])(_angular_common_locales_he__WEBPACK_IMPORTED_MODULE_90___default.a, 'he');
+Object(_angular_common__WEBPACK_IMPORTED_MODULE_73__["registerLocaleData"])(_angular_common_locales_hr__WEBPACK_IMPORTED_MODULE_91___default.a, 'hr');
+Object(_angular_common__WEBPACK_IMPORTED_MODULE_73__["registerLocaleData"])(_angular_common_locales_hu__WEBPACK_IMPORTED_MODULE_92___default.a, 'hu');
+Object(_angular_common__WEBPACK_IMPORTED_MODULE_73__["registerLocaleData"])(_angular_common_locales_id__WEBPACK_IMPORTED_MODULE_93___default.a, 'id');
+Object(_angular_common__WEBPACK_IMPORTED_MODULE_73__["registerLocaleData"])(_angular_common_locales_it__WEBPACK_IMPORTED_MODULE_94___default.a, 'it');
+Object(_angular_common__WEBPACK_IMPORTED_MODULE_73__["registerLocaleData"])(_angular_common_locales_ja__WEBPACK_IMPORTED_MODULE_95___default.a, 'ja');
+Object(_angular_common__WEBPACK_IMPORTED_MODULE_73__["registerLocaleData"])(_angular_common_locales_ko__WEBPACK_IMPORTED_MODULE_97___default.a, 'ko');
+Object(_angular_common__WEBPACK_IMPORTED_MODULE_73__["registerLocaleData"])(_angular_common_locales_kn__WEBPACK_IMPORTED_MODULE_96___default.a, 'kn');
+Object(_angular_common__WEBPACK_IMPORTED_MODULE_73__["registerLocaleData"])(_angular_common_locales_lv__WEBPACK_IMPORTED_MODULE_98___default.a, 'lv');
+Object(_angular_common__WEBPACK_IMPORTED_MODULE_73__["registerLocaleData"])(_angular_common_locales_ml__WEBPACK_IMPORTED_MODULE_99___default.a, 'ml');
+Object(_angular_common__WEBPACK_IMPORTED_MODULE_73__["registerLocaleData"])(_angular_common_locales_nb__WEBPACK_IMPORTED_MODULE_100___default.a, 'nb');
+Object(_angular_common__WEBPACK_IMPORTED_MODULE_73__["registerLocaleData"])(_angular_common_locales_nl__WEBPACK_IMPORTED_MODULE_101___default.a, 'nl');
+Object(_angular_common__WEBPACK_IMPORTED_MODULE_73__["registerLocaleData"])(_angular_common_locales_pl__WEBPACK_IMPORTED_MODULE_102___default.a, 'pl');
+Object(_angular_common__WEBPACK_IMPORTED_MODULE_73__["registerLocaleData"])(_angular_common_locales_pt__WEBPACK_IMPORTED_MODULE_103___default.a, 'pt-BR');
+Object(_angular_common__WEBPACK_IMPORTED_MODULE_73__["registerLocaleData"])(_angular_common_locales_pt_PT__WEBPACK_IMPORTED_MODULE_104___default.a, 'pt-PT');
+Object(_angular_common__WEBPACK_IMPORTED_MODULE_73__["registerLocaleData"])(_angular_common_locales_ro__WEBPACK_IMPORTED_MODULE_105___default.a, 'ro');
+Object(_angular_common__WEBPACK_IMPORTED_MODULE_73__["registerLocaleData"])(_angular_common_locales_ru__WEBPACK_IMPORTED_MODULE_106___default.a, 'ru');
+Object(_angular_common__WEBPACK_IMPORTED_MODULE_73__["registerLocaleData"])(_angular_common_locales_sk__WEBPACK_IMPORTED_MODULE_107___default.a, 'sk');
+Object(_angular_common__WEBPACK_IMPORTED_MODULE_73__["registerLocaleData"])(_angular_common_locales_sr__WEBPACK_IMPORTED_MODULE_108___default.a, 'sr');
+Object(_angular_common__WEBPACK_IMPORTED_MODULE_73__["registerLocaleData"])(_angular_common_locales_sv__WEBPACK_IMPORTED_MODULE_109___default.a, 'sv');
+Object(_angular_common__WEBPACK_IMPORTED_MODULE_73__["registerLocaleData"])(_angular_common_locales_th__WEBPACK_IMPORTED_MODULE_110___default.a, 'th');
+Object(_angular_common__WEBPACK_IMPORTED_MODULE_73__["registerLocaleData"])(_angular_common_locales_tr__WEBPACK_IMPORTED_MODULE_111___default.a, 'tr');
+Object(_angular_common__WEBPACK_IMPORTED_MODULE_73__["registerLocaleData"])(_angular_common_locales_uk__WEBPACK_IMPORTED_MODULE_112___default.a, 'uk');
+Object(_angular_common__WEBPACK_IMPORTED_MODULE_73__["registerLocaleData"])(_angular_common_locales_vi__WEBPACK_IMPORTED_MODULE_113___default.a, 'vi');
+Object(_angular_common__WEBPACK_IMPORTED_MODULE_73__["registerLocaleData"])(_angular_common_locales_zh_Hans__WEBPACK_IMPORTED_MODULE_114___default.a, 'zh-CN');
+Object(_angular_common__WEBPACK_IMPORTED_MODULE_73__["registerLocaleData"])(_angular_common_locales_zh_Hant__WEBPACK_IMPORTED_MODULE_115___default.a, 'zh-TW');
+class AppModule {
+}
+AppModule.ɵfac = function AppModule_Factory(t) { return new (t || AppModule)(); };
+AppModule.ɵmod = _angular_core__WEBPACK_IMPORTED_MODULE_6__["ɵɵdefineNgModule"]({ type: AppModule, bootstrap: [_app_component__WEBPACK_IMPORTED_MODULE_23__["AppComponent"]] });
+AppModule.ɵinj = _angular_core__WEBPACK_IMPORTED_MODULE_6__["ɵɵdefineInjector"]({ providers: [
+ _angular_common__WEBPACK_IMPORTED_MODULE_73__["CurrencyPipe"],
+ _angular_common__WEBPACK_IMPORTED_MODULE_73__["DatePipe"],
+ ], imports: [[
+ _angular_cdk_a11y__WEBPACK_IMPORTED_MODULE_0__["A11yModule"],
+ _app_routing_module__WEBPACK_IMPORTED_MODULE_4__["AppRoutingModule"],
+ _angular_platform_browser_animations__WEBPACK_IMPORTED_MODULE_9__["BrowserAnimationsModule"],
+ _angular_platform_browser__WEBPACK_IMPORTED_MODULE_8__["BrowserModule"],
+ _angular_cdk_drag_drop__WEBPACK_IMPORTED_MODULE_1__["DragDropModule"],
+ _angular_forms__WEBPACK_IMPORTED_MODULE_7__["FormsModule"],
+ _angular_forms__WEBPACK_IMPORTED_MODULE_7__["ReactiveFormsModule"],
+ _angular_cdk_scrolling__WEBPACK_IMPORTED_MODULE_2__["ScrollingModule"],
+ _services_services_module__WEBPACK_IMPORTED_MODULE_5__["ServicesModule"],
+ angular2_toaster__WEBPACK_IMPORTED_MODULE_3__["ToasterModule"].forRoot(),
+ ]] });
+(function () { (typeof ngJitMode === "undefined" || ngJitMode) && _angular_core__WEBPACK_IMPORTED_MODULE_6__["ɵɵsetNgModuleScope"](AppModule, { declarations: [jslib_angular_directives_a11y_title_directive__WEBPACK_IMPORTED_MODULE_50__["A11yTitleDirective"],
+ _components_action_buttons_component__WEBPACK_IMPORTED_MODULE_65__["ActionButtonsComponent"],
+ _vault_add_edit_component__WEBPACK_IMPORTED_MODULE_36__["AddEditComponent"],
+ jslib_angular_directives_api_action_directive__WEBPACK_IMPORTED_MODULE_51__["ApiActionDirective"],
+ _app_component__WEBPACK_IMPORTED_MODULE_23__["AppComponent"],
+ _vault_attachments_component__WEBPACK_IMPORTED_MODULE_37__["AttachmentsComponent"],
+ jslib_angular_directives_autofocus_directive__WEBPACK_IMPORTED_MODULE_52__["AutofocusDirective"],
+ jslib_angular_directives_blur_click_directive__WEBPACK_IMPORTED_MODULE_53__["BlurClickDirective"],
+ jslib_angular_directives_box_row_directive__WEBPACK_IMPORTED_MODULE_54__["BoxRowDirective"],
+ jslib_angular_components_callout_component__WEBPACK_IMPORTED_MODULE_71__["CalloutComponent"],
+ jslib_angular_directives_cipherListVirtualScroll_directive__WEBPACK_IMPORTED_MODULE_55__["CipherListVirtualScroll"],
+ _components_cipher_row_component__WEBPACK_IMPORTED_MODULE_66__["CipherRowComponent"],
+ _vault_ciphers_component__WEBPACK_IMPORTED_MODULE_38__["CiphersComponent"],
+ _vault_collections_component__WEBPACK_IMPORTED_MODULE_39__["CollectionsComponent"],
+ jslib_angular_pipes_color_password_pipe__WEBPACK_IMPORTED_MODULE_62__["ColorPasswordPipe"],
+ _vault_current_tab_component__WEBPACK_IMPORTED_MODULE_40__["CurrentTabComponent"],
+ _accounts_environment_component__WEBPACK_IMPORTED_MODULE_10__["EnvironmentComponent"],
+ _settings_excluded_domains_component__WEBPACK_IMPORTED_MODULE_26__["ExcludedDomainsComponent"],
+ _settings_export_component__WEBPACK_IMPORTED_MODULE_27__["ExportComponent"],
+ jslib_angular_directives_fallback_src_directive__WEBPACK_IMPORTED_MODULE_56__["FallbackSrcDirective"],
+ _settings_folder_add_edit_component__WEBPACK_IMPORTED_MODULE_28__["FolderAddEditComponent"],
+ _settings_folders_component__WEBPACK_IMPORTED_MODULE_29__["FoldersComponent"],
+ _vault_groupings_component__WEBPACK_IMPORTED_MODULE_41__["GroupingsComponent"],
+ _accounts_home_component__WEBPACK_IMPORTED_MODULE_12__["HomeComponent"],
+ _accounts_hint_component__WEBPACK_IMPORTED_MODULE_11__["HintComponent"],
+ jslib_angular_pipes_i18n_pipe__WEBPACK_IMPORTED_MODULE_63__["I18nPipe"],
+ jslib_angular_components_icon_component__WEBPACK_IMPORTED_MODULE_72__["IconComponent"],
+ jslib_angular_directives_input_verbatim_directive__WEBPACK_IMPORTED_MODULE_57__["InputVerbatimDirective"],
+ _accounts_lock_component__WEBPACK_IMPORTED_MODULE_13__["LockComponent"],
+ _accounts_login_component__WEBPACK_IMPORTED_MODULE_14__["LoginComponent"],
+ _settings_options_component__WEBPACK_IMPORTED_MODULE_30__["OptionsComponent"],
+ _generator_password_generator_component__WEBPACK_IMPORTED_MODULE_22__["PasswordGeneratorComponent"],
+ _generator_password_generator_history_component__WEBPACK_IMPORTED_MODULE_21__["PasswordGeneratorHistoryComponent"],
+ _vault_password_history_component__WEBPACK_IMPORTED_MODULE_42__["PasswordHistoryComponent"],
+ _components_pop_out_component__WEBPACK_IMPORTED_MODULE_68__["PopOutComponent"],
+ _settings_premium_component__WEBPACK_IMPORTED_MODULE_31__["PremiumComponent"],
+ _private_mode_component__WEBPACK_IMPORTED_MODULE_24__["PrivateModeComponent"],
+ _accounts_register_component__WEBPACK_IMPORTED_MODULE_15__["RegisterComponent"],
+ jslib_angular_pipes_search_ciphers_pipe__WEBPACK_IMPORTED_MODULE_64__["SearchCiphersPipe"],
+ jslib_angular_directives_select_copy_directive__WEBPACK_IMPORTED_MODULE_58__["SelectCopyDirective"],
+ _send_send_add_edit_component__WEBPACK_IMPORTED_MODULE_47__["SendAddEditComponent"],
+ _send_efflux_dates_component__WEBPACK_IMPORTED_MODULE_46__["EffluxDatesComponent"],
+ _send_send_groupings_component__WEBPACK_IMPORTED_MODULE_48__["SendGroupingsComponent"],
+ _components_send_list_component__WEBPACK_IMPORTED_MODULE_69__["SendListComponent"],
+ _send_send_type_component__WEBPACK_IMPORTED_MODULE_49__["SendTypeComponent"],
+ _accounts_set_password_component__WEBPACK_IMPORTED_MODULE_16__["SetPasswordComponent"],
+ _settings_settings_component__WEBPACK_IMPORTED_MODULE_32__["SettingsComponent"],
+ _vault_share_component__WEBPACK_IMPORTED_MODULE_43__["ShareComponent"],
+ _accounts_sso_component__WEBPACK_IMPORTED_MODULE_17__["SsoComponent"],
+ jslib_angular_directives_stop_click_directive__WEBPACK_IMPORTED_MODULE_59__["StopClickDirective"],
+ jslib_angular_directives_stop_prop_directive__WEBPACK_IMPORTED_MODULE_60__["StopPropDirective"],
+ _settings_sync_component__WEBPACK_IMPORTED_MODULE_33__["SyncComponent"],
+ _tabs_component__WEBPACK_IMPORTED_MODULE_25__["TabsComponent"],
+ jslib_angular_directives_true_false_value_directive__WEBPACK_IMPORTED_MODULE_61__["TrueFalseValueDirective"],
+ _accounts_two_factor_options_component__WEBPACK_IMPORTED_MODULE_18__["TwoFactorOptionsComponent"],
+ _accounts_two_factor_component__WEBPACK_IMPORTED_MODULE_19__["TwoFactorComponent"],
+ _accounts_update_temp_password_component__WEBPACK_IMPORTED_MODULE_20__["UpdateTempPasswordComponent"],
+ _vault_view_component__WEBPACK_IMPORTED_MODULE_45__["ViewComponent"],
+ _components_password_reprompt_component__WEBPACK_IMPORTED_MODULE_67__["PasswordRepromptComponent"],
+ _components_set_pin_component__WEBPACK_IMPORTED_MODULE_70__["SetPinComponent"],
+ _settings_vault_timeout_input_component__WEBPACK_IMPORTED_MODULE_34__["VaultTimeoutInputComponent"],
+ _vault_add_edit_custom_fields_component__WEBPACK_IMPORTED_MODULE_35__["AddEditCustomFieldsComponent"],
+ _vault_view_custom_fields_component__WEBPACK_IMPORTED_MODULE_44__["ViewCustomFieldsComponent"]], imports: [_angular_cdk_a11y__WEBPACK_IMPORTED_MODULE_0__["A11yModule"],
+ _app_routing_module__WEBPACK_IMPORTED_MODULE_4__["AppRoutingModule"],
+ _angular_platform_browser_animations__WEBPACK_IMPORTED_MODULE_9__["BrowserAnimationsModule"],
+ _angular_platform_browser__WEBPACK_IMPORTED_MODULE_8__["BrowserModule"],
+ _angular_cdk_drag_drop__WEBPACK_IMPORTED_MODULE_1__["DragDropModule"],
+ _angular_forms__WEBPACK_IMPORTED_MODULE_7__["FormsModule"],
+ _angular_forms__WEBPACK_IMPORTED_MODULE_7__["ReactiveFormsModule"],
+ _angular_cdk_scrolling__WEBPACK_IMPORTED_MODULE_2__["ScrollingModule"],
+ _services_services_module__WEBPACK_IMPORTED_MODULE_5__["ServicesModule"], angular2_toaster__WEBPACK_IMPORTED_MODULE_3__["ToasterModule"]] }); })();
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_6__["ɵsetClassMetadata"](AppModule, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_6__["NgModule"],
+ args: [{
+ imports: [
+ _angular_cdk_a11y__WEBPACK_IMPORTED_MODULE_0__["A11yModule"],
+ _app_routing_module__WEBPACK_IMPORTED_MODULE_4__["AppRoutingModule"],
+ _angular_platform_browser_animations__WEBPACK_IMPORTED_MODULE_9__["BrowserAnimationsModule"],
+ _angular_platform_browser__WEBPACK_IMPORTED_MODULE_8__["BrowserModule"],
+ _angular_cdk_drag_drop__WEBPACK_IMPORTED_MODULE_1__["DragDropModule"],
+ _angular_forms__WEBPACK_IMPORTED_MODULE_7__["FormsModule"],
+ _angular_forms__WEBPACK_IMPORTED_MODULE_7__["ReactiveFormsModule"],
+ _angular_cdk_scrolling__WEBPACK_IMPORTED_MODULE_2__["ScrollingModule"],
+ _services_services_module__WEBPACK_IMPORTED_MODULE_5__["ServicesModule"],
+ angular2_toaster__WEBPACK_IMPORTED_MODULE_3__["ToasterModule"].forRoot(),
+ ],
+ declarations: [
+ jslib_angular_directives_a11y_title_directive__WEBPACK_IMPORTED_MODULE_50__["A11yTitleDirective"],
+ _components_action_buttons_component__WEBPACK_IMPORTED_MODULE_65__["ActionButtonsComponent"],
+ _vault_add_edit_component__WEBPACK_IMPORTED_MODULE_36__["AddEditComponent"],
+ jslib_angular_directives_api_action_directive__WEBPACK_IMPORTED_MODULE_51__["ApiActionDirective"],
+ _app_component__WEBPACK_IMPORTED_MODULE_23__["AppComponent"],
+ _vault_attachments_component__WEBPACK_IMPORTED_MODULE_37__["AttachmentsComponent"],
+ jslib_angular_directives_autofocus_directive__WEBPACK_IMPORTED_MODULE_52__["AutofocusDirective"],
+ jslib_angular_directives_blur_click_directive__WEBPACK_IMPORTED_MODULE_53__["BlurClickDirective"],
+ jslib_angular_directives_box_row_directive__WEBPACK_IMPORTED_MODULE_54__["BoxRowDirective"],
+ jslib_angular_components_callout_component__WEBPACK_IMPORTED_MODULE_71__["CalloutComponent"],
+ jslib_angular_directives_cipherListVirtualScroll_directive__WEBPACK_IMPORTED_MODULE_55__["CipherListVirtualScroll"],
+ _components_cipher_row_component__WEBPACK_IMPORTED_MODULE_66__["CipherRowComponent"],
+ _vault_ciphers_component__WEBPACK_IMPORTED_MODULE_38__["CiphersComponent"],
+ _vault_collections_component__WEBPACK_IMPORTED_MODULE_39__["CollectionsComponent"],
+ jslib_angular_pipes_color_password_pipe__WEBPACK_IMPORTED_MODULE_62__["ColorPasswordPipe"],
+ _vault_current_tab_component__WEBPACK_IMPORTED_MODULE_40__["CurrentTabComponent"],
+ _accounts_environment_component__WEBPACK_IMPORTED_MODULE_10__["EnvironmentComponent"],
+ _settings_excluded_domains_component__WEBPACK_IMPORTED_MODULE_26__["ExcludedDomainsComponent"],
+ _settings_export_component__WEBPACK_IMPORTED_MODULE_27__["ExportComponent"],
+ jslib_angular_directives_fallback_src_directive__WEBPACK_IMPORTED_MODULE_56__["FallbackSrcDirective"],
+ _settings_folder_add_edit_component__WEBPACK_IMPORTED_MODULE_28__["FolderAddEditComponent"],
+ _settings_folders_component__WEBPACK_IMPORTED_MODULE_29__["FoldersComponent"],
+ _vault_groupings_component__WEBPACK_IMPORTED_MODULE_41__["GroupingsComponent"],
+ _accounts_home_component__WEBPACK_IMPORTED_MODULE_12__["HomeComponent"],
+ _accounts_hint_component__WEBPACK_IMPORTED_MODULE_11__["HintComponent"],
+ jslib_angular_pipes_i18n_pipe__WEBPACK_IMPORTED_MODULE_63__["I18nPipe"],
+ jslib_angular_components_icon_component__WEBPACK_IMPORTED_MODULE_72__["IconComponent"],
+ jslib_angular_directives_input_verbatim_directive__WEBPACK_IMPORTED_MODULE_57__["InputVerbatimDirective"],
+ _accounts_lock_component__WEBPACK_IMPORTED_MODULE_13__["LockComponent"],
+ _accounts_login_component__WEBPACK_IMPORTED_MODULE_14__["LoginComponent"],
+ _settings_options_component__WEBPACK_IMPORTED_MODULE_30__["OptionsComponent"],
+ _generator_password_generator_component__WEBPACK_IMPORTED_MODULE_22__["PasswordGeneratorComponent"],
+ _generator_password_generator_history_component__WEBPACK_IMPORTED_MODULE_21__["PasswordGeneratorHistoryComponent"],
+ _vault_password_history_component__WEBPACK_IMPORTED_MODULE_42__["PasswordHistoryComponent"],
+ _components_pop_out_component__WEBPACK_IMPORTED_MODULE_68__["PopOutComponent"],
+ _settings_premium_component__WEBPACK_IMPORTED_MODULE_31__["PremiumComponent"],
+ _private_mode_component__WEBPACK_IMPORTED_MODULE_24__["PrivateModeComponent"],
+ _accounts_register_component__WEBPACK_IMPORTED_MODULE_15__["RegisterComponent"],
+ jslib_angular_pipes_search_ciphers_pipe__WEBPACK_IMPORTED_MODULE_64__["SearchCiphersPipe"],
+ jslib_angular_directives_select_copy_directive__WEBPACK_IMPORTED_MODULE_58__["SelectCopyDirective"],
+ _send_send_add_edit_component__WEBPACK_IMPORTED_MODULE_47__["SendAddEditComponent"],
+ _send_efflux_dates_component__WEBPACK_IMPORTED_MODULE_46__["EffluxDatesComponent"],
+ _send_send_groupings_component__WEBPACK_IMPORTED_MODULE_48__["SendGroupingsComponent"],
+ _components_send_list_component__WEBPACK_IMPORTED_MODULE_69__["SendListComponent"],
+ _send_send_type_component__WEBPACK_IMPORTED_MODULE_49__["SendTypeComponent"],
+ _accounts_set_password_component__WEBPACK_IMPORTED_MODULE_16__["SetPasswordComponent"],
+ _settings_settings_component__WEBPACK_IMPORTED_MODULE_32__["SettingsComponent"],
+ _vault_share_component__WEBPACK_IMPORTED_MODULE_43__["ShareComponent"],
+ _accounts_sso_component__WEBPACK_IMPORTED_MODULE_17__["SsoComponent"],
+ jslib_angular_directives_stop_click_directive__WEBPACK_IMPORTED_MODULE_59__["StopClickDirective"],
+ jslib_angular_directives_stop_prop_directive__WEBPACK_IMPORTED_MODULE_60__["StopPropDirective"],
+ _settings_sync_component__WEBPACK_IMPORTED_MODULE_33__["SyncComponent"],
+ _tabs_component__WEBPACK_IMPORTED_MODULE_25__["TabsComponent"],
+ jslib_angular_directives_true_false_value_directive__WEBPACK_IMPORTED_MODULE_61__["TrueFalseValueDirective"],
+ _accounts_two_factor_options_component__WEBPACK_IMPORTED_MODULE_18__["TwoFactorOptionsComponent"],
+ _accounts_two_factor_component__WEBPACK_IMPORTED_MODULE_19__["TwoFactorComponent"],
+ _accounts_update_temp_password_component__WEBPACK_IMPORTED_MODULE_20__["UpdateTempPasswordComponent"],
+ _vault_view_component__WEBPACK_IMPORTED_MODULE_45__["ViewComponent"],
+ _components_password_reprompt_component__WEBPACK_IMPORTED_MODULE_67__["PasswordRepromptComponent"],
+ _components_set_pin_component__WEBPACK_IMPORTED_MODULE_70__["SetPinComponent"],
+ _settings_vault_timeout_input_component__WEBPACK_IMPORTED_MODULE_34__["VaultTimeoutInputComponent"],
+ _vault_add_edit_custom_fields_component__WEBPACK_IMPORTED_MODULE_35__["AddEditCustomFieldsComponent"],
+ _vault_view_custom_fields_component__WEBPACK_IMPORTED_MODULE_44__["ViewCustomFieldsComponent"],
+ ],
+ entryComponents: [],
+ providers: [
+ _angular_common__WEBPACK_IMPORTED_MODULE_73__["CurrencyPipe"],
+ _angular_common__WEBPACK_IMPORTED_MODULE_73__["DatePipe"],
+ ],
+ bootstrap: [_app_component__WEBPACK_IMPORTED_MODULE_23__["AppComponent"]],
+ }]
+ }], null, null); })();
+
+
+/***/ }),
+
+/***/ "./src/popup/components/action-buttons.component.ts":
+/*!**********************************************************!*\
+ !*** ./src/popup/components/action-buttons.component.ts ***!
+ \**********************************************************/
+/*! exports provided: ActionButtonsComponent */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ActionButtonsComponent", function() { return ActionButtonsComponent; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var angular2_toaster__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! angular2-toaster */ "./node_modules/angular2-toaster/__ivy_ngcc__/fesm2015/angular2-toaster.js");
+/* harmony import */ var jslib_common_enums_cipherRepromptType__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! jslib-common/enums/cipherRepromptType */ "./jslib/common/src/enums/cipherRepromptType.ts");
+/* harmony import */ var jslib_common_enums_cipherType__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! jslib-common/enums/cipherType */ "./jslib/common/src/enums/cipherType.ts");
+/* harmony import */ var jslib_common_enums_eventType__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! jslib-common/enums/eventType */ "./jslib/common/src/enums/eventType.ts");
+/* harmony import */ var jslib_common_models_view_cipherView__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! jslib-common/models/view/cipherView */ "./jslib/common/src/models/view/cipherView.ts");
+/* harmony import */ var jslib_common_abstractions_event_service__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! jslib-common/abstractions/event.service */ "./jslib/common/src/abstractions/event.service.ts");
+/* harmony import */ var jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! jslib-common/abstractions/i18n.service */ "./jslib/common/src/abstractions/i18n.service.ts");
+/* harmony import */ var jslib_common_abstractions_passwordReprompt_service__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! jslib-common/abstractions/passwordReprompt.service */ "./jslib/common/src/abstractions/passwordReprompt.service.ts");
+/* harmony import */ var jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! jslib-common/abstractions/platformUtils.service */ "./jslib/common/src/abstractions/platformUtils.service.ts");
+/* harmony import */ var jslib_common_abstractions_totp_service__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! jslib-common/abstractions/totp.service */ "./jslib/common/src/abstractions/totp.service.ts");
+/* harmony import */ var jslib_common_abstractions_user_service__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! jslib-common/abstractions/user.service */ "./jslib/common/src/abstractions/user.service.ts");
+/* harmony import */ var _angular_common__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @angular/common */ "./node_modules/@angular/common/__ivy_ngcc__/fesm2015/common.js");
+/* harmony import */ var jslib_angular_directives_stop_click_directive__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! jslib-angular/directives/stop-click.directive */ "./jslib/angular/src/directives/stop-click.directive.ts");
+/* harmony import */ var jslib_angular_directives_stop_prop_directive__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! jslib-angular/directives/stop-prop.directive */ "./jslib/angular/src/directives/stop-prop.directive.ts");
+/* harmony import */ var jslib_angular_directives_a11y_title_directive__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! jslib-angular/directives/a11y-title.directive */ "./jslib/angular/src/directives/a11y-title.directive.ts");
+/* harmony import */ var jslib_angular_pipes_i18n_pipe__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! jslib-angular/pipes/i18n.pipe */ "./jslib/angular/src/pipes/i18n.pipe.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+function ActionButtonsComponent_span_0_Template(rf, ctx) { if (rf & 1) {
+ const _r5 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "span", 2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("click", function ActionButtonsComponent_span_0_Template_span_click_0_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r5); const ctx_r4 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](); return ctx_r4.view(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](1, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](2, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](3, "i", 3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](4, "\n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate"]("appA11yTitle", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](1, 1, "view"));
+} }
+const _c0 = function (a0) { return { disabled: a0 }; };
+function ActionButtonsComponent_ng_container_2_span_2_Template(rf, ctx) { if (rf & 1) {
+ const _r8 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "span", 5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("click", function ActionButtonsComponent_ng_container_2_span_2_Template_span_click_0_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r8); const ctx_r7 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](2); return ctx_r7.launchCipher(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](1, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](2, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](3, "i", 9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](4, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r6 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate"]("appA11yTitle", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](1, 2, "launch"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngClass", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpureFunction1"](4, _c0, !ctx_r6.cipher.login.canLaunch));
+} }
+function ActionButtonsComponent_ng_container_2_Template(rf, ctx) { if (rf & 1) {
+ const _r10 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementContainerStart"](0);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](2, ActionButtonsComponent_ng_container_2_span_2_Template, 5, 6, "span", 4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](4, "span", 5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("click", function ActionButtonsComponent_ng_container_2_Template_span_click_4_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r10); const ctx_r9 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](); return ctx_r9.copy(ctx_r9.cipher, ctx_r9.cipher.login.username, "username", "Username"); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](5, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](6, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](7, "i", 6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](8, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](9, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](10, "span", 5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("click", function ActionButtonsComponent_ng_container_2_Template_span_click_10_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r10); const ctx_r11 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](); return ctx_r11.copy(ctx_r11.cipher, ctx_r11.cipher.login.password, "password", "Password"); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](11, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](12, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](13, "i", 7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](14, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](15, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](16, "span", 5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("click", function ActionButtonsComponent_ng_container_2_Template_span_click_16_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r10); const ctx_r12 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](); return ctx_r12.copy(ctx_r12.cipher, ctx_r12.cipher.login.totp, "verificationCodeTotp", "TOTP"); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](17, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](18, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](19, "i", 8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](20, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](21, "\n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementContainerEnd"]();
+} if (rf & 2) {
+ const ctx_r1 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", !ctx_r1.showView);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate"]("appA11yTitle", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](5, 7, "copyUsername"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngClass", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpureFunction1"](13, _c0, !ctx_r1.cipher.login.username));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate"]("appA11yTitle", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](11, 9, "copyPassword"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngClass", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpureFunction1"](15, _c0, !ctx_r1.cipher.login.password || !ctx_r1.cipher.viewPassword));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate"]("appA11yTitle", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](17, 11, "copyVerificationCode"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngClass", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpureFunction1"](17, _c0, !ctx_r1.displayTotpCopyButton(ctx_r1.cipher)));
+} }
+function ActionButtonsComponent_ng_container_4_Template(rf, ctx) { if (rf & 1) {
+ const _r14 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementContainerStart"](0);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](2, "span", 5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("click", function ActionButtonsComponent_ng_container_4_Template_span_click_2_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r14); const ctx_r13 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](); return ctx_r13.copy(ctx_r13.cipher, ctx_r13.cipher.card.number, "number", "Card Number"); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](3, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](4, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](5, "i", 10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](6, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](8, "span", 5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("click", function ActionButtonsComponent_ng_container_4_Template_span_click_8_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r14); const ctx_r15 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](); return ctx_r15.copy(ctx_r15.cipher, ctx_r15.cipher.card.code, "securityCode", "Security Code"); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](9, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](10, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](11, "i", 7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](12, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](13, "\n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementContainerEnd"]();
+} if (rf & 2) {
+ const ctx_r2 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate"]("appA11yTitle", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](3, 4, "copyNumber"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngClass", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpureFunction1"](8, _c0, !ctx_r2.cipher.card.number));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate"]("appA11yTitle", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](9, 6, "copySecurityCode"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngClass", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpureFunction1"](10, _c0, !ctx_r2.cipher.card.code));
+} }
+function ActionButtonsComponent_ng_container_6_Template(rf, ctx) { if (rf & 1) {
+ const _r17 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementContainerStart"](0);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](2, "span", 5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("click", function ActionButtonsComponent_ng_container_6_Template_span_click_2_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r17); const ctx_r16 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](); return ctx_r16.copy(ctx_r16.cipher, ctx_r16.cipher.notes, "note", "Note"); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](3, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](4, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](5, "i", 11);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](6, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](7, "\n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementContainerEnd"]();
+} if (rf & 2) {
+ const ctx_r3 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate"]("appA11yTitle", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](3, 2, "copyNote"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngClass", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpureFunction1"](4, _c0, !ctx_r3.cipher.notes));
+} }
+class ActionButtonsComponent {
+ constructor(toasterService, i18nService, platformUtilsService, eventService, totpService, userService, passwordRepromptService) {
+ this.toasterService = toasterService;
+ this.i18nService = i18nService;
+ this.platformUtilsService = platformUtilsService;
+ this.eventService = eventService;
+ this.totpService = totpService;
+ this.userService = userService;
+ this.passwordRepromptService = passwordRepromptService;
+ this.onView = new _angular_core__WEBPACK_IMPORTED_MODULE_0__["EventEmitter"]();
+ this.launchEvent = new _angular_core__WEBPACK_IMPORTED_MODULE_0__["EventEmitter"]();
+ this.showView = false;
+ this.cipherType = jslib_common_enums_cipherType__WEBPACK_IMPORTED_MODULE_3__["CipherType"];
+ this.userHasPremiumAccess = false;
+ }
+ ngOnInit() {
+ return __awaiter(this, void 0, void 0, function* () {
+ this.userHasPremiumAccess = yield this.userService.canAccessPremium();
+ });
+ }
+ launchCipher() {
+ this.launchEvent.emit(this.cipher);
+ }
+ copy(cipher, value, typeI18nKey, aType) {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (this.cipher.reprompt !== jslib_common_enums_cipherRepromptType__WEBPACK_IMPORTED_MODULE_2__["CipherRepromptType"].None && this.passwordRepromptService.protectedFields().includes(aType) &&
+ !(yield this.passwordRepromptService.showPasswordPrompt())) {
+ return;
+ }
+ if (value == null || aType === 'TOTP' && !this.displayTotpCopyButton(cipher)) {
+ return;
+ }
+ else if (value === cipher.login.totp) {
+ value = yield this.totpService.getCode(value);
+ }
+ if (!cipher.viewPassword) {
+ return;
+ }
+ this.platformUtilsService.copyToClipboard(value, { window: window });
+ this.toasterService.popAsync('info', null, this.i18nService.t('valueCopied', this.i18nService.t(typeI18nKey)));
+ if (typeI18nKey === 'password' || typeI18nKey === 'verificationCodeTotp') {
+ this.eventService.collect(jslib_common_enums_eventType__WEBPACK_IMPORTED_MODULE_4__["EventType"].Cipher_ClientToggledHiddenFieldVisible, cipher.id);
+ }
+ else if (typeI18nKey === 'securityCode') {
+ this.eventService.collect(jslib_common_enums_eventType__WEBPACK_IMPORTED_MODULE_4__["EventType"].Cipher_ClientCopiedCardCode, cipher.id);
+ }
+ });
+ }
+ displayTotpCopyButton(cipher) {
+ var _a, _b;
+ return ((_b = (_a = cipher === null || cipher === void 0 ? void 0 : cipher.login) === null || _a === void 0 ? void 0 : _a.hasTotp) !== null && _b !== void 0 ? _b : false) &&
+ (cipher.organizationUseTotp || this.userHasPremiumAccess);
+ }
+ view() {
+ this.onView.emit(this.cipher);
+ }
+}
+ActionButtonsComponent.ɵfac = function ActionButtonsComponent_Factory(t) { return new (t || ActionButtonsComponent)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](angular2_toaster__WEBPACK_IMPORTED_MODULE_1__["ToasterService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_7__["I18nService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_9__["PlatformUtilsService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_event_service__WEBPACK_IMPORTED_MODULE_6__["EventService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_totp_service__WEBPACK_IMPORTED_MODULE_10__["TotpService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_user_service__WEBPACK_IMPORTED_MODULE_11__["UserService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_passwordReprompt_service__WEBPACK_IMPORTED_MODULE_8__["PasswordRepromptService"])); };
+ActionButtonsComponent.ɵcmp = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineComponent"]({ type: ActionButtonsComponent, selectors: [["app-action-buttons"]], inputs: { cipher: "cipher", showView: "showView" }, outputs: { onView: "onView", launchEvent: "launchEvent" }, decls: 8, vars: 4, consts: [["class", "row-btn", "appStopClick", "", "appStopProp", "", 3, "appA11yTitle", "click", 4, "ngIf"], [4, "ngIf"], ["appStopClick", "", "appStopProp", "", 1, "row-btn", 3, "appA11yTitle", "click"], ["aria-hidden", "true", 1, "fa", "fa-lg", "fa-list-alt"], ["class", "row-btn", "appStopClick", "", "appStopProp", "", 3, "appA11yTitle", "ngClass", "click", 4, "ngIf"], ["appStopClick", "", "appStopProp", "", 1, "row-btn", 3, "appA11yTitle", "ngClass", "click"], ["aria-hidden", "true", 1, "fa", "fa-lg", "fa-user"], ["aria-hidden", "true", 1, "fa", "fa-lg", "fa-key"], ["aria-hidden", "true", 1, "fa", "fa-lg", "fa-clock-o"], ["aria-hidden", "true", 1, "fa", "fa-lg", "fa-share-square-o"], ["aria-hidden", "true", 1, "fa", "fa-lg", "fa-hashtag"], ["aria-hidden", "true", 1, "fa", "fa-lg", "fa-clone"]], template: function ActionButtonsComponent_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](0, ActionButtonsComponent_span_0_Template, 5, 3, "span", 0);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "\n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](2, ActionButtonsComponent_ng_container_2_Template, 22, 19, "ng-container", 1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](3, "\n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](4, ActionButtonsComponent_ng_container_4_Template, 14, 12, "ng-container", 1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](5, "\n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](6, ActionButtonsComponent_ng_container_6_Template, 8, 6, "ng-container", 1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](7, "\n");
+ } if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", ctx.showView);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", ctx.cipher.type === ctx.cipherType.Login);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", ctx.cipher.type === ctx.cipherType.Card);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", ctx.cipher.type === ctx.cipherType.SecureNote);
+ } }, directives: [_angular_common__WEBPACK_IMPORTED_MODULE_12__["NgIf"], jslib_angular_directives_stop_click_directive__WEBPACK_IMPORTED_MODULE_13__["StopClickDirective"], jslib_angular_directives_stop_prop_directive__WEBPACK_IMPORTED_MODULE_14__["StopPropDirective"], jslib_angular_directives_a11y_title_directive__WEBPACK_IMPORTED_MODULE_15__["A11yTitleDirective"], _angular_common__WEBPACK_IMPORTED_MODULE_12__["NgClass"]], pipes: [jslib_angular_pipes_i18n_pipe__WEBPACK_IMPORTED_MODULE_16__["I18nPipe"]], encapsulation: 2 });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](ActionButtonsComponent, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Component"],
+ args: [{
+ selector: 'app-action-buttons',
+ templateUrl: 'action-buttons.component.html',
+ }]
+ }], function () { return [{ type: angular2_toaster__WEBPACK_IMPORTED_MODULE_1__["ToasterService"] }, { type: jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_7__["I18nService"] }, { type: jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_9__["PlatformUtilsService"] }, { type: jslib_common_abstractions_event_service__WEBPACK_IMPORTED_MODULE_6__["EventService"] }, { type: jslib_common_abstractions_totp_service__WEBPACK_IMPORTED_MODULE_10__["TotpService"] }, { type: jslib_common_abstractions_user_service__WEBPACK_IMPORTED_MODULE_11__["UserService"] }, { type: jslib_common_abstractions_passwordReprompt_service__WEBPACK_IMPORTED_MODULE_8__["PasswordRepromptService"] }]; }, { onView: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Output"]
+ }], launchEvent: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Output"]
+ }], cipher: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"]
+ }], showView: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"]
+ }] }); })();
+
+
+/***/ }),
+
+/***/ "./src/popup/components/cipher-row.component.ts":
+/*!******************************************************!*\
+ !*** ./src/popup/components/cipher-row.component.ts ***!
+ \******************************************************/
+/*! exports provided: CipherRowComponent */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CipherRowComponent", function() { return CipherRowComponent; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var jslib_common_models_view_cipherView__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! jslib-common/models/view/cipherView */ "./jslib/common/src/models/view/cipherView.ts");
+/* harmony import */ var jslib_angular_directives_stop_click_directive__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! jslib-angular/directives/stop-click.directive */ "./jslib/angular/src/directives/stop-click.directive.ts");
+/* harmony import */ var jslib_angular_components_icon_component__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! jslib-angular/components/icon.component */ "./jslib/angular/src/components/icon.component.ts");
+/* harmony import */ var _angular_common__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @angular/common */ "./node_modules/@angular/common/__ivy_ngcc__/fesm2015/common.js");
+/* harmony import */ var _action_buttons_component__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./action-buttons.component */ "./src/popup/components/action-buttons.component.ts");
+/* harmony import */ var jslib_angular_pipes_i18n_pipe__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! jslib-angular/pipes/i18n.pipe */ "./jslib/angular/src/pipes/i18n.pipe.ts");
+
+
+
+
+
+
+
+
+function CipherRowComponent_ng_container_10_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementContainerStart"](0);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](2, "i", 8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](3, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](4, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](5, "span", 9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](7, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](8, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementContainerEnd"]();
+} if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate"]("title", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](3, 2, "shared"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](7, 4, "shared"));
+} }
+function CipherRowComponent_ng_container_12_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementContainerStart"](0);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](2, "i", 10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](3, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](4, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](5, "span", 9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](7, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](8, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementContainerEnd"]();
+} if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate"]("title", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](3, 2, "attachments"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](7, 4, "attachments"));
+} }
+class CipherRowComponent {
+ constructor() {
+ this.onSelected = new _angular_core__WEBPACK_IMPORTED_MODULE_0__["EventEmitter"]();
+ this.launchEvent = new _angular_core__WEBPACK_IMPORTED_MODULE_0__["EventEmitter"]();
+ this.onView = new _angular_core__WEBPACK_IMPORTED_MODULE_0__["EventEmitter"]();
+ this.showView = false;
+ }
+ selectCipher(c) {
+ this.onSelected.emit(c);
+ }
+ launchCipher(c) {
+ this.launchEvent.emit(c);
+ }
+ viewCipher(c) {
+ this.onView.emit(c);
+ }
+}
+CipherRowComponent.ɵfac = function CipherRowComponent_Factory(t) { return new (t || CipherRowComponent)(); };
+CipherRowComponent.ɵcmp = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineComponent"]({ type: CipherRowComponent, selectors: [["app-cipher-row"]], inputs: { cipher: "cipher", showView: "showView", title: "title" }, outputs: { onSelected: "onSelected", launchEvent: "launchEvent", onView: "onView" }, decls: 24, vars: 9, consts: [["type", "button", "appStopClick", "", 1, "box-content-row", "box-content-row-flex", "virtual-scroll-item", 3, "title", "click", "dblclick"], [1, "row-main"], [3, "cipher"], [1, "row-main-content"], [1, "text"], [4, "ngIf"], [1, "detail"], [1, "action-buttons", 3, "cipher", "showView", "onView", "launchEvent"], ["aria-hidden", "true", 1, "fa", "fa-cube", "text-muted", 3, "title"], [1, "sr-only"], ["aria-hidden", "true", 1, "fa", "fa-paperclip", "text-muted", 3, "title"]], template: function CipherRowComponent_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "button", 0);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("click", function CipherRowComponent_Template_button_click_0_listener() { return ctx.selectCipher(ctx.cipher); })("dblclick", function CipherRowComponent_Template_button_dblclick_0_listener() { return ctx.launchCipher(ctx.cipher); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](2, "div", 1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](4, "app-vault-icon", 2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](6, "div", 3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](8, "span", 4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](10, CipherRowComponent_ng_container_10_Template, 9, 6, "ng-container", 5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](11, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](12, CipherRowComponent_ng_container_12_Template, 9, 6, "ng-container", 5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](13, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](14, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](15, "span", 6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](16);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](17, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](18, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](19, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](20, "app-action-buttons", 7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("onView", function CipherRowComponent_Template_app_action_buttons_onView_20_listener() { return ctx.viewCipher(ctx.cipher); })("launchEvent", function CipherRowComponent_Template_app_action_buttons_launchEvent_20_listener() { return ctx.launchCipher(ctx.cipher); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](21, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](22, "\n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](23, "\n");
+ } if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate2"]("title", "", ctx.title, " - ", ctx.cipher.name, "");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("cipher", ctx.cipher);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate1"]("\n ", ctx.cipher.name, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", ctx.cipher.organizationId);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", ctx.cipher.hasAttachments);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](ctx.cipher.subTitle);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("cipher", ctx.cipher)("showView", ctx.showView);
+ } }, directives: [jslib_angular_directives_stop_click_directive__WEBPACK_IMPORTED_MODULE_2__["StopClickDirective"], jslib_angular_components_icon_component__WEBPACK_IMPORTED_MODULE_3__["IconComponent"], _angular_common__WEBPACK_IMPORTED_MODULE_4__["NgIf"], _action_buttons_component__WEBPACK_IMPORTED_MODULE_5__["ActionButtonsComponent"]], pipes: [jslib_angular_pipes_i18n_pipe__WEBPACK_IMPORTED_MODULE_6__["I18nPipe"]], encapsulation: 2 });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](CipherRowComponent, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Component"],
+ args: [{
+ selector: 'app-cipher-row',
+ templateUrl: 'cipher-row.component.html',
+ }]
+ }], null, { onSelected: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Output"]
+ }], launchEvent: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Output"]
+ }], onView: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Output"]
+ }], cipher: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"]
+ }], showView: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"]
+ }], title: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"]
+ }] }); })();
+
+
+/***/ }),
+
+/***/ "./src/popup/components/password-reprompt.component.ts":
+/*!*************************************************************!*\
+ !*** ./src/popup/components/password-reprompt.component.ts ***!
+ \*************************************************************/
+/*! exports provided: PasswordRepromptComponent */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PasswordRepromptComponent", function() { return PasswordRepromptComponent; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var jslib_angular_components_password_reprompt_component__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! jslib-angular/components/password-reprompt.component */ "./jslib/angular/src/components/password-reprompt.component.ts");
+/* harmony import */ var _angular_forms__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @angular/forms */ "./node_modules/@angular/forms/__ivy_ngcc__/fesm2015/forms.js");
+/* harmony import */ var jslib_angular_directives_box_row_directive__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! jslib-angular/directives/box-row.directive */ "./jslib/angular/src/directives/box-row.directive.ts");
+/* harmony import */ var jslib_angular_directives_autofocus_directive__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! jslib-angular/directives/autofocus.directive */ "./jslib/angular/src/directives/autofocus.directive.ts");
+/* harmony import */ var jslib_angular_directives_stop_click_directive__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! jslib-angular/directives/stop-click.directive */ "./jslib/angular/src/directives/stop-click.directive.ts");
+/* harmony import */ var jslib_angular_directives_blur_click_directive__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! jslib-angular/directives/blur-click.directive */ "./jslib/angular/src/directives/blur-click.directive.ts");
+/* harmony import */ var jslib_angular_directives_a11y_title_directive__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! jslib-angular/directives/a11y-title.directive */ "./jslib/angular/src/directives/a11y-title.directive.ts");
+/* harmony import */ var _angular_common__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @angular/common */ "./node_modules/@angular/common/__ivy_ngcc__/fesm2015/common.js");
+/* harmony import */ var jslib_angular_pipes_i18n_pipe__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! jslib-angular/pipes/i18n.pipe */ "./jslib/angular/src/pipes/i18n.pipe.ts");
+
+
+
+
+
+
+
+
+
+
+
+const _c0 = function (a0, a1) { return { "fa-eye": a0, "fa-eye-slash": a1 }; };
+class PasswordRepromptComponent extends jslib_angular_components_password_reprompt_component__WEBPACK_IMPORTED_MODULE_1__["PasswordRepromptComponent"] {
+}
+PasswordRepromptComponent.ɵfac = function PasswordRepromptComponent_Factory(t) { return ɵPasswordRepromptComponent_BaseFactory(t || PasswordRepromptComponent); };
+PasswordRepromptComponent.ɵcmp = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineComponent"]({ type: PasswordRepromptComponent, selectors: [["ng-component"]], features: [_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵInheritDefinitionFeature"]], decls: 62, vars: 24, consts: [["role", "dialog", "aria-modal", "true", 1, "modal", "fade"], ["role", "document", 1, "modal-dialog", "modal-dialog-scrollable"], [1, "modal-content", 3, "ngSubmit"], ["form", ""], [1, "modal-body"], [1, "box"], [1, "box-header"], [1, "box-content"], ["appBoxRow", "", 1, "box-content-row", "box-content-row-flex"], [1, "row-main"], ["for", "masterPassword"], ["id", "masterPassword", "name", "MasterPassword", "required", "", "appAutofocus", "", 1, "monospaced", 3, "type", "ngModel", "ngModelChange"], [1, "action-buttons"], ["type", "button", "appStopClick", "", "appBlurClick", "", "role", "button", 1, "row-btn", 3, "appA11yTitle", "click"], ["aria-hidden", "true", 1, "fa", "fa-lg", 3, "ngClass"], [1, "box-footer"], [1, "modal-footer"], ["type", "submit", "appBlurClick", "", 1, "btn", "btn-primary", "btn-submit"], ["type", "button", "data-dismiss", "modal", 1, "btn", "btn-outline-secondary"]], template: function PasswordRepromptComponent_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "div", 0);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](2, "div", 1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](4, "form", 2, 3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("ngSubmit", function PasswordRepromptComponent_Template_form_ngSubmit_4_listener() { return ctx.submit(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](6, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](7, "div", 4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](8, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](9, "div", 5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](10, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](11, "div", 6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](12);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](13, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](14, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](15, "div", 7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](16, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](17, "div", 8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](18, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](19, "div", 9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](20, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](21, "label", 10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](22);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](23, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](24, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](25, "input", 11);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("ngModelChange", function PasswordRepromptComponent_Template_input_ngModelChange_25_listener($event) { return ctx.masterPassword = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](26, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](27, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](28, "div", 12);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](29, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](30, "button", 13);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("click", function PasswordRepromptComponent_Template_button_click_30_listener() { return ctx.togglePassword(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](31, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](32, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](33, "i", 14);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](34, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](35, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](36, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](37, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](38, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](39, "div", 15);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](40);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](41, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](42, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](43, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](44, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](45, "div", 16);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](46, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](47, "button", 17);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](48, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](49, "span");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](50);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](51, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](52, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](53, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](54, "button", 18);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](55);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](56, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](57, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](58, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](59, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](60, "\n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](61, "\n");
+ } if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](12);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](13, 9, "passwordConfirmation"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](23, 11, "masterPass"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate"]("type", ctx.showPassword ? "text" : "password");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngModel", ctx.masterPassword);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate"]("appA11yTitle", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](31, 13, "toggleVisibility"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngClass", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpureFunction2"](21, _c0, !ctx.showPassword, ctx.showPassword));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate1"]("\n ", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](41, 15, "passwordConfirmationDesc"), "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](51, 17, "ok"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate1"]("\n ", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](56, 19, "cancel"), "\n ");
+ } }, directives: [_angular_forms__WEBPACK_IMPORTED_MODULE_2__["ɵangular_packages_forms_forms_ba"], _angular_forms__WEBPACK_IMPORTED_MODULE_2__["NgControlStatusGroup"], _angular_forms__WEBPACK_IMPORTED_MODULE_2__["NgForm"], jslib_angular_directives_box_row_directive__WEBPACK_IMPORTED_MODULE_3__["BoxRowDirective"], _angular_forms__WEBPACK_IMPORTED_MODULE_2__["DefaultValueAccessor"], _angular_forms__WEBPACK_IMPORTED_MODULE_2__["RequiredValidator"], jslib_angular_directives_autofocus_directive__WEBPACK_IMPORTED_MODULE_4__["AutofocusDirective"], _angular_forms__WEBPACK_IMPORTED_MODULE_2__["NgControlStatus"], _angular_forms__WEBPACK_IMPORTED_MODULE_2__["NgModel"], jslib_angular_directives_stop_click_directive__WEBPACK_IMPORTED_MODULE_5__["StopClickDirective"], jslib_angular_directives_blur_click_directive__WEBPACK_IMPORTED_MODULE_6__["BlurClickDirective"], jslib_angular_directives_a11y_title_directive__WEBPACK_IMPORTED_MODULE_7__["A11yTitleDirective"], _angular_common__WEBPACK_IMPORTED_MODULE_8__["NgClass"]], pipes: [jslib_angular_pipes_i18n_pipe__WEBPACK_IMPORTED_MODULE_9__["I18nPipe"]], encapsulation: 2 });
+const ɵPasswordRepromptComponent_BaseFactory = /*@__PURE__*/ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵgetInheritedFactory"](PasswordRepromptComponent);
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](PasswordRepromptComponent, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Component"],
+ args: [{
+ templateUrl: 'password-reprompt.component.html',
+ }]
+ }], null, null); })();
+
+
+/***/ }),
+
+/***/ "./src/popup/components/pop-out.component.ts":
+/*!***************************************************!*\
+ !*** ./src/popup/components/pop-out.component.ts ***!
+ \***************************************************/
+/*! exports provided: PopOutComponent */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PopOutComponent", function() { return PopOutComponent; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! jslib-common/abstractions/platformUtils.service */ "./jslib/common/src/abstractions/platformUtils.service.ts");
+/* harmony import */ var _services_popup_utils_service__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../services/popup-utils.service */ "./src/popup/services/popup-utils.service.ts");
+/* harmony import */ var jslib_angular_directives_a11y_title_directive__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! jslib-angular/directives/a11y-title.directive */ "./jslib/angular/src/directives/a11y-title.directive.ts");
+/* harmony import */ var jslib_angular_pipes_i18n_pipe__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! jslib-angular/pipes/i18n.pipe */ "./jslib/angular/src/pipes/i18n.pipe.ts");
+
+
+
+
+
+
+
+
+class PopOutComponent {
+ constructor(platformUtilsService, popupUtilsService) {
+ this.platformUtilsService = platformUtilsService;
+ this.popupUtilsService = popupUtilsService;
+ this.show = true;
+ }
+ ngOnInit() {
+ if (this.show) {
+ if (this.popupUtilsService.inSidebar(window) && this.platformUtilsService.isFirefox()) {
+ this.show = false;
+ }
+ }
+ }
+ expand() {
+ this.popupUtilsService.popOut(window);
+ }
+}
+PopOutComponent.ɵfac = function PopOutComponent_Factory(t) { return new (t || PopOutComponent)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_1__["PlatformUtilsService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_services_popup_utils_service__WEBPACK_IMPORTED_MODULE_2__["PopupUtilsService"])); };
+PopOutComponent.ɵcmp = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineComponent"]({ type: PopOutComponent, selectors: [["app-pop-out"]], inputs: { show: "show" }, decls: 9, vars: 3, consts: [["type", "button", 3, "appA11yTitle", "click"], ["aria-hidden", "true", 1, "fa", "fa-external-link", "fa-rotate-270", "fa-lg", "fa-fw"]], template: function PopOutComponent_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementContainerStart"](0);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](2, "button", 0);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("click", function PopOutComponent_Template_button_click_2_listener() { return ctx.expand(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](3, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](4, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](5, "i", 1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](6, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](7, "\n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementContainerEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](8, "\n");
+ } if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate"]("appA11yTitle", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](3, 1, "popOutNewWindow"));
+ } }, directives: [jslib_angular_directives_a11y_title_directive__WEBPACK_IMPORTED_MODULE_3__["A11yTitleDirective"]], pipes: [jslib_angular_pipes_i18n_pipe__WEBPACK_IMPORTED_MODULE_4__["I18nPipe"]], encapsulation: 2 });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](PopOutComponent, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Component"],
+ args: [{
+ selector: 'app-pop-out',
+ templateUrl: 'pop-out.component.html',
+ }]
+ }], function () { return [{ type: jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_1__["PlatformUtilsService"] }, { type: _services_popup_utils_service__WEBPACK_IMPORTED_MODULE_2__["PopupUtilsService"] }]; }, { show: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"]
+ }] }); })();
+
+
+/***/ }),
+
+/***/ "./src/popup/components/send-list.component.ts":
+/*!*****************************************************!*\
+ !*** ./src/popup/components/send-list.component.ts ***!
+ \*****************************************************/
+/*! exports provided: SendListComponent */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SendListComponent", function() { return SendListComponent; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var jslib_common_enums_sendType__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! jslib-common/enums/sendType */ "./jslib/common/src/enums/sendType.ts");
+/* harmony import */ var _angular_common__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @angular/common */ "./node_modules/@angular/common/__ivy_ngcc__/fesm2015/common.js");
+/* harmony import */ var jslib_angular_directives_stop_click_directive__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! jslib-angular/directives/stop-click.directive */ "./jslib/angular/src/directives/stop-click.directive.ts");
+/* harmony import */ var jslib_angular_directives_stop_prop_directive__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! jslib-angular/directives/stop-prop.directive */ "./jslib/angular/src/directives/stop-prop.directive.ts");
+/* harmony import */ var jslib_angular_directives_a11y_title_directive__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! jslib-angular/directives/a11y-title.directive */ "./jslib/angular/src/directives/a11y-title.directive.ts");
+/* harmony import */ var jslib_angular_pipes_i18n_pipe__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! jslib-angular/pipes/i18n.pipe */ "./jslib/angular/src/pipes/i18n.pipe.ts");
+
+
+
+
+
+
+
+
+function SendListComponent_button_0_i_8_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](0, "i", 16);
+} }
+function SendListComponent_button_0_i_10_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](0, "i", 17);
+} }
+function SendListComponent_button_0_ng_container_18_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementContainerStart"](0);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](2, "i", 18);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](3, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](4, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](5, "span", 19);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](7, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](8, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementContainerEnd"]();
+} if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate"]("title", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](3, 2, "disabled"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](7, 4, "disabled"));
+} }
+function SendListComponent_button_0_ng_container_20_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementContainerStart"](0);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](2, "i", 20);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](3, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](4, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](5, "span", 19);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](7, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](8, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementContainerEnd"]();
+} if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate"]("title", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](3, 2, "passwordProtected"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](7, 4, "passwordProtected"));
+} }
+function SendListComponent_button_0_ng_container_22_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementContainerStart"](0);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](2, "i", 21);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](3, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](4, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](5, "span", 19);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](7, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](8, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementContainerEnd"]();
+} if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate"]("title", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](3, 2, "maxAccessCountReached"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](7, 4, "maxAccessCountReached"));
+} }
+function SendListComponent_button_0_ng_container_24_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementContainerStart"](0);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](2, "i", 22);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](3, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](4, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](5, "span", 19);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](7, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](8, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementContainerEnd"]();
+} if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate"]("title", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](3, 2, "expired"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](7, 4, "expired"));
+} }
+function SendListComponent_button_0_ng_container_26_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementContainerStart"](0);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](2, "i", 23);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](3, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](4, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](5, "span", 19);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](7, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](8, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementContainerEnd"]();
+} if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate"]("title", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](3, 2, "pendingDeletion"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](7, 4, "pendingDeletion"));
+} }
+const _c0 = function (a0) { return { "disabled": a0 }; };
+function SendListComponent_button_0_span_43_Template(rf, ctx) { if (rf & 1) {
+ const _r12 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "span", 24);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("click", function SendListComponent_button_0_span_43_Template_span_click_0_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r12); const s_r1 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"]().$implicit; const ctx_r10 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](); return ctx_r10.removePassword(s_r1); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](1, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](2, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](3, "i", 25);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](4, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r9 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate"]("appA11yTitle", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](1, 2, "removePassword"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngClass", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpureFunction1"](4, _c0, ctx_r9.disabledByPolicy));
+} }
+function SendListComponent_button_0_Template(rf, ctx) { if (rf & 1) {
+ const _r14 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "button", 1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("click", function SendListComponent_button_0_Template_button_click_0_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r14); const s_r1 = ctx.$implicit; const ctx_r13 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](); return ctx_r13.selectSend(s_r1); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](2, "div", 2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](4, "div", 3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](6, "div", 4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](8, SendListComponent_button_0_i_8_Template, 1, 0, "i", 5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](9, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](10, SendListComponent_button_0_i_10_Template, 1, 0, "i", 6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](11, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](12, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](13, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](14, "div", 7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](15, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](16, "span", 8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](17);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](18, SendListComponent_button_0_ng_container_18_Template, 9, 6, "ng-container", 9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](19, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](20, SendListComponent_button_0_ng_container_20_Template, 9, 6, "ng-container", 9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](21, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](22, SendListComponent_button_0_ng_container_22_Template, 9, 6, "ng-container", 9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](23, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](24, SendListComponent_button_0_ng_container_24_Template, 9, 6, "ng-container", 9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](25, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](26, SendListComponent_button_0_ng_container_26_Template, 9, 6, "ng-container", 9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](27, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](28, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](29, "span", 10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](30);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](31, "date");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](32, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](33, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](34, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](35, "div", 11);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](36, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](37, "span", 12);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("click", function SendListComponent_button_0_Template_span_click_37_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r14); const s_r1 = ctx.$implicit; const ctx_r15 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](); return ctx_r15.copySendLink(s_r1); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](38, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](39, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](40, "i", 13);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](41, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](42, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](43, SendListComponent_button_0_span_43_Template, 5, 6, "span", 14);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](44, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](45, "span", 12);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("click", function SendListComponent_button_0_Template_span_click_45_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r14); const s_r1 = ctx.$implicit; const ctx_r16 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](); return ctx_r16.delete(s_r1); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](46, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](47, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](48, "i", 15);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](49, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](50, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](51, "\n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const s_r1 = ctx.$implicit;
+ const ctx_r0 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate2"]("title", "", ctx_r0.title, " - ", s_r1.name, "");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", s_r1.type === ctx_r0.sendType.Text);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", s_r1.type === ctx_r0.sendType.File);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate1"]("\n ", s_r1.name, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", s_r1.disabled);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", s_r1.password);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", s_r1.maxAccessCountReached);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", s_r1.expired);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", s_r1.pendingDelete);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind2"](31, 14, s_r1.deletionDate, "medium"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate"]("appA11yTitle", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](38, 17, "copySendLink"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", s_r1.password);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate"]("appA11yTitle", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](46, 19, "delete"));
+} }
+class SendListComponent {
+ constructor() {
+ this.disabledByPolicy = false;
+ this.onSelected = new _angular_core__WEBPACK_IMPORTED_MODULE_0__["EventEmitter"]();
+ this.onCopySendLink = new _angular_core__WEBPACK_IMPORTED_MODULE_0__["EventEmitter"]();
+ this.onRemovePassword = new _angular_core__WEBPACK_IMPORTED_MODULE_0__["EventEmitter"]();
+ this.onDeleteSend = new _angular_core__WEBPACK_IMPORTED_MODULE_0__["EventEmitter"]();
+ this.sendType = jslib_common_enums_sendType__WEBPACK_IMPORTED_MODULE_1__["SendType"];
+ }
+ selectSend(s) {
+ this.onSelected.emit(s);
+ }
+ copySendLink(s) {
+ this.onCopySendLink.emit(s);
+ }
+ removePassword(s) {
+ this.onRemovePassword.emit(s);
+ }
+ delete(s) {
+ this.onDeleteSend.emit(s);
+ }
+}
+SendListComponent.ɵfac = function SendListComponent_Factory(t) { return new (t || SendListComponent)(); };
+SendListComponent.ɵcmp = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineComponent"]({ type: SendListComponent, selectors: [["app-send-list"]], inputs: { sends: "sends", title: "title", disabledByPolicy: "disabledByPolicy" }, outputs: { onSelected: "onSelected", onCopySendLink: "onCopySendLink", onRemovePassword: "onRemovePassword", onDeleteSend: "onDeleteSend" }, decls: 2, vars: 1, consts: [["type", "button", "appStopClick", "", "class", "box-content-row box-content-row-flex", 3, "title", "click", 4, "ngFor", "ngForOf"], ["type", "button", "appStopClick", "", 1, "box-content-row", "box-content-row-flex", 3, "title", "click"], [1, "row-main"], [1, "app-vault-icon"], ["aria-hidden", "true", 1, "icon"], ["class", "fa fa-fw fa-lg fa-file-text-o", 4, "ngIf"], ["class", "fa fa-fw fa-lg fa-file-o", 4, "ngIf"], [1, "row-main-content"], [1, "text"], [4, "ngIf"], [1, "detail"], [1, "action-buttons"], ["appStopClick", "", "appStopProp", "", 1, "row-btn", 3, "appA11yTitle", "click"], ["aria-hidden", "true", 1, "fa", "fa-lg", "fa-copy"], ["class", "row-btn", "appStopClick", "", "appStopProp", "", 3, "ngClass", "appA11yTitle", "click", 4, "ngIf"], ["aria-hidden", "true", 1, "fa", "fa-lg", "fa-trash-o"], [1, "fa", "fa-fw", "fa-lg", "fa-file-text-o"], [1, "fa", "fa-fw", "fa-lg", "fa-file-o"], ["aria-hidden", "true", 1, "fa", "fa-warning", "text-muted", 3, "title"], [1, "sr-only"], ["aria-hidden", "true", 1, "fa", "fa-key", "text-muted", 3, "title"], ["aria-hidden", "true", 1, "fa", "fa-ban", "text-muted", 3, "title"], ["aria-hidden", "true", 1, "fa", "fa-clock-o", "text-muted", 3, "title"], ["aria-hidden", "true", 1, "fa", "fa-trash", "text-muted", 3, "title"], ["appStopClick", "", "appStopProp", "", 1, "row-btn", 3, "ngClass", "appA11yTitle", "click"], ["aria-hidden", "true", 1, "fa", "fa-lg", "fa-undo"]], template: function SendListComponent_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](0, SendListComponent_button_0_Template, 52, 21, "button", 0);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "\n");
+ } if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngForOf", ctx.sends);
+ } }, directives: [_angular_common__WEBPACK_IMPORTED_MODULE_2__["NgForOf"], jslib_angular_directives_stop_click_directive__WEBPACK_IMPORTED_MODULE_3__["StopClickDirective"], _angular_common__WEBPACK_IMPORTED_MODULE_2__["NgIf"], jslib_angular_directives_stop_prop_directive__WEBPACK_IMPORTED_MODULE_4__["StopPropDirective"], jslib_angular_directives_a11y_title_directive__WEBPACK_IMPORTED_MODULE_5__["A11yTitleDirective"], _angular_common__WEBPACK_IMPORTED_MODULE_2__["NgClass"]], pipes: [_angular_common__WEBPACK_IMPORTED_MODULE_2__["DatePipe"], jslib_angular_pipes_i18n_pipe__WEBPACK_IMPORTED_MODULE_6__["I18nPipe"]], encapsulation: 2 });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](SendListComponent, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Component"],
+ args: [{
+ selector: 'app-send-list',
+ templateUrl: 'send-list.component.html',
+ }]
+ }], null, { sends: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"]
+ }], title: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"]
+ }], disabledByPolicy: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"]
+ }], onSelected: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Output"]
+ }], onCopySendLink: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Output"]
+ }], onRemovePassword: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Output"]
+ }], onDeleteSend: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Output"]
+ }] }); })();
+
+
+/***/ }),
+
+/***/ "./src/popup/components/set-pin.component.ts":
+/*!***************************************************!*\
+ !*** ./src/popup/components/set-pin.component.ts ***!
+ \***************************************************/
+/*! exports provided: SetPinComponent */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SetPinComponent", function() { return SetPinComponent; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var jslib_angular_components_set_pin_component__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! jslib-angular/components/set-pin.component */ "./jslib/angular/src/components/set-pin.component.ts");
+/* harmony import */ var _angular_forms__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @angular/forms */ "./node_modules/@angular/forms/__ivy_ngcc__/fesm2015/forms.js");
+/* harmony import */ var jslib_angular_directives_box_row_directive__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! jslib-angular/directives/box-row.directive */ "./jslib/angular/src/directives/box-row.directive.ts");
+/* harmony import */ var jslib_angular_directives_input_verbatim_directive__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! jslib-angular/directives/input-verbatim.directive */ "./jslib/angular/src/directives/input-verbatim.directive.ts");
+/* harmony import */ var jslib_angular_directives_stop_click_directive__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! jslib-angular/directives/stop-click.directive */ "./jslib/angular/src/directives/stop-click.directive.ts");
+/* harmony import */ var jslib_angular_directives_blur_click_directive__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! jslib-angular/directives/blur-click.directive */ "./jslib/angular/src/directives/blur-click.directive.ts");
+/* harmony import */ var jslib_angular_directives_a11y_title_directive__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! jslib-angular/directives/a11y-title.directive */ "./jslib/angular/src/directives/a11y-title.directive.ts");
+/* harmony import */ var _angular_common__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @angular/common */ "./node_modules/@angular/common/__ivy_ngcc__/fesm2015/common.js");
+/* harmony import */ var jslib_angular_pipes_i18n_pipe__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! jslib-angular/pipes/i18n.pipe */ "./jslib/angular/src/pipes/i18n.pipe.ts");
+
+
+
+
+
+
+
+
+
+
+
+const _c0 = function (a0, a1) { return { "fa-eye": a0, "fa-eye-slash": a1 }; };
+class SetPinComponent extends jslib_angular_components_set_pin_component__WEBPACK_IMPORTED_MODULE_1__["SetPinComponent"] {
+}
+SetPinComponent.ɵfac = function SetPinComponent_Factory(t) { return ɵSetPinComponent_BaseFactory(t || SetPinComponent); };
+SetPinComponent.ɵcmp = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineComponent"]({ type: SetPinComponent, selectors: [["ng-component"]], features: [_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵInheritDefinitionFeature"]], decls: 70, vars: 25, consts: [["role", "dialog", "aria-modal", "true", 1, "modal", "fade"], ["role", "document", 1, "modal-dialog", "modal-dialog-scrollable"], [1, "modal-content", 3, "ngSubmit"], ["form", ""], [1, "modal-body"], [1, "box"], [1, "box-content"], ["appBoxRow", "", 1, "box-content-row", "box-content-row-flex"], [1, "row-main"], ["for", "pin"], ["id", "pin", "name", "Pin", "required", "", "appInputVerbatim", "", 1, "monospaced", 3, "type", "ngModel", "ngModelChange"], [1, "action-buttons"], ["type", "button", "appStopClick", "", "appBlurClick", "", 1, "row-btn", 3, "appA11yTitle", "click"], ["aria-hidden", "true", 1, "fa", "fa-lg", 3, "ngClass"], [1, "checkbox"], ["for", "masterPasswordOnRestart"], ["type", "checkbox", "id", "masterPasswordOnRestart", "name", "MasterPasswordOnRestart", 3, "ngModel", "ngModelChange"], [1, "modal-footer"], ["type", "submit", "appBlurClick", "", 1, "btn", "btn-primary", "btn-submit"], ["type", "button", "data-dismiss", "modal", 1, "btn", "btn-outline-secondary"]], template: function SetPinComponent_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "div", 0);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](2, "div", 1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](4, "form", 2, 3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("ngSubmit", function SetPinComponent_Template_form_ngSubmit_4_listener() { return ctx.submit(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](6, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](7, "div", 4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](8, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](9, "div");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](11, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](12, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](13, "div", 5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](14, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](15, "div", 6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](16, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](17, "div", 7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](18, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](19, "div", 8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](20, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](21, "label", 9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](22);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](23, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](24, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](25, "input", 10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("ngModelChange", function SetPinComponent_Template_input_ngModelChange_25_listener($event) { return ctx.pin = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](26, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](27, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](28, "div", 11);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](29, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](30, "button", 12);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("click", function SetPinComponent_Template_button_click_30_listener() { return ctx.toggleVisibility(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](31, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](32, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](33, "i", 13);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](34, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](35, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](36, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](37, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](38, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](39, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](40, "div", 14);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](41, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](42, "label", 15);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](43, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](44, "input", 16);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("ngModelChange", function SetPinComponent_Template_input_ngModelChange_44_listener($event) { return ctx.masterPassOnRestart = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](45, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](46, "span");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](47);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](48, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](49, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](50, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](51, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](52, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](53, "div", 17);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](54, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](55, "button", 18);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](56, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](57, "span");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](58);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](59, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](60, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](61, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](62, "button", 19);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](63);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](64, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](65, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](66, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](67, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](68, "\n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](69, "\n");
+ } if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate1"]("\n ", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](11, 10, "setYourPinCode"), "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](12);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](23, 12, "pin"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate"]("type", ctx.showPin ? "text" : "password");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngModel", ctx.pin);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate"]("appA11yTitle", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](31, 14, "toggleVisibility"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngClass", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpureFunction2"](22, _c0, !ctx.showPin, ctx.showPin));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](11);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngModel", ctx.masterPassOnRestart);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](48, 16, "lockWithMasterPassOnRestart"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](11);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](59, 18, "ok"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate1"]("\n ", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](64, 20, "cancel"), "\n ");
+ } }, directives: [_angular_forms__WEBPACK_IMPORTED_MODULE_2__["ɵangular_packages_forms_forms_ba"], _angular_forms__WEBPACK_IMPORTED_MODULE_2__["NgControlStatusGroup"], _angular_forms__WEBPACK_IMPORTED_MODULE_2__["NgForm"], jslib_angular_directives_box_row_directive__WEBPACK_IMPORTED_MODULE_3__["BoxRowDirective"], _angular_forms__WEBPACK_IMPORTED_MODULE_2__["DefaultValueAccessor"], _angular_forms__WEBPACK_IMPORTED_MODULE_2__["RequiredValidator"], jslib_angular_directives_input_verbatim_directive__WEBPACK_IMPORTED_MODULE_4__["InputVerbatimDirective"], _angular_forms__WEBPACK_IMPORTED_MODULE_2__["NgControlStatus"], _angular_forms__WEBPACK_IMPORTED_MODULE_2__["NgModel"], jslib_angular_directives_stop_click_directive__WEBPACK_IMPORTED_MODULE_5__["StopClickDirective"], jslib_angular_directives_blur_click_directive__WEBPACK_IMPORTED_MODULE_6__["BlurClickDirective"], jslib_angular_directives_a11y_title_directive__WEBPACK_IMPORTED_MODULE_7__["A11yTitleDirective"], _angular_common__WEBPACK_IMPORTED_MODULE_8__["NgClass"], _angular_forms__WEBPACK_IMPORTED_MODULE_2__["CheckboxControlValueAccessor"]], pipes: [jslib_angular_pipes_i18n_pipe__WEBPACK_IMPORTED_MODULE_9__["I18nPipe"]], encapsulation: 2 });
+const ɵSetPinComponent_BaseFactory = /*@__PURE__*/ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵgetInheritedFactory"](SetPinComponent);
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](SetPinComponent, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Component"],
+ args: [{
+ templateUrl: 'set-pin.component.html',
+ }]
+ }], null, null); })();
+
+
+/***/ }),
+
+/***/ "./src/popup/generator/password-generator-history.component.ts":
+/*!*********************************************************************!*\
+ !*** ./src/popup/generator/password-generator-history.component.ts ***!
+ \*********************************************************************/
+/*! exports provided: PasswordGeneratorHistoryComponent */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PasswordGeneratorHistoryComponent", function() { return PasswordGeneratorHistoryComponent; });
+/* harmony import */ var _angular_common__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/common */ "./node_modules/@angular/common/__ivy_ngcc__/fesm2015/common.js");
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! jslib-common/abstractions/i18n.service */ "./jslib/common/src/abstractions/i18n.service.ts");
+/* harmony import */ var jslib_common_abstractions_passwordGeneration_service__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! jslib-common/abstractions/passwordGeneration.service */ "./jslib/common/src/abstractions/passwordGeneration.service.ts");
+/* harmony import */ var jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! jslib-common/abstractions/platformUtils.service */ "./jslib/common/src/abstractions/platformUtils.service.ts");
+/* harmony import */ var jslib_angular_components_password_generator_history_component__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! jslib-angular/components/password-generator-history.component */ "./jslib/angular/src/components/password-generator-history.component.ts");
+/* harmony import */ var jslib_angular_directives_blur_click_directive__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! jslib-angular/directives/blur-click.directive */ "./jslib/angular/src/directives/blur-click.directive.ts");
+/* harmony import */ var jslib_angular_directives_select_copy_directive__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! jslib-angular/directives/select-copy.directive */ "./jslib/angular/src/directives/select-copy.directive.ts");
+/* harmony import */ var jslib_angular_directives_stop_click_directive__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! jslib-angular/directives/stop-click.directive */ "./jslib/angular/src/directives/stop-click.directive.ts");
+/* harmony import */ var jslib_angular_directives_a11y_title_directive__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! jslib-angular/directives/a11y-title.directive */ "./jslib/angular/src/directives/a11y-title.directive.ts");
+/* harmony import */ var jslib_angular_pipes_i18n_pipe__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! jslib-angular/pipes/i18n.pipe */ "./jslib/angular/src/pipes/i18n.pipe.ts");
+/* harmony import */ var jslib_angular_pipes_color_password_pipe__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! jslib-angular/pipes/color-password.pipe */ "./jslib/angular/src/pipes/color-password.pipe.ts");
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+function PasswordGeneratorHistoryComponent_div_32_div_4_Template(rf, ctx) { if (rf & 1) {
+ const _r5 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "div", 12);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "div", 13);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](4, "div", 14);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](6, "div", 15);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](7, "colorPassword");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](8, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](9, "span", 16);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](11, "date");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](12, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](13, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](14, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](15, "div", 17);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](16, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](17, "button", 18);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("click", function PasswordGeneratorHistoryComponent_div_32_div_4_Template_button_click_17_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r5); const h_r3 = ctx.$implicit; const ctx_r4 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](2); return ctx_r4.copy(h_r3.password); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](18, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](19, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](20, "i", 19);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](21, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](22, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](23, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const h_r3 = ctx.$implicit;
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("innerHTML", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](7, 3, h_r3.password), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵsanitizeHtml"]);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind2"](11, 5, h_r3.date, "medium"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpropertyInterpolate"]("appA11yTitle", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](18, 8, "copyPassword"));
+} }
+function PasswordGeneratorHistoryComponent_div_32_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "div", 9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "div", 10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](4, PasswordGeneratorHistoryComponent_div_32_div_4_Template, 24, 10, "div", 11);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](6, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r0 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngForOf", ctx_r0.history);
+} }
+function PasswordGeneratorHistoryComponent_div_34_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "div", 20);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "p");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](4, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](4, 1, "noPasswordsInList"));
+} }
+class PasswordGeneratorHistoryComponent extends jslib_angular_components_password_generator_history_component__WEBPACK_IMPORTED_MODULE_5__["PasswordGeneratorHistoryComponent"] {
+ constructor(passwordGenerationService, platformUtilsService, i18nService, location) {
+ super(passwordGenerationService, platformUtilsService, i18nService, window);
+ this.location = location;
+ }
+ close() {
+ this.location.back();
+ }
+}
+PasswordGeneratorHistoryComponent.ɵfac = function PasswordGeneratorHistoryComponent_Factory(t) { return new (t || PasswordGeneratorHistoryComponent)(_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](jslib_common_abstractions_passwordGeneration_service__WEBPACK_IMPORTED_MODULE_3__["PasswordGenerationService"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_4__["PlatformUtilsService"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_2__["I18nService"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](_angular_common__WEBPACK_IMPORTED_MODULE_0__["Location"])); };
+PasswordGeneratorHistoryComponent.ɵcmp = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdefineComponent"]({ type: PasswordGeneratorHistoryComponent, selectors: [["app-password-generator-history"]], features: [_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵInheritDefinitionFeature"]], decls: 37, vars: 11, consts: [[1, "left"], ["type", "button", "appBlurClick", "", "type", "button", 3, "click"], ["aria-hidden", "true", 1, "header-icon"], [1, "fa", "fa-chevron-left"], [1, "center"], [1, "title"], [1, "right"], ["class", "box list full-list", 4, "ngIf"], ["class", "no-items", 4, "ngIf"], [1, "box", "list", "full-list"], [1, "box-content"], ["class", "box-content-row box-content-row-flex", 4, "ngFor", "ngForOf"], [1, "box-content-row", "box-content-row-flex"], [1, "row-main"], [1, "row-main-content"], ["appSelectCopy", "", 1, "monospaced", "password-wrapper", 3, "innerHTML"], [1, "detail"], [1, "action-buttons"], ["type", "button", "appStopClick", "", 1, "row-btn", 3, "appA11yTitle", "click"], ["aria-hidden", "true", 1, "fa", "fa-lg", "fa-clone"], [1, "no-items"]], template: function PasswordGeneratorHistoryComponent_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "header");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "div", 0);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](4, "button", 1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("click", function PasswordGeneratorHistoryComponent_Template_button_click_4_listener() { return ctx.close(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](6, "span", 2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](7, "i", 3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](8, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](9, "span");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](11, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](12, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](13, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](14, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](15, "div", 4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](16, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](17, "span", 5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](18);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](19, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](20, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](21, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](22, "div", 6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](23, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](24, "button", 1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("click", function PasswordGeneratorHistoryComponent_Template_button_click_24_listener() { return ctx.clear(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](25);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](26, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](27, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](28, "\n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](29, "\n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](30, "content");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](31, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](32, PasswordGeneratorHistoryComponent_div_32_Template, 7, 1, "div", 7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](33, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](34, PasswordGeneratorHistoryComponent_div_34_Template, 6, 3, "div", 8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](35, "\n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](36, "\n");
+ } if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](11, 5, "back"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](19, 7, "passwordHistory"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate1"]("\n ", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](26, 9, "clear"), "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx.history && ctx.history.length);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", !ctx.history || !ctx.history.length);
+ } }, directives: [jslib_angular_directives_blur_click_directive__WEBPACK_IMPORTED_MODULE_6__["BlurClickDirective"], _angular_common__WEBPACK_IMPORTED_MODULE_0__["NgIf"], _angular_common__WEBPACK_IMPORTED_MODULE_0__["NgForOf"], jslib_angular_directives_select_copy_directive__WEBPACK_IMPORTED_MODULE_7__["SelectCopyDirective"], jslib_angular_directives_stop_click_directive__WEBPACK_IMPORTED_MODULE_8__["StopClickDirective"], jslib_angular_directives_a11y_title_directive__WEBPACK_IMPORTED_MODULE_9__["A11yTitleDirective"]], pipes: [jslib_angular_pipes_i18n_pipe__WEBPACK_IMPORTED_MODULE_10__["I18nPipe"], jslib_angular_pipes_color_password_pipe__WEBPACK_IMPORTED_MODULE_11__["ColorPasswordPipe"], _angular_common__WEBPACK_IMPORTED_MODULE_0__["DatePipe"]], encapsulation: 2 });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵsetClassMetadata"](PasswordGeneratorHistoryComponent, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Component"],
+ args: [{
+ selector: 'app-password-generator-history',
+ templateUrl: 'password-generator-history.component.html',
+ }]
+ }], function () { return [{ type: jslib_common_abstractions_passwordGeneration_service__WEBPACK_IMPORTED_MODULE_3__["PasswordGenerationService"] }, { type: jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_4__["PlatformUtilsService"] }, { type: jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_2__["I18nService"] }, { type: _angular_common__WEBPACK_IMPORTED_MODULE_0__["Location"] }]; }, null); })();
+
+
+/***/ }),
+
+/***/ "./src/popup/generator/password-generator.component.ts":
+/*!*************************************************************!*\
+ !*** ./src/popup/generator/password-generator.component.ts ***!
+ \*************************************************************/
+/*! exports provided: PasswordGeneratorComponent */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PasswordGeneratorComponent", function() { return PasswordGeneratorComponent; });
+/* harmony import */ var _angular_common__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/common */ "./node_modules/@angular/common/__ivy_ngcc__/fesm2015/common.js");
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! jslib-common/abstractions/i18n.service */ "./jslib/common/src/abstractions/i18n.service.ts");
+/* harmony import */ var jslib_common_abstractions_passwordGeneration_service__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! jslib-common/abstractions/passwordGeneration.service */ "./jslib/common/src/abstractions/passwordGeneration.service.ts");
+/* harmony import */ var jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! jslib-common/abstractions/platformUtils.service */ "./jslib/common/src/abstractions/platformUtils.service.ts");
+/* harmony import */ var jslib_common_abstractions_state_service__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! jslib-common/abstractions/state.service */ "./jslib/common/src/abstractions/state.service.ts");
+/* harmony import */ var jslib_angular_components_password_generator_component__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! jslib-angular/components/password-generator.component */ "./jslib/angular/src/components/password-generator.component.ts");
+/* harmony import */ var _components_pop_out_component__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../components/pop-out.component */ "./src/popup/components/pop-out.component.ts");
+/* harmony import */ var jslib_angular_directives_select_copy_directive__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! jslib-angular/directives/select-copy.directive */ "./jslib/angular/src/directives/select-copy.directive.ts");
+/* harmony import */ var jslib_angular_directives_stop_click_directive__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! jslib-angular/directives/stop-click.directive */ "./jslib/angular/src/directives/stop-click.directive.ts");
+/* harmony import */ var jslib_angular_directives_blur_click_directive__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! jslib-angular/directives/blur-click.directive */ "./jslib/angular/src/directives/blur-click.directive.ts");
+/* harmony import */ var _angular_router__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @angular/router */ "./node_modules/@angular/router/__ivy_ngcc__/fesm2015/router.js");
+/* harmony import */ var jslib_angular_components_callout_component__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! jslib-angular/components/callout.component */ "./jslib/angular/src/components/callout.component.ts");
+/* harmony import */ var jslib_angular_directives_box_row_directive__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! jslib-angular/directives/box-row.directive */ "./jslib/angular/src/directives/box-row.directive.ts");
+/* harmony import */ var _angular_forms__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @angular/forms */ "./node_modules/@angular/forms/__ivy_ngcc__/fesm2015/forms.js");
+/* harmony import */ var jslib_angular_pipes_i18n_pipe__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! jslib-angular/pipes/i18n.pipe */ "./jslib/angular/src/pipes/i18n.pipe.ts");
+/* harmony import */ var jslib_angular_pipes_color_password_pipe__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! jslib-angular/pipes/color-password.pipe */ "./jslib/angular/src/pipes/color-password.pipe.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+function PasswordGeneratorComponent_button_6_Template(rf, ctx) { if (rf & 1) {
+ const _r7 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "button", 23);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("click", function PasswordGeneratorComponent_button_6_Template_button_click_0_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r7); const ctx_r6 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](); return ctx_r6.close(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](2, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](2, 1, "cancel"));
+} }
+function PasswordGeneratorComponent_button_18_Template(rf, ctx) { if (rf & 1) {
+ const _r9 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "button", 23);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("click", function PasswordGeneratorComponent_button_18_Template_button_click_0_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r9); const ctx_r8 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](); return ctx_r8.select(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](2, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](2, 1, "select"));
+} }
+function PasswordGeneratorComponent_app_callout_24_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "app-callout", 24);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](2, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate1"]("\n ", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](2, 1, "passwordGeneratorPolicyInEffect"), "\n ");
+} }
+function PasswordGeneratorComponent_div_75_Template(rf, ctx) { if (rf & 1) {
+ const _r12 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "div", 25);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "input", 26);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("ngModelChange", function PasswordGeneratorComponent_div_75_Template_input_ngModelChange_2_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r12); const ctx_r11 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](); return ctx_r11.options.type = $event; })("change", function PasswordGeneratorComponent_div_75_Template_input_change_2_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r12); const ctx_r13 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](); return ctx_r13.saveOptions(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](4, "label", 27);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](6, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const o_r10 = ctx.$implicit;
+ const ctx_r3 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpropertyInterpolate1"]("name", "Type_", o_r10.value, "");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpropertyInterpolate1"]("id", "type_", o_r10.value, "");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngModel", ctx_r3.options.type)("value", o_r10.value)("checked", ctx_r3.options.type === o_r10.value);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpropertyInterpolate1"]("for", "type_", o_r10.value, "");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate1"]("\n ", o_r10.name, "\n ");
+} }
+function PasswordGeneratorComponent_div_80_Template(rf, ctx) { if (rf & 1) {
+ const _r15 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "div", 15);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "div", 17);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](4, "div", 28);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](6, "label", 29);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](8, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](9, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](10, "input", 30);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("change", function PasswordGeneratorComponent_div_80_Template_input_change_10_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r15); const ctx_r14 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](); return ctx_r14.saveOptions(); })("ngModelChange", function PasswordGeneratorComponent_div_80_Template_input_ngModelChange_10_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r15); const ctx_r16 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](); return ctx_r16.options.numWords = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](11, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](12, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](13, "div", 28);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](14, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](15, "label", 31);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](16);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](17, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](18, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](19, "input", 32);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("input", function PasswordGeneratorComponent_div_80_Template_input_input_19_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r15); const ctx_r17 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](); return ctx_r17.saveOptions(); })("ngModelChange", function PasswordGeneratorComponent_div_80_Template_input_ngModelChange_19_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r15); const ctx_r18 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](); return ctx_r18.options.wordSeparator = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](20, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](21, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](22, "div", 33);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](23, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](24, "label", 34);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](25);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](26, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](27, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](28, "input", 35);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("change", function PasswordGeneratorComponent_div_80_Template_input_change_28_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r15); const ctx_r19 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](); return ctx_r19.saveOptions(); })("ngModelChange", function PasswordGeneratorComponent_div_80_Template_input_ngModelChange_28_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r15); const ctx_r20 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](); return ctx_r20.options.capitalize = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](29, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](30, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](31, "div", 33);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](32, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](33, "label", 36);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](34);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](35, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](36, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](37, "input", 37);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("change", function PasswordGeneratorComponent_div_80_Template_input_change_37_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r15); const ctx_r21 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](); return ctx_r21.saveOptions(); })("ngModelChange", function PasswordGeneratorComponent_div_80_Template_input_ngModelChange_37_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r15); const ctx_r22 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](); return ctx_r22.options.includeNumber = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](38, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](39, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](40, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r4 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](8, 10, "numWords"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngModel", ctx_r4.options.numWords);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](17, 12, "wordSeparator"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngModel", ctx_r4.options.wordSeparator);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](26, 14, "capitalize"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngModel", ctx_r4.options.capitalize)("disabled", ctx_r4.enforcedPolicyOptions == null ? null : ctx_r4.enforcedPolicyOptions.capitalize);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](35, 16, "includeNumber"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngModel", ctx_r4.options.includeNumber)("disabled", ctx_r4.enforcedPolicyOptions == null ? null : ctx_r4.enforcedPolicyOptions.includeNumber);
+} }
+function PasswordGeneratorComponent_ng_container_82_Template(rf, ctx) { if (rf & 1) {
+ const _r24 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementContainerStart"](0);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "div", 15);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](4, "div", 17);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](6, "div", 38);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](8, "label", 39);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](10, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](11, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](12, "input", 40);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("ngModelChange", function PasswordGeneratorComponent_ng_container_82_Template_input_ngModelChange_12_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r24); const ctx_r23 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](); return ctx_r23.options.length = $event; })("change", function PasswordGeneratorComponent_ng_container_82_Template_input_change_12_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r24); const ctx_r25 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](); return ctx_r25.saveOptions(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](13, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](14, "input", 41);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("ngModelChange", function PasswordGeneratorComponent_ng_container_82_Template_input_ngModelChange_14_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r24); const ctx_r26 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](); return ctx_r26.options.length = $event; })("change", function PasswordGeneratorComponent_ng_container_82_Template_input_change_14_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r24); const ctx_r27 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](); return ctx_r27.sliderChanged(); })("input", function PasswordGeneratorComponent_ng_container_82_Template_input_input_14_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r24); const ctx_r28 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](); return ctx_r28.sliderInput(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](15, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](16, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](17, "div", 33);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](18, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](19, "label", 42);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](20, "A-Z");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](21, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](22, "input", 43);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("change", function PasswordGeneratorComponent_ng_container_82_Template_input_change_22_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r24); const ctx_r29 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](); return ctx_r29.saveOptions(); })("ngModelChange", function PasswordGeneratorComponent_ng_container_82_Template_input_ngModelChange_22_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r24); const ctx_r30 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](); return ctx_r30.options.uppercase = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](23, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](24, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](25, "div", 33);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](26, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](27, "label", 44);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](28, "a-z");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](29, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](30, "input", 45);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("change", function PasswordGeneratorComponent_ng_container_82_Template_input_change_30_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r24); const ctx_r31 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](); return ctx_r31.saveOptions(); })("ngModelChange", function PasswordGeneratorComponent_ng_container_82_Template_input_ngModelChange_30_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r24); const ctx_r32 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](); return ctx_r32.options.lowercase = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](31, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](32, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](33, "div", 33);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](34, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](35, "label", 46);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](36, "0-9");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](37, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](38, "input", 47);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("change", function PasswordGeneratorComponent_ng_container_82_Template_input_change_38_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r24); const ctx_r33 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](); return ctx_r33.saveOptions(); })("ngModelChange", function PasswordGeneratorComponent_ng_container_82_Template_input_ngModelChange_38_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r24); const ctx_r34 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](); return ctx_r34.options.number = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](39, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](40, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](41, "div", 33);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](42, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](43, "label", 48);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](44, "!@#$%^&*");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](45, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](46, "input", 49);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("change", function PasswordGeneratorComponent_ng_container_82_Template_input_change_46_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r24); const ctx_r35 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](); return ctx_r35.saveOptions(); })("ngModelChange", function PasswordGeneratorComponent_ng_container_82_Template_input_ngModelChange_46_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r24); const ctx_r36 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](); return ctx_r36.options.special = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](47, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](48, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](49, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](50, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](51, "div", 15);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](52, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](53, "div", 17);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](54, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](55, "div", 28);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](56, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](57, "label", 50);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](58);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](59, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](60, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](61, "input", 51);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("change", function PasswordGeneratorComponent_ng_container_82_Template_input_change_61_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r24); const ctx_r37 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](); return ctx_r37.saveOptions(); })("ngModelChange", function PasswordGeneratorComponent_ng_container_82_Template_input_ngModelChange_61_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r24); const ctx_r38 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](); return ctx_r38.options.minNumber = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](62, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](63, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](64, "div", 28);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](65, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](66, "label", 52);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](67);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](68, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](69, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](70, "input", 53);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("change", function PasswordGeneratorComponent_ng_container_82_Template_input_change_70_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r24); const ctx_r39 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](); return ctx_r39.saveOptions(); })("ngModelChange", function PasswordGeneratorComponent_ng_container_82_Template_input_ngModelChange_70_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r24); const ctx_r40 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](); return ctx_r40.options.minSpecial = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](71, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](72, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](73, "div", 33);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](74, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](75, "label", 54);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](76);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](77, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](78, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](79, "input", 55);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("change", function PasswordGeneratorComponent_ng_container_82_Template_input_change_79_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r24); const ctx_r41 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](); return ctx_r41.saveOptions(); })("ngModelChange", function PasswordGeneratorComponent_ng_container_82_Template_input_ngModelChange_79_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r24); const ctx_r42 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](); return ctx_r42.avoidAmbiguous = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](80, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](81, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](82, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](83, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementContainerEnd"]();
+} if (rf & 2) {
+ const ctx_r5 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](10, 17, "length"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngModel", ctx_r5.options.length);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngModel", ctx_r5.options.length);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("disabled", ctx_r5.enforcedPolicyOptions.useUppercase)("ngModel", ctx_r5.options.uppercase);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("disabled", ctx_r5.enforcedPolicyOptions.useLowercase)("ngModel", ctx_r5.options.lowercase);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("disabled", ctx_r5.enforcedPolicyOptions.useNumbers)("ngModel", ctx_r5.options.number);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("disabled", ctx_r5.enforcedPolicyOptions.useSpecial)("ngModel", ctx_r5.options.special);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](12);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](59, 19, "minNumbers"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngModel", ctx_r5.options.minNumber);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](68, 21, "minSpecial"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngModel", ctx_r5.options.minSpecial);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](77, 23, "avoidAmbChar"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngModel", ctx_r5.avoidAmbiguous);
+} }
+class PasswordGeneratorComponent extends jslib_angular_components_password_generator_component__WEBPACK_IMPORTED_MODULE_6__["PasswordGeneratorComponent"] {
+ constructor(passwordGenerationService, platformUtilsService, i18nService, stateService, location) {
+ super(passwordGenerationService, platformUtilsService, i18nService, window);
+ this.stateService = stateService;
+ this.location = location;
+ }
+ ngOnInit() {
+ const _super = Object.create(null, {
+ ngOnInit: { get: () => super.ngOnInit }
+ });
+ return __awaiter(this, void 0, void 0, function* () {
+ yield _super.ngOnInit.call(this);
+ const addEditCipherInfo = yield this.stateService.get('addEditCipherInfo');
+ if (addEditCipherInfo != null) {
+ this.cipherState = addEditCipherInfo.cipher;
+ }
+ this.showSelect = this.cipherState != null;
+ });
+ }
+ select() {
+ super.select();
+ this.cipherState.login.password = this.password;
+ this.close();
+ }
+ close() {
+ this.location.back();
+ }
+}
+PasswordGeneratorComponent.ɵfac = function PasswordGeneratorComponent_Factory(t) { return new (t || PasswordGeneratorComponent)(_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](jslib_common_abstractions_passwordGeneration_service__WEBPACK_IMPORTED_MODULE_3__["PasswordGenerationService"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_4__["PlatformUtilsService"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_2__["I18nService"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](jslib_common_abstractions_state_service__WEBPACK_IMPORTED_MODULE_5__["StateService"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](_angular_common__WEBPACK_IMPORTED_MODULE_0__["Location"])); };
+PasswordGeneratorComponent.ɵcmp = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdefineComponent"]({ type: PasswordGeneratorComponent, selectors: [["app-password-generator"]], features: [_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵInheritDefinitionFeature"]], decls: 85, vars: 28, consts: [[1, "left"], [3, "show"], ["type", "button", "appBlurClick", "", 3, "click", 4, "ngIf"], [1, "center"], [1, "title"], [1, "right"], ["type", "info", 4, "ngIf"], [1, "password-block"], ["appSelectCopy", "", 1, "password-wrapper", 3, "innerHTML"], [1, "box", "list"], [1, "box-content", "single-line"], ["type", "button", "appStopClick", "", "appBlurClick", "", 1, "box-content-row", "text-primary", 3, "click"], ["routerLink", "/generator-history", 1, "box-content-row", "box-content-row-flex"], [1, "row-main"], ["aria-hidden", "true", 1, "fa", "fa-chevron-right", "fa-lg", "row-sub-icon"], [1, "box"], [1, "box-header"], [1, "box-content"], [1, "box-content-row"], [1, "sr-only", "radio-header"], ["class", "radio-group text-default", "appBoxRow", "", 4, "ngFor", "ngForOf"], ["class", "box", 4, "ngIf"], [4, "ngIf"], ["type", "button", "appBlurClick", "", 3, "click"], ["type", "info"], ["appBoxRow", "", 1, "radio-group", "text-default"], ["type", "radio", 3, "ngModel", "name", "id", "value", "checked", "ngModelChange", "change"], [3, "for"], ["appBoxRow", "", 1, "box-content-row", "box-content-row-input"], ["for", "num-words"], ["id", "num-words", "type", "number", "min", "3", "max", "20", 3, "ngModel", "change", "ngModelChange"], ["for", "word-separator"], ["id", "word-separator", "type", "text", "maxlength", "1", 3, "ngModel", "input", "ngModelChange"], ["appBoxRow", "", 1, "box-content-row", "box-content-row-checkbox"], ["for", "capitalize"], ["id", "capitalize", "type", "checkbox", 3, "ngModel", "disabled", "change", "ngModelChange"], ["for", "include-number"], ["id", "include-number", "type", "checkbox", 3, "ngModel", "disabled", "change", "ngModelChange"], ["appBoxRow", "", 1, "box-content-row", "box-content-row-slider"], ["for", "length"], ["id", "length", "type", "number", "min", "5", "max", "128", 3, "ngModel", "ngModelChange", "change"], ["id", "lengthRange", "type", "range", "min", "5", "max", "128", "step", "1", 3, "ngModel", "ngModelChange", "change", "input"], ["for", "uppercase"], ["id", "uppercase", "type", "checkbox", 3, "disabled", "ngModel", "change", "ngModelChange"], ["for", "lowercase"], ["id", "lowercase", "type", "checkbox", 3, "disabled", "ngModel", "change", "ngModelChange"], ["for", "numbers"], ["id", "numbers", "type", "checkbox", 3, "disabled", "ngModel", "change", "ngModelChange"], ["for", "special"], ["id", "special", "type", "checkbox", 3, "disabled", "ngModel", "change", "ngModelChange"], ["for", "min-number"], ["id", "min-number", "type", "number", "min", "0", "max", "9", 3, "ngModel", "change", "ngModelChange"], ["for", "min-special"], ["id", "min-special", "type", "number", "min", "0", "max", "9", 3, "ngModel", "change", "ngModelChange"], ["for", "ambiguous"], ["id", "ambiguous", "type", "checkbox", 3, "ngModel", "change", "ngModelChange"]], template: function PasswordGeneratorComponent_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "header");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "div", 0);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](4, "app-pop-out", 1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](6, PasswordGeneratorComponent_button_6_Template, 3, 3, "button", 2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](8, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](9, "div", 3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](10, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](11, "span", 4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](12);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](13, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](14, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](15, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](16, "div", 5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](17, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](18, PasswordGeneratorComponent_button_18_Template, 3, 3, "button", 2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](19, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](20, "\n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](21, "\n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](22, "content");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](23, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](24, PasswordGeneratorComponent_app_callout_24_Template, 3, 3, "app-callout", 6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](25, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](26, "div", 7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](27, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](28, "div", 8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](29, "colorPassword");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](30, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](31, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](32, "div", 9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](33, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](34, "div", 10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](35, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](36, "button", 11);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("click", function PasswordGeneratorComponent_Template_button_click_36_listener() { return ctx.regenerate(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](37);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](38, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](39, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](40, "button", 11);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("click", function PasswordGeneratorComponent_Template_button_click_40_listener() { return ctx.copy(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](41);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](42, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](43, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](44, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](45, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](46, "div", 9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](47, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](48, "div", 10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](49, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](50, "a", 12);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](51, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](52, "div", 13);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](53);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](54, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](55, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](56, "i", 14);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](57, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](58, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](59, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](60, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](61, "div", 15);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](62, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](63, "div", 16);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](64);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](65, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](66, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](67, "div", 17);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](68, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](69, "div", 18);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](70, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](71, "label", 19);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](72);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](73, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](74, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](75, PasswordGeneratorComponent_div_75_Template, 7, 7, "div", 20);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](76, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](77, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](78, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](79, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](80, PasswordGeneratorComponent_div_80_Template, 41, 18, "div", 21);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](81, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](82, PasswordGeneratorComponent_ng_container_82_Template, 84, 25, "ng-container", 22);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](83, "\n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](84, "\n");
+ } if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("show", !ctx.showSelect);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx.showSelect);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](13, 14, "passGen"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx.showSelect);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx.enforcedPolicyOptions == null ? null : ctx.enforcedPolicyOptions.inEffect());
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("innerHTML", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](29, 16, ctx.password), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵsanitizeHtml"]);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](38, 18, "regeneratePassword"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](42, 20, "copyPassword"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](12);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](54, 22, "passwordHistory"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](11);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate1"]("\n ", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](65, 24, "options"), "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](73, 26, "type"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngForOf", ctx.passTypeOptions);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx.options.type === "passphrase");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx.options.type === "password");
+ } }, directives: [_components_pop_out_component__WEBPACK_IMPORTED_MODULE_7__["PopOutComponent"], _angular_common__WEBPACK_IMPORTED_MODULE_0__["NgIf"], jslib_angular_directives_select_copy_directive__WEBPACK_IMPORTED_MODULE_8__["SelectCopyDirective"], jslib_angular_directives_stop_click_directive__WEBPACK_IMPORTED_MODULE_9__["StopClickDirective"], jslib_angular_directives_blur_click_directive__WEBPACK_IMPORTED_MODULE_10__["BlurClickDirective"], _angular_router__WEBPACK_IMPORTED_MODULE_11__["RouterLinkWithHref"], _angular_common__WEBPACK_IMPORTED_MODULE_0__["NgForOf"], jslib_angular_components_callout_component__WEBPACK_IMPORTED_MODULE_12__["CalloutComponent"], jslib_angular_directives_box_row_directive__WEBPACK_IMPORTED_MODULE_13__["BoxRowDirective"], _angular_forms__WEBPACK_IMPORTED_MODULE_14__["RadioControlValueAccessor"], _angular_forms__WEBPACK_IMPORTED_MODULE_14__["DefaultValueAccessor"], _angular_forms__WEBPACK_IMPORTED_MODULE_14__["NgControlStatus"], _angular_forms__WEBPACK_IMPORTED_MODULE_14__["NgModel"], _angular_forms__WEBPACK_IMPORTED_MODULE_14__["NumberValueAccessor"], _angular_forms__WEBPACK_IMPORTED_MODULE_14__["MaxLengthValidator"], _angular_forms__WEBPACK_IMPORTED_MODULE_14__["CheckboxControlValueAccessor"], _angular_forms__WEBPACK_IMPORTED_MODULE_14__["RangeValueAccessor"]], pipes: [jslib_angular_pipes_i18n_pipe__WEBPACK_IMPORTED_MODULE_15__["I18nPipe"], jslib_angular_pipes_color_password_pipe__WEBPACK_IMPORTED_MODULE_16__["ColorPasswordPipe"]], encapsulation: 2 });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵsetClassMetadata"](PasswordGeneratorComponent, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Component"],
+ args: [{
+ selector: 'app-password-generator',
+ templateUrl: 'password-generator.component.html',
+ }]
+ }], function () { return [{ type: jslib_common_abstractions_passwordGeneration_service__WEBPACK_IMPORTED_MODULE_3__["PasswordGenerationService"] }, { type: jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_4__["PlatformUtilsService"] }, { type: jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_2__["I18nService"] }, { type: jslib_common_abstractions_state_service__WEBPACK_IMPORTED_MODULE_5__["StateService"] }, { type: _angular_common__WEBPACK_IMPORTED_MODULE_0__["Location"] }]; }, null); })();
+
+
+/***/ }),
+
+/***/ "./src/popup/main.ts":
+/*!***************************!*\
+ !*** ./src/popup/main.ts ***!
+ \***************************/
+/*! no exports provided */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var _app_module__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./app.module */ "./src/popup/app.module.ts");
+/* harmony import */ var _angular_platform_browser__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @angular/platform-browser */ "./node_modules/@angular/platform-browser/__ivy_ngcc__/fesm2015/platform-browser.js");
+
+// tslint:disable-next-line
+__webpack_require__(/*! ./scss/popup.scss */ "./src/popup/scss/popup.scss");
+
+
+if (false) {}
+function init() {
+ _angular_platform_browser__WEBPACK_IMPORTED_MODULE_2__["platformBrowser"]().bootstrapModule(_app_module__WEBPACK_IMPORTED_MODULE_1__["AppModule"], { preserveWhitespaces: true });
+}
+init();
+
+
+/***/ }),
+
+/***/ "./src/popup/private-mode.component.ts":
+/*!*********************************************!*\
+ !*** ./src/popup/private-mode.component.ts ***!
+ \*********************************************/
+/*! exports provided: PrivateModeComponent */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PrivateModeComponent", function() { return PrivateModeComponent; });
+/* harmony import */ var _browser_browserApi__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../browser/browserApi */ "./src/browser/browserApi.ts");
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+
+
+
+class PrivateModeComponent {
+ ngOnInit() {
+ this.privateModeMessage = chrome.i18n.getMessage('privateModeMessage');
+ this.learnMoreMessage = chrome.i18n.getMessage('learnMore');
+ }
+ learnMore() {
+ _browser_browserApi__WEBPACK_IMPORTED_MODULE_0__["BrowserApi"].createNewTab('https://help.bitwarden.com/article/extension-wont-load-in-private-mode/');
+ }
+}
+PrivateModeComponent.ɵfac = function PrivateModeComponent_Factory(t) { return new (t || PrivateModeComponent)(); };
+PrivateModeComponent.ɵcmp = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdefineComponent"]({ type: PrivateModeComponent, selectors: [["app-private-mode"]], decls: 12, vars: 2, consts: [[1, "content"], [1, "text-center"], ["type", "button", 1, "btn", "primary", "block", 3, "click"]], template: function PrivateModeComponent_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "div", 0);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "p", 1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](4, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](5, "button", 2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("click", function PrivateModeComponent_Template_button_click_5_listener() { return ctx.learnMore(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](6, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](7, "b");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](9, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](10, "\n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](11, "\n");
+ } if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](ctx.privateModeMessage);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](ctx.learnMoreMessage);
+ } }, encapsulation: 2 });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵsetClassMetadata"](PrivateModeComponent, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Component"],
+ args: [{
+ selector: 'app-private-mode',
+ templateUrl: 'private-mode.component.html',
+ }]
+ }], null, null); })();
+
+
+/***/ }),
+
+/***/ "./src/popup/scss/popup.scss":
+/*!***********************************!*\
+ !*** ./src/popup/scss/popup.scss ***!
+ \***********************************/
+/*! no exports provided */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+// extracted by mini-css-extract-plugin
+
+
+/***/ }),
+
+/***/ "./src/popup/send/efflux-dates.component.ts":
+/*!**************************************************!*\
+ !*** ./src/popup/send/efflux-dates.component.ts ***!
+ \**************************************************/
+/*! exports provided: EffluxDatesComponent */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "EffluxDatesComponent", function() { return EffluxDatesComponent; });
+/* harmony import */ var _angular_common__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/common */ "./node_modules/@angular/common/__ivy_ngcc__/fesm2015/common.js");
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var _angular_forms__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @angular/forms */ "./node_modules/@angular/forms/__ivy_ngcc__/fesm2015/forms.js");
+/* harmony import */ var jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! jslib-common/abstractions/i18n.service */ "./jslib/common/src/abstractions/i18n.service.ts");
+/* harmony import */ var jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! jslib-common/abstractions/platformUtils.service */ "./jslib/common/src/abstractions/platformUtils.service.ts");
+/* harmony import */ var jslib_angular_components_send_efflux_dates_component__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! jslib-angular/components/send/efflux-dates.component */ "./jslib/angular/src/components/send/efflux-dates.component.ts");
+/* harmony import */ var jslib_angular_directives_box_row_directive__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! jslib-angular/directives/box-row.directive */ "./jslib/angular/src/directives/box-row.directive.ts");
+/* harmony import */ var jslib_angular_directives_stop_click_directive__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! jslib-angular/directives/stop-click.directive */ "./jslib/angular/src/directives/stop-click.directive.ts");
+/* harmony import */ var jslib_angular_pipes_i18n_pipe__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! jslib-angular/pipes/i18n.pipe */ "./jslib/angular/src/pipes/i18n.pipe.ts");
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+function EffluxDatesComponent_ng_container_6_option_10_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "option", 12);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const o_r12 = ctx.$implicit;
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngValue", o_r12.value);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate1"]("", o_r12.name, "\n ");
+} }
+function EffluxDatesComponent_ng_container_6_div_14_ng_container_2_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementContainer"](0);
+} }
+function EffluxDatesComponent_ng_container_6_div_14_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "div", 8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](2, EffluxDatesComponent_ng_container_6_div_14_ng_container_2_Template, 1, 0, "ng-container", 13);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](2);
+ const _r6 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵreference"](35);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngTemplateOutlet", _r6);
+} }
+function EffluxDatesComponent_ng_container_6_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementContainerStart"](0);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "div", 8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](4, "label", 9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](6, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](8, "select", 10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](9, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](10, EffluxDatesComponent_ng_container_6_option_10_Template, 2, 2, "option", 11);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](11, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](12, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](13, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](14, EffluxDatesComponent_ng_container_6_div_14_Template, 4, 1, "div", 4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](15, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementContainerEnd"]();
+} if (rf & 2) {
+ const ctx_r0 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](6, 3, "deletionDate"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngForOf", ctx_r0.deletionDatePresets);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx_r0.selectedDeletionDatePreset.value === 0);
+} }
+function EffluxDatesComponent_div_8_ng_container_6_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementContainer"](0);
+} }
+function EffluxDatesComponent_div_8_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "div", 8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "label", 9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](4, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](6, EffluxDatesComponent_div_8_ng_container_6_Template, 1, 0, "ng-container", 13);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"]();
+ const _r6 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵreference"](35);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](4, 2, "deletionDate"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngTemplateOutlet", _r6);
+} }
+function EffluxDatesComponent_ng_container_14_Template(rf, ctx) { if (rf & 1) {
+ const _r16 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementContainerStart"](0);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](2, "br");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](4, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](5, "a", 14);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("click", function EffluxDatesComponent_ng_container_14_Template_a_click_5_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r16); const ctx_r15 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](); return ctx_r15.popOutWindow.emit(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](7, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](9, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementContainerEnd"]();
+} if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate1"]("", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](4, 3, "sendFirefoxCustomDatePopoutMessage1"), " ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](7, 5, "sendFirefoxCustomDatePopoutMessage2"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate1"]("\n ", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](9, 7, "sendFirefoxCustomDatePopoutMessage3"), "\n ");
+} }
+function EffluxDatesComponent_ng_container_22_div_2_option_8_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "option", 12);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const o_r20 = ctx.$implicit;
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngValue", o_r20.value);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate1"]("", o_r20.name, "\n ");
+} }
+function EffluxDatesComponent_ng_container_22_div_2_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "div", 8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "label", 15);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](4, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](6, "select", 16);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](8, EffluxDatesComponent_ng_container_22_div_2_option_8_Template, 2, 2, "option", 11);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](9, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](10, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r17 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](4, 2, "expirationDate"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngForOf", ctx_r17.expirationDatePresets);
+} }
+function EffluxDatesComponent_ng_container_22_div_4_ng_container_2_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementContainer"](0);
+} }
+function EffluxDatesComponent_ng_container_22_div_4_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "div", 8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](2, EffluxDatesComponent_ng_container_22_div_4_ng_container_2_Template, 1, 0, "ng-container", 13);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](2);
+ const _r8 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵreference"](38);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngTemplateOutlet", _r8);
+} }
+function EffluxDatesComponent_ng_container_22_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementContainerStart"](0);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](2, EffluxDatesComponent_ng_container_22_div_2_Template, 11, 4, "div", 4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](4, EffluxDatesComponent_ng_container_22_div_4_Template, 4, 1, "div", 4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementContainerEnd"]();
+} if (rf & 2) {
+ const ctx_r3 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", !ctx_r3.editMode);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx_r3.selectedExpirationDatePreset.value === 0);
+} }
+function EffluxDatesComponent_div_24_button_8_Template(rf, ctx) { if (rf & 1) {
+ const _r25 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "button", 19);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("click", function EffluxDatesComponent_div_24_button_8_Template_button_click_0_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r25); const ctx_r24 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](2); return ctx_r24.clearExpiration(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](2, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate1"]("\n ", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](2, 1, "clear"), "\n ");
+} }
+function EffluxDatesComponent_div_24_ng_container_11_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementContainer"](0);
+} }
+function EffluxDatesComponent_div_24_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "div", 8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "div", 17);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](4, "label");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](6, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](8, EffluxDatesComponent_div_24_button_8_Template, 3, 3, "button", 18);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](9, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](10, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](11, EffluxDatesComponent_div_24_ng_container_11_Template, 1, 0, "ng-container", 13);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](12, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r4 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"]();
+ const _r8 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵreference"](38);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](6, 3, "expirationDate"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", !ctx_r4.disabled);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngTemplateOutlet", _r8);
+} }
+function EffluxDatesComponent_ng_container_30_Template(rf, ctx) { if (rf & 1) {
+ const _r27 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementContainerStart"](0);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](2, "br");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](4, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](5, "a", 14);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("click", function EffluxDatesComponent_ng_container_30_Template_a_click_5_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r27); const ctx_r26 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](); return ctx_r26.popOutWindow.emit(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](7, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](9, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementContainerEnd"]();
+} if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate1"]("", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](4, 3, "sendFirefoxCustomDatePopoutMessage1"), " ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](7, 5, "sendFirefoxCustomDatePopoutMessage2"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate1"]("\n ", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](9, 7, "sendFirefoxCustomDatePopoutMessage3"), "\n ");
+} }
+function EffluxDatesComponent_ng_template_34_ng_container_3_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementContainerStart"](0);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "div", 23);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](4, "input", 24);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](6, "input", 25);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](8, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementContainerEnd"]();
+} if (rf & 2) {
+ const ctx_r28 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("readOnly", ctx_r28.disabled);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("readOnly", ctx_r28.disabled);
+} }
+function EffluxDatesComponent_ng_template_34_ng_container_5_option_8_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "option", 12);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const o_r32 = ctx.$implicit;
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngValue", o_r32.twentyFourHour);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate1"]("", o_r32.twelveHour, "\n ");
+} }
+function EffluxDatesComponent_ng_template_34_ng_container_5_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementContainerStart"](0);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "div", 23);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](4, "input", 24);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](6, "select", 26);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](8, EffluxDatesComponent_ng_template_34_ng_container_5_option_8_Template, 2, 2, "option", 11);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](9, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](10, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](11, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementContainerEnd"]();
+} if (rf & 2) {
+ const ctx_r29 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("readOnly", ctx_r29.disabled);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngForOf", ctx_r29.safariDeletionTimePresetOptions);
+} }
+function EffluxDatesComponent_ng_template_34_ng_container_7_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementContainerStart"](0);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](2, "input", 27);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementContainerEnd"]();
+} }
+function EffluxDatesComponent_ng_template_34_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](0, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementContainerStart"](1, 20);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](2, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](3, EffluxDatesComponent_ng_template_34_ng_container_3_Template, 9, 2, "ng-container", 21);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](4, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](5, EffluxDatesComponent_ng_template_34_ng_container_5_Template, 12, 2, "ng-container", 21);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](6, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](7, EffluxDatesComponent_ng_template_34_ng_container_7_Template, 4, 0, "ng-container", 22);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](8, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementContainerEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](9, "\n ");
+} if (rf & 2) {
+ const ctx_r7 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngSwitch", ctx_r7.browserPath);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngSwitchCase", "firefox");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngSwitchCase", "safari");
+} }
+function EffluxDatesComponent_ng_template_37_ng_container_3_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementContainerStart"](0);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "div", 23);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](4, "input", 28);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](6, "input", 29);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](8, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementContainerEnd"]();
+} if (rf & 2) {
+ const ctx_r33 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("required", !ctx_r33.editMode)("readOnly", ctx_r33.disabled);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("required", !ctx_r33.editMode)("readOnly", ctx_r33.disabled);
+} }
+function EffluxDatesComponent_ng_template_37_ng_container_5_option_8_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "option", 12);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const o_r37 = ctx.$implicit;
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngValue", o_r37.twentyFourHour);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate1"]("\n ", o_r37.twelveHour, "\n ");
+} }
+function EffluxDatesComponent_ng_template_37_ng_container_5_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementContainerStart"](0);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "div", 23);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](4, "input", 28);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](6, "select", 30);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](8, EffluxDatesComponent_ng_template_37_ng_container_5_option_8_Template, 2, 2, "option", 11);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](9, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](10, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](11, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementContainerEnd"]();
+} if (rf & 2) {
+ const ctx_r34 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("required", !ctx_r34.editMode)("readOnly", ctx_r34.disabled);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngForOf", ctx_r34.safariExpirationTimePresetOptions);
+} }
+function EffluxDatesComponent_ng_template_37_ng_container_7_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementContainerStart"](0);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](2, "input", 31);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementContainerEnd"]();
+} if (rf & 2) {
+ const ctx_r35 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("readOnly", ctx_r35.disabled);
+} }
+function EffluxDatesComponent_ng_template_37_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](0, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementContainerStart"](1, 20);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](2, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](3, EffluxDatesComponent_ng_template_37_ng_container_3_Template, 9, 4, "ng-container", 21);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](4, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](5, EffluxDatesComponent_ng_template_37_ng_container_5_Template, 12, 3, "ng-container", 21);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](6, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](7, EffluxDatesComponent_ng_template_37_ng_container_7_Template, 4, 1, "ng-container", 22);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](8, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementContainerEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](9, "\n ");
+} if (rf & 2) {
+ const ctx_r9 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngSwitch", ctx_r9.browserPath);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngSwitchCase", "firefox");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngSwitchCase", "safari");
+} }
+class EffluxDatesComponent extends jslib_angular_components_send_efflux_dates_component__WEBPACK_IMPORTED_MODULE_5__["EffluxDatesComponent"] {
+ constructor(i18nService, platformUtilsService, datePipe) {
+ super(i18nService, platformUtilsService, datePipe);
+ this.i18nService = i18nService;
+ this.platformUtilsService = platformUtilsService;
+ this.datePipe = datePipe;
+ this.popOutWindow = new _angular_core__WEBPACK_IMPORTED_MODULE_1__["EventEmitter"]();
+ }
+}
+EffluxDatesComponent.ɵfac = function EffluxDatesComponent_Factory(t) { return new (t || EffluxDatesComponent)(_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_3__["I18nService"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_4__["PlatformUtilsService"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](_angular_common__WEBPACK_IMPORTED_MODULE_0__["DatePipe"])); };
+EffluxDatesComponent.ɵcmp = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdefineComponent"]({ type: EffluxDatesComponent, selectors: [["app-send-efflux-dates"]], inputs: { inPopout: "inPopout" }, outputs: { popOutWindow: "popOutWindow" }, features: [_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵProvidersFeature"]([], [{ provide: _angular_forms__WEBPACK_IMPORTED_MODULE_2__["ControlContainer"], useExisting: _angular_forms__WEBPACK_IMPORTED_MODULE_2__["NgForm"] }]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵInheritDefinitionFeature"]], decls: 41, vars: 13, consts: [[3, "formGroup"], [1, "box"], [1, "box-content"], [4, "ngIf"], ["class", "box-content-row", "appBoxRow", "", 4, "ngIf"], [1, "box-footer"], ["deletionDateCustom", ""], ["expirationDateCustom", ""], ["appBoxRow", "", 1, "box-content-row"], ["for", "deletionDate"], ["id", "deletionDate", "name", "DeletionDateSelect", "formControlName", "selectedDeletionDatePreset", "required", ""], [3, "ngValue", 4, "ngFor", "ngForOf"], [3, "ngValue"], [4, "ngTemplateOutlet"], [3, "click"], ["for", "editExpirationDate"], ["id", "expirationDate", "name", "ExpirationDateSelect", "formControlName", "selectedExpirationDatePreset", "required", ""], [1, "flex-label"], ["type", "button", "appStopClick", "", 3, "click", 4, "ngIf"], ["type", "button", "appStopClick", "", 3, "click"], [3, "ngSwitch"], [4, "ngSwitchCase"], [4, "ngSwitchDefault"], [1, "flex", "flex-grow"], ["id", "deletionDateCustomFallback", "type", "date", "name", "DeletionDateFallback", "formControlName", "fallbackDeletionDate", "required", "", "placeholder", "MM/DD/YYYY", "data-date-format", "mm/dd/yyyy", 3, "readOnly"], ["id", "deletionTimeCustomFallback", "type", "time", "name", "DeletionTimeDate", "formControlName", "fallbackDeletionTime", "required", "", "placeholder", "HH:MM AM/PM", 3, "readOnly"], ["id", "deletionTimeCustomFallback", "formControlName", "fallbackDeletionTime", "name", "SafariDeletionTime"], ["id", "deletionDateCustom", "type", "datetime-local", "name", "DeletionDate", "formControlName", "defaultDeletionDateTime", "required", "", "placeholder", "MM/DD/YYYY HH:MM AM/PM"], ["id", "expirationDateCustomFallback", "type", "date", "name", "ExpirationDateFallback", "formControlName", "fallbackExpirationDate", "placeholder", "MM/DD/YYYY", "data-date-format", "mm/dd/yyyy", 3, "required", "readOnly"], ["id", "expirationTimeCustomFallback", "type", "time", "name", "ExpirationTimeFallback", "formControlName", "fallbackExpirationTime", "placeholder", "HH:MM AM/PM", 3, "required", "readOnly"], ["id", "expirationTimeCustomFallback", "formControlName", "fallbackExpirationTime", "name", "SafariExpirationTime"], ["id", "expirationDateCustom", "type", "datetime-local", "name", "ExpirationDate", "formControlName", "defaultExpirationDateTime", "required", "", "placeholder", "MM/DD/YYYY HH:MM AM/PM", 3, "readOnly"]], template: function EffluxDatesComponent_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementContainerStart"](0, 0);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "div", 1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](4, "div", 2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](6, EffluxDatesComponent_ng_container_6_Template, 16, 5, "ng-container", 3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](8, EffluxDatesComponent_div_8_Template, 8, 4, "div", 4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](9, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](10, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](11, "div", 5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](12);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](13, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](14, EffluxDatesComponent_ng_container_14_Template, 10, 9, "ng-container", 3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](15, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](16, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](17, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](18, "div", 1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](19, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](20, "div", 2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](21, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](22, EffluxDatesComponent_ng_container_22_Template, 6, 2, "ng-container", 3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](23, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](24, EffluxDatesComponent_div_24_Template, 13, 5, "div", 4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](25, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](26, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](27, "div", 5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](28);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](29, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](30, EffluxDatesComponent_ng_container_30_Template, 10, 9, "ng-container", 3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](31, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](32, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](33, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](34, EffluxDatesComponent_ng_template_34_Template, 10, 3, "ng-template", null, 6, _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplateRefExtractor"]);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](36, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](37, EffluxDatesComponent_ng_template_37_Template, 10, 3, "ng-template", null, 7, _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplateRefExtractor"]);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](39, "\n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementContainerEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](40, "\n\n");
+ } if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("formGroup", ctx.datesForm);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", !ctx.editMode);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx.editMode);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate1"]("\n ", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](13, 9, "deletionDateDesc"), "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", !ctx.inPopout && ctx.browserPath == "firefox" && (ctx.editMode || ctx.selectedDeletionDatePreset.value === 0 && !ctx.editMode));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", !ctx.editMode);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx.editMode);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate1"]("\n ", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](29, 11, "expirationDateDesc"), "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", !ctx.inPopout && ctx.browserPath == "firefox" && (ctx.editMode || ctx.selectedExpirationDatePreset.value === 0 && !ctx.editMode));
+ } }, directives: [_angular_forms__WEBPACK_IMPORTED_MODULE_2__["NgControlStatusGroup"], _angular_forms__WEBPACK_IMPORTED_MODULE_2__["FormGroupDirective"], _angular_common__WEBPACK_IMPORTED_MODULE_0__["NgIf"], jslib_angular_directives_box_row_directive__WEBPACK_IMPORTED_MODULE_6__["BoxRowDirective"], _angular_forms__WEBPACK_IMPORTED_MODULE_2__["SelectControlValueAccessor"], _angular_forms__WEBPACK_IMPORTED_MODULE_2__["NgControlStatus"], _angular_forms__WEBPACK_IMPORTED_MODULE_2__["FormControlName"], _angular_forms__WEBPACK_IMPORTED_MODULE_2__["RequiredValidator"], _angular_common__WEBPACK_IMPORTED_MODULE_0__["NgForOf"], _angular_forms__WEBPACK_IMPORTED_MODULE_2__["NgSelectOption"], _angular_forms__WEBPACK_IMPORTED_MODULE_2__["ɵangular_packages_forms_forms_z"], _angular_common__WEBPACK_IMPORTED_MODULE_0__["NgTemplateOutlet"], jslib_angular_directives_stop_click_directive__WEBPACK_IMPORTED_MODULE_7__["StopClickDirective"], _angular_common__WEBPACK_IMPORTED_MODULE_0__["NgSwitch"], _angular_common__WEBPACK_IMPORTED_MODULE_0__["NgSwitchCase"], _angular_common__WEBPACK_IMPORTED_MODULE_0__["NgSwitchDefault"], _angular_forms__WEBPACK_IMPORTED_MODULE_2__["DefaultValueAccessor"]], pipes: [jslib_angular_pipes_i18n_pipe__WEBPACK_IMPORTED_MODULE_8__["I18nPipe"]], encapsulation: 2 });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵsetClassMetadata"](EffluxDatesComponent, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Component"],
+ args: [{
+ selector: 'app-send-efflux-dates',
+ templateUrl: 'efflux-dates.component.html',
+ viewProviders: [{ provide: _angular_forms__WEBPACK_IMPORTED_MODULE_2__["ControlContainer"], useExisting: _angular_forms__WEBPACK_IMPORTED_MODULE_2__["NgForm"] }],
+ }]
+ }], function () { return [{ type: jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_3__["I18nService"] }, { type: jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_4__["PlatformUtilsService"] }, { type: _angular_common__WEBPACK_IMPORTED_MODULE_0__["DatePipe"] }]; }, { inPopout: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Input"]
+ }], popOutWindow: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Output"]
+ }] }); })();
+
+
+/***/ }),
+
+/***/ "./src/popup/send/send-add-edit.component.ts":
+/*!***************************************************!*\
+ !*** ./src/popup/send/send-add-edit.component.ts ***!
+ \***************************************************/
+/*! exports provided: SendAddEditComponent */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SendAddEditComponent", function() { return SendAddEditComponent; });
+/* harmony import */ var _angular_common__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/common */ "./node_modules/@angular/common/__ivy_ngcc__/fesm2015/common.js");
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var _angular_router__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @angular/router */ "./node_modules/@angular/router/__ivy_ngcc__/fesm2015/router.js");
+/* harmony import */ var rxjs_operators__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! rxjs/operators */ "./node_modules/rxjs/_esm5/operators/index.js");
+/* harmony import */ var jslib_common_abstractions_environment_service__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! jslib-common/abstractions/environment.service */ "./jslib/common/src/abstractions/environment.service.ts");
+/* harmony import */ var jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! jslib-common/abstractions/i18n.service */ "./jslib/common/src/abstractions/i18n.service.ts");
+/* harmony import */ var jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! jslib-common/abstractions/log.service */ "./jslib/common/src/abstractions/log.service.ts");
+/* harmony import */ var jslib_common_abstractions_messaging_service__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! jslib-common/abstractions/messaging.service */ "./jslib/common/src/abstractions/messaging.service.ts");
+/* harmony import */ var jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! jslib-common/abstractions/platformUtils.service */ "./jslib/common/src/abstractions/platformUtils.service.ts");
+/* harmony import */ var jslib_common_abstractions_policy_service__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! jslib-common/abstractions/policy.service */ "./jslib/common/src/abstractions/policy.service.ts");
+/* harmony import */ var jslib_common_abstractions_send_service__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! jslib-common/abstractions/send.service */ "./jslib/common/src/abstractions/send.service.ts");
+/* harmony import */ var jslib_common_abstractions_user_service__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! jslib-common/abstractions/user.service */ "./jslib/common/src/abstractions/user.service.ts");
+/* harmony import */ var _services_popup_utils_service__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../services/popup-utils.service */ "./src/popup/services/popup-utils.service.ts");
+/* harmony import */ var jslib_angular_components_send_add_edit_component__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! jslib-angular/components/send/add-edit.component */ "./jslib/angular/src/components/send/add-edit.component.ts");
+/* harmony import */ var _angular_forms__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @angular/forms */ "./node_modules/@angular/forms/__ivy_ngcc__/fesm2015/forms.js");
+/* harmony import */ var jslib_angular_directives_api_action_directive__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! jslib-angular/directives/api-action.directive */ "./jslib/angular/src/directives/api-action.directive.ts");
+/* harmony import */ var jslib_angular_directives_blur_click_directive__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! jslib-angular/directives/blur-click.directive */ "./jslib/angular/src/directives/blur-click.directive.ts");
+/* harmony import */ var jslib_angular_directives_box_row_directive__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! jslib-angular/directives/box-row.directive */ "./jslib/angular/src/directives/box-row.directive.ts");
+/* harmony import */ var _efflux_dates_component__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./efflux-dates.component */ "./src/popup/send/efflux-dates.component.ts");
+/* harmony import */ var jslib_angular_directives_input_verbatim_directive__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! jslib-angular/directives/input-verbatim.directive */ "./jslib/angular/src/directives/input-verbatim.directive.ts");
+/* harmony import */ var jslib_angular_components_callout_component__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! jslib-angular/components/callout.component */ "./jslib/angular/src/components/callout.component.ts");
+/* harmony import */ var jslib_angular_directives_stop_click_directive__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! jslib-angular/directives/stop-click.directive */ "./jslib/angular/src/directives/stop-click.directive.ts");
+/* harmony import */ var jslib_angular_directives_a11y_title_directive__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! jslib-angular/directives/a11y-title.directive */ "./jslib/angular/src/directives/a11y-title.directive.ts");
+/* harmony import */ var jslib_angular_pipes_i18n_pipe__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! jslib-angular/pipes/i18n.pipe */ "./jslib/angular/src/pipes/i18n.pipe.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+function SendAddEditComponent_content_31_app_callout_3_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "app-callout", 43);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](1, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](3, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpropertyInterpolate"]("title", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](1, 2, "sendDisabled"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate1"]("\n ", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](3, 4, "sendDisabledWarning"), "\n ");
+} }
+function SendAddEditComponent_content_31_app_callout_5_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "app-callout", 44);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](2, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate1"]("\n ", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](2, 1, "sendOptionsPolicyInEffect"), "\n ");
+} }
+function SendAddEditComponent_content_31_app_callout_8_div_3_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "div");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](2, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](2, 1, "sendLinuxChromiumFileWarning"));
+} }
+function SendAddEditComponent_content_31_app_callout_8_div_5_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "div");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](2, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](2, 1, "sendFirefoxFileWarning"));
+} }
+function SendAddEditComponent_content_31_app_callout_8_div_7_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "div");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](2, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](2, 1, "sendSafariFileWarning"));
+} }
+function SendAddEditComponent_content_31_app_callout_8_Template(rf, ctx) { if (rf & 1) {
+ const _r19 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "app-callout", 45);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("click", function SendAddEditComponent_content_31_app_callout_8_Template_app_callout_click_0_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r19); const ctx_r18 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](2); return ctx_r18.popOutWindow(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](1, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](2, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](3, SendAddEditComponent_content_31_app_callout_8_div_3_Template, 3, 3, "div", 10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](4, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](5, SendAddEditComponent_content_31_app_callout_8_div_5_Template, 3, 3, "div", 10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](6, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](7, SendAddEditComponent_content_31_app_callout_8_div_7_Template, 3, 3, "div", 10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](8, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r4 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpropertyInterpolate"]("title", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](1, 5, "sendFileCalloutHeader"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("clickable", true);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx_r4.showChromiumFileWarning);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx_r4.showFirefoxFileWarning);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx_r4.showSafariFileWarning);
+} }
+function SendAddEditComponent_content_31_div_31_div_10_Template(rf, ctx) { if (rf & 1) {
+ const _r23 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "div", 50);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "input", 51);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("ngModelChange", function SendAddEditComponent_content_31_div_31_div_10_Template_input_ngModelChange_2_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r23); const ctx_r22 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](3); return ctx_r22.send.type = $event; })("change", function SendAddEditComponent_content_31_div_31_div_10_Template_input_change_2_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r23); const ctx_r24 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](3); return ctx_r24.typeChanged(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](4, "label", 52);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](6, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const o_r21 = ctx.$implicit;
+ const ctx_r20 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpropertyInterpolate1"]("name", "Type_", o_r21.value, "");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpropertyInterpolate1"]("id", "type_", o_r21.value, "");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngModel", ctx_r20.send.type)("value", o_r21.value)("checked", ctx_r20.send.type === o_r21.value)("readonly", ctx_r20.disableSend);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpropertyInterpolate1"]("for", "type_", o_r21.value, "");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate1"]("\n ", o_r21.name, "\n ");
+} }
+function SendAddEditComponent_content_31_div_31_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "div", 14);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "div", 46);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](4, "div", 47);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](6, "label", 48);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](8, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](9, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](10, SendAddEditComponent_content_31_div_31_div_10_Template, 7, 8, "div", 49);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](11, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](12, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](13, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r5 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](8, 2, "sendTypeHeader"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngForOf", ctx_r5.typeOptions);
+} }
+function SendAddEditComponent_content_31_div_34_div_4_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "div", 47);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "label", 55);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](4, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](6, "div", 32);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](8, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r25 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](4, 3, "file"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate2"]("", ctx_r25.send.file.fileName, " (", ctx_r25.send.file.sizeName, ")");
+} }
+function SendAddEditComponent_content_31_div_34_div_6_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "div", 47);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "label", 55);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](4, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](6, "input", 56);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r26 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](4, 2, "file"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("readonly", ctx_r26.disableSend);
+} }
+function SendAddEditComponent_content_31_div_34_div_9_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "div", 19);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](2, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](3, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate2"]("\n ", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](2, 2, "sendFileDesc"), " ", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](3, 4, "maxFileSize"), "\n ");
+} }
+function SendAddEditComponent_content_31_div_34_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "div", 14);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "div", 46);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](4, SendAddEditComponent_content_31_div_34_div_4_Template, 9, 5, "div", 53);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](6, SendAddEditComponent_content_31_div_34_div_6_Template, 8, 4, "div", 53);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](8, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](9, SendAddEditComponent_content_31_div_34_div_9_Template, 4, 6, "div", 54);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](10, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r6 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx_r6.editMode);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx_r6.showFileSelector);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx_r6.showFileSelector);
+} }
+function SendAddEditComponent_content_31_div_37_Template(rf, ctx) { if (rf & 1) {
+ const _r29 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "div", 14);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "div", 15);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](4, "div", 16);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](6, "label", 57);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](8, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](9, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](10, "textarea", 58);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("ngModelChange", function SendAddEditComponent_content_31_div_37_Template_textarea_ngModelChange_10_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r29); const ctx_r28 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](2); return ctx_r28.send.text.text = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](11, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](12, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](13, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](14, "div", 19);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](15);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](16, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](17, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](18, "div", 15);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](19, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](20, "div", 22);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](21, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](22, "label", 59);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](23);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](24, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](25, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](26, "input", 60);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("ngModelChange", function SendAddEditComponent_content_31_div_37_Template_input_ngModelChange_26_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r29); const ctx_r30 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](2); return ctx_r30.send.text.hidden = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](27, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](28, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](29, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r7 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](8, 7, "sendTypeText"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngModel", ctx_r7.send.text.text)("readonly", ctx_r7.disableSend);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate1"]("\n ", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](16, 9, "sendTextDesc"), "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](24, 11, "sendHideText"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngModel", ctx_r7.send.text.hidden)("disabled", ctx_r7.disableSend);
+} }
+function SendAddEditComponent_content_31_i_66_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](0, "i", 61);
+} }
+function SendAddEditComponent_content_31_i_68_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](0, "i", 62);
+} }
+function SendAddEditComponent_content_31_div_98_Template(rf, ctx) { if (rf & 1) {
+ const _r32 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "div", 14);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "div", 15);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](4, "div", 16);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](6, "label", 63);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](8, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](9, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](10, "input", 64);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("ngModelChange", function SendAddEditComponent_content_31_div_98_Template_input_ngModelChange_10_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r32); const ctx_r31 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](2); return ctx_r31.send.accessCount = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](11, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](12, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](13, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r10 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](8, 2, "currentAccessCount"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngModel", ctx_r10.send.accessCount);
+} }
+function SendAddEditComponent_content_31_label_109_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "label", 65);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](2, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](2, 1, "newPassword"));
+} }
+function SendAddEditComponent_content_31_label_111_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "label", 65);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](2, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](2, 1, "password"));
+} }
+const _c0 = function (a0, a1) { return { "fa-eye": a0, "fa-eye-slash": a1 }; };
+function SendAddEditComponent_content_31_div_116_Template(rf, ctx) { if (rf & 1) {
+ const _r34 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "div", 66);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "button", 67);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("click", function SendAddEditComponent_content_31_div_116_Template_button_click_2_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r34); const ctx_r33 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](2); return ctx_r33.togglePasswordVisible(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](3, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](4, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](5, "i", 68);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](6, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r13 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpropertyInterpolate"]("appA11yTitle", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](3, 2, "toggleVisibility"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngClass", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpureFunction2"](4, _c0, !ctx_r13.showPassword, ctx_r13.showPassword));
+} }
+function SendAddEditComponent_content_31_div_179_Template(rf, ctx) { if (rf & 1) {
+ const _r37 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "div", 69);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "div", 70);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](4, "button", 71, 72);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("click", function SendAddEditComponent_content_31_div_179_Template_button_click_4_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r37); const ctx_r36 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](2); return ctx_r36.delete(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](6, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](7, "div", 73);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](8, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](9, "div", 74);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](10, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](11, "i", 75);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](12, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](13, "i", 76);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](14, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](15, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](16, "span");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](17);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](18, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](19, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](20, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](21, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](22, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const _r35 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵreference"](5);
+ const ctx_r14 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("appApiAction", ctx_r14.deletePromise);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("hidden", _r35.loading);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("hidden", !_r35.loading);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](18, 4, "deleteSend"));
+} }
+function SendAddEditComponent_content_31_Template(rf, ctx) { if (rf & 1) {
+ const _r39 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "content");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](2, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](3, SendAddEditComponent_content_31_app_callout_3_Template, 4, 6, "app-callout", 11);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](4, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](5, SendAddEditComponent_content_31_app_callout_5_Template, 3, 3, "app-callout", 12);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](6, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](8, SendAddEditComponent_content_31_app_callout_8_Template, 9, 7, "app-callout", 13);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](9, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](10, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](11, "div", 14);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](12, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](13, "div", 15);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](14, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](15, "div", 16);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](16, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](17, "label", 17);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](18);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](19, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](20, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](21, "input", 18);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("ngModelChange", function SendAddEditComponent_content_31_Template_input_ngModelChange_21_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r39); const ctx_r38 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](); return ctx_r38.send.name = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](22, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](23, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](24, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](25, "div", 19);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](26);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](27, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](28, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](29, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](30, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](31, SendAddEditComponent_content_31_div_31_Template, 14, 4, "div", 20);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](32, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](33, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](34, SendAddEditComponent_content_31_div_34_Template, 11, 3, "div", 20);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](35, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](36, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](37, SendAddEditComponent_content_31_div_37_Template, 30, 13, "div", 20);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](38, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](39, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](40, "div", 14);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](41, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](42, "div", 21);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](43);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](44, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](45, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](46, "div", 15);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](47, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](48, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](49, "div", 22);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](50, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](51, "label", 23);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](52);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](53, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](54, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](55, "input", 24);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("ngModelChange", function SendAddEditComponent_content_31_Template_input_ngModelChange_55_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r39); const ctx_r40 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](); return ctx_r40.copyLink = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](56, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](57, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](58, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](59, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](60, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](61, "div", 14);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](62, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](63, "div", 25);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("click", function SendAddEditComponent_content_31_Template_div_click_63_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r39); const ctx_r41 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](); return ctx_r41.showOptions = !ctx_r41.showOptions; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](64);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](65, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](66, SendAddEditComponent_content_31_i_66_Template, 1, 0, "i", 26);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](67, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](68, SendAddEditComponent_content_31_i_68_Template, 1, 0, "i", 27);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](69, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](70, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](71, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](72, "div", 8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](73, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](74, "app-send-efflux-dates", 28);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("datesChanged", function SendAddEditComponent_content_31_Template_app_send_efflux_dates_datesChanged_74_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r39); const ctx_r42 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](); return ctx_r42.setDates($event); })("popOutWindow", function SendAddEditComponent_content_31_Template_app_send_efflux_dates_popOutWindow_74_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r39); const ctx_r43 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](); return ctx_r43.popOutWindow(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](75, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](76, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](77, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](78, "div", 14);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](79, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](80, "div", 15);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](81, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](82, "div", 16);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](83, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](84, "label", 29);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](85);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](86, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](87, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](88, "input", 30);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("ngModelChange", function SendAddEditComponent_content_31_Template_input_ngModelChange_88_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r39); const ctx_r44 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](); return ctx_r44.send.maxAccessCount = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](89, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](90, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](91, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](92, "div", 19);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](93);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](94, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](95, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](96, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](97, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](98, SendAddEditComponent_content_31_div_98_Template, 14, 4, "div", 20);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](99, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](100, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](101, "div", 14);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](102, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](103, "div", 15);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](104, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](105, "div", 31);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](106, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](107, "div", 32);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](108, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](109, SendAddEditComponent_content_31_label_109_Template, 3, 3, "label", 33);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](110, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](111, SendAddEditComponent_content_31_label_111_Template, 3, 3, "label", 33);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](112, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](113, "input", 34);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("ngModelChange", function SendAddEditComponent_content_31_Template_input_ngModelChange_113_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r39); const ctx_r45 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](); return ctx_r45.password = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](114, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](115, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](116, SendAddEditComponent_content_31_div_116_Template, 8, 7, "div", 35);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](117, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](118, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](119, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](120, "div", 19);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](121);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](122, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](123, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](124, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](125, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](126, "div", 14);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](127, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](128, "div", 15);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](129, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](130, "div", 16);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](131, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](132, "label", 36);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](133);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](134, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](135, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](136, "textarea", 37);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("ngModelChange", function SendAddEditComponent_content_31_Template_textarea_ngModelChange_136_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r39); const ctx_r46 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](); return ctx_r46.send.notes = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](137, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](138, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](139, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](140, "div", 19);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](141);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](142, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](143, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](144, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](145, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](146, "div", 14);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](147, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](148, "div", 15);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](149, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](150, "div", 22);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](151, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](152, "label", 38);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](153);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](154, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](155, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](156, "input", 39);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("ngModelChange", function SendAddEditComponent_content_31_Template_input_ngModelChange_156_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r39); const ctx_r47 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](); return ctx_r47.send.hideEmail = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](157, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](158, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](159, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](160, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](161, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](162, "div", 14);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](163, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](164, "div", 15);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](165, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](166, "div", 22);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](167, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](168, "label", 40);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](169);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](170, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](171, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](172, "input", 41);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("ngModelChange", function SendAddEditComponent_content_31_Template_input_ngModelChange_172_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r39); const ctx_r48 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](); return ctx_r48.send.disabled = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](173, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](174, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](175, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](176, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](177, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](178, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](179, SendAddEditComponent_content_31_div_179_Template, 23, 6, "div", 42);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](180, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r1 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx_r1.disableSend);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx_r1.disableHideEmail && !ctx_r1.disableSend);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx_r1.showFilePopoutMessage && ctx_r1.send.type === ctx_r1.sendType.File && !ctx_r1.disableSend);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](19, 45, "name"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngModel", ctx_r1.send.name)("readonly", ctx_r1.disableSend);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate1"]("\n ", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](27, 47, "sendNameDesc"), "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", !ctx_r1.editMode);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx_r1.send.type === ctx_r1.sendType.File && (ctx_r1.editMode || ctx_r1.showFileSelector));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx_r1.send.type === ctx_r1.sendType.Text);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate1"]("\n ", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](44, 49, "share"), "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](53, 51, "sendShareDesc"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngModel", ctx_r1.copyLink)("disabled", ctx_r1.disableSend);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate1"]("\n ", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](65, 53, "options"), "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", !ctx_r1.showOptions);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx_r1.showOptions);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("hidden", !ctx_r1.showOptions);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("initialDeletionDate", ctx_r1.send.deletionDate)("initialExpirationDate", ctx_r1.send.expirationDate)("editMode", ctx_r1.editMode)("disabled", ctx_r1.disableSend);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](11);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](86, 55, "maximumAccessCount"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngModel", ctx_r1.send.maxAccessCount)("readonly", ctx_r1.disableSend);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate1"]("\n ", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](94, 57, "maximumAccessCountDesc"), "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx_r1.editMode);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](11);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx_r1.hasPassword);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", !ctx_r1.hasPassword);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpropertyInterpolate"]("type", ctx_r1.showPassword ? "text" : "password");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngModel", ctx_r1.password)("readonly", ctx_r1.disableSend);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", !ctx_r1.disableSend);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate1"]("\n ", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](122, 59, "sendPasswordDesc"), "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](12);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](134, 61, "notes"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngModel", ctx_r1.send.notes)("readonly", ctx_r1.disableSend);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate1"]("\n ", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](142, 63, "sendNotesDesc"), "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](12);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](154, 65, "hideEmail"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngModel", ctx_r1.send.hideEmail)("disabled", ctx_r1.disableHideEmail && !ctx_r1.send.hideEmail || ctx_r1.disableSend);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](13);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](170, 67, "sendDisableDesc"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngModel", ctx_r1.send.disabled)("disabled", ctx_r1.disableSend);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx_r1.editMode);
+} }
+class SendAddEditComponent extends jslib_angular_components_send_add_edit_component__WEBPACK_IMPORTED_MODULE_13__["AddEditComponent"] {
+ constructor(i18nService, platformUtilsService, userService, messagingService, policyService, environmentService, datePipe, sendService, route, router, location, popupUtilsService, logService) {
+ super(i18nService, platformUtilsService, environmentService, datePipe, sendService, userService, messagingService, policyService, logService);
+ this.route = route;
+ this.router = router;
+ this.location = location;
+ this.popupUtilsService = popupUtilsService;
+ // Options header
+ this.showOptions = false;
+ // File visibility
+ this.isFirefox = false;
+ this.inPopout = false;
+ this.inSidebar = false;
+ this.isLinux = false;
+ this.isUnsupportedMac = false;
+ }
+ get showFileSelector() {
+ return !(this.editMode || this.showFilePopoutMessage);
+ }
+ get showFilePopoutMessage() {
+ return !this.editMode && (this.showFirefoxFileWarning || this.showSafariFileWarning || this.showChromiumFileWarning);
+ }
+ get showFirefoxFileWarning() {
+ return this.isFirefox && !(this.inSidebar || this.inPopout);
+ }
+ get showSafariFileWarning() {
+ return this.isSafari && !this.inPopout;
+ }
+ // Only show this for Chromium based browsers in Linux and Mac > Big Sur
+ get showChromiumFileWarning() {
+ return (this.isLinux || this.isUnsupportedMac) && !this.isFirefox && !(this.inSidebar || this.inPopout);
+ }
+ popOutWindow() {
+ this.popupUtilsService.popOut(window);
+ }
+ ngOnInit() {
+ var _a, _b;
+ return __awaiter(this, void 0, void 0, function* () {
+ // File visilibity
+ this.isFirefox = this.platformUtilsService.isFirefox();
+ this.inPopout = this.popupUtilsService.inPopout(window);
+ this.inSidebar = this.popupUtilsService.inSidebar(window);
+ this.isLinux = ((_a = window === null || window === void 0 ? void 0 : window.navigator) === null || _a === void 0 ? void 0 : _a.userAgent.indexOf('Linux')) !== -1;
+ this.isUnsupportedMac = this.platformUtilsService.isChrome() && ((_b = window === null || window === void 0 ? void 0 : window.navigator) === null || _b === void 0 ? void 0 : _b.appVersion.includes('Mac OS X 11'));
+ this.route.queryParams.pipe(Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_3__["first"])()).subscribe((params) => __awaiter(this, void 0, void 0, function* () {
+ if (params.sendId) {
+ this.sendId = params.sendId;
+ }
+ if (params.type) {
+ const type = parseInt(params.type, null);
+ this.type = type;
+ }
+ yield this.load();
+ }));
+ window.setTimeout(() => {
+ if (!this.editMode) {
+ document.getElementById('name').focus();
+ }
+ }, 200);
+ });
+ }
+ submit() {
+ const _super = Object.create(null, {
+ submit: { get: () => super.submit }
+ });
+ return __awaiter(this, void 0, void 0, function* () {
+ if (yield _super.submit.call(this)) {
+ this.cancel();
+ return true;
+ }
+ return false;
+ });
+ }
+ delete() {
+ const _super = Object.create(null, {
+ delete: { get: () => super.delete }
+ });
+ return __awaiter(this, void 0, void 0, function* () {
+ if (yield _super.delete.call(this)) {
+ this.cancel();
+ return true;
+ }
+ return false;
+ });
+ }
+ cancel() {
+ // If true, the window was pop'd out on the add-send page. location.back will not work
+ if (window.previousPopupUrl.startsWith('/add-send')) {
+ this.router.navigate(['tabs/send']);
+ }
+ else {
+ this.location.back();
+ }
+ }
+}
+SendAddEditComponent.ɵfac = function SendAddEditComponent_Factory(t) { return new (t || SendAddEditComponent)(_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_5__["I18nService"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_8__["PlatformUtilsService"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](jslib_common_abstractions_user_service__WEBPACK_IMPORTED_MODULE_11__["UserService"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](jslib_common_abstractions_messaging_service__WEBPACK_IMPORTED_MODULE_7__["MessagingService"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](jslib_common_abstractions_policy_service__WEBPACK_IMPORTED_MODULE_9__["PolicyService"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](jslib_common_abstractions_environment_service__WEBPACK_IMPORTED_MODULE_4__["EnvironmentService"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](_angular_common__WEBPACK_IMPORTED_MODULE_0__["DatePipe"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](jslib_common_abstractions_send_service__WEBPACK_IMPORTED_MODULE_10__["SendService"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](_angular_router__WEBPACK_IMPORTED_MODULE_2__["ActivatedRoute"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](_angular_router__WEBPACK_IMPORTED_MODULE_2__["Router"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](_angular_common__WEBPACK_IMPORTED_MODULE_0__["Location"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](_services_popup_utils_service__WEBPACK_IMPORTED_MODULE_12__["PopupUtilsService"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_6__["LogService"])); };
+SendAddEditComponent.ɵcmp = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdefineComponent"]({ type: SendAddEditComponent, selectors: [["app-send-add-edit"]], features: [_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵInheritDefinitionFeature"]], decls: 34, vars: 12, consts: [[3, "appApiAction", "ngSubmit"], ["form", ""], [1, "left"], ["type", "button", "appBlurClick", "", 3, "click"], [1, "center"], [1, "title"], [1, "right"], ["type", "submit", "appBlurClick", "", 3, "disabled"], [3, "hidden"], ["aria-hidden", "true", 1, "fa", "fa-spinner", "fa-lg", "fa-spin", 3, "hidden"], [4, "ngIf"], ["type", "warning", 3, "title", 4, "ngIf"], ["type", "info", 4, "ngIf"], ["type", "warning", "icon", "fa fa-external-link fa-rotate-270 fa-fw", 3, "clickable", "title", "click", 4, "ngIf"], [1, "box"], [1, "box-content"], ["appBoxRow", "", 1, "box-content-row"], ["for", "name"], ["id", "name", "type", "text", "name", "Name", 3, "ngModel", "readonly", "ngModelChange"], [1, "box-footer"], ["class", "box", 4, "ngIf"], [1, "box-header"], ["appBoxRow", "", 1, "box-content-row", "box-content-row-checkbox"], ["for", "copyOnSave"], ["id", "copyOnSave", "type", "checkbox", "name", "CopyOnSave", 3, "ngModel", "disabled", "ngModelChange"], [1, "box-header-expandable", 3, "click"], ["class", "fa fa-chevron-down fa-sm icon", 4, "ngIf"], ["class", "fa fa-chevron-up fa-sm icon", 4, "ngIf"], [3, "initialDeletionDate", "initialExpirationDate", "editMode", "disabled", "datesChanged", "popOutWindow"], ["for", "maximumAccessCount"], ["id", "maximumAccessCount", "min", "1", "type", "number", "name", "MaximumAccessCount", 3, "ngModel", "readonly", "ngModelChange"], ["appBoxRow", "", 1, "box-content-row", "box-content-row-flex"], [1, "row-main"], ["for", "password", 4, "ngIf"], ["id", "password", "name", "Password", "appInputVerbatim", "", 1, "monospaced", 3, "type", "ngModel", "readonly", "ngModelChange"], ["class", "action-buttons", 4, "ngIf"], ["for", "notes"], ["id", "notes", "name", "Notes", "rows", "6", 3, "ngModel", "readonly", "ngModelChange"], ["for", "hideEmail"], ["id", "hideEmail", "type", "checkbox", "name", "HideEmail", 3, "ngModel", "disabled", "ngModelChange"], ["for", "disableSend"], ["id", "disableSend", "type", "checkbox", "name", "DisableSend", 3, "ngModel", "disabled", "ngModelChange"], ["class", "box list", 4, "ngIf"], ["type", "warning", 3, "title"], ["type", "info"], ["type", "warning", "icon", "fa fa-external-link fa-rotate-270 fa-fw", 3, "clickable", "title", "click"], [1, "box-content", "no-hover"], [1, "box-content-row"], ["for", "sendTypeOptions"], ["class", "radio-group text-default", "appBoxRow", "", "name", "SendTypeOptions", 4, "ngFor", "ngForOf"], ["appBoxRow", "", "name", "SendTypeOptions", 1, "radio-group", "text-default"], ["type", "radio", 3, "ngModel", "name", "id", "value", "checked", "readonly", "ngModelChange", "change"], [3, "for"], ["class", "box-content-row", 4, "ngIf"], ["class", "box-footer", 4, "ngIf"], ["for", "file"], ["type", "file", "id", "file", "name", "file", "required", "", 3, "readonly"], ["for", "text"], ["id", "text", "name", "Text", "rows", "6", 3, "ngModel", "readonly", "ngModelChange"], ["for", "hideText"], ["id", "hideText", "type", "checkbox", "name", "HideText", 3, "ngModel", "disabled", "ngModelChange"], [1, "fa", "fa-chevron-down", "fa-sm", "icon"], [1, "fa", "fa-chevron-up", "fa-sm", "icon"], ["for", "currentAccessCount"], ["id", "currentAccessCount", "readonly", "", "type", "text", "name", "CurrentAccessCount", 3, "ngModel", "ngModelChange"], ["for", "password"], [1, "action-buttons"], ["type", "button", "appStopClick", "", "appBlurClick", "", 1, "row-btn", 3, "appA11yTitle", "click"], ["aria-hidden", "true", 1, "fa", "fa-lg", 3, "ngClass"], [1, "box", "list"], [1, "box-content", "single-line"], ["type", "button", "appStopClick", "", "appBlurClick", "", 1, "box-content-row", 3, "appApiAction", "click"], ["deleteBtn", ""], [1, "row-main", "text-danger"], ["aria-hidden", "true", 1, "icon", "text-danger"], [1, "fa", "fa-trash-o", "fa-lg", "fa-fw", 3, "hidden"], [1, "fa", "fa-spinner", "fa-spin", "fa-lg", "fa-fw", 3, "hidden"]], template: function SendAddEditComponent_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "form", 0, 1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("ngSubmit", function SendAddEditComponent_Template_form_ngSubmit_0_listener() { return ctx.submit(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](2, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](3, "header");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](4, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](5, "div", 2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](6, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](7, "button", 3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("click", function SendAddEditComponent_Template_button_click_7_listener() { return ctx.cancel(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](9, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](10, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](11, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](12, "div", 4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](13, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](14, "span", 5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](15);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](16, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](17, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](18, "div", 6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](19, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](20, "button", 7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](21, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](22, "span", 8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](23);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](24, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](25, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](26, "i", 9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](27, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](28, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](29, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](30, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](31, SendAddEditComponent_content_31_Template, 181, 69, "content", 10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](32, "\n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](33, "\n");
+ } if (rf & 2) {
+ const _r0 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵreference"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("appApiAction", ctx.formPromise);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](9, 8, "cancel"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](ctx.title);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("disabled", _r0.loading || ctx.disableSend);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("hidden", _r0.loading);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](24, 10, "save"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("hidden", !_r0.loading);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx.send);
+ } }, directives: [_angular_forms__WEBPACK_IMPORTED_MODULE_14__["ɵangular_packages_forms_forms_ba"], _angular_forms__WEBPACK_IMPORTED_MODULE_14__["NgControlStatusGroup"], _angular_forms__WEBPACK_IMPORTED_MODULE_14__["NgForm"], jslib_angular_directives_api_action_directive__WEBPACK_IMPORTED_MODULE_15__["ApiActionDirective"], jslib_angular_directives_blur_click_directive__WEBPACK_IMPORTED_MODULE_16__["BlurClickDirective"], _angular_common__WEBPACK_IMPORTED_MODULE_0__["NgIf"], jslib_angular_directives_box_row_directive__WEBPACK_IMPORTED_MODULE_17__["BoxRowDirective"], _angular_forms__WEBPACK_IMPORTED_MODULE_14__["DefaultValueAccessor"], _angular_forms__WEBPACK_IMPORTED_MODULE_14__["NgControlStatus"], _angular_forms__WEBPACK_IMPORTED_MODULE_14__["NgModel"], _angular_forms__WEBPACK_IMPORTED_MODULE_14__["CheckboxControlValueAccessor"], _efflux_dates_component__WEBPACK_IMPORTED_MODULE_18__["EffluxDatesComponent"], _angular_forms__WEBPACK_IMPORTED_MODULE_14__["NumberValueAccessor"], jslib_angular_directives_input_verbatim_directive__WEBPACK_IMPORTED_MODULE_19__["InputVerbatimDirective"], jslib_angular_components_callout_component__WEBPACK_IMPORTED_MODULE_20__["CalloutComponent"], _angular_common__WEBPACK_IMPORTED_MODULE_0__["NgForOf"], _angular_forms__WEBPACK_IMPORTED_MODULE_14__["RadioControlValueAccessor"], jslib_angular_directives_stop_click_directive__WEBPACK_IMPORTED_MODULE_21__["StopClickDirective"], jslib_angular_directives_a11y_title_directive__WEBPACK_IMPORTED_MODULE_22__["A11yTitleDirective"], _angular_common__WEBPACK_IMPORTED_MODULE_0__["NgClass"]], pipes: [jslib_angular_pipes_i18n_pipe__WEBPACK_IMPORTED_MODULE_23__["I18nPipe"]], encapsulation: 2 });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵsetClassMetadata"](SendAddEditComponent, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Component"],
+ args: [{
+ selector: 'app-send-add-edit',
+ templateUrl: 'send-add-edit.component.html',
+ }]
+ }], function () { return [{ type: jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_5__["I18nService"] }, { type: jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_8__["PlatformUtilsService"] }, { type: jslib_common_abstractions_user_service__WEBPACK_IMPORTED_MODULE_11__["UserService"] }, { type: jslib_common_abstractions_messaging_service__WEBPACK_IMPORTED_MODULE_7__["MessagingService"] }, { type: jslib_common_abstractions_policy_service__WEBPACK_IMPORTED_MODULE_9__["PolicyService"] }, { type: jslib_common_abstractions_environment_service__WEBPACK_IMPORTED_MODULE_4__["EnvironmentService"] }, { type: _angular_common__WEBPACK_IMPORTED_MODULE_0__["DatePipe"] }, { type: jslib_common_abstractions_send_service__WEBPACK_IMPORTED_MODULE_10__["SendService"] }, { type: _angular_router__WEBPACK_IMPORTED_MODULE_2__["ActivatedRoute"] }, { type: _angular_router__WEBPACK_IMPORTED_MODULE_2__["Router"] }, { type: _angular_common__WEBPACK_IMPORTED_MODULE_0__["Location"] }, { type: _services_popup_utils_service__WEBPACK_IMPORTED_MODULE_12__["PopupUtilsService"] }, { type: jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_6__["LogService"] }]; }, null); })();
+
+
+/***/ }),
+
+/***/ "./src/popup/send/send-groupings.component.ts":
+/*!****************************************************!*\
+ !*** ./src/popup/send/send-groupings.component.ts ***!
+ \****************************************************/
+/*! exports provided: SendGroupingsComponent */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SendGroupingsComponent", function() { return SendGroupingsComponent; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var _angular_router__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @angular/router */ "./node_modules/@angular/router/__ivy_ngcc__/fesm2015/router.js");
+/* harmony import */ var jslib_angular_components_send_send_component__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! jslib-angular/components/send/send.component */ "./jslib/angular/src/components/send/send.component.ts");
+/* harmony import */ var jslib_common_abstractions_environment_service__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! jslib-common/abstractions/environment.service */ "./jslib/common/src/abstractions/environment.service.ts");
+/* harmony import */ var jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! jslib-common/abstractions/i18n.service */ "./jslib/common/src/abstractions/i18n.service.ts");
+/* harmony import */ var jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! jslib-common/abstractions/log.service */ "./jslib/common/src/abstractions/log.service.ts");
+/* harmony import */ var jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! jslib-common/abstractions/platformUtils.service */ "./jslib/common/src/abstractions/platformUtils.service.ts");
+/* harmony import */ var jslib_common_abstractions_policy_service__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! jslib-common/abstractions/policy.service */ "./jslib/common/src/abstractions/policy.service.ts");
+/* harmony import */ var jslib_common_abstractions_search_service__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! jslib-common/abstractions/search.service */ "./jslib/common/src/abstractions/search.service.ts");
+/* harmony import */ var jslib_common_abstractions_send_service__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! jslib-common/abstractions/send.service */ "./jslib/common/src/abstractions/send.service.ts");
+/* harmony import */ var jslib_common_abstractions_state_service__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! jslib-common/abstractions/state.service */ "./jslib/common/src/abstractions/state.service.ts");
+/* harmony import */ var jslib_common_abstractions_sync_service__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! jslib-common/abstractions/sync.service */ "./jslib/common/src/abstractions/sync.service.ts");
+/* harmony import */ var jslib_common_abstractions_user_service__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! jslib-common/abstractions/user.service */ "./jslib/common/src/abstractions/user.service.ts");
+/* harmony import */ var jslib_angular_services_broadcaster_service__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! jslib-angular/services/broadcaster.service */ "./jslib/angular/src/services/broadcaster.service.ts");
+/* harmony import */ var _services_popup_utils_service__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../services/popup-utils.service */ "./src/popup/services/popup-utils.service.ts");
+/* harmony import */ var _angular_common__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @angular/common */ "./node_modules/@angular/common/__ivy_ngcc__/fesm2015/common.js");
+/* harmony import */ var _angular_forms__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @angular/forms */ "./node_modules/@angular/forms/__ivy_ngcc__/fesm2015/forms.js");
+/* harmony import */ var jslib_angular_directives_autofocus_directive__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! jslib-angular/directives/autofocus.directive */ "./jslib/angular/src/directives/autofocus.directive.ts");
+/* harmony import */ var jslib_angular_directives_blur_click_directive__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! jslib-angular/directives/blur-click.directive */ "./jslib/angular/src/directives/blur-click.directive.ts");
+/* harmony import */ var jslib_angular_directives_a11y_title_directive__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! jslib-angular/directives/a11y-title.directive */ "./jslib/angular/src/directives/a11y-title.directive.ts");
+/* harmony import */ var _components_pop_out_component__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../components/pop-out.component */ "./src/popup/components/pop-out.component.ts");
+/* harmony import */ var jslib_angular_components_callout_component__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! jslib-angular/components/callout.component */ "./jslib/angular/src/components/callout.component.ts");
+/* harmony import */ var jslib_angular_directives_stop_click_directive__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! jslib-angular/directives/stop-click.directive */ "./jslib/angular/src/directives/stop-click.directive.ts");
+/* harmony import */ var _components_send_list_component__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ../components/send-list.component */ "./src/popup/components/send-list.component.ts");
+/* harmony import */ var jslib_angular_pipes_i18n_pipe__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! jslib-angular/pipes/i18n.pipe */ "./jslib/angular/src/pipes/i18n.pipe.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+function SendGroupingsComponent_div_2_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "div", 11);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](2, "app-pop-out");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} }
+function SendGroupingsComponent_app_callout_24_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "app-callout", 12);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](1, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](3, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate"]("title", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](1, 2, "sendDisabled"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate1"]("\n ", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](3, 4, "sendDisabledWarning"), "\n ");
+} }
+function SendGroupingsComponent_div_26_i_2_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](0, "i", 15);
+} }
+function SendGroupingsComponent_div_26_ng_container_4_Template(rf, ctx) { if (rf & 1) {
+ const _r8 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementContainerStart"](0);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](2, "i", 16);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](4, "p");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](6, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](8, "button", 17);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("click", function SendGroupingsComponent_div_26_ng_container_4_Template_button_click_8_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r8); const ctx_r7 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](2); return ctx_r7.addSend(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](10, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](11, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementContainerEnd"]();
+} if (rf & 2) {
+ const ctx_r6 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](6, 3, "noItemsInList"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("disabled", ctx_r6.disableSend);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](10, 5, "addSend"));
+} }
+function SendGroupingsComponent_div_26_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "div", 13);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](2, SendGroupingsComponent_div_26_i_2_Template, 1, 0, "i", 14);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](4, SendGroupingsComponent_div_26_ng_container_4_Template, 12, 7, "ng-container", 10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r2 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", !ctx_r2.loaded);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", ctx_r2.loaded);
+} }
+function SendGroupingsComponent_ng_container_28_Template(rf, ctx) { if (rf & 1) {
+ const _r10 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementContainerStart"](0);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](2, "div", 18);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](4, "div", 19);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](6, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](8, "div", 20);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](9, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](10, "button", 21);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("click", function SendGroupingsComponent_ng_container_28_Template_button_click_10_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r10); const ctx_r9 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](); return ctx_r9.selectType(ctx_r9.sendType.Text); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](11, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](12, "div", 22);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](13, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](14, "div", 23);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](15, "i", 24);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](16, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](17, "span", 25);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](18);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](19, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](20, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](21, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](22, "span", 26);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](23);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](24, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](25, "span");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](26, "i", 27);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](27, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](28, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](29, "button", 21);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("click", function SendGroupingsComponent_ng_container_28_Template_button_click_29_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r10); const ctx_r11 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](); return ctx_r11.selectType(ctx_r11.sendType.File); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](30, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](31, "div", 22);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](32, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](33, "div", 23);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](34, "i", 28);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](35, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](36, "span", 25);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](37);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](38, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](39, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](40, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](41, "span", 26);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](42);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](43, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](44, "span");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](45, "i", 27);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](46, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](47, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](48, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](49, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](50, "div", 18);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](51, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](52, "div", 19);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](53);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](54, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](55, "div", 29);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](56);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](57, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](58, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](59, "div", 30);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](60, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](61, "app-send-list", 31);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("onSelected", function SendGroupingsComponent_ng_container_28_Template_app_send_list_onSelected_61_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r10); const ctx_r12 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](); return ctx_r12.selectSend($event); })("onCopySendLink", function SendGroupingsComponent_ng_container_28_Template_app_send_list_onCopySendLink_61_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r10); const ctx_r13 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](); return ctx_r13.copy($event); })("onRemovePassword", function SendGroupingsComponent_ng_container_28_Template_app_send_list_onRemovePassword_61_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r10); const ctx_r14 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](); return ctx_r14.removePassword($event); })("onDeleteSend", function SendGroupingsComponent_ng_container_28_Template_app_send_list_onDeleteSend_61_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r10); const ctx_r15 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](); return ctx_r15.delete($event); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](62, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](63, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](64, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](65, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementContainerEnd"]();
+} if (rf & 2) {
+ const ctx_r3 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate1"]("\n ", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](6, 10, "types"), "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](13);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](19, 12, "sendTypeText"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](ctx_r3.typeCounts.get(ctx_r3.sendType.Text) || 0);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](14);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](38, 14, "sendTypeFile"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](ctx_r3.typeCounts.get(ctx_r3.sendType.File) || 0);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](11);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate1"]("\n ", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](54, 16, "allSends"), "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](ctx_r3.sends.length);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate"]("title", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](62, 18, "editItem"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("sends", ctx_r3.sends)("disabledByPolicy", ctx_r3.disableSend);
+} }
+function SendGroupingsComponent_ng_container_30_div_2_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "div", 13);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](2, "p");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](4, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](4, 1, "noItemsInList"));
+} }
+function SendGroupingsComponent_ng_container_30_div_4_Template(rf, ctx) { if (rf & 1) {
+ const _r19 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "div", 33);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](2, "div", 30);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](4, "app-send-list", 31);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("onSelected", function SendGroupingsComponent_ng_container_30_div_4_Template_app_send_list_onSelected_4_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r19); const ctx_r18 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](2); return ctx_r18.selectSend($event); })("onCopySendLink", function SendGroupingsComponent_ng_container_30_div_4_Template_app_send_list_onCopySendLink_4_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r19); const ctx_r20 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](2); return ctx_r20.copy($event); })("onRemovePassword", function SendGroupingsComponent_ng_container_30_div_4_Template_app_send_list_onRemovePassword_4_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r19); const ctx_r21 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](2); return ctx_r21.removePassword($event); })("onDeleteSend", function SendGroupingsComponent_ng_container_30_div_4_Template_app_send_list_onDeleteSend_4_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r19); const ctx_r22 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](2); return ctx_r22.delete($event); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](5, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](6, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](8, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r17 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate"]("title", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](5, 3, "editItem"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("sends", ctx_r17.filteredSends)("disabledByPolicy", ctx_r17.disableSend);
+} }
+function SendGroupingsComponent_ng_container_30_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementContainerStart"](0);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](2, SendGroupingsComponent_ng_container_30_div_2_Template, 6, 3, "div", 9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](4, SendGroupingsComponent_ng_container_30_div_4_Template, 9, 5, "div", 32);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementContainerEnd"]();
+} if (rf & 2) {
+ const ctx_r4 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", !ctx_r4.filteredSends || !ctx_r4.filteredSends.length);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", ctx_r4.filteredSends && ctx_r4.filteredSends.length > 0);
+} }
+const _c0 = function (a0, a1) { return { "flex": a0, "tab-page": a1 }; };
+const ComponentId = 'SendComponent';
+const ScopeStateId = ComponentId + 'Scope';
+class SendGroupingsComponent extends jslib_angular_components_send_send_component__WEBPACK_IMPORTED_MODULE_2__["SendComponent"] {
+ constructor(sendService, i18nService, platformUtilsService, environmentService, ngZone, policyService, userService, searchService, popupUtils, stateService, router, syncService, changeDetectorRef, broadcasterService, logService) {
+ super(sendService, i18nService, platformUtilsService, environmentService, ngZone, searchService, policyService, userService, logService);
+ this.popupUtils = popupUtils;
+ this.stateService = stateService;
+ this.router = router;
+ this.syncService = syncService;
+ this.changeDetectorRef = changeDetectorRef;
+ this.broadcasterService = broadcasterService;
+ // Header
+ this.showLeftHeader = true;
+ // Send Type Calculations
+ this.typeCounts = new Map();
+ super.onSuccessfulLoad = () => __awaiter(this, void 0, void 0, function* () {
+ this.calculateTypeCounts();
+ this.selectAll();
+ });
+ }
+ ngOnInit() {
+ const _super = Object.create(null, {
+ ngOnInit: { get: () => super.ngOnInit }
+ });
+ return __awaiter(this, void 0, void 0, function* () {
+ // Determine Header details
+ this.showLeftHeader = !(this.popupUtils.inSidebar(window) && this.platformUtilsService.isFirefox());
+ // Clear state of Send Type Component
+ this.stateService.remove('SendTypeComponent');
+ // Let super class finish
+ yield _super.ngOnInit.call(this);
+ // Handle State Restore if necessary
+ const restoredScopeState = yield this.restoreState();
+ this.state = (yield this.stateService.get(ComponentId)) || {};
+ if (this.state.searchText != null) {
+ this.searchText = this.state.searchText;
+ }
+ if (!this.syncService.syncInProgress) {
+ this.load();
+ }
+ else {
+ this.loadedTimeout = window.setTimeout(() => {
+ if (!this.loaded) {
+ this.load();
+ }
+ }, 5000);
+ }
+ if (!this.syncService.syncInProgress || restoredScopeState) {
+ window.setTimeout(() => this.popupUtils.setContentScrollY(window, this.state.scrollY), 0);
+ }
+ // Load all sends if sync completed in background
+ this.broadcasterService.subscribe(ComponentId, (message) => {
+ this.ngZone.run(() => __awaiter(this, void 0, void 0, function* () {
+ switch (message.command) {
+ case 'syncCompleted':
+ window.setTimeout(() => {
+ this.load();
+ }, 500);
+ break;
+ default:
+ break;
+ }
+ this.changeDetectorRef.detectChanges();
+ }));
+ });
+ });
+ }
+ ngOnDestroy() {
+ // Remove timeout
+ if (this.loadedTimeout != null) {
+ window.clearTimeout(this.loadedTimeout);
+ }
+ // Save state
+ this.saveState();
+ // Unsubscribe
+ this.broadcasterService.unsubscribe(ComponentId);
+ }
+ selectType(type) {
+ return __awaiter(this, void 0, void 0, function* () {
+ this.router.navigate(['/send-type'], { queryParams: { type: type } });
+ });
+ }
+ selectSend(s) {
+ return __awaiter(this, void 0, void 0, function* () {
+ this.router.navigate(['/edit-send'], { queryParams: { sendId: s.id } });
+ });
+ }
+ addSend() {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (this.disableSend) {
+ return;
+ }
+ this.router.navigate(['/add-send']);
+ });
+ }
+ removePassword(s) {
+ const _super = Object.create(null, {
+ removePassword: { get: () => super.removePassword }
+ });
+ return __awaiter(this, void 0, void 0, function* () {
+ if (this.disableSend) {
+ return;
+ }
+ _super.removePassword.call(this, s);
+ });
+ }
+ showSearching() {
+ return this.hasSearched || (!this.searchPending && this.searchService.isSearchable(this.searchText));
+ }
+ calculateTypeCounts() {
+ // Create type counts
+ const typeCounts = new Map();
+ this.sends.forEach(s => {
+ if (typeCounts.has(s.type)) {
+ typeCounts.set(s.type, typeCounts.get(s.type) + 1);
+ }
+ else {
+ typeCounts.set(s.type, 1);
+ }
+ });
+ this.typeCounts = typeCounts;
+ }
+ saveState() {
+ return __awaiter(this, void 0, void 0, function* () {
+ this.state = {
+ scrollY: this.popupUtils.getContentScrollY(window),
+ searchText: this.searchText,
+ };
+ yield this.stateService.save(ComponentId, this.state);
+ this.scopeState = {
+ sends: this.sends,
+ typeCounts: this.typeCounts,
+ };
+ yield this.stateService.save(ScopeStateId, this.scopeState);
+ });
+ }
+ restoreState() {
+ return __awaiter(this, void 0, void 0, function* () {
+ this.scopeState = yield this.stateService.get(ScopeStateId);
+ if (this.scopeState == null) {
+ return false;
+ }
+ if (this.scopeState.sends != null) {
+ this.sends = this.scopeState.sends;
+ }
+ if (this.scopeState.typeCounts != null) {
+ this.typeCounts = this.scopeState.typeCounts;
+ }
+ return true;
+ });
+ }
+}
+SendGroupingsComponent.ɵfac = function SendGroupingsComponent_Factory(t) { return new (t || SendGroupingsComponent)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_send_service__WEBPACK_IMPORTED_MODULE_9__["SendService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_4__["I18nService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_6__["PlatformUtilsService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_environment_service__WEBPACK_IMPORTED_MODULE_3__["EnvironmentService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["NgZone"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_policy_service__WEBPACK_IMPORTED_MODULE_7__["PolicyService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_user_service__WEBPACK_IMPORTED_MODULE_12__["UserService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_search_service__WEBPACK_IMPORTED_MODULE_8__["SearchService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_services_popup_utils_service__WEBPACK_IMPORTED_MODULE_14__["PopupUtilsService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_state_service__WEBPACK_IMPORTED_MODULE_10__["StateService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_router__WEBPACK_IMPORTED_MODULE_1__["Router"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_sync_service__WEBPACK_IMPORTED_MODULE_11__["SyncService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ChangeDetectorRef"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_angular_services_broadcaster_service__WEBPACK_IMPORTED_MODULE_13__["BroadcasterService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_5__["LogService"])); };
+SendGroupingsComponent.ɵcmp = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineComponent"]({ type: SendGroupingsComponent, selectors: [["app-send-groupings"]], features: [_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵInheritDefinitionFeature"]], decls: 33, vars: 17, consts: [["class", "left", 4, "ngIf"], [1, "search"], ["type", "search", "id", "search", "autocomplete", "off", "appAutofocus", "", 3, "placeholder", "ngModel", "ngModelChange", "input"], [1, "fa", "fa-search"], [1, "right"], ["type", "button", "appBlurClick", "", 3, "appA11yTitle", "disabled", "click"], ["aria-hidden", "true", 1, "fa", "fa-plus", "fa-lg", "fa-fw"], [3, "ngClass"], ["type", "warning", 3, "title", 4, "ngIf"], ["class", "no-items", 4, "ngIf"], [4, "ngIf"], [1, "left"], ["type", "warning", 3, "title"], [1, "no-items"], ["class", "fa fa-spinner fa-spin fa-3x", 4, "ngIf"], [1, "fa", "fa-spinner", "fa-spin", "fa-3x"], [1, "fa", "fa-frown-o", "fa-4x"], ["type", "button", 1, "btn", "block", "primary", "link", 3, "disabled", "click"], [1, "box", "list"], [1, "box-header"], [1, "box-content", "single-line"], ["type", "button", "appStopClick", "", "appBlurClick", "", 1, "box-content-row", 3, "click"], [1, "row-main"], [1, "icon"], [1, "fa", "fa-fw", "fa-lg", "fa-file-text-o"], [1, "text"], [1, "row-sub-label"], [1, "fa", "fa-chevron-right", "fa-lg", "row-sub-icon"], [1, "fa", "fa-fw", "fa-lg", "fa-file-o"], [1, "flex-right"], [1, "box-content"], [3, "sends", "title", "disabledByPolicy", "onSelected", "onCopySendLink", "onRemovePassword", "onDeleteSend"], ["class", "box list full-list", 4, "ngIf"], [1, "box", "list", "full-list"]], template: function SendGroupingsComponent_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "header");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](2, SendGroupingsComponent_div_2_Template, 4, 0, "div", 0);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](4, "div", 1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](6, "input", 2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("ngModelChange", function SendGroupingsComponent_Template_input_ngModelChange_6_listener($event) { return ctx.searchText = $event; })("input", function SendGroupingsComponent_Template_input_input_6_listener() { return ctx.search(200); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](7, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](8, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](9, "i", 3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](10, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](11, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](12, "div", 4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](13, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](14, "button", 5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("click", function SendGroupingsComponent_Template_button_click_14_listener() { return ctx.addSend(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](15, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](16, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](17, "i", 6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](18, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](19, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](20, "\n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](21, "\n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](22, "content", 7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](23, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](24, SendGroupingsComponent_app_callout_24_Template, 4, 6, "app-callout", 8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](25, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](26, SendGroupingsComponent_div_26_Template, 6, 2, "div", 9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](27, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](28, SendGroupingsComponent_ng_container_28_Template, 66, 20, "ng-container", 10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](29, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](30, SendGroupingsComponent_ng_container_30_Template, 6, 2, "ng-container", 10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](31, "\n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](32, "\n");
+ } if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", ctx.showLeftHeader);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate"]("placeholder", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](7, 10, "searchSends"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngModel", ctx.searchText);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate"]("appA11yTitle", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](15, 12, "addSend"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("disabled", ctx.disableSend);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngClass", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpureFunction2"](14, _c0, ctx.disableSend, ctx.disableSend));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", ctx.disableSend);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", (!ctx.sends || !ctx.sends.length) && !ctx.showSearching());
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", ctx.sends && ctx.sends.length && !ctx.showSearching());
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", ctx.showSearching());
+ } }, directives: [_angular_common__WEBPACK_IMPORTED_MODULE_15__["NgIf"], _angular_forms__WEBPACK_IMPORTED_MODULE_16__["DefaultValueAccessor"], jslib_angular_directives_autofocus_directive__WEBPACK_IMPORTED_MODULE_17__["AutofocusDirective"], _angular_forms__WEBPACK_IMPORTED_MODULE_16__["NgControlStatus"], _angular_forms__WEBPACK_IMPORTED_MODULE_16__["NgModel"], jslib_angular_directives_blur_click_directive__WEBPACK_IMPORTED_MODULE_18__["BlurClickDirective"], jslib_angular_directives_a11y_title_directive__WEBPACK_IMPORTED_MODULE_19__["A11yTitleDirective"], _angular_common__WEBPACK_IMPORTED_MODULE_15__["NgClass"], _components_pop_out_component__WEBPACK_IMPORTED_MODULE_20__["PopOutComponent"], jslib_angular_components_callout_component__WEBPACK_IMPORTED_MODULE_21__["CalloutComponent"], jslib_angular_directives_stop_click_directive__WEBPACK_IMPORTED_MODULE_22__["StopClickDirective"], _components_send_list_component__WEBPACK_IMPORTED_MODULE_23__["SendListComponent"]], pipes: [jslib_angular_pipes_i18n_pipe__WEBPACK_IMPORTED_MODULE_24__["I18nPipe"]], encapsulation: 2 });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](SendGroupingsComponent, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Component"],
+ args: [{
+ selector: 'app-send-groupings',
+ templateUrl: 'send-groupings.component.html',
+ }]
+ }], function () { return [{ type: jslib_common_abstractions_send_service__WEBPACK_IMPORTED_MODULE_9__["SendService"] }, { type: jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_4__["I18nService"] }, { type: jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_6__["PlatformUtilsService"] }, { type: jslib_common_abstractions_environment_service__WEBPACK_IMPORTED_MODULE_3__["EnvironmentService"] }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["NgZone"] }, { type: jslib_common_abstractions_policy_service__WEBPACK_IMPORTED_MODULE_7__["PolicyService"] }, { type: jslib_common_abstractions_user_service__WEBPACK_IMPORTED_MODULE_12__["UserService"] }, { type: jslib_common_abstractions_search_service__WEBPACK_IMPORTED_MODULE_8__["SearchService"] }, { type: _services_popup_utils_service__WEBPACK_IMPORTED_MODULE_14__["PopupUtilsService"] }, { type: jslib_common_abstractions_state_service__WEBPACK_IMPORTED_MODULE_10__["StateService"] }, { type: _angular_router__WEBPACK_IMPORTED_MODULE_1__["Router"] }, { type: jslib_common_abstractions_sync_service__WEBPACK_IMPORTED_MODULE_11__["SyncService"] }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["ChangeDetectorRef"] }, { type: jslib_angular_services_broadcaster_service__WEBPACK_IMPORTED_MODULE_13__["BroadcasterService"] }, { type: jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_5__["LogService"] }]; }, null); })();
+
+
+/***/ }),
+
+/***/ "./src/popup/send/send-type.component.ts":
+/*!***********************************************!*\
+ !*** ./src/popup/send/send-type.component.ts ***!
+ \***********************************************/
+/*! exports provided: SendTypeComponent */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SendTypeComponent", function() { return SendTypeComponent; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var _angular_router__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @angular/router */ "./node_modules/@angular/router/__ivy_ngcc__/fesm2015/router.js");
+/* harmony import */ var rxjs_operators__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! rxjs/operators */ "./node_modules/rxjs/_esm5/operators/index.js");
+/* harmony import */ var _angular_common__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @angular/common */ "./node_modules/@angular/common/__ivy_ngcc__/fesm2015/common.js");
+/* harmony import */ var jslib_angular_components_send_send_component__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! jslib-angular/components/send/send.component */ "./jslib/angular/src/components/send/send.component.ts");
+/* harmony import */ var jslib_common_abstractions_environment_service__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! jslib-common/abstractions/environment.service */ "./jslib/common/src/abstractions/environment.service.ts");
+/* harmony import */ var jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! jslib-common/abstractions/i18n.service */ "./jslib/common/src/abstractions/i18n.service.ts");
+/* harmony import */ var jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! jslib-common/abstractions/log.service */ "./jslib/common/src/abstractions/log.service.ts");
+/* harmony import */ var jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! jslib-common/abstractions/platformUtils.service */ "./jslib/common/src/abstractions/platformUtils.service.ts");
+/* harmony import */ var jslib_common_abstractions_policy_service__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! jslib-common/abstractions/policy.service */ "./jslib/common/src/abstractions/policy.service.ts");
+/* harmony import */ var jslib_common_abstractions_search_service__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! jslib-common/abstractions/search.service */ "./jslib/common/src/abstractions/search.service.ts");
+/* harmony import */ var jslib_common_abstractions_send_service__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! jslib-common/abstractions/send.service */ "./jslib/common/src/abstractions/send.service.ts");
+/* harmony import */ var jslib_common_abstractions_state_service__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! jslib-common/abstractions/state.service */ "./jslib/common/src/abstractions/state.service.ts");
+/* harmony import */ var jslib_common_abstractions_user_service__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! jslib-common/abstractions/user.service */ "./jslib/common/src/abstractions/user.service.ts");
+/* harmony import */ var jslib_angular_services_broadcaster_service__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! jslib-angular/services/broadcaster.service */ "./jslib/angular/src/services/broadcaster.service.ts");
+/* harmony import */ var _services_popup_utils_service__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../services/popup-utils.service */ "./src/popup/services/popup-utils.service.ts");
+/* harmony import */ var jslib_common_enums_sendType__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! jslib-common/enums/sendType */ "./jslib/common/src/enums/sendType.ts");
+/* harmony import */ var jslib_angular_directives_blur_click_directive__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! jslib-angular/directives/blur-click.directive */ "./jslib/angular/src/directives/blur-click.directive.ts");
+/* harmony import */ var _angular_forms__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! @angular/forms */ "./node_modules/@angular/forms/__ivy_ngcc__/fesm2015/forms.js");
+/* harmony import */ var jslib_angular_directives_autofocus_directive__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! jslib-angular/directives/autofocus.directive */ "./jslib/angular/src/directives/autofocus.directive.ts");
+/* harmony import */ var jslib_angular_directives_a11y_title_directive__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! jslib-angular/directives/a11y-title.directive */ "./jslib/angular/src/directives/a11y-title.directive.ts");
+/* harmony import */ var jslib_angular_components_callout_component__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! jslib-angular/components/callout.component */ "./jslib/angular/src/components/callout.component.ts");
+/* harmony import */ var _components_send_list_component__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ../components/send-list.component */ "./src/popup/components/send-list.component.ts");
+/* harmony import */ var jslib_angular_pipes_i18n_pipe__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! jslib-angular/pipes/i18n.pipe */ "./jslib/angular/src/pipes/i18n.pipe.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+function SendTypeComponent_app_callout_35_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "app-callout", 14);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](1, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](3, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate"]("title", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](1, 2, "sendDisabled"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate1"]("\n ", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](3, 4, "sendDisabledWarning"), "\n ");
+} }
+function SendTypeComponent_div_37_i_2_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](0, "i", 18);
+} }
+function SendTypeComponent_div_37_ng_container_4_Template(rf, ctx) { if (rf & 1) {
+ const _r6 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementContainerStart"](0);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](2, "p");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](4, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](6, "button", 19);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("click", function SendTypeComponent_div_37_ng_container_4_Template_button_click_6_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r6); const ctx_r5 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](2); return ctx_r5.addSend(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](8, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](9, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementContainerEnd"]();
+} if (rf & 2) {
+ const ctx_r4 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](4, 3, "noItemsInList"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("disabled", ctx_r4.disableSend);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate1"]("\n ", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](8, 5, "addSend"), "\n ");
+} }
+function SendTypeComponent_div_37_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "div", 15);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](2, SendTypeComponent_div_37_i_2_Template, 1, 0, "i", 16);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](4, SendTypeComponent_div_37_ng_container_4_Template, 10, 7, "ng-container", 17);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r1 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", !ctx_r1.loaded);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", ctx_r1.loaded);
+} }
+function SendTypeComponent_div_39_Template(rf, ctx) { if (rf & 1) {
+ const _r8 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "div", 20);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](2, "div", 21);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](4, "span", 22);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](6, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](8, "div", 23);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](9, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](10, "app-send-list", 24);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("onSelected", function SendTypeComponent_div_39_Template_app_send_list_onSelected_10_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r8); const ctx_r7 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](); return ctx_r7.selectSend($event); })("onCopySendLink", function SendTypeComponent_div_39_Template_app_send_list_onCopySendLink_10_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r8); const ctx_r9 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](); return ctx_r9.copy($event); })("onRemovePassword", function SendTypeComponent_div_39_Template_app_send_list_onRemovePassword_10_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r8); const ctx_r10 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](); return ctx_r10.removePassword($event); })("onDeleteSend", function SendTypeComponent_div_39_Template_app_send_list_onDeleteSend_10_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r8); const ctx_r11 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](); return ctx_r11.delete($event); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](11, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](12, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](13, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](14, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r2 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate1"]("\n ", ctx_r2.groupingTitle, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](ctx_r2.filteredSends.length);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate"]("title", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](11, 5, "editItem"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("sends", ctx_r2.filteredSends)("disabledByPolicy", ctx_r2.disableSend);
+} }
+const _c0 = function (a0) { return { "flex": a0 }; };
+const ComponentId = 'SendTypeComponent';
+class SendTypeComponent extends jslib_angular_components_send_send_component__WEBPACK_IMPORTED_MODULE_4__["SendComponent"] {
+ constructor(sendService, i18nService, platformUtilsService, environmentService, ngZone, policyService, userService, searchService, popupUtils, stateService, route, location, changeDetectorRef, broadcasterService, router, logService) {
+ super(sendService, i18nService, platformUtilsService, environmentService, ngZone, searchService, policyService, userService, logService);
+ this.popupUtils = popupUtils;
+ this.stateService = stateService;
+ this.route = route;
+ this.location = location;
+ this.changeDetectorRef = changeDetectorRef;
+ this.broadcasterService = broadcasterService;
+ this.router = router;
+ this.applySavedState = true;
+ super.onSuccessfulLoad = () => __awaiter(this, void 0, void 0, function* () {
+ this.selectType(this.type);
+ });
+ this.applySavedState = window.previousPopupUrl != null &&
+ !window.previousPopupUrl.startsWith('/send-type');
+ }
+ ngOnInit() {
+ const _super = Object.create(null, {
+ ngOnInit: { get: () => super.ngOnInit }
+ });
+ return __awaiter(this, void 0, void 0, function* () {
+ // Let super class finish
+ yield _super.ngOnInit.call(this);
+ this.route.queryParams.pipe(Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_2__["first"])()).subscribe((params) => __awaiter(this, void 0, void 0, function* () {
+ if (this.applySavedState) {
+ this.state = (yield this.stateService.get(ComponentId)) || {};
+ if (this.state.searchText != null) {
+ this.searchText = this.state.searchText;
+ }
+ }
+ if (params.type != null) {
+ this.type = parseInt(params.type, null);
+ switch (this.type) {
+ case jslib_common_enums_sendType__WEBPACK_IMPORTED_MODULE_16__["SendType"].Text:
+ this.groupingTitle = this.i18nService.t('sendTypeText');
+ break;
+ case jslib_common_enums_sendType__WEBPACK_IMPORTED_MODULE_16__["SendType"].File:
+ this.groupingTitle = this.i18nService.t('sendTypeFile');
+ break;
+ default:
+ break;
+ }
+ yield this.load(s => s.type === this.type);
+ }
+ // Restore state and remove reference
+ if (this.applySavedState && this.state != null) {
+ window.setTimeout(() => this.popupUtils.setContentScrollY(window, this.state.scrollY), 0);
+ }
+ this.stateService.remove(ComponentId);
+ }));
+ // Refresh Send list if sync completed in background
+ this.broadcasterService.subscribe(ComponentId, (message) => {
+ this.ngZone.run(() => __awaiter(this, void 0, void 0, function* () {
+ switch (message.command) {
+ case 'syncCompleted':
+ if (message.successfully) {
+ this.refreshTimeout = window.setTimeout(() => {
+ this.refresh();
+ }, 500);
+ }
+ break;
+ default:
+ break;
+ }
+ this.changeDetectorRef.detectChanges();
+ }));
+ });
+ });
+ }
+ ngOnDestroy() {
+ // Remove timeout
+ if (this.refreshTimeout != null) {
+ window.clearTimeout(this.refreshTimeout);
+ }
+ // Save state
+ this.saveState();
+ // Unsubscribe
+ this.broadcasterService.unsubscribe(ComponentId);
+ }
+ selectSend(s) {
+ return __awaiter(this, void 0, void 0, function* () {
+ this.router.navigate(['/edit-send'], { queryParams: { sendId: s.id } });
+ });
+ }
+ addSend() {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (this.disableSend) {
+ return;
+ }
+ this.router.navigate(['/add-send'], { queryParams: { type: this.type } });
+ });
+ }
+ removePassword(s) {
+ const _super = Object.create(null, {
+ removePassword: { get: () => super.removePassword }
+ });
+ return __awaiter(this, void 0, void 0, function* () {
+ if (this.disableSend) {
+ return;
+ }
+ _super.removePassword.call(this, s);
+ });
+ }
+ back() {
+ window.routeDirection = 'b';
+ this.location.back();
+ }
+ saveState() {
+ return __awaiter(this, void 0, void 0, function* () {
+ this.state = {
+ scrollY: this.popupUtils.getContentScrollY(window),
+ searchText: this.searchText,
+ };
+ yield this.stateService.save(ComponentId, this.state);
+ });
+ }
+}
+SendTypeComponent.ɵfac = function SendTypeComponent_Factory(t) { return new (t || SendTypeComponent)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_send_service__WEBPACK_IMPORTED_MODULE_11__["SendService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_6__["I18nService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_8__["PlatformUtilsService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_environment_service__WEBPACK_IMPORTED_MODULE_5__["EnvironmentService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["NgZone"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_policy_service__WEBPACK_IMPORTED_MODULE_9__["PolicyService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_user_service__WEBPACK_IMPORTED_MODULE_13__["UserService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_search_service__WEBPACK_IMPORTED_MODULE_10__["SearchService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_services_popup_utils_service__WEBPACK_IMPORTED_MODULE_15__["PopupUtilsService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_state_service__WEBPACK_IMPORTED_MODULE_12__["StateService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_router__WEBPACK_IMPORTED_MODULE_1__["ActivatedRoute"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_common__WEBPACK_IMPORTED_MODULE_3__["Location"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ChangeDetectorRef"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_angular_services_broadcaster_service__WEBPACK_IMPORTED_MODULE_14__["BroadcasterService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_router__WEBPACK_IMPORTED_MODULE_1__["Router"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_7__["LogService"])); };
+SendTypeComponent.ɵcmp = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineComponent"]({ type: SendTypeComponent, selectors: [["app-send-type"]], features: [_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵInheritDefinitionFeature"]], decls: 42, vars: 17, consts: [[1, "left"], ["type", "button", "appBlurClick", "", 3, "click"], [1, "header-icon"], ["aria-hidden", "true", 1, "fa", "fa-chevron-left"], [1, "search"], ["type", "search", "id", "search", "autocomplete", "off", "appAutofocus", "", 3, "placeholder", "ngModel", "ngModelChange", "input"], [1, "fa", "fa-search"], [1, "right"], ["type", "button", "appBlurClick", "", 3, "appA11yTitle", "disabled", "click"], ["aria-hidden", "true", 1, "fa", "fa-plus", "fa-lg", "fa-fw"], [3, "ngClass"], ["type", "warning", 3, "title", 4, "ngIf"], ["class", "no-items", 4, "ngIf"], ["class", "box list only-list", 4, "ngIf"], ["type", "warning", 3, "title"], [1, "no-items"], ["class", "fa fa-spinner fa-spin fa-3x", "aria-hidden", "true", 4, "ngIf"], [4, "ngIf"], ["aria-hidden", "true", 1, "fa", "fa-spinner", "fa-spin", "fa-3x"], ["type", "button", 1, "btn", "block", "primary", "link", 3, "disabled", "click"], [1, "box", "list", "only-list"], [1, "box-header"], [1, "flex-right"], [1, "box-content"], [3, "sends", "title", "disabledByPolicy", "onSelected", "onCopySendLink", "onRemovePassword", "onDeleteSend"]], template: function SendTypeComponent_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "header");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](2, "div", 0);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](4, "button", 1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("click", function SendTypeComponent_Template_button_click_4_listener() { return ctx.back(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](6, "span", 2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](7, "i", 3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](8, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](9, "span");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](11, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](12, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](13, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](14, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](15, "div", 4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](16, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](17, "input", 5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("ngModelChange", function SendTypeComponent_Template_input_ngModelChange_17_listener($event) { return ctx.searchText = $event; })("input", function SendTypeComponent_Template_input_input_17_listener() { return ctx.search(200); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](18, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](19, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](20, "i", 6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](21, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](22, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](23, "div", 7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](24, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](25, "button", 8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("click", function SendTypeComponent_Template_button_click_25_listener() { return ctx.addSend(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](26, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](27, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](28, "i", 9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](29, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](30, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](31, "\n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](32, "\n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](33, "content", 10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](34, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](35, SendTypeComponent_app_callout_35_Template, 4, 6, "app-callout", 11);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](36, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](37, SendTypeComponent_div_37_Template, 6, 2, "div", 12);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](38, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](39, SendTypeComponent_div_39_Template, 15, 7, "div", 13);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](40, "\n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](41, "\n");
+ } if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](11, 9, "back"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate"]("placeholder", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](18, 11, "searchType"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngModel", ctx.searchText);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate"]("appA11yTitle", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](26, 13, "addSend"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("disabled", ctx.disableSend);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngClass", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpureFunction1"](15, _c0, ctx.disableSend));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", ctx.disableSend);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", !ctx.filteredSends.length);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", ctx.filteredSends.length);
+ } }, directives: [jslib_angular_directives_blur_click_directive__WEBPACK_IMPORTED_MODULE_17__["BlurClickDirective"], _angular_forms__WEBPACK_IMPORTED_MODULE_18__["DefaultValueAccessor"], jslib_angular_directives_autofocus_directive__WEBPACK_IMPORTED_MODULE_19__["AutofocusDirective"], _angular_forms__WEBPACK_IMPORTED_MODULE_18__["NgControlStatus"], _angular_forms__WEBPACK_IMPORTED_MODULE_18__["NgModel"], jslib_angular_directives_a11y_title_directive__WEBPACK_IMPORTED_MODULE_20__["A11yTitleDirective"], _angular_common__WEBPACK_IMPORTED_MODULE_3__["NgClass"], _angular_common__WEBPACK_IMPORTED_MODULE_3__["NgIf"], jslib_angular_components_callout_component__WEBPACK_IMPORTED_MODULE_21__["CalloutComponent"], _components_send_list_component__WEBPACK_IMPORTED_MODULE_22__["SendListComponent"]], pipes: [jslib_angular_pipes_i18n_pipe__WEBPACK_IMPORTED_MODULE_23__["I18nPipe"]], encapsulation: 2 });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](SendTypeComponent, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Component"],
+ args: [{
+ selector: 'app-send-type',
+ templateUrl: 'send-type.component.html',
+ }]
+ }], function () { return [{ type: jslib_common_abstractions_send_service__WEBPACK_IMPORTED_MODULE_11__["SendService"] }, { type: jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_6__["I18nService"] }, { type: jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_8__["PlatformUtilsService"] }, { type: jslib_common_abstractions_environment_service__WEBPACK_IMPORTED_MODULE_5__["EnvironmentService"] }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["NgZone"] }, { type: jslib_common_abstractions_policy_service__WEBPACK_IMPORTED_MODULE_9__["PolicyService"] }, { type: jslib_common_abstractions_user_service__WEBPACK_IMPORTED_MODULE_13__["UserService"] }, { type: jslib_common_abstractions_search_service__WEBPACK_IMPORTED_MODULE_10__["SearchService"] }, { type: _services_popup_utils_service__WEBPACK_IMPORTED_MODULE_15__["PopupUtilsService"] }, { type: jslib_common_abstractions_state_service__WEBPACK_IMPORTED_MODULE_12__["StateService"] }, { type: _angular_router__WEBPACK_IMPORTED_MODULE_1__["ActivatedRoute"] }, { type: _angular_common__WEBPACK_IMPORTED_MODULE_3__["Location"] }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["ChangeDetectorRef"] }, { type: jslib_angular_services_broadcaster_service__WEBPACK_IMPORTED_MODULE_14__["BroadcasterService"] }, { type: _angular_router__WEBPACK_IMPORTED_MODULE_1__["Router"] }, { type: jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_7__["LogService"] }]; }, null); })();
+
+
+/***/ }),
+
+/***/ "./src/popup/services/debounceNavigationService.ts":
+/*!*********************************************************!*\
+ !*** ./src/popup/services/debounceNavigationService.ts ***!
+ \*********************************************************/
+/*! exports provided: DebounceNavigationService */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "DebounceNavigationService", function() { return DebounceNavigationService; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var _angular_router__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @angular/router */ "./node_modules/@angular/router/__ivy_ngcc__/fesm2015/router.js");
+/* harmony import */ var rxjs_operators__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! rxjs/operators */ "./node_modules/rxjs/_esm5/operators/index.js");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+
+
+
+class DebounceNavigationService {
+ constructor(router) {
+ this.router = router;
+ this.navigationStartSub = this.router.events
+ .pipe(Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_2__["filter"])(event => event instanceof _angular_router__WEBPACK_IMPORTED_MODULE_1__["NavigationStart"]), Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_2__["pairwise"])())
+ .subscribe((events) => [this.lastNavigation, this.thisNavigation] = events);
+ this.navigationSuccessSub = this.router.events
+ .pipe(Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_2__["filter"])(event => event instanceof _angular_router__WEBPACK_IMPORTED_MODULE_1__["NavigationEnd"]))
+ .subscribe((event) => this.lastNavigationSuccessId = event.id);
+ }
+ canActivate() {
+ var _a, _b;
+ return __awaiter(this, void 0, void 0, function* () {
+ return !(((_a = this.thisNavigation) === null || _a === void 0 ? void 0 : _a.navigationTrigger) === 'hashchange' &&
+ this.lastNavigation.navigationTrigger === 'popstate' &&
+ this.lastNavigationSuccessId === this.lastNavigation.id &&
+ this.lastNavigation.url === ((_b = this.thisNavigation) === null || _b === void 0 ? void 0 : _b.url));
+ });
+ }
+ ngOnDestroy() {
+ if (this.navigationStartSub != null) {
+ this.navigationStartSub.unsubscribe();
+ }
+ if (this.navigationSuccessSub != null) {
+ this.navigationSuccessSub.unsubscribe();
+ }
+ }
+}
+DebounceNavigationService.ɵfac = function DebounceNavigationService_Factory(t) { return new (t || DebounceNavigationService)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵinject"](_angular_router__WEBPACK_IMPORTED_MODULE_1__["Router"])); };
+DebounceNavigationService.ɵprov = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineInjectable"]({ token: DebounceNavigationService, factory: DebounceNavigationService.ɵfac });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](DebounceNavigationService, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Injectable"]
+ }], function () { return [{ type: _angular_router__WEBPACK_IMPORTED_MODULE_1__["Router"] }]; }, null); })();
+
+
+/***/ }),
+
+/***/ "./src/popup/services/launch-guard.service.ts":
+/*!****************************************************!*\
+ !*** ./src/popup/services/launch-guard.service.ts ***!
+ \****************************************************/
+/*! exports provided: LaunchGuardService */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LaunchGuardService", function() { return LaunchGuardService; });
+/* harmony import */ var _browser_browserApi__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../browser/browserApi */ "./src/browser/browserApi.ts");
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var _angular_router__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @angular/router */ "./node_modules/@angular/router/__ivy_ngcc__/fesm2015/router.js");
+/* harmony import */ var _unauth_guard_service__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./unauth-guard.service */ "./src/popup/services/unauth-guard.service.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+
+
+
+
+
+class LaunchGuardService {
+ constructor(router, unauthGuardService) {
+ this.router = router;
+ this.unauthGuardService = unauthGuardService;
+ }
+ canActivate() {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (_browser_browserApi__WEBPACK_IMPORTED_MODULE_0__["BrowserApi"].getBackgroundPage() == null) {
+ this.router.navigate(['private-mode']);
+ return false;
+ }
+ return yield this.unauthGuardService.canActivate();
+ });
+ }
+}
+LaunchGuardService.ɵfac = function LaunchGuardService_Factory(t) { return new (t || LaunchGuardService)(_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵinject"](_angular_router__WEBPACK_IMPORTED_MODULE_2__["Router"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵinject"](_unauth_guard_service__WEBPACK_IMPORTED_MODULE_3__["UnauthGuardService"])); };
+LaunchGuardService.ɵprov = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdefineInjectable"]({ token: LaunchGuardService, factory: LaunchGuardService.ɵfac });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵsetClassMetadata"](LaunchGuardService, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Injectable"]
+ }], function () { return [{ type: _angular_router__WEBPACK_IMPORTED_MODULE_2__["Router"] }, { type: _unauth_guard_service__WEBPACK_IMPORTED_MODULE_3__["UnauthGuardService"] }]; }, null); })();
+
+
+/***/ }),
+
+/***/ "./src/popup/services/lock-guard.service.ts":
+/*!**************************************************!*\
+ !*** ./src/popup/services/lock-guard.service.ts ***!
+ \**************************************************/
+/*! exports provided: LockGuardService */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LockGuardService", function() { return LockGuardService; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var jslib_angular_services_lock_guard_service__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! jslib-angular/services/lock-guard.service */ "./jslib/angular/src/services/lock-guard.service.ts");
+
+
+
+class LockGuardService extends jslib_angular_services_lock_guard_service__WEBPACK_IMPORTED_MODULE_1__["LockGuardService"] {
+ constructor() {
+ super(...arguments);
+ this.homepage = 'tabs/current';
+ }
+}
+LockGuardService.ɵfac = function LockGuardService_Factory(t) { return ɵLockGuardService_BaseFactory(t || LockGuardService); };
+LockGuardService.ɵprov = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineInjectable"]({ token: LockGuardService, factory: LockGuardService.ɵfac });
+const ɵLockGuardService_BaseFactory = /*@__PURE__*/ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵgetInheritedFactory"](LockGuardService);
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](LockGuardService, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Injectable"]
+ }], null, null); })();
+
+
+/***/ }),
+
+/***/ "./src/popup/services/password-reprompt.service.ts":
+/*!*********************************************************!*\
+ !*** ./src/popup/services/password-reprompt.service.ts ***!
+ \*********************************************************/
+/*! exports provided: PasswordRepromptService */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PasswordRepromptService", function() { return PasswordRepromptService; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var jslib_angular_services_passwordReprompt_service__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! jslib-angular/services/passwordReprompt.service */ "./jslib/angular/src/services/passwordReprompt.service.ts");
+/* harmony import */ var _components_password_reprompt_component__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../components/password-reprompt.component */ "./src/popup/components/password-reprompt.component.ts");
+
+
+
+
+class PasswordRepromptService extends jslib_angular_services_passwordReprompt_service__WEBPACK_IMPORTED_MODULE_1__["PasswordRepromptService"] {
+ constructor() {
+ super(...arguments);
+ this.component = _components_password_reprompt_component__WEBPACK_IMPORTED_MODULE_2__["PasswordRepromptComponent"];
+ }
+}
+PasswordRepromptService.ɵfac = function PasswordRepromptService_Factory(t) { return ɵPasswordRepromptService_BaseFactory(t || PasswordRepromptService); };
+PasswordRepromptService.ɵprov = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineInjectable"]({ token: PasswordRepromptService, factory: PasswordRepromptService.ɵfac });
+const ɵPasswordRepromptService_BaseFactory = /*@__PURE__*/ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵgetInheritedFactory"](PasswordRepromptService);
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](PasswordRepromptService, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Injectable"]
+ }], null, null); })();
+
+
+/***/ }),
+
+/***/ "./src/popup/services/popup-search.service.ts":
+/*!****************************************************!*\
+ !*** ./src/popup/services/popup-search.service.ts ***!
+ \****************************************************/
+/*! exports provided: PopupSearchService */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PopupSearchService", function() { return PopupSearchService; });
+/* harmony import */ var jslib_common_services_search_service__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jslib-common/services/search.service */ "./jslib/common/src/services/search.service.ts");
+
+class PopupSearchService extends jslib_common_services_search_service__WEBPACK_IMPORTED_MODULE_0__["SearchService"] {
+ constructor(mainSearchService, cipherService, consoleLogService, i18nService) {
+ super(cipherService, consoleLogService, i18nService);
+ this.mainSearchService = mainSearchService;
+ }
+ clearIndex() {
+ throw new Error('Not available.');
+ }
+ indexCiphers() {
+ throw new Error('Not available.');
+ }
+ getIndexForSearch() {
+ return this.mainSearchService.getIndexForSearch();
+ }
+}
+
+
+/***/ }),
+
+/***/ "./src/popup/services/popup-utils.service.ts":
+/*!***************************************************!*\
+ !*** ./src/popup/services/popup-utils.service.ts ***!
+ \***************************************************/
+/*! exports provided: PopupUtilsService */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PopupUtilsService", function() { return PopupUtilsService; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var _browser_browserApi__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../browser/browserApi */ "./src/browser/browserApi.ts");
+/* harmony import */ var jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! jslib-common/abstractions/platformUtils.service */ "./jslib/common/src/abstractions/platformUtils.service.ts");
+
+
+
+
+
+class PopupUtilsService {
+ constructor(platformUtilsService) {
+ this.platformUtilsService = platformUtilsService;
+ }
+ inSidebar(win) {
+ return win.location.search !== '' && win.location.search.indexOf('uilocation=sidebar') > -1;
+ }
+ inTab(win) {
+ return win.location.search !== '' && win.location.search.indexOf('uilocation=tab') > -1;
+ }
+ inPopout(win) {
+ return win.location.search !== '' && win.location.search.indexOf('uilocation=popout') > -1;
+ }
+ inPopup(win) {
+ return win.location.search === '' || win.location.search.indexOf('uilocation=') === -1 ||
+ win.location.search.indexOf('uilocation=popup') > -1;
+ }
+ getContentScrollY(win, scrollingContainer = 'content') {
+ const content = win.document.getElementsByTagName(scrollingContainer)[0];
+ return content.scrollTop;
+ }
+ setContentScrollY(win, scrollY, scrollingContainer = 'content') {
+ if (scrollY != null) {
+ const content = win.document.getElementsByTagName(scrollingContainer)[0];
+ content.scrollTop = scrollY;
+ }
+ }
+ popOut(win, href = null) {
+ if (href === null) {
+ href = win.location.href;
+ }
+ if ((typeof chrome !== 'undefined') && chrome.windows && chrome.windows.create) {
+ if (href.indexOf('?uilocation=') > -1) {
+ href = href.replace('uilocation=popup', 'uilocation=popout')
+ .replace('uilocation=tab', 'uilocation=popout')
+ .replace('uilocation=sidebar', 'uilocation=popout');
+ }
+ else {
+ const hrefParts = href.split('#');
+ href = hrefParts[0] + '?uilocation=popout' + (hrefParts.length > 0 ? '#' + hrefParts[1] : '');
+ }
+ const bodyRect = document.querySelector('body').getBoundingClientRect();
+ chrome.windows.create({
+ url: href,
+ type: 'popup',
+ width: Math.round(bodyRect.width ? bodyRect.width + 60 : 375),
+ height: Math.round(bodyRect.height || 600),
+ });
+ if (this.inPopup(win)) {
+ _browser_browserApi__WEBPACK_IMPORTED_MODULE_1__["BrowserApi"].closePopup(win);
+ }
+ }
+ else if ((typeof chrome !== 'undefined') && chrome.tabs && chrome.tabs.create) {
+ href = href.replace('uilocation=popup', 'uilocation=tab')
+ .replace('uilocation=popout', 'uilocation=tab')
+ .replace('uilocation=sidebar', 'uilocation=tab');
+ chrome.tabs.create({
+ url: href,
+ });
+ }
+ }
+}
+PopupUtilsService.ɵfac = function PopupUtilsService_Factory(t) { return new (t || PopupUtilsService)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵinject"](jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_2__["PlatformUtilsService"])); };
+PopupUtilsService.ɵprov = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineInjectable"]({ token: PopupUtilsService, factory: PopupUtilsService.ɵfac });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](PopupUtilsService, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Injectable"]
+ }], function () { return [{ type: jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_2__["PlatformUtilsService"] }]; }, null); })();
+
+
+/***/ }),
+
+/***/ "./src/popup/services/services.module.ts":
+/*!***********************************************!*\
+ !*** ./src/popup/services/services.module.ts ***!
+ \***********************************************/
+/*! exports provided: initFactory, ServicesModule */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "initFactory", function() { return initFactory; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ServicesModule", function() { return ServicesModule; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var angular2_toaster__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! angular2-toaster */ "./node_modules/angular2-toaster/__ivy_ngcc__/fesm2015/angular2-toaster.js");
+/* harmony import */ var _debounceNavigationService__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./debounceNavigationService */ "./src/popup/services/debounceNavigationService.ts");
+/* harmony import */ var _launch_guard_service__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./launch-guard.service */ "./src/popup/services/launch-guard.service.ts");
+/* harmony import */ var _lock_guard_service__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./lock-guard.service */ "./src/popup/services/lock-guard.service.ts");
+/* harmony import */ var _password_reprompt_service__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./password-reprompt.service */ "./src/popup/services/password-reprompt.service.ts");
+/* harmony import */ var _unauth_guard_service__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./unauth-guard.service */ "./src/popup/services/unauth-guard.service.ts");
+/* harmony import */ var jslib_angular_services_auth_guard_service__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! jslib-angular/services/auth-guard.service */ "./jslib/angular/src/services/auth-guard.service.ts");
+/* harmony import */ var jslib_angular_services_broadcaster_service__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! jslib-angular/services/broadcaster.service */ "./jslib/angular/src/services/broadcaster.service.ts");
+/* harmony import */ var jslib_angular_services_modal_service__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! jslib-angular/services/modal.service */ "./jslib/angular/src/services/modal.service.ts");
+/* harmony import */ var jslib_angular_services_validation_service__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! jslib-angular/services/validation.service */ "./jslib/angular/src/services/validation.service.ts");
+/* harmony import */ var _browser_browserApi__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../browser/browserApi */ "./src/browser/browserApi.ts");
+/* harmony import */ var jslib_common_abstractions_api_service__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! jslib-common/abstractions/api.service */ "./jslib/common/src/abstractions/api.service.ts");
+/* harmony import */ var jslib_common_abstractions_appId_service__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! jslib-common/abstractions/appId.service */ "./jslib/common/src/abstractions/appId.service.ts");
+/* harmony import */ var jslib_common_abstractions_audit_service__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! jslib-common/abstractions/audit.service */ "./jslib/common/src/abstractions/audit.service.ts");
+/* harmony import */ var jslib_common_abstractions_auth_service__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! jslib-common/abstractions/auth.service */ "./jslib/common/src/abstractions/auth.service.ts");
+/* harmony import */ var jslib_common_abstractions_cipher_service__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! jslib-common/abstractions/cipher.service */ "./jslib/common/src/abstractions/cipher.service.ts");
+/* harmony import */ var jslib_common_abstractions_collection_service__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! jslib-common/abstractions/collection.service */ "./jslib/common/src/abstractions/collection.service.ts");
+/* harmony import */ var jslib_common_abstractions_crypto_service__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! jslib-common/abstractions/crypto.service */ "./jslib/common/src/abstractions/crypto.service.ts");
+/* harmony import */ var jslib_common_abstractions_cryptoFunction_service__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! jslib-common/abstractions/cryptoFunction.service */ "./jslib/common/src/abstractions/cryptoFunction.service.ts");
+/* harmony import */ var jslib_common_abstractions_environment_service__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! jslib-common/abstractions/environment.service */ "./jslib/common/src/abstractions/environment.service.ts");
+/* harmony import */ var jslib_common_abstractions_event_service__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! jslib-common/abstractions/event.service */ "./jslib/common/src/abstractions/event.service.ts");
+/* harmony import */ var jslib_common_abstractions_export_service__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! jslib-common/abstractions/export.service */ "./jslib/common/src/abstractions/export.service.ts");
+/* harmony import */ var jslib_common_abstractions_fileUpload_service__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! jslib-common/abstractions/fileUpload.service */ "./jslib/common/src/abstractions/fileUpload.service.ts");
+/* harmony import */ var jslib_common_abstractions_folder_service__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! jslib-common/abstractions/folder.service */ "./jslib/common/src/abstractions/folder.service.ts");
+/* harmony import */ var jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! jslib-common/abstractions/i18n.service */ "./jslib/common/src/abstractions/i18n.service.ts");
+/* harmony import */ var jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! jslib-common/abstractions/log.service */ "./jslib/common/src/abstractions/log.service.ts");
+/* harmony import */ var jslib_common_abstractions_messaging_service__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! jslib-common/abstractions/messaging.service */ "./jslib/common/src/abstractions/messaging.service.ts");
+/* harmony import */ var jslib_common_abstractions_notifications_service__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! jslib-common/abstractions/notifications.service */ "./jslib/common/src/abstractions/notifications.service.ts");
+/* harmony import */ var jslib_common_abstractions_passwordGeneration_service__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! jslib-common/abstractions/passwordGeneration.service */ "./jslib/common/src/abstractions/passwordGeneration.service.ts");
+/* harmony import */ var jslib_common_abstractions_passwordReprompt_service__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! jslib-common/abstractions/passwordReprompt.service */ "./jslib/common/src/abstractions/passwordReprompt.service.ts");
+/* harmony import */ var jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! jslib-common/abstractions/platformUtils.service */ "./jslib/common/src/abstractions/platformUtils.service.ts");
+/* harmony import */ var jslib_common_abstractions_policy_service__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! jslib-common/abstractions/policy.service */ "./jslib/common/src/abstractions/policy.service.ts");
+/* harmony import */ var jslib_common_abstractions_search_service__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! jslib-common/abstractions/search.service */ "./jslib/common/src/abstractions/search.service.ts");
+/* harmony import */ var jslib_common_abstractions_send_service__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! jslib-common/abstractions/send.service */ "./jslib/common/src/abstractions/send.service.ts");
+/* harmony import */ var jslib_common_abstractions_settings_service__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! jslib-common/abstractions/settings.service */ "./jslib/common/src/abstractions/settings.service.ts");
+/* harmony import */ var jslib_common_abstractions_state_service__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! jslib-common/abstractions/state.service */ "./jslib/common/src/abstractions/state.service.ts");
+/* harmony import */ var jslib_common_abstractions_storage_service__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! jslib-common/abstractions/storage.service */ "./jslib/common/src/abstractions/storage.service.ts");
+/* harmony import */ var jslib_common_abstractions_sync_service__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(/*! jslib-common/abstractions/sync.service */ "./jslib/common/src/abstractions/sync.service.ts");
+/* harmony import */ var jslib_common_abstractions_token_service__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(/*! jslib-common/abstractions/token.service */ "./jslib/common/src/abstractions/token.service.ts");
+/* harmony import */ var jslib_common_abstractions_totp_service__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(/*! jslib-common/abstractions/totp.service */ "./jslib/common/src/abstractions/totp.service.ts");
+/* harmony import */ var jslib_common_abstractions_user_service__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(/*! jslib-common/abstractions/user.service */ "./jslib/common/src/abstractions/user.service.ts");
+/* harmony import */ var jslib_common_abstractions_vaultTimeout_service__WEBPACK_IMPORTED_MODULE_42__ = __webpack_require__(/*! jslib-common/abstractions/vaultTimeout.service */ "./jslib/common/src/abstractions/vaultTimeout.service.ts");
+/* harmony import */ var _services_abstractions_autofill_service__WEBPACK_IMPORTED_MODULE_43__ = __webpack_require__(/*! ../../services/abstractions/autofill.service */ "./src/services/abstractions/autofill.service.ts");
+/* harmony import */ var _services_browserMessaging_service__WEBPACK_IMPORTED_MODULE_44__ = __webpack_require__(/*! ../../services/browserMessaging.service */ "./src/services/browserMessaging.service.ts");
+/* harmony import */ var jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_45__ = __webpack_require__(/*! jslib-common/services/constants.service */ "./jslib/common/src/services/constants.service.ts");
+/* harmony import */ var jslib_common_services_state_service__WEBPACK_IMPORTED_MODULE_46__ = __webpack_require__(/*! jslib-common/services/state.service */ "./jslib/common/src/services/state.service.ts");
+/* harmony import */ var _popup_search_service__WEBPACK_IMPORTED_MODULE_47__ = __webpack_require__(/*! ./popup-search.service */ "./src/popup/services/popup-search.service.ts");
+/* harmony import */ var _popup_utils_service__WEBPACK_IMPORTED_MODULE_48__ = __webpack_require__(/*! ./popup-utils.service */ "./src/popup/services/popup-utils.service.ts");
+/* harmony import */ var jslib_common_enums_themeType__WEBPACK_IMPORTED_MODULE_49__ = __webpack_require__(/*! jslib-common/enums/themeType */ "./jslib/common/src/enums/themeType.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+function getBgService(service) {
+ return () => {
+ const page = _browser_browserApi__WEBPACK_IMPORTED_MODULE_11__["BrowserApi"].getBackgroundPage();
+ return page ? page.bitwardenMain[service] : null;
+ };
+}
+const isPrivateMode = _browser_browserApi__WEBPACK_IMPORTED_MODULE_11__["BrowserApi"].getBackgroundPage() == null;
+const stateService = new jslib_common_services_state_service__WEBPACK_IMPORTED_MODULE_46__["StateService"]();
+const messagingService = new _services_browserMessaging_service__WEBPACK_IMPORTED_MODULE_44__["default"]();
+const logService = getBgService('logService')();
+const searchService = isPrivateMode ? null : new _popup_search_service__WEBPACK_IMPORTED_MODULE_47__["PopupSearchService"](getBgService('searchService')(), getBgService('cipherService')(), logService, getBgService('i18nService')());
+function initFactory(platformUtilsService, i18nService, storageService, popupUtilsService) {
+ return () => __awaiter(this, void 0, void 0, function* () {
+ if (!popupUtilsService.inPopup(window)) {
+ window.document.body.classList.add('body-full');
+ }
+ else if (window.screen.availHeight < 600) {
+ window.document.body.classList.add('body-xs');
+ }
+ else if (window.screen.availHeight <= 800) {
+ window.document.body.classList.add('body-sm');
+ }
+ if (!isPrivateMode) {
+ yield stateService.save(jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_45__["ConstantsService"].disableFaviconKey, yield storageService.get(jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_45__["ConstantsService"].disableFaviconKey));
+ yield stateService.save(jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_45__["ConstantsService"].disableBadgeCounterKey, yield storageService.get(jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_45__["ConstantsService"].disableBadgeCounterKey));
+ const htmlEl = window.document.documentElement;
+ const theme = yield platformUtilsService.getEffectiveTheme();
+ htmlEl.classList.add('theme_' + theme);
+ platformUtilsService.onDefaultSystemThemeChange((sysTheme) => __awaiter(this, void 0, void 0, function* () {
+ const bwTheme = yield storageService.get(jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_45__["ConstantsService"].themeKey);
+ if (bwTheme == null || bwTheme === jslib_common_enums_themeType__WEBPACK_IMPORTED_MODULE_49__["ThemeType"].System) {
+ htmlEl.classList.remove('theme_' + jslib_common_enums_themeType__WEBPACK_IMPORTED_MODULE_49__["ThemeType"].Light, 'theme_' + jslib_common_enums_themeType__WEBPACK_IMPORTED_MODULE_49__["ThemeType"].Dark);
+ htmlEl.classList.add('theme_' + sysTheme);
+ }
+ }));
+ htmlEl.classList.add('locale_' + i18nService.translationLocale);
+ // Workaround for slow performance on external monitors on Chrome + MacOS
+ // See: https://bugs.chromium.org/p/chromium/issues/detail?id=971701#c64
+ if (platformUtilsService.isChrome() &&
+ navigator.platform.indexOf('Mac') > -1 &&
+ popupUtilsService.inPopup(window) &&
+ (window.screenLeft < 0 ||
+ window.screenTop < 0 ||
+ window.screenLeft > window.screen.width ||
+ window.screenTop > window.screen.height)) {
+ htmlEl.classList.add('force_redraw');
+ logService.info('Force redraw is on');
+ }
+ }
+ });
+}
+class ServicesModule {
+}
+ServicesModule.ɵfac = function ServicesModule_Factory(t) { return new (t || ServicesModule)(); };
+ServicesModule.ɵmod = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineNgModule"]({ type: ServicesModule });
+ServicesModule.ɵinj = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineInjector"]({ providers: [
+ jslib_angular_services_validation_service__WEBPACK_IMPORTED_MODULE_10__["ValidationService"],
+ jslib_angular_services_auth_guard_service__WEBPACK_IMPORTED_MODULE_7__["AuthGuardService"],
+ _lock_guard_service__WEBPACK_IMPORTED_MODULE_4__["LockGuardService"],
+ _launch_guard_service__WEBPACK_IMPORTED_MODULE_3__["LaunchGuardService"],
+ _unauth_guard_service__WEBPACK_IMPORTED_MODULE_6__["UnauthGuardService"],
+ _debounceNavigationService__WEBPACK_IMPORTED_MODULE_2__["DebounceNavigationService"],
+ _popup_utils_service__WEBPACK_IMPORTED_MODULE_48__["PopupUtilsService"],
+ jslib_angular_services_broadcaster_service__WEBPACK_IMPORTED_MODULE_8__["BroadcasterService"],
+ jslib_angular_services_modal_service__WEBPACK_IMPORTED_MODULE_9__["ModalService"],
+ { provide: jslib_common_abstractions_messaging_service__WEBPACK_IMPORTED_MODULE_27__["MessagingService"], useValue: messagingService },
+ { provide: jslib_common_abstractions_auth_service__WEBPACK_IMPORTED_MODULE_15__["AuthService"], useFactory: getBgService('authService'), deps: [] },
+ { provide: jslib_common_abstractions_state_service__WEBPACK_IMPORTED_MODULE_36__["StateService"], useValue: stateService },
+ { provide: jslib_common_abstractions_search_service__WEBPACK_IMPORTED_MODULE_33__["SearchService"], useValue: searchService },
+ { provide: jslib_common_abstractions_audit_service__WEBPACK_IMPORTED_MODULE_14__["AuditService"], useFactory: getBgService('auditService'), deps: [] },
+ { provide: jslib_common_abstractions_fileUpload_service__WEBPACK_IMPORTED_MODULE_23__["FileUploadService"], useFactory: getBgService('fileUploadService'), deps: [] },
+ { provide: jslib_common_abstractions_cipher_service__WEBPACK_IMPORTED_MODULE_16__["CipherService"], useFactory: getBgService('cipherService'), deps: [] },
+ {
+ provide: jslib_common_abstractions_cryptoFunction_service__WEBPACK_IMPORTED_MODULE_19__["CryptoFunctionService"],
+ useFactory: getBgService('cryptoFunctionService'),
+ deps: [],
+ },
+ { provide: jslib_common_abstractions_folder_service__WEBPACK_IMPORTED_MODULE_24__["FolderService"], useFactory: getBgService('folderService'), deps: [] },
+ { provide: jslib_common_abstractions_collection_service__WEBPACK_IMPORTED_MODULE_17__["CollectionService"], useFactory: getBgService('collectionService'), deps: [] },
+ { provide: jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_26__["LogService"], useFactory: getBgService('logService'), deps: [] },
+ { provide: jslib_common_abstractions_environment_service__WEBPACK_IMPORTED_MODULE_20__["EnvironmentService"], useFactory: getBgService('environmentService'), deps: [] },
+ { provide: jslib_common_abstractions_totp_service__WEBPACK_IMPORTED_MODULE_40__["TotpService"], useFactory: getBgService('totpService'), deps: [] },
+ { provide: jslib_common_abstractions_token_service__WEBPACK_IMPORTED_MODULE_39__["TokenService"], useFactory: getBgService('tokenService'), deps: [] },
+ { provide: jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_25__["I18nService"], useFactory: getBgService('i18nService'), deps: [] },
+ { provide: jslib_common_abstractions_crypto_service__WEBPACK_IMPORTED_MODULE_18__["CryptoService"], useFactory: getBgService('cryptoService'), deps: [] },
+ { provide: jslib_common_abstractions_event_service__WEBPACK_IMPORTED_MODULE_21__["EventService"], useFactory: getBgService('eventService'), deps: [] },
+ { provide: jslib_common_abstractions_policy_service__WEBPACK_IMPORTED_MODULE_32__["PolicyService"], useFactory: getBgService('policyService'), deps: [] },
+ {
+ provide: jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_31__["PlatformUtilsService"],
+ useFactory: getBgService('platformUtilsService'),
+ deps: [],
+ },
+ {
+ provide: jslib_common_abstractions_passwordGeneration_service__WEBPACK_IMPORTED_MODULE_29__["PasswordGenerationService"],
+ useFactory: getBgService('passwordGenerationService'),
+ deps: [],
+ },
+ { provide: jslib_common_abstractions_api_service__WEBPACK_IMPORTED_MODULE_12__["ApiService"], useFactory: getBgService('apiService'), deps: [] },
+ { provide: jslib_common_abstractions_sync_service__WEBPACK_IMPORTED_MODULE_38__["SyncService"], useFactory: getBgService('syncService'), deps: [] },
+ { provide: jslib_common_abstractions_user_service__WEBPACK_IMPORTED_MODULE_41__["UserService"], useFactory: getBgService('userService'), deps: [] },
+ { provide: jslib_common_abstractions_settings_service__WEBPACK_IMPORTED_MODULE_35__["SettingsService"], useFactory: getBgService('settingsService'), deps: [] },
+ { provide: jslib_common_abstractions_storage_service__WEBPACK_IMPORTED_MODULE_37__["StorageService"], useFactory: getBgService('storageService'), deps: [] },
+ { provide: jslib_common_abstractions_appId_service__WEBPACK_IMPORTED_MODULE_13__["AppIdService"], useFactory: getBgService('appIdService'), deps: [] },
+ { provide: _services_abstractions_autofill_service__WEBPACK_IMPORTED_MODULE_43__["AutofillService"], useFactory: getBgService('autofillService'), deps: [] },
+ { provide: jslib_common_abstractions_export_service__WEBPACK_IMPORTED_MODULE_22__["ExportService"], useFactory: getBgService('exportService'), deps: [] },
+ { provide: jslib_common_abstractions_send_service__WEBPACK_IMPORTED_MODULE_34__["SendService"], useFactory: getBgService('sendService'), deps: [] },
+ {
+ provide: jslib_common_abstractions_vaultTimeout_service__WEBPACK_IMPORTED_MODULE_42__["VaultTimeoutService"],
+ useFactory: getBgService('vaultTimeoutService'),
+ deps: [],
+ },
+ {
+ provide: jslib_common_abstractions_notifications_service__WEBPACK_IMPORTED_MODULE_28__["NotificationsService"],
+ useFactory: getBgService('notificationsService'),
+ deps: [],
+ },
+ {
+ provide: _angular_core__WEBPACK_IMPORTED_MODULE_0__["APP_INITIALIZER"],
+ useFactory: initFactory,
+ deps: [jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_31__["PlatformUtilsService"], jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_25__["I18nService"], jslib_common_abstractions_storage_service__WEBPACK_IMPORTED_MODULE_37__["StorageService"], _popup_utils_service__WEBPACK_IMPORTED_MODULE_48__["PopupUtilsService"]],
+ multi: true,
+ },
+ {
+ provide: _angular_core__WEBPACK_IMPORTED_MODULE_0__["LOCALE_ID"],
+ useFactory: () => isPrivateMode ? null : getBgService('i18nService')().translationLocale,
+ deps: [],
+ },
+ { provide: jslib_common_abstractions_passwordReprompt_service__WEBPACK_IMPORTED_MODULE_30__["PasswordRepromptService"], useClass: _password_reprompt_service__WEBPACK_IMPORTED_MODULE_5__["PasswordRepromptService"] },
+ ], imports: [[
+ angular2_toaster__WEBPACK_IMPORTED_MODULE_1__["ToasterModule"],
+ ]] });
+(function () { (typeof ngJitMode === "undefined" || ngJitMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵsetNgModuleScope"](ServicesModule, { imports: [angular2_toaster__WEBPACK_IMPORTED_MODULE_1__["ToasterModule"]] }); })();
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](ServicesModule, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["NgModule"],
+ args: [{
+ imports: [
+ angular2_toaster__WEBPACK_IMPORTED_MODULE_1__["ToasterModule"],
+ ],
+ declarations: [],
+ providers: [
+ jslib_angular_services_validation_service__WEBPACK_IMPORTED_MODULE_10__["ValidationService"],
+ jslib_angular_services_auth_guard_service__WEBPACK_IMPORTED_MODULE_7__["AuthGuardService"],
+ _lock_guard_service__WEBPACK_IMPORTED_MODULE_4__["LockGuardService"],
+ _launch_guard_service__WEBPACK_IMPORTED_MODULE_3__["LaunchGuardService"],
+ _unauth_guard_service__WEBPACK_IMPORTED_MODULE_6__["UnauthGuardService"],
+ _debounceNavigationService__WEBPACK_IMPORTED_MODULE_2__["DebounceNavigationService"],
+ _popup_utils_service__WEBPACK_IMPORTED_MODULE_48__["PopupUtilsService"],
+ jslib_angular_services_broadcaster_service__WEBPACK_IMPORTED_MODULE_8__["BroadcasterService"],
+ jslib_angular_services_modal_service__WEBPACK_IMPORTED_MODULE_9__["ModalService"],
+ { provide: jslib_common_abstractions_messaging_service__WEBPACK_IMPORTED_MODULE_27__["MessagingService"], useValue: messagingService },
+ { provide: jslib_common_abstractions_auth_service__WEBPACK_IMPORTED_MODULE_15__["AuthService"], useFactory: getBgService('authService'), deps: [] },
+ { provide: jslib_common_abstractions_state_service__WEBPACK_IMPORTED_MODULE_36__["StateService"], useValue: stateService },
+ { provide: jslib_common_abstractions_search_service__WEBPACK_IMPORTED_MODULE_33__["SearchService"], useValue: searchService },
+ { provide: jslib_common_abstractions_audit_service__WEBPACK_IMPORTED_MODULE_14__["AuditService"], useFactory: getBgService('auditService'), deps: [] },
+ { provide: jslib_common_abstractions_fileUpload_service__WEBPACK_IMPORTED_MODULE_23__["FileUploadService"], useFactory: getBgService('fileUploadService'), deps: [] },
+ { provide: jslib_common_abstractions_cipher_service__WEBPACK_IMPORTED_MODULE_16__["CipherService"], useFactory: getBgService('cipherService'), deps: [] },
+ {
+ provide: jslib_common_abstractions_cryptoFunction_service__WEBPACK_IMPORTED_MODULE_19__["CryptoFunctionService"],
+ useFactory: getBgService('cryptoFunctionService'),
+ deps: [],
+ },
+ { provide: jslib_common_abstractions_folder_service__WEBPACK_IMPORTED_MODULE_24__["FolderService"], useFactory: getBgService('folderService'), deps: [] },
+ { provide: jslib_common_abstractions_collection_service__WEBPACK_IMPORTED_MODULE_17__["CollectionService"], useFactory: getBgService('collectionService'), deps: [] },
+ { provide: jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_26__["LogService"], useFactory: getBgService('logService'), deps: [] },
+ { provide: jslib_common_abstractions_environment_service__WEBPACK_IMPORTED_MODULE_20__["EnvironmentService"], useFactory: getBgService('environmentService'), deps: [] },
+ { provide: jslib_common_abstractions_totp_service__WEBPACK_IMPORTED_MODULE_40__["TotpService"], useFactory: getBgService('totpService'), deps: [] },
+ { provide: jslib_common_abstractions_token_service__WEBPACK_IMPORTED_MODULE_39__["TokenService"], useFactory: getBgService('tokenService'), deps: [] },
+ { provide: jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_25__["I18nService"], useFactory: getBgService('i18nService'), deps: [] },
+ { provide: jslib_common_abstractions_crypto_service__WEBPACK_IMPORTED_MODULE_18__["CryptoService"], useFactory: getBgService('cryptoService'), deps: [] },
+ { provide: jslib_common_abstractions_event_service__WEBPACK_IMPORTED_MODULE_21__["EventService"], useFactory: getBgService('eventService'), deps: [] },
+ { provide: jslib_common_abstractions_policy_service__WEBPACK_IMPORTED_MODULE_32__["PolicyService"], useFactory: getBgService('policyService'), deps: [] },
+ {
+ provide: jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_31__["PlatformUtilsService"],
+ useFactory: getBgService('platformUtilsService'),
+ deps: [],
+ },
+ {
+ provide: jslib_common_abstractions_passwordGeneration_service__WEBPACK_IMPORTED_MODULE_29__["PasswordGenerationService"],
+ useFactory: getBgService('passwordGenerationService'),
+ deps: [],
+ },
+ { provide: jslib_common_abstractions_api_service__WEBPACK_IMPORTED_MODULE_12__["ApiService"], useFactory: getBgService('apiService'), deps: [] },
+ { provide: jslib_common_abstractions_sync_service__WEBPACK_IMPORTED_MODULE_38__["SyncService"], useFactory: getBgService('syncService'), deps: [] },
+ { provide: jslib_common_abstractions_user_service__WEBPACK_IMPORTED_MODULE_41__["UserService"], useFactory: getBgService('userService'), deps: [] },
+ { provide: jslib_common_abstractions_settings_service__WEBPACK_IMPORTED_MODULE_35__["SettingsService"], useFactory: getBgService('settingsService'), deps: [] },
+ { provide: jslib_common_abstractions_storage_service__WEBPACK_IMPORTED_MODULE_37__["StorageService"], useFactory: getBgService('storageService'), deps: [] },
+ { provide: jslib_common_abstractions_appId_service__WEBPACK_IMPORTED_MODULE_13__["AppIdService"], useFactory: getBgService('appIdService'), deps: [] },
+ { provide: _services_abstractions_autofill_service__WEBPACK_IMPORTED_MODULE_43__["AutofillService"], useFactory: getBgService('autofillService'), deps: [] },
+ { provide: jslib_common_abstractions_export_service__WEBPACK_IMPORTED_MODULE_22__["ExportService"], useFactory: getBgService('exportService'), deps: [] },
+ { provide: jslib_common_abstractions_send_service__WEBPACK_IMPORTED_MODULE_34__["SendService"], useFactory: getBgService('sendService'), deps: [] },
+ {
+ provide: jslib_common_abstractions_vaultTimeout_service__WEBPACK_IMPORTED_MODULE_42__["VaultTimeoutService"],
+ useFactory: getBgService('vaultTimeoutService'),
+ deps: [],
+ },
+ {
+ provide: jslib_common_abstractions_notifications_service__WEBPACK_IMPORTED_MODULE_28__["NotificationsService"],
+ useFactory: getBgService('notificationsService'),
+ deps: [],
+ },
+ {
+ provide: _angular_core__WEBPACK_IMPORTED_MODULE_0__["APP_INITIALIZER"],
+ useFactory: initFactory,
+ deps: [jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_31__["PlatformUtilsService"], jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_25__["I18nService"], jslib_common_abstractions_storage_service__WEBPACK_IMPORTED_MODULE_37__["StorageService"], _popup_utils_service__WEBPACK_IMPORTED_MODULE_48__["PopupUtilsService"]],
+ multi: true,
+ },
+ {
+ provide: _angular_core__WEBPACK_IMPORTED_MODULE_0__["LOCALE_ID"],
+ useFactory: () => isPrivateMode ? null : getBgService('i18nService')().translationLocale,
+ deps: [],
+ },
+ { provide: jslib_common_abstractions_passwordReprompt_service__WEBPACK_IMPORTED_MODULE_30__["PasswordRepromptService"], useClass: _password_reprompt_service__WEBPACK_IMPORTED_MODULE_5__["PasswordRepromptService"] },
+ ],
+ }]
+ }], null, null); })();
+
+
+/***/ }),
+
+/***/ "./src/popup/services/unauth-guard.service.ts":
+/*!****************************************************!*\
+ !*** ./src/popup/services/unauth-guard.service.ts ***!
+ \****************************************************/
+/*! exports provided: UnauthGuardService */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "UnauthGuardService", function() { return UnauthGuardService; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var jslib_angular_services_unauth_guard_service__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! jslib-angular/services/unauth-guard.service */ "./jslib/angular/src/services/unauth-guard.service.ts");
+
+
+
+class UnauthGuardService extends jslib_angular_services_unauth_guard_service__WEBPACK_IMPORTED_MODULE_1__["UnauthGuardService"] {
+ constructor() {
+ super(...arguments);
+ this.homepage = 'tabs/current';
+ }
+}
+UnauthGuardService.ɵfac = function UnauthGuardService_Factory(t) { return ɵUnauthGuardService_BaseFactory(t || UnauthGuardService); };
+UnauthGuardService.ɵprov = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineInjectable"]({ token: UnauthGuardService, factory: UnauthGuardService.ɵfac });
+const ɵUnauthGuardService_BaseFactory = /*@__PURE__*/ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵgetInheritedFactory"](UnauthGuardService);
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](UnauthGuardService, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Injectable"]
+ }], null, null); })();
+
+
+/***/ }),
+
+/***/ "./src/popup/settings/excluded-domains.component.ts":
+/*!**********************************************************!*\
+ !*** ./src/popup/settings/excluded-domains.component.ts ***!
+ \**********************************************************/
+/*! exports provided: ExcludedDomainsComponent */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ExcludedDomainsComponent", function() { return ExcludedDomainsComponent; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var _angular_router__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @angular/router */ "./node_modules/@angular/router/__ivy_ngcc__/fesm2015/router.js");
+/* harmony import */ var jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! jslib-common/services/constants.service */ "./jslib/common/src/services/constants.service.ts");
+/* harmony import */ var jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! jslib-common/abstractions/i18n.service */ "./jslib/common/src/abstractions/i18n.service.ts");
+/* harmony import */ var jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! jslib-common/abstractions/platformUtils.service */ "./jslib/common/src/abstractions/platformUtils.service.ts");
+/* harmony import */ var jslib_common_abstractions_storage_service__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! jslib-common/abstractions/storage.service */ "./jslib/common/src/abstractions/storage.service.ts");
+/* harmony import */ var jslib_angular_services_broadcaster_service__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! jslib-angular/services/broadcaster.service */ "./jslib/angular/src/services/broadcaster.service.ts");
+/* harmony import */ var _browser_browserApi__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../browser/browserApi */ "./src/browser/browserApi.ts");
+/* harmony import */ var jslib_common_misc_utils__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! jslib-common/misc/utils */ "./jslib/common/src/misc/utils.ts");
+/* harmony import */ var _angular_forms__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @angular/forms */ "./node_modules/@angular/forms/__ivy_ngcc__/fesm2015/forms.js");
+/* harmony import */ var jslib_angular_directives_blur_click_directive__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! jslib-angular/directives/blur-click.directive */ "./jslib/angular/src/directives/blur-click.directive.ts");
+/* harmony import */ var _angular_common__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @angular/common */ "./node_modules/@angular/common/__ivy_ngcc__/fesm2015/common.js");
+/* harmony import */ var jslib_angular_directives_stop_click_directive__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! jslib-angular/directives/stop-click.directive */ "./jslib/angular/src/directives/stop-click.directive.ts");
+/* harmony import */ var jslib_angular_directives_box_row_directive__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! jslib-angular/directives/box-row.directive */ "./jslib/angular/src/directives/box-row.directive.ts");
+/* harmony import */ var jslib_angular_directives_a11y_title_directive__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! jslib-angular/directives/a11y-title.directive */ "./jslib/angular/src/directives/a11y-title.directive.ts");
+/* harmony import */ var jslib_angular_directives_input_verbatim_directive__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! jslib-angular/directives/input-verbatim.directive */ "./jslib/angular/src/directives/input-verbatim.directive.ts");
+/* harmony import */ var jslib_angular_pipes_i18n_pipe__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! jslib-angular/pipes/i18n.pipe */ "./jslib/angular/src/pipes/i18n.pipe.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+function ExcludedDomainsComponent_ng_container_33_div_2_select_21_option_6_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "option", 26);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const u_r8 = ctx.$implicit;
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngValue", u_r8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](u_r8);
+} }
+function ExcludedDomainsComponent_ng_container_33_div_2_select_21_Template(rf, ctx) { if (rf & 1) {
+ const _r11 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "select", 25);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("ngModelChange", function ExcludedDomainsComponent_ng_container_33_div_2_select_21_Template_select_ngModelChange_0_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r11); const domain_r3 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"]().$implicit; return domain_r3.uri = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](2, "option", 26);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](4, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](6, ExcludedDomainsComponent_ng_container_33_div_2_select_21_option_6_Template, 2, 2, "option", 27);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r12 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"]();
+ const i_r4 = ctx_r12.index;
+ const domain_r3 = ctx_r12.$implicit;
+ const ctx_r5 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate1"]("id", "currentUris", i_r4, "");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate1"]("name", "currentUris", i_r4, "");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngModel", domain_r3.uri)("hidden", !domain_r3.showCurrentUris);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngValue", null);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate1"]("-- ", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](4, 7, "select"), " --");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngForOf", ctx_r5.currentUris);
+} }
+function ExcludedDomainsComponent_ng_container_33_div_2_button_26_Template(rf, ctx) { if (rf & 1) {
+ const _r15 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "button", 28);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("click", function ExcludedDomainsComponent_ng_container_33_div_2_button_26_Template_button_click_0_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r15); const domain_r3 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"]().$implicit; const ctx_r13 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](2); return ctx_r13.toggleUriInput(domain_r3); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](1, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](2, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](3, "i", 29);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](4, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate"]("appA11yTitle", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](1, 1, "toggleCurrentUris"));
+} }
+function ExcludedDomainsComponent_ng_container_33_div_2_Template(rf, ctx) { if (rf & 1) {
+ const _r17 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "div", 15);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](2, "button", 16);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("click", function ExcludedDomainsComponent_ng_container_33_div_2_Template_button_click_2_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r17); const i_r4 = ctx.index; const ctx_r16 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](2); return ctx_r16.removeUri(i_r4); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](3, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](4, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](5, "i", 17);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](6, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](8, "div", 18);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](9, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](10, "label", 19);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](11);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](12, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](13, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](14, "input", 20);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("ngModelChange", function ExcludedDomainsComponent_ng_container_33_div_2_Template_input_ngModelChange_14_listener($event) { const domain_r3 = ctx.$implicit; return domain_r3.uri = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](15, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](16, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](17, "label", 21);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](18);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](19, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](20, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](21, ExcludedDomainsComponent_ng_container_33_div_2_select_21_Template, 8, 9, "select", 22);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](22, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](23, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](24, "div", 23);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](25, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](26, ExcludedDomainsComponent_ng_container_33_div_2_button_26_Template, 5, 3, "button", 24);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](27, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](28, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const domain_r3 = ctx.$implicit;
+ const i_r4 = ctx.index;
+ const ctx_r2 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate"]("appA11yTitle", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](3, 12, "remove"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate1"]("for", "excludedDomain", i_r4, "");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind2"](12, 14, "uriPosition", i_r4 + 1));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate1"]("id", "excludedDomain", i_r4, "");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate1"]("name", "excludedDomain", i_r4, "");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate1"]("placeholder", "", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](15, 17, "ex"), " https://google.com");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngModel", domain_r3.uri);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate1"]("for", "currentUris", i_r4, "");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate2"]("\n ", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](19, 19, "currentUri"), " ", i_r4 + 1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", ctx_r2.currentUris && ctx_r2.currentUris.length);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", ctx_r2.currentUris && ctx_r2.currentUris.length);
+} }
+function ExcludedDomainsComponent_ng_container_33_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementContainerStart"](0);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](2, ExcludedDomainsComponent_ng_container_33_div_2_Template, 29, 21, "div", 14);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementContainerEnd"]();
+} if (rf & 2) {
+ const ctx_r1 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngForOf", ctx_r1.excludedDomains)("ngForTrackBy", ctx_r1.trackByFunction);
+} }
+const BroadcasterSubscriptionId = 'excludedDomains';
+class ExcludedDomainsComponent {
+ constructor(storageService, i18nService, router, broadcasterService, ngZone, platformUtilsService) {
+ this.storageService = storageService;
+ this.i18nService = i18nService;
+ this.router = router;
+ this.broadcasterService = broadcasterService;
+ this.ngZone = ngZone;
+ this.platformUtilsService = platformUtilsService;
+ this.excludedDomains = [];
+ }
+ ngOnInit() {
+ return __awaiter(this, void 0, void 0, function* () {
+ const savedDomains = yield this.storageService.get(jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_2__["ConstantsService"].neverDomainsKey);
+ if (savedDomains) {
+ for (const uri of Object.keys(savedDomains)) {
+ this.excludedDomains.push({ uri: uri, showCurrentUris: false });
+ }
+ }
+ yield this.loadCurrentUris();
+ this.broadcasterService.subscribe(BroadcasterSubscriptionId, (message) => {
+ this.ngZone.run(() => __awaiter(this, void 0, void 0, function* () {
+ switch (message.command) {
+ case 'tabChanged':
+ case 'windowChanged':
+ if (this.loadCurrentUrisTimeout != null) {
+ window.clearTimeout(this.loadCurrentUrisTimeout);
+ }
+ this.loadCurrentUrisTimeout = window.setTimeout(() => __awaiter(this, void 0, void 0, function* () { return yield this.loadCurrentUris(); }), 500);
+ break;
+ default:
+ break;
+ }
+ }));
+ });
+ });
+ }
+ ngOnDestroy() {
+ this.broadcasterService.unsubscribe(BroadcasterSubscriptionId);
+ }
+ addUri() {
+ return __awaiter(this, void 0, void 0, function* () {
+ this.excludedDomains.push({ uri: '', showCurrentUris: false });
+ });
+ }
+ removeUri(i) {
+ return __awaiter(this, void 0, void 0, function* () {
+ this.excludedDomains.splice(i, 1);
+ });
+ }
+ submit() {
+ return __awaiter(this, void 0, void 0, function* () {
+ const savedDomains = {};
+ for (const domain of this.excludedDomains) {
+ if (domain.uri && domain.uri !== '') {
+ const validDomain = jslib_common_misc_utils__WEBPACK_IMPORTED_MODULE_8__["Utils"].getHostname(domain.uri);
+ if (!validDomain) {
+ this.platformUtilsService.showToast('error', null, this.i18nService.t('excludedDomainsInvalidDomain', domain.uri));
+ return;
+ }
+ savedDomains[validDomain] = null;
+ }
+ }
+ yield this.storageService.save(jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_2__["ConstantsService"].neverDomainsKey, savedDomains);
+ this.router.navigate(['/tabs/settings']);
+ });
+ }
+ trackByFunction(index, item) {
+ return index;
+ }
+ toggleUriInput(domain) {
+ domain.showCurrentUris = !domain.showCurrentUris;
+ }
+ loadCurrentUris() {
+ return __awaiter(this, void 0, void 0, function* () {
+ const tabs = yield _browser_browserApi__WEBPACK_IMPORTED_MODULE_7__["BrowserApi"].tabsQuery({ windowType: 'normal' });
+ if (tabs) {
+ const uriSet = new Set(tabs.map(tab => jslib_common_misc_utils__WEBPACK_IMPORTED_MODULE_8__["Utils"].getHostname(tab.url)));
+ uriSet.delete(null);
+ this.currentUris = Array.from(uriSet);
+ }
+ });
+ }
+}
+ExcludedDomainsComponent.ɵfac = function ExcludedDomainsComponent_Factory(t) { return new (t || ExcludedDomainsComponent)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_storage_service__WEBPACK_IMPORTED_MODULE_5__["StorageService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_3__["I18nService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_router__WEBPACK_IMPORTED_MODULE_1__["Router"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_angular_services_broadcaster_service__WEBPACK_IMPORTED_MODULE_6__["BroadcasterService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["NgZone"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_4__["PlatformUtilsService"])); };
+ExcludedDomainsComponent.ɵcmp = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineComponent"]({ type: ExcludedDomainsComponent, selectors: [["app-excluded-domains"]], decls: 48, vars: 16, consts: [[3, "ngSubmit"], ["form", ""], [1, "left"], ["routerLink", "/tabs/settings"], [1, "center"], [1, "title"], [1, "right"], ["type", "submit", "appBlurClick", ""], [1, "box"], [1, "box-content"], [4, "ngIf"], ["type", "button", "appStopClick", "", "appBlurClick", "", 1, "box-content-row", "box-content-row-newmulti", 3, "click"], ["aria-hidden", "true", 1, "fa", "fa-plus-circle", "fa-fw", "fa-lg"], [1, "box-footer"], ["class", "box-content-row box-content-row-multi", "appBoxRow", "", 4, "ngFor", "ngForOf", "ngForTrackBy"], ["appBoxRow", "", 1, "box-content-row", "box-content-row-multi"], ["type", "button", "appStopClick", "", 3, "appA11yTitle", "click"], ["aria-hidden", "true", 1, "fa", "fa-minus-circle", "fa-lg"], [1, "row-main"], [3, "for"], ["type", "text", "inputmode", "url", "appInputVerbatim", "", 3, "id", "name", "ngModel", "placeholder", "ngModelChange"], [1, "sr-only", 3, "for"], [3, "id", "name", "ngModel", "hidden", "ngModelChange", 4, "ngIf"], [1, "action-buttons"], ["type", "button", "class", "row-btn", "appStopClick", "", "appBlurClick", "", 3, "appA11yTitle", "click", 4, "ngIf"], [3, "id", "name", "ngModel", "hidden", "ngModelChange"], [3, "ngValue"], [3, "ngValue", 4, "ngFor", "ngForOf"], ["type", "button", "appStopClick", "", "appBlurClick", "", 1, "row-btn", 3, "appA11yTitle", "click"], ["aria-hidden", "true", 1, "fa", "fa-lg", "fa-list"]], template: function ExcludedDomainsComponent_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "form", 0, 1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("ngSubmit", function ExcludedDomainsComponent_Template_form_ngSubmit_0_listener() { return ctx.submit(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](2, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](3, "header");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](4, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](5, "div", 2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](6, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](7, "a", 3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](9, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](10, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](11, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](12, "div", 4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](13, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](14, "span", 5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](15);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](16, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](17, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](18, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](19, "div", 6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](20, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](21, "button", 7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](22);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](23, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](24, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](25, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](26, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](27, "content");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](28, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](29, "div", 8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](30, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](31, "div", 9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](32, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](33, ExcludedDomainsComponent_ng_container_33_Template, 4, 2, "ng-container", 10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](34, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](35, "button", 11);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("click", function ExcludedDomainsComponent_Template_button_click_35_listener() { return ctx.addUri(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](36, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](37, "i", 12);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](38);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](39, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](40, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](41, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](42, "div", 13);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](43);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](44, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](45, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](46, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](47, "\n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ } if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](9, 6, "cancel"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](16, 8, "excludedDomains"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](23, 10, "save"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](11);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", ctx.excludedDomains);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate1"](" ", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](39, 12, "newUri"), "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate1"]("\n ", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](44, 14, "excludedDomainsDesc"), "\n ");
+ } }, directives: [_angular_forms__WEBPACK_IMPORTED_MODULE_9__["ɵangular_packages_forms_forms_ba"], _angular_forms__WEBPACK_IMPORTED_MODULE_9__["NgControlStatusGroup"], _angular_forms__WEBPACK_IMPORTED_MODULE_9__["NgForm"], _angular_router__WEBPACK_IMPORTED_MODULE_1__["RouterLinkWithHref"], jslib_angular_directives_blur_click_directive__WEBPACK_IMPORTED_MODULE_10__["BlurClickDirective"], _angular_common__WEBPACK_IMPORTED_MODULE_11__["NgIf"], jslib_angular_directives_stop_click_directive__WEBPACK_IMPORTED_MODULE_12__["StopClickDirective"], _angular_common__WEBPACK_IMPORTED_MODULE_11__["NgForOf"], jslib_angular_directives_box_row_directive__WEBPACK_IMPORTED_MODULE_13__["BoxRowDirective"], jslib_angular_directives_a11y_title_directive__WEBPACK_IMPORTED_MODULE_14__["A11yTitleDirective"], _angular_forms__WEBPACK_IMPORTED_MODULE_9__["DefaultValueAccessor"], jslib_angular_directives_input_verbatim_directive__WEBPACK_IMPORTED_MODULE_15__["InputVerbatimDirective"], _angular_forms__WEBPACK_IMPORTED_MODULE_9__["NgControlStatus"], _angular_forms__WEBPACK_IMPORTED_MODULE_9__["NgModel"], _angular_forms__WEBPACK_IMPORTED_MODULE_9__["SelectControlValueAccessor"], _angular_forms__WEBPACK_IMPORTED_MODULE_9__["NgSelectOption"], _angular_forms__WEBPACK_IMPORTED_MODULE_9__["ɵangular_packages_forms_forms_z"]], pipes: [jslib_angular_pipes_i18n_pipe__WEBPACK_IMPORTED_MODULE_16__["I18nPipe"]], encapsulation: 2 });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](ExcludedDomainsComponent, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Component"],
+ args: [{
+ selector: 'app-excluded-domains',
+ templateUrl: 'excluded-domains.component.html',
+ }]
+ }], function () { return [{ type: jslib_common_abstractions_storage_service__WEBPACK_IMPORTED_MODULE_5__["StorageService"] }, { type: jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_3__["I18nService"] }, { type: _angular_router__WEBPACK_IMPORTED_MODULE_1__["Router"] }, { type: jslib_angular_services_broadcaster_service__WEBPACK_IMPORTED_MODULE_6__["BroadcasterService"] }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["NgZone"] }, { type: jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_4__["PlatformUtilsService"] }]; }, null); })();
+
+
+/***/ }),
+
+/***/ "./src/popup/settings/export.component.ts":
+/*!************************************************!*\
+ !*** ./src/popup/settings/export.component.ts ***!
+ \************************************************/
+/*! exports provided: ExportComponent */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ExportComponent", function() { return ExportComponent; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var _angular_router__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @angular/router */ "./node_modules/@angular/router/__ivy_ngcc__/fesm2015/router.js");
+/* harmony import */ var jslib_common_abstractions_crypto_service__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! jslib-common/abstractions/crypto.service */ "./jslib/common/src/abstractions/crypto.service.ts");
+/* harmony import */ var jslib_common_abstractions_event_service__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! jslib-common/abstractions/event.service */ "./jslib/common/src/abstractions/event.service.ts");
+/* harmony import */ var jslib_common_abstractions_export_service__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! jslib-common/abstractions/export.service */ "./jslib/common/src/abstractions/export.service.ts");
+/* harmony import */ var jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! jslib-common/abstractions/i18n.service */ "./jslib/common/src/abstractions/i18n.service.ts");
+/* harmony import */ var jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! jslib-common/abstractions/log.service */ "./jslib/common/src/abstractions/log.service.ts");
+/* harmony import */ var jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! jslib-common/abstractions/platformUtils.service */ "./jslib/common/src/abstractions/platformUtils.service.ts");
+/* harmony import */ var jslib_common_abstractions_policy_service__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! jslib-common/abstractions/policy.service */ "./jslib/common/src/abstractions/policy.service.ts");
+/* harmony import */ var jslib_angular_components_export_component__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! jslib-angular/components/export.component */ "./jslib/angular/src/components/export.component.ts");
+/* harmony import */ var _angular_forms__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @angular/forms */ "./node_modules/@angular/forms/__ivy_ngcc__/fesm2015/forms.js");
+/* harmony import */ var jslib_angular_directives_blur_click_directive__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! jslib-angular/directives/blur-click.directive */ "./jslib/angular/src/directives/blur-click.directive.ts");
+/* harmony import */ var _angular_common__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @angular/common */ "./node_modules/@angular/common/__ivy_ngcc__/fesm2015/common.js");
+/* harmony import */ var jslib_angular_directives_box_row_directive__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! jslib-angular/directives/box-row.directive */ "./jslib/angular/src/directives/box-row.directive.ts");
+/* harmony import */ var jslib_angular_directives_input_verbatim_directive__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! jslib-angular/directives/input-verbatim.directive */ "./jslib/angular/src/directives/input-verbatim.directive.ts");
+/* harmony import */ var jslib_angular_directives_autofocus_directive__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! jslib-angular/directives/autofocus.directive */ "./jslib/angular/src/directives/autofocus.directive.ts");
+/* harmony import */ var jslib_angular_directives_stop_click_directive__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! jslib-angular/directives/stop-click.directive */ "./jslib/angular/src/directives/stop-click.directive.ts");
+/* harmony import */ var jslib_angular_directives_a11y_title_directive__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! jslib-angular/directives/a11y-title.directive */ "./jslib/angular/src/directives/a11y-title.directive.ts");
+/* harmony import */ var jslib_angular_components_callout_component__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! jslib-angular/components/callout.component */ "./jslib/angular/src/components/callout.component.ts");
+/* harmony import */ var jslib_angular_pipes_i18n_pipe__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! jslib-angular/pipes/i18n.pipe */ "./jslib/angular/src/pipes/i18n.pipe.ts");
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+function ExportComponent_app_callout_34_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "app-callout", 26);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](1, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](3, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate"]("title", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](1, 2, "vaultExportDisabled"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate1"]("\n ", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](3, 4, "personalVaultExportPolicyInEffect"), "\n ");
+} }
+const _c0 = function (a0, a1) { return { "fa-eye": a0, "fa-eye-slash": a1 }; };
+class ExportComponent extends jslib_angular_components_export_component__WEBPACK_IMPORTED_MODULE_9__["ExportComponent"] {
+ constructor(cryptoService, i18nService, platformUtilsService, exportService, eventService, policyService, router, logService) {
+ super(cryptoService, i18nService, platformUtilsService, exportService, eventService, policyService, window, logService);
+ this.router = router;
+ }
+ saved() {
+ super.saved();
+ this.router.navigate(['/tabs/settings']);
+ }
+}
+ExportComponent.ɵfac = function ExportComponent_Factory(t) { return new (t || ExportComponent)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_crypto_service__WEBPACK_IMPORTED_MODULE_2__["CryptoService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_5__["I18nService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_7__["PlatformUtilsService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_export_service__WEBPACK_IMPORTED_MODULE_4__["ExportService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_event_service__WEBPACK_IMPORTED_MODULE_3__["EventService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_policy_service__WEBPACK_IMPORTED_MODULE_8__["PolicyService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_router__WEBPACK_IMPORTED_MODULE_1__["Router"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_6__["LogService"])); };
+ExportComponent.ɵcmp = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineComponent"]({ type: ExportComponent, selectors: [["app-export"]], features: [_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵInheritDefinitionFeature"]], decls: 91, vars: 32, consts: [[3, "ngSubmit"], [1, "left"], ["routerLink", "/tabs/settings"], ["aria-hidden", "true", 1, "header-icon"], [1, "fa", "fa-chevron-left"], [1, "center"], [1, "title"], [1, "right"], ["appBlurClick", "", "type", "submit", 3, "disabled"], ["type", "warning", 3, "title", 4, "ngIf"], [1, "box"], [1, "box-content"], ["appBoxRow", "", 1, "box-content-row"], ["for", "format"], ["id", "format", "name", "Format", 3, "ngModel", "disabled", "ngModelChange"], ["value", "json"], ["value", "csv"], ["value", "encrypted_json"], ["appBoxRow", "", 1, "box-content-row", "box-content-row-flex"], [1, "row-main"], ["for", "masterPassword"], ["id", "masterPassword", "name", "MasterPassword", "required", "", "appInputVerbatim", "", "appAutofocus", "", 1, "monospaced", 3, "type", "ngModel", "disabled", "ngModelChange"], [1, "action-buttons"], ["type", "button", "appStopClick", "", "appBlurClick", "", 1, "row-btn", 3, "appA11yTitle", "click"], ["aria-hidden", "true", 1, "fa", "fa-lg", 3, "ngClass"], [1, "box-footer"], ["type", "warning", 3, "title"]], template: function ExportComponent_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "form", 0);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("ngSubmit", function ExportComponent_Template_form_ngSubmit_0_listener() { return ctx.submit(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](2, "header");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](4, "div", 1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](6, "a", 2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](8, "span", 3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](9, "i", 4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](10, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](11, "span");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](12);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](13, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](14, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](15, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](16, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](17, "div", 5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](18, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](19, "span", 6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](20);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](21, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](22, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](23, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](24, "div", 7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](25, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](26, "button", 8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](27);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](28, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](29, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](30, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](31, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](32, "content");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](33, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](34, ExportComponent_app_callout_34_Template, 4, 6, "app-callout", 9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](35, "\n\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](36, "div", 10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](37, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](38, "div", 11);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](39, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](40, "div", 12);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](41, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](42, "label", 13);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](43);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](44, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](45, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](46, "select", 14);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("ngModelChange", function ExportComponent_Template_select_ngModelChange_46_listener($event) { return ctx.format = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](47, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](48, "option", 15);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](49, ".json");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](50, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](51, "option", 16);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](52, ".csv");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](53, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](54, "option", 17);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](55, ".json (Encrypted)");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](56, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](57, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](58, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](59, "div", 18);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](60, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](61, "div", 19);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](62, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](63, "label", 20);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](64);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](65, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](66, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](67, "input", 21);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("ngModelChange", function ExportComponent_Template_input_ngModelChange_67_listener($event) { return ctx.masterPassword = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](68, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](69, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](70, "div", 22);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](71, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](72, "button", 23);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("click", function ExportComponent_Template_button_click_72_listener() { return ctx.togglePassword(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](73, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](74, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](75, "i", 24);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](76, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](77, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](78, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](79, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](80, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](81, "div", 25);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](82, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](83, "p");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](84);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](85, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](86, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](87, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](88, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](89, "\n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](90, "\n");
+ } if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](12);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](13, 15, "back"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](21, 17, "exportVault"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("disabled", ctx.disabledByPolicy);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](28, 19, "submit"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", ctx.disabledByPolicy);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](44, 21, "fileFormat"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngModel", ctx.format)("disabled", ctx.disabledByPolicy);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](18);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](65, 23, "masterPass"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate"]("type", ctx.showPassword ? "text" : "password");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngModel", ctx.masterPassword)("disabled", ctx.disabledByPolicy);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate"]("appA11yTitle", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](73, 25, "toggleVisibility"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngClass", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpureFunction2"](29, _c0, !ctx.showPassword, ctx.showPassword));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](85, 27, "exportMasterPassword"));
+ } }, directives: [_angular_forms__WEBPACK_IMPORTED_MODULE_10__["ɵangular_packages_forms_forms_ba"], _angular_forms__WEBPACK_IMPORTED_MODULE_10__["NgControlStatusGroup"], _angular_forms__WEBPACK_IMPORTED_MODULE_10__["NgForm"], _angular_router__WEBPACK_IMPORTED_MODULE_1__["RouterLinkWithHref"], jslib_angular_directives_blur_click_directive__WEBPACK_IMPORTED_MODULE_11__["BlurClickDirective"], _angular_common__WEBPACK_IMPORTED_MODULE_12__["NgIf"], jslib_angular_directives_box_row_directive__WEBPACK_IMPORTED_MODULE_13__["BoxRowDirective"], _angular_forms__WEBPACK_IMPORTED_MODULE_10__["SelectControlValueAccessor"], _angular_forms__WEBPACK_IMPORTED_MODULE_10__["NgControlStatus"], _angular_forms__WEBPACK_IMPORTED_MODULE_10__["NgModel"], _angular_forms__WEBPACK_IMPORTED_MODULE_10__["NgSelectOption"], _angular_forms__WEBPACK_IMPORTED_MODULE_10__["ɵangular_packages_forms_forms_z"], _angular_forms__WEBPACK_IMPORTED_MODULE_10__["DefaultValueAccessor"], _angular_forms__WEBPACK_IMPORTED_MODULE_10__["RequiredValidator"], jslib_angular_directives_input_verbatim_directive__WEBPACK_IMPORTED_MODULE_14__["InputVerbatimDirective"], jslib_angular_directives_autofocus_directive__WEBPACK_IMPORTED_MODULE_15__["AutofocusDirective"], jslib_angular_directives_stop_click_directive__WEBPACK_IMPORTED_MODULE_16__["StopClickDirective"], jslib_angular_directives_a11y_title_directive__WEBPACK_IMPORTED_MODULE_17__["A11yTitleDirective"], _angular_common__WEBPACK_IMPORTED_MODULE_12__["NgClass"], jslib_angular_components_callout_component__WEBPACK_IMPORTED_MODULE_18__["CalloutComponent"]], pipes: [jslib_angular_pipes_i18n_pipe__WEBPACK_IMPORTED_MODULE_19__["I18nPipe"]], encapsulation: 2 });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](ExportComponent, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Component"],
+ args: [{
+ selector: 'app-export',
+ templateUrl: 'export.component.html',
+ }]
+ }], function () { return [{ type: jslib_common_abstractions_crypto_service__WEBPACK_IMPORTED_MODULE_2__["CryptoService"] }, { type: jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_5__["I18nService"] }, { type: jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_7__["PlatformUtilsService"] }, { type: jslib_common_abstractions_export_service__WEBPACK_IMPORTED_MODULE_4__["ExportService"] }, { type: jslib_common_abstractions_event_service__WEBPACK_IMPORTED_MODULE_3__["EventService"] }, { type: jslib_common_abstractions_policy_service__WEBPACK_IMPORTED_MODULE_8__["PolicyService"] }, { type: _angular_router__WEBPACK_IMPORTED_MODULE_1__["Router"] }, { type: jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_6__["LogService"] }]; }, null); })();
+
+
+/***/ }),
+
+/***/ "./src/popup/settings/folder-add-edit.component.ts":
+/*!*********************************************************!*\
+ !*** ./src/popup/settings/folder-add-edit.component.ts ***!
+ \*********************************************************/
+/*! exports provided: FolderAddEditComponent */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FolderAddEditComponent", function() { return FolderAddEditComponent; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var _angular_router__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @angular/router */ "./node_modules/@angular/router/__ivy_ngcc__/fesm2015/router.js");
+/* harmony import */ var rxjs_operators__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! rxjs/operators */ "./node_modules/rxjs/_esm5/operators/index.js");
+/* harmony import */ var jslib_common_abstractions_folder_service__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! jslib-common/abstractions/folder.service */ "./jslib/common/src/abstractions/folder.service.ts");
+/* harmony import */ var jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! jslib-common/abstractions/i18n.service */ "./jslib/common/src/abstractions/i18n.service.ts");
+/* harmony import */ var jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! jslib-common/abstractions/log.service */ "./jslib/common/src/abstractions/log.service.ts");
+/* harmony import */ var jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! jslib-common/abstractions/platformUtils.service */ "./jslib/common/src/abstractions/platformUtils.service.ts");
+/* harmony import */ var jslib_angular_components_folder_add_edit_component__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! jslib-angular/components/folder-add-edit.component */ "./jslib/angular/src/components/folder-add-edit.component.ts");
+/* harmony import */ var _angular_forms__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @angular/forms */ "./node_modules/@angular/forms/__ivy_ngcc__/fesm2015/forms.js");
+/* harmony import */ var jslib_angular_directives_api_action_directive__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! jslib-angular/directives/api-action.directive */ "./jslib/angular/src/directives/api-action.directive.ts");
+/* harmony import */ var jslib_angular_directives_blur_click_directive__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! jslib-angular/directives/blur-click.directive */ "./jslib/angular/src/directives/blur-click.directive.ts");
+/* harmony import */ var _angular_common__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @angular/common */ "./node_modules/@angular/common/__ivy_ngcc__/fesm2015/common.js");
+/* harmony import */ var jslib_angular_directives_box_row_directive__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! jslib-angular/directives/box-row.directive */ "./jslib/angular/src/directives/box-row.directive.ts");
+/* harmony import */ var jslib_angular_directives_autofocus_directive__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! jslib-angular/directives/autofocus.directive */ "./jslib/angular/src/directives/autofocus.directive.ts");
+/* harmony import */ var jslib_angular_directives_stop_click_directive__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! jslib-angular/directives/stop-click.directive */ "./jslib/angular/src/directives/stop-click.directive.ts");
+/* harmony import */ var jslib_angular_pipes_i18n_pipe__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! jslib-angular/pipes/i18n.pipe */ "./jslib/angular/src/pipes/i18n.pipe.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+function FolderAddEditComponent_content_31_div_17_Template(rf, ctx) { if (rf & 1) {
+ const _r5 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "div", 17);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](2, "div", 18);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](4, "button", 19, 20);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("click", function FolderAddEditComponent_content_31_div_17_Template_button_click_4_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r5); const ctx_r4 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](2); return ctx_r4.delete(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](6, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](7, "div", 21);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](8, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](9, "div", 22);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](10, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](11, "i", 23);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](12, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](13, "i", 24);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](14, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](15, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](16, "span");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](17);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](18, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](19, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](20, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](21, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](22, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const _r3 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵreference"](5);
+ const ctx_r2 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("appApiAction", ctx_r2.deletePromise);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("hidden", _r3.loading);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("hidden", !_r3.loading);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](18, 4, "deleteFolder"));
+} }
+function FolderAddEditComponent_content_31_Template(rf, ctx) { if (rf & 1) {
+ const _r7 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "content");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](2, "div", 11);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](4, "div", 12);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](6, "div", 13);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](8, "label", 14);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](10, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](11, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](12, "input", 15);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("ngModelChange", function FolderAddEditComponent_content_31_Template_input_ngModelChange_12_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r7); const ctx_r6 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](); return ctx_r6.folder.name = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](13, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](14, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](15, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](16, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](17, FolderAddEditComponent_content_31_div_17_Template, 23, 6, "div", 16);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](18, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r1 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](10, 4, "name"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngModel", ctx_r1.folder.name)("appAutofocus", !ctx_r1.editMode);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", ctx_r1.editMode);
+} }
+class FolderAddEditComponent extends jslib_angular_components_folder_add_edit_component__WEBPACK_IMPORTED_MODULE_7__["FolderAddEditComponent"] {
+ constructor(folderService, i18nService, platformUtilsService, router, route, logService) {
+ super(folderService, i18nService, platformUtilsService, logService);
+ this.router = router;
+ this.route = route;
+ }
+ ngOnInit() {
+ return __awaiter(this, void 0, void 0, function* () {
+ this.route.queryParams.pipe(Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_2__["first"])()).subscribe((params) => __awaiter(this, void 0, void 0, function* () {
+ if (params.folderId) {
+ this.folderId = params.folderId;
+ }
+ yield this.init();
+ }));
+ });
+ }
+ submit() {
+ const _super = Object.create(null, {
+ submit: { get: () => super.submit }
+ });
+ return __awaiter(this, void 0, void 0, function* () {
+ if (yield _super.submit.call(this)) {
+ this.router.navigate(['/folders']);
+ return true;
+ }
+ return false;
+ });
+ }
+ delete() {
+ const _super = Object.create(null, {
+ delete: { get: () => super.delete }
+ });
+ return __awaiter(this, void 0, void 0, function* () {
+ const confirmed = yield _super.delete.call(this);
+ if (confirmed) {
+ this.router.navigate(['/folders']);
+ }
+ return confirmed;
+ });
+ }
+}
+FolderAddEditComponent.ɵfac = function FolderAddEditComponent_Factory(t) { return new (t || FolderAddEditComponent)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_folder_service__WEBPACK_IMPORTED_MODULE_3__["FolderService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_4__["I18nService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_6__["PlatformUtilsService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_router__WEBPACK_IMPORTED_MODULE_1__["Router"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_router__WEBPACK_IMPORTED_MODULE_1__["ActivatedRoute"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_5__["LogService"])); };
+FolderAddEditComponent.ɵcmp = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineComponent"]({ type: FolderAddEditComponent, selectors: [["app-folder-add-edit"]], features: [_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵInheritDefinitionFeature"]], decls: 34, vars: 12, consts: [[3, "appApiAction", "ngSubmit"], ["form", ""], [1, "left"], ["routerLink", "/folders"], [1, "center"], [1, "title"], [1, "right"], ["type", "submit", "appBlurClick", "", 3, "disabled"], [3, "hidden"], ["aria-hidden", "true", 1, "fa", "fa-spinner", "fa-lg", "fa-spin", 3, "hidden"], [4, "ngIf"], [1, "box"], [1, "box-content"], ["appBoxRow", "", 1, "box-content-row"], ["for", "name"], ["id", "name", "type", "text", "name", "Name", 3, "ngModel", "appAutofocus", "ngModelChange"], ["class", "box list", 4, "ngIf"], [1, "box", "list"], [1, "box-content", "single-line"], ["type", "button", "appStopClick", "", "appBlurClick", "", 1, "box-content-row", 3, "appApiAction", "click"], ["deleteBtn", ""], [1, "row-main", "text-danger"], ["aria-hidden", "true", 1, "icon", "text-danger"], [1, "fa", "fa-trash-o", "fa-lg", "fa-fw", 3, "hidden"], [1, "fa", "fa-spinner", "fa-spin", "fa-lg", "fa-fw", 3, "hidden"]], template: function FolderAddEditComponent_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "form", 0, 1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("ngSubmit", function FolderAddEditComponent_Template_form_ngSubmit_0_listener() { return ctx.submit(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](2, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](3, "header");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](4, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](5, "div", 2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](6, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](7, "a", 3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](9, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](10, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](11, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](12, "div", 4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](13, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](14, "span", 5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](15);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](16, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](17, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](18, "div", 6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](19, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](20, "button", 7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](21, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](22, "span", 8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](23);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](24, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](25, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](26, "i", 9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](27, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](28, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](29, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](30, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](31, FolderAddEditComponent_content_31_Template, 19, 6, "content", 10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](32, "\n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](33, "\n");
+ } if (rf & 2) {
+ const _r0 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵreference"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("appApiAction", ctx.formPromise);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](9, 8, "cancel"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](ctx.title);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("disabled", _r0.loading);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("hidden", _r0.loading);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](24, 10, "save"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("hidden", !_r0.loading);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", ctx.folder);
+ } }, directives: [_angular_forms__WEBPACK_IMPORTED_MODULE_8__["ɵangular_packages_forms_forms_ba"], _angular_forms__WEBPACK_IMPORTED_MODULE_8__["NgControlStatusGroup"], _angular_forms__WEBPACK_IMPORTED_MODULE_8__["NgForm"], jslib_angular_directives_api_action_directive__WEBPACK_IMPORTED_MODULE_9__["ApiActionDirective"], _angular_router__WEBPACK_IMPORTED_MODULE_1__["RouterLinkWithHref"], jslib_angular_directives_blur_click_directive__WEBPACK_IMPORTED_MODULE_10__["BlurClickDirective"], _angular_common__WEBPACK_IMPORTED_MODULE_11__["NgIf"], jslib_angular_directives_box_row_directive__WEBPACK_IMPORTED_MODULE_12__["BoxRowDirective"], _angular_forms__WEBPACK_IMPORTED_MODULE_8__["DefaultValueAccessor"], _angular_forms__WEBPACK_IMPORTED_MODULE_8__["NgControlStatus"], _angular_forms__WEBPACK_IMPORTED_MODULE_8__["NgModel"], jslib_angular_directives_autofocus_directive__WEBPACK_IMPORTED_MODULE_13__["AutofocusDirective"], jslib_angular_directives_stop_click_directive__WEBPACK_IMPORTED_MODULE_14__["StopClickDirective"]], pipes: [jslib_angular_pipes_i18n_pipe__WEBPACK_IMPORTED_MODULE_15__["I18nPipe"]], encapsulation: 2 });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](FolderAddEditComponent, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Component"],
+ args: [{
+ selector: 'app-folder-add-edit',
+ templateUrl: 'folder-add-edit.component.html',
+ }]
+ }], function () { return [{ type: jslib_common_abstractions_folder_service__WEBPACK_IMPORTED_MODULE_3__["FolderService"] }, { type: jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_4__["I18nService"] }, { type: jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_6__["PlatformUtilsService"] }, { type: _angular_router__WEBPACK_IMPORTED_MODULE_1__["Router"] }, { type: _angular_router__WEBPACK_IMPORTED_MODULE_1__["ActivatedRoute"] }, { type: jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_5__["LogService"] }]; }, null); })();
+
+
+/***/ }),
+
+/***/ "./src/popup/settings/folders.component.ts":
+/*!*************************************************!*\
+ !*** ./src/popup/settings/folders.component.ts ***!
+ \*************************************************/
+/*! exports provided: FoldersComponent */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FoldersComponent", function() { return FoldersComponent; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var _angular_router__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @angular/router */ "./node_modules/@angular/router/__ivy_ngcc__/fesm2015/router.js");
+/* harmony import */ var jslib_common_abstractions_folder_service__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! jslib-common/abstractions/folder.service */ "./jslib/common/src/abstractions/folder.service.ts");
+/* harmony import */ var jslib_angular_directives_blur_click_directive__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! jslib-angular/directives/blur-click.directive */ "./jslib/angular/src/directives/blur-click.directive.ts");
+/* harmony import */ var jslib_angular_directives_a11y_title_directive__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! jslib-angular/directives/a11y-title.directive */ "./jslib/angular/src/directives/a11y-title.directive.ts");
+/* harmony import */ var _angular_common__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @angular/common */ "./node_modules/@angular/common/__ivy_ngcc__/fesm2015/common.js");
+/* harmony import */ var jslib_angular_directives_stop_click_directive__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! jslib-angular/directives/stop-click.directive */ "./jslib/angular/src/directives/stop-click.directive.ts");
+/* harmony import */ var jslib_angular_pipes_i18n_pipe__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! jslib-angular/pipes/i18n.pipe */ "./jslib/angular/src/pipes/i18n.pipe.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+
+
+
+
+
+
+
+
+
+function FoldersComponent_div_34_button_4_Template(rf, ctx) { if (rf & 1) {
+ const _r5 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "button", 14);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("click", function FoldersComponent_div_34_button_4_Template_button_click_0_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r5); const f_r3 = ctx.$implicit; const ctx_r4 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](2); return ctx_r4.folderSelected(f_r3); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const f_r3 = ctx.$implicit;
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](f_r3.name);
+} }
+function FoldersComponent_div_34_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "div", 11);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](2, "div", 12);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](4, FoldersComponent_div_34_button_4_Template, 2, 1, "button", 13);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](6, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r0 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngForOf", ctx_r0.folders);
+} }
+function FoldersComponent_div_36_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "div", 15);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](2, "p");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](4, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](4, 1, "noFolders"));
+} }
+class FoldersComponent {
+ constructor(folderService, router) {
+ this.folderService = folderService;
+ this.router = router;
+ }
+ ngOnInit() {
+ return __awaiter(this, void 0, void 0, function* () {
+ this.folders = yield this.folderService.getAllDecrypted();
+ // Remove "No Folder"
+ if (this.folders.length > 0) {
+ this.folders = this.folders.slice(0, this.folders.length - 1);
+ }
+ });
+ }
+ folderSelected(folder) {
+ this.router.navigate(['/edit-folder'], { queryParams: { folderId: folder.id } });
+ }
+ addFolder() {
+ this.router.navigate(['/add-folder']);
+ }
+}
+FoldersComponent.ɵfac = function FoldersComponent_Factory(t) { return new (t || FoldersComponent)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_folder_service__WEBPACK_IMPORTED_MODULE_2__["FolderService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_router__WEBPACK_IMPORTED_MODULE_1__["Router"])); };
+FoldersComponent.ɵcmp = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineComponent"]({ type: FoldersComponent, selectors: [["app-folders"]], decls: 39, vars: 11, consts: [[1, "left"], ["routerLink", "/tabs/settings"], [1, "header-icon"], ["aria-hidden", "true", 1, "fa", "fa-chevron-left"], [1, "center"], [1, "title"], [1, "right"], ["type", "button", "appBlurClick", "", 3, "appA11yTitle", "click"], ["aria-hidden", "true", 1, "fa", "fa-plus", "fa-lg", "fa-fw"], ["class", "box list full-list", 4, "ngIf"], ["class", "no-items", 4, "ngIf"], [1, "box", "list", "full-list"], [1, "box-content"], ["type", "button", "appStopClick", "", "class", "box-content-row padded", 3, "click", 4, "ngFor", "ngForOf"], ["type", "button", "appStopClick", "", 1, "box-content-row", "padded", 3, "click"], [1, "no-items"]], template: function FoldersComponent_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "header");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](2, "div", 0);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](4, "a", 1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](6, "span", 2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](7, "i", 3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](8, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](9, "span");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](11, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](12, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](13, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](14, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](15, "div", 4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](16, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](17, "span", 5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](18);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](19, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](20, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](21, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](22, "div", 6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](23, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](24, "button", 7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("click", function FoldersComponent_Template_button_click_24_listener() { return ctx.addFolder(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](25, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](26, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](27, "i", 8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](28, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](29, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](30, "\n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](31, "\n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](32, "content");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](33, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](34, FoldersComponent_div_34_Template, 7, 1, "div", 9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](35, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](36, FoldersComponent_div_36_Template, 6, 3, "div", 10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](37, "\n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](38, "\n");
+ } if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](11, 5, "back"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](19, 7, "folders"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate"]("appA11yTitle", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](25, 9, "addFolder"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", ctx.folders && ctx.folders.length);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", !ctx.folders || !ctx.folders.length);
+ } }, directives: [_angular_router__WEBPACK_IMPORTED_MODULE_1__["RouterLinkWithHref"], jslib_angular_directives_blur_click_directive__WEBPACK_IMPORTED_MODULE_3__["BlurClickDirective"], jslib_angular_directives_a11y_title_directive__WEBPACK_IMPORTED_MODULE_4__["A11yTitleDirective"], _angular_common__WEBPACK_IMPORTED_MODULE_5__["NgIf"], _angular_common__WEBPACK_IMPORTED_MODULE_5__["NgForOf"], jslib_angular_directives_stop_click_directive__WEBPACK_IMPORTED_MODULE_6__["StopClickDirective"]], pipes: [jslib_angular_pipes_i18n_pipe__WEBPACK_IMPORTED_MODULE_7__["I18nPipe"]], encapsulation: 2 });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](FoldersComponent, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Component"],
+ args: [{
+ selector: 'app-folders',
+ templateUrl: 'folders.component.html',
+ }]
+ }], function () { return [{ type: jslib_common_abstractions_folder_service__WEBPACK_IMPORTED_MODULE_2__["FolderService"] }, { type: _angular_router__WEBPACK_IMPORTED_MODULE_1__["Router"] }]; }, null); })();
+
+
+/***/ }),
+
+/***/ "./src/popup/settings/options.component.ts":
+/*!*************************************************!*\
+ !*** ./src/popup/settings/options.component.ts ***!
+ \*************************************************/
+/*! exports provided: OptionsComponent */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "OptionsComponent", function() { return OptionsComponent; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var jslib_common_enums_themeType__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! jslib-common/enums/themeType */ "./jslib/common/src/enums/themeType.ts");
+/* harmony import */ var jslib_common_enums_uriMatchType__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! jslib-common/enums/uriMatchType */ "./jslib/common/src/enums/uriMatchType.ts");
+/* harmony import */ var jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! jslib-common/abstractions/i18n.service */ "./jslib/common/src/abstractions/i18n.service.ts");
+/* harmony import */ var jslib_common_abstractions_messaging_service__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! jslib-common/abstractions/messaging.service */ "./jslib/common/src/abstractions/messaging.service.ts");
+/* harmony import */ var jslib_common_abstractions_state_service__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! jslib-common/abstractions/state.service */ "./jslib/common/src/abstractions/state.service.ts");
+/* harmony import */ var jslib_common_abstractions_storage_service__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! jslib-common/abstractions/storage.service */ "./jslib/common/src/abstractions/storage.service.ts");
+/* harmony import */ var jslib_common_abstractions_totp_service__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! jslib-common/abstractions/totp.service */ "./jslib/common/src/abstractions/totp.service.ts");
+/* harmony import */ var jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! jslib-common/services/constants.service */ "./jslib/common/src/services/constants.service.ts");
+/* harmony import */ var _angular_router__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @angular/router */ "./node_modules/@angular/router/__ivy_ngcc__/fesm2015/router.js");
+/* harmony import */ var _angular_common__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @angular/common */ "./node_modules/@angular/common/__ivy_ngcc__/fesm2015/common.js");
+/* harmony import */ var jslib_angular_directives_box_row_directive__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! jslib-angular/directives/box-row.directive */ "./jslib/angular/src/directives/box-row.directive.ts");
+/* harmony import */ var _angular_forms__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @angular/forms */ "./node_modules/@angular/forms/__ivy_ngcc__/fesm2015/forms.js");
+/* harmony import */ var jslib_angular_pipes_i18n_pipe__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! jslib-angular/pipes/i18n.pipe */ "./jslib/angular/src/pipes/i18n.pipe.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+function OptionsComponent_i_31_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](0, "i", 13);
+} }
+function OptionsComponent_i_33_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](0, "i", 14);
+} }
+function OptionsComponent_ng_container_37_option_14_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "option", 31);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const o_r11 = ctx.$implicit;
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngValue", o_r11.value);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](o_r11.name);
+} }
+function OptionsComponent_ng_container_37_div_24_option_12_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "option", 31);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const o_r13 = ctx.$implicit;
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngValue", o_r13.value);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](o_r13.name);
+} }
+function OptionsComponent_ng_container_37_div_24_Template(rf, ctx) { if (rf & 1) {
+ const _r15 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "div", 7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](2, "div", 15);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](4, "div", 16);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](6, "label", 32);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](8, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](9, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](10, "select", 33);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("ngModelChange", function OptionsComponent_ng_container_37_div_24_Template_select_ngModelChange_10_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r15); const ctx_r14 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](2); return ctx_r14.clearClipboard = $event; })("change", function OptionsComponent_ng_container_37_div_24_Template_select_change_10_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r15); const ctx_r16 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](2); return ctx_r16.saveClearClipboard(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](11, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](12, OptionsComponent_ng_container_37_div_24_option_12_Template, 2, 2, "option", 19);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](13, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](14, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](15, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](16, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](17, "div", 20);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](18);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](19, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](20, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r10 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](8, 4, "clearClipboard"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngModel", ctx_r10.clearClipboard);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngForOf", ctx_r10.clearClipboardOptions);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](19, 6, "clearClipboardDesc"));
+} }
+function OptionsComponent_ng_container_37_Template(rf, ctx) { if (rf & 1) {
+ const _r18 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementContainerStart"](0);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](2, "div", 7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](4, "div", 15);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](6, "div", 16);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](8, "label", 17);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](10, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](11, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](12, "select", 18);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("ngModelChange", function OptionsComponent_ng_container_37_Template_select_ngModelChange_12_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r18); const ctx_r17 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](); return ctx_r17.defaultUriMatch = $event; })("change", function OptionsComponent_ng_container_37_Template_select_change_12_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r18); const ctx_r19 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](); return ctx_r19.saveDefaultUriMatch(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](13, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](14, OptionsComponent_ng_container_37_option_14_Template, 2, 2, "option", 19);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](15, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](16, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](17, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](18, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](19, "div", 20);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](20);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](21, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](22, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](23, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](24, OptionsComponent_ng_container_37_div_24_Template, 21, 8, "div", 21);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](25, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](26, "div", 7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](27, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](28, "div", 15);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](29, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](30, "div", 22);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](31, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](32, "label", 23);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](33);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](34, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](35, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](36, "input", 24);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("change", function OptionsComponent_ng_container_37_Template_input_change_36_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r18); const ctx_r20 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](); return ctx_r20.updateAutoTotpCopy(); })("ngModelChange", function OptionsComponent_ng_container_37_Template_input_ngModelChange_36_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r18); const ctx_r21 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](); return ctx_r21.disableAutoTotpCopy = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](37, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](38, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](39, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](40, "div", 20);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](41);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](42, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](43, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](44, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](45, "div", 7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](46, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](47, "div", 15);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](48, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](49, "div", 22);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](50, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](51, "label", 25);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](52);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](53, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](54, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](55, "input", 26);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("change", function OptionsComponent_ng_container_37_Template_input_change_55_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r18); const ctx_r22 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](); return ctx_r22.updateAddLoginNotification(); })("ngModelChange", function OptionsComponent_ng_container_37_Template_input_ngModelChange_55_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r18); const ctx_r23 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](); return ctx_r23.disableAddLoginNotification = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](56, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](57, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](58, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](59, "div", 20);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](60);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](61, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](62, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](63, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](64, "div", 7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](65, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](66, "div", 15);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](67, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](68, "div", 22);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](69, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](70, "label", 27);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](71);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](72, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](73, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](74, "input", 28);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("change", function OptionsComponent_ng_container_37_Template_input_change_74_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r18); const ctx_r24 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](); return ctx_r24.updateChangedPasswordNotification(); })("ngModelChange", function OptionsComponent_ng_container_37_Template_input_ngModelChange_74_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r18); const ctx_r25 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](); return ctx_r25.disableChangedPasswordNotification = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](75, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](76, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](77, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](78, "div", 20);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](79);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](80, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](81, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](82, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](83, "div", 7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](84, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](85, "div", 15);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](86, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](87, "div", 22);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](88, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](89, "label", 29);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](90);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](91, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](92, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](93, "input", 30);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("change", function OptionsComponent_ng_container_37_Template_input_change_93_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r18); const ctx_r26 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](); return ctx_r26.updateDisableContextMenuItem(); })("ngModelChange", function OptionsComponent_ng_container_37_Template_input_ngModelChange_93_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r18); const ctx_r27 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](); return ctx_r27.disableContextMenuItem = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](94, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](95, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](96, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](97, "div", 20);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](98);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](99, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](100, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](101, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementContainerEnd"]();
+} if (rf & 2) {
+ const ctx_r2 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](10, 17, "defaultUriMatchDetection"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngModel", ctx_r2.defaultUriMatch);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngForOf", ctx_r2.uriMatchOptions);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](21, 19, "defaultUriMatchDetectionDesc"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", ctx_r2.showClearClipboard);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](34, 21, "disableAutoTotpCopy"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngModel", ctx_r2.disableAutoTotpCopy);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](42, 23, "disableAutoTotpCopyDesc"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](11);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](53, 25, "disableAddLoginNotification"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngModel", ctx_r2.disableAddLoginNotification);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](61, 27, "addLoginNotificationDesc"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](11);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](72, 29, "disableChangedPasswordNotification"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngModel", ctx_r2.disableChangedPasswordNotification);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](80, 31, "disableChangedPasswordNotificationDesc"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](11);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](91, 33, "disableContextMenuItem"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngModel", ctx_r2.disableContextMenuItem);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](99, 35, "disableContextMenuItemDesc"));
+} }
+function OptionsComponent_i_43_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](0, "i", 13);
+} }
+function OptionsComponent_i_45_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](0, "i", 14);
+} }
+function OptionsComponent_ng_container_49_option_90_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "option", 31);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const o_r29 = ctx.$implicit;
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngValue", o_r29.value);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](o_r29.name);
+} }
+function OptionsComponent_ng_container_49_Template(rf, ctx) { if (rf & 1) {
+ const _r31 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementContainerStart"](0);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](2, "div", 7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](4, "div", 15);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](6, "div", 22);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](8, "label", 34);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](10, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](11, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](12, "input", 35);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("change", function OptionsComponent_ng_container_49_Template_input_change_12_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r31); const ctx_r30 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](); return ctx_r30.updateShowCards(); })("ngModelChange", function OptionsComponent_ng_container_49_Template_input_ngModelChange_12_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r31); const ctx_r32 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](); return ctx_r32.dontShowCards = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](13, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](14, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](15, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](16, "div", 20);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](17);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](18, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](19, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](20, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](21, "div", 7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](22, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](23, "div", 15);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](24, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](25, "div", 22);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](26, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](27, "label", 36);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](28);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](29, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](30, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](31, "input", 37);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("change", function OptionsComponent_ng_container_49_Template_input_change_31_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r31); const ctx_r33 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](); return ctx_r33.updateShowIdentities(); })("ngModelChange", function OptionsComponent_ng_container_49_Template_input_ngModelChange_31_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r31); const ctx_r34 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](); return ctx_r34.dontShowIdentities = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](32, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](33, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](34, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](35, "div", 20);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](36);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](37, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](38, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](39, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](40, "div", 7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](41, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](42, "div", 15);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](43, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](44, "div", 22);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](45, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](46, "label", 38);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](47);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](48, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](49, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](50, "input", 39);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("change", function OptionsComponent_ng_container_49_Template_input_change_50_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r31); const ctx_r35 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](); return ctx_r35.updateDisableFavicon(); })("ngModelChange", function OptionsComponent_ng_container_49_Template_input_ngModelChange_50_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r31); const ctx_r36 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](); return ctx_r36.disableFavicon = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](51, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](52, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](53, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](54, "div", 20);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](55);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](56, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](57, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](58, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](59, "div", 7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](60, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](61, "div", 15);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](62, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](63, "div", 22);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](64, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](65, "label", 40);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](66);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](67, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](68, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](69, "input", 41);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("change", function OptionsComponent_ng_container_49_Template_input_change_69_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r31); const ctx_r37 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](); return ctx_r37.updateDisableBadgeCounter(); })("ngModelChange", function OptionsComponent_ng_container_49_Template_input_ngModelChange_69_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r31); const ctx_r38 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](); return ctx_r38.disableBadgeCounter = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](70, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](71, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](72, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](73, "div", 20);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](74);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](75, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](76, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](77, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](78, "div", 7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](79, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](80, "div", 15);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](81, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](82, "div", 16);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](83, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](84, "label", 42);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](85);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](86, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](87, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](88, "select", 43);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("ngModelChange", function OptionsComponent_ng_container_49_Template_select_ngModelChange_88_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r31); const ctx_r39 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](); return ctx_r39.theme = $event; })("change", function OptionsComponent_ng_container_49_Template_select_change_88_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r31); const ctx_r40 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](); return ctx_r40.saveTheme(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](89, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](90, OptionsComponent_ng_container_49_option_90_Template, 2, 2, "option", 19);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](91, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](92, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](93, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](94, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](95, "div", 20);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](96);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](97, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](98, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](99, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementContainerEnd"]();
+} if (rf & 2) {
+ const ctx_r5 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](10, 16, "dontShowCardsCurrentTab"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngModel", ctx_r5.dontShowCards);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](18, 18, "dontShowCardsCurrentTabDesc"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](11);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](29, 20, "dontShowIdentitiesCurrentTab"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngModel", ctx_r5.dontShowIdentities);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](37, 22, "dontShowIdentitiesCurrentTabDesc"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](11);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](48, 24, "disableFavicon"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngModel", ctx_r5.disableFavicon);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](56, 26, "disableFaviconDesc"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](11);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](67, 28, "disableBadgeCounter"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngModel", ctx_r5.disableBadgeCounter);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](75, 30, "disableBadgeCounterDesc"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](11);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](86, 32, "theme"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngModel", ctx_r5.theme);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngForOf", ctx_r5.themeOptions);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](97, 34, "themeDesc"));
+} }
+function OptionsComponent_i_55_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](0, "i", 13);
+} }
+function OptionsComponent_i_57_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](0, "i", 14);
+} }
+function OptionsComponent_ng_container_61_option_38_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "option", 31);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const o_r42 = ctx.$implicit;
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngValue", o_r42.value);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](o_r42.name);
+} }
+function OptionsComponent_ng_container_61_Template(rf, ctx) { if (rf & 1) {
+ const _r44 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementContainerStart"](0);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](2, "div", 7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](4, "div", 15);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](6, "div", 22);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](8, "label", 44);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](10, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](11, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](12, "input", 45);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("change", function OptionsComponent_ng_container_61_Template_input_change_12_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r44); const ctx_r43 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](); return ctx_r43.updateAutoFillOnPageLoad(); })("ngModelChange", function OptionsComponent_ng_container_61_Template_input_ngModelChange_12_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r44); const ctx_r45 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](); return ctx_r45.enableAutoFillOnPageLoad = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](13, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](14, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](15, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](16, "div", 20);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](17);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](18, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](19, "b");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](20);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](21, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](22);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](23, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](24, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](25, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](26, "div", 7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](27, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](28, "div", 15);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](29, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](30, "div", 16);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](31, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](32, "label", 46);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](33);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](34, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](35, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](36, "select", 47);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("ngModelChange", function OptionsComponent_ng_container_61_Template_select_ngModelChange_36_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r44); const ctx_r46 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](); return ctx_r46.autoFillOnPageLoadDefault = $event; })("change", function OptionsComponent_ng_container_61_Template_select_change_36_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r44); const ctx_r47 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](); return ctx_r47.updateAutoFillOnPageLoadDefault(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](37, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](38, OptionsComponent_ng_container_61_option_38_Template, 2, 2, "option", 19);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](39, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](40, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](41, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](42, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](43, "div", 20);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](44);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](45, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](46, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](47, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementContainerEnd"]();
+} if (rf & 2) {
+ const ctx_r8 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](10, 10, "enableAutoFillOnPageLoad"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngModel", ctx_r8.enableAutoFillOnPageLoad);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate1"]("\n ", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](18, 12, "enableAutoFillOnPageLoadDesc"), "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](21, 14, "warning"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate1"](": ", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](23, 16, "experimentalFeature"), "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](11);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](34, 18, "defaultAutoFillOnPageLoad"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngModel", ctx_r8.autoFillOnPageLoadDefault)("disabled", !ctx_r8.enableAutoFillOnPageLoad);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngForOf", ctx_r8.autoFillOnPageLoadOptions);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](45, 20, "defaultAutoFillOnPageLoadDesc"));
+} }
+class OptionsComponent {
+ constructor(messagingService, storageService, stateService, totpService, i18nService) {
+ this.messagingService = messagingService;
+ this.storageService = storageService;
+ this.stateService = stateService;
+ this.totpService = totpService;
+ this.disableFavicon = false;
+ this.disableBadgeCounter = false;
+ this.enableAutoFillOnPageLoad = false;
+ this.autoFillOnPageLoadDefault = false;
+ this.disableAutoTotpCopy = false;
+ this.disableContextMenuItem = false;
+ this.disableAddLoginNotification = false;
+ this.disableChangedPasswordNotification = false;
+ this.dontShowCards = false;
+ this.dontShowIdentities = false;
+ this.showClearClipboard = true;
+ this.defaultUriMatch = jslib_common_enums_uriMatchType__WEBPACK_IMPORTED_MODULE_2__["UriMatchType"].Domain;
+ this.showGeneral = true;
+ this.showAutofill = true;
+ this.showDisplay = true;
+ this.themeOptions = [
+ { name: i18nService.t('default'), value: null },
+ { name: i18nService.t('light'), value: jslib_common_enums_themeType__WEBPACK_IMPORTED_MODULE_1__["ThemeType"].Light },
+ { name: i18nService.t('dark'), value: jslib_common_enums_themeType__WEBPACK_IMPORTED_MODULE_1__["ThemeType"].Dark },
+ { name: 'Nord', value: jslib_common_enums_themeType__WEBPACK_IMPORTED_MODULE_1__["ThemeType"].Nord },
+ { name: i18nService.t('solarizedDark'), value: jslib_common_enums_themeType__WEBPACK_IMPORTED_MODULE_1__["ThemeType"].SolarizedDark },
+ ];
+ this.uriMatchOptions = [
+ { name: i18nService.t('baseDomain'), value: jslib_common_enums_uriMatchType__WEBPACK_IMPORTED_MODULE_2__["UriMatchType"].Domain },
+ { name: i18nService.t('host'), value: jslib_common_enums_uriMatchType__WEBPACK_IMPORTED_MODULE_2__["UriMatchType"].Host },
+ { name: i18nService.t('startsWith'), value: jslib_common_enums_uriMatchType__WEBPACK_IMPORTED_MODULE_2__["UriMatchType"].StartsWith },
+ { name: i18nService.t('regEx'), value: jslib_common_enums_uriMatchType__WEBPACK_IMPORTED_MODULE_2__["UriMatchType"].RegularExpression },
+ { name: i18nService.t('exact'), value: jslib_common_enums_uriMatchType__WEBPACK_IMPORTED_MODULE_2__["UriMatchType"].Exact },
+ { name: i18nService.t('never'), value: jslib_common_enums_uriMatchType__WEBPACK_IMPORTED_MODULE_2__["UriMatchType"].Never },
+ ];
+ this.clearClipboardOptions = [
+ { name: i18nService.t('never'), value: null },
+ { name: i18nService.t('tenSeconds'), value: 10 },
+ { name: i18nService.t('twentySeconds'), value: 20 },
+ { name: i18nService.t('thirtySeconds'), value: 30 },
+ { name: i18nService.t('oneMinute'), value: 60 },
+ { name: i18nService.t('twoMinutes'), value: 120 },
+ { name: i18nService.t('fiveMinutes'), value: 300 },
+ ];
+ this.autoFillOnPageLoadOptions = [
+ { name: i18nService.t('autoFillOnPageLoadYes'), value: true },
+ { name: i18nService.t('autoFillOnPageLoadNo'), value: false },
+ ];
+ }
+ ngOnInit() {
+ var _a;
+ return __awaiter(this, void 0, void 0, function* () {
+ this.enableAutoFillOnPageLoad = yield this.storageService.get(jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_8__["ConstantsService"].enableAutoFillOnPageLoadKey);
+ this.autoFillOnPageLoadDefault = (_a = yield this.storageService.get(jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_8__["ConstantsService"].autoFillOnPageLoadDefaultKey)) !== null && _a !== void 0 ? _a : true;
+ this.disableAddLoginNotification = yield this.storageService.get(jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_8__["ConstantsService"].disableAddLoginNotificationKey);
+ this.disableChangedPasswordNotification = yield this.storageService.get(jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_8__["ConstantsService"].disableChangedPasswordNotificationKey);
+ this.disableContextMenuItem = yield this.storageService.get(jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_8__["ConstantsService"].disableContextMenuItemKey);
+ this.dontShowCards = yield this.storageService.get(jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_8__["ConstantsService"].dontShowCardsCurrentTab);
+ this.dontShowIdentities = yield this.storageService.get(jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_8__["ConstantsService"].dontShowIdentitiesCurrentTab);
+ this.disableAutoTotpCopy = !(yield this.totpService.isAutoCopyEnabled());
+ this.disableFavicon = yield this.storageService.get(jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_8__["ConstantsService"].disableFaviconKey);
+ this.disableBadgeCounter = yield this.storageService.get(jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_8__["ConstantsService"].disableBadgeCounterKey);
+ this.theme = yield this.storageService.get(jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_8__["ConstantsService"].themeKey);
+ const defaultUriMatch = yield this.storageService.get(jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_8__["ConstantsService"].defaultUriMatch);
+ this.defaultUriMatch = defaultUriMatch == null ? jslib_common_enums_uriMatchType__WEBPACK_IMPORTED_MODULE_2__["UriMatchType"].Domain : defaultUriMatch;
+ this.clearClipboard = yield this.storageService.get(jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_8__["ConstantsService"].clearClipboardKey);
+ });
+ }
+ updateAddLoginNotification() {
+ return __awaiter(this, void 0, void 0, function* () {
+ yield this.storageService.save(jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_8__["ConstantsService"].disableAddLoginNotificationKey, this.disableAddLoginNotification);
+ });
+ }
+ updateChangedPasswordNotification() {
+ return __awaiter(this, void 0, void 0, function* () {
+ yield this.storageService.save(jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_8__["ConstantsService"].disableChangedPasswordNotificationKey, this.disableChangedPasswordNotification);
+ });
+ }
+ updateDisableContextMenuItem() {
+ return __awaiter(this, void 0, void 0, function* () {
+ yield this.storageService.save(jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_8__["ConstantsService"].disableContextMenuItemKey, this.disableContextMenuItem);
+ this.messagingService.send('bgUpdateContextMenu');
+ });
+ }
+ updateAutoTotpCopy() {
+ return __awaiter(this, void 0, void 0, function* () {
+ yield this.storageService.save(jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_8__["ConstantsService"].disableAutoTotpCopyKey, this.disableAutoTotpCopy);
+ });
+ }
+ updateAutoFillOnPageLoad() {
+ return __awaiter(this, void 0, void 0, function* () {
+ yield this.storageService.save(jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_8__["ConstantsService"].enableAutoFillOnPageLoadKey, this.enableAutoFillOnPageLoad);
+ });
+ }
+ updateAutoFillOnPageLoadDefault() {
+ return __awaiter(this, void 0, void 0, function* () {
+ yield this.storageService.save(jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_8__["ConstantsService"].autoFillOnPageLoadDefaultKey, this.autoFillOnPageLoadDefault);
+ });
+ }
+ updateDisableFavicon() {
+ return __awaiter(this, void 0, void 0, function* () {
+ yield this.storageService.save(jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_8__["ConstantsService"].disableFaviconKey, this.disableFavicon);
+ yield this.stateService.save(jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_8__["ConstantsService"].disableFaviconKey, this.disableFavicon);
+ });
+ }
+ updateDisableBadgeCounter() {
+ return __awaiter(this, void 0, void 0, function* () {
+ yield this.storageService.save(jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_8__["ConstantsService"].disableBadgeCounterKey, this.disableBadgeCounter);
+ yield this.stateService.save(jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_8__["ConstantsService"].disableBadgeCounterKey, this.disableBadgeCounter);
+ this.messagingService.send('bgUpdateContextMenu');
+ });
+ }
+ updateShowCards() {
+ return __awaiter(this, void 0, void 0, function* () {
+ yield this.storageService.save(jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_8__["ConstantsService"].dontShowCardsCurrentTab, this.dontShowCards);
+ yield this.stateService.save(jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_8__["ConstantsService"].dontShowCardsCurrentTab, this.dontShowCards);
+ });
+ }
+ updateShowIdentities() {
+ return __awaiter(this, void 0, void 0, function* () {
+ yield this.storageService.save(jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_8__["ConstantsService"].dontShowIdentitiesCurrentTab, this.dontShowIdentities);
+ yield this.stateService.save(jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_8__["ConstantsService"].dontShowIdentitiesCurrentTab, this.dontShowIdentities);
+ });
+ }
+ saveTheme() {
+ return __awaiter(this, void 0, void 0, function* () {
+ yield this.storageService.save(jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_8__["ConstantsService"].themeKey, this.theme);
+ window.setTimeout(() => window.location.reload(), 200);
+ });
+ }
+ saveDefaultUriMatch() {
+ return __awaiter(this, void 0, void 0, function* () {
+ yield this.storageService.save(jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_8__["ConstantsService"].defaultUriMatch, this.defaultUriMatch);
+ });
+ }
+ saveClearClipboard() {
+ return __awaiter(this, void 0, void 0, function* () {
+ yield this.storageService.save(jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_8__["ConstantsService"].clearClipboardKey, this.clearClipboard);
+ });
+ }
+}
+OptionsComponent.ɵfac = function OptionsComponent_Factory(t) { return new (t || OptionsComponent)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_messaging_service__WEBPACK_IMPORTED_MODULE_4__["MessagingService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_storage_service__WEBPACK_IMPORTED_MODULE_6__["StorageService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_state_service__WEBPACK_IMPORTED_MODULE_5__["StateService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_totp_service__WEBPACK_IMPORTED_MODULE_7__["TotpService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_3__["I18nService"])); };
+OptionsComponent.ɵcmp = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineComponent"]({ type: OptionsComponent, selectors: [["app-options"]], decls: 64, vars: 15, consts: [[1, "left"], ["routerLink", "/tabs/settings"], [1, "header-icon"], ["aria-hidden", "true", 1, "fa", "fa-chevron-left"], [1, "center"], [1, "title"], [1, "right"], [1, "box"], [1, "box-header-expandable", 3, "click"], ["class", "fa fa-chevron-down fa-sm icon", 4, "ngIf"], ["class", "fa fa-chevron-up fa-sm icon", 4, "ngIf"], [4, "ngIf"], [1, "box", "box-section-divider"], [1, "fa", "fa-chevron-down", "fa-sm", "icon"], [1, "fa", "fa-chevron-up", "fa-sm", "icon"], [1, "box-content"], ["appBoxRow", "", 1, "box-content-row"], ["for", "defaultUriMatch"], ["id", "defaultUriMatch", "name", "DefaultUriMatch", 3, "ngModel", "ngModelChange", "change"], [3, "ngValue", 4, "ngFor", "ngForOf"], [1, "box-footer"], ["class", "box", 4, "ngIf"], ["appBoxRow", "", 1, "box-content-row", "box-content-row-checkbox"], ["for", "totp"], ["id", "totp", "type", "checkbox", 3, "ngModel", "change", "ngModelChange"], ["for", "addlogin-notification-bar"], ["id", "addlogin-notification-bar", "type", "checkbox", 3, "ngModel", "change", "ngModelChange"], ["for", "changedpass-notification-bar"], ["id", "changedpass-notification-bar", "type", "checkbox", 3, "ngModel", "change", "ngModelChange"], ["for", "context-menu"], ["id", "context-menu", "type", "checkbox", 3, "ngModel", "change", "ngModelChange"], [3, "ngValue"], ["for", "clearClipboard"], ["id", "clearClipboard", "name", "ClearClipboard", 3, "ngModel", "ngModelChange", "change"], ["for", "dontShowCards"], ["id", "dontShowCards", "type", "checkbox", 3, "ngModel", "change", "ngModelChange"], ["for", "dontShowIdentities"], ["id", "dontShowIdentities", "type", "checkbox", 3, "ngModel", "change", "ngModelChange"], ["for", "favicon"], ["id", "favicon", "type", "checkbox", 3, "ngModel", "change", "ngModelChange"], ["for", "badge"], ["id", "badge", "type", "checkbox", 3, "ngModel", "change", "ngModelChange"], ["for", "theme"], ["id", "theme", "name", "Theme", 3, "ngModel", "ngModelChange", "change"], ["for", "autofill"], ["id", "autofill", "type", "checkbox", 3, "ngModel", "change", "ngModelChange"], ["for", "defaultAutofill"], ["id", "defaultAutofill", "name", "DefaultAutofill", 3, "ngModel", "disabled", "ngModelChange", "change"]], template: function OptionsComponent_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "header");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](2, "div", 0);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](4, "a", 1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](6, "span", 2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](7, "i", 3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](8, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](9, "span");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](11, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](12, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](13, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](14, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](15, "div", 4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](16, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](17, "span", 5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](18);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](19, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](20, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](21, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](22, "div", 6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](23, "\n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](24, "\n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](25, "content");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](26, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](27, "div", 7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](28, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](29, "div", 8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("click", function OptionsComponent_Template_div_click_29_listener() { return ctx.showGeneral = !ctx.showGeneral; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](30, "\n General\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](31, OptionsComponent_i_31_Template, 1, 0, "i", 9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](32, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](33, OptionsComponent_i_33_Template, 1, 0, "i", 10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](34, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](35, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](36, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](37, OptionsComponent_ng_container_37_Template, 102, 37, "ng-container", 11);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](38, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](39, "div", 12);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](40, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](41, "div", 8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("click", function OptionsComponent_Template_div_click_41_listener() { return ctx.showDisplay = !ctx.showDisplay; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](42, "\n Display\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](43, OptionsComponent_i_43_Template, 1, 0, "i", 9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](44, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](45, OptionsComponent_i_45_Template, 1, 0, "i", 10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](46, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](47, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](48, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](49, OptionsComponent_ng_container_49_Template, 100, 36, "ng-container", 11);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](50, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](51, "div", 12);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](52, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](53, "div", 8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("click", function OptionsComponent_Template_div_click_53_listener() { return ctx.showAutofill = !ctx.showAutofill; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](54, "\n Autofill\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](55, OptionsComponent_i_55_Template, 1, 0, "i", 9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](56, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](57, OptionsComponent_i_57_Template, 1, 0, "i", 10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](58, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](59, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](60, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](61, OptionsComponent_ng_container_61_Template, 48, 22, "ng-container", 11);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](62, "\n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](63, "\n");
+ } if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](11, 11, "back"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](19, 13, "options"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](13);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", !ctx.showGeneral);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", ctx.showGeneral);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", ctx.showGeneral);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", !ctx.showDisplay);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", ctx.showDisplay);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", ctx.showDisplay);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", !ctx.showAutofill);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", ctx.showAutofill);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", ctx.showAutofill);
+ } }, directives: [_angular_router__WEBPACK_IMPORTED_MODULE_9__["RouterLinkWithHref"], _angular_common__WEBPACK_IMPORTED_MODULE_10__["NgIf"], jslib_angular_directives_box_row_directive__WEBPACK_IMPORTED_MODULE_11__["BoxRowDirective"], _angular_forms__WEBPACK_IMPORTED_MODULE_12__["SelectControlValueAccessor"], _angular_forms__WEBPACK_IMPORTED_MODULE_12__["NgControlStatus"], _angular_forms__WEBPACK_IMPORTED_MODULE_12__["NgModel"], _angular_common__WEBPACK_IMPORTED_MODULE_10__["NgForOf"], _angular_forms__WEBPACK_IMPORTED_MODULE_12__["CheckboxControlValueAccessor"], _angular_forms__WEBPACK_IMPORTED_MODULE_12__["NgSelectOption"], _angular_forms__WEBPACK_IMPORTED_MODULE_12__["ɵangular_packages_forms_forms_z"]], pipes: [jslib_angular_pipes_i18n_pipe__WEBPACK_IMPORTED_MODULE_13__["I18nPipe"]], encapsulation: 2 });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](OptionsComponent, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Component"],
+ args: [{
+ selector: 'app-options',
+ templateUrl: 'options.component.html',
+ }]
+ }], function () { return [{ type: jslib_common_abstractions_messaging_service__WEBPACK_IMPORTED_MODULE_4__["MessagingService"] }, { type: jslib_common_abstractions_storage_service__WEBPACK_IMPORTED_MODULE_6__["StorageService"] }, { type: jslib_common_abstractions_state_service__WEBPACK_IMPORTED_MODULE_5__["StateService"] }, { type: jslib_common_abstractions_totp_service__WEBPACK_IMPORTED_MODULE_7__["TotpService"] }, { type: jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_3__["I18nService"] }]; }, null); })();
+
+
+/***/ }),
+
+/***/ "./src/popup/settings/premium.component.ts":
+/*!*************************************************!*\
+ !*** ./src/popup/settings/premium.component.ts ***!
+ \*************************************************/
+/*! exports provided: PremiumComponent */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PremiumComponent", function() { return PremiumComponent; });
+/* harmony import */ var _angular_common__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/common */ "./node_modules/@angular/common/__ivy_ngcc__/fesm2015/common.js");
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var jslib_common_abstractions_api_service__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! jslib-common/abstractions/api.service */ "./jslib/common/src/abstractions/api.service.ts");
+/* harmony import */ var jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! jslib-common/abstractions/i18n.service */ "./jslib/common/src/abstractions/i18n.service.ts");
+/* harmony import */ var jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! jslib-common/abstractions/log.service */ "./jslib/common/src/abstractions/log.service.ts");
+/* harmony import */ var jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! jslib-common/abstractions/platformUtils.service */ "./jslib/common/src/abstractions/platformUtils.service.ts");
+/* harmony import */ var jslib_common_abstractions_user_service__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! jslib-common/abstractions/user.service */ "./jslib/common/src/abstractions/user.service.ts");
+/* harmony import */ var jslib_angular_components_premium_component__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! jslib-angular/components/premium.component */ "./jslib/angular/src/components/premium.component.ts");
+/* harmony import */ var _angular_router__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @angular/router */ "./node_modules/@angular/router/__ivy_ngcc__/fesm2015/router.js");
+/* harmony import */ var jslib_angular_directives_blur_click_directive__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! jslib-angular/directives/blur-click.directive */ "./jslib/angular/src/directives/blur-click.directive.ts");
+/* harmony import */ var jslib_angular_directives_api_action_directive__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! jslib-angular/directives/api-action.directive */ "./jslib/angular/src/directives/api-action.directive.ts");
+/* harmony import */ var jslib_angular_pipes_i18n_pipe__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! jslib-angular/pipes/i18n.pipe */ "./jslib/angular/src/pipes/i18n.pipe.ts");
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+function PremiumComponent_ng_container_29_Template(rf, ctx) { if (rf & 1) {
+ const _r4 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementContainerStart"](0);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "p", 9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](4, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](6, "p");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](8, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](9, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](10, "ul", 10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](11, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](12, "li");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](13, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](14, "i", 11);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](15);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](16, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](17, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](18, "li");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](19, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](20, "i", 11);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](21);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](22, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](23, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](24, "li");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](25, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](26, "i", 11);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](27);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](28, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](29, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](30, "li");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](31, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](32, "i", 11);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](33);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](34, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](35, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](36, "li");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](37, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](38, "i", 11);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](39);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](40, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](41, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](42, "li");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](43, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](44, "i", 11);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](45);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](46, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](47, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](48, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](49, "p", 9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](50);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](51, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](52, "button", 12);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("click", function PremiumComponent_ng_container_29_Template_button_click_52_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r4); const ctx_r3 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](); return ctx_r3.purchase(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](53, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](54, "b");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](55);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](56, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](57, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](58, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](59, "button", 13, 14);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("click", function PremiumComponent_ng_container_29_Template_button_click_59_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r4); const ctx_r5 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](); return ctx_r5.refresh(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](61, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](62, "span", 15);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](63);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](64, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](65, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](66, "i", 16);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](67, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](68, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementContainerEnd"]();
+} if (rf & 2) {
+ const _r2 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵreference"](60);
+ const ctx_r0 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](4, 15, "premiumNotCurrentMember"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](8, 17, "premiumSignUpAndGet"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate1"]("\n ", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](16, 19, "ppremiumSignUpStorage"), "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate1"]("\n ", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](22, 21, "ppremiumSignUpTwoStep"), "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate1"]("\n ", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](28, 23, "ppremiumSignUpReports"), "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate1"]("\n ", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](34, 25, "ppremiumSignUpTotp"), "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate1"]("\n ", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](40, 27, "ppremiumSignUpSupport"), "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate1"]("\n ", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](46, 29, "ppremiumSignUpFuture"), "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](ctx_r0.priceString);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](56, 31, "premiumPurchase"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("disabled", _r2.loading)("appApiAction", ctx_r0.refreshPromise);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("hidden", _r2.loading);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](64, 33, "premiumRefresh"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("hidden", !_r2.loading);
+} }
+function PremiumComponent_ng_container_31_Template(rf, ctx) { if (rf & 1) {
+ const _r7 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementContainerStart"](0);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "p", 9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](4, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](6, "p", 17);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](8, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](9, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](10, "button", 18);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("click", function PremiumComponent_ng_container_31_Template_button_click_10_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r7); const ctx_r6 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](); return ctx_r6.manage(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](11, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](12, "b");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](13);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](14, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](15, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](16, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementContainerEnd"]();
+} if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](4, 3, "premiumCurrentMember"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](8, 5, "premiumCurrentMemberThanks"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](14, 7, "premiumManage"));
+} }
+class PremiumComponent extends jslib_angular_components_premium_component__WEBPACK_IMPORTED_MODULE_7__["PremiumComponent"] {
+ constructor(i18nService, platformUtilsService, apiService, userService, currencyPipe, logService) {
+ super(i18nService, platformUtilsService, apiService, userService, logService);
+ this.currencyPipe = currencyPipe;
+ // Support old price string. Can be removed in future once all translations are properly updated.
+ const thePrice = this.currencyPipe.transform(this.price, '$');
+ this.priceString = i18nService.t('premiumPrice', thePrice);
+ if (this.priceString.indexOf('%price%') > -1) {
+ this.priceString = this.priceString.replace('%price%', thePrice);
+ }
+ }
+}
+PremiumComponent.ɵfac = function PremiumComponent_Factory(t) { return new (t || PremiumComponent)(_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_3__["I18nService"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_5__["PlatformUtilsService"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](jslib_common_abstractions_api_service__WEBPACK_IMPORTED_MODULE_2__["ApiService"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](jslib_common_abstractions_user_service__WEBPACK_IMPORTED_MODULE_6__["UserService"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](_angular_common__WEBPACK_IMPORTED_MODULE_0__["CurrencyPipe"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_4__["LogService"])); };
+PremiumComponent.ɵcmp = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdefineComponent"]({ type: PremiumComponent, selectors: [["app-premium"]], features: [_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵInheritDefinitionFeature"]], decls: 35, vars: 8, consts: [[1, "left"], ["routerLink", "/tabs/settings"], [1, "header-icon"], ["aria-hidden", "true", 1, "fa", "fa-chevron-left"], [1, "center"], [1, "title"], [1, "right"], [1, "content"], [4, "ngIf"], [1, "text-center", "lead"], [1, "fa-ul"], ["aria-hidden", "true", 1, "fa-li", "fa", "fa-check", "text-success"], ["type", "button", "appBlurClick", "", 1, "btn", "primary", "block", 3, "click"], ["type", "button", "appBlurClick", "", 1, "btn", "link", "block", 3, "disabled", "appApiAction", "click"], ["refreshBtn", ""], [3, "hidden"], ["aria-hidden", "true", 1, "fa", "fa-spinner", "fa-spin", "fa-lg", "fa-fw", 3, "hidden"], [1, "text-center"], ["type", "button", "appBlurClick", "", 1, "btn", "block", "primary", 3, "click"]], template: function PremiumComponent_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "header");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "div", 0);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](4, "a", 1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](6, "span", 2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](7, "i", 3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](8, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](9, "span");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](11, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](12, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](13, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](14, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](15, "div", 4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](16, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](17, "span", 5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](18);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](19, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](20, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](21, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](22, "div", 6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](23, "\n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](24, "\n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](25, "content");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](26, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](27, "div", 7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](28, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](29, PremiumComponent_ng_container_29_Template, 69, 35, "ng-container", 8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](30, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](31, PremiumComponent_ng_container_31_Template, 17, 9, "ng-container", 8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](32, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](33, "\n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](34, "\n");
+ } if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](11, 4, "back"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](19, 6, "premiumMembership"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](11);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", !ctx.isPremium);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx.isPremium);
+ } }, directives: [_angular_router__WEBPACK_IMPORTED_MODULE_8__["RouterLinkWithHref"], _angular_common__WEBPACK_IMPORTED_MODULE_0__["NgIf"], jslib_angular_directives_blur_click_directive__WEBPACK_IMPORTED_MODULE_9__["BlurClickDirective"], jslib_angular_directives_api_action_directive__WEBPACK_IMPORTED_MODULE_10__["ApiActionDirective"]], pipes: [jslib_angular_pipes_i18n_pipe__WEBPACK_IMPORTED_MODULE_11__["I18nPipe"]], encapsulation: 2 });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵsetClassMetadata"](PremiumComponent, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Component"],
+ args: [{
+ selector: 'app-premium',
+ templateUrl: 'premium.component.html',
+ }]
+ }], function () { return [{ type: jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_3__["I18nService"] }, { type: jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_5__["PlatformUtilsService"] }, { type: jslib_common_abstractions_api_service__WEBPACK_IMPORTED_MODULE_2__["ApiService"] }, { type: jslib_common_abstractions_user_service__WEBPACK_IMPORTED_MODULE_6__["UserService"] }, { type: _angular_common__WEBPACK_IMPORTED_MODULE_0__["CurrencyPipe"] }, { type: jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_4__["LogService"] }]; }, null); })();
+
+
+/***/ }),
+
+/***/ "./src/popup/settings/settings.component.ts":
+/*!**************************************************!*\
+ !*** ./src/popup/settings/settings.component.ts ***!
+ \**************************************************/
+/*! exports provided: SettingsComponent */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SettingsComponent", function() { return SettingsComponent; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var _angular_forms__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @angular/forms */ "./node_modules/@angular/forms/__ivy_ngcc__/fesm2015/forms.js");
+/* harmony import */ var _angular_router__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @angular/router */ "./node_modules/@angular/router/__ivy_ngcc__/fesm2015/router.js");
+/* harmony import */ var angular2_toaster__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! angular2-toaster */ "./node_modules/angular2-toaster/__ivy_ngcc__/fesm2015/angular2-toaster.js");
+/* harmony import */ var sweetalert2_src_sweetalert2_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! sweetalert2/src/sweetalert2.js */ "./node_modules/sweetalert2/src/sweetalert2.js");
+/* harmony import */ var _browser_browserApi__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../browser/browserApi */ "./src/browser/browserApi.ts");
+/* harmony import */ var jslib_common_enums_deviceType__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! jslib-common/enums/deviceType */ "./jslib/common/src/enums/deviceType.ts");
+/* harmony import */ var jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! jslib-common/services/constants.service */ "./jslib/common/src/services/constants.service.ts");
+/* harmony import */ var jslib_common_abstractions_crypto_service__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! jslib-common/abstractions/crypto.service */ "./jslib/common/src/abstractions/crypto.service.ts");
+/* harmony import */ var jslib_common_abstractions_environment_service__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! jslib-common/abstractions/environment.service */ "./jslib/common/src/abstractions/environment.service.ts");
+/* harmony import */ var jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! jslib-common/abstractions/i18n.service */ "./jslib/common/src/abstractions/i18n.service.ts");
+/* harmony import */ var jslib_common_abstractions_messaging_service__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! jslib-common/abstractions/messaging.service */ "./jslib/common/src/abstractions/messaging.service.ts");
+/* harmony import */ var jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! jslib-common/abstractions/platformUtils.service */ "./jslib/common/src/abstractions/platformUtils.service.ts");
+/* harmony import */ var jslib_common_abstractions_storage_service__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! jslib-common/abstractions/storage.service */ "./jslib/common/src/abstractions/storage.service.ts");
+/* harmony import */ var jslib_common_abstractions_user_service__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! jslib-common/abstractions/user.service */ "./jslib/common/src/abstractions/user.service.ts");
+/* harmony import */ var jslib_common_abstractions_vaultTimeout_service__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! jslib-common/abstractions/vaultTimeout.service */ "./jslib/common/src/abstractions/vaultTimeout.service.ts");
+/* harmony import */ var _services_popup_utils_service__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../services/popup-utils.service */ "./src/popup/services/popup-utils.service.ts");
+/* harmony import */ var jslib_angular_services_modal_service__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! jslib-angular/services/modal.service */ "./jslib/angular/src/services/modal.service.ts");
+/* harmony import */ var _components_set_pin_component__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../components/set-pin.component */ "./src/popup/components/set-pin.component.ts");
+/* harmony import */ var _components_pop_out_component__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../components/pop-out.component */ "./src/popup/components/pop-out.component.ts");
+/* harmony import */ var _vault_timeout_input_component__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./vault-timeout-input.component */ "./src/popup/settings/vault-timeout-input.component.ts");
+/* harmony import */ var jslib_angular_directives_box_row_directive__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! jslib-angular/directives/box-row.directive */ "./jslib/angular/src/directives/box-row.directive.ts");
+/* harmony import */ var _angular_common__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! @angular/common */ "./node_modules/@angular/common/__ivy_ngcc__/fesm2015/common.js");
+/* harmony import */ var jslib_angular_directives_stop_click_directive__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! jslib-angular/directives/stop-click.directive */ "./jslib/angular/src/directives/stop-click.directive.ts");
+/* harmony import */ var jslib_angular_directives_blur_click_directive__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! jslib-angular/directives/blur-click.directive */ "./jslib/angular/src/directives/blur-click.directive.ts");
+/* harmony import */ var jslib_angular_pipes_i18n_pipe__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! jslib-angular/pipes/i18n.pipe */ "./jslib/angular/src/pipes/i18n.pipe.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+const _c0 = ["vaultTimeoutActionSelect"];
+function SettingsComponent_option_75_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "option", 29);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const o_r4 = ctx.$implicit;
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngValue", o_r4.value);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](o_r4.name);
+} }
+function SettingsComponent_div_88_Template(rf, ctx) { if (rf & 1) {
+ const _r6 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "div", 18);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](2, "label", 30);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](4, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](6, "input", 31);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("change", function SettingsComponent_div_88_Template_input_change_6_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r6); const ctx_r5 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](); return ctx_r5.updateBiometric(); })("ngModelChange", function SettingsComponent_div_88_Template_input_ngModelChange_6_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r6); const ctx_r7 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](); return ctx_r7.biometric = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r2 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](4, 2, "unlockWithBiometrics"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngModel", ctx_r2.biometric);
+} }
+function SettingsComponent_div_90_Template(rf, ctx) { if (rf & 1) {
+ const _r9 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "div", 18);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](2, "label", 32);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](4, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](6, "input", 33);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("change", function SettingsComponent_div_90_Template_input_change_6_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r9); const ctx_r8 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](); return ctx_r8.updateAutoBiometricsPrompt(); })("ngModelChange", function SettingsComponent_div_90_Template_input_ngModelChange_6_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r9); const ctx_r10 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](); return ctx_r10.disableAutoBiometricsPrompt = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r3 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](4, 3, "disableAutoBiometricsPrompt"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("disabled", !ctx_r3.biometric)("ngModel", ctx_r3.disableAutoBiometricsPrompt);
+} }
+const RateUrls = {
+ [jslib_common_enums_deviceType__WEBPACK_IMPORTED_MODULE_6__["DeviceType"].ChromeExtension]: 'https://chrome.google.com/webstore/detail/bitwarden-free-password-m/nngceckbapebfimnlniiiahkandclblb/reviews',
+ [jslib_common_enums_deviceType__WEBPACK_IMPORTED_MODULE_6__["DeviceType"].FirefoxExtension]: 'https://addons.mozilla.org/en-US/firefox/addon/bitwarden-password-manager/#reviews',
+ [jslib_common_enums_deviceType__WEBPACK_IMPORTED_MODULE_6__["DeviceType"].OperaExtension]: 'https://addons.opera.com/en/extensions/details/bitwarden-free-password-manager/#feedback-container',
+ [jslib_common_enums_deviceType__WEBPACK_IMPORTED_MODULE_6__["DeviceType"].EdgeExtension]: 'https://microsoftedge.microsoft.com/addons/detail/jbkfoedolllekgbhcbcoahefnbanhhlh',
+ [jslib_common_enums_deviceType__WEBPACK_IMPORTED_MODULE_6__["DeviceType"].VivaldiExtension]: 'https://chrome.google.com/webstore/detail/bitwarden-free-password-m/nngceckbapebfimnlniiiahkandclblb/reviews',
+ [jslib_common_enums_deviceType__WEBPACK_IMPORTED_MODULE_6__["DeviceType"].SafariExtension]: 'https://apps.apple.com/app/bitwarden/id1352778147',
+};
+class SettingsComponent {
+ constructor(platformUtilsService, i18nService, vaultTimeoutService, storageService, messagingService, router, environmentService, cryptoService, userService, popupUtilsService, modalService, toasterService) {
+ this.platformUtilsService = platformUtilsService;
+ this.i18nService = i18nService;
+ this.vaultTimeoutService = vaultTimeoutService;
+ this.storageService = storageService;
+ this.messagingService = messagingService;
+ this.router = router;
+ this.environmentService = environmentService;
+ this.cryptoService = cryptoService;
+ this.userService = userService;
+ this.popupUtilsService = popupUtilsService;
+ this.modalService = modalService;
+ this.toasterService = toasterService;
+ this.pin = null;
+ this.biometric = false;
+ this.disableAutoBiometricsPrompt = true;
+ this.previousVaultTimeout = null;
+ this.vaultTimeout = new _angular_forms__WEBPACK_IMPORTED_MODULE_1__["FormControl"](null);
+ }
+ ngOnInit() {
+ var _a;
+ return __awaiter(this, void 0, void 0, function* () {
+ const showOnLocked = !this.platformUtilsService.isFirefox() && !this.platformUtilsService.isSafari();
+ this.vaultTimeouts = [
+ { name: this.i18nService.t('immediately'), value: 0 },
+ { name: this.i18nService.t('oneMinute'), value: 1 },
+ { name: this.i18nService.t('fiveMinutes'), value: 5 },
+ { name: this.i18nService.t('fifteenMinutes'), value: 15 },
+ { name: this.i18nService.t('thirtyMinutes'), value: 30 },
+ { name: this.i18nService.t('oneHour'), value: 60 },
+ { name: this.i18nService.t('fourHours'), value: 240 },
+ ];
+ if (showOnLocked) {
+ this.vaultTimeouts.push({ name: this.i18nService.t('onLocked'), value: -2 });
+ }
+ this.vaultTimeouts.push({ name: this.i18nService.t('onRestart'), value: -1 });
+ this.vaultTimeouts.push({ name: this.i18nService.t('never'), value: null });
+ this.vaultTimeoutActions = [
+ { name: this.i18nService.t('lock'), value: 'lock' },
+ { name: this.i18nService.t('logOut'), value: 'logOut' },
+ ];
+ let timeout = yield this.vaultTimeoutService.getVaultTimeout();
+ if (timeout != null) {
+ if (timeout === -2 && !showOnLocked) {
+ timeout = -1;
+ }
+ this.vaultTimeout.setValue(timeout);
+ }
+ this.previousVaultTimeout = this.vaultTimeout.value;
+ this.vaultTimeout.valueChanges.subscribe(value => {
+ this.saveVaultTimeout(value);
+ });
+ const action = yield this.storageService.get(jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_7__["ConstantsService"].vaultTimeoutActionKey);
+ this.vaultTimeoutAction = action == null ? 'lock' : action;
+ const pinSet = yield this.vaultTimeoutService.isPinLockSet();
+ this.pin = pinSet[0] || pinSet[1];
+ this.supportsBiometric = yield this.platformUtilsService.supportsBiometric();
+ this.biometric = yield this.vaultTimeoutService.isBiometricLockSet();
+ this.disableAutoBiometricsPrompt = (_a = yield this.storageService.get(jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_7__["ConstantsService"].disableAutoBiometricsPromptKey)) !== null && _a !== void 0 ? _a : true;
+ });
+ }
+ saveVaultTimeout(newValue) {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (newValue == null) {
+ const confirmed = yield this.platformUtilsService.showDialog(this.i18nService.t('neverLockWarning'), null, this.i18nService.t('yes'), this.i18nService.t('cancel'), 'warning');
+ if (!confirmed) {
+ this.vaultTimeout.setValue(this.previousVaultTimeout);
+ return;
+ }
+ }
+ if (!this.vaultTimeout.valid) {
+ this.toasterService.popAsync('error', null, this.i18nService.t('vaultTimeoutToLarge'));
+ return;
+ }
+ this.previousVaultTimeout = this.vaultTimeout.value;
+ yield this.vaultTimeoutService.setVaultTimeoutOptions(this.vaultTimeout.value, this.vaultTimeoutAction);
+ if (this.previousVaultTimeout == null) {
+ this.messagingService.send('bgReseedStorage');
+ }
+ });
+ }
+ saveVaultTimeoutAction(newValue) {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (newValue === 'logOut') {
+ const confirmed = yield this.platformUtilsService.showDialog(this.i18nService.t('vaultTimeoutLogOutConfirmation'), this.i18nService.t('vaultTimeoutLogOutConfirmationTitle'), this.i18nService.t('yes'), this.i18nService.t('cancel'), 'warning');
+ if (!confirmed) {
+ this.vaultTimeoutActions.forEach((option, i) => {
+ if (option.value === this.vaultTimeoutAction) {
+ this.vaultTimeoutActionSelectRef.nativeElement.value = i + ': ' + this.vaultTimeoutAction;
+ }
+ });
+ return;
+ }
+ }
+ if (!this.vaultTimeout.valid) {
+ this.toasterService.popAsync('error', null, this.i18nService.t('vaultTimeoutToLarge'));
+ return;
+ }
+ this.vaultTimeoutAction = newValue;
+ yield this.vaultTimeoutService.setVaultTimeoutOptions(this.vaultTimeout.value, this.vaultTimeoutAction);
+ });
+ }
+ updatePin() {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (this.pin) {
+ const ref = this.modalService.open(_components_set_pin_component__WEBPACK_IMPORTED_MODULE_18__["SetPinComponent"], { allowMultipleModals: true });
+ if (ref == null) {
+ this.pin = false;
+ return;
+ }
+ this.pin = yield ref.onClosedPromise();
+ }
+ else {
+ yield this.cryptoService.clearPinProtectedKey();
+ yield this.vaultTimeoutService.clear();
+ }
+ });
+ }
+ updateBiometric() {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (this.biometric && this.supportsBiometric) {
+ let granted;
+ try {
+ granted = yield _browser_browserApi__WEBPACK_IMPORTED_MODULE_5__["BrowserApi"].requestPermission({ permissions: ['nativeMessaging'] });
+ }
+ catch (e) {
+ // tslint:disable-next-line
+ console.error(e);
+ if (this.platformUtilsService.isFirefox() && this.popupUtilsService.inSidebar(window)) {
+ yield this.platformUtilsService.showDialog(this.i18nService.t('nativeMessaginPermissionSidebarDesc'), this.i18nService.t('nativeMessaginPermissionSidebarTitle'), this.i18nService.t('ok'), null);
+ this.biometric = false;
+ return;
+ }
+ }
+ if (!granted) {
+ yield this.platformUtilsService.showDialog(this.i18nService.t('nativeMessaginPermissionErrorDesc'), this.i18nService.t('nativeMessaginPermissionErrorTitle'), this.i18nService.t('ok'), null);
+ this.biometric = false;
+ return;
+ }
+ const submitted = sweetalert2_src_sweetalert2_js__WEBPACK_IMPORTED_MODULE_4__["default"].fire({
+ heightAuto: false,
+ buttonsStyling: false,
+ titleText: this.i18nService.t('awaitDesktop'),
+ text: this.i18nService.t('awaitDesktopDesc'),
+ icon: 'info',
+ iconHtml: '',
+ showCancelButton: true,
+ cancelButtonText: this.i18nService.t('cancel'),
+ showConfirmButton: false,
+ allowOutsideClick: false,
+ });
+ yield this.storageService.save(jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_7__["ConstantsService"].biometricAwaitingAcceptance, true);
+ yield this.cryptoService.toggleKey();
+ yield Promise.race([
+ submitted.then(result => {
+ if (result.dismiss === sweetalert2_src_sweetalert2_js__WEBPACK_IMPORTED_MODULE_4__["default"].DismissReason.cancel) {
+ this.biometric = false;
+ this.storageService.remove(jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_7__["ConstantsService"].biometricAwaitingAcceptance);
+ }
+ }),
+ this.platformUtilsService.authenticateBiometric().then(result => {
+ this.biometric = result;
+ sweetalert2_src_sweetalert2_js__WEBPACK_IMPORTED_MODULE_4__["default"].close();
+ if (this.biometric === false) {
+ this.platformUtilsService.showToast('error', this.i18nService.t('errorEnableBiometricTitle'), this.i18nService.t('errorEnableBiometricDesc'));
+ }
+ }).catch(e => {
+ // Handle connection errors
+ this.biometric = false;
+ }),
+ ]);
+ }
+ else {
+ yield this.storageService.remove(jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_7__["ConstantsService"].biometricUnlockKey);
+ this.vaultTimeoutService.biometricLocked = false;
+ }
+ });
+ }
+ updateAutoBiometricsPrompt() {
+ return __awaiter(this, void 0, void 0, function* () {
+ yield this.storageService.save(jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_7__["ConstantsService"].disableAutoBiometricsPromptKey, this.disableAutoBiometricsPrompt);
+ });
+ }
+ lock() {
+ return __awaiter(this, void 0, void 0, function* () {
+ yield this.vaultTimeoutService.lock(true);
+ });
+ }
+ logOut() {
+ return __awaiter(this, void 0, void 0, function* () {
+ const confirmed = yield this.platformUtilsService.showDialog(this.i18nService.t('logOutConfirmation'), this.i18nService.t('logOut'), this.i18nService.t('yes'), this.i18nService.t('cancel'));
+ if (confirmed) {
+ this.messagingService.send('logout');
+ }
+ });
+ }
+ changePassword() {
+ return __awaiter(this, void 0, void 0, function* () {
+ const confirmed = yield this.platformUtilsService.showDialog(this.i18nService.t('changeMasterPasswordConfirmation'), this.i18nService.t('changeMasterPassword'), this.i18nService.t('yes'), this.i18nService.t('cancel'));
+ if (confirmed) {
+ _browser_browserApi__WEBPACK_IMPORTED_MODULE_5__["BrowserApi"].createNewTab('https://help.bitwarden.com/article/change-your-master-password/');
+ }
+ });
+ }
+ twoStep() {
+ return __awaiter(this, void 0, void 0, function* () {
+ const confirmed = yield this.platformUtilsService.showDialog(this.i18nService.t('twoStepLoginConfirmation'), this.i18nService.t('twoStepLogin'), this.i18nService.t('yes'), this.i18nService.t('cancel'));
+ if (confirmed) {
+ _browser_browserApi__WEBPACK_IMPORTED_MODULE_5__["BrowserApi"].createNewTab('https://help.bitwarden.com/article/setup-two-step-login/');
+ }
+ });
+ }
+ share() {
+ return __awaiter(this, void 0, void 0, function* () {
+ const confirmed = yield this.platformUtilsService.showDialog(this.i18nService.t('learnOrgConfirmation'), this.i18nService.t('learnOrg'), this.i18nService.t('yes'), this.i18nService.t('cancel'));
+ if (confirmed) {
+ _browser_browserApi__WEBPACK_IMPORTED_MODULE_5__["BrowserApi"].createNewTab('https://help.bitwarden.com/article/what-is-an-organization/');
+ }
+ });
+ }
+ webVault() {
+ return __awaiter(this, void 0, void 0, function* () {
+ const url = this.environmentService.getWebVaultUrl();
+ _browser_browserApi__WEBPACK_IMPORTED_MODULE_5__["BrowserApi"].createNewTab(url);
+ });
+ }
+ import() {
+ _browser_browserApi__WEBPACK_IMPORTED_MODULE_5__["BrowserApi"].createNewTab('https://help.bitwarden.com/article/import-data/');
+ }
+ export() {
+ this.router.navigate(['/export']);
+ }
+ help() {
+ _browser_browserApi__WEBPACK_IMPORTED_MODULE_5__["BrowserApi"].createNewTab('https://help.bitwarden.com/');
+ }
+ about() {
+ const year = (new Date()).getFullYear();
+ const versionText = document.createTextNode(this.i18nService.t('version') + ': ' + _browser_browserApi__WEBPACK_IMPORTED_MODULE_5__["BrowserApi"].getApplicationVersion());
+ const div = document.createElement('div');
+ div.innerHTML = `
+ Bitwarden
© Bitwarden Inc. 2015-` + year + `
`;
+ div.appendChild(versionText);
+ sweetalert2_src_sweetalert2_js__WEBPACK_IMPORTED_MODULE_4__["default"].fire({
+ heightAuto: false,
+ buttonsStyling: false,
+ html: div,
+ showConfirmButton: false,
+ showCancelButton: true,
+ cancelButtonText: this.i18nService.t('close'),
+ });
+ }
+ fingerprint() {
+ return __awaiter(this, void 0, void 0, function* () {
+ const fingerprint = yield this.cryptoService.getFingerprint(yield this.userService.getUserId());
+ const p = document.createElement('p');
+ p.innerText = this.i18nService.t('yourAccountsFingerprint') + ':';
+ const p2 = document.createElement('p');
+ p2.innerText = fingerprint.join('-');
+ const div = document.createElement('div');
+ div.appendChild(p);
+ div.appendChild(p2);
+ const result = yield sweetalert2_src_sweetalert2_js__WEBPACK_IMPORTED_MODULE_4__["default"].fire({
+ heightAuto: false,
+ buttonsStyling: false,
+ html: div,
+ showCancelButton: true,
+ cancelButtonText: this.i18nService.t('close'),
+ showConfirmButton: true,
+ confirmButtonText: this.i18nService.t('learnMore'),
+ });
+ if (result.value) {
+ this.platformUtilsService.launchUri('https://help.bitwarden.com/article/fingerprint-phrase/');
+ }
+ });
+ }
+ rate() {
+ const deviceType = this.platformUtilsService.getDevice();
+ _browser_browserApi__WEBPACK_IMPORTED_MODULE_5__["BrowserApi"].createNewTab(RateUrls[deviceType]);
+ }
+}
+SettingsComponent.ɵfac = function SettingsComponent_Factory(t) { return new (t || SettingsComponent)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_12__["PlatformUtilsService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_10__["I18nService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_vaultTimeout_service__WEBPACK_IMPORTED_MODULE_15__["VaultTimeoutService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_storage_service__WEBPACK_IMPORTED_MODULE_13__["StorageService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_messaging_service__WEBPACK_IMPORTED_MODULE_11__["MessagingService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_router__WEBPACK_IMPORTED_MODULE_2__["Router"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_environment_service__WEBPACK_IMPORTED_MODULE_9__["EnvironmentService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_crypto_service__WEBPACK_IMPORTED_MODULE_8__["CryptoService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_user_service__WEBPACK_IMPORTED_MODULE_14__["UserService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_services_popup_utils_service__WEBPACK_IMPORTED_MODULE_16__["PopupUtilsService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_angular_services_modal_service__WEBPACK_IMPORTED_MODULE_17__["ModalService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](angular2_toaster__WEBPACK_IMPORTED_MODULE_3__["ToasterService"])); };
+SettingsComponent.ɵcmp = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineComponent"]({ type: SettingsComponent, selectors: [["app-settings"]], viewQuery: function SettingsComponent_Query(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵviewQuery"](_c0, 3, _angular_core__WEBPACK_IMPORTED_MODULE_0__["ElementRef"]);
+ } if (rf & 2) {
+ let _t;
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵqueryRefresh"](_t = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵloadQuery"]()) && (ctx.vaultTimeoutActionSelectRef = _t.first);
+ } }, decls: 263, vars: 85, consts: [[1, "left"], [1, "center"], [1, "title"], [1, "right"], [1, "box", "list"], [1, "box-header"], [1, "box-content", "single-line"], ["routerLink", "/folders", 1, "box-content-row", "box-content-row-flex", "text-default"], [1, "row-main"], ["aria-hidden", "true", 1, "fa", "fa-chevron-right", "fa-lg", "row-sub-icon"], ["routerLink", "/sync", 1, "box-content-row", "box-content-row-flex", "text-default"], ["routerLink", "/excluded-domains", 1, "box-content-row", "box-content-row-flex", "text-default"], ["ngDefaultControl", "", 3, "vaultTimeouts", "formControl"], ["appBoxRow", "", 1, "box-content-row", "display-block"], ["for", "vaultTimeoutAction"], ["id", "vaultTimeoutAction", "name", "VaultTimeoutActions", 3, "ngModel", "ngModelChange"], ["vaultTimeoutActionSelect", ""], [3, "ngValue", 4, "ngFor", "ngForOf"], ["appBoxRow", "", 1, "box-content-row", "box-content-row-checkbox"], ["for", "pin"], ["id", "pin", "type", "checkbox", 3, "ngModel", "change", "ngModelChange"], ["class", "box-content-row box-content-row-checkbox", "appBoxRow", "", 4, "ngIf"], ["type", "button", "appStopClick", "", "appBlurClick", "", 1, "box-content-row", "box-content-row-flex", "text-default", 3, "click"], ["routerLink", "/premium", 1, "box-content-row"], [1, "icon", "text-primary"], ["aria-hidden", "true", 1, "fa", "fa-fw", "fa-lg", "fa-star"], [1, "text", "text-primary"], ["routerLink", "/options", 1, "box-content-row", "box-content-row-flex", "text-default"], [1, "box-footer"], [3, "ngValue"], ["for", "biometric"], ["id", "biometric", "type", "checkbox", 3, "ngModel", "change", "ngModelChange"], ["for", "autoBiometricsPrompt"], ["id", "autoBiometricsPrompt", "type", "checkbox", 3, "disabled", "ngModel", "change", "ngModelChange"]], template: function SettingsComponent_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "header");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](2, "div", 0);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](4, "app-pop-out");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](6, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](7, "div", 1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](8, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](9, "span", 2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](11, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](12, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](13, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](14, "div", 3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](15, "\n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](16, "\n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](17, "content");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](18, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](19, "div", 4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](20, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](21, "div", 5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](22);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](23, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](24, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](25, "div", 6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](26, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](27, "a", 7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](28, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](29, "div", 8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](30);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](31, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](32, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](33, "i", 9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](34, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](35, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](36, "a", 10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](37, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](38, "div", 8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](39);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](40, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](41, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](42, "i", 9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](43, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](44, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](45, "a", 11);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](46, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](47, "div", 8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](48);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](49, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](50, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](51, "i", 9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](52, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](53, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](54, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](55, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](56, "div", 4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](57, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](58, "div", 5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](59);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](60, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](61, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](62, "div", 6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](63, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](64, "app-vault-timeout-input", 12);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](65, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](66, "div", 13);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](67, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](68, "label", 14);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](69);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](70, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](71, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](72, "select", 15, 16);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("ngModelChange", function SettingsComponent_Template_select_ngModelChange_72_listener($event) { return ctx.saveVaultTimeoutAction($event); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](74, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](75, SettingsComponent_option_75_Template, 2, 2, "option", 17);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](76, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](77, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](78, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](79, "div", 18);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](80, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](81, "label", 19);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](82);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](83, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](84, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](85, "input", 20);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("change", function SettingsComponent_Template_input_change_85_listener() { return ctx.updatePin(); })("ngModelChange", function SettingsComponent_Template_input_ngModelChange_85_listener($event) { return ctx.pin = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](86, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](87, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](88, SettingsComponent_div_88_Template, 8, 4, "div", 21);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](89, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](90, SettingsComponent_div_90_Template, 8, 5, "div", 21);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](91, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](92, "button", 22);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("click", function SettingsComponent_Template_button_click_92_listener() { return ctx.lock(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](93, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](94, "div", 8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](95);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](96, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](97, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](98, "i", 9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](99, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](100, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](101, "button", 22);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("click", function SettingsComponent_Template_button_click_101_listener() { return ctx.twoStep(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](102, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](103, "div", 8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](104);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](105, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](106, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](107, "i", 9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](108, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](109, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](110, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](111, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](112, "div", 4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](113, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](114, "div", 5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](115);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](116, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](117, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](118, "div", 6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](119, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](120, "a", 23);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](121, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](122, "div", 8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](123, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](124, "div", 24);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](125, "i", 25);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](126, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](127, "span", 26);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](128, "b");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](129);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](130, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](131, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](132, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](133, "span");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](134, "i", 9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](135, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](136, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](137, "button", 22);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("click", function SettingsComponent_Template_button_click_137_listener() { return ctx.changePassword(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](138, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](139, "div", 8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](140);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](141, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](142, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](143, "i", 9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](144, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](145, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](146, "button", 22);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("click", function SettingsComponent_Template_button_click_146_listener() { return ctx.fingerprint(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](147, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](148, "div", 8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](149);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](150, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](151, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](152, "i", 9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](153, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](154, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](155, "button", 22);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("click", function SettingsComponent_Template_button_click_155_listener() { return ctx.logOut(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](156, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](157, "div", 8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](158);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](159, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](160, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](161, "i", 9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](162, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](163, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](164, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](165, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](166, "div", 4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](167, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](168, "div", 5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](169);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](170, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](171, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](172, "div", 6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](173, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](174, "button", 22);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("click", function SettingsComponent_Template_button_click_174_listener() { return ctx.import(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](175, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](176, "div", 8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](177);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](178, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](179, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](180, "i", 9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](181, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](182, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](183, "button", 22);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("click", function SettingsComponent_Template_button_click_183_listener() { return ctx.export(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](184, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](185, "div", 8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](186);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](187, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](188, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](189, "i", 9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](190, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](191, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](192, "button", 22);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("click", function SettingsComponent_Template_button_click_192_listener() { return ctx.webVault(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](193, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](194, "div", 8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](195);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](196, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](197, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](198, "i", 9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](199, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](200, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](201, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](202, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](203, "div", 4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](204, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](205, "div", 5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](206);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](207, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](208, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](209, "div", 6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](210, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](211, "a", 27);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](212, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](213, "div", 8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](214);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](215, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](216, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](217, "i", 9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](218, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](219, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](220, "button", 22);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("click", function SettingsComponent_Template_button_click_220_listener() { return ctx.about(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](221, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](222, "div", 8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](223);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](224, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](225, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](226, "i", 9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](227, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](228, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](229, "button", 22);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("click", function SettingsComponent_Template_button_click_229_listener() { return ctx.share(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](230, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](231, "div", 8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](232);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](233, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](234, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](235, "i", 9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](236, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](237, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](238, "button", 22);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("click", function SettingsComponent_Template_button_click_238_listener() { return ctx.help(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](239, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](240, "div", 8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](241);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](242, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](243, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](244, "i", 9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](245, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](246, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](247, "button", 22);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("click", function SettingsComponent_Template_button_click_247_listener() { return ctx.rate(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](248, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](249, "div", 8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](250);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](251, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](252, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](253, "i", 9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](254, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](255, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](256, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](257, "div", 28);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](258);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](259, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](260, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](261, "\n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](262, "\n");
+ } if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](11, 33, "settings"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](12);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](23, 35, "manage"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](31, 37, "folders"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](40, 39, "sync"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](49, 41, "excludedDomains"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](11);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](60, 43, "security"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("vaultTimeouts", ctx.vaultTimeouts)("formControl", ctx.vaultTimeout);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](70, 45, "vaultTimeoutAction"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngModel", ctx.vaultTimeoutAction);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngForOf", ctx.vaultTimeoutActions);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](83, 47, "unlockWithPin"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngModel", ctx.pin);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", ctx.supportsBiometric);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", ctx.supportsBiometric);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](96, 49, "lockNow"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](105, 51, "twoStepLogin"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](11);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](116, 53, "account"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](14);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](130, 55, "premiumMembership"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](11);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](141, 57, "changeMasterPassword"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](150, 59, "fingerprintPhrase"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](159, 61, "logOut"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](11);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](170, 63, "tools"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](178, 65, "importItems"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](187, 67, "exportVault"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](196, 69, "bitWebVault"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](11);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](207, 71, "other"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](215, 73, "options"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](224, 75, "about"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](233, 77, "learnOrg"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](242, 79, "helpFeedback"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](251, 81, "rateExtension"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](259, 83, "rateExtensionDesc"));
+ } }, directives: [_components_pop_out_component__WEBPACK_IMPORTED_MODULE_19__["PopOutComponent"], _angular_router__WEBPACK_IMPORTED_MODULE_2__["RouterLinkWithHref"], _vault_timeout_input_component__WEBPACK_IMPORTED_MODULE_20__["VaultTimeoutInputComponent"], _angular_forms__WEBPACK_IMPORTED_MODULE_1__["DefaultValueAccessor"], _angular_forms__WEBPACK_IMPORTED_MODULE_1__["NgControlStatus"], _angular_forms__WEBPACK_IMPORTED_MODULE_1__["FormControlDirective"], jslib_angular_directives_box_row_directive__WEBPACK_IMPORTED_MODULE_21__["BoxRowDirective"], _angular_forms__WEBPACK_IMPORTED_MODULE_1__["SelectControlValueAccessor"], _angular_forms__WEBPACK_IMPORTED_MODULE_1__["NgModel"], _angular_common__WEBPACK_IMPORTED_MODULE_22__["NgForOf"], _angular_forms__WEBPACK_IMPORTED_MODULE_1__["CheckboxControlValueAccessor"], _angular_common__WEBPACK_IMPORTED_MODULE_22__["NgIf"], jslib_angular_directives_stop_click_directive__WEBPACK_IMPORTED_MODULE_23__["StopClickDirective"], jslib_angular_directives_blur_click_directive__WEBPACK_IMPORTED_MODULE_24__["BlurClickDirective"], _angular_forms__WEBPACK_IMPORTED_MODULE_1__["NgSelectOption"], _angular_forms__WEBPACK_IMPORTED_MODULE_1__["ɵangular_packages_forms_forms_z"]], pipes: [jslib_angular_pipes_i18n_pipe__WEBPACK_IMPORTED_MODULE_25__["I18nPipe"]], encapsulation: 2 });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](SettingsComponent, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Component"],
+ args: [{
+ selector: 'app-settings',
+ templateUrl: 'settings.component.html',
+ }]
+ }], function () { return [{ type: jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_12__["PlatformUtilsService"] }, { type: jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_10__["I18nService"] }, { type: jslib_common_abstractions_vaultTimeout_service__WEBPACK_IMPORTED_MODULE_15__["VaultTimeoutService"] }, { type: jslib_common_abstractions_storage_service__WEBPACK_IMPORTED_MODULE_13__["StorageService"] }, { type: jslib_common_abstractions_messaging_service__WEBPACK_IMPORTED_MODULE_11__["MessagingService"] }, { type: _angular_router__WEBPACK_IMPORTED_MODULE_2__["Router"] }, { type: jslib_common_abstractions_environment_service__WEBPACK_IMPORTED_MODULE_9__["EnvironmentService"] }, { type: jslib_common_abstractions_crypto_service__WEBPACK_IMPORTED_MODULE_8__["CryptoService"] }, { type: jslib_common_abstractions_user_service__WEBPACK_IMPORTED_MODULE_14__["UserService"] }, { type: _services_popup_utils_service__WEBPACK_IMPORTED_MODULE_16__["PopupUtilsService"] }, { type: jslib_angular_services_modal_service__WEBPACK_IMPORTED_MODULE_17__["ModalService"] }, { type: angular2_toaster__WEBPACK_IMPORTED_MODULE_3__["ToasterService"] }]; }, { vaultTimeoutActionSelectRef: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["ViewChild"],
+ args: ['vaultTimeoutActionSelect', { read: _angular_core__WEBPACK_IMPORTED_MODULE_0__["ElementRef"], static: true }]
+ }] }); })();
+
+
+/***/ }),
+
+/***/ "./src/popup/settings/sync.component.ts":
+/*!**********************************************!*\
+ !*** ./src/popup/settings/sync.component.ts ***!
+ \**********************************************/
+/*! exports provided: SyncComponent */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SyncComponent", function() { return SyncComponent; });
+/* harmony import */ var angular2_toaster__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! angular2-toaster */ "./node_modules/angular2-toaster/__ivy_ngcc__/fesm2015/angular2-toaster.js");
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! jslib-common/abstractions/i18n.service */ "./jslib/common/src/abstractions/i18n.service.ts");
+/* harmony import */ var jslib_common_abstractions_sync_service__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! jslib-common/abstractions/sync.service */ "./jslib/common/src/abstractions/sync.service.ts");
+/* harmony import */ var _angular_router__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @angular/router */ "./node_modules/@angular/router/__ivy_ngcc__/fesm2015/router.js");
+/* harmony import */ var jslib_angular_directives_api_action_directive__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! jslib-angular/directives/api-action.directive */ "./jslib/angular/src/directives/api-action.directive.ts");
+/* harmony import */ var jslib_angular_pipes_i18n_pipe__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! jslib-angular/pipes/i18n.pipe */ "./jslib/angular/src/pipes/i18n.pipe.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+
+
+
+
+
+
+
+
+
+class SyncComponent {
+ constructor(syncService, toasterService, i18nService) {
+ this.syncService = syncService;
+ this.toasterService = toasterService;
+ this.i18nService = i18nService;
+ this.lastSync = '--';
+ }
+ ngOnInit() {
+ return __awaiter(this, void 0, void 0, function* () {
+ yield this.setLastSync();
+ });
+ }
+ sync() {
+ return __awaiter(this, void 0, void 0, function* () {
+ this.syncPromise = this.syncService.fullSync(true);
+ const success = yield this.syncPromise;
+ if (success) {
+ yield this.setLastSync();
+ this.toasterService.popAsync('success', null, this.i18nService.t('syncingComplete'));
+ }
+ else {
+ this.toasterService.popAsync('error', null, this.i18nService.t('syncingFailed'));
+ }
+ });
+ }
+ setLastSync() {
+ return __awaiter(this, void 0, void 0, function* () {
+ const last = yield this.syncService.getLastSync();
+ if (last != null) {
+ this.lastSync = last.toLocaleDateString() + ' ' + last.toLocaleTimeString();
+ }
+ else {
+ this.lastSync = this.i18nService.t('never');
+ }
+ });
+ }
+}
+SyncComponent.ɵfac = function SyncComponent_Factory(t) { return new (t || SyncComponent)(_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](jslib_common_abstractions_sync_service__WEBPACK_IMPORTED_MODULE_3__["SyncService"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](angular2_toaster__WEBPACK_IMPORTED_MODULE_0__["ToasterService"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_2__["I18nService"])); };
+SyncComponent.ɵcmp = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdefineComponent"]({ type: SyncComponent, selectors: [["app-sync"]], decls: 45, vars: 17, consts: [[1, "left"], ["routerLink", "/tabs/settings"], [1, "header-icon"], ["aria-hidden", "true", 1, "fa", "fa-chevron-left"], [1, "center"], [1, "title"], [1, "right"], [1, "content", "center-content"], ["type", "button", 1, "btn", "block", "primary", 3, "disabled", "appApiAction", "click"], ["syncBtn", ""], [3, "hidden"], ["aria-hidden", "true", 1, "fa", "fa-spinner", "fa-lg", "fa-spin", 3, "hidden"], [1, "text-center", "text-muted", "small"]], template: function SyncComponent_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "header");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "div", 0);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](4, "a", 1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](6, "span", 2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](7, "i", 3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](8, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](9, "span");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](11, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](12, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](13, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](14, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](15, "div", 4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](16, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](17, "span", 5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](18);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](19, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](20, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](21, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](22, "div", 6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](23, "\n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](24, "\n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](25, "content");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](26, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](27, "div", 7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](28, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](29, "button", 8, 9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("click", function SyncComponent_Template_button_click_29_listener() { return ctx.sync(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](31, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](32, "span", 10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](33);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](34, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](35, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](36, "i", 11);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](37, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](38, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](39, "p", 12);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](40);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](41, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](42, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](43, "\n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](44, "\n");
+ } if (rf & 2) {
+ const _r0 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵreference"](30);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](11, 9, "back"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](19, 11, "sync"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](11);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("disabled", _r0.loading)("appApiAction", ctx.syncPromise);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("hidden", _r0.loading);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](34, 13, "syncVaultNow"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("hidden", !_r0.loading);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate2"]("", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](41, 15, "lastSync"), " ", ctx.lastSync, "");
+ } }, directives: [_angular_router__WEBPACK_IMPORTED_MODULE_4__["RouterLinkWithHref"], jslib_angular_directives_api_action_directive__WEBPACK_IMPORTED_MODULE_5__["ApiActionDirective"]], pipes: [jslib_angular_pipes_i18n_pipe__WEBPACK_IMPORTED_MODULE_6__["I18nPipe"]], encapsulation: 2 });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵsetClassMetadata"](SyncComponent, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Component"],
+ args: [{
+ selector: 'app-sync',
+ templateUrl: 'sync.component.html',
+ }]
+ }], function () { return [{ type: jslib_common_abstractions_sync_service__WEBPACK_IMPORTED_MODULE_3__["SyncService"] }, { type: angular2_toaster__WEBPACK_IMPORTED_MODULE_0__["ToasterService"] }, { type: jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_2__["I18nService"] }]; }, null); })();
+
+
+/***/ }),
+
+/***/ "./src/popup/settings/vault-timeout-input.component.ts":
+/*!*************************************************************!*\
+ !*** ./src/popup/settings/vault-timeout-input.component.ts ***!
+ \*************************************************************/
+/*! exports provided: VaultTimeoutInputComponent */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "VaultTimeoutInputComponent", function() { return VaultTimeoutInputComponent; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var _angular_forms__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @angular/forms */ "./node_modules/@angular/forms/__ivy_ngcc__/fesm2015/forms.js");
+/* harmony import */ var jslib_angular_components_settings_vault_timeout_input_component__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! jslib-angular/components/settings/vault-timeout-input.component */ "./jslib/angular/src/components/settings/vault-timeout-input.component.ts");
+/* harmony import */ var _angular_common__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @angular/common */ "./node_modules/@angular/common/__ivy_ngcc__/fesm2015/common.js");
+/* harmony import */ var jslib_angular_directives_box_row_directive__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! jslib-angular/directives/box-row.directive */ "./jslib/angular/src/directives/box-row.directive.ts");
+/* harmony import */ var jslib_angular_components_callout_component__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! jslib-angular/components/callout.component */ "./jslib/angular/src/components/callout.component.ts");
+/* harmony import */ var jslib_angular_pipes_i18n_pipe__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! jslib-angular/pipes/i18n.pipe */ "./jslib/angular/src/pipes/i18n.pipe.ts");
+
+
+
+
+
+
+
+
+
+function VaultTimeoutInputComponent_app_callout_0_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "app-callout", 7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](2, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r0 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate1"]("\n ", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind3"](2, 1, "vaultTimeoutPolicyInEffect", ctx_r0.vaultTimeoutPolicyHours, ctx_r0.vaultTimeoutPolicyMinutes), "\n");
+} }
+function VaultTimeoutInputComponent_option_12_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "option", 8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const o_r3 = ctx.$implicit;
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngValue", o_r3.value);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](o_r3.name);
+} }
+function VaultTimeoutInputComponent_div_16_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "div", 9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](2, "div", 10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](4, "div", 11);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](6, "div", 12);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](8, "label", 13);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](10, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](11, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](12, "input", 14);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](13, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](14, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](15, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](16, "div", 11);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](17, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](18, "div", 12);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](19, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](20, "label", 13);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](21);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](22, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](23, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](24, "input", 15);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](25, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](26, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](27, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](28, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](10, 2, "hours"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](12);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](22, 4, "minutes"));
+} }
+class VaultTimeoutInputComponent extends jslib_angular_components_settings_vault_timeout_input_component__WEBPACK_IMPORTED_MODULE_2__["VaultTimeoutInputComponent"] {
+}
+VaultTimeoutInputComponent.ɵfac = function VaultTimeoutInputComponent_Factory(t) { return ɵVaultTimeoutInputComponent_BaseFactory(t || VaultTimeoutInputComponent); };
+VaultTimeoutInputComponent.ɵcmp = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineComponent"]({ type: VaultTimeoutInputComponent, selectors: [["app-vault-timeout-input"]], features: [_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵProvidersFeature"]([
+ {
+ provide: _angular_forms__WEBPACK_IMPORTED_MODULE_1__["NG_VALUE_ACCESSOR"],
+ multi: true,
+ useExisting: VaultTimeoutInputComponent,
+ },
+ {
+ provide: _angular_forms__WEBPACK_IMPORTED_MODULE_1__["NG_VALIDATORS"],
+ multi: true,
+ useExisting: VaultTimeoutInputComponent,
+ },
+ ]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵInheritDefinitionFeature"]], decls: 19, vars: 7, consts: [["type", "info", 4, "ngIf"], [3, "formGroup"], ["appBoxRow", "", 1, "box-content-row", "last", "display-block"], ["for", "vaultTimeout"], ["id", "vaultTimeout", "name", "VaultTimeout", "formControlName", "vaultTimeout", 1, "form-control"], [3, "ngValue", 4, "ngFor", "ngForOf"], ["class", "box-content-row last", 4, "ngIf"], ["type", "info"], [3, "ngValue"], [1, "box-content-row", "last"], ["formGroupName", "custom", 1, "row"], [1, "col"], ["appBoxRow", "", 1, "display-block"], ["for", "customVaultTimeout"], ["id", "hours", "type", "number", "min", "0", "name", "hours", "formControlName", "hours", 1, "form-control"], ["id", "minutes", "type", "number", "min", "0", "max", "59", "name", "minutes", "formControlName", "minutes", 1, "form-control"]], template: function VaultTimeoutInputComponent_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](0, VaultTimeoutInputComponent_app_callout_0_Template, 3, 5, "app-callout", 0);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "\n\n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](2, "div", 1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](4, "div", 2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](6, "label", 3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](8, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](9, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](10, "select", 4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](11, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](12, VaultTimeoutInputComponent_option_12_Template, 2, 2, "option", 5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](13, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](14, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](15, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](16, VaultTimeoutInputComponent_div_16_Template, 29, 6, "div", 6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](17, "\n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](18, "\n");
+ } if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", ctx.vaultTimeoutPolicy);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("formGroup", ctx.form);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](8, 5, "vaultTimeout"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngForOf", ctx.vaultTimeouts);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", ctx.showCustom);
+ } }, directives: [_angular_common__WEBPACK_IMPORTED_MODULE_3__["NgIf"], _angular_forms__WEBPACK_IMPORTED_MODULE_1__["NgControlStatusGroup"], _angular_forms__WEBPACK_IMPORTED_MODULE_1__["FormGroupDirective"], jslib_angular_directives_box_row_directive__WEBPACK_IMPORTED_MODULE_4__["BoxRowDirective"], _angular_forms__WEBPACK_IMPORTED_MODULE_1__["SelectControlValueAccessor"], _angular_forms__WEBPACK_IMPORTED_MODULE_1__["NgControlStatus"], _angular_forms__WEBPACK_IMPORTED_MODULE_1__["FormControlName"], _angular_common__WEBPACK_IMPORTED_MODULE_3__["NgForOf"], jslib_angular_components_callout_component__WEBPACK_IMPORTED_MODULE_5__["CalloutComponent"], _angular_forms__WEBPACK_IMPORTED_MODULE_1__["NgSelectOption"], _angular_forms__WEBPACK_IMPORTED_MODULE_1__["ɵangular_packages_forms_forms_z"], _angular_forms__WEBPACK_IMPORTED_MODULE_1__["FormGroupName"], _angular_forms__WEBPACK_IMPORTED_MODULE_1__["NumberValueAccessor"], _angular_forms__WEBPACK_IMPORTED_MODULE_1__["DefaultValueAccessor"]], pipes: [jslib_angular_pipes_i18n_pipe__WEBPACK_IMPORTED_MODULE_6__["I18nPipe"]], encapsulation: 2 });
+const ɵVaultTimeoutInputComponent_BaseFactory = /*@__PURE__*/ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵgetInheritedFactory"](VaultTimeoutInputComponent);
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](VaultTimeoutInputComponent, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Component"],
+ args: [{
+ selector: 'app-vault-timeout-input',
+ templateUrl: 'vault-timeout-input.component.html',
+ providers: [
+ {
+ provide: _angular_forms__WEBPACK_IMPORTED_MODULE_1__["NG_VALUE_ACCESSOR"],
+ multi: true,
+ useExisting: VaultTimeoutInputComponent,
+ },
+ {
+ provide: _angular_forms__WEBPACK_IMPORTED_MODULE_1__["NG_VALIDATORS"],
+ multi: true,
+ useExisting: VaultTimeoutInputComponent,
+ },
+ ],
+ }]
+ }], null, null); })();
+
+
+/***/ }),
+
+/***/ "./src/popup/tabs.component.ts":
+/*!*************************************!*\
+ !*** ./src/popup/tabs.component.ts ***!
+ \*************************************/
+/*! exports provided: TabsComponent */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TabsComponent", function() { return TabsComponent; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var _services_popup_utils_service__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./services/popup-utils.service */ "./src/popup/services/popup-utils.service.ts");
+/* harmony import */ var _angular_router__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @angular/router */ "./node_modules/@angular/router/__ivy_ngcc__/fesm2015/router.js");
+/* harmony import */ var _angular_common__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @angular/common */ "./node_modules/@angular/common/__ivy_ngcc__/fesm2015/common.js");
+/* harmony import */ var jslib_angular_directives_a11y_title_directive__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! jslib-angular/directives/a11y-title.directive */ "./jslib/angular/src/directives/a11y-title.directive.ts");
+/* harmony import */ var jslib_angular_pipes_i18n_pipe__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! jslib-angular/pipes/i18n.pipe */ "./jslib/angular/src/pipes/i18n.pipe.ts");
+
+
+
+
+
+
+
+
+function TabsComponent_li_8_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "li", 3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](2, "a", 12);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](3, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](4, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](5, "i", 13);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](7, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](8, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate"]("appA11yTitle", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](3, 2, "currentTab"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate1"]("", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](7, 4, "tab"), "\n ");
+} }
+class TabsComponent {
+ constructor(popupUtilsService) {
+ this.popupUtilsService = popupUtilsService;
+ this.showCurrentTab = true;
+ }
+ ngOnInit() {
+ this.showCurrentTab = !this.popupUtilsService.inPopout(window);
+ }
+}
+TabsComponent.ɵfac = function TabsComponent_Factory(t) { return new (t || TabsComponent)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_services_popup_utils_service__WEBPACK_IMPORTED_MODULE_1__["PopupUtilsService"])); };
+TabsComponent.ɵcmp = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineComponent"]({ type: TabsComponent, selectors: [["app-tabs"]], decls: 53, vars: 25, consts: [[1, "tab-page"], [1, "tabs"], ["routerLinkActive", "active", 4, "ngIf"], ["routerLinkActive", "active"], ["routerLink", "vault", 3, "appA11yTitle"], ["aria-hidden", "true", 1, "fa", "fa-lock", "fa-2x"], ["routerLink", "send", 3, "appA11yTitle"], ["aria-hidden", "true", 1, "fa", "fa-paper-plane", "fa-2x"], ["routerLink", "generator", 3, "appA11yTitle"], ["aria-hidden", "true", 1, "fa", "fa-refresh", "fa-2x"], ["routerLink", "settings", 3, "appA11yTitle"], ["aria-hidden", "true", 1, "fa", "fa-cogs", "fa-2x"], ["routerLink", "current", 3, "appA11yTitle"], ["aria-hidden", "true", 1, "fa", "fa-folder", "fa-2x"]], template: function TabsComponent_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "div", 0);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](2, "router-outlet");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](4, "nav", 1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](6, "ul");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](8, TabsComponent_li_8_Template, 9, 6, "li", 2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](9, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](10, "li", 3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](11, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](12, "a", 4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](13, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](14, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](15, "i", 5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](16);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](17, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](18, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](19, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](20, "li", 3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](21, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](22, "a", 6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](23, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](24, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](25, "i", 7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](26);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](27, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](28, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](29, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](30, "li", 3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](31, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](32, "a", 8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](33, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](34, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](35, "i", 9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](36);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](37, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](38, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](39, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](40, "li", 3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](41, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](42, "a", 10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](43, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](44, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](45, "i", 11);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](46);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](47, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](48, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](49, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](50, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](51, "\n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](52, "\n");
+ } if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", ctx.showCurrentTab);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate"]("appA11yTitle", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](13, 9, "myVault"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate1"]("", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](17, 11, "myVault"), "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate"]("appA11yTitle", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](23, 13, "send"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate1"]("", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](27, 15, "send"), "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate"]("appA11yTitle", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](33, 17, "passGen"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate1"]("", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](37, 19, "generator"), "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate"]("appA11yTitle", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](43, 21, "settings"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate1"]("", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](47, 23, "settings"), "\n ");
+ } }, directives: [_angular_router__WEBPACK_IMPORTED_MODULE_2__["RouterOutlet"], _angular_common__WEBPACK_IMPORTED_MODULE_3__["NgIf"], _angular_router__WEBPACK_IMPORTED_MODULE_2__["RouterLinkActive"], _angular_router__WEBPACK_IMPORTED_MODULE_2__["RouterLinkWithHref"], jslib_angular_directives_a11y_title_directive__WEBPACK_IMPORTED_MODULE_4__["A11yTitleDirective"]], pipes: [jslib_angular_pipes_i18n_pipe__WEBPACK_IMPORTED_MODULE_5__["I18nPipe"]], encapsulation: 2 });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](TabsComponent, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Component"],
+ args: [{
+ selector: 'app-tabs',
+ templateUrl: 'tabs.component.html',
+ }]
+ }], function () { return [{ type: _services_popup_utils_service__WEBPACK_IMPORTED_MODULE_1__["PopupUtilsService"] }]; }, null); })();
+
+
+/***/ }),
+
+/***/ "./src/popup/vault/add-edit-custom-fields.component.ts":
+/*!*************************************************************!*\
+ !*** ./src/popup/vault/add-edit-custom-fields.component.ts ***!
+ \*************************************************************/
+/*! exports provided: AddEditCustomFieldsComponent */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AddEditCustomFieldsComponent", function() { return AddEditCustomFieldsComponent; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var jslib_angular_components_add_edit_custom_fields_component__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! jslib-angular/components/add-edit-custom-fields.component */ "./jslib/angular/src/components/add-edit-custom-fields.component.ts");
+/* harmony import */ var jslib_common_abstractions_event_service__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! jslib-common/abstractions/event.service */ "./jslib/common/src/abstractions/event.service.ts");
+/* harmony import */ var jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! jslib-common/abstractions/i18n.service */ "./jslib/common/src/abstractions/i18n.service.ts");
+/* harmony import */ var _angular_common__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @angular/common */ "./node_modules/@angular/common/__ivy_ngcc__/fesm2015/common.js");
+/* harmony import */ var jslib_angular_directives_box_row_directive__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! jslib-angular/directives/box-row.directive */ "./jslib/angular/src/directives/box-row.directive.ts");
+/* harmony import */ var jslib_angular_directives_stop_click_directive__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! jslib-angular/directives/stop-click.directive */ "./jslib/angular/src/directives/stop-click.directive.ts");
+/* harmony import */ var _angular_forms__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @angular/forms */ "./node_modules/@angular/forms/__ivy_ngcc__/fesm2015/forms.js");
+/* harmony import */ var _angular_cdk_drag_drop__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @angular/cdk/drag-drop */ "./node_modules/@angular/cdk/__ivy_ngcc__/fesm2015/drag-drop.js");
+/* harmony import */ var jslib_angular_directives_a11y_title_directive__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! jslib-angular/directives/a11y-title.directive */ "./jslib/angular/src/directives/a11y-title.directive.ts");
+/* harmony import */ var jslib_angular_directives_input_verbatim_directive__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! jslib-angular/directives/input-verbatim.directive */ "./jslib/angular/src/directives/input-verbatim.directive.ts");
+/* harmony import */ var jslib_angular_directives_true_false_value_directive__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! jslib-angular/directives/true-false-value.directive */ "./jslib/angular/src/directives/true-false-value.directive.ts");
+/* harmony import */ var jslib_angular_directives_blur_click_directive__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! jslib-angular/directives/blur-click.directive */ "./jslib/angular/src/directives/blur-click.directive.ts");
+/* harmony import */ var jslib_angular_pipes_i18n_pipe__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! jslib-angular/pipes/i18n.pipe */ "./jslib/angular/src/pipes/i18n.pipe.ts");
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+function AddEditCustomFieldsComponent_div_9_div_2_input_22_Template(rf, ctx) { if (rf & 1) {
+ const _r13 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "input", 26);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("ngModelChange", function AddEditCustomFieldsComponent_div_9_div_2_input_22_Template_input_ngModelChange_0_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r13); const f_r4 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"]().$implicit; return f_r4.value = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](1, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r14 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"]();
+ const i_r5 = ctx_r14.index;
+ const f_r4 = ctx_r14.$implicit;
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate1"]("id", "fieldValue", i_r5, "");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate1"]("name", "Field.Value", i_r5, "");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate"]("placeholder", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](1, 4, "value"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngModel", f_r4.value);
+} }
+function AddEditCustomFieldsComponent_div_9_div_2_input_25_Template(rf, ctx) { if (rf & 1) {
+ const _r17 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "input", 27);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("ngModelChange", function AddEditCustomFieldsComponent_div_9_div_2_input_25_Template_input_ngModelChange_0_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r17); const f_r4 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"]().$implicit; return f_r4.value = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](1, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r18 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"]();
+ const i_r5 = ctx_r18.index;
+ const f_r4 = ctx_r18.$implicit;
+ const ctx_r7 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate1"]("id", "fieldValue", i_r5, "");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate"]("type", f_r4.showValue ? "text" : "password");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate1"]("name", "Field.Value", i_r5, "");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate"]("placeholder", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](1, 6, "value"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngModel", f_r4.value)("disabled", !ctx_r7.cipher.viewPassword && !f_r4.newField);
+} }
+function AddEditCustomFieldsComponent_div_9_div_2_select_28_option_2_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "option", 29);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const o_r20 = ctx.$implicit;
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngValue", o_r20.value);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](o_r20.name);
+} }
+function AddEditCustomFieldsComponent_div_9_div_2_select_28_Template(rf, ctx) { if (rf & 1) {
+ const _r23 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "select", 28);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("ngModelChange", function AddEditCustomFieldsComponent_div_9_div_2_select_28_Template_select_ngModelChange_0_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r23); const f_r4 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"]().$implicit; return f_r4.linkedId = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](2, AddEditCustomFieldsComponent_div_9_div_2_select_28_option_2_Template, 2, 2, "option", 9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r24 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"]();
+ const i_r5 = ctx_r24.index;
+ const f_r4 = ctx_r24.$implicit;
+ const ctx_r8 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate1"]("id", "fieldValue", i_r5, "");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate1"]("name", "Field.Value", i_r5, "");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngModel", f_r4.linkedId);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngForOf", ctx_r8.linkedFieldOptions);
+} }
+function AddEditCustomFieldsComponent_div_9_div_2_input_32_Template(rf, ctx) { if (rf & 1) {
+ const _r27 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "input", 30);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("ngModelChange", function AddEditCustomFieldsComponent_div_9_div_2_input_32_Template_input_ngModelChange_0_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r27); const f_r4 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"]().$implicit; return f_r4.value = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r28 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"]();
+ const i_r5 = ctx_r28.index;
+ const f_r4 = ctx_r28.$implicit;
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate1"]("id", "fieldValue", i_r5, "");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate1"]("name", "Field.Value", i_r5, "");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngModel", f_r4.value);
+} }
+const _c0 = function (a0, a1) { return { "fa-eye": a0, "fa-eye-slash": a1 }; };
+function AddEditCustomFieldsComponent_div_9_div_2_div_34_Template(rf, ctx) { if (rf & 1) {
+ const _r31 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "div", 31);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](2, "button", 32);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("click", function AddEditCustomFieldsComponent_div_9_div_2_div_34_Template_button_click_2_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r31); const f_r4 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"]().$implicit; const ctx_r29 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](2); return ctx_r29.toggleFieldValue(f_r4); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](3, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](4, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](5, "i", 33);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](6, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const f_r4 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"]().$implicit;
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate"]("appA11yTitle", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](3, 2, "toggleVisibility"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngClass", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpureFunction2"](4, _c0, !f_r4.showValue, f_r4.showValue));
+} }
+const _c1 = function (a0) { return { "box-content-row-checkbox": a0 }; };
+function AddEditCustomFieldsComponent_div_9_div_2_Template(rf, ctx) { if (rf & 1) {
+ const _r34 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "div", 13);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](2, "button", 14);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("click", function AddEditCustomFieldsComponent_div_9_div_2_Template_button_click_2_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r34); const f_r4 = ctx.$implicit; const ctx_r33 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](2); return ctx_r33.removeField(f_r4); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](3, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](4, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](5, "i", 15);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](6, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](8, "label", 16);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](10, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](11, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](12, "label", 16);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](13);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](14, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](15, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](16, "div", 17);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](17, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](18, "input", 18);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("ngModelChange", function AddEditCustomFieldsComponent_div_9_div_2_Template_input_ngModelChange_18_listener($event) { const f_r4 = ctx.$implicit; return f_r4.name = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](19, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](20, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](21, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](22, AddEditCustomFieldsComponent_div_9_div_2_input_22_Template, 2, 6, "input", 19);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](23, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](24, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](25, AddEditCustomFieldsComponent_div_9_div_2_input_25_Template, 2, 8, "input", 20);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](26, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](27, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](28, AddEditCustomFieldsComponent_div_9_div_2_select_28_Template, 4, 4, "select", 21);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](29, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](30, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](31, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](32, AddEditCustomFieldsComponent_div_9_div_2_input_32_Template, 1, 3, "input", 22);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](33, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](34, AddEditCustomFieldsComponent_div_9_div_2_div_34_Template, 8, 7, "div", 23);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](35, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](36, "div", 24);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](37, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](38, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](39, "i", 25);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](40, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](41, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const f_r4 = ctx.$implicit;
+ const i_r5 = ctx.index;
+ const ctx_r3 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngClass", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpureFunction1"](26, _c1, f_r4.type === ctx_r3.fieldType.Boolean));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate"]("appA11yTitle", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](3, 16, "remove"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate1"]("for", "fieldName", i_r5, "");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](10, 18, "name"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate1"]("for", "fieldValue", i_r5, "");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](14, 20, "value"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate1"]("id", "fieldName", i_r5, "");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate1"]("name", "Field.Name", i_r5, "");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate"]("placeholder", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](19, 22, "name"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngModel", f_r4.name);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", f_r4.type === ctx_r3.fieldType.Text);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", f_r4.type === ctx_r3.fieldType.Hidden);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", f_r4.type === ctx_r3.fieldType.Linked && ctx_r3.cipher.linkedFieldOptions != null);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", f_r4.type === ctx_r3.fieldType.Boolean);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", f_r4.type === ctx_r3.fieldType.Hidden && (ctx_r3.cipher.viewPassword || f_r4.newField));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate"]("appA11yTitle", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](37, 24, "dragToSort"));
+} }
+function AddEditCustomFieldsComponent_div_9_Template(rf, ctx) { if (rf & 1) {
+ const _r37 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "div", 11);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("cdkDropListDropped", function AddEditCustomFieldsComponent_div_9_Template_div_cdkDropListDropped_0_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r37); const ctx_r36 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](); return ctx_r36.drop($event); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](2, AddEditCustomFieldsComponent_div_9_div_2_Template, 42, 28, "div", 12);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r0 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngForOf", ctx_r0.cipher.fields)("ngForTrackBy", ctx_r0.trackByFunction);
+} }
+function AddEditCustomFieldsComponent_option_26_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "option", 29);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const o_r38 = ctx.$implicit;
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngValue", o_r38.value);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](o_r38.name);
+} }
+function AddEditCustomFieldsComponent_option_28_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "option", 29);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r2 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngValue", ctx_r2.addFieldLinkedTypeOption.value);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate1"]("\n ", ctx_r2.addFieldLinkedTypeOption.name, "\n ");
+} }
+class AddEditCustomFieldsComponent extends jslib_angular_components_add_edit_custom_fields_component__WEBPACK_IMPORTED_MODULE_1__["AddEditCustomFieldsComponent"] {
+ constructor(i18nService, eventService) {
+ super(i18nService, eventService);
+ }
+}
+AddEditCustomFieldsComponent.ɵfac = function AddEditCustomFieldsComponent_Factory(t) { return new (t || AddEditCustomFieldsComponent)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_3__["I18nService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_event_service__WEBPACK_IMPORTED_MODULE_2__["EventService"])); };
+AddEditCustomFieldsComponent.ɵcmp = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineComponent"]({ type: AddEditCustomFieldsComponent, selectors: [["app-vault-add-edit-custom-fields"]], features: [_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵInheritDefinitionFeature"]], decls: 34, vars: 13, consts: [[1, "box"], [1, "box-header"], [1, "box-content"], ["cdkDropList", "", 3, "cdkDropListDropped", 4, "ngIf"], ["appBoxRow", "", 1, "box-content-row", "box-content-row-newmulti"], ["type", "button", "appStopClick", "", 3, "click"], ["aria-hidden", "true", 1, "fa", "fa-plus-circle", "fa-fw", "fa-lg"], ["for", "addFieldType", 1, "sr-only"], ["id", "addFieldType", "name", "AddFieldType", 1, "field-type", 3, "ngModel", "ngModelChange"], [3, "ngValue", 4, "ngFor", "ngForOf"], [3, "ngValue", 4, "ngIf"], ["cdkDropList", "", 3, "cdkDropListDropped"], ["class", "box-content-row box-content-row-multi box-draggable-row", "appBoxRow", "", "cdkDrag", "", 3, "ngClass", 4, "ngFor", "ngForOf", "ngForTrackBy"], ["appBoxRow", "", "cdkDrag", "", 1, "box-content-row", "box-content-row-multi", "box-draggable-row", 3, "ngClass"], ["type", "button", "appStopClick", "", 3, "appA11yTitle", "click"], ["aria-hidden", "true", 1, "fa", "fa-minus-circle", "fa-lg"], [1, "sr-only", 3, "for"], [1, "row-main"], ["type", "text", "appInputVerbatim", "", 1, "row-label", 3, "id", "name", "ngModel", "placeholder", "ngModelChange"], ["type", "text", "appInputVerbatim", "", 3, "id", "name", "ngModel", "placeholder", "ngModelChange", 4, "ngIf"], ["class", "monospaced", "appInputVerbatim", "", 3, "id", "type", "name", "ngModel", "placeholder", "disabled", "ngModelChange", 4, "ngIf"], [3, "id", "name", "ngModel", "ngModelChange", 4, "ngIf"], ["type", "checkbox", "appTrueFalseValue", "", "trueValue", "true", "falseValue", "false", 3, "id", "name", "ngModel", "ngModelChange", 4, "ngIf"], ["class", "action-buttons", 4, "ngIf"], ["cdkDragHandle", "", 1, "drag-handle", 3, "appA11yTitle"], ["aria-hidden", "true", 1, "fa", "fa-bars"], ["type", "text", "appInputVerbatim", "", 3, "id", "name", "ngModel", "placeholder", "ngModelChange"], ["appInputVerbatim", "", 1, "monospaced", 3, "id", "type", "name", "ngModel", "placeholder", "disabled", "ngModelChange"], [3, "id", "name", "ngModel", "ngModelChange"], [3, "ngValue"], ["type", "checkbox", "appTrueFalseValue", "", "trueValue", "true", "falseValue", "false", 3, "id", "name", "ngModel", "ngModelChange"], [1, "action-buttons"], ["type", "button", "appStopClick", "", "appBlurClick", "", 1, "row-btn", 3, "appA11yTitle", "click"], ["aria-hidden", "true", 1, "fa", "fa-lg", 3, "ngClass"]], template: function AddEditCustomFieldsComponent_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "div", 0);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](2, "div", 1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](4, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](6, "div", 2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](8, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](9, AddEditCustomFieldsComponent_div_9_Template, 4, 2, "div", 3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](10, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](11, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](12, "div", 4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](13, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](14, "button", 5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("click", function AddEditCustomFieldsComponent_Template_button_click_14_listener() { return ctx.addField(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](15, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](16, "i", 6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](17);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](18, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](19, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](20, "label", 7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](21);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](22, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](23, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](24, "select", 8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("ngModelChange", function AddEditCustomFieldsComponent_Template_select_ngModelChange_24_listener($event) { return ctx.addFieldType = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](25, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](26, AddEditCustomFieldsComponent_option_26_Template, 2, 2, "option", 9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](27, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](28, AddEditCustomFieldsComponent_option_28_Template, 2, 2, "option", 10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](29, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](30, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](31, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](32, "\n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](33, "\n");
+ } if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate1"]("\n ", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](4, 7, "customFields"), "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", ctx.cipher.hasFields);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate1"](" ", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](18, 9, "newCustomField"), "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](22, 11, "type"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngModel", ctx.addFieldType);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngForOf", ctx.addFieldTypeOptions);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", ctx.cipher.linkedFieldOptions != null);
+ } }, directives: [_angular_common__WEBPACK_IMPORTED_MODULE_4__["NgIf"], jslib_angular_directives_box_row_directive__WEBPACK_IMPORTED_MODULE_5__["BoxRowDirective"], jslib_angular_directives_stop_click_directive__WEBPACK_IMPORTED_MODULE_6__["StopClickDirective"], _angular_forms__WEBPACK_IMPORTED_MODULE_7__["SelectControlValueAccessor"], _angular_forms__WEBPACK_IMPORTED_MODULE_7__["NgControlStatus"], _angular_forms__WEBPACK_IMPORTED_MODULE_7__["NgModel"], _angular_common__WEBPACK_IMPORTED_MODULE_4__["NgForOf"], _angular_cdk_drag_drop__WEBPACK_IMPORTED_MODULE_8__["CdkDropList"], _angular_cdk_drag_drop__WEBPACK_IMPORTED_MODULE_8__["CdkDrag"], _angular_common__WEBPACK_IMPORTED_MODULE_4__["NgClass"], jslib_angular_directives_a11y_title_directive__WEBPACK_IMPORTED_MODULE_9__["A11yTitleDirective"], _angular_forms__WEBPACK_IMPORTED_MODULE_7__["DefaultValueAccessor"], jslib_angular_directives_input_verbatim_directive__WEBPACK_IMPORTED_MODULE_10__["InputVerbatimDirective"], _angular_cdk_drag_drop__WEBPACK_IMPORTED_MODULE_8__["CdkDragHandle"], _angular_forms__WEBPACK_IMPORTED_MODULE_7__["NgSelectOption"], _angular_forms__WEBPACK_IMPORTED_MODULE_7__["ɵangular_packages_forms_forms_z"], jslib_angular_directives_true_false_value_directive__WEBPACK_IMPORTED_MODULE_11__["TrueFalseValueDirective"], _angular_forms__WEBPACK_IMPORTED_MODULE_7__["CheckboxControlValueAccessor"], jslib_angular_directives_blur_click_directive__WEBPACK_IMPORTED_MODULE_12__["BlurClickDirective"]], pipes: [jslib_angular_pipes_i18n_pipe__WEBPACK_IMPORTED_MODULE_13__["I18nPipe"]], encapsulation: 2 });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](AddEditCustomFieldsComponent, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Component"],
+ args: [{
+ selector: 'app-vault-add-edit-custom-fields',
+ templateUrl: 'add-edit-custom-fields.component.html',
+ }]
+ }], function () { return [{ type: jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_3__["I18nService"] }, { type: jslib_common_abstractions_event_service__WEBPACK_IMPORTED_MODULE_2__["EventService"] }]; }, null); })();
+
+
+/***/ }),
+
+/***/ "./src/popup/vault/add-edit.component.ts":
+/*!***********************************************!*\
+ !*** ./src/popup/vault/add-edit.component.ts ***!
+ \***********************************************/
+/*! exports provided: AddEditComponent */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AddEditComponent", function() { return AddEditComponent; });
+/* harmony import */ var _angular_common__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/common */ "./node_modules/@angular/common/__ivy_ngcc__/fesm2015/common.js");
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var _angular_router__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @angular/router */ "./node_modules/@angular/router/__ivy_ngcc__/fesm2015/router.js");
+/* harmony import */ var rxjs_operators__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! rxjs/operators */ "./node_modules/rxjs/_esm5/operators/index.js");
+/* harmony import */ var _browser_browserApi__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../browser/browserApi */ "./src/browser/browserApi.ts");
+/* harmony import */ var jslib_common_abstractions_audit_service__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! jslib-common/abstractions/audit.service */ "./jslib/common/src/abstractions/audit.service.ts");
+/* harmony import */ var jslib_common_abstractions_cipher_service__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! jslib-common/abstractions/cipher.service */ "./jslib/common/src/abstractions/cipher.service.ts");
+/* harmony import */ var jslib_common_abstractions_collection_service__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! jslib-common/abstractions/collection.service */ "./jslib/common/src/abstractions/collection.service.ts");
+/* harmony import */ var jslib_common_abstractions_event_service__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! jslib-common/abstractions/event.service */ "./jslib/common/src/abstractions/event.service.ts");
+/* harmony import */ var jslib_common_abstractions_folder_service__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! jslib-common/abstractions/folder.service */ "./jslib/common/src/abstractions/folder.service.ts");
+/* harmony import */ var jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! jslib-common/abstractions/i18n.service */ "./jslib/common/src/abstractions/i18n.service.ts");
+/* harmony import */ var jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! jslib-common/abstractions/log.service */ "./jslib/common/src/abstractions/log.service.ts");
+/* harmony import */ var jslib_common_abstractions_messaging_service__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! jslib-common/abstractions/messaging.service */ "./jslib/common/src/abstractions/messaging.service.ts");
+/* harmony import */ var jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! jslib-common/abstractions/platformUtils.service */ "./jslib/common/src/abstractions/platformUtils.service.ts");
+/* harmony import */ var jslib_common_abstractions_policy_service__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! jslib-common/abstractions/policy.service */ "./jslib/common/src/abstractions/policy.service.ts");
+/* harmony import */ var jslib_common_abstractions_state_service__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! jslib-common/abstractions/state.service */ "./jslib/common/src/abstractions/state.service.ts");
+/* harmony import */ var jslib_common_abstractions_storage_service__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! jslib-common/abstractions/storage.service */ "./jslib/common/src/abstractions/storage.service.ts");
+/* harmony import */ var jslib_common_abstractions_user_service__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! jslib-common/abstractions/user.service */ "./jslib/common/src/abstractions/user.service.ts");
+/* harmony import */ var jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! jslib-common/services/constants.service */ "./jslib/common/src/services/constants.service.ts");
+/* harmony import */ var _services_popup_utils_service__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../services/popup-utils.service */ "./src/popup/services/popup-utils.service.ts");
+/* harmony import */ var jslib_angular_components_add_edit_component__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! jslib-angular/components/add-edit.component */ "./jslib/angular/src/components/add-edit.component.ts");
+/* harmony import */ var jslib_common_enums_cipherType__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! jslib-common/enums/cipherType */ "./jslib/common/src/enums/cipherType.ts");
+/* harmony import */ var _angular_forms__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! @angular/forms */ "./node_modules/@angular/forms/__ivy_ngcc__/fesm2015/forms.js");
+/* harmony import */ var jslib_angular_directives_api_action_directive__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! jslib-angular/directives/api-action.directive */ "./jslib/angular/src/directives/api-action.directive.ts");
+/* harmony import */ var jslib_angular_directives_blur_click_directive__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! jslib-angular/directives/blur-click.directive */ "./jslib/angular/src/directives/blur-click.directive.ts");
+/* harmony import */ var jslib_angular_directives_box_row_directive__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! jslib-angular/directives/box-row.directive */ "./jslib/angular/src/directives/box-row.directive.ts");
+/* harmony import */ var jslib_angular_directives_a11y_title_directive__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! jslib-angular/directives/a11y-title.directive */ "./jslib/angular/src/directives/a11y-title.directive.ts");
+/* harmony import */ var _add_edit_custom_fields_component__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ./add-edit-custom-fields.component */ "./src/popup/vault/add-edit-custom-fields.component.ts");
+/* harmony import */ var jslib_angular_components_callout_component__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! jslib-angular/components/callout.component */ "./jslib/angular/src/components/callout.component.ts");
+/* harmony import */ var jslib_angular_directives_input_verbatim_directive__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! jslib-angular/directives/input-verbatim.directive */ "./jslib/angular/src/directives/input-verbatim.directive.ts");
+/* harmony import */ var jslib_angular_directives_stop_click_directive__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! jslib-angular/directives/stop-click.directive */ "./jslib/angular/src/directives/stop-click.directive.ts");
+/* harmony import */ var jslib_angular_pipes_i18n_pipe__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! jslib-angular/pipes/i18n.pipe */ "./jslib/angular/src/pipes/i18n.pipe.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+function AddEditComponent_content_31_app_callout_2_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "app-callout", 35);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](2, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate1"]("\n ", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](2, 1, "personalOwnershipPolicyInEffect"), "\n ");
+} }
+function AddEditComponent_content_31_div_12_option_8_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "option", 38);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const o_r16 = ctx.$implicit;
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngValue", o_r16.value);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](o_r16.name);
+} }
+function AddEditComponent_content_31_div_12_Template(rf, ctx) { if (rf & 1) {
+ const _r18 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "div", 16);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "label", 36);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](4, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](6, "select", 37);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("ngModelChange", function AddEditComponent_content_31_div_12_Template_select_ngModelChange_6_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r18); const ctx_r17 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](2); return ctx_r17.cipher.type = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](8, AddEditComponent_content_31_div_12_option_8_Template, 2, 2, "option", 22);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](9, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](10, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r3 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](4, 3, "type"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngModel", ctx_r3.cipher.type);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngForOf", ctx_r3.typeOptions);
+} }
+function AddEditComponent_content_31_div_24_button_24_Template(rf, ctx) { if (rf & 1) {
+ const _r24 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "button", 50, 51);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("click", function AddEditComponent_content_31_div_24_button_24_Template_button_click_0_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r24); const ctx_r23 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](3); return ctx_r23.checkPassword(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](2, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](4, "i", 52);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](6, "i", 53);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const _r22 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵreference"](1);
+ const ctx_r19 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpropertyInterpolate"]("appA11yTitle", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](2, 5, "checkPassword"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("appApiAction", ctx_r19.checkPasswordPromise)("disabled", _r22.loading);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("hidden", _r22.loading);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("hidden", !_r22.loading);
+} }
+const _c0 = function (a0, a1) { return { "fa-eye": a0, "fa-eye-slash": a1 }; };
+function AddEditComponent_content_31_div_24_button_26_Template(rf, ctx) { if (rf & 1) {
+ const _r26 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "button", 54);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("click", function AddEditComponent_content_31_div_24_button_26_Template_button_click_0_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r26); const ctx_r25 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](3); return ctx_r25.togglePassword(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](1, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](2, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](3, "i", 55);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](4, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r20 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpropertyInterpolate"]("appA11yTitle", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](1, 2, "toggleVisibility"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngClass", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpureFunction2"](4, _c0, !ctx_r20.showPassword, ctx_r20.showPassword));
+} }
+function AddEditComponent_content_31_div_24_button_28_Template(rf, ctx) { if (rf & 1) {
+ const _r28 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "button", 54);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("click", function AddEditComponent_content_31_div_24_button_28_Template_button_click_0_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r28); const ctx_r27 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](3); return ctx_r27.generatePassword(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](1, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](2, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](3, "i", 56);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](4, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpropertyInterpolate"]("appA11yTitle", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](1, 1, "generatePassword"));
+} }
+function AddEditComponent_content_31_div_24_Template(rf, ctx) { if (rf & 1) {
+ const _r30 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "div");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "div", 16);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](4, "label", 39);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](6, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](8, "input", 40);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("ngModelChange", function AddEditComponent_content_31_div_24_Template_input_ngModelChange_8_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r30); const ctx_r29 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](2); return ctx_r29.cipher.login.username = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](9, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](10, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](11, "div", 41);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](12, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](13, "div", 42);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](14, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](15, "label", 43);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](16);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](17, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](18, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](19, "input", 44);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("ngModelChange", function AddEditComponent_content_31_div_24_Template_input_ngModelChange_19_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r30); const ctx_r31 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](2); return ctx_r31.cipher.login.password = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](20, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](21, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](22, "div", 45);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](23, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](24, AddEditComponent_content_31_div_24_button_24_Template, 8, 7, "button", 46);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](25, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](26, AddEditComponent_content_31_div_24_button_26_Template, 5, 7, "button", 47);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](27, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](28, AddEditComponent_content_31_div_24_button_28_Template, 5, 3, "button", 47);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](29, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](30, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](31, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](32, "div", 16);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](33, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](34, "label", 48);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](35);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](36, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](37, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](38, "input", 49);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("ngModelChange", function AddEditComponent_content_31_div_24_Template_input_ngModelChange_38_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r30); const ctx_r32 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](2); return ctx_r32.cipher.login.totp = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](39, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](40, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r4 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](6, 13, "username"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngModel", ctx_r4.cipher.login.username);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](17, 15, "password"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpropertyInterpolate"]("type", ctx_r4.showPassword ? "text" : "password");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngModel", ctx_r4.cipher.login.password)("disabled", !ctx_r4.cipher.viewPassword);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx_r4.cipher.viewPassword);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx_r4.cipher.viewPassword);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx_r4.cipher.viewPassword);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](36, 17, "authenticatorKeyTotp"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpropertyInterpolate"]("type", ctx_r4.cipher.viewPassword ? "text" : "password");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngModel", ctx_r4.cipher.login.totp)("disabled", !ctx_r4.cipher.viewPassword);
+} }
+function AddEditComponent_content_31_div_27_option_40_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "option", 38);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const o_r35 = ctx.$implicit;
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngValue", o_r35.value);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](o_r35.name);
+} }
+function AddEditComponent_content_31_div_27_option_52_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "option", 38);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const o_r36 = ctx.$implicit;
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngValue", o_r36.value);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](o_r36.name);
+} }
+function AddEditComponent_content_31_div_27_Template(rf, ctx) { if (rf & 1) {
+ const _r38 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "div");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "div", 16);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](4, "label", 57);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](6, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](8, "input", 58);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("ngModelChange", function AddEditComponent_content_31_div_27_Template_input_ngModelChange_8_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r38); const ctx_r37 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](2); return ctx_r37.cipher.card.cardholderName = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](9, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](10, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](11, "div", 41);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](12, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](13, "div", 42);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](14, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](15, "label", 59);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](16);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](17, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](18, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](19, "input", 60);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("ngModelChange", function AddEditComponent_content_31_div_27_Template_input_ngModelChange_19_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r38); const ctx_r39 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](2); return ctx_r39.cipher.card.number = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](20, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](21, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](22, "div", 45);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](23, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](24, "button", 54);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("click", function AddEditComponent_content_31_div_27_Template_button_click_24_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r38); const ctx_r40 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](2); return ctx_r40.toggleCardNumber(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](25, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](26, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](27, "i", 55);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](28, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](29, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](30, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](31, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](32, "div", 16);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](33, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](34, "label", 61);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](35);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](36, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](37, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](38, "select", 62);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("ngModelChange", function AddEditComponent_content_31_div_27_Template_select_ngModelChange_38_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r38); const ctx_r41 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](2); return ctx_r41.cipher.card.brand = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](39, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](40, AddEditComponent_content_31_div_27_option_40_Template, 2, 2, "option", 22);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](41, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](42, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](43, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](44, "div", 16);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](45, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](46, "label", 63);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](47);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](48, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](49, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](50, "select", 64);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("ngModelChange", function AddEditComponent_content_31_div_27_Template_select_ngModelChange_50_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r38); const ctx_r42 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](2); return ctx_r42.cipher.card.expMonth = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](51, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](52, AddEditComponent_content_31_div_27_option_52_Template, 2, 2, "option", 22);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](53, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](54, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](55, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](56, "div", 16);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](57, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](58, "label", 65);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](59);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](60, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](61, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](62, "input", 66);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("ngModelChange", function AddEditComponent_content_31_div_27_Template_input_ngModelChange_62_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r38); const ctx_r43 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](2); return ctx_r43.cipher.card.expYear = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](63, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](64, "date");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](65, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](66, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](67, "div", 41);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](68, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](69, "div", 42);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](70, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](71, "label", 67);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](72);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](73, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](74, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](75, "input", 68);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("ngModelChange", function AddEditComponent_content_31_div_27_Template_input_ngModelChange_75_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r38); const ctx_r44 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](2); return ctx_r44.cipher.card.code = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](76, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](77, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](78, "div", 45);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](79, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](80, "button", 54);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("click", function AddEditComponent_content_31_div_27_Template_button_click_80_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r38); const ctx_r45 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](2); return ctx_r45.toggleCardCode(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](81, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](82, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](83, "i", 55);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](84, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](85, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](86, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](87, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r5 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](6, 22, "cardholderName"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngModel", ctx_r5.cipher.card.cardholderName);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](17, 24, "number"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpropertyInterpolate"]("type", ctx_r5.showCardNumber ? "text" : "password");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngModel", ctx_r5.cipher.card.number);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpropertyInterpolate"]("appA11yTitle", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](25, 26, "toggleVisibility"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngClass", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpureFunction2"](43, _c0, !ctx_r5.showCardNumber, ctx_r5.showCardNumber));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](36, 28, "brand"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngModel", ctx_r5.cipher.card.brand);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngForOf", ctx_r5.cardBrandOptions);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](48, 30, "expirationMonth"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngModel", ctx_r5.cipher.card.expMonth);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngForOf", ctx_r5.cardExpMonthOptions);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](60, 32, "expirationYear"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpropertyInterpolate2"]("placeholder", "", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](63, 34, "ex"), " ", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind2"](64, 36, ctx_r5.currentDate, "yyyy"), "");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngModel", ctx_r5.cipher.card.expYear);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](73, 39, "securityCode"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpropertyInterpolate"]("type", ctx_r5.showCardCode ? "text" : "password");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngModel", ctx_r5.cipher.card.code);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpropertyInterpolate"]("appA11yTitle", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](81, 41, "toggleVisibility"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngClass", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpureFunction2"](46, _c0, !ctx_r5.showCardCode, ctx_r5.showCardCode));
+} }
+function AddEditComponent_content_31_div_30_option_10_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "option", 38);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const o_r47 = ctx.$implicit;
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngValue", o_r47.value);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](o_r47.name);
+} }
+function AddEditComponent_content_31_div_30_Template(rf, ctx) { if (rf & 1) {
+ const _r49 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "div");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "div", 16);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](4, "label", 69);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](6, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](8, "select", 70);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("ngModelChange", function AddEditComponent_content_31_div_30_Template_select_ngModelChange_8_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r49); const ctx_r48 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](2); return ctx_r48.cipher.identity.title = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](9, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](10, AddEditComponent_content_31_div_30_option_10_Template, 2, 2, "option", 22);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](11, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](12, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](13, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](14, "div", 16);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](15, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](16, "label", 71);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](17);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](18, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](19, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](20, "input", 72);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("ngModelChange", function AddEditComponent_content_31_div_30_Template_input_ngModelChange_20_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r49); const ctx_r50 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](2); return ctx_r50.cipher.identity.firstName = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](21, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](22, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](23, "div", 16);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](24, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](25, "label", 73);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](26);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](27, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](28, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](29, "input", 74);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("ngModelChange", function AddEditComponent_content_31_div_30_Template_input_ngModelChange_29_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r49); const ctx_r51 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](2); return ctx_r51.cipher.identity.middleName = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](30, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](31, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](32, "div", 16);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](33, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](34, "label", 75);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](35);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](36, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](37, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](38, "input", 76);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("ngModelChange", function AddEditComponent_content_31_div_30_Template_input_ngModelChange_38_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r49); const ctx_r52 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](2); return ctx_r52.cipher.identity.lastName = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](39, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](40, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](41, "div", 16);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](42, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](43, "label", 77);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](44);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](45, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](46, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](47, "input", 78);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("ngModelChange", function AddEditComponent_content_31_div_30_Template_input_ngModelChange_47_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r49); const ctx_r53 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](2); return ctx_r53.cipher.identity.username = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](48, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](49, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](50, "div", 16);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](51, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](52, "label", 79);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](53);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](54, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](55, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](56, "input", 80);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("ngModelChange", function AddEditComponent_content_31_div_30_Template_input_ngModelChange_56_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r49); const ctx_r54 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](2); return ctx_r54.cipher.identity.company = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](57, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](58, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](59, "div", 16);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](60, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](61, "label", 81);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](62);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](63, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](64, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](65, "input", 82);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("ngModelChange", function AddEditComponent_content_31_div_30_Template_input_ngModelChange_65_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r49); const ctx_r55 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](2); return ctx_r55.cipher.identity.ssn = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](66, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](67, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](68, "div", 16);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](69, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](70, "label", 83);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](71);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](72, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](73, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](74, "input", 84);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("ngModelChange", function AddEditComponent_content_31_div_30_Template_input_ngModelChange_74_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r49); const ctx_r56 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](2); return ctx_r56.cipher.identity.passportNumber = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](75, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](76, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](77, "div", 16);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](78, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](79, "label", 85);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](80);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](81, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](82, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](83, "input", 86);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("ngModelChange", function AddEditComponent_content_31_div_30_Template_input_ngModelChange_83_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r49); const ctx_r57 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](2); return ctx_r57.cipher.identity.licenseNumber = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](84, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](85, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](86, "div", 16);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](87, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](88, "label", 87);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](89);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](90, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](91, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](92, "input", 88);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("ngModelChange", function AddEditComponent_content_31_div_30_Template_input_ngModelChange_92_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r49); const ctx_r58 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](2); return ctx_r58.cipher.identity.email = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](93, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](94, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](95, "div", 16);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](96, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](97, "label", 89);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](98);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](99, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](100, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](101, "input", 90);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("ngModelChange", function AddEditComponent_content_31_div_30_Template_input_ngModelChange_101_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r49); const ctx_r59 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](2); return ctx_r59.cipher.identity.phone = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](102, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](103, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](104, "div", 16);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](105, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](106, "label", 91);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](107);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](108, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](109, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](110, "input", 92);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("ngModelChange", function AddEditComponent_content_31_div_30_Template_input_ngModelChange_110_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r49); const ctx_r60 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](2); return ctx_r60.cipher.identity.address1 = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](111, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](112, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](113, "div", 16);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](114, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](115, "label", 93);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](116);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](117, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](118, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](119, "input", 94);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("ngModelChange", function AddEditComponent_content_31_div_30_Template_input_ngModelChange_119_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r49); const ctx_r61 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](2); return ctx_r61.cipher.identity.address2 = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](120, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](121, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](122, "div", 16);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](123, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](124, "label", 95);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](125);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](126, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](127, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](128, "input", 96);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("ngModelChange", function AddEditComponent_content_31_div_30_Template_input_ngModelChange_128_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r49); const ctx_r62 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](2); return ctx_r62.cipher.identity.address3 = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](129, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](130, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](131, "div", 16);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](132, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](133, "label", 97);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](134);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](135, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](136, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](137, "input", 98);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("ngModelChange", function AddEditComponent_content_31_div_30_Template_input_ngModelChange_137_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r49); const ctx_r63 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](2); return ctx_r63.cipher.identity.city = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](138, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](139, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](140, "div", 16);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](141, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](142, "label", 99);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](143);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](144, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](145, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](146, "input", 100);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("ngModelChange", function AddEditComponent_content_31_div_30_Template_input_ngModelChange_146_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r49); const ctx_r64 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](2); return ctx_r64.cipher.identity.state = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](147, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](148, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](149, "div", 16);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](150, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](151, "label", 101);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](152);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](153, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](154, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](155, "input", 102);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("ngModelChange", function AddEditComponent_content_31_div_30_Template_input_ngModelChange_155_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r49); const ctx_r65 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](2); return ctx_r65.cipher.identity.postalCode = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](156, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](157, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](158, "div", 16);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](159, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](160, "label", 103);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](161);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](162, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](163, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](164, "input", 104);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("ngModelChange", function AddEditComponent_content_31_div_30_Template_input_ngModelChange_164_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r49); const ctx_r66 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](2); return ctx_r66.cipher.identity.country = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](165, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](166, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r6 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](6, 37, "title"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngModel", ctx_r6.cipher.identity.title);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngForOf", ctx_r6.identityTitleOptions);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](18, 39, "firstName"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngModel", ctx_r6.cipher.identity.firstName);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](27, 41, "middleName"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngModel", ctx_r6.cipher.identity.middleName);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](36, 43, "lastName"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngModel", ctx_r6.cipher.identity.lastName);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](45, 45, "username"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngModel", ctx_r6.cipher.identity.username);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](54, 47, "company"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngModel", ctx_r6.cipher.identity.company);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](63, 49, "ssn"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngModel", ctx_r6.cipher.identity.ssn);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](72, 51, "passportNumber"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngModel", ctx_r6.cipher.identity.passportNumber);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](81, 53, "licenseNumber"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngModel", ctx_r6.cipher.identity.licenseNumber);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](90, 55, "email"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngModel", ctx_r6.cipher.identity.email);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](99, 57, "phone"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngModel", ctx_r6.cipher.identity.phone);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](108, 59, "address1"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngModel", ctx_r6.cipher.identity.address1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](117, 61, "address2"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngModel", ctx_r6.cipher.identity.address2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](126, 63, "address3"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngModel", ctx_r6.cipher.identity.address3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](135, 65, "cityTown"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngModel", ctx_r6.cipher.identity.city);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](144, 67, "stateProvince"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngModel", ctx_r6.cipher.identity.state);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](153, 69, "zipPostalCode"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngModel", ctx_r6.cipher.identity.postalCode);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](162, 71, "country"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngModel", ctx_r6.cipher.identity.country);
+} }
+function AddEditComponent_content_31_div_34_ng_container_4_div_2_select_21_option_6_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "option", 38);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const u_r75 = ctx.$implicit;
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngValue", u_r75);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](u_r75);
+} }
+function AddEditComponent_content_31_div_34_ng_container_4_div_2_select_21_Template(rf, ctx) { if (rf & 1) {
+ const _r78 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "select", 117);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("ngModelChange", function AddEditComponent_content_31_div_34_ng_container_4_div_2_select_21_Template_select_ngModelChange_0_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r78); const u_r69 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"]().$implicit; return u_r69.uri = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "option", 38);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](4, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](6, AddEditComponent_content_31_div_34_ng_container_4_div_2_select_21_option_6_Template, 2, 2, "option", 22);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r79 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"]();
+ const i_r70 = ctx_r79.index;
+ const u_r69 = ctx_r79.$implicit;
+ const ctx_r71 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpropertyInterpolate1"]("id", "currentUris", i_r70, "");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpropertyInterpolate1"]("name", "Login.Uris[", i_r70, "].CurrentUris");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngModel", u_r69.uri)("hidden", !u_r69.showCurrentUris);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngValue", null);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate1"]("-- ", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](4, 7, "select"), " --");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngForOf", ctx_r71.currentUris);
+} }
+function AddEditComponent_content_31_div_34_ng_container_4_div_2_option_29_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "option", 38);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const o_r80 = ctx.$implicit;
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngValue", o_r80.value);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](o_r80.name);
+} }
+function AddEditComponent_content_31_div_34_ng_container_4_div_2_button_35_Template(rf, ctx) { if (rf & 1) {
+ const _r83 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "button", 54);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("click", function AddEditComponent_content_31_div_34_ng_container_4_div_2_button_35_Template_button_click_0_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r83); const u_r69 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"]().$implicit; const ctx_r81 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](4); return ctx_r81.toggleUriInput(u_r69); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](1, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](2, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](3, "i", 118);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](4, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpropertyInterpolate"]("appA11yTitle", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](1, 1, "toggleCurrentUris"));
+} }
+function AddEditComponent_content_31_div_34_ng_container_4_div_2_Template(rf, ctx) { if (rf & 1) {
+ const _r85 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "div", 108);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "button", 109);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("click", function AddEditComponent_content_31_div_34_ng_container_4_div_2_Template_button_click_2_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r85); const u_r69 = ctx.$implicit; const ctx_r84 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](4); return ctx_r84.removeUri(u_r69); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](3, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](4, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](5, "i", 110);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](6, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](8, "div", 42);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](9, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](10, "label", 111);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](11);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](12, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](13, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](14, "input", 112);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("ngModelChange", function AddEditComponent_content_31_div_34_ng_container_4_div_2_Template_input_ngModelChange_14_listener($event) { const u_r69 = ctx.$implicit; return u_r69.uri = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](15, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](16, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](17, "label", 113);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](18);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](19, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](20, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](21, AddEditComponent_content_31_div_34_ng_container_4_div_2_select_21_Template, 8, 9, "select", 114);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](22, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](23, "label", 113);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](24);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](25, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](26, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](27, "select", 115);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("ngModelChange", function AddEditComponent_content_31_div_34_ng_container_4_div_2_Template_select_ngModelChange_27_listener($event) { const u_r69 = ctx.$implicit; return u_r69.match = $event; })("change", function AddEditComponent_content_31_div_34_ng_container_4_div_2_Template_select_change_27_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r85); const u_r69 = ctx.$implicit; const ctx_r88 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](4); return ctx_r88.loginUriMatchChanged(u_r69); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](28, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](29, AddEditComponent_content_31_div_34_ng_container_4_div_2_option_29_Template, 2, 2, "option", 22);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](30, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](31, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](32, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](33, "div", 45);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](34, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](35, AddEditComponent_content_31_div_34_ng_container_4_div_2_button_35_Template, 5, 3, "button", 47);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](36, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](37, "button", 54);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("click", function AddEditComponent_content_31_div_34_ng_container_4_div_2_Template_button_click_37_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r85); const u_r69 = ctx.$implicit; const ctx_r89 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](4); return ctx_r89.toggleUriOptions(u_r69); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](38, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](39, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](40, "i", 116);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](41, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](42, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](43, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const u_r69 = ctx.$implicit;
+ const i_r70 = ctx.index;
+ const ctx_r68 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpropertyInterpolate"]("appA11yTitle", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](3, 22, "remove"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpropertyInterpolate1"]("for", "loginUri", i_r70, "");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind2"](12, 24, "uriPosition", i_r70 + 1));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpropertyInterpolate1"]("id", "loginUri", i_r70, "");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpropertyInterpolate1"]("name", "Login.Uris[", i_r70, "].Uri");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpropertyInterpolate1"]("placeholder", "", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](15, 27, "ex"), " https://google.com");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngModel", u_r69.uri)("hidden", u_r69.showUriOptionsInput === true);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpropertyInterpolate1"]("for", "loginUriMatch", i_r70, "");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate2"]("\n ", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](19, 29, "currentUri"), " ", i_r70 + 1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx_r68.currentUris && ctx_r68.currentUris.length);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpropertyInterpolate1"]("for", "loginUriMatch", i_r70, "");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate2"]("\n ", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](25, 31, "matchDetection"), " ", i_r70 + 1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpropertyInterpolate1"]("id", "loginUriMatch", i_r70, "");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpropertyInterpolate1"]("name", "Login.Uris[", i_r70, "].Match");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngModel", u_r69.match)("hidden", u_r69.showOptions === false || u_r69.showOptions == null && u_r69.match == null);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngForOf", ctx_r68.uriMatchOptions);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx_r68.currentUris && ctx_r68.currentUris.length);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpropertyInterpolate"]("appA11yTitle", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](38, 33, "toggleOptions"));
+} }
+function AddEditComponent_content_31_div_34_ng_container_4_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementContainerStart"](0);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](2, AddEditComponent_content_31_div_34_ng_container_4_div_2_Template, 44, 35, "div", 107);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementContainerEnd"]();
+} if (rf & 2) {
+ const ctx_r67 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngForOf", ctx_r67.cipher.login.uris)("ngForTrackBy", ctx_r67.trackByFunction);
+} }
+function AddEditComponent_content_31_div_34_Template(rf, ctx) { if (rf & 1) {
+ const _r91 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "div", 12);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "div", 14);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](4, AddEditComponent_content_31_div_34_ng_container_4_Template, 4, 2, "ng-container", 10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](6, "button", 105);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("click", function AddEditComponent_content_31_div_34_Template_button_click_6_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r91); const ctx_r90 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](2); return ctx_r90.addUri(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](8, "i", 106);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](10, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](11, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](12, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r7 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx_r7.cipher.login.hasUris);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate1"](" ", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](10, 2, "newUri"), "\n ");
+} }
+function AddEditComponent_content_31_div_36_option_12_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "option", 38);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const o_r93 = ctx.$implicit;
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngValue", o_r93.value);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](o_r93.name);
+} }
+function AddEditComponent_content_31_div_36_Template(rf, ctx) { if (rf & 1) {
+ const _r95 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "div", 12);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "div", 14);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](4, "div", 16);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](6, "label", 119);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](8, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](9, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](10, "select", 120);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("ngModelChange", function AddEditComponent_content_31_div_36_Template_select_ngModelChange_10_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r95); const ctx_r94 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](2); return ctx_r94.cipher.login.autofillOnPageLoad = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](11, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](12, AddEditComponent_content_31_div_36_option_12_Template, 2, 2, "option", 22);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](13, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](14, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](15, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](16, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r8 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate1"]("", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](8, 3, "itemAutoFillOnPageLoad"), " ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngModel", ctx_r8.cipher.login.autofillOnPageLoad);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngForOf", ctx_r8.autofillOnPageLoadOptions);
+} }
+function AddEditComponent_content_31_option_50_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "option", 38);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const f_r96 = ctx.$implicit;
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngValue", f_r96.id);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](f_r96.name);
+} }
+function AddEditComponent_content_31_button_78_i_6_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](0, "i", 124);
+} }
+function AddEditComponent_content_31_button_78_i_8_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](0, "i", 125);
+} }
+function AddEditComponent_content_31_button_78_Template(rf, ctx) { if (rf & 1) {
+ const _r100 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "button", 121);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("click", function AddEditComponent_content_31_button_78_Template_button_click_0_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r100); const ctx_r99 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](2); return ctx_r99.attachments(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "div", 42);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](4, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](6, AddEditComponent_content_31_button_78_i_6_Template, 1, 0, "i", 122);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](8, AddEditComponent_content_31_button_78_i_8_Template, 1, 0, "i", 123);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](9, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r10 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](4, 3, "attachments"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx_r10.openAttachmentsInPopup);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", !ctx_r10.openAttachmentsInPopup);
+} }
+function AddEditComponent_content_31_button_80_Template(rf, ctx) { if (rf & 1) {
+ const _r102 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "button", 121);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("click", function AddEditComponent_content_31_button_80_Template_button_click_0_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r102); const ctx_r101 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](2); return ctx_r101.editCollections(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "div", 42);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](4, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](6, "i", 125);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](4, 1, "collections"));
+} }
+function AddEditComponent_content_31_div_105_option_16_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "option", 38);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const o_r104 = ctx.$implicit;
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngValue", o_r104.value);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](o_r104.name);
+} }
+function AddEditComponent_content_31_div_105_Template(rf, ctx) { if (rf & 1) {
+ const _r106 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "div", 12);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "div", 13);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](4, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](6, "div", 14);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](8, "div", 16);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](9, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](10, "label", 126);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](11);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](12, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](13, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](14, "select", 127);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("ngModelChange", function AddEditComponent_content_31_div_105_Template_select_ngModelChange_14_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r106); const ctx_r105 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](2); return ctx_r105.cipher.organizationId = $event; })("change", function AddEditComponent_content_31_div_105_Template_select_change_14_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r106); const ctx_r107 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](2); return ctx_r107.organizationChanged(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](15, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](16, AddEditComponent_content_31_div_105_option_16_Template, 2, 2, "option", 22);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](17, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](18, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](19, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](20, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r12 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate1"]("\n ", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](4, 4, "ownership"), "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](12, 6, "whoOwnsThisItem"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngModel", ctx_r12.cipher.organizationId);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngForOf", ctx_r12.ownershipOptions);
+} }
+function AddEditComponent_content_31_div_107_div_6_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "div", 14);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "div", 129);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](4, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate1"]("\n ", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](4, 1, "noCollectionsInList"), "\n ");
+} }
+function AddEditComponent_content_31_div_107_div_8_div_2_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "div", 23);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "label", 111);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](4, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](5, "input", 131);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("ngModelChange", function AddEditComponent_content_31_div_107_div_8_div_2_Template_input_ngModelChange_5_listener($event) { const c_r111 = ctx.$implicit; return c_r111.checked = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](6, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const c_r111 = ctx.$implicit;
+ const i_r112 = ctx.index;
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpropertyInterpolate1"]("for", "collection_", i_r112, "");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](c_r111.name);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpropertyInterpolate1"]("id", "collection_", i_r112, "");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpropertyInterpolate1"]("name", "Collection[", i_r112, "].Checked");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngModel", c_r111.checked);
+} }
+function AddEditComponent_content_31_div_107_div_8_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "div", 14);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](2, AddEditComponent_content_31_div_107_div_8_div_2_Template, 7, 5, "div", 130);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r109 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngForOf", ctx_r109.collections);
+} }
+function AddEditComponent_content_31_div_107_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "div", 12);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "div", 13);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](4, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](6, AddEditComponent_content_31_div_107_div_6_Template, 6, 3, "div", 128);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](8, AddEditComponent_content_31_div_107_div_8_Template, 4, 1, "div", 128);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](9, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r13 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate1"]("\n ", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](4, 3, "collections"), "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", !ctx_r13.collections || !ctx_r13.collections.length);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx_r13.collections && ctx_r13.collections.length);
+} }
+function AddEditComponent_content_31_div_109_Template(rf, ctx) { if (rf & 1) {
+ const _r116 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "div", 132);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "div", 133);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](4, "button", 134, 135);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("click", function AddEditComponent_content_31_div_109_Template_button_click_4_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r116); const ctx_r115 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](2); return ctx_r115.delete(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](6, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](7, "div", 136);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](8, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](9, "div", 137);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](10, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](11, "i", 138);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](12, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](13, "i", 139);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](14, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](15, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](16, "span");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](17);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](18, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](19, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](20, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](21, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](22, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const _r114 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵreference"](5);
+ const ctx_r14 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("appApiAction", ctx_r14.deletePromise);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("hidden", _r114.loading);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("hidden", !_r114.loading);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](18, 4, "deleteItem"));
+} }
+function AddEditComponent_content_31_Template(rf, ctx) { if (rf & 1) {
+ const _r118 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "content");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](2, AddEditComponent_content_31_app_callout_2_Template, 3, 3, "app-callout", 11);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](4, "div", 12);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](6, "div", 13);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](8, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](9, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](10, "div", 14);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](11, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](12, AddEditComponent_content_31_div_12_Template, 11, 5, "div", 15);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](13, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](14, "div", 16);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](15, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](16, "label", 17);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](17);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](18, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](19, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](20, "input", 18);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("ngModelChange", function AddEditComponent_content_31_Template_input_ngModelChange_20_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r118); const ctx_r117 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](); return ctx_r117.cipher.name = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](21, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](22, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](23, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](24, AddEditComponent_content_31_div_24_Template, 41, 19, "div", 10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](25, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](26, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](27, AddEditComponent_content_31_div_27_Template, 88, 49, "div", 10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](28, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](29, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](30, AddEditComponent_content_31_div_30_Template, 167, 73, "div", 10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](31, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](32, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](33, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](34, AddEditComponent_content_31_div_34_Template, 13, 4, "div", 19);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](35, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](36, AddEditComponent_content_31_div_36_Template, 17, 5, "div", 19);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](37, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](38, "div", 12);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](39, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](40, "div", 14);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](41, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](42, "div", 16);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](43, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](44, "label", 20);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](45);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](46, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](47, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](48, "select", 21);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("ngModelChange", function AddEditComponent_content_31_Template_select_ngModelChange_48_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r118); const ctx_r119 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](); return ctx_r119.cipher.folderId = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](49, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](50, AddEditComponent_content_31_option_50_Template, 2, 2, "option", 22);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](51, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](52, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](53, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](54, "div", 23);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](55, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](56, "label", 24);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](57);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](58, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](59, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](60, "input", 25);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("ngModelChange", function AddEditComponent_content_31_Template_input_ngModelChange_60_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r118); const ctx_r120 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](); return ctx_r120.cipher.favorite = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](61, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](62, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](63, "div", 23);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](64, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](65, "label", 26);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](66);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](67, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](68, "a", 27);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](69, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](70, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](71, "i", 28);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](72, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](73, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](74, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](75, "input", 29);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("change", function AddEditComponent_content_31_Template_input_change_75_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r118); const ctx_r121 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](); return ctx_r121.repromptChanged(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](76, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](77, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](78, AddEditComponent_content_31_button_78_Template, 10, 5, "button", 30);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](79, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](80, AddEditComponent_content_31_button_80_Template, 8, 3, "button", 30);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](81, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](82, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](83, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](84, "div", 12);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](85, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](86, "div", 13);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](87, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](88, "label", 31);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](89);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](90, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](91, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](92, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](93, "div", 14);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](94, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](95, "div", 16);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](96, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](97, "textarea", 32);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("ngModelChange", function AddEditComponent_content_31_Template_textarea_ngModelChange_97_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r118); const ctx_r122 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](); return ctx_r122.cipher.notes = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](98, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](99, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](100, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](101, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](102, "app-vault-add-edit-custom-fields", 33);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](103, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](104, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](105, AddEditComponent_content_31_div_105_Template, 21, 8, "div", 19);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](106, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](107, AddEditComponent_content_31_div_107_Template, 10, 5, "div", 19);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](108, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](109, AddEditComponent_content_31_div_109_Template, 23, 6, "div", 34);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](110, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r1 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx_r1.allowOwnershipOptions() && !ctx_r1.allowPersonal);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate1"]("\n ", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](8, 28, "itemInformation"), "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", !ctx_r1.editMode);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](18, 30, "name"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngModel", ctx_r1.cipher.name);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx_r1.cipher.type === ctx_r1.cipherType.Login);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx_r1.cipher.type === ctx_r1.cipherType.Card);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx_r1.cipher.type === ctx_r1.cipherType.Identity);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx_r1.cipher.type === ctx_r1.cipherType.Login);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx_r1.showAutoFillOnPageLoadOptions);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](46, 32, "folder"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngModel", ctx_r1.cipher.folderId);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngForOf", ctx_r1.folders);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](58, 34, "favorite"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngModel", ctx_r1.cipher.favorite);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate1"]("\n ", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](67, 36, "passwordPrompt"), "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpropertyInterpolate"]("appA11yTitle", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](69, 38, "learnMore"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngModel", ctx_r1.reprompt);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx_r1.editMode && ctx_r1.showAttachments && !ctx_r1.cloneMode);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx_r1.editMode && ctx_r1.cipher.organizationId && !ctx_r1.cloneMode);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](90, 40, "notes"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngModel", ctx_r1.cipher.notes);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("cipher", ctx_r1.cipher)("thisCipherType", ctx_r1.cipher.type)("editMode", ctx_r1.editMode);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx_r1.allowOwnershipOptions());
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", (!ctx_r1.editMode || ctx_r1.cloneMode) && ctx_r1.cipher.organizationId);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx_r1.editMode && !ctx_r1.cloneMode);
+} }
+class AddEditComponent extends jslib_angular_components_add_edit_component__WEBPACK_IMPORTED_MODULE_20__["AddEditComponent"] {
+ constructor(cipherService, folderService, i18nService, platformUtilsService, auditService, stateService, userService, collectionService, messagingService, route, router, location, eventService, policyService, popupUtilsService, storageService, logService) {
+ super(cipherService, folderService, i18nService, platformUtilsService, auditService, stateService, userService, collectionService, messagingService, eventService, policyService, logService);
+ this.route = route;
+ this.router = router;
+ this.location = location;
+ this.popupUtilsService = popupUtilsService;
+ this.storageService = storageService;
+ this.showAttachments = true;
+ }
+ ngOnInit() {
+ const _super = Object.create(null, {
+ ngOnInit: { get: () => super.ngOnInit }
+ });
+ return __awaiter(this, void 0, void 0, function* () {
+ yield _super.ngOnInit.call(this);
+ this.route.queryParams.pipe(Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_3__["first"])()).subscribe((params) => __awaiter(this, void 0, void 0, function* () {
+ if (params.cipherId) {
+ this.cipherId = params.cipherId;
+ }
+ if (params.folderId) {
+ this.folderId = params.folderId;
+ }
+ if (params.collectionId) {
+ const collection = this.writeableCollections.find(c => c.id === params.collectionId);
+ if (collection != null) {
+ this.collectionIds = [collection.id];
+ this.organizationId = collection.organizationId;
+ }
+ }
+ if (params.type) {
+ const type = parseInt(params.type, null);
+ this.type = type;
+ }
+ this.editMode = !params.cipherId;
+ if (params.cloneMode != null) {
+ this.cloneMode = params.cloneMode === 'true';
+ }
+ yield this.load();
+ if (!this.editMode || this.cloneMode) {
+ if (!this.popupUtilsService.inPopout(window) && params.name &&
+ (this.cipher.name == null || this.cipher.name === '')) {
+ this.cipher.name = params.name;
+ }
+ if (!this.popupUtilsService.inPopout(window) && params.uri &&
+ (this.cipher.login.uris[0].uri == null || this.cipher.login.uris[0].uri === '')) {
+ this.cipher.login.uris[0].uri = params.uri;
+ }
+ }
+ this.openAttachmentsInPopup = this.popupUtilsService.inPopup(window);
+ }));
+ if (!this.editMode) {
+ const tabs = yield _browser_browserApi__WEBPACK_IMPORTED_MODULE_4__["BrowserApi"].tabsQuery({ windowType: 'normal' });
+ this.currentUris = tabs == null ? null :
+ tabs.filter(tab => tab.url != null && tab.url !== '').map(tab => tab.url);
+ }
+ window.setTimeout(() => {
+ if (!this.editMode) {
+ if (this.cipher.name != null && this.cipher.name !== '') {
+ document.getElementById('loginUsername').focus();
+ }
+ else {
+ document.getElementById('name').focus();
+ }
+ }
+ }, 200);
+ });
+ }
+ load() {
+ const _super = Object.create(null, {
+ load: { get: () => super.load }
+ });
+ return __awaiter(this, void 0, void 0, function* () {
+ yield _super.load.call(this);
+ this.showAutoFillOnPageLoadOptions = this.cipher.type === jslib_common_enums_cipherType__WEBPACK_IMPORTED_MODULE_21__["CipherType"].Login &&
+ (yield this.storageService.get(jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_18__["ConstantsService"].enableAutoFillOnPageLoadKey));
+ });
+ }
+ submit() {
+ const _super = Object.create(null, {
+ submit: { get: () => super.submit }
+ });
+ return __awaiter(this, void 0, void 0, function* () {
+ if (yield _super.submit.call(this)) {
+ if (this.cloneMode) {
+ this.router.navigate(['/tabs/vault']);
+ }
+ else {
+ this.location.back();
+ }
+ return true;
+ }
+ return false;
+ });
+ }
+ attachments() {
+ super.attachments();
+ if (this.openAttachmentsInPopup) {
+ const destinationUrl = this.router.createUrlTree(['/attachments'], { queryParams: { cipherId: this.cipher.id } }).toString();
+ const currentBaseUrl = window.location.href.replace(this.router.url, '');
+ this.popupUtilsService.popOut(window, currentBaseUrl + destinationUrl);
+ }
+ else {
+ this.router.navigate(['/attachments'], { queryParams: { cipherId: this.cipher.id } });
+ }
+ }
+ editCollections() {
+ super.editCollections();
+ if (this.cipher.organizationId != null) {
+ this.router.navigate(['/collections'], { queryParams: { cipherId: this.cipher.id } });
+ }
+ }
+ cancel() {
+ super.cancel();
+ this.location.back();
+ }
+ generatePassword() {
+ const _super = Object.create(null, {
+ generatePassword: { get: () => super.generatePassword }
+ });
+ return __awaiter(this, void 0, void 0, function* () {
+ const confirmed = yield _super.generatePassword.call(this);
+ if (confirmed) {
+ this.stateService.save('addEditCipherInfo', {
+ cipher: this.cipher,
+ collectionIds: this.collections == null ? [] :
+ this.collections.filter(c => c.checked).map(c => c.id),
+ });
+ this.router.navigate(['generator']);
+ }
+ return confirmed;
+ });
+ }
+ delete() {
+ const _super = Object.create(null, {
+ delete: { get: () => super.delete }
+ });
+ return __awaiter(this, void 0, void 0, function* () {
+ const confirmed = yield _super.delete.call(this);
+ if (confirmed) {
+ this.router.navigate(['/tabs/vault']);
+ }
+ return confirmed;
+ });
+ }
+ toggleUriInput(uri) {
+ const u = uri;
+ u.showCurrentUris = !u.showCurrentUris;
+ }
+ allowOwnershipOptions() {
+ return (!this.editMode || this.cloneMode) && this.ownershipOptions
+ && (this.ownershipOptions.length > 1 || !this.allowPersonal);
+ }
+}
+AddEditComponent.ɵfac = function AddEditComponent_Factory(t) { return new (t || AddEditComponent)(_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](jslib_common_abstractions_cipher_service__WEBPACK_IMPORTED_MODULE_6__["CipherService"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](jslib_common_abstractions_folder_service__WEBPACK_IMPORTED_MODULE_9__["FolderService"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_10__["I18nService"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_13__["PlatformUtilsService"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](jslib_common_abstractions_audit_service__WEBPACK_IMPORTED_MODULE_5__["AuditService"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](jslib_common_abstractions_state_service__WEBPACK_IMPORTED_MODULE_15__["StateService"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](jslib_common_abstractions_user_service__WEBPACK_IMPORTED_MODULE_17__["UserService"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](jslib_common_abstractions_collection_service__WEBPACK_IMPORTED_MODULE_7__["CollectionService"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](jslib_common_abstractions_messaging_service__WEBPACK_IMPORTED_MODULE_12__["MessagingService"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](_angular_router__WEBPACK_IMPORTED_MODULE_2__["ActivatedRoute"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](_angular_router__WEBPACK_IMPORTED_MODULE_2__["Router"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](_angular_common__WEBPACK_IMPORTED_MODULE_0__["Location"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](jslib_common_abstractions_event_service__WEBPACK_IMPORTED_MODULE_8__["EventService"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](jslib_common_abstractions_policy_service__WEBPACK_IMPORTED_MODULE_14__["PolicyService"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](_services_popup_utils_service__WEBPACK_IMPORTED_MODULE_19__["PopupUtilsService"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](jslib_common_abstractions_storage_service__WEBPACK_IMPORTED_MODULE_16__["StorageService"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_11__["LogService"])); };
+AddEditComponent.ɵcmp = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdefineComponent"]({ type: AddEditComponent, selectors: [["app-vault-add-edit"]], features: [_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵInheritDefinitionFeature"]], decls: 34, vars: 12, consts: [[3, "appApiAction", "ngSubmit"], ["form", ""], [1, "left"], ["type", "button", "appBlurClick", "", 3, "click"], [1, "center"], [1, "title"], [1, "right"], ["type", "submit", "appBlurClick", "", 3, "disabled"], [3, "hidden"], ["aria-hidden", "true", 1, "fa", "fa-spinner", "fa-lg", "fa-spin", 3, "hidden"], [4, "ngIf"], ["type", "info", 4, "ngIf"], [1, "box"], [1, "box-header"], [1, "box-content"], ["class", "box-content-row", "appBoxRow", "", 4, "ngIf"], ["appBoxRow", "", 1, "box-content-row"], ["for", "name"], ["id", "name", "type", "text", "name", "Name", 3, "ngModel", "ngModelChange"], ["class", "box", 4, "ngIf"], ["for", "folder"], ["id", "folder", "name", "FolderId", 3, "ngModel", "ngModelChange"], [3, "ngValue", 4, "ngFor", "ngForOf"], ["appBoxRow", "", 1, "box-content-row", "box-content-row-checkbox"], ["for", "favorite"], ["id", "favorite", "type", "checkbox", "name", "Favorite", 3, "ngModel", "ngModelChange"], ["for", "passwordPrompt"], ["target", "_blank", "rel", "noopener", "href", "https://bitwarden.com/help/article/managing-items/#protect-individual-items", 3, "appA11yTitle"], ["aria-hidden", "true", 1, "fa", "fa-question-circle-o"], ["id", "passwordPrompt", "type", "checkbox", "name", "PasswordPrompt", 3, "ngModel", "change"], ["type", "button", "class", "box-content-row box-content-row-flex text-default", "appStopClick", "", "appBlurClick", "", 3, "click", 4, "ngIf"], ["for", "notes"], ["id", "notes", "name", "Notes", "rows", "6", 3, "ngModel", "ngModelChange"], [3, "cipher", "thisCipherType", "editMode"], ["class", "box list", 4, "ngIf"], ["type", "info"], ["for", "type"], ["id", "type", "name", "Type", 3, "ngModel", "ngModelChange"], [3, "ngValue"], ["for", "loginUsername"], ["id", "loginUsername", "type", "text", "name", "Login.Username", "inputmode", "email", "appInputVerbatim", "", 3, "ngModel", "ngModelChange"], ["appBoxRow", "", 1, "box-content-row", "box-content-row-flex"], [1, "row-main"], ["for", "loginPassword"], ["id", "loginPassword", "name", "Login.Password", "appInputVerbatim", "", 1, "monospaced", 3, "type", "ngModel", "disabled", "ngModelChange"], [1, "action-buttons"], ["type", "button", "class", "row-btn btn", "appBlurClick", "", 3, "appA11yTitle", "appApiAction", "disabled", "click", 4, "ngIf"], ["type", "button", "class", "row-btn", "appStopClick", "", "appBlurClick", "", 3, "appA11yTitle", "click", 4, "ngIf"], ["for", "loginTotp"], ["id", "loginTotp", "name", "Login.Totp", "appInputVerbatim", "", 1, "monospaced", 3, "type", "ngModel", "disabled", "ngModelChange"], ["type", "button", "appBlurClick", "", 1, "row-btn", "btn", 3, "appA11yTitle", "appApiAction", "disabled", "click"], ["checkPasswordBtn", ""], ["aria-hidden", "true", 1, "fa", "fa-lg", "fa-check-circle", 3, "hidden"], ["aria-hidden", "true", 1, "fa", "fa-lg", "fa-spinner", "fa-spin", 3, "hidden"], ["type", "button", "appStopClick", "", "appBlurClick", "", 1, "row-btn", 3, "appA11yTitle", "click"], ["aria-hidden", "true", 1, "fa", "fa-lg", 3, "ngClass"], ["aria-hidden", "true", 1, "fa", "fa-lg", "fa-refresh"], ["for", "cardCardholderName"], ["id", "cardCardholderName", "type", "text", "name", "Card.CardCardholderName", 3, "ngModel", "ngModelChange"], ["for", "cardNumber"], ["id", "cardNumber", "name", "Card.Number", "appInputVerbatim", "", 1, "monospaced", 3, "type", "ngModel", "ngModelChange"], ["for", "cardBrand"], ["id", "cardBrand", "name", "Card.Brand", 3, "ngModel", "ngModelChange"], ["for", "cardExpMonth"], ["id", "cardExpMonth", "name", "Card.ExpMonth", 3, "ngModel", "ngModelChange"], ["for", "cardExpYear"], ["id", "cardExpYear", "type", "text", "name", "Card.ExpYear", 3, "ngModel", "placeholder", "ngModelChange"], ["for", "cardCode"], ["id", "cardCode", "name", "Card.Code", "appInputVerbatim", "", 1, "monospaced", 3, "type", "ngModel", "ngModelChange"], ["for", "idTitle"], ["id", "idTitle", "name", "Identity.Title", 3, "ngModel", "ngModelChange"], ["for", "idFirstName"], ["id", "idFirstName", "type", "text", "name", "Identity.FirstName", 3, "ngModel", "ngModelChange"], ["for", "idMiddleName"], ["id", "idMiddleName", "type", "text", "name", "Identity.MiddleName", 3, "ngModel", "ngModelChange"], ["for", "idLastName"], ["id", "idLastName", "type", "text", "name", "Identity.LastName", 3, "ngModel", "ngModelChange"], ["for", "idUsername"], ["id", "idUsername", "type", "text", "name", "Identity.Username", "appInputVerbatim", "", 3, "ngModel", "ngModelChange"], ["for", "idCompany"], ["id", "idCompany", "type", "text", "name", "Identity.Company", 3, "ngModel", "ngModelChange"], ["for", "idSsn"], ["id", "idSsn", "type", "text", "name", "Identity.SSN", "appInputVerbatim", "", 3, "ngModel", "ngModelChange"], ["for", "idPassportNumber"], ["id", "idPassportNumber", "type", "text", "name", "Identity.PassportNumber", "appInputVerbatim", "", 3, "ngModel", "ngModelChange"], ["for", "idLicenseNumber"], ["id", "idLicenseNumber", "type", "text", "name", "Identity.LicenseNumber", "appInputVerbatim", "", 3, "ngModel", "ngModelChange"], ["for", "idEmail"], ["id", "idEmail", "type", "text", "name", "Identity.Email", "appInputVerbatim", "", 3, "ngModel", "ngModelChange"], ["for", "idPhone"], ["id", "idPhone", "type", "text", "name", "Identity.Phone", 3, "ngModel", "ngModelChange"], ["for", "idAddress1"], ["id", "idAddress1", "type", "text", "name", "Identity.Address1", 3, "ngModel", "ngModelChange"], ["for", "idAddress2"], ["id", "idAddress2", "type", "text", "name", "Identity.Address2", 3, "ngModel", "ngModelChange"], ["for", "idAddress3"], ["id", "idAddress3", "type", "text", "name", "Identity.Address3", 3, "ngModel", "ngModelChange"], ["for", "idCity"], ["id", "idCity", "type", "text", "name", "Identity.City", 3, "ngModel", "ngModelChange"], ["for", "idState"], ["id", "idState", "type", "text", "name", "Identity.State", 3, "ngModel", "ngModelChange"], ["for", "idPostalCode"], ["id", "idPostalCode", "type", "text", "name", "Identity.PostalCode", 3, "ngModel", "ngModelChange"], ["for", "idCountry"], ["id", "idCountry", "type", "text", "name", "Identity.Country", 3, "ngModel", "ngModelChange"], ["type", "button", "appStopClick", "", "appBlurClick", "", 1, "box-content-row", "box-content-row-newmulti", 3, "click"], ["aria-hidden", "true", 1, "fa", "fa-plus-circle", "fa-fw", "fa-lg"], ["class", "box-content-row box-content-row-multi", "appBoxRow", "", 4, "ngFor", "ngForOf", "ngForTrackBy"], ["appBoxRow", "", 1, "box-content-row", "box-content-row-multi"], ["type", "button", "appStopClick", "", 3, "appA11yTitle", "click"], ["aria-hidden", "true", 1, "fa", "fa-minus-circle", "fa-lg"], [3, "for"], ["type", "text", "inputmode", "url", "appInputVerbatim", "", 3, "id", "name", "ngModel", "hidden", "placeholder", "ngModelChange"], [1, "sr-only", 3, "for"], [3, "id", "name", "ngModel", "hidden", "ngModelChange", 4, "ngIf"], [3, "id", "name", "ngModel", "hidden", "ngModelChange", "change"], ["aria-hidden", "true", 1, "fa", "fa-lg", "fa-cog"], [3, "id", "name", "ngModel", "hidden", "ngModelChange"], ["aria-hidden", "true", 1, "fa", "fa-lg", "fa-list"], ["for", "autofillOnPageLoad"], ["id", "autofillOnPageLoad", "name", "AutofillOnPageLoad", 3, "ngModel", "ngModelChange"], ["type", "button", "appStopClick", "", "appBlurClick", "", 1, "box-content-row", "box-content-row-flex", "text-default", 3, "click"], ["class", "fa fa-external-link fa-lg fa-fw", "aria-hidden", "true", 4, "ngIf"], ["class", "fa fa-chevron-right row-sub-icon", "aria-hidden", "true", 4, "ngIf"], ["aria-hidden", "true", 1, "fa", "fa-external-link", "fa-lg", "fa-fw"], ["aria-hidden", "true", 1, "fa", "fa-chevron-right", "row-sub-icon"], ["for", "organizationId"], ["id", "organizationId", "name", "OrganizationId", 1, "form-control", 3, "ngModel", "ngModelChange", "change"], ["class", "box-content", 4, "ngIf"], [1, "box-content-row", "padded", "no-hover"], ["class", "box-content-row box-content-row-checkbox", "appBoxRow", "", 4, "ngFor", "ngForOf"], ["type", "checkbox", 3, "id", "ngModel", "name", "ngModelChange"], [1, "box", "list"], [1, "box-content", "single-line"], ["type", "button", "appStopClick", "", "appBlurClick", "", 1, "box-content-row", 3, "appApiAction", "click"], ["deleteBtn", ""], [1, "row-main", "text-danger"], ["aria-hidden", "true", 1, "icon", "text-danger"], [1, "fa", "fa-trash-o", "fa-lg", "fa-fw", 3, "hidden"], [1, "fa", "fa-spinner", "fa-spin", "fa-lg", "fa-fw", 3, "hidden"]], template: function AddEditComponent_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "form", 0, 1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("ngSubmit", function AddEditComponent_Template_form_ngSubmit_0_listener() { return ctx.submit(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](2, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](3, "header");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](4, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](5, "div", 2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](6, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](7, "button", 3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("click", function AddEditComponent_Template_button_click_7_listener() { return ctx.cancel(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](9, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](10, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](11, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](12, "div", 4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](13, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](14, "span", 5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](15);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](16, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](17, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](18, "div", 6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](19, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](20, "button", 7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](21, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](22, "span", 8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](23);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](24, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](25, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](26, "i", 9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](27, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](28, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](29, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](30, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](31, AddEditComponent_content_31_Template, 111, 42, "content", 10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](32, "\n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](33, "\n");
+ } if (rf & 2) {
+ const _r0 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵreference"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("appApiAction", ctx.formPromise);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](9, 8, "cancel"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](ctx.title);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("disabled", _r0.loading);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("hidden", _r0.loading);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](24, 10, "save"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("hidden", !_r0.loading);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx.cipher);
+ } }, directives: [_angular_forms__WEBPACK_IMPORTED_MODULE_22__["ɵangular_packages_forms_forms_ba"], _angular_forms__WEBPACK_IMPORTED_MODULE_22__["NgControlStatusGroup"], _angular_forms__WEBPACK_IMPORTED_MODULE_22__["NgForm"], jslib_angular_directives_api_action_directive__WEBPACK_IMPORTED_MODULE_23__["ApiActionDirective"], jslib_angular_directives_blur_click_directive__WEBPACK_IMPORTED_MODULE_24__["BlurClickDirective"], _angular_common__WEBPACK_IMPORTED_MODULE_0__["NgIf"], jslib_angular_directives_box_row_directive__WEBPACK_IMPORTED_MODULE_25__["BoxRowDirective"], _angular_forms__WEBPACK_IMPORTED_MODULE_22__["DefaultValueAccessor"], _angular_forms__WEBPACK_IMPORTED_MODULE_22__["NgControlStatus"], _angular_forms__WEBPACK_IMPORTED_MODULE_22__["NgModel"], _angular_forms__WEBPACK_IMPORTED_MODULE_22__["SelectControlValueAccessor"], _angular_common__WEBPACK_IMPORTED_MODULE_0__["NgForOf"], _angular_forms__WEBPACK_IMPORTED_MODULE_22__["CheckboxControlValueAccessor"], jslib_angular_directives_a11y_title_directive__WEBPACK_IMPORTED_MODULE_26__["A11yTitleDirective"], _add_edit_custom_fields_component__WEBPACK_IMPORTED_MODULE_27__["AddEditCustomFieldsComponent"], jslib_angular_components_callout_component__WEBPACK_IMPORTED_MODULE_28__["CalloutComponent"], _angular_forms__WEBPACK_IMPORTED_MODULE_22__["NgSelectOption"], _angular_forms__WEBPACK_IMPORTED_MODULE_22__["ɵangular_packages_forms_forms_z"], jslib_angular_directives_input_verbatim_directive__WEBPACK_IMPORTED_MODULE_29__["InputVerbatimDirective"], jslib_angular_directives_stop_click_directive__WEBPACK_IMPORTED_MODULE_30__["StopClickDirective"], _angular_common__WEBPACK_IMPORTED_MODULE_0__["NgClass"]], pipes: [jslib_angular_pipes_i18n_pipe__WEBPACK_IMPORTED_MODULE_31__["I18nPipe"], _angular_common__WEBPACK_IMPORTED_MODULE_0__["DatePipe"]], encapsulation: 2 });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵsetClassMetadata"](AddEditComponent, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Component"],
+ args: [{
+ selector: 'app-vault-add-edit',
+ templateUrl: 'add-edit.component.html',
+ }]
+ }], function () { return [{ type: jslib_common_abstractions_cipher_service__WEBPACK_IMPORTED_MODULE_6__["CipherService"] }, { type: jslib_common_abstractions_folder_service__WEBPACK_IMPORTED_MODULE_9__["FolderService"] }, { type: jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_10__["I18nService"] }, { type: jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_13__["PlatformUtilsService"] }, { type: jslib_common_abstractions_audit_service__WEBPACK_IMPORTED_MODULE_5__["AuditService"] }, { type: jslib_common_abstractions_state_service__WEBPACK_IMPORTED_MODULE_15__["StateService"] }, { type: jslib_common_abstractions_user_service__WEBPACK_IMPORTED_MODULE_17__["UserService"] }, { type: jslib_common_abstractions_collection_service__WEBPACK_IMPORTED_MODULE_7__["CollectionService"] }, { type: jslib_common_abstractions_messaging_service__WEBPACK_IMPORTED_MODULE_12__["MessagingService"] }, { type: _angular_router__WEBPACK_IMPORTED_MODULE_2__["ActivatedRoute"] }, { type: _angular_router__WEBPACK_IMPORTED_MODULE_2__["Router"] }, { type: _angular_common__WEBPACK_IMPORTED_MODULE_0__["Location"] }, { type: jslib_common_abstractions_event_service__WEBPACK_IMPORTED_MODULE_8__["EventService"] }, { type: jslib_common_abstractions_policy_service__WEBPACK_IMPORTED_MODULE_14__["PolicyService"] }, { type: _services_popup_utils_service__WEBPACK_IMPORTED_MODULE_19__["PopupUtilsService"] }, { type: jslib_common_abstractions_storage_service__WEBPACK_IMPORTED_MODULE_16__["StorageService"] }, { type: jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_11__["LogService"] }]; }, null); })();
+
+
+/***/ }),
+
+/***/ "./src/popup/vault/attachments.component.ts":
+/*!**************************************************!*\
+ !*** ./src/popup/vault/attachments.component.ts ***!
+ \**************************************************/
+/*! exports provided: AttachmentsComponent */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AttachmentsComponent", function() { return AttachmentsComponent; });
+/* harmony import */ var _angular_common__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/common */ "./node_modules/@angular/common/__ivy_ngcc__/fesm2015/common.js");
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var _angular_router__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @angular/router */ "./node_modules/@angular/router/__ivy_ngcc__/fesm2015/router.js");
+/* harmony import */ var rxjs_operators__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! rxjs/operators */ "./node_modules/rxjs/_esm5/operators/index.js");
+/* harmony import */ var jslib_common_abstractions_api_service__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! jslib-common/abstractions/api.service */ "./jslib/common/src/abstractions/api.service.ts");
+/* harmony import */ var jslib_common_abstractions_cipher_service__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! jslib-common/abstractions/cipher.service */ "./jslib/common/src/abstractions/cipher.service.ts");
+/* harmony import */ var jslib_common_abstractions_crypto_service__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! jslib-common/abstractions/crypto.service */ "./jslib/common/src/abstractions/crypto.service.ts");
+/* harmony import */ var jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! jslib-common/abstractions/i18n.service */ "./jslib/common/src/abstractions/i18n.service.ts");
+/* harmony import */ var jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! jslib-common/abstractions/log.service */ "./jslib/common/src/abstractions/log.service.ts");
+/* harmony import */ var jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! jslib-common/abstractions/platformUtils.service */ "./jslib/common/src/abstractions/platformUtils.service.ts");
+/* harmony import */ var jslib_common_abstractions_user_service__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! jslib-common/abstractions/user.service */ "./jslib/common/src/abstractions/user.service.ts");
+/* harmony import */ var jslib_angular_components_attachments_component__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! jslib-angular/components/attachments.component */ "./jslib/angular/src/components/attachments.component.ts");
+/* harmony import */ var _angular_forms__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @angular/forms */ "./node_modules/@angular/forms/__ivy_ngcc__/fesm2015/forms.js");
+/* harmony import */ var jslib_angular_directives_api_action_directive__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! jslib-angular/directives/api-action.directive */ "./jslib/angular/src/directives/api-action.directive.ts");
+/* harmony import */ var jslib_angular_directives_blur_click_directive__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! jslib-angular/directives/blur-click.directive */ "./jslib/angular/src/directives/blur-click.directive.ts");
+/* harmony import */ var jslib_angular_directives_stop_click_directive__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! jslib-angular/directives/stop-click.directive */ "./jslib/angular/src/directives/stop-click.directive.ts");
+/* harmony import */ var jslib_angular_directives_a11y_title_directive__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! jslib-angular/directives/a11y-title.directive */ "./jslib/angular/src/directives/a11y-title.directive.ts");
+/* harmony import */ var jslib_angular_pipes_i18n_pipe__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! jslib-angular/pipes/i18n.pipe */ "./jslib/angular/src/pipes/i18n.pipe.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+function AttachmentsComponent_button_7_Template(rf, ctx) { if (rf & 1) {
+ const _r5 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "button", 18);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("click", function AttachmentsComponent_button_7_Template_button_click_0_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r5); const ctx_r4 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](); return ctx_r4.close(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](2, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate1"]("\n ", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](2, 1, "close"), "\n ");
+} }
+function AttachmentsComponent_button_9_Template(rf, ctx) { if (rf & 1) {
+ const _r7 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "button", 18);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("click", function AttachmentsComponent_button_9_Template_button_click_0_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r7); const ctx_r6 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](); return ctx_r6.back(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "span", 19);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](3, "i", 20);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](4, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](5, "span");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](7, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](8, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](7, 1, "back"));
+} }
+function AttachmentsComponent_div_34_div_4_Template(rf, ctx) { if (rf & 1) {
+ const _r12 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "div", 22);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "div", 23);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](4, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](5, "small", 24);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](8, "div", 25);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](9, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](10, "button", 26, 27);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("click", function AttachmentsComponent_div_34_div_4_Template_button_click_10_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r12); const a_r9 = ctx.$implicit; const ctx_r11 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](2); return ctx_r11.delete(a_r9); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](12, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](13, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](14, "i", 28);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](15, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](16, "i", 29);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](17, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](18, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](19, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const a_r9 = ctx.$implicit;
+ const _r10 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵreference"](11);
+ const ctx_r8 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate1"]("\n ", a_r9.fileName, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](a_r9.sizeName);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpropertyInterpolate"]("appA11yTitle", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](12, 7, "deleteAttachment"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("appApiAction", ctx_r8.deletePromises[a_r9.id])("disabled", _r10.loading);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("hidden", _r10.loading);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("hidden", !_r10.loading);
+} }
+function AttachmentsComponent_div_34_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "div", 11);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "div", 13);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](4, AttachmentsComponent_div_34_div_4_Template, 20, 9, "div", 21);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](6, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r3 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngForOf", ctx_r3.cipher.attachments);
+} }
+class AttachmentsComponent extends jslib_angular_components_attachments_component__WEBPACK_IMPORTED_MODULE_11__["AttachmentsComponent"] {
+ constructor(cipherService, i18nService, cryptoService, userService, platformUtilsService, apiService, location, route, logService) {
+ super(cipherService, i18nService, cryptoService, userService, platformUtilsService, apiService, window, logService);
+ this.location = location;
+ this.route = route;
+ }
+ ngOnInit() {
+ return __awaiter(this, void 0, void 0, function* () {
+ this.route.queryParams.pipe(Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_3__["first"])()).subscribe((params) => __awaiter(this, void 0, void 0, function* () {
+ this.cipherId = params.cipherId;
+ yield this.init();
+ }));
+ this.openedAttachmentsInPopup = history.length === 1;
+ });
+ }
+ back() {
+ this.location.back();
+ }
+ close() {
+ window.close();
+ }
+}
+AttachmentsComponent.ɵfac = function AttachmentsComponent_Factory(t) { return new (t || AttachmentsComponent)(_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](jslib_common_abstractions_cipher_service__WEBPACK_IMPORTED_MODULE_5__["CipherService"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_7__["I18nService"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](jslib_common_abstractions_crypto_service__WEBPACK_IMPORTED_MODULE_6__["CryptoService"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](jslib_common_abstractions_user_service__WEBPACK_IMPORTED_MODULE_10__["UserService"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_9__["PlatformUtilsService"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](jslib_common_abstractions_api_service__WEBPACK_IMPORTED_MODULE_4__["ApiService"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](_angular_common__WEBPACK_IMPORTED_MODULE_0__["Location"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](_angular_router__WEBPACK_IMPORTED_MODULE_2__["ActivatedRoute"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_8__["LogService"])); };
+AttachmentsComponent.ɵcmp = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdefineComponent"]({ type: AttachmentsComponent, selectors: [["app-vault-attachments"]], features: [_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵInheritDefinitionFeature"]], decls: 61, vars: 22, consts: [[3, "appApiAction", "ngSubmit"], ["form", ""], [1, "left"], ["type", "button", "appBlurClick", "", 3, "click", 4, "ngIf"], [1, "center"], [1, "title"], [1, "right"], ["type", "submit", "appBlurClick", "", 3, "disabled"], [3, "hidden"], ["aria-hidden", "true", 1, "fa", "fa-spinner", "fa-lg", "fa-spin", 3, "hidden"], ["class", "box", 4, "ngIf"], [1, "box"], [1, "box-header"], [1, "box-content", "no-hover"], [1, "box-content-row"], ["for", "file"], ["type", "file", "id", "file", "name", "file", "required", ""], [1, "box-footer"], ["type", "button", "appBlurClick", "", 3, "click"], [1, "header-icon"], ["aria-hidden", "true", 1, "fa", "fa-chevron-left"], ["class", "box-content-row box-content-row-flex", 4, "ngFor", "ngForOf"], [1, "box-content-row", "box-content-row-flex"], [1, "row-main"], [1, "row-sub-label"], [1, "action-buttons", "no-pad"], ["type", "button", "type", "button", "appStopClick", "", "appBlurClick", "", 1, "row-btn", "btn", 3, "appA11yTitle", "appApiAction", "disabled", "click"], ["deleteBtn", ""], ["aria-hidden", "true", 1, "fa", "fa-trash-o", "fa-lg", "fa-fw", 3, "hidden"], ["aria-hidden", "true", 1, "fa", "fa-spinner", "fa-spin", "fa-lg", "fa-fw", 3, "hidden"]], template: function AttachmentsComponent_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "form", 0, 1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("ngSubmit", function AttachmentsComponent_Template_form_ngSubmit_0_listener() { return ctx.submit(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](2, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](3, "header");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](4, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](5, "div", 2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](6, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](7, AttachmentsComponent_button_7_Template, 3, 3, "button", 3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](8, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](9, AttachmentsComponent_button_9_Template, 9, 3, "button", 3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](10, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](11, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](12, "div", 4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](13, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](14, "span", 5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](15);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](16, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](17, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](18, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](19, "div", 6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](20, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](21, "button", 7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](22, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](23, "span", 8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](24);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](25, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](26, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](27, "i", 9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](28, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](29, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](30, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](31, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](32, "content");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](33, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](34, AttachmentsComponent_div_34_Template, 7, 1, "div", 10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](35, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](36, "div", 11);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](37, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](38, "div", 12);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](39);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](40, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](41, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](42, "div", 13);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](43, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](44, "div", 14);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](45, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](46, "label", 15);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](47);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](48, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](49, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](50, "input", 16);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](51, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](52, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](53, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](54, "div", 17);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](55);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](56, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](57, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](58, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](59, "\n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](60, "\n");
+ } if (rf & 2) {
+ const _r0 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵreference"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("appApiAction", ctx.formPromise);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx.openedAttachmentsInPopup);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", !ctx.openedAttachmentsInPopup);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](16, 12, "attachments"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("disabled", _r0.loading);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("hidden", _r0.loading);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](25, 14, "save"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("hidden", !_r0.loading);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx.cipher && ctx.cipher.hasAttachments);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate1"]("\n ", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](40, 16, "newAttachment"), "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](48, 18, "file"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate1"]("\n ", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](56, 20, "maxFileSize"), "\n ");
+ } }, directives: [_angular_forms__WEBPACK_IMPORTED_MODULE_12__["ɵangular_packages_forms_forms_ba"], _angular_forms__WEBPACK_IMPORTED_MODULE_12__["NgControlStatusGroup"], _angular_forms__WEBPACK_IMPORTED_MODULE_12__["NgForm"], jslib_angular_directives_api_action_directive__WEBPACK_IMPORTED_MODULE_13__["ApiActionDirective"], _angular_common__WEBPACK_IMPORTED_MODULE_0__["NgIf"], jslib_angular_directives_blur_click_directive__WEBPACK_IMPORTED_MODULE_14__["BlurClickDirective"], _angular_common__WEBPACK_IMPORTED_MODULE_0__["NgForOf"], jslib_angular_directives_stop_click_directive__WEBPACK_IMPORTED_MODULE_15__["StopClickDirective"], jslib_angular_directives_a11y_title_directive__WEBPACK_IMPORTED_MODULE_16__["A11yTitleDirective"]], pipes: [jslib_angular_pipes_i18n_pipe__WEBPACK_IMPORTED_MODULE_17__["I18nPipe"]], encapsulation: 2 });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵsetClassMetadata"](AttachmentsComponent, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Component"],
+ args: [{
+ selector: 'app-vault-attachments',
+ templateUrl: 'attachments.component.html',
+ }]
+ }], function () { return [{ type: jslib_common_abstractions_cipher_service__WEBPACK_IMPORTED_MODULE_5__["CipherService"] }, { type: jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_7__["I18nService"] }, { type: jslib_common_abstractions_crypto_service__WEBPACK_IMPORTED_MODULE_6__["CryptoService"] }, { type: jslib_common_abstractions_user_service__WEBPACK_IMPORTED_MODULE_10__["UserService"] }, { type: jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_9__["PlatformUtilsService"] }, { type: jslib_common_abstractions_api_service__WEBPACK_IMPORTED_MODULE_4__["ApiService"] }, { type: _angular_common__WEBPACK_IMPORTED_MODULE_0__["Location"] }, { type: _angular_router__WEBPACK_IMPORTED_MODULE_2__["ActivatedRoute"] }, { type: jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_8__["LogService"] }]; }, null); })();
+
+
+/***/ }),
+
+/***/ "./src/popup/vault/ciphers.component.ts":
+/*!**********************************************!*\
+ !*** ./src/popup/vault/ciphers.component.ts ***!
+ \**********************************************/
+/*! exports provided: CiphersComponent */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CiphersComponent", function() { return CiphersComponent; });
+/* harmony import */ var _angular_common__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/common */ "./node_modules/@angular/common/__ivy_ngcc__/fesm2015/common.js");
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var _angular_router__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @angular/router */ "./node_modules/@angular/router/__ivy_ngcc__/fesm2015/router.js");
+/* harmony import */ var rxjs_operators__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! rxjs/operators */ "./node_modules/rxjs/_esm5/operators/index.js");
+/* harmony import */ var _browser_browserApi__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../browser/browserApi */ "./src/browser/browserApi.ts");
+/* harmony import */ var jslib_common_abstractions_cipher_service__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! jslib-common/abstractions/cipher.service */ "./jslib/common/src/abstractions/cipher.service.ts");
+/* harmony import */ var jslib_common_abstractions_collection_service__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! jslib-common/abstractions/collection.service */ "./jslib/common/src/abstractions/collection.service.ts");
+/* harmony import */ var jslib_common_abstractions_folder_service__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! jslib-common/abstractions/folder.service */ "./jslib/common/src/abstractions/folder.service.ts");
+/* harmony import */ var jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! jslib-common/abstractions/i18n.service */ "./jslib/common/src/abstractions/i18n.service.ts");
+/* harmony import */ var jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! jslib-common/abstractions/platformUtils.service */ "./jslib/common/src/abstractions/platformUtils.service.ts");
+/* harmony import */ var jslib_common_abstractions_search_service__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! jslib-common/abstractions/search.service */ "./jslib/common/src/abstractions/search.service.ts");
+/* harmony import */ var jslib_common_abstractions_state_service__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! jslib-common/abstractions/state.service */ "./jslib/common/src/abstractions/state.service.ts");
+/* harmony import */ var jslib_common_enums_cipherType__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! jslib-common/enums/cipherType */ "./jslib/common/src/enums/cipherType.ts");
+/* harmony import */ var jslib_angular_services_broadcaster_service__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! jslib-angular/services/broadcaster.service */ "./jslib/angular/src/services/broadcaster.service.ts");
+/* harmony import */ var jslib_angular_components_ciphers_component__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! jslib-angular/components/ciphers.component */ "./jslib/angular/src/components/ciphers.component.ts");
+/* harmony import */ var _services_popup_utils_service__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../services/popup-utils.service */ "./src/popup/services/popup-utils.service.ts");
+/* harmony import */ var jslib_angular_directives_blur_click_directive__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! jslib-angular/directives/blur-click.directive */ "./jslib/angular/src/directives/blur-click.directive.ts");
+/* harmony import */ var _angular_forms__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @angular/forms */ "./node_modules/@angular/forms/__ivy_ngcc__/fesm2015/forms.js");
+/* harmony import */ var jslib_angular_directives_autofocus_directive__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! jslib-angular/directives/autofocus.directive */ "./jslib/angular/src/directives/autofocus.directive.ts");
+/* harmony import */ var jslib_angular_directives_a11y_title_directive__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! jslib-angular/directives/a11y-title.directive */ "./jslib/angular/src/directives/a11y-title.directive.ts");
+/* harmony import */ var jslib_angular_directives_stop_click_directive__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! jslib-angular/directives/stop-click.directive */ "./jslib/angular/src/directives/stop-click.directive.ts");
+/* harmony import */ var _angular_cdk_scrolling__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! @angular/cdk/scrolling */ "./node_modules/@angular/cdk/__ivy_ngcc__/fesm2015/scrolling.js");
+/* harmony import */ var jslib_angular_directives_cipherListVirtualScroll_directive__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! jslib-angular/directives/cipherListVirtualScroll.directive */ "./jslib/angular/src/directives/cipherListVirtualScroll.directive.ts");
+/* harmony import */ var _components_cipher_row_component__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ../components/cipher-row.component */ "./src/popup/components/cipher-row.component.ts");
+/* harmony import */ var jslib_angular_pipes_i18n_pipe__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! jslib-angular/pipes/i18n.pipe */ "./jslib/angular/src/pipes/i18n.pipe.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+const _c0 = function (a0, a1) { return { "fa-folder-open": a0, "fa-folder-open-o": a1 }; };
+function CiphersComponent_ng_container_35_div_2_button_8_Template(rf, ctx) { if (rf & 1) {
+ const _r7 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "button", 17);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("click", function CiphersComponent_ng_container_35_div_2_button_8_Template_button_click_0_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r7); const f_r5 = ctx.$implicit; const ctx_r6 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](3); return ctx_r6.selectFolder(f_r5.node); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "div", 18);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](4, "div", 19);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](6, "i", 20);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](8, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](9, "span", 21);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](11, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](12, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](13, "span");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](14, "i", 22);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](15, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const f_r5 = ctx.$implicit;
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngClass", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpureFunction2"](2, _c0, f_r5.node.id, !f_r5.node.id));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](f_r5.node.name);
+} }
+function CiphersComponent_ng_container_35_div_2_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "div", 13);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "div", 14);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](4, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](6, "div", 15);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](8, CiphersComponent_ng_container_35_div_2_button_8_Template, 16, 5, "button", 16);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](9, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](10, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r2 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate1"]("\n ", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](4, 2, "folders"), "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngForOf", ctx_r2.nestedFolders);
+} }
+function CiphersComponent_ng_container_35_div_4_button_8_Template(rf, ctx) { if (rf & 1) {
+ const _r11 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "button", 17);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("click", function CiphersComponent_ng_container_35_div_4_button_8_Template_button_click_0_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r11); const c_r9 = ctx.$implicit; const ctx_r10 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](3); return ctx_r10.selectCollection(c_r9.node); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "div", 18);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](4, "div", 19);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](5, "i", 23);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](6, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](7, "span", 21);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](9, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](10, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](11, "span");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](12, "i", 22);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](13, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const c_r9 = ctx.$implicit;
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](c_r9.node.name);
+} }
+function CiphersComponent_ng_container_35_div_4_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "div", 13);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "div", 14);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](4, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](6, "div", 15);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](8, CiphersComponent_ng_container_35_div_4_button_8_Template, 14, 1, "button", 16);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](9, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](10, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r3 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate1"]("\n ", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](4, 2, "collections"), "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngForOf", ctx_r3.nestedCollections);
+} }
+function CiphersComponent_ng_container_35_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementContainerStart"](0);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](2, CiphersComponent_ng_container_35_div_2_Template, 11, 4, "div", 12);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](4, CiphersComponent_ng_container_35_div_4_Template, 11, 4, "div", 12);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementContainerEnd"]();
+} if (rf & 2) {
+ const ctx_r0 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx_r0.nestedFolders && ctx_r0.nestedFolders.length);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx_r0.nestedCollections && ctx_r0.nestedCollections.length);
+} }
+function CiphersComponent_ng_container_37_div_2_i_2_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](0, "i", 28);
+} }
+function CiphersComponent_ng_container_37_div_2_ng_container_4_Template(rf, ctx) { if (rf & 1) {
+ const _r17 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementContainerStart"](0);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "p");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](4, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](6, "button", 29);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("click", function CiphersComponent_ng_container_37_div_2_ng_container_4_Template_button_click_6_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r17); const ctx_r16 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](3); return ctx_r16.addCipher(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](8, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](9, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementContainerEnd"]();
+} if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](4, 2, "noItemsInList"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate1"]("\n ", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](8, 4, "addItem"), "\n ");
+} }
+function CiphersComponent_ng_container_37_div_2_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "div", 26);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](2, CiphersComponent_ng_container_37_div_2_i_2_Template, 1, 0, "i", 27);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](4, CiphersComponent_ng_container_37_div_2_ng_container_4_Template, 10, 6, "ng-container", 11);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r12 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", !ctx_r12.loaded);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx_r12.loaded);
+} }
+function CiphersComponent_ng_container_37_cdk_virtual_scroll_viewport_4_app_cipher_row_13_Template(rf, ctx) { if (rf & 1) {
+ const _r22 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "app-cipher-row", 36);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("onSelected", function CiphersComponent_ng_container_37_cdk_virtual_scroll_viewport_4_app_cipher_row_13_Template_app_cipher_row_onSelected_0_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r22); const ctx_r21 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](3); return ctx_r21.selectCipher($event); })("launchEvent", function CiphersComponent_ng_container_37_cdk_virtual_scroll_viewport_4_app_cipher_row_13_Template_app_cipher_row_launchEvent_0_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r22); const ctx_r23 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](3); return ctx_r23.launchCipher($event); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](1, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const c_r20 = ctx.$implicit;
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpropertyInterpolate"]("title", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](1, 2, "viewItem"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("cipher", c_r20);
+} }
+function CiphersComponent_ng_container_37_cdk_virtual_scroll_viewport_4_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "cdk-virtual-scroll-viewport", 30, 31);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](2, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](3, "div", 32);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](4, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](5, "div", 14);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](7, "span", 33);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](9, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](10, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](11, "div", 34);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](12, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](13, CiphersComponent_ng_container_37_cdk_virtual_scroll_viewport_4_app_cipher_row_13_Template, 2, 4, "app-cipher-row", 35);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](14, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](15, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](16, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r13 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate1"]("\n ", ctx_r13.groupingTitle, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](ctx_r13.isSearching() ? ctx_r13.ciphers.length : ctx_r13.ciphers.length);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("cdkVirtualForOf", ctx_r13.ciphers);
+} }
+function CiphersComponent_ng_container_37_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementContainerStart"](0);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](2, CiphersComponent_ng_container_37_div_2_Template, 6, 2, "div", 24);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](4, CiphersComponent_ng_container_37_cdk_virtual_scroll_viewport_4_Template, 17, 3, "cdk-virtual-scroll-viewport", 25);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementContainerEnd"]();
+} if (rf & 2) {
+ const ctx_r1 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", !ctx_r1.ciphers.length);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx_r1.ciphers.length);
+} }
+const _c1 = function (a0) { return { "stacked-boxes": a0 }; };
+const ComponentId = 'CiphersComponent';
+class CiphersComponent extends jslib_angular_components_ciphers_component__WEBPACK_IMPORTED_MODULE_14__["CiphersComponent"] {
+ constructor(searchService, route, router, location, ngZone, broadcasterService, changeDetectorRef, stateService, popupUtils, i18nService, folderService, collectionService, platformUtilsService, cipherService) {
+ super(searchService);
+ this.route = route;
+ this.router = router;
+ this.location = location;
+ this.ngZone = ngZone;
+ this.broadcasterService = broadcasterService;
+ this.changeDetectorRef = changeDetectorRef;
+ this.stateService = stateService;
+ this.popupUtils = popupUtils;
+ this.i18nService = i18nService;
+ this.folderService = folderService;
+ this.collectionService = collectionService;
+ this.platformUtilsService = platformUtilsService;
+ this.cipherService = cipherService;
+ this.folderId = null;
+ this.collectionId = null;
+ this.type = null;
+ this.searchTypeSearch = false;
+ this.preventSelected = false;
+ this.applySavedState = true;
+ this.scrollingContainer = 'cdk-virtual-scroll-viewport';
+ this.applySavedState = window.previousPopupUrl != null &&
+ !window.previousPopupUrl.startsWith('/ciphers');
+ }
+ ngOnInit() {
+ return __awaiter(this, void 0, void 0, function* () {
+ this.searchTypeSearch = !this.platformUtilsService.isSafari();
+ this.route.queryParams.pipe(Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_3__["first"])()).subscribe((params) => __awaiter(this, void 0, void 0, function* () {
+ if (this.applySavedState) {
+ this.state = (yield this.stateService.get(ComponentId)) || {};
+ if (this.state.searchText) {
+ this.searchText = this.state.searchText;
+ }
+ }
+ if (params.deleted) {
+ this.groupingTitle = this.i18nService.t('trash');
+ this.searchPlaceholder = this.i18nService.t('searchTrash');
+ yield this.load(null, true);
+ }
+ else if (params.type) {
+ this.searchPlaceholder = this.i18nService.t('searchType');
+ this.type = parseInt(params.type, null);
+ switch (this.type) {
+ case jslib_common_enums_cipherType__WEBPACK_IMPORTED_MODULE_12__["CipherType"].Login:
+ this.groupingTitle = this.i18nService.t('logins');
+ break;
+ case jslib_common_enums_cipherType__WEBPACK_IMPORTED_MODULE_12__["CipherType"].Card:
+ this.groupingTitle = this.i18nService.t('cards');
+ break;
+ case jslib_common_enums_cipherType__WEBPACK_IMPORTED_MODULE_12__["CipherType"].Identity:
+ this.groupingTitle = this.i18nService.t('identities');
+ break;
+ case jslib_common_enums_cipherType__WEBPACK_IMPORTED_MODULE_12__["CipherType"].SecureNote:
+ this.groupingTitle = this.i18nService.t('secureNotes');
+ break;
+ default:
+ break;
+ }
+ yield this.load(c => c.type === this.type);
+ }
+ else if (params.folderId) {
+ this.folderId = params.folderId === 'none' ? null : params.folderId;
+ this.searchPlaceholder = this.i18nService.t('searchFolder');
+ if (this.folderId != null) {
+ const folderNode = yield this.folderService.getNested(this.folderId);
+ if (folderNode != null && folderNode.node != null) {
+ this.groupingTitle = folderNode.node.name;
+ this.nestedFolders = folderNode.children != null && folderNode.children.length > 0 ?
+ folderNode.children : null;
+ }
+ }
+ else {
+ this.groupingTitle = this.i18nService.t('noneFolder');
+ }
+ yield this.load(c => c.folderId === this.folderId);
+ }
+ else if (params.collectionId) {
+ this.collectionId = params.collectionId;
+ this.searchPlaceholder = this.i18nService.t('searchCollection');
+ const collectionNode = yield this.collectionService.getNested(this.collectionId);
+ if (collectionNode != null && collectionNode.node != null) {
+ this.groupingTitle = collectionNode.node.name;
+ this.nestedCollections = collectionNode.children != null && collectionNode.children.length > 0 ?
+ collectionNode.children : null;
+ }
+ yield this.load(c => c.collectionIds != null && c.collectionIds.indexOf(this.collectionId) > -1);
+ }
+ else {
+ this.groupingTitle = this.i18nService.t('allItems');
+ yield this.load();
+ }
+ if (this.applySavedState && this.state != null) {
+ window.setTimeout(() => this.popupUtils.setContentScrollY(window, this.state.scrollY, this.scrollingContainer), 0);
+ }
+ this.stateService.remove(ComponentId);
+ }));
+ this.broadcasterService.subscribe(ComponentId, (message) => {
+ this.ngZone.run(() => __awaiter(this, void 0, void 0, function* () {
+ switch (message.command) {
+ case 'syncCompleted':
+ if (message.successfully) {
+ window.setTimeout(() => {
+ this.refresh();
+ }, 500);
+ }
+ break;
+ default:
+ break;
+ }
+ this.changeDetectorRef.detectChanges();
+ }));
+ });
+ });
+ }
+ ngOnDestroy() {
+ this.saveState();
+ this.broadcasterService.unsubscribe(ComponentId);
+ }
+ selectCipher(cipher) {
+ this.selectedTimeout = window.setTimeout(() => {
+ if (!this.preventSelected) {
+ super.selectCipher(cipher);
+ this.router.navigate(['/view-cipher'], { queryParams: { cipherId: cipher.id } });
+ }
+ this.preventSelected = false;
+ }, 200);
+ }
+ selectFolder(folder) {
+ if (folder.id != null) {
+ this.router.navigate(['/ciphers'], { queryParams: { folderId: folder.id } });
+ }
+ }
+ selectCollection(collection) {
+ this.router.navigate(['/ciphers'], { queryParams: { collectionId: collection.id } });
+ }
+ launchCipher(cipher) {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (cipher.type !== jslib_common_enums_cipherType__WEBPACK_IMPORTED_MODULE_12__["CipherType"].Login || !cipher.login.canLaunch) {
+ return;
+ }
+ if (this.selectedTimeout != null) {
+ window.clearTimeout(this.selectedTimeout);
+ }
+ this.preventSelected = true;
+ yield this.cipherService.updateLastLaunchedDate(cipher.id);
+ _browser_browserApi__WEBPACK_IMPORTED_MODULE_4__["BrowserApi"].createNewTab(cipher.login.launchUri);
+ if (this.popupUtils.inPopup(window)) {
+ _browser_browserApi__WEBPACK_IMPORTED_MODULE_4__["BrowserApi"].closePopup(window);
+ }
+ });
+ }
+ addCipher() {
+ if (this.deleted) {
+ return false;
+ }
+ super.addCipher();
+ this.router.navigate(['/add-cipher'], {
+ queryParams: {
+ folderId: this.folderId,
+ type: this.type,
+ collectionId: this.collectionId,
+ },
+ });
+ }
+ back() {
+ window.routeDirection = 'b';
+ this.location.back();
+ }
+ showGroupings() {
+ return !this.isSearching() &&
+ ((this.nestedFolders && this.nestedFolders.length) ||
+ (this.nestedCollections && this.nestedCollections.length));
+ }
+ saveState() {
+ return __awaiter(this, void 0, void 0, function* () {
+ this.state = {
+ scrollY: this.popupUtils.getContentScrollY(window, this.scrollingContainer),
+ searchText: this.searchText,
+ };
+ yield this.stateService.save(ComponentId, this.state);
+ });
+ }
+}
+CiphersComponent.ɵfac = function CiphersComponent_Factory(t) { return new (t || CiphersComponent)(_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](jslib_common_abstractions_search_service__WEBPACK_IMPORTED_MODULE_10__["SearchService"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](_angular_router__WEBPACK_IMPORTED_MODULE_2__["ActivatedRoute"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](_angular_router__WEBPACK_IMPORTED_MODULE_2__["Router"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](_angular_common__WEBPACK_IMPORTED_MODULE_0__["Location"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["NgZone"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](jslib_angular_services_broadcaster_service__WEBPACK_IMPORTED_MODULE_13__["BroadcasterService"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ChangeDetectorRef"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](jslib_common_abstractions_state_service__WEBPACK_IMPORTED_MODULE_11__["StateService"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](_services_popup_utils_service__WEBPACK_IMPORTED_MODULE_15__["PopupUtilsService"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_8__["I18nService"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](jslib_common_abstractions_folder_service__WEBPACK_IMPORTED_MODULE_7__["FolderService"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](jslib_common_abstractions_collection_service__WEBPACK_IMPORTED_MODULE_6__["CollectionService"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_9__["PlatformUtilsService"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](jslib_common_abstractions_cipher_service__WEBPACK_IMPORTED_MODULE_5__["CipherService"])); };
+CiphersComponent.ɵcmp = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdefineComponent"]({ type: CiphersComponent, selectors: [["app-vault-ciphers"]], features: [_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵInheritDefinitionFeature"]], decls: 40, vars: 16, consts: [[1, "left"], ["type", "button", "appBlurClick", "", 3, "click"], [1, "header-icon"], ["aria-hidden", "true", 1, "fa", "fa-chevron-left"], [1, "search"], ["id", "search", "autocomplete", "off", "appAutofocus", "", 3, "type", "placeholder", "ngModel", "ngModelChange", "input"], ["aria-hidden", "true", 1, "fa", "fa-search"], [1, "right"], ["type", "button", "appBlurClick", "", 3, "appA11yTitle", "click"], ["aria-hidden", "true", 1, "fa", "fa-plus", "fa-lg", "fa-fw"], [3, "ngClass"], [4, "ngIf"], ["class", "box list", 4, "ngIf"], [1, "box", "list"], [1, "box-header"], [1, "box-content", "single-line"], ["type", "button", "class", "box-content-row", "appStopClick", "", "appBlurClick", "", 3, "click", 4, "ngFor", "ngForOf"], ["type", "button", "appStopClick", "", "appBlurClick", "", 1, "box-content-row", 3, "click"], [1, "row-main"], [1, "icon"], ["aria-hidden", "true", 1, "fa", "fa-fw", "fa-lg", 3, "ngClass"], [1, "text"], ["aria-hidden", "true", 1, "fa", "fa-chevron-right", "fa-lg", "row-sub-icon"], ["aria-hidden", "true", 1, "fa", "fa-fw", "fa-lg", "fa-cube"], ["class", "no-items", 4, "ngIf"], ["itemSize", "46", "minBufferPx", "400", "maxBufferPx", "600", 4, "ngIf"], [1, "no-items"], ["class", "fa fa-spinner fa-spin fa-3x", "aria-hidden", "true", 4, "ngIf"], ["aria-hidden", "true", 1, "fa", "fa-spinner", "fa-spin", "fa-3x"], ["type", "button", 1, "btn", "block", "primary", "link", 3, "click"], ["itemSize", "46", "minBufferPx", "400", "maxBufferPx", "600"], ["virtualScrollViewport", ""], [1, "box", "list", "only-list"], [1, "flex-right"], [1, "box-content"], [3, "cipher", "title", "onSelected", "launchEvent", 4, "cdkVirtualFor", "cdkVirtualForOf"], [3, "cipher", "title", "onSelected", "launchEvent"]], template: function CiphersComponent_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "header");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "div", 0);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](4, "button", 1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("click", function CiphersComponent_Template_button_click_4_listener() { return ctx.back(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](6, "span", 2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](7, "i", 3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](8, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](9, "span");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](11, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](12, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](13, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](14, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](15, "div", 4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](16, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](17, "input", 5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("ngModelChange", function CiphersComponent_Template_input_ngModelChange_17_listener($event) { return ctx.searchText = $event; })("input", function CiphersComponent_Template_input_input_17_listener() { return ctx.search(200); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](18, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](19, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](20, "i", 6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](21, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](22, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](23, "div", 7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](24, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](25, "button", 8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("click", function CiphersComponent_Template_button_click_25_listener() { return ctx.addCipher(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](26, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](27, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](28, "i", 9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](29, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](30, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](31, "\n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](32, "\n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](33, "content", 10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](34, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](35, CiphersComponent_ng_container_35_Template, 6, 2, "ng-container", 11);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](36, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](37, CiphersComponent_ng_container_37_Template, 6, 2, "ng-container", 11);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](38, "\n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](39, "\n");
+ } if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](11, 8, "back"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpropertyInterpolate"]("type", ctx.searchTypeSearch ? "search" : "text");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpropertyInterpolate"]("placeholder", ctx.searchPlaceholder || _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](18, 10, "searchVault"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngModel", ctx.searchText);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpropertyInterpolate"]("appA11yTitle", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](26, 12, "addItem"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngClass", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpureFunction1"](14, _c1, ctx.showGroupings()));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx.showGroupings());
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx.ciphers);
+ } }, directives: [jslib_angular_directives_blur_click_directive__WEBPACK_IMPORTED_MODULE_16__["BlurClickDirective"], _angular_forms__WEBPACK_IMPORTED_MODULE_17__["DefaultValueAccessor"], jslib_angular_directives_autofocus_directive__WEBPACK_IMPORTED_MODULE_18__["AutofocusDirective"], _angular_forms__WEBPACK_IMPORTED_MODULE_17__["NgControlStatus"], _angular_forms__WEBPACK_IMPORTED_MODULE_17__["NgModel"], jslib_angular_directives_a11y_title_directive__WEBPACK_IMPORTED_MODULE_19__["A11yTitleDirective"], _angular_common__WEBPACK_IMPORTED_MODULE_0__["NgClass"], _angular_common__WEBPACK_IMPORTED_MODULE_0__["NgIf"], _angular_common__WEBPACK_IMPORTED_MODULE_0__["NgForOf"], jslib_angular_directives_stop_click_directive__WEBPACK_IMPORTED_MODULE_20__["StopClickDirective"], _angular_cdk_scrolling__WEBPACK_IMPORTED_MODULE_21__["CdkVirtualScrollViewport"], _angular_cdk_scrolling__WEBPACK_IMPORTED_MODULE_21__["CdkFixedSizeVirtualScroll"], jslib_angular_directives_cipherListVirtualScroll_directive__WEBPACK_IMPORTED_MODULE_22__["CipherListVirtualScroll"], _angular_cdk_scrolling__WEBPACK_IMPORTED_MODULE_21__["CdkVirtualForOf"], _components_cipher_row_component__WEBPACK_IMPORTED_MODULE_23__["CipherRowComponent"]], pipes: [jslib_angular_pipes_i18n_pipe__WEBPACK_IMPORTED_MODULE_24__["I18nPipe"]], encapsulation: 2 });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵsetClassMetadata"](CiphersComponent, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Component"],
+ args: [{
+ selector: 'app-vault-ciphers',
+ templateUrl: 'ciphers.component.html',
+ }]
+ }], function () { return [{ type: jslib_common_abstractions_search_service__WEBPACK_IMPORTED_MODULE_10__["SearchService"] }, { type: _angular_router__WEBPACK_IMPORTED_MODULE_2__["ActivatedRoute"] }, { type: _angular_router__WEBPACK_IMPORTED_MODULE_2__["Router"] }, { type: _angular_common__WEBPACK_IMPORTED_MODULE_0__["Location"] }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["NgZone"] }, { type: jslib_angular_services_broadcaster_service__WEBPACK_IMPORTED_MODULE_13__["BroadcasterService"] }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["ChangeDetectorRef"] }, { type: jslib_common_abstractions_state_service__WEBPACK_IMPORTED_MODULE_11__["StateService"] }, { type: _services_popup_utils_service__WEBPACK_IMPORTED_MODULE_15__["PopupUtilsService"] }, { type: jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_8__["I18nService"] }, { type: jslib_common_abstractions_folder_service__WEBPACK_IMPORTED_MODULE_7__["FolderService"] }, { type: jslib_common_abstractions_collection_service__WEBPACK_IMPORTED_MODULE_6__["CollectionService"] }, { type: jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_9__["PlatformUtilsService"] }, { type: jslib_common_abstractions_cipher_service__WEBPACK_IMPORTED_MODULE_5__["CipherService"] }]; }, null); })();
+
+
+/***/ }),
+
+/***/ "./src/popup/vault/collections.component.ts":
+/*!**************************************************!*\
+ !*** ./src/popup/vault/collections.component.ts ***!
+ \**************************************************/
+/*! exports provided: CollectionsComponent */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CollectionsComponent", function() { return CollectionsComponent; });
+/* harmony import */ var _angular_common__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/common */ "./node_modules/@angular/common/__ivy_ngcc__/fesm2015/common.js");
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var _angular_router__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @angular/router */ "./node_modules/@angular/router/__ivy_ngcc__/fesm2015/router.js");
+/* harmony import */ var rxjs_operators__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! rxjs/operators */ "./node_modules/rxjs/_esm5/operators/index.js");
+/* harmony import */ var jslib_common_abstractions_cipher_service__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! jslib-common/abstractions/cipher.service */ "./jslib/common/src/abstractions/cipher.service.ts");
+/* harmony import */ var jslib_common_abstractions_collection_service__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! jslib-common/abstractions/collection.service */ "./jslib/common/src/abstractions/collection.service.ts");
+/* harmony import */ var jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! jslib-common/abstractions/i18n.service */ "./jslib/common/src/abstractions/i18n.service.ts");
+/* harmony import */ var jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! jslib-common/abstractions/log.service */ "./jslib/common/src/abstractions/log.service.ts");
+/* harmony import */ var jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! jslib-common/abstractions/platformUtils.service */ "./jslib/common/src/abstractions/platformUtils.service.ts");
+/* harmony import */ var jslib_angular_components_collections_component__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! jslib-angular/components/collections.component */ "./jslib/angular/src/components/collections.component.ts");
+/* harmony import */ var _angular_forms__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @angular/forms */ "./node_modules/@angular/forms/__ivy_ngcc__/fesm2015/forms.js");
+/* harmony import */ var jslib_angular_directives_api_action_directive__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! jslib-angular/directives/api-action.directive */ "./jslib/angular/src/directives/api-action.directive.ts");
+/* harmony import */ var jslib_angular_directives_blur_click_directive__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! jslib-angular/directives/blur-click.directive */ "./jslib/angular/src/directives/blur-click.directive.ts");
+/* harmony import */ var jslib_angular_directives_box_row_directive__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! jslib-angular/directives/box-row.directive */ "./jslib/angular/src/directives/box-row.directive.ts");
+/* harmony import */ var jslib_angular_pipes_i18n_pipe__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! jslib-angular/pipes/i18n.pipe */ "./jslib/angular/src/pipes/i18n.pipe.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+function CollectionsComponent_div_42_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "div", 14);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "div", 15);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](4, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate1"]("\n ", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](4, 1, "noCollectionsInList"), "\n ");
+} }
+function CollectionsComponent_div_44_div_2_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "div", 17);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "label", 18);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](4, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](5, "input", 19);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("ngModelChange", function CollectionsComponent_div_44_div_2_Template_input_ngModelChange_5_listener($event) { const c_r4 = ctx.$implicit; return c_r4.checked = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](6, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const c_r4 = ctx.$implicit;
+ const i_r5 = ctx.index;
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpropertyInterpolate1"]("for", "collection_", i_r5, "");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](c_r4.name);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpropertyInterpolate1"]("id", "collection_", i_r5, "");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpropertyInterpolate1"]("name", "Collection[", i_r5, "].Checked");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngModel", c_r4.checked);
+} }
+function CollectionsComponent_div_44_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "div", 14);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](2, CollectionsComponent_div_44_div_2_Template, 7, 5, "div", 16);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r2 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngForOf", ctx_r2.collections);
+} }
+class CollectionsComponent extends jslib_angular_components_collections_component__WEBPACK_IMPORTED_MODULE_9__["CollectionsComponent"] {
+ constructor(collectionService, platformUtilsService, i18nService, cipherService, route, location, logService) {
+ super(collectionService, platformUtilsService, i18nService, cipherService, logService);
+ this.route = route;
+ this.location = location;
+ }
+ ngOnInit() {
+ return __awaiter(this, void 0, void 0, function* () {
+ this.onSavedCollections.subscribe(() => {
+ this.back();
+ });
+ this.route.queryParams.pipe(Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_3__["first"])()).subscribe((params) => __awaiter(this, void 0, void 0, function* () {
+ this.cipherId = params.cipherId;
+ yield this.load();
+ }));
+ });
+ }
+ back() {
+ this.location.back();
+ }
+}
+CollectionsComponent.ɵfac = function CollectionsComponent_Factory(t) { return new (t || CollectionsComponent)(_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](jslib_common_abstractions_collection_service__WEBPACK_IMPORTED_MODULE_5__["CollectionService"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_8__["PlatformUtilsService"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_6__["I18nService"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](jslib_common_abstractions_cipher_service__WEBPACK_IMPORTED_MODULE_4__["CipherService"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](_angular_router__WEBPACK_IMPORTED_MODULE_2__["ActivatedRoute"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](_angular_common__WEBPACK_IMPORTED_MODULE_0__["Location"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_7__["LogService"])); };
+CollectionsComponent.ɵcmp = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdefineComponent"]({ type: CollectionsComponent, selectors: [["app-vault-collections"]], features: [_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵInheritDefinitionFeature"]], decls: 49, vars: 15, consts: [[3, "appApiAction", "ngSubmit"], ["form", ""], [1, "left"], ["type", "button", "appBlurClick", "", 3, "click"], [1, "header-icon"], ["aria-hidden", "true", 1, "fa", "fa-chevron-left"], [1, "center"], [1, "title"], [1, "right"], ["type", "submit", "appBlurClick", "", 3, "disabled"], [3, "hidden"], ["aria-hidden", "true", 1, "fa", "fa-spinner", "fa-lg", "fa-spin", 3, "hidden"], [1, "box"], ["class", "box-content", 4, "ngIf"], [1, "box-content"], [1, "box-content-row", "padded", "no-hover"], ["class", "box-content-row box-content-row-checkbox", "appBoxRow", "", 4, "ngFor", "ngForOf"], ["appBoxRow", "", 1, "box-content-row", "box-content-row-checkbox"], [3, "for"], ["type", "checkbox", 3, "id", "ngModel", "name", "ngModelChange"]], template: function CollectionsComponent_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "form", 0, 1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("ngSubmit", function CollectionsComponent_Template_form_ngSubmit_0_listener() { return ctx.submit(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](2, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](3, "header");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](4, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](5, "div", 2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](6, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](7, "button", 3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("click", function CollectionsComponent_Template_button_click_7_listener() { return ctx.back(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](8, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](9, "span", 4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](10, "i", 5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](11, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](12, "span");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](13);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](14, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](15, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](16, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](17, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](18, "div", 6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](19, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](20, "span", 7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](21);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](22, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](23, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](24, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](25, "div", 8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](26, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](27, "button", 9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](28, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](29, "span", 10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](30);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](31, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](32, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](33, "i", 11);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](34, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](35, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](36, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](37, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](38, "content");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](39, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](40, "div", 12);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](41, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](42, CollectionsComponent_div_42_Template, 6, 3, "div", 13);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](43, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](44, CollectionsComponent_div_44_Template, 4, 1, "div", 13);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](45, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](46, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](47, "\n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](48, "\n");
+ } if (rf & 2) {
+ const _r0 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵreference"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("appApiAction", ctx.formPromise);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](13);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](14, 9, "back"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](22, 11, "collections"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("disabled", _r0.loading);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("hidden", _r0.loading);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](31, 13, "save"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("hidden", !_r0.loading);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", !ctx.collections || !ctx.collections.length);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx.collections && ctx.collections.length);
+ } }, directives: [_angular_forms__WEBPACK_IMPORTED_MODULE_10__["ɵangular_packages_forms_forms_ba"], _angular_forms__WEBPACK_IMPORTED_MODULE_10__["NgControlStatusGroup"], _angular_forms__WEBPACK_IMPORTED_MODULE_10__["NgForm"], jslib_angular_directives_api_action_directive__WEBPACK_IMPORTED_MODULE_11__["ApiActionDirective"], jslib_angular_directives_blur_click_directive__WEBPACK_IMPORTED_MODULE_12__["BlurClickDirective"], _angular_common__WEBPACK_IMPORTED_MODULE_0__["NgIf"], _angular_common__WEBPACK_IMPORTED_MODULE_0__["NgForOf"], jslib_angular_directives_box_row_directive__WEBPACK_IMPORTED_MODULE_13__["BoxRowDirective"], _angular_forms__WEBPACK_IMPORTED_MODULE_10__["CheckboxControlValueAccessor"], _angular_forms__WEBPACK_IMPORTED_MODULE_10__["NgControlStatus"], _angular_forms__WEBPACK_IMPORTED_MODULE_10__["NgModel"]], pipes: [jslib_angular_pipes_i18n_pipe__WEBPACK_IMPORTED_MODULE_14__["I18nPipe"]], encapsulation: 2 });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵsetClassMetadata"](CollectionsComponent, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Component"],
+ args: [{
+ selector: 'app-vault-collections',
+ templateUrl: 'collections.component.html',
+ }]
+ }], function () { return [{ type: jslib_common_abstractions_collection_service__WEBPACK_IMPORTED_MODULE_5__["CollectionService"] }, { type: jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_8__["PlatformUtilsService"] }, { type: jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_6__["I18nService"] }, { type: jslib_common_abstractions_cipher_service__WEBPACK_IMPORTED_MODULE_4__["CipherService"] }, { type: _angular_router__WEBPACK_IMPORTED_MODULE_2__["ActivatedRoute"] }, { type: _angular_common__WEBPACK_IMPORTED_MODULE_0__["Location"] }, { type: jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_7__["LogService"] }]; }, null); })();
+
+
+/***/ }),
+
+/***/ "./src/popup/vault/current-tab.component.ts":
+/*!**************************************************!*\
+ !*** ./src/popup/vault/current-tab.component.ts ***!
+ \**************************************************/
+/*! exports provided: CurrentTabComponent */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CurrentTabComponent", function() { return CurrentTabComponent; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var _angular_router__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @angular/router */ "./node_modules/@angular/router/__ivy_ngcc__/fesm2015/router.js");
+/* harmony import */ var angular2_toaster__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! angular2-toaster */ "./node_modules/angular2-toaster/__ivy_ngcc__/fesm2015/angular2-toaster.js");
+/* harmony import */ var _browser_browserApi__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../browser/browserApi */ "./src/browser/browserApi.ts");
+/* harmony import */ var jslib_angular_services_broadcaster_service__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! jslib-angular/services/broadcaster.service */ "./jslib/angular/src/services/broadcaster.service.ts");
+/* harmony import */ var jslib_common_enums_cipherRepromptType__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! jslib-common/enums/cipherRepromptType */ "./jslib/common/src/enums/cipherRepromptType.ts");
+/* harmony import */ var jslib_common_enums_cipherType__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! jslib-common/enums/cipherType */ "./jslib/common/src/enums/cipherType.ts");
+/* harmony import */ var jslib_common_abstractions_cipher_service__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! jslib-common/abstractions/cipher.service */ "./jslib/common/src/abstractions/cipher.service.ts");
+/* harmony import */ var jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! jslib-common/abstractions/i18n.service */ "./jslib/common/src/abstractions/i18n.service.ts");
+/* harmony import */ var jslib_common_abstractions_passwordReprompt_service__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! jslib-common/abstractions/passwordReprompt.service */ "./jslib/common/src/abstractions/passwordReprompt.service.ts");
+/* harmony import */ var jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! jslib-common/abstractions/platformUtils.service */ "./jslib/common/src/abstractions/platformUtils.service.ts");
+/* harmony import */ var jslib_common_abstractions_search_service__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! jslib-common/abstractions/search.service */ "./jslib/common/src/abstractions/search.service.ts");
+/* harmony import */ var jslib_common_abstractions_storage_service__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! jslib-common/abstractions/storage.service */ "./jslib/common/src/abstractions/storage.service.ts");
+/* harmony import */ var jslib_common_abstractions_sync_service__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! jslib-common/abstractions/sync.service */ "./jslib/common/src/abstractions/sync.service.ts");
+/* harmony import */ var jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! jslib-common/services/constants.service */ "./jslib/common/src/services/constants.service.ts");
+/* harmony import */ var _services_abstractions_autofill_service__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../../services/abstractions/autofill.service */ "./src/services/abstractions/autofill.service.ts");
+/* harmony import */ var _services_popup_utils_service__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../services/popup-utils.service */ "./src/popup/services/popup-utils.service.ts");
+/* harmony import */ var jslib_common_misc_utils__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! jslib-common/misc/utils */ "./jslib/common/src/misc/utils.ts");
+/* harmony import */ var _components_pop_out_component__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../components/pop-out.component */ "./src/popup/components/pop-out.component.ts");
+/* harmony import */ var _angular_common__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! @angular/common */ "./node_modules/@angular/common/__ivy_ngcc__/fesm2015/common.js");
+/* harmony import */ var _angular_forms__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! @angular/forms */ "./node_modules/@angular/forms/__ivy_ngcc__/fesm2015/forms.js");
+/* harmony import */ var jslib_angular_directives_blur_click_directive__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! jslib-angular/directives/blur-click.directive */ "./jslib/angular/src/directives/blur-click.directive.ts");
+/* harmony import */ var jslib_angular_directives_a11y_title_directive__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! jslib-angular/directives/a11y-title.directive */ "./jslib/angular/src/directives/a11y-title.directive.ts");
+/* harmony import */ var _components_cipher_row_component__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ../components/cipher-row.component */ "./src/popup/components/cipher-row.component.ts");
+/* harmony import */ var jslib_angular_pipes_i18n_pipe__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! jslib-angular/pipes/i18n.pipe */ "./jslib/angular/src/pipes/i18n.pipe.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+function CurrentTabComponent_button_6_Template(rf, ctx) { if (rf & 1) {
+ const _r4 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "button", 7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("click", function CurrentTabComponent_button_6_Template_button_click_0_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r4); const ctx_r3 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](); return ctx_r3.refresh(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](1, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](2, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](3, "i", 11);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](4, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate"]("appA11yTitle", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](1, 1, "refresh"));
+} }
+function CurrentTabComponent_div_29_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "div", 12);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](2, "i", 13);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} }
+function CurrentTabComponent_ng_container_31_div_2_app_cipher_row_11_Template(rf, ctx) { if (rf & 1) {
+ const _r12 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "app-cipher-row", 21);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("onSelected", function CurrentTabComponent_ng_container_31_div_2_app_cipher_row_11_Template_app_cipher_row_onSelected_0_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r12); const ctx_r11 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](3); return ctx_r11.fillCipher($event); })("onView", function CurrentTabComponent_ng_container_31_div_2_app_cipher_row_11_Template_app_cipher_row_onView_0_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r12); const ctx_r13 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](3); return ctx_r13.viewCipher($event); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](1, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](2, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const loginCipher_r10 = ctx.$implicit;
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate"]("title", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](1, 3, "autoFill"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("cipher", loginCipher_r10)("showView", true);
+} }
+function CurrentTabComponent_ng_container_31_div_2_div_13_Template(rf, ctx) { if (rf & 1) {
+ const _r15 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "div", 22);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](2, "p", 23);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](4, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](6, "button", 24);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("click", function CurrentTabComponent_ng_container_31_div_2_div_13_Template_button_click_6_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r15); const ctx_r14 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](3); return ctx_r14.addCipher(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](8, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](9, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](4, 2, "autoFillInfo"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate1"]("\n ", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](8, 4, "addLogin"), "\n ");
+} }
+function CurrentTabComponent_ng_container_31_div_2_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "div", 15);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](2, "div", 16);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](4, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](5, "span", 17);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](8, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](9, "div", 18);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](10, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](11, CurrentTabComponent_ng_container_31_div_2_app_cipher_row_11_Template, 3, 5, "app-cipher-row", 19);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](12, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](13, CurrentTabComponent_ng_container_31_div_2_div_13_Template, 10, 6, "div", 20);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](14, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](15, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r5 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate1"]("\n ", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](4, 4, "typeLogins"), "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](ctx_r5.loginCiphers.length);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngForOf", ctx_r5.loginCiphers);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", !ctx_r5.loginCiphers.length);
+} }
+function CurrentTabComponent_ng_container_31_div_4_app_cipher_row_11_Template(rf, ctx) { if (rf & 1) {
+ const _r19 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "app-cipher-row", 21);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("onSelected", function CurrentTabComponent_ng_container_31_div_4_app_cipher_row_11_Template_app_cipher_row_onSelected_0_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r19); const ctx_r18 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](3); return ctx_r18.fillCipher($event); })("onView", function CurrentTabComponent_ng_container_31_div_4_app_cipher_row_11_Template_app_cipher_row_onView_0_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r19); const ctx_r20 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](3); return ctx_r20.viewCipher($event); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](1, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const cardCipher_r17 = ctx.$implicit;
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate"]("title", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](1, 3, "autoFill"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("cipher", cardCipher_r17)("showView", true);
+} }
+function CurrentTabComponent_ng_container_31_div_4_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "div", 15);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](2, "div", 16);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](4, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](5, "span", 17);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](8, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](9, "div", 18);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](10, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](11, CurrentTabComponent_ng_container_31_div_4_app_cipher_row_11_Template, 2, 5, "app-cipher-row", 19);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](12, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](13, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r6 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate1"]("\n ", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](4, 3, "cards"), "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](ctx_r6.cardCiphers.length);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngForOf", ctx_r6.cardCiphers);
+} }
+function CurrentTabComponent_ng_container_31_div_6_app_cipher_row_11_Template(rf, ctx) { if (rf & 1) {
+ const _r24 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "app-cipher-row", 21);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("onSelected", function CurrentTabComponent_ng_container_31_div_6_app_cipher_row_11_Template_app_cipher_row_onSelected_0_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r24); const ctx_r23 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](3); return ctx_r23.fillCipher($event); })("onView", function CurrentTabComponent_ng_container_31_div_6_app_cipher_row_11_Template_app_cipher_row_onView_0_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r24); const ctx_r25 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](3); return ctx_r25.viewCipher($event); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](1, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const identityCipher_r22 = ctx.$implicit;
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate"]("title", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](1, 3, "autoFill"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("cipher", identityCipher_r22)("showView", true);
+} }
+function CurrentTabComponent_ng_container_31_div_6_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "div", 15);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](2, "div", 16);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](4, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](5, "span", 17);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](8, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](9, "div", 18);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](10, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](11, CurrentTabComponent_ng_container_31_div_6_app_cipher_row_11_Template, 2, 5, "app-cipher-row", 19);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](12, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](13, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r7 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate1"]("\n ", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](4, 3, "identities"), "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](ctx_r7.identityCiphers.length);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngForOf", ctx_r7.identityCiphers);
+} }
+function CurrentTabComponent_ng_container_31_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementContainerStart"](0);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](2, CurrentTabComponent_ng_container_31_div_2_Template, 16, 6, "div", 14);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](4, CurrentTabComponent_ng_container_31_div_4_Template, 14, 5, "div", 14);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](6, CurrentTabComponent_ng_container_31_div_6_Template, 14, 5, "div", 14);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementContainerEnd"]();
+} if (rf & 2) {
+ const ctx_r2 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", ctx_r2.loginCiphers);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", ctx_r2.cardCiphers && ctx_r2.cardCiphers.length);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", ctx_r2.identityCiphers && ctx_r2.identityCiphers.length);
+} }
+const BroadcasterSubscriptionId = 'CurrentTabComponent';
+class CurrentTabComponent {
+ constructor(platformUtilsService, cipherService, popupUtilsService, autofillService, toasterService, i18nService, router, ngZone, broadcasterService, changeDetectorRef, syncService, searchService, storageService, passwordRepromptService) {
+ this.platformUtilsService = platformUtilsService;
+ this.cipherService = cipherService;
+ this.popupUtilsService = popupUtilsService;
+ this.autofillService = autofillService;
+ this.toasterService = toasterService;
+ this.i18nService = i18nService;
+ this.router = router;
+ this.ngZone = ngZone;
+ this.broadcasterService = broadcasterService;
+ this.changeDetectorRef = changeDetectorRef;
+ this.syncService = syncService;
+ this.searchService = searchService;
+ this.storageService = storageService;
+ this.passwordRepromptService = passwordRepromptService;
+ this.pageDetails = [];
+ this.inSidebar = false;
+ this.searchTypeSearch = false;
+ this.loaded = false;
+ }
+ ngOnInit() {
+ return __awaiter(this, void 0, void 0, function* () {
+ this.searchTypeSearch = !this.platformUtilsService.isSafari();
+ this.inSidebar = this.popupUtilsService.inSidebar(window);
+ this.broadcasterService.subscribe(BroadcasterSubscriptionId, (message) => {
+ this.ngZone.run(() => __awaiter(this, void 0, void 0, function* () {
+ switch (message.command) {
+ case 'syncCompleted':
+ if (this.loaded) {
+ window.setTimeout(() => {
+ this.load();
+ }, 500);
+ }
+ break;
+ case 'collectPageDetailsResponse':
+ if (message.sender === BroadcasterSubscriptionId) {
+ this.pageDetails.push({
+ frameId: message.webExtSender.frameId,
+ tab: message.tab,
+ details: message.details,
+ });
+ }
+ break;
+ default:
+ break;
+ }
+ this.changeDetectorRef.detectChanges();
+ }));
+ });
+ if (!this.syncService.syncInProgress) {
+ yield this.load();
+ }
+ else {
+ this.loadedTimeout = window.setTimeout(() => __awaiter(this, void 0, void 0, function* () {
+ if (!this.loaded) {
+ yield this.load();
+ }
+ }), 5000);
+ }
+ window.setTimeout(() => {
+ document.getElementById('search').focus();
+ }, 100);
+ });
+ }
+ ngOnDestroy() {
+ window.clearTimeout(this.loadedTimeout);
+ this.broadcasterService.unsubscribe(BroadcasterSubscriptionId);
+ }
+ refresh() {
+ return __awaiter(this, void 0, void 0, function* () {
+ yield this.load();
+ });
+ }
+ addCipher() {
+ this.router.navigate(['/add-cipher'], { queryParams: { name: this.hostname, uri: this.url } });
+ }
+ viewCipher(cipher) {
+ this.router.navigate(['/view-cipher'], { queryParams: { cipherId: cipher.id } });
+ }
+ fillCipher(cipher) {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (cipher.reprompt !== jslib_common_enums_cipherRepromptType__WEBPACK_IMPORTED_MODULE_5__["CipherRepromptType"].None && !(yield this.passwordRepromptService.showPasswordPrompt())) {
+ return;
+ }
+ this.totpCode = null;
+ if (this.totpTimeout != null) {
+ window.clearTimeout(this.totpTimeout);
+ }
+ if (this.pageDetails == null || this.pageDetails.length === 0) {
+ this.toasterService.popAsync('error', null, this.i18nService.t('autofillError'));
+ return;
+ }
+ try {
+ this.totpCode = yield this.autofillService.doAutoFill({
+ cipher: cipher,
+ pageDetails: this.pageDetails,
+ doc: window.document,
+ fillNewPassword: true,
+ });
+ if (this.totpCode != null) {
+ this.platformUtilsService.copyToClipboard(this.totpCode, { window: window });
+ }
+ if (this.popupUtilsService.inPopup(window)) {
+ if (this.platformUtilsService.isFirefox() || this.platformUtilsService.isSafari()) {
+ _browser_browserApi__WEBPACK_IMPORTED_MODULE_3__["BrowserApi"].closePopup(window);
+ }
+ else {
+ // Slight delay to fix bug in Chromium browsers where popup closes without copying totp to clipboard
+ setTimeout(() => _browser_browserApi__WEBPACK_IMPORTED_MODULE_3__["BrowserApi"].closePopup(window), 50);
+ }
+ }
+ }
+ catch (_a) {
+ this.ngZone.run(() => {
+ this.toasterService.popAsync('error', null, this.i18nService.t('autofillError'));
+ this.changeDetectorRef.detectChanges();
+ });
+ }
+ });
+ }
+ searchVault() {
+ if (this.searchTimeout != null) {
+ clearTimeout(this.searchTimeout);
+ }
+ if (!this.searchService.isSearchable(this.searchText)) {
+ return;
+ }
+ this.searchTimeout = window.setTimeout(() => __awaiter(this, void 0, void 0, function* () {
+ this.router.navigate(['/tabs/vault'], { queryParams: { searchText: this.searchText } });
+ }), 200);
+ }
+ closeOnEsc(e) {
+ // If input not empty, use browser default behavior of clearing input instead
+ if (e.key === 'Escape' && (this.searchText == null || this.searchText === '')) {
+ _browser_browserApi__WEBPACK_IMPORTED_MODULE_3__["BrowserApi"].closePopup(window);
+ }
+ }
+ load() {
+ return __awaiter(this, void 0, void 0, function* () {
+ const tab = yield _browser_browserApi__WEBPACK_IMPORTED_MODULE_3__["BrowserApi"].getTabFromCurrentWindow();
+ if (tab != null) {
+ this.url = tab.url;
+ }
+ else {
+ this.loginCiphers = [];
+ this.loaded = true;
+ return;
+ }
+ this.hostname = jslib_common_misc_utils__WEBPACK_IMPORTED_MODULE_17__["Utils"].getHostname(this.url);
+ this.pageDetails = [];
+ _browser_browserApi__WEBPACK_IMPORTED_MODULE_3__["BrowserApi"].tabSendMessage(tab, {
+ command: 'collectPageDetails',
+ tab: tab,
+ sender: BroadcasterSubscriptionId,
+ });
+ const otherTypes = [];
+ const dontShowCards = yield this.storageService.get(jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_14__["ConstantsService"].dontShowCardsCurrentTab);
+ const dontShowIdentities = yield this.storageService.get(jslib_common_services_constants_service__WEBPACK_IMPORTED_MODULE_14__["ConstantsService"].dontShowIdentitiesCurrentTab);
+ if (!dontShowCards) {
+ otherTypes.push(jslib_common_enums_cipherType__WEBPACK_IMPORTED_MODULE_6__["CipherType"].Card);
+ }
+ if (!dontShowIdentities) {
+ otherTypes.push(jslib_common_enums_cipherType__WEBPACK_IMPORTED_MODULE_6__["CipherType"].Identity);
+ }
+ const ciphers = yield this.cipherService.getAllDecryptedForUrl(this.url, otherTypes.length > 0 ? otherTypes : null);
+ this.loginCiphers = [];
+ this.cardCiphers = [];
+ this.identityCiphers = [];
+ ciphers.forEach(c => {
+ switch (c.type) {
+ case jslib_common_enums_cipherType__WEBPACK_IMPORTED_MODULE_6__["CipherType"].Login:
+ this.loginCiphers.push(c);
+ break;
+ case jslib_common_enums_cipherType__WEBPACK_IMPORTED_MODULE_6__["CipherType"].Card:
+ this.cardCiphers.push(c);
+ break;
+ case jslib_common_enums_cipherType__WEBPACK_IMPORTED_MODULE_6__["CipherType"].Identity:
+ this.identityCiphers.push(c);
+ break;
+ default:
+ break;
+ }
+ });
+ this.loginCiphers = this.loginCiphers.sort((a, b) => this.cipherService.sortCiphersByLastUsedThenName(a, b));
+ this.loaded = true;
+ });
+ }
+}
+CurrentTabComponent.ɵfac = function CurrentTabComponent_Factory(t) { return new (t || CurrentTabComponent)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_10__["PlatformUtilsService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_cipher_service__WEBPACK_IMPORTED_MODULE_7__["CipherService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_services_popup_utils_service__WEBPACK_IMPORTED_MODULE_16__["PopupUtilsService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_services_abstractions_autofill_service__WEBPACK_IMPORTED_MODULE_15__["AutofillService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](angular2_toaster__WEBPACK_IMPORTED_MODULE_2__["ToasterService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_8__["I18nService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_router__WEBPACK_IMPORTED_MODULE_1__["Router"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["NgZone"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_angular_services_broadcaster_service__WEBPACK_IMPORTED_MODULE_4__["BroadcasterService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ChangeDetectorRef"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_sync_service__WEBPACK_IMPORTED_MODULE_13__["SyncService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_search_service__WEBPACK_IMPORTED_MODULE_11__["SearchService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_storage_service__WEBPACK_IMPORTED_MODULE_12__["StorageService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_passwordReprompt_service__WEBPACK_IMPORTED_MODULE_9__["PasswordRepromptService"])); };
+CurrentTabComponent.ɵcmp = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineComponent"]({ type: CurrentTabComponent, selectors: [["app-current-tab"]], decls: 34, vars: 12, consts: [[1, "left"], [3, "show"], ["type", "button", "appBlurClick", "", 3, "appA11yTitle", "click", 4, "ngIf"], [1, "search"], ["id", "search", "autocomplete", "off", 3, "type", "placeholder", "ngModel", "ngModelChange", "input", "keydown"], ["aria-hidden", "true", 1, "fa", "fa-search"], [1, "right"], ["type", "button", "appBlurClick", "", 3, "appA11yTitle", "click"], ["aria-hidden", "true", 1, "fa", "fa-plus", "fa-lg", "fa-fw"], ["class", "no-items", 4, "ngIf"], [4, "ngIf"], ["aria-hidden", "true", 1, "fa", "fa-retweet", "fa-lg", "fa-fw"], [1, "no-items"], ["aria-hidden", "true", 1, "fa", "fa-spinner", "fa-spin", "fa-3x"], ["class", "box list", 4, "ngIf"], [1, "box", "list"], [1, "box-header"], [1, "flex-right"], [1, "box-content"], [3, "cipher", "title", "showView", "onSelected", "onView", 4, "ngFor", "ngForOf"], ["class", "box-content-row padded no-hover", 4, "ngIf"], [3, "cipher", "title", "showView", "onSelected", "onView"], [1, "box-content-row", "padded", "no-hover"], [1, "text-center"], ["type", "button", 1, "btn", "primary", "link", "block", 3, "click"]], template: function CurrentTabComponent_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "header");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](2, "div", 0);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](4, "app-pop-out", 1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](6, CurrentTabComponent_button_6_Template, 5, 3, "button", 2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](8, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](9, "div", 3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](10, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](11, "input", 4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("ngModelChange", function CurrentTabComponent_Template_input_ngModelChange_11_listener($event) { return ctx.searchText = $event; })("input", function CurrentTabComponent_Template_input_input_11_listener() { return ctx.searchVault(); })("keydown", function CurrentTabComponent_Template_input_keydown_11_listener($event) { return ctx.closeOnEsc($event); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](12, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](13, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](14, "i", 5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](15, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](16, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](17, "div", 6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](18, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](19, "button", 7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("click", function CurrentTabComponent_Template_button_click_19_listener() { return ctx.addCipher(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](20, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](21, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](22, "i", 8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](23, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](24, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](25, "\n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](26, "\n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](27, "content");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](28, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](29, CurrentTabComponent_div_29_Template, 4, 0, "div", 9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](30, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](31, CurrentTabComponent_ng_container_31_Template, 8, 3, "ng-container", 10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](32, "\n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](33, "\n");
+ } if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("show", !ctx.inSidebar);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", ctx.inSidebar);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate"]("type", ctx.searchTypeSearch ? "search" : "text");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate"]("placeholder", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](12, 8, "searchVault"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngModel", ctx.searchText);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate"]("appA11yTitle", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](20, 10, "addItem"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", !ctx.loaded);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", ctx.loaded);
+ } }, directives: [_components_pop_out_component__WEBPACK_IMPORTED_MODULE_18__["PopOutComponent"], _angular_common__WEBPACK_IMPORTED_MODULE_19__["NgIf"], _angular_forms__WEBPACK_IMPORTED_MODULE_20__["DefaultValueAccessor"], _angular_forms__WEBPACK_IMPORTED_MODULE_20__["NgControlStatus"], _angular_forms__WEBPACK_IMPORTED_MODULE_20__["NgModel"], jslib_angular_directives_blur_click_directive__WEBPACK_IMPORTED_MODULE_21__["BlurClickDirective"], jslib_angular_directives_a11y_title_directive__WEBPACK_IMPORTED_MODULE_22__["A11yTitleDirective"], _angular_common__WEBPACK_IMPORTED_MODULE_19__["NgForOf"], _components_cipher_row_component__WEBPACK_IMPORTED_MODULE_23__["CipherRowComponent"]], pipes: [jslib_angular_pipes_i18n_pipe__WEBPACK_IMPORTED_MODULE_24__["I18nPipe"]], encapsulation: 2 });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](CurrentTabComponent, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Component"],
+ args: [{
+ selector: 'app-current-tab',
+ templateUrl: 'current-tab.component.html',
+ }]
+ }], function () { return [{ type: jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_10__["PlatformUtilsService"] }, { type: jslib_common_abstractions_cipher_service__WEBPACK_IMPORTED_MODULE_7__["CipherService"] }, { type: _services_popup_utils_service__WEBPACK_IMPORTED_MODULE_16__["PopupUtilsService"] }, { type: _services_abstractions_autofill_service__WEBPACK_IMPORTED_MODULE_15__["AutofillService"] }, { type: angular2_toaster__WEBPACK_IMPORTED_MODULE_2__["ToasterService"] }, { type: jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_8__["I18nService"] }, { type: _angular_router__WEBPACK_IMPORTED_MODULE_1__["Router"] }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["NgZone"] }, { type: jslib_angular_services_broadcaster_service__WEBPACK_IMPORTED_MODULE_4__["BroadcasterService"] }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["ChangeDetectorRef"] }, { type: jslib_common_abstractions_sync_service__WEBPACK_IMPORTED_MODULE_13__["SyncService"] }, { type: jslib_common_abstractions_search_service__WEBPACK_IMPORTED_MODULE_11__["SearchService"] }, { type: jslib_common_abstractions_storage_service__WEBPACK_IMPORTED_MODULE_12__["StorageService"] }, { type: jslib_common_abstractions_passwordReprompt_service__WEBPACK_IMPORTED_MODULE_9__["PasswordRepromptService"] }]; }, null); })();
+
+
+/***/ }),
+
+/***/ "./src/popup/vault/groupings.component.ts":
+/*!************************************************!*\
+ !*** ./src/popup/vault/groupings.component.ts ***!
+ \************************************************/
+/*! exports provided: GroupingsComponent */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "GroupingsComponent", function() { return GroupingsComponent; });
+/* harmony import */ var _angular_common__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/common */ "./node_modules/@angular/common/__ivy_ngcc__/fesm2015/common.js");
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var _angular_router__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @angular/router */ "./node_modules/@angular/router/__ivy_ngcc__/fesm2015/router.js");
+/* harmony import */ var rxjs_operators__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! rxjs/operators */ "./node_modules/rxjs/_esm5/operators/index.js");
+/* harmony import */ var _browser_browserApi__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../browser/browserApi */ "./src/browser/browserApi.ts");
+/* harmony import */ var jslib_common_enums_cipherType__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! jslib-common/enums/cipherType */ "./jslib/common/src/enums/cipherType.ts");
+/* harmony import */ var jslib_common_abstractions_cipher_service__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! jslib-common/abstractions/cipher.service */ "./jslib/common/src/abstractions/cipher.service.ts");
+/* harmony import */ var jslib_common_abstractions_collection_service__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! jslib-common/abstractions/collection.service */ "./jslib/common/src/abstractions/collection.service.ts");
+/* harmony import */ var jslib_common_abstractions_folder_service__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! jslib-common/abstractions/folder.service */ "./jslib/common/src/abstractions/folder.service.ts");
+/* harmony import */ var jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! jslib-common/abstractions/platformUtils.service */ "./jslib/common/src/abstractions/platformUtils.service.ts");
+/* harmony import */ var jslib_common_abstractions_search_service__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! jslib-common/abstractions/search.service */ "./jslib/common/src/abstractions/search.service.ts");
+/* harmony import */ var jslib_common_abstractions_state_service__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! jslib-common/abstractions/state.service */ "./jslib/common/src/abstractions/state.service.ts");
+/* harmony import */ var jslib_common_abstractions_storage_service__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! jslib-common/abstractions/storage.service */ "./jslib/common/src/abstractions/storage.service.ts");
+/* harmony import */ var jslib_common_abstractions_sync_service__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! jslib-common/abstractions/sync.service */ "./jslib/common/src/abstractions/sync.service.ts");
+/* harmony import */ var jslib_common_abstractions_user_service__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! jslib-common/abstractions/user.service */ "./jslib/common/src/abstractions/user.service.ts");
+/* harmony import */ var jslib_angular_services_broadcaster_service__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! jslib-angular/services/broadcaster.service */ "./jslib/angular/src/services/broadcaster.service.ts");
+/* harmony import */ var jslib_angular_components_groupings_component__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! jslib-angular/components/groupings.component */ "./jslib/angular/src/components/groupings.component.ts");
+/* harmony import */ var _services_popup_utils_service__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../services/popup-utils.service */ "./src/popup/services/popup-utils.service.ts");
+/* harmony import */ var _components_pop_out_component__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../components/pop-out.component */ "./src/popup/components/pop-out.component.ts");
+/* harmony import */ var _angular_forms__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! @angular/forms */ "./node_modules/@angular/forms/__ivy_ngcc__/fesm2015/forms.js");
+/* harmony import */ var jslib_angular_directives_autofocus_directive__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! jslib-angular/directives/autofocus.directive */ "./jslib/angular/src/directives/autofocus.directive.ts");
+/* harmony import */ var jslib_angular_directives_blur_click_directive__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! jslib-angular/directives/blur-click.directive */ "./jslib/angular/src/directives/blur-click.directive.ts");
+/* harmony import */ var jslib_angular_directives_a11y_title_directive__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! jslib-angular/directives/a11y-title.directive */ "./jslib/angular/src/directives/a11y-title.directive.ts");
+/* harmony import */ var jslib_angular_directives_stop_click_directive__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! jslib-angular/directives/stop-click.directive */ "./jslib/angular/src/directives/stop-click.directive.ts");
+/* harmony import */ var _components_cipher_row_component__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ../components/cipher-row.component */ "./src/popup/components/cipher-row.component.ts");
+/* harmony import */ var _angular_cdk_scrolling__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! @angular/cdk/scrolling */ "./node_modules/@angular/cdk/__ivy_ngcc__/fesm2015/scrolling.js");
+/* harmony import */ var jslib_angular_directives_cipherListVirtualScroll_directive__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! jslib-angular/directives/cipherListVirtualScroll.directive */ "./jslib/angular/src/directives/cipherListVirtualScroll.directive.ts");
+/* harmony import */ var jslib_angular_pipes_i18n_pipe__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! jslib-angular/pipes/i18n.pipe */ "./jslib/angular/src/pipes/i18n.pipe.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+function GroupingsComponent_div_27_i_2_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](0, "i", 11);
+} }
+function GroupingsComponent_div_27_ng_container_4_Template(rf, ctx) { if (rf & 1) {
+ const _r6 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementContainerStart"](0);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](2, "i", 12);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](4, "p");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](6, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](8, "button", 13);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("click", function GroupingsComponent_div_27_ng_container_4_Template_button_click_8_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r6); const ctx_r5 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](2); return ctx_r5.addCipher(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](10, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](11, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementContainerEnd"]();
+} if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](6, 2, "noItemsInList"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](10, 4, "addItem"));
+} }
+function GroupingsComponent_div_27_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "div", 9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](2, GroupingsComponent_div_27_i_2_Template, 1, 0, "i", 10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](4, GroupingsComponent_div_27_ng_container_4_Template, 12, 6, "ng-container", 8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r0 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", !ctx_r0.loaded);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx_r0.loaded);
+} }
+function GroupingsComponent_ng_container_29_div_2_app_cipher_row_11_Template(rf, ctx) { if (rf & 1) {
+ const _r15 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "app-cipher-row", 31);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("onSelected", function GroupingsComponent_ng_container_29_div_2_app_cipher_row_11_Template_app_cipher_row_onSelected_0_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r15); const ctx_r14 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](3); return ctx_r14.selectCipher($event); })("launchEvent", function GroupingsComponent_ng_container_29_div_2_app_cipher_row_11_Template_app_cipher_row_launchEvent_0_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r15); const ctx_r16 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](3); return ctx_r16.launchCipher($event); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](1, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const favoriteCipher_r13 = ctx.$implicit;
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpropertyInterpolate"]("title", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](1, 2, "viewItem"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("cipher", favoriteCipher_r13);
+} }
+function GroupingsComponent_ng_container_29_div_2_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "div", 15);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "div", 16);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](4, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](5, "span", 17);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](8, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](9, "div", 29);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](10, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](11, GroupingsComponent_ng_container_29_div_2_app_cipher_row_11_Template, 2, 4, "app-cipher-row", 30);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](12, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](13, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r7 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate1"]("\n ", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](4, 3, "favorites"), "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](ctx_r7.favoriteCiphers.length);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngForOf", ctx_r7.favoriteCiphers);
+} }
+const _c0 = function (a0, a1) { return { "fa-folder-open": a0, "fa-folder-open-o": a1 }; };
+function GroupingsComponent_ng_container_29_div_93_button_11_Template(rf, ctx) { if (rf & 1) {
+ const _r20 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "button", 19);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("click", function GroupingsComponent_ng_container_29_div_93_button_11_Template_button_click_0_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r20); const f_r18 = ctx.$implicit; const ctx_r19 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](3); return ctx_r19.selectFolder(f_r18.node); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "div", 20);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](4, "div", 21);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](6, "i", 33);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](8, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](9, "span", 23);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](11, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](12, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](13, "span", 24);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](14);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](15, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](16, "span");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](17, "i", 25);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](18, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const f_r18 = ctx.$implicit;
+ const ctx_r17 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngClass", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpureFunction2"](3, _c0, f_r18.node.id, !f_r18.node.id));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](f_r18.node.name);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](ctx_r17.folderCounts.get(f_r18.node.id) || 0);
+} }
+function GroupingsComponent_ng_container_29_div_93_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "div", 15);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "div", 16);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](4, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](5, "span", 17);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](8, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](9, "div", 18);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](10, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](11, GroupingsComponent_ng_container_29_div_93_button_11_Template, 19, 6, "button", 32);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](12, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](13, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r8 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate1"]("\n ", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](4, 3, "folders"), "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](ctx_r8.folderCount);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngForOf", ctx_r8.nestedFolders);
+} }
+function GroupingsComponent_ng_container_29_div_95_button_11_Template(rf, ctx) { if (rf & 1) {
+ const _r24 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "button", 19);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("click", function GroupingsComponent_ng_container_29_div_95_button_11_Template_button_click_0_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r24); const nestedCollection_r22 = ctx.$implicit; const ctx_r23 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](3); return ctx_r23.selectCollection(nestedCollection_r22.node); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "div", 20);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](4, "div", 21);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](5, "i", 34);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](6, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](7, "span", 23);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](9, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](10, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](11, "span", 24);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](12);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](13, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](14, "span");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](15, "i", 25);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](16, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const nestedCollection_r22 = ctx.$implicit;
+ const ctx_r21 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](nestedCollection_r22.node.name);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](ctx_r21.collectionCounts.get(nestedCollection_r22.node.id) || 0);
+} }
+function GroupingsComponent_ng_container_29_div_95_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "div", 15);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "div", 16);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](4, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](5, "span", 17);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](8, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](9, "div", 18);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](10, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](11, GroupingsComponent_ng_container_29_div_95_button_11_Template, 17, 2, "button", 32);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](12, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](13, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r9 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate1"]("\n ", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](4, 3, "collections"), "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](ctx_r9.nestedCollections.length);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngForOf", ctx_r9.nestedCollections);
+} }
+function GroupingsComponent_ng_container_29_div_97_app_cipher_row_11_Template(rf, ctx) { if (rf & 1) {
+ const _r28 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "app-cipher-row", 31);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("onSelected", function GroupingsComponent_ng_container_29_div_97_app_cipher_row_11_Template_app_cipher_row_onSelected_0_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r28); const ctx_r27 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](3); return ctx_r27.selectCipher($event); })("launchEvent", function GroupingsComponent_ng_container_29_div_97_app_cipher_row_11_Template_app_cipher_row_launchEvent_0_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r28); const ctx_r29 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](3); return ctx_r29.launchCipher($event); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](1, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const noFolderCipher_r26 = ctx.$implicit;
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpropertyInterpolate"]("title", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](1, 2, "viewItem"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("cipher", noFolderCipher_r26);
+} }
+function GroupingsComponent_ng_container_29_div_97_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "div", 15);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "div", 16);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](4, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](5, "div", 17);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](8, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](9, "div", 29);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](10, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](11, GroupingsComponent_ng_container_29_div_97_app_cipher_row_11_Template, 2, 4, "app-cipher-row", 30);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](12, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](13, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r10 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate1"]("\n ", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](4, 3, "noneFolder"), "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](ctx_r10.noFolderCiphers.length);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngForOf", ctx_r10.noFolderCiphers);
+} }
+function GroupingsComponent_ng_container_29_div_99_Template(rf, ctx) { if (rf & 1) {
+ const _r31 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "div", 15);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "div", 16);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](4, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](5, "span", 17);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](8, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](9, "div", 18);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](10, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](11, "button", 19);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("click", function GroupingsComponent_ng_container_29_div_99_Template_button_click_11_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r31); const ctx_r30 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](2); return ctx_r30.selectTrash(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](12, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](13, "div", 20);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](14, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](15, "div", 21);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](16, "i", 35);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](17, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](18, "span", 23);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](19);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](20, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](21, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](22, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](23, "span", 24);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](24);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](25, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](26, "span");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](27, "i", 25);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](28, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](29, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](30, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r11 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate1"]("\n ", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](4, 4, "trash"), "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](ctx_r11.deletedCount);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](13);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](20, 6, "trash"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](ctx_r11.deletedCount);
+} }
+function GroupingsComponent_ng_container_29_Template(rf, ctx) { if (rf & 1) {
+ const _r33 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementContainerStart"](0);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](2, GroupingsComponent_ng_container_29_div_2_Template, 14, 5, "div", 14);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](4, "div", 15);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](6, "div", 16);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](8, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](9, "span", 17);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](10, "4");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](11, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](12, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](13, "div", 18);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](14, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](15, "button", 19);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("click", function GroupingsComponent_ng_container_29_Template_button_click_15_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r33); const ctx_r32 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](); return ctx_r32.selectType(ctx_r32.cipherType.Login); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](16, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](17, "div", 20);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](18, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](19, "div", 21);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](20, "i", 22);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](21, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](22, "span", 23);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](23);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](24, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](25, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](26, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](27, "span", 24);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](28);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](29, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](30, "span");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](31, "i", 25);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](32, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](33, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](34, "button", 19);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("click", function GroupingsComponent_ng_container_29_Template_button_click_34_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r33); const ctx_r34 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](); return ctx_r34.selectType(ctx_r34.cipherType.Card); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](35, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](36, "div", 20);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](37, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](38, "div", 21);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](39, "i", 26);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](40, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](41, "span", 23);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](42);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](43, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](44, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](45, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](46, "span", 24);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](47);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](48, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](49, "span");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](50, "i", 25);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](51, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](52, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](53, "button", 19);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("click", function GroupingsComponent_ng_container_29_Template_button_click_53_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r33); const ctx_r35 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](); return ctx_r35.selectType(ctx_r35.cipherType.Identity); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](54, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](55, "div", 20);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](56, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](57, "div", 21);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](58, "i", 27);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](59, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](60, "span", 23);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](61);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](62, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](63, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](64, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](65, "span", 24);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](66);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](67, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](68, "span");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](69, "i", 25);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](70, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](71, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](72, "button", 19);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("click", function GroupingsComponent_ng_container_29_Template_button_click_72_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r33); const ctx_r36 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](); return ctx_r36.selectType(ctx_r36.cipherType.SecureNote); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](73, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](74, "div", 20);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](75, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](76, "div", 21);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](77, "i", 28);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](78, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](79, "span", 23);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](80);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](81, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](82, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](83, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](84, "span", 24);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](85);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](86, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](87, "span");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](88, "i", 25);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](89, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](90, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](91, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](92, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](93, GroupingsComponent_ng_container_29_div_93_Template, 14, 5, "div", 14);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](94, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](95, GroupingsComponent_ng_container_29_div_95_Template, 14, 5, "div", 14);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](96, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](97, GroupingsComponent_ng_container_29_div_97_Template, 14, 5, "div", 14);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](98, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](99, GroupingsComponent_ng_container_29_div_99_Template, 31, 8, "div", 14);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](100, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementContainerEnd"]();
+} if (rf & 2) {
+ const ctx_r1 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx_r1.favoriteCiphers);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate1"]("\n ", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](8, 14, "types"), "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](16);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](24, 16, "typeLogin"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](ctx_r1.typeCounts.get(ctx_r1.cipherType.Login) || 0);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](14);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](43, 18, "typeCard"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](ctx_r1.typeCounts.get(ctx_r1.cipherType.Card) || 0);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](14);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](62, 20, "typeIdentity"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](ctx_r1.typeCounts.get(ctx_r1.cipherType.Identity) || 0);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](14);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](81, 22, "typeSecureNote"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](ctx_r1.typeCounts.get(ctx_r1.cipherType.SecureNote) || 0);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx_r1.nestedFolders == null ? null : ctx_r1.nestedFolders.length);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx_r1.nestedCollections && ctx_r1.nestedCollections.length);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx_r1.showNoFolderCiphers);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx_r1.deletedCount);
+} }
+function GroupingsComponent_ng_container_31_div_2_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "div", 9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "p");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](4, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](4, 1, "noItemsInList"));
+} }
+function GroupingsComponent_ng_container_31_cdk_virtual_scroll_viewport_4_app_cipher_row_6_Template(rf, ctx) { if (rf & 1) {
+ const _r42 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "app-cipher-row", 31);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("onSelected", function GroupingsComponent_ng_container_31_cdk_virtual_scroll_viewport_4_app_cipher_row_6_Template_app_cipher_row_onSelected_0_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r42); const ctx_r41 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](3); return ctx_r41.selectCipher($event); })("launchEvent", function GroupingsComponent_ng_container_31_cdk_virtual_scroll_viewport_4_app_cipher_row_6_Template_app_cipher_row_launchEvent_0_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r42); const ctx_r43 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](3); return ctx_r43.launchCipher($event); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](1, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const searchedCipher_r40 = ctx.$implicit;
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpropertyInterpolate"]("title", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](1, 2, "viewItem"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("cipher", searchedCipher_r40);
+} }
+function GroupingsComponent_ng_container_31_cdk_virtual_scroll_viewport_4_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "cdk-virtual-scroll-viewport", 37);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "div", 38);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](4, "div", 29);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](6, GroupingsComponent_ng_container_31_cdk_virtual_scroll_viewport_4_app_cipher_row_6_Template, 2, 4, "app-cipher-row", 39);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](8, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](9, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r38 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("cdkVirtualForOf", ctx_r38.ciphers);
+} }
+function GroupingsComponent_ng_container_31_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementContainerStart"](0);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](2, GroupingsComponent_ng_container_31_div_2_Template, 6, 3, "div", 7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](4, GroupingsComponent_ng_container_31_cdk_virtual_scroll_viewport_4_Template, 10, 1, "cdk-virtual-scroll-viewport", 36);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementContainerEnd"]();
+} if (rf & 2) {
+ const ctx_r2 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", !ctx_r2.ciphers || !ctx_r2.ciphers.length);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx_r2.ciphers && ctx_r2.ciphers.length > 0);
+} }
+const ComponentId = 'GroupingsComponent';
+const ScopeStateId = ComponentId + 'Scope';
+class GroupingsComponent extends jslib_angular_components_groupings_component__WEBPACK_IMPORTED_MODULE_16__["GroupingsComponent"] {
+ constructor(collectionService, folderService, storageService, userService, cipherService, router, ngZone, broadcasterService, changeDetectorRef, route, stateService, popupUtils, syncService, platformUtilsService, searchService, location) {
+ super(collectionService, folderService, storageService, userService);
+ this.cipherService = cipherService;
+ this.router = router;
+ this.ngZone = ngZone;
+ this.broadcasterService = broadcasterService;
+ this.changeDetectorRef = changeDetectorRef;
+ this.route = route;
+ this.stateService = stateService;
+ this.popupUtils = popupUtils;
+ this.syncService = syncService;
+ this.platformUtilsService = platformUtilsService;
+ this.searchService = searchService;
+ this.location = location;
+ this.folderCounts = new Map();
+ this.collectionCounts = new Map();
+ this.typeCounts = new Map();
+ this.showLeftHeader = true;
+ this.searchPending = false;
+ this.searchTypeSearch = false;
+ this.deletedCount = 0;
+ this.preventSelected = false;
+ this.noFolderListSize = 100;
+ this.searchTimeout = null;
+ this.hasSearched = false;
+ this.hasLoadedAllCiphers = false;
+ this.allCiphers = null;
+ this.noFolderListSize = 100;
+ }
+ get showNoFolderCiphers() {
+ return this.noFolderCiphers != null && this.noFolderCiphers.length < this.noFolderListSize &&
+ this.collections.length === 0;
+ }
+ get folderCount() {
+ return this.nestedFolders.length - (this.showNoFolderCiphers ? 0 : 1);
+ }
+ ngOnInit() {
+ return __awaiter(this, void 0, void 0, function* () {
+ this.searchTypeSearch = !this.platformUtilsService.isSafari();
+ this.showLeftHeader = !(this.popupUtils.inSidebar(window) && this.platformUtilsService.isFirefox());
+ this.stateService.remove('CiphersComponent');
+ this.broadcasterService.subscribe(ComponentId, (message) => {
+ this.ngZone.run(() => __awaiter(this, void 0, void 0, function* () {
+ switch (message.command) {
+ case 'syncCompleted':
+ window.setTimeout(() => {
+ this.load();
+ }, 500);
+ break;
+ default:
+ break;
+ }
+ this.changeDetectorRef.detectChanges();
+ }));
+ });
+ const restoredScopeState = yield this.restoreState();
+ this.route.queryParams.pipe(Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_3__["first"])()).subscribe((params) => __awaiter(this, void 0, void 0, function* () {
+ this.state = (yield this.stateService.get(ComponentId)) || {};
+ if (this.state.searchText) {
+ this.searchText = this.state.searchText;
+ }
+ else if (params.searchText) {
+ this.searchText = params.searchText;
+ this.location.replaceState('vault');
+ }
+ if (!this.syncService.syncInProgress) {
+ this.load();
+ }
+ else {
+ this.loadedTimeout = window.setTimeout(() => {
+ if (!this.loaded) {
+ this.load();
+ }
+ }, 5000);
+ }
+ if (!this.syncService.syncInProgress || restoredScopeState) {
+ window.setTimeout(() => this.popupUtils.setContentScrollY(window, this.state.scrollY), 0);
+ }
+ }));
+ });
+ }
+ ngOnDestroy() {
+ if (this.loadedTimeout != null) {
+ window.clearTimeout(this.loadedTimeout);
+ }
+ if (this.selectedTimeout != null) {
+ window.clearTimeout(this.selectedTimeout);
+ }
+ this.saveState();
+ this.broadcasterService.unsubscribe(ComponentId);
+ }
+ load() {
+ const _super = Object.create(null, {
+ load: { get: () => super.load, set: v => super.load = v },
+ loaded: { get: () => super.loaded, set: v => super.loaded = v }
+ });
+ return __awaiter(this, void 0, void 0, function* () {
+ yield _super.load.call(this, false);
+ yield this.loadCiphers();
+ if (this.showNoFolderCiphers && this.nestedFolders.length > 0) {
+ // Remove "No Folder" from folder listing
+ this.nestedFolders = this.nestedFolders.slice(0, this.nestedFolders.length - 1);
+ }
+ _super.loaded = true;
+ });
+ }
+ loadCiphers() {
+ return __awaiter(this, void 0, void 0, function* () {
+ this.allCiphers = yield this.cipherService.getAllDecrypted();
+ if (!this.hasLoadedAllCiphers) {
+ this.hasLoadedAllCiphers = !this.searchService.isSearchable(this.searchText);
+ }
+ this.deletedCount = this.allCiphers.filter(c => c.isDeleted).length;
+ yield this.search(null);
+ let favoriteCiphers = null;
+ let noFolderCiphers = null;
+ const folderCounts = new Map();
+ const collectionCounts = new Map();
+ const typeCounts = new Map();
+ this.ciphers.forEach(c => {
+ if (c.isDeleted) {
+ return;
+ }
+ if (c.favorite) {
+ if (favoriteCiphers == null) {
+ favoriteCiphers = [];
+ }
+ favoriteCiphers.push(c);
+ }
+ if (c.folderId == null) {
+ if (noFolderCiphers == null) {
+ noFolderCiphers = [];
+ }
+ noFolderCiphers.push(c);
+ }
+ if (typeCounts.has(c.type)) {
+ typeCounts.set(c.type, typeCounts.get(c.type) + 1);
+ }
+ else {
+ typeCounts.set(c.type, 1);
+ }
+ if (folderCounts.has(c.folderId)) {
+ folderCounts.set(c.folderId, folderCounts.get(c.folderId) + 1);
+ }
+ else {
+ folderCounts.set(c.folderId, 1);
+ }
+ if (c.collectionIds != null) {
+ c.collectionIds.forEach(colId => {
+ if (collectionCounts.has(colId)) {
+ collectionCounts.set(colId, collectionCounts.get(colId) + 1);
+ }
+ else {
+ collectionCounts.set(colId, 1);
+ }
+ });
+ }
+ });
+ this.favoriteCiphers = favoriteCiphers;
+ this.noFolderCiphers = noFolderCiphers;
+ this.typeCounts = typeCounts;
+ this.folderCounts = folderCounts;
+ this.collectionCounts = collectionCounts;
+ });
+ }
+ search(timeout = null) {
+ return __awaiter(this, void 0, void 0, function* () {
+ this.searchPending = false;
+ if (this.searchTimeout != null) {
+ clearTimeout(this.searchTimeout);
+ }
+ const filterDeleted = (c) => !c.isDeleted;
+ if (timeout == null) {
+ this.hasSearched = this.searchService.isSearchable(this.searchText);
+ this.ciphers = yield this.searchService.searchCiphers(this.searchText, filterDeleted, this.allCiphers);
+ return;
+ }
+ this.searchPending = true;
+ this.searchTimeout = setTimeout(() => __awaiter(this, void 0, void 0, function* () {
+ this.hasSearched = this.searchService.isSearchable(this.searchText);
+ if (!this.hasLoadedAllCiphers && !this.hasSearched) {
+ yield this.loadCiphers();
+ }
+ else {
+ this.ciphers = yield this.searchService.searchCiphers(this.searchText, filterDeleted, this.allCiphers);
+ }
+ this.searchPending = false;
+ }), timeout);
+ });
+ }
+ selectType(type) {
+ const _super = Object.create(null, {
+ selectType: { get: () => super.selectType }
+ });
+ return __awaiter(this, void 0, void 0, function* () {
+ _super.selectType.call(this, type);
+ this.router.navigate(['/ciphers'], { queryParams: { type: type } });
+ });
+ }
+ selectFolder(folder) {
+ const _super = Object.create(null, {
+ selectFolder: { get: () => super.selectFolder }
+ });
+ return __awaiter(this, void 0, void 0, function* () {
+ _super.selectFolder.call(this, folder);
+ this.router.navigate(['/ciphers'], { queryParams: { folderId: folder.id || 'none' } });
+ });
+ }
+ selectCollection(collection) {
+ const _super = Object.create(null, {
+ selectCollection: { get: () => super.selectCollection }
+ });
+ return __awaiter(this, void 0, void 0, function* () {
+ _super.selectCollection.call(this, collection);
+ this.router.navigate(['/ciphers'], { queryParams: { collectionId: collection.id } });
+ });
+ }
+ selectTrash() {
+ const _super = Object.create(null, {
+ selectTrash: { get: () => super.selectTrash }
+ });
+ return __awaiter(this, void 0, void 0, function* () {
+ _super.selectTrash.call(this);
+ this.router.navigate(['/ciphers'], { queryParams: { deleted: true } });
+ });
+ }
+ selectCipher(cipher) {
+ return __awaiter(this, void 0, void 0, function* () {
+ this.selectedTimeout = window.setTimeout(() => {
+ if (!this.preventSelected) {
+ this.router.navigate(['/view-cipher'], { queryParams: { cipherId: cipher.id } });
+ }
+ this.preventSelected = false;
+ }, 200);
+ });
+ }
+ launchCipher(cipher) {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (cipher.type !== jslib_common_enums_cipherType__WEBPACK_IMPORTED_MODULE_5__["CipherType"].Login || !cipher.login.canLaunch) {
+ return;
+ }
+ if (this.selectedTimeout != null) {
+ window.clearTimeout(this.selectedTimeout);
+ }
+ this.preventSelected = true;
+ yield this.cipherService.updateLastLaunchedDate(cipher.id);
+ _browser_browserApi__WEBPACK_IMPORTED_MODULE_4__["BrowserApi"].createNewTab(cipher.login.launchUri);
+ if (this.popupUtils.inPopup(window)) {
+ _browser_browserApi__WEBPACK_IMPORTED_MODULE_4__["BrowserApi"].closePopup(window);
+ }
+ });
+ }
+ addCipher() {
+ return __awaiter(this, void 0, void 0, function* () {
+ this.router.navigate(['/add-cipher']);
+ });
+ }
+ showSearching() {
+ return this.hasSearched || (!this.searchPending && this.searchService.isSearchable(this.searchText));
+ }
+ closeOnEsc(e) {
+ // If input not empty, use browser default behavior of clearing input instead
+ if (e.key === 'Escape' && (this.searchText == null || this.searchText === '')) {
+ _browser_browserApi__WEBPACK_IMPORTED_MODULE_4__["BrowserApi"].closePopup(window);
+ }
+ }
+ saveState() {
+ return __awaiter(this, void 0, void 0, function* () {
+ this.state = {
+ scrollY: this.popupUtils.getContentScrollY(window),
+ searchText: this.searchText,
+ };
+ yield this.stateService.save(ComponentId, this.state);
+ this.scopeState = {
+ favoriteCiphers: this.favoriteCiphers,
+ noFolderCiphers: this.noFolderCiphers,
+ ciphers: this.ciphers,
+ collectionCounts: this.collectionCounts,
+ folderCounts: this.folderCounts,
+ typeCounts: this.typeCounts,
+ folders: this.folders,
+ collections: this.collections,
+ deletedCount: this.deletedCount,
+ };
+ yield this.stateService.save(ScopeStateId, this.scopeState);
+ });
+ }
+ restoreState() {
+ return __awaiter(this, void 0, void 0, function* () {
+ this.scopeState = yield this.stateService.get(ScopeStateId);
+ if (this.scopeState == null) {
+ return false;
+ }
+ if (this.scopeState.favoriteCiphers != null) {
+ this.favoriteCiphers = this.scopeState.favoriteCiphers;
+ }
+ if (this.scopeState.noFolderCiphers != null) {
+ this.noFolderCiphers = this.scopeState.noFolderCiphers;
+ }
+ if (this.scopeState.ciphers != null) {
+ this.ciphers = this.scopeState.ciphers;
+ }
+ if (this.scopeState.collectionCounts != null) {
+ this.collectionCounts = this.scopeState.collectionCounts;
+ }
+ if (this.scopeState.folderCounts != null) {
+ this.folderCounts = this.scopeState.folderCounts;
+ }
+ if (this.scopeState.typeCounts != null) {
+ this.typeCounts = this.scopeState.typeCounts;
+ }
+ if (this.scopeState.folders != null) {
+ this.folders = this.scopeState.folders;
+ }
+ if (this.scopeState.collections != null) {
+ this.collections = this.scopeState.collections;
+ }
+ if (this.scopeState.deletedCiphers != null) {
+ this.deletedCount = this.scopeState.deletedCount;
+ }
+ return true;
+ });
+ }
+}
+GroupingsComponent.ɵfac = function GroupingsComponent_Factory(t) { return new (t || GroupingsComponent)(_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](jslib_common_abstractions_collection_service__WEBPACK_IMPORTED_MODULE_7__["CollectionService"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](jslib_common_abstractions_folder_service__WEBPACK_IMPORTED_MODULE_8__["FolderService"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](jslib_common_abstractions_storage_service__WEBPACK_IMPORTED_MODULE_12__["StorageService"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](jslib_common_abstractions_user_service__WEBPACK_IMPORTED_MODULE_14__["UserService"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](jslib_common_abstractions_cipher_service__WEBPACK_IMPORTED_MODULE_6__["CipherService"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](_angular_router__WEBPACK_IMPORTED_MODULE_2__["Router"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["NgZone"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](jslib_angular_services_broadcaster_service__WEBPACK_IMPORTED_MODULE_15__["BroadcasterService"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ChangeDetectorRef"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](_angular_router__WEBPACK_IMPORTED_MODULE_2__["ActivatedRoute"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](jslib_common_abstractions_state_service__WEBPACK_IMPORTED_MODULE_11__["StateService"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](_services_popup_utils_service__WEBPACK_IMPORTED_MODULE_17__["PopupUtilsService"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](jslib_common_abstractions_sync_service__WEBPACK_IMPORTED_MODULE_13__["SyncService"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_9__["PlatformUtilsService"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](jslib_common_abstractions_search_service__WEBPACK_IMPORTED_MODULE_10__["SearchService"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](_angular_common__WEBPACK_IMPORTED_MODULE_0__["Location"])); };
+GroupingsComponent.ɵcmp = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdefineComponent"]({ type: GroupingsComponent, selectors: [["app-vault-groupings"]], features: [_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵInheritDefinitionFeature"]], decls: 34, vars: 11, consts: [[1, "left"], [1, "search"], ["id", "search", "autocomplete", "off", "appAutofocus", "", 3, "type", "placeholder", "ngModel", "ngModelChange", "input", "keydown"], [1, "fa", "fa-search"], [1, "right"], ["type", "button", "appBlurClick", "", 3, "appA11yTitle", "click"], ["aria-hidden", "true", 1, "fa", "fa-plus", "fa-lg", "fa-fw"], ["class", "no-items", 4, "ngIf"], [4, "ngIf"], [1, "no-items"], ["class", "fa fa-spinner fa-spin fa-3x", 4, "ngIf"], [1, "fa", "fa-spinner", "fa-spin", "fa-3x"], [1, "fa", "fa-frown-o", "fa-4x"], ["type", "button", 1, "btn", "block", "primary", "link", 3, "click"], ["class", "box list", 4, "ngIf"], [1, "box", "list"], [1, "box-header"], [1, "flex-right"], [1, "box-content", "single-line"], ["type", "button", "appStopClick", "", "appBlurClick", "", 1, "box-content-row", 3, "click"], [1, "row-main"], [1, "icon"], [1, "fa", "fa-fw", "fa-lg", "fa-globe"], [1, "text"], [1, "row-sub-label"], [1, "fa", "fa-chevron-right", "fa-lg", "row-sub-icon"], [1, "fa", "fa-fw", "fa-lg", "fa-credit-card"], [1, "fa", "fa-fw", "fa-lg", "fa-id-card-o"], [1, "fa", "fa-fw", "fa-lg", "fa-sticky-note-o"], [1, "box-content"], [3, "cipher", "title", "onSelected", "launchEvent", 4, "ngFor", "ngForOf"], [3, "cipher", "title", "onSelected", "launchEvent"], ["type", "button", "class", "box-content-row", "appStopClick", "", "appBlurClick", "", 3, "click", 4, "ngFor", "ngForOf"], [1, "fa", "fa-fw", "fa-lg", 3, "ngClass"], [1, "fa", "fa-fw", "fa-lg", "fa-cube"], [1, "fa", "fa-fw", "fa-lg", "fa-trash-o"], ["itemSize", "46", "minBufferPx", "400", "maxBufferPx", "600", 4, "ngIf"], ["itemSize", "46", "minBufferPx", "400", "maxBufferPx", "600"], [1, "box", "list", "full-list"], [3, "cipher", "title", "onSelected", "launchEvent", 4, "cdkVirtualFor", "cdkVirtualForOf"]], template: function GroupingsComponent_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "header");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "div", 0);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](4, "app-pop-out");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](6, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](7, "div", 1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](8, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](9, "input", 2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("ngModelChange", function GroupingsComponent_Template_input_ngModelChange_9_listener($event) { return ctx.searchText = $event; })("input", function GroupingsComponent_Template_input_input_9_listener() { return ctx.search(200); })("keydown", function GroupingsComponent_Template_input_keydown_9_listener($event) { return ctx.closeOnEsc($event); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](10, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](11, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](12, "i", 3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](13, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](14, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](15, "div", 4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](16, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](17, "button", 5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("click", function GroupingsComponent_Template_button_click_17_listener() { return ctx.addCipher(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](18, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](19, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](20, "i", 6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](21, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](22, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](23, "\n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](24, "\n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](25, "content");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](26, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](27, GroupingsComponent_div_27_Template, 6, 2, "div", 7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](28, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](29, GroupingsComponent_ng_container_29_Template, 101, 24, "ng-container", 8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](30, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](31, GroupingsComponent_ng_container_31_Template, 6, 2, "ng-container", 8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](32, "\n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](33, "\n");
+ } if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpropertyInterpolate"]("type", ctx.searchTypeSearch ? "search" : "text");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpropertyInterpolate"]("placeholder", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](10, 7, "searchVault"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngModel", ctx.searchText);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpropertyInterpolate"]("appA11yTitle", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](18, 9, "addItem"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", (!ctx.ciphers || !ctx.ciphers.length) && !ctx.showSearching());
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx.ciphers && ctx.ciphers.length && !ctx.showSearching());
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx.showSearching());
+ } }, directives: [_components_pop_out_component__WEBPACK_IMPORTED_MODULE_18__["PopOutComponent"], _angular_forms__WEBPACK_IMPORTED_MODULE_19__["DefaultValueAccessor"], jslib_angular_directives_autofocus_directive__WEBPACK_IMPORTED_MODULE_20__["AutofocusDirective"], _angular_forms__WEBPACK_IMPORTED_MODULE_19__["NgControlStatus"], _angular_forms__WEBPACK_IMPORTED_MODULE_19__["NgModel"], jslib_angular_directives_blur_click_directive__WEBPACK_IMPORTED_MODULE_21__["BlurClickDirective"], jslib_angular_directives_a11y_title_directive__WEBPACK_IMPORTED_MODULE_22__["A11yTitleDirective"], _angular_common__WEBPACK_IMPORTED_MODULE_0__["NgIf"], jslib_angular_directives_stop_click_directive__WEBPACK_IMPORTED_MODULE_23__["StopClickDirective"], _angular_common__WEBPACK_IMPORTED_MODULE_0__["NgForOf"], _components_cipher_row_component__WEBPACK_IMPORTED_MODULE_24__["CipherRowComponent"], _angular_common__WEBPACK_IMPORTED_MODULE_0__["NgClass"], _angular_cdk_scrolling__WEBPACK_IMPORTED_MODULE_25__["CdkVirtualScrollViewport"], _angular_cdk_scrolling__WEBPACK_IMPORTED_MODULE_25__["CdkFixedSizeVirtualScroll"], jslib_angular_directives_cipherListVirtualScroll_directive__WEBPACK_IMPORTED_MODULE_26__["CipherListVirtualScroll"], _angular_cdk_scrolling__WEBPACK_IMPORTED_MODULE_25__["CdkVirtualForOf"]], pipes: [jslib_angular_pipes_i18n_pipe__WEBPACK_IMPORTED_MODULE_27__["I18nPipe"]], encapsulation: 2 });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵsetClassMetadata"](GroupingsComponent, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Component"],
+ args: [{
+ selector: 'app-vault-groupings',
+ templateUrl: 'groupings.component.html',
+ }]
+ }], function () { return [{ type: jslib_common_abstractions_collection_service__WEBPACK_IMPORTED_MODULE_7__["CollectionService"] }, { type: jslib_common_abstractions_folder_service__WEBPACK_IMPORTED_MODULE_8__["FolderService"] }, { type: jslib_common_abstractions_storage_service__WEBPACK_IMPORTED_MODULE_12__["StorageService"] }, { type: jslib_common_abstractions_user_service__WEBPACK_IMPORTED_MODULE_14__["UserService"] }, { type: jslib_common_abstractions_cipher_service__WEBPACK_IMPORTED_MODULE_6__["CipherService"] }, { type: _angular_router__WEBPACK_IMPORTED_MODULE_2__["Router"] }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["NgZone"] }, { type: jslib_angular_services_broadcaster_service__WEBPACK_IMPORTED_MODULE_15__["BroadcasterService"] }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["ChangeDetectorRef"] }, { type: _angular_router__WEBPACK_IMPORTED_MODULE_2__["ActivatedRoute"] }, { type: jslib_common_abstractions_state_service__WEBPACK_IMPORTED_MODULE_11__["StateService"] }, { type: _services_popup_utils_service__WEBPACK_IMPORTED_MODULE_17__["PopupUtilsService"] }, { type: jslib_common_abstractions_sync_service__WEBPACK_IMPORTED_MODULE_13__["SyncService"] }, { type: jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_9__["PlatformUtilsService"] }, { type: jslib_common_abstractions_search_service__WEBPACK_IMPORTED_MODULE_10__["SearchService"] }, { type: _angular_common__WEBPACK_IMPORTED_MODULE_0__["Location"] }]; }, null); })();
+
+
+/***/ }),
+
+/***/ "./src/popup/vault/password-history.component.ts":
+/*!*******************************************************!*\
+ !*** ./src/popup/vault/password-history.component.ts ***!
+ \*******************************************************/
+/*! exports provided: PasswordHistoryComponent */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PasswordHistoryComponent", function() { return PasswordHistoryComponent; });
+/* harmony import */ var _angular_common__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/common */ "./node_modules/@angular/common/__ivy_ngcc__/fesm2015/common.js");
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var _angular_router__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @angular/router */ "./node_modules/@angular/router/__ivy_ngcc__/fesm2015/router.js");
+/* harmony import */ var rxjs_operators__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! rxjs/operators */ "./node_modules/rxjs/_esm5/operators/index.js");
+/* harmony import */ var jslib_common_abstractions_cipher_service__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! jslib-common/abstractions/cipher.service */ "./jslib/common/src/abstractions/cipher.service.ts");
+/* harmony import */ var jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! jslib-common/abstractions/i18n.service */ "./jslib/common/src/abstractions/i18n.service.ts");
+/* harmony import */ var jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! jslib-common/abstractions/platformUtils.service */ "./jslib/common/src/abstractions/platformUtils.service.ts");
+/* harmony import */ var jslib_angular_components_password_history_component__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! jslib-angular/components/password-history.component */ "./jslib/angular/src/components/password-history.component.ts");
+/* harmony import */ var jslib_angular_directives_blur_click_directive__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! jslib-angular/directives/blur-click.directive */ "./jslib/angular/src/directives/blur-click.directive.ts");
+/* harmony import */ var jslib_angular_directives_stop_click_directive__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! jslib-angular/directives/stop-click.directive */ "./jslib/angular/src/directives/stop-click.directive.ts");
+/* harmony import */ var jslib_angular_directives_a11y_title_directive__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! jslib-angular/directives/a11y-title.directive */ "./jslib/angular/src/directives/a11y-title.directive.ts");
+/* harmony import */ var jslib_angular_pipes_i18n_pipe__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! jslib-angular/pipes/i18n.pipe */ "./jslib/angular/src/pipes/i18n.pipe.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+function PasswordHistoryComponent_div_21_div_4_Template(rf, ctx) { if (rf & 1) {
+ const _r5 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "div", 10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "div", 11);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](4, "div", 12);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](6, "span", 13);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](8, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](9, "span", 14);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](11, "date");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](12, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](13, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](14, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](15, "div", 15);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](16, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](17, "button", 16);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("click", function PasswordHistoryComponent_div_21_div_4_Template_button_click_17_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r5); const h_r3 = ctx.$implicit; const ctx_r4 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](2); return ctx_r4.copy(h_r3.password); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](18, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](19, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](20, "i", 17);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](21, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](22, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](23, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const h_r3 = ctx.$implicit;
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate1"]("\n ", h_r3.password, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind2"](11, 3, h_r3.lastUsedDate, "medium"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpropertyInterpolate"]("appA11yTitle", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](18, 6, "copyPassword"));
+} }
+function PasswordHistoryComponent_div_21_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "div", 7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "div", 8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](4, PasswordHistoryComponent_div_21_div_4_Template, 24, 8, "div", 9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](6, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r0 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngForOf", ctx_r0.history);
+} }
+function PasswordHistoryComponent_div_23_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "div", 18);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "p");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](4, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](4, 1, "noPasswordsInList"));
+} }
+class PasswordHistoryComponent extends jslib_angular_components_password_history_component__WEBPACK_IMPORTED_MODULE_7__["PasswordHistoryComponent"] {
+ constructor(cipherService, platformUtilsService, i18nService, location, route) {
+ super(cipherService, platformUtilsService, i18nService, window);
+ this.location = location;
+ this.route = route;
+ }
+ ngOnInit() {
+ return __awaiter(this, void 0, void 0, function* () {
+ this.route.queryParams.pipe(Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_3__["first"])()).subscribe((params) => __awaiter(this, void 0, void 0, function* () {
+ if (params.cipherId) {
+ this.cipherId = params.cipherId;
+ }
+ else {
+ this.close();
+ }
+ yield this.init();
+ }));
+ });
+ }
+ close() {
+ this.location.back();
+ }
+}
+PasswordHistoryComponent.ɵfac = function PasswordHistoryComponent_Factory(t) { return new (t || PasswordHistoryComponent)(_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](jslib_common_abstractions_cipher_service__WEBPACK_IMPORTED_MODULE_4__["CipherService"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_6__["PlatformUtilsService"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_5__["I18nService"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](_angular_common__WEBPACK_IMPORTED_MODULE_0__["Location"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](_angular_router__WEBPACK_IMPORTED_MODULE_2__["ActivatedRoute"])); };
+PasswordHistoryComponent.ɵcmp = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdefineComponent"]({ type: PasswordHistoryComponent, selectors: [["app-password-history"]], features: [_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵInheritDefinitionFeature"]], decls: 26, vars: 8, consts: [[1, "left"], ["type", "button", "appBlurClick", "", 3, "click"], [1, "center"], [1, "title"], [1, "right"], ["class", "box list full-list", 4, "ngIf"], ["class", "no-items", 4, "ngIf"], [1, "box", "list", "full-list"], [1, "box-content"], ["class", "box-content-row box-content-row-flex", 4, "ngFor", "ngForOf"], [1, "box-content-row", "box-content-row-flex"], [1, "row-main"], [1, "row-main-content"], [1, "text", "monospaced", "no-ellipsis"], [1, "detail"], [1, "action-buttons"], ["type", "button", "appStopClick", "", 1, "row-btn", 3, "appA11yTitle", "click"], ["aria-hidden", "true", 1, "fa", "fa-lg", "fa-clone"], [1, "no-items"]], template: function PasswordHistoryComponent_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "header");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "div", 0);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](4, "button", 1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("click", function PasswordHistoryComponent_Template_button_click_4_listener() { return ctx.close(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](6, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](8, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](9, "div", 2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](10, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](11, "span", 3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](12);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](13, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](14, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](15, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](16, "div", 4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](17, "\n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](18, "\n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](19, "content");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](20, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](21, PasswordHistoryComponent_div_21_Template, 7, 1, "div", 5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](22, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](23, PasswordHistoryComponent_div_23_Template, 6, 3, "div", 6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](24, "\n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](25, "\n");
+ } if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](6, 4, "close"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](13, 6, "passwordHistory"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx.history && ctx.history.length);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", !ctx.history || !ctx.history.length);
+ } }, directives: [jslib_angular_directives_blur_click_directive__WEBPACK_IMPORTED_MODULE_8__["BlurClickDirective"], _angular_common__WEBPACK_IMPORTED_MODULE_0__["NgIf"], _angular_common__WEBPACK_IMPORTED_MODULE_0__["NgForOf"], jslib_angular_directives_stop_click_directive__WEBPACK_IMPORTED_MODULE_9__["StopClickDirective"], jslib_angular_directives_a11y_title_directive__WEBPACK_IMPORTED_MODULE_10__["A11yTitleDirective"]], pipes: [jslib_angular_pipes_i18n_pipe__WEBPACK_IMPORTED_MODULE_11__["I18nPipe"], _angular_common__WEBPACK_IMPORTED_MODULE_0__["DatePipe"]], encapsulation: 2 });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵsetClassMetadata"](PasswordHistoryComponent, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Component"],
+ args: [{
+ selector: 'app-password-history',
+ templateUrl: 'password-history.component.html',
+ }]
+ }], function () { return [{ type: jslib_common_abstractions_cipher_service__WEBPACK_IMPORTED_MODULE_4__["CipherService"] }, { type: jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_6__["PlatformUtilsService"] }, { type: jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_5__["I18nService"] }, { type: _angular_common__WEBPACK_IMPORTED_MODULE_0__["Location"] }, { type: _angular_router__WEBPACK_IMPORTED_MODULE_2__["ActivatedRoute"] }]; }, null); })();
+
+
+/***/ }),
+
+/***/ "./src/popup/vault/share.component.ts":
+/*!********************************************!*\
+ !*** ./src/popup/vault/share.component.ts ***!
+ \********************************************/
+/*! exports provided: ShareComponent */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ShareComponent", function() { return ShareComponent; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var _angular_router__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @angular/router */ "./node_modules/@angular/router/__ivy_ngcc__/fesm2015/router.js");
+/* harmony import */ var rxjs_operators__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! rxjs/operators */ "./node_modules/rxjs/_esm5/operators/index.js");
+/* harmony import */ var jslib_common_abstractions_cipher_service__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! jslib-common/abstractions/cipher.service */ "./jslib/common/src/abstractions/cipher.service.ts");
+/* harmony import */ var jslib_common_abstractions_collection_service__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! jslib-common/abstractions/collection.service */ "./jslib/common/src/abstractions/collection.service.ts");
+/* harmony import */ var jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! jslib-common/abstractions/i18n.service */ "./jslib/common/src/abstractions/i18n.service.ts");
+/* harmony import */ var jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! jslib-common/abstractions/log.service */ "./jslib/common/src/abstractions/log.service.ts");
+/* harmony import */ var jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! jslib-common/abstractions/platformUtils.service */ "./jslib/common/src/abstractions/platformUtils.service.ts");
+/* harmony import */ var jslib_common_abstractions_user_service__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! jslib-common/abstractions/user.service */ "./jslib/common/src/abstractions/user.service.ts");
+/* harmony import */ var jslib_angular_components_share_component__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! jslib-angular/components/share.component */ "./jslib/angular/src/components/share.component.ts");
+/* harmony import */ var _angular_forms__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @angular/forms */ "./node_modules/@angular/forms/__ivy_ngcc__/fesm2015/forms.js");
+/* harmony import */ var jslib_angular_directives_api_action_directive__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! jslib-angular/directives/api-action.directive */ "./jslib/angular/src/directives/api-action.directive.ts");
+/* harmony import */ var jslib_angular_directives_blur_click_directive__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! jslib-angular/directives/blur-click.directive */ "./jslib/angular/src/directives/blur-click.directive.ts");
+/* harmony import */ var _angular_common__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @angular/common */ "./node_modules/@angular/common/__ivy_ngcc__/fesm2015/common.js");
+/* harmony import */ var jslib_angular_directives_box_row_directive__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! jslib-angular/directives/box-row.directive */ "./jslib/angular/src/directives/box-row.directive.ts");
+/* harmony import */ var jslib_angular_pipes_i18n_pipe__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! jslib-angular/pipes/i18n.pipe */ "./jslib/angular/src/pipes/i18n.pipe.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+function ShareComponent_button_21_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "button", 12);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](2, "span", 13);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](4, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](6, "i", 14);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r1 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"]();
+ const _r0 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵreference"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("disabled", _r0.loading || !ctx_r1.canSave);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("hidden", _r0.loading);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](4, 4, "move"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("hidden", !_r0.loading);
+} }
+function ShareComponent_div_29_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "div", 15);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](2, "div", 16);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](4, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate1"]("\n ", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](4, 1, "noOrganizationsList"), "\n ");
+} }
+function ShareComponent_div_31_option_10_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "option", 21);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const o_r6 = ctx.$implicit;
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngValue", o_r6.id);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](o_r6.name);
+} }
+function ShareComponent_div_31_Template(rf, ctx) { if (rf & 1) {
+ const _r8 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "div", 15);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](2, "div", 17);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](4, "label", 18);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](6, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](8, "select", 19);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("ngModelChange", function ShareComponent_div_31_Template_select_ngModelChange_8_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r8); const ctx_r7 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](); return ctx_r7.organizationId = $event; })("change", function ShareComponent_div_31_Template_select_change_8_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r8); const ctx_r9 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](); return ctx_r9.filterCollections(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](9, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](10, ShareComponent_div_31_option_10_Template, 2, 2, "option", 20);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](11, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](12, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](13, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r3 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](6, 3, "organization"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngModel", ctx_r3.organizationId);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngForOf", ctx_r3.organizations);
+} }
+function ShareComponent_div_38_div_6_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "div", 15);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](2, "div", 16);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](4, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate1"]("\n ", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](4, 1, "noCollectionsInList"), "\n ");
+} }
+function ShareComponent_div_38_div_8_div_2_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "div", 24);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](2, "label", 25);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](4, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](5, "input", 26);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("ngModelChange", function ShareComponent_div_38_div_8_div_2_Template_input_ngModelChange_5_listener($event) { const c_r13 = ctx.$implicit; return c_r13.checked = $event; });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](6, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const c_r13 = ctx.$implicit;
+ const i_r14 = ctx.index;
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate1"]("for", "collection_", i_r14, "");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](c_r13.name);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate1"]("id", "collection_", i_r14, "");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate1"]("name", "Collection[", i_r14, "].Checked");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngModel", c_r13.checked);
+} }
+function ShareComponent_div_38_div_8_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "div", 15);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](2, ShareComponent_div_38_div_8_div_2_Template, 7, 5, "div", 23);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r11 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngForOf", ctx_r11.collections);
+} }
+function ShareComponent_div_38_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "div", 8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](2, "div", 22);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](4, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](6, ShareComponent_div_38_div_6_Template, 6, 3, "div", 9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](8, ShareComponent_div_38_div_8_Template, 4, 1, "div", 9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](9, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r4 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate1"]("\n ", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](4, 3, "collections"), "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", !ctx_r4.collections || !ctx_r4.collections.length);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", ctx_r4.collections && ctx_r4.collections.length);
+} }
+class ShareComponent extends jslib_angular_components_share_component__WEBPACK_IMPORTED_MODULE_9__["ShareComponent"] {
+ constructor(collectionService, platformUtilsService, i18nService, userService, cipherService, route, router, logService) {
+ super(collectionService, platformUtilsService, i18nService, userService, cipherService, logService);
+ this.route = route;
+ this.router = router;
+ }
+ ngOnInit() {
+ return __awaiter(this, void 0, void 0, function* () {
+ this.onSharedCipher.subscribe(() => {
+ this.router.navigate(['view-cipher', { cipherId: this.cipherId }]);
+ });
+ this.route.queryParams.pipe(Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_2__["first"])()).subscribe((params) => __awaiter(this, void 0, void 0, function* () {
+ this.cipherId = params.cipherId;
+ yield this.load();
+ }));
+ });
+ }
+ submit() {
+ const _super = Object.create(null, {
+ submit: { get: () => super.submit }
+ });
+ return __awaiter(this, void 0, void 0, function* () {
+ const success = yield _super.submit.call(this);
+ if (success) {
+ this.cancel();
+ }
+ return success;
+ });
+ }
+ cancel() {
+ this.router.navigate(['/view-cipher'], { replaceUrl: true, queryParams: { cipherId: this.cipher.id } });
+ }
+}
+ShareComponent.ɵfac = function ShareComponent_Factory(t) { return new (t || ShareComponent)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_collection_service__WEBPACK_IMPORTED_MODULE_4__["CollectionService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_7__["PlatformUtilsService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_5__["I18nService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_user_service__WEBPACK_IMPORTED_MODULE_8__["UserService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_cipher_service__WEBPACK_IMPORTED_MODULE_3__["CipherService"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_router__WEBPACK_IMPORTED_MODULE_1__["ActivatedRoute"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_router__WEBPACK_IMPORTED_MODULE_1__["Router"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_6__["LogService"])); };
+ShareComponent.ɵcmp = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineComponent"]({ type: ShareComponent, selectors: [["app-vault-share"]], features: [_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵInheritDefinitionFeature"]], decls: 42, vars: 14, consts: [[3, "appApiAction", "ngSubmit"], ["form", ""], [1, "left"], ["type", "button", "appBlurClick", "", 3, "click"], [1, "center"], [1, "title"], [1, "right"], ["type", "submit", "appBlurClick", "", 3, "disabled", 4, "ngIf"], [1, "box"], ["class", "box-content", 4, "ngIf"], [1, "box-footer"], ["class", "box", 4, "ngIf"], ["type", "submit", "appBlurClick", "", 3, "disabled"], [3, "hidden"], ["aria-hidden", "true", 1, "fa", "fa-spinner", "fa-lg", "fa-spin", 3, "hidden"], [1, "box-content"], [1, "box-content-row", "padded", "no-hover"], ["appBoxRow", "", 1, "box-content-row"], ["for", "organization"], ["id", "organization", "name", "OrganizationId", 3, "ngModel", "ngModelChange", "change"], [3, "ngValue", 4, "ngFor", "ngForOf"], [3, "ngValue"], [1, "box-header"], ["class", "box-content-row box-content-row-checkbox", "appBoxRow", "", 4, "ngFor", "ngForOf"], ["appBoxRow", "", 1, "box-content-row", "box-content-row-checkbox"], [3, "for"], ["type", "checkbox", 3, "id", "ngModel", "name", "ngModelChange"]], template: function ShareComponent_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "form", 0, 1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("ngSubmit", function ShareComponent_Template_form_ngSubmit_0_listener() { return ctx.submit(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](2, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](3, "header");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](4, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](5, "div", 2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](6, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](7, "button", 3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("click", function ShareComponent_Template_button_click_7_listener() { return ctx.cancel(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](9, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](10, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](11, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](12, "div", 4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](13, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](14, "span", 5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](15);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](16, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](17, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](18, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](19, "div", 6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](20, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](21, ShareComponent_button_21_Template, 8, 6, "button", 7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](22, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](23, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](24, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](25, "content");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](26, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](27, "div", 8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](28, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](29, ShareComponent_div_29_Template, 6, 3, "div", 9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](30, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](31, ShareComponent_div_31_Template, 14, 5, "div", 9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](32, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](33, "div", 10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](34);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](35, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](36, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](37, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](38, ShareComponent_div_38_Template, 10, 5, "div", 11);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](39, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](40, "\n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](41, "\n");
+ } if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("appApiAction", ctx.formPromise);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](9, 8, "cancel"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](16, 10, "moveToOrganization"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", ctx.organizations && ctx.organizations.length);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", !ctx.organizations || !ctx.organizations.length);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", ctx.organizations && ctx.organizations.length);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate1"]("\n ", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](35, 12, "moveToOrgDesc"), "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", ctx.organizations && ctx.organizations.length);
+ } }, directives: [_angular_forms__WEBPACK_IMPORTED_MODULE_10__["ɵangular_packages_forms_forms_ba"], _angular_forms__WEBPACK_IMPORTED_MODULE_10__["NgControlStatusGroup"], _angular_forms__WEBPACK_IMPORTED_MODULE_10__["NgForm"], jslib_angular_directives_api_action_directive__WEBPACK_IMPORTED_MODULE_11__["ApiActionDirective"], jslib_angular_directives_blur_click_directive__WEBPACK_IMPORTED_MODULE_12__["BlurClickDirective"], _angular_common__WEBPACK_IMPORTED_MODULE_13__["NgIf"], jslib_angular_directives_box_row_directive__WEBPACK_IMPORTED_MODULE_14__["BoxRowDirective"], _angular_forms__WEBPACK_IMPORTED_MODULE_10__["SelectControlValueAccessor"], _angular_forms__WEBPACK_IMPORTED_MODULE_10__["NgControlStatus"], _angular_forms__WEBPACK_IMPORTED_MODULE_10__["NgModel"], _angular_common__WEBPACK_IMPORTED_MODULE_13__["NgForOf"], _angular_forms__WEBPACK_IMPORTED_MODULE_10__["NgSelectOption"], _angular_forms__WEBPACK_IMPORTED_MODULE_10__["ɵangular_packages_forms_forms_z"], _angular_forms__WEBPACK_IMPORTED_MODULE_10__["CheckboxControlValueAccessor"]], pipes: [jslib_angular_pipes_i18n_pipe__WEBPACK_IMPORTED_MODULE_15__["I18nPipe"]], encapsulation: 2 });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](ShareComponent, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Component"],
+ args: [{
+ selector: 'app-vault-share',
+ templateUrl: 'share.component.html',
+ }]
+ }], function () { return [{ type: jslib_common_abstractions_collection_service__WEBPACK_IMPORTED_MODULE_4__["CollectionService"] }, { type: jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_7__["PlatformUtilsService"] }, { type: jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_5__["I18nService"] }, { type: jslib_common_abstractions_user_service__WEBPACK_IMPORTED_MODULE_8__["UserService"] }, { type: jslib_common_abstractions_cipher_service__WEBPACK_IMPORTED_MODULE_3__["CipherService"] }, { type: _angular_router__WEBPACK_IMPORTED_MODULE_1__["ActivatedRoute"] }, { type: _angular_router__WEBPACK_IMPORTED_MODULE_1__["Router"] }, { type: jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_6__["LogService"] }]; }, null); })();
+
+
+/***/ }),
+
+/***/ "./src/popup/vault/view-custom-fields.component.ts":
+/*!*********************************************************!*\
+ !*** ./src/popup/vault/view-custom-fields.component.ts ***!
+ \*********************************************************/
+/*! exports provided: ViewCustomFieldsComponent */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ViewCustomFieldsComponent", function() { return ViewCustomFieldsComponent; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var jslib_common_abstractions_event_service__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! jslib-common/abstractions/event.service */ "./jslib/common/src/abstractions/event.service.ts");
+/* harmony import */ var jslib_angular_components_view_custom_fields_component__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! jslib-angular/components/view-custom-fields.component */ "./jslib/angular/src/components/view-custom-fields.component.ts");
+/* harmony import */ var _angular_common__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @angular/common */ "./node_modules/@angular/common/__ivy_ngcc__/fesm2015/common.js");
+/* harmony import */ var jslib_angular_directives_a11y_title_directive__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! jslib-angular/directives/a11y-title.directive */ "./jslib/angular/src/directives/a11y-title.directive.ts");
+/* harmony import */ var jslib_angular_directives_stop_click_directive__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! jslib-angular/directives/stop-click.directive */ "./jslib/angular/src/directives/stop-click.directive.ts");
+/* harmony import */ var jslib_angular_pipes_i18n_pipe__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! jslib-angular/pipes/i18n.pipe */ "./jslib/angular/src/pipes/i18n.pipe.ts");
+
+
+
+
+
+
+
+
+
+function ViewCustomFieldsComponent_div_8_div_7_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "div");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const field_r1 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"]().$implicit;
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate1"]("\n ", field_r1.value || "\u00A0", "\n ");
+} }
+function ViewCustomFieldsComponent_div_8_div_9_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "div");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](2, "span", 10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](4, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](5, "span", 11);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const field_r1 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"]().$implicit;
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("hidden", !field_r1.showValue);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](field_r1.value);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("hidden", field_r1.showValue);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](field_r1.maskedValue);
+} }
+function ViewCustomFieldsComponent_div_8_div_11_i_2_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](0, "i", 15);
+} }
+function ViewCustomFieldsComponent_div_8_div_11_i_4_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](0, "i", 16);
+} }
+function ViewCustomFieldsComponent_div_8_div_11_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "div");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](2, ViewCustomFieldsComponent_div_8_div_11_i_2_Template, 1, 0, "i", 12);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](4, ViewCustomFieldsComponent_div_8_div_11_i_4_Template, 1, 0, "i", 13);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](6, "span", 14);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](8, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const field_r1 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"]().$implicit;
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", field_r1.value === "true");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", field_r1.value !== "true");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](field_r1.value);
+} }
+function ViewCustomFieldsComponent_div_8_div_13_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "div", 17);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](2, "div", 18);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](4, "i", 19);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](5, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](6, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](7, "span", 14);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](9, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](10, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](11, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](12, "span");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](13);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](14, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](15, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const field_r1 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"]().$implicit;
+ const ctx_r5 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate"]("appA11yTitle", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](5, 3, "linkedValue"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](9, 5, "linkedValue"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](14, 7, ctx_r5.cipher.linkedFieldI18nKey(field_r1.linkedId)));
+} }
+const _c0 = function (a0, a1) { return { "fa-eye": a0, "fa-eye-slash": a1 }; };
+function ViewCustomFieldsComponent_div_8_button_18_Template(rf, ctx) { if (rf & 1) {
+ const _r16 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "button", 20);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("click", function ViewCustomFieldsComponent_div_8_button_18_Template_button_click_0_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r16); const field_r1 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"]().$implicit; const ctx_r14 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](); return ctx_r14.toggleFieldValue(field_r1); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](1, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](2, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](3, "i", 21);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](4, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const field_r1 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"]().$implicit;
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate"]("appA11yTitle", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](1, 2, "toggleVisibility"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngClass", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpureFunction2"](4, _c0, !field_r1.showValue, field_r1.showValue));
+} }
+function ViewCustomFieldsComponent_div_8_button_20_Template(rf, ctx) { if (rf & 1) {
+ const _r20 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "button", 20);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵlistener"]("click", function ViewCustomFieldsComponent_div_8_button_20_Template_button_click_0_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵrestoreView"](_r20); const field_r1 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"]().$implicit; const ctx_r18 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"](); return ctx_r18.copy(field_r1.value, "value", field_r1.type === ctx_r18.fieldType.Hidden ? "H_Field" : "Field"); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](1, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](2, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelement"](3, "i", 22);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](4, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpropertyInterpolate"]("appA11yTitle", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](1, 1, "copyValue"));
+} }
+function ViewCustomFieldsComponent_div_8_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](0, "div", 3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](2, "div", 4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](4, "span", 5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](6, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](7, ViewCustomFieldsComponent_div_8_div_7_Template, 2, 1, "div", 6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](8, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](9, ViewCustomFieldsComponent_div_8_div_9_Template, 8, 4, "div", 6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](10, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](11, ViewCustomFieldsComponent_div_8_div_11_Template, 9, 3, "div", 6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](12, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](13, ViewCustomFieldsComponent_div_8_div_13_Template, 16, 9, "div", 7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](14, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](15, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](16, "div", 8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](17, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](18, ViewCustomFieldsComponent_div_8_button_18_Template, 5, 7, "button", 9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](19, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](20, ViewCustomFieldsComponent_div_8_button_20_Template, 5, 3, "button", 9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](21, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](22, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const field_r1 = ctx.$implicit;
+ const ctx_r0 = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵnextContext"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate"](field_r1.name);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", field_r1.type === ctx_r0.fieldType.Text);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", field_r1.type === ctx_r0.fieldType.Hidden);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", field_r1.type === ctx_r0.fieldType.Boolean);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", field_r1.type === ctx_r0.fieldType.Linked);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", field_r1.type === ctx_r0.fieldType.Hidden && ctx_r0.cipher.viewPassword);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngIf", field_r1.value && field_r1.type !== ctx_r0.fieldType.Boolean && field_r1.type !== ctx_r0.fieldType.Linked && !(field_r1.type === ctx_r0.fieldType.Hidden && !ctx_r0.cipher.viewPassword));
+} }
+class ViewCustomFieldsComponent extends jslib_angular_components_view_custom_fields_component__WEBPACK_IMPORTED_MODULE_2__["ViewCustomFieldsComponent"] {
+ constructor(eventService) {
+ super(eventService);
+ }
+}
+ViewCustomFieldsComponent.ɵfac = function ViewCustomFieldsComponent_Factory(t) { return new (t || ViewCustomFieldsComponent)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](jslib_common_abstractions_event_service__WEBPACK_IMPORTED_MODULE_1__["EventService"])); };
+ViewCustomFieldsComponent.ɵcmp = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineComponent"]({ type: ViewCustomFieldsComponent, selectors: [["app-vault-view-custom-fields"]], features: [_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵInheritDefinitionFeature"]], decls: 12, vars: 4, consts: [[1, "box-header"], [1, "box-content"], ["class", "box-content-row box-content-row-flex", 4, "ngFor", "ngForOf"], [1, "box-content-row", "box-content-row-flex"], [1, "row-main"], [1, "row-label"], [4, "ngIf"], ["class", "box-content-row-flex", 4, "ngIf"], [1, "action-buttons"], ["type", "button", "class", "row-btn", "appStopClick", "", 3, "appA11yTitle", "click", 4, "ngIf"], [1, "monospaced", "show-whitespace", 3, "hidden"], [1, "monospaced", 3, "hidden"], ["class", "fa fa-check-square-o", "aria-hidden", "true", 4, "ngIf"], ["class", "fa fa-square-o", "aria-hidden", "true", 4, "ngIf"], [1, "sr-only"], ["aria-hidden", "true", 1, "fa", "fa-check-square-o"], ["aria-hidden", "true", 1, "fa", "fa-square-o"], [1, "box-content-row-flex"], [1, "icon", "icon-small"], ["aria-hidden", "true", 1, "fa", "fa-link", 3, "appA11yTitle"], ["type", "button", "appStopClick", "", 1, "row-btn", 3, "appA11yTitle", "click"], ["aria-hidden", "true", 1, "fa", "fa-lg", 3, "ngClass"], ["aria-hidden", "true", 1, "fa", "fa-lg", "fa-clone"]], template: function ViewCustomFieldsComponent_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementContainerStart"](0);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](2, "div", 0);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipe"](4, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementStart"](6, "div", 1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtemplate"](8, ViewCustomFieldsComponent_div_8_Template, 23, 7, "div", 2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](9, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](10, "\n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵelementContainerEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtext"](11, "\n");
+ } if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵtextInterpolate1"]("\n ", _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵpipeBind1"](4, 2, "customFields"), "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵproperty"]("ngForOf", ctx.cipher.fields);
+ } }, directives: [_angular_common__WEBPACK_IMPORTED_MODULE_3__["NgForOf"], _angular_common__WEBPACK_IMPORTED_MODULE_3__["NgIf"], jslib_angular_directives_a11y_title_directive__WEBPACK_IMPORTED_MODULE_4__["A11yTitleDirective"], jslib_angular_directives_stop_click_directive__WEBPACK_IMPORTED_MODULE_5__["StopClickDirective"], _angular_common__WEBPACK_IMPORTED_MODULE_3__["NgClass"]], pipes: [jslib_angular_pipes_i18n_pipe__WEBPACK_IMPORTED_MODULE_6__["I18nPipe"]], encapsulation: 2 });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](ViewCustomFieldsComponent, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Component"],
+ args: [{
+ selector: 'app-vault-view-custom-fields',
+ templateUrl: 'view-custom-fields.component.html',
+ }]
+ }], function () { return [{ type: jslib_common_abstractions_event_service__WEBPACK_IMPORTED_MODULE_1__["EventService"] }]; }, null); })();
+
+
+/***/ }),
+
+/***/ "./src/popup/vault/view.component.ts":
+/*!*******************************************!*\
+ !*** ./src/popup/vault/view.component.ts ***!
+ \*******************************************/
+/*! exports provided: ViewComponent */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ViewComponent", function() { return ViewComponent; });
+/* harmony import */ var _angular_common__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/common */ "./node_modules/@angular/common/__ivy_ngcc__/fesm2015/common.js");
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var _angular_router__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @angular/router */ "./node_modules/@angular/router/__ivy_ngcc__/fesm2015/router.js");
+/* harmony import */ var rxjs_operators__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! rxjs/operators */ "./node_modules/rxjs/_esm5/operators/index.js");
+/* harmony import */ var jslib_common_abstractions_api_service__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! jslib-common/abstractions/api.service */ "./jslib/common/src/abstractions/api.service.ts");
+/* harmony import */ var jslib_common_abstractions_audit_service__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! jslib-common/abstractions/audit.service */ "./jslib/common/src/abstractions/audit.service.ts");
+/* harmony import */ var jslib_common_abstractions_cipher_service__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! jslib-common/abstractions/cipher.service */ "./jslib/common/src/abstractions/cipher.service.ts");
+/* harmony import */ var jslib_common_abstractions_crypto_service__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! jslib-common/abstractions/crypto.service */ "./jslib/common/src/abstractions/crypto.service.ts");
+/* harmony import */ var jslib_common_abstractions_event_service__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! jslib-common/abstractions/event.service */ "./jslib/common/src/abstractions/event.service.ts");
+/* harmony import */ var jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! jslib-common/abstractions/i18n.service */ "./jslib/common/src/abstractions/i18n.service.ts");
+/* harmony import */ var jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! jslib-common/abstractions/log.service */ "./jslib/common/src/abstractions/log.service.ts");
+/* harmony import */ var jslib_common_abstractions_messaging_service__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! jslib-common/abstractions/messaging.service */ "./jslib/common/src/abstractions/messaging.service.ts");
+/* harmony import */ var jslib_common_abstractions_passwordReprompt_service__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! jslib-common/abstractions/passwordReprompt.service */ "./jslib/common/src/abstractions/passwordReprompt.service.ts");
+/* harmony import */ var jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! jslib-common/abstractions/platformUtils.service */ "./jslib/common/src/abstractions/platformUtils.service.ts");
+/* harmony import */ var jslib_common_abstractions_token_service__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! jslib-common/abstractions/token.service */ "./jslib/common/src/abstractions/token.service.ts");
+/* harmony import */ var jslib_common_abstractions_totp_service__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! jslib-common/abstractions/totp.service */ "./jslib/common/src/abstractions/totp.service.ts");
+/* harmony import */ var jslib_common_abstractions_user_service__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! jslib-common/abstractions/user.service */ "./jslib/common/src/abstractions/user.service.ts");
+/* harmony import */ var jslib_angular_services_broadcaster_service__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! jslib-angular/services/broadcaster.service */ "./jslib/angular/src/services/broadcaster.service.ts");
+/* harmony import */ var jslib_common_models_view_loginUriView__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! jslib-common/models/view/loginUriView */ "./jslib/common/src/models/view/loginUriView.ts");
+/* harmony import */ var jslib_common_enums_cipherType__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! jslib-common/enums/cipherType */ "./jslib/common/src/enums/cipherType.ts");
+/* harmony import */ var jslib_angular_components_view_component__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! jslib-angular/components/view.component */ "./jslib/angular/src/components/view.component.ts");
+/* harmony import */ var _browser_browserApi__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../../browser/browserApi */ "./src/browser/browserApi.ts");
+/* harmony import */ var _services_abstractions_autofill_service__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ../../services/abstractions/autofill.service */ "./src/services/abstractions/autofill.service.ts");
+/* harmony import */ var _services_popup_utils_service__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ../services/popup-utils.service */ "./src/popup/services/popup-utils.service.ts");
+/* harmony import */ var jslib_angular_directives_blur_click_directive__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! jslib-angular/directives/blur-click.directive */ "./jslib/angular/src/directives/blur-click.directive.ts");
+/* harmony import */ var jslib_angular_directives_stop_click_directive__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! jslib-angular/directives/stop-click.directive */ "./jslib/angular/src/directives/stop-click.directive.ts");
+/* harmony import */ var jslib_angular_directives_a11y_title_directive__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! jslib-angular/directives/a11y-title.directive */ "./jslib/angular/src/directives/a11y-title.directive.ts");
+/* harmony import */ var jslib_angular_directives_select_copy_directive__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! jslib-angular/directives/select-copy.directive */ "./jslib/angular/src/directives/select-copy.directive.ts");
+/* harmony import */ var jslib_angular_directives_api_action_directive__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! jslib-angular/directives/api-action.directive */ "./jslib/angular/src/directives/api-action.directive.ts");
+/* harmony import */ var _view_custom_fields_component__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ./view-custom-fields.component */ "./src/popup/vault/view-custom-fields.component.ts");
+/* harmony import */ var jslib_angular_pipes_i18n_pipe__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! jslib-angular/pipes/i18n.pipe */ "./jslib/angular/src/pipes/i18n.pipe.ts");
+/* harmony import */ var jslib_angular_pipes_color_password_pipe__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! jslib-angular/pipes/color-password.pipe */ "./jslib/angular/src/pipes/color-password.pipe.ts");
+var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+function ViewComponent_div_16_button_2_Template(rf, ctx) { if (rf & 1) {
+ const _r4 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "button", 1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("click", function ViewComponent_div_16_button_2_Template_button_click_0_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r4); const ctx_r3 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](2); return ctx_r3.edit(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](2, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](2, 1, "edit"));
+} }
+function ViewComponent_div_16_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "div", 6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](2, ViewComponent_div_16_button_2_Template, 3, 3, "button", 7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r0 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", !ctx_r0.cipher.isDeleted);
+} }
+function ViewComponent_content_19_div_20_div_2_Template(rf, ctx) { if (rf & 1) {
+ const _r23 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "div", 26);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "div", 27);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](4, "span", 28);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("dragstart", function ViewComponent_content_19_div_20_div_2_Template_span_dragstart_4_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r23); const ctx_r22 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](3); return ctx_r22.setTextDataOnDrag($event, ctx_r22.cipher.login.username); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](6, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](8, "input", 13);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](9, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](10, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](11, "div", 29);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](12, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](13, "button", 30);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("click", function ViewComponent_content_19_div_20_div_2_Template_button_click_13_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r23); const ctx_r24 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](3); return ctx_r24.copy(ctx_r24.cipher.login.username, "username", "Username"); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](14, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](15, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](16, "i", 31);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](17, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](18, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](19, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r19 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate1"]("", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](6, 3, "username"), "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("value", ctx_r19.cipher.login.username);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpropertyInterpolate"]("appA11yTitle", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](14, 5, "copyUsername"));
+} }
+function ViewComponent_content_19_div_20_div_4_button_17_Template(rf, ctx) { if (rf & 1) {
+ const _r30 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "button", 36, 37);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("click", function ViewComponent_content_19_div_20_div_4_button_17_Template_button_click_0_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r30); const ctx_r29 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](4); return ctx_r29.checkPassword(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](2, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](4, "i", 38);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](6, "i", 39);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const _r28 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵreference"](1);
+ const ctx_r25 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpropertyInterpolate"]("appA11yTitle", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](2, 5, "checkPassword"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("appApiAction", ctx_r25.checkPasswordPromise)("disabled", _r28.loading);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("hidden", _r28.loading);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("hidden", !_r28.loading);
+} }
+const _c0 = function (a0, a1) { return { "fa-eye": a0, "fa-eye-slash": a1 }; };
+function ViewComponent_content_19_div_20_div_4_button_19_Template(rf, ctx) { if (rf & 1) {
+ const _r32 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "button", 30);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("click", function ViewComponent_content_19_div_20_div_4_button_19_Template_button_click_0_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r32); const ctx_r31 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](4); return ctx_r31.togglePassword(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](1, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](2, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](3, "i", 40);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](4, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r26 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpropertyInterpolate"]("appA11yTitle", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](1, 2, "toggleVisibility"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngClass", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpureFunction2"](4, _c0, !ctx_r26.showPassword, ctx_r26.showPassword));
+} }
+function ViewComponent_content_19_div_20_div_4_button_21_Template(rf, ctx) { if (rf & 1) {
+ const _r34 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "button", 30);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("click", function ViewComponent_content_19_div_20_div_4_button_21_Template_button_click_0_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r34); const ctx_r33 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](4); return ctx_r33.copy(ctx_r33.cipher.login.password, "password", "Password"); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](1, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](2, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](3, "i", 31);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](4, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpropertyInterpolate"]("appA11yTitle", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](1, 1, "copyPassword"));
+} }
+function ViewComponent_content_19_div_20_div_4_Template(rf, ctx) { if (rf & 1) {
+ const _r36 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "div", 26);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "div", 27);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](4, "span", 28);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("dragstart", function ViewComponent_content_19_div_20_div_4_Template_span_dragstart_4_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r36); const ctx_r35 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](3); return ctx_r35.setTextDataOnDrag($event, ctx_r35.cipher.login.password); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](6, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](8, "div", 32);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](10, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](11, "div", 33);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](12, "colorPassword");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](13, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](14, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](15, "div", 29);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](16, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](17, ViewComponent_content_19_div_20_div_4_button_17_Template, 8, 7, "button", 34);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](18, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](19, ViewComponent_content_19_div_20_div_4_button_19_Template, 5, 7, "button", 35);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](20, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](21, ViewComponent_content_19_div_20_div_4_button_21_Template, 5, 3, "button", 35);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](22, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](23, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r20 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](6, 8, "password"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("hidden", ctx_r20.showPassword);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate1"]("\n ", ctx_r20.cipher.login.maskedPassword, "");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("hidden", !ctx_r20.showPassword)("innerHTML", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](12, 10, ctx_r20.cipher.login.password), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵsanitizeHtml"]);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx_r20.cipher.viewPassword);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx_r20.cipher.viewPassword);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx_r20.cipher.viewPassword);
+} }
+const _c1 = function (a0) { return { "low": a0 }; };
+const _c2 = function (a0) { return { "stroke-dashoffset.px": a0 }; };
+function ViewComponent_content_19_div_20_div_6_Template(rf, ctx) { if (rf & 1) {
+ const _r38 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "div", 41);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "div", 27);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](4, "span", 28);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("dragstart", function ViewComponent_content_19_div_20_div_6_Template_span_dragstart_4_listener($event) { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r38); const ctx_r37 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](3); return ctx_r37.setTextDataOnDrag($event, ctx_r37.totpCode); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](6, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](8, "span", 42);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](10, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](11, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](12, "span", 43);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](13, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](14, "span", 44);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](15);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](16, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnamespaceSVG"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](17, "svg");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](18, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](19, "g");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](20, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](21, "circle", 45);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](22, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](23, "circle", 46);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](24, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](25, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](26, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](27, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnamespaceHTML"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](28, "div", 29);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](29, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](30, "button", 30);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("click", function ViewComponent_content_19_div_20_div_6_Template_button_click_30_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r38); const ctx_r39 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](3); return ctx_r39.copy(ctx_r39.totpCode, "verificationCodeTotp", "TOTP"); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](31, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](32, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](33, "i", 31);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](34, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](35, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](36, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r21 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngClass", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpureFunction1"](10, _c1, ctx_r21.totpLow));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](6, 6, "verificationCodeTotp"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](ctx_r21.totpCodeFormatted);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](ctx_r21.totpSec);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngStyle", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpureFunction1"](12, _c2, ctx_r21.totpDash));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpropertyInterpolate"]("appA11yTitle", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](31, 8, "copyVerificationCode"));
+} }
+function ViewComponent_content_19_div_20_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "div");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](2, ViewComponent_content_19_div_20_div_2_Template, 20, 7, "div", 24);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](4, ViewComponent_content_19_div_20_div_4_Template, 24, 12, "div", 24);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](6, ViewComponent_content_19_div_20_div_6_Template, 37, 14, "div", 25);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r5 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx_r5.cipher.login.username);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx_r5.cipher.login.password);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx_r5.cipher.login.totp && ctx_r5.totpCode);
+} }
+function ViewComponent_content_19_div_23_div_2_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "div", 11);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "span", 12);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](4, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r40 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](4, 2, "cardholderName"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate1"]("\n ", ctx_r40.cipher.card.cardholderName, "\n ");
+} }
+function ViewComponent_content_19_div_23_div_4_Template(rf, ctx) { if (rf & 1) {
+ const _r46 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "div", 26);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "div", 27);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](4, "span", 12);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](6, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](8, "span", 32);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](10, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](11, "span", 32);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](12);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](13, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](14, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](15, "div", 29);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](16, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](17, "button", 30);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("click", function ViewComponent_content_19_div_23_div_4_Template_button_click_17_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r46); const ctx_r45 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](3); return ctx_r45.toggleCardNumber(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](18, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](19, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](20, "i", 40);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](21, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](22, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](23, "button", 30);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("click", function ViewComponent_content_19_div_23_div_4_Template_button_click_23_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r46); const ctx_r47 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](3); return ctx_r47.copy(ctx_r47.cipher.card.number, "number", "Card Number"); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](24, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](25, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](26, "i", 31);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](27, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](28, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](29, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r41 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](6, 8, "number"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("hidden", ctx_r41.showCardNumber);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](ctx_r41.cipher.card.maskedNumber);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("hidden", !ctx_r41.showCardNumber);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](ctx_r41.cipher.card.number);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpropertyInterpolate"]("appA11yTitle", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](18, 10, "toggleVisibility"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngClass", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpureFunction2"](14, _c0, !ctx_r41.showCardNumber, ctx_r41.showCardNumber));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpropertyInterpolate"]("appA11yTitle", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](24, 12, "copyNumber"));
+} }
+function ViewComponent_content_19_div_23_div_6_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "div", 11);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "span", 12);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](4, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r42 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](4, 2, "brand"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate1"]("\n ", ctx_r42.cipher.card.brand, "\n ");
+} }
+function ViewComponent_content_19_div_23_div_8_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "div", 11);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "span", 12);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](4, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r43 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](4, 2, "expiration"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate1"]("\n ", ctx_r43.cipher.card.expiration, "\n ");
+} }
+function ViewComponent_content_19_div_23_div_10_Template(rf, ctx) { if (rf & 1) {
+ const _r49 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "div", 26);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "div", 27);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](4, "span", 12);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](6, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](8, "span", 32);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](10, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](11, "span", 32);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](12);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](13, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](14, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](15, "div", 29);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](16, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](17, "button", 30);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("click", function ViewComponent_content_19_div_23_div_10_Template_button_click_17_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r49); const ctx_r48 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](3); return ctx_r48.toggleCardCode(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](18, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](19, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](20, "i", 40);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](21, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](22, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](23, "button", 30);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("click", function ViewComponent_content_19_div_23_div_10_Template_button_click_23_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r49); const ctx_r50 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](3); return ctx_r50.copy(ctx_r50.cipher.card.code, "securityCode", "Security Code"); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](24, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](25, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](26, "i", 31);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](27, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](28, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](29, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r44 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](6, 8, "securityCode"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("hidden", ctx_r44.showCardCode);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](ctx_r44.cipher.card.maskedCode);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("hidden", !ctx_r44.showCardCode);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](ctx_r44.cipher.card.code);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpropertyInterpolate"]("appA11yTitle", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](18, 10, "toggleVisibility"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngClass", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpureFunction2"](14, _c0, !ctx_r44.showCardCode, ctx_r44.showCardCode));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpropertyInterpolate"]("appA11yTitle", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](24, 12, "copySecurityCode"));
+} }
+function ViewComponent_content_19_div_23_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "div");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](2, ViewComponent_content_19_div_23_div_2_Template, 6, 4, "div", 47);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](4, ViewComponent_content_19_div_23_div_4_Template, 30, 17, "div", 24);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](6, ViewComponent_content_19_div_23_div_6_Template, 6, 4, "div", 47);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](8, ViewComponent_content_19_div_23_div_8_Template, 6, 4, "div", 47);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](9, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](10, ViewComponent_content_19_div_23_div_10_Template, 30, 17, "div", 24);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](11, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r6 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx_r6.cipher.card.cardholderName);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx_r6.cipher.card.number);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx_r6.cipher.card.brand);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx_r6.cipher.card.expiration);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx_r6.cipher.card.code);
+} }
+function ViewComponent_content_19_div_26_div_2_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "div", 11);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "span", 12);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](4, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r51 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](4, 2, "identityName"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate1"]("\n ", ctx_r51.cipher.identity.fullName, "\n ");
+} }
+function ViewComponent_content_19_div_26_div_4_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "div", 11);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "span", 12);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](4, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r52 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](4, 2, "username"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate1"]("\n ", ctx_r52.cipher.identity.username, "\n ");
+} }
+function ViewComponent_content_19_div_26_div_6_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "div", 11);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "span", 12);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](4, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r53 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](4, 2, "company"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate1"]("\n ", ctx_r53.cipher.identity.company, "\n ");
+} }
+function ViewComponent_content_19_div_26_div_8_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "div", 11);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "span", 12);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](4, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r54 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](4, 2, "ssn"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate1"]("\n ", ctx_r54.cipher.identity.ssn, "\n ");
+} }
+function ViewComponent_content_19_div_26_div_10_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "div", 11);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "span", 12);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](4, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r55 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](4, 2, "passportNumber"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate1"]("\n ", ctx_r55.cipher.identity.passportNumber, "\n ");
+} }
+function ViewComponent_content_19_div_26_div_12_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "div", 11);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "span", 12);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](4, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r56 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](4, 2, "licenseNumber"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate1"]("\n ", ctx_r56.cipher.identity.licenseNumber, "\n ");
+} }
+function ViewComponent_content_19_div_26_div_14_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "div", 11);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "span", 12);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](4, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r57 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](4, 2, "email"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate1"]("\n ", ctx_r57.cipher.identity.email, "\n ");
+} }
+function ViewComponent_content_19_div_26_div_16_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "div", 11);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "span", 12);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](4, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r58 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](4, 2, "phone"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate1"]("\n ", ctx_r58.cipher.identity.phone, "\n ");
+} }
+function ViewComponent_content_19_div_26_div_18_div_6_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "div");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r60 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](ctx_r60.cipher.identity.address1);
+} }
+function ViewComponent_content_19_div_26_div_18_div_8_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "div");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r61 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](ctx_r61.cipher.identity.address2);
+} }
+function ViewComponent_content_19_div_26_div_18_div_10_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "div");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r62 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](ctx_r62.cipher.identity.address3);
+} }
+function ViewComponent_content_19_div_26_div_18_div_12_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "div");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r63 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](ctx_r63.cipher.identity.fullAddressPart2);
+} }
+function ViewComponent_content_19_div_26_div_18_div_14_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "div");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r64 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](ctx_r64.cipher.identity.country);
+} }
+function ViewComponent_content_19_div_26_div_18_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "div", 11);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "span", 12);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](4, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](6, ViewComponent_content_19_div_26_div_18_div_6_Template, 2, 1, "div", 5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](8, ViewComponent_content_19_div_26_div_18_div_8_Template, 2, 1, "div", 5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](9, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](10, ViewComponent_content_19_div_26_div_18_div_10_Template, 2, 1, "div", 5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](11, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](12, ViewComponent_content_19_div_26_div_18_div_12_Template, 2, 1, "div", 5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](13, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](14, ViewComponent_content_19_div_26_div_18_div_14_Template, 2, 1, "div", 5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](15, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r59 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](4, 6, "address"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx_r59.cipher.identity.address1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx_r59.cipher.identity.address2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx_r59.cipher.identity.address3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx_r59.cipher.identity.fullAddressPart2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx_r59.cipher.identity.country);
+} }
+function ViewComponent_content_19_div_26_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "div");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](2, ViewComponent_content_19_div_26_div_2_Template, 6, 4, "div", 47);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](4, ViewComponent_content_19_div_26_div_4_Template, 6, 4, "div", 47);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](6, ViewComponent_content_19_div_26_div_6_Template, 6, 4, "div", 47);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](8, ViewComponent_content_19_div_26_div_8_Template, 6, 4, "div", 47);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](9, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](10, ViewComponent_content_19_div_26_div_10_Template, 6, 4, "div", 47);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](11, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](12, ViewComponent_content_19_div_26_div_12_Template, 6, 4, "div", 47);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](13, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](14, ViewComponent_content_19_div_26_div_14_Template, 6, 4, "div", 47);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](15, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](16, ViewComponent_content_19_div_26_div_16_Template, 6, 4, "div", 47);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](17, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](18, ViewComponent_content_19_div_26_div_18_Template, 16, 8, "div", 47);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](19, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r7 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx_r7.cipher.identity.fullName);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx_r7.cipher.identity.username);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx_r7.cipher.identity.company);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx_r7.cipher.identity.ssn);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx_r7.cipher.identity.passportNumber);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx_r7.cipher.identity.licenseNumber);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx_r7.cipher.identity.email);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx_r7.cipher.identity.phone);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx_r7.cipher.identity.address1 || ctx_r7.cipher.identity.city || ctx_r7.cipher.identity.country);
+} }
+function ViewComponent_content_19_div_30_div_4_span_4_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "span", 12);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](2, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](2, 1, "uri"));
+} }
+function ViewComponent_content_19_div_30_div_4_span_6_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "span", 12);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](2, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](2, 1, "website"));
+} }
+function ViewComponent_content_19_div_30_div_4_button_16_Template(rf, ctx) { if (rf & 1) {
+ const _r73 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "button", 30);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("click", function ViewComponent_content_19_div_30_div_4_button_16_Template_button_click_0_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r73); const u_r66 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"]().$implicit; const ctx_r71 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](3); return ctx_r71.launch(u_r66); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](1, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](2, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](3, "i", 51);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](4, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpropertyInterpolate"]("appA11yTitle", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](1, 1, "launch"));
+} }
+function ViewComponent_content_19_div_30_div_4_Template(rf, ctx) { if (rf & 1) {
+ const _r75 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "div", 26);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "div", 27);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](4, ViewComponent_content_19_div_30_div_4_span_4_Template, 3, 3, "span", 49);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](6, ViewComponent_content_19_div_30_div_4_span_6_Template, 3, 3, "span", 49);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](8, "span", 50);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](9, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](10, "input", 13);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](11, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](12, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](13, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](14, "div", 29);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](15, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](16, ViewComponent_content_19_div_30_div_4_button_16_Template, 5, 3, "button", 35);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](17, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](18, "button", 30);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("click", function ViewComponent_content_19_div_30_div_4_Template_button_click_18_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r75); const u_r66 = ctx.$implicit; const ctx_r74 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](3); return ctx_r74.copy(u_r66.uri, u_r66.isWebsite ? "website" : "uri", "URI"); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](19, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](20, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](21, "i", 31);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](22, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](23, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](24, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const u_r66 = ctx.$implicit;
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", !u_r66.isWebsite);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", u_r66.isWebsite);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpropertyInterpolate"]("title", u_r66.uri);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("value", u_r66.hostOrUri);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", u_r66.canLaunch);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpropertyInterpolate"]("appA11yTitle", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](19, 6, "copyUri"));
+} }
+function ViewComponent_content_19_div_30_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "div", 8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "div", 10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](4, ViewComponent_content_19_div_30_div_4_Template, 25, 8, "div", 48);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](6, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r8 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngForOf", ctx_r8.cipher.login.uris);
+} }
+function ViewComponent_content_19_div_32_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "div", 8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "div", 9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](4, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](6, "div", 10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](8, "div", 11);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](9, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](10, "textarea", 52);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](11, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](12, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](13, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r9 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate1"]("\n ", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](4, 2, "notes"), "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("value", ctx_r9.cipher.notes);
+} }
+function ViewComponent_content_19_div_34_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "div", 8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](2, "app-vault-view-custom-fields", 53);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r10 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("cipher", ctx_r10.cipher)("promptPassword", ctx_r10.promptPassword.bind(ctx_r10))("copy", ctx_r10.copy.bind(ctx_r10));
+} }
+function ViewComponent_content_19_div_36_button_8_i_8_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](0, "i", 59);
+} }
+function ViewComponent_content_19_div_36_button_8_i_10_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](0, "i", 60);
+} }
+function ViewComponent_content_19_div_36_button_8_Template(rf, ctx) { if (rf & 1) {
+ const _r81 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "button", 55);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("click", function ViewComponent_content_19_div_36_button_8_Template_button_click_0_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r81); const attachment_r77 = ctx.$implicit; const ctx_r80 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](3); return ctx_r80.downloadAttachment(attachment_r77); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "span", 27);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](4, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](5, "small", 56);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](8, ViewComponent_content_19_div_36_button_8_i_8_Template, 1, 0, "i", 57);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](9, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](10, ViewComponent_content_19_div_36_button_8_i_10_Template, 1, 0, "i", 58);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](11, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const attachment_r77 = ctx.$implicit;
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](attachment_r77.fileName);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](attachment_r77.sizeName);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", !attachment_r77.downloading);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", attachment_r77.downloading);
+} }
+function ViewComponent_content_19_div_36_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "div", 8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "div", 9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](4, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](6, "div", 10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](8, ViewComponent_content_19_div_36_button_8_Template, 12, 4, "button", 54);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](9, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](10, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r11 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate1"]("\n ", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](4, 2, "attachments"), "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngForOf", ctx_r11.cipher.attachments);
+} }
+function ViewComponent_content_19_button_42_Template(rf, ctx) { if (rf & 1) {
+ const _r83 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "button", 18);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("click", function ViewComponent_content_19_button_42_Template_button_click_0_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r83); const ctx_r82 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](2); return ctx_r82.fillCipher(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "div", 61);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](4, "div", 62);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](6, "i", 63);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](8, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](9, "span");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](11, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](12, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](13, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](11, 1, "autoFill"));
+} }
+function ViewComponent_content_19_button_44_Template(rf, ctx) { if (rf & 1) {
+ const _r85 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "button", 18);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("click", function ViewComponent_content_19_button_44_Template_button_click_0_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r85); const ctx_r84 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](2); return ctx_r84.fillCipherAndSave(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "div", 61);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](4, "div", 62);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](6, "i", 64);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](8, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](9, "span");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](11, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](12, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](13, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](11, 1, "autoFillAndSave"));
+} }
+function ViewComponent_content_19_button_46_Template(rf, ctx) { if (rf & 1) {
+ const _r87 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "button", 18);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("click", function ViewComponent_content_19_button_46_Template_button_click_0_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r87); const ctx_r86 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](2); return ctx_r86.clone(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "div", 61);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](4, "div", 62);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](6, "i", 65);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](8, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](9, "span");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](11, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](12, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](13, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](11, 1, "cloneItem"));
+} }
+function ViewComponent_content_19_button_48_Template(rf, ctx) { if (rf & 1) {
+ const _r89 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "button", 18);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("click", function ViewComponent_content_19_button_48_Template_button_click_0_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r89); const ctx_r88 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](2); return ctx_r88.share(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "div", 61);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](4, "div", 62);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](6, "i", 66);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](8, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](9, "span");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](11, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](12, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](13, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](11, 1, "moveToOrganization"));
+} }
+function ViewComponent_content_19_button_50_Template(rf, ctx) { if (rf & 1) {
+ const _r91 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "button", 18);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("click", function ViewComponent_content_19_button_50_Template_button_click_0_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r91); const ctx_r90 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](2); return ctx_r90.restore(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "div", 61);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](4, "div", 62);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](6, "i", 67);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](8, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](9, "span");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](11, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](12, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](13, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](11, 1, "restoreItem"));
+} }
+function ViewComponent_content_19_div_81_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "div");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "b", 23);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](4, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](6, "date");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r17 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate1"]("", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](4, 2, "datePasswordUpdated"), ":");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate1"]("\n ", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind2"](6, 4, ctx_r17.cipher.passwordRevisionDisplayDate, "medium"), "\n ");
+} }
+const _c3 = function (a0) { return { cipherId: a0 }; };
+function ViewComponent_content_19_div_83_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "div");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "b", 23);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](4, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](5, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](6, "a", 68);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](7, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](9, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r18 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate1"]("", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](4, 4, "passwordHistory"), ":");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpropertyInterpolate"]("title", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](7, 6, "passwordHistory"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("queryParams", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpureFunction1"](8, _c3, ctx_r18.cipher.id));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate1"]("\n ", ctx_r18.cipher.passwordHistory.length, "\n ");
+} }
+function ViewComponent_content_19_Template(rf, ctx) { if (rf & 1) {
+ const _r93 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵgetCurrentView"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "content");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "div", 8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](4, "div", 9);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](6, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](8, "div", 10);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](9, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](10, "div", 11);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](11, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](12, "span", 12);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](13);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](14, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](15, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](16, "input", 13);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](17, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](18, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](19, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](20, ViewComponent_content_19_div_20_Template, 8, 3, "div", 5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](21, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](22, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](23, ViewComponent_content_19_div_23_Template, 12, 5, "div", 5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](24, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](25, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](26, ViewComponent_content_19_div_26_Template, 20, 9, "div", 5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](27, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](28, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](29, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](30, ViewComponent_content_19_div_30_Template, 7, 1, "div", 14);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](31, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](32, ViewComponent_content_19_div_32_Template, 14, 4, "div", 14);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](33, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](34, ViewComponent_content_19_div_34_Template, 4, 3, "div", 14);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](35, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](36, ViewComponent_content_19_div_36_Template, 11, 4, "div", 14);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](37, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](38, "div", 15);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](39, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](40, "div", 16);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](41, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](42, ViewComponent_content_19_button_42_Template, 14, 3, "button", 17);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](43, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](44, ViewComponent_content_19_button_44_Template, 14, 3, "button", 17);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](45, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](46, ViewComponent_content_19_button_46_Template, 14, 3, "button", 17);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](47, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](48, ViewComponent_content_19_button_48_Template, 14, 3, "button", 17);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](49, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](50, ViewComponent_content_19_button_50_Template, 14, 3, "button", 17);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](51, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](52, "button", 18);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("click", function ViewComponent_content_19_Template_button_click_52_listener() { _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵrestoreView"](_r93); const ctx_r92 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"](); return ctx_r92.delete(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](53, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](54, "div", 19);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](55, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](56, "div", 20);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](57, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](58, "i", 21);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](59, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](60, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](61, "span");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](62);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](63, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](64, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](65, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](66, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](67, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](68, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](69, "div", 8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](70, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](71, "div", 22);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](72, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](73, "div");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](74, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](75, "b", 23);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](76);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](77, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](78);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](79, "date");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](80, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](81, ViewComponent_content_19_div_81_Template, 7, 7, "div", 5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](82, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](83, ViewComponent_content_19_div_83_Template, 10, 10, "div", 5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](84, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](85, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](86, "\n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+} if (rf & 2) {
+ const ctx_r1 = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵnextContext"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate1"]("\n ", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](6, 20, "itemInformation"), "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](14, 22, "name"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("value", ctx_r1.cipher.name);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx_r1.cipher.login);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx_r1.cipher.card);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx_r1.cipher.identity);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx_r1.cipher.login && ctx_r1.cipher.login.hasUris);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx_r1.cipher.notes);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx_r1.cipher.hasFields);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx_r1.cipher.hasAttachments && (ctx_r1.canAccessPremium || ctx_r1.cipher.organizationId) && ctx_r1.showAttachments);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](6);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx_r1.cipher.type !== ctx_r1.cipherType.SecureNote && !ctx_r1.cipher.isDeleted && !ctx_r1.inPopout);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx_r1.cipher.type === ctx_r1.cipherType.Login && !ctx_r1.cipher.isDeleted && !ctx_r1.inPopout);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", !ctx_r1.cipher.organizationId && !ctx_r1.cipher.isDeleted);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", !ctx_r1.cipher.organizationId);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx_r1.cipher.isDeleted);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](12);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](63, 24, ctx_r1.cipher.isDeleted ? "permanentlyDeleteItem" : "deleteItem"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](14);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate1"]("", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](77, 26, "dateUpdated"), ":");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate1"]("\n ", _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind2"](79, 28, ctx_r1.cipher.revisionDate, "medium"), "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx_r1.cipher.passwordRevisionDisplayDate);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx_r1.cipher.hasPasswordHistory);
+} }
+const BroadcasterSubscriptionId = 'ChildViewComponent';
+class ViewComponent extends jslib_angular_components_view_component__WEBPACK_IMPORTED_MODULE_20__["ViewComponent"] {
+ constructor(cipherService, totpService, tokenService, i18nService, cryptoService, platformUtilsService, auditService, route, router, location, broadcasterService, ngZone, changeDetectorRef, userService, eventService, autofillService, messagingService, popupUtilsService, apiService, passwordRepromptService, logService) {
+ super(cipherService, totpService, tokenService, i18nService, cryptoService, platformUtilsService, auditService, window, broadcasterService, ngZone, changeDetectorRef, userService, eventService, apiService, passwordRepromptService, logService);
+ this.route = route;
+ this.router = router;
+ this.location = location;
+ this.autofillService = autofillService;
+ this.messagingService = messagingService;
+ this.popupUtilsService = popupUtilsService;
+ this.showAttachments = true;
+ this.pageDetails = [];
+ this.inPopout = false;
+ this.cipherType = jslib_common_enums_cipherType__WEBPACK_IMPORTED_MODULE_19__["CipherType"];
+ }
+ ngOnInit() {
+ this.inPopout = this.popupUtilsService.inPopout(window);
+ this.route.queryParams.pipe(Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_3__["first"])()).subscribe((params) => __awaiter(this, void 0, void 0, function* () {
+ if (params.cipherId) {
+ this.cipherId = params.cipherId;
+ }
+ else {
+ this.close();
+ }
+ yield this.load();
+ }));
+ super.ngOnInit();
+ this.broadcasterService.subscribe(BroadcasterSubscriptionId, (message) => {
+ this.ngZone.run(() => __awaiter(this, void 0, void 0, function* () {
+ switch (message.command) {
+ case 'collectPageDetailsResponse':
+ if (message.sender === BroadcasterSubscriptionId) {
+ this.pageDetails.push({
+ frameId: message.webExtSender.frameId,
+ tab: message.tab,
+ details: message.details,
+ });
+ }
+ break;
+ case 'tabChanged':
+ case 'windowChanged':
+ if (this.loadPageDetailsTimeout != null) {
+ window.clearTimeout(this.loadPageDetailsTimeout);
+ }
+ this.loadPageDetailsTimeout = window.setTimeout(() => this.loadPageDetails(), 500);
+ break;
+ default:
+ break;
+ }
+ }));
+ });
+ }
+ ngOnDestroy() {
+ super.ngOnDestroy();
+ this.broadcasterService.unsubscribe(BroadcasterSubscriptionId);
+ }
+ load() {
+ const _super = Object.create(null, {
+ load: { get: () => super.load }
+ });
+ return __awaiter(this, void 0, void 0, function* () {
+ yield _super.load.call(this);
+ yield this.loadPageDetails();
+ });
+ }
+ edit() {
+ const _super = Object.create(null, {
+ edit: { get: () => super.edit }
+ });
+ return __awaiter(this, void 0, void 0, function* () {
+ if (this.cipher.isDeleted) {
+ return false;
+ }
+ if (!(yield _super.edit.call(this))) {
+ return false;
+ }
+ this.router.navigate(['/edit-cipher'], { queryParams: { cipherId: this.cipher.id } });
+ return true;
+ });
+ }
+ clone() {
+ const _super = Object.create(null, {
+ clone: { get: () => super.clone }
+ });
+ return __awaiter(this, void 0, void 0, function* () {
+ if (this.cipher.isDeleted) {
+ return false;
+ }
+ if (!(yield _super.clone.call(this))) {
+ return false;
+ }
+ this.router.navigate(['/clone-cipher'], {
+ queryParams: {
+ cloneMode: true,
+ cipherId: this.cipher.id,
+ },
+ });
+ return true;
+ });
+ }
+ share() {
+ const _super = Object.create(null, {
+ share: { get: () => super.share }
+ });
+ return __awaiter(this, void 0, void 0, function* () {
+ if (!(yield _super.share.call(this))) {
+ return false;
+ }
+ if (this.cipher.organizationId == null) {
+ this.router.navigate(['/share-cipher'], { replaceUrl: true, queryParams: { cipherId: this.cipher.id } });
+ }
+ return true;
+ });
+ }
+ fillCipher() {
+ return __awaiter(this, void 0, void 0, function* () {
+ const didAutofill = yield this.doAutofill();
+ if (didAutofill) {
+ this.platformUtilsService.showToast('success', null, this.i18nService.t('autoFillSuccess'));
+ }
+ });
+ }
+ fillCipherAndSave() {
+ return __awaiter(this, void 0, void 0, function* () {
+ const didAutofill = yield this.doAutofill();
+ if (didAutofill) {
+ if (this.tab == null) {
+ throw new Error('No tab found.');
+ }
+ if (this.cipher.login.uris == null) {
+ this.cipher.login.uris = [];
+ }
+ else {
+ if (this.cipher.login.uris.some(uri => uri.uri === this.tab.url)) {
+ this.platformUtilsService.showToast('success', null, this.i18nService.t('autoFillSuccessAndSavedUri'));
+ return;
+ }
+ }
+ const loginUri = new jslib_common_models_view_loginUriView__WEBPACK_IMPORTED_MODULE_18__["LoginUriView"]();
+ loginUri.uri = this.tab.url;
+ this.cipher.login.uris.push(loginUri);
+ try {
+ const cipher = yield this.cipherService.encrypt(this.cipher);
+ yield this.cipherService.saveWithServer(cipher);
+ this.platformUtilsService.showToast('success', null, this.i18nService.t('autoFillSuccessAndSavedUri'));
+ this.messagingService.send('editedCipher');
+ }
+ catch (_a) {
+ this.platformUtilsService.showToast('error', null, this.i18nService.t('unexpectedError'));
+ }
+ }
+ });
+ }
+ restore() {
+ const _super = Object.create(null, {
+ restore: { get: () => super.restore }
+ });
+ return __awaiter(this, void 0, void 0, function* () {
+ if (!this.cipher.isDeleted) {
+ return false;
+ }
+ if (yield _super.restore.call(this)) {
+ this.close();
+ return true;
+ }
+ return false;
+ });
+ }
+ delete() {
+ const _super = Object.create(null, {
+ delete: { get: () => super.delete }
+ });
+ return __awaiter(this, void 0, void 0, function* () {
+ if (yield _super.delete.call(this)) {
+ this.close();
+ return true;
+ }
+ return false;
+ });
+ }
+ close() {
+ this.location.back();
+ }
+ loadPageDetails() {
+ return __awaiter(this, void 0, void 0, function* () {
+ this.pageDetails = [];
+ this.tab = yield _browser_browserApi__WEBPACK_IMPORTED_MODULE_21__["BrowserApi"].getTabFromCurrentWindow();
+ if (this.tab == null) {
+ return;
+ }
+ _browser_browserApi__WEBPACK_IMPORTED_MODULE_21__["BrowserApi"].tabSendMessage(this.tab, {
+ command: 'collectPageDetails',
+ tab: this.tab,
+ sender: BroadcasterSubscriptionId,
+ });
+ });
+ }
+ doAutofill() {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (!(yield this.promptPassword())) {
+ return false;
+ }
+ if (this.pageDetails == null || this.pageDetails.length === 0) {
+ this.platformUtilsService.showToast('error', null, this.i18nService.t('autofillError'));
+ return false;
+ }
+ try {
+ this.totpCode = yield this.autofillService.doAutoFill({
+ cipher: this.cipher,
+ pageDetails: this.pageDetails,
+ doc: window.document,
+ fillNewPassword: true,
+ });
+ if (this.totpCode != null) {
+ this.platformUtilsService.copyToClipboard(this.totpCode, { window: window });
+ }
+ }
+ catch (_a) {
+ this.platformUtilsService.showToast('error', null, this.i18nService.t('autofillError'));
+ this.changeDetectorRef.detectChanges();
+ return false;
+ }
+ return true;
+ });
+ }
+}
+ViewComponent.ɵfac = function ViewComponent_Factory(t) { return new (t || ViewComponent)(_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](jslib_common_abstractions_cipher_service__WEBPACK_IMPORTED_MODULE_6__["CipherService"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](jslib_common_abstractions_totp_service__WEBPACK_IMPORTED_MODULE_15__["TotpService"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](jslib_common_abstractions_token_service__WEBPACK_IMPORTED_MODULE_14__["TokenService"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_9__["I18nService"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](jslib_common_abstractions_crypto_service__WEBPACK_IMPORTED_MODULE_7__["CryptoService"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_13__["PlatformUtilsService"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](jslib_common_abstractions_audit_service__WEBPACK_IMPORTED_MODULE_5__["AuditService"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](_angular_router__WEBPACK_IMPORTED_MODULE_2__["ActivatedRoute"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](_angular_router__WEBPACK_IMPORTED_MODULE_2__["Router"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](_angular_common__WEBPACK_IMPORTED_MODULE_0__["Location"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](jslib_angular_services_broadcaster_service__WEBPACK_IMPORTED_MODULE_17__["BroadcasterService"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["NgZone"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ChangeDetectorRef"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](jslib_common_abstractions_user_service__WEBPACK_IMPORTED_MODULE_16__["UserService"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](jslib_common_abstractions_event_service__WEBPACK_IMPORTED_MODULE_8__["EventService"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](_services_abstractions_autofill_service__WEBPACK_IMPORTED_MODULE_22__["AutofillService"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](jslib_common_abstractions_messaging_service__WEBPACK_IMPORTED_MODULE_11__["MessagingService"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](_services_popup_utils_service__WEBPACK_IMPORTED_MODULE_23__["PopupUtilsService"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](jslib_common_abstractions_api_service__WEBPACK_IMPORTED_MODULE_4__["ApiService"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](jslib_common_abstractions_passwordReprompt_service__WEBPACK_IMPORTED_MODULE_12__["PasswordRepromptService"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_10__["LogService"])); };
+ViewComponent.ɵcmp = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdefineComponent"]({ type: ViewComponent, selectors: [["app-vault-view"]], features: [_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵInheritDefinitionFeature"]], decls: 21, vars: 8, consts: [[1, "left"], ["type", "button", "appBlurClick", "", 3, "click"], [1, "center"], [1, "title"], ["class", "right", 4, "ngIf"], [4, "ngIf"], [1, "right"], ["type", "button", "appBlurClick", "", 3, "click", 4, "ngIf"], [1, "box"], [1, "box-header"], [1, "box-content"], [1, "box-content-row"], [1, "row-label"], ["type", "text", "readonly", "", "aria-readonly", "true", 3, "value"], ["class", "box", 4, "ngIf"], [1, "box", "list"], [1, "box-content", "single-line"], ["type", "button", "class", "box-content-row", "appStopClick", "", "appBlurClick", "", 3, "click", 4, "ngIf"], ["type", "button", "appStopClick", "", "appBlurClick", "", 1, "box-content-row", 3, "click"], [1, "row-main", "text-danger"], ["aria-hidden", "true", 1, "icon", "text-danger"], [1, "fa", "fa-trash-o", "fa-lg", "fa-fw"], [1, "box-footer"], [1, "font-weight-semibold"], ["class", "box-content-row box-content-row-flex", 4, "ngIf"], ["class", "box-content-row box-content-row-flex totp", 3, "ngClass", 4, "ngIf"], [1, "box-content-row", "box-content-row-flex"], [1, "row-main"], ["draggable", "true", 1, "row-label", "draggable", 3, "dragstart"], [1, "action-buttons"], ["type", "button", "appStopClick", "", 1, "row-btn", 3, "appA11yTitle", "click"], ["aria-hidden", "true", 1, "fa", "fa-lg", "fa-clone"], [1, "monospaced", 3, "hidden"], ["appSelectCopy", "", 1, "monospaced", "password-wrapper", 3, "hidden", "innerHTML"], ["type", "button", "class", "row-btn btn", "appBlurClick", "", 3, "appA11yTitle", "appApiAction", "disabled", "click", 4, "ngIf"], ["type", "button", "class", "row-btn", "appStopClick", "", 3, "appA11yTitle", "click", 4, "ngIf"], ["type", "button", "appBlurClick", "", 1, "row-btn", "btn", 3, "appA11yTitle", "appApiAction", "disabled", "click"], ["checkPasswordBtn", ""], ["aria-hidden", "true", 1, "fa", "fa-lg", "fa-check-circle", 3, "hidden"], ["aria-hidden", "true", 1, "fa", "fa-lg", "fa-spinner", "fa-spin", 3, "hidden"], ["aria-hidden", "true", 1, "fa", "fa-lg", 3, "ngClass"], [1, "box-content-row", "box-content-row-flex", "totp", 3, "ngClass"], [1, "totp-code"], [1, "totp-countdown"], [1, "totp-sec"], ["r", "12.6", "cy", "16", "cx", "16", 1, "totp-circle", "inner", 3, "ngStyle"], ["r", "14", "cy", "16", "cx", "16", 1, "totp-circle", "outer"], ["class", "box-content-row", 4, "ngIf"], ["class", "box-content-row box-content-row-flex", 4, "ngFor", "ngForOf"], ["class", "row-label", 4, "ngIf"], [3, "title"], ["aria-hidden", "true", 1, "fa", "fa-lg", "fa-share-square-o"], ["rows", "6", "readonly", "", "aria-readonly", "true", 3, "value"], [3, "cipher", "promptPassword", "copy"], ["type", "button", "class", "box-content-row box-content-row-flex text-default", "appStopClick", "", "appBlurCLick", "", 3, "click", 4, "ngFor", "ngForOf"], ["type", "button", "appStopClick", "", "appBlurCLick", "", 1, "box-content-row", "box-content-row-flex", "text-default", 3, "click"], [1, "row-sub-label"], ["class", "fa fa-download fa-fw row-sub-icon", "aria-hidden", "true", 4, "ngIf"], ["class", "fa fa-spinner fa-fw fa-spin row-sub-icon", "aria-hidden", "true", 4, "ngIf"], ["aria-hidden", "true", 1, "fa", "fa-download", "fa-fw", "row-sub-icon"], ["aria-hidden", "true", 1, "fa", "fa-spinner", "fa-fw", "fa-spin", "row-sub-icon"], [1, "row-main", "text-primary"], ["aria-hidden", "true", 1, "icon", "text-primary"], [1, "fa", "fa-pencil-square-o", "fa-lg", "fa-fw"], [1, "fa", "fa-bookmark", "fa-lg", "fa-fw"], [1, "fa", "fa-files-o", "fa-lg", "fa-fw"], [1, "fa", "fa-arrow-circle-o-right", "fa-lg", "fa-fw"], [1, "fa", "fa-undo", "fa-lg", "fa-fw"], ["routerLink", "/cipher-password-history", "appStopClick", "", 3, "queryParams", "title"]], template: function ViewComponent_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](0, "header");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](1, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](2, "div", 0);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](4, "button", 1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵlistener"]("click", function ViewComponent_Template_button_click_4_listener() { return ctx.close(); });
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](6, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](7, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](8, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](9, "div", 2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](10, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](11, "span", 3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](12);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipe"](13, "i18n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](14, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](15, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](16, ViewComponent_div_16_Template, 4, 1, "div", 4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](17, "\n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](18, "\n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtemplate"](19, ViewComponent_content_19_Template, 87, 31, "content", 5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](20, "\n");
+ } if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](5);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](6, 4, "close"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](7);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtextInterpolate"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵpipeBind1"](13, 6, "viewItem"));
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx.cipher);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](3);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵproperty"]("ngIf", ctx.cipher);
+ } }, directives: [jslib_angular_directives_blur_click_directive__WEBPACK_IMPORTED_MODULE_24__["BlurClickDirective"], _angular_common__WEBPACK_IMPORTED_MODULE_0__["NgIf"], jslib_angular_directives_stop_click_directive__WEBPACK_IMPORTED_MODULE_25__["StopClickDirective"], jslib_angular_directives_a11y_title_directive__WEBPACK_IMPORTED_MODULE_26__["A11yTitleDirective"], jslib_angular_directives_select_copy_directive__WEBPACK_IMPORTED_MODULE_27__["SelectCopyDirective"], jslib_angular_directives_api_action_directive__WEBPACK_IMPORTED_MODULE_28__["ApiActionDirective"], _angular_common__WEBPACK_IMPORTED_MODULE_0__["NgClass"], _angular_common__WEBPACK_IMPORTED_MODULE_0__["NgStyle"], _angular_common__WEBPACK_IMPORTED_MODULE_0__["NgForOf"], _view_custom_fields_component__WEBPACK_IMPORTED_MODULE_29__["ViewCustomFieldsComponent"], _angular_router__WEBPACK_IMPORTED_MODULE_2__["RouterLinkWithHref"]], pipes: [jslib_angular_pipes_i18n_pipe__WEBPACK_IMPORTED_MODULE_30__["I18nPipe"], _angular_common__WEBPACK_IMPORTED_MODULE_0__["DatePipe"], jslib_angular_pipes_color_password_pipe__WEBPACK_IMPORTED_MODULE_31__["ColorPasswordPipe"]], encapsulation: 2 });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵsetClassMetadata"](ViewComponent, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Component"],
+ args: [{
+ selector: 'app-vault-view',
+ templateUrl: 'view.component.html',
+ }]
+ }], function () { return [{ type: jslib_common_abstractions_cipher_service__WEBPACK_IMPORTED_MODULE_6__["CipherService"] }, { type: jslib_common_abstractions_totp_service__WEBPACK_IMPORTED_MODULE_15__["TotpService"] }, { type: jslib_common_abstractions_token_service__WEBPACK_IMPORTED_MODULE_14__["TokenService"] }, { type: jslib_common_abstractions_i18n_service__WEBPACK_IMPORTED_MODULE_9__["I18nService"] }, { type: jslib_common_abstractions_crypto_service__WEBPACK_IMPORTED_MODULE_7__["CryptoService"] }, { type: jslib_common_abstractions_platformUtils_service__WEBPACK_IMPORTED_MODULE_13__["PlatformUtilsService"] }, { type: jslib_common_abstractions_audit_service__WEBPACK_IMPORTED_MODULE_5__["AuditService"] }, { type: _angular_router__WEBPACK_IMPORTED_MODULE_2__["ActivatedRoute"] }, { type: _angular_router__WEBPACK_IMPORTED_MODULE_2__["Router"] }, { type: _angular_common__WEBPACK_IMPORTED_MODULE_0__["Location"] }, { type: jslib_angular_services_broadcaster_service__WEBPACK_IMPORTED_MODULE_17__["BroadcasterService"] }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["NgZone"] }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["ChangeDetectorRef"] }, { type: jslib_common_abstractions_user_service__WEBPACK_IMPORTED_MODULE_16__["UserService"] }, { type: jslib_common_abstractions_event_service__WEBPACK_IMPORTED_MODULE_8__["EventService"] }, { type: _services_abstractions_autofill_service__WEBPACK_IMPORTED_MODULE_22__["AutofillService"] }, { type: jslib_common_abstractions_messaging_service__WEBPACK_IMPORTED_MODULE_11__["MessagingService"] }, { type: _services_popup_utils_service__WEBPACK_IMPORTED_MODULE_23__["PopupUtilsService"] }, { type: jslib_common_abstractions_api_service__WEBPACK_IMPORTED_MODULE_4__["ApiService"] }, { type: jslib_common_abstractions_passwordReprompt_service__WEBPACK_IMPORTED_MODULE_12__["PasswordRepromptService"] }, { type: jslib_common_abstractions_log_service__WEBPACK_IMPORTED_MODULE_10__["LogService"] }]; }, null); })();
+
+
+/***/ }),
+
+/***/ "./src/services/abstractions/autofill.service.ts":
+/*!*******************************************************!*\
+ !*** ./src/services/abstractions/autofill.service.ts ***!
+ \*******************************************************/
+/*! exports provided: AutofillService */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AutofillService", function() { return AutofillService; });
+class AutofillService {
+}
+
+
+/***/ }),
+
+/***/ "./src/services/browserMessaging.service.ts":
+/*!**************************************************!*\
+ !*** ./src/services/browserMessaging.service.ts ***!
+ \**************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return BrowserMessagingService; });
+class BrowserMessagingService {
+ send(subscriber, arg = {}) {
+ const message = Object.assign({}, { command: subscriber }, arg);
+ chrome.runtime.sendMessage(message);
+ }
+}
+
+
+/***/ })
+
+/******/ });
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4vJF9sYXp5X3JvdXRlX3Jlc291cmNlIGxhenkgbmFtZXNwYWNlIG9iamVjdCIsIndlYnBhY2s6Ly8vLi9qc2xpYi9hbmd1bGFyL3NyYy9jb21wb25lbnRzL2FkZC1lZGl0LWN1c3RvbS1maWVsZHMuY29tcG9uZW50LnRzIiwid2VicGFjazovLy8uL2pzbGliL2FuZ3VsYXIvc3JjL2NvbXBvbmVudHMvYWRkLWVkaXQuY29tcG9uZW50LnRzIiwid2VicGFjazovLy8uL2pzbGliL2FuZ3VsYXIvc3JjL2NvbXBvbmVudHMvYXR0YWNobWVudHMuY29tcG9uZW50LnRzIiwid2VicGFjazovLy8uL2pzbGliL2FuZ3VsYXIvc3JjL2NvbXBvbmVudHMvY2FsbG91dC5jb21wb25lbnQudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvYW5ndWxhci9zcmMvY29tcG9uZW50cy9jYWxsb3V0LmNvbXBvbmVudC5odG1sIiwid2VicGFjazovLy8uL2pzbGliL2FuZ3VsYXIvc3JjL2NvbXBvbmVudHMvY2FwdGNoYVByb3RlY3RlZC5jb21wb25lbnQudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvYW5ndWxhci9zcmMvY29tcG9uZW50cy9jaGFuZ2UtcGFzc3dvcmQuY29tcG9uZW50LnRzIiwid2VicGFjazovLy8uL2pzbGliL2FuZ3VsYXIvc3JjL2NvbXBvbmVudHMvY2lwaGVycy5jb21wb25lbnQudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvYW5ndWxhci9zcmMvY29tcG9uZW50cy9jb2xsZWN0aW9ucy5jb21wb25lbnQudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvYW5ndWxhci9zcmMvY29tcG9uZW50cy9lbnZpcm9ubWVudC5jb21wb25lbnQudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvYW5ndWxhci9zcmMvY29tcG9uZW50cy9leHBvcnQuY29tcG9uZW50LnRzIiwid2VicGFjazovLy8uL2pzbGliL2FuZ3VsYXIvc3JjL2NvbXBvbmVudHMvZm9sZGVyLWFkZC1lZGl0LmNvbXBvbmVudC50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9hbmd1bGFyL3NyYy9jb21wb25lbnRzL2dyb3VwaW5ncy5jb21wb25lbnQudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvYW5ndWxhci9zcmMvY29tcG9uZW50cy9oaW50LmNvbXBvbmVudC50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9hbmd1bGFyL3NyYy9jb21wb25lbnRzL2ljb24uY29tcG9uZW50LnRzIiwid2VicGFjazovLy8uL2pzbGliL2FuZ3VsYXIvc3JjL2NvbXBvbmVudHMvaWNvbi5jb21wb25lbnQuaHRtbCIsIndlYnBhY2s6Ly8vLi9qc2xpYi9hbmd1bGFyL3NyYy9jb21wb25lbnRzL2xvY2suY29tcG9uZW50LnRzIiwid2VicGFjazovLy8uL2pzbGliL2FuZ3VsYXIvc3JjL2NvbXBvbmVudHMvbG9naW4uY29tcG9uZW50LnRzIiwid2VicGFjazovLy8uL2pzbGliL2FuZ3VsYXIvc3JjL2NvbXBvbmVudHMvbW9kYWwvZHluYW1pYy1tb2RhbC5jb21wb25lbnQudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvYW5ndWxhci9zcmMvY29tcG9uZW50cy9tb2RhbC9tb2RhbC1pbmplY3Rvci50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9hbmd1bGFyL3NyYy9jb21wb25lbnRzL21vZGFsL21vZGFsLnJlZi50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9hbmd1bGFyL3NyYy9jb21wb25lbnRzL3Bhc3N3b3JkLWdlbmVyYXRvci1oaXN0b3J5LmNvbXBvbmVudC50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9hbmd1bGFyL3NyYy9jb21wb25lbnRzL3Bhc3N3b3JkLWdlbmVyYXRvci5jb21wb25lbnQudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvYW5ndWxhci9zcmMvY29tcG9uZW50cy9wYXNzd29yZC1oaXN0b3J5LmNvbXBvbmVudC50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9hbmd1bGFyL3NyYy9jb21wb25lbnRzL3Bhc3N3b3JkLXJlcHJvbXB0LmNvbXBvbmVudC50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9hbmd1bGFyL3NyYy9jb21wb25lbnRzL3ByZW1pdW0uY29tcG9uZW50LnRzIiwid2VicGFjazovLy8uL2pzbGliL2FuZ3VsYXIvc3JjL2NvbXBvbmVudHMvcmVnaXN0ZXIuY29tcG9uZW50LnRzIiwid2VicGFjazovLy8uL2pzbGliL2FuZ3VsYXIvc3JjL2NvbXBvbmVudHMvc2VuZC9hZGQtZWRpdC5jb21wb25lbnQudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvYW5ndWxhci9zcmMvY29tcG9uZW50cy9zZW5kL2VmZmx1eC1kYXRlcy5jb21wb25lbnQudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvYW5ndWxhci9zcmMvY29tcG9uZW50cy9zZW5kL3NlbmQuY29tcG9uZW50LnRzIiwid2VicGFjazovLy8uL2pzbGliL2FuZ3VsYXIvc3JjL2NvbXBvbmVudHMvc2V0LXBhc3N3b3JkLmNvbXBvbmVudC50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9hbmd1bGFyL3NyYy9jb21wb25lbnRzL3NldC1waW4uY29tcG9uZW50LnRzIiwid2VicGFjazovLy8uL2pzbGliL2FuZ3VsYXIvc3JjL2NvbXBvbmVudHMvc2V0dGluZ3MvdmF1bHQtdGltZW91dC1pbnB1dC5jb21wb25lbnQudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvYW5ndWxhci9zcmMvY29tcG9uZW50cy9zaGFyZS5jb21wb25lbnQudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvYW5ndWxhci9zcmMvY29tcG9uZW50cy9zc28uY29tcG9uZW50LnRzIiwid2VicGFjazovLy8uL2pzbGliL2FuZ3VsYXIvc3JjL2NvbXBvbmVudHMvdHdvLWZhY3Rvci1vcHRpb25zLmNvbXBvbmVudC50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9hbmd1bGFyL3NyYy9jb21wb25lbnRzL3R3by1mYWN0b3IuY29tcG9uZW50LnRzIiwid2VicGFjazovLy8uL2pzbGliL2FuZ3VsYXIvc3JjL2NvbXBvbmVudHMvdXBkYXRlLXRlbXAtcGFzc3dvcmQuY29tcG9uZW50LnRzIiwid2VicGFjazovLy8uL2pzbGliL2FuZ3VsYXIvc3JjL2NvbXBvbmVudHMvdmlldy1jdXN0b20tZmllbGRzLmNvbXBvbmVudC50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9hbmd1bGFyL3NyYy9jb21wb25lbnRzL3ZpZXcuY29tcG9uZW50LnRzIiwid2VicGFjazovLy8uL2pzbGliL2FuZ3VsYXIvc3JjL2RpcmVjdGl2ZXMvYTExeS10aXRsZS5kaXJlY3RpdmUudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvYW5ndWxhci9zcmMvZGlyZWN0aXZlcy9hcGktYWN0aW9uLmRpcmVjdGl2ZS50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9hbmd1bGFyL3NyYy9kaXJlY3RpdmVzL2F1dG9mb2N1cy5kaXJlY3RpdmUudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvYW5ndWxhci9zcmMvZGlyZWN0aXZlcy9ibHVyLWNsaWNrLmRpcmVjdGl2ZS50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9hbmd1bGFyL3NyYy9kaXJlY3RpdmVzL2JveC1yb3cuZGlyZWN0aXZlLnRzIiwid2VicGFjazovLy8uL2pzbGliL2FuZ3VsYXIvc3JjL2RpcmVjdGl2ZXMvY2lwaGVyTGlzdFZpcnR1YWxTY3JvbGwuZGlyZWN0aXZlLnRzIiwid2VicGFjazovLy8uL2pzbGliL2FuZ3VsYXIvc3JjL2RpcmVjdGl2ZXMvZmFsbGJhY2stc3JjLmRpcmVjdGl2ZS50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9hbmd1bGFyL3NyYy9kaXJlY3RpdmVzL2lucHV0LXZlcmJhdGltLmRpcmVjdGl2ZS50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9hbmd1bGFyL3NyYy9kaXJlY3RpdmVzL3NlbGVjdC1jb3B5LmRpcmVjdGl2ZS50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9hbmd1bGFyL3NyYy9kaXJlY3RpdmVzL3N0b3AtY2xpY2suZGlyZWN0aXZlLnRzIiwid2VicGFjazovLy8uL2pzbGliL2FuZ3VsYXIvc3JjL2RpcmVjdGl2ZXMvc3RvcC1wcm9wLmRpcmVjdGl2ZS50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9hbmd1bGFyL3NyYy9kaXJlY3RpdmVzL3RydWUtZmFsc2UtdmFsdWUuZGlyZWN0aXZlLnRzIiwid2VicGFjazovLy8uL2pzbGliL2FuZ3VsYXIvc3JjL3BpcGVzL2NvbG9yLXBhc3N3b3JkLnBpcGUudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvYW5ndWxhci9zcmMvcGlwZXMvaTE4bi5waXBlLnRzIiwid2VicGFjazovLy8uL2pzbGliL2FuZ3VsYXIvc3JjL3BpcGVzL3NlYXJjaC1jaXBoZXJzLnBpcGUudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvYW5ndWxhci9zcmMvc2VydmljZXMvYXV0aC1ndWFyZC5zZXJ2aWNlLnRzIiwid2VicGFjazovLy8uL2pzbGliL2FuZ3VsYXIvc3JjL3NlcnZpY2VzL2Jyb2FkY2FzdGVyLnNlcnZpY2UudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvYW5ndWxhci9zcmMvc2VydmljZXMvbG9jay1ndWFyZC5zZXJ2aWNlLnRzIiwid2VicGFjazovLy8uL2pzbGliL2FuZ3VsYXIvc3JjL3NlcnZpY2VzL21vZGFsLnNlcnZpY2UudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvYW5ndWxhci9zcmMvc2VydmljZXMvcGFzc3dvcmRSZXByb21wdC5zZXJ2aWNlLnRzIiwid2VicGFjazovLy8uL2pzbGliL2FuZ3VsYXIvc3JjL3NlcnZpY2VzL3VuYXV0aC1ndWFyZC5zZXJ2aWNlLnRzIiwid2VicGFjazovLy8uL2pzbGliL2FuZ3VsYXIvc3JjL3NlcnZpY2VzL3ZhbGlkYXRpb24uc2VydmljZS50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9jb21tb24vc3JjL2Fic3RyYWN0aW9ucy9hcGkuc2VydmljZS50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9jb21tb24vc3JjL2Fic3RyYWN0aW9ucy9hcHBJZC5zZXJ2aWNlLnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvYWJzdHJhY3Rpb25zL2F1ZGl0LnNlcnZpY2UudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9hYnN0cmFjdGlvbnMvYXV0aC5zZXJ2aWNlLnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvYWJzdHJhY3Rpb25zL2Jyb2FkY2FzdGVyLnNlcnZpY2UudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9hYnN0cmFjdGlvbnMvY2lwaGVyLnNlcnZpY2UudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9hYnN0cmFjdGlvbnMvY29sbGVjdGlvbi5zZXJ2aWNlLnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvYWJzdHJhY3Rpb25zL2NyeXB0by5zZXJ2aWNlLnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvYWJzdHJhY3Rpb25zL2NyeXB0b0Z1bmN0aW9uLnNlcnZpY2UudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9hYnN0cmFjdGlvbnMvZW52aXJvbm1lbnQuc2VydmljZS50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9jb21tb24vc3JjL2Fic3RyYWN0aW9ucy9ldmVudC5zZXJ2aWNlLnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvYWJzdHJhY3Rpb25zL2V4cG9ydC5zZXJ2aWNlLnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvYWJzdHJhY3Rpb25zL2ZpbGVVcGxvYWQuc2VydmljZS50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9jb21tb24vc3JjL2Fic3RyYWN0aW9ucy9mb2xkZXIuc2VydmljZS50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9jb21tb24vc3JjL2Fic3RyYWN0aW9ucy9pMThuLnNlcnZpY2UudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9hYnN0cmFjdGlvbnMvbG9nLnNlcnZpY2UudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9hYnN0cmFjdGlvbnMvbWVzc2FnaW5nLnNlcnZpY2UudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9hYnN0cmFjdGlvbnMvbm90aWZpY2F0aW9ucy5zZXJ2aWNlLnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvYWJzdHJhY3Rpb25zL3Bhc3N3b3JkR2VuZXJhdGlvbi5zZXJ2aWNlLnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvYWJzdHJhY3Rpb25zL3Bhc3N3b3JkUmVwcm9tcHQuc2VydmljZS50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9jb21tb24vc3JjL2Fic3RyYWN0aW9ucy9wbGF0Zm9ybVV0aWxzLnNlcnZpY2UudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9hYnN0cmFjdGlvbnMvcG9saWN5LnNlcnZpY2UudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9hYnN0cmFjdGlvbnMvc2VhcmNoLnNlcnZpY2UudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9hYnN0cmFjdGlvbnMvc2VuZC5zZXJ2aWNlLnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvYWJzdHJhY3Rpb25zL3NldHRpbmdzLnNlcnZpY2UudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9hYnN0cmFjdGlvbnMvc3RhdGUuc2VydmljZS50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9jb21tb24vc3JjL2Fic3RyYWN0aW9ucy9zdG9yYWdlLnNlcnZpY2UudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9hYnN0cmFjdGlvbnMvc3luYy5zZXJ2aWNlLnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvYWJzdHJhY3Rpb25zL3Rva2VuLnNlcnZpY2UudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9hYnN0cmFjdGlvbnMvdG90cC5zZXJ2aWNlLnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvYWJzdHJhY3Rpb25zL3VzZXIuc2VydmljZS50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9jb21tb24vc3JjL2Fic3RyYWN0aW9ucy92YXVsdFRpbWVvdXQuc2VydmljZS50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9jb21tb24vc3JjL2VudW1zL2NpcGhlclJlcHJvbXB0VHlwZS50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9jb21tb24vc3JjL2VudW1zL2NpcGhlclR5cGUudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9lbnVtcy9kZXZpY2VUeXBlLnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvZW51bXMvZW5jcnlwdGlvblR5cGUudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9lbnVtcy9ldmVudFR5cGUudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9lbnVtcy9maWVsZFR5cGUudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9lbnVtcy9oYXNoUHVycG9zZS50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9jb21tb24vc3JjL2VudW1zL2tkZlR5cGUudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9lbnVtcy9saW5rZWRJZFR5cGUudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9lbnVtcy9vcmdhbml6YXRpb25Vc2VyU3RhdHVzVHlwZS50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9jb21tb24vc3JjL2VudW1zL3BvbGljeVR5cGUudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9lbnVtcy9zZWN1cmVOb3RlVHlwZS50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9jb21tb24vc3JjL2VudW1zL3NlbmRUeXBlLnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvZW51bXMvdGhlbWVUeXBlLnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvZW51bXMvdHdvRmFjdG9yUHJvdmlkZXJUeXBlLnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvZW51bXMvdXJpTWF0Y2hUeXBlLnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvbWlzYy9jYXB0Y2hhX2lmcmFtZS50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9jb21tb24vc3JjL21pc2MvaWZyYW1lX2NvbXBvbmVudC50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9jb21tb24vc3JjL21pc2MvbGlua2VkRmllbGRPcHRpb24uZGVjb3JhdG9yLnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvbWlzYy91dGlscy50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9jb21tb24vc3JjL21pc2Mvd2ViYXV0aG5faWZyYW1lLnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvbW9kZWxzL2RvbWFpbi9hdXRoUmVzdWx0LnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvbW9kZWxzL2RvbWFpbi9kb21haW5CYXNlLnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvbW9kZWxzL2RvbWFpbi9lbmNTdHJpbmcudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9tb2RlbHMvZG9tYWluL21hc3RlclBhc3N3b3JkUG9saWN5T3B0aW9ucy50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9jb21tb24vc3JjL21vZGVscy9kb21haW4vc3ltbWV0cmljQ3J5cHRvS2V5LnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvbW9kZWxzL3JlcXVlc3QvYWNjb3VudC9zZXRDcnlwdG9BZ2VudEtleVJlcXVlc3QudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9tb2RlbHMvcmVxdWVzdC9jcnlwdG9BZ2VudFVzZXJLZXlSZXF1ZXN0LnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvbW9kZWxzL3JlcXVlc3QvZGV2aWNlUmVxdWVzdC50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9jb21tb24vc3JjL21vZGVscy9yZXF1ZXN0L2tleXNSZXF1ZXN0LnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvbW9kZWxzL3JlcXVlc3Qvb3JnYW5pemF0aW9uVXNlclJlc2V0UGFzc3dvcmRFbnJvbGxtZW50UmVxdWVzdC50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9jb21tb24vc3JjL21vZGVscy9yZXF1ZXN0L29yZ2FuaXphdGlvblVzZXJSZXNldFBhc3N3b3JkUmVxdWVzdC50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9jb21tb24vc3JjL21vZGVscy9yZXF1ZXN0L3Bhc3N3b3JkSGludFJlcXVlc3QudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9tb2RlbHMvcmVxdWVzdC9wYXNzd29yZFZlcmlmaWNhdGlvblJlcXVlc3QudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9tb2RlbHMvcmVxdWVzdC9wcmVsb2dpblJlcXVlc3QudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9tb2RlbHMvcmVxdWVzdC9yZWdpc3RlclJlcXVlc3QudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9tb2RlbHMvcmVxdWVzdC9zZXRQYXNzd29yZFJlcXVlc3QudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9tb2RlbHMvcmVxdWVzdC90b2tlblJlcXVlc3QudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9tb2RlbHMvcmVxdWVzdC90d29GYWN0b3JFbWFpbFJlcXVlc3QudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9tb2RlbHMvcmVxdWVzdC91cGRhdGVUZW1wUGFzc3dvcmRSZXF1ZXN0LnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvbW9kZWxzL3Jlc3BvbnNlL2Jhc2VSZXNwb25zZS50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9jb21tb24vc3JjL21vZGVscy9yZXNwb25zZS9lcnJvclJlc3BvbnNlLnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvbW9kZWxzL3ZpZXcvY2FyZFZpZXcudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9tb2RlbHMvdmlldy9jaXBoZXJWaWV3LnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvbW9kZWxzL3ZpZXcvZmllbGRWaWV3LnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvbW9kZWxzL3ZpZXcvZm9sZGVyVmlldy50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9jb21tb24vc3JjL21vZGVscy92aWV3L2lkZW50aXR5Vmlldy50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9jb21tb24vc3JjL21vZGVscy92aWV3L2l0ZW1WaWV3LnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvbW9kZWxzL3ZpZXcvbG9naW5VcmlWaWV3LnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvbW9kZWxzL3ZpZXcvbG9naW5WaWV3LnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvbW9kZWxzL3ZpZXcvc2VjdXJlTm90ZVZpZXcudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9tb2RlbHMvdmlldy9zZW5kRmlsZVZpZXcudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9tb2RlbHMvdmlldy9zZW5kVGV4dFZpZXcudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9tb2RlbHMvdmlldy9zZW5kVmlldy50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9jb21tb24vc3JjL3NlcnZpY2VzL2F1dGguc2VydmljZS50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9jb21tb24vc3JjL3NlcnZpY2VzL2Jyb2FkY2FzdGVyLnNlcnZpY2UudHMiLCJ3ZWJwYWNrOi8vLy4vanNsaWIvY29tbW9uL3NyYy9zZXJ2aWNlcy9jb25zdGFudHMuc2VydmljZS50cyIsIndlYnBhY2s6Ly8vLi9qc2xpYi9jb21tb24vc3JjL3NlcnZpY2VzL3NlYXJjaC5zZXJ2aWNlLnRzIiwid2VicGFjazovLy8uL2pzbGliL2NvbW1vbi9zcmMvc2VydmljZXMvc3RhdGUuc2VydmljZS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvYnJvd3Nlci9icm93c2VyQXBpLnRzIiwid2VicGFjazovLy8uL3NyYy9icm93c2VyL3NhZmFyaUFwcC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcG9wdXAvYWNjb3VudHMvZW52aXJvbm1lbnQuY29tcG9uZW50LnRzIiwid2VicGFjazovLy8uL3NyYy9wb3B1cC9hY2NvdW50cy9lbnZpcm9ubWVudC5jb21wb25lbnQuaHRtbCIsIndlYnBhY2s6Ly8vLi9zcmMvcG9wdXAvYWNjb3VudHMvaGludC5jb21wb25lbnQudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BvcHVwL2FjY291bnRzL2hpbnQuY29tcG9uZW50Lmh0bWwiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BvcHVwL2FjY291bnRzL2hvbWUuY29tcG9uZW50LnRzIiwid2VicGFjazovLy8uL3NyYy9wb3B1cC9hY2NvdW50cy9ob21lLmNvbXBvbmVudC5odG1sIiwid2VicGFjazovLy8uL3NyYy9wb3B1cC9hY2NvdW50cy9sb2NrLmNvbXBvbmVudC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcG9wdXAvYWNjb3VudHMvbG9jay5jb21wb25lbnQuaHRtbCIsIndlYnBhY2s6Ly8vLi9zcmMvcG9wdXAvYWNjb3VudHMvbG9naW4uY29tcG9uZW50LnRzIiwid2VicGFjazovLy8uL3NyYy9wb3B1cC9hY2NvdW50cy9sb2dpbi5jb21wb25lbnQuaHRtbCIsIndlYnBhY2s6Ly8vLi9zcmMvcG9wdXAvYWNjb3VudHMvcmVnaXN0ZXIuY29tcG9uZW50LnRzIiwid2VicGFjazovLy8uL3NyYy9wb3B1cC9hY2NvdW50cy9yZWdpc3Rlci5jb21wb25lbnQuaHRtbCIsIndlYnBhY2s6Ly8vLi9zcmMvcG9wdXAvYWNjb3VudHMvc2V0LXBhc3N3b3JkLmNvbXBvbmVudC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcG9wdXAvYWNjb3VudHMvc2V0LXBhc3N3b3JkLmNvbXBvbmVudC5odG1sIiwid2VicGFjazovLy8uL3NyYy9wb3B1cC9hY2NvdW50cy9zc28uY29tcG9uZW50LnRzIiwid2VicGFjazovLy8uL3NyYy9wb3B1cC9hY2NvdW50cy90d28tZmFjdG9yLW9wdGlvbnMuY29tcG9uZW50LnRzIiwid2VicGFjazovLy8uL3NyYy9wb3B1cC9hY2NvdW50cy90d28tZmFjdG9yLW9wdGlvbnMuY29tcG9uZW50Lmh0bWwiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BvcHVwL2FjY291bnRzL3R3by1mYWN0b3IuY29tcG9uZW50LnRzIiwid2VicGFjazovLy8uL3NyYy9wb3B1cC9hY2NvdW50cy90d28tZmFjdG9yLmNvbXBvbmVudC5odG1sIiwid2VicGFjazovLy8uL3NyYy9wb3B1cC9hY2NvdW50cy91cGRhdGUtdGVtcC1wYXNzd29yZC5jb21wb25lbnQudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BvcHVwL2FjY291bnRzL3VwZGF0ZS10ZW1wLXBhc3N3b3JkLmNvbXBvbmVudC5odG1sIiwid2VicGFjazovLy8uL3NyYy9wb3B1cC9hcHAtcm91dGluZy5hbmltYXRpb25zLnRzIiwid2VicGFjazovLy8uL3NyYy9wb3B1cC9hcHAtcm91dGluZy5tb2R1bGUudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BvcHVwL2FwcC5jb21wb25lbnQudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BvcHVwL2FwcC5tb2R1bGUudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BvcHVwL2NvbXBvbmVudHMvYWN0aW9uLWJ1dHRvbnMuY29tcG9uZW50LnRzIiwid2VicGFjazovLy8uL3NyYy9wb3B1cC9jb21wb25lbnRzL2FjdGlvbi1idXR0b25zLmNvbXBvbmVudC5odG1sIiwid2VicGFjazovLy8uL3NyYy9wb3B1cC9jb21wb25lbnRzL2NpcGhlci1yb3cuY29tcG9uZW50LnRzIiwid2VicGFjazovLy8uL3NyYy9wb3B1cC9jb21wb25lbnRzL2NpcGhlci1yb3cuY29tcG9uZW50Lmh0bWwiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BvcHVwL2NvbXBvbmVudHMvcGFzc3dvcmQtcmVwcm9tcHQuY29tcG9uZW50LnRzIiwid2VicGFjazovLy8uL3NyYy9wb3B1cC9jb21wb25lbnRzL3Bhc3N3b3JkLXJlcHJvbXB0LmNvbXBvbmVudC5odG1sIiwid2VicGFjazovLy8uL3NyYy9wb3B1cC9jb21wb25lbnRzL3BvcC1vdXQuY29tcG9uZW50LnRzIiwid2VicGFjazovLy8uL3NyYy9wb3B1cC9jb21wb25lbnRzL3BvcC1vdXQuY29tcG9uZW50Lmh0bWwiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BvcHVwL2NvbXBvbmVudHMvc2VuZC1saXN0LmNvbXBvbmVudC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcG9wdXAvY29tcG9uZW50cy9zZW5kLWxpc3QuY29tcG9uZW50Lmh0bWwiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BvcHVwL2NvbXBvbmVudHMvc2V0LXBpbi5jb21wb25lbnQudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BvcHVwL2NvbXBvbmVudHMvc2V0LXBpbi5jb21wb25lbnQuaHRtbCIsIndlYnBhY2s6Ly8vLi9zcmMvcG9wdXAvZ2VuZXJhdG9yL3Bhc3N3b3JkLWdlbmVyYXRvci1oaXN0b3J5LmNvbXBvbmVudC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcG9wdXAvZ2VuZXJhdG9yL3Bhc3N3b3JkLWdlbmVyYXRvci1oaXN0b3J5LmNvbXBvbmVudC5odG1sIiwid2VicGFjazovLy8uL3NyYy9wb3B1cC9nZW5lcmF0b3IvcGFzc3dvcmQtZ2VuZXJhdG9yLmNvbXBvbmVudC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcG9wdXAvZ2VuZXJhdG9yL3Bhc3N3b3JkLWdlbmVyYXRvci5jb21wb25lbnQuaHRtbCIsIndlYnBhY2s6Ly8vLi9zcmMvcG9wdXAvbWFpbi50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcG9wdXAvcHJpdmF0ZS1tb2RlLmNvbXBvbmVudC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcG9wdXAvcHJpdmF0ZS1tb2RlLmNvbXBvbmVudC5odG1sIiwid2VicGFjazovLy8uL3NyYy9wb3B1cC9zY3NzL3BvcHVwLnNjc3MiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BvcHVwL3NlbmQvZWZmbHV4LWRhdGVzLmNvbXBvbmVudC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcG9wdXAvc2VuZC9lZmZsdXgtZGF0ZXMuY29tcG9uZW50Lmh0bWwiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BvcHVwL3NlbmQvc2VuZC1hZGQtZWRpdC5jb21wb25lbnQudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BvcHVwL3NlbmQvc2VuZC1hZGQtZWRpdC5jb21wb25lbnQuaHRtbCIsIndlYnBhY2s6Ly8vLi9zcmMvcG9wdXAvc2VuZC9zZW5kLWdyb3VwaW5ncy5jb21wb25lbnQudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BvcHVwL3NlbmQvc2VuZC1ncm91cGluZ3MuY29tcG9uZW50Lmh0bWwiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BvcHVwL3NlbmQvc2VuZC10eXBlLmNvbXBvbmVudC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcG9wdXAvc2VuZC9zZW5kLXR5cGUuY29tcG9uZW50Lmh0bWwiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BvcHVwL3NlcnZpY2VzL2RlYm91bmNlTmF2aWdhdGlvblNlcnZpY2UudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BvcHVwL3NlcnZpY2VzL2xhdW5jaC1ndWFyZC5zZXJ2aWNlLnRzIiwid2VicGFjazovLy8uL3NyYy9wb3B1cC9zZXJ2aWNlcy9sb2NrLWd1YXJkLnNlcnZpY2UudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BvcHVwL3NlcnZpY2VzL3Bhc3N3b3JkLXJlcHJvbXB0LnNlcnZpY2UudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BvcHVwL3NlcnZpY2VzL3BvcHVwLXNlYXJjaC5zZXJ2aWNlLnRzIiwid2VicGFjazovLy8uL3NyYy9wb3B1cC9zZXJ2aWNlcy9wb3B1cC11dGlscy5zZXJ2aWNlLnRzIiwid2VicGFjazovLy8uL3NyYy9wb3B1cC9zZXJ2aWNlcy9zZXJ2aWNlcy5tb2R1bGUudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BvcHVwL3NlcnZpY2VzL3VuYXV0aC1ndWFyZC5zZXJ2aWNlLnRzIiwid2VicGFjazovLy8uL3NyYy9wb3B1cC9zZXR0aW5ncy9leGNsdWRlZC1kb21haW5zLmNvbXBvbmVudC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcG9wdXAvc2V0dGluZ3MvZXhjbHVkZWQtZG9tYWlucy5jb21wb25lbnQuaHRtbCIsIndlYnBhY2s6Ly8vLi9zcmMvcG9wdXAvc2V0dGluZ3MvZXhwb3J0LmNvbXBvbmVudC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcG9wdXAvc2V0dGluZ3MvZXhwb3J0LmNvbXBvbmVudC5odG1sIiwid2VicGFjazovLy8uL3NyYy9wb3B1cC9zZXR0aW5ncy9mb2xkZXItYWRkLWVkaXQuY29tcG9uZW50LnRzIiwid2VicGFjazovLy8uL3NyYy9wb3B1cC9zZXR0aW5ncy9mb2xkZXItYWRkLWVkaXQuY29tcG9uZW50Lmh0bWwiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BvcHVwL3NldHRpbmdzL2ZvbGRlcnMuY29tcG9uZW50LnRzIiwid2VicGFjazovLy8uL3NyYy9wb3B1cC9zZXR0aW5ncy9mb2xkZXJzLmNvbXBvbmVudC5odG1sIiwid2VicGFjazovLy8uL3NyYy9wb3B1cC9zZXR0aW5ncy9vcHRpb25zLmNvbXBvbmVudC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcG9wdXAvc2V0dGluZ3Mvb3B0aW9ucy5jb21wb25lbnQuaHRtbCIsIndlYnBhY2s6Ly8vLi9zcmMvcG9wdXAvc2V0dGluZ3MvcHJlbWl1bS5jb21wb25lbnQudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BvcHVwL3NldHRpbmdzL3ByZW1pdW0uY29tcG9uZW50Lmh0bWwiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BvcHVwL3NldHRpbmdzL3NldHRpbmdzLmNvbXBvbmVudC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcG9wdXAvc2V0dGluZ3Mvc2V0dGluZ3MuY29tcG9uZW50Lmh0bWwiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BvcHVwL3NldHRpbmdzL3N5bmMuY29tcG9uZW50LnRzIiwid2VicGFjazovLy8uL3NyYy9wb3B1cC9zZXR0aW5ncy9zeW5jLmNvbXBvbmVudC5odG1sIiwid2VicGFjazovLy8uL3NyYy9wb3B1cC9zZXR0aW5ncy92YXVsdC10aW1lb3V0LWlucHV0LmNvbXBvbmVudC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcG9wdXAvc2V0dGluZ3MvdmF1bHQtdGltZW91dC1pbnB1dC5jb21wb25lbnQuaHRtbCIsIndlYnBhY2s6Ly8vLi9zcmMvcG9wdXAvdGFicy5jb21wb25lbnQudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BvcHVwL3RhYnMuY29tcG9uZW50Lmh0bWwiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BvcHVwL3ZhdWx0L2FkZC1lZGl0LWN1c3RvbS1maWVsZHMuY29tcG9uZW50LnRzIiwid2VicGFjazovLy8uL3NyYy9wb3B1cC92YXVsdC9hZGQtZWRpdC1jdXN0b20tZmllbGRzLmNvbXBvbmVudC5odG1sIiwid2VicGFjazovLy8uL3NyYy9wb3B1cC92YXVsdC9hZGQtZWRpdC5jb21wb25lbnQudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BvcHVwL3ZhdWx0L2FkZC1lZGl0LmNvbXBvbmVudC5odG1sIiwid2VicGFjazovLy8uL3NyYy9wb3B1cC92YXVsdC9hdHRhY2htZW50cy5jb21wb25lbnQudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BvcHVwL3ZhdWx0L2F0dGFjaG1lbnRzLmNvbXBvbmVudC5odG1sIiwid2VicGFjazovLy8uL3NyYy9wb3B1cC92YXVsdC9jaXBoZXJzLmNvbXBvbmVudC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcG9wdXAvdmF1bHQvY2lwaGVycy5jb21wb25lbnQuaHRtbCIsIndlYnBhY2s6Ly8vLi9zcmMvcG9wdXAvdmF1bHQvY29sbGVjdGlvbnMuY29tcG9uZW50LnRzIiwid2VicGFjazovLy8uL3NyYy9wb3B1cC92YXVsdC9jb2xsZWN0aW9ucy5jb21wb25lbnQuaHRtbCIsIndlYnBhY2s6Ly8vLi9zcmMvcG9wdXAvdmF1bHQvY3VycmVudC10YWIuY29tcG9uZW50LnRzIiwid2VicGFjazovLy8uL3NyYy9wb3B1cC92YXVsdC9jdXJyZW50LXRhYi5jb21wb25lbnQuaHRtbCIsIndlYnBhY2s6Ly8vLi9zcmMvcG9wdXAvdmF1bHQvZ3JvdXBpbmdzLmNvbXBvbmVudC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcG9wdXAvdmF1bHQvZ3JvdXBpbmdzLmNvbXBvbmVudC5odG1sIiwid2VicGFjazovLy8uL3NyYy9wb3B1cC92YXVsdC9wYXNzd29yZC1oaXN0b3J5LmNvbXBvbmVudC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcG9wdXAvdmF1bHQvcGFzc3dvcmQtaGlzdG9yeS5jb21wb25lbnQuaHRtbCIsIndlYnBhY2s6Ly8vLi9zcmMvcG9wdXAvdmF1bHQvc2hhcmUuY29tcG9uZW50LnRzIiwid2VicGFjazovLy8uL3NyYy9wb3B1cC92YXVsdC9zaGFyZS5jb21wb25lbnQuaHRtbCIsIndlYnBhY2s6Ly8vLi9zcmMvcG9wdXAvdmF1bHQvdmlldy1jdXN0b20tZmllbGRzLmNvbXBvbmVudC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcG9wdXAvdmF1bHQvdmlldy1jdXN0b20tZmllbGRzLmNvbXBvbmVudC5odG1sIiwid2VicGFjazovLy8uL3NyYy9wb3B1cC92YXVsdC92aWV3LmNvbXBvbmVudC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcG9wdXAvdmF1bHQvdmlldy5jb21wb25lbnQuaHRtbCIsIndlYnBhY2s6Ly8vLi9zcmMvc2VydmljZXMvYWJzdHJhY3Rpb25zL2F1dG9maWxsLnNlcnZpY2UudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3NlcnZpY2VzL2Jyb3dzZXJNZXNzYWdpbmcuc2VydmljZS50cyJdLCJuYW1l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QVEsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUNuQywyRUFBa0IsQ0FBQyxrRUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ25DLDJFQUFrQixDQUFDLGtFQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDbkMsMkVBQWtCLENBQUMsa0VBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUNuQywyRUFBa0IsQ0FBQyxrRUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ25DLDJFQUFrQixDQUFDLGtFQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDbkMsMkVBQWtCLENBQUMsa0VBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUNuQywyRUFBa0IsQ0FBQyxrRUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ25DLDJFQUFrQixDQUFDLGtFQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDbkMsMkVBQWtCLENBQUMscUVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUN4QywyRUFBa0IsQ0FBQyxxRUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ3hDLDJFQUFrQixDQUFDLGtFQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDbkMsMkVBQWtCLENBQUMsa0VBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUNuQywyRUFBa0IsQ0FBQyxrRUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ25DLDJFQUFrQixDQUFDLGtFQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDbkMsMkVBQWtCLENBQUMsa0VBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUNuQywyRUFBa0IsQ0FBQyxrRUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ25DLDJFQUFrQixDQUFDLGtFQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDbkMsMkVBQWtCLENBQUMsa0VBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUNuQywyRUFBa0IsQ0FBQyxrRUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ25DLDJFQUFrQixDQUFDLGtFQUFRLEVBQUUsSUFBSSxDQUFDLENB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QUM7UUFDaEIsQ0FBQztLQUFBOzswRUEvTlEsYUFBYTs2RkFBYixhQUFhO1FDN0MxQix5RUFBUTtRQUNKO1FBQUEseUVBQWtCO1FBQ2Q7UUFBQSw0RUFBcUQ7UUFBbEIscUlBQVMsV0FBTyxJQUFDO1FBQUMsdURBQWtCOztRQUFBLDREQUFTO1FBQ3BGO1FBQUEsNERBQU07UUFDTjtRQUFBLHlFQUFvQjtRQUNoQjtRQUFBLDJFQUFvQjtRQUFBLHdEQUFxQjs7UUFBQSw0REFBTztRQUNwRDtRQUFBLDREQUFNO1FBQ047UUFBQSwyR0FFTTtRQUNWO1FBQUEsNERBQVM7UUFDVDtRQUFBLHFIQWdUVTtRQUNWOztRQTFUNkQsMERBQWtCO1FBQWxCLHlJQUFrQjtRQUduRCwwREFBcUI7UUFBckIsNklBQXFCO1FBRXpCLDBEQUFZO1FBQVosNEVBQVk7UUFJMUIsMERBQVk7UUFBWiw0RUFBWTs7a0lEa0NULGFBQWE7Y0FKekIsdURBQVM7ZUFBQztnQkFDUCxRQUFRLEVBQUUsZ0JBQWdCO2dCQUMxQixXQUFXLEVBQUUscUJBQXFCO2FBQ3JDOzs7Ozs7Ozs7Ozs7OztBRTFDRDtBQUFBO0FBQU8sTUFBZSxlQUFlO0NBSXBDOzs7Ozs7Ozs7Ozs7O0FDSkQ7QUFBQTtBQUFlLE1BQU0sdUJBQXVCO0lBQ3hDLElBQUksQ0FBQyxVQUFrQixFQUFFLE1BQVcsRUFBRTtRQUNsQyxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNoRSxNQUFNLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN4QyxDQUFDO0NBQ0oiLCJmaWxlIjoicG9wdXAvbWFpbi5qcyIsInNvdXJjZXNDb250ZW50IjpbIiBcdC8vIGluc3RhbGwgYSBKU09OUCBjYWxsYmFjayBmb3IgY2h1bmsgbG9hZGluZ1xuIFx0ZnVuY3Rpb24gd2VicGFja0pzb25wQ2FsbGJhY2soZGF0YSkge1xuIFx0XHR2YXIgY2h1bmtJZHMgPSBkYXRhWzBdO1xuIFx0XHR2YXIgbW9yZU1vZHVsZXMgPSBkYXRhWzFdO1xuIFx0XHR2YXIgZXhlY3V0ZU1vZHVsZXMgPSBkYXRhWzJdO1xuXG4gXHRcdC8vIGFkZCBcIm1vcmVNb2R1bGVzXCIgdG8gdGhlIG1vZHVsZXMgb2JqZWN0LFxuIFx0XHQvLyB0aGVuIGZsYWcgYWxsIFwiY2h1bmtJZHNcIiBhcyBsb2FkZWQgYW5kIGZpcmUgY2FsbGJhY2tcbiBcdFx0dmFyIG1vZHVsZUlkLCBjaHVua0lkLCBpID0gMCwgcmVzb2x2ZXMgPSBbXTtcbiBcdFx0Zm9yKDtpIDwgY2h1bmtJZHMubGVuZ3RoOyBpKyspIHtcbiBcdFx0XHRjaHVua0lkID0gY2h1bmtJZHNbaV07XG4gXHRcdFx0aWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGluc3RhbGxlZENodW5rcywgY2h1bmtJZCkgJiYgaW5zdGFsbGVkQ2h1bmtzW2NodW5rSWRdKSB7XG4gXHRcdFx0XHRyZXNvbHZlcy5wdXNoKGluc3RhbGxlZENodW5rc1tjaHVua0lkXVswXSk7XG4gXHRcdFx0fVxuIFx0XHRcdGluc3RhbGxlZENodW5rc1tjaHVua0lkXSA9IDA7XG4gXHRcdH1cbiBcdFx0Zm9yKG1vZHVsZUlkIGluIG1vcmVNb2R1bGVzKSB7XG4gXHRcdFx0aWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vcmVNb2R1bGVzLCBtb2R1bGVJZCkpIHtcbiBcdFx0XHRcdG1vZHVsZXNbbW9kdWxlSWRdID0gbW9yZU1vZHVsZXNbbW9kdWxlSWRdO1xuIFx0XHRcdH1cbiBcdFx0fVxuIFx0XHRpZihwYXJlbnRKc29ucEZ1bmN0aW9uKSBwYXJlbnRKc29ucEZ1bmN0aW9uKGRhdGEpO1xuXG4gXHRcdHdoaWxlKHJlc29sdmVzLmxlbmd0aCkge1xuIFx0XHRcdHJlc29sdmVzLnNoaWZ0KCkoKTtcbiBcdFx0fVxuXG4gXHRcdC8vIGFkZCBlbnRyeSBtb2R1bGVzIGZyb20gbG9hZGVkIGNodW5rIHRvIGRlZmVycmVkIGxpc3RcbiBcdFx0ZGVmZXJyZWRNb2R1bGVzLnB1c2guYXBwbHkoZGVmZXJyZWRNb2R1bGVzLCBleGVjdXRlTW9kdWxlcyB8fCBbXSk7XG5cbiBcdFx0Ly8gcnVuIGRlZmVycmVkIG1vZHVsZXMgd2hlbiBhbGwgY2h1bmtzIHJlYWR5XG4gXHRcdHJldHVybiBjaGVja0RlZmVycmVkTW9kdWxlcygpO1xuIFx0fTtcbiBcdGZ1bmN0aW9uIGNoZWNrRGVmZXJyZWRNb2R1bGVzKCkge1xuIFx0XHR2YXIgcmVzdWx0O1xuIFx0XHRmb3IodmFyIGkgPSAwOyBpIDwgZGVmZXJyZWRNb2R1bGVzLmxlbmd0aDsgaSsrKSB7XG4gXHRcdFx0dmFyIGRlZmVycmVkTW9kdWxlID0gZGVmZXJyZWRNb2R1bGVzW2ldO1xuIFx0XHRcdHZhciBmdWxmaWxsZWQgPSB0cnVlO1xuIFx0XHRcdGZvcih2YXIgaiA9IDE7IGogPCBkZWZlcnJlZE1vZHVsZS5sZW5ndGg7IGorKykge1xuIFx0XHRcdFx0dmFyIGRlcElkID0gZGVmZXJyZWRNb2R1bGVbal07XG4gXHRcdFx0XHRpZihpbnN0YWxsZWRDaHVua3NbZGVwSWRdICE9PSAwKSBmdWxmaWxsZWQgPSBmYWxzZTtcbiBcdFx0XHR9XG4gXHRcdFx0aWYoZnVsZmlsbGVkKSB7XG4gXHRcdFx0XHRkZWZlcnJlZE1vZHVsZXMuc3BsaWNlKGktLSwgMSk7XG4gXHRcdFx0XHRyZXN1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IGRlZmVycmVkTW9kdWxlWzBdKTtcbiBcdFx0XHR9XG4gXHRcdH1cblxuIFx0XHRyZXR1cm4gcmVzdWx0O1xuIFx0fVxuXG4gXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBvYmplY3QgdG8gc3RvcmUgbG9hZGVkIGFuZCBsb2FkaW5nIGNodW5rc1xuIFx0Ly8gdW5kZWZpbmVkID0gY2h1bmsgbm90IGxvYWRlZCwgbnVsbCA9IGNodW5rIHByZWxvYWRlZC9wcmVmZXRjaGVkXG4gXHQvLyBQcm9taXNlID0gY2h1bmsgbG9hZGluZywgMCA9IGNodW5rIGxvYWRlZFxuIFx0dmFyIGluc3RhbGxlZENodW5rcyA9IHtcbiBcdFx0XCJwb3B1cC9tYWluXCI6IDBcbiBcdH07XG5cbiBcdHZhciBkZWZlcnJlZE1vZHVsZXMgPSBbXTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuIFx0XHR9XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4gXHR9O1xuXG4gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3RcbiBcdC8vIG1vZGUgJiAxOiB2YWx1ZSBpcyBhIG1vZHVsZSBpZCwgcmVxdWlyZSBpdFxuIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3RcbiBcdC8vIG1vZGUgJiA4fDE6IGJlaGF2ZSBsaWtlIHJlcXVpcmVcbiBcdF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18odmFsdWUpO1xuIFx0XHRpZihtb2RlICYgOCkgcmV0dXJuIHZhbHVlO1xuIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIobnMpO1xuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbiBcdFx0cmV0dXJuIG5zO1xuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuIFx0dmFyIGpzb25wQXJyYXkgPSB3aW5kb3dbXCJ3ZWJwYWNrSnNvbnBcIl0gPSB3aW5kb3dbXCJ3ZWJwYWNrSnNvbnBcIl0gfHwgW107XG4gXHR2YXIgb2xkSnNvbnBGdW5jdGlvbiA9IGpzb25wQXJyYXkucHVzaC5iaW5kKGpzb25wQXJyYXkpO1xuIFx0anNvbnBBcnJheS5wdXNoID0gd2VicGFja0pzb25wQ2FsbGJhY2s7XG4gXHRqc29ucEFycmF5ID0ganNvbnBBcnJheS5zbGljZSgpO1xuIFx0Zm9yKHZhciBpID0gMDsgaSA8IGpzb25wQXJyYXkubGVuZ3RoOyBpKyspIHdlYnBhY2tKc29ucENhbGxiYWNrKGpzb25wQXJyYXlbaV0pO1xuIFx0dmFyIHBhcmVudEpzb25wRnVuY3Rpb24gPSBvbGRKc29ucEZ1bmN0aW9uO1xuXG5cbiBcdC8vIGFkZCBlbnRyeSBtb2R1bGUgdG8gZGVmZXJyZWQgbGlzdFxuIFx0ZGVmZXJyZWRNb2R1bGVzLnB1c2goW1wiLi9zcmMvcG9wdXAvbWFpbi50c1wiLFwicG9wdXAvdmVuZG9yXCIsXCJwb3B1cC92ZW5kb3ItYW5ndWxhclwiXSk7XG4gXHQvLyBydW4gZGVmZXJyZWQgbW9kdWxlcyB3aGVuIHJlYWR5XG4gXHRyZXR1cm4gY2hlY2tEZWZlcnJlZE1vZHVsZXMoKTtcbiIsImZ1bmN0aW9uIHdlYnBhY2tFbXB0eUFzeW5jQ29udGV4dChyZXEpIHtcblx0Ly8gSGVyZSBQcm9taXNlLnJlc29sdmUoKS50aGVuKCkgaXMgdXNlZCBpbnN0ZWFkIG9mIG5ldyBQcm9taXNlKCkgdG8gcHJldmVudFxuXHQvLyB1bmNhdWdodCBleGNlcHRpb24gcG9wcGluZyB1cCBpbiBkZXZ0b29sc1xuXHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbihmdW5jdGlvbigpIHtcblx0XHR2YXIgZSA9IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIgKyByZXEgKyBcIidcIik7XG5cdFx0ZS5jb2RlID0gJ01PRFVMRV9OT1RfRk9VTkQnO1xuXHRcdHRocm93IGU7XG5cdH0pO1xufVxud2VicGFja0VtcHR5QXN5bmNDb250ZXh0LmtleXMgPSBmdW5jdGlvbigpIHsgcmV0dXJuIFtdOyB9O1xud2VicGFja0VtcHR5QXN5bmNDb250ZXh0LnJlc29sdmUgPSB3ZWJwYWNrRW1wdHlBc3luY0NvbnRleHQ7XG5tb2R1bGUuZXhwb3J0cyA9IHdlYnBhY2tFbXB0eUFzeW5jQ29udGV4dDtcbndlYnBhY2tFbXB0eUFzeW5jQ29udGV4dC5pZCA9IFwiLi8kJF9sYXp5X3JvdXRlX3Jlc291cmNlIGxhenkgcmVjdXJzaXZlXCI7IiwiaW1wb3J0IHtcbiAgICBEaXJlY3RpdmUsXG4gICAgSW5wdXQsXG4gICAgT25DaGFuZ2VzLFxuICAgIFNpbXBsZUNoYW5nZXMsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQge1xuICAgIENka0RyYWdEcm9wLFxuICAgIG1vdmVJdGVtSW5BcnJheSxcbn0gZnJvbSAnQGFuZ3VsYXIvY2RrL2RyYWctZHJvcCc7XG5cbmltcG9ydCB7IEV2ZW50U2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvZXZlbnQuc2VydmljZSc7XG5pbXBvcnQgeyBJMThuU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvaTE4bi5zZXJ2aWNlJztcblxuaW1wb3J0IHsgQ2lwaGVyVmlldyB9IGZyb20gJ2pzbGliLWNvbW1vbi9tb2RlbHMvdmlldy9jaXBoZXJWaWV3JztcbmltcG9ydCB7IEZpZWxkVmlldyB9IGZyb20gJ2pzbGliLWNvbW1vbi9tb2RlbHMvdmlldy9maWVsZFZpZXcnO1xuXG5pbXBvcnQgeyBDaXBoZXJUeXBlIH0gZnJvbSAnanNsaWItY29tbW9uL2VudW1zL2NpcGhlclR5cGUnO1xuaW1wb3J0IHsgRXZlbnRUeXBlIH0gZnJvbSAnanNsaWItY29tbW9uL2VudW1zL2V2ZW50VHlwZSc7XG5pbXBvcnQgeyBGaWVsZFR5cGUgfSBmcm9tICdqc2xpYi1jb21tb24vZW51bXMvZmllbGRUeXBlJztcblxuaW1wb3J0IHsgVXRpbHMgfSBmcm9tICdqc2xpYi1jb21tb24vbWlzYy91dGlscyc7XG5cbkBEaXJlY3RpdmUoKVxuZXhwb3J0IGNsYXNzIEFkZEVkaXRDdXN0b21GaWVsZHNDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xuICAgIEBJbnB1dCgpIGNpcGhlcjogQ2lwaGVyVmlldztcbiAgICBASW5wdXQoKSB0aGlzQ2lwaGVyVHlwZTogQ2lwaGVyVHlwZTtcbiAgICBASW5wdXQoKSBlZGl0TW9kZTogYm9vbGVhbjtcblxuICAgIGFkZEZpZWxkVHlwZTogRmllbGRUeXBlID0gRmllbGRUeXBlLlRleHQ7XG4gICAgYWRkRmllbGRUeXBlT3B0aW9uczogYW55W107XG4gICAgYWRkRmllbGRMaW5rZWRUeXBlT3B0aW9uOiBhbnk7XG4gICAgbGlua2VkRmllbGRPcHRpb25zOiBhbnlbXSA9IFtdO1xuXG4gICAgY2lwaGVyVHlwZSA9IENpcGhlclR5cGU7XG4gICAgZmllbGRUeXBlID0gRmllbGRUeXBlO1xuICAgIGV2ZW50VHlwZSA9IEV2ZW50VHlwZTtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgaTE4blNlcnZpY2U6IEkxOG5TZXJ2aWNlLCBwcml2YXRlIGV2ZW50U2VydmljZTogRXZlbnRTZXJ2aWNlKSB7XG4gICAgICAgIHRoaXMuYWRkRmllbGRUeXBlT3B0aW9ucyA9IFtcbiAgICAgICAgICAgIHsgbmFtZTogaTE4blNlcnZpY2UudCgnY2ZUeXBlVGV4dCcpLCB2YWx1ZTogRmllbGRUeXBlLlRleHQgfSxcbiAgICAgICAgICAgIHsgbmFtZTogaTE4blNlcnZpY2UudCgnY2ZUeXBlSGlkZGVuJyksIHZhbHVlOiBGaWVsZFR5cGUuSGlkZGVuIH0sXG4gICAgICAgICAgICB7IG5hbWU6IGkxOG5TZXJ2aWNlLnQoJ2NmVHlwZUJvb2xlYW4nKSwgdmFsdWU6IEZpZWxkVHlwZS5Cb29sZWFuIH0sXG4gICAgICAgIF07XG4gICAgICAgIHRoaXMuYWRkRmllbGRMaW5rZWRUeXBlT3B0aW9uID0geyBuYW1lOiB0aGlzLmkxOG5TZXJ2aWNlLnQoJ2NmVHlwZUxpbmtlZCcpLCB2YWx1ZTogRmllbGRUeXBlLkxpbmtlZCB9O1xuICAgIH1cblxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICAgICAgaWYgKGNoYW5nZXMudGhpc0NpcGhlclR5cGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5zZXRMaW5rZWRGaWVsZE9wdGlvbnMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFkZEZpZWxkKCkge1xuICAgICAgICBpZiAodGhpcy5jaXBoZXIuZmllbGRzID09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuY2lwaGVyLmZpZWxkcyA9IFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZiA9IG5ldyBGaWVsZFZpZXcoKTtcbiAgICAgICAgZi50eXBlID0gdGhpcy5hZGRGaWVsZFR5cGU7XG4gICAgICAgIGYubmV3RmllbGQgPSB0cnVlO1xuXG4gICAgICAgIGlmIChmLnR5cGUgPT09IEZpZWxkVHlwZS5MaW5rZWQpIHtcbiAgICAgICAgICAgIGYubGlua2VkSWQgPSB0aGlzLmxpbmtlZEZpZWxkT3B0aW9uc1swXS52YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2lwaGVyLmZpZWxkcy5wdXNoKGYpO1xuICAgIH1cblxuICAgIHJlbW92ZUZpZWxkKGZpZWxkOiBGaWVsZFZpZXcpIHtcbiAgICAgICAgY29uc3QgaSA9IHRoaXMuY2lwaGVyLmZpZWxkcy5pbmRleE9mKGZpZWxkKTtcbiAgICAgICAgaWYgKGkgPiAtMSkge1xuICAgICAgICAgICAgdGhpcy5jaXBoZXIuZmllbGRzLnNwbGljZShpLCAxKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHRvZ2dsZUZpZWxkVmFsdWUoZmllbGQ6IEZpZWxkVmlldykge1xuICAgICAgICBjb25zdCBmID0gKGZpZWxkIGFzIGFueSk7XG4gICAgICAgIGYuc2hvd1ZhbHVlID0gIWYuc2hvd1ZhbHVlO1xuICAgICAgICBpZiAodGhpcy5lZGl0TW9kZSAmJiBmLnNob3dWYWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5ldmVudFNlcnZpY2UuY29sbGVjdChFdmVudFR5cGUuQ2lwaGVyX0NsaWVudFRvZ2dsZWRIaWRkZW5GaWVsZFZpc2libGUsIHRoaXMuY2lwaGVyLmlkKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHRyYWNrQnlGdW5jdGlvbihpbmRleDogbnVtYmVyLCBpdGVtOiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgIH1cblxuICAgIGRyb3AoZXZlbnQ6IENka0RyYWdEcm9wPHN0cmluZ1tdPikge1xuICAgICAgICBtb3ZlSXRlbUluQXJyYXkodGhpcy5jaXBoZXIuZmllbGRzLCBldmVudC5wcmV2aW91c0luZGV4LCBldmVudC5jdXJyZW50SW5kZXgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0TGlua2VkRmllbGRPcHRpb25zKCkge1xuICAgICAgICAvLyBEZWxldGUgYW55IExpbmtlZCBjdXN0b20gZmllbGRzIGlmIHRoZSBpdGVtIHR5cGUgZG9lcyBub3Qgc3VwcG9ydCB0aGVtXG4gICAgICAgIGlmICh0aGlzLmNpcGhlci5saW5rZWRGaWVsZE9wdGlvbnMgPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5jaXBoZXIuZmllbGRzID0gdGhpcy5jaXBoZXIuZmllbGRzLmZpbHRlcihmID0+IGYudHlwZSAhPT0gRmllbGRUeXBlLkxpbmtlZCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBvcHRpb25zOiBhbnkgPSBbXTtcbiAgICAgICAgdGhpcy5jaXBoZXIubGlua2VkRmllbGRPcHRpb25zLmZvckVhY2goKGxpbmtlZEZpZWxkT3B0aW9uLCBpZCkgPT5cbiAgICAgICAgICAgIG9wdGlvbnMucHVzaCh7IG5hbWU6IHRoaXMuaTE4blNlcnZpY2UudChsaW5rZWRGaWVsZE9wdGlvbi5pMThuS2V5KSwgdmFsdWU6IGlkIH0pKTtcbiAgICAgICAgdGhpcy5saW5rZWRGaWVsZE9wdGlvbnMgPSBvcHRpb25zLnNvcnQoVXRpbHMuZ2V0U29ydEZ1bmN0aW9uKHRoaXMuaTE4blNlcnZpY2UsICduYW1lJykpO1xuXG4gICAgICAgIGlmICghdGhpcy5lZGl0TW9kZSkge1xuICAgICAgICAgICAgdGhpcy5jaXBoZXIuZmllbGRzXG4gICAgICAgICAgICAgICAgLmZpbHRlcihmID0+IGYudHlwZSA9IEZpZWxkVHlwZS5MaW5rZWQpXG4gICAgICAgICAgICAgICAgLmZvckVhY2goZiA9PiBmLmxpbmtlZElkID0gdGhpcy5saW5rZWRGaWVsZE9wdGlvbnNbMF0udmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiaW1wb3J0IHtcbiAgICBEaXJlY3RpdmUsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIElucHV0LFxuICAgIE9uSW5pdCxcbiAgICBPdXRwdXQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBDaXBoZXJSZXByb21wdFR5cGUgfSBmcm9tICdqc2xpYi1jb21tb24vZW51bXMvY2lwaGVyUmVwcm9tcHRUeXBlJztcbmltcG9ydCB7IENpcGhlclR5cGUgfSBmcm9tICdqc2xpYi1jb21tb24vZW51bXMvY2lwaGVyVHlwZSc7XG5pbXBvcnQgeyBFdmVudFR5cGUgfSBmcm9tICdqc2xpYi1jb21tb24vZW51bXMvZXZlbnRUeXBlJztcbmltcG9ydCB7IE9yZ2FuaXphdGlvblVzZXJTdGF0dXNUeXBlIH0gZnJvbSAnanNsaWItY29tbW9uL2VudW1zL29yZ2FuaXphdGlvblVzZXJTdGF0dXNUeXBlJztcbmltcG9ydCB7IFBvbGljeVR5cGUgfSBmcm9tICdqc2xpYi1jb21tb24vZW51bXMvcG9saWN5VHlwZSc7XG5pbXBvcnQgeyBTZWN1cmVOb3RlVHlwZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9lbnVtcy9zZWN1cmVOb3RlVHlwZSc7XG5pbXBvcnQgeyBVcmlNYXRjaFR5cGUgfSBmcm9tICdqc2xpYi1jb21tb24vZW51bXMvdXJpTWF0Y2hUeXBlJztcblxuaW1wb3J0IHsgQXVkaXRTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9hdWRpdC5zZXJ2aWNlJztcbmltcG9ydCB7IENpcGhlclNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL2NpcGhlci5zZXJ2aWNlJztcbmltcG9ydCB7IENvbGxlY3Rpb25TZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9jb2xsZWN0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgRXZlbnRTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9ldmVudC5zZXJ2aWNlJztcbmltcG9ydCB7IEZvbGRlclNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL2ZvbGRlci5zZXJ2aWNlJztcbmltcG9ydCB7IEkxOG5TZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9pMThuLnNlcnZpY2UnO1xuaW1wb3J0IHsgTG9nU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvbG9nLnNlcnZpY2UnO1xuaW1wb3J0IHsgTWVzc2FnaW5nU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvbWVzc2FnaW5nLnNlcnZpY2UnO1xuaW1wb3J0IHsgUGxhdGZvcm1VdGlsc1NlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL3BsYXRmb3JtVXRpbHMuc2VydmljZSc7XG5pbXBvcnQgeyBQb2xpY3lTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9wb2xpY3kuc2VydmljZSc7XG5pbXBvcnQgeyBTdGF0ZVNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL3N0YXRlLnNlcnZpY2UnO1xuaW1wb3J0IHsgVXNlclNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL3VzZXIuc2VydmljZSc7XG5cbmltcG9ydCB7IENpcGhlciB9IGZyb20gJ2pzbGliLWNvbW1vbi9tb2RlbHMvZG9tYWluL2NpcGhlcic7XG5cbmltcG9ydCB7IENhcmRWaWV3IH0gZnJvbSAnanNsaWItY29tbW9uL21vZGVscy92aWV3L2NhcmRWaWV3JztcbmltcG9ydCB7IENpcGhlclZpZXcgfSBmcm9tICdqc2xpYi1jb21tb24vbW9kZWxzL3ZpZXcvY2lwaGVyVmlldyc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uVmlldyB9IGZyb20gJ2pzbGliLWNvbW1vbi9tb2RlbHMvdmlldy9jb2xsZWN0aW9uVmlldyc7XG5pbXBvcnQgeyBGb2xkZXJWaWV3IH0gZnJvbSAnanNsaWItY29tbW9uL21vZGVscy92aWV3L2ZvbGRlclZpZXcnO1xuaW1wb3J0IHsgSWRlbnRpdHlWaWV3IH0gZnJvbSAnanNsaWItY29tbW9uL21vZGVscy92aWV3L2lkZW50aXR5Vmlldyc7XG5pbXBvcnQgeyBMb2dpblVyaVZpZXcgfSBmcm9tICdqc2xpYi1jb21tb24vbW9kZWxzL3ZpZXcvbG9naW5VcmlWaWV3JztcbmltcG9ydCB7IExvZ2luVmlldyB9IGZyb20gJ2pzbGliLWNvbW1vbi9tb2RlbHMvdmlldy9sb2dpblZpZXcnO1xuaW1wb3J0IHsgU2VjdXJlTm90ZVZpZXcgfSBmcm9tICdqc2xpYi1jb21tb24vbW9kZWxzL3ZpZXcvc2VjdXJlTm90ZVZpZXcnO1xuXG5pbXBvcnQgeyBVdGlscyB9IGZyb20gJ2pzbGliLWNvbW1vbi9taXNjL3V0aWxzJztcblxuQERpcmVjdGl2ZSgpXG5leHBvcnQgY2xhc3MgQWRkRWRpdENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gICAgQElucHV0KCkgY2xvbmVNb2RlOiBib29sZWFuID0gZmFsc2U7XG4gICAgQElucHV0KCkgZm9sZGVySWQ6IHN0cmluZyA9IG51bGw7XG4gICAgQElucHV0KCkgY2lwaGVySWQ6IHN0cmluZztcbiAgICBASW5wdXQoKSB0eXBlOiBDaXBoZXJUeXBlO1xuICAgIEBJbnB1dCgpIGNvbGxlY3Rpb25JZHM6IHN0cmluZ1tdO1xuICAgIEBJbnB1dCgpIG9yZ2FuaXphdGlvbklkOiBzdHJpbmcgPSBudWxsO1xuICAgIEBPdXRwdXQoKSBvblNhdmVkQ2lwaGVyID0gbmV3IEV2ZW50RW1pdHRlcjxDaXBoZXJWaWV3PigpO1xuICAgIEBPdXRwdXQoKSBvbkRlbGV0ZWRDaXBoZXIgPSBuZXcgRXZlbnRFbWl0dGVyPENpcGhlclZpZXc+KCk7XG4gICAgQE91dHB1dCgpIG9uUmVzdG9yZWRDaXBoZXIgPSBuZXcgRXZlbnRFbWl0dGVyPENpcGhlclZpZXc+KCk7XG4gICAgQE91dHB1dCgpIG9uQ2FuY2VsbGVkID0gbmV3IEV2ZW50RW1pdHRlcjxDaXBoZXJWaWV3PigpO1xuICAgIEBPdXRwdXQoKSBvbkVkaXRBdHRhY2htZW50cyA9IG5ldyBFdmVudEVtaXR0ZXI8Q2lwaGVyVmlldz4oKTtcbiAgICBAT3V0cHV0KCkgb25TaGFyZUNpcGhlciA9IG5ldyBFdmVudEVtaXR0ZXI8Q2lwaGVyVmlldz4oKTtcbiAgICBAT3V0cHV0KCkgb25FZGl0Q29sbGVjdGlvbnMgPSBuZXcgRXZlbnRFbWl0dGVyPENpcGhlclZpZXc+KCk7XG4gICAgQE91dHB1dCgpIG9uR2VuZXJhdGVQYXNzd29yZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAgIGVkaXRNb2RlOiBib29sZWFuID0gZmFsc2U7XG4gICAgY2lwaGVyOiBDaXBoZXJWaWV3O1xuICAgIGZvbGRlcnM6IEZvbGRlclZpZXdbXTtcbiAgICBjb2xsZWN0aW9uczogQ29sbGVjdGlvblZpZXdbXSA9IFtdO1xuICAgIHRpdGxlOiBzdHJpbmc7XG4gICAgZm9ybVByb21pc2U6IFByb21pc2U8YW55PjtcbiAgICBkZWxldGVQcm9taXNlOiBQcm9taXNlPGFueT47XG4gICAgcmVzdG9yZVByb21pc2U6IFByb21pc2U8YW55PjtcbiAgICBjaGVja1Bhc3N3b3JkUHJvbWlzZTogUHJvbWlzZTxudW1iZXI+O1xuICAgIHNob3dQYXNzd29yZDogYm9vbGVhbiA9IGZhbHNlO1xuICAgIHNob3dDYXJkTnVtYmVyOiBib29sZWFuID0gZmFsc2U7XG4gICAgc2hvd0NhcmRDb2RlOiBib29sZWFuID0gZmFsc2U7XG4gICAgY2lwaGVyVHlwZSA9IENpcGhlclR5cGU7XG4gICAgdHlwZU9wdGlvbnM6IGFueVtdO1xuICAgIGNhcmRCcmFuZE9wdGlvbnM6IGFueVtdO1xuICAgIGNhcmRFeHBNb250aE9wdGlvbnM6IGFueVtdO1xuICAgIGlkZW50aXR5VGl0bGVPcHRpb25zOiBhbnlbXTtcbiAgICB1cmlNYXRjaE9wdGlvbnM6IGFueVtdO1xuICAgIG93bmVyc2hpcE9wdGlvbnM6IGFueVtdID0gW107XG4gICAgYXV0b2ZpbGxPblBhZ2VMb2FkT3B0aW9uczogYW55W107XG4gICAgY3VycmVudERhdGUgPSBuZXcgRGF0ZSgpO1xuICAgIGFsbG93UGVyc29uYWwgPSB0cnVlO1xuICAgIHJlcHJvbXB0OiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBwcm90ZWN0ZWQgd3JpdGVhYmxlQ29sbGVjdGlvbnM6IENvbGxlY3Rpb25WaWV3W107XG4gICAgcHJpdmF0ZSBwcmV2aW91c0NpcGhlcklkOiBzdHJpbmc7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgY2lwaGVyU2VydmljZTogQ2lwaGVyU2VydmljZSwgcHJvdGVjdGVkIGZvbGRlclNlcnZpY2U6IEZvbGRlclNlcnZpY2UsXG4gICAgICAgIHByb3RlY3RlZCBpMThuU2VydmljZTogSTE4blNlcnZpY2UsIHByb3RlY3RlZCBwbGF0Zm9ybVV0aWxzU2VydmljZTogUGxhdGZvcm1VdGlsc1NlcnZpY2UsXG4gICAgICAgIHByb3RlY3RlZCBhdWRpdFNlcnZpY2U6IEF1ZGl0U2VydmljZSwgcHJvdGVjdGVkIHN0YXRlU2VydmljZTogU3RhdGVTZXJ2aWNlLFxuICAgICAgICBwcm90ZWN0ZWQgdXNlclNlcnZpY2U6IFVzZXJTZXJ2aWNlLCBwcm90ZWN0ZWQgY29sbGVjdGlvblNlcnZpY2U6IENvbGxlY3Rpb25TZXJ2aWNlLFxuICAgICAgICBwcm90ZWN0ZWQgbWVzc2FnaW5nU2VydmljZTogTWVzc2FnaW5nU2VydmljZSwgcHJvdGVjdGVkIGV2ZW50U2VydmljZTogRXZlbnRTZXJ2aWNlLFxuICAgICAgICBwcm90ZWN0ZWQgcG9saWN5U2VydmljZTogUG9saWN5U2VydmljZSwgcHJpdmF0ZSBsb2dTZXJ2aWNlOiBMb2dTZXJ2aWNlKSB7XG4gICAgICAgIHRoaXMudHlwZU9wdGlvbnMgPSBbXG4gICAgICAgICAgICB7IG5hbWU6IGkxOG5TZXJ2aWNlLnQoJ3R5cGVMb2dpbicpLCB2YWx1ZTogQ2lwaGVyVHlwZS5Mb2dpbiB9LFxuICAgICAgICAgICAgeyBuYW1lOiBpMThuU2VydmljZS50KCd0eXBlQ2FyZCcpLCB2YWx1ZTogQ2lwaGVyVHlwZS5DYXJkIH0sXG4gICAgICAgICAgICB7IG5hbWU6IGkxOG5TZXJ2aWNlLnQoJ3R5cGVJZGVudGl0eScpLCB2YWx1ZTogQ2lwaGVyVHlwZS5JZGVudGl0eSB9LFxuICAgICAgICAgICAgeyBuYW1lOiBpMThuU2VydmljZS50KCd0eXBlU2VjdXJlTm90ZScpLCB2YWx1ZTogQ2lwaGVyVHlwZS5TZWN1cmVOb3RlIH0sXG4gICAgICAgIF07XG4gICAgICAgIHRoaXMuY2FyZEJyYW5kT3B0aW9ucyA9IFtcbiAgICAgICAgICAgIHsgbmFtZTogJy0tICcgKyBpMThuU2VydmljZS50KCdzZWxlY3QnKSArICcgLS0nLCB2YWx1ZTogbnVsbCB9LFxuICAgICAgICAgICAgeyBuYW1lOiAnVmlzYScsIHZhbHVlOiAnVmlzYScgfSxcbiAgICAgICAgICAgIHsgbmFtZTogJ01hc3RlcmNhcmQnLCB2YWx1ZTogJ01hc3RlcmNhcmQnIH0sXG4gICAgICAgICAgICB7IG5hbWU6ICdBbWVyaWNhbiBFeHByZXNzJywgdmFsdWU6ICdBbWV4JyB9LFxuICAgICAgICAgICAgeyBuYW1lOiAnRGlzY292ZXInLCB2YWx1ZTogJ0Rpc2NvdmVyJyB9LFxuICAgICAgICAgICAgeyBuYW1lOiAnRGluZXJzIENsdWInLCB2YWx1ZTogJ0RpbmVycyBDbHViJyB9LFxuICAgICAgICAgICAgeyBuYW1lOiAnSkNCJywgdmFsdWU6ICdKQ0InIH0sXG4gICAgICAgICAgICB7IG5hbWU6ICdNYWVzdHJvJywgdmFsdWU6ICdNYWVzdHJvJyB9LFxuICAgICAgICAgICAgeyBuYW1lOiAnVW5pb25QYXknLCB2YWx1ZTogJ1VuaW9uUGF5JyB9LFxuICAgICAgICAgICAgeyBuYW1lOiBpMThuU2VydmljZS50KCdvdGhlcicpLCB2YWx1ZTogJ090aGVyJyB9LFxuICAgICAgICBdO1xuICAgICAgICB0aGlzLmNhcmRFeHBNb250aE9wdGlvbnMgPSBbXG4gICAgICAgICAgICB7IG5hbWU6ICctLSAnICsgaTE4blNlcnZpY2UudCgnc2VsZWN0JykgKyAnIC0tJywgdmFsdWU6IG51bGwgfSxcbiAgICAgICAgICAgIHsgbmFtZTogJzAxIC0gJyArIGkxOG5TZXJ2aWNlLnQoJ2phbnVhcnknKSwgdmFsdWU6ICcxJyB9LFxuICAgICAgICAgICAgeyBuYW1lOiAnMDIgLSAnICsgaTE4blNlcnZpY2UudCgnZmVicnVhcnknKSwgdmFsdWU6ICcyJyB9LFxuICAgICAgICAgICAgeyBuYW1lOiAnMDMgLSAnICsgaTE4blNlcnZpY2UudCgnbWFyY2gnKSwgdmFsdWU6ICczJyB9LFxuICAgICAgICAgICAgeyBuYW1lOiAnMDQgLSAnICsgaTE4blNlcnZpY2UudCgnYXByaWwnKSwgdmFsdWU6ICc0JyB9LFxuICAgICAgICAgICAgeyBuYW1lOiAnMDUgLSAnICsgaTE4blNlcnZpY2UudCgnbWF5JyksIHZhbHVlOiAnNScgfSxcbiAgICAgICAgICAgIHsgbmFtZTogJzA2IC0gJyArIGkxOG5TZXJ2aWNlLnQoJ2p1bmUnKSwgdmFsdWU6ICc2JyB9LFxuICAgICAgICAgICAgeyBuYW1lOiAnMDcgLSAnICsgaTE4blNlcnZpY2UudCgnanVseScpLCB2YWx1ZTogJzcnIH0sXG4gICAgICAgICAgICB7IG5hbWU6ICcwOCAtICcgKyBpMThuU2VydmljZS50KCdhdWd1c3QnKSwgdmFsdWU6ICc4JyB9LFxuICAgICAgICAgICAgeyBuYW1lOiAnMDkgLSAnICsgaTE4blNlcnZpY2UudCgnc2VwdGVtYmVyJyksIHZhbHVlOiAnOScgfSxcbiAgICAgICAgICAgIHsgbmFtZTogJzEwIC0gJyArIGkxOG5TZXJ2aWNlLnQoJ29jdG9iZXInKSwgdmFsdWU6ICcxMCcgfSxcbiAgICAgICAgICAgIHsgbmFtZTogJzExIC0gJyArIGkxOG5TZXJ2aWNlLnQoJ25vdmVtYmVyJyksIHZhbHVlOiAnMTEnIH0sXG4gICAgICAgICAgICB7IG5hbWU6ICcxMiAtICcgKyBpMThuU2VydmljZS50KCdkZWNlbWJlcicpLCB2YWx1ZTogJzEyJyB9LFxuICAgICAgICBdO1xuICAgICAgICB0aGlzLmlkZW50aXR5VGl0bGVPcHRpb25zID0gW1xuICAgICAgICAgICAgeyBuYW1lOiAnLS0gJyArIGkxOG5TZXJ2aWNlLnQoJ3NlbGVjdCcpICsgJyAtLScsIHZhbHVlOiBudWxsIH0sXG4gICAgICAgICAgICB7IG5hbWU6IGkxOG5TZXJ2aWNlLnQoJ21yJyksIHZhbHVlOiBpMThuU2VydmljZS50KCdtcicpIH0sXG4gICAgICAgICAgICB7IG5hbWU6IGkxOG5TZXJ2aWNlLnQoJ21ycycpLCB2YWx1ZTogaTE4blNlcnZpY2UudCgnbXJzJykgfSxcbiAgICAgICAgICAgIHsgbmFtZTogaTE4blNlcnZpY2UudCgnbXMnKSwgdmFsdWU6IGkxOG5TZXJ2aWNlLnQoJ21zJykgfSxcbiAgICAgICAgICAgIHsgbmFtZTogaTE4blNlcnZpY2UudCgnZHInKSwgdmFsdWU6IGkxOG5TZXJ2aWNlLnQoJ2RyJykgfSxcbiAgICAgICAgXTtcbiAgICAgICAgdGhpcy51cmlNYXRjaE9wdGlvbnMgPSBbXG4gICAgICAgICAgICB7IG5hbWU6IGkxOG5TZXJ2aWNlLnQoJ2RlZmF1bHRNYXRjaERldGVjdGlvbicpLCB2YWx1ZTogbnVsbCB9LFxuICAgICAgICAgICAgeyBuYW1lOiBpMThuU2VydmljZS50KCdiYXNlRG9tYWluJyksIHZhbHVlOiBVcmlNYXRjaFR5cGUuRG9tYWluIH0sXG4gICAgICAgICAgICB7IG5hbWU6IGkxOG5TZXJ2aWNlLnQoJ2hvc3QnKSwgdmFsdWU6IFVyaU1hdGNoVHlwZS5Ib3N0IH0sXG4gICAgICAgICAgICB7IG5hbWU6IGkxOG5TZXJ2aWNlLnQoJ3N0YXJ0c1dpdGgnKSwgdmFsdWU6IFVyaU1hdGNoVHlwZS5TdGFydHNXaXRoIH0sXG4gICAgICAgICAgICB7IG5hbWU6IGkxOG5TZXJ2aWNlLnQoJ3JlZ0V4JyksIHZhbHVlOiBVcmlNYXRjaFR5cGUuUmVndWxhckV4cHJlc3Npb24gfSxcbiAgICAgICAgICAgIHsgbmFtZTogaTE4blNlcnZpY2UudCgnZXhhY3QnKSwgdmFsdWU6IFVyaU1hdGNoVHlwZS5FeGFjdCB9LFxuICAgICAgICAgICAgeyBuYW1lOiBpMThuU2VydmljZS50KCduZXZlcicpLCB2YWx1ZTogVXJpTWF0Y2hUeXBlLk5ldmVyIH0sXG4gICAgICAgIF07XG4gICAgICAgIHRoaXMuYXV0b2ZpbGxPblBhZ2VMb2FkT3B0aW9ucyA9IFtcbiAgICAgICAgICAgIHsgbmFtZTogaTE4blNlcnZpY2UudCgnYXV0b0ZpbGxPblBhZ2VMb2FkVXNlRGVmYXVsdCcpLCB2YWx1ZTogbnVsbCB9LFxuICAgICAgICAgICAgeyBuYW1lOiBpMThuU2VydmljZS50KCdhdXRvRmlsbE9uUGFnZUxvYWRZZXMnKSwgdmFsdWU6IHRydWUgfSxcbiAgICAgICAgICAgIHsgbmFtZTogaTE4blNlcnZpY2UudCgnYXV0b0ZpbGxPblBhZ2VMb2FkTm8nKSwgdmFsdWU6IGZhbHNlIH0sXG4gICAgICAgIF07XG4gICAgfVxuXG4gICAgYXN5bmMgbmdPbkluaXQoKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuaW5pdCgpO1xuICAgIH1cblxuICAgIGFzeW5jIGluaXQoKSB7XG4gICAgICAgIGlmIChhd2FpdCB0aGlzLnBvbGljeVNlcnZpY2UucG9saWN5QXBwbGllc1RvVXNlcihQb2xpY3lUeXBlLlBlcnNvbmFsT3duZXJzaGlwKSkge1xuICAgICAgICAgICAgdGhpcy5hbGxvd1BlcnNvbmFsID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBteUVtYWlsID0gYXdhaXQgdGhpcy51c2VyU2VydmljZS5nZXRFbWFpbCgpO1xuICAgICAgICAgICAgdGhpcy5vd25lcnNoaXBPcHRpb25zLnB1c2goeyBuYW1lOiBteUVtYWlsLCB2YWx1ZTogbnVsbCB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG9yZ3MgPSBhd2FpdCB0aGlzLnVzZXJTZXJ2aWNlLmdldEFsbE9yZ2FuaXphdGlvbnMoKTtcbiAgICAgICAgb3Jncy5zb3J0KFV0aWxzLmdldFNvcnRGdW5jdGlvbih0aGlzLmkxOG5TZXJ2aWNlLCAnbmFtZScpKS5mb3JFYWNoKG8gPT4ge1xuICAgICAgICAgICAgaWYgKG8uZW5hYmxlZCAmJiBvLnN0YXR1cyA9PT0gT3JnYW5pemF0aW9uVXNlclN0YXR1c1R5cGUuQ29uZmlybWVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vd25lcnNoaXBPcHRpb25zLnB1c2goeyBuYW1lOiBvLm5hbWUsIHZhbHVlOiBvLmlkIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCF0aGlzLmFsbG93UGVyc29uYWwpIHtcbiAgICAgICAgICAgIHRoaXMub3JnYW5pemF0aW9uSWQgPSB0aGlzLm93bmVyc2hpcE9wdGlvbnNbMF0udmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLndyaXRlYWJsZUNvbGxlY3Rpb25zID0gYXdhaXQgdGhpcy5sb2FkQ29sbGVjdGlvbnMoKTtcbiAgICB9XG5cbiAgICBhc3luYyBsb2FkKCkge1xuICAgICAgICB0aGlzLmVkaXRNb2RlID0gdGhpcy5jaXBoZXJJZCAhPSBudWxsO1xuICAgICAgICBpZiAodGhpcy5lZGl0TW9kZSkge1xuICAgICAgICAgICAgdGhpcy5lZGl0TW9kZSA9IHRydWU7XG4gICAgICAgICAgICBpZiAodGhpcy5jbG9uZU1vZGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNsb25lTW9kZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy50aXRsZSA9IHRoaXMuaTE4blNlcnZpY2UudCgnYWRkSXRlbScpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRpdGxlID0gdGhpcy5pMThuU2VydmljZS50KCdlZGl0SXRlbScpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy50aXRsZSA9IHRoaXMuaTE4blNlcnZpY2UudCgnYWRkSXRlbScpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYWRkRWRpdENpcGhlckluZm86IGFueSA9IGF3YWl0IHRoaXMuc3RhdGVTZXJ2aWNlLmdldDxhbnk+KCdhZGRFZGl0Q2lwaGVySW5mbycpO1xuICAgICAgICBpZiAoYWRkRWRpdENpcGhlckluZm8gIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5jaXBoZXIgPSBhZGRFZGl0Q2lwaGVySW5mby5jaXBoZXI7XG4gICAgICAgICAgICB0aGlzLmNvbGxlY3Rpb25JZHMgPSBhZGRFZGl0Q2lwaGVySW5mby5jb2xsZWN0aW9uSWRzO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMuc3RhdGVTZXJ2aWNlLnJlbW92ZSgnYWRkRWRpdENpcGhlckluZm8nKTtcblxuICAgICAgICBpZiAodGhpcy5jaXBoZXIgPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuZWRpdE1vZGUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjaXBoZXIgPSBhd2FpdCB0aGlzLmxvYWRDaXBoZXIoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNpcGhlciA9IGF3YWl0IGNpcGhlci5kZWNyeXB0KCk7XG5cbiAgICAgICAgICAgICAgICAvLyBBZGp1c3QgQ2lwaGVyIE5hbWUgaWYgQ2xvbmluZ1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNsb25lTW9kZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNpcGhlci5uYW1lICs9ICcgLSAnICsgdGhpcy5pMThuU2VydmljZS50KCdjbG9uZScpO1xuICAgICAgICAgICAgICAgICAgICAvLyBJZiBub3QgYWxsb3dpbmcgcGVyc29uYWwgb3duZXJzaGlwLCB1cGRhdGUgY2lwaGVyJ3Mgb3JnIElkIHRvIHByb21wdCBkb3duc3RyZWFtIGNoYW5nZXNcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY2lwaGVyLm9yZ2FuaXphdGlvbklkID09IG51bGwgJiYgIXRoaXMuYWxsb3dQZXJzb25hbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jaXBoZXIub3JnYW5pemF0aW9uSWQgPSB0aGlzLm9yZ2FuaXphdGlvbklkO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNpcGhlciA9IG5ldyBDaXBoZXJWaWV3KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5jaXBoZXIub3JnYW5pemF0aW9uSWQgPSB0aGlzLm9yZ2FuaXphdGlvbklkID09IG51bGwgPyBudWxsIDogdGhpcy5vcmdhbml6YXRpb25JZDtcbiAgICAgICAgICAgICAgICB0aGlzLmNpcGhlci5mb2xkZXJJZCA9IHRoaXMuZm9sZGVySWQ7XG4gICAgICAgICAgICAgICAgdGhpcy5jaXBoZXIudHlwZSA9IHRoaXMudHlwZSA9PSBudWxsID8gQ2lwaGVyVHlwZS5Mb2dpbiA6IHRoaXMudHlwZTtcbiAgICAgICAgICAgICAgICB0aGlzLmNpcGhlci5sb2dpbiA9IG5ldyBMb2dpblZpZXcoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNpcGhlci5sb2dpbi51cmlzID0gW25ldyBMb2dpblVyaVZpZXcoKV07XG4gICAgICAgICAgICAgICAgdGhpcy5jaXBoZXIuY2FyZCA9IG5ldyBDYXJkVmlldygpO1xuICAgICAgICAgICAgICAgIHRoaXMuY2lwaGVyLmlkZW50aXR5ID0gbmV3IElkZW50aXR5VmlldygpO1xuICAgICAgICAgICAgICAgIHRoaXMuY2lwaGVyLnNlY3VyZU5vdGUgPSBuZXcgU2VjdXJlTm90ZVZpZXcoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNpcGhlci5zZWN1cmVOb3RlLnR5cGUgPSBTZWN1cmVOb3RlVHlwZS5HZW5lcmljO1xuICAgICAgICAgICAgICAgIHRoaXMuY2lwaGVyLnJlcHJvbXB0ID0gQ2lwaGVyUmVwcm9tcHRUeXBlLk5vbmU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jaXBoZXIgIT0gbnVsbCAmJiAoIXRoaXMuZWRpdE1vZGUgfHwgYWRkRWRpdENpcGhlckluZm8gIT0gbnVsbCB8fCB0aGlzLmNsb25lTW9kZSkpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMub3JnYW5pemF0aW9uQ2hhbmdlZCgpO1xuICAgICAgICAgICAgaWYgKHRoaXMuY29sbGVjdGlvbklkcyAhPSBudWxsICYmIHRoaXMuY29sbGVjdGlvbklkcy5sZW5ndGggPiAwICYmIHRoaXMuY29sbGVjdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29sbGVjdGlvbnMuZm9yRWFjaChjID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY29sbGVjdGlvbklkcy5pbmRleE9mKGMuaWQpID4gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIChjIGFzIGFueSkuY2hlY2tlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZm9sZGVycyA9IGF3YWl0IHRoaXMuZm9sZGVyU2VydmljZS5nZXRBbGxEZWNyeXB0ZWQoKTtcblxuICAgICAgICBpZiAodGhpcy5lZGl0TW9kZSAmJiB0aGlzLnByZXZpb3VzQ2lwaGVySWQgIT09IHRoaXMuY2lwaGVySWQpIHtcbiAgICAgICAgICAgIHRoaXMuZXZlbnRTZXJ2aWNlLmNvbGxlY3QoRXZlbnRUeXBlLkNpcGhlcl9DbGllbnRWaWV3ZWQsIHRoaXMuY2lwaGVySWQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucHJldmlvdXNDaXBoZXJJZCA9IHRoaXMuY2lwaGVySWQ7XG4gICAgICAgIHRoaXMucmVwcm9tcHQgPSB0aGlzLmNpcGhlci5yZXByb21wdCAhPT0gQ2lwaGVyUmVwcm9tcHRUeXBlLk5vbmU7XG4gICAgfVxuXG4gICAgYXN5bmMgc3VibWl0KCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICBpZiAodGhpcy5jaXBoZXIuaXNEZWxldGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yZXN0b3JlKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jaXBoZXIubmFtZSA9PSBudWxsIHx8IHRoaXMuY2lwaGVyLm5hbWUgPT09ICcnKSB7XG4gICAgICAgICAgICB0aGlzLnBsYXRmb3JtVXRpbHNTZXJ2aWNlLnNob3dUb2FzdCgnZXJyb3InLCB0aGlzLmkxOG5TZXJ2aWNlLnQoJ2Vycm9yT2NjdXJyZWQnKSxcbiAgICAgICAgICAgICAgICB0aGlzLmkxOG5TZXJ2aWNlLnQoJ25hbWVSZXF1aXJlZCcpKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgoIXRoaXMuZWRpdE1vZGUgfHwgdGhpcy5jbG9uZU1vZGUpICYmICF0aGlzLmFsbG93UGVyc29uYWwgJiYgdGhpcy5jaXBoZXIub3JnYW5pemF0aW9uSWQgPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5wbGF0Zm9ybVV0aWxzU2VydmljZS5zaG93VG9hc3QoJ2Vycm9yJywgdGhpcy5pMThuU2VydmljZS50KCdlcnJvck9jY3VycmVkJyksXG4gICAgICAgICAgICAgICAgdGhpcy5pMThuU2VydmljZS50KCdwZXJzb25hbE93bmVyc2hpcFN1Ym1pdEVycm9yJykpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCghdGhpcy5lZGl0TW9kZSB8fCB0aGlzLmNsb25lTW9kZSkgJiYgdGhpcy5jaXBoZXIudHlwZSA9PT0gQ2lwaGVyVHlwZS5Mb2dpbiAmJlxuICAgICAgICAgICAgdGhpcy5jaXBoZXIubG9naW4udXJpcyAhPSBudWxsICYmIHRoaXMuY2lwaGVyLmxvZ2luLnVyaXMubGVuZ3RoID09PSAxICYmXG4gICAgICAgICAgICAodGhpcy5jaXBoZXIubG9naW4udXJpc1swXS51cmkgPT0gbnVsbCB8fCB0aGlzLmNpcGhlci5sb2dpbi51cmlzWzBdLnVyaSA9PT0gJycpKSB7XG4gICAgICAgICAgICB0aGlzLmNpcGhlci5sb2dpbi51cmlzID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFsbG93cyBzYXZpbmcgb2Ygc2VsZWN0ZWQgY29sbGVjdGlvbnMgZHVyaW5nIFwiQWRkXCIgYW5kIFwiQ2xvbmVcIiBmbG93c1xuICAgICAgICBpZiAoKCF0aGlzLmVkaXRNb2RlIHx8IHRoaXMuY2xvbmVNb2RlKSAmJiB0aGlzLmNpcGhlci5vcmdhbml6YXRpb25JZCAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmNpcGhlci5jb2xsZWN0aW9uSWRzID0gdGhpcy5jb2xsZWN0aW9ucyA9PSBudWxsID8gW10gOlxuICAgICAgICAgICAgICAgIHRoaXMuY29sbGVjdGlvbnMuZmlsdGVyKGMgPT4gKGMgYXMgYW55KS5jaGVja2VkKS5tYXAoYyA9PiBjLmlkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENsZWFyIGN1cnJlbnQgQ2lwaGVyIElkIHRvIHRyaWdnZXIgXCJBZGRcIiBjaXBoZXIgZmxvd1xuICAgICAgICBpZiAodGhpcy5jbG9uZU1vZGUpIHtcbiAgICAgICAgICAgIHRoaXMuY2lwaGVyLmlkID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNpcGhlciA9IGF3YWl0IHRoaXMuZW5jcnlwdENpcGhlcigpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5mb3JtUHJvbWlzZSA9IHRoaXMuc2F2ZUNpcGhlcihjaXBoZXIpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5mb3JtUHJvbWlzZTtcbiAgICAgICAgICAgIHRoaXMuY2lwaGVyLmlkID0gY2lwaGVyLmlkO1xuICAgICAgICAgICAgdGhpcy5wbGF0Zm9ybVV0aWxzU2VydmljZS5zaG93VG9hc3QoJ3N1Y2Nlc3MnLCBudWxsLFxuICAgICAgICAgICAgICAgIHRoaXMuaTE4blNlcnZpY2UudCh0aGlzLmVkaXRNb2RlICYmICF0aGlzLmNsb25lTW9kZSA/ICdlZGl0ZWRJdGVtJyA6ICdhZGRlZEl0ZW0nKSk7XG4gICAgICAgICAgICB0aGlzLm9uU2F2ZWRDaXBoZXIuZW1pdCh0aGlzLmNpcGhlcik7XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2luZ1NlcnZpY2Uuc2VuZCh0aGlzLmVkaXRNb2RlICYmICF0aGlzLmNsb25lTW9kZSA/ICdlZGl0ZWRDaXBoZXInIDogJ2FkZGVkQ2lwaGVyJyk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5sb2dTZXJ2aWNlLmVycm9yKGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGFkZFVyaSgpIHtcbiAgICAgICAgaWYgKHRoaXMuY2lwaGVyLnR5cGUgIT09IENpcGhlclR5cGUuTG9naW4pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmNpcGhlci5sb2dpbi51cmlzID09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuY2lwaGVyLmxvZ2luLnVyaXMgPSBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2lwaGVyLmxvZ2luLnVyaXMucHVzaChuZXcgTG9naW5VcmlWaWV3KCkpO1xuICAgIH1cblxuICAgIHJlbW92ZVVyaSh1cmk6IExvZ2luVXJpVmlldykge1xuICAgICAgICBpZiAodGhpcy5jaXBoZXIudHlwZSAhPT0gQ2lwaGVyVHlwZS5Mb2dpbiB8fCB0aGlzLmNpcGhlci5sb2dpbi51cmlzID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGkgPSB0aGlzLmNpcGhlci5sb2dpbi51cmlzLmluZGV4T2YodXJpKTtcbiAgICAgICAgaWYgKGkgPiAtMSkge1xuICAgICAgICAgICAgdGhpcy5jaXBoZXIubG9naW4udXJpcy5zcGxpY2UoaSwgMSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0cmFja0J5RnVuY3Rpb24oaW5kZXg6IG51bWJlciwgaXRlbTogYW55KSB7XG4gICAgICAgIHJldHVybiBpbmRleDtcbiAgICB9XG5cbiAgICBjYW5jZWwoKSB7XG4gICAgICAgIHRoaXMub25DYW5jZWxsZWQuZW1pdCh0aGlzLmNpcGhlcik7XG4gICAgfVxuXG4gICAgYXR0YWNobWVudHMoKSB7XG4gICAgICAgIHRoaXMub25FZGl0QXR0YWNobWVudHMuZW1pdCh0aGlzLmNpcGhlcik7XG4gICAgfVxuXG4gICAgc2hhcmUoKSB7XG4gICAgICAgIHRoaXMub25TaGFyZUNpcGhlci5lbWl0KHRoaXMuY2lwaGVyKTtcbiAgICB9XG5cbiAgICBlZGl0Q29sbGVjdGlvbnMoKSB7XG4gICAgICAgIHRoaXMub25FZGl0Q29sbGVjdGlvbnMuZW1pdCh0aGlzLmNpcGhlcik7XG4gICAgfVxuXG4gICAgYXN5bmMgZGVsZXRlKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICBjb25zdCBjb25maXJtZWQgPSBhd2FpdCB0aGlzLnBsYXRmb3JtVXRpbHNTZXJ2aWNlLnNob3dEaWFsb2coXG4gICAgICAgICAgICB0aGlzLmkxOG5TZXJ2aWNlLnQodGhpcy5jaXBoZXIuaXNEZWxldGVkID8gJ3Blcm1hbmVudGx5RGVsZXRlSXRlbUNvbmZpcm1hdGlvbicgOiAnZGVsZXRlSXRlbUNvbmZpcm1hdGlvbicpLFxuICAgICAgICAgICAgdGhpcy5pMThuU2VydmljZS50KCdkZWxldGVJdGVtJyksIHRoaXMuaTE4blNlcnZpY2UudCgneWVzJyksIHRoaXMuaTE4blNlcnZpY2UudCgnbm8nKSwgJ3dhcm5pbmcnKTtcbiAgICAgICAgaWYgKCFjb25maXJtZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLmRlbGV0ZVByb21pc2UgPSB0aGlzLmRlbGV0ZUNpcGhlcigpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5kZWxldGVQcm9taXNlO1xuICAgICAgICAgICAgdGhpcy5wbGF0Zm9ybVV0aWxzU2VydmljZS5zaG93VG9hc3QoJ3N1Y2Nlc3MnLCBudWxsLFxuICAgICAgICAgICAgICAgIHRoaXMuaTE4blNlcnZpY2UudCh0aGlzLmNpcGhlci5pc0RlbGV0ZWQgPyAncGVybWFuZW50bHlEZWxldGVkSXRlbScgOiAnZGVsZXRlZEl0ZW0nKSk7XG4gICAgICAgICAgICB0aGlzLm9uRGVsZXRlZENpcGhlci5lbWl0KHRoaXMuY2lwaGVyKTtcbiAgICAgICAgICAgIHRoaXMubWVzc2FnaW5nU2VydmljZS5zZW5kKHRoaXMuY2lwaGVyLmlzRGVsZXRlZCA/ICdwZXJtYW5lbnRseURlbGV0ZWRDaXBoZXInIDogJ2RlbGV0ZWRDaXBoZXInKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5sb2dTZXJ2aWNlLmVycm9yKGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgYXN5bmMgcmVzdG9yZSgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgaWYgKCF0aGlzLmNpcGhlci5pc0RlbGV0ZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvbmZpcm1lZCA9IGF3YWl0IHRoaXMucGxhdGZvcm1VdGlsc1NlcnZpY2Uuc2hvd0RpYWxvZyhcbiAgICAgICAgICAgIHRoaXMuaTE4blNlcnZpY2UudCgncmVzdG9yZUl0ZW1Db25maXJtYXRpb24nKSwgdGhpcy5pMThuU2VydmljZS50KCdyZXN0b3JlSXRlbScpLFxuICAgICAgICAgICAgdGhpcy5pMThuU2VydmljZS50KCd5ZXMnKSwgdGhpcy5pMThuU2VydmljZS50KCdubycpLCAnd2FybmluZycpO1xuICAgICAgICBpZiAoIWNvbmZpcm1lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMucmVzdG9yZVByb21pc2UgPSB0aGlzLnJlc3RvcmVDaXBoZXIoKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucmVzdG9yZVByb21pc2U7XG4gICAgICAgICAgICB0aGlzLnBsYXRmb3JtVXRpbHNTZXJ2aWNlLnNob3dUb2FzdCgnc3VjY2VzcycsIG51bGwsIHRoaXMuaTE4blNlcnZpY2UudCgncmVzdG9yZWRJdGVtJykpO1xuICAgICAgICAgICAgdGhpcy5vblJlc3RvcmVkQ2lwaGVyLmVtaXQodGhpcy5jaXBoZXIpO1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdpbmdTZXJ2aWNlLnNlbmQoJ3Jlc3RvcmVkQ2lwaGVyJyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRoaXMubG9nU2VydmljZS5lcnJvcihlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGFzeW5jIGdlbmVyYXRlUGFzc3dvcmQoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGlmICh0aGlzLmNpcGhlci5sb2dpbiAhPSBudWxsICYmIHRoaXMuY2lwaGVyLmxvZ2luLnBhc3N3b3JkICE9IG51bGwgJiYgdGhpcy5jaXBoZXIubG9naW4ucGFzc3dvcmQubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBjb25maXJtZWQgPSBhd2FpdCB0aGlzLnBsYXRmb3JtVXRpbHNTZXJ2aWNlLnNob3dEaWFsb2coXG4gICAgICAgICAgICAgICAgdGhpcy5pMThuU2VydmljZS50KCdvdmVyd3JpdGVQYXNzd29yZENvbmZpcm1hdGlvbicpLCB0aGlzLmkxOG5TZXJ2aWNlLnQoJ292ZXJ3cml0ZVBhc3N3b3JkJyksXG4gICAgICAgICAgICAgICAgdGhpcy5pMThuU2VydmljZS50KCd5ZXMnKSwgdGhpcy5pMThuU2VydmljZS50KCdubycpKTtcbiAgICAgICAgICAgIGlmICghY29uZmlybWVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5vbkdlbmVyYXRlUGFzc3dvcmQuZW1pdCgpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICB0b2dnbGVQYXNzd29yZCgpIHtcbiAgICAgICAgdGhpcy5zaG93UGFzc3dvcmQgPSAhdGhpcy5zaG93UGFzc3dvcmQ7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dpblBhc3N3b3JkJykuZm9jdXMoKTtcbiAgICAgICAgaWYgKHRoaXMuZWRpdE1vZGUgJiYgdGhpcy5zaG93UGFzc3dvcmQpIHtcbiAgICAgICAgICAgIHRoaXMuZXZlbnRTZXJ2aWNlLmNvbGxlY3QoRXZlbnRUeXBlLkNpcGhlcl9DbGllbnRUb2dnbGVkUGFzc3dvcmRWaXNpYmxlLCB0aGlzLmNpcGhlcklkKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIHRvZ2dsZUNhcmROdW1iZXIoKSB7XG4gICAgICAgIHRoaXMuc2hvd0NhcmROdW1iZXIgPSAhdGhpcy5zaG93Q2FyZE51bWJlcjtcbiAgICAgICAgaWYgKHRoaXMuc2hvd0NhcmROdW1iZXIpIHtcbiAgICAgICAgICAgIHRoaXMuZXZlbnRTZXJ2aWNlLmNvbGxlY3QoRXZlbnRUeXBlLkNpcGhlcl9DbGllbnRUb2dnbGVkQ2FyZE51bWJlclZpc2libGUsIHRoaXMuY2lwaGVySWQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdG9nZ2xlQ2FyZENvZGUoKSB7XG4gICAgICAgIHRoaXMuc2hvd0NhcmRDb2RlID0gIXRoaXMuc2hvd0NhcmRDb2RlO1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2FyZENvZGUnKS5mb2N1cygpO1xuICAgICAgICBpZiAodGhpcy5lZGl0TW9kZSAmJiB0aGlzLnNob3dDYXJkQ29kZSkge1xuICAgICAgICAgICAgdGhpcy5ldmVudFNlcnZpY2UuY29sbGVjdChFdmVudFR5cGUuQ2lwaGVyX0NsaWVudFRvZ2dsZWRDYXJkQ29kZVZpc2libGUsIHRoaXMuY2lwaGVySWQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdG9nZ2xlVXJpT3B0aW9ucyh1cmk6IExvZ2luVXJpVmlldykge1xuICAgICAgICBjb25zdCB1ID0gKHVyaSBhcyBhbnkpO1xuICAgICAgICB1LnNob3dPcHRpb25zID0gdS5zaG93T3B0aW9ucyA9PSBudWxsICYmIHVyaS5tYXRjaCAhPSBudWxsID8gZmFsc2UgOiAhdS5zaG93T3B0aW9ucztcbiAgICB9XG5cbiAgICBsb2dpblVyaU1hdGNoQ2hhbmdlZCh1cmk6IExvZ2luVXJpVmlldykge1xuICAgICAgICBjb25zdCB1ID0gKHVyaSBhcyBhbnkpO1xuICAgICAgICB1LnNob3dPcHRpb25zID0gdS5zaG93T3B0aW9ucyA9PSBudWxsID8gdHJ1ZSA6IHUuc2hvd09wdGlvbnM7XG4gICAgfVxuXG4gICAgYXN5bmMgb3JnYW5pemF0aW9uQ2hhbmdlZCgpIHtcbiAgICAgICAgaWYgKHRoaXMud3JpdGVhYmxlQ29sbGVjdGlvbnMgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy53cml0ZWFibGVDb2xsZWN0aW9ucy5mb3JFYWNoKGMgPT4gKGMgYXMgYW55KS5jaGVja2VkID0gZmFsc2UpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmNpcGhlci5vcmdhbml6YXRpb25JZCAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmNvbGxlY3Rpb25zID0gdGhpcy53cml0ZWFibGVDb2xsZWN0aW9ucy5maWx0ZXIoYyA9PiBjLm9yZ2FuaXphdGlvbklkID09PSB0aGlzLmNpcGhlci5vcmdhbml6YXRpb25JZCk7XG4gICAgICAgICAgICBjb25zdCBvcmcgPSBhd2FpdCB0aGlzLnVzZXJTZXJ2aWNlLmdldE9yZ2FuaXphdGlvbih0aGlzLmNpcGhlci5vcmdhbml6YXRpb25JZCk7XG4gICAgICAgICAgICBpZiAob3JnICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNpcGhlci5vcmdhbml6YXRpb25Vc2VUb3RwID0gb3JnLnVzZVRvdHA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmNvbGxlY3Rpb25zID0gW107XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBjaGVja1Bhc3N3b3JkKCkge1xuICAgICAgICBpZiAodGhpcy5jaGVja1Bhc3N3b3JkUHJvbWlzZSAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jaXBoZXIubG9naW4gPT0gbnVsbCB8fCB0aGlzLmNpcGhlci5sb2dpbi5wYXNzd29yZCA9PSBudWxsIHx8IHRoaXMuY2lwaGVyLmxvZ2luLnBhc3N3b3JkID09PSAnJykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jaGVja1Bhc3N3b3JkUHJvbWlzZSA9IHRoaXMuYXVkaXRTZXJ2aWNlLnBhc3N3b3JkTGVha2VkKHRoaXMuY2lwaGVyLmxvZ2luLnBhc3N3b3JkKTtcbiAgICAgICAgY29uc3QgbWF0Y2hlcyA9IGF3YWl0IHRoaXMuY2hlY2tQYXNzd29yZFByb21pc2U7XG4gICAgICAgIHRoaXMuY2hlY2tQYXNzd29yZFByb21pc2UgPSBudWxsO1xuXG4gICAgICAgIGlmIChtYXRjaGVzID4gMCkge1xuICAgICAgICAgICAgdGhpcy5wbGF0Zm9ybVV0aWxzU2VydmljZS5zaG93VG9hc3QoJ3dhcm5pbmcnLCBudWxsLFxuICAgICAgICAgICAgICAgIHRoaXMuaTE4blNlcnZpY2UudCgncGFzc3dvcmRFeHBvc2VkJywgbWF0Y2hlcy50b1N0cmluZygpKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnBsYXRmb3JtVXRpbHNTZXJ2aWNlLnNob3dUb2FzdCgnc3VjY2VzcycsIG51bGwsIHRoaXMuaTE4blNlcnZpY2UudCgncGFzc3dvcmRTYWZlJykpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVwcm9tcHRDaGFuZ2VkKCkge1xuICAgICAgICB0aGlzLnJlcHJvbXB0ID0gIXRoaXMucmVwcm9tcHQ7XG4gICAgICAgIGlmICh0aGlzLnJlcHJvbXB0KSB7XG4gICAgICAgICAgICB0aGlzLmNpcGhlci5yZXByb21wdCA9IENpcGhlclJlcHJvbXB0VHlwZS5QYXNzd29yZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY2lwaGVyLnJlcHJvbXB0ID0gQ2lwaGVyUmVwcm9tcHRUeXBlLk5vbmU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgYXN5bmMgbG9hZENvbGxlY3Rpb25zKCkge1xuICAgICAgICBjb25zdCBhbGxDb2xsZWN0aW9ucyA9IGF3YWl0IHRoaXMuY29sbGVjdGlvblNlcnZpY2UuZ2V0QWxsRGVjcnlwdGVkKCk7XG4gICAgICAgIHJldHVybiBhbGxDb2xsZWN0aW9ucy5maWx0ZXIoYyA9PiAhYy5yZWFkT25seSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGxvYWRDaXBoZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNpcGhlclNlcnZpY2UuZ2V0KHRoaXMuY2lwaGVySWQpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBlbmNyeXB0Q2lwaGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jaXBoZXJTZXJ2aWNlLmVuY3J5cHQodGhpcy5jaXBoZXIpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBzYXZlQ2lwaGVyKGNpcGhlcjogQ2lwaGVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNpcGhlclNlcnZpY2Uuc2F2ZVdpdGhTZXJ2ZXIoY2lwaGVyKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZGVsZXRlQ2lwaGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jaXBoZXIuaXNEZWxldGVkID8gdGhpcy5jaXBoZXJTZXJ2aWNlLmRlbGV0ZVdpdGhTZXJ2ZXIodGhpcy5jaXBoZXIuaWQpXG4gICAgICAgICAgICA6IHRoaXMuY2lwaGVyU2VydmljZS5zb2Z0RGVsZXRlV2l0aFNlcnZlcih0aGlzLmNpcGhlci5pZCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHJlc3RvcmVDaXBoZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNpcGhlclNlcnZpY2UucmVzdG9yZVdpdGhTZXJ2ZXIodGhpcy5jaXBoZXIuaWQpO1xuICAgIH1cbn1cbiIsImltcG9ydCB7XG4gICAgRGlyZWN0aXZlLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBJbnB1dCxcbiAgICBPbkluaXQsXG4gICAgT3V0cHV0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgQXBpU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvYXBpLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ2lwaGVyU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvY2lwaGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ3J5cHRvU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvY3J5cHRvLnNlcnZpY2UnO1xuaW1wb3J0IHsgSTE4blNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL2kxOG4uc2VydmljZSc7XG5pbXBvcnQgeyBMb2dTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9sb2cuc2VydmljZSc7XG5pbXBvcnQgeyBQbGF0Zm9ybVV0aWxzU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvcGxhdGZvcm1VdGlscy5zZXJ2aWNlJztcbmltcG9ydCB7IFVzZXJTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy91c2VyLnNlcnZpY2UnO1xuXG5pbXBvcnQgeyBDaXBoZXIgfSBmcm9tICdqc2xpYi1jb21tb24vbW9kZWxzL2RvbWFpbi9jaXBoZXInO1xuaW1wb3J0IHsgRXJyb3JSZXNwb25zZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9tb2RlbHMvcmVzcG9uc2UvZXJyb3JSZXNwb25zZSc7XG5cbmltcG9ydCB7IEF0dGFjaG1lbnRWaWV3IH0gZnJvbSAnanNsaWItY29tbW9uL21vZGVscy92aWV3L2F0dGFjaG1lbnRWaWV3JztcbmltcG9ydCB7IENpcGhlclZpZXcgfSBmcm9tICdqc2xpYi1jb21tb24vbW9kZWxzL3ZpZXcvY2lwaGVyVmlldyc7XG5cbkBEaXJlY3RpdmUoKVxuZXhwb3J0IGNsYXNzIEF0dGFjaG1lbnRzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgICBASW5wdXQoKSBjaXBoZXJJZDogc3RyaW5nO1xuICAgIEBPdXRwdXQoKSBvblVwbG9hZGVkQXR0YWNobWVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICBAT3V0cHV0KCkgb25EZWxldGVkQXR0YWNobWVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICBAT3V0cHV0KCkgb25SZXVwbG9hZGVkQXR0YWNobWVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAgIGNpcGhlcjogQ2lwaGVyVmlldztcbiAgICBjaXBoZXJEb21haW46IENpcGhlcjtcbiAgICBoYXNVcGRhdGVkS2V5OiBib29sZWFuO1xuICAgIGNhbkFjY2Vzc0F0dGFjaG1lbnRzOiBib29sZWFuO1xuICAgIGZvcm1Qcm9taXNlOiBQcm9taXNlPGFueT47XG4gICAgZGVsZXRlUHJvbWlzZXM6IHsgW2lkOiBzdHJpbmddOiBQcm9taXNlPGFueT47IH0gPSB7fTtcbiAgICByZXVwbG9hZFByb21pc2VzOiB7IFtpZDogc3RyaW5nXTogUHJvbWlzZTxhbnk+OyB9ID0ge307XG4gICAgZW1lcmdlbmN5QWNjZXNzSWQ/OiBzdHJpbmcgPSBudWxsO1xuXG4gICAgY29uc3RydWN0b3IocHJvdGVjdGVkIGNpcGhlclNlcnZpY2U6IENpcGhlclNlcnZpY2UsIHByb3RlY3RlZCBpMThuU2VydmljZTogSTE4blNlcnZpY2UsXG4gICAgICAgIHByb3RlY3RlZCBjcnlwdG9TZXJ2aWNlOiBDcnlwdG9TZXJ2aWNlLCBwcm90ZWN0ZWQgdXNlclNlcnZpY2U6IFVzZXJTZXJ2aWNlLFxuICAgICAgICBwcm90ZWN0ZWQgcGxhdGZvcm1VdGlsc1NlcnZpY2U6IFBsYXRmb3JtVXRpbHNTZXJ2aWNlLCBwcm90ZWN0ZWQgYXBpU2VydmljZTogQXBpU2VydmljZSxcbiAgICAgICAgcHJvdGVjdGVkIHdpbjogV2luZG93LCBwcml2YXRlIGxvZ1NlcnZpY2U6IExvZ1NlcnZpY2UpIHsgfVxuXG4gICAgYXN5bmMgbmdPbkluaXQoKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuaW5pdCgpO1xuICAgIH1cblxuICAgIGFzeW5jIHN1Ym1pdCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmhhc1VwZGF0ZWRLZXkpIHtcbiAgICAgICAgICAgIHRoaXMucGxhdGZvcm1VdGlsc1NlcnZpY2Uuc2hvd1RvYXN0KCdlcnJvcicsIHRoaXMuaTE4blNlcnZpY2UudCgnZXJyb3JPY2N1cnJlZCcpLFxuICAgICAgICAgICAgICAgIHRoaXMuaTE4blNlcnZpY2UudCgndXBkYXRlS2V5JykpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmlsZUVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZpbGUnKSBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgICAgICBjb25zdCBmaWxlcyA9IGZpbGVFbC5maWxlcztcbiAgICAgICAgaWYgKGZpbGVzID09IG51bGwgfHwgZmlsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLnBsYXRmb3JtVXRpbHNTZXJ2aWNlLnNob3dUb2FzdCgnZXJyb3InLCB0aGlzLmkxOG5TZXJ2aWNlLnQoJ2Vycm9yT2NjdXJyZWQnKSxcbiAgICAgICAgICAgICAgICB0aGlzLmkxOG5TZXJ2aWNlLnQoJ3NlbGVjdEZpbGUnKSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZmlsZXNbMF0uc2l6ZSA+IDUyNDI4ODAwMCkgeyAvLyA1MDAgTUJcbiAgICAgICAgICAgIHRoaXMucGxhdGZvcm1VdGlsc1NlcnZpY2Uuc2hvd1RvYXN0KCdlcnJvcicsIHRoaXMuaTE4blNlcnZpY2UudCgnZXJyb3JPY2N1cnJlZCcpLFxuICAgICAgICAgICAgICAgIHRoaXMuaTE4blNlcnZpY2UudCgnbWF4RmlsZVNpemUnKSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5mb3JtUHJvbWlzZSA9IHRoaXMuc2F2ZUNpcGhlckF0dGFjaG1lbnQoZmlsZXNbMF0pO1xuICAgICAgICAgICAgdGhpcy5jaXBoZXJEb21haW4gPSBhd2FpdCB0aGlzLmZvcm1Qcm9taXNlO1xuICAgICAgICAgICAgdGhpcy5jaXBoZXIgPSBhd2FpdCB0aGlzLmNpcGhlckRvbWFpbi5kZWNyeXB0KCk7XG4gICAgICAgICAgICB0aGlzLnBsYXRmb3JtVXRpbHNTZXJ2aWNlLnNob3dUb2FzdCgnc3VjY2VzcycsIG51bGwsIHRoaXMuaTE4blNlcnZpY2UudCgnYXR0YWNobWVudFNhdmVkJykpO1xuICAgICAgICAgICAgdGhpcy5vblVwbG9hZGVkQXR0YWNobWVudC5lbWl0KCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRoaXMubG9nU2VydmljZS5lcnJvcihlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHJlc2V0IGZpbGUgaW5wdXRcbiAgICAgICAgLy8gcmVmOiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMjA1NTIwNDJcbiAgICAgICAgZmlsZUVsLnR5cGUgPSAnJztcbiAgICAgICAgZmlsZUVsLnR5cGUgPSAnZmlsZSc7XG4gICAgICAgIGZpbGVFbC52YWx1ZSA9ICcnO1xuICAgIH1cblxuICAgIGFzeW5jIGRlbGV0ZShhdHRhY2htZW50OiBBdHRhY2htZW50Vmlldykge1xuICAgICAgICBpZiAodGhpcy5kZWxldGVQcm9taXNlc1thdHRhY2htZW50LmlkXSAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb25maXJtZWQgPSBhd2FpdCB0aGlzLnBsYXRmb3JtVXRpbHNTZXJ2aWNlLnNob3dEaWFsb2coXG4gICAgICAgICAgICB0aGlzLmkxOG5TZXJ2aWNlLnQoJ2RlbGV0ZUF0dGFjaG1lbnRDb25maXJtYXRpb24nKSwgdGhpcy5pMThuU2VydmljZS50KCdkZWxldGVBdHRhY2htZW50JyksXG4gICAgICAgICAgICB0aGlzLmkxOG5TZXJ2aWNlLnQoJ3llcycpLCB0aGlzLmkxOG5TZXJ2aWNlLnQoJ25vJyksICd3YXJuaW5nJyk7XG4gICAgICAgIGlmICghY29uZmlybWVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5kZWxldGVQcm9taXNlc1thdHRhY2htZW50LmlkXSA9IHRoaXMuZGVsZXRlQ2lwaGVyQXR0YWNobWVudChhdHRhY2htZW50LmlkKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZGVsZXRlUHJvbWlzZXNbYXR0YWNobWVudC5pZF07XG4gICAgICAgICAgICB0aGlzLnBsYXRmb3JtVXRpbHNTZXJ2aWNlLnNob3dUb2FzdCgnc3VjY2VzcycsIG51bGwsIHRoaXMuaTE4blNlcnZpY2UudCgnZGVsZXRlZEF0dGFjaG1lbnQnKSk7XG4gICAgICAgICAgICBjb25zdCBpID0gdGhpcy5jaXBoZXIuYXR0YWNobWVudHMuaW5kZXhPZihhdHRhY2htZW50KTtcbiAgICAgICAgICAgIGlmIChpID4gLTEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNpcGhlci5hdHRhY2htZW50cy5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRoaXMubG9nU2VydmljZS5lcnJvcihlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZGVsZXRlUHJvbWlzZXNbYXR0YWNobWVudC5pZF0gPSBudWxsO1xuICAgICAgICB0aGlzLm9uRGVsZXRlZEF0dGFjaG1lbnQuZW1pdCgpO1xuICAgIH1cblxuICAgIGFzeW5jIGRvd25sb2FkKGF0dGFjaG1lbnQ6IEF0dGFjaG1lbnRWaWV3KSB7XG4gICAgICAgIGNvbnN0IGEgPSAoYXR0YWNobWVudCBhcyBhbnkpO1xuICAgICAgICBpZiAoYS5kb3dubG9hZGluZykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLmNhbkFjY2Vzc0F0dGFjaG1lbnRzKSB7XG4gICAgICAgICAgICB0aGlzLnBsYXRmb3JtVXRpbHNTZXJ2aWNlLnNob3dUb2FzdCgnZXJyb3InLCB0aGlzLmkxOG5TZXJ2aWNlLnQoJ3ByZW1pdW1SZXF1aXJlZCcpLFxuICAgICAgICAgICAgICAgIHRoaXMuaTE4blNlcnZpY2UudCgncHJlbWl1bVJlcXVpcmVkRGVzYycpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB1cmw6IHN0cmluZztcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGF0dGFjaG1lbnREb3dubG9hZFJlc3BvbnNlID0gYXdhaXQgdGhpcy5hcGlTZXJ2aWNlLmdldEF0dGFjaG1lbnREYXRhKHRoaXMuY2lwaGVyLmlkLCBhdHRhY2htZW50LmlkLFxuICAgICAgICAgICAgICAgIHRoaXMuZW1lcmdlbmN5QWNjZXNzSWQpO1xuICAgICAgICAgICAgdXJsID0gYXR0YWNobWVudERvd25sb2FkUmVzcG9uc2UudXJsO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIEVycm9yUmVzcG9uc2UgJiYgKGUgYXMgRXJyb3JSZXNwb25zZSkuc3RhdHVzQ29kZSA9PT0gNDA0KSB7XG4gICAgICAgICAgICAgICAgdXJsID0gYXR0YWNobWVudC51cmw7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBFcnJvclJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKChlIGFzIEVycm9yUmVzcG9uc2UpLmdldFNpbmdsZU1lc3NhZ2UoKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBhLmRvd25sb2FkaW5nID0gdHJ1ZTtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChuZXcgUmVxdWVzdCh1cmwsIHsgY2FjaGU6ICduby1zdG9yZScgfSkpO1xuICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzICE9PSAyMDApIHtcbiAgICAgICAgICAgIHRoaXMucGxhdGZvcm1VdGlsc1NlcnZpY2Uuc2hvd1RvYXN0KCdlcnJvcicsIG51bGwsIHRoaXMuaTE4blNlcnZpY2UudCgnZXJyb3JPY2N1cnJlZCcpKTtcbiAgICAgICAgICAgIGEuZG93bmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBidWYgPSBhd2FpdCByZXNwb25zZS5hcnJheUJ1ZmZlcigpO1xuICAgICAgICAgICAgY29uc3Qga2V5ID0gYXR0YWNobWVudC5rZXkgIT0gbnVsbCA/IGF0dGFjaG1lbnQua2V5IDpcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNyeXB0b1NlcnZpY2UuZ2V0T3JnS2V5KHRoaXMuY2lwaGVyLm9yZ2FuaXphdGlvbklkKTtcbiAgICAgICAgICAgIGNvbnN0IGRlY0J1ZiA9IGF3YWl0IHRoaXMuY3J5cHRvU2VydmljZS5kZWNyeXB0RnJvbUJ5dGVzKGJ1Ziwga2V5KTtcbiAgICAgICAgICAgIHRoaXMucGxhdGZvcm1VdGlsc1NlcnZpY2Uuc2F2ZUZpbGUodGhpcy53aW4sIGRlY0J1ZiwgbnVsbCwgYXR0YWNobWVudC5maWxlTmFtZSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRoaXMucGxhdGZvcm1VdGlsc1NlcnZpY2Uuc2hvd1RvYXN0KCdlcnJvcicsIG51bGwsIHRoaXMuaTE4blNlcnZpY2UudCgnZXJyb3JPY2N1cnJlZCcpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGEuZG93bmxvYWRpbmcgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgYXN5bmMgaW5pdCgpIHtcbiAgICAgICAgdGhpcy5jaXBoZXJEb21haW4gPSBhd2FpdCB0aGlzLmxvYWRDaXBoZXIoKTtcbiAgICAgICAgdGhpcy5jaXBoZXIgPSBhd2FpdCB0aGlzLmNpcGhlckRvbWFpbi5kZWNyeXB0KCk7XG5cbiAgICAgICAgdGhpcy5oYXNVcGRhdGVkS2V5ID0gYXdhaXQgdGhpcy5jcnlwdG9TZXJ2aWNlLmhhc0VuY0tleSgpO1xuICAgICAgICBjb25zdCBjYW5BY2Nlc3NQcmVtaXVtID0gYXdhaXQgdGhpcy51c2VyU2VydmljZS5jYW5BY2Nlc3NQcmVtaXVtKCk7XG4gICAgICAgIHRoaXMuY2FuQWNjZXNzQXR0YWNobWVudHMgPSBjYW5BY2Nlc3NQcmVtaXVtIHx8IHRoaXMuY2lwaGVyLm9yZ2FuaXphdGlvbklkICE9IG51bGw7XG5cbiAgICAgICAgaWYgKCF0aGlzLmNhbkFjY2Vzc0F0dGFjaG1lbnRzKSB7XG4gICAgICAgICAgICBjb25zdCBjb25maXJtZWQgPSBhd2FpdCB0aGlzLnBsYXRmb3JtVXRpbHNTZXJ2aWNlLnNob3dEaWFsb2coXG4gICAgICAgICAgICAgICAgdGhpcy5pMThuU2VydmljZS50KCdwcmVtaXVtUmVxdWlyZWREZXNjJyksIHRoaXMuaTE4blNlcnZpY2UudCgncHJlbWl1bVJlcXVpcmVkJyksXG4gICAgICAgICAgICAgICAgdGhpcy5pMThuU2VydmljZS50KCdsZWFybk1vcmUnKSwgdGhpcy5pMThuU2VydmljZS50KCdjYW5jZWwnKSk7XG4gICAgICAgICAgICBpZiAoY29uZmlybWVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wbGF0Zm9ybVV0aWxzU2VydmljZS5sYXVuY2hVcmkoJ2h0dHBzOi8vdmF1bHQuYml0d2FyZGVuLmNvbS8jLz9wcmVtaXVtPXB1cmNoYXNlJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuaGFzVXBkYXRlZEtleSkge1xuICAgICAgICAgICAgY29uc3QgY29uZmlybWVkID0gYXdhaXQgdGhpcy5wbGF0Zm9ybVV0aWxzU2VydmljZS5zaG93RGlhbG9nKFxuICAgICAgICAgICAgICAgIHRoaXMuaTE4blNlcnZpY2UudCgndXBkYXRlS2V5JyksIHRoaXMuaTE4blNlcnZpY2UudCgnZmVhdHVyZVVuYXZhaWxhYmxlJyksXG4gICAgICAgICAgICAgICAgdGhpcy5pMThuU2VydmljZS50KCdsZWFybk1vcmUnKSwgdGhpcy5pMThuU2VydmljZS50KCdjYW5jZWwnKSwgJ3dhcm5pbmcnKTtcbiAgICAgICAgICAgIGlmIChjb25maXJtZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBsYXRmb3JtVXRpbHNTZXJ2aWNlLmxhdW5jaFVyaSgnaHR0cHM6Ly9oZWxwLmJpdHdhcmRlbi5jb20vYXJ0aWNsZS91cGRhdGUtZW5jcnlwdGlvbi1rZXkvJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgYXN5bmMgcmV1cGxvYWRDaXBoZXJBdHRhY2htZW50KGF0dGFjaG1lbnQ6IEF0dGFjaG1lbnRWaWV3LCBhZG1pbjogYm9vbGVhbikge1xuICAgICAgICBjb25zdCBhID0gKGF0dGFjaG1lbnQgYXMgYW55KTtcbiAgICAgICAgaWYgKGF0dGFjaG1lbnQua2V5ICE9IG51bGwgfHwgYS5kb3dubG9hZGluZyB8fCB0aGlzLnJldXBsb2FkUHJvbWlzZXNbYXR0YWNobWVudC5pZF0gIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMucmV1cGxvYWRQcm9taXNlc1thdHRhY2htZW50LmlkXSA9IFByb21pc2UucmVzb2x2ZSgpLnRoZW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIDEuIERvd25sb2FkXG4gICAgICAgICAgICAgICAgYS5kb3dubG9hZGluZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChuZXcgUmVxdWVzdChhdHRhY2htZW50LnVybCwgeyBjYWNoZTogJ25vLXN0b3JlJyB9KSk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyAhPT0gMjAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGxhdGZvcm1VdGlsc1NlcnZpY2Uuc2hvd1RvYXN0KCdlcnJvcicsIG51bGwsIHRoaXMuaTE4blNlcnZpY2UudCgnZXJyb3JPY2N1cnJlZCcpKTtcbiAgICAgICAgICAgICAgICAgICAgYS5kb3dubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gMi4gUmVzYXZlXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJ1ZiA9IGF3YWl0IHJlc3BvbnNlLmFycmF5QnVmZmVyKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IGF0dGFjaG1lbnQua2V5ICE9IG51bGwgPyBhdHRhY2htZW50LmtleSA6XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNyeXB0b1NlcnZpY2UuZ2V0T3JnS2V5KHRoaXMuY2lwaGVyLm9yZ2FuaXphdGlvbklkKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVjQnVmID0gYXdhaXQgdGhpcy5jcnlwdG9TZXJ2aWNlLmRlY3J5cHRGcm9tQnl0ZXMoYnVmLCBrZXkpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNpcGhlckRvbWFpbiA9IGF3YWl0IHRoaXMuY2lwaGVyU2VydmljZS5zYXZlQXR0YWNobWVudFJhd1dpdGhTZXJ2ZXIoXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNpcGhlckRvbWFpbiwgYXR0YWNobWVudC5maWxlTmFtZSwgZGVjQnVmLCBhZG1pbik7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2lwaGVyID0gYXdhaXQgdGhpcy5jaXBoZXJEb21haW4uZGVjcnlwdCgpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIDMuIERlbGV0ZSBvbGRcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWxldGVQcm9taXNlc1thdHRhY2htZW50LmlkXSA9IHRoaXMuZGVsZXRlQ2lwaGVyQXR0YWNobWVudChhdHRhY2htZW50LmlkKTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5kZWxldGVQcm9taXNlc1thdHRhY2htZW50LmlkXTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZm91bmRBdHRhY2htZW50ID0gdGhpcy5jaXBoZXIuYXR0YWNobWVudHMuZmlsdGVyKGEyID0+IGEyLmlkID09PSBhdHRhY2htZW50LmlkKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZvdW5kQXR0YWNobWVudC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpID0gdGhpcy5jaXBoZXIuYXR0YWNobWVudHMuaW5kZXhPZihmb3VuZEF0dGFjaG1lbnRbMF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2lwaGVyLmF0dGFjaG1lbnRzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGxhdGZvcm1VdGlsc1NlcnZpY2Uuc2hvd1RvYXN0KCdzdWNjZXNzJywgbnVsbCwgdGhpcy5pMThuU2VydmljZS50KCdhdHRhY2htZW50U2F2ZWQnKSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25SZXVwbG9hZGVkQXR0YWNobWVudC5lbWl0KCk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsYXRmb3JtVXRpbHNTZXJ2aWNlLnNob3dUb2FzdCgnZXJyb3InLCBudWxsLCB0aGlzLmkxOG5TZXJ2aWNlLnQoJ2Vycm9yT2NjdXJyZWQnKSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYS5kb3dubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnJldXBsb2FkUHJvbWlzZXNbYXR0YWNobWVudC5pZF07XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRoaXMubG9nU2VydmljZS5lcnJvcihlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBsb2FkQ2lwaGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jaXBoZXJTZXJ2aWNlLmdldCh0aGlzLmNpcGhlcklkKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgc2F2ZUNpcGhlckF0dGFjaG1lbnQoZmlsZTogRmlsZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5jaXBoZXJTZXJ2aWNlLnNhdmVBdHRhY2htZW50V2l0aFNlcnZlcih0aGlzLmNpcGhlckRvbWFpbiwgZmlsZSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGRlbGV0ZUNpcGhlckF0dGFjaG1lbnQoYXR0YWNobWVudElkOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2lwaGVyU2VydmljZS5kZWxldGVBdHRhY2htZW50V2l0aFNlcnZlcih0aGlzLmNpcGhlci5pZCwgYXR0YWNobWVudElkKTtcbiAgICB9XG59XG4iLCJpbXBvcnQge1xuICAgIENvbXBvbmVudCxcbiAgICBJbnB1dCxcbiAgICBPbkluaXQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBJMThuU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvaTE4bi5zZXJ2aWNlJztcblxuaW1wb3J0IHsgTWFzdGVyUGFzc3dvcmRQb2xpY3lPcHRpb25zIH0gZnJvbSAnanNsaWItY29tbW9uL21vZGVscy9kb21haW4vbWFzdGVyUGFzc3dvcmRQb2xpY3lPcHRpb25zJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdhcHAtY2FsbG91dCcsXG4gICAgdGVtcGxhdGVVcmw6ICdjYWxsb3V0LmNvbXBvbmVudC5odG1sJyxcbn0pXG5leHBvcnQgY2xhc3MgQ2FsbG91dENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gICAgQElucHV0KCkgdHlwZSA9ICdpbmZvJztcbiAgICBASW5wdXQoKSBpY29uOiBzdHJpbmc7XG4gICAgQElucHV0KCkgdGl0bGU6IHN0cmluZztcbiAgICBASW5wdXQoKSBjbGlja2FibGU6IGJvb2xlYW47XG4gICAgQElucHV0KCkgZW5mb3JjZWRQb2xpY3lPcHRpb25zOiBNYXN0ZXJQYXNzd29yZFBvbGljeU9wdGlvbnM7XG4gICAgQElucHV0KCkgZW5mb3JjZWRQb2xpY3lNZXNzYWdlOiBzdHJpbmc7XG4gICAgQElucHV0KCkgdXNlQWxlcnRSb2xlID0gZmFsc2U7XG5cbiAgICBjYWxsb3V0U3R5bGU6IHN0cmluZztcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgaTE4blNlcnZpY2U6IEkxOG5TZXJ2aWNlKSB7IH1cblxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLmNhbGxvdXRTdHlsZSA9IHRoaXMudHlwZTtcblxuICAgICAgICBpZiAodGhpcy5lbmZvcmNlZFBvbGljeU1lc3NhZ2UgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5lbmZvcmNlZFBvbGljeU1lc3NhZ2UgPSB0aGlzLmkxOG5TZXJ2aWNlLnQoJ21hc3RlclBhc3N3b3JkUG9saWN5SW5FZmZlY3QnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnR5cGUgPT09ICd3YXJuaW5nJyB8fCB0aGlzLnR5cGUgPT09ICdkYW5nZXInKSB7XG4gICAgICAgICAgICBpZiAodGhpcy50eXBlID09PSAnZGFuZ2VyJykge1xuICAgICAgICAgICAgICAgIHRoaXMuY2FsbG91dFN0eWxlID0gJ2Rhbmdlcic7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy50aXRsZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50aXRsZSA9IHRoaXMuaTE4blNlcnZpY2UudCgnd2FybmluZycpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuaWNvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pY29uID0gJ2ZhLXdhcm5pbmcnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMudHlwZSA9PT0gJ2Vycm9yJykge1xuICAgICAgICAgICAgdGhpcy5jYWxsb3V0U3R5bGUgPSAnZGFuZ2VyJztcbiAgICAgICAgICAgIGlmICh0aGlzLnRpdGxlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRpdGxlID0gdGhpcy5pMThuU2VydmljZS50KCdlcnJvcicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuaWNvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pY29uID0gJ2ZhLWJvbHQnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMudHlwZSA9PT0gJ3RpcCcpIHtcbiAgICAgICAgICAgIHRoaXMuY2FsbG91dFN0eWxlID0gJ3N1Y2Nlc3MnO1xuICAgICAgICAgICAgaWYgKHRoaXMudGl0bGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRoaXMudGl0bGUgPSB0aGlzLmkxOG5TZXJ2aWNlLnQoJ3RpcCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuaWNvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pY29uID0gJ2ZhLWxpZ2h0YnVsYi1vJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldFBhc3N3b3JkU2NvcmVBbGVydERpc3BsYXkoKSB7XG4gICAgICAgIGlmICh0aGlzLmVuZm9yY2VkUG9saWN5T3B0aW9ucyA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgc3RyOiBzdHJpbmc7XG4gICAgICAgIHN3aXRjaCAodGhpcy5lbmZvcmNlZFBvbGljeU9wdGlvbnMubWluQ29tcGxleGl0eSkge1xuICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgIHN0ciA9IHRoaXMuaTE4blNlcnZpY2UudCgnc3Ryb25nJyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgc3RyID0gdGhpcy5pMThuU2VydmljZS50KCdnb29kJyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHN0ciA9IHRoaXMuaTE4blNlcnZpY2UudCgnd2VhaycpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdHIgKyAnICgnICsgdGhpcy5lbmZvcmNlZFBvbGljeU9wdGlvbnMubWluQ29tcGxleGl0eSArICcpJztcbiAgICB9XG59XG4iLCI8ZGl2ICNjYWxsb3V0IGNsYXNzPVwiY2FsbG91dCBjYWxsb3V0LXt7Y2FsbG91dFN0eWxlfX1cIiBbbmdDbGFzc109XCJ7J2NsaWNrYWJsZSc6IGNsaWNrYWJsZX1cIlxuICAgIFthdHRyLnJvbGVdPVwidXNlQWxlcnRSb2xlID8gJ2FsZXJ0JyA6IG51bGxcIj5cbiAgICA8aDMgY2xhc3M9XCJjYWxsb3V0LWhlYWRpbmdcIiAqbmdJZj1cInRpdGxlXCI+XG4gICAgICAgIDxpIGNsYXNzPVwiZmEge3tpY29ufX1cIiAqbmdJZj1cImljb25cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgIHt7dGl0bGV9fVxuICAgIDwvaDM+XG4gICAgPGRpdiBjbGFzcz1cImVuZm9yY2VkLXBvbGljeS1vcHRpb25zXCIgKm5nSWY9XCJlbmZvcmNlZFBvbGljeU9wdGlvbnNcIj5cbiAgICAgICAge3tlbmZvcmNlZFBvbGljeU1lc3NhZ2V9fVxuICAgICAgICA8dWw+XG4gICAgICAgICAgICA8bGkgKm5nSWY9XCJlbmZvcmNlZFBvbGljeU9wdGlvbnM/Lm1pbkNvbXBsZXhpdHkgPiAwXCI+XG4gICAgICAgICAgICAgICAge3sncG9saWN5SW5FZmZlY3RNaW5Db21wbGV4aXR5JyB8IGkxOG4gOiBnZXRQYXNzd29yZFNjb3JlQWxlcnREaXNwbGF5KCl9fVxuICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgIDxsaSAqbmdJZj1cImVuZm9yY2VkUG9saWN5T3B0aW9ucz8ubWluTGVuZ3RoID4gMFwiPlxuICAgICAgICAgICAgICAgIHt7J3BvbGljeUluRWZmZWN0TWluTGVuZ3RoJyB8IGkxOG4gOiBlbmZvcmNlZFBvbGljeU9wdGlvbnM/Lm1pbkxlbmd0aC50b1N0cmluZygpfX1cbiAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICA8bGkgKm5nSWY9XCJlbmZvcmNlZFBvbGljeU9wdGlvbnM/LnJlcXVpcmVVcHBlclwiPlxuICAgICAgICAgICAgICAgIHt7J3BvbGljeUluRWZmZWN0VXBwZXJjYXNlJyB8IGkxOG59fTwvbGk+XG4gICAgICAgICAgICA8bGkgKm5nSWY9XCJlbmZvcmNlZFBvbGljeU9wdGlvbnM/LnJlcXVpcmVMb3dlclwiPlxuICAgICAgICAgICAgICAgIHt7J3BvbGljeUluRWZmZWN0TG93ZXJjYXNlJyB8IGkxOG59fTwvbGk+XG4gICAgICAgICAgICA8bGkgKm5nSWY9XCJlbmZvcmNlZFBvbGljeU9wdGlvbnM/LnJlcXVpcmVOdW1iZXJzXCI+XG4gICAgICAgICAgICAgICAge3sncG9saWN5SW5FZmZlY3ROdW1iZXJzJyB8IGkxOG59fTwvbGk+XG4gICAgICAgICAgICA8bGkgKm5nSWY9XCJlbmZvcmNlZFBvbGljeU9wdGlvbnM/LnJlcXVpcmVTcGVjaWFsXCI+XG4gICAgICAgICAgICAgICAge3sncG9saWN5SW5FZmZlY3RTcGVjaWFsJyB8IGkxOG4gOiAnIUAjJCVeJionfX08L2xpPlxuICAgICAgICA8L3VsPlxuICAgIDwvZGl2PlxuICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbjwvZGl2PlxuIiwiaW1wb3J0IHsgRGlyZWN0aXZlLCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBFbnZpcm9ubWVudFNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL2Vudmlyb25tZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgSTE4blNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL2kxOG4uc2VydmljZSc7XG5pbXBvcnQgeyBQbGF0Zm9ybVV0aWxzU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvcGxhdGZvcm1VdGlscy5zZXJ2aWNlJztcblxuaW1wb3J0IHsgQ2FwdGNoYUlGcmFtZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9taXNjL2NhcHRjaGFfaWZyYW1lJztcblxuaW1wb3J0IHsgVXRpbHMgfSBmcm9tICdqc2xpYi1jb21tb24vbWlzYy91dGlscyc7XG5cbkBEaXJlY3RpdmUoKVxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIENhcHRjaGFQcm90ZWN0ZWRDb21wb25lbnQge1xuICAgIEBJbnB1dCgpIGNhcHRjaGFTaXRlS2V5OiBzdHJpbmcgPSBudWxsO1xuICAgIGNhcHRjaGFUb2tlbjogc3RyaW5nID0gbnVsbDtcbiAgICBjYXB0Y2hhOiBDYXB0Y2hhSUZyYW1lO1xuXG4gICAgY29uc3RydWN0b3IocHJvdGVjdGVkIGVudmlyb25tZW50U2VydmljZTogRW52aXJvbm1lbnRTZXJ2aWNlLCBwcm90ZWN0ZWQgaTE4blNlcnZpY2U6IEkxOG5TZXJ2aWNlLFxuICAgICAgICBwcm90ZWN0ZWQgcGxhdGZvcm1VdGlsc1NlcnZpY2U6IFBsYXRmb3JtVXRpbHNTZXJ2aWNlKSB7IH1cblxuICAgIGFzeW5jIHNldHVwQ2FwdGNoYSgpIHtcbiAgICAgICAgY29uc3Qgd2ViVmF1bHRVcmwgPSB0aGlzLmVudmlyb25tZW50U2VydmljZS5nZXRXZWJWYXVsdFVybCgpO1xuXG4gICAgICAgIHRoaXMuY2FwdGNoYSA9IG5ldyBDYXB0Y2hhSUZyYW1lKHdpbmRvdywgd2ViVmF1bHRVcmwsXG4gICAgICAgICAgICB0aGlzLmkxOG5TZXJ2aWNlLCAodG9rZW46IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY2FwdGNoYVRva2VuID0gdG9rZW47XG4gICAgICAgICAgICB9LCAoZXJyb3I6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucGxhdGZvcm1VdGlsc1NlcnZpY2Uuc2hvd1RvYXN0KCdlcnJvcicsIHRoaXMuaTE4blNlcnZpY2UudCgnZXJyb3JPY2N1cnJlZCcpLCBlcnJvcik7XG4gICAgICAgICAgICB9LCAoaW5mbzogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5wbGF0Zm9ybVV0aWxzU2VydmljZS5zaG93VG9hc3QoJ2luZm8nLCB0aGlzLmkxOG5TZXJ2aWNlLnQoJ2luZm8nKSwgaW5mbyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgc2hvd0NhcHRjaGEoKSB7XG4gICAgICAgIHJldHVybiAhVXRpbHMuaXNOdWxsT3JXaGl0ZXNwYWNlKHRoaXMuY2FwdGNoYVNpdGVLZXkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBoYW5kbGVDYXB0Y2hhUmVxdWlyZWQocmVzcG9uc2U6IHsgY2FwdGNoYVNpdGVLZXk6IHN0cmluZzsgfSk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoVXRpbHMuaXNOdWxsT3JXaGl0ZXNwYWNlKHJlc3BvbnNlLmNhcHRjaGFTaXRlS2V5KSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jYXB0Y2hhU2l0ZUtleSA9IHJlc3BvbnNlLmNhcHRjaGFTaXRlS2V5O1xuICAgICAgICB0aGlzLmNhcHRjaGEuaW5pdChyZXNwb25zZS5jYXB0Y2hhU2l0ZUtleSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IERpcmVjdGl2ZSwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IENyeXB0b1NlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL2NyeXB0by5zZXJ2aWNlJztcbmltcG9ydCB7IEkxOG5TZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9pMThuLnNlcnZpY2UnO1xuaW1wb3J0IHsgTWVzc2FnaW5nU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvbWVzc2FnaW5nLnNlcnZpY2UnO1xuaW1wb3J0IHsgUGFzc3dvcmRHZW5lcmF0aW9uU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvcGFzc3dvcmRHZW5lcmF0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgUGxhdGZvcm1VdGlsc1NlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL3BsYXRmb3JtVXRpbHMuc2VydmljZSc7XG5pbXBvcnQgeyBQb2xpY3lTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9wb2xpY3kuc2VydmljZSc7XG5pbXBvcnQgeyBVc2VyU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvdXNlci5zZXJ2aWNlJztcblxuaW1wb3J0IHsgRW5jU3RyaW5nIH0gZnJvbSAnanNsaWItY29tbW9uL21vZGVscy9kb21haW4vZW5jU3RyaW5nJztcbmltcG9ydCB7IE1hc3RlclBhc3N3b3JkUG9saWN5T3B0aW9ucyB9IGZyb20gJ2pzbGliLWNvbW1vbi9tb2RlbHMvZG9tYWluL21hc3RlclBhc3N3b3JkUG9saWN5T3B0aW9ucyc7XG5pbXBvcnQgeyBTeW1tZXRyaWNDcnlwdG9LZXkgfSBmcm9tICdqc2xpYi1jb21tb24vbW9kZWxzL2RvbWFpbi9zeW1tZXRyaWNDcnlwdG9LZXknO1xuXG5pbXBvcnQgeyBLZGZUeXBlIH0gZnJvbSAnanNsaWItY29tbW9uL2VudW1zL2tkZlR5cGUnO1xuXG5ARGlyZWN0aXZlKClcbmV4cG9ydCBjbGFzcyBDaGFuZ2VQYXNzd29yZENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gICAgbWFzdGVyUGFzc3dvcmQ6IHN0cmluZztcbiAgICBtYXN0ZXJQYXNzd29yZFJldHlwZTogc3RyaW5nO1xuICAgIGZvcm1Qcm9taXNlOiBQcm9taXNlPGFueT47XG4gICAgbWFzdGVyUGFzc3dvcmRTY29yZTogbnVtYmVyO1xuICAgIGVuZm9yY2VkUG9saWN5T3B0aW9uczogTWFzdGVyUGFzc3dvcmRQb2xpY3lPcHRpb25zO1xuXG4gICAgcHJvdGVjdGVkIGVtYWlsOiBzdHJpbmc7XG4gICAgcHJvdGVjdGVkIGtkZjogS2RmVHlwZTtcbiAgICBwcm90ZWN0ZWQga2RmSXRlcmF0aW9uczogbnVtYmVyO1xuXG4gICAgcHJpdmF0ZSBtYXN0ZXJQYXNzd29yZFN0cmVuZ3RoVGltZW91dDogYW55O1xuXG4gICAgY29uc3RydWN0b3IocHJvdGVjdGVkIGkxOG5TZXJ2aWNlOiBJMThuU2VydmljZSwgcHJvdGVjdGVkIGNyeXB0b1NlcnZpY2U6IENyeXB0b1NlcnZpY2UsXG4gICAgICAgIHByb3RlY3RlZCBtZXNzYWdpbmdTZXJ2aWNlOiBNZXNzYWdpbmdTZXJ2aWNlLCBwcm90ZWN0ZWQgdXNlclNlcnZpY2U6IFVzZXJTZXJ2aWNlLFxuICAgICAgICBwcm90ZWN0ZWQgcGFzc3dvcmRHZW5lcmF0aW9uU2VydmljZTogUGFzc3dvcmRHZW5lcmF0aW9uU2VydmljZSxcbiAgICAgICAgcHJvdGVjdGVkIHBsYXRmb3JtVXRpbHNTZXJ2aWNlOiBQbGF0Zm9ybVV0aWxzU2VydmljZSwgcHJvdGVjdGVkIHBvbGljeVNlcnZpY2U6IFBvbGljeVNlcnZpY2UpIHsgfVxuXG4gICAgYXN5bmMgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMuZW1haWwgPSBhd2FpdCB0aGlzLnVzZXJTZXJ2aWNlLmdldEVtYWlsKCk7XG4gICAgICAgIHRoaXMuZW5mb3JjZWRQb2xpY3lPcHRpb25zID0gYXdhaXQgdGhpcy5wb2xpY3lTZXJ2aWNlLmdldE1hc3RlclBhc3N3b3JkUG9saWN5T3B0aW9ucygpO1xuICAgIH1cblxuICAgIGFzeW5jIHN1Ym1pdCgpIHtcbiAgICAgICAgaWYgKCFhd2FpdCB0aGlzLnN0cm9uZ1Bhc3N3b3JkKCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghYXdhaXQgdGhpcy5zZXR1cFN1Ym1pdEFjdGlvbnMoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZW1haWwgPSBhd2FpdCB0aGlzLnVzZXJTZXJ2aWNlLmdldEVtYWlsKCk7XG4gICAgICAgIGlmICh0aGlzLmtkZiA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmtkZiA9IGF3YWl0IHRoaXMudXNlclNlcnZpY2UuZ2V0S2RmKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMua2RmSXRlcmF0aW9ucyA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmtkZkl0ZXJhdGlvbnMgPSBhd2FpdCB0aGlzLnVzZXJTZXJ2aWNlLmdldEtkZkl0ZXJhdGlvbnMoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBrZXkgPSBhd2FpdCB0aGlzLmNyeXB0b1NlcnZpY2UubWFrZUtleSh0aGlzLm1hc3RlclBhc3N3b3JkLCBlbWFpbC50cmltKCkudG9Mb3dlckNhc2UoKSxcbiAgICAgICAgICAgIHRoaXMua2RmLCB0aGlzLmtkZkl0ZXJhdGlvbnMpO1xuICAgICAgICBjb25zdCBtYXN0ZXJQYXNzd29yZEhhc2ggPSBhd2FpdCB0aGlzLmNyeXB0b1NlcnZpY2UuaGFzaFBhc3N3b3JkKHRoaXMubWFzdGVyUGFzc3dvcmQsIGtleSk7XG5cbiAgICAgICAgbGV0IGVuY0tleTogW1N5bW1ldHJpY0NyeXB0b0tleSwgRW5jU3RyaW5nXSA9IG51bGw7XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nRW5jS2V5ID0gYXdhaXQgdGhpcy5jcnlwdG9TZXJ2aWNlLmdldEVuY0tleSgpO1xuICAgICAgICBpZiAoZXhpc3RpbmdFbmNLZXkgPT0gbnVsbCkge1xuICAgICAgICAgICAgZW5jS2V5ID0gYXdhaXQgdGhpcy5jcnlwdG9TZXJ2aWNlLm1ha2VFbmNLZXkoa2V5KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGVuY0tleSA9IGF3YWl0IHRoaXMuY3J5cHRvU2VydmljZS5yZW1ha2VFbmNLZXkoa2V5KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IHRoaXMucGVyZm9ybVN1Ym1pdEFjdGlvbnMobWFzdGVyUGFzc3dvcmRIYXNoLCBrZXksIGVuY0tleSk7XG4gICAgfVxuXG4gICAgYXN5bmMgc2V0dXBTdWJtaXRBY3Rpb25zKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICAvLyBPdmVycmlkZSBpbiBzdWItY2xhc3NcbiAgICAgICAgLy8gQ2FuIGJlIHVzZWQgZm9yIGFkZGl0aW9uYWwgdmFsaWRhdGlvbiBhbmQvb3Igb3RoZXIgcHJvY2Vzc2VzIHRoZSBzaG91bGQgb2NjdXIgYmVmb3JlIGNoYW5naW5nIHBhc3N3b3Jkc1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBhc3luYyBwZXJmb3JtU3VibWl0QWN0aW9ucyhtYXN0ZXJQYXNzd29yZEhhc2g6IHN0cmluZywga2V5OiBTeW1tZXRyaWNDcnlwdG9LZXksXG4gICAgICAgIGVuY0tleTogW1N5bW1ldHJpY0NyeXB0b0tleSwgRW5jU3RyaW5nXSkge1xuICAgICAgICAvLyBPdmVycmlkZSBpbiBzdWItY2xhc3NcbiAgICB9XG5cbiAgICBhc3luYyBzdHJvbmdQYXNzd29yZCgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgaWYgKHRoaXMubWFzdGVyUGFzc3dvcmQgPT0gbnVsbCB8fCB0aGlzLm1hc3RlclBhc3N3b3JkID09PSAnJykge1xuICAgICAgICAgICAgdGhpcy5wbGF0Zm9ybVV0aWxzU2VydmljZS5zaG93VG9hc3QoJ2Vycm9yJywgdGhpcy5pMThuU2VydmljZS50KCdlcnJvck9jY3VycmVkJyksXG4gICAgICAgICAgICAgICAgdGhpcy5pMThuU2VydmljZS50KCdtYXN0ZXJQYXNzUmVxdWlyZWQnKSk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubWFzdGVyUGFzc3dvcmQubGVuZ3RoIDwgOCkge1xuICAgICAgICAgICAgdGhpcy5wbGF0Zm9ybVV0aWxzU2VydmljZS5zaG93VG9hc3QoJ2Vycm9yJywgdGhpcy5pMThuU2VydmljZS50KCdlcnJvck9jY3VycmVkJyksXG4gICAgICAgICAgICAgICAgdGhpcy5pMThuU2VydmljZS50KCdtYXN0ZXJQYXNzTGVuZ3RoJykpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm1hc3RlclBhc3N3b3JkICE9PSB0aGlzLm1hc3RlclBhc3N3b3JkUmV0eXBlKSB7XG4gICAgICAgICAgICB0aGlzLnBsYXRmb3JtVXRpbHNTZXJ2aWNlLnNob3dUb2FzdCgnZXJyb3InLCB0aGlzLmkxOG5TZXJ2aWNlLnQoJ2Vycm9yT2NjdXJyZWQnKSxcbiAgICAgICAgICAgICAgICB0aGlzLmkxOG5TZXJ2aWNlLnQoJ21hc3RlclBhc3NEb2VzbnRNYXRjaCcpKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN0cmVuZ3RoUmVzdWx0ID0gdGhpcy5wYXNzd29yZEdlbmVyYXRpb25TZXJ2aWNlLnBhc3N3b3JkU3RyZW5ndGgodGhpcy5tYXN0ZXJQYXNzd29yZCxcbiAgICAgICAgICAgIHRoaXMuZ2V0UGFzc3dvcmRTdHJlbmd0aFVzZXJJbnB1dCgpKTtcblxuICAgICAgICBpZiAodGhpcy5lbmZvcmNlZFBvbGljeU9wdGlvbnMgIT0gbnVsbCAmJlxuICAgICAgICAgICAgIXRoaXMucG9saWN5U2VydmljZS5ldmFsdWF0ZU1hc3RlclBhc3N3b3JkKFxuICAgICAgICAgICAgICAgIHN0cmVuZ3RoUmVzdWx0LnNjb3JlLFxuICAgICAgICAgICAgICAgIHRoaXMubWFzdGVyUGFzc3dvcmQsXG4gICAgICAgICAgICAgICAgdGhpcy5lbmZvcmNlZFBvbGljeU9wdGlvbnMpKSB7XG4gICAgICAgICAgICB0aGlzLnBsYXRmb3JtVXRpbHNTZXJ2aWNlLnNob3dUb2FzdCgnZXJyb3InLCB0aGlzLmkxOG5TZXJ2aWNlLnQoJ2Vycm9yT2NjdXJyZWQnKSxcbiAgICAgICAgICAgICAgICB0aGlzLmkxOG5TZXJ2aWNlLnQoJ21hc3RlclBhc3N3b3JkUG9saWN5UmVxdWlyZW1lbnRzTm90TWV0JykpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN0cmVuZ3RoUmVzdWx0ICE9IG51bGwgJiYgc3RyZW5ndGhSZXN1bHQuc2NvcmUgPCAzKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnBsYXRmb3JtVXRpbHNTZXJ2aWNlLnNob3dEaWFsb2codGhpcy5pMThuU2VydmljZS50KCd3ZWFrTWFzdGVyUGFzc3dvcmREZXNjJyksXG4gICAgICAgICAgICAgICAgdGhpcy5pMThuU2VydmljZS50KCd3ZWFrTWFzdGVyUGFzc3dvcmQnKSwgdGhpcy5pMThuU2VydmljZS50KCd5ZXMnKSwgdGhpcy5pMThuU2VydmljZS50KCdubycpLFxuICAgICAgICAgICAgICAgICd3YXJuaW5nJyk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHVwZGF0ZVBhc3N3b3JkU3RyZW5ndGgoKSB7XG4gICAgICAgIGlmICh0aGlzLm1hc3RlclBhc3N3b3JkU3RyZW5ndGhUaW1lb3V0ICE9IG51bGwpIHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLm1hc3RlclBhc3N3b3JkU3RyZW5ndGhUaW1lb3V0KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm1hc3RlclBhc3N3b3JkU3RyZW5ndGhUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzdHJlbmd0aFJlc3VsdCA9IHRoaXMucGFzc3dvcmRHZW5lcmF0aW9uU2VydmljZS5wYXNzd29yZFN0cmVuZ3RoKHRoaXMubWFzdGVyUGFzc3dvcmQsXG4gICAgICAgICAgICAgICAgdGhpcy5nZXRQYXNzd29yZFN0cmVuZ3RoVXNlcklucHV0KCkpO1xuICAgICAgICAgICAgdGhpcy5tYXN0ZXJQYXNzd29yZFNjb3JlID0gc3RyZW5ndGhSZXN1bHQgPT0gbnVsbCA/IG51bGwgOiBzdHJlbmd0aFJlc3VsdC5zY29yZTtcbiAgICAgICAgfSwgMzAwKTtcbiAgICB9XG5cbiAgICBhc3luYyBsb2dPdXQoKSB7XG4gICAgICAgIGNvbnN0IGNvbmZpcm1lZCA9IGF3YWl0IHRoaXMucGxhdGZvcm1VdGlsc1NlcnZpY2Uuc2hvd0RpYWxvZyh0aGlzLmkxOG5TZXJ2aWNlLnQoJ2xvZ091dENvbmZpcm1hdGlvbicpLFxuICAgICAgICAgICAgdGhpcy5pMThuU2VydmljZS50KCdsb2dPdXQnKSwgdGhpcy5pMThuU2VydmljZS50KCdsb2dPdXQnKSwgdGhpcy5pMThuU2VydmljZS50KCdjYW5jZWwnKSk7XG4gICAgICAgIGlmIChjb25maXJtZWQpIHtcbiAgICAgICAgICAgIHRoaXMubWVzc2FnaW5nU2VydmljZS5zZW5kKCdsb2dvdXQnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0UGFzc3dvcmRTdHJlbmd0aFVzZXJJbnB1dCgpIHtcbiAgICAgICAgbGV0IHVzZXJJbnB1dDogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgY29uc3QgYXRQb3NpdGlvbiA9IHRoaXMuZW1haWwuaW5kZXhPZignQCcpO1xuICAgICAgICBpZiAoYXRQb3NpdGlvbiA+IC0xKSB7XG4gICAgICAgICAgICB1c2VySW5wdXQgPSB1c2VySW5wdXQuY29uY2F0KHRoaXMuZW1haWwuc3Vic3RyKDAsIGF0UG9zaXRpb24pLnRyaW0oKS50b0xvd2VyQ2FzZSgpLnNwbGl0KC9bXkEtWmEtejAtOV0vKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVzZXJJbnB1dDtcbiAgICB9XG59XG4iLCJpbXBvcnQge1xuICAgIERpcmVjdGl2ZSxcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgSW5wdXQsXG4gICAgT3V0cHV0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgU2VhcmNoU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvc2VhcmNoLnNlcnZpY2UnO1xuXG5pbXBvcnQgeyBDaXBoZXJWaWV3IH0gZnJvbSAnanNsaWItY29tbW9uL21vZGVscy92aWV3L2NpcGhlclZpZXcnO1xuXG5ARGlyZWN0aXZlKClcbmV4cG9ydCBjbGFzcyBDaXBoZXJzQ29tcG9uZW50IHtcbiAgICBASW5wdXQoKSBhY3RpdmVDaXBoZXJJZDogc3RyaW5nID0gbnVsbDtcbiAgICBAT3V0cHV0KCkgb25DaXBoZXJDbGlja2VkID0gbmV3IEV2ZW50RW1pdHRlcjxDaXBoZXJWaWV3PigpO1xuICAgIEBPdXRwdXQoKSBvbkNpcGhlclJpZ2h0Q2xpY2tlZCA9IG5ldyBFdmVudEVtaXR0ZXI8Q2lwaGVyVmlldz4oKTtcbiAgICBAT3V0cHV0KCkgb25BZGRDaXBoZXIgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgQE91dHB1dCgpIG9uQWRkQ2lwaGVyT3B0aW9ucyA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAgIGxvYWRlZDogYm9vbGVhbiA9IGZhbHNlO1xuICAgIGNpcGhlcnM6IENpcGhlclZpZXdbXSA9IFtdO1xuICAgIHNlYXJjaFRleHQ6IHN0cmluZztcbiAgICBzZWFyY2hQbGFjZWhvbGRlcjogc3RyaW5nID0gbnVsbDtcbiAgICBmaWx0ZXI6IChjaXBoZXI6IENpcGhlclZpZXcpID0+IGJvb2xlYW4gPSBudWxsO1xuICAgIGRlbGV0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIHByb3RlY3RlZCBzZWFyY2hQZW5kaW5nID0gZmFsc2U7XG5cbiAgICBwcml2YXRlIHNlYXJjaFRpbWVvdXQ6IGFueSA9IG51bGw7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgc2VhcmNoU2VydmljZTogU2VhcmNoU2VydmljZSkgeyB9XG5cbiAgICBhc3luYyBsb2FkKGZpbHRlcjogKGNpcGhlcjogQ2lwaGVyVmlldykgPT4gYm9vbGVhbiA9IG51bGwsIGRlbGV0ZWQ6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgICAgICB0aGlzLmRlbGV0ZWQgPSBkZWxldGVkIHx8IGZhbHNlO1xuICAgICAgICBhd2FpdCB0aGlzLmFwcGx5RmlsdGVyKGZpbHRlcik7XG4gICAgICAgIHRoaXMubG9hZGVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBhc3luYyByZWxvYWQoZmlsdGVyOiAoY2lwaGVyOiBDaXBoZXJWaWV3KSA9PiBib29sZWFuID0gbnVsbCwgZGVsZXRlZDogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgICAgIHRoaXMubG9hZGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY2lwaGVycyA9IFtdO1xuICAgICAgICBhd2FpdCB0aGlzLmxvYWQoZmlsdGVyLCBkZWxldGVkKTtcbiAgICB9XG5cbiAgICBhc3luYyByZWZyZXNoKCkge1xuICAgICAgICBhd2FpdCB0aGlzLnJlbG9hZCh0aGlzLmZpbHRlciwgdGhpcy5kZWxldGVkKTtcbiAgICB9XG5cbiAgICBhc3luYyBhcHBseUZpbHRlcihmaWx0ZXI6IChjaXBoZXI6IENpcGhlclZpZXcpID0+IGJvb2xlYW4gPSBudWxsKSB7XG4gICAgICAgIHRoaXMuZmlsdGVyID0gZmlsdGVyO1xuICAgICAgICBhd2FpdCB0aGlzLnNlYXJjaChudWxsKTtcbiAgICB9XG5cbiAgICBhc3luYyBzZWFyY2godGltZW91dDogbnVtYmVyID0gbnVsbCwgaW5kZXhlZENpcGhlcnM/OiBDaXBoZXJWaWV3W10pIHtcbiAgICAgICAgdGhpcy5zZWFyY2hQZW5kaW5nID0gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLnNlYXJjaFRpbWVvdXQgIT0gbnVsbCkge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuc2VhcmNoVGltZW91dCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRpbWVvdXQgPT0gbnVsbCkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5kb1NlYXJjaChpbmRleGVkQ2lwaGVycyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZWFyY2hQZW5kaW5nID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zZWFyY2hUaW1lb3V0ID0gc2V0VGltZW91dChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmRvU2VhcmNoKGluZGV4ZWRDaXBoZXJzKTtcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoUGVuZGluZyA9IGZhbHNlO1xuICAgICAgICB9LCB0aW1lb3V0KTtcbiAgICB9XG5cbiAgICBzZWxlY3RDaXBoZXIoY2lwaGVyOiBDaXBoZXJWaWV3KSB7XG4gICAgICAgIHRoaXMub25DaXBoZXJDbGlja2VkLmVtaXQoY2lwaGVyKTtcbiAgICB9XG5cbiAgICByaWdodENsaWNrQ2lwaGVyKGNpcGhlcjogQ2lwaGVyVmlldykge1xuICAgICAgICB0aGlzLm9uQ2lwaGVyUmlnaHRDbGlja2VkLmVtaXQoY2lwaGVyKTtcbiAgICB9XG5cbiAgICBhZGRDaXBoZXIoKSB7XG4gICAgICAgIHRoaXMub25BZGRDaXBoZXIuZW1pdCgpO1xuICAgIH1cblxuICAgIGFkZENpcGhlck9wdGlvbnMoKSB7XG4gICAgICAgIHRoaXMub25BZGRDaXBoZXJPcHRpb25zLmVtaXQoKTtcbiAgICB9XG5cbiAgICBpc1NlYXJjaGluZygpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLnNlYXJjaFBlbmRpbmcgJiYgdGhpcy5zZWFyY2hTZXJ2aWNlLmlzU2VhcmNoYWJsZSh0aGlzLnNlYXJjaFRleHQpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBkZWxldGVkRmlsdGVyOiAoY2lwaGVyOiBDaXBoZXJWaWV3KSA9PiBib29sZWFuID0gYyA9PiBjLmlzRGVsZXRlZCA9PT0gdGhpcy5kZWxldGVkO1xuXG4gICAgcHJvdGVjdGVkIGFzeW5jIGRvU2VhcmNoKGluZGV4ZWRDaXBoZXJzPzogQ2lwaGVyVmlld1tdKSB7XG4gICAgICAgIHRoaXMuY2lwaGVycyA9IGF3YWl0IHRoaXMuc2VhcmNoU2VydmljZS5zZWFyY2hDaXBoZXJzKHRoaXMuc2VhcmNoVGV4dCwgW3RoaXMuZmlsdGVyLCB0aGlzLmRlbGV0ZWRGaWx0ZXJdLCBpbmRleGVkQ2lwaGVycyk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHtcbiAgICBEaXJlY3RpdmUsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIElucHV0LFxuICAgIE9uSW5pdCxcbiAgICBPdXRwdXQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBDaXBoZXJTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9jaXBoZXIuc2VydmljZSc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvY29sbGVjdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IEkxOG5TZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9pMThuLnNlcnZpY2UnO1xuaW1wb3J0IHsgTG9nU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvbG9nLnNlcnZpY2UnO1xuaW1wb3J0IHsgUGxhdGZvcm1VdGlsc1NlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL3BsYXRmb3JtVXRpbHMuc2VydmljZSc7XG5cbmltcG9ydCB7IENpcGhlclZpZXcgfSBmcm9tICdqc2xpYi1jb21tb24vbW9kZWxzL3ZpZXcvY2lwaGVyVmlldyc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uVmlldyB9IGZyb20gJ2pzbGliLWNvbW1vbi9tb2RlbHMvdmlldy9jb2xsZWN0aW9uVmlldyc7XG5cbmltcG9ydCB7IENpcGhlciB9IGZyb20gJ2pzbGliLWNvbW1vbi9tb2RlbHMvZG9tYWluL2NpcGhlcic7XG5cbkBEaXJlY3RpdmUoKVxuZXhwb3J0IGNsYXNzIENvbGxlY3Rpb25zQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgICBASW5wdXQoKSBjaXBoZXJJZDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIGFsbG93U2VsZWN0Tm9uZSA9IGZhbHNlO1xuICAgIEBPdXRwdXQoKSBvblNhdmVkQ29sbGVjdGlvbnMgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgICBmb3JtUHJvbWlzZTogUHJvbWlzZTxhbnk+O1xuICAgIGNpcGhlcjogQ2lwaGVyVmlldztcbiAgICBjb2xsZWN0aW9uSWRzOiBzdHJpbmdbXTtcbiAgICBjb2xsZWN0aW9uczogQ29sbGVjdGlvblZpZXdbXSA9IFtdO1xuXG4gICAgcHJvdGVjdGVkIGNpcGhlckRvbWFpbjogQ2lwaGVyO1xuXG4gICAgY29uc3RydWN0b3IocHJvdGVjdGVkIGNvbGxlY3Rpb25TZXJ2aWNlOiBDb2xsZWN0aW9uU2VydmljZSwgcHJvdGVjdGVkIHBsYXRmb3JtVXRpbHNTZXJ2aWNlOiBQbGF0Zm9ybVV0aWxzU2VydmljZSxcbiAgICAgICAgcHJvdGVjdGVkIGkxOG5TZXJ2aWNlOiBJMThuU2VydmljZSwgcHJvdGVjdGVkIGNpcGhlclNlcnZpY2U6IENpcGhlclNlcnZpY2UsIHByaXZhdGUgbG9nU2VydmljZTogTG9nU2VydmljZSkgeyB9XG5cbiAgICBhc3luYyBuZ09uSW5pdCgpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5sb2FkKCk7XG4gICAgfVxuXG4gICAgYXN5bmMgbG9hZCgpIHtcbiAgICAgICAgdGhpcy5jaXBoZXJEb21haW4gPSBhd2FpdCB0aGlzLmxvYWRDaXBoZXIoKTtcbiAgICAgICAgdGhpcy5jb2xsZWN0aW9uSWRzID0gdGhpcy5sb2FkQ2lwaGVyQ29sbGVjdGlvbnMoKTtcbiAgICAgICAgdGhpcy5jaXBoZXIgPSBhd2FpdCB0aGlzLmNpcGhlckRvbWFpbi5kZWNyeXB0KCk7XG4gICAgICAgIHRoaXMuY29sbGVjdGlvbnMgPSBhd2FpdCB0aGlzLmxvYWRDb2xsZWN0aW9ucygpO1xuXG4gICAgICAgIHRoaXMuY29sbGVjdGlvbnMuZm9yRWFjaChjID0+IChjIGFzIGFueSkuY2hlY2tlZCA9IGZhbHNlKTtcbiAgICAgICAgaWYgKHRoaXMuY29sbGVjdGlvbklkcyAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmNvbGxlY3Rpb25zLmZvckVhY2goYyA9PiB7XG4gICAgICAgICAgICAgICAgKGMgYXMgYW55KS5jaGVja2VkID0gdGhpcy5jb2xsZWN0aW9uSWRzICE9IG51bGwgJiYgdGhpcy5jb2xsZWN0aW9uSWRzLmluZGV4T2YoYy5pZCkgPiAtMTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgc3VibWl0KCkge1xuICAgICAgICBjb25zdCBzZWxlY3RlZENvbGxlY3Rpb25JZHMgPSB0aGlzLmNvbGxlY3Rpb25zXG4gICAgICAgICAgICAuZmlsdGVyKGMgPT4gISEoYyBhcyBhbnkpLmNoZWNrZWQpXG4gICAgICAgICAgICAubWFwKGMgPT4gYy5pZCk7XG4gICAgICAgIGlmICghdGhpcy5hbGxvd1NlbGVjdE5vbmUgJiYgc2VsZWN0ZWRDb2xsZWN0aW9uSWRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5wbGF0Zm9ybVV0aWxzU2VydmljZS5zaG93VG9hc3QoJ2Vycm9yJywgdGhpcy5pMThuU2VydmljZS50KCdlcnJvck9jY3VycmVkJyksXG4gICAgICAgICAgICAgICAgdGhpcy5pMThuU2VydmljZS50KCdzZWxlY3RPbmVDb2xsZWN0aW9uJykpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2lwaGVyRG9tYWluLmNvbGxlY3Rpb25JZHMgPSBzZWxlY3RlZENvbGxlY3Rpb25JZHM7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLmZvcm1Qcm9taXNlID0gdGhpcy5zYXZlQ29sbGVjdGlvbnMoKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZm9ybVByb21pc2U7XG4gICAgICAgICAgICB0aGlzLm9uU2F2ZWRDb2xsZWN0aW9ucy5lbWl0KCk7XG4gICAgICAgICAgICB0aGlzLnBsYXRmb3JtVXRpbHNTZXJ2aWNlLnNob3dUb2FzdCgnc3VjY2VzcycsIG51bGwsIHRoaXMuaTE4blNlcnZpY2UudCgnZWRpdGVkSXRlbScpKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5sb2dTZXJ2aWNlLmVycm9yKGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGxvYWRDaXBoZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNpcGhlclNlcnZpY2UuZ2V0KHRoaXMuY2lwaGVySWQpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBsb2FkQ2lwaGVyQ29sbGVjdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNpcGhlckRvbWFpbi5jb2xsZWN0aW9uSWRzO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBhc3luYyBsb2FkQ29sbGVjdGlvbnMoKSB7XG4gICAgICAgIGNvbnN0IGFsbENvbGxlY3Rpb25zID0gYXdhaXQgdGhpcy5jb2xsZWN0aW9uU2VydmljZS5nZXRBbGxEZWNyeXB0ZWQoKTtcbiAgICAgICAgcmV0dXJuIGFsbENvbGxlY3Rpb25zLmZpbHRlcihjID0+ICFjLnJlYWRPbmx5ICYmIGMub3JnYW5pemF0aW9uSWQgPT09IHRoaXMuY2lwaGVyLm9yZ2FuaXphdGlvbklkKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgc2F2ZUNvbGxlY3Rpb25zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jaXBoZXJTZXJ2aWNlLnNhdmVDb2xsZWN0aW9uc1dpdGhTZXJ2ZXIodGhpcy5jaXBoZXJEb21haW4pO1xuICAgIH1cbn1cbiIsImltcG9ydCB7XG4gICAgRGlyZWN0aXZlLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBPdXRwdXQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBFbnZpcm9ubWVudFNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL2Vudmlyb25tZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgSTE4blNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL2kxOG4uc2VydmljZSc7XG5pbXBvcnQgeyBQbGF0Zm9ybVV0aWxzU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvcGxhdGZvcm1VdGlscy5zZXJ2aWNlJztcblxuQERpcmVjdGl2ZSgpXG5leHBvcnQgY2xhc3MgRW52aXJvbm1lbnRDb21wb25lbnQge1xuICAgIEBPdXRwdXQoKSBvblNhdmVkID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gICAgaWNvbnNVcmw6IHN0cmluZztcbiAgICBpZGVudGl0eVVybDogc3RyaW5nO1xuICAgIGFwaVVybDogc3RyaW5nO1xuICAgIHdlYlZhdWx0VXJsOiBzdHJpbmc7XG4gICAgbm90aWZpY2F0aW9uc1VybDogc3RyaW5nO1xuICAgIGJhc2VVcmw6IHN0cmluZztcbiAgICBzaG93Q3VzdG9tID0gZmFsc2U7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgcGxhdGZvcm1VdGlsc1NlcnZpY2U6IFBsYXRmb3JtVXRpbHNTZXJ2aWNlLCBwcm90ZWN0ZWQgZW52aXJvbm1lbnRTZXJ2aWNlOiBFbnZpcm9ubWVudFNlcnZpY2UsXG4gICAgICAgIHByb3RlY3RlZCBpMThuU2VydmljZTogSTE4blNlcnZpY2UpIHtcblxuICAgICAgICBjb25zdCB1cmxzID0gdGhpcy5lbnZpcm9ubWVudFNlcnZpY2UuZ2V0VXJscygpO1xuXG4gICAgICAgIHRoaXMuYmFzZVVybCA9IHVybHMuYmFzZSB8fCAnJztcbiAgICAgICAgdGhpcy53ZWJWYXVsdFVybCA9IHVybHMud2ViVmF1bHQgfHwgJyc7XG4gICAgICAgIHRoaXMuYXBpVXJsID0gdXJscy5hcGkgfHwgJyc7XG4gICAgICAgIHRoaXMuaWRlbnRpdHlVcmwgPSB1cmxzLmlkZW50aXR5IHx8ICcnO1xuICAgICAgICB0aGlzLmljb25zVXJsID0gdXJscy5pY29ucyB8fCAnJztcbiAgICAgICAgdGhpcy5ub3RpZmljYXRpb25zVXJsID0gdXJscy5ub3RpZmljYXRpb25zIHx8ICcnO1xuICAgIH1cblxuICAgIGFzeW5jIHN1Ym1pdCgpIHtcbiAgICAgICAgY29uc3QgcmVzVXJscyA9IGF3YWl0IHRoaXMuZW52aXJvbm1lbnRTZXJ2aWNlLnNldFVybHMoe1xuICAgICAgICAgICAgYmFzZTogdGhpcy5iYXNlVXJsLFxuICAgICAgICAgICAgYXBpOiB0aGlzLmFwaVVybCxcbiAgICAgICAgICAgIGlkZW50aXR5OiB0aGlzLmlkZW50aXR5VXJsLFxuICAgICAgICAgICAgd2ViVmF1bHQ6IHRoaXMud2ViVmF1bHRVcmwsXG4gICAgICAgICAgICBpY29uczogdGhpcy5pY29uc1VybCxcbiAgICAgICAgICAgIG5vdGlmaWNhdGlvbnM6IHRoaXMubm90aWZpY2F0aW9uc1VybCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gcmUtc2V0IHVybHMgc2luY2Ugc2VydmljZSBjYW4gY2hhbmdlIHRoZW0sIGV4OiBwcmVmaXhpbmcgaHR0cHM6Ly9cbiAgICAgICAgdGhpcy5iYXNlVXJsID0gcmVzVXJscy5iYXNlO1xuICAgICAgICB0aGlzLmFwaVVybCA9IHJlc1VybHMuYXBpO1xuICAgICAgICB0aGlzLmlkZW50aXR5VXJsID0gcmVzVXJscy5pZGVudGl0eTtcbiAgICAgICAgdGhpcy53ZWJWYXVsdFVybCA9IHJlc1VybHMud2ViVmF1bHQ7XG4gICAgICAgIHRoaXMuaWNvbnNVcmwgPSByZXNVcmxzLmljb25zO1xuICAgICAgICB0aGlzLm5vdGlmaWNhdGlvbnNVcmwgPSByZXNVcmxzLm5vdGlmaWNhdGlvbnM7XG5cbiAgICAgICAgdGhpcy5wbGF0Zm9ybVV0aWxzU2VydmljZS5zaG93VG9hc3QoJ3N1Y2Nlc3MnLCBudWxsLCB0aGlzLmkxOG5TZXJ2aWNlLnQoJ2Vudmlyb25tZW50U2F2ZWQnKSk7XG4gICAgICAgIHRoaXMuc2F2ZWQoKTtcbiAgICB9XG5cbiAgICB0b2dnbGVDdXN0b20oKSB7XG4gICAgICAgIHRoaXMuc2hvd0N1c3RvbSA9ICF0aGlzLnNob3dDdXN0b207XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHNhdmVkKCkge1xuICAgICAgICB0aGlzLm9uU2F2ZWQuZW1pdCgpO1xuICAgIH1cbn1cbiIsImltcG9ydCB7XG4gICAgRGlyZWN0aXZlLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBPbkluaXQsXG4gICAgT3V0cHV0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgQ3J5cHRvU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvY3J5cHRvLnNlcnZpY2UnO1xuaW1wb3J0IHsgRXZlbnRTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9ldmVudC5zZXJ2aWNlJztcbmltcG9ydCB7IEV4cG9ydFNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL2V4cG9ydC5zZXJ2aWNlJztcbmltcG9ydCB7IEkxOG5TZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9pMThuLnNlcnZpY2UnO1xuaW1wb3J0IHsgTG9nU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvbG9nLnNlcnZpY2UnO1xuaW1wb3J0IHsgUGxhdGZvcm1VdGlsc1NlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL3BsYXRmb3JtVXRpbHMuc2VydmljZSc7XG5pbXBvcnQgeyBQb2xpY3lTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9wb2xpY3kuc2VydmljZSc7XG5cbmltcG9ydCB7IEV2ZW50VHlwZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9lbnVtcy9ldmVudFR5cGUnO1xuaW1wb3J0IHsgUG9saWN5VHlwZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9lbnVtcy9wb2xpY3lUeXBlJztcblxuQERpcmVjdGl2ZSgpXG5leHBvcnQgY2xhc3MgRXhwb3J0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgICBAT3V0cHV0KCkgb25TYXZlZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAgIGZvcm1Qcm9taXNlOiBQcm9taXNlPHN0cmluZz47XG4gICAgbWFzdGVyUGFzc3dvcmQ6IHN0cmluZztcbiAgICBmb3JtYXQ6ICdqc29uJyB8ICdlbmNyeXB0ZWRfanNvbicgfCAnY3N2JyA9ICdqc29uJztcbiAgICBzaG93UGFzc3dvcmQgPSBmYWxzZTtcbiAgICBkaXNhYmxlZEJ5UG9saWN5OiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgY3J5cHRvU2VydmljZTogQ3J5cHRvU2VydmljZSwgcHJvdGVjdGVkIGkxOG5TZXJ2aWNlOiBJMThuU2VydmljZSxcbiAgICAgICAgcHJvdGVjdGVkIHBsYXRmb3JtVXRpbHNTZXJ2aWNlOiBQbGF0Zm9ybVV0aWxzU2VydmljZSwgcHJvdGVjdGVkIGV4cG9ydFNlcnZpY2U6IEV4cG9ydFNlcnZpY2UsXG4gICAgICAgIHByb3RlY3RlZCBldmVudFNlcnZpY2U6IEV2ZW50U2VydmljZSwgcHJpdmF0ZSBwb2xpY3lTZXJ2aWNlOiBQb2xpY3lTZXJ2aWNlLCBwcm90ZWN0ZWQgd2luOiBXaW5kb3csXG4gICAgICAgIHByaXZhdGUgbG9nU2VydmljZTogTG9nU2VydmljZSkgeyB9XG5cbiAgICBhc3luYyBuZ09uSW5pdCgpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5jaGVja0V4cG9ydERpc2FibGVkKCk7XG4gICAgfVxuXG4gICAgYXN5bmMgY2hlY2tFeHBvcnREaXNhYmxlZCgpIHtcbiAgICAgICAgdGhpcy5kaXNhYmxlZEJ5UG9saWN5ID0gYXdhaXQgdGhpcy5wb2xpY3lTZXJ2aWNlLnBvbGljeUFwcGxpZXNUb1VzZXIoUG9saWN5VHlwZS5EaXNhYmxlUGVyc29uYWxWYXVsdEV4cG9ydCk7XG4gICAgfVxuXG4gICAgZ2V0IGVuY3J5cHRlZEZvcm1hdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZm9ybWF0ID09PSAnZW5jcnlwdGVkX2pzb24nO1xuICAgIH1cblxuICAgIGFzeW5jIHN1Ym1pdCgpIHtcbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWRCeVBvbGljeSkge1xuICAgICAgICAgICAgdGhpcy5wbGF0Zm9ybVV0aWxzU2VydmljZS5zaG93VG9hc3QoJ2Vycm9yJywgbnVsbCwgdGhpcy5pMThuU2VydmljZS50KCdwZXJzb25hbFZhdWx0RXhwb3J0UG9saWN5SW5FZmZlY3QnKSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5tYXN0ZXJQYXNzd29yZCA9PSBudWxsIHx8IHRoaXMubWFzdGVyUGFzc3dvcmQgPT09ICcnKSB7XG4gICAgICAgICAgICB0aGlzLnBsYXRmb3JtVXRpbHNTZXJ2aWNlLnNob3dUb2FzdCgnZXJyb3InLCB0aGlzLmkxOG5TZXJ2aWNlLnQoJ2Vycm9yT2NjdXJyZWQnKSxcbiAgICAgICAgICAgICAgICB0aGlzLmkxOG5TZXJ2aWNlLnQoJ2ludmFsaWRNYXN0ZXJQYXNzd29yZCcpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGFjY2VwdGVkV2FybmluZyA9IGF3YWl0IHRoaXMud2FybmluZ0RpYWxvZygpO1xuICAgICAgICBpZiAoIWFjY2VwdGVkV2FybmluZykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGFzc3dvcmRWYWxpZCA9IGF3YWl0IHRoaXMuY3J5cHRvU2VydmljZS5jb21wYXJlQW5kVXBkYXRlS2V5SGFzaCh0aGlzLm1hc3RlclBhc3N3b3JkLCBudWxsKTtcbiAgICAgICAgaWYgKHBhc3N3b3JkVmFsaWQpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtUHJvbWlzZSA9IHRoaXMuZ2V0RXhwb3J0RGF0YSgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCB0aGlzLmZvcm1Qcm9taXNlO1xuICAgICAgICAgICAgICAgIHRoaXMuZG93bmxvYWRGaWxlKGRhdGEpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2F2ZWQoKTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNvbGxlY3RFdmVudCgpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nU2VydmljZS5lcnJvcihlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucGxhdGZvcm1VdGlsc1NlcnZpY2Uuc2hvd1RvYXN0KCdlcnJvcicsIHRoaXMuaTE4blNlcnZpY2UudCgnZXJyb3JPY2N1cnJlZCcpLFxuICAgICAgICAgICAgICAgIHRoaXMuaTE4blNlcnZpY2UudCgnaW52YWxpZE1hc3RlclBhc3N3b3JkJykpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgd2FybmluZ0RpYWxvZygpIHtcbiAgICAgICAgaWYgKHRoaXMuZW5jcnlwdGVkRm9ybWF0KSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5wbGF0Zm9ybVV0aWxzU2VydmljZS5zaG93RGlhbG9nKFxuICAgICAgICAgICAgICAgICc8cD4nICsgdGhpcy5pMThuU2VydmljZS50KCdlbmNFeHBvcnRLZXlXYXJuaW5nRGVzYycpICtcbiAgICAgICAgICAgICAgICAnPHA+JyArIHRoaXMuaTE4blNlcnZpY2UudCgnZW5jRXhwb3J0QWNjb3VudFdhcm5pbmdEZXNjJyksXG4gICAgICAgICAgICAgICAgdGhpcy5pMThuU2VydmljZS50KCdjb25maXJtVmF1bHRFeHBvcnQnKSwgdGhpcy5pMThuU2VydmljZS50KCdleHBvcnRWYXVsdCcpLFxuICAgICAgICAgICAgICAgIHRoaXMuaTE4blNlcnZpY2UudCgnY2FuY2VsJyksICd3YXJuaW5nJyxcbiAgICAgICAgICAgICAgICB0cnVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnBsYXRmb3JtVXRpbHNTZXJ2aWNlLnNob3dEaWFsb2coXG4gICAgICAgICAgICAgICAgdGhpcy5pMThuU2VydmljZS50KCdleHBvcnRXYXJuaW5nRGVzYycpLFxuICAgICAgICAgICAgICAgIHRoaXMuaTE4blNlcnZpY2UudCgnY29uZmlybVZhdWx0RXhwb3J0JyksIHRoaXMuaTE4blNlcnZpY2UudCgnZXhwb3J0VmF1bHQnKSxcbiAgICAgICAgICAgICAgICB0aGlzLmkxOG5TZXJ2aWNlLnQoJ2NhbmNlbCcpLCAnd2FybmluZycpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdG9nZ2xlUGFzc3dvcmQoKSB7XG4gICAgICAgIHRoaXMuc2hvd1Bhc3N3b3JkID0gIXRoaXMuc2hvd1Bhc3N3b3JkO1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzdGVyUGFzc3dvcmQnKS5mb2N1cygpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBzYXZlZCgpIHtcbiAgICAgICAgdGhpcy5vblNhdmVkLmVtaXQoKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZ2V0RXhwb3J0RGF0YSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZXhwb3J0U2VydmljZS5nZXRFeHBvcnQodGhpcy5mb3JtYXQpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBnZXRGaWxlTmFtZShwcmVmaXg/OiBzdHJpbmcpIHtcbiAgICAgICAgbGV0IGV4dGVuc2lvbiA9IHRoaXMuZm9ybWF0O1xuICAgICAgICBpZiAodGhpcy5mb3JtYXQgPT09ICdlbmNyeXB0ZWRfanNvbicpIHtcbiAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHByZWZpeCA9ICdlbmNyeXB0ZWQnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwcmVmaXggPSAnZW5jcnlwdGVkXycgKyBwcmVmaXg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBleHRlbnNpb24gPSAnanNvbic7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZXhwb3J0U2VydmljZS5nZXRGaWxlTmFtZShwcmVmaXgsIGV4dGVuc2lvbik7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGFzeW5jIGNvbGxlY3RFdmVudCgpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICBhd2FpdCB0aGlzLmV2ZW50U2VydmljZS5jb2xsZWN0KEV2ZW50VHlwZS5Vc2VyX0NsaWVudEV4cG9ydGVkVmF1bHQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZG93bmxvYWRGaWxlKGNzdjogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGZpbGVOYW1lID0gdGhpcy5nZXRGaWxlTmFtZSgpO1xuICAgICAgICB0aGlzLnBsYXRmb3JtVXRpbHNTZXJ2aWNlLnNhdmVGaWxlKHRoaXMud2luLCBjc3YsIHsgdHlwZTogJ3RleHQvcGxhaW4nIH0sIGZpbGVOYW1lKTtcbiAgICB9XG59XG4iLCJpbXBvcnQge1xuICAgIERpcmVjdGl2ZSxcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgSW5wdXQsXG4gICAgT25Jbml0LFxuICAgIE91dHB1dCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IEZvbGRlclNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL2ZvbGRlci5zZXJ2aWNlJztcbmltcG9ydCB7IEkxOG5TZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9pMThuLnNlcnZpY2UnO1xuaW1wb3J0IHsgTG9nU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvbG9nLnNlcnZpY2UnO1xuaW1wb3J0IHsgUGxhdGZvcm1VdGlsc1NlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL3BsYXRmb3JtVXRpbHMuc2VydmljZSc7XG5cbmltcG9ydCB7IEZvbGRlclZpZXcgfSBmcm9tICdqc2xpYi1jb21tb24vbW9kZWxzL3ZpZXcvZm9sZGVyVmlldyc7XG5cbkBEaXJlY3RpdmUoKVxuZXhwb3J0IGNsYXNzIEZvbGRlckFkZEVkaXRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICAgIEBJbnB1dCgpIGZvbGRlcklkOiBzdHJpbmc7XG4gICAgQE91dHB1dCgpIG9uU2F2ZWRGb2xkZXIgPSBuZXcgRXZlbnRFbWl0dGVyPEZvbGRlclZpZXc+KCk7XG4gICAgQE91dHB1dCgpIG9uRGVsZXRlZEZvbGRlciA9IG5ldyBFdmVudEVtaXR0ZXI8Rm9sZGVyVmlldz4oKTtcblxuICAgIGVkaXRNb2RlOiBib29sZWFuID0gZmFsc2U7XG4gICAgZm9sZGVyOiBGb2xkZXJWaWV3ID0gbmV3IEZvbGRlclZpZXcoKTtcbiAgICB0aXRsZTogc3RyaW5nO1xuICAgIGZvcm1Qcm9taXNlOiBQcm9taXNlPGFueT47XG4gICAgZGVsZXRlUHJvbWlzZTogUHJvbWlzZTxhbnk+O1xuXG4gICAgY29uc3RydWN0b3IocHJvdGVjdGVkIGZvbGRlclNlcnZpY2U6IEZvbGRlclNlcnZpY2UsIHByb3RlY3RlZCBpMThuU2VydmljZTogSTE4blNlcnZpY2UsXG4gICAgICAgIHByb3RlY3RlZCBwbGF0Zm9ybVV0aWxzU2VydmljZTogUGxhdGZvcm1VdGlsc1NlcnZpY2UsIHByaXZhdGUgbG9nU2VydmljZTogTG9nU2VydmljZSkgeyB9XG5cbiAgICBhc3luYyBuZ09uSW5pdCgpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gICAgfVxuXG4gICAgYXN5bmMgc3VibWl0KCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICBpZiAodGhpcy5mb2xkZXIubmFtZSA9PSBudWxsIHx8IHRoaXMuZm9sZGVyLm5hbWUgPT09ICcnKSB7XG4gICAgICAgICAgICB0aGlzLnBsYXRmb3JtVXRpbHNTZXJ2aWNlLnNob3dUb2FzdCgnZXJyb3InLCB0aGlzLmkxOG5TZXJ2aWNlLnQoJ2Vycm9yT2NjdXJyZWQnKSxcbiAgICAgICAgICAgICAgICB0aGlzLmkxOG5TZXJ2aWNlLnQoJ25hbWVSZXF1aXJlZCcpKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBmb2xkZXIgPSBhd2FpdCB0aGlzLmZvbGRlclNlcnZpY2UuZW5jcnlwdCh0aGlzLmZvbGRlcik7XG4gICAgICAgICAgICB0aGlzLmZvcm1Qcm9taXNlID0gdGhpcy5mb2xkZXJTZXJ2aWNlLnNhdmVXaXRoU2VydmVyKGZvbGRlcik7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmZvcm1Qcm9taXNlO1xuICAgICAgICAgICAgdGhpcy5wbGF0Zm9ybVV0aWxzU2VydmljZS5zaG93VG9hc3QoJ3N1Y2Nlc3MnLCBudWxsLFxuICAgICAgICAgICAgICAgIHRoaXMuaTE4blNlcnZpY2UudCh0aGlzLmVkaXRNb2RlID8gJ2VkaXRlZEZvbGRlcicgOiAnYWRkZWRGb2xkZXInKSk7XG4gICAgICAgICAgICB0aGlzLm9uU2F2ZWRGb2xkZXIuZW1pdCh0aGlzLmZvbGRlcik7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5sb2dTZXJ2aWNlLmVycm9yKGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGFzeW5jIGRlbGV0ZSgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgY29uc3QgY29uZmlybWVkID0gYXdhaXQgdGhpcy5wbGF0Zm9ybVV0aWxzU2VydmljZS5zaG93RGlhbG9nKFxuICAgICAgICAgICAgdGhpcy5pMThuU2VydmljZS50KCdkZWxldGVGb2xkZXJDb25maXJtYXRpb24nKSwgdGhpcy5pMThuU2VydmljZS50KCdkZWxldGVGb2xkZXInKSxcbiAgICAgICAgICAgIHRoaXMuaTE4blNlcnZpY2UudCgneWVzJyksIHRoaXMuaTE4blNlcnZpY2UudCgnbm8nKSwgJ3dhcm5pbmcnKTtcbiAgICAgICAgaWYgKCFjb25maXJtZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLmRlbGV0ZVByb21pc2UgPSB0aGlzLmZvbGRlclNlcnZpY2UuZGVsZXRlV2l0aFNlcnZlcih0aGlzLmZvbGRlci5pZCk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmRlbGV0ZVByb21pc2U7XG4gICAgICAgICAgICB0aGlzLnBsYXRmb3JtVXRpbHNTZXJ2aWNlLnNob3dUb2FzdCgnc3VjY2VzcycsIG51bGwsIHRoaXMuaTE4blNlcnZpY2UudCgnZGVsZXRlZEZvbGRlcicpKTtcbiAgICAgICAgICAgIHRoaXMub25EZWxldGVkRm9sZGVyLmVtaXQodGhpcy5mb2xkZXIpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ1NlcnZpY2UuZXJyb3IoZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgYXN5bmMgaW5pdCgpIHtcbiAgICAgICAgdGhpcy5lZGl0TW9kZSA9IHRoaXMuZm9sZGVySWQgIT0gbnVsbDtcblxuICAgICAgICBpZiAodGhpcy5lZGl0TW9kZSkge1xuICAgICAgICAgICAgdGhpcy5lZGl0TW9kZSA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLnRpdGxlID0gdGhpcy5pMThuU2VydmljZS50KCdlZGl0Rm9sZGVyJyk7XG4gICAgICAgICAgICBjb25zdCBmb2xkZXIgPSBhd2FpdCB0aGlzLmZvbGRlclNlcnZpY2UuZ2V0KHRoaXMuZm9sZGVySWQpO1xuICAgICAgICAgICAgdGhpcy5mb2xkZXIgPSBhd2FpdCBmb2xkZXIuZGVjcnlwdCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy50aXRsZSA9IHRoaXMuaTE4blNlcnZpY2UudCgnYWRkRm9sZGVyJyk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQge1xuICAgIERpcmVjdGl2ZSxcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgSW5wdXQsXG4gICAgT3V0cHV0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgQ2lwaGVyVHlwZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9lbnVtcy9jaXBoZXJUeXBlJztcblxuaW1wb3J0IHsgQ29sbGVjdGlvblZpZXcgfSBmcm9tICdqc2xpYi1jb21tb24vbW9kZWxzL3ZpZXcvY29sbGVjdGlvblZpZXcnO1xuaW1wb3J0IHsgRm9sZGVyVmlldyB9IGZyb20gJ2pzbGliLWNvbW1vbi9tb2RlbHMvdmlldy9mb2xkZXJWaWV3JztcblxuaW1wb3J0IHsgVHJlZU5vZGUgfSBmcm9tICdqc2xpYi1jb21tb24vbW9kZWxzL2RvbWFpbi90cmVlTm9kZSc7XG5cbmltcG9ydCB7IENvbGxlY3Rpb25TZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9jb2xsZWN0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgRm9sZGVyU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvZm9sZGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgU3RvcmFnZVNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL3N0b3JhZ2Uuc2VydmljZSc7XG5pbXBvcnQgeyBVc2VyU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvdXNlci5zZXJ2aWNlJztcblxuaW1wb3J0IHsgQ29uc3RhbnRzU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9zZXJ2aWNlcy9jb25zdGFudHMuc2VydmljZSc7XG5cbkBEaXJlY3RpdmUoKVxuZXhwb3J0IGNsYXNzIEdyb3VwaW5nc0NvbXBvbmVudCB7XG4gICAgQElucHV0KCkgc2hvd0ZvbGRlcnMgPSB0cnVlO1xuICAgIEBJbnB1dCgpIHNob3dDb2xsZWN0aW9ucyA9IHRydWU7XG4gICAgQElucHV0KCkgc2hvd0Zhdm9yaXRlcyA9IHRydWU7XG4gICAgQElucHV0KCkgc2hvd1RyYXNoID0gdHJ1ZTtcblxuICAgIEBPdXRwdXQoKSBvbkFsbENsaWNrZWQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgQE91dHB1dCgpIG9uRmF2b3JpdGVzQ2xpY2tlZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICBAT3V0cHV0KCkgb25UcmFzaENsaWNrZWQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgQE91dHB1dCgpIG9uQ2lwaGVyVHlwZUNsaWNrZWQgPSBuZXcgRXZlbnRFbWl0dGVyPENpcGhlclR5cGU+KCk7XG4gICAgQE91dHB1dCgpIG9uRm9sZGVyQ2xpY2tlZCA9IG5ldyBFdmVudEVtaXR0ZXI8Rm9sZGVyVmlldz4oKTtcbiAgICBAT3V0cHV0KCkgb25BZGRGb2xkZXIgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgQE91dHB1dCgpIG9uRWRpdEZvbGRlciA9IG5ldyBFdmVudEVtaXR0ZXI8Rm9sZGVyVmlldz4oKTtcbiAgICBAT3V0cHV0KCkgb25Db2xsZWN0aW9uQ2xpY2tlZCA9IG5ldyBFdmVudEVtaXR0ZXI8Q29sbGVjdGlvblZpZXc+KCk7XG5cbiAgICBmb2xkZXJzOiBGb2xkZXJWaWV3W107XG4gICAgbmVzdGVkRm9sZGVyczogVHJlZU5vZGU8Rm9sZGVyVmlldz5bXTtcbiAgICBjb2xsZWN0aW9uczogQ29sbGVjdGlvblZpZXdbXTtcbiAgICBuZXN0ZWRDb2xsZWN0aW9uczogVHJlZU5vZGU8Q29sbGVjdGlvblZpZXc+W107XG4gICAgbG9hZGVkOiBib29sZWFuID0gZmFsc2U7XG4gICAgY2lwaGVyVHlwZSA9IENpcGhlclR5cGU7XG4gICAgc2VsZWN0ZWRBbGw6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBzZWxlY3RlZEZhdm9yaXRlczogYm9vbGVhbiA9IGZhbHNlO1xuICAgIHNlbGVjdGVkVHJhc2g6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBzZWxlY3RlZFR5cGU6IENpcGhlclR5cGUgPSBudWxsO1xuICAgIHNlbGVjdGVkRm9sZGVyOiBib29sZWFuID0gZmFsc2U7XG4gICAgc2VsZWN0ZWRGb2xkZXJJZDogc3RyaW5nID0gbnVsbDtcbiAgICBzZWxlY3RlZENvbGxlY3Rpb25JZDogc3RyaW5nID0gbnVsbDtcblxuICAgIHByaXZhdGUgY29sbGFwc2VkR3JvdXBpbmdzOiBTZXQ8c3RyaW5nPjtcbiAgICBwcml2YXRlIGNvbGxhcHNlZEdyb3VwaW5nc0tleTogc3RyaW5nO1xuXG4gICAgY29uc3RydWN0b3IocHJvdGVjdGVkIGNvbGxlY3Rpb25TZXJ2aWNlOiBDb2xsZWN0aW9uU2VydmljZSwgcHJvdGVjdGVkIGZvbGRlclNlcnZpY2U6IEZvbGRlclNlcnZpY2UsXG4gICAgICAgIHByb3RlY3RlZCBzdG9yYWdlU2VydmljZTogU3RvcmFnZVNlcnZpY2UsIHByb3RlY3RlZCB1c2VyU2VydmljZTogVXNlclNlcnZpY2UpIHsgfVxuXG4gICAgYXN5bmMgbG9hZChzZXRMb2FkZWQgPSB0cnVlKSB7XG4gICAgICAgIGNvbnN0IHVzZXJJZCA9IGF3YWl0IHRoaXMudXNlclNlcnZpY2UuZ2V0VXNlcklkKCk7XG4gICAgICAgIHRoaXMuY29sbGFwc2VkR3JvdXBpbmdzS2V5ID0gQ29uc3RhbnRzU2VydmljZS5jb2xsYXBzZWRHcm91cGluZ3NLZXkgKyAnXycgKyB1c2VySWQ7XG4gICAgICAgIGNvbnN0IGNvbGxhcHNlZEdyb3VwaW5ncyA9IGF3YWl0IHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0PHN0cmluZ1tdPih0aGlzLmNvbGxhcHNlZEdyb3VwaW5nc0tleSk7XG4gICAgICAgIGlmIChjb2xsYXBzZWRHcm91cGluZ3MgPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5jb2xsYXBzZWRHcm91cGluZ3MgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY29sbGFwc2VkR3JvdXBpbmdzID0gbmV3IFNldChjb2xsYXBzZWRHcm91cGluZ3MpO1xuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgdGhpcy5sb2FkRm9sZGVycygpO1xuICAgICAgICBhd2FpdCB0aGlzLmxvYWRDb2xsZWN0aW9ucygpO1xuXG4gICAgICAgIGlmIChzZXRMb2FkZWQpIHtcbiAgICAgICAgICAgIHRoaXMubG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIGxvYWRDb2xsZWN0aW9ucyhvcmdhbml6YXRpb25JZD86IHN0cmluZykge1xuICAgICAgICBpZiAoIXRoaXMuc2hvd0NvbGxlY3Rpb25zKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29sbGVjdGlvbnMgPSBhd2FpdCB0aGlzLmNvbGxlY3Rpb25TZXJ2aWNlLmdldEFsbERlY3J5cHRlZCgpO1xuICAgICAgICBpZiAob3JnYW5pemF0aW9uSWQgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5jb2xsZWN0aW9ucyA9IGNvbGxlY3Rpb25zLmZpbHRlcihjID0+IGMub3JnYW5pemF0aW9uSWQgPT09IG9yZ2FuaXphdGlvbklkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY29sbGVjdGlvbnMgPSBjb2xsZWN0aW9ucztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm5lc3RlZENvbGxlY3Rpb25zID0gYXdhaXQgdGhpcy5jb2xsZWN0aW9uU2VydmljZS5nZXRBbGxOZXN0ZWQodGhpcy5jb2xsZWN0aW9ucyk7XG4gICAgfVxuXG4gICAgYXN5bmMgbG9hZEZvbGRlcnMoKSB7XG4gICAgICAgIGlmICghdGhpcy5zaG93Rm9sZGVycykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZm9sZGVycyA9IGF3YWl0IHRoaXMuZm9sZGVyU2VydmljZS5nZXRBbGxEZWNyeXB0ZWQoKTtcbiAgICAgICAgdGhpcy5uZXN0ZWRGb2xkZXJzID0gYXdhaXQgdGhpcy5mb2xkZXJTZXJ2aWNlLmdldEFsbE5lc3RlZCgpO1xuICAgIH1cblxuICAgIHNlbGVjdEFsbCgpIHtcbiAgICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbnMoKTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZEFsbCA9IHRydWU7XG4gICAgICAgIHRoaXMub25BbGxDbGlja2VkLmVtaXQoKTtcbiAgICB9XG5cbiAgICBzZWxlY3RGYXZvcml0ZXMoKSB7XG4gICAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb25zKCk7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRGYXZvcml0ZXMgPSB0cnVlO1xuICAgICAgICB0aGlzLm9uRmF2b3JpdGVzQ2xpY2tlZC5lbWl0KCk7XG4gICAgfVxuXG4gICAgc2VsZWN0VHJhc2goKSB7XG4gICAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb25zKCk7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRUcmFzaCA9IHRydWU7XG4gICAgICAgIHRoaXMub25UcmFzaENsaWNrZWQuZW1pdCgpO1xuICAgIH1cblxuICAgIHNlbGVjdFR5cGUodHlwZTogQ2lwaGVyVHlwZSkge1xuICAgICAgICB0aGlzLmNsZWFyU2VsZWN0aW9ucygpO1xuICAgICAgICB0aGlzLnNlbGVjdGVkVHlwZSA9IHR5cGU7XG4gICAgICAgIHRoaXMub25DaXBoZXJUeXBlQ2xpY2tlZC5lbWl0KHR5cGUpO1xuICAgIH1cblxuICAgIHNlbGVjdEZvbGRlcihmb2xkZXI6IEZvbGRlclZpZXcpIHtcbiAgICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbnMoKTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZEZvbGRlciA9IHRydWU7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRGb2xkZXJJZCA9IGZvbGRlci5pZDtcbiAgICAgICAgdGhpcy5vbkZvbGRlckNsaWNrZWQuZW1pdChmb2xkZXIpO1xuICAgIH1cblxuICAgIGFkZEZvbGRlcigpIHtcbiAgICAgICAgdGhpcy5vbkFkZEZvbGRlci5lbWl0KCk7XG4gICAgfVxuXG4gICAgZWRpdEZvbGRlcihmb2xkZXI6IEZvbGRlclZpZXcpIHtcbiAgICAgICAgdGhpcy5vbkVkaXRGb2xkZXIuZW1pdChmb2xkZXIpO1xuICAgIH1cblxuICAgIHNlbGVjdENvbGxlY3Rpb24oY29sbGVjdGlvbjogQ29sbGVjdGlvblZpZXcpIHtcbiAgICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbnMoKTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZENvbGxlY3Rpb25JZCA9IGNvbGxlY3Rpb24uaWQ7XG4gICAgICAgIHRoaXMub25Db2xsZWN0aW9uQ2xpY2tlZC5lbWl0KGNvbGxlY3Rpb24pO1xuICAgIH1cblxuICAgIGNsZWFyU2VsZWN0aW9ucygpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZEFsbCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNlbGVjdGVkRmF2b3JpdGVzID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRUcmFzaCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNlbGVjdGVkVHlwZSA9IG51bGw7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRGb2xkZXIgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZEZvbGRlcklkID0gbnVsbDtcbiAgICAgICAgdGhpcy5zZWxlY3RlZENvbGxlY3Rpb25JZCA9IG51bGw7XG4gICAgfVxuXG4gICAgY29sbGFwc2UoZ3JvdXBpbmc6IEZvbGRlclZpZXcgfCBDb2xsZWN0aW9uVmlldywgaWRQcmVmaXggPSAnJykge1xuICAgICAgICBpZiAoZ3JvdXBpbmcuaWQgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGlkID0gaWRQcmVmaXggKyBncm91cGluZy5pZDtcbiAgICAgICAgaWYgKHRoaXMuaXNDb2xsYXBzZWQoZ3JvdXBpbmcsIGlkUHJlZml4KSkge1xuICAgICAgICAgICAgdGhpcy5jb2xsYXBzZWRHcm91cGluZ3MuZGVsZXRlKGlkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY29sbGFwc2VkR3JvdXBpbmdzLmFkZChpZCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zdG9yYWdlU2VydmljZS5zYXZlKHRoaXMuY29sbGFwc2VkR3JvdXBpbmdzS2V5LCB0aGlzLmNvbGxhcHNlZEdyb3VwaW5ncyk7XG4gICAgfVxuXG4gICAgaXNDb2xsYXBzZWQoZ3JvdXBpbmc6IEZvbGRlclZpZXcgfCBDb2xsZWN0aW9uVmlldywgaWRQcmVmaXggPSAnJykge1xuICAgICAgICByZXR1cm4gdGhpcy5jb2xsYXBzZWRHcm91cGluZ3MuaGFzKGlkUHJlZml4ICsgZ3JvdXBpbmcuaWQpO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5cbmltcG9ydCB7IFBhc3N3b3JkSGludFJlcXVlc3QgfSBmcm9tICdqc2xpYi1jb21tb24vbW9kZWxzL3JlcXVlc3QvcGFzc3dvcmRIaW50UmVxdWVzdCc7XG5cbmltcG9ydCB7IEFwaVNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL2FwaS5zZXJ2aWNlJztcbmltcG9ydCB7IEkxOG5TZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9pMThuLnNlcnZpY2UnO1xuaW1wb3J0IHsgTG9nU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvbG9nLnNlcnZpY2UnO1xuaW1wb3J0IHsgUGxhdGZvcm1VdGlsc1NlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL3BsYXRmb3JtVXRpbHMuc2VydmljZSc7XG5cbmV4cG9ydCBjbGFzcyBIaW50Q29tcG9uZW50IHtcbiAgICBlbWFpbDogc3RyaW5nID0gJyc7XG4gICAgZm9ybVByb21pc2U6IFByb21pc2U8YW55PjtcblxuICAgIHByb3RlY3RlZCBzdWNjZXNzUm91dGUgPSAnbG9naW4nO1xuICAgIHByb3RlY3RlZCBvblN1Y2Nlc3NmdWxTdWJtaXQ6ICgpID0+IHZvaWQ7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgcm91dGVyOiBSb3V0ZXIsIHByb3RlY3RlZCBpMThuU2VydmljZTogSTE4blNlcnZpY2UsXG4gICAgICAgIHByb3RlY3RlZCBhcGlTZXJ2aWNlOiBBcGlTZXJ2aWNlLCBwcm90ZWN0ZWQgcGxhdGZvcm1VdGlsc1NlcnZpY2U6IFBsYXRmb3JtVXRpbHNTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGxvZ1NlcnZpY2U6IExvZ1NlcnZpY2UpIHsgfVxuXG4gICAgYXN5bmMgc3VibWl0KCkge1xuICAgICAgICBpZiAodGhpcy5lbWFpbCA9PSBudWxsIHx8IHRoaXMuZW1haWwgPT09ICcnKSB7XG4gICAgICAgICAgICB0aGlzLnBsYXRmb3JtVXRpbHNTZXJ2aWNlLnNob3dUb2FzdCgnZXJyb3InLCB0aGlzLmkxOG5TZXJ2aWNlLnQoJ2Vycm9yT2NjdXJyZWQnKSxcbiAgICAgICAgICAgICAgICB0aGlzLmkxOG5TZXJ2aWNlLnQoJ2VtYWlsUmVxdWlyZWQnKSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZW1haWwuaW5kZXhPZignQCcpID09PSAtMSkge1xuICAgICAgICAgICAgdGhpcy5wbGF0Zm9ybVV0aWxzU2VydmljZS5zaG93VG9hc3QoJ2Vycm9yJywgdGhpcy5pMThuU2VydmljZS50KCdlcnJvck9jY3VycmVkJyksXG4gICAgICAgICAgICAgICAgdGhpcy5pMThuU2VydmljZS50KCdpbnZhbGlkRW1haWwnKSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5mb3JtUHJvbWlzZSA9IHRoaXMuYXBpU2VydmljZS5wb3N0UGFzc3dvcmRIaW50KG5ldyBQYXNzd29yZEhpbnRSZXF1ZXN0KHRoaXMuZW1haWwpKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZm9ybVByb21pc2U7XG4gICAgICAgICAgICB0aGlzLnBsYXRmb3JtVXRpbHNTZXJ2aWNlLnNob3dUb2FzdCgnc3VjY2VzcycsIG51bGwsIHRoaXMuaTE4blNlcnZpY2UudCgnbWFzdGVyUGFzc1NlbnQnKSk7XG4gICAgICAgICAgICBpZiAodGhpcy5vblN1Y2Nlc3NmdWxTdWJtaXQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMub25TdWNjZXNzZnVsU3VibWl0KCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMucm91dGVyICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbdGhpcy5zdWNjZXNzUm91dGVdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5sb2dTZXJ2aWNlLmVycm9yKGUpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiaW1wb3J0IHtcbiAgICBDb21wb25lbnQsXG4gICAgSW5wdXQsXG4gICAgT25DaGFuZ2VzLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgQ2lwaGVyVHlwZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9lbnVtcy9jaXBoZXJUeXBlJztcblxuaW1wb3J0IHsgQ2lwaGVyVmlldyB9IGZyb20gJ2pzbGliLWNvbW1vbi9tb2RlbHMvdmlldy9jaXBoZXJWaWV3JztcblxuaW1wb3J0IHsgRW52aXJvbm1lbnRTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9lbnZpcm9ubWVudC5zZXJ2aWNlJztcbmltcG9ydCB7IFN0YXRlU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvc3RhdGUuc2VydmljZSc7XG5cbmltcG9ydCB7IENvbnN0YW50c1NlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vc2VydmljZXMvY29uc3RhbnRzLnNlcnZpY2UnO1xuXG5pbXBvcnQgeyBVdGlscyB9IGZyb20gJ2pzbGliLWNvbW1vbi9taXNjL3V0aWxzJztcblxuY29uc3QgSWNvbk1hcDogYW55ID0ge1xuICAgICdmYS1nbG9iZSc6IFN0cmluZy5mcm9tQ2hhckNvZGUoMHhmMGFjKSxcbiAgICAnZmEtc3RpY2t5LW5vdGUtbyc6IFN0cmluZy5mcm9tQ2hhckNvZGUoMHhmMjRhKSxcbiAgICAnZmEtaWQtY2FyZC1vJzogU3RyaW5nLmZyb21DaGFyQ29kZSgweGYyYzMpLFxuICAgICdmYS1jcmVkaXQtY2FyZCc6IFN0cmluZy5mcm9tQ2hhckNvZGUoMHhmMDlkKSxcbiAgICAnZmEtYW5kcm9pZCc6IFN0cmluZy5mcm9tQ2hhckNvZGUoMHhmMTdiKSxcbiAgICAnZmEtYXBwbGUnOiBTdHJpbmcuZnJvbUNoYXJDb2RlKDB4ZjE3OSksXG59O1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2FwcC12YXVsdC1pY29uJyxcbiAgICB0ZW1wbGF0ZVVybDogJ2ljb24uY29tcG9uZW50Lmh0bWwnLFxufSlcbmV4cG9ydCBjbGFzcyBJY29uQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzIHtcbiAgICBASW5wdXQoKSBjaXBoZXI6IENpcGhlclZpZXc7XG4gICAgaWNvbjogc3RyaW5nO1xuICAgIGltYWdlOiBzdHJpbmc7XG4gICAgZmFsbGJhY2tJbWFnZTogc3RyaW5nO1xuICAgIGltYWdlRW5hYmxlZDogYm9vbGVhbjtcblxuICAgIHByaXZhdGUgaWNvbnNVcmw6IHN0cmluZztcblxuICAgIGNvbnN0cnVjdG9yKGVudmlyb25tZW50U2VydmljZTogRW52aXJvbm1lbnRTZXJ2aWNlLCBwcm90ZWN0ZWQgc3RhdGVTZXJ2aWNlOiBTdGF0ZVNlcnZpY2UpIHtcbiAgICAgICAgdGhpcy5pY29uc1VybCA9IGVudmlyb25tZW50U2VydmljZS5nZXRJY29uc1VybCgpO1xuICAgIH1cblxuICAgIGFzeW5jIG5nT25DaGFuZ2VzKCkge1xuICAgICAgICAvLyBDb21wb25lbnRzIG1heSBiZSByZS11c2VkIHdoZW4gdXNpbmcgY2RrLXZpcnR1YWwtc2Nyb2xsLiBXaGljaCBwdXRzIHRoZSBjb21wb25lbnQgaW4gYSB3ZWlyZCBzdGF0ZSxcbiAgICAgICAgLy8gdG8gYXZvaWQgdGhpcyB3ZSByZXNldCBhbGwgc3RhdGUgdmFyaWFibGVzLlxuICAgICAgICB0aGlzLmltYWdlID0gbnVsbDtcbiAgICAgICAgdGhpcy5mYWxsYmFja0ltYWdlID0gbnVsbDtcbiAgICAgICAgdGhpcy5pbWFnZUVuYWJsZWQgPSAhKGF3YWl0IHRoaXMuc3RhdGVTZXJ2aWNlLmdldDxib29sZWFuPihDb25zdGFudHNTZXJ2aWNlLmRpc2FibGVGYXZpY29uS2V5KSk7XG4gICAgICAgIHRoaXMubG9hZCgpO1xuICAgIH1cblxuICAgIGdldCBpY29uQ29kZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gSWNvbk1hcFt0aGlzLmljb25dO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBsb2FkKCkge1xuICAgICAgICBzd2l0Y2ggKHRoaXMuY2lwaGVyLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgQ2lwaGVyVHlwZS5Mb2dpbjpcbiAgICAgICAgICAgICAgICB0aGlzLmljb24gPSAnZmEtZ2xvYmUnO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0TG9naW5JY29uKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIENpcGhlclR5cGUuU2VjdXJlTm90ZTpcbiAgICAgICAgICAgICAgICB0aGlzLmljb24gPSAnZmEtc3RpY2t5LW5vdGUtbyc7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIENpcGhlclR5cGUuQ2FyZDpcbiAgICAgICAgICAgICAgICB0aGlzLmljb24gPSAnZmEtY3JlZGl0LWNhcmQnO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBDaXBoZXJUeXBlLklkZW50aXR5OlxuICAgICAgICAgICAgICAgIHRoaXMuaWNvbiA9ICdmYS1pZC1jYXJkLW8nO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc2V0TG9naW5JY29uKCkge1xuICAgICAgICBpZiAodGhpcy5jaXBoZXIubG9naW4udXJpKSB7XG4gICAgICAgICAgICBsZXQgaG9zdG5hbWVVcmkgPSB0aGlzLmNpcGhlci5sb2dpbi51cmk7XG4gICAgICAgICAgICBsZXQgaXNXZWJzaXRlID0gZmFsc2U7XG5cbiAgICAgICAgICAgIGlmIChob3N0bmFtZVVyaS5pbmRleE9mKCdhbmRyb2lkYXBwOi8vJykgPT09IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmljb24gPSAnZmEtYW5kcm9pZCc7XG4gICAgICAgICAgICAgICAgdGhpcy5pbWFnZSA9IG51bGw7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvc3RuYW1lVXJpLmluZGV4T2YoJ2lvc2FwcDovLycpID09PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pY29uID0gJ2ZhLWFwcGxlJztcbiAgICAgICAgICAgICAgICB0aGlzLmltYWdlID0gbnVsbDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5pbWFnZUVuYWJsZWQgJiYgaG9zdG5hbWVVcmkuaW5kZXhPZignOi8vJykgPT09IC0xICYmIGhvc3RuYW1lVXJpLmluZGV4T2YoJy4nKSA+IC0xKSB7XG4gICAgICAgICAgICAgICAgaG9zdG5hbWVVcmkgPSAnaHR0cDovLycgKyBob3N0bmFtZVVyaTtcbiAgICAgICAgICAgICAgICBpc1dlYnNpdGUgPSB0cnVlO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmltYWdlRW5hYmxlZCkge1xuICAgICAgICAgICAgICAgIGlzV2Vic2l0ZSA9IGhvc3RuYW1lVXJpLmluZGV4T2YoJ2h0dHAnKSA9PT0gMCAmJiBob3N0bmFtZVVyaS5pbmRleE9mKCcuJykgPiAtMTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuaW1hZ2VFbmFibGVkICYmIGlzV2Vic2l0ZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW1hZ2UgPSB0aGlzLmljb25zVXJsICsgJy8nICsgVXRpbHMuZ2V0SG9zdG5hbWUoaG9zdG5hbWVVcmkpICsgJy9pY29uLnBuZyc7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmFsbGJhY2tJbWFnZSA9ICdpbWFnZXMvZmEtZ2xvYmUucG5nJztcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZSBlcnJvciBzaW5jZSB0aGUgZmFsbGJhY2sgaWNvbiB3aWxsIGJlIHNob3duIGlmIGltYWdlIGlzIG51bGwuXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5pbWFnZSA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiaWNvblwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgIDxpbWcgW3NyY109XCJpbWFnZVwiIGFwcEZhbGxiYWNrU3JjPVwie3tmYWxsYmFja0ltYWdlfX1cIiAqbmdJZj1cImltYWdlRW5hYmxlZCAmJiBpbWFnZVwiIGFsdD1cIlwiIC8+XG4gICAgPGkgY2xhc3M9XCJmYSBmYS1mdyBmYS1sZyB7e2ljb259fVwiICpuZ0lmPVwiIWltYWdlRW5hYmxlZCB8fCAhaW1hZ2VcIj48L2k+XG48L2Rpdj5cbiIsImltcG9ydCB7IERpcmVjdGl2ZSwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuXG5pbXBvcnQgeyBBcGlTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9hcGkuc2VydmljZSc7XG5pbXBvcnQgeyBDcnlwdG9TZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9jcnlwdG8uc2VydmljZSc7XG5pbXBvcnQgeyBFbnZpcm9ubWVudFNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL2Vudmlyb25tZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgSTE4blNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL2kxOG4uc2VydmljZSc7XG5pbXBvcnQgeyBMb2dTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9sb2cuc2VydmljZSc7XG5pbXBvcnQgeyBNZXNzYWdpbmdTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9tZXNzYWdpbmcuc2VydmljZSc7XG5pbXBvcnQgeyBQbGF0Zm9ybVV0aWxzU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvcGxhdGZvcm1VdGlscy5zZXJ2aWNlJztcbmltcG9ydCB7IFN0YXRlU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvc3RhdGUuc2VydmljZSc7XG5pbXBvcnQgeyBTdG9yYWdlU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvc3RvcmFnZS5zZXJ2aWNlJztcbmltcG9ydCB7IFVzZXJTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy91c2VyLnNlcnZpY2UnO1xuaW1wb3J0IHsgVmF1bHRUaW1lb3V0U2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvdmF1bHRUaW1lb3V0LnNlcnZpY2UnO1xuXG5pbXBvcnQgeyBDb25zdGFudHNTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL3NlcnZpY2VzL2NvbnN0YW50cy5zZXJ2aWNlJztcblxuaW1wb3J0IHsgRW5jU3RyaW5nIH0gZnJvbSAnanNsaWItY29tbW9uL21vZGVscy9kb21haW4vZW5jU3RyaW5nJztcbmltcG9ydCB7IFN5bW1ldHJpY0NyeXB0b0tleSB9IGZyb20gJ2pzbGliLWNvbW1vbi9tb2RlbHMvZG9tYWluL3N5bW1ldHJpY0NyeXB0b0tleSc7XG5cbmltcG9ydCB7IFBhc3N3b3JkVmVyaWZpY2F0aW9uUmVxdWVzdCB9IGZyb20gJ2pzbGliLWNvbW1vbi9tb2RlbHMvcmVxdWVzdC9wYXNzd29yZFZlcmlmaWNhdGlvblJlcXVlc3QnO1xuXG5pbXBvcnQgeyBVdGlscyB9IGZyb20gJ2pzbGliLWNvbW1vbi9taXNjL3V0aWxzJztcblxuaW1wb3J0IHsgSGFzaFB1cnBvc2UgfSBmcm9tICdqc2xpYi1jb21tb24vZW51bXMvaGFzaFB1cnBvc2UnO1xuXG5ARGlyZWN0aXZlKClcbmV4cG9ydCBjbGFzcyBMb2NrQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgICBtYXN0ZXJQYXNzd29yZDogc3RyaW5nID0gJyc7XG4gICAgcGluOiBzdHJpbmcgPSAnJztcbiAgICBzaG93UGFzc3dvcmQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBlbWFpbDogc3RyaW5nO1xuICAgIHBpbkxvY2s6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICB3ZWJWYXVsdEhvc3RuYW1lOiBzdHJpbmcgPSAnJztcbiAgICBmb3JtUHJvbWlzZTogUHJvbWlzZTxhbnk+O1xuICAgIHN1cHBvcnRzQmlvbWV0cmljOiBib29sZWFuO1xuICAgIGJpb21ldHJpY0xvY2s6IGJvb2xlYW47XG4gICAgYmlvbWV0cmljVGV4dDogc3RyaW5nO1xuXG4gICAgcHJvdGVjdGVkIHN1Y2Nlc3NSb3V0ZTogc3RyaW5nID0gJ3ZhdWx0JztcbiAgICBwcm90ZWN0ZWQgb25TdWNjZXNzZnVsU3VibWl0OiAoKSA9PiB2b2lkO1xuXG4gICAgcHJpdmF0ZSBpbnZhbGlkUGluQXR0ZW1wdHMgPSAwO1xuICAgIHByaXZhdGUgcGluU2V0OiBbYm9vbGVhbiwgYm9vbGVhbl07XG5cbiAgICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgcm91dGVyOiBSb3V0ZXIsIHByb3RlY3RlZCBpMThuU2VydmljZTogSTE4blNlcnZpY2UsXG4gICAgICAgIHByb3RlY3RlZCBwbGF0Zm9ybVV0aWxzU2VydmljZTogUGxhdGZvcm1VdGlsc1NlcnZpY2UsIHByb3RlY3RlZCBtZXNzYWdpbmdTZXJ2aWNlOiBNZXNzYWdpbmdTZXJ2aWNlLFxuICAgICAgICBwcm90ZWN0ZWQgdXNlclNlcnZpY2U6IFVzZXJTZXJ2aWNlLCBwcm90ZWN0ZWQgY3J5cHRvU2VydmljZTogQ3J5cHRvU2VydmljZSxcbiAgICAgICAgcHJvdGVjdGVkIHN0b3JhZ2VTZXJ2aWNlOiBTdG9yYWdlU2VydmljZSwgcHJvdGVjdGVkIHZhdWx0VGltZW91dFNlcnZpY2U6IFZhdWx0VGltZW91dFNlcnZpY2UsXG4gICAgICAgIHByb3RlY3RlZCBlbnZpcm9ubWVudFNlcnZpY2U6IEVudmlyb25tZW50U2VydmljZSwgcHJvdGVjdGVkIHN0YXRlU2VydmljZTogU3RhdGVTZXJ2aWNlLFxuICAgICAgICBwcm90ZWN0ZWQgYXBpU2VydmljZTogQXBpU2VydmljZSwgcHJpdmF0ZSBsb2dTZXJ2aWNlOiBMb2dTZXJ2aWNlKSB7IH1cblxuICAgIGFzeW5jIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLnBpblNldCA9IGF3YWl0IHRoaXMudmF1bHRUaW1lb3V0U2VydmljZS5pc1BpbkxvY2tTZXQoKTtcbiAgICAgICAgdGhpcy5waW5Mb2NrID0gKHRoaXMucGluU2V0WzBdICYmIHRoaXMudmF1bHRUaW1lb3V0U2VydmljZS5waW5Qcm90ZWN0ZWRLZXkgIT0gbnVsbCkgfHwgdGhpcy5waW5TZXRbMV07XG4gICAgICAgIHRoaXMuc3VwcG9ydHNCaW9tZXRyaWMgPSBhd2FpdCB0aGlzLnBsYXRmb3JtVXRpbHNTZXJ2aWNlLnN1cHBvcnRzQmlvbWV0cmljKCk7XG4gICAgICAgIHRoaXMuYmlvbWV0cmljTG9jayA9IGF3YWl0IHRoaXMudmF1bHRUaW1lb3V0U2VydmljZS5pc0Jpb21ldHJpY0xvY2tTZXQoKSAmJlxuICAgICAgICAgICAgKGF3YWl0IHRoaXMuY3J5cHRvU2VydmljZS5oYXNLZXlTdG9yZWQoJ2Jpb21ldHJpYycpIHx8ICF0aGlzLnBsYXRmb3JtVXRpbHNTZXJ2aWNlLnN1cHBvcnRzU2VjdXJlU3RvcmFnZSgpKTtcbiAgICAgICAgdGhpcy5iaW9tZXRyaWNUZXh0ID0gYXdhaXQgdGhpcy5zdG9yYWdlU2VydmljZS5nZXQoQ29uc3RhbnRzU2VydmljZS5iaW9tZXRyaWNUZXh0KTtcbiAgICAgICAgdGhpcy5lbWFpbCA9IGF3YWl0IHRoaXMudXNlclNlcnZpY2UuZ2V0RW1haWwoKTtcblxuICAgICAgICBjb25zdCB3ZWJWYXVsdFVybCA9IHRoaXMuZW52aXJvbm1lbnRTZXJ2aWNlLmdldFdlYlZhdWx0VXJsKCk7XG4gICAgICAgIGNvbnN0IHZhdWx0VXJsID0gd2ViVmF1bHRVcmwgPT09ICdodHRwczovL3ZhdWx0LmJpdHdhcmRlbi5jb20nID8gJ2h0dHBzOi8vYml0d2FyZGVuLmNvbScgOiB3ZWJWYXVsdFVybDtcbiAgICAgICAgdGhpcy53ZWJWYXVsdEhvc3RuYW1lID0gVXRpbHMuZ2V0SG9zdG5hbWUodmF1bHRVcmwpO1xuICAgIH1cblxuICAgIGFzeW5jIHN1Ym1pdCgpIHtcbiAgICAgICAgaWYgKHRoaXMucGluTG9jayAmJiAodGhpcy5waW4gPT0gbnVsbCB8fCB0aGlzLnBpbiA9PT0gJycpKSB7XG4gICAgICAgICAgICB0aGlzLnBsYXRmb3JtVXRpbHNTZXJ2aWNlLnNob3dUb2FzdCgnZXJyb3InLCB0aGlzLmkxOG5TZXJ2aWNlLnQoJ2Vycm9yT2NjdXJyZWQnKSxcbiAgICAgICAgICAgICAgICB0aGlzLmkxOG5TZXJ2aWNlLnQoJ3BpblJlcXVpcmVkJykpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5waW5Mb2NrICYmICh0aGlzLm1hc3RlclBhc3N3b3JkID09IG51bGwgfHwgdGhpcy5tYXN0ZXJQYXNzd29yZCA9PT0gJycpKSB7XG4gICAgICAgICAgICB0aGlzLnBsYXRmb3JtVXRpbHNTZXJ2aWNlLnNob3dUb2FzdCgnZXJyb3InLCB0aGlzLmkxOG5TZXJ2aWNlLnQoJ2Vycm9yT2NjdXJyZWQnKSxcbiAgICAgICAgICAgICAgICB0aGlzLmkxOG5TZXJ2aWNlLnQoJ21hc3RlclBhc3NSZXF1aXJlZCcpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGtkZiA9IGF3YWl0IHRoaXMudXNlclNlcnZpY2UuZ2V0S2RmKCk7XG4gICAgICAgIGNvbnN0IGtkZkl0ZXJhdGlvbnMgPSBhd2FpdCB0aGlzLnVzZXJTZXJ2aWNlLmdldEtkZkl0ZXJhdGlvbnMoKTtcblxuICAgICAgICBpZiAodGhpcy5waW5Mb2NrKSB7XG4gICAgICAgICAgICBsZXQgZmFpbGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucGluU2V0WzBdKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IGF3YWl0IHRoaXMuY3J5cHRvU2VydmljZS5tYWtlS2V5RnJvbVBpbih0aGlzLnBpbiwgdGhpcy5lbWFpbCwga2RmLCBrZGZJdGVyYXRpb25zLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52YXVsdFRpbWVvdXRTZXJ2aWNlLnBpblByb3RlY3RlZEtleSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuY0tleSA9IGF3YWl0IHRoaXMuY3J5cHRvU2VydmljZS5nZXRFbmNLZXkoa2V5KTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvdGVjdGVkUGluID0gYXdhaXQgdGhpcy5zdG9yYWdlU2VydmljZS5nZXQ8c3RyaW5nPihDb25zdGFudHNTZXJ2aWNlLnByb3RlY3RlZFBpbik7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlY1BpbiA9IGF3YWl0IHRoaXMuY3J5cHRvU2VydmljZS5kZWNyeXB0VG9VdGY4KG5ldyBFbmNTdHJpbmcocHJvdGVjdGVkUGluKSwgZW5jS2V5KTtcbiAgICAgICAgICAgICAgICAgICAgZmFpbGVkID0gZGVjUGluICE9PSB0aGlzLnBpbjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFmYWlsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0S2V5QW5kQ29udGludWUoa2V5KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IGF3YWl0IHRoaXMuY3J5cHRvU2VydmljZS5tYWtlS2V5RnJvbVBpbih0aGlzLnBpbiwgdGhpcy5lbWFpbCwga2RmLCBrZGZJdGVyYXRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgZmFpbGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0S2V5QW5kQ29udGludWUoa2V5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICBmYWlsZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZmFpbGVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbnZhbGlkUGluQXR0ZW1wdHMrKztcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pbnZhbGlkUGluQXR0ZW1wdHMgPj0gNSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2luZ1NlcnZpY2Uuc2VuZCgnbG9nb3V0Jyk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5wbGF0Zm9ybVV0aWxzU2VydmljZS5zaG93VG9hc3QoJ2Vycm9yJywgdGhpcy5pMThuU2VydmljZS50KCdlcnJvck9jY3VycmVkJyksXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaTE4blNlcnZpY2UudCgnaW52YWxpZFBpbicpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IGF3YWl0IHRoaXMuY3J5cHRvU2VydmljZS5tYWtlS2V5KHRoaXMubWFzdGVyUGFzc3dvcmQsIHRoaXMuZW1haWwsIGtkZiwga2RmSXRlcmF0aW9ucyk7XG4gICAgICAgICAgICBjb25zdCBzdG9yZWRLZXlIYXNoID0gYXdhaXQgdGhpcy5jcnlwdG9TZXJ2aWNlLmdldEtleUhhc2goKTtcblxuICAgICAgICAgICAgbGV0IHBhc3N3b3JkVmFsaWQgPSBmYWxzZTtcblxuICAgICAgICAgICAgaWYgKHN0b3JlZEtleUhhc2ggIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHBhc3N3b3JkVmFsaWQgPSBhd2FpdCB0aGlzLmNyeXB0b1NlcnZpY2UuY29tcGFyZUFuZFVwZGF0ZUtleUhhc2godGhpcy5tYXN0ZXJQYXNzd29yZCwga2V5KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVxdWVzdCA9IG5ldyBQYXNzd29yZFZlcmlmaWNhdGlvblJlcXVlc3QoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBzZXJ2ZXJLZXlIYXNoID0gYXdhaXQgdGhpcy5jcnlwdG9TZXJ2aWNlLmhhc2hQYXNzd29yZCh0aGlzLm1hc3RlclBhc3N3b3JkLCBrZXksXG4gICAgICAgICAgICAgICAgICAgIEhhc2hQdXJwb3NlLlNlcnZlckF1dGhvcml6YXRpb24pO1xuICAgICAgICAgICAgICAgIHJlcXVlc3QubWFzdGVyUGFzc3dvcmRIYXNoID0gc2VydmVyS2V5SGFzaDtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcm1Qcm9taXNlID0gdGhpcy5hcGlTZXJ2aWNlLnBvc3RBY2NvdW50VmVyaWZ5UGFzc3dvcmQocmVxdWVzdCk7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZm9ybVByb21pc2U7XG4gICAgICAgICAgICAgICAgICAgIHBhc3N3b3JkVmFsaWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBsb2NhbEtleUhhc2ggPSBhd2FpdCB0aGlzLmNyeXB0b1NlcnZpY2UuaGFzaFBhc3N3b3JkKHRoaXMubWFzdGVyUGFzc3dvcmQsIGtleSxcbiAgICAgICAgICAgICAgICAgICAgICAgIEhhc2hQdXJwb3NlLkxvY2FsQXV0aG9yaXphdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuY3J5cHRvU2VydmljZS5zZXRLZXlIYXNoKGxvY2FsS2V5SGFzaCk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ1NlcnZpY2UuZXJyb3IoZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocGFzc3dvcmRWYWxpZCkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnBpblNldFswXSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwcm90ZWN0ZWRQaW4gPSBhd2FpdCB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldDxzdHJpbmc+KENvbnN0YW50c1NlcnZpY2UucHJvdGVjdGVkUGluKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZW5jS2V5ID0gYXdhaXQgdGhpcy5jcnlwdG9TZXJ2aWNlLmdldEVuY0tleShrZXkpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZWNQaW4gPSBhd2FpdCB0aGlzLmNyeXB0b1NlcnZpY2UuZGVjcnlwdFRvVXRmOChuZXcgRW5jU3RyaW5nKHByb3RlY3RlZFBpbiksIGVuY0tleSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBpbktleSA9IGF3YWl0IHRoaXMuY3J5cHRvU2VydmljZS5tYWtlUGluS2V5KGRlY1BpbiwgdGhpcy5lbWFpbCwga2RmLCBrZGZJdGVyYXRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52YXVsdFRpbWVvdXRTZXJ2aWNlLnBpblByb3RlY3RlZEtleSA9IGF3YWl0IHRoaXMuY3J5cHRvU2VydmljZS5lbmNyeXB0KGtleS5rZXksIHBpbktleSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuc2V0S2V5QW5kQ29udGludWUoa2V5KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wbGF0Zm9ybVV0aWxzU2VydmljZS5zaG93VG9hc3QoJ2Vycm9yJywgdGhpcy5pMThuU2VydmljZS50KCdlcnJvck9jY3VycmVkJyksXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaTE4blNlcnZpY2UudCgnaW52YWxpZE1hc3RlclBhc3N3b3JkJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgbG9nT3V0KCkge1xuICAgICAgICBjb25zdCBjb25maXJtZWQgPSBhd2FpdCB0aGlzLnBsYXRmb3JtVXRpbHNTZXJ2aWNlLnNob3dEaWFsb2codGhpcy5pMThuU2VydmljZS50KCdsb2dPdXRDb25maXJtYXRpb24nKSxcbiAgICAgICAgICAgIHRoaXMuaTE4blNlcnZpY2UudCgnbG9nT3V0JyksIHRoaXMuaTE4blNlcnZpY2UudCgnbG9nT3V0JyksIHRoaXMuaTE4blNlcnZpY2UudCgnY2FuY2VsJykpO1xuICAgICAgICBpZiAoY29uZmlybWVkKSB7XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2luZ1NlcnZpY2Uuc2VuZCgnbG9nb3V0Jyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyB1bmxvY2tCaW9tZXRyaWMoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGlmICghdGhpcy5iaW9tZXRyaWNMb2NrKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzdWNjZXNzID0gKGF3YWl0IHRoaXMuY3J5cHRvU2VydmljZS5nZXRLZXkoJ2Jpb21ldHJpYycpKSAhPSBudWxsO1xuXG4gICAgICAgIGlmIChzdWNjZXNzKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmRvQ29udGludWUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzdWNjZXNzO1xuICAgIH1cblxuICAgIHRvZ2dsZVBhc3N3b3JkKCkge1xuICAgICAgICB0aGlzLnNob3dQYXNzd29yZCA9ICF0aGlzLnNob3dQYXNzd29yZDtcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5waW5Mb2NrID8gJ3BpbicgOiAnbWFzdGVyUGFzc3dvcmQnKS5mb2N1cygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgc2V0S2V5QW5kQ29udGludWUoa2V5OiBTeW1tZXRyaWNDcnlwdG9LZXkpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5jcnlwdG9TZXJ2aWNlLnNldEtleShrZXkpO1xuICAgICAgICB0aGlzLmRvQ29udGludWUoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGRvQ29udGludWUoKSB7XG4gICAgICAgIHRoaXMudmF1bHRUaW1lb3V0U2VydmljZS5iaW9tZXRyaWNMb2NrZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy52YXVsdFRpbWVvdXRTZXJ2aWNlLmV2ZXJCZWVuVW5sb2NrZWQgPSB0cnVlO1xuICAgICAgICBjb25zdCBkaXNhYmxlRmF2aWNvbiA9IGF3YWl0IHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0PGJvb2xlYW4+KENvbnN0YW50c1NlcnZpY2UuZGlzYWJsZUZhdmljb25LZXkpO1xuICAgICAgICBhd2FpdCB0aGlzLnN0YXRlU2VydmljZS5zYXZlKENvbnN0YW50c1NlcnZpY2UuZGlzYWJsZUZhdmljb25LZXksICEhZGlzYWJsZUZhdmljb24pO1xuICAgICAgICB0aGlzLm1lc3NhZ2luZ1NlcnZpY2Uuc2VuZCgndW5sb2NrZWQnKTtcbiAgICAgICAgaWYgKHRoaXMub25TdWNjZXNzZnVsU3VibWl0ICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMub25TdWNjZXNzZnVsU3VibWl0KCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5yb3V0ZXIgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW3RoaXMuc3VjY2Vzc1JvdXRlXSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQge1xuICAgIERpcmVjdGl2ZSxcbiAgICBJbnB1dCxcbiAgICBPbkluaXQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuXG5pbXBvcnQgeyBBdXRoUmVzdWx0IH0gZnJvbSAnanNsaWItY29tbW9uL21vZGVscy9kb21haW4vYXV0aFJlc3VsdCc7XG5cbmltcG9ydCB7IEF1dGhTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9hdXRoLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ3J5cHRvRnVuY3Rpb25TZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9jcnlwdG9GdW5jdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IEVudmlyb25tZW50U2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvZW52aXJvbm1lbnQuc2VydmljZSc7XG5pbXBvcnQgeyBJMThuU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvaTE4bi5zZXJ2aWNlJztcbmltcG9ydCB7IExvZ1NlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL2xvZy5zZXJ2aWNlJztcbmltcG9ydCB7IFBhc3N3b3JkR2VuZXJhdGlvblNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL3Bhc3N3b3JkR2VuZXJhdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IFBsYXRmb3JtVXRpbHNTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9wbGF0Zm9ybVV0aWxzLnNlcnZpY2UnO1xuaW1wb3J0IHsgU3RhdGVTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9zdGF0ZS5zZXJ2aWNlJztcbmltcG9ydCB7IFN0b3JhZ2VTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9zdG9yYWdlLnNlcnZpY2UnO1xuXG5pbXBvcnQgeyBDb25zdGFudHNTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL3NlcnZpY2VzL2NvbnN0YW50cy5zZXJ2aWNlJztcblxuaW1wb3J0IHsgVXRpbHMgfSBmcm9tICdqc2xpYi1jb21tb24vbWlzYy91dGlscyc7XG5cbmltcG9ydCB7IENhcHRjaGFQcm90ZWN0ZWRDb21wb25lbnQgfSBmcm9tICcuL2NhcHRjaGFQcm90ZWN0ZWQuY29tcG9uZW50JztcblxuY29uc3QgS2V5cyA9IHtcbiAgICByZW1lbWJlcmVkRW1haWw6ICdyZW1lbWJlcmVkRW1haWwnLFxuICAgIHJlbWVtYmVyRW1haWw6ICdyZW1lbWJlckVtYWlsJyxcbn07XG5cbkBEaXJlY3RpdmUoKVxuZXhwb3J0IGNsYXNzIExvZ2luQ29tcG9uZW50IGV4dGVuZHMgQ2FwdGNoYVByb3RlY3RlZENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gICAgQElucHV0KCkgZW1haWw6IHN0cmluZyA9ICcnO1xuICAgIEBJbnB1dCgpIHJlbWVtYmVyRW1haWwgPSB0cnVlO1xuXG4gICAgbWFzdGVyUGFzc3dvcmQ6IHN0cmluZyA9ICcnO1xuICAgIHNob3dQYXNzd29yZDogYm9vbGVhbiA9IGZhbHNlO1xuICAgIGZvcm1Qcm9taXNlOiBQcm9taXNlPEF1dGhSZXN1bHQ+O1xuICAgIG9uU3VjY2Vzc2Z1bExvZ2luOiAoKSA9PiBQcm9taXNlPGFueT47XG4gICAgb25TdWNjZXNzZnVsTG9naW5OYXZpZ2F0ZTogKCkgPT4gUHJvbWlzZTxhbnk+O1xuICAgIG9uU3VjY2Vzc2Z1bExvZ2luVHdvRmFjdG9yTmF2aWdhdGU6ICgpID0+IFByb21pc2U8YW55PjtcbiAgICBvblN1Y2Nlc3NmdWxMb2dpbkZvcmNlUmVzZXROYXZpZ2F0ZTogKCkgPT4gUHJvbWlzZTxhbnk+O1xuXG4gICAgcHJvdGVjdGVkIHR3b0ZhY3RvclJvdXRlID0gJzJmYSc7XG4gICAgcHJvdGVjdGVkIHN1Y2Nlc3NSb3V0ZSA9ICd2YXVsdCc7XG4gICAgcHJvdGVjdGVkIGZvcmNlUGFzc3dvcmRSZXNldFJvdXRlID0gJ3VwZGF0ZS10ZW1wLXBhc3N3b3JkJztcblxuICAgIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBhdXRoU2VydmljZTogQXV0aFNlcnZpY2UsIHByb3RlY3RlZCByb3V0ZXI6IFJvdXRlcixcbiAgICAgICAgcGxhdGZvcm1VdGlsc1NlcnZpY2U6IFBsYXRmb3JtVXRpbHNTZXJ2aWNlLCBpMThuU2VydmljZTogSTE4blNlcnZpY2UsXG4gICAgICAgIHByb3RlY3RlZCBzdGF0ZVNlcnZpY2U6IFN0YXRlU2VydmljZSwgZW52aXJvbm1lbnRTZXJ2aWNlOiBFbnZpcm9ubWVudFNlcnZpY2UsXG4gICAgICAgIHByb3RlY3RlZCBwYXNzd29yZEdlbmVyYXRpb25TZXJ2aWNlOiBQYXNzd29yZEdlbmVyYXRpb25TZXJ2aWNlLFxuICAgICAgICBwcm90ZWN0ZWQgY3J5cHRvRnVuY3Rpb25TZXJ2aWNlOiBDcnlwdG9GdW5jdGlvblNlcnZpY2UsIHByaXZhdGUgc3RvcmFnZVNlcnZpY2U6IFN0b3JhZ2VTZXJ2aWNlLFxuICAgICAgICBwcm90ZWN0ZWQgbG9nU2VydmljZTogTG9nU2VydmljZSkge1xuICAgICAgICBzdXBlcihlbnZpcm9ubWVudFNlcnZpY2UsIGkxOG5TZXJ2aWNlLCBwbGF0Zm9ybVV0aWxzU2VydmljZSk7XG4gICAgfVxuXG4gICAgYXN5bmMgbmdPbkluaXQoKSB7XG4gICAgICAgIGlmICh0aGlzLmVtYWlsID09IG51bGwgfHwgdGhpcy5lbWFpbCA9PT0gJycpIHtcbiAgICAgICAgICAgIHRoaXMuZW1haWwgPSBhd2FpdCB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldDxzdHJpbmc+KEtleXMucmVtZW1iZXJlZEVtYWlsKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmVtYWlsID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVtYWlsID0gJyc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZW1lbWJlckVtYWlsID0gYXdhaXQgdGhpcy5zdG9yYWdlU2VydmljZS5nZXQ8Ym9vbGVhbj4oS2V5cy5yZW1lbWJlckVtYWlsKTtcbiAgICAgICAgaWYgKHRoaXMucmVtZW1iZXJFbWFpbCA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnJlbWVtYmVyRW1haWwgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChVdGlscy5pc0Jyb3dzZXIgJiYgIVV0aWxzLmlzTm9kZSkge1xuICAgICAgICAgICAgdGhpcy5mb2N1c0lucHV0KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBzdWJtaXQoKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuc2V0dXBDYXB0Y2hhKCk7XG5cbiAgICAgICAgaWYgKHRoaXMuZW1haWwgPT0gbnVsbCB8fCB0aGlzLmVtYWlsID09PSAnJykge1xuICAgICAgICAgICAgdGhpcy5wbGF0Zm9ybVV0aWxzU2VydmljZS5zaG93VG9hc3QoJ2Vycm9yJywgdGhpcy5pMThuU2VydmljZS50KCdlcnJvck9jY3VycmVkJyksXG4gICAgICAgICAgICAgICAgdGhpcy5pMThuU2VydmljZS50KCdlbWFpbFJlcXVpcmVkJykpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmVtYWlsLmluZGV4T2YoJ0AnKSA9PT0gLTEpIHtcbiAgICAgICAgICAgIHRoaXMucGxhdGZvcm1VdGlsc1NlcnZpY2Uuc2hvd1RvYXN0KCdlcnJvcicsIHRoaXMuaTE4blNlcnZpY2UudCgnZXJyb3JPY2N1cnJlZCcpLFxuICAgICAgICAgICAgICAgIHRoaXMuaTE4blNlcnZpY2UudCgnaW52YWxpZEVtYWlsJykpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm1hc3RlclBhc3N3b3JkID09IG51bGwgfHwgdGhpcy5tYXN0ZXJQYXNzd29yZCA9PT0gJycpIHtcbiAgICAgICAgICAgIHRoaXMucGxhdGZvcm1VdGlsc1NlcnZpY2Uuc2hvd1RvYXN0KCdlcnJvcicsIHRoaXMuaTE4blNlcnZpY2UudCgnZXJyb3JPY2N1cnJlZCcpLFxuICAgICAgICAgICAgICAgIHRoaXMuaTE4blNlcnZpY2UudCgnbWFzdGVyUGFzc1JlcXVpcmVkJykpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuZm9ybVByb21pc2UgPSB0aGlzLmF1dGhTZXJ2aWNlLmxvZ0luKHRoaXMuZW1haWwsIHRoaXMubWFzdGVyUGFzc3dvcmQsIHRoaXMuY2FwdGNoYVRva2VuKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5mb3JtUHJvbWlzZTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2F2ZShLZXlzLnJlbWVtYmVyRW1haWwsIHRoaXMucmVtZW1iZXJFbWFpbCk7XG4gICAgICAgICAgICBpZiAodGhpcy5yZW1lbWJlckVtYWlsKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zdG9yYWdlU2VydmljZS5zYXZlKEtleXMucmVtZW1iZXJlZEVtYWlsLCB0aGlzLmVtYWlsKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zdG9yYWdlU2VydmljZS5yZW1vdmUoS2V5cy5yZW1lbWJlcmVkRW1haWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuaGFuZGxlQ2FwdGNoYVJlcXVpcmVkKHJlc3BvbnNlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzcG9uc2UudHdvRmFjdG9yKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub25TdWNjZXNzZnVsTG9naW5Ud29GYWN0b3JOYXZpZ2F0ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25TdWNjZXNzZnVsTG9naW5Ud29GYWN0b3JOYXZpZ2F0ZSgpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFt0aGlzLnR3b0ZhY3RvclJvdXRlXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChyZXNwb25zZS5mb3JjZVBhc3N3b3JkUmVzZXQpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vblN1Y2Nlc3NmdWxMb2dpbkZvcmNlUmVzZXROYXZpZ2F0ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25TdWNjZXNzZnVsTG9naW5Gb3JjZVJlc2V0TmF2aWdhdGUoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbdGhpcy5mb3JjZVBhc3N3b3JkUmVzZXRSb3V0ZV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGlzYWJsZUZhdmljb24gPSBhd2FpdCB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldDxib29sZWFuPihDb25zdGFudHNTZXJ2aWNlLmRpc2FibGVGYXZpY29uS2V5KTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnN0YXRlU2VydmljZS5zYXZlKENvbnN0YW50c1NlcnZpY2UuZGlzYWJsZUZhdmljb25LZXksICEhZGlzYWJsZUZhdmljb24pO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9uU3VjY2Vzc2Z1bExvZ2luICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vblN1Y2Nlc3NmdWxMb2dpbigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vblN1Y2Nlc3NmdWxMb2dpbk5hdmlnYXRlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vblN1Y2Nlc3NmdWxMb2dpbk5hdmlnYXRlKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW3RoaXMuc3VjY2Vzc1JvdXRlXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ1NlcnZpY2UuZXJyb3IoZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0b2dnbGVQYXNzd29yZCgpIHtcbiAgICAgICAgdGhpcy5zaG93UGFzc3dvcmQgPSAhdGhpcy5zaG93UGFzc3dvcmQ7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXN0ZXJQYXNzd29yZCcpLmZvY3VzKCk7XG4gICAgfVxuXG4gICAgYXN5bmMgbGF1bmNoU3NvQnJvd3NlcihjbGllbnRJZDogc3RyaW5nLCBzc29SZWRpcmVjdFVyaTogc3RyaW5nKSB7XG4gICAgICAgIC8vIEdlbmVyYXRlIG5lY2Vzc2FyeSBzc28gcGFyYW1zXG4gICAgICAgIGNvbnN0IHBhc3N3b3JkT3B0aW9uczogYW55ID0ge1xuICAgICAgICAgICAgdHlwZTogJ3Bhc3N3b3JkJyxcbiAgICAgICAgICAgIGxlbmd0aDogNjQsXG4gICAgICAgICAgICB1cHBlcmNhc2U6IHRydWUsXG4gICAgICAgICAgICBsb3dlcmNhc2U6IHRydWUsXG4gICAgICAgICAgICBudW1iZXJzOiB0cnVlLFxuICAgICAgICAgICAgc3BlY2lhbDogZmFsc2UsXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHN0YXRlID0gYXdhaXQgdGhpcy5wYXNzd29yZEdlbmVyYXRpb25TZXJ2aWNlLmdlbmVyYXRlUGFzc3dvcmQocGFzc3dvcmRPcHRpb25zKTtcbiAgICAgICAgY29uc3Qgc3NvQ29kZVZlcmlmaWVyID0gYXdhaXQgdGhpcy5wYXNzd29yZEdlbmVyYXRpb25TZXJ2aWNlLmdlbmVyYXRlUGFzc3dvcmQocGFzc3dvcmRPcHRpb25zKTtcbiAgICAgICAgY29uc3QgY29kZVZlcmlmaWVySGFzaCA9IGF3YWl0IHRoaXMuY3J5cHRvRnVuY3Rpb25TZXJ2aWNlLmhhc2goc3NvQ29kZVZlcmlmaWVyLCAnc2hhMjU2Jyk7XG4gICAgICAgIGNvbnN0IGNvZGVDaGFsbGVuZ2UgPSBVdGlscy5mcm9tQnVmZmVyVG9VcmxCNjQoY29kZVZlcmlmaWVySGFzaCk7XG5cbiAgICAgICAgLy8gU2F2ZSBzc28gcGFyYW1zXG4gICAgICAgIGF3YWl0IHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2F2ZShDb25zdGFudHNTZXJ2aWNlLnNzb1N0YXRlS2V5LCBzdGF0ZSk7XG4gICAgICAgIGF3YWl0IHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2F2ZShDb25zdGFudHNTZXJ2aWNlLnNzb0NvZGVWZXJpZmllcktleSwgc3NvQ29kZVZlcmlmaWVyKTtcblxuICAgICAgICAvLyBCdWlsZCBVUklcbiAgICAgICAgY29uc3Qgd2ViVXJsID0gdGhpcy5lbnZpcm9ubWVudFNlcnZpY2UuZ2V0V2ViVmF1bHRVcmwoKTtcblxuICAgICAgICAvLyBMYXVuY2ggYnJvd3NlclxuICAgICAgICB0aGlzLnBsYXRmb3JtVXRpbHNTZXJ2aWNlLmxhdW5jaFVyaSh3ZWJVcmwgKyAnLyMvc3NvP2NsaWVudElkPScgKyBjbGllbnRJZCArXG4gICAgICAgICAgICAnJnJlZGlyZWN0VXJpPScgKyBlbmNvZGVVUklDb21wb25lbnQoc3NvUmVkaXJlY3RVcmkpICtcbiAgICAgICAgICAgICcmc3RhdGU9JyArIHN0YXRlICsgJyZjb2RlQ2hhbGxlbmdlPScgKyBjb2RlQ2hhbGxlbmdlKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZm9jdXNJbnB1dCgpIHtcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5lbWFpbCA9PSBudWxsIHx8IHRoaXMuZW1haWwgPT09ICcnID8gJ2VtYWlsJyA6ICdtYXN0ZXJQYXNzd29yZCcpLmZvY3VzKCk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHtcbiAgICBBZnRlclZpZXdJbml0LFxuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIENvbXBvbmVudCxcbiAgICBDb21wb25lbnRSZWYsXG4gICAgRWxlbWVudFJlZixcbiAgICBPbkRlc3Ryb3ksXG4gICAgVHlwZSxcbiAgICBWaWV3Q2hpbGQsXG4gICAgVmlld0NvbnRhaW5lclJlZlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHtcbiAgICBDb25maWd1cmFibGVGb2N1c1RyYXAsXG4gICAgQ29uZmlndXJhYmxlRm9jdXNUcmFwRmFjdG9yeSxcbn0gZnJvbSAnQGFuZ3VsYXIvY2RrL2ExMXknO1xuXG5pbXBvcnQgeyBNb2RhbFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9tb2RhbC5zZXJ2aWNlJztcblxuaW1wb3J0IHsgTW9kYWxSZWYgfSBmcm9tICcuL21vZGFsLnJlZic7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnYXBwLW1vZGFsJyxcbiAgICB0ZW1wbGF0ZTogJzxuZy10ZW1wbGF0ZSAjbW9kYWxDb250ZW50PjwvbmctdGVtcGxhdGU+Jyxcbn0pXG5leHBvcnQgY2xhc3MgRHluYW1pY01vZGFsQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcbiAgICBjb21wb25lbnRSZWY6IENvbXBvbmVudFJlZjxhbnk+O1xuXG4gICAgQFZpZXdDaGlsZCgnbW9kYWxDb250ZW50JywgeyByZWFkOiBWaWV3Q29udGFpbmVyUmVmLCBzdGF0aWM6IHRydWUgfSkgbW9kYWxDb250ZW50UmVmOiBWaWV3Q29udGFpbmVyUmVmO1xuXG4gICAgY2hpbGRDb21wb25lbnRUeXBlOiBUeXBlPGFueT47XG4gICAgc2V0Q29tcG9uZW50UGFyYW1ldGVyczogKGNvbXBvbmVudDogYW55KSA9PiB2b2lkO1xuXG4gICAgcHJpdmF0ZSBmb2N1c1RyYXA6IENvbmZpZ3VyYWJsZUZvY3VzVHJhcDtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgbW9kYWxTZXJ2aWNlOiBNb2RhbFNlcnZpY2UsIHByaXZhdGUgY2Q6IENoYW5nZURldGVjdG9yUmVmLFxuICAgICAgICBwcml2YXRlIGVsOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PiwgcHJpdmF0ZSBmb2N1c1RyYXBGYWN0b3J5OiBDb25maWd1cmFibGVGb2N1c1RyYXBGYWN0b3J5LFxuICAgICAgICBwdWJsaWMgbW9kYWxSZWY6IE1vZGFsUmVmKSB7IH1cblxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAgICAgdGhpcy5sb2FkQ2hpbGRDb21wb25lbnQodGhpcy5jaGlsZENvbXBvbmVudFR5cGUpO1xuICAgICAgICBpZiAodGhpcy5zZXRDb21wb25lbnRQYXJhbWV0ZXJzICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0Q29tcG9uZW50UGFyYW1ldGVycyh0aGlzLmNvbXBvbmVudFJlZi5pbnN0YW5jZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XG5cbiAgICAgICAgdGhpcy5tb2RhbFJlZi5jcmVhdGVkKHRoaXMuZWwubmF0aXZlRWxlbWVudCk7XG4gICAgICAgIHRoaXMuZm9jdXNUcmFwID0gdGhpcy5mb2N1c1RyYXBGYWN0b3J5LmNyZWF0ZSh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignLm1vZGFsLWRpYWxvZycpKTtcbiAgICAgICAgaWYgKHRoaXMuZWwubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCdbYXBwQXV0b0ZvY3VzXScpID09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNUcmFwLmZvY3VzRmlyc3RUYWJiYWJsZUVsZW1lbnRXaGVuUmVhZHkoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGxvYWRDaGlsZENvbXBvbmVudChjb21wb25lbnRUeXBlOiBUeXBlPGFueT4pIHtcbiAgICAgICAgY29uc3QgY29tcG9uZW50RmFjdG9yeSA9IHRoaXMubW9kYWxTZXJ2aWNlLnJlc29sdmVDb21wb25lbnRGYWN0b3J5KGNvbXBvbmVudFR5cGUpO1xuXG4gICAgICAgIHRoaXMubW9kYWxDb250ZW50UmVmLmNsZWFyKCk7XG4gICAgICAgIHRoaXMuY29tcG9uZW50UmVmID0gdGhpcy5tb2RhbENvbnRlbnRSZWYuY3JlYXRlQ29tcG9uZW50KGNvbXBvbmVudEZhY3RvcnkpO1xuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICBpZiAodGhpcy5jb21wb25lbnRSZWYpIHtcbiAgICAgICAgICAgIHRoaXMuY29tcG9uZW50UmVmLmRlc3Ryb3koKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZvY3VzVHJhcC5kZXN0cm95KCk7XG4gICAgfVxuXG4gICAgY2xvc2UoKSB7XG4gICAgICAgIHRoaXMubW9kYWxSZWYuY2xvc2UoKTtcbiAgICB9XG5cbiAgICBnZXRGb2N1cygpIHtcbiAgICAgICAgY29uc3QgYXV0b0ZvY3VzRWwgPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignW2FwcEF1dG9Gb2N1c10nKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgYXV0b0ZvY3VzRWw/LmZvY3VzKCk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHtcbiAgICBJbmplY3RGbGFncyxcbiAgICBJbmplY3Rpb25Ub2tlbixcbiAgICBJbmplY3RvcixcbiAgICBUeXBlXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5leHBvcnQgY2xhc3MgTW9kYWxJbmplY3RvciBpbXBsZW1lbnRzIEluamVjdG9yIHtcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9wYXJlbnRJbmplY3RvcjogSW5qZWN0b3IsIHByaXZhdGUgX2FkZGl0aW9uYWxUb2tlbnM6IFdlYWtNYXA8YW55LCBhbnk+KSB7fVxuXG4gICAgZ2V0PFQ+KHRva2VuOiBUeXBlPFQ+IHwgSW5qZWN0aW9uVG9rZW48VD4sIG5vdEZvdW5kVmFsdWU/OiBULCBmbGFncz86IEluamVjdEZsYWdzKTogVDtcbiAgICBnZXQodG9rZW46IGFueSwgbm90Rm91bmRWYWx1ZT86IGFueSwgZmxhZ3M/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZGl0aW9uYWxUb2tlbnMuZ2V0KHRva2VuKSA/PyB0aGlzLl9wYXJlbnRJbmplY3Rvci5nZXQ8YW55Pih0b2tlbiwgbm90Rm91bmRWYWx1ZSk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZmlyc3QgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmV4cG9ydCBjbGFzcyBNb2RhbFJlZiB7XG5cbiAgICBvbkNyZWF0ZWQ6IE9ic2VydmFibGU8SFRNTEVsZW1lbnQ+OyAvLyBNb2RhbCBhZGRlZCB0byB0aGUgRE9NLlxuICAgIG9uQ2xvc2U6IE9ic2VydmFibGU8YW55PjsgICAgICAgICAgIC8vIEluaXRpYXRlZCBjbG9zZS5cbiAgICBvbkNsb3NlZDogT2JzZXJ2YWJsZTxhbnk+OyAgICAgICAgICAvLyBNb2RhbCB3YXMgY2xvc2VkIChSZW1vdmUgZWxlbWVudCBmcm9tIERPTSlcbiAgICBvblNob3c6IE9ic2VydmFibGU8YW55PjsgICAgICAgICAgICAvLyBTdGFydCBzaG93aW5nIG1vZGFsXG4gICAgb25TaG93bjogT2JzZXJ2YWJsZTxhbnk+OyAgICAgICAgICAgLy8gTW9kYWwgaXMgZnVsbHkgdmlzaWJsZVxuXG4gICAgcHJpdmF0ZSByZWFkb25seSBfb25DcmVhdGVkID0gbmV3IFN1YmplY3Q8SFRNTEVsZW1lbnQ+KCk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBfb25DbG9zZSA9IG5ldyBTdWJqZWN0PGFueT4oKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9vbkNsb3NlZCA9IG5ldyBTdWJqZWN0PGFueT4oKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9vblNob3cgPSBuZXcgU3ViamVjdDxhbnk+KCk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBfb25TaG93biA9IG5ldyBTdWJqZWN0PGFueT4oKTtcbiAgICBwcml2YXRlIGxhc3RSZXN1bHQ6IGFueTtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLm9uQ3JlYXRlZCA9IHRoaXMuX29uQ3JlYXRlZC5hc09ic2VydmFibGUoKTtcbiAgICAgICAgdGhpcy5vbkNsb3NlID0gdGhpcy5fb25DbG9zZS5hc09ic2VydmFibGUoKTtcbiAgICAgICAgdGhpcy5vbkNsb3NlZCA9IHRoaXMuX29uQ2xvc2VkLmFzT2JzZXJ2YWJsZSgpO1xuICAgICAgICB0aGlzLm9uU2hvdyA9IHRoaXMuX29uU2hvdy5hc09ic2VydmFibGUoKTtcbiAgICAgICAgdGhpcy5vblNob3duID0gdGhpcy5fb25TaG93LmFzT2JzZXJ2YWJsZSgpO1xuICAgIH1cblxuICAgIHNob3coKSB7XG4gICAgICAgIHRoaXMuX29uU2hvdy5uZXh0KCk7XG4gICAgfVxuXG4gICAgc2hvd24oKSB7XG4gICAgICAgIHRoaXMuX29uU2hvd24ubmV4dCgpO1xuICAgIH1cblxuICAgIGNsb3NlKHJlc3VsdD86IGFueSkge1xuICAgICAgICB0aGlzLmxhc3RSZXN1bHQgPSByZXN1bHQ7XG4gICAgICAgIHRoaXMuX29uQ2xvc2UubmV4dChyZXN1bHQpO1xuICAgIH1cblxuICAgIGNsb3NlZCgpIHtcbiAgICAgICAgdGhpcy5fb25DbG9zZWQubmV4dCh0aGlzLmxhc3RSZXN1bHQpO1xuICAgIH1cblxuICAgIGNyZWF0ZWQoZWw6IEhUTUxFbGVtZW50KSB7XG4gICAgICAgIHRoaXMuX29uQ3JlYXRlZC5uZXh0KGVsKTtcbiAgICB9XG5cbiAgICBvbkNsb3NlZFByb21pc2UoKTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMub25DbG9zZWQucGlwZShmaXJzdCgpKS50b1Byb21pc2UoKTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBEaXJlY3RpdmUsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBJMThuU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvaTE4bi5zZXJ2aWNlJztcbmltcG9ydCB7IFBhc3N3b3JkR2VuZXJhdGlvblNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL3Bhc3N3b3JkR2VuZXJhdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IFBsYXRmb3JtVXRpbHNTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9wbGF0Zm9ybVV0aWxzLnNlcnZpY2UnO1xuXG5pbXBvcnQgeyBHZW5lcmF0ZWRQYXNzd29yZEhpc3RvcnkgfSBmcm9tICdqc2xpYi1jb21tb24vbW9kZWxzL2RvbWFpbi9nZW5lcmF0ZWRQYXNzd29yZEhpc3RvcnknO1xuXG5ARGlyZWN0aXZlKClcbmV4cG9ydCBjbGFzcyBQYXNzd29yZEdlbmVyYXRvckhpc3RvcnlDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICAgIGhpc3Rvcnk6IEdlbmVyYXRlZFBhc3N3b3JkSGlzdG9yeVtdID0gW107XG5cbiAgICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgcGFzc3dvcmRHZW5lcmF0aW9uU2VydmljZTogUGFzc3dvcmRHZW5lcmF0aW9uU2VydmljZSxcbiAgICAgICAgcHJvdGVjdGVkIHBsYXRmb3JtVXRpbHNTZXJ2aWNlOiBQbGF0Zm9ybVV0aWxzU2VydmljZSwgcHJvdGVjdGVkIGkxOG5TZXJ2aWNlOiBJMThuU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSB3aW46IFdpbmRvdykgeyB9XG5cbiAgICBhc3luYyBuZ09uSW5pdCgpIHtcbiAgICAgICAgdGhpcy5oaXN0b3J5ID0gYXdhaXQgdGhpcy5wYXNzd29yZEdlbmVyYXRpb25TZXJ2aWNlLmdldEhpc3RvcnkoKTtcbiAgICB9XG5cbiAgICBjbGVhcigpIHtcbiAgICAgICAgdGhpcy5oaXN0b3J5ID0gW107XG4gICAgICAgIHRoaXMucGFzc3dvcmRHZW5lcmF0aW9uU2VydmljZS5jbGVhcigpO1xuICAgIH1cblxuICAgIGNvcHkocGFzc3dvcmQ6IHN0cmluZykge1xuICAgICAgICBjb25zdCBjb3B5T3B0aW9ucyA9IHRoaXMud2luICE9IG51bGwgPyB7IHdpbmRvdzogdGhpcy53aW4gfSA6IG51bGw7XG4gICAgICAgIHRoaXMucGxhdGZvcm1VdGlsc1NlcnZpY2UuY29weVRvQ2xpcGJvYXJkKHBhc3N3b3JkLCBjb3B5T3B0aW9ucyk7XG4gICAgICAgIHRoaXMucGxhdGZvcm1VdGlsc1NlcnZpY2Uuc2hvd1RvYXN0KCdpbmZvJywgbnVsbCxcbiAgICAgICAgICAgIHRoaXMuaTE4blNlcnZpY2UudCgndmFsdWVDb3BpZWQnLCB0aGlzLmkxOG5TZXJ2aWNlLnQoJ3Bhc3N3b3JkJykpKTtcbiAgICB9XG59XG4iLCJpbXBvcnQge1xuICAgIERpcmVjdGl2ZSxcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgSW5wdXQsXG4gICAgT25Jbml0LFxuICAgIE91dHB1dCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IEkxOG5TZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9pMThuLnNlcnZpY2UnO1xuaW1wb3J0IHsgUGFzc3dvcmRHZW5lcmF0aW9uU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvcGFzc3dvcmRHZW5lcmF0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgUGxhdGZvcm1VdGlsc1NlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL3BsYXRmb3JtVXRpbHMuc2VydmljZSc7XG5cbmltcG9ydCB7IFBhc3N3b3JkR2VuZXJhdG9yUG9saWN5T3B0aW9ucyB9IGZyb20gJ2pzbGliLWNvbW1vbi9tb2RlbHMvZG9tYWluL3Bhc3N3b3JkR2VuZXJhdG9yUG9saWN5T3B0aW9ucyc7XG5cbkBEaXJlY3RpdmUoKVxuZXhwb3J0IGNsYXNzIFBhc3N3b3JkR2VuZXJhdG9yQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgICBASW5wdXQoKSBzaG93U2VsZWN0OiBib29sZWFuID0gZmFsc2U7XG4gICAgQE91dHB1dCgpIG9uU2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICAgIHBhc3NUeXBlT3B0aW9uczogYW55W107XG4gICAgb3B0aW9uczogYW55ID0ge307XG4gICAgcGFzc3dvcmQ6IHN0cmluZyA9ICctJztcbiAgICBzaG93T3B0aW9ucyA9IGZhbHNlO1xuICAgIGF2b2lkQW1iaWd1b3VzID0gZmFsc2U7XG4gICAgZW5mb3JjZWRQb2xpY3lPcHRpb25zOiBQYXNzd29yZEdlbmVyYXRvclBvbGljeU9wdGlvbnM7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgcGFzc3dvcmRHZW5lcmF0aW9uU2VydmljZTogUGFzc3dvcmRHZW5lcmF0aW9uU2VydmljZSxcbiAgICAgICAgcHJvdGVjdGVkIHBsYXRmb3JtVXRpbHNTZXJ2aWNlOiBQbGF0Zm9ybVV0aWxzU2VydmljZSwgcHJvdGVjdGVkIGkxOG5TZXJ2aWNlOiBJMThuU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSB3aW46IFdpbmRvdykge1xuICAgICAgICAgICAgdGhpcy5wYXNzVHlwZU9wdGlvbnMgPSBbXG4gICAgICAgICAgICAgICAgeyBuYW1lOiBpMThuU2VydmljZS50KCdwYXNzd29yZCcpLCB2YWx1ZTogJ3Bhc3N3b3JkJyB9LFxuICAgICAgICAgICAgICAgIHsgbmFtZTogaTE4blNlcnZpY2UudCgncGFzc3BocmFzZScpLCB2YWx1ZTogJ3Bhc3NwaHJhc2UnIH0sXG4gICAgICAgICAgICBdO1xuICAgICAgICAgfVxuXG4gICAgYXN5bmMgbmdPbkluaXQoKSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnNSZXNwb25zZSA9IGF3YWl0IHRoaXMucGFzc3dvcmRHZW5lcmF0aW9uU2VydmljZS5nZXRPcHRpb25zKCk7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnNSZXNwb25zZVswXTtcbiAgICAgICAgdGhpcy5lbmZvcmNlZFBvbGljeU9wdGlvbnMgPSBvcHRpb25zUmVzcG9uc2VbMV07XG4gICAgICAgIHRoaXMuYXZvaWRBbWJpZ3VvdXMgPSAhdGhpcy5vcHRpb25zLmFtYmlndW91cztcbiAgICAgICAgdGhpcy5vcHRpb25zLnR5cGUgPSB0aGlzLm9wdGlvbnMudHlwZSA9PT0gJ3Bhc3NwaHJhc2UnID8gJ3Bhc3NwaHJhc2UnIDogJ3Bhc3N3b3JkJztcbiAgICAgICAgdGhpcy5wYXNzd29yZCA9IGF3YWl0IHRoaXMucGFzc3dvcmRHZW5lcmF0aW9uU2VydmljZS5nZW5lcmF0ZVBhc3N3b3JkKHRoaXMub3B0aW9ucyk7XG4gICAgICAgIGF3YWl0IHRoaXMucGFzc3dvcmRHZW5lcmF0aW9uU2VydmljZS5hZGRIaXN0b3J5KHRoaXMucGFzc3dvcmQpO1xuICAgIH1cblxuICAgIGFzeW5jIHNsaWRlckNoYW5nZWQoKSB7XG4gICAgICAgIHRoaXMuc2F2ZU9wdGlvbnMoZmFsc2UpO1xuICAgICAgICBhd2FpdCB0aGlzLnBhc3N3b3JkR2VuZXJhdGlvblNlcnZpY2UuYWRkSGlzdG9yeSh0aGlzLnBhc3N3b3JkKTtcbiAgICB9XG5cbiAgICBhc3luYyBzbGlkZXJJbnB1dCgpIHtcbiAgICAgICAgdGhpcy5ub3JtYWxpemVPcHRpb25zKCk7XG4gICAgICAgIHRoaXMucGFzc3dvcmQgPSBhd2FpdCB0aGlzLnBhc3N3b3JkR2VuZXJhdGlvblNlcnZpY2UuZ2VuZXJhdGVQYXNzd29yZCh0aGlzLm9wdGlvbnMpO1xuICAgIH1cblxuICAgIGFzeW5jIHNhdmVPcHRpb25zKHJlZ2VuZXJhdGU6IGJvb2xlYW4gPSB0cnVlKSB7XG4gICAgICAgIHRoaXMubm9ybWFsaXplT3B0aW9ucygpO1xuICAgICAgICBhd2FpdCB0aGlzLnBhc3N3b3JkR2VuZXJhdGlvblNlcnZpY2Uuc2F2ZU9wdGlvbnModGhpcy5vcHRpb25zKTtcblxuICAgICAgICBpZiAocmVnZW5lcmF0ZSkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5yZWdlbmVyYXRlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyByZWdlbmVyYXRlKCkge1xuICAgICAgICB0aGlzLnBhc3N3b3JkID0gYXdhaXQgdGhpcy5wYXNzd29yZEdlbmVyYXRpb25TZXJ2aWNlLmdlbmVyYXRlUGFzc3dvcmQodGhpcy5vcHRpb25zKTtcbiAgICAgICAgYXdhaXQgdGhpcy5wYXNzd29yZEdlbmVyYXRpb25TZXJ2aWNlLmFkZEhpc3RvcnkodGhpcy5wYXNzd29yZCk7XG4gICAgfVxuXG4gICAgY29weSgpIHtcbiAgICAgICAgY29uc3QgY29weU9wdGlvbnMgPSB0aGlzLndpbiAhPSBudWxsID8geyB3aW5kb3c6IHRoaXMud2luIH0gOiBudWxsO1xuICAgICAgICB0aGlzLnBsYXRmb3JtVXRpbHNTZXJ2aWNlLmNvcHlUb0NsaXBib2FyZCh0aGlzLnBhc3N3b3JkLCBjb3B5T3B0aW9ucyk7XG4gICAgICAgIHRoaXMucGxhdGZvcm1VdGlsc1NlcnZpY2Uuc2hvd1RvYXN0KCdpbmZvJywgbnVsbCxcbiAgICAgICAgICAgIHRoaXMuaTE4blNlcnZpY2UudCgndmFsdWVDb3BpZWQnLCB0aGlzLmkxOG5TZXJ2aWNlLnQoJ3Bhc3N3b3JkJykpKTtcbiAgICB9XG5cbiAgICBzZWxlY3QoKSB7XG4gICAgICAgIHRoaXMub25TZWxlY3RlZC5lbWl0KHRoaXMucGFzc3dvcmQpO1xuICAgIH1cblxuICAgIHRvZ2dsZU9wdGlvbnMoKSB7XG4gICAgICAgIHRoaXMuc2hvd09wdGlvbnMgPSAhdGhpcy5zaG93T3B0aW9ucztcbiAgICB9XG5cbiAgICBwcml2YXRlIG5vcm1hbGl6ZU9wdGlvbnMoKSB7XG4gICAgICAgIC8vIEFwcGxpY2F0aW9uIGxldmVsIG5vcm1hbGl6ZSBvcHRpb25zIGRlcGVkZW50IG9uIGNsYXNzIHZhcmlhYmxlc1xuICAgICAgICB0aGlzLm9wdGlvbnMuYW1iaWd1b3VzID0gIXRoaXMuYXZvaWRBbWJpZ3VvdXM7XG5cbiAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMudXBwZXJjYXNlICYmICF0aGlzLm9wdGlvbnMubG93ZXJjYXNlICYmICF0aGlzLm9wdGlvbnMubnVtYmVyICYmICF0aGlzLm9wdGlvbnMuc3BlY2lhbCkge1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zLmxvd2VyY2FzZSA9IHRydWU7XG4gICAgICAgICAgICBpZiAodGhpcy53aW4gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxvd2VyY2FzZSA9IHRoaXMud2luLmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNsb3dlcmNhc2UnKSBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgICAgICAgICAgICAgIGlmIChsb3dlcmNhc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgbG93ZXJjYXNlLmNoZWNrZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucGFzc3dvcmRHZW5lcmF0aW9uU2VydmljZS5ub3JtYWxpemVPcHRpb25zKHRoaXMub3B0aW9ucywgdGhpcy5lbmZvcmNlZFBvbGljeU9wdGlvbnMpO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IERpcmVjdGl2ZSwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IENpcGhlclNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL2NpcGhlci5zZXJ2aWNlJztcbmltcG9ydCB7IEkxOG5TZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9pMThuLnNlcnZpY2UnO1xuaW1wb3J0IHsgUGxhdGZvcm1VdGlsc1NlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL3BsYXRmb3JtVXRpbHMuc2VydmljZSc7XG5cbmltcG9ydCB7IFBhc3N3b3JkSGlzdG9yeVZpZXcgfSBmcm9tICdqc2xpYi1jb21tb24vbW9kZWxzL3ZpZXcvcGFzc3dvcmRIaXN0b3J5Vmlldyc7XG5cbkBEaXJlY3RpdmUoKVxuZXhwb3J0IGNsYXNzIFBhc3N3b3JkSGlzdG9yeUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gICAgY2lwaGVySWQ6IHN0cmluZztcbiAgICBoaXN0b3J5OiBQYXNzd29yZEhpc3RvcnlWaWV3W10gPSBbXTtcblxuICAgIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBjaXBoZXJTZXJ2aWNlOiBDaXBoZXJTZXJ2aWNlLCBwcm90ZWN0ZWQgcGxhdGZvcm1VdGlsc1NlcnZpY2U6IFBsYXRmb3JtVXRpbHNTZXJ2aWNlLFxuICAgICAgICBwcm90ZWN0ZWQgaTE4blNlcnZpY2U6IEkxOG5TZXJ2aWNlLCBwcml2YXRlIHdpbjogV2luZG93KSB7IH1cblxuICAgIGFzeW5jIG5nT25Jbml0KCkge1xuICAgICAgICBhd2FpdCB0aGlzLmluaXQoKTtcbiAgICB9XG5cbiAgICBjb3B5KHBhc3N3b3JkOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgY29weU9wdGlvbnMgPSB0aGlzLndpbiAhPSBudWxsID8geyB3aW5kb3c6IHRoaXMud2luIH0gOiBudWxsO1xuICAgICAgICB0aGlzLnBsYXRmb3JtVXRpbHNTZXJ2aWNlLmNvcHlUb0NsaXBib2FyZChwYXNzd29yZCwgY29weU9wdGlvbnMpO1xuICAgICAgICB0aGlzLnBsYXRmb3JtVXRpbHNTZXJ2aWNlLnNob3dUb2FzdCgnaW5mbycsIG51bGwsXG4gICAgICAgICAgICB0aGlzLmkxOG5TZXJ2aWNlLnQoJ3ZhbHVlQ29waWVkJywgdGhpcy5pMThuU2VydmljZS50KCdwYXNzd29yZCcpKSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGFzeW5jIGluaXQoKSB7XG4gICAgICAgIGNvbnN0IGNpcGhlciA9IGF3YWl0IHRoaXMuY2lwaGVyU2VydmljZS5nZXQodGhpcy5jaXBoZXJJZCk7XG4gICAgICAgIGNvbnN0IGRlY0NpcGhlciA9IGF3YWl0IGNpcGhlci5kZWNyeXB0KCk7XG4gICAgICAgIHRoaXMuaGlzdG9yeSA9IGRlY0NpcGhlci5wYXNzd29yZEhpc3RvcnkgPT0gbnVsbCA/IFtdIDogZGVjQ2lwaGVyLnBhc3N3b3JkSGlzdG9yeTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBEaXJlY3RpdmUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgQ3J5cHRvU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvY3J5cHRvLnNlcnZpY2UnO1xuaW1wb3J0IHsgSTE4blNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL2kxOG4uc2VydmljZSc7XG5pbXBvcnQgeyBQbGF0Zm9ybVV0aWxzU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvcGxhdGZvcm1VdGlscy5zZXJ2aWNlJztcbmltcG9ydCB7IE1vZGFsUmVmIH0gZnJvbSAnLi9tb2RhbC9tb2RhbC5yZWYnO1xuXG5ARGlyZWN0aXZlKClcbmV4cG9ydCBjbGFzcyBQYXNzd29yZFJlcHJvbXB0Q29tcG9uZW50IHtcblxuICAgIHNob3dQYXNzd29yZCA9IGZhbHNlO1xuICAgIG1hc3RlclBhc3N3b3JkID0gJyc7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIG1vZGFsUmVmOiBNb2RhbFJlZiwgcHJpdmF0ZSBjcnlwdG9TZXJ2aWNlOiBDcnlwdG9TZXJ2aWNlLCBwcml2YXRlIHBsYXRmb3JtVXRpbHNTZXJ2aWNlOiBQbGF0Zm9ybVV0aWxzU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBpMThuU2VydmljZTogSTE4blNlcnZpY2UpIHt9XG5cbiAgICB0b2dnbGVQYXNzd29yZCgpIHtcbiAgICAgICAgdGhpcy5zaG93UGFzc3dvcmQgPSAhdGhpcy5zaG93UGFzc3dvcmQ7XG4gICAgfVxuXG4gICAgYXN5bmMgc3VibWl0KCkge1xuICAgICAgICBpZiAoIWF3YWl0IHRoaXMuY3J5cHRvU2VydmljZS5jb21wYXJlQW5kVXBkYXRlS2V5SGFzaCh0aGlzLm1hc3RlclBhc3N3b3JkLCBudWxsKSkge1xuICAgICAgICAgICAgdGhpcy5wbGF0Zm9ybVV0aWxzU2VydmljZS5zaG93VG9hc3QoJ2Vycm9yJywgdGhpcy5pMThuU2VydmljZS50KCdlcnJvck9jY3VycmVkJyksXG4gICAgICAgICAgICAgICAgdGhpcy5pMThuU2VydmljZS50KCdpbnZhbGlkTWFzdGVyUGFzc3dvcmQnKSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm1vZGFsUmVmLmNsb3NlKHRydWUpO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IERpcmVjdGl2ZSwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IEFwaVNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL2FwaS5zZXJ2aWNlJztcbmltcG9ydCB7IEkxOG5TZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9pMThuLnNlcnZpY2UnO1xuaW1wb3J0IHsgTG9nU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvbG9nLnNlcnZpY2UnO1xuaW1wb3J0IHsgUGxhdGZvcm1VdGlsc1NlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL3BsYXRmb3JtVXRpbHMuc2VydmljZSc7XG5pbXBvcnQgeyBVc2VyU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvdXNlci5zZXJ2aWNlJztcblxuQERpcmVjdGl2ZSgpXG5leHBvcnQgY2xhc3MgUHJlbWl1bUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gICAgaXNQcmVtaXVtOiBib29sZWFuID0gZmFsc2U7XG4gICAgcHJpY2U6IG51bWJlciA9IDEwO1xuICAgIHJlZnJlc2hQcm9taXNlOiBQcm9taXNlPGFueT47XG5cbiAgICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgaTE4blNlcnZpY2U6IEkxOG5TZXJ2aWNlLCBwcm90ZWN0ZWQgcGxhdGZvcm1VdGlsc1NlcnZpY2U6IFBsYXRmb3JtVXRpbHNTZXJ2aWNlLFxuICAgICAgICBwcm90ZWN0ZWQgYXBpU2VydmljZTogQXBpU2VydmljZSwgcHJvdGVjdGVkIHVzZXJTZXJ2aWNlOiBVc2VyU2VydmljZSwgcHJpdmF0ZSBsb2dTZXJ2aWNlOiBMb2dTZXJ2aWNlKSB7IH1cblxuICAgIGFzeW5jIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLmlzUHJlbWl1bSA9IGF3YWl0IHRoaXMudXNlclNlcnZpY2UuY2FuQWNjZXNzUHJlbWl1bSgpO1xuICAgIH1cblxuICAgIGFzeW5jIHJlZnJlc2goKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hQcm9taXNlID0gdGhpcy5hcGlTZXJ2aWNlLnJlZnJlc2hJZGVudGl0eVRva2VuKCk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnJlZnJlc2hQcm9taXNlO1xuICAgICAgICAgICAgdGhpcy5wbGF0Zm9ybVV0aWxzU2VydmljZS5zaG93VG9hc3QoJ3N1Y2Nlc3MnLCBudWxsLCB0aGlzLmkxOG5TZXJ2aWNlLnQoJ3JlZnJlc2hDb21wbGV0ZScpKTtcbiAgICAgICAgICAgIHRoaXMuaXNQcmVtaXVtID0gYXdhaXQgdGhpcy51c2VyU2VydmljZS5jYW5BY2Nlc3NQcmVtaXVtKCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRoaXMubG9nU2VydmljZS5lcnJvcihlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIHB1cmNoYXNlKCkge1xuICAgICAgICBjb25zdCBjb25maXJtZWQgPSBhd2FpdCB0aGlzLnBsYXRmb3JtVXRpbHNTZXJ2aWNlLnNob3dEaWFsb2codGhpcy5pMThuU2VydmljZS50KCdwcmVtaXVtUHVyY2hhc2VBbGVydCcpLFxuICAgICAgICAgICAgdGhpcy5pMThuU2VydmljZS50KCdwcmVtaXVtUHVyY2hhc2UnKSwgdGhpcy5pMThuU2VydmljZS50KCd5ZXMnKSwgdGhpcy5pMThuU2VydmljZS50KCdjYW5jZWwnKSk7XG4gICAgICAgIGlmIChjb25maXJtZWQpIHtcbiAgICAgICAgICAgIHRoaXMucGxhdGZvcm1VdGlsc1NlcnZpY2UubGF1bmNoVXJpKCdodHRwczovL3ZhdWx0LmJpdHdhcmRlbi5jb20vIy8/cHJlbWl1bT1wdXJjaGFzZScpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgbWFuYWdlKCkge1xuICAgICAgICBjb25zdCBjb25maXJtZWQgPSBhd2FpdCB0aGlzLnBsYXRmb3JtVXRpbHNTZXJ2aWNlLnNob3dEaWFsb2codGhpcy5pMThuU2VydmljZS50KCdwcmVtaXVtTWFuYWdlQWxlcnQnKSxcbiAgICAgICAgICAgIHRoaXMuaTE4blNlcnZpY2UudCgncHJlbWl1bU1hbmFnZScpLCB0aGlzLmkxOG5TZXJ2aWNlLnQoJ3llcycpLCB0aGlzLmkxOG5TZXJ2aWNlLnQoJ2NhbmNlbCcpKTtcbiAgICAgICAgaWYgKGNvbmZpcm1lZCkge1xuICAgICAgICAgICAgdGhpcy5wbGF0Zm9ybVV0aWxzU2VydmljZS5sYXVuY2hVcmkoJ2h0dHBzOi8vdmF1bHQuYml0d2FyZGVuLmNvbS8jLz9wcmVtaXVtPW1hbmFnZScpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgRGlyZWN0aXZlLCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5cbmltcG9ydCB7IEtleXNSZXF1ZXN0IH0gZnJvbSAnanNsaWItY29tbW9uL21vZGVscy9yZXF1ZXN0L2tleXNSZXF1ZXN0JztcbmltcG9ydCB7IFJlZmVyZW5jZUV2ZW50UmVxdWVzdCB9IGZyb20gJ2pzbGliLWNvbW1vbi9tb2RlbHMvcmVxdWVzdC9yZWZlcmVuY2VFdmVudFJlcXVlc3QnO1xuaW1wb3J0IHsgUmVnaXN0ZXJSZXF1ZXN0IH0gZnJvbSAnanNsaWItY29tbW9uL21vZGVscy9yZXF1ZXN0L3JlZ2lzdGVyUmVxdWVzdCc7XG5cbmltcG9ydCB7IEFwaVNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL2FwaS5zZXJ2aWNlJztcbmltcG9ydCB7IEF1dGhTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9hdXRoLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ3J5cHRvU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvY3J5cHRvLnNlcnZpY2UnO1xuaW1wb3J0IHsgRW52aXJvbm1lbnRTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9lbnZpcm9ubWVudC5zZXJ2aWNlJztcbmltcG9ydCB7IEkxOG5TZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9pMThuLnNlcnZpY2UnO1xuaW1wb3J0IHsgTG9nU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvbG9nLnNlcnZpY2UnO1xuaW1wb3J0IHsgUGFzc3dvcmRHZW5lcmF0aW9uU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvcGFzc3dvcmRHZW5lcmF0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgUGxhdGZvcm1VdGlsc1NlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL3BsYXRmb3JtVXRpbHMuc2VydmljZSc7XG5pbXBvcnQgeyBTdGF0ZVNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL3N0YXRlLnNlcnZpY2UnO1xuXG5pbXBvcnQgeyBLZGZUeXBlIH0gZnJvbSAnanNsaWItY29tbW9uL2VudW1zL2tkZlR5cGUnO1xuXG5pbXBvcnQgeyBDYXB0Y2hhUHJvdGVjdGVkQ29tcG9uZW50IH0gZnJvbSAnLi9jYXB0Y2hhUHJvdGVjdGVkLmNvbXBvbmVudCc7XG5cbkBEaXJlY3RpdmUoKVxuZXhwb3J0IGNsYXNzIFJlZ2lzdGVyQ29tcG9uZW50IGV4dGVuZHMgQ2FwdGNoYVByb3RlY3RlZENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gICAgbmFtZTogc3RyaW5nID0gJyc7XG4gICAgZW1haWw6IHN0cmluZyA9ICcnO1xuICAgIG1hc3RlclBhc3N3b3JkOiBzdHJpbmcgPSAnJztcbiAgICBjb25maXJtTWFzdGVyUGFzc3dvcmQ6IHN0cmluZyA9ICcnO1xuICAgIGhpbnQ6IHN0cmluZyA9ICcnO1xuICAgIHNob3dQYXNzd29yZDogYm9vbGVhbiA9IGZhbHNlO1xuICAgIGZvcm1Qcm9taXNlOiBQcm9taXNlPGFueT47XG4gICAgbWFzdGVyUGFzc3dvcmRTY29yZTogbnVtYmVyO1xuICAgIHJlZmVyZW5jZURhdGE6IFJlZmVyZW5jZUV2ZW50UmVxdWVzdDtcbiAgICBzaG93VGVybXMgPSB0cnVlO1xuICAgIGFjY2VwdFBvbGljaWVzOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBwcm90ZWN0ZWQgc3VjY2Vzc1JvdXRlID0gJ2xvZ2luJztcbiAgICBwcml2YXRlIG1hc3RlclBhc3N3b3JkU3RyZW5ndGhUaW1lb3V0OiBhbnk7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgYXV0aFNlcnZpY2U6IEF1dGhTZXJ2aWNlLCBwcm90ZWN0ZWQgcm91dGVyOiBSb3V0ZXIsXG4gICAgICAgIGkxOG5TZXJ2aWNlOiBJMThuU2VydmljZSwgcHJvdGVjdGVkIGNyeXB0b1NlcnZpY2U6IENyeXB0b1NlcnZpY2UsXG4gICAgICAgIHByb3RlY3RlZCBhcGlTZXJ2aWNlOiBBcGlTZXJ2aWNlLCBwcm90ZWN0ZWQgc3RhdGVTZXJ2aWNlOiBTdGF0ZVNlcnZpY2UsXG4gICAgICAgIHBsYXRmb3JtVXRpbHNTZXJ2aWNlOiBQbGF0Zm9ybVV0aWxzU2VydmljZSxcbiAgICAgICAgcHJvdGVjdGVkIHBhc3N3b3JkR2VuZXJhdGlvblNlcnZpY2U6IFBhc3N3b3JkR2VuZXJhdGlvblNlcnZpY2UsIGVudmlyb25tZW50U2VydmljZTogRW52aXJvbm1lbnRTZXJ2aWNlLFxuICAgICAgICBwcm90ZWN0ZWQgbG9nU2VydmljZTogTG9nU2VydmljZSkge1xuICAgICAgICBzdXBlcihlbnZpcm9ubWVudFNlcnZpY2UsIGkxOG5TZXJ2aWNlLCBwbGF0Zm9ybVV0aWxzU2VydmljZSk7XG4gICAgICAgIHRoaXMuc2hvd1Rlcm1zID0gIXBsYXRmb3JtVXRpbHNTZXJ2aWNlLmlzU2VsZkhvc3QoKTtcbiAgICB9XG5cbiAgICBhc3luYyBuZ09uSW5pdCgpIHtcbiAgICAgICAgdGhpcy5zZXR1cENhcHRjaGEoKTtcbiAgICB9XG5cbiAgICBnZXQgbWFzdGVyUGFzc3dvcmRTY29yZVdpZHRoKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tYXN0ZXJQYXNzd29yZFNjb3JlID09IG51bGwgPyAwIDogKHRoaXMubWFzdGVyUGFzc3dvcmRTY29yZSArIDEpICogMjA7XG4gICAgfVxuXG4gICAgZ2V0IG1hc3RlclBhc3N3b3JkU2NvcmVDb2xvcigpIHtcbiAgICAgICAgc3dpdGNoICh0aGlzLm1hc3RlclBhc3N3b3JkU2NvcmUpIHtcbiAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3N1Y2Nlc3MnO1xuICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgIHJldHVybiAncHJpbWFyeSc7XG4gICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgcmV0dXJuICd3YXJuaW5nJztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuICdkYW5nZXInO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0IG1hc3RlclBhc3N3b3JkU2NvcmVUZXh0KCkge1xuICAgICAgICBzd2l0Y2ggKHRoaXMubWFzdGVyUGFzc3dvcmRTY29yZSkge1xuICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmkxOG5TZXJ2aWNlLnQoJ3N0cm9uZycpO1xuICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmkxOG5TZXJ2aWNlLnQoJ2dvb2QnKTtcbiAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pMThuU2VydmljZS50KCd3ZWFrJyk7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm1hc3RlclBhc3N3b3JkU2NvcmUgIT0gbnVsbCA/IHRoaXMuaTE4blNlcnZpY2UudCgnd2VhaycpIDogbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIHN1Ym1pdCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmFjY2VwdFBvbGljaWVzICYmIHRoaXMuc2hvd1Rlcm1zKSB7XG4gICAgICAgICAgICB0aGlzLnBsYXRmb3JtVXRpbHNTZXJ2aWNlLnNob3dUb2FzdCgnZXJyb3InLCB0aGlzLmkxOG5TZXJ2aWNlLnQoJ2Vycm9yT2NjdXJyZWQnKSxcbiAgICAgICAgICAgICAgICB0aGlzLmkxOG5TZXJ2aWNlLnQoJ2FjY2VwdFBvbGljaWVzRXJyb3InKSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5lbWFpbCA9PSBudWxsIHx8IHRoaXMuZW1haWwgPT09ICcnKSB7XG4gICAgICAgICAgICB0aGlzLnBsYXRmb3JtVXRpbHNTZXJ2aWNlLnNob3dUb2FzdCgnZXJyb3InLCB0aGlzLmkxOG5TZXJ2aWNlLnQoJ2Vycm9yT2NjdXJyZWQnKSxcbiAgICAgICAgICAgICAgICB0aGlzLmkxOG5TZXJ2aWNlLnQoJ2VtYWlsUmVxdWlyZWQnKSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZW1haWwuaW5kZXhPZignQCcpID09PSAtMSkge1xuICAgICAgICAgICAgdGhpcy5wbGF0Zm9ybVV0aWxzU2VydmljZS5zaG93VG9hc3QoJ2Vycm9yJywgdGhpcy5pMThuU2VydmljZS50KCdlcnJvck9jY3VycmVkJyksXG4gICAgICAgICAgICAgICAgdGhpcy5pMThuU2VydmljZS50KCdpbnZhbGlkRW1haWwnKSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubWFzdGVyUGFzc3dvcmQgPT0gbnVsbCB8fCB0aGlzLm1hc3RlclBhc3N3b3JkID09PSAnJykge1xuICAgICAgICAgICAgdGhpcy5wbGF0Zm9ybVV0aWxzU2VydmljZS5zaG93VG9hc3QoJ2Vycm9yJywgdGhpcy5pMThuU2VydmljZS50KCdlcnJvck9jY3VycmVkJyksXG4gICAgICAgICAgICAgICAgdGhpcy5pMThuU2VydmljZS50KCdtYXN0ZXJQYXNzUmVxdWlyZWQnKSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubWFzdGVyUGFzc3dvcmQubGVuZ3RoIDwgOCkge1xuICAgICAgICAgICAgdGhpcy5wbGF0Zm9ybVV0aWxzU2VydmljZS5zaG93VG9hc3QoJ2Vycm9yJywgdGhpcy5pMThuU2VydmljZS50KCdlcnJvck9jY3VycmVkJyksXG4gICAgICAgICAgICAgICAgdGhpcy5pMThuU2VydmljZS50KCdtYXN0ZXJQYXNzTGVuZ3RoJykpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm1hc3RlclBhc3N3b3JkICE9PSB0aGlzLmNvbmZpcm1NYXN0ZXJQYXNzd29yZCkge1xuICAgICAgICAgICAgdGhpcy5wbGF0Zm9ybVV0aWxzU2VydmljZS5zaG93VG9hc3QoJ2Vycm9yJywgdGhpcy5pMThuU2VydmljZS50KCdlcnJvck9jY3VycmVkJyksXG4gICAgICAgICAgICAgICAgdGhpcy5pMThuU2VydmljZS50KCdtYXN0ZXJQYXNzRG9lc250TWF0Y2gnKSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzdHJlbmd0aFJlc3VsdCA9IHRoaXMucGFzc3dvcmRHZW5lcmF0aW9uU2VydmljZS5wYXNzd29yZFN0cmVuZ3RoKHRoaXMubWFzdGVyUGFzc3dvcmQsXG4gICAgICAgICAgICB0aGlzLmdldFBhc3N3b3JkU3RyZW5ndGhVc2VySW5wdXQoKSk7XG4gICAgICAgIGlmIChzdHJlbmd0aFJlc3VsdCAhPSBudWxsICYmIHN0cmVuZ3RoUmVzdWx0LnNjb3JlIDwgMykge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5wbGF0Zm9ybVV0aWxzU2VydmljZS5zaG93RGlhbG9nKHRoaXMuaTE4blNlcnZpY2UudCgnd2Vha01hc3RlclBhc3N3b3JkRGVzYycpLFxuICAgICAgICAgICAgICAgIHRoaXMuaTE4blNlcnZpY2UudCgnd2Vha01hc3RlclBhc3N3b3JkJyksIHRoaXMuaTE4blNlcnZpY2UudCgneWVzJyksIHRoaXMuaTE4blNlcnZpY2UudCgnbm8nKSxcbiAgICAgICAgICAgICAgICAnd2FybmluZycpO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5oaW50ID09PSB0aGlzLm1hc3RlclBhc3N3b3JkKSB7XG4gICAgICAgICAgICB0aGlzLnBsYXRmb3JtVXRpbHNTZXJ2aWNlLnNob3dUb2FzdCgnZXJyb3InLCB0aGlzLmkxOG5TZXJ2aWNlLnQoJ2Vycm9yT2NjdXJyZWQnKSwgdGhpcy5pMThuU2VydmljZS50KCdoaW50RXF1YWxzUGFzc3dvcmQnKSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm5hbWUgPSB0aGlzLm5hbWUgPT09ICcnID8gbnVsbCA6IHRoaXMubmFtZTtcbiAgICAgICAgdGhpcy5lbWFpbCA9IHRoaXMuZW1haWwudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGNvbnN0IGtkZiA9IEtkZlR5cGUuUEJLREYyX1NIQTI1NjtcbiAgICAgICAgY29uc3QgdXNlTG93ZXJLZGYgPSB0aGlzLnBsYXRmb3JtVXRpbHNTZXJ2aWNlLmlzSUUoKTtcbiAgICAgICAgY29uc3Qga2RmSXRlcmF0aW9ucyA9IHVzZUxvd2VyS2RmID8gMTAwMDAgOiAxMDAwMDA7XG4gICAgICAgIGNvbnN0IGtleSA9IGF3YWl0IHRoaXMuY3J5cHRvU2VydmljZS5tYWtlS2V5KHRoaXMubWFzdGVyUGFzc3dvcmQsIHRoaXMuZW1haWwsIGtkZiwga2RmSXRlcmF0aW9ucyk7XG4gICAgICAgIGNvbnN0IGVuY0tleSA9IGF3YWl0IHRoaXMuY3J5cHRvU2VydmljZS5tYWtlRW5jS2V5KGtleSk7XG4gICAgICAgIGNvbnN0IGhhc2hlZFBhc3N3b3JkID0gYXdhaXQgdGhpcy5jcnlwdG9TZXJ2aWNlLmhhc2hQYXNzd29yZCh0aGlzLm1hc3RlclBhc3N3b3JkLCBrZXkpO1xuICAgICAgICBjb25zdCBrZXlzID0gYXdhaXQgdGhpcy5jcnlwdG9TZXJ2aWNlLm1ha2VLZXlQYWlyKGVuY0tleVswXSk7XG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSBuZXcgUmVnaXN0ZXJSZXF1ZXN0KHRoaXMuZW1haWwsIHRoaXMubmFtZSwgaGFzaGVkUGFzc3dvcmQsXG4gICAgICAgICAgICB0aGlzLmhpbnQsIGVuY0tleVsxXS5lbmNyeXB0ZWRTdHJpbmcsIGtkZiwga2RmSXRlcmF0aW9ucywgdGhpcy5yZWZlcmVuY2VEYXRhLCB0aGlzLmNhcHRjaGFUb2tlbik7XG4gICAgICAgIHJlcXVlc3Qua2V5cyA9IG5ldyBLZXlzUmVxdWVzdChrZXlzWzBdLCBrZXlzWzFdLmVuY3J5cHRlZFN0cmluZyk7XG4gICAgICAgIGNvbnN0IG9yZ0ludml0ZSA9IGF3YWl0IHRoaXMuc3RhdGVTZXJ2aWNlLmdldDxhbnk+KCdvcmdJbnZpdGF0aW9uJyk7XG4gICAgICAgIGlmIChvcmdJbnZpdGUgIT0gbnVsbCAmJiBvcmdJbnZpdGUudG9rZW4gIT0gbnVsbCAmJiBvcmdJbnZpdGUub3JnYW5pemF0aW9uVXNlcklkICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJlcXVlc3QudG9rZW4gPSBvcmdJbnZpdGUudG9rZW47XG4gICAgICAgICAgICByZXF1ZXN0Lm9yZ2FuaXphdGlvblVzZXJJZCA9IG9yZ0ludml0ZS5vcmdhbml6YXRpb25Vc2VySWQ7XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5mb3JtUHJvbWlzZSA9IHRoaXMuYXBpU2VydmljZS5wb3N0UmVnaXN0ZXIocmVxdWVzdCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZm9ybVByb21pc2U7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaGFuZGxlQ2FwdGNoYVJlcXVpcmVkKGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucGxhdGZvcm1VdGlsc1NlcnZpY2Uuc2hvd1RvYXN0KCdzdWNjZXNzJywgbnVsbCwgdGhpcy5pMThuU2VydmljZS50KCduZXdBY2NvdW50Q3JlYXRlZCcpKTtcbiAgICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFt0aGlzLnN1Y2Nlc3NSb3V0ZV0sIHsgcXVlcnlQYXJhbXM6IHsgZW1haWw6IHRoaXMuZW1haWwgfSB9KTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5sb2dTZXJ2aWNlLmVycm9yKGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdG9nZ2xlUGFzc3dvcmQoY29uZmlybUZpZWxkOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuc2hvd1Bhc3N3b3JkID0gIXRoaXMuc2hvd1Bhc3N3b3JkO1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChjb25maXJtRmllbGQgPyAnbWFzdGVyUGFzc3dvcmRSZXR5cGUnIDogJ21hc3RlclBhc3N3b3JkJykuZm9jdXMoKTtcbiAgICB9XG5cbiAgICB1cGRhdGVQYXNzd29yZFN0cmVuZ3RoKCkge1xuICAgICAgICBpZiAodGhpcy5tYXN0ZXJQYXNzd29yZFN0cmVuZ3RoVGltZW91dCAhPSBudWxsKSB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5tYXN0ZXJQYXNzd29yZFN0cmVuZ3RoVGltZW91dCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5tYXN0ZXJQYXNzd29yZFN0cmVuZ3RoVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc3RyZW5ndGhSZXN1bHQgPSB0aGlzLnBhc3N3b3JkR2VuZXJhdGlvblNlcnZpY2UucGFzc3dvcmRTdHJlbmd0aCh0aGlzLm1hc3RlclBhc3N3b3JkLFxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0UGFzc3dvcmRTdHJlbmd0aFVzZXJJbnB1dCgpKTtcbiAgICAgICAgICAgIHRoaXMubWFzdGVyUGFzc3dvcmRTY29yZSA9IHN0cmVuZ3RoUmVzdWx0ID09IG51bGwgPyBudWxsIDogc3RyZW5ndGhSZXN1bHQuc2NvcmU7XG4gICAgICAgIH0sIDMwMCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRQYXNzd29yZFN0cmVuZ3RoVXNlcklucHV0KCkge1xuICAgICAgICBsZXQgdXNlcklucHV0OiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBjb25zdCBhdFBvc2l0aW9uID0gdGhpcy5lbWFpbC5pbmRleE9mKCdAJyk7XG4gICAgICAgIGlmIChhdFBvc2l0aW9uID4gLTEpIHtcbiAgICAgICAgICAgIHVzZXJJbnB1dCA9IHVzZXJJbnB1dC5jb25jYXQodGhpcy5lbWFpbC5zdWJzdHIoMCwgYXRQb3NpdGlvbikudHJpbSgpLnRvTG93ZXJDYXNlKCkuc3BsaXQoL1teQS1aYS16MC05XS8pKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5uYW1lICE9IG51bGwgJiYgdGhpcy5uYW1lICE9PSAnJykge1xuICAgICAgICAgICAgdXNlcklucHV0ID0gdXNlcklucHV0LmNvbmNhdCh0aGlzLm5hbWUudHJpbSgpLnRvTG93ZXJDYXNlKCkuc3BsaXQoJyAnKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVzZXJJbnB1dDtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBEYXRlUGlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICAgIERpcmVjdGl2ZSxcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgSW5wdXQsXG4gICAgT25Jbml0LFxuICAgIE91dHB1dFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgUG9saWN5VHlwZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9lbnVtcy9wb2xpY3lUeXBlJztcbmltcG9ydCB7IFNlbmRUeXBlIH0gZnJvbSAnanNsaWItY29tbW9uL2VudW1zL3NlbmRUeXBlJztcblxuaW1wb3J0IHsgRW52aXJvbm1lbnRTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9lbnZpcm9ubWVudC5zZXJ2aWNlJztcbmltcG9ydCB7IEkxOG5TZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9pMThuLnNlcnZpY2UnO1xuaW1wb3J0IHsgTG9nU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvbG9nLnNlcnZpY2UnO1xuaW1wb3J0IHsgTWVzc2FnaW5nU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvbWVzc2FnaW5nLnNlcnZpY2UnO1xuaW1wb3J0IHsgUGxhdGZvcm1VdGlsc1NlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL3BsYXRmb3JtVXRpbHMuc2VydmljZSc7XG5pbXBvcnQgeyBQb2xpY3lTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9wb2xpY3kuc2VydmljZSc7XG5pbXBvcnQgeyBTZW5kU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvc2VuZC5zZXJ2aWNlJztcbmltcG9ydCB7IFVzZXJTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy91c2VyLnNlcnZpY2UnO1xuXG5pbXBvcnQgeyBTZW5kRmlsZVZpZXcgfSBmcm9tICdqc2xpYi1jb21tb24vbW9kZWxzL3ZpZXcvc2VuZEZpbGVWaWV3JztcbmltcG9ydCB7IFNlbmRUZXh0VmlldyB9IGZyb20gJ2pzbGliLWNvbW1vbi9tb2RlbHMvdmlldy9zZW5kVGV4dFZpZXcnO1xuaW1wb3J0IHsgU2VuZFZpZXcgfSBmcm9tICdqc2xpYi1jb21tb24vbW9kZWxzL3ZpZXcvc2VuZFZpZXcnO1xuXG5pbXBvcnQgeyBFbmNBcnJheUJ1ZmZlciB9IGZyb20gJ2pzbGliLWNvbW1vbi9tb2RlbHMvZG9tYWluL2VuY0FycmF5QnVmZmVyJztcbmltcG9ydCB7IFNlbmQgfSBmcm9tICdqc2xpYi1jb21tb24vbW9kZWxzL2RvbWFpbi9zZW5kJztcblxuQERpcmVjdGl2ZSgpXG5leHBvcnQgY2xhc3MgQWRkRWRpdENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gICAgQElucHV0KCkgc2VuZElkOiBzdHJpbmc7XG4gICAgQElucHV0KCkgdHlwZTogU2VuZFR5cGU7XG5cbiAgICBAT3V0cHV0KCkgb25TYXZlZFNlbmQgPSBuZXcgRXZlbnRFbWl0dGVyPFNlbmRWaWV3PigpO1xuICAgIEBPdXRwdXQoKSBvbkRlbGV0ZWRTZW5kID0gbmV3IEV2ZW50RW1pdHRlcjxTZW5kVmlldz4oKTtcbiAgICBAT3V0cHV0KCkgb25DYW5jZWxsZWQgPSBuZXcgRXZlbnRFbWl0dGVyPFNlbmRWaWV3PigpO1xuXG4gICAgY29weUxpbmsgPSBmYWxzZTtcbiAgICBkaXNhYmxlU2VuZCA9IGZhbHNlO1xuICAgIGRpc2FibGVIaWRlRW1haWwgPSBmYWxzZTtcbiAgICBzZW5kOiBTZW5kVmlldztcbiAgICBkZWxldGlvbkRhdGU6IHN0cmluZztcbiAgICBleHBpcmF0aW9uRGF0ZTogc3RyaW5nO1xuICAgIGhhc1Bhc3N3b3JkOiBib29sZWFuO1xuICAgIHBhc3N3b3JkOiBzdHJpbmc7XG4gICAgc2hvd1Bhc3N3b3JkID0gZmFsc2U7XG4gICAgZm9ybVByb21pc2U6IFByb21pc2U8YW55PjtcbiAgICBkZWxldGVQcm9taXNlOiBQcm9taXNlPGFueT47XG4gICAgc2VuZFR5cGUgPSBTZW5kVHlwZTtcbiAgICB0eXBlT3B0aW9uczogYW55W107XG4gICAgY2FuQWNjZXNzUHJlbWl1bSA9IHRydWU7XG4gICAgZW1haWxWZXJpZmllZCA9IHRydWU7XG4gICAgYWxlcnRTaG93biA9IGZhbHNlO1xuICAgIHNob3dPcHRpb25zID0gZmFsc2U7XG5cbiAgICBwcml2YXRlIHNlbmRMaW5rQmFzZVVybDogc3RyaW5nO1xuXG4gICAgY29uc3RydWN0b3IocHJvdGVjdGVkIGkxOG5TZXJ2aWNlOiBJMThuU2VydmljZSwgcHJvdGVjdGVkIHBsYXRmb3JtVXRpbHNTZXJ2aWNlOiBQbGF0Zm9ybVV0aWxzU2VydmljZSxcbiAgICAgICAgcHJvdGVjdGVkIGVudmlyb25tZW50U2VydmljZTogRW52aXJvbm1lbnRTZXJ2aWNlLCBwcm90ZWN0ZWQgZGF0ZVBpcGU6IERhdGVQaXBlLFxuICAgICAgICBwcm90ZWN0ZWQgc2VuZFNlcnZpY2U6IFNlbmRTZXJ2aWNlLCBwcm90ZWN0ZWQgdXNlclNlcnZpY2U6IFVzZXJTZXJ2aWNlLFxuICAgICAgICBwcm90ZWN0ZWQgbWVzc2FnaW5nU2VydmljZTogTWVzc2FnaW5nU2VydmljZSwgcHJvdGVjdGVkIHBvbGljeVNlcnZpY2U6IFBvbGljeVNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgbG9nU2VydmljZTogTG9nU2VydmljZSkge1xuICAgICAgICB0aGlzLnR5cGVPcHRpb25zID0gW1xuICAgICAgICAgICAgeyBuYW1lOiBpMThuU2VydmljZS50KCdzZW5kVHlwZUZpbGUnKSwgdmFsdWU6IFNlbmRUeXBlLkZpbGUgfSxcbiAgICAgICAgICAgIHsgbmFtZTogaTE4blNlcnZpY2UudCgnc2VuZFR5cGVUZXh0JyksIHZhbHVlOiBTZW5kVHlwZS5UZXh0IH0sXG4gICAgICAgIF07XG4gICAgICAgIHRoaXMuc2VuZExpbmtCYXNlVXJsID0gdGhpcy5lbnZpcm9ubWVudFNlcnZpY2UuZ2V0U2VuZFVybCgpO1xuICAgIH1cblxuICAgIGdldCBsaW5rKCk6IHN0cmluZyB7XG4gICAgICAgIGlmICh0aGlzLnNlbmQuaWQgIT0gbnVsbCAmJiB0aGlzLnNlbmQuYWNjZXNzSWQgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VuZExpbmtCYXNlVXJsICsgdGhpcy5zZW5kLmFjY2Vzc0lkICsgJy8nICsgdGhpcy5zZW5kLnVybEI2NEtleTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBnZXQgaXNTYWZhcmkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBsYXRmb3JtVXRpbHNTZXJ2aWNlLmlzU2FmYXJpKCk7XG4gICAgfVxuXG4gICAgZ2V0IGlzRGF0ZVRpbWVMb2NhbFN1cHBvcnRlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICEodGhpcy5wbGF0Zm9ybVV0aWxzU2VydmljZS5pc0ZpcmVmb3goKSB8fCB0aGlzLnBsYXRmb3JtVXRpbHNTZXJ2aWNlLmlzU2FmYXJpKCkpO1xuICAgIH1cblxuICAgIGFzeW5jIG5nT25Jbml0KCkge1xuICAgICAgICBhd2FpdCB0aGlzLmxvYWQoKTtcbiAgICB9XG5cbiAgICBnZXQgZWRpdE1vZGUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlbmRJZCAhPSBudWxsO1xuICAgIH1cblxuICAgIGdldCB0aXRsZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5pMThuU2VydmljZS50KFxuICAgICAgICAgICAgdGhpcy5lZGl0TW9kZSA/XG4gICAgICAgICAgICAgICAgJ2VkaXRTZW5kJyA6XG4gICAgICAgICAgICAgICAgJ2NyZWF0ZVNlbmQnXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgc2V0RGF0ZXMoZXZlbnQ6IHtkZWxldGlvbkRhdGU6IHN0cmluZywgZXhwaXJhdGlvbkRhdGU6IHN0cmluZ30pIHtcbiAgICAgICAgdGhpcy5kZWxldGlvbkRhdGUgPSBldmVudC5kZWxldGlvbkRhdGU7XG4gICAgICAgIHRoaXMuZXhwaXJhdGlvbkRhdGUgPSBldmVudC5leHBpcmF0aW9uRGF0ZTtcbiAgICB9XG5cbiAgICBhc3luYyBsb2FkKCkge1xuICAgICAgICB0aGlzLmRpc2FibGVTZW5kID0gYXdhaXQgdGhpcy5wb2xpY3lTZXJ2aWNlLnBvbGljeUFwcGxpZXNUb1VzZXIoUG9saWN5VHlwZS5EaXNhYmxlU2VuZCk7XG4gICAgICAgIHRoaXMuZGlzYWJsZUhpZGVFbWFpbCA9IGF3YWl0IHRoaXMucG9saWN5U2VydmljZS5wb2xpY3lBcHBsaWVzVG9Vc2VyKFBvbGljeVR5cGUuU2VuZE9wdGlvbnMsXG4gICAgICAgICAgICBwID0+IHAuZGF0YS5kaXNhYmxlSGlkZUVtYWlsKTtcblxuICAgICAgICB0aGlzLmNhbkFjY2Vzc1ByZW1pdW0gPSBhd2FpdCB0aGlzLnVzZXJTZXJ2aWNlLmNhbkFjY2Vzc1ByZW1pdW0oKTtcbiAgICAgICAgdGhpcy5lbWFpbFZlcmlmaWVkID0gYXdhaXQgdGhpcy51c2VyU2VydmljZS5nZXRFbWFpbFZlcmlmaWVkKCk7XG4gICAgICAgIGlmICghdGhpcy5jYW5BY2Nlc3NQcmVtaXVtIHx8ICF0aGlzLmVtYWlsVmVyaWZpZWQpIHtcbiAgICAgICAgICAgIHRoaXMudHlwZSA9IFNlbmRUeXBlLlRleHQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5zZW5kID09IG51bGwpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmVkaXRNb2RlKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2VuZCA9IGF3YWl0IHRoaXMubG9hZFNlbmQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbmQgPSBhd2FpdCBzZW5kLmRlY3J5cHQoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZW5kID0gbmV3IFNlbmRWaWV3KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZW5kLnR5cGUgPSB0aGlzLnR5cGUgPT0gbnVsbCA/IFNlbmRUeXBlLkZpbGUgOiB0aGlzLnR5cGU7XG4gICAgICAgICAgICAgICAgdGhpcy5zZW5kLmZpbGUgPSBuZXcgU2VuZEZpbGVWaWV3KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZW5kLnRleHQgPSBuZXcgU2VuZFRleHRWaWV3KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZW5kLmRlbGV0aW9uRGF0ZSA9IG5ldyBEYXRlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZW5kLmRlbGV0aW9uRGF0ZS5zZXREYXRlKHRoaXMuc2VuZC5kZWxldGlvbkRhdGUuZ2V0RGF0ZSgpICsgNyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmhhc1Bhc3N3b3JkID0gdGhpcy5zZW5kLnBhc3N3b3JkICE9IG51bGwgJiYgdGhpcy5zZW5kLnBhc3N3b3JkLnRyaW0oKSAhPT0gJyc7XG4gICAgfVxuXG4gICAgYXN5bmMgc3VibWl0KCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICBpZiAodGhpcy5kaXNhYmxlU2VuZCkge1xuICAgICAgICAgICAgdGhpcy5wbGF0Zm9ybVV0aWxzU2VydmljZS5zaG93VG9hc3QoJ2Vycm9yJywgdGhpcy5pMThuU2VydmljZS50KCdlcnJvck9jY3VycmVkJyksXG4gICAgICAgICAgICAgICAgdGhpcy5pMThuU2VydmljZS50KCdzZW5kRGlzYWJsZWRXYXJuaW5nJykpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuc2VuZC5uYW1lID09IG51bGwgfHwgdGhpcy5zZW5kLm5hbWUgPT09ICcnKSB7XG4gICAgICAgICAgICB0aGlzLnBsYXRmb3JtVXRpbHNTZXJ2aWNlLnNob3dUb2FzdCgnZXJyb3InLCB0aGlzLmkxOG5TZXJ2aWNlLnQoJ2Vycm9yT2NjdXJyZWQnKSxcbiAgICAgICAgICAgICAgICB0aGlzLmkxOG5TZXJ2aWNlLnQoJ25hbWVSZXF1aXJlZCcpKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBmaWxlOiBGaWxlID0gbnVsbDtcbiAgICAgICAgaWYgKHRoaXMuc2VuZC50eXBlID09PSBTZW5kVHlwZS5GaWxlICYmICF0aGlzLmVkaXRNb2RlKSB7XG4gICAgICAgICAgICBjb25zdCBmaWxlRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmlsZScpIGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgICAgICAgICBjb25zdCBmaWxlcyA9IGZpbGVFbC5maWxlcztcbiAgICAgICAgICAgIGlmIChmaWxlcyA9PSBudWxsIHx8IGZpbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMucGxhdGZvcm1VdGlsc1NlcnZpY2Uuc2hvd1RvYXN0KCdlcnJvcicsIHRoaXMuaTE4blNlcnZpY2UudCgnZXJyb3JPY2N1cnJlZCcpLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmkxOG5TZXJ2aWNlLnQoJ3NlbGVjdEZpbGUnKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmaWxlID0gZmlsZXNbMF07XG4gICAgICAgICAgICBpZiAoZmlsZXNbMF0uc2l6ZSA+IDUyNDI4ODAwMCkgeyAvLyA1MDAgTUJcbiAgICAgICAgICAgICAgICB0aGlzLnBsYXRmb3JtVXRpbHNTZXJ2aWNlLnNob3dUb2FzdCgnZXJyb3InLCB0aGlzLmkxOG5TZXJ2aWNlLnQoJ2Vycm9yT2NjdXJyZWQnKSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pMThuU2VydmljZS50KCdtYXhGaWxlU2l6ZScpKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5wYXNzd29yZCAhPSBudWxsICYmIHRoaXMucGFzc3dvcmQudHJpbSgpID09PSAnJykge1xuICAgICAgICAgICAgdGhpcy5wYXNzd29yZCA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmZvcm1Qcm9taXNlID0gdGhpcy5lbmNyeXB0U2VuZChmaWxlKVxuICAgICAgICAgICAgLnRoZW4oYXN5bmMgZW5jU2VuZCA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdXBsb2FkUHJvbWlzZSA9IHRoaXMuc2VuZFNlcnZpY2Uuc2F2ZVdpdGhTZXJ2ZXIoZW5jU2VuZCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgdXBsb2FkUHJvbWlzZTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zZW5kLmlkID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZW5kLmlkID0gZW5jU2VuZFswXS5pZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2VuZC5hY2Nlc3NJZCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VuZC5hY2Nlc3NJZCA9IGVuY1NlbmRbMF0uYWNjZXNzSWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMub25TYXZlZFNlbmQuZW1pdCh0aGlzLnNlbmQpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvcHlMaW5rICYmIHRoaXMubGluayAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvcHlTdWNjZXNzID0gYXdhaXQgdGhpcy5jb3B5TGlua1RvQ2xpcGJvYXJkKHRoaXMubGluayk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb3B5U3VjY2VzcyA/PyB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsYXRmb3JtVXRpbHNTZXJ2aWNlLnNob3dUb2FzdCgnc3VjY2VzcycsIG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pMThuU2VydmljZS50KHRoaXMuZWRpdE1vZGUgPyAnZWRpdGVkU2VuZCcgOiAnY3JlYXRlZFNlbmQnKSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnBsYXRmb3JtVXRpbHNTZXJ2aWNlLnNob3dEaWFsb2coXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pMThuU2VydmljZS50KHRoaXMuZWRpdE1vZGUgPyAnZWRpdGVkU2VuZCcgOiAnY3JlYXRlZFNlbmQnKSwgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmkxOG5TZXJ2aWNlLnQoJ29rJyksIG51bGwsICdzdWNjZXNzJywgbnVsbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNvcHlMaW5rVG9DbGlwYm9hcmQodGhpcy5saW5rKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5mb3JtUHJvbWlzZTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ1NlcnZpY2UuZXJyb3IoZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGFzeW5jIGNvcHlMaW5rVG9DbGlwYm9hcmQobGluazogc3RyaW5nKTogUHJvbWlzZTx2b2lkIHwgYm9vbGVhbj4ge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMucGxhdGZvcm1VdGlsc1NlcnZpY2UuY29weVRvQ2xpcGJvYXJkKGxpbmspKTtcbiAgICB9XG5cbiAgICBhc3luYyBkZWxldGUoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGlmICh0aGlzLmRlbGV0ZVByb21pc2UgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbmZpcm1lZCA9IGF3YWl0IHRoaXMucGxhdGZvcm1VdGlsc1NlcnZpY2Uuc2hvd0RpYWxvZyhcbiAgICAgICAgICAgIHRoaXMuaTE4blNlcnZpY2UudCgnZGVsZXRlU2VuZENvbmZpcm1hdGlvbicpLFxuICAgICAgICAgICAgdGhpcy5pMThuU2VydmljZS50KCdkZWxldGVTZW5kJyksXG4gICAgICAgICAgICB0aGlzLmkxOG5TZXJ2aWNlLnQoJ3llcycpLCB0aGlzLmkxOG5TZXJ2aWNlLnQoJ25vJyksICd3YXJuaW5nJyk7XG4gICAgICAgIGlmICghY29uZmlybWVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5kZWxldGVQcm9taXNlID0gdGhpcy5zZW5kU2VydmljZS5kZWxldGVXaXRoU2VydmVyKHRoaXMuc2VuZC5pZCk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmRlbGV0ZVByb21pc2U7XG4gICAgICAgICAgICB0aGlzLnBsYXRmb3JtVXRpbHNTZXJ2aWNlLnNob3dUb2FzdCgnc3VjY2VzcycsIG51bGwsIHRoaXMuaTE4blNlcnZpY2UudCgnZGVsZXRlZFNlbmQnKSk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmxvYWQoKTtcbiAgICAgICAgICAgIHRoaXMub25EZWxldGVkU2VuZC5lbWl0KHRoaXMuc2VuZCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5sb2dTZXJ2aWNlLmVycm9yKGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHR5cGVDaGFuZ2VkKCkge1xuICAgICAgICBpZiAodGhpcy5zZW5kLnR5cGUgPT09IFNlbmRUeXBlLkZpbGUgJiYgIXRoaXMuYWxlcnRTaG93bikge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmNhbkFjY2Vzc1ByZW1pdW0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFsZXJ0U2hvd24gPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnaW5nU2VydmljZS5zZW5kKCdwcmVtaXVtUmVxdWlyZWQnKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuZW1haWxWZXJpZmllZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWxlcnRTaG93biA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdpbmdTZXJ2aWNlLnNlbmQoJ2VtYWlsVmVyaWZpY2F0aW9uUmVxdWlyZWQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHRvZ2dsZU9wdGlvbnMoKSB7XG4gICAgICAgIHRoaXMuc2hvd09wdGlvbnMgPSAhdGhpcy5zaG93T3B0aW9ucztcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgYXN5bmMgbG9hZFNlbmQoKTogUHJvbWlzZTxTZW5kPiB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlbmRTZXJ2aWNlLmdldCh0aGlzLnNlbmRJZCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGFzeW5jIGVuY3J5cHRTZW5kKGZpbGU6IEZpbGUpOiBQcm9taXNlPFtTZW5kLCBFbmNBcnJheUJ1ZmZlcl0+IHtcbiAgICAgICAgY29uc3Qgc2VuZERhdGEgPSBhd2FpdCB0aGlzLnNlbmRTZXJ2aWNlLmVuY3J5cHQodGhpcy5zZW5kLCBmaWxlLCB0aGlzLnBhc3N3b3JkLCBudWxsKTtcblxuICAgICAgICAvLyBQYXJzZSBkYXRlc1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgc2VuZERhdGFbMF0uZGVsZXRpb25EYXRlID0gdGhpcy5kZWxldGlvbkRhdGUgPT0gbnVsbCA/IG51bGwgOiBuZXcgRGF0ZSh0aGlzLmRlbGV0aW9uRGF0ZSk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgc2VuZERhdGFbMF0uZGVsZXRpb25EYXRlID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgc2VuZERhdGFbMF0uZXhwaXJhdGlvbkRhdGUgPSB0aGlzLmV4cGlyYXRpb25EYXRlID09IG51bGwgPyBudWxsIDogbmV3IERhdGUodGhpcy5leHBpcmF0aW9uRGF0ZSk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgc2VuZERhdGFbMF0uZXhwaXJhdGlvbkRhdGUgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHNlbmREYXRhO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCB0b2dnbGVQYXNzd29yZFZpc2libGUoKSB7XG4gICAgICAgIHRoaXMuc2hvd1Bhc3N3b3JkID0gIXRoaXMuc2hvd1Bhc3N3b3JkO1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGFzc3dvcmQnKS5mb2N1cygpO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IERhdGVQaXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gICAgRGlyZWN0aXZlLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBJbnB1dCxcbiAgICBPbkluaXQsXG4gICAgT3V0cHV0XG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuaW1wb3J0IHsgSTE4blNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL2kxOG4uc2VydmljZSc7XG5pbXBvcnQgeyBQbGF0Zm9ybVV0aWxzU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvcGxhdGZvcm1VdGlscy5zZXJ2aWNlJztcblxuLy8gRGlmZmVyZW50IEJyb3dzZXJQYXRoID0gZGlmZmVyZW50IGNvbnRyb2xzLlxuZW51bSBCcm93c2VyUGF0aCB7XG4gICAgLy8gTmF0aXZlIGRhdGV0aW1lLWxvY2FsZS5cbiAgICAvLyBXZSBhcmUgaGFwcHkuXG4gICAgRGVmYXVsdCA9ICdkZWZhdWx0JyxcblxuICAgIC8vIE5hdGl2ZSBkYXRlIGFuZCB0aW1lIGlucHV0cywgYnV0IG5vIGRhdGV0aW1lLWxvY2FsZS5cbiAgICAvLyBXZSB1c2UgaW5kaXZpZHVhbCBkYXRlIGFuZCB0aW1lIGlucHV0cyBhbmQgY3JlYXRlIGEgZGF0ZXRpbWUgcHJvZ3JhbWF0aWNhbGx5IG9uIHN1Ym1pdC5cbiAgICBGaXJlZm94ID0gJ2ZpcmVmb3gnLFxuXG4gICAgLy8gTm8gbmF0aXZlIGRhdGUsIHRpbWUsIG9yIGRhdGV0aW1lLWxvY2FsZSBpbnB1dHMuXG4gICAgLy8gV2UgdXNlIGEgcG9seWZpbGwgZm9yIGRhdGVzIGFuZCBhIGRyb3Bkb3duIGZvciB0aW1lcy5cbiAgICBTYWZhcmkgPSAnc2FmYXJpJyxcbn1cblxuZW51bSBEYXRlRmllbGQge1xuICAgIERlbGV0aW9uRGF0ZSA9ICdkZWxldGlvbicsXG4gICAgRXhwcmlhdGlvbkRhdGUgPSAnZXhwaXJhdGlvbicsXG59XG5cbi8vIFZhbHVlID0gaG91cnNcbmVudW0gRGF0ZVByZXNldCB7XG4gICAgT25lSG91ciA9IDEsXG4gICAgT25lRGF5ID0gMjQsXG4gICAgVHdvRGF5cyA9IDQ4LFxuICAgIFRocmVlRGF5cyA9IDcyLFxuICAgIFNldmVuRGF5cyA9IDE2OCxcbiAgICBUaGlydHlEYXlzID0gNzIwLFxuICAgIEN1c3RvbSA9IDAsXG4gICAgTmV2ZXIgPSBudWxsLFxufVxuXG4vLyBUaW1lT3B0aW9uIGlzIHVzZWQgZm9yIHRoZSBkcm9wZG93biBpbXBsZW1lbnRhdGlvbiBvZiBjdXN0b20gdGltZXNcbi8vIHR3ZWx2ZUhvdXIgPSBkaXNwbGF5ZWQgdGltZTsgdHdlbnR5Rm91ckhvdXIgPSB0aW1lIHVzZWQgaW4gbG9naWNcbmludGVyZmFjZSBUaW1lT3B0aW9uIHtcbiAgICB0d2VsdmVIb3VyOiBzdHJpbmc7XG4gICAgdHdlbnR5Rm91ckhvdXI6IHN0cmluZztcbn1cblxuQERpcmVjdGl2ZSgpXG5leHBvcnQgY2xhc3MgRWZmbHV4RGF0ZXNDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICAgIEBJbnB1dCgpIHJlYWRvbmx5IGluaXRpYWxEZWxldGlvbkRhdGU6IERhdGU7XG4gICAgQElucHV0KCkgcmVhZG9ubHkgaW5pdGlhbEV4cGlyYXRpb25EYXRlOiBEYXRlO1xuICAgIEBJbnB1dCgpIHJlYWRvbmx5IGVkaXRNb2RlOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIHJlYWRvbmx5IGRpc2FibGVkOiBib29sZWFuO1xuXG4gICAgQE91dHB1dCgpIGRhdGVzQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8e2RlbGV0aW9uRGF0ZTogc3RyaW5nLCBleHBpcmF0aW9uRGF0ZTogc3RyaW5nfT4oKTtcblxuICAgIGdldCBicm93c2VyUGF0aCgpOiBCcm93c2VyUGF0aCB7XG4gICAgICAgIGlmICh0aGlzLnBsYXRmb3JtVXRpbHNTZXJ2aWNlLmlzRmlyZWZveCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gQnJvd3NlclBhdGguRmlyZWZveDtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnBsYXRmb3JtVXRpbHNTZXJ2aWNlLmlzU2FmYXJpKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBCcm93c2VyUGF0aC5TYWZhcmk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEJyb3dzZXJQYXRoLkRlZmF1bHQ7XG4gICAgfVxuXG4gICAgZGF0ZXNGb3JtID0gbmV3IEZvcm1Hcm91cCh7XG4gICAgICAgIHNlbGVjdGVkRGVsZXRpb25EYXRlUHJlc2V0OiBuZXcgRm9ybUNvbnRyb2woKSxcbiAgICAgICAgc2VsZWN0ZWRFeHBpcmF0aW9uRGF0ZVByZXNldDogbmV3IEZvcm1Db250cm9sKCksXG4gICAgICAgIGRlZmF1bHREZWxldGlvbkRhdGVUaW1lOiBuZXcgRm9ybUNvbnRyb2woKSxcbiAgICAgICAgZGVmYXVsdEV4cGlyYXRpb25EYXRlVGltZTogbmV3IEZvcm1Db250cm9sKCksXG4gICAgICAgIGZhbGxiYWNrRGVsZXRpb25EYXRlOiBuZXcgRm9ybUNvbnRyb2woKSxcbiAgICAgICAgZmFsbGJhY2tEZWxldGlvblRpbWU6IG5ldyBGb3JtQ29udHJvbCgpLFxuICAgICAgICBmYWxsYmFja0V4cGlyYXRpb25EYXRlOiBuZXcgRm9ybUNvbnRyb2woKSxcbiAgICAgICAgZmFsbGJhY2tFeHBpcmF0aW9uVGltZTogbmV3IEZvcm1Db250cm9sKCksXG4gICAgfSk7XG5cbiAgICBkZWxldGlvbkRhdGVQcmVzZXRzOiBhbnlbXSA9IFtcbiAgICAgICAgICAgIHsgbmFtZTogdGhpcy5pMThuU2VydmljZS50KCdvbmVIb3VyJyksIHZhbHVlOiBEYXRlUHJlc2V0Lk9uZUhvdXIgfSxcbiAgICAgICAgICAgIHsgbmFtZTogdGhpcy5pMThuU2VydmljZS50KCdvbmVEYXknKSwgdmFsdWU6IERhdGVQcmVzZXQuT25lRGF5IH0sXG4gICAgICAgICAgICB7IG5hbWU6IHRoaXMuaTE4blNlcnZpY2UudCgnZGF5cycsICcyJyksIHZhbHVlOiBEYXRlUHJlc2V0LlR3b0RheXMgfSxcbiAgICAgICAgICAgIHsgbmFtZTogdGhpcy5pMThuU2VydmljZS50KCdkYXlzJywgJzMnKSwgdmFsdWU6IERhdGVQcmVzZXQuVGhyZWVEYXlzIH0sXG4gICAgICAgICAgICB7IG5hbWU6IHRoaXMuaTE4blNlcnZpY2UudCgnZGF5cycsICc3JyksIHZhbHVlOiBEYXRlUHJlc2V0LlNldmVuRGF5cyB9LFxuICAgICAgICAgICAgeyBuYW1lOiB0aGlzLmkxOG5TZXJ2aWNlLnQoJ2RheXMnLCAnMzAnKSwgdmFsdWU6IERhdGVQcmVzZXQuVGhpcnR5RGF5cyB9LFxuICAgICAgICAgICAgeyBuYW1lOiB0aGlzLmkxOG5TZXJ2aWNlLnQoJ2N1c3RvbScpLCB2YWx1ZTogRGF0ZVByZXNldC5DdXN0b20gfSxcbiAgICBdO1xuXG4gICAgZXhwaXJhdGlvbkRhdGVQcmVzZXRzOiBhbnlbXSA9IFtcbiAgICAgICAgICAgIHsgbmFtZTogdGhpcy5pMThuU2VydmljZS50KCduZXZlcicpLCB2YWx1ZTogRGF0ZVByZXNldC5OZXZlciB9LFxuICAgIF0uY29uY2F0KFsuLi50aGlzLmRlbGV0aW9uRGF0ZVByZXNldHNdKTtcblxuICAgIGdldCBzZWxlY3RlZERlbGV0aW9uRGF0ZVByZXNldCgpOiBGb3JtQ29udHJvbCB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGVzRm9ybS5nZXQoJ3NlbGVjdGVkRGVsZXRpb25EYXRlUHJlc2V0JykgYXMgRm9ybUNvbnRyb2w7XG4gICAgfVxuXG4gICAgZ2V0IHNlbGVjdGVkRXhwaXJhdGlvbkRhdGVQcmVzZXQoKTogRm9ybUNvbnRyb2wge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRlc0Zvcm0uZ2V0KCdzZWxlY3RlZEV4cGlyYXRpb25EYXRlUHJlc2V0JykgYXMgRm9ybUNvbnRyb2w7XG4gICAgfVxuXG4gICAgZ2V0IGRlZmF1bHREZWxldGlvbkRhdGVUaW1lKCk6IEZvcm1Db250cm9sIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0ZXNGb3JtLmdldCgnZGVmYXVsdERlbGV0aW9uRGF0ZVRpbWUnKSBhcyBGb3JtQ29udHJvbDtcbiAgICB9XG5cbiAgICBnZXQgZGVmYXVsdEV4cGlyYXRpb25EYXRlVGltZSgpOiBGb3JtQ29udHJvbCB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGVzRm9ybS5nZXQoJ2RlZmF1bHRFeHBpcmF0aW9uRGF0ZVRpbWUnKSBhcyBGb3JtQ29udHJvbDtcbiAgICB9XG5cbiAgICBnZXQgZmFsbGJhY2tEZWxldGlvbkRhdGUoKTogRm9ybUNvbnRyb2wge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRlc0Zvcm0uZ2V0KCdmYWxsYmFja0RlbGV0aW9uRGF0ZScpIGFzIEZvcm1Db250cm9sO1xuICAgIH1cblxuICAgIGdldCBmYWxsYmFja0RlbGV0aW9uVGltZSgpOiBGb3JtQ29udHJvbCB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGVzRm9ybS5nZXQoJ2ZhbGxiYWNrRGVsZXRpb25UaW1lJykgYXMgRm9ybUNvbnRyb2w7XG4gICAgfVxuXG4gICAgZ2V0IGZhbGxiYWNrRXhwaXJhdGlvbkRhdGUoKTogRm9ybUNvbnRyb2wge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRlc0Zvcm0uZ2V0KCdmYWxsYmFja0V4cGlyYXRpb25EYXRlJykgYXMgRm9ybUNvbnRyb2w7XG4gICAgfVxuXG4gICAgZ2V0IGZhbGxiYWNrRXhwaXJhdGlvblRpbWUoKTogRm9ybUNvbnRyb2wge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRlc0Zvcm0uZ2V0KCdmYWxsYmFja0V4cGlyYXRpb25UaW1lJykgYXMgRm9ybUNvbnRyb2w7XG4gICAgfVxuXG4gICAgLy8gU2hvdWxkIGJlIGFibGUgdG8gY2FsbCB0aGVzZSBhdCBhbnkgdGltZSBhbmQgY29tcHV0ZSBhIHN1Ym1pdGFibGUgdmFsdWVcbiAgICBnZXQgZm9ybWF0dGVkRGVsZXRpb25EYXRlKCk6IHN0cmluZyB7XG4gICAgICAgIHN3aXRjaCAodGhpcy5zZWxlY3RlZERlbGV0aW9uRGF0ZVByZXNldC52YWx1ZSBhcyBEYXRlUHJlc2V0KSB7XG4gICAgICAgICAgICBjYXNlIERhdGVQcmVzZXQuTmV2ZXI6XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERlbGV0aW9uRGF0ZVByZXNldC5zZXRWYWx1ZShEYXRlUHJlc2V0LlNldmVuRGF5cyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZm9ybWF0dGVkRGVsZXRpb25EYXRlO1xuICAgICAgICAgICAgY2FzZSBEYXRlUHJlc2V0LkN1c3RvbTpcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMuYnJvd3NlclBhdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBCcm93c2VyUGF0aC5TYWZhcmk6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgQnJvd3NlclBhdGguRmlyZWZveDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmZhbGxiYWNrRGVsZXRpb25EYXRlLnZhbHVlICsgJ1QnICsgdGhpcy5mYWxsYmFja0RlbGV0aW9uVGltZS52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRlZmF1bHREZWxldGlvbkRhdGVUaW1lLnZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBtaWxpc2Vjb25kcyA9IG5vdy5zZXRUaW1lKG5vdy5nZXRUaW1lKCkgK1xuICAgICAgICAgICAgICAgICAgICAodGhpcy5zZWxlY3RlZERlbGV0aW9uRGF0ZVByZXNldC52YWx1ZSBhcyBudW1iZXIgKiA2MCAqIDYwICogMTAwMCkpIDtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERhdGUobWlsaXNlY29uZHMpLnRvU3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXQgZm9ybWF0dGVkRXhwaXJhdGlvbkRhdGUoKTogc3RyaW5nIHtcbiAgICAgICAgc3dpdGNoICh0aGlzLnNlbGVjdGVkRXhwaXJhdGlvbkRhdGVQcmVzZXQudmFsdWUgYXMgRGF0ZVByZXNldCkge1xuICAgICAgICAgICAgY2FzZSBEYXRlUHJlc2V0Lk5ldmVyOlxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY2FzZSBEYXRlUHJlc2V0LkN1c3RvbTpcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMuYnJvd3NlclBhdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBCcm93c2VyUGF0aC5TYWZhcmk6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgQnJvd3NlclBhdGguRmlyZWZveDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoIXRoaXMuZmFsbGJhY2tFeHBpcmF0aW9uRGF0ZS52YWx1ZSB8fCAhdGhpcy5mYWxsYmFja0V4cGlyYXRpb25UaW1lLnZhbHVlKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZWRpdE1vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmZhbGxiYWNrRXhwaXJhdGlvbkRhdGUudmFsdWUgKyAnVCcgKyB0aGlzLmZhbGxiYWNrRXhwaXJhdGlvblRpbWUudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZGVmYXVsdEV4cGlyYXRpb25EYXRlVGltZS52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGVmYXVsdEV4cGlyYXRpb25EYXRlVGltZS52YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgbWlsaXNlY29uZHMgPSBub3cuc2V0VGltZShub3cuZ2V0VGltZSgpICtcbiAgICAgICAgICAgICAgICAgICAgKHRoaXMuc2VsZWN0ZWRFeHBpcmF0aW9uRGF0ZVByZXNldC52YWx1ZSBhcyBudW1iZXIgKiA2MCAqIDYwICogMTAwMCkpO1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZShtaWxpc2Vjb25kcykudG9TdHJpbmcoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvL1xuXG4gICAgZ2V0IHNhZmFyaURlbGV0aW9uVGltZVByZXNldE9wdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNhZmFyaVRpbWVQcmVzZXRPcHRpb25zKERhdGVGaWVsZC5EZWxldGlvbkRhdGUpO1xuICAgIH1cblxuICAgIGdldCBzYWZhcmlFeHBpcmF0aW9uVGltZVByZXNldE9wdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNhZmFyaVRpbWVQcmVzZXRPcHRpb25zKERhdGVGaWVsZC5FeHByaWF0aW9uRGF0ZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXQgbmV4dFdlZWsoKTogRGF0ZSB7XG4gICAgICAgIGNvbnN0IG5leHRXZWVrID0gbmV3IERhdGUoKTtcbiAgICAgICAgbmV4dFdlZWsuc2V0RGF0ZShuZXh0V2Vlay5nZXREYXRlKCkgKyA3KTtcbiAgICAgICAgcmV0dXJuIG5leHRXZWVrO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBpMThuU2VydmljZTogSTE4blNlcnZpY2UsIHByb3RlY3RlZCBwbGF0Zm9ybVV0aWxzU2VydmljZTogUGxhdGZvcm1VdGlsc1NlcnZpY2UsXG4gICAgICAgIHByb3RlY3RlZCBkYXRlUGlwZTogRGF0ZVBpcGUpIHtcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZXRJbml0aWFsRm9ybVZhbHVlcygpO1xuICAgICAgICB0aGlzLmVtaXREYXRlcygpO1xuICAgICAgICB0aGlzLmRhdGVzRm9ybS52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZW1pdERhdGVzKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIG9uRGVsZXRpb25EYXRlUHJlc2V0U2VsZWN0KHZhbHVlOiBEYXRlUHJlc2V0KSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWREZWxldGlvbkRhdGVQcmVzZXQuc2V0VmFsdWUodmFsdWUpO1xuICAgIH1cblxuICAgIGNsZWFyRXhwaXJhdGlvbigpIHtcbiAgICAgICAgc3dpdGNoICh0aGlzLmJyb3dzZXJQYXRoKSB7XG4gICAgICAgICAgICBjYXNlIEJyb3dzZXJQYXRoLlNhZmFyaTpcbiAgICAgICAgICAgIGNhc2UgQnJvd3NlclBhdGguRmlyZWZveDpcbiAgICAgICAgICAgICAgICB0aGlzLmZhbGxiYWNrRXhwaXJhdGlvbkRhdGUuc2V0VmFsdWUobnVsbCk7XG4gICAgICAgICAgICAgICAgdGhpcy5mYWxsYmFja0V4cGlyYXRpb25UaW1lLnNldFZhbHVlKG51bGwpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBCcm93c2VyUGF0aC5EZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdEV4cGlyYXRpb25EYXRlVGltZS5zZXRWYWx1ZShudWxsKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBlbWl0RGF0ZXMoKSB7XG4gICAgICAgIHRoaXMuZGF0ZXNDaGFuZ2VkLmVtaXQoe1xuICAgICAgICAgICAgZGVsZXRpb25EYXRlOiB0aGlzLmZvcm1hdHRlZERlbGV0aW9uRGF0ZSxcbiAgICAgICAgICAgIGV4cGlyYXRpb25EYXRlOiB0aGlzLmZvcm1hdHRlZEV4cGlyYXRpb25EYXRlLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgc2V0SW5pdGlhbEZvcm1WYWx1ZXMoKSB7XG4gICAgICAgIGlmICh0aGlzLmVkaXRNb2RlKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGVsZXRpb25EYXRlUHJlc2V0LnNldFZhbHVlKERhdGVQcmVzZXQuQ3VzdG9tKTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRFeHBpcmF0aW9uRGF0ZVByZXNldC5zZXRWYWx1ZShEYXRlUHJlc2V0LkN1c3RvbSk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRoaXMuYnJvd3NlclBhdGgpIHtcbiAgICAgICAgICAgICAgICBjYXNlIEJyb3dzZXJQYXRoLlNhZmFyaTpcbiAgICAgICAgICAgICAgICBjYXNlIEJyb3dzZXJQYXRoLkZpcmVmb3g6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmFsbGJhY2tEZWxldGlvbkRhdGUuc2V0VmFsdWUodGhpcy5pbml0aWFsRGVsZXRpb25EYXRlLnRvSVNPU3RyaW5nKCkuc2xpY2UoMCwgMTApKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mYWxsYmFja0RlbGV0aW9uVGltZS5zZXRWYWx1ZSh0aGlzLmluaXRpYWxEZWxldGlvbkRhdGUudG9UaW1lU3RyaW5nKCkuc2xpY2UoMCwgNSkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pbml0aWFsRXhwaXJhdGlvbkRhdGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mYWxsYmFja0V4cGlyYXRpb25EYXRlLnNldFZhbHVlKHRoaXMuaW5pdGlhbEV4cGlyYXRpb25EYXRlLnRvSVNPU3RyaW5nKCkuc2xpY2UoMCwgMTApKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmFsbGJhY2tFeHBpcmF0aW9uVGltZS5zZXRWYWx1ZSh0aGlzLmluaXRpYWxFeHBpcmF0aW9uRGF0ZS50b1RpbWVTdHJpbmcoKS5zbGljZSgwLCA1KSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBCcm93c2VyUGF0aC5EZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pbml0aWFsRXhwaXJhdGlvbkRhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdEV4cGlyYXRpb25EYXRlVGltZS5zZXRWYWx1ZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGVQaXBlLnRyYW5zZm9ybShuZXcgRGF0ZSh0aGlzLmluaXRpYWxFeHBpcmF0aW9uRGF0ZSksICd5eXl5LU1NLWRkVEhIOm1tJykpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdERlbGV0aW9uRGF0ZVRpbWUuc2V0VmFsdWUodGhpcy5kYXRlUGlwZS50cmFuc2Zvcm0obmV3IERhdGUodGhpcy5pbml0aWFsRGVsZXRpb25EYXRlKSwgJ3l5eXktTU0tZGRUSEg6bW0nKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERlbGV0aW9uRGF0ZVByZXNldC5zZXRWYWx1ZShEYXRlUHJlc2V0LlNldmVuRGF5cyk7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkRXhwaXJhdGlvbkRhdGVQcmVzZXQuc2V0VmFsdWUoRGF0ZVByZXNldC5OZXZlcik7XG5cbiAgICAgICAgICAgIHN3aXRjaCAodGhpcy5icm93c2VyUGF0aCkge1xuICAgICAgICAgICAgICAgIGNhc2UgQnJvd3NlclBhdGguU2FmYXJpOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZhbGxiYWNrRGVsZXRpb25EYXRlLnNldFZhbHVlKHRoaXMubmV4dFdlZWsudG9JU09TdHJpbmcoKS5zbGljZSgwLCAxMCkpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZhbGxiYWNrRGVsZXRpb25UaW1lLnNldFZhbHVlKHRoaXMuc2FmYXJpVGltZVByZXNldE9wdGlvbnMoRGF0ZUZpZWxkLkRlbGV0aW9uRGF0ZSlbMV0udHdlbnR5Rm91ckhvdXIpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBzYWZhcmlUaW1lUHJlc2V0T3B0aW9ucyhmaWVsZDogRGF0ZUZpZWxkKTogVGltZU9wdGlvbltdIHtcbiAgICAgICAgLy8gaW5pdCBpbmRpdmlkdWFsIGFycmF5cyBmb3IgbWFqb3Igc29ydCBncm91cHNcbiAgICAgICAgY29uc3Qgbm9vbjogVGltZU9wdGlvbltdID0gW107XG4gICAgICAgIGNvbnN0IG1pZG5pZ2h0OiBUaW1lT3B0aW9uW10gPSBbXTtcbiAgICAgICAgY29uc3QgYW1zOiBUaW1lT3B0aW9uW10gPSBbXTtcbiAgICAgICAgY29uc3QgcG1zOiBUaW1lT3B0aW9uW10gPSBbXTtcblxuICAgICAgICAvLyBkZXRlcm1pbmUgbWludXRlIHNraXAgKDUgbWluLCAxMCBtaW4sIDE1IG1pbiwgZXRjLilcbiAgICAgICAgY29uc3QgbWludXRlSW5jcmVtZW50ZXIgPSAxNTtcblxuICAgICAgICAvLyBsb29wIHRocm91Z2ggZWFjaCBob3VyIG9uIGEgMTIgaG91ciBzeXN0ZW1cbiAgICAgICAgZm9yIChsZXQgaCA9IDE7IGggPD0gMTI7IGgrKykge1xuICAgICAgICAgICAgLy8gbG9vcCB0aHJvdWdoIGVhY2ggbWludXRlIGluIHRoZSBob3VyIHVzaW5nIHRoZSBza2lwIHRvIGluY3JpbWVudFxuICAgICAgICAgICAgZm9yIChsZXQgbSA9IDA7IG0gPCA2MDsgbSArPSBtaW51dGVJbmNyZW1lbnRlcikge1xuICAgICAgICAgICAgICAgIC8vIGluaXQgdGhlIGZpbmFsIHN0cmluZ3MgdGhhdCB3aWxsIGJlIGFkZGVkIHRvIHRoZSBsaXN0c1xuICAgICAgICAgICAgICAgIGxldCBob3VyID0gaC50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgIGxldCBtaW51dGVzID0gbS50b1N0cmluZygpO1xuXG4gICAgICAgICAgICAgICAgLy8gYWRkIHByZXBlbmRpbmcgMHMgdG8gc2luZ2xlIGRpZ2l0IGhvdXJzL21pbnV0ZXNcbiAgICAgICAgICAgICAgICBpZiAoaCA8IDEwKSB7XG4gICAgICAgICAgICAgICAgICAgIGhvdXIgPSAnMCcgKyBob3VyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobSA8IDEwKSB7XG4gICAgICAgICAgICAgICAgICAgIG1pbnV0ZXMgPSAnMCcgKyBtaW51dGVzO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIGJ1aWxkIHRpbWUgc3RyaW5ncyBhbmQgcHVzaCB0byByZWxldmFudCBzb3J0IGdyb3Vwc1xuICAgICAgICAgICAgICAgIGlmIChoID09PSAxMikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBtaWRuaWdodE9wdGlvbjogVGltZU9wdGlvbiA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR3ZWx2ZUhvdXI6IGAke2hvdXJ9OiR7bWludXRlc30gQU1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHdlbnR5Rm91ckhvdXI6IGAwMDoke21pbnV0ZXN9YCxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgbWlkbmlnaHQucHVzaChtaWRuaWdodE9wdGlvbik7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm9vbk9wdGlvbjogVGltZU9wdGlvbiA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR3ZWx2ZUhvdXI6IGAke2hvdXJ9OiR7bWludXRlc30gUE1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHdlbnR5Rm91ckhvdXI6IGAke2hvdXJ9OiR7bWludXRlc31gLFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBub29uLnB1c2gobm9vbk9wdGlvbik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYW1PcHRpb246IFRpbWVPcHRpb24gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0d2VsdmVIb3VyOiBgJHtob3VyfToke21pbnV0ZXN9IEFNYCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR3ZW50eUZvdXJIb3VyOiBgJHtob3VyfToke21pbnV0ZXN9YCxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgYW1zLnB1c2goYW1PcHRpb24pO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBtT3B0aW9uOiBUaW1lT3B0aW9uID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHdlbHZlSG91cjogYCR7aG91cn06JHttaW51dGVzfSBQTWAsXG4gICAgICAgICAgICAgICAgICAgICAgICB0d2VudHlGb3VySG91cjogYCR7aCArIDEyfToke21pbnV0ZXN9YCxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgcG1zLnB1c2gocG1PcHRpb24pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGJyaW5nIGFsbCB0aGUgYXJyYXlzIHRvZ2V0aGVyIGluIHRoZSByaWdodCBvcmRlclxuICAgICAgICBjb25zdCB2YWxpZFRpbWVzID0gWy4uLm1pZG5pZ2h0LCAuLi5hbXMsIC4uLm5vb24sIC4uLnBtc107XG5cbiAgICAgICAgLy8gZGV0ZXJtaW5lIGlmIGFuIHVuc3VwcG9ydGVkIHZhbHVlIGFscmVhZHkgZXhpc3RzIG9uIHRoZSBzZW5kICYgYWRkIHRoYXQgdG8gdGhlIHRvcCBvZiB0aGUgb3B0aW9uIGxpc3RcbiAgICAgICAgLy8gZXhhbXBsZTogaWYgdGhlIFNlbmQgd2FzIGNyZWF0ZWQgd2l0aCBhIGRpZmZlcmVudCBjbGllbnRcbiAgICAgICAgaWYgKGZpZWxkID09PSBEYXRlRmllbGQuRXhwcmlhdGlvbkRhdGUgJiYgdGhpcy5pbml0aWFsRXhwaXJhdGlvbkRhdGUgIT0gbnVsbCAmJiB0aGlzLmVkaXRNb2RlKSB7XG4gICAgICAgICAgICBjb25zdCBwcmV2aW91c1ZhbHVlOiBUaW1lT3B0aW9uID0ge1xuICAgICAgICAgICAgICAgIHR3ZWx2ZUhvdXI6IHRoaXMuZGF0ZVBpcGUudHJhbnNmb3JtKHRoaXMuaW5pdGlhbEV4cGlyYXRpb25EYXRlLCAnaGg6bW0gYScpLFxuICAgICAgICAgICAgICAgIHR3ZW50eUZvdXJIb3VyOiB0aGlzLmRhdGVQaXBlLnRyYW5zZm9ybSh0aGlzLmluaXRpYWxFeHBpcmF0aW9uRGF0ZSwgJ0hIOm1tJyksXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuIFtwcmV2aW91c1ZhbHVlLCB7IHR3ZWx2ZUhvdXI6IG51bGwsIHR3ZW50eUZvdXJIb3VyOiBudWxsIH0sIC4uLnZhbGlkVGltZXNdO1xuICAgICAgICB9IGVsc2UgaWYgKGZpZWxkID09PSBEYXRlRmllbGQuRGVsZXRpb25EYXRlICYmIHRoaXMuaW5pdGlhbERlbGV0aW9uRGF0ZSAhPSBudWxsICYmIHRoaXMuZWRpdE1vZGUpIHtcbiAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzVmFsdWU6IFRpbWVPcHRpb24gPSB7XG4gICAgICAgICAgICAgICAgdHdlbHZlSG91cjogdGhpcy5kYXRlUGlwZS50cmFuc2Zvcm0odGhpcy5pbml0aWFsRGVsZXRpb25EYXRlLCAnaGg6bW0gYScpLFxuICAgICAgICAgICAgICAgIHR3ZW50eUZvdXJIb3VyOiB0aGlzLmRhdGVQaXBlLnRyYW5zZm9ybSh0aGlzLmluaXRpYWxEZWxldGlvbkRhdGUsICdISDptbScpLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJldHVybiBbcHJldmlvdXNWYWx1ZSwgLi4udmFsaWRUaW1lc107XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gW3sgdHdlbHZlSG91cjogbnVsbCwgdHdlbnR5Rm91ckhvdXI6IG51bGwgfSwgLi4udmFsaWRUaW1lc107XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQge1xuICAgIERpcmVjdGl2ZSxcbiAgICBOZ1pvbmUsXG4gICAgT25Jbml0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgUG9saWN5VHlwZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9lbnVtcy9wb2xpY3lUeXBlJztcbmltcG9ydCB7IFNlbmRUeXBlIH0gZnJvbSAnanNsaWItY29tbW9uL2VudW1zL3NlbmRUeXBlJztcblxuaW1wb3J0IHsgU2VuZFZpZXcgfSBmcm9tICdqc2xpYi1jb21tb24vbW9kZWxzL3ZpZXcvc2VuZFZpZXcnO1xuXG5pbXBvcnQgeyBFbnZpcm9ubWVudFNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL2Vudmlyb25tZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgSTE4blNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL2kxOG4uc2VydmljZSc7XG5pbXBvcnQgeyBMb2dTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9sb2cuc2VydmljZSc7XG5pbXBvcnQgeyBQbGF0Zm9ybVV0aWxzU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvcGxhdGZvcm1VdGlscy5zZXJ2aWNlJztcbmltcG9ydCB7IFBvbGljeVNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL3BvbGljeS5zZXJ2aWNlJztcbmltcG9ydCB7IFNlYXJjaFNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL3NlYXJjaC5zZXJ2aWNlJztcbmltcG9ydCB7IFNlbmRTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9zZW5kLnNlcnZpY2UnO1xuaW1wb3J0IHsgVXNlclNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL3VzZXIuc2VydmljZSc7XG5cbkBEaXJlY3RpdmUoKVxuZXhwb3J0IGNsYXNzIFNlbmRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gICAgZGlzYWJsZVNlbmQgPSBmYWxzZTtcbiAgICBzZW5kVHlwZSA9IFNlbmRUeXBlO1xuICAgIGxvYWRlZCA9IGZhbHNlO1xuICAgIGxvYWRpbmcgPSB0cnVlO1xuICAgIHJlZnJlc2hpbmcgPSBmYWxzZTtcbiAgICBleHBpcmVkOiBib29sZWFuID0gZmFsc2U7XG4gICAgdHlwZTogU2VuZFR5cGUgPSBudWxsO1xuICAgIHNlbmRzOiBTZW5kVmlld1tdID0gW107XG4gICAgZmlsdGVyZWRTZW5kczogU2VuZFZpZXdbXSA9IFtdO1xuICAgIHNlYXJjaFRleHQ6IHN0cmluZztcbiAgICBzZWxlY3RlZFR5cGU6IFNlbmRUeXBlO1xuICAgIHNlbGVjdGVkQWxsOiBib29sZWFuO1xuICAgIHNlYXJjaFBsYWNlaG9sZGVyOiBzdHJpbmc7XG4gICAgZmlsdGVyOiAoY2lwaGVyOiBTZW5kVmlldykgPT4gYm9vbGVhbjtcbiAgICBzZWFyY2hQZW5kaW5nID0gZmFsc2U7XG4gICAgaGFzU2VhcmNoZWQgPSBmYWxzZTsgLy8gc2VhcmNoKCkgZnVuY3Rpb24gY2FsbGVkIC0gcmV0dXJucyB0cnVlIGlmIHRleHQgcXVhbGlmaWVzIGZvciBzZWFyY2hcblxuICAgIGFjdGlvblByb21pc2U6IGFueTtcbiAgICBvblN1Y2Nlc3NmdWxSZW1vdmVQYXNzd29yZDogKCkgPT4gUHJvbWlzZTxhbnk+O1xuICAgIG9uU3VjY2Vzc2Z1bERlbGV0ZTogKCkgPT4gUHJvbWlzZTxhbnk+O1xuICAgIG9uU3VjY2Vzc2Z1bExvYWQ6ICgpID0+IFByb21pc2U8YW55PjtcblxuICAgIHByaXZhdGUgc2VhcmNoVGltZW91dDogYW55O1xuXG4gICAgY29uc3RydWN0b3IocHJvdGVjdGVkIHNlbmRTZXJ2aWNlOiBTZW5kU2VydmljZSwgcHJvdGVjdGVkIGkxOG5TZXJ2aWNlOiBJMThuU2VydmljZSxcbiAgICAgICAgcHJvdGVjdGVkIHBsYXRmb3JtVXRpbHNTZXJ2aWNlOiBQbGF0Zm9ybVV0aWxzU2VydmljZSwgcHJvdGVjdGVkIGVudmlyb25tZW50U2VydmljZTogRW52aXJvbm1lbnRTZXJ2aWNlLFxuICAgICAgICBwcm90ZWN0ZWQgbmdab25lOiBOZ1pvbmUsIHByb3RlY3RlZCBzZWFyY2hTZXJ2aWNlOiBTZWFyY2hTZXJ2aWNlLFxuICAgICAgICBwcm90ZWN0ZWQgcG9saWN5U2VydmljZTogUG9saWN5U2VydmljZSwgcHJvdGVjdGVkIHVzZXJTZXJ2aWNlOiBVc2VyU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBsb2dTZXJ2aWNlOiBMb2dTZXJ2aWNlKSB7IH1cblxuICAgIGFzeW5jIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLmRpc2FibGVTZW5kID0gYXdhaXQgdGhpcy5wb2xpY3lTZXJ2aWNlLnBvbGljeUFwcGxpZXNUb1VzZXIoUG9saWN5VHlwZS5EaXNhYmxlU2VuZCk7XG4gICAgfVxuXG4gICAgYXN5bmMgbG9hZChmaWx0ZXI6IChzZW5kOiBTZW5kVmlldykgPT4gYm9vbGVhbiA9IG51bGwpIHtcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcbiAgICAgICAgY29uc3Qgc2VuZHMgPSBhd2FpdCB0aGlzLnNlbmRTZXJ2aWNlLmdldEFsbERlY3J5cHRlZCgpO1xuICAgICAgICB0aGlzLnNlbmRzID0gc2VuZHM7XG4gICAgICAgIGlmICh0aGlzLm9uU3VjY2Vzc2Z1bExvYWQgIT0gbnVsbCkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5vblN1Y2Nlc3NmdWxMb2FkKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBEZWZhdWx0IGFjdGlvblxuICAgICAgICAgICAgdGhpcy5zZWxlY3RBbGwoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5sb2FkZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIGFzeW5jIHJlbG9hZChmaWx0ZXI6IChzZW5kOiBTZW5kVmlldykgPT4gYm9vbGVhbiA9IG51bGwpIHtcbiAgICAgICAgdGhpcy5sb2FkZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zZW5kcyA9IFtdO1xuICAgICAgICBhd2FpdCB0aGlzLmxvYWQoZmlsdGVyKTtcbiAgICB9XG5cbiAgICBhc3luYyByZWZyZXNoKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5yZWZyZXNoaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucmVsb2FkKHRoaXMuZmlsdGVyKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaGluZyA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgYXBwbHlGaWx0ZXIoZmlsdGVyOiAoc2VuZDogU2VuZFZpZXcpID0+IGJvb2xlYW4gPSBudWxsKSB7XG4gICAgICAgIHRoaXMuZmlsdGVyID0gZmlsdGVyO1xuICAgICAgICBhd2FpdCB0aGlzLnNlYXJjaChudWxsKTtcbiAgICB9XG5cbiAgICBhc3luYyBzZWFyY2godGltZW91dDogbnVtYmVyID0gbnVsbCkge1xuICAgICAgICB0aGlzLnNlYXJjaFBlbmRpbmcgPSBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMuc2VhcmNoVGltZW91dCAhPSBudWxsKSB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5zZWFyY2hUaW1lb3V0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGltZW91dCA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmhhc1NlYXJjaGVkID0gdGhpcy5zZWFyY2hTZXJ2aWNlLmlzU2VhcmNoYWJsZSh0aGlzLnNlYXJjaFRleHQpO1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJlZFNlbmRzID0gdGhpcy5zZW5kcy5maWx0ZXIocyA9PiB0aGlzLmZpbHRlciA9PSBudWxsIHx8IHRoaXMuZmlsdGVyKHMpKTtcbiAgICAgICAgICAgIHRoaXMuYXBwbHlUZXh0U2VhcmNoKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZWFyY2hQZW5kaW5nID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zZWFyY2hUaW1lb3V0ID0gc2V0VGltZW91dChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmhhc1NlYXJjaGVkID0gdGhpcy5zZWFyY2hTZXJ2aWNlLmlzU2VhcmNoYWJsZSh0aGlzLnNlYXJjaFRleHQpO1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJlZFNlbmRzID0gdGhpcy5zZW5kcy5maWx0ZXIocyA9PiB0aGlzLmZpbHRlciA9PSBudWxsIHx8IHRoaXMuZmlsdGVyKHMpKTtcbiAgICAgICAgICAgIHRoaXMuYXBwbHlUZXh0U2VhcmNoKCk7XG4gICAgICAgICAgICB0aGlzLnNlYXJjaFBlbmRpbmcgPSBmYWxzZTtcbiAgICAgICAgfSwgdGltZW91dCk7XG4gICAgfVxuXG4gICAgYXN5bmMgcmVtb3ZlUGFzc3dvcmQoczogU2VuZFZpZXcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgaWYgKHRoaXMuYWN0aW9uUHJvbWlzZSAhPSBudWxsIHx8IHMucGFzc3dvcmQgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbmZpcm1lZCA9IGF3YWl0IHRoaXMucGxhdGZvcm1VdGlsc1NlcnZpY2Uuc2hvd0RpYWxvZyh0aGlzLmkxOG5TZXJ2aWNlLnQoJ3JlbW92ZVBhc3N3b3JkQ29uZmlybWF0aW9uJyksXG4gICAgICAgICAgICB0aGlzLmkxOG5TZXJ2aWNlLnQoJ3JlbW92ZVBhc3N3b3JkJyksXG4gICAgICAgICAgICB0aGlzLmkxOG5TZXJ2aWNlLnQoJ3llcycpLCB0aGlzLmkxOG5TZXJ2aWNlLnQoJ25vJyksICd3YXJuaW5nJyk7XG4gICAgICAgIGlmICghY29uZmlybWVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5hY3Rpb25Qcm9taXNlID0gdGhpcy5zZW5kU2VydmljZS5yZW1vdmVQYXNzd29yZFdpdGhTZXJ2ZXIocy5pZCk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmFjdGlvblByb21pc2U7XG4gICAgICAgICAgICBpZiAodGhpcy5vblN1Y2Nlc3NmdWxSZW1vdmVQYXNzd29yZCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vblN1Y2Nlc3NmdWxSZW1vdmVQYXNzd29yZCgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBEZWZhdWx0IGFjdGlvbnNcbiAgICAgICAgICAgICAgICB0aGlzLnBsYXRmb3JtVXRpbHNTZXJ2aWNlLnNob3dUb2FzdCgnc3VjY2VzcycsIG51bGwsIHRoaXMuaTE4blNlcnZpY2UudCgncmVtb3ZlZFBhc3N3b3JkJykpO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMubG9hZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ1NlcnZpY2UuZXJyb3IoZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hY3Rpb25Qcm9taXNlID0gbnVsbDtcbiAgICB9XG5cbiAgICBhc3luYyBkZWxldGUoczogU2VuZFZpZXcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgaWYgKHRoaXMuYWN0aW9uUHJvbWlzZSAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29uZmlybWVkID0gYXdhaXQgdGhpcy5wbGF0Zm9ybVV0aWxzU2VydmljZS5zaG93RGlhbG9nKFxuICAgICAgICAgICAgdGhpcy5pMThuU2VydmljZS50KCdkZWxldGVTZW5kQ29uZmlybWF0aW9uJyksXG4gICAgICAgICAgICB0aGlzLmkxOG5TZXJ2aWNlLnQoJ2RlbGV0ZVNlbmQnKSxcbiAgICAgICAgICAgIHRoaXMuaTE4blNlcnZpY2UudCgneWVzJyksIHRoaXMuaTE4blNlcnZpY2UudCgnbm8nKSwgJ3dhcm5pbmcnKTtcbiAgICAgICAgaWYgKCFjb25maXJtZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLmFjdGlvblByb21pc2UgPSB0aGlzLnNlbmRTZXJ2aWNlLmRlbGV0ZVdpdGhTZXJ2ZXIocy5pZCk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmFjdGlvblByb21pc2U7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLm9uU3VjY2Vzc2Z1bERlbGV0ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vblN1Y2Nlc3NmdWxEZWxldGUoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gRGVmYXVsdCBhY3Rpb25zXG4gICAgICAgICAgICAgICAgdGhpcy5wbGF0Zm9ybVV0aWxzU2VydmljZS5zaG93VG9hc3QoJ3N1Y2Nlc3MnLCBudWxsLCB0aGlzLmkxOG5TZXJ2aWNlLnQoJ2RlbGV0ZWRTZW5kJykpO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucmVmcmVzaCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ1NlcnZpY2UuZXJyb3IoZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hY3Rpb25Qcm9taXNlID0gbnVsbDtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgY29weShzOiBTZW5kVmlldykge1xuICAgICAgICBjb25zdCBzZW5kTGlua0Jhc2VVcmwgPSB0aGlzLmVudmlyb25tZW50U2VydmljZS5nZXRTZW5kVXJsKCk7XG4gICAgICAgIGNvbnN0IGxpbmsgPSBzZW5kTGlua0Jhc2VVcmwgKyBzLmFjY2Vzc0lkICsgJy8nICsgcy51cmxCNjRLZXk7XG4gICAgICAgIHRoaXMucGxhdGZvcm1VdGlsc1NlcnZpY2UuY29weVRvQ2xpcGJvYXJkKGxpbmspO1xuICAgICAgICB0aGlzLnBsYXRmb3JtVXRpbHNTZXJ2aWNlLnNob3dUb2FzdCgnc3VjY2VzcycsIG51bGwsXG4gICAgICAgICAgICB0aGlzLmkxOG5TZXJ2aWNlLnQoJ3ZhbHVlQ29waWVkJywgdGhpcy5pMThuU2VydmljZS50KCdzZW5kTGluaycpKSk7XG4gICAgfVxuXG4gICAgc2VhcmNoVGV4dENoYW5nZWQoKSB7XG4gICAgICAgIHRoaXMuc2VhcmNoKDIwMCk7XG4gICAgfVxuXG4gICAgc2VsZWN0QWxsKCkge1xuICAgICAgICB0aGlzLmNsZWFyU2VsZWN0aW9ucygpO1xuICAgICAgICB0aGlzLnNlbGVjdGVkQWxsID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5hcHBseUZpbHRlcihudWxsKTtcbiAgICB9XG5cbiAgICBzZWxlY3RUeXBlKHR5cGU6IFNlbmRUeXBlKSB7XG4gICAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb25zKCk7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRUeXBlID0gdHlwZTtcbiAgICAgICAgdGhpcy5hcHBseUZpbHRlcihzID0+IHMudHlwZSA9PT0gdHlwZSk7XG4gICAgfVxuXG4gICAgY2xlYXJTZWxlY3Rpb25zKCkge1xuICAgICAgICB0aGlzLnNlbGVjdGVkQWxsID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRUeXBlID0gbnVsbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFwcGx5VGV4dFNlYXJjaCgpIHtcbiAgICAgICAgaWYgKHRoaXMuc2VhcmNoVGV4dCAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmZpbHRlcmVkU2VuZHMgPSB0aGlzLnNlYXJjaFNlcnZpY2Uuc2VhcmNoU2VuZHModGhpcy5maWx0ZXJlZFNlbmRzLCB0aGlzLnNlYXJjaFRleHQpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgRGlyZWN0aXZlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICAgIEFjdGl2YXRlZFJvdXRlLFxuICAgIFJvdXRlclxufSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuXG5pbXBvcnQgeyBmaXJzdCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgQXBpU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvYXBpLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ3J5cHRvU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvY3J5cHRvLnNlcnZpY2UnO1xuaW1wb3J0IHsgSTE4blNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL2kxOG4uc2VydmljZSc7XG5pbXBvcnQgeyBNZXNzYWdpbmdTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9tZXNzYWdpbmcuc2VydmljZSc7XG5pbXBvcnQgeyBQYXNzd29yZEdlbmVyYXRpb25TZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9wYXNzd29yZEdlbmVyYXRpb24uc2VydmljZSc7XG5pbXBvcnQgeyBQbGF0Zm9ybVV0aWxzU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvcGxhdGZvcm1VdGlscy5zZXJ2aWNlJztcbmltcG9ydCB7IFBvbGljeVNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL3BvbGljeS5zZXJ2aWNlJztcbmltcG9ydCB7IFN5bmNTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9zeW5jLnNlcnZpY2UnO1xuaW1wb3J0IHsgVXNlclNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL3VzZXIuc2VydmljZSc7XG5cbmltcG9ydCB7IEVuY1N0cmluZyB9IGZyb20gJ2pzbGliLWNvbW1vbi9tb2RlbHMvZG9tYWluL2VuY1N0cmluZyc7XG5pbXBvcnQgeyBTeW1tZXRyaWNDcnlwdG9LZXkgfSBmcm9tICdqc2xpYi1jb21tb24vbW9kZWxzL2RvbWFpbi9zeW1tZXRyaWNDcnlwdG9LZXknO1xuXG5pbXBvcnQgeyBLZXlzUmVxdWVzdCB9IGZyb20gJ2pzbGliLWNvbW1vbi9tb2RlbHMvcmVxdWVzdC9rZXlzUmVxdWVzdCc7XG5pbXBvcnQgeyBPcmdhbml6YXRpb25Vc2VyUmVzZXRQYXNzd29yZEVucm9sbG1lbnRSZXF1ZXN0IH0gZnJvbSAnanNsaWItY29tbW9uL21vZGVscy9yZXF1ZXN0L29yZ2FuaXphdGlvblVzZXJSZXNldFBhc3N3b3JkRW5yb2xsbWVudFJlcXVlc3QnO1xuaW1wb3J0IHsgU2V0UGFzc3dvcmRSZXF1ZXN0IH0gZnJvbSAnanNsaWItY29tbW9uL21vZGVscy9yZXF1ZXN0L3NldFBhc3N3b3JkUmVxdWVzdCc7XG5cbmltcG9ydCB7IENoYW5nZVBhc3N3b3JkQ29tcG9uZW50IGFzIEJhc2VDaGFuZ2VQYXNzd29yZENvbXBvbmVudCB9IGZyb20gJy4vY2hhbmdlLXBhc3N3b3JkLmNvbXBvbmVudCc7XG5cbmltcG9ydCB7IEhhc2hQdXJwb3NlIH0gZnJvbSAnanNsaWItY29tbW9uL2VudW1zL2hhc2hQdXJwb3NlJztcbmltcG9ydCB7IEtkZlR5cGUgfSBmcm9tICdqc2xpYi1jb21tb24vZW51bXMva2RmVHlwZSc7XG5cbmltcG9ydCB7IFV0aWxzIH0gZnJvbSAnanNsaWItY29tbW9uL21pc2MvdXRpbHMnO1xuXG5ARGlyZWN0aXZlKClcbmV4cG9ydCBjbGFzcyBTZXRQYXNzd29yZENvbXBvbmVudCBleHRlbmRzIEJhc2VDaGFuZ2VQYXNzd29yZENvbXBvbmVudCB7XG4gICAgc3luY0xvYWRpbmc6IGJvb2xlYW4gPSB0cnVlO1xuICAgIHNob3dQYXNzd29yZDogYm9vbGVhbiA9IGZhbHNlO1xuICAgIGhpbnQ6IHN0cmluZyA9ICcnO1xuICAgIGlkZW50aWZpZXI6IHN0cmluZyA9IG51bGw7XG4gICAgb3JnSWQ6IHN0cmluZztcbiAgICByZXNldFBhc3N3b3JkQXV0b0Vucm9sbCA9IGZhbHNlO1xuXG4gICAgb25TdWNjZXNzZnVsQ2hhbmdlUGFzc3dvcmQ6ICgpID0+IFByb21pc2U8YW55PjtcbiAgICBzdWNjZXNzUm91dGUgPSAndmF1bHQnO1xuXG4gICAgY29uc3RydWN0b3IoaTE4blNlcnZpY2U6IEkxOG5TZXJ2aWNlLCBjcnlwdG9TZXJ2aWNlOiBDcnlwdG9TZXJ2aWNlLCBtZXNzYWdpbmdTZXJ2aWNlOiBNZXNzYWdpbmdTZXJ2aWNlLFxuICAgICAgICB1c2VyU2VydmljZTogVXNlclNlcnZpY2UsIHBhc3N3b3JkR2VuZXJhdGlvblNlcnZpY2U6IFBhc3N3b3JkR2VuZXJhdGlvblNlcnZpY2UsXG4gICAgICAgIHBsYXRmb3JtVXRpbHNTZXJ2aWNlOiBQbGF0Zm9ybVV0aWxzU2VydmljZSwgcG9saWN5U2VydmljZTogUG9saWN5U2VydmljZSwgcHJvdGVjdGVkIHJvdXRlcjogUm91dGVyLFxuICAgICAgICBwcml2YXRlIGFwaVNlcnZpY2U6IEFwaVNlcnZpY2UsIHByaXZhdGUgc3luY1NlcnZpY2U6IFN5bmNTZXJ2aWNlLCBwcml2YXRlIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSkge1xuICAgICAgICBzdXBlcihpMThuU2VydmljZSwgY3J5cHRvU2VydmljZSwgbWVzc2FnaW5nU2VydmljZSwgdXNlclNlcnZpY2UsIHBhc3N3b3JkR2VuZXJhdGlvblNlcnZpY2UsXG4gICAgICAgICAgICBwbGF0Zm9ybVV0aWxzU2VydmljZSwgcG9saWN5U2VydmljZSk7XG4gICAgfVxuXG4gICAgYXN5bmMgbmdPbkluaXQoKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuc3luY1NlcnZpY2UuZnVsbFN5bmModHJ1ZSk7XG4gICAgICAgIHRoaXMuc3luY0xvYWRpbmcgPSBmYWxzZTtcblxuICAgICAgICB0aGlzLnJvdXRlLnF1ZXJ5UGFyYW1zLnBpcGUoZmlyc3QoKSkuc3Vic2NyaWJlKGFzeW5jIHFQYXJhbXMgPT4ge1xuICAgICAgICAgICAgaWYgKHFQYXJhbXMuaWRlbnRpZmllciAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pZGVudGlmaWVyID0gcVBhcmFtcy5pZGVudGlmaWVyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBBdXRvbWF0aWMgRW5yb2xsbWVudCBEZXRlY3Rpb25cbiAgICAgICAgaWYgKHRoaXMuaWRlbnRpZmllciAhPSBudWxsKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5hcGlTZXJ2aWNlLmdldE9yZ2FuaXphdGlvbkF1dG9FbnJvbGxTdGF0dXModGhpcy5pZGVudGlmaWVyKTtcbiAgICAgICAgICAgICAgICB0aGlzLm9yZ0lkID0gcmVzcG9uc2UuaWQ7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXNldFBhc3N3b3JkQXV0b0Vucm9sbCA9IHJlc3BvbnNlLnJlc2V0UGFzc3dvcmRFbmFibGVkO1xuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgdGhpcy5wbGF0Zm9ybVV0aWxzU2VydmljZS5zaG93VG9hc3QoJ2Vycm9yJywgbnVsbCwgdGhpcy5pMThuU2VydmljZS50KCdlcnJvck9jY3VycmVkJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgc3VwZXIubmdPbkluaXQoKTtcbiAgICB9XG5cbiAgICBhc3luYyBzZXR1cFN1Ym1pdEFjdGlvbnMoKSB7XG4gICAgICAgIHRoaXMua2RmID0gS2RmVHlwZS5QQktERjJfU0hBMjU2O1xuICAgICAgICBjb25zdCB1c2VMb3dlcktkZiA9IHRoaXMucGxhdGZvcm1VdGlsc1NlcnZpY2UuaXNJRSgpO1xuICAgICAgICB0aGlzLmtkZkl0ZXJhdGlvbnMgPSB1c2VMb3dlcktkZiA/IDEwMDAwIDogMTAwMDAwO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBhc3luYyBwZXJmb3JtU3VibWl0QWN0aW9ucyhtYXN0ZXJQYXNzd29yZEhhc2g6IHN0cmluZywga2V5OiBTeW1tZXRyaWNDcnlwdG9LZXksXG4gICAgICAgIGVuY0tleTogW1N5bW1ldHJpY0NyeXB0b0tleSwgRW5jU3RyaW5nXSkge1xuICAgICAgICBjb25zdCBrZXlzID0gYXdhaXQgdGhpcy5jcnlwdG9TZXJ2aWNlLm1ha2VLZXlQYWlyKGVuY0tleVswXSk7XG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSBuZXcgU2V0UGFzc3dvcmRSZXF1ZXN0KFxuICAgICAgICAgICAgbWFzdGVyUGFzc3dvcmRIYXNoLFxuICAgICAgICAgICAgZW5jS2V5WzFdLmVuY3J5cHRlZFN0cmluZyxcbiAgICAgICAgICAgIHRoaXMuaGludCxcbiAgICAgICAgICAgIHRoaXMua2RmLFxuICAgICAgICAgICAgdGhpcy5rZGZJdGVyYXRpb25zLFxuICAgICAgICAgICAgdGhpcy5pZGVudGlmaWVyLFxuICAgICAgICAgICAgbmV3IEtleXNSZXF1ZXN0KGtleXNbMF0sIGtleXNbMV0uZW5jcnlwdGVkU3RyaW5nKVxuICAgICAgICApO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKHRoaXMucmVzZXRQYXNzd29yZEF1dG9FbnJvbGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm1Qcm9taXNlID0gdGhpcy5hcGlTZXJ2aWNlLnNldFBhc3N3b3JkKHJlcXVlc3QpLnRoZW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLm9uU2V0UGFzc3dvcmRTdWNjZXNzKGtleSwgZW5jS2V5LCBrZXlzKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXBpU2VydmljZS5nZXRPcmdhbml6YXRpb25LZXlzKHRoaXMub3JnSWQpO1xuICAgICAgICAgICAgICAgIH0pLnRoZW4oYXN5bmMgcmVzcG9uc2UgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHRoaXMuaTE4blNlcnZpY2UudCgncmVzZXRQYXNzd29yZE9yZ0tleXNFcnJvcicpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCB1c2VySWQgPSBhd2FpdCB0aGlzLnVzZXJTZXJ2aWNlLmdldFVzZXJJZCgpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwdWJsaWNLZXkgPSBVdGlscy5mcm9tQjY0VG9BcnJheShyZXNwb25zZS5wdWJsaWNLZXkpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIFJTQSBFbmNyeXB0IHVzZXIncyBlbmNLZXkua2V5IHdpdGggb3JnYW5pemF0aW9uIHB1YmxpYyBrZXlcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdXNlckVuY0tleSA9IGF3YWl0IHRoaXMuY3J5cHRvU2VydmljZS5nZXRFbmNLZXkoKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZW5jcnlwdGVkS2V5ID0gYXdhaXQgdGhpcy5jcnlwdG9TZXJ2aWNlLnJzYUVuY3J5cHQodXNlckVuY0tleS5rZXksIHB1YmxpY0tleS5idWZmZXIpO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc2V0UmVxdWVzdCA9IG5ldyBPcmdhbml6YXRpb25Vc2VyUmVzZXRQYXNzd29yZEVucm9sbG1lbnRSZXF1ZXN0KCk7XG4gICAgICAgICAgICAgICAgICAgIHJlc2V0UmVxdWVzdC5yZXNldFBhc3N3b3JkS2V5ID0gZW5jcnlwdGVkS2V5LmVuY3J5cHRlZFN0cmluZztcblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5hcGlTZXJ2aWNlLnB1dE9yZ2FuaXphdGlvblVzZXJSZXNldFBhc3N3b3JkRW5yb2xsbWVudCh0aGlzLm9yZ0lkLCB1c2VySWQsIHJlc2V0UmVxdWVzdCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuZm9ybVByb21pc2UgPSB0aGlzLmFwaVNlcnZpY2Uuc2V0UGFzc3dvcmQocmVxdWVzdCkudGhlbihhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMub25TZXRQYXNzd29yZFN1Y2Nlc3Moa2V5LCBlbmNLZXksIGtleXMpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmZvcm1Qcm9taXNlO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5vblN1Y2Nlc3NmdWxDaGFuZ2VQYXNzd29yZCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vblN1Y2Nlc3NmdWxDaGFuZ2VQYXNzd29yZCgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbdGhpcy5zdWNjZXNzUm91dGVdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICB0aGlzLnBsYXRmb3JtVXRpbHNTZXJ2aWNlLnNob3dUb2FzdCgnZXJyb3InLCBudWxsLCB0aGlzLmkxOG5TZXJ2aWNlLnQoJ2Vycm9yT2NjdXJyZWQnKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0b2dnbGVQYXNzd29yZChjb25maXJtRmllbGQ6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5zaG93UGFzc3dvcmQgPSAhdGhpcy5zaG93UGFzc3dvcmQ7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGNvbmZpcm1GaWVsZCA/ICdtYXN0ZXJQYXNzd29yZFJldHlwZScgOiAnbWFzdGVyUGFzc3dvcmQnKS5mb2N1cygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgb25TZXRQYXNzd29yZFN1Y2Nlc3Moa2V5OiBTeW1tZXRyaWNDcnlwdG9LZXksIGVuY0tleTogW1N5bW1ldHJpY0NyeXB0b0tleSwgRW5jU3RyaW5nXSwga2V5czogW3N0cmluZywgRW5jU3RyaW5nXSkge1xuICAgICAgICBhd2FpdCB0aGlzLnVzZXJTZXJ2aWNlLnNldEluZm9ybWF0aW9uKGF3YWl0IHRoaXMudXNlclNlcnZpY2UuZ2V0VXNlcklkKCksIGF3YWl0IHRoaXMudXNlclNlcnZpY2UuZ2V0RW1haWwoKSxcbiAgICAgICAgICAgIHRoaXMua2RmLCB0aGlzLmtkZkl0ZXJhdGlvbnMpO1xuICAgICAgICBhd2FpdCB0aGlzLmNyeXB0b1NlcnZpY2Uuc2V0S2V5KGtleSk7XG4gICAgICAgIGF3YWl0IHRoaXMuY3J5cHRvU2VydmljZS5zZXRFbmNLZXkoZW5jS2V5WzFdLmVuY3J5cHRlZFN0cmluZyk7XG4gICAgICAgIGF3YWl0IHRoaXMuY3J5cHRvU2VydmljZS5zZXRFbmNQcml2YXRlS2V5KGtleXNbMV0uZW5jcnlwdGVkU3RyaW5nKTtcblxuICAgICAgICBjb25zdCBsb2NhbEtleUhhc2ggPSBhd2FpdCB0aGlzLmNyeXB0b1NlcnZpY2UuaGFzaFBhc3N3b3JkKHRoaXMubWFzdGVyUGFzc3dvcmQsIGtleSxcbiAgICAgICAgICAgIEhhc2hQdXJwb3NlLkxvY2FsQXV0aG9yaXphdGlvbik7XG4gICAgICAgIGF3YWl0IHRoaXMuY3J5cHRvU2VydmljZS5zZXRLZXlIYXNoKGxvY2FsS2V5SGFzaCk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgRGlyZWN0aXZlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IENyeXB0b1NlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL2NyeXB0by5zZXJ2aWNlJztcbmltcG9ydCB7IFN0b3JhZ2VTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9zdG9yYWdlLnNlcnZpY2UnO1xuaW1wb3J0IHsgVXNlclNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL3VzZXIuc2VydmljZSc7XG5pbXBvcnQgeyBWYXVsdFRpbWVvdXRTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy92YXVsdFRpbWVvdXQuc2VydmljZSc7XG5cbmltcG9ydCB7IENvbnN0YW50c1NlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vc2VydmljZXMvY29uc3RhbnRzLnNlcnZpY2UnO1xuXG5pbXBvcnQgeyBVdGlscyB9IGZyb20gJ2pzbGliLWNvbW1vbi9taXNjL3V0aWxzJztcblxuaW1wb3J0IHsgTW9kYWxSZWYgfSBmcm9tICcuL21vZGFsL21vZGFsLnJlZic7XG5cbkBEaXJlY3RpdmUoKVxuZXhwb3J0IGNsYXNzIFNldFBpbkNvbXBvbmVudCB7XG5cbiAgICBwaW4gPSAnJztcbiAgICBzaG93UGluID0gZmFsc2U7XG4gICAgbWFzdGVyUGFzc09uUmVzdGFydCA9IHRydWU7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIG1vZGFsUmVmOiBNb2RhbFJlZiwgcHJpdmF0ZSBjcnlwdG9TZXJ2aWNlOiBDcnlwdG9TZXJ2aWNlLCBwcml2YXRlIHVzZXJTZXJ2aWNlOiBVc2VyU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBzdG9yYWdlU2VydmljZTogU3RvcmFnZVNlcnZpY2UsIHByaXZhdGUgdmF1bHRUaW1lb3V0U2VydmljZTogVmF1bHRUaW1lb3V0U2VydmljZSkgeyB9XG5cbiAgICB0b2dnbGVWaXNpYmlsaXR5KCkge1xuICAgICAgICB0aGlzLnNob3dQaW4gPSAhdGhpcy5zaG93UGluO1xuICAgIH1cblxuICAgIGFzeW5jIHN1Ym1pdCgpIHtcbiAgICAgICAgaWYgKFV0aWxzLmlzTnVsbE9yV2hpdGVzcGFjZSh0aGlzLnBpbikpIHtcbiAgICAgICAgICAgIHRoaXMubW9kYWxSZWYuY2xvc2UoZmFsc2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qga2RmID0gYXdhaXQgdGhpcy51c2VyU2VydmljZS5nZXRLZGYoKTtcbiAgICAgICAgY29uc3Qga2RmSXRlcmF0aW9ucyA9IGF3YWl0IHRoaXMudXNlclNlcnZpY2UuZ2V0S2RmSXRlcmF0aW9ucygpO1xuICAgICAgICBjb25zdCBlbWFpbCA9IGF3YWl0IHRoaXMudXNlclNlcnZpY2UuZ2V0RW1haWwoKTtcbiAgICAgICAgY29uc3QgcGluS2V5ID0gYXdhaXQgdGhpcy5jcnlwdG9TZXJ2aWNlLm1ha2VQaW5LZXkodGhpcy5waW4sIGVtYWlsLCBrZGYsIGtkZkl0ZXJhdGlvbnMpO1xuICAgICAgICBjb25zdCBrZXkgPSBhd2FpdCB0aGlzLmNyeXB0b1NlcnZpY2UuZ2V0S2V5KCk7XG4gICAgICAgIGNvbnN0IHBpblByb3RlY3RlZEtleSA9IGF3YWl0IHRoaXMuY3J5cHRvU2VydmljZS5lbmNyeXB0KGtleS5rZXksIHBpbktleSk7XG4gICAgICAgIGlmICh0aGlzLm1hc3RlclBhc3NPblJlc3RhcnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGVuY1BpbiA9IGF3YWl0IHRoaXMuY3J5cHRvU2VydmljZS5lbmNyeXB0KHRoaXMucGluKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2F2ZShDb25zdGFudHNTZXJ2aWNlLnByb3RlY3RlZFBpbiwgZW5jUGluLmVuY3J5cHRlZFN0cmluZyk7XG4gICAgICAgICAgICB0aGlzLnZhdWx0VGltZW91dFNlcnZpY2UucGluUHJvdGVjdGVkS2V5ID0gcGluUHJvdGVjdGVkS2V5O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5zdG9yYWdlU2VydmljZS5zYXZlKENvbnN0YW50c1NlcnZpY2UucGluUHJvdGVjdGVkS2V5LCBwaW5Qcm90ZWN0ZWRLZXkuZW5jcnlwdGVkU3RyaW5nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubW9kYWxSZWYuY2xvc2UodHJ1ZSk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHtcbiAgICBEaXJlY3RpdmUsXG4gICAgSW5wdXQsXG4gICAgT25Jbml0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gICAgQWJzdHJhY3RDb250cm9sLFxuICAgIENvbnRyb2xWYWx1ZUFjY2Vzc29yLFxuICAgIEZvcm1CdWlsZGVyLFxuICAgIFZhbGlkYXRpb25FcnJvcnMsXG4gICAgVmFsaWRhdG9yXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuaW1wb3J0IHsgSTE4blNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL2kxOG4uc2VydmljZSc7XG5pbXBvcnQgeyBQb2xpY3lTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9wb2xpY3kuc2VydmljZSc7XG5cbmltcG9ydCB7IFBvbGljeVR5cGUgfSBmcm9tICdqc2xpYi1jb21tb24vZW51bXMvcG9saWN5VHlwZSc7XG5pbXBvcnQgeyBQb2xpY3kgfSBmcm9tICdqc2xpYi1jb21tb24vbW9kZWxzL2RvbWFpbi9wb2xpY3knO1xuXG5ARGlyZWN0aXZlKClcbmV4cG9ydCBjbGFzcyBWYXVsdFRpbWVvdXRJbnB1dENvbXBvbmVudCBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBWYWxpZGF0b3IsIE9uSW5pdCB7XG5cbiAgICBnZXQgc2hvd0N1c3RvbSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZm9ybS5nZXQoJ3ZhdWx0VGltZW91dCcpLnZhbHVlID09PSBWYXVsdFRpbWVvdXRJbnB1dENvbXBvbmVudC5DVVNUT01fVkFMVUU7XG4gICAgfVxuXG4gICAgc3RhdGljIENVU1RPTV9WQUxVRSA9IC0xMDA7XG5cbiAgICBmb3JtID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICAgIHZhdWx0VGltZW91dDogW251bGxdLFxuICAgICAgICBjdXN0b206IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgICAgICAgaG91cnM6IFtudWxsXSxcbiAgICAgICAgICAgIG1pbnV0ZXM6IFtudWxsXSxcbiAgICAgICAgfSksXG4gICAgfSk7XG5cbiAgICBASW5wdXQoKSB2YXVsdFRpbWVvdXRzOiB7IG5hbWU6IHN0cmluZzsgdmFsdWU6IG51bWJlcjsgfVtdO1xuICAgIHZhdWx0VGltZW91dFBvbGljeTogUG9saWN5O1xuICAgIHZhdWx0VGltZW91dFBvbGljeUhvdXJzOiBudW1iZXI7XG4gICAgdmF1bHRUaW1lb3V0UG9saWN5TWludXRlczogbnVtYmVyO1xuXG4gICAgcHJpdmF0ZSBvbkNoYW5nZTogKHZhdWx0VGltZW91dDogbnVtYmVyKSA9PiB2b2lkO1xuICAgIHByaXZhdGUgdmFsaWRhdG9yQ2hhbmdlOiAoKSA9PiB2b2lkO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIsIHByaXZhdGUgcG9saWN5U2VydmljZTogUG9saWN5U2VydmljZSwgcHJpdmF0ZSBpMThuU2VydmljZTogSTE4blNlcnZpY2UpIHtcbiAgICB9XG5cbiAgICBhc3luYyBuZ09uSW5pdCgpIHtcbiAgICAgICAgaWYgKGF3YWl0IHRoaXMucG9saWN5U2VydmljZS5wb2xpY3lBcHBsaWVzVG9Vc2VyKFBvbGljeVR5cGUuTWF4aW11bVZhdWx0VGltZW91dCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhdWx0VGltZW91dFBvbGljeSA9IGF3YWl0IHRoaXMucG9saWN5U2VydmljZS5nZXRBbGwoUG9saWN5VHlwZS5NYXhpbXVtVmF1bHRUaW1lb3V0KTtcblxuICAgICAgICAgICAgdGhpcy52YXVsdFRpbWVvdXRQb2xpY3kgPSB2YXVsdFRpbWVvdXRQb2xpY3lbMF07XG4gICAgICAgICAgICB0aGlzLnZhdWx0VGltZW91dFBvbGljeUhvdXJzID0gTWF0aC5mbG9vcih0aGlzLnZhdWx0VGltZW91dFBvbGljeS5kYXRhLm1pbnV0ZXMgLyA2MCk7XG4gICAgICAgICAgICB0aGlzLnZhdWx0VGltZW91dFBvbGljeU1pbnV0ZXMgPSB0aGlzLnZhdWx0VGltZW91dFBvbGljeS5kYXRhLm1pbnV0ZXMgJSA2MDtcblxuICAgICAgICAgICAgdGhpcy52YXVsdFRpbWVvdXRzID0gdGhpcy52YXVsdFRpbWVvdXRzLmZpbHRlcih0ID0+XG4gICAgICAgICAgICAgICAgdC52YWx1ZSA8PSB0aGlzLnZhdWx0VGltZW91dFBvbGljeS5kYXRhLm1pbnV0ZXMgJiZcbiAgICAgICAgICAgICAgICAodC52YWx1ZSA+IDAgfHwgdC52YWx1ZSA9PT0gVmF1bHRUaW1lb3V0SW5wdXRDb21wb25lbnQuQ1VTVE9NX1ZBTFVFKSAmJlxuICAgICAgICAgICAgICAgIHQudmFsdWUgIT0gbnVsbFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMudmFsaWRhdG9yQ2hhbmdlKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmZvcm0udmFsdWVDaGFuZ2VzLnN1YnNjcmliZShhc3luYyB2YWx1ZSA9PiB7XG4gICAgICAgICAgICB0aGlzLm9uQ2hhbmdlKHRoaXMuZ2V0VmF1bHRUaW1lb3V0KHZhbHVlKSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEFzc2lnbiB0aGUgcHJldmlvdXMgdmFsdWUgdG8gdGhlIGN1c3RvbSBmaWVsZHNcbiAgICAgICAgdGhpcy5mb3JtLmdldCgndmF1bHRUaW1lb3V0JykudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSh2YWx1ZSA9PiB7XG4gICAgICAgICAgICBpZiAodmFsdWUgIT09IFZhdWx0VGltZW91dElucHV0Q29tcG9uZW50LkNVU1RPTV9WQUxVRSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgY3VycmVudCA9IE1hdGgubWF4KHRoaXMuZm9ybS52YWx1ZS52YXVsdFRpbWVvdXQsIDApO1xuICAgICAgICAgICAgdGhpcy5mb3JtLnBhdGNoVmFsdWUoe1xuICAgICAgICAgICAgICAgIGN1c3RvbToge1xuICAgICAgICAgICAgICAgICAgICBob3VyczogTWF0aC5mbG9vcihjdXJyZW50IC8gNjApLFxuICAgICAgICAgICAgICAgICAgICBtaW51dGVzOiBjdXJyZW50ICUgNjAsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBuZ09uQ2hhbmdlcygpIHtcbiAgICAgICAgdGhpcy52YXVsdFRpbWVvdXRzLnB1c2goeyBuYW1lOiB0aGlzLmkxOG5TZXJ2aWNlLnQoJ2N1c3RvbScpLCB2YWx1ZTogVmF1bHRUaW1lb3V0SW5wdXRDb21wb25lbnQuQ1VTVE9NX1ZBTFVFIH0pO1xuICAgIH1cblxuICAgIGdldFZhdWx0VGltZW91dCh2YWx1ZTogYW55KSB7XG4gICAgICAgIGlmICh2YWx1ZS52YXVsdFRpbWVvdXQgIT09IFZhdWx0VGltZW91dElucHV0Q29tcG9uZW50LkNVU1RPTV9WQUxVRSkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlLnZhdWx0VGltZW91dDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB2YWx1ZS5jdXN0b20uaG91cnMgKiA2MCArIHZhbHVlLmN1c3RvbS5taW51dGVzO1xuICAgIH1cblxuICAgIHdyaXRlVmFsdWUodmFsdWU6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMudmF1bHRUaW1lb3V0cy5ldmVyeShwID0+IHAudmFsdWUgIT09IHZhbHVlKSkge1xuICAgICAgICAgICAgdGhpcy5mb3JtLnNldFZhbHVlKHtcbiAgICAgICAgICAgICAgICB2YXVsdFRpbWVvdXQ6IFZhdWx0VGltZW91dElucHV0Q29tcG9uZW50LkNVU1RPTV9WQUxVRSxcbiAgICAgICAgICAgICAgICBjdXN0b206IHtcbiAgICAgICAgICAgICAgICAgICAgaG91cnM6IE1hdGguZmxvb3IodmFsdWUgLyA2MCksXG4gICAgICAgICAgICAgICAgICAgIG1pbnV0ZXM6IHZhbHVlICUgNjAsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5mb3JtLnBhdGNoVmFsdWUoe1xuICAgICAgICAgICAgdmF1bHRUaW1lb3V0OiB2YWx1ZSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmVnaXN0ZXJPbkNoYW5nZShvbkNoYW5nZTogYW55KTogdm9pZCB7XG4gICAgICAgIHRoaXMub25DaGFuZ2UgPSBvbkNoYW5nZTtcbiAgICB9XG5cbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmVcbiAgICByZWdpc3Rlck9uVG91Y2hlZChvblRvdWNoZWQ6IGFueSk6IHZvaWQge31cblxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZVxuICAgIHNldERpc2FibGVkU3RhdGU/KGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHsgfVxuXG4gICAgdmFsaWRhdGUoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB7XG4gICAgICAgIGlmICh0aGlzLnZhdWx0VGltZW91dFBvbGljeSAmJiB0aGlzLnZhdWx0VGltZW91dFBvbGljeT8uZGF0YT8ubWludXRlcyA8IGNvbnRyb2wudmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiB7IHBvbGljeUVycm9yOiB0cnVlIH07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZWdpc3Rlck9uVmFsaWRhdG9yQ2hhbmdlKGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgICAgIHRoaXMudmFsaWRhdG9yQ2hhbmdlID0gZm47XG4gICAgfVxufVxuIiwiaW1wb3J0IHtcbiAgICBEaXJlY3RpdmUsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIElucHV0LFxuICAgIE9uSW5pdCxcbiAgICBPdXRwdXQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBPcmdhbml6YXRpb25Vc2VyU3RhdHVzVHlwZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9lbnVtcy9vcmdhbml6YXRpb25Vc2VyU3RhdHVzVHlwZSc7XG5cbmltcG9ydCB7IENpcGhlclNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL2NpcGhlci5zZXJ2aWNlJztcbmltcG9ydCB7IENvbGxlY3Rpb25TZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9jb2xsZWN0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgSTE4blNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL2kxOG4uc2VydmljZSc7XG5pbXBvcnQgeyBMb2dTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9sb2cuc2VydmljZSc7XG5pbXBvcnQgeyBQbGF0Zm9ybVV0aWxzU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvcGxhdGZvcm1VdGlscy5zZXJ2aWNlJztcbmltcG9ydCB7IFVzZXJTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy91c2VyLnNlcnZpY2UnO1xuXG5pbXBvcnQgeyBPcmdhbml6YXRpb24gfSBmcm9tICdqc2xpYi1jb21tb24vbW9kZWxzL2RvbWFpbi9vcmdhbml6YXRpb24nO1xuaW1wb3J0IHsgQ2lwaGVyVmlldyB9IGZyb20gJ2pzbGliLWNvbW1vbi9tb2RlbHMvdmlldy9jaXBoZXJWaWV3JztcbmltcG9ydCB7IENvbGxlY3Rpb25WaWV3IH0gZnJvbSAnanNsaWItY29tbW9uL21vZGVscy92aWV3L2NvbGxlY3Rpb25WaWV3JztcblxuaW1wb3J0IHsgVXRpbHMgfSBmcm9tICdqc2xpYi1jb21tb24vbWlzYy91dGlscyc7XG5cbkBEaXJlY3RpdmUoKVxuZXhwb3J0IGNsYXNzIFNoYXJlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgICBASW5wdXQoKSBjaXBoZXJJZDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIG9yZ2FuaXphdGlvbklkOiBzdHJpbmc7XG4gICAgQE91dHB1dCgpIG9uU2hhcmVkQ2lwaGVyID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gICAgZm9ybVByb21pc2U6IFByb21pc2U8YW55PjtcbiAgICBjaXBoZXI6IENpcGhlclZpZXc7XG4gICAgY29sbGVjdGlvbnM6IENvbGxlY3Rpb25WaWV3W10gPSBbXTtcbiAgICBvcmdhbml6YXRpb25zOiBPcmdhbml6YXRpb25bXSA9IFtdO1xuXG4gICAgcHJvdGVjdGVkIHdyaXRlYWJsZUNvbGxlY3Rpb25zOiBDb2xsZWN0aW9uVmlld1tdID0gW107XG5cbiAgICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgY29sbGVjdGlvblNlcnZpY2U6IENvbGxlY3Rpb25TZXJ2aWNlLCBwcm90ZWN0ZWQgcGxhdGZvcm1VdGlsc1NlcnZpY2U6IFBsYXRmb3JtVXRpbHNTZXJ2aWNlLFxuICAgICAgICBwcm90ZWN0ZWQgaTE4blNlcnZpY2U6IEkxOG5TZXJ2aWNlLCBwcm90ZWN0ZWQgdXNlclNlcnZpY2U6IFVzZXJTZXJ2aWNlLFxuICAgICAgICBwcm90ZWN0ZWQgY2lwaGVyU2VydmljZTogQ2lwaGVyU2VydmljZSwgcHJpdmF0ZSBsb2dTZXJ2aWNlOiBMb2dTZXJ2aWNlKSB7IH1cblxuICAgIGFzeW5jIG5nT25Jbml0KCkge1xuICAgICAgICBhd2FpdCB0aGlzLmxvYWQoKTtcbiAgICB9XG5cbiAgICBhc3luYyBsb2FkKCkge1xuICAgICAgICBjb25zdCBhbGxDb2xsZWN0aW9ucyA9IGF3YWl0IHRoaXMuY29sbGVjdGlvblNlcnZpY2UuZ2V0QWxsRGVjcnlwdGVkKCk7XG4gICAgICAgIHRoaXMud3JpdGVhYmxlQ29sbGVjdGlvbnMgPSBhbGxDb2xsZWN0aW9ucy5tYXAoYyA9PiBjKS5maWx0ZXIoYyA9PiAhYy5yZWFkT25seSk7XG4gICAgICAgIGNvbnN0IG9yZ3MgPSBhd2FpdCB0aGlzLnVzZXJTZXJ2aWNlLmdldEFsbE9yZ2FuaXphdGlvbnMoKTtcbiAgICAgICAgdGhpcy5vcmdhbml6YXRpb25zID0gb3Jncy5zb3J0KFV0aWxzLmdldFNvcnRGdW5jdGlvbih0aGlzLmkxOG5TZXJ2aWNlLCAnbmFtZScpKVxuICAgICAgICAgICAgLmZpbHRlcihvID0+IG8uZW5hYmxlZCAmJiBvLnN0YXR1cyA9PT0gT3JnYW5pemF0aW9uVXNlclN0YXR1c1R5cGUuQ29uZmlybWVkKTtcblxuICAgICAgICBjb25zdCBjaXBoZXJEb21haW4gPSBhd2FpdCB0aGlzLmNpcGhlclNlcnZpY2UuZ2V0KHRoaXMuY2lwaGVySWQpO1xuICAgICAgICB0aGlzLmNpcGhlciA9IGF3YWl0IGNpcGhlckRvbWFpbi5kZWNyeXB0KCk7XG4gICAgICAgIGlmICh0aGlzLm9yZ2FuaXphdGlvbklkID09IG51bGwgJiYgdGhpcy5vcmdhbml6YXRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMub3JnYW5pemF0aW9uSWQgPSB0aGlzLm9yZ2FuaXphdGlvbnNbMF0uaWQ7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5maWx0ZXJDb2xsZWN0aW9ucygpO1xuICAgIH1cblxuICAgIGZpbHRlckNvbGxlY3Rpb25zKCkge1xuICAgICAgICB0aGlzLndyaXRlYWJsZUNvbGxlY3Rpb25zLmZvckVhY2goYyA9PiAoYyBhcyBhbnkpLmNoZWNrZWQgPSBmYWxzZSk7XG4gICAgICAgIGlmICh0aGlzLm9yZ2FuaXphdGlvbklkID09IG51bGwgfHwgdGhpcy53cml0ZWFibGVDb2xsZWN0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuY29sbGVjdGlvbnMgPSBbXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY29sbGVjdGlvbnMgPSB0aGlzLndyaXRlYWJsZUNvbGxlY3Rpb25zLmZpbHRlcihjID0+IGMub3JnYW5pemF0aW9uSWQgPT09IHRoaXMub3JnYW5pemF0aW9uSWQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgc3VibWl0KCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICBjb25zdCBzZWxlY3RlZENvbGxlY3Rpb25JZHMgPSB0aGlzLmNvbGxlY3Rpb25zXG4gICAgICAgICAgICAuZmlsdGVyKGMgPT4gISEoYyBhcyBhbnkpLmNoZWNrZWQpXG4gICAgICAgICAgICAubWFwKGMgPT4gYy5pZCk7XG4gICAgICAgIGlmIChzZWxlY3RlZENvbGxlY3Rpb25JZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLnBsYXRmb3JtVXRpbHNTZXJ2aWNlLnNob3dUb2FzdCgnZXJyb3InLCB0aGlzLmkxOG5TZXJ2aWNlLnQoJ2Vycm9yT2NjdXJyZWQnKSxcbiAgICAgICAgICAgICAgICB0aGlzLmkxOG5TZXJ2aWNlLnQoJ3NlbGVjdE9uZUNvbGxlY3Rpb24nKSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjaXBoZXJEb21haW4gPSBhd2FpdCB0aGlzLmNpcGhlclNlcnZpY2UuZ2V0KHRoaXMuY2lwaGVySWQpO1xuICAgICAgICBjb25zdCBjaXBoZXJWaWV3ID0gYXdhaXQgY2lwaGVyRG9tYWluLmRlY3J5cHQoKTtcbiAgICAgICAgY29uc3Qgb3JnTmFtZSA9IHRoaXMub3JnYW5pemF0aW9ucy5maW5kKG8gPT4gby5pZCA9PT0gdGhpcy5vcmdhbml6YXRpb25JZCk/Lm5hbWUgPz8gdGhpcy5pMThuU2VydmljZS50KCdvcmdhbml6YXRpb24nKTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5mb3JtUHJvbWlzZSA9IHRoaXMuY2lwaGVyU2VydmljZS5zaGFyZVdpdGhTZXJ2ZXIoY2lwaGVyVmlldywgdGhpcy5vcmdhbml6YXRpb25JZCxcbiAgICAgICAgICAgICAgICBzZWxlY3RlZENvbGxlY3Rpb25JZHMpLnRoZW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uU2hhcmVkQ2lwaGVyLmVtaXQoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbGF0Zm9ybVV0aWxzU2VydmljZS5zaG93VG9hc3QoJ3N1Y2Nlc3MnLCBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pMThuU2VydmljZS50KCdtb3ZlZEl0ZW1Ub09yZycsIGNpcGhlclZpZXcubmFtZSwgb3JnTmFtZSkpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5mb3JtUHJvbWlzZTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ1NlcnZpY2UuZXJyb3IoZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGdldCBjYW5TYXZlKCkge1xuICAgICAgICBpZiAodGhpcy5jb2xsZWN0aW9ucyAhPSBudWxsKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY29sbGVjdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoKHRoaXMuY29sbGVjdGlvbnNbaV0gYXMgYW55KS5jaGVja2VkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgRGlyZWN0aXZlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICAgIEFjdGl2YXRlZFJvdXRlLFxuICAgIFJvdXRlcixcbn0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcblxuaW1wb3J0IHsgZmlyc3QgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IEFwaVNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL2FwaS5zZXJ2aWNlJztcbmltcG9ydCB7IEF1dGhTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9hdXRoLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ3J5cHRvRnVuY3Rpb25TZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9jcnlwdG9GdW5jdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IEVudmlyb25tZW50U2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvZW52aXJvbm1lbnQuc2VydmljZSc7XG5pbXBvcnQgeyBJMThuU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvaTE4bi5zZXJ2aWNlJztcbmltcG9ydCB7IExvZ1NlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL2xvZy5zZXJ2aWNlJztcbmltcG9ydCB7IFBhc3N3b3JkR2VuZXJhdGlvblNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL3Bhc3N3b3JkR2VuZXJhdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IFBsYXRmb3JtVXRpbHNTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9wbGF0Zm9ybVV0aWxzLnNlcnZpY2UnO1xuaW1wb3J0IHsgU3RhdGVTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9zdGF0ZS5zZXJ2aWNlJztcbmltcG9ydCB7IFN0b3JhZ2VTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9zdG9yYWdlLnNlcnZpY2UnO1xuXG5pbXBvcnQgeyBDb25zdGFudHNTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL3NlcnZpY2VzL2NvbnN0YW50cy5zZXJ2aWNlJztcblxuaW1wb3J0IHsgVXRpbHMgfSBmcm9tICdqc2xpYi1jb21tb24vbWlzYy91dGlscyc7XG5cbmltcG9ydCB7IEF1dGhSZXN1bHQgfSBmcm9tICdqc2xpYi1jb21tb24vbW9kZWxzL2RvbWFpbi9hdXRoUmVzdWx0JztcblxuQERpcmVjdGl2ZSgpXG5leHBvcnQgY2xhc3MgU3NvQ29tcG9uZW50IHtcbiAgICBpZGVudGlmaWVyOiBzdHJpbmc7XG4gICAgbG9nZ2luZ0luID0gZmFsc2U7XG5cbiAgICBmb3JtUHJvbWlzZTogUHJvbWlzZTxBdXRoUmVzdWx0PjtcbiAgICBpbml0aWF0ZVNzb0Zvcm1Qcm9taXNlOiBQcm9taXNlPGFueT47XG4gICAgb25TdWNjZXNzZnVsTG9naW46ICgpID0+IFByb21pc2U8YW55PjtcbiAgICBvblN1Y2Nlc3NmdWxMb2dpbk5hdmlnYXRlOiAoKSA9PiBQcm9taXNlPGFueT47XG4gICAgb25TdWNjZXNzZnVsTG9naW5Ud29GYWN0b3JOYXZpZ2F0ZTogKCkgPT4gUHJvbWlzZTxhbnk+O1xuICAgIG9uU3VjY2Vzc2Z1bExvZ2luQ2hhbmdlUGFzc3dvcmROYXZpZ2F0ZTogKCkgPT4gUHJvbWlzZTxhbnk+O1xuICAgIG9uU3VjY2Vzc2Z1bExvZ2luRm9yY2VSZXNldE5hdmlnYXRlOiAoKSA9PiBQcm9taXNlPGFueT47XG5cbiAgICBwcm90ZWN0ZWQgdHdvRmFjdG9yUm91dGUgPSAnMmZhJztcbiAgICBwcm90ZWN0ZWQgc3VjY2Vzc1JvdXRlID0gJ2xvY2snO1xuICAgIHByb3RlY3RlZCBjaGFuZ2VQYXNzd29yZFJvdXRlID0gJ3NldC1wYXNzd29yZCc7XG4gICAgcHJvdGVjdGVkIGZvcmNlUGFzc3dvcmRSZXNldFJvdXRlID0gJ3VwZGF0ZS10ZW1wLXBhc3N3b3JkJztcbiAgICBwcm90ZWN0ZWQgY2xpZW50SWQ6IHN0cmluZztcbiAgICBwcm90ZWN0ZWQgcmVkaXJlY3RVcmk6IHN0cmluZztcbiAgICBwcm90ZWN0ZWQgc3RhdGU6IHN0cmluZztcbiAgICBwcm90ZWN0ZWQgY29kZUNoYWxsZW5nZTogc3RyaW5nO1xuXG4gICAgY29uc3RydWN0b3IocHJvdGVjdGVkIGF1dGhTZXJ2aWNlOiBBdXRoU2VydmljZSwgcHJvdGVjdGVkIHJvdXRlcjogUm91dGVyLFxuICAgICAgICBwcm90ZWN0ZWQgaTE4blNlcnZpY2U6IEkxOG5TZXJ2aWNlLCBwcm90ZWN0ZWQgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgICAgICBwcm90ZWN0ZWQgc3RvcmFnZVNlcnZpY2U6IFN0b3JhZ2VTZXJ2aWNlLCBwcm90ZWN0ZWQgc3RhdGVTZXJ2aWNlOiBTdGF0ZVNlcnZpY2UsXG4gICAgICAgIHByb3RlY3RlZCBwbGF0Zm9ybVV0aWxzU2VydmljZTogUGxhdGZvcm1VdGlsc1NlcnZpY2UsIHByb3RlY3RlZCBhcGlTZXJ2aWNlOiBBcGlTZXJ2aWNlLFxuICAgICAgICBwcm90ZWN0ZWQgY3J5cHRvRnVuY3Rpb25TZXJ2aWNlOiBDcnlwdG9GdW5jdGlvblNlcnZpY2UsIHByb3RlY3RlZCBlbnZpcm9ubWVudFNlcnZpY2U6IEVudmlyb25tZW50U2VydmljZSxcbiAgICAgICAgcHJvdGVjdGVkIHBhc3N3b3JkR2VuZXJhdGlvblNlcnZpY2U6IFBhc3N3b3JkR2VuZXJhdGlvblNlcnZpY2UsIHByb3RlY3RlZCBsb2dTZXJ2aWNlOiBMb2dTZXJ2aWNlKSB7IH1cblxuICAgIGFzeW5jIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLnJvdXRlLnF1ZXJ5UGFyYW1zLnBpcGUoZmlyc3QoKSkuc3Vic2NyaWJlKGFzeW5jIHFQYXJhbXMgPT4ge1xuICAgICAgICAgICAgaWYgKHFQYXJhbXMuY29kZSAhPSBudWxsICYmIHFQYXJhbXMuc3RhdGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvZGVWZXJpZmllciA9IGF3YWl0IHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0PHN0cmluZz4oQ29uc3RhbnRzU2VydmljZS5zc29Db2RlVmVyaWZpZXJLZXkpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0YXRlID0gYXdhaXQgdGhpcy5zdG9yYWdlU2VydmljZS5nZXQ8c3RyaW5nPihDb25zdGFudHNTZXJ2aWNlLnNzb1N0YXRlS2V5KTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnJlbW92ZShDb25zdGFudHNTZXJ2aWNlLnNzb0NvZGVWZXJpZmllcktleSk7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zdG9yYWdlU2VydmljZS5yZW1vdmUoQ29uc3RhbnRzU2VydmljZS5zc29TdGF0ZUtleSk7XG4gICAgICAgICAgICAgICAgaWYgKHFQYXJhbXMuY29kZSAhPSBudWxsICYmIGNvZGVWZXJpZmllciAhPSBudWxsICYmIHN0YXRlICE9IG51bGwgJiYgdGhpcy5jaGVja1N0YXRlKHN0YXRlLCBxUGFyYW1zLnN0YXRlKSkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmxvZ0luKHFQYXJhbXMuY29kZSwgY29kZVZlcmlmaWVyLCB0aGlzLmdldE9yZ0lkZW50aWZlckZyb21TdGF0ZShxUGFyYW1zLnN0YXRlKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChxUGFyYW1zLmNsaWVudElkICE9IG51bGwgJiYgcVBhcmFtcy5yZWRpcmVjdFVyaSAhPSBudWxsICYmIHFQYXJhbXMuc3RhdGUgIT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgIHFQYXJhbXMuY29kZUNoYWxsZW5nZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWRpcmVjdFVyaSA9IHFQYXJhbXMucmVkaXJlY3RVcmk7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IHFQYXJhbXMuc3RhdGU7XG4gICAgICAgICAgICAgICAgdGhpcy5jb2RlQ2hhbGxlbmdlID0gcVBhcmFtcy5jb2RlQ2hhbGxlbmdlO1xuICAgICAgICAgICAgICAgIHRoaXMuY2xpZW50SWQgPSBxUGFyYW1zLmNsaWVudElkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBhc3luYyBzdWJtaXQocmV0dXJuVXJpPzogc3RyaW5nLCBpbmNsdWRlVXNlcklkZW50aWZpZXI/OiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuaW5pdGlhdGVTc29Gb3JtUHJvbWlzZSA9IHRoaXMucHJlVmFsaWRhdGUoKTtcbiAgICAgICAgaWYgKGF3YWl0IHRoaXMuaW5pdGlhdGVTc29Gb3JtUHJvbWlzZSkge1xuICAgICAgICAgICAgY29uc3QgYXV0aG9yaXplVXJsID0gYXdhaXQgdGhpcy5idWlsZEF1dGhvcml6ZVVybChyZXR1cm5VcmksIGluY2x1ZGVVc2VySWRlbnRpZmllcik7XG4gICAgICAgICAgICB0aGlzLnBsYXRmb3JtVXRpbHNTZXJ2aWNlLmxhdW5jaFVyaShhdXRob3JpemVVcmwsIHsgc2FtZVdpbmRvdzogdHJ1ZSB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIHByZVZhbGlkYXRlKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICBpZiAodGhpcy5pZGVudGlmaWVyID09IG51bGwgfHwgdGhpcy5pZGVudGlmaWVyID09PSAnJykge1xuICAgICAgICAgICAgdGhpcy5wbGF0Zm9ybVV0aWxzU2VydmljZS5zaG93VG9hc3QoJ2Vycm9yJywgdGhpcy5pMThuU2VydmljZS50KCdzc29WYWxpZGF0aW9uRmFpbGVkJyksXG4gICAgICAgICAgICAgICAgdGhpcy5pMThuU2VydmljZS50KCdzc29JZGVudGlmaWVyUmVxdWlyZWQnKSk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuYXBpU2VydmljZS5wcmVWYWxpZGF0ZVNzbyh0aGlzLmlkZW50aWZpZXIpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBhc3luYyBidWlsZEF1dGhvcml6ZVVybChyZXR1cm5Vcmk/OiBzdHJpbmcsIGluY2x1ZGVVc2VySWRlbnRpZmllcj86IGJvb2xlYW4pOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBsZXQgY29kZUNoYWxsZW5nZSA9IHRoaXMuY29kZUNoYWxsZW5nZTtcbiAgICAgICAgbGV0IHN0YXRlID0gdGhpcy5zdGF0ZTtcblxuICAgICAgICBjb25zdCBwYXNzd29yZE9wdGlvbnM6IGFueSA9IHtcbiAgICAgICAgICAgIHR5cGU6ICdwYXNzd29yZCcsXG4gICAgICAgICAgICBsZW5ndGg6IDY0LFxuICAgICAgICAgICAgdXBwZXJjYXNlOiB0cnVlLFxuICAgICAgICAgICAgbG93ZXJjYXNlOiB0cnVlLFxuICAgICAgICAgICAgbnVtYmVyczogdHJ1ZSxcbiAgICAgICAgICAgIHNwZWNpYWw6IGZhbHNlLFxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChjb2RlQ2hhbGxlbmdlID09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvZGVWZXJpZmllciA9IGF3YWl0IHRoaXMucGFzc3dvcmRHZW5lcmF0aW9uU2VydmljZS5nZW5lcmF0ZVBhc3N3b3JkKHBhc3N3b3JkT3B0aW9ucyk7XG4gICAgICAgICAgICBjb25zdCBjb2RlVmVyaWZpZXJIYXNoID0gYXdhaXQgdGhpcy5jcnlwdG9GdW5jdGlvblNlcnZpY2UuaGFzaChjb2RlVmVyaWZpZXIsICdzaGEyNTYnKTtcbiAgICAgICAgICAgIGNvZGVDaGFsbGVuZ2UgPSBVdGlscy5mcm9tQnVmZmVyVG9VcmxCNjQoY29kZVZlcmlmaWVySGFzaCk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNhdmUoQ29uc3RhbnRzU2VydmljZS5zc29Db2RlVmVyaWZpZXJLZXksIGNvZGVWZXJpZmllcik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3RhdGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgc3RhdGUgPSBhd2FpdCB0aGlzLnBhc3N3b3JkR2VuZXJhdGlvblNlcnZpY2UuZ2VuZXJhdGVQYXNzd29yZChwYXNzd29yZE9wdGlvbnMpO1xuICAgICAgICAgICAgaWYgKHJldHVyblVyaSkge1xuICAgICAgICAgICAgICAgIHN0YXRlICs9IGBfcmV0dXJuVXJpPScke3JldHVyblVyaX0nYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFkZCBPcmdhbml6YXRpb24gSWRlbnRpZmllciB0byBzdGF0ZVxuICAgICAgICBzdGF0ZSArPSBgX2lkZW50aWZpZXI9JHt0aGlzLmlkZW50aWZpZXJ9YDtcblxuICAgICAgICAvLyBTYXZlIHN0YXRlIChyZWdhcmRsZXNzIG9mIG5ldyBvciBleGlzdGluZylcbiAgICAgICAgYXdhaXQgdGhpcy5zdG9yYWdlU2VydmljZS5zYXZlKENvbnN0YW50c1NlcnZpY2Uuc3NvU3RhdGVLZXksIHN0YXRlKTtcblxuICAgICAgICBsZXQgYXV0aG9yaXplVXJsID0gdGhpcy5lbnZpcm9ubWVudFNlcnZpY2UuZ2V0SWRlbnRpdHlVcmwoKSArICcvY29ubmVjdC9hdXRob3JpemU/JyArXG4gICAgICAgICAgICAnY2xpZW50X2lkPScgKyB0aGlzLmNsaWVudElkICsgJyZyZWRpcmVjdF91cmk9JyArIGVuY29kZVVSSUNvbXBvbmVudCh0aGlzLnJlZGlyZWN0VXJpKSArICcmJyArXG4gICAgICAgICAgICAncmVzcG9uc2VfdHlwZT1jb2RlJnNjb3BlPWFwaSBvZmZsaW5lX2FjY2VzcyYnICtcbiAgICAgICAgICAgICdzdGF0ZT0nICsgc3RhdGUgKyAnJmNvZGVfY2hhbGxlbmdlPScgKyBjb2RlQ2hhbGxlbmdlICsgJyYnICtcbiAgICAgICAgICAgICdjb2RlX2NoYWxsZW5nZV9tZXRob2Q9UzI1NiZyZXNwb25zZV9tb2RlPXF1ZXJ5JicgK1xuICAgICAgICAgICAgJ2RvbWFpbl9oaW50PScgKyBlbmNvZGVVUklDb21wb25lbnQodGhpcy5pZGVudGlmaWVyKTtcblxuICAgICAgICBpZiAoaW5jbHVkZVVzZXJJZGVudGlmaWVyKSB7XG4gICAgICAgICAgICBjb25zdCB1c2VySWRlbnRpZmllciA9IGF3YWl0IHRoaXMuYXBpU2VydmljZS5nZXRTc29Vc2VySWRlbnRpZmllcigpO1xuICAgICAgICAgICAgYXV0aG9yaXplVXJsICs9IGAmdXNlcl9pZGVudGlmaWVyPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHVzZXJJZGVudGlmaWVyKX1gO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGF1dGhvcml6ZVVybDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGxvZ0luKGNvZGU6IHN0cmluZywgY29kZVZlcmlmaWVyOiBzdHJpbmcsIG9yZ0lkRnJvbVN0YXRlOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5sb2dnaW5nSW4gPSB0cnVlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5mb3JtUHJvbWlzZSA9IHRoaXMuYXV0aFNlcnZpY2UubG9nSW5Tc28oY29kZSwgY29kZVZlcmlmaWVyLCB0aGlzLnJlZGlyZWN0VXJpLCBvcmdJZEZyb21TdGF0ZSk7XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuZm9ybVByb21pc2U7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2UudHdvRmFjdG9yKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub25TdWNjZXNzZnVsTG9naW5Ud29GYWN0b3JOYXZpZ2F0ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25TdWNjZXNzZnVsTG9naW5Ud29GYWN0b3JOYXZpZ2F0ZSgpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFt0aGlzLnR3b0ZhY3RvclJvdXRlXSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlQYXJhbXM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudGlmaWVyOiBvcmdJZEZyb21TdGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc286ICd0cnVlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzcG9uc2UucmVzZXRNYXN0ZXJQYXNzd29yZCkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9uU3VjY2Vzc2Z1bExvZ2luQ2hhbmdlUGFzc3dvcmROYXZpZ2F0ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25TdWNjZXNzZnVsTG9naW5DaGFuZ2VQYXNzd29yZE5hdmlnYXRlKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW3RoaXMuY2hhbmdlUGFzc3dvcmRSb3V0ZV0sIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UGFyYW1zOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnRpZmllcjogb3JnSWRGcm9tU3RhdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHJlc3BvbnNlLmZvcmNlUGFzc3dvcmRSZXNldCkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9uU3VjY2Vzc2Z1bExvZ2luRm9yY2VSZXNldE5hdmlnYXRlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vblN1Y2Nlc3NmdWxMb2dpbkZvcmNlUmVzZXROYXZpZ2F0ZSgpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFt0aGlzLmZvcmNlUGFzc3dvcmRSZXNldFJvdXRlXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkaXNhYmxlRmF2aWNvbiA9IGF3YWl0IHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0PGJvb2xlYW4+KENvbnN0YW50c1NlcnZpY2UuZGlzYWJsZUZhdmljb25LZXkpO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc3RhdGVTZXJ2aWNlLnNhdmUoQ29uc3RhbnRzU2VydmljZS5kaXNhYmxlRmF2aWNvbktleSwgISFkaXNhYmxlRmF2aWNvbik7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub25TdWNjZXNzZnVsTG9naW4gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uU3VjY2Vzc2Z1bExvZ2luKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9uU3VjY2Vzc2Z1bExvZ2luTmF2aWdhdGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uU3VjY2Vzc2Z1bExvZ2luTmF2aWdhdGUoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbdGhpcy5zdWNjZXNzUm91dGVdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRoaXMubG9nU2VydmljZS5lcnJvcihlKTtcbiAgICAgICAgICAgIGlmIChlLm1lc3NhZ2UgPT09ICdVbmFibGUgdG8gcmVhY2ggY3J5cHRvIGFnZW50Jykge1xuICAgICAgICAgICAgICAgIHRoaXMucGxhdGZvcm1VdGlsc1NlcnZpY2Uuc2hvd1RvYXN0KCdlcnJvcicsIG51bGwsIHRoaXMuaTE4blNlcnZpY2UudCgnc3NvQ3J5cHRvQWdlbnRVbmF2YWlsYWJsZScpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxvZ2dpbmdJbiA9IGZhbHNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0T3JnSWRlbnRpZmVyRnJvbVN0YXRlKHN0YXRlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBpZiAoc3RhdGUgPT09IG51bGwgfHwgc3RhdGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzdGF0ZVNwbGl0ID0gc3RhdGUuc3BsaXQoJ19pZGVudGlmaWVyPScpO1xuICAgICAgICByZXR1cm4gc3RhdGVTcGxpdC5sZW5ndGggPiAxID8gc3RhdGVTcGxpdFsxXSA6IG51bGw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjaGVja1N0YXRlKHN0YXRlOiBzdHJpbmcsIGNoZWNrU3RhdGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoc3RhdGUgPT09IG51bGwgfHwgc3RhdGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGVja1N0YXRlID09PSBudWxsIHx8IGNoZWNrU3RhdGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3RhdGVTcGxpdCA9IHN0YXRlLnNwbGl0KCdfaWRlbnRpZmllcj0nKTtcbiAgICAgICAgY29uc3QgY2hlY2tTdGF0ZVNwbGl0ID0gY2hlY2tTdGF0ZS5zcGxpdCgnX2lkZW50aWZpZXI9Jyk7XG4gICAgICAgIHJldHVybiBzdGF0ZVNwbGl0WzBdID09PSBjaGVja1N0YXRlU3BsaXRbMF07XG4gICAgfVxufVxuIiwiaW1wb3J0IHtcbiAgICBEaXJlY3RpdmUsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIE9uSW5pdCxcbiAgICBPdXRwdXQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcblxuaW1wb3J0IHsgVHdvRmFjdG9yUHJvdmlkZXJUeXBlIH0gZnJvbSAnanNsaWItY29tbW9uL2VudW1zL3R3b0ZhY3RvclByb3ZpZGVyVHlwZSc7XG5cbmltcG9ydCB7IEF1dGhTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9hdXRoLnNlcnZpY2UnO1xuaW1wb3J0IHsgSTE4blNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL2kxOG4uc2VydmljZSc7XG5pbXBvcnQgeyBQbGF0Zm9ybVV0aWxzU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvcGxhdGZvcm1VdGlscy5zZXJ2aWNlJztcblxuQERpcmVjdGl2ZSgpXG5leHBvcnQgY2xhc3MgVHdvRmFjdG9yT3B0aW9uc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gICAgQE91dHB1dCgpIG9uUHJvdmlkZXJTZWxlY3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8VHdvRmFjdG9yUHJvdmlkZXJUeXBlPigpO1xuICAgIEBPdXRwdXQoKSBvblJlY292ZXJTZWxlY3RlZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAgIHByb3ZpZGVyczogYW55W10gPSBbXTtcblxuICAgIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBhdXRoU2VydmljZTogQXV0aFNlcnZpY2UsIHByb3RlY3RlZCByb3V0ZXI6IFJvdXRlcixcbiAgICAgICAgcHJvdGVjdGVkIGkxOG5TZXJ2aWNlOiBJMThuU2VydmljZSwgcHJvdGVjdGVkIHBsYXRmb3JtVXRpbHNTZXJ2aWNlOiBQbGF0Zm9ybVV0aWxzU2VydmljZSxcbiAgICAgICAgcHJvdGVjdGVkIHdpbjogV2luZG93KSB7IH1cblxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLnByb3ZpZGVycyA9IHRoaXMuYXV0aFNlcnZpY2UuZ2V0U3VwcG9ydGVkVHdvRmFjdG9yUHJvdmlkZXJzKHRoaXMud2luKTtcbiAgICB9XG5cbiAgICBjaG9vc2UocDogYW55KSB7XG4gICAgICAgIHRoaXMub25Qcm92aWRlclNlbGVjdGVkLmVtaXQocC50eXBlKTtcbiAgICB9XG5cbiAgICByZWNvdmVyKCkge1xuICAgICAgICB0aGlzLnBsYXRmb3JtVXRpbHNTZXJ2aWNlLmxhdW5jaFVyaSgnaHR0cHM6Ly9oZWxwLmJpdHdhcmRlbi5jb20vYXJ0aWNsZS9sb3N0LXR3by1zdGVwLWRldmljZS8nKTtcbiAgICAgICAgdGhpcy5vblJlY292ZXJTZWxlY3RlZC5lbWl0KCk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgRGlyZWN0aXZlLCBPbkRlc3Ryb3ksIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQge1xuICAgIEFjdGl2YXRlZFJvdXRlLFxuICAgIFJvdXRlcixcbn0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcblxuaW1wb3J0IHsgZmlyc3QgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IFR3b0ZhY3RvclByb3ZpZGVyVHlwZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9lbnVtcy90d29GYWN0b3JQcm92aWRlclR5cGUnO1xuXG5pbXBvcnQgeyBUd29GYWN0b3JFbWFpbFJlcXVlc3QgfSBmcm9tICdqc2xpYi1jb21tb24vbW9kZWxzL3JlcXVlc3QvdHdvRmFjdG9yRW1haWxSZXF1ZXN0JztcblxuaW1wb3J0IHsgQXV0aFJlc3VsdCB9IGZyb20gJ2pzbGliLWNvbW1vbi9tb2RlbHMvZG9tYWluL2F1dGhSZXN1bHQnO1xuXG5pbXBvcnQgeyBBcGlTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9hcGkuc2VydmljZSc7XG5pbXBvcnQgeyBBdXRoU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvYXV0aC5zZXJ2aWNlJztcbmltcG9ydCB7IEVudmlyb25tZW50U2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvZW52aXJvbm1lbnQuc2VydmljZSc7XG5pbXBvcnQgeyBJMThuU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvaTE4bi5zZXJ2aWNlJztcbmltcG9ydCB7IExvZ1NlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL2xvZy5zZXJ2aWNlJztcbmltcG9ydCB7IFBsYXRmb3JtVXRpbHNTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9wbGF0Zm9ybVV0aWxzLnNlcnZpY2UnO1xuaW1wb3J0IHsgU3RhdGVTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9zdGF0ZS5zZXJ2aWNlJztcbmltcG9ydCB7IFN0b3JhZ2VTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9zdG9yYWdlLnNlcnZpY2UnO1xuXG5pbXBvcnQgeyBUd29GYWN0b3JQcm92aWRlcnMgfSBmcm9tICdqc2xpYi1jb21tb24vc2VydmljZXMvYXV0aC5zZXJ2aWNlJztcbmltcG9ydCB7IENvbnN0YW50c1NlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vc2VydmljZXMvY29uc3RhbnRzLnNlcnZpY2UnO1xuXG5pbXBvcnQgKiBhcyBEdW9XZWJTREsgZnJvbSAnZHVvX3dlYl9zZGsnO1xuaW1wb3J0IHsgV2ViQXV0aG5JRnJhbWUgfSBmcm9tICdqc2xpYi1jb21tb24vbWlzYy93ZWJhdXRobl9pZnJhbWUnO1xuXG5ARGlyZWN0aXZlKClcbmV4cG9ydCBjbGFzcyBUd29GYWN0b3JDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gICAgdG9rZW46IHN0cmluZyA9ICcnO1xuICAgIHJlbWVtYmVyOiBib29sZWFuID0gZmFsc2U7XG4gICAgd2ViQXV0aG5SZWFkeTogYm9vbGVhbiA9IGZhbHNlO1xuICAgIHdlYkF1dGhuTmV3VGFiOiBib29sZWFuID0gZmFsc2U7XG4gICAgcHJvdmlkZXJzID0gVHdvRmFjdG9yUHJvdmlkZXJzO1xuICAgIHByb3ZpZGVyVHlwZSA9IFR3b0ZhY3RvclByb3ZpZGVyVHlwZTtcbiAgICBzZWxlY3RlZFByb3ZpZGVyVHlwZTogVHdvRmFjdG9yUHJvdmlkZXJUeXBlID0gVHdvRmFjdG9yUHJvdmlkZXJUeXBlLkF1dGhlbnRpY2F0b3I7XG4gICAgd2ViQXV0aG5TdXBwb3J0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICB3ZWJBdXRobjogV2ViQXV0aG5JRnJhbWUgPSBudWxsO1xuICAgIHRpdGxlOiBzdHJpbmcgPSAnJztcbiAgICB0d29GYWN0b3JFbWFpbDogc3RyaW5nID0gbnVsbDtcbiAgICBmb3JtUHJvbWlzZTogUHJvbWlzZTxhbnk+O1xuICAgIGVtYWlsUHJvbWlzZTogUHJvbWlzZTxhbnk+O1xuICAgIGlkZW50aWZpZXI6IHN0cmluZyA9IG51bGw7XG4gICAgb25TdWNjZXNzZnVsTG9naW46ICgpID0+IFByb21pc2U8YW55PjtcbiAgICBvblN1Y2Nlc3NmdWxMb2dpbk5hdmlnYXRlOiAoKSA9PiBQcm9taXNlPGFueT47XG5cbiAgICBnZXQgd2ViQXV0aG5BbGxvdygpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gYHB1YmxpY2tleS1jcmVkZW50aWFscy1nZXQgJHt0aGlzLmVudmlyb25tZW50U2VydmljZS5nZXRXZWJWYXVsdFVybCgpfWA7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGxvZ2luUm91dGUgPSAnbG9naW4nO1xuICAgIHByb3RlY3RlZCBzdWNjZXNzUm91dGUgPSAndmF1bHQnO1xuXG4gICAgY29uc3RydWN0b3IocHJvdGVjdGVkIGF1dGhTZXJ2aWNlOiBBdXRoU2VydmljZSwgcHJvdGVjdGVkIHJvdXRlcjogUm91dGVyLFxuICAgICAgICBwcm90ZWN0ZWQgaTE4blNlcnZpY2U6IEkxOG5TZXJ2aWNlLCBwcm90ZWN0ZWQgYXBpU2VydmljZTogQXBpU2VydmljZSxcbiAgICAgICAgcHJvdGVjdGVkIHBsYXRmb3JtVXRpbHNTZXJ2aWNlOiBQbGF0Zm9ybVV0aWxzU2VydmljZSwgcHJvdGVjdGVkIHdpbjogV2luZG93LFxuICAgICAgICBwcm90ZWN0ZWQgZW52aXJvbm1lbnRTZXJ2aWNlOiBFbnZpcm9ubWVudFNlcnZpY2UsIHByb3RlY3RlZCBzdGF0ZVNlcnZpY2U6IFN0YXRlU2VydmljZSxcbiAgICAgICAgcHJvdGVjdGVkIHN0b3JhZ2VTZXJ2aWNlOiBTdG9yYWdlU2VydmljZSwgcHJvdGVjdGVkIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICAgICAgcHJvdGVjdGVkIGxvZ1NlcnZpY2U6IExvZ1NlcnZpY2UpIHtcbiAgICAgICAgdGhpcy53ZWJBdXRoblN1cHBvcnRlZCA9IHRoaXMucGxhdGZvcm1VdGlsc1NlcnZpY2Uuc3VwcG9ydHNXZWJBdXRobih3aW4pO1xuICAgIH1cblxuICAgIGFzeW5jIG5nT25Jbml0KCkge1xuICAgICAgICBpZiAoIXRoaXMuYXV0aGluZyB8fCB0aGlzLmF1dGhTZXJ2aWNlLnR3b0ZhY3RvclByb3ZpZGVyc0RhdGEgPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW3RoaXMubG9naW5Sb3V0ZV0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yb3V0ZS5xdWVyeVBhcmFtcy5waXBlKGZpcnN0KCkpLnN1YnNjcmliZShxUGFyYW1zID0+IHtcbiAgICAgICAgICAgIGlmIChxUGFyYW1zLmlkZW50aWZpZXIgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuaWRlbnRpZmllciA9IHFQYXJhbXMuaWRlbnRpZmllcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHRoaXMubmVlZHNMb2NrKSB7XG4gICAgICAgICAgICB0aGlzLnN1Y2Nlc3NSb3V0ZSA9ICdsb2NrJztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLndpbiAhPSBudWxsICYmIHRoaXMud2ViQXV0aG5TdXBwb3J0ZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHdlYlZhdWx0VXJsID0gdGhpcy5lbnZpcm9ubWVudFNlcnZpY2UuZ2V0V2ViVmF1bHRVcmwoKTtcbiAgICAgICAgICAgIHRoaXMud2ViQXV0aG4gPSBuZXcgV2ViQXV0aG5JRnJhbWUodGhpcy53aW4sIHdlYlZhdWx0VXJsLCB0aGlzLndlYkF1dGhuTmV3VGFiLCB0aGlzLnBsYXRmb3JtVXRpbHNTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHRoaXMuaTE4blNlcnZpY2UsICh0b2tlbjogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG9rZW4gPSB0b2tlbjtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdWJtaXQoKTtcbiAgICAgICAgICAgICAgICB9LCAoZXJyb3I6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsYXRmb3JtVXRpbHNTZXJ2aWNlLnNob3dUb2FzdCgnZXJyb3InLCB0aGlzLmkxOG5TZXJ2aWNlLnQoJ2Vycm9yT2NjdXJyZWQnKSwgZXJyb3IpO1xuICAgICAgICAgICAgICAgIH0sIChpbmZvOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluZm8gPT09ICdyZWFkeScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMud2ViQXV0aG5SZWFkeSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZWxlY3RlZFByb3ZpZGVyVHlwZSA9IHRoaXMuYXV0aFNlcnZpY2UuZ2V0RGVmYXVsdFR3b0ZhY3RvclByb3ZpZGVyKHRoaXMud2ViQXV0aG5TdXBwb3J0ZWQpO1xuICAgICAgICBhd2FpdCB0aGlzLmluaXQoKTtcbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jbGVhbnVwV2ViQXV0aG4oKTtcbiAgICAgICAgdGhpcy53ZWJBdXRobiA9IG51bGw7XG4gICAgfVxuXG4gICAgYXN5bmMgaW5pdCgpIHtcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRQcm92aWRlclR5cGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy50aXRsZSA9IHRoaXMuaTE4blNlcnZpY2UudCgnbG9naW5VbmF2YWlsYWJsZScpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jbGVhbnVwV2ViQXV0aG4oKTtcbiAgICAgICAgdGhpcy50aXRsZSA9IChUd29GYWN0b3JQcm92aWRlcnMgYXMgYW55KVt0aGlzLnNlbGVjdGVkUHJvdmlkZXJUeXBlXS5uYW1lO1xuICAgICAgICBjb25zdCBwcm92aWRlckRhdGEgPSB0aGlzLmF1dGhTZXJ2aWNlLnR3b0ZhY3RvclByb3ZpZGVyc0RhdGEuZ2V0KHRoaXMuc2VsZWN0ZWRQcm92aWRlclR5cGUpO1xuICAgICAgICBzd2l0Y2ggKHRoaXMuc2VsZWN0ZWRQcm92aWRlclR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgVHdvRmFjdG9yUHJvdmlkZXJUeXBlLldlYkF1dGhuOlxuICAgICAgICAgICAgICAgIGlmICghdGhpcy53ZWJBdXRobk5ld1RhYikge1xuICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXV0aFdlYkF1dGhuKCk7XG4gICAgICAgICAgICAgICAgICAgIH0sIDUwMCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBUd29GYWN0b3JQcm92aWRlclR5cGUuRHVvOlxuICAgICAgICAgICAgY2FzZSBUd29GYWN0b3JQcm92aWRlclR5cGUuT3JnYW5pemF0aW9uRHVvOlxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBEdW9XZWJTREsuaW5pdCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZnJhbWU6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGhvc3Q6IHByb3ZpZGVyRGF0YS5Ib3N0LFxuICAgICAgICAgICAgICAgICAgICAgICAgc2lnX3JlcXVlc3Q6IHByb3ZpZGVyRGF0YS5TaWduYXR1cmUsXG4gICAgICAgICAgICAgICAgICAgICAgICBzdWJtaXRfY2FsbGJhY2s6IGFzeW5jIChmOiBIVE1MRm9ybUVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaWcgPSBmLnF1ZXJ5U2VsZWN0b3IoJ2lucHV0W25hbWU9XCJzaWdfcmVzcG9uc2VcIl0nKSBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaWcgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRva2VuID0gc2lnLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnN1Ym1pdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0sIDApO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBUd29GYWN0b3JQcm92aWRlclR5cGUuRW1haWw6XG4gICAgICAgICAgICAgICAgdGhpcy50d29GYWN0b3JFbWFpbCA9IHByb3ZpZGVyRGF0YS5FbWFpbDtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5hdXRoU2VydmljZS50d29GYWN0b3JQcm92aWRlcnNEYXRhLnNpemUgPiAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc2VuZEVtYWlsKGZhbHNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgc3VibWl0KCkge1xuICAgICAgICBpZiAodGhpcy50b2tlbiA9PSBudWxsIHx8IHRoaXMudG9rZW4gPT09ICcnKSB7XG4gICAgICAgICAgICB0aGlzLnBsYXRmb3JtVXRpbHNTZXJ2aWNlLnNob3dUb2FzdCgnZXJyb3InLCB0aGlzLmkxOG5TZXJ2aWNlLnQoJ2Vycm9yT2NjdXJyZWQnKSxcbiAgICAgICAgICAgICAgICB0aGlzLmkxOG5TZXJ2aWNlLnQoJ3ZlcmlmaWNhdGlvbkNvZGVSZXF1aXJlZCcpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkUHJvdmlkZXJUeXBlID09PSBUd29GYWN0b3JQcm92aWRlclR5cGUuV2ViQXV0aG4pIHtcbiAgICAgICAgICAgIGlmICh0aGlzLndlYkF1dGhuICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLndlYkF1dGhuLnN0b3AoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0ZWRQcm92aWRlclR5cGUgPT09IFR3b0ZhY3RvclByb3ZpZGVyVHlwZS5FbWFpbCB8fFxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFByb3ZpZGVyVHlwZSA9PT0gVHdvRmFjdG9yUHJvdmlkZXJUeXBlLkF1dGhlbnRpY2F0b3IpIHtcbiAgICAgICAgICAgIHRoaXMudG9rZW4gPSB0aGlzLnRva2VuLnJlcGxhY2UoJyAnLCAnJykudHJpbSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZG9TdWJtaXQoKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICBpZiAodGhpcy5zZWxlY3RlZFByb3ZpZGVyVHlwZSA9PT0gVHdvRmFjdG9yUHJvdmlkZXJUeXBlLldlYkF1dGhuICYmIHRoaXMud2ViQXV0aG4gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMud2ViQXV0aG4uc3RhcnQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIGRvU3VibWl0KCkge1xuICAgICAgICB0aGlzLmZvcm1Qcm9taXNlID0gdGhpcy5hdXRoU2VydmljZS5sb2dJblR3b0ZhY3Rvcih0aGlzLnNlbGVjdGVkUHJvdmlkZXJUeXBlLCB0aGlzLnRva2VuLCB0aGlzLnJlbWVtYmVyKTtcbiAgICAgICAgY29uc3QgcmVzcG9uc2U6IEF1dGhSZXN1bHQgPSBhd2FpdCB0aGlzLmZvcm1Qcm9taXNlO1xuICAgICAgICBjb25zdCBkaXNhYmxlRmF2aWNvbiA9IGF3YWl0IHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0PGJvb2xlYW4+KENvbnN0YW50c1NlcnZpY2UuZGlzYWJsZUZhdmljb25LZXkpO1xuICAgICAgICBhd2FpdCB0aGlzLnN0YXRlU2VydmljZS5zYXZlKENvbnN0YW50c1NlcnZpY2UuZGlzYWJsZUZhdmljb25LZXksICEhZGlzYWJsZUZhdmljb24pO1xuICAgICAgICBpZiAodGhpcy5vblN1Y2Nlc3NmdWxMb2dpbiAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLm9uU3VjY2Vzc2Z1bExvZ2luKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc3BvbnNlLnJlc2V0TWFzdGVyUGFzc3dvcmQpIHtcbiAgICAgICAgICAgIHRoaXMuc3VjY2Vzc1JvdXRlID0gJ3NldC1wYXNzd29yZCc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc3BvbnNlLmZvcmNlUGFzc3dvcmRSZXNldCkge1xuICAgICAgICAgICAgdGhpcy5zdWNjZXNzUm91dGUgPSAndXBkYXRlLXRlbXAtcGFzc3dvcmQnO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm9uU3VjY2Vzc2Z1bExvZ2luTmF2aWdhdGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5vblN1Y2Nlc3NmdWxMb2dpbk5hdmlnYXRlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbdGhpcy5zdWNjZXNzUm91dGVdLCB7XG4gICAgICAgICAgICAgICAgcXVlcnlQYXJhbXM6IHtcbiAgICAgICAgICAgICAgICAgICAgaWRlbnRpZmllcjogdGhpcy5pZGVudGlmaWVyLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIHNlbmRFbWFpbChkb1RvYXN0OiBib29sZWFuKSB7XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkUHJvdmlkZXJUeXBlICE9PSBUd29GYWN0b3JQcm92aWRlclR5cGUuRW1haWwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmVtYWlsUHJvbWlzZSAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmVxdWVzdCA9IG5ldyBUd29GYWN0b3JFbWFpbFJlcXVlc3QodGhpcy5hdXRoU2VydmljZS5lbWFpbCwgdGhpcy5hdXRoU2VydmljZS5tYXN0ZXJQYXNzd29yZEhhc2gpO1xuICAgICAgICAgICAgdGhpcy5lbWFpbFByb21pc2UgPSB0aGlzLmFwaVNlcnZpY2UucG9zdFR3b0ZhY3RvckVtYWlsKHJlcXVlc3QpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5lbWFpbFByb21pc2U7XG4gICAgICAgICAgICBpZiAoZG9Ub2FzdCkge1xuICAgICAgICAgICAgICAgIHRoaXMucGxhdGZvcm1VdGlsc1NlcnZpY2Uuc2hvd1RvYXN0KCdzdWNjZXNzJywgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pMThuU2VydmljZS50KCd2ZXJpZmljYXRpb25Db2RlRW1haWxTZW50JywgdGhpcy50d29GYWN0b3JFbWFpbCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ1NlcnZpY2UuZXJyb3IoZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmVtYWlsUHJvbWlzZSA9IG51bGw7XG4gICAgfVxuXG4gICAgYXV0aFdlYkF1dGhuKCkge1xuICAgICAgICBjb25zdCBwcm92aWRlckRhdGEgPSB0aGlzLmF1dGhTZXJ2aWNlLnR3b0ZhY3RvclByb3ZpZGVyc0RhdGEuZ2V0KHRoaXMuc2VsZWN0ZWRQcm92aWRlclR5cGUpO1xuXG4gICAgICAgIGlmICghdGhpcy53ZWJBdXRoblN1cHBvcnRlZCB8fCB0aGlzLndlYkF1dGhuID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMud2ViQXV0aG4uaW5pdChwcm92aWRlckRhdGEpO1xuICAgIH1cblxuICAgIHByaXZhdGUgY2xlYW51cFdlYkF1dGhuKCkge1xuICAgICAgICBpZiAodGhpcy53ZWJBdXRobiAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLndlYkF1dGhuLnN0b3AoKTtcbiAgICAgICAgICAgIHRoaXMud2ViQXV0aG4uY2xlYW51cCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0IGF1dGhpbmcoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmF1dGhTZXJ2aWNlLmF1dGhpbmdXaXRoUGFzc3dvcmQoKSB8fCB0aGlzLmF1dGhTZXJ2aWNlLmF1dGhpbmdXaXRoU3NvKCkgfHwgdGhpcy5hdXRoU2VydmljZS5hdXRoaW5nV2l0aEFwaUtleSgpO1xuICAgIH1cblxuICAgIGdldCBuZWVkc0xvY2soKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmF1dGhTZXJ2aWNlLmF1dGhpbmdXaXRoU3NvKCkgfHwgdGhpcy5hdXRoU2VydmljZS5hdXRoaW5nV2l0aEFwaUtleSgpO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IERpcmVjdGl2ZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBBcGlTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9hcGkuc2VydmljZSc7XG5pbXBvcnQgeyBDcnlwdG9TZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9jcnlwdG8uc2VydmljZSc7XG5pbXBvcnQgeyBJMThuU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvaTE4bi5zZXJ2aWNlJztcbmltcG9ydCB7IExvZ1NlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL2xvZy5zZXJ2aWNlJztcbmltcG9ydCB7IE1lc3NhZ2luZ1NlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL21lc3NhZ2luZy5zZXJ2aWNlJztcbmltcG9ydCB7IFBhc3N3b3JkR2VuZXJhdGlvblNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL3Bhc3N3b3JkR2VuZXJhdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IFBsYXRmb3JtVXRpbHNTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9wbGF0Zm9ybVV0aWxzLnNlcnZpY2UnO1xuaW1wb3J0IHsgUG9saWN5U2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvcG9saWN5LnNlcnZpY2UnO1xuaW1wb3J0IHsgU3luY1NlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL3N5bmMuc2VydmljZSc7XG5pbXBvcnQgeyBVc2VyU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvdXNlci5zZXJ2aWNlJztcblxuaW1wb3J0IHsgQ2hhbmdlUGFzc3dvcmRDb21wb25lbnQgYXMgQmFzZUNoYW5nZVBhc3N3b3JkQ29tcG9uZW50IH0gZnJvbSAnLi9jaGFuZ2UtcGFzc3dvcmQuY29tcG9uZW50JztcblxuaW1wb3J0IHsgRW5jU3RyaW5nIH0gZnJvbSAnanNsaWItY29tbW9uL21vZGVscy9kb21haW4vZW5jU3RyaW5nJztcbmltcG9ydCB7IE1hc3RlclBhc3N3b3JkUG9saWN5T3B0aW9ucyB9IGZyb20gJ2pzbGliLWNvbW1vbi9tb2RlbHMvZG9tYWluL21hc3RlclBhc3N3b3JkUG9saWN5T3B0aW9ucyc7XG5pbXBvcnQgeyBTeW1tZXRyaWNDcnlwdG9LZXkgfSBmcm9tICdqc2xpYi1jb21tb24vbW9kZWxzL2RvbWFpbi9zeW1tZXRyaWNDcnlwdG9LZXknO1xuXG5pbXBvcnQgeyBVcGRhdGVUZW1wUGFzc3dvcmRSZXF1ZXN0IH0gZnJvbSAnanNsaWItY29tbW9uL21vZGVscy9yZXF1ZXN0L3VwZGF0ZVRlbXBQYXNzd29yZFJlcXVlc3QnO1xuXG5ARGlyZWN0aXZlKClcbmV4cG9ydCBjbGFzcyBVcGRhdGVUZW1wUGFzc3dvcmRDb21wb25lbnQgZXh0ZW5kcyBCYXNlQ2hhbmdlUGFzc3dvcmRDb21wb25lbnQge1xuICAgIGhpbnQ6IHN0cmluZztcbiAgICBrZXk6IHN0cmluZztcbiAgICBlbmZvcmNlZFBvbGljeU9wdGlvbnM6IE1hc3RlclBhc3N3b3JkUG9saWN5T3B0aW9ucztcbiAgICBzaG93UGFzc3dvcmQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIG9uU3VjY2Vzc2Z1bENoYW5nZVBhc3N3b3JkOiAoKSA9PiBQcm9taXNlPGFueT47XG5cbiAgICBjb25zdHJ1Y3RvcihpMThuU2VydmljZTogSTE4blNlcnZpY2UsIHBsYXRmb3JtVXRpbHNTZXJ2aWNlOiBQbGF0Zm9ybVV0aWxzU2VydmljZSxcbiAgICAgICAgcGFzc3dvcmRHZW5lcmF0aW9uU2VydmljZTogUGFzc3dvcmRHZW5lcmF0aW9uU2VydmljZSwgcG9saWN5U2VydmljZTogUG9saWN5U2VydmljZSxcbiAgICAgICAgY3J5cHRvU2VydmljZTogQ3J5cHRvU2VydmljZSwgdXNlclNlcnZpY2U6IFVzZXJTZXJ2aWNlLFxuICAgICAgICBtZXNzYWdpbmdTZXJ2aWNlOiBNZXNzYWdpbmdTZXJ2aWNlLCBwcml2YXRlIGFwaVNlcnZpY2U6IEFwaVNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgc3luY1NlcnZpY2U6IFN5bmNTZXJ2aWNlLCBwcml2YXRlIGxvZ1NlcnZpY2U6IExvZ1NlcnZpY2UpIHtcbiAgICAgICAgc3VwZXIoaTE4blNlcnZpY2UsIGNyeXB0b1NlcnZpY2UsIG1lc3NhZ2luZ1NlcnZpY2UsIHVzZXJTZXJ2aWNlLCBwYXNzd29yZEdlbmVyYXRpb25TZXJ2aWNlLFxuICAgICAgICAgICAgcGxhdGZvcm1VdGlsc1NlcnZpY2UsIHBvbGljeVNlcnZpY2UpO1xuICAgIH1cblxuICAgIGFzeW5jIG5nT25Jbml0KCkge1xuICAgICAgICBhd2FpdCB0aGlzLnN5bmNTZXJ2aWNlLmZ1bGxTeW5jKHRydWUpO1xuICAgICAgICBzdXBlci5uZ09uSW5pdCgpO1xuICAgIH1cblxuICAgIHRvZ2dsZVBhc3N3b3JkKGNvbmZpcm1GaWVsZDogYm9vbGVhbikge1xuICAgICAgICB0aGlzLnNob3dQYXNzd29yZCA9ICF0aGlzLnNob3dQYXNzd29yZDtcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoY29uZmlybUZpZWxkID8gJ21hc3RlclBhc3N3b3JkUmV0eXBlJyA6ICdtYXN0ZXJQYXNzd29yZCcpLmZvY3VzKCk7XG4gICAgfVxuXG4gICAgYXN5bmMgc2V0dXBTdWJtaXRBY3Rpb25zKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICB0aGlzLmVuZm9yY2VkUG9saWN5T3B0aW9ucyA9IGF3YWl0IHRoaXMucG9saWN5U2VydmljZS5nZXRNYXN0ZXJQYXNzd29yZFBvbGljeU9wdGlvbnMoKTtcbiAgICAgICAgdGhpcy5lbWFpbCA9IGF3YWl0IHRoaXMudXNlclNlcnZpY2UuZ2V0RW1haWwoKTtcbiAgICAgICAgdGhpcy5rZGYgPSBhd2FpdCB0aGlzLnVzZXJTZXJ2aWNlLmdldEtkZigpO1xuICAgICAgICB0aGlzLmtkZkl0ZXJhdGlvbnMgPSBhd2FpdCB0aGlzLnVzZXJTZXJ2aWNlLmdldEtkZkl0ZXJhdGlvbnMoKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgYXN5bmMgc3VibWl0KCkge1xuICAgICAgICAvLyBWYWxpZGF0aW9uXG4gICAgICAgIGlmICghYXdhaXQgdGhpcy5zdHJvbmdQYXNzd29yZCgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWF3YWl0IHRoaXMuc2V0dXBTdWJtaXRBY3Rpb25zKCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBDcmVhdGUgbmV3IGtleSBhbmQgaGFzaCBuZXcgcGFzc3dvcmRcbiAgICAgICAgICAgIGNvbnN0IG5ld0tleSA9IGF3YWl0IHRoaXMuY3J5cHRvU2VydmljZS5tYWtlS2V5KHRoaXMubWFzdGVyUGFzc3dvcmQsIHRoaXMuZW1haWwudHJpbSgpLnRvTG93ZXJDYXNlKCksXG4gICAgICAgICAgICAgICAgdGhpcy5rZGYsIHRoaXMua2RmSXRlcmF0aW9ucyk7XG4gICAgICAgICAgICBjb25zdCBuZXdQYXNzd29yZEhhc2ggPSBhd2FpdCB0aGlzLmNyeXB0b1NlcnZpY2UuaGFzaFBhc3N3b3JkKHRoaXMubWFzdGVyUGFzc3dvcmQsIG5ld0tleSk7XG5cbiAgICAgICAgICAgIC8vIEdyYWIgdXNlcidzIGN1cnJlbnQgZW5jIGtleVxuICAgICAgICAgICAgY29uc3QgdXNlckVuY0tleSA9IGF3YWl0IHRoaXMuY3J5cHRvU2VydmljZS5nZXRFbmNLZXkoKTtcblxuICAgICAgICAgICAgLy8gQ3JlYXRlIG5ldyBlbmNLZXkgZm9yIHRoZSBVc2VyXG4gICAgICAgICAgICBjb25zdCBuZXdFbmNLZXkgPSBhd2FpdCB0aGlzLmNyeXB0b1NlcnZpY2UucmVtYWtlRW5jS2V5KG5ld0tleSwgdXNlckVuY0tleSk7XG5cbiAgICAgICAgICAgIGF3YWl0IHRoaXMucGVyZm9ybVN1Ym1pdEFjdGlvbnMobmV3UGFzc3dvcmRIYXNoLCBuZXdLZXksIG5ld0VuY0tleSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRoaXMubG9nU2VydmljZS5lcnJvcihlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIHBlcmZvcm1TdWJtaXRBY3Rpb25zKG1hc3RlclBhc3N3b3JkSGFzaDogc3RyaW5nLCBrZXk6IFN5bW1ldHJpY0NyeXB0b0tleSxcbiAgICAgICAgZW5jS2V5OiBbU3ltbWV0cmljQ3J5cHRvS2V5LCBFbmNTdHJpbmddKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBDcmVhdGUgcmVxdWVzdFxuICAgICAgICAgICAgY29uc3QgcmVxdWVzdCA9IG5ldyBVcGRhdGVUZW1wUGFzc3dvcmRSZXF1ZXN0KCk7XG4gICAgICAgICAgICByZXF1ZXN0LmtleSA9IGVuY0tleVsxXS5lbmNyeXB0ZWRTdHJpbmc7XG4gICAgICAgICAgICByZXF1ZXN0Lm5ld01hc3RlclBhc3N3b3JkSGFzaCA9IG1hc3RlclBhc3N3b3JkSGFzaDtcbiAgICAgICAgICAgIHJlcXVlc3QubWFzdGVyUGFzc3dvcmRIaW50ID0gdGhpcy5oaW50O1xuXG4gICAgICAgICAgICAvLyBVcGRhdGUgdXNlcidzIHBhc3N3b3JkXG4gICAgICAgICAgICB0aGlzLmZvcm1Qcm9taXNlID0gdGhpcy5hcGlTZXJ2aWNlLnB1dFVwZGF0ZVRlbXBQYXNzd29yZChyZXF1ZXN0KTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZm9ybVByb21pc2U7XG4gICAgICAgICAgICB0aGlzLnBsYXRmb3JtVXRpbHNTZXJ2aWNlLnNob3dUb2FzdCgnc3VjY2VzcycsIG51bGwsIHRoaXMuaTE4blNlcnZpY2UudCgndXBkYXRlZE1hc3RlclBhc3N3b3JkJykpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5vblN1Y2Nlc3NmdWxDaGFuZ2VQYXNzd29yZCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vblN1Y2Nlc3NmdWxDaGFuZ2VQYXNzd29yZCgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2luZ1NlcnZpY2Uuc2VuZCgnbG9nb3V0Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRoaXMubG9nU2VydmljZS5lcnJvcihlKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCB7XG4gICAgRGlyZWN0aXZlLFxuICAgIElucHV0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgRXZlbnRUeXBlIH0gZnJvbSAnanNsaWItY29tbW9uL2VudW1zL2V2ZW50VHlwZSc7XG5pbXBvcnQgeyBGaWVsZFR5cGUgfSBmcm9tICdqc2xpYi1jb21tb24vZW51bXMvZmllbGRUeXBlJztcblxuaW1wb3J0IHsgRXZlbnRTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9ldmVudC5zZXJ2aWNlJztcblxuaW1wb3J0IHsgQ2lwaGVyVmlldyB9IGZyb20gJ2pzbGliLWNvbW1vbi9tb2RlbHMvdmlldy9jaXBoZXJWaWV3JztcbmltcG9ydCB7IEZpZWxkVmlldyB9IGZyb20gJ2pzbGliLWNvbW1vbi9tb2RlbHMvdmlldy9maWVsZFZpZXcnO1xuXG5ARGlyZWN0aXZlKClcbmV4cG9ydCBjbGFzcyBWaWV3Q3VzdG9tRmllbGRzQ29tcG9uZW50IHtcbiAgICBASW5wdXQoKSBjaXBoZXI6IENpcGhlclZpZXc7XG4gICAgQElucHV0KCkgcHJvbXB0UGFzc3dvcmQ6ICgpID0+IFByb21pc2U8Ym9vbGVhbj47XG4gICAgQElucHV0KCkgY29weTogKHZhbHVlOiBzdHJpbmcsIHR5cGVJMThuS2V5OiBzdHJpbmcsIGFUeXBlOiBzdHJpbmcpID0+IHZvaWQ7XG5cbiAgICBmaWVsZFR5cGUgPSBGaWVsZFR5cGU7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGV2ZW50U2VydmljZTogRXZlbnRTZXJ2aWNlKSB7IH1cblxuICAgIGFzeW5jIHRvZ2dsZUZpZWxkVmFsdWUoZmllbGQ6IEZpZWxkVmlldykge1xuICAgICAgICBpZiAoIWF3YWl0IHRoaXMucHJvbXB0UGFzc3dvcmQoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZiA9IChmaWVsZCBhcyBhbnkpO1xuICAgICAgICBmLnNob3dWYWx1ZSA9ICFmLnNob3dWYWx1ZTtcbiAgICAgICAgaWYgKGYuc2hvd1ZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLmV2ZW50U2VydmljZS5jb2xsZWN0KEV2ZW50VHlwZS5DaXBoZXJfQ2xpZW50VG9nZ2xlZEhpZGRlbkZpZWxkVmlzaWJsZSwgdGhpcy5jaXBoZXIuaWQpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiaW1wb3J0IHtcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBEaXJlY3RpdmUsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIElucHV0LFxuICAgIE5nWm9uZSxcbiAgICBPbkRlc3Ryb3ksXG4gICAgT25Jbml0LFxuICAgIE91dHB1dCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IENpcGhlclJlcHJvbXB0VHlwZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9lbnVtcy9jaXBoZXJSZXByb21wdFR5cGUnO1xuaW1wb3J0IHsgQ2lwaGVyVHlwZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9lbnVtcy9jaXBoZXJUeXBlJztcbmltcG9ydCB7IEV2ZW50VHlwZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9lbnVtcy9ldmVudFR5cGUnO1xuaW1wb3J0IHsgRmllbGRUeXBlIH0gZnJvbSAnanNsaWItY29tbW9uL2VudW1zL2ZpZWxkVHlwZSc7XG5cbmltcG9ydCB7IEFwaVNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL2FwaS5zZXJ2aWNlJztcbmltcG9ydCB7IEF1ZGl0U2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvYXVkaXQuc2VydmljZSc7XG5pbXBvcnQgeyBCcm9hZGNhc3RlclNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL2Jyb2FkY2FzdGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ2lwaGVyU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvY2lwaGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ3J5cHRvU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvY3J5cHRvLnNlcnZpY2UnO1xuaW1wb3J0IHsgRXZlbnRTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9ldmVudC5zZXJ2aWNlJztcbmltcG9ydCB7IEkxOG5TZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9pMThuLnNlcnZpY2UnO1xuaW1wb3J0IHsgTG9nU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvbG9nLnNlcnZpY2UnO1xuaW1wb3J0IHsgUGFzc3dvcmRSZXByb21wdFNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL3Bhc3N3b3JkUmVwcm9tcHQuc2VydmljZSc7XG5pbXBvcnQgeyBQbGF0Zm9ybVV0aWxzU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvcGxhdGZvcm1VdGlscy5zZXJ2aWNlJztcbmltcG9ydCB7IFRva2VuU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvdG9rZW4uc2VydmljZSc7XG5pbXBvcnQgeyBUb3RwU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvdG90cC5zZXJ2aWNlJztcbmltcG9ydCB7IFVzZXJTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy91c2VyLnNlcnZpY2UnO1xuXG5pbXBvcnQgeyBFcnJvclJlc3BvbnNlIH0gZnJvbSAnanNsaWItY29tbW9uL21vZGVscy9yZXNwb25zZS9lcnJvclJlc3BvbnNlJztcblxuaW1wb3J0IHsgQXR0YWNobWVudFZpZXcgfSBmcm9tICdqc2xpYi1jb21tb24vbW9kZWxzL3ZpZXcvYXR0YWNobWVudFZpZXcnO1xuaW1wb3J0IHsgQ2lwaGVyVmlldyB9IGZyb20gJ2pzbGliLWNvbW1vbi9tb2RlbHMvdmlldy9jaXBoZXJWaWV3JztcbmltcG9ydCB7IExvZ2luVXJpVmlldyB9IGZyb20gJ2pzbGliLWNvbW1vbi9tb2RlbHMvdmlldy9sb2dpblVyaVZpZXcnO1xuXG5jb25zdCBCcm9hZGNhc3RlclN1YnNjcmlwdGlvbklkID0gJ1ZpZXdDb21wb25lbnQnO1xuXG5ARGlyZWN0aXZlKClcbmV4cG9ydCBjbGFzcyBWaWV3Q29tcG9uZW50IGltcGxlbWVudHMgT25EZXN0cm95LCBPbkluaXQge1xuICAgIEBJbnB1dCgpIGNpcGhlcklkOiBzdHJpbmc7XG4gICAgQE91dHB1dCgpIG9uRWRpdENpcGhlciA9IG5ldyBFdmVudEVtaXR0ZXI8Q2lwaGVyVmlldz4oKTtcbiAgICBAT3V0cHV0KCkgb25DbG9uZUNpcGhlciA9IG5ldyBFdmVudEVtaXR0ZXI8Q2lwaGVyVmlldz4oKTtcbiAgICBAT3V0cHV0KCkgb25TaGFyZUNpcGhlciA9IG5ldyBFdmVudEVtaXR0ZXI8Q2lwaGVyVmlldz4oKTtcbiAgICBAT3V0cHV0KCkgb25EZWxldGVkQ2lwaGVyID0gbmV3IEV2ZW50RW1pdHRlcjxDaXBoZXJWaWV3PigpO1xuICAgIEBPdXRwdXQoKSBvblJlc3RvcmVkQ2lwaGVyID0gbmV3IEV2ZW50RW1pdHRlcjxDaXBoZXJWaWV3PigpO1xuXG4gICAgY2lwaGVyOiBDaXBoZXJWaWV3O1xuICAgIHNob3dQYXNzd29yZDogYm9vbGVhbjtcbiAgICBzaG93Q2FyZE51bWJlcjogYm9vbGVhbjtcbiAgICBzaG93Q2FyZENvZGU6IGJvb2xlYW47XG4gICAgY2FuQWNjZXNzUHJlbWl1bTogYm9vbGVhbjtcbiAgICB0b3RwQ29kZTogc3RyaW5nO1xuICAgIHRvdHBDb2RlRm9ybWF0dGVkOiBzdHJpbmc7XG4gICAgdG90cERhc2g6IG51bWJlcjtcbiAgICB0b3RwU2VjOiBudW1iZXI7XG4gICAgdG90cExvdzogYm9vbGVhbjtcbiAgICBmaWVsZFR5cGUgPSBGaWVsZFR5cGU7XG4gICAgY2hlY2tQYXNzd29yZFByb21pc2U6IFByb21pc2U8bnVtYmVyPjtcblxuICAgIHByaXZhdGUgdG90cEludGVydmFsOiBhbnk7XG4gICAgcHJpdmF0ZSBwcmV2aW91c0NpcGhlcklkOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBwYXNzd29yZFJlcHJvbXB0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBjaXBoZXJTZXJ2aWNlOiBDaXBoZXJTZXJ2aWNlLCBwcm90ZWN0ZWQgdG90cFNlcnZpY2U6IFRvdHBTZXJ2aWNlLFxuICAgICAgICBwcm90ZWN0ZWQgdG9rZW5TZXJ2aWNlOiBUb2tlblNlcnZpY2UsIHByb3RlY3RlZCBpMThuU2VydmljZTogSTE4blNlcnZpY2UsXG4gICAgICAgIHByb3RlY3RlZCBjcnlwdG9TZXJ2aWNlOiBDcnlwdG9TZXJ2aWNlLCBwcm90ZWN0ZWQgcGxhdGZvcm1VdGlsc1NlcnZpY2U6IFBsYXRmb3JtVXRpbHNTZXJ2aWNlLFxuICAgICAgICBwcm90ZWN0ZWQgYXVkaXRTZXJ2aWNlOiBBdWRpdFNlcnZpY2UsIHByb3RlY3RlZCB3aW46IFdpbmRvdyxcbiAgICAgICAgcHJvdGVjdGVkIGJyb2FkY2FzdGVyU2VydmljZTogQnJvYWRjYXN0ZXJTZXJ2aWNlLCBwcm90ZWN0ZWQgbmdab25lOiBOZ1pvbmUsXG4gICAgICAgIHByb3RlY3RlZCBjaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsIHByb3RlY3RlZCB1c2VyU2VydmljZTogVXNlclNlcnZpY2UsXG4gICAgICAgIHByb3RlY3RlZCBldmVudFNlcnZpY2U6IEV2ZW50U2VydmljZSwgcHJvdGVjdGVkIGFwaVNlcnZpY2U6IEFwaVNlcnZpY2UsXG4gICAgICAgIHByb3RlY3RlZCBwYXNzd29yZFJlcHJvbXB0U2VydmljZTogUGFzc3dvcmRSZXByb21wdFNlcnZpY2UsIHByaXZhdGUgbG9nU2VydmljZTogTG9nU2VydmljZSkgeyB9XG5cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgdGhpcy5icm9hZGNhc3RlclNlcnZpY2Uuc3Vic2NyaWJlKEJyb2FkY2FzdGVyU3Vic2NyaXB0aW9uSWQsIChtZXNzYWdlOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHRoaXMubmdab25lLnJ1bihhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChtZXNzYWdlLmNvbW1hbmQpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnc3luY0NvbXBsZXRlZCc6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5zdWNjZXNzZnVsbHkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmxvYWQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5icm9hZGNhc3RlclNlcnZpY2UudW5zdWJzY3JpYmUoQnJvYWRjYXN0ZXJTdWJzY3JpcHRpb25JZCk7XG4gICAgICAgIHRoaXMuY2xlYW5VcCgpO1xuICAgIH1cblxuICAgIGFzeW5jIGxvYWQoKSB7XG4gICAgICAgIHRoaXMuY2xlYW5VcCgpO1xuXG4gICAgICAgIGNvbnN0IGNpcGhlciA9IGF3YWl0IHRoaXMuY2lwaGVyU2VydmljZS5nZXQodGhpcy5jaXBoZXJJZCk7XG4gICAgICAgIHRoaXMuY2lwaGVyID0gYXdhaXQgY2lwaGVyLmRlY3J5cHQoKTtcbiAgICAgICAgdGhpcy5jYW5BY2Nlc3NQcmVtaXVtID0gYXdhaXQgdGhpcy51c2VyU2VydmljZS5jYW5BY2Nlc3NQcmVtaXVtKCk7XG5cbiAgICAgICAgaWYgKHRoaXMuY2lwaGVyLnR5cGUgPT09IENpcGhlclR5cGUuTG9naW4gJiYgdGhpcy5jaXBoZXIubG9naW4udG90cCAmJlxuICAgICAgICAgICAgKGNpcGhlci5vcmdhbml6YXRpb25Vc2VUb3RwIHx8IHRoaXMuY2FuQWNjZXNzUHJlbWl1bSkpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMudG90cFVwZGF0ZUNvZGUoKTtcbiAgICAgICAgICAgIGNvbnN0IGludGVydmFsID0gdGhpcy50b3RwU2VydmljZS5nZXRUaW1lSW50ZXJ2YWwodGhpcy5jaXBoZXIubG9naW4udG90cCk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnRvdHBUaWNrKGludGVydmFsKTtcblxuICAgICAgICAgICAgdGhpcy50b3RwSW50ZXJ2YWwgPSBzZXRJbnRlcnZhbChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy50b3RwVGljayhpbnRlcnZhbCk7XG4gICAgICAgICAgICB9LCAxMDAwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnByZXZpb3VzQ2lwaGVySWQgIT09IHRoaXMuY2lwaGVySWQpIHtcbiAgICAgICAgICAgIHRoaXMuZXZlbnRTZXJ2aWNlLmNvbGxlY3QoRXZlbnRUeXBlLkNpcGhlcl9DbGllbnRWaWV3ZWQsIHRoaXMuY2lwaGVySWQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucHJldmlvdXNDaXBoZXJJZCA9IHRoaXMuY2lwaGVySWQ7XG4gICAgfVxuXG4gICAgYXN5bmMgZWRpdCgpIHtcbiAgICAgICAgaWYgKGF3YWl0IHRoaXMucHJvbXB0UGFzc3dvcmQoKSkge1xuICAgICAgICAgICAgdGhpcy5vbkVkaXRDaXBoZXIuZW1pdCh0aGlzLmNpcGhlcik7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBhc3luYyBjbG9uZSgpIHtcbiAgICAgICAgaWYgKGF3YWl0IHRoaXMucHJvbXB0UGFzc3dvcmQoKSkge1xuICAgICAgICAgICAgdGhpcy5vbkNsb25lQ2lwaGVyLmVtaXQodGhpcy5jaXBoZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgYXN5bmMgc2hhcmUoKSB7XG4gICAgICAgIGlmIChhd2FpdCB0aGlzLnByb21wdFBhc3N3b3JkKCkpIHtcbiAgICAgICAgICAgIHRoaXMub25TaGFyZUNpcGhlci5lbWl0KHRoaXMuY2lwaGVyKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGFzeW5jIGRlbGV0ZSgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgaWYgKCFhd2FpdCB0aGlzLnByb21wdFBhc3N3b3JkKCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvbmZpcm1lZCA9IGF3YWl0IHRoaXMucGxhdGZvcm1VdGlsc1NlcnZpY2Uuc2hvd0RpYWxvZyhcbiAgICAgICAgICAgIHRoaXMuaTE4blNlcnZpY2UudCh0aGlzLmNpcGhlci5pc0RlbGV0ZWQgPyAncGVybWFuZW50bHlEZWxldGVJdGVtQ29uZmlybWF0aW9uJyA6ICdkZWxldGVJdGVtQ29uZmlybWF0aW9uJyksXG4gICAgICAgICAgICB0aGlzLmkxOG5TZXJ2aWNlLnQoJ2RlbGV0ZUl0ZW0nKSwgdGhpcy5pMThuU2VydmljZS50KCd5ZXMnKSwgdGhpcy5pMThuU2VydmljZS50KCdubycpLCAnd2FybmluZycpO1xuICAgICAgICBpZiAoIWNvbmZpcm1lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZGVsZXRlQ2lwaGVyKCk7XG4gICAgICAgICAgICB0aGlzLnBsYXRmb3JtVXRpbHNTZXJ2aWNlLnNob3dUb2FzdCgnc3VjY2VzcycsIG51bGwsXG4gICAgICAgICAgICAgICAgdGhpcy5pMThuU2VydmljZS50KHRoaXMuY2lwaGVyLmlzRGVsZXRlZCA/ICdwZXJtYW5lbnRseURlbGV0ZWRJdGVtJyA6ICdkZWxldGVkSXRlbScpKTtcbiAgICAgICAgICAgIHRoaXMub25EZWxldGVkQ2lwaGVyLmVtaXQodGhpcy5jaXBoZXIpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ1NlcnZpY2UuZXJyb3IoZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBhc3luYyByZXN0b3JlKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICBpZiAoIXRoaXMuY2lwaGVyLmlzRGVsZXRlZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29uZmlybWVkID0gYXdhaXQgdGhpcy5wbGF0Zm9ybVV0aWxzU2VydmljZS5zaG93RGlhbG9nKFxuICAgICAgICAgICAgdGhpcy5pMThuU2VydmljZS50KCdyZXN0b3JlSXRlbUNvbmZpcm1hdGlvbicpLCB0aGlzLmkxOG5TZXJ2aWNlLnQoJ3Jlc3RvcmVJdGVtJyksXG4gICAgICAgICAgICB0aGlzLmkxOG5TZXJ2aWNlLnQoJ3llcycpLCB0aGlzLmkxOG5TZXJ2aWNlLnQoJ25vJyksICd3YXJuaW5nJyk7XG4gICAgICAgIGlmICghY29uZmlybWVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5yZXN0b3JlQ2lwaGVyKCk7XG4gICAgICAgICAgICB0aGlzLnBsYXRmb3JtVXRpbHNTZXJ2aWNlLnNob3dUb2FzdCgnc3VjY2VzcycsIG51bGwsIHRoaXMuaTE4blNlcnZpY2UudCgncmVzdG9yZWRJdGVtJykpO1xuICAgICAgICAgICAgdGhpcy5vblJlc3RvcmVkQ2lwaGVyLmVtaXQodGhpcy5jaXBoZXIpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ1NlcnZpY2UuZXJyb3IoZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBhc3luYyB0b2dnbGVQYXNzd29yZCgpIHtcbiAgICAgICAgaWYgKCFhd2FpdCB0aGlzLnByb21wdFBhc3N3b3JkKCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2hvd1Bhc3N3b3JkID0gIXRoaXMuc2hvd1Bhc3N3b3JkO1xuICAgICAgICBpZiAodGhpcy5zaG93UGFzc3dvcmQpIHtcbiAgICAgICAgICAgIHRoaXMuZXZlbnRTZXJ2aWNlLmNvbGxlY3QoRXZlbnRUeXBlLkNpcGhlcl9DbGllbnRUb2dnbGVkUGFzc3dvcmRWaXNpYmxlLCB0aGlzLmNpcGhlcklkKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIHRvZ2dsZUNhcmROdW1iZXIoKSB7XG4gICAgICAgIGlmICghYXdhaXQgdGhpcy5wcm9tcHRQYXNzd29yZCgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNob3dDYXJkTnVtYmVyID0gIXRoaXMuc2hvd0NhcmROdW1iZXI7XG4gICAgICAgIGlmICh0aGlzLnNob3dDYXJkTnVtYmVyKSB7XG4gICAgICAgICAgICB0aGlzLmV2ZW50U2VydmljZS5jb2xsZWN0KEV2ZW50VHlwZS5DaXBoZXJfQ2xpZW50VG9nZ2xlZENhcmRDb2RlVmlzaWJsZSwgdGhpcy5jaXBoZXJJZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyB0b2dnbGVDYXJkQ29kZSgpIHtcbiAgICAgICAgaWYgKCFhd2FpdCB0aGlzLnByb21wdFBhc3N3b3JkKCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2hvd0NhcmRDb2RlID0gIXRoaXMuc2hvd0NhcmRDb2RlO1xuICAgICAgICBpZiAodGhpcy5zaG93Q2FyZENvZGUpIHtcbiAgICAgICAgICAgIHRoaXMuZXZlbnRTZXJ2aWNlLmNvbGxlY3QoRXZlbnRUeXBlLkNpcGhlcl9DbGllbnRUb2dnbGVkQ2FyZENvZGVWaXNpYmxlLCB0aGlzLmNpcGhlcklkKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIGNoZWNrUGFzc3dvcmQoKSB7XG4gICAgICAgIGlmICh0aGlzLmNpcGhlci5sb2dpbiA9PSBudWxsIHx8IHRoaXMuY2lwaGVyLmxvZ2luLnBhc3N3b3JkID09IG51bGwgfHwgdGhpcy5jaXBoZXIubG9naW4ucGFzc3dvcmQgPT09ICcnKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNoZWNrUGFzc3dvcmRQcm9taXNlID0gdGhpcy5hdWRpdFNlcnZpY2UucGFzc3dvcmRMZWFrZWQodGhpcy5jaXBoZXIubG9naW4ucGFzc3dvcmQpO1xuICAgICAgICBjb25zdCBtYXRjaGVzID0gYXdhaXQgdGhpcy5jaGVja1Bhc3N3b3JkUHJvbWlzZTtcblxuICAgICAgICBpZiAobWF0Y2hlcyA+IDApIHtcbiAgICAgICAgICAgIHRoaXMucGxhdGZvcm1VdGlsc1NlcnZpY2Uuc2hvd1RvYXN0KCd3YXJuaW5nJywgbnVsbCxcbiAgICAgICAgICAgICAgICB0aGlzLmkxOG5TZXJ2aWNlLnQoJ3Bhc3N3b3JkRXhwb3NlZCcsIG1hdGNoZXMudG9TdHJpbmcoKSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5wbGF0Zm9ybVV0aWxzU2VydmljZS5zaG93VG9hc3QoJ3N1Y2Nlc3MnLCBudWxsLCB0aGlzLmkxOG5TZXJ2aWNlLnQoJ3Bhc3N3b3JkU2FmZScpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGxhdW5jaCh1cmk6IExvZ2luVXJpVmlldywgY2lwaGVySWQ/OiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKCF1cmkuY2FuTGF1bmNoKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2lwaGVySWQpIHtcbiAgICAgICAgICAgIHRoaXMuY2lwaGVyU2VydmljZS51cGRhdGVMYXN0TGF1bmNoZWREYXRlKGNpcGhlcklkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucGxhdGZvcm1VdGlsc1NlcnZpY2UubGF1bmNoVXJpKHVyaS5sYXVuY2hVcmkpO1xuICAgIH1cblxuICAgIGFzeW5jIGNvcHkodmFsdWU6IHN0cmluZywgdHlwZUkxOG5LZXk6IHN0cmluZywgYVR5cGU6IHN0cmluZykge1xuICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMucGFzc3dvcmRSZXByb21wdFNlcnZpY2UucHJvdGVjdGVkRmllbGRzKCkuaW5jbHVkZXMoYVR5cGUpICYmICFhd2FpdCB0aGlzLnByb21wdFBhc3N3b3JkKCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvcHlPcHRpb25zID0gdGhpcy53aW4gIT0gbnVsbCA/IHsgd2luZG93OiB0aGlzLndpbiB9IDogbnVsbDtcbiAgICAgICAgdGhpcy5wbGF0Zm9ybVV0aWxzU2VydmljZS5jb3B5VG9DbGlwYm9hcmQodmFsdWUsIGNvcHlPcHRpb25zKTtcbiAgICAgICAgdGhpcy5wbGF0Zm9ybVV0aWxzU2VydmljZS5zaG93VG9hc3QoJ2luZm8nLCBudWxsLFxuICAgICAgICAgICAgdGhpcy5pMThuU2VydmljZS50KCd2YWx1ZUNvcGllZCcsIHRoaXMuaTE4blNlcnZpY2UudCh0eXBlSTE4bktleSkpKTtcblxuICAgICAgICBpZiAodHlwZUkxOG5LZXkgPT09ICdwYXNzd29yZCcpIHtcbiAgICAgICAgICAgIHRoaXMuZXZlbnRTZXJ2aWNlLmNvbGxlY3QoRXZlbnRUeXBlLkNpcGhlcl9DbGllbnRUb2dnbGVkSGlkZGVuRmllbGRWaXNpYmxlLCB0aGlzLmNpcGhlcklkKTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlSTE4bktleSA9PT0gJ3NlY3VyaXR5Q29kZScpIHtcbiAgICAgICAgICAgIHRoaXMuZXZlbnRTZXJ2aWNlLmNvbGxlY3QoRXZlbnRUeXBlLkNpcGhlcl9DbGllbnRDb3BpZWRDYXJkQ29kZSwgdGhpcy5jaXBoZXJJZCk7XG4gICAgICAgIH0gZWxzZSBpZiAoYVR5cGUgPT09ICdIX0ZpZWxkJykge1xuICAgICAgICAgICAgdGhpcy5ldmVudFNlcnZpY2UuY29sbGVjdChFdmVudFR5cGUuQ2lwaGVyX0NsaWVudENvcGllZEhpZGRlbkZpZWxkLCB0aGlzLmNpcGhlcklkKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNldFRleHREYXRhT25EcmFnKGV2ZW50OiBEcmFnRXZlbnQsIGRhdGE6IHN0cmluZykge1xuICAgICAgICBldmVudC5kYXRhVHJhbnNmZXIuc2V0RGF0YSgndGV4dCcsIGRhdGEpO1xuICAgIH1cblxuICAgIGFzeW5jIGRvd25sb2FkQXR0YWNobWVudChhdHRhY2htZW50OiBBdHRhY2htZW50Vmlldykge1xuICAgICAgICBpZiAoIWF3YWl0IHRoaXMucHJvbXB0UGFzc3dvcmQoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGEgPSAoYXR0YWNobWVudCBhcyBhbnkpO1xuICAgICAgICBpZiAoYS5kb3dubG9hZGluZykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuY2lwaGVyLm9yZ2FuaXphdGlvbklkID09IG51bGwgJiYgIXRoaXMuY2FuQWNjZXNzUHJlbWl1bSkge1xuICAgICAgICAgICAgdGhpcy5wbGF0Zm9ybVV0aWxzU2VydmljZS5zaG93VG9hc3QoJ2Vycm9yJywgdGhpcy5pMThuU2VydmljZS50KCdwcmVtaXVtUmVxdWlyZWQnKSxcbiAgICAgICAgICAgICAgICB0aGlzLmkxOG5TZXJ2aWNlLnQoJ3ByZW1pdW1SZXF1aXJlZERlc2MnKSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgdXJsOiBzdHJpbmc7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBhdHRhY2htZW50RG93bmxvYWRSZXNwb25zZSA9IGF3YWl0IHRoaXMuYXBpU2VydmljZS5nZXRBdHRhY2htZW50RGF0YSh0aGlzLmNpcGhlci5pZCwgYXR0YWNobWVudC5pZCk7XG4gICAgICAgICAgICB1cmwgPSBhdHRhY2htZW50RG93bmxvYWRSZXNwb25zZS51cmw7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgRXJyb3JSZXNwb25zZSAmJiAoZSBhcyBFcnJvclJlc3BvbnNlKS5zdGF0dXNDb2RlID09PSA0MDQpIHtcbiAgICAgICAgICAgICAgICB1cmwgPSBhdHRhY2htZW50LnVybDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIEVycm9yUmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoKGUgYXMgRXJyb3JSZXNwb25zZSkuZ2V0U2luZ2xlTWVzc2FnZSgpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGEuZG93bmxvYWRpbmcgPSB0cnVlO1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKG5ldyBSZXF1ZXN0KHVybCwgeyBjYWNoZTogJ25vLXN0b3JlJyB9KSk7XG4gICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgIT09IDIwMCkge1xuICAgICAgICAgICAgdGhpcy5wbGF0Zm9ybVV0aWxzU2VydmljZS5zaG93VG9hc3QoJ2Vycm9yJywgbnVsbCwgdGhpcy5pMThuU2VydmljZS50KCdlcnJvck9jY3VycmVkJykpO1xuICAgICAgICAgICAgYS5kb3dubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGJ1ZiA9IGF3YWl0IHJlc3BvbnNlLmFycmF5QnVmZmVyKCk7XG4gICAgICAgICAgICBjb25zdCBrZXkgPSBhdHRhY2htZW50LmtleSAhPSBudWxsID8gYXR0YWNobWVudC5rZXkgOlxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuY3J5cHRvU2VydmljZS5nZXRPcmdLZXkodGhpcy5jaXBoZXIub3JnYW5pemF0aW9uSWQpO1xuICAgICAgICAgICAgY29uc3QgZGVjQnVmID0gYXdhaXQgdGhpcy5jcnlwdG9TZXJ2aWNlLmRlY3J5cHRGcm9tQnl0ZXMoYnVmLCBrZXkpO1xuICAgICAgICAgICAgdGhpcy5wbGF0Zm9ybVV0aWxzU2VydmljZS5zYXZlRmlsZSh0aGlzLndpbiwgZGVjQnVmLCBudWxsLCBhdHRhY2htZW50LmZpbGVOYW1lKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5wbGF0Zm9ybVV0aWxzU2VydmljZS5zaG93VG9hc3QoJ2Vycm9yJywgbnVsbCwgdGhpcy5pMThuU2VydmljZS50KCdlcnJvck9jY3VycmVkJykpO1xuICAgICAgICB9XG5cbiAgICAgICAgYS5kb3dubG9hZGluZyA9IGZhbHNlO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBkZWxldGVDaXBoZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNpcGhlci5pc0RlbGV0ZWQgPyB0aGlzLmNpcGhlclNlcnZpY2UuZGVsZXRlV2l0aFNlcnZlcih0aGlzLmNpcGhlci5pZClcbiAgICAgICAgICAgIDogdGhpcy5jaXBoZXJTZXJ2aWNlLnNvZnREZWxldGVXaXRoU2VydmVyKHRoaXMuY2lwaGVyLmlkKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcmVzdG9yZUNpcGhlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2lwaGVyU2VydmljZS5yZXN0b3JlV2l0aFNlcnZlcih0aGlzLmNpcGhlci5pZCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGFzeW5jIHByb21wdFBhc3N3b3JkKCkge1xuICAgICAgICBpZiAodGhpcy5jaXBoZXIucmVwcm9tcHQgPT09IENpcGhlclJlcHJvbXB0VHlwZS5Ob25lIHx8IHRoaXMucGFzc3dvcmRSZXByb21wdGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLnBhc3N3b3JkUmVwcm9tcHRlZCA9IGF3YWl0IHRoaXMucGFzc3dvcmRSZXByb21wdFNlcnZpY2Uuc2hvd1Bhc3N3b3JkUHJvbXB0KCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjbGVhblVwKCkge1xuICAgICAgICB0aGlzLnRvdHBDb2RlID0gbnVsbDtcbiAgICAgICAgdGhpcy5jaXBoZXIgPSBudWxsO1xuICAgICAgICB0aGlzLnNob3dQYXNzd29yZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNob3dDYXJkTnVtYmVyID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc2hvd0NhcmRDb2RlID0gZmFsc2U7XG4gICAgICAgIHRoaXMucGFzc3dvcmRSZXByb21wdGVkID0gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLnRvdHBJbnRlcnZhbCkge1xuICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLnRvdHBJbnRlcnZhbCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHRvdHBVcGRhdGVDb2RlKCkge1xuICAgICAgICBpZiAodGhpcy5jaXBoZXIgPT0gbnVsbCB8fCB0aGlzLmNpcGhlci50eXBlICE9PSBDaXBoZXJUeXBlLkxvZ2luIHx8IHRoaXMuY2lwaGVyLmxvZ2luLnRvdHAgPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKHRoaXMudG90cEludGVydmFsKSB7XG4gICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLnRvdHBJbnRlcnZhbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnRvdHBDb2RlID0gYXdhaXQgdGhpcy50b3RwU2VydmljZS5nZXRDb2RlKHRoaXMuY2lwaGVyLmxvZ2luLnRvdHApO1xuICAgICAgICBpZiAodGhpcy50b3RwQ29kZSAhPSBudWxsKSB7XG4gICAgICAgICAgICBpZiAodGhpcy50b3RwQ29kZS5sZW5ndGggPiA0KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaGFsZiA9IE1hdGguZmxvb3IodGhpcy50b3RwQ29kZS5sZW5ndGggLyAyKTtcbiAgICAgICAgICAgICAgICB0aGlzLnRvdHBDb2RlRm9ybWF0dGVkID0gdGhpcy50b3RwQ29kZS5zdWJzdHJpbmcoMCwgaGFsZikgKyAnICcgKyB0aGlzLnRvdHBDb2RlLnN1YnN0cmluZyhoYWxmKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy50b3RwQ29kZUZvcm1hdHRlZCA9IHRoaXMudG90cENvZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnRvdHBDb2RlRm9ybWF0dGVkID0gbnVsbDtcbiAgICAgICAgICAgIGlmICh0aGlzLnRvdHBJbnRlcnZhbCkge1xuICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy50b3RwSW50ZXJ2YWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyB0b3RwVGljayhpbnRlcnZhbFNlY29uZHM6IG51bWJlcikge1xuICAgICAgICBjb25zdCBlcG9jaCA9IE1hdGgucm91bmQobmV3IERhdGUoKS5nZXRUaW1lKCkgLyAxMDAwLjApO1xuICAgICAgICBjb25zdCBtb2QgPSBlcG9jaCAlIGludGVydmFsU2Vjb25kcztcblxuICAgICAgICB0aGlzLnRvdHBTZWMgPSBpbnRlcnZhbFNlY29uZHMgLSBtb2Q7XG4gICAgICAgIHRoaXMudG90cERhc2ggPSArKE1hdGgucm91bmQoKCgoNzguNiAvIGludGVydmFsU2Vjb25kcykgKiBtb2QpICsgJ2UrMicpIGFzIGFueSkgKyAnZS0yJyk7XG4gICAgICAgIHRoaXMudG90cExvdyA9IHRoaXMudG90cFNlYyA8PSA3O1xuICAgICAgICBpZiAobW9kID09PSAwKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnRvdHBVcGRhdGVDb2RlKCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQge1xuICAgIERpcmVjdGl2ZSxcbiAgICBFbGVtZW50UmVmLFxuICAgIElucHV0LFxuICAgIFJlbmRlcmVyMixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBEaXJlY3RpdmUoe1xuICAgIHNlbGVjdG9yOiAnW2FwcEExMXlUaXRsZV0nLFxufSlcbmV4cG9ydCBjbGFzcyBBMTF5VGl0bGVEaXJlY3RpdmUge1xuICAgIEBJbnB1dCgpIHNldCBhcHBBMTF5VGl0bGUodGl0bGU6IHN0cmluZykge1xuICAgICAgICB0aGlzLnRpdGxlID0gdGl0bGU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB0aXRsZTogc3RyaW5nO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBlbDogRWxlbWVudFJlZiwgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyKSB7IH1cblxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICBpZiAoIXRoaXMuZWwubmF0aXZlRWxlbWVudC5oYXNBdHRyaWJ1dGUoJ3RpdGxlJykpIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKHRoaXMuZWwubmF0aXZlRWxlbWVudCwgJ3RpdGxlJywgdGhpcy50aXRsZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLmVsLm5hdGl2ZUVsZW1lbnQuaGFzQXR0cmlidXRlKCdhcmlhLWxhYmVsJykpIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKHRoaXMuZWwubmF0aXZlRWxlbWVudCwgJ2FyaWEtbGFiZWwnLCB0aGlzLnRpdGxlKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCB7XG4gICAgRGlyZWN0aXZlLFxuICAgIEVsZW1lbnRSZWYsXG4gICAgSW5wdXQsXG4gICAgT25DaGFuZ2VzLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IExvZ1NlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL2xvZy5zZXJ2aWNlJztcblxuaW1wb3J0IHsgRXJyb3JSZXNwb25zZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9tb2RlbHMvcmVzcG9uc2UvZXJyb3JSZXNwb25zZSc7XG5cbmltcG9ydCB7IFZhbGlkYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvdmFsaWRhdGlvbi5zZXJ2aWNlJztcblxuQERpcmVjdGl2ZSh7XG4gICAgc2VsZWN0b3I6ICdbYXBwQXBpQWN0aW9uXScsXG59KVxuZXhwb3J0IGNsYXNzIEFwaUFjdGlvbkRpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XG4gICAgQElucHV0KCkgYXBwQXBpQWN0aW9uOiBQcm9taXNlPGFueT47XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGVsOiBFbGVtZW50UmVmLCBwcml2YXRlIHZhbGlkYXRpb25TZXJ2aWNlOiBWYWxpZGF0aW9uU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBsb2dTZXJ2aWNlOiBMb2dTZXJ2aWNlKSB7IH1cblxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IGFueSkge1xuICAgICAgICBpZiAodGhpcy5hcHBBcGlBY3Rpb24gPT0gbnVsbCB8fCB0aGlzLmFwcEFwaUFjdGlvbi50aGVuID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZWwubmF0aXZlRWxlbWVudC5sb2FkaW5nID0gdHJ1ZTtcblxuICAgICAgICB0aGlzLmFwcEFwaUFjdGlvbi50aGVuKChyZXNwb25zZTogYW55KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICB9LCAoZTogYW55KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQubG9hZGluZyA9IGZhbHNlO1xuXG4gICAgICAgICAgICBpZiAoKGUgaW5zdGFuY2VvZiBFcnJvclJlc3BvbnNlIHx8IGUuY29uc3RydWN0b3IubmFtZSA9PT0gJ0Vycm9yUmVzcG9uc2UnKSAmJiAoZSBhcyBFcnJvclJlc3BvbnNlKS5jYXB0Y2hhUmVxdWlyZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ1NlcnZpY2UuZXJyb3IoJ0NhcHRjaGEgcmVxdWlyZWQgZXJyb3IgcmVzcG9uc2U6ICcgKyBlLmdldFNpbmdsZU1lc3NhZ2UoKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5sb2dTZXJ2aWNlPy5lcnJvcihgUmVjZWl2ZWQgQVBJIGV4Y2VwdGlvbjogJHtlfWApO1xuICAgICAgICAgICAgdGhpcy52YWxpZGF0aW9uU2VydmljZS5zaG93RXJyb3IoZSk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiIsImltcG9ydCB7XG4gICAgRGlyZWN0aXZlLFxuICAgIEVsZW1lbnRSZWYsXG4gICAgSW5wdXQsXG4gICAgTmdab25lLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgdGFrZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgVXRpbHMgfSBmcm9tICdqc2xpYi1jb21tb24vbWlzYy91dGlscyc7XG5cbkBEaXJlY3RpdmUoe1xuICAgIHNlbGVjdG9yOiAnW2FwcEF1dG9mb2N1c10nLFxufSlcbmV4cG9ydCBjbGFzcyBBdXRvZm9jdXNEaXJlY3RpdmUge1xuICAgIEBJbnB1dCgpIHNldCBhcHBBdXRvZm9jdXMoY29uZGl0aW9uOiBib29sZWFuIHwgc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuYXV0b2ZvY3VzID0gY29uZGl0aW9uID09PSAnJyB8fCBjb25kaXRpb24gPT09IHRydWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhdXRvZm9jdXM6IGJvb2xlYW47XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGVsOiBFbGVtZW50UmVmLCBwcml2YXRlIG5nWm9uZTogTmdab25lKSB7IH1cblxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICBpZiAoIVV0aWxzLmlzTW9iaWxlQnJvd3NlciAmJiB0aGlzLmF1dG9mb2N1cykge1xuICAgICAgICAgICAgaWYgKHRoaXMubmdab25lLmlzU3RhYmxlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMubmdab25lLm9uU3RhYmxlLnBpcGUodGFrZSgxKSkuc3Vic2NyaWJlKCgpID0+IHRoaXMuZWwubmF0aXZlRWxlbWVudC5mb2N1cygpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCB7XG4gICAgRGlyZWN0aXZlLFxuICAgIEVsZW1lbnRSZWYsXG4gICAgSG9zdExpc3RlbmVyLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQERpcmVjdGl2ZSh7XG4gICAgc2VsZWN0b3I6ICdbYXBwQmx1ckNsaWNrXScsXG59KVxuZXhwb3J0IGNsYXNzIEJsdXJDbGlja0RpcmVjdGl2ZSB7XG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBlbDogRWxlbWVudFJlZikge1xuICAgIH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ2NsaWNrJykgb25DbGljaygpIHtcbiAgICAgICAgdGhpcy5lbC5uYXRpdmVFbGVtZW50LmJsdXIoKTtcbiAgICB9XG59XG4iLCJpbXBvcnQge1xuICAgIERpcmVjdGl2ZSxcbiAgICBFbGVtZW50UmVmLFxuICAgIEhvc3RMaXN0ZW5lcixcbiAgICBPbkluaXQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogJ1thcHBCb3hSb3ddJyxcbn0pXG5leHBvcnQgY2xhc3MgQm94Um93RGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0IHtcbiAgICBlbDogSFRNTEVsZW1lbnQgPSBudWxsO1xuICAgIGZvcm1FbHM6IEVsZW1lbnRbXTtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgZWxSZWY6IEVsZW1lbnRSZWYpIHtcbiAgICAgICAgdGhpcy5lbCA9IGVsUmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZm9ybUVscyA9IEFycmF5LmZyb20odGhpcy5lbC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dDpub3QoW3R5cGU9XCJoaWRkZW5cIl0pLCBzZWxlY3QsIHRleHRhcmVhJykpO1xuICAgICAgICB0aGlzLmZvcm1FbHMuZm9yRWFjaChmb3JtRWwgPT4ge1xuICAgICAgICAgICAgZm9ybUVsLmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzJywgKGV2ZW50OiBFdmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZWwuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XG4gICAgICAgICAgICB9LCBmYWxzZSk7XG5cbiAgICAgICAgICAgIGZvcm1FbC5hZGRFdmVudExpc3RlbmVyKCdibHVyJywgKGV2ZW50OiBFdmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZWwuY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJyk7XG4gICAgICAgICAgICB9LCBmYWxzZSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ2NsaWNrJywgWyckZXZlbnQnXSkgb25DbGljayhldmVudDogRXZlbnQpIHtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBpZiAodGFyZ2V0ICE9PSB0aGlzLmVsICYmICF0YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCdwcm9ncmVzcycpICYmXG4gICAgICAgICAgICAhdGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygncHJvZ3Jlc3MtYmFyJykpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmZvcm1FbHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgZm9ybUVsID0gKHRoaXMuZm9ybUVsc1swXSBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgICAgICBpZiAoZm9ybUVsLnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2lucHV0Jykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlucHV0RWwgPSAoZm9ybUVsIGFzIEhUTUxJbnB1dEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIGlmIChpbnB1dEVsLnR5cGUgIT0gbnVsbCAmJiBpbnB1dEVsLnR5cGUudG9Mb3dlckNhc2UoKSA9PT0gJ2NoZWNrYm94Jykge1xuICAgICAgICAgICAgICAgICAgICBpbnB1dEVsLmNsaWNrKCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3JtRWwuZm9jdXMoKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCB7XG4gICAgQ2RrRml4ZWRTaXplVmlydHVhbFNjcm9sbCxcbiAgICBGaXhlZFNpemVWaXJ0dWFsU2Nyb2xsU3RyYXRlZ3ksXG4gICAgVklSVFVBTF9TQ1JPTExfU1RSQVRFR1ksXG59IGZyb20gJ0Bhbmd1bGFyL2Nkay9zY3JvbGxpbmcnO1xuaW1wb3J0IHtcbiAgICBEaXJlY3RpdmUsXG4gICAgZm9yd2FyZFJlZixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbi8vIEN1c3RvbSB2aXJ0dWFsIHNjcm9sbCBzdHJhdGVneSBmb3IgY2RrLXZpcnR1YWwtc2Nyb2xsXG4vLyBVc2VzIGEgc2FtcGxlIGxpc3QgaXRlbSB0byBzZXQgdGhlIGl0ZW1TaXplIGZvciBGaXhlZFNpemVWaXJ0dWFsU2Nyb2xsU3RyYXRlZ3lcbi8vIFRoZSB1c2UgY2FzZSBpcyB0aGUgc2FtZSBhcyBGaXhlZFNpemVWaXJ0dWFsU2Nyb2xsU3RyYXRlZ3ksIGJ1dCBpdCBhdm9pZHMgbG9ja2luZyBpbiBwaXhlbCBzaXplcyBpbiB0aGUgdGVtcGxhdGUuXG5leHBvcnQgY2xhc3MgQ2lwaGVyTGlzdFZpcnR1YWxTY3JvbGxTdHJhdGVneSBleHRlbmRzIEZpeGVkU2l6ZVZpcnR1YWxTY3JvbGxTdHJhdGVneSB7XG4gICAgcHJpdmF0ZSBjaGVja0l0ZW1TaXplQ2FsbGJhY2s6IGFueTtcbiAgICBwcml2YXRlIHRpbWVvdXQ6IGFueTtcblxuICAgIGNvbnN0cnVjdG9yKGl0ZW1TaXplOiBudW1iZXIsIG1pbkJ1ZmZlclB4OiBudW1iZXIsIG1heEJ1ZmZlclB4OiBudW1iZXIsIGNoZWNrSXRlbVNpemVDYWxsYmFjazogYW55KSB7XG4gICAgICAgIHN1cGVyKGl0ZW1TaXplLCBtaW5CdWZmZXJQeCwgbWF4QnVmZmVyUHgpO1xuICAgICAgICB0aGlzLmNoZWNrSXRlbVNpemVDYWxsYmFjayA9IGNoZWNrSXRlbVNpemVDYWxsYmFjaztcbiAgICB9XG5cbiAgICBvbkNvbnRlbnRSZW5kZXJlZCgpIHtcbiAgICAgICAgaWYgKHRoaXMudGltZW91dCAhPSBudWxsKSB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudGltZW91dCA9IHNldFRpbWVvdXQodGhpcy5jaGVja0l0ZW1TaXplQ2FsbGJhY2ssIDUwMCk7XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gX2NpcGhlckxpc3RWaXJ0dWFsU2Nyb2xsU3RyYXRlZ3lGYWN0b3J5KGNpcGhlckxpc3REaXI6IENpcGhlckxpc3RWaXJ0dWFsU2Nyb2xsKSB7XG4gICAgcmV0dXJuIGNpcGhlckxpc3REaXIuX3Njcm9sbFN0cmF0ZWd5O1xufVxuXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogJ2Nkay12aXJ0dWFsLXNjcm9sbC12aWV3cG9ydFtpdGVtU2l6ZV0nLFxuICAgIHByb3ZpZGVyczogW3tcbiAgICAgICAgcHJvdmlkZTogVklSVFVBTF9TQ1JPTExfU1RSQVRFR1ksXG4gICAgICAgIHVzZUZhY3Rvcnk6IF9jaXBoZXJMaXN0VmlydHVhbFNjcm9sbFN0cmF0ZWd5RmFjdG9yeSxcbiAgICAgICAgZGVwczogW2ZvcndhcmRSZWYoKCkgPT4gQ2lwaGVyTGlzdFZpcnR1YWxTY3JvbGwpXSxcbiAgICB9XSxcbn0pXG5leHBvcnQgY2xhc3MgQ2lwaGVyTGlzdFZpcnR1YWxTY3JvbGwgZXh0ZW5kcyBDZGtGaXhlZFNpemVWaXJ0dWFsU2Nyb2xsIHtcbiAgICBfc2Nyb2xsU3RyYXRlZ3k6IENpcGhlckxpc3RWaXJ0dWFsU2Nyb2xsU3RyYXRlZ3k7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5fc2Nyb2xsU3RyYXRlZ3kgPSBuZXcgQ2lwaGVyTGlzdFZpcnR1YWxTY3JvbGxTdHJhdGVneSh0aGlzLml0ZW1TaXplLCB0aGlzLm1pbkJ1ZmZlclB4LCB0aGlzLm1heEJ1ZmZlclB4LFxuICAgICAgICAgICAgdGhpcy5jaGVja0FuZFVwZGF0ZUl0ZW1TaXplKTtcbiAgICB9XG5cbiAgICBjaGVja0FuZFVwZGF0ZUl0ZW1TaXplID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBzYW1wbGVJdGVtID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignY2RrLXZpcnR1YWwtc2Nyb2xsLXZpZXdwb3J0IC52aXJ0dWFsLXNjcm9sbC1pdGVtJykgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IG5ld0l0ZW1TaXplID0gc2FtcGxlSXRlbT8ub2Zmc2V0SGVpZ2h0O1xuXG4gICAgICAgIGlmIChuZXdJdGVtU2l6ZSAhPSBudWxsICYmIG5ld0l0ZW1TaXplICE9PSB0aGlzLml0ZW1TaXplKSB7XG4gICAgICAgICAgICB0aGlzLml0ZW1TaXplID0gbmV3SXRlbVNpemU7XG4gICAgICAgICAgICB0aGlzLl9zY3JvbGxTdHJhdGVneS51cGRhdGVJdGVtQW5kQnVmZmVyU2l6ZSh0aGlzLml0ZW1TaXplLCB0aGlzLm1pbkJ1ZmZlclB4LCB0aGlzLm1heEJ1ZmZlclB4KTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCB7XG4gICAgRGlyZWN0aXZlLFxuICAgIEVsZW1lbnRSZWYsXG4gICAgSG9zdExpc3RlbmVyLFxuICAgIElucHV0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQERpcmVjdGl2ZSh7XG4gICAgc2VsZWN0b3I6ICdbYXBwRmFsbGJhY2tTcmNdJyxcbn0pXG5leHBvcnQgY2xhc3MgRmFsbGJhY2tTcmNEaXJlY3RpdmUge1xuICAgIEBJbnB1dCgnYXBwRmFsbGJhY2tTcmMnKSBhcHBGYWxsYmFja1NyYzogc3RyaW5nO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBlbDogRWxlbWVudFJlZikge1xuICAgIH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ2Vycm9yJykgb25FcnJvcigpIHtcbiAgICAgICAgdGhpcy5lbC5uYXRpdmVFbGVtZW50LnNyYyA9IHRoaXMuYXBwRmFsbGJhY2tTcmM7XG4gICAgfVxufVxuIiwiaW1wb3J0IHtcbiAgICBEaXJlY3RpdmUsXG4gICAgRWxlbWVudFJlZixcbiAgICBJbnB1dCxcbiAgICBSZW5kZXJlcjIsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogJ1thcHBJbnB1dFZlcmJhdGltXScsXG59KVxuZXhwb3J0IGNsYXNzIElucHV0VmVyYmF0aW1EaXJlY3RpdmUge1xuICAgIEBJbnB1dCgpIHNldCBhcHBJbnB1dFZlcmJhdGltKGNvbmRpdGlvbjogYm9vbGVhbiB8IHN0cmluZykge1xuICAgICAgICB0aGlzLmRpc2FibGVDb21wbGV0ZSA9IGNvbmRpdGlvbiA9PT0gJycgfHwgY29uZGl0aW9uID09PSB0cnVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgZGlzYWJsZUNvbXBsZXRlOiBib29sZWFuO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBlbDogRWxlbWVudFJlZiwgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyKSB7IH1cblxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICBpZiAodGhpcy5kaXNhYmxlQ29tcGxldGUgJiYgIXRoaXMuZWwubmF0aXZlRWxlbWVudC5oYXNBdHRyaWJ1dGUoJ2F1dG9jb21wbGV0ZScpKSB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZSh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsICdhdXRvY29tcGxldGUnLCAnb2ZmJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLmVsLm5hdGl2ZUVsZW1lbnQuaGFzQXR0cmlidXRlKCdhdXRvY2FwaXRhbGl6ZScpKSB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZSh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsICdhdXRvY2FwaXRhbGl6ZScsICdub25lJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLmVsLm5hdGl2ZUVsZW1lbnQuaGFzQXR0cmlidXRlKCdhdXRvY29ycmVjdCcpKSB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZSh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsICdhdXRvY29ycmVjdCcsICdub25lJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLmVsLm5hdGl2ZUVsZW1lbnQuaGFzQXR0cmlidXRlKCdzcGVsbGNoZWNrJykpIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKHRoaXMuZWwubmF0aXZlRWxlbWVudCwgJ3NwZWxsY2hlY2snLCAnZmFsc2UnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuZWwubmF0aXZlRWxlbWVudC5oYXNBdHRyaWJ1dGUoJ2lucHV0bW9kZScpKSB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZSh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsICdpbnB1dG1vZGUnLCAndmVyYmF0aW0nKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCB7XG4gICAgRGlyZWN0aXZlLFxuICAgIEVsZW1lbnRSZWYsXG4gICAgSG9zdExpc3RlbmVyLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgUGxhdGZvcm1VdGlsc1NlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL3BsYXRmb3JtVXRpbHMuc2VydmljZSc7XG5cbkBEaXJlY3RpdmUoe1xuICAgIHNlbGVjdG9yOiAnW2FwcFNlbGVjdENvcHldJyxcbn0pXG5leHBvcnQgY2xhc3MgU2VsZWN0Q29weURpcmVjdGl2ZSB7XG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBlbDogRWxlbWVudFJlZiwgcHJpdmF0ZSBwbGF0Zm9ybVV0aWxzU2VydmljZTogUGxhdGZvcm1VdGlsc1NlcnZpY2UpIHsgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcignY29weScpIG9uQ29weSgpIHtcbiAgICAgICAgaWYgKHdpbmRvdyA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGNvcHlUZXh0ID0gJyc7XG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWxlY3Rpb24ucmFuZ2VDb3VudDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KGkpO1xuICAgICAgICAgICAgY29uc3QgdGV4dCA9IHJhbmdlLnRvU3RyaW5nKCk7XG5cbiAgICAgICAgICAgIC8vIFRoZSBzZWxlY3Rpb24gc2hvdWxkIG9ubHkgY29udGFpbiBvbmUgbGluZSBvZiB0ZXh0LiBJbiBzb21lIGNhc2VzIGhvd2V2ZXIsIHRoZVxuICAgICAgICAgICAgLy8gc2VsZWN0aW9uIGNvbnRhaW5zIG5ld2xpbmVzIGFuZCBzcGFjZSBjaGFyYWN0ZXJzIGZyb20gdGhlIGluZGVudGF0aW9uIG9mIGZvbGxvd2luZ1xuICAgICAgICAgICAgLy8gc2libGluZyBub2Rlcy4gVG8gYXZvaWQgY29weWluZyBwYXNzd29yZHMgY29udGFpbmluZyB0cmFpbGluZyBuZXdsaW5lcyBhbmQgc3BhY2VzXG4gICAgICAgICAgICAvLyB0aGF0IGFyZW4ndCBwYXJ0IG9mIHRoZSBwYXNzd29yZCwgdGhlIHNlbGVjdGlvbiBoYXMgdG8gYmUgdHJpbW1lZC5cbiAgICAgICAgICAgIGxldCBzdHJpbmdFbmRQb3MgPSB0ZXh0Lmxlbmd0aDtcbiAgICAgICAgICAgIGNvbnN0IG5ld0xpbmVQb3MgPSB0ZXh0LnNlYXJjaCgvKD86XFxyXFxufFxccnxcXG4pLyk7XG4gICAgICAgICAgICBpZiAobmV3TGluZVBvcyA+IC0xKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3RoZXJQYXJ0ID0gdGV4dC5zdWJzdHIobmV3TGluZVBvcykudHJpbSgpO1xuICAgICAgICAgICAgICAgIGlmIChvdGhlclBhcnQgPT09ICcnKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0cmluZ0VuZFBvcyA9IG5ld0xpbmVQb3M7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29weVRleHQgKz0gdGV4dC5zdWJzdHJpbmcoMCwgc3RyaW5nRW5kUG9zKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBsYXRmb3JtVXRpbHNTZXJ2aWNlLmNvcHlUb0NsaXBib2FyZChjb3B5VGV4dCwgeyB3aW5kb3c6IHdpbmRvdyB9KTtcbiAgICB9XG59XG4iLCJpbXBvcnQge1xuICAgIERpcmVjdGl2ZSxcbiAgICBIb3N0TGlzdGVuZXIsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogJ1thcHBTdG9wQ2xpY2tdJyxcbn0pXG5leHBvcnQgY2xhc3MgU3RvcENsaWNrRGlyZWN0aXZlIHtcbiAgICBASG9zdExpc3RlbmVyKCdjbGljaycsIFsnJGV2ZW50J10pIG9uQ2xpY2soJGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbn1cbiIsImltcG9ydCB7XG4gICAgRGlyZWN0aXZlLFxuICAgIEhvc3RMaXN0ZW5lcixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBEaXJlY3RpdmUoe1xuICAgIHNlbGVjdG9yOiAnW2FwcFN0b3BQcm9wXScsXG59KVxuZXhwb3J0IGNsYXNzIFN0b3BQcm9wRGlyZWN0aXZlIHtcbiAgICBASG9zdExpc3RlbmVyKCdjbGljaycsIFsnJGV2ZW50J10pIG9uQ2xpY2soJGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgICAgICRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9XG59XG4iLCJpbXBvcnQge1xuICAgIERpcmVjdGl2ZSxcbiAgICBFbGVtZW50UmVmLFxuICAgIGZvcndhcmRSZWYsXG4gICAgSG9zdExpc3RlbmVyLFxuICAgIElucHV0LFxuICAgIFJlbmRlcmVyMixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICAgIENvbnRyb2xWYWx1ZUFjY2Vzc29yLFxuICAgIE5nQ29udHJvbCxcbiAgICBOR19WQUxVRV9BQ0NFU1NPUixcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG4vLyByZWY6IGh0dHBzOi8vanVyaXN0ci5jb20vYmxvZy8yMDE4LzAyL25nLXRydWUtdmFsdWUtZGlyZWN0aXZlL1xuQERpcmVjdGl2ZSh7XG4gICAgc2VsZWN0b3I6ICdpbnB1dFt0eXBlPWNoZWNrYm94XVthcHBUcnVlRmFsc2VWYWx1ZV0nLFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFRydWVGYWxzZVZhbHVlRGlyZWN0aXZlKSxcbiAgICAgICAgICAgIG11bHRpOiB0cnVlLFxuICAgICAgICB9LFxuICAgIF0sXG59KVxuZXhwb3J0IGNsYXNzIFRydWVGYWxzZVZhbHVlRGlyZWN0aXZlIGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xuICAgIEBJbnB1dCgpIHRydWVWYWx1ZSA9IHRydWU7XG4gICAgQElucHV0KCkgZmFsc2VWYWx1ZSA9IGZhbHNlO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmLCBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIpIHsgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcignY2hhbmdlJywgWyckZXZlbnQnXSlcbiAgICBvbkhvc3RDaGFuZ2UoZXY6IGFueSkge1xuICAgICAgICB0aGlzLnByb3BhZ2F0ZUNoYW5nZShldi50YXJnZXQuY2hlY2tlZCA/IHRoaXMudHJ1ZVZhbHVlIDogdGhpcy5mYWxzZVZhbHVlKTtcbiAgICB9XG5cbiAgICB3cml0ZVZhbHVlKG9iajogYW55KTogdm9pZCB7XG4gICAgICAgIGlmIChvYmogPT09IHRoaXMudHJ1ZVZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFByb3BlcnR5KHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAnY2hlY2tlZCcsIHRydWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRQcm9wZXJ0eSh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ2NoZWNrZWQnLCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5wcm9wYWdhdGVDaGFuZ2UgPSBmbjtcbiAgICB9XG5cbiAgICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7IC8qIG5vdGhpbmcgKi8gfVxuXG4gICAgc2V0RGlzYWJsZWRTdGF0ZT8oaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQgeyAvKiBub3RoaW5nICovIH1cblxuICAgIHByaXZhdGUgcHJvcGFnYXRlQ2hhbmdlID0gKF86IGFueSkgPT4geyAvKiBub3RoaW5nICovIH07XG59XG4iLCJpbXBvcnQge1xuICAgIFBpcGUsXG4gICAgUGlwZVRyYW5zZm9ybSxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBVdGlscyB9IGZyb20gJ2pzbGliLWNvbW1vbi9taXNjL3V0aWxzJztcblxuLypcbiBBbiB1cGRhdGVkIHBpcGUgdGhhdCBzYW5pdGl6ZXMgSFRNTCwgaGlnaGxpZ2h0cyBudW1iZXJzIGFuZCBzcGVjaWFsIGNoYXJhY3RlcnMgKGluIGRpZmZlcmVudCBjb2xvcnMgZWFjaClcbiBhbmQgaGFuZGxlcyBVbmljb2RlIC8gRW1vamkgY2hhcmFjdGVycyBjb3JyZWN0bHkuXG4qL1xuQFBpcGUoeyBuYW1lOiAnY29sb3JQYXNzd29yZCcgfSlcbmV4cG9ydCBjbGFzcyBDb2xvclBhc3N3b3JkUGlwZSBpbXBsZW1lbnRzIFBpcGVUcmFuc2Zvcm0ge1xuICAgIHRyYW5zZm9ybShwYXNzd29yZDogc3RyaW5nKSB7XG4gICAgICAgIC8vIENvbnZlcnQgdG8gYW4gYXJyYXkgdG8gaGFuZGxlIGNhc2VzIHRoYXQgc3RpbmdzIGhhdmUgc3BlY2lhbCBjaGFyYWN0ZXJzLCBpZTogZW1vamkuXG4gICAgICAgIGNvbnN0IHBhc3N3b3JkQXJyYXkgPSBBcnJheS5mcm9tKHBhc3N3b3JkKTtcbiAgICAgICAgbGV0IGNvbG9yaXplZFBhc3N3b3JkID0gJyc7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFzc3dvcmRBcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGNoYXJhY3RlciA9IHBhc3N3b3JkQXJyYXlbaV07XG4gICAgICAgICAgICBsZXQgaXNTcGVjaWFsID0gZmFsc2U7XG4gICAgICAgICAgICAvLyBTYW5pdGl6ZSBIVE1MIGZpcnN0LlxuICAgICAgICAgICAgc3dpdGNoIChjaGFyYWN0ZXIpIHtcbiAgICAgICAgICAgICAgICBjYXNlICcmJzpcbiAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyID0gJyZhbXA7JztcbiAgICAgICAgICAgICAgICAgICAgaXNTcGVjaWFsID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnPCc6XG4gICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlciA9ICcmbHQ7JztcbiAgICAgICAgICAgICAgICAgICAgaXNTcGVjaWFsID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnPic6XG4gICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlciA9ICcmZ3Q7JztcbiAgICAgICAgICAgICAgICAgICAgaXNTcGVjaWFsID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnICc6XG4gICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlciA9ICcmbmJzcDsnO1xuICAgICAgICAgICAgICAgICAgICBpc1NwZWNpYWwgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCB0eXBlID0gJ2xldHRlcic7XG4gICAgICAgICAgICBpZiAoY2hhcmFjdGVyLm1hdGNoKFV0aWxzLnJlZ2V4cEVtb2ppUHJlc2VudGF0aW9uKSkge1xuICAgICAgICAgICAgICAgIHR5cGUgPSAnZW1vamknO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChpc1NwZWNpYWwgfHwgY2hhcmFjdGVyLm1hdGNoKC9bXlxcdyBdLykpIHtcbiAgICAgICAgICAgICAgICB0eXBlID0gJ3NwZWNpYWwnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjaGFyYWN0ZXIubWF0Y2goL1xcZC8pKSB7XG4gICAgICAgICAgICAgICAgdHlwZSA9ICdudW1iZXInO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29sb3JpemVkUGFzc3dvcmQgKz0gJzxzcGFuIGNsYXNzPVwicGFzc3dvcmQtJyArIHR5cGUgKyAnXCI+JyArIGNoYXJhY3RlciArICc8L3NwYW4+JztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29sb3JpemVkUGFzc3dvcmQ7XG4gICAgfVxufVxuIiwiaW1wb3J0IHtcbiAgICBQaXBlLFxuICAgIFBpcGVUcmFuc2Zvcm0sXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBJMThuU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvaTE4bi5zZXJ2aWNlJztcblxuQFBpcGUoe1xuICAgIG5hbWU6ICdpMThuJyxcbn0pXG5leHBvcnQgY2xhc3MgSTE4blBpcGUgaW1wbGVtZW50cyBQaXBlVHJhbnNmb3JtIHtcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGkxOG5TZXJ2aWNlOiBJMThuU2VydmljZSkgeyB9XG5cbiAgICB0cmFuc2Zvcm0oaWQ6IHN0cmluZywgcDE/OiBzdHJpbmcsIHAyPzogc3RyaW5nLCBwMz86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmkxOG5TZXJ2aWNlLnQoaWQsIHAxLCBwMiwgcDMpO1xuICAgIH1cbn1cbiIsImltcG9ydCB7XG4gICAgUGlwZSxcbiAgICBQaXBlVHJhbnNmb3JtLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgQ2lwaGVyVmlldyB9IGZyb20gJ2pzbGliLWNvbW1vbi9tb2RlbHMvdmlldy9jaXBoZXJWaWV3JztcblxuQFBpcGUoe1xuICAgIG5hbWU6ICdzZWFyY2hDaXBoZXJzJyxcbn0pXG5leHBvcnQgY2xhc3MgU2VhcmNoQ2lwaGVyc1BpcGUgaW1wbGVtZW50cyBQaXBlVHJhbnNmb3JtIHtcbiAgICB0cmFuc2Zvcm0oY2lwaGVyczogQ2lwaGVyVmlld1tdLCBzZWFyY2hUZXh0OiBzdHJpbmcsIGRlbGV0ZWQ6IGJvb2xlYW4gPSBmYWxzZSk6IENpcGhlclZpZXdbXSB7XG4gICAgICAgIGlmIChjaXBoZXJzID09IG51bGwgfHwgY2lwaGVycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzZWFyY2hUZXh0ID09IG51bGwgfHwgc2VhcmNoVGV4dC5sZW5ndGggPCAyKSB7XG4gICAgICAgICAgICByZXR1cm4gY2lwaGVycy5maWx0ZXIoYyA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRlbGV0ZWQgIT09IGMuaXNEZWxldGVkO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBzZWFyY2hUZXh0ID0gc2VhcmNoVGV4dC50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgcmV0dXJuIGNpcGhlcnMuZmlsdGVyKGMgPT4ge1xuICAgICAgICAgICAgaWYgKGRlbGV0ZWQgIT09IGMuaXNEZWxldGVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGMubmFtZSAhPSBudWxsICYmIGMubmFtZS50b0xvd2VyQ2FzZSgpLmluZGV4T2Yoc2VhcmNoVGV4dCkgPiAtMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHNlYXJjaFRleHQubGVuZ3RoID49IDggJiYgYy5pZC5zdGFydHNXaXRoKHNlYXJjaFRleHQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYy5zdWJUaXRsZSAhPSBudWxsICYmIGMuc3ViVGl0bGUudG9Mb3dlckNhc2UoKS5pbmRleE9mKHNlYXJjaFRleHQpID4gLTEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjLmxvZ2luICYmIGMubG9naW4udXJpICE9IG51bGwgJiYgYy5sb2dpbi51cmkudG9Mb3dlckNhc2UoKS5pbmRleE9mKHNlYXJjaFRleHQpID4gLTEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9KTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICAgIEFjdGl2YXRlZFJvdXRlU25hcHNob3QsXG4gICAgQ2FuQWN0aXZhdGUsXG4gICAgUm91dGVyLFxuICAgIFJvdXRlclN0YXRlU25hcHNob3QsXG59IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5cbmltcG9ydCB7IE1lc3NhZ2luZ1NlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL21lc3NhZ2luZy5zZXJ2aWNlJztcbmltcG9ydCB7IFVzZXJTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy91c2VyLnNlcnZpY2UnO1xuaW1wb3J0IHsgVmF1bHRUaW1lb3V0U2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvdmF1bHRUaW1lb3V0LnNlcnZpY2UnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgQXV0aEd1YXJkU2VydmljZSBpbXBsZW1lbnRzIENhbkFjdGl2YXRlIHtcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHZhdWx0VGltZW91dFNlcnZpY2U6IFZhdWx0VGltZW91dFNlcnZpY2UsIHByaXZhdGUgdXNlclNlcnZpY2U6IFVzZXJTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLCBwcml2YXRlIG1lc3NhZ2luZ1NlcnZpY2U6IE1lc3NhZ2luZ1NlcnZpY2UpIHsgfVxuXG4gICAgYXN5bmMgY2FuQWN0aXZhdGUocm91dGU6IEFjdGl2YXRlZFJvdXRlU25hcHNob3QsIHJvdXRlclN0YXRlOiBSb3V0ZXJTdGF0ZVNuYXBzaG90KSB7XG4gICAgICAgIGNvbnN0IGlzQXV0aGVkID0gYXdhaXQgdGhpcy51c2VyU2VydmljZS5pc0F1dGhlbnRpY2F0ZWQoKTtcbiAgICAgICAgaWYgKCFpc0F1dGhlZCkge1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdpbmdTZXJ2aWNlLnNlbmQoJ2F1dGhCbG9ja2VkJyk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsb2NrZWQgPSBhd2FpdCB0aGlzLnZhdWx0VGltZW91dFNlcnZpY2UuaXNMb2NrZWQoKTtcbiAgICAgICAgaWYgKGxvY2tlZCkge1xuICAgICAgICAgICAgaWYgKHJvdXRlclN0YXRlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2luZ1NlcnZpY2Uuc2VuZCgnbG9ja2VkVXJsJywgeyB1cmw6IHJvdXRlclN0YXRlLnVybCB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnbG9jayddLCB7IHF1ZXJ5UGFyYW1zOiB7IHByb21wdEJpb21ldHJpYzogdHJ1ZSB9fSk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IEJyb2FkY2FzdGVyU2VydmljZSBhcyBCYXNlQnJvYWRjYXN0ZXJTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL3NlcnZpY2VzL2Jyb2FkY2FzdGVyLnNlcnZpY2UnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgQnJvYWRjYXN0ZXJTZXJ2aWNlIGV4dGVuZHMgQmFzZUJyb2FkY2FzdGVyU2VydmljZSB7XG59XG4iLCJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICAgIENhbkFjdGl2YXRlLFxuICAgIFJvdXRlcixcbn0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcblxuaW1wb3J0IHsgVXNlclNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL3VzZXIuc2VydmljZSc7XG5pbXBvcnQgeyBWYXVsdFRpbWVvdXRTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy92YXVsdFRpbWVvdXQuc2VydmljZSc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBMb2NrR3VhcmRTZXJ2aWNlIGltcGxlbWVudHMgQ2FuQWN0aXZhdGUge1xuXG4gICAgcHJvdGVjdGVkIGhvbWVwYWdlID0gJ3ZhdWx0JztcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHZhdWx0VGltZW91dFNlcnZpY2U6IFZhdWx0VGltZW91dFNlcnZpY2UsIHByaXZhdGUgdXNlclNlcnZpY2U6IFVzZXJTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyKSB7IH1cblxuICAgIGFzeW5jIGNhbkFjdGl2YXRlKCkge1xuICAgICAgICBjb25zdCBpc0F1dGhlZCA9IGF3YWl0IHRoaXMudXNlclNlcnZpY2UuaXNBdXRoZW50aWNhdGVkKCk7XG4gICAgICAgIGlmIChpc0F1dGhlZCkge1xuICAgICAgICAgICAgY29uc3QgbG9ja2VkID0gYXdhaXQgdGhpcy52YXVsdFRpbWVvdXRTZXJ2aWNlLmlzTG9ja2VkKCk7XG4gICAgICAgICAgICBpZiAobG9ja2VkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFt0aGlzLmhvbWVwYWdlXSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycnXSk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG4iLCJpbXBvcnQge1xuICAgIEFwcGxpY2F0aW9uUmVmLFxuICAgIENvbXBvbmVudEZhY3RvcnksXG4gICAgQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxuICAgIENvbXBvbmVudFJlZixcbiAgICBFbWJlZGRlZFZpZXdSZWYsXG4gICAgSW5qZWN0YWJsZSxcbiAgICBJbmplY3RvcixcbiAgICBUeXBlLFxuICAgIFZpZXdDb250YWluZXJSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBmaXJzdCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgRHluYW1pY01vZGFsQ29tcG9uZW50IH0gZnJvbSAnLi4vY29tcG9uZW50cy9tb2RhbC9keW5hbWljLW1vZGFsLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBNb2RhbEluamVjdG9yIH0gZnJvbSAnLi4vY29tcG9uZW50cy9tb2RhbC9tb2RhbC1pbmplY3Rvcic7XG5pbXBvcnQgeyBNb2RhbFJlZiB9IGZyb20gJy4uL2NvbXBvbmVudHMvbW9kYWwvbW9kYWwucmVmJztcblxuZXhwb3J0IGNsYXNzIE1vZGFsQ29uZmlnPEQgPSBhbnk+IHtcbiAgICBkYXRhPzogRDtcbiAgICBhbGxvd011bHRpcGxlTW9kYWxzOiBib29sZWFuID0gZmFsc2U7XG59XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBNb2RhbFNlcnZpY2Uge1xuICAgIHByb3RlY3RlZCBtb2RhbExpc3Q6IENvbXBvbmVudFJlZjxEeW5hbWljTW9kYWxDb21wb25lbnQ+W10gPSBbXTtcblxuICAgIC8vIExhenkgbG9hZGVkIG1vZHVsZXMgYXJlIG5vdCBhdmFpbGFibGUgaW4gY29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxuICAgIC8vIHRoZXJlZm9yZSBtb2R1bGVzIG5lZWRzIHRvIG1hbnVhbGx5IGluaXRpYWxpemUgdGhlaXIgcmVzb2x2ZXJzLlxuICAgIHByaXZhdGUgZmFjdG9yeVJlc29sdmVyczogTWFwPFR5cGU8YW55PiwgQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyPiA9IG5ldyBNYXAoKTtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgY29tcG9uZW50RmFjdG9yeVJlc29sdmVyOiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsIHByaXZhdGUgYXBwbGljYXRpb25SZWY6IEFwcGxpY2F0aW9uUmVmLFxuICAgICAgICBwcml2YXRlIGluamVjdG9yOiBJbmplY3Rvcikge1xuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXl1cCcsIGV2ZW50ID0+IHtcbiAgICAgICAgICAgIGlmIChldmVudC5rZXkgPT09ICdFc2NhcGUnICYmIHRoaXMubW9kYWxDb3VudCA+IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRvcE1vZGFsLmluc3RhbmNlLmNsb3NlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGdldCBtb2RhbENvdW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tb2RhbExpc3QubGVuZ3RoO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0IHRvcE1vZGFsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tb2RhbExpc3RbdGhpcy5tb2RhbENvdW50IC0gMV07XG4gICAgfVxuXG4gICAgYXN5bmMgb3BlblZpZXdSZWY8VD4oY29tcG9uZW50VHlwZTogVHlwZTxUPiwgdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZixcbiAgICAgICAgc2V0Q29tcG9uZW50UGFyYW1ldGVyczogKGNvbXBvbmVudDogVCkgPT4gdm9pZCA9IG51bGwpOiBQcm9taXNlPFtNb2RhbFJlZiwgVF0+IHtcblxuICAgICAgICBjb25zdCBbbW9kYWxSZWYsIG1vZGFsQ29tcG9uZW50UmVmXSA9IHRoaXMub3BlbkludGVybmFsKGNvbXBvbmVudFR5cGUsIG51bGwsIGZhbHNlKTtcbiAgICAgICAgbW9kYWxDb21wb25lbnRSZWYuaW5zdGFuY2Uuc2V0Q29tcG9uZW50UGFyYW1ldGVycyA9IHNldENvbXBvbmVudFBhcmFtZXRlcnM7XG5cbiAgICAgICAgdmlld0NvbnRhaW5lclJlZi5pbnNlcnQobW9kYWxDb21wb25lbnRSZWYuaG9zdFZpZXcpO1xuXG4gICAgICAgIGF3YWl0IG1vZGFsUmVmLm9uQ3JlYXRlZC5waXBlKGZpcnN0KCkpLnRvUHJvbWlzZSgpO1xuXG4gICAgICAgIHJldHVybiBbbW9kYWxSZWYsIG1vZGFsQ29tcG9uZW50UmVmLmluc3RhbmNlLmNvbXBvbmVudFJlZi5pbnN0YW5jZV07XG4gICAgfVxuXG4gICAgb3Blbihjb21wb25lbnRUeXBlOiBUeXBlPGFueT4sIGNvbmZpZz86IE1vZGFsQ29uZmlnKSB7XG4gICAgICAgIGlmICghKGNvbmZpZz8uYWxsb3dNdWx0aXBsZU1vZGFscyA/PyBmYWxzZSkgJiYgdGhpcy5tb2RhbENvdW50ID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgW21vZGFsUmVmLCBfXSA9IHRoaXMub3BlbkludGVybmFsKGNvbXBvbmVudFR5cGUsIGNvbmZpZywgdHJ1ZSk7XG5cbiAgICAgICAgcmV0dXJuIG1vZGFsUmVmO1xuICAgIH1cblxuICAgIHJlZ2lzdGVyQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyPFQ+KGNvbXBvbmVudFR5cGU6IFR5cGU8VD4sIGNvbXBvbmVudEZhY3RvcnlSZXNvbHZlcjogQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZmFjdG9yeVJlc29sdmVycy5zZXQoY29tcG9uZW50VHlwZSwgY29tcG9uZW50RmFjdG9yeVJlc29sdmVyKTtcbiAgICB9XG5cbiAgICByZXNvbHZlQ29tcG9uZW50RmFjdG9yeTxUPihjb21wb25lbnRUeXBlOiBUeXBlPFQ+KTogQ29tcG9uZW50RmFjdG9yeTxUPiB7XG4gICAgICAgIGlmICh0aGlzLmZhY3RvcnlSZXNvbHZlcnMuaGFzKGNvbXBvbmVudFR5cGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5mYWN0b3J5UmVzb2x2ZXJzLmdldChjb21wb25lbnRUeXBlKS5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShjb21wb25lbnRUeXBlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmNvbXBvbmVudEZhY3RvcnlSZXNvbHZlci5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShjb21wb25lbnRUeXBlKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgb3BlbkludGVybmFsKGNvbXBvbmVudFR5cGU6IFR5cGU8YW55PiwgY29uZmlnPzogTW9kYWxDb25maWcsIGF0dGFjaFRvRG9tPzogYm9vbGVhbik6XG4gICAgICAgIFtNb2RhbFJlZiwgQ29tcG9uZW50UmVmPER5bmFtaWNNb2RhbENvbXBvbmVudD5dIHtcblxuICAgICAgICBjb25zdCBbbW9kYWxSZWYsIGNvbXBvbmVudFJlZl0gPSB0aGlzLmNyZWF0ZU1vZGFsQ29tcG9uZW50KGNvbmZpZyk7XG4gICAgICAgIGNvbXBvbmVudFJlZi5pbnN0YW5jZS5jaGlsZENvbXBvbmVudFR5cGUgPSBjb21wb25lbnRUeXBlO1xuXG4gICAgICAgIGlmIChhdHRhY2hUb0RvbSkge1xuICAgICAgICAgICAgdGhpcy5hcHBsaWNhdGlvblJlZi5hdHRhY2hWaWV3KGNvbXBvbmVudFJlZi5ob3N0Vmlldyk7XG4gICAgICAgICAgICBjb25zdCBkb21FbGVtID0gKGNvbXBvbmVudFJlZi5ob3N0VmlldyBhcyBFbWJlZGRlZFZpZXdSZWY8YW55Pikucm9vdE5vZGVzWzBdIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChkb21FbGVtKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG1vZGFsUmVmLm9uQ2xvc2VkLnBpcGUoZmlyc3QoKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIGlmIChhdHRhY2hUb0RvbSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYXBwbGljYXRpb25SZWYuZGV0YWNoVmlldyhjb21wb25lbnRSZWYuaG9zdFZpZXcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29tcG9uZW50UmVmLmRlc3Ryb3koKTtcblxuICAgICAgICAgICAgdGhpcy5tb2RhbExpc3QucG9wKCk7XG4gICAgICAgICAgICBpZiAodGhpcy5tb2RhbENvdW50ID4gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMudG9wTW9kYWwuaW5zdGFuY2UuZ2V0Rm9jdXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5zZXR1cEhhbmRsZXJzKG1vZGFsUmVmKTtcblxuICAgICAgICB0aGlzLm1vZGFsTGlzdC5wdXNoKGNvbXBvbmVudFJlZik7XG5cbiAgICAgICAgcmV0dXJuIFttb2RhbFJlZiwgY29tcG9uZW50UmVmXTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgc2V0dXBIYW5kbGVycyhtb2RhbFJlZjogTW9kYWxSZWYpIHtcbiAgICAgICAgbGV0IGJhY2tkcm9wOiBIVE1MRWxlbWVudCA9IG51bGw7XG5cbiAgICAgICAgLy8gQWRkIGJhY2tkcm9wLCBzZXR1cCBbZGF0YS1kaXNtaXNzXSBoYW5kbGVyLlxuICAgICAgICBtb2RhbFJlZi5vbkNyZWF0ZWQucGlwZShmaXJzdCgpKS5zdWJzY3JpYmUoZWwgPT4ge1xuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCdtb2RhbC1vcGVuJyk7XG5cbiAgICAgICAgICAgIGNvbnN0IG1vZGFsRWw6IEhUTUxFbGVtZW50ID0gZWwucXVlcnlTZWxlY3RvcignLm1vZGFsJyk7XG4gICAgICAgICAgICBjb25zdCBkaWFsb2dFbCA9IG1vZGFsRWwucXVlcnlTZWxlY3RvcignLm1vZGFsLWRpYWxvZycpIGFzIEhUTUxFbGVtZW50O1xuXG4gICAgICAgICAgICBiYWNrZHJvcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgYmFja2Ryb3AuY2xhc3NOYW1lID0gJ21vZGFsLWJhY2tkcm9wIGZhZGUnO1xuICAgICAgICAgICAgYmFja2Ryb3Auc3R5bGUuekluZGV4ID0gYCR7dGhpcy5tb2RhbENvdW50fTA0MGA7XG4gICAgICAgICAgICBtb2RhbEVsLnByZXBlbmQoYmFja2Ryb3ApO1xuXG4gICAgICAgICAgICBkaWFsb2dFbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlOiBFdmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGRpYWxvZ0VsLnN0eWxlLnpJbmRleCA9IGAke3RoaXMubW9kYWxDb3VudH0wNTBgO1xuXG4gICAgICAgICAgICBjb25zdCBtb2RhbHMgPSBBcnJheS5mcm9tKGVsLnF1ZXJ5U2VsZWN0b3JBbGwoJy5tb2RhbC1iYWNrZHJvcCwgLm1vZGFsICpbZGF0YS1kaXNtaXNzPVwibW9kYWxcIl0nKSk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNsb3NlRWxlbWVudCBvZiBtb2RhbHMpIHtcbiAgICAgICAgICAgICAgICBjbG9zZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBldmVudCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIG1vZGFsUmVmLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIG9uQ2xvc2UgaXMgdXNlZCBpbiBXZWIgdG8gaG9vayBpbnRvIGJvb3RzdHJhcC4gT24gb3RoZXIgcHJvamVjdHMgd2UgcGlwZSBpdCBkaXJlY3RseSB0byBjbG9zZWQuXG4gICAgICAgIG1vZGFsUmVmLm9uQ2xvc2UucGlwZShmaXJzdCgpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgbW9kYWxSZWYuY2xvc2VkKCk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLm1vZGFsQ291bnQgPT09IDApIHtcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoJ21vZGFsLW9wZW4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGNyZWF0ZU1vZGFsQ29tcG9uZW50KGNvbmZpZzogTW9kYWxDb25maWcpOiBbTW9kYWxSZWYsIENvbXBvbmVudFJlZjxEeW5hbWljTW9kYWxDb21wb25lbnQ+XSB7XG4gICAgICAgIGNvbnN0IG1vZGFsUmVmID0gbmV3IE1vZGFsUmVmKCk7XG5cbiAgICAgICAgY29uc3QgbWFwID0gbmV3IFdlYWtNYXAoKTtcbiAgICAgICAgbWFwLnNldChNb2RhbENvbmZpZywgY29uZmlnKTtcbiAgICAgICAgbWFwLnNldChNb2RhbFJlZiwgbW9kYWxSZWYpO1xuXG4gICAgICAgIGNvbnN0IGNvbXBvbmVudEZhY3RvcnkgPSB0aGlzLmNvbXBvbmVudEZhY3RvcnlSZXNvbHZlci5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShEeW5hbWljTW9kYWxDb21wb25lbnQpO1xuICAgICAgICBjb25zdCBjb21wb25lbnRSZWYgPSBjb21wb25lbnRGYWN0b3J5LmNyZWF0ZShuZXcgTW9kYWxJbmplY3Rvcih0aGlzLmluamVjdG9yLCBtYXApKTtcblxuICAgICAgICByZXR1cm4gW21vZGFsUmVmLCBjb21wb25lbnRSZWZdO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgUGFzc3dvcmRSZXByb21wdFNlcnZpY2UgYXMgUGFzc3dvcmRSZXByb21wdFNlcnZpY2VBYnN0cmFjdGlvbiB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvcGFzc3dvcmRSZXByb21wdC5zZXJ2aWNlJztcblxuaW1wb3J0IHsgUGFzc3dvcmRSZXByb21wdENvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudHMvcGFzc3dvcmQtcmVwcm9tcHQuY29tcG9uZW50JztcbmltcG9ydCB7IE1vZGFsU2VydmljZSB9IGZyb20gJy4vbW9kYWwuc2VydmljZSc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBQYXNzd29yZFJlcHJvbXB0U2VydmljZSBpbXBsZW1lbnRzIFBhc3N3b3JkUmVwcm9tcHRTZXJ2aWNlQWJzdHJhY3Rpb24ge1xuICAgIHByb3RlY3RlZCBjb21wb25lbnQgPSBQYXNzd29yZFJlcHJvbXB0Q29tcG9uZW50O1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBtb2RhbFNlcnZpY2U6IE1vZGFsU2VydmljZSkgeyB9XG5cbiAgICBwcm90ZWN0ZWRGaWVsZHMoKSB7XG4gICAgICAgIHJldHVybiBbJ1RPVFAnLCAnUGFzc3dvcmQnLCAnSF9GaWVsZCcsICdDYXJkIE51bWJlcicsICdTZWN1cml0eSBDb2RlJ107XG4gICAgfVxuXG4gICAgYXN5bmMgc2hvd1Bhc3N3b3JkUHJvbXB0KCkge1xuICAgICAgICBjb25zdCByZWYgPSB0aGlzLm1vZGFsU2VydmljZS5vcGVuKHRoaXMuY29tcG9uZW50LCB7YWxsb3dNdWx0aXBsZU1vZGFsczogdHJ1ZX0pO1xuXG4gICAgICAgIGlmIChyZWYgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVmLm9uQ2xvc2VkUHJvbWlzZSgpO1xuICAgICAgICByZXR1cm4gcmVzdWx0ID09PSB0cnVlO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gICAgQWN0aXZhdGVkUm91dGVTbmFwc2hvdCxcbiAgICBDYW5BY3RpdmF0ZSxcbiAgICBSb3V0ZXIsXG59IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5cbmltcG9ydCB7IFVzZXJTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy91c2VyLnNlcnZpY2UnO1xuaW1wb3J0IHsgVmF1bHRUaW1lb3V0U2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvdmF1bHRUaW1lb3V0LnNlcnZpY2UnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgVW5hdXRoR3VhcmRTZXJ2aWNlIGltcGxlbWVudHMgQ2FuQWN0aXZhdGUge1xuXG4gICAgcHJvdGVjdGVkIGhvbWVwYWdlID0gJ3ZhdWx0JztcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHZhdWx0VGltZW91dFNlcnZpY2U6IFZhdWx0VGltZW91dFNlcnZpY2UsIHByaXZhdGUgdXNlclNlcnZpY2U6IFVzZXJTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyKSB7IH1cblxuICAgIGFzeW5jIGNhbkFjdGl2YXRlKCkge1xuICAgICAgICBjb25zdCBpc0F1dGhlZCA9IGF3YWl0IHRoaXMudXNlclNlcnZpY2UuaXNBdXRoZW50aWNhdGVkKCk7XG4gICAgICAgIGlmIChpc0F1dGhlZCkge1xuICAgICAgICAgICAgY29uc3QgbG9ja2VkID0gYXdhaXQgdGhpcy52YXVsdFRpbWVvdXRTZXJ2aWNlLmlzTG9ja2VkKCk7XG4gICAgICAgICAgICBpZiAobG9ja2VkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWydsb2NrJ10pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbdGhpcy5ob21lcGFnZV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBJMThuU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvaTE4bi5zZXJ2aWNlJztcbmltcG9ydCB7IFBsYXRmb3JtVXRpbHNTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9wbGF0Zm9ybVV0aWxzLnNlcnZpY2UnO1xuXG5pbXBvcnQgeyBFcnJvclJlc3BvbnNlIH0gZnJvbSAnanNsaWItY29tbW9uL21vZGVscy9yZXNwb25zZS9lcnJvclJlc3BvbnNlJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFZhbGlkYXRpb25TZXJ2aWNlIHtcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGkxOG5TZXJ2aWNlOiBJMThuU2VydmljZSwgcHJpdmF0ZSBwbGF0Zm9ybVV0aWxzU2VydmljZTogUGxhdGZvcm1VdGlsc1NlcnZpY2UpIHsgfVxuXG4gICAgc2hvd0Vycm9yKGRhdGE6IGFueSk6IHN0cmluZ1tdIHtcbiAgICAgICAgY29uc3QgZGVmYXVsdEVycm9yTWVzc2FnZSA9IHRoaXMuaTE4blNlcnZpY2UudCgndW5leHBlY3RlZEVycm9yJyk7XG4gICAgICAgIGxldCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG5cbiAgICAgICAgaWYgKGRhdGEgIT0gbnVsbCAmJiB0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGVycm9ycy5wdXNoKGRhdGEpO1xuICAgICAgICB9IGVsc2UgaWYgKGRhdGEgPT0gbnVsbCB8fCB0eXBlb2YgZGF0YSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIGVycm9ycy5wdXNoKGRlZmF1bHRFcnJvck1lc3NhZ2UpO1xuICAgICAgICB9IGVsc2UgaWYgKGRhdGEudmFsaWRhdGlvbkVycm9ycyAhPSBudWxsKSB7XG4gICAgICAgICAgICBlcnJvcnMgPSBlcnJvcnMuY29uY2F0KChkYXRhIGFzIEVycm9yUmVzcG9uc2UpLmdldEFsbE1lc3NhZ2VzKCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZXJyb3JzLnB1c2goZGF0YS5tZXNzYWdlID8gZGF0YS5tZXNzYWdlIDogZGVmYXVsdEVycm9yTWVzc2FnZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXJyb3JzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgdGhpcy5wbGF0Zm9ybVV0aWxzU2VydmljZS5zaG93VG9hc3QoJ2Vycm9yJywgdGhpcy5pMThuU2VydmljZS50KCdlcnJvck9jY3VycmVkJyksIGVycm9yc1swXSk7XG4gICAgICAgIH0gZWxzZSBpZiAoZXJyb3JzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIHRoaXMucGxhdGZvcm1VdGlsc1NlcnZpY2Uuc2hvd1RvYXN0KCdlcnJvcicsIHRoaXMuaTE4blNlcnZpY2UudCgnZXJyb3JPY2N1cnJlZCcpLCBlcnJvcnMsIHtcbiAgICAgICAgICAgICAgICB0aW1lb3V0OiA1MDAwICogZXJyb3JzLmxlbmd0aCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGVycm9ycztcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBQb2xpY3lUeXBlIH0gZnJvbSAnLi4vZW51bXMvcG9saWN5VHlwZSc7XG5pbXBvcnQgeyBTZXRDcnlwdG9BZ2VudEtleVJlcXVlc3QgfSBmcm9tICcuLi9tb2RlbHMvcmVxdWVzdC9hY2NvdW50L3NldENyeXB0b0FnZW50S2V5UmVxdWVzdCc7XG5cbmltcG9ydCB7IEF0dGFjaG1lbnRSZXF1ZXN0IH0gZnJvbSAnLi4vbW9kZWxzL3JlcXVlc3QvYXR0YWNobWVudFJlcXVlc3QnO1xuXG5pbXBvcnQgeyBCaXRQYXlJbnZvaWNlUmVxdWVzdCB9IGZyb20gJy4uL21vZGVscy9yZXF1ZXN0L2JpdFBheUludm9pY2VSZXF1ZXN0JztcbmltcG9ydCB7IENpcGhlckJ1bGtEZWxldGVSZXF1ZXN0IH0gZnJvbSAnLi4vbW9kZWxzL3JlcXVlc3QvY2lwaGVyQnVsa0RlbGV0ZVJlcXVlc3QnO1xuaW1wb3J0IHsgQ2lwaGVyQnVsa01vdmVSZXF1ZXN0IH0gZnJvbSAnLi4vbW9kZWxzL3JlcXVlc3QvY2lwaGVyQnVsa01vdmVSZXF1ZXN0JztcbmltcG9ydCB7IENpcGhlckJ1bGtSZXN0b3JlUmVxdWVzdCB9IGZyb20gJy4uL21vZGVscy9yZXF1ZXN0L2NpcGhlckJ1bGtSZXN0b3JlUmVxdWVzdCc7XG5pbXBvcnQgeyBDaXBoZXJCdWxrU2hhcmVSZXF1ZXN0IH0gZnJvbSAnLi4vbW9kZWxzL3JlcXVlc3QvY2lwaGVyQnVsa1NoYXJlUmVxdWVzdCc7XG5pbXBvcnQgeyBDaXBoZXJDb2xsZWN0aW9uc1JlcXVlc3QgfSBmcm9tICcuLi9tb2RlbHMvcmVxdWVzdC9jaXBoZXJDb2xsZWN0aW9uc1JlcXVlc3QnO1xuaW1wb3J0IHsgQ2lwaGVyQ3JlYXRlUmVxdWVzdCB9IGZyb20gJy4uL21vZGVscy9yZXF1ZXN0L2NpcGhlckNyZWF0ZVJlcXVlc3QnO1xuaW1wb3J0IHsgQ2lwaGVyUmVxdWVzdCB9IGZyb20gJy4uL21vZGVscy9yZXF1ZXN0L2NpcGhlclJlcXVlc3QnO1xuaW1wb3J0IHsgQ2lwaGVyU2hhcmVSZXF1ZXN0IH0gZnJvbSAnLi4vbW9kZWxzL3JlcXVlc3QvY2lwaGVyU2hhcmVSZXF1ZXN0JztcbmltcG9ydCB7IENvbGxlY3Rpb25SZXF1ZXN0IH0gZnJvbSAnLi4vbW9kZWxzL3JlcXVlc3QvY29sbGVjdGlvblJlcXVlc3QnO1xuaW1wb3J0IHsgQ3J5cHRvQWdlbnRVc2VyS2V5UmVxdWVzdCB9IGZyb20gJy4uL21vZGVscy9yZXF1ZXN0L2NyeXB0b0FnZW50VXNlcktleVJlcXVlc3QnO1xuaW1wb3J0IHsgRGVsZXRlUmVjb3ZlclJlcXVlc3QgfSBmcm9tICcuLi9tb2RlbHMvcmVxdWVzdC9kZWxldGVSZWNvdmVyUmVxdWVzdCc7XG5pbXBvcnQgeyBFbWFpbFJlcXVlc3QgfSBmcm9tICcuLi9tb2RlbHMvcmVxdWVzdC9lbWFpbFJlcXVlc3QnO1xuaW1wb3J0IHsgRW1haWxUb2tlblJlcXVlc3QgfSBmcm9tICcuLi9tb2RlbHMvcmVxdWVzdC9lbWFpbFRva2VuUmVxdWVzdCc7XG5pbXBvcnQgeyBFbWVyZ2VuY3lBY2Nlc3NBY2NlcHRSZXF1ZXN0IH0gZnJvbSAnLi4vbW9kZWxzL3JlcXVlc3QvZW1lcmdlbmN5QWNjZXNzQWNjZXB0UmVxdWVzdCc7XG5pbXBvcnQgeyBFbWVyZ2VuY3lBY2Nlc3NDb25maXJtUmVxdWVzdCB9IGZyb20gJy4uL21vZGVscy9yZXF1ZXN0L2VtZXJnZW5jeUFjY2Vzc0NvbmZpcm1SZXF1ZXN0JztcbmltcG9ydCB7IEVtZXJnZW5jeUFjY2Vzc0ludml0ZVJlcXVlc3QgfSBmcm9tICcuLi9tb2RlbHMvcmVxdWVzdC9lbWVyZ2VuY3lBY2Nlc3NJbnZpdGVSZXF1ZXN0JztcbmltcG9ydCB7IEVtZXJnZW5jeUFjY2Vzc1Bhc3N3b3JkUmVxdWVzdCB9IGZyb20gJy4uL21vZGVscy9yZXF1ZXN0L2VtZXJnZW5jeUFjY2Vzc1Bhc3N3b3JkUmVxdWVzdCc7XG5pbXBvcnQgeyBFbWVyZ2VuY3lBY2Nlc3NVcGRhdGVSZXF1ZXN0IH0gZnJvbSAnLi4vbW9kZWxzL3JlcXVlc3QvZW1lcmdlbmN5QWNjZXNzVXBkYXRlUmVxdWVzdCc7XG5pbXBvcnQgeyBFdmVudFJlcXVlc3QgfSBmcm9tICcuLi9tb2RlbHMvcmVxdWVzdC9ldmVudFJlcXVlc3QnO1xuaW1wb3J0IHsgRm9sZGVyUmVxdWVzdCB9IGZyb20gJy4uL21vZGVscy9yZXF1ZXN0L2ZvbGRlclJlcXVlc3QnO1xuaW1wb3J0IHsgR3JvdXBSZXF1ZXN0IH0gZnJvbSAnLi4vbW9kZWxzL3JlcXVlc3QvZ3JvdXBSZXF1ZXN0JztcbmltcG9ydCB7IElhcENoZWNrUmVxdWVzdCB9IGZyb20gJy4uL21vZGVscy9yZXF1ZXN0L2lhcENoZWNrUmVxdWVzdCc7XG5pbXBvcnQgeyBJbXBvcnRDaXBoZXJzUmVxdWVzdCB9IGZyb20gJy4uL21vZGVscy9yZXF1ZXN0L2ltcG9ydENpcGhlcnNSZXF1ZXN0JztcbmltcG9ydCB7IEltcG9ydERpcmVjdG9yeVJlcXVlc3QgfSBmcm9tICcuLi9tb2RlbHMvcmVxdWVzdC9pbXBvcnREaXJlY3RvcnlSZXF1ZXN0JztcbmltcG9ydCB7IEltcG9ydE9yZ2FuaXphdGlvbkNpcGhlcnNSZXF1ZXN0IH0gZnJvbSAnLi4vbW9kZWxzL3JlcXVlc3QvaW1wb3J0T3JnYW5pemF0aW9uQ2lwaGVyc1JlcXVlc3QnO1xuaW1wb3J0IHsgS2RmUmVxdWVzdCB9IGZyb20gJy4uL21vZGVscy9yZXF1ZXN0L2tkZlJlcXVlc3QnO1xuaW1wb3J0IHsgS2V5c1JlcXVlc3QgfSBmcm9tICcuLi9tb2RlbHMvcmVxdWVzdC9rZXlzUmVxdWVzdCc7XG5pbXBvcnQgeyBPcmdhbml6YXRpb25Tc29SZXF1ZXN0IH0gZnJvbSAnLi4vbW9kZWxzL3JlcXVlc3Qvb3JnYW5pemF0aW9uL29yZ2FuaXphdGlvblNzb1JlcXVlc3QnO1xuaW1wb3J0IHsgT3JnYW5pemF0aW9uQ3JlYXRlUmVxdWVzdCB9IGZyb20gJy4uL21vZGVscy9yZXF1ZXN0L29yZ2FuaXphdGlvbkNyZWF0ZVJlcXVlc3QnO1xuaW1wb3J0IHsgT3JnYW5pemF0aW9uSW1wb3J0UmVxdWVzdCB9IGZyb20gJy4uL21vZGVscy9yZXF1ZXN0L29yZ2FuaXphdGlvbkltcG9ydFJlcXVlc3QnO1xuaW1wb3J0IHsgT3JnYW5pemF0aW9uS2V5c1JlcXVlc3QgfSBmcm9tICcuLi9tb2RlbHMvcmVxdWVzdC9vcmdhbml6YXRpb25LZXlzUmVxdWVzdCc7XG5pbXBvcnQgeyBPcmdhbml6YXRpb25TdWJzY3JpcHRpb25VcGRhdGVSZXF1ZXN0IH0gZnJvbSAnLi4vbW9kZWxzL3JlcXVlc3Qvb3JnYW5pemF0aW9uU3Vic2NyaXB0aW9uVXBkYXRlUmVxdWVzdCc7XG5pbXBvcnQgeyBPcmdhbml6YXRpb25UYXhJbmZvVXBkYXRlUmVxdWVzdCB9IGZyb20gJy4uL21vZGVscy9yZXF1ZXN0L29yZ2FuaXphdGlvblRheEluZm9VcGRhdGVSZXF1ZXN0JztcbmltcG9ydCB7IE9yZ2FuaXphdGlvblVwZGF0ZVJlcXVlc3QgfSBmcm9tICcuLi9tb2RlbHMvcmVxdWVzdC9vcmdhbml6YXRpb25VcGRhdGVSZXF1ZXN0JztcbmltcG9ydCB7IE9yZ2FuaXphdGlvblVwZ3JhZGVSZXF1ZXN0IH0gZnJvbSAnLi4vbW9kZWxzL3JlcXVlc3Qvb3JnYW5pemF0aW9uVXBncmFkZVJlcXVlc3QnO1xuaW1wb3J0IHsgT3JnYW5pemF0aW9uVXNlckFjY2VwdFJlcXVlc3QgfSBmcm9tICcuLi9tb2RlbHMvcmVxdWVzdC9vcmdhbml6YXRpb25Vc2VyQWNjZXB0UmVxdWVzdCc7XG5pbXBvcnQgeyBPcmdhbml6YXRpb25Vc2VyQnVsa0NvbmZpcm1SZXF1ZXN0IH0gZnJvbSAnLi4vbW9kZWxzL3JlcXVlc3Qvb3JnYW5pemF0aW9uVXNlckJ1bGtDb25maXJtUmVxdWVzdCc7XG5pbXBvcnQgeyBPcmdhbml6YXRpb25Vc2VyQnVsa1JlcXVlc3QgfSBmcm9tICcuLi9tb2RlbHMvcmVxdWVzdC9vcmdhbml6YXRpb25Vc2VyQnVsa1JlcXVlc3QnO1xuaW1wb3J0IHsgT3JnYW5pemF0aW9uVXNlckNvbmZpcm1SZXF1ZXN0IH0gZnJvbSAnLi4vbW9kZWxzL3JlcXVlc3Qvb3JnYW5pemF0aW9uVXNlckNvbmZpcm1SZXF1ZXN0JztcbmltcG9ydCB7IE9yZ2FuaXphdGlvblVzZXJJbnZpdGVSZXF1ZXN0IH0gZnJvbSAnLi4vbW9kZWxzL3JlcXVlc3Qvb3JnYW5pemF0aW9uVXNlckludml0ZVJlcXVlc3QnO1xuaW1wb3J0IHsgT3JnYW5pemF0aW9uVXNlclJlc2V0UGFzc3dvcmRFbnJvbGxtZW50UmVxdWVzdCB9IGZyb20gJy4uL21vZGVscy9yZXF1ZXN0L29yZ2FuaXphdGlvblVzZXJSZXNldFBhc3N3b3JkRW5yb2xsbWVudFJlcXVlc3QnO1xuaW1wb3J0IHsgT3JnYW5pemF0aW9uVXNlclJlc2V0UGFzc3dvcmRSZXF1ZXN0IH0gZnJvbSAnLi4vbW9kZWxzL3JlcXVlc3Qvb3JnYW5pemF0aW9uVXNlclJlc2V0UGFzc3dvcmRSZXF1ZXN0JztcbmltcG9ydCB7IE9yZ2FuaXphdGlvblVzZXJVcGRhdGVHcm91cHNSZXF1ZXN0IH0gZnJvbSAnLi4vbW9kZWxzL3JlcXVlc3Qvb3JnYW5pemF0aW9uVXNlclVwZGF0ZUdyb3Vwc1JlcXVlc3QnO1xuaW1wb3J0IHsgT3JnYW5pemF0aW9uVXNlclVwZGF0ZVJlcXVlc3QgfSBmcm9tICcuLi9tb2RlbHMvcmVxdWVzdC9vcmdhbml6YXRpb25Vc2VyVXBkYXRlUmVxdWVzdCc7XG5pbXBvcnQgeyBQYXNzd29yZEhpbnRSZXF1ZXN0IH0gZnJvbSAnLi4vbW9kZWxzL3JlcXVlc3QvcGFzc3dvcmRIaW50UmVxdWVzdCc7XG5pbXBvcnQgeyBQYXNzd29yZFJlcXVlc3QgfSBmcm9tICcuLi9tb2RlbHMvcmVxdWVzdC9wYXNzd29yZFJlcXVlc3QnO1xuaW1wb3J0IHsgUGFzc3dvcmRWZXJpZmljYXRpb25SZXF1ZXN0IH0gZnJvbSAnLi4vbW9kZWxzL3JlcXVlc3QvcGFzc3dvcmRWZXJpZmljYXRpb25SZXF1ZXN0JztcbmltcG9ydCB7IFBheW1lbnRSZXF1ZXN0IH0gZnJvbSAnLi4vbW9kZWxzL3JlcXVlc3QvcGF5bWVudFJlcXVlc3QnO1xuaW1wb3J0IHsgUG9saWN5UmVxdWVzdCB9IGZyb20gJy4uL21vZGVscy9yZXF1ZXN0L3BvbGljeVJlcXVlc3QnO1xuaW1wb3J0IHsgUHJlbG9naW5SZXF1ZXN0IH0gZnJvbSAnLi4vbW9kZWxzL3JlcXVlc3QvcHJlbG9naW5SZXF1ZXN0JztcbmltcG9ydCB7IFByb3ZpZGVyQWRkT3JnYW5pemF0aW9uUmVxdWVzdCB9IGZyb20gJy4uL21vZGVscy9yZXF1ZXN0L3Byb3ZpZGVyL3Byb3ZpZGVyQWRkT3JnYW5pemF0aW9uUmVxdWVzdCc7XG5pbXBvcnQgeyBQcm92aWRlck9yZ2FuaXphdGlvbkNyZWF0ZVJlcXVlc3QgfSBmcm9tICcuLi9tb2RlbHMvcmVxdWVzdC9wcm92aWRlci9wcm92aWRlck9yZ2FuaXphdGlvbkNyZWF0ZVJlcXVlc3QnO1xuaW1wb3J0IHsgUHJvdmlkZXJTZXR1cFJlcXVlc3QgfSBmcm9tICcuLi9tb2RlbHMvcmVxdWVzdC9wcm92aWRlci9wcm92aWRlclNldHVwUmVxdWVzdCc7XG5pbXBvcnQgeyBQcm92aWRlclVwZGF0ZVJlcXVlc3QgfSBmcm9tICcuLi9tb2RlbHMvcmVxdWVzdC9wcm92aWRlci9wcm92aWRlclVwZGF0ZVJlcXVlc3QnO1xuaW1wb3J0IHsgUHJvdmlkZXJVc2VyQWNjZXB0UmVxdWVzdCB9IGZyb20gJy4uL21vZGVscy9yZXF1ZXN0L3Byb3ZpZGVyL3Byb3ZpZGVyVXNlckFjY2VwdFJlcXVlc3QnO1xuaW1wb3J0IHsgUHJvdmlkZXJVc2VyQnVsa0NvbmZpcm1SZXF1ZXN0IH0gZnJvbSAnLi4vbW9kZWxzL3JlcXVlc3QvcHJvdmlkZXIvcHJvdmlkZXJVc2VyQnVsa0NvbmZpcm1SZXF1ZXN0JztcbmltcG9ydCB7IFByb3ZpZGVyVXNlckJ1bGtSZXF1ZXN0IH0gZnJvbSAnLi4vbW9kZWxzL3JlcXVlc3QvcHJvdmlkZXIvcHJvdmlkZXJVc2VyQnVsa1JlcXVlc3QnO1xuaW1wb3J0IHsgUHJvdmlkZXJVc2VyQ29uZmlybVJlcXVlc3QgfSBmcm9tICcuLi9tb2RlbHMvcmVxdWVzdC9wcm92aWRlci9wcm92aWRlclVzZXJDb25maXJtUmVxdWVzdCc7XG5pbXBvcnQgeyBQcm92aWRlclVzZXJJbnZpdGVSZXF1ZXN0IH0gZnJvbSAnLi4vbW9kZWxzL3JlcXVlc3QvcHJvdmlkZXIvcHJvdmlkZXJVc2VySW52aXRlUmVxdWVzdCc7XG5pbXBvcnQgeyBQcm92aWRlclVzZXJVcGRhdGVSZXF1ZXN0IH0gZnJvbSAnLi4vbW9kZWxzL3JlcXVlc3QvcHJvdmlkZXIvcHJvdmlkZXJVc2VyVXBkYXRlUmVxdWVzdCc7XG5pbXBvcnQgeyBSZWdpc3RlclJlcXVlc3QgfSBmcm9tICcuLi9tb2RlbHMvcmVxdWVzdC9yZWdpc3RlclJlcXVlc3QnO1xuaW1wb3J0IHsgU2VhdFJlcXVlc3QgfSBmcm9tICcuLi9tb2RlbHMvcmVxdWVzdC9zZWF0UmVxdWVzdCc7XG5pbXBvcnQgeyBTZWxlY3Rpb25SZWFkT25seVJlcXVlc3QgfSBmcm9tICcuLi9tb2RlbHMvcmVxdWVzdC9zZWxlY3Rpb25SZWFkT25seVJlcXVlc3QnO1xuaW1wb3J0IHsgU2VuZEFjY2Vzc1JlcXVlc3QgfSBmcm9tICcuLi9tb2RlbHMvcmVxdWVzdC9zZW5kQWNjZXNzUmVxdWVzdCc7XG5pbXBvcnQgeyBTZW5kUmVxdWVzdCB9IGZyb20gJy4uL21vZGVscy9yZXF1ZXN0L3NlbmRSZXF1ZXN0JztcbmltcG9ydCB7IFNldFBhc3N3b3JkUmVxdWVzdCB9IGZyb20gJy4uL21vZGVscy9yZXF1ZXN0L3NldFBhc3N3b3JkUmVxdWVzdCc7XG5pbXBvcnQgeyBTdG9yYWdlUmVxdWVzdCB9IGZyb20gJy4uL21vZGVscy9yZXF1ZXN0L3N0b3JhZ2VSZXF1ZXN0JztcbmltcG9ydCB7IFRheEluZm9VcGRhdGVSZXF1ZXN0IH0gZnJvbSAnLi4vbW9kZWxzL3JlcXVlc3QvdGF4SW5mb1VwZGF0ZVJlcXVlc3QnO1xuaW1wb3J0IHsgVG9rZW5SZXF1ZXN0IH0gZnJvbSAnLi4vbW9kZWxzL3JlcXVlc3QvdG9rZW5SZXF1ZXN0JztcbmltcG9ydCB7IFR3b0ZhY3RvckVtYWlsUmVxdWVzdCB9IGZyb20gJy4uL21vZGVscy9yZXF1ZXN0L3R3b0ZhY3RvckVtYWlsUmVxdWVzdCc7XG5pbXBvcnQgeyBUd29GYWN0b3JQcm92aWRlclJlcXVlc3QgfSBmcm9tICcuLi9tb2RlbHMvcmVxdWVzdC90d29GYWN0b3JQcm92aWRlclJlcXVlc3QnO1xuaW1wb3J0IHsgVHdvRmFjdG9yUmVjb3ZlcnlSZXF1ZXN0IH0gZnJvbSAnLi4vbW9kZWxzL3JlcXVlc3QvdHdvRmFjdG9yUmVjb3ZlcnlSZXF1ZXN0JztcbmltcG9ydCB7IFVwZGF0ZURvbWFpbnNSZXF1ZXN0IH0gZnJvbSAnLi4vbW9kZWxzL3JlcXVlc3QvdXBkYXRlRG9tYWluc1JlcXVlc3QnO1xuaW1wb3J0IHsgVXBkYXRlS2V5UmVxdWVzdCB9IGZyb20gJy4uL21vZGVscy9yZXF1ZXN0L3VwZGF0ZUtleVJlcXVlc3QnO1xuaW1wb3J0IHsgVXBkYXRlUHJvZmlsZVJlcXVlc3QgfSBmcm9tICcuLi9tb2RlbHMvcmVxdWVzdC91cGRhdGVQcm9maWxlUmVxdWVzdCc7XG5pbXBvcnQgeyBVcGRhdGVUZW1wUGFzc3dvcmRSZXF1ZXN0IH0gZnJvbSAnLi4vbW9kZWxzL3JlcXVlc3QvdXBkYXRlVGVtcFBhc3N3b3JkUmVxdWVzdCc7XG5pbXBvcnQgeyBVcGRhdGVUd29GYWN0b3JBdXRoZW50aWNhdG9yUmVxdWVzdCB9IGZyb20gJy4uL21vZGVscy9yZXF1ZXN0L3VwZGF0ZVR3b0ZhY3RvckF1dGhlbnRpY2F0b3JSZXF1ZXN0JztcbmltcG9ydCB7IFVwZGF0ZVR3b0ZhY3RvckR1b1JlcXVlc3QgfSBmcm9tICcuLi9tb2RlbHMvcmVxdWVzdC91cGRhdGVUd29GYWN0b3JEdW9SZXF1ZXN0JztcbmltcG9ydCB7IFVwZGF0ZVR3b0ZhY3RvckVtYWlsUmVxdWVzdCB9IGZyb20gJy4uL21vZGVscy9yZXF1ZXN0L3VwZGF0ZVR3b0ZhY3RvckVtYWlsUmVxdWVzdCc7XG5pbXBvcnQgeyBVcGRhdGVUd29GYWN0b3JXZWJBdXRobkRlbGV0ZVJlcXVlc3QgfSBmcm9tICcuLi9tb2RlbHMvcmVxdWVzdC91cGRhdGVUd29GYWN0b3JXZWJBdXRobkRlbGV0ZVJlcXVlc3QnO1xuaW1wb3J0IHsgVXBkYXRlVHdvRmFjdG9yV2ViQXV0aG5SZXF1ZXN0IH0gZnJvbSAnLi4vbW9kZWxzL3JlcXVlc3QvdXBkYXRlVHdvRmFjdG9yV2ViQXV0aG5SZXF1ZXN0JztcbmltcG9ydCB7IFVwZGF0ZVR3b0ZhY3Rvcll1YmlvT3RwUmVxdWVzdCB9IGZyb20gJy4uL21vZGVscy9yZXF1ZXN0L3VwZGF0ZVR3b0ZhY3Rvcll1YmlvT3RwUmVxdWVzdCc7XG5pbXBvcnQgeyBWZXJpZnlCYW5rUmVxdWVzdCB9IGZyb20gJy4uL21vZGVscy9yZXF1ZXN0L3ZlcmlmeUJhbmtSZXF1ZXN0JztcbmltcG9ydCB7IFZlcmlmeURlbGV0ZVJlY292ZXJSZXF1ZXN0IH0gZnJvbSAnLi4vbW9kZWxzL3JlcXVlc3QvdmVyaWZ5RGVsZXRlUmVjb3ZlclJlcXVlc3QnO1xuaW1wb3J0IHsgVmVyaWZ5RW1haWxSZXF1ZXN0IH0gZnJvbSAnLi4vbW9kZWxzL3JlcXVlc3QvdmVyaWZ5RW1haWxSZXF1ZXN0JztcblxuaW1wb3J0IHsgQXBpS2V5UmVzcG9uc2UgfSBmcm9tICcuLi9tb2RlbHMvcmVzcG9uc2UvYXBpS2V5UmVzcG9uc2UnO1xuaW1wb3J0IHsgQXR0YWNobWVudFJlc3BvbnNlIH0gZnJvbSAnLi4vbW9kZWxzL3Jlc3BvbnNlL2F0dGFjaG1lbnRSZXNwb25zZSc7XG5pbXBvcnQgeyBBdHRhY2htZW50VXBsb2FkRGF0YVJlc3BvbnNlIH0gZnJvbSAnLi4vbW9kZWxzL3Jlc3BvbnNlL2F0dGFjaG1lbnRVcGxvYWREYXRhUmVzcG9uc2UnO1xuaW1wb3J0IHsgQmlsbGluZ1Jlc3BvbnNlIH0gZnJvbSAnLi4vbW9kZWxzL3Jlc3BvbnNlL2JpbGxpbmdSZXNwb25zZSc7XG5pbXBvcnQgeyBCcmVhY2hBY2NvdW50UmVzcG9uc2UgfSBmcm9tICcuLi9tb2RlbHMvcmVzcG9uc2UvYnJlYWNoQWNjb3VudFJlc3BvbnNlJztcbmltcG9ydCB7IENpcGhlclJlc3BvbnNlIH0gZnJvbSAnLi4vbW9kZWxzL3Jlc3BvbnNlL2NpcGhlclJlc3BvbnNlJztcbmltcG9ydCB7XG4gICAgQ29sbGVjdGlvbkdyb3VwRGV0YWlsc1Jlc3BvbnNlLFxuICAgIENvbGxlY3Rpb25SZXNwb25zZSxcbn0gZnJvbSAnLi4vbW9kZWxzL3Jlc3BvbnNlL2NvbGxlY3Rpb25SZXNwb25zZSc7XG5pbXBvcnQgeyBDcnlwdG9BZ2VudFVzZXJLZXlSZXNwb25zZSB9IGZyb20gJy4uL21vZGVscy9yZXNwb25zZS9jcnlwdG9BZ2VudFVzZXJLZXlSZXNwb25zZSc7XG5pbXBvcnQgeyBEb21haW5zUmVzcG9uc2UgfSBmcm9tICcuLi9tb2RlbHMvcmVzcG9uc2UvZG9tYWluc1Jlc3BvbnNlJztcbmltcG9ydCB7XG4gICAgRW1lcmdlbmN5QWNjZXNzR3JhbnRlZURldGFpbHNSZXNwb25zZSxcbiAgICBFbWVyZ2VuY3lBY2Nlc3NHcmFudG9yRGV0YWlsc1Jlc3BvbnNlLFxuICAgIEVtZXJnZW5jeUFjY2Vzc1Rha2VvdmVyUmVzcG9uc2UsXG4gICAgRW1lcmdlbmN5QWNjZXNzVmlld1Jlc3BvbnNlXG59IGZyb20gJy4uL21vZGVscy9yZXNwb25zZS9lbWVyZ2VuY3lBY2Nlc3NSZXNwb25zZSc7XG5pbXBvcnQgeyBFdmVudFJlc3BvbnNlIH0gZnJvbSAnLi4vbW9kZWxzL3Jlc3BvbnNlL2V2ZW50UmVzcG9uc2UnO1xuaW1wb3J0IHsgRm9sZGVyUmVzcG9uc2UgfSBmcm9tICcuLi9tb2RlbHMvcmVzcG9uc2UvZm9sZGVyUmVzcG9uc2UnO1xuaW1wb3J0IHtcbiAgICBHcm91cERldGFpbHNSZXNwb25zZSxcbiAgICBHcm91cFJlc3BvbnNlLFxufSBmcm9tICcuLi9tb2RlbHMvcmVzcG9uc2UvZ3JvdXBSZXNwb25zZSc7XG5pbXBvcnQgeyBJZGVudGl0eUNhcHRjaGFSZXNwb25zZSB9IGZyb20gJy4uL21vZGVscy9yZXNwb25zZS9pZGVudGl0eUNhcHRjaGFSZXNwb25zZSc7XG5pbXBvcnQgeyBJZGVudGl0eVRva2VuUmVzcG9uc2UgfSBmcm9tICcuLi9tb2RlbHMvcmVzcG9uc2UvaWRlbnRpdHlUb2tlblJlc3BvbnNlJztcbmltcG9ydCB7IElkZW50aXR5VHdvRmFjdG9yUmVzcG9uc2UgfSBmcm9tICcuLi9tb2RlbHMvcmVzcG9uc2UvaWRlbnRpdHlUd29GYWN0b3JSZXNwb25zZSc7XG5pbXBvcnQgeyBMaXN0UmVzcG9uc2UgfSBmcm9tICcuLi9tb2RlbHMvcmVzcG9uc2UvbGlzdFJlc3BvbnNlJztcbmltcG9ydCB7IE9yZ2FuaXphdGlvblNzb1Jlc3BvbnNlIH0gZnJvbSAnLi4vbW9kZWxzL3Jlc3BvbnNlL29yZ2FuaXphdGlvbi9vcmdhbml6YXRpb25Tc29SZXNwb25zZSc7XG5pbXBvcnQgeyBPcmdhbml6YXRpb25BdXRvRW5yb2xsU3RhdHVzUmVzcG9uc2UgfSBmcm9tICcuLi9tb2RlbHMvcmVzcG9uc2Uvb3JnYW5pemF0aW9uQXV0b0Vucm9sbFN0YXR1c1Jlc3BvbnNlJztcbmltcG9ydCB7IE9yZ2FuaXphdGlvbktleXNSZXNwb25zZSB9IGZyb20gJy4uL21vZGVscy9yZXNwb25zZS9vcmdhbml6YXRpb25LZXlzUmVzcG9uc2UnO1xuaW1wb3J0IHsgT3JnYW5pemF0aW9uUmVzcG9uc2UgfSBmcm9tICcuLi9tb2RlbHMvcmVzcG9uc2Uvb3JnYW5pemF0aW9uUmVzcG9uc2UnO1xuaW1wb3J0IHsgT3JnYW5pemF0aW9uU3Vic2NyaXB0aW9uUmVzcG9uc2UgfSBmcm9tICcuLi9tb2RlbHMvcmVzcG9uc2Uvb3JnYW5pemF0aW9uU3Vic2NyaXB0aW9uUmVzcG9uc2UnO1xuaW1wb3J0IHsgT3JnYW5pemF0aW9uVXNlckJ1bGtQdWJsaWNLZXlSZXNwb25zZSB9IGZyb20gJy4uL21vZGVscy9yZXNwb25zZS9vcmdhbml6YXRpb25Vc2VyQnVsa1B1YmxpY0tleVJlc3BvbnNlJztcbmltcG9ydCB7IE9yZ2FuaXphdGlvblVzZXJCdWxrUmVzcG9uc2UgfSBmcm9tICcuLi9tb2RlbHMvcmVzcG9uc2Uvb3JnYW5pemF0aW9uVXNlckJ1bGtSZXNwb25zZSc7XG5pbXBvcnQge1xuICAgIE9yZ2FuaXphdGlvblVzZXJEZXRhaWxzUmVzcG9uc2UsXG4gICAgT3JnYW5pemF0aW9uVXNlclJlc2V0UGFzc3dvcmREZXRhaWxzUmVwb25zZSxcbiAgICBPcmdhbml6YXRpb25Vc2VyVXNlckRldGFpbHNSZXNwb25zZSxcbn0gZnJvbSAnLi4vbW9kZWxzL3Jlc3BvbnNlL29yZ2FuaXphdGlvblVzZXJSZXNwb25zZSc7XG5pbXBvcnQgeyBQYXltZW50UmVzcG9uc2UgfSBmcm9tICcuLi9tb2RlbHMvcmVzcG9uc2UvcGF5bWVudFJlc3BvbnNlJztcbmltcG9ydCB7IFBsYW5SZXNwb25zZSB9IGZyb20gJy4uL21vZGVscy9yZXNwb25zZS9wbGFuUmVzcG9uc2UnO1xuaW1wb3J0IHsgUG9saWN5UmVzcG9uc2UgfSBmcm9tICcuLi9tb2RlbHMvcmVzcG9uc2UvcG9saWN5UmVzcG9uc2UnO1xuaW1wb3J0IHsgUHJlbG9naW5SZXNwb25zZSB9IGZyb20gJy4uL21vZGVscy9yZXNwb25zZS9wcmVsb2dpblJlc3BvbnNlJztcbmltcG9ydCB7IFByb2ZpbGVSZXNwb25zZSB9IGZyb20gJy4uL21vZGVscy9yZXNwb25zZS9wcm9maWxlUmVzcG9uc2UnO1xuaW1wb3J0IHsgUHJvdmlkZXJPcmdhbml6YXRpb25Pcmdhbml6YXRpb25EZXRhaWxzUmVzcG9uc2UsIFByb3ZpZGVyT3JnYW5pemF0aW9uUmVzcG9uc2UgfSBmcm9tICcuLi9tb2RlbHMvcmVzcG9uc2UvcHJvdmlkZXIvcHJvdmlkZXJPcmdhbml6YXRpb25SZXNwb25zZSc7XG5pbXBvcnQgeyBQcm92aWRlclJlc3BvbnNlIH0gZnJvbSAnLi4vbW9kZWxzL3Jlc3BvbnNlL3Byb3ZpZGVyL3Byb3ZpZGVyUmVzcG9uc2UnO1xuaW1wb3J0IHsgUHJvdmlkZXJVc2VyQnVsa1B1YmxpY0tleVJlc3BvbnNlIH0gZnJvbSAnLi4vbW9kZWxzL3Jlc3BvbnNlL3Byb3ZpZGVyL3Byb3ZpZGVyVXNlckJ1bGtQdWJsaWNLZXlSZXNwb25zZSc7XG5pbXBvcnQgeyBQcm92aWRlclVzZXJCdWxrUmVzcG9uc2UgfSBmcm9tICcuLi9tb2RlbHMvcmVzcG9uc2UvcHJvdmlkZXIvcHJvdmlkZXJVc2VyQnVsa1Jlc3BvbnNlJztcbmltcG9ydCB7IFByb3ZpZGVyVXNlclJlc3BvbnNlLCBQcm92aWRlclVzZXJVc2VyRGV0YWlsc1Jlc3BvbnNlIH0gZnJvbSAnLi4vbW9kZWxzL3Jlc3BvbnNlL3Byb3ZpZGVyL3Byb3ZpZGVyVXNlclJlc3BvbnNlJztcbmltcG9ydCB7IFNlbGVjdGlvblJlYWRPbmx5UmVzcG9uc2UgfSBmcm9tICcuLi9tb2RlbHMvcmVzcG9uc2Uvc2VsZWN0aW9uUmVhZE9ubHlSZXNwb25zZSc7XG5pbXBvcnQgeyBTZW5kQWNjZXNzUmVzcG9uc2UgfSBmcm9tICcuLi9tb2RlbHMvcmVzcG9uc2Uvc2VuZEFjY2Vzc1Jlc3BvbnNlJztcbmltcG9ydCB7IFNlbmRGaWxlRG93bmxvYWREYXRhUmVzcG9uc2UgfSBmcm9tICcuLi9tb2RlbHMvcmVzcG9uc2Uvc2VuZEZpbGVEb3dubG9hZERhdGFSZXNwb25zZSc7XG5pbXBvcnQgeyBTZW5kRmlsZVVwbG9hZERhdGFSZXNwb25zZSB9IGZyb20gJy4uL21vZGVscy9yZXNwb25zZS9zZW5kRmlsZVVwbG9hZERhdGFSZXNwb25zZSc7XG5pbXBvcnQgeyBTZW5kUmVzcG9uc2UgfSBmcm9tICcuLi9tb2RlbHMvcmVzcG9uc2Uvc2VuZFJlc3BvbnNlJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvblJlc3BvbnNlIH0gZnJvbSAnLi4vbW9kZWxzL3Jlc3BvbnNlL3N1YnNjcmlwdGlvblJlc3BvbnNlJztcbmltcG9ydCB7IFN5bmNSZXNwb25zZSB9IGZyb20gJy4uL21vZGVscy9yZXNwb25zZS9zeW5jUmVzcG9uc2UnO1xuaW1wb3J0IHsgVGF4SW5mb1Jlc3BvbnNlIH0gZnJvbSAnLi4vbW9kZWxzL3Jlc3BvbnNlL3RheEluZm9SZXNwb25zZSc7XG5pbXBvcnQgeyBUYXhSYXRlUmVzcG9uc2UgfSBmcm9tICcuLi9tb2RlbHMvcmVzcG9uc2UvdGF4UmF0ZVJlc3BvbnNlJztcbmltcG9ydCB7IFR3b0ZhY3RvckF1dGhlbnRpY2F0b3JSZXNwb25zZSB9IGZyb20gJy4uL21vZGVscy9yZXNwb25zZS90d29GYWN0b3JBdXRoZW50aWNhdG9yUmVzcG9uc2UnO1xuaW1wb3J0IHsgVHdvRmFjdG9yRHVvUmVzcG9uc2UgfSBmcm9tICcuLi9tb2RlbHMvcmVzcG9uc2UvdHdvRmFjdG9yRHVvUmVzcG9uc2UnO1xuaW1wb3J0IHsgVHdvRmFjdG9yRW1haWxSZXNwb25zZSB9IGZyb20gJy4uL21vZGVscy9yZXNwb25zZS90d29GYWN0b3JFbWFpbFJlc3BvbnNlJztcbmltcG9ydCB7IFR3b0ZhY3RvclByb3ZpZGVyUmVzcG9uc2UgfSBmcm9tICcuLi9tb2RlbHMvcmVzcG9uc2UvdHdvRmFjdG9yUHJvdmlkZXJSZXNwb25zZSc7XG5pbXBvcnQgeyBUd29GYWN0b3JSZWNvdmVyUmVzcG9uc2UgfSBmcm9tICcuLi9tb2RlbHMvcmVzcG9uc2UvdHdvRmFjdG9yUmVzY292ZXJSZXNwb25zZSc7XG5pbXBvcnQgeyBDaGFsbGVuZ2VSZXNwb25zZSwgVHdvRmFjdG9yV2ViQXV0aG5SZXNwb25zZSB9IGZyb20gJy4uL21vZGVscy9yZXNwb25zZS90d29GYWN0b3JXZWJBdXRoblJlc3BvbnNlJztcbmltcG9ydCB7IFR3b0ZhY3Rvcll1YmlLZXlSZXNwb25zZSB9IGZyb20gJy4uL21vZGVscy9yZXNwb25zZS90d29GYWN0b3JZdWJpS2V5UmVzcG9uc2UnO1xuaW1wb3J0IHsgVXNlcktleVJlc3BvbnNlIH0gZnJvbSAnLi4vbW9kZWxzL3Jlc3BvbnNlL3VzZXJLZXlSZXNwb25zZSc7XG5cbmltcG9ydCB7IFNlbmRBY2Nlc3NWaWV3IH0gZnJvbSAnLi4vbW9kZWxzL3ZpZXcvc2VuZEFjY2Vzc1ZpZXcnO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQXBpU2VydmljZSB7XG4gICAgcG9zdElkZW50aXR5VG9rZW46IChyZXF1ZXN0OiBUb2tlblJlcXVlc3QpID0+IFByb21pc2U8SWRlbnRpdHlUb2tlblJlc3BvbnNlIHwgSWRlbnRpdHlUd29GYWN0b3JSZXNwb25zZSB8IElkZW50aXR5Q2FwdGNoYVJlc3BvbnNlPjtcbiAgICByZWZyZXNoSWRlbnRpdHlUb2tlbjogKCkgPT4gUHJvbWlzZTxhbnk+O1xuXG4gICAgZ2V0UHJvZmlsZTogKCkgPT4gUHJvbWlzZTxQcm9maWxlUmVzcG9uc2U+O1xuICAgIGdldFVzZXJCaWxsaW5nOiAoKSA9PiBQcm9taXNlPEJpbGxpbmdSZXNwb25zZT47XG4gICAgZ2V0VXNlclN1YnNjcmlwdGlvbjogKCkgPT4gUHJvbWlzZTxTdWJzY3JpcHRpb25SZXNwb25zZT47XG4gICAgZ2V0VGF4SW5mbzogKCkgPT4gUHJvbWlzZTxUYXhJbmZvUmVzcG9uc2U+O1xuICAgIHB1dFByb2ZpbGU6IChyZXF1ZXN0OiBVcGRhdGVQcm9maWxlUmVxdWVzdCkgPT4gUHJvbWlzZTxQcm9maWxlUmVzcG9uc2U+O1xuICAgIHB1dFRheEluZm86IChyZXF1ZXN0OiBUYXhJbmZvVXBkYXRlUmVxdWVzdCkgPT4gUHJvbWlzZTxhbnk+O1xuICAgIHBvc3RQcmVsb2dpbjogKHJlcXVlc3Q6IFByZWxvZ2luUmVxdWVzdCkgPT4gUHJvbWlzZTxQcmVsb2dpblJlc3BvbnNlPjtcbiAgICBwb3N0RW1haWxUb2tlbjogKHJlcXVlc3Q6IEVtYWlsVG9rZW5SZXF1ZXN0KSA9PiBQcm9taXNlPGFueT47XG4gICAgcG9zdEVtYWlsOiAocmVxdWVzdDogRW1haWxSZXF1ZXN0KSA9PiBQcm9taXNlPGFueT47XG4gICAgcG9zdFBhc3N3b3JkOiAocmVxdWVzdDogUGFzc3dvcmRSZXF1ZXN0KSA9PiBQcm9taXNlPGFueT47XG4gICAgc2V0UGFzc3dvcmQ6IChyZXF1ZXN0OiBTZXRQYXNzd29yZFJlcXVlc3QpID0+IFByb21pc2U8YW55PjtcbiAgICBwb3N0U2V0Q3J5cHRvQWdlbnRLZXk6IChyZXF1ZXN0OiBTZXRDcnlwdG9BZ2VudEtleVJlcXVlc3QpID0+IFByb21pc2U8YW55PjtcbiAgICBwb3N0U2VjdXJpdHlTdGFtcDogKHJlcXVlc3Q6IFBhc3N3b3JkVmVyaWZpY2F0aW9uUmVxdWVzdCkgPT4gUHJvbWlzZTxhbnk+O1xuICAgIGRlbGV0ZUFjY291bnQ6IChyZXF1ZXN0OiBQYXNzd29yZFZlcmlmaWNhdGlvblJlcXVlc3QpID0+IFByb21pc2U8YW55PjtcbiAgICBnZXRBY2NvdW50UmV2aXNpb25EYXRlOiAoKSA9PiBQcm9taXNlPG51bWJlcj47XG4gICAgcG9zdFBhc3N3b3JkSGludDogKHJlcXVlc3Q6IFBhc3N3b3JkSGludFJlcXVlc3QpID0+IFByb21pc2U8YW55PjtcbiAgICBwb3N0UmVnaXN0ZXI6IChyZXF1ZXN0OiBSZWdpc3RlclJlcXVlc3QpID0+IFByb21pc2U8YW55PjtcbiAgICBwb3N0UHJlbWl1bTogKGRhdGE6IEZvcm1EYXRhKSA9PiBQcm9taXNlPFBheW1lbnRSZXNwb25zZT47XG4gICAgcG9zdElhcENoZWNrOiAocmVxdWVzdDogSWFwQ2hlY2tSZXF1ZXN0KSA9PiBQcm9taXNlPGFueT47XG4gICAgcG9zdFJlaW5zdGF0ZVByZW1pdW06ICgpID0+IFByb21pc2U8YW55PjtcbiAgICBwb3N0Q2FuY2VsUHJlbWl1bTogKCkgPT4gUHJvbWlzZTxhbnk+O1xuICAgIHBvc3RBY2NvdW50U3RvcmFnZTogKHJlcXVlc3Q6IFN0b3JhZ2VSZXF1ZXN0KSA9PiBQcm9taXNlPFBheW1lbnRSZXNwb25zZT47XG4gICAgcG9zdEFjY291bnRQYXltZW50OiAocmVxdWVzdDogUGF5bWVudFJlcXVlc3QpID0+IFByb21pc2U8YW55PjtcbiAgICBwb3N0QWNjb3VudExpY2Vuc2U6IChkYXRhOiBGb3JtRGF0YSkgPT4gUHJvbWlzZTxhbnk+O1xuICAgIHBvc3RBY2NvdW50S2V5OiAocmVxdWVzdDogVXBkYXRlS2V5UmVxdWVzdCkgPT4gUHJvbWlzZTxhbnk+O1xuICAgIHBvc3RBY2NvdW50S2V5czogKHJlcXVlc3Q6IEtleXNSZXF1ZXN0KSA9PiBQcm9taXNlPGFueT47XG4gICAgcG9zdEFjY291bnRWZXJpZnlFbWFpbDogKCkgPT4gUHJvbWlzZTxhbnk+O1xuICAgIHBvc3RBY2NvdW50VmVyaWZ5RW1haWxUb2tlbjogKHJlcXVlc3Q6IFZlcmlmeUVtYWlsUmVxdWVzdCkgPT4gUHJvbWlzZTxhbnk+O1xuICAgIHBvc3RBY2NvdW50VmVyaWZ5UGFzc3dvcmQ6IChyZXF1ZXN0OiBQYXNzd29yZFZlcmlmaWNhdGlvblJlcXVlc3QpID0+IFByb21pc2U8YW55PjtcbiAgICBwb3N0QWNjb3VudFJlY292ZXJEZWxldGU6IChyZXF1ZXN0OiBEZWxldGVSZWNvdmVyUmVxdWVzdCkgPT4gUHJvbWlzZTxhbnk+O1xuICAgIHBvc3RBY2NvdW50UmVjb3ZlckRlbGV0ZVRva2VuOiAocmVxdWVzdDogVmVyaWZ5RGVsZXRlUmVjb3ZlclJlcXVlc3QpID0+IFByb21pc2U8YW55PjtcbiAgICBwb3N0QWNjb3VudEtkZjogKHJlcXVlc3Q6IEtkZlJlcXVlc3QpID0+IFByb21pc2U8YW55PjtcbiAgICBwb3N0VXNlckFwaUtleTogKGlkOiBzdHJpbmcsIHJlcXVlc3Q6IFBhc3N3b3JkVmVyaWZpY2F0aW9uUmVxdWVzdCkgPT4gUHJvbWlzZTxBcGlLZXlSZXNwb25zZT47XG4gICAgcG9zdFVzZXJSb3RhdGVBcGlLZXk6IChpZDogc3RyaW5nLCByZXF1ZXN0OiBQYXNzd29yZFZlcmlmaWNhdGlvblJlcXVlc3QpID0+IFByb21pc2U8QXBpS2V5UmVzcG9uc2U+O1xuICAgIHB1dFVwZGF0ZVRlbXBQYXNzd29yZDogKHJlcXVlc3Q6IFVwZGF0ZVRlbXBQYXNzd29yZFJlcXVlc3QpID0+IFByb21pc2U8YW55PjtcblxuICAgIGdldEZvbGRlcjogKGlkOiBzdHJpbmcpID0+IFByb21pc2U8Rm9sZGVyUmVzcG9uc2U+O1xuICAgIHBvc3RGb2xkZXI6IChyZXF1ZXN0OiBGb2xkZXJSZXF1ZXN0KSA9PiBQcm9taXNlPEZvbGRlclJlc3BvbnNlPjtcbiAgICBwdXRGb2xkZXI6IChpZDogc3RyaW5nLCByZXF1ZXN0OiBGb2xkZXJSZXF1ZXN0KSA9PiBQcm9taXNlPEZvbGRlclJlc3BvbnNlPjtcbiAgICBkZWxldGVGb2xkZXI6IChpZDogc3RyaW5nKSA9PiBQcm9taXNlPGFueT47XG5cbiAgICBnZXRTZW5kOiAoaWQ6IHN0cmluZykgPT4gUHJvbWlzZTxTZW5kUmVzcG9uc2U+O1xuICAgIHBvc3RTZW5kQWNjZXNzOiAoaWQ6IHN0cmluZywgcmVxdWVzdDogU2VuZEFjY2Vzc1JlcXVlc3QsIGFwaVVybD86IHN0cmluZykgPT4gUHJvbWlzZTxTZW5kQWNjZXNzUmVzcG9uc2U+O1xuICAgIGdldFNlbmRzOiAoKSA9PiBQcm9taXNlPExpc3RSZXNwb25zZTxTZW5kUmVzcG9uc2U+PjtcbiAgICBwb3N0U2VuZDogKHJlcXVlc3Q6IFNlbmRSZXF1ZXN0KSA9PiBQcm9taXNlPFNlbmRSZXNwb25zZT47XG4gICAgcG9zdEZpbGVUeXBlU2VuZDogKHJlcXVlc3Q6IFNlbmRSZXF1ZXN0KSA9PiBQcm9taXNlPFNlbmRGaWxlVXBsb2FkRGF0YVJlc3BvbnNlPjtcbiAgICBwb3N0U2VuZEZpbGU6IChzZW5kSWQ6IHN0cmluZywgZmlsZUlkOiBzdHJpbmcsIGRhdGE6IEZvcm1EYXRhKSA9PiBQcm9taXNlPGFueT47XG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgTWFyIDI1IDIwMjE6IFRoaXMgbWV0aG9kIGhhcyBiZWVuIGRlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgZGlyZWN0IHVwbG9hZHMuXG4gICAgICogVGhpcyBtZXRob2Qgc3RpbGwgZXhpc3RzIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggb2xkIHNlcnZlciB2ZXJzaW9ucy5cbiAgICAgKi9cbiAgICBwb3N0U2VuZEZpbGVMZWdhY3k6IChkYXRhOiBGb3JtRGF0YSkgPT4gUHJvbWlzZTxTZW5kUmVzcG9uc2U+O1xuICAgIHB1dFNlbmQ6IChpZDogc3RyaW5nLCByZXF1ZXN0OiBTZW5kUmVxdWVzdCkgPT4gUHJvbWlzZTxTZW5kUmVzcG9uc2U+O1xuICAgIHB1dFNlbmRSZW1vdmVQYXNzd29yZDogKGlkOiBzdHJpbmcpID0+IFByb21pc2U8U2VuZFJlc3BvbnNlPjtcbiAgICBkZWxldGVTZW5kOiAoaWQ6IHN0cmluZykgPT4gUHJvbWlzZTxhbnk+O1xuICAgIGdldFNlbmRGaWxlRG93bmxvYWREYXRhOiAoc2VuZDogU2VuZEFjY2Vzc1ZpZXcsIHJlcXVlc3Q6IFNlbmRBY2Nlc3NSZXF1ZXN0LCBhcGlVcmw/OiBzdHJpbmcpID0+IFByb21pc2U8U2VuZEZpbGVEb3dubG9hZERhdGFSZXNwb25zZT47XG4gICAgcmVuZXdTZW5kRmlsZVVwbG9hZFVybDogKHNlbmRJZDogc3RyaW5nLCBmaWxlSWQ6IHN0cmluZykgPT4gUHJvbWlzZTxTZW5kRmlsZVVwbG9hZERhdGFSZXNwb25zZT47XG5cbiAgICBnZXRDaXBoZXI6IChpZDogc3RyaW5nKSA9PiBQcm9taXNlPENpcGhlclJlc3BvbnNlPjtcbiAgICBnZXRDaXBoZXJBZG1pbjogKGlkOiBzdHJpbmcpID0+IFByb21pc2U8Q2lwaGVyUmVzcG9uc2U+O1xuICAgIGdldEF0dGFjaG1lbnREYXRhOiAoY2lwaGVySWQ6IHN0cmluZywgYXR0YWNobWVudElkOiBzdHJpbmcsIGVtZXJnZW5jeUFjY2Vzc0lkPzogc3RyaW5nKSA9PiBQcm9taXNlPEF0dGFjaG1lbnRSZXNwb25zZT47XG4gICAgZ2V0Q2lwaGVyc09yZ2FuaXphdGlvbjogKG9yZ2FuaXphdGlvbklkOiBzdHJpbmcpID0+IFByb21pc2U8TGlzdFJlc3BvbnNlPENpcGhlclJlc3BvbnNlPj47XG4gICAgcG9zdENpcGhlcjogKHJlcXVlc3Q6IENpcGhlclJlcXVlc3QpID0+IFByb21pc2U8Q2lwaGVyUmVzcG9uc2U+O1xuICAgIHBvc3RDaXBoZXJDcmVhdGU6IChyZXF1ZXN0OiBDaXBoZXJDcmVhdGVSZXF1ZXN0KSA9PiBQcm9taXNlPENpcGhlclJlc3BvbnNlPjtcbiAgICBwb3N0Q2lwaGVyQWRtaW46IChyZXF1ZXN0OiBDaXBoZXJDcmVhdGVSZXF1ZXN0KSA9PiBQcm9taXNlPENpcGhlclJlc3BvbnNlPjtcbiAgICBwdXRDaXBoZXI6IChpZDogc3RyaW5nLCByZXF1ZXN0OiBDaXBoZXJSZXF1ZXN0KSA9PiBQcm9taXNlPENpcGhlclJlc3BvbnNlPjtcbiAgICBwdXRDaXBoZXJBZG1pbjogKGlkOiBzdHJpbmcsIHJlcXVlc3Q6IENpcGhlclJlcXVlc3QpID0+IFByb21pc2U8Q2lwaGVyUmVzcG9uc2U+O1xuICAgIGRlbGV0ZUNpcGhlcjogKGlkOiBzdHJpbmcpID0+IFByb21pc2U8YW55PjtcbiAgICBkZWxldGVDaXBoZXJBZG1pbjogKGlkOiBzdHJpbmcpID0+IFByb21pc2U8YW55PjtcbiAgICBkZWxldGVNYW55Q2lwaGVyczogKHJlcXVlc3Q6IENpcGhlckJ1bGtEZWxldGVSZXF1ZXN0KSA9PiBQcm9taXNlPGFueT47XG4gICAgZGVsZXRlTWFueUNpcGhlcnNBZG1pbjogKHJlcXVlc3Q6IENpcGhlckJ1bGtEZWxldGVSZXF1ZXN0KSA9PiBQcm9taXNlPGFueT47XG4gICAgcHV0TW92ZUNpcGhlcnM6IChyZXF1ZXN0OiBDaXBoZXJCdWxrTW92ZVJlcXVlc3QpID0+IFByb21pc2U8YW55PjtcbiAgICBwdXRTaGFyZUNpcGhlcjogKGlkOiBzdHJpbmcsIHJlcXVlc3Q6IENpcGhlclNoYXJlUmVxdWVzdCkgPT4gUHJvbWlzZTxDaXBoZXJSZXNwb25zZT47XG4gICAgcHV0U2hhcmVDaXBoZXJzOiAocmVxdWVzdDogQ2lwaGVyQnVsa1NoYXJlUmVxdWVzdCkgPT4gUHJvbWlzZTxhbnk+O1xuICAgIHB1dENpcGhlckNvbGxlY3Rpb25zOiAoaWQ6IHN0cmluZywgcmVxdWVzdDogQ2lwaGVyQ29sbGVjdGlvbnNSZXF1ZXN0KSA9PiBQcm9taXNlPGFueT47XG4gICAgcHV0Q2lwaGVyQ29sbGVjdGlvbnNBZG1pbjogKGlkOiBzdHJpbmcsIHJlcXVlc3Q6IENpcGhlckNvbGxlY3Rpb25zUmVxdWVzdCkgPT4gUHJvbWlzZTxhbnk+O1xuICAgIHBvc3RQdXJnZUNpcGhlcnM6IChyZXF1ZXN0OiBQYXNzd29yZFZlcmlmaWNhdGlvblJlcXVlc3QsIG9yZ2FuaXphdGlvbklkPzogc3RyaW5nKSA9PiBQcm9taXNlPGFueT47XG4gICAgcG9zdEltcG9ydENpcGhlcnM6IChyZXF1ZXN0OiBJbXBvcnRDaXBoZXJzUmVxdWVzdCkgPT4gUHJvbWlzZTxhbnk+O1xuICAgIHBvc3RJbXBvcnRPcmdhbml6YXRpb25DaXBoZXJzOiAob3JnYW5pemF0aW9uSWQ6IHN0cmluZywgcmVxdWVzdDogSW1wb3J0T3JnYW5pemF0aW9uQ2lwaGVyc1JlcXVlc3QpID0+IFByb21pc2U8YW55PjtcbiAgICBwdXREZWxldGVDaXBoZXI6IChpZDogc3RyaW5nKSA9PiBQcm9taXNlPGFueT47XG4gICAgcHV0RGVsZXRlQ2lwaGVyQWRtaW46IChpZDogc3RyaW5nKSA9PiBQcm9taXNlPGFueT47XG4gICAgcHV0RGVsZXRlTWFueUNpcGhlcnM6IChyZXF1ZXN0OiBDaXBoZXJCdWxrRGVsZXRlUmVxdWVzdCkgPT4gUHJvbWlzZTxhbnk+O1xuICAgIHB1dERlbGV0ZU1hbnlDaXBoZXJzQWRtaW46IChyZXF1ZXN0OiBDaXBoZXJCdWxrRGVsZXRlUmVxdWVzdCkgPT4gUHJvbWlzZTxhbnk+O1xuICAgIHB1dFJlc3RvcmVDaXBoZXI6IChpZDogc3RyaW5nKSA9PiBQcm9taXNlPENpcGhlclJlc3BvbnNlPjtcbiAgICBwdXRSZXN0b3JlQ2lwaGVyQWRtaW46IChpZDogc3RyaW5nKSA9PiBQcm9taXNlPENpcGhlclJlc3BvbnNlPjtcbiAgICBwdXRSZXN0b3JlTWFueUNpcGhlcnM6IChyZXF1ZXN0OiBDaXBoZXJCdWxrUmVzdG9yZVJlcXVlc3QpID0+IFByb21pc2U8TGlzdFJlc3BvbnNlPENpcGhlclJlc3BvbnNlPj47XG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBNYXIgMjUgMjAyMTogVGhpcyBtZXRob2QgaGFzIGJlZW4gZGVwcmVjYXRlZCBpbiBmYXZvciBvZiBkaXJlY3QgdXBsb2Fkcy5cbiAgICAgKiBUaGlzIG1ldGhvZCBzdGlsbCBleGlzdHMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCBvbGQgc2VydmVyIHZlcnNpb25zLlxuICAgICAqL1xuICAgIHBvc3RDaXBoZXJBdHRhY2htZW50TGVnYWN5OiAoaWQ6IHN0cmluZywgZGF0YTogRm9ybURhdGEpID0+IFByb21pc2U8Q2lwaGVyUmVzcG9uc2U+O1xuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIE1hciAyNSAyMDIxOiBUaGlzIG1ldGhvZCBoYXMgYmVlbiBkZXByZWNhdGVkIGluIGZhdm9yIG9mIGRpcmVjdCB1cGxvYWRzLlxuICAgICAqIFRoaXMgbWV0aG9kIHN0aWxsIGV4aXN0cyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIG9sZCBzZXJ2ZXIgdmVyc2lvbnMuXG4gICAgICovXG4gICAgcG9zdENpcGhlckF0dGFjaG1lbnRBZG1pbkxlZ2FjeTogKGlkOiBzdHJpbmcsIGRhdGE6IEZvcm1EYXRhKSA9PiBQcm9taXNlPENpcGhlclJlc3BvbnNlPjtcbiAgICBwb3N0Q2lwaGVyQXR0YWNobWVudDogKGlkOiBzdHJpbmcsIHJlcXVlc3Q6IEF0dGFjaG1lbnRSZXF1ZXN0KSA9PiBQcm9taXNlPEF0dGFjaG1lbnRVcGxvYWREYXRhUmVzcG9uc2U+O1xuICAgIGRlbGV0ZUNpcGhlckF0dGFjaG1lbnQ6IChpZDogc3RyaW5nLCBhdHRhY2htZW50SWQ6IHN0cmluZykgPT4gUHJvbWlzZTxhbnk+O1xuICAgIGRlbGV0ZUNpcGhlckF0dGFjaG1lbnRBZG1pbjogKGlkOiBzdHJpbmcsIGF0dGFjaG1lbnRJZDogc3RyaW5nKSA9PiBQcm9taXNlPGFueT47XG4gICAgcG9zdFNoYXJlQ2lwaGVyQXR0YWNobWVudDogKGlkOiBzdHJpbmcsIGF0dGFjaG1lbnRJZDogc3RyaW5nLCBkYXRhOiBGb3JtRGF0YSxcbiAgICAgICAgb3JnYW5pemF0aW9uSWQ6IHN0cmluZykgPT4gUHJvbWlzZTxhbnk+O1xuICAgIHJlbmV3QXR0YWNobWVudFVwbG9hZFVybDogKGlkOiBzdHJpbmcsIGF0dGFjaG1lbnRJZDogc3RyaW5nKSA9PiBQcm9taXNlPEF0dGFjaG1lbnRVcGxvYWREYXRhUmVzcG9uc2U+O1xuICAgIHBvc3RBdHRhY2htZW50RmlsZTogKGlkOiBzdHJpbmcsIGF0dGFjaG1lbnRJZDogc3RyaW5nLCBkYXRhOiBGb3JtRGF0YSkgPT4gUHJvbWlzZTxhbnk+O1xuXG4gICAgZ2V0Q29sbGVjdGlvbkRldGFpbHM6IChvcmdhbml6YXRpb25JZDogc3RyaW5nLCBpZDogc3RyaW5nKSA9PiBQcm9taXNlPENvbGxlY3Rpb25Hcm91cERldGFpbHNSZXNwb25zZT47XG4gICAgZ2V0VXNlckNvbGxlY3Rpb25zOiAoKSA9PiBQcm9taXNlPExpc3RSZXNwb25zZTxDb2xsZWN0aW9uUmVzcG9uc2U+PjtcbiAgICBnZXRDb2xsZWN0aW9uczogKG9yZ2FuaXphdGlvbklkOiBzdHJpbmcpID0+IFByb21pc2U8TGlzdFJlc3BvbnNlPENvbGxlY3Rpb25SZXNwb25zZT4+O1xuICAgIGdldENvbGxlY3Rpb25Vc2VyczogKG9yZ2FuaXphdGlvbklkOiBzdHJpbmcsIGlkOiBzdHJpbmcpID0+IFByb21pc2U8U2VsZWN0aW9uUmVhZE9ubHlSZXNwb25zZVtdPjtcbiAgICBwb3N0Q29sbGVjdGlvbjogKG9yZ2FuaXphdGlvbklkOiBzdHJpbmcsIHJlcXVlc3Q6IENvbGxlY3Rpb25SZXF1ZXN0KSA9PiBQcm9taXNlPENvbGxlY3Rpb25SZXNwb25zZT47XG4gICAgcHV0Q29sbGVjdGlvblVzZXJzOiAob3JnYW5pemF0aW9uSWQ6IHN0cmluZywgaWQ6IHN0cmluZywgcmVxdWVzdDogU2VsZWN0aW9uUmVhZE9ubHlSZXF1ZXN0W10pID0+IFByb21pc2U8YW55PjtcbiAgICBwdXRDb2xsZWN0aW9uOiAob3JnYW5pemF0aW9uSWQ6IHN0cmluZywgaWQ6IHN0cmluZywgcmVxdWVzdDogQ29sbGVjdGlvblJlcXVlc3QpID0+IFByb21pc2U8Q29sbGVjdGlvblJlc3BvbnNlPjtcbiAgICBkZWxldGVDb2xsZWN0aW9uOiAob3JnYW5pemF0aW9uSWQ6IHN0cmluZywgaWQ6IHN0cmluZykgPT4gUHJvbWlzZTxhbnk+O1xuICAgIGRlbGV0ZUNvbGxlY3Rpb25Vc2VyOiAob3JnYW5pemF0aW9uSWQ6IHN0cmluZywgaWQ6IHN0cmluZywgb3JnYW5pemF0aW9uVXNlcklkOiBzdHJpbmcpID0+IFByb21pc2U8YW55PjtcblxuICAgIGdldEdyb3VwRGV0YWlsczogKG9yZ2FuaXphdGlvbklkOiBzdHJpbmcsIGlkOiBzdHJpbmcpID0+IFByb21pc2U8R3JvdXBEZXRhaWxzUmVzcG9uc2U+O1xuICAgIGdldEdyb3VwczogKG9yZ2FuaXphdGlvbklkOiBzdHJpbmcpID0+IFByb21pc2U8TGlzdFJlc3BvbnNlPEdyb3VwUmVzcG9uc2U+PjtcbiAgICBnZXRHcm91cFVzZXJzOiAob3JnYW5pemF0aW9uSWQ6IHN0cmluZywgaWQ6IHN0cmluZykgPT4gUHJvbWlzZTxzdHJpbmdbXT47XG4gICAgcG9zdEdyb3VwOiAob3JnYW5pemF0aW9uSWQ6IHN0cmluZywgcmVxdWVzdDogR3JvdXBSZXF1ZXN0KSA9PiBQcm9taXNlPEdyb3VwUmVzcG9uc2U+O1xuICAgIHB1dEdyb3VwOiAob3JnYW5pemF0aW9uSWQ6IHN0cmluZywgaWQ6IHN0cmluZywgcmVxdWVzdDogR3JvdXBSZXF1ZXN0KSA9PiBQcm9taXNlPEdyb3VwUmVzcG9uc2U+O1xuICAgIHB1dEdyb3VwVXNlcnM6IChvcmdhbml6YXRpb25JZDogc3RyaW5nLCBpZDogc3RyaW5nLCByZXF1ZXN0OiBzdHJpbmdbXSkgPT4gUHJvbWlzZTxhbnk+O1xuICAgIGRlbGV0ZUdyb3VwOiAob3JnYW5pemF0aW9uSWQ6IHN0cmluZywgaWQ6IHN0cmluZykgPT4gUHJvbWlzZTxhbnk+O1xuICAgIGRlbGV0ZUdyb3VwVXNlcjogKG9yZ2FuaXphdGlvbklkOiBzdHJpbmcsIGlkOiBzdHJpbmcsIG9yZ2FuaXphdGlvblVzZXJJZDogc3RyaW5nKSA9PiBQcm9taXNlPGFueT47XG5cbiAgICBnZXRQb2xpY3k6IChvcmdhbml6YXRpb25JZDogc3RyaW5nLCB0eXBlOiBQb2xpY3lUeXBlKSA9PiBQcm9taXNlPFBvbGljeVJlc3BvbnNlPjtcbiAgICBnZXRQb2xpY2llczogKG9yZ2FuaXphdGlvbklkOiBzdHJpbmcpID0+IFByb21pc2U8TGlzdFJlc3BvbnNlPFBvbGljeVJlc3BvbnNlPj47XG4gICAgZ2V0UG9saWNpZXNCeVRva2VuOiAob3JnYW5pemF0aW9uSWQ6IHN0cmluZywgdG9rZW46IHN0cmluZywgZW1haWw6IHN0cmluZywgb3JnYW5pemF0aW9uVXNlcklkOiBzdHJpbmcpID0+XG4gICAgICAgIFByb21pc2U8TGlzdFJlc3BvbnNlPFBvbGljeVJlc3BvbnNlPj47XG4gICAgcHV0UG9saWN5OiAob3JnYW5pemF0aW9uSWQ6IHN0cmluZywgdHlwZTogUG9saWN5VHlwZSwgcmVxdWVzdDogUG9saWN5UmVxdWVzdCkgPT4gUHJvbWlzZTxQb2xpY3lSZXNwb25zZT47XG5cbiAgICBnZXRPcmdhbml6YXRpb25Vc2VyOiAob3JnYW5pemF0aW9uSWQ6IHN0cmluZywgaWQ6IHN0cmluZykgPT4gUHJvbWlzZTxPcmdhbml6YXRpb25Vc2VyRGV0YWlsc1Jlc3BvbnNlPjtcbiAgICBnZXRPcmdhbml6YXRpb25Vc2VyR3JvdXBzOiAob3JnYW5pemF0aW9uSWQ6IHN0cmluZywgaWQ6IHN0cmluZykgPT4gUHJvbWlzZTxzdHJpbmdbXT47XG4gICAgZ2V0T3JnYW5pemF0aW9uVXNlcnM6IChvcmdhbml6YXRpb25JZDogc3RyaW5nKSA9PiBQcm9taXNlPExpc3RSZXNwb25zZTxPcmdhbml6YXRpb25Vc2VyVXNlckRldGFpbHNSZXNwb25zZT4+O1xuICAgIGdldE9yZ2FuaXphdGlvblVzZXJSZXNldFBhc3N3b3JkRGV0YWlsczogKG9yZ2FuaXphdGlvbklkOiBzdHJpbmcsIGlkOiBzdHJpbmcpXG4gICAgICAgID0+IFByb21pc2U8T3JnYW5pemF0aW9uVXNlclJlc2V0UGFzc3dvcmREZXRhaWxzUmVwb25zZT47XG4gICAgcG9zdE9yZ2FuaXphdGlvblVzZXJJbnZpdGU6IChvcmdhbml6YXRpb25JZDogc3RyaW5nLCByZXF1ZXN0OiBPcmdhbml6YXRpb25Vc2VySW52aXRlUmVxdWVzdCkgPT4gUHJvbWlzZTxhbnk+O1xuICAgIHBvc3RPcmdhbml6YXRpb25Vc2VyUmVpbnZpdGU6IChvcmdhbml6YXRpb25JZDogc3RyaW5nLCBpZDogc3RyaW5nKSA9PiBQcm9taXNlPGFueT47XG4gICAgcG9zdE1hbnlPcmdhbml6YXRpb25Vc2VyUmVpbnZpdGU6IChvcmdhbml6YXRpb25JZDogc3RyaW5nLCByZXF1ZXN0OiBPcmdhbml6YXRpb25Vc2VyQnVsa1JlcXVlc3QpID0+IFByb21pc2U8TGlzdFJlc3BvbnNlPE9yZ2FuaXphdGlvblVzZXJCdWxrUmVzcG9uc2U+PjtcbiAgICBwb3N0T3JnYW5pemF0aW9uVXNlckFjY2VwdDogKG9yZ2FuaXphdGlvbklkOiBzdHJpbmcsIGlkOiBzdHJpbmcsXG4gICAgICAgIHJlcXVlc3Q6IE9yZ2FuaXphdGlvblVzZXJBY2NlcHRSZXF1ZXN0KSA9PiBQcm9taXNlPGFueT47XG4gICAgcG9zdE9yZ2FuaXphdGlvblVzZXJDb25maXJtOiAob3JnYW5pemF0aW9uSWQ6IHN0cmluZywgaWQ6IHN0cmluZyxcbiAgICAgICAgcmVxdWVzdDogT3JnYW5pemF0aW9uVXNlckNvbmZpcm1SZXF1ZXN0KSA9PiBQcm9taXNlPGFueT47XG4gICAgcG9zdE9yZ2FuaXphdGlvblVzZXJzUHVibGljS2V5OiAob3JnYW5pemF0aW9uSWQ6IHN0cmluZywgcmVxdWVzdDogT3JnYW5pemF0aW9uVXNlckJ1bGtSZXF1ZXN0KSA9PlxuICAgICAgICBQcm9taXNlPExpc3RSZXNwb25zZTxPcmdhbml6YXRpb25Vc2VyQnVsa1B1YmxpY0tleVJlc3BvbnNlPj47XG4gICAgcG9zdE9yZ2FuaXphdGlvblVzZXJCdWxrQ29uZmlybTogKG9yZ2FuaXphdGlvbklkOiBzdHJpbmcsIHJlcXVlc3Q6IE9yZ2FuaXphdGlvblVzZXJCdWxrQ29uZmlybVJlcXVlc3QpID0+IFByb21pc2U8TGlzdFJlc3BvbnNlPE9yZ2FuaXphdGlvblVzZXJCdWxrUmVzcG9uc2U+PjtcblxuICAgIHB1dE9yZ2FuaXphdGlvblVzZXI6IChvcmdhbml6YXRpb25JZDogc3RyaW5nLCBpZDogc3RyaW5nLCByZXF1ZXN0OiBPcmdhbml6YXRpb25Vc2VyVXBkYXRlUmVxdWVzdCkgPT4gUHJvbWlzZTxhbnk+O1xuICAgIHB1dE9yZ2FuaXphdGlvblVzZXJHcm91cHM6IChvcmdhbml6YXRpb25JZDogc3RyaW5nLCBpZDogc3RyaW5nLFxuICAgICAgICByZXF1ZXN0OiBPcmdhbml6YXRpb25Vc2VyVXBkYXRlR3JvdXBzUmVxdWVzdCkgPT4gUHJvbWlzZTxhbnk+O1xuICAgIHB1dE9yZ2FuaXphdGlvblVzZXJSZXNldFBhc3N3b3JkRW5yb2xsbWVudDogKG9yZ2FuaXphdGlvbklkOiBzdHJpbmcsIHVzZXJJZDogc3RyaW5nLFxuICAgICAgICByZXF1ZXN0OiBPcmdhbml6YXRpb25Vc2VyUmVzZXRQYXNzd29yZEVucm9sbG1lbnRSZXF1ZXN0KSA9PiBQcm9taXNlPGFueT47XG4gICAgcHV0T3JnYW5pemF0aW9uVXNlclJlc2V0UGFzc3dvcmQ6IChvcmdhbml6YXRpb25JZDogc3RyaW5nLCBpZDogc3RyaW5nLFxuICAgICAgICByZXF1ZXN0OiBPcmdhbml6YXRpb25Vc2VyUmVzZXRQYXNzd29yZFJlcXVlc3QpID0+IFByb21pc2U8YW55PjtcbiAgICBkZWxldGVPcmdhbml6YXRpb25Vc2VyOiAob3JnYW5pemF0aW9uSWQ6IHN0cmluZywgaWQ6IHN0cmluZykgPT4gUHJvbWlzZTxhbnk+O1xuICAgIGRlbGV0ZU1hbnlPcmdhbml6YXRpb25Vc2VyczogKG9yZ2FuaXphdGlvbklkOiBzdHJpbmcsIHJlcXVlc3Q6IE9yZ2FuaXphdGlvblVzZXJCdWxrUmVxdWVzdCkgPT4gUHJvbWlzZTxMaXN0UmVzcG9uc2U8T3JnYW5pemF0aW9uVXNlckJ1bGtSZXNwb25zZT4+O1xuXG4gICAgZ2V0U3luYzogKCkgPT4gUHJvbWlzZTxTeW5jUmVzcG9uc2U+O1xuICAgIHBvc3RJbXBvcnREaXJlY3Rvcnk6IChvcmdhbml6YXRpb25JZDogc3RyaW5nLCByZXF1ZXN0OiBJbXBvcnREaXJlY3RvcnlSZXF1ZXN0KSA9PiBQcm9taXNlPGFueT47XG4gICAgcG9zdFB1YmxpY0ltcG9ydERpcmVjdG9yeTogKHJlcXVlc3Q6IE9yZ2FuaXphdGlvbkltcG9ydFJlcXVlc3QpID0+IFByb21pc2U8YW55PjtcblxuICAgIGdldFNldHRpbmdzRG9tYWluczogKCkgPT4gUHJvbWlzZTxEb21haW5zUmVzcG9uc2U+O1xuICAgIHB1dFNldHRpbmdzRG9tYWluczogKHJlcXVlc3Q6IFVwZGF0ZURvbWFpbnNSZXF1ZXN0KSA9PiBQcm9taXNlPERvbWFpbnNSZXNwb25zZT47XG5cbiAgICBnZXRUd29GYWN0b3JQcm92aWRlcnM6ICgpID0+IFByb21pc2U8TGlzdFJlc3BvbnNlPFR3b0ZhY3RvclByb3ZpZGVyUmVzcG9uc2U+PjtcbiAgICBnZXRUd29GYWN0b3JPcmdhbml6YXRpb25Qcm92aWRlcnM6IChvcmdhbml6YXRpb25JZDogc3RyaW5nKSA9PiBQcm9taXNlPExpc3RSZXNwb25zZTxUd29GYWN0b3JQcm92aWRlclJlc3BvbnNlPj47XG4gICAgZ2V0VHdvRmFjdG9yQXV0aGVudGljYXRvcjogKHJlcXVlc3Q6IFBhc3N3b3JkVmVyaWZpY2F0aW9uUmVxdWVzdCkgPT4gUHJvbWlzZTxUd29GYWN0b3JBdXRoZW50aWNhdG9yUmVzcG9uc2U+O1xuICAgIGdldFR3b0ZhY3RvckVtYWlsOiAocmVxdWVzdDogUGFzc3dvcmRWZXJpZmljYXRpb25SZXF1ZXN0KSA9PiBQcm9taXNlPFR3b0ZhY3RvckVtYWlsUmVzcG9uc2U+O1xuICAgIGdldFR3b0ZhY3RvckR1bzogKHJlcXVlc3Q6IFBhc3N3b3JkVmVyaWZpY2F0aW9uUmVxdWVzdCkgPT4gUHJvbWlzZTxUd29GYWN0b3JEdW9SZXNwb25zZT47XG4gICAgZ2V0VHdvRmFjdG9yT3JnYW5pemF0aW9uRHVvOiAob3JnYW5pemF0aW9uSWQ6IHN0cmluZyxcbiAgICAgICAgcmVxdWVzdDogUGFzc3dvcmRWZXJpZmljYXRpb25SZXF1ZXN0KSA9PiBQcm9taXNlPFR3b0ZhY3RvckR1b1Jlc3BvbnNlPjtcbiAgICBnZXRUd29GYWN0b3JZdWJpS2V5OiAocmVxdWVzdDogUGFzc3dvcmRWZXJpZmljYXRpb25SZXF1ZXN0KSA9PiBQcm9taXNlPFR3b0ZhY3Rvcll1YmlLZXlSZXNwb25zZT47XG4gICAgZ2V0VHdvRmFjdG9yV2ViQXV0aG46IChyZXF1ZXN0OiBQYXNzd29yZFZlcmlmaWNhdGlvblJlcXVlc3QpID0+IFByb21pc2U8VHdvRmFjdG9yV2ViQXV0aG5SZXNwb25zZT47XG4gICAgZ2V0VHdvRmFjdG9yV2ViQXV0aG5DaGFsbGVuZ2U6IChyZXF1ZXN0OiBQYXNzd29yZFZlcmlmaWNhdGlvblJlcXVlc3QpID0+IFByb21pc2U8Q2hhbGxlbmdlUmVzcG9uc2U+O1xuICAgIGdldFR3b0ZhY3RvclJlY292ZXI6IChyZXF1ZXN0OiBQYXNzd29yZFZlcmlmaWNhdGlvblJlcXVlc3QpID0+IFByb21pc2U8VHdvRmFjdG9yUmVjb3ZlclJlc3BvbnNlPjtcbiAgICBwdXRUd29GYWN0b3JBdXRoZW50aWNhdG9yOiAoXG4gICAgICAgIHJlcXVlc3Q6IFVwZGF0ZVR3b0ZhY3RvckF1dGhlbnRpY2F0b3JSZXF1ZXN0KSA9PiBQcm9taXNlPFR3b0ZhY3RvckF1dGhlbnRpY2F0b3JSZXNwb25zZT47XG4gICAgcHV0VHdvRmFjdG9yRW1haWw6IChyZXF1ZXN0OiBVcGRhdGVUd29GYWN0b3JFbWFpbFJlcXVlc3QpID0+IFByb21pc2U8VHdvRmFjdG9yRW1haWxSZXNwb25zZT47XG4gICAgcHV0VHdvRmFjdG9yRHVvOiAocmVxdWVzdDogVXBkYXRlVHdvRmFjdG9yRHVvUmVxdWVzdCkgPT4gUHJvbWlzZTxUd29GYWN0b3JEdW9SZXNwb25zZT47XG4gICAgcHV0VHdvRmFjdG9yT3JnYW5pemF0aW9uRHVvOiAob3JnYW5pemF0aW9uSWQ6IHN0cmluZyxcbiAgICAgICAgcmVxdWVzdDogVXBkYXRlVHdvRmFjdG9yRHVvUmVxdWVzdCkgPT4gUHJvbWlzZTxUd29GYWN0b3JEdW9SZXNwb25zZT47XG4gICAgcHV0VHdvRmFjdG9yWXViaUtleTogKHJlcXVlc3Q6IFVwZGF0ZVR3b0ZhY3Rvcll1YmlvT3RwUmVxdWVzdCkgPT4gUHJvbWlzZTxUd29GYWN0b3JZdWJpS2V5UmVzcG9uc2U+O1xuICAgIHB1dFR3b0ZhY3RvcldlYkF1dGhuOiAocmVxdWVzdDogVXBkYXRlVHdvRmFjdG9yV2ViQXV0aG5SZXF1ZXN0KSA9PiBQcm9taXNlPFR3b0ZhY3RvcldlYkF1dGhuUmVzcG9uc2U+O1xuICAgIGRlbGV0ZVR3b0ZhY3RvcldlYkF1dGhuOiAocmVxdWVzdDogVXBkYXRlVHdvRmFjdG9yV2ViQXV0aG5EZWxldGVSZXF1ZXN0KSA9PiBQcm9taXNlPFR3b0ZhY3RvcldlYkF1dGhuUmVzcG9uc2U+O1xuICAgIHB1dFR3b0ZhY3RvckRpc2FibGU6IChyZXF1ZXN0OiBUd29GYWN0b3JQcm92aWRlclJlcXVlc3QpID0+IFByb21pc2U8VHdvRmFjdG9yUHJvdmlkZXJSZXNwb25zZT47XG4gICAgcHV0VHdvRmFjdG9yT3JnYW5pemF0aW9uRGlzYWJsZTogKG9yZ2FuaXphdGlvbklkOiBzdHJpbmcsXG4gICAgICAgIHJlcXVlc3Q6IFR3b0ZhY3RvclByb3ZpZGVyUmVxdWVzdCkgPT4gUHJvbWlzZTxUd29GYWN0b3JQcm92aWRlclJlc3BvbnNlPjtcbiAgICBwb3N0VHdvRmFjdG9yUmVjb3ZlcjogKHJlcXVlc3Q6IFR3b0ZhY3RvclJlY292ZXJ5UmVxdWVzdCkgPT4gUHJvbWlzZTxhbnk+O1xuICAgIHBvc3RUd29GYWN0b3JFbWFpbFNldHVwOiAocmVxdWVzdDogVHdvRmFjdG9yRW1haWxSZXF1ZXN0KSA9PiBQcm9taXNlPGFueT47XG4gICAgcG9zdFR3b0ZhY3RvckVtYWlsOiAocmVxdWVzdDogVHdvRmFjdG9yRW1haWxSZXF1ZXN0KSA9PiBQcm9taXNlPGFueT47XG5cbiAgICBnZXRFbWVyZ2VuY3lBY2Nlc3NUcnVzdGVkOiAoKSA9PiBQcm9taXNlPExpc3RSZXNwb25zZTxFbWVyZ2VuY3lBY2Nlc3NHcmFudGVlRGV0YWlsc1Jlc3BvbnNlPj47XG4gICAgZ2V0RW1lcmdlbmN5QWNjZXNzR3JhbnRlZDogKCkgPT4gUHJvbWlzZTxMaXN0UmVzcG9uc2U8RW1lcmdlbmN5QWNjZXNzR3JhbnRvckRldGFpbHNSZXNwb25zZT4+O1xuICAgIGdldEVtZXJnZW5jeUFjY2VzczogKGlkOiBzdHJpbmcpID0+IFByb21pc2U8RW1lcmdlbmN5QWNjZXNzR3JhbnRlZURldGFpbHNSZXNwb25zZT47XG4gICAgZ2V0RW1lcmdlbmN5R3JhbnRvclBvbGljaWVzOiAoaWQ6IHN0cmluZykgPT4gUHJvbWlzZTxMaXN0UmVzcG9uc2U8UG9saWN5UmVzcG9uc2U+PjtcbiAgICBwdXRFbWVyZ2VuY3lBY2Nlc3M6IChpZDogc3RyaW5nLCByZXF1ZXN0OiBFbWVyZ2VuY3lBY2Nlc3NVcGRhdGVSZXF1ZXN0KSA9PiBQcm9taXNlPGFueT47XG4gICAgZGVsZXRlRW1lcmdlbmN5QWNjZXNzOiAoaWQ6IHN0cmluZykgPT4gUHJvbWlzZTxhbnk+O1xuICAgIHBvc3RFbWVyZ2VuY3lBY2Nlc3NJbnZpdGU6IChyZXF1ZXN0OiBFbWVyZ2VuY3lBY2Nlc3NJbnZpdGVSZXF1ZXN0KSA9PiBQcm9taXNlPGFueT47XG4gICAgcG9zdEVtZXJnZW5jeUFjY2Vzc1JlaW52aXRlOiAoaWQ6IHN0cmluZykgPT4gUHJvbWlzZTxhbnk+O1xuICAgIHBvc3RFbWVyZ2VuY3lBY2Nlc3NBY2NlcHQ6IChpZDogc3RyaW5nLCByZXF1ZXN0OiBFbWVyZ2VuY3lBY2Nlc3NBY2NlcHRSZXF1ZXN0KSA9PiBQcm9taXNlPGFueT47XG4gICAgcG9zdEVtZXJnZW5jeUFjY2Vzc0NvbmZpcm06IChpZDogc3RyaW5nLCByZXF1ZXN0OiBFbWVyZ2VuY3lBY2Nlc3NDb25maXJtUmVxdWVzdCkgPT4gUHJvbWlzZTxhbnk+O1xuICAgIHBvc3RFbWVyZ2VuY3lBY2Nlc3NJbml0aWF0ZTogKGlkOiBzdHJpbmcpID0+IFByb21pc2U8YW55PjtcbiAgICBwb3N0RW1lcmdlbmN5QWNjZXNzQXBwcm92ZTogKGlkOiBzdHJpbmcpID0+IFByb21pc2U8YW55PjtcbiAgICBwb3N0RW1lcmdlbmN5QWNjZXNzUmVqZWN0OiAoaWQ6IHN0cmluZykgPT4gUHJvbWlzZTxhbnk+O1xuICAgIHBvc3RFbWVyZ2VuY3lBY2Nlc3NUYWtlb3ZlcjogKGlkOiBzdHJpbmcpID0+IFByb21pc2U8RW1lcmdlbmN5QWNjZXNzVGFrZW92ZXJSZXNwb25zZT47XG4gICAgcG9zdEVtZXJnZW5jeUFjY2Vzc1Bhc3N3b3JkOiAoaWQ6IHN0cmluZywgcmVxdWVzdDogRW1lcmdlbmN5QWNjZXNzUGFzc3dvcmRSZXF1ZXN0KSA9PiBQcm9taXNlPGFueT47XG4gICAgcG9zdEVtZXJnZW5jeUFjY2Vzc1ZpZXc6IChpZDogc3RyaW5nKSA9PiBQcm9taXNlPEVtZXJnZW5jeUFjY2Vzc1ZpZXdSZXNwb25zZT47XG5cbiAgICBnZXRPcmdhbml6YXRpb246IChpZDogc3RyaW5nKSA9PiBQcm9taXNlPE9yZ2FuaXphdGlvblJlc3BvbnNlPjtcbiAgICBnZXRPcmdhbml6YXRpb25CaWxsaW5nOiAoaWQ6IHN0cmluZykgPT4gUHJvbWlzZTxCaWxsaW5nUmVzcG9uc2U+O1xuICAgIGdldE9yZ2FuaXphdGlvblN1YnNjcmlwdGlvbjogKGlkOiBzdHJpbmcpID0+IFByb21pc2U8T3JnYW5pemF0aW9uU3Vic2NyaXB0aW9uUmVzcG9uc2U+O1xuICAgIGdldE9yZ2FuaXphdGlvbkxpY2Vuc2U6IChpZDogc3RyaW5nLCBpbnN0YWxsYXRpb25JZDogc3RyaW5nKSA9PiBQcm9taXNlPGFueT47XG4gICAgZ2V0T3JnYW5pemF0aW9uVGF4SW5mbzogKGlkOiBzdHJpbmcpID0+IFByb21pc2U8VGF4SW5mb1Jlc3BvbnNlPjtcbiAgICBnZXRPcmdhbml6YXRpb25BdXRvRW5yb2xsU3RhdHVzOiAoaWRlbnRpZmllcjogc3RyaW5nKSA9PiBQcm9taXNlPE9yZ2FuaXphdGlvbkF1dG9FbnJvbGxTdGF0dXNSZXNwb25zZT47XG4gICAgZ2V0T3JnYW5pemF0aW9uU3NvOiAoaWQ6IHN0cmluZykgPT4gUHJvbWlzZTxPcmdhbml6YXRpb25Tc29SZXNwb25zZT47XG4gICAgcG9zdE9yZ2FuaXphdGlvbjogKHJlcXVlc3Q6IE9yZ2FuaXphdGlvbkNyZWF0ZVJlcXVlc3QpID0+IFByb21pc2U8T3JnYW5pemF0aW9uUmVzcG9uc2U+O1xuICAgIHB1dE9yZ2FuaXphdGlvbjogKGlkOiBzdHJpbmcsIHJlcXVlc3Q6IE9yZ2FuaXphdGlvblVwZGF0ZVJlcXVlc3QpID0+IFByb21pc2U8T3JnYW5pemF0aW9uUmVzcG9uc2U+O1xuICAgIHB1dE9yZ2FuaXphdGlvblRheEluZm86IChpZDogc3RyaW5nLCByZXF1ZXN0OiBPcmdhbml6YXRpb25UYXhJbmZvVXBkYXRlUmVxdWVzdCkgPT4gUHJvbWlzZTxhbnk+O1xuICAgIHBvc3RMZWF2ZU9yZ2FuaXphdGlvbjogKGlkOiBzdHJpbmcpID0+IFByb21pc2U8YW55PjtcbiAgICBwb3N0T3JnYW5pemF0aW9uTGljZW5zZTogKGRhdGE6IEZvcm1EYXRhKSA9PiBQcm9taXNlPE9yZ2FuaXphdGlvblJlc3BvbnNlPjtcbiAgICBwb3N0T3JnYW5pemF0aW9uTGljZW5zZVVwZGF0ZTogKGlkOiBzdHJpbmcsIGRhdGE6IEZvcm1EYXRhKSA9PiBQcm9taXNlPGFueT47XG4gICAgcG9zdE9yZ2FuaXphdGlvbkFwaUtleTogKGlkOiBzdHJpbmcsIHJlcXVlc3Q6IFBhc3N3b3JkVmVyaWZpY2F0aW9uUmVxdWVzdCkgPT4gUHJvbWlzZTxBcGlLZXlSZXNwb25zZT47XG4gICAgcG9zdE9yZ2FuaXphdGlvblJvdGF0ZUFwaUtleTogKGlkOiBzdHJpbmcsIHJlcXVlc3Q6IFBhc3N3b3JkVmVyaWZpY2F0aW9uUmVxdWVzdCkgPT4gUHJvbWlzZTxBcGlLZXlSZXNwb25zZT47XG4gICAgcG9zdE9yZ2FuaXphdGlvblNzbzogKGlkOiBzdHJpbmcsIHJlcXVlc3Q6IE9yZ2FuaXphdGlvblNzb1JlcXVlc3QpID0+IFByb21pc2U8T3JnYW5pemF0aW9uU3NvUmVzcG9uc2U+O1xuICAgIHBvc3RPcmdhbml6YXRpb25VcGdyYWRlOiAoaWQ6IHN0cmluZywgcmVxdWVzdDogT3JnYW5pemF0aW9uVXBncmFkZVJlcXVlc3QpID0+IFByb21pc2U8UGF5bWVudFJlc3BvbnNlPjtcbiAgICBwb3N0T3JnYW5pemF0aW9uVXBkYXRlU3Vic2NyaXB0aW9uOiAoaWQ6IHN0cmluZywgcmVxdWVzdDogT3JnYW5pemF0aW9uU3Vic2NyaXB0aW9uVXBkYXRlUmVxdWVzdCkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgICBwb3N0T3JnYW5pemF0aW9uU2VhdDogKGlkOiBzdHJpbmcsIHJlcXVlc3Q6IFNlYXRSZXF1ZXN0KSA9PiBQcm9taXNlPFBheW1lbnRSZXNwb25zZT47XG4gICAgcG9zdE9yZ2FuaXphdGlvblN0b3JhZ2U6IChpZDogc3RyaW5nLCByZXF1ZXN0OiBTdG9yYWdlUmVxdWVzdCkgPT4gUHJvbWlzZTxhbnk+O1xuICAgIHBvc3RPcmdhbml6YXRpb25QYXltZW50OiAoaWQ6IHN0cmluZywgcmVxdWVzdDogUGF5bWVudFJlcXVlc3QpID0+IFByb21pc2U8YW55PjtcbiAgICBwb3N0T3JnYW5pemF0aW9uVmVyaWZ5QmFuazogKGlkOiBzdHJpbmcsIHJlcXVlc3Q6IFZlcmlmeUJhbmtSZXF1ZXN0KSA9PiBQcm9taXNlPGFueT47XG4gICAgcG9zdE9yZ2FuaXphdGlvbkNhbmNlbDogKGlkOiBzdHJpbmcpID0+IFByb21pc2U8YW55PjtcbiAgICBwb3N0T3JnYW5pemF0aW9uUmVpbnN0YXRlOiAoaWQ6IHN0cmluZykgPT4gUHJvbWlzZTxhbnk+O1xuICAgIGRlbGV0ZU9yZ2FuaXphdGlvbjogKGlkOiBzdHJpbmcsIHJlcXVlc3Q6IFBhc3N3b3JkVmVyaWZpY2F0aW9uUmVxdWVzdCkgPT4gUHJvbWlzZTxhbnk+O1xuICAgIGdldFBsYW5zOiAoKSA9PiBQcm9taXNlPExpc3RSZXNwb25zZTxQbGFuUmVzcG9uc2U+PjtcbiAgICBnZXRUYXhSYXRlczogKCkgPT4gUHJvbWlzZTxMaXN0UmVzcG9uc2U8VGF4UmF0ZVJlc3BvbnNlPj47XG4gICAgZ2V0T3JnYW5pemF0aW9uS2V5czogKGlkOiBzdHJpbmcpID0+IFByb21pc2U8T3JnYW5pemF0aW9uS2V5c1Jlc3BvbnNlPjtcbiAgICBwb3N0T3JnYW5pemF0aW9uS2V5czogKGlkOiBzdHJpbmcsIHJlcXVlc3Q6IE9yZ2FuaXphdGlvbktleXNSZXF1ZXN0KSA9PiBQcm9taXNlPE9yZ2FuaXphdGlvbktleXNSZXNwb25zZT47XG5cbiAgICBwb3N0UHJvdmlkZXJTZXR1cDogKGlkOiBzdHJpbmcsIHJlcXVlc3Q6IFByb3ZpZGVyU2V0dXBSZXF1ZXN0KSA9PiBQcm9taXNlPFByb3ZpZGVyUmVzcG9uc2U+O1xuICAgIGdldFByb3ZpZGVyOiAoaWQ6IHN0cmluZykgPT4gUHJvbWlzZTxQcm92aWRlclJlc3BvbnNlPjtcbiAgICBwdXRQcm92aWRlcjogKGlkOiBzdHJpbmcsIHJlcXVlc3Q6IFByb3ZpZGVyVXBkYXRlUmVxdWVzdCkgPT4gUHJvbWlzZTxQcm92aWRlclJlc3BvbnNlPjtcblxuICAgIGdldFByb3ZpZGVyVXNlcnM6IChwcm92aWRlcklkOiBzdHJpbmcpID0+IFByb21pc2U8TGlzdFJlc3BvbnNlPFByb3ZpZGVyVXNlclVzZXJEZXRhaWxzUmVzcG9uc2U+PjtcbiAgICBnZXRQcm92aWRlclVzZXI6IChwcm92aWRlcklkOiBzdHJpbmcsIGlkOiBzdHJpbmcpID0+IFByb21pc2U8UHJvdmlkZXJVc2VyUmVzcG9uc2U+O1xuICAgIHBvc3RQcm92aWRlclVzZXJJbnZpdGU6IChwcm92aWRlcklkOiBzdHJpbmcsIHJlcXVlc3Q6IFByb3ZpZGVyVXNlckludml0ZVJlcXVlc3QpID0+IFByb21pc2U8YW55PjtcbiAgICBwb3N0UHJvdmlkZXJVc2VyUmVpbnZpdGU6IChwcm92aWRlcklkOiBzdHJpbmcsIGlkOiBzdHJpbmcpID0+IFByb21pc2U8YW55PjtcbiAgICBwb3N0TWFueVByb3ZpZGVyVXNlclJlaW52aXRlOiAocHJvdmlkZXJJZDogc3RyaW5nLCByZXF1ZXN0OiBQcm92aWRlclVzZXJCdWxrUmVxdWVzdCkgPT4gUHJvbWlzZTxMaXN0UmVzcG9uc2U8UHJvdmlkZXJVc2VyQnVsa1Jlc3BvbnNlPj47XG4gICAgcG9zdFByb3ZpZGVyVXNlckFjY2VwdDogKHByb3ZpZGVySWQ6IHN0cmluZywgaWQ6IHN0cmluZywgcmVxdWVzdDogUHJvdmlkZXJVc2VyQWNjZXB0UmVxdWVzdCkgPT4gUHJvbWlzZTxhbnk+O1xuICAgIHBvc3RQcm92aWRlclVzZXJDb25maXJtOiAocHJvdmlkZXJJZDogc3RyaW5nLCBpZDogc3RyaW5nLCByZXF1ZXN0OiBQcm92aWRlclVzZXJDb25maXJtUmVxdWVzdCkgPT4gUHJvbWlzZTxhbnk+O1xuICAgIHBvc3RQcm92aWRlclVzZXJzUHVibGljS2V5OiAocHJvdmlkZXJJZDogc3RyaW5nLCByZXF1ZXN0OiBQcm92aWRlclVzZXJCdWxrUmVxdWVzdCkgPT5cbiAgICAgICAgUHJvbWlzZTxMaXN0UmVzcG9uc2U8UHJvdmlkZXJVc2VyQnVsa1B1YmxpY0tleVJlc3BvbnNlPj47XG4gICAgcG9zdFByb3ZpZGVyVXNlckJ1bGtDb25maXJtOiAocHJvdmlkZXJJZDogc3RyaW5nLCByZXF1ZXN0OiBQcm92aWRlclVzZXJCdWxrQ29uZmlybVJlcXVlc3QpID0+IFByb21pc2U8TGlzdFJlc3BvbnNlPFByb3ZpZGVyVXNlckJ1bGtSZXNwb25zZT4+O1xuICAgIHB1dFByb3ZpZGVyVXNlcjogKHByb3ZpZGVySWQ6IHN0cmluZywgaWQ6IHN0cmluZywgcmVxdWVzdDogUHJvdmlkZXJVc2VyVXBkYXRlUmVxdWVzdCkgPT4gUHJvbWlzZTxhbnk+O1xuICAgIGRlbGV0ZVByb3ZpZGVyVXNlcjogKG9yZ2FuaXphdGlvbklkOiBzdHJpbmcsIGlkOiBzdHJpbmcpID0+IFByb21pc2U8YW55PjtcbiAgICBkZWxldGVNYW55UHJvdmlkZXJVc2VyczogKHByb3ZpZGVySWQ6IHN0cmluZywgcmVxdWVzdDogUHJvdmlkZXJVc2VyQnVsa1JlcXVlc3QpID0+IFByb21pc2U8TGlzdFJlc3BvbnNlPFByb3ZpZGVyVXNlckJ1bGtSZXNwb25zZT4+O1xuICAgIGdldFByb3ZpZGVyQ2xpZW50czogKHByb3ZpZGVySWQ6IHN0cmluZykgPT4gUHJvbWlzZTxMaXN0UmVzcG9uc2U8UHJvdmlkZXJPcmdhbml6YXRpb25Pcmdhbml6YXRpb25EZXRhaWxzUmVzcG9uc2U+PjtcbiAgICBwb3N0UHJvdmlkZXJBZGRPcmdhbml6YXRpb246IChwcm92aWRlcklkOiBzdHJpbmcsIHJlcXVlc3Q6IFByb3ZpZGVyQWRkT3JnYW5pemF0aW9uUmVxdWVzdCkgPT4gUHJvbWlzZTxhbnk+O1xuICAgIHBvc3RQcm92aWRlckNyZWF0ZU9yZ2FuaXphdGlvbjogKHByb3ZpZGVySWQ6IHN0cmluZywgcmVxdWVzdDogUHJvdmlkZXJPcmdhbml6YXRpb25DcmVhdGVSZXF1ZXN0KSA9PiBQcm9taXNlPFByb3ZpZGVyT3JnYW5pemF0aW9uUmVzcG9uc2U+O1xuICAgIGRlbGV0ZVByb3ZpZGVyT3JnYW5pemF0aW9uOiAocHJvdmlkZXJJZDogc3RyaW5nLCBvcmdhbml6YXRpb25JZDogc3RyaW5nKSA9PiBQcm9taXNlPGFueT47XG5cbiAgICBnZXRFdmVudHM6IChzdGFydDogc3RyaW5nLCBlbmQ6IHN0cmluZywgdG9rZW46IHN0cmluZykgPT4gUHJvbWlzZTxMaXN0UmVzcG9uc2U8RXZlbnRSZXNwb25zZT4+O1xuICAgIGdldEV2ZW50c0NpcGhlcjogKGlkOiBzdHJpbmcsIHN0YXJ0OiBzdHJpbmcsIGVuZDogc3RyaW5nLCB0b2tlbjogc3RyaW5nKSA9PiBQcm9taXNlPExpc3RSZXNwb25zZTxFdmVudFJlc3BvbnNlPj47XG4gICAgZ2V0RXZlbnRzT3JnYW5pemF0aW9uOiAoaWQ6IHN0cmluZywgc3RhcnQ6IHN0cmluZywgZW5kOiBzdHJpbmcsXG4gICAgICAgIHRva2VuOiBzdHJpbmcpID0+IFByb21pc2U8TGlzdFJlc3BvbnNlPEV2ZW50UmVzcG9uc2U+PjtcbiAgICBnZXRFdmVudHNPcmdhbml6YXRpb25Vc2VyOiAob3JnYW5pemF0aW9uSWQ6IHN0cmluZywgaWQ6IHN0cmluZyxcbiAgICAgICAgc3RhcnQ6IHN0cmluZywgZW5kOiBzdHJpbmcsIHRva2VuOiBzdHJpbmcpID0+IFByb21pc2U8TGlzdFJlc3BvbnNlPEV2ZW50UmVzcG9uc2U+PjtcbiAgICBnZXRFdmVudHNQcm92aWRlcjogKGlkOiBzdHJpbmcsIHN0YXJ0OiBzdHJpbmcsIGVuZDogc3RyaW5nLCB0b2tlbjogc3RyaW5nKSA9PiBQcm9taXNlPExpc3RSZXNwb25zZTxFdmVudFJlc3BvbnNlPj47XG4gICAgZ2V0RXZlbnRzUHJvdmlkZXJVc2VyOiAocHJvdmlkZXJJZDogc3RyaW5nLCBpZDogc3RyaW5nLCBzdGFydDogc3RyaW5nLCBlbmQ6IHN0cmluZywgdG9rZW46IHN0cmluZykgPT4gUHJvbWlzZTxMaXN0UmVzcG9uc2U8RXZlbnRSZXNwb25zZT4+O1xuICAgIHBvc3RFdmVudHNDb2xsZWN0OiAocmVxdWVzdDogRXZlbnRSZXF1ZXN0W10pID0+IFByb21pc2U8YW55PjtcblxuICAgIGRlbGV0ZVNzb1VzZXI6IChvcmdhbml6YXRpb25JZDogc3RyaW5nKSA9PiBQcm9taXNlPGFueT47XG4gICAgZ2V0U3NvVXNlcklkZW50aWZpZXI6ICgpID0+IFByb21pc2U8c3RyaW5nPjtcblxuICAgIGdldFVzZXJQdWJsaWNLZXk6IChpZDogc3RyaW5nKSA9PiBQcm9taXNlPFVzZXJLZXlSZXNwb25zZT47XG5cbiAgICBnZXRIaWJwQnJlYWNoOiAodXNlcm5hbWU6IHN0cmluZykgPT4gUHJvbWlzZTxCcmVhY2hBY2NvdW50UmVzcG9uc2VbXT47XG5cbiAgICBwb3N0Qml0UGF5SW52b2ljZTogKHJlcXVlc3Q6IEJpdFBheUludm9pY2VSZXF1ZXN0KSA9PiBQcm9taXNlPHN0cmluZz47XG4gICAgcG9zdFNldHVwUGF5bWVudDogKCkgPT4gUHJvbWlzZTxzdHJpbmc+O1xuXG4gICAgZ2V0QWN0aXZlQmVhcmVyVG9rZW46ICgpID0+IFByb21pc2U8c3RyaW5nPjtcbiAgICBmZXRjaDogKHJlcXVlc3Q6IFJlcXVlc3QpID0+IFByb21pc2U8UmVzcG9uc2U+O1xuICAgIG5hdGl2ZUZldGNoOiAocmVxdWVzdDogUmVxdWVzdCkgPT4gUHJvbWlzZTxSZXNwb25zZT47XG5cbiAgICBwcmVWYWxpZGF0ZVNzbzogKGlkZW50aWZpZXI6IHN0cmluZykgPT4gUHJvbWlzZTxib29sZWFuPjtcblxuICAgIGdldFVzZXJLZXlGcm9tQ3J5cHRvQWdlbnQ6IChjcnlwdG9BZ2VudFVybDogc3RyaW5nKSA9PiBQcm9taXNlPENyeXB0b0FnZW50VXNlcktleVJlc3BvbnNlPjtcbiAgICBwb3N0VXNlcktleVRvQ3J5cHRvQWdlbnQ6IChjcnlwdG9BZ2VudFVybDogc3RyaW5nLCByZXF1ZXN0OiBDcnlwdG9BZ2VudFVzZXJLZXlSZXF1ZXN0KSA9PiBQcm9taXNlPHZvaWQ+O1xufVxuIiwiZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFwcElkU2VydmljZSB7XG4gICAgZ2V0QXBwSWQ6ICgpID0+IFByb21pc2U8c3RyaW5nPjtcbiAgICBnZXRBbm9ueW1vdXNBcHBJZDogKCkgPT4gUHJvbWlzZTxzdHJpbmc+O1xufVxuIiwiaW1wb3J0IHsgQnJlYWNoQWNjb3VudFJlc3BvbnNlIH0gZnJvbSAnLi4vbW9kZWxzL3Jlc3BvbnNlL2JyZWFjaEFjY291bnRSZXNwb25zZSc7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBdWRpdFNlcnZpY2Uge1xuICAgIHBhc3N3b3JkTGVha2VkOiAocGFzc3dvcmQ6IHN0cmluZykgPT4gUHJvbWlzZTxudW1iZXI+O1xuICAgIGJyZWFjaGVkQWNjb3VudHM6ICh1c2VybmFtZTogc3RyaW5nKSA9PiBQcm9taXNlPEJyZWFjaEFjY291bnRSZXNwb25zZVtdPjtcbn1cbiIsImltcG9ydCB7IFR3b0ZhY3RvclByb3ZpZGVyVHlwZSB9IGZyb20gJy4uL2VudW1zL3R3b0ZhY3RvclByb3ZpZGVyVHlwZSc7XG5cbmltcG9ydCB7IEF1dGhSZXN1bHQgfSBmcm9tICcuLi9tb2RlbHMvZG9tYWluL2F1dGhSZXN1bHQnO1xuaW1wb3J0IHsgU3ltbWV0cmljQ3J5cHRvS2V5IH0gZnJvbSAnLi4vbW9kZWxzL2RvbWFpbi9zeW1tZXRyaWNDcnlwdG9LZXknO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQXV0aFNlcnZpY2Uge1xuICAgIGVtYWlsOiBzdHJpbmc7XG4gICAgbWFzdGVyUGFzc3dvcmRIYXNoOiBzdHJpbmc7XG4gICAgY29kZTogc3RyaW5nO1xuICAgIGNvZGVWZXJpZmllcjogc3RyaW5nO1xuICAgIHNzb1JlZGlyZWN0VXJsOiBzdHJpbmc7XG4gICAgY2xpZW50SWQ6IHN0cmluZztcbiAgICBjbGllbnRTZWNyZXQ6IHN0cmluZztcbiAgICB0d29GYWN0b3JQcm92aWRlcnNEYXRhOiBNYXA8VHdvRmFjdG9yUHJvdmlkZXJUeXBlLCB7IFtrZXk6IHN0cmluZ106IHN0cmluZzsgfT47XG4gICAgc2VsZWN0ZWRUd29GYWN0b3JQcm92aWRlclR5cGU6IFR3b0ZhY3RvclByb3ZpZGVyVHlwZTtcblxuICAgIGxvZ0luOiAoZW1haWw6IHN0cmluZywgbWFzdGVyUGFzc3dvcmQ6IHN0cmluZywgY2FwdGNoYVRva2VuPzogc3RyaW5nKSA9PiBQcm9taXNlPEF1dGhSZXN1bHQ+O1xuICAgIGxvZ0luU3NvOiAoY29kZTogc3RyaW5nLCBjb2RlVmVyaWZpZXI6IHN0cmluZywgcmVkaXJlY3RVcmw6IHN0cmluZywgb3JnSWQ6IHN0cmluZykgPT4gUHJvbWlzZTxBdXRoUmVzdWx0PjtcbiAgICBsb2dJbkFwaUtleTogKGNsaWVudElkOiBzdHJpbmcsIGNsaWVudFNlY3JldDogc3RyaW5nKSA9PiBQcm9taXNlPEF1dGhSZXN1bHQ+O1xuICAgIGxvZ0luVHdvRmFjdG9yOiAodHdvRmFjdG9yUHJvdmlkZXI6IFR3b0ZhY3RvclByb3ZpZGVyVHlwZSwgdHdvRmFjdG9yVG9rZW46IHN0cmluZyxcbiAgICAgICAgcmVtZW1iZXI/OiBib29sZWFuKSA9PiBQcm9taXNlPEF1dGhSZXN1bHQ+O1xuICAgIGxvZ0luQ29tcGxldGU6IChlbWFpbDogc3RyaW5nLCBtYXN0ZXJQYXNzd29yZDogc3RyaW5nLCB0d29GYWN0b3JQcm92aWRlcjogVHdvRmFjdG9yUHJvdmlkZXJUeXBlLFxuICAgICAgICB0d29GYWN0b3JUb2tlbjogc3RyaW5nLCByZW1lbWJlcj86IGJvb2xlYW4sIGNhcHRjaGFUb2tlbj86IHN0cmluZykgPT4gUHJvbWlzZTxBdXRoUmVzdWx0PjtcbiAgICBsb2dJblNzb0NvbXBsZXRlOiAoY29kZTogc3RyaW5nLCBjb2RlVmVyaWZpZXI6IHN0cmluZywgcmVkaXJlY3RVcmw6IHN0cmluZyxcbiAgICAgICAgdHdvRmFjdG9yUHJvdmlkZXI6IFR3b0ZhY3RvclByb3ZpZGVyVHlwZSwgdHdvRmFjdG9yVG9rZW46IHN0cmluZywgcmVtZW1iZXI/OiBib29sZWFuKSA9PiBQcm9taXNlPEF1dGhSZXN1bHQ+O1xuICAgIGxvZ0luQXBpS2V5Q29tcGxldGU6IChjbGllbnRJZDogc3RyaW5nLCBjbGllbnRTZWNyZXQ6IHN0cmluZywgdHdvRmFjdG9yUHJvdmlkZXI6IFR3b0ZhY3RvclByb3ZpZGVyVHlwZSxcbiAgICAgICAgdHdvRmFjdG9yVG9rZW46IHN0cmluZywgcmVtZW1iZXI/OiBib29sZWFuKSA9PiBQcm9taXNlPEF1dGhSZXN1bHQ+O1xuICAgIGxvZ091dDogKGNhbGxiYWNrOiBGdW5jdGlvbikgPT4gdm9pZDtcbiAgICBnZXRTdXBwb3J0ZWRUd29GYWN0b3JQcm92aWRlcnM6ICh3aW46IFdpbmRvdykgPT4gYW55W107XG4gICAgZ2V0RGVmYXVsdFR3b0ZhY3RvclByb3ZpZGVyOiAod2ViQXV0aG5TdXBwb3J0ZWQ6IGJvb2xlYW4pID0+IFR3b0ZhY3RvclByb3ZpZGVyVHlwZTtcbiAgICBtYWtlUHJlbG9naW5LZXk6IChtYXN0ZXJQYXNzd29yZDogc3RyaW5nLCBlbWFpbDogc3RyaW5nKSA9PiBQcm9taXNlPFN5bW1ldHJpY0NyeXB0b0tleT47XG4gICAgYXV0aGluZ1dpdGhBcGlLZXk6ICgpID0+IGJvb2xlYW47XG4gICAgYXV0aGluZ1dpdGhTc286ICgpID0+IGJvb2xlYW47XG4gICAgYXV0aGluZ1dpdGhQYXNzd29yZDogKCkgPT4gYm9vbGVhbjtcbn1cbiIsImV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCcm9hZGNhc3RlclNlcnZpY2Uge1xuICAgIHNlbmQ6IChtZXNzYWdlOiBhbnksIGlkPzogc3RyaW5nKSA9PiB2b2lkO1xuICAgIHN1YnNjcmliZTogKGlkOiBzdHJpbmcsIG1lc3NhZ2VDYWxsYmFjazogKG1lc3NhZ2U6IGFueSkgPT4gYW55KSA9PiB2b2lkO1xuICAgIHVuc3Vic2NyaWJlOiAoaWQ6IHN0cmluZykgPT4gdm9pZDtcbn1cbiIsImltcG9ydCB7IENpcGhlclR5cGUgfSBmcm9tICcuLi9lbnVtcy9jaXBoZXJUeXBlJztcbmltcG9ydCB7IFVyaU1hdGNoVHlwZSB9IGZyb20gJy4uL2VudW1zL3VyaU1hdGNoVHlwZSc7XG5cbmltcG9ydCB7IENpcGhlckRhdGEgfSBmcm9tICcuLi9tb2RlbHMvZGF0YS9jaXBoZXJEYXRhJztcblxuaW1wb3J0IHsgQ2lwaGVyIH0gZnJvbSAnLi4vbW9kZWxzL2RvbWFpbi9jaXBoZXInO1xuaW1wb3J0IHsgRmllbGQgfSBmcm9tICcuLi9tb2RlbHMvZG9tYWluL2ZpZWxkJztcbmltcG9ydCB7IFN5bW1ldHJpY0NyeXB0b0tleSB9IGZyb20gJy4uL21vZGVscy9kb21haW4vc3ltbWV0cmljQ3J5cHRvS2V5JztcblxuaW1wb3J0IHsgQ2lwaGVyVmlldyB9IGZyb20gJy4uL21vZGVscy92aWV3L2NpcGhlclZpZXcnO1xuaW1wb3J0IHsgRmllbGRWaWV3IH0gZnJvbSAnLi4vbW9kZWxzL3ZpZXcvZmllbGRWaWV3JztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIENpcGhlclNlcnZpY2Uge1xuICAgIGRlY3J5cHRlZENpcGhlckNhY2hlOiBDaXBoZXJWaWV3W107XG5cbiAgICBjbGVhckNhY2hlOiAoKSA9PiB2b2lkO1xuICAgIGVuY3J5cHQ6IChtb2RlbDogQ2lwaGVyVmlldywga2V5PzogU3ltbWV0cmljQ3J5cHRvS2V5LCBvcmlnaW5hbENpcGhlcj86IENpcGhlcikgPT4gUHJvbWlzZTxDaXBoZXI+O1xuICAgIGVuY3J5cHRGaWVsZHM6IChmaWVsZHNNb2RlbDogRmllbGRWaWV3W10sIGtleTogU3ltbWV0cmljQ3J5cHRvS2V5KSA9PiBQcm9taXNlPEZpZWxkW10+O1xuICAgIGVuY3J5cHRGaWVsZDogKGZpZWxkTW9kZWw6IEZpZWxkVmlldywga2V5OiBTeW1tZXRyaWNDcnlwdG9LZXkpID0+IFByb21pc2U8RmllbGQ+O1xuICAgIGdldDogKGlkOiBzdHJpbmcpID0+IFByb21pc2U8Q2lwaGVyPjtcbiAgICBnZXRBbGw6ICgpID0+IFByb21pc2U8Q2lwaGVyW10+O1xuICAgIGdldEFsbERlY3J5cHRlZDogKCkgPT4gUHJvbWlzZTxDaXBoZXJWaWV3W10+O1xuICAgIGdldEFsbERlY3J5cHRlZEZvckdyb3VwaW5nOiAoZ3JvdXBpbmdJZDogc3RyaW5nLCBmb2xkZXI/OiBib29sZWFuKSA9PiBQcm9taXNlPENpcGhlclZpZXdbXT47XG4gICAgZ2V0QWxsRGVjcnlwdGVkRm9yVXJsOiAodXJsOiBzdHJpbmcsIGluY2x1ZGVPdGhlclR5cGVzPzogQ2lwaGVyVHlwZVtdLFxuICAgICAgICBkZWZhdWx0TWF0Y2g/OiBVcmlNYXRjaFR5cGUpID0+IFByb21pc2U8Q2lwaGVyVmlld1tdPjtcbiAgICBnZXRBbGxGcm9tQXBpRm9yT3JnYW5pemF0aW9uOiAob3JnYW5pemF0aW9uSWQ6IHN0cmluZykgPT4gUHJvbWlzZTxDaXBoZXJWaWV3W10+O1xuICAgIGdldExhc3RVc2VkRm9yVXJsOiAodXJsOiBzdHJpbmcsIGF1dG9maWxsT25QYWdlTG9hZDogYm9vbGVhbikgPT4gUHJvbWlzZTxDaXBoZXJWaWV3PjtcbiAgICBnZXRMYXN0TGF1bmNoZWRGb3JVcmw6ICh1cmw6IHN0cmluZywgYXV0b2ZpbGxPblBhZ2VMb2FkOiBib29sZWFuKSA9PiBQcm9taXNlPENpcGhlclZpZXc+O1xuICAgIGdldE5leHRDaXBoZXJGb3JVcmw6ICh1cmw6IHN0cmluZykgPT4gUHJvbWlzZTxDaXBoZXJWaWV3PjtcbiAgICB1cGRhdGVMYXN0VXNlZEluZGV4Rm9yVXJsOiAodXJsOiBzdHJpbmcpID0+IHZvaWQ7XG4gICAgdXBkYXRlTGFzdFVzZWREYXRlOiAoaWQ6IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPjtcbiAgICB1cGRhdGVMYXN0TGF1bmNoZWREYXRlOiAoaWQ6IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPjtcbiAgICBzYXZlTmV2ZXJEb21haW46IChkb21haW46IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPjtcbiAgICBzYXZlV2l0aFNlcnZlcjogKGNpcGhlcjogQ2lwaGVyKSA9PiBQcm9taXNlPGFueT47XG4gICAgc2hhcmVXaXRoU2VydmVyOiAoY2lwaGVyOiBDaXBoZXJWaWV3LCBvcmdhbml6YXRpb25JZDogc3RyaW5nLCBjb2xsZWN0aW9uSWRzOiBzdHJpbmdbXSkgPT4gUHJvbWlzZTxhbnk+O1xuICAgIHNoYXJlTWFueVdpdGhTZXJ2ZXI6IChjaXBoZXJzOiBDaXBoZXJWaWV3W10sIG9yZ2FuaXphdGlvbklkOiBzdHJpbmcsIGNvbGxlY3Rpb25JZHM6IHN0cmluZ1tdKSA9PiBQcm9taXNlPGFueT47XG4gICAgc2F2ZUF0dGFjaG1lbnRXaXRoU2VydmVyOiAoY2lwaGVyOiBDaXBoZXIsIHVuZW5jcnlwdGVkRmlsZTogYW55LCBhZG1pbj86IGJvb2xlYW4pID0+IFByb21pc2U8Q2lwaGVyPjtcbiAgICBzYXZlQXR0YWNobWVudFJhd1dpdGhTZXJ2ZXI6IChjaXBoZXI6IENpcGhlciwgZmlsZW5hbWU6IHN0cmluZywgZGF0YTogQXJyYXlCdWZmZXIsXG4gICAgICAgIGFkbWluPzogYm9vbGVhbikgPT4gUHJvbWlzZTxDaXBoZXI+O1xuICAgIHNhdmVDb2xsZWN0aW9uc1dpdGhTZXJ2ZXI6IChjaXBoZXI6IENpcGhlcikgPT4gUHJvbWlzZTxhbnk+O1xuICAgIHVwc2VydDogKGNpcGhlcjogQ2lwaGVyRGF0YSB8IENpcGhlckRhdGFbXSkgPT4gUHJvbWlzZTxhbnk+O1xuICAgIHJlcGxhY2U6IChjaXBoZXJzOiB7IFtpZDogc3RyaW5nXTogQ2lwaGVyRGF0YTsgfSkgPT4gUHJvbWlzZTxhbnk+O1xuICAgIGNsZWFyOiAodXNlcklkOiBzdHJpbmcpID0+IFByb21pc2U8YW55PjtcbiAgICBtb3ZlTWFueVdpdGhTZXJ2ZXI6IChpZHM6IHN0cmluZ1tdLCBmb2xkZXJJZDogc3RyaW5nKSA9PiBQcm9taXNlPGFueT47XG4gICAgZGVsZXRlOiAoaWQ6IHN0cmluZyB8IHN0cmluZ1tdKSA9PiBQcm9taXNlPGFueT47XG4gICAgZGVsZXRlV2l0aFNlcnZlcjogKGlkOiBzdHJpbmcpID0+IFByb21pc2U8YW55PjtcbiAgICBkZWxldGVNYW55V2l0aFNlcnZlcjogKGlkczogc3RyaW5nW10pID0+IFByb21pc2U8YW55PjtcbiAgICBkZWxldGVBdHRhY2htZW50OiAoaWQ6IHN0cmluZywgYXR0YWNobWVudElkOiBzdHJpbmcpID0+IFByb21pc2U8dm9pZD47XG4gICAgZGVsZXRlQXR0YWNobWVudFdpdGhTZXJ2ZXI6IChpZDogc3RyaW5nLCBhdHRhY2htZW50SWQ6IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPjtcbiAgICBzb3J0Q2lwaGVyc0J5TGFzdFVzZWQ6IChhOiBhbnksIGI6IGFueSkgPT4gbnVtYmVyO1xuICAgIHNvcnRDaXBoZXJzQnlMYXN0VXNlZFRoZW5OYW1lOiAoYTogYW55LCBiOiBhbnkpID0+IG51bWJlcjtcbiAgICBnZXRMb2NhbGVTb3J0aW5nRnVuY3Rpb246ICgpID0+IChhOiBDaXBoZXJWaWV3LCBiOiBDaXBoZXJWaWV3KSA9PiBudW1iZXI7XG4gICAgc29mdERlbGV0ZTogKGlkOiBzdHJpbmcgfCBzdHJpbmdbXSkgPT4gUHJvbWlzZTxhbnk+O1xuICAgIHNvZnREZWxldGVXaXRoU2VydmVyOiAoaWQ6IHN0cmluZykgPT4gUHJvbWlzZTxhbnk+O1xuICAgIHNvZnREZWxldGVNYW55V2l0aFNlcnZlcjogKGlkczogc3RyaW5nW10pID0+IFByb21pc2U8YW55PjtcbiAgICByZXN0b3JlOiAoY2lwaGVyOiB7IGlkOiBzdHJpbmcsIHJldmlzaW9uRGF0ZTogc3RyaW5nOyB9IHwgeyBpZDogc3RyaW5nLCByZXZpc2lvbkRhdGU6IHN0cmluZzsgfVtdKSA9PiBQcm9taXNlPGFueT47XG4gICAgcmVzdG9yZVdpdGhTZXJ2ZXI6IChpZDogc3RyaW5nKSA9PiBQcm9taXNlPGFueT47XG4gICAgcmVzdG9yZU1hbnlXaXRoU2VydmVyOiAoaWRzOiBzdHJpbmdbXSkgPT4gUHJvbWlzZTxhbnk+O1xufVxuIiwiaW1wb3J0IHsgQ29sbGVjdGlvbkRhdGEgfSBmcm9tICcuLi9tb2RlbHMvZGF0YS9jb2xsZWN0aW9uRGF0YSc7XG5cbmltcG9ydCB7IENvbGxlY3Rpb24gfSBmcm9tICcuLi9tb2RlbHMvZG9tYWluL2NvbGxlY3Rpb24nO1xuaW1wb3J0IHsgVHJlZU5vZGUgfSBmcm9tICcuLi9tb2RlbHMvZG9tYWluL3RyZWVOb2RlJztcblxuaW1wb3J0IHsgQ29sbGVjdGlvblZpZXcgfSBmcm9tICcuLi9tb2RlbHMvdmlldy9jb2xsZWN0aW9uVmlldyc7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBDb2xsZWN0aW9uU2VydmljZSB7XG4gICAgZGVjcnlwdGVkQ29sbGVjdGlvbkNhY2hlOiBDb2xsZWN0aW9uVmlld1tdO1xuXG4gICAgY2xlYXJDYWNoZTogKCkgPT4gdm9pZDtcbiAgICBlbmNyeXB0OiAobW9kZWw6IENvbGxlY3Rpb25WaWV3KSA9PiBQcm9taXNlPENvbGxlY3Rpb24+O1xuICAgIGRlY3J5cHRNYW55OiAoY29sbGVjdGlvbnM6IENvbGxlY3Rpb25bXSkgPT4gUHJvbWlzZTxDb2xsZWN0aW9uVmlld1tdPjtcbiAgICBnZXQ6IChpZDogc3RyaW5nKSA9PiBQcm9taXNlPENvbGxlY3Rpb24+O1xuICAgIGdldEFsbDogKCkgPT4gUHJvbWlzZTxDb2xsZWN0aW9uW10+O1xuICAgIGdldEFsbERlY3J5cHRlZDogKCkgPT4gUHJvbWlzZTxDb2xsZWN0aW9uVmlld1tdPjtcbiAgICBnZXRBbGxOZXN0ZWQ6IChjb2xsZWN0aW9ucz86IENvbGxlY3Rpb25WaWV3W10pID0+IFByb21pc2U8VHJlZU5vZGU8Q29sbGVjdGlvblZpZXc+W10+O1xuICAgIGdldE5lc3RlZDogKGlkOiBzdHJpbmcpID0+IFByb21pc2U8VHJlZU5vZGU8Q29sbGVjdGlvblZpZXc+PjtcbiAgICB1cHNlcnQ6IChjb2xsZWN0aW9uOiBDb2xsZWN0aW9uRGF0YSB8IENvbGxlY3Rpb25EYXRhW10pID0+IFByb21pc2U8YW55PjtcbiAgICByZXBsYWNlOiAoY29sbGVjdGlvbnM6IHsgW2lkOiBzdHJpbmddOiBDb2xsZWN0aW9uRGF0YTsgfSkgPT4gUHJvbWlzZTxhbnk+O1xuICAgIGNsZWFyOiAodXNlcklkOiBzdHJpbmcpID0+IFByb21pc2U8YW55PjtcbiAgICBkZWxldGU6IChpZDogc3RyaW5nIHwgc3RyaW5nW10pID0+IFByb21pc2U8YW55Pjtcbn1cbiIsImltcG9ydCB7IEVuY0FycmF5QnVmZmVyIH0gZnJvbSAnLi4vbW9kZWxzL2RvbWFpbi9lbmNBcnJheUJ1ZmZlcic7XG5pbXBvcnQgeyBFbmNTdHJpbmcgfSBmcm9tICcuLi9tb2RlbHMvZG9tYWluL2VuY1N0cmluZyc7XG5pbXBvcnQgeyBTeW1tZXRyaWNDcnlwdG9LZXkgfSBmcm9tICcuLi9tb2RlbHMvZG9tYWluL3N5bW1ldHJpY0NyeXB0b0tleSc7XG5cbmltcG9ydCB7IFByb2ZpbGVPcmdhbml6YXRpb25SZXNwb25zZSB9IGZyb20gJy4uL21vZGVscy9yZXNwb25zZS9wcm9maWxlT3JnYW5pemF0aW9uUmVzcG9uc2UnO1xuaW1wb3J0IHsgUHJvZmlsZVByb3ZpZGVyT3JnYW5pemF0aW9uUmVzcG9uc2UgfSBmcm9tICcuLi9tb2RlbHMvcmVzcG9uc2UvcHJvZmlsZVByb3ZpZGVyT3JnYW5pemF0aW9uUmVzcG9uc2UnO1xuaW1wb3J0IHsgUHJvZmlsZVByb3ZpZGVyUmVzcG9uc2UgfSBmcm9tICcuLi9tb2RlbHMvcmVzcG9uc2UvcHJvZmlsZVByb3ZpZGVyUmVzcG9uc2UnO1xuXG5pbXBvcnQgeyBIYXNoUHVycG9zZSB9IGZyb20gJy4uL2VudW1zL2hhc2hQdXJwb3NlJztcbmltcG9ydCB7IEtkZlR5cGUgfSBmcm9tICcuLi9lbnVtcy9rZGZUeXBlJztcblxuaW1wb3J0IHsgS2V5U3VmZml4T3B0aW9ucyB9IGZyb20gJy4vc3RvcmFnZS5zZXJ2aWNlJztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIENyeXB0b1NlcnZpY2Uge1xuICAgIHNldEtleTogKGtleTogU3ltbWV0cmljQ3J5cHRvS2V5KSA9PiBQcm9taXNlPGFueT47XG4gICAgc2V0S2V5SGFzaDogKGtleUhhc2g6IHN0cmluZykgPT4gUHJvbWlzZTx7fT47XG4gICAgc2V0RW5jS2V5OiAoZW5jS2V5OiBzdHJpbmcpID0+IFByb21pc2U8e30+O1xuICAgIHNldEVuY1ByaXZhdGVLZXk6IChlbmNQcml2YXRlS2V5OiBzdHJpbmcpID0+IFByb21pc2U8e30+O1xuICAgIHNldE9yZ0tleXM6IChvcmdzOiBQcm9maWxlT3JnYW5pemF0aW9uUmVzcG9uc2VbXSwgcHJvdmlkZXJPcmdzOiBQcm9maWxlUHJvdmlkZXJPcmdhbml6YXRpb25SZXNwb25zZVtdKSA9PiBQcm9taXNlPHt9PjtcbiAgICBzZXRQcm92aWRlcktleXM6IChvcmdzOiBQcm9maWxlUHJvdmlkZXJSZXNwb25zZVtdKSA9PiBQcm9taXNlPHt9PjtcbiAgICBnZXRLZXk6IChrZXlTdWZmaXg/OiBLZXlTdWZmaXhPcHRpb25zKSA9PiBQcm9taXNlPFN5bW1ldHJpY0NyeXB0b0tleT47XG4gICAgZ2V0S2V5RnJvbVN0b3JhZ2U6IChrZXlTdWZmaXg6IEtleVN1ZmZpeE9wdGlvbnMpID0+IFByb21pc2U8U3ltbWV0cmljQ3J5cHRvS2V5PjtcbiAgICBnZXRLZXlIYXNoOiAoKSA9PiBQcm9taXNlPHN0cmluZz47XG4gICAgY29tcGFyZUFuZFVwZGF0ZUtleUhhc2g6IChtYXN0ZXJQYXNzd29yZDogc3RyaW5nLCBrZXk6IFN5bW1ldHJpY0NyeXB0b0tleSkgPT4gUHJvbWlzZTxib29sZWFuPjtcbiAgICBnZXRFbmNLZXk6IChrZXk/OiBTeW1tZXRyaWNDcnlwdG9LZXkpID0+IFByb21pc2U8U3ltbWV0cmljQ3J5cHRvS2V5PjtcbiAgICBnZXRQdWJsaWNLZXk6ICgpID0+IFByb21pc2U8QXJyYXlCdWZmZXI+O1xuICAgIGdldFByaXZhdGVLZXk6ICgpID0+IFByb21pc2U8QXJyYXlCdWZmZXI+O1xuICAgIGdldEZpbmdlcnByaW50OiAodXNlcklkOiBzdHJpbmcsIHB1YmxpY0tleT86IEFycmF5QnVmZmVyKSA9PiBQcm9taXNlPHN0cmluZ1tdPjtcbiAgICBnZXRPcmdLZXlzOiAoKSA9PiBQcm9taXNlPE1hcDxzdHJpbmcsIFN5bW1ldHJpY0NyeXB0b0tleT4+O1xuICAgIGdldE9yZ0tleTogKG9yZ0lkOiBzdHJpbmcpID0+IFByb21pc2U8U3ltbWV0cmljQ3J5cHRvS2V5PjtcbiAgICBnZXRQcm92aWRlcktleTogKHByb3ZpZGVySWQ6IHN0cmluZykgPT4gUHJvbWlzZTxTeW1tZXRyaWNDcnlwdG9LZXk+O1xuICAgIGhhc0tleTogKCkgPT4gUHJvbWlzZTxib29sZWFuPjtcbiAgICBoYXNLZXlJbk1lbW9yeTogKCkgPT4gYm9vbGVhbjtcbiAgICBoYXNLZXlTdG9yZWQ6IChrZXlTdWZmaXg/OiBLZXlTdWZmaXhPcHRpb25zKSA9PiBQcm9taXNlPGJvb2xlYW4+O1xuICAgIGhhc0VuY0tleTogKCkgPT4gUHJvbWlzZTxib29sZWFuPjtcbiAgICBjbGVhcktleTogKGNsZWFyU2VjcmV0U3RvcmFnZT86IGJvb2xlYW4pID0+IFByb21pc2U8YW55PjtcbiAgICBjbGVhcktleUhhc2g6ICgpID0+IFByb21pc2U8YW55PjtcbiAgICBjbGVhckVuY0tleTogKG1lbW9yeU9ubHk/OiBib29sZWFuKSA9PiBQcm9taXNlPGFueT47XG4gICAgY2xlYXJLZXlQYWlyOiAobWVtb3J5T25seT86IGJvb2xlYW4pID0+IFByb21pc2U8YW55PjtcbiAgICBjbGVhck9yZ0tleXM6IChtZW1vcnlPbmx5PzogYm9vbGVhbikgPT4gUHJvbWlzZTxhbnk+O1xuICAgIGNsZWFyUHJvdmlkZXJLZXlzOiAobWVtb3J5T25seT86IGJvb2xlYW4pID0+IFByb21pc2U8YW55PjtcbiAgICBjbGVhclBpblByb3RlY3RlZEtleTogKCkgPT4gUHJvbWlzZTxhbnk+O1xuICAgIGNsZWFyS2V5czogKCkgPT4gUHJvbWlzZTxhbnk+O1xuICAgIHRvZ2dsZUtleTogKCkgPT4gUHJvbWlzZTxhbnk+O1xuICAgIG1ha2VLZXk6IChwYXNzd29yZDogc3RyaW5nLCBzYWx0OiBzdHJpbmcsIGtkZjogS2RmVHlwZSwga2RmSXRlcmF0aW9uczogbnVtYmVyKSA9PiBQcm9taXNlPFN5bW1ldHJpY0NyeXB0b0tleT47XG4gICAgbWFrZUtleUZyb21QaW46IChwaW46IHN0cmluZywgc2FsdDogc3RyaW5nLCBrZGY6IEtkZlR5cGUsIGtkZkl0ZXJhdGlvbnM6IG51bWJlcixcbiAgICAgICAgcHJvdGVjdGVkS2V5Q3M/OiBFbmNTdHJpbmcpID0+IFByb21pc2U8U3ltbWV0cmljQ3J5cHRvS2V5PjtcbiAgICBtYWtlU2hhcmVLZXk6ICgpID0+IFByb21pc2U8W0VuY1N0cmluZywgU3ltbWV0cmljQ3J5cHRvS2V5XT47XG4gICAgbWFrZUtleVBhaXI6IChrZXk/OiBTeW1tZXRyaWNDcnlwdG9LZXkpID0+IFByb21pc2U8W3N0cmluZywgRW5jU3RyaW5nXT47XG4gICAgbWFrZVBpbktleTogKHBpbjogc3RyaW5nLCBzYWx0OiBzdHJpbmcsIGtkZjogS2RmVHlwZSwga2RmSXRlcmF0aW9uczogbnVtYmVyKSA9PiBQcm9taXNlPFN5bW1ldHJpY0NyeXB0b0tleT47XG4gICAgbWFrZVNlbmRLZXk6IChrZXlNYXRlcmlhbDogQXJyYXlCdWZmZXIpID0+IFByb21pc2U8U3ltbWV0cmljQ3J5cHRvS2V5PjtcbiAgICBoYXNoUGFzc3dvcmQ6IChwYXNzd29yZDogc3RyaW5nLCBrZXk6IFN5bW1ldHJpY0NyeXB0b0tleSwgaGFzaFB1cnBvc2U/OiBIYXNoUHVycG9zZSkgPT4gUHJvbWlzZTxzdHJpbmc+O1xuICAgIG1ha2VFbmNLZXk6IChrZXk6IFN5bW1ldHJpY0NyeXB0b0tleSkgPT4gUHJvbWlzZTxbU3ltbWV0cmljQ3J5cHRvS2V5LCBFbmNTdHJpbmddPjtcbiAgICByZW1ha2VFbmNLZXk6IChrZXk6IFN5bW1ldHJpY0NyeXB0b0tleSwgZW5jS2V5PzogU3ltbWV0cmljQ3J5cHRvS2V5KSA9PiBQcm9taXNlPFtTeW1tZXRyaWNDcnlwdG9LZXksIEVuY1N0cmluZ10+O1xuICAgIGVuY3J5cHQ6IChwbGFpblZhbHVlOiBzdHJpbmcgfCBBcnJheUJ1ZmZlciwga2V5PzogU3ltbWV0cmljQ3J5cHRvS2V5KSA9PiBQcm9taXNlPEVuY1N0cmluZz47XG4gICAgZW5jcnlwdFRvQnl0ZXM6IChwbGFpblZhbHVlOiBBcnJheUJ1ZmZlciwga2V5PzogU3ltbWV0cmljQ3J5cHRvS2V5KSA9PiBQcm9taXNlPEVuY0FycmF5QnVmZmVyPjtcbiAgICByc2FFbmNyeXB0OiAoZGF0YTogQXJyYXlCdWZmZXIsIHB1YmxpY0tleT86IEFycmF5QnVmZmVyKSA9PiBQcm9taXNlPEVuY1N0cmluZz47XG4gICAgcnNhRGVjcnlwdDogKGVuY1ZhbHVlOiBzdHJpbmcsIHByaXZhdGVLZXlWYWx1ZT86IEFycmF5QnVmZmVyKSA9PiBQcm9taXNlPEFycmF5QnVmZmVyPjtcbiAgICBkZWNyeXB0VG9CeXRlczogKGVuY1N0cmluZzogRW5jU3RyaW5nLCBrZXk/OiBTeW1tZXRyaWNDcnlwdG9LZXkpID0+IFByb21pc2U8QXJyYXlCdWZmZXI+O1xuICAgIGRlY3J5cHRUb1V0Zjg6IChlbmNTdHJpbmc6IEVuY1N0cmluZywga2V5PzogU3ltbWV0cmljQ3J5cHRvS2V5KSA9PiBQcm9taXNlPHN0cmluZz47XG4gICAgZGVjcnlwdEZyb21CeXRlczogKGVuY0J1ZjogQXJyYXlCdWZmZXIsIGtleTogU3ltbWV0cmljQ3J5cHRvS2V5KSA9PiBQcm9taXNlPEFycmF5QnVmZmVyPjtcbiAgICByYW5kb21OdW1iZXI6IChtaW46IG51bWJlciwgbWF4OiBudW1iZXIpID0+IFByb21pc2U8bnVtYmVyPjtcbiAgICB2YWxpZGF0ZUtleTogKGtleTogU3ltbWV0cmljQ3J5cHRvS2V5KSA9PiBQcm9taXNlPGJvb2xlYW4+O1xufVxuIiwiaW1wb3J0IHsgRGVjcnlwdFBhcmFtZXRlcnMgfSBmcm9tICcuLi9tb2RlbHMvZG9tYWluL2RlY3J5cHRQYXJhbWV0ZXJzJztcbmltcG9ydCB7IFN5bW1ldHJpY0NyeXB0b0tleSB9IGZyb20gJy4uL21vZGVscy9kb21haW4vc3ltbWV0cmljQ3J5cHRvS2V5JztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIENyeXB0b0Z1bmN0aW9uU2VydmljZSB7XG4gICAgcGJrZGYyOiAocGFzc3dvcmQ6IHN0cmluZyB8IEFycmF5QnVmZmVyLCBzYWx0OiBzdHJpbmcgfCBBcnJheUJ1ZmZlciwgYWxnb3JpdGhtOiAnc2hhMjU2JyB8ICdzaGE1MTInLFxuICAgICAgICBpdGVyYXRpb25zOiBudW1iZXIpID0+IFByb21pc2U8QXJyYXlCdWZmZXI+O1xuICAgIGhrZGY6IChpa206IEFycmF5QnVmZmVyLCBzYWx0OiBzdHJpbmcgfCBBcnJheUJ1ZmZlciwgaW5mbzogc3RyaW5nIHwgQXJyYXlCdWZmZXIsXG4gICAgICAgIG91dHB1dEJ5dGVTaXplOiBudW1iZXIsIGFsZ29yaXRobTogJ3NoYTI1NicgfCAnc2hhNTEyJykgPT4gUHJvbWlzZTxBcnJheUJ1ZmZlcj47XG4gICAgaGtkZkV4cGFuZDogKHByazogQXJyYXlCdWZmZXIsIGluZm86IHN0cmluZyB8IEFycmF5QnVmZmVyLCBvdXRwdXRCeXRlU2l6ZTogbnVtYmVyLFxuICAgICAgICBhbGdvcml0aG06ICdzaGEyNTYnIHwgJ3NoYTUxMicpID0+IFByb21pc2U8QXJyYXlCdWZmZXI+O1xuICAgIGhhc2g6ICh2YWx1ZTogc3RyaW5nIHwgQXJyYXlCdWZmZXIsIGFsZ29yaXRobTogJ3NoYTEnIHwgJ3NoYTI1NicgfCAnc2hhNTEyJyB8ICdtZDUnKSA9PiBQcm9taXNlPEFycmF5QnVmZmVyPjtcbiAgICBobWFjOiAodmFsdWU6IEFycmF5QnVmZmVyLCBrZXk6IEFycmF5QnVmZmVyLCBhbGdvcml0aG06ICdzaGExJyB8ICdzaGEyNTYnIHwgJ3NoYTUxMicpID0+IFByb21pc2U8QXJyYXlCdWZmZXI+O1xuICAgIGNvbXBhcmU6IChhOiBBcnJheUJ1ZmZlciwgYjogQXJyYXlCdWZmZXIpID0+IFByb21pc2U8Ym9vbGVhbj47XG4gICAgaG1hY0Zhc3Q6ICh2YWx1ZTogQXJyYXlCdWZmZXIgfCBzdHJpbmcsIGtleTogQXJyYXlCdWZmZXIgfCBzdHJpbmcsIGFsZ29yaXRobTogJ3NoYTEnIHwgJ3NoYTI1NicgfCAnc2hhNTEyJykgPT5cbiAgICAgICAgUHJvbWlzZTxBcnJheUJ1ZmZlciB8IHN0cmluZz47XG4gICAgY29tcGFyZUZhc3Q6IChhOiBBcnJheUJ1ZmZlciB8IHN0cmluZywgYjogQXJyYXlCdWZmZXIgfCBzdHJpbmcpID0+IFByb21pc2U8Ym9vbGVhbj47XG4gICAgYWVzRW5jcnlwdDogKGRhdGE6IEFycmF5QnVmZmVyLCBpdjogQXJyYXlCdWZmZXIsIGtleTogQXJyYXlCdWZmZXIpID0+IFByb21pc2U8QXJyYXlCdWZmZXI+O1xuICAgIGFlc0RlY3J5cHRGYXN0UGFyYW1ldGVyczogKGRhdGE6IHN0cmluZywgaXY6IHN0cmluZywgbWFjOiBzdHJpbmcsIGtleTogU3ltbWV0cmljQ3J5cHRvS2V5KSA9PlxuICAgICAgICBEZWNyeXB0UGFyYW1ldGVyczxBcnJheUJ1ZmZlciB8IHN0cmluZz47XG4gICAgYWVzRGVjcnlwdEZhc3Q6IChwYXJhbWV0ZXJzOiBEZWNyeXB0UGFyYW1ldGVyczxBcnJheUJ1ZmZlciB8IHN0cmluZz4pID0+IFByb21pc2U8c3RyaW5nPjtcbiAgICBhZXNEZWNyeXB0OiAoZGF0YTogQXJyYXlCdWZmZXIsIGl2OiBBcnJheUJ1ZmZlciwga2V5OiBBcnJheUJ1ZmZlcikgPT4gUHJvbWlzZTxBcnJheUJ1ZmZlcj47XG4gICAgcnNhRW5jcnlwdDogKGRhdGE6IEFycmF5QnVmZmVyLCBwdWJsaWNLZXk6IEFycmF5QnVmZmVyLCBhbGdvcml0aG06ICdzaGExJyB8ICdzaGEyNTYnKSA9PiBQcm9taXNlPEFycmF5QnVmZmVyPjtcbiAgICByc2FEZWNyeXB0OiAoZGF0YTogQXJyYXlCdWZmZXIsIHByaXZhdGVLZXk6IEFycmF5QnVmZmVyLCBhbGdvcml0aG06ICdzaGExJyB8ICdzaGEyNTYnKSA9PiBQcm9taXNlPEFycmF5QnVmZmVyPjtcbiAgICByc2FFeHRyYWN0UHVibGljS2V5OiAocHJpdmF0ZUtleTogQXJyYXlCdWZmZXIpID0+IFByb21pc2U8QXJyYXlCdWZmZXI+O1xuICAgIHJzYUdlbmVyYXRlS2V5UGFpcjogKGxlbmd0aDogMTAyNCB8IDIwNDggfCA0MDk2KSA9PiBQcm9taXNlPFtBcnJheUJ1ZmZlciwgQXJyYXlCdWZmZXJdPjtcbiAgICByYW5kb21CeXRlczogKGxlbmd0aDogbnVtYmVyKSA9PiBQcm9taXNlPEFycmF5QnVmZmVyPjtcbn1cbiIsImltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcblxuZXhwb3J0IHR5cGUgVXJscyA9IHtcbiAgICBiYXNlPzogc3RyaW5nO1xuICAgIHdlYlZhdWx0Pzogc3RyaW5nO1xuICAgIGFwaT86IHN0cmluZztcbiAgICBpZGVudGl0eT86IHN0cmluZztcbiAgICBpY29ucz86IHN0cmluZztcbiAgICBub3RpZmljYXRpb25zPzogc3RyaW5nO1xuICAgIGV2ZW50cz86IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIFBheVBhbENvbmZpZyA9IHtcbiAgICBidXNpbmVzc0lkPzogc3RyaW5nO1xuICAgIGJ1dHRvbkFjdGlvbj86IHN0cmluZztcbn07XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBFbnZpcm9ubWVudFNlcnZpY2Uge1xuICAgIHVybHM6IE9ic2VydmFibGU8VXJscz47XG5cbiAgICBoYXNCYXNlVXJsOiAoKSA9PiBib29sZWFuO1xuICAgIGdldE5vdGlmaWNhdGlvbnNVcmw6ICgpID0+IHN0cmluZztcbiAgICBnZXRXZWJWYXVsdFVybDogKCkgPT4gc3RyaW5nO1xuICAgIGdldFNlbmRVcmw6ICgpID0+IHN0cmluZztcbiAgICBnZXRJY29uc1VybDogKCkgPT4gc3RyaW5nO1xuICAgIGdldEFwaVVybDogKCkgPT4gc3RyaW5nO1xuICAgIGdldElkZW50aXR5VXJsOiAoKSA9PiBzdHJpbmc7XG4gICAgZ2V0RXZlbnRzVXJsOiAoKSA9PiBzdHJpbmc7XG4gICAgc2V0VXJsc0Zyb21TdG9yYWdlOiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuICAgIHNldFVybHM6ICh1cmxzOiBhbnksIHNhdmVTZXR0aW5ncz86IGJvb2xlYW4pID0+IFByb21pc2U8VXJscz47XG4gICAgZ2V0VXJsczogKCkgPT4gVXJscztcbn1cbiIsImltcG9ydCB7IEV2ZW50VHlwZSB9IGZyb20gJy4uL2VudW1zL2V2ZW50VHlwZSc7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBFdmVudFNlcnZpY2Uge1xuICAgIGNvbGxlY3Q6IChldmVudFR5cGU6IEV2ZW50VHlwZSwgY2lwaGVySWQ/OiBzdHJpbmcsIHVwbG9hZEltbWVkaWF0ZWx5PzogYm9vbGVhbikgPT4gUHJvbWlzZTxhbnk+O1xuICAgIHVwbG9hZEV2ZW50czogKCkgPT4gUHJvbWlzZTxhbnk+O1xuICAgIGNsZWFyRXZlbnRzOiAoKSA9PiBQcm9taXNlPGFueT47XG59XG4iLCJpbXBvcnQgeyBFdmVudFZpZXcgfSBmcm9tICcuLi9tb2RlbHMvdmlldy9ldmVudFZpZXcnO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRXhwb3J0U2VydmljZSB7XG4gICAgZ2V0RXhwb3J0OiAoZm9ybWF0PzogJ2NzdicgfCAnanNvbicgfCAnZW5jcnlwdGVkX2pzb24nKSA9PiBQcm9taXNlPHN0cmluZz47XG4gICAgZ2V0T3JnYW5pemF0aW9uRXhwb3J0OiAob3JnYW5pemF0aW9uSWQ6IHN0cmluZywgZm9ybWF0PzogJ2NzdicgfCAnanNvbicgfCAnZW5jcnlwdGVkX2pzb24nKSA9PiBQcm9taXNlPHN0cmluZz47XG4gICAgZ2V0RXZlbnRFeHBvcnQ6IChldmVudHM6IEV2ZW50Vmlld1tdKSA9PiBQcm9taXNlPHN0cmluZz47XG4gICAgZ2V0RmlsZU5hbWU6IChwcmVmaXg/OiBzdHJpbmcsIGV4dGVuc2lvbj86IHN0cmluZykgPT4gc3RyaW5nO1xufVxuIiwiaW1wb3J0IHsgRW5jQXJyYXlCdWZmZXIgfSBmcm9tICcuLi9tb2RlbHMvZG9tYWluL2VuY0FycmF5QnVmZmVyJztcbmltcG9ydCB7IEVuY1N0cmluZyB9IGZyb20gJy4uL21vZGVscy9kb21haW4vZW5jU3RyaW5nJztcbmltcG9ydCB7IEF0dGFjaG1lbnRVcGxvYWREYXRhUmVzcG9uc2UgfSBmcm9tICcuLi9tb2RlbHMvcmVzcG9uc2UvYXR0YWNobWVudFVwbG9hZERhdGFSZXNwb25zZSc7XG5pbXBvcnQgeyBTZW5kRmlsZVVwbG9hZERhdGFSZXNwb25zZSB9IGZyb20gJy4uL21vZGVscy9yZXNwb25zZS9zZW5kRmlsZVVwbG9hZERhdGFSZXNwb25zZSc7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBGaWxlVXBsb2FkU2VydmljZSB7XG4gICAgdXBsb2FkU2VuZEZpbGU6ICh1cGxvYWREYXRhOiBTZW5kRmlsZVVwbG9hZERhdGFSZXNwb25zZSwgZmlsZU5hbWU6IEVuY1N0cmluZyxcbiAgICAgICAgZW5jcnlwdGVkRmlsZURhdGE6IEVuY0FycmF5QnVmZmVyKSA9PiBQcm9taXNlPGFueT47XG4gICAgdXBsb2FkQ2lwaGVyQXR0YWNobWVudDogKGFkbWluOiBib29sZWFuLCB1cGxvYWREYXRhOiBBdHRhY2htZW50VXBsb2FkRGF0YVJlc3BvbnNlLCBmaWxlTmFtZTogRW5jU3RyaW5nLFxuICAgICAgICBlbmNyeXB0ZWRGaWxlRGF0YTogRW5jQXJyYXlCdWZmZXIpID0+IFByb21pc2U8YW55Pjtcbn1cbiIsImltcG9ydCB7IEZvbGRlckRhdGEgfSBmcm9tICcuLi9tb2RlbHMvZGF0YS9mb2xkZXJEYXRhJztcblxuaW1wb3J0IHsgRm9sZGVyIH0gZnJvbSAnLi4vbW9kZWxzL2RvbWFpbi9mb2xkZXInO1xuaW1wb3J0IHsgU3ltbWV0cmljQ3J5cHRvS2V5IH0gZnJvbSAnLi4vbW9kZWxzL2RvbWFpbi9zeW1tZXRyaWNDcnlwdG9LZXknO1xuaW1wb3J0IHsgVHJlZU5vZGUgfSBmcm9tICcuLi9tb2RlbHMvZG9tYWluL3RyZWVOb2RlJztcblxuaW1wb3J0IHsgRm9sZGVyVmlldyB9IGZyb20gJy4uL21vZGVscy92aWV3L2ZvbGRlclZpZXcnO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRm9sZGVyU2VydmljZSB7XG4gICAgZGVjcnlwdGVkRm9sZGVyQ2FjaGU6IEZvbGRlclZpZXdbXTtcblxuICAgIGNsZWFyQ2FjaGU6ICgpID0+IHZvaWQ7XG4gICAgZW5jcnlwdDogKG1vZGVsOiBGb2xkZXJWaWV3LCBrZXk/OiBTeW1tZXRyaWNDcnlwdG9LZXkpID0+IFByb21pc2U8Rm9sZGVyPjtcbiAgICBnZXQ6IChpZDogc3RyaW5nKSA9PiBQcm9taXNlPEZvbGRlcj47XG4gICAgZ2V0QWxsOiAoKSA9PiBQcm9taXNlPEZvbGRlcltdPjtcbiAgICBnZXRBbGxEZWNyeXB0ZWQ6ICgpID0+IFByb21pc2U8Rm9sZGVyVmlld1tdPjtcbiAgICBnZXRBbGxOZXN0ZWQ6ICgpID0+IFByb21pc2U8VHJlZU5vZGU8Rm9sZGVyVmlldz5bXT47XG4gICAgZ2V0TmVzdGVkOiAoaWQ6IHN0cmluZykgPT4gUHJvbWlzZTxUcmVlTm9kZTxGb2xkZXJWaWV3Pj47XG4gICAgc2F2ZVdpdGhTZXJ2ZXI6IChmb2xkZXI6IEZvbGRlcikgPT4gUHJvbWlzZTxhbnk+O1xuICAgIHVwc2VydDogKGZvbGRlcjogRm9sZGVyRGF0YSB8IEZvbGRlckRhdGFbXSkgPT4gUHJvbWlzZTxhbnk+O1xuICAgIHJlcGxhY2U6IChmb2xkZXJzOiB7IFtpZDogc3RyaW5nXTogRm9sZGVyRGF0YTsgfSkgPT4gUHJvbWlzZTxhbnk+O1xuICAgIGNsZWFyOiAodXNlcklkOiBzdHJpbmcpID0+IFByb21pc2U8YW55PjtcbiAgICBkZWxldGU6IChpZDogc3RyaW5nIHwgc3RyaW5nW10pID0+IFByb21pc2U8YW55PjtcbiAgICBkZWxldGVXaXRoU2VydmVyOiAoaWQ6IHN0cmluZykgPT4gUHJvbWlzZTxhbnk+O1xufVxuIiwiZXhwb3J0IGFic3RyYWN0IGNsYXNzIEkxOG5TZXJ2aWNlIHtcbiAgICBsb2NhbGU6IHN0cmluZztcbiAgICBzdXBwb3J0ZWRUcmFuc2xhdGlvbkxvY2FsZXM6IHN0cmluZ1tdO1xuICAgIHRyYW5zbGF0aW9uTG9jYWxlOiBzdHJpbmc7XG4gICAgY29sbGF0b3I6IEludGwuQ29sbGF0b3I7XG4gICAgbG9jYWxlTmFtZXM6IE1hcDxzdHJpbmcsIHN0cmluZz47XG4gICAgdDogKGlkOiBzdHJpbmcsIHAxPzogc3RyaW5nLCBwMj86IHN0cmluZywgcDM/OiBzdHJpbmcpID0+IHN0cmluZztcbiAgICB0cmFuc2xhdGU6IChpZDogc3RyaW5nLCBwMT86IHN0cmluZywgcDI/OiBzdHJpbmcsIHAzPzogc3RyaW5nKSA9PiBzdHJpbmc7XG59XG4iLCJpbXBvcnQgeyBMb2dMZXZlbFR5cGUgfSBmcm9tICcuLi9lbnVtcy9sb2dMZXZlbFR5cGUnO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgTG9nU2VydmljZSB7XG4gICAgZGVidWc6IChtZXNzYWdlOiBzdHJpbmcpID0+IHZvaWQ7XG4gICAgaW5mbzogKG1lc3NhZ2U6IHN0cmluZykgPT4gdm9pZDtcbiAgICB3YXJuaW5nOiAobWVzc2FnZTogc3RyaW5nKSA9PiB2b2lkO1xuICAgIGVycm9yOiAobWVzc2FnZTogc3RyaW5nKSA9PiB2b2lkO1xuICAgIHdyaXRlOiAobGV2ZWw6IExvZ0xldmVsVHlwZSwgbWVzc2FnZTogc3RyaW5nKSA9PiB2b2lkO1xuICAgIHRpbWU6IChsYWJlbDogc3RyaW5nKSA9PiB2b2lkO1xuICAgIHRpbWVFbmQ6IChsYWJlbDogc3RyaW5nKSA9PiBbbnVtYmVyLCBudW1iZXJdO1xufVxuIiwiZXhwb3J0IGFic3RyYWN0IGNsYXNzIE1lc3NhZ2luZ1NlcnZpY2Uge1xuICAgIHNlbmQ6IChzdWJzY3JpYmVyOiBzdHJpbmcsIGFyZz86IGFueSkgPT4gdm9pZDtcbn1cbiIsImV4cG9ydCBhYnN0cmFjdCBjbGFzcyBOb3RpZmljYXRpb25zU2VydmljZSB7XG4gICAgaW5pdDogKCkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgICB1cGRhdGVDb25uZWN0aW9uOiAoc3luYz86IGJvb2xlYW4pID0+IFByb21pc2U8dm9pZD47XG4gICAgcmVjb25uZWN0RnJvbUFjdGl2aXR5OiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuICAgIGRpc2Nvbm5lY3RGcm9tSW5hY3Rpdml0eTogKCkgPT4gUHJvbWlzZTx2b2lkPjtcbn1cbiIsImltcG9ydCAqIGFzIHp4Y3ZibiBmcm9tICd6eGN2Ym4nO1xuXG5pbXBvcnQgeyBHZW5lcmF0ZWRQYXNzd29yZEhpc3RvcnkgfSBmcm9tICcuLi9tb2RlbHMvZG9tYWluL2dlbmVyYXRlZFBhc3N3b3JkSGlzdG9yeSc7XG5pbXBvcnQgeyBQYXNzd29yZEdlbmVyYXRvclBvbGljeU9wdGlvbnMgfSBmcm9tICcuLi9tb2RlbHMvZG9tYWluL3Bhc3N3b3JkR2VuZXJhdG9yUG9saWN5T3B0aW9ucyc7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBQYXNzd29yZEdlbmVyYXRpb25TZXJ2aWNlIHtcbiAgICBnZW5lcmF0ZVBhc3N3b3JkOiAob3B0aW9uczogYW55KSA9PiBQcm9taXNlPHN0cmluZz47XG4gICAgZ2VuZXJhdGVQYXNzcGhyYXNlOiAob3B0aW9uczogYW55KSA9PiBQcm9taXNlPHN0cmluZz47XG4gICAgZ2V0T3B0aW9uczogKCkgPT4gUHJvbWlzZTxbYW55LCBQYXNzd29yZEdlbmVyYXRvclBvbGljeU9wdGlvbnNdPjtcbiAgICBlbmZvcmNlUGFzc3dvcmRHZW5lcmF0b3JQb2xpY2llc09uT3B0aW9uczogKG9wdGlvbnM6IGFueSkgPT4gUHJvbWlzZTxbYW55LCBQYXNzd29yZEdlbmVyYXRvclBvbGljeU9wdGlvbnNdPjtcbiAgICBnZXRQYXNzd29yZEdlbmVyYXRvclBvbGljeU9wdGlvbnM6ICgpID0+IFByb21pc2U8UGFzc3dvcmRHZW5lcmF0b3JQb2xpY3lPcHRpb25zPjtcbiAgICBzYXZlT3B0aW9uczogKG9wdGlvbnM6IGFueSkgPT4gUHJvbWlzZTxhbnk+O1xuICAgIGdldEhpc3Rvcnk6ICgpID0+IFByb21pc2U8R2VuZXJhdGVkUGFzc3dvcmRIaXN0b3J5W10+O1xuICAgIGFkZEhpc3Rvcnk6IChwYXNzd29yZDogc3RyaW5nKSA9PiBQcm9taXNlPGFueT47XG4gICAgY2xlYXI6ICgpID0+IFByb21pc2U8YW55PjtcbiAgICBwYXNzd29yZFN0cmVuZ3RoOiAocGFzc3dvcmQ6IHN0cmluZywgdXNlcklucHV0cz86IHN0cmluZ1tdKSA9PiB6eGN2Ym4uWlhDVkJOUmVzdWx0O1xuICAgIG5vcm1hbGl6ZU9wdGlvbnM6IChvcHRpb25zOiBhbnksIGVuZm9yY2VkUG9saWN5T3B0aW9uczogUGFzc3dvcmRHZW5lcmF0b3JQb2xpY3lPcHRpb25zKSA9PiB2b2lkO1xufVxuIiwiZXhwb3J0IGFic3RyYWN0IGNsYXNzIFBhc3N3b3JkUmVwcm9tcHRTZXJ2aWNlIHtcbiAgICBwcm90ZWN0ZWRGaWVsZHM6ICgpID0+IHN0cmluZ1tdO1xuICAgIHNob3dQYXNzd29yZFByb21wdDogKCkgPT4gUHJvbWlzZTxib29sZWFuPjtcbn1cbiIsImltcG9ydCB7IERldmljZVR5cGUgfSBmcm9tICcuLi9lbnVtcy9kZXZpY2VUeXBlJztcbmltcG9ydCB7IFRoZW1lVHlwZSB9IGZyb20gJy4uL2VudW1zL3RoZW1lVHlwZSc7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBQbGF0Zm9ybVV0aWxzU2VydmljZSB7XG4gICAgaWRlbnRpdHlDbGllbnRJZDogc3RyaW5nO1xuICAgIGdldERldmljZTogKCkgPT4gRGV2aWNlVHlwZTtcbiAgICBnZXREZXZpY2VTdHJpbmc6ICgpID0+IHN0cmluZztcbiAgICBpc0ZpcmVmb3g6ICgpID0+IGJvb2xlYW47XG4gICAgaXNDaHJvbWU6ICgpID0+IGJvb2xlYW47XG4gICAgaXNFZGdlOiAoKSA9PiBib29sZWFuO1xuICAgIGlzT3BlcmE6ICgpID0+IGJvb2xlYW47XG4gICAgaXNWaXZhbGRpOiAoKSA9PiBib29sZWFuO1xuICAgIGlzU2FmYXJpOiAoKSA9PiBib29sZWFuO1xuICAgIGlzSUU6ICgpID0+IGJvb2xlYW47XG4gICAgaXNNYWNBcHBTdG9yZTogKCkgPT4gYm9vbGVhbjtcbiAgICBpc1ZpZXdPcGVuOiAoKSA9PiBQcm9taXNlPGJvb2xlYW4+O1xuICAgIGxhdW5jaFVyaTogKHVyaTogc3RyaW5nLCBvcHRpb25zPzogYW55KSA9PiB2b2lkO1xuICAgIHNhdmVGaWxlOiAod2luOiBXaW5kb3csIGJsb2JEYXRhOiBhbnksIGJsb2JPcHRpb25zOiBhbnksIGZpbGVOYW1lOiBzdHJpbmcpID0+IHZvaWQ7XG4gICAgZ2V0QXBwbGljYXRpb25WZXJzaW9uOiAoKSA9PiBQcm9taXNlPHN0cmluZz47XG4gICAgc3VwcG9ydHNXZWJBdXRobjogKHdpbjogV2luZG93KSA9PiBib29sZWFuO1xuICAgIHN1cHBvcnRzRHVvOiAoKSA9PiBib29sZWFuO1xuICAgIHNob3dUb2FzdDogKHR5cGU6ICdlcnJvcicgfCAnc3VjY2VzcycgfCAnd2FybmluZycgfCAnaW5mbycsIHRpdGxlOiBzdHJpbmcsIHRleHQ6IHN0cmluZyB8IHN0cmluZ1tdLFxuICAgICAgICBvcHRpb25zPzogYW55KSA9PiB2b2lkO1xuICAgIHNob3dEaWFsb2c6IChib2R5OiBzdHJpbmcsIHRpdGxlPzogc3RyaW5nLCBjb25maXJtVGV4dD86IHN0cmluZywgY2FuY2VsVGV4dD86IHN0cmluZyxcbiAgICAgICAgdHlwZT86IHN0cmluZywgYm9keUlzSHRtbD86IGJvb2xlYW4pID0+IFByb21pc2U8Ym9vbGVhbj47XG4gICAgaXNEZXY6ICgpID0+IGJvb2xlYW47XG4gICAgaXNTZWxmSG9zdDogKCkgPT4gYm9vbGVhbjtcbiAgICBjb3B5VG9DbGlwYm9hcmQ6ICh0ZXh0OiBzdHJpbmcsIG9wdGlvbnM/OiBhbnkpID0+IHZvaWQgfCBib29sZWFuO1xuICAgIHJlYWRGcm9tQ2xpcGJvYXJkOiAob3B0aW9ucz86IGFueSkgPT4gUHJvbWlzZTxzdHJpbmc+O1xuICAgIHN1cHBvcnRzQmlvbWV0cmljOiAoKSA9PiBQcm9taXNlPGJvb2xlYW4+O1xuICAgIGF1dGhlbnRpY2F0ZUJpb21ldHJpYzogKCkgPT4gUHJvbWlzZTxib29sZWFuPjtcbiAgICBnZXREZWZhdWx0U3lzdGVtVGhlbWU6ICgpID0+IFByb21pc2U8VGhlbWVUeXBlLkxpZ2h0IHwgVGhlbWVUeXBlLkRhcms+O1xuICAgIG9uRGVmYXVsdFN5c3RlbVRoZW1lQ2hhbmdlOiAoY2FsbGJhY2s6ICgodGhlbWU6IFRoZW1lVHlwZS5MaWdodCB8IFRoZW1lVHlwZS5EYXJrKSA9PiB1bmtub3duKSkgPT4gdW5rbm93bjtcbiAgICBnZXRFZmZlY3RpdmVUaGVtZTogKCkgPT4gUHJvbWlzZTxUaGVtZVR5cGU+O1xuICAgIHN1cHBvcnRzU2VjdXJlU3RvcmFnZTogKCkgPT4gYm9vbGVhbjtcbn1cbiIsImltcG9ydCB7IFBvbGljeURhdGEgfSBmcm9tICcuLi9tb2RlbHMvZGF0YS9wb2xpY3lEYXRhJztcblxuaW1wb3J0IHsgTWFzdGVyUGFzc3dvcmRQb2xpY3lPcHRpb25zIH0gZnJvbSAnLi4vbW9kZWxzL2RvbWFpbi9tYXN0ZXJQYXNzd29yZFBvbGljeU9wdGlvbnMnO1xuaW1wb3J0IHsgUG9saWN5IH0gZnJvbSAnLi4vbW9kZWxzL2RvbWFpbi9wb2xpY3knO1xuaW1wb3J0IHsgUmVzZXRQYXNzd29yZFBvbGljeU9wdGlvbnMgfSBmcm9tICcuLi9tb2RlbHMvZG9tYWluL3Jlc2V0UGFzc3dvcmRQb2xpY3lPcHRpb25zJztcblxuaW1wb3J0IHsgTGlzdFJlc3BvbnNlIH0gZnJvbSAnLi4vbW9kZWxzL3Jlc3BvbnNlL2xpc3RSZXNwb25zZSc7XG5pbXBvcnQgeyBQb2xpY3lSZXNwb25zZSB9IGZyb20gJy4uL21vZGVscy9yZXNwb25zZS9wb2xpY3lSZXNwb25zZSc7XG5cbmltcG9ydCB7IFBvbGljeVR5cGUgfSBmcm9tICcuLi9lbnVtcy9wb2xpY3lUeXBlJztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFBvbGljeVNlcnZpY2Uge1xuICAgIHBvbGljeUNhY2hlOiBQb2xpY3lbXTtcblxuICAgIGNsZWFyQ2FjaGU6ICgpID0+IHZvaWQ7XG4gICAgZ2V0QWxsOiAodHlwZT86IFBvbGljeVR5cGUpID0+IFByb21pc2U8UG9saWN5W10+O1xuICAgIGdldFBvbGljeUZvck9yZ2FuaXphdGlvbjogKHBvbGljeVR5cGU6IFBvbGljeVR5cGUsIG9yZ2FuaXphdGlvbklkOiBzdHJpbmcpID0+IFByb21pc2U8UG9saWN5PjtcbiAgICByZXBsYWNlOiAocG9saWNpZXM6IHsgW2lkOiBzdHJpbmddOiBQb2xpY3lEYXRhOyB9KSA9PiBQcm9taXNlPGFueT47XG4gICAgY2xlYXI6ICh1c2VySWQ6IHN0cmluZykgPT4gUHJvbWlzZTxhbnk+O1xuICAgIGdldE1hc3RlclBhc3N3b3JkUG9saWN5T3B0aW9uczogKHBvbGljaWVzPzogUG9saWN5W10pID0+IFByb21pc2U8TWFzdGVyUGFzc3dvcmRQb2xpY3lPcHRpb25zPjtcbiAgICBldmFsdWF0ZU1hc3RlclBhc3N3b3JkOiAocGFzc3dvcmRTdHJlbmd0aDogbnVtYmVyLCBuZXdQYXNzd29yZDogc3RyaW5nLFxuICAgICAgICBlbmZvcmNlZFBvbGljeU9wdGlvbnM/OiBNYXN0ZXJQYXNzd29yZFBvbGljeU9wdGlvbnMpID0+IGJvb2xlYW47XG4gICAgZ2V0UmVzZXRQYXNzd29yZFBvbGljeU9wdGlvbnM6IChwb2xpY2llczogUG9saWN5W10sIG9yZ0lkOiBzdHJpbmcpID0+IFtSZXNldFBhc3N3b3JkUG9saWN5T3B0aW9ucywgYm9vbGVhbl07XG4gICAgbWFwUG9saWNpZXNGcm9tVG9rZW46IChwb2xpY2llc1Jlc3BvbnNlOiBMaXN0UmVzcG9uc2U8UG9saWN5UmVzcG9uc2U+KSA9PiBQb2xpY3lbXTtcbiAgICBwb2xpY3lBcHBsaWVzVG9Vc2VyOiAocG9saWN5VHlwZTogUG9saWN5VHlwZSwgcG9saWN5RmlsdGVyPzogKHBvbGljeTogUG9saWN5KSA9PiBib29sZWFuKSA9PiBQcm9taXNlPGJvb2xlYW4+O1xufVxuIiwiaW1wb3J0IHsgQ2lwaGVyVmlldyB9IGZyb20gJy4uL21vZGVscy92aWV3L2NpcGhlclZpZXcnO1xuaW1wb3J0IHsgU2VuZFZpZXcgfSBmcm9tICcuLi9tb2RlbHMvdmlldy9zZW5kVmlldyc7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBTZWFyY2hTZXJ2aWNlIHtcbiAgICBpbmRleGVkRW50aXR5SWQ/OiBzdHJpbmcgPSBudWxsO1xuICAgIGNsZWFySW5kZXg6ICgpID0+IHZvaWQ7XG4gICAgaXNTZWFyY2hhYmxlOiAocXVlcnk6IHN0cmluZykgPT4gYm9vbGVhbjtcbiAgICBpbmRleENpcGhlcnM6IChpbmRleGVkRW50aXR5R3VpZD86IHN0cmluZywgY2lwaGVyc1RvSW5kZXg/OiBDaXBoZXJWaWV3W10pID0+IFByb21pc2U8dm9pZD47XG4gICAgc2VhcmNoQ2lwaGVyczogKHF1ZXJ5OiBzdHJpbmcsXG4gICAgICAgIGZpbHRlcj86ICgoY2lwaGVyOiBDaXBoZXJWaWV3KSA9PiBib29sZWFuKSB8ICgoKGNpcGhlcjogQ2lwaGVyVmlldykgPT4gYm9vbGVhbilbXSksXG4gICAgICAgIGNpcGhlcnM/OiBDaXBoZXJWaWV3W10pID0+IFByb21pc2U8Q2lwaGVyVmlld1tdPjtcbiAgICBzZWFyY2hDaXBoZXJzQmFzaWM6IChjaXBoZXJzOiBDaXBoZXJWaWV3W10sIHF1ZXJ5OiBzdHJpbmcsIGRlbGV0ZWQ/OiBib29sZWFuKSA9PiBDaXBoZXJWaWV3W107XG4gICAgc2VhcmNoU2VuZHM6IChzZW5kczogU2VuZFZpZXdbXSwgcXVlcnk6IHN0cmluZykgPT4gU2VuZFZpZXdbXTtcbn1cbiIsImltcG9ydCB7IFNlbmREYXRhIH0gZnJvbSAnLi4vbW9kZWxzL2RhdGEvc2VuZERhdGEnO1xuXG5pbXBvcnQgeyBFbmNBcnJheUJ1ZmZlciB9IGZyb20gJy4uL21vZGVscy9kb21haW4vZW5jQXJyYXlCdWZmZXInO1xuaW1wb3J0IHsgU2VuZCB9IGZyb20gJy4uL21vZGVscy9kb21haW4vc2VuZCc7XG5pbXBvcnQgeyBTeW1tZXRyaWNDcnlwdG9LZXkgfSBmcm9tICcuLi9tb2RlbHMvZG9tYWluL3N5bW1ldHJpY0NyeXB0b0tleSc7XG5cbmltcG9ydCB7IFNlbmRWaWV3IH0gZnJvbSAnLi4vbW9kZWxzL3ZpZXcvc2VuZFZpZXcnO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgU2VuZFNlcnZpY2Uge1xuICAgIGRlY3J5cHRlZFNlbmRDYWNoZTogU2VuZFZpZXdbXTtcblxuICAgIGNsZWFyQ2FjaGU6ICgpID0+IHZvaWQ7XG4gICAgZW5jcnlwdDogKG1vZGVsOiBTZW5kVmlldywgZmlsZTogRmlsZSB8IEFycmF5QnVmZmVyLCBwYXNzd29yZDogc3RyaW5nLCBrZXk/OiBTeW1tZXRyaWNDcnlwdG9LZXkpID0+IFByb21pc2U8W1NlbmQsIEVuY0FycmF5QnVmZmVyXT47XG4gICAgZ2V0OiAoaWQ6IHN0cmluZykgPT4gUHJvbWlzZTxTZW5kPjtcbiAgICBnZXRBbGw6ICgpID0+IFByb21pc2U8U2VuZFtdPjtcbiAgICBnZXRBbGxEZWNyeXB0ZWQ6ICgpID0+IFByb21pc2U8U2VuZFZpZXdbXT47XG4gICAgc2F2ZVdpdGhTZXJ2ZXI6IChzZW5kRGF0YTogW1NlbmQsIEVuY0FycmF5QnVmZmVyXSkgPT4gUHJvbWlzZTxhbnk+O1xuICAgIHVwc2VydDogKHNlbmQ6IFNlbmREYXRhIHwgU2VuZERhdGFbXSkgPT4gUHJvbWlzZTxhbnk+O1xuICAgIHJlcGxhY2U6IChzZW5kczogeyBbaWQ6IHN0cmluZ106IFNlbmREYXRhOyB9KSA9PiBQcm9taXNlPGFueT47XG4gICAgY2xlYXI6ICh1c2VySWQ6IHN0cmluZykgPT4gUHJvbWlzZTxhbnk+O1xuICAgIGRlbGV0ZTogKGlkOiBzdHJpbmcgfCBzdHJpbmdbXSkgPT4gUHJvbWlzZTxhbnk+O1xuICAgIGRlbGV0ZVdpdGhTZXJ2ZXI6IChpZDogc3RyaW5nKSA9PiBQcm9taXNlPGFueT47XG4gICAgcmVtb3ZlUGFzc3dvcmRXaXRoU2VydmVyOiAoaWQ6IHN0cmluZykgPT4gUHJvbWlzZTxhbnk+O1xufVxuIiwiZXhwb3J0IGFic3RyYWN0IGNsYXNzIFNldHRpbmdzU2VydmljZSB7XG4gICAgY2xlYXJDYWNoZTogKCkgPT4gdm9pZDtcbiAgICBnZXRFcXVpdmFsZW50RG9tYWluczogKCkgPT4gUHJvbWlzZTxhbnk+O1xuICAgIHNldEVxdWl2YWxlbnREb21haW5zOiAoZXF1aXZhbGVudERvbWFpbnM6IHN0cmluZ1tdW10pID0+IFByb21pc2U8YW55PjtcbiAgICBjbGVhcjogKHVzZXJJZDogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+O1xufVxuIiwiZXhwb3J0IGFic3RyYWN0IGNsYXNzIFN0YXRlU2VydmljZSB7XG4gICAgZ2V0OiA8VD4oa2V5OiBzdHJpbmcpID0+IFByb21pc2U8VD47XG4gICAgc2F2ZTogKGtleTogc3RyaW5nLCBvYmo6IGFueSkgPT4gUHJvbWlzZTxhbnk+O1xuICAgIHJlbW92ZTogKGtleTogc3RyaW5nKSA9PiBQcm9taXNlPGFueT47XG4gICAgcHVyZ2U6ICgpID0+IFByb21pc2U8YW55Pjtcbn1cbiIsImV4cG9ydCBhYnN0cmFjdCBjbGFzcyBTdG9yYWdlU2VydmljZSB7XG4gICAgZ2V0OiA8VD4oa2V5OiBzdHJpbmcsIG9wdGlvbnM/OiBTdG9yYWdlU2VydmljZU9wdGlvbnMpID0+IFByb21pc2U8VD47XG4gICAgaGFzOiAoa2V5OiBzdHJpbmcsIG9wdGlvbnM/OiBTdG9yYWdlU2VydmljZU9wdGlvbnMpID0+IFByb21pc2U8Ym9vbGVhbj47XG4gICAgc2F2ZTogKGtleTogc3RyaW5nLCBvYmo6IGFueSwgb3B0aW9ucz86IFN0b3JhZ2VTZXJ2aWNlT3B0aW9ucykgPT4gUHJvbWlzZTxhbnk+O1xuICAgIHJlbW92ZTogKGtleTogc3RyaW5nLCBvcHRpb25zPzogU3RvcmFnZVNlcnZpY2VPcHRpb25zKSA9PiBQcm9taXNlPGFueT47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RvcmFnZVNlcnZpY2VPcHRpb25zIHtcbiAgICBrZXlTdWZmaXg6IEtleVN1ZmZpeE9wdGlvbnM7XG59XG5cbmV4cG9ydCB0eXBlIEtleVN1ZmZpeE9wdGlvbnMgPSAnYXV0bycgfCAnYmlvbWV0cmljJztcbiIsImltcG9ydCB7XG4gICAgU3luY0NpcGhlck5vdGlmaWNhdGlvbixcbiAgICBTeW5jRm9sZGVyTm90aWZpY2F0aW9uLFxuICAgIFN5bmNTZW5kTm90aWZpY2F0aW9uLFxufSBmcm9tICcuLi9tb2RlbHMvcmVzcG9uc2Uvbm90aWZpY2F0aW9uUmVzcG9uc2UnO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgU3luY1NlcnZpY2Uge1xuICAgIHN5bmNJblByb2dyZXNzOiBib29sZWFuO1xuXG4gICAgZ2V0TGFzdFN5bmM6ICgpID0+IFByb21pc2U8RGF0ZT47XG4gICAgc2V0TGFzdFN5bmM6IChkYXRlOiBEYXRlKSA9PiBQcm9taXNlPGFueT47XG4gICAgZnVsbFN5bmM6IChmb3JjZVN5bmM6IGJvb2xlYW4sIGFsbG93VGhyb3dPbkVycm9yPzogYm9vbGVhbikgPT4gUHJvbWlzZTxib29sZWFuPjtcbiAgICBzeW5jVXBzZXJ0Rm9sZGVyOiAobm90aWZpY2F0aW9uOiBTeW5jRm9sZGVyTm90aWZpY2F0aW9uLCBpc0VkaXQ6IGJvb2xlYW4pID0+IFByb21pc2U8Ym9vbGVhbj47XG4gICAgc3luY0RlbGV0ZUZvbGRlcjogKG5vdGlmaWNhdGlvbjogU3luY0ZvbGRlck5vdGlmaWNhdGlvbikgPT4gUHJvbWlzZTxib29sZWFuPjtcbiAgICBzeW5jVXBzZXJ0Q2lwaGVyOiAobm90aWZpY2F0aW9uOiBTeW5jQ2lwaGVyTm90aWZpY2F0aW9uLCBpc0VkaXQ6IGJvb2xlYW4pID0+IFByb21pc2U8Ym9vbGVhbj47XG4gICAgc3luY0RlbGV0ZUNpcGhlcjogKG5vdGlmaWNhdGlvbjogU3luY0ZvbGRlck5vdGlmaWNhdGlvbikgPT4gUHJvbWlzZTxib29sZWFuPjtcbiAgICBzeW5jVXBzZXJ0U2VuZDogKG5vdGlmaWNhdGlvbjogU3luY1NlbmROb3RpZmljYXRpb24sIGlzRWRpdDogYm9vbGVhbikgPT4gUHJvbWlzZTxib29sZWFuPjtcbiAgICBzeW5jRGVsZXRlU2VuZDogKG5vdGlmaWNhdGlvbjogU3luY1NlbmROb3RpZmljYXRpb24pID0+IFByb21pc2U8Ym9vbGVhbj47XG59XG4iLCJleHBvcnQgYWJzdHJhY3QgY2xhc3MgVG9rZW5TZXJ2aWNlIHtcbiAgICB0b2tlbjogc3RyaW5nO1xuICAgIGRlY29kZWRUb2tlbjogYW55O1xuICAgIHJlZnJlc2hUb2tlbjogc3RyaW5nO1xuICAgIHNldFRva2VuczogKGFjY2Vzc1Rva2VuOiBzdHJpbmcsIHJlZnJlc2hUb2tlbjogc3RyaW5nLCBjbGllbnRJZENsaWVudFNlY3JldDogW3N0cmluZywgc3RyaW5nXSkgPT4gUHJvbWlzZTxhbnk+O1xuICAgIHNldFRva2VuOiAodG9rZW46IHN0cmluZykgPT4gUHJvbWlzZTxhbnk+O1xuICAgIGdldFRva2VuOiAoKSA9PiBQcm9taXNlPHN0cmluZz47XG4gICAgc2V0UmVmcmVzaFRva2VuOiAocmVmcmVzaFRva2VuOiBzdHJpbmcpID0+IFByb21pc2U8YW55PjtcbiAgICBnZXRSZWZyZXNoVG9rZW46ICgpID0+IFByb21pc2U8c3RyaW5nPjtcbiAgICBzZXRDbGllbnRJZDogKGNsaWVudElkOiBzdHJpbmcpID0+IFByb21pc2U8YW55PjtcbiAgICBnZXRDbGllbnRJZDogKCkgPT4gUHJvbWlzZTxzdHJpbmc+O1xuICAgIHNldENsaWVudFNlY3JldDogKGNsaWVudFNlY3JldDogc3RyaW5nKSA9PiBQcm9taXNlPGFueT47XG4gICAgZ2V0Q2xpZW50U2VjcmV0OiAoKSA9PiBQcm9taXNlPHN0cmluZz47XG4gICAgdG9nZ2xlVG9rZW5zOiAoKSA9PiBQcm9taXNlPGFueT47XG4gICAgc2V0VHdvRmFjdG9yVG9rZW46ICh0b2tlbjogc3RyaW5nLCBlbWFpbDogc3RyaW5nKSA9PiBQcm9taXNlPGFueT47XG4gICAgZ2V0VHdvRmFjdG9yVG9rZW46IChlbWFpbDogc3RyaW5nKSA9PiBQcm9taXNlPHN0cmluZz47XG4gICAgY2xlYXJUd29GYWN0b3JUb2tlbjogKGVtYWlsOiBzdHJpbmcpID0+IFByb21pc2U8YW55PjtcbiAgICBjbGVhclRva2VuOiAoKSA9PiBQcm9taXNlPGFueT47XG4gICAgZGVjb2RlVG9rZW46ICgpID0+IGFueTtcbiAgICBnZXRUb2tlbkV4cGlyYXRpb25EYXRlOiAoKSA9PiBEYXRlO1xuICAgIHRva2VuU2Vjb25kc1JlbWFpbmluZzogKG9mZnNldFNlY29uZHM/OiBudW1iZXIpID0+IG51bWJlcjtcbiAgICB0b2tlbk5lZWRzUmVmcmVzaDogKG1pbnV0ZXM/OiBudW1iZXIpID0+IGJvb2xlYW47XG4gICAgZ2V0VXNlcklkOiAoKSA9PiBzdHJpbmc7XG4gICAgZ2V0RW1haWw6ICgpID0+IHN0cmluZztcbiAgICBnZXRFbWFpbFZlcmlmaWVkOiAoKSA9PiBib29sZWFuO1xuICAgIGdldE5hbWU6ICgpID0+IHN0cmluZztcbiAgICBnZXRQcmVtaXVtOiAoKSA9PiBib29sZWFuO1xuICAgIGdldElzc3VlcjogKCkgPT4gc3RyaW5nO1xufVxuIiwiZXhwb3J0IGFic3RyYWN0IGNsYXNzIFRvdHBTZXJ2aWNlIHtcbiAgICBnZXRDb2RlOiAoa2V5OiBzdHJpbmcpID0+IFByb21pc2U8c3RyaW5nPjtcbiAgICBnZXRUaW1lSW50ZXJ2YWw6IChrZXk6IHN0cmluZykgPT4gbnVtYmVyO1xuICAgIGlzQXV0b0NvcHlFbmFibGVkOiAoKSA9PiBQcm9taXNlPGJvb2xlYW4+O1xufVxuIiwiaW1wb3J0IHsgT3JnYW5pemF0aW9uRGF0YSB9IGZyb20gJy4uL21vZGVscy9kYXRhL29yZ2FuaXphdGlvbkRhdGEnO1xuaW1wb3J0IHsgUHJvdmlkZXJEYXRhIH0gZnJvbSAnLi4vbW9kZWxzL2RhdGEvcHJvdmlkZXJEYXRhJztcbmltcG9ydCB7IE9yZ2FuaXphdGlvbiB9IGZyb20gJy4uL21vZGVscy9kb21haW4vb3JnYW5pemF0aW9uJztcbmltcG9ydCB7IFByb3ZpZGVyIH0gZnJvbSAnLi4vbW9kZWxzL2RvbWFpbi9wcm92aWRlcic7XG5cbmltcG9ydCB7IEtkZlR5cGUgfSBmcm9tICcuLi9lbnVtcy9rZGZUeXBlJztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFVzZXJTZXJ2aWNlIHtcbiAgICBzZXRJbmZvcm1hdGlvbjogKHVzZXJJZDogc3RyaW5nLCBlbWFpbDogc3RyaW5nLCBrZGY6IEtkZlR5cGUsIGtkZkl0ZXJhdGlvbnM6IG51bWJlcikgPT4gUHJvbWlzZTxhbnk+O1xuICAgIHNldEVtYWlsVmVyaWZpZWQ6IChlbWFpbFZlcmlmaWVkOiBib29sZWFuKSA9PiBQcm9taXNlPGFueT47XG4gICAgc2V0U2VjdXJpdHlTdGFtcDogKHN0YW1wOiBzdHJpbmcpID0+IFByb21pc2U8YW55PjtcbiAgICBzZXRGb3JjZVBhc3N3b3JkUmVzZXQ6IChmb3JjZVBhc3N3b3JkUmVzZXQ6IGJvb2xlYW4pID0+IFByb21pc2U8YW55PjtcbiAgICBnZXRVc2VySWQ6ICgpID0+IFByb21pc2U8c3RyaW5nPjtcbiAgICBnZXRFbWFpbDogKCkgPT4gUHJvbWlzZTxzdHJpbmc+O1xuICAgIGdldFNlY3VyaXR5U3RhbXA6ICgpID0+IFByb21pc2U8c3RyaW5nPjtcbiAgICBnZXRLZGY6ICgpID0+IFByb21pc2U8S2RmVHlwZT47XG4gICAgZ2V0S2RmSXRlcmF0aW9uczogKCkgPT4gUHJvbWlzZTxudW1iZXI+O1xuICAgIGdldEVtYWlsVmVyaWZpZWQ6ICgpID0+IFByb21pc2U8Ym9vbGVhbj47XG4gICAgZ2V0Rm9yY2VQYXNzd29yZFJlc2V0OiAoKSA9PiBQcm9taXNlPGJvb2xlYW4+O1xuICAgIGNsZWFyOiAoKSA9PiBQcm9taXNlPGFueT47XG4gICAgaXNBdXRoZW50aWNhdGVkOiAoKSA9PiBQcm9taXNlPGJvb2xlYW4+O1xuICAgIGNhbkFjY2Vzc1ByZW1pdW06ICgpID0+IFByb21pc2U8Ym9vbGVhbj47XG4gICAgZ2V0T3JnYW5pemF0aW9uOiAoaWQ6IHN0cmluZykgPT4gUHJvbWlzZTxPcmdhbml6YXRpb24+O1xuICAgIGdldE9yZ2FuaXphdGlvbkJ5SWRlbnRpZmllcjogKGlkZW50aWZpZXI6IHN0cmluZykgPT4gUHJvbWlzZTxPcmdhbml6YXRpb24+O1xuICAgIGdldEFsbE9yZ2FuaXphdGlvbnM6ICgpID0+IFByb21pc2U8T3JnYW5pemF0aW9uW10+O1xuICAgIHJlcGxhY2VPcmdhbml6YXRpb25zOiAob3JnYW5pemF0aW9uczogeyBbaWQ6IHN0cmluZ106IE9yZ2FuaXphdGlvbkRhdGE7IH0pID0+IFByb21pc2U8YW55PjtcbiAgICBjbGVhck9yZ2FuaXphdGlvbnM6ICh1c2VySWQ6IHN0cmluZykgPT4gUHJvbWlzZTxhbnk+O1xuICAgIGdldFByb3ZpZGVyOiAoaWQ6IHN0cmluZykgPT4gUHJvbWlzZTxQcm92aWRlcj47XG4gICAgZ2V0QWxsUHJvdmlkZXJzOiAoKSA9PiBQcm9taXNlPFByb3ZpZGVyW10+O1xuICAgIHJlcGxhY2VQcm92aWRlcnM6IChwcm92aWRlcnM6IHsgW2lkOiBzdHJpbmddOiBQcm92aWRlckRhdGE7IH0pID0+IFByb21pc2U8YW55PjtcbiAgICBjbGVhclByb3ZpZGVyczogKHVzZXJJZDogc3RyaW5nKSA9PiBQcm9taXNlPGFueT47XG59XG4iLCJpbXBvcnQgeyBFbmNTdHJpbmcgfSBmcm9tICcuLi9tb2RlbHMvZG9tYWluL2VuY1N0cmluZyc7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBWYXVsdFRpbWVvdXRTZXJ2aWNlIHtcbiAgICBiaW9tZXRyaWNMb2NrZWQ6IGJvb2xlYW47XG4gICAgZXZlckJlZW5VbmxvY2tlZDogYm9vbGVhbjtcbiAgICBwaW5Qcm90ZWN0ZWRLZXk6IEVuY1N0cmluZztcbiAgICBpc0xvY2tlZDogKCkgPT4gUHJvbWlzZTxib29sZWFuPjtcbiAgICBjaGVja1ZhdWx0VGltZW91dDogKCkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgICBsb2NrOiAoYWxsb3dTb2Z0TG9jaz86IGJvb2xlYW4pID0+IFByb21pc2U8dm9pZD47XG4gICAgbG9nT3V0OiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuICAgIHNldFZhdWx0VGltZW91dE9wdGlvbnM6ICh2YXVsdFRpbWVvdXQ6IG51bWJlciwgdmF1bHRUaW1lb3V0QWN0aW9uOiBzdHJpbmcpID0+IFByb21pc2U8dm9pZD47XG4gICAgZ2V0VmF1bHRUaW1lb3V0OiAoKSA9PiBQcm9taXNlPG51bWJlcj47XG4gICAgaXNQaW5Mb2NrU2V0OiAoKSA9PiBQcm9taXNlPFtib29sZWFuLCBib29sZWFuXT47XG4gICAgaXNCaW9tZXRyaWNMb2NrU2V0OiAoKSA9PiBQcm9taXNlPGJvb2xlYW4+O1xuICAgIGNsZWFyOiAoKSA9PiBQcm9taXNlPGFueT47XG59XG4iLCJleHBvcnQgZW51bSBDaXBoZXJSZXByb21wdFR5cGUge1xuICAgIE5vbmUgPSAwLFxuICAgIFBhc3N3b3JkID0gMSxcbn1cbiIsImV4cG9ydCBlbnVtIENpcGhlclR5cGUge1xuICAgIExvZ2luID0gMSxcbiAgICBTZWN1cmVOb3RlID0gMixcbiAgICBDYXJkID0gMyxcbiAgICBJZGVudGl0eSA9IDQsXG59XG4iLCJleHBvcnQgZW51bSBEZXZpY2VUeXBlIHtcbiAgICBBbmRyb2lkID0gMCxcbiAgICBpT1MgPSAxLFxuICAgIENocm9tZUV4dGVuc2lvbiA9IDIsXG4gICAgRmlyZWZveEV4dGVuc2lvbiA9IDMsXG4gICAgT3BlcmFFeHRlbnNpb24gPSA0LFxuICAgIEVkZ2VFeHRlbnNpb24gPSA1LFxuICAgIFdpbmRvd3NEZXNrdG9wID0gNixcbiAgICBNYWNPc0Rlc2t0b3AgPSA3LFxuICAgIExpbnV4RGVza3RvcCA9IDgsXG4gICAgQ2hyb21lQnJvd3NlciA9IDksXG4gICAgRmlyZWZveEJyb3dzZXIgPSAxMCxcbiAgICBPcGVyYUJyb3dzZXIgPSAxMSxcbiAgICBFZGdlQnJvd3NlciA9IDEyLFxuICAgIElFQnJvd3NlciA9IDEzLFxuICAgIFVua25vd25Ccm93c2VyID0gMTQsXG4gICAgQW5kcm9pZEFtYXpvbiA9IDE1LFxuICAgIFVXUCA9IDE2LFxuICAgIFNhZmFyaUJyb3dzZXIgPSAxNyxcbiAgICBWaXZhbGRpQnJvd3NlciA9IDE4LFxuICAgIFZpdmFsZGlFeHRlbnNpb24gPSAxOSxcbiAgICBTYWZhcmlFeHRlbnNpb24gPSAyMCxcbn1cbiIsImV4cG9ydCBlbnVtIEVuY3J5cHRpb25UeXBlIHtcbiAgICBBZXNDYmMyNTZfQjY0ID0gMCxcbiAgICBBZXNDYmMxMjhfSG1hY1NoYTI1Nl9CNjQgPSAxLFxuICAgIEFlc0NiYzI1Nl9IbWFjU2hhMjU2X0I2NCA9IDIsXG4gICAgUnNhMjA0OF9PYWVwU2hhMjU2X0I2NCA9IDMsXG4gICAgUnNhMjA0OF9PYWVwU2hhMV9CNjQgPSA0LFxuICAgIFJzYTIwNDhfT2FlcFNoYTI1Nl9IbWFjU2hhMjU2X0I2NCA9IDUsXG4gICAgUnNhMjA0OF9PYWVwU2hhMV9IbWFjU2hhMjU2X0I2NCA9IDYsXG59XG4iLCJleHBvcnQgZW51bSBFdmVudFR5cGUge1xuICAgIFVzZXJfTG9nZ2VkSW4gPSAxMDAwLFxuICAgIFVzZXJfQ2hhbmdlZFBhc3N3b3JkID0gMTAwMSxcbiAgICBVc2VyX1VwZGF0ZWQyZmEgPSAxMDAyLFxuICAgIFVzZXJfRGlzYWJsZWQyZmEgPSAxMDAzLFxuICAgIFVzZXJfUmVjb3ZlcmVkMmZhID0gMTAwNCxcbiAgICBVc2VyX0ZhaWxlZExvZ0luID0gMTAwNSxcbiAgICBVc2VyX0ZhaWxlZExvZ0luMmZhID0gMTAwNixcbiAgICBVc2VyX0NsaWVudEV4cG9ydGVkVmF1bHQgPSAxMDA3LFxuICAgIFVzZXJfVXBkYXRlZFRlbXBQYXNzd29yZCA9IDEwMDgsXG5cbiAgICBDaXBoZXJfQ3JlYXRlZCA9IDExMDAsXG4gICAgQ2lwaGVyX1VwZGF0ZWQgPSAxMTAxLFxuICAgIENpcGhlcl9EZWxldGVkID0gMTEwMixcbiAgICBDaXBoZXJfQXR0YWNobWVudENyZWF0ZWQgPSAxMTAzLFxuICAgIENpcGhlcl9BdHRhY2htZW50RGVsZXRlZCA9IDExMDQsXG4gICAgQ2lwaGVyX1NoYXJlZCA9IDExMDUsXG4gICAgQ2lwaGVyX1VwZGF0ZWRDb2xsZWN0aW9ucyA9IDExMDYsXG4gICAgQ2lwaGVyX0NsaWVudFZpZXdlZCA9IDExMDcsXG4gICAgQ2lwaGVyX0NsaWVudFRvZ2dsZWRQYXNzd29yZFZpc2libGUgPSAxMTA4LFxuICAgIENpcGhlcl9DbGllbnRUb2dnbGVkSGlkZGVuRmllbGRWaXNpYmxlID0gMTEwOSxcbiAgICBDaXBoZXJfQ2xpZW50VG9nZ2xlZENhcmRDb2RlVmlzaWJsZSA9IDExMTAsXG4gICAgQ2lwaGVyX0NsaWVudENvcGllZFBhc3N3b3JkID0gMTExMSxcbiAgICBDaXBoZXJfQ2xpZW50Q29waWVkSGlkZGVuRmllbGQgPSAxMTEyLFxuICAgIENpcGhlcl9DbGllbnRDb3BpZWRDYXJkQ29kZSA9IDExMTMsXG4gICAgQ2lwaGVyX0NsaWVudEF1dG9maWxsZWQgPSAxMTE0LFxuICAgIENpcGhlcl9Tb2Z0RGVsZXRlZCA9IDExMTUsXG4gICAgQ2lwaGVyX1Jlc3RvcmVkID0gMTExNixcbiAgICBDaXBoZXJfQ2xpZW50VG9nZ2xlZENhcmROdW1iZXJWaXNpYmxlID0gMTExNyxcblxuICAgIENvbGxlY3Rpb25fQ3JlYXRlZCA9IDEzMDAsXG4gICAgQ29sbGVjdGlvbl9VcGRhdGVkID0gMTMwMSxcbiAgICBDb2xsZWN0aW9uX0RlbGV0ZWQgPSAxMzAyLFxuXG4gICAgR3JvdXBfQ3JlYXRlZCA9IDE0MDAsXG4gICAgR3JvdXBfVXBkYXRlZCA9IDE0MDEsXG4gICAgR3JvdXBfRGVsZXRlZCA9IDE0MDIsXG5cbiAgICBPcmdhbml6YXRpb25Vc2VyX0ludml0ZWQgPSAxNTAwLFxuICAgIE9yZ2FuaXphdGlvblVzZXJfQ29uZmlybWVkID0gMTUwMSxcbiAgICBPcmdhbml6YXRpb25Vc2VyX1VwZGF0ZWQgPSAxNTAyLFxuICAgIE9yZ2FuaXphdGlvblVzZXJfUmVtb3ZlZCA9IDE1MDMsXG4gICAgT3JnYW5pemF0aW9uVXNlcl9VcGRhdGVkR3JvdXBzID0gMTUwNCxcbiAgICBPcmdhbml6YXRpb25Vc2VyX1VubGlua2VkU3NvID0gMTUwNSxcbiAgICBPcmdhbml6YXRpb25Vc2VyX1Jlc2V0UGFzc3dvcmRfRW5yb2xsID0gMTUwNixcbiAgICBPcmdhbml6YXRpb25Vc2VyX1Jlc2V0UGFzc3dvcmRfV2l0aGRyYXcgPSAxNTA3LFxuICAgIE9yZ2FuaXphdGlvblVzZXJfQWRtaW5SZXNldFBhc3N3b3JkID0gMTUwOCxcbiAgICBPcmdhbml6YXRpb25Vc2VyX1Jlc2V0U3NvTGluayA9IDE1MDksXG5cbiAgICBPcmdhbml6YXRpb25fVXBkYXRlZCA9IDE2MDAsXG4gICAgT3JnYW5pemF0aW9uX1B1cmdlZFZhdWx0ID0gMTYwMSxcbiAgICAvLyBPcmdhbml6YXRpb25fQ2xpZW50RXhwb3J0ZWRWYXVsdCA9IDE2MDIsXG4gICAgT3JnYW5pemF0aW9uX1ZhdWx0QWNjZXNzZWQgPSAxNjAzLFxuXG4gICAgUG9saWN5X1VwZGF0ZWQgPSAxNzAwLFxuXG4gICAgUHJvdmlkZXJVc2VyX0ludml0ZWQgPSAxODAwLFxuICAgIFByb3ZpZGVyVXNlcl9Db25maXJtZWQgPSAxODAxLFxuICAgIFByb3ZpZGVyVXNlcl9VcGRhdGVkID0gMTgwMixcbiAgICBQcm92aWRlclVzZXJfUmVtb3ZlZCA9IDE4MDMsXG5cbiAgICBQcm92aWRlck9yZ2FuaXphdGlvbl9DcmVhdGVkID0gMTkwMCxcbiAgICBQcm92aWRlck9yZ2FuaXphdGlvbl9BZGRlZCA9IDE5MDEsXG4gICAgUHJvdmlkZXJPcmdhbml6YXRpb25fUmVtb3ZlZCA9IDE5MDIsXG4gICAgUHJvdmlkZXJPcmdhbml6YXRpb25fVmF1bHRBY2Nlc3NlZCA9IDE5MDMsXG59XG4iLCJleHBvcnQgZW51bSBGaWVsZFR5cGUge1xuICAgIFRleHQgPSAwLFxuICAgIEhpZGRlbiA9IDEsXG4gICAgQm9vbGVhbiA9IDIsXG4gICAgTGlua2VkID0gMyxcbn1cbiIsImV4cG9ydCBlbnVtIEhhc2hQdXJwb3NlIHtcbiAgICBTZXJ2ZXJBdXRob3JpemF0aW9uID0gMSxcbiAgICBMb2NhbEF1dGhvcml6YXRpb24gPSAyLFxufVxuIiwiZXhwb3J0IGVudW0gS2RmVHlwZSB7XG4gICAgUEJLREYyX1NIQTI1NiA9IDAsXG59XG4iLCJleHBvcnQgdHlwZSBMaW5rZWRJZFR5cGUgPSBMb2dpbkxpbmtlZElkIHwgQ2FyZExpbmtlZElkIHwgSWRlbnRpdHlMaW5rZWRJZDtcblxuLy8gTG9naW5WaWV3XG5leHBvcnQgZW51bSBMb2dpbkxpbmtlZElkIHtcbiAgICBVc2VybmFtZSA9IDEwMCxcbiAgICBQYXNzd29yZCA9IDEwMSxcbn1cblxuLy8gQ2FyZFZpZXdcbmV4cG9ydCBlbnVtIENhcmRMaW5rZWRJZCB7XG4gICAgQ2FyZGhvbGRlck5hbWUgPSAzMDAsXG4gICAgRXhwTW9udGggPSAzMDEsXG4gICAgRXhwWWVhciA9IDMwMixcbiAgICBDb2RlID0gMzAzLFxuICAgIEJyYW5kID0gMzA0LFxuICAgIE51bWJlciA9IDMwNSxcbn1cblxuLy8gSWRlbnRpdHlWaWV3XG5leHBvcnQgZW51bSBJZGVudGl0eUxpbmtlZElkIHtcbiAgICBUaXRsZSA9IDQwMCxcbiAgICBNaWRkbGVOYW1lID0gNDAxLFxuICAgIEFkZHJlc3MxID0gNDAyLFxuICAgIEFkZHJlc3MyID0gNDAzLFxuICAgIEFkZHJlc3MzID0gNDA0LFxuICAgIENpdHkgPSA0MDUsXG4gICAgU3RhdGUgPSA0MDYsXG4gICAgUG9zdGFsQ29kZSA9IDQwNyxcbiAgICBDb3VudHJ5ID0gNDA4LFxuICAgIENvbXBhbnkgPSA0MDksXG4gICAgRW1haWwgPSA0MTAsXG4gICAgUGhvbmUgPSA0MTEsXG4gICAgU3NuID0gNDEyLFxuICAgIFVzZXJuYW1lID0gNDEzLFxuICAgIFBhc3Nwb3J0TnVtYmVyID0gNDE0LFxuICAgIExpY2Vuc2VOdW1iZXIgPSA0MTUsXG4gICAgRmlyc3ROYW1lID0gNDE2LFxuICAgIExhc3ROYW1lID0gNDE3LFxuICAgIEZ1bGxOYW1lID0gNDE4LFxufVxuIiwiZXhwb3J0IGVudW0gT3JnYW5pemF0aW9uVXNlclN0YXR1c1R5cGUge1xuICAgIEludml0ZWQgPSAwLFxuICAgIEFjY2VwdGVkID0gMSxcbiAgICBDb25maXJtZWQgPSAyLFxufVxuIiwiZXhwb3J0IGVudW0gUG9saWN5VHlwZSB7XG4gICAgVHdvRmFjdG9yQXV0aGVudGljYXRpb24gPSAwLCAvLyBSZXF1aXJlcyB1c2VycyB0byBoYXZlIDJmYSBlbmFibGVkXG4gICAgTWFzdGVyUGFzc3dvcmQgPSAxLCAvLyBTZXRzIG1pbmltdW0gcmVxdWlyZW1lbnRzIGZvciBtYXN0ZXIgcGFzc3dvcmQgY29tcGxleGl0eVxuICAgIFBhc3N3b3JkR2VuZXJhdG9yID0gMiwgLy8gU2V0cyBtaW5pbXVtIHJlcXVpcmVtZW50cy9kZWZhdWx0IHR5cGUgZm9yIGdlbmVyYXRlZCBwYXNzd29yZHMvcGFzc3BocmFzZXNcbiAgICBTaW5nbGVPcmcgPSAzLCAvLyBBbGxvd3MgdXNlcnMgdG8gb25seSBiZSBhcGFydCBvZiBvbmUgb3JnYW5pemF0aW9uXG4gICAgUmVxdWlyZVNzbyA9IDQsIC8vIFJlcXVpcmVzIHVzZXJzIHRvIGF1dGhlbnRpY2F0ZSB3aXRoIFNTT1xuICAgIFBlcnNvbmFsT3duZXJzaGlwID0gNSwgLy8gRGlzYWJsZXMgcGVyc29uYWwgdmF1bHQgb3duZXJzaGlwIGZvciBhZGRpbmcvY2xvbmluZyBpdGVtc1xuICAgIERpc2FibGVTZW5kID0gNiwgLy8gRGlzYWJsZXMgdGhlIGFiaWxpdHkgdG8gY3JlYXRlIGFuZCBlZGl0IEJpdHdhcmRlbiBTZW5kc1xuICAgIFNlbmRPcHRpb25zID0gNywgLy8gU2V0cyByZXN0cmljdGlvbnMgb3IgZGVmYXVsdHMgZm9yIEJpdHdhcmRlbiBTZW5kc1xuICAgIFJlc2V0UGFzc3dvcmQgPSA4LCAvLyBBbGxvd3Mgb3JncyB0byB1c2UgcmVzZXQgcGFzc3dvcmQgOiBhbHNvIGNhbiBlbmFibGUgYXV0by1lbnJvbGxtZW50IGR1cmluZyBpbnZpdGUgZmxvd1xuICAgIE1heGltdW1WYXVsdFRpbWVvdXQgPSA5LCAvLyBTZXRzIHRoZSBtYXhpbXVtIGFsbG93ZWQgdmF1bHQgdGltZW91dFxuICAgIERpc2FibGVQZXJzb25hbFZhdWx0RXhwb3J0ID0gMTAsIC8vIERpc2FibGUgcGVyc29uYWwgdmF1bHQgZXhwb3J0XG59XG4iLCJleHBvcnQgZW51bSBTZWN1cmVOb3RlVHlwZSB7XG4gICAgR2VuZXJpYyA9IDAsXG59XG4iLCJleHBvcnQgZW51bSBTZW5kVHlwZSB7XG4gICAgVGV4dCA9IDAsXG4gICAgRmlsZSA9IDEsXG59XG4iLCJleHBvcnQgZW51bSBUaGVtZVR5cGUge1xuICAgIFN5c3RlbSA9ICdzeXN0ZW0nLFxuICAgIExpZ2h0ID0gJ2xpZ2h0JyxcbiAgICBEYXJrID0gJ2RhcmsnLFxuICAgIE5vcmQgPSAnbm9yZCcsXG4gICAgU29sYXJpemVkRGFyayA9ICdzb2xhcml6ZWREYXJrJyxcbn1cbiIsImV4cG9ydCBlbnVtIFR3b0ZhY3RvclByb3ZpZGVyVHlwZSB7XG4gICAgQXV0aGVudGljYXRvciA9IDAsXG4gICAgRW1haWwgPSAxLFxuICAgIER1byA9IDIsXG4gICAgWXViaWtleSA9IDMsXG4gICAgVTJmID0gNCxcbiAgICBSZW1lbWJlciA9IDUsXG4gICAgT3JnYW5pemF0aW9uRHVvID0gNixcbiAgICBXZWJBdXRobiA9IDcsXG59XG4iLCJleHBvcnQgZW51bSBVcmlNYXRjaFR5cGUge1xuICAgIERvbWFpbiA9IDAsXG4gICAgSG9zdCA9IDEsXG4gICAgU3RhcnRzV2l0aCA9IDIsXG4gICAgRXhhY3QgPSAzLFxuICAgIFJlZ3VsYXJFeHByZXNzaW9uID0gNCxcbiAgICBOZXZlciA9IDUsXG59XG4iLCJpbXBvcnQgeyBJMThuU2VydmljZSB9IGZyb20gJy4uL2Fic3RyYWN0aW9ucy9pMThuLnNlcnZpY2UnO1xuaW1wb3J0IHsgSUZyYW1lQ29tcG9uZW50IH0gZnJvbSAnLi9pZnJhbWVfY29tcG9uZW50JztcblxuZXhwb3J0IGNsYXNzIENhcHRjaGFJRnJhbWUgZXh0ZW5kcyBJRnJhbWVDb21wb25lbnQge1xuICAgIGNvbnN0cnVjdG9yKHdpbjogV2luZG93LCB3ZWJWYXVsdFVybDogc3RyaW5nLFxuICAgICAgICBwcml2YXRlIGkxOG5TZXJ2aWNlOiBJMThuU2VydmljZSwgc3VjY2Vzc0NhbGxiYWNrOiAobWVzc2FnZTogc3RyaW5nKSA9PiBhbnksIGVycm9yQ2FsbGJhY2s6IChtZXNzYWdlOiBzdHJpbmcpID0+IGFueSxcbiAgICAgICAgaW5mb0NhbGxiYWNrOiAobWVzc2FnZTogc3RyaW5nKSA9PiBhbnkpIHtcbiAgICAgICAgc3VwZXIod2luLCB3ZWJWYXVsdFVybCwgJ2NhcHRjaGEtY29ubmVjdG9yLmh0bWwnLCAnaGNhcHRjaGFfaWZyYW1lJywgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrLCAobWVzc2FnZTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwYXJzZWRNZXNzYWdlID0gSlNPTi5wYXJzZShtZXNzYWdlKTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgKHBhcnNlZE1lc3NhZ2UpICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHRoaXMuaWZyYW1lLmhlaWdodCA9IChwYXJzZWRNZXNzYWdlLmhlaWdodCkudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmlmcmFtZS53aWR0aCA9IChwYXJzZWRNZXNzYWdlLndpZHRoKS50b1N0cmluZygpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpbmZvQ2FsbGJhY2socGFyc2VkTWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGluaXQoc2l0ZUtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHN1cGVyLmluaXRDb21wb25lbnQodGhpcy5jcmVhdGVQYXJhbXMoeyBzaXRlS2V5OiBzaXRlS2V5LCBsb2NhbGU6IHRoaXMuaTE4blNlcnZpY2UudHJhbnNsYXRpb25Mb2NhbGUgfSwgMSkpO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IEkxOG5TZXJ2aWNlIH0gZnJvbSAnLi4vYWJzdHJhY3Rpb25zL2kxOG4uc2VydmljZSc7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBJRnJhbWVDb21wb25lbnQge1xuICAgIGlmcmFtZTogSFRNTElGcmFtZUVsZW1lbnQ7XG4gICAgcHJpdmF0ZSBjb25uZWN0b3JMaW5rOiBIVE1MQW5jaG9yRWxlbWVudDtcbiAgICBwcml2YXRlIHBhcnNlRnVuY3Rpb24gPSB0aGlzLnBhcnNlTWVzc2FnZS5iaW5kKHRoaXMpO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSB3aW46IFdpbmRvdywgcHJvdGVjdGVkIHdlYlZhdWx0VXJsOiBzdHJpbmcsIHByaXZhdGUgcGF0aDogc3RyaW5nLCBwcml2YXRlIGlmcmFtZUlkOiBzdHJpbmcsXG4gICAgICAgIHB1YmxpYyBzdWNjZXNzQ2FsbGJhY2s/OiAobWVzc2FnZTogc3RyaW5nKSA9PiBhbnksXG4gICAgICAgIHB1YmxpYyBlcnJvckNhbGxiYWNrPzogKG1lc3NhZ2U6IHN0cmluZykgPT4gYW55LCBwdWJsaWMgaW5mb0NhbGxiYWNrPzogKG1lc3NhZ2U6IHN0cmluZykgPT4gYW55KSB7XG4gICAgICAgIHRoaXMuY29ubmVjdG9yTGluayA9IHdpbi5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgfVxuXG4gICAgc3RvcCgpIHtcbiAgICAgICAgdGhpcy5zZW5kTWVzc2FnZSgnc3RvcCcpO1xuICAgIH1cblxuICAgIHN0YXJ0KCkge1xuICAgICAgICB0aGlzLnNlbmRNZXNzYWdlKCdzdGFydCcpO1xuICAgIH1cblxuICAgIHNlbmRNZXNzYWdlKG1lc3NhZ2U6IGFueSkge1xuICAgICAgICBpZiAoIXRoaXMuaWZyYW1lIHx8ICF0aGlzLmlmcmFtZS5zcmMgfHwgIXRoaXMuaWZyYW1lLmNvbnRlbnRXaW5kb3cpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaWZyYW1lLmNvbnRlbnRXaW5kb3cucG9zdE1lc3NhZ2UobWVzc2FnZSwgdGhpcy5pZnJhbWUuc3JjKTtcbiAgICB9XG5cbiAgICBiYXNlNjRFbmNvZGUoc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gYnRvYShlbmNvZGVVUklDb21wb25lbnQoc3RyKS5yZXBsYWNlKC8lKFswLTlBLUZdezJ9KS9nLCAobWF0Y2gsIHAxKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSgoJzB4JyArIHAxKSBhcyBhbnkpO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgY2xlYW51cCgpIHtcbiAgICAgICAgdGhpcy53aW4ucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIHRoaXMucGFyc2VGdW5jdGlvbiwgZmFsc2UpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBjcmVhdGVQYXJhbXMoZGF0YTogYW55LCB2ZXJzaW9uOiBudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBVUkxTZWFyY2hQYXJhbXMoe1xuICAgICAgICAgICAgZGF0YTogdGhpcy5iYXNlNjRFbmNvZGUoSlNPTi5zdHJpbmdpZnkoZGF0YSkpLFxuICAgICAgICAgICAgcGFyZW50OiBlbmNvZGVVUklDb21wb25lbnQodGhpcy53aW4uZG9jdW1lbnQubG9jYXRpb24uaHJlZiksXG4gICAgICAgICAgICB2OiB2ZXJzaW9uLnRvU3RyaW5nKCksXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBpbml0Q29tcG9uZW50KHBhcmFtczogVVJMU2VhcmNoUGFyYW1zKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY29ubmVjdG9yTGluay5ocmVmID0gYCR7dGhpcy53ZWJWYXVsdFVybH0vJHt0aGlzLnBhdGh9PyR7cGFyYW1zfWA7XG4gICAgICAgIHRoaXMuaWZyYW1lID0gdGhpcy53aW4uZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5pZnJhbWVJZCkgYXMgSFRNTElGcmFtZUVsZW1lbnQ7XG4gICAgICAgIHRoaXMuaWZyYW1lLnNyYyA9IHRoaXMuY29ubmVjdG9yTGluay5ocmVmO1xuXG4gICAgICAgIHRoaXMud2luLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCB0aGlzLnBhcnNlRnVuY3Rpb24sIGZhbHNlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHBhcnNlTWVzc2FnZShldmVudDogTWVzc2FnZUV2ZW50KSB7XG4gICAgICAgIGlmICghdGhpcy52YWxpZE1lc3NhZ2UoZXZlbnQpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwYXJ0czogc3RyaW5nW10gPSBldmVudC5kYXRhLnNwbGl0KCd8Jyk7XG4gICAgICAgIGlmIChwYXJ0c1swXSA9PT0gJ3N1Y2Nlc3MnICYmIHRoaXMuc3VjY2Vzc0NhbGxiYWNrKSB7XG4gICAgICAgICAgICB0aGlzLnN1Y2Nlc3NDYWxsYmFjayhwYXJ0c1sxXSk7XG4gICAgICAgIH0gZWxzZSBpZiAocGFydHNbMF0gPT09ICdlcnJvcicgJiYgdGhpcy5lcnJvckNhbGxiYWNrKSB7XG4gICAgICAgICAgICB0aGlzLmVycm9yQ2FsbGJhY2socGFydHNbMV0pO1xuICAgICAgICB9IGVsc2UgaWYgKHBhcnRzWzBdID09PSAnaW5mbycgJiYgdGhpcy5pbmZvQ2FsbGJhY2spIHtcbiAgICAgICAgICAgIHRoaXMuaW5mb0NhbGxiYWNrKHBhcnRzWzFdKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgdmFsaWRNZXNzYWdlKGV2ZW50OiBNZXNzYWdlRXZlbnQpIHtcbiAgICAgICAgaWYgKGV2ZW50Lm9yaWdpbiA9PSBudWxsIHx8IGV2ZW50Lm9yaWdpbiA9PT0gJycgfHwgZXZlbnQub3JpZ2luICE9PSAodGhpcy5jb25uZWN0b3JMaW5rIGFzIGFueSkub3JpZ2luIHx8XG4gICAgICAgICAgICBldmVudC5kYXRhID09IG51bGwgfHwgdHlwZW9mIChldmVudC5kYXRhKSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBldmVudC5kYXRhLmluZGV4T2YoJ3N1Y2Nlc3N8JykgPT09IDAgfHwgZXZlbnQuZGF0YS5pbmRleE9mKCdlcnJvcnwnKSA9PT0gMCB8fFxuICAgICAgICAgICAgZXZlbnQuZGF0YS5pbmRleE9mKCdpbmZvfCcpID09PSAwO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IEl0ZW1WaWV3IH0gZnJvbSAnLi4vbW9kZWxzL3ZpZXcvaXRlbVZpZXcnO1xuXG5pbXBvcnQgeyBMaW5rZWRJZFR5cGUgfSBmcm9tICcuLi9lbnVtcy9saW5rZWRJZFR5cGUnO1xuXG5leHBvcnQgY2xhc3MgTGlua2VkTWV0YWRhdGEge1xuICAgIGNvbnN0cnVjdG9yKHJlYWRvbmx5IHByb3BlcnR5S2V5OiBzdHJpbmcsIHByaXZhdGUgcmVhZG9ubHkgX2kxOG5LZXk/OiBzdHJpbmcpIHsgfVxuXG4gICAgZ2V0IGkxOG5LZXkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pMThuS2V5ID8/IHRoaXMucHJvcGVydHlLZXk7XG4gICAgfVxufVxuXG4vKipcbiAqIEEgZGVjb3JhdG9yIHVzZWQgdG8gc2V0IG1ldGFkYXRhIHVzZWQgYnkgTGlua2VkIGN1c3RvbSBmaWVsZHMuIEFwcGx5IGl0IHRvIGEgY2xhc3MgcHJvcGVydHkgb3IgZ2V0dGVyIHRvIG1ha2UgaXRcbiAqICAgIGF2YWlsYWJsZSBhcyBhIExpbmtlZCBjdXN0b20gZmllbGQgb3B0aW9uLlxuICogQHBhcmFtIGlkIC0gQSB1bmlxdWUgdmFsdWUgdGhhdCBpcyBzYXZlZCBpbiB0aGUgRmllbGQgbW9kZWwuIEl0IGlzIHVzZWQgdG8gbG9vayB1cCB0aGUgZGVjb3JhdGVkIGNsYXNzIHByb3BlcnR5LlxuICogQHBhcmFtIGkxOG5LZXkgLSBUaGUgaTE4biBrZXkgdXNlZCB0byBkZXNjcmliZSB0aGUgZGVjb3JhdGVkIGNsYXNzIHByb3BlcnR5IGluIHRoZSBVSS4gSWYgaXQgaXMgbnVsbCwgdGhlbiB0aGUgbmFtZVxuICogICAgb2YgdGhlIGNsYXNzIHByb3BlcnR5IHdpbGwgYmUgdXNlZCBhcyB0aGUgaTE4biBrZXkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsaW5rZWRGaWVsZE9wdGlvbihpZDogTGlua2VkSWRUeXBlLCBpMThuS2V5Pzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIChwcm90b3R5cGU6IEl0ZW1WaWV3LCBwcm9wZXJ0eUtleTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGlmIChwcm90b3R5cGUubGlua2VkRmllbGRPcHRpb25zID09IG51bGwpIHtcbiAgICAgICAgICAgIHByb3RvdHlwZS5saW5rZWRGaWVsZE9wdGlvbnMgPSBuZXcgTWFwPExpbmtlZElkVHlwZSwgTGlua2VkTWV0YWRhdGE+KCk7XG4gICAgICAgIH1cblxuICAgICAgICBwcm90b3R5cGUubGlua2VkRmllbGRPcHRpb25zLnNldChpZCwgbmV3IExpbmtlZE1ldGFkYXRhKHByb3BlcnR5S2V5LCBpMThuS2V5KSk7XG4gICAgfTtcbn1cbiIsImltcG9ydCAqIGFzIHRsZGpzIGZyb20gJ3RsZGpzJztcblxuaW1wb3J0IHsgSTE4blNlcnZpY2UgfSBmcm9tICcuLi9hYnN0cmFjdGlvbnMvaTE4bi5zZXJ2aWNlJztcblxuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lXG5jb25zdCBub2RlVVJMID0gdHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgPyByZXF1aXJlKCd1cmwnKSA6IG51bGw7XG5cbmV4cG9ydCBjbGFzcyBVdGlscyB7XG4gICAgc3RhdGljIGluaXRlZCA9IGZhbHNlO1xuICAgIHN0YXRpYyBpc05hdGl2ZVNjcmlwdCA9IGZhbHNlO1xuICAgIHN0YXRpYyBpc05vZGUgPSBmYWxzZTtcbiAgICBzdGF0aWMgaXNCcm93c2VyID0gdHJ1ZTtcbiAgICBzdGF0aWMgaXNNb2JpbGVCcm93c2VyID0gZmFsc2U7XG4gICAgc3RhdGljIGlzQXBwbGVNb2JpbGVCcm93c2VyID0gZmFsc2U7XG4gICAgc3RhdGljIGdsb2JhbDogYW55ID0gbnVsbDtcbiAgICBzdGF0aWMgdGxkRW5kaW5nUmVnZXggPSAvLipcXC4oY29tfG5ldHxvcmd8ZWR1fHVrfGdvdnxjYXxkZXxqcHxmcnxhdXxydXxjaHxpb3xlc3x1c3xjb3x4eXp8aW5mb3xseXxtaWwpJC87XG4gICAgLy8gVHJhbnNwaWxlZCB2ZXJzaW9uIG9mIC9cXHB7RW1vamlfUHJlc2VudGF0aW9ufS9ndSB1c2luZyBodHRwczovL21vdGhlcmVmZi5pbi9yZWdleHB1LiBVc2VkIGZvciBjb21wYXRhYmlsaXR5IGluIG9sZGVyIGJyb3dzZXJzLlxuICAgIHN0YXRpYyByZWdleHBFbW9qaVByZXNlbnRhdGlvbiA9ICAvKD86W1xcdTIzMUFcXHUyMzFCXFx1MjNFOS1cXHUyM0VDXFx1MjNGMFxcdTIzRjNcXHUyNUZEXFx1MjVGRVxcdTI2MTRcXHUyNjE1XFx1MjY0OC1cXHUyNjUzXFx1MjY3RlxcdTI2OTNcXHUyNkExXFx1MjZBQVxcdTI2QUJcXHUyNkJEXFx1MjZCRVxcdTI2QzRcXHUyNkM1XFx1MjZDRVxcdTI2RDRcXHUyNkVBXFx1MjZGMlxcdTI2RjNcXHUyNkY1XFx1MjZGQVxcdTI2RkRcXHUyNzA1XFx1MjcwQVxcdTI3MEJcXHUyNzI4XFx1Mjc0Q1xcdTI3NEVcXHUyNzUzLVxcdTI3NTVcXHUyNzU3XFx1Mjc5NS1cXHUyNzk3XFx1MjdCMFxcdTI3QkZcXHUyQjFCXFx1MkIxQ1xcdTJCNTBcXHUyQjU1XXxcXHVEODNDW1xcdURDMDRcXHVEQ0NGXFx1REQ4RVxcdUREOTEtXFx1REQ5QVxcdURERTYtXFx1RERGRlxcdURFMDFcXHVERTFBXFx1REUyRlxcdURFMzItXFx1REUzNlxcdURFMzgtXFx1REUzQVxcdURFNTBcXHVERTUxXFx1REYwMC1cXHVERjIwXFx1REYyRC1cXHVERjM1XFx1REYzNy1cXHVERjdDXFx1REY3RS1cXHVERjkzXFx1REZBMC1cXHVERkNBXFx1REZDRi1cXHVERkQzXFx1REZFMC1cXHVERkYwXFx1REZGNFxcdURGRjgtXFx1REZGRl18XFx1RDgzRFtcXHVEQzAwLVxcdURDM0VcXHVEQzQwXFx1REM0Mi1cXHVEQ0ZDXFx1RENGRi1cXHVERDNEXFx1REQ0Qi1cXHVERDRFXFx1REQ1MC1cXHVERDY3XFx1REQ3QVxcdUREOTVcXHVERDk2XFx1RERBNFxcdURERkItXFx1REU0RlxcdURFODAtXFx1REVDNVxcdURFQ0NcXHVERUQwLVxcdURFRDJcXHVERUQ1LVxcdURFRDdcXHVERUVCXFx1REVFQ1xcdURFRjQtXFx1REVGQ1xcdURGRTAtXFx1REZFQl18XFx1RDgzRVtcXHVERDBDLVxcdUREM0FcXHVERDNDLVxcdURENDVcXHVERDQ3LVxcdURENzhcXHVERDdBLVxcdUREQ0JcXHVERENELVxcdURERkZcXHVERTcwLVxcdURFNzRcXHVERTc4LVxcdURFN0FcXHVERTgwLVxcdURFODZcXHVERTkwLVxcdURFQThcXHVERUIwLVxcdURFQjZcXHVERUMwLVxcdURFQzJcXHVERUQwLVxcdURFRDZdKS9nO1xuXG4gICAgc3RhdGljIGluaXQoKSB7XG4gICAgICAgIGlmIChVdGlscy5pbml0ZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIFV0aWxzLmluaXRlZCA9IHRydWU7XG4gICAgICAgIFV0aWxzLmlzTm9kZSA9IHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiAocHJvY2VzcyBhcyBhbnkpLnJlbGVhc2UgIT0gbnVsbCAmJlxuICAgICAgICAgICAgKHByb2Nlc3MgYXMgYW55KS5yZWxlYXNlLm5hbWUgPT09ICdub2RlJztcbiAgICAgICAgVXRpbHMuaXNCcm93c2VyID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCc7XG4gICAgICAgIFV0aWxzLmlzTmF0aXZlU2NyaXB0ID0gIVV0aWxzLmlzTm9kZSAmJiAhVXRpbHMuaXNCcm93c2VyO1xuICAgICAgICBVdGlscy5pc01vYmlsZUJyb3dzZXIgPSBVdGlscy5pc0Jyb3dzZXIgJiYgdGhpcy5pc01vYmlsZSh3aW5kb3cpO1xuICAgICAgICBVdGlscy5pc0FwcGxlTW9iaWxlQnJvd3NlciA9IFV0aWxzLmlzQnJvd3NlciAmJiB0aGlzLmlzQXBwbGVNb2JpbGUod2luZG93KTtcbiAgICAgICAgVXRpbHMuZ2xvYmFsID0gVXRpbHMuaXNOYXRpdmVTY3JpcHQgPyBnbG9iYWwgOiAoVXRpbHMuaXNOb2RlICYmICFVdGlscy5pc0Jyb3dzZXIgPyBnbG9iYWwgOiB3aW5kb3cpO1xuICAgIH1cblxuICAgIHN0YXRpYyBmcm9tQjY0VG9BcnJheShzdHI6IHN0cmluZyk6IFVpbnQ4QXJyYXkge1xuICAgICAgICBpZiAoVXRpbHMuaXNOb2RlIHx8IFV0aWxzLmlzTmF0aXZlU2NyaXB0KSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoQnVmZmVyLmZyb20oc3RyLCAnYmFzZTY0JykpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgYmluYXJ5U3RyaW5nID0gd2luZG93LmF0b2Ioc3RyKTtcbiAgICAgICAgICAgIGNvbnN0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoYmluYXJ5U3RyaW5nLmxlbmd0aCk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJpbmFyeVN0cmluZy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGJ5dGVzW2ldID0gYmluYXJ5U3RyaW5nLmNoYXJDb2RlQXQoaSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYnl0ZXM7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgZnJvbVVybEI2NFRvQXJyYXkoc3RyOiBzdHJpbmcpOiBVaW50OEFycmF5IHtcbiAgICAgICAgcmV0dXJuIFV0aWxzLmZyb21CNjRUb0FycmF5KFV0aWxzLmZyb21VcmxCNjRUb0I2NChzdHIpKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZnJvbUhleFRvQXJyYXkoc3RyOiBzdHJpbmcpOiBVaW50OEFycmF5IHtcbiAgICAgICAgaWYgKFV0aWxzLmlzTm9kZSB8fCBVdGlscy5pc05hdGl2ZVNjcmlwdCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KEJ1ZmZlci5mcm9tKHN0ciwgJ2hleCcpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoc3RyLmxlbmd0aCAvIDIpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgICAgICAgICAgICBieXRlc1tpIC8gMl0gPSBwYXJzZUludChzdHIuc3Vic3RyKGksIDIpLCAxNik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYnl0ZXM7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgZnJvbVV0ZjhUb0FycmF5KHN0cjogc3RyaW5nKTogVWludDhBcnJheSB7XG4gICAgICAgIGlmIChVdGlscy5pc05vZGUgfHwgVXRpbHMuaXNOYXRpdmVTY3JpcHQpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShCdWZmZXIuZnJvbShzdHIsICd1dGY4JykpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgc3RyVXRmOCA9IHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChzdHIpKTtcbiAgICAgICAgICAgIGNvbnN0IGFyciA9IG5ldyBVaW50OEFycmF5KHN0clV0ZjgubGVuZ3RoKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyVXRmOC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGFycltpXSA9IHN0clV0ZjguY2hhckNvZGVBdChpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBhcnI7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgZnJvbUJ5dGVTdHJpbmdUb0FycmF5KHN0cjogc3RyaW5nKTogVWludDhBcnJheSB7XG4gICAgICAgIGNvbnN0IGFyciA9IG5ldyBVaW50OEFycmF5KHN0ci5sZW5ndGgpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYXJyW2ldID0gc3RyLmNoYXJDb2RlQXQoaSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFycjtcbiAgICB9XG5cbiAgICBzdGF0aWMgZnJvbUJ1ZmZlclRvQjY0KGJ1ZmZlcjogQXJyYXlCdWZmZXIpOiBzdHJpbmcge1xuICAgICAgICBpZiAoVXRpbHMuaXNOb2RlIHx8IFV0aWxzLmlzTmF0aXZlU2NyaXB0KSB7XG4gICAgICAgICAgICByZXR1cm4gQnVmZmVyLmZyb20oYnVmZmVyKS50b1N0cmluZygnYmFzZTY0Jyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgYmluYXJ5ID0gJyc7XG4gICAgICAgICAgICBjb25zdCBieXRlcyA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlcik7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ5dGVzLmJ5dGVMZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGJpbmFyeSArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ5dGVzW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB3aW5kb3cuYnRvYShiaW5hcnkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGZyb21CdWZmZXJUb1VybEI2NChidWZmZXI6IEFycmF5QnVmZmVyKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIFV0aWxzLmZyb21CNjR0b1VybEI2NChVdGlscy5mcm9tQnVmZmVyVG9CNjQoYnVmZmVyKSk7XG4gICAgfVxuXG4gICAgc3RhdGljIGZyb21CNjR0b1VybEI2NChiNjRTdHI6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gYjY0U3RyLnJlcGxhY2UoL1xcKy9nLCAnLScpXG4gICAgICAgICAgICAucmVwbGFjZSgvXFwvL2csICdfJylcbiAgICAgICAgICAgIC5yZXBsYWNlKC89L2csICcnKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZnJvbUJ1ZmZlclRvVXRmOChidWZmZXI6IEFycmF5QnVmZmVyKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKFV0aWxzLmlzTm9kZSB8fCBVdGlscy5pc05hdGl2ZVNjcmlwdCkge1xuICAgICAgICAgICAgcmV0dXJuIEJ1ZmZlci5mcm9tKGJ1ZmZlcikudG9TdHJpbmcoJ3V0ZjgnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyKTtcbiAgICAgICAgICAgIGNvbnN0IGVuY29kZWRTdHJpbmcgPSBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIGJ5dGVzKTtcbiAgICAgICAgICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoZXNjYXBlKGVuY29kZWRTdHJpbmcpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBmcm9tQnVmZmVyVG9CeXRlU3RyaW5nKGJ1ZmZlcjogQXJyYXlCdWZmZXIpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBuZXcgVWludDhBcnJheShidWZmZXIpKTtcbiAgICB9XG5cbiAgICAvLyByZWY6IGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS80MDAzMTk3OS8xMDkwMzU5XG4gICAgc3RhdGljIGZyb21CdWZmZXJUb0hleChidWZmZXI6IEFycmF5QnVmZmVyKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKFV0aWxzLmlzTm9kZSB8fCBVdGlscy5pc05hdGl2ZVNjcmlwdCkge1xuICAgICAgICAgICAgcmV0dXJuIEJ1ZmZlci5mcm9tKGJ1ZmZlcikudG9TdHJpbmcoJ2hleCcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgYnl0ZXMgPSBuZXcgVWludDhBcnJheShidWZmZXIpO1xuICAgICAgICAgICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5tYXAuY2FsbChieXRlcywgKHg6IG51bWJlcikgPT4gKCcwMCcgKyB4LnRvU3RyaW5nKDE2KSkuc2xpY2UoLTIpKS5qb2luKCcnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBmcm9tVXJsQjY0VG9CNjQodXJsQjY0U3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBsZXQgb3V0cHV0ID0gdXJsQjY0U3RyLnJlcGxhY2UoLy0vZywgJysnKS5yZXBsYWNlKC9fL2csICcvJyk7XG4gICAgICAgIHN3aXRjaCAob3V0cHV0Lmxlbmd0aCAlIDQpIHtcbiAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICBvdXRwdXQgKz0gJz09JztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICBvdXRwdXQgKz0gJz0nO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0lsbGVnYWwgYmFzZTY0dXJsIHN0cmluZyEnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgfVxuXG4gICAgc3RhdGljIGZyb21VcmxCNjRUb1V0ZjgodXJsQjY0U3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gVXRpbHMuZnJvbUI2NFRvVXRmOChVdGlscy5mcm9tVXJsQjY0VG9CNjQodXJsQjY0U3RyKSk7XG4gICAgfVxuXG4gICAgc3RhdGljIGZyb21VdGY4VG9CNjQodXRmU3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBpZiAoVXRpbHMuaXNOb2RlIHx8IFV0aWxzLmlzTmF0aXZlU2NyaXB0KSB7XG4gICAgICAgICAgICByZXR1cm4gQnVmZmVyLmZyb20odXRmU3RyLCAndXRmOCcpLnRvU3RyaW5nKCdiYXNlNjQnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoZXNjYXBlKHdpbmRvdy5idG9hKHV0ZlN0cikpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBmcm9tVXRmOFRvVXJsQjY0KHV0ZlN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIFV0aWxzLmZyb21CdWZmZXJUb1VybEI2NChVdGlscy5mcm9tVXRmOFRvQXJyYXkodXRmU3RyKSk7XG4gICAgfVxuXG4gICAgc3RhdGljIGZyb21CNjRUb1V0ZjgoYjY0U3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBpZiAoVXRpbHMuaXNOb2RlIHx8IFV0aWxzLmlzTmF0aXZlU2NyaXB0KSB7XG4gICAgICAgICAgICByZXR1cm4gQnVmZmVyLmZyb20oYjY0U3RyLCAnYmFzZTY0JykudG9TdHJpbmcoJ3V0ZjgnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoZXNjYXBlKHdpbmRvdy5hdG9iKGI2NFN0cikpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIHJlZjogaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMjExNzUyMy8xMDkwMzU5XG4gICAgc3RhdGljIG5ld0d1aWQoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuICd4eHh4eHh4eC14eHh4LTR4eHgteXh4eC14eHh4eHh4eHh4eHgnLnJlcGxhY2UoL1t4eV0vZywgYyA9PiB7XG4gICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAgICAgICAgIGNvbnN0IHIgPSBNYXRoLnJhbmRvbSgpICogMTYgfCAwO1xuICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lXG4gICAgICAgICAgICBjb25zdCB2ID0gYyA9PT0gJ3gnID8gciA6IChyICYgMHgzIHwgMHg4KTtcbiAgICAgICAgICAgIHJldHVybiB2LnRvU3RyaW5nKDE2KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc3RhdGljIGlzR3VpZChpZDogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiBSZWdFeHAoL15bMC05YS1mXXs4fS1bMC05YS1mXXs0fS1bMS01XVswLTlhLWZdezN9LVs4OWFiXVswLTlhLWZdezN9LVswLTlhLWZdezEyfSQvLCAnaScpLnRlc3QoaWQpO1xuICAgIH1cblxuICAgIHN0YXRpYyBnZXRIb3N0bmFtZSh1cmlTdHJpbmc6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IHVybCA9IFV0aWxzLmdldFVybCh1cmlTdHJpbmcpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIHVybCAhPSBudWxsICYmIHVybC5ob3N0bmFtZSAhPT0gJycgPyB1cmwuaG9zdG5hbWUgOiBudWxsO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGdldEhvc3QodXJpU3RyaW5nOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCB1cmwgPSBVdGlscy5nZXRVcmwodXJpU3RyaW5nKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiB1cmwgIT0gbnVsbCAmJiB1cmwuaG9zdCAhPT0gJycgPyB1cmwuaG9zdCA6IG51bGw7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0RG9tYWluKHVyaVN0cmluZzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKHVyaVN0cmluZyA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHVyaVN0cmluZyA9IHVyaVN0cmluZy50cmltKCk7XG4gICAgICAgIGlmICh1cmlTdHJpbmcgPT09ICcnKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh1cmlTdHJpbmcuc3RhcnRzV2l0aCgnZGF0YTonKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgaHR0cFVybCA9IHVyaVN0cmluZy5zdGFydHNXaXRoKCdodHRwOi8vJykgfHwgdXJpU3RyaW5nLnN0YXJ0c1dpdGgoJ2h0dHBzOi8vJyk7XG4gICAgICAgIGlmICghaHR0cFVybCAmJiB1cmlTdHJpbmcuaW5kZXhPZignOi8vJykgPCAwICYmIFV0aWxzLnRsZEVuZGluZ1JlZ2V4LnRlc3QodXJpU3RyaW5nKSkge1xuICAgICAgICAgICAgdXJpU3RyaW5nID0gJ2h0dHA6Ly8nICsgdXJpU3RyaW5nO1xuICAgICAgICAgICAgaHR0cFVybCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaHR0cFVybCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCB1cmwgPSBVdGlscy5nZXRVcmxPYmplY3QodXJpU3RyaW5nKTtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWxpZEhvc3RuYW1lID0gdGxkanM/LmlzVmFsaWQgIT0gbnVsbCA/IHRsZGpzLmlzVmFsaWQodXJsLmhvc3RuYW1lKSA6IHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKCF2YWxpZEhvc3RuYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh1cmwuaG9zdG5hbWUgPT09ICdsb2NhbGhvc3QnIHx8IFV0aWxzLnZhbGlkSXBBZGRyZXNzKHVybC5ob3N0bmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVybC5ob3N0bmFtZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCB1cmxEb21haW4gPSB0bGRqcyAhPSBudWxsICYmIHRsZGpzLmdldERvbWFpbiAhPSBudWxsID8gdGxkanMuZ2V0RG9tYWluKHVybC5ob3N0bmFtZSkgOiBudWxsO1xuICAgICAgICAgICAgICAgIHJldHVybiB1cmxEb21haW4gIT0gbnVsbCA/IHVybERvbWFpbiA6IHVybC5ob3N0bmFtZTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAvLyBJbnZhbGlkIGRvbWFpbiwgdHJ5IGFub3RoZXIgYXBwcm9hY2ggYmVsb3cuXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgZG9tYWluID0gdGxkanMgIT0gbnVsbCAmJiB0bGRqcy5nZXREb21haW4gIT0gbnVsbCA/IHRsZGpzLmdldERvbWFpbih1cmlTdHJpbmcpIDogbnVsbDtcblxuICAgICAgICAgICAgaWYgKGRvbWFpbiAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRvbWFpbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHN0YXRpYyBnZXRRdWVyeVBhcmFtcyh1cmlTdHJpbmc6IHN0cmluZyk6IE1hcDxzdHJpbmcsIHN0cmluZz4ge1xuICAgICAgICBjb25zdCB1cmwgPSBVdGlscy5nZXRVcmwodXJpU3RyaW5nKTtcbiAgICAgICAgaWYgKHVybCA9PSBudWxsIHx8IHVybC5zZWFyY2ggPT0gbnVsbCB8fCB1cmwuc2VhcmNoID09PSAnJykge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbWFwID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgICAgICAgY29uc3QgcGFpcnMgPSAodXJsLnNlYXJjaFswXSA9PT0gJz8nID8gdXJsLnNlYXJjaC5zdWJzdHIoMSkgOiB1cmwuc2VhcmNoKS5zcGxpdCgnJicpO1xuICAgICAgICBwYWlycy5mb3JFYWNoKHBhaXIgPT4ge1xuICAgICAgICAgICAgY29uc3QgcGFydHMgPSBwYWlyLnNwbGl0KCc9Jyk7XG4gICAgICAgICAgICBpZiAocGFydHMubGVuZ3RoIDwgMSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG1hcC5zZXQoZGVjb2RlVVJJQ29tcG9uZW50KHBhcnRzWzBdKS50b0xvd2VyQ2FzZSgpLCBwYXJ0c1sxXSA9PSBudWxsID8gJycgOiBkZWNvZGVVUklDb21wb25lbnQocGFydHNbMV0pKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBtYXA7XG4gICAgfVxuXG4gICAgc3RhdGljIGdldFNvcnRGdW5jdGlvbihpMThuU2VydmljZTogSTE4blNlcnZpY2UsIHByb3A6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gKGE6IGFueSwgYjogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAoYVtwcm9wXSA9PSBudWxsICYmIGJbcHJvcF0gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChhW3Byb3BdICE9IG51bGwgJiYgYltwcm9wXSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYVtwcm9wXSA9PSBudWxsICYmIGJbcHJvcF0gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gaTE4blNlcnZpY2UuY29sbGF0b3IgPyBpMThuU2VydmljZS5jb2xsYXRvci5jb21wYXJlKGFbcHJvcF0sIGJbcHJvcF0pIDpcbiAgICAgICAgICAgICAgICBhW3Byb3BdLmxvY2FsZUNvbXBhcmUoYltwcm9wXSk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgc3RhdGljIGlzTnVsbE9yV2hpdGVzcGFjZShzdHI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gc3RyID09IG51bGwgfHwgdHlwZW9mIHN0ciAhPT0gJ3N0cmluZycgfHwgc3RyLnRyaW0oKSA9PT0gJyc7XG4gICAgfVxuXG4gICAgc3RhdGljIG5hbWVPZjxUPihuYW1lOiBzdHJpbmcgJiBrZXlvZiBUKSB7XG4gICAgICAgIHJldHVybiBuYW1lO1xuICAgIH1cblxuICAgIHN0YXRpYyBhc3NpZ248VD4odGFyZ2V0OiBULCBzb3VyY2U6IFBhcnRpYWw8VD4pOiBUIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24odGFyZ2V0LCBzb3VyY2UpO1xuICAgIH1cblxuICAgIHN0YXRpYyBpdGVyYXRlRW51bTxPIGV4dGVuZHMgb2JqZWN0LCBLIGV4dGVuZHMga2V5b2YgTyA9IGtleW9mIE8+KG9iajogTykge1xuICAgICAgICByZXR1cm4gKE9iamVjdC5rZXlzKG9iaikuZmlsdGVyKGsgPT4gTnVtYmVyLmlzTmFOKCtrKSkgYXMgS1tdKS5tYXAoayA9PiBvYmpba10pO1xuICAgIH1cblxuXG4gICAgc3RhdGljIGdldFVybCh1cmlTdHJpbmc6IHN0cmluZyk6IFVSTCB7XG4gICAgICAgIGlmICh1cmlTdHJpbmcgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICB1cmlTdHJpbmcgPSB1cmlTdHJpbmcudHJpbSgpO1xuICAgICAgICBpZiAodXJpU3RyaW5nID09PSAnJykge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgdXJsID0gVXRpbHMuZ2V0VXJsT2JqZWN0KHVyaVN0cmluZyk7XG4gICAgICAgIGlmICh1cmwgPT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgaGFzSHR0cFByb3RvY29sID0gdXJpU3RyaW5nLmluZGV4T2YoJ2h0dHA6Ly8nKSA9PT0gMCB8fCB1cmlTdHJpbmcuaW5kZXhPZignaHR0cHM6Ly8nKSA9PT0gMDtcbiAgICAgICAgICAgIGlmICghaGFzSHR0cFByb3RvY29sICYmIHVyaVN0cmluZy5pbmRleE9mKCcuJykgPiAtMSkge1xuICAgICAgICAgICAgICAgIHVybCA9IFV0aWxzLmdldFVybE9iamVjdCgnaHR0cDovLycgKyB1cmlTdHJpbmcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1cmw7XG4gICAgfVxuXG4gICAgc3RhdGljIGNhbWVsVG9QYXNjYWxDYXNlKHM6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gcy5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHMuc2xpY2UoMSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgdmFsaWRJcEFkZHJlc3MoaXBTdHJpbmc6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAgICAgY29uc3QgaXBSZWdleCA9IC9eKDI1WzAtNV18MlswLTRdWzAtOV18WzAxXT9bMC05XVswLTldPylcXC4oMjVbMC01XXwyWzAtNF1bMC05XXxbMDFdP1swLTldWzAtOV0/KVxcLigyNVswLTVdfDJbMC00XVswLTldfFswMV0/WzAtOV1bMC05XT8pXFwuKDI1WzAtNV18MlswLTRdWzAtOV18WzAxXT9bMC05XVswLTldPykkLztcbiAgICAgICAgcmV0dXJuIGlwUmVnZXgudGVzdChpcFN0cmluZyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgaXNNb2JpbGUod2luOiBXaW5kb3cpIHtcbiAgICAgICAgbGV0IG1vYmlsZSA9IGZhbHNlO1xuICAgICAgICAoYSA9PiB7XG4gICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAgICAgICAgIGlmICgvKGFuZHJvaWR8YmJcXGQrfG1lZWdvKS4rbW9iaWxlfGF2YW50Z298YmFkYVxcL3xibGFja2JlcnJ5fGJsYXplcnxjb21wYWx8ZWxhaW5lfGZlbm5lY3xoaXB0b3B8aWVtb2JpbGV8aXAoaG9uZXxvZCl8aXJpc3xraW5kbGV8bGdlIHxtYWVtb3xtaWRwfG1tcHxtb2JpbGUuK2ZpcmVmb3h8bmV0ZnJvbnR8b3BlcmEgbShvYnxpbilpfHBhbG0oIG9zKT98cGhvbmV8cChpeGl8cmUpXFwvfHBsdWNrZXJ8cG9ja2V0fHBzcHxzZXJpZXMoNHw2KTB8c3ltYmlhbnx0cmVvfHVwXFwuKGJyb3dzZXJ8bGluayl8dm9kYWZvbmV8d2FwfHdpbmRvd3MgY2V8eGRhfHhpaW5vL2kudGVzdChhKSB8fCAvMTIwN3w2MzEwfDY1OTB8M2dzb3w0dGhwfDUwWzEtNl1pfDc3MHN8ODAyc3xhIHdhfGFiYWN8YWMoZXJ8b298c1xcLSl8YWkoa298cm4pfGFsKGF2fGNhfGNvKXxhbW9pfGFuKGV4fG55fHl3KXxhcHR1fGFyKGNofGdvKXxhcyh0ZXx1cyl8YXR0d3xhdShkaXxcXC1tfHIgfHMgKXxhdmFufGJlKGNrfGxsfG5xKXxiaShsYnxyZCl8YmwoYWN8YXopfGJyKGV8dil3fGJ1bWJ8YndcXC0obnx1KXxjNTVcXC98Y2FwaXxjY3dhfGNkbVxcLXxjZWxsfGNodG18Y2xkY3xjbWRcXC18Y28obXB8bmQpfGNyYXd8ZGEoaXR8bGx8bmcpfGRidGV8ZGNcXC1zfGRldml8ZGljYXxkbW9ifGRvKGN8cClvfGRzKDEyfFxcLWQpfGVsKDQ5fGFpKXxlbShsMnx1bCl8ZXIoaWN8azApfGVzbDh8ZXooWzQtN10wfG9zfHdhfHplKXxmZXRjfGZseShcXC18Xyl8ZzEgdXxnNTYwfGdlbmV8Z2ZcXC01fGdcXC1tb3xnbyhcXC53fG9kKXxncihhZHx1bil8aGFpZXxoY2l0fGhkXFwtKG18cHx0KXxoZWlcXC18aGkocHR8dGEpfGhwKCBpfGlwKXxoc1xcLWN8aHQoYyhcXC18IHxffGF8Z3xwfHN8dCl8dHApfGh1KGF3fHRjKXxpXFwtKDIwfGdvfG1hKXxpMjMwfGlhYyggfFxcLXxcXC8pfGlicm98aWRlYXxpZzAxfGlrb218aW0xa3xpbm5vfGlwYXF8aXJpc3xqYSh0fHYpYXxqYnJvfGplbXV8amlnc3xrZGRpfGtlaml8a2d0KCB8XFwvKXxrbG9ufGtwdCB8a3djXFwtfGt5byhjfGspfGxlKG5vfHhpKXxsZyggZ3xcXC8oa3xsfHUpfDUwfDU0fFxcLVthLXddKXxsaWJ3fGx5bnh8bTFcXC13fG0zZ2F8bTUwXFwvfG1hKHRlfHVpfHhvKXxtYygwMXwyMXxjYSl8bVxcLWNyfG1lKHJjfHJpKXxtaShvOHxvYXx0cyl8bW1lZnxtbygwMXwwMnxiaXxkZXxkb3x0KFxcLXwgfG98dil8enopfG10KDUwfHAxfHYgKXxtd2JwfG15d2F8bjEwWzAtMl18bjIwWzItM118bjMwKDB8Mil8bjUwKDB8Mnw1KXxuNygwKDB8MSl8MTApfG5lKChjfG0pXFwtfG9ufHRmfHdmfHdnfHd0KXxub2soNnxpKXxuenBofG8yaW18b3AodGl8d3YpfG9yYW58b3dnMXxwODAwfHBhbihhfGR8dCl8cGR4Z3xwZygxM3xcXC0oWzEtOF18YykpfHBoaWx8cGlyZXxwbChheXx1Yyl8cG5cXC0yfHBvKGNrfHJ0fHNlKXxwcm94fHBzaW98cHRcXC1nfHFhXFwtYXxxYygwN3wxMnwyMXwzMnw2MHxcXC1bMi03XXxpXFwtKXxxdGVrfHIzODB8cjYwMHxyYWtzfHJpbTl8cm8odmV8em8pfHM1NVxcL3xzYShnZXxtYXxtbXxtc3xueXx2YSl8c2MoMDF8aFxcLXxvb3xwXFwtKXxzZGtcXC98c2UoYyhcXC18MHwxKXw0N3xtY3xuZHxyaSl8c2doXFwtfHNoYXJ8c2llKFxcLXxtKXxza1xcLTB8c2woNDV8aWQpfHNtKGFsfGFyfGIzfGl0fHQ1KXxzbyhmdHxueSl8c3AoMDF8aFxcLXx2XFwtfHYgKXxzeSgwMXxtYil8dDIoMTh8NTApfHQ2KDAwfDEwfDE4KXx0YShndHxsayl8dGNsXFwtfHRkZ1xcLXx0ZWwoaXxtKXx0aW1cXC18dFxcLW1vfHRvKHBsfHNoKXx0cyg3MHxtXFwtfG0zfG01KXx0eFxcLTl8dXAoXFwuYnxnMXxzaSl8dXRzdHx2NDAwfHY3NTB8dmVyaXx2aShyZ3x0ZSl8dmsoNDB8NVswLTNdfFxcLXYpfHZtNDB8dm9kYXx2dWxjfHZ4KDUyfDUzfDYwfDYxfDcwfDgwfDgxfDgzfDg1fDk4KXx3M2MoXFwtfCApfHdlYmN8d2hpdHx3aShnIHxuY3xudyl8d21sYnx3b251fHg3MDB8eWFzXFwtfHlvdXJ8emV0b3x6dGVcXC0vaS50ZXN0KGEuc3Vic3RyKDAsIDQpKSkge1xuICAgICAgICAgICAgICAgIG1vYmlsZSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pKHdpbi5uYXZpZ2F0b3IudXNlckFnZW50IHx8IHdpbi5uYXZpZ2F0b3IudmVuZG9yIHx8ICh3aW4gYXMgYW55KS5vcGVyYSk7XG4gICAgICAgIHJldHVybiBtb2JpbGUgfHwgd2luLm5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQYWQvaSkgIT0gbnVsbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBpc0FwcGxlTW9iaWxlKHdpbjogV2luZG93KSB7XG4gICAgICAgIHJldHVybiB3aW4ubmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBob25lL2kpICE9IG51bGwgfHwgd2luLm5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQYWQvaSkgIT0gbnVsbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBnZXRVcmxPYmplY3QodXJpU3RyaW5nOiBzdHJpbmcpOiBVUkwge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKG5vZGVVUkwgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBub2RlVVJMLlVSTCA/IG5ldyBub2RlVVJMLlVSTCh1cmlTdHJpbmcpIDogbm9kZVVSTC5wYXJzZSh1cmlTdHJpbmcpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgVVJMID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBVUkwodXJpU3RyaW5nKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAod2luZG93ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBoYXNQcm90b2NvbCA9IHVyaVN0cmluZy5pbmRleE9mKCc6Ly8nKSA+IC0xO1xuICAgICAgICAgICAgICAgIGlmICghaGFzUHJvdG9jb2wgJiYgdXJpU3RyaW5nLmluZGV4T2YoJy4nKSA+IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHVyaVN0cmluZyA9ICdodHRwOi8vJyArIHVyaVN0cmluZztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFoYXNQcm90b2NvbCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgYW5jaG9yID0gd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICAgICAgICAgICAgICBhbmNob3IuaHJlZiA9IHVyaVN0cmluZztcbiAgICAgICAgICAgICAgICByZXR1cm4gYW5jaG9yIGFzIGFueTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgLy8gSWdub3JlIGVycm9yXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59XG5cblV0aWxzLmluaXQoKTtcbiIsImltcG9ydCB7IEkxOG5TZXJ2aWNlIH0gZnJvbSAnLi4vYWJzdHJhY3Rpb25zL2kxOG4uc2VydmljZSc7XG5pbXBvcnQgeyBQbGF0Zm9ybVV0aWxzU2VydmljZSB9IGZyb20gJy4uL2Fic3RyYWN0aW9ucy9wbGF0Zm9ybVV0aWxzLnNlcnZpY2UnO1xuXG5leHBvcnQgY2xhc3MgV2ViQXV0aG5JRnJhbWUge1xuICAgIHByaXZhdGUgaWZyYW1lOiBIVE1MSUZyYW1lRWxlbWVudCA9IG51bGw7XG4gICAgcHJpdmF0ZSBjb25uZWN0b3JMaW5rOiBIVE1MQW5jaG9yRWxlbWVudDtcbiAgICBwcml2YXRlIHBhcnNlRnVuY3Rpb24gPSB0aGlzLnBhcnNlTWVzc2FnZS5iaW5kKHRoaXMpO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSB3aW46IFdpbmRvdywgcHJpdmF0ZSB3ZWJWYXVsdFVybDogc3RyaW5nLCBwcml2YXRlIHdlYkF1dGhuTmV3VGFiOiBib29sZWFuLFxuICAgICAgICBwcml2YXRlIHBsYXRmb3JtVXRpbHNTZXJ2aWNlOiBQbGF0Zm9ybVV0aWxzU2VydmljZSwgcHJpdmF0ZSBpMThuU2VydmljZTogSTE4blNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgc3VjY2Vzc0NhbGxiYWNrOiBGdW5jdGlvbiwgcHJpdmF0ZSBlcnJvckNhbGxiYWNrOiBGdW5jdGlvbiwgcHJpdmF0ZSBpbmZvQ2FsbGJhY2s6IEZ1bmN0aW9uKSB7XG4gICAgICAgIHRoaXMuY29ubmVjdG9yTGluayA9IHdpbi5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgfVxuXG4gICAgaW5pdChkYXRhOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh7XG4gICAgICAgICAgICBkYXRhOiB0aGlzLmJhc2U2NEVuY29kZShKU09OLnN0cmluZ2lmeShkYXRhKSksXG4gICAgICAgICAgICBwYXJlbnQ6IGVuY29kZVVSSUNvbXBvbmVudCh0aGlzLndpbi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmKSxcbiAgICAgICAgICAgIGJ0blRleHQ6IGVuY29kZVVSSUNvbXBvbmVudCh0aGlzLmkxOG5TZXJ2aWNlLnQoJ3dlYkF1dGhuQXV0aGVudGljYXRlJykpLFxuICAgICAgICAgICAgdjogJzEnLFxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAodGhpcy53ZWJBdXRobk5ld1RhYikge1xuICAgICAgICAgICAgLy8gRmlyZWZveCBmYWxsYmFjayB3aGljaCBvcGVucyB0aGUgd2ViYXV0aG4gcGFnZSBpbiBhIG5ldyB0YWJcbiAgICAgICAgICAgIHBhcmFtcy5hcHBlbmQoJ2xvY2FsZScsIHRoaXMuaTE4blNlcnZpY2UudHJhbnNsYXRpb25Mb2NhbGUpO1xuICAgICAgICAgICAgdGhpcy5wbGF0Zm9ybVV0aWxzU2VydmljZS5sYXVuY2hVcmkoYCR7dGhpcy53ZWJWYXVsdFVybH0vd2ViYXV0aG4tZmFsbGJhY2stY29ubmVjdG9yLmh0bWw/JHtwYXJhbXN9YCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmNvbm5lY3RvckxpbmsuaHJlZiA9IGAke3RoaXMud2ViVmF1bHRVcmx9L3dlYmF1dGhuLWNvbm5lY3Rvci5odG1sPyR7cGFyYW1zfWA7XG4gICAgICAgICAgICB0aGlzLmlmcmFtZSA9IHRoaXMud2luLmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd3ZWJhdXRobl9pZnJhbWUnKSBhcyBIVE1MSUZyYW1lRWxlbWVudDtcbiAgICAgICAgICAgIHRoaXMuaWZyYW1lLmFsbG93ID0gJ3B1YmxpY2tleS1jcmVkZW50aWFscy1nZXQgJyArIG5ldyBVUkwodGhpcy53ZWJWYXVsdFVybCkub3JpZ2luO1xuICAgICAgICAgICAgdGhpcy5pZnJhbWUuc3JjID0gdGhpcy5jb25uZWN0b3JMaW5rLmhyZWY7XG5cbiAgICAgICAgICAgIHRoaXMud2luLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCB0aGlzLnBhcnNlRnVuY3Rpb24sIGZhbHNlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0b3AoKSB7XG4gICAgICAgIHRoaXMuc2VuZE1lc3NhZ2UoJ3N0b3AnKTtcbiAgICB9XG5cbiAgICBzdGFydCgpIHtcbiAgICAgICAgdGhpcy5zZW5kTWVzc2FnZSgnc3RhcnQnKTtcbiAgICB9XG5cbiAgICBzZW5kTWVzc2FnZShtZXNzYWdlOiBhbnkpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlmcmFtZSB8fCAhdGhpcy5pZnJhbWUuc3JjIHx8ICF0aGlzLmlmcmFtZS5jb250ZW50V2luZG93KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmlmcmFtZS5jb250ZW50V2luZG93LnBvc3RNZXNzYWdlKG1lc3NhZ2UsIHRoaXMuaWZyYW1lLnNyYyk7XG4gICAgfVxuXG4gICAgYmFzZTY0RW5jb2RlKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGJ0b2EoZW5jb2RlVVJJQ29tcG9uZW50KHN0cikucmVwbGFjZSgvJShbMC05QS1GXXsyfSkvZywgKG1hdGNoLCBwMSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoKCcweCcgKyBwMSkgYXMgYW55KTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIGNsZWFudXAoKSB7XG4gICAgICAgIHRoaXMud2luLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCB0aGlzLnBhcnNlRnVuY3Rpb24sIGZhbHNlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHBhcnNlTWVzc2FnZShldmVudDogTWVzc2FnZUV2ZW50KSB7XG4gICAgICAgIGlmICghdGhpcy52YWxpZE1lc3NhZ2UoZXZlbnQpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwYXJ0czogc3RyaW5nW10gPSBldmVudC5kYXRhLnNwbGl0KCd8Jyk7XG4gICAgICAgIGlmIChwYXJ0c1swXSA9PT0gJ3N1Y2Nlc3MnICYmIHRoaXMuc3VjY2Vzc0NhbGxiYWNrKSB7XG4gICAgICAgICAgICB0aGlzLnN1Y2Nlc3NDYWxsYmFjayhwYXJ0c1sxXSk7XG4gICAgICAgIH0gZWxzZSBpZiAocGFydHNbMF0gPT09ICdlcnJvcicgJiYgdGhpcy5lcnJvckNhbGxiYWNrKSB7XG4gICAgICAgICAgICB0aGlzLmVycm9yQ2FsbGJhY2socGFydHNbMV0pO1xuICAgICAgICB9IGVsc2UgaWYgKHBhcnRzWzBdID09PSAnaW5mbycgJiYgdGhpcy5pbmZvQ2FsbGJhY2spIHtcbiAgICAgICAgICAgIHRoaXMuaW5mb0NhbGxiYWNrKHBhcnRzWzFdKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgdmFsaWRNZXNzYWdlKGV2ZW50OiBNZXNzYWdlRXZlbnQpIHtcbiAgICAgICAgaWYgKGV2ZW50Lm9yaWdpbiA9PSBudWxsIHx8IGV2ZW50Lm9yaWdpbiA9PT0gJycgfHwgZXZlbnQub3JpZ2luICE9PSAodGhpcy5jb25uZWN0b3JMaW5rIGFzIGFueSkub3JpZ2luIHx8XG4gICAgICAgICAgICBldmVudC5kYXRhID09IG51bGwgfHwgdHlwZW9mIChldmVudC5kYXRhKSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBldmVudC5kYXRhLmluZGV4T2YoJ3N1Y2Nlc3N8JykgPT09IDAgfHwgZXZlbnQuZGF0YS5pbmRleE9mKCdlcnJvcnwnKSA9PT0gMCB8fFxuICAgICAgICAgICAgZXZlbnQuZGF0YS5pbmRleE9mKCdpbmZvfCcpID09PSAwO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IFR3b0ZhY3RvclByb3ZpZGVyVHlwZSB9IGZyb20gJy4uLy4uL2VudW1zL3R3b0ZhY3RvclByb3ZpZGVyVHlwZSc7XG5cbmV4cG9ydCBjbGFzcyBBdXRoUmVzdWx0IHtcbiAgICB0d29GYWN0b3I6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBjYXB0Y2hhU2l0ZUtleTogc3RyaW5nID0gJyc7XG4gICAgcmVzZXRNYXN0ZXJQYXNzd29yZDogYm9vbGVhbiA9IGZhbHNlO1xuICAgIGZvcmNlUGFzc3dvcmRSZXNldDogYm9vbGVhbiA9IGZhbHNlO1xuICAgIHR3b0ZhY3RvclByb3ZpZGVyczogTWFwPFR3b0ZhY3RvclByb3ZpZGVyVHlwZSwgeyBba2V5OiBzdHJpbmddOiBzdHJpbmc7IH0+ID0gbnVsbDtcbn1cbiIsImltcG9ydCB7IEVuY1N0cmluZyB9IGZyb20gJy4vZW5jU3RyaW5nJztcblxuaW1wb3J0IHsgVmlldyB9IGZyb20gJy4uL3ZpZXcvdmlldyc7XG5cbmltcG9ydCB7IFN5bW1ldHJpY0NyeXB0b0tleSB9IGZyb20gJy4vc3ltbWV0cmljQ3J5cHRvS2V5JztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRG9tYWluIHtcbiAgICBwcm90ZWN0ZWQgYnVpbGREb21haW5Nb2RlbDxEIGV4dGVuZHMgRG9tYWluPihkb21haW46IEQsIGRhdGFPYmo6IGFueSwgbWFwOiBhbnksXG4gICAgICAgIGFscmVhZHlFbmNyeXB0ZWQ6IGJvb2xlYW4sIG5vdEVuY0xpc3Q6IGFueVtdID0gW10pIHtcbiAgICAgICAgZm9yIChjb25zdCBwcm9wIGluIG1hcCkge1xuICAgICAgICAgICAgaWYgKCFtYXAuaGFzT3duUHJvcGVydHkocHJvcCkpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3Qgb2JqUHJvcCA9IGRhdGFPYmpbKG1hcFtwcm9wXSB8fCBwcm9wKV07XG4gICAgICAgICAgICBpZiAoYWxyZWFkeUVuY3J5cHRlZCA9PT0gdHJ1ZSB8fCBub3RFbmNMaXN0LmluZGV4T2YocHJvcCkgPiAtMSkge1xuICAgICAgICAgICAgICAgIChkb21haW4gYXMgYW55KVtwcm9wXSA9IG9ialByb3AgPyBvYmpQcm9wIDogbnVsbDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgKGRvbWFpbiBhcyBhbnkpW3Byb3BdID0gb2JqUHJvcCA/IG5ldyBFbmNTdHJpbmcob2JqUHJvcCkgOiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHByb3RlY3RlZCBidWlsZERhdGFNb2RlbDxEIGV4dGVuZHMgRG9tYWluPihkb21haW46IEQsIGRhdGFPYmo6IGFueSwgbWFwOiBhbnksIG5vdEVuY1N0cmluZ0xpc3Q6IGFueVtdID0gW10pIHtcbiAgICAgICAgZm9yIChjb25zdCBwcm9wIGluIG1hcCkge1xuICAgICAgICAgICAgaWYgKCFtYXAuaGFzT3duUHJvcGVydHkocHJvcCkpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3Qgb2JqUHJvcCA9IChkb21haW4gYXMgYW55KVsobWFwW3Byb3BdIHx8IHByb3ApXTtcbiAgICAgICAgICAgIGlmIChub3RFbmNTdHJpbmdMaXN0LmluZGV4T2YocHJvcCkgPiAtMSkge1xuICAgICAgICAgICAgICAgIChkYXRhT2JqIGFzIGFueSlbcHJvcF0gPSBvYmpQcm9wICE9IG51bGwgPyBvYmpQcm9wIDogbnVsbDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgKGRhdGFPYmogYXMgYW55KVtwcm9wXSA9IG9ialByb3AgIT0gbnVsbCA/IChvYmpQcm9wIGFzIEVuY1N0cmluZykuZW5jcnlwdGVkU3RyaW5nIDogbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBhc3luYyBkZWNyeXB0T2JqPFQgZXh0ZW5kcyBWaWV3Pih2aWV3TW9kZWw6IFQsIG1hcDogYW55LCBvcmdJZDogc3RyaW5nLFxuICAgICAgICBrZXk6IFN5bW1ldHJpY0NyeXB0b0tleSA9IG51bGwpOiBQcm9taXNlPFQ+IHtcbiAgICAgICAgY29uc3QgcHJvbWlzZXMgPSBbXTtcbiAgICAgICAgY29uc3Qgc2VsZjogYW55ID0gdGhpcztcblxuICAgICAgICBmb3IgKGNvbnN0IHByb3AgaW4gbWFwKSB7XG4gICAgICAgICAgICBpZiAoIW1hcC5oYXNPd25Qcm9wZXJ0eShwcm9wKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAgICAgICAgIChmdW5jdGlvbiAodGhlUHJvcCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHAgPSBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbWFwUHJvcCA9IG1hcFt0aGVQcm9wXSB8fCB0aGVQcm9wO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZlttYXBQcm9wXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGZbbWFwUHJvcF0uZGVjcnlwdChvcmdJZCwga2V5KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICB9KS50aGVuKCh2YWw6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAodmlld01vZGVsIGFzIGFueSlbdGhlUHJvcF0gPSB2YWw7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcHJvbWlzZXMucHVzaChwKTtcbiAgICAgICAgICAgIH0pKHByb3ApO1xuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICAgICAgICByZXR1cm4gdmlld01vZGVsO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IEVuY3J5cHRpb25UeXBlIH0gZnJvbSAnLi4vLi4vZW51bXMvZW5jcnlwdGlvblR5cGUnO1xuXG5pbXBvcnQgeyBDcnlwdG9TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vYWJzdHJhY3Rpb25zL2NyeXB0by5zZXJ2aWNlJztcblxuaW1wb3J0IHsgVXRpbHMgfSBmcm9tICcuLi8uLi9taXNjL3V0aWxzJztcblxuaW1wb3J0IHsgU3ltbWV0cmljQ3J5cHRvS2V5IH0gZnJvbSAnLi9zeW1tZXRyaWNDcnlwdG9LZXknO1xuXG5leHBvcnQgY2xhc3MgRW5jU3RyaW5nIHtcbiAgICBlbmNyeXB0ZWRTdHJpbmc/OiBzdHJpbmc7XG4gICAgZW5jcnlwdGlvblR5cGU/OiBFbmNyeXB0aW9uVHlwZTtcbiAgICBkZWNyeXB0ZWRWYWx1ZT86IHN0cmluZztcbiAgICBkYXRhPzogc3RyaW5nO1xuICAgIGl2Pzogc3RyaW5nO1xuICAgIG1hYz86IHN0cmluZztcblxuICAgIGNvbnN0cnVjdG9yKGVuY3J5cHRlZFN0cmluZ09yVHlwZTogc3RyaW5nIHwgRW5jcnlwdGlvblR5cGUsIGRhdGE/OiBzdHJpbmcsIGl2Pzogc3RyaW5nLCBtYWM/OiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKGRhdGEgIT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gZGF0YSBhbmQgaGVhZGVyXG4gICAgICAgICAgICBjb25zdCBlbmNUeXBlID0gZW5jcnlwdGVkU3RyaW5nT3JUeXBlIGFzIEVuY3J5cHRpb25UeXBlO1xuXG4gICAgICAgICAgICBpZiAoaXYgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZW5jcnlwdGVkU3RyaW5nID0gZW5jVHlwZSArICcuJyArIGl2ICsgJ3wnICsgZGF0YTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbmNyeXB0ZWRTdHJpbmcgPSBlbmNUeXBlICsgJy4nICsgZGF0YTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gbWFjXG4gICAgICAgICAgICBpZiAobWFjICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVuY3J5cHRlZFN0cmluZyArPSAoJ3wnICsgbWFjKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5lbmNyeXB0aW9uVHlwZSA9IGVuY1R5cGU7XG4gICAgICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgICAgICAgICAgdGhpcy5pdiA9IGl2O1xuICAgICAgICAgICAgdGhpcy5tYWMgPSBtYWM7XG5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZW5jcnlwdGVkU3RyaW5nID0gZW5jcnlwdGVkU3RyaW5nT3JUeXBlIGFzIHN0cmluZztcbiAgICAgICAgaWYgKCF0aGlzLmVuY3J5cHRlZFN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaGVhZGVyUGllY2VzID0gdGhpcy5lbmNyeXB0ZWRTdHJpbmcuc3BsaXQoJy4nKTtcbiAgICAgICAgbGV0IGVuY1BpZWNlczogc3RyaW5nW10gPSBudWxsO1xuXG4gICAgICAgIGlmIChoZWFkZXJQaWVjZXMubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHRoaXMuZW5jcnlwdGlvblR5cGUgPSBwYXJzZUludChoZWFkZXJQaWVjZXNbMF0sIG51bGwpO1xuICAgICAgICAgICAgICAgIGVuY1BpZWNlcyA9IGhlYWRlclBpZWNlc1sxXS5zcGxpdCgnfCcpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGVuY1BpZWNlcyA9IHRoaXMuZW5jcnlwdGVkU3RyaW5nLnNwbGl0KCd8Jyk7XG4gICAgICAgICAgICB0aGlzLmVuY3J5cHRpb25UeXBlID0gZW5jUGllY2VzLmxlbmd0aCA9PT0gMyA/IEVuY3J5cHRpb25UeXBlLkFlc0NiYzEyOF9IbWFjU2hhMjU2X0I2NCA6XG4gICAgICAgICAgICAgICAgRW5jcnlwdGlvblR5cGUuQWVzQ2JjMjU2X0I2NDtcbiAgICAgICAgfVxuXG4gICAgICAgIHN3aXRjaCAodGhpcy5lbmNyeXB0aW9uVHlwZSkge1xuICAgICAgICAgICAgY2FzZSBFbmNyeXB0aW9uVHlwZS5BZXNDYmMxMjhfSG1hY1NoYTI1Nl9CNjQ6XG4gICAgICAgICAgICBjYXNlIEVuY3J5cHRpb25UeXBlLkFlc0NiYzI1Nl9IbWFjU2hhMjU2X0I2NDpcbiAgICAgICAgICAgICAgICBpZiAoZW5jUGllY2VzLmxlbmd0aCAhPT0gMykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5pdiA9IGVuY1BpZWNlc1swXTtcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSBlbmNQaWVjZXNbMV07XG4gICAgICAgICAgICAgICAgdGhpcy5tYWMgPSBlbmNQaWVjZXNbMl07XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEVuY3J5cHRpb25UeXBlLkFlc0NiYzI1Nl9CNjQ6XG4gICAgICAgICAgICAgICAgaWYgKGVuY1BpZWNlcy5sZW5ndGggIT09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMuaXYgPSBlbmNQaWVjZXNbMF07XG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhID0gZW5jUGllY2VzWzFdO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBFbmNyeXB0aW9uVHlwZS5Sc2EyMDQ4X09hZXBTaGEyNTZfQjY0OlxuICAgICAgICAgICAgY2FzZSBFbmNyeXB0aW9uVHlwZS5Sc2EyMDQ4X09hZXBTaGExX0I2NDpcbiAgICAgICAgICAgICAgICBpZiAoZW5jUGllY2VzLmxlbmd0aCAhPT0gMSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhID0gZW5jUGllY2VzWzBdO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBkZWNyeXB0KG9yZ0lkOiBzdHJpbmcsIGtleTogU3ltbWV0cmljQ3J5cHRvS2V5ID0gbnVsbCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIGlmICh0aGlzLmRlY3J5cHRlZFZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRlY3J5cHRlZFZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGNyeXB0b1NlcnZpY2U6IENyeXB0b1NlcnZpY2U7XG4gICAgICAgIGNvbnN0IGNvbnRhaW5lclNlcnZpY2UgPSAoVXRpbHMuZ2xvYmFsIGFzIGFueSkuYml0d2FyZGVuQ29udGFpbmVyU2VydmljZTtcbiAgICAgICAgaWYgKGNvbnRhaW5lclNlcnZpY2UpIHtcbiAgICAgICAgICAgIGNyeXB0b1NlcnZpY2UgPSBjb250YWluZXJTZXJ2aWNlLmdldENyeXB0b1NlcnZpY2UoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignZ2xvYmFsIGJpdHdhcmRlbkNvbnRhaW5lclNlcnZpY2Ugbm90IGluaXRpYWxpemVkLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChrZXkgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGtleSA9IGF3YWl0IGNyeXB0b1NlcnZpY2UuZ2V0T3JnS2V5KG9yZ0lkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZGVjcnlwdGVkVmFsdWUgPSBhd2FpdCBjcnlwdG9TZXJ2aWNlLmRlY3J5cHRUb1V0ZjgodGhpcywga2V5KTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5kZWNyeXB0ZWRWYWx1ZSA9ICdbZXJyb3I6IGNhbm5vdCBkZWNyeXB0XSc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZGVjcnlwdGVkVmFsdWU7XG4gICAgfVxufVxuIiwiaW1wb3J0IERvbWFpbiBmcm9tICcuL2RvbWFpbkJhc2UnO1xuXG5leHBvcnQgY2xhc3MgTWFzdGVyUGFzc3dvcmRQb2xpY3lPcHRpb25zIGV4dGVuZHMgRG9tYWluIHtcbiAgICBtaW5Db21wbGV4aXR5OiBudW1iZXIgPSAwO1xuICAgIG1pbkxlbmd0aDogbnVtYmVyID0gMDtcbiAgICByZXF1aXJlVXBwZXI6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICByZXF1aXJlTG93ZXI6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICByZXF1aXJlTnVtYmVyczogYm9vbGVhbiA9IGZhbHNlO1xuICAgIHJlcXVpcmVTcGVjaWFsOiBib29sZWFuID0gZmFsc2U7XG59XG4iLCJpbXBvcnQgeyBFbmNyeXB0aW9uVHlwZSB9IGZyb20gJy4uLy4uL2VudW1zL2VuY3J5cHRpb25UeXBlJztcblxuaW1wb3J0IHsgVXRpbHMgfSBmcm9tICcuLi8uLi9taXNjL3V0aWxzJztcblxuZXhwb3J0IGNsYXNzIFN5bW1ldHJpY0NyeXB0b0tleSB7XG4gICAga2V5OiBBcnJheUJ1ZmZlcjtcbiAgICBlbmNLZXk/OiBBcnJheUJ1ZmZlcjtcbiAgICBtYWNLZXk/OiBBcnJheUJ1ZmZlcjtcbiAgICBlbmNUeXBlOiBFbmNyeXB0aW9uVHlwZTtcblxuICAgIGtleUI2NDogc3RyaW5nO1xuICAgIGVuY0tleUI2NDogc3RyaW5nO1xuICAgIG1hY0tleUI2NDogc3RyaW5nO1xuXG4gICAgbWV0YTogYW55O1xuXG4gICAgY29uc3RydWN0b3Ioa2V5OiBBcnJheUJ1ZmZlciwgZW5jVHlwZT86IEVuY3J5cHRpb25UeXBlKSB7XG4gICAgICAgIGlmIChrZXkgPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNdXN0IHByb3ZpZGUga2V5Jyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZW5jVHlwZSA9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoa2V5LmJ5dGVMZW5ndGggPT09IDMyKSB7XG4gICAgICAgICAgICAgICAgZW5jVHlwZSA9IEVuY3J5cHRpb25UeXBlLkFlc0NiYzI1Nl9CNjQ7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGtleS5ieXRlTGVuZ3RoID09PSA2NCkge1xuICAgICAgICAgICAgICAgIGVuY1R5cGUgPSBFbmNyeXB0aW9uVHlwZS5BZXNDYmMyNTZfSG1hY1NoYTI1Nl9CNjQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIGRldGVybWluZSBlbmNUeXBlLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5rZXkgPSBrZXk7XG4gICAgICAgIHRoaXMuZW5jVHlwZSA9IGVuY1R5cGU7XG5cbiAgICAgICAgaWYgKGVuY1R5cGUgPT09IEVuY3J5cHRpb25UeXBlLkFlc0NiYzI1Nl9CNjQgJiYga2V5LmJ5dGVMZW5ndGggPT09IDMyKSB7XG4gICAgICAgICAgICB0aGlzLmVuY0tleSA9IGtleTtcbiAgICAgICAgICAgIHRoaXMubWFjS2V5ID0gbnVsbDtcbiAgICAgICAgfSBlbHNlIGlmIChlbmNUeXBlID09PSBFbmNyeXB0aW9uVHlwZS5BZXNDYmMxMjhfSG1hY1NoYTI1Nl9CNjQgJiYga2V5LmJ5dGVMZW5ndGggPT09IDMyKSB7XG4gICAgICAgICAgICB0aGlzLmVuY0tleSA9IGtleS5zbGljZSgwLCAxNik7XG4gICAgICAgICAgICB0aGlzLm1hY0tleSA9IGtleS5zbGljZSgxNiwgMzIpO1xuICAgICAgICB9IGVsc2UgaWYgKGVuY1R5cGUgPT09IEVuY3J5cHRpb25UeXBlLkFlc0NiYzI1Nl9IbWFjU2hhMjU2X0I2NCAmJiBrZXkuYnl0ZUxlbmd0aCA9PT0gNjQpIHtcbiAgICAgICAgICAgIHRoaXMuZW5jS2V5ID0ga2V5LnNsaWNlKDAsIDMyKTtcbiAgICAgICAgICAgIHRoaXMubWFjS2V5ID0ga2V5LnNsaWNlKDMyLCA2NCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIGVuY1R5cGUva2V5IGxlbmd0aC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmtleSAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmtleUI2NCA9IFV0aWxzLmZyb21CdWZmZXJUb0I2NCh0aGlzLmtleSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZW5jS2V5ICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuZW5jS2V5QjY0ID0gVXRpbHMuZnJvbUJ1ZmZlclRvQjY0KHRoaXMuZW5jS2V5KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5tYWNLZXkgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5tYWNLZXlCNjQgPSBVdGlscy5mcm9tQnVmZmVyVG9CNjQodGhpcy5tYWNLZXkpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgS2V5c1JlcXVlc3QgfSBmcm9tICcuLi9rZXlzUmVxdWVzdCc7XG5cbmltcG9ydCB7IEtkZlR5cGUgfSBmcm9tICcuLi8uLi8uLi9lbnVtcy9rZGZUeXBlJztcblxuZXhwb3J0IGNsYXNzIFNldENyeXB0b0FnZW50S2V5UmVxdWVzdCB7XG4gICAga2V5OiBzdHJpbmc7XG4gICAga2V5czogS2V5c1JlcXVlc3Q7XG4gICAga2RmOiBLZGZUeXBlO1xuICAgIGtkZkl0ZXJhdGlvbnM6IG51bWJlcjtcbiAgICBvcmdJZGVudGlmaWVyOiBzdHJpbmc7XG5cbiAgICBjb25zdHJ1Y3RvcihrZXk6IHN0cmluZywga2RmOiBLZGZUeXBlLCBrZGZJdGVyYXRpb25zOiBudW1iZXIsIG9yZ0lkZW50aWZpZXI6IHN0cmluZywga2V5czogS2V5c1JlcXVlc3QpIHtcbiAgICAgICAgdGhpcy5rZXkgPSBrZXk7XG4gICAgICAgIHRoaXMua2RmID0ga2RmO1xuICAgICAgICB0aGlzLmtkZkl0ZXJhdGlvbnMgPSBrZGZJdGVyYXRpb25zO1xuICAgICAgICB0aGlzLm9yZ0lkZW50aWZpZXIgPSBvcmdJZGVudGlmaWVyO1xuICAgICAgICB0aGlzLmtleXMgPSBrZXlzO1xuICAgIH1cbn1cbiIsImV4cG9ydCBjbGFzcyBDcnlwdG9BZ2VudFVzZXJLZXlSZXF1ZXN0IHtcbiAgICBrZXk6IHN0cmluZztcblxuICAgIGNvbnN0cnVjdG9yKGtleTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMua2V5ID0ga2V5O1xuICAgIH1cbn1cbiIsImltcG9ydCB7IERldmljZVR5cGUgfSBmcm9tICcuLi8uLi9lbnVtcy9kZXZpY2VUeXBlJztcblxuaW1wb3J0IHsgUGxhdGZvcm1VdGlsc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9hYnN0cmFjdGlvbnMvcGxhdGZvcm1VdGlscy5zZXJ2aWNlJztcblxuZXhwb3J0IGNsYXNzIERldmljZVJlcXVlc3Qge1xuICAgIHR5cGU6IERldmljZVR5cGU7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGlkZW50aWZpZXI6IHN0cmluZztcbiAgICBwdXNoVG9rZW4/OiBzdHJpbmc7XG5cbiAgICBjb25zdHJ1Y3RvcihhcHBJZDogc3RyaW5nLCBwbGF0Zm9ybVV0aWxzU2VydmljZTogUGxhdGZvcm1VdGlsc1NlcnZpY2UpIHtcbiAgICAgICAgdGhpcy50eXBlID0gcGxhdGZvcm1VdGlsc1NlcnZpY2UuZ2V0RGV2aWNlKCk7XG4gICAgICAgIHRoaXMubmFtZSA9IHBsYXRmb3JtVXRpbHNTZXJ2aWNlLmdldERldmljZVN0cmluZygpO1xuICAgICAgICB0aGlzLmlkZW50aWZpZXIgPSBhcHBJZDtcbiAgICAgICAgdGhpcy5wdXNoVG9rZW4gPSBudWxsO1xuICAgIH1cbn1cbiIsImV4cG9ydCBjbGFzcyBLZXlzUmVxdWVzdCB7XG4gICAgcHVibGljS2V5OiBzdHJpbmc7XG4gICAgZW5jcnlwdGVkUHJpdmF0ZUtleTogc3RyaW5nO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljS2V5OiBzdHJpbmcsIGVuY3J5cHRlZFByaXZhdGVLZXk6IHN0cmluZykge1xuICAgICAgICB0aGlzLnB1YmxpY0tleSA9IHB1YmxpY0tleTtcbiAgICAgICAgdGhpcy5lbmNyeXB0ZWRQcml2YXRlS2V5ID0gZW5jcnlwdGVkUHJpdmF0ZUtleTtcbiAgICB9XG59XG4iLCJleHBvcnQgY2xhc3MgT3JnYW5pemF0aW9uVXNlclJlc2V0UGFzc3dvcmRFbnJvbGxtZW50UmVxdWVzdCB7XG4gICAgcmVzZXRQYXNzd29yZEtleTogc3RyaW5nO1xufVxuIiwiZXhwb3J0IGNsYXNzIE9yZ2FuaXphdGlvblVzZXJSZXNldFBhc3N3b3JkUmVxdWVzdCB7XG4gICAgbmV3TWFzdGVyUGFzc3dvcmRIYXNoOiBzdHJpbmc7XG4gICAga2V5OiBzdHJpbmc7XG59XG4iLCJleHBvcnQgY2xhc3MgUGFzc3dvcmRIaW50UmVxdWVzdCB7XG4gICAgZW1haWw6IHN0cmluZztcblxuICAgIGNvbnN0cnVjdG9yKGVtYWlsOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5lbWFpbCA9IGVtYWlsO1xuICAgIH1cbn1cbiIsImV4cG9ydCBjbGFzcyBQYXNzd29yZFZlcmlmaWNhdGlvblJlcXVlc3Qge1xuICAgIG1hc3RlclBhc3N3b3JkSGFzaDogc3RyaW5nO1xufVxuIiwiZXhwb3J0IGNsYXNzIFByZWxvZ2luUmVxdWVzdCB7XG4gICAgZW1haWw6IHN0cmluZztcblxuICAgIGNvbnN0cnVjdG9yKGVtYWlsOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5lbWFpbCA9IGVtYWlsO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IEtleXNSZXF1ZXN0IH0gZnJvbSAnLi9rZXlzUmVxdWVzdCc7XG5pbXBvcnQgeyBSZWZlcmVuY2VFdmVudFJlcXVlc3QgfSBmcm9tICcuL3JlZmVyZW5jZUV2ZW50UmVxdWVzdCc7XG5cbmltcG9ydCB7IEtkZlR5cGUgfSBmcm9tICcuLi8uLi9lbnVtcy9rZGZUeXBlJztcblxuaW1wb3J0IHsgQ2FwdGNoYVByb3RlY3RlZFJlcXVlc3QgfSBmcm9tICcuL2NhcHRjaGFQcm90ZWN0ZWRSZXF1ZXN0JztcblxuZXhwb3J0IGNsYXNzIFJlZ2lzdGVyUmVxdWVzdCBpbXBsZW1lbnRzIENhcHRjaGFQcm90ZWN0ZWRSZXF1ZXN0IHtcbiAgICBtYXN0ZXJQYXNzd29yZEhpbnQ6IHN0cmluZztcbiAgICBrZXlzOiBLZXlzUmVxdWVzdDtcbiAgICB0b2tlbjogc3RyaW5nO1xuICAgIG9yZ2FuaXphdGlvblVzZXJJZDogc3RyaW5nO1xuXG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgZW1haWw6IHN0cmluZywgcHVibGljIG5hbWU6IHN0cmluZywgcHVibGljIG1hc3RlclBhc3N3b3JkSGFzaDogc3RyaW5nLFxuICAgICAgICBtYXN0ZXJQYXNzd29yZEhpbnQ6IHN0cmluZywgcHVibGljIGtleTogc3RyaW5nLCBwdWJsaWMga2RmOiBLZGZUeXBlLCBwdWJsaWMga2RmSXRlcmF0aW9uczogbnVtYmVyLFxuICAgICAgICBwdWJsaWMgcmVmZXJlbmNlRGF0YTogUmVmZXJlbmNlRXZlbnRSZXF1ZXN0LCBwdWJsaWMgY2FwdGNoYVJlc3BvbnNlOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5tYXN0ZXJQYXNzd29yZEhpbnQgPSBtYXN0ZXJQYXNzd29yZEhpbnQgPyBtYXN0ZXJQYXNzd29yZEhpbnQgOiBudWxsO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IEtleXNSZXF1ZXN0IH0gZnJvbSAnLi9rZXlzUmVxdWVzdCc7XG5cbmltcG9ydCB7IEtkZlR5cGUgfSBmcm9tICcuLi8uLi9lbnVtcy9rZGZUeXBlJztcblxuZXhwb3J0IGNsYXNzIFNldFBhc3N3b3JkUmVxdWVzdCB7XG4gICAgbWFzdGVyUGFzc3dvcmRIYXNoOiBzdHJpbmc7XG4gICAga2V5OiBzdHJpbmc7XG4gICAgbWFzdGVyUGFzc3dvcmRIaW50OiBzdHJpbmc7XG4gICAga2V5czogS2V5c1JlcXVlc3Q7XG4gICAga2RmOiBLZGZUeXBlO1xuICAgIGtkZkl0ZXJhdGlvbnM6IG51bWJlcjtcbiAgICBvcmdJZGVudGlmaWVyOiBzdHJpbmc7XG5cbiAgICBjb25zdHJ1Y3RvcihtYXN0ZXJQYXNzd29yZEhhc2g6IHN0cmluZywga2V5OiBzdHJpbmcsIG1hc3RlclBhc3N3b3JkSGludDogc3RyaW5nLCBrZGY6IEtkZlR5cGUsXG4gICAgICAgIGtkZkl0ZXJhdGlvbnM6IG51bWJlciwgb3JnSWRlbnRpZmllcjogc3RyaW5nLCBrZXlzOiBLZXlzUmVxdWVzdCkge1xuICAgICAgICB0aGlzLm1hc3RlclBhc3N3b3JkSGFzaCA9IG1hc3RlclBhc3N3b3JkSGFzaDtcbiAgICAgICAgdGhpcy5rZXkgPSBrZXk7XG4gICAgICAgIHRoaXMubWFzdGVyUGFzc3dvcmRIaW50ID0gbWFzdGVyUGFzc3dvcmRIaW50O1xuICAgICAgICB0aGlzLmtkZiA9IGtkZjtcbiAgICAgICAgdGhpcy5rZGZJdGVyYXRpb25zID0ga2RmSXRlcmF0aW9ucztcbiAgICAgICAgdGhpcy5vcmdJZGVudGlmaWVyID0gb3JnSWRlbnRpZmllcjtcbiAgICAgICAgdGhpcy5rZXlzID0ga2V5cztcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBUd29GYWN0b3JQcm92aWRlclR5cGUgfSBmcm9tICcuLi8uLi9lbnVtcy90d29GYWN0b3JQcm92aWRlclR5cGUnO1xuXG5pbXBvcnQgeyBDYXB0Y2hhUHJvdGVjdGVkUmVxdWVzdCB9IGZyb20gJy4vY2FwdGNoYVByb3RlY3RlZFJlcXVlc3QnO1xuaW1wb3J0IHsgRGV2aWNlUmVxdWVzdCB9IGZyb20gJy4vZGV2aWNlUmVxdWVzdCc7XG5cbmltcG9ydCB7IFV0aWxzIH0gZnJvbSAnLi4vLi4vbWlzYy91dGlscyc7XG5cbmV4cG9ydCBjbGFzcyBUb2tlblJlcXVlc3QgaW1wbGVtZW50cyBDYXB0Y2hhUHJvdGVjdGVkUmVxdWVzdCB7XG4gICAgZW1haWw6IHN0cmluZztcbiAgICBtYXN0ZXJQYXNzd29yZEhhc2g6IHN0cmluZztcbiAgICBjb2RlOiBzdHJpbmc7XG4gICAgY29kZVZlcmlmaWVyOiBzdHJpbmc7XG4gICAgcmVkaXJlY3RVcmk6IHN0cmluZztcbiAgICBjbGllbnRJZDogc3RyaW5nO1xuICAgIGNsaWVudFNlY3JldDogc3RyaW5nO1xuICAgIGRldmljZT86IERldmljZVJlcXVlc3Q7XG5cbiAgICBjb25zdHJ1Y3RvcihjcmVkZW50aWFsczogc3RyaW5nW10sIGNvZGVzOiBzdHJpbmdbXSwgY2xpZW50SWRDbGllbnRTZWNyZXQ6IHN0cmluZ1tdLCBwdWJsaWMgcHJvdmlkZXI6IFR3b0ZhY3RvclByb3ZpZGVyVHlwZSxcbiAgICAgICAgcHVibGljIHRva2VuOiBzdHJpbmcsIHB1YmxpYyByZW1lbWJlcjogYm9vbGVhbiwgcHVibGljIGNhcHRjaGFSZXNwb25zZTogc3RyaW5nLCBkZXZpY2U/OiBEZXZpY2VSZXF1ZXN0KSB7XG4gICAgICAgIGlmIChjcmVkZW50aWFscyAhPSBudWxsICYmIGNyZWRlbnRpYWxzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIHRoaXMuZW1haWwgPSBjcmVkZW50aWFsc1swXTtcbiAgICAgICAgICAgIHRoaXMubWFzdGVyUGFzc3dvcmRIYXNoID0gY3JlZGVudGlhbHNbMV07XG4gICAgICAgIH0gZWxzZSBpZiAoY29kZXMgIT0gbnVsbCAmJiBjb2Rlcy5sZW5ndGggPiAyKSB7XG4gICAgICAgICAgICB0aGlzLmNvZGUgPSBjb2Rlc1swXTtcbiAgICAgICAgICAgIHRoaXMuY29kZVZlcmlmaWVyID0gY29kZXNbMV07XG4gICAgICAgICAgICB0aGlzLnJlZGlyZWN0VXJpID0gY29kZXNbMl07XG4gICAgICAgIH0gZWxzZSBpZiAoY2xpZW50SWRDbGllbnRTZWNyZXQgIT0gbnVsbCAmJiBjbGllbnRJZENsaWVudFNlY3JldC5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICB0aGlzLmNsaWVudElkID0gY2xpZW50SWRDbGllbnRTZWNyZXRbMF07XG4gICAgICAgICAgICB0aGlzLmNsaWVudFNlY3JldCA9IGNsaWVudElkQ2xpZW50U2VjcmV0WzFdO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGV2aWNlID0gZGV2aWNlICE9IG51bGwgPyBkZXZpY2UgOiBudWxsO1xuICAgIH1cblxuICAgIHRvSWRlbnRpdHlUb2tlbihjbGllbnRJZDogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IG9iajogYW55ID0ge1xuICAgICAgICAgICAgc2NvcGU6ICdhcGkgb2ZmbGluZV9hY2Nlc3MnLFxuICAgICAgICAgICAgY2xpZW50X2lkOiBjbGllbnRJZCxcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAodGhpcy5jbGllbnRTZWNyZXQgIT0gbnVsbCkge1xuICAgICAgICAgICAgb2JqLnNjb3BlID0gY2xpZW50SWQuc3RhcnRzV2l0aCgnb3JnYW5pemF0aW9uJykgPyAnYXBpLm9yZ2FuaXphdGlvbicgOiAnYXBpJztcbiAgICAgICAgICAgIG9iai5ncmFudF90eXBlID0gJ2NsaWVudF9jcmVkZW50aWFscyc7XG4gICAgICAgICAgICBvYmouY2xpZW50X3NlY3JldCA9IHRoaXMuY2xpZW50U2VjcmV0O1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMubWFzdGVyUGFzc3dvcmRIYXNoICE9IG51bGwgJiYgdGhpcy5lbWFpbCAhPSBudWxsKSB7XG4gICAgICAgICAgICBvYmouZ3JhbnRfdHlwZSA9ICdwYXNzd29yZCc7XG4gICAgICAgICAgICBvYmoudXNlcm5hbWUgPSB0aGlzLmVtYWlsO1xuICAgICAgICAgICAgb2JqLnBhc3N3b3JkID0gdGhpcy5tYXN0ZXJQYXNzd29yZEhhc2g7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb2RlICE9IG51bGwgJiYgdGhpcy5jb2RlVmVyaWZpZXIgIT0gbnVsbCAmJiB0aGlzLnJlZGlyZWN0VXJpICE9IG51bGwpIHtcbiAgICAgICAgICAgIG9iai5ncmFudF90eXBlID0gJ2F1dGhvcml6YXRpb25fY29kZSc7XG4gICAgICAgICAgICBvYmouY29kZSA9IHRoaXMuY29kZTtcbiAgICAgICAgICAgIG9iai5jb2RlX3ZlcmlmaWVyID0gdGhpcy5jb2RlVmVyaWZpZXI7XG4gICAgICAgICAgICBvYmoucmVkaXJlY3RfdXJpID0gdGhpcy5yZWRpcmVjdFVyaTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignbXVzdCBwcm92aWRlIGNyZWRlbnRpYWxzIG9yIGNvZGVzJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5kZXZpY2UpIHtcbiAgICAgICAgICAgIG9iai5kZXZpY2VUeXBlID0gdGhpcy5kZXZpY2UudHlwZTtcbiAgICAgICAgICAgIG9iai5kZXZpY2VJZGVudGlmaWVyID0gdGhpcy5kZXZpY2UuaWRlbnRpZmllcjtcbiAgICAgICAgICAgIG9iai5kZXZpY2VOYW1lID0gdGhpcy5kZXZpY2UubmFtZTtcbiAgICAgICAgICAgIC8vIG5vIHB1c2ggdG9rZW5zIGZvciBicm93c2VyIGFwcHMgeWV0XG4gICAgICAgICAgICAvLyBvYmouZGV2aWNlUHVzaFRva2VuID0gdGhpcy5kZXZpY2UucHVzaFRva2VuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMudG9rZW4gJiYgdGhpcy5wcm92aWRlciAhPSBudWxsKSB7XG4gICAgICAgICAgICBvYmoudHdvRmFjdG9yVG9rZW4gPSB0aGlzLnRva2VuO1xuICAgICAgICAgICAgb2JqLnR3b0ZhY3RvclByb3ZpZGVyID0gdGhpcy5wcm92aWRlcjtcbiAgICAgICAgICAgIG9iai50d29GYWN0b3JSZW1lbWJlciA9IHRoaXMucmVtZW1iZXIgPyAnMScgOiAnMCc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jYXB0Y2hhUmVzcG9uc2UgIT0gbnVsbCkge1xuICAgICAgICAgICAgb2JqLmNhcHRjaGFSZXNwb25zZSA9IHRoaXMuY2FwdGNoYVJlc3BvbnNlO1xuICAgICAgICB9XG5cblxuICAgICAgICByZXR1cm4gb2JqO1xuICAgIH1cblxuICAgIGFsdGVySWRlbnRpdHlUb2tlbkhlYWRlcnMoaGVhZGVyczogSGVhZGVycykge1xuICAgICAgICBpZiAodGhpcy5jbGllbnRTZWNyZXQgPT0gbnVsbCAmJiB0aGlzLm1hc3RlclBhc3N3b3JkSGFzaCAhPSBudWxsICYmIHRoaXMuZW1haWwgIT0gbnVsbCkge1xuICAgICAgICAgICAgaGVhZGVycy5zZXQoJ0F1dGgtRW1haWwnLCBVdGlscy5mcm9tVXRmOFRvVXJsQjY0KHRoaXMuZW1haWwpKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCB7IFBhc3N3b3JkVmVyaWZpY2F0aW9uUmVxdWVzdCB9IGZyb20gJy4vcGFzc3dvcmRWZXJpZmljYXRpb25SZXF1ZXN0JztcblxuZXhwb3J0IGNsYXNzIFR3b0ZhY3RvckVtYWlsUmVxdWVzdCBleHRlbmRzIFBhc3N3b3JkVmVyaWZpY2F0aW9uUmVxdWVzdCB7XG4gICAgZW1haWw6IHN0cmluZztcblxuICAgIGNvbnN0cnVjdG9yKGVtYWlsOiBzdHJpbmcsIG1hc3RlclBhc3N3b3JkSGFzaDogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMubWFzdGVyUGFzc3dvcmRIYXNoID0gbWFzdGVyUGFzc3dvcmRIYXNoO1xuICAgICAgICB0aGlzLmVtYWlsID0gZW1haWw7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgT3JnYW5pemF0aW9uVXNlclJlc2V0UGFzc3dvcmRSZXF1ZXN0IH0gZnJvbSAnLi9vcmdhbml6YXRpb25Vc2VyUmVzZXRQYXNzd29yZFJlcXVlc3QnO1xuXG5leHBvcnQgY2xhc3MgVXBkYXRlVGVtcFBhc3N3b3JkUmVxdWVzdCBleHRlbmRzIE9yZ2FuaXphdGlvblVzZXJSZXNldFBhc3N3b3JkUmVxdWVzdCB7XG4gICAgbWFzdGVyUGFzc3dvcmRIaW50OiBzdHJpbmc7XG59XG4iLCJleHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZVJlc3BvbnNlIHtcbiAgICBwcml2YXRlIHJlc3BvbnNlOiBhbnk7XG5cbiAgICBjb25zdHJ1Y3RvcihyZXNwb25zZTogYW55KSB7XG4gICAgICAgIHRoaXMucmVzcG9uc2UgPSByZXNwb25zZTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZ2V0UmVzcG9uc2VQcm9wZXJ0eShwcm9wZXJ0eU5hbWU6IHN0cmluZywgcmVzcG9uc2U6IGFueSA9IG51bGwsIGV4YWN0TmFtZSA9IGZhbHNlKTogYW55IHtcbiAgICAgICAgaWYgKHByb3BlcnR5TmFtZSA9PSBudWxsIHx8IHByb3BlcnR5TmFtZSA9PT0gJycpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigncHJvcGVydHlOYW1lIG11c3Qgbm90IGJlIG51bGwvZW1wdHkuJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc3BvbnNlID09IG51bGwgJiYgdGhpcy5yZXNwb25zZSAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXNwb25zZSA9IHRoaXMucmVzcG9uc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc3BvbnNlID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZXhhY3ROYW1lICYmIHJlc3BvbnNlW3Byb3BlcnR5TmFtZV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbGV0IG90aGVyQ2FzZVByb3BlcnR5TmFtZTogc3RyaW5nID0gbnVsbDtcbiAgICAgICAgICAgIGlmIChwcm9wZXJ0eU5hbWUuY2hhckF0KDApID09PSBwcm9wZXJ0eU5hbWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkpIHtcbiAgICAgICAgICAgICAgICBvdGhlckNhc2VQcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eU5hbWUuY2hhckF0KDApLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG90aGVyQ2FzZVByb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwcm9wZXJ0eU5hbWUubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgIG90aGVyQ2FzZVByb3BlcnR5TmFtZSArPSBwcm9wZXJ0eU5hbWUuc2xpY2UoMSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHByb3BlcnR5TmFtZSA9IG90aGVyQ2FzZVByb3BlcnR5TmFtZTtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZVtwcm9wZXJ0eU5hbWVdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyZXNwb25zZVtwcm9wZXJ0eU5hbWVdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eU5hbWUudG9VcHBlckNhc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzcG9uc2VbcHJvcGVydHlOYW1lXTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBVdGlscyB9IGZyb20gJy4uLy4uL21pc2MvdXRpbHMnO1xuXG5pbXBvcnQgeyBCYXNlUmVzcG9uc2UgfSBmcm9tICcuL2Jhc2VSZXNwb25zZSc7XG5cbmV4cG9ydCBjbGFzcyBFcnJvclJlc3BvbnNlIGV4dGVuZHMgQmFzZVJlc3BvbnNlIHtcbiAgICBtZXNzYWdlOiBzdHJpbmc7XG4gICAgdmFsaWRhdGlvbkVycm9yczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmdbXTsgfTtcbiAgICBzdGF0dXNDb2RlOiBudW1iZXI7XG4gICAgY2FwdGNoYVJlcXVpcmVkOiBib29sZWFuO1xuICAgIGNhcHRjaGFTaXRlS2V5OiBzdHJpbmc7XG5cbiAgICBjb25zdHJ1Y3RvcihyZXNwb25zZTogYW55LCBzdGF0dXM6IG51bWJlciwgaWRlbnRpdHlSZXNwb25zZT86IGJvb2xlYW4pIHtcbiAgICAgICAgc3VwZXIocmVzcG9uc2UpO1xuICAgICAgICBsZXQgZXJyb3JNb2RlbCA9IG51bGw7XG4gICAgICAgIGlmIChyZXNwb25zZSAhPSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZUVycm9yTW9kZWwgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ0Vycm9yTW9kZWwnKTtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZUVycm9yTW9kZWwgJiYgaWRlbnRpdHlSZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIGVycm9yTW9kZWwgPSByZXNwb25zZUVycm9yTW9kZWw7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGVycm9yTW9kZWwgPSByZXNwb25zZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlcnJvck1vZGVsKSB7XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2UgPSB0aGlzLmdldFJlc3BvbnNlUHJvcGVydHkoJ01lc3NhZ2UnLCBlcnJvck1vZGVsKTtcbiAgICAgICAgICAgIHRoaXMudmFsaWRhdGlvbkVycm9ycyA9IHRoaXMuZ2V0UmVzcG9uc2VQcm9wZXJ0eSgnVmFsaWRhdGlvbkVycm9ycycsIGVycm9yTW9kZWwpO1xuICAgICAgICAgICAgdGhpcy5jYXB0Y2hhU2l0ZUtleSA9IHRoaXMudmFsaWRhdGlvbkVycm9ycz8uSENhcHRjaGFfU2l0ZUtleT8uWzBdO1xuICAgICAgICAgICAgdGhpcy5jYXB0Y2hhUmVxdWlyZWQgPSAhVXRpbHMuaXNOdWxsT3JXaGl0ZXNwYWNlKHRoaXMuY2FwdGNoYVNpdGVLZXkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHN0YXR1cyA9PT0gNDI5KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlID0gJ1JhdGUgbGltaXQgZXhjZWVkZWQuIFRyeSBhZ2FpbiBsYXRlci4nO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3RhdHVzQ29kZSA9IHN0YXR1cztcbiAgICB9XG5cbiAgICBnZXRTaW5nbGVNZXNzYWdlKCk6IHN0cmluZyB7XG4gICAgICAgIGlmICh0aGlzLnZhbGlkYXRpb25FcnJvcnMgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubWVzc2FnZTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLnZhbGlkYXRpb25FcnJvcnMpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy52YWxpZGF0aW9uRXJyb3JzLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLnZhbGlkYXRpb25FcnJvcnNba2V5XS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy52YWxpZGF0aW9uRXJyb3JzW2tleV1bMF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMubWVzc2FnZTtcbiAgICB9XG5cbiAgICBnZXRBbGxNZXNzYWdlcygpOiBzdHJpbmdbXSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2VzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBpZiAodGhpcy52YWxpZGF0aW9uRXJyb3JzID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBtZXNzYWdlcztcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLnZhbGlkYXRpb25FcnJvcnMpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy52YWxpZGF0aW9uRXJyb3JzLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMudmFsaWRhdGlvbkVycm9yc1trZXldLmZvckVhY2goKGl0ZW06IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBwcmVmaXggPSAnJztcbiAgICAgICAgICAgICAgICBpZiAoa2V5LmluZGV4T2YoJ1snKSA+IC0xICYmIGtleS5pbmRleE9mKCddJykgPiAtMSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXN0U2VwID0ga2V5Lmxhc3RJbmRleE9mKCcuJyk7XG4gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGtleS5zdWJzdHIoMCwgbGFzdFNlcCA+IC0xID8gbGFzdFNlcCA6IGtleS5sZW5ndGgpICsgJzogJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbWVzc2FnZXMucHVzaChwcmVmaXggKyBpdGVtKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlcztcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBJdGVtVmlldyB9IGZyb20gJy4vaXRlbVZpZXcnO1xuXG5pbXBvcnQgeyBDYXJkIH0gZnJvbSAnLi4vZG9tYWluL2NhcmQnO1xuXG5pbXBvcnQgeyBDYXJkTGlua2VkSWQgYXMgTGlua2VkSWQgfSBmcm9tICcuLi8uLi9lbnVtcy9saW5rZWRJZFR5cGUnO1xuXG5pbXBvcnQgeyBsaW5rZWRGaWVsZE9wdGlvbiB9IGZyb20gJy4uLy4uL21pc2MvbGlua2VkRmllbGRPcHRpb24uZGVjb3JhdG9yJztcblxuZXhwb3J0IGNsYXNzIENhcmRWaWV3IGV4dGVuZHMgSXRlbVZpZXcge1xuICAgIEBsaW5rZWRGaWVsZE9wdGlvbihMaW5rZWRJZC5DYXJkaG9sZGVyTmFtZSlcbiAgICBjYXJkaG9sZGVyTmFtZTogc3RyaW5nID0gbnVsbDtcbiAgICBAbGlua2VkRmllbGRPcHRpb24oTGlua2VkSWQuRXhwTW9udGgsICdleHBpcmF0aW9uTW9udGgnKVxuICAgIGV4cE1vbnRoOiBzdHJpbmcgPSBudWxsO1xuICAgIEBsaW5rZWRGaWVsZE9wdGlvbihMaW5rZWRJZC5FeHBZZWFyLCAnZXhwaXJhdGlvblllYXInKVxuICAgIGV4cFllYXI6IHN0cmluZyA9IG51bGw7XG4gICAgQGxpbmtlZEZpZWxkT3B0aW9uKExpbmtlZElkLkNvZGUsICdzZWN1cml0eUNvZGUnKVxuICAgIGNvZGU6IHN0cmluZyA9IG51bGw7XG5cbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZVxuICAgIHByaXZhdGUgX2JyYW5kOiBzdHJpbmcgPSBudWxsO1xuICAgIHByaXZhdGUgX251bWJlcjogc3RyaW5nID0gbnVsbDtcbiAgICBwcml2YXRlIF9zdWJUaXRsZTogc3RyaW5nID0gbnVsbDtcbiAgICAvLyB0c2xpbnQ6ZW5hYmxlXG5cbiAgICBjb25zdHJ1Y3RvcihjPzogQ2FyZCkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cblxuICAgIGdldCBtYXNrZWRDb2RlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvZGUgIT0gbnVsbCA/ICfigKInLnJlcGVhdCh0aGlzLmNvZGUubGVuZ3RoKSA6IG51bGw7XG4gICAgfVxuXG4gICAgZ2V0IG1hc2tlZE51bWJlcigpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5udW1iZXIgIT0gbnVsbCA/ICfigKInLnJlcGVhdCh0aGlzLm51bWJlci5sZW5ndGgpIDogbnVsbDtcbiAgICB9XG5cbiAgICBAbGlua2VkRmllbGRPcHRpb24oTGlua2VkSWQuQnJhbmQpXG4gICAgZ2V0IGJyYW5kKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9icmFuZDtcbiAgICB9XG4gICAgc2V0IGJyYW5kKHZhbHVlOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5fYnJhbmQgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5fc3ViVGl0bGUgPSBudWxsO1xuICAgIH1cblxuICAgIEBsaW5rZWRGaWVsZE9wdGlvbihMaW5rZWRJZC5OdW1iZXIpXG4gICAgZ2V0IG51bWJlcigpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fbnVtYmVyO1xuICAgIH1cbiAgICBzZXQgbnVtYmVyKHZhbHVlOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5fbnVtYmVyID0gdmFsdWU7XG4gICAgICAgIHRoaXMuX3N1YlRpdGxlID0gbnVsbDtcbiAgICB9XG5cbiAgICBnZXQgc3ViVGl0bGUoKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKHRoaXMuX3N1YlRpdGxlID09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuX3N1YlRpdGxlID0gdGhpcy5icmFuZDtcbiAgICAgICAgICAgIGlmICh0aGlzLm51bWJlciAhPSBudWxsICYmIHRoaXMubnVtYmVyLmxlbmd0aCA+PSA0KSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3N1YlRpdGxlICE9IG51bGwgJiYgdGhpcy5fc3ViVGl0bGUgIT09ICcnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3N1YlRpdGxlICs9ICcsICc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc3ViVGl0bGUgPSAnJztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBTaG93IGxhc3QgNSBvbiBhbWV4LCBsYXN0IDQgZm9yIGFsbCBvdGhlcnNcbiAgICAgICAgICAgICAgICBjb25zdCBjb3VudCA9IHRoaXMubnVtYmVyLmxlbmd0aCA+PSA1ICYmIHRoaXMubnVtYmVyLm1hdGNoKG5ldyBSZWdFeHAoJ14zWzQ3XScpKSAhPSBudWxsID8gNSA6IDQ7XG4gICAgICAgICAgICAgICAgdGhpcy5fc3ViVGl0bGUgKz0gKCcqJyArIHRoaXMubnVtYmVyLnN1YnN0cih0aGlzLm51bWJlci5sZW5ndGggLSBjb3VudCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9zdWJUaXRsZTtcbiAgICB9XG5cbiAgICBnZXQgZXhwaXJhdGlvbigpOiBzdHJpbmcge1xuICAgICAgICBpZiAoIXRoaXMuZXhwTW9udGggJiYgIXRoaXMuZXhwWWVhcikge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZXhwID0gdGhpcy5leHBNb250aCAhPSBudWxsID8gKCcwJyArIHRoaXMuZXhwTW9udGgpLnNsaWNlKC0yKSA6ICdfXyc7XG4gICAgICAgIGV4cCArPSAoJyAvICcgKyAodGhpcy5leHBZZWFyICE9IG51bGwgPyB0aGlzLmZvcm1hdFllYXIodGhpcy5leHBZZWFyKSA6ICdfX19fJykpO1xuICAgICAgICByZXR1cm4gZXhwO1xuICAgIH1cblxuICAgIHByaXZhdGUgZm9ybWF0WWVhcih5ZWFyOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4geWVhci5sZW5ndGggPT09IDIgPyAnMjAnICsgeWVhciA6IHllYXI7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgQ2lwaGVyUmVwcm9tcHRUeXBlIH0gZnJvbSAnLi4vLi4vZW51bXMvY2lwaGVyUmVwcm9tcHRUeXBlJztcbmltcG9ydCB7IENpcGhlclR5cGUgfSBmcm9tICcuLi8uLi9lbnVtcy9jaXBoZXJUeXBlJztcbmltcG9ydCB7IExpbmtlZElkVHlwZSB9IGZyb20gJy4uLy4uL2VudW1zL2xpbmtlZElkVHlwZSc7XG5cbmltcG9ydCB7IENpcGhlciB9IGZyb20gJy4uL2RvbWFpbi9jaXBoZXInO1xuXG5pbXBvcnQgeyBBdHRhY2htZW50VmlldyB9IGZyb20gJy4vYXR0YWNobWVudFZpZXcnO1xuaW1wb3J0IHsgQ2FyZFZpZXcgfSBmcm9tICcuL2NhcmRWaWV3JztcbmltcG9ydCB7IEZpZWxkVmlldyB9IGZyb20gJy4vZmllbGRWaWV3JztcbmltcG9ydCB7IElkZW50aXR5VmlldyB9IGZyb20gJy4vaWRlbnRpdHlWaWV3JztcbmltcG9ydCB7IEl0ZW1WaWV3IH0gZnJvbSAnLi9pdGVtVmlldyc7XG5pbXBvcnQgeyBMb2dpblZpZXcgfSBmcm9tICcuL2xvZ2luVmlldyc7XG5pbXBvcnQgeyBQYXNzd29yZEhpc3RvcnlWaWV3IH0gZnJvbSAnLi9wYXNzd29yZEhpc3RvcnlWaWV3JztcbmltcG9ydCB7IFNlY3VyZU5vdGVWaWV3IH0gZnJvbSAnLi9zZWN1cmVOb3RlVmlldyc7XG5pbXBvcnQgeyBWaWV3IH0gZnJvbSAnLi92aWV3JztcblxuZXhwb3J0IGNsYXNzIENpcGhlclZpZXcgaW1wbGVtZW50cyBWaWV3IHtcbiAgICBpZDogc3RyaW5nID0gbnVsbDtcbiAgICBvcmdhbml6YXRpb25JZDogc3RyaW5nID0gbnVsbDtcbiAgICBmb2xkZXJJZDogc3RyaW5nID0gbnVsbDtcbiAgICBuYW1lOiBzdHJpbmcgPSBudWxsO1xuICAgIG5vdGVzOiBzdHJpbmcgPSBudWxsO1xuICAgIHR5cGU6IENpcGhlclR5cGUgPSBudWxsO1xuICAgIGZhdm9yaXRlID0gZmFsc2U7XG4gICAgb3JnYW5pemF0aW9uVXNlVG90cCA9IGZhbHNlO1xuICAgIGVkaXQgPSBmYWxzZTtcbiAgICB2aWV3UGFzc3dvcmQgPSB0cnVlO1xuICAgIGxvY2FsRGF0YTogYW55O1xuICAgIGxvZ2luID0gbmV3IExvZ2luVmlldygpO1xuICAgIGlkZW50aXR5ID0gbmV3IElkZW50aXR5VmlldygpO1xuICAgIGNhcmQgPSBuZXcgQ2FyZFZpZXcoKTtcbiAgICBzZWN1cmVOb3RlID0gbmV3IFNlY3VyZU5vdGVWaWV3KCk7XG4gICAgYXR0YWNobWVudHM6IEF0dGFjaG1lbnRWaWV3W10gPSBudWxsO1xuICAgIGZpZWxkczogRmllbGRWaWV3W10gPSBudWxsO1xuICAgIHBhc3N3b3JkSGlzdG9yeTogUGFzc3dvcmRIaXN0b3J5Vmlld1tdID0gbnVsbDtcbiAgICBjb2xsZWN0aW9uSWRzOiBzdHJpbmdbXSA9IG51bGw7XG4gICAgcmV2aXNpb25EYXRlOiBEYXRlID0gbnVsbDtcbiAgICBkZWxldGVkRGF0ZTogRGF0ZSA9IG51bGw7XG4gICAgcmVwcm9tcHQ6IENpcGhlclJlcHJvbXB0VHlwZSA9IENpcGhlclJlcHJvbXB0VHlwZS5Ob25lO1xuXG4gICAgY29uc3RydWN0b3IoYz86IENpcGhlcikge1xuICAgICAgICBpZiAoIWMpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaWQgPSBjLmlkO1xuICAgICAgICB0aGlzLm9yZ2FuaXphdGlvbklkID0gYy5vcmdhbml6YXRpb25JZDtcbiAgICAgICAgdGhpcy5mb2xkZXJJZCA9IGMuZm9sZGVySWQ7XG4gICAgICAgIHRoaXMuZmF2b3JpdGUgPSBjLmZhdm9yaXRlO1xuICAgICAgICB0aGlzLm9yZ2FuaXphdGlvblVzZVRvdHAgPSBjLm9yZ2FuaXphdGlvblVzZVRvdHA7XG4gICAgICAgIHRoaXMuZWRpdCA9IGMuZWRpdDtcbiAgICAgICAgdGhpcy52aWV3UGFzc3dvcmQgPSBjLnZpZXdQYXNzd29yZDtcbiAgICAgICAgdGhpcy50eXBlID0gYy50eXBlO1xuICAgICAgICB0aGlzLmxvY2FsRGF0YSA9IGMubG9jYWxEYXRhO1xuICAgICAgICB0aGlzLmNvbGxlY3Rpb25JZHMgPSBjLmNvbGxlY3Rpb25JZHM7XG4gICAgICAgIHRoaXMucmV2aXNpb25EYXRlID0gYy5yZXZpc2lvbkRhdGU7XG4gICAgICAgIHRoaXMuZGVsZXRlZERhdGUgPSBjLmRlbGV0ZWREYXRlO1xuICAgICAgICAvLyBPbGQgbG9jYWxseSBzdG9yZWQgY2lwaGVycyBtaWdodCBoYXZlIHJlcHJvbXB0ID09IG51bGwuIElmIHNvIHNldCBpdCB0byBOb25lLlxuICAgICAgICB0aGlzLnJlcHJvbXB0ID0gYy5yZXByb21wdCA/PyBDaXBoZXJSZXByb21wdFR5cGUuTm9uZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldCBpdGVtKCkge1xuICAgICAgICBzd2l0Y2ggKHRoaXMudHlwZSkge1xuICAgICAgICAgICAgY2FzZSBDaXBoZXJUeXBlLkxvZ2luOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmxvZ2luO1xuICAgICAgICAgICAgY2FzZSBDaXBoZXJUeXBlLlNlY3VyZU5vdGU6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VjdXJlTm90ZTtcbiAgICAgICAgICAgIGNhc2UgQ2lwaGVyVHlwZS5DYXJkOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNhcmQ7XG4gICAgICAgICAgICBjYXNlIENpcGhlclR5cGUuSWRlbnRpdHk6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaWRlbnRpdHk7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgZ2V0IHN1YlRpdGxlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLml0ZW0uc3ViVGl0bGU7XG4gICAgfVxuXG4gICAgZ2V0IGhhc1Bhc3N3b3JkSGlzdG9yeSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFzc3dvcmRIaXN0b3J5ICYmIHRoaXMucGFzc3dvcmRIaXN0b3J5Lmxlbmd0aCA+IDA7XG4gICAgfVxuXG4gICAgZ2V0IGhhc0F0dGFjaG1lbnRzKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5hdHRhY2htZW50cyAmJiB0aGlzLmF0dGFjaG1lbnRzLmxlbmd0aCA+IDA7XG4gICAgfVxuXG4gICAgZ2V0IGhhc09sZEF0dGFjaG1lbnRzKCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodGhpcy5oYXNBdHRhY2htZW50cykge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmF0dGFjaG1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYXR0YWNobWVudHNbaV0ua2V5ID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBnZXQgaGFzRmllbGRzKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5maWVsZHMgJiYgdGhpcy5maWVsZHMubGVuZ3RoID4gMDtcbiAgICB9XG5cbiAgICBnZXQgcGFzc3dvcmRSZXZpc2lvbkRpc3BsYXlEYXRlKCk6IERhdGUge1xuICAgICAgICBpZiAodGhpcy50eXBlICE9PSBDaXBoZXJUeXBlLkxvZ2luIHx8IHRoaXMubG9naW4gPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5sb2dpbi5wYXNzd29yZCA9PSBudWxsIHx8IHRoaXMubG9naW4ucGFzc3dvcmQgPT09ICcnKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5sb2dpbi5wYXNzd29yZFJldmlzaW9uRGF0ZTtcbiAgICB9XG5cbiAgICBnZXQgaXNEZWxldGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5kZWxldGVkRGF0ZSAhPSBudWxsO1xuICAgIH1cblxuICAgIGdldCBsaW5rZWRGaWVsZE9wdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLml0ZW0ubGlua2VkRmllbGRPcHRpb25zO1xuICAgIH1cblxuICAgIGxpbmtlZEZpZWxkVmFsdWUoaWQ6IExpbmtlZElkVHlwZSkge1xuICAgICAgICBjb25zdCBsaW5rZWRGaWVsZE9wdGlvbiA9IHRoaXMubGlua2VkRmllbGRPcHRpb25zPy5nZXQoaWQpO1xuICAgICAgICBpZiAobGlua2VkRmllbGRPcHRpb24gPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5pdGVtO1xuICAgICAgICByZXR1cm4gdGhpcy5pdGVtW2xpbmtlZEZpZWxkT3B0aW9uLnByb3BlcnR5S2V5IGFzIGtleW9mIHR5cGVvZiBpdGVtXTtcbiAgICB9XG5cbiAgICBsaW5rZWRGaWVsZEkxOG5LZXkoaWQ6IExpbmtlZElkVHlwZSk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmxpbmtlZEZpZWxkT3B0aW9ucy5nZXQoaWQpPy5pMThuS2V5O1xuICAgIH1cbn1cbiIsImltcG9ydCB7IEZpZWxkVHlwZSB9IGZyb20gJy4uLy4uL2VudW1zL2ZpZWxkVHlwZSc7XG5pbXBvcnQgeyBMaW5rZWRJZFR5cGUgfSBmcm9tICcuLi8uLi9lbnVtcy9saW5rZWRJZFR5cGUnO1xuXG5pbXBvcnQgeyBWaWV3IH0gZnJvbSAnLi92aWV3JztcblxuaW1wb3J0IHsgRmllbGQgfSBmcm9tICcuLi9kb21haW4vZmllbGQnO1xuXG5leHBvcnQgY2xhc3MgRmllbGRWaWV3IGltcGxlbWVudHMgVmlldyB7XG4gICAgbmFtZTogc3RyaW5nID0gbnVsbDtcbiAgICB2YWx1ZTogc3RyaW5nID0gbnVsbDtcbiAgICB0eXBlOiBGaWVsZFR5cGUgPSBudWxsO1xuICAgIG5ld0ZpZWxkOiBib29sZWFuID0gZmFsc2U7IC8vIE1hcmtzIGlmIHRoZSBmaWVsZCBpcyBuZXcgYW5kIGhhc24ndCBiZWVuIHNhdmVkXG4gICAgc2hvd1ZhbHVlOiBib29sZWFuID0gZmFsc2U7XG4gICAgbGlua2VkSWQ6IExpbmtlZElkVHlwZSA9IG51bGw7XG5cbiAgICBjb25zdHJ1Y3RvcihmPzogRmllbGQpIHtcbiAgICAgICAgaWYgKCFmKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnR5cGUgPSBmLnR5cGU7XG4gICAgICAgIHRoaXMubGlua2VkSWQgPSBmLmxpbmtlZElkO1xuICAgIH1cblxuICAgIGdldCBtYXNrZWRWYWx1ZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZSAhPSBudWxsID8gJ+KAouKAouKAouKAouKAouKAouKAouKAoicgOiBudWxsO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IFZpZXcgfSBmcm9tICcuL3ZpZXcnO1xuXG5pbXBvcnQgeyBGb2xkZXIgfSBmcm9tICcuLi9kb21haW4vZm9sZGVyJztcbmltcG9ydCB7IElUcmVlTm9kZU9iamVjdCB9IGZyb20gJy4uL2RvbWFpbi90cmVlTm9kZSc7XG5cbmV4cG9ydCBjbGFzcyBGb2xkZXJWaWV3IGltcGxlbWVudHMgVmlldywgSVRyZWVOb2RlT2JqZWN0IHtcbiAgICBpZDogc3RyaW5nID0gbnVsbDtcbiAgICBuYW1lOiBzdHJpbmcgPSBudWxsO1xuICAgIHJldmlzaW9uRGF0ZTogRGF0ZSA9IG51bGw7XG5cbiAgICBjb25zdHJ1Y3RvcihmPzogRm9sZGVyKSB7XG4gICAgICAgIGlmICghZikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pZCA9IGYuaWQ7XG4gICAgICAgIHRoaXMucmV2aXNpb25EYXRlID0gZi5yZXZpc2lvbkRhdGU7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgSXRlbVZpZXcgfSBmcm9tICcuL2l0ZW1WaWV3JztcblxuaW1wb3J0IHsgSWRlbnRpdHkgfSBmcm9tICcuLi9kb21haW4vaWRlbnRpdHknO1xuXG5pbXBvcnQgeyBVdGlscyB9IGZyb20gJy4uLy4uL21pc2MvdXRpbHMnO1xuXG5pbXBvcnQgeyBJZGVudGl0eUxpbmtlZElkIGFzIExpbmtlZElkIH0gZnJvbSAnLi4vLi4vZW51bXMvbGlua2VkSWRUeXBlJztcblxuaW1wb3J0IHsgbGlua2VkRmllbGRPcHRpb24gfSBmcm9tICcuLi8uLi9taXNjL2xpbmtlZEZpZWxkT3B0aW9uLmRlY29yYXRvcic7XG5cbmV4cG9ydCBjbGFzcyBJZGVudGl0eVZpZXcgZXh0ZW5kcyBJdGVtVmlldyB7XG4gICAgQGxpbmtlZEZpZWxkT3B0aW9uKExpbmtlZElkLlRpdGxlKVxuICAgIHRpdGxlOiBzdHJpbmcgPSBudWxsO1xuICAgIEBsaW5rZWRGaWVsZE9wdGlvbihMaW5rZWRJZC5NaWRkbGVOYW1lKVxuICAgIG1pZGRsZU5hbWU6IHN0cmluZyA9IG51bGw7XG4gICAgQGxpbmtlZEZpZWxkT3B0aW9uKExpbmtlZElkLkFkZHJlc3MxKVxuICAgIGFkZHJlc3MxOiBzdHJpbmcgPSBudWxsO1xuICAgIEBsaW5rZWRGaWVsZE9wdGlvbihMaW5rZWRJZC5BZGRyZXNzMilcbiAgICBhZGRyZXNzMjogc3RyaW5nID0gbnVsbDtcbiAgICBAbGlua2VkRmllbGRPcHRpb24oTGlua2VkSWQuQWRkcmVzczMpXG4gICAgYWRkcmVzczM6IHN0cmluZyA9IG51bGw7XG4gICAgQGxpbmtlZEZpZWxkT3B0aW9uKExpbmtlZElkLkNpdHksICdjaXR5VG93bicpXG4gICAgY2l0eTogc3RyaW5nID0gbnVsbDtcbiAgICBAbGlua2VkRmllbGRPcHRpb24oTGlua2VkSWQuU3RhdGUsICdzdGF0ZVByb3ZpbmNlJylcbiAgICBzdGF0ZTogc3RyaW5nID0gbnVsbDtcbiAgICBAbGlua2VkRmllbGRPcHRpb24oTGlua2VkSWQuUG9zdGFsQ29kZSwgJ3ppcFBvc3RhbENvZGUnKVxuICAgIHBvc3RhbENvZGU6IHN0cmluZyA9IG51bGw7XG4gICAgQGxpbmtlZEZpZWxkT3B0aW9uKExpbmtlZElkLkNvdW50cnkpXG4gICAgY291bnRyeTogc3RyaW5nID0gbnVsbDtcbiAgICBAbGlua2VkRmllbGRPcHRpb24oTGlua2VkSWQuQ29tcGFueSlcbiAgICBjb21wYW55OiBzdHJpbmcgPSBudWxsO1xuICAgIEBsaW5rZWRGaWVsZE9wdGlvbihMaW5rZWRJZC5FbWFpbClcbiAgICBlbWFpbDogc3RyaW5nID0gbnVsbDtcbiAgICBAbGlua2VkRmllbGRPcHRpb24oTGlua2VkSWQuUGhvbmUpXG4gICAgcGhvbmU6IHN0cmluZyA9IG51bGw7XG4gICAgQGxpbmtlZEZpZWxkT3B0aW9uKExpbmtlZElkLlNzbilcbiAgICBzc246IHN0cmluZyA9IG51bGw7XG4gICAgQGxpbmtlZEZpZWxkT3B0aW9uKExpbmtlZElkLlVzZXJuYW1lKVxuICAgIHVzZXJuYW1lOiBzdHJpbmcgPSBudWxsO1xuICAgIEBsaW5rZWRGaWVsZE9wdGlvbihMaW5rZWRJZC5QYXNzcG9ydE51bWJlcilcbiAgICBwYXNzcG9ydE51bWJlcjogc3RyaW5nID0gbnVsbDtcbiAgICBAbGlua2VkRmllbGRPcHRpb24oTGlua2VkSWQuTGljZW5zZU51bWJlcilcbiAgICBsaWNlbnNlTnVtYmVyOiBzdHJpbmcgPSBudWxsO1xuXG4gICAgLy8gdHNsaW50OmRpc2FibGVcbiAgICBwcml2YXRlIF9maXJzdE5hbWU6IHN0cmluZyA9IG51bGw7XG4gICAgcHJpdmF0ZSBfbGFzdE5hbWU6IHN0cmluZyA9IG51bGw7XG4gICAgcHJpdmF0ZSBfc3ViVGl0bGU6IHN0cmluZyA9IG51bGw7XG4gICAgLy8gdHNsaW50OmVuYWJsZVxuXG4gICAgY29uc3RydWN0b3IoaT86IElkZW50aXR5KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxuXG4gICAgQGxpbmtlZEZpZWxkT3B0aW9uKExpbmtlZElkLkZpcnN0TmFtZSlcbiAgICBnZXQgZmlyc3ROYW1lKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9maXJzdE5hbWU7XG4gICAgfVxuICAgIHNldCBmaXJzdE5hbWUodmFsdWU6IHN0cmluZykge1xuICAgICAgICB0aGlzLl9maXJzdE5hbWUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5fc3ViVGl0bGUgPSBudWxsO1xuICAgIH1cblxuICAgIEBsaW5rZWRGaWVsZE9wdGlvbihMaW5rZWRJZC5MYXN0TmFtZSlcbiAgICBnZXQgbGFzdE5hbWUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xhc3ROYW1lO1xuICAgIH1cbiAgICBzZXQgbGFzdE5hbWUodmFsdWU6IHN0cmluZykge1xuICAgICAgICB0aGlzLl9sYXN0TmFtZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLl9zdWJUaXRsZSA9IG51bGw7XG4gICAgfVxuXG4gICAgZ2V0IHN1YlRpdGxlKCk6IHN0cmluZyB7XG4gICAgICAgIGlmICh0aGlzLl9zdWJUaXRsZSA9PSBudWxsICYmICh0aGlzLmZpcnN0TmFtZSAhPSBudWxsIHx8IHRoaXMubGFzdE5hbWUgIT0gbnVsbCkpIHtcbiAgICAgICAgICAgIHRoaXMuX3N1YlRpdGxlID0gJyc7XG4gICAgICAgICAgICBpZiAodGhpcy5maXJzdE5hbWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3N1YlRpdGxlID0gdGhpcy5maXJzdE5hbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5sYXN0TmFtZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3N1YlRpdGxlICE9PSAnJykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9zdWJUaXRsZSArPSAnICc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuX3N1YlRpdGxlICs9IHRoaXMubGFzdE5hbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5fc3ViVGl0bGU7XG4gICAgfVxuXG4gICAgQGxpbmtlZEZpZWxkT3B0aW9uKExpbmtlZElkLkZ1bGxOYW1lKVxuICAgIGdldCBmdWxsTmFtZSgpOiBzdHJpbmcge1xuICAgICAgICBpZiAodGhpcy50aXRsZSAhPSBudWxsIHx8IHRoaXMuZmlyc3ROYW1lICE9IG51bGwgfHwgdGhpcy5taWRkbGVOYW1lICE9IG51bGwgfHwgdGhpcy5sYXN0TmFtZSAhPSBudWxsKSB7XG4gICAgICAgICAgICBsZXQgbmFtZSA9ICcnO1xuICAgICAgICAgICAgaWYgKHRoaXMudGl0bGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIG5hbWUgKz0gKHRoaXMudGl0bGUgKyAnICcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuZmlyc3ROYW1lICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBuYW1lICs9ICh0aGlzLmZpcnN0TmFtZSArICcgJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5taWRkbGVOYW1lICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBuYW1lICs9ICh0aGlzLm1pZGRsZU5hbWUgKyAnICcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMubGFzdE5hbWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIG5hbWUgKz0gdGhpcy5sYXN0TmFtZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBuYW1lLnRyaW0oKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGdldCBmdWxsQWRkcmVzcygpOiBzdHJpbmcge1xuICAgICAgICBsZXQgYWRkcmVzcyA9IHRoaXMuYWRkcmVzczE7XG4gICAgICAgIGlmICghVXRpbHMuaXNOdWxsT3JXaGl0ZXNwYWNlKHRoaXMuYWRkcmVzczIpKSB7XG4gICAgICAgICAgICBpZiAoIVV0aWxzLmlzTnVsbE9yV2hpdGVzcGFjZShhZGRyZXNzKSkge1xuICAgICAgICAgICAgICAgIGFkZHJlc3MgKz0gJywgJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFkZHJlc3MgKz0gdGhpcy5hZGRyZXNzMjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIVV0aWxzLmlzTnVsbE9yV2hpdGVzcGFjZSh0aGlzLmFkZHJlc3MzKSkge1xuICAgICAgICAgICAgaWYgKCFVdGlscy5pc051bGxPcldoaXRlc3BhY2UoYWRkcmVzcykpIHtcbiAgICAgICAgICAgICAgICBhZGRyZXNzICs9ICcsICc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhZGRyZXNzICs9IHRoaXMuYWRkcmVzczM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFkZHJlc3M7XG4gICAgfVxuXG4gICAgZ2V0IGZ1bGxBZGRyZXNzUGFydDIoKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKHRoaXMuY2l0eSA9PSBudWxsICYmIHRoaXMuc3RhdGUgPT0gbnVsbCAmJiB0aGlzLnBvc3RhbENvZGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2l0eSA9IHRoaXMuY2l0eSB8fCAnLSc7XG4gICAgICAgIGNvbnN0IHN0YXRlID0gdGhpcy5zdGF0ZTtcbiAgICAgICAgY29uc3QgcG9zdGFsQ29kZSA9IHRoaXMucG9zdGFsQ29kZSB8fCAnLSc7XG4gICAgICAgIGxldCBhZGRyZXNzUGFydDIgPSBjaXR5O1xuICAgICAgICBpZiAoIVV0aWxzLmlzTnVsbE9yV2hpdGVzcGFjZShzdGF0ZSkpIHtcbiAgICAgICAgICAgIGFkZHJlc3NQYXJ0MiArPSAnLCAnICsgc3RhdGU7XG4gICAgICAgIH1cbiAgICAgICAgYWRkcmVzc1BhcnQyICs9ICcsICcgKyBwb3N0YWxDb2RlO1xuICAgICAgICByZXR1cm4gYWRkcmVzc1BhcnQyO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IFZpZXcgfSBmcm9tICcuL3ZpZXcnO1xuXG5pbXBvcnQgeyBMaW5rZWRNZXRhZGF0YSB9IGZyb20gJy4uLy4uL21pc2MvbGlua2VkRmllbGRPcHRpb24uZGVjb3JhdG9yJztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEl0ZW1WaWV3IGltcGxlbWVudHMgVmlldyB7XG4gICAgbGlua2VkRmllbGRPcHRpb25zOiBNYXA8bnVtYmVyLCBMaW5rZWRNZXRhZGF0YT47XG4gICAgYWJzdHJhY3QgZ2V0IHN1YlRpdGxlKCk6IHN0cmluZztcbn1cbiIsImltcG9ydCB7IFVyaU1hdGNoVHlwZSB9IGZyb20gJy4uLy4uL2VudW1zL3VyaU1hdGNoVHlwZSc7XG5cbmltcG9ydCB7IFZpZXcgfSBmcm9tICcuL3ZpZXcnO1xuXG5pbXBvcnQgeyBMb2dpblVyaSB9IGZyb20gJy4uL2RvbWFpbi9sb2dpblVyaSc7XG5cbmltcG9ydCB7IFV0aWxzIH0gZnJvbSAnLi4vLi4vbWlzYy91dGlscyc7XG5cbmNvbnN0IENhbkxhdW5jaFdoaXRlbGlzdCA9IFtcbiAgICAnaHR0cHM6Ly8nLFxuICAgICdodHRwOi8vJyxcbiAgICAnc3NoOi8vJyxcbiAgICAnZnRwOi8vJyxcbiAgICAnc2Z0cDovLycsXG4gICAgJ2lyYzovLycsXG4gICAgJ3ZuYzovLycsXG4gICAgLy8gaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvd2luZG93cy1zZXJ2ZXIvcmVtb3RlL3JlbW90ZS1kZXNrdG9wLXNlcnZpY2VzL2NsaWVudHMvcmVtb3RlLWRlc2t0b3AtdXJpXG4gICAgJ3JkcDovLycsIC8vIExlZ2FjeSBSRFAgVVJJIHNjaGVtZVxuICAgICdtcy1yZDonLCAvLyBQcmVmZXJyZWQgUkRQIFVSSSBzY2hlbWVcbiAgICAnY2hyb21lOi8vJyxcbiAgICAnaW9zYXBwOi8vJyxcbiAgICAnYW5kcm9pZGFwcDovLycsXG5dO1xuXG5leHBvcnQgY2xhc3MgTG9naW5VcmlWaWV3IGltcGxlbWVudHMgVmlldyB7XG4gICAgbWF0Y2g6IFVyaU1hdGNoVHlwZSA9IG51bGw7XG5cbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZVxuICAgIHByaXZhdGUgX3VyaTogc3RyaW5nID0gbnVsbDtcbiAgICBwcml2YXRlIF9kb21haW46IHN0cmluZyA9IG51bGw7XG4gICAgcHJpdmF0ZSBfaG9zdG5hbWU6IHN0cmluZyA9IG51bGw7XG4gICAgcHJpdmF0ZSBfaG9zdDogc3RyaW5nID0gbnVsbDtcbiAgICBwcml2YXRlIF9jYW5MYXVuY2g6IGJvb2xlYW4gPSBudWxsO1xuICAgIC8vIHRzbGludDplbmFibGVcblxuICAgIGNvbnN0cnVjdG9yKHU/OiBMb2dpblVyaSkge1xuICAgICAgICBpZiAoIXUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubWF0Y2ggPSB1Lm1hdGNoO1xuICAgIH1cblxuICAgIGdldCB1cmkoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VyaTtcbiAgICB9XG4gICAgc2V0IHVyaSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX3VyaSA9IHZhbHVlO1xuICAgICAgICB0aGlzLl9kb21haW4gPSBudWxsO1xuICAgICAgICB0aGlzLl9jYW5MYXVuY2ggPSBudWxsO1xuICAgIH1cblxuICAgIGdldCBkb21haW4oKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKHRoaXMuX2RvbWFpbiA9PSBudWxsICYmIHRoaXMudXJpICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuX2RvbWFpbiA9IFV0aWxzLmdldERvbWFpbih0aGlzLnVyaSk7XG4gICAgICAgICAgICBpZiAodGhpcy5fZG9tYWluID09PSAnJykge1xuICAgICAgICAgICAgICAgIHRoaXMuX2RvbWFpbiA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5fZG9tYWluO1xuICAgIH1cblxuICAgIGdldCBob3N0bmFtZSgpOiBzdHJpbmcge1xuICAgICAgICBpZiAodGhpcy5tYXRjaCA9PT0gVXJpTWF0Y2hUeXBlLlJlZ3VsYXJFeHByZXNzaW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5faG9zdG5hbWUgPT0gbnVsbCAmJiB0aGlzLnVyaSAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLl9ob3N0bmFtZSA9IFV0aWxzLmdldEhvc3RuYW1lKHRoaXMudXJpKTtcbiAgICAgICAgICAgIGlmICh0aGlzLl9ob3N0bmFtZSA9PT0gJycpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9ob3N0bmFtZSA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5faG9zdG5hbWU7XG4gICAgfVxuXG4gICAgZ2V0IGhvc3QoKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKHRoaXMubWF0Y2ggPT09IFVyaU1hdGNoVHlwZS5SZWd1bGFyRXhwcmVzc2lvbikge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2hvc3QgPT0gbnVsbCAmJiB0aGlzLnVyaSAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLl9ob3N0ID0gVXRpbHMuZ2V0SG9zdCh0aGlzLnVyaSk7XG4gICAgICAgICAgICBpZiAodGhpcy5faG9zdCA9PT0gJycpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9ob3N0ID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLl9ob3N0O1xuICAgIH1cblxuICAgIGdldCBob3N0bmFtZU9yVXJpKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmhvc3RuYW1lICE9IG51bGwgPyB0aGlzLmhvc3RuYW1lIDogdGhpcy51cmk7XG4gICAgfVxuXG4gICAgZ2V0IGhvc3RPclVyaSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5ob3N0ICE9IG51bGwgPyB0aGlzLmhvc3QgOiB0aGlzLnVyaTtcbiAgICB9XG5cbiAgICBnZXQgaXNXZWJzaXRlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy51cmkgIT0gbnVsbCAmJiAodGhpcy51cmkuaW5kZXhPZignaHR0cDovLycpID09PSAwIHx8IHRoaXMudXJpLmluZGV4T2YoJ2h0dHBzOi8vJykgPT09IDAgfHxcbiAgICAgICAgICAgICh0aGlzLnVyaS5pbmRleE9mKCc6Ly8nKSA8IDAgJiYgVXRpbHMudGxkRW5kaW5nUmVnZXgudGVzdCh0aGlzLnVyaSkpKTtcbiAgICB9XG5cbiAgICBnZXQgY2FuTGF1bmNoKCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodGhpcy5fY2FuTGF1bmNoICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jYW5MYXVuY2g7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMudXJpICE9IG51bGwgJiYgdGhpcy5tYXRjaCAhPT0gVXJpTWF0Y2hUeXBlLlJlZ3VsYXJFeHByZXNzaW9uKSB7XG4gICAgICAgICAgICBjb25zdCB1cmkgPSB0aGlzLmxhdW5jaFVyaTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgQ2FuTGF1bmNoV2hpdGVsaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHVyaS5pbmRleE9mKENhbkxhdW5jaFdoaXRlbGlzdFtpXSkgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FuTGF1bmNoID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NhbkxhdW5jaDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fY2FuTGF1bmNoID0gZmFsc2U7XG4gICAgICAgIHJldHVybiB0aGlzLl9jYW5MYXVuY2g7XG4gICAgfVxuXG4gICAgZ2V0IGxhdW5jaFVyaSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy51cmkuaW5kZXhPZignOi8vJykgPCAwICYmIFV0aWxzLnRsZEVuZGluZ1JlZ2V4LnRlc3QodGhpcy51cmkpID8gKCdodHRwOi8vJyArIHRoaXMudXJpKSA6IHRoaXMudXJpO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IEl0ZW1WaWV3IH0gZnJvbSAnLi9pdGVtVmlldyc7XG5pbXBvcnQgeyBMb2dpblVyaVZpZXcgfSBmcm9tICcuL2xvZ2luVXJpVmlldyc7XG5cbmltcG9ydCB7IFV0aWxzIH0gZnJvbSAnLi4vLi4vbWlzYy91dGlscyc7XG5cbmltcG9ydCB7IExvZ2luIH0gZnJvbSAnLi4vZG9tYWluL2xvZ2luJztcblxuaW1wb3J0IHsgTG9naW5MaW5rZWRJZCBhcyBMaW5rZWRJZCB9IGZyb20gJy4uLy4uL2VudW1zL2xpbmtlZElkVHlwZSc7XG5cbmltcG9ydCB7IGxpbmtlZEZpZWxkT3B0aW9uIH0gZnJvbSAnLi4vLi4vbWlzYy9saW5rZWRGaWVsZE9wdGlvbi5kZWNvcmF0b3InO1xuXG5leHBvcnQgY2xhc3MgTG9naW5WaWV3IGV4dGVuZHMgSXRlbVZpZXcge1xuICAgIEBsaW5rZWRGaWVsZE9wdGlvbihMaW5rZWRJZC5Vc2VybmFtZSlcbiAgICB1c2VybmFtZTogc3RyaW5nID0gbnVsbDtcbiAgICBAbGlua2VkRmllbGRPcHRpb24oTGlua2VkSWQuUGFzc3dvcmQpXG4gICAgcGFzc3dvcmQ6IHN0cmluZyA9IG51bGw7XG5cbiAgICBwYXNzd29yZFJldmlzaW9uRGF0ZT86IERhdGUgPSBudWxsO1xuICAgIHRvdHA6IHN0cmluZyA9IG51bGw7XG4gICAgdXJpczogTG9naW5VcmlWaWV3W10gPSBudWxsO1xuICAgIGF1dG9maWxsT25QYWdlTG9hZDogYm9vbGVhbiA9IG51bGw7XG5cbiAgICBjb25zdHJ1Y3RvcihsPzogTG9naW4pIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgaWYgKCFsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnBhc3N3b3JkUmV2aXNpb25EYXRlID0gbC5wYXNzd29yZFJldmlzaW9uRGF0ZTtcbiAgICAgICAgdGhpcy5hdXRvZmlsbE9uUGFnZUxvYWQgPSBsLmF1dG9maWxsT25QYWdlTG9hZDtcbiAgICB9XG5cbiAgICBnZXQgdXJpKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmhhc1VyaXMgPyB0aGlzLnVyaXNbMF0udXJpIDogbnVsbDtcbiAgICB9XG5cbiAgICBnZXQgbWFza2VkUGFzc3dvcmQoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFzc3dvcmQgIT0gbnVsbCA/ICfigKLigKLigKLigKLigKLigKLigKLigKInIDogbnVsbDtcbiAgICB9XG5cbiAgICBnZXQgc3ViVGl0bGUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudXNlcm5hbWU7XG4gICAgfVxuXG4gICAgZ2V0IGNhbkxhdW5jaCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGFzVXJpcyAmJiB0aGlzLnVyaXMuc29tZSh1ID0+IHUuY2FuTGF1bmNoKTtcbiAgICB9XG5cbiAgICBnZXQgaGFzVG90cCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICFVdGlscy5pc051bGxPcldoaXRlc3BhY2UodGhpcy50b3RwKTtcbiAgICB9XG5cbiAgICBnZXQgbGF1bmNoVXJpKCk6IHN0cmluZyB7XG4gICAgICAgIGlmICh0aGlzLmhhc1VyaXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHVyaSA9IHRoaXMudXJpcy5maW5kKHUgPT4gdS5jYW5MYXVuY2gpO1xuICAgICAgICAgICAgaWYgKHVyaSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVyaS5sYXVuY2hVcmk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgZ2V0IGhhc1VyaXMoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnVyaXMgIT0gbnVsbCAmJiB0aGlzLnVyaXMubGVuZ3RoID4gMDtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBTZWN1cmVOb3RlVHlwZSB9IGZyb20gJy4uLy4uL2VudW1zL3NlY3VyZU5vdGVUeXBlJztcblxuaW1wb3J0IHsgSXRlbVZpZXcgfSBmcm9tICcuL2l0ZW1WaWV3JztcblxuaW1wb3J0IHsgU2VjdXJlTm90ZSB9IGZyb20gJy4uL2RvbWFpbi9zZWN1cmVOb3RlJztcblxuZXhwb3J0IGNsYXNzIFNlY3VyZU5vdGVWaWV3IGV4dGVuZHMgSXRlbVZpZXcge1xuICAgIHR5cGU6IFNlY3VyZU5vdGVUeXBlID0gbnVsbDtcblxuICAgIGNvbnN0cnVjdG9yKG4/OiBTZWN1cmVOb3RlKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIGlmICghbikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy50eXBlID0gbi50eXBlO1xuICAgIH1cblxuICAgIGdldCBzdWJUaXRsZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBWaWV3IH0gZnJvbSAnLi92aWV3JztcblxuaW1wb3J0IHsgU2VuZEZpbGUgfSBmcm9tICcuLi9kb21haW4vc2VuZEZpbGUnO1xuXG5leHBvcnQgY2xhc3MgU2VuZEZpbGVWaWV3IGltcGxlbWVudHMgVmlldyB7XG4gICAgaWQ6IHN0cmluZyA9IG51bGw7XG4gICAgc2l6ZTogc3RyaW5nID0gbnVsbDtcbiAgICBzaXplTmFtZTogc3RyaW5nID0gbnVsbDtcbiAgICBmaWxlTmFtZTogc3RyaW5nID0gbnVsbDtcblxuICAgIGNvbnN0cnVjdG9yKGY/OiBTZW5kRmlsZSkge1xuICAgICAgICBpZiAoIWYpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaWQgPSBmLmlkO1xuICAgICAgICB0aGlzLnNpemUgPSBmLnNpemU7XG4gICAgICAgIHRoaXMuc2l6ZU5hbWUgPSBmLnNpemVOYW1lO1xuICAgIH1cblxuICAgIGdldCBmaWxlU2l6ZSgpOiBudW1iZXIge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKHRoaXMuc2l6ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KHRoaXMuc2l6ZSwgbnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLy8gSW52YWxpZCBmaWxlIHNpemUuXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgVmlldyB9IGZyb20gJy4vdmlldyc7XG5cbmltcG9ydCB7IFNlbmRUZXh0IH0gZnJvbSAnLi4vZG9tYWluL3NlbmRUZXh0JztcblxuZXhwb3J0IGNsYXNzIFNlbmRUZXh0VmlldyBpbXBsZW1lbnRzIFZpZXcge1xuICAgIHRleHQ6IHN0cmluZyA9IG51bGw7XG4gICAgaGlkZGVuOiBib29sZWFuO1xuXG4gICAgY29uc3RydWN0b3IodD86IFNlbmRUZXh0KSB7XG4gICAgICAgIGlmICghdCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5oaWRkZW4gPSB0LmhpZGRlbjtcbiAgICB9XG5cbiAgICBnZXQgbWFza2VkVGV4dCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy50ZXh0ICE9IG51bGwgPyAn4oCi4oCi4oCi4oCi4oCi4oCi4oCi4oCiJyA6IG51bGw7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgU2VuZFR5cGUgfSBmcm9tICcuLi8uLi9lbnVtcy9zZW5kVHlwZSc7XG5pbXBvcnQgeyBVdGlscyB9IGZyb20gJy4uLy4uL21pc2MvdXRpbHMnO1xuXG5pbXBvcnQgeyBTZW5kIH0gZnJvbSAnLi4vZG9tYWluL3NlbmQnO1xuaW1wb3J0IHsgU3ltbWV0cmljQ3J5cHRvS2V5IH0gZnJvbSAnLi4vZG9tYWluL3N5bW1ldHJpY0NyeXB0b0tleSc7XG5cbmltcG9ydCB7IFNlbmRGaWxlVmlldyB9IGZyb20gJy4vc2VuZEZpbGVWaWV3JztcbmltcG9ydCB7IFNlbmRUZXh0VmlldyB9IGZyb20gJy4vc2VuZFRleHRWaWV3JztcbmltcG9ydCB7IFZpZXcgfSBmcm9tICcuL3ZpZXcnO1xuXG5leHBvcnQgY2xhc3MgU2VuZFZpZXcgaW1wbGVtZW50cyBWaWV3IHtcbiAgICBpZDogc3RyaW5nID0gbnVsbDtcbiAgICBhY2Nlc3NJZDogc3RyaW5nID0gbnVsbDtcbiAgICBuYW1lOiBzdHJpbmcgPSBudWxsO1xuICAgIG5vdGVzOiBzdHJpbmcgPSBudWxsO1xuICAgIGtleTogQXJyYXlCdWZmZXI7XG4gICAgY3J5cHRvS2V5OiBTeW1tZXRyaWNDcnlwdG9LZXk7XG4gICAgdHlwZTogU2VuZFR5cGUgPSBudWxsO1xuICAgIHRleHQgPSBuZXcgU2VuZFRleHRWaWV3KCk7XG4gICAgZmlsZSA9IG5ldyBTZW5kRmlsZVZpZXcoKTtcbiAgICBtYXhBY2Nlc3NDb3VudD86IG51bWJlciA9IG51bGw7XG4gICAgYWNjZXNzQ291bnQ6IG51bWJlciA9IDA7XG4gICAgcmV2aXNpb25EYXRlOiBEYXRlID0gbnVsbDtcbiAgICBkZWxldGlvbkRhdGU6IERhdGUgPSBudWxsO1xuICAgIGV4cGlyYXRpb25EYXRlOiBEYXRlID0gbnVsbDtcbiAgICBwYXNzd29yZDogc3RyaW5nID0gbnVsbDtcbiAgICBkaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xuICAgIGhpZGVFbWFpbDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgY29uc3RydWN0b3Iocz86IFNlbmQpIHtcbiAgICAgICAgaWYgKCFzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmlkID0gcy5pZDtcbiAgICAgICAgdGhpcy5hY2Nlc3NJZCA9IHMuYWNjZXNzSWQ7XG4gICAgICAgIHRoaXMudHlwZSA9IHMudHlwZTtcbiAgICAgICAgdGhpcy5tYXhBY2Nlc3NDb3VudCA9IHMubWF4QWNjZXNzQ291bnQ7XG4gICAgICAgIHRoaXMuYWNjZXNzQ291bnQgPSBzLmFjY2Vzc0NvdW50O1xuICAgICAgICB0aGlzLnJldmlzaW9uRGF0ZSA9IHMucmV2aXNpb25EYXRlO1xuICAgICAgICB0aGlzLmRlbGV0aW9uRGF0ZSA9IHMuZGVsZXRpb25EYXRlO1xuICAgICAgICB0aGlzLmV4cGlyYXRpb25EYXRlID0gcy5leHBpcmF0aW9uRGF0ZTtcbiAgICAgICAgdGhpcy5kaXNhYmxlZCA9IHMuZGlzYWJsZWQ7XG4gICAgICAgIHRoaXMucGFzc3dvcmQgPSBzLnBhc3N3b3JkO1xuICAgICAgICB0aGlzLmhpZGVFbWFpbCA9IHMuaGlkZUVtYWlsO1xuICAgIH1cblxuICAgIGdldCB1cmxCNjRLZXkoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIFV0aWxzLmZyb21CdWZmZXJUb1VybEI2NCh0aGlzLmtleSk7XG4gICAgfVxuXG4gICAgZ2V0IG1heEFjY2Vzc0NvdW50UmVhY2hlZCgpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMubWF4QWNjZXNzQ291bnQgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmFjY2Vzc0NvdW50ID49IHRoaXMubWF4QWNjZXNzQ291bnQ7XG4gICAgfVxuXG4gICAgZ2V0IGV4cGlyZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICh0aGlzLmV4cGlyYXRpb25EYXRlID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5leHBpcmF0aW9uRGF0ZSA8PSBuZXcgRGF0ZSgpO1xuICAgIH1cblxuICAgIGdldCBwZW5kaW5nRGVsZXRlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5kZWxldGlvbkRhdGUgPD0gbmV3IERhdGUoKTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBIYXNoUHVycG9zZSB9IGZyb20gJy4uL2VudW1zL2hhc2hQdXJwb3NlJztcbmltcG9ydCB7IEtkZlR5cGUgfSBmcm9tICcuLi9lbnVtcy9rZGZUeXBlJztcbmltcG9ydCB7IFR3b0ZhY3RvclByb3ZpZGVyVHlwZSB9IGZyb20gJy4uL2VudW1zL3R3b0ZhY3RvclByb3ZpZGVyVHlwZSc7XG5cbmltcG9ydCB7IEF1dGhSZXN1bHQgfSBmcm9tICcuLi9tb2RlbHMvZG9tYWluL2F1dGhSZXN1bHQnO1xuaW1wb3J0IHsgU3ltbWV0cmljQ3J5cHRvS2V5IH0gZnJvbSAnLi4vbW9kZWxzL2RvbWFpbi9zeW1tZXRyaWNDcnlwdG9LZXknO1xuXG5pbXBvcnQgeyBTZXRDcnlwdG9BZ2VudEtleVJlcXVlc3QgfSBmcm9tICcuLi9tb2RlbHMvcmVxdWVzdC9hY2NvdW50L3NldENyeXB0b0FnZW50S2V5UmVxdWVzdCc7XG5pbXBvcnQgeyBDcnlwdG9BZ2VudFVzZXJLZXlSZXF1ZXN0IH0gZnJvbSAnLi4vbW9kZWxzL3JlcXVlc3QvY3J5cHRvQWdlbnRVc2VyS2V5UmVxdWVzdCc7XG5pbXBvcnQgeyBEZXZpY2VSZXF1ZXN0IH0gZnJvbSAnLi4vbW9kZWxzL3JlcXVlc3QvZGV2aWNlUmVxdWVzdCc7XG5pbXBvcnQgeyBLZXlzUmVxdWVzdCB9IGZyb20gJy4uL21vZGVscy9yZXF1ZXN0L2tleXNSZXF1ZXN0JztcbmltcG9ydCB7IFByZWxvZ2luUmVxdWVzdCB9IGZyb20gJy4uL21vZGVscy9yZXF1ZXN0L3ByZWxvZ2luUmVxdWVzdCc7XG5pbXBvcnQgeyBUb2tlblJlcXVlc3QgfSBmcm9tICcuLi9tb2RlbHMvcmVxdWVzdC90b2tlblJlcXVlc3QnO1xuXG5pbXBvcnQgeyBJZGVudGl0eVRva2VuUmVzcG9uc2UgfSBmcm9tICcuLi9tb2RlbHMvcmVzcG9uc2UvaWRlbnRpdHlUb2tlblJlc3BvbnNlJztcbmltcG9ydCB7IElkZW50aXR5VHdvRmFjdG9yUmVzcG9uc2UgfSBmcm9tICcuLi9tb2RlbHMvcmVzcG9uc2UvaWRlbnRpdHlUd29GYWN0b3JSZXNwb25zZSc7XG5cbmltcG9ydCB7IEFwaVNlcnZpY2UgfSBmcm9tICcuLi9hYnN0cmFjdGlvbnMvYXBpLnNlcnZpY2UnO1xuaW1wb3J0IHsgQXBwSWRTZXJ2aWNlIH0gZnJvbSAnLi4vYWJzdHJhY3Rpb25zL2FwcElkLnNlcnZpY2UnO1xuaW1wb3J0IHsgQXV0aFNlcnZpY2UgYXMgQXV0aFNlcnZpY2VBYnN0cmFjdGlvbiB9IGZyb20gJy4uL2Fic3RyYWN0aW9ucy9hdXRoLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ3J5cHRvU2VydmljZSB9IGZyb20gJy4uL2Fic3RyYWN0aW9ucy9jcnlwdG8uc2VydmljZSc7XG5pbXBvcnQgeyBDcnlwdG9GdW5jdGlvblNlcnZpY2UgfSBmcm9tICcuLi9hYnN0cmFjdGlvbnMvY3J5cHRvRnVuY3Rpb24uc2VydmljZSc7XG5pbXBvcnQgeyBJMThuU2VydmljZSB9IGZyb20gJy4uL2Fic3RyYWN0aW9ucy9pMThuLnNlcnZpY2UnO1xuaW1wb3J0IHsgTG9nU2VydmljZSB9IGZyb20gJy4uL2Fic3RyYWN0aW9ucy9sb2cuc2VydmljZSc7XG5pbXBvcnQgeyBNZXNzYWdpbmdTZXJ2aWNlIH0gZnJvbSAnLi4vYWJzdHJhY3Rpb25zL21lc3NhZ2luZy5zZXJ2aWNlJztcbmltcG9ydCB7IFBsYXRmb3JtVXRpbHNTZXJ2aWNlIH0gZnJvbSAnLi4vYWJzdHJhY3Rpb25zL3BsYXRmb3JtVXRpbHMuc2VydmljZSc7XG5pbXBvcnQgeyBUb2tlblNlcnZpY2UgfSBmcm9tICcuLi9hYnN0cmFjdGlvbnMvdG9rZW4uc2VydmljZSc7XG5pbXBvcnQgeyBVc2VyU2VydmljZSB9IGZyb20gJy4uL2Fic3RyYWN0aW9ucy91c2VyLnNlcnZpY2UnO1xuaW1wb3J0IHsgVmF1bHRUaW1lb3V0U2VydmljZSB9IGZyb20gJy4uL2Fic3RyYWN0aW9ucy92YXVsdFRpbWVvdXQuc2VydmljZSc7XG5cbmltcG9ydCB7IFV0aWxzIH0gZnJvbSAnLi4vbWlzYy91dGlscyc7XG5cbmV4cG9ydCBjb25zdCBUd29GYWN0b3JQcm92aWRlcnMgPSB7XG4gICAgW1R3b0ZhY3RvclByb3ZpZGVyVHlwZS5BdXRoZW50aWNhdG9yXToge1xuICAgICAgICB0eXBlOiBUd29GYWN0b3JQcm92aWRlclR5cGUuQXV0aGVudGljYXRvcixcbiAgICAgICAgbmFtZTogbnVsbCBhcyBzdHJpbmcsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBudWxsIGFzIHN0cmluZyxcbiAgICAgICAgcHJpb3JpdHk6IDEsXG4gICAgICAgIHNvcnQ6IDEsXG4gICAgICAgIHByZW1pdW06IGZhbHNlLFxuICAgIH0sXG4gICAgW1R3b0ZhY3RvclByb3ZpZGVyVHlwZS5ZdWJpa2V5XToge1xuICAgICAgICB0eXBlOiBUd29GYWN0b3JQcm92aWRlclR5cGUuWXViaWtleSxcbiAgICAgICAgbmFtZTogbnVsbCBhcyBzdHJpbmcsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBudWxsIGFzIHN0cmluZyxcbiAgICAgICAgcHJpb3JpdHk6IDMsXG4gICAgICAgIHNvcnQ6IDIsXG4gICAgICAgIHByZW1pdW06IHRydWUsXG4gICAgfSxcbiAgICBbVHdvRmFjdG9yUHJvdmlkZXJUeXBlLkR1b106IHtcbiAgICAgICAgdHlwZTogVHdvRmFjdG9yUHJvdmlkZXJUeXBlLkR1byxcbiAgICAgICAgbmFtZTogJ0R1bycsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBudWxsIGFzIHN0cmluZyxcbiAgICAgICAgcHJpb3JpdHk6IDIsXG4gICAgICAgIHNvcnQ6IDMsXG4gICAgICAgIHByZW1pdW06IHRydWUsXG4gICAgfSxcbiAgICBbVHdvRmFjdG9yUHJvdmlkZXJUeXBlLk9yZ2FuaXphdGlvbkR1b106IHtcbiAgICAgICAgdHlwZTogVHdvRmFjdG9yUHJvdmlkZXJUeXBlLk9yZ2FuaXphdGlvbkR1byxcbiAgICAgICAgbmFtZTogJ0R1byAoT3JnYW5pemF0aW9uKScsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBudWxsIGFzIHN0cmluZyxcbiAgICAgICAgcHJpb3JpdHk6IDEwLFxuICAgICAgICBzb3J0OiA0LFxuICAgICAgICBwcmVtaXVtOiBmYWxzZSxcbiAgICB9LFxuICAgIFtUd29GYWN0b3JQcm92aWRlclR5cGUuRW1haWxdOiB7XG4gICAgICAgIHR5cGU6IFR3b0ZhY3RvclByb3ZpZGVyVHlwZS5FbWFpbCxcbiAgICAgICAgbmFtZTogbnVsbCBhcyBzdHJpbmcsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBudWxsIGFzIHN0cmluZyxcbiAgICAgICAgcHJpb3JpdHk6IDAsXG4gICAgICAgIHNvcnQ6IDYsXG4gICAgICAgIHByZW1pdW06IGZhbHNlLFxuICAgIH0sXG4gICAgW1R3b0ZhY3RvclByb3ZpZGVyVHlwZS5XZWJBdXRobl06IHtcbiAgICAgICAgdHlwZTogVHdvRmFjdG9yUHJvdmlkZXJUeXBlLldlYkF1dGhuLFxuICAgICAgICBuYW1lOiBudWxsIGFzIHN0cmluZyxcbiAgICAgICAgZGVzY3JpcHRpb246IG51bGwgYXMgc3RyaW5nLFxuICAgICAgICBwcmlvcml0eTogNCxcbiAgICAgICAgc29ydDogNSxcbiAgICAgICAgcHJlbWl1bTogdHJ1ZSxcbiAgICB9LFxufTtcblxuZXhwb3J0IGNsYXNzIEF1dGhTZXJ2aWNlIGltcGxlbWVudHMgQXV0aFNlcnZpY2VBYnN0cmFjdGlvbiB7XG4gICAgZW1haWw6IHN0cmluZztcbiAgICBtYXN0ZXJQYXNzd29yZEhhc2g6IHN0cmluZztcbiAgICBsb2NhbE1hc3RlclBhc3N3b3JkSGFzaDogc3RyaW5nO1xuICAgIGNvZGU6IHN0cmluZztcbiAgICBjb2RlVmVyaWZpZXI6IHN0cmluZztcbiAgICBzc29SZWRpcmVjdFVybDogc3RyaW5nO1xuICAgIGNsaWVudElkOiBzdHJpbmc7XG4gICAgY2xpZW50U2VjcmV0OiBzdHJpbmc7XG4gICAgdHdvRmFjdG9yUHJvdmlkZXJzRGF0YTogTWFwPFR3b0ZhY3RvclByb3ZpZGVyVHlwZSwgeyBba2V5OiBzdHJpbmddOiBzdHJpbmc7IH0+O1xuICAgIHNlbGVjdGVkVHdvRmFjdG9yUHJvdmlkZXJUeXBlOiBUd29GYWN0b3JQcm92aWRlclR5cGUgPSBudWxsO1xuICAgIGNhcHRjaGFUb2tlbjogc3RyaW5nO1xuXG4gICAgcHJpdmF0ZSBrZXk6IFN5bW1ldHJpY0NyeXB0b0tleTtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgY3J5cHRvU2VydmljZTogQ3J5cHRvU2VydmljZSwgcHJvdGVjdGVkIGFwaVNlcnZpY2U6IEFwaVNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgdXNlclNlcnZpY2U6IFVzZXJTZXJ2aWNlLCBwcm90ZWN0ZWQgdG9rZW5TZXJ2aWNlOiBUb2tlblNlcnZpY2UsXG4gICAgICAgIHByb3RlY3RlZCBhcHBJZFNlcnZpY2U6IEFwcElkU2VydmljZSwgcHJpdmF0ZSBpMThuU2VydmljZTogSTE4blNlcnZpY2UsXG4gICAgICAgIHByb3RlY3RlZCBwbGF0Zm9ybVV0aWxzU2VydmljZTogUGxhdGZvcm1VdGlsc1NlcnZpY2UsIHByaXZhdGUgbWVzc2FnaW5nU2VydmljZTogTWVzc2FnaW5nU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSB2YXVsdFRpbWVvdXRTZXJ2aWNlOiBWYXVsdFRpbWVvdXRTZXJ2aWNlLCBwcml2YXRlIGxvZ1NlcnZpY2U6IExvZ1NlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgY3J5cHRvRnVuY3Rpb25TZXJ2aWNlOiBDcnlwdG9GdW5jdGlvblNlcnZpY2UsIHByaXZhdGUgc2V0Q3J5cHRvS2V5cyA9IHRydWUpIHtcbiAgICB9XG5cbiAgICBpbml0KCkge1xuICAgICAgICBUd29GYWN0b3JQcm92aWRlcnNbVHdvRmFjdG9yUHJvdmlkZXJUeXBlLkVtYWlsXS5uYW1lID0gdGhpcy5pMThuU2VydmljZS50KCdlbWFpbFRpdGxlJyk7XG4gICAgICAgIFR3b0ZhY3RvclByb3ZpZGVyc1tUd29GYWN0b3JQcm92aWRlclR5cGUuRW1haWxdLmRlc2NyaXB0aW9uID0gdGhpcy5pMThuU2VydmljZS50KCdlbWFpbERlc2MnKTtcblxuICAgICAgICBUd29GYWN0b3JQcm92aWRlcnNbVHdvRmFjdG9yUHJvdmlkZXJUeXBlLkF1dGhlbnRpY2F0b3JdLm5hbWUgPSB0aGlzLmkxOG5TZXJ2aWNlLnQoJ2F1dGhlbnRpY2F0b3JBcHBUaXRsZScpO1xuICAgICAgICBUd29GYWN0b3JQcm92aWRlcnNbVHdvRmFjdG9yUHJvdmlkZXJUeXBlLkF1dGhlbnRpY2F0b3JdLmRlc2NyaXB0aW9uID1cbiAgICAgICAgICAgIHRoaXMuaTE4blNlcnZpY2UudCgnYXV0aGVudGljYXRvckFwcERlc2MnKTtcblxuICAgICAgICBUd29GYWN0b3JQcm92aWRlcnNbVHdvRmFjdG9yUHJvdmlkZXJUeXBlLkR1b10uZGVzY3JpcHRpb24gPSB0aGlzLmkxOG5TZXJ2aWNlLnQoJ2R1b0Rlc2MnKTtcblxuICAgICAgICBUd29GYWN0b3JQcm92aWRlcnNbVHdvRmFjdG9yUHJvdmlkZXJUeXBlLk9yZ2FuaXphdGlvbkR1b10ubmFtZSA9XG4gICAgICAgICAgICAnRHVvICgnICsgdGhpcy5pMThuU2VydmljZS50KCdvcmdhbml6YXRpb24nKSArICcpJztcbiAgICAgICAgVHdvRmFjdG9yUHJvdmlkZXJzW1R3b0ZhY3RvclByb3ZpZGVyVHlwZS5Pcmdhbml6YXRpb25EdW9dLmRlc2NyaXB0aW9uID1cbiAgICAgICAgICAgIHRoaXMuaTE4blNlcnZpY2UudCgnZHVvT3JnYW5pemF0aW9uRGVzYycpO1xuXG4gICAgICAgIFR3b0ZhY3RvclByb3ZpZGVyc1tUd29GYWN0b3JQcm92aWRlclR5cGUuV2ViQXV0aG5dLm5hbWUgPSB0aGlzLmkxOG5TZXJ2aWNlLnQoJ3dlYkF1dGhuVGl0bGUnKTtcbiAgICAgICAgVHdvRmFjdG9yUHJvdmlkZXJzW1R3b0ZhY3RvclByb3ZpZGVyVHlwZS5XZWJBdXRobl0uZGVzY3JpcHRpb24gPSB0aGlzLmkxOG5TZXJ2aWNlLnQoJ3dlYkF1dGhuRGVzYycpO1xuXG4gICAgICAgIFR3b0ZhY3RvclByb3ZpZGVyc1tUd29GYWN0b3JQcm92aWRlclR5cGUuWXViaWtleV0ubmFtZSA9IHRoaXMuaTE4blNlcnZpY2UudCgneXViaUtleVRpdGxlJyk7XG4gICAgICAgIFR3b0ZhY3RvclByb3ZpZGVyc1tUd29GYWN0b3JQcm92aWRlclR5cGUuWXViaWtleV0uZGVzY3JpcHRpb24gPSB0aGlzLmkxOG5TZXJ2aWNlLnQoJ3l1YmlLZXlEZXNjJyk7XG4gICAgfVxuXG4gICAgYXN5bmMgbG9nSW4oZW1haWw6IHN0cmluZywgbWFzdGVyUGFzc3dvcmQ6IHN0cmluZywgY2FwdGNoYVRva2VuPzogc3RyaW5nKTogUHJvbWlzZTxBdXRoUmVzdWx0PiB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRUd29GYWN0b3JQcm92aWRlclR5cGUgPSBudWxsO1xuICAgICAgICBjb25zdCBrZXkgPSBhd2FpdCB0aGlzLm1ha2VQcmVsb2dpbktleShtYXN0ZXJQYXNzd29yZCwgZW1haWwpO1xuICAgICAgICBjb25zdCBoYXNoZWRQYXNzd29yZCA9IGF3YWl0IHRoaXMuY3J5cHRvU2VydmljZS5oYXNoUGFzc3dvcmQobWFzdGVyUGFzc3dvcmQsIGtleSk7XG4gICAgICAgIGNvbnN0IGxvY2FsSGFzaGVkUGFzc3dvcmQgPSBhd2FpdCB0aGlzLmNyeXB0b1NlcnZpY2UuaGFzaFBhc3N3b3JkKG1hc3RlclBhc3N3b3JkLCBrZXksXG4gICAgICAgICAgICBIYXNoUHVycG9zZS5Mb2NhbEF1dGhvcml6YXRpb24pO1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5sb2dJbkhlbHBlcihlbWFpbCwgaGFzaGVkUGFzc3dvcmQsIGxvY2FsSGFzaGVkUGFzc3dvcmQsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsXG4gICAgICAgICAgICBrZXksIG51bGwsIG51bGwsIG51bGwsIGNhcHRjaGFUb2tlbiwgbnVsbCk7XG4gICAgfVxuXG4gICAgYXN5bmMgbG9nSW5Tc28oY29kZTogc3RyaW5nLCBjb2RlVmVyaWZpZXI6IHN0cmluZywgcmVkaXJlY3RVcmw6IHN0cmluZywgb3JnSWQ6IHN0cmluZyk6IFByb21pc2U8QXV0aFJlc3VsdD4ge1xuICAgICAgICB0aGlzLnNlbGVjdGVkVHdvRmFjdG9yUHJvdmlkZXJUeXBlID0gbnVsbDtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMubG9nSW5IZWxwZXIobnVsbCwgbnVsbCwgbnVsbCwgY29kZSwgY29kZVZlcmlmaWVyLCByZWRpcmVjdFVybCwgbnVsbCwgbnVsbCxcbiAgICAgICAgICAgIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG9yZ0lkKTtcbiAgICB9XG5cbiAgICBhc3luYyBsb2dJbkFwaUtleShjbGllbnRJZDogc3RyaW5nLCBjbGllbnRTZWNyZXQ6IHN0cmluZyk6IFByb21pc2U8QXV0aFJlc3VsdD4ge1xuICAgICAgICB0aGlzLnNlbGVjdGVkVHdvRmFjdG9yUHJvdmlkZXJUeXBlID0gbnVsbDtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMubG9nSW5IZWxwZXIobnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgY2xpZW50SWQsIGNsaWVudFNlY3JldCxcbiAgICAgICAgICAgIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwpO1xuICAgIH1cblxuICAgIGFzeW5jIGxvZ0luVHdvRmFjdG9yKHR3b0ZhY3RvclByb3ZpZGVyOiBUd29GYWN0b3JQcm92aWRlclR5cGUsIHR3b0ZhY3RvclRva2VuOiBzdHJpbmcsXG4gICAgICAgIHJlbWVtYmVyPzogYm9vbGVhbik6IFByb21pc2U8QXV0aFJlc3VsdD4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5sb2dJbkhlbHBlcih0aGlzLmVtYWlsLCB0aGlzLm1hc3RlclBhc3N3b3JkSGFzaCwgdGhpcy5sb2NhbE1hc3RlclBhc3N3b3JkSGFzaCwgdGhpcy5jb2RlLFxuICAgICAgICAgICAgdGhpcy5jb2RlVmVyaWZpZXIsIHRoaXMuc3NvUmVkaXJlY3RVcmwsIHRoaXMuY2xpZW50SWQsIHRoaXMuY2xpZW50U2VjcmV0LCB0aGlzLmtleSwgdHdvRmFjdG9yUHJvdmlkZXIsXG4gICAgICAgICAgICB0d29GYWN0b3JUb2tlbiwgcmVtZW1iZXIsIHRoaXMuY2FwdGNoYVRva2VuLCBudWxsKTtcbiAgICB9XG5cbiAgICBhc3luYyBsb2dJbkNvbXBsZXRlKGVtYWlsOiBzdHJpbmcsIG1hc3RlclBhc3N3b3JkOiBzdHJpbmcsIHR3b0ZhY3RvclByb3ZpZGVyOiBUd29GYWN0b3JQcm92aWRlclR5cGUsXG4gICAgICAgIHR3b0ZhY3RvclRva2VuOiBzdHJpbmcsIHJlbWVtYmVyPzogYm9vbGVhbiwgY2FwdGNoYVRva2VuPzogc3RyaW5nKTogUHJvbWlzZTxBdXRoUmVzdWx0PiB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRUd29GYWN0b3JQcm92aWRlclR5cGUgPSBudWxsO1xuICAgICAgICBjb25zdCBrZXkgPSBhd2FpdCB0aGlzLm1ha2VQcmVsb2dpbktleShtYXN0ZXJQYXNzd29yZCwgZW1haWwpO1xuICAgICAgICBjb25zdCBoYXNoZWRQYXNzd29yZCA9IGF3YWl0IHRoaXMuY3J5cHRvU2VydmljZS5oYXNoUGFzc3dvcmQobWFzdGVyUGFzc3dvcmQsIGtleSk7XG4gICAgICAgIGNvbnN0IGxvY2FsSGFzaGVkUGFzc3dvcmQgPSBhd2FpdCB0aGlzLmNyeXB0b1NlcnZpY2UuaGFzaFBhc3N3b3JkKG1hc3RlclBhc3N3b3JkLCBrZXksXG4gICAgICAgICAgICBIYXNoUHVycG9zZS5Mb2NhbEF1dGhvcml6YXRpb24pO1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5sb2dJbkhlbHBlcihlbWFpbCwgaGFzaGVkUGFzc3dvcmQsIGxvY2FsSGFzaGVkUGFzc3dvcmQsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIGtleSxcbiAgICAgICAgICAgIHR3b0ZhY3RvclByb3ZpZGVyLCB0d29GYWN0b3JUb2tlbiwgcmVtZW1iZXIsIGNhcHRjaGFUb2tlbiwgbnVsbCk7XG4gICAgfVxuXG4gICAgYXN5bmMgbG9nSW5Tc29Db21wbGV0ZShjb2RlOiBzdHJpbmcsIGNvZGVWZXJpZmllcjogc3RyaW5nLCByZWRpcmVjdFVybDogc3RyaW5nLFxuICAgICAgICB0d29GYWN0b3JQcm92aWRlcjogVHdvRmFjdG9yUHJvdmlkZXJUeXBlLCB0d29GYWN0b3JUb2tlbjogc3RyaW5nLCByZW1lbWJlcj86IGJvb2xlYW4pOiBQcm9taXNlPEF1dGhSZXN1bHQ+IHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFR3b0ZhY3RvclByb3ZpZGVyVHlwZSA9IG51bGw7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmxvZ0luSGVscGVyKG51bGwsIG51bGwsIG51bGwsIGNvZGUsIGNvZGVWZXJpZmllciwgcmVkaXJlY3RVcmwsIG51bGwsXG4gICAgICAgICAgICBudWxsLCBudWxsLCB0d29GYWN0b3JQcm92aWRlciwgdHdvRmFjdG9yVG9rZW4sIHJlbWVtYmVyLCBudWxsLCBudWxsKTtcbiAgICB9XG5cbiAgICBhc3luYyBsb2dJbkFwaUtleUNvbXBsZXRlKGNsaWVudElkOiBzdHJpbmcsIGNsaWVudFNlY3JldDogc3RyaW5nLCB0d29GYWN0b3JQcm92aWRlcjogVHdvRmFjdG9yUHJvdmlkZXJUeXBlLFxuICAgICAgICB0d29GYWN0b3JUb2tlbjogc3RyaW5nLCByZW1lbWJlcj86IGJvb2xlYW4pOiBQcm9taXNlPEF1dGhSZXN1bHQ+IHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFR3b0ZhY3RvclByb3ZpZGVyVHlwZSA9IG51bGw7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmxvZ0luSGVscGVyKG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIGNsaWVudElkLCBjbGllbnRTZWNyZXQsIG51bGwsXG4gICAgICAgICAgICB0d29GYWN0b3JQcm92aWRlciwgdHdvRmFjdG9yVG9rZW4sIHJlbWVtYmVyLCBudWxsLCBudWxsKTtcbiAgICB9XG5cbiAgICBsb2dPdXQoY2FsbGJhY2s6IEZ1bmN0aW9uKSB7XG4gICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgIHRoaXMubWVzc2FnaW5nU2VydmljZS5zZW5kKCdsb2dnZWRPdXQnKTtcbiAgICB9XG5cbiAgICBnZXRTdXBwb3J0ZWRUd29GYWN0b3JQcm92aWRlcnMod2luOiBXaW5kb3cpOiBhbnlbXSB7XG4gICAgICAgIGNvbnN0IHByb3ZpZGVyczogYW55W10gPSBbXTtcbiAgICAgICAgaWYgKHRoaXMudHdvRmFjdG9yUHJvdmlkZXJzRGF0YSA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvdmlkZXJzO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMudHdvRmFjdG9yUHJvdmlkZXJzRGF0YS5oYXMoVHdvRmFjdG9yUHJvdmlkZXJUeXBlLk9yZ2FuaXphdGlvbkR1bykgJiZcbiAgICAgICAgICAgIHRoaXMucGxhdGZvcm1VdGlsc1NlcnZpY2Uuc3VwcG9ydHNEdW8oKSkge1xuICAgICAgICAgICAgcHJvdmlkZXJzLnB1c2goVHdvRmFjdG9yUHJvdmlkZXJzW1R3b0ZhY3RvclByb3ZpZGVyVHlwZS5Pcmdhbml6YXRpb25EdW9dKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnR3b0ZhY3RvclByb3ZpZGVyc0RhdGEuaGFzKFR3b0ZhY3RvclByb3ZpZGVyVHlwZS5BdXRoZW50aWNhdG9yKSkge1xuICAgICAgICAgICAgcHJvdmlkZXJzLnB1c2goVHdvRmFjdG9yUHJvdmlkZXJzW1R3b0ZhY3RvclByb3ZpZGVyVHlwZS5BdXRoZW50aWNhdG9yXSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy50d29GYWN0b3JQcm92aWRlcnNEYXRhLmhhcyhUd29GYWN0b3JQcm92aWRlclR5cGUuWXViaWtleSkpIHtcbiAgICAgICAgICAgIHByb3ZpZGVycy5wdXNoKFR3b0ZhY3RvclByb3ZpZGVyc1tUd29GYWN0b3JQcm92aWRlclR5cGUuWXViaWtleV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMudHdvRmFjdG9yUHJvdmlkZXJzRGF0YS5oYXMoVHdvRmFjdG9yUHJvdmlkZXJUeXBlLkR1bykgJiYgdGhpcy5wbGF0Zm9ybVV0aWxzU2VydmljZS5zdXBwb3J0c0R1bygpKSB7XG4gICAgICAgICAgICBwcm92aWRlcnMucHVzaChUd29GYWN0b3JQcm92aWRlcnNbVHdvRmFjdG9yUHJvdmlkZXJUeXBlLkR1b10pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMudHdvRmFjdG9yUHJvdmlkZXJzRGF0YS5oYXMoVHdvRmFjdG9yUHJvdmlkZXJUeXBlLldlYkF1dGhuKSAmJiB0aGlzLnBsYXRmb3JtVXRpbHNTZXJ2aWNlLnN1cHBvcnRzV2ViQXV0aG4od2luKSkge1xuICAgICAgICAgICAgcHJvdmlkZXJzLnB1c2goVHdvRmFjdG9yUHJvdmlkZXJzW1R3b0ZhY3RvclByb3ZpZGVyVHlwZS5XZWJBdXRobl0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMudHdvRmFjdG9yUHJvdmlkZXJzRGF0YS5oYXMoVHdvRmFjdG9yUHJvdmlkZXJUeXBlLkVtYWlsKSkge1xuICAgICAgICAgICAgcHJvdmlkZXJzLnB1c2goVHdvRmFjdG9yUHJvdmlkZXJzW1R3b0ZhY3RvclByb3ZpZGVyVHlwZS5FbWFpbF0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHByb3ZpZGVycztcbiAgICB9XG5cbiAgICBnZXREZWZhdWx0VHdvRmFjdG9yUHJvdmlkZXIod2ViQXV0aG5TdXBwb3J0ZWQ6IGJvb2xlYW4pOiBUd29GYWN0b3JQcm92aWRlclR5cGUge1xuICAgICAgICBpZiAodGhpcy50d29GYWN0b3JQcm92aWRlcnNEYXRhID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRUd29GYWN0b3JQcm92aWRlclR5cGUgIT0gbnVsbCAmJlxuICAgICAgICAgICAgdGhpcy50d29GYWN0b3JQcm92aWRlcnNEYXRhLmhhcyh0aGlzLnNlbGVjdGVkVHdvRmFjdG9yUHJvdmlkZXJUeXBlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRUd29GYWN0b3JQcm92aWRlclR5cGU7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcHJvdmlkZXJUeXBlOiBUd29GYWN0b3JQcm92aWRlclR5cGUgPSBudWxsO1xuICAgICAgICBsZXQgcHJvdmlkZXJQcmlvcml0eSA9IC0xO1xuICAgICAgICB0aGlzLnR3b0ZhY3RvclByb3ZpZGVyc0RhdGEuZm9yRWFjaCgodmFsdWUsIHR5cGUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHByb3ZpZGVyID0gKFR3b0ZhY3RvclByb3ZpZGVycyBhcyBhbnkpW3R5cGVdO1xuICAgICAgICAgICAgaWYgKHByb3ZpZGVyICE9IG51bGwgJiYgcHJvdmlkZXIucHJpb3JpdHkgPiBwcm92aWRlclByaW9yaXR5KSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGUgPT09IFR3b0ZhY3RvclByb3ZpZGVyVHlwZS5XZWJBdXRobiAmJiAhd2ViQXV0aG5TdXBwb3J0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHByb3ZpZGVyVHlwZSA9IHR5cGU7XG4gICAgICAgICAgICAgICAgcHJvdmlkZXJQcmlvcml0eSA9IHByb3ZpZGVyLnByaW9yaXR5O1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gcHJvdmlkZXJUeXBlO1xuICAgIH1cblxuICAgIGFzeW5jIG1ha2VQcmVsb2dpbktleShtYXN0ZXJQYXNzd29yZDogc3RyaW5nLCBlbWFpbDogc3RyaW5nKTogUHJvbWlzZTxTeW1tZXRyaWNDcnlwdG9LZXk+IHtcbiAgICAgICAgZW1haWwgPSBlbWFpbC50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgbGV0IGtkZjogS2RmVHlwZSA9IG51bGw7XG4gICAgICAgIGxldCBrZGZJdGVyYXRpb25zOiBudW1iZXIgPSBudWxsO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcHJlbG9naW5SZXNwb25zZSA9IGF3YWl0IHRoaXMuYXBpU2VydmljZS5wb3N0UHJlbG9naW4obmV3IFByZWxvZ2luUmVxdWVzdChlbWFpbCkpO1xuICAgICAgICAgICAgaWYgKHByZWxvZ2luUmVzcG9uc2UgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGtkZiA9IHByZWxvZ2luUmVzcG9uc2Uua2RmO1xuICAgICAgICAgICAgICAgIGtkZkl0ZXJhdGlvbnMgPSBwcmVsb2dpblJlc3BvbnNlLmtkZkl0ZXJhdGlvbnM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGlmIChlID09IG51bGwgfHwgZS5zdGF0dXNDb2RlICE9PSA0MDQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmNyeXB0b1NlcnZpY2UubWFrZUtleShtYXN0ZXJQYXNzd29yZCwgZW1haWwsIGtkZiwga2RmSXRlcmF0aW9ucyk7XG4gICAgfVxuXG4gICAgYXV0aGluZ1dpdGhBcGlLZXkoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudElkICE9IG51bGwgJiYgdGhpcy5jbGllbnRTZWNyZXQgIT0gbnVsbDtcbiAgICB9XG5cbiAgICBhdXRoaW5nV2l0aFNzbygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29kZSAhPSBudWxsICYmIHRoaXMuY29kZVZlcmlmaWVyICE9IG51bGwgJiYgdGhpcy5zc29SZWRpcmVjdFVybCAhPSBudWxsO1xuICAgIH1cblxuICAgIGF1dGhpbmdXaXRoUGFzc3dvcmQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmVtYWlsICE9IG51bGwgJiYgdGhpcy5tYXN0ZXJQYXNzd29yZEhhc2ggIT0gbnVsbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGxvZ0luSGVscGVyKGVtYWlsOiBzdHJpbmcsIGhhc2hlZFBhc3N3b3JkOiBzdHJpbmcsIGxvY2FsSGFzaGVkUGFzc3dvcmQ6IHN0cmluZywgY29kZTogc3RyaW5nLFxuICAgICAgICBjb2RlVmVyaWZpZXI6IHN0cmluZywgcmVkaXJlY3RVcmw6IHN0cmluZywgY2xpZW50SWQ6IHN0cmluZywgY2xpZW50U2VjcmV0OiBzdHJpbmcsIGtleTogU3ltbWV0cmljQ3J5cHRvS2V5LFxuICAgICAgICB0d29GYWN0b3JQcm92aWRlcj86IFR3b0ZhY3RvclByb3ZpZGVyVHlwZSwgdHdvRmFjdG9yVG9rZW4/OiBzdHJpbmcsIHJlbWVtYmVyPzogYm9vbGVhbiwgY2FwdGNoYVRva2VuPzogc3RyaW5nLFxuICAgICAgICBvcmdJZD86IHN0cmluZyk6IFByb21pc2U8QXV0aFJlc3VsdD4ge1xuICAgICAgICBjb25zdCBzdG9yZWRUd29GYWN0b3JUb2tlbiA9IGF3YWl0IHRoaXMudG9rZW5TZXJ2aWNlLmdldFR3b0ZhY3RvclRva2VuKGVtYWlsKTtcbiAgICAgICAgY29uc3QgYXBwSWQgPSBhd2FpdCB0aGlzLmFwcElkU2VydmljZS5nZXRBcHBJZCgpO1xuICAgICAgICBjb25zdCBkZXZpY2VSZXF1ZXN0ID0gbmV3IERldmljZVJlcXVlc3QoYXBwSWQsIHRoaXMucGxhdGZvcm1VdGlsc1NlcnZpY2UpO1xuXG4gICAgICAgIGxldCBlbWFpbFBhc3N3b3JkOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBsZXQgY29kZUNvZGVWZXJpZmllcjogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgbGV0IGNsaWVudElkQ2xpZW50U2VjcmV0OiBbc3RyaW5nLCBzdHJpbmddID0gW251bGwsIG51bGxdO1xuXG4gICAgICAgIGlmIChlbWFpbCAhPSBudWxsICYmIGhhc2hlZFBhc3N3b3JkICE9IG51bGwpIHtcbiAgICAgICAgICAgIGVtYWlsUGFzc3dvcmQgPSBbZW1haWwsIGhhc2hlZFBhc3N3b3JkXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGVtYWlsUGFzc3dvcmQgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb2RlICE9IG51bGwgJiYgY29kZVZlcmlmaWVyICE9IG51bGwgJiYgcmVkaXJlY3RVcmwgIT0gbnVsbCkge1xuICAgICAgICAgICAgY29kZUNvZGVWZXJpZmllciA9IFtjb2RlLCBjb2RlVmVyaWZpZXIsIHJlZGlyZWN0VXJsXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvZGVDb2RlVmVyaWZpZXIgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjbGllbnRJZCAhPSBudWxsICYmIGNsaWVudFNlY3JldCAhPSBudWxsKSB7XG4gICAgICAgICAgICBjbGllbnRJZENsaWVudFNlY3JldCA9IFtjbGllbnRJZCwgY2xpZW50U2VjcmV0XTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNsaWVudElkQ2xpZW50U2VjcmV0ID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXF1ZXN0OiBUb2tlblJlcXVlc3Q7XG4gICAgICAgIGlmICh0d29GYWN0b3JUb2tlbiAhPSBudWxsICYmIHR3b0ZhY3RvclByb3ZpZGVyICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJlcXVlc3QgPSBuZXcgVG9rZW5SZXF1ZXN0KGVtYWlsUGFzc3dvcmQsIGNvZGVDb2RlVmVyaWZpZXIsIGNsaWVudElkQ2xpZW50U2VjcmV0LCB0d29GYWN0b3JQcm92aWRlcixcbiAgICAgICAgICAgICAgICB0d29GYWN0b3JUb2tlbiwgcmVtZW1iZXIsIGNhcHRjaGFUb2tlbiwgZGV2aWNlUmVxdWVzdCk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RvcmVkVHdvRmFjdG9yVG9rZW4gIT0gbnVsbCkge1xuICAgICAgICAgICAgcmVxdWVzdCA9IG5ldyBUb2tlblJlcXVlc3QoZW1haWxQYXNzd29yZCwgY29kZUNvZGVWZXJpZmllciwgY2xpZW50SWRDbGllbnRTZWNyZXQsXG4gICAgICAgICAgICAgICAgVHdvRmFjdG9yUHJvdmlkZXJUeXBlLlJlbWVtYmVyLCBzdG9yZWRUd29GYWN0b3JUb2tlbiwgZmFsc2UsIGNhcHRjaGFUb2tlbiwgZGV2aWNlUmVxdWVzdCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXF1ZXN0ID0gbmV3IFRva2VuUmVxdWVzdChlbWFpbFBhc3N3b3JkLCBjb2RlQ29kZVZlcmlmaWVyLCBjbGllbnRJZENsaWVudFNlY3JldCwgbnVsbCxcbiAgICAgICAgICAgICAgICBudWxsLCBmYWxzZSwgY2FwdGNoYVRva2VuLCBkZXZpY2VSZXF1ZXN0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5hcGlTZXJ2aWNlLnBvc3RJZGVudGl0eVRva2VuKHJlcXVlc3QpO1xuXG4gICAgICAgIHRoaXMuY2xlYXJTdGF0ZSgpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgQXV0aFJlc3VsdCgpO1xuICAgICAgICByZXN1bHQuY2FwdGNoYVNpdGVLZXkgPSAocmVzcG9uc2UgYXMgYW55KS5zaXRlS2V5O1xuICAgICAgICBpZiAoISFyZXN1bHQuY2FwdGNoYVNpdGVLZXkpIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0LnR3b0ZhY3RvciA9ICEhKHJlc3BvbnNlIGFzIGFueSkudHdvRmFjdG9yUHJvdmlkZXJzMjtcblxuICAgICAgICBpZiAocmVzdWx0LnR3b0ZhY3Rvcikge1xuICAgICAgICAgICAgLy8gdHdvIGZhY3RvciByZXF1aXJlZFxuICAgICAgICAgICAgdGhpcy5lbWFpbCA9IGVtYWlsO1xuICAgICAgICAgICAgdGhpcy5tYXN0ZXJQYXNzd29yZEhhc2ggPSBoYXNoZWRQYXNzd29yZDtcbiAgICAgICAgICAgIHRoaXMubG9jYWxNYXN0ZXJQYXNzd29yZEhhc2ggPSBsb2NhbEhhc2hlZFBhc3N3b3JkO1xuICAgICAgICAgICAgdGhpcy5jb2RlID0gY29kZTtcbiAgICAgICAgICAgIHRoaXMuY29kZVZlcmlmaWVyID0gY29kZVZlcmlmaWVyO1xuICAgICAgICAgICAgdGhpcy5zc29SZWRpcmVjdFVybCA9IHJlZGlyZWN0VXJsO1xuICAgICAgICAgICAgdGhpcy5jbGllbnRJZCA9IGNsaWVudElkO1xuICAgICAgICAgICAgdGhpcy5jbGllbnRTZWNyZXQgPSBjbGllbnRTZWNyZXQ7XG4gICAgICAgICAgICB0aGlzLmtleSA9IHRoaXMuc2V0Q3J5cHRvS2V5cyA/IGtleSA6IG51bGw7XG4gICAgICAgICAgICBjb25zdCB0d29GYWN0b3JSZXNwb25zZSA9IHJlc3BvbnNlIGFzIElkZW50aXR5VHdvRmFjdG9yUmVzcG9uc2U7XG4gICAgICAgICAgICB0aGlzLnR3b0ZhY3RvclByb3ZpZGVyc0RhdGEgPSB0d29GYWN0b3JSZXNwb25zZS50d29GYWN0b3JQcm92aWRlcnMyO1xuICAgICAgICAgICAgcmVzdWx0LnR3b0ZhY3RvclByb3ZpZGVycyA9IHR3b0ZhY3RvclJlc3BvbnNlLnR3b0ZhY3RvclByb3ZpZGVyczI7XG4gICAgICAgICAgICB0aGlzLmNhcHRjaGFUb2tlbiA9IHR3b0ZhY3RvclJlc3BvbnNlLmNhcHRjaGFUb2tlbjtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0b2tlblJlc3BvbnNlID0gcmVzcG9uc2UgYXMgSWRlbnRpdHlUb2tlblJlc3BvbnNlO1xuICAgICAgICByZXN1bHQucmVzZXRNYXN0ZXJQYXNzd29yZCA9IHRva2VuUmVzcG9uc2UucmVzZXRNYXN0ZXJQYXNzd29yZDtcbiAgICAgICAgcmVzdWx0LmZvcmNlUGFzc3dvcmRSZXNldCA9IHRva2VuUmVzcG9uc2UuZm9yY2VQYXNzd29yZFJlc2V0O1xuICAgICAgICBpZiAodG9rZW5SZXNwb25zZS50d29GYWN0b3JUb2tlbiAhPSBudWxsKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnRva2VuU2VydmljZS5zZXRUd29GYWN0b3JUb2tlbih0b2tlblJlc3BvbnNlLnR3b0ZhY3RvclRva2VuLCBlbWFpbCk7XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCB0aGlzLnRva2VuU2VydmljZS5zZXRUb2tlbnModG9rZW5SZXNwb25zZS5hY2Nlc3NUb2tlbiwgdG9rZW5SZXNwb25zZS5yZWZyZXNoVG9rZW4sIGNsaWVudElkQ2xpZW50U2VjcmV0KTtcbiAgICAgICAgYXdhaXQgdGhpcy51c2VyU2VydmljZS5zZXRJbmZvcm1hdGlvbih0aGlzLnRva2VuU2VydmljZS5nZXRVc2VySWQoKSwgdGhpcy50b2tlblNlcnZpY2UuZ2V0RW1haWwoKSxcbiAgICAgICAgICAgIHRva2VuUmVzcG9uc2Uua2RmLCB0b2tlblJlc3BvbnNlLmtkZkl0ZXJhdGlvbnMpO1xuICAgICAgICBpZiAodGhpcy5zZXRDcnlwdG9LZXlzKSB7XG4gICAgICAgICAgICBpZiAoa2V5ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNyeXB0b1NlcnZpY2Uuc2V0S2V5KGtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobG9jYWxIYXNoZWRQYXNzd29yZCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jcnlwdG9TZXJ2aWNlLnNldEtleUhhc2gobG9jYWxIYXNoZWRQYXNzd29yZCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFNraXAgdGhpcyBzdGVwIGR1cmluZyBTU08gbmV3IHVzZXIgZmxvdy4gTm8ga2V5IGlzIHJldHVybmVkIGZyb20gc2VydmVyLlxuICAgICAgICAgICAgaWYgKGNvZGUgPT0gbnVsbCB8fCB0b2tlblJlc3BvbnNlLmtleSAhPSBudWxsKSB7XG5cbiAgICAgICAgICAgICAgICBpZiAodG9rZW5SZXNwb25zZS5jcnlwdG9BZ2VudFVybCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1c2VyS2V5UmVzcG9uc2UgPSBhd2FpdCB0aGlzLmFwaVNlcnZpY2UuZ2V0VXNlcktleUZyb21DcnlwdG9BZ2VudCh0b2tlblJlc3BvbnNlLmNyeXB0b0FnZW50VXJsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleUFyciA9IFV0aWxzLmZyb21CNjRUb0FycmF5KHVzZXJLZXlSZXNwb25zZS5rZXkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgayA9IG5ldyBTeW1tZXRyaWNDcnlwdG9LZXkoa2V5QXJyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuY3J5cHRvU2VydmljZS5zZXRLZXkoayk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nU2VydmljZS5lcnJvcihlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIHJlYWNoIGNyeXB0byBhZ2VudCcpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jcnlwdG9TZXJ2aWNlLnNldEVuY0tleSh0b2tlblJlc3BvbnNlLmtleSk7XG5cbiAgICAgICAgICAgICAgICAvLyBVc2VyIGRvZXNuJ3QgaGF2ZSBhIGtleSBwYWlyIHlldCAob2xkIGFjY291bnQpLCBsZXQncyBnZW5lcmF0ZSBvbmUgZm9yIHRoZW1cbiAgICAgICAgICAgICAgICBpZiAodG9rZW5SZXNwb25zZS5wcml2YXRlS2V5ID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleVBhaXIgPSBhd2FpdCB0aGlzLmNyeXB0b1NlcnZpY2UubWFrZUtleVBhaXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuYXBpU2VydmljZS5wb3N0QWNjb3VudEtleXMobmV3IEtleXNSZXF1ZXN0KGtleVBhaXJbMF0sIGtleVBhaXJbMV0uZW5jcnlwdGVkU3RyaW5nKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0b2tlblJlc3BvbnNlLnByaXZhdGVLZXkgPSBrZXlQYWlyWzFdLmVuY3J5cHRlZFN0cmluZztcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dTZXJ2aWNlLmVycm9yKGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jcnlwdG9TZXJ2aWNlLnNldEVuY1ByaXZhdGVLZXkodG9rZW5SZXNwb25zZS5wcml2YXRlS2V5KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW5SZXNwb25zZS5jcnlwdG9BZ2VudFVybCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFzc3dvcmQgPSBhd2FpdCB0aGlzLmNyeXB0b0Z1bmN0aW9uU2VydmljZS5yYW5kb21CeXRlcyg2NCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBrID0gYXdhaXQgdGhpcy5jcnlwdG9TZXJ2aWNlLm1ha2VLZXkoVXRpbHMuZnJvbUJ1ZmZlclRvQjY0KHBhc3N3b3JkKSwgdGhpcy50b2tlblNlcnZpY2UuZ2V0RW1haWwoKSwgdG9rZW5SZXNwb25zZS5rZGYsIHRva2VuUmVzcG9uc2Uua2RmSXRlcmF0aW9ucyk7XG4gICAgICAgICAgICAgICAgY29uc3QgY3J5cHRvQWdlbnRSZXF1ZXN0ID0gbmV3IENyeXB0b0FnZW50VXNlcktleVJlcXVlc3Qoay5lbmNLZXlCNjQpO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuY3J5cHRvU2VydmljZS5zZXRLZXkoayk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBlbmNLZXkgPSBhd2FpdCB0aGlzLmNyeXB0b1NlcnZpY2UubWFrZUVuY0tleShrKTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNyeXB0b1NlcnZpY2Uuc2V0RW5jS2V5KGVuY0tleVsxXS5lbmNyeXB0ZWRTdHJpbmcpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgW3B1YktleSwgcHJpdktleV0gPSBhd2FpdCB0aGlzLmNyeXB0b1NlcnZpY2UubWFrZUtleVBhaXIoKTtcblxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuYXBpU2VydmljZS5wb3N0VXNlcktleVRvQ3J5cHRvQWdlbnQodG9rZW5SZXNwb25zZS5jcnlwdG9BZ2VudFVybCwgY3J5cHRvQWdlbnRSZXF1ZXN0KTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIHJlYWNoIGNyeXB0byBhZ2VudCcpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGtleXMgPSBuZXcgS2V5c1JlcXVlc3QocHViS2V5LCBwcml2S2V5LmVuY3J5cHRlZFN0cmluZyk7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2V0UGFzc3dvcmRSZXF1ZXN0ID0gbmV3IFNldENyeXB0b0FnZW50S2V5UmVxdWVzdChcbiAgICAgICAgICAgICAgICAgICAgZW5jS2V5WzFdLmVuY3J5cHRlZFN0cmluZywgdG9rZW5SZXNwb25zZS5rZGYsIHRva2VuUmVzcG9uc2Uua2RmSXRlcmF0aW9ucywgb3JnSWQsIGtleXNcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuYXBpU2VydmljZS5wb3N0U2V0Q3J5cHRvQWdlbnRLZXkoc2V0UGFzc3dvcmRSZXF1ZXN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnZhdWx0VGltZW91dFNlcnZpY2UgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy52YXVsdFRpbWVvdXRTZXJ2aWNlLmJpb21ldHJpY0xvY2tlZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubWVzc2FnaW5nU2VydmljZS5zZW5kKCdsb2dnZWRJbicpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHByaXZhdGUgY2xlYXJTdGF0ZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5rZXkgPSBudWxsO1xuICAgICAgICB0aGlzLmVtYWlsID0gbnVsbDtcbiAgICAgICAgdGhpcy5tYXN0ZXJQYXNzd29yZEhhc2ggPSBudWxsO1xuICAgICAgICB0aGlzLmxvY2FsTWFzdGVyUGFzc3dvcmRIYXNoID0gbnVsbDtcbiAgICAgICAgdGhpcy5jb2RlID0gbnVsbDtcbiAgICAgICAgdGhpcy5jb2RlVmVyaWZpZXIgPSBudWxsO1xuICAgICAgICB0aGlzLnNzb1JlZGlyZWN0VXJsID0gbnVsbDtcbiAgICAgICAgdGhpcy5jbGllbnRJZCA9IG51bGw7XG4gICAgICAgIHRoaXMuY2xpZW50U2VjcmV0ID0gbnVsbDtcbiAgICAgICAgdGhpcy50d29GYWN0b3JQcm92aWRlcnNEYXRhID0gbnVsbDtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFR3b0ZhY3RvclByb3ZpZGVyVHlwZSA9IG51bGw7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgQnJvYWRjYXN0ZXJTZXJ2aWNlIGFzIEJyb2FkY2FzdGVyU2VydmljZUFic3RyYWN0aW9uIH0gZnJvbSAnLi4vYWJzdHJhY3Rpb25zL2Jyb2FkY2FzdGVyLnNlcnZpY2UnO1xuXG5leHBvcnQgY2xhc3MgQnJvYWRjYXN0ZXJTZXJ2aWNlIGltcGxlbWVudHMgQnJvYWRjYXN0ZXJTZXJ2aWNlQWJzdHJhY3Rpb24ge1xuICAgIHN1YnNjcmliZXJzOiBNYXA8c3RyaW5nLCAobWVzc2FnZTogYW55KSA9PiBhbnk+ID0gbmV3IE1hcDxzdHJpbmcsIChtZXNzYWdlOiBhbnkpID0+IGFueT4oKTtcblxuICAgIHNlbmQobWVzc2FnZTogYW55LCBpZD86IHN0cmluZykge1xuICAgICAgICBpZiAoaWQgIT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuc3Vic2NyaWJlcnMuaGFzKGlkKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc3Vic2NyaWJlcnMuZ2V0KGlkKShtZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc3Vic2NyaWJlcnMuZm9yRWFjaCh2YWx1ZSA9PiB7XG4gICAgICAgICAgICB2YWx1ZShtZXNzYWdlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc3Vic2NyaWJlKGlkOiBzdHJpbmcsIG1lc3NhZ2VDYWxsYmFjazogKG1lc3NhZ2U6IGFueSkgPT4gYW55KSB7XG4gICAgICAgIHRoaXMuc3Vic2NyaWJlcnMuc2V0KGlkLCBtZXNzYWdlQ2FsbGJhY2spO1xuICAgIH1cblxuICAgIHVuc3Vic2NyaWJlKGlkOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKHRoaXMuc3Vic2NyaWJlcnMuaGFzKGlkKSkge1xuICAgICAgICAgICAgdGhpcy5zdWJzY3JpYmVycy5kZWxldGUoaWQpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiZXhwb3J0IGNsYXNzIENvbnN0YW50c1NlcnZpY2Uge1xuICAgIHN0YXRpYyByZWFkb25seSBlbnZpcm9ubWVudFVybHNLZXk6IHN0cmluZyA9ICdlbnZpcm9ubWVudFVybHMnO1xuICAgIHN0YXRpYyByZWFkb25seSBkaXNhYmxlR2FLZXk6IHN0cmluZyA9ICdkaXNhYmxlR2EnO1xuICAgIHN0YXRpYyByZWFkb25seSBkaXNhYmxlQWRkTG9naW5Ob3RpZmljYXRpb25LZXk6IHN0cmluZyA9ICdkaXNhYmxlQWRkTG9naW5Ob3RpZmljYXRpb24nO1xuICAgIHN0YXRpYyByZWFkb25seSBkaXNhYmxlQ2hhbmdlZFBhc3N3b3JkTm90aWZpY2F0aW9uS2V5OiBzdHJpbmcgPSAnZGlzYWJsZUNoYW5nZWRQYXNzd29yZE5vdGlmaWNhdGlvbic7XG4gICAgc3RhdGljIHJlYWRvbmx5IGRpc2FibGVDb250ZXh0TWVudUl0ZW1LZXk6IHN0cmluZyA9ICdkaXNhYmxlQ29udGV4dE1lbnVJdGVtJztcbiAgICBzdGF0aWMgcmVhZG9ubHkgZGlzYWJsZUZhdmljb25LZXk6IHN0cmluZyA9ICdkaXNhYmxlRmF2aWNvbic7XG4gICAgc3RhdGljIHJlYWRvbmx5IGRpc2FibGVCYWRnZUNvdW50ZXJLZXk6IHN0cmluZyA9ICdkaXNhYmxlQmFkZ2VDb3VudGVyJztcbiAgICBzdGF0aWMgcmVhZG9ubHkgZGlzYWJsZUF1dG9Ub3RwQ29weUtleTogc3RyaW5nID0gJ2Rpc2FibGVBdXRvVG90cENvcHknO1xuICAgIHN0YXRpYyByZWFkb25seSBkaXNhYmxlQXV0b0Jpb21ldHJpY3NQcm9tcHRLZXk6IHN0cmluZyA9ICdub0F1dG9Qcm9tcHRCaW9tZXRyaWNzJztcbiAgICBzdGF0aWMgcmVhZG9ubHkgZW5hYmxlQXV0b0ZpbGxPblBhZ2VMb2FkS2V5OiBzdHJpbmcgPSAnZW5hYmxlQXV0b0ZpbGxPblBhZ2VMb2FkJztcbiAgICBzdGF0aWMgcmVhZG9ubHkgYXV0b0ZpbGxPblBhZ2VMb2FkRGVmYXVsdEtleTogc3RyaW5nID0gJ2F1dG9GaWxsT25QYWdlTG9hZERlZmF1bHQnO1xuICAgIHN0YXRpYyByZWFkb25seSB2YXVsdFRpbWVvdXRLZXk6IHN0cmluZyA9ICdsb2NrT3B0aW9uJztcbiAgICBzdGF0aWMgcmVhZG9ubHkgdmF1bHRUaW1lb3V0QWN0aW9uS2V5OiBzdHJpbmcgPSAndmF1bHRUaW1lb3V0QWN0aW9uJztcbiAgICBzdGF0aWMgcmVhZG9ubHkgbGFzdEFjdGl2ZUtleTogc3RyaW5nID0gJ2xhc3RBY3RpdmUnO1xuICAgIHN0YXRpYyByZWFkb25seSBuZXZlckRvbWFpbnNLZXk6IHN0cmluZyA9ICduZXZlckRvbWFpbnMnO1xuICAgIHN0YXRpYyByZWFkb25seSBpbnN0YWxsZWRWZXJzaW9uS2V5OiBzdHJpbmcgPSAnaW5zdGFsbGVkVmVyc2lvbic7XG4gICAgc3RhdGljIHJlYWRvbmx5IGxvY2FsZUtleTogc3RyaW5nID0gJ2xvY2FsZSc7XG4gICAgc3RhdGljIHJlYWRvbmx5IHRoZW1lS2V5OiBzdHJpbmcgPSAndGhlbWUnO1xuICAgIHN0YXRpYyByZWFkb25seSBjb2xsYXBzZWRHcm91cGluZ3NLZXk6IHN0cmluZyA9ICdjb2xsYXBzZWRHcm91cGluZ3MnO1xuICAgIHN0YXRpYyByZWFkb25seSBhdXRvQ29uZmlybUZpbmdlcnByaW50czogc3RyaW5nID0gJ2F1dG9Db25maXJtRmluZ2VycHJpbnRzJztcbiAgICBzdGF0aWMgcmVhZG9ubHkgZG9udFNob3dDYXJkc0N1cnJlbnRUYWI6IHN0cmluZyA9ICdkb250U2hvd0NhcmRzQ3VycmVudFRhYic7XG4gICAgc3RhdGljIHJlYWRvbmx5IGRvbnRTaG93SWRlbnRpdGllc0N1cnJlbnRUYWI6IHN0cmluZyA9ICdkb250U2hvd0lkZW50aXRpZXNDdXJyZW50VGFiJztcbiAgICBzdGF0aWMgcmVhZG9ubHkgZGVmYXVsdFVyaU1hdGNoOiBzdHJpbmcgPSAnZGVmYXVsdFVyaU1hdGNoJztcbiAgICBzdGF0aWMgcmVhZG9ubHkgcGluUHJvdGVjdGVkS2V5OiBzdHJpbmcgPSAncGluUHJvdGVjdGVkS2V5JztcbiAgICBzdGF0aWMgcmVhZG9ubHkgcHJvdGVjdGVkUGluOiBzdHJpbmcgPSAncHJvdGVjdGVkUGluJztcbiAgICBzdGF0aWMgcmVhZG9ubHkgY2xlYXJDbGlwYm9hcmRLZXk6IHN0cmluZyA9ICdjbGVhckNsaXBib2FyZEtleSc7XG4gICAgc3RhdGljIHJlYWRvbmx5IGV2ZW50Q29sbGVjdGlvbktleTogc3RyaW5nID0gJ2V2ZW50Q29sbGVjdGlvbic7XG4gICAgc3RhdGljIHJlYWRvbmx5IHNzb0NvZGVWZXJpZmllcktleTogc3RyaW5nID0gJ3Nzb0NvZGVWZXJpZmllcic7XG4gICAgc3RhdGljIHJlYWRvbmx5IHNzb1N0YXRlS2V5OiBzdHJpbmcgPSAnc3NvU3RhdGUnO1xuICAgIHN0YXRpYyByZWFkb25seSBiaW9tZXRyaWNVbmxvY2tLZXk6IHN0cmluZyA9ICdiaW9tZXRyaWMnO1xuICAgIHN0YXRpYyByZWFkb25seSBiaW9tZXRyaWNUZXh0OiBzdHJpbmcgPSAnYmlvbWV0cmljVGV4dCc7XG4gICAgc3RhdGljIHJlYWRvbmx5IGJpb21ldHJpY0F3YWl0aW5nQWNjZXB0YW5jZTogc3RyaW5nID0gJ2Jpb21ldHJpY0F3YWl0aW5nQWNjZXB0YW5jZSc7XG4gICAgc3RhdGljIHJlYWRvbmx5IGJpb21ldHJpY0ZpbmdlcnByaW50VmFsaWRhdGVkOiBzdHJpbmcgPSAnYmlvbWV0cmljRmluZ2VycHJpbnRWYWxpZGF0ZWQnO1xuXG4gICAgcmVhZG9ubHkgZW52aXJvbm1lbnRVcmxzS2V5OiBzdHJpbmcgPSBDb25zdGFudHNTZXJ2aWNlLmVudmlyb25tZW50VXJsc0tleTtcbiAgICByZWFkb25seSBkaXNhYmxlR2FLZXk6IHN0cmluZyA9IENvbnN0YW50c1NlcnZpY2UuZGlzYWJsZUdhS2V5O1xuICAgIHJlYWRvbmx5IGRpc2FibGVBZGRMb2dpbk5vdGlmaWNhdGlvbktleTogc3RyaW5nID0gQ29uc3RhbnRzU2VydmljZS5kaXNhYmxlQWRkTG9naW5Ob3RpZmljYXRpb25LZXk7XG4gICAgcmVhZG9ubHkgZGlzYWJsZUNvbnRleHRNZW51SXRlbUtleTogc3RyaW5nID0gQ29uc3RhbnRzU2VydmljZS5kaXNhYmxlQ29udGV4dE1lbnVJdGVtS2V5O1xuICAgIHJlYWRvbmx5IGRpc2FibGVGYXZpY29uS2V5OiBzdHJpbmcgPSBDb25zdGFudHNTZXJ2aWNlLmRpc2FibGVGYXZpY29uS2V5O1xuICAgIHJlYWRvbmx5IGRpc2FibGVCYWRnZUNvdW50ZXJLZXk6IHN0cmluZyA9IENvbnN0YW50c1NlcnZpY2UuZGlzYWJsZUJhZGdlQ291bnRlcktleTtcbiAgICByZWFkb25seSBkaXNhYmxlQXV0b1RvdHBDb3B5S2V5OiBzdHJpbmcgPSBDb25zdGFudHNTZXJ2aWNlLmRpc2FibGVBdXRvVG90cENvcHlLZXk7XG4gICAgcmVhZG9ubHkgZGlzYWJsZUF1dG9CaW9tZXRyaWNzUHJvbXB0S2V5OiBzdHJpbmcgPSBDb25zdGFudHNTZXJ2aWNlLmRpc2FibGVBdXRvQmlvbWV0cmljc1Byb21wdEtleTtcbiAgICByZWFkb25seSBlbmFibGVBdXRvRmlsbE9uUGFnZUxvYWRLZXk6IHN0cmluZyA9IENvbnN0YW50c1NlcnZpY2UuZW5hYmxlQXV0b0ZpbGxPblBhZ2VMb2FkS2V5O1xuICAgIHJlYWRvbmx5IGF1dG9GaWxsT25QYWdlTG9hZERlZmF1bHRLZXk6IHN0cmluZyA9IENvbnN0YW50c1NlcnZpY2UuYXV0b0ZpbGxPblBhZ2VMb2FkRGVmYXVsdEtleTtcbiAgICByZWFkb25seSB2YXVsdFRpbWVvdXRLZXk6IHN0cmluZyA9IENvbnN0YW50c1NlcnZpY2UudmF1bHRUaW1lb3V0S2V5O1xuICAgIHJlYWRvbmx5IHZhdWx0VGltZW91dEFjdGlvbktleTogc3RyaW5nID0gQ29uc3RhbnRzU2VydmljZS52YXVsdFRpbWVvdXRBY3Rpb25LZXk7XG4gICAgcmVhZG9ubHkgbGFzdEFjdGl2ZUtleTogc3RyaW5nID0gQ29uc3RhbnRzU2VydmljZS5sYXN0QWN0aXZlS2V5O1xuICAgIHJlYWRvbmx5IG5ldmVyRG9tYWluc0tleTogc3RyaW5nID0gQ29uc3RhbnRzU2VydmljZS5uZXZlckRvbWFpbnNLZXk7XG4gICAgcmVhZG9ubHkgaW5zdGFsbGVkVmVyc2lvbktleTogc3RyaW5nID0gQ29uc3RhbnRzU2VydmljZS5pbnN0YWxsZWRWZXJzaW9uS2V5O1xuICAgIHJlYWRvbmx5IGxvY2FsZUtleTogc3RyaW5nID0gQ29uc3RhbnRzU2VydmljZS5sb2NhbGVLZXk7XG4gICAgcmVhZG9ubHkgdGhlbWVLZXk6IHN0cmluZyA9IENvbnN0YW50c1NlcnZpY2UudGhlbWVLZXk7XG4gICAgcmVhZG9ubHkgY29sbGFwc2VkR3JvdXBpbmdzS2V5OiBzdHJpbmcgPSBDb25zdGFudHNTZXJ2aWNlLmNvbGxhcHNlZEdyb3VwaW5nc0tleTtcbiAgICByZWFkb25seSBhdXRvQ29uZmlybUZpbmdlcnByaW50czogc3RyaW5nID0gQ29uc3RhbnRzU2VydmljZS5hdXRvQ29uZmlybUZpbmdlcnByaW50cztcbiAgICByZWFkb25seSBkb250U2hvd0NhcmRzQ3VycmVudFRhYjogc3RyaW5nID0gQ29uc3RhbnRzU2VydmljZS5kb250U2hvd0NhcmRzQ3VycmVudFRhYjtcbiAgICByZWFkb25seSBkb250U2hvd0lkZW50aXRpZXNDdXJyZW50VGFiOiBzdHJpbmcgPSBDb25zdGFudHNTZXJ2aWNlLmRvbnRTaG93SWRlbnRpdGllc0N1cnJlbnRUYWI7XG4gICAgcmVhZG9ubHkgZGVmYXVsdFVyaU1hdGNoOiBzdHJpbmcgPSBDb25zdGFudHNTZXJ2aWNlLmRlZmF1bHRVcmlNYXRjaDtcbiAgICByZWFkb25seSBwaW5Qcm90ZWN0ZWRLZXk6IHN0cmluZyA9IENvbnN0YW50c1NlcnZpY2UucGluUHJvdGVjdGVkS2V5O1xuICAgIHJlYWRvbmx5IHByb3RlY3RlZFBpbjogc3RyaW5nID0gQ29uc3RhbnRzU2VydmljZS5wcm90ZWN0ZWRQaW47XG4gICAgcmVhZG9ubHkgY2xlYXJDbGlwYm9hcmRLZXk6IHN0cmluZyA9IENvbnN0YW50c1NlcnZpY2UuY2xlYXJDbGlwYm9hcmRLZXk7XG4gICAgcmVhZG9ubHkgZXZlbnRDb2xsZWN0aW9uS2V5OiBzdHJpbmcgPSBDb25zdGFudHNTZXJ2aWNlLmV2ZW50Q29sbGVjdGlvbktleTtcbiAgICByZWFkb25seSBzc29Db2RlVmVyaWZpZXJLZXk6IHN0cmluZyA9IENvbnN0YW50c1NlcnZpY2Uuc3NvQ29kZVZlcmlmaWVyS2V5O1xuICAgIHJlYWRvbmx5IHNzb1N0YXRlS2V5OiBzdHJpbmcgPSBDb25zdGFudHNTZXJ2aWNlLnNzb1N0YXRlS2V5O1xuICAgIHJlYWRvbmx5IGJpb21ldHJpY1VubG9ja0tleTogc3RyaW5nID0gQ29uc3RhbnRzU2VydmljZS5iaW9tZXRyaWNVbmxvY2tLZXk7XG4gICAgcmVhZG9ubHkgYmlvbWV0cmljVGV4dDogc3RyaW5nID0gQ29uc3RhbnRzU2VydmljZS5iaW9tZXRyaWNUZXh0O1xuICAgIHJlYWRvbmx5IGJpb21ldHJpY0F3YWl0aW5nQWNjZXB0YW5jZTogc3RyaW5nID0gQ29uc3RhbnRzU2VydmljZS5iaW9tZXRyaWNBd2FpdGluZ0FjY2VwdGFuY2U7XG4gICAgcmVhZG9ubHkgYmlvbWV0cmljRmluZ2VycHJpbnRWYWxpZGF0ZWQ6IHN0cmluZyA9IENvbnN0YW50c1NlcnZpY2UuYmlvbWV0cmljRmluZ2VycHJpbnRWYWxpZGF0ZWQ7XG59XG4iLCJpbXBvcnQgKiBhcyBsdW5yIGZyb20gJ2x1bnInO1xuXG5pbXBvcnQgeyBDaXBoZXJWaWV3IH0gZnJvbSAnLi4vbW9kZWxzL3ZpZXcvY2lwaGVyVmlldyc7XG5cbmltcG9ydCB7IENpcGhlclNlcnZpY2UgfSBmcm9tICcuLi9hYnN0cmFjdGlvbnMvY2lwaGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgSTE4blNlcnZpY2UgfSBmcm9tICcuLi9hYnN0cmFjdGlvbnMvaTE4bi5zZXJ2aWNlJztcbmltcG9ydCB7IExvZ1NlcnZpY2UgfSBmcm9tICcuLi9hYnN0cmFjdGlvbnMvbG9nLnNlcnZpY2UnO1xuaW1wb3J0IHsgU2VhcmNoU2VydmljZSBhcyBTZWFyY2hTZXJ2aWNlQWJzdHJhY3Rpb24gfSBmcm9tICcuLi9hYnN0cmFjdGlvbnMvc2VhcmNoLnNlcnZpY2UnO1xuXG5pbXBvcnQgeyBDaXBoZXJUeXBlIH0gZnJvbSAnLi4vZW51bXMvY2lwaGVyVHlwZSc7XG5pbXBvcnQgeyBGaWVsZFR5cGUgfSBmcm9tICcuLi9lbnVtcy9maWVsZFR5cGUnO1xuaW1wb3J0IHsgVXJpTWF0Y2hUeXBlIH0gZnJvbSAnLi4vZW51bXMvdXJpTWF0Y2hUeXBlJztcbmltcG9ydCB7IFNlbmRWaWV3IH0gZnJvbSAnLi4vbW9kZWxzL3ZpZXcvc2VuZFZpZXcnO1xuXG5leHBvcnQgY2xhc3MgU2VhcmNoU2VydmljZSBpbXBsZW1lbnRzIFNlYXJjaFNlcnZpY2VBYnN0cmFjdGlvbiB7XG4gICAgaW5kZXhlZEVudGl0eUlkPzogc3RyaW5nID0gbnVsbDtcbiAgICBwcml2YXRlIGluZGV4aW5nID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBpbmRleDogbHVuci5JbmRleCA9IG51bGw7XG4gICAgcHJpdmF0ZSBzZWFyY2hhYmxlTWluTGVuZ3RoID0gMjtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgY2lwaGVyU2VydmljZTogQ2lwaGVyU2VydmljZSwgcHJpdmF0ZSBsb2dTZXJ2aWNlOiBMb2dTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGkxOG5TZXJ2aWNlOiBJMThuU2VydmljZSkge1xuICAgICAgICBpZiAoWyd6aC1DTicsICd6aC1UVyddLmluZGV4T2YoaTE4blNlcnZpY2UubG9jYWxlKSAhPT0gLTEpIHtcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoYWJsZU1pbkxlbmd0aCA9IDE7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjbGVhckluZGV4KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmluZGV4ZWRFbnRpdHlJZCA9IG51bGw7XG4gICAgICAgIHRoaXMuaW5kZXggPSBudWxsO1xuICAgIH1cblxuICAgIGlzU2VhcmNoYWJsZShxdWVyeTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IG5vdFNlYXJjaGFibGUgPSBxdWVyeSA9PSBudWxsIHx8ICh0aGlzLmluZGV4ID09IG51bGwgJiYgcXVlcnkubGVuZ3RoIDwgdGhpcy5zZWFyY2hhYmxlTWluTGVuZ3RoKSB8fFxuICAgICAgICAgICAgKHRoaXMuaW5kZXggIT0gbnVsbCAmJiBxdWVyeS5sZW5ndGggPCB0aGlzLnNlYXJjaGFibGVNaW5MZW5ndGggJiYgcXVlcnkuaW5kZXhPZignPicpICE9PSAwKTtcbiAgICAgICAgcmV0dXJuICFub3RTZWFyY2hhYmxlO1xuICAgIH1cblxuICAgIGFzeW5jIGluZGV4Q2lwaGVycyhpbmRleGVkRW50aXR5SWQ/OiBzdHJpbmcsIGNpcGhlcnM/OiBDaXBoZXJWaWV3W10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMuaW5kZXhpbmcpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubG9nU2VydmljZS50aW1lKCdzZWFyY2ggaW5kZXhpbmcnKTtcbiAgICAgICAgdGhpcy5pbmRleGluZyA9IHRydWU7XG4gICAgICAgIHRoaXMuaW5kZXhlZEVudGl0eUlkID0gaW5kZXhlZEVudGl0eUlkO1xuICAgICAgICB0aGlzLmluZGV4ID0gbnVsbDtcbiAgICAgICAgY29uc3QgYnVpbGRlciA9IG5ldyBsdW5yLkJ1aWxkZXIoKTtcbiAgICAgICAgYnVpbGRlci5yZWYoJ2lkJyk7XG4gICAgICAgIGJ1aWxkZXIuZmllbGQoJ3Nob3J0aWQnLCB7IGJvb3N0OiAxMDAsIGV4dHJhY3RvcjogKGM6IENpcGhlclZpZXcpID0+IGMuaWQuc3Vic3RyKDAsIDgpIH0pO1xuICAgICAgICBidWlsZGVyLmZpZWxkKCduYW1lJywgeyBib29zdDogMTAgfSk7XG4gICAgICAgIGJ1aWxkZXIuZmllbGQoJ3N1YnRpdGxlJywge1xuICAgICAgICAgICAgYm9vc3Q6IDUsXG4gICAgICAgICAgICBleHRyYWN0b3I6IChjOiBDaXBoZXJWaWV3KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGMuc3ViVGl0bGUgIT0gbnVsbCAmJiBjLnR5cGUgPT09IENpcGhlclR5cGUuQ2FyZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYy5zdWJUaXRsZS5yZXBsYWNlKC9cXCovZywgJycpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gYy5zdWJUaXRsZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICBidWlsZGVyLmZpZWxkKCdub3RlcycpO1xuICAgICAgICBidWlsZGVyLmZpZWxkKCdsb2dpbi51c2VybmFtZScsIHtcbiAgICAgICAgICAgIGV4dHJhY3RvcjogKGM6IENpcGhlclZpZXcpID0+IGMudHlwZSA9PT0gQ2lwaGVyVHlwZS5Mb2dpbiAmJiBjLmxvZ2luICE9IG51bGwgPyBjLmxvZ2luLnVzZXJuYW1lIDogbnVsbCxcbiAgICAgICAgfSk7XG4gICAgICAgIGJ1aWxkZXIuZmllbGQoJ2xvZ2luLnVyaXMnLCB7IGJvb3N0OiAyLCBleHRyYWN0b3I6IChjOiBDaXBoZXJWaWV3KSA9PiB0aGlzLnVyaUV4dHJhY3RvcihjKSB9KTtcbiAgICAgICAgYnVpbGRlci5maWVsZCgnZmllbGRzJywgeyBleHRyYWN0b3I6IChjOiBDaXBoZXJWaWV3KSA9PiB0aGlzLmZpZWxkRXh0cmFjdG9yKGMsIGZhbHNlKSB9KTtcbiAgICAgICAgYnVpbGRlci5maWVsZCgnZmllbGRzX2pvaW5lZCcsIHsgZXh0cmFjdG9yOiAoYzogQ2lwaGVyVmlldykgPT4gdGhpcy5maWVsZEV4dHJhY3RvcihjLCB0cnVlKSB9KTtcbiAgICAgICAgYnVpbGRlci5maWVsZCgnYXR0YWNobWVudHMnLCB7IGV4dHJhY3RvcjogKGM6IENpcGhlclZpZXcpID0+IHRoaXMuYXR0YWNobWVudEV4dHJhY3RvcihjLCBmYWxzZSkgfSk7XG4gICAgICAgIGJ1aWxkZXIuZmllbGQoJ2F0dGFjaG1lbnRzX2pvaW5lZCcsXG4gICAgICAgICAgICB7IGV4dHJhY3RvcjogKGM6IENpcGhlclZpZXcpID0+IHRoaXMuYXR0YWNobWVudEV4dHJhY3RvcihjLCB0cnVlKSB9KTtcbiAgICAgICAgYnVpbGRlci5maWVsZCgnb3JnYW5pemF0aW9uaWQnLCB7IGV4dHJhY3RvcjogKGM6IENpcGhlclZpZXcpID0+IGMub3JnYW5pemF0aW9uSWQgfSk7XG4gICAgICAgIGNpcGhlcnMgPSBjaXBoZXJzIHx8IGF3YWl0IHRoaXMuY2lwaGVyU2VydmljZS5nZXRBbGxEZWNyeXB0ZWQoKTtcbiAgICAgICAgY2lwaGVycy5mb3JFYWNoKGMgPT4gYnVpbGRlci5hZGQoYykpO1xuICAgICAgICB0aGlzLmluZGV4ID0gYnVpbGRlci5idWlsZCgpO1xuXG4gICAgICAgIHRoaXMuaW5kZXhpbmcgPSBmYWxzZTtcblxuICAgICAgICB0aGlzLmxvZ1NlcnZpY2UudGltZUVuZCgnc2VhcmNoIGluZGV4aW5nJyk7XG4gICAgfVxuXG4gICAgYXN5bmMgc2VhcmNoQ2lwaGVycyhxdWVyeTogc3RyaW5nLFxuICAgICAgICBmaWx0ZXI6ICgoKGNpcGhlcjogQ2lwaGVyVmlldykgPT4gYm9vbGVhbikgfCAoKChjaXBoZXI6IENpcGhlclZpZXcpID0+IGJvb2xlYW4pW10pKSA9IG51bGwsXG4gICAgICAgIGNpcGhlcnM6IENpcGhlclZpZXdbXSA9IG51bGwpOlxuICAgICAgICBQcm9taXNlPENpcGhlclZpZXdbXT4ge1xuICAgICAgICBjb25zdCByZXN1bHRzOiBDaXBoZXJWaWV3W10gPSBbXTtcbiAgICAgICAgaWYgKHF1ZXJ5ICE9IG51bGwpIHtcbiAgICAgICAgICAgIHF1ZXJ5ID0gcXVlcnkudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHF1ZXJ5ID09PSAnJykge1xuICAgICAgICAgICAgcXVlcnkgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNpcGhlcnMgPT0gbnVsbCkge1xuICAgICAgICAgICAgY2lwaGVycyA9IGF3YWl0IHRoaXMuY2lwaGVyU2VydmljZS5nZXRBbGxEZWNyeXB0ZWQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmaWx0ZXIgIT0gbnVsbCAmJiBBcnJheS5pc0FycmF5KGZpbHRlcikgJiYgZmlsdGVyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNpcGhlcnMgPSBjaXBoZXJzLmZpbHRlcihjID0+IGZpbHRlci5ldmVyeShmID0+IGYgPT0gbnVsbCB8fCBmKGMpKSk7XG4gICAgICAgIH0gZWxzZSBpZiAoZmlsdGVyICE9IG51bGwpIHtcbiAgICAgICAgICAgIGNpcGhlcnMgPSBjaXBoZXJzLmZpbHRlcihmaWx0ZXIgYXMgKGNpcGhlcjogQ2lwaGVyVmlldykgPT4gYm9vbGVhbik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuaXNTZWFyY2hhYmxlKHF1ZXJ5KSkge1xuICAgICAgICAgICAgcmV0dXJuIGNpcGhlcnM7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5pbmRleGluZykge1xuICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UociA9PiBzZXRUaW1lb3V0KHIsIDI1MCkpO1xuICAgICAgICAgICAgaWYgKHRoaXMuaW5kZXhpbmcpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyID0+IHNldFRpbWVvdXQociwgNTAwKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuZ2V0SW5kZXhGb3JTZWFyY2goKTtcbiAgICAgICAgaWYgKGluZGV4ID09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIEZhbGwgYmFjayB0byBiYXNpYyBzZWFyY2ggaWYgaW5kZXggaXMgbm90IGF2YWlsYWJsZVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VhcmNoQ2lwaGVyc0Jhc2ljKGNpcGhlcnMsIHF1ZXJ5KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNpcGhlcnNNYXAgPSBuZXcgTWFwPHN0cmluZywgQ2lwaGVyVmlldz4oKTtcbiAgICAgICAgY2lwaGVycy5mb3JFYWNoKGMgPT4gY2lwaGVyc01hcC5zZXQoYy5pZCwgYykpO1xuXG4gICAgICAgIGxldCBzZWFyY2hSZXN1bHRzOiBsdW5yLkluZGV4LlJlc3VsdFtdID0gbnVsbDtcbiAgICAgICAgY29uc3QgaXNRdWVyeVN0cmluZyA9IHF1ZXJ5ICE9IG51bGwgJiYgcXVlcnkubGVuZ3RoID4gMSAmJiBxdWVyeS5pbmRleE9mKCc+JykgPT09IDA7XG4gICAgICAgIGlmIChpc1F1ZXJ5U3RyaW5nKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHNlYXJjaFJlc3VsdHMgPSBpbmRleC5zZWFyY2gocXVlcnkuc3Vic3RyKDEpLnRyaW0oKSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dTZXJ2aWNlLmVycm9yKGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lXG4gICAgICAgICAgICBjb25zdCBzb1dpbGQgPSBsdW5yLlF1ZXJ5LndpbGRjYXJkLkxFQURJTkcgfCBsdW5yLlF1ZXJ5LndpbGRjYXJkLlRSQUlMSU5HO1xuICAgICAgICAgICAgc2VhcmNoUmVzdWx0cyA9IGluZGV4LnF1ZXJ5KHEgPT4ge1xuICAgICAgICAgICAgICAgIGx1bnIudG9rZW5pemVyKHF1ZXJ5KS5mb3JFYWNoKHRva2VuID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IHRva2VuLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIHEudGVybSh0LCB7IGZpZWxkczogWyduYW1lJ10sIHdpbGRjYXJkOiBzb1dpbGQgfSk7XG4gICAgICAgICAgICAgICAgICAgIHEudGVybSh0LCB7IGZpZWxkczogWydzdWJ0aXRsZSddLCB3aWxkY2FyZDogc29XaWxkIH0pO1xuICAgICAgICAgICAgICAgICAgICBxLnRlcm0odCwgeyBmaWVsZHM6IFsnbG9naW4udXJpcyddLCB3aWxkY2FyZDogc29XaWxkIH0pO1xuICAgICAgICAgICAgICAgICAgICBxLnRlcm0odCwge30pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2VhcmNoUmVzdWx0cyAhPSBudWxsKSB7XG4gICAgICAgICAgICBzZWFyY2hSZXN1bHRzLmZvckVhY2gociA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGNpcGhlcnNNYXAuaGFzKHIucmVmKSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHRzLnB1c2goY2lwaGVyc01hcC5nZXQoci5yZWYpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0cztcbiAgICB9XG5cbiAgICBzZWFyY2hDaXBoZXJzQmFzaWMoY2lwaGVyczogQ2lwaGVyVmlld1tdLCBxdWVyeTogc3RyaW5nLCBkZWxldGVkOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICAgICAgcXVlcnkgPSBxdWVyeS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgcmV0dXJuIGNpcGhlcnMuZmlsdGVyKGMgPT4ge1xuICAgICAgICAgICAgaWYgKGRlbGV0ZWQgIT09IGMuaXNEZWxldGVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGMubmFtZSAhPSBudWxsICYmIGMubmFtZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YocXVlcnkpID4gLTEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChxdWVyeS5sZW5ndGggPj0gOCAmJiBjLmlkLnN0YXJ0c1dpdGgocXVlcnkpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYy5zdWJUaXRsZSAhPSBudWxsICYmIGMuc3ViVGl0bGUudG9Mb3dlckNhc2UoKS5pbmRleE9mKHF1ZXJ5KSA+IC0xKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYy5sb2dpbiAmJiBjLmxvZ2luLnVyaSAhPSBudWxsICYmIGMubG9naW4udXJpLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihxdWVyeSkgPiAtMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzZWFyY2hTZW5kcyhzZW5kczogU2VuZFZpZXdbXSwgcXVlcnk6IHN0cmluZykge1xuICAgICAgICBxdWVyeSA9IHF1ZXJ5LnRyaW0oKS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuXG4gICAgICAgIHJldHVybiBzZW5kcy5maWx0ZXIocyA9PiB7XG4gICAgICAgICAgICBpZiAocy5uYW1lICE9IG51bGwgJiYgcy5uYW1lLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihxdWVyeSkgPiAtMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHF1ZXJ5Lmxlbmd0aCA+PSA4ICYmIChzLmlkLnN0YXJ0c1dpdGgocXVlcnkpIHx8IHMuYWNjZXNzSWQudG9Mb2NhbGVMb3dlckNhc2UoKS5zdGFydHNXaXRoKHF1ZXJ5KSB8fCAocy5maWxlPy5pZCAhPSBudWxsICYmIHMuZmlsZS5pZC5zdGFydHNXaXRoKHF1ZXJ5KSkpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocy5ub3RlcyAhPSBudWxsICYmIHMubm90ZXMudG9Mb3dlckNhc2UoKS5pbmRleE9mKHF1ZXJ5KSA+IC0xKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocy50ZXh0Py50ZXh0ICE9IG51bGwgJiYgcy50ZXh0LnRleHQudG9Mb3dlckNhc2UoKS5pbmRleE9mKHF1ZXJ5KSA+IC0xKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocy5maWxlPy5maWxlTmFtZSAhPSBudWxsICYmIHMuZmlsZS5maWxlTmFtZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YocXVlcnkpID4gLTEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZ2V0SW5kZXhGb3JTZWFyY2goKTogbHVuci5JbmRleCB7XG4gICAgICAgIHJldHVybiB0aGlzLmluZGV4O1xuICAgIH1cblxuICAgIHByaXZhdGUgZmllbGRFeHRyYWN0b3IoYzogQ2lwaGVyVmlldywgam9pbmVkOiBib29sZWFuKSB7XG4gICAgICAgIGlmICghYy5oYXNGaWVsZHMpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGxldCBmaWVsZHM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGMuZmllbGRzLmZvckVhY2goZiA9PiB7XG4gICAgICAgICAgICBpZiAoZi5uYW1lICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBmaWVsZHMucHVzaChmLm5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGYudHlwZSA9PT0gRmllbGRUeXBlLlRleHQgJiYgZi52YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgZmllbGRzLnB1c2goZi52YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBmaWVsZHMgPSBmaWVsZHMuZmlsdGVyKGYgPT4gZi50cmltKCkgIT09ICcnKTtcbiAgICAgICAgaWYgKGZpZWxkcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBqb2luZWQgPyBmaWVsZHMuam9pbignICcpIDogZmllbGRzO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXR0YWNobWVudEV4dHJhY3RvcihjOiBDaXBoZXJWaWV3LCBqb2luZWQ6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKCFjLmhhc0F0dGFjaG1lbnRzKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgYXR0YWNobWVudHM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGMuYXR0YWNobWVudHMuZm9yRWFjaChhID0+IHtcbiAgICAgICAgICAgIGlmIChhICE9IG51bGwgJiYgYS5maWxlTmFtZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKGpvaW5lZCAmJiBhLmZpbGVOYW1lLmluZGV4T2YoJy4nKSA+IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnRzLnB1c2goYS5maWxlTmFtZS5zdWJzdHIoMCwgYS5maWxlTmFtZS5sYXN0SW5kZXhPZignLicpKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYXR0YWNobWVudHMucHVzaChhLmZpbGVOYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBhdHRhY2htZW50cyA9IGF0dGFjaG1lbnRzLmZpbHRlcihmID0+IGYudHJpbSgpICE9PSAnJyk7XG4gICAgICAgIGlmIChhdHRhY2htZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBqb2luZWQgPyBhdHRhY2htZW50cy5qb2luKCcgJykgOiBhdHRhY2htZW50cztcbiAgICB9XG5cbiAgICBwcml2YXRlIHVyaUV4dHJhY3RvcihjOiBDaXBoZXJWaWV3KSB7XG4gICAgICAgIGlmIChjLnR5cGUgIT09IENpcGhlclR5cGUuTG9naW4gfHwgYy5sb2dpbiA9PSBudWxsIHx8ICFjLmxvZ2luLmhhc1VyaXMpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVyaXM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGMubG9naW4udXJpcy5mb3JFYWNoKHUgPT4ge1xuICAgICAgICAgICAgaWYgKHUudXJpID09IG51bGwgfHwgdS51cmkgPT09ICcnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHUuaG9zdG5hbWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHVyaXMucHVzaCh1Lmhvc3RuYW1lKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgdXJpID0gdS51cmk7XG4gICAgICAgICAgICBpZiAodS5tYXRjaCAhPT0gVXJpTWF0Y2hUeXBlLlJlZ3VsYXJFeHByZXNzaW9uKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJvdG9jb2xJbmRleCA9IHVyaS5pbmRleE9mKCc6Ly8nKTtcbiAgICAgICAgICAgICAgICBpZiAocHJvdG9jb2xJbmRleCA+IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHVyaSA9IHVyaS5zdWJzdHIocHJvdG9jb2xJbmRleCArIDMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBxdWVyeUluZGV4ID0gdXJpLnNlYXJjaCgvXFw/fCZ8Iy8pO1xuICAgICAgICAgICAgICAgIGlmIChxdWVyeUluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgdXJpID0gdXJpLnN1YnN0cmluZygwLCBxdWVyeUluZGV4KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB1cmlzLnB1c2godXJpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB1cmlzLmxlbmd0aCA+IDAgPyB1cmlzIDogbnVsbDtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBTdGF0ZVNlcnZpY2UgYXMgU3RhdGVTZXJ2aWNlQWJzdHJhY3Rpb24gfSBmcm9tICcuLi9hYnN0cmFjdGlvbnMvc3RhdGUuc2VydmljZSc7XG5cbmV4cG9ydCBjbGFzcyBTdGF0ZVNlcnZpY2UgaW1wbGVtZW50cyBTdGF0ZVNlcnZpY2VBYnN0cmFjdGlvbiB7XG4gICAgcHJpdmF0ZSBzdGF0ZTogYW55ID0ge307XG5cbiAgICBnZXQ8VD4oa2V5OiBzdHJpbmcpOiBQcm9taXNlPFQ+IHtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLnN0YXRlW2tleV0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7XG4gICAgfVxuXG4gICAgc2F2ZShrZXk6IHN0cmluZywgb2JqOiBhbnkpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICB0aGlzLnN0YXRlW2tleV0gPSBvYmo7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB9XG5cbiAgICByZW1vdmUoa2V5OiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICBkZWxldGUgdGhpcy5zdGF0ZVtrZXldO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfVxuXG4gICAgcHVyZ2UoKTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHt9O1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgU2FmYXJpQXBwIH0gZnJvbSAnLi9zYWZhcmlBcHAnO1xuXG5pbXBvcnQgeyBVdGlscyB9IGZyb20gJ2pzbGliLWNvbW1vbi9taXNjL3V0aWxzJztcblxuZXhwb3J0IGNsYXNzIEJyb3dzZXJBcGkge1xuICAgIHN0YXRpYyBpc1dlYkV4dGVuc2lvbnNBcGk6IGJvb2xlYW4gPSAodHlwZW9mIGJyb3dzZXIgIT09ICd1bmRlZmluZWQnKTtcbiAgICBzdGF0aWMgaXNTYWZhcmlBcGk6IGJvb2xlYW4gPSBuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJyBTYWZhcmkvJykgIT09IC0xICYmXG4gICAgICAgIG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignIENocm9tZS8nKSA9PT0gLTEgJiZcbiAgICAgICAgbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCcgQ2hyb21pdW0vJykgPT09IC0xO1xuICAgIHN0YXRpYyBpc0Nocm9tZUFwaTogYm9vbGVhbiA9ICFCcm93c2VyQXBpLmlzU2FmYXJpQXBpICYmICh0eXBlb2YgY2hyb21lICE9PSAndW5kZWZpbmVkJyk7XG4gICAgc3RhdGljIGlzRmlyZWZveE9uQW5kcm9pZDogYm9vbGVhbiA9IG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignRmlyZWZveC8nKSAhPT0gLTEgJiZcbiAgICAgICAgbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdBbmRyb2lkJykgIT09IC0xO1xuXG4gICAgc3RhdGljIGFzeW5jIGdldFRhYkZyb21DdXJyZW50V2luZG93SWQoKTogUHJvbWlzZTxjaHJvbWUudGFicy5UYWI+IHwgbnVsbCB7XG4gICAgICAgIHJldHVybiBhd2FpdCBCcm93c2VyQXBpLnRhYnNRdWVyeUZpcnN0KHtcbiAgICAgICAgICAgIGFjdGl2ZTogdHJ1ZSxcbiAgICAgICAgICAgIHdpbmRvd0lkOiBjaHJvbWUud2luZG93cy5XSU5ET1dfSURfQ1VSUkVOVCxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc3RhdGljIGFzeW5jIGdldFRhYkZyb21DdXJyZW50V2luZG93KCk6IFByb21pc2U8Y2hyb21lLnRhYnMuVGFiPiB8IG51bGwge1xuICAgICAgICByZXR1cm4gYXdhaXQgQnJvd3NlckFwaS50YWJzUXVlcnlGaXJzdCh7XG4gICAgICAgICAgICBhY3RpdmU6IHRydWUsXG4gICAgICAgICAgICBjdXJyZW50V2luZG93OiB0cnVlLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzdGF0aWMgYXN5bmMgZ2V0QWN0aXZlVGFicygpOiBQcm9taXNlPGNocm9tZS50YWJzLlRhYltdPiB7XG4gICAgICAgIHJldHVybiBhd2FpdCBCcm93c2VyQXBpLnRhYnNRdWVyeSh7XG4gICAgICAgICAgICBhY3RpdmU6IHRydWUsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHN0YXRpYyBhc3luYyB0YWJzUXVlcnkob3B0aW9uczogY2hyb21lLnRhYnMuUXVlcnlJbmZvKTogUHJvbWlzZTxjaHJvbWUudGFicy5UYWJbXT4ge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAgICAgICBjaHJvbWUudGFicy5xdWVyeShvcHRpb25zLCAodGFiczogYW55W10pID0+IHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKHRhYnMpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHN0YXRpYyBhc3luYyB0YWJzUXVlcnlGaXJzdChvcHRpb25zOiBjaHJvbWUudGFicy5RdWVyeUluZm8pOiBQcm9taXNlPGNocm9tZS50YWJzLlRhYj4gfCBudWxsIHtcbiAgICAgICAgY29uc3QgdGFicyA9IGF3YWl0IEJyb3dzZXJBcGkudGFic1F1ZXJ5KG9wdGlvbnMpO1xuICAgICAgICBpZiAodGFicy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdGFic1swXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHN0YXRpYyB0YWJTZW5kTWVzc2FnZURhdGEodGFiOiBjaHJvbWUudGFicy5UYWIsIGNvbW1hbmQ6IHN0cmluZywgZGF0YTogYW55ID0gbnVsbCk6IFByb21pc2U8YW55W10+IHtcbiAgICAgICAgY29uc3Qgb2JqOiBhbnkgPSB7XG4gICAgICAgICAgICBjb21tYW5kOiBjb21tYW5kLFxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChkYXRhICE9IG51bGwpIHtcbiAgICAgICAgICAgIG9iai5kYXRhID0gZGF0YTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBCcm93c2VyQXBpLnRhYlNlbmRNZXNzYWdlKHRhYiwgb2JqKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgYXN5bmMgdGFiU2VuZE1lc3NhZ2UodGFiOiBjaHJvbWUudGFicy5UYWIsIG9iajogYW55LCBvcHRpb25zOiBjaHJvbWUudGFicy5NZXNzYWdlU2VuZE9wdGlvbnMgPSBudWxsKTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgaWYgKCF0YWIgfHwgIXRhYi5pZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KHJlc29sdmUgPT4ge1xuICAgICAgICAgICAgY2hyb21lLnRhYnMuc2VuZE1lc3NhZ2UodGFiLmlkLCBvYmosIG9wdGlvbnMsICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY2hyb21lLnJ1bnRpbWUubGFzdEVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFNvbWUgZXJyb3IgaGFwcGVuZWRcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHN0YXRpYyBnZXRCYWNrZ3JvdW5kUGFnZSgpOiBhbnkge1xuICAgICAgICByZXR1cm4gY2hyb21lLmV4dGVuc2lvbi5nZXRCYWNrZ3JvdW5kUGFnZSgpO1xuICAgIH1cblxuICAgIHN0YXRpYyBnZXRBcHBsaWNhdGlvblZlcnNpb24oKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGNocm9tZS5ydW50aW1lLmdldE1hbmlmZXN0KCkudmVyc2lvbjtcbiAgICB9XG5cbiAgICBzdGF0aWMgYXN5bmMgaXNQb3B1cE9wZW4oKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoY2hyb21lLmV4dGVuc2lvbi5nZXRWaWV3cyh7IHR5cGU6ICdwb3B1cCcgfSkubGVuZ3RoID4gMCk7XG4gICAgfVxuXG4gICAgc3RhdGljIGNyZWF0ZU5ld1RhYih1cmw6IHN0cmluZywgZXh0ZW5zaW9uUGFnZTogYm9vbGVhbiA9IGZhbHNlLCBhY3RpdmU6IGJvb2xlYW4gPSB0cnVlKSB7XG4gICAgICAgIGNocm9tZS50YWJzLmNyZWF0ZSh7IHVybDogdXJsLCBhY3RpdmU6IGFjdGl2ZSB9KTtcbiAgICB9XG5cbiAgICBzdGF0aWMgbWVzc2FnZUxpc3RlbmVyKG5hbWU6IHN0cmluZywgY2FsbGJhY2s6IChtZXNzYWdlOiBhbnksIHNlbmRlcjogY2hyb21lLnJ1bnRpbWUuTWVzc2FnZVNlbmRlciwgcmVzcG9uc2U6IGFueSkgPT4gdm9pZCkge1xuICAgICAgICBjaHJvbWUucnVudGltZS5vbk1lc3NhZ2UuYWRkTGlzdGVuZXIoKG1zZzogYW55LCBzZW5kZXI6IGNocm9tZS5ydW50aW1lLk1lc3NhZ2VTZW5kZXIsIHJlc3BvbnNlOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGNhbGxiYWNrKG1zZywgc2VuZGVyLCByZXNwb25zZSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHN0YXRpYyBhc3luYyBjbG9zZUxvZ2luVGFiKCkge1xuICAgICAgICBjb25zdCB0YWJzID0gYXdhaXQgQnJvd3NlckFwaS50YWJzUXVlcnkoe1xuICAgICAgICAgICAgYWN0aXZlOiB0cnVlLFxuICAgICAgICAgICAgdGl0bGU6ICdCaXR3YXJkZW4nLFxuICAgICAgICAgICAgd2luZG93VHlwZTogJ25vcm1hbCcsXG4gICAgICAgICAgICBjdXJyZW50V2luZG93OiB0cnVlLFxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAodGFicy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRhYlRvQ2xvc2UgPSB0YWJzW3RhYnMubGVuZ3RoIC0gMV0uaWQ7XG4gICAgICAgIGNocm9tZS50YWJzLnJlbW92ZSh0YWJUb0Nsb3NlKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgYXN5bmMgZm9jdXNTcGVjaWZpZWRUYWIodGFiSWQ6IG51bWJlcikge1xuICAgICAgICBjaHJvbWUudGFicy51cGRhdGUodGFiSWQsIHsgYWN0aXZlOiB0cnVlLCBoaWdobGlnaHRlZDogdHJ1ZSB9KTtcbiAgICB9XG5cbiAgICBzdGF0aWMgY2xvc2VQb3B1cCh3aW46IFdpbmRvdykge1xuICAgICAgICBpZiAoQnJvd3NlckFwaS5pc1dlYkV4dGVuc2lvbnNBcGkgJiYgQnJvd3NlckFwaS5pc0ZpcmVmb3hPbkFuZHJvaWQpIHtcbiAgICAgICAgICAgIC8vIFJlYWN0aXZhdGluZyB0aGUgYWN0aXZlIHRhYiBkaXNtaXNzZXMgdGhlIHBvcHVwIHRhYi4gVGhlIHByb21pc2UgZmluYWxcbiAgICAgICAgICAgIC8vIGNvbmRpdGlvbiBpcyBvbmx5IGNhbGxlZCBpZiB0aGUgcG9wdXAgd2Fzbid0IGFscmVhZHkgZGlzbWlzc2VkIChmdXR1cmUgcHJvb2ZpbmcpLlxuICAgICAgICAgICAgLy8gcmVmOiBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD0xNDMzNjA0XG4gICAgICAgICAgICBicm93c2VyLnRhYnMudXBkYXRlKHsgYWN0aXZlOiB0cnVlIH0pLmZpbmFsbHkod2luLmNsb3NlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHdpbi5jbG9zZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGRvd25sb2FkRmlsZSh3aW46IFdpbmRvdywgYmxvYkRhdGE6IGFueSwgYmxvYk9wdGlvbnM6IGFueSwgZmlsZU5hbWU6IHN0cmluZykge1xuICAgICAgICBpZiAoQnJvd3NlckFwaS5pc1NhZmFyaUFwaSkge1xuICAgICAgICAgICAgY29uc3QgdHlwZSA9IGJsb2JPcHRpb25zICE9IG51bGwgPyBibG9iT3B0aW9ucy50eXBlIDogbnVsbDtcbiAgICAgICAgICAgIGxldCBkYXRhOiBzdHJpbmcgPSBudWxsO1xuICAgICAgICAgICAgaWYgKHR5cGUgPT09ICd0ZXh0L3BsYWluJyAmJiB0eXBlb2YgKGJsb2JEYXRhKSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBkYXRhID0gYmxvYkRhdGE7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGRhdGEgPSBVdGlscy5mcm9tQnVmZmVyVG9CNjQoYmxvYkRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgU2FmYXJpQXBwLnNlbmRNZXNzYWdlVG9BcHAoJ2Rvd25sb2FkRmlsZScsIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICBibG9iRGF0YTogZGF0YSxcbiAgICAgICAgICAgICAgICBibG9iT3B0aW9uczogYmxvYk9wdGlvbnMsXG4gICAgICAgICAgICAgICAgZmlsZU5hbWU6IGZpbGVOYW1lLFxuICAgICAgICAgICAgfSksIHRydWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtibG9iRGF0YV0sIGJsb2JPcHRpb25zKTtcbiAgICAgICAgICAgIGlmIChuYXZpZ2F0b3IubXNTYXZlT3JPcGVuQmxvYikge1xuICAgICAgICAgICAgICAgIG5hdmlnYXRvci5tc1NhdmVCbG9iKGJsb2IsIGZpbGVOYW1lKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYSA9IHdpbi5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgICAgICAgICAgICAgYS5ocmVmID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcbiAgICAgICAgICAgICAgICBhLmRvd25sb2FkID0gZmlsZU5hbWU7XG4gICAgICAgICAgICAgICAgd2luLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSk7XG4gICAgICAgICAgICAgICAgYS5jbGljaygpO1xuICAgICAgICAgICAgICAgIHdpbi5kb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGdhRmlsdGVyKCkge1xuICAgICAgICByZXR1cm4gcHJvY2Vzcy5lbnYuRU5WICE9PSAncHJvZHVjdGlvbic7XG4gICAgfVxuXG4gICAgc3RhdGljIGdldFVJTGFuZ3VhZ2Uod2luOiBXaW5kb3cpIHtcbiAgICAgICAgcmV0dXJuIGNocm9tZS5pMThuLmdldFVJTGFuZ3VhZ2UoKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgcmVsb2FkRXh0ZW5zaW9uKHdpbjogV2luZG93KSB7XG4gICAgICAgIGlmICh3aW4gIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHdpbi5sb2NhdGlvbi5yZWxvYWQodHJ1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gY2hyb21lLnJ1bnRpbWUucmVsb2FkKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgcmVsb2FkT3BlbldpbmRvd3MoKSB7XG4gICAgICAgIGNvbnN0IHZpZXdzID0gY2hyb21lLmV4dGVuc2lvbi5nZXRWaWV3cygpIGFzIFdpbmRvd1tdO1xuICAgICAgICB2aWV3cy5maWx0ZXIodyA9PiB3LmxvY2F0aW9uLmhyZWYgIT0gbnVsbCkuZm9yRWFjaCh3ID0+IHtcbiAgICAgICAgICAgIHcubG9jYXRpb24ucmVsb2FkKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHN0YXRpYyBjb25uZWN0TmF0aXZlKGFwcGxpY2F0aW9uOiBzdHJpbmcpOiBicm93c2VyLnJ1bnRpbWUuUG9ydCB8IGNocm9tZS5ydW50aW1lLlBvcnQge1xuICAgICAgICBpZiAoQnJvd3NlckFwaS5pc1dlYkV4dGVuc2lvbnNBcGkpIHtcbiAgICAgICAgICAgIHJldHVybiBicm93c2VyLnJ1bnRpbWUuY29ubmVjdE5hdGl2ZShhcHBsaWNhdGlvbik7XG4gICAgICAgIH0gZWxzZSBpZiAoQnJvd3NlckFwaS5pc0Nocm9tZUFwaSkge1xuICAgICAgICAgICAgcmV0dXJuIGNocm9tZS5ydW50aW1lLmNvbm5lY3ROYXRpdmUoYXBwbGljYXRpb24pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIHJlcXVlc3RQZXJtaXNzaW9uKHBlcm1pc3Npb246IGFueSkge1xuICAgICAgICBpZiAoQnJvd3NlckFwaS5pc1dlYkV4dGVuc2lvbnNBcGkpIHtcbiAgICAgICAgICAgIHJldHVybiBicm93c2VyLnBlcm1pc3Npb25zLnJlcXVlc3QocGVybWlzc2lvbik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGNocm9tZS5wZXJtaXNzaW9ucy5yZXF1ZXN0KHBlcm1pc3Npb24sIHJlc29sdmUpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0UGxhdGZvcm1JbmZvKCk6IFByb21pc2U8YnJvd3Nlci5ydW50aW1lLlBsYXRmb3JtSW5mbyB8IGNocm9tZS5ydW50aW1lLlBsYXRmb3JtSW5mbz4ge1xuICAgICAgICBpZiAoQnJvd3NlckFwaS5pc1dlYkV4dGVuc2lvbnNBcGkpIHtcbiAgICAgICAgICAgIHJldHVybiBicm93c2VyLnJ1bnRpbWUuZ2V0UGxhdGZvcm1JbmZvKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgICAgICAgY2hyb21lLnJ1bnRpbWUuZ2V0UGxhdGZvcm1JbmZvKHJlc29sdmUpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBCcm93c2VyQXBpIH0gZnJvbSAnLi9icm93c2VyQXBpJztcblxuZXhwb3J0IGNsYXNzIFNhZmFyaUFwcCB7XG4gICAgc3RhdGljIHNlbmRNZXNzYWdlVG9BcHAoY29tbWFuZDogc3RyaW5nLCBkYXRhOiBhbnkgPSBudWxsLCByZXNvbHZlTm93ID0gZmFsc2UpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICBpZiAoIUJyb3dzZXJBcGkuaXNTYWZhcmlBcGkpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgICAgICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2VJZCA9IG5vdy5nZXRUaW1lKCkudG9TdHJpbmcoKSArICdfJyArIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIE51bWJlci5NQVhfU0FGRV9JTlRFR0VSKTtcbiAgICAgICAgICAgIChicm93c2VyIGFzIGFueSkucnVudGltZS5zZW5kTmF0aXZlTWVzc2FnZSgnY29tLmJpdHdhcmRlbi5kZXNrdG9wJywge1xuICAgICAgICAgICAgICAgIGlkOiBtZXNzYWdlSWQsXG4gICAgICAgICAgICAgICAgY29tbWFuZDogY29tbWFuZCxcbiAgICAgICAgICAgICAgICBkYXRhOiBkYXRhLFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlRGF0YTogbnVsbCxcbiAgICAgICAgICAgIH0sIChyZXNwb25zZTogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShyZXNwb25zZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuXG5pbXBvcnQgeyBFbnZpcm9ubWVudFNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL2Vudmlyb25tZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgSTE4blNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL2kxOG4uc2VydmljZSc7XG5pbXBvcnQgeyBQbGF0Zm9ybVV0aWxzU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvcGxhdGZvcm1VdGlscy5zZXJ2aWNlJztcblxuaW1wb3J0IHsgRW52aXJvbm1lbnRDb21wb25lbnQgYXMgQmFzZUVudmlyb25tZW50Q29tcG9uZW50IH0gZnJvbSAnanNsaWItYW5ndWxhci9jb21wb25lbnRzL2Vudmlyb25tZW50LmNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnYXBwLWVudmlyb25tZW50JyxcbiAgICB0ZW1wbGF0ZVVybDogJ2Vudmlyb25tZW50LmNvbXBvbmVudC5odG1sJyxcbn0pXG5leHBvcnQgY2xhc3MgRW52aXJvbm1lbnRDb21wb25lbnQgZXh0ZW5kcyBCYXNlRW52aXJvbm1lbnRDb21wb25lbnQge1xuICAgIGNvbnN0cnVjdG9yKHBsYXRmb3JtVXRpbHNTZXJ2aWNlOiBQbGF0Zm9ybVV0aWxzU2VydmljZSwgZW52aXJvbm1lbnRTZXJ2aWNlOiBFbnZpcm9ubWVudFNlcnZpY2UsXG4gICAgICAgIGkxOG5TZXJ2aWNlOiBJMThuU2VydmljZSwgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcikge1xuICAgICAgICBzdXBlcihwbGF0Zm9ybVV0aWxzU2VydmljZSwgZW52aXJvbm1lbnRTZXJ2aWNlLCBpMThuU2VydmljZSk7XG4gICAgICAgIHRoaXMuc2hvd0N1c3RvbSA9IHRydWU7XG4gICAgfVxuXG4gICAgc2F2ZWQoKSB7XG4gICAgICAgIHN1cGVyLnNhdmVkKCk7XG4gICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnJ10pO1xuICAgIH1cbn1cbiIsIjxmb3JtICNmb3JtIChuZ1N1Ym1pdCk9XCJzdWJtaXQoKVwiPlxuICAgIDxoZWFkZXI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJsZWZ0XCI+XG4gICAgICAgICAgICA8YSByb3V0ZXJMaW5rPVwiL2hvbWVcIj57eydjbG9zZScgfCBpMThufX08L2E+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2VudGVyXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRpdGxlXCI+e3snYXBwTmFtZScgfCBpMThufX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwicmlnaHRcIj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cInN1Ym1pdFwiIGFwcEJsdXJDbGljayBbZGlzYWJsZWRdPVwiZm9ybS5sb2FkaW5nXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gW2hpZGRlbl09XCJmb3JtLmxvYWRpbmdcIj57eydzYXZlJyB8IGkxOG59fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXNwaW5uZXIgZmEtbGcgZmEtc3BpblwiIFtoaWRkZW5dPVwiIWZvcm0ubG9hZGluZ1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2hlYWRlcj5cbiAgICA8Y29udGVudD5cbiAgICAgICAgPGRpdiBjbGFzcz1cImJveFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1oZWFkZXJcIj5cbiAgICAgICAgICAgICAgICB7eydzZWxmSG9zdGVkRW52aXJvbm1lbnQnIHwgaTE4bn19XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtY29udGVudFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtY29udGVudC1yb3dcIiBhcHBCb3hSb3c+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJiYXNlVXJsXCI+e3snYmFzZVVybCcgfCBpMThufX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9XCJiYXNlVXJsXCIgdHlwZT1cInRleHRcIiBuYW1lPVwiQmFzZVVybFwiIFsobmdNb2RlbCldPVwiYmFzZVVybFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cImV4LiBodHRwczovL2JpdHdhcmRlbi5jb21wYW55LmNvbVwiIGFwcElucHV0VmVyYmF0aW0+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtZm9vdGVyXCI+XG4gICAgICAgICAgICAgICAge3snc2VsZkhvc3RlZEVudmlyb25tZW50Rm9vdGVyJyB8IGkxOG59fVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYm94XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWhlYWRlclwiPlxuICAgICAgICAgICAgICAgIHt7J2N1c3RvbUVudmlyb25tZW50JyB8IGkxOG59fVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWNvbnRlbnRcIiBbaGlkZGVuXT1cIiFzaG93Q3VzdG9tXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50LXJvd1wiIGFwcEJveFJvdz5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cIndlYlZhdWx0VXJsXCI+e3snd2ViVmF1bHRVcmwnIHwgaTE4bn19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPVwid2ViVmF1bHRVcmxcIiB0eXBlPVwidGV4dFwiIG5hbWU9XCJXZWJWYXVsdFVybFwiIFsobmdNb2RlbCldPVwid2ViVmF1bHRVcmxcIiBpbnB1dG1vZGU9XCJ1cmxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgYXBwSW5wdXRWZXJiYXRpbT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWNvbnRlbnQtcm93XCIgYXBwQm94Um93PlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiYXBpVXJsXCI+e3snYXBpVXJsJyB8IGkxOG59fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD1cImFwaVVybFwiIHR5cGU9XCJ0ZXh0XCIgbmFtZT1cIkFwaVVybFwiIFsobmdNb2RlbCldPVwiYXBpVXJsXCIgaW5wdXRtb2RlPVwidXJsXCIgYXBwSW5wdXRWZXJiYXRpbT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWNvbnRlbnQtcm93XCIgYXBwQm94Um93PlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiaWRlbnRpdHlVcmxcIj57eydpZGVudGl0eVVybCcgfCBpMThufX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9XCJpZGVudGl0eVVybFwiIHR5cGU9XCJ0ZXh0XCIgbmFtZT1cIklkZW50aXR5VXJsXCIgWyhuZ01vZGVsKV09XCJpZGVudGl0eVVybFwiIGlucHV0bW9kZT1cInVybFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBhcHBJbnB1dFZlcmJhdGltPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtY29udGVudC1yb3dcIiBhcHBCb3hSb3c+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJub3RpZmljYXRpb25zVXJsXCI+e3snbm90aWZpY2F0aW9uc1VybCcgfCBpMThufX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9XCJub3RpZmljYXRpb25zVXJsXCIgdHlwZT1cInRleHRcIiBuYW1lPVwiTm90aWZpY2F0aW9uc1VybFwiIGlucHV0bW9kZT1cInVybFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIm5vdGlmaWNhdGlvbnNVcmxcIiBhcHBJbnB1dFZlcmJhdGltPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtY29udGVudC1yb3dcIiBhcHBCb3hSb3c+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJpY29uc1VybFwiPnt7J2ljb25zVXJsJyB8IGkxOG59fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD1cImljb25zVXJsXCIgdHlwZT1cInRleHRcIiBuYW1lPVwiSWNvbnNVcmxcIiBbKG5nTW9kZWwpXT1cImljb25zVXJsXCIgaW5wdXRtb2RlPVwidXJsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwcElucHV0VmVyYmF0aW0+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtZm9vdGVyXCIgW2hpZGRlbl09XCIhc2hvd0N1c3RvbVwiPlxuICAgICAgICAgICAgICAgIHt7J2N1c3RvbUVudmlyb25tZW50Rm9vdGVyJyB8IGkxOG59fVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvY29udGVudD5cbjwvZm9ybT5cbiIsImltcG9ydCB7IENvbXBvbmVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcblxuaW1wb3J0IHsgQXBpU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvYXBpLnNlcnZpY2UnO1xuaW1wb3J0IHsgSTE4blNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL2kxOG4uc2VydmljZSc7XG5pbXBvcnQgeyBMb2dTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9sb2cuc2VydmljZSc7XG5pbXBvcnQgeyBQbGF0Zm9ybVV0aWxzU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvcGxhdGZvcm1VdGlscy5zZXJ2aWNlJztcblxuaW1wb3J0IHsgSGludENvbXBvbmVudCBhcyBCYXNlSGludENvbXBvbmVudCB9IGZyb20gJ2pzbGliLWFuZ3VsYXIvY29tcG9uZW50cy9oaW50LmNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnYXBwLWhpbnQnLFxuICAgIHRlbXBsYXRlVXJsOiAnaGludC5jb21wb25lbnQuaHRtbCcsXG59KVxuZXhwb3J0IGNsYXNzIEhpbnRDb21wb25lbnQgZXh0ZW5kcyBCYXNlSGludENvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3Iocm91dGVyOiBSb3V0ZXIsIHBsYXRmb3JtVXRpbHNTZXJ2aWNlOiBQbGF0Zm9ybVV0aWxzU2VydmljZSxcbiAgICAgICAgaTE4blNlcnZpY2U6IEkxOG5TZXJ2aWNlLCBhcGlTZXJ2aWNlOiBBcGlTZXJ2aWNlLCBsb2dTZXJ2aWNlOiBMb2dTZXJ2aWNlKSB7XG4gICAgICAgIHN1cGVyKHJvdXRlciwgaTE4blNlcnZpY2UsIGFwaVNlcnZpY2UsIHBsYXRmb3JtVXRpbHNTZXJ2aWNlLCBsb2dTZXJ2aWNlKTtcbiAgICB9XG59XG4iLCI8Zm9ybSAjZm9ybSAobmdTdWJtaXQpPVwic3VibWl0KClcIiBbYXBwQXBpQWN0aW9uXT1cImZvcm1Qcm9taXNlXCI+XG4gICAgPGhlYWRlcj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImxlZnRcIj5cbiAgICAgICAgICAgIDxhIHJvdXRlckxpbms9XCIvbG9naW5cIj57eydjYW5jZWwnIHwgaTE4bn19PC9hPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNlbnRlclwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0aXRsZVwiPnt7J3Bhc3N3b3JkSGludCcgfCBpMThufX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwicmlnaHRcIj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cInN1Ym1pdFwiIGFwcEJsdXJDbGljayBbZGlzYWJsZWRdPVwiZm9ybS5sb2FkaW5nXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gW2hpZGRlbl09XCJmb3JtLmxvYWRpbmdcIj57eydzdWJtaXQnIHwgaTE4bn19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtc3Bpbm5lciBmYS1sZyBmYS1zcGluXCIgW2hpZGRlbl09XCIhZm9ybS5sb2FkaW5nXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvaGVhZGVyPlxuICAgIDxjb250ZW50PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYm94XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWNvbnRlbnQtcm93XCIgYXBwQm94Um93PlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiZW1haWxcIj57eydlbWFpbEFkZHJlc3MnIHwgaTE4bn19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPVwiZW1haWxcIiB0eXBlPVwidGV4dFwiIG5hbWU9XCJFbWFpbFwiIFsobmdNb2RlbCldPVwiZW1haWxcIiByZXF1aXJlZCBhcHBBdXRvZm9jdXNcbiAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0bW9kZT1cImVtYWlsXCIgYXBwSW5wdXRWZXJiYXRpbT1cImZhbHNlXCI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtZm9vdGVyXCI+XG4gICAgICAgICAgICAgICAge3snZW50ZXJFbWFpbFRvR2V0SGludCcgfCBpMThufX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2NvbnRlbnQ+XG48L2Zvcm0+XG4iLCJpbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgQ29uc3RhbnRzU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9zZXJ2aWNlcy9jb25zdGFudHMuc2VydmljZSc7XG5cbmltcG9ydCB7IENyeXB0b0Z1bmN0aW9uU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvY3J5cHRvRnVuY3Rpb24uc2VydmljZSc7XG5pbXBvcnQgeyBFbnZpcm9ubWVudFNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL2Vudmlyb25tZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgUGFzc3dvcmRHZW5lcmF0aW9uU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvcGFzc3dvcmRHZW5lcmF0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgUGxhdGZvcm1VdGlsc1NlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL3BsYXRmb3JtVXRpbHMuc2VydmljZSc7XG5pbXBvcnQgeyBTdG9yYWdlU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvc3RvcmFnZS5zZXJ2aWNlJztcblxuaW1wb3J0IHsgVXRpbHMgfSBmcm9tICdqc2xpYi1jb21tb24vbWlzYy91dGlscyc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnYXBwLWhvbWUnLFxuICAgIHRlbXBsYXRlVXJsOiAnaG9tZS5jb21wb25lbnQuaHRtbCcsXG59KVxuZXhwb3J0IGNsYXNzIEhvbWVDb21wb25lbnQge1xuICAgIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBwbGF0Zm9ybVV0aWxzU2VydmljZTogUGxhdGZvcm1VdGlsc1NlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgcGFzc3dvcmRHZW5lcmF0aW9uU2VydmljZTogUGFzc3dvcmRHZW5lcmF0aW9uU2VydmljZSwgcHJpdmF0ZSBzdG9yYWdlU2VydmljZTogU3RvcmFnZVNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgY3J5cHRvRnVuY3Rpb25TZXJ2aWNlOiBDcnlwdG9GdW5jdGlvblNlcnZpY2UsIHByaXZhdGUgZW52aXJvbm1lbnRTZXJ2aWNlOiBFbnZpcm9ubWVudFNlcnZpY2UpIHsgfVxuXG4gICAgYXN5bmMgbGF1bmNoU3NvQnJvd3NlcigpIHtcbiAgICAgICAgLy8gR2VuZXJhdGUgbmVjZXNzYXJ5IHNzbyBwYXJhbXNcbiAgICAgICAgY29uc3QgcGFzc3dvcmRPcHRpb25zOiBhbnkgPSB7XG4gICAgICAgICAgICB0eXBlOiAncGFzc3dvcmQnLFxuICAgICAgICAgICAgbGVuZ3RoOiA2NCxcbiAgICAgICAgICAgIHVwcGVyY2FzZTogdHJ1ZSxcbiAgICAgICAgICAgIGxvd2VyY2FzZTogdHJ1ZSxcbiAgICAgICAgICAgIG51bWJlcnM6IHRydWUsXG4gICAgICAgICAgICBzcGVjaWFsOiBmYWxzZSxcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBzdGF0ZSA9IChhd2FpdCB0aGlzLnBhc3N3b3JkR2VuZXJhdGlvblNlcnZpY2UuZ2VuZXJhdGVQYXNzd29yZChwYXNzd29yZE9wdGlvbnMpKSArICc6Y2xpZW50SWQ9YnJvd3Nlcic7XG4gICAgICAgIGNvbnN0IGNvZGVWZXJpZmllciA9IGF3YWl0IHRoaXMucGFzc3dvcmRHZW5lcmF0aW9uU2VydmljZS5nZW5lcmF0ZVBhc3N3b3JkKHBhc3N3b3JkT3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGNvZGVWZXJpZmllckhhc2ggPSBhd2FpdCB0aGlzLmNyeXB0b0Z1bmN0aW9uU2VydmljZS5oYXNoKGNvZGVWZXJpZmllciwgJ3NoYTI1NicpO1xuICAgICAgICBjb25zdCBjb2RlQ2hhbGxlbmdlID0gVXRpbHMuZnJvbUJ1ZmZlclRvVXJsQjY0KGNvZGVWZXJpZmllckhhc2gpO1xuXG4gICAgICAgIGF3YWl0IHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2F2ZShDb25zdGFudHNTZXJ2aWNlLnNzb0NvZGVWZXJpZmllcktleSwgY29kZVZlcmlmaWVyKTtcbiAgICAgICAgYXdhaXQgdGhpcy5zdG9yYWdlU2VydmljZS5zYXZlKENvbnN0YW50c1NlcnZpY2Uuc3NvU3RhdGVLZXksIHN0YXRlKTtcblxuICAgICAgICBsZXQgdXJsID0gdGhpcy5lbnZpcm9ubWVudFNlcnZpY2UuZ2V0V2ViVmF1bHRVcmwoKTtcbiAgICAgICAgaWYgKHVybCA9PSBudWxsKSB7XG4gICAgICAgICAgICB1cmwgPSAnaHR0cHM6Ly92YXVsdC5iaXR3YXJkZW4uY29tJztcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlZGlyZWN0VXJpID0gdXJsICsgJy9zc28tY29ubmVjdG9yLmh0bWwnO1xuXG4gICAgICAgIC8vIExhdW5jaCBicm93c2VyXG4gICAgICAgIHRoaXMucGxhdGZvcm1VdGlsc1NlcnZpY2UubGF1bmNoVXJpKHVybCArICcvIy9zc28/Y2xpZW50SWQ9YnJvd3NlcicgK1xuICAgICAgICAgICAgJyZyZWRpcmVjdFVyaT0nICsgZW5jb2RlVVJJQ29tcG9uZW50KHJlZGlyZWN0VXJpKSArXG4gICAgICAgICAgICAnJnN0YXRlPScgKyBzdGF0ZSArICcmY29kZUNoYWxsZW5nZT0nICsgY29kZUNoYWxsZW5nZSk7XG4gICAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImNlbnRlci1jb250ZW50XCI+XG4gICAgPGRpdiBjbGFzcz1cImNvbnRlbnRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImxvZ28taW1hZ2VcIj48L2Rpdj5cbiAgICAgICAgPHAgY2xhc3M9XCJsZWFkIHRleHQtY2VudGVyXCI+e3snbG9naW5PckNyZWF0ZU5ld0FjY291bnQnIHwgaTE4bn19PC9wPlxuICAgICAgICA8YSBjbGFzcz1cImJ0biBwcmltYXJ5IGJsb2NrXCIgcm91dGVyTGluaz1cIi9sb2dpblwiPjxiPnt7J2xvZ2luJyB8IGkxOG59fTwvYj48L2E+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJsYXVuY2hTc29Ccm93c2VyKClcIiBjbGFzcz1cImJ0biBibG9ja1wiPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1iYW5rXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPiB7eydlbnRlcnByaXNlU2luZ2xlU2lnbk9uJyB8IGkxOG59fVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGEgY2xhc3M9XCJidG4gYmxvY2tcIiByb3V0ZXJMaW5rPVwiL3JlZ2lzdGVyXCI+e3snY3JlYXRlQWNjb3VudCcgfCBpMThufX08L2E+XG4gICAgPC9kaXY+XG48L2Rpdj5cbjxhIHJvdXRlckxpbms9XCIvZW52aXJvbm1lbnRcIiBjbGFzcz1cInNldHRpbmdzLWljb25cIj5cbiAgICA8aSBjbGFzcz1cImZhIGZhLWNvZyBmYS1sZ1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT48c3Bhbj4mbmJzcDt7eydzZXR0aW5ncycgfCBpMThufX08L3NwYW4+XG48L2E+XG4iLCJpbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgU3dhbCBmcm9tICdzd2VldGFsZXJ0Mic7XG5cbmltcG9ydCB7IENvbnN0YW50c1NlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vc2VydmljZXMvY29uc3RhbnRzLnNlcnZpY2UnO1xuXG5pbXBvcnQgeyBBcGlTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9hcGkuc2VydmljZSc7XG5pbXBvcnQgeyBDcnlwdG9TZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9jcnlwdG8uc2VydmljZSc7XG5pbXBvcnQgeyBFbnZpcm9ubWVudFNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL2Vudmlyb25tZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgSTE4blNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL2kxOG4uc2VydmljZSc7XG5pbXBvcnQgeyBMb2dTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9sb2cuc2VydmljZSc7XG5pbXBvcnQgeyBNZXNzYWdpbmdTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9tZXNzYWdpbmcuc2VydmljZSc7XG5pbXBvcnQgeyBQbGF0Zm9ybVV0aWxzU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvcGxhdGZvcm1VdGlscy5zZXJ2aWNlJztcbmltcG9ydCB7IFN0YXRlU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvc3RhdGUuc2VydmljZSc7XG5pbXBvcnQgeyBTdG9yYWdlU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvc3RvcmFnZS5zZXJ2aWNlJztcbmltcG9ydCB7IFVzZXJTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy91c2VyLnNlcnZpY2UnO1xuaW1wb3J0IHsgVmF1bHRUaW1lb3V0U2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvdmF1bHRUaW1lb3V0LnNlcnZpY2UnO1xuXG5pbXBvcnQgeyBMb2NrQ29tcG9uZW50IGFzIEJhc2VMb2NrQ29tcG9uZW50IH0gZnJvbSAnanNsaWItYW5ndWxhci9jb21wb25lbnRzL2xvY2suY29tcG9uZW50JztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdhcHAtbG9jaycsXG4gICAgdGVtcGxhdGVVcmw6ICdsb2NrLmNvbXBvbmVudC5odG1sJyxcbn0pXG5leHBvcnQgY2xhc3MgTG9ja0NvbXBvbmVudCBleHRlbmRzIEJhc2VMb2NrQ29tcG9uZW50IHtcbiAgICBwcml2YXRlIGlzSW5pdGlhbExvY2tTY3JlZW46IGJvb2xlYW47XG5cbiAgICBjb25zdHJ1Y3Rvcihyb3V0ZXI6IFJvdXRlciwgaTE4blNlcnZpY2U6IEkxOG5TZXJ2aWNlLFxuICAgICAgICBwbGF0Zm9ybVV0aWxzU2VydmljZTogUGxhdGZvcm1VdGlsc1NlcnZpY2UsIG1lc3NhZ2luZ1NlcnZpY2U6IE1lc3NhZ2luZ1NlcnZpY2UsXG4gICAgICAgIHVzZXJTZXJ2aWNlOiBVc2VyU2VydmljZSwgY3J5cHRvU2VydmljZTogQ3J5cHRvU2VydmljZSxcbiAgICAgICAgc3RvcmFnZVNlcnZpY2U6IFN0b3JhZ2VTZXJ2aWNlLCB2YXVsdFRpbWVvdXRTZXJ2aWNlOiBWYXVsdFRpbWVvdXRTZXJ2aWNlLFxuICAgICAgICBlbnZpcm9ubWVudFNlcnZpY2U6IEVudmlyb25tZW50U2VydmljZSwgc3RhdGVTZXJ2aWNlOiBTdGF0ZVNlcnZpY2UsXG4gICAgICAgIGFwaVNlcnZpY2U6IEFwaVNlcnZpY2UsIGxvZ1NlcnZpY2U6IExvZ1NlcnZpY2UpIHtcbiAgICAgICAgc3VwZXIocm91dGVyLCBpMThuU2VydmljZSwgcGxhdGZvcm1VdGlsc1NlcnZpY2UsIG1lc3NhZ2luZ1NlcnZpY2UsIHVzZXJTZXJ2aWNlLCBjcnlwdG9TZXJ2aWNlLFxuICAgICAgICAgICAgc3RvcmFnZVNlcnZpY2UsIHZhdWx0VGltZW91dFNlcnZpY2UsIGVudmlyb25tZW50U2VydmljZSwgc3RhdGVTZXJ2aWNlLCBhcGlTZXJ2aWNlLCBsb2dTZXJ2aWNlKTtcbiAgICAgICAgdGhpcy5zdWNjZXNzUm91dGUgPSAnL3RhYnMvY3VycmVudCc7XG4gICAgICAgIHRoaXMuaXNJbml0aWFsTG9ja1NjcmVlbiA9ICh3aW5kb3cgYXMgYW55KS5wcmV2aW91c1BvcHVwVXJsID09IG51bGw7XG4gICAgfVxuXG4gICAgYXN5bmMgbmdPbkluaXQoKSB7XG4gICAgICAgIGF3YWl0IHN1cGVyLm5nT25Jbml0KCk7XG4gICAgICAgIGNvbnN0IGRpc2FibGVBdXRvQmlvbWV0cmljc1Byb21wdCA9IGF3YWl0IHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0PGJvb2xlYW4+KFxuICAgICAgICAgICAgQ29uc3RhbnRzU2VydmljZS5kaXNhYmxlQXV0b0Jpb21ldHJpY3NQcm9tcHRLZXkpID8/IHRydWU7XG5cbiAgICAgICAgd2luZG93LnNldFRpbWVvdXQoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5waW5Mb2NrID8gJ3BpbicgOiAnbWFzdGVyUGFzc3dvcmQnKS5mb2N1cygpO1xuICAgICAgICAgICAgaWYgKHRoaXMuYmlvbWV0cmljTG9jayAmJiAhZGlzYWJsZUF1dG9CaW9tZXRyaWNzUHJvbXB0ICYmIHRoaXMuaXNJbml0aWFsTG9ja1NjcmVlbikge1xuICAgICAgICAgICAgICAgIGlmIChhd2FpdCB0aGlzLnZhdWx0VGltZW91dFNlcnZpY2UuaXNMb2NrZWQoKSkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnVubG9ja0Jpb21ldHJpYygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgMTAwKTtcbiAgICB9XG5cbiAgICBhc3luYyB1bmxvY2tCaW9tZXRyaWMoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGlmICghdGhpcy5iaW9tZXRyaWNMb2NrKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgZGl2LmlubmVySFRNTCA9IGA8ZGl2IGNsYXNzPVwic3dhbDItdGV4dFwiPiR7dGhpcy5pMThuU2VydmljZS50KCdhd2FpdERlc2t0b3AnKX08L2Rpdj5gO1xuXG4gICAgICAgIFN3YWwuZmlyZSh7XG4gICAgICAgICAgICBoZWlnaHRBdXRvOiBmYWxzZSxcbiAgICAgICAgICAgIGJ1dHRvbnNTdHlsaW5nOiBmYWxzZSxcbiAgICAgICAgICAgIGh0bWw6IGRpdixcbiAgICAgICAgICAgIHNob3dDYW5jZWxCdXR0b246IHRydWUsXG4gICAgICAgICAgICBjYW5jZWxCdXR0b25UZXh0OiB0aGlzLmkxOG5TZXJ2aWNlLnQoJ2NhbmNlbCcpLFxuICAgICAgICAgICAgc2hvd0NvbmZpcm1CdXR0b246IGZhbHNlLFxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBzdWNjZXNzID0gYXdhaXQgc3VwZXIudW5sb2NrQmlvbWV0cmljKCk7XG5cbiAgICAgICAgLy8gQXZvaWQgY2xvc2luZyB0aGUgZXJyb3IgZGlhbG9nc1xuICAgICAgICBpZiAoc3VjY2Vzcykge1xuICAgICAgICAgICAgU3dhbC5jbG9zZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7XG4gICAgfVxufVxuIiwiPGZvcm0gKG5nU3VibWl0KT1cInN1Ym1pdCgpXCI+XG4gICAgPGhlYWRlcj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImxlZnRcIj48L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNlbnRlclwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0aXRsZVwiPnt7KHBpbkxvY2sgPyAndmVyaWZ5UGluJyA6ICd2ZXJpZnlNYXN0ZXJQYXNzd29yZCcpIHwgaTE4bn19PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJpZ2h0XCI+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJzdWJtaXRcIiBhcHBCbHVyQ2xpY2s+e3sndW5sb2NrJyB8IGkxOG59fTwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2hlYWRlcj5cbiAgICA8Y29udGVudD5cbiAgICAgICAgPGRpdiBjbGFzcz1cImJveFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50LXJvdyBib3gtY29udGVudC1yb3ctZmxleFwiIGFwcEJveFJvdz5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdy1tYWluXCIgKm5nSWY9XCJwaW5Mb2NrXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwicGluXCI+e3sncGluJyB8IGkxOG59fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9XCJwaW5cIiB0eXBlPVwie3tzaG93UGFzc3dvcmQgPyAndGV4dCcgOiAncGFzc3dvcmQnfX1cIiBuYW1lPVwiUElOXCIgY2xhc3M9XCJtb25vc3BhY2VkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInBpblwiIHJlcXVpcmVkIGFwcElucHV0VmVyYmF0aW0+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93LW1haW5cIiAqbmdJZj1cIiFwaW5Mb2NrXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwibWFzdGVyUGFzc3dvcmRcIj57eydtYXN0ZXJQYXNzJyB8IGkxOG59fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9XCJtYXN0ZXJQYXNzd29yZFwiIHR5cGU9XCJ7e3Nob3dQYXNzd29yZCA/ICd0ZXh0JyA6ICdwYXNzd29yZCd9fVwiIG5hbWU9XCJNYXN0ZXJQYXNzd29yZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtb25vc3BhY2VkXCIgWyhuZ01vZGVsKV09XCJtYXN0ZXJQYXNzd29yZFwiIHJlcXVpcmVkIGFwcElucHV0VmVyYmF0aW0+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWN0aW9uLWJ1dHRvbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwicm93LWJ0blwiIGFwcFN0b3BDbGljayBhcHBCbHVyQ2xpY2tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBBMTF5VGl0bGU9XCJ7eyd0b2dnbGVWaXNpYmlsaXR5JyB8IGkxOG59fVwiIChjbGljayk9XCJ0b2dnbGVQYXNzd29yZCgpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1sZ1wiIFtuZ0NsYXNzXT1cInsnZmEtZXllJzogIXNob3dQYXNzd29yZCwgJ2ZhLWV5ZS1zbGFzaCc6IHNob3dQYXNzd29yZH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtZm9vdGVyXCI+XG4gICAgICAgICAgICAgICAgPHA+e3socGluTG9jayA/ICd5b3VyVmF1bHRJc0xvY2tlZFBpbkNvZGUnIDogJ3lvdXJWYXVsdElzTG9ja2VkJykgfCBpMThufX08L3A+XG4gICAgICAgICAgICAgICAge3snbG9nZ2VkSW5Bc09uJyB8IGkxOG4gOiBlbWFpbCA6IHdlYlZhdWx0SG9zdG5hbWV9fVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYm94XCIgKm5nSWY9XCJiaW9tZXRyaWNMb2NrXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWZvb3RlclwiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIHByaW1hcnkgYmxvY2tcIiAoY2xpY2spPVwidW5sb2NrQmlvbWV0cmljKClcIiBhcHBTdG9wQ2xpY2s+e3sndW5sb2NrV2l0aEJpb21ldHJpY3MnIHwgaTE4bn19PC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxwIGNsYXNzPVwidGV4dC1jZW50ZXJcIj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGFwcFN0b3BDbGljayAoY2xpY2spPVwibG9nT3V0KClcIj57eydsb2dPdXQnIHwgaTE4bn19PC9idXR0b24+XG4gICAgICAgIDwvcD5cbiAgICA8L2NvbnRlbnQ+XG48L2Zvcm0+XG4iLCJpbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5cbmltcG9ydCB7IEF1dGhTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9hdXRoLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ3J5cHRvRnVuY3Rpb25TZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9jcnlwdG9GdW5jdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IEVudmlyb25tZW50U2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvZW52aXJvbm1lbnQuc2VydmljZSc7XG5pbXBvcnQgeyBJMThuU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvaTE4bi5zZXJ2aWNlJztcbmltcG9ydCB7IExvZ1NlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL2xvZy5zZXJ2aWNlJztcbmltcG9ydCB7IFBhc3N3b3JkR2VuZXJhdGlvblNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL3Bhc3N3b3JkR2VuZXJhdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IFBsYXRmb3JtVXRpbHNTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9wbGF0Zm9ybVV0aWxzLnNlcnZpY2UnO1xuaW1wb3J0IHsgU3RhdGVTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9zdGF0ZS5zZXJ2aWNlJztcbmltcG9ydCB7IFN0b3JhZ2VTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9zdG9yYWdlLnNlcnZpY2UnO1xuaW1wb3J0IHsgU3luY1NlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL3N5bmMuc2VydmljZSc7XG5cbmltcG9ydCB7IExvZ2luQ29tcG9uZW50IGFzIEJhc2VMb2dpbkNvbXBvbmVudCB9IGZyb20gJ2pzbGliLWFuZ3VsYXIvY29tcG9uZW50cy9sb2dpbi5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2FwcC1sb2dpbicsXG4gICAgdGVtcGxhdGVVcmw6ICdsb2dpbi5jb21wb25lbnQuaHRtbCcsXG59KVxuZXhwb3J0IGNsYXNzIExvZ2luQ29tcG9uZW50IGV4dGVuZHMgQmFzZUxvZ2luQ29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3RvcihhdXRoU2VydmljZTogQXV0aFNlcnZpY2UsIHJvdXRlcjogUm91dGVyLFxuICAgICAgICBwcm90ZWN0ZWQgcGxhdGZvcm1VdGlsc1NlcnZpY2U6IFBsYXRmb3JtVXRpbHNTZXJ2aWNlLCBwcm90ZWN0ZWQgaTE4blNlcnZpY2U6IEkxOG5TZXJ2aWNlLFxuICAgICAgICBwcm90ZWN0ZWQgc3RhdGVTZXJ2aWNlOiBTdGF0ZVNlcnZpY2UsIHByb3RlY3RlZCBlbnZpcm9ubWVudFNlcnZpY2U6IEVudmlyb25tZW50U2VydmljZSxcbiAgICAgICAgcHJvdGVjdGVkIHBhc3N3b3JkR2VuZXJhdGlvblNlcnZpY2U6IFBhc3N3b3JkR2VuZXJhdGlvblNlcnZpY2UsXG4gICAgICAgIHByb3RlY3RlZCBjcnlwdG9GdW5jdGlvblNlcnZpY2U6IENyeXB0b0Z1bmN0aW9uU2VydmljZSwgc3RvcmFnZVNlcnZpY2U6IFN0b3JhZ2VTZXJ2aWNlLFxuICAgICAgICBzeW5jU2VydmljZTogU3luY1NlcnZpY2UsIGxvZ1NlcnZpY2U6IExvZ1NlcnZpY2UpIHtcbiAgICAgICAgc3VwZXIoYXV0aFNlcnZpY2UsIHJvdXRlciwgcGxhdGZvcm1VdGlsc1NlcnZpY2UsIGkxOG5TZXJ2aWNlLCBzdGF0ZVNlcnZpY2UsIGVudmlyb25tZW50U2VydmljZSxcbiAgICAgICAgICAgIHBhc3N3b3JkR2VuZXJhdGlvblNlcnZpY2UsIGNyeXB0b0Z1bmN0aW9uU2VydmljZSwgc3RvcmFnZVNlcnZpY2UsIGxvZ1NlcnZpY2UpO1xuICAgICAgICBzdXBlci5vblN1Y2Nlc3NmdWxMb2dpbiA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGF3YWl0IHN5bmNTZXJ2aWNlLmZ1bGxTeW5jKHRydWUpO1xuICAgICAgICB9O1xuICAgICAgICBzdXBlci5zdWNjZXNzUm91dGUgPSAnL3RhYnMvdmF1bHQnO1xuICAgIH1cblxuICAgIHNldHRpbmdzKCkge1xuICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJ2Vudmlyb25tZW50J10pO1xuICAgIH1cbn1cbiIsIjxmb3JtICNmb3JtIChuZ1N1Ym1pdCk9XCJzdWJtaXQoKVwiIFthcHBBcGlBY3Rpb25dPVwiZm9ybVByb21pc2VcIj5cbiAgICA8aGVhZGVyPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibGVmdFwiPlxuICAgICAgICAgICAgPGEgcm91dGVyTGluaz1cIi9ob21lXCI+e3snY2FuY2VsJyB8IGkxOG59fTwvYT5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjZW50ZXJcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGl0bGVcIj57eydhcHBOYW1lJyB8IGkxOG59fTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJyaWdodFwiPlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwic3VibWl0XCIgYXBwQmx1ckNsaWNrIFtkaXNhYmxlZF09XCJmb3JtLmxvYWRpbmdcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBbaGlkZGVuXT1cImZvcm0ubG9hZGluZ1wiPnt7J2xvZ2luJyB8IGkxOG59fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXNwaW5uZXIgZmEtbGcgZmEtc3BpblwiIFtoaWRkZW5dPVwiIWZvcm0ubG9hZGluZ1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2hlYWRlcj5cbiAgICA8Y29udGVudD5cbiAgICAgICAgPGRpdiBjbGFzcz1cImJveFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50LXJvd1wiIGFwcEJveFJvdz5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImVtYWlsXCI+e3snZW1haWxBZGRyZXNzJyB8IGkxOG59fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD1cImVtYWlsXCIgdHlwZT1cInRleHRcIiBuYW1lPVwiRW1haWxcIiBbKG5nTW9kZWwpXT1cImVtYWlsXCIgcmVxdWlyZWQgaW5wdXRtb2RlPVwiZW1haWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgYXBwSW5wdXRWZXJiYXRpbT1cImZhbHNlXCI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50LXJvdyBib3gtY29udGVudC1yb3ctZmxleFwiIGFwcEJveFJvdz5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdy1tYWluXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwibWFzdGVyUGFzc3dvcmRcIj57eydtYXN0ZXJQYXNzJyB8IGkxOG59fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9XCJtYXN0ZXJQYXNzd29yZFwiIHR5cGU9XCJ7e3Nob3dQYXNzd29yZCA/ICd0ZXh0JyA6ICdwYXNzd29yZCd9fVwiIG5hbWU9XCJNYXN0ZXJQYXNzd29yZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtb25vc3BhY2VkXCIgWyhuZ01vZGVsKV09XCJtYXN0ZXJQYXNzd29yZFwiIHJlcXVpcmVkIGFwcElucHV0VmVyYmF0aW0+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWN0aW9uLWJ1dHRvbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwicm93LWJ0blwiIGFwcFN0b3BDbGljayBhcHBCbHVyQ2xpY2tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBBMTF5VGl0bGU9XCJ7eyd0b2dnbGVWaXNpYmlsaXR5JyB8IGkxOG59fVwiIChjbGljayk9XCJ0b2dnbGVQYXNzd29yZCgpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1sZ1wiIFtuZ0NsYXNzXT1cInsnZmEtZXllJzogIXNob3dQYXNzd29yZCwgJ2ZhLWV5ZS1zbGFzaCc6IHNob3dQYXNzd29yZH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50LXJvd1wiIFtoaWRkZW5dPVwiIXNob3dDYXB0Y2hhKClcIj5cbiAgICAgICAgICAgICAgICAgICAgPGlmcmFtZSBpZD1cImhjYXB0Y2hhX2lmcmFtZVwiIGhlaWdodD1cIjgwXCI+PC9pZnJhbWU+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxwIGNsYXNzPVwidGV4dC1jZW50ZXJcIj5cbiAgICAgICAgICAgIDxhIHJvdXRlckxpbms9XCIvaGludFwiPnt7J2dldE1hc3RlclBhc3N3b3JkSGludCcgfCBpMThufX08L2E+XG4gICAgICAgIDwvcD5cbiAgICA8L2NvbnRlbnQ+XG48L2Zvcm0+XG4iLCJpbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5cbmltcG9ydCB7IEFwaVNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL2FwaS5zZXJ2aWNlJztcbmltcG9ydCB7IEF1dGhTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9hdXRoLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ3J5cHRvU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvY3J5cHRvLnNlcnZpY2UnO1xuaW1wb3J0IHsgRW52aXJvbm1lbnRTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9lbnZpcm9ubWVudC5zZXJ2aWNlJztcbmltcG9ydCB7IEkxOG5TZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9pMThuLnNlcnZpY2UnO1xuaW1wb3J0IHsgUGFzc3dvcmRHZW5lcmF0aW9uU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvcGFzc3dvcmRHZW5lcmF0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgUGxhdGZvcm1VdGlsc1NlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL3BsYXRmb3JtVXRpbHMuc2VydmljZSc7XG5pbXBvcnQgeyBTdGF0ZVNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL3N0YXRlLnNlcnZpY2UnO1xuXG5pbXBvcnQgeyBSZWdpc3RlckNvbXBvbmVudCBhcyBCYXNlUmVnaXN0ZXJDb21wb25lbnQgfSBmcm9tICdqc2xpYi1hbmd1bGFyL2NvbXBvbmVudHMvcmVnaXN0ZXIuY29tcG9uZW50JztcbmltcG9ydCB7IExvZ1NlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL2xvZy5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdhcHAtcmVnaXN0ZXInLFxuICAgIHRlbXBsYXRlVXJsOiAncmVnaXN0ZXIuY29tcG9uZW50Lmh0bWwnLFxufSlcbmV4cG9ydCBjbGFzcyBSZWdpc3RlckNvbXBvbmVudCBleHRlbmRzIEJhc2VSZWdpc3RlckNvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IoYXV0aFNlcnZpY2U6IEF1dGhTZXJ2aWNlLCByb3V0ZXI6IFJvdXRlcixcbiAgICAgICAgaTE4blNlcnZpY2U6IEkxOG5TZXJ2aWNlLCBjcnlwdG9TZXJ2aWNlOiBDcnlwdG9TZXJ2aWNlLFxuICAgICAgICBhcGlTZXJ2aWNlOiBBcGlTZXJ2aWNlLCBzdGF0ZVNlcnZpY2U6IFN0YXRlU2VydmljZSwgcGxhdGZvcm1VdGlsc1NlcnZpY2U6IFBsYXRmb3JtVXRpbHNTZXJ2aWNlLFxuICAgICAgICBwYXNzd29yZEdlbmVyYXRpb25TZXJ2aWNlOiBQYXNzd29yZEdlbmVyYXRpb25TZXJ2aWNlLCBlbnZpcm9ubWVudFNlcnZpY2U6IEVudmlyb25tZW50U2VydmljZSxcbiAgICAgICAgbG9nU2VydmljZTogTG9nU2VydmljZSkge1xuICAgICAgICBzdXBlcihhdXRoU2VydmljZSwgcm91dGVyLCBpMThuU2VydmljZSwgY3J5cHRvU2VydmljZSwgYXBpU2VydmljZSwgc3RhdGVTZXJ2aWNlLCBwbGF0Zm9ybVV0aWxzU2VydmljZSxcbiAgICAgICAgICAgIHBhc3N3b3JkR2VuZXJhdGlvblNlcnZpY2UsIGVudmlyb25tZW50U2VydmljZSwgbG9nU2VydmljZSk7XG4gICAgfVxufVxuIiwiPGZvcm0gI2Zvcm0gKG5nU3VibWl0KT1cInN1Ym1pdCgpXCIgW2FwcEFwaUFjdGlvbl09XCJmb3JtUHJvbWlzZVwiPlxuICAgIDxoZWFkZXI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJsZWZ0XCI+XG4gICAgICAgICAgICA8YSByb3V0ZXJMaW5rPVwiL2hvbWVcIj57eydjYW5jZWwnIHwgaTE4bn19PC9hPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNlbnRlclwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0aXRsZVwiPnt7J2NyZWF0ZUFjY291bnQnIHwgaTE4bn19PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJpZ2h0XCI+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJzdWJtaXRcIiBhcHBCbHVyQ2xpY2sgW2Rpc2FibGVkXT1cImZvcm0ubG9hZGluZ1wiPlxuICAgICAgICAgICAgICAgIDxzcGFuIFtoaWRkZW5dPVwiZm9ybS5sb2FkaW5nXCI+e3snc3VibWl0JyB8IGkxOG59fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXNwaW5uZXIgZmEtbGcgZmEtc3BpblwiIFtoaWRkZW5dPVwiIWZvcm0ubG9hZGluZ1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2hlYWRlcj5cbiAgICA8Y29udGVudD5cbiAgICAgICAgPGRpdiBjbGFzcz1cImJveFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50LXJvd1wiIGFwcEJveFJvdz5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImVtYWlsXCI+e3snZW1haWxBZGRyZXNzJyB8IGkxOG59fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD1cImVtYWlsXCIgdHlwZT1cInRleHRcIiBuYW1lPVwiRW1haWxcIiBbKG5nTW9kZWwpXT1cImVtYWlsXCIgcmVxdWlyZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIFthcHBBdXRvZm9jdXNdPVwiZW1haWwgPT09ICcnXCIgaW5wdXRtb2RlPVwiZW1haWxcIiBhcHBJbnB1dFZlcmJhdGltPVwiZmFsc2VcIj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWNvbnRlbnQtcm93XCIgYXBwQm94Um93PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWNvbnRlbnQtcm93LWZsZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3ctbWFpblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJtYXN0ZXJQYXNzd29yZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eydtYXN0ZXJQYXNzJyB8IGkxOG59fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Ryb25nIGNsYXNzPVwic3ViLWxhYmVsIHRleHQte3ttYXN0ZXJQYXNzd29yZFNjb3JlQ29sb3J9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIm1hc3RlclBhc3N3b3JkU2NvcmVUZXh0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e21hc3RlclBhc3N3b3JkU2NvcmVUZXh0fX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdHJvbmc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9XCJtYXN0ZXJQYXNzd29yZFwiIHR5cGU9XCJ7e3Nob3dQYXNzd29yZCA/ICd0ZXh0JyA6ICdwYXNzd29yZCd9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJNYXN0ZXJQYXNzd29yZFwiIGNsYXNzPVwibW9ub3NwYWNlZFwiIFsobmdNb2RlbCldPVwibWFzdGVyUGFzc3dvcmRcIiByZXF1aXJlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXBwQXV0b2ZvY3VzXT1cImVtYWlsICE9PSAnJ1wiIGFwcElucHV0VmVyYmF0aW0gKGlucHV0KT1cInVwZGF0ZVBhc3N3b3JkU3RyZW5ndGgoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWN0aW9uLWJ1dHRvbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInJvdy1idG5cIiBhcHBTdG9wQ2xpY2sgYXBwQmx1ckNsaWNrXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcEExMXlUaXRsZT1cInt7J3RvZ2dsZVZpc2liaWxpdHknIHwgaTE4bn19XCIgKGNsaWNrKT1cInRvZ2dsZVBhc3N3b3JkKGZhbHNlKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWxnXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnZmEtZXllJzogIXNob3dQYXNzd29yZCwgJ2ZhLWV5ZS1zbGFzaCc6IHNob3dQYXNzd29yZH1cIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzLWJhciBiZy17e21hc3RlclBhc3N3b3JkU2NvcmVDb2xvcn19XCIgcm9sZT1cInByb2dyZXNzYmFyXCIgYXJpYS12YWx1ZW5vdz1cIjBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtdmFsdWVtaW49XCIwXCIgYXJpYS12YWx1ZW1heD1cIjEwMFwiIFtuZ1N0eWxlXT1cInt3aWR0aDogKG1hc3RlclBhc3N3b3JkU2NvcmVXaWR0aCArICclJyl9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyLmFyaWEtdmFsdWVub3c9XCJ7e21hc3RlclBhc3N3b3JkU2NvcmVXaWR0aH19XCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWZvb3RlclwiPlxuICAgICAgICAgICAgICAgIHt7J21hc3RlclBhc3NEZXNjJyB8IGkxOG59fVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYm94XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWNvbnRlbnQtcm93IGJveC1jb250ZW50LXJvdy1mbGV4XCIgYXBwQm94Um93PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93LW1haW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJtYXN0ZXJQYXNzd29yZFJldHlwZVwiPnt7J3JlVHlwZU1hc3RlclBhc3MnIHwgaTE4bn19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD1cIm1hc3RlclBhc3N3b3JkUmV0eXBlXCIgdHlwZT1cInt7c2hvd1Bhc3N3b3JkID8gJ3RleHQnIDogJ3Bhc3N3b3JkJ319XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPVwiTWFzdGVyUGFzc3dvcmRSZXR5cGVcIiBjbGFzcz1cIm1vbm9zcGFjZWRcIiBbKG5nTW9kZWwpXT1cImNvbmZpcm1NYXN0ZXJQYXNzd29yZFwiIHJlcXVpcmVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwSW5wdXRWZXJiYXRpbT5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhY3Rpb24tYnV0dG9uc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJyb3ctYnRuXCIgYXBwU3RvcENsaWNrIGFwcEJsdXJDbGlja1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcEExMXlUaXRsZT1cInt7J3RvZ2dsZVZpc2liaWxpdHknIHwgaTE4bn19XCIgKGNsaWNrKT1cInRvZ2dsZVBhc3N3b3JkKHRydWUpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1sZ1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnZmEtZXllJzogIXNob3dQYXNzd29yZCwgJ2ZhLWV5ZS1zbGFzaCc6IHNob3dQYXNzd29yZH1cIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50LXJvd1wiIGFwcEJveFJvdz5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImhpbnRcIj57eydtYXN0ZXJQYXNzSGludCcgfCBpMThufX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9XCJoaW50XCIgdHlwZT1cInRleHRcIiBuYW1lPVwiSGludFwiIFsobmdNb2RlbCldPVwiaGludFwiPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWZvb3RlclwiPlxuICAgICAgICAgICAgICAgIHt7J21hc3RlclBhc3NIaW50RGVzYycgfCBpMThufX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBbaGlkZGVuXT1cIiFzaG93Q2FwdGNoYSgpXCI+PGlmcmFtZSBpZD1cImhjYXB0Y2hhX2lmcmFtZVwiIGhlaWdodD1cIjgwXCI+PC9pZnJhbWU+PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJib3ggbGFzdFwiICpuZ0lmPVwic2hvd1Rlcm1zXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWNvbnRlbnQtcm93IGJveC1jb250ZW50LXJvdy1jaGVja2JveCBib3gtY29udGVudC1yb3ctY2hlY2tib3gtbGVmdCBib3gtY29udGVudC1yb3ctd29yZC1icmVha1wiXG4gICAgICAgICAgICAgICAgICAgIGFwcEJveFJvdz5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwiYWNjZXB0UG9saWNpZXNcIiBbKG5nTW9kZWwpXT1cImFjY2VwdFBvbGljaWVzXCIgbmFtZT1cIkFjY2VwdFBvbGljaWVzXCI+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJhY2NlcHRQb2xpY2llc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3snYWNjZXB0UG9saWNpZXMnIHwgaTE4bn19PGJyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj1cImh0dHBzOi8vYml0d2FyZGVuLmNvbS90ZXJtcy9cIiB0YXJnZXQ9XCJfYmxhbmtcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbD1cIm5vb3BlbmVyXCI+e3sndGVybXNPZlNlcnZpY2UnIHwgaTE4bn19PC9hPixcbiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9XCJodHRwczovL2JpdHdhcmRlbi5jb20vcHJpdmFjeS9cIiB0YXJnZXQ9XCJfYmxhbmtcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbD1cIm5vb3BlbmVyXCI+e3sncHJpdmFjeVBvbGljeScgfCBpMThufX08L2E+XG4gICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9jb250ZW50PlxuPC9mb3JtPlxuIiwiaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7XG4gICAgQWN0aXZhdGVkUm91dGUsXG4gICAgUm91dGVyLFxufSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuXG5pbXBvcnQgeyBBcGlTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9hcGkuc2VydmljZSc7XG5pbXBvcnQgeyBDcnlwdG9TZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9jcnlwdG8uc2VydmljZSc7XG5pbXBvcnQgeyBJMThuU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvaTE4bi5zZXJ2aWNlJztcbmltcG9ydCB7IE1lc3NhZ2luZ1NlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL21lc3NhZ2luZy5zZXJ2aWNlJztcbmltcG9ydCB7IFBhc3N3b3JkR2VuZXJhdGlvblNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL3Bhc3N3b3JkR2VuZXJhdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IFBsYXRmb3JtVXRpbHNTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9wbGF0Zm9ybVV0aWxzLnNlcnZpY2UnO1xuaW1wb3J0IHsgUG9saWN5U2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvcG9saWN5LnNlcnZpY2UnO1xuaW1wb3J0IHsgU3luY1NlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL3N5bmMuc2VydmljZSc7XG5pbXBvcnQgeyBVc2VyU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvdXNlci5zZXJ2aWNlJztcblxuaW1wb3J0IHtcbiAgICBTZXRQYXNzd29yZENvbXBvbmVudCBhcyBCYXNlU2V0UGFzc3dvcmRDb21wb25lbnQsXG59IGZyb20gJ2pzbGliLWFuZ3VsYXIvY29tcG9uZW50cy9zZXQtcGFzc3dvcmQuY29tcG9uZW50JztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdhcHAtc2V0LXBhc3N3b3JkJyxcbiAgICB0ZW1wbGF0ZVVybDogJ3NldC1wYXNzd29yZC5jb21wb25lbnQuaHRtbCcsXG59KVxuZXhwb3J0IGNsYXNzIFNldFBhc3N3b3JkQ29tcG9uZW50IGV4dGVuZHMgQmFzZVNldFBhc3N3b3JkQ29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3RvcihhcGlTZXJ2aWNlOiBBcGlTZXJ2aWNlLCBpMThuU2VydmljZTogSTE4blNlcnZpY2UsXG4gICAgICAgIGNyeXB0b1NlcnZpY2U6IENyeXB0b1NlcnZpY2UsIG1lc3NhZ2luZ1NlcnZpY2U6IE1lc3NhZ2luZ1NlcnZpY2UsXG4gICAgICAgIHVzZXJTZXJ2aWNlOiBVc2VyU2VydmljZSwgcGFzc3dvcmRHZW5lcmF0aW9uU2VydmljZTogUGFzc3dvcmRHZW5lcmF0aW9uU2VydmljZSxcbiAgICAgICAgcGxhdGZvcm1VdGlsc1NlcnZpY2U6IFBsYXRmb3JtVXRpbHNTZXJ2aWNlLCBwb2xpY3lTZXJ2aWNlOiBQb2xpY3lTZXJ2aWNlLCByb3V0ZXI6IFJvdXRlcixcbiAgICAgICAgc3luY1NlcnZpY2U6IFN5bmNTZXJ2aWNlLCByb3V0ZTogQWN0aXZhdGVkUm91dGUpIHtcbiAgICAgICAgc3VwZXIoaTE4blNlcnZpY2UsIGNyeXB0b1NlcnZpY2UsIG1lc3NhZ2luZ1NlcnZpY2UsIHVzZXJTZXJ2aWNlLCBwYXNzd29yZEdlbmVyYXRpb25TZXJ2aWNlLFxuICAgICAgICAgICAgcGxhdGZvcm1VdGlsc1NlcnZpY2UsIHBvbGljeVNlcnZpY2UsIHJvdXRlciwgYXBpU2VydmljZSwgc3luY1NlcnZpY2UsIHJvdXRlKTtcbiAgICB9XG5cbiAgICBnZXQgbWFzdGVyUGFzc3dvcmRTY29yZVdpZHRoKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tYXN0ZXJQYXNzd29yZFNjb3JlID09IG51bGwgPyAwIDogKHRoaXMubWFzdGVyUGFzc3dvcmRTY29yZSArIDEpICogMjA7XG4gICAgfVxuXG4gICAgZ2V0IG1hc3RlclBhc3N3b3JkU2NvcmVDb2xvcigpIHtcbiAgICAgICAgc3dpdGNoICh0aGlzLm1hc3RlclBhc3N3b3JkU2NvcmUpIHtcbiAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3N1Y2Nlc3MnO1xuICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgIHJldHVybiAncHJpbWFyeSc7XG4gICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgcmV0dXJuICd3YXJuaW5nJztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuICdkYW5nZXInO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0IG1hc3RlclBhc3N3b3JkU2NvcmVUZXh0KCkge1xuICAgICAgICBzd2l0Y2ggKHRoaXMubWFzdGVyUGFzc3dvcmRTY29yZSkge1xuICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmkxOG5TZXJ2aWNlLnQoJ3N0cm9uZycpO1xuICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmkxOG5TZXJ2aWNlLnQoJ2dvb2QnKTtcbiAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pMThuU2VydmljZS50KCd3ZWFrJyk7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm1hc3RlclBhc3N3b3JkU2NvcmUgIT0gbnVsbCA/IHRoaXMuaTE4blNlcnZpY2UudCgnd2VhaycpIDogbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIjxmb3JtICNmb3JtIChuZ1N1Ym1pdCk9XCJzdWJtaXQoKVwiIFthcHBBcGlBY3Rpb25dPVwiZm9ybVByb21pc2VcIj5cbiAgICA8aGVhZGVyPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibGVmdFwiPlxuICAgICAgICAgICAgPGEgcm91dGVyTGluaz1cIi9ob21lXCI+e3snY2FuY2VsJyB8IGkxOG59fTwvYT5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjZW50ZXJcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGl0bGVcIj57eydzZXRNYXN0ZXJQYXNzd29yZCcgfCBpMThufX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwicmlnaHRcIj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cInN1Ym1pdFwiIGFwcEJsdXJDbGljayBbZGlzYWJsZWRdPVwiZm9ybS5sb2FkaW5nXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gW2hpZGRlbl09XCJmb3JtLmxvYWRpbmdcIj57eydzdWJtaXQnIHwgaTE4bn19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtc3Bpbm5lciBmYS1sZyBmYS1zcGluXCIgW2hpZGRlbl09XCIhZm9ybS5sb2FkaW5nXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvaGVhZGVyPlxuICAgIDxjb250ZW50PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZnVsbC1sb2FkaW5nLXNwaW5uZXJcIiAqbmdJZj1cInN5bmNMb2FkaW5nXCI+XG4gICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXNwaW5uZXIgZmEtc3BpbiBmYS0zeFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgKm5nSWY9XCIhc3luY0xvYWRpbmdcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3hcIj5cbiAgICAgICAgICAgICAgICA8YXBwLWNhbGxvdXQgdHlwZT1cInRpcFwiPnt7J3Nzb0NvbXBsZXRlUmVnaXN0cmF0aW9uJyB8IGkxOG59fTwvYXBwLWNhbGxvdXQ+XG4gICAgICAgICAgICAgICAgPGFwcC1jYWxsb3V0IHR5cGU9XCJ3YXJuaW5nXCIgdGl0bGU9XCJ7eydyZXNldFBhc3N3b3JkUG9saWN5QXV0b0Vucm9sbCcgfCBpMThufX1cIlxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInJlc2V0UGFzc3dvcmRBdXRvRW5yb2xsXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7J3Jlc2V0UGFzc3dvcmRBdXRvRW5yb2xsSW52aXRlV2FybmluZycgfCBpMThufX1cbiAgICAgICAgICAgICAgICA8L2FwcC1jYWxsb3V0PlxuICAgICAgICAgICAgICAgIDxhcHAtY2FsbG91dCB0eXBlPVwiaW5mb1wiIFtlbmZvcmNlZFBvbGljeU9wdGlvbnNdPVwiZW5mb3JjZWRQb2xpY3lPcHRpb25zXCIgKm5nSWY9XCJlbmZvcmNlZFBvbGljeU9wdGlvbnNcIj5cbiAgICAgICAgICAgICAgICA8L2FwcC1jYWxsb3V0PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtY29udGVudC1yb3dcIiBhcHBCb3hSb3c+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWNvbnRlbnQtcm93LWZsZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93LW1haW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cIm1hc3RlclBhc3N3b3JkXCI+e3snbWFzdGVyUGFzcycgfCBpMThufX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJvbmcgY2xhc3M9XCJzdWItbGFiZWwgdGV4dC17e21hc3RlclBhc3N3b3JkU2NvcmVDb2xvcn19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIm1hc3RlclBhc3N3b3JkU2NvcmVUZXh0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3ttYXN0ZXJQYXNzd29yZFNjb3JlVGV4dH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0cm9uZz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPVwibWFzdGVyUGFzc3dvcmRcIiB0eXBlPVwie3tzaG93UGFzc3dvcmQgPyAndGV4dCcgOiAncGFzc3dvcmQnfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT1cIk1hc3RlclBhc3N3b3JkXCIgY2xhc3M9XCJtb25vc3BhY2VkXCIgWyhuZ01vZGVsKV09XCJtYXN0ZXJQYXNzd29yZFwiIHJlcXVpcmVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5wdXQpPVwidXBkYXRlUGFzc3dvcmRTdHJlbmd0aCgpXCIgYXBwSW5wdXRWZXJiYXRpbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWN0aW9uLWJ1dHRvbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJyb3ctYnRuXCIgYXBwU3RvcENsaWNrIGFwcEJsdXJDbGljayByb2xlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcEExMXlUaXRsZT1cInt7J3RvZ2dsZVZpc2liaWxpdHknIHwgaTE4bn19XCIgKGNsaWNrKT1cInRvZ2dsZVBhc3N3b3JkKGZhbHNlKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1sZ1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydmYS1leWUnOiAhc2hvd1Bhc3N3b3JkLCAnZmEtZXllLXNsYXNoJzogc2hvd1Bhc3N3b3JkfVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcy1iYXIgYmcte3ttYXN0ZXJQYXNzd29yZFNjb3JlQ29sb3J9fVwiIHJvbGU9XCJwcm9ncmVzc2JhclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtdmFsdWVub3c9XCIwXCIgYXJpYS12YWx1ZW1pbj1cIjBcIiBhcmlhLXZhbHVlbWF4PVwiMTAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwie3dpZHRoOiAobWFzdGVyUGFzc3dvcmRTY29yZVdpZHRoICsgJyUnKX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyLmFyaWEtdmFsdWVub3c9XCJ7e21hc3RlclBhc3N3b3JkU2NvcmVXaWR0aH19XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1mb290ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAge3snbWFzdGVyUGFzc0Rlc2MnIHwgaTE4bn19XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3hcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50LXJvd1wiIGFwcEJveFJvdz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtY29udGVudC1yb3ctZmxleFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3ctbWFpblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwibWFzdGVyUGFzc3dvcmRSZXR5cGVcIj57eydyZVR5cGVNYXN0ZXJQYXNzJyB8IGkxOG59fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD1cIm1hc3RlclBhc3N3b3JkUmV0eXBlXCIgdHlwZT1cInBhc3N3b3JkXCIgbmFtZT1cIk1hc3RlclBhc3N3b3JkUmV0eXBlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibW9ub3NwYWNlZFwiIFsobmdNb2RlbCldPVwibWFzdGVyUGFzc3dvcmRSZXR5cGVcIiByZXF1aXJlZCBhcHBJbnB1dFZlcmJhdGltXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvY29tcGxldGU9XCJuZXctcGFzc3dvcmRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWN0aW9uLWJ1dHRvbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJyb3ctYnRuXCIgYXBwU3RvcENsaWNrIGFwcEJsdXJDbGljayByb2xlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcEExMXlUaXRsZT1cInt7J3RvZ2dsZVZpc2liaWxpdHknIHwgaTE4bn19XCIgKGNsaWNrKT1cInRvZ2dsZVBhc3N3b3JkKHRydWUpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWxnXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2ZhLWV5ZSc6ICFzaG93UGFzc3dvcmQsICdmYS1leWUtc2xhc2gnOiBzaG93UGFzc3dvcmR9XCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveCBsYXN0XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtY29udGVudC1yb3dcIiBhcHBCb3hSb3c+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiaGludFwiPnt7J21hc3RlclBhc3NIaW50JyB8IGkxOG59fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9XCJoaW50XCIgdHlwZT1cInRleHRcIiBuYW1lPVwiSGludFwiIFsobmdNb2RlbCldPVwiaGludFwiPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWZvb3RlclwiPlxuICAgICAgICAgICAgICAgICAgICB7eydtYXN0ZXJQYXNzSGludERlc2MnIHwgaTE4bn19XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9jb250ZW50PlxuPC9mb3JtPlxuIiwiaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7XG4gICAgQWN0aXZhdGVkUm91dGUsXG4gICAgUm91dGVyLFxufSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuXG5pbXBvcnQgeyBBcGlTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9hcGkuc2VydmljZSc7XG5pbXBvcnQgeyBBdXRoU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvYXV0aC5zZXJ2aWNlJztcbmltcG9ydCB7IENyeXB0b0Z1bmN0aW9uU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvY3J5cHRvRnVuY3Rpb24uc2VydmljZSc7XG5pbXBvcnQgeyBFbnZpcm9ubWVudFNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL2Vudmlyb25tZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgSTE4blNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL2kxOG4uc2VydmljZSc7XG5pbXBvcnQgeyBMb2dTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9sb2cuc2VydmljZSc7XG5pbXBvcnQgeyBQYXNzd29yZEdlbmVyYXRpb25TZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9wYXNzd29yZEdlbmVyYXRpb24uc2VydmljZSc7XG5pbXBvcnQgeyBQbGF0Zm9ybVV0aWxzU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvcGxhdGZvcm1VdGlscy5zZXJ2aWNlJztcbmltcG9ydCB7IFN0YXRlU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvc3RhdGUuc2VydmljZSc7XG5pbXBvcnQgeyBTdG9yYWdlU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvc3RvcmFnZS5zZXJ2aWNlJztcbmltcG9ydCB7IFN5bmNTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9zeW5jLnNlcnZpY2UnO1xuXG5pbXBvcnQgeyBTc29Db21wb25lbnQgYXMgQmFzZVNzb0NvbXBvbmVudCB9IGZyb20gJ2pzbGliLWFuZ3VsYXIvY29tcG9uZW50cy9zc28uY29tcG9uZW50JztcbmltcG9ydCB7IEJyb3dzZXJBcGkgfSBmcm9tICcuLi8uLi9icm93c2VyL2Jyb3dzZXJBcGknO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2FwcC1zc28nLFxuICAgIHRlbXBsYXRlVXJsOiAnc3NvLmNvbXBvbmVudC5odG1sJyxcbn0pXG5leHBvcnQgY2xhc3MgU3NvQ29tcG9uZW50IGV4dGVuZHMgQmFzZVNzb0NvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IoYXV0aFNlcnZpY2U6IEF1dGhTZXJ2aWNlLCByb3V0ZXI6IFJvdXRlcixcbiAgICAgICAgaTE4blNlcnZpY2U6IEkxOG5TZXJ2aWNlLCByb3V0ZTogQWN0aXZhdGVkUm91dGUsXG4gICAgICAgIHN0b3JhZ2VTZXJ2aWNlOiBTdG9yYWdlU2VydmljZSwgc3RhdGVTZXJ2aWNlOiBTdGF0ZVNlcnZpY2UsXG4gICAgICAgIHBsYXRmb3JtVXRpbHNTZXJ2aWNlOiBQbGF0Zm9ybVV0aWxzU2VydmljZSwgYXBpU2VydmljZTogQXBpU2VydmljZSxcbiAgICAgICAgY3J5cHRvRnVuY3Rpb25TZXJ2aWNlOiBDcnlwdG9GdW5jdGlvblNlcnZpY2UsIHBhc3N3b3JkR2VuZXJhdGlvblNlcnZpY2U6IFBhc3N3b3JkR2VuZXJhdGlvblNlcnZpY2UsXG4gICAgICAgIHN5bmNTZXJ2aWNlOiBTeW5jU2VydmljZSwgZW52aXJvbm1lbnRTZXJ2aWNlOiBFbnZpcm9ubWVudFNlcnZpY2UsIGxvZ1NlcnZpY2U6IExvZ1NlcnZpY2UpIHtcbiAgICAgICAgc3VwZXIoYXV0aFNlcnZpY2UsIHJvdXRlciwgaTE4blNlcnZpY2UsIHJvdXRlLCBzdG9yYWdlU2VydmljZSwgc3RhdGVTZXJ2aWNlLCBwbGF0Zm9ybVV0aWxzU2VydmljZSxcbiAgICAgICAgICAgIGFwaVNlcnZpY2UsIGNyeXB0b0Z1bmN0aW9uU2VydmljZSwgZW52aXJvbm1lbnRTZXJ2aWNlLCBwYXNzd29yZEdlbmVyYXRpb25TZXJ2aWNlLCBsb2dTZXJ2aWNlKTtcblxuICAgICAgICBjb25zdCB1cmwgPSB0aGlzLmVudmlyb25tZW50U2VydmljZS5nZXRXZWJWYXVsdFVybCgpO1xuXG4gICAgICAgIHRoaXMucmVkaXJlY3RVcmkgPSB1cmwgKyAnL3Nzby1jb25uZWN0b3IuaHRtbCc7XG4gICAgICAgIHRoaXMuY2xpZW50SWQgPSAnYnJvd3Nlcic7XG5cbiAgICAgICAgc3VwZXIub25TdWNjZXNzZnVsTG9naW4gPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBhd2FpdCBzeW5jU2VydmljZS5mdWxsU3luYyh0cnVlKTtcbiAgICAgICAgICAgIEJyb3dzZXJBcGkucmVsb2FkT3BlbldpbmRvd3MoKTtcbiAgICAgICAgICAgIGNvbnN0IHRoaXNXaW5kb3cgPSB3aW5kb3cub3BlbignJywgJ19zZWxmJyk7XG4gICAgICAgICAgICB0aGlzV2luZG93LmNsb3NlKCk7XG4gICAgICAgIH07XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuXG5pbXBvcnQgeyBBdXRoU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvYXV0aC5zZXJ2aWNlJztcbmltcG9ydCB7IEkxOG5TZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9pMThuLnNlcnZpY2UnO1xuaW1wb3J0IHsgUGxhdGZvcm1VdGlsc1NlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL3BsYXRmb3JtVXRpbHMuc2VydmljZSc7XG5cbmltcG9ydCB7XG4gICAgVHdvRmFjdG9yT3B0aW9uc0NvbXBvbmVudCBhcyBCYXNlVHdvRmFjdG9yT3B0aW9uc0NvbXBvbmVudCxcbn0gZnJvbSAnanNsaWItYW5ndWxhci9jb21wb25lbnRzL3R3by1mYWN0b3Itb3B0aW9ucy5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2FwcC10d28tZmFjdG9yLW9wdGlvbnMnLFxuICAgIHRlbXBsYXRlVXJsOiAndHdvLWZhY3Rvci1vcHRpb25zLmNvbXBvbmVudC5odG1sJyxcbn0pXG5leHBvcnQgY2xhc3MgVHdvRmFjdG9yT3B0aW9uc0NvbXBvbmVudCBleHRlbmRzIEJhc2VUd29GYWN0b3JPcHRpb25zQ29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3RvcihhdXRoU2VydmljZTogQXV0aFNlcnZpY2UsIHJvdXRlcjogUm91dGVyLFxuICAgICAgICBpMThuU2VydmljZTogSTE4blNlcnZpY2UsIHBsYXRmb3JtVXRpbHNTZXJ2aWNlOiBQbGF0Zm9ybVV0aWxzU2VydmljZSkge1xuICAgICAgICBzdXBlcihhdXRoU2VydmljZSwgcm91dGVyLCBpMThuU2VydmljZSwgcGxhdGZvcm1VdGlsc1NlcnZpY2UsIHdpbmRvdyk7XG4gICAgfVxuXG4gICAgY2hvb3NlKHA6IGFueSkge1xuICAgICAgICBzdXBlci5jaG9vc2UocCk7XG4gICAgICAgIHRoaXMuYXV0aFNlcnZpY2Uuc2VsZWN0ZWRUd29GYWN0b3JQcm92aWRlclR5cGUgPSBwLnR5cGU7XG4gICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnMmZhJ10pO1xuICAgIH1cbn1cbiIsIjxoZWFkZXI+XG4gICAgPGRpdiBjbGFzcz1cImxlZnRcIj5cbiAgICAgICAgPGEgcm91dGVyTGluaz1cIi8yZmFcIj57eydjbG9zZScgfCBpMThufX08L2E+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImNlbnRlclwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInRpdGxlXCI+e3sndHdvU3RlcE9wdGlvbnMnIHwgaTE4bn19PC9zcGFuPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJyaWdodFwiPjwvZGl2PlxuPC9oZWFkZXI+XG48Y29udGVudD5cbiAgICA8ZGl2IGNsYXNzPVwiYm94XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJib3gtY29udGVudFwiPlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgYXBwU3RvcENsaWNrICpuZ0Zvcj1cImxldCBwIG9mIHByb3ZpZGVyc1wiIGNsYXNzPVwiYm94LWNvbnRlbnQtcm93XCIgKGNsaWNrKT1cImNob29zZShwKVwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dFwiPnt7cC5uYW1lfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZXRhaWxcIj57e3AuZGVzY3JpcHRpb259fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgYXBwU3RvcENsaWNrIGNsYXNzPVwiYm94LWNvbnRlbnQtcm93XCIgKGNsaWNrKT1cInJlY292ZXIoKVwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dFwiPnt7J3JlY292ZXJ5Q29kZVRpdGxlJyB8IGkxOG59fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRldGFpbFwiPnt7J3JlY292ZXJ5Q29kZURlc2MnIHwgaTE4bn19PC9zcGFuPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9jb250ZW50PlxuIiwiaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICAgIEFjdGl2YXRlZFJvdXRlLFxuICAgIFJvdXRlcixcbn0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IGZpcnN0IH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBUd29GYWN0b3JQcm92aWRlclR5cGUgfSBmcm9tICdqc2xpYi1jb21tb24vZW51bXMvdHdvRmFjdG9yUHJvdmlkZXJUeXBlJztcblxuaW1wb3J0IHsgQXBpU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvYXBpLnNlcnZpY2UnO1xuaW1wb3J0IHsgQXV0aFNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL2F1dGguc2VydmljZSc7XG5pbXBvcnQgeyBFbnZpcm9ubWVudFNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL2Vudmlyb25tZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgSTE4blNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL2kxOG4uc2VydmljZSc7XG5pbXBvcnQgeyBMb2dTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9sb2cuc2VydmljZSc7XG5pbXBvcnQgeyBNZXNzYWdpbmdTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9tZXNzYWdpbmcuc2VydmljZSc7XG5pbXBvcnQgeyBQbGF0Zm9ybVV0aWxzU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvcGxhdGZvcm1VdGlscy5zZXJ2aWNlJztcbmltcG9ydCB7IFN0YXRlU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvc3RhdGUuc2VydmljZSc7XG5pbXBvcnQgeyBTdG9yYWdlU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvc3RvcmFnZS5zZXJ2aWNlJztcbmltcG9ydCB7IFN5bmNTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9zeW5jLnNlcnZpY2UnO1xuXG5pbXBvcnQgeyBCcm9hZGNhc3RlclNlcnZpY2UgfSBmcm9tICdqc2xpYi1hbmd1bGFyL3NlcnZpY2VzL2Jyb2FkY2FzdGVyLnNlcnZpY2UnO1xuXG5pbXBvcnQgeyBUd29GYWN0b3JDb21wb25lbnQgYXMgQmFzZVR3b0ZhY3RvckNvbXBvbmVudCB9IGZyb20gJ2pzbGliLWFuZ3VsYXIvY29tcG9uZW50cy90d28tZmFjdG9yLmNvbXBvbmVudCc7XG5cbmltcG9ydCB7IFBvcHVwVXRpbHNTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvcG9wdXAtdXRpbHMuc2VydmljZSc7XG5cbmltcG9ydCB7IEJyb3dzZXJBcGkgfSBmcm9tICcuLi8uLi9icm93c2VyL2Jyb3dzZXJBcGknO1xuXG5jb25zdCBCcm9hZGNhc3RlclN1YnNjcmlwdGlvbklkID0gJ1R3b0ZhY3RvckNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnYXBwLXR3by1mYWN0b3InLFxuICAgIHRlbXBsYXRlVXJsOiAndHdvLWZhY3Rvci5jb21wb25lbnQuaHRtbCcsXG59KVxuZXhwb3J0IGNsYXNzIFR3b0ZhY3RvckNvbXBvbmVudCBleHRlbmRzIEJhc2VUd29GYWN0b3JDb21wb25lbnQge1xuICAgIHNob3dOZXdXaW5kb3dNZXNzYWdlID0gZmFsc2U7XG5cbiAgICBjb25zdHJ1Y3RvcihhdXRoU2VydmljZTogQXV0aFNlcnZpY2UsIHJvdXRlcjogUm91dGVyLFxuICAgICAgICBpMThuU2VydmljZTogSTE4blNlcnZpY2UsIGFwaVNlcnZpY2U6IEFwaVNlcnZpY2UsXG4gICAgICAgIHBsYXRmb3JtVXRpbHNTZXJ2aWNlOiBQbGF0Zm9ybVV0aWxzU2VydmljZSwgcHJpdmF0ZSBzeW5jU2VydmljZTogU3luY1NlcnZpY2UsXG4gICAgICAgIGVudmlyb25tZW50U2VydmljZTogRW52aXJvbm1lbnRTZXJ2aWNlLCBwcml2YXRlIGJyb2FkY2FzdGVyU2VydmljZTogQnJvYWRjYXN0ZXJTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHBvcHVwVXRpbHNTZXJ2aWNlOiBQb3B1cFV0aWxzU2VydmljZSwgc3RhdGVTZXJ2aWNlOiBTdGF0ZVNlcnZpY2UsXG4gICAgICAgIHN0b3JhZ2VTZXJ2aWNlOiBTdG9yYWdlU2VydmljZSwgcm91dGU6IEFjdGl2YXRlZFJvdXRlLCBwcml2YXRlIG1lc3NhZ2luZ1NlcnZpY2U6IE1lc3NhZ2luZ1NlcnZpY2UsXG4gICAgICAgIGxvZ1NlcnZpY2U6IExvZ1NlcnZpY2UpIHtcbiAgICAgICAgc3VwZXIoYXV0aFNlcnZpY2UsIHJvdXRlciwgaTE4blNlcnZpY2UsIGFwaVNlcnZpY2UsIHBsYXRmb3JtVXRpbHNTZXJ2aWNlLCB3aW5kb3csIGVudmlyb25tZW50U2VydmljZSxcbiAgICAgICAgICAgIHN0YXRlU2VydmljZSwgc3RvcmFnZVNlcnZpY2UsIHJvdXRlLCBsb2dTZXJ2aWNlKTtcbiAgICAgICAgc3VwZXIub25TdWNjZXNzZnVsTG9naW4gPSAoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gc3luY1NlcnZpY2UuZnVsbFN5bmModHJ1ZSk7XG4gICAgICAgIH07XG4gICAgICAgIHN1cGVyLnN1Y2Nlc3NSb3V0ZSA9ICcvdGFicy92YXVsdCc7XG4gICAgICAgIHRoaXMud2ViQXV0aG5OZXdUYWIgPSB0aGlzLnBsYXRmb3JtVXRpbHNTZXJ2aWNlLmlzRmlyZWZveCgpIHx8IHRoaXMucGxhdGZvcm1VdGlsc1NlcnZpY2UuaXNTYWZhcmkoKTtcbiAgICB9XG5cbiAgICBhc3luYyBuZ09uSW5pdCgpIHtcbiAgICAgICAgaWYgKHRoaXMucm91dGUuc25hcHNob3QucGFyYW1NYXAuaGFzKCd3ZWJBdXRoblJlc3BvbnNlJykpIHtcbiAgICAgICAgICAgIC8vIFdlYkF1dGhuIGZhbGxiYWNrIHJlc3BvbnNlXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUHJvdmlkZXJUeXBlID0gVHdvRmFjdG9yUHJvdmlkZXJUeXBlLldlYkF1dGhuO1xuICAgICAgICAgICAgdGhpcy50b2tlbiA9IHRoaXMucm91dGUuc25hcHNob3QucGFyYW1NYXAuZ2V0KCd3ZWJBdXRoblJlc3BvbnNlJyk7XG4gICAgICAgICAgICBzdXBlci5vblN1Y2Nlc3NmdWxMb2dpbiA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnN5bmNTZXJ2aWNlLmZ1bGxTeW5jKHRydWUpO1xuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnaW5nU2VydmljZS5zZW5kKCdyZWxvYWRQb3B1cCcpO1xuICAgICAgICAgICAgICAgIHdpbmRvdy5jbG9zZSgpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMucmVtZW1iZXIgPSB0aGlzLnJvdXRlLnNuYXBzaG90LnBhcmFtTWFwLmdldCgncmVtZW1iZXInKSA9PT0gJ3RydWUnO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5kb1N1Ym1pdCgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgc3VwZXIubmdPbkluaXQoKTtcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRQcm92aWRlclR5cGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gV2ViQXV0aG4gcHJvbXB0IGFwcGVhcnMgaW5zaWRlIHRoZSBwb3B1cCBvbiBsaW51eCwgYW5kIHJlcXVpcmVzIGEgbGFyZ2VyIHBvcHVwIHdpZHRoXG4gICAgICAgIC8vIHRoYW4gdXN1YWwgdG8gYXZvaWQgY3V0dGluZyBvZmYgdGhlIGRpYWxvZy5cbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRQcm92aWRlclR5cGUgPT09IFR3b0ZhY3RvclByb3ZpZGVyVHlwZS5XZWJBdXRobiAmJiBhd2FpdCB0aGlzLmlzTGludXgoKSkge1xuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCdsaW51eC13ZWJhdXRobicpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRQcm92aWRlclR5cGUgPT09IFR3b0ZhY3RvclByb3ZpZGVyVHlwZS5FbWFpbCAmJlxuICAgICAgICAgICAgdGhpcy5wb3B1cFV0aWxzU2VydmljZS5pblBvcHVwKHdpbmRvdykpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbmZpcm1lZCA9IGF3YWl0IHRoaXMucGxhdGZvcm1VdGlsc1NlcnZpY2Uuc2hvd0RpYWxvZyh0aGlzLmkxOG5TZXJ2aWNlLnQoJ3BvcHVwMmZhQ2xvc2VNZXNzYWdlJyksXG4gICAgICAgICAgICAgICAgbnVsbCwgdGhpcy5pMThuU2VydmljZS50KCd5ZXMnKSwgdGhpcy5pMThuU2VydmljZS50KCdubycpKTtcbiAgICAgICAgICAgIGlmIChjb25maXJtZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBvcHVwVXRpbHNTZXJ2aWNlLnBvcE91dCh3aW5kb3cpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yb3V0ZS5xdWVyeVBhcmFtcy5waXBlKGZpcnN0KCkpLnN1YnNjcmliZShhc3luYyBxUGFyYW1zID0+IHtcbiAgICAgICAgICAgIGlmIChxUGFyYW1zLnNzbyA9PT0gJ3RydWUnKSB7XG4gICAgICAgICAgICAgICAgc3VwZXIub25TdWNjZXNzZnVsTG9naW4gPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIEJyb3dzZXJBcGkucmVsb2FkT3BlbldpbmRvd3MoKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGhpc1dpbmRvdyA9IHdpbmRvdy5vcGVuKCcnLCAnX3NlbGYnKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpc1dpbmRvdy5jbG9zZSgpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zeW5jU2VydmljZS5mdWxsU3luYyh0cnVlKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBhc3luYyBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5icm9hZGNhc3RlclNlcnZpY2UudW5zdWJzY3JpYmUoQnJvYWRjYXN0ZXJTdWJzY3JpcHRpb25JZCk7XG5cbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRQcm92aWRlclR5cGUgPT09IFR3b0ZhY3RvclByb3ZpZGVyVHlwZS5XZWJBdXRobiAmJiBhd2FpdCB0aGlzLmlzTGludXgoKSkge1xuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKCdsaW51eC13ZWJhdXRobicpO1xuICAgICAgICB9XG4gICAgICAgIHN1cGVyLm5nT25EZXN0cm95KCk7XG4gICAgfVxuXG4gICAgYW5vdGhlck1ldGhvZCgpIHtcbiAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycyZmEtb3B0aW9ucyddKTtcbiAgICB9XG5cbiAgICBhc3luYyBpc0xpbnV4KCkge1xuICAgICAgICByZXR1cm4gKGF3YWl0IEJyb3dzZXJBcGkuZ2V0UGxhdGZvcm1JbmZvKCkpLm9zID09PSAnbGludXgnO1xuICAgIH1cbn1cbiIsIjxmb3JtIGlkPVwidHdvLWZhY3Rvci1wYWdlXCIgI2Zvcm0gKG5nU3VibWl0KT1cInN1Ym1pdCgpXCIgW2FwcEFwaUFjdGlvbl09XCJmb3JtUHJvbWlzZVwiPlxuICAgIDxoZWFkZXI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJsZWZ0XCI+XG4gICAgICAgICAgICA8YSByb3V0ZXJMaW5rPVwiL2xvZ2luXCI+e3snYmFjaycgfCBpMThufX08L2E+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2VudGVyXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRpdGxlXCI+e3t0aXRsZX19PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJpZ2h0XCI+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJzdWJtaXRcIiBhcHBCbHVyQ2xpY2sgW2Rpc2FibGVkXT1cImZvcm0ubG9hZGluZ1wiICpuZ0lmPVwic2VsZWN0ZWRQcm92aWRlclR5cGUgIT0gbnVsbCAmJiBzZWxlY3RlZFByb3ZpZGVyVHlwZSAhPT0gcHJvdmlkZXJUeXBlLkR1byAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRQcm92aWRlclR5cGUgIT09IHByb3ZpZGVyVHlwZS5Pcmdhbml6YXRpb25EdW8gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3RlZFByb3ZpZGVyVHlwZSAhPT0gcHJvdmlkZXJUeXBlLldlYkF1dGhuIHx8IGZvcm0ubG9hZGluZylcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBbaGlkZGVuXT1cImZvcm0ubG9hZGluZ1wiPnt7J2NvbnRpbnVlJyB8IGkxOG59fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXNwaW5uZXIgZmEtbGcgZmEtc3BpblwiIFtoaWRkZW5dPVwiIWZvcm0ubG9hZGluZ1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2hlYWRlcj5cbiAgICA8Y29udGVudD5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNlbGVjdGVkUHJvdmlkZXJUeXBlID09PSBwcm92aWRlclR5cGUuQXV0aGVudGljYXRvciB8fFxuICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRQcm92aWRlclR5cGUgPT09IHByb3ZpZGVyVHlwZS5FbWFpbFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRlbnQgdGV4dC1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInNlbGVjdGVkUHJvdmlkZXJUeXBlID09PSBwcm92aWRlclR5cGUuQXV0aGVudGljYXRvclwiPlxuICAgICAgICAgICAgICAgICAgICB7eydlbnRlclZlcmlmaWNhdGlvbkNvZGVBcHAnIHwgaTE4bn19XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwic2VsZWN0ZWRQcm92aWRlclR5cGUgPT09IHByb3ZpZGVyVHlwZS5FbWFpbFwiPlxuICAgICAgICAgICAgICAgICAgICB7eydlbnRlclZlcmlmaWNhdGlvbkNvZGVFbWFpbCcgfCBpMThuIDogdHdvRmFjdG9yRW1haWx9fVxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveCBmaXJzdFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWNvbnRlbnQtcm93XCIgYXBwQm94Um93PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImNvZGVcIj57eyd2ZXJpZmljYXRpb25Db2RlJyB8IGkxOG59fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9XCJjb2RlXCIgdHlwZT1cInRleHRcIiBuYW1lPVwiQ29kZVwiIFsobmdNb2RlbCldPVwidG9rZW5cIiByZXF1aXJlZCBhcHBBdXRvZm9jdXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dG1vZGU9XCJ0ZWxcIiBhcHBJbnB1dFZlcmJhdGltPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50LXJvdyBib3gtY29udGVudC1yb3ctY2hlY2tib3hcIiBhcHBCb3hSb3c+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwicmVtZW1iZXJcIj57eydyZW1lbWJlck1lJyB8IGkxOG59fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9XCJyZW1lbWJlclwiIHR5cGU9XCJjaGVja2JveFwiIG5hbWU9XCJSZW1lbWJlclwiIFsobmdNb2RlbCldPVwicmVtZW1iZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzZWxlY3RlZFByb3ZpZGVyVHlwZSA9PT0gcHJvdmlkZXJUeXBlLll1YmlrZXlcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250ZW50IHRleHQtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPnt7J2luc2VydFl1YmlLZXknIHwgaTE4bn19PC9wPlxuICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiLi9pbWFnZXMveXViaWtleS5qcGdcIiBjbGFzcz1cImltZy1yb3VuZGVkIGltZy1yZXNwb25zaXZlXCIgYWx0PVwiXCI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3ggZmlyc3RcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50LXJvd1wiIGFwcEJveFJvdz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJjb2RlXCIgY2xhc3M9XCJzci1vbmx5XCI+e3sndmVyaWZpY2F0aW9uQ29kZScgfCBpMThufX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPVwiY29kZVwiIHR5cGU9XCJwYXNzd29yZFwiIG5hbWU9XCJDb2RlXCIgWyhuZ01vZGVsKV09XCJ0b2tlblwiIHJlcXVpcmVkIGFwcEF1dG9mb2N1c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcElucHV0VmVyYmF0aW0+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWNvbnRlbnQtcm93IGJveC1jb250ZW50LXJvdy1jaGVja2JveFwiIGFwcEJveFJvdz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJyZW1lbWJlclwiPnt7J3JlbWVtYmVyTWUnIHwgaTE4bn19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD1cInJlbWVtYmVyXCIgdHlwZT1cImNoZWNrYm94XCIgbmFtZT1cIlJlbWVtYmVyXCIgWyhuZ01vZGVsKV09XCJyZW1lbWJlclwiPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNlbGVjdGVkUHJvdmlkZXJUeXBlID09PSBwcm92aWRlclR5cGUuV2ViQXV0aG4gJiYgIXdlYkF1dGhuTmV3VGFiXCI+XG4gICAgICAgICAgICA8ZGl2IGlkPVwid2ViLWF1dGhuLWZyYW1lXCI+PGlmcmFtZSBpZD1cIndlYmF1dGhuX2lmcmFtZVwiIFthbGxvd109XCJ3ZWJBdXRobkFsbG93XCI+PC9pZnJhbWU+PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtY29udGVudC1yb3cgYm94LWNvbnRlbnQtcm93LWNoZWNrYm94XCIgYXBwQm94Um93PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInJlbWVtYmVyXCI+e3sncmVtZW1iZXJNZScgfCBpMThufX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPVwicmVtZW1iZXJcIiB0eXBlPVwiY2hlY2tib3hcIiBuYW1lPVwiUmVtZW1iZXJcIiBbKG5nTW9kZWwpXT1cInJlbWVtYmVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2VsZWN0ZWRQcm92aWRlclR5cGUgPT09IHByb3ZpZGVyVHlwZS5XZWJBdXRobiAmJiB3ZWJBdXRobk5ld1RhYlwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRlbnQgdGV4dC1jZW50ZXJcIiAqbmdJZj1cIndlYkF1dGhuTmV3VGFiXCI+XG4gICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPnt7J3dlYkF1dGhuTmV3VGFiJyB8IGkxOG59fTwvcD5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBwcmltYXJ5IGJsb2NrXCIgKGNsaWNrKT1cImF1dGhXZWJBdXRobigpXCIgYXBwU3RvcENsaWNrPnt7J3dlYkF1dGhuTmV3VGFiT3BlbicgfCBpMThufX08L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNlbGVjdGVkUHJvdmlkZXJUeXBlID09PSBwcm92aWRlclR5cGUuRHVvIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFByb3ZpZGVyVHlwZSA9PT0gcHJvdmlkZXJUeXBlLk9yZ2FuaXphdGlvbkR1b1wiPlxuICAgICAgICAgICAgPGRpdiBpZD1cImR1by1mcmFtZVwiPjxpZnJhbWUgaWQ9XCJkdW9faWZyYW1lXCI+PC9pZnJhbWU+PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtY29udGVudC1yb3cgYm94LWNvbnRlbnQtcm93LWNoZWNrYm94XCIgYXBwQm94Um93PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInJlbWVtYmVyXCI+e3sncmVtZW1iZXJNZScgfCBpMThufX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPVwicmVtZW1iZXJcIiB0eXBlPVwiY2hlY2tib3hcIiBuYW1lPVwiUmVtZW1iZXJcIiBbKG5nTW9kZWwpXT1cInJlbWVtYmVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGVudFwiICpuZ0lmPVwic2VsZWN0ZWRQcm92aWRlclR5cGUgPT0gbnVsbFwiPlxuICAgICAgICAgICAgPHAgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPnt7J25vVHdvU3RlcFByb3ZpZGVycycgfCBpMThufX08L3A+XG4gICAgICAgICAgICA8cCBjbGFzcz1cInRleHQtY2VudGVyXCI+e3snbm9Ud29TdGVwUHJvdmlkZXJzMicgfCBpMThufX08L3A+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGVudCBuby12cGFkXCIgKm5nSWY9XCJzZWxlY3RlZFByb3ZpZGVyVHlwZSAhPSBudWxsXCI+XG4gICAgICAgICAgICA8cCBjbGFzcz1cInRleHQtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgYXBwU3RvcENsaWNrIChjbGljayk9XCJhbm90aGVyTWV0aG9kKClcIj57eyd1c2VBbm90aGVyVHdvU3RlcE1ldGhvZCcgfCBpMThufX08L2J1dHRvbj5cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgIDxwICpuZ0lmPVwic2VsZWN0ZWRQcm92aWRlclR5cGUgPT09IHByb3ZpZGVyVHlwZS5FbWFpbFwiIGNsYXNzPVwidGV4dC1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBhcHBTdG9wQ2xpY2sgKGNsaWNrKT1cInNlbmRFbWFpbCh0cnVlKVwiIFthcHBBcGlBY3Rpb25dPVwiZW1haWxQcm9taXNlXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7J3NlbmRWZXJpZmljYXRpb25Db2RlRW1haWxBZ2FpbicgfCBpMThufX1cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9jb250ZW50PlxuPC9mb3JtPlxuIiwiaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IEFwaVNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL2FwaS5zZXJ2aWNlJztcbmltcG9ydCB7IENyeXB0b1NlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL2NyeXB0by5zZXJ2aWNlJztcbmltcG9ydCB7IEkxOG5TZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9pMThuLnNlcnZpY2UnO1xuaW1wb3J0IHsgTG9nU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvbG9nLnNlcnZpY2UnO1xuaW1wb3J0IHsgTWVzc2FnaW5nU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvbWVzc2FnaW5nLnNlcnZpY2UnO1xuaW1wb3J0IHsgUGFzc3dvcmRHZW5lcmF0aW9uU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvcGFzc3dvcmRHZW5lcmF0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgUGxhdGZvcm1VdGlsc1NlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL3BsYXRmb3JtVXRpbHMuc2VydmljZSc7XG5pbXBvcnQgeyBQb2xpY3lTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9wb2xpY3kuc2VydmljZSc7XG5pbXBvcnQgeyBTeW5jU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvc3luYy5zZXJ2aWNlJztcbmltcG9ydCB7IFVzZXJTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy91c2VyLnNlcnZpY2UnO1xuXG5pbXBvcnQgeyBVcGRhdGVUZW1wUGFzc3dvcmRDb21wb25lbnQgYXMgQmFzZVVwZGF0ZVRlbXBQYXNzd29yZENvbXBvbmVudCB9IGZyb20gJ2pzbGliLWFuZ3VsYXIvY29tcG9uZW50cy91cGRhdGUtdGVtcC1wYXNzd29yZC5jb21wb25lbnQnO1xuXG5pbnRlcmZhY2UgTWFzdGVyUGFzc3dvcmRTY29yZSB7XG4gICAgQ29sb3I6IHN0cmluZztcbiAgICBUZXh0OiBzdHJpbmc7XG4gICAgV2lkdGg6IG51bWJlcjtcbn1cblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdhcHAtdXBkYXRlLXRlbXAtcGFzc3dvcmQnLFxuICAgIHRlbXBsYXRlVXJsOiAndXBkYXRlLXRlbXAtcGFzc3dvcmQuY29tcG9uZW50Lmh0bWwnLFxufSlcbmV4cG9ydCBjbGFzcyBVcGRhdGVUZW1wUGFzc3dvcmRDb21wb25lbnQgZXh0ZW5kcyBCYXNlVXBkYXRlVGVtcFBhc3N3b3JkQ29tcG9uZW50IHtcbiAgICBnZXQgbWFzdGVyUGFzc3dvcmRTY29yZVN0eWxlKCk6IE1hc3RlclBhc3N3b3JkU2NvcmUge1xuICAgICAgICBjb25zdCBzY29yZVdpZHRoID0gdGhpcy5tYXN0ZXJQYXNzd29yZFNjb3JlID09IG51bGwgPyAwIDogKHRoaXMubWFzdGVyUGFzc3dvcmRTY29yZSArIDEpICogMjA7XG4gICAgICAgIHN3aXRjaCAodGhpcy5tYXN0ZXJQYXNzd29yZFNjb3JlKSB7XG4gICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgQ29sb3I6ICdiZy1zdWNjZXNzJyxcbiAgICAgICAgICAgICAgICAgICAgVGV4dDogJ3N0cm9uZycsXG4gICAgICAgICAgICAgICAgICAgIFdpZHRoOiBzY29yZVdpZHRoLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgQ29sb3I6ICdiZy1wcmltYXJ5JyxcbiAgICAgICAgICAgICAgICAgICAgVGV4dDogJ2dvb2QnLFxuICAgICAgICAgICAgICAgICAgICBXaWR0aDogc2NvcmVXaWR0aCxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIENvbG9yOiAnYmctd2FybmluZycsXG4gICAgICAgICAgICAgICAgICAgIFRleHQ6ICd3ZWFrJyxcbiAgICAgICAgICAgICAgICAgICAgV2lkdGg6IHNjb3JlV2lkdGgsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgQ29sb3I6ICdiZy1kYW5nZXInLFxuICAgICAgICAgICAgICAgICAgICBUZXh0OiAnd2VhaycsXG4gICAgICAgICAgICAgICAgICAgIFdpZHRoOiBzY29yZVdpZHRoLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RvcihpMThuU2VydmljZTogSTE4blNlcnZpY2UsIHBsYXRmb3JtVXRpbHNTZXJ2aWNlOiBQbGF0Zm9ybVV0aWxzU2VydmljZSxcbiAgICAgICAgcGFzc3dvcmRHZW5lcmF0aW9uU2VydmljZTogUGFzc3dvcmRHZW5lcmF0aW9uU2VydmljZSwgcG9saWN5U2VydmljZTogUG9saWN5U2VydmljZSxcbiAgICAgICAgY3J5cHRvU2VydmljZTogQ3J5cHRvU2VydmljZSwgdXNlclNlcnZpY2U6IFVzZXJTZXJ2aWNlLFxuICAgICAgICBtZXNzYWdpbmdTZXJ2aWNlOiBNZXNzYWdpbmdTZXJ2aWNlLCBhcGlTZXJ2aWNlOiBBcGlTZXJ2aWNlLFxuICAgICAgICBzeW5jU2VydmljZTogU3luY1NlcnZpY2UsIGxvZ1NlcnZpY2U6IExvZ1NlcnZpY2UpIHtcbiAgICAgICAgc3VwZXIoaTE4blNlcnZpY2UsIHBsYXRmb3JtVXRpbHNTZXJ2aWNlLCBwYXNzd29yZEdlbmVyYXRpb25TZXJ2aWNlLCBwb2xpY3lTZXJ2aWNlLCBjcnlwdG9TZXJ2aWNlLFxuICAgICAgICAgICAgdXNlclNlcnZpY2UsIG1lc3NhZ2luZ1NlcnZpY2UsIGFwaVNlcnZpY2UsIHN5bmNTZXJ2aWNlLCBsb2dTZXJ2aWNlKTtcbiAgICB9XG59XG4iLCI8Zm9ybSAjZm9ybSAobmdTdWJtaXQpPVwic3VibWl0KClcIiBbYXBwQXBpQWN0aW9uXT1cImZvcm1Qcm9taXNlXCI+XG4gICAgPGhlYWRlcj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImxlZnRcIj5cbiAgICAgICAgICAgIDxhIChjbGljayk9XCJsb2dPdXQoKVwiPnt7J2xvZ091dCcgfCBpMThufX08L2E+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2VudGVyXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRpdGxlXCI+e3sndXBkYXRlTWFzdGVyUGFzc3dvcmQnIHwgaTE4bn19PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJpZ2h0XCI+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJzdWJtaXRcIiBhcHBCbHVyQ2xpY2sgW2Rpc2FibGVkXT1cImZvcm0ubG9hZGluZ1wiPlxuICAgICAgICAgICAgICAgIDxzcGFuIFtoaWRkZW5dPVwiZm9ybS5sb2FkaW5nXCI+e3snc3VibWl0JyB8IGkxOG59fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXNwaW5uZXIgZmEtbGcgZmEtc3BpblwiIFtoaWRkZW5dPVwiIWZvcm0ubG9hZGluZ1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2hlYWRlcj5cbiAgICA8Y29udGVudD5cbiAgICAgICAgPGFwcC1jYWxsb3V0IHR5cGU9XCJ3YXJuaW5nXCIgdGl0bGU9XCJ7eyd1cGRhdGVNYXN0ZXJQYXNzd29yZCcgfCBpMThufX1cIj5cbiAgICAgICAgICAgIHt7J3VwZGF0ZU1hc3RlclBhc3N3b3JkV2FybmluZycgfCBpMThufX1cbiAgICAgICAgPC9hcHAtY2FsbG91dD5cbiAgICAgICAgPGFwcC1jYWxsb3V0IHR5cGU9XCJpbmZvXCIgW2VuZm9yY2VkUG9saWN5T3B0aW9uc109XCJlbmZvcmNlZFBvbGljeU9wdGlvbnNcIiAqbmdJZj1cImVuZm9yY2VkUG9saWN5T3B0aW9uc1wiPlxuICAgICAgICA8L2FwcC1jYWxsb3V0PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYm94XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWNvbnRlbnQtcm93XCIgYXBwQm94Um93PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWNvbnRlbnQtcm93LWZsZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3ctbWFpblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJtYXN0ZXJQYXNzd29yZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eydtYXN0ZXJQYXNzJyB8IGkxOG59fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Ryb25nIGNsYXNzPVwic3ViLWxhYmVsIHRleHQte3ttYXN0ZXJQYXNzd29yZFNjb3JlU3R5bGUuQ29sb3J9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIm1hc3RlclBhc3N3b3JkU2NvcmVTdHlsZS5UZXh0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e21hc3RlclBhc3N3b3JkU2NvcmVTdHlsZS5UZXh0fX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdHJvbmc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9XCJtYXN0ZXJQYXNzd29yZFwiIHR5cGU9XCJ7e3Nob3dQYXNzd29yZCA/ICd0ZXh0JyA6ICdwYXNzd29yZCd9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJNYXN0ZXJQYXNzd29yZFwiIGNsYXNzPVwibW9ub3NwYWNlZFwiIFsobmdNb2RlbCldPVwibWFzdGVyUGFzc3dvcmRcIiByZXF1aXJlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBJbnB1dFZlcmJhdGltIChpbnB1dCk9XCJ1cGRhdGVQYXNzd29yZFN0cmVuZ3RoKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFjdGlvbi1idXR0b25zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJyb3ctYnRuXCIgYXBwU3RvcENsaWNrIGFwcEJsdXJDbGlja1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBBMTF5VGl0bGU9XCJ7eyd0b2dnbGVWaXNpYmlsaXR5JyB8IGkxOG59fVwiIChjbGljayk9XCJ0b2dnbGVQYXNzd29yZChmYWxzZSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1sZ1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2ZhLWV5ZSc6ICFzaG93UGFzc3dvcmQsICdmYS1leWUtc2xhc2gnOiBzaG93UGFzc3dvcmR9XCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3NcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcy1iYXIgYmcte3ttYXN0ZXJQYXNzd29yZFNjb3JlU3R5bGUuQ29sb3J9fVwiIHJvbGU9XCJwcm9ncmVzc2JhclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS12YWx1ZW5vdz1cIjBcIiBhcmlhLXZhbHVlbWluPVwiMFwiIGFyaWEtdmFsdWVtYXg9XCIxMDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInt3aWR0aDogKG1hc3RlclBhc3N3b3JkU2NvcmVTdHlsZS5XaWR0aCArICclJyl9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyLmFyaWEtdmFsdWVub3c9XCJ7e21hc3RlclBhc3N3b3JkU2NvcmVTdHlsZS5XaWR0aH19XCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYm94XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWNvbnRlbnQtcm93IGJveC1jb250ZW50LXJvdy1mbGV4XCIgYXBwQm94Um93PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93LW1haW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJtYXN0ZXJQYXNzd29yZFJldHlwZVwiPnt7J3JlVHlwZU1hc3RlclBhc3MnIHwgaTE4bn19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD1cIm1hc3RlclBhc3N3b3JkUmV0eXBlXCIgdHlwZT1cInt7c2hvd1Bhc3N3b3JkID8gJ3RleHQnIDogJ3Bhc3N3b3JkJ319XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPVwiTWFzdGVyUGFzc3dvcmRSZXR5cGVcIiBjbGFzcz1cIm1vbm9zcGFjZWRcIiBbKG5nTW9kZWwpXT1cIm1hc3RlclBhc3N3b3JkUmV0eXBlXCIgcmVxdWlyZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBJbnB1dFZlcmJhdGltPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFjdGlvbi1idXR0b25zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInJvdy1idG5cIiBhcHBTdG9wQ2xpY2sgYXBwQmx1ckNsaWNrXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwQTExeVRpdGxlPVwie3sndG9nZ2xlVmlzaWJpbGl0eScgfCBpMThufX1cIiAoY2xpY2spPVwidG9nZ2xlUGFzc3dvcmQodHJ1ZSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWxnXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydmYS1leWUnOiAhc2hvd1Bhc3N3b3JkLCAnZmEtZXllLXNsYXNoJzogc2hvd1Bhc3N3b3JkfVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImJveFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50LXJvd1wiIGFwcEJveFJvdz5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImhpbnRcIj57eydtYXN0ZXJQYXNzSGludCcgfCBpMThufX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9XCJoaW50XCIgdHlwZT1cInRleHRcIiBuYW1lPVwiSGludFwiIFsobmdNb2RlbCldPVwiaGludFwiPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWZvb3RlclwiPlxuICAgICAgICAgICAgICAgIHt7J21hc3RlclBhc3NIaW50RGVzYycgfCBpMThufX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2NvbnRlbnQ+XG48L2Zvcm0+XG4iLCJpbXBvcnQge1xuICAgIGFuaW1hdGUsXG4gICAgZ3JvdXAsXG4gICAgcXVlcnksXG4gICAgc3R5bGUsXG4gICAgdHJhbnNpdGlvbixcbiAgICB0cmlnZ2VyLFxufSBmcm9tICdAYW5ndWxhci9hbmltYXRpb25zJztcblxuaW1wb3J0IHsgQnJvd3NlckFwaSB9IGZyb20gJy4uL2Jyb3dzZXIvYnJvd3NlckFwaSc7XG5cbmNvbnN0IHF1ZXJ5U2hvd24gPSBxdWVyeSgnOmVudGVyLCA6bGVhdmUnLCBbXG4gICAgc3R5bGUoeyBwb3NpdGlvbjogJ2ZpeGVkJywgd2lkdGg6ICcxMDAlJywgaGVpZ2h0OiAnMTAwJScgfSksXG5dLCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xuXG4vLyByZWY6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvaXNzdWVzLzE1NDc3XG5jb25zdCBxdWVyeUNoaWxkUm91dGUgPSBxdWVyeSgncm91dGVyLW91dGxldCB+IConLCBbXG4gICAgc3R5bGUoe30pLFxuICAgIGFuaW1hdGUoMSwgc3R5bGUoe30pKSxcbl0sIHsgb3B0aW9uYWw6IHRydWUgfSk7XG5cbmNvbnN0IHNwZWVkID0gJzAuNHMnO1xuXG5leHBvcnQgZnVuY3Rpb24gcXVlcnlUcmFuc2xhdGUoZGlyZWN0aW9uOiBzdHJpbmcsIGF4aXM6IHN0cmluZywgZnJvbTogbnVtYmVyLCB0bzogbnVtYmVyLCB6SW5kZXg6IG51bWJlciA9IDEwMDApIHtcbiAgICByZXR1cm4gcXVlcnkoJzonICsgZGlyZWN0aW9uLCBbXG4gICAgICAgIHN0eWxlKHsgdHJhbnNmb3JtOiAndHJhbnNsYXRlJyArIGF4aXMgKyAnKCcgKyBmcm9tICsgJyUpJywgekluZGV4OiB6SW5kZXgsIGJveFNoYWRvdzogJzAgM3B4IDJweCAtMnB4IGdyYXknIH0pLFxuICAgICAgICBhbmltYXRlKHNwZWVkICsgJyBlYXNlLWluLW91dCcsIHN0eWxlKHsgdHJhbnNmb3JtOiAndHJhbnNsYXRlJyArIGF4aXMgKyAnKCcgKyB0byArICclKScgfSkpLFxuICAgIF0sIHsgb3B0aW9uYWw6IHRydWUgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBxdWVyeVRyYW5zbGF0ZVgoZGlyZWN0aW9uOiBzdHJpbmcsIGZyb206IG51bWJlciwgdG86IG51bWJlciwgekluZGV4OiBudW1iZXIgPSAxMDAwKSB7XG4gICAgcmV0dXJuIHF1ZXJ5VHJhbnNsYXRlKGRpcmVjdGlvbiwgJ1gnLCBmcm9tLCB0bywgekluZGV4KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHF1ZXJ5VHJhbnNsYXRlWShkaXJlY3Rpb246IHN0cmluZywgZnJvbTogbnVtYmVyLCB0bzogbnVtYmVyLCB6SW5kZXg6IG51bWJlciA9IDEwMDApIHtcbiAgICByZXR1cm4gcXVlcnlUcmFuc2xhdGUoZGlyZWN0aW9uLCAnWScsIGZyb20sIHRvLCB6SW5kZXgpO1xufVxuXG5jb25zdCBpblNsaWRlTGVmdCA9IFtcbiAgICBxdWVyeVNob3duLFxuICAgIGdyb3VwKFtcbiAgICAgICAgcXVlcnlUcmFuc2xhdGVYKCdlbnRlcicsIDEwMCwgMCksXG4gICAgICAgIHF1ZXJ5VHJhbnNsYXRlWCgnbGVhdmUnLCAwLCAtMTAwKSxcbiAgICAgICAgcXVlcnlDaGlsZFJvdXRlLFxuICAgIF0pLFxuXTtcblxuY29uc3Qgb3V0U2xpZGVSaWdodCA9IFtcbiAgICBxdWVyeVNob3duLFxuICAgIGdyb3VwKFtcbiAgICAgICAgcXVlcnlUcmFuc2xhdGVYKCdlbnRlcicsIC0xMDAsIDApLFxuICAgICAgICBxdWVyeVRyYW5zbGF0ZVgoJ2xlYXZlJywgMCwgMTAwKSxcbiAgICBdKSxcbl07XG5cbmNvbnN0IGluU2xpZGVVcCA9IFtcbiAgICBxdWVyeVNob3duLFxuICAgIGdyb3VwKFtcbiAgICAgICAgcXVlcnlUcmFuc2xhdGVZKCdlbnRlcicsIDEwMCwgMCwgMTAxMCksXG4gICAgICAgIHF1ZXJ5VHJhbnNsYXRlWSgnbGVhdmUnLCAwLCAwKSxcbiAgICAgICAgcXVlcnlDaGlsZFJvdXRlLFxuICAgIF0pLFxuXTtcblxuY29uc3Qgb3V0U2xpZGVEb3duID0gW1xuICAgIHF1ZXJ5U2hvd24sXG4gICAgZ3JvdXAoW1xuICAgICAgICBxdWVyeVRyYW5zbGF0ZVkoJ2VudGVyJywgMCwgMCksXG4gICAgICAgIHF1ZXJ5VHJhbnNsYXRlWSgnbGVhdmUnLCAwLCAxMDAsIDEwMTApLFxuICAgIF0pLFxuXTtcblxuY29uc3QgaW5TbGlkZURvd24gPSBbXG4gICAgcXVlcnlTaG93bixcbiAgICBncm91cChbXG4gICAgICAgIHF1ZXJ5VHJhbnNsYXRlWSgnZW50ZXInLCAtMTAwLCAwLCAxMDEwKSxcbiAgICAgICAgcXVlcnlUcmFuc2xhdGVZKCdsZWF2ZScsIDAsIDApLFxuICAgICAgICBxdWVyeUNoaWxkUm91dGUsXG4gICAgXSksXG5dO1xuXG5jb25zdCBvdXRTbGlkZVVwID0gW1xuICAgIHF1ZXJ5U2hvd24sXG4gICAgZ3JvdXAoW1xuICAgICAgICBxdWVyeVRyYW5zbGF0ZVkoJ2VudGVyJywgMCwgMCksXG4gICAgICAgIHF1ZXJ5VHJhbnNsYXRlWSgnbGVhdmUnLCAwLCAtMTAwLCAxMDEwKSxcbiAgICBdKSxcbl07XG5cbmV4cG9ydCBmdW5jdGlvbiB0YWJzVG9DaXBoZXJzKGZyb21TdGF0ZTogc3RyaW5nLCB0b1N0YXRlOiBzdHJpbmcpIHtcbiAgICBpZiAoZnJvbVN0YXRlID09IG51bGwgfHwgdG9TdGF0ZSA9PT0gbnVsbCB8fCB0b1N0YXRlLmluZGV4T2YoJ2NpcGhlcnNfJykgPT09IC0xKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIChmcm9tU3RhdGUuaW5kZXhPZignY2lwaGVyc18nKSA9PT0gMCAmJiBmcm9tU3RhdGUuaW5kZXhPZignY2lwaGVyc19kaXJlY3Rpb249YicpID09PSAtMSkgfHxcbiAgICAgICAgZnJvbVN0YXRlID09PSAndGFicyc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjaXBoZXJzVG9UYWJzKGZyb21TdGF0ZTogc3RyaW5nLCB0b1N0YXRlOiBzdHJpbmcpIHtcbiAgICBpZiAoZnJvbVN0YXRlID09IG51bGwgfHwgdG9TdGF0ZSA9PT0gbnVsbCB8fCBmcm9tU3RhdGUuaW5kZXhPZignY2lwaGVyc18nKSA9PT0gLTEpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdG9TdGF0ZS5pbmRleE9mKCdjaXBoZXJzX2RpcmVjdGlvbj1iJykgPT09IDAgfHwgdG9TdGF0ZSA9PT0gJ3RhYnMnO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2lwaGVyc1RvVmlldyhmcm9tU3RhdGU6IHN0cmluZywgdG9TdGF0ZTogc3RyaW5nKSB7XG4gICAgaWYgKGZyb21TdGF0ZSA9PSBudWxsIHx8IHRvU3RhdGUgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gZnJvbVN0YXRlLmluZGV4T2YoJ2NpcGhlcnNfJykgPT09IDAgJiZcbiAgICAgICAgKHRvU3RhdGUgPT09ICd2aWV3LWNpcGhlcicgfHwgdG9TdGF0ZSA9PT0gJ2FkZC1jaXBoZXInIHx8IHRvU3RhdGUgPT09ICdjbG9uZS1jaXBoZXInKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZpZXdUb0NpcGhlcnMoZnJvbVN0YXRlOiBzdHJpbmcsIHRvU3RhdGU6IHN0cmluZykge1xuICAgIGlmIChmcm9tU3RhdGUgPT0gbnVsbCB8fCB0b1N0YXRlID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIChmcm9tU3RhdGUgPT09ICd2aWV3LWNpcGhlcicgfHwgZnJvbVN0YXRlID09PSAnYWRkLWNpcGhlcicgfHwgZnJvbVN0YXRlID09PSAnY2xvbmUtY2lwaGVyJykgJiZcbiAgICAgICAgdG9TdGF0ZS5pbmRleE9mKCdjaXBoZXJzXycpID09PSAwO1xufVxuXG5leHBvcnQgY29uc3Qgcm91dGVyVHJhbnNpdGlvbiA9IHRyaWdnZXIoJ3JvdXRlclRyYW5zaXRpb24nLCBbXG4gICAgdHJhbnNpdGlvbigndm9pZCA9PiBob21lJywgaW5TbGlkZUxlZnQpLFxuICAgIHRyYW5zaXRpb24oJ3ZvaWQgPT4gdGFicycsIGluU2xpZGVMZWZ0KSxcblxuICAgIHRyYW5zaXRpb24oJ2hvbWUgPT4gZW52aXJvbm1lbnQsIGhvbWUgPT4gbG9naW4sIGhvbWUgPT4gcmVnaXN0ZXInLCBpblNsaWRlVXApLFxuXG4gICAgdHJhbnNpdGlvbignbG9naW4gPT4gaG9tZScsIG91dFNsaWRlRG93biksXG4gICAgdHJhbnNpdGlvbignbG9naW4gPT4gaGludCcsIGluU2xpZGVVcCksXG4gICAgdHJhbnNpdGlvbignbG9naW4gPT4gdGFicywgbG9naW4gPT4gMmZhJywgaW5TbGlkZUxlZnQpLFxuXG4gICAgdHJhbnNpdGlvbignaGludCA9PiBsb2dpbiwgcmVnaXN0ZXIgPT4gaG9tZSwgZW52aXJvbm1lbnQgPT4gaG9tZScsIG91dFNsaWRlRG93biksXG5cbiAgICB0cmFuc2l0aW9uKCcyZmEgPT4gbG9naW4nLCBvdXRTbGlkZVJpZ2h0KSxcbiAgICB0cmFuc2l0aW9uKCcyZmEgPT4gMmZhLW9wdGlvbnMnLCBpblNsaWRlVXApLFxuICAgIHRyYW5zaXRpb24oJzJmYS1vcHRpb25zID0+IDJmYScsIG91dFNsaWRlRG93biksXG4gICAgdHJhbnNpdGlvbignMmZhID0+IHRhYnMnLCBpblNsaWRlTGVmdCksXG5cbiAgICB0cmFuc2l0aW9uKHRhYnNUb0NpcGhlcnMsIGluU2xpZGVMZWZ0KSxcbiAgICB0cmFuc2l0aW9uKGNpcGhlcnNUb1RhYnMsIG91dFNsaWRlUmlnaHQpLFxuXG4gICAgdHJhbnNpdGlvbihjaXBoZXJzVG9WaWV3LCBpblNsaWRlVXApLFxuICAgIHRyYW5zaXRpb24odmlld1RvQ2lwaGVycywgb3V0U2xpZGVEb3duKSxcblxuICAgIHRyYW5zaXRpb24oJ3RhYnMgPT4gdmlldy1jaXBoZXInLCBpblNsaWRlVXApLFxuICAgIHRyYW5zaXRpb24oJ3ZpZXctY2lwaGVyID0+IHRhYnMnLCBvdXRTbGlkZURvd24pLFxuXG4gICAgdHJhbnNpdGlvbigndmlldy1jaXBoZXIgPT4gZWRpdC1jaXBoZXIsIHZpZXctY2lwaGVyID0+IGNpcGhlci1wYXNzd29yZC1oaXN0b3J5JywgaW5TbGlkZVVwKSxcbiAgICB0cmFuc2l0aW9uKCdlZGl0LWNpcGhlciA9PiB2aWV3LWNpcGhlciwgY2lwaGVyLXBhc3N3b3JkLWhpc3RvcnkgPT4gdmlldy1jaXBoZXIsIGVkaXQtY2lwaGVyID0+IHRhYnMnLCBvdXRTbGlkZURvd24pLFxuXG4gICAgdHJhbnNpdGlvbigndmlldy1jaXBoZXIgPT4gY2xvbmUtY2lwaGVyJywgaW5TbGlkZVVwKSxcbiAgICB0cmFuc2l0aW9uKCdjbG9uZS1jaXBoZXIgPT4gdmlldy1jaXBoZXIsIGNsb25lLWNpcGhlciA9PiB0YWJzJywgb3V0U2xpZGVEb3duKSxcblxuICAgIHRyYW5zaXRpb24oJ3ZpZXctY2lwaGVyID0+IHNoYXJlLWNpcGhlcicsIGluU2xpZGVVcCksXG4gICAgdHJhbnNpdGlvbignc2hhcmUtY2lwaGVyID0+IHZpZXctY2lwaGVyJywgb3V0U2xpZGVEb3duKSxcblxuICAgIHRyYW5zaXRpb24oJ3RhYnMgPT4gYWRkLWNpcGhlcicsIGluU2xpZGVVcCksXG4gICAgdHJhbnNpdGlvbignYWRkLWNpcGhlciA9PiB0YWJzJywgb3V0U2xpZGVEb3duKSxcblxuICAgIHRyYW5zaXRpb24oJ2dlbmVyYXRvciA9PiBnZW5lcmF0b3ItaGlzdG9yeSwgdGFicyA9PiBnZW5lcmF0b3ItaGlzdG9yeScsIGluU2xpZGVMZWZ0KSxcbiAgICB0cmFuc2l0aW9uKCdnZW5lcmF0b3ItaGlzdG9yeSA9PiBnZW5lcmF0b3IsIGdlbmVyYXRvci1oaXN0b3J5ID0+IHRhYnMnLCBvdXRTbGlkZVJpZ2h0KSxcblxuICAgIHRyYW5zaXRpb24oJ2FkZC1jaXBoZXIgPT4gZ2VuZXJhdG9yLCBlZGl0LWNpcGhlciA9PiBnZW5lcmF0b3IsIGNsb25lLWNpcGhlciA9PiBnZW5lcmF0b3InLCBpblNsaWRlVXApLFxuICAgIHRyYW5zaXRpb24oJ2dlbmVyYXRvciA9PiBhZGQtY2lwaGVyLCBnZW5lcmF0b3IgPT4gZWRpdC1jaXBoZXIsIGdlbmVyYXRvciA9PiBjbG9uZS1jaXBoZXInLCBvdXRTbGlkZURvd24pLFxuXG4gICAgdHJhbnNpdGlvbignZWRpdC1jaXBoZXIgPT4gYXR0YWNobWVudHMsIGVkaXQtY2lwaGVyID0+IGNvbGxlY3Rpb25zJywgaW5TbGlkZUxlZnQpLFxuICAgIHRyYW5zaXRpb24oJ2F0dGFjaG1lbnRzID0+IGVkaXQtY2lwaGVyLCBjb2xsZWN0aW9ucyA9PiBlZGl0LWNpcGhlcicsIG91dFNsaWRlUmlnaHQpLFxuXG4gICAgdHJhbnNpdGlvbignY2xvbmUtY2lwaGVyID0+IGF0dGFjaG1lbnRzLCBjbG9uZS1jaXBoZXIgPT4gY29sbGVjdGlvbnMnLCBpblNsaWRlTGVmdCksXG4gICAgdHJhbnNpdGlvbignYXR0YWNobWVudHMgPT4gY2xvbmUtY2lwaGVyLCBjb2xsZWN0aW9ucyA9PiBjbG9uZS1jaXBoZXInLCBvdXRTbGlkZVJpZ2h0KSxcblxuICAgIHRyYW5zaXRpb24oJ3RhYnMgPT4gZXhwb3J0JywgaW5TbGlkZUxlZnQpLFxuICAgIHRyYW5zaXRpb24oJ2V4cG9ydCA9PiB0YWJzJywgb3V0U2xpZGVSaWdodCksXG5cbiAgICB0cmFuc2l0aW9uKCd0YWJzID0+IGZvbGRlcnMnLCBpblNsaWRlTGVmdCksXG4gICAgdHJhbnNpdGlvbignZm9sZGVycyA9PiB0YWJzJywgb3V0U2xpZGVSaWdodCksXG5cbiAgICB0cmFuc2l0aW9uKCdmb2xkZXJzID0+IGVkaXQtZm9sZGVyLCBmb2xkZXJzID0+IGFkZC1mb2xkZXInLCBpblNsaWRlVXApLFxuICAgIHRyYW5zaXRpb24oJ2VkaXQtZm9sZGVyID0+IGZvbGRlcnMsIGFkZC1mb2xkZXIgPT4gZm9sZGVycycsIG91dFNsaWRlRG93biksXG5cbiAgICB0cmFuc2l0aW9uKCd0YWJzID0+IHN5bmMnLCBpblNsaWRlTGVmdCksXG4gICAgdHJhbnNpdGlvbignc3luYyA9PiB0YWJzJywgb3V0U2xpZGVSaWdodCksXG5cbiAgICB0cmFuc2l0aW9uKCd0YWJzID0+IG9wdGlvbnMnLCBpblNsaWRlTGVmdCksXG4gICAgdHJhbnNpdGlvbignb3B0aW9ucyA9PiB0YWJzJywgb3V0U2xpZGVSaWdodCksXG5cbiAgICB0cmFuc2l0aW9uKCd0YWJzID0+IHByZW1pdW0nLCBpblNsaWRlTGVmdCksXG4gICAgdHJhbnNpdGlvbigncHJlbWl1bSA9PiB0YWJzJywgb3V0U2xpZGVSaWdodCksXG5cbiAgICB0cmFuc2l0aW9uKCd0YWJzID0+IGxvY2snLCBpblNsaWRlRG93biksXG5cbiAgICB0cmFuc2l0aW9uKCd0YWJzID0+IHNlbmQtdHlwZScsIGluU2xpZGVMZWZ0KSxcbiAgICB0cmFuc2l0aW9uKCdzZW5kLXR5cGUgPT4gdGFicycsIG91dFNsaWRlUmlnaHQpLFxuXG4gICAgdHJhbnNpdGlvbigndGFicyA9PiBhZGQtc2VuZCwgc2VuZC10eXBlID0+IGFkZC1zZW5kJywgaW5TbGlkZVVwKSxcbiAgICB0cmFuc2l0aW9uKCdhZGQtc2VuZCA9PiB0YWJzLCBhZGQtc2VuZCA9PiBzZW5kLXR5cGUnLCBvdXRTbGlkZURvd24pLFxuXG4gICAgdHJhbnNpdGlvbigndGFicyA9PiBlZGl0LXNlbmQsIHNlbmQtdHlwZSA9PiBlZGl0LXNlbmQnLCBpblNsaWRlVXApLFxuICAgIHRyYW5zaXRpb24oJ2VkaXQtc2VuZCA9PiB0YWJzLCBlZGl0LXNlbmQgPT4gc2VuZC10eXBlJywgb3V0U2xpZGVEb3duKSxcbl0pO1xuIiwiaW1wb3J0IHsgSW5qZWN0YWJsZSwgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gICAgQWN0aXZhdGVkUm91dGVTbmFwc2hvdCxcbiAgICBSb3V0ZVJldXNlU3RyYXRlZ3ksXG4gICAgUm91dGVyTW9kdWxlLFxuICAgIFJvdXRlcyxcbn0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcblxuaW1wb3J0IHsgQXV0aEd1YXJkU2VydmljZSB9IGZyb20gJ2pzbGliLWFuZ3VsYXIvc2VydmljZXMvYXV0aC1ndWFyZC5zZXJ2aWNlJztcblxuaW1wb3J0IHsgRGVib3VuY2VOYXZpZ2F0aW9uU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvZGVib3VuY2VOYXZpZ2F0aW9uU2VydmljZSc7XG5pbXBvcnQgeyBMYXVuY2hHdWFyZFNlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL2xhdW5jaC1ndWFyZC5zZXJ2aWNlJztcbmltcG9ydCB7IExvY2tHdWFyZFNlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL2xvY2stZ3VhcmQuc2VydmljZSc7XG5cbmltcG9ydCB7IEVudmlyb25tZW50Q29tcG9uZW50IH0gZnJvbSAnLi9hY2NvdW50cy9lbnZpcm9ubWVudC5jb21wb25lbnQnO1xuaW1wb3J0IHsgSGludENvbXBvbmVudCB9IGZyb20gJy4vYWNjb3VudHMvaGludC5jb21wb25lbnQnO1xuaW1wb3J0IHsgSG9tZUNvbXBvbmVudCB9IGZyb20gJy4vYWNjb3VudHMvaG9tZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgTG9ja0NvbXBvbmVudCB9IGZyb20gJy4vYWNjb3VudHMvbG9jay5jb21wb25lbnQnO1xuaW1wb3J0IHsgTG9naW5Db21wb25lbnQgfSBmcm9tICcuL2FjY291bnRzL2xvZ2luLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBSZWdpc3RlckNvbXBvbmVudCB9IGZyb20gJy4vYWNjb3VudHMvcmVnaXN0ZXIuY29tcG9uZW50JztcbmltcG9ydCB7IFNldFBhc3N3b3JkQ29tcG9uZW50IH0gZnJvbSAnLi9hY2NvdW50cy9zZXQtcGFzc3dvcmQuY29tcG9uZW50JztcbmltcG9ydCB7IFNzb0NvbXBvbmVudCB9IGZyb20gJy4vYWNjb3VudHMvc3NvLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBUd29GYWN0b3JPcHRpb25zQ29tcG9uZW50IH0gZnJvbSAnLi9hY2NvdW50cy90d28tZmFjdG9yLW9wdGlvbnMuY29tcG9uZW50JztcbmltcG9ydCB7IFR3b0ZhY3RvckNvbXBvbmVudCB9IGZyb20gJy4vYWNjb3VudHMvdHdvLWZhY3Rvci5jb21wb25lbnQnO1xuaW1wb3J0IHsgVXBkYXRlVGVtcFBhc3N3b3JkQ29tcG9uZW50IH0gZnJvbSAnLi9hY2NvdW50cy91cGRhdGUtdGVtcC1wYXNzd29yZC5jb21wb25lbnQnO1xuXG5pbXBvcnQgeyBQYXNzd29yZEdlbmVyYXRvckhpc3RvcnlDb21wb25lbnQgfSBmcm9tICcuL2dlbmVyYXRvci9wYXNzd29yZC1nZW5lcmF0b3ItaGlzdG9yeS5jb21wb25lbnQnO1xuaW1wb3J0IHsgUGFzc3dvcmRHZW5lcmF0b3JDb21wb25lbnQgfSBmcm9tICcuL2dlbmVyYXRvci9wYXNzd29yZC1nZW5lcmF0b3IuY29tcG9uZW50JztcblxuaW1wb3J0IHsgUHJpdmF0ZU1vZGVDb21wb25lbnQgfSBmcm9tICcuL3ByaXZhdGUtbW9kZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgVGFic0NvbXBvbmVudCB9IGZyb20gJy4vdGFicy5jb21wb25lbnQnO1xuXG5pbXBvcnQgeyBFeGNsdWRlZERvbWFpbnNDb21wb25lbnQgfSBmcm9tICcuL3NldHRpbmdzL2V4Y2x1ZGVkLWRvbWFpbnMuY29tcG9uZW50JztcbmltcG9ydCB7IEV4cG9ydENvbXBvbmVudCB9IGZyb20gJy4vc2V0dGluZ3MvZXhwb3J0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBGb2xkZXJBZGRFZGl0Q29tcG9uZW50IH0gZnJvbSAnLi9zZXR0aW5ncy9mb2xkZXItYWRkLWVkaXQuY29tcG9uZW50JztcbmltcG9ydCB7IEZvbGRlcnNDb21wb25lbnQgfSBmcm9tICcuL3NldHRpbmdzL2ZvbGRlcnMuY29tcG9uZW50JztcbmltcG9ydCB7IE9wdGlvbnNDb21wb25lbnQgfSBmcm9tICcuL3NldHRpbmdzL29wdGlvbnMuY29tcG9uZW50JztcbmltcG9ydCB7IFByZW1pdW1Db21wb25lbnQgfSBmcm9tICcuL3NldHRpbmdzL3ByZW1pdW0uY29tcG9uZW50JztcbmltcG9ydCB7IFNldHRpbmdzQ29tcG9uZW50IH0gZnJvbSAnLi9zZXR0aW5ncy9zZXR0aW5ncy5jb21wb25lbnQnO1xuaW1wb3J0IHsgU3luY0NvbXBvbmVudCB9IGZyb20gJy4vc2V0dGluZ3Mvc3luYy5jb21wb25lbnQnO1xuXG5pbXBvcnQgeyBBZGRFZGl0Q29tcG9uZW50IH0gZnJvbSAnLi92YXVsdC9hZGQtZWRpdC5jb21wb25lbnQnO1xuaW1wb3J0IHsgQXR0YWNobWVudHNDb21wb25lbnQgfSBmcm9tICcuL3ZhdWx0L2F0dGFjaG1lbnRzLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDaXBoZXJzQ29tcG9uZW50IH0gZnJvbSAnLi92YXVsdC9jaXBoZXJzLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uc0NvbXBvbmVudCB9IGZyb20gJy4vdmF1bHQvY29sbGVjdGlvbnMuY29tcG9uZW50JztcbmltcG9ydCB7IEN1cnJlbnRUYWJDb21wb25lbnQgfSBmcm9tICcuL3ZhdWx0L2N1cnJlbnQtdGFiLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBHcm91cGluZ3NDb21wb25lbnQgfSBmcm9tICcuL3ZhdWx0L2dyb3VwaW5ncy5jb21wb25lbnQnO1xuaW1wb3J0IHsgUGFzc3dvcmRIaXN0b3J5Q29tcG9uZW50IH0gZnJvbSAnLi92YXVsdC9wYXNzd29yZC1oaXN0b3J5LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTaGFyZUNvbXBvbmVudCB9IGZyb20gJy4vdmF1bHQvc2hhcmUuY29tcG9uZW50JztcbmltcG9ydCB7IFZpZXdDb21wb25lbnQgfSBmcm9tICcuL3ZhdWx0L3ZpZXcuY29tcG9uZW50JztcblxuaW1wb3J0IHsgU2VuZEFkZEVkaXRDb21wb25lbnQgfSBmcm9tICcuL3NlbmQvc2VuZC1hZGQtZWRpdC5jb21wb25lbnQnO1xuaW1wb3J0IHsgU2VuZEdyb3VwaW5nc0NvbXBvbmVudCB9IGZyb20gJy4vc2VuZC9zZW5kLWdyb3VwaW5ncy5jb21wb25lbnQnO1xuaW1wb3J0IHsgU2VuZFR5cGVDb21wb25lbnQgfSBmcm9tICcuL3NlbmQvc2VuZC10eXBlLmNvbXBvbmVudCc7XG5cbmNvbnN0IHJvdXRlczogUm91dGVzID0gW1xuICAgIHtcbiAgICAgICAgcGF0aDogJycsXG4gICAgICAgIHJlZGlyZWN0VG86ICdob21lJyxcbiAgICAgICAgcGF0aE1hdGNoOiAnZnVsbCcsXG4gICAgfSxcbiAgICB7XG4gICAgICAgIHBhdGg6ICd2YXVsdCcsXG4gICAgICAgIHJlZGlyZWN0VG86ICcvdGFicy92YXVsdCcsXG4gICAgICAgIHBhdGhNYXRjaDogJ2Z1bGwnLFxuICAgIH0sXG4gICAge1xuICAgICAgICBwYXRoOiAnaG9tZScsXG4gICAgICAgIGNvbXBvbmVudDogSG9tZUNvbXBvbmVudCxcbiAgICAgICAgY2FuQWN0aXZhdGU6IFtMYXVuY2hHdWFyZFNlcnZpY2VdLFxuICAgICAgICBkYXRhOiB7IHN0YXRlOiAnaG9tZScgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgcGF0aDogJ2xvZ2luJyxcbiAgICAgICAgY29tcG9uZW50OiBMb2dpbkNvbXBvbmVudCxcbiAgICAgICAgY2FuQWN0aXZhdGU6IFtMYXVuY2hHdWFyZFNlcnZpY2VdLFxuICAgICAgICBkYXRhOiB7IHN0YXRlOiAnbG9naW4nIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIHBhdGg6ICdsb2NrJyxcbiAgICAgICAgY29tcG9uZW50OiBMb2NrQ29tcG9uZW50LFxuICAgICAgICBjYW5BY3RpdmF0ZTogW0xvY2tHdWFyZFNlcnZpY2VdLFxuICAgICAgICBkYXRhOiB7IHN0YXRlOiAnbG9jaycgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgcGF0aDogJzJmYScsXG4gICAgICAgIGNvbXBvbmVudDogVHdvRmFjdG9yQ29tcG9uZW50LFxuICAgICAgICBjYW5BY3RpdmF0ZTogW0xhdW5jaEd1YXJkU2VydmljZV0sXG4gICAgICAgIGRhdGE6IHsgc3RhdGU6ICcyZmEnIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIHBhdGg6ICcyZmEtb3B0aW9ucycsXG4gICAgICAgIGNvbXBvbmVudDogVHdvRmFjdG9yT3B0aW9uc0NvbXBvbmVudCxcbiAgICAgICAgY2FuQWN0aXZhdGU6IFtMYXVuY2hHdWFyZFNlcnZpY2VdLFxuICAgICAgICBkYXRhOiB7IHN0YXRlOiAnMmZhLW9wdGlvbnMnIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIHBhdGg6ICdzc28nLFxuICAgICAgICBjb21wb25lbnQ6IFNzb0NvbXBvbmVudCxcbiAgICAgICAgY2FuQWN0aXZhdGU6IFtMYXVuY2hHdWFyZFNlcnZpY2VdLFxuICAgICAgICBkYXRhOiB7IHN0YXRlOiAnc3NvJyB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBwYXRoOiAnc2V0LXBhc3N3b3JkJyxcbiAgICAgICAgY29tcG9uZW50OiBTZXRQYXNzd29yZENvbXBvbmVudCxcbiAgICAgICAgZGF0YTogeyBzdGF0ZTogJ3NldC1wYXNzd29yZCcgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgcGF0aDogJ3JlZ2lzdGVyJyxcbiAgICAgICAgY29tcG9uZW50OiBSZWdpc3RlckNvbXBvbmVudCxcbiAgICAgICAgY2FuQWN0aXZhdGU6IFtMYXVuY2hHdWFyZFNlcnZpY2VdLFxuICAgICAgICBkYXRhOiB7IHN0YXRlOiAncmVnaXN0ZXInIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIHBhdGg6ICdoaW50JyxcbiAgICAgICAgY29tcG9uZW50OiBIaW50Q29tcG9uZW50LFxuICAgICAgICBjYW5BY3RpdmF0ZTogW0xhdW5jaEd1YXJkU2VydmljZV0sXG4gICAgICAgIGRhdGE6IHsgc3RhdGU6ICdoaW50JyB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBwYXRoOiAnZW52aXJvbm1lbnQnLFxuICAgICAgICBjb21wb25lbnQ6IEVudmlyb25tZW50Q29tcG9uZW50LFxuICAgICAgICBjYW5BY3RpdmF0ZTogW0xhdW5jaEd1YXJkU2VydmljZV0sXG4gICAgICAgIGRhdGE6IHsgc3RhdGU6ICdlbnZpcm9ubWVudCcgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgcGF0aDogJ2NpcGhlcnMnLFxuICAgICAgICBjb21wb25lbnQ6IENpcGhlcnNDb21wb25lbnQsXG4gICAgICAgIGNhbkFjdGl2YXRlOiBbQXV0aEd1YXJkU2VydmljZV0sXG4gICAgICAgIGRhdGE6IHsgc3RhdGU6ICdjaXBoZXJzJyB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBwYXRoOiAndmlldy1jaXBoZXInLFxuICAgICAgICBjb21wb25lbnQ6IFZpZXdDb21wb25lbnQsXG4gICAgICAgIGNhbkFjdGl2YXRlOiBbQXV0aEd1YXJkU2VydmljZV0sXG4gICAgICAgIGRhdGE6IHsgc3RhdGU6ICd2aWV3LWNpcGhlcicgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgcGF0aDogJ2NpcGhlci1wYXNzd29yZC1oaXN0b3J5JyxcbiAgICAgICAgY29tcG9uZW50OiBQYXNzd29yZEhpc3RvcnlDb21wb25lbnQsXG4gICAgICAgIGNhbkFjdGl2YXRlOiBbQXV0aEd1YXJkU2VydmljZV0sXG4gICAgICAgIGRhdGE6IHsgc3RhdGU6ICdjaXBoZXItcGFzc3dvcmQtaGlzdG9yeScgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgcGF0aDogJ2FkZC1jaXBoZXInLFxuICAgICAgICBjb21wb25lbnQ6IEFkZEVkaXRDb21wb25lbnQsXG4gICAgICAgIGNhbkFjdGl2YXRlOiBbQXV0aEd1YXJkU2VydmljZSwgRGVib3VuY2VOYXZpZ2F0aW9uU2VydmljZV0sXG4gICAgICAgIGRhdGE6IHsgc3RhdGU6ICdhZGQtY2lwaGVyJyB9LFxuICAgICAgICBydW5HdWFyZHNBbmRSZXNvbHZlcnM6ICdhbHdheXMnLFxuICAgIH0sXG4gICAge1xuICAgICAgICBwYXRoOiAnZWRpdC1jaXBoZXInLFxuICAgICAgICBjb21wb25lbnQ6IEFkZEVkaXRDb21wb25lbnQsXG4gICAgICAgIGNhbkFjdGl2YXRlOiBbQXV0aEd1YXJkU2VydmljZSwgRGVib3VuY2VOYXZpZ2F0aW9uU2VydmljZV0sXG4gICAgICAgIGRhdGE6IHsgc3RhdGU6ICdlZGl0LWNpcGhlcicgfSxcbiAgICAgICAgcnVuR3VhcmRzQW5kUmVzb2x2ZXJzOiAnYWx3YXlzJyxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgcGF0aDogJ3NoYXJlLWNpcGhlcicsXG4gICAgICAgIGNvbXBvbmVudDogU2hhcmVDb21wb25lbnQsXG4gICAgICAgIGNhbkFjdGl2YXRlOiBbQXV0aEd1YXJkU2VydmljZV0sXG4gICAgICAgIGRhdGE6IHsgc3RhdGU6ICdzaGFyZS1jaXBoZXInIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIHBhdGg6ICdjb2xsZWN0aW9ucycsXG4gICAgICAgIGNvbXBvbmVudDogQ29sbGVjdGlvbnNDb21wb25lbnQsXG4gICAgICAgIGNhbkFjdGl2YXRlOiBbQXV0aEd1YXJkU2VydmljZV0sXG4gICAgICAgIGRhdGE6IHsgc3RhdGU6ICdjb2xsZWN0aW9ucycgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgcGF0aDogJ2F0dGFjaG1lbnRzJyxcbiAgICAgICAgY29tcG9uZW50OiBBdHRhY2htZW50c0NvbXBvbmVudCxcbiAgICAgICAgY2FuQWN0aXZhdGU6IFtBdXRoR3VhcmRTZXJ2aWNlXSxcbiAgICAgICAgZGF0YTogeyBzdGF0ZTogJ2F0dGFjaG1lbnRzJyB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBwYXRoOiAnZ2VuZXJhdG9yJyxcbiAgICAgICAgY29tcG9uZW50OiBQYXNzd29yZEdlbmVyYXRvckNvbXBvbmVudCxcbiAgICAgICAgY2FuQWN0aXZhdGU6IFtBdXRoR3VhcmRTZXJ2aWNlXSxcbiAgICAgICAgZGF0YTogeyBzdGF0ZTogJ2dlbmVyYXRvcicgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgcGF0aDogJ2dlbmVyYXRvci1oaXN0b3J5JyxcbiAgICAgICAgY29tcG9uZW50OiBQYXNzd29yZEdlbmVyYXRvckhpc3RvcnlDb21wb25lbnQsXG4gICAgICAgIGNhbkFjdGl2YXRlOiBbQXV0aEd1YXJkU2VydmljZV0sXG4gICAgICAgIGRhdGE6IHsgc3RhdGU6ICdnZW5lcmF0b3ItaGlzdG9yeScgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgcGF0aDogJ2V4cG9ydCcsXG4gICAgICAgIGNvbXBvbmVudDogRXhwb3J0Q29tcG9uZW50LFxuICAgICAgICBjYW5BY3RpdmF0ZTogW0F1dGhHdWFyZFNlcnZpY2VdLFxuICAgICAgICBkYXRhOiB7IHN0YXRlOiAnZXhwb3J0JyB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBwYXRoOiAnZm9sZGVycycsXG4gICAgICAgIGNvbXBvbmVudDogRm9sZGVyc0NvbXBvbmVudCxcbiAgICAgICAgY2FuQWN0aXZhdGU6IFtBdXRoR3VhcmRTZXJ2aWNlXSxcbiAgICAgICAgZGF0YTogeyBzdGF0ZTogJ2ZvbGRlcnMnIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIHBhdGg6ICdhZGQtZm9sZGVyJyxcbiAgICAgICAgY29tcG9uZW50OiBGb2xkZXJBZGRFZGl0Q29tcG9uZW50LFxuICAgICAgICBjYW5BY3RpdmF0ZTogW0F1dGhHdWFyZFNlcnZpY2VdLFxuICAgICAgICBkYXRhOiB7IHN0YXRlOiAnYWRkLWZvbGRlcicgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgcGF0aDogJ2VkaXQtZm9sZGVyJyxcbiAgICAgICAgY29tcG9uZW50OiBGb2xkZXJBZGRFZGl0Q29tcG9uZW50LFxuICAgICAgICBjYW5BY3RpdmF0ZTogW0F1dGhHdWFyZFNlcnZpY2VdLFxuICAgICAgICBkYXRhOiB7IHN0YXRlOiAnZWRpdC1mb2xkZXInIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIHBhdGg6ICdzeW5jJyxcbiAgICAgICAgY29tcG9uZW50OiBTeW5jQ29tcG9uZW50LFxuICAgICAgICBjYW5BY3RpdmF0ZTogW0F1dGhHdWFyZFNlcnZpY2VdLFxuICAgICAgICBkYXRhOiB7IHN0YXRlOiAnc3luYycgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgcGF0aDogJ2V4Y2x1ZGVkLWRvbWFpbnMnLFxuICAgICAgICBjb21wb25lbnQ6IEV4Y2x1ZGVkRG9tYWluc0NvbXBvbmVudCxcbiAgICAgICAgY2FuQWN0aXZhdGU6IFtBdXRoR3VhcmRTZXJ2aWNlXSxcbiAgICAgICAgZGF0YTogeyBzdGF0ZTogJ2V4Y2x1ZGVkLWRvbWFpbnMnIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIHBhdGg6ICdwcmVtaXVtJyxcbiAgICAgICAgY29tcG9uZW50OiBQcmVtaXVtQ29tcG9uZW50LFxuICAgICAgICBjYW5BY3RpdmF0ZTogW0F1dGhHdWFyZFNlcnZpY2VdLFxuICAgICAgICBkYXRhOiB7IHN0YXRlOiAncHJlbWl1bScgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgcGF0aDogJ29wdGlvbnMnLFxuICAgICAgICBjb21wb25lbnQ6IE9wdGlvbnNDb21wb25lbnQsXG4gICAgICAgIGNhbkFjdGl2YXRlOiBbQXV0aEd1YXJkU2VydmljZV0sXG4gICAgICAgIGRhdGE6IHsgc3RhdGU6ICdvcHRpb25zJyB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBwYXRoOiAncHJpdmF0ZS1tb2RlJyxcbiAgICAgICAgY29tcG9uZW50OiBQcml2YXRlTW9kZUNvbXBvbmVudCxcbiAgICAgICAgZGF0YTogeyBzdGF0ZTogJ3ByaXZhdGUtbW9kZScgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgcGF0aDogJ2Nsb25lLWNpcGhlcicsXG4gICAgICAgIGNvbXBvbmVudDogQWRkRWRpdENvbXBvbmVudCxcbiAgICAgICAgY2FuQWN0aXZhdGU6IFtBdXRoR3VhcmRTZXJ2aWNlXSxcbiAgICAgICAgZGF0YTogeyBzdGF0ZTogJ2Nsb25lLWNpcGhlcicgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgcGF0aDogJ3NlbmQtdHlwZScsXG4gICAgICAgIGNvbXBvbmVudDogU2VuZFR5cGVDb21wb25lbnQsXG4gICAgICAgIGNhbkFjdGl2YXRlOiBbQXV0aEd1YXJkU2VydmljZV0sXG4gICAgICAgIGRhdGE6IHsgc3RhdGU6ICdzZW5kLXR5cGUnIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIHBhdGg6ICdhZGQtc2VuZCcsXG4gICAgICAgIGNvbXBvbmVudDogU2VuZEFkZEVkaXRDb21wb25lbnQsXG4gICAgICAgIGNhbkFjdGl2YXRlOiBbQXV0aEd1YXJkU2VydmljZV0sXG4gICAgICAgIGRhdGE6IHsgc3RhdGU6ICdhZGQtc2VuZCcgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgcGF0aDogJ2VkaXQtc2VuZCcsXG4gICAgICAgIGNvbXBvbmVudDogU2VuZEFkZEVkaXRDb21wb25lbnQsXG4gICAgICAgIGNhbkFjdGl2YXRlOiBbQXV0aEd1YXJkU2VydmljZV0sXG4gICAgICAgIGRhdGE6IHsgc3RhdGU6ICdlZGl0LXNlbmQnIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIHBhdGg6ICd1cGRhdGUtdGVtcC1wYXNzd29yZCcsXG4gICAgICAgIGNvbXBvbmVudDogVXBkYXRlVGVtcFBhc3N3b3JkQ29tcG9uZW50LFxuICAgICAgICBjYW5BY3RpdmF0ZTogW0F1dGhHdWFyZFNlcnZpY2VdLFxuICAgICAgICBkYXRhOiB7IHN0YXRlOiAndXBkYXRlLXRlbXAtcGFzc3dvcmQnIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIHBhdGg6ICd0YWJzJyxcbiAgICAgICAgY29tcG9uZW50OiBUYWJzQ29tcG9uZW50LFxuICAgICAgICBkYXRhOiB7IHN0YXRlOiAndGFicycgfSxcbiAgICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwYXRoOiAnJyxcbiAgICAgICAgICAgICAgICByZWRpcmVjdFRvOiAnL3RhYnMvdmF1bHQnLFxuICAgICAgICAgICAgICAgIHBhdGhNYXRjaDogJ2Z1bGwnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwYXRoOiAnY3VycmVudCcsXG4gICAgICAgICAgICAgICAgY29tcG9uZW50OiBDdXJyZW50VGFiQ29tcG9uZW50LFxuICAgICAgICAgICAgICAgIGNhbkFjdGl2YXRlOiBbQXV0aEd1YXJkU2VydmljZV0sXG4gICAgICAgICAgICAgICAgZGF0YTogeyBzdGF0ZTogJ3RhYnNfY3VycmVudCcgfSxcbiAgICAgICAgICAgICAgICBydW5HdWFyZHNBbmRSZXNvbHZlcnM6ICdhbHdheXMnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwYXRoOiAndmF1bHQnLFxuICAgICAgICAgICAgICAgIGNvbXBvbmVudDogR3JvdXBpbmdzQ29tcG9uZW50LFxuICAgICAgICAgICAgICAgIGNhbkFjdGl2YXRlOiBbQXV0aEd1YXJkU2VydmljZV0sXG4gICAgICAgICAgICAgICAgZGF0YTogeyBzdGF0ZTogJ3RhYnNfdmF1bHQnIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHBhdGg6ICdnZW5lcmF0b3InLFxuICAgICAgICAgICAgICAgIGNvbXBvbmVudDogUGFzc3dvcmRHZW5lcmF0b3JDb21wb25lbnQsXG4gICAgICAgICAgICAgICAgY2FuQWN0aXZhdGU6IFtBdXRoR3VhcmRTZXJ2aWNlXSxcbiAgICAgICAgICAgICAgICBkYXRhOiB7IHN0YXRlOiAndGFic19nZW5lcmF0b3InIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHBhdGg6ICdzZXR0aW5ncycsXG4gICAgICAgICAgICAgICAgY29tcG9uZW50OiBTZXR0aW5nc0NvbXBvbmVudCxcbiAgICAgICAgICAgICAgICBjYW5BY3RpdmF0ZTogW0F1dGhHdWFyZFNlcnZpY2VdLFxuICAgICAgICAgICAgICAgIGRhdGE6IHsgc3RhdGU6ICd0YWJzX3NldHRpbmdzJyB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwYXRoOiAnc2VuZCcsXG4gICAgICAgICAgICAgICAgY29tcG9uZW50OiBTZW5kR3JvdXBpbmdzQ29tcG9uZW50LFxuICAgICAgICAgICAgICAgIGNhbkFjdGl2YXRlOiBbQXV0aEd1YXJkU2VydmljZV0sXG4gICAgICAgICAgICAgICAgZGF0YTogeyBzdGF0ZTogJ3RhYnNfc2VuZCcgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgfSxcbl07XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBOb1JvdXRlUmV1c2VTdHJhdGVneSBpbXBsZW1lbnRzIFJvdXRlUmV1c2VTdHJhdGVneSB7XG4gICAgc2hvdWxkRGV0YWNoKHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90KSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBzdG9yZShyb3V0ZTogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCwgaGFuZGxlOiB7fSkgeyAvKiBOb3RoaW5nICovIH1cblxuICAgIHNob3VsZEF0dGFjaChyb3V0ZTogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0cmlldmUocm91dGU6IEFjdGl2YXRlZFJvdXRlU25hcHNob3QpOiBhbnkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBzaG91bGRSZXVzZVJvdXRlKGZ1dHVyZTogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCwgY3VycjogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuXG5ATmdNb2R1bGUoe1xuICAgIGltcG9ydHM6IFtSb3V0ZXJNb2R1bGUuZm9yUm9vdChyb3V0ZXMsIHtcbiAgICAgICAgdXNlSGFzaDogdHJ1ZSxcbiAgICAgICAgb25TYW1lVXJsTmF2aWdhdGlvbjogJ3JlbG9hZCcsXG4gICAgICAgIC8qZW5hYmxlVHJhY2luZzogdHJ1ZSwqL1xuICAgIH0pXSxcbiAgICBleHBvcnRzOiBbUm91dGVyTW9kdWxlXSxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgeyBwcm92aWRlOiBSb3V0ZVJldXNlU3RyYXRlZ3ksIHVzZUNsYXNzOiBOb1JvdXRlUmV1c2VTdHJhdGVneSB9LFxuICAgIF0sXG59KVxuZXhwb3J0IGNsYXNzIEFwcFJvdXRpbmdNb2R1bGUgeyB9XG4iLCJpbXBvcnQgeyBCcm93c2VyQXBpIH0gZnJvbSAnLi4vYnJvd3Nlci9icm93c2VyQXBpJztcblxuaW1wb3J0IHtcbiAgICBCb2R5T3V0cHV0VHlwZSxcbiAgICBUb2FzdCxcbiAgICBUb2FzdGVyQ29uZmlnLFxuICAgIFRvYXN0ZXJTZXJ2aWNlLFxufSBmcm9tICdhbmd1bGFyMi10b2FzdGVyJztcbmltcG9ydCBTd2FsLCB7IFN3ZWV0QWxlcnRJY29uIH0gZnJvbSAnc3dlZXRhbGVydDIvc3JjL3N3ZWV0YWxlcnQyLmpzJztcblxuaW1wb3J0IHtcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBDb21wb25lbnQsXG4gICAgTmdab25lLFxuICAgIE9uSW5pdCxcbiAgICBTZWN1cml0eUNvbnRleHQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRG9tU2FuaXRpemVyIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5pbXBvcnQge1xuICAgIE5hdmlnYXRpb25FbmQsXG4gICAgUm91dGVyLFxuICAgIFJvdXRlck91dGxldCxcbn0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcblxuaW1wb3J0IHsgQnJvYWRjYXN0ZXJTZXJ2aWNlIH0gZnJvbSAnanNsaWItYW5ndWxhci9zZXJ2aWNlcy9icm9hZGNhc3Rlci5zZXJ2aWNlJztcblxuaW1wb3J0IHsgQXV0aFNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL2F1dGguc2VydmljZSc7XG5pbXBvcnQgeyBJMThuU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvaTE4bi5zZXJ2aWNlJztcbmltcG9ydCB7IE1lc3NhZ2luZ1NlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL21lc3NhZ2luZy5zZXJ2aWNlJztcbmltcG9ydCB7IFBsYXRmb3JtVXRpbHNTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9wbGF0Zm9ybVV0aWxzLnNlcnZpY2UnO1xuaW1wb3J0IHsgU3RhdGVTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9zdGF0ZS5zZXJ2aWNlJztcbmltcG9ydCB7IFN0b3JhZ2VTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9zdG9yYWdlLnNlcnZpY2UnO1xuXG5pbXBvcnQgeyBDb25zdGFudHNTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL3NlcnZpY2VzL2NvbnN0YW50cy5zZXJ2aWNlJztcblxuaW1wb3J0IEJyb3dzZXJQbGF0Zm9ybVV0aWxzU2VydmljZSBmcm9tICdzcmMvc2VydmljZXMvYnJvd3NlclBsYXRmb3JtVXRpbHMuc2VydmljZSc7XG5pbXBvcnQgeyByb3V0ZXJUcmFuc2l0aW9uIH0gZnJvbSAnLi9hcHAtcm91dGluZy5hbmltYXRpb25zJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdhcHAtcm9vdCcsXG4gICAgc3R5bGVzOiBbXSxcbiAgICBhbmltYXRpb25zOiBbcm91dGVyVHJhbnNpdGlvbl0sXG4gICAgdGVtcGxhdGU6IGBcbiAgICAgICAgPHRvYXN0ZXItY29udGFpbmVyIFt0b2FzdGVyY29uZmlnXT1cInRvYXN0ZXJDb25maWdcIiBhcmlhLWxpdmU9XCJwb2xpdGVcIj48L3RvYXN0ZXItY29udGFpbmVyPlxuICAgICAgICA8bWFpbiBbQHJvdXRlclRyYW5zaXRpb25dPVwiZ2V0U3RhdGUobylcIj5cbiAgICAgICAgICAgIDxyb3V0ZXItb3V0bGV0ICNvPVwib3V0bGV0XCI+PC9yb3V0ZXItb3V0bGV0PlxuICAgICAgICA8L21haW4+YCxcbn0pXG5leHBvcnQgY2xhc3MgQXBwQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgICB0b2FzdGVyQ29uZmlnOiBUb2FzdGVyQ29uZmlnID0gbmV3IFRvYXN0ZXJDb25maWcoe1xuICAgICAgICBzaG93Q2xvc2VCdXR0b246IGZhbHNlLFxuICAgICAgICBtb3VzZW92ZXJUaW1lclN0b3A6IHRydWUsXG4gICAgICAgIGFuaW1hdGlvbjogJ3NsaWRlVXAnLFxuICAgICAgICBsaW1pdDogMixcbiAgICAgICAgcG9zaXRpb25DbGFzczogJ3RvYXN0LWJvdHRvbS1mdWxsLXdpZHRoJyxcbiAgICAgICAgbmV3ZXN0T25Ub3A6IGZhbHNlLFxuICAgIH0pO1xuXG4gICAgcHJpdmF0ZSBsYXN0QWN0aXZpdHk6IG51bWJlciA9IG51bGw7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHRvYXN0ZXJTZXJ2aWNlOiBUb2FzdGVyU2VydmljZSwgcHJpdmF0ZSBzdG9yYWdlU2VydmljZTogU3RvcmFnZVNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgYnJvYWRjYXN0ZXJTZXJ2aWNlOiBCcm9hZGNhc3RlclNlcnZpY2UsIHByaXZhdGUgYXV0aFNlcnZpY2U6IEF1dGhTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGkxOG5TZXJ2aWNlOiBJMThuU2VydmljZSwgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcbiAgICAgICAgcHJpdmF0ZSBzdGF0ZVNlcnZpY2U6IFN0YXRlU2VydmljZSwgcHJpdmF0ZSBtZXNzYWdpbmdTZXJ2aWNlOiBNZXNzYWdpbmdTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGNoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZiwgcHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZSxcbiAgICAgICAgcHJpdmF0ZSBzYW5pdGl6ZXI6IERvbVNhbml0aXplciwgcHJpdmF0ZSBwbGF0Zm9ybVV0aWxzU2VydmljZTogUGxhdGZvcm1VdGlsc1NlcnZpY2UpIHsgfVxuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIGlmIChCcm93c2VyQXBpLmdldEJhY2tncm91bmRQYWdlKCkgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAgICAgd2luZG93Lm9ubW91c2Vtb3ZlID0gKCkgPT4gdGhpcy5yZWNvcmRBY3Rpdml0eSgpO1xuICAgICAgICAgICAgd2luZG93Lm9ubW91c2Vkb3duID0gKCkgPT4gdGhpcy5yZWNvcmRBY3Rpdml0eSgpO1xuICAgICAgICAgICAgd2luZG93Lm9udG91Y2hzdGFydCA9ICgpID0+IHRoaXMucmVjb3JkQWN0aXZpdHkoKTtcbiAgICAgICAgICAgIHdpbmRvdy5vbmNsaWNrID0gKCkgPT4gdGhpcy5yZWNvcmRBY3Rpdml0eSgpO1xuICAgICAgICAgICAgd2luZG93Lm9uc2Nyb2xsID0gKCkgPT4gdGhpcy5yZWNvcmRBY3Rpdml0eSgpO1xuICAgICAgICAgICAgd2luZG93Lm9ua2V5cHJlc3MgPSAoKSA9PiB0aGlzLnJlY29yZEFjdGl2aXR5KCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgICh3aW5kb3cgYXMgYW55KS5iaXR3YXJkZW5Qb3B1cE1haW5NZXNzYWdlTGlzdGVuZXIgPSBhc3luYyAobXNnOiBhbnksIHNlbmRlcjogYW55LCBzZW5kUmVzcG9uc2U6IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKG1zZy5jb21tYW5kID09PSAnZG9uZUxvZ2dpbmdPdXQnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hdXRoU2VydmljZS5sb2dPdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1zZy5leHBpcmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zaG93VG9hc3Qoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnd2FybmluZycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiB0aGlzLmkxOG5TZXJ2aWNlLnQoJ2xvZ2dlZE91dCcpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiB0aGlzLmkxOG5TZXJ2aWNlLnQoJ2xvZ2luRXhwaXJlZCcpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWydob21lJ10pO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0ZVNlcnZpY2UucHVyZ2UoKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtc2cuY29tbWFuZCA9PT0gJ2F1dGhCbG9ja2VkJykge1xuICAgICAgICAgICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnaG9tZSddKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobXNnLmNvbW1hbmQgPT09ICdsb2NrZWQnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZVNlcnZpY2UucHVyZ2UoKTtcbiAgICAgICAgICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJ2xvY2snXSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1zZy5jb21tYW5kID09PSAnc2hvd0RpYWxvZycpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnNob3dEaWFsb2cobXNnKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobXNnLmNvbW1hbmQgPT09ICdzaG93VG9hc3QnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zaG93VG9hc3QobXNnKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobXNnLmNvbW1hbmQgPT09ICdyZWxvYWRQcm9jZXNzJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHdpbmRvd1JlbG9hZCA9IHRoaXMucGxhdGZvcm1VdGlsc1NlcnZpY2UuaXNTYWZhcmkoKSB8fFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsYXRmb3JtVXRpbHNTZXJ2aWNlLmlzRmlyZWZveCgpIHx8IHRoaXMucGxhdGZvcm1VdGlsc1NlcnZpY2UuaXNPcGVyYSgpO1xuICAgICAgICAgICAgICAgIGlmICh3aW5kb3dSZWxvYWQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gV2FpdCB0byBtYWtlIHN1cmUgYmFja2dyb3VuZCBoYXMgcmVsb2FkZWQgZmlyc3QuXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IEJyb3dzZXJBcGkucmVsb2FkRXh0ZW5zaW9uKHdpbmRvdyksIDIwMDApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAobXNnLmNvbW1hbmQgPT09ICdyZWxvYWRQb3B1cCcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy8nXSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG1zZy53ZWJFeHRTZW5kZXIgPSBzZW5kZXI7XG4gICAgICAgICAgICAgICAgdGhpcy5icm9hZGNhc3RlclNlcnZpY2Uuc2VuZChtc2cpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIEJyb3dzZXJBcGkubWVzc2FnZUxpc3RlbmVyKCdhcHAuY29tcG9uZW50JywgKHdpbmRvdyBhcyBhbnkpLmJpdHdhcmRlblBvcHVwTWFpbk1lc3NhZ2VMaXN0ZW5lcik7XG5cbiAgICAgICAgdGhpcy5yb3V0ZXIuZXZlbnRzLnN1YnNjcmliZShldmVudCA9PiB7XG4gICAgICAgICAgICBpZiAoZXZlbnQgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uRW5kKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdXJsID0gZXZlbnQudXJsQWZ0ZXJSZWRpcmVjdHMgfHwgZXZlbnQudXJsIHx8ICcnO1xuICAgICAgICAgICAgICAgIGlmICh1cmwuc3RhcnRzV2l0aCgnL3RhYnMvJykgJiYgKHdpbmRvdyBhcyBhbnkpLnByZXZpb3VzUG9wdXBVcmwgIT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgICAgICAod2luZG93IGFzIGFueSkucHJldmlvdXNQb3B1cFVybC5zdGFydHNXaXRoKCcvdGFicy8nKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXRlU2VydmljZS5yZW1vdmUoJ0dyb3VwaW5nc0NvbXBvbmVudCcpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXRlU2VydmljZS5yZW1vdmUoJ0dyb3VwaW5nc0NvbXBvbmVudFNjb3BlJyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnJlbW92ZSgnQ2lwaGVyc0NvbXBvbmVudCcpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXRlU2VydmljZS5yZW1vdmUoJ1NlbmRHcm91cGluZ3NDb21wb25lbnQnKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0ZVNlcnZpY2UucmVtb3ZlKCdTZW5kR3JvdXBpbmdzQ29tcG9uZW50U2NvcGUnKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0ZVNlcnZpY2UucmVtb3ZlKCdTZW5kVHlwZUNvbXBvbmVudCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodXJsLnN0YXJ0c1dpdGgoJy90YWJzLycpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnJlbW92ZSgnYWRkRWRpdENpcGhlckluZm8nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKHdpbmRvdyBhcyBhbnkpLnByZXZpb3VzUG9wdXBVcmwgPSB1cmw7XG5cbiAgICAgICAgICAgICAgICAvLyBDbGVhciByb3V0ZSBkaXJlY3Rpb24gYWZ0ZXIgYW5pbWF0aW9uICg0MDBtcylcbiAgICAgICAgICAgICAgICBpZiAoKHdpbmRvdyBhcyBhbnkpLnJvdXRlRGlyZWN0aW9uICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgKHdpbmRvdyBhcyBhbnkpLnJvdXRlRGlyZWN0aW9uID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfSwgNDAwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGdldFN0YXRlKG91dGxldDogUm91dGVyT3V0bGV0KSB7XG4gICAgICAgIGlmIChvdXRsZXQuYWN0aXZhdGVkUm91dGVEYXRhLnN0YXRlID09PSAnY2lwaGVycycpIHtcbiAgICAgICAgICAgIGNvbnN0IHJvdXRlRGlyZWN0aW9uID0gKHdpbmRvdyBhcyBhbnkpLnJvdXRlRGlyZWN0aW9uICE9IG51bGwgPyAod2luZG93IGFzIGFueSkucm91dGVEaXJlY3Rpb24gOiAnJztcbiAgICAgICAgICAgIHJldHVybiAnY2lwaGVyc19kaXJlY3Rpb249JyArIHJvdXRlRGlyZWN0aW9uICsgJ18nICtcbiAgICAgICAgICAgICAgICAob3V0bGV0LmFjdGl2YXRlZFJvdXRlLnF1ZXJ5UGFyYW1zIGFzIGFueSkudmFsdWUuZm9sZGVySWQgKyAnXycgK1xuICAgICAgICAgICAgICAgIChvdXRsZXQuYWN0aXZhdGVkUm91dGUucXVlcnlQYXJhbXMgYXMgYW55KS52YWx1ZS5jb2xsZWN0aW9uSWQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gb3V0bGV0LmFjdGl2YXRlZFJvdXRlRGF0YS5zdGF0ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgcmVjb3JkQWN0aXZpdHkoKSB7XG4gICAgICAgIGNvbnN0IG5vdyA9IChuZXcgRGF0ZSgpKS5nZXRUaW1lKCk7XG4gICAgICAgIGlmICh0aGlzLmxhc3RBY3Rpdml0eSAhPSBudWxsICYmIG5vdyAtIHRoaXMubGFzdEFjdGl2aXR5IDwgMjUwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmxhc3RBY3Rpdml0eSA9IG5vdztcbiAgICAgICAgdGhpcy5zdG9yYWdlU2VydmljZS5zYXZlKENvbnN0YW50c1NlcnZpY2UubGFzdEFjdGl2ZUtleSwgbm93KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNob3dUb2FzdChtc2c6IGFueSkge1xuICAgICAgICBjb25zdCB0b2FzdDogVG9hc3QgPSB7XG4gICAgICAgICAgICB0eXBlOiBtc2cudHlwZSxcbiAgICAgICAgICAgIHRpdGxlOiBtc2cudGl0bGUsXG4gICAgICAgIH07XG4gICAgICAgIGlmICh0eXBlb2YgKG1zZy50ZXh0KSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHRvYXN0LmJvZHkgPSBtc2cudGV4dDtcbiAgICAgICAgfSBlbHNlIGlmIChtc2cudGV4dC5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHRvYXN0LmJvZHkgPSBtc2cudGV4dFswXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBtZXNzYWdlID0gJyc7XG4gICAgICAgICAgICBtc2cudGV4dC5mb3JFYWNoKCh0OiBzdHJpbmcpID0+XG4gICAgICAgICAgICAgICAgbWVzc2FnZSArPSAoJzxwPicgKyB0aGlzLnNhbml0aXplci5zYW5pdGl6ZShTZWN1cml0eUNvbnRleHQuSFRNTCwgdCkgKyAnPC9wPicpKTtcbiAgICAgICAgICAgIHRvYXN0LmJvZHkgPSBtZXNzYWdlO1xuICAgICAgICAgICAgdG9hc3QuYm9keU91dHB1dFR5cGUgPSBCb2R5T3V0cHV0VHlwZS5UcnVzdGVkSHRtbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAobXNnLm9wdGlvbnMgIT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKG1zZy5vcHRpb25zLnRydXN0ZWRIdG1sID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgdG9hc3QuYm9keU91dHB1dFR5cGUgPSBCb2R5T3V0cHV0VHlwZS5UcnVzdGVkSHRtbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtc2cub3B0aW9ucy50aW1lb3V0ICE9IG51bGwgJiYgbXNnLm9wdGlvbnMudGltZW91dCA+IDApIHtcbiAgICAgICAgICAgICAgICB0b2FzdC50aW1lb3V0ID0gbXNnLm9wdGlvbnMudGltZW91dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnRvYXN0ZXJTZXJ2aWNlLnBvcEFzeW5jKHRvYXN0KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHNob3dEaWFsb2cobXNnOiBhbnkpIHtcbiAgICAgICAgbGV0IGljb25DbGFzc2VzOiBzdHJpbmcgPSBudWxsO1xuICAgICAgICBjb25zdCB0eXBlID0gbXNnLnR5cGU7XG4gICAgICAgIGlmICh0eXBlICE9IG51bGwpIHtcbiAgICAgICAgICAgIC8vIElmIHlvdSBhZGQgY3VzdG9tIHR5cGVzIHRvIHRoaXMgcGFydCwgdGhlIHR5cGUgdG8gU3dlZXRBbGVydEljb24gY2FzdCBiZWxvdyBuZWVkcyB0byBiZSBjaGFuZ2VkLlxuICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnc3VjY2Vzcyc6XG4gICAgICAgICAgICAgICAgICAgIGljb25DbGFzc2VzID0gJ2ZhLWNoZWNrIHRleHQtc3VjY2Vzcyc7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3dhcm5pbmcnOlxuICAgICAgICAgICAgICAgICAgICBpY29uQ2xhc3NlcyA9ICdmYS13YXJuaW5nIHRleHQtd2FybmluZyc7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2Vycm9yJzpcbiAgICAgICAgICAgICAgICAgICAgaWNvbkNsYXNzZXMgPSAnZmEtYm9sdCB0ZXh0LWRhbmdlcic7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2luZm8nOlxuICAgICAgICAgICAgICAgICAgICBpY29uQ2xhc3NlcyA9ICdmYS1pbmZvLWNpcmNsZSB0ZXh0LWluZm8nO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNhbmNlbFRleHQgPSBtc2cuY2FuY2VsVGV4dDtcbiAgICAgICAgY29uc3QgY29uZmlybVRleHQgPSBtc2cuY29uZmlybVRleHQ7XG4gICAgICAgIGNvbnN0IGNvbmZpcm1lZCA9IGF3YWl0IFN3YWwuZmlyZSh7XG4gICAgICAgICAgICBoZWlnaHRBdXRvOiBmYWxzZSxcbiAgICAgICAgICAgIGJ1dHRvbnNTdHlsaW5nOiBmYWxzZSxcbiAgICAgICAgICAgIGljb246IHR5cGUgYXMgU3dlZXRBbGVydEljb24sIC8vIHJlcXVpcmVkIHRvIGJlIGFueSBvZiB0aGUgU3dlZXRBbGVydEljb25zIHRvIG91dHB1dCB0aGUgaWNvbkh0bWwuXG4gICAgICAgICAgICBpY29uSHRtbDogaWNvbkNsYXNzZXMgIT0gbnVsbCA/IGA8aSBjbGFzcz1cInN3YWwtY3VzdG9tLWljb24gZmEgJHtpY29uQ2xhc3Nlc31cIj48L2k+YCA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHRleHQ6IG1zZy50ZXh0LFxuICAgICAgICAgICAgaHRtbDogbXNnLmh0bWwsXG4gICAgICAgICAgICB0aXRsZVRleHQ6IG1zZy50aXRsZSxcbiAgICAgICAgICAgIHNob3dDYW5jZWxCdXR0b246IChjYW5jZWxUZXh0ICE9IG51bGwpLFxuICAgICAgICAgICAgY2FuY2VsQnV0dG9uVGV4dDogY2FuY2VsVGV4dCxcbiAgICAgICAgICAgIHNob3dDb25maXJtQnV0dG9uOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlybUJ1dHRvblRleHQ6IGNvbmZpcm1UZXh0ID09IG51bGwgPyB0aGlzLmkxOG5TZXJ2aWNlLnQoJ29rJykgOiBjb25maXJtVGV4dCxcbiAgICAgICAgICAgIHRpbWVyOiAzMDAwMDAsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMubWVzc2FnaW5nU2VydmljZS5zZW5kKCdzaG93RGlhbG9nUmVzb2x2ZScsIHtcbiAgICAgICAgICAgIGRpYWxvZ0lkOiBtc2cuZGlhbG9nSWQsXG4gICAgICAgICAgICBjb25maXJtZWQ6IGNvbmZpcm1lZC52YWx1ZSxcbiAgICAgICAgfSk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgQTExeU1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9hMTF5JztcbmltcG9ydCB7IERyYWdEcm9wTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2RyYWctZHJvcCc7XG5pbXBvcnQgeyBTY3JvbGxpbmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jZGsvc2Nyb2xsaW5nJztcbmltcG9ydCB7IFRvYXN0ZXJNb2R1bGUgfSBmcm9tICdhbmd1bGFyMi10b2FzdGVyJztcblxuaW1wb3J0IHsgQXBwUm91dGluZ01vZHVsZSB9IGZyb20gJy4vYXBwLXJvdXRpbmcubW9kdWxlJztcbmltcG9ydCB7IFNlcnZpY2VzTW9kdWxlIH0gZnJvbSAnLi9zZXJ2aWNlcy9zZXJ2aWNlcy5tb2R1bGUnO1xuXG5pbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUsIFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBCcm93c2VyTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5pbXBvcnQgeyBCcm93c2VyQW5pbWF0aW9uc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXIvYW5pbWF0aW9ucyc7XG5cbmltcG9ydCB7IEVudmlyb25tZW50Q29tcG9uZW50IH0gZnJvbSAnLi9hY2NvdW50cy9lbnZpcm9ubWVudC5jb21wb25lbnQnO1xuaW1wb3J0IHsgSGludENvbXBvbmVudCB9IGZyb20gJy4vYWNjb3VudHMvaGludC5jb21wb25lbnQnO1xuaW1wb3J0IHsgSG9tZUNvbXBvbmVudCB9IGZyb20gJy4vYWNjb3VudHMvaG9tZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgTG9ja0NvbXBvbmVudCB9IGZyb20gJy4vYWNjb3VudHMvbG9jay5jb21wb25lbnQnO1xuaW1wb3J0IHsgTG9naW5Db21wb25lbnQgfSBmcm9tICcuL2FjY291bnRzL2xvZ2luLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBSZWdpc3RlckNvbXBvbmVudCB9IGZyb20gJy4vYWNjb3VudHMvcmVnaXN0ZXIuY29tcG9uZW50JztcbmltcG9ydCB7IFNldFBhc3N3b3JkQ29tcG9uZW50IH0gZnJvbSAnLi9hY2NvdW50cy9zZXQtcGFzc3dvcmQuY29tcG9uZW50JztcbmltcG9ydCB7IFNzb0NvbXBvbmVudCB9IGZyb20gJy4vYWNjb3VudHMvc3NvLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBUd29GYWN0b3JPcHRpb25zQ29tcG9uZW50IH0gZnJvbSAnLi9hY2NvdW50cy90d28tZmFjdG9yLW9wdGlvbnMuY29tcG9uZW50JztcbmltcG9ydCB7IFR3b0ZhY3RvckNvbXBvbmVudCB9IGZyb20gJy4vYWNjb3VudHMvdHdvLWZhY3Rvci5jb21wb25lbnQnO1xuaW1wb3J0IHsgVXBkYXRlVGVtcFBhc3N3b3JkQ29tcG9uZW50IH0gZnJvbSAnLi9hY2NvdW50cy91cGRhdGUtdGVtcC1wYXNzd29yZC5jb21wb25lbnQnO1xuXG5pbXBvcnQgeyBQYXNzd29yZEdlbmVyYXRvckhpc3RvcnlDb21wb25lbnQgfSBmcm9tICcuL2dlbmVyYXRvci9wYXNzd29yZC1nZW5lcmF0b3ItaGlzdG9yeS5jb21wb25lbnQnO1xuaW1wb3J0IHsgUGFzc3dvcmRHZW5lcmF0b3JDb21wb25lbnQgfSBmcm9tICcuL2dlbmVyYXRvci9wYXNzd29yZC1nZW5lcmF0b3IuY29tcG9uZW50JztcblxuaW1wb3J0IHsgQXBwQ29tcG9uZW50IH0gZnJvbSAnLi9hcHAuY29tcG9uZW50JztcbmltcG9ydCB7IFByaXZhdGVNb2RlQ29tcG9uZW50IH0gZnJvbSAnLi9wcml2YXRlLW1vZGUuY29tcG9uZW50JztcbmltcG9ydCB7IFRhYnNDb21wb25lbnQgfSBmcm9tICcuL3RhYnMuY29tcG9uZW50JztcblxuaW1wb3J0IHsgRXhjbHVkZWREb21haW5zQ29tcG9uZW50IH0gZnJvbSAnLi9zZXR0aW5ncy9leGNsdWRlZC1kb21haW5zLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBFeHBvcnRDb21wb25lbnQgfSBmcm9tICcuL3NldHRpbmdzL2V4cG9ydC5jb21wb25lbnQnO1xuaW1wb3J0IHsgRm9sZGVyQWRkRWRpdENvbXBvbmVudCB9IGZyb20gJy4vc2V0dGluZ3MvZm9sZGVyLWFkZC1lZGl0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBGb2xkZXJzQ29tcG9uZW50IH0gZnJvbSAnLi9zZXR0aW5ncy9mb2xkZXJzLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBPcHRpb25zQ29tcG9uZW50IH0gZnJvbSAnLi9zZXR0aW5ncy9vcHRpb25zLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBQcmVtaXVtQ29tcG9uZW50IH0gZnJvbSAnLi9zZXR0aW5ncy9wcmVtaXVtLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTZXR0aW5nc0NvbXBvbmVudCB9IGZyb20gJy4vc2V0dGluZ3Mvc2V0dGluZ3MuY29tcG9uZW50JztcbmltcG9ydCB7IFN5bmNDb21wb25lbnQgfSBmcm9tICcuL3NldHRpbmdzL3N5bmMuY29tcG9uZW50JztcbmltcG9ydCB7IFZhdWx0VGltZW91dElucHV0Q29tcG9uZW50IH0gZnJvbSAnLi9zZXR0aW5ncy92YXVsdC10aW1lb3V0LWlucHV0LmNvbXBvbmVudCc7XG5cbmltcG9ydCB7IEFkZEVkaXRDdXN0b21GaWVsZHNDb21wb25lbnQgfSBmcm9tICcuL3ZhdWx0L2FkZC1lZGl0LWN1c3RvbS1maWVsZHMuY29tcG9uZW50JztcbmltcG9ydCB7IEFkZEVkaXRDb21wb25lbnQgfSBmcm9tICcuL3ZhdWx0L2FkZC1lZGl0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBBdHRhY2htZW50c0NvbXBvbmVudCB9IGZyb20gJy4vdmF1bHQvYXR0YWNobWVudHMuY29tcG9uZW50JztcbmltcG9ydCB7IENpcGhlcnNDb21wb25lbnQgfSBmcm9tICcuL3ZhdWx0L2NpcGhlcnMuY29tcG9uZW50JztcbmltcG9ydCB7IENvbGxlY3Rpb25zQ29tcG9uZW50IH0gZnJvbSAnLi92YXVsdC9jb2xsZWN0aW9ucy5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ3VycmVudFRhYkNvbXBvbmVudCB9IGZyb20gJy4vdmF1bHQvY3VycmVudC10YWIuY29tcG9uZW50JztcbmltcG9ydCB7IEdyb3VwaW5nc0NvbXBvbmVudCB9IGZyb20gJy4vdmF1bHQvZ3JvdXBpbmdzLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBQYXNzd29yZEhpc3RvcnlDb21wb25lbnQgfSBmcm9tICcuL3ZhdWx0L3Bhc3N3b3JkLWhpc3RvcnkuY29tcG9uZW50JztcbmltcG9ydCB7IFNoYXJlQ29tcG9uZW50IH0gZnJvbSAnLi92YXVsdC9zaGFyZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgVmlld0N1c3RvbUZpZWxkc0NvbXBvbmVudCB9IGZyb20gJy4vdmF1bHQvdmlldy1jdXN0b20tZmllbGRzLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBWaWV3Q29tcG9uZW50IH0gZnJvbSAnLi92YXVsdC92aWV3LmNvbXBvbmVudCc7XG5cbmltcG9ydCB7IEVmZmx1eERhdGVzQ29tcG9uZW50IGFzIFNlbmRFZmZsdXhEYXRlc0NvbXBvbmVudCB9IGZyb20gJy4vc2VuZC9lZmZsdXgtZGF0ZXMuY29tcG9uZW50JztcbmltcG9ydCB7IFNlbmRBZGRFZGl0Q29tcG9uZW50IH0gZnJvbSAnLi9zZW5kL3NlbmQtYWRkLWVkaXQuY29tcG9uZW50JztcbmltcG9ydCB7IFNlbmRHcm91cGluZ3NDb21wb25lbnQgfSBmcm9tICcuL3NlbmQvc2VuZC1ncm91cGluZ3MuY29tcG9uZW50JztcbmltcG9ydCB7IFNlbmRUeXBlQ29tcG9uZW50IH0gZnJvbSAnLi9zZW5kL3NlbmQtdHlwZS5jb21wb25lbnQnO1xuXG5pbXBvcnQgeyBBMTF5VGl0bGVEaXJlY3RpdmUgfSBmcm9tICdqc2xpYi1hbmd1bGFyL2RpcmVjdGl2ZXMvYTExeS10aXRsZS5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgQXBpQWN0aW9uRGlyZWN0aXZlIH0gZnJvbSAnanNsaWItYW5ndWxhci9kaXJlY3RpdmVzL2FwaS1hY3Rpb24uZGlyZWN0aXZlJztcbmltcG9ydCB7IEF1dG9mb2N1c0RpcmVjdGl2ZSB9IGZyb20gJ2pzbGliLWFuZ3VsYXIvZGlyZWN0aXZlcy9hdXRvZm9jdXMuZGlyZWN0aXZlJztcbmltcG9ydCB7IEJsdXJDbGlja0RpcmVjdGl2ZSB9IGZyb20gJ2pzbGliLWFuZ3VsYXIvZGlyZWN0aXZlcy9ibHVyLWNsaWNrLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBCb3hSb3dEaXJlY3RpdmUgfSBmcm9tICdqc2xpYi1hbmd1bGFyL2RpcmVjdGl2ZXMvYm94LXJvdy5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgQ2lwaGVyTGlzdFZpcnR1YWxTY3JvbGwgfSBmcm9tICdqc2xpYi1hbmd1bGFyL2RpcmVjdGl2ZXMvY2lwaGVyTGlzdFZpcnR1YWxTY3JvbGwuZGlyZWN0aXZlJztcbmltcG9ydCB7IEZhbGxiYWNrU3JjRGlyZWN0aXZlIH0gZnJvbSAnanNsaWItYW5ndWxhci9kaXJlY3RpdmVzL2ZhbGxiYWNrLXNyYy5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgSW5wdXRWZXJiYXRpbURpcmVjdGl2ZSB9IGZyb20gJ2pzbGliLWFuZ3VsYXIvZGlyZWN0aXZlcy9pbnB1dC12ZXJiYXRpbS5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgU2VsZWN0Q29weURpcmVjdGl2ZSB9IGZyb20gJ2pzbGliLWFuZ3VsYXIvZGlyZWN0aXZlcy9zZWxlY3QtY29weS5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgU3RvcENsaWNrRGlyZWN0aXZlIH0gZnJvbSAnanNsaWItYW5ndWxhci9kaXJlY3RpdmVzL3N0b3AtY2xpY2suZGlyZWN0aXZlJztcbmltcG9ydCB7IFN0b3BQcm9wRGlyZWN0aXZlIH0gZnJvbSAnanNsaWItYW5ndWxhci9kaXJlY3RpdmVzL3N0b3AtcHJvcC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgVHJ1ZUZhbHNlVmFsdWVEaXJlY3RpdmUgfSBmcm9tICdqc2xpYi1hbmd1bGFyL2RpcmVjdGl2ZXMvdHJ1ZS1mYWxzZS12YWx1ZS5kaXJlY3RpdmUnO1xuXG5pbXBvcnQgeyBDb2xvclBhc3N3b3JkUGlwZSB9IGZyb20gJ2pzbGliLWFuZ3VsYXIvcGlwZXMvY29sb3ItcGFzc3dvcmQucGlwZSc7XG5pbXBvcnQgeyBJMThuUGlwZSB9IGZyb20gJ2pzbGliLWFuZ3VsYXIvcGlwZXMvaTE4bi5waXBlJztcbmltcG9ydCB7IFNlYXJjaENpcGhlcnNQaXBlIH0gZnJvbSAnanNsaWItYW5ndWxhci9waXBlcy9zZWFyY2gtY2lwaGVycy5waXBlJztcblxuaW1wb3J0IHsgQWN0aW9uQnV0dG9uc0NvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9hY3Rpb24tYnV0dG9ucy5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ2lwaGVyUm93Q29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL2NpcGhlci1yb3cuY29tcG9uZW50JztcbmltcG9ydCB7IFBhc3N3b3JkUmVwcm9tcHRDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvcGFzc3dvcmQtcmVwcm9tcHQuY29tcG9uZW50JztcbmltcG9ydCB7IFBvcE91dENvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9wb3Atb3V0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTZW5kTGlzdENvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9zZW5kLWxpc3QuY29tcG9uZW50JztcbmltcG9ydCB7IFNldFBpbkNvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9zZXQtcGluLmNvbXBvbmVudCc7XG5cbmltcG9ydCB7IENhbGxvdXRDb21wb25lbnQgfSBmcm9tICdqc2xpYi1hbmd1bGFyL2NvbXBvbmVudHMvY2FsbG91dC5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWNvbkNvbXBvbmVudCB9IGZyb20gJ2pzbGliLWFuZ3VsYXIvY29tcG9uZW50cy9pY29uLmNvbXBvbmVudCc7XG5cbmltcG9ydCB7XG4gICAgQ3VycmVuY3lQaXBlLFxuICAgIERhdGVQaXBlLFxuICAgIHJlZ2lzdGVyTG9jYWxlRGF0YSxcbn0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCBsb2NhbGVBeiBmcm9tICdAYW5ndWxhci9jb21tb24vbG9jYWxlcy9heic7XG5pbXBvcnQgbG9jYWxlQmUgZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2xvY2FsZXMvYmUnO1xuaW1wb3J0IGxvY2FsZUJnIGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9sb2NhbGVzL2JnJztcbmltcG9ydCBsb2NhbGVCbiBmcm9tICdAYW5ndWxhci9jb21tb24vbG9jYWxlcy9ibic7XG5pbXBvcnQgbG9jYWxlQ2EgZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2xvY2FsZXMvY2EnO1xuaW1wb3J0IGxvY2FsZUNzIGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9sb2NhbGVzL2NzJztcbmltcG9ydCBsb2NhbGVEYSBmcm9tICdAYW5ndWxhci9jb21tb24vbG9jYWxlcy9kYSc7XG5pbXBvcnQgbG9jYWxlRGUgZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2xvY2FsZXMvZGUnO1xuaW1wb3J0IGxvY2FsZUVsIGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9sb2NhbGVzL2VsJztcbmltcG9ydCBsb2NhbGVFbkdiIGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9sb2NhbGVzL2VuLUdCJztcbmltcG9ydCBsb2NhbGVFbkluIGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9sb2NhbGVzL2VuLUlOJztcbmltcG9ydCBsb2NhbGVFcyBmcm9tICdAYW5ndWxhci9jb21tb24vbG9jYWxlcy9lcyc7XG5pbXBvcnQgbG9jYWxlRXQgZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2xvY2FsZXMvZXQnO1xuaW1wb3J0IGxvY2FsZUZhIGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9sb2NhbGVzL2ZhJztcbmltcG9ydCBsb2NhbGVGaSBmcm9tICdAYW5ndWxhci9jb21tb24vbG9jYWxlcy9maSc7XG5pbXBvcnQgbG9jYWxlRnIgZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2xvY2FsZXMvZnInO1xuaW1wb3J0IGxvY2FsZUhlIGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9sb2NhbGVzL2hlJztcbmltcG9ydCBsb2NhbGVIciBmcm9tICdAYW5ndWxhci9jb21tb24vbG9jYWxlcy9ocic7XG5pbXBvcnQgbG9jYWxlSHUgZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2xvY2FsZXMvaHUnO1xuaW1wb3J0IGxvY2FsZUlkIGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9sb2NhbGVzL2lkJztcbmltcG9ydCBsb2NhbGVJdCBmcm9tICdAYW5ndWxhci9jb21tb24vbG9jYWxlcy9pdCc7XG5pbXBvcnQgbG9jYWxlSmEgZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2xvY2FsZXMvamEnO1xuaW1wb3J0IGxvY2FsZUtuIGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9sb2NhbGVzL2tuJztcbmltcG9ydCBsb2NhbGVLbyBmcm9tICdAYW5ndWxhci9jb21tb24vbG9jYWxlcy9rbyc7XG5pbXBvcnQgbG9jYWxlTHYgZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2xvY2FsZXMvbHYnO1xuaW1wb3J0IGxvY2FsZU1sIGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9sb2NhbGVzL21sJztcbmltcG9ydCBsb2NhbGVOYiBmcm9tICdAYW5ndWxhci9jb21tb24vbG9jYWxlcy9uYic7XG5pbXBvcnQgbG9jYWxlTmwgZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2xvY2FsZXMvbmwnO1xuaW1wb3J0IGxvY2FsZVBsIGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9sb2NhbGVzL3BsJztcbmltcG9ydCBsb2NhbGVQdEJyIGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9sb2NhbGVzL3B0JztcbmltcG9ydCBsb2NhbGVQdFB0IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9sb2NhbGVzL3B0LVBUJztcbmltcG9ydCBsb2NhbGVSbyBmcm9tICdAYW5ndWxhci9jb21tb24vbG9jYWxlcy9ybyc7XG5pbXBvcnQgbG9jYWxlUnUgZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2xvY2FsZXMvcnUnO1xuaW1wb3J0IGxvY2FsZVNrIGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9sb2NhbGVzL3NrJztcbmltcG9ydCBsb2NhbGVTciBmcm9tICdAYW5ndWxhci9jb21tb24vbG9jYWxlcy9zcic7XG5pbXBvcnQgbG9jYWxlU3YgZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2xvY2FsZXMvc3YnO1xuaW1wb3J0IGxvY2FsZVRoIGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9sb2NhbGVzL3RoJztcbmltcG9ydCBsb2NhbGVUciBmcm9tICdAYW5ndWxhci9jb21tb24vbG9jYWxlcy90cic7XG5pbXBvcnQgbG9jYWxlVWsgZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2xvY2FsZXMvdWsnO1xuaW1wb3J0IGxvY2FsZVZpIGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9sb2NhbGVzL3ZpJztcbmltcG9ydCBsb2NhbGVaaENuIGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9sb2NhbGVzL3poLUhhbnMnO1xuaW1wb3J0IGxvY2FsZVpoVHcgZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2xvY2FsZXMvemgtSGFudCc7XG5cbnJlZ2lzdGVyTG9jYWxlRGF0YShsb2NhbGVBeiwgJ2F6Jyk7XG5yZWdpc3RlckxvY2FsZURhdGEobG9jYWxlQmUsICdiZScpO1xucmVnaXN0ZXJMb2NhbGVEYXRhKGxvY2FsZUJnLCAnYmcnKTtcbnJlZ2lzdGVyTG9jYWxlRGF0YShsb2NhbGVCbiwgJ2JuJyk7XG5yZWdpc3RlckxvY2FsZURhdGEobG9jYWxlQ2EsICdjYScpO1xucmVnaXN0ZXJMb2NhbGVEYXRhKGxvY2FsZUNzLCAnY3MnKTtcbnJlZ2lzdGVyTG9jYWxlRGF0YShsb2NhbGVEYSwgJ2RhJyk7XG5yZWdpc3RlckxvY2FsZURhdGEobG9jYWxlRGUsICdkZScpO1xucmVnaXN0ZXJMb2NhbGVEYXRhKGxvY2FsZUVsLCAnZWwnKTtcbnJlZ2lzdGVyTG9jYWxlRGF0YShsb2NhbGVFbkdiLCAnZW4tR0InKTtcbnJlZ2lzdGVyTG9jYWxlRGF0YShsb2NhbGVFbkluLCAnZW4tSU4nKTtcbnJlZ2lzdGVyTG9jYWxlRGF0YShsb2NhbGVFcywgJ2VzJyk7XG5yZWdpc3RlckxvY2FsZURhdGEobG9jYWxlRXQsICdldCcpO1xucmVnaXN0ZXJMb2NhbGVEYXRhKGxvY2FsZUZhLCAnZmEnKTtcbnJlZ2lzdGVyTG9jYWxlRGF0YShsb2NhbGVGaSwgJ2ZpJyk7XG5yZWdpc3RlckxvY2FsZURhdGEobG9jYWxlRnIsICdmcicpO1xucmVnaXN0ZXJMb2NhbGVEYXRhKGxvY2FsZUhlLCAnaGUnKTtcbnJlZ2lzdGVyTG9jYWxlRGF0YShsb2NhbGVIciwgJ2hyJyk7XG5yZWdpc3RlckxvY2FsZURhdGEobG9jYWxlSHUsICdodScpO1xucmVnaXN0ZXJMb2NhbGVEYXRhKGxvY2FsZUlkLCAnaWQnKTtcbnJlZ2lzdGVyTG9jYWxlRGF0YShsb2NhbGVJdCwgJ2l0Jyk7XG5yZWdpc3RlckxvY2FsZURhdGEobG9jYWxlSmEsICdqYScpO1xucmVnaXN0ZXJMb2NhbGVEYXRhKGxvY2FsZUtvLCAna28nKTtcbnJlZ2lzdGVyTG9jYWxlRGF0YShsb2NhbGVLbiwgJ2tuJyk7XG5yZWdpc3RlckxvY2FsZURhdGEobG9jYWxlTHYsICdsdicpO1xucmVnaXN0ZXJMb2NhbGVEYXRhKGxvY2FsZU1sLCAnbWwnKTtcbnJlZ2lzdGVyTG9jYWxlRGF0YShsb2NhbGVOYiwgJ25iJyk7XG5yZWdpc3RlckxvY2FsZURhdGEobG9jYWxlTmwsICdubCcpO1xucmVnaXN0ZXJMb2NhbGVEYXRhKGxvY2FsZVBsLCAncGwnKTtcbnJlZ2lzdGVyTG9jYWxlRGF0YShsb2NhbGVQdEJyLCAncHQtQlInKTtcbnJlZ2lzdGVyTG9jYWxlRGF0YShsb2NhbGVQdFB0LCAncHQtUFQnKTtcbnJlZ2lzdGVyTG9jYWxlRGF0YShsb2NhbGVSbywgJ3JvJyk7XG5yZWdpc3RlckxvY2FsZURhdGEobG9jYWxlUnUsICdydScpO1xucmVnaXN0ZXJMb2NhbGVEYXRhKGxvY2FsZVNrLCAnc2snKTtcbnJlZ2lzdGVyTG9jYWxlRGF0YShsb2NhbGVTciwgJ3NyJyk7XG5yZWdpc3RlckxvY2FsZURhdGEobG9jYWxlU3YsICdzdicpO1xucmVnaXN0ZXJMb2NhbGVEYXRhKGxvY2FsZVRoLCAndGgnKTtcbnJlZ2lzdGVyTG9jYWxlRGF0YShsb2NhbGVUciwgJ3RyJyk7XG5yZWdpc3RlckxvY2FsZURhdGEobG9jYWxlVWssICd1aycpO1xucmVnaXN0ZXJMb2NhbGVEYXRhKGxvY2FsZVZpLCAndmknKTtcbnJlZ2lzdGVyTG9jYWxlRGF0YShsb2NhbGVaaENuLCAnemgtQ04nKTtcbnJlZ2lzdGVyTG9jYWxlRGF0YShsb2NhbGVaaFR3LCAnemgtVFcnKTtcblxuQE5nTW9kdWxlKHtcbiAgICBpbXBvcnRzOiBbXG4gICAgICAgIEExMXlNb2R1bGUsXG4gICAgICAgIEFwcFJvdXRpbmdNb2R1bGUsXG4gICAgICAgIEJyb3dzZXJBbmltYXRpb25zTW9kdWxlLFxuICAgICAgICBCcm93c2VyTW9kdWxlLFxuICAgICAgICBEcmFnRHJvcE1vZHVsZSxcbiAgICAgICAgRm9ybXNNb2R1bGUsXG4gICAgICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgICAgIFNjcm9sbGluZ01vZHVsZSxcbiAgICAgICAgU2VydmljZXNNb2R1bGUsXG4gICAgICAgIFRvYXN0ZXJNb2R1bGUuZm9yUm9vdCgpLFxuICAgIF0sXG4gICAgZGVjbGFyYXRpb25zOiBbXG4gICAgICAgIEExMXlUaXRsZURpcmVjdGl2ZSxcbiAgICAgICAgQWN0aW9uQnV0dG9uc0NvbXBvbmVudCxcbiAgICAgICAgQWRkRWRpdENvbXBvbmVudCxcbiAgICAgICAgQXBpQWN0aW9uRGlyZWN0aXZlLFxuICAgICAgICBBcHBDb21wb25lbnQsXG4gICAgICAgIEF0dGFjaG1lbnRzQ29tcG9uZW50LFxuICAgICAgICBBdXRvZm9jdXNEaXJlY3RpdmUsXG4gICAgICAgIEJsdXJDbGlja0RpcmVjdGl2ZSxcbiAgICAgICAgQm94Um93RGlyZWN0aXZlLFxuICAgICAgICBDYWxsb3V0Q29tcG9uZW50LFxuICAgICAgICBDaXBoZXJMaXN0VmlydHVhbFNjcm9sbCxcbiAgICAgICAgQ2lwaGVyUm93Q29tcG9uZW50LFxuICAgICAgICBDaXBoZXJzQ29tcG9uZW50LFxuICAgICAgICBDb2xsZWN0aW9uc0NvbXBvbmVudCxcbiAgICAgICAgQ29sb3JQYXNzd29yZFBpcGUsXG4gICAgICAgIEN1cnJlbnRUYWJDb21wb25lbnQsXG4gICAgICAgIEVudmlyb25tZW50Q29tcG9uZW50LFxuICAgICAgICBFeGNsdWRlZERvbWFpbnNDb21wb25lbnQsXG4gICAgICAgIEV4cG9ydENvbXBvbmVudCxcbiAgICAgICAgRmFsbGJhY2tTcmNEaXJlY3RpdmUsXG4gICAgICAgIEZvbGRlckFkZEVkaXRDb21wb25lbnQsXG4gICAgICAgIEZvbGRlcnNDb21wb25lbnQsXG4gICAgICAgIEdyb3VwaW5nc0NvbXBvbmVudCxcbiAgICAgICAgSG9tZUNvbXBvbmVudCxcbiAgICAgICAgSGludENvbXBvbmVudCxcbiAgICAgICAgSTE4blBpcGUsXG4gICAgICAgIEljb25Db21wb25lbnQsXG4gICAgICAgIElucHV0VmVyYmF0aW1EaXJlY3RpdmUsXG4gICAgICAgIExvY2tDb21wb25lbnQsXG4gICAgICAgIExvZ2luQ29tcG9uZW50LFxuICAgICAgICBPcHRpb25zQ29tcG9uZW50LFxuICAgICAgICBQYXNzd29yZEdlbmVyYXRvckNvbXBvbmVudCxcbiAgICAgICAgUGFzc3dvcmRHZW5lcmF0b3JIaXN0b3J5Q29tcG9uZW50LFxuICAgICAgICBQYXNzd29yZEhpc3RvcnlDb21wb25lbnQsXG4gICAgICAgIFBvcE91dENvbXBvbmVudCxcbiAgICAgICAgUHJlbWl1bUNvbXBvbmVudCxcbiAgICAgICAgUHJpdmF0ZU1vZGVDb21wb25lbnQsXG4gICAgICAgIFJlZ2lzdGVyQ29tcG9uZW50LFxuICAgICAgICBTZWFyY2hDaXBoZXJzUGlwZSxcbiAgICAgICAgU2VsZWN0Q29weURpcmVjdGl2ZSxcbiAgICAgICAgU2VuZEFkZEVkaXRDb21wb25lbnQsXG4gICAgICAgIFNlbmRFZmZsdXhEYXRlc0NvbXBvbmVudCxcbiAgICAgICAgU2VuZEdyb3VwaW5nc0NvbXBvbmVudCxcbiAgICAgICAgU2VuZExpc3RDb21wb25lbnQsXG4gICAgICAgIFNlbmRUeXBlQ29tcG9uZW50LFxuICAgICAgICBTZXRQYXNzd29yZENvbXBvbmVudCxcbiAgICAgICAgU2V0dGluZ3NDb21wb25lbnQsXG4gICAgICAgIFNoYXJlQ29tcG9uZW50LFxuICAgICAgICBTc29Db21wb25lbnQsXG4gICAgICAgIFN0b3BDbGlja0RpcmVjdGl2ZSxcbiAgICAgICAgU3RvcFByb3BEaXJlY3RpdmUsXG4gICAgICAgIFN5bmNDb21wb25lbnQsXG4gICAgICAgIFRhYnNDb21wb25lbnQsXG4gICAgICAgIFRydWVGYWxzZVZhbHVlRGlyZWN0aXZlLFxuICAgICAgICBUd29GYWN0b3JPcHRpb25zQ29tcG9uZW50LFxuICAgICAgICBUd29GYWN0b3JDb21wb25lbnQsXG4gICAgICAgIFVwZGF0ZVRlbXBQYXNzd29yZENvbXBvbmVudCxcbiAgICAgICAgVmlld0NvbXBvbmVudCxcbiAgICAgICAgUGFzc3dvcmRSZXByb21wdENvbXBvbmVudCxcbiAgICAgICAgU2V0UGluQ29tcG9uZW50LFxuICAgICAgICBWYXVsdFRpbWVvdXRJbnB1dENvbXBvbmVudCxcbiAgICAgICAgQWRkRWRpdEN1c3RvbUZpZWxkc0NvbXBvbmVudCxcbiAgICAgICAgVmlld0N1c3RvbUZpZWxkc0NvbXBvbmVudCxcbiAgICBdLFxuICAgIGVudHJ5Q29tcG9uZW50czogW10sXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIEN1cnJlbmN5UGlwZSxcbiAgICAgICAgRGF0ZVBpcGUsXG4gICAgXSxcbiAgICBib290c3RyYXA6IFtBcHBDb21wb25lbnRdLFxufSlcbmV4cG9ydCBjbGFzcyBBcHBNb2R1bGUgeyB9XG4iLCJpbXBvcnQge1xuICAgIENvbXBvbmVudCxcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgSW5wdXQsXG4gICAgT3V0cHV0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgVG9hc3RlclNlcnZpY2UgfSBmcm9tICdhbmd1bGFyMi10b2FzdGVyJztcblxuaW1wb3J0IHsgQ2lwaGVyUmVwcm9tcHRUeXBlIH0gZnJvbSAnanNsaWItY29tbW9uL2VudW1zL2NpcGhlclJlcHJvbXB0VHlwZSc7XG5pbXBvcnQgeyBDaXBoZXJUeXBlIH0gZnJvbSAnanNsaWItY29tbW9uL2VudW1zL2NpcGhlclR5cGUnO1xuaW1wb3J0IHsgRXZlbnRUeXBlIH0gZnJvbSAnanNsaWItY29tbW9uL2VudW1zL2V2ZW50VHlwZSc7XG5cbmltcG9ydCB7IENpcGhlclZpZXcgfSBmcm9tICdqc2xpYi1jb21tb24vbW9kZWxzL3ZpZXcvY2lwaGVyVmlldyc7XG5cbmltcG9ydCB7IEV2ZW50U2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvZXZlbnQuc2VydmljZSc7XG5pbXBvcnQgeyBJMThuU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvaTE4bi5zZXJ2aWNlJztcbmltcG9ydCB7IFBhc3N3b3JkUmVwcm9tcHRTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9wYXNzd29yZFJlcHJvbXB0LnNlcnZpY2UnO1xuaW1wb3J0IHsgUGxhdGZvcm1VdGlsc1NlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL3BsYXRmb3JtVXRpbHMuc2VydmljZSc7XG5pbXBvcnQgeyBUb3RwU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvdG90cC5zZXJ2aWNlJztcbmltcG9ydCB7IFVzZXJTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy91c2VyLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2FwcC1hY3Rpb24tYnV0dG9ucycsXG4gICAgdGVtcGxhdGVVcmw6ICdhY3Rpb24tYnV0dG9ucy5jb21wb25lbnQuaHRtbCcsXG59KVxuZXhwb3J0IGNsYXNzIEFjdGlvbkJ1dHRvbnNDb21wb25lbnQge1xuICAgIEBPdXRwdXQoKSBvblZpZXcgPSBuZXcgRXZlbnRFbWl0dGVyPENpcGhlclZpZXc+KCk7XG4gICAgQE91dHB1dCgpIGxhdW5jaEV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxDaXBoZXJWaWV3PigpO1xuICAgIEBJbnB1dCgpIGNpcGhlcjogQ2lwaGVyVmlldztcbiAgICBASW5wdXQoKSBzaG93VmlldyA9IGZhbHNlO1xuXG4gICAgY2lwaGVyVHlwZSA9IENpcGhlclR5cGU7XG4gICAgdXNlckhhc1ByZW1pdW1BY2Nlc3MgPSBmYWxzZTtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgdG9hc3RlclNlcnZpY2U6IFRvYXN0ZXJTZXJ2aWNlLCBwcml2YXRlIGkxOG5TZXJ2aWNlOiBJMThuU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBwbGF0Zm9ybVV0aWxzU2VydmljZTogUGxhdGZvcm1VdGlsc1NlcnZpY2UsIHByaXZhdGUgZXZlbnRTZXJ2aWNlOiBFdmVudFNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgdG90cFNlcnZpY2U6IFRvdHBTZXJ2aWNlLCBwcml2YXRlIHVzZXJTZXJ2aWNlOiBVc2VyU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBwYXNzd29yZFJlcHJvbXB0U2VydmljZTogUGFzc3dvcmRSZXByb21wdFNlcnZpY2UpIHsgfVxuXG4gICAgYXN5bmMgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMudXNlckhhc1ByZW1pdW1BY2Nlc3MgPSBhd2FpdCB0aGlzLnVzZXJTZXJ2aWNlLmNhbkFjY2Vzc1ByZW1pdW0oKTtcbiAgICB9XG5cbiAgICBsYXVuY2hDaXBoZXIoKSB7XG4gICAgICAgIHRoaXMubGF1bmNoRXZlbnQuZW1pdCh0aGlzLmNpcGhlcik7XG4gICAgfVxuXG4gICAgYXN5bmMgY29weShjaXBoZXI6IENpcGhlclZpZXcsIHZhbHVlOiBzdHJpbmcsIHR5cGVJMThuS2V5OiBzdHJpbmcsIGFUeXBlOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKHRoaXMuY2lwaGVyLnJlcHJvbXB0ICE9PSBDaXBoZXJSZXByb21wdFR5cGUuTm9uZSAmJiB0aGlzLnBhc3N3b3JkUmVwcm9tcHRTZXJ2aWNlLnByb3RlY3RlZEZpZWxkcygpLmluY2x1ZGVzKGFUeXBlKSAmJlxuICAgICAgICAgICAgIWF3YWl0IHRoaXMucGFzc3dvcmRSZXByb21wdFNlcnZpY2Uuc2hvd1Bhc3N3b3JkUHJvbXB0KCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsIHx8IGFUeXBlID09PSAnVE9UUCcgJiYgIXRoaXMuZGlzcGxheVRvdHBDb3B5QnV0dG9uKGNpcGhlcikpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gY2lwaGVyLmxvZ2luLnRvdHApIHtcbiAgICAgICAgICAgIHZhbHVlID0gYXdhaXQgdGhpcy50b3RwU2VydmljZS5nZXRDb2RlKHZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghY2lwaGVyLnZpZXdQYXNzd29yZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5wbGF0Zm9ybVV0aWxzU2VydmljZS5jb3B5VG9DbGlwYm9hcmQodmFsdWUsIHsgd2luZG93OiB3aW5kb3cgfSk7XG4gICAgICAgIHRoaXMudG9hc3RlclNlcnZpY2UucG9wQXN5bmMoJ2luZm8nLCBudWxsLFxuICAgICAgICAgICAgdGhpcy5pMThuU2VydmljZS50KCd2YWx1ZUNvcGllZCcsIHRoaXMuaTE4blNlcnZpY2UudCh0eXBlSTE4bktleSkpKTtcblxuICAgICAgICBpZiAodHlwZUkxOG5LZXkgPT09ICdwYXNzd29yZCcgfHwgdHlwZUkxOG5LZXkgPT09ICd2ZXJpZmljYXRpb25Db2RlVG90cCcpIHtcbiAgICAgICAgICAgIHRoaXMuZXZlbnRTZXJ2aWNlLmNvbGxlY3QoRXZlbnRUeXBlLkNpcGhlcl9DbGllbnRUb2dnbGVkSGlkZGVuRmllbGRWaXNpYmxlLCBjaXBoZXIuaWQpO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVJMThuS2V5ID09PSAnc2VjdXJpdHlDb2RlJykge1xuICAgICAgICAgICAgdGhpcy5ldmVudFNlcnZpY2UuY29sbGVjdChFdmVudFR5cGUuQ2lwaGVyX0NsaWVudENvcGllZENhcmRDb2RlLCBjaXBoZXIuaWQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZGlzcGxheVRvdHBDb3B5QnV0dG9uKGNpcGhlcjogQ2lwaGVyVmlldykge1xuICAgICAgICByZXR1cm4gKGNpcGhlcj8ubG9naW4/Lmhhc1RvdHAgPz8gZmFsc2UpICYmXG4gICAgICAgICAgICAoY2lwaGVyLm9yZ2FuaXphdGlvblVzZVRvdHAgfHwgdGhpcy51c2VySGFzUHJlbWl1bUFjY2Vzcyk7XG4gICAgfVxuXG4gICAgdmlldygpIHtcbiAgICAgICAgdGhpcy5vblZpZXcuZW1pdCh0aGlzLmNpcGhlcik7XG4gICAgfVxufVxuIiwiPHNwYW4gY2xhc3M9XCJyb3ctYnRuXCIgKGNsaWNrKT1cInZpZXcoKVwiIGFwcFN0b3BDbGljayBhcHBTdG9wUHJvcCBhcHBBMTF5VGl0bGU9XCJ7eyd2aWV3JyB8IGkxOG59fVwiICpuZ0lmPVwic2hvd1ZpZXdcIj5cbiAgICA8aSBjbGFzcz1cImZhIGZhLWxnIGZhLWxpc3QtYWx0XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuPC9zcGFuPlxuPG5nLWNvbnRhaW5lciAqbmdJZj1cImNpcGhlci50eXBlID09PSBjaXBoZXJUeXBlLkxvZ2luXCI+XG4gICAgPHNwYW4gY2xhc3M9XCJyb3ctYnRuXCIgYXBwU3RvcENsaWNrIGFwcFN0b3BQcm9wIGFwcEExMXlUaXRsZT1cInt7J2xhdW5jaCcgfCBpMThufX1cIiAoY2xpY2spPVwibGF1bmNoQ2lwaGVyKClcIlxuICAgICAgICAqbmdJZj1cIiFzaG93Vmlld1wiIFtuZ0NsYXNzXT1cIntkaXNhYmxlZDogIWNpcGhlci5sb2dpbi5jYW5MYXVuY2h9XCI+XG4gICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtbGcgZmEtc2hhcmUtc3F1YXJlLW9cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgPC9zcGFuPlxuICAgIDxzcGFuIGNsYXNzPVwicm93LWJ0blwiIGFwcFN0b3BDbGljayBhcHBTdG9wUHJvcCBhcHBBMTF5VGl0bGU9XCJ7eydjb3B5VXNlcm5hbWUnIHwgaTE4bn19XCJcbiAgICAgICAgKGNsaWNrKT1cImNvcHkoY2lwaGVyLCBjaXBoZXIubG9naW4udXNlcm5hbWUsICd1c2VybmFtZScsICdVc2VybmFtZScpXCJcbiAgICAgICAgW25nQ2xhc3NdPVwie2Rpc2FibGVkOiAhY2lwaGVyLmxvZ2luLnVzZXJuYW1lfVwiPlxuICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWxnIGZhLXVzZXJcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgPC9zcGFuPlxuICAgIDxzcGFuIGNsYXNzPVwicm93LWJ0blwiIGFwcFN0b3BDbGljayBhcHBTdG9wUHJvcCBhcHBBMTF5VGl0bGU9XCJ7eydjb3B5UGFzc3dvcmQnIHwgaTE4bn19XCJcbiAgICAgICAgKGNsaWNrKT1cImNvcHkoY2lwaGVyLCBjaXBoZXIubG9naW4ucGFzc3dvcmQsICdwYXNzd29yZCcsICdQYXNzd29yZCcpXCJcbiAgICAgICAgW25nQ2xhc3NdPVwie2Rpc2FibGVkOiAoIWNpcGhlci5sb2dpbi5wYXNzd29yZCB8fCAhY2lwaGVyLnZpZXdQYXNzd29yZCl9XCI+XG4gICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtbGcgZmEta2V5XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgIDwvc3Bhbj5cbiAgICA8c3BhbiBjbGFzcz1cInJvdy1idG5cIiBhcHBTdG9wQ2xpY2sgYXBwU3RvcFByb3AgYXBwQTExeVRpdGxlPVwie3snY29weVZlcmlmaWNhdGlvbkNvZGUnIHwgaTE4bn19XCJcbiAgICAgICAgKGNsaWNrKT1cImNvcHkoY2lwaGVyLCBjaXBoZXIubG9naW4udG90cCwgJ3ZlcmlmaWNhdGlvbkNvZGVUb3RwJywgJ1RPVFAnKVwiXG4gICAgICAgIFtuZ0NsYXNzXT1cIntkaXNhYmxlZDogKCFkaXNwbGF5VG90cENvcHlCdXR0b24oY2lwaGVyKSl9XCI+XG4gICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtbGcgZmEtY2xvY2stb1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICA8L3NwYW4+XG48L25nLWNvbnRhaW5lcj5cbjxuZy1jb250YWluZXIgKm5nSWY9XCJjaXBoZXIudHlwZSA9PT0gY2lwaGVyVHlwZS5DYXJkXCI+XG4gICAgPHNwYW4gY2xhc3M9XCJyb3ctYnRuXCIgYXBwU3RvcENsaWNrIGFwcFN0b3BQcm9wIGFwcEExMXlUaXRsZT1cInt7J2NvcHlOdW1iZXInIHwgaTE4bn19XCJcbiAgICAgICAgKGNsaWNrKT1cImNvcHkoY2lwaGVyLCBjaXBoZXIuY2FyZC5udW1iZXIsICdudW1iZXInLCAnQ2FyZCBOdW1iZXInKVwiIFtuZ0NsYXNzXT1cIntkaXNhYmxlZDogIWNpcGhlci5jYXJkLm51bWJlcn1cIj5cbiAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1sZyBmYS1oYXNodGFnXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgIDwvc3Bhbj5cbiAgICA8c3BhbiBjbGFzcz1cInJvdy1idG5cIiBhcHBTdG9wQ2xpY2sgYXBwU3RvcFByb3AgYXBwQTExeVRpdGxlPVwie3snY29weVNlY3VyaXR5Q29kZScgfCBpMThufX1cIlxuICAgICAgICAoY2xpY2spPVwiY29weShjaXBoZXIsIGNpcGhlci5jYXJkLmNvZGUsICdzZWN1cml0eUNvZGUnLCAnU2VjdXJpdHkgQ29kZScpXCJcbiAgICAgICAgW25nQ2xhc3NdPVwie2Rpc2FibGVkOiAhY2lwaGVyLmNhcmQuY29kZX1cIj5cbiAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1sZyBmYS1rZXlcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgPC9zcGFuPlxuPC9uZy1jb250YWluZXI+XG48bmctY29udGFpbmVyICpuZ0lmPVwiY2lwaGVyLnR5cGUgPT09IGNpcGhlclR5cGUuU2VjdXJlTm90ZVwiPlxuICAgIDxzcGFuIGNsYXNzPVwicm93LWJ0blwiIGFwcFN0b3BDbGljayBhcHBTdG9wUHJvcCBhcHBBMTF5VGl0bGU9XCJ7eydjb3B5Tm90ZScgfCBpMThufX1cIlxuICAgICAgICAoY2xpY2spPVwiY29weShjaXBoZXIsIGNpcGhlci5ub3RlcywgJ25vdGUnLCAnTm90ZScpXCIgW25nQ2xhc3NdPVwie2Rpc2FibGVkOiAhY2lwaGVyLm5vdGVzfVwiPlxuICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWxnIGZhLWNsb25lXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgIDwvc3Bhbj5cbjwvbmctY29udGFpbmVyPlxuIiwiaW1wb3J0IHtcbiAgICBDb21wb25lbnQsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIElucHV0LFxuICAgIE91dHB1dCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IENpcGhlclZpZXcgfSBmcm9tICdqc2xpYi1jb21tb24vbW9kZWxzL3ZpZXcvY2lwaGVyVmlldyc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnYXBwLWNpcGhlci1yb3cnLFxuICAgIHRlbXBsYXRlVXJsOiAnY2lwaGVyLXJvdy5jb21wb25lbnQuaHRtbCcsXG59KVxuZXhwb3J0IGNsYXNzIENpcGhlclJvd0NvbXBvbmVudCB7XG4gICAgQE91dHB1dCgpIG9uU2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPENpcGhlclZpZXc+KCk7XG4gICAgQE91dHB1dCgpIGxhdW5jaEV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxDaXBoZXJWaWV3PigpO1xuICAgIEBPdXRwdXQoKSBvblZpZXcgPSBuZXcgRXZlbnRFbWl0dGVyPENpcGhlclZpZXc+KCk7XG4gICAgQElucHV0KCkgY2lwaGVyOiBDaXBoZXJWaWV3O1xuICAgIEBJbnB1dCgpIHNob3dWaWV3ID0gZmFsc2U7XG4gICAgQElucHV0KCkgdGl0bGU6IHN0cmluZztcblxuICAgIHNlbGVjdENpcGhlcihjOiBDaXBoZXJWaWV3KSB7XG4gICAgICAgIHRoaXMub25TZWxlY3RlZC5lbWl0KGMpO1xuICAgIH1cblxuICAgIGxhdW5jaENpcGhlcihjOiBDaXBoZXJWaWV3KSB7XG4gICAgICAgIHRoaXMubGF1bmNoRXZlbnQuZW1pdChjKTtcbiAgICB9XG5cbiAgICB2aWV3Q2lwaGVyKGM6IENpcGhlclZpZXcpIHtcbiAgICAgICAgdGhpcy5vblZpZXcuZW1pdChjKTtcbiAgICB9XG59XG4iLCI8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwic2VsZWN0Q2lwaGVyKGNpcGhlcilcIiAoZGJsY2xpY2spPVwibGF1bmNoQ2lwaGVyKGNpcGhlcilcIiBhcHBTdG9wQ2xpY2tcbiAgICB0aXRsZT1cInt7dGl0bGV9fSAtIHt7Y2lwaGVyLm5hbWV9fVwiIGNsYXNzPVwiYm94LWNvbnRlbnQtcm93IGJveC1jb250ZW50LXJvdy1mbGV4IHZpcnR1YWwtc2Nyb2xsLWl0ZW1cIj5cbiAgICA8ZGl2IGNsYXNzPVwicm93LW1haW5cIj5cbiAgICAgICAgPGFwcC12YXVsdC1pY29uIFtjaXBoZXJdPVwiY2lwaGVyXCI+PC9hcHAtdmF1bHQtaWNvbj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJvdy1tYWluLWNvbnRlbnRcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dFwiPlxuICAgICAgICAgICAgICAgIHt7Y2lwaGVyLm5hbWV9fVxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjaXBoZXIub3JnYW5pemF0aW9uSWRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1jdWJlIHRleHQtbXV0ZWRcIiB0aXRsZT1cInt7J3NoYXJlZCcgfCBpMThufX1cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3Itb25seVwiPnt7J3NoYXJlZCcgfCBpMThufX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNpcGhlci5oYXNBdHRhY2htZW50c1wiPlxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXBhcGVyY2xpcCB0ZXh0LW11dGVkXCIgdGl0bGU9XCJ7eydhdHRhY2htZW50cycgfCBpMThufX1cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3Itb25seVwiPnt7J2F0dGFjaG1lbnRzJyB8IGkxOG59fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGV0YWlsXCI+e3tjaXBoZXIuc3ViVGl0bGV9fTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGFwcC1hY3Rpb24tYnV0dG9ucyBbY2lwaGVyXT1cImNpcGhlclwiIFtzaG93Vmlld109XCJzaG93Vmlld1wiIChvblZpZXcpPVwidmlld0NpcGhlcihjaXBoZXIpXCIgKGxhdW5jaEV2ZW50KT1cImxhdW5jaENpcGhlcihjaXBoZXIpXCIgXG4gICAgICAgIGNsYXNzPVwiYWN0aW9uLWJ1dHRvbnNcIj5cbiAgICA8L2FwcC1hY3Rpb24tYnV0dG9ucz5cbjwvYnV0dG9uPlxuIiwiaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IFBhc3N3b3JkUmVwcm9tcHRDb21wb25lbnQgYXMgQmFzZVBhc3N3b3JkUmVwcm9tcHRDb21wb25lbnQgfSBmcm9tICdqc2xpYi1hbmd1bGFyL2NvbXBvbmVudHMvcGFzc3dvcmQtcmVwcm9tcHQuY29tcG9uZW50JztcblxuQENvbXBvbmVudCh7XG4gICAgdGVtcGxhdGVVcmw6ICdwYXNzd29yZC1yZXByb21wdC5jb21wb25lbnQuaHRtbCcsXG59KVxuZXhwb3J0IGNsYXNzIFBhc3N3b3JkUmVwcm9tcHRDb21wb25lbnQgZXh0ZW5kcyBCYXNlUGFzc3dvcmRSZXByb21wdENvbXBvbmVudCB7fVxuIiwiPGRpdiBjbGFzcz1cIm1vZGFsIGZhZGVcIiByb2xlPVwiZGlhbG9nXCIgYXJpYS1tb2RhbD1cInRydWVcIj5cbiAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZGlhbG9nIG1vZGFsLWRpYWxvZy1zY3JvbGxhYmxlXCIgcm9sZT1cImRvY3VtZW50XCI+XG4gICAgICAgIDxmb3JtIGNsYXNzPVwibW9kYWwtY29udGVudFwiICNmb3JtIChuZ1N1Ym1pdCk9XCJzdWJtaXQoKVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHlcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtaGVhZGVyXCI+e3sncGFzc3dvcmRDb25maXJtYXRpb24nIHwgaTE4bn19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50LXJvdyBib3gtY29udGVudC1yb3ctZmxleFwiIGFwcEJveFJvdz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93LW1haW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cIm1hc3RlclBhc3N3b3JkXCI+e3snbWFzdGVyUGFzcycgfCBpMThufX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9XCJtYXN0ZXJQYXNzd29yZFwiIHR5cGU9XCJ7e3Nob3dQYXNzd29yZCA/ICd0ZXh0JyA6ICdwYXNzd29yZCd9fVwiIG5hbWU9XCJNYXN0ZXJQYXNzd29yZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1vbm9zcGFjZWRcIiBbKG5nTW9kZWwpXT1cIm1hc3RlclBhc3N3b3JkXCIgcmVxdWlyZWQgYXBwQXV0b2ZvY3VzPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhY3Rpb24tYnV0dG9uc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInJvdy1idG5cIiBhcHBTdG9wQ2xpY2sgYXBwQmx1ckNsaWNrIHJvbGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwQTExeVRpdGxlPVwie3sndG9nZ2xlVmlzaWJpbGl0eScgfCBpMThufX1cIiAoY2xpY2spPVwidG9nZ2xlUGFzc3dvcmQoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1sZ1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydmYS1leWUnOiAhc2hvd1Bhc3N3b3JkLCAnZmEtZXllLXNsYXNoJzogc2hvd1Bhc3N3b3JkfVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtZm9vdGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eydwYXNzd29yZENvbmZpcm1hdGlvbkRlc2MnIHwgaTE4bn19XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwic3VibWl0XCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgYnRuLXN1Ym1pdFwiIGFwcEJsdXJDbGljaz5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3snb2snIHwgaTE4bn19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXNlY29uZGFyeVwiIGRhdGEtZGlzbWlzcz1cIm1vZGFsXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7J2NhbmNlbCcgfCBpMThufX1cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Zvcm0+XG4gICAgPC9kaXY+XG48L2Rpdj5cbiIsImltcG9ydCB7XG4gICAgQ29tcG9uZW50LFxuICAgIElucHV0LFxuICAgIE9uSW5pdCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IFBsYXRmb3JtVXRpbHNTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9wbGF0Zm9ybVV0aWxzLnNlcnZpY2UnO1xuXG5pbXBvcnQgeyBQb3B1cFV0aWxzU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL3BvcHVwLXV0aWxzLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2FwcC1wb3Atb3V0JyxcbiAgICB0ZW1wbGF0ZVVybDogJ3BvcC1vdXQuY29tcG9uZW50Lmh0bWwnLFxufSlcbmV4cG9ydCBjbGFzcyBQb3BPdXRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICAgIEBJbnB1dCgpIHNob3cgPSB0cnVlO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBwbGF0Zm9ybVV0aWxzU2VydmljZTogUGxhdGZvcm1VdGlsc1NlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgcG9wdXBVdGlsc1NlcnZpY2U6IFBvcHVwVXRpbHNTZXJ2aWNlKSB7IH1cblxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICBpZiAodGhpcy5zaG93KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wb3B1cFV0aWxzU2VydmljZS5pblNpZGViYXIod2luZG93KSAmJiB0aGlzLnBsYXRmb3JtVXRpbHNTZXJ2aWNlLmlzRmlyZWZveCgpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zaG93ID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBleHBhbmQoKSB7XG4gICAgICAgIHRoaXMucG9wdXBVdGlsc1NlcnZpY2UucG9wT3V0KHdpbmRvdyk7XG4gICAgfVxufVxuIiwiPG5nLWNvbnRhaW5lcj5cbiAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiZXhwYW5kKClcIiBhcHBBMTF5VGl0bGU9XCJ7eydwb3BPdXROZXdXaW5kb3cnIHwgaTE4bn19XCI+XG4gICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtZXh0ZXJuYWwtbGluayBmYS1yb3RhdGUtMjcwIGZhLWxnIGZhLWZ3XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgIDwvYnV0dG9uPlxuPC9uZy1jb250YWluZXI+XG4iLCJpbXBvcnQge1xuICAgIENvbXBvbmVudCxcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgSW5wdXQsXG4gICAgT3V0cHV0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgU2VuZFZpZXcgfSBmcm9tICdqc2xpYi1jb21tb24vbW9kZWxzL3ZpZXcvc2VuZFZpZXcnO1xuXG5pbXBvcnQgeyBTZW5kVHlwZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9lbnVtcy9zZW5kVHlwZSc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnYXBwLXNlbmQtbGlzdCcsXG4gICAgdGVtcGxhdGVVcmw6ICdzZW5kLWxpc3QuY29tcG9uZW50Lmh0bWwnLFxufSlcbmV4cG9ydCBjbGFzcyBTZW5kTGlzdENvbXBvbmVudCB7XG4gICAgQElucHV0KCkgc2VuZHM6IFNlbmRWaWV3W107XG4gICAgQElucHV0KCkgdGl0bGU6IHN0cmluZztcbiAgICBASW5wdXQoKSBkaXNhYmxlZEJ5UG9saWN5ID0gZmFsc2U7XG4gICAgQE91dHB1dCgpIG9uU2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPFNlbmRWaWV3PigpO1xuICAgIEBPdXRwdXQoKSBvbkNvcHlTZW5kTGluayA9IG5ldyBFdmVudEVtaXR0ZXI8U2VuZFZpZXc+KCk7XG4gICAgQE91dHB1dCgpIG9uUmVtb3ZlUGFzc3dvcmQgPSBuZXcgRXZlbnRFbWl0dGVyPFNlbmRWaWV3PigpO1xuICAgIEBPdXRwdXQoKSBvbkRlbGV0ZVNlbmQgPSBuZXcgRXZlbnRFbWl0dGVyPFNlbmRWaWV3PigpO1xuXG4gICAgc2VuZFR5cGUgPSBTZW5kVHlwZTtcblxuICAgIHNlbGVjdFNlbmQoczogU2VuZFZpZXcpIHtcbiAgICAgICAgdGhpcy5vblNlbGVjdGVkLmVtaXQocyk7XG4gICAgfVxuXG4gICAgY29weVNlbmRMaW5rKHM6IFNlbmRWaWV3KSB7XG4gICAgICAgIHRoaXMub25Db3B5U2VuZExpbmsuZW1pdChzKTtcbiAgICB9XG5cbiAgICByZW1vdmVQYXNzd29yZChzOiBTZW5kVmlldykge1xuICAgICAgICB0aGlzLm9uUmVtb3ZlUGFzc3dvcmQuZW1pdChzKTtcbiAgICB9XG5cbiAgICBkZWxldGUoczogU2VuZFZpZXcpIHtcbiAgICAgICAgdGhpcy5vbkRlbGV0ZVNlbmQuZW1pdChzKTtcbiAgICB9XG59XG4iLCI8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAqbmdGb3I9XCJsZXQgcyBvZiBzZW5kc1wiIChjbGljayk9XCJzZWxlY3RTZW5kKHMpXCIgYXBwU3RvcENsaWNrIHRpdGxlPVwie3t0aXRsZX19IC0ge3tzLm5hbWV9fVwiXG4gICAgY2xhc3M9XCJib3gtY29udGVudC1yb3cgYm94LWNvbnRlbnQtcm93LWZsZXhcIj5cbiAgICA8ZGl2IGNsYXNzPVwicm93LW1haW5cIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImFwcC12YXVsdC1pY29uXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaWNvblwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtZncgZmEtbGcgZmEtZmlsZS10ZXh0LW9cIiAqbmdJZj1cInMudHlwZSA9PT0gc2VuZFR5cGUuVGV4dFwiPjwvaT5cbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWZ3IGZhLWxnIGZhLWZpbGUtb1wiICpuZ0lmPVwicy50eXBlID09PSBzZW5kVHlwZS5GaWxlXCI+PC9pPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwicm93LW1haW4tY29udGVudFwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0XCI+XG4gICAgICAgICAgICAgICAge3tzLm5hbWV9fVxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzLmRpc2FibGVkXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtd2FybmluZyB0ZXh0LW11dGVkXCIgdGl0bGU9XCJ7eydkaXNhYmxlZCcgfCBpMThufX1cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3Itb25seVwiPnt7J2Rpc2FibGVkJyB8IGkxOG59fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicy5wYXNzd29yZFwiPlxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWtleSB0ZXh0LW11dGVkXCIgdGl0bGU9XCJ7eydwYXNzd29yZFByb3RlY3RlZCcgfCBpMThufX1cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3Itb25seVwiPnt7J3Bhc3N3b3JkUHJvdGVjdGVkJyB8IGkxOG59fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicy5tYXhBY2Nlc3NDb3VudFJlYWNoZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1iYW4gdGV4dC1tdXRlZFwiIHRpdGxlPVwie3snbWF4QWNjZXNzQ291bnRSZWFjaGVkJyB8IGkxOG59fVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzci1vbmx5XCI+e3snbWF4QWNjZXNzQ291bnRSZWFjaGVkJyB8IGkxOG59fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicy5leHBpcmVkXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtY2xvY2stbyB0ZXh0LW11dGVkXCIgdGl0bGU9XCJ7eydleHBpcmVkJyB8IGkxOG59fVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzci1vbmx5XCI+e3snZXhwaXJlZCcgfCBpMThufX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInMucGVuZGluZ0RlbGV0ZVwiPlxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXRyYXNoIHRleHQtbXV0ZWRcIiB0aXRsZT1cInt7J3BlbmRpbmdEZWxldGlvbicgfCBpMThufX1cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3Itb25seVwiPnt7J3BlbmRpbmdEZWxldGlvbicgfCBpMThufX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRldGFpbFwiPnt7cy5kZWxldGlvbkRhdGUgfCBkYXRlOidtZWRpdW0nfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJhY3Rpb24tYnV0dG9uc1wiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInJvdy1idG5cIiBhcHBTdG9wQ2xpY2sgYXBwU3RvcFByb3AgYXBwQTExeVRpdGxlPVwie3snY29weVNlbmRMaW5rJyB8IGkxOG59fVwiXG4gICAgICAgICAgICAoY2xpY2spPVwiY29weVNlbmRMaW5rKHMpXCI+XG4gICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWxnIGZhLWNvcHlcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJyb3ctYnRuXCIgW25nQ2xhc3NdPVwieydkaXNhYmxlZCcgOiBkaXNhYmxlZEJ5UG9saWN5fVwiIGFwcFN0b3BDbGljayBhcHBTdG9wUHJvcFxuICAgICAgICAgICAgYXBwQTExeVRpdGxlPVwie3sncmVtb3ZlUGFzc3dvcmQnIHwgaTE4bn19XCIgKGNsaWNrKT1cInJlbW92ZVBhc3N3b3JkKHMpXCIgKm5nSWY9XCJzLnBhc3N3b3JkXCI+XG4gICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWxnIGZhLXVuZG9cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJyb3ctYnRuXCIgYXBwU3RvcENsaWNrIGFwcFN0b3BQcm9wIGFwcEExMXlUaXRsZT1cInt7J2RlbGV0ZScgfCBpMThufX1cIiAoY2xpY2spPVwiZGVsZXRlKHMpXCI+XG4gICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWxnIGZhLXRyYXNoLW9cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgIDwvc3Bhbj5cbiAgICA8L2Rpdj5cbjwvYnV0dG9uPlxuIiwiaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IFNldFBpbkNvbXBvbmVudCBhcyBCYXNlU2V0UGluQ29tcG9uZW50IH0gZnJvbSAnanNsaWItYW5ndWxhci9jb21wb25lbnRzL3NldC1waW4uY29tcG9uZW50JztcblxuQENvbXBvbmVudCh7XG4gICAgdGVtcGxhdGVVcmw6ICdzZXQtcGluLmNvbXBvbmVudC5odG1sJyxcbn0pXG5leHBvcnQgY2xhc3MgU2V0UGluQ29tcG9uZW50IGV4dGVuZHMgQmFzZVNldFBpbkNvbXBvbmVudCB7fVxuIiwiPGRpdiBjbGFzcz1cIm1vZGFsIGZhZGVcIiByb2xlPVwiZGlhbG9nXCIgYXJpYS1tb2RhbD1cInRydWVcIj5cbiAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZGlhbG9nIG1vZGFsLWRpYWxvZy1zY3JvbGxhYmxlXCIgcm9sZT1cImRvY3VtZW50XCI+XG4gICAgICAgIDxmb3JtIGNsYXNzPVwibW9kYWwtY29udGVudFwiICNmb3JtIChuZ1N1Ym1pdCk9XCJzdWJtaXQoKVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHlcIj5cbiAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICB7eydzZXRZb3VyUGluQ29kZScgfCBpMThufX1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50LXJvdyBib3gtY29udGVudC1yb3ctZmxleFwiIGFwcEJveFJvdz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93LW1haW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInBpblwiPnt7J3BpbicgfCBpMThufX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9XCJwaW5cIiB0eXBlPVwie3tzaG93UGluID8gJ3RleHQnIDogJ3Bhc3N3b3JkJ319XCIgbmFtZT1cIlBpblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1vbm9zcGFjZWRcIiBbKG5nTW9kZWwpXT1cInBpblwiIHJlcXVpcmVkIGFwcElucHV0VmVyYmF0aW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFjdGlvbi1idXR0b25zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwicm93LWJ0blwiIGFwcFN0b3BDbGljayBhcHBCbHVyQ2xpY2sgYXBwQTExeVRpdGxlPVwie3sndG9nZ2xlVmlzaWJpbGl0eScgfCBpMThufX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZVZpc2liaWxpdHkoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1sZ1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydmYS1leWUnOiAhc2hvd1BpbiwgJ2ZhLWV5ZS1zbGFzaCc6IHNob3dQaW59XCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hlY2tib3hcIj5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cIm1hc3RlclBhc3N3b3JkT25SZXN0YXJ0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJtYXN0ZXJQYXNzd29yZE9uUmVzdGFydFwiIG5hbWU9XCJNYXN0ZXJQYXNzd29yZE9uUmVzdGFydFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJtYXN0ZXJQYXNzT25SZXN0YXJ0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eydsb2NrV2l0aE1hc3RlclBhc3NPblJlc3RhcnQnIHwgaTE4bn19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwic3VibWl0XCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgYnRuLXN1Ym1pdFwiIGFwcEJsdXJDbGljaz5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3snb2snIHwgaTE4bn19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXNlY29uZGFyeVwiIGRhdGEtZGlzbWlzcz1cIm1vZGFsXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7J2NhbmNlbCcgfCBpMThufX1cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Zvcm0+XG4gICAgPC9kaXY+XG48L2Rpdj5cbiIsImltcG9ydCB7IExvY2F0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENvbXBvbmVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBJMThuU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvaTE4bi5zZXJ2aWNlJztcbmltcG9ydCB7IFBhc3N3b3JkR2VuZXJhdGlvblNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL3Bhc3N3b3JkR2VuZXJhdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IFBsYXRmb3JtVXRpbHNTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9wbGF0Zm9ybVV0aWxzLnNlcnZpY2UnO1xuXG5pbXBvcnQge1xuICAgIFBhc3N3b3JkR2VuZXJhdG9ySGlzdG9yeUNvbXBvbmVudCBhcyBCYXNlUGFzc3dvcmRHZW5lcmF0b3JIaXN0b3J5Q29tcG9uZW50LFxufSBmcm9tICdqc2xpYi1hbmd1bGFyL2NvbXBvbmVudHMvcGFzc3dvcmQtZ2VuZXJhdG9yLWhpc3RvcnkuY29tcG9uZW50JztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdhcHAtcGFzc3dvcmQtZ2VuZXJhdG9yLWhpc3RvcnknLFxuICAgIHRlbXBsYXRlVXJsOiAncGFzc3dvcmQtZ2VuZXJhdG9yLWhpc3RvcnkuY29tcG9uZW50Lmh0bWwnLFxufSlcbmV4cG9ydCBjbGFzcyBQYXNzd29yZEdlbmVyYXRvckhpc3RvcnlDb21wb25lbnQgZXh0ZW5kcyBCYXNlUGFzc3dvcmRHZW5lcmF0b3JIaXN0b3J5Q29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3RvcihwYXNzd29yZEdlbmVyYXRpb25TZXJ2aWNlOiBQYXNzd29yZEdlbmVyYXRpb25TZXJ2aWNlLCBwbGF0Zm9ybVV0aWxzU2VydmljZTogUGxhdGZvcm1VdGlsc1NlcnZpY2UsXG4gICAgICAgIGkxOG5TZXJ2aWNlOiBJMThuU2VydmljZSwgcHJpdmF0ZSBsb2NhdGlvbjogTG9jYXRpb24pIHtcbiAgICAgICAgc3VwZXIocGFzc3dvcmRHZW5lcmF0aW9uU2VydmljZSwgcGxhdGZvcm1VdGlsc1NlcnZpY2UsIGkxOG5TZXJ2aWNlLCB3aW5kb3cpO1xuICAgIH1cblxuICAgIGNsb3NlKCkge1xuICAgICAgICB0aGlzLmxvY2F0aW9uLmJhY2soKTtcbiAgICB9XG59XG4iLCI8aGVhZGVyPlxuICAgIDxkaXYgY2xhc3M9XCJsZWZ0XCI+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGFwcEJsdXJDbGljayB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImNsb3NlKClcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaGVhZGVyLWljb25cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48aSBjbGFzcz1cImZhIGZhLWNoZXZyb24tbGVmdFwiPjwvaT48L3NwYW4+XG4gICAgICAgICAgICA8c3Bhbj57eydiYWNrJyB8IGkxOG59fTwvc3Bhbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImNlbnRlclwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInRpdGxlXCI+e3sncGFzc3dvcmRIaXN0b3J5JyB8IGkxOG59fTwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwicmlnaHRcIj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgYXBwQmx1ckNsaWNrIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiY2xlYXIoKVwiPlxuICAgICAgICAgICAge3snY2xlYXInIHwgaTE4bn19XG4gICAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuPC9oZWFkZXI+XG48Y29udGVudD5cbiAgICA8ZGl2IGNsYXNzPVwiYm94IGxpc3QgZnVsbC1saXN0XCIgKm5nSWY9XCJoaXN0b3J5ICYmIGhpc3RvcnkubGVuZ3RoXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJib3gtY29udGVudFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50LXJvdyBib3gtY29udGVudC1yb3ctZmxleFwiICpuZ0Zvcj1cImxldCBoIG9mIGhpc3RvcnlcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93LW1haW5cIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdy1tYWluLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb25vc3BhY2VkIHBhc3N3b3JkLXdyYXBwZXJcIiBhcHBTZWxlY3RDb3B5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lubmVySFRNTF09XCJoLnBhc3N3b3JkIHwgY29sb3JQYXNzd29yZFwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZXRhaWxcIj57e2guZGF0ZSB8IGRhdGU6J21lZGl1bSd9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFjdGlvbi1idXR0b25zXCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwicm93LWJ0blwiIGFwcFN0b3BDbGljayBhcHBBMTF5VGl0bGU9XCJ7eydjb3B5UGFzc3dvcmQnIHwgaTE4bn19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjb3B5KGgucGFzc3dvcmQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWxnIGZhLWNsb25lXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwibm8taXRlbXNcIiAqbmdJZj1cIiFoaXN0b3J5IHx8ICFoaXN0b3J5Lmxlbmd0aFwiPlxuICAgICAgICA8cD57eydub1Bhc3N3b3Jkc0luTGlzdCcgfCBpMThufX08L3A+XG4gICAgPC9kaXY+XG48L2NvbnRlbnQ+XG4iLCJpbXBvcnQgeyBMb2NhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgSTE4blNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL2kxOG4uc2VydmljZSc7XG5pbXBvcnQgeyBQYXNzd29yZEdlbmVyYXRpb25TZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9wYXNzd29yZEdlbmVyYXRpb24uc2VydmljZSc7XG5pbXBvcnQgeyBQbGF0Zm9ybVV0aWxzU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvcGxhdGZvcm1VdGlscy5zZXJ2aWNlJztcbmltcG9ydCB7IFN0YXRlU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvc3RhdGUuc2VydmljZSc7XG5cbmltcG9ydCB7IENpcGhlclZpZXcgfSBmcm9tICdqc2xpYi1jb21tb24vbW9kZWxzL3ZpZXcvY2lwaGVyVmlldyc7XG5cbmltcG9ydCB7XG4gICAgUGFzc3dvcmRHZW5lcmF0b3JDb21wb25lbnQgYXMgQmFzZVBhc3N3b3JkR2VuZXJhdG9yQ29tcG9uZW50LFxufSBmcm9tICdqc2xpYi1hbmd1bGFyL2NvbXBvbmVudHMvcGFzc3dvcmQtZ2VuZXJhdG9yLmNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnYXBwLXBhc3N3b3JkLWdlbmVyYXRvcicsXG4gICAgdGVtcGxhdGVVcmw6ICdwYXNzd29yZC1nZW5lcmF0b3IuY29tcG9uZW50Lmh0bWwnLFxufSlcbmV4cG9ydCBjbGFzcyBQYXNzd29yZEdlbmVyYXRvckNvbXBvbmVudCBleHRlbmRzIEJhc2VQYXNzd29yZEdlbmVyYXRvckNvbXBvbmVudCB7XG4gICAgcHJpdmF0ZSBjaXBoZXJTdGF0ZTogQ2lwaGVyVmlldztcblxuICAgIGNvbnN0cnVjdG9yKHBhc3N3b3JkR2VuZXJhdGlvblNlcnZpY2U6IFBhc3N3b3JkR2VuZXJhdGlvblNlcnZpY2UsIHBsYXRmb3JtVXRpbHNTZXJ2aWNlOiBQbGF0Zm9ybVV0aWxzU2VydmljZSxcbiAgICAgICAgaTE4blNlcnZpY2U6IEkxOG5TZXJ2aWNlLCBwcml2YXRlIHN0YXRlU2VydmljZTogU3RhdGVTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGxvY2F0aW9uOiBMb2NhdGlvbikge1xuICAgICAgICBzdXBlcihwYXNzd29yZEdlbmVyYXRpb25TZXJ2aWNlLCBwbGF0Zm9ybVV0aWxzU2VydmljZSwgaTE4blNlcnZpY2UsIHdpbmRvdyk7XG4gICAgfVxuXG4gICAgYXN5bmMgbmdPbkluaXQoKSB7XG4gICAgICAgIGF3YWl0IHN1cGVyLm5nT25Jbml0KCk7XG4gICAgICAgIGNvbnN0IGFkZEVkaXRDaXBoZXJJbmZvID0gYXdhaXQgdGhpcy5zdGF0ZVNlcnZpY2UuZ2V0PGFueT4oJ2FkZEVkaXRDaXBoZXJJbmZvJyk7XG4gICAgICAgIGlmIChhZGRFZGl0Q2lwaGVySW5mbyAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmNpcGhlclN0YXRlID0gYWRkRWRpdENpcGhlckluZm8uY2lwaGVyO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2hvd1NlbGVjdCA9IHRoaXMuY2lwaGVyU3RhdGUgIT0gbnVsbDtcbiAgICB9XG5cbiAgICBzZWxlY3QoKSB7XG4gICAgICAgIHN1cGVyLnNlbGVjdCgpO1xuICAgICAgICB0aGlzLmNpcGhlclN0YXRlLmxvZ2luLnBhc3N3b3JkID0gdGhpcy5wYXNzd29yZDtcbiAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgIH1cblxuICAgIGNsb3NlKCkge1xuICAgICAgICB0aGlzLmxvY2F0aW9uLmJhY2soKTtcbiAgICB9XG59XG4iLCI8aGVhZGVyPlxuICAgIDxkaXYgY2xhc3M9XCJsZWZ0XCI+XG4gICAgICAgIDxhcHAtcG9wLW91dCBbc2hvd109XCIhc2hvd1NlbGVjdFwiPjwvYXBwLXBvcC1vdXQ+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGFwcEJsdXJDbGljayAoY2xpY2spPVwiY2xvc2UoKVwiICpuZ0lmPVwic2hvd1NlbGVjdFwiPnt7J2NhbmNlbCcgfCBpMThufX08L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiY2VudGVyXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwidGl0bGVcIj57eydwYXNzR2VuJyB8IGkxOG59fTwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwicmlnaHRcIj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgYXBwQmx1ckNsaWNrIChjbGljayk9XCJzZWxlY3QoKVwiICpuZ0lmPVwic2hvd1NlbGVjdFwiPnt7J3NlbGVjdCcgfCBpMThufX08L2J1dHRvbj5cbiAgICA8L2Rpdj5cbjwvaGVhZGVyPlxuPGNvbnRlbnQ+XG4gICAgPGFwcC1jYWxsb3V0IHR5cGU9XCJpbmZvXCIgKm5nSWY9XCJlbmZvcmNlZFBvbGljeU9wdGlvbnM/LmluRWZmZWN0KClcIj5cbiAgICAgICAge3sncGFzc3dvcmRHZW5lcmF0b3JQb2xpY3lJbkVmZmVjdCcgfCBpMThufX1cbiAgICA8L2FwcC1jYWxsb3V0PlxuICAgIDxkaXYgY2xhc3M9XCJwYXNzd29yZC1ibG9ja1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicGFzc3dvcmQtd3JhcHBlclwiIFtpbm5lckhUTUxdPVwicGFzc3dvcmQgfCBjb2xvclBhc3N3b3JkXCIgYXBwU2VsZWN0Q29weT48L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiYm94IGxpc3RcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50IHNpbmdsZS1saW5lXCI+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJveC1jb250ZW50LXJvdyB0ZXh0LXByaW1hcnlcIiBhcHBTdG9wQ2xpY2sgYXBwQmx1ckNsaWNrXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlZ2VuZXJhdGUoKVwiPnt7J3JlZ2VuZXJhdGVQYXNzd29yZCcgfCBpMThufX08L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYm94LWNvbnRlbnQtcm93IHRleHQtcHJpbWFyeVwiIGFwcFN0b3BDbGljayBhcHBCbHVyQ2xpY2tcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiY29weSgpXCI+e3snY29weVBhc3N3b3JkJyB8IGkxOG59fTwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiYm94IGxpc3RcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50IHNpbmdsZS1saW5lXCI+XG4gICAgICAgICAgICA8YSBjbGFzcz1cImJveC1jb250ZW50LXJvdyBib3gtY29udGVudC1yb3ctZmxleFwiIHJvdXRlckxpbms9XCIvZ2VuZXJhdG9yLWhpc3RvcnlcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93LW1haW5cIj57eydwYXNzd29yZEhpc3RvcnknIHwgaTE4bn19PC9kaXY+XG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1jaGV2cm9uLXJpZ2h0IGZhLWxnIHJvdy1zdWItaWNvblwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgIDwvYT5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImJveFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWhlYWRlclwiPlxuICAgICAgICAgICAge3snb3B0aW9ucycgfCBpMThufX1cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJib3gtY29udGVudFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50LXJvd1wiPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInNyLW9ubHkgcmFkaW8taGVhZGVyXCI+e3sndHlwZScgfCBpMThufX08L2xhYmVsPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyYWRpby1ncm91cCB0ZXh0LWRlZmF1bHRcIiBhcHBCb3hSb3cgKm5nRm9yPVwibGV0IG8gb2YgcGFzc1R5cGVPcHRpb25zXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwicmFkaW9cIiBbKG5nTW9kZWwpXT1cIm9wdGlvbnMudHlwZVwiIG5hbWU9XCJUeXBlX3t7by52YWx1ZX19XCIgaWQ9XCJ0eXBlX3t7by52YWx1ZX19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJvLnZhbHVlXCIgKGNoYW5nZSk9XCJzYXZlT3B0aW9ucygpXCIgW2NoZWNrZWRdPVwib3B0aW9ucy50eXBlID09PSBvLnZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJ0eXBlX3t7by52YWx1ZX19XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7e28ubmFtZX19XG4gICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImJveFwiICpuZ0lmPVwib3B0aW9ucy50eXBlID09PSAncGFzc3BocmFzZSdcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWNvbnRlbnQtcm93IGJveC1jb250ZW50LXJvdy1pbnB1dFwiIGFwcEJveFJvdz5cbiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwibnVtLXdvcmRzXCI+e3snbnVtV29yZHMnIHwgaTE4bn19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9XCJudW0td29yZHNcIiB0eXBlPVwibnVtYmVyXCIgbWluPVwiM1wiIG1heD1cIjIwXCIgKGNoYW5nZSk9XCJzYXZlT3B0aW9ucygpXCJcbiAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJvcHRpb25zLm51bVdvcmRzXCI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtY29udGVudC1yb3cgYm94LWNvbnRlbnQtcm93LWlucHV0XCIgYXBwQm94Um93PlxuICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJ3b3JkLXNlcGFyYXRvclwiPnt7J3dvcmRTZXBhcmF0b3InIHwgaTE4bn19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9XCJ3b3JkLXNlcGFyYXRvclwiIHR5cGU9XCJ0ZXh0XCIgbWF4bGVuZ3RoPVwiMVwiIChpbnB1dCk9XCJzYXZlT3B0aW9ucygpXCJcbiAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJvcHRpb25zLndvcmRTZXBhcmF0b3JcIj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50LXJvdyBib3gtY29udGVudC1yb3ctY2hlY2tib3hcIiBhcHBCb3hSb3c+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImNhcGl0YWxpemVcIj57eydjYXBpdGFsaXplJyB8IGkxOG59fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPGlucHV0IGlkPVwiY2FwaXRhbGl6ZVwiIHR5cGU9XCJjaGVja2JveFwiIChjaGFuZ2UpPVwic2F2ZU9wdGlvbnMoKVwiIFsobmdNb2RlbCldPVwib3B0aW9ucy5jYXBpdGFsaXplXCJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImVuZm9yY2VkUG9saWN5T3B0aW9ucz8uY2FwaXRhbGl6ZVwiPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWNvbnRlbnQtcm93IGJveC1jb250ZW50LXJvdy1jaGVja2JveFwiIGFwcEJveFJvdz5cbiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiaW5jbHVkZS1udW1iZXJcIj57eydpbmNsdWRlTnVtYmVyJyB8IGkxOG59fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPGlucHV0IGlkPVwiaW5jbHVkZS1udW1iZXJcIiB0eXBlPVwiY2hlY2tib3hcIiAoY2hhbmdlKT1cInNhdmVPcHRpb25zKClcIiBbKG5nTW9kZWwpXT1cIm9wdGlvbnMuaW5jbHVkZU51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJlbmZvcmNlZFBvbGljeU9wdGlvbnM/LmluY2x1ZGVOdW1iZXJcIj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwib3B0aW9ucy50eXBlID09PSAncGFzc3dvcmQnXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJib3hcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtY29udGVudFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtY29udGVudC1yb3cgYm94LWNvbnRlbnQtcm93LXNsaWRlclwiIGFwcEJveFJvdz5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImxlbmd0aFwiPnt7J2xlbmd0aCcgfCBpMThufX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9XCJsZW5ndGhcIiB0eXBlPVwibnVtYmVyXCIgbWluPVwiNVwiIG1heD1cIjEyOFwiIFsobmdNb2RlbCldPVwib3B0aW9ucy5sZW5ndGhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJzYXZlT3B0aW9ucygpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD1cImxlbmd0aFJhbmdlXCIgdHlwZT1cInJhbmdlXCIgbWluPVwiNVwiIG1heD1cIjEyOFwiIHN0ZXA9XCIxXCIgWyhuZ01vZGVsKV09XCJvcHRpb25zLmxlbmd0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInNsaWRlckNoYW5nZWQoKVwiIChpbnB1dCk9XCJzbGlkZXJJbnB1dCgpXCI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50LXJvdyBib3gtY29udGVudC1yb3ctY2hlY2tib3hcIiBhcHBCb3hSb3c+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJ1cHBlcmNhc2VcIj5BLVo8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9XCJ1cHBlcmNhc2VcIiB0eXBlPVwiY2hlY2tib3hcIiAoY2hhbmdlKT1cInNhdmVPcHRpb25zKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImVuZm9yY2VkUG9saWN5T3B0aW9ucy51c2VVcHBlcmNhc2VcIiBbKG5nTW9kZWwpXT1cIm9wdGlvbnMudXBwZXJjYXNlXCI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50LXJvdyBib3gtY29udGVudC1yb3ctY2hlY2tib3hcIiBhcHBCb3hSb3c+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJsb3dlcmNhc2VcIj5hLXo8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9XCJsb3dlcmNhc2VcIiB0eXBlPVwiY2hlY2tib3hcIiAoY2hhbmdlKT1cInNhdmVPcHRpb25zKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImVuZm9yY2VkUG9saWN5T3B0aW9ucy51c2VMb3dlcmNhc2VcIiBbKG5nTW9kZWwpXT1cIm9wdGlvbnMubG93ZXJjYXNlXCI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50LXJvdyBib3gtY29udGVudC1yb3ctY2hlY2tib3hcIiBhcHBCb3hSb3c+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJudW1iZXJzXCI+MC05PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPVwibnVtYmVyc1wiIHR5cGU9XCJjaGVja2JveFwiIChjaGFuZ2UpPVwic2F2ZU9wdGlvbnMoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZW5mb3JjZWRQb2xpY3lPcHRpb25zLnVzZU51bWJlcnNcIiBbKG5nTW9kZWwpXT1cIm9wdGlvbnMubnVtYmVyXCI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50LXJvdyBib3gtY29udGVudC1yb3ctY2hlY2tib3hcIiBhcHBCb3hSb3c+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJzcGVjaWFsXCI+IUAjJCVeJio8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9XCJzcGVjaWFsXCIgdHlwZT1cImNoZWNrYm94XCIgKGNoYW5nZSk9XCJzYXZlT3B0aW9ucygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJlbmZvcmNlZFBvbGljeU9wdGlvbnMudXNlU3BlY2lhbFwiIFsobmdNb2RlbCldPVwib3B0aW9ucy5zcGVjaWFsXCI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJib3hcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtY29udGVudFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtY29udGVudC1yb3cgYm94LWNvbnRlbnQtcm93LWlucHV0XCIgYXBwQm94Um93PlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwibWluLW51bWJlclwiPnt7J21pbk51bWJlcnMnIHwgaTE4bn19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPVwibWluLW51bWJlclwiIHR5cGU9XCJudW1iZXJcIiBtaW49XCIwXCIgbWF4PVwiOVwiIChjaGFuZ2UpPVwic2F2ZU9wdGlvbnMoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIm9wdGlvbnMubWluTnVtYmVyXCI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50LXJvdyBib3gtY29udGVudC1yb3ctaW5wdXRcIiBhcHBCb3hSb3c+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJtaW4tc3BlY2lhbFwiPnt7J21pblNwZWNpYWwnIHwgaTE4bn19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPVwibWluLXNwZWNpYWxcIiB0eXBlPVwibnVtYmVyXCIgbWluPVwiMFwiIG1heD1cIjlcIiAoY2hhbmdlKT1cInNhdmVPcHRpb25zKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJvcHRpb25zLm1pblNwZWNpYWxcIj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWNvbnRlbnQtcm93IGJveC1jb250ZW50LXJvdy1jaGVja2JveFwiIGFwcEJveFJvdz5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImFtYmlndW91c1wiPnt7J2F2b2lkQW1iQ2hhcicgfCBpMThufX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9XCJhbWJpZ3VvdXNcIiB0eXBlPVwiY2hlY2tib3hcIiAoY2hhbmdlKT1cInNhdmVPcHRpb25zKClcIiBbKG5nTW9kZWwpXT1cImF2b2lkQW1iaWd1b3VzXCI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG48L2NvbnRlbnQ+XG4iLCJpbXBvcnQgeyBlbmFibGVQcm9kTW9kZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgcGxhdGZvcm1Ccm93c2VyRHluYW1pYyB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXItZHluYW1pYyc7XG5cbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZVxucmVxdWlyZSgnLi9zY3NzL3BvcHVwLnNjc3MnKTtcblxuaW1wb3J0IHsgQXBwTW9kdWxlIH0gZnJvbSAnLi9hcHAubW9kdWxlJztcblxuaWYgKHByb2Nlc3MuZW52LkVOViA9PT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgZW5hYmxlUHJvZE1vZGUoKTtcbn1cblxuZnVuY3Rpb24gaW5pdCgpIHtcbiAgICBwbGF0Zm9ybUJyb3dzZXJEeW5hbWljKCkuYm9vdHN0cmFwTW9kdWxlKEFwcE1vZHVsZSwgeyBwcmVzZXJ2ZVdoaXRlc3BhY2VzOiB0cnVlIH0pO1xufVxuXG5pbml0KCk7XG4iLCJpbXBvcnQgeyBCcm93c2VyQXBpIH0gZnJvbSAnLi4vYnJvd3Nlci9icm93c2VyQXBpJztcblxuaW1wb3J0IHtcbiAgICBDb21wb25lbnQsXG4gICAgT25Jbml0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdhcHAtcHJpdmF0ZS1tb2RlJyxcbiAgICB0ZW1wbGF0ZVVybDogJ3ByaXZhdGUtbW9kZS5jb21wb25lbnQuaHRtbCcsXG59KVxuZXhwb3J0IGNsYXNzIFByaXZhdGVNb2RlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgICBwcml2YXRlTW9kZU1lc3NhZ2U6IHN0cmluZztcbiAgICBsZWFybk1vcmVNZXNzYWdlOiBzdHJpbmc7XG5cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgdGhpcy5wcml2YXRlTW9kZU1lc3NhZ2UgPSBjaHJvbWUuaTE4bi5nZXRNZXNzYWdlKCdwcml2YXRlTW9kZU1lc3NhZ2UnKTtcbiAgICAgICAgdGhpcy5sZWFybk1vcmVNZXNzYWdlID0gY2hyb21lLmkxOG4uZ2V0TWVzc2FnZSgnbGVhcm5Nb3JlJyk7XG4gICAgfVxuXG4gICAgbGVhcm5Nb3JlKCkge1xuICAgICAgICBCcm93c2VyQXBpLmNyZWF0ZU5ld1RhYignaHR0cHM6Ly9oZWxwLmJpdHdhcmRlbi5jb20vYXJ0aWNsZS9leHRlbnNpb24td29udC1sb2FkLWluLXByaXZhdGUtbW9kZS8nKTtcbiAgICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiY29udGVudFwiPlxuICAgIDxwIGNsYXNzPVwidGV4dC1jZW50ZXJcIj57e3ByaXZhdGVNb2RlTWVzc2FnZX19PC9wPlxuICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIHByaW1hcnkgYmxvY2tcIiAoY2xpY2spPVwibGVhcm5Nb3JlKClcIj5cbiAgICAgICAgPGI+e3tsZWFybk1vcmVNZXNzYWdlfX08L2I+XG4gICAgPC9idXR0b24+XG48L2Rpdj5cbiIsIi8vIGV4dHJhY3RlZCBieSBtaW5pLWNzcy1leHRyYWN0LXBsdWdpblxuZXhwb3J0IHt9OyIsImltcG9ydCB7IERhdGVQaXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcblxuaW1wb3J0IHtcbiAgICBDb21wb25lbnQsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIElucHV0LFxuICAgIE91dHB1dCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IENvbnRyb2xDb250YWluZXIsIE5nRm9ybSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuaW1wb3J0IHsgSTE4blNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL2kxOG4uc2VydmljZSc7XG5pbXBvcnQgeyBQbGF0Zm9ybVV0aWxzU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvcGxhdGZvcm1VdGlscy5zZXJ2aWNlJztcblxuaW1wb3J0IHsgRWZmbHV4RGF0ZXNDb21wb25lbnQgYXMgQmFzZUVmZmx1eERhdGVzQ29tcG9uZW50IH0gZnJvbSAnanNsaWItYW5ndWxhci9jb21wb25lbnRzL3NlbmQvZWZmbHV4LWRhdGVzLmNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnYXBwLXNlbmQtZWZmbHV4LWRhdGVzJyxcbiAgICB0ZW1wbGF0ZVVybDogJ2VmZmx1eC1kYXRlcy5jb21wb25lbnQuaHRtbCcsXG4gICAgdmlld1Byb3ZpZGVyczogW3sgcHJvdmlkZTogQ29udHJvbENvbnRhaW5lciwgdXNlRXhpc3Rpbmc6IE5nRm9ybSB9XSxcbn0pXG5leHBvcnQgY2xhc3MgRWZmbHV4RGF0ZXNDb21wb25lbnQgZXh0ZW5kcyBCYXNlRWZmbHV4RGF0ZXNDb21wb25lbnQge1xuICAgIEBJbnB1dCgpIHJlYWRvbmx5IGluUG9wb3V0OiBib29sZWFuO1xuICAgIEBPdXRwdXQoKSBwb3BPdXRXaW5kb3cgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgaTE4blNlcnZpY2U6IEkxOG5TZXJ2aWNlLCBwcm90ZWN0ZWQgcGxhdGZvcm1VdGlsc1NlcnZpY2U6IFBsYXRmb3JtVXRpbHNTZXJ2aWNlLFxuICAgICAgICBwcm90ZWN0ZWQgZGF0ZVBpcGU6IERhdGVQaXBlKSB7XG4gICAgICAgIHN1cGVyKGkxOG5TZXJ2aWNlLCBwbGF0Zm9ybVV0aWxzU2VydmljZSwgZGF0ZVBpcGUpO1xuICAgIH1cbn1cbiIsIjxuZy1jb250YWluZXIgW2Zvcm1Hcm91cF09XCJkYXRlc0Zvcm1cIj5cbiAgICA8ZGl2IGNsYXNzPVwiYm94XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJib3gtY29udGVudFwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFlZGl0TW9kZVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtY29udGVudC1yb3dcIiBhcHBCb3hSb3c+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJkZWxldGlvbkRhdGVcIj57eydkZWxldGlvbkRhdGUnIHwgaTE4bn19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBpZD1cImRlbGV0aW9uRGF0ZVwiIG5hbWU9XCJEZWxldGlvbkRhdGVTZWxlY3RcIiBmb3JtQ29udHJvbE5hbWU9XCJzZWxlY3RlZERlbGV0aW9uRGF0ZVByZXNldFwiIHJlcXVpcmVkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgbyBvZiBkZWxldGlvbkRhdGVQcmVzZXRzXCIgW25nVmFsdWVdPVwiby52YWx1ZVwiPnt7by5uYW1lfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWNvbnRlbnQtcm93XCIgYXBwQm94Um93ICpuZ0lmPVwic2VsZWN0ZWREZWxldGlvbkRhdGVQcmVzZXQudmFsdWUgPT09IDBcIj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImRlbGV0aW9uRGF0ZUN1c3RvbVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWNvbnRlbnQtcm93XCIgYXBwQm94Um93ICpuZ0lmPVwiZWRpdE1vZGVcIj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiZGVsZXRpb25EYXRlXCI+e3snZGVsZXRpb25EYXRlJyB8IGkxOG59fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImRlbGV0aW9uRGF0ZUN1c3RvbVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWZvb3RlclwiPlxuICAgICAgICAgICAge3snZGVsZXRpb25EYXRlRGVzYycgfCBpMThufX1cbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAqbmdJZj1cIighaW5Qb3BvdXQgJiYgYnJvd3NlclBhdGggPT0gJ2ZpcmVmb3gnKSAmJiAoZWRpdE1vZGUgfHwgKHNlbGVjdGVkRGVsZXRpb25EYXRlUHJlc2V0LnZhbHVlID09PSAwICYmICFlZGl0TW9kZSkpXCI+XG4gICAgICAgICAgICAgICAgPGJyPnt7J3NlbmRGaXJlZm94Q3VzdG9tRGF0ZVBvcG91dE1lc3NhZ2UxJyB8IGkxOG59fSA8YVxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicG9wT3V0V2luZG93LmVtaXQoKVwiPnt7J3NlbmRGaXJlZm94Q3VzdG9tRGF0ZVBvcG91dE1lc3NhZ2UyJyB8IGkxOG59fTwvYT5cbiAgICAgICAgICAgICAgICB7eydzZW5kRmlyZWZveEN1c3RvbURhdGVQb3BvdXRNZXNzYWdlMycgfCBpMThufX1cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiYm94XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJib3gtY29udGVudFwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFlZGl0TW9kZVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtY29udGVudC1yb3dcIiAqbmdJZj1cIiFlZGl0TW9kZVwiIGFwcEJveFJvdz5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImVkaXRFeHBpcmF0aW9uRGF0ZVwiPnt7J2V4cGlyYXRpb25EYXRlJyB8IGkxOG59fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgaWQ9XCJleHBpcmF0aW9uRGF0ZVwiIG5hbWU9XCJFeHBpcmF0aW9uRGF0ZVNlbGVjdFwiIFxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwic2VsZWN0ZWRFeHBpcmF0aW9uRGF0ZVByZXNldFwiIHJlcXVpcmVkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgbyBvZiBleHBpcmF0aW9uRGF0ZVByZXNldHNcIiBbbmdWYWx1ZV09XCJvLnZhbHVlXCI+e3tvLm5hbWV9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtY29udGVudC1yb3dcIiAqbmdJZj1cInNlbGVjdGVkRXhwaXJhdGlvbkRhdGVQcmVzZXQudmFsdWUgPT09IDBcIiBhcHBCb3hSb3c+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJleHBpcmF0aW9uRGF0ZUN1c3RvbVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWNvbnRlbnQtcm93XCIgKm5nSWY9XCJlZGl0TW9kZVwiIGFwcEJveFJvdz5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC1sYWJlbFwiPlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snZXhwaXJhdGlvbkRhdGUnIHwgaTE4bn19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKm5nSWY9XCIhZGlzYWJsZWRcIiBhcHBTdG9wQ2xpY2sgKGNsaWNrKT1cImNsZWFyRXhwaXJhdGlvbigpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eydjbGVhcicgfCBpMThufX1cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImV4cGlyYXRpb25EYXRlQ3VzdG9tXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJib3gtZm9vdGVyXCI+XG4gICAgICAgICAgICB7eydleHBpcmF0aW9uRGF0ZURlc2MnIHwgaTE4bn19XG4gICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgKm5nSWY9XCIoIWluUG9wb3V0ICYmIGJyb3dzZXJQYXRoID09ICdmaXJlZm94JykgJiYgKGVkaXRNb2RlIHx8IChzZWxlY3RlZEV4cGlyYXRpb25EYXRlUHJlc2V0LnZhbHVlID09PSAwICYmICFlZGl0TW9kZSkpXCI+XG4gICAgICAgICAgICAgICAgPGJyPnt7J3NlbmRGaXJlZm94Q3VzdG9tRGF0ZVBvcG91dE1lc3NhZ2UxJyB8IGkxOG59fSA8YVxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicG9wT3V0V2luZG93LmVtaXQoKVwiPnt7J3NlbmRGaXJlZm94Q3VzdG9tRGF0ZVBvcG91dE1lc3NhZ2UyJyB8IGkxOG59fTwvYT5cbiAgICAgICAgICAgICAgICB7eydzZW5kRmlyZWZveEN1c3RvbURhdGVQb3BvdXRNZXNzYWdlMycgfCBpMThufX1cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8bmctdGVtcGxhdGUgI2RlbGV0aW9uRGF0ZUN1c3RvbT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwiYnJvd3NlclBhdGhcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidmaXJlZm94J1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtZ3Jvd1wiPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9XCJkZWxldGlvbkRhdGVDdXN0b21GYWxsYmFja1wiIHR5cGU9XCJkYXRlXCIgbmFtZT1cIkRlbGV0aW9uRGF0ZUZhbGxiYWNrXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImZhbGxiYWNrRGVsZXRpb25EYXRlXCIgcmVxdWlyZWQgcGxhY2Vob2xkZXI9XCJNTS9ERC9ZWVlZXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtyZWFkT25seV09XCJkaXNhYmxlZFwiIGRhdGEtZGF0ZS1mb3JtYXQ9XCJtbS9kZC95eXl5XCI+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD1cImRlbGV0aW9uVGltZUN1c3RvbUZhbGxiYWNrXCIgdHlwZT1cInRpbWVcIiBuYW1lPVwiRGVsZXRpb25UaW1lRGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJmYWxsYmFja0RlbGV0aW9uVGltZVwiIHJlcXVpcmVkIHBsYWNlaG9sZGVyPVwiSEg6TU0gQU0vUE1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3JlYWRPbmx5XT1cImRpc2FibGVkXCI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidzYWZhcmknXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1ncm93XCI+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD1cImRlbGV0aW9uRGF0ZUN1c3RvbUZhbGxiYWNrXCIgdHlwZT1cImRhdGVcIiBuYW1lPVwiRGVsZXRpb25EYXRlRmFsbGJhY2tcIlxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiZmFsbGJhY2tEZWxldGlvbkRhdGVcIiByZXF1aXJlZCBwbGFjZWhvbGRlcj1cIk1NL0REL1lZWVlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3JlYWRPbmx5XT1cImRpc2FibGVkXCIgZGF0YS1kYXRlLWZvcm1hdD1cIm1tL2RkL3l5eXlcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBpZD1cImRlbGV0aW9uVGltZUN1c3RvbUZhbGxiYWNrXCIgZm9ybUNvbnRyb2xOYW1lPVwiZmFsbGJhY2tEZWxldGlvblRpbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT1cIlNhZmFyaURlbGV0aW9uVGltZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgbyBvZiBzYWZhcmlEZWxldGlvblRpbWVQcmVzZXRPcHRpb25zXCIgW25nVmFsdWVdPVwiby50d2VudHlGb3VySG91clwiPnt7by50d2VsdmVIb3VyfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hEZWZhdWx0PlxuICAgICAgICAgICAgICAgIDxpbnB1dCBpZD1cImRlbGV0aW9uRGF0ZUN1c3RvbVwiIHR5cGU9XCJkYXRldGltZS1sb2NhbFwiIG5hbWU9XCJEZWxldGlvbkRhdGVcIlxuICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJkZWZhdWx0RGVsZXRpb25EYXRlVGltZVwiIHJlcXVpcmVkIHBsYWNlaG9sZGVyPVwiTU0vREQvWVlZWSBISDpNTSBBTS9QTVwiPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPG5nLXRlbXBsYXRlICNleHBpcmF0aW9uRGF0ZUN1c3RvbT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwiYnJvd3NlclBhdGhcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidmaXJlZm94J1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtZ3Jvd1wiPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9XCJleHBpcmF0aW9uRGF0ZUN1c3RvbUZhbGxiYWNrXCIgdHlwZT1cImRhdGVcIiBuYW1lPVwiRXhwaXJhdGlvbkRhdGVGYWxsYmFja1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJmYWxsYmFja0V4cGlyYXRpb25EYXRlXCIgW3JlcXVpcmVkXT1cIiFlZGl0TW9kZVwiIHBsYWNlaG9sZGVyPVwiTU0vREQvWVlZWVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbcmVhZE9ubHldPVwiZGlzYWJsZWRcIiBkYXRhLWRhdGUtZm9ybWF0PVwibW0vZGQveXl5eVwiPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9XCJleHBpcmF0aW9uVGltZUN1c3RvbUZhbGxiYWNrXCIgdHlwZT1cInRpbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT1cIkV4cGlyYXRpb25UaW1lRmFsbGJhY2tcIiBmb3JtQ29udHJvbE5hbWU9XCJmYWxsYmFja0V4cGlyYXRpb25UaW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtyZXF1aXJlZF09XCIhZWRpdE1vZGVcIiBwbGFjZWhvbGRlcj1cIkhIOk1NIEFNL1BNXCIgW3JlYWRPbmx5XT1cImRpc2FibGVkXCI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidzYWZhcmknXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1ncm93XCI+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD1cImV4cGlyYXRpb25EYXRlQ3VzdG9tRmFsbGJhY2tcIiB0eXBlPVwiZGF0ZVwiIG5hbWU9XCJFeHBpcmF0aW9uRGF0ZUZhbGxiYWNrXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImZhbGxiYWNrRXhwaXJhdGlvbkRhdGVcIiBbcmVxdWlyZWRdPVwiIWVkaXRNb2RlXCIgcGxhY2Vob2xkZXI9XCJNTS9ERC9ZWVlZXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtyZWFkT25seV09XCJkaXNhYmxlZFwiIGRhdGEtZGF0ZS1mb3JtYXQ9XCJtbS9kZC95eXl5XCI+XG4gICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgaWQ9XCJleHBpcmF0aW9uVGltZUN1c3RvbUZhbGxiYWNrXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImZhbGxiYWNrRXhwaXJhdGlvblRpbWVcIiBuYW1lPVwiU2FmYXJpRXhwaXJhdGlvblRpbWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IG8gb2Ygc2FmYXJpRXhwaXJhdGlvblRpbWVQcmVzZXRPcHRpb25zXCIgW25nVmFsdWVdPVwiby50d2VudHlGb3VySG91clwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7by50d2VsdmVIb3VyfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hEZWZhdWx0PlxuICAgICAgICAgICAgICAgIDxpbnB1dCBpZD1cImV4cGlyYXRpb25EYXRlQ3VzdG9tXCIgdHlwZT1cImRhdGV0aW1lLWxvY2FsXCIgbmFtZT1cIkV4cGlyYXRpb25EYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiZGVmYXVsdEV4cGlyYXRpb25EYXRlVGltZVwiIHJlcXVpcmVkIHBsYWNlaG9sZGVyPVwiTU0vREQvWVlZWSBISDpNTSBBTS9QTVwiXG4gICAgICAgICAgICAgICAgICAgIFtyZWFkT25seV09XCJkaXNhYmxlZFwiPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvbmctdGVtcGxhdGU+XG48L25nLWNvbnRhaW5lcj5cblxuIiwiaW1wb3J0IHtcbiAgICBEYXRlUGlwZSxcbiAgICBMb2NhdGlvbixcbn0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcblxuaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7XG4gICAgQWN0aXZhdGVkUm91dGUsXG4gICAgUm91dGVyLFxufSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuXG5pbXBvcnQgeyBmaXJzdCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgRW52aXJvbm1lbnRTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9lbnZpcm9ubWVudC5zZXJ2aWNlJztcbmltcG9ydCB7IEkxOG5TZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9pMThuLnNlcnZpY2UnO1xuaW1wb3J0IHsgTG9nU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvbG9nLnNlcnZpY2UnO1xuaW1wb3J0IHsgTWVzc2FnaW5nU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvbWVzc2FnaW5nLnNlcnZpY2UnO1xuaW1wb3J0IHsgUGxhdGZvcm1VdGlsc1NlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL3BsYXRmb3JtVXRpbHMuc2VydmljZSc7XG5pbXBvcnQgeyBQb2xpY3lTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9wb2xpY3kuc2VydmljZSc7XG5pbXBvcnQgeyBTZW5kU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvc2VuZC5zZXJ2aWNlJztcbmltcG9ydCB7IFVzZXJTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy91c2VyLnNlcnZpY2UnO1xuXG5pbXBvcnQgeyBQb3B1cFV0aWxzU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL3BvcHVwLXV0aWxzLnNlcnZpY2UnO1xuXG5pbXBvcnQgeyBBZGRFZGl0Q29tcG9uZW50IGFzIEJhc2VBZGRFZGl0Q29tcG9uZW50IH0gZnJvbSAnanNsaWItYW5ndWxhci9jb21wb25lbnRzL3NlbmQvYWRkLWVkaXQuY29tcG9uZW50JztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdhcHAtc2VuZC1hZGQtZWRpdCcsXG4gICAgdGVtcGxhdGVVcmw6ICdzZW5kLWFkZC1lZGl0LmNvbXBvbmVudC5odG1sJyxcbn0pXG5leHBvcnQgY2xhc3MgU2VuZEFkZEVkaXRDb21wb25lbnQgZXh0ZW5kcyBCYXNlQWRkRWRpdENvbXBvbmVudCB7XG4gICAgLy8gT3B0aW9ucyBoZWFkZXJcbiAgICBzaG93T3B0aW9ucyA9IGZhbHNlO1xuICAgIC8vIEZpbGUgdmlzaWJpbGl0eVxuICAgIGlzRmlyZWZveCA9IGZhbHNlO1xuICAgIGluUG9wb3V0ID0gZmFsc2U7XG4gICAgaW5TaWRlYmFyID0gZmFsc2U7XG4gICAgaXNMaW51eCA9IGZhbHNlO1xuICAgIGlzVW5zdXBwb3J0ZWRNYWMgPSBmYWxzZTtcblxuICAgIGNvbnN0cnVjdG9yKGkxOG5TZXJ2aWNlOiBJMThuU2VydmljZSwgcGxhdGZvcm1VdGlsc1NlcnZpY2U6IFBsYXRmb3JtVXRpbHNTZXJ2aWNlLFxuICAgICAgICB1c2VyU2VydmljZTogVXNlclNlcnZpY2UsIG1lc3NhZ2luZ1NlcnZpY2U6IE1lc3NhZ2luZ1NlcnZpY2UsIHBvbGljeVNlcnZpY2U6IFBvbGljeVNlcnZpY2UsXG4gICAgICAgIGVudmlyb25tZW50U2VydmljZTogRW52aXJvbm1lbnRTZXJ2aWNlLCBkYXRlUGlwZTogRGF0ZVBpcGUsIHNlbmRTZXJ2aWNlOiBTZW5kU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSByb3V0ZTogQWN0aXZhdGVkUm91dGUsIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsIHByaXZhdGUgbG9jYXRpb246IExvY2F0aW9uLFxuICAgICAgICBwcml2YXRlIHBvcHVwVXRpbHNTZXJ2aWNlOiBQb3B1cFV0aWxzU2VydmljZSwgbG9nU2VydmljZTogTG9nU2VydmljZSkge1xuICAgICAgICBzdXBlcihpMThuU2VydmljZSwgcGxhdGZvcm1VdGlsc1NlcnZpY2UsIGVudmlyb25tZW50U2VydmljZSwgZGF0ZVBpcGUsIHNlbmRTZXJ2aWNlLCB1c2VyU2VydmljZSxcbiAgICAgICAgICAgIG1lc3NhZ2luZ1NlcnZpY2UsIHBvbGljeVNlcnZpY2UsIGxvZ1NlcnZpY2UpO1xuICAgIH1cblxuICAgIGdldCBzaG93RmlsZVNlbGVjdG9yKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gISh0aGlzLmVkaXRNb2RlIHx8IHRoaXMuc2hvd0ZpbGVQb3BvdXRNZXNzYWdlKTtcbiAgICB9XG5cbiAgICBnZXQgc2hvd0ZpbGVQb3BvdXRNZXNzYWdlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gIXRoaXMuZWRpdE1vZGUgJiYgKHRoaXMuc2hvd0ZpcmVmb3hGaWxlV2FybmluZyB8fCB0aGlzLnNob3dTYWZhcmlGaWxlV2FybmluZyB8fCB0aGlzLnNob3dDaHJvbWl1bUZpbGVXYXJuaW5nKTtcbiAgICB9XG5cbiAgICBnZXQgc2hvd0ZpcmVmb3hGaWxlV2FybmluZygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNGaXJlZm94ICYmICEodGhpcy5pblNpZGViYXIgfHwgdGhpcy5pblBvcG91dCk7XG4gICAgfVxuXG4gICAgZ2V0IHNob3dTYWZhcmlGaWxlV2FybmluZygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNTYWZhcmkgJiYgIXRoaXMuaW5Qb3BvdXQ7XG4gICAgfVxuXG4gICAgLy8gT25seSBzaG93IHRoaXMgZm9yIENocm9taXVtIGJhc2VkIGJyb3dzZXJzIGluIExpbnV4IGFuZCBNYWMgPiBCaWcgU3VyXG4gICAgZ2V0IHNob3dDaHJvbWl1bUZpbGVXYXJuaW5nKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gKHRoaXMuaXNMaW51eCB8fCB0aGlzLmlzVW5zdXBwb3J0ZWRNYWMpICYmICF0aGlzLmlzRmlyZWZveCAmJiAhKHRoaXMuaW5TaWRlYmFyIHx8IHRoaXMuaW5Qb3BvdXQpO1xuICAgIH1cblxuICAgIHBvcE91dFdpbmRvdygpIHtcbiAgICAgICAgdGhpcy5wb3B1cFV0aWxzU2VydmljZS5wb3BPdXQod2luZG93KTtcbiAgICB9XG5cbiAgICBhc3luYyBuZ09uSW5pdCgpIHtcbiAgICAgICAgLy8gRmlsZSB2aXNpbGliaXR5XG4gICAgICAgIHRoaXMuaXNGaXJlZm94ID0gdGhpcy5wbGF0Zm9ybVV0aWxzU2VydmljZS5pc0ZpcmVmb3goKTtcbiAgICAgICAgdGhpcy5pblBvcG91dCA9IHRoaXMucG9wdXBVdGlsc1NlcnZpY2UuaW5Qb3BvdXQod2luZG93KTtcbiAgICAgICAgdGhpcy5pblNpZGViYXIgPSB0aGlzLnBvcHVwVXRpbHNTZXJ2aWNlLmluU2lkZWJhcih3aW5kb3cpO1xuICAgICAgICB0aGlzLmlzTGludXggPSB3aW5kb3c/Lm5hdmlnYXRvcj8udXNlckFnZW50LmluZGV4T2YoJ0xpbnV4JykgIT09IC0xO1xuICAgICAgICB0aGlzLmlzVW5zdXBwb3J0ZWRNYWMgPSB0aGlzLnBsYXRmb3JtVXRpbHNTZXJ2aWNlLmlzQ2hyb21lKCkgJiYgd2luZG93Py5uYXZpZ2F0b3I/LmFwcFZlcnNpb24uaW5jbHVkZXMoJ01hYyBPUyBYIDExJyk7XG5cbiAgICAgICAgdGhpcy5yb3V0ZS5xdWVyeVBhcmFtcy5waXBlKGZpcnN0KCkpLnN1YnNjcmliZShhc3luYyBwYXJhbXMgPT4ge1xuICAgICAgICAgICAgaWYgKHBhcmFtcy5zZW5kSWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbmRJZCA9IHBhcmFtcy5zZW5kSWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocGFyYW1zLnR5cGUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0eXBlID0gcGFyc2VJbnQocGFyYW1zLnR5cGUsIG51bGwpO1xuICAgICAgICAgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmxvYWQoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmVkaXRNb2RlKSB7XG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25hbWUnKS5mb2N1cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCAyMDApO1xuICAgIH1cblxuICAgIGFzeW5jIHN1Ym1pdCgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgaWYgKGF3YWl0IHN1cGVyLnN1Ym1pdCgpKSB7XG4gICAgICAgICAgICB0aGlzLmNhbmNlbCgpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgYXN5bmMgZGVsZXRlKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICBpZiAoYXdhaXQgc3VwZXIuZGVsZXRlKCkpIHtcbiAgICAgICAgICAgIHRoaXMuY2FuY2VsKCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjYW5jZWwoKSB7XG4gICAgICAgIC8vIElmIHRydWUsIHRoZSB3aW5kb3cgd2FzIHBvcCdkIG91dCBvbiB0aGUgYWRkLXNlbmQgcGFnZS4gbG9jYXRpb24uYmFjayB3aWxsIG5vdCB3b3JrXG4gICAgICAgIGlmICgod2luZG93IGFzIGFueSkucHJldmlvdXNQb3B1cFVybC5zdGFydHNXaXRoKCcvYWRkLXNlbmQnKSkge1xuICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWyd0YWJzL3NlbmQnXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmxvY2F0aW9uLmJhY2soKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIjxmb3JtICNmb3JtIChuZ1N1Ym1pdCk9XCJzdWJtaXQoKVwiIFthcHBBcGlBY3Rpb25dPVwiZm9ybVByb21pc2VcIj5cbiAgICA8aGVhZGVyPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibGVmdFwiPlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgYXBwQmx1ckNsaWNrIChjbGljayk9XCJjYW5jZWwoKVwiPnt7J2NhbmNlbCcgfCBpMThufX08L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjZW50ZXJcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGl0bGVcIj57e3RpdGxlfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwicmlnaHRcIj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cInN1Ym1pdFwiIGFwcEJsdXJDbGljayBbZGlzYWJsZWRdPVwiZm9ybS5sb2FkaW5nIHx8IGRpc2FibGVTZW5kXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gW2hpZGRlbl09XCJmb3JtLmxvYWRpbmdcIj57eydzYXZlJyB8IGkxOG59fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXNwaW5uZXIgZmEtbGcgZmEtc3BpblwiIFtoaWRkZW5dPVwiIWZvcm0ubG9hZGluZ1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2hlYWRlcj5cbiAgICA8Y29udGVudCAqbmdJZj1cInNlbmRcIj5cbiAgICAgICAgPCEtLSBQb2xpY3kgQmFubmVyIC0tPlxuICAgICAgICA8YXBwLWNhbGxvdXQgdHlwZT1cIndhcm5pbmdcIiB0aXRsZT1cInt7J3NlbmREaXNhYmxlZCcgfCBpMThufX1cIiAqbmdJZj1cImRpc2FibGVTZW5kXCI+XG4gICAgICAgICAgICB7eydzZW5kRGlzYWJsZWRXYXJuaW5nJyB8IGkxOG59fVxuICAgICAgICA8L2FwcC1jYWxsb3V0PlxuICAgICAgICA8YXBwLWNhbGxvdXQgdHlwZT1cImluZm9cIiAqbmdJZj1cImRpc2FibGVIaWRlRW1haWwgJiYgIWRpc2FibGVTZW5kXCI+XG4gICAgICAgICAgICB7eydzZW5kT3B0aW9uc1BvbGljeUluRWZmZWN0JyB8IGkxOG59fVxuICAgICAgICA8L2FwcC1jYWxsb3V0PlxuICAgICAgICA8IS0tIEZpbGUgV2FybmluZyAtLT5cbiAgICAgICAgPGFwcC1jYWxsb3V0IHR5cGU9XCJ3YXJuaW5nXCIgaWNvbj1cImZhIGZhLWV4dGVybmFsLWxpbmsgZmEtcm90YXRlLTI3MCBmYS1md1wiIFtjbGlja2FibGVdPVwidHJ1ZVwiXG4gICAgICAgICAgICB0aXRsZT1cInt7J3NlbmRGaWxlQ2FsbG91dEhlYWRlcicgfCBpMThufX1cIlxuICAgICAgICAgICAgKm5nSWY9XCJzaG93RmlsZVBvcG91dE1lc3NhZ2UgJiYgc2VuZC50eXBlID09PSBzZW5kVHlwZS5GaWxlICYmICFkaXNhYmxlU2VuZFwiIChjbGljayk9XCJwb3BPdXRXaW5kb3coKVwiPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cInNob3dDaHJvbWl1bUZpbGVXYXJuaW5nXCI+e3snc2VuZExpbnV4Q2hyb21pdW1GaWxlV2FybmluZycgfCBpMThufX08L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzaG93RmlyZWZveEZpbGVXYXJuaW5nXCI+e3snc2VuZEZpcmVmb3hGaWxlV2FybmluZycgfCBpMThufX08L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzaG93U2FmYXJpRmlsZVdhcm5pbmdcIj57eydzZW5kU2FmYXJpRmlsZVdhcm5pbmcnIHwgaTE4bn19PC9kaXY+XG4gICAgICAgIDwvYXBwLWNhbGxvdXQ+XG4gICAgICAgIDwhLS0gTmFtZSAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImJveFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50LXJvd1wiIGFwcEJveFJvdz5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cIm5hbWVcIj57eyduYW1lJyB8IGkxOG59fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD1cIm5hbWVcIiB0eXBlPVwidGV4dFwiIG5hbWU9XCJOYW1lXCIgWyhuZ01vZGVsKV09XCJzZW5kLm5hbWVcIiBbcmVhZG9ubHldPVwiZGlzYWJsZVNlbmRcIj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1mb290ZXJcIj5cbiAgICAgICAgICAgICAgICB7eydzZW5kTmFtZURlc2MnIHwgaTE4bn19XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDwhLS0gVHlwZSBPcHRpb25zIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYm94XCIgKm5nSWY9XCIhZWRpdE1vZGVcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtY29udGVudCBuby1ob3ZlclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtY29udGVudC1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInNlbmRUeXBlT3B0aW9uc1wiPnt7J3NlbmRUeXBlSGVhZGVyJyB8IGkxOG59fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyYWRpby1ncm91cCB0ZXh0LWRlZmF1bHRcIiBhcHBCb3hSb3cgbmFtZT1cIlNlbmRUeXBlT3B0aW9uc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgbyBvZiB0eXBlT3B0aW9uc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJyYWRpb1wiIFsobmdNb2RlbCldPVwic2VuZC50eXBlXCIgbmFtZT1cIlR5cGVfe3tvLnZhbHVlfX1cIiBpZD1cInR5cGVfe3tvLnZhbHVlfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJvLnZhbHVlXCIgKGNoYW5nZSk9XCJ0eXBlQ2hhbmdlZCgpXCIgW2NoZWNrZWRdPVwic2VuZC50eXBlID09PSBvLnZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVhZG9ubHldPVwiZGlzYWJsZVNlbmRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJ0eXBlX3t7by52YWx1ZX19XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3tvLm5hbWV9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDwhLS0gRmlsZSAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImJveFwiICpuZ0lmPVwic2VuZC50eXBlID09PSBzZW5kVHlwZS5GaWxlICYmIChlZGl0TW9kZSB8fCBzaG93RmlsZVNlbGVjdG9yKVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50IG5vLWhvdmVyXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50LXJvd1wiICpuZ0lmPVwiZWRpdE1vZGVcIj5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImZpbGVcIj57eydmaWxlJyB8IGkxOG59fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3ctbWFpblwiPnt7c2VuZC5maWxlLmZpbGVOYW1lfX0gKHt7c2VuZC5maWxlLnNpemVOYW1lfX0pPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50LXJvd1wiICpuZ0lmPVwic2hvd0ZpbGVTZWxlY3RvclwiPlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiZmlsZVwiPnt7J2ZpbGUnIHwgaTE4bn19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJmaWxlXCIgaWQ9XCJmaWxlXCIgbmFtZT1cImZpbGVcIiByZXF1aXJlZCBbcmVhZG9ubHldPVwiZGlzYWJsZVNlbmRcIj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1mb290ZXJcIiAqbmdJZj1cInNob3dGaWxlU2VsZWN0b3JcIj5cbiAgICAgICAgICAgICAgICB7eydzZW5kRmlsZURlc2MnIHwgaTE4bn19IHt7J21heEZpbGVTaXplJyB8IGkxOG59fVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8IS0tIFRleHQgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJib3hcIiAqbmdJZj1cInNlbmQudHlwZSA9PT0gc2VuZFR5cGUuVGV4dFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50LXJvd1wiIGFwcEJveFJvdz5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInRleHRcIj57eydzZW5kVHlwZVRleHQnIHwgaTE4bn19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGlkPVwidGV4dFwiIG5hbWU9XCJUZXh0XCIgcm93cz1cIjZcIiBbKG5nTW9kZWwpXT1cInNlbmQudGV4dC50ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCJkaXNhYmxlU2VuZFwiPjwvdGV4dGFyZWE+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtZm9vdGVyXCI+XG4gICAgICAgICAgICAgICAge3snc2VuZFRleHREZXNjJyB8IGkxOG59fVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWNvbnRlbnQtcm93IGJveC1jb250ZW50LXJvdy1jaGVja2JveFwiIGFwcEJveFJvdz5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImhpZGVUZXh0XCI+e3snc2VuZEhpZGVUZXh0JyB8IGkxOG59fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD1cImhpZGVUZXh0XCIgdHlwZT1cImNoZWNrYm94XCIgbmFtZT1cIkhpZGVUZXh0XCIgWyhuZ01vZGVsKV09XCJzZW5kLnRleHQuaGlkZGVuXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlU2VuZFwiPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8IS0tIFNoYXJlIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYm94XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWhlYWRlclwiPlxuICAgICAgICAgICAgICAgIHt7J3NoYXJlJyB8IGkxOG59fVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICA8IS0tIENvcHkgTGluayBvbiBTYXZlIC0tPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtY29udGVudC1yb3cgYm94LWNvbnRlbnQtcm93LWNoZWNrYm94XCIgYXBwQm94Um93PlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiY29weU9uU2F2ZVwiPnt7J3NlbmRTaGFyZURlc2MnIHwgaTE4bn19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPVwiY29weU9uU2F2ZVwiIHR5cGU9XCJjaGVja2JveFwiIG5hbWU9XCJDb3B5T25TYXZlXCIgWyhuZ01vZGVsKV09XCJjb3B5TGlua1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZVNlbmRcIj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPCEtLSBPcHRpb25zIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYm94XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWhlYWRlci1leHBhbmRhYmxlXCIgKGNsaWNrKT1cInNob3dPcHRpb25zID0gIXNob3dPcHRpb25zXCI+XG4gICAgICAgICAgICAgICAge3snb3B0aW9ucycgfCBpMThufX1cbiAgICAgICAgICAgICAgICA8aSAqbmdJZj1cIiFzaG93T3B0aW9uc1wiIGNsYXNzPVwiZmEgZmEtY2hldnJvbi1kb3duIGZhLXNtIGljb25cIj48L2k+XG4gICAgICAgICAgICAgICAgPGkgKm5nSWY9XCJzaG93T3B0aW9uc1wiIGNsYXNzPVwiZmEgZmEtY2hldnJvbi11cCBmYS1zbSBpY29uXCI+PC9pPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IFtoaWRkZW5dPVwiIXNob3dPcHRpb25zXCI+XG4gICAgICAgICAgICA8YXBwLXNlbmQtZWZmbHV4LWRhdGVzXG4gICAgICAgICAgICAgICAgW2luaXRpYWxEZWxldGlvbkRhdGVdPVwic2VuZC5kZWxldGlvbkRhdGVcIiBbaW5pdGlhbEV4cGlyYXRpb25EYXRlXT1cInNlbmQuZXhwaXJhdGlvbkRhdGVcIiBcbiAgICAgICAgICAgICAgICBbZWRpdE1vZGVdPVwiZWRpdE1vZGVcIiBbZGlzYWJsZWRdPVwiZGlzYWJsZVNlbmRcIiAoZGF0ZXNDaGFuZ2VkKT1cInNldERhdGVzKCRldmVudClcIiAocG9wT3V0V2luZG93KT1cInBvcE91dFdpbmRvdygpXCI+XG4gICAgICAgICAgICA8L2FwcC1zZW5kLWVmZmx1eC1kYXRlcz5cbiAgICAgICAgICAgIDwhLS0gTWF4aW11bSBBY2Nlc3MgQ291bnQgLS0+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtY29udGVudC1yb3dcIiBhcHBCb3hSb3c+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwibWF4aW11bUFjY2Vzc0NvdW50XCI+e3snbWF4aW11bUFjY2Vzc0NvdW50JyB8IGkxOG59fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9XCJtYXhpbXVtQWNjZXNzQ291bnRcIiBtaW49XCIxXCIgdHlwZT1cIm51bWJlclwiIG5hbWU9XCJNYXhpbXVtQWNjZXNzQ291bnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwic2VuZC5tYXhBY2Nlc3NDb3VudFwiIFtyZWFkb25seV09XCJkaXNhYmxlU2VuZFwiPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWZvb3RlclwiPlxuICAgICAgICAgICAgICAgICAgICB7eydtYXhpbXVtQWNjZXNzQ291bnREZXNjJyB8IGkxOG59fVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8IS0tIEN1cnJlbnQgQWNjZXNzIENvdW50IC0tPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveFwiICpuZ0lmPVwiZWRpdE1vZGVcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50LXJvd1wiIGFwcEJveFJvdz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJjdXJyZW50QWNjZXNzQ291bnRcIj57eydjdXJyZW50QWNjZXNzQ291bnQnIHwgaTE4bn19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD1cImN1cnJlbnRBY2Nlc3NDb3VudFwiIHJlYWRvbmx5IHR5cGU9XCJ0ZXh0XCIgbmFtZT1cIkN1cnJlbnRBY2Nlc3NDb3VudFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJzZW5kLmFjY2Vzc0NvdW50XCI+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8IS0tIFBhc3N3b3JkIC0tPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWNvbnRlbnQtcm93IGJveC1jb250ZW50LXJvdy1mbGV4XCIgYXBwQm94Um93PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdy1tYWluXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInBhc3N3b3JkXCIgKm5nSWY9XCJoYXNQYXNzd29yZFwiPnt7J25ld1Bhc3N3b3JkJyB8IGkxOG59fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInBhc3N3b3JkXCIgKm5nSWY9XCIhaGFzUGFzc3dvcmRcIj57eydwYXNzd29yZCcgfCBpMThufX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD1cInBhc3N3b3JkXCIgdHlwZT1cInt7c2hvd1Bhc3N3b3JkID8gJ3RleHQnIDogJ3Bhc3N3b3JkJ319XCIgbmFtZT1cIlBhc3N3b3JkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtb25vc3BhY2VkXCIgWyhuZ01vZGVsKV09XCJwYXNzd29yZFwiIGFwcElucHV0VmVyYmF0aW0gW3JlYWRvbmx5XT1cImRpc2FibGVTZW5kXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhY3Rpb24tYnV0dG9uc1wiICpuZ0lmPVwiIWRpc2FibGVTZW5kXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJyb3ctYnRuXCIgYXBwU3RvcENsaWNrIGFwcEJsdXJDbGlja1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBBMTF5VGl0bGU9XCJ7eyd0b2dnbGVWaXNpYmlsaXR5JyB8IGkxOG59fVwiIChjbGljayk9XCJ0b2dnbGVQYXNzd29yZFZpc2libGUoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWxnXCIgW25nQ2xhc3NdPVwieydmYS1leWUnOiAhc2hvd1Bhc3N3b3JkLCAnZmEtZXllLXNsYXNoJzogc2hvd1Bhc3N3b3JkfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1mb290ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAge3snc2VuZFBhc3N3b3JkRGVzYycgfCBpMThufX1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPCEtLSBOb3RlcyAtLT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3hcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50LXJvd1wiIGFwcEJveFJvdz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJub3Rlc1wiPnt7J25vdGVzJyB8IGkxOG59fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgaWQ9XCJub3Rlc1wiIG5hbWU9XCJOb3Rlc1wiIHJvd3M9XCI2XCIgWyhuZ01vZGVsKV09XCJzZW5kLm5vdGVzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVhZG9ubHldPVwiZGlzYWJsZVNlbmRcIj48L3RleHRhcmVhPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWZvb3RlclwiPlxuICAgICAgICAgICAgICAgICAgICB7eydzZW5kTm90ZXNEZXNjJyB8IGkxOG59fVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8IS0tIEhpZGUgRW1haWwgLS0+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtY29udGVudC1yb3cgYm94LWNvbnRlbnQtcm93LWNoZWNrYm94XCIgYXBwQm94Um93PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImhpZGVFbWFpbFwiPnt7J2hpZGVFbWFpbCcgfCBpMThufX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPVwiaGlkZUVtYWlsXCIgdHlwZT1cImNoZWNrYm94XCIgbmFtZT1cIkhpZGVFbWFpbFwiIFsobmdNb2RlbCldPVwic2VuZC5oaWRlRW1haWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIoZGlzYWJsZUhpZGVFbWFpbCAmJiAhc2VuZC5oaWRlRW1haWwpIHx8IGRpc2FibGVTZW5kXCI+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8IS0tIERpc2FibGUgU2VuZCAtLT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3hcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50LXJvdyBib3gtY29udGVudC1yb3ctY2hlY2tib3hcIiBhcHBCb3hSb3c+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiZGlzYWJsZVNlbmRcIj57eydzZW5kRGlzYWJsZURlc2MnIHwgaTE4bn19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD1cImRpc2FibGVTZW5kXCIgdHlwZT1cImNoZWNrYm94XCIgbmFtZT1cIkRpc2FibGVTZW5kXCIgWyhuZ01vZGVsKV09XCJzZW5kLmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZVNlbmRcIj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDwhLS0gRGVsZXRlIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYm94IGxpc3RcIiAqbmdJZj1cImVkaXRNb2RlXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWNvbnRlbnQgc2luZ2xlLWxpbmVcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJveC1jb250ZW50LXJvd1wiIGFwcFN0b3BDbGljayBhcHBCbHVyQ2xpY2sgKGNsaWNrKT1cImRlbGV0ZSgpXCJcbiAgICAgICAgICAgICAgICAgICAgW2FwcEFwaUFjdGlvbl09XCJkZWxldGVQcm9taXNlXCIgI2RlbGV0ZUJ0bj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdy1tYWluIHRleHQtZGFuZ2VyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaWNvbiB0ZXh0LWRhbmdlclwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtdHJhc2gtbyBmYS1sZyBmYS1md1wiIFtoaWRkZW5dPVwiZGVsZXRlQnRuLmxvYWRpbmdcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1zcGlubmVyIGZhLXNwaW4gZmEtbGcgZmEtZndcIiBbaGlkZGVuXT1cIiFkZWxldGVCdG4ubG9hZGluZ1wiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3snZGVsZXRlU2VuZCcgfCBpMThufX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvY29udGVudD5cbjwvZm9ybT5cbiIsImltcG9ydCB7XG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQ29tcG9uZW50LFxuICAgIE5nWm9uZSxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7XG4gICAgUm91dGVyLFxufSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuXG5pbXBvcnQgeyBTZW5kVmlldyB9IGZyb20gJ2pzbGliLWNvbW1vbi9tb2RlbHMvdmlldy9zZW5kVmlldyc7XG5cbmltcG9ydCB7IFNlbmRDb21wb25lbnQgYXMgQmFzZVNlbmRDb21wb25lbnQgfSBmcm9tICdqc2xpYi1hbmd1bGFyL2NvbXBvbmVudHMvc2VuZC9zZW5kLmNvbXBvbmVudCc7XG5cbmltcG9ydCB7IEVudmlyb25tZW50U2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvZW52aXJvbm1lbnQuc2VydmljZSc7XG5pbXBvcnQgeyBJMThuU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvaTE4bi5zZXJ2aWNlJztcbmltcG9ydCB7IExvZ1NlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL2xvZy5zZXJ2aWNlJztcbmltcG9ydCB7IFBsYXRmb3JtVXRpbHNTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9wbGF0Zm9ybVV0aWxzLnNlcnZpY2UnO1xuaW1wb3J0IHsgUG9saWN5U2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvcG9saWN5LnNlcnZpY2UnO1xuaW1wb3J0IHsgU2VhcmNoU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvc2VhcmNoLnNlcnZpY2UnO1xuaW1wb3J0IHsgU2VuZFNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL3NlbmQuc2VydmljZSc7XG5pbXBvcnQgeyBTdGF0ZVNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL3N0YXRlLnNlcnZpY2UnO1xuaW1wb3J0IHsgU3luY1NlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL3N5bmMuc2VydmljZSc7XG5pbXBvcnQgeyBVc2VyU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvdXNlci5zZXJ2aWNlJztcblxuaW1wb3J0IHsgQnJvYWRjYXN0ZXJTZXJ2aWNlIH0gZnJvbSAnanNsaWItYW5ndWxhci9zZXJ2aWNlcy9icm9hZGNhc3Rlci5zZXJ2aWNlJztcblxuaW1wb3J0IHsgUG9wdXBVdGlsc1NlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9wb3B1cC11dGlscy5zZXJ2aWNlJztcblxuaW1wb3J0IHsgU2VuZFR5cGUgfSBmcm9tICdqc2xpYi1jb21tb24vZW51bXMvc2VuZFR5cGUnO1xuXG5jb25zdCBDb21wb25lbnRJZCA9ICdTZW5kQ29tcG9uZW50JztcbmNvbnN0IFNjb3BlU3RhdGVJZCA9IENvbXBvbmVudElkICsgJ1Njb3BlJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdhcHAtc2VuZC1ncm91cGluZ3MnLFxuICAgIHRlbXBsYXRlVXJsOiAnc2VuZC1ncm91cGluZ3MuY29tcG9uZW50Lmh0bWwnLFxufSlcbmV4cG9ydCBjbGFzcyBTZW5kR3JvdXBpbmdzQ29tcG9uZW50IGV4dGVuZHMgQmFzZVNlbmRDb21wb25lbnQge1xuICAgIC8vIEhlYWRlclxuICAgIHNob3dMZWZ0SGVhZGVyID0gdHJ1ZTtcbiAgICAvLyBTZW5kIFR5cGUgQ2FsY3VsYXRpb25zXG4gICAgdHlwZUNvdW50cyA9IG5ldyBNYXA8U2VuZFR5cGUsIG51bWJlcj4oKTtcbiAgICAvLyBTdGF0ZSBIYW5kbGluZ1xuICAgIHN0YXRlOiBhbnk7XG4gICAgc2NvcGVTdGF0ZTogYW55O1xuICAgIHByaXZhdGUgbG9hZGVkVGltZW91dDogbnVtYmVyO1xuXG4gICAgY29uc3RydWN0b3Ioc2VuZFNlcnZpY2U6IFNlbmRTZXJ2aWNlLCBpMThuU2VydmljZTogSTE4blNlcnZpY2UsXG4gICAgICAgIHBsYXRmb3JtVXRpbHNTZXJ2aWNlOiBQbGF0Zm9ybVV0aWxzU2VydmljZSwgZW52aXJvbm1lbnRTZXJ2aWNlOiBFbnZpcm9ubWVudFNlcnZpY2UsIG5nWm9uZTogTmdab25lLFxuICAgICAgICBwb2xpY3lTZXJ2aWNlOiBQb2xpY3lTZXJ2aWNlLCB1c2VyU2VydmljZTogVXNlclNlcnZpY2UsIHNlYXJjaFNlcnZpY2U6IFNlYXJjaFNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgcG9wdXBVdGlsczogUG9wdXBVdGlsc1NlcnZpY2UsIHByaXZhdGUgc3RhdGVTZXJ2aWNlOiBTdGF0ZVNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsIHByaXZhdGUgc3luY1NlcnZpY2U6IFN5bmNTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGNoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZiwgcHJpdmF0ZSBicm9hZGNhc3RlclNlcnZpY2U6IEJyb2FkY2FzdGVyU2VydmljZSxcbiAgICAgICAgbG9nU2VydmljZTogTG9nU2VydmljZSkge1xuICAgICAgICBzdXBlcihzZW5kU2VydmljZSwgaTE4blNlcnZpY2UsIHBsYXRmb3JtVXRpbHNTZXJ2aWNlLCBlbnZpcm9ubWVudFNlcnZpY2UsIG5nWm9uZSwgc2VhcmNoU2VydmljZSxcbiAgICAgICAgICAgIHBvbGljeVNlcnZpY2UsIHVzZXJTZXJ2aWNlLCBsb2dTZXJ2aWNlKTtcbiAgICAgICAgc3VwZXIub25TdWNjZXNzZnVsTG9hZCA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlVHlwZUNvdW50cygpO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RBbGwoKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBhc3luYyBuZ09uSW5pdCgpIHtcbiAgICAgICAgLy8gRGV0ZXJtaW5lIEhlYWRlciBkZXRhaWxzXG4gICAgICAgIHRoaXMuc2hvd0xlZnRIZWFkZXIgPSAhKHRoaXMucG9wdXBVdGlscy5pblNpZGViYXIod2luZG93KSAmJiB0aGlzLnBsYXRmb3JtVXRpbHNTZXJ2aWNlLmlzRmlyZWZveCgpKTtcbiAgICAgICAgLy8gQ2xlYXIgc3RhdGUgb2YgU2VuZCBUeXBlIENvbXBvbmVudFxuICAgICAgICB0aGlzLnN0YXRlU2VydmljZS5yZW1vdmUoJ1NlbmRUeXBlQ29tcG9uZW50Jyk7XG4gICAgICAgIC8vIExldCBzdXBlciBjbGFzcyBmaW5pc2hcbiAgICAgICAgYXdhaXQgc3VwZXIubmdPbkluaXQoKTtcbiAgICAgICAgLy8gSGFuZGxlIFN0YXRlIFJlc3RvcmUgaWYgbmVjZXNzYXJ5XG4gICAgICAgIGNvbnN0IHJlc3RvcmVkU2NvcGVTdGF0ZSA9IGF3YWl0IHRoaXMucmVzdG9yZVN0YXRlKCk7XG4gICAgICAgIHRoaXMuc3RhdGUgPSAoYXdhaXQgdGhpcy5zdGF0ZVNlcnZpY2UuZ2V0PGFueT4oQ29tcG9uZW50SWQpKSB8fCB7fTtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUuc2VhcmNoVGV4dCAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnNlYXJjaFRleHQgPSB0aGlzLnN0YXRlLnNlYXJjaFRleHQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuc3luY1NlcnZpY2Uuc3luY0luUHJvZ3Jlc3MpIHtcbiAgICAgICAgICAgIHRoaXMubG9hZCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5sb2FkZWRUaW1lb3V0ID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5sb2FkZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgNTAwMCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuc3luY1NlcnZpY2Uuc3luY0luUHJvZ3Jlc3MgfHwgcmVzdG9yZWRTY29wZVN0YXRlKSB7XG4gICAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB0aGlzLnBvcHVwVXRpbHMuc2V0Q29udGVudFNjcm9sbFkod2luZG93LCB0aGlzLnN0YXRlLnNjcm9sbFkpLCAwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIExvYWQgYWxsIHNlbmRzIGlmIHN5bmMgY29tcGxldGVkIGluIGJhY2tncm91bmRcbiAgICAgICAgdGhpcy5icm9hZGNhc3RlclNlcnZpY2Uuc3Vic2NyaWJlKENvbXBvbmVudElkLCAobWVzc2FnZTogYW55KSA9PiB7XG4gICAgICAgICAgICB0aGlzLm5nWm9uZS5ydW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAobWVzc2FnZS5jb21tYW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3N5bmNDb21wbGV0ZWQnOlxuICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSwgNTAwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIC8vIFJlbW92ZSB0aW1lb3V0XG4gICAgICAgIGlmICh0aGlzLmxvYWRlZFRpbWVvdXQgIT0gbnVsbCkge1xuICAgICAgICAgICAgd2luZG93LmNsZWFyVGltZW91dCh0aGlzLmxvYWRlZFRpbWVvdXQpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNhdmUgc3RhdGVcbiAgICAgICAgdGhpcy5zYXZlU3RhdGUoKTtcbiAgICAgICAgLy8gVW5zdWJzY3JpYmVcbiAgICAgICAgdGhpcy5icm9hZGNhc3RlclNlcnZpY2UudW5zdWJzY3JpYmUoQ29tcG9uZW50SWQpO1xuICAgIH1cblxuICAgIGFzeW5jIHNlbGVjdFR5cGUodHlwZTogU2VuZFR5cGUpIHtcbiAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvc2VuZC10eXBlJ10sIHsgcXVlcnlQYXJhbXM6IHsgdHlwZTogdHlwZSB9IH0pO1xuICAgIH1cblxuICAgIGFzeW5jIHNlbGVjdFNlbmQoczogU2VuZFZpZXcpIHtcbiAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvZWRpdC1zZW5kJ10sIHsgcXVlcnlQYXJhbXM6IHsgc2VuZElkOiBzLmlkIH0gfSk7XG4gICAgfVxuXG4gICAgYXN5bmMgYWRkU2VuZCgpIHtcbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZVNlbmQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy9hZGQtc2VuZCddKTtcbiAgICB9XG5cbiAgICBhc3luYyByZW1vdmVQYXNzd29yZChzOiBTZW5kVmlldyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICBpZiAodGhpcy5kaXNhYmxlU2VuZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHN1cGVyLnJlbW92ZVBhc3N3b3JkKHMpO1xuICAgIH1cblxuICAgIHNob3dTZWFyY2hpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhhc1NlYXJjaGVkIHx8ICghdGhpcy5zZWFyY2hQZW5kaW5nICYmIHRoaXMuc2VhcmNoU2VydmljZS5pc1NlYXJjaGFibGUodGhpcy5zZWFyY2hUZXh0KSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjYWxjdWxhdGVUeXBlQ291bnRzKCkge1xuICAgICAgICAvLyBDcmVhdGUgdHlwZSBjb3VudHNcbiAgICAgICAgY29uc3QgdHlwZUNvdW50cyA9IG5ldyBNYXA8U2VuZFR5cGUsIG51bWJlcj4oKTtcbiAgICAgICAgdGhpcy5zZW5kcy5mb3JFYWNoKHMgPT4ge1xuICAgICAgICAgICAgaWYgKHR5cGVDb3VudHMuaGFzKHMudHlwZSkpIHtcbiAgICAgICAgICAgICAgICB0eXBlQ291bnRzLnNldChzLnR5cGUsIHR5cGVDb3VudHMuZ2V0KHMudHlwZSkgKyAxKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdHlwZUNvdW50cy5zZXQocy50eXBlLCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMudHlwZUNvdW50cyA9IHR5cGVDb3VudHM7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBzYXZlU3RhdGUoKSB7XG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICAgICAgICBzY3JvbGxZOiB0aGlzLnBvcHVwVXRpbHMuZ2V0Q29udGVudFNjcm9sbFkod2luZG93KSxcbiAgICAgICAgICAgIHNlYXJjaFRleHQ6IHRoaXMuc2VhcmNoVGV4dCxcbiAgICAgICAgfTtcbiAgICAgICAgYXdhaXQgdGhpcy5zdGF0ZVNlcnZpY2Uuc2F2ZShDb21wb25lbnRJZCwgdGhpcy5zdGF0ZSk7XG5cbiAgICAgICAgdGhpcy5zY29wZVN0YXRlID0ge1xuICAgICAgICAgICAgc2VuZHM6IHRoaXMuc2VuZHMsXG4gICAgICAgICAgICB0eXBlQ291bnRzOiB0aGlzLnR5cGVDb3VudHMsXG4gICAgICAgIH07XG4gICAgICAgIGF3YWl0IHRoaXMuc3RhdGVTZXJ2aWNlLnNhdmUoU2NvcGVTdGF0ZUlkLCB0aGlzLnNjb3BlU3RhdGUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgcmVzdG9yZVN0YXRlKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICB0aGlzLnNjb3BlU3RhdGUgPSBhd2FpdCB0aGlzLnN0YXRlU2VydmljZS5nZXQ8YW55PihTY29wZVN0YXRlSWQpO1xuICAgICAgICBpZiAodGhpcy5zY29wZVN0YXRlID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnNjb3BlU3RhdGUuc2VuZHMgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5zZW5kcyA9IHRoaXMuc2NvcGVTdGF0ZS5zZW5kcztcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5zY29wZVN0YXRlLnR5cGVDb3VudHMgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy50eXBlQ291bnRzID0gdGhpcy5zY29wZVN0YXRlLnR5cGVDb3VudHM7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG59XG4iLCI8aGVhZGVyPlxuICAgIDxkaXYgY2xhc3M9XCJsZWZ0XCIgKm5nSWY9XCJzaG93TGVmdEhlYWRlclwiPlxuICAgICAgICA8YXBwLXBvcC1vdXQ+PC9hcHAtcG9wLW91dD5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwic2VhcmNoXCI+XG4gICAgICAgIDxpbnB1dCB0eXBlPVwic2VhcmNoXCIgcGxhY2Vob2xkZXI9XCJ7eydzZWFyY2hTZW5kcycgfCBpMThufX1cIiBpZD1cInNlYXJjaFwiIFsobmdNb2RlbCldPVwic2VhcmNoVGV4dFwiXG4gICAgICAgICAgICAoaW5wdXQpPVwic2VhcmNoKDIwMClcIiBhdXRvY29tcGxldGU9XCJvZmZcIiBhcHBBdXRvZm9jdXM+XG4gICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtc2VhcmNoXCI+PC9pPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJyaWdodFwiPlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBhcHBCbHVyQ2xpY2sgKGNsaWNrKT1cImFkZFNlbmQoKVwiIGFwcEExMXlUaXRsZT1cInt7J2FkZFNlbmQnIHwgaTE4bn19XCIgW2Rpc2FibGVkXT1cImRpc2FibGVTZW5kXCI+XG4gICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXBsdXMgZmEtbGcgZmEtZndcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuPC9oZWFkZXI+XG48Y29udGVudCBbbmdDbGFzc109XCJ7J2ZsZXgnIDogZGlzYWJsZVNlbmQsICd0YWItcGFnZScgOiBkaXNhYmxlU2VuZH1cIj5cbiAgICA8YXBwLWNhbGxvdXQgdHlwZT1cIndhcm5pbmdcIiB0aXRsZT1cInt7J3NlbmREaXNhYmxlZCcgfCBpMThufX1cIiAqbmdJZj1cImRpc2FibGVTZW5kXCI+XG4gICAgICAgIHt7J3NlbmREaXNhYmxlZFdhcm5pbmcnIHwgaTE4bn19XG4gICAgPC9hcHAtY2FsbG91dD5cbiAgICA8ZGl2IGNsYXNzPVwibm8taXRlbXNcIiAqbmdJZj1cIighc2VuZHMgfHwgIXNlbmRzLmxlbmd0aCkgJiYgIXNob3dTZWFyY2hpbmcoKVwiPlxuICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXNwaW5uZXIgZmEtc3BpbiBmYS0zeFwiICpuZ0lmPVwiIWxvYWRlZFwiPjwvaT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImxvYWRlZFwiPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1mcm93bi1vIGZhLTR4XCI+PC9pPlxuICAgICAgICAgICAgPHA+e3snbm9JdGVtc0luTGlzdCcgfCBpMThufX08L3A+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiYWRkU2VuZCgpXCIgY2xhc3M9XCJidG4gYmxvY2sgcHJpbWFyeSBsaW5rXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZVNlbmRcIj57eydhZGRTZW5kJyB8IGkxOG59fTwvYnV0dG9uPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2VuZHMgJiYgc2VuZHMubGVuZ3RoICYmICFzaG93U2VhcmNoaW5nKClcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImJveCBsaXN0XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWhlYWRlclwiPlxuICAgICAgICAgICAgICAgIHt7J3R5cGVzJyB8IGkxOG59fVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWNvbnRlbnQgc2luZ2xlLWxpbmVcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJveC1jb250ZW50LXJvd1wiIGFwcFN0b3BDbGljayBhcHBCbHVyQ2xpY2sgKGNsaWNrKT1cInNlbGVjdFR5cGUoc2VuZFR5cGUuVGV4dClcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdy1tYWluXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaWNvblwiPjxpIGNsYXNzPVwiZmEgZmEtZncgZmEtbGcgZmEtZmlsZS10ZXh0LW9cIj48L2k+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHRcIj57eydzZW5kVHlwZVRleHQnIHwgaTE4bn19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyb3ctc3ViLWxhYmVsXCI+e3t0eXBlQ291bnRzLmdldChzZW5kVHlwZS5UZXh0KSB8fCAwfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPjxpIGNsYXNzPVwiZmEgZmEtY2hldnJvbi1yaWdodCBmYS1sZyByb3ctc3ViLWljb25cIj48L2k+PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYm94LWNvbnRlbnQtcm93XCIgYXBwU3RvcENsaWNrIGFwcEJsdXJDbGljayAoY2xpY2spPVwic2VsZWN0VHlwZShzZW5kVHlwZS5GaWxlKVwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93LW1haW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpY29uXCI+PGkgY2xhc3M9XCJmYSBmYS1mdyBmYS1sZyBmYS1maWxlLW9cIj48L2k+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHRcIj57eydzZW5kVHlwZUZpbGUnIHwgaTE4bn19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyb3ctc3ViLWxhYmVsXCI+e3t0eXBlQ291bnRzLmdldChzZW5kVHlwZS5GaWxlKSB8fCAwfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPjxpIGNsYXNzPVwiZmEgZmEtY2hldnJvbi1yaWdodCBmYS1sZyByb3ctc3ViLWljb25cIj48L2k+PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYm94IGxpc3RcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtaGVhZGVyXCI+XG4gICAgICAgICAgICAgICAge3snYWxsU2VuZHMnIHwgaTE4bn19XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtcmlnaHRcIj57e3NlbmRzLmxlbmd0aH19PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtY29udGVudFwiPlxuICAgICAgICAgICAgICAgIDxhcHAtc2VuZC1saXN0IFtzZW5kc109XCJzZW5kc1wiIHRpdGxlPVwie3snZWRpdEl0ZW0nIHwgaTE4bn19XCIgW2Rpc2FibGVkQnlQb2xpY3ldPVwiZGlzYWJsZVNlbmRcIlxuICAgICAgICAgICAgICAgICAgICAob25TZWxlY3RlZCk9XCJzZWxlY3RTZW5kKCRldmVudClcIiAob25Db3B5U2VuZExpbmspPVwiY29weSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgKG9uUmVtb3ZlUGFzc3dvcmQpPVwicmVtb3ZlUGFzc3dvcmQoJGV2ZW50KVwiIChvbkRlbGV0ZVNlbmQpPVwiZGVsZXRlKCRldmVudClcIj48L2FwcC1zZW5kLWxpc3Q+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNob3dTZWFyY2hpbmcoKVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibm8taXRlbXNcIiAqbmdJZj1cIiFmaWx0ZXJlZFNlbmRzIHx8ICFmaWx0ZXJlZFNlbmRzLmxlbmd0aFwiPlxuICAgICAgICAgICAgPHA+e3snbm9JdGVtc0luTGlzdCcgfCBpMThufX08L3A+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYm94IGxpc3QgZnVsbC1saXN0XCIgKm5nSWY9XCJmaWx0ZXJlZFNlbmRzICYmIGZpbHRlcmVkU2VuZHMubGVuZ3RoID4gMFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgPGFwcC1zZW5kLWxpc3QgW3NlbmRzXT1cImZpbHRlcmVkU2VuZHNcIiB0aXRsZT1cInt7J2VkaXRJdGVtJyB8IGkxOG59fVwiIFtkaXNhYmxlZEJ5UG9saWN5XT1cImRpc2FibGVTZW5kXCJcbiAgICAgICAgICAgICAgICAgICAgKG9uU2VsZWN0ZWQpPVwic2VsZWN0U2VuZCgkZXZlbnQpXCIgKG9uQ29weVNlbmRMaW5rKT1cImNvcHkoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIChvblJlbW92ZVBhc3N3b3JkKT1cInJlbW92ZVBhc3N3b3JkKCRldmVudClcIiAob25EZWxldGVTZW5kKT1cImRlbGV0ZSgkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgPC9hcHAtc2VuZC1saXN0PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuPC9jb250ZW50PlxuIiwiaW1wb3J0IHtcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBDb21wb25lbnQsXG4gICAgTmdab25lLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHtcbiAgICBBY3RpdmF0ZWRSb3V0ZSxcbiAgICBSb3V0ZXIsXG59IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5cbmltcG9ydCB7IGZpcnN0IH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBMb2NhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5cbmltcG9ydCB7IFNlbmRWaWV3IH0gZnJvbSAnanNsaWItY29tbW9uL21vZGVscy92aWV3L3NlbmRWaWV3JztcblxuaW1wb3J0IHsgU2VuZENvbXBvbmVudCBhcyBCYXNlU2VuZENvbXBvbmVudCB9IGZyb20gJ2pzbGliLWFuZ3VsYXIvY29tcG9uZW50cy9zZW5kL3NlbmQuY29tcG9uZW50JztcblxuaW1wb3J0IHsgRW52aXJvbm1lbnRTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9lbnZpcm9ubWVudC5zZXJ2aWNlJztcbmltcG9ydCB7IEkxOG5TZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9pMThuLnNlcnZpY2UnO1xuaW1wb3J0IHsgTG9nU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvbG9nLnNlcnZpY2UnO1xuaW1wb3J0IHsgUGxhdGZvcm1VdGlsc1NlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL3BsYXRmb3JtVXRpbHMuc2VydmljZSc7XG5pbXBvcnQgeyBQb2xpY3lTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9wb2xpY3kuc2VydmljZSc7XG5pbXBvcnQgeyBTZWFyY2hTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9zZWFyY2guc2VydmljZSc7XG5pbXBvcnQgeyBTZW5kU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvc2VuZC5zZXJ2aWNlJztcbmltcG9ydCB7IFN0YXRlU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvc3RhdGUuc2VydmljZSc7XG5pbXBvcnQgeyBVc2VyU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvdXNlci5zZXJ2aWNlJztcblxuaW1wb3J0IHsgQnJvYWRjYXN0ZXJTZXJ2aWNlIH0gZnJvbSAnanNsaWItYW5ndWxhci9zZXJ2aWNlcy9icm9hZGNhc3Rlci5zZXJ2aWNlJztcblxuaW1wb3J0IHsgUG9wdXBVdGlsc1NlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9wb3B1cC11dGlscy5zZXJ2aWNlJztcblxuaW1wb3J0IHsgU2VuZFR5cGUgfSBmcm9tICdqc2xpYi1jb21tb24vZW51bXMvc2VuZFR5cGUnO1xuXG5jb25zdCBDb21wb25lbnRJZCA9ICdTZW5kVHlwZUNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnYXBwLXNlbmQtdHlwZScsXG4gICAgdGVtcGxhdGVVcmw6ICdzZW5kLXR5cGUuY29tcG9uZW50Lmh0bWwnLFxufSlcbmV4cG9ydCBjbGFzcyBTZW5kVHlwZUNvbXBvbmVudCBleHRlbmRzIEJhc2VTZW5kQ29tcG9uZW50IHtcbiAgICBncm91cGluZ1RpdGxlOiBzdHJpbmc7XG4gICAgLy8gU3RhdGUgSGFuZGxpbmdcbiAgICBzdGF0ZTogYW55O1xuICAgIHByaXZhdGUgcmVmcmVzaFRpbWVvdXQ6IG51bWJlcjtcbiAgICBwcml2YXRlIGFwcGx5U2F2ZWRTdGF0ZSA9IHRydWU7XG5cbiAgICBjb25zdHJ1Y3RvcihzZW5kU2VydmljZTogU2VuZFNlcnZpY2UsIGkxOG5TZXJ2aWNlOiBJMThuU2VydmljZSxcbiAgICAgICAgcGxhdGZvcm1VdGlsc1NlcnZpY2U6IFBsYXRmb3JtVXRpbHNTZXJ2aWNlLCBlbnZpcm9ubWVudFNlcnZpY2U6IEVudmlyb25tZW50U2VydmljZSwgbmdab25lOiBOZ1pvbmUsXG4gICAgICAgIHBvbGljeVNlcnZpY2U6IFBvbGljeVNlcnZpY2UsIHVzZXJTZXJ2aWNlOiBVc2VyU2VydmljZSwgc2VhcmNoU2VydmljZTogU2VhcmNoU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBwb3B1cFV0aWxzOiBQb3B1cFV0aWxzU2VydmljZSwgcHJpdmF0ZSBzdGF0ZVNlcnZpY2U6IFN0YXRlU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSByb3V0ZTogQWN0aXZhdGVkUm91dGUsIHByaXZhdGUgbG9jYXRpb246IExvY2F0aW9uLCBwcml2YXRlIGNoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICAgICAgcHJpdmF0ZSBicm9hZGNhc3RlclNlcnZpY2U6IEJyb2FkY2FzdGVyU2VydmljZSwgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlciwgbG9nU2VydmljZTogTG9nU2VydmljZSkge1xuICAgICAgICBzdXBlcihzZW5kU2VydmljZSwgaTE4blNlcnZpY2UsIHBsYXRmb3JtVXRpbHNTZXJ2aWNlLCBlbnZpcm9ubWVudFNlcnZpY2UsIG5nWm9uZSwgc2VhcmNoU2VydmljZSxcbiAgICAgICAgICAgIHBvbGljeVNlcnZpY2UsIHVzZXJTZXJ2aWNlLCBsb2dTZXJ2aWNlKTtcbiAgICAgICAgc3VwZXIub25TdWNjZXNzZnVsTG9hZCA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0VHlwZSh0aGlzLnR5cGUpO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmFwcGx5U2F2ZWRTdGF0ZSA9ICh3aW5kb3cgYXMgYW55KS5wcmV2aW91c1BvcHVwVXJsICE9IG51bGwgJiZcbiAgICAgICAgICAgICEod2luZG93IGFzIGFueSkucHJldmlvdXNQb3B1cFVybC5zdGFydHNXaXRoKCcvc2VuZC10eXBlJyk7XG4gICAgfVxuXG4gICAgYXN5bmMgbmdPbkluaXQoKSB7XG4gICAgICAgIC8vIExldCBzdXBlciBjbGFzcyBmaW5pc2hcbiAgICAgICAgYXdhaXQgc3VwZXIubmdPbkluaXQoKTtcbiAgICAgICAgdGhpcy5yb3V0ZS5xdWVyeVBhcmFtcy5waXBlKGZpcnN0KCkpLnN1YnNjcmliZShhc3luYyBwYXJhbXMgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuYXBwbHlTYXZlZFN0YXRlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IChhd2FpdCB0aGlzLnN0YXRlU2VydmljZS5nZXQ8YW55PihDb21wb25lbnRJZCkpIHx8IHt9O1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnN0YXRlLnNlYXJjaFRleHQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaFRleHQgPSB0aGlzLnN0YXRlLnNlYXJjaFRleHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocGFyYW1zLnR5cGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMudHlwZSA9IHBhcnNlSW50KHBhcmFtcy50eXBlLCBudWxsKTtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMudHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFNlbmRUeXBlLlRleHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdyb3VwaW5nVGl0bGUgPSB0aGlzLmkxOG5TZXJ2aWNlLnQoJ3NlbmRUeXBlVGV4dCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgU2VuZFR5cGUuRmlsZTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ3JvdXBpbmdUaXRsZSA9IHRoaXMuaTE4blNlcnZpY2UudCgnc2VuZFR5cGVGaWxlJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmxvYWQocyA9PiBzLnR5cGUgPT09IHRoaXMudHlwZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFJlc3RvcmUgc3RhdGUgYW5kIHJlbW92ZSByZWZlcmVuY2VcbiAgICAgICAgICAgIGlmICh0aGlzLmFwcGx5U2F2ZWRTdGF0ZSAmJiB0aGlzLnN0YXRlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB0aGlzLnBvcHVwVXRpbHMuc2V0Q29udGVudFNjcm9sbFkod2luZG93LCB0aGlzLnN0YXRlLnNjcm9sbFkpLCAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnJlbW92ZShDb21wb25lbnRJZCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFJlZnJlc2ggU2VuZCBsaXN0IGlmIHN5bmMgY29tcGxldGVkIGluIGJhY2tncm91bmRcbiAgICAgICAgdGhpcy5icm9hZGNhc3RlclNlcnZpY2Uuc3Vic2NyaWJlKENvbXBvbmVudElkLCAobWVzc2FnZTogYW55KSA9PiB7XG4gICAgICAgICAgICB0aGlzLm5nWm9uZS5ydW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAobWVzc2FnZS5jb21tYW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3N5bmNDb21wbGV0ZWQnOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2Uuc3VjY2Vzc2Z1bGx5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoVGltZW91dCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgNTAwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIC8vIFJlbW92ZSB0aW1lb3V0XG4gICAgICAgIGlmICh0aGlzLnJlZnJlc2hUaW1lb3V0ICE9IG51bGwpIHtcbiAgICAgICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5yZWZyZXNoVGltZW91dCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU2F2ZSBzdGF0ZVxuICAgICAgICB0aGlzLnNhdmVTdGF0ZSgpO1xuICAgICAgICAvLyBVbnN1YnNjcmliZVxuICAgICAgICB0aGlzLmJyb2FkY2FzdGVyU2VydmljZS51bnN1YnNjcmliZShDb21wb25lbnRJZCk7XG4gICAgfVxuXG4gICAgYXN5bmMgc2VsZWN0U2VuZChzOiBTZW5kVmlldykge1xuICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy9lZGl0LXNlbmQnXSwgeyBxdWVyeVBhcmFtczogeyBzZW5kSWQ6IHMuaWQgfSB9KTtcbiAgICB9XG5cbiAgICBhc3luYyBhZGRTZW5kKCkge1xuICAgICAgICBpZiAodGhpcy5kaXNhYmxlU2VuZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL2FkZC1zZW5kJ10sIHsgcXVlcnlQYXJhbXM6IHsgdHlwZTogdGhpcy50eXBlIH0gfSk7XG4gICAgfVxuXG4gICAgYXN5bmMgcmVtb3ZlUGFzc3dvcmQoczogU2VuZFZpZXcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZVNlbmQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBzdXBlci5yZW1vdmVQYXNzd29yZChzKTtcbiAgICB9XG5cbiAgICBiYWNrKCkge1xuICAgICAgICAod2luZG93IGFzIGFueSkucm91dGVEaXJlY3Rpb24gPSAnYic7XG4gICAgICAgIHRoaXMubG9jYXRpb24uYmFjaygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgc2F2ZVN0YXRlKCkge1xuICAgICAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgICAgICAgc2Nyb2xsWTogdGhpcy5wb3B1cFV0aWxzLmdldENvbnRlbnRTY3JvbGxZKHdpbmRvdyksXG4gICAgICAgICAgICBzZWFyY2hUZXh0OiB0aGlzLnNlYXJjaFRleHQsXG4gICAgICAgIH07XG4gICAgICAgIGF3YWl0IHRoaXMuc3RhdGVTZXJ2aWNlLnNhdmUoQ29tcG9uZW50SWQsIHRoaXMuc3RhdGUpO1xuICAgIH1cbn1cbiIsIjxoZWFkZXI+XG4gICAgPGRpdiBjbGFzcz1cImxlZnRcIj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgYXBwQmx1ckNsaWNrIChjbGljayk9XCJiYWNrKClcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaGVhZGVyLWljb25cIj48aSBjbGFzcz1cImZhIGZhLWNoZXZyb24tbGVmdFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT48L3NwYW4+XG4gICAgICAgICAgICA8c3Bhbj57eydiYWNrJyB8IGkxOG59fTwvc3Bhbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cInNlYXJjaFwiPlxuICAgICAgICA8aW5wdXQgdHlwZT1cInNlYXJjaFwiIHBsYWNlaG9sZGVyPVwie3snc2VhcmNoVHlwZScgfCBpMThufX1cIiBpZD1cInNlYXJjaFwiIFsobmdNb2RlbCldPVwic2VhcmNoVGV4dFwiXG4gICAgICAgICAgICAoaW5wdXQpPVwic2VhcmNoKDIwMClcIiBhdXRvY29tcGxldGU9XCJvZmZcIiBhcHBBdXRvZm9jdXM+XG4gICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtc2VhcmNoXCI+PC9pPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJyaWdodFwiPlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBhcHBCbHVyQ2xpY2sgKGNsaWNrKT1cImFkZFNlbmQoKVwiIGFwcEExMXlUaXRsZT1cInt7J2FkZFNlbmQnIHwgaTE4bn19XCIgW2Rpc2FibGVkXT1cImRpc2FibGVTZW5kXCI+XG4gICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXBsdXMgZmEtbGcgZmEtZndcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuPC9oZWFkZXI+XG48Y29udGVudCBbbmdDbGFzc109XCJ7J2ZsZXgnIDogZGlzYWJsZVNlbmR9XCI+XG4gICAgPGFwcC1jYWxsb3V0IHR5cGU9XCJ3YXJuaW5nXCIgdGl0bGU9XCJ7eydzZW5kRGlzYWJsZWQnIHwgaTE4bn19XCIgKm5nSWY9XCJkaXNhYmxlU2VuZFwiPlxuICAgICAgICB7eydzZW5kRGlzYWJsZWRXYXJuaW5nJyB8IGkxOG59fVxuICAgIDwvYXBwLWNhbGxvdXQ+XG4gICAgPGRpdiBjbGFzcz1cIm5vLWl0ZW1zXCIgKm5nSWY9XCIhZmlsdGVyZWRTZW5kcy5sZW5ndGhcIj5cbiAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1zcGlubmVyIGZhLXNwaW4gZmEtM3hcIiAqbmdJZj1cIiFsb2FkZWRcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJsb2FkZWRcIj5cbiAgICAgICAgICAgIDxwPnt7J25vSXRlbXNJbkxpc3QnIHwgaTE4bn19PC9wPlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImFkZFNlbmQoKVwiIGNsYXNzPVwiYnRuIGJsb2NrIHByaW1hcnkgbGlua1wiIFtkaXNhYmxlZF09XCJkaXNhYmxlU2VuZFwiPlxuICAgICAgICAgICAgICAgIHt7J2FkZFNlbmQnIHwgaTE4bn19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImJveCBsaXN0IG9ubHktbGlzdFwiICpuZ0lmPVwiZmlsdGVyZWRTZW5kcy5sZW5ndGhcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImJveC1oZWFkZXJcIj5cbiAgICAgICAgICAgIHt7Z3JvdXBpbmdUaXRsZX19XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZsZXgtcmlnaHRcIj57e2ZpbHRlcmVkU2VuZHMubGVuZ3RofX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWNvbnRlbnRcIj5cbiAgICAgICAgICAgIDxhcHAtc2VuZC1saXN0IFtzZW5kc109XCJmaWx0ZXJlZFNlbmRzXCIgdGl0bGU9XCJ7eydlZGl0SXRlbScgfCBpMThufX1cIiBbZGlzYWJsZWRCeVBvbGljeV09XCJkaXNhYmxlU2VuZFwiXG4gICAgICAgICAgICAgICAgKG9uU2VsZWN0ZWQpPVwic2VsZWN0U2VuZCgkZXZlbnQpXCIgKG9uQ29weVNlbmRMaW5rKT1cImNvcHkoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKG9uUmVtb3ZlUGFzc3dvcmQpPVwicmVtb3ZlUGFzc3dvcmQoJGV2ZW50KVwiIChvbkRlbGV0ZVNlbmQpPVwiZGVsZXRlKCRldmVudClcIj5cbiAgICAgICAgICAgIDwvYXBwLXNlbmQtbGlzdD5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG48L2NvbnRlbnQ+XG4iLCJpbXBvcnQge1xuICAgIEluamVjdGFibGUsXG4gICAgT25EZXN0cm95XG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgICBDYW5BY3RpdmF0ZSxcbiAgICBOYXZpZ2F0aW9uRW5kLFxuICAgIE5hdmlnYXRpb25TdGFydCxcbiAgICBSb3V0ZXIsXG59IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5cbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtcbiAgICBmaWx0ZXIsXG4gICAgcGFpcndpc2UsXG59IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIERlYm91bmNlTmF2aWdhdGlvblNlcnZpY2UgaW1wbGVtZW50cyBDYW5BY3RpdmF0ZSwgT25EZXN0cm95IHtcbiAgICBuYXZpZ2F0aW9uU3RhcnRTdWI6IFN1YnNjcmlwdGlvbjtcbiAgICBuYXZpZ2F0aW9uU3VjY2Vzc1N1YjogU3Vic2NyaXB0aW9uO1xuXG4gICAgcHJpdmF0ZSBsYXN0TmF2aWdhdGlvbjogTmF2aWdhdGlvblN0YXJ0O1xuICAgIHByaXZhdGUgdGhpc05hdmlnYXRpb246IE5hdmlnYXRpb25TdGFydDtcbiAgICBwcml2YXRlIGxhc3ROYXZpZ2F0aW9uU3VjY2Vzc0lkOiBudW1iZXI7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJvdXRlcjogUm91dGVyKSB7XG4gICAgICAgIHRoaXMubmF2aWdhdGlvblN0YXJ0U3ViID0gdGhpcy5yb3V0ZXIuZXZlbnRzXG4gICAgICAgICAgICAucGlwZShmaWx0ZXIoZXZlbnQgPT4gZXZlbnQgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uU3RhcnQpLCBwYWlyd2lzZSgpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoZXZlbnRzOiBbTmF2aWdhdGlvblN0YXJ0LCBOYXZpZ2F0aW9uU3RhcnRdKSA9PiBbdGhpcy5sYXN0TmF2aWdhdGlvbiwgdGhpcy50aGlzTmF2aWdhdGlvbl0gPSBldmVudHMpO1xuXG4gICAgICAgIHRoaXMubmF2aWdhdGlvblN1Y2Nlc3NTdWIgPSB0aGlzLnJvdXRlci5ldmVudHNcbiAgICAgICAgICAgIC5waXBlKGZpbHRlcihldmVudCA9PiBldmVudCBpbnN0YW5jZW9mIE5hdmlnYXRpb25FbmQpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoZXZlbnQ6IE5hdmlnYXRpb25FbmQpID0+IHRoaXMubGFzdE5hdmlnYXRpb25TdWNjZXNzSWQgPSBldmVudC5pZCk7XG4gICAgfVxuXG4gICAgYXN5bmMgY2FuQWN0aXZhdGUoKSB7XG4gICAgICAgIHJldHVybiAhKHRoaXMudGhpc05hdmlnYXRpb24/Lm5hdmlnYXRpb25UcmlnZ2VyID09PSAnaGFzaGNoYW5nZScgJiZcbiAgICAgICAgICAgIHRoaXMubGFzdE5hdmlnYXRpb24ubmF2aWdhdGlvblRyaWdnZXIgPT09ICdwb3BzdGF0ZScgJiZcbiAgICAgICAgICAgIHRoaXMubGFzdE5hdmlnYXRpb25TdWNjZXNzSWQgPT09IHRoaXMubGFzdE5hdmlnYXRpb24uaWQgJiZcbiAgICAgICAgICAgIHRoaXMubGFzdE5hdmlnYXRpb24udXJsID09PSB0aGlzLnRoaXNOYXZpZ2F0aW9uPy51cmwpO1xuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICBpZiAodGhpcy5uYXZpZ2F0aW9uU3RhcnRTdWIgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5uYXZpZ2F0aW9uU3RhcnRTdWIudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm5hdmlnYXRpb25TdWNjZXNzU3ViICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMubmF2aWdhdGlvblN1Y2Nlc3NTdWIudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCB7IEJyb3dzZXJBcGkgfSBmcm9tICcuLi8uLi9icm93c2VyL2Jyb3dzZXJBcGknO1xuXG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICAgIENhbkFjdGl2YXRlLFxuICAgIFJvdXRlcixcbn0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcblxuaW1wb3J0IHsgVW5hdXRoR3VhcmRTZXJ2aWNlIH0gZnJvbSAnLi91bmF1dGgtZ3VhcmQuc2VydmljZSc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBMYXVuY2hHdWFyZFNlcnZpY2UgaW1wbGVtZW50cyBDYW5BY3RpdmF0ZSB7XG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSByb3V0ZXI6IFJvdXRlciwgcHJpdmF0ZSB1bmF1dGhHdWFyZFNlcnZpY2U6IFVuYXV0aEd1YXJkU2VydmljZSkgeyB9XG5cbiAgICBhc3luYyBjYW5BY3RpdmF0ZSgpIHtcbiAgICAgICAgaWYgKEJyb3dzZXJBcGkuZ2V0QmFja2dyb3VuZFBhZ2UoKSA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJ3ByaXZhdGUtbW9kZSddKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy51bmF1dGhHdWFyZFNlcnZpY2UuY2FuQWN0aXZhdGUoKTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IExvY2tHdWFyZFNlcnZpY2UgYXMgQmFzZUxvY2tHdWFyZFNlcnZpY2UgfSBmcm9tICdqc2xpYi1hbmd1bGFyL3NlcnZpY2VzL2xvY2stZ3VhcmQuc2VydmljZSc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBMb2NrR3VhcmRTZXJ2aWNlIGV4dGVuZHMgQmFzZUxvY2tHdWFyZFNlcnZpY2Uge1xuICAgIHByb3RlY3RlZCBob21lcGFnZSA9ICd0YWJzL2N1cnJlbnQnO1xufVxuIiwiXG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IFBhc3N3b3JkUmVwcm9tcHRTZXJ2aWNlIGFzIEJhc2VQYXNzd29yZFJlcHJvbXB0U2VydmljZSB9IGZyb20gJ2pzbGliLWFuZ3VsYXIvc2VydmljZXMvcGFzc3dvcmRSZXByb21wdC5zZXJ2aWNlJztcblxuaW1wb3J0IHsgUGFzc3dvcmRSZXByb21wdENvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudHMvcGFzc3dvcmQtcmVwcm9tcHQuY29tcG9uZW50JztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFBhc3N3b3JkUmVwcm9tcHRTZXJ2aWNlIGV4dGVuZHMgQmFzZVBhc3N3b3JkUmVwcm9tcHRTZXJ2aWNlIHtcbiAgICBjb21wb25lbnQgPSBQYXNzd29yZFJlcHJvbXB0Q29tcG9uZW50O1xufVxuIiwiaW1wb3J0IHsgQ2lwaGVyU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvY2lwaGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgSTE4blNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL2kxOG4uc2VydmljZSc7XG5cbmltcG9ydCB7IENvbnNvbGVMb2dTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL3NlcnZpY2VzL2NvbnNvbGVMb2cuc2VydmljZSc7XG5pbXBvcnQgeyBTZWFyY2hTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL3NlcnZpY2VzL3NlYXJjaC5zZXJ2aWNlJztcblxuZXhwb3J0IGNsYXNzIFBvcHVwU2VhcmNoU2VydmljZSBleHRlbmRzIFNlYXJjaFNlcnZpY2Uge1xuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgbWFpblNlYXJjaFNlcnZpY2U6IFNlYXJjaFNlcnZpY2UsIGNpcGhlclNlcnZpY2U6IENpcGhlclNlcnZpY2UsXG4gICAgICAgIGNvbnNvbGVMb2dTZXJ2aWNlOiBDb25zb2xlTG9nU2VydmljZSwgaTE4blNlcnZpY2U6IEkxOG5TZXJ2aWNlKSB7XG4gICAgICAgIHN1cGVyKGNpcGhlclNlcnZpY2UsIGNvbnNvbGVMb2dTZXJ2aWNlLCBpMThuU2VydmljZSk7XG4gICAgfVxuXG4gICAgY2xlYXJJbmRleCgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgYXZhaWxhYmxlLicpO1xuICAgIH1cblxuICAgIGluZGV4Q2lwaGVycygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgYXZhaWxhYmxlLicpO1xuICAgIH1cblxuICAgIGdldEluZGV4Rm9yU2VhcmNoKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tYWluU2VhcmNoU2VydmljZS5nZXRJbmRleEZvclNlYXJjaCgpO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgQnJvd3NlckFwaSB9IGZyb20gJy4uLy4uL2Jyb3dzZXIvYnJvd3NlckFwaSc7XG5cbmltcG9ydCB7IFBsYXRmb3JtVXRpbHNTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9wbGF0Zm9ybVV0aWxzLnNlcnZpY2UnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgUG9wdXBVdGlsc1NlcnZpY2Uge1xuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgcGxhdGZvcm1VdGlsc1NlcnZpY2U6IFBsYXRmb3JtVXRpbHNTZXJ2aWNlKSB7IH1cblxuICAgIGluU2lkZWJhcih3aW46IFdpbmRvdyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gd2luLmxvY2F0aW9uLnNlYXJjaCAhPT0gJycgJiYgd2luLmxvY2F0aW9uLnNlYXJjaC5pbmRleE9mKCd1aWxvY2F0aW9uPXNpZGViYXInKSA+IC0xO1xuICAgIH1cblxuICAgIGluVGFiKHdpbjogV2luZG93KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB3aW4ubG9jYXRpb24uc2VhcmNoICE9PSAnJyAmJiB3aW4ubG9jYXRpb24uc2VhcmNoLmluZGV4T2YoJ3VpbG9jYXRpb249dGFiJykgPiAtMTtcbiAgICB9XG5cbiAgICBpblBvcG91dCh3aW46IFdpbmRvdyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gd2luLmxvY2F0aW9uLnNlYXJjaCAhPT0gJycgJiYgd2luLmxvY2F0aW9uLnNlYXJjaC5pbmRleE9mKCd1aWxvY2F0aW9uPXBvcG91dCcpID4gLTE7XG4gICAgfVxuXG4gICAgaW5Qb3B1cCh3aW46IFdpbmRvdyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gd2luLmxvY2F0aW9uLnNlYXJjaCA9PT0gJycgfHwgd2luLmxvY2F0aW9uLnNlYXJjaC5pbmRleE9mKCd1aWxvY2F0aW9uPScpID09PSAtMSB8fFxuICAgICAgICAgICAgd2luLmxvY2F0aW9uLnNlYXJjaC5pbmRleE9mKCd1aWxvY2F0aW9uPXBvcHVwJykgPiAtMTtcbiAgICB9XG5cbiAgICBnZXRDb250ZW50U2Nyb2xsWSh3aW46IFdpbmRvdywgc2Nyb2xsaW5nQ29udGFpbmVyOiBzdHJpbmcgPSAnY29udGVudCcpOiBudW1iZXIge1xuICAgICAgICBjb25zdCBjb250ZW50ID0gd2luLmRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKHNjcm9sbGluZ0NvbnRhaW5lcilbMF07XG4gICAgICAgIHJldHVybiBjb250ZW50LnNjcm9sbFRvcDtcbiAgICB9XG5cbiAgICBzZXRDb250ZW50U2Nyb2xsWSh3aW46IFdpbmRvdywgc2Nyb2xsWTogbnVtYmVyLCBzY3JvbGxpbmdDb250YWluZXI6IHN0cmluZyA9ICdjb250ZW50Jyk6IHZvaWQge1xuICAgICAgICBpZiAoc2Nyb2xsWSAhPSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBjb250ZW50ID0gd2luLmRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKHNjcm9sbGluZ0NvbnRhaW5lcilbMF07XG4gICAgICAgICAgICBjb250ZW50LnNjcm9sbFRvcCA9IHNjcm9sbFk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwb3BPdXQod2luOiBXaW5kb3csIGhyZWY6IHN0cmluZyA9IG51bGwpOiB2b2lkIHtcblxuICAgICAgICBpZiAoaHJlZiA9PT0gbnVsbCkge1xuICAgICAgICAgICAgaHJlZiA9IHdpbi5sb2NhdGlvbi5ocmVmO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCh0eXBlb2YgY2hyb21lICE9PSAndW5kZWZpbmVkJykgJiYgY2hyb21lLndpbmRvd3MgJiYgY2hyb21lLndpbmRvd3MuY3JlYXRlKSB7XG4gICAgICAgICAgICBpZiAoaHJlZi5pbmRleE9mKCc/dWlsb2NhdGlvbj0nKSA+IC0xKSB7XG4gICAgICAgICAgICAgICAgaHJlZiA9IGhyZWYucmVwbGFjZSgndWlsb2NhdGlvbj1wb3B1cCcsICd1aWxvY2F0aW9uPXBvcG91dCcpXG4gICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKCd1aWxvY2F0aW9uPXRhYicsICd1aWxvY2F0aW9uPXBvcG91dCcpXG4gICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKCd1aWxvY2F0aW9uPXNpZGViYXInLCAndWlsb2NhdGlvbj1wb3BvdXQnKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaHJlZlBhcnRzID0gaHJlZi5zcGxpdCgnIycpO1xuICAgICAgICAgICAgICAgIGhyZWYgPSBocmVmUGFydHNbMF0gKyAnP3VpbG9jYXRpb249cG9wb3V0JyArIChocmVmUGFydHMubGVuZ3RoID4gMCA/ICcjJyArIGhyZWZQYXJ0c1sxXSA6ICcnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgYm9keVJlY3QgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdib2R5JykuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICBjaHJvbWUud2luZG93cy5jcmVhdGUoe1xuICAgICAgICAgICAgICAgIHVybDogaHJlZixcbiAgICAgICAgICAgICAgICB0eXBlOiAncG9wdXAnLFxuICAgICAgICAgICAgICAgIHdpZHRoOiBNYXRoLnJvdW5kKGJvZHlSZWN0LndpZHRoID8gYm9keVJlY3Qud2lkdGggKyA2MCA6IDM3NSksXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiBNYXRoLnJvdW5kKGJvZHlSZWN0LmhlaWdodCB8fCA2MDApLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmluUG9wdXAod2luKSkge1xuICAgICAgICAgICAgICAgIEJyb3dzZXJBcGkuY2xvc2VQb3B1cCh3aW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKCh0eXBlb2YgY2hyb21lICE9PSAndW5kZWZpbmVkJykgJiYgY2hyb21lLnRhYnMgJiYgY2hyb21lLnRhYnMuY3JlYXRlKSB7XG4gICAgICAgICAgICBocmVmID0gaHJlZi5yZXBsYWNlKCd1aWxvY2F0aW9uPXBvcHVwJywgJ3VpbG9jYXRpb249dGFiJylcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgndWlsb2NhdGlvbj1wb3BvdXQnLCAndWlsb2NhdGlvbj10YWInKVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKCd1aWxvY2F0aW9uPXNpZGViYXInLCAndWlsb2NhdGlvbj10YWInKTtcbiAgICAgICAgICAgIGNocm9tZS50YWJzLmNyZWF0ZSh7XG4gICAgICAgICAgICAgICAgdXJsOiBocmVmLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQge1xuICAgIEFQUF9JTklUSUFMSVpFUixcbiAgICBMT0NBTEVfSUQsXG4gICAgTmdNb2R1bGUsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBUb2FzdGVyTW9kdWxlIH0gZnJvbSAnYW5ndWxhcjItdG9hc3Rlcic7XG5cbmltcG9ydCB7IERlYm91bmNlTmF2aWdhdGlvblNlcnZpY2UgfSBmcm9tICcuL2RlYm91bmNlTmF2aWdhdGlvblNlcnZpY2UnO1xuaW1wb3J0IHsgTGF1bmNoR3VhcmRTZXJ2aWNlIH0gZnJvbSAnLi9sYXVuY2gtZ3VhcmQuc2VydmljZSc7XG5pbXBvcnQgeyBMb2NrR3VhcmRTZXJ2aWNlIH0gZnJvbSAnLi9sb2NrLWd1YXJkLnNlcnZpY2UnO1xuaW1wb3J0IHsgUGFzc3dvcmRSZXByb21wdFNlcnZpY2UgfSBmcm9tICcuL3Bhc3N3b3JkLXJlcHJvbXB0LnNlcnZpY2UnO1xuaW1wb3J0IHsgVW5hdXRoR3VhcmRTZXJ2aWNlIH0gZnJvbSAnLi91bmF1dGgtZ3VhcmQuc2VydmljZSc7XG5cbmltcG9ydCB7IEF1dGhHdWFyZFNlcnZpY2UgfSBmcm9tICdqc2xpYi1hbmd1bGFyL3NlcnZpY2VzL2F1dGgtZ3VhcmQuc2VydmljZSc7XG5pbXBvcnQgeyBCcm9hZGNhc3RlclNlcnZpY2UgfSBmcm9tICdqc2xpYi1hbmd1bGFyL3NlcnZpY2VzL2Jyb2FkY2FzdGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgTW9kYWxTZXJ2aWNlIH0gZnJvbSAnanNsaWItYW5ndWxhci9zZXJ2aWNlcy9tb2RhbC5zZXJ2aWNlJztcbmltcG9ydCB7IFZhbGlkYXRpb25TZXJ2aWNlIH0gZnJvbSAnanNsaWItYW5ndWxhci9zZXJ2aWNlcy92YWxpZGF0aW9uLnNlcnZpY2UnO1xuXG5pbXBvcnQgeyBCcm93c2VyQXBpIH0gZnJvbSAnLi4vLi4vYnJvd3Nlci9icm93c2VyQXBpJztcblxuaW1wb3J0IHsgQXBpU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvYXBpLnNlcnZpY2UnO1xuaW1wb3J0IHsgQXBwSWRTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9hcHBJZC5zZXJ2aWNlJztcbmltcG9ydCB7IEF1ZGl0U2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvYXVkaXQuc2VydmljZSc7XG5pbXBvcnQgeyBBdXRoU2VydmljZSBhcyBBdXRoU2VydmljZUFic3RyYWN0aW9uIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9hdXRoLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ2lwaGVyU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvY2lwaGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ29sbGVjdGlvblNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL2NvbGxlY3Rpb24uc2VydmljZSc7XG5pbXBvcnQgeyBDcnlwdG9TZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9jcnlwdG8uc2VydmljZSc7XG5pbXBvcnQgeyBDcnlwdG9GdW5jdGlvblNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL2NyeXB0b0Z1bmN0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgRW52aXJvbm1lbnRTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9lbnZpcm9ubWVudC5zZXJ2aWNlJztcbmltcG9ydCB7IEV2ZW50U2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvZXZlbnQuc2VydmljZSc7XG5pbXBvcnQgeyBFeHBvcnRTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9leHBvcnQuc2VydmljZSc7XG5pbXBvcnQgeyBGaWxlVXBsb2FkU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvZmlsZVVwbG9hZC5zZXJ2aWNlJztcbmltcG9ydCB7IEZvbGRlclNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL2ZvbGRlci5zZXJ2aWNlJztcbmltcG9ydCB7IEkxOG5TZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9pMThuLnNlcnZpY2UnO1xuaW1wb3J0IHsgTG9nU2VydmljZSBhcyBMb2dTZXJ2aWNlQWJzdHJhY3Rpb24gfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL2xvZy5zZXJ2aWNlJztcbmltcG9ydCB7IE1lc3NhZ2luZ1NlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL21lc3NhZ2luZy5zZXJ2aWNlJztcbmltcG9ydCB7IE5vdGlmaWNhdGlvbnNTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9ub3RpZmljYXRpb25zLnNlcnZpY2UnO1xuaW1wb3J0IHsgUGFzc3dvcmRHZW5lcmF0aW9uU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvcGFzc3dvcmRHZW5lcmF0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgUGFzc3dvcmRSZXByb21wdFNlcnZpY2UgYXMgUGFzc3dvcmRSZXByb21wdFNlcnZpY2VBYnN0cmFjdGlvbiB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvcGFzc3dvcmRSZXByb21wdC5zZXJ2aWNlJztcbmltcG9ydCB7IFBsYXRmb3JtVXRpbHNTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9wbGF0Zm9ybVV0aWxzLnNlcnZpY2UnO1xuaW1wb3J0IHsgUG9saWN5U2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvcG9saWN5LnNlcnZpY2UnO1xuaW1wb3J0IHsgU2VhcmNoU2VydmljZSBhcyBTZWFyY2hTZXJ2aWNlQWJzdHJhY3Rpb24gfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL3NlYXJjaC5zZXJ2aWNlJztcbmltcG9ydCB7IFNlbmRTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9zZW5kLnNlcnZpY2UnO1xuaW1wb3J0IHsgU2V0dGluZ3NTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9zZXR0aW5ncy5zZXJ2aWNlJztcbmltcG9ydCB7IFN0YXRlU2VydmljZSBhcyBTdGF0ZVNlcnZpY2VBYnN0cmFjdGlvbiB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvc3RhdGUuc2VydmljZSc7XG5pbXBvcnQgeyBTdG9yYWdlU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvc3RvcmFnZS5zZXJ2aWNlJztcbmltcG9ydCB7IFN5bmNTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9zeW5jLnNlcnZpY2UnO1xuaW1wb3J0IHsgVG9rZW5TZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy90b2tlbi5zZXJ2aWNlJztcbmltcG9ydCB7IFRvdHBTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy90b3RwLnNlcnZpY2UnO1xuaW1wb3J0IHsgVXNlclNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL3VzZXIuc2VydmljZSc7XG5pbXBvcnQgeyBWYXVsdFRpbWVvdXRTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy92YXVsdFRpbWVvdXQuc2VydmljZSc7XG5cbmltcG9ydCB7IEF1dG9maWxsU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2Fic3RyYWN0aW9ucy9hdXRvZmlsbC5zZXJ2aWNlJztcbmltcG9ydCBCcm93c2VyTWVzc2FnaW5nU2VydmljZSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9icm93c2VyTWVzc2FnaW5nLnNlcnZpY2UnO1xuXG5pbXBvcnQgeyBBdXRoU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9zZXJ2aWNlcy9hdXRoLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ29uc29sZUxvZ1NlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vc2VydmljZXMvY29uc29sZUxvZy5zZXJ2aWNlJztcbmltcG9ydCB7IENvbnN0YW50c1NlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vc2VydmljZXMvY29uc3RhbnRzLnNlcnZpY2UnO1xuaW1wb3J0IHsgU2VhcmNoU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9zZXJ2aWNlcy9zZWFyY2guc2VydmljZSc7XG5pbXBvcnQgeyBTdGF0ZVNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vc2VydmljZXMvc3RhdGUuc2VydmljZSc7XG5cbmltcG9ydCB7IFBvcHVwU2VhcmNoU2VydmljZSB9IGZyb20gJy4vcG9wdXAtc2VhcmNoLnNlcnZpY2UnO1xuaW1wb3J0IHsgUG9wdXBVdGlsc1NlcnZpY2UgfSBmcm9tICcuL3BvcHVwLXV0aWxzLnNlcnZpY2UnO1xuXG5pbXBvcnQgeyBUaGVtZVR5cGUgfSBmcm9tICdqc2xpYi1jb21tb24vZW51bXMvdGhlbWVUeXBlJztcblxuZnVuY3Rpb24gZ2V0QmdTZXJ2aWNlPFQ+KHNlcnZpY2U6IHN0cmluZykge1xuICAgIHJldHVybiAoKTogVCA9PiB7XG4gICAgICAgIGNvbnN0IHBhZ2UgPSBCcm93c2VyQXBpLmdldEJhY2tncm91bmRQYWdlKCk7XG4gICAgICAgIHJldHVybiBwYWdlID8gcGFnZS5iaXR3YXJkZW5NYWluW3NlcnZpY2VdIGFzIFQgOiBudWxsO1xuICAgIH07XG59XG5cbmNvbnN0IGlzUHJpdmF0ZU1vZGUgPSBCcm93c2VyQXBpLmdldEJhY2tncm91bmRQYWdlKCkgPT0gbnVsbDtcblxuY29uc3Qgc3RhdGVTZXJ2aWNlID0gbmV3IFN0YXRlU2VydmljZSgpO1xuY29uc3QgbWVzc2FnaW5nU2VydmljZSA9IG5ldyBCcm93c2VyTWVzc2FnaW5nU2VydmljZSgpO1xuY29uc3QgbG9nU2VydmljZSA9IGdldEJnU2VydmljZTxDb25zb2xlTG9nU2VydmljZT4oJ2xvZ1NlcnZpY2UnKSgpO1xuY29uc3Qgc2VhcmNoU2VydmljZSA9IGlzUHJpdmF0ZU1vZGUgPyBudWxsIDogbmV3IFBvcHVwU2VhcmNoU2VydmljZShnZXRCZ1NlcnZpY2U8U2VhcmNoU2VydmljZT4oJ3NlYXJjaFNlcnZpY2UnKSgpLFxuICAgIGdldEJnU2VydmljZTxDaXBoZXJTZXJ2aWNlPignY2lwaGVyU2VydmljZScpKCksIGxvZ1NlcnZpY2UsIGdldEJnU2VydmljZTxJMThuU2VydmljZT4oJ2kxOG5TZXJ2aWNlJykoKSk7XG5cbmV4cG9ydCBmdW5jdGlvbiBpbml0RmFjdG9yeShwbGF0Zm9ybVV0aWxzU2VydmljZTogUGxhdGZvcm1VdGlsc1NlcnZpY2UsIGkxOG5TZXJ2aWNlOiBJMThuU2VydmljZSwgc3RvcmFnZVNlcnZpY2U6IFN0b3JhZ2VTZXJ2aWNlLFxuICAgIHBvcHVwVXRpbHNTZXJ2aWNlOiBQb3B1cFV0aWxzU2VydmljZSk6IEZ1bmN0aW9uIHtcbiAgICByZXR1cm4gYXN5bmMgKCkgPT4ge1xuICAgICAgICBpZiAoIXBvcHVwVXRpbHNTZXJ2aWNlLmluUG9wdXAod2luZG93KSkge1xuICAgICAgICAgICAgd2luZG93LmRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgnYm9keS1mdWxsJyk7XG4gICAgICAgIH0gZWxzZSBpZiAod2luZG93LnNjcmVlbi5hdmFpbEhlaWdodCA8IDYwMCkge1xuICAgICAgICAgICAgd2luZG93LmRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgnYm9keS14cycpO1xuICAgICAgICB9IGVsc2UgaWYgKHdpbmRvdy5zY3JlZW4uYXZhaWxIZWlnaHQgPD0gODAwKSB7XG4gICAgICAgICAgICB3aW5kb3cuZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCdib2R5LXNtJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWlzUHJpdmF0ZU1vZGUpIHtcbiAgICAgICAgICAgIGF3YWl0IHN0YXRlU2VydmljZS5zYXZlKENvbnN0YW50c1NlcnZpY2UuZGlzYWJsZUZhdmljb25LZXksXG4gICAgICAgICAgICAgICAgYXdhaXQgc3RvcmFnZVNlcnZpY2UuZ2V0PGJvb2xlYW4+KENvbnN0YW50c1NlcnZpY2UuZGlzYWJsZUZhdmljb25LZXkpKTtcblxuICAgICAgICAgICAgYXdhaXQgc3RhdGVTZXJ2aWNlLnNhdmUoQ29uc3RhbnRzU2VydmljZS5kaXNhYmxlQmFkZ2VDb3VudGVyS2V5LFxuICAgICAgICAgICAgICAgIGF3YWl0IHN0b3JhZ2VTZXJ2aWNlLmdldDxib29sZWFuPihDb25zdGFudHNTZXJ2aWNlLmRpc2FibGVCYWRnZUNvdW50ZXJLZXkpKTtcblxuICAgICAgICAgICAgY29uc3QgaHRtbEVsID0gd2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgICAgICAgICAgIGNvbnN0IHRoZW1lID0gYXdhaXQgcGxhdGZvcm1VdGlsc1NlcnZpY2UuZ2V0RWZmZWN0aXZlVGhlbWUoKTtcbiAgICAgICAgICAgIGh0bWxFbC5jbGFzc0xpc3QuYWRkKCd0aGVtZV8nICsgdGhlbWUpO1xuICAgICAgICAgICAgcGxhdGZvcm1VdGlsc1NlcnZpY2Uub25EZWZhdWx0U3lzdGVtVGhlbWVDaGFuZ2UoYXN5bmMgc3lzVGhlbWUgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJ3VGhlbWUgPSBhd2FpdCBzdG9yYWdlU2VydmljZS5nZXQ8VGhlbWVUeXBlPihDb25zdGFudHNTZXJ2aWNlLnRoZW1lS2V5KTtcbiAgICAgICAgICAgICAgICBpZiAoYndUaGVtZSA9PSBudWxsIHx8IGJ3VGhlbWUgPT09IFRoZW1lVHlwZS5TeXN0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgaHRtbEVsLmNsYXNzTGlzdC5yZW1vdmUoJ3RoZW1lXycgKyBUaGVtZVR5cGUuTGlnaHQsICd0aGVtZV8nICsgVGhlbWVUeXBlLkRhcmspO1xuICAgICAgICAgICAgICAgICAgICBodG1sRWwuY2xhc3NMaXN0LmFkZCgndGhlbWVfJyArIHN5c1RoZW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGh0bWxFbC5jbGFzc0xpc3QuYWRkKCdsb2NhbGVfJyArIGkxOG5TZXJ2aWNlLnRyYW5zbGF0aW9uTG9jYWxlKTtcblxuICAgICAgICAgICAgLy8gV29ya2Fyb3VuZCBmb3Igc2xvdyBwZXJmb3JtYW5jZSBvbiBleHRlcm5hbCBtb25pdG9ycyBvbiBDaHJvbWUgKyBNYWNPU1xuICAgICAgICAgICAgLy8gU2VlOiBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD05NzE3MDEjYzY0XG4gICAgICAgICAgICBpZiAocGxhdGZvcm1VdGlsc1NlcnZpY2UuaXNDaHJvbWUoKSAmJlxuICAgICAgICAgICAgICAgIG5hdmlnYXRvci5wbGF0Zm9ybS5pbmRleE9mKCdNYWMnKSA+IC0xICYmXG4gICAgICAgICAgICAgICAgcG9wdXBVdGlsc1NlcnZpY2UuaW5Qb3B1cCh3aW5kb3cpICYmXG4gICAgICAgICAgICAgICAgKHdpbmRvdy5zY3JlZW5MZWZ0IDwgMCB8fFxuICAgICAgICAgICAgICAgIHdpbmRvdy5zY3JlZW5Ub3AgPCAwIHx8XG4gICAgICAgICAgICAgICAgd2luZG93LnNjcmVlbkxlZnQgPiB3aW5kb3cuc2NyZWVuLndpZHRoIHx8XG4gICAgICAgICAgICAgICAgd2luZG93LnNjcmVlblRvcCA+IHdpbmRvdy5zY3JlZW4uaGVpZ2h0KSkge1xuICAgICAgICAgICAgICAgIGh0bWxFbC5jbGFzc0xpc3QuYWRkKCdmb3JjZV9yZWRyYXcnKTtcbiAgICAgICAgICAgICAgICBsb2dTZXJ2aWNlLmluZm8oJ0ZvcmNlIHJlZHJhdyBpcyBvbicpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbn1cblxuQE5nTW9kdWxlKHtcbiAgICBpbXBvcnRzOiBbXG4gICAgICAgIFRvYXN0ZXJNb2R1bGUsXG4gICAgXSxcbiAgICBkZWNsYXJhdGlvbnM6IFtdLFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICBWYWxpZGF0aW9uU2VydmljZSxcbiAgICAgICAgQXV0aEd1YXJkU2VydmljZSxcbiAgICAgICAgTG9ja0d1YXJkU2VydmljZSxcbiAgICAgICAgTGF1bmNoR3VhcmRTZXJ2aWNlLFxuICAgICAgICBVbmF1dGhHdWFyZFNlcnZpY2UsXG4gICAgICAgIERlYm91bmNlTmF2aWdhdGlvblNlcnZpY2UsXG4gICAgICAgIFBvcHVwVXRpbHNTZXJ2aWNlLFxuICAgICAgICBCcm9hZGNhc3RlclNlcnZpY2UsXG4gICAgICAgIE1vZGFsU2VydmljZSxcbiAgICAgICAgeyBwcm92aWRlOiBNZXNzYWdpbmdTZXJ2aWNlLCB1c2VWYWx1ZTogbWVzc2FnaW5nU2VydmljZSB9LFxuICAgICAgICB7IHByb3ZpZGU6IEF1dGhTZXJ2aWNlQWJzdHJhY3Rpb24sIHVzZUZhY3Rvcnk6IGdldEJnU2VydmljZTxBdXRoU2VydmljZT4oJ2F1dGhTZXJ2aWNlJyksIGRlcHM6IFtdIH0sXG4gICAgICAgIHsgcHJvdmlkZTogU3RhdGVTZXJ2aWNlQWJzdHJhY3Rpb24sIHVzZVZhbHVlOiBzdGF0ZVNlcnZpY2UgfSxcbiAgICAgICAgeyBwcm92aWRlOiBTZWFyY2hTZXJ2aWNlQWJzdHJhY3Rpb24sIHVzZVZhbHVlOiBzZWFyY2hTZXJ2aWNlIH0sXG4gICAgICAgIHsgcHJvdmlkZTogQXVkaXRTZXJ2aWNlLCB1c2VGYWN0b3J5OiBnZXRCZ1NlcnZpY2U8QXVkaXRTZXJ2aWNlPignYXVkaXRTZXJ2aWNlJyksIGRlcHM6IFtdIH0sXG4gICAgICAgIHsgcHJvdmlkZTogRmlsZVVwbG9hZFNlcnZpY2UsIHVzZUZhY3Rvcnk6IGdldEJnU2VydmljZTxGaWxlVXBsb2FkU2VydmljZT4oJ2ZpbGVVcGxvYWRTZXJ2aWNlJyksIGRlcHM6IFtdIH0sXG4gICAgICAgIHsgcHJvdmlkZTogQ2lwaGVyU2VydmljZSwgdXNlRmFjdG9yeTogZ2V0QmdTZXJ2aWNlPENpcGhlclNlcnZpY2U+KCdjaXBoZXJTZXJ2aWNlJyksIGRlcHM6IFtdIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIHByb3ZpZGU6IENyeXB0b0Z1bmN0aW9uU2VydmljZSxcbiAgICAgICAgICAgIHVzZUZhY3Rvcnk6IGdldEJnU2VydmljZTxDcnlwdG9GdW5jdGlvblNlcnZpY2U+KCdjcnlwdG9GdW5jdGlvblNlcnZpY2UnKSxcbiAgICAgICAgICAgIGRlcHM6IFtdLFxuICAgICAgICB9LFxuICAgICAgICB7IHByb3ZpZGU6IEZvbGRlclNlcnZpY2UsIHVzZUZhY3Rvcnk6IGdldEJnU2VydmljZTxGb2xkZXJTZXJ2aWNlPignZm9sZGVyU2VydmljZScpLCBkZXBzOiBbXSB9LFxuICAgICAgICB7IHByb3ZpZGU6IENvbGxlY3Rpb25TZXJ2aWNlLCB1c2VGYWN0b3J5OiBnZXRCZ1NlcnZpY2U8Q29sbGVjdGlvblNlcnZpY2U+KCdjb2xsZWN0aW9uU2VydmljZScpLCBkZXBzOiBbXSB9LFxuICAgICAgICB7IHByb3ZpZGU6IExvZ1NlcnZpY2VBYnN0cmFjdGlvbiwgdXNlRmFjdG9yeTogZ2V0QmdTZXJ2aWNlPENvbnNvbGVMb2dTZXJ2aWNlPignbG9nU2VydmljZScpLCBkZXBzOiBbXSB9LFxuICAgICAgICB7IHByb3ZpZGU6IEVudmlyb25tZW50U2VydmljZSwgdXNlRmFjdG9yeTogZ2V0QmdTZXJ2aWNlPEVudmlyb25tZW50U2VydmljZT4oJ2Vudmlyb25tZW50U2VydmljZScpLCBkZXBzOiBbXSB9LFxuICAgICAgICB7IHByb3ZpZGU6IFRvdHBTZXJ2aWNlLCB1c2VGYWN0b3J5OiBnZXRCZ1NlcnZpY2U8VG90cFNlcnZpY2U+KCd0b3RwU2VydmljZScpLCBkZXBzOiBbXSB9LFxuICAgICAgICB7IHByb3ZpZGU6IFRva2VuU2VydmljZSwgdXNlRmFjdG9yeTogZ2V0QmdTZXJ2aWNlPFRva2VuU2VydmljZT4oJ3Rva2VuU2VydmljZScpLCBkZXBzOiBbXSB9LFxuICAgICAgICB7IHByb3ZpZGU6IEkxOG5TZXJ2aWNlLCB1c2VGYWN0b3J5OiBnZXRCZ1NlcnZpY2U8STE4blNlcnZpY2U+KCdpMThuU2VydmljZScpLCBkZXBzOiBbXSB9LFxuICAgICAgICB7IHByb3ZpZGU6IENyeXB0b1NlcnZpY2UsIHVzZUZhY3Rvcnk6IGdldEJnU2VydmljZTxDcnlwdG9TZXJ2aWNlPignY3J5cHRvU2VydmljZScpLCBkZXBzOiBbXSB9LFxuICAgICAgICB7IHByb3ZpZGU6IEV2ZW50U2VydmljZSwgdXNlRmFjdG9yeTogZ2V0QmdTZXJ2aWNlPEV2ZW50U2VydmljZT4oJ2V2ZW50U2VydmljZScpLCBkZXBzOiBbXSB9LFxuICAgICAgICB7IHByb3ZpZGU6IFBvbGljeVNlcnZpY2UsIHVzZUZhY3Rvcnk6IGdldEJnU2VydmljZTxQb2xpY3lTZXJ2aWNlPigncG9saWN5U2VydmljZScpLCBkZXBzOiBbXSB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBQbGF0Zm9ybVV0aWxzU2VydmljZSxcbiAgICAgICAgICAgIHVzZUZhY3Rvcnk6IGdldEJnU2VydmljZTxQbGF0Zm9ybVV0aWxzU2VydmljZT4oJ3BsYXRmb3JtVXRpbHNTZXJ2aWNlJyksXG4gICAgICAgICAgICBkZXBzOiBbXSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZTogUGFzc3dvcmRHZW5lcmF0aW9uU2VydmljZSxcbiAgICAgICAgICAgIHVzZUZhY3Rvcnk6IGdldEJnU2VydmljZTxQYXNzd29yZEdlbmVyYXRpb25TZXJ2aWNlPigncGFzc3dvcmRHZW5lcmF0aW9uU2VydmljZScpLFxuICAgICAgICAgICAgZGVwczogW10sXG4gICAgICAgIH0sXG4gICAgICAgIHsgcHJvdmlkZTogQXBpU2VydmljZSwgdXNlRmFjdG9yeTogZ2V0QmdTZXJ2aWNlPEFwaVNlcnZpY2U+KCdhcGlTZXJ2aWNlJyksIGRlcHM6IFtdIH0sXG4gICAgICAgIHsgcHJvdmlkZTogU3luY1NlcnZpY2UsIHVzZUZhY3Rvcnk6IGdldEJnU2VydmljZTxTeW5jU2VydmljZT4oJ3N5bmNTZXJ2aWNlJyksIGRlcHM6IFtdIH0sXG4gICAgICAgIHsgcHJvdmlkZTogVXNlclNlcnZpY2UsIHVzZUZhY3Rvcnk6IGdldEJnU2VydmljZTxVc2VyU2VydmljZT4oJ3VzZXJTZXJ2aWNlJyksIGRlcHM6IFtdIH0sXG4gICAgICAgIHsgcHJvdmlkZTogU2V0dGluZ3NTZXJ2aWNlLCB1c2VGYWN0b3J5OiBnZXRCZ1NlcnZpY2U8U2V0dGluZ3NTZXJ2aWNlPignc2V0dGluZ3NTZXJ2aWNlJyksIGRlcHM6IFtdIH0sXG4gICAgICAgIHsgcHJvdmlkZTogU3RvcmFnZVNlcnZpY2UsIHVzZUZhY3Rvcnk6IGdldEJnU2VydmljZTxTdG9yYWdlU2VydmljZT4oJ3N0b3JhZ2VTZXJ2aWNlJyksIGRlcHM6IFtdIH0sXG4gICAgICAgIHsgcHJvdmlkZTogQXBwSWRTZXJ2aWNlLCB1c2VGYWN0b3J5OiBnZXRCZ1NlcnZpY2U8QXBwSWRTZXJ2aWNlPignYXBwSWRTZXJ2aWNlJyksIGRlcHM6IFtdIH0sXG4gICAgICAgIHsgcHJvdmlkZTogQXV0b2ZpbGxTZXJ2aWNlLCB1c2VGYWN0b3J5OiBnZXRCZ1NlcnZpY2U8QXV0b2ZpbGxTZXJ2aWNlPignYXV0b2ZpbGxTZXJ2aWNlJyksIGRlcHM6IFtdIH0sXG4gICAgICAgIHsgcHJvdmlkZTogRXhwb3J0U2VydmljZSwgdXNlRmFjdG9yeTogZ2V0QmdTZXJ2aWNlPEV4cG9ydFNlcnZpY2U+KCdleHBvcnRTZXJ2aWNlJyksIGRlcHM6IFtdIH0sXG4gICAgICAgIHsgcHJvdmlkZTogU2VuZFNlcnZpY2UsIHVzZUZhY3Rvcnk6IGdldEJnU2VydmljZTxTZW5kU2VydmljZT4oJ3NlbmRTZXJ2aWNlJyksIGRlcHM6IFtdIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIHByb3ZpZGU6IFZhdWx0VGltZW91dFNlcnZpY2UsXG4gICAgICAgICAgICB1c2VGYWN0b3J5OiBnZXRCZ1NlcnZpY2U8VmF1bHRUaW1lb3V0U2VydmljZT4oJ3ZhdWx0VGltZW91dFNlcnZpY2UnKSxcbiAgICAgICAgICAgIGRlcHM6IFtdLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBOb3RpZmljYXRpb25zU2VydmljZSxcbiAgICAgICAgICAgIHVzZUZhY3Rvcnk6IGdldEJnU2VydmljZTxOb3RpZmljYXRpb25zU2VydmljZT4oJ25vdGlmaWNhdGlvbnNTZXJ2aWNlJyksXG4gICAgICAgICAgICBkZXBzOiBbXSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZTogQVBQX0lOSVRJQUxJWkVSLFxuICAgICAgICAgICAgdXNlRmFjdG9yeTogaW5pdEZhY3RvcnksXG4gICAgICAgICAgICBkZXBzOiBbUGxhdGZvcm1VdGlsc1NlcnZpY2UsIEkxOG5TZXJ2aWNlLCBTdG9yYWdlU2VydmljZSwgUG9wdXBVdGlsc1NlcnZpY2VdLFxuICAgICAgICAgICAgbXVsdGk6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIHByb3ZpZGU6IExPQ0FMRV9JRCxcbiAgICAgICAgICAgIHVzZUZhY3Rvcnk6ICgpID0+IGlzUHJpdmF0ZU1vZGUgPyBudWxsIDogZ2V0QmdTZXJ2aWNlPEkxOG5TZXJ2aWNlPignaTE4blNlcnZpY2UnKSgpLnRyYW5zbGF0aW9uTG9jYWxlLFxuICAgICAgICAgICAgZGVwczogW10sXG4gICAgICAgIH0sXG4gICAgICAgIHsgcHJvdmlkZTogUGFzc3dvcmRSZXByb21wdFNlcnZpY2VBYnN0cmFjdGlvbiwgdXNlQ2xhc3M6IFBhc3N3b3JkUmVwcm9tcHRTZXJ2aWNlIH0sXG4gICAgXSxcbn0pXG5leHBvcnQgY2xhc3MgU2VydmljZXNNb2R1bGUge1xufVxuIiwiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBVbmF1dGhHdWFyZFNlcnZpY2UgYXMgQmFzZVVuYXV0aEd1YXJkU2VydmljZSB9IGZyb20gJ2pzbGliLWFuZ3VsYXIvc2VydmljZXMvdW5hdXRoLWd1YXJkLnNlcnZpY2UnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgVW5hdXRoR3VhcmRTZXJ2aWNlIGV4dGVuZHMgQmFzZVVuYXV0aEd1YXJkU2VydmljZSB7XG4gICAgcHJvdGVjdGVkIGhvbWVwYWdlID0gJ3RhYnMvY3VycmVudCc7XG59XG4iLCJpbXBvcnQge1xuICAgIENvbXBvbmVudCxcbiAgICBOZ1pvbmUsXG4gICAgT25EZXN0cm95LFxuICAgIE9uSW5pdCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5cbmltcG9ydCB7IENvbnN0YW50c1NlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vc2VydmljZXMvY29uc3RhbnRzLnNlcnZpY2UnO1xuXG5pbXBvcnQgeyBJMThuU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvaTE4bi5zZXJ2aWNlJztcbmltcG9ydCB7IFBsYXRmb3JtVXRpbHNTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9wbGF0Zm9ybVV0aWxzLnNlcnZpY2UnO1xuaW1wb3J0IHsgU3RvcmFnZVNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL3N0b3JhZ2Uuc2VydmljZSc7XG5cbmltcG9ydCB7IEJyb2FkY2FzdGVyU2VydmljZSB9IGZyb20gJ2pzbGliLWFuZ3VsYXIvc2VydmljZXMvYnJvYWRjYXN0ZXIuc2VydmljZSc7XG5cbmltcG9ydCB7IEJyb3dzZXJBcGkgfSBmcm9tICcuLi8uLi9icm93c2VyL2Jyb3dzZXJBcGknO1xuXG5pbXBvcnQgeyBVdGlscyB9IGZyb20gJ2pzbGliLWNvbW1vbi9taXNjL3V0aWxzJztcblxuaW50ZXJmYWNlIEV4Y2x1ZGVkRG9tYWluIHtcbiAgICB1cmk6IHN0cmluZztcbiAgICBzaG93Q3VycmVudFVyaXM6IGJvb2xlYW47XG59XG5cbmNvbnN0IEJyb2FkY2FzdGVyU3Vic2NyaXB0aW9uSWQgPSAnZXhjbHVkZWREb21haW5zJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdhcHAtZXhjbHVkZWQtZG9tYWlucycsXG4gICAgdGVtcGxhdGVVcmw6ICdleGNsdWRlZC1kb21haW5zLmNvbXBvbmVudC5odG1sJyxcbn0pXG5leHBvcnQgY2xhc3MgRXhjbHVkZWREb21haW5zQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICAgIGV4Y2x1ZGVkRG9tYWluczogRXhjbHVkZWREb21haW5bXSA9IFtdO1xuICAgIGN1cnJlbnRVcmlzOiBzdHJpbmdbXTtcbiAgICBsb2FkQ3VycmVudFVyaXNUaW1lb3V0OiBudW1iZXI7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHN0b3JhZ2VTZXJ2aWNlOiBTdG9yYWdlU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBpMThuU2VydmljZTogSTE4blNlcnZpY2UsIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXG4gICAgICAgIHByaXZhdGUgYnJvYWRjYXN0ZXJTZXJ2aWNlOiBCcm9hZGNhc3RlclNlcnZpY2UsIHByaXZhdGUgbmdab25lOiBOZ1pvbmUsXG4gICAgICAgIHByaXZhdGUgcGxhdGZvcm1VdGlsc1NlcnZpY2U6IFBsYXRmb3JtVXRpbHNTZXJ2aWNlKSB7XG4gICAgfVxuXG4gICAgYXN5bmMgbmdPbkluaXQoKSB7XG4gICAgICAgIGNvbnN0IHNhdmVkRG9tYWlucyA9IGF3YWl0IHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0PGFueT4oQ29uc3RhbnRzU2VydmljZS5uZXZlckRvbWFpbnNLZXkpO1xuICAgICAgICBpZiAoc2F2ZWREb21haW5zKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHVyaSBvZiBPYmplY3Qua2V5cyhzYXZlZERvbWFpbnMpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5leGNsdWRlZERvbWFpbnMucHVzaCh7IHVyaTogdXJpLCBzaG93Q3VycmVudFVyaXM6IGZhbHNlIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgdGhpcy5sb2FkQ3VycmVudFVyaXMoKTtcblxuICAgICAgICB0aGlzLmJyb2FkY2FzdGVyU2VydmljZS5zdWJzY3JpYmUoQnJvYWRjYXN0ZXJTdWJzY3JpcHRpb25JZCwgKG1lc3NhZ2U6IGFueSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKG1lc3NhZ2UuY29tbWFuZCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlICd0YWJDaGFuZ2VkJzpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnd2luZG93Q2hhbmdlZCc6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5sb2FkQ3VycmVudFVyaXNUaW1lb3V0ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMubG9hZEN1cnJlbnRVcmlzVGltZW91dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRDdXJyZW50VXJpc1RpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dChhc3luYyAoKSA9PiBhd2FpdCB0aGlzLmxvYWRDdXJyZW50VXJpcygpLCA1MDApO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMuYnJvYWRjYXN0ZXJTZXJ2aWNlLnVuc3Vic2NyaWJlKEJyb2FkY2FzdGVyU3Vic2NyaXB0aW9uSWQpO1xuICAgIH1cblxuICAgIGFzeW5jIGFkZFVyaSgpIHtcbiAgICAgICAgdGhpcy5leGNsdWRlZERvbWFpbnMucHVzaCh7IHVyaTogJycsIHNob3dDdXJyZW50VXJpczogZmFsc2UgfSk7XG4gICAgfVxuXG4gICAgYXN5bmMgcmVtb3ZlVXJpKGk6IG51bWJlcikge1xuICAgICAgICB0aGlzLmV4Y2x1ZGVkRG9tYWlucy5zcGxpY2UoaSwgMSk7XG4gICAgfVxuXG4gICAgYXN5bmMgc3VibWl0KCkge1xuICAgICAgICBjb25zdCBzYXZlZERvbWFpbnM6IHsgW25hbWU6IHN0cmluZ106IG51bGwgfSA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IGRvbWFpbiBvZiB0aGlzLmV4Y2x1ZGVkRG9tYWlucykge1xuICAgICAgICAgICAgaWYgKGRvbWFpbi51cmkgJiYgZG9tYWluLnVyaSAhPT0gJycpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWxpZERvbWFpbiA9IFV0aWxzLmdldEhvc3RuYW1lKGRvbWFpbi51cmkpO1xuICAgICAgICAgICAgICAgIGlmICghdmFsaWREb21haW4pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbGF0Zm9ybVV0aWxzU2VydmljZS5zaG93VG9hc3QoJ2Vycm9yJywgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaTE4blNlcnZpY2UudCgnZXhjbHVkZWREb21haW5zSW52YWxpZERvbWFpbicsIGRvbWFpbi51cmkpKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzYXZlZERvbWFpbnNbdmFsaWREb21haW5dID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNhdmUoQ29uc3RhbnRzU2VydmljZS5uZXZlckRvbWFpbnNLZXksIHNhdmVkRG9tYWlucyk7XG4gICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL3RhYnMvc2V0dGluZ3MnXSk7XG4gICAgfVxuXG4gICAgdHJhY2tCeUZ1bmN0aW9uKGluZGV4OiBudW1iZXIsIGl0ZW06IGFueSkge1xuICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxuXG4gICAgdG9nZ2xlVXJpSW5wdXQoZG9tYWluOiBFeGNsdWRlZERvbWFpbikge1xuICAgICAgICBkb21haW4uc2hvd0N1cnJlbnRVcmlzID0gIWRvbWFpbi5zaG93Q3VycmVudFVyaXM7XG4gICAgfVxuXG4gICAgYXN5bmMgbG9hZEN1cnJlbnRVcmlzKCkge1xuICAgICAgICBjb25zdCB0YWJzID0gYXdhaXQgQnJvd3NlckFwaS50YWJzUXVlcnkoeyB3aW5kb3dUeXBlOiAnbm9ybWFsJyB9KTtcbiAgICAgICAgaWYgKHRhYnMpIHtcbiAgICAgICAgICAgIGNvbnN0IHVyaVNldCA9IG5ldyBTZXQodGFicy5tYXAodGFiID0+IFV0aWxzLmdldEhvc3RuYW1lKHRhYi51cmwpKSk7XG4gICAgICAgICAgICB1cmlTZXQuZGVsZXRlKG51bGwpO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50VXJpcyA9IEFycmF5LmZyb20odXJpU2V0KTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIjxmb3JtICNmb3JtIChuZ1N1Ym1pdCk9XCJzdWJtaXQoKVwiPlxuICAgIDxoZWFkZXI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJsZWZ0XCI+XG4gICAgICAgICAgICA8YSByb3V0ZXJMaW5rPVwiL3RhYnMvc2V0dGluZ3NcIj57eydjYW5jZWwnIHwgaTE4bn19PC9hPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNlbnRlclwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0aXRsZVwiPnt7J2V4Y2x1ZGVkRG9tYWlucycgfCBpMThufX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwicmlnaHRcIj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cInN1Ym1pdFwiIGFwcEJsdXJDbGljaz57eydzYXZlJyB8IGkxOG59fTwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2hlYWRlcj5cbiAgICA8Y29udGVudD5cbiAgICAgICAgPGRpdiBjbGFzcz1cImJveFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImV4Y2x1ZGVkRG9tYWluc1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWNvbnRlbnQtcm93IGJveC1jb250ZW50LXJvdy1tdWx0aVwiIGFwcEJveFJvd1xuICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGRvbWFpbiBvZiBleGNsdWRlZERvbWFpbnM7IGxldCBpID0gaW5kZXg7IHRyYWNrQnk6dHJhY2tCeUZ1bmN0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBhcHBTdG9wQ2xpY2sgKGNsaWNrKT1cInJlbW92ZVVyaShpKVwiIGFwcEExMXlUaXRsZT1cInt7J3JlbW92ZScgfCBpMThufX1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLW1pbnVzLWNpcmNsZSBmYS1sZ1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdy1tYWluXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImV4Y2x1ZGVkRG9tYWlue3tpfX1cIj57eyd1cmlQb3NpdGlvbicgfCBpMThuIDogKGkgKyAxKX19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9XCJleGNsdWRlZERvbWFpbnt7aX19XCIgbmFtZT1cImV4Y2x1ZGVkRG9tYWlue3tpfX1cIiB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwiZG9tYWluLnVyaVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwie3snZXgnIHwgaTE4bn19IGh0dHBzOi8vZ29vZ2xlLmNvbVwiIGlucHV0bW9kZT1cInVybFwiIGFwcElucHV0VmVyYmF0aW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImN1cnJlbnRVcmlze3tpfX1cIiBjbGFzcz1cInNyLW9ubHlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3snY3VycmVudFVyaScgfCBpMThufX0ge3soaSArIDEpfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgKm5nSWY9XCJjdXJyZW50VXJpcyAmJiBjdXJyZW50VXJpcy5sZW5ndGhcIiBpZD1cImN1cnJlbnRVcmlze3tpfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPVwiY3VycmVudFVyaXN7e2l9fVwiIFsobmdNb2RlbCldPVwiZG9tYWluLnVyaVwiIFtoaWRkZW5dPVwiIWRvbWFpbi5zaG93Q3VycmVudFVyaXNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBbbmdWYWx1ZV09XCJudWxsXCI+LS0ge3snc2VsZWN0JyB8IGkxOG59fSAtLTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCB1IG9mIGN1cnJlbnRVcmlzXCIgW25nVmFsdWVdPVwidVwiPnt7dX19PC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhY3Rpb24tYnV0dG9uc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiICpuZ0lmPVwiY3VycmVudFVyaXMgJiYgY3VycmVudFVyaXMubGVuZ3RoXCIgY2xhc3M9XCJyb3ctYnRuXCIgYXBwU3RvcENsaWNrXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcEJsdXJDbGljayBhcHBBMTF5VGl0bGU9XCJ7eyd0b2dnbGVDdXJyZW50VXJpcycgfCBpMThufX1cIiAoY2xpY2spPVwidG9nZ2xlVXJpSW5wdXQoZG9tYWluKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBhcmlhLWhpZGRlbj1cInRydWVcIiBjbGFzcz1cImZhIGZhLWxnIGZhLWxpc3RcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgYXBwU3RvcENsaWNrIGFwcEJsdXJDbGljayAoY2xpY2spPVwiYWRkVXJpKClcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJveC1jb250ZW50LXJvdyBib3gtY29udGVudC1yb3ctbmV3bXVsdGlcIj5cbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1wbHVzLWNpcmNsZSBmYS1mdyBmYS1sZ1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT4ge3snbmV3VXJpJyB8IGkxOG59fVxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWZvb3RlclwiPlxuICAgICAgICAgICAgICAgIHt7J2V4Y2x1ZGVkRG9tYWluc0Rlc2MnIHwgaTE4bn19XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9jb250ZW50PlxuPC9mb3JtPiIsImltcG9ydCB7IENvbXBvbmVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcblxuaW1wb3J0IHsgQ3J5cHRvU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvY3J5cHRvLnNlcnZpY2UnO1xuaW1wb3J0IHsgRXZlbnRTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9ldmVudC5zZXJ2aWNlJztcbmltcG9ydCB7IEV4cG9ydFNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL2V4cG9ydC5zZXJ2aWNlJztcbmltcG9ydCB7IEkxOG5TZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9pMThuLnNlcnZpY2UnO1xuaW1wb3J0IHsgTG9nU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvbG9nLnNlcnZpY2UnO1xuaW1wb3J0IHsgUGxhdGZvcm1VdGlsc1NlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL3BsYXRmb3JtVXRpbHMuc2VydmljZSc7XG5pbXBvcnQgeyBQb2xpY3lTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9wb2xpY3kuc2VydmljZSc7XG5cbmltcG9ydCB7IEV4cG9ydENvbXBvbmVudCBhcyBCYXNlRXhwb3J0Q29tcG9uZW50IH0gZnJvbSAnanNsaWItYW5ndWxhci9jb21wb25lbnRzL2V4cG9ydC5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2FwcC1leHBvcnQnLFxuICAgIHRlbXBsYXRlVXJsOiAnZXhwb3J0LmNvbXBvbmVudC5odG1sJyxcbn0pXG5leHBvcnQgY2xhc3MgRXhwb3J0Q29tcG9uZW50IGV4dGVuZHMgQmFzZUV4cG9ydENvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IoY3J5cHRvU2VydmljZTogQ3J5cHRvU2VydmljZSwgaTE4blNlcnZpY2U6IEkxOG5TZXJ2aWNlLFxuICAgICAgICBwbGF0Zm9ybVV0aWxzU2VydmljZTogUGxhdGZvcm1VdGlsc1NlcnZpY2UsIGV4cG9ydFNlcnZpY2U6IEV4cG9ydFNlcnZpY2UsXG4gICAgICAgIGV2ZW50U2VydmljZTogRXZlbnRTZXJ2aWNlLCBwb2xpY3lTZXJ2aWNlOiBQb2xpY3lTZXJ2aWNlLCBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxuICAgICAgICBsb2dTZXJ2aWNlOiBMb2dTZXJ2aWNlKSB7XG4gICAgICAgIHN1cGVyKGNyeXB0b1NlcnZpY2UsIGkxOG5TZXJ2aWNlLCBwbGF0Zm9ybVV0aWxzU2VydmljZSwgZXhwb3J0U2VydmljZSwgZXZlbnRTZXJ2aWNlLCBwb2xpY3lTZXJ2aWNlLCB3aW5kb3csXG4gICAgICAgICAgICBsb2dTZXJ2aWNlKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgc2F2ZWQoKSB7XG4gICAgICAgIHN1cGVyLnNhdmVkKCk7XG4gICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL3RhYnMvc2V0dGluZ3MnXSk7XG4gICAgfVxufVxuIiwiPGZvcm0gKG5nU3VibWl0KT1cInN1Ym1pdCgpXCI+XG4gICAgPGhlYWRlcj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImxlZnRcIj5cbiAgICAgICAgICAgIDxhIHJvdXRlckxpbms9XCIvdGFicy9zZXR0aW5nc1wiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaGVhZGVyLWljb25cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48aSBjbGFzcz1cImZhIGZhLWNoZXZyb24tbGVmdFwiPjwvaT48L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4+e3snYmFjaycgfCBpMThufX08L3NwYW4+XG4gICAgICAgICAgICA8L2E+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2VudGVyXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRpdGxlXCI+e3snZXhwb3J0VmF1bHQnIHwgaTE4bn19PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJpZ2h0XCI+XG4gICAgICAgICAgICA8YnV0dG9uIGFwcEJsdXJDbGljayB0eXBlPVwic3VibWl0XCIgW2Rpc2FibGVkXT1cImRpc2FibGVkQnlQb2xpY3lcIj57eydzdWJtaXQnIHwgaTE4bn19PC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvaGVhZGVyPlxuICAgIDxjb250ZW50PlxuICAgICAgICA8YXBwLWNhbGxvdXQgdHlwZT1cIndhcm5pbmdcIiB0aXRsZT1cInt7J3ZhdWx0RXhwb3J0RGlzYWJsZWQnIHwgaTE4bn19XCIgKm5nSWY9XCJkaXNhYmxlZEJ5UG9saWN5XCI+XG4gICAgICAgICAgICB7eydwZXJzb25hbFZhdWx0RXhwb3J0UG9saWN5SW5FZmZlY3QnIHwgaTE4bn19XG4gICAgICAgIDwvYXBwLWNhbGxvdXQ+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImJveFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50LXJvd1wiIGFwcEJveFJvdz5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImZvcm1hdFwiPnt7J2ZpbGVGb3JtYXQnIHwgaTE4bn19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBpZD1cImZvcm1hdFwiIG5hbWU9XCJGb3JtYXRcIiBbKG5nTW9kZWwpXT1cImZvcm1hdFwiIFtkaXNhYmxlZF09XCJkaXNhYmxlZEJ5UG9saWN5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwianNvblwiPi5qc29uPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiY3N2XCI+LmNzdjwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImVuY3J5cHRlZF9qc29uXCI+Lmpzb24gKEVuY3J5cHRlZCk8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50LXJvdyBib3gtY29udGVudC1yb3ctZmxleFwiIGFwcEJveFJvdz5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdy1tYWluXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwibWFzdGVyUGFzc3dvcmRcIj57eydtYXN0ZXJQYXNzJyB8IGkxOG59fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9XCJtYXN0ZXJQYXNzd29yZFwiIHR5cGU9XCJ7e3Nob3dQYXNzd29yZCA/ICd0ZXh0JyA6ICdwYXNzd29yZCd9fVwiIG5hbWU9XCJNYXN0ZXJQYXNzd29yZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtb25vc3BhY2VkXCIgWyhuZ01vZGVsKV09XCJtYXN0ZXJQYXNzd29yZFwiIHJlcXVpcmVkIGFwcElucHV0VmVyYmF0aW0gYXBwQXV0b2ZvY3VzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkQnlQb2xpY3lcIj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhY3Rpb24tYnV0dG9uc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJyb3ctYnRuXCIgYXBwU3RvcENsaWNrIGFwcEJsdXJDbGlja1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcEExMXlUaXRsZT1cInt7J3RvZ2dsZVZpc2liaWxpdHknIHwgaTE4bn19XCIgKGNsaWNrKT1cInRvZ2dsZVBhc3N3b3JkKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWxnXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydmYS1leWUnOiAhc2hvd1Bhc3N3b3JkLCAnZmEtZXllLXNsYXNoJzogc2hvd1Bhc3N3b3JkfVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1mb290ZXJcIj5cbiAgICAgICAgICAgICAgICA8cD57eydleHBvcnRNYXN0ZXJQYXNzd29yZCcgfCBpMThufX08L3A+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9jb250ZW50PlxuPC9mb3JtPlxuIiwiaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICAgIEFjdGl2YXRlZFJvdXRlLFxuICAgIFJvdXRlcixcbn0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcblxuaW1wb3J0IHsgZmlyc3QgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IEZvbGRlclNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL2ZvbGRlci5zZXJ2aWNlJztcbmltcG9ydCB7IEkxOG5TZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9pMThuLnNlcnZpY2UnO1xuaW1wb3J0IHsgTG9nU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvbG9nLnNlcnZpY2UnO1xuaW1wb3J0IHsgUGxhdGZvcm1VdGlsc1NlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL3BsYXRmb3JtVXRpbHMuc2VydmljZSc7XG5cbmltcG9ydCB7XG4gICAgRm9sZGVyQWRkRWRpdENvbXBvbmVudCBhcyBCYXNlRm9sZGVyQWRkRWRpdENvbXBvbmVudCxcbn0gZnJvbSAnanNsaWItYW5ndWxhci9jb21wb25lbnRzL2ZvbGRlci1hZGQtZWRpdC5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2FwcC1mb2xkZXItYWRkLWVkaXQnLFxuICAgIHRlbXBsYXRlVXJsOiAnZm9sZGVyLWFkZC1lZGl0LmNvbXBvbmVudC5odG1sJyxcbn0pXG5leHBvcnQgY2xhc3MgRm9sZGVyQWRkRWRpdENvbXBvbmVudCBleHRlbmRzIEJhc2VGb2xkZXJBZGRFZGl0Q29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3Rvcihmb2xkZXJTZXJ2aWNlOiBGb2xkZXJTZXJ2aWNlLCBpMThuU2VydmljZTogSTE4blNlcnZpY2UsXG4gICAgICAgIHBsYXRmb3JtVXRpbHNTZXJ2aWNlOiBQbGF0Zm9ybVV0aWxzU2VydmljZSwgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcbiAgICAgICAgcHJpdmF0ZSByb3V0ZTogQWN0aXZhdGVkUm91dGUsIGxvZ1NlcnZpY2U6IExvZ1NlcnZpY2UpIHtcbiAgICAgICAgc3VwZXIoZm9sZGVyU2VydmljZSwgaTE4blNlcnZpY2UsIHBsYXRmb3JtVXRpbHNTZXJ2aWNlLCBsb2dTZXJ2aWNlKTtcbiAgICB9XG5cbiAgICBhc3luYyBuZ09uSW5pdCgpIHtcbiAgICAgICAgdGhpcy5yb3V0ZS5xdWVyeVBhcmFtcy5waXBlKGZpcnN0KCkpLnN1YnNjcmliZShhc3luYyBwYXJhbXMgPT4ge1xuICAgICAgICAgICAgaWYgKHBhcmFtcy5mb2xkZXJJZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZm9sZGVySWQgPSBwYXJhbXMuZm9sZGVySWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmluaXQoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgYXN5bmMgc3VibWl0KCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICBpZiAoYXdhaXQgc3VwZXIuc3VibWl0KCkpIHtcbiAgICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL2ZvbGRlcnMnXSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBhc3luYyBkZWxldGUoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGNvbnN0IGNvbmZpcm1lZCA9IGF3YWl0IHN1cGVyLmRlbGV0ZSgpO1xuICAgICAgICBpZiAoY29uZmlybWVkKSB7XG4gICAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy9mb2xkZXJzJ10pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb25maXJtZWQ7XG4gICAgfVxufVxuIiwiPGZvcm0gI2Zvcm0gKG5nU3VibWl0KT1cInN1Ym1pdCgpXCIgW2FwcEFwaUFjdGlvbl09XCJmb3JtUHJvbWlzZVwiPlxuICAgIDxoZWFkZXI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJsZWZ0XCI+XG4gICAgICAgICAgICA8YSByb3V0ZXJMaW5rPVwiL2ZvbGRlcnNcIj57eydjYW5jZWwnIHwgaTE4bn19PC9hPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNlbnRlclwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0aXRsZVwiPnt7dGl0bGV9fTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJyaWdodFwiPlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwic3VibWl0XCIgYXBwQmx1ckNsaWNrIFtkaXNhYmxlZF09XCJmb3JtLmxvYWRpbmdcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBbaGlkZGVuXT1cImZvcm0ubG9hZGluZ1wiPnt7J3NhdmUnIHwgaTE4bn19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtc3Bpbm5lciBmYS1sZyBmYS1zcGluXCIgW2hpZGRlbl09XCIhZm9ybS5sb2FkaW5nXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvaGVhZGVyPlxuICAgIDxjb250ZW50ICpuZ0lmPVwiZm9sZGVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJib3hcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtY29udGVudFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtY29udGVudC1yb3dcIiBhcHBCb3hSb3c+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJuYW1lXCI+e3snbmFtZScgfCBpMThufX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9XCJuYW1lXCIgdHlwZT1cInRleHRcIiBuYW1lPVwiTmFtZVwiIFsobmdNb2RlbCldPVwiZm9sZGVyLm5hbWVcIiBbYXBwQXV0b2ZvY3VzXT1cIiFlZGl0TW9kZVwiPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYm94IGxpc3RcIiAqbmdJZj1cImVkaXRNb2RlXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWNvbnRlbnQgc2luZ2xlLWxpbmVcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJveC1jb250ZW50LXJvd1wiIGFwcFN0b3BDbGljayBhcHBCbHVyQ2xpY2sgKGNsaWNrKT1cImRlbGV0ZSgpXCJcbiAgICAgICAgICAgICAgICAgICAgW2FwcEFwaUFjdGlvbl09XCJkZWxldGVQcm9taXNlXCIgI2RlbGV0ZUJ0bj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdy1tYWluIHRleHQtZGFuZ2VyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaWNvbiB0ZXh0LWRhbmdlclwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtdHJhc2gtbyBmYS1sZyBmYS1md1wiIFtoaWRkZW5dPVwiZGVsZXRlQnRuLmxvYWRpbmdcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1zcGlubmVyIGZhLXNwaW4gZmEtbGcgZmEtZndcIiBbaGlkZGVuXT1cIiFkZWxldGVCdG4ubG9hZGluZ1wiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3snZGVsZXRlRm9sZGVyJyB8IGkxOG59fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9jb250ZW50PlxuPC9mb3JtPlxuIiwiaW1wb3J0IHtcbiAgICBDb21wb25lbnQsXG4gICAgT25Jbml0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5cbmltcG9ydCB7IEZvbGRlclZpZXcgfSBmcm9tICdqc2xpYi1jb21tb24vbW9kZWxzL3ZpZXcvZm9sZGVyVmlldyc7XG5cbmltcG9ydCB7IEZvbGRlclNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL2ZvbGRlci5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdhcHAtZm9sZGVycycsXG4gICAgdGVtcGxhdGVVcmw6ICdmb2xkZXJzLmNvbXBvbmVudC5odG1sJyxcbn0pXG5leHBvcnQgY2xhc3MgRm9sZGVyc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gICAgZm9sZGVyczogRm9sZGVyVmlld1tdO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBmb2xkZXJTZXJ2aWNlOiBGb2xkZXJTZXJ2aWNlLCBwcml2YXRlIHJvdXRlcjogUm91dGVyKSB7IH1cblxuICAgIGFzeW5jIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLmZvbGRlcnMgPSBhd2FpdCB0aGlzLmZvbGRlclNlcnZpY2UuZ2V0QWxsRGVjcnlwdGVkKCk7XG4gICAgICAgIC8vIFJlbW92ZSBcIk5vIEZvbGRlclwiXG4gICAgICAgIGlmICh0aGlzLmZvbGRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5mb2xkZXJzID0gdGhpcy5mb2xkZXJzLnNsaWNlKDAsIHRoaXMuZm9sZGVycy5sZW5ndGggLSAxKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZvbGRlclNlbGVjdGVkKGZvbGRlcjogRm9sZGVyVmlldykge1xuICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy9lZGl0LWZvbGRlciddLCB7IHF1ZXJ5UGFyYW1zOiB7IGZvbGRlcklkOiBmb2xkZXIuaWQgfSB9KTtcbiAgICB9XG5cbiAgICBhZGRGb2xkZXIoKSB7XG4gICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL2FkZC1mb2xkZXInXSk7XG4gICAgfVxufVxuIiwiPGhlYWRlcj5cbiAgICA8ZGl2IGNsYXNzPVwibGVmdFwiPlxuICAgICAgICA8YSByb3V0ZXJMaW5rPVwiL3RhYnMvc2V0dGluZ3NcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaGVhZGVyLWljb25cIj48aSBjbGFzcz1cImZhIGZhLWNoZXZyb24tbGVmdFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT48L3NwYW4+XG4gICAgICAgICAgICA8c3Bhbj57eydiYWNrJyB8IGkxOG59fTwvc3Bhbj5cbiAgICAgICAgPC9hPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJjZW50ZXJcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ0aXRsZVwiPnt7J2ZvbGRlcnMnIHwgaTE4bn19PC9zcGFuPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJyaWdodFwiPlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBhcHBCbHVyQ2xpY2sgKGNsaWNrKT1cImFkZEZvbGRlcigpXCIgYXBwQTExeVRpdGxlPVwie3snYWRkRm9sZGVyJyB8IGkxOG59fVwiPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1wbHVzIGZhLWxnIGZhLWZ3XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbjwvaGVhZGVyPlxuPGNvbnRlbnQ+XG4gICAgPGRpdiBjbGFzcz1cImJveCBsaXN0IGZ1bGwtbGlzdFwiICpuZ0lmPVwiZm9sZGVycyAmJiBmb2xkZXJzLmxlbmd0aFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWNvbnRlbnRcIj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGFwcFN0b3BDbGljayAoY2xpY2spPVwiZm9sZGVyU2VsZWN0ZWQoZilcIiBjbGFzcz1cImJveC1jb250ZW50LXJvdyBwYWRkZWRcIlxuICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBmIG9mIGZvbGRlcnNcIj57e2YubmFtZX19PC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJuby1pdGVtc1wiICpuZ0lmPVwiIWZvbGRlcnMgfHwgIWZvbGRlcnMubGVuZ3RoXCI+XG4gICAgICAgIDxwPnt7J25vRm9sZGVycycgfCBpMThufX08L3A+XG4gICAgPC9kaXY+XG48L2NvbnRlbnQ+XG4iLCJpbXBvcnQge1xuICAgIENvbXBvbmVudCxcbiAgICBPbkluaXQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBUaGVtZVR5cGUgfSBmcm9tICdqc2xpYi1jb21tb24vZW51bXMvdGhlbWVUeXBlJztcbmltcG9ydCB7IFVyaU1hdGNoVHlwZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9lbnVtcy91cmlNYXRjaFR5cGUnO1xuXG5pbXBvcnQgeyBJMThuU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvaTE4bi5zZXJ2aWNlJztcbmltcG9ydCB7IE1lc3NhZ2luZ1NlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL21lc3NhZ2luZy5zZXJ2aWNlJztcbmltcG9ydCB7IFN0YXRlU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvc3RhdGUuc2VydmljZSc7XG5pbXBvcnQgeyBTdG9yYWdlU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvc3RvcmFnZS5zZXJ2aWNlJztcbmltcG9ydCB7IFRvdHBTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy90b3RwLnNlcnZpY2UnO1xuXG5pbXBvcnQgeyBDb25zdGFudHNTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL3NlcnZpY2VzL2NvbnN0YW50cy5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdhcHAtb3B0aW9ucycsXG4gICAgdGVtcGxhdGVVcmw6ICdvcHRpb25zLmNvbXBvbmVudC5odG1sJyxcbn0pXG5leHBvcnQgY2xhc3MgT3B0aW9uc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gICAgZGlzYWJsZUZhdmljb24gPSBmYWxzZTtcbiAgICBkaXNhYmxlQmFkZ2VDb3VudGVyID0gZmFsc2U7XG4gICAgZW5hYmxlQXV0b0ZpbGxPblBhZ2VMb2FkID0gZmFsc2U7XG4gICAgYXV0b0ZpbGxPblBhZ2VMb2FkRGVmYXVsdCA9IGZhbHNlO1xuICAgIGF1dG9GaWxsT25QYWdlTG9hZE9wdGlvbnM6IGFueVtdO1xuICAgIGRpc2FibGVBdXRvVG90cENvcHkgPSBmYWxzZTtcbiAgICBkaXNhYmxlQ29udGV4dE1lbnVJdGVtID0gZmFsc2U7XG4gICAgZGlzYWJsZUFkZExvZ2luTm90aWZpY2F0aW9uID0gZmFsc2U7XG4gICAgZGlzYWJsZUNoYW5nZWRQYXNzd29yZE5vdGlmaWNhdGlvbiA9IGZhbHNlO1xuICAgIGRvbnRTaG93Q2FyZHMgPSBmYWxzZTtcbiAgICBkb250U2hvd0lkZW50aXRpZXMgPSBmYWxzZTtcbiAgICBzaG93Q2xlYXJDbGlwYm9hcmQgPSB0cnVlO1xuICAgIHRoZW1lOiBzdHJpbmc7XG4gICAgdGhlbWVPcHRpb25zOiBhbnlbXTtcbiAgICBkZWZhdWx0VXJpTWF0Y2ggPSBVcmlNYXRjaFR5cGUuRG9tYWluO1xuICAgIHVyaU1hdGNoT3B0aW9uczogYW55W107XG4gICAgY2xlYXJDbGlwYm9hcmQ6IG51bWJlcjtcbiAgICBjbGVhckNsaXBib2FyZE9wdGlvbnM6IGFueVtdO1xuICAgIHNob3dHZW5lcmFsOiBib29sZWFuID0gdHJ1ZTtcbiAgICBzaG93QXV0b2ZpbGw6IGJvb2xlYW4gPSB0cnVlO1xuICAgIHNob3dEaXNwbGF5OiBib29sZWFuID0gdHJ1ZTtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgbWVzc2FnaW5nU2VydmljZTogTWVzc2FnaW5nU2VydmljZSwgcHJpdmF0ZSBzdG9yYWdlU2VydmljZTogU3RvcmFnZVNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgc3RhdGVTZXJ2aWNlOiBTdGF0ZVNlcnZpY2UsIHByaXZhdGUgdG90cFNlcnZpY2U6IFRvdHBTZXJ2aWNlLCBpMThuU2VydmljZTogSTE4blNlcnZpY2UpIHtcbiAgICAgICAgdGhpcy50aGVtZU9wdGlvbnMgPSBbXG4gICAgICAgICAgICB7IG5hbWU6IGkxOG5TZXJ2aWNlLnQoJ2RlZmF1bHQnKSwgdmFsdWU6IG51bGwgfSxcbiAgICAgICAgICAgIHsgbmFtZTogaTE4blNlcnZpY2UudCgnbGlnaHQnKSwgdmFsdWU6IFRoZW1lVHlwZS5MaWdodCB9LFxuICAgICAgICAgICAgeyBuYW1lOiBpMThuU2VydmljZS50KCdkYXJrJyksIHZhbHVlOiBUaGVtZVR5cGUuRGFyayB9LFxuICAgICAgICAgICAgeyBuYW1lOiAnTm9yZCcsIHZhbHVlOiBUaGVtZVR5cGUuTm9yZCB9LFxuICAgICAgICAgICAgeyBuYW1lOiBpMThuU2VydmljZS50KCdzb2xhcml6ZWREYXJrJyksIHZhbHVlOiBUaGVtZVR5cGUuU29sYXJpemVkRGFyayB9LFxuICAgICAgICBdO1xuICAgICAgICB0aGlzLnVyaU1hdGNoT3B0aW9ucyA9IFtcbiAgICAgICAgICAgIHsgbmFtZTogaTE4blNlcnZpY2UudCgnYmFzZURvbWFpbicpLCB2YWx1ZTogVXJpTWF0Y2hUeXBlLkRvbWFpbiB9LFxuICAgICAgICAgICAgeyBuYW1lOiBpMThuU2VydmljZS50KCdob3N0JyksIHZhbHVlOiBVcmlNYXRjaFR5cGUuSG9zdCB9LFxuICAgICAgICAgICAgeyBuYW1lOiBpMThuU2VydmljZS50KCdzdGFydHNXaXRoJyksIHZhbHVlOiBVcmlNYXRjaFR5cGUuU3RhcnRzV2l0aCB9LFxuICAgICAgICAgICAgeyBuYW1lOiBpMThuU2VydmljZS50KCdyZWdFeCcpLCB2YWx1ZTogVXJpTWF0Y2hUeXBlLlJlZ3VsYXJFeHByZXNzaW9uIH0sXG4gICAgICAgICAgICB7IG5hbWU6IGkxOG5TZXJ2aWNlLnQoJ2V4YWN0JyksIHZhbHVlOiBVcmlNYXRjaFR5cGUuRXhhY3QgfSxcbiAgICAgICAgICAgIHsgbmFtZTogaTE4blNlcnZpY2UudCgnbmV2ZXInKSwgdmFsdWU6IFVyaU1hdGNoVHlwZS5OZXZlciB9LFxuICAgICAgICBdO1xuICAgICAgICB0aGlzLmNsZWFyQ2xpcGJvYXJkT3B0aW9ucyA9IFtcbiAgICAgICAgICAgIHsgbmFtZTogaTE4blNlcnZpY2UudCgnbmV2ZXInKSwgdmFsdWU6IG51bGwgfSxcbiAgICAgICAgICAgIHsgbmFtZTogaTE4blNlcnZpY2UudCgndGVuU2Vjb25kcycpLCB2YWx1ZTogMTAgfSxcbiAgICAgICAgICAgIHsgbmFtZTogaTE4blNlcnZpY2UudCgndHdlbnR5U2Vjb25kcycpLCB2YWx1ZTogMjAgfSxcbiAgICAgICAgICAgIHsgbmFtZTogaTE4blNlcnZpY2UudCgndGhpcnR5U2Vjb25kcycpLCB2YWx1ZTogMzAgfSxcbiAgICAgICAgICAgIHsgbmFtZTogaTE4blNlcnZpY2UudCgnb25lTWludXRlJyksIHZhbHVlOiA2MCB9LFxuICAgICAgICAgICAgeyBuYW1lOiBpMThuU2VydmljZS50KCd0d29NaW51dGVzJyksIHZhbHVlOiAxMjAgfSxcbiAgICAgICAgICAgIHsgbmFtZTogaTE4blNlcnZpY2UudCgnZml2ZU1pbnV0ZXMnKSwgdmFsdWU6IDMwMCB9LFxuICAgICAgICBdO1xuICAgICAgICB0aGlzLmF1dG9GaWxsT25QYWdlTG9hZE9wdGlvbnMgPSBbXG4gICAgICAgICAgICB7IG5hbWU6IGkxOG5TZXJ2aWNlLnQoJ2F1dG9GaWxsT25QYWdlTG9hZFllcycpLCB2YWx1ZTogdHJ1ZSB9LFxuICAgICAgICAgICAgeyBuYW1lOiBpMThuU2VydmljZS50KCdhdXRvRmlsbE9uUGFnZUxvYWRObycpLCB2YWx1ZTogZmFsc2UgfSxcbiAgICAgICAgXTtcbiAgICB9XG5cbiAgICBhc3luYyBuZ09uSW5pdCgpIHtcbiAgICAgICAgdGhpcy5lbmFibGVBdXRvRmlsbE9uUGFnZUxvYWQgPSBhd2FpdCB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldDxib29sZWFuPihcbiAgICAgICAgICAgIENvbnN0YW50c1NlcnZpY2UuZW5hYmxlQXV0b0ZpbGxPblBhZ2VMb2FkS2V5KTtcblxuICAgICAgICB0aGlzLmF1dG9GaWxsT25QYWdlTG9hZERlZmF1bHQgPSBhd2FpdCB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldDxib29sZWFuPihcbiAgICAgICAgICAgIENvbnN0YW50c1NlcnZpY2UuYXV0b0ZpbGxPblBhZ2VMb2FkRGVmYXVsdEtleSkgPz8gdHJ1ZTtcblxuICAgICAgICB0aGlzLmRpc2FibGVBZGRMb2dpbk5vdGlmaWNhdGlvbiA9IGF3YWl0IHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0PGJvb2xlYW4+KFxuICAgICAgICAgICAgQ29uc3RhbnRzU2VydmljZS5kaXNhYmxlQWRkTG9naW5Ob3RpZmljYXRpb25LZXkpO1xuXG4gICAgICAgIHRoaXMuZGlzYWJsZUNoYW5nZWRQYXNzd29yZE5vdGlmaWNhdGlvbiA9IGF3YWl0IHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0PGJvb2xlYW4+KFxuICAgICAgICAgICAgQ29uc3RhbnRzU2VydmljZS5kaXNhYmxlQ2hhbmdlZFBhc3N3b3JkTm90aWZpY2F0aW9uS2V5KTtcblxuICAgICAgICB0aGlzLmRpc2FibGVDb250ZXh0TWVudUl0ZW0gPSBhd2FpdCB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldDxib29sZWFuPihcbiAgICAgICAgICAgIENvbnN0YW50c1NlcnZpY2UuZGlzYWJsZUNvbnRleHRNZW51SXRlbUtleSk7XG5cbiAgICAgICAgdGhpcy5kb250U2hvd0NhcmRzID0gYXdhaXQgdGhpcy5zdG9yYWdlU2VydmljZS5nZXQ8Ym9vbGVhbj4oQ29uc3RhbnRzU2VydmljZS5kb250U2hvd0NhcmRzQ3VycmVudFRhYik7XG4gICAgICAgIHRoaXMuZG9udFNob3dJZGVudGl0aWVzID0gYXdhaXQgdGhpcy5zdG9yYWdlU2VydmljZS5nZXQ8Ym9vbGVhbj4oQ29uc3RhbnRzU2VydmljZS5kb250U2hvd0lkZW50aXRpZXNDdXJyZW50VGFiKTtcblxuICAgICAgICB0aGlzLmRpc2FibGVBdXRvVG90cENvcHkgPSAhKGF3YWl0IHRoaXMudG90cFNlcnZpY2UuaXNBdXRvQ29weUVuYWJsZWQoKSk7XG5cbiAgICAgICAgdGhpcy5kaXNhYmxlRmF2aWNvbiA9IGF3YWl0IHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0PGJvb2xlYW4+KENvbnN0YW50c1NlcnZpY2UuZGlzYWJsZUZhdmljb25LZXkpO1xuXG4gICAgICAgIHRoaXMuZGlzYWJsZUJhZGdlQ291bnRlciA9IGF3YWl0IHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0PGJvb2xlYW4+KENvbnN0YW50c1NlcnZpY2UuZGlzYWJsZUJhZGdlQ291bnRlcktleSk7XG5cbiAgICAgICAgdGhpcy50aGVtZSA9IGF3YWl0IHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0PHN0cmluZz4oQ29uc3RhbnRzU2VydmljZS50aGVtZUtleSk7XG5cbiAgICAgICAgY29uc3QgZGVmYXVsdFVyaU1hdGNoID0gYXdhaXQgdGhpcy5zdG9yYWdlU2VydmljZS5nZXQ8VXJpTWF0Y2hUeXBlPihDb25zdGFudHNTZXJ2aWNlLmRlZmF1bHRVcmlNYXRjaCk7XG4gICAgICAgIHRoaXMuZGVmYXVsdFVyaU1hdGNoID0gZGVmYXVsdFVyaU1hdGNoID09IG51bGwgPyBVcmlNYXRjaFR5cGUuRG9tYWluIDogZGVmYXVsdFVyaU1hdGNoO1xuXG4gICAgICAgIHRoaXMuY2xlYXJDbGlwYm9hcmQgPSBhd2FpdCB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldDxudW1iZXI+KENvbnN0YW50c1NlcnZpY2UuY2xlYXJDbGlwYm9hcmRLZXkpO1xuICAgIH1cblxuICAgIGFzeW5jIHVwZGF0ZUFkZExvZ2luTm90aWZpY2F0aW9uKCkge1xuICAgICAgICBhd2FpdCB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNhdmUoQ29uc3RhbnRzU2VydmljZS5kaXNhYmxlQWRkTG9naW5Ob3RpZmljYXRpb25LZXksXG4gICAgICAgICAgICB0aGlzLmRpc2FibGVBZGRMb2dpbk5vdGlmaWNhdGlvbik7XG4gICAgfVxuXG4gICAgYXN5bmMgdXBkYXRlQ2hhbmdlZFBhc3N3b3JkTm90aWZpY2F0aW9uKCkge1xuICAgICAgICBhd2FpdCB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNhdmUoQ29uc3RhbnRzU2VydmljZS5kaXNhYmxlQ2hhbmdlZFBhc3N3b3JkTm90aWZpY2F0aW9uS2V5LFxuICAgICAgICAgICAgdGhpcy5kaXNhYmxlQ2hhbmdlZFBhc3N3b3JkTm90aWZpY2F0aW9uKTtcbiAgICB9XG5cbiAgICBhc3luYyB1cGRhdGVEaXNhYmxlQ29udGV4dE1lbnVJdGVtKCkge1xuICAgICAgICBhd2FpdCB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNhdmUoQ29uc3RhbnRzU2VydmljZS5kaXNhYmxlQ29udGV4dE1lbnVJdGVtS2V5LFxuICAgICAgICAgICAgdGhpcy5kaXNhYmxlQ29udGV4dE1lbnVJdGVtKTtcbiAgICAgICAgdGhpcy5tZXNzYWdpbmdTZXJ2aWNlLnNlbmQoJ2JnVXBkYXRlQ29udGV4dE1lbnUnKTtcbiAgICB9XG5cbiAgICBhc3luYyB1cGRhdGVBdXRvVG90cENvcHkoKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2F2ZShDb25zdGFudHNTZXJ2aWNlLmRpc2FibGVBdXRvVG90cENvcHlLZXksIHRoaXMuZGlzYWJsZUF1dG9Ub3RwQ29weSk7XG4gICAgfVxuXG4gICAgYXN5bmMgdXBkYXRlQXV0b0ZpbGxPblBhZ2VMb2FkKCkge1xuICAgICAgICBhd2FpdCB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNhdmUoQ29uc3RhbnRzU2VydmljZS5lbmFibGVBdXRvRmlsbE9uUGFnZUxvYWRLZXksIHRoaXMuZW5hYmxlQXV0b0ZpbGxPblBhZ2VMb2FkKTtcbiAgICB9XG5cbiAgICBhc3luYyB1cGRhdGVBdXRvRmlsbE9uUGFnZUxvYWREZWZhdWx0KCkge1xuICAgICAgICBhd2FpdCB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNhdmUoQ29uc3RhbnRzU2VydmljZS5hdXRvRmlsbE9uUGFnZUxvYWREZWZhdWx0S2V5LCB0aGlzLmF1dG9GaWxsT25QYWdlTG9hZERlZmF1bHQpO1xuICAgIH1cblxuICAgIGFzeW5jIHVwZGF0ZURpc2FibGVGYXZpY29uKCkge1xuICAgICAgICBhd2FpdCB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNhdmUoQ29uc3RhbnRzU2VydmljZS5kaXNhYmxlRmF2aWNvbktleSwgdGhpcy5kaXNhYmxlRmF2aWNvbik7XG4gICAgICAgIGF3YWl0IHRoaXMuc3RhdGVTZXJ2aWNlLnNhdmUoQ29uc3RhbnRzU2VydmljZS5kaXNhYmxlRmF2aWNvbktleSwgdGhpcy5kaXNhYmxlRmF2aWNvbik7XG4gICAgfVxuXG4gICAgYXN5bmMgdXBkYXRlRGlzYWJsZUJhZGdlQ291bnRlcigpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5zdG9yYWdlU2VydmljZS5zYXZlKENvbnN0YW50c1NlcnZpY2UuZGlzYWJsZUJhZGdlQ291bnRlcktleSwgdGhpcy5kaXNhYmxlQmFkZ2VDb3VudGVyKTtcbiAgICAgICAgYXdhaXQgdGhpcy5zdGF0ZVNlcnZpY2Uuc2F2ZShDb25zdGFudHNTZXJ2aWNlLmRpc2FibGVCYWRnZUNvdW50ZXJLZXksIHRoaXMuZGlzYWJsZUJhZGdlQ291bnRlcik7XG4gICAgICAgIHRoaXMubWVzc2FnaW5nU2VydmljZS5zZW5kKCdiZ1VwZGF0ZUNvbnRleHRNZW51Jyk7XG4gICAgfVxuXG4gICAgYXN5bmMgdXBkYXRlU2hvd0NhcmRzKCkge1xuICAgICAgICBhd2FpdCB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNhdmUoQ29uc3RhbnRzU2VydmljZS5kb250U2hvd0NhcmRzQ3VycmVudFRhYiwgdGhpcy5kb250U2hvd0NhcmRzKTtcbiAgICAgICAgYXdhaXQgdGhpcy5zdGF0ZVNlcnZpY2Uuc2F2ZShDb25zdGFudHNTZXJ2aWNlLmRvbnRTaG93Q2FyZHNDdXJyZW50VGFiLCB0aGlzLmRvbnRTaG93Q2FyZHMpO1xuICAgIH1cblxuICAgIGFzeW5jIHVwZGF0ZVNob3dJZGVudGl0aWVzKCkge1xuICAgICAgICBhd2FpdCB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNhdmUoQ29uc3RhbnRzU2VydmljZS5kb250U2hvd0lkZW50aXRpZXNDdXJyZW50VGFiLCB0aGlzLmRvbnRTaG93SWRlbnRpdGllcyk7XG4gICAgICAgIGF3YWl0IHRoaXMuc3RhdGVTZXJ2aWNlLnNhdmUoQ29uc3RhbnRzU2VydmljZS5kb250U2hvd0lkZW50aXRpZXNDdXJyZW50VGFiLCB0aGlzLmRvbnRTaG93SWRlbnRpdGllcyk7XG4gICAgfVxuXG4gICAgYXN5bmMgc2F2ZVRoZW1lKCkge1xuICAgICAgICBhd2FpdCB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNhdmUoQ29uc3RhbnRzU2VydmljZS50aGVtZUtleSwgdGhpcy50aGVtZSk7XG4gICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKSwgMjAwKTtcbiAgICB9XG5cbiAgICBhc3luYyBzYXZlRGVmYXVsdFVyaU1hdGNoKCkge1xuICAgICAgICBhd2FpdCB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNhdmUoQ29uc3RhbnRzU2VydmljZS5kZWZhdWx0VXJpTWF0Y2gsIHRoaXMuZGVmYXVsdFVyaU1hdGNoKTtcbiAgICB9XG5cbiAgICBhc3luYyBzYXZlQ2xlYXJDbGlwYm9hcmQoKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2F2ZShDb25zdGFudHNTZXJ2aWNlLmNsZWFyQ2xpcGJvYXJkS2V5LCB0aGlzLmNsZWFyQ2xpcGJvYXJkKTtcbiAgICB9XG59XG4iLCI8aGVhZGVyPlxuICAgIDxkaXYgY2xhc3M9XCJsZWZ0XCI+XG4gICAgICAgIDxhIHJvdXRlckxpbms9XCIvdGFicy9zZXR0aW5nc1wiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJoZWFkZXItaWNvblwiPjxpIGNsYXNzPVwiZmEgZmEtY2hldnJvbi1sZWZ0XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPjwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuPnt7J2JhY2snIHwgaTE4bn19PC9zcGFuPlxuICAgICAgICA8L2E+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImNlbnRlclwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInRpdGxlXCI+e3snb3B0aW9ucycgfCBpMThufX08L3NwYW4+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cInJpZ2h0XCI+PC9kaXY+XG48L2hlYWRlcj5cbjxjb250ZW50PlxuICAgIDxkaXYgY2xhc3M9XCJib3hcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImJveC1oZWFkZXItZXhwYW5kYWJsZVwiIChjbGljayk9XCJzaG93R2VuZXJhbCA9ICFzaG93R2VuZXJhbFwiPlxuICAgICAgICAgICAgR2VuZXJhbFxuICAgICAgICAgICAgPGkgKm5nSWY9XCIhc2hvd0dlbmVyYWxcIiBjbGFzcz1cImZhIGZhLWNoZXZyb24tZG93biBmYS1zbSBpY29uXCI+PC9pPlxuICAgICAgICAgICAgPGkgKm5nSWY9XCJzaG93R2VuZXJhbFwiIGNsYXNzPVwiZmEgZmEtY2hldnJvbi11cCBmYS1zbSBpY29uXCI+PC9pPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2hvd0dlbmVyYWxcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImJveFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50LXJvd1wiIGFwcEJveFJvdz5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImRlZmF1bHRVcmlNYXRjaFwiPnt7J2RlZmF1bHRVcmlNYXRjaERldGVjdGlvbicgfCBpMThufX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGlkPVwiZGVmYXVsdFVyaU1hdGNoXCIgbmFtZT1cIkRlZmF1bHRVcmlNYXRjaFwiIFsobmdNb2RlbCldPVwiZGVmYXVsdFVyaU1hdGNoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwic2F2ZURlZmF1bHRVcmlNYXRjaCgpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBvIG9mIHVyaU1hdGNoT3B0aW9uc1wiIFtuZ1ZhbHVlXT1cIm8udmFsdWVcIj57e28ubmFtZX19PC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWZvb3RlclwiPnt7J2RlZmF1bHRVcmlNYXRjaERldGVjdGlvbkRlc2MnIHwgaTE4bn19PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYm94XCIgKm5nSWY9XCJzaG93Q2xlYXJDbGlwYm9hcmRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtY29udGVudFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtY29udGVudC1yb3dcIiBhcHBCb3hSb3c+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJjbGVhckNsaXBib2FyZFwiPnt7J2NsZWFyQ2xpcGJvYXJkJyB8IGkxOG59fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgaWQ9XCJjbGVhckNsaXBib2FyZFwiIG5hbWU9XCJDbGVhckNsaXBib2FyZFwiIFsobmdNb2RlbCldPVwiY2xlYXJDbGlwYm9hcmRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJzYXZlQ2xlYXJDbGlwYm9hcmQoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgbyBvZiBjbGVhckNsaXBib2FyZE9wdGlvbnNcIiBbbmdWYWx1ZV09XCJvLnZhbHVlXCI+e3tvLm5hbWV9fTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1mb290ZXJcIj57eydjbGVhckNsaXBib2FyZERlc2MnIHwgaTE4bn19PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYm94XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWNvbnRlbnQtcm93IGJveC1jb250ZW50LXJvdy1jaGVja2JveFwiIGFwcEJveFJvdz5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInRvdHBcIj57eydkaXNhYmxlQXV0b1RvdHBDb3B5JyB8IGkxOG59fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD1cInRvdHBcIiB0eXBlPVwiY2hlY2tib3hcIiAoY2hhbmdlKT1cInVwZGF0ZUF1dG9Ub3RwQ29weSgpXCIgWyhuZ01vZGVsKV09XCJkaXNhYmxlQXV0b1RvdHBDb3B5XCI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtZm9vdGVyXCI+e3snZGlzYWJsZUF1dG9Ub3RwQ29weURlc2MnIHwgaTE4bn19PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYm94XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWNvbnRlbnQtcm93IGJveC1jb250ZW50LXJvdy1jaGVja2JveFwiIGFwcEJveFJvdz5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImFkZGxvZ2luLW5vdGlmaWNhdGlvbi1iYXJcIj57eydkaXNhYmxlQWRkTG9naW5Ob3RpZmljYXRpb24nIHwgaTE4bn19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPVwiYWRkbG9naW4tbm90aWZpY2F0aW9uLWJhclwiIHR5cGU9XCJjaGVja2JveFwiIChjaGFuZ2UpPVwidXBkYXRlQWRkTG9naW5Ob3RpZmljYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImRpc2FibGVBZGRMb2dpbk5vdGlmaWNhdGlvblwiPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWZvb3RlclwiPnt7J2FkZExvZ2luTm90aWZpY2F0aW9uRGVzYycgfCBpMThufX08L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJib3hcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtY29udGVudFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtY29udGVudC1yb3cgYm94LWNvbnRlbnQtcm93LWNoZWNrYm94XCIgYXBwQm94Um93PlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiY2hhbmdlZHBhc3Mtbm90aWZpY2F0aW9uLWJhclwiPnt7J2Rpc2FibGVDaGFuZ2VkUGFzc3dvcmROb3RpZmljYXRpb24nIHwgaTE4bn19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPVwiY2hhbmdlZHBhc3Mtbm90aWZpY2F0aW9uLWJhclwiIHR5cGU9XCJjaGVja2JveFwiIChjaGFuZ2UpPVwidXBkYXRlQ2hhbmdlZFBhc3N3b3JkTm90aWZpY2F0aW9uKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJkaXNhYmxlQ2hhbmdlZFBhc3N3b3JkTm90aWZpY2F0aW9uXCI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtZm9vdGVyXCI+e3snZGlzYWJsZUNoYW5nZWRQYXNzd29yZE5vdGlmaWNhdGlvbkRlc2MnIHwgaTE4bn19PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYm94XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWNvbnRlbnQtcm93IGJveC1jb250ZW50LXJvdy1jaGVja2JveFwiIGFwcEJveFJvdz5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImNvbnRleHQtbWVudVwiPnt7J2Rpc2FibGVDb250ZXh0TWVudUl0ZW0nIHwgaTE4bn19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPVwiY29udGV4dC1tZW51XCIgdHlwZT1cImNoZWNrYm94XCIgKGNoYW5nZSk9XCJ1cGRhdGVEaXNhYmxlQ29udGV4dE1lbnVJdGVtKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJkaXNhYmxlQ29udGV4dE1lbnVJdGVtXCI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtZm9vdGVyXCI+e3snZGlzYWJsZUNvbnRleHRNZW51SXRlbURlc2MnIHwgaTE4bn19PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxkaXYgY2xhc3M9XCJib3ggYm94LXNlY3Rpb24tZGl2aWRlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWhlYWRlci1leHBhbmRhYmxlXCIgKGNsaWNrKT1cInNob3dEaXNwbGF5ID0gIXNob3dEaXNwbGF5XCI+XG4gICAgICAgICAgICBEaXNwbGF5XG4gICAgICAgICAgICA8aSAqbmdJZj1cIiFzaG93RGlzcGxheVwiIGNsYXNzPVwiZmEgZmEtY2hldnJvbi1kb3duIGZhLXNtIGljb25cIj48L2k+XG4gICAgICAgICAgICA8aSAqbmdJZj1cInNob3dEaXNwbGF5XCIgY2xhc3M9XCJmYSBmYS1jaGV2cm9uLXVwIGZhLXNtIGljb25cIj48L2k+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaG93RGlzcGxheVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYm94XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWNvbnRlbnQtcm93IGJveC1jb250ZW50LXJvdy1jaGVja2JveFwiIGFwcEJveFJvdz5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImRvbnRTaG93Q2FyZHNcIj57eydkb250U2hvd0NhcmRzQ3VycmVudFRhYicgfCBpMThufX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9XCJkb250U2hvd0NhcmRzXCIgdHlwZT1cImNoZWNrYm94XCIgKGNoYW5nZSk9XCJ1cGRhdGVTaG93Q2FyZHMoKVwiIFsobmdNb2RlbCldPVwiZG9udFNob3dDYXJkc1wiPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWZvb3RlclwiPnt7J2RvbnRTaG93Q2FyZHNDdXJyZW50VGFiRGVzYycgfCBpMThufX08L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJib3hcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtY29udGVudFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtY29udGVudC1yb3cgYm94LWNvbnRlbnQtcm93LWNoZWNrYm94XCIgYXBwQm94Um93PlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiZG9udFNob3dJZGVudGl0aWVzXCI+e3snZG9udFNob3dJZGVudGl0aWVzQ3VycmVudFRhYicgfCBpMThufX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9XCJkb250U2hvd0lkZW50aXRpZXNcIiB0eXBlPVwiY2hlY2tib3hcIiAoY2hhbmdlKT1cInVwZGF0ZVNob3dJZGVudGl0aWVzKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJkb250U2hvd0lkZW50aXRpZXNcIj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1mb290ZXJcIj57eydkb250U2hvd0lkZW50aXRpZXNDdXJyZW50VGFiRGVzYycgfCBpMThufX08L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJib3hcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtY29udGVudFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtY29udGVudC1yb3cgYm94LWNvbnRlbnQtcm93LWNoZWNrYm94XCIgYXBwQm94Um93PlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiZmF2aWNvblwiPnt7J2Rpc2FibGVGYXZpY29uJyB8IGkxOG59fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD1cImZhdmljb25cIiB0eXBlPVwiY2hlY2tib3hcIiAoY2hhbmdlKT1cInVwZGF0ZURpc2FibGVGYXZpY29uKClcIiBbKG5nTW9kZWwpXT1cImRpc2FibGVGYXZpY29uXCI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtZm9vdGVyXCI+e3snZGlzYWJsZUZhdmljb25EZXNjJyB8IGkxOG59fTwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImJveFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50LXJvdyBib3gtY29udGVudC1yb3ctY2hlY2tib3hcIiBhcHBCb3hSb3c+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJiYWRnZVwiPnt7J2Rpc2FibGVCYWRnZUNvdW50ZXInIHwgaTE4bn19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPVwiYmFkZ2VcIiB0eXBlPVwiY2hlY2tib3hcIiAoY2hhbmdlKT1cInVwZGF0ZURpc2FibGVCYWRnZUNvdW50ZXIoKVwiIFsobmdNb2RlbCldPVwiZGlzYWJsZUJhZGdlQ291bnRlclwiPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWZvb3RlclwiPnt7J2Rpc2FibGVCYWRnZUNvdW50ZXJEZXNjJyB8IGkxOG59fTwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImJveFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50LXJvd1wiIGFwcEJveFJvdz5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInRoZW1lXCI+e3sndGhlbWUnIHwgaTE4bn19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBpZD1cInRoZW1lXCIgbmFtZT1cIlRoZW1lXCIgWyhuZ01vZGVsKV09XCJ0aGVtZVwiIChjaGFuZ2UpPVwic2F2ZVRoZW1lKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IG8gb2YgdGhlbWVPcHRpb25zXCIgW25nVmFsdWVdPVwiby52YWx1ZVwiPnt7by5uYW1lfX08L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtZm9vdGVyXCI+e3sndGhlbWVEZXNjJyB8IGkxOG59fTwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8ZGl2IGNsYXNzPVwiYm94IGJveC1zZWN0aW9uLWRpdmlkZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImJveC1oZWFkZXItZXhwYW5kYWJsZVwiIChjbGljayk9XCJzaG93QXV0b2ZpbGwgPSAhc2hvd0F1dG9maWxsXCI+XG4gICAgICAgICAgICBBdXRvZmlsbFxuICAgICAgICAgICAgPGkgKm5nSWY9XCIhc2hvd0F1dG9maWxsXCIgY2xhc3M9XCJmYSBmYS1jaGV2cm9uLWRvd24gZmEtc20gaWNvblwiPjwvaT5cbiAgICAgICAgICAgIDxpICpuZ0lmPVwic2hvd0F1dG9maWxsXCIgY2xhc3M9XCJmYSBmYS1jaGV2cm9uLXVwIGZhLXNtIGljb25cIj48L2k+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaG93QXV0b2ZpbGxcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImJveFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50LXJvdyBib3gtY29udGVudC1yb3ctY2hlY2tib3hcIiBhcHBCb3hSb3c+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJhdXRvZmlsbFwiPnt7J2VuYWJsZUF1dG9GaWxsT25QYWdlTG9hZCcgfCBpMThufX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9XCJhdXRvZmlsbFwiIHR5cGU9XCJjaGVja2JveFwiIChjaGFuZ2UpPVwidXBkYXRlQXV0b0ZpbGxPblBhZ2VMb2FkKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJlbmFibGVBdXRvRmlsbE9uUGFnZUxvYWRcIj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1mb290ZXJcIj5cbiAgICAgICAgICAgICAgICB7eydlbmFibGVBdXRvRmlsbE9uUGFnZUxvYWREZXNjJyB8IGkxOG59fVxuICAgICAgICAgICAgICAgIDxiPnt7J3dhcm5pbmcnIHwgaTE4bn19PC9iPjoge3snZXhwZXJpbWVudGFsRmVhdHVyZScgfCBpMThufX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImJveFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50LXJvd1wiIGFwcEJveFJvdz5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImRlZmF1bHRBdXRvZmlsbFwiPnt7J2RlZmF1bHRBdXRvRmlsbE9uUGFnZUxvYWQnIHwgaTE4bn19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBpZD1cImRlZmF1bHRBdXRvZmlsbFwiIG5hbWU9XCJEZWZhdWx0QXV0b2ZpbGxcIiBbKG5nTW9kZWwpXT1cImF1dG9GaWxsT25QYWdlTG9hZERlZmF1bHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJ1cGRhdGVBdXRvRmlsbE9uUGFnZUxvYWREZWZhdWx0KClcIiBbZGlzYWJsZWRdPVwiIWVuYWJsZUF1dG9GaWxsT25QYWdlTG9hZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgbyBvZiBhdXRvRmlsbE9uUGFnZUxvYWRPcHRpb25zXCIgW25nVmFsdWVdPVwiby52YWx1ZVwiPnt7by5uYW1lfX08L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtZm9vdGVyXCI+e3snZGVmYXVsdEF1dG9GaWxsT25QYWdlTG9hZERlc2MnIHwgaTE4bn19PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuPC9jb250ZW50PlxuIiwiaW1wb3J0IHsgQ3VycmVuY3lQaXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENvbXBvbmVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBBcGlTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9hcGkuc2VydmljZSc7XG5pbXBvcnQgeyBJMThuU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvaTE4bi5zZXJ2aWNlJztcbmltcG9ydCB7IExvZ1NlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL2xvZy5zZXJ2aWNlJztcbmltcG9ydCB7IFBsYXRmb3JtVXRpbHNTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9wbGF0Zm9ybVV0aWxzLnNlcnZpY2UnO1xuaW1wb3J0IHsgVXNlclNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL3VzZXIuc2VydmljZSc7XG5cbmltcG9ydCB7IFByZW1pdW1Db21wb25lbnQgYXMgQmFzZVByZW1pdW1Db21wb25lbnQgfSBmcm9tICdqc2xpYi1hbmd1bGFyL2NvbXBvbmVudHMvcHJlbWl1bS5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2FwcC1wcmVtaXVtJyxcbiAgICB0ZW1wbGF0ZVVybDogJ3ByZW1pdW0uY29tcG9uZW50Lmh0bWwnLFxufSlcbmV4cG9ydCBjbGFzcyBQcmVtaXVtQ29tcG9uZW50IGV4dGVuZHMgQmFzZVByZW1pdW1Db21wb25lbnQge1xuICAgIHByaWNlU3RyaW5nOiBzdHJpbmc7XG5cbiAgICBjb25zdHJ1Y3RvcihpMThuU2VydmljZTogSTE4blNlcnZpY2UsIHBsYXRmb3JtVXRpbHNTZXJ2aWNlOiBQbGF0Zm9ybVV0aWxzU2VydmljZSxcbiAgICAgICAgYXBpU2VydmljZTogQXBpU2VydmljZSwgdXNlclNlcnZpY2U6IFVzZXJTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGN1cnJlbmN5UGlwZTogQ3VycmVuY3lQaXBlLCBsb2dTZXJ2aWNlOiBMb2dTZXJ2aWNlKSB7XG4gICAgICAgIHN1cGVyKGkxOG5TZXJ2aWNlLCBwbGF0Zm9ybVV0aWxzU2VydmljZSwgYXBpU2VydmljZSwgdXNlclNlcnZpY2UsIGxvZ1NlcnZpY2UpO1xuXG4gICAgICAgIC8vIFN1cHBvcnQgb2xkIHByaWNlIHN0cmluZy4gQ2FuIGJlIHJlbW92ZWQgaW4gZnV0dXJlIG9uY2UgYWxsIHRyYW5zbGF0aW9ucyBhcmUgcHJvcGVybHkgdXBkYXRlZC5cbiAgICAgICAgY29uc3QgdGhlUHJpY2UgPSB0aGlzLmN1cnJlbmN5UGlwZS50cmFuc2Zvcm0odGhpcy5wcmljZSwgJyQnKTtcbiAgICAgICAgdGhpcy5wcmljZVN0cmluZyA9IGkxOG5TZXJ2aWNlLnQoJ3ByZW1pdW1QcmljZScsIHRoZVByaWNlKTtcbiAgICAgICAgaWYgKHRoaXMucHJpY2VTdHJpbmcuaW5kZXhPZignJXByaWNlJScpID4gLTEpIHtcbiAgICAgICAgICAgIHRoaXMucHJpY2VTdHJpbmcgPSB0aGlzLnByaWNlU3RyaW5nLnJlcGxhY2UoJyVwcmljZSUnLCB0aGVQcmljZSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCI8aGVhZGVyPlxuICAgIDxkaXYgY2xhc3M9XCJsZWZ0XCI+XG4gICAgICAgIDxhIHJvdXRlckxpbms9XCIvdGFicy9zZXR0aW5nc1wiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJoZWFkZXItaWNvblwiPjxpIGNsYXNzPVwiZmEgZmEtY2hldnJvbi1sZWZ0XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPjwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuPnt7J2JhY2snIHwgaTE4bn19PC9zcGFuPlxuICAgICAgICA8L2E+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImNlbnRlclwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInRpdGxlXCI+e3sncHJlbWl1bU1lbWJlcnNoaXAnIHwgaTE4bn19PC9zcGFuPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJyaWdodFwiPjwvZGl2PlxuPC9oZWFkZXI+XG48Y29udGVudD5cbiAgICA8ZGl2IGNsYXNzPVwiY29udGVudFwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzUHJlbWl1bVwiPlxuICAgICAgICAgICAgPHAgY2xhc3M9XCJ0ZXh0LWNlbnRlciBsZWFkXCI+e3sncHJlbWl1bU5vdEN1cnJlbnRNZW1iZXInIHwgaTE4bn19PC9wPlxuICAgICAgICAgICAgPHA+e3sncHJlbWl1bVNpZ25VcEFuZEdldCcgfCBpMThufX08L3A+XG4gICAgICAgICAgICA8dWwgY2xhc3M9XCJmYS11bFwiPlxuICAgICAgICAgICAgICAgIDxsaT5cbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYS1saSBmYSBmYS1jaGVjayB0ZXh0LXN1Y2Nlc3NcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgIHt7J3BwcmVtaXVtU2lnblVwU3RvcmFnZScgfCBpMThufX1cbiAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgIDxsaT5cbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYS1saSBmYSBmYS1jaGVjayB0ZXh0LXN1Y2Nlc3NcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgIHt7J3BwcmVtaXVtU2lnblVwVHdvU3RlcCcgfCBpMThufX1cbiAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgIDxsaT5cbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYS1saSBmYSBmYS1jaGVjayB0ZXh0LXN1Y2Nlc3NcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgIHt7J3BwcmVtaXVtU2lnblVwUmVwb3J0cycgfCBpMThufX1cbiAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgIDxsaT5cbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYS1saSBmYSBmYS1jaGVjayB0ZXh0LXN1Y2Nlc3NcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgIHt7J3BwcmVtaXVtU2lnblVwVG90cCcgfCBpMThufX1cbiAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgIDxsaT5cbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYS1saSBmYSBmYS1jaGVjayB0ZXh0LXN1Y2Nlc3NcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgIHt7J3BwcmVtaXVtU2lnblVwU3VwcG9ydCcgfCBpMThufX1cbiAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgIDxsaT5cbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYS1saSBmYSBmYS1jaGVjayB0ZXh0LXN1Y2Nlc3NcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgIHt7J3BwcmVtaXVtU2lnblVwRnV0dXJlJyB8IGkxOG59fVxuICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICA8L3VsPlxuICAgICAgICAgICAgPHAgY2xhc3M9XCJ0ZXh0LWNlbnRlciBsZWFkXCI+e3twcmljZVN0cmluZ319PC9wPlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gcHJpbWFyeSBibG9ja1wiIGFwcEJsdXJDbGljayAoY2xpY2spPVwicHVyY2hhc2UoKVwiPlxuICAgICAgICAgICAgICAgIDxiPnt7J3ByZW1pdW1QdXJjaGFzZScgfCBpMThufX08L2I+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gI3JlZnJlc2hCdG4gdHlwZT1cImJ1dHRvblwiIGFwcEJsdXJDbGljayAoY2xpY2spPVwicmVmcmVzaCgpXCIgW2Rpc2FibGVkXT1cInJlZnJlc2hCdG4ubG9hZGluZ1wiXG4gICAgICAgICAgICAgICAgW2FwcEFwaUFjdGlvbl09XCJyZWZyZXNoUHJvbWlzZVwiIGNsYXNzPVwiYnRuIGxpbmsgYmxvY2tcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBbaGlkZGVuXT1cInJlZnJlc2hCdG4ubG9hZGluZ1wiPnt7J3ByZW1pdW1SZWZyZXNoJyB8IGkxOG59fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXNwaW5uZXIgZmEtc3BpbiBmYS1sZyBmYS1md1wiIFtoaWRkZW5dPVwiIXJlZnJlc2hCdG4ubG9hZGluZ1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzUHJlbWl1bVwiPlxuICAgICAgICAgICAgPHAgY2xhc3M9XCJ0ZXh0LWNlbnRlciBsZWFkXCI+e3sncHJlbWl1bUN1cnJlbnRNZW1iZXInIHwgaTE4bn19PC9wPlxuICAgICAgICAgICAgPHAgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPnt7J3ByZW1pdW1DdXJyZW50TWVtYmVyVGhhbmtzJyB8IGkxOG59fTwvcD5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJsb2NrIHByaW1hcnlcIiBhcHBCbHVyQ2xpY2sgKGNsaWNrKT1cIm1hbmFnZSgpXCI+XG4gICAgICAgICAgICAgICAgPGI+e3sncHJlbWl1bU1hbmFnZScgfCBpMThufX08L2I+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG48L2NvbnRlbnQ+XG4iLCJpbXBvcnQge1xuICAgIENvbXBvbmVudCxcbiAgICBFbGVtZW50UmVmLFxuICAgIE9uSW5pdCxcbiAgICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUNvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgVG9hc3RlclNlcnZpY2UgfSBmcm9tICdhbmd1bGFyMi10b2FzdGVyJztcbmltcG9ydCBTd2FsIGZyb20gJ3N3ZWV0YWxlcnQyL3NyYy9zd2VldGFsZXJ0Mi5qcyc7XG5cbmltcG9ydCB7IEJyb3dzZXJBcGkgfSBmcm9tICcuLi8uLi9icm93c2VyL2Jyb3dzZXJBcGknO1xuXG5pbXBvcnQgeyBEZXZpY2VUeXBlIH0gZnJvbSAnanNsaWItY29tbW9uL2VudW1zL2RldmljZVR5cGUnO1xuXG5pbXBvcnQgeyBDb25zdGFudHNTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL3NlcnZpY2VzL2NvbnN0YW50cy5zZXJ2aWNlJztcblxuaW1wb3J0IHsgQ3J5cHRvU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvY3J5cHRvLnNlcnZpY2UnO1xuaW1wb3J0IHsgRW52aXJvbm1lbnRTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9lbnZpcm9ubWVudC5zZXJ2aWNlJztcbmltcG9ydCB7IEkxOG5TZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9pMThuLnNlcnZpY2UnO1xuaW1wb3J0IHsgTWVzc2FnaW5nU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvbWVzc2FnaW5nLnNlcnZpY2UnO1xuaW1wb3J0IHsgUGxhdGZvcm1VdGlsc1NlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL3BsYXRmb3JtVXRpbHMuc2VydmljZSc7XG5pbXBvcnQgeyBTdG9yYWdlU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvc3RvcmFnZS5zZXJ2aWNlJztcbmltcG9ydCB7IFVzZXJTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy91c2VyLnNlcnZpY2UnO1xuaW1wb3J0IHsgVmF1bHRUaW1lb3V0U2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvdmF1bHRUaW1lb3V0LnNlcnZpY2UnO1xuaW1wb3J0IHsgUG9wdXBVdGlsc1NlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9wb3B1cC11dGlscy5zZXJ2aWNlJztcblxuaW1wb3J0IHsgTW9kYWxTZXJ2aWNlIH0gZnJvbSAnanNsaWItYW5ndWxhci9zZXJ2aWNlcy9tb2RhbC5zZXJ2aWNlJztcblxuaW1wb3J0IHsgU2V0UGluQ29tcG9uZW50IH0gZnJvbSAnLi4vY29tcG9uZW50cy9zZXQtcGluLmNvbXBvbmVudCc7XG5cbmNvbnN0IFJhdGVVcmxzID0ge1xuICAgIFtEZXZpY2VUeXBlLkNocm9tZUV4dGVuc2lvbl06XG4gICAgICAgICdodHRwczovL2Nocm9tZS5nb29nbGUuY29tL3dlYnN0b3JlL2RldGFpbC9iaXR3YXJkZW4tZnJlZS1wYXNzd29yZC1tL25uZ2NlY2tiYXBlYmZpbW5sbmlpaWFoa2FuZGNsYmxiL3Jldmlld3MnLFxuICAgIFtEZXZpY2VUeXBlLkZpcmVmb3hFeHRlbnNpb25dOlxuICAgICAgICAnaHR0cHM6Ly9hZGRvbnMubW96aWxsYS5vcmcvZW4tVVMvZmlyZWZveC9hZGRvbi9iaXR3YXJkZW4tcGFzc3dvcmQtbWFuYWdlci8jcmV2aWV3cycsXG4gICAgW0RldmljZVR5cGUuT3BlcmFFeHRlbnNpb25dOlxuICAgICAgICAnaHR0cHM6Ly9hZGRvbnMub3BlcmEuY29tL2VuL2V4dGVuc2lvbnMvZGV0YWlscy9iaXR3YXJkZW4tZnJlZS1wYXNzd29yZC1tYW5hZ2VyLyNmZWVkYmFjay1jb250YWluZXInLFxuICAgIFtEZXZpY2VUeXBlLkVkZ2VFeHRlbnNpb25dOlxuICAgICAgICAnaHR0cHM6Ly9taWNyb3NvZnRlZGdlLm1pY3Jvc29mdC5jb20vYWRkb25zL2RldGFpbC9qYmtmb2Vkb2xsbGVrZ2JoY2Jjb2FoZWZuYmFuaGhsaCcsXG4gICAgW0RldmljZVR5cGUuVml2YWxkaUV4dGVuc2lvbl06XG4gICAgICAgICdodHRwczovL2Nocm9tZS5nb29nbGUuY29tL3dlYnN0b3JlL2RldGFpbC9iaXR3YXJkZW4tZnJlZS1wYXNzd29yZC1tL25uZ2NlY2tiYXBlYmZpbW5sbmlpaWFoa2FuZGNsYmxiL3Jldmlld3MnLFxuICAgIFtEZXZpY2VUeXBlLlNhZmFyaUV4dGVuc2lvbl06XG4gICAgICAgICdodHRwczovL2FwcHMuYXBwbGUuY29tL2FwcC9iaXR3YXJkZW4vaWQxMzUyNzc4MTQ3Jyxcbn07XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnYXBwLXNldHRpbmdzJyxcbiAgICB0ZW1wbGF0ZVVybDogJ3NldHRpbmdzLmNvbXBvbmVudC5odG1sJyxcbn0pXG5leHBvcnQgY2xhc3MgU2V0dGluZ3NDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICAgIEBWaWV3Q2hpbGQoJ3ZhdWx0VGltZW91dEFjdGlvblNlbGVjdCcsIHsgcmVhZDogRWxlbWVudFJlZiwgc3RhdGljOiB0cnVlIH0pIHZhdWx0VGltZW91dEFjdGlvblNlbGVjdFJlZjogRWxlbWVudFJlZjtcbiAgICB2YXVsdFRpbWVvdXRzOiBhbnlbXTtcbiAgICB2YXVsdFRpbWVvdXRBY3Rpb25zOiBhbnlbXTtcbiAgICB2YXVsdFRpbWVvdXRBY3Rpb246IHN0cmluZztcbiAgICBwaW46IGJvb2xlYW4gPSBudWxsO1xuICAgIHN1cHBvcnRzQmlvbWV0cmljOiBib29sZWFuO1xuICAgIGJpb21ldHJpYzogYm9vbGVhbiA9IGZhbHNlO1xuICAgIGRpc2FibGVBdXRvQmlvbWV0cmljc1Byb21wdCA9IHRydWU7XG4gICAgcHJldmlvdXNWYXVsdFRpbWVvdXQ6IG51bWJlciA9IG51bGw7XG5cbiAgICB2YXVsdFRpbWVvdXQ6IEZvcm1Db250cm9sID0gbmV3IEZvcm1Db250cm9sKG51bGwpO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBwbGF0Zm9ybVV0aWxzU2VydmljZTogUGxhdGZvcm1VdGlsc1NlcnZpY2UsIHByaXZhdGUgaTE4blNlcnZpY2U6IEkxOG5TZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHZhdWx0VGltZW91dFNlcnZpY2U6IFZhdWx0VGltZW91dFNlcnZpY2UsIHByaXZhdGUgc3RvcmFnZVNlcnZpY2U6IFN0b3JhZ2VTZXJ2aWNlLFxuICAgICAgICBwdWJsaWMgbWVzc2FnaW5nU2VydmljZTogTWVzc2FnaW5nU2VydmljZSwgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcbiAgICAgICAgcHJpdmF0ZSBlbnZpcm9ubWVudFNlcnZpY2U6IEVudmlyb25tZW50U2VydmljZSwgcHJpdmF0ZSBjcnlwdG9TZXJ2aWNlOiBDcnlwdG9TZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHVzZXJTZXJ2aWNlOiBVc2VyU2VydmljZSwgcHJpdmF0ZSBwb3B1cFV0aWxzU2VydmljZTogUG9wdXBVdGlsc1NlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgbW9kYWxTZXJ2aWNlOiBNb2RhbFNlcnZpY2UsIHByaXZhdGUgdG9hc3RlclNlcnZpY2U6IFRvYXN0ZXJTZXJ2aWNlKSB7XG4gICAgfVxuXG4gICAgYXN5bmMgbmdPbkluaXQoKSB7XG4gICAgICAgIGNvbnN0IHNob3dPbkxvY2tlZCA9ICF0aGlzLnBsYXRmb3JtVXRpbHNTZXJ2aWNlLmlzRmlyZWZveCgpICYmICF0aGlzLnBsYXRmb3JtVXRpbHNTZXJ2aWNlLmlzU2FmYXJpKCk7XG5cbiAgICAgICAgdGhpcy52YXVsdFRpbWVvdXRzID0gW1xuICAgICAgICAgICAgeyBuYW1lOiB0aGlzLmkxOG5TZXJ2aWNlLnQoJ2ltbWVkaWF0ZWx5JyksIHZhbHVlOiAwIH0sXG4gICAgICAgICAgICB7IG5hbWU6IHRoaXMuaTE4blNlcnZpY2UudCgnb25lTWludXRlJyksIHZhbHVlOiAxIH0sXG4gICAgICAgICAgICB7IG5hbWU6IHRoaXMuaTE4blNlcnZpY2UudCgnZml2ZU1pbnV0ZXMnKSwgdmFsdWU6IDUgfSxcbiAgICAgICAgICAgIHsgbmFtZTogdGhpcy5pMThuU2VydmljZS50KCdmaWZ0ZWVuTWludXRlcycpLCB2YWx1ZTogMTUgfSxcbiAgICAgICAgICAgIHsgbmFtZTogdGhpcy5pMThuU2VydmljZS50KCd0aGlydHlNaW51dGVzJyksIHZhbHVlOiAzMCB9LFxuICAgICAgICAgICAgeyBuYW1lOiB0aGlzLmkxOG5TZXJ2aWNlLnQoJ29uZUhvdXInKSwgdmFsdWU6IDYwIH0sXG4gICAgICAgICAgICB7IG5hbWU6IHRoaXMuaTE4blNlcnZpY2UudCgnZm91ckhvdXJzJyksIHZhbHVlOiAyNDAgfSxcbiAgICAgICAgICAgIC8vIHsgbmFtZTogaTE4blNlcnZpY2UudCgnb25JZGxlJyksIHZhbHVlOiAtNCB9LFxuICAgICAgICAgICAgLy8geyBuYW1lOiBpMThuU2VydmljZS50KCdvblNsZWVwJyksIHZhbHVlOiAtMyB9LFxuICAgICAgICBdO1xuXG4gICAgICAgIGlmIChzaG93T25Mb2NrZWQpIHtcbiAgICAgICAgICAgIHRoaXMudmF1bHRUaW1lb3V0cy5wdXNoKHsgbmFtZTogdGhpcy5pMThuU2VydmljZS50KCdvbkxvY2tlZCcpLCB2YWx1ZTogLTIgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnZhdWx0VGltZW91dHMucHVzaCh7IG5hbWU6IHRoaXMuaTE4blNlcnZpY2UudCgnb25SZXN0YXJ0JyksIHZhbHVlOiAtMSB9KTtcbiAgICAgICAgdGhpcy52YXVsdFRpbWVvdXRzLnB1c2goeyBuYW1lOiB0aGlzLmkxOG5TZXJ2aWNlLnQoJ25ldmVyJyksIHZhbHVlOiBudWxsIH0pO1xuXG4gICAgICAgIHRoaXMudmF1bHRUaW1lb3V0QWN0aW9ucyA9IFtcbiAgICAgICAgICAgIHsgbmFtZTogdGhpcy5pMThuU2VydmljZS50KCdsb2NrJyksIHZhbHVlOiAnbG9jaycgfSxcbiAgICAgICAgICAgIHsgbmFtZTogdGhpcy5pMThuU2VydmljZS50KCdsb2dPdXQnKSwgdmFsdWU6ICdsb2dPdXQnIH0sXG4gICAgICAgIF07XG5cbiAgICAgICAgbGV0IHRpbWVvdXQgPSBhd2FpdCB0aGlzLnZhdWx0VGltZW91dFNlcnZpY2UuZ2V0VmF1bHRUaW1lb3V0KCk7XG4gICAgICAgIGlmICh0aW1lb3V0ICE9IG51bGwpIHtcbiAgICAgICAgICAgIGlmICh0aW1lb3V0ID09PSAtMiAmJiAhc2hvd09uTG9ja2VkKSB7XG4gICAgICAgICAgICAgICAgdGltZW91dCA9IC0xO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy52YXVsdFRpbWVvdXQuc2V0VmFsdWUodGltZW91dCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wcmV2aW91c1ZhdWx0VGltZW91dCA9IHRoaXMudmF1bHRUaW1lb3V0LnZhbHVlO1xuICAgICAgICB0aGlzLnZhdWx0VGltZW91dC52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKHZhbHVlID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2F2ZVZhdWx0VGltZW91dCh2YWx1ZSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGFjdGlvbiA9IGF3YWl0IHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0PHN0cmluZz4oQ29uc3RhbnRzU2VydmljZS52YXVsdFRpbWVvdXRBY3Rpb25LZXkpO1xuICAgICAgICB0aGlzLnZhdWx0VGltZW91dEFjdGlvbiA9IGFjdGlvbiA9PSBudWxsID8gJ2xvY2snIDogYWN0aW9uO1xuXG4gICAgICAgIGNvbnN0IHBpblNldCA9IGF3YWl0IHRoaXMudmF1bHRUaW1lb3V0U2VydmljZS5pc1BpbkxvY2tTZXQoKTtcbiAgICAgICAgdGhpcy5waW4gPSBwaW5TZXRbMF0gfHwgcGluU2V0WzFdO1xuXG4gICAgICAgIHRoaXMuc3VwcG9ydHNCaW9tZXRyaWMgPSBhd2FpdCB0aGlzLnBsYXRmb3JtVXRpbHNTZXJ2aWNlLnN1cHBvcnRzQmlvbWV0cmljKCk7XG4gICAgICAgIHRoaXMuYmlvbWV0cmljID0gYXdhaXQgdGhpcy52YXVsdFRpbWVvdXRTZXJ2aWNlLmlzQmlvbWV0cmljTG9ja1NldCgpO1xuICAgICAgICB0aGlzLmRpc2FibGVBdXRvQmlvbWV0cmljc1Byb21wdCA9IGF3YWl0IHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0PGJvb2xlYW4+KFxuICAgICAgICAgICAgQ29uc3RhbnRzU2VydmljZS5kaXNhYmxlQXV0b0Jpb21ldHJpY3NQcm9tcHRLZXkpID8/IHRydWU7XG4gICAgfVxuXG4gICAgYXN5bmMgc2F2ZVZhdWx0VGltZW91dChuZXdWYWx1ZTogbnVtYmVyKSB7XG4gICAgICAgIGlmIChuZXdWYWx1ZSA9PSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBjb25maXJtZWQgPSBhd2FpdCB0aGlzLnBsYXRmb3JtVXRpbHNTZXJ2aWNlLnNob3dEaWFsb2coXG4gICAgICAgICAgICAgICAgdGhpcy5pMThuU2VydmljZS50KCduZXZlckxvY2tXYXJuaW5nJyksIG51bGwsXG4gICAgICAgICAgICAgICAgdGhpcy5pMThuU2VydmljZS50KCd5ZXMnKSwgdGhpcy5pMThuU2VydmljZS50KCdjYW5jZWwnKSwgJ3dhcm5pbmcnKTtcbiAgICAgICAgICAgIGlmICghY29uZmlybWVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy52YXVsdFRpbWVvdXQuc2V0VmFsdWUodGhpcy5wcmV2aW91c1ZhdWx0VGltZW91dCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLnZhdWx0VGltZW91dC52YWxpZCkge1xuICAgICAgICAgICAgdGhpcy50b2FzdGVyU2VydmljZS5wb3BBc3luYygnZXJyb3InLCBudWxsLCB0aGlzLmkxOG5TZXJ2aWNlLnQoJ3ZhdWx0VGltZW91dFRvTGFyZ2UnKSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnByZXZpb3VzVmF1bHRUaW1lb3V0ID0gdGhpcy52YXVsdFRpbWVvdXQudmFsdWU7XG5cbiAgICAgICAgYXdhaXQgdGhpcy52YXVsdFRpbWVvdXRTZXJ2aWNlLnNldFZhdWx0VGltZW91dE9wdGlvbnModGhpcy52YXVsdFRpbWVvdXQudmFsdWUsIHRoaXMudmF1bHRUaW1lb3V0QWN0aW9uKTtcbiAgICAgICAgaWYgKHRoaXMucHJldmlvdXNWYXVsdFRpbWVvdXQgPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdpbmdTZXJ2aWNlLnNlbmQoJ2JnUmVzZWVkU3RvcmFnZScpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgc2F2ZVZhdWx0VGltZW91dEFjdGlvbihuZXdWYWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIGlmIChuZXdWYWx1ZSA9PT0gJ2xvZ091dCcpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbmZpcm1lZCA9IGF3YWl0IHRoaXMucGxhdGZvcm1VdGlsc1NlcnZpY2Uuc2hvd0RpYWxvZyhcbiAgICAgICAgICAgICAgICB0aGlzLmkxOG5TZXJ2aWNlLnQoJ3ZhdWx0VGltZW91dExvZ091dENvbmZpcm1hdGlvbicpLFxuICAgICAgICAgICAgICAgIHRoaXMuaTE4blNlcnZpY2UudCgndmF1bHRUaW1lb3V0TG9nT3V0Q29uZmlybWF0aW9uVGl0bGUnKSxcbiAgICAgICAgICAgICAgICB0aGlzLmkxOG5TZXJ2aWNlLnQoJ3llcycpLCB0aGlzLmkxOG5TZXJ2aWNlLnQoJ2NhbmNlbCcpLCAnd2FybmluZycpO1xuICAgICAgICAgICAgaWYgKCFjb25maXJtZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnZhdWx0VGltZW91dEFjdGlvbnMuZm9yRWFjaCgob3B0aW9uOiBhbnksIGkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbi52YWx1ZSA9PT0gdGhpcy52YXVsdFRpbWVvdXRBY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudmF1bHRUaW1lb3V0QWN0aW9uU2VsZWN0UmVmLm5hdGl2ZUVsZW1lbnQudmFsdWUgPSBpICsgJzogJyArIHRoaXMudmF1bHRUaW1lb3V0QWN0aW9uO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLnZhdWx0VGltZW91dC52YWxpZCkge1xuICAgICAgICAgICAgdGhpcy50b2FzdGVyU2VydmljZS5wb3BBc3luYygnZXJyb3InLCBudWxsLCB0aGlzLmkxOG5TZXJ2aWNlLnQoJ3ZhdWx0VGltZW91dFRvTGFyZ2UnKSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnZhdWx0VGltZW91dEFjdGlvbiA9IG5ld1ZhbHVlO1xuICAgICAgICBhd2FpdCB0aGlzLnZhdWx0VGltZW91dFNlcnZpY2Uuc2V0VmF1bHRUaW1lb3V0T3B0aW9ucyh0aGlzLnZhdWx0VGltZW91dC52YWx1ZSwgdGhpcy52YXVsdFRpbWVvdXRBY3Rpb24pO1xuICAgIH1cblxuICAgIGFzeW5jIHVwZGF0ZVBpbigpIHtcbiAgICAgICAgaWYgKHRoaXMucGluKSB7XG4gICAgICAgICAgICBjb25zdCByZWYgPSB0aGlzLm1vZGFsU2VydmljZS5vcGVuKFNldFBpbkNvbXBvbmVudCwgeyBhbGxvd011bHRpcGxlTW9kYWxzOiB0cnVlIH0pO1xuXG4gICAgICAgICAgICBpZiAocmVmID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBpbiA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5waW4gPSBhd2FpdCByZWYub25DbG9zZWRQcm9taXNlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNyeXB0b1NlcnZpY2UuY2xlYXJQaW5Qcm90ZWN0ZWRLZXkoKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMudmF1bHRUaW1lb3V0U2VydmljZS5jbGVhcigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgdXBkYXRlQmlvbWV0cmljKCkge1xuICAgICAgICBpZiAodGhpcy5iaW9tZXRyaWMgJiYgdGhpcy5zdXBwb3J0c0Jpb21ldHJpYykge1xuXG4gICAgICAgICAgICBsZXQgZ3JhbnRlZDtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgZ3JhbnRlZCA9IGF3YWl0IEJyb3dzZXJBcGkucmVxdWVzdFBlcm1pc3Npb24oeyBwZXJtaXNzaW9uczogWyduYXRpdmVNZXNzYWdpbmcnXSB9KTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucGxhdGZvcm1VdGlsc1NlcnZpY2UuaXNGaXJlZm94KCkgJiYgdGhpcy5wb3B1cFV0aWxzU2VydmljZS5pblNpZGViYXIod2luZG93KSkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnBsYXRmb3JtVXRpbHNTZXJ2aWNlLnNob3dEaWFsb2coXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmkxOG5TZXJ2aWNlLnQoJ25hdGl2ZU1lc3NhZ2luUGVybWlzc2lvblNpZGViYXJEZXNjJyksIHRoaXMuaTE4blNlcnZpY2UudCgnbmF0aXZlTWVzc2FnaW5QZXJtaXNzaW9uU2lkZWJhclRpdGxlJyksXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmkxOG5TZXJ2aWNlLnQoJ29rJyksIG51bGwpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJpb21ldHJpYyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIWdyYW50ZWQpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnBsYXRmb3JtVXRpbHNTZXJ2aWNlLnNob3dEaWFsb2coXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaTE4blNlcnZpY2UudCgnbmF0aXZlTWVzc2FnaW5QZXJtaXNzaW9uRXJyb3JEZXNjJyksIHRoaXMuaTE4blNlcnZpY2UudCgnbmF0aXZlTWVzc2FnaW5QZXJtaXNzaW9uRXJyb3JUaXRsZScpLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmkxOG5TZXJ2aWNlLnQoJ29rJyksIG51bGwpO1xuICAgICAgICAgICAgICAgIHRoaXMuYmlvbWV0cmljID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBzdWJtaXR0ZWQgPSBTd2FsLmZpcmUoe1xuICAgICAgICAgICAgICAgIGhlaWdodEF1dG86IGZhbHNlLFxuICAgICAgICAgICAgICAgIGJ1dHRvbnNTdHlsaW5nOiBmYWxzZSxcbiAgICAgICAgICAgICAgICB0aXRsZVRleHQ6IHRoaXMuaTE4blNlcnZpY2UudCgnYXdhaXREZXNrdG9wJyksXG4gICAgICAgICAgICAgICAgdGV4dDogdGhpcy5pMThuU2VydmljZS50KCdhd2FpdERlc2t0b3BEZXNjJyksXG4gICAgICAgICAgICAgICAgaWNvbjogJ2luZm8nLFxuICAgICAgICAgICAgICAgIGljb25IdG1sOiAnPGkgY2xhc3M9XCJzd2FsLWN1c3RvbS1pY29uIGZhIGZhLWluZm8tY2lyY2xlIHRleHQtaW5mb1wiPjwvaT4nLFxuICAgICAgICAgICAgICAgIHNob3dDYW5jZWxCdXR0b246IHRydWUsXG4gICAgICAgICAgICAgICAgY2FuY2VsQnV0dG9uVGV4dDogdGhpcy5pMThuU2VydmljZS50KCdjYW5jZWwnKSxcbiAgICAgICAgICAgICAgICBzaG93Q29uZmlybUJ1dHRvbjogZmFsc2UsXG4gICAgICAgICAgICAgICAgYWxsb3dPdXRzaWRlQ2xpY2s6IGZhbHNlLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2F2ZShDb25zdGFudHNTZXJ2aWNlLmJpb21ldHJpY0F3YWl0aW5nQWNjZXB0YW5jZSwgdHJ1ZSk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNyeXB0b1NlcnZpY2UudG9nZ2xlS2V5KCk7XG5cbiAgICAgICAgICAgIGF3YWl0IFByb21pc2UucmFjZShbXG4gICAgICAgICAgICAgICAgc3VibWl0dGVkLnRoZW4ocmVzdWx0ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5kaXNtaXNzID09PSBTd2FsLkRpc21pc3NSZWFzb24uY2FuY2VsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJpb21ldHJpYyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdG9yYWdlU2VydmljZS5yZW1vdmUoQ29uc3RhbnRzU2VydmljZS5iaW9tZXRyaWNBd2FpdGluZ0FjY2VwdGFuY2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgdGhpcy5wbGF0Zm9ybVV0aWxzU2VydmljZS5hdXRoZW50aWNhdGVCaW9tZXRyaWMoKS50aGVuKHJlc3VsdCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYmlvbWV0cmljID0gcmVzdWx0O1xuXG4gICAgICAgICAgICAgICAgICAgIFN3YWwuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuYmlvbWV0cmljID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbGF0Zm9ybVV0aWxzU2VydmljZS5zaG93VG9hc3QoJ2Vycm9yJywgdGhpcy5pMThuU2VydmljZS50KCdlcnJvckVuYWJsZUJpb21ldHJpY1RpdGxlJyksIHRoaXMuaTE4blNlcnZpY2UudCgnZXJyb3JFbmFibGVCaW9tZXRyaWNEZXNjJykpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSkuY2F0Y2goZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEhhbmRsZSBjb25uZWN0aW9uIGVycm9yc1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJpb21ldHJpYyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnJlbW92ZShDb25zdGFudHNTZXJ2aWNlLmJpb21ldHJpY1VubG9ja0tleSk7XG4gICAgICAgICAgICB0aGlzLnZhdWx0VGltZW91dFNlcnZpY2UuYmlvbWV0cmljTG9ja2VkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyB1cGRhdGVBdXRvQmlvbWV0cmljc1Byb21wdCgpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5zdG9yYWdlU2VydmljZS5zYXZlKENvbnN0YW50c1NlcnZpY2UuZGlzYWJsZUF1dG9CaW9tZXRyaWNzUHJvbXB0S2V5LCB0aGlzLmRpc2FibGVBdXRvQmlvbWV0cmljc1Byb21wdCk7XG4gICAgfVxuXG4gICAgYXN5bmMgbG9jaygpIHtcbiAgICAgICAgYXdhaXQgdGhpcy52YXVsdFRpbWVvdXRTZXJ2aWNlLmxvY2sodHJ1ZSk7XG4gICAgfVxuXG4gICAgYXN5bmMgbG9nT3V0KCkge1xuICAgICAgICBjb25zdCBjb25maXJtZWQgPSBhd2FpdCB0aGlzLnBsYXRmb3JtVXRpbHNTZXJ2aWNlLnNob3dEaWFsb2coXG4gICAgICAgICAgICB0aGlzLmkxOG5TZXJ2aWNlLnQoJ2xvZ091dENvbmZpcm1hdGlvbicpLCB0aGlzLmkxOG5TZXJ2aWNlLnQoJ2xvZ091dCcpLFxuICAgICAgICAgICAgdGhpcy5pMThuU2VydmljZS50KCd5ZXMnKSwgdGhpcy5pMThuU2VydmljZS50KCdjYW5jZWwnKSk7XG4gICAgICAgIGlmIChjb25maXJtZWQpIHtcbiAgICAgICAgICAgIHRoaXMubWVzc2FnaW5nU2VydmljZS5zZW5kKCdsb2dvdXQnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIGNoYW5nZVBhc3N3b3JkKCkge1xuICAgICAgICBjb25zdCBjb25maXJtZWQgPSBhd2FpdCB0aGlzLnBsYXRmb3JtVXRpbHNTZXJ2aWNlLnNob3dEaWFsb2coXG4gICAgICAgICAgICB0aGlzLmkxOG5TZXJ2aWNlLnQoJ2NoYW5nZU1hc3RlclBhc3N3b3JkQ29uZmlybWF0aW9uJyksIHRoaXMuaTE4blNlcnZpY2UudCgnY2hhbmdlTWFzdGVyUGFzc3dvcmQnKSxcbiAgICAgICAgICAgIHRoaXMuaTE4blNlcnZpY2UudCgneWVzJyksIHRoaXMuaTE4blNlcnZpY2UudCgnY2FuY2VsJykpO1xuICAgICAgICBpZiAoY29uZmlybWVkKSB7XG4gICAgICAgICAgICBCcm93c2VyQXBpLmNyZWF0ZU5ld1RhYignaHR0cHM6Ly9oZWxwLmJpdHdhcmRlbi5jb20vYXJ0aWNsZS9jaGFuZ2UteW91ci1tYXN0ZXItcGFzc3dvcmQvJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyB0d29TdGVwKCkge1xuICAgICAgICBjb25zdCBjb25maXJtZWQgPSBhd2FpdCB0aGlzLnBsYXRmb3JtVXRpbHNTZXJ2aWNlLnNob3dEaWFsb2coXG4gICAgICAgICAgICB0aGlzLmkxOG5TZXJ2aWNlLnQoJ3R3b1N0ZXBMb2dpbkNvbmZpcm1hdGlvbicpLCB0aGlzLmkxOG5TZXJ2aWNlLnQoJ3R3b1N0ZXBMb2dpbicpLFxuICAgICAgICAgICAgdGhpcy5pMThuU2VydmljZS50KCd5ZXMnKSwgdGhpcy5pMThuU2VydmljZS50KCdjYW5jZWwnKSk7XG4gICAgICAgIGlmIChjb25maXJtZWQpIHtcbiAgICAgICAgICAgIEJyb3dzZXJBcGkuY3JlYXRlTmV3VGFiKCdodHRwczovL2hlbHAuYml0d2FyZGVuLmNvbS9hcnRpY2xlL3NldHVwLXR3by1zdGVwLWxvZ2luLycpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgc2hhcmUoKSB7XG4gICAgICAgIGNvbnN0IGNvbmZpcm1lZCA9IGF3YWl0IHRoaXMucGxhdGZvcm1VdGlsc1NlcnZpY2Uuc2hvd0RpYWxvZyhcbiAgICAgICAgICAgIHRoaXMuaTE4blNlcnZpY2UudCgnbGVhcm5PcmdDb25maXJtYXRpb24nKSwgdGhpcy5pMThuU2VydmljZS50KCdsZWFybk9yZycpLFxuICAgICAgICAgICAgdGhpcy5pMThuU2VydmljZS50KCd5ZXMnKSwgdGhpcy5pMThuU2VydmljZS50KCdjYW5jZWwnKSk7XG4gICAgICAgIGlmIChjb25maXJtZWQpIHtcbiAgICAgICAgICAgIEJyb3dzZXJBcGkuY3JlYXRlTmV3VGFiKCdodHRwczovL2hlbHAuYml0d2FyZGVuLmNvbS9hcnRpY2xlL3doYXQtaXMtYW4tb3JnYW5pemF0aW9uLycpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgd2ViVmF1bHQoKSB7XG4gICAgICAgIGNvbnN0IHVybCA9IHRoaXMuZW52aXJvbm1lbnRTZXJ2aWNlLmdldFdlYlZhdWx0VXJsKCk7XG4gICAgICAgIEJyb3dzZXJBcGkuY3JlYXRlTmV3VGFiKHVybCk7XG4gICAgfVxuXG4gICAgaW1wb3J0KCkge1xuICAgICAgICBCcm93c2VyQXBpLmNyZWF0ZU5ld1RhYignaHR0cHM6Ly9oZWxwLmJpdHdhcmRlbi5jb20vYXJ0aWNsZS9pbXBvcnQtZGF0YS8nKTtcbiAgICB9XG5cbiAgICBleHBvcnQoKSB7XG4gICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL2V4cG9ydCddKTtcbiAgICB9XG5cbiAgICBoZWxwKCkge1xuICAgICAgICBCcm93c2VyQXBpLmNyZWF0ZU5ld1RhYignaHR0cHM6Ly9oZWxwLmJpdHdhcmRlbi5jb20vJyk7XG4gICAgfVxuXG4gICAgYWJvdXQoKSB7XG4gICAgICAgIGNvbnN0IHllYXIgPSAobmV3IERhdGUoKSkuZ2V0RnVsbFllYXIoKTtcbiAgICAgICAgY29uc3QgdmVyc2lvblRleHQgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShcbiAgICAgICAgICAgIHRoaXMuaTE4blNlcnZpY2UudCgndmVyc2lvbicpICsgJzogJyArIEJyb3dzZXJBcGkuZ2V0QXBwbGljYXRpb25WZXJzaW9uKCkpO1xuICAgICAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgZGl2LmlubmVySFRNTCA9IGA8cCBjbGFzcz1cInRleHQtY2VudGVyXCI+PGkgY2xhc3M9XCJmYSBmYS1zaGllbGQgZmEtM3hcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+PC9wPlxuICAgICAgICAgICAgPHAgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPjxiPkJpdHdhcmRlbjwvYj48YnI+JmNvcHk7IEJpdHdhcmRlbiBJbmMuIDIwMTUtYCArIHllYXIgKyBgPC9wPmA7XG4gICAgICAgIGRpdi5hcHBlbmRDaGlsZCh2ZXJzaW9uVGV4dCk7XG5cbiAgICAgICAgU3dhbC5maXJlKHtcbiAgICAgICAgICAgIGhlaWdodEF1dG86IGZhbHNlLFxuICAgICAgICAgICAgYnV0dG9uc1N0eWxpbmc6IGZhbHNlLFxuICAgICAgICAgICAgaHRtbDogZGl2LFxuICAgICAgICAgICAgc2hvd0NvbmZpcm1CdXR0b246IGZhbHNlLFxuICAgICAgICAgICAgc2hvd0NhbmNlbEJ1dHRvbjogdHJ1ZSxcbiAgICAgICAgICAgIGNhbmNlbEJ1dHRvblRleHQ6IHRoaXMuaTE4blNlcnZpY2UudCgnY2xvc2UnKSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgYXN5bmMgZmluZ2VycHJpbnQoKSB7XG4gICAgICAgIGNvbnN0IGZpbmdlcnByaW50ID0gYXdhaXQgdGhpcy5jcnlwdG9TZXJ2aWNlLmdldEZpbmdlcnByaW50KGF3YWl0IHRoaXMudXNlclNlcnZpY2UuZ2V0VXNlcklkKCkpO1xuICAgICAgICBjb25zdCBwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgncCcpO1xuICAgICAgICBwLmlubmVyVGV4dCA9IHRoaXMuaTE4blNlcnZpY2UudCgneW91ckFjY291bnRzRmluZ2VycHJpbnQnKSArICc6JztcbiAgICAgICAgY29uc3QgcDIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdwJyk7XG4gICAgICAgIHAyLmlubmVyVGV4dCA9IGZpbmdlcnByaW50LmpvaW4oJy0nKTtcbiAgICAgICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIGRpdi5hcHBlbmRDaGlsZChwKTtcbiAgICAgICAgZGl2LmFwcGVuZENoaWxkKHAyKTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBTd2FsLmZpcmUoe1xuICAgICAgICAgICAgaGVpZ2h0QXV0bzogZmFsc2UsXG4gICAgICAgICAgICBidXR0b25zU3R5bGluZzogZmFsc2UsXG4gICAgICAgICAgICBodG1sOiBkaXYsXG4gICAgICAgICAgICBzaG93Q2FuY2VsQnV0dG9uOiB0cnVlLFxuICAgICAgICAgICAgY2FuY2VsQnV0dG9uVGV4dDogdGhpcy5pMThuU2VydmljZS50KCdjbG9zZScpLFxuICAgICAgICAgICAgc2hvd0NvbmZpcm1CdXR0b246IHRydWUsXG4gICAgICAgICAgICBjb25maXJtQnV0dG9uVGV4dDogdGhpcy5pMThuU2VydmljZS50KCdsZWFybk1vcmUnKSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHJlc3VsdC52YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5wbGF0Zm9ybVV0aWxzU2VydmljZS5sYXVuY2hVcmkoJ2h0dHBzOi8vaGVscC5iaXR3YXJkZW4uY29tL2FydGljbGUvZmluZ2VycHJpbnQtcGhyYXNlLycpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmF0ZSgpIHtcbiAgICAgICAgY29uc3QgZGV2aWNlVHlwZSA9IHRoaXMucGxhdGZvcm1VdGlsc1NlcnZpY2UuZ2V0RGV2aWNlKCk7XG4gICAgICAgIEJyb3dzZXJBcGkuY3JlYXRlTmV3VGFiKChSYXRlVXJscyBhcyBhbnkpW2RldmljZVR5cGVdKTtcbiAgICB9XG59XG4iLCI8aGVhZGVyPlxuICAgIDxkaXYgY2xhc3M9XCJsZWZ0XCI+XG4gICAgICAgIDxhcHAtcG9wLW91dD48L2FwcC1wb3Atb3V0PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJjZW50ZXJcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ0aXRsZVwiPnt7J3NldHRpbmdzJyB8IGkxOG59fTwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwicmlnaHRcIj48L2Rpdj5cbjwvaGVhZGVyPlxuPGNvbnRlbnQ+XG4gICAgPGRpdiBjbGFzcz1cImJveCBsaXN0XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJib3gtaGVhZGVyXCI+e3snbWFuYWdlJyB8IGkxOG59fTwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWNvbnRlbnQgc2luZ2xlLWxpbmVcIj5cbiAgICAgICAgICAgIDxhIGNsYXNzPVwiYm94LWNvbnRlbnQtcm93IGJveC1jb250ZW50LXJvdy1mbGV4IHRleHQtZGVmYXVsdFwiIHJvdXRlckxpbms9XCIvZm9sZGVyc1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3ctbWFpblwiPnt7J2ZvbGRlcnMnIHwgaTE4bn19PC9kaXY+XG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1jaGV2cm9uLXJpZ2h0IGZhLWxnIHJvdy1zdWItaWNvblwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgIDxhIGNsYXNzPVwiYm94LWNvbnRlbnQtcm93IGJveC1jb250ZW50LXJvdy1mbGV4IHRleHQtZGVmYXVsdFwiIHJvdXRlckxpbms9XCIvc3luY1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3ctbWFpblwiPnt7J3N5bmMnIHwgaTE4bn19PC9kaXY+XG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1jaGV2cm9uLXJpZ2h0IGZhLWxnIHJvdy1zdWItaWNvblwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgIDxhIGNsYXNzPVwiYm94LWNvbnRlbnQtcm93IGJveC1jb250ZW50LXJvdy1mbGV4IHRleHQtZGVmYXVsdFwiIHJvdXRlckxpbms9XCIvZXhjbHVkZWQtZG9tYWluc1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3ctbWFpblwiPnt7J2V4Y2x1ZGVkRG9tYWlucycgfCBpMThufX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWNoZXZyb24tcmlnaHQgZmEtbGcgcm93LXN1Yi1pY29uXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgPC9hPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiYm94IGxpc3RcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImJveC1oZWFkZXJcIj57eydzZWN1cml0eScgfCBpMThufX08L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50IHNpbmdsZS1saW5lXCI+XG4gICAgICAgICAgICA8YXBwLXZhdWx0LXRpbWVvdXQtaW5wdXQgW3ZhdWx0VGltZW91dHNdPVwidmF1bHRUaW1lb3V0c1wiIFtmb3JtQ29udHJvbF09XCJ2YXVsdFRpbWVvdXRcIiBuZ0RlZmF1bHRDb250cm9sPjwvYXBwLXZhdWx0LXRpbWVvdXQtaW5wdXQ+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWNvbnRlbnQtcm93IGRpc3BsYXktYmxvY2tcIiBhcHBCb3hSb3c+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInZhdWx0VGltZW91dEFjdGlvblwiPnt7J3ZhdWx0VGltZW91dEFjdGlvbicgfCBpMThufX08L2xhYmVsPlxuICAgICAgICAgICAgICAgIDxzZWxlY3QgI3ZhdWx0VGltZW91dEFjdGlvblNlbGVjdCBpZD1cInZhdWx0VGltZW91dEFjdGlvblwiIG5hbWU9XCJWYXVsdFRpbWVvdXRBY3Rpb25zXCJcbiAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwidmF1bHRUaW1lb3V0QWN0aW9uXCIgKG5nTW9kZWxDaGFuZ2UpPVwic2F2ZVZhdWx0VGltZW91dEFjdGlvbigkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IG8gb2YgdmF1bHRUaW1lb3V0QWN0aW9uc1wiIFtuZ1ZhbHVlXT1cIm8udmFsdWVcIj57e28ubmFtZX19PC9vcHRpb24+XG4gICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtY29udGVudC1yb3cgYm94LWNvbnRlbnQtcm93LWNoZWNrYm94XCIgYXBwQm94Um93PlxuICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJwaW5cIj57eyd1bmxvY2tXaXRoUGluJyB8IGkxOG59fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPGlucHV0IGlkPVwicGluXCIgdHlwZT1cImNoZWNrYm94XCIgKGNoYW5nZSk9XCJ1cGRhdGVQaW4oKVwiIFsobmdNb2RlbCldPVwicGluXCI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtY29udGVudC1yb3cgYm94LWNvbnRlbnQtcm93LWNoZWNrYm94XCIgYXBwQm94Um93ICpuZ0lmPVwic3VwcG9ydHNCaW9tZXRyaWNcIj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiYmlvbWV0cmljXCI+e3sndW5sb2NrV2l0aEJpb21ldHJpY3MnIHwgaTE4bn19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9XCJiaW9tZXRyaWNcIiB0eXBlPVwiY2hlY2tib3hcIiAoY2hhbmdlKT1cInVwZGF0ZUJpb21ldHJpYygpXCIgWyhuZ01vZGVsKV09XCJiaW9tZXRyaWNcIj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50LXJvdyBib3gtY29udGVudC1yb3ctY2hlY2tib3hcIiBhcHBCb3hSb3cgKm5nSWY9XCJzdXBwb3J0c0Jpb21ldHJpY1wiPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJhdXRvQmlvbWV0cmljc1Byb21wdFwiPnt7J2Rpc2FibGVBdXRvQmlvbWV0cmljc1Byb21wdCcgfCBpMThufX08L2xhYmVsPlxuICAgICAgICAgICAgICAgIDxpbnB1dCBpZD1cImF1dG9CaW9tZXRyaWNzUHJvbXB0XCIgdHlwZT1cImNoZWNrYm94XCIgKGNoYW5nZSk9XCJ1cGRhdGVBdXRvQmlvbWV0cmljc1Byb21wdCgpXCIgW2Rpc2FibGVkXT1cIiFiaW9tZXRyaWNcIiBbKG5nTW9kZWwpXT1cImRpc2FibGVBdXRvQmlvbWV0cmljc1Byb21wdFwiPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJveC1jb250ZW50LXJvdyBib3gtY29udGVudC1yb3ctZmxleCB0ZXh0LWRlZmF1bHRcIiBhcHBTdG9wQ2xpY2sgYXBwQmx1ckNsaWNrXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImxvY2soKVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3ctbWFpblwiPnt7J2xvY2tOb3cnIHwgaTE4bn19PC9kaXY+XG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1jaGV2cm9uLXJpZ2h0IGZhLWxnIHJvdy1zdWItaWNvblwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJib3gtY29udGVudC1yb3cgYm94LWNvbnRlbnQtcm93LWZsZXggdGV4dC1kZWZhdWx0XCIgYXBwU3RvcENsaWNrIGFwcEJsdXJDbGlja1xuICAgICAgICAgICAgICAgIChjbGljayk9XCJ0d29TdGVwKClcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93LW1haW5cIj57eyd0d29TdGVwTG9naW4nIHwgaTE4bn19PC9kaXY+XG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1jaGV2cm9uLXJpZ2h0IGZhLWxnIHJvdy1zdWItaWNvblwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJib3ggbGlzdFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWhlYWRlclwiPnt7J2FjY291bnQnIHwgaTE4bn19PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJib3gtY29udGVudCBzaW5nbGUtbGluZVwiPlxuICAgICAgICAgICAgPGEgY2xhc3M9XCJib3gtY29udGVudC1yb3dcIiByb3V0ZXJMaW5rPVwiL3ByZW1pdW1cIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93LW1haW5cIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImljb24gdGV4dC1wcmltYXJ5XCI+PGkgY2xhc3M9XCJmYSBmYS1mdyBmYS1sZyBmYS1zdGFyXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQgdGV4dC1wcmltYXJ5XCI+PGI+e3sncHJlbWl1bU1lbWJlcnNoaXAnIHwgaTE4bn19PC9iPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8c3Bhbj48aSBjbGFzcz1cImZhIGZhLWNoZXZyb24tcmlnaHQgZmEtbGcgcm93LXN1Yi1pY29uXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPjwvc3Bhbj5cbiAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYm94LWNvbnRlbnQtcm93IGJveC1jb250ZW50LXJvdy1mbGV4IHRleHQtZGVmYXVsdFwiIGFwcFN0b3BDbGljayBhcHBCbHVyQ2xpY2tcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2hhbmdlUGFzc3dvcmQoKVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3ctbWFpblwiPnt7J2NoYW5nZU1hc3RlclBhc3N3b3JkJyB8IGkxOG59fTwvZGl2PlxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtY2hldnJvbi1yaWdodCBmYS1sZyByb3ctc3ViLWljb25cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYm94LWNvbnRlbnQtcm93IGJveC1jb250ZW50LXJvdy1mbGV4IHRleHQtZGVmYXVsdFwiIGFwcFN0b3BDbGljayBhcHBCbHVyQ2xpY2tcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiZmluZ2VycHJpbnQoKVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3ctbWFpblwiPnt7J2ZpbmdlcnByaW50UGhyYXNlJyB8IGkxOG59fTwvZGl2PlxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtY2hldnJvbi1yaWdodCBmYS1sZyByb3ctc3ViLWljb25cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYm94LWNvbnRlbnQtcm93IGJveC1jb250ZW50LXJvdy1mbGV4IHRleHQtZGVmYXVsdFwiIGFwcFN0b3BDbGljayBhcHBCbHVyQ2xpY2tcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwibG9nT3V0KClcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93LW1haW5cIj57eydsb2dPdXQnIHwgaTE4bn19PC9kaXY+XG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1jaGV2cm9uLXJpZ2h0IGZhLWxnIHJvdy1zdWItaWNvblwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiYm94IGxpc3RcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImJveC1oZWFkZXJcIj57eyd0b29scycgfCBpMThufX08L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50IHNpbmdsZS1saW5lXCI+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJveC1jb250ZW50LXJvdyBib3gtY29udGVudC1yb3ctZmxleCB0ZXh0LWRlZmF1bHRcIiBhcHBTdG9wQ2xpY2sgYXBwQmx1ckNsaWNrXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImltcG9ydCgpXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdy1tYWluXCI+e3snaW1wb3J0SXRlbXMnIHwgaTE4bn19PC9kaXY+XG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1jaGV2cm9uLXJpZ2h0IGZhLWxnIHJvdy1zdWItaWNvblwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJib3gtY29udGVudC1yb3cgYm94LWNvbnRlbnQtcm93LWZsZXggdGV4dC1kZWZhdWx0XCIgYXBwU3RvcENsaWNrIGFwcEJsdXJDbGlja1xuICAgICAgICAgICAgICAgIChjbGljayk9XCJleHBvcnQoKVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3ctbWFpblwiPnt7J2V4cG9ydFZhdWx0JyB8IGkxOG59fTwvZGl2PlxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtY2hldnJvbi1yaWdodCBmYS1sZyByb3ctc3ViLWljb25cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYm94LWNvbnRlbnQtcm93IGJveC1jb250ZW50LXJvdy1mbGV4IHRleHQtZGVmYXVsdFwiIGFwcFN0b3BDbGljayBhcHBCbHVyQ2xpY2tcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwid2ViVmF1bHQoKVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3ctbWFpblwiPnt7J2JpdFdlYlZhdWx0JyB8IGkxOG59fTwvZGl2PlxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtY2hldnJvbi1yaWdodCBmYS1sZyByb3ctc3ViLWljb25cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImJveCBsaXN0XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJib3gtaGVhZGVyXCI+e3snb3RoZXInIHwgaTE4bn19PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJib3gtY29udGVudCBzaW5nbGUtbGluZVwiPlxuICAgICAgICAgICAgPGEgY2xhc3M9XCJib3gtY29udGVudC1yb3cgYm94LWNvbnRlbnQtcm93LWZsZXggdGV4dC1kZWZhdWx0XCIgcm91dGVyTGluaz1cIi9vcHRpb25zXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdy1tYWluXCI+e3snb3B0aW9ucycgfCBpMThufX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWNoZXZyb24tcmlnaHQgZmEtbGcgcm93LXN1Yi1pY29uXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJib3gtY29udGVudC1yb3cgYm94LWNvbnRlbnQtcm93LWZsZXggdGV4dC1kZWZhdWx0XCIgYXBwU3RvcENsaWNrIGFwcEJsdXJDbGlja1xuICAgICAgICAgICAgICAgIChjbGljayk9XCJhYm91dCgpXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdy1tYWluXCI+e3snYWJvdXQnIHwgaTE4bn19PC9kaXY+XG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1jaGV2cm9uLXJpZ2h0IGZhLWxnIHJvdy1zdWItaWNvblwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJib3gtY29udGVudC1yb3cgYm94LWNvbnRlbnQtcm93LWZsZXggdGV4dC1kZWZhdWx0XCIgYXBwU3RvcENsaWNrIGFwcEJsdXJDbGlja1xuICAgICAgICAgICAgICAgIChjbGljayk9XCJzaGFyZSgpXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdy1tYWluXCI+e3snbGVhcm5PcmcnIHwgaTE4bn19PC9kaXY+XG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1jaGV2cm9uLXJpZ2h0IGZhLWxnIHJvdy1zdWItaWNvblwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJib3gtY29udGVudC1yb3cgYm94LWNvbnRlbnQtcm93LWZsZXggdGV4dC1kZWZhdWx0XCIgYXBwU3RvcENsaWNrIGFwcEJsdXJDbGlja1xuICAgICAgICAgICAgICAgIChjbGljayk9XCJoZWxwKClcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93LW1haW5cIj57eydoZWxwRmVlZGJhY2snIHwgaTE4bn19PC9kaXY+XG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1jaGV2cm9uLXJpZ2h0IGZhLWxnIHJvdy1zdWItaWNvblwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJib3gtY29udGVudC1yb3cgYm94LWNvbnRlbnQtcm93LWZsZXggdGV4dC1kZWZhdWx0XCIgYXBwU3RvcENsaWNrIGFwcEJsdXJDbGlja1xuICAgICAgICAgICAgICAgIChjbGljayk9XCJyYXRlKClcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93LW1haW5cIj57eydyYXRlRXh0ZW5zaW9uJyB8IGkxOG59fTwvZGl2PlxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtY2hldnJvbi1yaWdodCBmYS1sZyByb3ctc3ViLWljb25cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJib3gtZm9vdGVyXCI+e3sncmF0ZUV4dGVuc2lvbkRlc2MnIHwgaTE4bn19PC9kaXY+XG4gICAgPC9kaXY+XG48L2NvbnRlbnQ+XG4iLCJpbXBvcnQgeyBUb2FzdGVyU2VydmljZSB9IGZyb20gJ2FuZ3VsYXIyLXRvYXN0ZXInO1xuXG5pbXBvcnQge1xuICAgIENvbXBvbmVudCxcbiAgICBPbkluaXQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBJMThuU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvaTE4bi5zZXJ2aWNlJztcbmltcG9ydCB7IFN5bmNTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9zeW5jLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2FwcC1zeW5jJyxcbiAgICB0ZW1wbGF0ZVVybDogJ3N5bmMuY29tcG9uZW50Lmh0bWwnLFxufSlcbmV4cG9ydCBjbGFzcyBTeW5jQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgICBsYXN0U3luYyA9ICctLSc7XG4gICAgc3luY1Byb21pc2U6IFByb21pc2U8YW55PjtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgc3luY1NlcnZpY2U6IFN5bmNTZXJ2aWNlLCBwcml2YXRlIHRvYXN0ZXJTZXJ2aWNlOiBUb2FzdGVyU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBpMThuU2VydmljZTogSTE4blNlcnZpY2UpIHtcbiAgICB9XG5cbiAgICBhc3luYyBuZ09uSW5pdCgpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5zZXRMYXN0U3luYygpO1xuICAgIH1cblxuICAgIGFzeW5jIHN5bmMoKSB7XG4gICAgICAgIHRoaXMuc3luY1Byb21pc2UgPSB0aGlzLnN5bmNTZXJ2aWNlLmZ1bGxTeW5jKHRydWUpO1xuICAgICAgICBjb25zdCBzdWNjZXNzID0gYXdhaXQgdGhpcy5zeW5jUHJvbWlzZTtcbiAgICAgICAgaWYgKHN1Y2Nlc3MpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0TGFzdFN5bmMoKTtcbiAgICAgICAgICAgIHRoaXMudG9hc3RlclNlcnZpY2UucG9wQXN5bmMoJ3N1Y2Nlc3MnLCBudWxsLCB0aGlzLmkxOG5TZXJ2aWNlLnQoJ3N5bmNpbmdDb21wbGV0ZScpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudG9hc3RlclNlcnZpY2UucG9wQXN5bmMoJ2Vycm9yJywgbnVsbCwgdGhpcy5pMThuU2VydmljZS50KCdzeW5jaW5nRmFpbGVkJykpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgc2V0TGFzdFN5bmMoKSB7XG4gICAgICAgIGNvbnN0IGxhc3QgPSBhd2FpdCB0aGlzLnN5bmNTZXJ2aWNlLmdldExhc3RTeW5jKCk7XG4gICAgICAgIGlmIChsYXN0ICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMubGFzdFN5bmMgPSBsYXN0LnRvTG9jYWxlRGF0ZVN0cmluZygpICsgJyAnICsgbGFzdC50b0xvY2FsZVRpbWVTdHJpbmcoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubGFzdFN5bmMgPSB0aGlzLmkxOG5TZXJ2aWNlLnQoJ25ldmVyJyk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCI8aGVhZGVyPlxuICAgIDxkaXYgY2xhc3M9XCJsZWZ0XCI+XG4gICAgICAgIDxhIHJvdXRlckxpbms9XCIvdGFicy9zZXR0aW5nc1wiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJoZWFkZXItaWNvblwiPjxpIGNsYXNzPVwiZmEgZmEtY2hldnJvbi1sZWZ0XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPjwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuPnt7J2JhY2snIHwgaTE4bn19PC9zcGFuPlxuICAgICAgICA8L2E+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImNlbnRlclwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInRpdGxlXCI+e3snc3luYycgfCBpMThufX08L3NwYW4+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cInJpZ2h0XCI+PC9kaXY+XG48L2hlYWRlcj5cbjxjb250ZW50PlxuICAgIDxkaXYgY2xhc3M9XCJjb250ZW50IGNlbnRlci1jb250ZW50XCI+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJsb2NrIHByaW1hcnlcIiAoY2xpY2spPVwic3luYygpXCIgI3N5bmNCdG4gW2Rpc2FibGVkXT1cInN5bmNCdG4ubG9hZGluZ1wiXG4gICAgICAgICAgICBbYXBwQXBpQWN0aW9uXT1cInN5bmNQcm9taXNlXCI+XG4gICAgICAgICAgICA8c3BhbiBbaGlkZGVuXT1cInN5bmNCdG4ubG9hZGluZ1wiPnt7J3N5bmNWYXVsdE5vdycgfCBpMThufX08L3NwYW4+XG4gICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXNwaW5uZXIgZmEtbGcgZmEtc3BpblwiIFtoaWRkZW5dPVwiIXN5bmNCdG4ubG9hZGluZ1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxwIGNsYXNzPVwidGV4dC1jZW50ZXIgdGV4dC1tdXRlZCBzbWFsbFwiPnt7J2xhc3RTeW5jJyB8IGkxOG59fSB7e2xhc3RTeW5jfX08L3A+XG4gICAgPC9kaXY+XG48L2NvbnRlbnQ+XG4iLCJpbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gICAgTkdfVkFMSURBVE9SUyxcbiAgICBOR19WQUxVRV9BQ0NFU1NPUixcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5pbXBvcnQge1xuICAgIFZhdWx0VGltZW91dElucHV0Q29tcG9uZW50IGFzIFZhdWx0VGltZW91dElucHV0Q29tcG9uZW50QmFzZVxufSBmcm9tICdqc2xpYi1hbmd1bGFyL2NvbXBvbmVudHMvc2V0dGluZ3MvdmF1bHQtdGltZW91dC1pbnB1dC5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2FwcC12YXVsdC10aW1lb3V0LWlucHV0JyxcbiAgICB0ZW1wbGF0ZVVybDogJ3ZhdWx0LXRpbWVvdXQtaW5wdXQuY29tcG9uZW50Lmh0bWwnLFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgICAgICAgIG11bHRpOiB0cnVlLFxuICAgICAgICAgICAgdXNlRXhpc3Rpbmc6IFZhdWx0VGltZW91dElucHV0Q29tcG9uZW50LFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBOR19WQUxJREFUT1JTLFxuICAgICAgICAgICAgbXVsdGk6IHRydWUsXG4gICAgICAgICAgICB1c2VFeGlzdGluZzogVmF1bHRUaW1lb3V0SW5wdXRDb21wb25lbnQsXG4gICAgICAgIH0sXG4gICAgXSxcbn0pXG5leHBvcnQgY2xhc3MgVmF1bHRUaW1lb3V0SW5wdXRDb21wb25lbnQgZXh0ZW5kcyBWYXVsdFRpbWVvdXRJbnB1dENvbXBvbmVudEJhc2Uge1xufVxuIiwiPGFwcC1jYWxsb3V0IHR5cGU9XCJpbmZvXCIgKm5nSWY9XCJ2YXVsdFRpbWVvdXRQb2xpY3lcIj5cbiAgICB7eyd2YXVsdFRpbWVvdXRQb2xpY3lJbkVmZmVjdCcgfCBpMThuIDogdmF1bHRUaW1lb3V0UG9saWN5SG91cnMgOiB2YXVsdFRpbWVvdXRQb2xpY3lNaW51dGVzfX1cbjwvYXBwLWNhbGxvdXQ+XG5cbjxkaXYgW2Zvcm1Hcm91cF09XCJmb3JtXCI+XG4gICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50LXJvdyBsYXN0IGRpc3BsYXktYmxvY2tcIiBhcHBCb3hSb3c+XG4gICAgICAgIDxsYWJlbCBmb3I9XCJ2YXVsdFRpbWVvdXRcIj57eyd2YXVsdFRpbWVvdXQnIHwgaTE4bn19PC9sYWJlbD5cbiAgICAgICAgPHNlbGVjdCBpZD1cInZhdWx0VGltZW91dFwiIG5hbWU9XCJWYXVsdFRpbWVvdXRcIiBmb3JtQ29udHJvbE5hbWU9XCJ2YXVsdFRpbWVvdXRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiPlxuICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgbyBvZiB2YXVsdFRpbWVvdXRzXCIgW25nVmFsdWVdPVwiby52YWx1ZVwiPnt7by5uYW1lfX08L29wdGlvbj5cbiAgICAgICAgPC9zZWxlY3Q+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50LXJvdyBsYXN0XCIgKm5nSWY9XCJzaG93Q3VzdG9tXCI+XG4gICAgICAgIDxkaXYgZm9ybUdyb3VwTmFtZT1cImN1c3RvbVwiIGNsYXNzPVwicm93XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRpc3BsYXktYmxvY2tcIiBhcHBCb3hSb3c+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJjdXN0b21WYXVsdFRpbWVvdXRcIj57eydob3VycycgfCBpMThuIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPVwiaG91cnNcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIHR5cGU9XCJudW1iZXJcIiBtaW49XCIwXCIgbmFtZT1cImhvdXJzXCIgZm9ybUNvbnRyb2xOYW1lPVwiaG91cnNcIj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkaXNwbGF5LWJsb2NrXCIgYXBwQm94Um93PlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiY3VzdG9tVmF1bHRUaW1lb3V0XCI+e3snbWludXRlcycgfCBpMThuIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPVwibWludXRlc1wiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgdHlwZT1cIm51bWJlclwiIG1pbj1cIjBcIiBtYXg9XCI1OVwiIG5hbWU9XCJtaW51dGVzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cIm1pbnV0ZXNcIj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuIiwiaW1wb3J0IHtcbiAgICBDb21wb25lbnQsXG4gICAgT25Jbml0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgUG9wdXBVdGlsc1NlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL3BvcHVwLXV0aWxzLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2FwcC10YWJzJyxcbiAgICB0ZW1wbGF0ZVVybDogJ3RhYnMuY29tcG9uZW50Lmh0bWwnLFxufSlcbmV4cG9ydCBjbGFzcyBUYWJzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgICBzaG93Q3VycmVudFRhYjogYm9vbGVhbiA9IHRydWU7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHBvcHVwVXRpbHNTZXJ2aWNlOiBQb3B1cFV0aWxzU2VydmljZSkgeyB9XG5cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgdGhpcy5zaG93Q3VycmVudFRhYiA9ICF0aGlzLnBvcHVwVXRpbHNTZXJ2aWNlLmluUG9wb3V0KHdpbmRvdyk7XG4gICAgfVxufVxuIiwiPGRpdiBjbGFzcz1cInRhYi1wYWdlXCI+XG4gICAgPHJvdXRlci1vdXRsZXQ+PC9yb3V0ZXItb3V0bGV0PlxuICAgIDxuYXYgY2xhc3M9XCJ0YWJzXCI+XG4gICAgICAgIDx1bD5cbiAgICAgICAgICAgIDxsaSByb3V0ZXJMaW5rQWN0aXZlPVwiYWN0aXZlXCIgKm5nSWY9XCJzaG93Q3VycmVudFRhYlwiPlxuICAgICAgICAgICAgICAgIDxhIHJvdXRlckxpbms9XCJjdXJyZW50XCIgYXBwQTExeVRpdGxlPVwie3snY3VycmVudFRhYicgfCBpMThufX1cIj5cbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1mb2xkZXIgZmEtMnhcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+e3sndGFiJyB8IGkxOG59fVxuICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICA8bGkgcm91dGVyTGlua0FjdGl2ZT1cImFjdGl2ZVwiPlxuICAgICAgICAgICAgICAgIDxhIHJvdXRlckxpbms9XCJ2YXVsdFwiIGFwcEExMXlUaXRsZT1cInt7J215VmF1bHQnIHwgaTE4bn19XCI+XG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtbG9jayBmYS0yeFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT57eydteVZhdWx0JyB8IGkxOG59fVxuICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICA8bGkgcm91dGVyTGlua0FjdGl2ZT1cImFjdGl2ZVwiPlxuICAgICAgICAgICAgICAgIDxhIHJvdXRlckxpbms9XCJzZW5kXCIgYXBwQTExeVRpdGxlPVwie3snc2VuZCcgfCBpMThufX1cIj5cbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1wYXBlci1wbGFuZSBmYS0yeFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT57eydzZW5kJyB8IGkxOG59fVxuICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICA8bGkgcm91dGVyTGlua0FjdGl2ZT1cImFjdGl2ZVwiPlxuICAgICAgICAgICAgICAgIDxhIHJvdXRlckxpbms9XCJnZW5lcmF0b3JcIiBhcHBBMTF5VGl0bGU9XCJ7eydwYXNzR2VuJyB8IGkxOG59fVwiPlxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXJlZnJlc2ggZmEtMnhcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+e3snZ2VuZXJhdG9yJyB8IGkxOG59fVxuICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICA8bGkgcm91dGVyTGlua0FjdGl2ZT1cImFjdGl2ZVwiPlxuICAgICAgICAgICAgICAgIDxhIHJvdXRlckxpbms9XCJzZXR0aW5nc1wiIGFwcEExMXlUaXRsZT1cInt7J3NldHRpbmdzJyB8IGkxOG59fVwiPlxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWNvZ3MgZmEtMnhcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+e3snc2V0dGluZ3MnIHwgaTE4bn19XG4gICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgPC9saT5cbiAgICAgICAgPC91bD5cbiAgICA8L25hdj5cbjwvZGl2PlxuIiwiaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7XG4gICAgQWRkRWRpdEN1c3RvbUZpZWxkc0NvbXBvbmVudCBhcyBCYXNlQWRkRWRpdEN1c3RvbUZpZWxkc0NvbXBvbmVudFxufSBmcm9tICdqc2xpYi1hbmd1bGFyL2NvbXBvbmVudHMvYWRkLWVkaXQtY3VzdG9tLWZpZWxkcy5jb21wb25lbnQnO1xuXG5pbXBvcnQgeyBFdmVudFNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL2V2ZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgSTE4blNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL2kxOG4uc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnYXBwLXZhdWx0LWFkZC1lZGl0LWN1c3RvbS1maWVsZHMnLFxuICAgIHRlbXBsYXRlVXJsOiAnYWRkLWVkaXQtY3VzdG9tLWZpZWxkcy5jb21wb25lbnQuaHRtbCcsXG59KVxuZXhwb3J0IGNsYXNzIEFkZEVkaXRDdXN0b21GaWVsZHNDb21wb25lbnQgZXh0ZW5kcyBCYXNlQWRkRWRpdEN1c3RvbUZpZWxkc0NvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IoaTE4blNlcnZpY2U6IEkxOG5TZXJ2aWNlLCBldmVudFNlcnZpY2U6IEV2ZW50U2VydmljZSkge1xuICAgICAgICBzdXBlcihpMThuU2VydmljZSwgZXZlbnRTZXJ2aWNlKTtcbiAgICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiYm94XCI+XG4gICAgPGRpdiBjbGFzcz1cImJveC1oZWFkZXJcIj5cbiAgICAgICAge3snY3VzdG9tRmllbGRzJyB8IGkxOG59fVxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJib3gtY29udGVudFwiPlxuICAgICAgICA8IS0tIEN1cnJlbnQgY3VzdG9tIGZpZWxkcyAtLT5cbiAgICAgICAgPGRpdiBjZGtEcm9wTGlzdCAoY2RrRHJvcExpc3REcm9wcGVkKT1cImRyb3AoJGV2ZW50KVwiICpuZ0lmPVwiY2lwaGVyLmhhc0ZpZWxkc1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50LXJvdyBib3gtY29udGVudC1yb3ctbXVsdGkgYm94LWRyYWdnYWJsZS1yb3dcIiBhcHBCb3hSb3cgY2RrRHJhZ1xuICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBmIG9mIGNpcGhlci5maWVsZHM7IGxldCBpID0gaW5kZXg7IHRyYWNrQnk6dHJhY2tCeUZ1bmN0aW9uXCJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2JveC1jb250ZW50LXJvdy1jaGVja2JveCc6IGYudHlwZSA9PT0gZmllbGRUeXBlLkJvb2xlYW59XCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgYXBwU3RvcENsaWNrIChjbGljayk9XCJyZW1vdmVGaWVsZChmKVwiIGFwcEExMXlUaXRsZT1cInt7J3JlbW92ZScgfCBpMThufX1cIj5cbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1taW51cy1jaXJjbGUgZmEtbGdcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImZpZWxkTmFtZXt7aX19XCIgY2xhc3M9XCJzci1vbmx5XCI+e3snbmFtZScgfCBpMThufX08L2xhYmVsPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJmaWVsZFZhbHVle3tpfX1cIiBjbGFzcz1cInNyLW9ubHlcIj57eyd2YWx1ZScgfCBpMThufX08L2xhYmVsPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3ctbWFpblwiPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9XCJmaWVsZE5hbWV7e2l9fVwiIHR5cGU9XCJ0ZXh0XCIgbmFtZT1cIkZpZWxkLk5hbWV7e2l9fVwiIFsobmdNb2RlbCldPVwiZi5uYW1lXCIgY2xhc3M9XCJyb3ctbGFiZWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7eyduYW1lJyB8IGkxOG59fVwiIGFwcElucHV0VmVyYmF0aW0+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gVGV4dCAtLT5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPVwiZmllbGRWYWx1ZXt7aX19XCIgdHlwZT1cInRleHRcIiBuYW1lPVwiRmllbGQuVmFsdWV7e2l9fVwiIFsobmdNb2RlbCldPVwiZi52YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImYudHlwZSA9PT0gZmllbGRUeXBlLlRleHRcIiBwbGFjZWhvbGRlcj1cInt7J3ZhbHVlJyB8IGkxOG59fVwiIGFwcElucHV0VmVyYmF0aW0+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gSGlkZGVuIC0tPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9XCJmaWVsZFZhbHVle3tpfX1cIiB0eXBlPVwie3tmLnNob3dWYWx1ZSA/ICd0ZXh0JyA6ICdwYXNzd29yZCd9fVwiIG5hbWU9XCJGaWVsZC5WYWx1ZXt7aX19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZi52YWx1ZVwiIGNsYXNzPVwibW9ub3NwYWNlZFwiIGFwcElucHV0VmVyYmF0aW0gKm5nSWY9XCJmLnR5cGUgPT09IGZpZWxkVHlwZS5IaWRkZW5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7eyd2YWx1ZScgfCBpMThufX1cIiBbZGlzYWJsZWRdPVwiIWNpcGhlci52aWV3UGFzc3dvcmQgJiYgIWYubmV3RmllbGRcIj5cbiAgICAgICAgICAgICAgICAgICAgPCEtLSBMaW5rZWQgLS0+XG4gICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgaWQ9XCJmaWVsZFZhbHVle3tpfX1cIiBuYW1lPVwiRmllbGQuVmFsdWV7e2l9fVwiIFsobmdNb2RlbCldPVwiZi5saW5rZWRJZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImYudHlwZSA9PT0gZmllbGRUeXBlLkxpbmtlZCAmJiBjaXBoZXIubGlua2VkRmllbGRPcHRpb25zICE9IG51bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IG8gb2YgbGlua2VkRmllbGRPcHRpb25zXCIgW25nVmFsdWVdPVwiby52YWx1ZVwiPnt7by5uYW1lfX08L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPCEtLSBCb29sZWFuIC0tPlxuICAgICAgICAgICAgICAgIDxpbnB1dCBpZD1cImZpZWxkVmFsdWV7e2l9fVwiIG5hbWU9XCJGaWVsZC5WYWx1ZXt7aX19XCIgdHlwZT1cImNoZWNrYm94XCIgWyhuZ01vZGVsKV09XCJmLnZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJmLnR5cGUgPT09IGZpZWxkVHlwZS5Cb29sZWFuXCIgYXBwVHJ1ZUZhbHNlVmFsdWUgdHJ1ZVZhbHVlPVwidHJ1ZVwiIGZhbHNlVmFsdWU9XCJmYWxzZVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhY3Rpb24tYnV0dG9uc1wiICpuZ0lmPVwiZi50eXBlID09PSBmaWVsZFR5cGUuSGlkZGVuICYmIChjaXBoZXIudmlld1Bhc3N3b3JkIHx8IGYubmV3RmllbGQpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwicm93LWJ0blwiIGFwcFN0b3BDbGljayBhcHBCbHVyQ2xpY2sgYXBwQTExeVRpdGxlPVwie3sndG9nZ2xlVmlzaWJpbGl0eScgfCBpMThufX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUZpZWxkVmFsdWUoZilcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtbGdcIiBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnZmEtZXllJzogIWYuc2hvd1ZhbHVlLCAnZmEtZXllLXNsYXNoJzogZi5zaG93VmFsdWV9XCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHJhZy1oYW5kbGVcIiBhcHBBMTF5VGl0bGU9XCJ7eydkcmFnVG9Tb3J0JyB8IGkxOG59fVwiIGNka0RyYWdIYW5kbGU+XG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtYmFyc1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPCEtLSBBZGQgbmV3IGN1c3RvbSBmaWVsZCAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50LXJvdyBib3gtY29udGVudC1yb3ctbmV3bXVsdGlcIiBhcHBCb3hSb3c+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBhcHBTdG9wQ2xpY2sgKGNsaWNrKT1cImFkZEZpZWxkKClcIj5cbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXBsdXMtY2lyY2xlIGZhLWZ3IGZhLWxnXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPiB7eyduZXdDdXN0b21GaWVsZCcgfCBpMThufX1cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cImFkZEZpZWxkVHlwZVwiIGNsYXNzPVwic3Itb25seVwiPnt7J3R5cGUnIHwgaTE4bn19PC9sYWJlbD5cbiAgICAgICAgICAgIDxzZWxlY3QgaWQ9XCJhZGRGaWVsZFR5cGVcIiBuYW1lPVwiQWRkRmllbGRUeXBlXCIgWyhuZ01vZGVsKV09XCJhZGRGaWVsZFR5cGVcIiBjbGFzcz1cImZpZWxkLXR5cGVcIj5cbiAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBvIG9mIGFkZEZpZWxkVHlwZU9wdGlvbnNcIiBbbmdWYWx1ZV09XCJvLnZhbHVlXCI+e3tvLm5hbWV9fTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nSWY9XCJjaXBoZXIubGlua2VkRmllbGRPcHRpb25zICE9IG51bGxcIiBbbmdWYWx1ZV09XCJhZGRGaWVsZExpbmtlZFR5cGVPcHRpb24udmFsdWVcIj5cbiAgICAgICAgICAgICAgICAgICAge3thZGRGaWVsZExpbmtlZFR5cGVPcHRpb24ubmFtZX19XG4gICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG48L2Rpdj5cbiIsImltcG9ydCB7IExvY2F0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENvbXBvbmVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgICBBY3RpdmF0ZWRSb3V0ZSxcbiAgICBSb3V0ZXIsXG59IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5cbmltcG9ydCB7IGZpcnN0IH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBCcm93c2VyQXBpIH0gZnJvbSAnLi4vLi4vYnJvd3Nlci9icm93c2VyQXBpJztcblxuaW1wb3J0IHsgQXVkaXRTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9hdWRpdC5zZXJ2aWNlJztcbmltcG9ydCB7IENpcGhlclNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL2NpcGhlci5zZXJ2aWNlJztcbmltcG9ydCB7IENvbGxlY3Rpb25TZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9jb2xsZWN0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgRXZlbnRTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9ldmVudC5zZXJ2aWNlJztcbmltcG9ydCB7IEZvbGRlclNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL2ZvbGRlci5zZXJ2aWNlJztcbmltcG9ydCB7IEkxOG5TZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9pMThuLnNlcnZpY2UnO1xuaW1wb3J0IHsgTG9nU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvbG9nLnNlcnZpY2UnO1xuaW1wb3J0IHsgTWVzc2FnaW5nU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvbWVzc2FnaW5nLnNlcnZpY2UnO1xuaW1wb3J0IHsgUGxhdGZvcm1VdGlsc1NlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL3BsYXRmb3JtVXRpbHMuc2VydmljZSc7XG5pbXBvcnQgeyBQb2xpY3lTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9wb2xpY3kuc2VydmljZSc7XG5pbXBvcnQgeyBTdGF0ZVNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL3N0YXRlLnNlcnZpY2UnO1xuaW1wb3J0IHsgU3RvcmFnZVNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL3N0b3JhZ2Uuc2VydmljZSc7XG5pbXBvcnQgeyBVc2VyU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvdXNlci5zZXJ2aWNlJztcblxuaW1wb3J0IHsgQ29uc3RhbnRzU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9zZXJ2aWNlcy9jb25zdGFudHMuc2VydmljZSc7XG5cbmltcG9ydCB7IFBvcHVwVXRpbHNTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvcG9wdXAtdXRpbHMuc2VydmljZSc7XG5cbmltcG9ydCB7IExvZ2luVXJpVmlldyB9IGZyb20gJ2pzbGliLWNvbW1vbi9tb2RlbHMvdmlldy9sb2dpblVyaVZpZXcnO1xuXG5pbXBvcnQgeyBBZGRFZGl0Q29tcG9uZW50IGFzIEJhc2VBZGRFZGl0Q29tcG9uZW50IH0gZnJvbSAnanNsaWItYW5ndWxhci9jb21wb25lbnRzL2FkZC1lZGl0LmNvbXBvbmVudCc7XG5cbmltcG9ydCB7IENpcGhlclR5cGUgfSBmcm9tICdqc2xpYi1jb21tb24vZW51bXMvY2lwaGVyVHlwZSc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnYXBwLXZhdWx0LWFkZC1lZGl0JyxcbiAgICB0ZW1wbGF0ZVVybDogJ2FkZC1lZGl0LmNvbXBvbmVudC5odG1sJyxcbn0pXG5leHBvcnQgY2xhc3MgQWRkRWRpdENvbXBvbmVudCBleHRlbmRzIEJhc2VBZGRFZGl0Q29tcG9uZW50IHtcbiAgICBjdXJyZW50VXJpczogc3RyaW5nW107XG4gICAgc2hvd0F0dGFjaG1lbnRzID0gdHJ1ZTtcbiAgICBvcGVuQXR0YWNobWVudHNJblBvcHVwOiBib29sZWFuO1xuICAgIHNob3dBdXRvRmlsbE9uUGFnZUxvYWRPcHRpb25zOiBib29sZWFuO1xuXG4gICAgY29uc3RydWN0b3IoY2lwaGVyU2VydmljZTogQ2lwaGVyU2VydmljZSwgZm9sZGVyU2VydmljZTogRm9sZGVyU2VydmljZSxcbiAgICAgICAgaTE4blNlcnZpY2U6IEkxOG5TZXJ2aWNlLCBwbGF0Zm9ybVV0aWxzU2VydmljZTogUGxhdGZvcm1VdGlsc1NlcnZpY2UsXG4gICAgICAgIGF1ZGl0U2VydmljZTogQXVkaXRTZXJ2aWNlLCBzdGF0ZVNlcnZpY2U6IFN0YXRlU2VydmljZSxcbiAgICAgICAgdXNlclNlcnZpY2U6IFVzZXJTZXJ2aWNlLCBjb2xsZWN0aW9uU2VydmljZTogQ29sbGVjdGlvblNlcnZpY2UsXG4gICAgICAgIG1lc3NhZ2luZ1NlcnZpY2U6IE1lc3NhZ2luZ1NlcnZpY2UsIHByaXZhdGUgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgICAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLCBwcml2YXRlIGxvY2F0aW9uOiBMb2NhdGlvbixcbiAgICAgICAgZXZlbnRTZXJ2aWNlOiBFdmVudFNlcnZpY2UsIHBvbGljeVNlcnZpY2U6IFBvbGljeVNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgcG9wdXBVdGlsc1NlcnZpY2U6IFBvcHVwVXRpbHNTZXJ2aWNlLCBwcml2YXRlIHN0b3JhZ2VTZXJ2aWNlOiBTdG9yYWdlU2VydmljZSxcbiAgICAgICAgbG9nU2VydmljZTogTG9nU2VydmljZSkge1xuICAgICAgICBzdXBlcihjaXBoZXJTZXJ2aWNlLCBmb2xkZXJTZXJ2aWNlLCBpMThuU2VydmljZSwgcGxhdGZvcm1VdGlsc1NlcnZpY2UsIGF1ZGl0U2VydmljZSwgc3RhdGVTZXJ2aWNlLFxuICAgICAgICAgICAgdXNlclNlcnZpY2UsIGNvbGxlY3Rpb25TZXJ2aWNlLCBtZXNzYWdpbmdTZXJ2aWNlLCBldmVudFNlcnZpY2UsIHBvbGljeVNlcnZpY2UsIGxvZ1NlcnZpY2UpO1xuICAgIH1cblxuICAgIGFzeW5jIG5nT25Jbml0KCkge1xuICAgICAgICBhd2FpdCBzdXBlci5uZ09uSW5pdCgpO1xuXG4gICAgICAgIHRoaXMucm91dGUucXVlcnlQYXJhbXMucGlwZShmaXJzdCgpKS5zdWJzY3JpYmUoYXN5bmMgcGFyYW1zID0+IHtcbiAgICAgICAgICAgIGlmIChwYXJhbXMuY2lwaGVySWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNpcGhlcklkID0gcGFyYW1zLmNpcGhlcklkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHBhcmFtcy5mb2xkZXJJZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZm9sZGVySWQgPSBwYXJhbXMuZm9sZGVySWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocGFyYW1zLmNvbGxlY3Rpb25JZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbGxlY3Rpb24gPSB0aGlzLndyaXRlYWJsZUNvbGxlY3Rpb25zLmZpbmQoYyA9PiBjLmlkID09PSBwYXJhbXMuY29sbGVjdGlvbklkKTtcbiAgICAgICAgICAgICAgICBpZiAoY29sbGVjdGlvbiAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29sbGVjdGlvbklkcyA9IFtjb2xsZWN0aW9uLmlkXTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcmdhbml6YXRpb25JZCA9IGNvbGxlY3Rpb24ub3JnYW5pemF0aW9uSWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHBhcmFtcy50eXBlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdHlwZSA9IHBhcnNlSW50KHBhcmFtcy50eXBlLCBudWxsKTtcbiAgICAgICAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5lZGl0TW9kZSA9ICFwYXJhbXMuY2lwaGVySWQ7XG5cbiAgICAgICAgICAgIGlmIChwYXJhbXMuY2xvbmVNb2RlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNsb25lTW9kZSA9IHBhcmFtcy5jbG9uZU1vZGUgPT09ICd0cnVlJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGF3YWl0IHRoaXMubG9hZCgpO1xuXG4gICAgICAgICAgICBpZiAoIXRoaXMuZWRpdE1vZGUgfHwgdGhpcy5jbG9uZU1vZGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMucG9wdXBVdGlsc1NlcnZpY2UuaW5Qb3BvdXQod2luZG93KSAmJiBwYXJhbXMubmFtZSAmJlxuICAgICAgICAgICAgICAgICAgICAodGhpcy5jaXBoZXIubmFtZSA9PSBudWxsIHx8IHRoaXMuY2lwaGVyLm5hbWUgPT09ICcnKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNpcGhlci5uYW1lID0gcGFyYW1zLm5hbWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5wb3B1cFV0aWxzU2VydmljZS5pblBvcG91dCh3aW5kb3cpICYmIHBhcmFtcy51cmkgJiZcbiAgICAgICAgICAgICAgICAgICAgKHRoaXMuY2lwaGVyLmxvZ2luLnVyaXNbMF0udXJpID09IG51bGwgfHwgdGhpcy5jaXBoZXIubG9naW4udXJpc1swXS51cmkgPT09ICcnKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNpcGhlci5sb2dpbi51cmlzWzBdLnVyaSA9IHBhcmFtcy51cmk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLm9wZW5BdHRhY2htZW50c0luUG9wdXAgPSB0aGlzLnBvcHVwVXRpbHNTZXJ2aWNlLmluUG9wdXAod2luZG93KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKCF0aGlzLmVkaXRNb2RlKSB7XG4gICAgICAgICAgICBjb25zdCB0YWJzID0gYXdhaXQgQnJvd3NlckFwaS50YWJzUXVlcnkoeyB3aW5kb3dUeXBlOiAnbm9ybWFsJyB9KTtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFVyaXMgPSB0YWJzID09IG51bGwgPyBudWxsIDpcbiAgICAgICAgICAgICAgICB0YWJzLmZpbHRlcih0YWIgPT4gdGFiLnVybCAhPSBudWxsICYmIHRhYi51cmwgIT09ICcnKS5tYXAodGFiID0+IHRhYi51cmwpO1xuICAgICAgICB9XG5cbiAgICAgICAgd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmVkaXRNb2RlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY2lwaGVyLm5hbWUgIT0gbnVsbCAmJiB0aGlzLmNpcGhlci5uYW1lICE9PSAnJykge1xuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9naW5Vc2VybmFtZScpLmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25hbWUnKS5mb2N1cygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgMjAwKTtcbiAgICB9XG5cbiAgICBhc3luYyBsb2FkKCkge1xuICAgICAgICBhd2FpdCBzdXBlci5sb2FkKCk7XG4gICAgICAgIHRoaXMuc2hvd0F1dG9GaWxsT25QYWdlTG9hZE9wdGlvbnMgPSB0aGlzLmNpcGhlci50eXBlID09PSBDaXBoZXJUeXBlLkxvZ2luICYmXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldDxib29sZWFuPihDb25zdGFudHNTZXJ2aWNlLmVuYWJsZUF1dG9GaWxsT25QYWdlTG9hZEtleSk7XG4gICAgfVxuXG4gICAgYXN5bmMgc3VibWl0KCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICBpZiAoYXdhaXQgc3VwZXIuc3VibWl0KCkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNsb25lTW9kZSkge1xuICAgICAgICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL3RhYnMvdmF1bHQnXSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMubG9jYXRpb24uYmFjaygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgYXR0YWNobWVudHMoKSB7XG4gICAgICAgIHN1cGVyLmF0dGFjaG1lbnRzKCk7XG5cbiAgICAgICAgaWYgKHRoaXMub3BlbkF0dGFjaG1lbnRzSW5Qb3B1cCkge1xuICAgICAgICAgICAgY29uc3QgZGVzdGluYXRpb25VcmwgPSB0aGlzLnJvdXRlci5jcmVhdGVVcmxUcmVlKFsnL2F0dGFjaG1lbnRzJ10sIHsgcXVlcnlQYXJhbXM6IHsgY2lwaGVySWQ6IHRoaXMuY2lwaGVyLmlkIH0gfSkudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRCYXNlVXJsID0gd2luZG93LmxvY2F0aW9uLmhyZWYucmVwbGFjZSh0aGlzLnJvdXRlci51cmwsICcnKTtcbiAgICAgICAgICAgIHRoaXMucG9wdXBVdGlsc1NlcnZpY2UucG9wT3V0KHdpbmRvdywgY3VycmVudEJhc2VVcmwgKyBkZXN0aW5hdGlvblVybCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy9hdHRhY2htZW50cyddLCB7IHF1ZXJ5UGFyYW1zOiB7IGNpcGhlcklkOiB0aGlzLmNpcGhlci5pZCB9IH0pO1xuICAgICAgICB9XG4gICAgfVxuXG5cbiAgICBlZGl0Q29sbGVjdGlvbnMoKSB7XG4gICAgICAgIHN1cGVyLmVkaXRDb2xsZWN0aW9ucygpO1xuICAgICAgICBpZiAodGhpcy5jaXBoZXIub3JnYW5pemF0aW9uSWQgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvY29sbGVjdGlvbnMnXSwgeyBxdWVyeVBhcmFtczogeyBjaXBoZXJJZDogdGhpcy5jaXBoZXIuaWQgfSB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNhbmNlbCgpIHtcbiAgICAgICAgc3VwZXIuY2FuY2VsKCk7XG4gICAgICAgIHRoaXMubG9jYXRpb24uYmFjaygpO1xuICAgIH1cblxuICAgIGFzeW5jIGdlbmVyYXRlUGFzc3dvcmQoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGNvbnN0IGNvbmZpcm1lZCA9IGF3YWl0IHN1cGVyLmdlbmVyYXRlUGFzc3dvcmQoKTtcbiAgICAgICAgaWYgKGNvbmZpcm1lZCkge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZVNlcnZpY2Uuc2F2ZSgnYWRkRWRpdENpcGhlckluZm8nLCB7XG4gICAgICAgICAgICAgICAgY2lwaGVyOiB0aGlzLmNpcGhlcixcbiAgICAgICAgICAgICAgICBjb2xsZWN0aW9uSWRzOiB0aGlzLmNvbGxlY3Rpb25zID09IG51bGwgPyBbXSA6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29sbGVjdGlvbnMuZmlsdGVyKGMgPT4gKGMgYXMgYW55KS5jaGVja2VkKS5tYXAoYyA9PiBjLmlkKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWydnZW5lcmF0b3InXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbmZpcm1lZDtcbiAgICB9XG5cbiAgICBhc3luYyBkZWxldGUoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGNvbnN0IGNvbmZpcm1lZCA9IGF3YWl0IHN1cGVyLmRlbGV0ZSgpO1xuICAgICAgICBpZiAoY29uZmlybWVkKSB7XG4gICAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy90YWJzL3ZhdWx0J10pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb25maXJtZWQ7XG4gICAgfVxuXG4gICAgdG9nZ2xlVXJpSW5wdXQodXJpOiBMb2dpblVyaVZpZXcpIHtcbiAgICAgICAgY29uc3QgdSA9ICh1cmkgYXMgYW55KTtcbiAgICAgICAgdS5zaG93Q3VycmVudFVyaXMgPSAhdS5zaG93Q3VycmVudFVyaXM7XG4gICAgfVxuXG4gICAgYWxsb3dPd25lcnNoaXBPcHRpb25zKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gKCF0aGlzLmVkaXRNb2RlIHx8IHRoaXMuY2xvbmVNb2RlKSAmJiB0aGlzLm93bmVyc2hpcE9wdGlvbnNcbiAgICAgICAgICAgICYmICh0aGlzLm93bmVyc2hpcE9wdGlvbnMubGVuZ3RoID4gMSB8fCAhdGhpcy5hbGxvd1BlcnNvbmFsKTtcbiAgICB9XG59XG4iLCI8Zm9ybSAjZm9ybSAobmdTdWJtaXQpPVwic3VibWl0KClcIiBbYXBwQXBpQWN0aW9uXT1cImZvcm1Qcm9taXNlXCI+XG4gICAgPGhlYWRlcj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImxlZnRcIj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGFwcEJsdXJDbGljayAoY2xpY2spPVwiY2FuY2VsKClcIj57eydjYW5jZWwnIHwgaTE4bn19PC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2VudGVyXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRpdGxlXCI+e3t0aXRsZX19PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJpZ2h0XCI+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJzdWJtaXRcIiBhcHBCbHVyQ2xpY2sgW2Rpc2FibGVkXT1cImZvcm0ubG9hZGluZ1wiPlxuICAgICAgICAgICAgICAgIDxzcGFuIFtoaWRkZW5dPVwiZm9ybS5sb2FkaW5nXCI+e3snc2F2ZScgfCBpMThufX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1zcGlubmVyIGZhLWxnIGZhLXNwaW5cIiBbaGlkZGVuXT1cIiFmb3JtLmxvYWRpbmdcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9oZWFkZXI+XG4gICAgPGNvbnRlbnQgKm5nSWY9XCJjaXBoZXJcIj5cbiAgICAgICAgPGFwcC1jYWxsb3V0IHR5cGU9XCJpbmZvXCIgKm5nSWY9XCJhbGxvd093bmVyc2hpcE9wdGlvbnMoKSAmJiAhYWxsb3dQZXJzb25hbFwiPlxuICAgICAgICAgICAge3sncGVyc29uYWxPd25lcnNoaXBQb2xpY3lJbkVmZmVjdCcgfCBpMThufX1cbiAgICAgICAgPC9hcHAtY2FsbG91dD5cbiAgICAgICAgPGRpdiBjbGFzcz1cImJveFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1oZWFkZXJcIj5cbiAgICAgICAgICAgICAgICB7eydpdGVtSW5mb3JtYXRpb24nIHwgaTE4bn19XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtY29udGVudFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtY29udGVudC1yb3dcIiAqbmdJZj1cIiFlZGl0TW9kZVwiIGFwcEJveFJvdz5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInR5cGVcIj57eyd0eXBlJyB8IGkxOG59fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgaWQ9XCJ0eXBlXCIgbmFtZT1cIlR5cGVcIiBbKG5nTW9kZWwpXT1cImNpcGhlci50eXBlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBvIG9mIHR5cGVPcHRpb25zXCIgW25nVmFsdWVdPVwiby52YWx1ZVwiPnt7by5uYW1lfX08L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50LXJvd1wiIGFwcEJveFJvdz5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cIm5hbWVcIj57eyduYW1lJyB8IGkxOG59fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD1cIm5hbWVcIiB0eXBlPVwidGV4dFwiIG5hbWU9XCJOYW1lXCIgWyhuZ01vZGVsKV09XCJjaXBoZXIubmFtZVwiPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwhLS0gTG9naW4gLS0+XG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImNpcGhlci50eXBlID09PSBjaXBoZXJUeXBlLkxvZ2luXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtY29udGVudC1yb3dcIiBhcHBCb3hSb3c+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwibG9naW5Vc2VybmFtZVwiPnt7J3VzZXJuYW1lJyB8IGkxOG59fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9XCJsb2dpblVzZXJuYW1lXCIgdHlwZT1cInRleHRcIiBuYW1lPVwiTG9naW4uVXNlcm5hbWVcIiBbKG5nTW9kZWwpXT1cImNpcGhlci5sb2dpbi51c2VybmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRtb2RlPVwiZW1haWxcIiBhcHBJbnB1dFZlcmJhdGltPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50LXJvdyBib3gtY29udGVudC1yb3ctZmxleFwiIGFwcEJveFJvdz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3ctbWFpblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJsb2dpblBhc3N3b3JkXCI+e3sncGFzc3dvcmQnIHwgaTE4bn19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9XCJsb2dpblBhc3N3b3JkXCIgY2xhc3M9XCJtb25vc3BhY2VkXCIgdHlwZT1cInt7c2hvd1Bhc3N3b3JkID8gJ3RleHQnIDogJ3Bhc3N3b3JkJ319XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT1cIkxvZ2luLlBhc3N3b3JkXCIgWyhuZ01vZGVsKV09XCJjaXBoZXIubG9naW4ucGFzc3dvcmRcIiBhcHBJbnB1dFZlcmJhdGltXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhY2lwaGVyLnZpZXdQYXNzd29yZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWN0aW9uLWJ1dHRvbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAjY2hlY2tQYXNzd29yZEJ0biBjbGFzcz1cInJvdy1idG4gYnRuXCIgYXBwQmx1ckNsaWNrXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcEExMXlUaXRsZT1cInt7J2NoZWNrUGFzc3dvcmQnIHwgaTE4bn19XCIgKGNsaWNrKT1cImNoZWNrUGFzc3dvcmQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthcHBBcGlBY3Rpb25dPVwiY2hlY2tQYXNzd29yZFByb21pc2VcIiBbZGlzYWJsZWRdPVwiY2hlY2tQYXNzd29yZEJ0bi5sb2FkaW5nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjaXBoZXIudmlld1Bhc3N3b3JkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtbGcgZmEtY2hlY2stY2lyY2xlXCIgW2hpZGRlbl09XCJjaGVja1Bhc3N3b3JkQnRuLmxvYWRpbmdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWxnIGZhLXNwaW5uZXIgZmEtc3BpblwiIFtoaWRkZW5dPVwiIWNoZWNrUGFzc3dvcmRCdG4ubG9hZGluZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJyb3ctYnRuXCIgYXBwU3RvcENsaWNrIGFwcEJsdXJDbGlja1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBBMTF5VGl0bGU9XCJ7eyd0b2dnbGVWaXNpYmlsaXR5JyB8IGkxOG59fVwiIChjbGljayk9XCJ0b2dnbGVQYXNzd29yZCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjaXBoZXIudmlld1Bhc3N3b3JkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtbGdcIiBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydmYS1leWUnOiAhc2hvd1Bhc3N3b3JkLCAnZmEtZXllLXNsYXNoJzogc2hvd1Bhc3N3b3JkfVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInJvdy1idG5cIiBhcHBTdG9wQ2xpY2sgYXBwQmx1ckNsaWNrXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcEExMXlUaXRsZT1cInt7J2dlbmVyYXRlUGFzc3dvcmQnIHwgaTE4bn19XCIgKGNsaWNrKT1cImdlbmVyYXRlUGFzc3dvcmQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY2lwaGVyLnZpZXdQYXNzd29yZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWxnIGZhLXJlZnJlc2hcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50LXJvd1wiIGFwcEJveFJvdz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJsb2dpblRvdHBcIj57eydhdXRoZW50aWNhdG9yS2V5VG90cCcgfCBpMThufX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPVwibG9naW5Ub3RwXCIgdHlwZT1cInt7Y2lwaGVyLnZpZXdQYXNzd29yZCA/ICd0ZXh0JyA6ICdwYXNzd29yZCd9fVwiIG5hbWU9XCJMb2dpbi5Ub3RwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1vbm9zcGFjZWRcIiBbKG5nTW9kZWwpXT1cImNpcGhlci5sb2dpbi50b3RwXCIgYXBwSW5wdXRWZXJiYXRpbVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhY2lwaGVyLnZpZXdQYXNzd29yZFwiPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8IS0tIENhcmQgLS0+XG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImNpcGhlci50eXBlID09PSBjaXBoZXJUeXBlLkNhcmRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50LXJvd1wiIGFwcEJveFJvdz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJjYXJkQ2FyZGhvbGRlck5hbWVcIj57eydjYXJkaG9sZGVyTmFtZScgfCBpMThufX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPVwiY2FyZENhcmRob2xkZXJOYW1lXCIgdHlwZT1cInRleHRcIiBuYW1lPVwiQ2FyZC5DYXJkQ2FyZGhvbGRlck5hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiY2lwaGVyLmNhcmQuY2FyZGhvbGRlck5hbWVcIj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtY29udGVudC1yb3cgYm94LWNvbnRlbnQtcm93LWZsZXhcIiBhcHBCb3hSb3c+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93LW1haW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiY2FyZE51bWJlclwiPnt7J251bWJlcicgfCBpMThufX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD1cImNhcmROdW1iZXJcIiBjbGFzcz1cIm1vbm9zcGFjZWRcIiB0eXBlPVwie3tzaG93Q2FyZE51bWJlciA/ICd0ZXh0JyA6ICdwYXNzd29yZCd9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJDYXJkLk51bWJlclwiIFsobmdNb2RlbCldPVwiY2lwaGVyLmNhcmQubnVtYmVyXCIgYXBwSW5wdXRWZXJiYXRpbT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFjdGlvbi1idXR0b25zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJyb3ctYnRuXCIgYXBwU3RvcENsaWNrIGFwcEJsdXJDbGlja1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBBMTF5VGl0bGU9XCJ7eyd0b2dnbGVWaXNpYmlsaXR5JyB8IGkxOG59fVwiIChjbGljayk9XCJ0b2dnbGVDYXJkTnVtYmVyKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1sZ1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2ZhLWV5ZSc6ICFzaG93Q2FyZE51bWJlciwgJ2ZhLWV5ZS1zbGFzaCc6IHNob3dDYXJkTnVtYmVyfVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50LXJvd1wiIGFwcEJveFJvdz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJjYXJkQnJhbmRcIj57eydicmFuZCcgfCBpMThufX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBpZD1cImNhcmRCcmFuZFwiIG5hbWU9XCJDYXJkLkJyYW5kXCIgWyhuZ01vZGVsKV09XCJjaXBoZXIuY2FyZC5icmFuZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IG8gb2YgY2FyZEJyYW5kT3B0aW9uc1wiIFtuZ1ZhbHVlXT1cIm8udmFsdWVcIj57e28ubmFtZX19PC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtY29udGVudC1yb3dcIiBhcHBCb3hSb3c+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiY2FyZEV4cE1vbnRoXCI+e3snZXhwaXJhdGlvbk1vbnRoJyB8IGkxOG59fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGlkPVwiY2FyZEV4cE1vbnRoXCIgbmFtZT1cIkNhcmQuRXhwTW9udGhcIiBbKG5nTW9kZWwpXT1cImNpcGhlci5jYXJkLmV4cE1vbnRoXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgbyBvZiBjYXJkRXhwTW9udGhPcHRpb25zXCIgW25nVmFsdWVdPVwiby52YWx1ZVwiPnt7by5uYW1lfX08L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50LXJvd1wiIGFwcEJveFJvdz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJjYXJkRXhwWWVhclwiPnt7J2V4cGlyYXRpb25ZZWFyJyB8IGkxOG59fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9XCJjYXJkRXhwWWVhclwiIHR5cGU9XCJ0ZXh0XCIgbmFtZT1cIkNhcmQuRXhwWWVhclwiIFsobmdNb2RlbCldPVwiY2lwaGVyLmNhcmQuZXhwWWVhclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7eydleCcgfCBpMThufX0ge3tjdXJyZW50RGF0ZSB8IGRhdGU6ICd5eXl5J319XCI+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWNvbnRlbnQtcm93IGJveC1jb250ZW50LXJvdy1mbGV4XCIgYXBwQm94Um93PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdy1tYWluXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImNhcmRDb2RlXCI+e3snc2VjdXJpdHlDb2RlJyB8IGkxOG59fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPVwiY2FyZENvZGVcIiBjbGFzcz1cIm1vbm9zcGFjZWRcIiB0eXBlPVwie3tzaG93Q2FyZENvZGUgPyAndGV4dCcgOiAncGFzc3dvcmQnfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPVwiQ2FyZC5Db2RlXCIgWyhuZ01vZGVsKV09XCJjaXBoZXIuY2FyZC5jb2RlXCIgYXBwSW5wdXRWZXJiYXRpbT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFjdGlvbi1idXR0b25zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJyb3ctYnRuXCIgYXBwU3RvcENsaWNrIGFwcEJsdXJDbGlja1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBBMTF5VGl0bGU9XCJ7eyd0b2dnbGVWaXNpYmlsaXR5JyB8IGkxOG59fVwiIChjbGljayk9XCJ0b2dnbGVDYXJkQ29kZSgpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtbGdcIiBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydmYS1leWUnOiAhc2hvd0NhcmRDb2RlLCAnZmEtZXllLXNsYXNoJzogc2hvd0NhcmRDb2RlfVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8IS0tIElkZW50aXR5IC0tPlxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjaXBoZXIudHlwZSA9PT0gY2lwaGVyVHlwZS5JZGVudGl0eVwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWNvbnRlbnQtcm93XCIgYXBwQm94Um93PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImlkVGl0bGVcIj57eyd0aXRsZScgfCBpMThufX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBpZD1cImlkVGl0bGVcIiBuYW1lPVwiSWRlbnRpdHkuVGl0bGVcIiBbKG5nTW9kZWwpXT1cImNpcGhlci5pZGVudGl0eS50aXRsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IG8gb2YgaWRlbnRpdHlUaXRsZU9wdGlvbnNcIiBbbmdWYWx1ZV09XCJvLnZhbHVlXCI+e3tvLm5hbWV9fTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWNvbnRlbnQtcm93XCIgYXBwQm94Um93PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImlkRmlyc3ROYW1lXCI+e3snZmlyc3ROYW1lJyB8IGkxOG59fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9XCJpZEZpcnN0TmFtZVwiIHR5cGU9XCJ0ZXh0XCIgbmFtZT1cIklkZW50aXR5LkZpcnN0TmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJjaXBoZXIuaWRlbnRpdHkuZmlyc3ROYW1lXCI+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWNvbnRlbnQtcm93XCIgYXBwQm94Um93PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImlkTWlkZGxlTmFtZVwiPnt7J21pZGRsZU5hbWUnIHwgaTE4bn19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD1cImlkTWlkZGxlTmFtZVwiIHR5cGU9XCJ0ZXh0XCIgbmFtZT1cIklkZW50aXR5Lk1pZGRsZU5hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiY2lwaGVyLmlkZW50aXR5Lm1pZGRsZU5hbWVcIj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtY29udGVudC1yb3dcIiBhcHBCb3hSb3c+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiaWRMYXN0TmFtZVwiPnt7J2xhc3ROYW1lJyB8IGkxOG59fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9XCJpZExhc3ROYW1lXCIgdHlwZT1cInRleHRcIiBuYW1lPVwiSWRlbnRpdHkuTGFzdE5hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiY2lwaGVyLmlkZW50aXR5Lmxhc3ROYW1lXCI+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWNvbnRlbnQtcm93XCIgYXBwQm94Um93PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImlkVXNlcm5hbWVcIj57eyd1c2VybmFtZScgfCBpMThufX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPVwiaWRVc2VybmFtZVwiIHR5cGU9XCJ0ZXh0XCIgbmFtZT1cIklkZW50aXR5LlVzZXJuYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImNpcGhlci5pZGVudGl0eS51c2VybmFtZVwiIGFwcElucHV0VmVyYmF0aW0+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWNvbnRlbnQtcm93XCIgYXBwQm94Um93PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImlkQ29tcGFueVwiPnt7J2NvbXBhbnknIHwgaTE4bn19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD1cImlkQ29tcGFueVwiIHR5cGU9XCJ0ZXh0XCIgbmFtZT1cIklkZW50aXR5LkNvbXBhbnlcIiBbKG5nTW9kZWwpXT1cImNpcGhlci5pZGVudGl0eS5jb21wYW55XCI+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWNvbnRlbnQtcm93XCIgYXBwQm94Um93PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImlkU3NuXCI+e3snc3NuJyB8IGkxOG59fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9XCJpZFNzblwiIHR5cGU9XCJ0ZXh0XCIgbmFtZT1cIklkZW50aXR5LlNTTlwiIFsobmdNb2RlbCldPVwiY2lwaGVyLmlkZW50aXR5LnNzblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwSW5wdXRWZXJiYXRpbT5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtY29udGVudC1yb3dcIiBhcHBCb3hSb3c+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiaWRQYXNzcG9ydE51bWJlclwiPnt7J3Bhc3Nwb3J0TnVtYmVyJyB8IGkxOG59fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9XCJpZFBhc3Nwb3J0TnVtYmVyXCIgdHlwZT1cInRleHRcIiBuYW1lPVwiSWRlbnRpdHkuUGFzc3BvcnROdW1iZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiY2lwaGVyLmlkZW50aXR5LnBhc3Nwb3J0TnVtYmVyXCIgYXBwSW5wdXRWZXJiYXRpbT5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtY29udGVudC1yb3dcIiBhcHBCb3hSb3c+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiaWRMaWNlbnNlTnVtYmVyXCI+e3snbGljZW5zZU51bWJlcicgfCBpMThufX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPVwiaWRMaWNlbnNlTnVtYmVyXCIgdHlwZT1cInRleHRcIiBuYW1lPVwiSWRlbnRpdHkuTGljZW5zZU51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJjaXBoZXIuaWRlbnRpdHkubGljZW5zZU51bWJlclwiIGFwcElucHV0VmVyYmF0aW0+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWNvbnRlbnQtcm93XCIgYXBwQm94Um93PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImlkRW1haWxcIj57eydlbWFpbCcgfCBpMThufX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPVwiaWRFbWFpbFwiIHR5cGU9XCJ0ZXh0XCIgbmFtZT1cIklkZW50aXR5LkVtYWlsXCIgWyhuZ01vZGVsKV09XCJjaXBoZXIuaWRlbnRpdHkuZW1haWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcElucHV0VmVyYmF0aW0+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWNvbnRlbnQtcm93XCIgYXBwQm94Um93PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImlkUGhvbmVcIj57eydwaG9uZScgfCBpMThufX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPVwiaWRQaG9uZVwiIHR5cGU9XCJ0ZXh0XCIgbmFtZT1cIklkZW50aXR5LlBob25lXCIgWyhuZ01vZGVsKV09XCJjaXBoZXIuaWRlbnRpdHkucGhvbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtY29udGVudC1yb3dcIiBhcHBCb3hSb3c+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiaWRBZGRyZXNzMVwiPnt7J2FkZHJlc3MxJyB8IGkxOG59fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9XCJpZEFkZHJlc3MxXCIgdHlwZT1cInRleHRcIiBuYW1lPVwiSWRlbnRpdHkuQWRkcmVzczFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiY2lwaGVyLmlkZW50aXR5LmFkZHJlc3MxXCI+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWNvbnRlbnQtcm93XCIgYXBwQm94Um93PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImlkQWRkcmVzczJcIj57eydhZGRyZXNzMicgfCBpMThufX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPVwiaWRBZGRyZXNzMlwiIHR5cGU9XCJ0ZXh0XCIgbmFtZT1cIklkZW50aXR5LkFkZHJlc3MyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImNpcGhlci5pZGVudGl0eS5hZGRyZXNzMlwiPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50LXJvd1wiIGFwcEJveFJvdz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJpZEFkZHJlc3MzXCI+e3snYWRkcmVzczMnIHwgaTE4bn19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD1cImlkQWRkcmVzczNcIiB0eXBlPVwidGV4dFwiIG5hbWU9XCJJZGVudGl0eS5BZGRyZXNzM1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJjaXBoZXIuaWRlbnRpdHkuYWRkcmVzczNcIj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtY29udGVudC1yb3dcIiBhcHBCb3hSb3c+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiaWRDaXR5XCI+e3snY2l0eVRvd24nIHwgaTE4bn19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD1cImlkQ2l0eVwiIHR5cGU9XCJ0ZXh0XCIgbmFtZT1cIklkZW50aXR5LkNpdHlcIiBbKG5nTW9kZWwpXT1cImNpcGhlci5pZGVudGl0eS5jaXR5XCI+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWNvbnRlbnQtcm93XCIgYXBwQm94Um93PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImlkU3RhdGVcIj57eydzdGF0ZVByb3ZpbmNlJyB8IGkxOG59fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9XCJpZFN0YXRlXCIgdHlwZT1cInRleHRcIiBuYW1lPVwiSWRlbnRpdHkuU3RhdGVcIiBbKG5nTW9kZWwpXT1cImNpcGhlci5pZGVudGl0eS5zdGF0ZVwiPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50LXJvd1wiIGFwcEJveFJvdz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJpZFBvc3RhbENvZGVcIj57eyd6aXBQb3N0YWxDb2RlJyB8IGkxOG59fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9XCJpZFBvc3RhbENvZGVcIiB0eXBlPVwidGV4dFwiIG5hbWU9XCJJZGVudGl0eS5Qb3N0YWxDb2RlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImNpcGhlci5pZGVudGl0eS5wb3N0YWxDb2RlXCI+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWNvbnRlbnQtcm93XCIgYXBwQm94Um93PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImlkQ291bnRyeVwiPnt7J2NvdW50cnknIHwgaTE4bn19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD1cImlkQ291bnRyeVwiIHR5cGU9XCJ0ZXh0XCIgbmFtZT1cIklkZW50aXR5LkNvdW50cnlcIiBbKG5nTW9kZWwpXT1cImNpcGhlci5pZGVudGl0eS5jb3VudHJ5XCI+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYm94XCIgKm5nSWY9XCJjaXBoZXIudHlwZSA9PT0gY2lwaGVyVHlwZS5Mb2dpblwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNpcGhlci5sb2dpbi5oYXNVcmlzXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtY29udGVudC1yb3cgYm94LWNvbnRlbnQtcm93LW11bHRpXCIgYXBwQm94Um93XG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgdSBvZiBjaXBoZXIubG9naW4udXJpczsgbGV0IGkgPSBpbmRleDsgdHJhY2tCeTp0cmFja0J5RnVuY3Rpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGFwcFN0b3BDbGljayAoY2xpY2spPVwicmVtb3ZlVXJpKHUpXCIgYXBwQTExeVRpdGxlPVwie3sncmVtb3ZlJyB8IGkxOG59fVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtbWludXMtY2lyY2xlIGZhLWxnXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93LW1haW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwibG9naW5Vcml7e2l9fVwiPnt7J3VyaVBvc2l0aW9uJyB8IGkxOG4gOiAoaSArIDEpfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD1cImxvZ2luVXJpe3tpfX1cIiB0eXBlPVwidGV4dFwiIG5hbWU9XCJMb2dpbi5VcmlzW3t7aX19XS5VcmlcIiBbKG5nTW9kZWwpXT1cInUudXJpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2hpZGRlbl09XCJ1LnNob3dVcmlPcHRpb25zSW5wdXQgPT09IHRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7J2V4JyB8IGkxOG59fSBodHRwczovL2dvb2dsZS5jb21cIiBpbnB1dG1vZGU9XCJ1cmxcIiBhcHBJbnB1dFZlcmJhdGltPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJsb2dpblVyaU1hdGNoe3tpfX1cIiBjbGFzcz1cInNyLW9ubHlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3snY3VycmVudFVyaScgfCBpMThufX0ge3soaSArIDEpfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgKm5nSWY9XCJjdXJyZW50VXJpcyAmJiBjdXJyZW50VXJpcy5sZW5ndGhcIiBpZD1cImN1cnJlbnRVcmlze3tpfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPVwiTG9naW4uVXJpc1t7e2l9fV0uQ3VycmVudFVyaXNcIiBbKG5nTW9kZWwpXT1cInUudXJpXCIgW2hpZGRlbl09XCIhdS5zaG93Q3VycmVudFVyaXNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBbbmdWYWx1ZV09XCJudWxsXCI+LS0ge3snc2VsZWN0JyB8IGkxOG59fSAtLTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCB1IG9mIGN1cnJlbnRVcmlzXCIgW25nVmFsdWVdPVwidVwiPnt7dX19PC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImxvZ2luVXJpTWF0Y2h7e2l9fVwiIGNsYXNzPVwic3Itb25seVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eydtYXRjaERldGVjdGlvbicgfCBpMThufX0ge3soaSArIDEpfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgaWQ9XCJsb2dpblVyaU1hdGNoe3tpfX1cIiBuYW1lPVwiTG9naW4uVXJpc1t7e2l9fV0uTWF0Y2hcIiBbKG5nTW9kZWwpXT1cInUubWF0Y2hcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaGlkZGVuXT1cInUuc2hvd09wdGlvbnMgPT09IGZhbHNlIHx8ICh1LnNob3dPcHRpb25zID09IG51bGwgJiYgdS5tYXRjaCA9PSBudWxsKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwibG9naW5VcmlNYXRjaENoYW5nZWQodSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgbyBvZiB1cmlNYXRjaE9wdGlvbnNcIiBbbmdWYWx1ZV09XCJvLnZhbHVlXCI+e3tvLm5hbWV9fTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWN0aW9uLWJ1dHRvbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAqbmdJZj1cImN1cnJlbnRVcmlzICYmIGN1cnJlbnRVcmlzLmxlbmd0aFwiIGNsYXNzPVwicm93LWJ0blwiIGFwcFN0b3BDbGlja1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBCbHVyQ2xpY2sgYXBwQTExeVRpdGxlPVwie3sndG9nZ2xlQ3VycmVudFVyaXMnIHwgaTE4bn19XCIgKGNsaWNrKT1cInRvZ2dsZVVyaUlucHV0KHUpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIGNsYXNzPVwiZmEgZmEtbGcgZmEtbGlzdFwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInJvdy1idG5cIiBhcHBTdG9wQ2xpY2sgYXBwQmx1ckNsaWNrXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcEExMXlUaXRsZT1cInt7J3RvZ2dsZU9wdGlvbnMnIHwgaTE4bn19XCIgKGNsaWNrKT1cInRvZ2dsZVVyaU9wdGlvbnModSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1sZyBmYS1jb2dcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgYXBwU3RvcENsaWNrIGFwcEJsdXJDbGljayAoY2xpY2spPVwiYWRkVXJpKClcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJveC1jb250ZW50LXJvdyBib3gtY29udGVudC1yb3ctbmV3bXVsdGlcIj5cbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1wbHVzLWNpcmNsZSBmYS1mdyBmYS1sZ1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT4ge3snbmV3VXJpJyB8IGkxOG59fVxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYm94XCIgKm5nSWY9XCJzaG93QXV0b0ZpbGxPblBhZ2VMb2FkT3B0aW9uc1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50LXJvd1wiIGFwcEJveFJvdz5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImF1dG9maWxsT25QYWdlTG9hZFwiPnt7J2l0ZW1BdXRvRmlsbE9uUGFnZUxvYWQnIHwgaTE4bn19IDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgaWQ9XCJhdXRvZmlsbE9uUGFnZUxvYWRcIiBuYW1lPVwiQXV0b2ZpbGxPblBhZ2VMb2FkXCIgWyhuZ01vZGVsKV09XCJjaXBoZXIubG9naW4uYXV0b2ZpbGxPblBhZ2VMb2FkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBvIG9mIGF1dG9maWxsT25QYWdlTG9hZE9wdGlvbnNcIiBbbmdWYWx1ZV09XCJvLnZhbHVlXCI+e3tvLm5hbWV9fTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImJveFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50LXJvd1wiIGFwcEJveFJvdz5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImZvbGRlclwiPnt7J2ZvbGRlcicgfCBpMThufX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGlkPVwiZm9sZGVyXCIgbmFtZT1cIkZvbGRlcklkXCIgWyhuZ01vZGVsKV09XCJjaXBoZXIuZm9sZGVySWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IGYgb2YgZm9sZGVyc1wiIFtuZ1ZhbHVlXT1cImYuaWRcIj57e2YubmFtZX19PC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtY29udGVudC1yb3cgYm94LWNvbnRlbnQtcm93LWNoZWNrYm94XCIgYXBwQm94Um93PlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiZmF2b3JpdGVcIj57eydmYXZvcml0ZScgfCBpMThufX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9XCJmYXZvcml0ZVwiIHR5cGU9XCJjaGVja2JveFwiIG5hbWU9XCJGYXZvcml0ZVwiIFsobmdNb2RlbCldPVwiY2lwaGVyLmZhdm9yaXRlXCI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50LXJvdyBib3gtY29udGVudC1yb3ctY2hlY2tib3hcIiBhcHBCb3hSb3c+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJwYXNzd29yZFByb21wdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sncGFzc3dvcmRQcm9tcHQnIHwgaTE4bn19XG4gICAgICAgICAgICAgICAgICAgICAgICA8YSB0YXJnZXQ9XCJfYmxhbmtcIiByZWw9XCJub29wZW5lclwiIGFwcEExMXlUaXRsZT1cInt7J2xlYXJuTW9yZScgfCBpMThufX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhyZWY9XCJodHRwczovL2JpdHdhcmRlbi5jb20vaGVscC9hcnRpY2xlL21hbmFnaW5nLWl0ZW1zLyNwcm90ZWN0LWluZGl2aWR1YWwtaXRlbXNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXF1ZXN0aW9uLWNpcmNsZS1vXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9XCJwYXNzd29yZFByb21wdFwiIHR5cGU9XCJjaGVja2JveFwiIG5hbWU9XCJQYXNzd29yZFByb21wdFwiIFtuZ01vZGVsXT1cInJlcHJvbXB0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwicmVwcm9tcHRDaGFuZ2VkKClcIj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJveC1jb250ZW50LXJvdyBib3gtY29udGVudC1yb3ctZmxleCB0ZXh0LWRlZmF1bHRcIiBhcHBTdG9wQ2xpY2sgYXBwQmx1ckNsaWNrXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhdHRhY2htZW50cygpXCIgKm5nSWY9XCJlZGl0TW9kZSAmJiBzaG93QXR0YWNobWVudHMgJiYgIWNsb25lTW9kZVwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93LW1haW5cIj57eydhdHRhY2htZW50cycgfCBpMThufX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1leHRlcm5hbC1saW5rIGZhLWxnIGZhLWZ3XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCIgKm5nSWY9XCJvcGVuQXR0YWNobWVudHNJblBvcHVwXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWNoZXZyb24tcmlnaHQgcm93LXN1Yi1pY29uXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCIgKm5nSWY9XCIhb3BlbkF0dGFjaG1lbnRzSW5Qb3B1cFwiPjwvaT5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJveC1jb250ZW50LXJvdyBib3gtY29udGVudC1yb3ctZmxleCB0ZXh0LWRlZmF1bHRcIiBhcHBTdG9wQ2xpY2sgYXBwQmx1ckNsaWNrXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJlZGl0Q29sbGVjdGlvbnMoKVwiICpuZ0lmPVwiZWRpdE1vZGUgJiYgY2lwaGVyLm9yZ2FuaXphdGlvbklkICYmICFjbG9uZU1vZGVcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdy1tYWluXCI+e3snY29sbGVjdGlvbnMnIHwgaTE4bn19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtY2hldnJvbi1yaWdodCByb3ctc3ViLWljb25cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJib3hcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtaGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cIm5vdGVzXCI+e3snbm90ZXMnIHwgaTE4bn19PC9sYWJlbD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50LXJvd1wiIGFwcEJveFJvdz5cbiAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGlkPVwibm90ZXNcIiBuYW1lPVwiTm90ZXNcIiByb3dzPVwiNlwiIFsobmdNb2RlbCldPVwiY2lwaGVyLm5vdGVzXCI+PC90ZXh0YXJlYT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGFwcC12YXVsdC1hZGQtZWRpdC1jdXN0b20tZmllbGRzIFtjaXBoZXJdPVwiY2lwaGVyXCIgW3RoaXNDaXBoZXJUeXBlXT1cImNpcGhlci50eXBlXCIgW2VkaXRNb2RlXT1cImVkaXRNb2RlXCI+XG4gICAgICAgIDwvYXBwLXZhdWx0LWFkZC1lZGl0LWN1c3RvbS1maWVsZHM+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJib3hcIiAqbmdJZj1cImFsbG93T3duZXJzaGlwT3B0aW9ucygpXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWhlYWRlclwiPlxuICAgICAgICAgICAgICAgIHt7J293bmVyc2hpcCcgfCBpMThufX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50LXJvd1wiIGFwcEJveFJvdz5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cIm9yZ2FuaXphdGlvbklkXCI+e3snd2hvT3duc1RoaXNJdGVtJyB8IGkxOG59fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgaWQ9XCJvcmdhbml6YXRpb25JZFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgbmFtZT1cIk9yZ2FuaXphdGlvbklkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiY2lwaGVyLm9yZ2FuaXphdGlvbklkXCIgKGNoYW5nZSk9XCJvcmdhbml6YXRpb25DaGFuZ2VkKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IG8gb2Ygb3duZXJzaGlwT3B0aW9uc1wiIFtuZ1ZhbHVlXT1cIm8udmFsdWVcIj57e28ubmFtZX19PC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYm94XCIgKm5nSWY9XCIoIWVkaXRNb2RlIHx8IGNsb25lTW9kZSApJiYgY2lwaGVyLm9yZ2FuaXphdGlvbklkXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWhlYWRlclwiPlxuICAgICAgICAgICAgICAgIHt7J2NvbGxlY3Rpb25zJyB8IGkxOG59fVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWNvbnRlbnRcIiAqbmdJZj1cIiFjb2xsZWN0aW9ucyB8fCAhY29sbGVjdGlvbnMubGVuZ3RoXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50LXJvdyBwYWRkZWQgbm8taG92ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAge3snbm9Db2xsZWN0aW9uc0luTGlzdCcgfCBpMThufX1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50XCIgKm5nSWY9XCJjb2xsZWN0aW9ucyAmJiBjb2xsZWN0aW9ucy5sZW5ndGhcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWNvbnRlbnQtcm93IGJveC1jb250ZW50LXJvdy1jaGVja2JveFwiICpuZ0Zvcj1cImxldCBjIG9mIGNvbGxlY3Rpb25zOyBsZXQgaSA9IGluZGV4XCJcbiAgICAgICAgICAgICAgICAgICAgYXBwQm94Um93PlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiY29sbGVjdGlvbl97e2l9fVwiPnt7Yy5uYW1lfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9XCJjb2xsZWN0aW9uX3t7aX19XCIgdHlwZT1cImNoZWNrYm94XCIgWyhuZ01vZGVsKV09XCJjLmNoZWNrZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT1cIkNvbGxlY3Rpb25be3tpfX1dLkNoZWNrZWRcIj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImJveCBsaXN0XCIgKm5nSWY9XCJlZGl0TW9kZSAmJiAhY2xvbmVNb2RlXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWNvbnRlbnQgc2luZ2xlLWxpbmVcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJveC1jb250ZW50LXJvd1wiIGFwcFN0b3BDbGljayBhcHBCbHVyQ2xpY2sgKGNsaWNrKT1cImRlbGV0ZSgpXCJcbiAgICAgICAgICAgICAgICAgICAgW2FwcEFwaUFjdGlvbl09XCJkZWxldGVQcm9taXNlXCIgI2RlbGV0ZUJ0bj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdy1tYWluIHRleHQtZGFuZ2VyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaWNvbiB0ZXh0LWRhbmdlclwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtdHJhc2gtbyBmYS1sZyBmYS1md1wiIFtoaWRkZW5dPVwiZGVsZXRlQnRuLmxvYWRpbmdcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1zcGlubmVyIGZhLXNwaW4gZmEtbGcgZmEtZndcIiBbaGlkZGVuXT1cIiFkZWxldGVCdG4ubG9hZGluZ1wiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3snZGVsZXRlSXRlbScgfCBpMThufX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvY29udGVudD5cbjwvZm9ybT5cbiIsImltcG9ydCB7IExvY2F0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENvbXBvbmVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5cbmltcG9ydCB7IGZpcnN0IH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBBcGlTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9hcGkuc2VydmljZSc7XG5pbXBvcnQgeyBDaXBoZXJTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9jaXBoZXIuc2VydmljZSc7XG5pbXBvcnQgeyBDcnlwdG9TZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9jcnlwdG8uc2VydmljZSc7XG5pbXBvcnQgeyBJMThuU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvaTE4bi5zZXJ2aWNlJztcbmltcG9ydCB7IExvZ1NlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL2xvZy5zZXJ2aWNlJztcbmltcG9ydCB7IFBsYXRmb3JtVXRpbHNTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9wbGF0Zm9ybVV0aWxzLnNlcnZpY2UnO1xuaW1wb3J0IHsgVXNlclNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL3VzZXIuc2VydmljZSc7XG5cbmltcG9ydCB7IEF0dGFjaG1lbnRzQ29tcG9uZW50IGFzIEJhc2VBdHRhY2htZW50c0NvbXBvbmVudCB9IGZyb20gJ2pzbGliLWFuZ3VsYXIvY29tcG9uZW50cy9hdHRhY2htZW50cy5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2FwcC12YXVsdC1hdHRhY2htZW50cycsXG4gICAgdGVtcGxhdGVVcmw6ICdhdHRhY2htZW50cy5jb21wb25lbnQuaHRtbCcsXG59KVxuZXhwb3J0IGNsYXNzIEF0dGFjaG1lbnRzQ29tcG9uZW50IGV4dGVuZHMgQmFzZUF0dGFjaG1lbnRzQ29tcG9uZW50IHtcbiAgICBvcGVuZWRBdHRhY2htZW50c0luUG9wdXA6IGJvb2xlYW47XG5cbiAgICBjb25zdHJ1Y3RvcihjaXBoZXJTZXJ2aWNlOiBDaXBoZXJTZXJ2aWNlLCBpMThuU2VydmljZTogSTE4blNlcnZpY2UsXG4gICAgICAgIGNyeXB0b1NlcnZpY2U6IENyeXB0b1NlcnZpY2UsIHVzZXJTZXJ2aWNlOiBVc2VyU2VydmljZSxcbiAgICAgICAgcGxhdGZvcm1VdGlsc1NlcnZpY2U6IFBsYXRmb3JtVXRpbHNTZXJ2aWNlLCBhcGlTZXJ2aWNlOiBBcGlTZXJ2aWNlLCBwcml2YXRlIGxvY2F0aW9uOiBMb2NhdGlvbixcbiAgICAgICAgcHJpdmF0ZSByb3V0ZTogQWN0aXZhdGVkUm91dGUsIGxvZ1NlcnZpY2U6IExvZ1NlcnZpY2UpIHtcbiAgICAgICAgc3VwZXIoY2lwaGVyU2VydmljZSwgaTE4blNlcnZpY2UsIGNyeXB0b1NlcnZpY2UsIHVzZXJTZXJ2aWNlLCBwbGF0Zm9ybVV0aWxzU2VydmljZSwgYXBpU2VydmljZSwgd2luZG93LFxuICAgICAgICAgICAgbG9nU2VydmljZSk7XG4gICAgfVxuXG4gICAgYXN5bmMgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMucm91dGUucXVlcnlQYXJhbXMucGlwZShmaXJzdCgpKS5zdWJzY3JpYmUoYXN5bmMgcGFyYW1zID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2lwaGVySWQgPSBwYXJhbXMuY2lwaGVySWQ7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmluaXQoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5vcGVuZWRBdHRhY2htZW50c0luUG9wdXAgPSBoaXN0b3J5Lmxlbmd0aCA9PT0gMTtcbiAgICB9XG5cbiAgICBiYWNrKCkge1xuICAgICAgICB0aGlzLmxvY2F0aW9uLmJhY2soKTtcbiAgICB9XG5cbiAgICBjbG9zZSgpIHtcbiAgICAgICAgd2luZG93LmNsb3NlKCk7XG4gICAgfVxufVxuIiwiPGZvcm0gI2Zvcm0gKG5nU3VibWl0KT1cInN1Ym1pdCgpXCIgW2FwcEFwaUFjdGlvbl09XCJmb3JtUHJvbWlzZVwiPlxuICAgIDxoZWFkZXI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJsZWZ0XCI+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBhcHBCbHVyQ2xpY2sgKGNsaWNrKT1cImNsb3NlKClcIiAqbmdJZj1cIm9wZW5lZEF0dGFjaG1lbnRzSW5Qb3B1cFwiPlxuICAgICAgICAgICAgICAgIHt7J2Nsb3NlJyB8IGkxOG59fVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBhcHBCbHVyQ2xpY2sgKGNsaWNrKT1cImJhY2soKVwiICpuZ0lmPVwiIW9wZW5lZEF0dGFjaG1lbnRzSW5Qb3B1cFwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaGVhZGVyLWljb25cIj48aSBjbGFzcz1cImZhIGZhLWNoZXZyb24tbGVmdFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT48L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4+e3snYmFjaycgfCBpMThufX08L3NwYW4+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjZW50ZXJcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGl0bGVcIj57eydhdHRhY2htZW50cycgfCBpMThufX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwicmlnaHRcIj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cInN1Ym1pdFwiIGFwcEJsdXJDbGljayBbZGlzYWJsZWRdPVwiZm9ybS5sb2FkaW5nXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gW2hpZGRlbl09XCJmb3JtLmxvYWRpbmdcIj57eydzYXZlJyB8IGkxOG59fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXNwaW5uZXIgZmEtbGcgZmEtc3BpblwiIFtoaWRkZW5dPVwiIWZvcm0ubG9hZGluZ1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2hlYWRlcj5cbiAgICA8Y29udGVudD5cbiAgICAgICAgPGRpdiBjbGFzcz1cImJveFwiICpuZ0lmPVwiY2lwaGVyICYmIGNpcGhlci5oYXNBdHRhY2htZW50c1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50IG5vLWhvdmVyXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50LXJvdyBib3gtY29udGVudC1yb3ctZmxleFwiICpuZ0Zvcj1cImxldCBhIG9mIGNpcGhlci5hdHRhY2htZW50c1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93LW1haW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7YS5maWxlTmFtZX19XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJyb3ctc3ViLWxhYmVsXCI+e3thLnNpemVOYW1lfX08L3NtYWxsPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWN0aW9uLWJ1dHRvbnMgbm8tcGFkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInJvdy1idG4gYnRuXCIgdHlwZT1cImJ1dHRvblwiIGFwcFN0b3BDbGljayBhcHBCbHVyQ2xpY2tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBBMTF5VGl0bGU9XCJ7eydkZWxldGVBdHRhY2htZW50JyB8IGkxOG59fVwiIChjbGljayk9XCJkZWxldGUoYSlcIiAjZGVsZXRlQnRuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2FwcEFwaUFjdGlvbl09XCJkZWxldGVQcm9taXNlc1thLmlkXVwiIFtkaXNhYmxlZF09XCJkZWxldGVCdG4ubG9hZGluZ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtdHJhc2gtbyBmYS1sZyBmYS1md1wiIFtoaWRkZW5dPVwiZGVsZXRlQnRuLmxvYWRpbmdcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1zcGlubmVyIGZhLXNwaW4gZmEtbGcgZmEtZndcIiBbaGlkZGVuXT1cIiFkZWxldGVCdG4ubG9hZGluZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImJveFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1oZWFkZXJcIj5cbiAgICAgICAgICAgICAgICB7eyduZXdBdHRhY2htZW50JyB8IGkxOG59fVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWNvbnRlbnQgbm8taG92ZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWNvbnRlbnQtcm93XCI+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJmaWxlXCI+e3snZmlsZScgfCBpMThufX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImZpbGVcIiBpZD1cImZpbGVcIiBuYW1lPVwiZmlsZVwiIHJlcXVpcmVkPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWZvb3RlclwiPlxuICAgICAgICAgICAgICAgIHt7J21heEZpbGVTaXplJyB8IGkxOG59fVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvY29udGVudD5cbjwvZm9ybT5cbiIsImltcG9ydCB7IExvY2F0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQ29tcG9uZW50LFxuICAgIE5nWm9uZSxcbiAgICBPbkRlc3Ryb3ksXG4gICAgT25Jbml0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gICAgQWN0aXZhdGVkUm91dGUsXG4gICAgUm91dGVyLFxufSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuXG5pbXBvcnQgeyBmaXJzdCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgQnJvd3NlckFwaSB9IGZyb20gJy4uLy4uL2Jyb3dzZXIvYnJvd3NlckFwaSc7XG5cbmltcG9ydCB7IENpcGhlclNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL2NpcGhlci5zZXJ2aWNlJztcbmltcG9ydCB7IENvbGxlY3Rpb25TZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9jb2xsZWN0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgRm9sZGVyU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvZm9sZGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgSTE4blNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL2kxOG4uc2VydmljZSc7XG5pbXBvcnQgeyBQbGF0Zm9ybVV0aWxzU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvcGxhdGZvcm1VdGlscy5zZXJ2aWNlJztcbmltcG9ydCB7IFNlYXJjaFNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL3NlYXJjaC5zZXJ2aWNlJztcbmltcG9ydCB7IFN0YXRlU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvc3RhdGUuc2VydmljZSc7XG5cbmltcG9ydCB7IENpcGhlclR5cGUgfSBmcm9tICdqc2xpYi1jb21tb24vZW51bXMvY2lwaGVyVHlwZSc7XG5cbmltcG9ydCB7IENpcGhlclZpZXcgfSBmcm9tICdqc2xpYi1jb21tb24vbW9kZWxzL3ZpZXcvY2lwaGVyVmlldyc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uVmlldyB9IGZyb20gJ2pzbGliLWNvbW1vbi9tb2RlbHMvdmlldy9jb2xsZWN0aW9uVmlldyc7XG5pbXBvcnQgeyBGb2xkZXJWaWV3IH0gZnJvbSAnanNsaWItY29tbW9uL21vZGVscy92aWV3L2ZvbGRlclZpZXcnO1xuXG5pbXBvcnQgeyBUcmVlTm9kZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9tb2RlbHMvZG9tYWluL3RyZWVOb2RlJztcblxuaW1wb3J0IHsgQnJvYWRjYXN0ZXJTZXJ2aWNlIH0gZnJvbSAnanNsaWItYW5ndWxhci9zZXJ2aWNlcy9icm9hZGNhc3Rlci5zZXJ2aWNlJztcblxuaW1wb3J0IHsgQ2lwaGVyc0NvbXBvbmVudCBhcyBCYXNlQ2lwaGVyc0NvbXBvbmVudCB9IGZyb20gJ2pzbGliLWFuZ3VsYXIvY29tcG9uZW50cy9jaXBoZXJzLmNvbXBvbmVudCc7XG5cbmltcG9ydCB7IFBvcHVwVXRpbHNTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvcG9wdXAtdXRpbHMuc2VydmljZSc7XG5cbmNvbnN0IENvbXBvbmVudElkID0gJ0NpcGhlcnNDb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2FwcC12YXVsdC1jaXBoZXJzJyxcbiAgICB0ZW1wbGF0ZVVybDogJ2NpcGhlcnMuY29tcG9uZW50Lmh0bWwnLFxufSlcbmV4cG9ydCBjbGFzcyBDaXBoZXJzQ29tcG9uZW50IGV4dGVuZHMgQmFzZUNpcGhlcnNDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gICAgZ3JvdXBpbmdUaXRsZTogc3RyaW5nO1xuICAgIHN0YXRlOiBhbnk7XG4gICAgZm9sZGVySWQ6IHN0cmluZyA9IG51bGw7XG4gICAgY29sbGVjdGlvbklkOiBzdHJpbmcgPSBudWxsO1xuICAgIHR5cGU6IENpcGhlclR5cGUgPSBudWxsO1xuICAgIG5lc3RlZEZvbGRlcnM6IFRyZWVOb2RlPEZvbGRlclZpZXc+W107XG4gICAgbmVzdGVkQ29sbGVjdGlvbnM6IFRyZWVOb2RlPENvbGxlY3Rpb25WaWV3PltdO1xuICAgIHNlYXJjaFR5cGVTZWFyY2ggPSBmYWxzZTtcblxuICAgIHByaXZhdGUgc2VsZWN0ZWRUaW1lb3V0OiBudW1iZXI7XG4gICAgcHJpdmF0ZSBwcmV2ZW50U2VsZWN0ZWQgPSBmYWxzZTtcbiAgICBwcml2YXRlIGFwcGx5U2F2ZWRTdGF0ZSA9IHRydWU7XG4gICAgcHJpdmF0ZSBzY3JvbGxpbmdDb250YWluZXIgPSAnY2RrLXZpcnR1YWwtc2Nyb2xsLXZpZXdwb3J0JztcblxuICAgIGNvbnN0cnVjdG9yKHNlYXJjaFNlcnZpY2U6IFNlYXJjaFNlcnZpY2UsIHByaXZhdGUgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgICAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLCBwcml2YXRlIGxvY2F0aW9uOiBMb2NhdGlvbixcbiAgICAgICAgcHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZSwgcHJpdmF0ZSBicm9hZGNhc3RlclNlcnZpY2U6IEJyb2FkY2FzdGVyU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBjaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsIHByaXZhdGUgc3RhdGVTZXJ2aWNlOiBTdGF0ZVNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgcG9wdXBVdGlsczogUG9wdXBVdGlsc1NlcnZpY2UsIHByaXZhdGUgaTE4blNlcnZpY2U6IEkxOG5TZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGZvbGRlclNlcnZpY2U6IEZvbGRlclNlcnZpY2UsIHByaXZhdGUgY29sbGVjdGlvblNlcnZpY2U6IENvbGxlY3Rpb25TZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHBsYXRmb3JtVXRpbHNTZXJ2aWNlOiBQbGF0Zm9ybVV0aWxzU2VydmljZSwgcHJpdmF0ZSBjaXBoZXJTZXJ2aWNlOiBDaXBoZXJTZXJ2aWNlKSB7XG4gICAgICAgIHN1cGVyKHNlYXJjaFNlcnZpY2UpO1xuICAgICAgICB0aGlzLmFwcGx5U2F2ZWRTdGF0ZSA9ICh3aW5kb3cgYXMgYW55KS5wcmV2aW91c1BvcHVwVXJsICE9IG51bGwgJiZcbiAgICAgICAgICAgICEod2luZG93IGFzIGFueSkucHJldmlvdXNQb3B1cFVybC5zdGFydHNXaXRoKCcvY2lwaGVycycpO1xuICAgIH1cblxuICAgIGFzeW5jIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLnNlYXJjaFR5cGVTZWFyY2ggPSAhdGhpcy5wbGF0Zm9ybVV0aWxzU2VydmljZS5pc1NhZmFyaSgpO1xuICAgICAgICB0aGlzLnJvdXRlLnF1ZXJ5UGFyYW1zLnBpcGUoZmlyc3QoKSkuc3Vic2NyaWJlKGFzeW5jIHBhcmFtcyA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5hcHBseVNhdmVkU3RhdGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gKGF3YWl0IHRoaXMuc3RhdGVTZXJ2aWNlLmdldDxhbnk+KENvbXBvbmVudElkKSkgfHwge307XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc3RhdGUuc2VhcmNoVGV4dCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaFRleHQgPSB0aGlzLnN0YXRlLnNlYXJjaFRleHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocGFyYW1zLmRlbGV0ZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmdyb3VwaW5nVGl0bGUgPSB0aGlzLmkxOG5TZXJ2aWNlLnQoJ3RyYXNoJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWFyY2hQbGFjZWhvbGRlciA9IHRoaXMuaTE4blNlcnZpY2UudCgnc2VhcmNoVHJhc2gnKTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmxvYWQobnVsbCwgdHJ1ZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHBhcmFtcy50eXBlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWFyY2hQbGFjZWhvbGRlciA9IHRoaXMuaTE4blNlcnZpY2UudCgnc2VhcmNoVHlwZScpO1xuICAgICAgICAgICAgICAgIHRoaXMudHlwZSA9IHBhcnNlSW50KHBhcmFtcy50eXBlLCBudWxsKTtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMudHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIENpcGhlclR5cGUuTG9naW46XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdyb3VwaW5nVGl0bGUgPSB0aGlzLmkxOG5TZXJ2aWNlLnQoJ2xvZ2lucycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgQ2lwaGVyVHlwZS5DYXJkOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ncm91cGluZ1RpdGxlID0gdGhpcy5pMThuU2VydmljZS50KCdjYXJkcycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgQ2lwaGVyVHlwZS5JZGVudGl0eTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ3JvdXBpbmdUaXRsZSA9IHRoaXMuaTE4blNlcnZpY2UudCgnaWRlbnRpdGllcycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgQ2lwaGVyVHlwZS5TZWN1cmVOb3RlOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ncm91cGluZ1RpdGxlID0gdGhpcy5pMThuU2VydmljZS50KCdzZWN1cmVOb3RlcycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5sb2FkKGMgPT4gYy50eXBlID09PSB0aGlzLnR5cGUpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJhbXMuZm9sZGVySWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZvbGRlcklkID0gcGFyYW1zLmZvbGRlcklkID09PSAnbm9uZScgPyBudWxsIDogcGFyYW1zLmZvbGRlcklkO1xuICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoUGxhY2Vob2xkZXIgPSB0aGlzLmkxOG5TZXJ2aWNlLnQoJ3NlYXJjaEZvbGRlcicpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmZvbGRlcklkICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZm9sZGVyTm9kZSA9IGF3YWl0IHRoaXMuZm9sZGVyU2VydmljZS5nZXROZXN0ZWQodGhpcy5mb2xkZXJJZCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmb2xkZXJOb2RlICE9IG51bGwgJiYgZm9sZGVyTm9kZS5ub2RlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ3JvdXBpbmdUaXRsZSA9IGZvbGRlck5vZGUubm9kZS5uYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5uZXN0ZWRGb2xkZXJzID0gZm9sZGVyTm9kZS5jaGlsZHJlbiAhPSBudWxsICYmIGZvbGRlck5vZGUuY2hpbGRyZW4ubGVuZ3RoID4gMCA/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9sZGVyTm9kZS5jaGlsZHJlbiA6IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmdyb3VwaW5nVGl0bGUgPSB0aGlzLmkxOG5TZXJ2aWNlLnQoJ25vbmVGb2xkZXInKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5sb2FkKGMgPT4gYy5mb2xkZXJJZCA9PT0gdGhpcy5mb2xkZXJJZCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHBhcmFtcy5jb2xsZWN0aW9uSWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbGxlY3Rpb25JZCA9IHBhcmFtcy5jb2xsZWN0aW9uSWQ7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWFyY2hQbGFjZWhvbGRlciA9IHRoaXMuaTE4blNlcnZpY2UudCgnc2VhcmNoQ29sbGVjdGlvbicpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbGxlY3Rpb25Ob2RlID0gYXdhaXQgdGhpcy5jb2xsZWN0aW9uU2VydmljZS5nZXROZXN0ZWQodGhpcy5jb2xsZWN0aW9uSWQpO1xuICAgICAgICAgICAgICAgIGlmIChjb2xsZWN0aW9uTm9kZSAhPSBudWxsICYmIGNvbGxlY3Rpb25Ob2RlLm5vZGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmdyb3VwaW5nVGl0bGUgPSBjb2xsZWN0aW9uTm9kZS5ub2RlLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubmVzdGVkQ29sbGVjdGlvbnMgPSBjb2xsZWN0aW9uTm9kZS5jaGlsZHJlbiAhPSBudWxsICYmIGNvbGxlY3Rpb25Ob2RlLmNoaWxkcmVuLmxlbmd0aCA+IDAgP1xuICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdGlvbk5vZGUuY2hpbGRyZW4gOiBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmxvYWQoYyA9PiBjLmNvbGxlY3Rpb25JZHMgIT0gbnVsbCAmJiBjLmNvbGxlY3Rpb25JZHMuaW5kZXhPZih0aGlzLmNvbGxlY3Rpb25JZCkgPiAtMSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuZ3JvdXBpbmdUaXRsZSA9IHRoaXMuaTE4blNlcnZpY2UudCgnYWxsSXRlbXMnKTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmxvYWQoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuYXBwbHlTYXZlZFN0YXRlICYmIHRoaXMuc3RhdGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHRoaXMucG9wdXBVdGlscy5zZXRDb250ZW50U2Nyb2xsWSh3aW5kb3csIHRoaXMuc3RhdGUuc2Nyb2xsWSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxpbmdDb250YWluZXIpLCAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnJlbW92ZShDb21wb25lbnRJZCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuYnJvYWRjYXN0ZXJTZXJ2aWNlLnN1YnNjcmliZShDb21wb25lbnRJZCwgKG1lc3NhZ2U6IGFueSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKG1lc3NhZ2UuY29tbWFuZCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdzeW5jQ29tcGxldGVkJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLnN1Y2Nlc3NmdWxseSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgNTAwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMuc2F2ZVN0YXRlKCk7XG4gICAgICAgIHRoaXMuYnJvYWRjYXN0ZXJTZXJ2aWNlLnVuc3Vic2NyaWJlKENvbXBvbmVudElkKTtcbiAgICB9XG5cbiAgICBzZWxlY3RDaXBoZXIoY2lwaGVyOiBDaXBoZXJWaWV3KSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRUaW1lb3V0ID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLnByZXZlbnRTZWxlY3RlZCkge1xuICAgICAgICAgICAgICAgIHN1cGVyLnNlbGVjdENpcGhlcihjaXBoZXIpO1xuICAgICAgICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL3ZpZXctY2lwaGVyJ10sIHsgcXVlcnlQYXJhbXM6IHsgY2lwaGVySWQ6IGNpcGhlci5pZCB9IH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5wcmV2ZW50U2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgfSwgMjAwKTtcbiAgICB9XG5cbiAgICBzZWxlY3RGb2xkZXIoZm9sZGVyOiBGb2xkZXJWaWV3KSB7XG4gICAgICAgIGlmIChmb2xkZXIuaWQgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvY2lwaGVycyddLCB7IHF1ZXJ5UGFyYW1zOiB7IGZvbGRlcklkOiBmb2xkZXIuaWQgfSB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNlbGVjdENvbGxlY3Rpb24oY29sbGVjdGlvbjogQ29sbGVjdGlvblZpZXcpIHtcbiAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvY2lwaGVycyddLCB7IHF1ZXJ5UGFyYW1zOiB7IGNvbGxlY3Rpb25JZDogY29sbGVjdGlvbi5pZCB9IH0pO1xuICAgIH1cblxuICAgIGFzeW5jIGxhdW5jaENpcGhlcihjaXBoZXI6IENpcGhlclZpZXcpIHtcbiAgICAgICAgaWYgKGNpcGhlci50eXBlICE9PSBDaXBoZXJUeXBlLkxvZ2luIHx8ICFjaXBoZXIubG9naW4uY2FuTGF1bmNoKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZFRpbWVvdXQgIT0gbnVsbCkge1xuICAgICAgICAgICAgd2luZG93LmNsZWFyVGltZW91dCh0aGlzLnNlbGVjdGVkVGltZW91dCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wcmV2ZW50U2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICBhd2FpdCB0aGlzLmNpcGhlclNlcnZpY2UudXBkYXRlTGFzdExhdW5jaGVkRGF0ZShjaXBoZXIuaWQpO1xuICAgICAgICBCcm93c2VyQXBpLmNyZWF0ZU5ld1RhYihjaXBoZXIubG9naW4ubGF1bmNoVXJpKTtcbiAgICAgICAgaWYgKHRoaXMucG9wdXBVdGlscy5pblBvcHVwKHdpbmRvdykpIHtcbiAgICAgICAgICAgIEJyb3dzZXJBcGkuY2xvc2VQb3B1cCh3aW5kb3cpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYWRkQ2lwaGVyKCkge1xuICAgICAgICBpZiAodGhpcy5kZWxldGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgc3VwZXIuYWRkQ2lwaGVyKCk7XG4gICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL2FkZC1jaXBoZXInXSwge1xuICAgICAgICAgICAgcXVlcnlQYXJhbXM6IHtcbiAgICAgICAgICAgICAgICBmb2xkZXJJZDogdGhpcy5mb2xkZXJJZCxcbiAgICAgICAgICAgICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgICAgICAgICAgICAgY29sbGVjdGlvbklkOiB0aGlzLmNvbGxlY3Rpb25JZCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGJhY2soKSB7XG4gICAgICAgICh3aW5kb3cgYXMgYW55KS5yb3V0ZURpcmVjdGlvbiA9ICdiJztcbiAgICAgICAgdGhpcy5sb2NhdGlvbi5iYWNrKCk7XG4gICAgfVxuXG4gICAgc2hvd0dyb3VwaW5ncygpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLmlzU2VhcmNoaW5nKCkgJiZcbiAgICAgICAgICAgICgodGhpcy5uZXN0ZWRGb2xkZXJzICYmIHRoaXMubmVzdGVkRm9sZGVycy5sZW5ndGgpIHx8XG4gICAgICAgICAgICAgICAgKHRoaXMubmVzdGVkQ29sbGVjdGlvbnMgJiYgdGhpcy5uZXN0ZWRDb2xsZWN0aW9ucy5sZW5ndGgpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHNhdmVTdGF0ZSgpIHtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgICAgICAgIHNjcm9sbFk6IHRoaXMucG9wdXBVdGlscy5nZXRDb250ZW50U2Nyb2xsWSh3aW5kb3csIHRoaXMuc2Nyb2xsaW5nQ29udGFpbmVyKSxcbiAgICAgICAgICAgIHNlYXJjaFRleHQ6IHRoaXMuc2VhcmNoVGV4dCxcbiAgICAgICAgfTtcbiAgICAgICAgYXdhaXQgdGhpcy5zdGF0ZVNlcnZpY2Uuc2F2ZShDb21wb25lbnRJZCwgdGhpcy5zdGF0ZSk7XG4gICAgfVxufVxuIiwiPGhlYWRlcj5cbiAgICA8ZGl2IGNsYXNzPVwibGVmdFwiPlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBhcHBCbHVyQ2xpY2sgKGNsaWNrKT1cImJhY2soKVwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJoZWFkZXItaWNvblwiPjxpIGNsYXNzPVwiZmEgZmEtY2hldnJvbi1sZWZ0XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPjwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuPnt7J2JhY2snIHwgaTE4bn19PC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwic2VhcmNoXCI+XG4gICAgICAgIDxpbnB1dCB0eXBlPVwie3tzZWFyY2hUeXBlU2VhcmNoID8gJ3NlYXJjaCcgOiAndGV4dCd9fVwiXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7c2VhcmNoUGxhY2Vob2xkZXIgfHwgKCdzZWFyY2hWYXVsdCcgfCBpMThuKX19XCIgaWQ9XCJzZWFyY2hcIiBbKG5nTW9kZWwpXT1cInNlYXJjaFRleHRcIlxuICAgICAgICAgICAgKGlucHV0KT1cInNlYXJjaCgyMDApXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgYXBwQXV0b2ZvY3VzPlxuICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXNlYXJjaFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwicmlnaHRcIj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgYXBwQmx1ckNsaWNrIChjbGljayk9XCJhZGRDaXBoZXIoKVwiIGFwcEExMXlUaXRsZT1cInt7J2FkZEl0ZW0nIHwgaTE4bn19XCI+XG4gICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXBsdXMgZmEtbGcgZmEtZndcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuPC9oZWFkZXI+XG48Y29udGVudCBbbmdDbGFzc109XCJ7J3N0YWNrZWQtYm94ZXMnOiBzaG93R3JvdXBpbmdzKCl9XCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNob3dHcm91cGluZ3MoKVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYm94IGxpc3RcIiAqbmdJZj1cIm5lc3RlZEZvbGRlcnMgJiYgbmVzdGVkRm9sZGVycy5sZW5ndGhcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtaGVhZGVyXCI+XG4gICAgICAgICAgICAgICAge3snZm9sZGVycycgfCBpMThufX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50IHNpbmdsZS1saW5lXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKm5nRm9yPVwibGV0IGYgb2YgbmVzdGVkRm9sZGVyc1wiIGNsYXNzPVwiYm94LWNvbnRlbnQtcm93XCIgYXBwU3RvcENsaWNrIGFwcEJsdXJDbGlja1xuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0Rm9sZGVyKGYubm9kZSlcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdy1tYWluXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaWNvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtZncgZmEtbGdcIiBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2ZhLWZvbGRlci1vcGVuJzogZi5ub2RlLmlkLCAnZmEtZm9sZGVyLW9wZW4tbyc6ICFmLm5vZGUuaWR9XCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHRcIj57e2Yubm9kZS5uYW1lfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj48aSBjbGFzcz1cImZhIGZhLWNoZXZyb24tcmlnaHQgZmEtbGcgcm93LXN1Yi1pY29uXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImJveCBsaXN0XCIgKm5nSWY9XCJuZXN0ZWRDb2xsZWN0aW9ucyAmJiBuZXN0ZWRDb2xsZWN0aW9ucy5sZW5ndGhcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtaGVhZGVyXCI+XG4gICAgICAgICAgICAgICAge3snY29sbGVjdGlvbnMnIHwgaTE4bn19XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtY29udGVudCBzaW5nbGUtbGluZVwiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiICpuZ0Zvcj1cImxldCBjIG9mIG5lc3RlZENvbGxlY3Rpb25zXCIgY2xhc3M9XCJib3gtY29udGVudC1yb3dcIiBhcHBTdG9wQ2xpY2sgYXBwQmx1ckNsaWNrXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RDb2xsZWN0aW9uKGMubm9kZSlcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdy1tYWluXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaWNvblwiPjxpIGNsYXNzPVwiZmEgZmEtZncgZmEtbGcgZmEtY3ViZVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dFwiPnt7Yy5ub2RlLm5hbWV9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPjxpIGNsYXNzPVwiZmEgZmEtY2hldnJvbi1yaWdodCBmYS1sZyByb3ctc3ViLWljb25cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjaXBoZXJzXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJuby1pdGVtc1wiICpuZ0lmPVwiIWNpcGhlcnMubGVuZ3RoXCI+XG4gICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXNwaW5uZXIgZmEtc3BpbiBmYS0zeFwiICpuZ0lmPVwiIWxvYWRlZFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJsb2FkZWRcIj5cbiAgICAgICAgICAgICAgICA8cD57eydub0l0ZW1zSW5MaXN0JyB8IGkxOG59fTwvcD5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiYWRkQ2lwaGVyKClcIiBjbGFzcz1cImJ0biBibG9jayBwcmltYXJ5IGxpbmtcIj5cbiAgICAgICAgICAgICAgICAgICAge3snYWRkSXRlbScgfCBpMThufX1cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGNkay12aXJ0dWFsLXNjcm9sbC12aWV3cG9ydCBpdGVtU2l6ZT1cIjQ2XCIgbWluQnVmZmVyUHg9XCI0MDBcIiBtYXhCdWZmZXJQeD1cIjYwMFwiICpuZ0lmPVwiY2lwaGVycy5sZW5ndGhcIlxuICAgICAgICAgICAgI3ZpcnR1YWxTY3JvbGxWaWV3cG9ydD5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3ggbGlzdCBvbmx5LWxpc3RcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWhlYWRlclwiPlxuICAgICAgICAgICAgICAgICAgICB7e2dyb3VwaW5nVGl0bGV9fVxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZsZXgtcmlnaHRcIj57e2lzU2VhcmNoaW5nKCkgPyBjaXBoZXJzLmxlbmd0aCA6IGNpcGhlcnMubGVuZ3RofX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgIDxhcHAtY2lwaGVyLXJvdyAqY2RrVmlydHVhbEZvcj1cImxldCBjIG9mIGNpcGhlcnNcIiBbY2lwaGVyXT1cImNcIiB0aXRsZT1cInt7J3ZpZXdJdGVtJyB8IGkxOG59fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAob25TZWxlY3RlZCk9XCJzZWxlY3RDaXBoZXIoJGV2ZW50KVwiIChsYXVuY2hFdmVudCk9XCJsYXVuY2hDaXBoZXIoJGV2ZW50KVwiPjwvYXBwLWNpcGhlci1yb3c+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9jZGstdmlydHVhbC1zY3JvbGwtdmlld3BvcnQ+XG4gICAgPC9uZy1jb250YWluZXI+XG48L2NvbnRlbnQ+XG4iLCJpbXBvcnQgeyBMb2NhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IGZpcnN0IH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBDaXBoZXJTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9jaXBoZXIuc2VydmljZSc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvY29sbGVjdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IEkxOG5TZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9pMThuLnNlcnZpY2UnO1xuaW1wb3J0IHsgTG9nU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvbG9nLnNlcnZpY2UnO1xuaW1wb3J0IHsgUGxhdGZvcm1VdGlsc1NlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL3BsYXRmb3JtVXRpbHMuc2VydmljZSc7XG5cbmltcG9ydCB7IENvbGxlY3Rpb25zQ29tcG9uZW50IGFzIEJhc2VDb2xsZWN0aW9uc0NvbXBvbmVudCB9IGZyb20gJ2pzbGliLWFuZ3VsYXIvY29tcG9uZW50cy9jb2xsZWN0aW9ucy5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2FwcC12YXVsdC1jb2xsZWN0aW9ucycsXG4gICAgdGVtcGxhdGVVcmw6ICdjb2xsZWN0aW9ucy5jb21wb25lbnQuaHRtbCcsXG59KVxuZXhwb3J0IGNsYXNzIENvbGxlY3Rpb25zQ29tcG9uZW50IGV4dGVuZHMgQmFzZUNvbGxlY3Rpb25zQ29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3Rvcihjb2xsZWN0aW9uU2VydmljZTogQ29sbGVjdGlvblNlcnZpY2UsIHBsYXRmb3JtVXRpbHNTZXJ2aWNlOiBQbGF0Zm9ybVV0aWxzU2VydmljZSxcbiAgICAgICAgaTE4blNlcnZpY2U6IEkxOG5TZXJ2aWNlLCBjaXBoZXJTZXJ2aWNlOiBDaXBoZXJTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSwgcHJpdmF0ZSBsb2NhdGlvbjogTG9jYXRpb24sXG4gICAgICAgIGxvZ1NlcnZpY2U6IExvZ1NlcnZpY2UpIHtcbiAgICAgICAgc3VwZXIoY29sbGVjdGlvblNlcnZpY2UsIHBsYXRmb3JtVXRpbHNTZXJ2aWNlLCBpMThuU2VydmljZSwgY2lwaGVyU2VydmljZSwgbG9nU2VydmljZSk7XG4gICAgfVxuXG4gICAgYXN5bmMgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMub25TYXZlZENvbGxlY3Rpb25zLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmJhY2soKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMucm91dGUucXVlcnlQYXJhbXMucGlwZShmaXJzdCgpKS5zdWJzY3JpYmUoYXN5bmMgcGFyYW1zID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2lwaGVySWQgPSBwYXJhbXMuY2lwaGVySWQ7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmxvYWQoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgYmFjaygpIHtcbiAgICAgICAgdGhpcy5sb2NhdGlvbi5iYWNrKCk7XG4gICAgfVxufVxuIiwiPGZvcm0gI2Zvcm0gKG5nU3VibWl0KT1cInN1Ym1pdCgpXCIgW2FwcEFwaUFjdGlvbl09XCJmb3JtUHJvbWlzZVwiPlxuICAgIDxoZWFkZXI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJsZWZ0XCI+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBhcHBCbHVyQ2xpY2sgKGNsaWNrKT1cImJhY2soKVwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaGVhZGVyLWljb25cIj48aSBjbGFzcz1cImZhIGZhLWNoZXZyb24tbGVmdFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT48L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4+e3snYmFjaycgfCBpMThufX08L3NwYW4+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjZW50ZXJcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGl0bGVcIj57eydjb2xsZWN0aW9ucycgfCBpMThufX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwicmlnaHRcIj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cInN1Ym1pdFwiIGFwcEJsdXJDbGljayBbZGlzYWJsZWRdPVwiZm9ybS5sb2FkaW5nXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gW2hpZGRlbl09XCJmb3JtLmxvYWRpbmdcIj57eydzYXZlJyB8IGkxOG59fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXNwaW5uZXIgZmEtbGcgZmEtc3BpblwiIFtoaWRkZW5dPVwiIWZvcm0ubG9hZGluZ1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2hlYWRlcj5cbiAgICA8Y29udGVudD5cbiAgICAgICAgPGRpdiBjbGFzcz1cImJveFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50XCIgKm5nSWY9XCIhY29sbGVjdGlvbnMgfHwgIWNvbGxlY3Rpb25zLmxlbmd0aFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtY29udGVudC1yb3cgcGFkZGVkIG5vLWhvdmVyXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7J25vQ29sbGVjdGlvbnNJbkxpc3QnIHwgaTE4bn19XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtY29udGVudFwiICpuZ0lmPVwiY29sbGVjdGlvbnMgJiYgY29sbGVjdGlvbnMubGVuZ3RoXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50LXJvdyBib3gtY29udGVudC1yb3ctY2hlY2tib3hcIiAqbmdGb3I9XCJsZXQgYyBvZiBjb2xsZWN0aW9uczsgbGV0IGkgPSBpbmRleFwiXG4gICAgICAgICAgICAgICAgICAgIGFwcEJveFJvdz5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImNvbGxlY3Rpb25fe3tpfX1cIj57e2MubmFtZX19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPVwiY29sbGVjdGlvbl97e2l9fVwiIHR5cGU9XCJjaGVja2JveFwiIFsobmdNb2RlbCldPVwiYy5jaGVja2VkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJDb2xsZWN0aW9uW3t7aX19XS5DaGVja2VkXCI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9jb250ZW50PlxuPC9mb3JtPlxuIiwiaW1wb3J0IHtcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBDb21wb25lbnQsXG4gICAgTmdab25lLFxuICAgIE9uRGVzdHJveSxcbiAgICBPbkluaXQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuXG5pbXBvcnQgeyBUb2FzdGVyU2VydmljZSB9IGZyb20gJ2FuZ3VsYXIyLXRvYXN0ZXInO1xuXG5pbXBvcnQgeyBCcm93c2VyQXBpIH0gZnJvbSAnLi4vLi4vYnJvd3Nlci9icm93c2VyQXBpJztcblxuaW1wb3J0IHsgQnJvYWRjYXN0ZXJTZXJ2aWNlIH0gZnJvbSAnanNsaWItYW5ndWxhci9zZXJ2aWNlcy9icm9hZGNhc3Rlci5zZXJ2aWNlJztcblxuaW1wb3J0IHsgQ2lwaGVyUmVwcm9tcHRUeXBlIH0gZnJvbSAnanNsaWItY29tbW9uL2VudW1zL2NpcGhlclJlcHJvbXB0VHlwZSc7XG5pbXBvcnQgeyBDaXBoZXJUeXBlIH0gZnJvbSAnanNsaWItY29tbW9uL2VudW1zL2NpcGhlclR5cGUnO1xuXG5pbXBvcnQgeyBDaXBoZXJWaWV3IH0gZnJvbSAnanNsaWItY29tbW9uL21vZGVscy92aWV3L2NpcGhlclZpZXcnO1xuXG5pbXBvcnQgeyBDaXBoZXJTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9jaXBoZXIuc2VydmljZSc7XG5pbXBvcnQgeyBJMThuU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvaTE4bi5zZXJ2aWNlJztcbmltcG9ydCB7IFBhc3N3b3JkUmVwcm9tcHRTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9wYXNzd29yZFJlcHJvbXB0LnNlcnZpY2UnO1xuaW1wb3J0IHsgUGxhdGZvcm1VdGlsc1NlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL3BsYXRmb3JtVXRpbHMuc2VydmljZSc7XG5pbXBvcnQgeyBTZWFyY2hTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9zZWFyY2guc2VydmljZSc7XG5pbXBvcnQgeyBTdG9yYWdlU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvc3RvcmFnZS5zZXJ2aWNlJztcbmltcG9ydCB7IFN5bmNTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9zeW5jLnNlcnZpY2UnO1xuXG5pbXBvcnQgeyBDb25zdGFudHNTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL3NlcnZpY2VzL2NvbnN0YW50cy5zZXJ2aWNlJztcblxuaW1wb3J0IHsgQXV0b2ZpbGxTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvYWJzdHJhY3Rpb25zL2F1dG9maWxsLnNlcnZpY2UnO1xuXG5pbXBvcnQgeyBQb3B1cFV0aWxzU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL3BvcHVwLXV0aWxzLnNlcnZpY2UnO1xuXG5pbXBvcnQgeyBVdGlscyB9IGZyb20gJ2pzbGliLWNvbW1vbi9taXNjL3V0aWxzJztcblxuY29uc3QgQnJvYWRjYXN0ZXJTdWJzY3JpcHRpb25JZCA9ICdDdXJyZW50VGFiQ29tcG9uZW50JztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdhcHAtY3VycmVudC10YWInLFxuICAgIHRlbXBsYXRlVXJsOiAnY3VycmVudC10YWIuY29tcG9uZW50Lmh0bWwnLFxufSlcbmV4cG9ydCBjbGFzcyBDdXJyZW50VGFiQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICAgIHBhZ2VEZXRhaWxzOiBhbnlbXSA9IFtdO1xuICAgIGNhcmRDaXBoZXJzOiBDaXBoZXJWaWV3W107XG4gICAgaWRlbnRpdHlDaXBoZXJzOiBDaXBoZXJWaWV3W107XG4gICAgbG9naW5DaXBoZXJzOiBDaXBoZXJWaWV3W107XG4gICAgdXJsOiBzdHJpbmc7XG4gICAgaG9zdG5hbWU6IHN0cmluZztcbiAgICBzZWFyY2hUZXh0OiBzdHJpbmc7XG4gICAgaW5TaWRlYmFyID0gZmFsc2U7XG4gICAgc2VhcmNoVHlwZVNlYXJjaCA9IGZhbHNlO1xuICAgIGxvYWRlZCA9IGZhbHNlO1xuXG4gICAgcHJpdmF0ZSB0b3RwQ29kZTogc3RyaW5nO1xuICAgIHByaXZhdGUgdG90cFRpbWVvdXQ6IG51bWJlcjtcbiAgICBwcml2YXRlIGxvYWRlZFRpbWVvdXQ6IG51bWJlcjtcbiAgICBwcml2YXRlIHNlYXJjaFRpbWVvdXQ6IG51bWJlcjtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgcGxhdGZvcm1VdGlsc1NlcnZpY2U6IFBsYXRmb3JtVXRpbHNTZXJ2aWNlLCBwcml2YXRlIGNpcGhlclNlcnZpY2U6IENpcGhlclNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgcG9wdXBVdGlsc1NlcnZpY2U6IFBvcHVwVXRpbHNTZXJ2aWNlLCBwcml2YXRlIGF1dG9maWxsU2VydmljZTogQXV0b2ZpbGxTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHRvYXN0ZXJTZXJ2aWNlOiBUb2FzdGVyU2VydmljZSwgcHJpdmF0ZSBpMThuU2VydmljZTogSTE4blNlcnZpY2UsIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXG4gICAgICAgIHByaXZhdGUgbmdab25lOiBOZ1pvbmUsIHByaXZhdGUgYnJvYWRjYXN0ZXJTZXJ2aWNlOiBCcm9hZGNhc3RlclNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmLCBwcml2YXRlIHN5bmNTZXJ2aWNlOiBTeW5jU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBzZWFyY2hTZXJ2aWNlOiBTZWFyY2hTZXJ2aWNlLCBwcml2YXRlIHN0b3JhZ2VTZXJ2aWNlOiBTdG9yYWdlU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBwYXNzd29yZFJlcHJvbXB0U2VydmljZTogUGFzc3dvcmRSZXByb21wdFNlcnZpY2UpIHtcbiAgICB9XG5cbiAgICBhc3luYyBuZ09uSW5pdCgpIHtcbiAgICAgICAgdGhpcy5zZWFyY2hUeXBlU2VhcmNoID0gIXRoaXMucGxhdGZvcm1VdGlsc1NlcnZpY2UuaXNTYWZhcmkoKTtcbiAgICAgICAgdGhpcy5pblNpZGViYXIgPSB0aGlzLnBvcHVwVXRpbHNTZXJ2aWNlLmluU2lkZWJhcih3aW5kb3cpO1xuXG4gICAgICAgIHRoaXMuYnJvYWRjYXN0ZXJTZXJ2aWNlLnN1YnNjcmliZShCcm9hZGNhc3RlclN1YnNjcmlwdGlvbklkLCAobWVzc2FnZTogYW55KSA9PiB7XG4gICAgICAgICAgICB0aGlzLm5nWm9uZS5ydW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAobWVzc2FnZS5jb21tYW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3N5bmNDb21wbGV0ZWQnOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubG9hZGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCA1MDApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2NvbGxlY3RQYWdlRGV0YWlsc1Jlc3BvbnNlJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLnNlbmRlciA9PT0gQnJvYWRjYXN0ZXJTdWJzY3JpcHRpb25JZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGFnZURldGFpbHMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lSWQ6IG1lc3NhZ2Uud2ViRXh0U2VuZGVyLmZyYW1lSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYjogbWVzc2FnZS50YWIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbHM6IG1lc3NhZ2UuZGV0YWlscyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKCF0aGlzLnN5bmNTZXJ2aWNlLnN5bmNJblByb2dyZXNzKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmxvYWQoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubG9hZGVkVGltZW91dCA9IHdpbmRvdy5zZXRUaW1lb3V0KGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMubG9hZGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMubG9hZCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIDUwMDApO1xuICAgICAgICB9XG5cbiAgICAgICAgd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlYXJjaCcpLmZvY3VzKCk7XG4gICAgICAgIH0sIDEwMCk7XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5sb2FkZWRUaW1lb3V0KTtcbiAgICAgICAgdGhpcy5icm9hZGNhc3RlclNlcnZpY2UudW5zdWJzY3JpYmUoQnJvYWRjYXN0ZXJTdWJzY3JpcHRpb25JZCk7XG4gICAgfVxuXG4gICAgYXN5bmMgcmVmcmVzaCgpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5sb2FkKCk7XG4gICAgfVxuXG4gICAgYWRkQ2lwaGVyKCkge1xuICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy9hZGQtY2lwaGVyJ10sIHsgcXVlcnlQYXJhbXM6IHsgbmFtZTogdGhpcy5ob3N0bmFtZSwgdXJpOiB0aGlzLnVybCB9IH0pO1xuICAgIH1cblxuICAgIHZpZXdDaXBoZXIoY2lwaGVyOiBDaXBoZXJWaWV3KSB7XG4gICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL3ZpZXctY2lwaGVyJ10sIHsgcXVlcnlQYXJhbXM6IHsgY2lwaGVySWQ6IGNpcGhlci5pZCB9IH0pO1xuICAgIH1cblxuICAgIGFzeW5jIGZpbGxDaXBoZXIoY2lwaGVyOiBDaXBoZXJWaWV3KSB7XG4gICAgICAgIGlmIChjaXBoZXIucmVwcm9tcHQgIT09IENpcGhlclJlcHJvbXB0VHlwZS5Ob25lICYmICFhd2FpdCB0aGlzLnBhc3N3b3JkUmVwcm9tcHRTZXJ2aWNlLnNob3dQYXNzd29yZFByb21wdCgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnRvdHBDb2RlID0gbnVsbDtcbiAgICAgICAgaWYgKHRoaXMudG90cFRpbWVvdXQgIT0gbnVsbCkge1xuICAgICAgICAgICAgd2luZG93LmNsZWFyVGltZW91dCh0aGlzLnRvdHBUaW1lb3V0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnBhZ2VEZXRhaWxzID09IG51bGwgfHwgdGhpcy5wYWdlRGV0YWlscy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMudG9hc3RlclNlcnZpY2UucG9wQXN5bmMoJ2Vycm9yJywgbnVsbCwgdGhpcy5pMThuU2VydmljZS50KCdhdXRvZmlsbEVycm9yJykpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMudG90cENvZGUgPSBhd2FpdCB0aGlzLmF1dG9maWxsU2VydmljZS5kb0F1dG9GaWxsKHtcbiAgICAgICAgICAgICAgICBjaXBoZXI6IGNpcGhlcixcbiAgICAgICAgICAgICAgICBwYWdlRGV0YWlsczogdGhpcy5wYWdlRGV0YWlscyxcbiAgICAgICAgICAgICAgICBkb2M6IHdpbmRvdy5kb2N1bWVudCxcbiAgICAgICAgICAgICAgICBmaWxsTmV3UGFzc3dvcmQ6IHRydWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICh0aGlzLnRvdHBDb2RlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBsYXRmb3JtVXRpbHNTZXJ2aWNlLmNvcHlUb0NsaXBib2FyZCh0aGlzLnRvdHBDb2RlLCB7IHdpbmRvdzogd2luZG93IH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMucG9wdXBVdGlsc1NlcnZpY2UuaW5Qb3B1cCh3aW5kb3cpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucGxhdGZvcm1VdGlsc1NlcnZpY2UuaXNGaXJlZm94KCkgfHwgdGhpcy5wbGF0Zm9ybVV0aWxzU2VydmljZS5pc1NhZmFyaSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIEJyb3dzZXJBcGkuY2xvc2VQb3B1cCh3aW5kb3cpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFNsaWdodCBkZWxheSB0byBmaXggYnVnIGluIENocm9taXVtIGJyb3dzZXJzIHdoZXJlIHBvcHVwIGNsb3NlcyB3aXRob3V0IGNvcHlpbmcgdG90cCB0byBjbGlwYm9hcmRcbiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiBCcm93c2VyQXBpLmNsb3NlUG9wdXAod2luZG93KSwgNTApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMudG9hc3RlclNlcnZpY2UucG9wQXN5bmMoJ2Vycm9yJywgbnVsbCwgdGhpcy5pMThuU2VydmljZS50KCdhdXRvZmlsbEVycm9yJykpO1xuICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZWFyY2hWYXVsdCgpIHtcbiAgICAgICAgaWYgKHRoaXMuc2VhcmNoVGltZW91dCAhPSBudWxsKSB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5zZWFyY2hUaW1lb3V0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuc2VhcmNoU2VydmljZS5pc1NlYXJjaGFibGUodGhpcy5zZWFyY2hUZXh0KSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2VhcmNoVGltZW91dCA9IHdpbmRvdy5zZXRUaW1lb3V0KGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL3RhYnMvdmF1bHQnXSwgeyBxdWVyeVBhcmFtczogeyBzZWFyY2hUZXh0OiB0aGlzLnNlYXJjaFRleHQgfSB9KTtcbiAgICAgICAgfSwgMjAwKTtcbiAgICB9XG5cbiAgICBjbG9zZU9uRXNjKGU6IEtleWJvYXJkRXZlbnQpIHtcbiAgICAgICAgLy8gSWYgaW5wdXQgbm90IGVtcHR5LCB1c2UgYnJvd3NlciBkZWZhdWx0IGJlaGF2aW9yIG9mIGNsZWFyaW5nIGlucHV0IGluc3RlYWRcbiAgICAgICAgaWYgKGUua2V5ID09PSAnRXNjYXBlJyAmJiAodGhpcy5zZWFyY2hUZXh0ID09IG51bGwgfHwgdGhpcy5zZWFyY2hUZXh0ID09PSAnJykpIHtcbiAgICAgICAgICAgIEJyb3dzZXJBcGkuY2xvc2VQb3B1cCh3aW5kb3cpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBsb2FkKCkge1xuICAgICAgICBjb25zdCB0YWIgPSBhd2FpdCBCcm93c2VyQXBpLmdldFRhYkZyb21DdXJyZW50V2luZG93KCk7XG4gICAgICAgIGlmICh0YWIgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy51cmwgPSB0YWIudXJsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5sb2dpbkNpcGhlcnMgPSBbXTtcbiAgICAgICAgICAgIHRoaXMubG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaG9zdG5hbWUgPSBVdGlscy5nZXRIb3N0bmFtZSh0aGlzLnVybCk7XG4gICAgICAgIHRoaXMucGFnZURldGFpbHMgPSBbXTtcbiAgICAgICAgQnJvd3NlckFwaS50YWJTZW5kTWVzc2FnZSh0YWIsIHtcbiAgICAgICAgICAgIGNvbW1hbmQ6ICdjb2xsZWN0UGFnZURldGFpbHMnLFxuICAgICAgICAgICAgdGFiOiB0YWIsXG4gICAgICAgICAgICBzZW5kZXI6IEJyb2FkY2FzdGVyU3Vic2NyaXB0aW9uSWQsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IG90aGVyVHlwZXM6IENpcGhlclR5cGVbXSA9IFtdO1xuICAgICAgICBjb25zdCBkb250U2hvd0NhcmRzID0gYXdhaXQgdGhpcy5zdG9yYWdlU2VydmljZS5nZXQ8Ym9vbGVhbj4oQ29uc3RhbnRzU2VydmljZS5kb250U2hvd0NhcmRzQ3VycmVudFRhYik7XG4gICAgICAgIGNvbnN0IGRvbnRTaG93SWRlbnRpdGllcyA9IGF3YWl0IHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0PGJvb2xlYW4+KFxuICAgICAgICAgICAgQ29uc3RhbnRzU2VydmljZS5kb250U2hvd0lkZW50aXRpZXNDdXJyZW50VGFiKTtcbiAgICAgICAgaWYgKCFkb250U2hvd0NhcmRzKSB7XG4gICAgICAgICAgICBvdGhlclR5cGVzLnB1c2goQ2lwaGVyVHlwZS5DYXJkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWRvbnRTaG93SWRlbnRpdGllcykge1xuICAgICAgICAgICAgb3RoZXJUeXBlcy5wdXNoKENpcGhlclR5cGUuSWRlbnRpdHkpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2lwaGVycyA9IGF3YWl0IHRoaXMuY2lwaGVyU2VydmljZS5nZXRBbGxEZWNyeXB0ZWRGb3JVcmwodGhpcy51cmwsXG4gICAgICAgICAgICBvdGhlclR5cGVzLmxlbmd0aCA+IDAgPyBvdGhlclR5cGVzIDogbnVsbCk7XG5cbiAgICAgICAgdGhpcy5sb2dpbkNpcGhlcnMgPSBbXTtcbiAgICAgICAgdGhpcy5jYXJkQ2lwaGVycyA9IFtdO1xuICAgICAgICB0aGlzLmlkZW50aXR5Q2lwaGVycyA9IFtdO1xuXG4gICAgICAgIGNpcGhlcnMuZm9yRWFjaChjID0+IHtcbiAgICAgICAgICAgIHN3aXRjaCAoYy50eXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBDaXBoZXJUeXBlLkxvZ2luOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2luQ2lwaGVycy5wdXNoKGMpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIENpcGhlclR5cGUuQ2FyZDpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYXJkQ2lwaGVycy5wdXNoKGMpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIENpcGhlclR5cGUuSWRlbnRpdHk6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaWRlbnRpdHlDaXBoZXJzLnB1c2goYyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmxvZ2luQ2lwaGVycyA9IHRoaXMubG9naW5DaXBoZXJzLnNvcnQoKGEsIGIpID0+IHRoaXMuY2lwaGVyU2VydmljZS5zb3J0Q2lwaGVyc0J5TGFzdFVzZWRUaGVuTmFtZShhLCBiKSk7XG4gICAgICAgIHRoaXMubG9hZGVkID0gdHJ1ZTtcbiAgICB9XG59XG4iLCI8aGVhZGVyPlxuICAgIDxkaXYgY2xhc3M9XCJsZWZ0XCI+XG4gICAgICAgIDxhcHAtcG9wLW91dCBbc2hvd109XCIhaW5TaWRlYmFyXCI+PC9hcHAtcG9wLW91dD5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgYXBwQmx1ckNsaWNrIChjbGljayk9XCJyZWZyZXNoKClcIiBhcHBBMTF5VGl0bGU9XCJ7eydyZWZyZXNoJyB8IGkxOG59fVwiICpuZ0lmPVwiaW5TaWRlYmFyXCI+XG4gICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXJldHdlZXQgZmEtbGcgZmEtZndcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJzZWFyY2hcIj5cbiAgICAgICAgPGlucHV0IHR5cGU9XCJ7e3NlYXJjaFR5cGVTZWFyY2ggPyAnc2VhcmNoJyA6ICd0ZXh0J319XCIgcGxhY2Vob2xkZXI9XCJ7eydzZWFyY2hWYXVsdCcgfCBpMThufX1cIiBpZD1cInNlYXJjaFwiXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cInNlYXJjaFRleHRcIiAoaW5wdXQpPVwic2VhcmNoVmF1bHQoKVwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIChrZXlkb3duKT1cImNsb3NlT25Fc2MoJGV2ZW50KVwiPlxuICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXNlYXJjaFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwicmlnaHRcIj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgYXBwQmx1ckNsaWNrIChjbGljayk9XCJhZGRDaXBoZXIoKVwiIGFwcEExMXlUaXRsZT1cInt7J2FkZEl0ZW0nIHwgaTE4bn19XCI+XG4gICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXBsdXMgZmEtbGcgZmEtZndcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuPC9oZWFkZXI+XG48Y29udGVudD5cbiAgICA8ZGl2IGNsYXNzPVwibm8taXRlbXNcIiAqbmdJZj1cIiFsb2FkZWRcIj5cbiAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1zcGlubmVyIGZhLXNwaW4gZmEtM3hcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgPC9kaXY+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImxvYWRlZFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYm94IGxpc3RcIiAqbmdJZj1cImxvZ2luQ2lwaGVyc1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1oZWFkZXJcIj5cbiAgICAgICAgICAgICAgICB7eyd0eXBlTG9naW5zJyB8IGkxOG59fVxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmxleC1yaWdodFwiPnt7bG9naW5DaXBoZXJzLmxlbmd0aH19PC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICA8YXBwLWNpcGhlci1yb3cgKm5nRm9yPVwibGV0IGxvZ2luQ2lwaGVyIG9mIGxvZ2luQ2lwaGVyc1wiIFtjaXBoZXJdPVwibG9naW5DaXBoZXJcIiBcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJ7eydhdXRvRmlsbCcgfCBpMThufX1cIiBbc2hvd1ZpZXddPVwidHJ1ZVwiIChvblNlbGVjdGVkKT1cImZpbGxDaXBoZXIoJGV2ZW50KVwiIFxuICAgICAgICAgICAgICAgICAgICAob25WaWV3KT1cInZpZXdDaXBoZXIoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgIDwvYXBwLWNpcGhlci1yb3c+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50LXJvdyBwYWRkZWQgbm8taG92ZXJcIiAqbmdJZj1cIiFsb2dpbkNpcGhlcnMubGVuZ3RoXCI+XG4gICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwidGV4dC1jZW50ZXJcIj57eydhdXRvRmlsbEluZm8nIHwgaTE4bn19PC9wPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBwcmltYXJ5IGxpbmsgYmxvY2tcIiAoY2xpY2spPVwiYWRkQ2lwaGVyKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7J2FkZExvZ2luJyB8IGkxOG59fVxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImJveCBsaXN0XCIgKm5nSWY9XCJjYXJkQ2lwaGVycyAmJiBjYXJkQ2lwaGVycy5sZW5ndGhcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtaGVhZGVyXCI+XG4gICAgICAgICAgICAgICAge3snY2FyZHMnIHwgaTE4bn19XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmbGV4LXJpZ2h0XCI+e3tjYXJkQ2lwaGVycy5sZW5ndGh9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgPGFwcC1jaXBoZXItcm93ICpuZ0Zvcj1cImxldCBjYXJkQ2lwaGVyIG9mIGNhcmRDaXBoZXJzXCIgW2NpcGhlcl09XCJjYXJkQ2lwaGVyXCIgdGl0bGU9XCJ7eydhdXRvRmlsbCcgfCBpMThufX1cIiBbc2hvd1ZpZXddPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgIChvblNlbGVjdGVkKT1cImZpbGxDaXBoZXIoJGV2ZW50KVwiIChvblZpZXcpPVwidmlld0NpcGhlcigkZXZlbnQpXCI+PC9hcHAtY2lwaGVyLXJvdz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImJveCBsaXN0XCIgKm5nSWY9XCJpZGVudGl0eUNpcGhlcnMgJiYgaWRlbnRpdHlDaXBoZXJzLmxlbmd0aFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1oZWFkZXJcIj5cbiAgICAgICAgICAgICAgICB7eydpZGVudGl0aWVzJyB8IGkxOG59fVxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmxleC1yaWdodFwiPnt7aWRlbnRpdHlDaXBoZXJzLmxlbmd0aH19PC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICA8YXBwLWNpcGhlci1yb3cgKm5nRm9yPVwibGV0IGlkZW50aXR5Q2lwaGVyIG9mIGlkZW50aXR5Q2lwaGVyc1wiIFtjaXBoZXJdPVwiaWRlbnRpdHlDaXBoZXJcIiB0aXRsZT1cInt7J2F1dG9GaWxsJyB8IGkxOG59fVwiIFtzaG93Vmlld109XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgKG9uU2VsZWN0ZWQpPVwiZmlsbENpcGhlcigkZXZlbnQpXCIgKG9uVmlldyk9XCJ2aWV3Q2lwaGVyKCRldmVudClcIj48L2FwcC1jaXBoZXItcm93PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuPC9jb250ZW50PlxuIiwiaW1wb3J0IHsgTG9jYXRpb24gfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBDb21wb25lbnQsXG4gICAgTmdab25lLFxuICAgIE9uRGVzdHJveSxcbiAgICBPbkluaXQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgICBBY3RpdmF0ZWRSb3V0ZSxcbiAgICBSb3V0ZXIsXG59IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5cbmltcG9ydCB7IGZpcnN0IH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBCcm93c2VyQXBpIH0gZnJvbSAnLi4vLi4vYnJvd3Nlci9icm93c2VyQXBpJztcblxuaW1wb3J0IHsgQ2lwaGVyVHlwZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9lbnVtcy9jaXBoZXJUeXBlJztcblxuaW1wb3J0IHsgQ2lwaGVyVmlldyB9IGZyb20gJ2pzbGliLWNvbW1vbi9tb2RlbHMvdmlldy9jaXBoZXJWaWV3JztcbmltcG9ydCB7IENvbGxlY3Rpb25WaWV3IH0gZnJvbSAnanNsaWItY29tbW9uL21vZGVscy92aWV3L2NvbGxlY3Rpb25WaWV3JztcbmltcG9ydCB7IEZvbGRlclZpZXcgfSBmcm9tICdqc2xpYi1jb21tb24vbW9kZWxzL3ZpZXcvZm9sZGVyVmlldyc7XG5cbmltcG9ydCB7IENpcGhlclNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL2NpcGhlci5zZXJ2aWNlJztcbmltcG9ydCB7IENvbGxlY3Rpb25TZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9jb2xsZWN0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgRm9sZGVyU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvZm9sZGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgUGxhdGZvcm1VdGlsc1NlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL3BsYXRmb3JtVXRpbHMuc2VydmljZSc7XG5pbXBvcnQgeyBTZWFyY2hTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9zZWFyY2guc2VydmljZSc7XG5pbXBvcnQgeyBTdGF0ZVNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL3N0YXRlLnNlcnZpY2UnO1xuaW1wb3J0IHsgU3RvcmFnZVNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL3N0b3JhZ2Uuc2VydmljZSc7XG5pbXBvcnQgeyBTeW5jU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvc3luYy5zZXJ2aWNlJztcbmltcG9ydCB7IFVzZXJTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy91c2VyLnNlcnZpY2UnO1xuXG5pbXBvcnQgeyBCcm9hZGNhc3RlclNlcnZpY2UgfSBmcm9tICdqc2xpYi1hbmd1bGFyL3NlcnZpY2VzL2Jyb2FkY2FzdGVyLnNlcnZpY2UnO1xuXG5pbXBvcnQgeyBHcm91cGluZ3NDb21wb25lbnQgYXMgQmFzZUdyb3VwaW5nc0NvbXBvbmVudCB9IGZyb20gJ2pzbGliLWFuZ3VsYXIvY29tcG9uZW50cy9ncm91cGluZ3MuY29tcG9uZW50JztcblxuaW1wb3J0IHsgUG9wdXBVdGlsc1NlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9wb3B1cC11dGlscy5zZXJ2aWNlJztcblxuY29uc3QgQ29tcG9uZW50SWQgPSAnR3JvdXBpbmdzQ29tcG9uZW50JztcbmNvbnN0IFNjb3BlU3RhdGVJZCA9IENvbXBvbmVudElkICsgJ1Njb3BlJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdhcHAtdmF1bHQtZ3JvdXBpbmdzJyxcbiAgICB0ZW1wbGF0ZVVybDogJ2dyb3VwaW5ncy5jb21wb25lbnQuaHRtbCcsXG59KVxuZXhwb3J0IGNsYXNzIEdyb3VwaW5nc0NvbXBvbmVudCBleHRlbmRzIEJhc2VHcm91cGluZ3NDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG5cbiAgICBnZXQgc2hvd05vRm9sZGVyQ2lwaGVycygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubm9Gb2xkZXJDaXBoZXJzICE9IG51bGwgJiYgdGhpcy5ub0ZvbGRlckNpcGhlcnMubGVuZ3RoIDwgdGhpcy5ub0ZvbGRlckxpc3RTaXplICYmXG4gICAgICAgICAgICB0aGlzLmNvbGxlY3Rpb25zLmxlbmd0aCA9PT0gMDtcbiAgICB9XG5cbiAgICBnZXQgZm9sZGVyQ291bnQoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmVzdGVkRm9sZGVycy5sZW5ndGggLSAodGhpcy5zaG93Tm9Gb2xkZXJDaXBoZXJzID8gMCA6IDEpO1xuICAgIH1cbiAgICBjaXBoZXJzOiBDaXBoZXJWaWV3W107XG4gICAgZmF2b3JpdGVDaXBoZXJzOiBDaXBoZXJWaWV3W107XG4gICAgbm9Gb2xkZXJDaXBoZXJzOiBDaXBoZXJWaWV3W107XG4gICAgZm9sZGVyQ291bnRzID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgICBjb2xsZWN0aW9uQ291bnRzID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgICB0eXBlQ291bnRzID0gbmV3IE1hcDxDaXBoZXJUeXBlLCBudW1iZXI+KCk7XG4gICAgc2VhcmNoVGV4dDogc3RyaW5nO1xuICAgIHN0YXRlOiBhbnk7XG4gICAgc2NvcGVTdGF0ZTogYW55O1xuICAgIHNob3dMZWZ0SGVhZGVyID0gdHJ1ZTtcbiAgICBzZWFyY2hQZW5kaW5nID0gZmFsc2U7XG4gICAgc2VhcmNoVHlwZVNlYXJjaCA9IGZhbHNlO1xuICAgIGRlbGV0ZWRDb3VudCA9IDA7XG5cbiAgICBwcml2YXRlIGxvYWRlZFRpbWVvdXQ6IG51bWJlcjtcbiAgICBwcml2YXRlIHNlbGVjdGVkVGltZW91dDogbnVtYmVyO1xuICAgIHByaXZhdGUgcHJldmVudFNlbGVjdGVkID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBub0ZvbGRlckxpc3RTaXplID0gMTAwO1xuICAgIHByaXZhdGUgc2VhcmNoVGltZW91dDogYW55ID0gbnVsbDtcbiAgICBwcml2YXRlIGhhc1NlYXJjaGVkID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBoYXNMb2FkZWRBbGxDaXBoZXJzID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBhbGxDaXBoZXJzOiBDaXBoZXJWaWV3W10gPSBudWxsO1xuXG4gICAgY29uc3RydWN0b3IoY29sbGVjdGlvblNlcnZpY2U6IENvbGxlY3Rpb25TZXJ2aWNlLCBmb2xkZXJTZXJ2aWNlOiBGb2xkZXJTZXJ2aWNlLFxuICAgICAgICBzdG9yYWdlU2VydmljZTogU3RvcmFnZVNlcnZpY2UsIHVzZXJTZXJ2aWNlOiBVc2VyU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBjaXBoZXJTZXJ2aWNlOiBDaXBoZXJTZXJ2aWNlLCBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxuICAgICAgICBwcml2YXRlIG5nWm9uZTogTmdab25lLCBwcml2YXRlIGJyb2FkY2FzdGVyU2VydmljZTogQnJvYWRjYXN0ZXJTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGNoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZiwgcHJpdmF0ZSByb3V0ZTogQWN0aXZhdGVkUm91dGUsXG4gICAgICAgIHByaXZhdGUgc3RhdGVTZXJ2aWNlOiBTdGF0ZVNlcnZpY2UsIHByaXZhdGUgcG9wdXBVdGlsczogUG9wdXBVdGlsc1NlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgc3luY1NlcnZpY2U6IFN5bmNTZXJ2aWNlLCBwcml2YXRlIHBsYXRmb3JtVXRpbHNTZXJ2aWNlOiBQbGF0Zm9ybVV0aWxzU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBzZWFyY2hTZXJ2aWNlOiBTZWFyY2hTZXJ2aWNlLCBwcml2YXRlIGxvY2F0aW9uOiBMb2NhdGlvbikge1xuICAgICAgICBzdXBlcihjb2xsZWN0aW9uU2VydmljZSwgZm9sZGVyU2VydmljZSwgc3RvcmFnZVNlcnZpY2UsIHVzZXJTZXJ2aWNlKTtcbiAgICAgICAgdGhpcy5ub0ZvbGRlckxpc3RTaXplID0gMTAwO1xuICAgIH1cblxuICAgIGFzeW5jIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLnNlYXJjaFR5cGVTZWFyY2ggPSAhdGhpcy5wbGF0Zm9ybVV0aWxzU2VydmljZS5pc1NhZmFyaSgpO1xuICAgICAgICB0aGlzLnNob3dMZWZ0SGVhZGVyID0gISh0aGlzLnBvcHVwVXRpbHMuaW5TaWRlYmFyKHdpbmRvdykgJiYgdGhpcy5wbGF0Zm9ybVV0aWxzU2VydmljZS5pc0ZpcmVmb3goKSk7XG4gICAgICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnJlbW92ZSgnQ2lwaGVyc0NvbXBvbmVudCcpO1xuXG4gICAgICAgIHRoaXMuYnJvYWRjYXN0ZXJTZXJ2aWNlLnN1YnNjcmliZShDb21wb25lbnRJZCwgKG1lc3NhZ2U6IGFueSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKG1lc3NhZ2UuY29tbWFuZCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdzeW5jQ29tcGxldGVkJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIDUwMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHJlc3RvcmVkU2NvcGVTdGF0ZSA9IGF3YWl0IHRoaXMucmVzdG9yZVN0YXRlKCk7XG4gICAgICAgIHRoaXMucm91dGUucXVlcnlQYXJhbXMucGlwZShmaXJzdCgpKS5zdWJzY3JpYmUoYXN5bmMgcGFyYW1zID0+IHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSAoYXdhaXQgdGhpcy5zdGF0ZVNlcnZpY2UuZ2V0PGFueT4oQ29tcG9uZW50SWQpKSB8fCB7fTtcbiAgICAgICAgICAgIGlmICh0aGlzLnN0YXRlLnNlYXJjaFRleHQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaFRleHQgPSB0aGlzLnN0YXRlLnNlYXJjaFRleHQ7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHBhcmFtcy5zZWFyY2hUZXh0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWFyY2hUZXh0ID0gcGFyYW1zLnNlYXJjaFRleHQ7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2NhdGlvbi5yZXBsYWNlU3RhdGUoJ3ZhdWx0Jyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5zeW5jU2VydmljZS5zeW5jSW5Qcm9ncmVzcykge1xuICAgICAgICAgICAgICAgIHRoaXMubG9hZCgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRlZFRpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5sb2FkZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSwgNTAwMCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5zeW5jU2VydmljZS5zeW5jSW5Qcm9ncmVzcyB8fCByZXN0b3JlZFNjb3BlU3RhdGUpIHtcbiAgICAgICAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB0aGlzLnBvcHVwVXRpbHMuc2V0Q29udGVudFNjcm9sbFkod2luZG93LCB0aGlzLnN0YXRlLnNjcm9sbFkpLCAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIGlmICh0aGlzLmxvYWRlZFRpbWVvdXQgIT0gbnVsbCkge1xuICAgICAgICAgICAgd2luZG93LmNsZWFyVGltZW91dCh0aGlzLmxvYWRlZFRpbWVvdXQpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkVGltZW91dCAhPSBudWxsKSB7XG4gICAgICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuc2VsZWN0ZWRUaW1lb3V0KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNhdmVTdGF0ZSgpO1xuICAgICAgICB0aGlzLmJyb2FkY2FzdGVyU2VydmljZS51bnN1YnNjcmliZShDb21wb25lbnRJZCk7XG4gICAgfVxuXG4gICAgYXN5bmMgbG9hZCgpIHtcbiAgICAgICAgYXdhaXQgc3VwZXIubG9hZChmYWxzZSk7XG4gICAgICAgIGF3YWl0IHRoaXMubG9hZENpcGhlcnMoKTtcbiAgICAgICAgaWYgKHRoaXMuc2hvd05vRm9sZGVyQ2lwaGVycyAmJiB0aGlzLm5lc3RlZEZvbGRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgLy8gUmVtb3ZlIFwiTm8gRm9sZGVyXCIgZnJvbSBmb2xkZXIgbGlzdGluZ1xuICAgICAgICAgICAgdGhpcy5uZXN0ZWRGb2xkZXJzID0gdGhpcy5uZXN0ZWRGb2xkZXJzLnNsaWNlKDAsIHRoaXMubmVzdGVkRm9sZGVycy5sZW5ndGggLSAxKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN1cGVyLmxvYWRlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgYXN5bmMgbG9hZENpcGhlcnMoKSB7XG4gICAgICAgIHRoaXMuYWxsQ2lwaGVycyA9IGF3YWl0IHRoaXMuY2lwaGVyU2VydmljZS5nZXRBbGxEZWNyeXB0ZWQoKTtcbiAgICAgICAgaWYgKCF0aGlzLmhhc0xvYWRlZEFsbENpcGhlcnMpIHtcbiAgICAgICAgICAgIHRoaXMuaGFzTG9hZGVkQWxsQ2lwaGVycyA9ICF0aGlzLnNlYXJjaFNlcnZpY2UuaXNTZWFyY2hhYmxlKHRoaXMuc2VhcmNoVGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kZWxldGVkQ291bnQgPSB0aGlzLmFsbENpcGhlcnMuZmlsdGVyKGMgPT4gYy5pc0RlbGV0ZWQpLmxlbmd0aDtcbiAgICAgICAgYXdhaXQgdGhpcy5zZWFyY2gobnVsbCk7XG4gICAgICAgIGxldCBmYXZvcml0ZUNpcGhlcnM6IENpcGhlclZpZXdbXSA9IG51bGw7XG4gICAgICAgIGxldCBub0ZvbGRlckNpcGhlcnM6IENpcGhlclZpZXdbXSA9IG51bGw7XG4gICAgICAgIGNvbnN0IGZvbGRlckNvdW50cyA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gICAgICAgIGNvbnN0IGNvbGxlY3Rpb25Db3VudHMgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICAgICAgICBjb25zdCB0eXBlQ291bnRzID0gbmV3IE1hcDxDaXBoZXJUeXBlLCBudW1iZXI+KCk7XG5cbiAgICAgICAgdGhpcy5jaXBoZXJzLmZvckVhY2goYyA9PiB7XG4gICAgICAgICAgICBpZiAoYy5pc0RlbGV0ZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYy5mYXZvcml0ZSkge1xuICAgICAgICAgICAgICAgIGlmIChmYXZvcml0ZUNpcGhlcnMgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBmYXZvcml0ZUNpcGhlcnMgPSBbXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZmF2b3JpdGVDaXBoZXJzLnB1c2goYyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjLmZvbGRlcklkID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBpZiAobm9Gb2xkZXJDaXBoZXJzID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgbm9Gb2xkZXJDaXBoZXJzID0gW107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG5vRm9sZGVyQ2lwaGVycy5wdXNoKGMpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodHlwZUNvdW50cy5oYXMoYy50eXBlKSkge1xuICAgICAgICAgICAgICAgIHR5cGVDb3VudHMuc2V0KGMudHlwZSwgdHlwZUNvdW50cy5nZXQoYy50eXBlKSArIDEpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0eXBlQ291bnRzLnNldChjLnR5cGUsIDEpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZm9sZGVyQ291bnRzLmhhcyhjLmZvbGRlcklkKSkge1xuICAgICAgICAgICAgICAgIGZvbGRlckNvdW50cy5zZXQoYy5mb2xkZXJJZCwgZm9sZGVyQ291bnRzLmdldChjLmZvbGRlcklkKSArIDEpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmb2xkZXJDb3VudHMuc2V0KGMuZm9sZGVySWQsIDEpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoYy5jb2xsZWN0aW9uSWRzICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjLmNvbGxlY3Rpb25JZHMuZm9yRWFjaChjb2xJZCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb2xsZWN0aW9uQ291bnRzLmhhcyhjb2xJZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxlY3Rpb25Db3VudHMuc2V0KGNvbElkLCBjb2xsZWN0aW9uQ291bnRzLmdldChjb2xJZCkgKyAxKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxlY3Rpb25Db3VudHMuc2V0KGNvbElkLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmZhdm9yaXRlQ2lwaGVycyA9IGZhdm9yaXRlQ2lwaGVycztcbiAgICAgICAgdGhpcy5ub0ZvbGRlckNpcGhlcnMgPSBub0ZvbGRlckNpcGhlcnM7XG4gICAgICAgIHRoaXMudHlwZUNvdW50cyA9IHR5cGVDb3VudHM7XG4gICAgICAgIHRoaXMuZm9sZGVyQ291bnRzID0gZm9sZGVyQ291bnRzO1xuICAgICAgICB0aGlzLmNvbGxlY3Rpb25Db3VudHMgPSBjb2xsZWN0aW9uQ291bnRzO1xuICAgIH1cblxuICAgIGFzeW5jIHNlYXJjaCh0aW1lb3V0OiBudW1iZXIgPSBudWxsKSB7XG4gICAgICAgIHRoaXMuc2VhcmNoUGVuZGluZyA9IGZhbHNlO1xuICAgICAgICBpZiAodGhpcy5zZWFyY2hUaW1lb3V0ICE9IG51bGwpIHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnNlYXJjaFRpbWVvdXQpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZpbHRlckRlbGV0ZWQgPSAoYzogQ2lwaGVyVmlldykgPT4gIWMuaXNEZWxldGVkO1xuICAgICAgICBpZiAodGltZW91dCA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmhhc1NlYXJjaGVkID0gdGhpcy5zZWFyY2hTZXJ2aWNlLmlzU2VhcmNoYWJsZSh0aGlzLnNlYXJjaFRleHQpO1xuICAgICAgICAgICAgdGhpcy5jaXBoZXJzID0gYXdhaXQgdGhpcy5zZWFyY2hTZXJ2aWNlLnNlYXJjaENpcGhlcnModGhpcy5zZWFyY2hUZXh0LCBmaWx0ZXJEZWxldGVkLCB0aGlzLmFsbENpcGhlcnMpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2VhcmNoUGVuZGluZyA9IHRydWU7XG4gICAgICAgIHRoaXMuc2VhcmNoVGltZW91dCA9IHNldFRpbWVvdXQoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5oYXNTZWFyY2hlZCA9IHRoaXMuc2VhcmNoU2VydmljZS5pc1NlYXJjaGFibGUodGhpcy5zZWFyY2hUZXh0KTtcbiAgICAgICAgICAgIGlmICghdGhpcy5oYXNMb2FkZWRBbGxDaXBoZXJzICYmICF0aGlzLmhhc1NlYXJjaGVkKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5sb2FkQ2lwaGVycygpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNpcGhlcnMgPSBhd2FpdCB0aGlzLnNlYXJjaFNlcnZpY2Uuc2VhcmNoQ2lwaGVycyh0aGlzLnNlYXJjaFRleHQsIGZpbHRlckRlbGV0ZWQsIHRoaXMuYWxsQ2lwaGVycyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNlYXJjaFBlbmRpbmcgPSBmYWxzZTtcbiAgICAgICAgfSwgdGltZW91dCk7XG4gICAgfVxuXG4gICAgYXN5bmMgc2VsZWN0VHlwZSh0eXBlOiBDaXBoZXJUeXBlKSB7XG4gICAgICAgIHN1cGVyLnNlbGVjdFR5cGUodHlwZSk7XG4gICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL2NpcGhlcnMnXSwgeyBxdWVyeVBhcmFtczogeyB0eXBlOiB0eXBlIH0gfSk7XG4gICAgfVxuXG4gICAgYXN5bmMgc2VsZWN0Rm9sZGVyKGZvbGRlcjogRm9sZGVyVmlldykge1xuICAgICAgICBzdXBlci5zZWxlY3RGb2xkZXIoZm9sZGVyKTtcbiAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvY2lwaGVycyddLCB7IHF1ZXJ5UGFyYW1zOiB7IGZvbGRlcklkOiBmb2xkZXIuaWQgfHwgJ25vbmUnIH0gfSk7XG4gICAgfVxuXG4gICAgYXN5bmMgc2VsZWN0Q29sbGVjdGlvbihjb2xsZWN0aW9uOiBDb2xsZWN0aW9uVmlldykge1xuICAgICAgICBzdXBlci5zZWxlY3RDb2xsZWN0aW9uKGNvbGxlY3Rpb24pO1xuICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy9jaXBoZXJzJ10sIHsgcXVlcnlQYXJhbXM6IHsgY29sbGVjdGlvbklkOiBjb2xsZWN0aW9uLmlkIH0gfSk7XG4gICAgfVxuXG4gICAgYXN5bmMgc2VsZWN0VHJhc2goKSB7XG4gICAgICAgIHN1cGVyLnNlbGVjdFRyYXNoKCk7XG4gICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL2NpcGhlcnMnXSwgeyBxdWVyeVBhcmFtczogeyBkZWxldGVkOiB0cnVlIH0gfSk7XG4gICAgfVxuXG4gICAgYXN5bmMgc2VsZWN0Q2lwaGVyKGNpcGhlcjogQ2lwaGVyVmlldykge1xuICAgICAgICB0aGlzLnNlbGVjdGVkVGltZW91dCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGlmICghdGhpcy5wcmV2ZW50U2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy92aWV3LWNpcGhlciddLCB7IHF1ZXJ5UGFyYW1zOiB7IGNpcGhlcklkOiBjaXBoZXIuaWQgfSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucHJldmVudFNlbGVjdGVkID0gZmFsc2U7XG4gICAgICAgIH0sIDIwMCk7XG4gICAgfVxuXG4gICAgYXN5bmMgbGF1bmNoQ2lwaGVyKGNpcGhlcjogQ2lwaGVyVmlldykge1xuICAgICAgICBpZiAoY2lwaGVyLnR5cGUgIT09IENpcGhlclR5cGUuTG9naW4gfHwgIWNpcGhlci5sb2dpbi5jYW5MYXVuY2gpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkVGltZW91dCAhPSBudWxsKSB7XG4gICAgICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuc2VsZWN0ZWRUaW1lb3V0KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnByZXZlbnRTZWxlY3RlZCA9IHRydWU7XG4gICAgICAgIGF3YWl0IHRoaXMuY2lwaGVyU2VydmljZS51cGRhdGVMYXN0TGF1bmNoZWREYXRlKGNpcGhlci5pZCk7XG4gICAgICAgIEJyb3dzZXJBcGkuY3JlYXRlTmV3VGFiKGNpcGhlci5sb2dpbi5sYXVuY2hVcmkpO1xuICAgICAgICBpZiAodGhpcy5wb3B1cFV0aWxzLmluUG9wdXAod2luZG93KSkge1xuICAgICAgICAgICAgQnJvd3NlckFwaS5jbG9zZVBvcHVwKHdpbmRvdyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBhZGRDaXBoZXIoKSB7XG4gICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL2FkZC1jaXBoZXInXSk7XG4gICAgfVxuXG4gICAgc2hvd1NlYXJjaGluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGFzU2VhcmNoZWQgfHwgKCF0aGlzLnNlYXJjaFBlbmRpbmcgJiYgdGhpcy5zZWFyY2hTZXJ2aWNlLmlzU2VhcmNoYWJsZSh0aGlzLnNlYXJjaFRleHQpKTtcbiAgICB9XG5cbiAgICBjbG9zZU9uRXNjKGU6IEtleWJvYXJkRXZlbnQpIHtcbiAgICAgICAgLy8gSWYgaW5wdXQgbm90IGVtcHR5LCB1c2UgYnJvd3NlciBkZWZhdWx0IGJlaGF2aW9yIG9mIGNsZWFyaW5nIGlucHV0IGluc3RlYWRcblx0XHRpZiAoZS5rZXkgPT09ICdFc2NhcGUnICYmICh0aGlzLnNlYXJjaFRleHQgPT0gbnVsbCB8fCB0aGlzLnNlYXJjaFRleHQgPT09ICcnKSkge1xuICAgICAgICAgICAgQnJvd3NlckFwaS5jbG9zZVBvcHVwKHdpbmRvdyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHNhdmVTdGF0ZSgpIHtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgICAgICAgIHNjcm9sbFk6IHRoaXMucG9wdXBVdGlscy5nZXRDb250ZW50U2Nyb2xsWSh3aW5kb3cpLFxuICAgICAgICAgICAgc2VhcmNoVGV4dDogdGhpcy5zZWFyY2hUZXh0LFxuICAgICAgICB9O1xuICAgICAgICBhd2FpdCB0aGlzLnN0YXRlU2VydmljZS5zYXZlKENvbXBvbmVudElkLCB0aGlzLnN0YXRlKTtcblxuICAgICAgICB0aGlzLnNjb3BlU3RhdGUgPSB7XG4gICAgICAgICAgICBmYXZvcml0ZUNpcGhlcnM6IHRoaXMuZmF2b3JpdGVDaXBoZXJzLFxuICAgICAgICAgICAgbm9Gb2xkZXJDaXBoZXJzOiB0aGlzLm5vRm9sZGVyQ2lwaGVycyxcbiAgICAgICAgICAgIGNpcGhlcnM6IHRoaXMuY2lwaGVycyxcbiAgICAgICAgICAgIGNvbGxlY3Rpb25Db3VudHM6IHRoaXMuY29sbGVjdGlvbkNvdW50cyxcbiAgICAgICAgICAgIGZvbGRlckNvdW50czogdGhpcy5mb2xkZXJDb3VudHMsXG4gICAgICAgICAgICB0eXBlQ291bnRzOiB0aGlzLnR5cGVDb3VudHMsXG4gICAgICAgICAgICBmb2xkZXJzOiB0aGlzLmZvbGRlcnMsXG4gICAgICAgICAgICBjb2xsZWN0aW9uczogdGhpcy5jb2xsZWN0aW9ucyxcbiAgICAgICAgICAgIGRlbGV0ZWRDb3VudDogdGhpcy5kZWxldGVkQ291bnQsXG4gICAgICAgIH07XG4gICAgICAgIGF3YWl0IHRoaXMuc3RhdGVTZXJ2aWNlLnNhdmUoU2NvcGVTdGF0ZUlkLCB0aGlzLnNjb3BlU3RhdGUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgcmVzdG9yZVN0YXRlKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICB0aGlzLnNjb3BlU3RhdGUgPSBhd2FpdCB0aGlzLnN0YXRlU2VydmljZS5nZXQ8YW55PihTY29wZVN0YXRlSWQpO1xuICAgICAgICBpZiAodGhpcy5zY29wZVN0YXRlID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnNjb3BlU3RhdGUuZmF2b3JpdGVDaXBoZXJzICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuZmF2b3JpdGVDaXBoZXJzID0gdGhpcy5zY29wZVN0YXRlLmZhdm9yaXRlQ2lwaGVycztcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5zY29wZVN0YXRlLm5vRm9sZGVyQ2lwaGVycyAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLm5vRm9sZGVyQ2lwaGVycyA9IHRoaXMuc2NvcGVTdGF0ZS5ub0ZvbGRlckNpcGhlcnM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuc2NvcGVTdGF0ZS5jaXBoZXJzICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuY2lwaGVycyA9IHRoaXMuc2NvcGVTdGF0ZS5jaXBoZXJzO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnNjb3BlU3RhdGUuY29sbGVjdGlvbkNvdW50cyAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmNvbGxlY3Rpb25Db3VudHMgPSB0aGlzLnNjb3BlU3RhdGUuY29sbGVjdGlvbkNvdW50cztcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5zY29wZVN0YXRlLmZvbGRlckNvdW50cyAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmZvbGRlckNvdW50cyA9IHRoaXMuc2NvcGVTdGF0ZS5mb2xkZXJDb3VudHM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuc2NvcGVTdGF0ZS50eXBlQ291bnRzICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMudHlwZUNvdW50cyA9IHRoaXMuc2NvcGVTdGF0ZS50eXBlQ291bnRzO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnNjb3BlU3RhdGUuZm9sZGVycyAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmZvbGRlcnMgPSB0aGlzLnNjb3BlU3RhdGUuZm9sZGVycztcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5zY29wZVN0YXRlLmNvbGxlY3Rpb25zICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuY29sbGVjdGlvbnMgPSB0aGlzLnNjb3BlU3RhdGUuY29sbGVjdGlvbnM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuc2NvcGVTdGF0ZS5kZWxldGVkQ2lwaGVycyAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmRlbGV0ZWRDb3VudCA9IHRoaXMuc2NvcGVTdGF0ZS5kZWxldGVkQ291bnQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG59XG4iLCI8aGVhZGVyPlxuICAgIDxkaXYgY2xhc3M9XCJsZWZ0XCI+XG4gICAgICAgIDxhcHAtcG9wLW91dD48L2FwcC1wb3Atb3V0PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJzZWFyY2hcIj5cbiAgICAgICAgPGlucHV0IHR5cGU9XCJ7e3NlYXJjaFR5cGVTZWFyY2ggPyAnc2VhcmNoJyA6ICd0ZXh0J319XCIgcGxhY2Vob2xkZXI9XCJ7eydzZWFyY2hWYXVsdCcgfCBpMThufX1cIiBpZD1cInNlYXJjaFwiXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cInNlYXJjaFRleHRcIiAoaW5wdXQpPVwic2VhcmNoKDIwMClcIiBhdXRvY29tcGxldGU9XCJvZmZcIiBhcHBBdXRvZm9jdXMgKGtleWRvd24pPVwiY2xvc2VPbkVzYygkZXZlbnQpXCI+XG4gICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtc2VhcmNoXCI+PC9pPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJyaWdodFwiPlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBhcHBCbHVyQ2xpY2sgKGNsaWNrKT1cImFkZENpcGhlcigpXCIgYXBwQTExeVRpdGxlPVwie3snYWRkSXRlbScgfCBpMThufX1cIj5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtcGx1cyBmYS1sZyBmYS1md1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG48L2hlYWRlcj5cbjxjb250ZW50PlxuICAgIDxkaXYgY2xhc3M9XCJuby1pdGVtc1wiICpuZ0lmPVwiKCFjaXBoZXJzIHx8ICFjaXBoZXJzLmxlbmd0aCkgJiYgIXNob3dTZWFyY2hpbmcoKVwiPlxuICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXNwaW5uZXIgZmEtc3BpbiBmYS0zeFwiICpuZ0lmPVwiIWxvYWRlZFwiPjwvaT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImxvYWRlZFwiPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1mcm93bi1vIGZhLTR4XCI+PC9pPlxuICAgICAgICAgICAgPHA+e3snbm9JdGVtc0luTGlzdCcgfCBpMThufX08L3A+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiYWRkQ2lwaGVyKClcIiBjbGFzcz1cImJ0biBibG9jayBwcmltYXJ5IGxpbmtcIj57eydhZGRJdGVtJyB8IGkxOG59fTwvYnV0dG9uPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY2lwaGVycyAmJiBjaXBoZXJzLmxlbmd0aCAmJiAhc2hvd1NlYXJjaGluZygpXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJib3ggbGlzdFwiICpuZ0lmPVwiZmF2b3JpdGVDaXBoZXJzXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWhlYWRlclwiPlxuICAgICAgICAgICAgICAgIHt7J2Zhdm9yaXRlcycgfCBpMThufX1cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZsZXgtcmlnaHRcIj57e2Zhdm9yaXRlQ2lwaGVycy5sZW5ndGh9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgPGFwcC1jaXBoZXItcm93ICpuZ0Zvcj1cImxldCBmYXZvcml0ZUNpcGhlciBvZiBmYXZvcml0ZUNpcGhlcnNcIiBbY2lwaGVyXT1cImZhdm9yaXRlQ2lwaGVyXCJcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJ7eyd2aWV3SXRlbScgfCBpMThufX1cIiAob25TZWxlY3RlZCk9XCJzZWxlY3RDaXBoZXIoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIChsYXVuY2hFdmVudCk9XCJsYXVuY2hDaXBoZXIoJGV2ZW50KVwiPjwvYXBwLWNpcGhlci1yb3c+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJib3ggbGlzdFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1oZWFkZXJcIj5cbiAgICAgICAgICAgICAgICB7eyd0eXBlcycgfCBpMThufX1cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZsZXgtcmlnaHRcIj40PC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWNvbnRlbnQgc2luZ2xlLWxpbmVcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJveC1jb250ZW50LXJvd1wiIGFwcFN0b3BDbGljayBhcHBCbHVyQ2xpY2sgKGNsaWNrKT1cInNlbGVjdFR5cGUoY2lwaGVyVHlwZS5Mb2dpbilcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdy1tYWluXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaWNvblwiPjxpIGNsYXNzPVwiZmEgZmEtZncgZmEtbGcgZmEtZ2xvYmVcIj48L2k+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHRcIj57eyd0eXBlTG9naW4nIHwgaTE4bn19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyb3ctc3ViLWxhYmVsXCI+e3t0eXBlQ291bnRzLmdldChjaXBoZXJUeXBlLkxvZ2luKSB8fCAwfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPjxpIGNsYXNzPVwiZmEgZmEtY2hldnJvbi1yaWdodCBmYS1sZyByb3ctc3ViLWljb25cIj48L2k+PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYm94LWNvbnRlbnQtcm93XCIgYXBwU3RvcENsaWNrIGFwcEJsdXJDbGljayAoY2xpY2spPVwic2VsZWN0VHlwZShjaXBoZXJUeXBlLkNhcmQpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3ctbWFpblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImljb25cIj48aSBjbGFzcz1cImZhIGZhLWZ3IGZhLWxnIGZhLWNyZWRpdC1jYXJkXCI+PC9pPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0XCI+e3sndHlwZUNhcmQnIHwgaTE4bn19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyb3ctc3ViLWxhYmVsXCI+e3t0eXBlQ291bnRzLmdldChjaXBoZXJUeXBlLkNhcmQpIHx8IDB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+PGkgY2xhc3M9XCJmYSBmYS1jaGV2cm9uLXJpZ2h0IGZhLWxnIHJvdy1zdWItaWNvblwiPjwvaT48L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJib3gtY29udGVudC1yb3dcIiBhcHBTdG9wQ2xpY2sgYXBwQmx1ckNsaWNrIChjbGljayk9XCJzZWxlY3RUeXBlKGNpcGhlclR5cGUuSWRlbnRpdHkpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3ctbWFpblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImljb25cIj48aSBjbGFzcz1cImZhIGZhLWZ3IGZhLWxnIGZhLWlkLWNhcmQtb1wiPjwvaT48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dFwiPnt7J3R5cGVJZGVudGl0eScgfCBpMThufX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJvdy1zdWItbGFiZWxcIj57e3R5cGVDb3VudHMuZ2V0KGNpcGhlclR5cGUuSWRlbnRpdHkpIHx8IDB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+PGkgY2xhc3M9XCJmYSBmYS1jaGV2cm9uLXJpZ2h0IGZhLWxnIHJvdy1zdWItaWNvblwiPjwvaT48L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJib3gtY29udGVudC1yb3dcIiBhcHBTdG9wQ2xpY2sgYXBwQmx1ckNsaWNrXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RUeXBlKGNpcGhlclR5cGUuU2VjdXJlTm90ZSlcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdy1tYWluXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaWNvblwiPjxpIGNsYXNzPVwiZmEgZmEtZncgZmEtbGcgZmEtc3RpY2t5LW5vdGUtb1wiPjwvaT48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dFwiPnt7J3R5cGVTZWN1cmVOb3RlJyB8IGkxOG59fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicm93LXN1Yi1sYWJlbFwiPnt7dHlwZUNvdW50cy5nZXQoY2lwaGVyVHlwZS5TZWN1cmVOb3RlKSB8fCAwfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPjxpIGNsYXNzPVwiZmEgZmEtY2hldnJvbi1yaWdodCBmYS1sZyByb3ctc3ViLWljb25cIj48L2k+PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYm94IGxpc3RcIiAqbmdJZj1cIm5lc3RlZEZvbGRlcnM/Lmxlbmd0aFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1oZWFkZXJcIj5cbiAgICAgICAgICAgICAgICB7eydmb2xkZXJzJyB8IGkxOG59fVxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmxleC1yaWdodFwiPnt7Zm9sZGVyQ291bnR9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50IHNpbmdsZS1saW5lXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKm5nRm9yPVwibGV0IGYgb2YgbmVzdGVkRm9sZGVyc1wiIGNsYXNzPVwiYm94LWNvbnRlbnQtcm93XCIgYXBwU3RvcENsaWNrIGFwcEJsdXJDbGlja1xuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0Rm9sZGVyKGYubm9kZSlcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdy1tYWluXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaWNvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtZncgZmEtbGdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2ZhLWZvbGRlci1vcGVuJzogZi5ub2RlLmlkLCAnZmEtZm9sZGVyLW9wZW4tbyc6ICFmLm5vZGUuaWR9XCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHRcIj57e2Yubm9kZS5uYW1lfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJvdy1zdWItbGFiZWxcIj57e2ZvbGRlckNvdW50cy5nZXQoZi5ub2RlLmlkKSB8fCAwfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPjxpIGNsYXNzPVwiZmEgZmEtY2hldnJvbi1yaWdodCBmYS1sZyByb3ctc3ViLWljb25cIj48L2k+PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYm94IGxpc3RcIiAqbmdJZj1cIm5lc3RlZENvbGxlY3Rpb25zICYmIG5lc3RlZENvbGxlY3Rpb25zLmxlbmd0aFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1oZWFkZXJcIj5cbiAgICAgICAgICAgICAgICB7eydjb2xsZWN0aW9ucycgfCBpMThufX1cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZsZXgtcmlnaHRcIj57e25lc3RlZENvbGxlY3Rpb25zLmxlbmd0aH19PC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWNvbnRlbnQgc2luZ2xlLWxpbmVcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAqbmdGb3I9XCJsZXQgbmVzdGVkQ29sbGVjdGlvbiBvZiBuZXN0ZWRDb2xsZWN0aW9uc1wiIGNsYXNzPVwiYm94LWNvbnRlbnQtcm93XCJcbiAgICAgICAgICAgICAgICAgICAgYXBwU3RvcENsaWNrIGFwcEJsdXJDbGljayAoY2xpY2spPVwic2VsZWN0Q29sbGVjdGlvbihuZXN0ZWRDb2xsZWN0aW9uLm5vZGUpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3ctbWFpblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImljb25cIj48aSBjbGFzcz1cImZhIGZhLWZ3IGZhLWxnIGZhLWN1YmVcIj48L2k+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHRcIj57e25lc3RlZENvbGxlY3Rpb24ubm9kZS5uYW1lfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJvdy1zdWItbGFiZWxcIj57e2NvbGxlY3Rpb25Db3VudHMuZ2V0KG5lc3RlZENvbGxlY3Rpb24ubm9kZS5pZCkgfHwgMH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj48aSBjbGFzcz1cImZhIGZhLWNoZXZyb24tcmlnaHQgZmEtbGcgcm93LXN1Yi1pY29uXCI+PC9pPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImJveCBsaXN0XCIgKm5nSWY9XCJzaG93Tm9Gb2xkZXJDaXBoZXJzXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWhlYWRlclwiPlxuICAgICAgICAgICAgICAgIHt7J25vbmVGb2xkZXInIHwgaTE4bn19XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtcmlnaHRcIj57e25vRm9sZGVyQ2lwaGVycy5sZW5ndGh9fTwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICA8YXBwLWNpcGhlci1yb3cgKm5nRm9yPVwibGV0IG5vRm9sZGVyQ2lwaGVyIG9mIG5vRm9sZGVyQ2lwaGVyc1wiIFtjaXBoZXJdPVwibm9Gb2xkZXJDaXBoZXJcIlxuICAgICAgICAgICAgICAgICAgICB0aXRsZT1cInt7J3ZpZXdJdGVtJyB8IGkxOG59fVwiIChvblNlbGVjdGVkKT1cInNlbGVjdENpcGhlcigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgKGxhdW5jaEV2ZW50KT1cImxhdW5jaENpcGhlcigkZXZlbnQpXCI+PC9hcHAtY2lwaGVyLXJvdz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImJveCBsaXN0XCIgKm5nSWY9XCJkZWxldGVkQ291bnRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtaGVhZGVyXCI+XG4gICAgICAgICAgICAgICAge3sndHJhc2gnIHwgaTE4bn19XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmbGV4LXJpZ2h0XCI+e3tkZWxldGVkQ291bnR9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50IHNpbmdsZS1saW5lXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJib3gtY29udGVudC1yb3dcIiBhcHBTdG9wQ2xpY2sgYXBwQmx1ckNsaWNrXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RUcmFzaCgpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3ctbWFpblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImljb25cIj48aSBjbGFzcz1cImZhIGZhLWZ3IGZhLWxnIGZhLXRyYXNoLW9cIj48L2k+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHRcIj57eyd0cmFzaCcgfCBpMThufX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJvdy1zdWItbGFiZWxcIj57e2RlbGV0ZWRDb3VudH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj48aSBjbGFzcz1cImZhIGZhLWNoZXZyb24tcmlnaHQgZmEtbGcgcm93LXN1Yi1pY29uXCI+PC9pPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2hvd1NlYXJjaGluZygpXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJuby1pdGVtc1wiICpuZ0lmPVwiIWNpcGhlcnMgfHwgIWNpcGhlcnMubGVuZ3RoXCI+XG4gICAgICAgICAgICA8cD57eydub0l0ZW1zSW5MaXN0JyB8IGkxOG59fTwvcD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxjZGstdmlydHVhbC1zY3JvbGwtdmlld3BvcnQgaXRlbVNpemU9XCI0NlwiIG1pbkJ1ZmZlclB4PVwiNDAwXCIgbWF4QnVmZmVyUHg9XCI2MDBcIlxuICAgICAgICAgICAgKm5nSWY9XCJjaXBoZXJzICYmIGNpcGhlcnMubGVuZ3RoID4gMFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveCBsaXN0IGZ1bGwtbGlzdFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICA8YXBwLWNpcGhlci1yb3cgKmNka1ZpcnR1YWxGb3I9XCJsZXQgc2VhcmNoZWRDaXBoZXIgb2YgY2lwaGVyc1wiIFtjaXBoZXJdPVwic2VhcmNoZWRDaXBoZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJ7eyd2aWV3SXRlbScgfCBpMThufX1cIiAob25TZWxlY3RlZCk9XCJzZWxlY3RDaXBoZXIoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAobGF1bmNoRXZlbnQpPVwibGF1bmNoQ2lwaGVyKCRldmVudClcIj48L2FwcC1jaXBoZXItcm93PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvY2RrLXZpcnR1YWwtc2Nyb2xsLXZpZXdwb3J0PlxuICAgIDwvbmctY29udGFpbmVyPlxuPC9jb250ZW50PlxuIiwiaW1wb3J0IHsgTG9jYXRpb24gfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5cbmltcG9ydCB7IGZpcnN0IH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBDaXBoZXJTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9jaXBoZXIuc2VydmljZSc7XG5pbXBvcnQgeyBJMThuU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvaTE4bi5zZXJ2aWNlJztcbmltcG9ydCB7IFBsYXRmb3JtVXRpbHNTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9wbGF0Zm9ybVV0aWxzLnNlcnZpY2UnO1xuXG5pbXBvcnQge1xuICAgIFBhc3N3b3JkSGlzdG9yeUNvbXBvbmVudCBhcyBCYXNlUGFzc3dvcmRIaXN0b3J5Q29tcG9uZW50LFxufSBmcm9tICdqc2xpYi1hbmd1bGFyL2NvbXBvbmVudHMvcGFzc3dvcmQtaGlzdG9yeS5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2FwcC1wYXNzd29yZC1oaXN0b3J5JyxcbiAgICB0ZW1wbGF0ZVVybDogJ3Bhc3N3b3JkLWhpc3RvcnkuY29tcG9uZW50Lmh0bWwnLFxufSlcbmV4cG9ydCBjbGFzcyBQYXNzd29yZEhpc3RvcnlDb21wb25lbnQgZXh0ZW5kcyBCYXNlUGFzc3dvcmRIaXN0b3J5Q29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3RvcihjaXBoZXJTZXJ2aWNlOiBDaXBoZXJTZXJ2aWNlLCBwbGF0Zm9ybVV0aWxzU2VydmljZTogUGxhdGZvcm1VdGlsc1NlcnZpY2UsXG4gICAgICAgIGkxOG5TZXJ2aWNlOiBJMThuU2VydmljZSwgcHJpdmF0ZSBsb2NhdGlvbjogTG9jYXRpb24sXG4gICAgICAgIHByaXZhdGUgcm91dGU6IEFjdGl2YXRlZFJvdXRlKSB7XG4gICAgICAgIHN1cGVyKGNpcGhlclNlcnZpY2UsIHBsYXRmb3JtVXRpbHNTZXJ2aWNlLCBpMThuU2VydmljZSwgd2luZG93KTtcbiAgICB9XG5cbiAgICBhc3luYyBuZ09uSW5pdCgpIHtcbiAgICAgICAgdGhpcy5yb3V0ZS5xdWVyeVBhcmFtcy5waXBlKGZpcnN0KCkpLnN1YnNjcmliZShhc3luYyBwYXJhbXMgPT4ge1xuICAgICAgICAgICAgaWYgKHBhcmFtcy5jaXBoZXJJZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2lwaGVySWQgPSBwYXJhbXMuY2lwaGVySWQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGF3YWl0IHRoaXMuaW5pdCgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBjbG9zZSgpIHtcbiAgICAgICAgdGhpcy5sb2NhdGlvbi5iYWNrKCk7XG4gICAgfVxufVxuIiwiPGhlYWRlcj5cbiAgICA8ZGl2IGNsYXNzPVwibGVmdFwiPlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBhcHBCbHVyQ2xpY2sgKGNsaWNrKT1cImNsb3NlKClcIj57eydjbG9zZScgfCBpMThufX08L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiY2VudGVyXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwidGl0bGVcIj57eydwYXNzd29yZEhpc3RvcnknIHwgaTE4bn19PC9zcGFuPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJyaWdodFwiPjwvZGl2PlxuPC9oZWFkZXI+XG48Y29udGVudD5cbiAgICA8ZGl2IGNsYXNzPVwiYm94IGxpc3QgZnVsbC1saXN0XCIgKm5nSWY9XCJoaXN0b3J5ICYmIGhpc3RvcnkubGVuZ3RoXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJib3gtY29udGVudFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50LXJvdyBib3gtY29udGVudC1yb3ctZmxleFwiICpuZ0Zvcj1cImxldCBoIG9mIGhpc3RvcnlcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93LW1haW5cIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdy1tYWluLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dCBtb25vc3BhY2VkIG5vLWVsbGlwc2lzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3toLnBhc3N3b3JkfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGV0YWlsXCI+e3toLmxhc3RVc2VkRGF0ZSB8IGRhdGU6J21lZGl1bSd9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFjdGlvbi1idXR0b25zXCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwicm93LWJ0blwiIGFwcFN0b3BDbGljayBhcHBBMTF5VGl0bGU9XCJ7eydjb3B5UGFzc3dvcmQnIHwgaTE4bn19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjb3B5KGgucGFzc3dvcmQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWxnIGZhLWNsb25lXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwibm8taXRlbXNcIiAqbmdJZj1cIiFoaXN0b3J5IHx8ICFoaXN0b3J5Lmxlbmd0aFwiPlxuICAgICAgICA8cD57eydub1Bhc3N3b3Jkc0luTGlzdCcgfCBpMThufX08L3A+XG4gICAgPC9kaXY+XG48L2NvbnRlbnQ+XG4iLCJpbXBvcnQgeyBMb2NhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gICAgQWN0aXZhdGVkUm91dGUsXG4gICAgUm91dGVyLFxufSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuXG5pbXBvcnQgeyBmaXJzdCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgQ2lwaGVyU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvY2lwaGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ29sbGVjdGlvblNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL2NvbGxlY3Rpb24uc2VydmljZSc7XG5pbXBvcnQgeyBJMThuU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvaTE4bi5zZXJ2aWNlJztcbmltcG9ydCB7IExvZ1NlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL2xvZy5zZXJ2aWNlJztcbmltcG9ydCB7IFBsYXRmb3JtVXRpbHNTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9wbGF0Zm9ybVV0aWxzLnNlcnZpY2UnO1xuaW1wb3J0IHsgVXNlclNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL3VzZXIuc2VydmljZSc7XG5cbmltcG9ydCB7IFNoYXJlQ29tcG9uZW50IGFzIEJhc2VTaGFyZUNvbXBvbmVudCB9IGZyb20gJ2pzbGliLWFuZ3VsYXIvY29tcG9uZW50cy9zaGFyZS5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2FwcC12YXVsdC1zaGFyZScsXG4gICAgdGVtcGxhdGVVcmw6ICdzaGFyZS5jb21wb25lbnQuaHRtbCcsXG59KVxuZXhwb3J0IGNsYXNzIFNoYXJlQ29tcG9uZW50IGV4dGVuZHMgQmFzZVNoYXJlQ29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3Rvcihjb2xsZWN0aW9uU2VydmljZTogQ29sbGVjdGlvblNlcnZpY2UsIHBsYXRmb3JtVXRpbHNTZXJ2aWNlOiBQbGF0Zm9ybVV0aWxzU2VydmljZSxcbiAgICAgICAgaTE4blNlcnZpY2U6IEkxOG5TZXJ2aWNlLCB1c2VyU2VydmljZTogVXNlclNlcnZpY2UsXG4gICAgICAgIGNpcGhlclNlcnZpY2U6IENpcGhlclNlcnZpY2UsIHByaXZhdGUgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgICAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLCBsb2dTZXJ2aWNlOiBMb2dTZXJ2aWNlKSB7XG4gICAgICAgIHN1cGVyKGNvbGxlY3Rpb25TZXJ2aWNlLCBwbGF0Zm9ybVV0aWxzU2VydmljZSwgaTE4blNlcnZpY2UsIHVzZXJTZXJ2aWNlLCBjaXBoZXJTZXJ2aWNlLFxuICAgICAgICAgICAgbG9nU2VydmljZSk7XG4gICAgfVxuXG4gICAgYXN5bmMgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMub25TaGFyZWRDaXBoZXIuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsndmlldy1jaXBoZXInLCB7IGNpcGhlcklkOiB0aGlzLmNpcGhlcklkIH1dKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMucm91dGUucXVlcnlQYXJhbXMucGlwZShmaXJzdCgpKS5zdWJzY3JpYmUoYXN5bmMgcGFyYW1zID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2lwaGVySWQgPSBwYXJhbXMuY2lwaGVySWQ7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmxvYWQoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgYXN5bmMgc3VibWl0KCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICBjb25zdCBzdWNjZXNzID0gYXdhaXQgc3VwZXIuc3VibWl0KCk7XG4gICAgICAgIGlmIChzdWNjZXNzKSB7XG4gICAgICAgICAgICB0aGlzLmNhbmNlbCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdWNjZXNzO1xuICAgIH1cblxuICAgIGNhbmNlbCgpIHtcbiAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvdmlldy1jaXBoZXInXSwgeyByZXBsYWNlVXJsOiB0cnVlLCBxdWVyeVBhcmFtczogeyBjaXBoZXJJZDogdGhpcy5jaXBoZXIuaWQgfSB9KTtcbiAgICB9XG59XG4iLCI8Zm9ybSAjZm9ybSAobmdTdWJtaXQpPVwic3VibWl0KClcIiBbYXBwQXBpQWN0aW9uXT1cImZvcm1Qcm9taXNlXCI+XG4gICAgPGhlYWRlcj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImxlZnRcIj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGFwcEJsdXJDbGljayAoY2xpY2spPVwiY2FuY2VsKClcIj57eydjYW5jZWwnIHwgaTE4bn19PC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2VudGVyXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRpdGxlXCI+e3snbW92ZVRvT3JnYW5pemF0aW9uJyB8IGkxOG59fTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJyaWdodFwiPlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwic3VibWl0XCIgYXBwQmx1ckNsaWNrIFtkaXNhYmxlZF09XCJmb3JtLmxvYWRpbmcgfHwgIWNhblNhdmVcIlxuICAgICAgICAgICAgICAgICpuZ0lmPVwib3JnYW5pemF0aW9ucyAmJiBvcmdhbml6YXRpb25zLmxlbmd0aFwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIFtoaWRkZW5dPVwiZm9ybS5sb2FkaW5nXCI+e3snbW92ZScgfCBpMThufX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1zcGlubmVyIGZhLWxnIGZhLXNwaW5cIiBbaGlkZGVuXT1cIiFmb3JtLmxvYWRpbmdcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9oZWFkZXI+XG4gICAgPGNvbnRlbnQ+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJib3hcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtY29udGVudFwiICpuZ0lmPVwiIW9yZ2FuaXphdGlvbnMgfHwgIW9yZ2FuaXphdGlvbnMubGVuZ3RoXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50LXJvdyBwYWRkZWQgbm8taG92ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAge3snbm9Pcmdhbml6YXRpb25zTGlzdCcgfCBpMThufX1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50XCIgKm5nSWY9XCJvcmdhbml6YXRpb25zICYmIG9yZ2FuaXphdGlvbnMubGVuZ3RoXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50LXJvd1wiIGFwcEJveFJvdz5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cIm9yZ2FuaXphdGlvblwiPnt7J29yZ2FuaXphdGlvbicgfCBpMThufX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGlkPVwib3JnYW5pemF0aW9uXCIgbmFtZT1cIk9yZ2FuaXphdGlvbklkXCIgWyhuZ01vZGVsKV09XCJvcmdhbml6YXRpb25JZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cImZpbHRlckNvbGxlY3Rpb25zKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IG8gb2Ygb3JnYW5pemF0aW9uc1wiIFtuZ1ZhbHVlXT1cIm8uaWRcIj57e28ubmFtZX19PC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWZvb3RlclwiPlxuICAgICAgICAgICAgICAgIHt7J21vdmVUb09yZ0Rlc2MnIHwgaTE4bn19XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJib3hcIiAqbmdJZj1cIm9yZ2FuaXphdGlvbnMgJiYgb3JnYW5pemF0aW9ucy5sZW5ndGhcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtaGVhZGVyXCI+XG4gICAgICAgICAgICAgICAge3snY29sbGVjdGlvbnMnIHwgaTE4bn19XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtY29udGVudFwiICpuZ0lmPVwiIWNvbGxlY3Rpb25zIHx8ICFjb2xsZWN0aW9ucy5sZW5ndGhcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWNvbnRlbnQtcm93IHBhZGRlZCBuby1ob3ZlclwiPlxuICAgICAgICAgICAgICAgICAgICB7eydub0NvbGxlY3Rpb25zSW5MaXN0JyB8IGkxOG59fVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWNvbnRlbnRcIiAqbmdJZj1cImNvbGxlY3Rpb25zICYmIGNvbGxlY3Rpb25zLmxlbmd0aFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtY29udGVudC1yb3cgYm94LWNvbnRlbnQtcm93LWNoZWNrYm94XCIgKm5nRm9yPVwibGV0IGMgb2YgY29sbGVjdGlvbnM7IGxldCBpID0gaW5kZXhcIlxuICAgICAgICAgICAgICAgICAgICBhcHBCb3hSb3c+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJjb2xsZWN0aW9uX3t7aX19XCI+e3tjLm5hbWV9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD1cImNvbGxlY3Rpb25fe3tpfX1cIiB0eXBlPVwiY2hlY2tib3hcIiBbKG5nTW9kZWwpXT1cImMuY2hlY2tlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lPVwiQ29sbGVjdGlvblt7e2l9fV0uQ2hlY2tlZFwiPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvY29udGVudD5cbjwvZm9ybT5cbiIsImltcG9ydCB7XG4gICAgQ29tcG9uZW50LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgRXZlbnRTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9ldmVudC5zZXJ2aWNlJztcblxuaW1wb3J0IHtcbiAgICBWaWV3Q3VzdG9tRmllbGRzQ29tcG9uZW50IGFzIEJhc2VWaWV3Q3VzdG9tRmllbGRzQ29tcG9uZW50XG59IGZyb20gJ2pzbGliLWFuZ3VsYXIvY29tcG9uZW50cy92aWV3LWN1c3RvbS1maWVsZHMuY29tcG9uZW50JztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdhcHAtdmF1bHQtdmlldy1jdXN0b20tZmllbGRzJyxcbiAgICB0ZW1wbGF0ZVVybDogJ3ZpZXctY3VzdG9tLWZpZWxkcy5jb21wb25lbnQuaHRtbCcsXG59KVxuZXhwb3J0IGNsYXNzIFZpZXdDdXN0b21GaWVsZHNDb21wb25lbnQgZXh0ZW5kcyBCYXNlVmlld0N1c3RvbUZpZWxkc0NvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IoZXZlbnRTZXJ2aWNlOiBFdmVudFNlcnZpY2UpIHtcbiAgICAgICAgc3VwZXIoZXZlbnRTZXJ2aWNlKTtcbiAgICB9XG59XG4iLCI8bmctY29udGFpbmVyPlxuICAgIDxkaXYgY2xhc3M9XCJib3gtaGVhZGVyXCI+XG4gICAgICAgIHt7J2N1c3RvbUZpZWxkcycgfCBpMThufX1cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiYm94LWNvbnRlbnRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50LXJvdyBib3gtY29udGVudC1yb3ctZmxleFwiICpuZ0Zvcj1cImxldCBmaWVsZCBvZiBjaXBoZXIuZmllbGRzXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93LW1haW5cIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJvdy1sYWJlbFwiPnt7ZmllbGQubmFtZX19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJmaWVsZC50eXBlID09PSBmaWVsZFR5cGUuVGV4dFwiPlxuICAgICAgICAgICAgICAgICAgICB7e2ZpZWxkLnZhbHVlIHx8ICcmbmJzcDsnfX1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZmllbGQudHlwZSA9PT0gZmllbGRUeXBlLkhpZGRlblwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBbaGlkZGVuXT1cIiFmaWVsZC5zaG93VmFsdWVcIiBjbGFzcz1cIm1vbm9zcGFjZWQgc2hvdy13aGl0ZXNwYWNlXCI+e3tmaWVsZC52YWx1ZX19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBbaGlkZGVuXT1cImZpZWxkLnNob3dWYWx1ZVwiIGNsYXNzPVwibW9ub3NwYWNlZFwiPnt7ZmllbGQubWFza2VkVmFsdWV9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZmllbGQudHlwZSA9PT0gZmllbGRUeXBlLkJvb2xlYW5cIj5cbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1jaGVjay1zcXVhcmUtb1wiICpuZ0lmPVwiZmllbGQudmFsdWUgPT09ICd0cnVlJ1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1zcXVhcmUtb1wiICpuZ0lmPVwiZmllbGQudmFsdWUgIT09ICd0cnVlJ1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzci1vbmx5XCI+e3tmaWVsZC52YWx1ZX19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJmaWVsZC50eXBlID09PSBmaWVsZFR5cGUuTGlua2VkXCIgY2xhc3M9XCJib3gtY29udGVudC1yb3ctZmxleFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaWNvbiBpY29uLXNtYWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWxpbmtcIiBhcmlhLWhpZGRlbj1cInRydWVcIiBhcHBBMTF5VGl0bGU9XCJ7eydsaW5rZWRWYWx1ZScgfCBpMThufX1cIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNyLW9ubHlcIj57eydsaW5rZWRWYWx1ZScgfCBpMThufX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj57e2NpcGhlci5saW5rZWRGaWVsZEkxOG5LZXkoZmllbGQubGlua2VkSWQpIHwgaTE4bn19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWN0aW9uLWJ1dHRvbnNcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInJvdy1idG5cIiBhcHBTdG9wQ2xpY2sgYXBwQTExeVRpdGxlPVwie3sndG9nZ2xlVmlzaWJpbGl0eScgfCBpMThufX1cIlxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImZpZWxkLnR5cGUgPT09IGZpZWxkVHlwZS5IaWRkZW4gJiYgY2lwaGVyLnZpZXdQYXNzd29yZFwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVGaWVsZFZhbHVlKGZpZWxkKVwiPlxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWxnXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnZmEtZXllJzogIWZpZWxkLnNob3dWYWx1ZSwgJ2ZhLWV5ZS1zbGFzaCc6IGZpZWxkLnNob3dWYWx1ZX1cIj48L2k+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJyb3ctYnRuXCIgYXBwU3RvcENsaWNrIGFwcEExMXlUaXRsZT1cInt7J2NvcHlWYWx1ZScgfCBpMThufX1cIlxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImZpZWxkLnZhbHVlICYmIGZpZWxkLnR5cGUgIT09IGZpZWxkVHlwZS5Cb29sZWFuICYmIGZpZWxkLnR5cGUgIT09IGZpZWxkVHlwZS5MaW5rZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgIShmaWVsZC50eXBlID09PSBmaWVsZFR5cGUuSGlkZGVuICYmICFjaXBoZXIudmlld1Bhc3N3b3JkKVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjb3B5KGZpZWxkLnZhbHVlLCAndmFsdWUnLCBmaWVsZC50eXBlID09PSBmaWVsZFR5cGUuSGlkZGVuID8gJ0hfRmllbGQnIDogJ0ZpZWxkJylcIj5cbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1sZyBmYS1jbG9uZVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbjwvbmctY29udGFpbmVyPlxuIiwiaW1wb3J0IHsgTG9jYXRpb24gfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBDb21wb25lbnQsXG4gICAgTmdab25lLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gICAgQWN0aXZhdGVkUm91dGUsXG4gICAgUm91dGVyLFxufSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuXG5pbXBvcnQgeyBmaXJzdCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgQXBpU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvYXBpLnNlcnZpY2UnO1xuaW1wb3J0IHsgQXVkaXRTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9hdWRpdC5zZXJ2aWNlJztcbmltcG9ydCB7IENpcGhlclNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL2NpcGhlci5zZXJ2aWNlJztcbmltcG9ydCB7IENyeXB0b1NlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL2NyeXB0by5zZXJ2aWNlJztcbmltcG9ydCB7IEV2ZW50U2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvZXZlbnQuc2VydmljZSc7XG5pbXBvcnQgeyBJMThuU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvaTE4bi5zZXJ2aWNlJztcbmltcG9ydCB7IExvZ1NlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL2xvZy5zZXJ2aWNlJztcbmltcG9ydCB7IE1lc3NhZ2luZ1NlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL21lc3NhZ2luZy5zZXJ2aWNlJztcbmltcG9ydCB7IFBhc3N3b3JkUmVwcm9tcHRTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9wYXNzd29yZFJlcHJvbXB0LnNlcnZpY2UnO1xuaW1wb3J0IHsgUGxhdGZvcm1VdGlsc1NlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL3BsYXRmb3JtVXRpbHMuc2VydmljZSc7XG5pbXBvcnQgeyBUb2tlblNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL3Rva2VuLnNlcnZpY2UnO1xuaW1wb3J0IHsgVG90cFNlcnZpY2UgfSBmcm9tICdqc2xpYi1jb21tb24vYWJzdHJhY3Rpb25zL3RvdHAuc2VydmljZSc7XG5pbXBvcnQgeyBVc2VyU2VydmljZSB9IGZyb20gJ2pzbGliLWNvbW1vbi9hYnN0cmFjdGlvbnMvdXNlci5zZXJ2aWNlJztcblxuaW1wb3J0IHsgQnJvYWRjYXN0ZXJTZXJ2aWNlIH0gZnJvbSAnanNsaWItYW5ndWxhci9zZXJ2aWNlcy9icm9hZGNhc3Rlci5zZXJ2aWNlJztcblxuaW1wb3J0IHsgQ2lwaGVyIH0gZnJvbSAnanNsaWItY29tbW9uL21vZGVscy9kb21haW4vY2lwaGVyJztcbmltcG9ydCB7IExvZ2luVXJpVmlldyB9IGZyb20gJ2pzbGliLWNvbW1vbi9tb2RlbHMvdmlldy9sb2dpblVyaVZpZXcnO1xuXG5pbXBvcnQgeyBDaXBoZXJUeXBlIH0gZnJvbSAnanNsaWItY29tbW9uL2VudW1zL2NpcGhlclR5cGUnO1xuXG5pbXBvcnQgeyBWaWV3Q29tcG9uZW50IGFzIEJhc2VWaWV3Q29tcG9uZW50IH0gZnJvbSAnanNsaWItYW5ndWxhci9jb21wb25lbnRzL3ZpZXcuY29tcG9uZW50JztcbmltcG9ydCB7IEJyb3dzZXJBcGkgfSBmcm9tICcuLi8uLi9icm93c2VyL2Jyb3dzZXJBcGknO1xuaW1wb3J0IHsgQXV0b2ZpbGxTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvYWJzdHJhY3Rpb25zL2F1dG9maWxsLnNlcnZpY2UnO1xuaW1wb3J0IHsgUG9wdXBVdGlsc1NlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9wb3B1cC11dGlscy5zZXJ2aWNlJztcblxuY29uc3QgQnJvYWRjYXN0ZXJTdWJzY3JpcHRpb25JZCA9ICdDaGlsZFZpZXdDb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2FwcC12YXVsdC12aWV3JyxcbiAgICB0ZW1wbGF0ZVVybDogJ3ZpZXcuY29tcG9uZW50Lmh0bWwnLFxufSlcbmV4cG9ydCBjbGFzcyBWaWV3Q29tcG9uZW50IGV4dGVuZHMgQmFzZVZpZXdDb21wb25lbnQge1xuICAgIHNob3dBdHRhY2htZW50cyA9IHRydWU7XG4gICAgcGFnZURldGFpbHM6IGFueVtdID0gW107XG4gICAgdGFiOiBhbnk7XG4gICAgbG9hZFBhZ2VEZXRhaWxzVGltZW91dDogbnVtYmVyO1xuICAgIGluUG9wb3V0ID0gZmFsc2U7XG4gICAgY2lwaGVyVHlwZSA9IENpcGhlclR5cGU7XG5cbiAgICBjb25zdHJ1Y3RvcihjaXBoZXJTZXJ2aWNlOiBDaXBoZXJTZXJ2aWNlLCB0b3RwU2VydmljZTogVG90cFNlcnZpY2UsXG4gICAgICAgIHRva2VuU2VydmljZTogVG9rZW5TZXJ2aWNlLCBpMThuU2VydmljZTogSTE4blNlcnZpY2UsXG4gICAgICAgIGNyeXB0b1NlcnZpY2U6IENyeXB0b1NlcnZpY2UsIHBsYXRmb3JtVXRpbHNTZXJ2aWNlOiBQbGF0Zm9ybVV0aWxzU2VydmljZSxcbiAgICAgICAgYXVkaXRTZXJ2aWNlOiBBdWRpdFNlcnZpY2UsIHByaXZhdGUgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgICAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLCBwcml2YXRlIGxvY2F0aW9uOiBMb2NhdGlvbixcbiAgICAgICAgYnJvYWRjYXN0ZXJTZXJ2aWNlOiBCcm9hZGNhc3RlclNlcnZpY2UsIG5nWm9uZTogTmdab25lLFxuICAgICAgICBjaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsIHVzZXJTZXJ2aWNlOiBVc2VyU2VydmljZSxcbiAgICAgICAgZXZlbnRTZXJ2aWNlOiBFdmVudFNlcnZpY2UsIHByaXZhdGUgYXV0b2ZpbGxTZXJ2aWNlOiBBdXRvZmlsbFNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgbWVzc2FnaW5nU2VydmljZTogTWVzc2FnaW5nU2VydmljZSwgcHJpdmF0ZSBwb3B1cFV0aWxzU2VydmljZTogUG9wdXBVdGlsc1NlcnZpY2UsXG4gICAgICAgIGFwaVNlcnZpY2U6IEFwaVNlcnZpY2UsIHBhc3N3b3JkUmVwcm9tcHRTZXJ2aWNlOiBQYXNzd29yZFJlcHJvbXB0U2VydmljZSxcbiAgICAgICAgbG9nU2VydmljZTogTG9nU2VydmljZSkge1xuICAgICAgICBzdXBlcihjaXBoZXJTZXJ2aWNlLCB0b3RwU2VydmljZSwgdG9rZW5TZXJ2aWNlLCBpMThuU2VydmljZSwgY3J5cHRvU2VydmljZSwgcGxhdGZvcm1VdGlsc1NlcnZpY2UsXG4gICAgICAgICAgICBhdWRpdFNlcnZpY2UsIHdpbmRvdywgYnJvYWRjYXN0ZXJTZXJ2aWNlLCBuZ1pvbmUsIGNoYW5nZURldGVjdG9yUmVmLCB1c2VyU2VydmljZSwgZXZlbnRTZXJ2aWNlLFxuICAgICAgICAgICAgYXBpU2VydmljZSwgcGFzc3dvcmRSZXByb21wdFNlcnZpY2UsIGxvZ1NlcnZpY2UpO1xuICAgIH1cblxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLmluUG9wb3V0ID0gdGhpcy5wb3B1cFV0aWxzU2VydmljZS5pblBvcG91dCh3aW5kb3cpO1xuICAgICAgICB0aGlzLnJvdXRlLnF1ZXJ5UGFyYW1zLnBpcGUoZmlyc3QoKSkuc3Vic2NyaWJlKGFzeW5jIHBhcmFtcyA9PiB7XG4gICAgICAgICAgICBpZiAocGFyYW1zLmNpcGhlcklkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jaXBoZXJJZCA9IHBhcmFtcy5jaXBoZXJJZDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmxvYWQoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgc3VwZXIubmdPbkluaXQoKTtcblxuICAgICAgICB0aGlzLmJyb2FkY2FzdGVyU2VydmljZS5zdWJzY3JpYmUoQnJvYWRjYXN0ZXJTdWJzY3JpcHRpb25JZCwgKG1lc3NhZ2U6IGFueSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKG1lc3NhZ2UuY29tbWFuZCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdjb2xsZWN0UGFnZURldGFpbHNSZXNwb25zZSc6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5zZW5kZXIgPT09IEJyb2FkY2FzdGVyU3Vic2NyaXB0aW9uSWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBhZ2VEZXRhaWxzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUlkOiBtZXNzYWdlLndlYkV4dFNlbmRlci5mcmFtZUlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWI6IG1lc3NhZ2UudGFiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWxzOiBtZXNzYWdlLmRldGFpbHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAndGFiQ2hhbmdlZCc6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3dpbmRvd0NoYW5nZWQnOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubG9hZFBhZ2VEZXRhaWxzVGltZW91dCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmNsZWFyVGltZW91dCh0aGlzLmxvYWRQYWdlRGV0YWlsc1RpbWVvdXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkUGFnZURldGFpbHNUaW1lb3V0ID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4gdGhpcy5sb2FkUGFnZURldGFpbHMoKSwgNTAwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICBzdXBlci5uZ09uRGVzdHJveSgpO1xuICAgICAgICB0aGlzLmJyb2FkY2FzdGVyU2VydmljZS51bnN1YnNjcmliZShCcm9hZGNhc3RlclN1YnNjcmlwdGlvbklkKTtcbiAgICB9XG5cbiAgICBhc3luYyBsb2FkKCkge1xuICAgICAgICBhd2FpdCBzdXBlci5sb2FkKCk7XG4gICAgICAgIGF3YWl0IHRoaXMubG9hZFBhZ2VEZXRhaWxzKCk7XG4gICAgfVxuXG4gICAgYXN5bmMgZWRpdCgpIHtcbiAgICAgICAgaWYgKHRoaXMuY2lwaGVyLmlzRGVsZXRlZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICghYXdhaXQgc3VwZXIuZWRpdCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy9lZGl0LWNpcGhlciddLCB7IHF1ZXJ5UGFyYW1zOiB7IGNpcGhlcklkOiB0aGlzLmNpcGhlci5pZCB9IH0pO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBhc3luYyBjbG9uZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuY2lwaGVyLmlzRGVsZXRlZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFhd2FpdCBzdXBlci5jbG9uZSgpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy9jbG9uZS1jaXBoZXInXSwge1xuICAgICAgICAgICAgcXVlcnlQYXJhbXM6IHtcbiAgICAgICAgICAgICAgICBjbG9uZU1vZGU6IHRydWUsXG4gICAgICAgICAgICAgICAgY2lwaGVySWQ6IHRoaXMuY2lwaGVyLmlkLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGFzeW5jIHNoYXJlKCkge1xuICAgICAgICBpZiAoIWF3YWl0IHN1cGVyLnNoYXJlKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmNpcGhlci5vcmdhbml6YXRpb25JZCA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy9zaGFyZS1jaXBoZXInXSwgeyByZXBsYWNlVXJsOiB0cnVlLCBxdWVyeVBhcmFtczogeyBjaXBoZXJJZDogdGhpcy5jaXBoZXIuaWQgfSB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBhc3luYyBmaWxsQ2lwaGVyKCkge1xuICAgICAgICBjb25zdCBkaWRBdXRvZmlsbCA9IGF3YWl0IHRoaXMuZG9BdXRvZmlsbCgpO1xuICAgICAgICBpZiAoZGlkQXV0b2ZpbGwpIHtcbiAgICAgICAgICAgIHRoaXMucGxhdGZvcm1VdGlsc1NlcnZpY2Uuc2hvd1RvYXN0KCdzdWNjZXNzJywgbnVsbCxcbiAgICAgICAgICAgICAgICB0aGlzLmkxOG5TZXJ2aWNlLnQoJ2F1dG9GaWxsU3VjY2VzcycpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIGZpbGxDaXBoZXJBbmRTYXZlKCkge1xuICAgICAgICBjb25zdCBkaWRBdXRvZmlsbCA9IGF3YWl0IHRoaXMuZG9BdXRvZmlsbCgpO1xuXG4gICAgICAgIGlmIChkaWRBdXRvZmlsbCkge1xuICAgICAgICAgICAgaWYgKHRoaXMudGFiID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHRhYiBmb3VuZC4nKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuY2lwaGVyLmxvZ2luLnVyaXMgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2lwaGVyLmxvZ2luLnVyaXMgPSBbXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY2lwaGVyLmxvZ2luLnVyaXMuc29tZSh1cmkgPT4gdXJpLnVyaSA9PT0gdGhpcy50YWIudXJsKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsYXRmb3JtVXRpbHNTZXJ2aWNlLnNob3dUb2FzdCgnc3VjY2VzcycsIG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmkxOG5TZXJ2aWNlLnQoJ2F1dG9GaWxsU3VjY2Vzc0FuZFNhdmVkVXJpJykpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2dpblVyaSA9IG5ldyBMb2dpblVyaVZpZXcoKTtcbiAgICAgICAgICAgIGxvZ2luVXJpLnVyaSA9IHRoaXMudGFiLnVybDtcbiAgICAgICAgICAgIHRoaXMuY2lwaGVyLmxvZ2luLnVyaXMucHVzaChsb2dpblVyaSk7XG5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2lwaGVyOiBDaXBoZXIgPSBhd2FpdCB0aGlzLmNpcGhlclNlcnZpY2UuZW5jcnlwdCh0aGlzLmNpcGhlcik7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jaXBoZXJTZXJ2aWNlLnNhdmVXaXRoU2VydmVyKGNpcGhlcik7XG4gICAgICAgICAgICAgICAgdGhpcy5wbGF0Zm9ybVV0aWxzU2VydmljZS5zaG93VG9hc3QoJ3N1Y2Nlc3MnLCBudWxsLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmkxOG5TZXJ2aWNlLnQoJ2F1dG9GaWxsU3VjY2Vzc0FuZFNhdmVkVXJpJykpO1xuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnaW5nU2VydmljZS5zZW5kKCdlZGl0ZWRDaXBoZXInKTtcbiAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgIHRoaXMucGxhdGZvcm1VdGlsc1NlcnZpY2Uuc2hvd1RvYXN0KCdlcnJvcicsIG51bGwsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaTE4blNlcnZpY2UudCgndW5leHBlY3RlZEVycm9yJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgcmVzdG9yZSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNpcGhlci5pc0RlbGV0ZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYXdhaXQgc3VwZXIucmVzdG9yZSgpKSB7XG4gICAgICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgYXN5bmMgZGVsZXRlKCkge1xuICAgICAgICBpZiAoYXdhaXQgc3VwZXIuZGVsZXRlKCkpIHtcbiAgICAgICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjbG9zZSgpIHtcbiAgICAgICAgdGhpcy5sb2NhdGlvbi5iYWNrKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBsb2FkUGFnZURldGFpbHMoKSB7XG4gICAgICAgIHRoaXMucGFnZURldGFpbHMgPSBbXTtcbiAgICAgICAgdGhpcy50YWIgPSBhd2FpdCBCcm93c2VyQXBpLmdldFRhYkZyb21DdXJyZW50V2luZG93KCk7XG4gICAgICAgIGlmICh0aGlzLnRhYiA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgQnJvd3NlckFwaS50YWJTZW5kTWVzc2FnZSh0aGlzLnRhYiwge1xuICAgICAgICAgICAgY29tbWFuZDogJ2NvbGxlY3RQYWdlRGV0YWlscycsXG4gICAgICAgICAgICB0YWI6IHRoaXMudGFiLFxuICAgICAgICAgICAgc2VuZGVyOiBCcm9hZGNhc3RlclN1YnNjcmlwdGlvbklkLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGRvQXV0b2ZpbGwoKSB7XG4gICAgICAgIGlmICghYXdhaXQgdGhpcy5wcm9tcHRQYXNzd29yZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5wYWdlRGV0YWlscyA9PSBudWxsIHx8IHRoaXMucGFnZURldGFpbHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLnBsYXRmb3JtVXRpbHNTZXJ2aWNlLnNob3dUb2FzdCgnZXJyb3InLCBudWxsLFxuICAgICAgICAgICAgICAgIHRoaXMuaTE4blNlcnZpY2UudCgnYXV0b2ZpbGxFcnJvcicpKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLnRvdHBDb2RlID0gYXdhaXQgdGhpcy5hdXRvZmlsbFNlcnZpY2UuZG9BdXRvRmlsbCh7XG4gICAgICAgICAgICAgICAgY2lwaGVyOiB0aGlzLmNpcGhlcixcbiAgICAgICAgICAgICAgICBwYWdlRGV0YWlsczogdGhpcy5wYWdlRGV0YWlscyxcbiAgICAgICAgICAgICAgICBkb2M6IHdpbmRvdy5kb2N1bWVudCxcbiAgICAgICAgICAgICAgICBmaWxsTmV3UGFzc3dvcmQ6IHRydWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICh0aGlzLnRvdHBDb2RlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBsYXRmb3JtVXRpbHNTZXJ2aWNlLmNvcHlUb0NsaXBib2FyZCh0aGlzLnRvdHBDb2RlLCB7IHdpbmRvdzogd2luZG93IH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIHRoaXMucGxhdGZvcm1VdGlsc1NlcnZpY2Uuc2hvd1RvYXN0KCdlcnJvcicsIG51bGwsXG4gICAgICAgICAgICAgICAgdGhpcy5pMThuU2VydmljZS50KCdhdXRvZmlsbEVycm9yJykpO1xuICAgICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG59XG4iLCI8aGVhZGVyPlxuICAgIDxkaXYgY2xhc3M9XCJsZWZ0XCI+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGFwcEJsdXJDbGljayAoY2xpY2spPVwiY2xvc2UoKVwiPnt7J2Nsb3NlJyB8IGkxOG59fTwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJjZW50ZXJcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ0aXRsZVwiPnt7J3ZpZXdJdGVtJyB8IGkxOG59fTwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwicmlnaHRcIiAqbmdJZj1cImNpcGhlclwiPlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBhcHBCbHVyQ2xpY2sgKGNsaWNrKT1cImVkaXQoKVwiICpuZ0lmPVwiIWNpcGhlci5pc0RlbGV0ZWRcIj57eydlZGl0JyB8IGkxOG59fTwvYnV0dG9uPlxuICAgIDwvZGl2PlxuPC9oZWFkZXI+XG48Y29udGVudCAqbmdJZj1cImNpcGhlclwiPlxuICAgIDxkaXYgY2xhc3M9XCJib3hcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImJveC1oZWFkZXJcIj5cbiAgICAgICAgICAgIHt7J2l0ZW1JbmZvcm1hdGlvbicgfCBpMThufX1cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJib3gtY29udGVudFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50LXJvd1wiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicm93LWxhYmVsXCI+e3snbmFtZScgfCBpMThufX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgW3ZhbHVlXT1cImNpcGhlci5uYW1lXCIgcmVhZG9ubHkgYXJpYS1yZWFkb25seT1cInRydWVcIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8IS0tIExvZ2luIC0tPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImNpcGhlci5sb2dpblwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtY29udGVudC1yb3cgYm94LWNvbnRlbnQtcm93LWZsZXhcIiAqbmdJZj1cImNpcGhlci5sb2dpbi51c2VybmFtZVwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93LW1haW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicm93LWxhYmVsIGRyYWdnYWJsZVwiIGRyYWdnYWJsZT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkcmFnc3RhcnQpPVwic2V0VGV4dERhdGFPbkRyYWcoJGV2ZW50LCBjaXBoZXIubG9naW4udXNlcm5hbWUpXCI+e3sndXNlcm5hbWUnIHwgaTE4bn19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBbdmFsdWVdPVwiY2lwaGVyLmxvZ2luLnVzZXJuYW1lXCIgcmVhZG9ubHkgYXJpYS1yZWFkb25seT1cInRydWVcIiAvPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFjdGlvbi1idXR0b25zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInJvdy1idG5cIiBhcHBTdG9wQ2xpY2sgYXBwQTExeVRpdGxlPVwie3snY29weVVzZXJuYW1lJyB8IGkxOG59fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNvcHkoY2lwaGVyLmxvZ2luLnVzZXJuYW1lLCAndXNlcm5hbWUnLCAnVXNlcm5hbWUnKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtbGcgZmEtY2xvbmVcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50LXJvdyBib3gtY29udGVudC1yb3ctZmxleFwiICpuZ0lmPVwiY2lwaGVyLmxvZ2luLnBhc3N3b3JkXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3ctbWFpblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyb3ctbGFiZWwgZHJhZ2dhYmxlXCIgZHJhZ2dhYmxlPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRyYWdzdGFydCk9XCJzZXRUZXh0RGF0YU9uRHJhZygkZXZlbnQsIGNpcGhlci5sb2dpbi5wYXNzd29yZClcIj57eydwYXNzd29yZCcgfCBpMThufX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IFtoaWRkZW5dPVwic2hvd1Bhc3N3b3JkXCIgY2xhc3M9XCJtb25vc3BhY2VkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3tjaXBoZXIubG9naW4ubWFza2VkUGFzc3dvcmR9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBbaGlkZGVuXT1cIiFzaG93UGFzc3dvcmRcIiBjbGFzcz1cIm1vbm9zcGFjZWQgcGFzc3dvcmQtd3JhcHBlclwiIGFwcFNlbGVjdENvcHlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaW5uZXJIVE1MXT1cImNpcGhlci5sb2dpbi5wYXNzd29yZCB8IGNvbG9yUGFzc3dvcmRcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhY3Rpb24tYnV0dG9uc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgI2NoZWNrUGFzc3dvcmRCdG4gY2xhc3M9XCJyb3ctYnRuIGJ0blwiIGFwcEJsdXJDbGlja1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcEExMXlUaXRsZT1cInt7J2NoZWNrUGFzc3dvcmQnIHwgaTE4bn19XCIgKGNsaWNrKT1cImNoZWNrUGFzc3dvcmQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2FwcEFwaUFjdGlvbl09XCJjaGVja1Bhc3N3b3JkUHJvbWlzZVwiIFtkaXNhYmxlZF09XCJjaGVja1Bhc3N3b3JkQnRuLmxvYWRpbmdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY2lwaGVyLnZpZXdQYXNzd29yZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtbGcgZmEtY2hlY2stY2lyY2xlXCIgW2hpZGRlbl09XCJjaGVja1Bhc3N3b3JkQnRuLmxvYWRpbmdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1sZyBmYS1zcGlubmVyIGZhLXNwaW5cIiBbaGlkZGVuXT1cIiFjaGVja1Bhc3N3b3JkQnRuLmxvYWRpbmdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwicm93LWJ0blwiIGFwcFN0b3BDbGljayBhcHBBMTF5VGl0bGU9XCJ7eyd0b2dnbGVWaXNpYmlsaXR5JyB8IGkxOG59fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZVBhc3N3b3JkKClcIiAqbmdJZj1cImNpcGhlci52aWV3UGFzc3dvcmRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWxnXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydmYS1leWUnOiAhc2hvd1Bhc3N3b3JkLCAnZmEtZXllLXNsYXNoJzogc2hvd1Bhc3N3b3JkfVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJyb3ctYnRuXCIgYXBwU3RvcENsaWNrIGFwcEExMXlUaXRsZT1cInt7J2NvcHlQYXNzd29yZCcgfCBpMThufX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjb3B5KGNpcGhlci5sb2dpbi5wYXNzd29yZCwgJ3Bhc3N3b3JkJywgJ1Bhc3N3b3JkJylcIiAqbmdJZj1cImNpcGhlci52aWV3UGFzc3dvcmRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWxnIGZhLWNsb25lXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtY29udGVudC1yb3cgYm94LWNvbnRlbnQtcm93LWZsZXggdG90cFwiIFtuZ0NsYXNzXT1cInsnbG93JzogdG90cExvd31cIlxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImNpcGhlci5sb2dpbi50b3RwICYmIHRvdHBDb2RlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3ctbWFpblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyb3ctbGFiZWwgZHJhZ2dhYmxlXCIgZHJhZ2dhYmxlPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRyYWdzdGFydCk9XCJzZXRUZXh0RGF0YU9uRHJhZygkZXZlbnQsIHRvdHBDb2RlKVwiPnt7J3ZlcmlmaWNhdGlvbkNvZGVUb3RwJyB8IGkxOG59fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidG90cC1jb2RlXCI+e3t0b3RwQ29kZUZvcm1hdHRlZH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0b3RwLWNvdW50ZG93blwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0b3RwLXNlY1wiPnt7dG90cFNlY319PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHN2Zz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Zz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNpcmNsZSBjbGFzcz1cInRvdHAtY2lyY2xlIGlubmVyXCIgcj1cIjEyLjZcIiBjeT1cIjE2XCIgY3g9XCIxNlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7J3N0cm9rZS1kYXNob2Zmc2V0LnB4JzogdG90cERhc2h9XCI+PC9jaXJjbGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjaXJjbGUgY2xhc3M9XCJ0b3RwLWNpcmNsZSBvdXRlclwiIHI9XCIxNFwiIGN5PVwiMTZcIiBjeD1cIjE2XCI+PC9jaXJjbGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFjdGlvbi1idXR0b25zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInJvdy1idG5cIiBhcHBTdG9wQ2xpY2sgYXBwQTExeVRpdGxlPVwie3snY29weVZlcmlmaWNhdGlvbkNvZGUnIHwgaTE4bn19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY29weSh0b3RwQ29kZSwgJ3ZlcmlmaWNhdGlvbkNvZGVUb3RwJywgJ1RPVFAnKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtbGcgZmEtY2xvbmVcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwhLS0gQ2FyZCAtLT5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjaXBoZXIuY2FyZFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtY29udGVudC1yb3dcIiAqbmdJZj1cImNpcGhlci5jYXJkLmNhcmRob2xkZXJOYW1lXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicm93LWxhYmVsXCI+e3snY2FyZGhvbGRlck5hbWUnIHwgaTE4bn19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICB7e2NpcGhlci5jYXJkLmNhcmRob2xkZXJOYW1lfX1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWNvbnRlbnQtcm93IGJveC1jb250ZW50LXJvdy1mbGV4XCIgKm5nSWY9XCJjaXBoZXIuY2FyZC5udW1iZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdy1tYWluXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJvdy1sYWJlbFwiPnt7J251bWJlcicgfCBpMThufX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBbaGlkZGVuXT1cInNob3dDYXJkTnVtYmVyXCIgY2xhc3M9XCJtb25vc3BhY2VkXCI+e3tjaXBoZXIuY2FyZC5tYXNrZWROdW1iZXJ9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIFtoaWRkZW5dPVwiIXNob3dDYXJkTnVtYmVyXCIgY2xhc3M9XCJtb25vc3BhY2VkXCI+e3tjaXBoZXIuY2FyZC5udW1iZXJ9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhY3Rpb24tYnV0dG9uc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJyb3ctYnRuXCIgYXBwU3RvcENsaWNrIGFwcEExMXlUaXRsZT1cInt7J3RvZ2dsZVZpc2liaWxpdHknIHwgaTE4bn19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlQ2FyZE51bWJlcigpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1sZ1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnZmEtZXllJzogIXNob3dDYXJkTnVtYmVyLCAnZmEtZXllLXNsYXNoJzogc2hvd0NhcmROdW1iZXJ9XCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInJvdy1idG5cIiBhcHBTdG9wQ2xpY2sgYXBwQTExeVRpdGxlPVwie3snY29weU51bWJlcicgfCBpMThufX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjb3B5KGNpcGhlci5jYXJkLm51bWJlciwgJ251bWJlcicsICdDYXJkIE51bWJlcicpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1sZyBmYS1jbG9uZVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWNvbnRlbnQtcm93XCIgKm5nSWY9XCJjaXBoZXIuY2FyZC5icmFuZFwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJvdy1sYWJlbFwiPnt7J2JyYW5kJyB8IGkxOG59fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAge3tjaXBoZXIuY2FyZC5icmFuZH19XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50LXJvd1wiICpuZ0lmPVwiY2lwaGVyLmNhcmQuZXhwaXJhdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJvdy1sYWJlbFwiPnt7J2V4cGlyYXRpb24nIHwgaTE4bn19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICB7e2NpcGhlci5jYXJkLmV4cGlyYXRpb259fVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtY29udGVudC1yb3cgYm94LWNvbnRlbnQtcm93LWZsZXhcIiAqbmdJZj1cImNpcGhlci5jYXJkLmNvZGVcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdy1tYWluXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJvdy1sYWJlbFwiPnt7J3NlY3VyaXR5Q29kZScgfCBpMThufX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBbaGlkZGVuXT1cInNob3dDYXJkQ29kZVwiIGNsYXNzPVwibW9ub3NwYWNlZFwiPnt7Y2lwaGVyLmNhcmQubWFza2VkQ29kZX19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gW2hpZGRlbl09XCIhc2hvd0NhcmRDb2RlXCIgY2xhc3M9XCJtb25vc3BhY2VkXCI+e3tjaXBoZXIuY2FyZC5jb2RlfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWN0aW9uLWJ1dHRvbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwicm93LWJ0blwiIGFwcFN0b3BDbGljayBhcHBBMTF5VGl0bGU9XCJ7eyd0b2dnbGVWaXNpYmlsaXR5JyB8IGkxOG59fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUNhcmRDb2RlKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWxnXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydmYS1leWUnOiAhc2hvd0NhcmRDb2RlLCAnZmEtZXllLXNsYXNoJzogc2hvd0NhcmRDb2RlfVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJyb3ctYnRuXCIgYXBwU3RvcENsaWNrIGFwcEExMXlUaXRsZT1cInt7J2NvcHlTZWN1cml0eUNvZGUnIHwgaTE4bn19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY29weShjaXBoZXIuY2FyZC5jb2RlLCAnc2VjdXJpdHlDb2RlJywgJ1NlY3VyaXR5IENvZGUnKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtbGcgZmEtY2xvbmVcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwhLS0gSWRlbnRpdHkgLS0+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiY2lwaGVyLmlkZW50aXR5XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50LXJvd1wiICpuZ0lmPVwiY2lwaGVyLmlkZW50aXR5LmZ1bGxOYW1lXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicm93LWxhYmVsXCI+e3snaWRlbnRpdHlOYW1lJyB8IGkxOG59fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAge3tjaXBoZXIuaWRlbnRpdHkuZnVsbE5hbWV9fVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtY29udGVudC1yb3dcIiAqbmdJZj1cImNpcGhlci5pZGVudGl0eS51c2VybmFtZVwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJvdy1sYWJlbFwiPnt7J3VzZXJuYW1lJyB8IGkxOG59fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAge3tjaXBoZXIuaWRlbnRpdHkudXNlcm5hbWV9fVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtY29udGVudC1yb3dcIiAqbmdJZj1cImNpcGhlci5pZGVudGl0eS5jb21wYW55XCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicm93LWxhYmVsXCI+e3snY29tcGFueScgfCBpMThufX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIHt7Y2lwaGVyLmlkZW50aXR5LmNvbXBhbnl9fVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtY29udGVudC1yb3dcIiAqbmdJZj1cImNpcGhlci5pZGVudGl0eS5zc25cIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyb3ctbGFiZWxcIj57eydzc24nIHwgaTE4bn19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICB7e2NpcGhlci5pZGVudGl0eS5zc259fVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtY29udGVudC1yb3dcIiAqbmdJZj1cImNpcGhlci5pZGVudGl0eS5wYXNzcG9ydE51bWJlclwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJvdy1sYWJlbFwiPnt7J3Bhc3Nwb3J0TnVtYmVyJyB8IGkxOG59fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAge3tjaXBoZXIuaWRlbnRpdHkucGFzc3BvcnROdW1iZXJ9fVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtY29udGVudC1yb3dcIiAqbmdJZj1cImNpcGhlci5pZGVudGl0eS5saWNlbnNlTnVtYmVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicm93LWxhYmVsXCI+e3snbGljZW5zZU51bWJlcicgfCBpMThufX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIHt7Y2lwaGVyLmlkZW50aXR5LmxpY2Vuc2VOdW1iZXJ9fVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtY29udGVudC1yb3dcIiAqbmdJZj1cImNpcGhlci5pZGVudGl0eS5lbWFpbFwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJvdy1sYWJlbFwiPnt7J2VtYWlsJyB8IGkxOG59fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAge3tjaXBoZXIuaWRlbnRpdHkuZW1haWx9fVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtY29udGVudC1yb3dcIiAqbmdJZj1cImNpcGhlci5pZGVudGl0eS5waG9uZVwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJvdy1sYWJlbFwiPnt7J3Bob25lJyB8IGkxOG59fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAge3tjaXBoZXIuaWRlbnRpdHkucGhvbmV9fVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtY29udGVudC1yb3dcIlxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImNpcGhlci5pZGVudGl0eS5hZGRyZXNzMSB8fCBjaXBoZXIuaWRlbnRpdHkuY2l0eSB8fCBjaXBoZXIuaWRlbnRpdHkuY291bnRyeVwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJvdy1sYWJlbFwiPnt7J2FkZHJlc3MnIHwgaTE4bn19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiY2lwaGVyLmlkZW50aXR5LmFkZHJlc3MxXCI+e3tjaXBoZXIuaWRlbnRpdHkuYWRkcmVzczF9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiY2lwaGVyLmlkZW50aXR5LmFkZHJlc3MyXCI+e3tjaXBoZXIuaWRlbnRpdHkuYWRkcmVzczJ9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiY2lwaGVyLmlkZW50aXR5LmFkZHJlc3MzXCI+e3tjaXBoZXIuaWRlbnRpdHkuYWRkcmVzczN9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiY2lwaGVyLmlkZW50aXR5LmZ1bGxBZGRyZXNzUGFydDJcIj57e2NpcGhlci5pZGVudGl0eS5mdWxsQWRkcmVzc1BhcnQyfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImNpcGhlci5pZGVudGl0eS5jb3VudHJ5XCI+e3tjaXBoZXIuaWRlbnRpdHkuY291bnRyeX19PC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImJveFwiICpuZ0lmPVwiY2lwaGVyLmxvZ2luICYmIGNpcGhlci5sb2dpbi5oYXNVcmlzXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJib3gtY29udGVudFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50LXJvdyBib3gtY29udGVudC1yb3ctZmxleFwiICpuZ0Zvcj1cImxldCB1IG9mIGNpcGhlci5sb2dpbi51cmlzOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdy1tYWluXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicm93LWxhYmVsXCIgKm5nSWY9XCIhdS5pc1dlYnNpdGVcIj57eyd1cmknIHwgaTE4bn19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJvdy1sYWJlbFwiICpuZ0lmPVwidS5pc1dlYnNpdGVcIj57eyd3ZWJzaXRlJyB8IGkxOG59fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gdGl0bGU9XCJ7e3UudXJpfX1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIFt2YWx1ZV09XCJ1Lmhvc3RPclVyaVwiIHJlYWRvbmx5IGFyaWEtcmVhZG9ubHk9XCJ0cnVlXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhY3Rpb24tYnV0dG9uc1wiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInJvdy1idG5cIiBhcHBTdG9wQ2xpY2sgYXBwQTExeVRpdGxlPVwie3snbGF1bmNoJyB8IGkxOG59fVwiICpuZ0lmPVwidS5jYW5MYXVuY2hcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImxhdW5jaCh1KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1sZyBmYS1zaGFyZS1zcXVhcmUtb1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwicm93LWJ0blwiYXBwU3RvcENsaWNrIGFwcEExMXlUaXRsZT1cInt7J2NvcHlVcmknIHwgaTE4bn19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjb3B5KHUudXJpLCB1LmlzV2Vic2l0ZSA/ICd3ZWJzaXRlJyA6ICd1cmknLCAnVVJJJylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtbGcgZmEtY2xvbmVcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJib3hcIiAqbmdJZj1cImNpcGhlci5ub3Rlc1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWhlYWRlclwiPlxuICAgICAgICAgICAge3snbm90ZXMnIHwgaTE4bn19XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWNvbnRlbnRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtY29udGVudC1yb3dcIj5cbiAgICAgICAgICAgICAgICA8dGV4dGFyZWEgW3ZhbHVlXT1cImNpcGhlci5ub3Rlc1wiIHJvd3M9XCI2XCIgcmVhZG9ubHkgYXJpYS1yZWFkb25seT1cInRydWVcIj48L3RleHRhcmVhPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJib3hcIiAqbmdJZj1cImNpcGhlci5oYXNGaWVsZHNcIj5cbiAgICAgICAgPGFwcC12YXVsdC12aWV3LWN1c3RvbS1maWVsZHMgW2NpcGhlcl09XCJjaXBoZXJcIiBbcHJvbXB0UGFzc3dvcmRdPVwicHJvbXB0UGFzc3dvcmQuYmluZCh0aGlzKVwiIFxuICAgICAgICAgICAgW2NvcHldPVwiY29weS5iaW5kKHRoaXMpXCI+PC9hcHAtdmF1bHQtdmlldy1jdXN0b20tZmllbGRzPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJib3hcIiAqbmdJZj1cImNpcGhlci5oYXNBdHRhY2htZW50cyAmJiAoY2FuQWNjZXNzUHJlbWl1bSB8fCBjaXBoZXIub3JnYW5pemF0aW9uSWQpICYmIHNob3dBdHRhY2htZW50c1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWhlYWRlclwiPlxuICAgICAgICAgICAge3snYXR0YWNobWVudHMnIHwgaTE4bn19XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWNvbnRlbnRcIj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYm94LWNvbnRlbnQtcm93IGJveC1jb250ZW50LXJvdy1mbGV4IHRleHQtZGVmYXVsdFwiICpuZ0Zvcj1cImxldCBhdHRhY2htZW50IG9mIGNpcGhlci5hdHRhY2htZW50c1wiXG4gICAgICAgICAgICAgICAgYXBwU3RvcENsaWNrIGFwcEJsdXJDTGljayAoY2xpY2spPVwiZG93bmxvYWRBdHRhY2htZW50KGF0dGFjaG1lbnQpXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyb3ctbWFpblwiPnt7YXR0YWNobWVudC5maWxlTmFtZX19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInJvdy1zdWItbGFiZWxcIj57e2F0dGFjaG1lbnQuc2l6ZU5hbWV9fTwvc21hbGw+XG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1kb3dubG9hZCBmYS1mdyByb3ctc3ViLWljb25cIiAqbmdJZj1cIiFhdHRhY2htZW50LmRvd25sb2FkaW5nXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtc3Bpbm5lciBmYS1mdyBmYS1zcGluIHJvdy1zdWItaWNvblwiICpuZ0lmPVwiYXR0YWNobWVudC5kb3dubG9hZGluZ1wiXG4gICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiYm94IGxpc3RcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImJveC1jb250ZW50IHNpbmdsZS1saW5lXCI+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJveC1jb250ZW50LXJvd1wiIGFwcFN0b3BDbGljayBhcHBCbHVyQ2xpY2sgKGNsaWNrKT1cImZpbGxDaXBoZXIoKVwiXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJjaXBoZXIudHlwZSAhPT0gY2lwaGVyVHlwZS5TZWN1cmVOb3RlICYmICFjaXBoZXIuaXNEZWxldGVkICYmICFpblBvcG91dFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3ctbWFpbiB0ZXh0LXByaW1hcnlcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImljb24gdGV4dC1wcmltYXJ5XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXBlbmNpbC1zcXVhcmUtbyBmYS1sZyBmYS1md1wiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7J2F1dG9GaWxsJyB8IGkxOG59fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJib3gtY29udGVudC1yb3dcIiBhcHBTdG9wQ2xpY2sgYXBwQmx1ckNsaWNrIChjbGljayk9XCJmaWxsQ2lwaGVyQW5kU2F2ZSgpXCJcbiAgICAgICAgICAgICAgICAqbmdJZj1cImNpcGhlci50eXBlID09PSBjaXBoZXJUeXBlLkxvZ2luICYmICFjaXBoZXIuaXNEZWxldGVkICYmICFpblBvcG91dFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3ctbWFpbiB0ZXh0LXByaW1hcnlcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImljb24gdGV4dC1wcmltYXJ5XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWJvb2ttYXJrIGZhLWxnIGZhLWZ3XCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3snYXV0b0ZpbGxBbmRTYXZlJyB8IGkxOG59fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJib3gtY29udGVudC1yb3dcIiBhcHBTdG9wQ2xpY2sgYXBwQmx1ckNsaWNrIChjbGljayk9XCJjbG9uZSgpXCJcbiAgICAgICAgICAgICAgICAqbmdJZj1cIiFjaXBoZXIub3JnYW5pemF0aW9uSWQgJiYgIWNpcGhlci5pc0RlbGV0ZWRcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93LW1haW4gdGV4dC1wcmltYXJ5XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpY29uIHRleHQtcHJpbWFyeVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1maWxlcy1vIGZhLWxnIGZhLWZ3XCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3snY2xvbmVJdGVtJyB8IGkxOG59fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJib3gtY29udGVudC1yb3dcIiBhcHBTdG9wQ2xpY2sgYXBwQmx1ckNsaWNrIChjbGljayk9XCJzaGFyZSgpXCIgKm5nSWY9XCIhY2lwaGVyLm9yZ2FuaXphdGlvbklkXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdy1tYWluIHRleHQtcHJpbWFyeVwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaWNvbiB0ZXh0LXByaW1hcnlcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtYXJyb3ctY2lyY2xlLW8tcmlnaHQgZmEtbGcgZmEtZndcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eydtb3ZlVG9Pcmdhbml6YXRpb24nIHwgaTE4bn19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJveC1jb250ZW50LXJvd1wiIGFwcFN0b3BDbGljayBhcHBCbHVyQ2xpY2sgKGNsaWNrKT1cInJlc3RvcmUoKVwiICpuZ0lmPVwiY2lwaGVyLmlzRGVsZXRlZFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3ctbWFpbiB0ZXh0LXByaW1hcnlcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImljb24gdGV4dC1wcmltYXJ5XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXVuZG8gZmEtbGcgZmEtZndcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eydyZXN0b3JlSXRlbScgfCBpMThufX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYm94LWNvbnRlbnQtcm93XCIgYXBwU3RvcENsaWNrIGFwcEJsdXJDbGljayAoY2xpY2spPVwiZGVsZXRlKClcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93LW1haW4gdGV4dC1kYW5nZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImljb24gdGV4dC1kYW5nZXJcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtdHJhc2gtbyBmYS1sZyBmYS1md1wiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7KGNpcGhlci5pc0RlbGV0ZWQgPyAncGVybWFuZW50bHlEZWxldGVJdGVtJyA6ICdkZWxldGVJdGVtJykgfCBpMThufX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImJveFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWZvb3RlclwiPlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8YiBjbGFzcz1cImZvbnQtd2VpZ2h0LXNlbWlib2xkXCI+e3snZGF0ZVVwZGF0ZWQnIHwgaTE4bn19OjwvYj5cbiAgICAgICAgICAgICAgICB7e2NpcGhlci5yZXZpc2lvbkRhdGUgfCBkYXRlOidtZWRpdW0nfX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImNpcGhlci5wYXNzd29yZFJldmlzaW9uRGlzcGxheURhdGVcIj5cbiAgICAgICAgICAgICAgICA8YiBjbGFzcz1cImZvbnQtd2VpZ2h0LXNlbWlib2xkXCI+e3snZGF0ZVBhc3N3b3JkVXBkYXRlZCcgfCBpMThufX06PC9iPlxuICAgICAgICAgICAgICAgIHt7Y2lwaGVyLnBhc3N3b3JkUmV2aXNpb25EaXNwbGF5RGF0ZSB8IGRhdGU6J21lZGl1bSd9fVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiY2lwaGVyLmhhc1Bhc3N3b3JkSGlzdG9yeVwiPlxuICAgICAgICAgICAgICAgIDxiIGNsYXNzPVwiZm9udC13ZWlnaHQtc2VtaWJvbGRcIj57eydwYXNzd29yZEhpc3RvcnknIHwgaTE4bn19OjwvYj5cbiAgICAgICAgICAgICAgICA8YSByb3V0ZXJMaW5rPVwiL2NpcGhlci1wYXNzd29yZC1oaXN0b3J5XCIgW3F1ZXJ5UGFyYW1zXT1cIntjaXBoZXJJZDogY2lwaGVyLmlkfVwiIGFwcFN0b3BDbGlja1xuICAgICAgICAgICAgICAgICAgICB0aXRsZT1cInt7J3Bhc3N3b3JkSGlzdG9yeScgfCBpMThufX1cIj5cbiAgICAgICAgICAgICAgICAgICAge3tjaXBoZXIucGFzc3dvcmRIaXN0b3J5Lmxlbmd0aH19XG4gICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9jb250ZW50PlxuIiwiaW1wb3J0IEF1dG9maWxsUGFnZURldGFpbHMgZnJvbSAnLi4vLi4vbW9kZWxzL2F1dG9maWxsUGFnZURldGFpbHMnO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQXV0b2ZpbGxTZXJ2aWNlIHtcbiAgICBnZXRGb3Jtc1dpdGhQYXNzd29yZEZpZWxkczogKHBhZ2VEZXRhaWxzOiBBdXRvZmlsbFBhZ2VEZXRhaWxzKSA9PiBhbnlbXTtcbiAgICBkb0F1dG9GaWxsOiAob3B0aW9uczogYW55KSA9PiBQcm9taXNlPHN0cmluZz47XG4gICAgZG9BdXRvRmlsbEFjdGl2ZVRhYjogKHBhZ2VEZXRhaWxzOiBhbnksIGZyb21Db21tYW5kOiBib29sZWFuKSA9PiBQcm9taXNlPHN0cmluZz47XG59XG4iLCJpbXBvcnQgeyBNZXNzYWdpbmdTZXJ2aWNlIH0gZnJvbSAnanNsaWItY29tbW9uL2Fic3RyYWN0aW9ucy9tZXNzYWdpbmcuc2VydmljZSc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJyb3dzZXJNZXNzYWdpbmdTZXJ2aWNlIGltcGxlbWVudHMgTWVzc2FnaW5nU2VydmljZSB7XG4gICAgc2VuZChzdWJzY3JpYmVyOiBzdHJpbmcsIGFyZzogYW55ID0ge30pIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IE9iamVjdC5hc3NpZ24oe30sIHsgY29tbWFuZDogc3Vic2NyaWJlciB9LCBhcmcpO1xuICAgICAgICBjaHJvbWUucnVudGltZS5zZW5kTWVzc2FnZShtZXNzYWdlKTtcbiAgICB9XG59XG4iXSwic291cmNlUm9vdCI6IiJ9
\ No newline at end of file
diff --git a/src/iOS.Safari/Resources/popup/polyfills.js b/src/iOS.Safari/Resources/popup/polyfills.js
new file mode 100644
index 000000000..f558916f2
--- /dev/null
+++ b/src/iOS.Safari/Resources/popup/polyfills.js
@@ -0,0 +1,19961 @@
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./src/popup/polyfills.ts");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./node_modules/core-js/internals/a-callable.js":
+/*!******************************************************!*\
+ !*** ./node_modules/core-js/internals/a-callable.js ***!
+ \******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var isCallable = __webpack_require__(/*! ../internals/is-callable */ "./node_modules/core-js/internals/is-callable.js");
+var tryToString = __webpack_require__(/*! ../internals/try-to-string */ "./node_modules/core-js/internals/try-to-string.js");
+
+// `Assert: IsCallable(argument) is true`
+module.exports = function (argument) {
+ if (isCallable(argument)) return argument;
+ throw TypeError(tryToString(argument) + ' is not a function');
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/a-constructor.js":
+/*!*********************************************************!*\
+ !*** ./node_modules/core-js/internals/a-constructor.js ***!
+ \*********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var isConstructor = __webpack_require__(/*! ../internals/is-constructor */ "./node_modules/core-js/internals/is-constructor.js");
+var tryToString = __webpack_require__(/*! ../internals/try-to-string */ "./node_modules/core-js/internals/try-to-string.js");
+
+// `Assert: IsConstructor(argument) is true`
+module.exports = function (argument) {
+ if (isConstructor(argument)) return argument;
+ throw TypeError(tryToString(argument) + ' is not a constructor');
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/a-possible-prototype.js":
+/*!****************************************************************!*\
+ !*** ./node_modules/core-js/internals/a-possible-prototype.js ***!
+ \****************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var isCallable = __webpack_require__(/*! ../internals/is-callable */ "./node_modules/core-js/internals/is-callable.js");
+
+module.exports = function (argument) {
+ if (typeof argument === 'object' || isCallable(argument)) return argument;
+ throw TypeError("Can't set " + String(argument) + ' as a prototype');
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/add-to-unscopables.js":
+/*!**************************************************************!*\
+ !*** ./node_modules/core-js/internals/add-to-unscopables.js ***!
+ \**************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js");
+var create = __webpack_require__(/*! ../internals/object-create */ "./node_modules/core-js/internals/object-create.js");
+var definePropertyModule = __webpack_require__(/*! ../internals/object-define-property */ "./node_modules/core-js/internals/object-define-property.js");
+
+var UNSCOPABLES = wellKnownSymbol('unscopables');
+var ArrayPrototype = Array.prototype;
+
+// Array.prototype[@@unscopables]
+// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables
+if (ArrayPrototype[UNSCOPABLES] == undefined) {
+ definePropertyModule.f(ArrayPrototype, UNSCOPABLES, {
+ configurable: true,
+ value: create(null)
+ });
+}
+
+// add a key to Array.prototype[@@unscopables]
+module.exports = function (key) {
+ ArrayPrototype[UNSCOPABLES][key] = true;
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/advance-string-index.js":
+/*!****************************************************************!*\
+ !*** ./node_modules/core-js/internals/advance-string-index.js ***!
+ \****************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var charAt = __webpack_require__(/*! ../internals/string-multibyte */ "./node_modules/core-js/internals/string-multibyte.js").charAt;
+
+// `AdvanceStringIndex` abstract operation
+// https://tc39.es/ecma262/#sec-advancestringindex
+module.exports = function (S, index, unicode) {
+ return index + (unicode ? charAt(S, index).length : 1);
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/an-instance.js":
+/*!*******************************************************!*\
+ !*** ./node_modules/core-js/internals/an-instance.js ***!
+ \*******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+module.exports = function (it, Constructor, name) {
+ if (it instanceof Constructor) return it;
+ throw TypeError('Incorrect ' + (name ? name + ' ' : '') + 'invocation');
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/an-object.js":
+/*!*****************************************************!*\
+ !*** ./node_modules/core-js/internals/an-object.js ***!
+ \*****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/core-js/internals/is-object.js");
+
+// `Assert: Type(argument) is Object`
+module.exports = function (argument) {
+ if (isObject(argument)) return argument;
+ throw TypeError(String(argument) + ' is not an object');
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/array-buffer-native.js":
+/*!***************************************************************!*\
+ !*** ./node_modules/core-js/internals/array-buffer-native.js ***!
+ \***************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+// eslint-disable-next-line es/no-typed-arrays -- safe
+module.exports = typeof ArrayBuffer !== 'undefined' && typeof DataView !== 'undefined';
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/array-buffer-view-core.js":
+/*!******************************************************************!*\
+ !*** ./node_modules/core-js/internals/array-buffer-view-core.js ***!
+ \******************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var NATIVE_ARRAY_BUFFER = __webpack_require__(/*! ../internals/array-buffer-native */ "./node_modules/core-js/internals/array-buffer-native.js");
+var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/core-js/internals/descriptors.js");
+var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js");
+var isCallable = __webpack_require__(/*! ../internals/is-callable */ "./node_modules/core-js/internals/is-callable.js");
+var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/core-js/internals/is-object.js");
+var has = __webpack_require__(/*! ../internals/has */ "./node_modules/core-js/internals/has.js");
+var classof = __webpack_require__(/*! ../internals/classof */ "./node_modules/core-js/internals/classof.js");
+var tryToString = __webpack_require__(/*! ../internals/try-to-string */ "./node_modules/core-js/internals/try-to-string.js");
+var createNonEnumerableProperty = __webpack_require__(/*! ../internals/create-non-enumerable-property */ "./node_modules/core-js/internals/create-non-enumerable-property.js");
+var redefine = __webpack_require__(/*! ../internals/redefine */ "./node_modules/core-js/internals/redefine.js");
+var defineProperty = __webpack_require__(/*! ../internals/object-define-property */ "./node_modules/core-js/internals/object-define-property.js").f;
+var getPrototypeOf = __webpack_require__(/*! ../internals/object-get-prototype-of */ "./node_modules/core-js/internals/object-get-prototype-of.js");
+var setPrototypeOf = __webpack_require__(/*! ../internals/object-set-prototype-of */ "./node_modules/core-js/internals/object-set-prototype-of.js");
+var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js");
+var uid = __webpack_require__(/*! ../internals/uid */ "./node_modules/core-js/internals/uid.js");
+
+var Int8Array = global.Int8Array;
+var Int8ArrayPrototype = Int8Array && Int8Array.prototype;
+var Uint8ClampedArray = global.Uint8ClampedArray;
+var Uint8ClampedArrayPrototype = Uint8ClampedArray && Uint8ClampedArray.prototype;
+var TypedArray = Int8Array && getPrototypeOf(Int8Array);
+var TypedArrayPrototype = Int8ArrayPrototype && getPrototypeOf(Int8ArrayPrototype);
+var ObjectPrototype = Object.prototype;
+var isPrototypeOf = ObjectPrototype.isPrototypeOf;
+
+var TO_STRING_TAG = wellKnownSymbol('toStringTag');
+var TYPED_ARRAY_TAG = uid('TYPED_ARRAY_TAG');
+var TYPED_ARRAY_CONSTRUCTOR = uid('TYPED_ARRAY_CONSTRUCTOR');
+// Fixing native typed arrays in Opera Presto crashes the browser, see #595
+var NATIVE_ARRAY_BUFFER_VIEWS = NATIVE_ARRAY_BUFFER && !!setPrototypeOf && classof(global.opera) !== 'Opera';
+var TYPED_ARRAY_TAG_REQIRED = false;
+var NAME, Constructor, Prototype;
+
+var TypedArrayConstructorsList = {
+ Int8Array: 1,
+ Uint8Array: 1,
+ Uint8ClampedArray: 1,
+ Int16Array: 2,
+ Uint16Array: 2,
+ Int32Array: 4,
+ Uint32Array: 4,
+ Float32Array: 4,
+ Float64Array: 8
+};
+
+var BigIntArrayConstructorsList = {
+ BigInt64Array: 8,
+ BigUint64Array: 8
+};
+
+var isView = function isView(it) {
+ if (!isObject(it)) return false;
+ var klass = classof(it);
+ return klass === 'DataView'
+ || has(TypedArrayConstructorsList, klass)
+ || has(BigIntArrayConstructorsList, klass);
+};
+
+var isTypedArray = function (it) {
+ if (!isObject(it)) return false;
+ var klass = classof(it);
+ return has(TypedArrayConstructorsList, klass)
+ || has(BigIntArrayConstructorsList, klass);
+};
+
+var aTypedArray = function (it) {
+ if (isTypedArray(it)) return it;
+ throw TypeError('Target is not a typed array');
+};
+
+var aTypedArrayConstructor = function (C) {
+ if (isCallable(C) && (!setPrototypeOf || isPrototypeOf.call(TypedArray, C))) return C;
+ throw TypeError(tryToString(C) + ' is not a typed array constructor');
+};
+
+var exportTypedArrayMethod = function (KEY, property, forced) {
+ if (!DESCRIPTORS) return;
+ if (forced) for (var ARRAY in TypedArrayConstructorsList) {
+ var TypedArrayConstructor = global[ARRAY];
+ if (TypedArrayConstructor && has(TypedArrayConstructor.prototype, KEY)) try {
+ delete TypedArrayConstructor.prototype[KEY];
+ } catch (error) { /* empty */ }
+ }
+ if (!TypedArrayPrototype[KEY] || forced) {
+ redefine(TypedArrayPrototype, KEY, forced ? property
+ : NATIVE_ARRAY_BUFFER_VIEWS && Int8ArrayPrototype[KEY] || property);
+ }
+};
+
+var exportTypedArrayStaticMethod = function (KEY, property, forced) {
+ var ARRAY, TypedArrayConstructor;
+ if (!DESCRIPTORS) return;
+ if (setPrototypeOf) {
+ if (forced) for (ARRAY in TypedArrayConstructorsList) {
+ TypedArrayConstructor = global[ARRAY];
+ if (TypedArrayConstructor && has(TypedArrayConstructor, KEY)) try {
+ delete TypedArrayConstructor[KEY];
+ } catch (error) { /* empty */ }
+ }
+ if (!TypedArray[KEY] || forced) {
+ // V8 ~ Chrome 49-50 `%TypedArray%` methods are non-writable non-configurable
+ try {
+ return redefine(TypedArray, KEY, forced ? property : NATIVE_ARRAY_BUFFER_VIEWS && TypedArray[KEY] || property);
+ } catch (error) { /* empty */ }
+ } else return;
+ }
+ for (ARRAY in TypedArrayConstructorsList) {
+ TypedArrayConstructor = global[ARRAY];
+ if (TypedArrayConstructor && (!TypedArrayConstructor[KEY] || forced)) {
+ redefine(TypedArrayConstructor, KEY, property);
+ }
+ }
+};
+
+for (NAME in TypedArrayConstructorsList) {
+ Constructor = global[NAME];
+ Prototype = Constructor && Constructor.prototype;
+ if (Prototype) createNonEnumerableProperty(Prototype, TYPED_ARRAY_CONSTRUCTOR, Constructor);
+ else NATIVE_ARRAY_BUFFER_VIEWS = false;
+}
+
+for (NAME in BigIntArrayConstructorsList) {
+ Constructor = global[NAME];
+ Prototype = Constructor && Constructor.prototype;
+ if (Prototype) createNonEnumerableProperty(Prototype, TYPED_ARRAY_CONSTRUCTOR, Constructor);
+}
+
+// WebKit bug - typed arrays constructors prototype is Object.prototype
+if (!NATIVE_ARRAY_BUFFER_VIEWS || !isCallable(TypedArray) || TypedArray === Function.prototype) {
+ // eslint-disable-next-line no-shadow -- safe
+ TypedArray = function TypedArray() {
+ throw TypeError('Incorrect invocation');
+ };
+ if (NATIVE_ARRAY_BUFFER_VIEWS) for (NAME in TypedArrayConstructorsList) {
+ if (global[NAME]) setPrototypeOf(global[NAME], TypedArray);
+ }
+}
+
+if (!NATIVE_ARRAY_BUFFER_VIEWS || !TypedArrayPrototype || TypedArrayPrototype === ObjectPrototype) {
+ TypedArrayPrototype = TypedArray.prototype;
+ if (NATIVE_ARRAY_BUFFER_VIEWS) for (NAME in TypedArrayConstructorsList) {
+ if (global[NAME]) setPrototypeOf(global[NAME].prototype, TypedArrayPrototype);
+ }
+}
+
+// WebKit bug - one more object in Uint8ClampedArray prototype chain
+if (NATIVE_ARRAY_BUFFER_VIEWS && getPrototypeOf(Uint8ClampedArrayPrototype) !== TypedArrayPrototype) {
+ setPrototypeOf(Uint8ClampedArrayPrototype, TypedArrayPrototype);
+}
+
+if (DESCRIPTORS && !has(TypedArrayPrototype, TO_STRING_TAG)) {
+ TYPED_ARRAY_TAG_REQIRED = true;
+ defineProperty(TypedArrayPrototype, TO_STRING_TAG, { get: function () {
+ return isObject(this) ? this[TYPED_ARRAY_TAG] : undefined;
+ } });
+ for (NAME in TypedArrayConstructorsList) if (global[NAME]) {
+ createNonEnumerableProperty(global[NAME], TYPED_ARRAY_TAG, NAME);
+ }
+}
+
+module.exports = {
+ NATIVE_ARRAY_BUFFER_VIEWS: NATIVE_ARRAY_BUFFER_VIEWS,
+ TYPED_ARRAY_CONSTRUCTOR: TYPED_ARRAY_CONSTRUCTOR,
+ TYPED_ARRAY_TAG: TYPED_ARRAY_TAG_REQIRED && TYPED_ARRAY_TAG,
+ aTypedArray: aTypedArray,
+ aTypedArrayConstructor: aTypedArrayConstructor,
+ exportTypedArrayMethod: exportTypedArrayMethod,
+ exportTypedArrayStaticMethod: exportTypedArrayStaticMethod,
+ isView: isView,
+ isTypedArray: isTypedArray,
+ TypedArray: TypedArray,
+ TypedArrayPrototype: TypedArrayPrototype
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/array-buffer.js":
+/*!********************************************************!*\
+ !*** ./node_modules/core-js/internals/array-buffer.js ***!
+ \********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js");
+var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/core-js/internals/descriptors.js");
+var NATIVE_ARRAY_BUFFER = __webpack_require__(/*! ../internals/array-buffer-native */ "./node_modules/core-js/internals/array-buffer-native.js");
+var FunctionName = __webpack_require__(/*! ../internals/function-name */ "./node_modules/core-js/internals/function-name.js");
+var createNonEnumerableProperty = __webpack_require__(/*! ../internals/create-non-enumerable-property */ "./node_modules/core-js/internals/create-non-enumerable-property.js");
+var redefineAll = __webpack_require__(/*! ../internals/redefine-all */ "./node_modules/core-js/internals/redefine-all.js");
+var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js");
+var anInstance = __webpack_require__(/*! ../internals/an-instance */ "./node_modules/core-js/internals/an-instance.js");
+var toInteger = __webpack_require__(/*! ../internals/to-integer */ "./node_modules/core-js/internals/to-integer.js");
+var toLength = __webpack_require__(/*! ../internals/to-length */ "./node_modules/core-js/internals/to-length.js");
+var toIndex = __webpack_require__(/*! ../internals/to-index */ "./node_modules/core-js/internals/to-index.js");
+var IEEE754 = __webpack_require__(/*! ../internals/ieee754 */ "./node_modules/core-js/internals/ieee754.js");
+var getPrototypeOf = __webpack_require__(/*! ../internals/object-get-prototype-of */ "./node_modules/core-js/internals/object-get-prototype-of.js");
+var setPrototypeOf = __webpack_require__(/*! ../internals/object-set-prototype-of */ "./node_modules/core-js/internals/object-set-prototype-of.js");
+var getOwnPropertyNames = __webpack_require__(/*! ../internals/object-get-own-property-names */ "./node_modules/core-js/internals/object-get-own-property-names.js").f;
+var defineProperty = __webpack_require__(/*! ../internals/object-define-property */ "./node_modules/core-js/internals/object-define-property.js").f;
+var arrayFill = __webpack_require__(/*! ../internals/array-fill */ "./node_modules/core-js/internals/array-fill.js");
+var setToStringTag = __webpack_require__(/*! ../internals/set-to-string-tag */ "./node_modules/core-js/internals/set-to-string-tag.js");
+var InternalStateModule = __webpack_require__(/*! ../internals/internal-state */ "./node_modules/core-js/internals/internal-state.js");
+
+var PROPER_FUNCTION_NAME = FunctionName.PROPER;
+var CONFIGURABLE_FUNCTION_NAME = FunctionName.CONFIGURABLE;
+var getInternalState = InternalStateModule.get;
+var setInternalState = InternalStateModule.set;
+var ARRAY_BUFFER = 'ArrayBuffer';
+var DATA_VIEW = 'DataView';
+var PROTOTYPE = 'prototype';
+var WRONG_LENGTH = 'Wrong length';
+var WRONG_INDEX = 'Wrong index';
+var NativeArrayBuffer = global[ARRAY_BUFFER];
+var $ArrayBuffer = NativeArrayBuffer;
+var $DataView = global[DATA_VIEW];
+var $DataViewPrototype = $DataView && $DataView[PROTOTYPE];
+var ObjectPrototype = Object.prototype;
+var RangeError = global.RangeError;
+
+var packIEEE754 = IEEE754.pack;
+var unpackIEEE754 = IEEE754.unpack;
+
+var packInt8 = function (number) {
+ return [number & 0xFF];
+};
+
+var packInt16 = function (number) {
+ return [number & 0xFF, number >> 8 & 0xFF];
+};
+
+var packInt32 = function (number) {
+ return [number & 0xFF, number >> 8 & 0xFF, number >> 16 & 0xFF, number >> 24 & 0xFF];
+};
+
+var unpackInt32 = function (buffer) {
+ return buffer[3] << 24 | buffer[2] << 16 | buffer[1] << 8 | buffer[0];
+};
+
+var packFloat32 = function (number) {
+ return packIEEE754(number, 23, 4);
+};
+
+var packFloat64 = function (number) {
+ return packIEEE754(number, 52, 8);
+};
+
+var addGetter = function (Constructor, key) {
+ defineProperty(Constructor[PROTOTYPE], key, { get: function () { return getInternalState(this)[key]; } });
+};
+
+var get = function (view, count, index, isLittleEndian) {
+ var intIndex = toIndex(index);
+ var store = getInternalState(view);
+ if (intIndex + count > store.byteLength) throw RangeError(WRONG_INDEX);
+ var bytes = getInternalState(store.buffer).bytes;
+ var start = intIndex + store.byteOffset;
+ var pack = bytes.slice(start, start + count);
+ return isLittleEndian ? pack : pack.reverse();
+};
+
+var set = function (view, count, index, conversion, value, isLittleEndian) {
+ var intIndex = toIndex(index);
+ var store = getInternalState(view);
+ if (intIndex + count > store.byteLength) throw RangeError(WRONG_INDEX);
+ var bytes = getInternalState(store.buffer).bytes;
+ var start = intIndex + store.byteOffset;
+ var pack = conversion(+value);
+ for (var i = 0; i < count; i++) bytes[start + i] = pack[isLittleEndian ? i : count - i - 1];
+};
+
+if (!NATIVE_ARRAY_BUFFER) {
+ $ArrayBuffer = function ArrayBuffer(length) {
+ anInstance(this, $ArrayBuffer, ARRAY_BUFFER);
+ var byteLength = toIndex(length);
+ setInternalState(this, {
+ bytes: arrayFill.call(new Array(byteLength), 0),
+ byteLength: byteLength
+ });
+ if (!DESCRIPTORS) this.byteLength = byteLength;
+ };
+
+ $DataView = function DataView(buffer, byteOffset, byteLength) {
+ anInstance(this, $DataView, DATA_VIEW);
+ anInstance(buffer, $ArrayBuffer, DATA_VIEW);
+ var bufferLength = getInternalState(buffer).byteLength;
+ var offset = toInteger(byteOffset);
+ if (offset < 0 || offset > bufferLength) throw RangeError('Wrong offset');
+ byteLength = byteLength === undefined ? bufferLength - offset : toLength(byteLength);
+ if (offset + byteLength > bufferLength) throw RangeError(WRONG_LENGTH);
+ setInternalState(this, {
+ buffer: buffer,
+ byteLength: byteLength,
+ byteOffset: offset
+ });
+ if (!DESCRIPTORS) {
+ this.buffer = buffer;
+ this.byteLength = byteLength;
+ this.byteOffset = offset;
+ }
+ };
+
+ if (DESCRIPTORS) {
+ addGetter($ArrayBuffer, 'byteLength');
+ addGetter($DataView, 'buffer');
+ addGetter($DataView, 'byteLength');
+ addGetter($DataView, 'byteOffset');
+ }
+
+ redefineAll($DataView[PROTOTYPE], {
+ getInt8: function getInt8(byteOffset) {
+ return get(this, 1, byteOffset)[0] << 24 >> 24;
+ },
+ getUint8: function getUint8(byteOffset) {
+ return get(this, 1, byteOffset)[0];
+ },
+ getInt16: function getInt16(byteOffset /* , littleEndian */) {
+ var bytes = get(this, 2, byteOffset, arguments.length > 1 ? arguments[1] : undefined);
+ return (bytes[1] << 8 | bytes[0]) << 16 >> 16;
+ },
+ getUint16: function getUint16(byteOffset /* , littleEndian */) {
+ var bytes = get(this, 2, byteOffset, arguments.length > 1 ? arguments[1] : undefined);
+ return bytes[1] << 8 | bytes[0];
+ },
+ getInt32: function getInt32(byteOffset /* , littleEndian */) {
+ return unpackInt32(get(this, 4, byteOffset, arguments.length > 1 ? arguments[1] : undefined));
+ },
+ getUint32: function getUint32(byteOffset /* , littleEndian */) {
+ return unpackInt32(get(this, 4, byteOffset, arguments.length > 1 ? arguments[1] : undefined)) >>> 0;
+ },
+ getFloat32: function getFloat32(byteOffset /* , littleEndian */) {
+ return unpackIEEE754(get(this, 4, byteOffset, arguments.length > 1 ? arguments[1] : undefined), 23);
+ },
+ getFloat64: function getFloat64(byteOffset /* , littleEndian */) {
+ return unpackIEEE754(get(this, 8, byteOffset, arguments.length > 1 ? arguments[1] : undefined), 52);
+ },
+ setInt8: function setInt8(byteOffset, value) {
+ set(this, 1, byteOffset, packInt8, value);
+ },
+ setUint8: function setUint8(byteOffset, value) {
+ set(this, 1, byteOffset, packInt8, value);
+ },
+ setInt16: function setInt16(byteOffset, value /* , littleEndian */) {
+ set(this, 2, byteOffset, packInt16, value, arguments.length > 2 ? arguments[2] : undefined);
+ },
+ setUint16: function setUint16(byteOffset, value /* , littleEndian */) {
+ set(this, 2, byteOffset, packInt16, value, arguments.length > 2 ? arguments[2] : undefined);
+ },
+ setInt32: function setInt32(byteOffset, value /* , littleEndian */) {
+ set(this, 4, byteOffset, packInt32, value, arguments.length > 2 ? arguments[2] : undefined);
+ },
+ setUint32: function setUint32(byteOffset, value /* , littleEndian */) {
+ set(this, 4, byteOffset, packInt32, value, arguments.length > 2 ? arguments[2] : undefined);
+ },
+ setFloat32: function setFloat32(byteOffset, value /* , littleEndian */) {
+ set(this, 4, byteOffset, packFloat32, value, arguments.length > 2 ? arguments[2] : undefined);
+ },
+ setFloat64: function setFloat64(byteOffset, value /* , littleEndian */) {
+ set(this, 8, byteOffset, packFloat64, value, arguments.length > 2 ? arguments[2] : undefined);
+ }
+ });
+} else {
+ var INCORRECT_ARRAY_BUFFER_NAME = PROPER_FUNCTION_NAME && NativeArrayBuffer.name !== ARRAY_BUFFER;
+ /* eslint-disable no-new -- required for testing */
+ if (!fails(function () {
+ NativeArrayBuffer(1);
+ }) || !fails(function () {
+ new NativeArrayBuffer(-1);
+ }) || fails(function () {
+ new NativeArrayBuffer();
+ new NativeArrayBuffer(1.5);
+ new NativeArrayBuffer(NaN);
+ return INCORRECT_ARRAY_BUFFER_NAME && !CONFIGURABLE_FUNCTION_NAME;
+ })) {
+ /* eslint-enable no-new -- required for testing */
+ $ArrayBuffer = function ArrayBuffer(length) {
+ anInstance(this, $ArrayBuffer);
+ return new NativeArrayBuffer(toIndex(length));
+ };
+ var ArrayBufferPrototype = $ArrayBuffer[PROTOTYPE] = NativeArrayBuffer[PROTOTYPE];
+ for (var keys = getOwnPropertyNames(NativeArrayBuffer), j = 0, key; keys.length > j;) {
+ if (!((key = keys[j++]) in $ArrayBuffer)) {
+ createNonEnumerableProperty($ArrayBuffer, key, NativeArrayBuffer[key]);
+ }
+ }
+ ArrayBufferPrototype.constructor = $ArrayBuffer;
+ } else if (INCORRECT_ARRAY_BUFFER_NAME && CONFIGURABLE_FUNCTION_NAME) {
+ createNonEnumerableProperty(NativeArrayBuffer, 'name', ARRAY_BUFFER);
+ }
+
+ // WebKit bug - the same parent prototype for typed arrays and data view
+ if (setPrototypeOf && getPrototypeOf($DataViewPrototype) !== ObjectPrototype) {
+ setPrototypeOf($DataViewPrototype, ObjectPrototype);
+ }
+
+ // iOS Safari 7.x bug
+ var testView = new $DataView(new $ArrayBuffer(2));
+ var $setInt8 = $DataViewPrototype.setInt8;
+ testView.setInt8(0, 2147483648);
+ testView.setInt8(1, 2147483649);
+ if (testView.getInt8(0) || !testView.getInt8(1)) redefineAll($DataViewPrototype, {
+ setInt8: function setInt8(byteOffset, value) {
+ $setInt8.call(this, byteOffset, value << 24 >> 24);
+ },
+ setUint8: function setUint8(byteOffset, value) {
+ $setInt8.call(this, byteOffset, value << 24 >> 24);
+ }
+ }, { unsafe: true });
+}
+
+setToStringTag($ArrayBuffer, ARRAY_BUFFER);
+setToStringTag($DataView, DATA_VIEW);
+
+module.exports = {
+ ArrayBuffer: $ArrayBuffer,
+ DataView: $DataView
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/array-copy-within.js":
+/*!*************************************************************!*\
+ !*** ./node_modules/core-js/internals/array-copy-within.js ***!
+ \*************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var toObject = __webpack_require__(/*! ../internals/to-object */ "./node_modules/core-js/internals/to-object.js");
+var toAbsoluteIndex = __webpack_require__(/*! ../internals/to-absolute-index */ "./node_modules/core-js/internals/to-absolute-index.js");
+var toLength = __webpack_require__(/*! ../internals/to-length */ "./node_modules/core-js/internals/to-length.js");
+
+var min = Math.min;
+
+// `Array.prototype.copyWithin` method implementation
+// https://tc39.es/ecma262/#sec-array.prototype.copywithin
+// eslint-disable-next-line es/no-array-prototype-copywithin -- safe
+module.exports = [].copyWithin || function copyWithin(target /* = 0 */, start /* = 0, end = @length */) {
+ var O = toObject(this);
+ var len = toLength(O.length);
+ var to = toAbsoluteIndex(target, len);
+ var from = toAbsoluteIndex(start, len);
+ var end = arguments.length > 2 ? arguments[2] : undefined;
+ var count = min((end === undefined ? len : toAbsoluteIndex(end, len)) - from, len - to);
+ var inc = 1;
+ if (from < to && to < from + count) {
+ inc = -1;
+ from += count - 1;
+ to += count - 1;
+ }
+ while (count-- > 0) {
+ if (from in O) O[to] = O[from];
+ else delete O[to];
+ to += inc;
+ from += inc;
+ } return O;
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/array-fill.js":
+/*!******************************************************!*\
+ !*** ./node_modules/core-js/internals/array-fill.js ***!
+ \******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var toObject = __webpack_require__(/*! ../internals/to-object */ "./node_modules/core-js/internals/to-object.js");
+var toAbsoluteIndex = __webpack_require__(/*! ../internals/to-absolute-index */ "./node_modules/core-js/internals/to-absolute-index.js");
+var toLength = __webpack_require__(/*! ../internals/to-length */ "./node_modules/core-js/internals/to-length.js");
+
+// `Array.prototype.fill` method implementation
+// https://tc39.es/ecma262/#sec-array.prototype.fill
+module.exports = function fill(value /* , start = 0, end = @length */) {
+ var O = toObject(this);
+ var length = toLength(O.length);
+ var argumentsLength = arguments.length;
+ var index = toAbsoluteIndex(argumentsLength > 1 ? arguments[1] : undefined, length);
+ var end = argumentsLength > 2 ? arguments[2] : undefined;
+ var endPos = end === undefined ? length : toAbsoluteIndex(end, length);
+ while (endPos > index) O[index++] = value;
+ return O;
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/array-for-each.js":
+/*!**********************************************************!*\
+ !*** ./node_modules/core-js/internals/array-for-each.js ***!
+ \**********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $forEach = __webpack_require__(/*! ../internals/array-iteration */ "./node_modules/core-js/internals/array-iteration.js").forEach;
+var arrayMethodIsStrict = __webpack_require__(/*! ../internals/array-method-is-strict */ "./node_modules/core-js/internals/array-method-is-strict.js");
+
+var STRICT_METHOD = arrayMethodIsStrict('forEach');
+
+// `Array.prototype.forEach` method implementation
+// https://tc39.es/ecma262/#sec-array.prototype.foreach
+module.exports = !STRICT_METHOD ? function forEach(callbackfn /* , thisArg */) {
+ return $forEach(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);
+// eslint-disable-next-line es/no-array-prototype-foreach -- safe
+} : [].forEach;
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/array-from-constructor-and-list.js":
+/*!***************************************************************************!*\
+ !*** ./node_modules/core-js/internals/array-from-constructor-and-list.js ***!
+ \***************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+module.exports = function (Constructor, list) {
+ var index = 0;
+ var length = list.length;
+ var result = new Constructor(length);
+ while (length > index) result[index] = list[index++];
+ return result;
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/array-from.js":
+/*!******************************************************!*\
+ !*** ./node_modules/core-js/internals/array-from.js ***!
+ \******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var bind = __webpack_require__(/*! ../internals/function-bind-context */ "./node_modules/core-js/internals/function-bind-context.js");
+var toObject = __webpack_require__(/*! ../internals/to-object */ "./node_modules/core-js/internals/to-object.js");
+var callWithSafeIterationClosing = __webpack_require__(/*! ../internals/call-with-safe-iteration-closing */ "./node_modules/core-js/internals/call-with-safe-iteration-closing.js");
+var isArrayIteratorMethod = __webpack_require__(/*! ../internals/is-array-iterator-method */ "./node_modules/core-js/internals/is-array-iterator-method.js");
+var isConstructor = __webpack_require__(/*! ../internals/is-constructor */ "./node_modules/core-js/internals/is-constructor.js");
+var toLength = __webpack_require__(/*! ../internals/to-length */ "./node_modules/core-js/internals/to-length.js");
+var createProperty = __webpack_require__(/*! ../internals/create-property */ "./node_modules/core-js/internals/create-property.js");
+var getIterator = __webpack_require__(/*! ../internals/get-iterator */ "./node_modules/core-js/internals/get-iterator.js");
+var getIteratorMethod = __webpack_require__(/*! ../internals/get-iterator-method */ "./node_modules/core-js/internals/get-iterator-method.js");
+
+// `Array.from` method implementation
+// https://tc39.es/ecma262/#sec-array.from
+module.exports = function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) {
+ var O = toObject(arrayLike);
+ var IS_CONSTRUCTOR = isConstructor(this);
+ var argumentsLength = arguments.length;
+ var mapfn = argumentsLength > 1 ? arguments[1] : undefined;
+ var mapping = mapfn !== undefined;
+ if (mapping) mapfn = bind(mapfn, argumentsLength > 2 ? arguments[2] : undefined, 2);
+ var iteratorMethod = getIteratorMethod(O);
+ var index = 0;
+ var length, result, step, iterator, next, value;
+ // if the target is not iterable or it's an array with the default iterator - use a simple case
+ if (iteratorMethod && !(this == Array && isArrayIteratorMethod(iteratorMethod))) {
+ iterator = getIterator(O, iteratorMethod);
+ next = iterator.next;
+ result = IS_CONSTRUCTOR ? new this() : [];
+ for (;!(step = next.call(iterator)).done; index++) {
+ value = mapping ? callWithSafeIterationClosing(iterator, mapfn, [step.value, index], true) : step.value;
+ createProperty(result, index, value);
+ }
+ } else {
+ length = toLength(O.length);
+ result = IS_CONSTRUCTOR ? new this(length) : Array(length);
+ for (;length > index; index++) {
+ value = mapping ? mapfn(O[index], index) : O[index];
+ createProperty(result, index, value);
+ }
+ }
+ result.length = index;
+ return result;
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/array-includes.js":
+/*!**********************************************************!*\
+ !*** ./node_modules/core-js/internals/array-includes.js ***!
+ \**********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ "./node_modules/core-js/internals/to-indexed-object.js");
+var toLength = __webpack_require__(/*! ../internals/to-length */ "./node_modules/core-js/internals/to-length.js");
+var toAbsoluteIndex = __webpack_require__(/*! ../internals/to-absolute-index */ "./node_modules/core-js/internals/to-absolute-index.js");
+
+// `Array.prototype.{ indexOf, includes }` methods implementation
+var createMethod = function (IS_INCLUDES) {
+ return function ($this, el, fromIndex) {
+ var O = toIndexedObject($this);
+ var length = toLength(O.length);
+ var index = toAbsoluteIndex(fromIndex, length);
+ var value;
+ // Array#includes uses SameValueZero equality algorithm
+ // eslint-disable-next-line no-self-compare -- NaN check
+ if (IS_INCLUDES && el != el) while (length > index) {
+ value = O[index++];
+ // eslint-disable-next-line no-self-compare -- NaN check
+ if (value != value) return true;
+ // Array#indexOf ignores holes, Array#includes - not
+ } else for (;length > index; index++) {
+ if ((IS_INCLUDES || index in O) && O[index] === el) return IS_INCLUDES || index || 0;
+ } return !IS_INCLUDES && -1;
+ };
+};
+
+module.exports = {
+ // `Array.prototype.includes` method
+ // https://tc39.es/ecma262/#sec-array.prototype.includes
+ includes: createMethod(true),
+ // `Array.prototype.indexOf` method
+ // https://tc39.es/ecma262/#sec-array.prototype.indexof
+ indexOf: createMethod(false)
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/array-iteration.js":
+/*!***********************************************************!*\
+ !*** ./node_modules/core-js/internals/array-iteration.js ***!
+ \***********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var bind = __webpack_require__(/*! ../internals/function-bind-context */ "./node_modules/core-js/internals/function-bind-context.js");
+var IndexedObject = __webpack_require__(/*! ../internals/indexed-object */ "./node_modules/core-js/internals/indexed-object.js");
+var toObject = __webpack_require__(/*! ../internals/to-object */ "./node_modules/core-js/internals/to-object.js");
+var toLength = __webpack_require__(/*! ../internals/to-length */ "./node_modules/core-js/internals/to-length.js");
+var arraySpeciesCreate = __webpack_require__(/*! ../internals/array-species-create */ "./node_modules/core-js/internals/array-species-create.js");
+
+var push = [].push;
+
+// `Array.prototype.{ forEach, map, filter, some, every, find, findIndex, filterReject }` methods implementation
+var createMethod = function (TYPE) {
+ var IS_MAP = TYPE == 1;
+ var IS_FILTER = TYPE == 2;
+ var IS_SOME = TYPE == 3;
+ var IS_EVERY = TYPE == 4;
+ var IS_FIND_INDEX = TYPE == 6;
+ var IS_FILTER_REJECT = TYPE == 7;
+ var NO_HOLES = TYPE == 5 || IS_FIND_INDEX;
+ return function ($this, callbackfn, that, specificCreate) {
+ var O = toObject($this);
+ var self = IndexedObject(O);
+ var boundFunction = bind(callbackfn, that, 3);
+ var length = toLength(self.length);
+ var index = 0;
+ var create = specificCreate || arraySpeciesCreate;
+ var target = IS_MAP ? create($this, length) : IS_FILTER || IS_FILTER_REJECT ? create($this, 0) : undefined;
+ var value, result;
+ for (;length > index; index++) if (NO_HOLES || index in self) {
+ value = self[index];
+ result = boundFunction(value, index, O);
+ if (TYPE) {
+ if (IS_MAP) target[index] = result; // map
+ else if (result) switch (TYPE) {
+ case 3: return true; // some
+ case 5: return value; // find
+ case 6: return index; // findIndex
+ case 2: push.call(target, value); // filter
+ } else switch (TYPE) {
+ case 4: return false; // every
+ case 7: push.call(target, value); // filterReject
+ }
+ }
+ }
+ return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : target;
+ };
+};
+
+module.exports = {
+ // `Array.prototype.forEach` method
+ // https://tc39.es/ecma262/#sec-array.prototype.foreach
+ forEach: createMethod(0),
+ // `Array.prototype.map` method
+ // https://tc39.es/ecma262/#sec-array.prototype.map
+ map: createMethod(1),
+ // `Array.prototype.filter` method
+ // https://tc39.es/ecma262/#sec-array.prototype.filter
+ filter: createMethod(2),
+ // `Array.prototype.some` method
+ // https://tc39.es/ecma262/#sec-array.prototype.some
+ some: createMethod(3),
+ // `Array.prototype.every` method
+ // https://tc39.es/ecma262/#sec-array.prototype.every
+ every: createMethod(4),
+ // `Array.prototype.find` method
+ // https://tc39.es/ecma262/#sec-array.prototype.find
+ find: createMethod(5),
+ // `Array.prototype.findIndex` method
+ // https://tc39.es/ecma262/#sec-array.prototype.findIndex
+ findIndex: createMethod(6),
+ // `Array.prototype.filterReject` method
+ // https://github.com/tc39/proposal-array-filtering
+ filterReject: createMethod(7)
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/array-last-index-of.js":
+/*!***************************************************************!*\
+ !*** ./node_modules/core-js/internals/array-last-index-of.js ***!
+ \***************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+/* eslint-disable es/no-array-prototype-lastindexof -- safe */
+var toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ "./node_modules/core-js/internals/to-indexed-object.js");
+var toInteger = __webpack_require__(/*! ../internals/to-integer */ "./node_modules/core-js/internals/to-integer.js");
+var toLength = __webpack_require__(/*! ../internals/to-length */ "./node_modules/core-js/internals/to-length.js");
+var arrayMethodIsStrict = __webpack_require__(/*! ../internals/array-method-is-strict */ "./node_modules/core-js/internals/array-method-is-strict.js");
+
+var min = Math.min;
+var $lastIndexOf = [].lastIndexOf;
+var NEGATIVE_ZERO = !!$lastIndexOf && 1 / [1].lastIndexOf(1, -0) < 0;
+var STRICT_METHOD = arrayMethodIsStrict('lastIndexOf');
+var FORCED = NEGATIVE_ZERO || !STRICT_METHOD;
+
+// `Array.prototype.lastIndexOf` method implementation
+// https://tc39.es/ecma262/#sec-array.prototype.lastindexof
+module.exports = FORCED ? function lastIndexOf(searchElement /* , fromIndex = @[*-1] */) {
+ // convert -0 to +0
+ if (NEGATIVE_ZERO) return $lastIndexOf.apply(this, arguments) || 0;
+ var O = toIndexedObject(this);
+ var length = toLength(O.length);
+ var index = length - 1;
+ if (arguments.length > 1) index = min(index, toInteger(arguments[1]));
+ if (index < 0) index = length + index;
+ for (;index >= 0; index--) if (index in O && O[index] === searchElement) return index || 0;
+ return -1;
+} : $lastIndexOf;
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/array-method-has-species-support.js":
+/*!****************************************************************************!*\
+ !*** ./node_modules/core-js/internals/array-method-has-species-support.js ***!
+ \****************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js");
+var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js");
+var V8_VERSION = __webpack_require__(/*! ../internals/engine-v8-version */ "./node_modules/core-js/internals/engine-v8-version.js");
+
+var SPECIES = wellKnownSymbol('species');
+
+module.exports = function (METHOD_NAME) {
+ // We can't use this feature detection in V8 since it causes
+ // deoptimization and serious performance degradation
+ // https://github.com/zloirock/core-js/issues/677
+ return V8_VERSION >= 51 || !fails(function () {
+ var array = [];
+ var constructor = array.constructor = {};
+ constructor[SPECIES] = function () {
+ return { foo: 1 };
+ };
+ return array[METHOD_NAME](Boolean).foo !== 1;
+ });
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/array-method-is-strict.js":
+/*!******************************************************************!*\
+ !*** ./node_modules/core-js/internals/array-method-is-strict.js ***!
+ \******************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js");
+
+module.exports = function (METHOD_NAME, argument) {
+ var method = [][METHOD_NAME];
+ return !!method && fails(function () {
+ // eslint-disable-next-line no-useless-call,no-throw-literal -- required for testing
+ method.call(null, argument || function () { throw 1; }, 1);
+ });
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/array-reduce.js":
+/*!********************************************************!*\
+ !*** ./node_modules/core-js/internals/array-reduce.js ***!
+ \********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var aCallable = __webpack_require__(/*! ../internals/a-callable */ "./node_modules/core-js/internals/a-callable.js");
+var toObject = __webpack_require__(/*! ../internals/to-object */ "./node_modules/core-js/internals/to-object.js");
+var IndexedObject = __webpack_require__(/*! ../internals/indexed-object */ "./node_modules/core-js/internals/indexed-object.js");
+var toLength = __webpack_require__(/*! ../internals/to-length */ "./node_modules/core-js/internals/to-length.js");
+
+// `Array.prototype.{ reduce, reduceRight }` methods implementation
+var createMethod = function (IS_RIGHT) {
+ return function (that, callbackfn, argumentsLength, memo) {
+ aCallable(callbackfn);
+ var O = toObject(that);
+ var self = IndexedObject(O);
+ var length = toLength(O.length);
+ var index = IS_RIGHT ? length - 1 : 0;
+ var i = IS_RIGHT ? -1 : 1;
+ if (argumentsLength < 2) while (true) {
+ if (index in self) {
+ memo = self[index];
+ index += i;
+ break;
+ }
+ index += i;
+ if (IS_RIGHT ? index < 0 : length <= index) {
+ throw TypeError('Reduce of empty array with no initial value');
+ }
+ }
+ for (;IS_RIGHT ? index >= 0 : length > index; index += i) if (index in self) {
+ memo = callbackfn(memo, self[index], index, O);
+ }
+ return memo;
+ };
+};
+
+module.exports = {
+ // `Array.prototype.reduce` method
+ // https://tc39.es/ecma262/#sec-array.prototype.reduce
+ left: createMethod(false),
+ // `Array.prototype.reduceRight` method
+ // https://tc39.es/ecma262/#sec-array.prototype.reduceright
+ right: createMethod(true)
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/array-sort.js":
+/*!******************************************************!*\
+ !*** ./node_modules/core-js/internals/array-sort.js ***!
+ \******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+// TODO: use something more complex like timsort?
+var floor = Math.floor;
+
+var mergeSort = function (array, comparefn) {
+ var length = array.length;
+ var middle = floor(length / 2);
+ return length < 8 ? insertionSort(array, comparefn) : merge(
+ mergeSort(array.slice(0, middle), comparefn),
+ mergeSort(array.slice(middle), comparefn),
+ comparefn
+ );
+};
+
+var insertionSort = function (array, comparefn) {
+ var length = array.length;
+ var i = 1;
+ var element, j;
+
+ while (i < length) {
+ j = i;
+ element = array[i];
+ while (j && comparefn(array[j - 1], element) > 0) {
+ array[j] = array[--j];
+ }
+ if (j !== i++) array[j] = element;
+ } return array;
+};
+
+var merge = function (left, right, comparefn) {
+ var llength = left.length;
+ var rlength = right.length;
+ var lindex = 0;
+ var rindex = 0;
+ var result = [];
+
+ while (lindex < llength || rindex < rlength) {
+ if (lindex < llength && rindex < rlength) {
+ result.push(comparefn(left[lindex], right[rindex]) <= 0 ? left[lindex++] : right[rindex++]);
+ } else {
+ result.push(lindex < llength ? left[lindex++] : right[rindex++]);
+ }
+ } return result;
+};
+
+module.exports = mergeSort;
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/array-species-constructor.js":
+/*!*********************************************************************!*\
+ !*** ./node_modules/core-js/internals/array-species-constructor.js ***!
+ \*********************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var isArray = __webpack_require__(/*! ../internals/is-array */ "./node_modules/core-js/internals/is-array.js");
+var isConstructor = __webpack_require__(/*! ../internals/is-constructor */ "./node_modules/core-js/internals/is-constructor.js");
+var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/core-js/internals/is-object.js");
+var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js");
+
+var SPECIES = wellKnownSymbol('species');
+
+// a part of `ArraySpeciesCreate` abstract operation
+// https://tc39.es/ecma262/#sec-arrayspeciescreate
+module.exports = function (originalArray) {
+ var C;
+ if (isArray(originalArray)) {
+ C = originalArray.constructor;
+ // cross-realm fallback
+ if (isConstructor(C) && (C === Array || isArray(C.prototype))) C = undefined;
+ else if (isObject(C)) {
+ C = C[SPECIES];
+ if (C === null) C = undefined;
+ }
+ } return C === undefined ? Array : C;
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/array-species-create.js":
+/*!****************************************************************!*\
+ !*** ./node_modules/core-js/internals/array-species-create.js ***!
+ \****************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var arraySpeciesConstructor = __webpack_require__(/*! ../internals/array-species-constructor */ "./node_modules/core-js/internals/array-species-constructor.js");
+
+// `ArraySpeciesCreate` abstract operation
+// https://tc39.es/ecma262/#sec-arrayspeciescreate
+module.exports = function (originalArray, length) {
+ return new (arraySpeciesConstructor(originalArray))(length === 0 ? 0 : length);
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/call-with-safe-iteration-closing.js":
+/*!****************************************************************************!*\
+ !*** ./node_modules/core-js/internals/call-with-safe-iteration-closing.js ***!
+ \****************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/core-js/internals/an-object.js");
+var iteratorClose = __webpack_require__(/*! ../internals/iterator-close */ "./node_modules/core-js/internals/iterator-close.js");
+
+// call something on iterator step with safe closing on error
+module.exports = function (iterator, fn, value, ENTRIES) {
+ try {
+ return ENTRIES ? fn(anObject(value)[0], value[1]) : fn(value);
+ } catch (error) {
+ iteratorClose(iterator, 'throw', error);
+ }
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/check-correctness-of-iteration.js":
+/*!**************************************************************************!*\
+ !*** ./node_modules/core-js/internals/check-correctness-of-iteration.js ***!
+ \**************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js");
+
+var ITERATOR = wellKnownSymbol('iterator');
+var SAFE_CLOSING = false;
+
+try {
+ var called = 0;
+ var iteratorWithReturn = {
+ next: function () {
+ return { done: !!called++ };
+ },
+ 'return': function () {
+ SAFE_CLOSING = true;
+ }
+ };
+ iteratorWithReturn[ITERATOR] = function () {
+ return this;
+ };
+ // eslint-disable-next-line es/no-array-from, no-throw-literal -- required for testing
+ Array.from(iteratorWithReturn, function () { throw 2; });
+} catch (error) { /* empty */ }
+
+module.exports = function (exec, SKIP_CLOSING) {
+ if (!SKIP_CLOSING && !SAFE_CLOSING) return false;
+ var ITERATION_SUPPORT = false;
+ try {
+ var object = {};
+ object[ITERATOR] = function () {
+ return {
+ next: function () {
+ return { done: ITERATION_SUPPORT = true };
+ }
+ };
+ };
+ exec(object);
+ } catch (error) { /* empty */ }
+ return ITERATION_SUPPORT;
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/classof-raw.js":
+/*!*******************************************************!*\
+ !*** ./node_modules/core-js/internals/classof-raw.js ***!
+ \*******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+var toString = {}.toString;
+
+module.exports = function (it) {
+ return toString.call(it).slice(8, -1);
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/classof.js":
+/*!***************************************************!*\
+ !*** ./node_modules/core-js/internals/classof.js ***!
+ \***************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var TO_STRING_TAG_SUPPORT = __webpack_require__(/*! ../internals/to-string-tag-support */ "./node_modules/core-js/internals/to-string-tag-support.js");
+var isCallable = __webpack_require__(/*! ../internals/is-callable */ "./node_modules/core-js/internals/is-callable.js");
+var classofRaw = __webpack_require__(/*! ../internals/classof-raw */ "./node_modules/core-js/internals/classof-raw.js");
+var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js");
+
+var TO_STRING_TAG = wellKnownSymbol('toStringTag');
+// ES3 wrong here
+var CORRECT_ARGUMENTS = classofRaw(function () { return arguments; }()) == 'Arguments';
+
+// fallback for IE11 Script Access Denied error
+var tryGet = function (it, key) {
+ try {
+ return it[key];
+ } catch (error) { /* empty */ }
+};
+
+// getting tag from ES6+ `Object.prototype.toString`
+module.exports = TO_STRING_TAG_SUPPORT ? classofRaw : function (it) {
+ var O, tag, result;
+ return it === undefined ? 'Undefined' : it === null ? 'Null'
+ // @@toStringTag case
+ : typeof (tag = tryGet(O = Object(it), TO_STRING_TAG)) == 'string' ? tag
+ // builtinTag case
+ : CORRECT_ARGUMENTS ? classofRaw(O)
+ // ES3 arguments fallback
+ : (result = classofRaw(O)) == 'Object' && isCallable(O.callee) ? 'Arguments' : result;
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/collection-strong.js":
+/*!*************************************************************!*\
+ !*** ./node_modules/core-js/internals/collection-strong.js ***!
+ \*************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var defineProperty = __webpack_require__(/*! ../internals/object-define-property */ "./node_modules/core-js/internals/object-define-property.js").f;
+var create = __webpack_require__(/*! ../internals/object-create */ "./node_modules/core-js/internals/object-create.js");
+var redefineAll = __webpack_require__(/*! ../internals/redefine-all */ "./node_modules/core-js/internals/redefine-all.js");
+var bind = __webpack_require__(/*! ../internals/function-bind-context */ "./node_modules/core-js/internals/function-bind-context.js");
+var anInstance = __webpack_require__(/*! ../internals/an-instance */ "./node_modules/core-js/internals/an-instance.js");
+var iterate = __webpack_require__(/*! ../internals/iterate */ "./node_modules/core-js/internals/iterate.js");
+var defineIterator = __webpack_require__(/*! ../internals/define-iterator */ "./node_modules/core-js/internals/define-iterator.js");
+var setSpecies = __webpack_require__(/*! ../internals/set-species */ "./node_modules/core-js/internals/set-species.js");
+var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/core-js/internals/descriptors.js");
+var fastKey = __webpack_require__(/*! ../internals/internal-metadata */ "./node_modules/core-js/internals/internal-metadata.js").fastKey;
+var InternalStateModule = __webpack_require__(/*! ../internals/internal-state */ "./node_modules/core-js/internals/internal-state.js");
+
+var setInternalState = InternalStateModule.set;
+var internalStateGetterFor = InternalStateModule.getterFor;
+
+module.exports = {
+ getConstructor: function (wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER) {
+ var C = wrapper(function (that, iterable) {
+ anInstance(that, C, CONSTRUCTOR_NAME);
+ setInternalState(that, {
+ type: CONSTRUCTOR_NAME,
+ index: create(null),
+ first: undefined,
+ last: undefined,
+ size: 0
+ });
+ if (!DESCRIPTORS) that.size = 0;
+ if (iterable != undefined) iterate(iterable, that[ADDER], { that: that, AS_ENTRIES: IS_MAP });
+ });
+
+ var getInternalState = internalStateGetterFor(CONSTRUCTOR_NAME);
+
+ var define = function (that, key, value) {
+ var state = getInternalState(that);
+ var entry = getEntry(that, key);
+ var previous, index;
+ // change existing entry
+ if (entry) {
+ entry.value = value;
+ // create new entry
+ } else {
+ state.last = entry = {
+ index: index = fastKey(key, true),
+ key: key,
+ value: value,
+ previous: previous = state.last,
+ next: undefined,
+ removed: false
+ };
+ if (!state.first) state.first = entry;
+ if (previous) previous.next = entry;
+ if (DESCRIPTORS) state.size++;
+ else that.size++;
+ // add to index
+ if (index !== 'F') state.index[index] = entry;
+ } return that;
+ };
+
+ var getEntry = function (that, key) {
+ var state = getInternalState(that);
+ // fast case
+ var index = fastKey(key);
+ var entry;
+ if (index !== 'F') return state.index[index];
+ // frozen object case
+ for (entry = state.first; entry; entry = entry.next) {
+ if (entry.key == key) return entry;
+ }
+ };
+
+ redefineAll(C.prototype, {
+ // `{ Map, Set }.prototype.clear()` methods
+ // https://tc39.es/ecma262/#sec-map.prototype.clear
+ // https://tc39.es/ecma262/#sec-set.prototype.clear
+ clear: function clear() {
+ var that = this;
+ var state = getInternalState(that);
+ var data = state.index;
+ var entry = state.first;
+ while (entry) {
+ entry.removed = true;
+ if (entry.previous) entry.previous = entry.previous.next = undefined;
+ delete data[entry.index];
+ entry = entry.next;
+ }
+ state.first = state.last = undefined;
+ if (DESCRIPTORS) state.size = 0;
+ else that.size = 0;
+ },
+ // `{ Map, Set }.prototype.delete(key)` methods
+ // https://tc39.es/ecma262/#sec-map.prototype.delete
+ // https://tc39.es/ecma262/#sec-set.prototype.delete
+ 'delete': function (key) {
+ var that = this;
+ var state = getInternalState(that);
+ var entry = getEntry(that, key);
+ if (entry) {
+ var next = entry.next;
+ var prev = entry.previous;
+ delete state.index[entry.index];
+ entry.removed = true;
+ if (prev) prev.next = next;
+ if (next) next.previous = prev;
+ if (state.first == entry) state.first = next;
+ if (state.last == entry) state.last = prev;
+ if (DESCRIPTORS) state.size--;
+ else that.size--;
+ } return !!entry;
+ },
+ // `{ Map, Set }.prototype.forEach(callbackfn, thisArg = undefined)` methods
+ // https://tc39.es/ecma262/#sec-map.prototype.foreach
+ // https://tc39.es/ecma262/#sec-set.prototype.foreach
+ forEach: function forEach(callbackfn /* , that = undefined */) {
+ var state = getInternalState(this);
+ var boundFunction = bind(callbackfn, arguments.length > 1 ? arguments[1] : undefined, 3);
+ var entry;
+ while (entry = entry ? entry.next : state.first) {
+ boundFunction(entry.value, entry.key, this);
+ // revert to the last existing entry
+ while (entry && entry.removed) entry = entry.previous;
+ }
+ },
+ // `{ Map, Set}.prototype.has(key)` methods
+ // https://tc39.es/ecma262/#sec-map.prototype.has
+ // https://tc39.es/ecma262/#sec-set.prototype.has
+ has: function has(key) {
+ return !!getEntry(this, key);
+ }
+ });
+
+ redefineAll(C.prototype, IS_MAP ? {
+ // `Map.prototype.get(key)` method
+ // https://tc39.es/ecma262/#sec-map.prototype.get
+ get: function get(key) {
+ var entry = getEntry(this, key);
+ return entry && entry.value;
+ },
+ // `Map.prototype.set(key, value)` method
+ // https://tc39.es/ecma262/#sec-map.prototype.set
+ set: function set(key, value) {
+ return define(this, key === 0 ? 0 : key, value);
+ }
+ } : {
+ // `Set.prototype.add(value)` method
+ // https://tc39.es/ecma262/#sec-set.prototype.add
+ add: function add(value) {
+ return define(this, value = value === 0 ? 0 : value, value);
+ }
+ });
+ if (DESCRIPTORS) defineProperty(C.prototype, 'size', {
+ get: function () {
+ return getInternalState(this).size;
+ }
+ });
+ return C;
+ },
+ setStrong: function (C, CONSTRUCTOR_NAME, IS_MAP) {
+ var ITERATOR_NAME = CONSTRUCTOR_NAME + ' Iterator';
+ var getInternalCollectionState = internalStateGetterFor(CONSTRUCTOR_NAME);
+ var getInternalIteratorState = internalStateGetterFor(ITERATOR_NAME);
+ // `{ Map, Set }.prototype.{ keys, values, entries, @@iterator }()` methods
+ // https://tc39.es/ecma262/#sec-map.prototype.entries
+ // https://tc39.es/ecma262/#sec-map.prototype.keys
+ // https://tc39.es/ecma262/#sec-map.prototype.values
+ // https://tc39.es/ecma262/#sec-map.prototype-@@iterator
+ // https://tc39.es/ecma262/#sec-set.prototype.entries
+ // https://tc39.es/ecma262/#sec-set.prototype.keys
+ // https://tc39.es/ecma262/#sec-set.prototype.values
+ // https://tc39.es/ecma262/#sec-set.prototype-@@iterator
+ defineIterator(C, CONSTRUCTOR_NAME, function (iterated, kind) {
+ setInternalState(this, {
+ type: ITERATOR_NAME,
+ target: iterated,
+ state: getInternalCollectionState(iterated),
+ kind: kind,
+ last: undefined
+ });
+ }, function () {
+ var state = getInternalIteratorState(this);
+ var kind = state.kind;
+ var entry = state.last;
+ // revert to the last existing entry
+ while (entry && entry.removed) entry = entry.previous;
+ // get next entry
+ if (!state.target || !(state.last = entry = entry ? entry.next : state.state.first)) {
+ // or finish the iteration
+ state.target = undefined;
+ return { value: undefined, done: true };
+ }
+ // return step by kind
+ if (kind == 'keys') return { value: entry.key, done: false };
+ if (kind == 'values') return { value: entry.value, done: false };
+ return { value: [entry.key, entry.value], done: false };
+ }, IS_MAP ? 'entries' : 'values', !IS_MAP, true);
+
+ // `{ Map, Set }.prototype[@@species]` accessors
+ // https://tc39.es/ecma262/#sec-get-map-@@species
+ // https://tc39.es/ecma262/#sec-get-set-@@species
+ setSpecies(CONSTRUCTOR_NAME);
+ }
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/collection-weak.js":
+/*!***********************************************************!*\
+ !*** ./node_modules/core-js/internals/collection-weak.js ***!
+ \***********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var redefineAll = __webpack_require__(/*! ../internals/redefine-all */ "./node_modules/core-js/internals/redefine-all.js");
+var getWeakData = __webpack_require__(/*! ../internals/internal-metadata */ "./node_modules/core-js/internals/internal-metadata.js").getWeakData;
+var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/core-js/internals/an-object.js");
+var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/core-js/internals/is-object.js");
+var anInstance = __webpack_require__(/*! ../internals/an-instance */ "./node_modules/core-js/internals/an-instance.js");
+var iterate = __webpack_require__(/*! ../internals/iterate */ "./node_modules/core-js/internals/iterate.js");
+var ArrayIterationModule = __webpack_require__(/*! ../internals/array-iteration */ "./node_modules/core-js/internals/array-iteration.js");
+var $has = __webpack_require__(/*! ../internals/has */ "./node_modules/core-js/internals/has.js");
+var InternalStateModule = __webpack_require__(/*! ../internals/internal-state */ "./node_modules/core-js/internals/internal-state.js");
+
+var setInternalState = InternalStateModule.set;
+var internalStateGetterFor = InternalStateModule.getterFor;
+var find = ArrayIterationModule.find;
+var findIndex = ArrayIterationModule.findIndex;
+var id = 0;
+
+// fallback for uncaught frozen keys
+var uncaughtFrozenStore = function (store) {
+ return store.frozen || (store.frozen = new UncaughtFrozenStore());
+};
+
+var UncaughtFrozenStore = function () {
+ this.entries = [];
+};
+
+var findUncaughtFrozen = function (store, key) {
+ return find(store.entries, function (it) {
+ return it[0] === key;
+ });
+};
+
+UncaughtFrozenStore.prototype = {
+ get: function (key) {
+ var entry = findUncaughtFrozen(this, key);
+ if (entry) return entry[1];
+ },
+ has: function (key) {
+ return !!findUncaughtFrozen(this, key);
+ },
+ set: function (key, value) {
+ var entry = findUncaughtFrozen(this, key);
+ if (entry) entry[1] = value;
+ else this.entries.push([key, value]);
+ },
+ 'delete': function (key) {
+ var index = findIndex(this.entries, function (it) {
+ return it[0] === key;
+ });
+ if (~index) this.entries.splice(index, 1);
+ return !!~index;
+ }
+};
+
+module.exports = {
+ getConstructor: function (wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER) {
+ var C = wrapper(function (that, iterable) {
+ anInstance(that, C, CONSTRUCTOR_NAME);
+ setInternalState(that, {
+ type: CONSTRUCTOR_NAME,
+ id: id++,
+ frozen: undefined
+ });
+ if (iterable != undefined) iterate(iterable, that[ADDER], { that: that, AS_ENTRIES: IS_MAP });
+ });
+
+ var getInternalState = internalStateGetterFor(CONSTRUCTOR_NAME);
+
+ var define = function (that, key, value) {
+ var state = getInternalState(that);
+ var data = getWeakData(anObject(key), true);
+ if (data === true) uncaughtFrozenStore(state).set(key, value);
+ else data[state.id] = value;
+ return that;
+ };
+
+ redefineAll(C.prototype, {
+ // `{ WeakMap, WeakSet }.prototype.delete(key)` methods
+ // https://tc39.es/ecma262/#sec-weakmap.prototype.delete
+ // https://tc39.es/ecma262/#sec-weakset.prototype.delete
+ 'delete': function (key) {
+ var state = getInternalState(this);
+ if (!isObject(key)) return false;
+ var data = getWeakData(key);
+ if (data === true) return uncaughtFrozenStore(state)['delete'](key);
+ return data && $has(data, state.id) && delete data[state.id];
+ },
+ // `{ WeakMap, WeakSet }.prototype.has(key)` methods
+ // https://tc39.es/ecma262/#sec-weakmap.prototype.has
+ // https://tc39.es/ecma262/#sec-weakset.prototype.has
+ has: function has(key) {
+ var state = getInternalState(this);
+ if (!isObject(key)) return false;
+ var data = getWeakData(key);
+ if (data === true) return uncaughtFrozenStore(state).has(key);
+ return data && $has(data, state.id);
+ }
+ });
+
+ redefineAll(C.prototype, IS_MAP ? {
+ // `WeakMap.prototype.get(key)` method
+ // https://tc39.es/ecma262/#sec-weakmap.prototype.get
+ get: function get(key) {
+ var state = getInternalState(this);
+ if (isObject(key)) {
+ var data = getWeakData(key);
+ if (data === true) return uncaughtFrozenStore(state).get(key);
+ return data ? data[state.id] : undefined;
+ }
+ },
+ // `WeakMap.prototype.set(key, value)` method
+ // https://tc39.es/ecma262/#sec-weakmap.prototype.set
+ set: function set(key, value) {
+ return define(this, key, value);
+ }
+ } : {
+ // `WeakSet.prototype.add(value)` method
+ // https://tc39.es/ecma262/#sec-weakset.prototype.add
+ add: function add(value) {
+ return define(this, value, true);
+ }
+ });
+
+ return C;
+ }
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/collection.js":
+/*!******************************************************!*\
+ !*** ./node_modules/core-js/internals/collection.js ***!
+ \******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js");
+var isForced = __webpack_require__(/*! ../internals/is-forced */ "./node_modules/core-js/internals/is-forced.js");
+var redefine = __webpack_require__(/*! ../internals/redefine */ "./node_modules/core-js/internals/redefine.js");
+var InternalMetadataModule = __webpack_require__(/*! ../internals/internal-metadata */ "./node_modules/core-js/internals/internal-metadata.js");
+var iterate = __webpack_require__(/*! ../internals/iterate */ "./node_modules/core-js/internals/iterate.js");
+var anInstance = __webpack_require__(/*! ../internals/an-instance */ "./node_modules/core-js/internals/an-instance.js");
+var isCallable = __webpack_require__(/*! ../internals/is-callable */ "./node_modules/core-js/internals/is-callable.js");
+var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/core-js/internals/is-object.js");
+var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js");
+var checkCorrectnessOfIteration = __webpack_require__(/*! ../internals/check-correctness-of-iteration */ "./node_modules/core-js/internals/check-correctness-of-iteration.js");
+var setToStringTag = __webpack_require__(/*! ../internals/set-to-string-tag */ "./node_modules/core-js/internals/set-to-string-tag.js");
+var inheritIfRequired = __webpack_require__(/*! ../internals/inherit-if-required */ "./node_modules/core-js/internals/inherit-if-required.js");
+
+module.exports = function (CONSTRUCTOR_NAME, wrapper, common) {
+ var IS_MAP = CONSTRUCTOR_NAME.indexOf('Map') !== -1;
+ var IS_WEAK = CONSTRUCTOR_NAME.indexOf('Weak') !== -1;
+ var ADDER = IS_MAP ? 'set' : 'add';
+ var NativeConstructor = global[CONSTRUCTOR_NAME];
+ var NativePrototype = NativeConstructor && NativeConstructor.prototype;
+ var Constructor = NativeConstructor;
+ var exported = {};
+
+ var fixMethod = function (KEY) {
+ var nativeMethod = NativePrototype[KEY];
+ redefine(NativePrototype, KEY,
+ KEY == 'add' ? function add(value) {
+ nativeMethod.call(this, value === 0 ? 0 : value);
+ return this;
+ } : KEY == 'delete' ? function (key) {
+ return IS_WEAK && !isObject(key) ? false : nativeMethod.call(this, key === 0 ? 0 : key);
+ } : KEY == 'get' ? function get(key) {
+ return IS_WEAK && !isObject(key) ? undefined : nativeMethod.call(this, key === 0 ? 0 : key);
+ } : KEY == 'has' ? function has(key) {
+ return IS_WEAK && !isObject(key) ? false : nativeMethod.call(this, key === 0 ? 0 : key);
+ } : function set(key, value) {
+ nativeMethod.call(this, key === 0 ? 0 : key, value);
+ return this;
+ }
+ );
+ };
+
+ var REPLACE = isForced(
+ CONSTRUCTOR_NAME,
+ !isCallable(NativeConstructor) || !(IS_WEAK || NativePrototype.forEach && !fails(function () {
+ new NativeConstructor().entries().next();
+ }))
+ );
+
+ if (REPLACE) {
+ // create collection constructor
+ Constructor = common.getConstructor(wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER);
+ InternalMetadataModule.enable();
+ } else if (isForced(CONSTRUCTOR_NAME, true)) {
+ var instance = new Constructor();
+ // early implementations not supports chaining
+ var HASNT_CHAINING = instance[ADDER](IS_WEAK ? {} : -0, 1) != instance;
+ // V8 ~ Chromium 40- weak-collections throws on primitives, but should return false
+ var THROWS_ON_PRIMITIVES = fails(function () { instance.has(1); });
+ // most early implementations doesn't supports iterables, most modern - not close it correctly
+ // eslint-disable-next-line no-new -- required for testing
+ var ACCEPT_ITERABLES = checkCorrectnessOfIteration(function (iterable) { new NativeConstructor(iterable); });
+ // for early implementations -0 and +0 not the same
+ var BUGGY_ZERO = !IS_WEAK && fails(function () {
+ // V8 ~ Chromium 42- fails only with 5+ elements
+ var $instance = new NativeConstructor();
+ var index = 5;
+ while (index--) $instance[ADDER](index, index);
+ return !$instance.has(-0);
+ });
+
+ if (!ACCEPT_ITERABLES) {
+ Constructor = wrapper(function (dummy, iterable) {
+ anInstance(dummy, Constructor, CONSTRUCTOR_NAME);
+ var that = inheritIfRequired(new NativeConstructor(), dummy, Constructor);
+ if (iterable != undefined) iterate(iterable, that[ADDER], { that: that, AS_ENTRIES: IS_MAP });
+ return that;
+ });
+ Constructor.prototype = NativePrototype;
+ NativePrototype.constructor = Constructor;
+ }
+
+ if (THROWS_ON_PRIMITIVES || BUGGY_ZERO) {
+ fixMethod('delete');
+ fixMethod('has');
+ IS_MAP && fixMethod('get');
+ }
+
+ if (BUGGY_ZERO || HASNT_CHAINING) fixMethod(ADDER);
+
+ // weak collections should not contains .clear method
+ if (IS_WEAK && NativePrototype.clear) delete NativePrototype.clear;
+ }
+
+ exported[CONSTRUCTOR_NAME] = Constructor;
+ $({ global: true, forced: Constructor != NativeConstructor }, exported);
+
+ setToStringTag(Constructor, CONSTRUCTOR_NAME);
+
+ if (!IS_WEAK) common.setStrong(Constructor, CONSTRUCTOR_NAME, IS_MAP);
+
+ return Constructor;
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/copy-constructor-properties.js":
+/*!***********************************************************************!*\
+ !*** ./node_modules/core-js/internals/copy-constructor-properties.js ***!
+ \***********************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var has = __webpack_require__(/*! ../internals/has */ "./node_modules/core-js/internals/has.js");
+var ownKeys = __webpack_require__(/*! ../internals/own-keys */ "./node_modules/core-js/internals/own-keys.js");
+var getOwnPropertyDescriptorModule = __webpack_require__(/*! ../internals/object-get-own-property-descriptor */ "./node_modules/core-js/internals/object-get-own-property-descriptor.js");
+var definePropertyModule = __webpack_require__(/*! ../internals/object-define-property */ "./node_modules/core-js/internals/object-define-property.js");
+
+module.exports = function (target, source) {
+ var keys = ownKeys(source);
+ var defineProperty = definePropertyModule.f;
+ var getOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f;
+ for (var i = 0; i < keys.length; i++) {
+ var key = keys[i];
+ if (!has(target, key)) defineProperty(target, key, getOwnPropertyDescriptor(source, key));
+ }
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/correct-is-regexp-logic.js":
+/*!*******************************************************************!*\
+ !*** ./node_modules/core-js/internals/correct-is-regexp-logic.js ***!
+ \*******************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js");
+
+var MATCH = wellKnownSymbol('match');
+
+module.exports = function (METHOD_NAME) {
+ var regexp = /./;
+ try {
+ '/./'[METHOD_NAME](regexp);
+ } catch (error1) {
+ try {
+ regexp[MATCH] = false;
+ return '/./'[METHOD_NAME](regexp);
+ } catch (error2) { /* empty */ }
+ } return false;
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/correct-prototype-getter.js":
+/*!********************************************************************!*\
+ !*** ./node_modules/core-js/internals/correct-prototype-getter.js ***!
+ \********************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js");
+
+module.exports = !fails(function () {
+ function F() { /* empty */ }
+ F.prototype.constructor = null;
+ // eslint-disable-next-line es/no-object-getprototypeof -- required for testing
+ return Object.getPrototypeOf(new F()) !== F.prototype;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/create-html.js":
+/*!*******************************************************!*\
+ !*** ./node_modules/core-js/internals/create-html.js ***!
+ \*******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ "./node_modules/core-js/internals/require-object-coercible.js");
+var toString = __webpack_require__(/*! ../internals/to-string */ "./node_modules/core-js/internals/to-string.js");
+
+var quot = /"/g;
+
+// `CreateHTML` abstract operation
+// https://tc39.es/ecma262/#sec-createhtml
+module.exports = function (string, tag, attribute, value) {
+ var S = toString(requireObjectCoercible(string));
+ var p1 = '<' + tag;
+ if (attribute !== '') p1 += ' ' + attribute + '="' + toString(value).replace(quot, '"') + '"';
+ return p1 + '>' + S + '' + tag + '>';
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/create-iterator-constructor.js":
+/*!***********************************************************************!*\
+ !*** ./node_modules/core-js/internals/create-iterator-constructor.js ***!
+ \***********************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var IteratorPrototype = __webpack_require__(/*! ../internals/iterators-core */ "./node_modules/core-js/internals/iterators-core.js").IteratorPrototype;
+var create = __webpack_require__(/*! ../internals/object-create */ "./node_modules/core-js/internals/object-create.js");
+var createPropertyDescriptor = __webpack_require__(/*! ../internals/create-property-descriptor */ "./node_modules/core-js/internals/create-property-descriptor.js");
+var setToStringTag = __webpack_require__(/*! ../internals/set-to-string-tag */ "./node_modules/core-js/internals/set-to-string-tag.js");
+var Iterators = __webpack_require__(/*! ../internals/iterators */ "./node_modules/core-js/internals/iterators.js");
+
+var returnThis = function () { return this; };
+
+module.exports = function (IteratorConstructor, NAME, next) {
+ var TO_STRING_TAG = NAME + ' Iterator';
+ IteratorConstructor.prototype = create(IteratorPrototype, { next: createPropertyDescriptor(1, next) });
+ setToStringTag(IteratorConstructor, TO_STRING_TAG, false, true);
+ Iterators[TO_STRING_TAG] = returnThis;
+ return IteratorConstructor;
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/create-non-enumerable-property.js":
+/*!**************************************************************************!*\
+ !*** ./node_modules/core-js/internals/create-non-enumerable-property.js ***!
+ \**************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/core-js/internals/descriptors.js");
+var definePropertyModule = __webpack_require__(/*! ../internals/object-define-property */ "./node_modules/core-js/internals/object-define-property.js");
+var createPropertyDescriptor = __webpack_require__(/*! ../internals/create-property-descriptor */ "./node_modules/core-js/internals/create-property-descriptor.js");
+
+module.exports = DESCRIPTORS ? function (object, key, value) {
+ return definePropertyModule.f(object, key, createPropertyDescriptor(1, value));
+} : function (object, key, value) {
+ object[key] = value;
+ return object;
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/create-property-descriptor.js":
+/*!**********************************************************************!*\
+ !*** ./node_modules/core-js/internals/create-property-descriptor.js ***!
+ \**********************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+module.exports = function (bitmap, value) {
+ return {
+ enumerable: !(bitmap & 1),
+ configurable: !(bitmap & 2),
+ writable: !(bitmap & 4),
+ value: value
+ };
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/create-property.js":
+/*!***********************************************************!*\
+ !*** ./node_modules/core-js/internals/create-property.js ***!
+ \***********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var toPropertyKey = __webpack_require__(/*! ../internals/to-property-key */ "./node_modules/core-js/internals/to-property-key.js");
+var definePropertyModule = __webpack_require__(/*! ../internals/object-define-property */ "./node_modules/core-js/internals/object-define-property.js");
+var createPropertyDescriptor = __webpack_require__(/*! ../internals/create-property-descriptor */ "./node_modules/core-js/internals/create-property-descriptor.js");
+
+module.exports = function (object, key, value) {
+ var propertyKey = toPropertyKey(key);
+ if (propertyKey in object) definePropertyModule.f(object, propertyKey, createPropertyDescriptor(0, value));
+ else object[propertyKey] = value;
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/date-to-iso-string.js":
+/*!**************************************************************!*\
+ !*** ./node_modules/core-js/internals/date-to-iso-string.js ***!
+ \**************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js");
+var padStart = __webpack_require__(/*! ../internals/string-pad */ "./node_modules/core-js/internals/string-pad.js").start;
+
+var abs = Math.abs;
+var DatePrototype = Date.prototype;
+var getTime = DatePrototype.getTime;
+var nativeDateToISOString = DatePrototype.toISOString;
+
+// `Date.prototype.toISOString` method implementation
+// https://tc39.es/ecma262/#sec-date.prototype.toisostring
+// PhantomJS / old WebKit fails here:
+module.exports = (fails(function () {
+ return nativeDateToISOString.call(new Date(-5e13 - 1)) != '0385-07-25T07:06:39.999Z';
+}) || !fails(function () {
+ nativeDateToISOString.call(new Date(NaN));
+})) ? function toISOString() {
+ if (!isFinite(getTime.call(this))) throw RangeError('Invalid time value');
+ var date = this;
+ var year = date.getUTCFullYear();
+ var milliseconds = date.getUTCMilliseconds();
+ var sign = year < 0 ? '-' : year > 9999 ? '+' : '';
+ return sign + padStart(abs(year), sign ? 6 : 4, 0) +
+ '-' + padStart(date.getUTCMonth() + 1, 2, 0) +
+ '-' + padStart(date.getUTCDate(), 2, 0) +
+ 'T' + padStart(date.getUTCHours(), 2, 0) +
+ ':' + padStart(date.getUTCMinutes(), 2, 0) +
+ ':' + padStart(date.getUTCSeconds(), 2, 0) +
+ '.' + padStart(milliseconds, 3, 0) +
+ 'Z';
+} : nativeDateToISOString;
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/date-to-primitive.js":
+/*!*************************************************************!*\
+ !*** ./node_modules/core-js/internals/date-to-primitive.js ***!
+ \*************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/core-js/internals/an-object.js");
+var ordinaryToPrimitive = __webpack_require__(/*! ../internals/ordinary-to-primitive */ "./node_modules/core-js/internals/ordinary-to-primitive.js");
+
+// `Date.prototype[@@toPrimitive](hint)` method implementation
+// https://tc39.es/ecma262/#sec-date.prototype-@@toprimitive
+module.exports = function (hint) {
+ anObject(this);
+ if (hint === 'string' || hint === 'default') hint = 'string';
+ else if (hint !== 'number') throw TypeError('Incorrect hint');
+ return ordinaryToPrimitive(this, hint);
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/define-iterator.js":
+/*!***********************************************************!*\
+ !*** ./node_modules/core-js/internals/define-iterator.js ***!
+ \***********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var IS_PURE = __webpack_require__(/*! ../internals/is-pure */ "./node_modules/core-js/internals/is-pure.js");
+var FunctionName = __webpack_require__(/*! ../internals/function-name */ "./node_modules/core-js/internals/function-name.js");
+var isCallable = __webpack_require__(/*! ../internals/is-callable */ "./node_modules/core-js/internals/is-callable.js");
+var createIteratorConstructor = __webpack_require__(/*! ../internals/create-iterator-constructor */ "./node_modules/core-js/internals/create-iterator-constructor.js");
+var getPrototypeOf = __webpack_require__(/*! ../internals/object-get-prototype-of */ "./node_modules/core-js/internals/object-get-prototype-of.js");
+var setPrototypeOf = __webpack_require__(/*! ../internals/object-set-prototype-of */ "./node_modules/core-js/internals/object-set-prototype-of.js");
+var setToStringTag = __webpack_require__(/*! ../internals/set-to-string-tag */ "./node_modules/core-js/internals/set-to-string-tag.js");
+var createNonEnumerableProperty = __webpack_require__(/*! ../internals/create-non-enumerable-property */ "./node_modules/core-js/internals/create-non-enumerable-property.js");
+var redefine = __webpack_require__(/*! ../internals/redefine */ "./node_modules/core-js/internals/redefine.js");
+var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js");
+var Iterators = __webpack_require__(/*! ../internals/iterators */ "./node_modules/core-js/internals/iterators.js");
+var IteratorsCore = __webpack_require__(/*! ../internals/iterators-core */ "./node_modules/core-js/internals/iterators-core.js");
+
+var PROPER_FUNCTION_NAME = FunctionName.PROPER;
+var CONFIGURABLE_FUNCTION_NAME = FunctionName.CONFIGURABLE;
+var IteratorPrototype = IteratorsCore.IteratorPrototype;
+var BUGGY_SAFARI_ITERATORS = IteratorsCore.BUGGY_SAFARI_ITERATORS;
+var ITERATOR = wellKnownSymbol('iterator');
+var KEYS = 'keys';
+var VALUES = 'values';
+var ENTRIES = 'entries';
+
+var returnThis = function () { return this; };
+
+module.exports = function (Iterable, NAME, IteratorConstructor, next, DEFAULT, IS_SET, FORCED) {
+ createIteratorConstructor(IteratorConstructor, NAME, next);
+
+ var getIterationMethod = function (KIND) {
+ if (KIND === DEFAULT && defaultIterator) return defaultIterator;
+ if (!BUGGY_SAFARI_ITERATORS && KIND in IterablePrototype) return IterablePrototype[KIND];
+ switch (KIND) {
+ case KEYS: return function keys() { return new IteratorConstructor(this, KIND); };
+ case VALUES: return function values() { return new IteratorConstructor(this, KIND); };
+ case ENTRIES: return function entries() { return new IteratorConstructor(this, KIND); };
+ } return function () { return new IteratorConstructor(this); };
+ };
+
+ var TO_STRING_TAG = NAME + ' Iterator';
+ var INCORRECT_VALUES_NAME = false;
+ var IterablePrototype = Iterable.prototype;
+ var nativeIterator = IterablePrototype[ITERATOR]
+ || IterablePrototype['@@iterator']
+ || DEFAULT && IterablePrototype[DEFAULT];
+ var defaultIterator = !BUGGY_SAFARI_ITERATORS && nativeIterator || getIterationMethod(DEFAULT);
+ var anyNativeIterator = NAME == 'Array' ? IterablePrototype.entries || nativeIterator : nativeIterator;
+ var CurrentIteratorPrototype, methods, KEY;
+
+ // fix native
+ if (anyNativeIterator) {
+ CurrentIteratorPrototype = getPrototypeOf(anyNativeIterator.call(new Iterable()));
+ if (CurrentIteratorPrototype !== Object.prototype && CurrentIteratorPrototype.next) {
+ if (!IS_PURE && getPrototypeOf(CurrentIteratorPrototype) !== IteratorPrototype) {
+ if (setPrototypeOf) {
+ setPrototypeOf(CurrentIteratorPrototype, IteratorPrototype);
+ } else if (!isCallable(CurrentIteratorPrototype[ITERATOR])) {
+ redefine(CurrentIteratorPrototype, ITERATOR, returnThis);
+ }
+ }
+ // Set @@toStringTag to native iterators
+ setToStringTag(CurrentIteratorPrototype, TO_STRING_TAG, true, true);
+ if (IS_PURE) Iterators[TO_STRING_TAG] = returnThis;
+ }
+ }
+
+ // fix Array.prototype.{ values, @@iterator }.name in V8 / FF
+ if (PROPER_FUNCTION_NAME && DEFAULT == VALUES && nativeIterator && nativeIterator.name !== VALUES) {
+ if (!IS_PURE && CONFIGURABLE_FUNCTION_NAME) {
+ createNonEnumerableProperty(IterablePrototype, 'name', VALUES);
+ } else {
+ INCORRECT_VALUES_NAME = true;
+ defaultIterator = function values() { return nativeIterator.call(this); };
+ }
+ }
+
+ // export additional methods
+ if (DEFAULT) {
+ methods = {
+ values: getIterationMethod(VALUES),
+ keys: IS_SET ? defaultIterator : getIterationMethod(KEYS),
+ entries: getIterationMethod(ENTRIES)
+ };
+ if (FORCED) for (KEY in methods) {
+ if (BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME || !(KEY in IterablePrototype)) {
+ redefine(IterablePrototype, KEY, methods[KEY]);
+ }
+ } else $({ target: NAME, proto: true, forced: BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME }, methods);
+ }
+
+ // define iterator
+ if ((!IS_PURE || FORCED) && IterablePrototype[ITERATOR] !== defaultIterator) {
+ redefine(IterablePrototype, ITERATOR, defaultIterator, { name: DEFAULT });
+ }
+ Iterators[NAME] = defaultIterator;
+
+ return methods;
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/define-well-known-symbol.js":
+/*!********************************************************************!*\
+ !*** ./node_modules/core-js/internals/define-well-known-symbol.js ***!
+ \********************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var path = __webpack_require__(/*! ../internals/path */ "./node_modules/core-js/internals/path.js");
+var has = __webpack_require__(/*! ../internals/has */ "./node_modules/core-js/internals/has.js");
+var wrappedWellKnownSymbolModule = __webpack_require__(/*! ../internals/well-known-symbol-wrapped */ "./node_modules/core-js/internals/well-known-symbol-wrapped.js");
+var defineProperty = __webpack_require__(/*! ../internals/object-define-property */ "./node_modules/core-js/internals/object-define-property.js").f;
+
+module.exports = function (NAME) {
+ var Symbol = path.Symbol || (path.Symbol = {});
+ if (!has(Symbol, NAME)) defineProperty(Symbol, NAME, {
+ value: wrappedWellKnownSymbolModule.f(NAME)
+ });
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/descriptors.js":
+/*!*******************************************************!*\
+ !*** ./node_modules/core-js/internals/descriptors.js ***!
+ \*******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js");
+
+// Detect IE8's incomplete defineProperty implementation
+module.exports = !fails(function () {
+ // eslint-disable-next-line es/no-object-defineproperty -- required for testing
+ return Object.defineProperty({}, 1, { get: function () { return 7; } })[1] != 7;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/document-create-element.js":
+/*!*******************************************************************!*\
+ !*** ./node_modules/core-js/internals/document-create-element.js ***!
+ \*******************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js");
+var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/core-js/internals/is-object.js");
+
+var document = global.document;
+// typeof document.createElement is 'object' in old IE
+var EXISTS = isObject(document) && isObject(document.createElement);
+
+module.exports = function (it) {
+ return EXISTS ? document.createElement(it) : {};
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/dom-iterables.js":
+/*!*********************************************************!*\
+ !*** ./node_modules/core-js/internals/dom-iterables.js ***!
+ \*********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+// iterable DOM collections
+// flag - `iterable` interface - 'entries', 'keys', 'values', 'forEach' methods
+module.exports = {
+ CSSRuleList: 0,
+ CSSStyleDeclaration: 0,
+ CSSValueList: 0,
+ ClientRectList: 0,
+ DOMRectList: 0,
+ DOMStringList: 0,
+ DOMTokenList: 1,
+ DataTransferItemList: 0,
+ FileList: 0,
+ HTMLAllCollection: 0,
+ HTMLCollection: 0,
+ HTMLFormElement: 0,
+ HTMLSelectElement: 0,
+ MediaList: 0,
+ MimeTypeArray: 0,
+ NamedNodeMap: 0,
+ NodeList: 1,
+ PaintRequestList: 0,
+ Plugin: 0,
+ PluginArray: 0,
+ SVGLengthList: 0,
+ SVGNumberList: 0,
+ SVGPathSegList: 0,
+ SVGPointList: 0,
+ SVGStringList: 0,
+ SVGTransformList: 0,
+ SourceBufferList: 0,
+ StyleSheetList: 0,
+ TextTrackCueList: 0,
+ TextTrackList: 0,
+ TouchList: 0
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/dom-token-list-prototype.js":
+/*!********************************************************************!*\
+ !*** ./node_modules/core-js/internals/dom-token-list-prototype.js ***!
+ \********************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+// in old WebKit versions, `element.classList` is not an instance of global `DOMTokenList`
+var documentCreateElement = __webpack_require__(/*! ../internals/document-create-element */ "./node_modules/core-js/internals/document-create-element.js");
+
+var classList = documentCreateElement('span').classList;
+var DOMTokenListPrototype = classList && classList.constructor && classList.constructor.prototype;
+
+module.exports = DOMTokenListPrototype === Object.prototype ? undefined : DOMTokenListPrototype;
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/engine-ff-version.js":
+/*!*************************************************************!*\
+ !*** ./node_modules/core-js/internals/engine-ff-version.js ***!
+ \*************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var userAgent = __webpack_require__(/*! ../internals/engine-user-agent */ "./node_modules/core-js/internals/engine-user-agent.js");
+
+var firefox = userAgent.match(/firefox\/(\d+)/i);
+
+module.exports = !!firefox && +firefox[1];
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/engine-is-browser.js":
+/*!*************************************************************!*\
+ !*** ./node_modules/core-js/internals/engine-is-browser.js ***!
+ \*************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+module.exports = typeof window == 'object';
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/engine-is-ie-or-edge.js":
+/*!****************************************************************!*\
+ !*** ./node_modules/core-js/internals/engine-is-ie-or-edge.js ***!
+ \****************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var UA = __webpack_require__(/*! ../internals/engine-user-agent */ "./node_modules/core-js/internals/engine-user-agent.js");
+
+module.exports = /MSIE|Trident/.test(UA);
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/engine-is-ios-pebble.js":
+/*!****************************************************************!*\
+ !*** ./node_modules/core-js/internals/engine-is-ios-pebble.js ***!
+ \****************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var userAgent = __webpack_require__(/*! ../internals/engine-user-agent */ "./node_modules/core-js/internals/engine-user-agent.js");
+var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js");
+
+module.exports = /ipad|iphone|ipod/i.test(userAgent) && global.Pebble !== undefined;
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/engine-is-ios.js":
+/*!*********************************************************!*\
+ !*** ./node_modules/core-js/internals/engine-is-ios.js ***!
+ \*********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var userAgent = __webpack_require__(/*! ../internals/engine-user-agent */ "./node_modules/core-js/internals/engine-user-agent.js");
+
+module.exports = /(?:ipad|iphone|ipod).*applewebkit/i.test(userAgent);
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/engine-is-node.js":
+/*!**********************************************************!*\
+ !*** ./node_modules/core-js/internals/engine-is-node.js ***!
+ \**********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var classof = __webpack_require__(/*! ../internals/classof-raw */ "./node_modules/core-js/internals/classof-raw.js");
+var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js");
+
+module.exports = classof(global.process) == 'process';
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/engine-is-webos-webkit.js":
+/*!******************************************************************!*\
+ !*** ./node_modules/core-js/internals/engine-is-webos-webkit.js ***!
+ \******************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var userAgent = __webpack_require__(/*! ../internals/engine-user-agent */ "./node_modules/core-js/internals/engine-user-agent.js");
+
+module.exports = /web0s(?!.*chrome)/i.test(userAgent);
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/engine-user-agent.js":
+/*!*************************************************************!*\
+ !*** ./node_modules/core-js/internals/engine-user-agent.js ***!
+ \*************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ "./node_modules/core-js/internals/get-built-in.js");
+
+module.exports = getBuiltIn('navigator', 'userAgent') || '';
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/engine-v8-version.js":
+/*!*************************************************************!*\
+ !*** ./node_modules/core-js/internals/engine-v8-version.js ***!
+ \*************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js");
+var userAgent = __webpack_require__(/*! ../internals/engine-user-agent */ "./node_modules/core-js/internals/engine-user-agent.js");
+
+var process = global.process;
+var Deno = global.Deno;
+var versions = process && process.versions || Deno && Deno.version;
+var v8 = versions && versions.v8;
+var match, version;
+
+if (v8) {
+ match = v8.split('.');
+ version = match[0] < 4 ? 1 : match[0] + match[1];
+} else if (userAgent) {
+ match = userAgent.match(/Edge\/(\d+)/);
+ if (!match || match[1] >= 74) {
+ match = userAgent.match(/Chrome\/(\d+)/);
+ if (match) version = match[1];
+ }
+}
+
+module.exports = version && +version;
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/engine-webkit-version.js":
+/*!*****************************************************************!*\
+ !*** ./node_modules/core-js/internals/engine-webkit-version.js ***!
+ \*****************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var userAgent = __webpack_require__(/*! ../internals/engine-user-agent */ "./node_modules/core-js/internals/engine-user-agent.js");
+
+var webkit = userAgent.match(/AppleWebKit\/(\d+)\./);
+
+module.exports = !!webkit && +webkit[1];
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/enum-bug-keys.js":
+/*!*********************************************************!*\
+ !*** ./node_modules/core-js/internals/enum-bug-keys.js ***!
+ \*********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+// IE8- don't enum bug keys
+module.exports = [
+ 'constructor',
+ 'hasOwnProperty',
+ 'isPrototypeOf',
+ 'propertyIsEnumerable',
+ 'toLocaleString',
+ 'toString',
+ 'valueOf'
+];
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/export.js":
+/*!**************************************************!*\
+ !*** ./node_modules/core-js/internals/export.js ***!
+ \**************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js");
+var getOwnPropertyDescriptor = __webpack_require__(/*! ../internals/object-get-own-property-descriptor */ "./node_modules/core-js/internals/object-get-own-property-descriptor.js").f;
+var createNonEnumerableProperty = __webpack_require__(/*! ../internals/create-non-enumerable-property */ "./node_modules/core-js/internals/create-non-enumerable-property.js");
+var redefine = __webpack_require__(/*! ../internals/redefine */ "./node_modules/core-js/internals/redefine.js");
+var setGlobal = __webpack_require__(/*! ../internals/set-global */ "./node_modules/core-js/internals/set-global.js");
+var copyConstructorProperties = __webpack_require__(/*! ../internals/copy-constructor-properties */ "./node_modules/core-js/internals/copy-constructor-properties.js");
+var isForced = __webpack_require__(/*! ../internals/is-forced */ "./node_modules/core-js/internals/is-forced.js");
+
+/*
+ options.target - name of the target object
+ options.global - target is the global object
+ options.stat - export as static methods of target
+ options.proto - export as prototype methods of target
+ options.real - real prototype method for the `pure` version
+ options.forced - export even if the native feature is available
+ options.bind - bind methods to the target, required for the `pure` version
+ options.wrap - wrap constructors to preventing global pollution, required for the `pure` version
+ options.unsafe - use the simple assignment of property instead of delete + defineProperty
+ options.sham - add a flag to not completely full polyfills
+ options.enumerable - export as enumerable property
+ options.noTargetGet - prevent calling a getter on target
+ options.name - the .name of the function if it does not match the key
+*/
+module.exports = function (options, source) {
+ var TARGET = options.target;
+ var GLOBAL = options.global;
+ var STATIC = options.stat;
+ var FORCED, target, key, targetProperty, sourceProperty, descriptor;
+ if (GLOBAL) {
+ target = global;
+ } else if (STATIC) {
+ target = global[TARGET] || setGlobal(TARGET, {});
+ } else {
+ target = (global[TARGET] || {}).prototype;
+ }
+ if (target) for (key in source) {
+ sourceProperty = source[key];
+ if (options.noTargetGet) {
+ descriptor = getOwnPropertyDescriptor(target, key);
+ targetProperty = descriptor && descriptor.value;
+ } else targetProperty = target[key];
+ FORCED = isForced(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced);
+ // contained in target
+ if (!FORCED && targetProperty !== undefined) {
+ if (typeof sourceProperty === typeof targetProperty) continue;
+ copyConstructorProperties(sourceProperty, targetProperty);
+ }
+ // add a flag to not completely full polyfills
+ if (options.sham || (targetProperty && targetProperty.sham)) {
+ createNonEnumerableProperty(sourceProperty, 'sham', true);
+ }
+ // extend global
+ redefine(target, key, sourceProperty, options);
+ }
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/fails.js":
+/*!*************************************************!*\
+ !*** ./node_modules/core-js/internals/fails.js ***!
+ \*************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+module.exports = function (exec) {
+ try {
+ return !!exec();
+ } catch (error) {
+ return true;
+ }
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/fix-regexp-well-known-symbol-logic.js":
+/*!******************************************************************************!*\
+ !*** ./node_modules/core-js/internals/fix-regexp-well-known-symbol-logic.js ***!
+ \******************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+// TODO: Remove from `core-js@4` since it's moved to entry points
+__webpack_require__(/*! ../modules/es.regexp.exec */ "./node_modules/core-js/modules/es.regexp.exec.js");
+var redefine = __webpack_require__(/*! ../internals/redefine */ "./node_modules/core-js/internals/redefine.js");
+var regexpExec = __webpack_require__(/*! ../internals/regexp-exec */ "./node_modules/core-js/internals/regexp-exec.js");
+var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js");
+var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js");
+var createNonEnumerableProperty = __webpack_require__(/*! ../internals/create-non-enumerable-property */ "./node_modules/core-js/internals/create-non-enumerable-property.js");
+
+var SPECIES = wellKnownSymbol('species');
+var RegExpPrototype = RegExp.prototype;
+
+module.exports = function (KEY, exec, FORCED, SHAM) {
+ var SYMBOL = wellKnownSymbol(KEY);
+
+ var DELEGATES_TO_SYMBOL = !fails(function () {
+ // String methods call symbol-named RegEp methods
+ var O = {};
+ O[SYMBOL] = function () { return 7; };
+ return ''[KEY](O) != 7;
+ });
+
+ var DELEGATES_TO_EXEC = DELEGATES_TO_SYMBOL && !fails(function () {
+ // Symbol-named RegExp methods call .exec
+ var execCalled = false;
+ var re = /a/;
+
+ if (KEY === 'split') {
+ // We can't use real regex here since it causes deoptimization
+ // and serious performance degradation in V8
+ // https://github.com/zloirock/core-js/issues/306
+ re = {};
+ // RegExp[@@split] doesn't call the regex's exec method, but first creates
+ // a new one. We need to return the patched regex when creating the new one.
+ re.constructor = {};
+ re.constructor[SPECIES] = function () { return re; };
+ re.flags = '';
+ re[SYMBOL] = /./[SYMBOL];
+ }
+
+ re.exec = function () { execCalled = true; return null; };
+
+ re[SYMBOL]('');
+ return !execCalled;
+ });
+
+ if (
+ !DELEGATES_TO_SYMBOL ||
+ !DELEGATES_TO_EXEC ||
+ FORCED
+ ) {
+ var nativeRegExpMethod = /./[SYMBOL];
+ var methods = exec(SYMBOL, ''[KEY], function (nativeMethod, regexp, str, arg2, forceStringMethod) {
+ var $exec = regexp.exec;
+ if ($exec === regexpExec || $exec === RegExpPrototype.exec) {
+ if (DELEGATES_TO_SYMBOL && !forceStringMethod) {
+ // The native String method already delegates to @@method (this
+ // polyfilled function), leasing to infinite recursion.
+ // We avoid it by directly calling the native @@method method.
+ return { done: true, value: nativeRegExpMethod.call(regexp, str, arg2) };
+ }
+ return { done: true, value: nativeMethod.call(str, regexp, arg2) };
+ }
+ return { done: false };
+ });
+
+ redefine(String.prototype, KEY, methods[0]);
+ redefine(RegExpPrototype, SYMBOL, methods[1]);
+ }
+
+ if (SHAM) createNonEnumerableProperty(RegExpPrototype[SYMBOL], 'sham', true);
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/flatten-into-array.js":
+/*!**************************************************************!*\
+ !*** ./node_modules/core-js/internals/flatten-into-array.js ***!
+ \**************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var isArray = __webpack_require__(/*! ../internals/is-array */ "./node_modules/core-js/internals/is-array.js");
+var toLength = __webpack_require__(/*! ../internals/to-length */ "./node_modules/core-js/internals/to-length.js");
+var bind = __webpack_require__(/*! ../internals/function-bind-context */ "./node_modules/core-js/internals/function-bind-context.js");
+
+// `FlattenIntoArray` abstract operation
+// https://tc39.github.io/proposal-flatMap/#sec-FlattenIntoArray
+var flattenIntoArray = function (target, original, source, sourceLen, start, depth, mapper, thisArg) {
+ var targetIndex = start;
+ var sourceIndex = 0;
+ var mapFn = mapper ? bind(mapper, thisArg, 3) : false;
+ var element;
+
+ while (sourceIndex < sourceLen) {
+ if (sourceIndex in source) {
+ element = mapFn ? mapFn(source[sourceIndex], sourceIndex, original) : source[sourceIndex];
+
+ if (depth > 0 && isArray(element)) {
+ targetIndex = flattenIntoArray(target, original, element, toLength(element.length), targetIndex, depth - 1) - 1;
+ } else {
+ if (targetIndex >= 0x1FFFFFFFFFFFFF) throw TypeError('Exceed the acceptable array length');
+ target[targetIndex] = element;
+ }
+
+ targetIndex++;
+ }
+ sourceIndex++;
+ }
+ return targetIndex;
+};
+
+module.exports = flattenIntoArray;
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/freezing.js":
+/*!****************************************************!*\
+ !*** ./node_modules/core-js/internals/freezing.js ***!
+ \****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js");
+
+module.exports = !fails(function () {
+ // eslint-disable-next-line es/no-object-isextensible, es/no-object-preventextensions -- required for testing
+ return Object.isExtensible(Object.preventExtensions({}));
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/function-bind-context.js":
+/*!*****************************************************************!*\
+ !*** ./node_modules/core-js/internals/function-bind-context.js ***!
+ \*****************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var aCallable = __webpack_require__(/*! ../internals/a-callable */ "./node_modules/core-js/internals/a-callable.js");
+
+// optional / simple context binding
+module.exports = function (fn, that, length) {
+ aCallable(fn);
+ if (that === undefined) return fn;
+ switch (length) {
+ case 0: return function () {
+ return fn.call(that);
+ };
+ case 1: return function (a) {
+ return fn.call(that, a);
+ };
+ case 2: return function (a, b) {
+ return fn.call(that, a, b);
+ };
+ case 3: return function (a, b, c) {
+ return fn.call(that, a, b, c);
+ };
+ }
+ return function (/* ...args */) {
+ return fn.apply(that, arguments);
+ };
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/function-bind.js":
+/*!*********************************************************!*\
+ !*** ./node_modules/core-js/internals/function-bind.js ***!
+ \*********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var aCallable = __webpack_require__(/*! ../internals/a-callable */ "./node_modules/core-js/internals/a-callable.js");
+var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/core-js/internals/is-object.js");
+
+var slice = [].slice;
+var factories = {};
+
+var construct = function (C, argsLength, args) {
+ if (!(argsLength in factories)) {
+ for (var list = [], i = 0; i < argsLength; i++) list[i] = 'a[' + i + ']';
+ // eslint-disable-next-line no-new-func -- we have no proper alternatives, IE8- only
+ factories[argsLength] = Function('C,a', 'return new C(' + list.join(',') + ')');
+ } return factories[argsLength](C, args);
+};
+
+// `Function.prototype.bind` method implementation
+// https://tc39.es/ecma262/#sec-function.prototype.bind
+module.exports = Function.bind || function bind(that /* , ...args */) {
+ var fn = aCallable(this);
+ var partArgs = slice.call(arguments, 1);
+ var boundFunction = function bound(/* args... */) {
+ var args = partArgs.concat(slice.call(arguments));
+ return this instanceof boundFunction ? construct(fn, args.length, args) : fn.apply(that, args);
+ };
+ if (isObject(fn.prototype)) boundFunction.prototype = fn.prototype;
+ return boundFunction;
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/function-name.js":
+/*!*********************************************************!*\
+ !*** ./node_modules/core-js/internals/function-name.js ***!
+ \*********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/core-js/internals/descriptors.js");
+var has = __webpack_require__(/*! ../internals/has */ "./node_modules/core-js/internals/has.js");
+
+var FunctionPrototype = Function.prototype;
+// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe
+var getDescriptor = DESCRIPTORS && Object.getOwnPropertyDescriptor;
+
+var EXISTS = has(FunctionPrototype, 'name');
+// additional protection from minified / mangled / dropped function names
+var PROPER = EXISTS && (function something() { /* empty */ }).name === 'something';
+var CONFIGURABLE = EXISTS && (!DESCRIPTORS || (DESCRIPTORS && getDescriptor(FunctionPrototype, 'name').configurable));
+
+module.exports = {
+ EXISTS: EXISTS,
+ PROPER: PROPER,
+ CONFIGURABLE: CONFIGURABLE
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/get-built-in.js":
+/*!********************************************************!*\
+ !*** ./node_modules/core-js/internals/get-built-in.js ***!
+ \********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js");
+var isCallable = __webpack_require__(/*! ../internals/is-callable */ "./node_modules/core-js/internals/is-callable.js");
+
+var aFunction = function (argument) {
+ return isCallable(argument) ? argument : undefined;
+};
+
+module.exports = function (namespace, method) {
+ return arguments.length < 2 ? aFunction(global[namespace]) : global[namespace] && global[namespace][method];
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/get-iterator-method.js":
+/*!***************************************************************!*\
+ !*** ./node_modules/core-js/internals/get-iterator-method.js ***!
+ \***************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var classof = __webpack_require__(/*! ../internals/classof */ "./node_modules/core-js/internals/classof.js");
+var getMethod = __webpack_require__(/*! ../internals/get-method */ "./node_modules/core-js/internals/get-method.js");
+var Iterators = __webpack_require__(/*! ../internals/iterators */ "./node_modules/core-js/internals/iterators.js");
+var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js");
+
+var ITERATOR = wellKnownSymbol('iterator');
+
+module.exports = function (it) {
+ if (it != undefined) return getMethod(it, ITERATOR)
+ || getMethod(it, '@@iterator')
+ || Iterators[classof(it)];
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/get-iterator.js":
+/*!********************************************************!*\
+ !*** ./node_modules/core-js/internals/get-iterator.js ***!
+ \********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var aCallable = __webpack_require__(/*! ../internals/a-callable */ "./node_modules/core-js/internals/a-callable.js");
+var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/core-js/internals/an-object.js");
+var getIteratorMethod = __webpack_require__(/*! ../internals/get-iterator-method */ "./node_modules/core-js/internals/get-iterator-method.js");
+
+module.exports = function (argument, usingIterator) {
+ var iteratorMethod = arguments.length < 2 ? getIteratorMethod(argument) : usingIterator;
+ if (aCallable(iteratorMethod)) return anObject(iteratorMethod.call(argument));
+ throw TypeError(String(argument) + ' is not iterable');
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/get-method.js":
+/*!******************************************************!*\
+ !*** ./node_modules/core-js/internals/get-method.js ***!
+ \******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var aCallable = __webpack_require__(/*! ../internals/a-callable */ "./node_modules/core-js/internals/a-callable.js");
+
+// `GetMethod` abstract operation
+// https://tc39.es/ecma262/#sec-getmethod
+module.exports = function (V, P) {
+ var func = V[P];
+ return func == null ? undefined : aCallable(func);
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/get-substitution.js":
+/*!************************************************************!*\
+ !*** ./node_modules/core-js/internals/get-substitution.js ***!
+ \************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var toObject = __webpack_require__(/*! ../internals/to-object */ "./node_modules/core-js/internals/to-object.js");
+
+var floor = Math.floor;
+var replace = ''.replace;
+var SUBSTITUTION_SYMBOLS = /\$([$&'`]|\d{1,2}|<[^>]*>)/g;
+var SUBSTITUTION_SYMBOLS_NO_NAMED = /\$([$&'`]|\d{1,2})/g;
+
+// `GetSubstitution` abstract operation
+// https://tc39.es/ecma262/#sec-getsubstitution
+module.exports = function (matched, str, position, captures, namedCaptures, replacement) {
+ var tailPos = position + matched.length;
+ var m = captures.length;
+ var symbols = SUBSTITUTION_SYMBOLS_NO_NAMED;
+ if (namedCaptures !== undefined) {
+ namedCaptures = toObject(namedCaptures);
+ symbols = SUBSTITUTION_SYMBOLS;
+ }
+ return replace.call(replacement, symbols, function (match, ch) {
+ var capture;
+ switch (ch.charAt(0)) {
+ case '$': return '$';
+ case '&': return matched;
+ case '`': return str.slice(0, position);
+ case "'": return str.slice(tailPos);
+ case '<':
+ capture = namedCaptures[ch.slice(1, -1)];
+ break;
+ default: // \d\d?
+ var n = +ch;
+ if (n === 0) return match;
+ if (n > m) {
+ var f = floor(n / 10);
+ if (f === 0) return match;
+ if (f <= m) return captures[f - 1] === undefined ? ch.charAt(1) : captures[f - 1] + ch.charAt(1);
+ return match;
+ }
+ capture = captures[n - 1];
+ }
+ return capture === undefined ? '' : capture;
+ });
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/global.js":
+/*!**************************************************!*\
+ !*** ./node_modules/core-js/internals/global.js ***!
+ \**************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+/* WEBPACK VAR INJECTION */(function(global) {var check = function (it) {
+ return it && it.Math == Math && it;
+};
+
+// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028
+module.exports =
+ // eslint-disable-next-line es/no-global-this -- safe
+ check(typeof globalThis == 'object' && globalThis) ||
+ check(typeof window == 'object' && window) ||
+ // eslint-disable-next-line no-restricted-globals -- safe
+ check(typeof self == 'object' && self) ||
+ check(typeof global == 'object' && global) ||
+ // eslint-disable-next-line no-new-func -- fallback
+ (function () { return this; })() || Function('return this')();
+
+/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js")))
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/has.js":
+/*!***********************************************!*\
+ !*** ./node_modules/core-js/internals/has.js ***!
+ \***********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var toObject = __webpack_require__(/*! ../internals/to-object */ "./node_modules/core-js/internals/to-object.js");
+
+var hasOwnProperty = {}.hasOwnProperty;
+
+module.exports = Object.hasOwn || function hasOwn(it, key) {
+ return hasOwnProperty.call(toObject(it), key);
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/hidden-keys.js":
+/*!*******************************************************!*\
+ !*** ./node_modules/core-js/internals/hidden-keys.js ***!
+ \*******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+module.exports = {};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/host-report-errors.js":
+/*!**************************************************************!*\
+ !*** ./node_modules/core-js/internals/host-report-errors.js ***!
+ \**************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js");
+
+module.exports = function (a, b) {
+ var console = global.console;
+ if (console && console.error) {
+ arguments.length === 1 ? console.error(a) : console.error(a, b);
+ }
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/html.js":
+/*!************************************************!*\
+ !*** ./node_modules/core-js/internals/html.js ***!
+ \************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ "./node_modules/core-js/internals/get-built-in.js");
+
+module.exports = getBuiltIn('document', 'documentElement');
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/ie8-dom-define.js":
+/*!**********************************************************!*\
+ !*** ./node_modules/core-js/internals/ie8-dom-define.js ***!
+ \**********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/core-js/internals/descriptors.js");
+var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js");
+var createElement = __webpack_require__(/*! ../internals/document-create-element */ "./node_modules/core-js/internals/document-create-element.js");
+
+// Thank's IE8 for his funny defineProperty
+module.exports = !DESCRIPTORS && !fails(function () {
+ // eslint-disable-next-line es/no-object-defineproperty -- requied for testing
+ return Object.defineProperty(createElement('div'), 'a', {
+ get: function () { return 7; }
+ }).a != 7;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/ieee754.js":
+/*!***************************************************!*\
+ !*** ./node_modules/core-js/internals/ieee754.js ***!
+ \***************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+// IEEE754 conversions based on https://github.com/feross/ieee754
+var abs = Math.abs;
+var pow = Math.pow;
+var floor = Math.floor;
+var log = Math.log;
+var LN2 = Math.LN2;
+
+var pack = function (number, mantissaLength, bytes) {
+ var buffer = new Array(bytes);
+ var exponentLength = bytes * 8 - mantissaLength - 1;
+ var eMax = (1 << exponentLength) - 1;
+ var eBias = eMax >> 1;
+ var rt = mantissaLength === 23 ? pow(2, -24) - pow(2, -77) : 0;
+ var sign = number < 0 || number === 0 && 1 / number < 0 ? 1 : 0;
+ var index = 0;
+ var exponent, mantissa, c;
+ number = abs(number);
+ // eslint-disable-next-line no-self-compare -- NaN check
+ if (number != number || number === Infinity) {
+ // eslint-disable-next-line no-self-compare -- NaN check
+ mantissa = number != number ? 1 : 0;
+ exponent = eMax;
+ } else {
+ exponent = floor(log(number) / LN2);
+ if (number * (c = pow(2, -exponent)) < 1) {
+ exponent--;
+ c *= 2;
+ }
+ if (exponent + eBias >= 1) {
+ number += rt / c;
+ } else {
+ number += rt * pow(2, 1 - eBias);
+ }
+ if (number * c >= 2) {
+ exponent++;
+ c /= 2;
+ }
+ if (exponent + eBias >= eMax) {
+ mantissa = 0;
+ exponent = eMax;
+ } else if (exponent + eBias >= 1) {
+ mantissa = (number * c - 1) * pow(2, mantissaLength);
+ exponent = exponent + eBias;
+ } else {
+ mantissa = number * pow(2, eBias - 1) * pow(2, mantissaLength);
+ exponent = 0;
+ }
+ }
+ for (; mantissaLength >= 8; buffer[index++] = mantissa & 255, mantissa /= 256, mantissaLength -= 8);
+ exponent = exponent << mantissaLength | mantissa;
+ exponentLength += mantissaLength;
+ for (; exponentLength > 0; buffer[index++] = exponent & 255, exponent /= 256, exponentLength -= 8);
+ buffer[--index] |= sign * 128;
+ return buffer;
+};
+
+var unpack = function (buffer, mantissaLength) {
+ var bytes = buffer.length;
+ var exponentLength = bytes * 8 - mantissaLength - 1;
+ var eMax = (1 << exponentLength) - 1;
+ var eBias = eMax >> 1;
+ var nBits = exponentLength - 7;
+ var index = bytes - 1;
+ var sign = buffer[index--];
+ var exponent = sign & 127;
+ var mantissa;
+ sign >>= 7;
+ for (; nBits > 0; exponent = exponent * 256 + buffer[index], index--, nBits -= 8);
+ mantissa = exponent & (1 << -nBits) - 1;
+ exponent >>= -nBits;
+ nBits += mantissaLength;
+ for (; nBits > 0; mantissa = mantissa * 256 + buffer[index], index--, nBits -= 8);
+ if (exponent === 0) {
+ exponent = 1 - eBias;
+ } else if (exponent === eMax) {
+ return mantissa ? NaN : sign ? -Infinity : Infinity;
+ } else {
+ mantissa = mantissa + pow(2, mantissaLength);
+ exponent = exponent - eBias;
+ } return (sign ? -1 : 1) * mantissa * pow(2, exponent - mantissaLength);
+};
+
+module.exports = {
+ pack: pack,
+ unpack: unpack
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/indexed-object.js":
+/*!**********************************************************!*\
+ !*** ./node_modules/core-js/internals/indexed-object.js ***!
+ \**********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js");
+var classof = __webpack_require__(/*! ../internals/classof-raw */ "./node_modules/core-js/internals/classof-raw.js");
+
+var split = ''.split;
+
+// fallback for non-array-like ES3 and non-enumerable old V8 strings
+module.exports = fails(function () {
+ // throws an error in rhino, see https://github.com/mozilla/rhino/issues/346
+ // eslint-disable-next-line no-prototype-builtins -- safe
+ return !Object('z').propertyIsEnumerable(0);
+}) ? function (it) {
+ return classof(it) == 'String' ? split.call(it, '') : Object(it);
+} : Object;
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/inherit-if-required.js":
+/*!***************************************************************!*\
+ !*** ./node_modules/core-js/internals/inherit-if-required.js ***!
+ \***************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var isCallable = __webpack_require__(/*! ../internals/is-callable */ "./node_modules/core-js/internals/is-callable.js");
+var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/core-js/internals/is-object.js");
+var setPrototypeOf = __webpack_require__(/*! ../internals/object-set-prototype-of */ "./node_modules/core-js/internals/object-set-prototype-of.js");
+
+// makes subclassing work correct for wrapped built-ins
+module.exports = function ($this, dummy, Wrapper) {
+ var NewTarget, NewTargetPrototype;
+ if (
+ // it can work only with native `setPrototypeOf`
+ setPrototypeOf &&
+ // we haven't completely correct pre-ES6 way for getting `new.target`, so use this
+ isCallable(NewTarget = dummy.constructor) &&
+ NewTarget !== Wrapper &&
+ isObject(NewTargetPrototype = NewTarget.prototype) &&
+ NewTargetPrototype !== Wrapper.prototype
+ ) setPrototypeOf($this, NewTargetPrototype);
+ return $this;
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/inspect-source.js":
+/*!**********************************************************!*\
+ !*** ./node_modules/core-js/internals/inspect-source.js ***!
+ \**********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var isCallable = __webpack_require__(/*! ../internals/is-callable */ "./node_modules/core-js/internals/is-callable.js");
+var store = __webpack_require__(/*! ../internals/shared-store */ "./node_modules/core-js/internals/shared-store.js");
+
+var functionToString = Function.toString;
+
+// this helper broken in `core-js@3.4.1-3.4.4`, so we can't use `shared` helper
+if (!isCallable(store.inspectSource)) {
+ store.inspectSource = function (it) {
+ return functionToString.call(it);
+ };
+}
+
+module.exports = store.inspectSource;
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/install-error-cause.js":
+/*!***************************************************************!*\
+ !*** ./node_modules/core-js/internals/install-error-cause.js ***!
+ \***************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/core-js/internals/is-object.js");
+var createNonEnumerableProperty = __webpack_require__(/*! ../internals/create-non-enumerable-property */ "./node_modules/core-js/internals/create-non-enumerable-property.js");
+
+// `InstallErrorCause` abstract operation
+// https://tc39.es/proposal-error-cause/#sec-errorobjects-install-error-cause
+module.exports = function (O, options) {
+ if (isObject(options) && 'cause' in options) {
+ createNonEnumerableProperty(O, 'cause', O.cause);
+ }
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/internal-metadata.js":
+/*!*************************************************************!*\
+ !*** ./node_modules/core-js/internals/internal-metadata.js ***!
+ \*************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var hiddenKeys = __webpack_require__(/*! ../internals/hidden-keys */ "./node_modules/core-js/internals/hidden-keys.js");
+var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/core-js/internals/is-object.js");
+var has = __webpack_require__(/*! ../internals/has */ "./node_modules/core-js/internals/has.js");
+var defineProperty = __webpack_require__(/*! ../internals/object-define-property */ "./node_modules/core-js/internals/object-define-property.js").f;
+var getOwnPropertyNamesModule = __webpack_require__(/*! ../internals/object-get-own-property-names */ "./node_modules/core-js/internals/object-get-own-property-names.js");
+var getOwnPropertyNamesExternalModule = __webpack_require__(/*! ../internals/object-get-own-property-names-external */ "./node_modules/core-js/internals/object-get-own-property-names-external.js");
+var uid = __webpack_require__(/*! ../internals/uid */ "./node_modules/core-js/internals/uid.js");
+var FREEZING = __webpack_require__(/*! ../internals/freezing */ "./node_modules/core-js/internals/freezing.js");
+
+var REQUIRED = false;
+var METADATA = uid('meta');
+var id = 0;
+
+// eslint-disable-next-line es/no-object-isextensible -- safe
+var isExtensible = Object.isExtensible || function () {
+ return true;
+};
+
+var setMetadata = function (it) {
+ defineProperty(it, METADATA, { value: {
+ objectID: 'O' + id++, // object ID
+ weakData: {} // weak collections IDs
+ } });
+};
+
+var fastKey = function (it, create) {
+ // return a primitive with prefix
+ if (!isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;
+ if (!has(it, METADATA)) {
+ // can't set metadata to uncaught frozen object
+ if (!isExtensible(it)) return 'F';
+ // not necessary to add metadata
+ if (!create) return 'E';
+ // add missing metadata
+ setMetadata(it);
+ // return object ID
+ } return it[METADATA].objectID;
+};
+
+var getWeakData = function (it, create) {
+ if (!has(it, METADATA)) {
+ // can't set metadata to uncaught frozen object
+ if (!isExtensible(it)) return true;
+ // not necessary to add metadata
+ if (!create) return false;
+ // add missing metadata
+ setMetadata(it);
+ // return the store of weak collections IDs
+ } return it[METADATA].weakData;
+};
+
+// add metadata on freeze-family methods calling
+var onFreeze = function (it) {
+ if (FREEZING && REQUIRED && isExtensible(it) && !has(it, METADATA)) setMetadata(it);
+ return it;
+};
+
+var enable = function () {
+ meta.enable = function () { /* empty */ };
+ REQUIRED = true;
+ var getOwnPropertyNames = getOwnPropertyNamesModule.f;
+ var splice = [].splice;
+ var test = {};
+ test[METADATA] = 1;
+
+ // prevent exposing of metadata key
+ if (getOwnPropertyNames(test).length) {
+ getOwnPropertyNamesModule.f = function (it) {
+ var result = getOwnPropertyNames(it);
+ for (var i = 0, length = result.length; i < length; i++) {
+ if (result[i] === METADATA) {
+ splice.call(result, i, 1);
+ break;
+ }
+ } return result;
+ };
+
+ $({ target: 'Object', stat: true, forced: true }, {
+ getOwnPropertyNames: getOwnPropertyNamesExternalModule.f
+ });
+ }
+};
+
+var meta = module.exports = {
+ enable: enable,
+ fastKey: fastKey,
+ getWeakData: getWeakData,
+ onFreeze: onFreeze
+};
+
+hiddenKeys[METADATA] = true;
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/internal-state.js":
+/*!**********************************************************!*\
+ !*** ./node_modules/core-js/internals/internal-state.js ***!
+ \**********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var NATIVE_WEAK_MAP = __webpack_require__(/*! ../internals/native-weak-map */ "./node_modules/core-js/internals/native-weak-map.js");
+var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js");
+var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/core-js/internals/is-object.js");
+var createNonEnumerableProperty = __webpack_require__(/*! ../internals/create-non-enumerable-property */ "./node_modules/core-js/internals/create-non-enumerable-property.js");
+var objectHas = __webpack_require__(/*! ../internals/has */ "./node_modules/core-js/internals/has.js");
+var shared = __webpack_require__(/*! ../internals/shared-store */ "./node_modules/core-js/internals/shared-store.js");
+var sharedKey = __webpack_require__(/*! ../internals/shared-key */ "./node_modules/core-js/internals/shared-key.js");
+var hiddenKeys = __webpack_require__(/*! ../internals/hidden-keys */ "./node_modules/core-js/internals/hidden-keys.js");
+
+var OBJECT_ALREADY_INITIALIZED = 'Object already initialized';
+var WeakMap = global.WeakMap;
+var set, get, has;
+
+var enforce = function (it) {
+ return has(it) ? get(it) : set(it, {});
+};
+
+var getterFor = function (TYPE) {
+ return function (it) {
+ var state;
+ if (!isObject(it) || (state = get(it)).type !== TYPE) {
+ throw TypeError('Incompatible receiver, ' + TYPE + ' required');
+ } return state;
+ };
+};
+
+if (NATIVE_WEAK_MAP || shared.state) {
+ var store = shared.state || (shared.state = new WeakMap());
+ var wmget = store.get;
+ var wmhas = store.has;
+ var wmset = store.set;
+ set = function (it, metadata) {
+ if (wmhas.call(store, it)) throw new TypeError(OBJECT_ALREADY_INITIALIZED);
+ metadata.facade = it;
+ wmset.call(store, it, metadata);
+ return metadata;
+ };
+ get = function (it) {
+ return wmget.call(store, it) || {};
+ };
+ has = function (it) {
+ return wmhas.call(store, it);
+ };
+} else {
+ var STATE = sharedKey('state');
+ hiddenKeys[STATE] = true;
+ set = function (it, metadata) {
+ if (objectHas(it, STATE)) throw new TypeError(OBJECT_ALREADY_INITIALIZED);
+ metadata.facade = it;
+ createNonEnumerableProperty(it, STATE, metadata);
+ return metadata;
+ };
+ get = function (it) {
+ return objectHas(it, STATE) ? it[STATE] : {};
+ };
+ has = function (it) {
+ return objectHas(it, STATE);
+ };
+}
+
+module.exports = {
+ set: set,
+ get: get,
+ has: has,
+ enforce: enforce,
+ getterFor: getterFor
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/is-array-iterator-method.js":
+/*!********************************************************************!*\
+ !*** ./node_modules/core-js/internals/is-array-iterator-method.js ***!
+ \********************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js");
+var Iterators = __webpack_require__(/*! ../internals/iterators */ "./node_modules/core-js/internals/iterators.js");
+
+var ITERATOR = wellKnownSymbol('iterator');
+var ArrayPrototype = Array.prototype;
+
+// check on default Array iterator
+module.exports = function (it) {
+ return it !== undefined && (Iterators.Array === it || ArrayPrototype[ITERATOR] === it);
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/is-array.js":
+/*!****************************************************!*\
+ !*** ./node_modules/core-js/internals/is-array.js ***!
+ \****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var classof = __webpack_require__(/*! ../internals/classof-raw */ "./node_modules/core-js/internals/classof-raw.js");
+
+// `IsArray` abstract operation
+// https://tc39.es/ecma262/#sec-isarray
+// eslint-disable-next-line es/no-array-isarray -- safe
+module.exports = Array.isArray || function isArray(argument) {
+ return classof(argument) == 'Array';
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/is-callable.js":
+/*!*******************************************************!*\
+ !*** ./node_modules/core-js/internals/is-callable.js ***!
+ \*******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+// `IsCallable` abstract operation
+// https://tc39.es/ecma262/#sec-iscallable
+module.exports = function (argument) {
+ return typeof argument === 'function';
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/is-constructor.js":
+/*!**********************************************************!*\
+ !*** ./node_modules/core-js/internals/is-constructor.js ***!
+ \**********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js");
+var isCallable = __webpack_require__(/*! ../internals/is-callable */ "./node_modules/core-js/internals/is-callable.js");
+var classof = __webpack_require__(/*! ../internals/classof */ "./node_modules/core-js/internals/classof.js");
+var getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ "./node_modules/core-js/internals/get-built-in.js");
+var inspectSource = __webpack_require__(/*! ../internals/inspect-source */ "./node_modules/core-js/internals/inspect-source.js");
+
+var empty = [];
+var construct = getBuiltIn('Reflect', 'construct');
+var constructorRegExp = /^\s*(?:class|function)\b/;
+var exec = constructorRegExp.exec;
+var INCORRECT_TO_STRING = !constructorRegExp.exec(function () { /* empty */ });
+
+var isConstructorModern = function (argument) {
+ if (!isCallable(argument)) return false;
+ try {
+ construct(Object, empty, argument);
+ return true;
+ } catch (error) {
+ return false;
+ }
+};
+
+var isConstructorLegacy = function (argument) {
+ if (!isCallable(argument)) return false;
+ switch (classof(argument)) {
+ case 'AsyncFunction':
+ case 'GeneratorFunction':
+ case 'AsyncGeneratorFunction': return false;
+ // we can't check .prototype since constructors produced by .bind haven't it
+ } return INCORRECT_TO_STRING || !!exec.call(constructorRegExp, inspectSource(argument));
+};
+
+// `IsConstructor` abstract operation
+// https://tc39.es/ecma262/#sec-isconstructor
+module.exports = !construct || fails(function () {
+ var called;
+ return isConstructorModern(isConstructorModern.call)
+ || !isConstructorModern(Object)
+ || !isConstructorModern(function () { called = true; })
+ || called;
+}) ? isConstructorLegacy : isConstructorModern;
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/is-data-descriptor.js":
+/*!**************************************************************!*\
+ !*** ./node_modules/core-js/internals/is-data-descriptor.js ***!
+ \**************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var has = __webpack_require__(/*! ../internals/has */ "./node_modules/core-js/internals/has.js");
+
+module.exports = function (descriptor) {
+ return descriptor !== undefined && (has(descriptor, 'value') || has(descriptor, 'writable'));
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/is-forced.js":
+/*!*****************************************************!*\
+ !*** ./node_modules/core-js/internals/is-forced.js ***!
+ \*****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js");
+var isCallable = __webpack_require__(/*! ../internals/is-callable */ "./node_modules/core-js/internals/is-callable.js");
+
+var replacement = /#|\.prototype\./;
+
+var isForced = function (feature, detection) {
+ var value = data[normalize(feature)];
+ return value == POLYFILL ? true
+ : value == NATIVE ? false
+ : isCallable(detection) ? fails(detection)
+ : !!detection;
+};
+
+var normalize = isForced.normalize = function (string) {
+ return String(string).replace(replacement, '.').toLowerCase();
+};
+
+var data = isForced.data = {};
+var NATIVE = isForced.NATIVE = 'N';
+var POLYFILL = isForced.POLYFILL = 'P';
+
+module.exports = isForced;
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/is-integer.js":
+/*!******************************************************!*\
+ !*** ./node_modules/core-js/internals/is-integer.js ***!
+ \******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/core-js/internals/is-object.js");
+
+var floor = Math.floor;
+
+// `Number.isInteger` method implementation
+// https://tc39.es/ecma262/#sec-number.isinteger
+module.exports = function isInteger(it) {
+ return !isObject(it) && isFinite(it) && floor(it) === it;
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/is-object.js":
+/*!*****************************************************!*\
+ !*** ./node_modules/core-js/internals/is-object.js ***!
+ \*****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var isCallable = __webpack_require__(/*! ../internals/is-callable */ "./node_modules/core-js/internals/is-callable.js");
+
+module.exports = function (it) {
+ return typeof it === 'object' ? it !== null : isCallable(it);
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/is-pure.js":
+/*!***************************************************!*\
+ !*** ./node_modules/core-js/internals/is-pure.js ***!
+ \***************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+module.exports = false;
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/is-regexp.js":
+/*!*****************************************************!*\
+ !*** ./node_modules/core-js/internals/is-regexp.js ***!
+ \*****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/core-js/internals/is-object.js");
+var classof = __webpack_require__(/*! ../internals/classof-raw */ "./node_modules/core-js/internals/classof-raw.js");
+var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js");
+
+var MATCH = wellKnownSymbol('match');
+
+// `IsRegExp` abstract operation
+// https://tc39.es/ecma262/#sec-isregexp
+module.exports = function (it) {
+ var isRegExp;
+ return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : classof(it) == 'RegExp');
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/is-symbol.js":
+/*!*****************************************************!*\
+ !*** ./node_modules/core-js/internals/is-symbol.js ***!
+ \*****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var isCallable = __webpack_require__(/*! ../internals/is-callable */ "./node_modules/core-js/internals/is-callable.js");
+var getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ "./node_modules/core-js/internals/get-built-in.js");
+var USE_SYMBOL_AS_UID = __webpack_require__(/*! ../internals/use-symbol-as-uid */ "./node_modules/core-js/internals/use-symbol-as-uid.js");
+
+module.exports = USE_SYMBOL_AS_UID ? function (it) {
+ return typeof it == 'symbol';
+} : function (it) {
+ var $Symbol = getBuiltIn('Symbol');
+ return isCallable($Symbol) && Object(it) instanceof $Symbol;
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/iterate.js":
+/*!***************************************************!*\
+ !*** ./node_modules/core-js/internals/iterate.js ***!
+ \***************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/core-js/internals/an-object.js");
+var isArrayIteratorMethod = __webpack_require__(/*! ../internals/is-array-iterator-method */ "./node_modules/core-js/internals/is-array-iterator-method.js");
+var toLength = __webpack_require__(/*! ../internals/to-length */ "./node_modules/core-js/internals/to-length.js");
+var bind = __webpack_require__(/*! ../internals/function-bind-context */ "./node_modules/core-js/internals/function-bind-context.js");
+var getIterator = __webpack_require__(/*! ../internals/get-iterator */ "./node_modules/core-js/internals/get-iterator.js");
+var getIteratorMethod = __webpack_require__(/*! ../internals/get-iterator-method */ "./node_modules/core-js/internals/get-iterator-method.js");
+var iteratorClose = __webpack_require__(/*! ../internals/iterator-close */ "./node_modules/core-js/internals/iterator-close.js");
+
+var Result = function (stopped, result) {
+ this.stopped = stopped;
+ this.result = result;
+};
+
+module.exports = function (iterable, unboundFunction, options) {
+ var that = options && options.that;
+ var AS_ENTRIES = !!(options && options.AS_ENTRIES);
+ var IS_ITERATOR = !!(options && options.IS_ITERATOR);
+ var INTERRUPTED = !!(options && options.INTERRUPTED);
+ var fn = bind(unboundFunction, that, 1 + AS_ENTRIES + INTERRUPTED);
+ var iterator, iterFn, index, length, result, next, step;
+
+ var stop = function (condition) {
+ if (iterator) iteratorClose(iterator, 'normal', condition);
+ return new Result(true, condition);
+ };
+
+ var callFn = function (value) {
+ if (AS_ENTRIES) {
+ anObject(value);
+ return INTERRUPTED ? fn(value[0], value[1], stop) : fn(value[0], value[1]);
+ } return INTERRUPTED ? fn(value, stop) : fn(value);
+ };
+
+ if (IS_ITERATOR) {
+ iterator = iterable;
+ } else {
+ iterFn = getIteratorMethod(iterable);
+ if (!iterFn) throw TypeError(String(iterable) + ' is not iterable');
+ // optimisation for array iterators
+ if (isArrayIteratorMethod(iterFn)) {
+ for (index = 0, length = toLength(iterable.length); length > index; index++) {
+ result = callFn(iterable[index]);
+ if (result && result instanceof Result) return result;
+ } return new Result(false);
+ }
+ iterator = getIterator(iterable, iterFn);
+ }
+
+ next = iterator.next;
+ while (!(step = next.call(iterator)).done) {
+ try {
+ result = callFn(step.value);
+ } catch (error) {
+ iteratorClose(iterator, 'throw', error);
+ }
+ if (typeof result == 'object' && result && result instanceof Result) return result;
+ } return new Result(false);
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/iterator-close.js":
+/*!**********************************************************!*\
+ !*** ./node_modules/core-js/internals/iterator-close.js ***!
+ \**********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/core-js/internals/an-object.js");
+var getMethod = __webpack_require__(/*! ../internals/get-method */ "./node_modules/core-js/internals/get-method.js");
+
+module.exports = function (iterator, kind, value) {
+ var innerResult, innerError;
+ anObject(iterator);
+ try {
+ innerResult = getMethod(iterator, 'return');
+ if (!innerResult) {
+ if (kind === 'throw') throw value;
+ return value;
+ }
+ innerResult = innerResult.call(iterator);
+ } catch (error) {
+ innerError = true;
+ innerResult = error;
+ }
+ if (kind === 'throw') throw value;
+ if (innerError) throw innerResult;
+ anObject(innerResult);
+ return value;
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/iterators-core.js":
+/*!**********************************************************!*\
+ !*** ./node_modules/core-js/internals/iterators-core.js ***!
+ \**********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js");
+var isCallable = __webpack_require__(/*! ../internals/is-callable */ "./node_modules/core-js/internals/is-callable.js");
+var create = __webpack_require__(/*! ../internals/object-create */ "./node_modules/core-js/internals/object-create.js");
+var getPrototypeOf = __webpack_require__(/*! ../internals/object-get-prototype-of */ "./node_modules/core-js/internals/object-get-prototype-of.js");
+var redefine = __webpack_require__(/*! ../internals/redefine */ "./node_modules/core-js/internals/redefine.js");
+var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js");
+var IS_PURE = __webpack_require__(/*! ../internals/is-pure */ "./node_modules/core-js/internals/is-pure.js");
+
+var ITERATOR = wellKnownSymbol('iterator');
+var BUGGY_SAFARI_ITERATORS = false;
+
+// `%IteratorPrototype%` object
+// https://tc39.es/ecma262/#sec-%iteratorprototype%-object
+var IteratorPrototype, PrototypeOfArrayIteratorPrototype, arrayIterator;
+
+/* eslint-disable es/no-array-prototype-keys -- safe */
+if ([].keys) {
+ arrayIterator = [].keys();
+ // Safari 8 has buggy iterators w/o `next`
+ if (!('next' in arrayIterator)) BUGGY_SAFARI_ITERATORS = true;
+ else {
+ PrototypeOfArrayIteratorPrototype = getPrototypeOf(getPrototypeOf(arrayIterator));
+ if (PrototypeOfArrayIteratorPrototype !== Object.prototype) IteratorPrototype = PrototypeOfArrayIteratorPrototype;
+ }
+}
+
+var NEW_ITERATOR_PROTOTYPE = IteratorPrototype == undefined || fails(function () {
+ var test = {};
+ // FF44- legacy iterators case
+ return IteratorPrototype[ITERATOR].call(test) !== test;
+});
+
+if (NEW_ITERATOR_PROTOTYPE) IteratorPrototype = {};
+else if (IS_PURE) IteratorPrototype = create(IteratorPrototype);
+
+// `%IteratorPrototype%[@@iterator]()` method
+// https://tc39.es/ecma262/#sec-%iteratorprototype%-@@iterator
+if (!isCallable(IteratorPrototype[ITERATOR])) {
+ redefine(IteratorPrototype, ITERATOR, function () {
+ return this;
+ });
+}
+
+module.exports = {
+ IteratorPrototype: IteratorPrototype,
+ BUGGY_SAFARI_ITERATORS: BUGGY_SAFARI_ITERATORS
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/iterators.js":
+/*!*****************************************************!*\
+ !*** ./node_modules/core-js/internals/iterators.js ***!
+ \*****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+module.exports = {};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/math-expm1.js":
+/*!******************************************************!*\
+ !*** ./node_modules/core-js/internals/math-expm1.js ***!
+ \******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+// eslint-disable-next-line es/no-math-expm1 -- safe
+var $expm1 = Math.expm1;
+var exp = Math.exp;
+
+// `Math.expm1` method implementation
+// https://tc39.es/ecma262/#sec-math.expm1
+module.exports = (!$expm1
+ // Old FF bug
+ || $expm1(10) > 22025.465794806719 || $expm1(10) < 22025.4657948067165168
+ // Tor Browser bug
+ || $expm1(-2e-17) != -2e-17
+) ? function expm1(x) {
+ return (x = +x) == 0 ? x : x > -1e-6 && x < 1e-6 ? x + x * x / 2 : exp(x) - 1;
+} : $expm1;
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/math-fround.js":
+/*!*******************************************************!*\
+ !*** ./node_modules/core-js/internals/math-fround.js ***!
+ \*******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var sign = __webpack_require__(/*! ../internals/math-sign */ "./node_modules/core-js/internals/math-sign.js");
+
+var abs = Math.abs;
+var pow = Math.pow;
+var EPSILON = pow(2, -52);
+var EPSILON32 = pow(2, -23);
+var MAX32 = pow(2, 127) * (2 - EPSILON32);
+var MIN32 = pow(2, -126);
+
+var roundTiesToEven = function (n) {
+ return n + 1 / EPSILON - 1 / EPSILON;
+};
+
+// `Math.fround` method implementation
+// https://tc39.es/ecma262/#sec-math.fround
+// eslint-disable-next-line es/no-math-fround -- safe
+module.exports = Math.fround || function fround(x) {
+ var $abs = abs(x);
+ var $sign = sign(x);
+ var a, result;
+ if ($abs < MIN32) return $sign * roundTiesToEven($abs / MIN32 / EPSILON32) * MIN32 * EPSILON32;
+ a = (1 + EPSILON32 / EPSILON) * $abs;
+ result = a - (a - $abs);
+ // eslint-disable-next-line no-self-compare -- NaN check
+ if (result > MAX32 || result != result) return $sign * Infinity;
+ return $sign * result;
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/math-log1p.js":
+/*!******************************************************!*\
+ !*** ./node_modules/core-js/internals/math-log1p.js ***!
+ \******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+var log = Math.log;
+
+// `Math.log1p` method implementation
+// https://tc39.es/ecma262/#sec-math.log1p
+// eslint-disable-next-line es/no-math-log1p -- safe
+module.exports = Math.log1p || function log1p(x) {
+ return (x = +x) > -1e-8 && x < 1e-8 ? x - x * x / 2 : log(1 + x);
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/math-sign.js":
+/*!*****************************************************!*\
+ !*** ./node_modules/core-js/internals/math-sign.js ***!
+ \*****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+// `Math.sign` method implementation
+// https://tc39.es/ecma262/#sec-math.sign
+// eslint-disable-next-line es/no-math-sign -- safe
+module.exports = Math.sign || function sign(x) {
+ // eslint-disable-next-line no-self-compare -- NaN check
+ return (x = +x) == 0 || x != x ? x : x < 0 ? -1 : 1;
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/microtask.js":
+/*!*****************************************************!*\
+ !*** ./node_modules/core-js/internals/microtask.js ***!
+ \*****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js");
+var getOwnPropertyDescriptor = __webpack_require__(/*! ../internals/object-get-own-property-descriptor */ "./node_modules/core-js/internals/object-get-own-property-descriptor.js").f;
+var macrotask = __webpack_require__(/*! ../internals/task */ "./node_modules/core-js/internals/task.js").set;
+var IS_IOS = __webpack_require__(/*! ../internals/engine-is-ios */ "./node_modules/core-js/internals/engine-is-ios.js");
+var IS_IOS_PEBBLE = __webpack_require__(/*! ../internals/engine-is-ios-pebble */ "./node_modules/core-js/internals/engine-is-ios-pebble.js");
+var IS_WEBOS_WEBKIT = __webpack_require__(/*! ../internals/engine-is-webos-webkit */ "./node_modules/core-js/internals/engine-is-webos-webkit.js");
+var IS_NODE = __webpack_require__(/*! ../internals/engine-is-node */ "./node_modules/core-js/internals/engine-is-node.js");
+
+var MutationObserver = global.MutationObserver || global.WebKitMutationObserver;
+var document = global.document;
+var process = global.process;
+var Promise = global.Promise;
+// Node.js 11 shows ExperimentalWarning on getting `queueMicrotask`
+var queueMicrotaskDescriptor = getOwnPropertyDescriptor(global, 'queueMicrotask');
+var queueMicrotask = queueMicrotaskDescriptor && queueMicrotaskDescriptor.value;
+
+var flush, head, last, notify, toggle, node, promise, then;
+
+// modern engines have queueMicrotask method
+if (!queueMicrotask) {
+ flush = function () {
+ var parent, fn;
+ if (IS_NODE && (parent = process.domain)) parent.exit();
+ while (head) {
+ fn = head.fn;
+ head = head.next;
+ try {
+ fn();
+ } catch (error) {
+ if (head) notify();
+ else last = undefined;
+ throw error;
+ }
+ } last = undefined;
+ if (parent) parent.enter();
+ };
+
+ // browsers with MutationObserver, except iOS - https://github.com/zloirock/core-js/issues/339
+ // also except WebOS Webkit https://github.com/zloirock/core-js/issues/898
+ if (!IS_IOS && !IS_NODE && !IS_WEBOS_WEBKIT && MutationObserver && document) {
+ toggle = true;
+ node = document.createTextNode('');
+ new MutationObserver(flush).observe(node, { characterData: true });
+ notify = function () {
+ node.data = toggle = !toggle;
+ };
+ // environments with maybe non-completely correct, but existent Promise
+ } else if (!IS_IOS_PEBBLE && Promise && Promise.resolve) {
+ // Promise.resolve without an argument throws an error in LG WebOS 2
+ promise = Promise.resolve(undefined);
+ // workaround of WebKit ~ iOS Safari 10.1 bug
+ promise.constructor = Promise;
+ then = promise.then;
+ notify = function () {
+ then.call(promise, flush);
+ };
+ // Node.js without promises
+ } else if (IS_NODE) {
+ notify = function () {
+ process.nextTick(flush);
+ };
+ // for other environments - macrotask based on:
+ // - setImmediate
+ // - MessageChannel
+ // - window.postMessag
+ // - onreadystatechange
+ // - setTimeout
+ } else {
+ notify = function () {
+ // strange IE + webpack dev server bug - use .call(global)
+ macrotask.call(global, flush);
+ };
+ }
+}
+
+module.exports = queueMicrotask || function (fn) {
+ var task = { fn: fn, next: undefined };
+ if (last) last.next = task;
+ if (!head) {
+ head = task;
+ notify();
+ } last = task;
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/native-promise-constructor.js":
+/*!**********************************************************************!*\
+ !*** ./node_modules/core-js/internals/native-promise-constructor.js ***!
+ \**********************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js");
+
+module.exports = global.Promise;
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/native-symbol.js":
+/*!*********************************************************!*\
+ !*** ./node_modules/core-js/internals/native-symbol.js ***!
+ \*********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+/* eslint-disable es/no-symbol -- required for testing */
+var V8_VERSION = __webpack_require__(/*! ../internals/engine-v8-version */ "./node_modules/core-js/internals/engine-v8-version.js");
+var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js");
+
+// eslint-disable-next-line es/no-object-getownpropertysymbols -- required for testing
+module.exports = !!Object.getOwnPropertySymbols && !fails(function () {
+ var symbol = Symbol();
+ // Chrome 38 Symbol has incorrect toString conversion
+ // `get-own-property-symbols` polyfill symbols converted to object are not Symbol instances
+ return !String(symbol) || !(Object(symbol) instanceof Symbol) ||
+ // Chrome 38-40 symbols are not inherited from DOM collections prototypes to instances
+ !Symbol.sham && V8_VERSION && V8_VERSION < 41;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/native-url.js":
+/*!******************************************************!*\
+ !*** ./node_modules/core-js/internals/native-url.js ***!
+ \******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js");
+var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js");
+var IS_PURE = __webpack_require__(/*! ../internals/is-pure */ "./node_modules/core-js/internals/is-pure.js");
+
+var ITERATOR = wellKnownSymbol('iterator');
+
+module.exports = !fails(function () {
+ var url = new URL('b?a=1&b=2&c=3', 'http://a');
+ var searchParams = url.searchParams;
+ var result = '';
+ url.pathname = 'c%20d';
+ searchParams.forEach(function (value, key) {
+ searchParams['delete']('b');
+ result += key + value;
+ });
+ return (IS_PURE && !url.toJSON)
+ || !searchParams.sort
+ || url.href !== 'http://a/c%20d?a=1&c=3'
+ || searchParams.get('c') !== '3'
+ || String(new URLSearchParams('?a=1')) !== 'a=1'
+ || !searchParams[ITERATOR]
+ // throws in Edge
+ || new URL('https://a@b').username !== 'a'
+ || new URLSearchParams(new URLSearchParams('a=b')).get('a') !== 'b'
+ // not punycoded in Edge
+ || new URL('http://тест').host !== 'xn--e1aybc'
+ // not escaped in Chrome 62-
+ || new URL('http://a#б').hash !== '#%D0%B1'
+ // fails in Chrome 66-
+ || result !== 'a1c3'
+ // throws in Safari
+ || new URL('http://x', undefined).host !== 'x';
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/native-weak-map.js":
+/*!***********************************************************!*\
+ !*** ./node_modules/core-js/internals/native-weak-map.js ***!
+ \***********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js");
+var isCallable = __webpack_require__(/*! ../internals/is-callable */ "./node_modules/core-js/internals/is-callable.js");
+var inspectSource = __webpack_require__(/*! ../internals/inspect-source */ "./node_modules/core-js/internals/inspect-source.js");
+
+var WeakMap = global.WeakMap;
+
+module.exports = isCallable(WeakMap) && /native code/.test(inspectSource(WeakMap));
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/new-promise-capability.js":
+/*!******************************************************************!*\
+ !*** ./node_modules/core-js/internals/new-promise-capability.js ***!
+ \******************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var aCallable = __webpack_require__(/*! ../internals/a-callable */ "./node_modules/core-js/internals/a-callable.js");
+
+var PromiseCapability = function (C) {
+ var resolve, reject;
+ this.promise = new C(function ($$resolve, $$reject) {
+ if (resolve !== undefined || reject !== undefined) throw TypeError('Bad Promise constructor');
+ resolve = $$resolve;
+ reject = $$reject;
+ });
+ this.resolve = aCallable(resolve);
+ this.reject = aCallable(reject);
+};
+
+// `NewPromiseCapability` abstract operation
+// https://tc39.es/ecma262/#sec-newpromisecapability
+module.exports.f = function (C) {
+ return new PromiseCapability(C);
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/not-a-regexp.js":
+/*!********************************************************!*\
+ !*** ./node_modules/core-js/internals/not-a-regexp.js ***!
+ \********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var isRegExp = __webpack_require__(/*! ../internals/is-regexp */ "./node_modules/core-js/internals/is-regexp.js");
+
+module.exports = function (it) {
+ if (isRegExp(it)) {
+ throw TypeError("The method doesn't accept regular expressions");
+ } return it;
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/number-is-finite.js":
+/*!************************************************************!*\
+ !*** ./node_modules/core-js/internals/number-is-finite.js ***!
+ \************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js");
+
+var globalIsFinite = global.isFinite;
+
+// `Number.isFinite` method
+// https://tc39.es/ecma262/#sec-number.isfinite
+// eslint-disable-next-line es/no-number-isfinite -- safe
+module.exports = Number.isFinite || function isFinite(it) {
+ return typeof it == 'number' && globalIsFinite(it);
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/number-parse-float.js":
+/*!**************************************************************!*\
+ !*** ./node_modules/core-js/internals/number-parse-float.js ***!
+ \**************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js");
+var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js");
+var toString = __webpack_require__(/*! ../internals/to-string */ "./node_modules/core-js/internals/to-string.js");
+var trim = __webpack_require__(/*! ../internals/string-trim */ "./node_modules/core-js/internals/string-trim.js").trim;
+var whitespaces = __webpack_require__(/*! ../internals/whitespaces */ "./node_modules/core-js/internals/whitespaces.js");
+
+var $parseFloat = global.parseFloat;
+var Symbol = global.Symbol;
+var ITERATOR = Symbol && Symbol.iterator;
+var FORCED = 1 / $parseFloat(whitespaces + '-0') !== -Infinity
+ // MS Edge 18- broken with boxed symbols
+ || (ITERATOR && !fails(function () { $parseFloat(Object(ITERATOR)); }));
+
+// `parseFloat` method
+// https://tc39.es/ecma262/#sec-parsefloat-string
+module.exports = FORCED ? function parseFloat(string) {
+ var trimmedString = trim(toString(string));
+ var result = $parseFloat(trimmedString);
+ return result === 0 && trimmedString.charAt(0) == '-' ? -0 : result;
+} : $parseFloat;
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/number-parse-int.js":
+/*!************************************************************!*\
+ !*** ./node_modules/core-js/internals/number-parse-int.js ***!
+ \************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js");
+var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js");
+var toString = __webpack_require__(/*! ../internals/to-string */ "./node_modules/core-js/internals/to-string.js");
+var trim = __webpack_require__(/*! ../internals/string-trim */ "./node_modules/core-js/internals/string-trim.js").trim;
+var whitespaces = __webpack_require__(/*! ../internals/whitespaces */ "./node_modules/core-js/internals/whitespaces.js");
+
+var $parseInt = global.parseInt;
+var Symbol = global.Symbol;
+var ITERATOR = Symbol && Symbol.iterator;
+var hex = /^[+-]?0[Xx]/;
+var FORCED = $parseInt(whitespaces + '08') !== 8 || $parseInt(whitespaces + '0x16') !== 22
+ // MS Edge 18- broken with boxed symbols
+ || (ITERATOR && !fails(function () { $parseInt(Object(ITERATOR)); }));
+
+// `parseInt` method
+// https://tc39.es/ecma262/#sec-parseint-string-radix
+module.exports = FORCED ? function parseInt(string, radix) {
+ var S = trim(toString(string));
+ return $parseInt(S, (radix >>> 0) || (hex.test(S) ? 16 : 10));
+} : $parseInt;
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/object-assign.js":
+/*!*********************************************************!*\
+ !*** ./node_modules/core-js/internals/object-assign.js ***!
+ \*********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/core-js/internals/descriptors.js");
+var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js");
+var objectKeys = __webpack_require__(/*! ../internals/object-keys */ "./node_modules/core-js/internals/object-keys.js");
+var getOwnPropertySymbolsModule = __webpack_require__(/*! ../internals/object-get-own-property-symbols */ "./node_modules/core-js/internals/object-get-own-property-symbols.js");
+var propertyIsEnumerableModule = __webpack_require__(/*! ../internals/object-property-is-enumerable */ "./node_modules/core-js/internals/object-property-is-enumerable.js");
+var toObject = __webpack_require__(/*! ../internals/to-object */ "./node_modules/core-js/internals/to-object.js");
+var IndexedObject = __webpack_require__(/*! ../internals/indexed-object */ "./node_modules/core-js/internals/indexed-object.js");
+
+// eslint-disable-next-line es/no-object-assign -- safe
+var $assign = Object.assign;
+// eslint-disable-next-line es/no-object-defineproperty -- required for testing
+var defineProperty = Object.defineProperty;
+
+// `Object.assign` method
+// https://tc39.es/ecma262/#sec-object.assign
+module.exports = !$assign || fails(function () {
+ // should have correct order of operations (Edge bug)
+ if (DESCRIPTORS && $assign({ b: 1 }, $assign(defineProperty({}, 'a', {
+ enumerable: true,
+ get: function () {
+ defineProperty(this, 'b', {
+ value: 3,
+ enumerable: false
+ });
+ }
+ }), { b: 2 })).b !== 1) return true;
+ // should work with symbols and should have deterministic property order (V8 bug)
+ var A = {};
+ var B = {};
+ // eslint-disable-next-line es/no-symbol -- safe
+ var symbol = Symbol();
+ var alphabet = 'abcdefghijklmnopqrst';
+ A[symbol] = 7;
+ alphabet.split('').forEach(function (chr) { B[chr] = chr; });
+ return $assign({}, A)[symbol] != 7 || objectKeys($assign({}, B)).join('') != alphabet;
+}) ? function assign(target, source) { // eslint-disable-line no-unused-vars -- required for `.length`
+ var T = toObject(target);
+ var argumentsLength = arguments.length;
+ var index = 1;
+ var getOwnPropertySymbols = getOwnPropertySymbolsModule.f;
+ var propertyIsEnumerable = propertyIsEnumerableModule.f;
+ while (argumentsLength > index) {
+ var S = IndexedObject(arguments[index++]);
+ var keys = getOwnPropertySymbols ? objectKeys(S).concat(getOwnPropertySymbols(S)) : objectKeys(S);
+ var length = keys.length;
+ var j = 0;
+ var key;
+ while (length > j) {
+ key = keys[j++];
+ if (!DESCRIPTORS || propertyIsEnumerable.call(S, key)) T[key] = S[key];
+ }
+ } return T;
+} : $assign;
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/object-create.js":
+/*!*********************************************************!*\
+ !*** ./node_modules/core-js/internals/object-create.js ***!
+ \*********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+/* global ActiveXObject -- old IE, WSH */
+var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/core-js/internals/an-object.js");
+var defineProperties = __webpack_require__(/*! ../internals/object-define-properties */ "./node_modules/core-js/internals/object-define-properties.js");
+var enumBugKeys = __webpack_require__(/*! ../internals/enum-bug-keys */ "./node_modules/core-js/internals/enum-bug-keys.js");
+var hiddenKeys = __webpack_require__(/*! ../internals/hidden-keys */ "./node_modules/core-js/internals/hidden-keys.js");
+var html = __webpack_require__(/*! ../internals/html */ "./node_modules/core-js/internals/html.js");
+var documentCreateElement = __webpack_require__(/*! ../internals/document-create-element */ "./node_modules/core-js/internals/document-create-element.js");
+var sharedKey = __webpack_require__(/*! ../internals/shared-key */ "./node_modules/core-js/internals/shared-key.js");
+
+var GT = '>';
+var LT = '<';
+var PROTOTYPE = 'prototype';
+var SCRIPT = 'script';
+var IE_PROTO = sharedKey('IE_PROTO');
+
+var EmptyConstructor = function () { /* empty */ };
+
+var scriptTag = function (content) {
+ return LT + SCRIPT + GT + content + LT + '/' + SCRIPT + GT;
+};
+
+// Create object with fake `null` prototype: use ActiveX Object with cleared prototype
+var NullProtoObjectViaActiveX = function (activeXDocument) {
+ activeXDocument.write(scriptTag(''));
+ activeXDocument.close();
+ var temp = activeXDocument.parentWindow.Object;
+ activeXDocument = null; // avoid memory leak
+ return temp;
+};
+
+// Create object with fake `null` prototype: use iframe Object with cleared prototype
+var NullProtoObjectViaIFrame = function () {
+ // Thrash, waste and sodomy: IE GC bug
+ var iframe = documentCreateElement('iframe');
+ var JS = 'java' + SCRIPT + ':';
+ var iframeDocument;
+ iframe.style.display = 'none';
+ html.appendChild(iframe);
+ // https://github.com/zloirock/core-js/issues/475
+ iframe.src = String(JS);
+ iframeDocument = iframe.contentWindow.document;
+ iframeDocument.open();
+ iframeDocument.write(scriptTag('document.F=Object'));
+ iframeDocument.close();
+ return iframeDocument.F;
+};
+
+// Check for document.domain and active x support
+// No need to use active x approach when document.domain is not set
+// see https://github.com/es-shims/es5-shim/issues/150
+// variation of https://github.com/kitcambridge/es5-shim/commit/4f738ac066346
+// avoid IE GC bug
+var activeXDocument;
+var NullProtoObject = function () {
+ try {
+ activeXDocument = new ActiveXObject('htmlfile');
+ } catch (error) { /* ignore */ }
+ NullProtoObject = typeof document != 'undefined'
+ ? document.domain && activeXDocument
+ ? NullProtoObjectViaActiveX(activeXDocument) // old IE
+ : NullProtoObjectViaIFrame()
+ : NullProtoObjectViaActiveX(activeXDocument); // WSH
+ var length = enumBugKeys.length;
+ while (length--) delete NullProtoObject[PROTOTYPE][enumBugKeys[length]];
+ return NullProtoObject();
+};
+
+hiddenKeys[IE_PROTO] = true;
+
+// `Object.create` method
+// https://tc39.es/ecma262/#sec-object.create
+module.exports = Object.create || function create(O, Properties) {
+ var result;
+ if (O !== null) {
+ EmptyConstructor[PROTOTYPE] = anObject(O);
+ result = new EmptyConstructor();
+ EmptyConstructor[PROTOTYPE] = null;
+ // add "__proto__" for Object.getPrototypeOf polyfill
+ result[IE_PROTO] = O;
+ } else result = NullProtoObject();
+ return Properties === undefined ? result : defineProperties(result, Properties);
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/object-define-properties.js":
+/*!********************************************************************!*\
+ !*** ./node_modules/core-js/internals/object-define-properties.js ***!
+ \********************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/core-js/internals/descriptors.js");
+var definePropertyModule = __webpack_require__(/*! ../internals/object-define-property */ "./node_modules/core-js/internals/object-define-property.js");
+var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/core-js/internals/an-object.js");
+var objectKeys = __webpack_require__(/*! ../internals/object-keys */ "./node_modules/core-js/internals/object-keys.js");
+
+// `Object.defineProperties` method
+// https://tc39.es/ecma262/#sec-object.defineproperties
+// eslint-disable-next-line es/no-object-defineproperties -- safe
+module.exports = DESCRIPTORS ? Object.defineProperties : function defineProperties(O, Properties) {
+ anObject(O);
+ var keys = objectKeys(Properties);
+ var length = keys.length;
+ var index = 0;
+ var key;
+ while (length > index) definePropertyModule.f(O, key = keys[index++], Properties[key]);
+ return O;
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/object-define-property.js":
+/*!******************************************************************!*\
+ !*** ./node_modules/core-js/internals/object-define-property.js ***!
+ \******************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/core-js/internals/descriptors.js");
+var IE8_DOM_DEFINE = __webpack_require__(/*! ../internals/ie8-dom-define */ "./node_modules/core-js/internals/ie8-dom-define.js");
+var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/core-js/internals/an-object.js");
+var toPropertyKey = __webpack_require__(/*! ../internals/to-property-key */ "./node_modules/core-js/internals/to-property-key.js");
+
+// eslint-disable-next-line es/no-object-defineproperty -- safe
+var $defineProperty = Object.defineProperty;
+
+// `Object.defineProperty` method
+// https://tc39.es/ecma262/#sec-object.defineproperty
+exports.f = DESCRIPTORS ? $defineProperty : function defineProperty(O, P, Attributes) {
+ anObject(O);
+ P = toPropertyKey(P);
+ anObject(Attributes);
+ if (IE8_DOM_DEFINE) try {
+ return $defineProperty(O, P, Attributes);
+ } catch (error) { /* empty */ }
+ if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported');
+ if ('value' in Attributes) O[P] = Attributes.value;
+ return O;
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/object-get-own-property-descriptor.js":
+/*!******************************************************************************!*\
+ !*** ./node_modules/core-js/internals/object-get-own-property-descriptor.js ***!
+ \******************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/core-js/internals/descriptors.js");
+var propertyIsEnumerableModule = __webpack_require__(/*! ../internals/object-property-is-enumerable */ "./node_modules/core-js/internals/object-property-is-enumerable.js");
+var createPropertyDescriptor = __webpack_require__(/*! ../internals/create-property-descriptor */ "./node_modules/core-js/internals/create-property-descriptor.js");
+var toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ "./node_modules/core-js/internals/to-indexed-object.js");
+var toPropertyKey = __webpack_require__(/*! ../internals/to-property-key */ "./node_modules/core-js/internals/to-property-key.js");
+var has = __webpack_require__(/*! ../internals/has */ "./node_modules/core-js/internals/has.js");
+var IE8_DOM_DEFINE = __webpack_require__(/*! ../internals/ie8-dom-define */ "./node_modules/core-js/internals/ie8-dom-define.js");
+
+// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe
+var $getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;
+
+// `Object.getOwnPropertyDescriptor` method
+// https://tc39.es/ecma262/#sec-object.getownpropertydescriptor
+exports.f = DESCRIPTORS ? $getOwnPropertyDescriptor : function getOwnPropertyDescriptor(O, P) {
+ O = toIndexedObject(O);
+ P = toPropertyKey(P);
+ if (IE8_DOM_DEFINE) try {
+ return $getOwnPropertyDescriptor(O, P);
+ } catch (error) { /* empty */ }
+ if (has(O, P)) return createPropertyDescriptor(!propertyIsEnumerableModule.f.call(O, P), O[P]);
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/object-get-own-property-names-external.js":
+/*!**********************************************************************************!*\
+ !*** ./node_modules/core-js/internals/object-get-own-property-names-external.js ***!
+ \**********************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+/* eslint-disable es/no-object-getownpropertynames -- safe */
+var toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ "./node_modules/core-js/internals/to-indexed-object.js");
+var $getOwnPropertyNames = __webpack_require__(/*! ../internals/object-get-own-property-names */ "./node_modules/core-js/internals/object-get-own-property-names.js").f;
+
+var toString = {}.toString;
+
+var windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames
+ ? Object.getOwnPropertyNames(window) : [];
+
+var getWindowNames = function (it) {
+ try {
+ return $getOwnPropertyNames(it);
+ } catch (error) {
+ return windowNames.slice();
+ }
+};
+
+// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window
+module.exports.f = function getOwnPropertyNames(it) {
+ return windowNames && toString.call(it) == '[object Window]'
+ ? getWindowNames(it)
+ : $getOwnPropertyNames(toIndexedObject(it));
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/object-get-own-property-names.js":
+/*!*************************************************************************!*\
+ !*** ./node_modules/core-js/internals/object-get-own-property-names.js ***!
+ \*************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var internalObjectKeys = __webpack_require__(/*! ../internals/object-keys-internal */ "./node_modules/core-js/internals/object-keys-internal.js");
+var enumBugKeys = __webpack_require__(/*! ../internals/enum-bug-keys */ "./node_modules/core-js/internals/enum-bug-keys.js");
+
+var hiddenKeys = enumBugKeys.concat('length', 'prototype');
+
+// `Object.getOwnPropertyNames` method
+// https://tc39.es/ecma262/#sec-object.getownpropertynames
+// eslint-disable-next-line es/no-object-getownpropertynames -- safe
+exports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {
+ return internalObjectKeys(O, hiddenKeys);
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/object-get-own-property-symbols.js":
+/*!***************************************************************************!*\
+ !*** ./node_modules/core-js/internals/object-get-own-property-symbols.js ***!
+ \***************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+// eslint-disable-next-line es/no-object-getownpropertysymbols -- safe
+exports.f = Object.getOwnPropertySymbols;
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/object-get-prototype-of.js":
+/*!*******************************************************************!*\
+ !*** ./node_modules/core-js/internals/object-get-prototype-of.js ***!
+ \*******************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var has = __webpack_require__(/*! ../internals/has */ "./node_modules/core-js/internals/has.js");
+var isCallable = __webpack_require__(/*! ../internals/is-callable */ "./node_modules/core-js/internals/is-callable.js");
+var toObject = __webpack_require__(/*! ../internals/to-object */ "./node_modules/core-js/internals/to-object.js");
+var sharedKey = __webpack_require__(/*! ../internals/shared-key */ "./node_modules/core-js/internals/shared-key.js");
+var CORRECT_PROTOTYPE_GETTER = __webpack_require__(/*! ../internals/correct-prototype-getter */ "./node_modules/core-js/internals/correct-prototype-getter.js");
+
+var IE_PROTO = sharedKey('IE_PROTO');
+var ObjectPrototype = Object.prototype;
+
+// `Object.getPrototypeOf` method
+// https://tc39.es/ecma262/#sec-object.getprototypeof
+// eslint-disable-next-line es/no-object-getprototypeof -- safe
+module.exports = CORRECT_PROTOTYPE_GETTER ? Object.getPrototypeOf : function (O) {
+ var object = toObject(O);
+ if (has(object, IE_PROTO)) return object[IE_PROTO];
+ var constructor = object.constructor;
+ if (isCallable(constructor) && object instanceof constructor) {
+ return constructor.prototype;
+ } return object instanceof Object ? ObjectPrototype : null;
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/object-keys-internal.js":
+/*!****************************************************************!*\
+ !*** ./node_modules/core-js/internals/object-keys-internal.js ***!
+ \****************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var has = __webpack_require__(/*! ../internals/has */ "./node_modules/core-js/internals/has.js");
+var toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ "./node_modules/core-js/internals/to-indexed-object.js");
+var indexOf = __webpack_require__(/*! ../internals/array-includes */ "./node_modules/core-js/internals/array-includes.js").indexOf;
+var hiddenKeys = __webpack_require__(/*! ../internals/hidden-keys */ "./node_modules/core-js/internals/hidden-keys.js");
+
+module.exports = function (object, names) {
+ var O = toIndexedObject(object);
+ var i = 0;
+ var result = [];
+ var key;
+ for (key in O) !has(hiddenKeys, key) && has(O, key) && result.push(key);
+ // Don't enum bug & hidden keys
+ while (names.length > i) if (has(O, key = names[i++])) {
+ ~indexOf(result, key) || result.push(key);
+ }
+ return result;
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/object-keys.js":
+/*!*******************************************************!*\
+ !*** ./node_modules/core-js/internals/object-keys.js ***!
+ \*******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var internalObjectKeys = __webpack_require__(/*! ../internals/object-keys-internal */ "./node_modules/core-js/internals/object-keys-internal.js");
+var enumBugKeys = __webpack_require__(/*! ../internals/enum-bug-keys */ "./node_modules/core-js/internals/enum-bug-keys.js");
+
+// `Object.keys` method
+// https://tc39.es/ecma262/#sec-object.keys
+// eslint-disable-next-line es/no-object-keys -- safe
+module.exports = Object.keys || function keys(O) {
+ return internalObjectKeys(O, enumBugKeys);
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/object-property-is-enumerable.js":
+/*!*************************************************************************!*\
+ !*** ./node_modules/core-js/internals/object-property-is-enumerable.js ***!
+ \*************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $propertyIsEnumerable = {}.propertyIsEnumerable;
+// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe
+var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;
+
+// Nashorn ~ JDK8 bug
+var NASHORN_BUG = getOwnPropertyDescriptor && !$propertyIsEnumerable.call({ 1: 2 }, 1);
+
+// `Object.prototype.propertyIsEnumerable` method implementation
+// https://tc39.es/ecma262/#sec-object.prototype.propertyisenumerable
+exports.f = NASHORN_BUG ? function propertyIsEnumerable(V) {
+ var descriptor = getOwnPropertyDescriptor(this, V);
+ return !!descriptor && descriptor.enumerable;
+} : $propertyIsEnumerable;
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/object-prototype-accessors-forced.js":
+/*!*****************************************************************************!*\
+ !*** ./node_modules/core-js/internals/object-prototype-accessors-forced.js ***!
+ \*****************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var IS_PURE = __webpack_require__(/*! ../internals/is-pure */ "./node_modules/core-js/internals/is-pure.js");
+var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js");
+var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js");
+var WEBKIT = __webpack_require__(/*! ../internals/engine-webkit-version */ "./node_modules/core-js/internals/engine-webkit-version.js");
+
+// Forced replacement object prototype accessors methods
+module.exports = IS_PURE || !fails(function () {
+ // This feature detection crashes old WebKit
+ // https://github.com/zloirock/core-js/issues/232
+ if (WEBKIT && WEBKIT < 535) return;
+ var key = Math.random();
+ // In FF throws only define methods
+ // eslint-disable-next-line no-undef, no-useless-call -- required for testing
+ __defineSetter__.call(null, key, function () { /* empty */ });
+ delete global[key];
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/object-set-prototype-of.js":
+/*!*******************************************************************!*\
+ !*** ./node_modules/core-js/internals/object-set-prototype-of.js ***!
+ \*******************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+/* eslint-disable no-proto -- safe */
+var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/core-js/internals/an-object.js");
+var aPossiblePrototype = __webpack_require__(/*! ../internals/a-possible-prototype */ "./node_modules/core-js/internals/a-possible-prototype.js");
+
+// `Object.setPrototypeOf` method
+// https://tc39.es/ecma262/#sec-object.setprototypeof
+// Works with __proto__ only. Old v8 can't work with null proto objects.
+// eslint-disable-next-line es/no-object-setprototypeof -- safe
+module.exports = Object.setPrototypeOf || ('__proto__' in {} ? function () {
+ var CORRECT_SETTER = false;
+ var test = {};
+ var setter;
+ try {
+ // eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe
+ setter = Object.getOwnPropertyDescriptor(Object.prototype, '__proto__').set;
+ setter.call(test, []);
+ CORRECT_SETTER = test instanceof Array;
+ } catch (error) { /* empty */ }
+ return function setPrototypeOf(O, proto) {
+ anObject(O);
+ aPossiblePrototype(proto);
+ if (CORRECT_SETTER) setter.call(O, proto);
+ else O.__proto__ = proto;
+ return O;
+ };
+}() : undefined);
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/object-to-array.js":
+/*!***********************************************************!*\
+ !*** ./node_modules/core-js/internals/object-to-array.js ***!
+ \***********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/core-js/internals/descriptors.js");
+var objectKeys = __webpack_require__(/*! ../internals/object-keys */ "./node_modules/core-js/internals/object-keys.js");
+var toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ "./node_modules/core-js/internals/to-indexed-object.js");
+var propertyIsEnumerable = __webpack_require__(/*! ../internals/object-property-is-enumerable */ "./node_modules/core-js/internals/object-property-is-enumerable.js").f;
+
+// `Object.{ entries, values }` methods implementation
+var createMethod = function (TO_ENTRIES) {
+ return function (it) {
+ var O = toIndexedObject(it);
+ var keys = objectKeys(O);
+ var length = keys.length;
+ var i = 0;
+ var result = [];
+ var key;
+ while (length > i) {
+ key = keys[i++];
+ if (!DESCRIPTORS || propertyIsEnumerable.call(O, key)) {
+ result.push(TO_ENTRIES ? [key, O[key]] : O[key]);
+ }
+ }
+ return result;
+ };
+};
+
+module.exports = {
+ // `Object.entries` method
+ // https://tc39.es/ecma262/#sec-object.entries
+ entries: createMethod(true),
+ // `Object.values` method
+ // https://tc39.es/ecma262/#sec-object.values
+ values: createMethod(false)
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/object-to-string.js":
+/*!************************************************************!*\
+ !*** ./node_modules/core-js/internals/object-to-string.js ***!
+ \************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var TO_STRING_TAG_SUPPORT = __webpack_require__(/*! ../internals/to-string-tag-support */ "./node_modules/core-js/internals/to-string-tag-support.js");
+var classof = __webpack_require__(/*! ../internals/classof */ "./node_modules/core-js/internals/classof.js");
+
+// `Object.prototype.toString` method implementation
+// https://tc39.es/ecma262/#sec-object.prototype.tostring
+module.exports = TO_STRING_TAG_SUPPORT ? {}.toString : function toString() {
+ return '[object ' + classof(this) + ']';
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/ordinary-to-primitive.js":
+/*!*****************************************************************!*\
+ !*** ./node_modules/core-js/internals/ordinary-to-primitive.js ***!
+ \*****************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var isCallable = __webpack_require__(/*! ../internals/is-callable */ "./node_modules/core-js/internals/is-callable.js");
+var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/core-js/internals/is-object.js");
+
+// `OrdinaryToPrimitive` abstract operation
+// https://tc39.es/ecma262/#sec-ordinarytoprimitive
+module.exports = function (input, pref) {
+ var fn, val;
+ if (pref === 'string' && isCallable(fn = input.toString) && !isObject(val = fn.call(input))) return val;
+ if (isCallable(fn = input.valueOf) && !isObject(val = fn.call(input))) return val;
+ if (pref !== 'string' && isCallable(fn = input.toString) && !isObject(val = fn.call(input))) return val;
+ throw TypeError("Can't convert object to primitive value");
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/own-keys.js":
+/*!****************************************************!*\
+ !*** ./node_modules/core-js/internals/own-keys.js ***!
+ \****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ "./node_modules/core-js/internals/get-built-in.js");
+var getOwnPropertyNamesModule = __webpack_require__(/*! ../internals/object-get-own-property-names */ "./node_modules/core-js/internals/object-get-own-property-names.js");
+var getOwnPropertySymbolsModule = __webpack_require__(/*! ../internals/object-get-own-property-symbols */ "./node_modules/core-js/internals/object-get-own-property-symbols.js");
+var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/core-js/internals/an-object.js");
+
+// all object keys, includes non-enumerable and symbols
+module.exports = getBuiltIn('Reflect', 'ownKeys') || function ownKeys(it) {
+ var keys = getOwnPropertyNamesModule.f(anObject(it));
+ var getOwnPropertySymbols = getOwnPropertySymbolsModule.f;
+ return getOwnPropertySymbols ? keys.concat(getOwnPropertySymbols(it)) : keys;
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/path.js":
+/*!************************************************!*\
+ !*** ./node_modules/core-js/internals/path.js ***!
+ \************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js");
+
+module.exports = global;
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/perform.js":
+/*!***************************************************!*\
+ !*** ./node_modules/core-js/internals/perform.js ***!
+ \***************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+module.exports = function (exec) {
+ try {
+ return { error: false, value: exec() };
+ } catch (error) {
+ return { error: true, value: error };
+ }
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/promise-resolve.js":
+/*!***********************************************************!*\
+ !*** ./node_modules/core-js/internals/promise-resolve.js ***!
+ \***********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/core-js/internals/an-object.js");
+var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/core-js/internals/is-object.js");
+var newPromiseCapability = __webpack_require__(/*! ../internals/new-promise-capability */ "./node_modules/core-js/internals/new-promise-capability.js");
+
+module.exports = function (C, x) {
+ anObject(C);
+ if (isObject(x) && x.constructor === C) return x;
+ var promiseCapability = newPromiseCapability.f(C);
+ var resolve = promiseCapability.resolve;
+ resolve(x);
+ return promiseCapability.promise;
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/redefine-all.js":
+/*!********************************************************!*\
+ !*** ./node_modules/core-js/internals/redefine-all.js ***!
+ \********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var redefine = __webpack_require__(/*! ../internals/redefine */ "./node_modules/core-js/internals/redefine.js");
+
+module.exports = function (target, src, options) {
+ for (var key in src) redefine(target, key, src[key], options);
+ return target;
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/redefine.js":
+/*!****************************************************!*\
+ !*** ./node_modules/core-js/internals/redefine.js ***!
+ \****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js");
+var isCallable = __webpack_require__(/*! ../internals/is-callable */ "./node_modules/core-js/internals/is-callable.js");
+var has = __webpack_require__(/*! ../internals/has */ "./node_modules/core-js/internals/has.js");
+var createNonEnumerableProperty = __webpack_require__(/*! ../internals/create-non-enumerable-property */ "./node_modules/core-js/internals/create-non-enumerable-property.js");
+var setGlobal = __webpack_require__(/*! ../internals/set-global */ "./node_modules/core-js/internals/set-global.js");
+var inspectSource = __webpack_require__(/*! ../internals/inspect-source */ "./node_modules/core-js/internals/inspect-source.js");
+var InternalStateModule = __webpack_require__(/*! ../internals/internal-state */ "./node_modules/core-js/internals/internal-state.js");
+var CONFIGURABLE_FUNCTION_NAME = __webpack_require__(/*! ../internals/function-name */ "./node_modules/core-js/internals/function-name.js").CONFIGURABLE;
+
+var getInternalState = InternalStateModule.get;
+var enforceInternalState = InternalStateModule.enforce;
+var TEMPLATE = String(String).split('String');
+
+(module.exports = function (O, key, value, options) {
+ var unsafe = options ? !!options.unsafe : false;
+ var simple = options ? !!options.enumerable : false;
+ var noTargetGet = options ? !!options.noTargetGet : false;
+ var name = options && options.name !== undefined ? options.name : key;
+ var state;
+ if (isCallable(value)) {
+ if (String(name).slice(0, 7) === 'Symbol(') {
+ name = '[' + String(name).replace(/^Symbol\(([^)]*)\)/, '$1') + ']';
+ }
+ if (!has(value, 'name') || (CONFIGURABLE_FUNCTION_NAME && value.name !== name)) {
+ createNonEnumerableProperty(value, 'name', name);
+ }
+ state = enforceInternalState(value);
+ if (!state.source) {
+ state.source = TEMPLATE.join(typeof name == 'string' ? name : '');
+ }
+ }
+ if (O === global) {
+ if (simple) O[key] = value;
+ else setGlobal(key, value);
+ return;
+ } else if (!unsafe) {
+ delete O[key];
+ } else if (!noTargetGet && O[key]) {
+ simple = true;
+ }
+ if (simple) O[key] = value;
+ else createNonEnumerableProperty(O, key, value);
+// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative
+})(Function.prototype, 'toString', function toString() {
+ return isCallable(this) && getInternalState(this).source || inspectSource(this);
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/regexp-exec-abstract.js":
+/*!****************************************************************!*\
+ !*** ./node_modules/core-js/internals/regexp-exec-abstract.js ***!
+ \****************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/core-js/internals/an-object.js");
+var isCallable = __webpack_require__(/*! ../internals/is-callable */ "./node_modules/core-js/internals/is-callable.js");
+var classof = __webpack_require__(/*! ../internals/classof-raw */ "./node_modules/core-js/internals/classof-raw.js");
+var regexpExec = __webpack_require__(/*! ../internals/regexp-exec */ "./node_modules/core-js/internals/regexp-exec.js");
+
+// `RegExpExec` abstract operation
+// https://tc39.es/ecma262/#sec-regexpexec
+module.exports = function (R, S) {
+ var exec = R.exec;
+ if (isCallable(exec)) {
+ var result = exec.call(R, S);
+ if (result !== null) anObject(result);
+ return result;
+ }
+ if (classof(R) === 'RegExp') return regexpExec.call(R, S);
+ throw TypeError('RegExp#exec called on incompatible receiver');
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/regexp-exec.js":
+/*!*******************************************************!*\
+ !*** ./node_modules/core-js/internals/regexp-exec.js ***!
+ \*******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+/* eslint-disable regexp/no-empty-capturing-group, regexp/no-empty-group, regexp/no-lazy-ends -- testing */
+/* eslint-disable regexp/no-useless-quantifier -- testing */
+var toString = __webpack_require__(/*! ../internals/to-string */ "./node_modules/core-js/internals/to-string.js");
+var regexpFlags = __webpack_require__(/*! ../internals/regexp-flags */ "./node_modules/core-js/internals/regexp-flags.js");
+var stickyHelpers = __webpack_require__(/*! ../internals/regexp-sticky-helpers */ "./node_modules/core-js/internals/regexp-sticky-helpers.js");
+var shared = __webpack_require__(/*! ../internals/shared */ "./node_modules/core-js/internals/shared.js");
+var create = __webpack_require__(/*! ../internals/object-create */ "./node_modules/core-js/internals/object-create.js");
+var getInternalState = __webpack_require__(/*! ../internals/internal-state */ "./node_modules/core-js/internals/internal-state.js").get;
+var UNSUPPORTED_DOT_ALL = __webpack_require__(/*! ../internals/regexp-unsupported-dot-all */ "./node_modules/core-js/internals/regexp-unsupported-dot-all.js");
+var UNSUPPORTED_NCG = __webpack_require__(/*! ../internals/regexp-unsupported-ncg */ "./node_modules/core-js/internals/regexp-unsupported-ncg.js");
+
+var nativeExec = RegExp.prototype.exec;
+var nativeReplace = shared('native-string-replace', String.prototype.replace);
+
+var patchedExec = nativeExec;
+
+var UPDATES_LAST_INDEX_WRONG = (function () {
+ var re1 = /a/;
+ var re2 = /b*/g;
+ nativeExec.call(re1, 'a');
+ nativeExec.call(re2, 'a');
+ return re1.lastIndex !== 0 || re2.lastIndex !== 0;
+})();
+
+var UNSUPPORTED_Y = stickyHelpers.UNSUPPORTED_Y || stickyHelpers.BROKEN_CARET;
+
+// nonparticipating capturing group, copied from es5-shim's String#split patch.
+var NPCG_INCLUDED = /()??/.exec('')[1] !== undefined;
+
+var PATCH = UPDATES_LAST_INDEX_WRONG || NPCG_INCLUDED || UNSUPPORTED_Y || UNSUPPORTED_DOT_ALL || UNSUPPORTED_NCG;
+
+if (PATCH) {
+ // eslint-disable-next-line max-statements -- TODO
+ patchedExec = function exec(string) {
+ var re = this;
+ var state = getInternalState(re);
+ var str = toString(string);
+ var raw = state.raw;
+ var result, reCopy, lastIndex, match, i, object, group;
+
+ if (raw) {
+ raw.lastIndex = re.lastIndex;
+ result = patchedExec.call(raw, str);
+ re.lastIndex = raw.lastIndex;
+ return result;
+ }
+
+ var groups = state.groups;
+ var sticky = UNSUPPORTED_Y && re.sticky;
+ var flags = regexpFlags.call(re);
+ var source = re.source;
+ var charsAdded = 0;
+ var strCopy = str;
+
+ if (sticky) {
+ flags = flags.replace('y', '');
+ if (flags.indexOf('g') === -1) {
+ flags += 'g';
+ }
+
+ strCopy = str.slice(re.lastIndex);
+ // Support anchored sticky behavior.
+ if (re.lastIndex > 0 && (!re.multiline || re.multiline && str.charAt(re.lastIndex - 1) !== '\n')) {
+ source = '(?: ' + source + ')';
+ strCopy = ' ' + strCopy;
+ charsAdded++;
+ }
+ // ^(? + rx + ) is needed, in combination with some str slicing, to
+ // simulate the 'y' flag.
+ reCopy = new RegExp('^(?:' + source + ')', flags);
+ }
+
+ if (NPCG_INCLUDED) {
+ reCopy = new RegExp('^' + source + '$(?!\\s)', flags);
+ }
+ if (UPDATES_LAST_INDEX_WRONG) lastIndex = re.lastIndex;
+
+ match = nativeExec.call(sticky ? reCopy : re, strCopy);
+
+ if (sticky) {
+ if (match) {
+ match.input = match.input.slice(charsAdded);
+ match[0] = match[0].slice(charsAdded);
+ match.index = re.lastIndex;
+ re.lastIndex += match[0].length;
+ } else re.lastIndex = 0;
+ } else if (UPDATES_LAST_INDEX_WRONG && match) {
+ re.lastIndex = re.global ? match.index + match[0].length : lastIndex;
+ }
+ if (NPCG_INCLUDED && match && match.length > 1) {
+ // Fix browsers whose `exec` methods don't consistently return `undefined`
+ // for NPCG, like IE8. NOTE: This doesn' work for /(.?)?/
+ nativeReplace.call(match[0], reCopy, function () {
+ for (i = 1; i < arguments.length - 2; i++) {
+ if (arguments[i] === undefined) match[i] = undefined;
+ }
+ });
+ }
+
+ if (match && groups) {
+ match.groups = object = create(null);
+ for (i = 0; i < groups.length; i++) {
+ group = groups[i];
+ object[group[0]] = match[group[1]];
+ }
+ }
+
+ return match;
+ };
+}
+
+module.exports = patchedExec;
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/regexp-flags.js":
+/*!********************************************************!*\
+ !*** ./node_modules/core-js/internals/regexp-flags.js ***!
+ \********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/core-js/internals/an-object.js");
+
+// `RegExp.prototype.flags` getter implementation
+// https://tc39.es/ecma262/#sec-get-regexp.prototype.flags
+module.exports = function () {
+ var that = anObject(this);
+ var result = '';
+ if (that.global) result += 'g';
+ if (that.ignoreCase) result += 'i';
+ if (that.multiline) result += 'm';
+ if (that.dotAll) result += 's';
+ if (that.unicode) result += 'u';
+ if (that.sticky) result += 'y';
+ return result;
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/regexp-sticky-helpers.js":
+/*!*****************************************************************!*\
+ !*** ./node_modules/core-js/internals/regexp-sticky-helpers.js ***!
+ \*****************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js");
+var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js");
+
+// babel-minify and Closure Compiler transpiles RegExp('a', 'y') -> /a/y and it causes SyntaxError
+var $RegExp = global.RegExp;
+
+exports.UNSUPPORTED_Y = fails(function () {
+ var re = $RegExp('a', 'y');
+ re.lastIndex = 2;
+ return re.exec('abcd') != null;
+});
+
+exports.BROKEN_CARET = fails(function () {
+ // https://bugzilla.mozilla.org/show_bug.cgi?id=773687
+ var re = $RegExp('^r', 'gy');
+ re.lastIndex = 2;
+ return re.exec('str') != null;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/regexp-unsupported-dot-all.js":
+/*!**********************************************************************!*\
+ !*** ./node_modules/core-js/internals/regexp-unsupported-dot-all.js ***!
+ \**********************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js");
+var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js");
+
+// babel-minify and Closure Compiler transpiles RegExp('.', 's') -> /./s and it causes SyntaxError
+var $RegExp = global.RegExp;
+
+module.exports = fails(function () {
+ var re = $RegExp('.', 's');
+ return !(re.dotAll && re.exec('\n') && re.flags === 's');
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/regexp-unsupported-ncg.js":
+/*!******************************************************************!*\
+ !*** ./node_modules/core-js/internals/regexp-unsupported-ncg.js ***!
+ \******************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js");
+var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js");
+
+// babel-minify and Closure Compiler transpiles RegExp('(?b)', 'g') -> /(?b)/g and it causes SyntaxError
+var $RegExp = global.RegExp;
+
+module.exports = fails(function () {
+ var re = $RegExp('(?b)', 'g');
+ return re.exec('b').groups.a !== 'b' ||
+ 'b'.replace(re, '$c') !== 'bc';
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/require-object-coercible.js":
+/*!********************************************************************!*\
+ !*** ./node_modules/core-js/internals/require-object-coercible.js ***!
+ \********************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+// `RequireObjectCoercible` abstract operation
+// https://tc39.es/ecma262/#sec-requireobjectcoercible
+module.exports = function (it) {
+ if (it == undefined) throw TypeError("Can't call method on " + it);
+ return it;
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/same-value.js":
+/*!******************************************************!*\
+ !*** ./node_modules/core-js/internals/same-value.js ***!
+ \******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+// `SameValue` abstract operation
+// https://tc39.es/ecma262/#sec-samevalue
+// eslint-disable-next-line es/no-object-is -- safe
+module.exports = Object.is || function is(x, y) {
+ // eslint-disable-next-line no-self-compare -- NaN check
+ return x === y ? x !== 0 || 1 / x === 1 / y : x != x && y != y;
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/set-global.js":
+/*!******************************************************!*\
+ !*** ./node_modules/core-js/internals/set-global.js ***!
+ \******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js");
+
+module.exports = function (key, value) {
+ try {
+ // eslint-disable-next-line es/no-object-defineproperty -- safe
+ Object.defineProperty(global, key, { value: value, configurable: true, writable: true });
+ } catch (error) {
+ global[key] = value;
+ } return value;
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/set-species.js":
+/*!*******************************************************!*\
+ !*** ./node_modules/core-js/internals/set-species.js ***!
+ \*******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ "./node_modules/core-js/internals/get-built-in.js");
+var definePropertyModule = __webpack_require__(/*! ../internals/object-define-property */ "./node_modules/core-js/internals/object-define-property.js");
+var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js");
+var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/core-js/internals/descriptors.js");
+
+var SPECIES = wellKnownSymbol('species');
+
+module.exports = function (CONSTRUCTOR_NAME) {
+ var Constructor = getBuiltIn(CONSTRUCTOR_NAME);
+ var defineProperty = definePropertyModule.f;
+
+ if (DESCRIPTORS && Constructor && !Constructor[SPECIES]) {
+ defineProperty(Constructor, SPECIES, {
+ configurable: true,
+ get: function () { return this; }
+ });
+ }
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/set-to-string-tag.js":
+/*!*************************************************************!*\
+ !*** ./node_modules/core-js/internals/set-to-string-tag.js ***!
+ \*************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var defineProperty = __webpack_require__(/*! ../internals/object-define-property */ "./node_modules/core-js/internals/object-define-property.js").f;
+var has = __webpack_require__(/*! ../internals/has */ "./node_modules/core-js/internals/has.js");
+var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js");
+
+var TO_STRING_TAG = wellKnownSymbol('toStringTag');
+
+module.exports = function (it, TAG, STATIC) {
+ if (it && !has(it = STATIC ? it : it.prototype, TO_STRING_TAG)) {
+ defineProperty(it, TO_STRING_TAG, { configurable: true, value: TAG });
+ }
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/shared-key.js":
+/*!******************************************************!*\
+ !*** ./node_modules/core-js/internals/shared-key.js ***!
+ \******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var shared = __webpack_require__(/*! ../internals/shared */ "./node_modules/core-js/internals/shared.js");
+var uid = __webpack_require__(/*! ../internals/uid */ "./node_modules/core-js/internals/uid.js");
+
+var keys = shared('keys');
+
+module.exports = function (key) {
+ return keys[key] || (keys[key] = uid(key));
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/shared-store.js":
+/*!********************************************************!*\
+ !*** ./node_modules/core-js/internals/shared-store.js ***!
+ \********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js");
+var setGlobal = __webpack_require__(/*! ../internals/set-global */ "./node_modules/core-js/internals/set-global.js");
+
+var SHARED = '__core-js_shared__';
+var store = global[SHARED] || setGlobal(SHARED, {});
+
+module.exports = store;
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/shared.js":
+/*!**************************************************!*\
+ !*** ./node_modules/core-js/internals/shared.js ***!
+ \**************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var IS_PURE = __webpack_require__(/*! ../internals/is-pure */ "./node_modules/core-js/internals/is-pure.js");
+var store = __webpack_require__(/*! ../internals/shared-store */ "./node_modules/core-js/internals/shared-store.js");
+
+(module.exports = function (key, value) {
+ return store[key] || (store[key] = value !== undefined ? value : {});
+})('versions', []).push({
+ version: '3.18.1',
+ mode: IS_PURE ? 'pure' : 'global',
+ copyright: '© 2021 Denis Pushkarev (zloirock.ru)'
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/species-constructor.js":
+/*!***************************************************************!*\
+ !*** ./node_modules/core-js/internals/species-constructor.js ***!
+ \***************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/core-js/internals/an-object.js");
+var aConstructor = __webpack_require__(/*! ../internals/a-constructor */ "./node_modules/core-js/internals/a-constructor.js");
+var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js");
+
+var SPECIES = wellKnownSymbol('species');
+
+// `SpeciesConstructor` abstract operation
+// https://tc39.es/ecma262/#sec-speciesconstructor
+module.exports = function (O, defaultConstructor) {
+ var C = anObject(O).constructor;
+ var S;
+ return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? defaultConstructor : aConstructor(S);
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/string-html-forced.js":
+/*!**************************************************************!*\
+ !*** ./node_modules/core-js/internals/string-html-forced.js ***!
+ \**************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js");
+
+// check the existence of a method, lowercase
+// of a tag and escaping quotes in arguments
+module.exports = function (METHOD_NAME) {
+ return fails(function () {
+ var test = ''[METHOD_NAME]('"');
+ return test !== test.toLowerCase() || test.split('"').length > 3;
+ });
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/string-multibyte.js":
+/*!************************************************************!*\
+ !*** ./node_modules/core-js/internals/string-multibyte.js ***!
+ \************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var toInteger = __webpack_require__(/*! ../internals/to-integer */ "./node_modules/core-js/internals/to-integer.js");
+var toString = __webpack_require__(/*! ../internals/to-string */ "./node_modules/core-js/internals/to-string.js");
+var requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ "./node_modules/core-js/internals/require-object-coercible.js");
+
+// `String.prototype.codePointAt` methods implementation
+var createMethod = function (CONVERT_TO_STRING) {
+ return function ($this, pos) {
+ var S = toString(requireObjectCoercible($this));
+ var position = toInteger(pos);
+ var size = S.length;
+ var first, second;
+ if (position < 0 || position >= size) return CONVERT_TO_STRING ? '' : undefined;
+ first = S.charCodeAt(position);
+ return first < 0xD800 || first > 0xDBFF || position + 1 === size
+ || (second = S.charCodeAt(position + 1)) < 0xDC00 || second > 0xDFFF
+ ? CONVERT_TO_STRING ? S.charAt(position) : first
+ : CONVERT_TO_STRING ? S.slice(position, position + 2) : (first - 0xD800 << 10) + (second - 0xDC00) + 0x10000;
+ };
+};
+
+module.exports = {
+ // `String.prototype.codePointAt` method
+ // https://tc39.es/ecma262/#sec-string.prototype.codepointat
+ codeAt: createMethod(false),
+ // `String.prototype.at` method
+ // https://github.com/mathiasbynens/String.prototype.at
+ charAt: createMethod(true)
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/string-pad-webkit-bug.js":
+/*!*****************************************************************!*\
+ !*** ./node_modules/core-js/internals/string-pad-webkit-bug.js ***!
+ \*****************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+// https://github.com/zloirock/core-js/issues/280
+var userAgent = __webpack_require__(/*! ../internals/engine-user-agent */ "./node_modules/core-js/internals/engine-user-agent.js");
+
+module.exports = /Version\/10(?:\.\d+){1,2}(?: [\w./]+)?(?: Mobile\/\w+)? Safari\//.test(userAgent);
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/string-pad.js":
+/*!******************************************************!*\
+ !*** ./node_modules/core-js/internals/string-pad.js ***!
+ \******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+// https://github.com/tc39/proposal-string-pad-start-end
+var toLength = __webpack_require__(/*! ../internals/to-length */ "./node_modules/core-js/internals/to-length.js");
+var toString = __webpack_require__(/*! ../internals/to-string */ "./node_modules/core-js/internals/to-string.js");
+var repeat = __webpack_require__(/*! ../internals/string-repeat */ "./node_modules/core-js/internals/string-repeat.js");
+var requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ "./node_modules/core-js/internals/require-object-coercible.js");
+
+var ceil = Math.ceil;
+
+// `String.prototype.{ padStart, padEnd }` methods implementation
+var createMethod = function (IS_END) {
+ return function ($this, maxLength, fillString) {
+ var S = toString(requireObjectCoercible($this));
+ var stringLength = S.length;
+ var fillStr = fillString === undefined ? ' ' : toString(fillString);
+ var intMaxLength = toLength(maxLength);
+ var fillLen, stringFiller;
+ if (intMaxLength <= stringLength || fillStr == '') return S;
+ fillLen = intMaxLength - stringLength;
+ stringFiller = repeat.call(fillStr, ceil(fillLen / fillStr.length));
+ if (stringFiller.length > fillLen) stringFiller = stringFiller.slice(0, fillLen);
+ return IS_END ? S + stringFiller : stringFiller + S;
+ };
+};
+
+module.exports = {
+ // `String.prototype.padStart` method
+ // https://tc39.es/ecma262/#sec-string.prototype.padstart
+ start: createMethod(false),
+ // `String.prototype.padEnd` method
+ // https://tc39.es/ecma262/#sec-string.prototype.padend
+ end: createMethod(true)
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/string-punycode-to-ascii.js":
+/*!********************************************************************!*\
+ !*** ./node_modules/core-js/internals/string-punycode-to-ascii.js ***!
+ \********************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+// based on https://github.com/bestiejs/punycode.js/blob/master/punycode.js
+var maxInt = 2147483647; // aka. 0x7FFFFFFF or 2^31-1
+var base = 36;
+var tMin = 1;
+var tMax = 26;
+var skew = 38;
+var damp = 700;
+var initialBias = 72;
+var initialN = 128; // 0x80
+var delimiter = '-'; // '\x2D'
+var regexNonASCII = /[^\0-\u007E]/; // non-ASCII chars
+var regexSeparators = /[.\u3002\uFF0E\uFF61]/g; // RFC 3490 separators
+var OVERFLOW_ERROR = 'Overflow: input needs wider integers to process';
+var baseMinusTMin = base - tMin;
+var floor = Math.floor;
+var stringFromCharCode = String.fromCharCode;
+
+/**
+ * Creates an array containing the numeric code points of each Unicode
+ * character in the string. While JavaScript uses UCS-2 internally,
+ * this function will convert a pair of surrogate halves (each of which
+ * UCS-2 exposes as separate characters) into a single code point,
+ * matching UTF-16.
+ */
+var ucs2decode = function (string) {
+ var output = [];
+ var counter = 0;
+ var length = string.length;
+ while (counter < length) {
+ var value = string.charCodeAt(counter++);
+ if (value >= 0xD800 && value <= 0xDBFF && counter < length) {
+ // It's a high surrogate, and there is a next character.
+ var extra = string.charCodeAt(counter++);
+ if ((extra & 0xFC00) == 0xDC00) { // Low surrogate.
+ output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);
+ } else {
+ // It's an unmatched surrogate; only append this code unit, in case the
+ // next code unit is the high surrogate of a surrogate pair.
+ output.push(value);
+ counter--;
+ }
+ } else {
+ output.push(value);
+ }
+ }
+ return output;
+};
+
+/**
+ * Converts a digit/integer into a basic code point.
+ */
+var digitToBasic = function (digit) {
+ // 0..25 map to ASCII a..z or A..Z
+ // 26..35 map to ASCII 0..9
+ return digit + 22 + 75 * (digit < 26);
+};
+
+/**
+ * Bias adaptation function as per section 3.4 of RFC 3492.
+ * https://tools.ietf.org/html/rfc3492#section-3.4
+ */
+var adapt = function (delta, numPoints, firstTime) {
+ var k = 0;
+ delta = firstTime ? floor(delta / damp) : delta >> 1;
+ delta += floor(delta / numPoints);
+ for (; delta > baseMinusTMin * tMax >> 1; k += base) {
+ delta = floor(delta / baseMinusTMin);
+ }
+ return floor(k + (baseMinusTMin + 1) * delta / (delta + skew));
+};
+
+/**
+ * Converts a string of Unicode symbols (e.g. a domain name label) to a
+ * Punycode string of ASCII-only symbols.
+ */
+// eslint-disable-next-line max-statements -- TODO
+var encode = function (input) {
+ var output = [];
+
+ // Convert the input in UCS-2 to an array of Unicode code points.
+ input = ucs2decode(input);
+
+ // Cache the length.
+ var inputLength = input.length;
+
+ // Initialize the state.
+ var n = initialN;
+ var delta = 0;
+ var bias = initialBias;
+ var i, currentValue;
+
+ // Handle the basic code points.
+ for (i = 0; i < input.length; i++) {
+ currentValue = input[i];
+ if (currentValue < 0x80) {
+ output.push(stringFromCharCode(currentValue));
+ }
+ }
+
+ var basicLength = output.length; // number of basic code points.
+ var handledCPCount = basicLength; // number of code points that have been handled;
+
+ // Finish the basic string with a delimiter unless it's empty.
+ if (basicLength) {
+ output.push(delimiter);
+ }
+
+ // Main encoding loop:
+ while (handledCPCount < inputLength) {
+ // All non-basic code points < n have been handled already. Find the next larger one:
+ var m = maxInt;
+ for (i = 0; i < input.length; i++) {
+ currentValue = input[i];
+ if (currentValue >= n && currentValue < m) {
+ m = currentValue;
+ }
+ }
+
+ // Increase `delta` enough to advance the decoder's state to , but guard against overflow.
+ var handledCPCountPlusOne = handledCPCount + 1;
+ if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {
+ throw RangeError(OVERFLOW_ERROR);
+ }
+
+ delta += (m - n) * handledCPCountPlusOne;
+ n = m;
+
+ for (i = 0; i < input.length; i++) {
+ currentValue = input[i];
+ if (currentValue < n && ++delta > maxInt) {
+ throw RangeError(OVERFLOW_ERROR);
+ }
+ if (currentValue == n) {
+ // Represent delta as a generalized variable-length integer.
+ var q = delta;
+ for (var k = base; /* no condition */; k += base) {
+ var t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);
+ if (q < t) break;
+ var qMinusT = q - t;
+ var baseMinusT = base - t;
+ output.push(stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT)));
+ q = floor(qMinusT / baseMinusT);
+ }
+
+ output.push(stringFromCharCode(digitToBasic(q)));
+ bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength);
+ delta = 0;
+ ++handledCPCount;
+ }
+ }
+
+ ++delta;
+ ++n;
+ }
+ return output.join('');
+};
+
+module.exports = function (input) {
+ var encoded = [];
+ var labels = input.toLowerCase().replace(regexSeparators, '\u002E').split('.');
+ var i, label;
+ for (i = 0; i < labels.length; i++) {
+ label = labels[i];
+ encoded.push(regexNonASCII.test(label) ? 'xn--' + encode(label) : label);
+ }
+ return encoded.join('.');
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/string-repeat.js":
+/*!*********************************************************!*\
+ !*** ./node_modules/core-js/internals/string-repeat.js ***!
+ \*********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var toInteger = __webpack_require__(/*! ../internals/to-integer */ "./node_modules/core-js/internals/to-integer.js");
+var toString = __webpack_require__(/*! ../internals/to-string */ "./node_modules/core-js/internals/to-string.js");
+var requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ "./node_modules/core-js/internals/require-object-coercible.js");
+
+// `String.prototype.repeat` method implementation
+// https://tc39.es/ecma262/#sec-string.prototype.repeat
+module.exports = function repeat(count) {
+ var str = toString(requireObjectCoercible(this));
+ var result = '';
+ var n = toInteger(count);
+ if (n < 0 || n == Infinity) throw RangeError('Wrong number of repetitions');
+ for (;n > 0; (n >>>= 1) && (str += str)) if (n & 1) result += str;
+ return result;
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/string-trim-forced.js":
+/*!**************************************************************!*\
+ !*** ./node_modules/core-js/internals/string-trim-forced.js ***!
+ \**************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var PROPER_FUNCTION_NAME = __webpack_require__(/*! ../internals/function-name */ "./node_modules/core-js/internals/function-name.js").PROPER;
+var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js");
+var whitespaces = __webpack_require__(/*! ../internals/whitespaces */ "./node_modules/core-js/internals/whitespaces.js");
+
+var non = '\u200B\u0085\u180E';
+
+// check that a method works with the correct list
+// of whitespaces and has a correct name
+module.exports = function (METHOD_NAME) {
+ return fails(function () {
+ return !!whitespaces[METHOD_NAME]()
+ || non[METHOD_NAME]() !== non
+ || (PROPER_FUNCTION_NAME && whitespaces[METHOD_NAME].name !== METHOD_NAME);
+ });
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/string-trim.js":
+/*!*******************************************************!*\
+ !*** ./node_modules/core-js/internals/string-trim.js ***!
+ \*******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ "./node_modules/core-js/internals/require-object-coercible.js");
+var toString = __webpack_require__(/*! ../internals/to-string */ "./node_modules/core-js/internals/to-string.js");
+var whitespaces = __webpack_require__(/*! ../internals/whitespaces */ "./node_modules/core-js/internals/whitespaces.js");
+
+var whitespace = '[' + whitespaces + ']';
+var ltrim = RegExp('^' + whitespace + whitespace + '*');
+var rtrim = RegExp(whitespace + whitespace + '*$');
+
+// `String.prototype.{ trim, trimStart, trimEnd, trimLeft, trimRight }` methods implementation
+var createMethod = function (TYPE) {
+ return function ($this) {
+ var string = toString(requireObjectCoercible($this));
+ if (TYPE & 1) string = string.replace(ltrim, '');
+ if (TYPE & 2) string = string.replace(rtrim, '');
+ return string;
+ };
+};
+
+module.exports = {
+ // `String.prototype.{ trimLeft, trimStart }` methods
+ // https://tc39.es/ecma262/#sec-string.prototype.trimstart
+ start: createMethod(1),
+ // `String.prototype.{ trimRight, trimEnd }` methods
+ // https://tc39.es/ecma262/#sec-string.prototype.trimend
+ end: createMethod(2),
+ // `String.prototype.trim` method
+ // https://tc39.es/ecma262/#sec-string.prototype.trim
+ trim: createMethod(3)
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/task.js":
+/*!************************************************!*\
+ !*** ./node_modules/core-js/internals/task.js ***!
+ \************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js");
+var isCallable = __webpack_require__(/*! ../internals/is-callable */ "./node_modules/core-js/internals/is-callable.js");
+var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js");
+var bind = __webpack_require__(/*! ../internals/function-bind-context */ "./node_modules/core-js/internals/function-bind-context.js");
+var html = __webpack_require__(/*! ../internals/html */ "./node_modules/core-js/internals/html.js");
+var createElement = __webpack_require__(/*! ../internals/document-create-element */ "./node_modules/core-js/internals/document-create-element.js");
+var IS_IOS = __webpack_require__(/*! ../internals/engine-is-ios */ "./node_modules/core-js/internals/engine-is-ios.js");
+var IS_NODE = __webpack_require__(/*! ../internals/engine-is-node */ "./node_modules/core-js/internals/engine-is-node.js");
+
+var set = global.setImmediate;
+var clear = global.clearImmediate;
+var process = global.process;
+var MessageChannel = global.MessageChannel;
+var Dispatch = global.Dispatch;
+var counter = 0;
+var queue = {};
+var ONREADYSTATECHANGE = 'onreadystatechange';
+var location, defer, channel, port;
+
+try {
+ // Deno throws a ReferenceError on `location` access without `--location` flag
+ location = global.location;
+} catch (error) { /* empty */ }
+
+var run = function (id) {
+ // eslint-disable-next-line no-prototype-builtins -- safe
+ if (queue.hasOwnProperty(id)) {
+ var fn = queue[id];
+ delete queue[id];
+ fn();
+ }
+};
+
+var runner = function (id) {
+ return function () {
+ run(id);
+ };
+};
+
+var listener = function (event) {
+ run(event.data);
+};
+
+var post = function (id) {
+ // old engines have not location.origin
+ global.postMessage(String(id), location.protocol + '//' + location.host);
+};
+
+// Node.js 0.9+ & IE10+ has setImmediate, otherwise:
+if (!set || !clear) {
+ set = function setImmediate(fn) {
+ var args = [];
+ var argumentsLength = arguments.length;
+ var i = 1;
+ while (argumentsLength > i) args.push(arguments[i++]);
+ queue[++counter] = function () {
+ // eslint-disable-next-line no-new-func -- spec requirement
+ (isCallable(fn) ? fn : Function(fn)).apply(undefined, args);
+ };
+ defer(counter);
+ return counter;
+ };
+ clear = function clearImmediate(id) {
+ delete queue[id];
+ };
+ // Node.js 0.8-
+ if (IS_NODE) {
+ defer = function (id) {
+ process.nextTick(runner(id));
+ };
+ // Sphere (JS game engine) Dispatch API
+ } else if (Dispatch && Dispatch.now) {
+ defer = function (id) {
+ Dispatch.now(runner(id));
+ };
+ // Browsers with MessageChannel, includes WebWorkers
+ // except iOS - https://github.com/zloirock/core-js/issues/624
+ } else if (MessageChannel && !IS_IOS) {
+ channel = new MessageChannel();
+ port = channel.port2;
+ channel.port1.onmessage = listener;
+ defer = bind(port.postMessage, port, 1);
+ // Browsers with postMessage, skip WebWorkers
+ // IE8 has postMessage, but it's sync & typeof its postMessage is 'object'
+ } else if (
+ global.addEventListener &&
+ isCallable(global.postMessage) &&
+ !global.importScripts &&
+ location && location.protocol !== 'file:' &&
+ !fails(post)
+ ) {
+ defer = post;
+ global.addEventListener('message', listener, false);
+ // IE8-
+ } else if (ONREADYSTATECHANGE in createElement('script')) {
+ defer = function (id) {
+ html.appendChild(createElement('script'))[ONREADYSTATECHANGE] = function () {
+ html.removeChild(this);
+ run(id);
+ };
+ };
+ // Rest old browsers
+ } else {
+ defer = function (id) {
+ setTimeout(runner(id), 0);
+ };
+ }
+}
+
+module.exports = {
+ set: set,
+ clear: clear
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/this-number-value.js":
+/*!*************************************************************!*\
+ !*** ./node_modules/core-js/internals/this-number-value.js ***!
+ \*************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+var valueOf = 1.0.valueOf;
+
+// `thisNumberValue` abstract operation
+// https://tc39.es/ecma262/#sec-thisnumbervalue
+module.exports = function (value) {
+ return valueOf.call(value);
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/to-absolute-index.js":
+/*!*************************************************************!*\
+ !*** ./node_modules/core-js/internals/to-absolute-index.js ***!
+ \*************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var toInteger = __webpack_require__(/*! ../internals/to-integer */ "./node_modules/core-js/internals/to-integer.js");
+
+var max = Math.max;
+var min = Math.min;
+
+// Helper for a popular repeating case of the spec:
+// Let integer be ? ToInteger(index).
+// If integer < 0, let result be max((length + integer), 0); else let result be min(integer, length).
+module.exports = function (index, length) {
+ var integer = toInteger(index);
+ return integer < 0 ? max(integer + length, 0) : min(integer, length);
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/to-index.js":
+/*!****************************************************!*\
+ !*** ./node_modules/core-js/internals/to-index.js ***!
+ \****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var toInteger = __webpack_require__(/*! ../internals/to-integer */ "./node_modules/core-js/internals/to-integer.js");
+var toLength = __webpack_require__(/*! ../internals/to-length */ "./node_modules/core-js/internals/to-length.js");
+
+// `ToIndex` abstract operation
+// https://tc39.es/ecma262/#sec-toindex
+module.exports = function (it) {
+ if (it === undefined) return 0;
+ var number = toInteger(it);
+ var length = toLength(number);
+ if (number !== length) throw RangeError('Wrong length or index');
+ return length;
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/to-indexed-object.js":
+/*!*************************************************************!*\
+ !*** ./node_modules/core-js/internals/to-indexed-object.js ***!
+ \*************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+// toObject with fallback for non-array-like ES3 strings
+var IndexedObject = __webpack_require__(/*! ../internals/indexed-object */ "./node_modules/core-js/internals/indexed-object.js");
+var requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ "./node_modules/core-js/internals/require-object-coercible.js");
+
+module.exports = function (it) {
+ return IndexedObject(requireObjectCoercible(it));
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/to-integer.js":
+/*!******************************************************!*\
+ !*** ./node_modules/core-js/internals/to-integer.js ***!
+ \******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+var ceil = Math.ceil;
+var floor = Math.floor;
+
+// `ToInteger` abstract operation
+// https://tc39.es/ecma262/#sec-tointeger
+module.exports = function (argument) {
+ return isNaN(argument = +argument) ? 0 : (argument > 0 ? floor : ceil)(argument);
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/to-length.js":
+/*!*****************************************************!*\
+ !*** ./node_modules/core-js/internals/to-length.js ***!
+ \*****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var toInteger = __webpack_require__(/*! ../internals/to-integer */ "./node_modules/core-js/internals/to-integer.js");
+
+var min = Math.min;
+
+// `ToLength` abstract operation
+// https://tc39.es/ecma262/#sec-tolength
+module.exports = function (argument) {
+ return argument > 0 ? min(toInteger(argument), 0x1FFFFFFFFFFFFF) : 0; // 2 ** 53 - 1 == 9007199254740991
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/to-object.js":
+/*!*****************************************************!*\
+ !*** ./node_modules/core-js/internals/to-object.js ***!
+ \*****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ "./node_modules/core-js/internals/require-object-coercible.js");
+
+// `ToObject` abstract operation
+// https://tc39.es/ecma262/#sec-toobject
+module.exports = function (argument) {
+ return Object(requireObjectCoercible(argument));
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/to-offset.js":
+/*!*****************************************************!*\
+ !*** ./node_modules/core-js/internals/to-offset.js ***!
+ \*****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var toPositiveInteger = __webpack_require__(/*! ../internals/to-positive-integer */ "./node_modules/core-js/internals/to-positive-integer.js");
+
+module.exports = function (it, BYTES) {
+ var offset = toPositiveInteger(it);
+ if (offset % BYTES) throw RangeError('Wrong offset');
+ return offset;
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/to-positive-integer.js":
+/*!***************************************************************!*\
+ !*** ./node_modules/core-js/internals/to-positive-integer.js ***!
+ \***************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var toInteger = __webpack_require__(/*! ../internals/to-integer */ "./node_modules/core-js/internals/to-integer.js");
+
+module.exports = function (it) {
+ var result = toInteger(it);
+ if (result < 0) throw RangeError("The argument can't be less than 0");
+ return result;
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/to-primitive.js":
+/*!********************************************************!*\
+ !*** ./node_modules/core-js/internals/to-primitive.js ***!
+ \********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/core-js/internals/is-object.js");
+var isSymbol = __webpack_require__(/*! ../internals/is-symbol */ "./node_modules/core-js/internals/is-symbol.js");
+var getMethod = __webpack_require__(/*! ../internals/get-method */ "./node_modules/core-js/internals/get-method.js");
+var ordinaryToPrimitive = __webpack_require__(/*! ../internals/ordinary-to-primitive */ "./node_modules/core-js/internals/ordinary-to-primitive.js");
+var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js");
+
+var TO_PRIMITIVE = wellKnownSymbol('toPrimitive');
+
+// `ToPrimitive` abstract operation
+// https://tc39.es/ecma262/#sec-toprimitive
+module.exports = function (input, pref) {
+ if (!isObject(input) || isSymbol(input)) return input;
+ var exoticToPrim = getMethod(input, TO_PRIMITIVE);
+ var result;
+ if (exoticToPrim) {
+ if (pref === undefined) pref = 'default';
+ result = exoticToPrim.call(input, pref);
+ if (!isObject(result) || isSymbol(result)) return result;
+ throw TypeError("Can't convert object to primitive value");
+ }
+ if (pref === undefined) pref = 'number';
+ return ordinaryToPrimitive(input, pref);
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/to-property-key.js":
+/*!***********************************************************!*\
+ !*** ./node_modules/core-js/internals/to-property-key.js ***!
+ \***********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var toPrimitive = __webpack_require__(/*! ../internals/to-primitive */ "./node_modules/core-js/internals/to-primitive.js");
+var isSymbol = __webpack_require__(/*! ../internals/is-symbol */ "./node_modules/core-js/internals/is-symbol.js");
+
+// `ToPropertyKey` abstract operation
+// https://tc39.es/ecma262/#sec-topropertykey
+module.exports = function (argument) {
+ var key = toPrimitive(argument, 'string');
+ return isSymbol(key) ? key : String(key);
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/to-string-tag-support.js":
+/*!*****************************************************************!*\
+ !*** ./node_modules/core-js/internals/to-string-tag-support.js ***!
+ \*****************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js");
+
+var TO_STRING_TAG = wellKnownSymbol('toStringTag');
+var test = {};
+
+test[TO_STRING_TAG] = 'z';
+
+module.exports = String(test) === '[object z]';
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/to-string.js":
+/*!*****************************************************!*\
+ !*** ./node_modules/core-js/internals/to-string.js ***!
+ \*****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var classof = __webpack_require__(/*! ../internals/classof */ "./node_modules/core-js/internals/classof.js");
+
+module.exports = function (argument) {
+ if (classof(argument) === 'Symbol') throw TypeError('Cannot convert a Symbol value to a string');
+ return String(argument);
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/try-to-string.js":
+/*!*********************************************************!*\
+ !*** ./node_modules/core-js/internals/try-to-string.js ***!
+ \*********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+module.exports = function (argument) {
+ try {
+ return String(argument);
+ } catch (error) {
+ return 'Object';
+ }
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/typed-array-constructor.js":
+/*!*******************************************************************!*\
+ !*** ./node_modules/core-js/internals/typed-array-constructor.js ***!
+ \*******************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js");
+var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/core-js/internals/descriptors.js");
+var TYPED_ARRAYS_CONSTRUCTORS_REQUIRES_WRAPPERS = __webpack_require__(/*! ../internals/typed-array-constructors-require-wrappers */ "./node_modules/core-js/internals/typed-array-constructors-require-wrappers.js");
+var ArrayBufferViewCore = __webpack_require__(/*! ../internals/array-buffer-view-core */ "./node_modules/core-js/internals/array-buffer-view-core.js");
+var ArrayBufferModule = __webpack_require__(/*! ../internals/array-buffer */ "./node_modules/core-js/internals/array-buffer.js");
+var anInstance = __webpack_require__(/*! ../internals/an-instance */ "./node_modules/core-js/internals/an-instance.js");
+var createPropertyDescriptor = __webpack_require__(/*! ../internals/create-property-descriptor */ "./node_modules/core-js/internals/create-property-descriptor.js");
+var createNonEnumerableProperty = __webpack_require__(/*! ../internals/create-non-enumerable-property */ "./node_modules/core-js/internals/create-non-enumerable-property.js");
+var isInteger = __webpack_require__(/*! ../internals/is-integer */ "./node_modules/core-js/internals/is-integer.js");
+var toLength = __webpack_require__(/*! ../internals/to-length */ "./node_modules/core-js/internals/to-length.js");
+var toIndex = __webpack_require__(/*! ../internals/to-index */ "./node_modules/core-js/internals/to-index.js");
+var toOffset = __webpack_require__(/*! ../internals/to-offset */ "./node_modules/core-js/internals/to-offset.js");
+var toPropertyKey = __webpack_require__(/*! ../internals/to-property-key */ "./node_modules/core-js/internals/to-property-key.js");
+var has = __webpack_require__(/*! ../internals/has */ "./node_modules/core-js/internals/has.js");
+var classof = __webpack_require__(/*! ../internals/classof */ "./node_modules/core-js/internals/classof.js");
+var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/core-js/internals/is-object.js");
+var isSymbol = __webpack_require__(/*! ../internals/is-symbol */ "./node_modules/core-js/internals/is-symbol.js");
+var create = __webpack_require__(/*! ../internals/object-create */ "./node_modules/core-js/internals/object-create.js");
+var setPrototypeOf = __webpack_require__(/*! ../internals/object-set-prototype-of */ "./node_modules/core-js/internals/object-set-prototype-of.js");
+var getOwnPropertyNames = __webpack_require__(/*! ../internals/object-get-own-property-names */ "./node_modules/core-js/internals/object-get-own-property-names.js").f;
+var typedArrayFrom = __webpack_require__(/*! ../internals/typed-array-from */ "./node_modules/core-js/internals/typed-array-from.js");
+var forEach = __webpack_require__(/*! ../internals/array-iteration */ "./node_modules/core-js/internals/array-iteration.js").forEach;
+var setSpecies = __webpack_require__(/*! ../internals/set-species */ "./node_modules/core-js/internals/set-species.js");
+var definePropertyModule = __webpack_require__(/*! ../internals/object-define-property */ "./node_modules/core-js/internals/object-define-property.js");
+var getOwnPropertyDescriptorModule = __webpack_require__(/*! ../internals/object-get-own-property-descriptor */ "./node_modules/core-js/internals/object-get-own-property-descriptor.js");
+var InternalStateModule = __webpack_require__(/*! ../internals/internal-state */ "./node_modules/core-js/internals/internal-state.js");
+var inheritIfRequired = __webpack_require__(/*! ../internals/inherit-if-required */ "./node_modules/core-js/internals/inherit-if-required.js");
+
+var getInternalState = InternalStateModule.get;
+var setInternalState = InternalStateModule.set;
+var nativeDefineProperty = definePropertyModule.f;
+var nativeGetOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f;
+var round = Math.round;
+var RangeError = global.RangeError;
+var ArrayBuffer = ArrayBufferModule.ArrayBuffer;
+var DataView = ArrayBufferModule.DataView;
+var NATIVE_ARRAY_BUFFER_VIEWS = ArrayBufferViewCore.NATIVE_ARRAY_BUFFER_VIEWS;
+var TYPED_ARRAY_CONSTRUCTOR = ArrayBufferViewCore.TYPED_ARRAY_CONSTRUCTOR;
+var TYPED_ARRAY_TAG = ArrayBufferViewCore.TYPED_ARRAY_TAG;
+var TypedArray = ArrayBufferViewCore.TypedArray;
+var TypedArrayPrototype = ArrayBufferViewCore.TypedArrayPrototype;
+var aTypedArrayConstructor = ArrayBufferViewCore.aTypedArrayConstructor;
+var isTypedArray = ArrayBufferViewCore.isTypedArray;
+var BYTES_PER_ELEMENT = 'BYTES_PER_ELEMENT';
+var WRONG_LENGTH = 'Wrong length';
+
+var fromList = function (C, list) {
+ var index = 0;
+ var length = list.length;
+ var result = new (aTypedArrayConstructor(C))(length);
+ while (length > index) result[index] = list[index++];
+ return result;
+};
+
+var addGetter = function (it, key) {
+ nativeDefineProperty(it, key, { get: function () {
+ return getInternalState(this)[key];
+ } });
+};
+
+var isArrayBuffer = function (it) {
+ var klass;
+ return it instanceof ArrayBuffer || (klass = classof(it)) == 'ArrayBuffer' || klass == 'SharedArrayBuffer';
+};
+
+var isTypedArrayIndex = function (target, key) {
+ return isTypedArray(target)
+ && !isSymbol(key)
+ && key in target
+ && isInteger(+key)
+ && key >= 0;
+};
+
+var wrappedGetOwnPropertyDescriptor = function getOwnPropertyDescriptor(target, key) {
+ key = toPropertyKey(key);
+ return isTypedArrayIndex(target, key)
+ ? createPropertyDescriptor(2, target[key])
+ : nativeGetOwnPropertyDescriptor(target, key);
+};
+
+var wrappedDefineProperty = function defineProperty(target, key, descriptor) {
+ key = toPropertyKey(key);
+ if (isTypedArrayIndex(target, key)
+ && isObject(descriptor)
+ && has(descriptor, 'value')
+ && !has(descriptor, 'get')
+ && !has(descriptor, 'set')
+ // TODO: add validation descriptor w/o calling accessors
+ && !descriptor.configurable
+ && (!has(descriptor, 'writable') || descriptor.writable)
+ && (!has(descriptor, 'enumerable') || descriptor.enumerable)
+ ) {
+ target[key] = descriptor.value;
+ return target;
+ } return nativeDefineProperty(target, key, descriptor);
+};
+
+if (DESCRIPTORS) {
+ if (!NATIVE_ARRAY_BUFFER_VIEWS) {
+ getOwnPropertyDescriptorModule.f = wrappedGetOwnPropertyDescriptor;
+ definePropertyModule.f = wrappedDefineProperty;
+ addGetter(TypedArrayPrototype, 'buffer');
+ addGetter(TypedArrayPrototype, 'byteOffset');
+ addGetter(TypedArrayPrototype, 'byteLength');
+ addGetter(TypedArrayPrototype, 'length');
+ }
+
+ $({ target: 'Object', stat: true, forced: !NATIVE_ARRAY_BUFFER_VIEWS }, {
+ getOwnPropertyDescriptor: wrappedGetOwnPropertyDescriptor,
+ defineProperty: wrappedDefineProperty
+ });
+
+ module.exports = function (TYPE, wrapper, CLAMPED) {
+ var BYTES = TYPE.match(/\d+$/)[0] / 8;
+ var CONSTRUCTOR_NAME = TYPE + (CLAMPED ? 'Clamped' : '') + 'Array';
+ var GETTER = 'get' + TYPE;
+ var SETTER = 'set' + TYPE;
+ var NativeTypedArrayConstructor = global[CONSTRUCTOR_NAME];
+ var TypedArrayConstructor = NativeTypedArrayConstructor;
+ var TypedArrayConstructorPrototype = TypedArrayConstructor && TypedArrayConstructor.prototype;
+ var exported = {};
+
+ var getter = function (that, index) {
+ var data = getInternalState(that);
+ return data.view[GETTER](index * BYTES + data.byteOffset, true);
+ };
+
+ var setter = function (that, index, value) {
+ var data = getInternalState(that);
+ if (CLAMPED) value = (value = round(value)) < 0 ? 0 : value > 0xFF ? 0xFF : value & 0xFF;
+ data.view[SETTER](index * BYTES + data.byteOffset, value, true);
+ };
+
+ var addElement = function (that, index) {
+ nativeDefineProperty(that, index, {
+ get: function () {
+ return getter(this, index);
+ },
+ set: function (value) {
+ return setter(this, index, value);
+ },
+ enumerable: true
+ });
+ };
+
+ if (!NATIVE_ARRAY_BUFFER_VIEWS) {
+ TypedArrayConstructor = wrapper(function (that, data, offset, $length) {
+ anInstance(that, TypedArrayConstructor, CONSTRUCTOR_NAME);
+ var index = 0;
+ var byteOffset = 0;
+ var buffer, byteLength, length;
+ if (!isObject(data)) {
+ length = toIndex(data);
+ byteLength = length * BYTES;
+ buffer = new ArrayBuffer(byteLength);
+ } else if (isArrayBuffer(data)) {
+ buffer = data;
+ byteOffset = toOffset(offset, BYTES);
+ var $len = data.byteLength;
+ if ($length === undefined) {
+ if ($len % BYTES) throw RangeError(WRONG_LENGTH);
+ byteLength = $len - byteOffset;
+ if (byteLength < 0) throw RangeError(WRONG_LENGTH);
+ } else {
+ byteLength = toLength($length) * BYTES;
+ if (byteLength + byteOffset > $len) throw RangeError(WRONG_LENGTH);
+ }
+ length = byteLength / BYTES;
+ } else if (isTypedArray(data)) {
+ return fromList(TypedArrayConstructor, data);
+ } else {
+ return typedArrayFrom.call(TypedArrayConstructor, data);
+ }
+ setInternalState(that, {
+ buffer: buffer,
+ byteOffset: byteOffset,
+ byteLength: byteLength,
+ length: length,
+ view: new DataView(buffer)
+ });
+ while (index < length) addElement(that, index++);
+ });
+
+ if (setPrototypeOf) setPrototypeOf(TypedArrayConstructor, TypedArray);
+ TypedArrayConstructorPrototype = TypedArrayConstructor.prototype = create(TypedArrayPrototype);
+ } else if (TYPED_ARRAYS_CONSTRUCTORS_REQUIRES_WRAPPERS) {
+ TypedArrayConstructor = wrapper(function (dummy, data, typedArrayOffset, $length) {
+ anInstance(dummy, TypedArrayConstructor, CONSTRUCTOR_NAME);
+ return inheritIfRequired(function () {
+ if (!isObject(data)) return new NativeTypedArrayConstructor(toIndex(data));
+ if (isArrayBuffer(data)) return $length !== undefined
+ ? new NativeTypedArrayConstructor(data, toOffset(typedArrayOffset, BYTES), $length)
+ : typedArrayOffset !== undefined
+ ? new NativeTypedArrayConstructor(data, toOffset(typedArrayOffset, BYTES))
+ : new NativeTypedArrayConstructor(data);
+ if (isTypedArray(data)) return fromList(TypedArrayConstructor, data);
+ return typedArrayFrom.call(TypedArrayConstructor, data);
+ }(), dummy, TypedArrayConstructor);
+ });
+
+ if (setPrototypeOf) setPrototypeOf(TypedArrayConstructor, TypedArray);
+ forEach(getOwnPropertyNames(NativeTypedArrayConstructor), function (key) {
+ if (!(key in TypedArrayConstructor)) {
+ createNonEnumerableProperty(TypedArrayConstructor, key, NativeTypedArrayConstructor[key]);
+ }
+ });
+ TypedArrayConstructor.prototype = TypedArrayConstructorPrototype;
+ }
+
+ if (TypedArrayConstructorPrototype.constructor !== TypedArrayConstructor) {
+ createNonEnumerableProperty(TypedArrayConstructorPrototype, 'constructor', TypedArrayConstructor);
+ }
+
+ createNonEnumerableProperty(TypedArrayConstructorPrototype, TYPED_ARRAY_CONSTRUCTOR, TypedArrayConstructor);
+
+ if (TYPED_ARRAY_TAG) {
+ createNonEnumerableProperty(TypedArrayConstructorPrototype, TYPED_ARRAY_TAG, CONSTRUCTOR_NAME);
+ }
+
+ exported[CONSTRUCTOR_NAME] = TypedArrayConstructor;
+
+ $({
+ global: true, forced: TypedArrayConstructor != NativeTypedArrayConstructor, sham: !NATIVE_ARRAY_BUFFER_VIEWS
+ }, exported);
+
+ if (!(BYTES_PER_ELEMENT in TypedArrayConstructor)) {
+ createNonEnumerableProperty(TypedArrayConstructor, BYTES_PER_ELEMENT, BYTES);
+ }
+
+ if (!(BYTES_PER_ELEMENT in TypedArrayConstructorPrototype)) {
+ createNonEnumerableProperty(TypedArrayConstructorPrototype, BYTES_PER_ELEMENT, BYTES);
+ }
+
+ setSpecies(CONSTRUCTOR_NAME);
+ };
+} else module.exports = function () { /* empty */ };
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/typed-array-constructors-require-wrappers.js":
+/*!*************************************************************************************!*\
+ !*** ./node_modules/core-js/internals/typed-array-constructors-require-wrappers.js ***!
+ \*************************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+/* eslint-disable no-new -- required for testing */
+var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js");
+var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js");
+var checkCorrectnessOfIteration = __webpack_require__(/*! ../internals/check-correctness-of-iteration */ "./node_modules/core-js/internals/check-correctness-of-iteration.js");
+var NATIVE_ARRAY_BUFFER_VIEWS = __webpack_require__(/*! ../internals/array-buffer-view-core */ "./node_modules/core-js/internals/array-buffer-view-core.js").NATIVE_ARRAY_BUFFER_VIEWS;
+
+var ArrayBuffer = global.ArrayBuffer;
+var Int8Array = global.Int8Array;
+
+module.exports = !NATIVE_ARRAY_BUFFER_VIEWS || !fails(function () {
+ Int8Array(1);
+}) || !fails(function () {
+ new Int8Array(-1);
+}) || !checkCorrectnessOfIteration(function (iterable) {
+ new Int8Array();
+ new Int8Array(null);
+ new Int8Array(1.5);
+ new Int8Array(iterable);
+}, true) || fails(function () {
+ // Safari (11+) bug - a reason why even Safari 13 should load a typed array polyfill
+ return new Int8Array(new ArrayBuffer(2), 1, undefined).length !== 1;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/typed-array-from-species-and-list.js":
+/*!*****************************************************************************!*\
+ !*** ./node_modules/core-js/internals/typed-array-from-species-and-list.js ***!
+ \*****************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var arrayFromConstructorAndList = __webpack_require__(/*! ../internals/array-from-constructor-and-list */ "./node_modules/core-js/internals/array-from-constructor-and-list.js");
+var typedArraySpeciesConstructor = __webpack_require__(/*! ../internals/typed-array-species-constructor */ "./node_modules/core-js/internals/typed-array-species-constructor.js");
+
+module.exports = function (instance, list) {
+ return arrayFromConstructorAndList(typedArraySpeciesConstructor(instance), list);
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/typed-array-from.js":
+/*!************************************************************!*\
+ !*** ./node_modules/core-js/internals/typed-array-from.js ***!
+ \************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var aConstructor = __webpack_require__(/*! ../internals/a-constructor */ "./node_modules/core-js/internals/a-constructor.js");
+var toObject = __webpack_require__(/*! ../internals/to-object */ "./node_modules/core-js/internals/to-object.js");
+var toLength = __webpack_require__(/*! ../internals/to-length */ "./node_modules/core-js/internals/to-length.js");
+var getIterator = __webpack_require__(/*! ../internals/get-iterator */ "./node_modules/core-js/internals/get-iterator.js");
+var getIteratorMethod = __webpack_require__(/*! ../internals/get-iterator-method */ "./node_modules/core-js/internals/get-iterator-method.js");
+var isArrayIteratorMethod = __webpack_require__(/*! ../internals/is-array-iterator-method */ "./node_modules/core-js/internals/is-array-iterator-method.js");
+var bind = __webpack_require__(/*! ../internals/function-bind-context */ "./node_modules/core-js/internals/function-bind-context.js");
+var aTypedArrayConstructor = __webpack_require__(/*! ../internals/array-buffer-view-core */ "./node_modules/core-js/internals/array-buffer-view-core.js").aTypedArrayConstructor;
+
+module.exports = function from(source /* , mapfn, thisArg */) {
+ var C = aConstructor(this);
+ var O = toObject(source);
+ var argumentsLength = arguments.length;
+ var mapfn = argumentsLength > 1 ? arguments[1] : undefined;
+ var mapping = mapfn !== undefined;
+ var iteratorMethod = getIteratorMethod(O);
+ var i, length, result, step, iterator, next;
+ if (iteratorMethod && !isArrayIteratorMethod(iteratorMethod)) {
+ iterator = getIterator(O, iteratorMethod);
+ next = iterator.next;
+ O = [];
+ while (!(step = next.call(iterator)).done) {
+ O.push(step.value);
+ }
+ }
+ if (mapping && argumentsLength > 2) {
+ mapfn = bind(mapfn, arguments[2], 2);
+ }
+ length = toLength(O.length);
+ result = new (aTypedArrayConstructor(C))(length);
+ for (i = 0; length > i; i++) {
+ result[i] = mapping ? mapfn(O[i], i) : O[i];
+ }
+ return result;
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/typed-array-species-constructor.js":
+/*!***************************************************************************!*\
+ !*** ./node_modules/core-js/internals/typed-array-species-constructor.js ***!
+ \***************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var ArrayBufferViewCore = __webpack_require__(/*! ../internals/array-buffer-view-core */ "./node_modules/core-js/internals/array-buffer-view-core.js");
+var speciesConstructor = __webpack_require__(/*! ../internals/species-constructor */ "./node_modules/core-js/internals/species-constructor.js");
+
+var TYPED_ARRAY_CONSTRUCTOR = ArrayBufferViewCore.TYPED_ARRAY_CONSTRUCTOR;
+var aTypedArrayConstructor = ArrayBufferViewCore.aTypedArrayConstructor;
+
+// a part of `TypedArraySpeciesCreate` abstract operation
+// https://tc39.es/ecma262/#typedarray-species-create
+module.exports = function (originalArray) {
+ return aTypedArrayConstructor(speciesConstructor(originalArray, originalArray[TYPED_ARRAY_CONSTRUCTOR]));
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/uid.js":
+/*!***********************************************!*\
+ !*** ./node_modules/core-js/internals/uid.js ***!
+ \***********************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+var id = 0;
+var postfix = Math.random();
+
+module.exports = function (key) {
+ return 'Symbol(' + String(key === undefined ? '' : key) + ')_' + (++id + postfix).toString(36);
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/use-symbol-as-uid.js":
+/*!*************************************************************!*\
+ !*** ./node_modules/core-js/internals/use-symbol-as-uid.js ***!
+ \*************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+/* eslint-disable es/no-symbol -- required for testing */
+var NATIVE_SYMBOL = __webpack_require__(/*! ../internals/native-symbol */ "./node_modules/core-js/internals/native-symbol.js");
+
+module.exports = NATIVE_SYMBOL
+ && !Symbol.sham
+ && typeof Symbol.iterator == 'symbol';
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/well-known-symbol-wrapped.js":
+/*!*********************************************************************!*\
+ !*** ./node_modules/core-js/internals/well-known-symbol-wrapped.js ***!
+ \*********************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js");
+
+exports.f = wellKnownSymbol;
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/well-known-symbol.js":
+/*!*************************************************************!*\
+ !*** ./node_modules/core-js/internals/well-known-symbol.js ***!
+ \*************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js");
+var shared = __webpack_require__(/*! ../internals/shared */ "./node_modules/core-js/internals/shared.js");
+var has = __webpack_require__(/*! ../internals/has */ "./node_modules/core-js/internals/has.js");
+var uid = __webpack_require__(/*! ../internals/uid */ "./node_modules/core-js/internals/uid.js");
+var NATIVE_SYMBOL = __webpack_require__(/*! ../internals/native-symbol */ "./node_modules/core-js/internals/native-symbol.js");
+var USE_SYMBOL_AS_UID = __webpack_require__(/*! ../internals/use-symbol-as-uid */ "./node_modules/core-js/internals/use-symbol-as-uid.js");
+
+var WellKnownSymbolsStore = shared('wks');
+var Symbol = global.Symbol;
+var createWellKnownSymbol = USE_SYMBOL_AS_UID ? Symbol : Symbol && Symbol.withoutSetter || uid;
+
+module.exports = function (name) {
+ if (!has(WellKnownSymbolsStore, name) || !(NATIVE_SYMBOL || typeof WellKnownSymbolsStore[name] == 'string')) {
+ if (NATIVE_SYMBOL && has(Symbol, name)) {
+ WellKnownSymbolsStore[name] = Symbol[name];
+ } else {
+ WellKnownSymbolsStore[name] = createWellKnownSymbol('Symbol.' + name);
+ }
+ } return WellKnownSymbolsStore[name];
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/internals/whitespaces.js":
+/*!*******************************************************!*\
+ !*** ./node_modules/core-js/internals/whitespaces.js ***!
+ \*******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+// a string of all valid unicode whitespaces
+module.exports = '\u0009\u000A\u000B\u000C\u000D\u0020\u00A0\u1680\u2000\u2001\u2002' +
+ '\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029\uFEFF';
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.aggregate-error.js":
+/*!************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.aggregate-error.js ***!
+ \************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var getPrototypeOf = __webpack_require__(/*! ../internals/object-get-prototype-of */ "./node_modules/core-js/internals/object-get-prototype-of.js");
+var setPrototypeOf = __webpack_require__(/*! ../internals/object-set-prototype-of */ "./node_modules/core-js/internals/object-set-prototype-of.js");
+var create = __webpack_require__(/*! ../internals/object-create */ "./node_modules/core-js/internals/object-create.js");
+var createNonEnumerableProperty = __webpack_require__(/*! ../internals/create-non-enumerable-property */ "./node_modules/core-js/internals/create-non-enumerable-property.js");
+var createPropertyDescriptor = __webpack_require__(/*! ../internals/create-property-descriptor */ "./node_modules/core-js/internals/create-property-descriptor.js");
+var installErrorCause = __webpack_require__(/*! ../internals/install-error-cause */ "./node_modules/core-js/internals/install-error-cause.js");
+var iterate = __webpack_require__(/*! ../internals/iterate */ "./node_modules/core-js/internals/iterate.js");
+var toString = __webpack_require__(/*! ../internals/to-string */ "./node_modules/core-js/internals/to-string.js");
+
+var $AggregateError = function AggregateError(errors, message /* , options */) {
+ var that = this;
+ if (!(that instanceof $AggregateError)) return new $AggregateError(errors, message);
+ if (setPrototypeOf) {
+ // eslint-disable-next-line unicorn/error-message -- expected
+ that = setPrototypeOf(new Error(undefined), getPrototypeOf(that));
+ }
+ if (message !== undefined) createNonEnumerableProperty(that, 'message', toString(message));
+ if (arguments.length > 2) installErrorCause(that, arguments[2]);
+ var errorsArray = [];
+ iterate(errors, errorsArray.push, { that: errorsArray });
+ createNonEnumerableProperty(that, 'errors', errorsArray);
+ return that;
+};
+
+$AggregateError.prototype = create(Error.prototype, {
+ constructor: createPropertyDescriptor(5, $AggregateError),
+ message: createPropertyDescriptor(5, ''),
+ name: createPropertyDescriptor(5, 'AggregateError')
+});
+
+// `AggregateError` constructor
+// https://tc39.es/ecma262/#sec-aggregate-error-constructor
+$({ global: true }, {
+ AggregateError: $AggregateError
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.array-buffer.constructor.js":
+/*!*********************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.array-buffer.constructor.js ***!
+ \*********************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js");
+var arrayBufferModule = __webpack_require__(/*! ../internals/array-buffer */ "./node_modules/core-js/internals/array-buffer.js");
+var setSpecies = __webpack_require__(/*! ../internals/set-species */ "./node_modules/core-js/internals/set-species.js");
+
+var ARRAY_BUFFER = 'ArrayBuffer';
+var ArrayBuffer = arrayBufferModule[ARRAY_BUFFER];
+var NativeArrayBuffer = global[ARRAY_BUFFER];
+
+// `ArrayBuffer` constructor
+// https://tc39.es/ecma262/#sec-arraybuffer-constructor
+$({ global: true, forced: NativeArrayBuffer !== ArrayBuffer }, {
+ ArrayBuffer: ArrayBuffer
+});
+
+setSpecies(ARRAY_BUFFER);
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.array-buffer.is-view.js":
+/*!*****************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.array-buffer.is-view.js ***!
+ \*****************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var ArrayBufferViewCore = __webpack_require__(/*! ../internals/array-buffer-view-core */ "./node_modules/core-js/internals/array-buffer-view-core.js");
+
+var NATIVE_ARRAY_BUFFER_VIEWS = ArrayBufferViewCore.NATIVE_ARRAY_BUFFER_VIEWS;
+
+// `ArrayBuffer.isView` method
+// https://tc39.es/ecma262/#sec-arraybuffer.isview
+$({ target: 'ArrayBuffer', stat: true, forced: !NATIVE_ARRAY_BUFFER_VIEWS }, {
+ isView: ArrayBufferViewCore.isView
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.array-buffer.slice.js":
+/*!***************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.array-buffer.slice.js ***!
+ \***************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js");
+var ArrayBufferModule = __webpack_require__(/*! ../internals/array-buffer */ "./node_modules/core-js/internals/array-buffer.js");
+var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/core-js/internals/an-object.js");
+var toAbsoluteIndex = __webpack_require__(/*! ../internals/to-absolute-index */ "./node_modules/core-js/internals/to-absolute-index.js");
+var toLength = __webpack_require__(/*! ../internals/to-length */ "./node_modules/core-js/internals/to-length.js");
+var speciesConstructor = __webpack_require__(/*! ../internals/species-constructor */ "./node_modules/core-js/internals/species-constructor.js");
+
+var ArrayBuffer = ArrayBufferModule.ArrayBuffer;
+var DataView = ArrayBufferModule.DataView;
+var nativeArrayBufferSlice = ArrayBuffer.prototype.slice;
+
+var INCORRECT_SLICE = fails(function () {
+ return !new ArrayBuffer(2).slice(1, undefined).byteLength;
+});
+
+// `ArrayBuffer.prototype.slice` method
+// https://tc39.es/ecma262/#sec-arraybuffer.prototype.slice
+$({ target: 'ArrayBuffer', proto: true, unsafe: true, forced: INCORRECT_SLICE }, {
+ slice: function slice(start, end) {
+ if (nativeArrayBufferSlice !== undefined && end === undefined) {
+ return nativeArrayBufferSlice.call(anObject(this), start); // FF fix
+ }
+ var length = anObject(this).byteLength;
+ var first = toAbsoluteIndex(start, length);
+ var fin = toAbsoluteIndex(end === undefined ? length : end, length);
+ var result = new (speciesConstructor(this, ArrayBuffer))(toLength(fin - first));
+ var viewSource = new DataView(this);
+ var viewTarget = new DataView(result);
+ var index = 0;
+ while (first < fin) {
+ viewTarget.setUint8(index++, viewSource.getUint8(first++));
+ } return result;
+ }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.array.at.js":
+/*!*****************************************************!*\
+ !*** ./node_modules/core-js/modules/es.array.at.js ***!
+ \*****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var toObject = __webpack_require__(/*! ../internals/to-object */ "./node_modules/core-js/internals/to-object.js");
+var toLength = __webpack_require__(/*! ../internals/to-length */ "./node_modules/core-js/internals/to-length.js");
+var toInteger = __webpack_require__(/*! ../internals/to-integer */ "./node_modules/core-js/internals/to-integer.js");
+var addToUnscopables = __webpack_require__(/*! ../internals/add-to-unscopables */ "./node_modules/core-js/internals/add-to-unscopables.js");
+
+// `Array.prototype.at` method
+// https://github.com/tc39/proposal-relative-indexing-method
+$({ target: 'Array', proto: true }, {
+ at: function at(index) {
+ var O = toObject(this);
+ var len = toLength(O.length);
+ var relativeIndex = toInteger(index);
+ var k = relativeIndex >= 0 ? relativeIndex : len + relativeIndex;
+ return (k < 0 || k >= len) ? undefined : O[k];
+ }
+});
+
+addToUnscopables('at');
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.array.concat.js":
+/*!*********************************************************!*\
+ !*** ./node_modules/core-js/modules/es.array.concat.js ***!
+ \*********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js");
+var isArray = __webpack_require__(/*! ../internals/is-array */ "./node_modules/core-js/internals/is-array.js");
+var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/core-js/internals/is-object.js");
+var toObject = __webpack_require__(/*! ../internals/to-object */ "./node_modules/core-js/internals/to-object.js");
+var toLength = __webpack_require__(/*! ../internals/to-length */ "./node_modules/core-js/internals/to-length.js");
+var createProperty = __webpack_require__(/*! ../internals/create-property */ "./node_modules/core-js/internals/create-property.js");
+var arraySpeciesCreate = __webpack_require__(/*! ../internals/array-species-create */ "./node_modules/core-js/internals/array-species-create.js");
+var arrayMethodHasSpeciesSupport = __webpack_require__(/*! ../internals/array-method-has-species-support */ "./node_modules/core-js/internals/array-method-has-species-support.js");
+var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js");
+var V8_VERSION = __webpack_require__(/*! ../internals/engine-v8-version */ "./node_modules/core-js/internals/engine-v8-version.js");
+
+var IS_CONCAT_SPREADABLE = wellKnownSymbol('isConcatSpreadable');
+var MAX_SAFE_INTEGER = 0x1FFFFFFFFFFFFF;
+var MAXIMUM_ALLOWED_INDEX_EXCEEDED = 'Maximum allowed index exceeded';
+
+// We can't use this feature detection in V8 since it causes
+// deoptimization and serious performance degradation
+// https://github.com/zloirock/core-js/issues/679
+var IS_CONCAT_SPREADABLE_SUPPORT = V8_VERSION >= 51 || !fails(function () {
+ var array = [];
+ array[IS_CONCAT_SPREADABLE] = false;
+ return array.concat()[0] !== array;
+});
+
+var SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('concat');
+
+var isConcatSpreadable = function (O) {
+ if (!isObject(O)) return false;
+ var spreadable = O[IS_CONCAT_SPREADABLE];
+ return spreadable !== undefined ? !!spreadable : isArray(O);
+};
+
+var FORCED = !IS_CONCAT_SPREADABLE_SUPPORT || !SPECIES_SUPPORT;
+
+// `Array.prototype.concat` method
+// https://tc39.es/ecma262/#sec-array.prototype.concat
+// with adding support of @@isConcatSpreadable and @@species
+$({ target: 'Array', proto: true, forced: FORCED }, {
+ // eslint-disable-next-line no-unused-vars -- required for `.length`
+ concat: function concat(arg) {
+ var O = toObject(this);
+ var A = arraySpeciesCreate(O, 0);
+ var n = 0;
+ var i, k, length, len, E;
+ for (i = -1, length = arguments.length; i < length; i++) {
+ E = i === -1 ? O : arguments[i];
+ if (isConcatSpreadable(E)) {
+ len = toLength(E.length);
+ if (n + len > MAX_SAFE_INTEGER) throw TypeError(MAXIMUM_ALLOWED_INDEX_EXCEEDED);
+ for (k = 0; k < len; k++, n++) if (k in E) createProperty(A, n, E[k]);
+ } else {
+ if (n >= MAX_SAFE_INTEGER) throw TypeError(MAXIMUM_ALLOWED_INDEX_EXCEEDED);
+ createProperty(A, n++, E);
+ }
+ }
+ A.length = n;
+ return A;
+ }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.array.copy-within.js":
+/*!**************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.array.copy-within.js ***!
+ \**************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var copyWithin = __webpack_require__(/*! ../internals/array-copy-within */ "./node_modules/core-js/internals/array-copy-within.js");
+var addToUnscopables = __webpack_require__(/*! ../internals/add-to-unscopables */ "./node_modules/core-js/internals/add-to-unscopables.js");
+
+// `Array.prototype.copyWithin` method
+// https://tc39.es/ecma262/#sec-array.prototype.copywithin
+$({ target: 'Array', proto: true }, {
+ copyWithin: copyWithin
+});
+
+// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables
+addToUnscopables('copyWithin');
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.array.every.js":
+/*!********************************************************!*\
+ !*** ./node_modules/core-js/modules/es.array.every.js ***!
+ \********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var $every = __webpack_require__(/*! ../internals/array-iteration */ "./node_modules/core-js/internals/array-iteration.js").every;
+var arrayMethodIsStrict = __webpack_require__(/*! ../internals/array-method-is-strict */ "./node_modules/core-js/internals/array-method-is-strict.js");
+
+var STRICT_METHOD = arrayMethodIsStrict('every');
+
+// `Array.prototype.every` method
+// https://tc39.es/ecma262/#sec-array.prototype.every
+$({ target: 'Array', proto: true, forced: !STRICT_METHOD }, {
+ every: function every(callbackfn /* , thisArg */) {
+ return $every(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);
+ }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.array.fill.js":
+/*!*******************************************************!*\
+ !*** ./node_modules/core-js/modules/es.array.fill.js ***!
+ \*******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var fill = __webpack_require__(/*! ../internals/array-fill */ "./node_modules/core-js/internals/array-fill.js");
+var addToUnscopables = __webpack_require__(/*! ../internals/add-to-unscopables */ "./node_modules/core-js/internals/add-to-unscopables.js");
+
+// `Array.prototype.fill` method
+// https://tc39.es/ecma262/#sec-array.prototype.fill
+$({ target: 'Array', proto: true }, {
+ fill: fill
+});
+
+// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables
+addToUnscopables('fill');
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.array.filter.js":
+/*!*********************************************************!*\
+ !*** ./node_modules/core-js/modules/es.array.filter.js ***!
+ \*********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var $filter = __webpack_require__(/*! ../internals/array-iteration */ "./node_modules/core-js/internals/array-iteration.js").filter;
+var arrayMethodHasSpeciesSupport = __webpack_require__(/*! ../internals/array-method-has-species-support */ "./node_modules/core-js/internals/array-method-has-species-support.js");
+
+var HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('filter');
+
+// `Array.prototype.filter` method
+// https://tc39.es/ecma262/#sec-array.prototype.filter
+// with adding support of @@species
+$({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT }, {
+ filter: function filter(callbackfn /* , thisArg */) {
+ return $filter(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);
+ }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.array.find-index.js":
+/*!*************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.array.find-index.js ***!
+ \*************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var $findIndex = __webpack_require__(/*! ../internals/array-iteration */ "./node_modules/core-js/internals/array-iteration.js").findIndex;
+var addToUnscopables = __webpack_require__(/*! ../internals/add-to-unscopables */ "./node_modules/core-js/internals/add-to-unscopables.js");
+
+var FIND_INDEX = 'findIndex';
+var SKIPS_HOLES = true;
+
+// Shouldn't skip holes
+if (FIND_INDEX in []) Array(1)[FIND_INDEX](function () { SKIPS_HOLES = false; });
+
+// `Array.prototype.findIndex` method
+// https://tc39.es/ecma262/#sec-array.prototype.findindex
+$({ target: 'Array', proto: true, forced: SKIPS_HOLES }, {
+ findIndex: function findIndex(callbackfn /* , that = undefined */) {
+ return $findIndex(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);
+ }
+});
+
+// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables
+addToUnscopables(FIND_INDEX);
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.array.find.js":
+/*!*******************************************************!*\
+ !*** ./node_modules/core-js/modules/es.array.find.js ***!
+ \*******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var $find = __webpack_require__(/*! ../internals/array-iteration */ "./node_modules/core-js/internals/array-iteration.js").find;
+var addToUnscopables = __webpack_require__(/*! ../internals/add-to-unscopables */ "./node_modules/core-js/internals/add-to-unscopables.js");
+
+var FIND = 'find';
+var SKIPS_HOLES = true;
+
+// Shouldn't skip holes
+if (FIND in []) Array(1)[FIND](function () { SKIPS_HOLES = false; });
+
+// `Array.prototype.find` method
+// https://tc39.es/ecma262/#sec-array.prototype.find
+$({ target: 'Array', proto: true, forced: SKIPS_HOLES }, {
+ find: function find(callbackfn /* , that = undefined */) {
+ return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);
+ }
+});
+
+// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables
+addToUnscopables(FIND);
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.array.flat-map.js":
+/*!***********************************************************!*\
+ !*** ./node_modules/core-js/modules/es.array.flat-map.js ***!
+ \***********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var flattenIntoArray = __webpack_require__(/*! ../internals/flatten-into-array */ "./node_modules/core-js/internals/flatten-into-array.js");
+var aCallable = __webpack_require__(/*! ../internals/a-callable */ "./node_modules/core-js/internals/a-callable.js");
+var toObject = __webpack_require__(/*! ../internals/to-object */ "./node_modules/core-js/internals/to-object.js");
+var toLength = __webpack_require__(/*! ../internals/to-length */ "./node_modules/core-js/internals/to-length.js");
+var arraySpeciesCreate = __webpack_require__(/*! ../internals/array-species-create */ "./node_modules/core-js/internals/array-species-create.js");
+
+// `Array.prototype.flatMap` method
+// https://tc39.es/ecma262/#sec-array.prototype.flatmap
+$({ target: 'Array', proto: true }, {
+ flatMap: function flatMap(callbackfn /* , thisArg */) {
+ var O = toObject(this);
+ var sourceLen = toLength(O.length);
+ var A;
+ aCallable(callbackfn);
+ A = arraySpeciesCreate(O, 0);
+ A.length = flattenIntoArray(A, O, O, sourceLen, 0, 1, callbackfn, arguments.length > 1 ? arguments[1] : undefined);
+ return A;
+ }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.array.flat.js":
+/*!*******************************************************!*\
+ !*** ./node_modules/core-js/modules/es.array.flat.js ***!
+ \*******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var flattenIntoArray = __webpack_require__(/*! ../internals/flatten-into-array */ "./node_modules/core-js/internals/flatten-into-array.js");
+var toObject = __webpack_require__(/*! ../internals/to-object */ "./node_modules/core-js/internals/to-object.js");
+var toLength = __webpack_require__(/*! ../internals/to-length */ "./node_modules/core-js/internals/to-length.js");
+var toInteger = __webpack_require__(/*! ../internals/to-integer */ "./node_modules/core-js/internals/to-integer.js");
+var arraySpeciesCreate = __webpack_require__(/*! ../internals/array-species-create */ "./node_modules/core-js/internals/array-species-create.js");
+
+// `Array.prototype.flat` method
+// https://tc39.es/ecma262/#sec-array.prototype.flat
+$({ target: 'Array', proto: true }, {
+ flat: function flat(/* depthArg = 1 */) {
+ var depthArg = arguments.length ? arguments[0] : undefined;
+ var O = toObject(this);
+ var sourceLen = toLength(O.length);
+ var A = arraySpeciesCreate(O, 0);
+ A.length = flattenIntoArray(A, O, O, sourceLen, 0, depthArg === undefined ? 1 : toInteger(depthArg));
+ return A;
+ }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.array.for-each.js":
+/*!***********************************************************!*\
+ !*** ./node_modules/core-js/modules/es.array.for-each.js ***!
+ \***********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var forEach = __webpack_require__(/*! ../internals/array-for-each */ "./node_modules/core-js/internals/array-for-each.js");
+
+// `Array.prototype.forEach` method
+// https://tc39.es/ecma262/#sec-array.prototype.foreach
+// eslint-disable-next-line es/no-array-prototype-foreach -- safe
+$({ target: 'Array', proto: true, forced: [].forEach != forEach }, {
+ forEach: forEach
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.array.from.js":
+/*!*******************************************************!*\
+ !*** ./node_modules/core-js/modules/es.array.from.js ***!
+ \*******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var from = __webpack_require__(/*! ../internals/array-from */ "./node_modules/core-js/internals/array-from.js");
+var checkCorrectnessOfIteration = __webpack_require__(/*! ../internals/check-correctness-of-iteration */ "./node_modules/core-js/internals/check-correctness-of-iteration.js");
+
+var INCORRECT_ITERATION = !checkCorrectnessOfIteration(function (iterable) {
+ // eslint-disable-next-line es/no-array-from -- required for testing
+ Array.from(iterable);
+});
+
+// `Array.from` method
+// https://tc39.es/ecma262/#sec-array.from
+$({ target: 'Array', stat: true, forced: INCORRECT_ITERATION }, {
+ from: from
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.array.includes.js":
+/*!***********************************************************!*\
+ !*** ./node_modules/core-js/modules/es.array.includes.js ***!
+ \***********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var $includes = __webpack_require__(/*! ../internals/array-includes */ "./node_modules/core-js/internals/array-includes.js").includes;
+var addToUnscopables = __webpack_require__(/*! ../internals/add-to-unscopables */ "./node_modules/core-js/internals/add-to-unscopables.js");
+
+// `Array.prototype.includes` method
+// https://tc39.es/ecma262/#sec-array.prototype.includes
+$({ target: 'Array', proto: true }, {
+ includes: function includes(el /* , fromIndex = 0 */) {
+ return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined);
+ }
+});
+
+// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables
+addToUnscopables('includes');
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.array.index-of.js":
+/*!***********************************************************!*\
+ !*** ./node_modules/core-js/modules/es.array.index-of.js ***!
+ \***********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+/* eslint-disable es/no-array-prototype-indexof -- required for testing */
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var $indexOf = __webpack_require__(/*! ../internals/array-includes */ "./node_modules/core-js/internals/array-includes.js").indexOf;
+var arrayMethodIsStrict = __webpack_require__(/*! ../internals/array-method-is-strict */ "./node_modules/core-js/internals/array-method-is-strict.js");
+
+var nativeIndexOf = [].indexOf;
+
+var NEGATIVE_ZERO = !!nativeIndexOf && 1 / [1].indexOf(1, -0) < 0;
+var STRICT_METHOD = arrayMethodIsStrict('indexOf');
+
+// `Array.prototype.indexOf` method
+// https://tc39.es/ecma262/#sec-array.prototype.indexof
+$({ target: 'Array', proto: true, forced: NEGATIVE_ZERO || !STRICT_METHOD }, {
+ indexOf: function indexOf(searchElement /* , fromIndex = 0 */) {
+ return NEGATIVE_ZERO
+ // convert -0 to +0
+ ? nativeIndexOf.apply(this, arguments) || 0
+ : $indexOf(this, searchElement, arguments.length > 1 ? arguments[1] : undefined);
+ }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.array.is-array.js":
+/*!***********************************************************!*\
+ !*** ./node_modules/core-js/modules/es.array.is-array.js ***!
+ \***********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var isArray = __webpack_require__(/*! ../internals/is-array */ "./node_modules/core-js/internals/is-array.js");
+
+// `Array.isArray` method
+// https://tc39.es/ecma262/#sec-array.isarray
+$({ target: 'Array', stat: true }, {
+ isArray: isArray
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.array.iterator.js":
+/*!***********************************************************!*\
+ !*** ./node_modules/core-js/modules/es.array.iterator.js ***!
+ \***********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ "./node_modules/core-js/internals/to-indexed-object.js");
+var addToUnscopables = __webpack_require__(/*! ../internals/add-to-unscopables */ "./node_modules/core-js/internals/add-to-unscopables.js");
+var Iterators = __webpack_require__(/*! ../internals/iterators */ "./node_modules/core-js/internals/iterators.js");
+var InternalStateModule = __webpack_require__(/*! ../internals/internal-state */ "./node_modules/core-js/internals/internal-state.js");
+var defineIterator = __webpack_require__(/*! ../internals/define-iterator */ "./node_modules/core-js/internals/define-iterator.js");
+
+var ARRAY_ITERATOR = 'Array Iterator';
+var setInternalState = InternalStateModule.set;
+var getInternalState = InternalStateModule.getterFor(ARRAY_ITERATOR);
+
+// `Array.prototype.entries` method
+// https://tc39.es/ecma262/#sec-array.prototype.entries
+// `Array.prototype.keys` method
+// https://tc39.es/ecma262/#sec-array.prototype.keys
+// `Array.prototype.values` method
+// https://tc39.es/ecma262/#sec-array.prototype.values
+// `Array.prototype[@@iterator]` method
+// https://tc39.es/ecma262/#sec-array.prototype-@@iterator
+// `CreateArrayIterator` internal method
+// https://tc39.es/ecma262/#sec-createarrayiterator
+module.exports = defineIterator(Array, 'Array', function (iterated, kind) {
+ setInternalState(this, {
+ type: ARRAY_ITERATOR,
+ target: toIndexedObject(iterated), // target
+ index: 0, // next index
+ kind: kind // kind
+ });
+// `%ArrayIteratorPrototype%.next` method
+// https://tc39.es/ecma262/#sec-%arrayiteratorprototype%.next
+}, function () {
+ var state = getInternalState(this);
+ var target = state.target;
+ var kind = state.kind;
+ var index = state.index++;
+ if (!target || index >= target.length) {
+ state.target = undefined;
+ return { value: undefined, done: true };
+ }
+ if (kind == 'keys') return { value: index, done: false };
+ if (kind == 'values') return { value: target[index], done: false };
+ return { value: [index, target[index]], done: false };
+}, 'values');
+
+// argumentsList[@@iterator] is %ArrayProto_values%
+// https://tc39.es/ecma262/#sec-createunmappedargumentsobject
+// https://tc39.es/ecma262/#sec-createmappedargumentsobject
+Iterators.Arguments = Iterators.Array;
+
+// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables
+addToUnscopables('keys');
+addToUnscopables('values');
+addToUnscopables('entries');
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.array.join.js":
+/*!*******************************************************!*\
+ !*** ./node_modules/core-js/modules/es.array.join.js ***!
+ \*******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var IndexedObject = __webpack_require__(/*! ../internals/indexed-object */ "./node_modules/core-js/internals/indexed-object.js");
+var toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ "./node_modules/core-js/internals/to-indexed-object.js");
+var arrayMethodIsStrict = __webpack_require__(/*! ../internals/array-method-is-strict */ "./node_modules/core-js/internals/array-method-is-strict.js");
+
+var nativeJoin = [].join;
+
+var ES3_STRINGS = IndexedObject != Object;
+var STRICT_METHOD = arrayMethodIsStrict('join', ',');
+
+// `Array.prototype.join` method
+// https://tc39.es/ecma262/#sec-array.prototype.join
+$({ target: 'Array', proto: true, forced: ES3_STRINGS || !STRICT_METHOD }, {
+ join: function join(separator) {
+ return nativeJoin.call(toIndexedObject(this), separator === undefined ? ',' : separator);
+ }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.array.last-index-of.js":
+/*!****************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.array.last-index-of.js ***!
+ \****************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var lastIndexOf = __webpack_require__(/*! ../internals/array-last-index-of */ "./node_modules/core-js/internals/array-last-index-of.js");
+
+// `Array.prototype.lastIndexOf` method
+// https://tc39.es/ecma262/#sec-array.prototype.lastindexof
+// eslint-disable-next-line es/no-array-prototype-lastindexof -- required for testing
+$({ target: 'Array', proto: true, forced: lastIndexOf !== [].lastIndexOf }, {
+ lastIndexOf: lastIndexOf
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.array.map.js":
+/*!******************************************************!*\
+ !*** ./node_modules/core-js/modules/es.array.map.js ***!
+ \******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var $map = __webpack_require__(/*! ../internals/array-iteration */ "./node_modules/core-js/internals/array-iteration.js").map;
+var arrayMethodHasSpeciesSupport = __webpack_require__(/*! ../internals/array-method-has-species-support */ "./node_modules/core-js/internals/array-method-has-species-support.js");
+
+var HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('map');
+
+// `Array.prototype.map` method
+// https://tc39.es/ecma262/#sec-array.prototype.map
+// with adding support of @@species
+$({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT }, {
+ map: function map(callbackfn /* , thisArg */) {
+ return $map(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);
+ }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.array.of.js":
+/*!*****************************************************!*\
+ !*** ./node_modules/core-js/modules/es.array.of.js ***!
+ \*****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js");
+var isConstructor = __webpack_require__(/*! ../internals/is-constructor */ "./node_modules/core-js/internals/is-constructor.js");
+var createProperty = __webpack_require__(/*! ../internals/create-property */ "./node_modules/core-js/internals/create-property.js");
+
+var ISNT_GENERIC = fails(function () {
+ function F() { /* empty */ }
+ // eslint-disable-next-line es/no-array-of -- required for testing
+ return !(Array.of.call(F) instanceof F);
+});
+
+// `Array.of` method
+// https://tc39.es/ecma262/#sec-array.of
+// WebKit Array.of isn't generic
+$({ target: 'Array', stat: true, forced: ISNT_GENERIC }, {
+ of: function of(/* ...args */) {
+ var index = 0;
+ var argumentsLength = arguments.length;
+ var result = new (isConstructor(this) ? this : Array)(argumentsLength);
+ while (argumentsLength > index) createProperty(result, index, arguments[index++]);
+ result.length = argumentsLength;
+ return result;
+ }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.array.reduce-right.js":
+/*!***************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.array.reduce-right.js ***!
+ \***************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var $reduceRight = __webpack_require__(/*! ../internals/array-reduce */ "./node_modules/core-js/internals/array-reduce.js").right;
+var arrayMethodIsStrict = __webpack_require__(/*! ../internals/array-method-is-strict */ "./node_modules/core-js/internals/array-method-is-strict.js");
+var CHROME_VERSION = __webpack_require__(/*! ../internals/engine-v8-version */ "./node_modules/core-js/internals/engine-v8-version.js");
+var IS_NODE = __webpack_require__(/*! ../internals/engine-is-node */ "./node_modules/core-js/internals/engine-is-node.js");
+
+var STRICT_METHOD = arrayMethodIsStrict('reduceRight');
+// Chrome 80-82 has a critical bug
+// https://bugs.chromium.org/p/chromium/issues/detail?id=1049982
+var CHROME_BUG = !IS_NODE && CHROME_VERSION > 79 && CHROME_VERSION < 83;
+
+// `Array.prototype.reduceRight` method
+// https://tc39.es/ecma262/#sec-array.prototype.reduceright
+$({ target: 'Array', proto: true, forced: !STRICT_METHOD || CHROME_BUG }, {
+ reduceRight: function reduceRight(callbackfn /* , initialValue */) {
+ return $reduceRight(this, callbackfn, arguments.length, arguments.length > 1 ? arguments[1] : undefined);
+ }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.array.reduce.js":
+/*!*********************************************************!*\
+ !*** ./node_modules/core-js/modules/es.array.reduce.js ***!
+ \*********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var $reduce = __webpack_require__(/*! ../internals/array-reduce */ "./node_modules/core-js/internals/array-reduce.js").left;
+var arrayMethodIsStrict = __webpack_require__(/*! ../internals/array-method-is-strict */ "./node_modules/core-js/internals/array-method-is-strict.js");
+var CHROME_VERSION = __webpack_require__(/*! ../internals/engine-v8-version */ "./node_modules/core-js/internals/engine-v8-version.js");
+var IS_NODE = __webpack_require__(/*! ../internals/engine-is-node */ "./node_modules/core-js/internals/engine-is-node.js");
+
+var STRICT_METHOD = arrayMethodIsStrict('reduce');
+// Chrome 80-82 has a critical bug
+// https://bugs.chromium.org/p/chromium/issues/detail?id=1049982
+var CHROME_BUG = !IS_NODE && CHROME_VERSION > 79 && CHROME_VERSION < 83;
+
+// `Array.prototype.reduce` method
+// https://tc39.es/ecma262/#sec-array.prototype.reduce
+$({ target: 'Array', proto: true, forced: !STRICT_METHOD || CHROME_BUG }, {
+ reduce: function reduce(callbackfn /* , initialValue */) {
+ return $reduce(this, callbackfn, arguments.length, arguments.length > 1 ? arguments[1] : undefined);
+ }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.array.reverse.js":
+/*!**********************************************************!*\
+ !*** ./node_modules/core-js/modules/es.array.reverse.js ***!
+ \**********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var isArray = __webpack_require__(/*! ../internals/is-array */ "./node_modules/core-js/internals/is-array.js");
+
+var nativeReverse = [].reverse;
+var test = [1, 2];
+
+// `Array.prototype.reverse` method
+// https://tc39.es/ecma262/#sec-array.prototype.reverse
+// fix for Safari 12.0 bug
+// https://bugs.webkit.org/show_bug.cgi?id=188794
+$({ target: 'Array', proto: true, forced: String(test) === String(test.reverse()) }, {
+ reverse: function reverse() {
+ // eslint-disable-next-line no-self-assign -- dirty hack
+ if (isArray(this)) this.length = this.length;
+ return nativeReverse.call(this);
+ }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.array.slice.js":
+/*!********************************************************!*\
+ !*** ./node_modules/core-js/modules/es.array.slice.js ***!
+ \********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var isArray = __webpack_require__(/*! ../internals/is-array */ "./node_modules/core-js/internals/is-array.js");
+var isConstructor = __webpack_require__(/*! ../internals/is-constructor */ "./node_modules/core-js/internals/is-constructor.js");
+var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/core-js/internals/is-object.js");
+var toAbsoluteIndex = __webpack_require__(/*! ../internals/to-absolute-index */ "./node_modules/core-js/internals/to-absolute-index.js");
+var toLength = __webpack_require__(/*! ../internals/to-length */ "./node_modules/core-js/internals/to-length.js");
+var toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ "./node_modules/core-js/internals/to-indexed-object.js");
+var createProperty = __webpack_require__(/*! ../internals/create-property */ "./node_modules/core-js/internals/create-property.js");
+var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js");
+var arrayMethodHasSpeciesSupport = __webpack_require__(/*! ../internals/array-method-has-species-support */ "./node_modules/core-js/internals/array-method-has-species-support.js");
+
+var HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('slice');
+
+var SPECIES = wellKnownSymbol('species');
+var nativeSlice = [].slice;
+var max = Math.max;
+
+// `Array.prototype.slice` method
+// https://tc39.es/ecma262/#sec-array.prototype.slice
+// fallback for not array-like ES3 strings and DOM objects
+$({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT }, {
+ slice: function slice(start, end) {
+ var O = toIndexedObject(this);
+ var length = toLength(O.length);
+ var k = toAbsoluteIndex(start, length);
+ var fin = toAbsoluteIndex(end === undefined ? length : end, length);
+ // inline `ArraySpeciesCreate` for usage native `Array#slice` where it's possible
+ var Constructor, result, n;
+ if (isArray(O)) {
+ Constructor = O.constructor;
+ // cross-realm fallback
+ if (isConstructor(Constructor) && (Constructor === Array || isArray(Constructor.prototype))) {
+ Constructor = undefined;
+ } else if (isObject(Constructor)) {
+ Constructor = Constructor[SPECIES];
+ if (Constructor === null) Constructor = undefined;
+ }
+ if (Constructor === Array || Constructor === undefined) {
+ return nativeSlice.call(O, k, fin);
+ }
+ }
+ result = new (Constructor === undefined ? Array : Constructor)(max(fin - k, 0));
+ for (n = 0; k < fin; k++, n++) if (k in O) createProperty(result, n, O[k]);
+ result.length = n;
+ return result;
+ }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.array.some.js":
+/*!*******************************************************!*\
+ !*** ./node_modules/core-js/modules/es.array.some.js ***!
+ \*******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var $some = __webpack_require__(/*! ../internals/array-iteration */ "./node_modules/core-js/internals/array-iteration.js").some;
+var arrayMethodIsStrict = __webpack_require__(/*! ../internals/array-method-is-strict */ "./node_modules/core-js/internals/array-method-is-strict.js");
+
+var STRICT_METHOD = arrayMethodIsStrict('some');
+
+// `Array.prototype.some` method
+// https://tc39.es/ecma262/#sec-array.prototype.some
+$({ target: 'Array', proto: true, forced: !STRICT_METHOD }, {
+ some: function some(callbackfn /* , thisArg */) {
+ return $some(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);
+ }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.array.sort.js":
+/*!*******************************************************!*\
+ !*** ./node_modules/core-js/modules/es.array.sort.js ***!
+ \*******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var aCallable = __webpack_require__(/*! ../internals/a-callable */ "./node_modules/core-js/internals/a-callable.js");
+var toObject = __webpack_require__(/*! ../internals/to-object */ "./node_modules/core-js/internals/to-object.js");
+var toLength = __webpack_require__(/*! ../internals/to-length */ "./node_modules/core-js/internals/to-length.js");
+var toString = __webpack_require__(/*! ../internals/to-string */ "./node_modules/core-js/internals/to-string.js");
+var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js");
+var internalSort = __webpack_require__(/*! ../internals/array-sort */ "./node_modules/core-js/internals/array-sort.js");
+var arrayMethodIsStrict = __webpack_require__(/*! ../internals/array-method-is-strict */ "./node_modules/core-js/internals/array-method-is-strict.js");
+var FF = __webpack_require__(/*! ../internals/engine-ff-version */ "./node_modules/core-js/internals/engine-ff-version.js");
+var IE_OR_EDGE = __webpack_require__(/*! ../internals/engine-is-ie-or-edge */ "./node_modules/core-js/internals/engine-is-ie-or-edge.js");
+var V8 = __webpack_require__(/*! ../internals/engine-v8-version */ "./node_modules/core-js/internals/engine-v8-version.js");
+var WEBKIT = __webpack_require__(/*! ../internals/engine-webkit-version */ "./node_modules/core-js/internals/engine-webkit-version.js");
+
+var test = [];
+var nativeSort = test.sort;
+
+// IE8-
+var FAILS_ON_UNDEFINED = fails(function () {
+ test.sort(undefined);
+});
+// V8 bug
+var FAILS_ON_NULL = fails(function () {
+ test.sort(null);
+});
+// Old WebKit
+var STRICT_METHOD = arrayMethodIsStrict('sort');
+
+var STABLE_SORT = !fails(function () {
+ // feature detection can be too slow, so check engines versions
+ if (V8) return V8 < 70;
+ if (FF && FF > 3) return;
+ if (IE_OR_EDGE) return true;
+ if (WEBKIT) return WEBKIT < 603;
+
+ var result = '';
+ var code, chr, value, index;
+
+ // generate an array with more 512 elements (Chakra and old V8 fails only in this case)
+ for (code = 65; code < 76; code++) {
+ chr = String.fromCharCode(code);
+
+ switch (code) {
+ case 66: case 69: case 70: case 72: value = 3; break;
+ case 68: case 71: value = 4; break;
+ default: value = 2;
+ }
+
+ for (index = 0; index < 47; index++) {
+ test.push({ k: chr + index, v: value });
+ }
+ }
+
+ test.sort(function (a, b) { return b.v - a.v; });
+
+ for (index = 0; index < test.length; index++) {
+ chr = test[index].k.charAt(0);
+ if (result.charAt(result.length - 1) !== chr) result += chr;
+ }
+
+ return result !== 'DGBEFHACIJK';
+});
+
+var FORCED = FAILS_ON_UNDEFINED || !FAILS_ON_NULL || !STRICT_METHOD || !STABLE_SORT;
+
+var getSortCompare = function (comparefn) {
+ return function (x, y) {
+ if (y === undefined) return -1;
+ if (x === undefined) return 1;
+ if (comparefn !== undefined) return +comparefn(x, y) || 0;
+ return toString(x) > toString(y) ? 1 : -1;
+ };
+};
+
+// `Array.prototype.sort` method
+// https://tc39.es/ecma262/#sec-array.prototype.sort
+$({ target: 'Array', proto: true, forced: FORCED }, {
+ sort: function sort(comparefn) {
+ if (comparefn !== undefined) aCallable(comparefn);
+
+ var array = toObject(this);
+
+ if (STABLE_SORT) return comparefn === undefined ? nativeSort.call(array) : nativeSort.call(array, comparefn);
+
+ var items = [];
+ var arrayLength = toLength(array.length);
+ var itemsLength, index;
+
+ for (index = 0; index < arrayLength; index++) {
+ if (index in array) items.push(array[index]);
+ }
+
+ items = internalSort(items, getSortCompare(comparefn));
+ itemsLength = items.length;
+ index = 0;
+
+ while (index < itemsLength) array[index] = items[index++];
+ while (index < arrayLength) delete array[index++];
+
+ return array;
+ }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.array.species.js":
+/*!**********************************************************!*\
+ !*** ./node_modules/core-js/modules/es.array.species.js ***!
+ \**********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var setSpecies = __webpack_require__(/*! ../internals/set-species */ "./node_modules/core-js/internals/set-species.js");
+
+// `Array[@@species]` getter
+// https://tc39.es/ecma262/#sec-get-array-@@species
+setSpecies('Array');
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.array.splice.js":
+/*!*********************************************************!*\
+ !*** ./node_modules/core-js/modules/es.array.splice.js ***!
+ \*********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var toAbsoluteIndex = __webpack_require__(/*! ../internals/to-absolute-index */ "./node_modules/core-js/internals/to-absolute-index.js");
+var toInteger = __webpack_require__(/*! ../internals/to-integer */ "./node_modules/core-js/internals/to-integer.js");
+var toLength = __webpack_require__(/*! ../internals/to-length */ "./node_modules/core-js/internals/to-length.js");
+var toObject = __webpack_require__(/*! ../internals/to-object */ "./node_modules/core-js/internals/to-object.js");
+var arraySpeciesCreate = __webpack_require__(/*! ../internals/array-species-create */ "./node_modules/core-js/internals/array-species-create.js");
+var createProperty = __webpack_require__(/*! ../internals/create-property */ "./node_modules/core-js/internals/create-property.js");
+var arrayMethodHasSpeciesSupport = __webpack_require__(/*! ../internals/array-method-has-species-support */ "./node_modules/core-js/internals/array-method-has-species-support.js");
+
+var HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('splice');
+
+var max = Math.max;
+var min = Math.min;
+var MAX_SAFE_INTEGER = 0x1FFFFFFFFFFFFF;
+var MAXIMUM_ALLOWED_LENGTH_EXCEEDED = 'Maximum allowed length exceeded';
+
+// `Array.prototype.splice` method
+// https://tc39.es/ecma262/#sec-array.prototype.splice
+// with adding support of @@species
+$({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT }, {
+ splice: function splice(start, deleteCount /* , ...items */) {
+ var O = toObject(this);
+ var len = toLength(O.length);
+ var actualStart = toAbsoluteIndex(start, len);
+ var argumentsLength = arguments.length;
+ var insertCount, actualDeleteCount, A, k, from, to;
+ if (argumentsLength === 0) {
+ insertCount = actualDeleteCount = 0;
+ } else if (argumentsLength === 1) {
+ insertCount = 0;
+ actualDeleteCount = len - actualStart;
+ } else {
+ insertCount = argumentsLength - 2;
+ actualDeleteCount = min(max(toInteger(deleteCount), 0), len - actualStart);
+ }
+ if (len + insertCount - actualDeleteCount > MAX_SAFE_INTEGER) {
+ throw TypeError(MAXIMUM_ALLOWED_LENGTH_EXCEEDED);
+ }
+ A = arraySpeciesCreate(O, actualDeleteCount);
+ for (k = 0; k < actualDeleteCount; k++) {
+ from = actualStart + k;
+ if (from in O) createProperty(A, k, O[from]);
+ }
+ A.length = actualDeleteCount;
+ if (insertCount < actualDeleteCount) {
+ for (k = actualStart; k < len - actualDeleteCount; k++) {
+ from = k + actualDeleteCount;
+ to = k + insertCount;
+ if (from in O) O[to] = O[from];
+ else delete O[to];
+ }
+ for (k = len; k > len - actualDeleteCount + insertCount; k--) delete O[k - 1];
+ } else if (insertCount > actualDeleteCount) {
+ for (k = len - actualDeleteCount; k > actualStart; k--) {
+ from = k + actualDeleteCount - 1;
+ to = k + insertCount - 1;
+ if (from in O) O[to] = O[from];
+ else delete O[to];
+ }
+ }
+ for (k = 0; k < insertCount; k++) {
+ O[k + actualStart] = arguments[k + 2];
+ }
+ O.length = len - actualDeleteCount + insertCount;
+ return A;
+ }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.array.unscopables.flat-map.js":
+/*!***********************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.array.unscopables.flat-map.js ***!
+ \***********************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+// this method was added to unscopables after implementation
+// in popular engines, so it's moved to a separate module
+var addToUnscopables = __webpack_require__(/*! ../internals/add-to-unscopables */ "./node_modules/core-js/internals/add-to-unscopables.js");
+
+// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables
+addToUnscopables('flatMap');
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.array.unscopables.flat.js":
+/*!*******************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.array.unscopables.flat.js ***!
+ \*******************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+// this method was added to unscopables after implementation
+// in popular engines, so it's moved to a separate module
+var addToUnscopables = __webpack_require__(/*! ../internals/add-to-unscopables */ "./node_modules/core-js/internals/add-to-unscopables.js");
+
+// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables
+addToUnscopables('flat');
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.data-view.js":
+/*!******************************************************!*\
+ !*** ./node_modules/core-js/modules/es.data-view.js ***!
+ \******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var ArrayBufferModule = __webpack_require__(/*! ../internals/array-buffer */ "./node_modules/core-js/internals/array-buffer.js");
+var NATIVE_ARRAY_BUFFER = __webpack_require__(/*! ../internals/array-buffer-native */ "./node_modules/core-js/internals/array-buffer-native.js");
+
+// `DataView` constructor
+// https://tc39.es/ecma262/#sec-dataview-constructor
+$({ global: true, forced: !NATIVE_ARRAY_BUFFER }, {
+ DataView: ArrayBufferModule.DataView
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.date.get-year.js":
+/*!**********************************************************!*\
+ !*** ./node_modules/core-js/modules/es.date.get-year.js ***!
+ \**********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js");
+
+var FORCED = fails(function () {
+ return new Date(16e11).getYear() !== 120;
+});
+
+var getFullYear = Date.prototype.getFullYear;
+
+// `Date.prototype.getYear` method
+// https://tc39.es/ecma262/#sec-date.prototype.getyear
+$({ target: 'Date', proto: true, forced: FORCED }, {
+ getYear: function getYear() {
+ return getFullYear.call(this) - 1900;
+ }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.date.now.js":
+/*!*****************************************************!*\
+ !*** ./node_modules/core-js/modules/es.date.now.js ***!
+ \*****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+
+// `Date.now` method
+// https://tc39.es/ecma262/#sec-date.now
+$({ target: 'Date', stat: true }, {
+ now: function now() {
+ return new Date().getTime();
+ }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.date.set-year.js":
+/*!**********************************************************!*\
+ !*** ./node_modules/core-js/modules/es.date.set-year.js ***!
+ \**********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var toInteger = __webpack_require__(/*! ../internals/to-integer */ "./node_modules/core-js/internals/to-integer.js");
+
+var getTime = Date.prototype.getTime;
+var setFullYear = Date.prototype.setFullYear;
+
+// `Date.prototype.setYear` method
+// https://tc39.es/ecma262/#sec-date.prototype.setyear
+$({ target: 'Date', proto: true }, {
+ setYear: function setYear(year) {
+ // validate
+ getTime.call(this);
+ var yi = toInteger(year);
+ var yyyy = 0 <= yi && yi <= 99 ? yi + 1900 : yi;
+ return setFullYear.call(this, yyyy);
+ }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.date.to-gmt-string.js":
+/*!***************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.date.to-gmt-string.js ***!
+ \***************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+
+// `Date.prototype.toGMTString` method
+// https://tc39.es/ecma262/#sec-date.prototype.togmtstring
+$({ target: 'Date', proto: true }, {
+ toGMTString: Date.prototype.toUTCString
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.date.to-iso-string.js":
+/*!***************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.date.to-iso-string.js ***!
+ \***************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var toISOString = __webpack_require__(/*! ../internals/date-to-iso-string */ "./node_modules/core-js/internals/date-to-iso-string.js");
+
+// `Date.prototype.toISOString` method
+// https://tc39.es/ecma262/#sec-date.prototype.toisostring
+// PhantomJS / old WebKit has a broken implementations
+$({ target: 'Date', proto: true, forced: Date.prototype.toISOString !== toISOString }, {
+ toISOString: toISOString
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.date.to-json.js":
+/*!*********************************************************!*\
+ !*** ./node_modules/core-js/modules/es.date.to-json.js ***!
+ \*********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js");
+var toObject = __webpack_require__(/*! ../internals/to-object */ "./node_modules/core-js/internals/to-object.js");
+var toPrimitive = __webpack_require__(/*! ../internals/to-primitive */ "./node_modules/core-js/internals/to-primitive.js");
+
+var FORCED = fails(function () {
+ return new Date(NaN).toJSON() !== null
+ || Date.prototype.toJSON.call({ toISOString: function () { return 1; } }) !== 1;
+});
+
+// `Date.prototype.toJSON` method
+// https://tc39.es/ecma262/#sec-date.prototype.tojson
+$({ target: 'Date', proto: true, forced: FORCED }, {
+ // eslint-disable-next-line no-unused-vars -- required for `.length`
+ toJSON: function toJSON(key) {
+ var O = toObject(this);
+ var pv = toPrimitive(O, 'number');
+ return typeof pv == 'number' && !isFinite(pv) ? null : O.toISOString();
+ }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.date.to-primitive.js":
+/*!**************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.date.to-primitive.js ***!
+ \**************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var redefine = __webpack_require__(/*! ../internals/redefine */ "./node_modules/core-js/internals/redefine.js");
+var dateToPrimitive = __webpack_require__(/*! ../internals/date-to-primitive */ "./node_modules/core-js/internals/date-to-primitive.js");
+var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js");
+
+var TO_PRIMITIVE = wellKnownSymbol('toPrimitive');
+var DatePrototype = Date.prototype;
+
+// `Date.prototype[@@toPrimitive]` method
+// https://tc39.es/ecma262/#sec-date.prototype-@@toprimitive
+if (!(TO_PRIMITIVE in DatePrototype)) {
+ redefine(DatePrototype, TO_PRIMITIVE, dateToPrimitive);
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.date.to-string.js":
+/*!***********************************************************!*\
+ !*** ./node_modules/core-js/modules/es.date.to-string.js ***!
+ \***********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var redefine = __webpack_require__(/*! ../internals/redefine */ "./node_modules/core-js/internals/redefine.js");
+
+var DatePrototype = Date.prototype;
+var INVALID_DATE = 'Invalid Date';
+var TO_STRING = 'toString';
+var nativeDateToString = DatePrototype[TO_STRING];
+var getTime = DatePrototype.getTime;
+
+// `Date.prototype.toString` method
+// https://tc39.es/ecma262/#sec-date.prototype.tostring
+if (String(new Date(NaN)) != INVALID_DATE) {
+ redefine(DatePrototype, TO_STRING, function toString() {
+ var value = getTime.call(this);
+ // eslint-disable-next-line no-self-compare -- NaN check
+ return value === value ? nativeDateToString.call(this) : INVALID_DATE;
+ });
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.escape.js":
+/*!***************************************************!*\
+ !*** ./node_modules/core-js/modules/es.escape.js ***!
+ \***************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var toString = __webpack_require__(/*! ../internals/to-string */ "./node_modules/core-js/internals/to-string.js");
+
+var raw = /[\w*+\-./@]/;
+
+var hex = function (code, length) {
+ var result = code.toString(16);
+ while (result.length < length) result = '0' + result;
+ return result;
+};
+
+// `escape` method
+// https://tc39.es/ecma262/#sec-escape-string
+$({ global: true }, {
+ escape: function escape(string) {
+ var str = toString(string);
+ var result = '';
+ var length = str.length;
+ var index = 0;
+ var chr, code;
+ while (index < length) {
+ chr = str.charAt(index++);
+ if (raw.test(chr)) {
+ result += chr;
+ } else {
+ code = chr.charCodeAt(0);
+ if (code < 256) {
+ result += '%' + hex(code, 2);
+ } else {
+ result += '%u' + hex(code, 4).toUpperCase();
+ }
+ }
+ } return result;
+ }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.function.bind.js":
+/*!**********************************************************!*\
+ !*** ./node_modules/core-js/modules/es.function.bind.js ***!
+ \**********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var bind = __webpack_require__(/*! ../internals/function-bind */ "./node_modules/core-js/internals/function-bind.js");
+
+// `Function.prototype.bind` method
+// https://tc39.es/ecma262/#sec-function.prototype.bind
+$({ target: 'Function', proto: true }, {
+ bind: bind
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.function.has-instance.js":
+/*!******************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.function.has-instance.js ***!
+ \******************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var isCallable = __webpack_require__(/*! ../internals/is-callable */ "./node_modules/core-js/internals/is-callable.js");
+var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/core-js/internals/is-object.js");
+var definePropertyModule = __webpack_require__(/*! ../internals/object-define-property */ "./node_modules/core-js/internals/object-define-property.js");
+var getPrototypeOf = __webpack_require__(/*! ../internals/object-get-prototype-of */ "./node_modules/core-js/internals/object-get-prototype-of.js");
+var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js");
+
+var HAS_INSTANCE = wellKnownSymbol('hasInstance');
+var FunctionPrototype = Function.prototype;
+
+// `Function.prototype[@@hasInstance]` method
+// https://tc39.es/ecma262/#sec-function.prototype-@@hasinstance
+if (!(HAS_INSTANCE in FunctionPrototype)) {
+ definePropertyModule.f(FunctionPrototype, HAS_INSTANCE, { value: function (O) {
+ if (!isCallable(this) || !isObject(O)) return false;
+ if (!isObject(this.prototype)) return O instanceof this;
+ // for environment w/o native `@@hasInstance` logic enough `instanceof`, but add this:
+ while (O = getPrototypeOf(O)) if (this.prototype === O) return true;
+ return false;
+ } });
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.function.name.js":
+/*!**********************************************************!*\
+ !*** ./node_modules/core-js/modules/es.function.name.js ***!
+ \**********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/core-js/internals/descriptors.js");
+var FUNCTION_NAME_EXISTS = __webpack_require__(/*! ../internals/function-name */ "./node_modules/core-js/internals/function-name.js").EXISTS;
+var defineProperty = __webpack_require__(/*! ../internals/object-define-property */ "./node_modules/core-js/internals/object-define-property.js").f;
+
+var FunctionPrototype = Function.prototype;
+var FunctionPrototypeToString = FunctionPrototype.toString;
+var nameRE = /^\s*function ([^ (]*)/;
+var NAME = 'name';
+
+// Function instances `.name` property
+// https://tc39.es/ecma262/#sec-function-instances-name
+if (DESCRIPTORS && !FUNCTION_NAME_EXISTS) {
+ defineProperty(FunctionPrototype, NAME, {
+ configurable: true,
+ get: function () {
+ try {
+ return FunctionPrototypeToString.call(this).match(nameRE)[1];
+ } catch (error) {
+ return '';
+ }
+ }
+ });
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.global-this.js":
+/*!********************************************************!*\
+ !*** ./node_modules/core-js/modules/es.global-this.js ***!
+ \********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js");
+
+// `globalThis` object
+// https://tc39.es/ecma262/#sec-globalthis
+$({ global: true }, {
+ globalThis: global
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.json.stringify.js":
+/*!***********************************************************!*\
+ !*** ./node_modules/core-js/modules/es.json.stringify.js ***!
+ \***********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ "./node_modules/core-js/internals/get-built-in.js");
+var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js");
+
+var $stringify = getBuiltIn('JSON', 'stringify');
+var re = /[\uD800-\uDFFF]/g;
+var low = /^[\uD800-\uDBFF]$/;
+var hi = /^[\uDC00-\uDFFF]$/;
+
+var fix = function (match, offset, string) {
+ var prev = string.charAt(offset - 1);
+ var next = string.charAt(offset + 1);
+ if ((low.test(match) && !hi.test(next)) || (hi.test(match) && !low.test(prev))) {
+ return '\\u' + match.charCodeAt(0).toString(16);
+ } return match;
+};
+
+var FORCED = fails(function () {
+ return $stringify('\uDF06\uD834') !== '"\\udf06\\ud834"'
+ || $stringify('\uDEAD') !== '"\\udead"';
+});
+
+if ($stringify) {
+ // `JSON.stringify` method
+ // https://tc39.es/ecma262/#sec-json.stringify
+ // https://github.com/tc39/proposal-well-formed-stringify
+ $({ target: 'JSON', stat: true, forced: FORCED }, {
+ // eslint-disable-next-line no-unused-vars -- required for `.length`
+ stringify: function stringify(it, replacer, space) {
+ var result = $stringify.apply(null, arguments);
+ return typeof result == 'string' ? result.replace(re, fix) : result;
+ }
+ });
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.json.to-string-tag.js":
+/*!***************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.json.to-string-tag.js ***!
+ \***************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js");
+var setToStringTag = __webpack_require__(/*! ../internals/set-to-string-tag */ "./node_modules/core-js/internals/set-to-string-tag.js");
+
+// JSON[@@toStringTag] property
+// https://tc39.es/ecma262/#sec-json-@@tostringtag
+setToStringTag(global.JSON, 'JSON', true);
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.map.js":
+/*!************************************************!*\
+ !*** ./node_modules/core-js/modules/es.map.js ***!
+ \************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var collection = __webpack_require__(/*! ../internals/collection */ "./node_modules/core-js/internals/collection.js");
+var collectionStrong = __webpack_require__(/*! ../internals/collection-strong */ "./node_modules/core-js/internals/collection-strong.js");
+
+// `Map` constructor
+// https://tc39.es/ecma262/#sec-map-objects
+module.exports = collection('Map', function (init) {
+ return function Map() { return init(this, arguments.length ? arguments[0] : undefined); };
+}, collectionStrong);
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.math.acosh.js":
+/*!*******************************************************!*\
+ !*** ./node_modules/core-js/modules/es.math.acosh.js ***!
+ \*******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var log1p = __webpack_require__(/*! ../internals/math-log1p */ "./node_modules/core-js/internals/math-log1p.js");
+
+// eslint-disable-next-line es/no-math-acosh -- required for testing
+var $acosh = Math.acosh;
+var log = Math.log;
+var sqrt = Math.sqrt;
+var LN2 = Math.LN2;
+
+var FORCED = !$acosh
+ // V8 bug: https://code.google.com/p/v8/issues/detail?id=3509
+ || Math.floor($acosh(Number.MAX_VALUE)) != 710
+ // Tor Browser bug: Math.acosh(Infinity) -> NaN
+ || $acosh(Infinity) != Infinity;
+
+// `Math.acosh` method
+// https://tc39.es/ecma262/#sec-math.acosh
+$({ target: 'Math', stat: true, forced: FORCED }, {
+ acosh: function acosh(x) {
+ return (x = +x) < 1 ? NaN : x > 94906265.62425156
+ ? log(x) + LN2
+ : log1p(x - 1 + sqrt(x - 1) * sqrt(x + 1));
+ }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.math.asinh.js":
+/*!*******************************************************!*\
+ !*** ./node_modules/core-js/modules/es.math.asinh.js ***!
+ \*******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+
+// eslint-disable-next-line es/no-math-asinh -- required for testing
+var $asinh = Math.asinh;
+var log = Math.log;
+var sqrt = Math.sqrt;
+
+function asinh(x) {
+ return !isFinite(x = +x) || x == 0 ? x : x < 0 ? -asinh(-x) : log(x + sqrt(x * x + 1));
+}
+
+// `Math.asinh` method
+// https://tc39.es/ecma262/#sec-math.asinh
+// Tor Browser bug: Math.asinh(0) -> -0
+$({ target: 'Math', stat: true, forced: !($asinh && 1 / $asinh(0) > 0) }, {
+ asinh: asinh
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.math.atanh.js":
+/*!*******************************************************!*\
+ !*** ./node_modules/core-js/modules/es.math.atanh.js ***!
+ \*******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+
+// eslint-disable-next-line es/no-math-atanh -- required for testing
+var $atanh = Math.atanh;
+var log = Math.log;
+
+// `Math.atanh` method
+// https://tc39.es/ecma262/#sec-math.atanh
+// Tor Browser bug: Math.atanh(-0) -> 0
+$({ target: 'Math', stat: true, forced: !($atanh && 1 / $atanh(-0) < 0) }, {
+ atanh: function atanh(x) {
+ return (x = +x) == 0 ? x : log((1 + x) / (1 - x)) / 2;
+ }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.math.cbrt.js":
+/*!******************************************************!*\
+ !*** ./node_modules/core-js/modules/es.math.cbrt.js ***!
+ \******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var sign = __webpack_require__(/*! ../internals/math-sign */ "./node_modules/core-js/internals/math-sign.js");
+
+var abs = Math.abs;
+var pow = Math.pow;
+
+// `Math.cbrt` method
+// https://tc39.es/ecma262/#sec-math.cbrt
+$({ target: 'Math', stat: true }, {
+ cbrt: function cbrt(x) {
+ return sign(x = +x) * pow(abs(x), 1 / 3);
+ }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.math.clz32.js":
+/*!*******************************************************!*\
+ !*** ./node_modules/core-js/modules/es.math.clz32.js ***!
+ \*******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+
+var floor = Math.floor;
+var log = Math.log;
+var LOG2E = Math.LOG2E;
+
+// `Math.clz32` method
+// https://tc39.es/ecma262/#sec-math.clz32
+$({ target: 'Math', stat: true }, {
+ clz32: function clz32(x) {
+ return (x >>>= 0) ? 31 - floor(log(x + 0.5) * LOG2E) : 32;
+ }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.math.cosh.js":
+/*!******************************************************!*\
+ !*** ./node_modules/core-js/modules/es.math.cosh.js ***!
+ \******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var expm1 = __webpack_require__(/*! ../internals/math-expm1 */ "./node_modules/core-js/internals/math-expm1.js");
+
+// eslint-disable-next-line es/no-math-cosh -- required for testing
+var $cosh = Math.cosh;
+var abs = Math.abs;
+var E = Math.E;
+
+// `Math.cosh` method
+// https://tc39.es/ecma262/#sec-math.cosh
+$({ target: 'Math', stat: true, forced: !$cosh || $cosh(710) === Infinity }, {
+ cosh: function cosh(x) {
+ var t = expm1(abs(x) - 1) + 1;
+ return (t + 1 / (t * E * E)) * (E / 2);
+ }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.math.expm1.js":
+/*!*******************************************************!*\
+ !*** ./node_modules/core-js/modules/es.math.expm1.js ***!
+ \*******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var expm1 = __webpack_require__(/*! ../internals/math-expm1 */ "./node_modules/core-js/internals/math-expm1.js");
+
+// `Math.expm1` method
+// https://tc39.es/ecma262/#sec-math.expm1
+// eslint-disable-next-line es/no-math-expm1 -- required for testing
+$({ target: 'Math', stat: true, forced: expm1 != Math.expm1 }, { expm1: expm1 });
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.math.fround.js":
+/*!********************************************************!*\
+ !*** ./node_modules/core-js/modules/es.math.fround.js ***!
+ \********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var fround = __webpack_require__(/*! ../internals/math-fround */ "./node_modules/core-js/internals/math-fround.js");
+
+// `Math.fround` method
+// https://tc39.es/ecma262/#sec-math.fround
+$({ target: 'Math', stat: true }, { fround: fround });
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.math.hypot.js":
+/*!*******************************************************!*\
+ !*** ./node_modules/core-js/modules/es.math.hypot.js ***!
+ \*******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+
+// eslint-disable-next-line es/no-math-hypot -- required for testing
+var $hypot = Math.hypot;
+var abs = Math.abs;
+var sqrt = Math.sqrt;
+
+// Chrome 77 bug
+// https://bugs.chromium.org/p/v8/issues/detail?id=9546
+var BUGGY = !!$hypot && $hypot(Infinity, NaN) !== Infinity;
+
+// `Math.hypot` method
+// https://tc39.es/ecma262/#sec-math.hypot
+$({ target: 'Math', stat: true, forced: BUGGY }, {
+ // eslint-disable-next-line no-unused-vars -- required for `.length`
+ hypot: function hypot(value1, value2) {
+ var sum = 0;
+ var i = 0;
+ var aLen = arguments.length;
+ var larg = 0;
+ var arg, div;
+ while (i < aLen) {
+ arg = abs(arguments[i++]);
+ if (larg < arg) {
+ div = larg / arg;
+ sum = sum * div * div + 1;
+ larg = arg;
+ } else if (arg > 0) {
+ div = arg / larg;
+ sum += div * div;
+ } else sum += arg;
+ }
+ return larg === Infinity ? Infinity : larg * sqrt(sum);
+ }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.math.imul.js":
+/*!******************************************************!*\
+ !*** ./node_modules/core-js/modules/es.math.imul.js ***!
+ \******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js");
+
+// eslint-disable-next-line es/no-math-imul -- required for testing
+var $imul = Math.imul;
+
+var FORCED = fails(function () {
+ return $imul(0xFFFFFFFF, 5) != -5 || $imul.length != 2;
+});
+
+// `Math.imul` method
+// https://tc39.es/ecma262/#sec-math.imul
+// some WebKit versions fails with big numbers, some has wrong arity
+$({ target: 'Math', stat: true, forced: FORCED }, {
+ imul: function imul(x, y) {
+ var UINT16 = 0xFFFF;
+ var xn = +x;
+ var yn = +y;
+ var xl = UINT16 & xn;
+ var yl = UINT16 & yn;
+ return 0 | xl * yl + ((UINT16 & xn >>> 16) * yl + xl * (UINT16 & yn >>> 16) << 16 >>> 0);
+ }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.math.log10.js":
+/*!*******************************************************!*\
+ !*** ./node_modules/core-js/modules/es.math.log10.js ***!
+ \*******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+
+var log = Math.log;
+var LOG10E = Math.LOG10E;
+
+// `Math.log10` method
+// https://tc39.es/ecma262/#sec-math.log10
+$({ target: 'Math', stat: true }, {
+ log10: function log10(x) {
+ return log(x) * LOG10E;
+ }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.math.log1p.js":
+/*!*******************************************************!*\
+ !*** ./node_modules/core-js/modules/es.math.log1p.js ***!
+ \*******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var log1p = __webpack_require__(/*! ../internals/math-log1p */ "./node_modules/core-js/internals/math-log1p.js");
+
+// `Math.log1p` method
+// https://tc39.es/ecma262/#sec-math.log1p
+$({ target: 'Math', stat: true }, { log1p: log1p });
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.math.log2.js":
+/*!******************************************************!*\
+ !*** ./node_modules/core-js/modules/es.math.log2.js ***!
+ \******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+
+var log = Math.log;
+var LN2 = Math.LN2;
+
+// `Math.log2` method
+// https://tc39.es/ecma262/#sec-math.log2
+$({ target: 'Math', stat: true }, {
+ log2: function log2(x) {
+ return log(x) / LN2;
+ }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.math.sign.js":
+/*!******************************************************!*\
+ !*** ./node_modules/core-js/modules/es.math.sign.js ***!
+ \******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var sign = __webpack_require__(/*! ../internals/math-sign */ "./node_modules/core-js/internals/math-sign.js");
+
+// `Math.sign` method
+// https://tc39.es/ecma262/#sec-math.sign
+$({ target: 'Math', stat: true }, {
+ sign: sign
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.math.sinh.js":
+/*!******************************************************!*\
+ !*** ./node_modules/core-js/modules/es.math.sinh.js ***!
+ \******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js");
+var expm1 = __webpack_require__(/*! ../internals/math-expm1 */ "./node_modules/core-js/internals/math-expm1.js");
+
+var abs = Math.abs;
+var exp = Math.exp;
+var E = Math.E;
+
+var FORCED = fails(function () {
+ // eslint-disable-next-line es/no-math-sinh -- required for testing
+ return Math.sinh(-2e-17) != -2e-17;
+});
+
+// `Math.sinh` method
+// https://tc39.es/ecma262/#sec-math.sinh
+// V8 near Chromium 38 has a problem with very small numbers
+$({ target: 'Math', stat: true, forced: FORCED }, {
+ sinh: function sinh(x) {
+ return abs(x = +x) < 1 ? (expm1(x) - expm1(-x)) / 2 : (exp(x - 1) - exp(-x - 1)) * (E / 2);
+ }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.math.tanh.js":
+/*!******************************************************!*\
+ !*** ./node_modules/core-js/modules/es.math.tanh.js ***!
+ \******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var expm1 = __webpack_require__(/*! ../internals/math-expm1 */ "./node_modules/core-js/internals/math-expm1.js");
+
+var exp = Math.exp;
+
+// `Math.tanh` method
+// https://tc39.es/ecma262/#sec-math.tanh
+$({ target: 'Math', stat: true }, {
+ tanh: function tanh(x) {
+ var a = expm1(x = +x);
+ var b = expm1(-x);
+ return a == Infinity ? 1 : b == Infinity ? -1 : (a - b) / (exp(x) + exp(-x));
+ }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.math.to-string-tag.js":
+/*!***************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.math.to-string-tag.js ***!
+ \***************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var setToStringTag = __webpack_require__(/*! ../internals/set-to-string-tag */ "./node_modules/core-js/internals/set-to-string-tag.js");
+
+// Math[@@toStringTag] property
+// https://tc39.es/ecma262/#sec-math-@@tostringtag
+setToStringTag(Math, 'Math', true);
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.math.trunc.js":
+/*!*******************************************************!*\
+ !*** ./node_modules/core-js/modules/es.math.trunc.js ***!
+ \*******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+
+var ceil = Math.ceil;
+var floor = Math.floor;
+
+// `Math.trunc` method
+// https://tc39.es/ecma262/#sec-math.trunc
+$({ target: 'Math', stat: true }, {
+ trunc: function trunc(it) {
+ return (it > 0 ? floor : ceil)(it);
+ }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.number.constructor.js":
+/*!***************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.number.constructor.js ***!
+ \***************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/core-js/internals/descriptors.js");
+var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js");
+var isForced = __webpack_require__(/*! ../internals/is-forced */ "./node_modules/core-js/internals/is-forced.js");
+var redefine = __webpack_require__(/*! ../internals/redefine */ "./node_modules/core-js/internals/redefine.js");
+var has = __webpack_require__(/*! ../internals/has */ "./node_modules/core-js/internals/has.js");
+var classof = __webpack_require__(/*! ../internals/classof-raw */ "./node_modules/core-js/internals/classof-raw.js");
+var inheritIfRequired = __webpack_require__(/*! ../internals/inherit-if-required */ "./node_modules/core-js/internals/inherit-if-required.js");
+var isSymbol = __webpack_require__(/*! ../internals/is-symbol */ "./node_modules/core-js/internals/is-symbol.js");
+var toPrimitive = __webpack_require__(/*! ../internals/to-primitive */ "./node_modules/core-js/internals/to-primitive.js");
+var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js");
+var create = __webpack_require__(/*! ../internals/object-create */ "./node_modules/core-js/internals/object-create.js");
+var getOwnPropertyNames = __webpack_require__(/*! ../internals/object-get-own-property-names */ "./node_modules/core-js/internals/object-get-own-property-names.js").f;
+var getOwnPropertyDescriptor = __webpack_require__(/*! ../internals/object-get-own-property-descriptor */ "./node_modules/core-js/internals/object-get-own-property-descriptor.js").f;
+var defineProperty = __webpack_require__(/*! ../internals/object-define-property */ "./node_modules/core-js/internals/object-define-property.js").f;
+var trim = __webpack_require__(/*! ../internals/string-trim */ "./node_modules/core-js/internals/string-trim.js").trim;
+
+var NUMBER = 'Number';
+var NativeNumber = global[NUMBER];
+var NumberPrototype = NativeNumber.prototype;
+
+// Opera ~12 has broken Object#toString
+var BROKEN_CLASSOF = classof(create(NumberPrototype)) == NUMBER;
+
+// `ToNumber` abstract operation
+// https://tc39.es/ecma262/#sec-tonumber
+var toNumber = function (argument) {
+ if (isSymbol(argument)) throw TypeError('Cannot convert a Symbol value to a number');
+ var it = toPrimitive(argument, 'number');
+ var first, third, radix, maxCode, digits, length, index, code;
+ if (typeof it == 'string' && it.length > 2) {
+ it = trim(it);
+ first = it.charCodeAt(0);
+ if (first === 43 || first === 45) {
+ third = it.charCodeAt(2);
+ if (third === 88 || third === 120) return NaN; // Number('+0x1') should be NaN, old V8 fix
+ } else if (first === 48) {
+ switch (it.charCodeAt(1)) {
+ case 66: case 98: radix = 2; maxCode = 49; break; // fast equal of /^0b[01]+$/i
+ case 79: case 111: radix = 8; maxCode = 55; break; // fast equal of /^0o[0-7]+$/i
+ default: return +it;
+ }
+ digits = it.slice(2);
+ length = digits.length;
+ for (index = 0; index < length; index++) {
+ code = digits.charCodeAt(index);
+ // parseInt parses a string to a first unavailable symbol
+ // but ToNumber should return NaN if a string contains unavailable symbols
+ if (code < 48 || code > maxCode) return NaN;
+ } return parseInt(digits, radix);
+ }
+ } return +it;
+};
+
+// `Number` constructor
+// https://tc39.es/ecma262/#sec-number-constructor
+if (isForced(NUMBER, !NativeNumber(' 0o1') || !NativeNumber('0b1') || NativeNumber('+0x1'))) {
+ var NumberWrapper = function Number(value) {
+ var it = arguments.length < 1 ? 0 : value;
+ var dummy = this;
+ return dummy instanceof NumberWrapper
+ // check on 1..constructor(foo) case
+ && (BROKEN_CLASSOF ? fails(function () { NumberPrototype.valueOf.call(dummy); }) : classof(dummy) != NUMBER)
+ ? inheritIfRequired(new NativeNumber(toNumber(it)), dummy, NumberWrapper) : toNumber(it);
+ };
+ for (var keys = DESCRIPTORS ? getOwnPropertyNames(NativeNumber) : (
+ // ES3:
+ 'MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,' +
+ // ES2015 (in case, if modules with ES2015 Number statics required before):
+ 'EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,' +
+ 'MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger,' +
+ // ESNext
+ 'fromString,range'
+ ).split(','), j = 0, key; keys.length > j; j++) {
+ if (has(NativeNumber, key = keys[j]) && !has(NumberWrapper, key)) {
+ defineProperty(NumberWrapper, key, getOwnPropertyDescriptor(NativeNumber, key));
+ }
+ }
+ NumberWrapper.prototype = NumberPrototype;
+ NumberPrototype.constructor = NumberWrapper;
+ redefine(global, NUMBER, NumberWrapper);
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.number.epsilon.js":
+/*!***********************************************************!*\
+ !*** ./node_modules/core-js/modules/es.number.epsilon.js ***!
+ \***********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+
+// `Number.EPSILON` constant
+// https://tc39.es/ecma262/#sec-number.epsilon
+$({ target: 'Number', stat: true }, {
+ EPSILON: Math.pow(2, -52)
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.number.is-finite.js":
+/*!*************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.number.is-finite.js ***!
+ \*************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var numberIsFinite = __webpack_require__(/*! ../internals/number-is-finite */ "./node_modules/core-js/internals/number-is-finite.js");
+
+// `Number.isFinite` method
+// https://tc39.es/ecma262/#sec-number.isfinite
+$({ target: 'Number', stat: true }, { isFinite: numberIsFinite });
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.number.is-integer.js":
+/*!**************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.number.is-integer.js ***!
+ \**************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var isInteger = __webpack_require__(/*! ../internals/is-integer */ "./node_modules/core-js/internals/is-integer.js");
+
+// `Number.isInteger` method
+// https://tc39.es/ecma262/#sec-number.isinteger
+$({ target: 'Number', stat: true }, {
+ isInteger: isInteger
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.number.is-nan.js":
+/*!**********************************************************!*\
+ !*** ./node_modules/core-js/modules/es.number.is-nan.js ***!
+ \**********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+
+// `Number.isNaN` method
+// https://tc39.es/ecma262/#sec-number.isnan
+$({ target: 'Number', stat: true }, {
+ isNaN: function isNaN(number) {
+ // eslint-disable-next-line no-self-compare -- NaN check
+ return number != number;
+ }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.number.is-safe-integer.js":
+/*!*******************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.number.is-safe-integer.js ***!
+ \*******************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var isInteger = __webpack_require__(/*! ../internals/is-integer */ "./node_modules/core-js/internals/is-integer.js");
+
+var abs = Math.abs;
+
+// `Number.isSafeInteger` method
+// https://tc39.es/ecma262/#sec-number.issafeinteger
+$({ target: 'Number', stat: true }, {
+ isSafeInteger: function isSafeInteger(number) {
+ return isInteger(number) && abs(number) <= 0x1FFFFFFFFFFFFF;
+ }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.number.max-safe-integer.js":
+/*!********************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.number.max-safe-integer.js ***!
+ \********************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+
+// `Number.MAX_SAFE_INTEGER` constant
+// https://tc39.es/ecma262/#sec-number.max_safe_integer
+$({ target: 'Number', stat: true }, {
+ MAX_SAFE_INTEGER: 0x1FFFFFFFFFFFFF
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.number.min-safe-integer.js":
+/*!********************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.number.min-safe-integer.js ***!
+ \********************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+
+// `Number.MIN_SAFE_INTEGER` constant
+// https://tc39.es/ecma262/#sec-number.min_safe_integer
+$({ target: 'Number', stat: true }, {
+ MIN_SAFE_INTEGER: -0x1FFFFFFFFFFFFF
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.number.parse-float.js":
+/*!***************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.number.parse-float.js ***!
+ \***************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var parseFloat = __webpack_require__(/*! ../internals/number-parse-float */ "./node_modules/core-js/internals/number-parse-float.js");
+
+// `Number.parseFloat` method
+// https://tc39.es/ecma262/#sec-number.parseFloat
+// eslint-disable-next-line es/no-number-parsefloat -- required for testing
+$({ target: 'Number', stat: true, forced: Number.parseFloat != parseFloat }, {
+ parseFloat: parseFloat
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.number.parse-int.js":
+/*!*************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.number.parse-int.js ***!
+ \*************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var parseInt = __webpack_require__(/*! ../internals/number-parse-int */ "./node_modules/core-js/internals/number-parse-int.js");
+
+// `Number.parseInt` method
+// https://tc39.es/ecma262/#sec-number.parseint
+// eslint-disable-next-line es/no-number-parseint -- required for testing
+$({ target: 'Number', stat: true, forced: Number.parseInt != parseInt }, {
+ parseInt: parseInt
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.number.to-fixed.js":
+/*!************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.number.to-fixed.js ***!
+ \************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var toInteger = __webpack_require__(/*! ../internals/to-integer */ "./node_modules/core-js/internals/to-integer.js");
+var thisNumberValue = __webpack_require__(/*! ../internals/this-number-value */ "./node_modules/core-js/internals/this-number-value.js");
+var repeat = __webpack_require__(/*! ../internals/string-repeat */ "./node_modules/core-js/internals/string-repeat.js");
+var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js");
+
+var nativeToFixed = 1.0.toFixed;
+var floor = Math.floor;
+
+var pow = function (x, n, acc) {
+ return n === 0 ? acc : n % 2 === 1 ? pow(x, n - 1, acc * x) : pow(x * x, n / 2, acc);
+};
+
+var log = function (x) {
+ var n = 0;
+ var x2 = x;
+ while (x2 >= 4096) {
+ n += 12;
+ x2 /= 4096;
+ }
+ while (x2 >= 2) {
+ n += 1;
+ x2 /= 2;
+ } return n;
+};
+
+var multiply = function (data, n, c) {
+ var index = -1;
+ var c2 = c;
+ while (++index < 6) {
+ c2 += n * data[index];
+ data[index] = c2 % 1e7;
+ c2 = floor(c2 / 1e7);
+ }
+};
+
+var divide = function (data, n) {
+ var index = 6;
+ var c = 0;
+ while (--index >= 0) {
+ c += data[index];
+ data[index] = floor(c / n);
+ c = (c % n) * 1e7;
+ }
+};
+
+var dataToString = function (data) {
+ var index = 6;
+ var s = '';
+ while (--index >= 0) {
+ if (s !== '' || index === 0 || data[index] !== 0) {
+ var t = String(data[index]);
+ s = s === '' ? t : s + repeat.call('0', 7 - t.length) + t;
+ }
+ } return s;
+};
+
+var FORCED = nativeToFixed && (
+ 0.00008.toFixed(3) !== '0.000' ||
+ 0.9.toFixed(0) !== '1' ||
+ 1.255.toFixed(2) !== '1.25' ||
+ 1000000000000000128.0.toFixed(0) !== '1000000000000000128'
+) || !fails(function () {
+ // V8 ~ Android 4.3-
+ nativeToFixed.call({});
+});
+
+// `Number.prototype.toFixed` method
+// https://tc39.es/ecma262/#sec-number.prototype.tofixed
+$({ target: 'Number', proto: true, forced: FORCED }, {
+ toFixed: function toFixed(fractionDigits) {
+ var number = thisNumberValue(this);
+ var fractDigits = toInteger(fractionDigits);
+ var data = [0, 0, 0, 0, 0, 0];
+ var sign = '';
+ var result = '0';
+ var e, z, j, k;
+
+ if (fractDigits < 0 || fractDigits > 20) throw RangeError('Incorrect fraction digits');
+ // eslint-disable-next-line no-self-compare -- NaN check
+ if (number != number) return 'NaN';
+ if (number <= -1e21 || number >= 1e21) return String(number);
+ if (number < 0) {
+ sign = '-';
+ number = -number;
+ }
+ if (number > 1e-21) {
+ e = log(number * pow(2, 69, 1)) - 69;
+ z = e < 0 ? number * pow(2, -e, 1) : number / pow(2, e, 1);
+ z *= 0x10000000000000;
+ e = 52 - e;
+ if (e > 0) {
+ multiply(data, 0, z);
+ j = fractDigits;
+ while (j >= 7) {
+ multiply(data, 1e7, 0);
+ j -= 7;
+ }
+ multiply(data, pow(10, j, 1), 0);
+ j = e - 1;
+ while (j >= 23) {
+ divide(data, 1 << 23);
+ j -= 23;
+ }
+ divide(data, 1 << j);
+ multiply(data, 1, 1);
+ divide(data, 2);
+ result = dataToString(data);
+ } else {
+ multiply(data, 0, z);
+ multiply(data, 1 << -e, 0);
+ result = dataToString(data) + repeat.call('0', fractDigits);
+ }
+ }
+ if (fractDigits > 0) {
+ k = result.length;
+ result = sign + (k <= fractDigits
+ ? '0.' + repeat.call('0', fractDigits - k) + result
+ : result.slice(0, k - fractDigits) + '.' + result.slice(k - fractDigits));
+ } else {
+ result = sign + result;
+ } return result;
+ }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.number.to-precision.js":
+/*!****************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.number.to-precision.js ***!
+ \****************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js");
+var thisNumberValue = __webpack_require__(/*! ../internals/this-number-value */ "./node_modules/core-js/internals/this-number-value.js");
+
+var nativeToPrecision = 1.0.toPrecision;
+
+var FORCED = fails(function () {
+ // IE7-
+ return nativeToPrecision.call(1, undefined) !== '1';
+}) || !fails(function () {
+ // V8 ~ Android 4.3-
+ nativeToPrecision.call({});
+});
+
+// `Number.prototype.toPrecision` method
+// https://tc39.es/ecma262/#sec-number.prototype.toprecision
+$({ target: 'Number', proto: true, forced: FORCED }, {
+ toPrecision: function toPrecision(precision) {
+ return precision === undefined
+ ? nativeToPrecision.call(thisNumberValue(this))
+ : nativeToPrecision.call(thisNumberValue(this), precision);
+ }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.object.assign.js":
+/*!**********************************************************!*\
+ !*** ./node_modules/core-js/modules/es.object.assign.js ***!
+ \**********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var assign = __webpack_require__(/*! ../internals/object-assign */ "./node_modules/core-js/internals/object-assign.js");
+
+// `Object.assign` method
+// https://tc39.es/ecma262/#sec-object.assign
+// eslint-disable-next-line es/no-object-assign -- required for testing
+$({ target: 'Object', stat: true, forced: Object.assign !== assign }, {
+ assign: assign
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.object.create.js":
+/*!**********************************************************!*\
+ !*** ./node_modules/core-js/modules/es.object.create.js ***!
+ \**********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/core-js/internals/descriptors.js");
+var create = __webpack_require__(/*! ../internals/object-create */ "./node_modules/core-js/internals/object-create.js");
+
+// `Object.create` method
+// https://tc39.es/ecma262/#sec-object.create
+$({ target: 'Object', stat: true, sham: !DESCRIPTORS }, {
+ create: create
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.object.define-getter.js":
+/*!*****************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.object.define-getter.js ***!
+ \*****************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/core-js/internals/descriptors.js");
+var FORCED = __webpack_require__(/*! ../internals/object-prototype-accessors-forced */ "./node_modules/core-js/internals/object-prototype-accessors-forced.js");
+var aCallable = __webpack_require__(/*! ../internals/a-callable */ "./node_modules/core-js/internals/a-callable.js");
+var toObject = __webpack_require__(/*! ../internals/to-object */ "./node_modules/core-js/internals/to-object.js");
+var definePropertyModule = __webpack_require__(/*! ../internals/object-define-property */ "./node_modules/core-js/internals/object-define-property.js");
+
+// `Object.prototype.__defineGetter__` method
+// https://tc39.es/ecma262/#sec-object.prototype.__defineGetter__
+if (DESCRIPTORS) {
+ $({ target: 'Object', proto: true, forced: FORCED }, {
+ __defineGetter__: function __defineGetter__(P, getter) {
+ definePropertyModule.f(toObject(this), P, { get: aCallable(getter), enumerable: true, configurable: true });
+ }
+ });
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.object.define-properties.js":
+/*!*********************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.object.define-properties.js ***!
+ \*********************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/core-js/internals/descriptors.js");
+var defineProperties = __webpack_require__(/*! ../internals/object-define-properties */ "./node_modules/core-js/internals/object-define-properties.js");
+
+// `Object.defineProperties` method
+// https://tc39.es/ecma262/#sec-object.defineproperties
+$({ target: 'Object', stat: true, forced: !DESCRIPTORS, sham: !DESCRIPTORS }, {
+ defineProperties: defineProperties
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.object.define-property.js":
+/*!*******************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.object.define-property.js ***!
+ \*******************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/core-js/internals/descriptors.js");
+var objectDefinePropertyModile = __webpack_require__(/*! ../internals/object-define-property */ "./node_modules/core-js/internals/object-define-property.js");
+
+// `Object.defineProperty` method
+// https://tc39.es/ecma262/#sec-object.defineproperty
+$({ target: 'Object', stat: true, forced: !DESCRIPTORS, sham: !DESCRIPTORS }, {
+ defineProperty: objectDefinePropertyModile.f
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.object.define-setter.js":
+/*!*****************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.object.define-setter.js ***!
+ \*****************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/core-js/internals/descriptors.js");
+var FORCED = __webpack_require__(/*! ../internals/object-prototype-accessors-forced */ "./node_modules/core-js/internals/object-prototype-accessors-forced.js");
+var aCallable = __webpack_require__(/*! ../internals/a-callable */ "./node_modules/core-js/internals/a-callable.js");
+var toObject = __webpack_require__(/*! ../internals/to-object */ "./node_modules/core-js/internals/to-object.js");
+var definePropertyModule = __webpack_require__(/*! ../internals/object-define-property */ "./node_modules/core-js/internals/object-define-property.js");
+
+// `Object.prototype.__defineSetter__` method
+// https://tc39.es/ecma262/#sec-object.prototype.__defineSetter__
+if (DESCRIPTORS) {
+ $({ target: 'Object', proto: true, forced: FORCED }, {
+ __defineSetter__: function __defineSetter__(P, setter) {
+ definePropertyModule.f(toObject(this), P, { set: aCallable(setter), enumerable: true, configurable: true });
+ }
+ });
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.object.entries.js":
+/*!***********************************************************!*\
+ !*** ./node_modules/core-js/modules/es.object.entries.js ***!
+ \***********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var $entries = __webpack_require__(/*! ../internals/object-to-array */ "./node_modules/core-js/internals/object-to-array.js").entries;
+
+// `Object.entries` method
+// https://tc39.es/ecma262/#sec-object.entries
+$({ target: 'Object', stat: true }, {
+ entries: function entries(O) {
+ return $entries(O);
+ }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.object.freeze.js":
+/*!**********************************************************!*\
+ !*** ./node_modules/core-js/modules/es.object.freeze.js ***!
+ \**********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var FREEZING = __webpack_require__(/*! ../internals/freezing */ "./node_modules/core-js/internals/freezing.js");
+var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js");
+var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/core-js/internals/is-object.js");
+var onFreeze = __webpack_require__(/*! ../internals/internal-metadata */ "./node_modules/core-js/internals/internal-metadata.js").onFreeze;
+
+// eslint-disable-next-line es/no-object-freeze -- safe
+var $freeze = Object.freeze;
+var FAILS_ON_PRIMITIVES = fails(function () { $freeze(1); });
+
+// `Object.freeze` method
+// https://tc39.es/ecma262/#sec-object.freeze
+$({ target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES, sham: !FREEZING }, {
+ freeze: function freeze(it) {
+ return $freeze && isObject(it) ? $freeze(onFreeze(it)) : it;
+ }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.object.from-entries.js":
+/*!****************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.object.from-entries.js ***!
+ \****************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var iterate = __webpack_require__(/*! ../internals/iterate */ "./node_modules/core-js/internals/iterate.js");
+var createProperty = __webpack_require__(/*! ../internals/create-property */ "./node_modules/core-js/internals/create-property.js");
+
+// `Object.fromEntries` method
+// https://github.com/tc39/proposal-object-from-entries
+$({ target: 'Object', stat: true }, {
+ fromEntries: function fromEntries(iterable) {
+ var obj = {};
+ iterate(iterable, function (k, v) {
+ createProperty(obj, k, v);
+ }, { AS_ENTRIES: true });
+ return obj;
+ }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.object.get-own-property-descriptor.js":
+/*!*******************************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.object.get-own-property-descriptor.js ***!
+ \*******************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js");
+var toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ "./node_modules/core-js/internals/to-indexed-object.js");
+var nativeGetOwnPropertyDescriptor = __webpack_require__(/*! ../internals/object-get-own-property-descriptor */ "./node_modules/core-js/internals/object-get-own-property-descriptor.js").f;
+var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/core-js/internals/descriptors.js");
+
+var FAILS_ON_PRIMITIVES = fails(function () { nativeGetOwnPropertyDescriptor(1); });
+var FORCED = !DESCRIPTORS || FAILS_ON_PRIMITIVES;
+
+// `Object.getOwnPropertyDescriptor` method
+// https://tc39.es/ecma262/#sec-object.getownpropertydescriptor
+$({ target: 'Object', stat: true, forced: FORCED, sham: !DESCRIPTORS }, {
+ getOwnPropertyDescriptor: function getOwnPropertyDescriptor(it, key) {
+ return nativeGetOwnPropertyDescriptor(toIndexedObject(it), key);
+ }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.object.get-own-property-descriptors.js":
+/*!********************************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.object.get-own-property-descriptors.js ***!
+ \********************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/core-js/internals/descriptors.js");
+var ownKeys = __webpack_require__(/*! ../internals/own-keys */ "./node_modules/core-js/internals/own-keys.js");
+var toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ "./node_modules/core-js/internals/to-indexed-object.js");
+var getOwnPropertyDescriptorModule = __webpack_require__(/*! ../internals/object-get-own-property-descriptor */ "./node_modules/core-js/internals/object-get-own-property-descriptor.js");
+var createProperty = __webpack_require__(/*! ../internals/create-property */ "./node_modules/core-js/internals/create-property.js");
+
+// `Object.getOwnPropertyDescriptors` method
+// https://tc39.es/ecma262/#sec-object.getownpropertydescriptors
+$({ target: 'Object', stat: true, sham: !DESCRIPTORS }, {
+ getOwnPropertyDescriptors: function getOwnPropertyDescriptors(object) {
+ var O = toIndexedObject(object);
+ var getOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f;
+ var keys = ownKeys(O);
+ var result = {};
+ var index = 0;
+ var key, descriptor;
+ while (keys.length > index) {
+ descriptor = getOwnPropertyDescriptor(O, key = keys[index++]);
+ if (descriptor !== undefined) createProperty(result, key, descriptor);
+ }
+ return result;
+ }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.object.get-own-property-names.js":
+/*!**************************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.object.get-own-property-names.js ***!
+ \**************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js");
+var getOwnPropertyNames = __webpack_require__(/*! ../internals/object-get-own-property-names-external */ "./node_modules/core-js/internals/object-get-own-property-names-external.js").f;
+
+// eslint-disable-next-line es/no-object-getownpropertynames -- required for testing
+var FAILS_ON_PRIMITIVES = fails(function () { return !Object.getOwnPropertyNames(1); });
+
+// `Object.getOwnPropertyNames` method
+// https://tc39.es/ecma262/#sec-object.getownpropertynames
+$({ target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES }, {
+ getOwnPropertyNames: getOwnPropertyNames
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.object.get-prototype-of.js":
+/*!********************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.object.get-prototype-of.js ***!
+ \********************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js");
+var toObject = __webpack_require__(/*! ../internals/to-object */ "./node_modules/core-js/internals/to-object.js");
+var nativeGetPrototypeOf = __webpack_require__(/*! ../internals/object-get-prototype-of */ "./node_modules/core-js/internals/object-get-prototype-of.js");
+var CORRECT_PROTOTYPE_GETTER = __webpack_require__(/*! ../internals/correct-prototype-getter */ "./node_modules/core-js/internals/correct-prototype-getter.js");
+
+var FAILS_ON_PRIMITIVES = fails(function () { nativeGetPrototypeOf(1); });
+
+// `Object.getPrototypeOf` method
+// https://tc39.es/ecma262/#sec-object.getprototypeof
+$({ target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES, sham: !CORRECT_PROTOTYPE_GETTER }, {
+ getPrototypeOf: function getPrototypeOf(it) {
+ return nativeGetPrototypeOf(toObject(it));
+ }
+});
+
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.object.has-own.js":
+/*!***********************************************************!*\
+ !*** ./node_modules/core-js/modules/es.object.has-own.js ***!
+ \***********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var hasOwn = __webpack_require__(/*! ../internals/has */ "./node_modules/core-js/internals/has.js");
+
+// `Object.hasOwn` method
+// https://github.com/tc39/proposal-accessible-object-hasownproperty
+$({ target: 'Object', stat: true }, {
+ hasOwn: hasOwn
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.object.is-extensible.js":
+/*!*****************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.object.is-extensible.js ***!
+ \*****************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js");
+var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/core-js/internals/is-object.js");
+
+// eslint-disable-next-line es/no-object-isextensible -- safe
+var $isExtensible = Object.isExtensible;
+var FAILS_ON_PRIMITIVES = fails(function () { $isExtensible(1); });
+
+// `Object.isExtensible` method
+// https://tc39.es/ecma262/#sec-object.isextensible
+$({ target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES }, {
+ isExtensible: function isExtensible(it) {
+ return isObject(it) ? $isExtensible ? $isExtensible(it) : true : false;
+ }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.object.is-frozen.js":
+/*!*************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.object.is-frozen.js ***!
+ \*************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js");
+var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/core-js/internals/is-object.js");
+
+// eslint-disable-next-line es/no-object-isfrozen -- safe
+var $isFrozen = Object.isFrozen;
+var FAILS_ON_PRIMITIVES = fails(function () { $isFrozen(1); });
+
+// `Object.isFrozen` method
+// https://tc39.es/ecma262/#sec-object.isfrozen
+$({ target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES }, {
+ isFrozen: function isFrozen(it) {
+ return isObject(it) ? $isFrozen ? $isFrozen(it) : false : true;
+ }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.object.is-sealed.js":
+/*!*************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.object.is-sealed.js ***!
+ \*************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js");
+var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/core-js/internals/is-object.js");
+
+// eslint-disable-next-line es/no-object-issealed -- safe
+var $isSealed = Object.isSealed;
+var FAILS_ON_PRIMITIVES = fails(function () { $isSealed(1); });
+
+// `Object.isSealed` method
+// https://tc39.es/ecma262/#sec-object.issealed
+$({ target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES }, {
+ isSealed: function isSealed(it) {
+ return isObject(it) ? $isSealed ? $isSealed(it) : false : true;
+ }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.object.is.js":
+/*!******************************************************!*\
+ !*** ./node_modules/core-js/modules/es.object.is.js ***!
+ \******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var is = __webpack_require__(/*! ../internals/same-value */ "./node_modules/core-js/internals/same-value.js");
+
+// `Object.is` method
+// https://tc39.es/ecma262/#sec-object.is
+$({ target: 'Object', stat: true }, {
+ is: is
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.object.keys.js":
+/*!********************************************************!*\
+ !*** ./node_modules/core-js/modules/es.object.keys.js ***!
+ \********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var toObject = __webpack_require__(/*! ../internals/to-object */ "./node_modules/core-js/internals/to-object.js");
+var nativeKeys = __webpack_require__(/*! ../internals/object-keys */ "./node_modules/core-js/internals/object-keys.js");
+var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js");
+
+var FAILS_ON_PRIMITIVES = fails(function () { nativeKeys(1); });
+
+// `Object.keys` method
+// https://tc39.es/ecma262/#sec-object.keys
+$({ target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES }, {
+ keys: function keys(it) {
+ return nativeKeys(toObject(it));
+ }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.object.lookup-getter.js":
+/*!*****************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.object.lookup-getter.js ***!
+ \*****************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/core-js/internals/descriptors.js");
+var FORCED = __webpack_require__(/*! ../internals/object-prototype-accessors-forced */ "./node_modules/core-js/internals/object-prototype-accessors-forced.js");
+var toObject = __webpack_require__(/*! ../internals/to-object */ "./node_modules/core-js/internals/to-object.js");
+var toPropertyKey = __webpack_require__(/*! ../internals/to-property-key */ "./node_modules/core-js/internals/to-property-key.js");
+var getPrototypeOf = __webpack_require__(/*! ../internals/object-get-prototype-of */ "./node_modules/core-js/internals/object-get-prototype-of.js");
+var getOwnPropertyDescriptor = __webpack_require__(/*! ../internals/object-get-own-property-descriptor */ "./node_modules/core-js/internals/object-get-own-property-descriptor.js").f;
+
+// `Object.prototype.__lookupGetter__` method
+// https://tc39.es/ecma262/#sec-object.prototype.__lookupGetter__
+if (DESCRIPTORS) {
+ $({ target: 'Object', proto: true, forced: FORCED }, {
+ __lookupGetter__: function __lookupGetter__(P) {
+ var O = toObject(this);
+ var key = toPropertyKey(P);
+ var desc;
+ do {
+ if (desc = getOwnPropertyDescriptor(O, key)) return desc.get;
+ } while (O = getPrototypeOf(O));
+ }
+ });
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.object.lookup-setter.js":
+/*!*****************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.object.lookup-setter.js ***!
+ \*****************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/core-js/internals/descriptors.js");
+var FORCED = __webpack_require__(/*! ../internals/object-prototype-accessors-forced */ "./node_modules/core-js/internals/object-prototype-accessors-forced.js");
+var toObject = __webpack_require__(/*! ../internals/to-object */ "./node_modules/core-js/internals/to-object.js");
+var toPropertyKey = __webpack_require__(/*! ../internals/to-property-key */ "./node_modules/core-js/internals/to-property-key.js");
+var getPrototypeOf = __webpack_require__(/*! ../internals/object-get-prototype-of */ "./node_modules/core-js/internals/object-get-prototype-of.js");
+var getOwnPropertyDescriptor = __webpack_require__(/*! ../internals/object-get-own-property-descriptor */ "./node_modules/core-js/internals/object-get-own-property-descriptor.js").f;
+
+// `Object.prototype.__lookupSetter__` method
+// https://tc39.es/ecma262/#sec-object.prototype.__lookupSetter__
+if (DESCRIPTORS) {
+ $({ target: 'Object', proto: true, forced: FORCED }, {
+ __lookupSetter__: function __lookupSetter__(P) {
+ var O = toObject(this);
+ var key = toPropertyKey(P);
+ var desc;
+ do {
+ if (desc = getOwnPropertyDescriptor(O, key)) return desc.set;
+ } while (O = getPrototypeOf(O));
+ }
+ });
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.object.prevent-extensions.js":
+/*!**********************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.object.prevent-extensions.js ***!
+ \**********************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/core-js/internals/is-object.js");
+var onFreeze = __webpack_require__(/*! ../internals/internal-metadata */ "./node_modules/core-js/internals/internal-metadata.js").onFreeze;
+var FREEZING = __webpack_require__(/*! ../internals/freezing */ "./node_modules/core-js/internals/freezing.js");
+var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js");
+
+// eslint-disable-next-line es/no-object-preventextensions -- safe
+var $preventExtensions = Object.preventExtensions;
+var FAILS_ON_PRIMITIVES = fails(function () { $preventExtensions(1); });
+
+// `Object.preventExtensions` method
+// https://tc39.es/ecma262/#sec-object.preventextensions
+$({ target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES, sham: !FREEZING }, {
+ preventExtensions: function preventExtensions(it) {
+ return $preventExtensions && isObject(it) ? $preventExtensions(onFreeze(it)) : it;
+ }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.object.seal.js":
+/*!********************************************************!*\
+ !*** ./node_modules/core-js/modules/es.object.seal.js ***!
+ \********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/core-js/internals/is-object.js");
+var onFreeze = __webpack_require__(/*! ../internals/internal-metadata */ "./node_modules/core-js/internals/internal-metadata.js").onFreeze;
+var FREEZING = __webpack_require__(/*! ../internals/freezing */ "./node_modules/core-js/internals/freezing.js");
+var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js");
+
+// eslint-disable-next-line es/no-object-seal -- safe
+var $seal = Object.seal;
+var FAILS_ON_PRIMITIVES = fails(function () { $seal(1); });
+
+// `Object.seal` method
+// https://tc39.es/ecma262/#sec-object.seal
+$({ target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES, sham: !FREEZING }, {
+ seal: function seal(it) {
+ return $seal && isObject(it) ? $seal(onFreeze(it)) : it;
+ }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.object.set-prototype-of.js":
+/*!********************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.object.set-prototype-of.js ***!
+ \********************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var setPrototypeOf = __webpack_require__(/*! ../internals/object-set-prototype-of */ "./node_modules/core-js/internals/object-set-prototype-of.js");
+
+// `Object.setPrototypeOf` method
+// https://tc39.es/ecma262/#sec-object.setprototypeof
+$({ target: 'Object', stat: true }, {
+ setPrototypeOf: setPrototypeOf
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.object.to-string.js":
+/*!*************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.object.to-string.js ***!
+ \*************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var TO_STRING_TAG_SUPPORT = __webpack_require__(/*! ../internals/to-string-tag-support */ "./node_modules/core-js/internals/to-string-tag-support.js");
+var redefine = __webpack_require__(/*! ../internals/redefine */ "./node_modules/core-js/internals/redefine.js");
+var toString = __webpack_require__(/*! ../internals/object-to-string */ "./node_modules/core-js/internals/object-to-string.js");
+
+// `Object.prototype.toString` method
+// https://tc39.es/ecma262/#sec-object.prototype.tostring
+if (!TO_STRING_TAG_SUPPORT) {
+ redefine(Object.prototype, 'toString', toString, { unsafe: true });
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.object.values.js":
+/*!**********************************************************!*\
+ !*** ./node_modules/core-js/modules/es.object.values.js ***!
+ \**********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var $values = __webpack_require__(/*! ../internals/object-to-array */ "./node_modules/core-js/internals/object-to-array.js").values;
+
+// `Object.values` method
+// https://tc39.es/ecma262/#sec-object.values
+$({ target: 'Object', stat: true }, {
+ values: function values(O) {
+ return $values(O);
+ }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.parse-float.js":
+/*!********************************************************!*\
+ !*** ./node_modules/core-js/modules/es.parse-float.js ***!
+ \********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var $parseFloat = __webpack_require__(/*! ../internals/number-parse-float */ "./node_modules/core-js/internals/number-parse-float.js");
+
+// `parseFloat` method
+// https://tc39.es/ecma262/#sec-parsefloat-string
+$({ global: true, forced: parseFloat != $parseFloat }, {
+ parseFloat: $parseFloat
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.parse-int.js":
+/*!******************************************************!*\
+ !*** ./node_modules/core-js/modules/es.parse-int.js ***!
+ \******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var $parseInt = __webpack_require__(/*! ../internals/number-parse-int */ "./node_modules/core-js/internals/number-parse-int.js");
+
+// `parseInt` method
+// https://tc39.es/ecma262/#sec-parseint-string-radix
+$({ global: true, forced: parseInt != $parseInt }, {
+ parseInt: $parseInt
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.promise.all-settled.js":
+/*!****************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.promise.all-settled.js ***!
+ \****************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var aCallable = __webpack_require__(/*! ../internals/a-callable */ "./node_modules/core-js/internals/a-callable.js");
+var newPromiseCapabilityModule = __webpack_require__(/*! ../internals/new-promise-capability */ "./node_modules/core-js/internals/new-promise-capability.js");
+var perform = __webpack_require__(/*! ../internals/perform */ "./node_modules/core-js/internals/perform.js");
+var iterate = __webpack_require__(/*! ../internals/iterate */ "./node_modules/core-js/internals/iterate.js");
+
+// `Promise.allSettled` method
+// https://tc39.es/ecma262/#sec-promise.allsettled
+$({ target: 'Promise', stat: true }, {
+ allSettled: function allSettled(iterable) {
+ var C = this;
+ var capability = newPromiseCapabilityModule.f(C);
+ var resolve = capability.resolve;
+ var reject = capability.reject;
+ var result = perform(function () {
+ var promiseResolve = aCallable(C.resolve);
+ var values = [];
+ var counter = 0;
+ var remaining = 1;
+ iterate(iterable, function (promise) {
+ var index = counter++;
+ var alreadyCalled = false;
+ values.push(undefined);
+ remaining++;
+ promiseResolve.call(C, promise).then(function (value) {
+ if (alreadyCalled) return;
+ alreadyCalled = true;
+ values[index] = { status: 'fulfilled', value: value };
+ --remaining || resolve(values);
+ }, function (error) {
+ if (alreadyCalled) return;
+ alreadyCalled = true;
+ values[index] = { status: 'rejected', reason: error };
+ --remaining || resolve(values);
+ });
+ });
+ --remaining || resolve(values);
+ });
+ if (result.error) reject(result.value);
+ return capability.promise;
+ }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.promise.any.js":
+/*!********************************************************!*\
+ !*** ./node_modules/core-js/modules/es.promise.any.js ***!
+ \********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var aCallable = __webpack_require__(/*! ../internals/a-callable */ "./node_modules/core-js/internals/a-callable.js");
+var getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ "./node_modules/core-js/internals/get-built-in.js");
+var newPromiseCapabilityModule = __webpack_require__(/*! ../internals/new-promise-capability */ "./node_modules/core-js/internals/new-promise-capability.js");
+var perform = __webpack_require__(/*! ../internals/perform */ "./node_modules/core-js/internals/perform.js");
+var iterate = __webpack_require__(/*! ../internals/iterate */ "./node_modules/core-js/internals/iterate.js");
+
+var PROMISE_ANY_ERROR = 'No one promise resolved';
+
+// `Promise.any` method
+// https://tc39.es/ecma262/#sec-promise.any
+$({ target: 'Promise', stat: true }, {
+ any: function any(iterable) {
+ var C = this;
+ var capability = newPromiseCapabilityModule.f(C);
+ var resolve = capability.resolve;
+ var reject = capability.reject;
+ var result = perform(function () {
+ var promiseResolve = aCallable(C.resolve);
+ var errors = [];
+ var counter = 0;
+ var remaining = 1;
+ var alreadyResolved = false;
+ iterate(iterable, function (promise) {
+ var index = counter++;
+ var alreadyRejected = false;
+ errors.push(undefined);
+ remaining++;
+ promiseResolve.call(C, promise).then(function (value) {
+ if (alreadyRejected || alreadyResolved) return;
+ alreadyResolved = true;
+ resolve(value);
+ }, function (error) {
+ if (alreadyRejected || alreadyResolved) return;
+ alreadyRejected = true;
+ errors[index] = error;
+ --remaining || reject(new (getBuiltIn('AggregateError'))(errors, PROMISE_ANY_ERROR));
+ });
+ });
+ --remaining || reject(new (getBuiltIn('AggregateError'))(errors, PROMISE_ANY_ERROR));
+ });
+ if (result.error) reject(result.value);
+ return capability.promise;
+ }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.promise.finally.js":
+/*!************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.promise.finally.js ***!
+ \************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var IS_PURE = __webpack_require__(/*! ../internals/is-pure */ "./node_modules/core-js/internals/is-pure.js");
+var NativePromise = __webpack_require__(/*! ../internals/native-promise-constructor */ "./node_modules/core-js/internals/native-promise-constructor.js");
+var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js");
+var getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ "./node_modules/core-js/internals/get-built-in.js");
+var isCallable = __webpack_require__(/*! ../internals/is-callable */ "./node_modules/core-js/internals/is-callable.js");
+var speciesConstructor = __webpack_require__(/*! ../internals/species-constructor */ "./node_modules/core-js/internals/species-constructor.js");
+var promiseResolve = __webpack_require__(/*! ../internals/promise-resolve */ "./node_modules/core-js/internals/promise-resolve.js");
+var redefine = __webpack_require__(/*! ../internals/redefine */ "./node_modules/core-js/internals/redefine.js");
+
+// Safari bug https://bugs.webkit.org/show_bug.cgi?id=200829
+var NON_GENERIC = !!NativePromise && fails(function () {
+ NativePromise.prototype['finally'].call({ then: function () { /* empty */ } }, function () { /* empty */ });
+});
+
+// `Promise.prototype.finally` method
+// https://tc39.es/ecma262/#sec-promise.prototype.finally
+$({ target: 'Promise', proto: true, real: true, forced: NON_GENERIC }, {
+ 'finally': function (onFinally) {
+ var C = speciesConstructor(this, getBuiltIn('Promise'));
+ var isFunction = isCallable(onFinally);
+ return this.then(
+ isFunction ? function (x) {
+ return promiseResolve(C, onFinally()).then(function () { return x; });
+ } : onFinally,
+ isFunction ? function (e) {
+ return promiseResolve(C, onFinally()).then(function () { throw e; });
+ } : onFinally
+ );
+ }
+});
+
+// makes sure that native promise-based APIs `Promise#finally` properly works with patched `Promise#then`
+if (!IS_PURE && isCallable(NativePromise)) {
+ var method = getBuiltIn('Promise').prototype['finally'];
+ if (NativePromise.prototype['finally'] !== method) {
+ redefine(NativePromise.prototype, 'finally', method, { unsafe: true });
+ }
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.promise.js":
+/*!****************************************************!*\
+ !*** ./node_modules/core-js/modules/es.promise.js ***!
+ \****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var IS_PURE = __webpack_require__(/*! ../internals/is-pure */ "./node_modules/core-js/internals/is-pure.js");
+var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js");
+var getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ "./node_modules/core-js/internals/get-built-in.js");
+var NativePromise = __webpack_require__(/*! ../internals/native-promise-constructor */ "./node_modules/core-js/internals/native-promise-constructor.js");
+var redefine = __webpack_require__(/*! ../internals/redefine */ "./node_modules/core-js/internals/redefine.js");
+var redefineAll = __webpack_require__(/*! ../internals/redefine-all */ "./node_modules/core-js/internals/redefine-all.js");
+var setPrototypeOf = __webpack_require__(/*! ../internals/object-set-prototype-of */ "./node_modules/core-js/internals/object-set-prototype-of.js");
+var setToStringTag = __webpack_require__(/*! ../internals/set-to-string-tag */ "./node_modules/core-js/internals/set-to-string-tag.js");
+var setSpecies = __webpack_require__(/*! ../internals/set-species */ "./node_modules/core-js/internals/set-species.js");
+var aCallable = __webpack_require__(/*! ../internals/a-callable */ "./node_modules/core-js/internals/a-callable.js");
+var isCallable = __webpack_require__(/*! ../internals/is-callable */ "./node_modules/core-js/internals/is-callable.js");
+var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/core-js/internals/is-object.js");
+var anInstance = __webpack_require__(/*! ../internals/an-instance */ "./node_modules/core-js/internals/an-instance.js");
+var inspectSource = __webpack_require__(/*! ../internals/inspect-source */ "./node_modules/core-js/internals/inspect-source.js");
+var iterate = __webpack_require__(/*! ../internals/iterate */ "./node_modules/core-js/internals/iterate.js");
+var checkCorrectnessOfIteration = __webpack_require__(/*! ../internals/check-correctness-of-iteration */ "./node_modules/core-js/internals/check-correctness-of-iteration.js");
+var speciesConstructor = __webpack_require__(/*! ../internals/species-constructor */ "./node_modules/core-js/internals/species-constructor.js");
+var task = __webpack_require__(/*! ../internals/task */ "./node_modules/core-js/internals/task.js").set;
+var microtask = __webpack_require__(/*! ../internals/microtask */ "./node_modules/core-js/internals/microtask.js");
+var promiseResolve = __webpack_require__(/*! ../internals/promise-resolve */ "./node_modules/core-js/internals/promise-resolve.js");
+var hostReportErrors = __webpack_require__(/*! ../internals/host-report-errors */ "./node_modules/core-js/internals/host-report-errors.js");
+var newPromiseCapabilityModule = __webpack_require__(/*! ../internals/new-promise-capability */ "./node_modules/core-js/internals/new-promise-capability.js");
+var perform = __webpack_require__(/*! ../internals/perform */ "./node_modules/core-js/internals/perform.js");
+var InternalStateModule = __webpack_require__(/*! ../internals/internal-state */ "./node_modules/core-js/internals/internal-state.js");
+var isForced = __webpack_require__(/*! ../internals/is-forced */ "./node_modules/core-js/internals/is-forced.js");
+var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js");
+var IS_BROWSER = __webpack_require__(/*! ../internals/engine-is-browser */ "./node_modules/core-js/internals/engine-is-browser.js");
+var IS_NODE = __webpack_require__(/*! ../internals/engine-is-node */ "./node_modules/core-js/internals/engine-is-node.js");
+var V8_VERSION = __webpack_require__(/*! ../internals/engine-v8-version */ "./node_modules/core-js/internals/engine-v8-version.js");
+
+var SPECIES = wellKnownSymbol('species');
+var PROMISE = 'Promise';
+var getInternalState = InternalStateModule.get;
+var setInternalState = InternalStateModule.set;
+var getInternalPromiseState = InternalStateModule.getterFor(PROMISE);
+var NativePromisePrototype = NativePromise && NativePromise.prototype;
+var PromiseConstructor = NativePromise;
+var PromiseConstructorPrototype = NativePromisePrototype;
+var TypeError = global.TypeError;
+var document = global.document;
+var process = global.process;
+var newPromiseCapability = newPromiseCapabilityModule.f;
+var newGenericPromiseCapability = newPromiseCapability;
+var DISPATCH_EVENT = !!(document && document.createEvent && global.dispatchEvent);
+var NATIVE_REJECTION_EVENT = isCallable(global.PromiseRejectionEvent);
+var UNHANDLED_REJECTION = 'unhandledrejection';
+var REJECTION_HANDLED = 'rejectionhandled';
+var PENDING = 0;
+var FULFILLED = 1;
+var REJECTED = 2;
+var HANDLED = 1;
+var UNHANDLED = 2;
+var SUBCLASSING = false;
+var Internal, OwnPromiseCapability, PromiseWrapper, nativeThen;
+
+var FORCED = isForced(PROMISE, function () {
+ var PROMISE_CONSTRUCTOR_SOURCE = inspectSource(PromiseConstructor);
+ var GLOBAL_CORE_JS_PROMISE = PROMISE_CONSTRUCTOR_SOURCE !== String(PromiseConstructor);
+ // V8 6.6 (Node 10 and Chrome 66) have a bug with resolving custom thenables
+ // https://bugs.chromium.org/p/chromium/issues/detail?id=830565
+ // We can't detect it synchronously, so just check versions
+ if (!GLOBAL_CORE_JS_PROMISE && V8_VERSION === 66) return true;
+ // We need Promise#finally in the pure version for preventing prototype pollution
+ if (IS_PURE && !PromiseConstructorPrototype['finally']) return true;
+ // We can't use @@species feature detection in V8 since it causes
+ // deoptimization and performance degradation
+ // https://github.com/zloirock/core-js/issues/679
+ if (V8_VERSION >= 51 && /native code/.test(PROMISE_CONSTRUCTOR_SOURCE)) return false;
+ // Detect correctness of subclassing with @@species support
+ var promise = new PromiseConstructor(function (resolve) { resolve(1); });
+ var FakePromise = function (exec) {
+ exec(function () { /* empty */ }, function () { /* empty */ });
+ };
+ var constructor = promise.constructor = {};
+ constructor[SPECIES] = FakePromise;
+ SUBCLASSING = promise.then(function () { /* empty */ }) instanceof FakePromise;
+ if (!SUBCLASSING) return true;
+ // Unhandled rejections tracking support, NodeJS Promise without it fails @@species test
+ return !GLOBAL_CORE_JS_PROMISE && IS_BROWSER && !NATIVE_REJECTION_EVENT;
+});
+
+var INCORRECT_ITERATION = FORCED || !checkCorrectnessOfIteration(function (iterable) {
+ PromiseConstructor.all(iterable)['catch'](function () { /* empty */ });
+});
+
+// helpers
+var isThenable = function (it) {
+ var then;
+ return isObject(it) && isCallable(then = it.then) ? then : false;
+};
+
+var notify = function (state, isReject) {
+ if (state.notified) return;
+ state.notified = true;
+ var chain = state.reactions;
+ microtask(function () {
+ var value = state.value;
+ var ok = state.state == FULFILLED;
+ var index = 0;
+ // variable length - can't use forEach
+ while (chain.length > index) {
+ var reaction = chain[index++];
+ var handler = ok ? reaction.ok : reaction.fail;
+ var resolve = reaction.resolve;
+ var reject = reaction.reject;
+ var domain = reaction.domain;
+ var result, then, exited;
+ try {
+ if (handler) {
+ if (!ok) {
+ if (state.rejection === UNHANDLED) onHandleUnhandled(state);
+ state.rejection = HANDLED;
+ }
+ if (handler === true) result = value;
+ else {
+ if (domain) domain.enter();
+ result = handler(value); // can throw
+ if (domain) {
+ domain.exit();
+ exited = true;
+ }
+ }
+ if (result === reaction.promise) {
+ reject(TypeError('Promise-chain cycle'));
+ } else if (then = isThenable(result)) {
+ then.call(result, resolve, reject);
+ } else resolve(result);
+ } else reject(value);
+ } catch (error) {
+ if (domain && !exited) domain.exit();
+ reject(error);
+ }
+ }
+ state.reactions = [];
+ state.notified = false;
+ if (isReject && !state.rejection) onUnhandled(state);
+ });
+};
+
+var dispatchEvent = function (name, promise, reason) {
+ var event, handler;
+ if (DISPATCH_EVENT) {
+ event = document.createEvent('Event');
+ event.promise = promise;
+ event.reason = reason;
+ event.initEvent(name, false, true);
+ global.dispatchEvent(event);
+ } else event = { promise: promise, reason: reason };
+ if (!NATIVE_REJECTION_EVENT && (handler = global['on' + name])) handler(event);
+ else if (name === UNHANDLED_REJECTION) hostReportErrors('Unhandled promise rejection', reason);
+};
+
+var onUnhandled = function (state) {
+ task.call(global, function () {
+ var promise = state.facade;
+ var value = state.value;
+ var IS_UNHANDLED = isUnhandled(state);
+ var result;
+ if (IS_UNHANDLED) {
+ result = perform(function () {
+ if (IS_NODE) {
+ process.emit('unhandledRejection', value, promise);
+ } else dispatchEvent(UNHANDLED_REJECTION, promise, value);
+ });
+ // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should
+ state.rejection = IS_NODE || isUnhandled(state) ? UNHANDLED : HANDLED;
+ if (result.error) throw result.value;
+ }
+ });
+};
+
+var isUnhandled = function (state) {
+ return state.rejection !== HANDLED && !state.parent;
+};
+
+var onHandleUnhandled = function (state) {
+ task.call(global, function () {
+ var promise = state.facade;
+ if (IS_NODE) {
+ process.emit('rejectionHandled', promise);
+ } else dispatchEvent(REJECTION_HANDLED, promise, state.value);
+ });
+};
+
+var bind = function (fn, state, unwrap) {
+ return function (value) {
+ fn(state, value, unwrap);
+ };
+};
+
+var internalReject = function (state, value, unwrap) {
+ if (state.done) return;
+ state.done = true;
+ if (unwrap) state = unwrap;
+ state.value = value;
+ state.state = REJECTED;
+ notify(state, true);
+};
+
+var internalResolve = function (state, value, unwrap) {
+ if (state.done) return;
+ state.done = true;
+ if (unwrap) state = unwrap;
+ try {
+ if (state.facade === value) throw TypeError("Promise can't be resolved itself");
+ var then = isThenable(value);
+ if (then) {
+ microtask(function () {
+ var wrapper = { done: false };
+ try {
+ then.call(value,
+ bind(internalResolve, wrapper, state),
+ bind(internalReject, wrapper, state)
+ );
+ } catch (error) {
+ internalReject(wrapper, error, state);
+ }
+ });
+ } else {
+ state.value = value;
+ state.state = FULFILLED;
+ notify(state, false);
+ }
+ } catch (error) {
+ internalReject({ done: false }, error, state);
+ }
+};
+
+// constructor polyfill
+if (FORCED) {
+ // 25.4.3.1 Promise(executor)
+ PromiseConstructor = function Promise(executor) {
+ anInstance(this, PromiseConstructor, PROMISE);
+ aCallable(executor);
+ Internal.call(this);
+ var state = getInternalState(this);
+ try {
+ executor(bind(internalResolve, state), bind(internalReject, state));
+ } catch (error) {
+ internalReject(state, error);
+ }
+ };
+ PromiseConstructorPrototype = PromiseConstructor.prototype;
+ // eslint-disable-next-line no-unused-vars -- required for `.length`
+ Internal = function Promise(executor) {
+ setInternalState(this, {
+ type: PROMISE,
+ done: false,
+ notified: false,
+ parent: false,
+ reactions: [],
+ rejection: false,
+ state: PENDING,
+ value: undefined
+ });
+ };
+ Internal.prototype = redefineAll(PromiseConstructorPrototype, {
+ // `Promise.prototype.then` method
+ // https://tc39.es/ecma262/#sec-promise.prototype.then
+ then: function then(onFulfilled, onRejected) {
+ var state = getInternalPromiseState(this);
+ var reaction = newPromiseCapability(speciesConstructor(this, PromiseConstructor));
+ reaction.ok = isCallable(onFulfilled) ? onFulfilled : true;
+ reaction.fail = isCallable(onRejected) && onRejected;
+ reaction.domain = IS_NODE ? process.domain : undefined;
+ state.parent = true;
+ state.reactions.push(reaction);
+ if (state.state != PENDING) notify(state, false);
+ return reaction.promise;
+ },
+ // `Promise.prototype.catch` method
+ // https://tc39.es/ecma262/#sec-promise.prototype.catch
+ 'catch': function (onRejected) {
+ return this.then(undefined, onRejected);
+ }
+ });
+ OwnPromiseCapability = function () {
+ var promise = new Internal();
+ var state = getInternalState(promise);
+ this.promise = promise;
+ this.resolve = bind(internalResolve, state);
+ this.reject = bind(internalReject, state);
+ };
+ newPromiseCapabilityModule.f = newPromiseCapability = function (C) {
+ return C === PromiseConstructor || C === PromiseWrapper
+ ? new OwnPromiseCapability(C)
+ : newGenericPromiseCapability(C);
+ };
+
+ if (!IS_PURE && isCallable(NativePromise) && NativePromisePrototype !== Object.prototype) {
+ nativeThen = NativePromisePrototype.then;
+
+ if (!SUBCLASSING) {
+ // make `Promise#then` return a polyfilled `Promise` for native promise-based APIs
+ redefine(NativePromisePrototype, 'then', function then(onFulfilled, onRejected) {
+ var that = this;
+ return new PromiseConstructor(function (resolve, reject) {
+ nativeThen.call(that, resolve, reject);
+ }).then(onFulfilled, onRejected);
+ // https://github.com/zloirock/core-js/issues/640
+ }, { unsafe: true });
+
+ // makes sure that native promise-based APIs `Promise#catch` properly works with patched `Promise#then`
+ redefine(NativePromisePrototype, 'catch', PromiseConstructorPrototype['catch'], { unsafe: true });
+ }
+
+ // make `.constructor === Promise` work for native promise-based APIs
+ try {
+ delete NativePromisePrototype.constructor;
+ } catch (error) { /* empty */ }
+
+ // make `instanceof Promise` work for native promise-based APIs
+ if (setPrototypeOf) {
+ setPrototypeOf(NativePromisePrototype, PromiseConstructorPrototype);
+ }
+ }
+}
+
+$({ global: true, wrap: true, forced: FORCED }, {
+ Promise: PromiseConstructor
+});
+
+setToStringTag(PromiseConstructor, PROMISE, false, true);
+setSpecies(PROMISE);
+
+PromiseWrapper = getBuiltIn(PROMISE);
+
+// statics
+$({ target: PROMISE, stat: true, forced: FORCED }, {
+ // `Promise.reject` method
+ // https://tc39.es/ecma262/#sec-promise.reject
+ reject: function reject(r) {
+ var capability = newPromiseCapability(this);
+ capability.reject.call(undefined, r);
+ return capability.promise;
+ }
+});
+
+$({ target: PROMISE, stat: true, forced: IS_PURE || FORCED }, {
+ // `Promise.resolve` method
+ // https://tc39.es/ecma262/#sec-promise.resolve
+ resolve: function resolve(x) {
+ return promiseResolve(IS_PURE && this === PromiseWrapper ? PromiseConstructor : this, x);
+ }
+});
+
+$({ target: PROMISE, stat: true, forced: INCORRECT_ITERATION }, {
+ // `Promise.all` method
+ // https://tc39.es/ecma262/#sec-promise.all
+ all: function all(iterable) {
+ var C = this;
+ var capability = newPromiseCapability(C);
+ var resolve = capability.resolve;
+ var reject = capability.reject;
+ var result = perform(function () {
+ var $promiseResolve = aCallable(C.resolve);
+ var values = [];
+ var counter = 0;
+ var remaining = 1;
+ iterate(iterable, function (promise) {
+ var index = counter++;
+ var alreadyCalled = false;
+ values.push(undefined);
+ remaining++;
+ $promiseResolve.call(C, promise).then(function (value) {
+ if (alreadyCalled) return;
+ alreadyCalled = true;
+ values[index] = value;
+ --remaining || resolve(values);
+ }, reject);
+ });
+ --remaining || resolve(values);
+ });
+ if (result.error) reject(result.value);
+ return capability.promise;
+ },
+ // `Promise.race` method
+ // https://tc39.es/ecma262/#sec-promise.race
+ race: function race(iterable) {
+ var C = this;
+ var capability = newPromiseCapability(C);
+ var reject = capability.reject;
+ var result = perform(function () {
+ var $promiseResolve = aCallable(C.resolve);
+ iterate(iterable, function (promise) {
+ $promiseResolve.call(C, promise).then(capability.resolve, reject);
+ });
+ });
+ if (result.error) reject(result.value);
+ return capability.promise;
+ }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.reflect.apply.js":
+/*!**********************************************************!*\
+ !*** ./node_modules/core-js/modules/es.reflect.apply.js ***!
+ \**********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ "./node_modules/core-js/internals/get-built-in.js");
+var aCallable = __webpack_require__(/*! ../internals/a-callable */ "./node_modules/core-js/internals/a-callable.js");
+var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/core-js/internals/an-object.js");
+var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js");
+
+var nativeApply = getBuiltIn('Reflect', 'apply');
+var functionApply = Function.apply;
+
+// MS Edge argumentsList argument is optional
+var OPTIONAL_ARGUMENTS_LIST = !fails(function () {
+ nativeApply(function () { /* empty */ });
+});
+
+// `Reflect.apply` method
+// https://tc39.es/ecma262/#sec-reflect.apply
+$({ target: 'Reflect', stat: true, forced: OPTIONAL_ARGUMENTS_LIST }, {
+ apply: function apply(target, thisArgument, argumentsList) {
+ aCallable(target);
+ anObject(argumentsList);
+ return nativeApply
+ ? nativeApply(target, thisArgument, argumentsList)
+ : functionApply.call(target, thisArgument, argumentsList);
+ }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.reflect.construct.js":
+/*!**************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.reflect.construct.js ***!
+ \**************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ "./node_modules/core-js/internals/get-built-in.js");
+var aConstructor = __webpack_require__(/*! ../internals/a-constructor */ "./node_modules/core-js/internals/a-constructor.js");
+var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/core-js/internals/an-object.js");
+var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/core-js/internals/is-object.js");
+var create = __webpack_require__(/*! ../internals/object-create */ "./node_modules/core-js/internals/object-create.js");
+var bind = __webpack_require__(/*! ../internals/function-bind */ "./node_modules/core-js/internals/function-bind.js");
+var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js");
+
+var nativeConstruct = getBuiltIn('Reflect', 'construct');
+
+// `Reflect.construct` method
+// https://tc39.es/ecma262/#sec-reflect.construct
+// MS Edge supports only 2 arguments and argumentsList argument is optional
+// FF Nightly sets third argument as `new.target`, but does not create `this` from it
+var NEW_TARGET_BUG = fails(function () {
+ function F() { /* empty */ }
+ return !(nativeConstruct(function () { /* empty */ }, [], F) instanceof F);
+});
+var ARGS_BUG = !fails(function () {
+ nativeConstruct(function () { /* empty */ });
+});
+var FORCED = NEW_TARGET_BUG || ARGS_BUG;
+
+$({ target: 'Reflect', stat: true, forced: FORCED, sham: FORCED }, {
+ construct: function construct(Target, args /* , newTarget */) {
+ aConstructor(Target);
+ anObject(args);
+ var newTarget = arguments.length < 3 ? Target : aConstructor(arguments[2]);
+ if (ARGS_BUG && !NEW_TARGET_BUG) return nativeConstruct(Target, args, newTarget);
+ if (Target == newTarget) {
+ // w/o altered newTarget, optimization for 0-4 arguments
+ switch (args.length) {
+ case 0: return new Target();
+ case 1: return new Target(args[0]);
+ case 2: return new Target(args[0], args[1]);
+ case 3: return new Target(args[0], args[1], args[2]);
+ case 4: return new Target(args[0], args[1], args[2], args[3]);
+ }
+ // w/o altered newTarget, lot of arguments case
+ var $args = [null];
+ $args.push.apply($args, args);
+ return new (bind.apply(Target, $args))();
+ }
+ // with altered newTarget, not support built-in constructors
+ var proto = newTarget.prototype;
+ var instance = create(isObject(proto) ? proto : Object.prototype);
+ var result = Function.apply.call(Target, instance, args);
+ return isObject(result) ? result : instance;
+ }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.reflect.define-property.js":
+/*!********************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.reflect.define-property.js ***!
+ \********************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/core-js/internals/descriptors.js");
+var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/core-js/internals/an-object.js");
+var toPropertyKey = __webpack_require__(/*! ../internals/to-property-key */ "./node_modules/core-js/internals/to-property-key.js");
+var definePropertyModule = __webpack_require__(/*! ../internals/object-define-property */ "./node_modules/core-js/internals/object-define-property.js");
+var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js");
+
+// MS Edge has broken Reflect.defineProperty - throwing instead of returning false
+var ERROR_INSTEAD_OF_FALSE = fails(function () {
+ // eslint-disable-next-line es/no-reflect -- required for testing
+ Reflect.defineProperty(definePropertyModule.f({}, 1, { value: 1 }), 1, { value: 2 });
+});
+
+// `Reflect.defineProperty` method
+// https://tc39.es/ecma262/#sec-reflect.defineproperty
+$({ target: 'Reflect', stat: true, forced: ERROR_INSTEAD_OF_FALSE, sham: !DESCRIPTORS }, {
+ defineProperty: function defineProperty(target, propertyKey, attributes) {
+ anObject(target);
+ var key = toPropertyKey(propertyKey);
+ anObject(attributes);
+ try {
+ definePropertyModule.f(target, key, attributes);
+ return true;
+ } catch (error) {
+ return false;
+ }
+ }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.reflect.delete-property.js":
+/*!********************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.reflect.delete-property.js ***!
+ \********************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/core-js/internals/an-object.js");
+var getOwnPropertyDescriptor = __webpack_require__(/*! ../internals/object-get-own-property-descriptor */ "./node_modules/core-js/internals/object-get-own-property-descriptor.js").f;
+
+// `Reflect.deleteProperty` method
+// https://tc39.es/ecma262/#sec-reflect.deleteproperty
+$({ target: 'Reflect', stat: true }, {
+ deleteProperty: function deleteProperty(target, propertyKey) {
+ var descriptor = getOwnPropertyDescriptor(anObject(target), propertyKey);
+ return descriptor && !descriptor.configurable ? false : delete target[propertyKey];
+ }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.reflect.get-own-property-descriptor.js":
+/*!********************************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.reflect.get-own-property-descriptor.js ***!
+ \********************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/core-js/internals/descriptors.js");
+var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/core-js/internals/an-object.js");
+var getOwnPropertyDescriptorModule = __webpack_require__(/*! ../internals/object-get-own-property-descriptor */ "./node_modules/core-js/internals/object-get-own-property-descriptor.js");
+
+// `Reflect.getOwnPropertyDescriptor` method
+// https://tc39.es/ecma262/#sec-reflect.getownpropertydescriptor
+$({ target: 'Reflect', stat: true, sham: !DESCRIPTORS }, {
+ getOwnPropertyDescriptor: function getOwnPropertyDescriptor(target, propertyKey) {
+ return getOwnPropertyDescriptorModule.f(anObject(target), propertyKey);
+ }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.reflect.get-prototype-of.js":
+/*!*********************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.reflect.get-prototype-of.js ***!
+ \*********************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/core-js/internals/an-object.js");
+var objectGetPrototypeOf = __webpack_require__(/*! ../internals/object-get-prototype-of */ "./node_modules/core-js/internals/object-get-prototype-of.js");
+var CORRECT_PROTOTYPE_GETTER = __webpack_require__(/*! ../internals/correct-prototype-getter */ "./node_modules/core-js/internals/correct-prototype-getter.js");
+
+// `Reflect.getPrototypeOf` method
+// https://tc39.es/ecma262/#sec-reflect.getprototypeof
+$({ target: 'Reflect', stat: true, sham: !CORRECT_PROTOTYPE_GETTER }, {
+ getPrototypeOf: function getPrototypeOf(target) {
+ return objectGetPrototypeOf(anObject(target));
+ }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.reflect.get.js":
+/*!********************************************************!*\
+ !*** ./node_modules/core-js/modules/es.reflect.get.js ***!
+ \********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/core-js/internals/is-object.js");
+var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/core-js/internals/an-object.js");
+var isDataDescriptor = __webpack_require__(/*! ../internals/is-data-descriptor */ "./node_modules/core-js/internals/is-data-descriptor.js");
+var getOwnPropertyDescriptorModule = __webpack_require__(/*! ../internals/object-get-own-property-descriptor */ "./node_modules/core-js/internals/object-get-own-property-descriptor.js");
+var getPrototypeOf = __webpack_require__(/*! ../internals/object-get-prototype-of */ "./node_modules/core-js/internals/object-get-prototype-of.js");
+
+// `Reflect.get` method
+// https://tc39.es/ecma262/#sec-reflect.get
+function get(target, propertyKey /* , receiver */) {
+ var receiver = arguments.length < 3 ? target : arguments[2];
+ var descriptor, prototype;
+ if (anObject(target) === receiver) return target[propertyKey];
+ descriptor = getOwnPropertyDescriptorModule.f(target, propertyKey);
+ if (descriptor) return isDataDescriptor(descriptor)
+ ? descriptor.value
+ : descriptor.get === undefined ? undefined : descriptor.get.call(receiver);
+ if (isObject(prototype = getPrototypeOf(target))) return get(prototype, propertyKey, receiver);
+}
+
+$({ target: 'Reflect', stat: true }, {
+ get: get
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.reflect.has.js":
+/*!********************************************************!*\
+ !*** ./node_modules/core-js/modules/es.reflect.has.js ***!
+ \********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+
+// `Reflect.has` method
+// https://tc39.es/ecma262/#sec-reflect.has
+$({ target: 'Reflect', stat: true }, {
+ has: function has(target, propertyKey) {
+ return propertyKey in target;
+ }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.reflect.is-extensible.js":
+/*!******************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.reflect.is-extensible.js ***!
+ \******************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/core-js/internals/an-object.js");
+
+// eslint-disable-next-line es/no-object-isextensible -- safe
+var objectIsExtensible = Object.isExtensible;
+
+// `Reflect.isExtensible` method
+// https://tc39.es/ecma262/#sec-reflect.isextensible
+$({ target: 'Reflect', stat: true }, {
+ isExtensible: function isExtensible(target) {
+ anObject(target);
+ return objectIsExtensible ? objectIsExtensible(target) : true;
+ }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.reflect.own-keys.js":
+/*!*************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.reflect.own-keys.js ***!
+ \*************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var ownKeys = __webpack_require__(/*! ../internals/own-keys */ "./node_modules/core-js/internals/own-keys.js");
+
+// `Reflect.ownKeys` method
+// https://tc39.es/ecma262/#sec-reflect.ownkeys
+$({ target: 'Reflect', stat: true }, {
+ ownKeys: ownKeys
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.reflect.prevent-extensions.js":
+/*!***********************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.reflect.prevent-extensions.js ***!
+ \***********************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ "./node_modules/core-js/internals/get-built-in.js");
+var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/core-js/internals/an-object.js");
+var FREEZING = __webpack_require__(/*! ../internals/freezing */ "./node_modules/core-js/internals/freezing.js");
+
+// `Reflect.preventExtensions` method
+// https://tc39.es/ecma262/#sec-reflect.preventextensions
+$({ target: 'Reflect', stat: true, sham: !FREEZING }, {
+ preventExtensions: function preventExtensions(target) {
+ anObject(target);
+ try {
+ var objectPreventExtensions = getBuiltIn('Object', 'preventExtensions');
+ if (objectPreventExtensions) objectPreventExtensions(target);
+ return true;
+ } catch (error) {
+ return false;
+ }
+ }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.reflect.set-prototype-of.js":
+/*!*********************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.reflect.set-prototype-of.js ***!
+ \*********************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/core-js/internals/an-object.js");
+var aPossiblePrototype = __webpack_require__(/*! ../internals/a-possible-prototype */ "./node_modules/core-js/internals/a-possible-prototype.js");
+var objectSetPrototypeOf = __webpack_require__(/*! ../internals/object-set-prototype-of */ "./node_modules/core-js/internals/object-set-prototype-of.js");
+
+// `Reflect.setPrototypeOf` method
+// https://tc39.es/ecma262/#sec-reflect.setprototypeof
+if (objectSetPrototypeOf) $({ target: 'Reflect', stat: true }, {
+ setPrototypeOf: function setPrototypeOf(target, proto) {
+ anObject(target);
+ aPossiblePrototype(proto);
+ try {
+ objectSetPrototypeOf(target, proto);
+ return true;
+ } catch (error) {
+ return false;
+ }
+ }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.reflect.set.js":
+/*!********************************************************!*\
+ !*** ./node_modules/core-js/modules/es.reflect.set.js ***!
+ \********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/core-js/internals/an-object.js");
+var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/core-js/internals/is-object.js");
+var isDataDescriptor = __webpack_require__(/*! ../internals/is-data-descriptor */ "./node_modules/core-js/internals/is-data-descriptor.js");
+var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js");
+var definePropertyModule = __webpack_require__(/*! ../internals/object-define-property */ "./node_modules/core-js/internals/object-define-property.js");
+var getOwnPropertyDescriptorModule = __webpack_require__(/*! ../internals/object-get-own-property-descriptor */ "./node_modules/core-js/internals/object-get-own-property-descriptor.js");
+var getPrototypeOf = __webpack_require__(/*! ../internals/object-get-prototype-of */ "./node_modules/core-js/internals/object-get-prototype-of.js");
+var createPropertyDescriptor = __webpack_require__(/*! ../internals/create-property-descriptor */ "./node_modules/core-js/internals/create-property-descriptor.js");
+
+// `Reflect.set` method
+// https://tc39.es/ecma262/#sec-reflect.set
+function set(target, propertyKey, V /* , receiver */) {
+ var receiver = arguments.length < 4 ? target : arguments[3];
+ var ownDescriptor = getOwnPropertyDescriptorModule.f(anObject(target), propertyKey);
+ var existingDescriptor, prototype, setter;
+ if (!ownDescriptor) {
+ if (isObject(prototype = getPrototypeOf(target))) {
+ return set(prototype, propertyKey, V, receiver);
+ }
+ ownDescriptor = createPropertyDescriptor(0);
+ }
+ if (isDataDescriptor(ownDescriptor)) {
+ if (ownDescriptor.writable === false || !isObject(receiver)) return false;
+ if (existingDescriptor = getOwnPropertyDescriptorModule.f(receiver, propertyKey)) {
+ if (existingDescriptor.get || existingDescriptor.set || existingDescriptor.writable === false) return false;
+ existingDescriptor.value = V;
+ definePropertyModule.f(receiver, propertyKey, existingDescriptor);
+ } else definePropertyModule.f(receiver, propertyKey, createPropertyDescriptor(0, V));
+ } else {
+ setter = ownDescriptor.set;
+ if (setter === undefined) return false;
+ setter.call(receiver, V);
+ } return true;
+}
+
+// MS Edge 17-18 Reflect.set allows setting the property to object
+// with non-writable property on the prototype
+var MS_EDGE_BUG = fails(function () {
+ var Constructor = function () { /* empty */ };
+ var object = definePropertyModule.f(new Constructor(), 'a', { configurable: true });
+ // eslint-disable-next-line es/no-reflect -- required for testing
+ return Reflect.set(Constructor.prototype, 'a', 1, object) !== false;
+});
+
+$({ target: 'Reflect', stat: true, forced: MS_EDGE_BUG }, {
+ set: set
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.reflect.to-string-tag.js":
+/*!******************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.reflect.to-string-tag.js ***!
+ \******************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js");
+var setToStringTag = __webpack_require__(/*! ../internals/set-to-string-tag */ "./node_modules/core-js/internals/set-to-string-tag.js");
+
+$({ global: true }, { Reflect: {} });
+
+// Reflect[@@toStringTag] property
+// https://tc39.es/ecma262/#sec-reflect-@@tostringtag
+setToStringTag(global.Reflect, 'Reflect', true);
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.regexp.constructor.js":
+/*!***************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.regexp.constructor.js ***!
+ \***************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/core-js/internals/descriptors.js");
+var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js");
+var isForced = __webpack_require__(/*! ../internals/is-forced */ "./node_modules/core-js/internals/is-forced.js");
+var inheritIfRequired = __webpack_require__(/*! ../internals/inherit-if-required */ "./node_modules/core-js/internals/inherit-if-required.js");
+var createNonEnumerableProperty = __webpack_require__(/*! ../internals/create-non-enumerable-property */ "./node_modules/core-js/internals/create-non-enumerable-property.js");
+var defineProperty = __webpack_require__(/*! ../internals/object-define-property */ "./node_modules/core-js/internals/object-define-property.js").f;
+var getOwnPropertyNames = __webpack_require__(/*! ../internals/object-get-own-property-names */ "./node_modules/core-js/internals/object-get-own-property-names.js").f;
+var isRegExp = __webpack_require__(/*! ../internals/is-regexp */ "./node_modules/core-js/internals/is-regexp.js");
+var toString = __webpack_require__(/*! ../internals/to-string */ "./node_modules/core-js/internals/to-string.js");
+var getFlags = __webpack_require__(/*! ../internals/regexp-flags */ "./node_modules/core-js/internals/regexp-flags.js");
+var stickyHelpers = __webpack_require__(/*! ../internals/regexp-sticky-helpers */ "./node_modules/core-js/internals/regexp-sticky-helpers.js");
+var redefine = __webpack_require__(/*! ../internals/redefine */ "./node_modules/core-js/internals/redefine.js");
+var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js");
+var has = __webpack_require__(/*! ../internals/has */ "./node_modules/core-js/internals/has.js");
+var enforceInternalState = __webpack_require__(/*! ../internals/internal-state */ "./node_modules/core-js/internals/internal-state.js").enforce;
+var setSpecies = __webpack_require__(/*! ../internals/set-species */ "./node_modules/core-js/internals/set-species.js");
+var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js");
+var UNSUPPORTED_DOT_ALL = __webpack_require__(/*! ../internals/regexp-unsupported-dot-all */ "./node_modules/core-js/internals/regexp-unsupported-dot-all.js");
+var UNSUPPORTED_NCG = __webpack_require__(/*! ../internals/regexp-unsupported-ncg */ "./node_modules/core-js/internals/regexp-unsupported-ncg.js");
+
+var MATCH = wellKnownSymbol('match');
+var NativeRegExp = global.RegExp;
+var RegExpPrototype = NativeRegExp.prototype;
+// TODO: Use only propper RegExpIdentifierName
+var IS_NCG = /^\?<[^\s\d!#%&*+<=>@^][^\s!#%&*+<=>@^]*>/;
+var re1 = /a/g;
+var re2 = /a/g;
+
+// "new" should create a new object, old webkit bug
+var CORRECT_NEW = new NativeRegExp(re1) !== re1;
+
+var UNSUPPORTED_Y = stickyHelpers.UNSUPPORTED_Y;
+
+var BASE_FORCED = DESCRIPTORS &&
+ (!CORRECT_NEW || UNSUPPORTED_Y || UNSUPPORTED_DOT_ALL || UNSUPPORTED_NCG || fails(function () {
+ re2[MATCH] = false;
+ // RegExp constructor can alter flags and IsRegExp works correct with @@match
+ return NativeRegExp(re1) != re1 || NativeRegExp(re2) == re2 || NativeRegExp(re1, 'i') != '/a/i';
+ }));
+
+var handleDotAll = function (string) {
+ var length = string.length;
+ var index = 0;
+ var result = '';
+ var brackets = false;
+ var chr;
+ for (; index <= length; index++) {
+ chr = string.charAt(index);
+ if (chr === '\\') {
+ result += chr + string.charAt(++index);
+ continue;
+ }
+ if (!brackets && chr === '.') {
+ result += '[\\s\\S]';
+ } else {
+ if (chr === '[') {
+ brackets = true;
+ } else if (chr === ']') {
+ brackets = false;
+ } result += chr;
+ }
+ } return result;
+};
+
+var handleNCG = function (string) {
+ var length = string.length;
+ var index = 0;
+ var result = '';
+ var named = [];
+ var names = {};
+ var brackets = false;
+ var ncg = false;
+ var groupid = 0;
+ var groupname = '';
+ var chr;
+ for (; index <= length; index++) {
+ chr = string.charAt(index);
+ if (chr === '\\') {
+ chr = chr + string.charAt(++index);
+ } else if (chr === ']') {
+ brackets = false;
+ } else if (!brackets) switch (true) {
+ case chr === '[':
+ brackets = true;
+ break;
+ case chr === '(':
+ if (IS_NCG.test(string.slice(index + 1))) {
+ index += 2;
+ ncg = true;
+ }
+ result += chr;
+ groupid++;
+ continue;
+ case chr === '>' && ncg:
+ if (groupname === '' || has(names, groupname)) {
+ throw new SyntaxError('Invalid capture group name');
+ }
+ names[groupname] = true;
+ named.push([groupname, groupid]);
+ ncg = false;
+ groupname = '';
+ continue;
+ }
+ if (ncg) groupname += chr;
+ else result += chr;
+ } return [result, named];
+};
+
+// `RegExp` constructor
+// https://tc39.es/ecma262/#sec-regexp-constructor
+if (isForced('RegExp', BASE_FORCED)) {
+ var RegExpWrapper = function RegExp(pattern, flags) {
+ var thisIsRegExp = this instanceof RegExpWrapper;
+ var patternIsRegExp = isRegExp(pattern);
+ var flagsAreUndefined = flags === undefined;
+ var groups = [];
+ var rawPattern = pattern;
+ var rawFlags, dotAll, sticky, handled, result, state;
+
+ if (!thisIsRegExp && patternIsRegExp && flagsAreUndefined && pattern.constructor === RegExpWrapper) {
+ return pattern;
+ }
+
+ if (patternIsRegExp || pattern instanceof RegExpWrapper) {
+ pattern = pattern.source;
+ if (flagsAreUndefined) flags = 'flags' in rawPattern ? rawPattern.flags : getFlags.call(rawPattern);
+ }
+
+ pattern = pattern === undefined ? '' : toString(pattern);
+ flags = flags === undefined ? '' : toString(flags);
+ rawPattern = pattern;
+
+ if (UNSUPPORTED_DOT_ALL && 'dotAll' in re1) {
+ dotAll = !!flags && flags.indexOf('s') > -1;
+ if (dotAll) flags = flags.replace(/s/g, '');
+ }
+
+ rawFlags = flags;
+
+ if (UNSUPPORTED_Y && 'sticky' in re1) {
+ sticky = !!flags && flags.indexOf('y') > -1;
+ if (sticky) flags = flags.replace(/y/g, '');
+ }
+
+ if (UNSUPPORTED_NCG) {
+ handled = handleNCG(pattern);
+ pattern = handled[0];
+ groups = handled[1];
+ }
+
+ result = inheritIfRequired(NativeRegExp(pattern, flags), thisIsRegExp ? this : RegExpPrototype, RegExpWrapper);
+
+ if (dotAll || sticky || groups.length) {
+ state = enforceInternalState(result);
+ if (dotAll) {
+ state.dotAll = true;
+ state.raw = RegExpWrapper(handleDotAll(pattern), rawFlags);
+ }
+ if (sticky) state.sticky = true;
+ if (groups.length) state.groups = groups;
+ }
+
+ if (pattern !== rawPattern) try {
+ // fails in old engines, but we have no alternatives for unsupported regex syntax
+ createNonEnumerableProperty(result, 'source', rawPattern === '' ? '(?:)' : rawPattern);
+ } catch (error) { /* empty */ }
+
+ return result;
+ };
+
+ var proxy = function (key) {
+ key in RegExpWrapper || defineProperty(RegExpWrapper, key, {
+ configurable: true,
+ get: function () { return NativeRegExp[key]; },
+ set: function (it) { NativeRegExp[key] = it; }
+ });
+ };
+
+ for (var keys = getOwnPropertyNames(NativeRegExp), index = 0; keys.length > index;) {
+ proxy(keys[index++]);
+ }
+
+ RegExpPrototype.constructor = RegExpWrapper;
+ RegExpWrapper.prototype = RegExpPrototype;
+ redefine(global, 'RegExp', RegExpWrapper);
+}
+
+// https://tc39.es/ecma262/#sec-get-regexp-@@species
+setSpecies('RegExp');
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.regexp.dot-all.js":
+/*!***********************************************************!*\
+ !*** ./node_modules/core-js/modules/es.regexp.dot-all.js ***!
+ \***********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/core-js/internals/descriptors.js");
+var UNSUPPORTED_DOT_ALL = __webpack_require__(/*! ../internals/regexp-unsupported-dot-all */ "./node_modules/core-js/internals/regexp-unsupported-dot-all.js");
+var defineProperty = __webpack_require__(/*! ../internals/object-define-property */ "./node_modules/core-js/internals/object-define-property.js").f;
+var getInternalState = __webpack_require__(/*! ../internals/internal-state */ "./node_modules/core-js/internals/internal-state.js").get;
+var RegExpPrototype = RegExp.prototype;
+
+// `RegExp.prototype.dotAll` getter
+// https://tc39.es/ecma262/#sec-get-regexp.prototype.dotall
+if (DESCRIPTORS && UNSUPPORTED_DOT_ALL) {
+ defineProperty(RegExpPrototype, 'dotAll', {
+ configurable: true,
+ get: function () {
+ if (this === RegExpPrototype) return undefined;
+ // We can't use InternalStateModule.getterFor because
+ // we don't add metadata for regexps created by a literal.
+ if (this instanceof RegExp) {
+ return !!getInternalState(this).dotAll;
+ }
+ throw TypeError('Incompatible receiver, RegExp required');
+ }
+ });
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.regexp.exec.js":
+/*!********************************************************!*\
+ !*** ./node_modules/core-js/modules/es.regexp.exec.js ***!
+ \********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var exec = __webpack_require__(/*! ../internals/regexp-exec */ "./node_modules/core-js/internals/regexp-exec.js");
+
+// `RegExp.prototype.exec` method
+// https://tc39.es/ecma262/#sec-regexp.prototype.exec
+$({ target: 'RegExp', proto: true, forced: /./.exec !== exec }, {
+ exec: exec
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.regexp.flags.js":
+/*!*********************************************************!*\
+ !*** ./node_modules/core-js/modules/es.regexp.flags.js ***!
+ \*********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/core-js/internals/descriptors.js");
+var objectDefinePropertyModule = __webpack_require__(/*! ../internals/object-define-property */ "./node_modules/core-js/internals/object-define-property.js");
+var regExpFlags = __webpack_require__(/*! ../internals/regexp-flags */ "./node_modules/core-js/internals/regexp-flags.js");
+var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js");
+
+var FORCED = DESCRIPTORS && fails(function () {
+ // eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe
+ return Object.getOwnPropertyDescriptor(RegExp.prototype, 'flags').get.call({ dotAll: true, sticky: true }) !== 'sy';
+});
+
+// `RegExp.prototype.flags` getter
+// https://tc39.es/ecma262/#sec-get-regexp.prototype.flags
+if (FORCED) objectDefinePropertyModule.f(RegExp.prototype, 'flags', {
+ configurable: true,
+ get: regExpFlags
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.regexp.sticky.js":
+/*!**********************************************************!*\
+ !*** ./node_modules/core-js/modules/es.regexp.sticky.js ***!
+ \**********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/core-js/internals/descriptors.js");
+var UNSUPPORTED_Y = __webpack_require__(/*! ../internals/regexp-sticky-helpers */ "./node_modules/core-js/internals/regexp-sticky-helpers.js").UNSUPPORTED_Y;
+var defineProperty = __webpack_require__(/*! ../internals/object-define-property */ "./node_modules/core-js/internals/object-define-property.js").f;
+var getInternalState = __webpack_require__(/*! ../internals/internal-state */ "./node_modules/core-js/internals/internal-state.js").get;
+var RegExpPrototype = RegExp.prototype;
+
+// `RegExp.prototype.sticky` getter
+// https://tc39.es/ecma262/#sec-get-regexp.prototype.sticky
+if (DESCRIPTORS && UNSUPPORTED_Y) {
+ defineProperty(RegExpPrototype, 'sticky', {
+ configurable: true,
+ get: function () {
+ if (this === RegExpPrototype) return undefined;
+ // We can't use InternalStateModule.getterFor because
+ // we don't add metadata for regexps created by a literal.
+ if (this instanceof RegExp) {
+ return !!getInternalState(this).sticky;
+ }
+ throw TypeError('Incompatible receiver, RegExp required');
+ }
+ });
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.regexp.test.js":
+/*!********************************************************!*\
+ !*** ./node_modules/core-js/modules/es.regexp.test.js ***!
+ \********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+// TODO: Remove from `core-js@4` since it's moved to entry points
+__webpack_require__(/*! ../modules/es.regexp.exec */ "./node_modules/core-js/modules/es.regexp.exec.js");
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var isCallable = __webpack_require__(/*! ../internals/is-callable */ "./node_modules/core-js/internals/is-callable.js");
+var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/core-js/internals/is-object.js");
+
+var DELEGATES_TO_EXEC = function () {
+ var execCalled = false;
+ var re = /[ac]/;
+ re.exec = function () {
+ execCalled = true;
+ return /./.exec.apply(this, arguments);
+ };
+ return re.test('abc') === true && execCalled;
+}();
+
+var nativeTest = /./.test;
+
+// `RegExp.prototype.test` method
+// https://tc39.es/ecma262/#sec-regexp.prototype.test
+$({ target: 'RegExp', proto: true, forced: !DELEGATES_TO_EXEC }, {
+ test: function (str) {
+ var exec = this.exec;
+ if (!isCallable(exec)) return nativeTest.call(this, str);
+ var result = exec.call(this, str);
+ if (result !== null && !isObject(result)) {
+ throw new Error('RegExp exec method returned something other than an Object or null');
+ }
+ return !!result;
+ }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.regexp.to-string.js":
+/*!*************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.regexp.to-string.js ***!
+ \*************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var PROPER_FUNCTION_NAME = __webpack_require__(/*! ../internals/function-name */ "./node_modules/core-js/internals/function-name.js").PROPER;
+var redefine = __webpack_require__(/*! ../internals/redefine */ "./node_modules/core-js/internals/redefine.js");
+var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/core-js/internals/an-object.js");
+var $toString = __webpack_require__(/*! ../internals/to-string */ "./node_modules/core-js/internals/to-string.js");
+var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js");
+var flags = __webpack_require__(/*! ../internals/regexp-flags */ "./node_modules/core-js/internals/regexp-flags.js");
+
+var TO_STRING = 'toString';
+var RegExpPrototype = RegExp.prototype;
+var nativeToString = RegExpPrototype[TO_STRING];
+
+var NOT_GENERIC = fails(function () { return nativeToString.call({ source: 'a', flags: 'b' }) != '/a/b'; });
+// FF44- RegExp#toString has a wrong name
+var INCORRECT_NAME = PROPER_FUNCTION_NAME && nativeToString.name != TO_STRING;
+
+// `RegExp.prototype.toString` method
+// https://tc39.es/ecma262/#sec-regexp.prototype.tostring
+if (NOT_GENERIC || INCORRECT_NAME) {
+ redefine(RegExp.prototype, TO_STRING, function toString() {
+ var R = anObject(this);
+ var p = $toString(R.source);
+ var rf = R.flags;
+ var f = $toString(rf === undefined && R instanceof RegExp && !('flags' in RegExpPrototype) ? flags.call(R) : rf);
+ return '/' + p + '/' + f;
+ }, { unsafe: true });
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.set.js":
+/*!************************************************!*\
+ !*** ./node_modules/core-js/modules/es.set.js ***!
+ \************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var collection = __webpack_require__(/*! ../internals/collection */ "./node_modules/core-js/internals/collection.js");
+var collectionStrong = __webpack_require__(/*! ../internals/collection-strong */ "./node_modules/core-js/internals/collection-strong.js");
+
+// `Set` constructor
+// https://tc39.es/ecma262/#sec-set-objects
+module.exports = collection('Set', function (init) {
+ return function Set() { return init(this, arguments.length ? arguments[0] : undefined); };
+}, collectionStrong);
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.string.anchor.js":
+/*!**********************************************************!*\
+ !*** ./node_modules/core-js/modules/es.string.anchor.js ***!
+ \**********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var createHTML = __webpack_require__(/*! ../internals/create-html */ "./node_modules/core-js/internals/create-html.js");
+var forcedStringHTMLMethod = __webpack_require__(/*! ../internals/string-html-forced */ "./node_modules/core-js/internals/string-html-forced.js");
+
+// `String.prototype.anchor` method
+// https://tc39.es/ecma262/#sec-string.prototype.anchor
+$({ target: 'String', proto: true, forced: forcedStringHTMLMethod('anchor') }, {
+ anchor: function anchor(name) {
+ return createHTML(this, 'a', 'name', name);
+ }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.string.at-alternative.js":
+/*!******************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.string.at-alternative.js ***!
+ \******************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ "./node_modules/core-js/internals/require-object-coercible.js");
+var toInteger = __webpack_require__(/*! ../internals/to-integer */ "./node_modules/core-js/internals/to-integer.js");
+var toLength = __webpack_require__(/*! ../internals/to-length */ "./node_modules/core-js/internals/to-length.js");
+var toString = __webpack_require__(/*! ../internals/to-string */ "./node_modules/core-js/internals/to-string.js");
+var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js");
+
+var FORCED = fails(function () {
+ return '𠮷'.at(0) !== '\uD842';
+});
+
+// `String.prototype.at` method
+// https://github.com/tc39/proposal-relative-indexing-method
+$({ target: 'String', proto: true, forced: FORCED }, {
+ at: function at(index) {
+ var S = toString(requireObjectCoercible(this));
+ var len = toLength(S.length);
+ var relativeIndex = toInteger(index);
+ var k = relativeIndex >= 0 ? relativeIndex : len + relativeIndex;
+ return (k < 0 || k >= len) ? undefined : S.charAt(k);
+ }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.string.big.js":
+/*!*******************************************************!*\
+ !*** ./node_modules/core-js/modules/es.string.big.js ***!
+ \*******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var createHTML = __webpack_require__(/*! ../internals/create-html */ "./node_modules/core-js/internals/create-html.js");
+var forcedStringHTMLMethod = __webpack_require__(/*! ../internals/string-html-forced */ "./node_modules/core-js/internals/string-html-forced.js");
+
+// `String.prototype.big` method
+// https://tc39.es/ecma262/#sec-string.prototype.big
+$({ target: 'String', proto: true, forced: forcedStringHTMLMethod('big') }, {
+ big: function big() {
+ return createHTML(this, 'big', '', '');
+ }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.string.blink.js":
+/*!*********************************************************!*\
+ !*** ./node_modules/core-js/modules/es.string.blink.js ***!
+ \*********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var createHTML = __webpack_require__(/*! ../internals/create-html */ "./node_modules/core-js/internals/create-html.js");
+var forcedStringHTMLMethod = __webpack_require__(/*! ../internals/string-html-forced */ "./node_modules/core-js/internals/string-html-forced.js");
+
+// `String.prototype.blink` method
+// https://tc39.es/ecma262/#sec-string.prototype.blink
+$({ target: 'String', proto: true, forced: forcedStringHTMLMethod('blink') }, {
+ blink: function blink() {
+ return createHTML(this, 'blink', '', '');
+ }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.string.bold.js":
+/*!********************************************************!*\
+ !*** ./node_modules/core-js/modules/es.string.bold.js ***!
+ \********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var createHTML = __webpack_require__(/*! ../internals/create-html */ "./node_modules/core-js/internals/create-html.js");
+var forcedStringHTMLMethod = __webpack_require__(/*! ../internals/string-html-forced */ "./node_modules/core-js/internals/string-html-forced.js");
+
+// `String.prototype.bold` method
+// https://tc39.es/ecma262/#sec-string.prototype.bold
+$({ target: 'String', proto: true, forced: forcedStringHTMLMethod('bold') }, {
+ bold: function bold() {
+ return createHTML(this, 'b', '', '');
+ }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.string.code-point-at.js":
+/*!*****************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.string.code-point-at.js ***!
+ \*****************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var codeAt = __webpack_require__(/*! ../internals/string-multibyte */ "./node_modules/core-js/internals/string-multibyte.js").codeAt;
+
+// `String.prototype.codePointAt` method
+// https://tc39.es/ecma262/#sec-string.prototype.codepointat
+$({ target: 'String', proto: true }, {
+ codePointAt: function codePointAt(pos) {
+ return codeAt(this, pos);
+ }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.string.ends-with.js":
+/*!*************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.string.ends-with.js ***!
+ \*************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var getOwnPropertyDescriptor = __webpack_require__(/*! ../internals/object-get-own-property-descriptor */ "./node_modules/core-js/internals/object-get-own-property-descriptor.js").f;
+var toLength = __webpack_require__(/*! ../internals/to-length */ "./node_modules/core-js/internals/to-length.js");
+var toString = __webpack_require__(/*! ../internals/to-string */ "./node_modules/core-js/internals/to-string.js");
+var notARegExp = __webpack_require__(/*! ../internals/not-a-regexp */ "./node_modules/core-js/internals/not-a-regexp.js");
+var requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ "./node_modules/core-js/internals/require-object-coercible.js");
+var correctIsRegExpLogic = __webpack_require__(/*! ../internals/correct-is-regexp-logic */ "./node_modules/core-js/internals/correct-is-regexp-logic.js");
+var IS_PURE = __webpack_require__(/*! ../internals/is-pure */ "./node_modules/core-js/internals/is-pure.js");
+
+// eslint-disable-next-line es/no-string-prototype-endswith -- safe
+var $endsWith = ''.endsWith;
+var min = Math.min;
+
+var CORRECT_IS_REGEXP_LOGIC = correctIsRegExpLogic('endsWith');
+// https://github.com/zloirock/core-js/pull/702
+var MDN_POLYFILL_BUG = !IS_PURE && !CORRECT_IS_REGEXP_LOGIC && !!function () {
+ var descriptor = getOwnPropertyDescriptor(String.prototype, 'endsWith');
+ return descriptor && !descriptor.writable;
+}();
+
+// `String.prototype.endsWith` method
+// https://tc39.es/ecma262/#sec-string.prototype.endswith
+$({ target: 'String', proto: true, forced: !MDN_POLYFILL_BUG && !CORRECT_IS_REGEXP_LOGIC }, {
+ endsWith: function endsWith(searchString /* , endPosition = @length */) {
+ var that = toString(requireObjectCoercible(this));
+ notARegExp(searchString);
+ var endPosition = arguments.length > 1 ? arguments[1] : undefined;
+ var len = toLength(that.length);
+ var end = endPosition === undefined ? len : min(toLength(endPosition), len);
+ var search = toString(searchString);
+ return $endsWith
+ ? $endsWith.call(that, search, end)
+ : that.slice(end - search.length, end) === search;
+ }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.string.fixed.js":
+/*!*********************************************************!*\
+ !*** ./node_modules/core-js/modules/es.string.fixed.js ***!
+ \*********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var createHTML = __webpack_require__(/*! ../internals/create-html */ "./node_modules/core-js/internals/create-html.js");
+var forcedStringHTMLMethod = __webpack_require__(/*! ../internals/string-html-forced */ "./node_modules/core-js/internals/string-html-forced.js");
+
+// `String.prototype.fixed` method
+// https://tc39.es/ecma262/#sec-string.prototype.fixed
+$({ target: 'String', proto: true, forced: forcedStringHTMLMethod('fixed') }, {
+ fixed: function fixed() {
+ return createHTML(this, 'tt', '', '');
+ }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.string.fontcolor.js":
+/*!*************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.string.fontcolor.js ***!
+ \*************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var createHTML = __webpack_require__(/*! ../internals/create-html */ "./node_modules/core-js/internals/create-html.js");
+var forcedStringHTMLMethod = __webpack_require__(/*! ../internals/string-html-forced */ "./node_modules/core-js/internals/string-html-forced.js");
+
+// `String.prototype.fontcolor` method
+// https://tc39.es/ecma262/#sec-string.prototype.fontcolor
+$({ target: 'String', proto: true, forced: forcedStringHTMLMethod('fontcolor') }, {
+ fontcolor: function fontcolor(color) {
+ return createHTML(this, 'font', 'color', color);
+ }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.string.fontsize.js":
+/*!************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.string.fontsize.js ***!
+ \************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var createHTML = __webpack_require__(/*! ../internals/create-html */ "./node_modules/core-js/internals/create-html.js");
+var forcedStringHTMLMethod = __webpack_require__(/*! ../internals/string-html-forced */ "./node_modules/core-js/internals/string-html-forced.js");
+
+// `String.prototype.fontsize` method
+// https://tc39.es/ecma262/#sec-string.prototype.fontsize
+$({ target: 'String', proto: true, forced: forcedStringHTMLMethod('fontsize') }, {
+ fontsize: function fontsize(size) {
+ return createHTML(this, 'font', 'size', size);
+ }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.string.from-code-point.js":
+/*!*******************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.string.from-code-point.js ***!
+ \*******************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var toAbsoluteIndex = __webpack_require__(/*! ../internals/to-absolute-index */ "./node_modules/core-js/internals/to-absolute-index.js");
+
+var fromCharCode = String.fromCharCode;
+// eslint-disable-next-line es/no-string-fromcodepoint -- required for testing
+var $fromCodePoint = String.fromCodePoint;
+
+// length should be 1, old FF problem
+var INCORRECT_LENGTH = !!$fromCodePoint && $fromCodePoint.length != 1;
+
+// `String.fromCodePoint` method
+// https://tc39.es/ecma262/#sec-string.fromcodepoint
+$({ target: 'String', stat: true, forced: INCORRECT_LENGTH }, {
+ // eslint-disable-next-line no-unused-vars -- required for `.length`
+ fromCodePoint: function fromCodePoint(x) {
+ var elements = [];
+ var length = arguments.length;
+ var i = 0;
+ var code;
+ while (length > i) {
+ code = +arguments[i++];
+ if (toAbsoluteIndex(code, 0x10FFFF) !== code) throw RangeError(code + ' is not a valid code point');
+ elements.push(code < 0x10000
+ ? fromCharCode(code)
+ : fromCharCode(((code -= 0x10000) >> 10) + 0xD800, code % 0x400 + 0xDC00)
+ );
+ } return elements.join('');
+ }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.string.includes.js":
+/*!************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.string.includes.js ***!
+ \************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var notARegExp = __webpack_require__(/*! ../internals/not-a-regexp */ "./node_modules/core-js/internals/not-a-regexp.js");
+var requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ "./node_modules/core-js/internals/require-object-coercible.js");
+var toString = __webpack_require__(/*! ../internals/to-string */ "./node_modules/core-js/internals/to-string.js");
+var correctIsRegExpLogic = __webpack_require__(/*! ../internals/correct-is-regexp-logic */ "./node_modules/core-js/internals/correct-is-regexp-logic.js");
+
+// `String.prototype.includes` method
+// https://tc39.es/ecma262/#sec-string.prototype.includes
+$({ target: 'String', proto: true, forced: !correctIsRegExpLogic('includes') }, {
+ includes: function includes(searchString /* , position = 0 */) {
+ return !!~toString(requireObjectCoercible(this))
+ .indexOf(toString(notARegExp(searchString)), arguments.length > 1 ? arguments[1] : undefined);
+ }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.string.italics.js":
+/*!***********************************************************!*\
+ !*** ./node_modules/core-js/modules/es.string.italics.js ***!
+ \***********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var createHTML = __webpack_require__(/*! ../internals/create-html */ "./node_modules/core-js/internals/create-html.js");
+var forcedStringHTMLMethod = __webpack_require__(/*! ../internals/string-html-forced */ "./node_modules/core-js/internals/string-html-forced.js");
+
+// `String.prototype.italics` method
+// https://tc39.es/ecma262/#sec-string.prototype.italics
+$({ target: 'String', proto: true, forced: forcedStringHTMLMethod('italics') }, {
+ italics: function italics() {
+ return createHTML(this, 'i', '', '');
+ }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.string.iterator.js":
+/*!************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.string.iterator.js ***!
+ \************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var charAt = __webpack_require__(/*! ../internals/string-multibyte */ "./node_modules/core-js/internals/string-multibyte.js").charAt;
+var toString = __webpack_require__(/*! ../internals/to-string */ "./node_modules/core-js/internals/to-string.js");
+var InternalStateModule = __webpack_require__(/*! ../internals/internal-state */ "./node_modules/core-js/internals/internal-state.js");
+var defineIterator = __webpack_require__(/*! ../internals/define-iterator */ "./node_modules/core-js/internals/define-iterator.js");
+
+var STRING_ITERATOR = 'String Iterator';
+var setInternalState = InternalStateModule.set;
+var getInternalState = InternalStateModule.getterFor(STRING_ITERATOR);
+
+// `String.prototype[@@iterator]` method
+// https://tc39.es/ecma262/#sec-string.prototype-@@iterator
+defineIterator(String, 'String', function (iterated) {
+ setInternalState(this, {
+ type: STRING_ITERATOR,
+ string: toString(iterated),
+ index: 0
+ });
+// `%StringIteratorPrototype%.next` method
+// https://tc39.es/ecma262/#sec-%stringiteratorprototype%.next
+}, function next() {
+ var state = getInternalState(this);
+ var string = state.string;
+ var index = state.index;
+ var point;
+ if (index >= string.length) return { value: undefined, done: true };
+ point = charAt(string, index);
+ state.index += point.length;
+ return { value: point, done: false };
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.string.link.js":
+/*!********************************************************!*\
+ !*** ./node_modules/core-js/modules/es.string.link.js ***!
+ \********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var createHTML = __webpack_require__(/*! ../internals/create-html */ "./node_modules/core-js/internals/create-html.js");
+var forcedStringHTMLMethod = __webpack_require__(/*! ../internals/string-html-forced */ "./node_modules/core-js/internals/string-html-forced.js");
+
+// `String.prototype.link` method
+// https://tc39.es/ecma262/#sec-string.prototype.link
+$({ target: 'String', proto: true, forced: forcedStringHTMLMethod('link') }, {
+ link: function link(url) {
+ return createHTML(this, 'a', 'href', url);
+ }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.string.match-all.js":
+/*!*************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.string.match-all.js ***!
+ \*************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+/* eslint-disable es/no-string-prototype-matchall -- safe */
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var createIteratorConstructor = __webpack_require__(/*! ../internals/create-iterator-constructor */ "./node_modules/core-js/internals/create-iterator-constructor.js");
+var requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ "./node_modules/core-js/internals/require-object-coercible.js");
+var toLength = __webpack_require__(/*! ../internals/to-length */ "./node_modules/core-js/internals/to-length.js");
+var toString = __webpack_require__(/*! ../internals/to-string */ "./node_modules/core-js/internals/to-string.js");
+var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/core-js/internals/an-object.js");
+var classof = __webpack_require__(/*! ../internals/classof-raw */ "./node_modules/core-js/internals/classof-raw.js");
+var isRegExp = __webpack_require__(/*! ../internals/is-regexp */ "./node_modules/core-js/internals/is-regexp.js");
+var getRegExpFlags = __webpack_require__(/*! ../internals/regexp-flags */ "./node_modules/core-js/internals/regexp-flags.js");
+var getMethod = __webpack_require__(/*! ../internals/get-method */ "./node_modules/core-js/internals/get-method.js");
+var redefine = __webpack_require__(/*! ../internals/redefine */ "./node_modules/core-js/internals/redefine.js");
+var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js");
+var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js");
+var speciesConstructor = __webpack_require__(/*! ../internals/species-constructor */ "./node_modules/core-js/internals/species-constructor.js");
+var advanceStringIndex = __webpack_require__(/*! ../internals/advance-string-index */ "./node_modules/core-js/internals/advance-string-index.js");
+var regExpExec = __webpack_require__(/*! ../internals/regexp-exec-abstract */ "./node_modules/core-js/internals/regexp-exec-abstract.js");
+var InternalStateModule = __webpack_require__(/*! ../internals/internal-state */ "./node_modules/core-js/internals/internal-state.js");
+var IS_PURE = __webpack_require__(/*! ../internals/is-pure */ "./node_modules/core-js/internals/is-pure.js");
+
+var MATCH_ALL = wellKnownSymbol('matchAll');
+var REGEXP_STRING = 'RegExp String';
+var REGEXP_STRING_ITERATOR = REGEXP_STRING + ' Iterator';
+var setInternalState = InternalStateModule.set;
+var getInternalState = InternalStateModule.getterFor(REGEXP_STRING_ITERATOR);
+var RegExpPrototype = RegExp.prototype;
+var nativeMatchAll = ''.matchAll;
+
+var WORKS_WITH_NON_GLOBAL_REGEX = !!nativeMatchAll && !fails(function () {
+ 'a'.matchAll(/./);
+});
+
+// eslint-disable-next-line max-len -- ignore
+var $RegExpStringIterator = createIteratorConstructor(function RegExpStringIterator(regexp, string, global, fullUnicode) {
+ setInternalState(this, {
+ type: REGEXP_STRING_ITERATOR,
+ regexp: regexp,
+ string: string,
+ global: global,
+ unicode: fullUnicode,
+ done: false
+ });
+}, REGEXP_STRING, function next() {
+ var state = getInternalState(this);
+ if (state.done) return { value: undefined, done: true };
+ var R = state.regexp;
+ var S = state.string;
+ var match = regExpExec(R, S);
+ if (match === null) return { value: undefined, done: state.done = true };
+ if (state.global) {
+ if (toString(match[0]) === '') R.lastIndex = advanceStringIndex(S, toLength(R.lastIndex), state.unicode);
+ return { value: match, done: false };
+ }
+ state.done = true;
+ return { value: match, done: false };
+});
+
+var $matchAll = function (string) {
+ var R = anObject(this);
+ var S = toString(string);
+ var C, flagsValue, flags, matcher, global, fullUnicode;
+ C = speciesConstructor(R, RegExp);
+ flagsValue = R.flags;
+ if (flagsValue === undefined && R instanceof RegExp && !('flags' in RegExpPrototype)) {
+ flagsValue = getRegExpFlags.call(R);
+ }
+ flags = flagsValue === undefined ? '' : toString(flagsValue);
+ matcher = new C(C === RegExp ? R.source : R, flags);
+ global = !!~flags.indexOf('g');
+ fullUnicode = !!~flags.indexOf('u');
+ matcher.lastIndex = toLength(R.lastIndex);
+ return new $RegExpStringIterator(matcher, S, global, fullUnicode);
+};
+
+// `String.prototype.matchAll` method
+// https://tc39.es/ecma262/#sec-string.prototype.matchall
+$({ target: 'String', proto: true, forced: WORKS_WITH_NON_GLOBAL_REGEX }, {
+ matchAll: function matchAll(regexp) {
+ var O = requireObjectCoercible(this);
+ var flags, S, matcher, rx;
+ if (regexp != null) {
+ if (isRegExp(regexp)) {
+ flags = toString(requireObjectCoercible('flags' in RegExpPrototype
+ ? regexp.flags
+ : getRegExpFlags.call(regexp)
+ ));
+ if (!~flags.indexOf('g')) throw TypeError('`.matchAll` does not allow non-global regexes');
+ }
+ if (WORKS_WITH_NON_GLOBAL_REGEX) return nativeMatchAll.apply(O, arguments);
+ matcher = getMethod(regexp, MATCH_ALL);
+ if (matcher === undefined && IS_PURE && classof(regexp) == 'RegExp') matcher = $matchAll;
+ if (matcher) return matcher.call(regexp, O);
+ } else if (WORKS_WITH_NON_GLOBAL_REGEX) return nativeMatchAll.apply(O, arguments);
+ S = toString(O);
+ rx = new RegExp(regexp, 'g');
+ return IS_PURE ? $matchAll.call(rx, S) : rx[MATCH_ALL](S);
+ }
+});
+
+IS_PURE || MATCH_ALL in RegExpPrototype || redefine(RegExpPrototype, MATCH_ALL, $matchAll);
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.string.match.js":
+/*!*********************************************************!*\
+ !*** ./node_modules/core-js/modules/es.string.match.js ***!
+ \*********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var fixRegExpWellKnownSymbolLogic = __webpack_require__(/*! ../internals/fix-regexp-well-known-symbol-logic */ "./node_modules/core-js/internals/fix-regexp-well-known-symbol-logic.js");
+var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/core-js/internals/an-object.js");
+var toLength = __webpack_require__(/*! ../internals/to-length */ "./node_modules/core-js/internals/to-length.js");
+var toString = __webpack_require__(/*! ../internals/to-string */ "./node_modules/core-js/internals/to-string.js");
+var requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ "./node_modules/core-js/internals/require-object-coercible.js");
+var getMethod = __webpack_require__(/*! ../internals/get-method */ "./node_modules/core-js/internals/get-method.js");
+var advanceStringIndex = __webpack_require__(/*! ../internals/advance-string-index */ "./node_modules/core-js/internals/advance-string-index.js");
+var regExpExec = __webpack_require__(/*! ../internals/regexp-exec-abstract */ "./node_modules/core-js/internals/regexp-exec-abstract.js");
+
+// @@match logic
+fixRegExpWellKnownSymbolLogic('match', function (MATCH, nativeMatch, maybeCallNative) {
+ return [
+ // `String.prototype.match` method
+ // https://tc39.es/ecma262/#sec-string.prototype.match
+ function match(regexp) {
+ var O = requireObjectCoercible(this);
+ var matcher = regexp == undefined ? undefined : getMethod(regexp, MATCH);
+ return matcher ? matcher.call(regexp, O) : new RegExp(regexp)[MATCH](toString(O));
+ },
+ // `RegExp.prototype[@@match]` method
+ // https://tc39.es/ecma262/#sec-regexp.prototype-@@match
+ function (string) {
+ var rx = anObject(this);
+ var S = toString(string);
+ var res = maybeCallNative(nativeMatch, rx, S);
+
+ if (res.done) return res.value;
+
+ if (!rx.global) return regExpExec(rx, S);
+
+ var fullUnicode = rx.unicode;
+ rx.lastIndex = 0;
+ var A = [];
+ var n = 0;
+ var result;
+ while ((result = regExpExec(rx, S)) !== null) {
+ var matchStr = toString(result[0]);
+ A[n] = matchStr;
+ if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);
+ n++;
+ }
+ return n === 0 ? null : A;
+ }
+ ];
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.string.pad-end.js":
+/*!***********************************************************!*\
+ !*** ./node_modules/core-js/modules/es.string.pad-end.js ***!
+ \***********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var $padEnd = __webpack_require__(/*! ../internals/string-pad */ "./node_modules/core-js/internals/string-pad.js").end;
+var WEBKIT_BUG = __webpack_require__(/*! ../internals/string-pad-webkit-bug */ "./node_modules/core-js/internals/string-pad-webkit-bug.js");
+
+// `String.prototype.padEnd` method
+// https://tc39.es/ecma262/#sec-string.prototype.padend
+$({ target: 'String', proto: true, forced: WEBKIT_BUG }, {
+ padEnd: function padEnd(maxLength /* , fillString = ' ' */) {
+ return $padEnd(this, maxLength, arguments.length > 1 ? arguments[1] : undefined);
+ }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.string.pad-start.js":
+/*!*************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.string.pad-start.js ***!
+ \*************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var $padStart = __webpack_require__(/*! ../internals/string-pad */ "./node_modules/core-js/internals/string-pad.js").start;
+var WEBKIT_BUG = __webpack_require__(/*! ../internals/string-pad-webkit-bug */ "./node_modules/core-js/internals/string-pad-webkit-bug.js");
+
+// `String.prototype.padStart` method
+// https://tc39.es/ecma262/#sec-string.prototype.padstart
+$({ target: 'String', proto: true, forced: WEBKIT_BUG }, {
+ padStart: function padStart(maxLength /* , fillString = ' ' */) {
+ return $padStart(this, maxLength, arguments.length > 1 ? arguments[1] : undefined);
+ }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.string.raw.js":
+/*!*******************************************************!*\
+ !*** ./node_modules/core-js/modules/es.string.raw.js ***!
+ \*******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ "./node_modules/core-js/internals/to-indexed-object.js");
+var toObject = __webpack_require__(/*! ../internals/to-object */ "./node_modules/core-js/internals/to-object.js");
+var toLength = __webpack_require__(/*! ../internals/to-length */ "./node_modules/core-js/internals/to-length.js");
+var toString = __webpack_require__(/*! ../internals/to-string */ "./node_modules/core-js/internals/to-string.js");
+
+var ArrayPrototype = Array.prototype;
+var push = ArrayPrototype.push;
+var join = ArrayPrototype.join;
+
+// `String.raw` method
+// https://tc39.es/ecma262/#sec-string.raw
+$({ target: 'String', stat: true }, {
+ raw: function raw(template) {
+ var rawTemplate = toIndexedObject(toObject(template).raw);
+ var literalSegments = toLength(rawTemplate.length);
+ var argumentsLength = arguments.length;
+ var elements = [];
+ var i = 0;
+ while (literalSegments > i) {
+ push.call(elements, toString(rawTemplate[i++]));
+ if (i < argumentsLength) push.call(elements, toString(arguments[i]));
+ } return join.call(elements, '');
+ }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.string.repeat.js":
+/*!**********************************************************!*\
+ !*** ./node_modules/core-js/modules/es.string.repeat.js ***!
+ \**********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var repeat = __webpack_require__(/*! ../internals/string-repeat */ "./node_modules/core-js/internals/string-repeat.js");
+
+// `String.prototype.repeat` method
+// https://tc39.es/ecma262/#sec-string.prototype.repeat
+$({ target: 'String', proto: true }, {
+ repeat: repeat
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.string.replace-all.js":
+/*!***************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.string.replace-all.js ***!
+ \***************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ "./node_modules/core-js/internals/require-object-coercible.js");
+var isCallable = __webpack_require__(/*! ../internals/is-callable */ "./node_modules/core-js/internals/is-callable.js");
+var isRegExp = __webpack_require__(/*! ../internals/is-regexp */ "./node_modules/core-js/internals/is-regexp.js");
+var toString = __webpack_require__(/*! ../internals/to-string */ "./node_modules/core-js/internals/to-string.js");
+var getMethod = __webpack_require__(/*! ../internals/get-method */ "./node_modules/core-js/internals/get-method.js");
+var getRegExpFlags = __webpack_require__(/*! ../internals/regexp-flags */ "./node_modules/core-js/internals/regexp-flags.js");
+var getSubstitution = __webpack_require__(/*! ../internals/get-substitution */ "./node_modules/core-js/internals/get-substitution.js");
+var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js");
+var IS_PURE = __webpack_require__(/*! ../internals/is-pure */ "./node_modules/core-js/internals/is-pure.js");
+
+var REPLACE = wellKnownSymbol('replace');
+var RegExpPrototype = RegExp.prototype;
+var max = Math.max;
+
+var stringIndexOf = function (string, searchValue, fromIndex) {
+ if (fromIndex > string.length) return -1;
+ if (searchValue === '') return fromIndex;
+ return string.indexOf(searchValue, fromIndex);
+};
+
+// `String.prototype.replaceAll` method
+// https://tc39.es/ecma262/#sec-string.prototype.replaceall
+$({ target: 'String', proto: true }, {
+ replaceAll: function replaceAll(searchValue, replaceValue) {
+ var O = requireObjectCoercible(this);
+ var IS_REG_EXP, flags, replacer, string, searchString, functionalReplace, searchLength, advanceBy, replacement;
+ var position = 0;
+ var endOfLastMatch = 0;
+ var result = '';
+ if (searchValue != null) {
+ IS_REG_EXP = isRegExp(searchValue);
+ if (IS_REG_EXP) {
+ flags = toString(requireObjectCoercible('flags' in RegExpPrototype
+ ? searchValue.flags
+ : getRegExpFlags.call(searchValue)
+ ));
+ if (!~flags.indexOf('g')) throw TypeError('`.replaceAll` does not allow non-global regexes');
+ }
+ replacer = getMethod(searchValue, REPLACE);
+ if (replacer) {
+ return replacer.call(searchValue, O, replaceValue);
+ } else if (IS_PURE && IS_REG_EXP) {
+ return toString(O).replace(searchValue, replaceValue);
+ }
+ }
+ string = toString(O);
+ searchString = toString(searchValue);
+ functionalReplace = isCallable(replaceValue);
+ if (!functionalReplace) replaceValue = toString(replaceValue);
+ searchLength = searchString.length;
+ advanceBy = max(1, searchLength);
+ position = stringIndexOf(string, searchString, 0);
+ while (position !== -1) {
+ if (functionalReplace) {
+ replacement = toString(replaceValue(searchString, position, string));
+ } else {
+ replacement = getSubstitution(searchString, string, position, [], undefined, replaceValue);
+ }
+ result += string.slice(endOfLastMatch, position) + replacement;
+ endOfLastMatch = position + searchLength;
+ position = stringIndexOf(string, searchString, position + advanceBy);
+ }
+ if (endOfLastMatch < string.length) {
+ result += string.slice(endOfLastMatch);
+ }
+ return result;
+ }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.string.replace.js":
+/*!***********************************************************!*\
+ !*** ./node_modules/core-js/modules/es.string.replace.js ***!
+ \***********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var fixRegExpWellKnownSymbolLogic = __webpack_require__(/*! ../internals/fix-regexp-well-known-symbol-logic */ "./node_modules/core-js/internals/fix-regexp-well-known-symbol-logic.js");
+var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js");
+var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/core-js/internals/an-object.js");
+var isCallable = __webpack_require__(/*! ../internals/is-callable */ "./node_modules/core-js/internals/is-callable.js");
+var toInteger = __webpack_require__(/*! ../internals/to-integer */ "./node_modules/core-js/internals/to-integer.js");
+var toLength = __webpack_require__(/*! ../internals/to-length */ "./node_modules/core-js/internals/to-length.js");
+var toString = __webpack_require__(/*! ../internals/to-string */ "./node_modules/core-js/internals/to-string.js");
+var requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ "./node_modules/core-js/internals/require-object-coercible.js");
+var advanceStringIndex = __webpack_require__(/*! ../internals/advance-string-index */ "./node_modules/core-js/internals/advance-string-index.js");
+var getMethod = __webpack_require__(/*! ../internals/get-method */ "./node_modules/core-js/internals/get-method.js");
+var getSubstitution = __webpack_require__(/*! ../internals/get-substitution */ "./node_modules/core-js/internals/get-substitution.js");
+var regExpExec = __webpack_require__(/*! ../internals/regexp-exec-abstract */ "./node_modules/core-js/internals/regexp-exec-abstract.js");
+var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js");
+
+var REPLACE = wellKnownSymbol('replace');
+var max = Math.max;
+var min = Math.min;
+
+var maybeToString = function (it) {
+ return it === undefined ? it : String(it);
+};
+
+// IE <= 11 replaces $0 with the whole match, as if it was $&
+// https://stackoverflow.com/questions/6024666/getting-ie-to-replace-a-regex-with-the-literal-string-0
+var REPLACE_KEEPS_$0 = (function () {
+ // eslint-disable-next-line regexp/prefer-escape-replacement-dollar-char -- required for testing
+ return 'a'.replace(/./, '$0') === '$0';
+})();
+
+// Safari <= 13.0.3(?) substitutes nth capture where n>m with an empty string
+var REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE = (function () {
+ if (/./[REPLACE]) {
+ return /./[REPLACE]('a', '$0') === '';
+ }
+ return false;
+})();
+
+var REPLACE_SUPPORTS_NAMED_GROUPS = !fails(function () {
+ var re = /./;
+ re.exec = function () {
+ var result = [];
+ result.groups = { a: '7' };
+ return result;
+ };
+ // eslint-disable-next-line regexp/no-useless-dollar-replacements -- false positive
+ return ''.replace(re, '$') !== '7';
+});
+
+// @@replace logic
+fixRegExpWellKnownSymbolLogic('replace', function (_, nativeReplace, maybeCallNative) {
+ var UNSAFE_SUBSTITUTE = REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE ? '$' : '$0';
+
+ return [
+ // `String.prototype.replace` method
+ // https://tc39.es/ecma262/#sec-string.prototype.replace
+ function replace(searchValue, replaceValue) {
+ var O = requireObjectCoercible(this);
+ var replacer = searchValue == undefined ? undefined : getMethod(searchValue, REPLACE);
+ return replacer
+ ? replacer.call(searchValue, O, replaceValue)
+ : nativeReplace.call(toString(O), searchValue, replaceValue);
+ },
+ // `RegExp.prototype[@@replace]` method
+ // https://tc39.es/ecma262/#sec-regexp.prototype-@@replace
+ function (string, replaceValue) {
+ var rx = anObject(this);
+ var S = toString(string);
+
+ if (
+ typeof replaceValue === 'string' &&
+ replaceValue.indexOf(UNSAFE_SUBSTITUTE) === -1 &&
+ replaceValue.indexOf('$<') === -1
+ ) {
+ var res = maybeCallNative(nativeReplace, rx, S, replaceValue);
+ if (res.done) return res.value;
+ }
+
+ var functionalReplace = isCallable(replaceValue);
+ if (!functionalReplace) replaceValue = toString(replaceValue);
+
+ var global = rx.global;
+ if (global) {
+ var fullUnicode = rx.unicode;
+ rx.lastIndex = 0;
+ }
+ var results = [];
+ while (true) {
+ var result = regExpExec(rx, S);
+ if (result === null) break;
+
+ results.push(result);
+ if (!global) break;
+
+ var matchStr = toString(result[0]);
+ if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);
+ }
+
+ var accumulatedResult = '';
+ var nextSourcePosition = 0;
+ for (var i = 0; i < results.length; i++) {
+ result = results[i];
+
+ var matched = toString(result[0]);
+ var position = max(min(toInteger(result.index), S.length), 0);
+ var captures = [];
+ // NOTE: This is equivalent to
+ // captures = result.slice(1).map(maybeToString)
+ // but for some reason `nativeSlice.call(result, 1, result.length)` (called in
+ // the slice polyfill when slicing native arrays) "doesn't work" in safari 9 and
+ // causes a crash (https://pastebin.com/N21QzeQA) when trying to debug it.
+ for (var j = 1; j < result.length; j++) captures.push(maybeToString(result[j]));
+ var namedCaptures = result.groups;
+ if (functionalReplace) {
+ var replacerArgs = [matched].concat(captures, position, S);
+ if (namedCaptures !== undefined) replacerArgs.push(namedCaptures);
+ var replacement = toString(replaceValue.apply(undefined, replacerArgs));
+ } else {
+ replacement = getSubstitution(matched, S, position, captures, namedCaptures, replaceValue);
+ }
+ if (position >= nextSourcePosition) {
+ accumulatedResult += S.slice(nextSourcePosition, position) + replacement;
+ nextSourcePosition = position + matched.length;
+ }
+ }
+ return accumulatedResult + S.slice(nextSourcePosition);
+ }
+ ];
+}, !REPLACE_SUPPORTS_NAMED_GROUPS || !REPLACE_KEEPS_$0 || REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE);
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.string.search.js":
+/*!**********************************************************!*\
+ !*** ./node_modules/core-js/modules/es.string.search.js ***!
+ \**********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var fixRegExpWellKnownSymbolLogic = __webpack_require__(/*! ../internals/fix-regexp-well-known-symbol-logic */ "./node_modules/core-js/internals/fix-regexp-well-known-symbol-logic.js");
+var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/core-js/internals/an-object.js");
+var requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ "./node_modules/core-js/internals/require-object-coercible.js");
+var sameValue = __webpack_require__(/*! ../internals/same-value */ "./node_modules/core-js/internals/same-value.js");
+var toString = __webpack_require__(/*! ../internals/to-string */ "./node_modules/core-js/internals/to-string.js");
+var getMethod = __webpack_require__(/*! ../internals/get-method */ "./node_modules/core-js/internals/get-method.js");
+var regExpExec = __webpack_require__(/*! ../internals/regexp-exec-abstract */ "./node_modules/core-js/internals/regexp-exec-abstract.js");
+
+// @@search logic
+fixRegExpWellKnownSymbolLogic('search', function (SEARCH, nativeSearch, maybeCallNative) {
+ return [
+ // `String.prototype.search` method
+ // https://tc39.es/ecma262/#sec-string.prototype.search
+ function search(regexp) {
+ var O = requireObjectCoercible(this);
+ var searcher = regexp == undefined ? undefined : getMethod(regexp, SEARCH);
+ return searcher ? searcher.call(regexp, O) : new RegExp(regexp)[SEARCH](toString(O));
+ },
+ // `RegExp.prototype[@@search]` method
+ // https://tc39.es/ecma262/#sec-regexp.prototype-@@search
+ function (string) {
+ var rx = anObject(this);
+ var S = toString(string);
+ var res = maybeCallNative(nativeSearch, rx, S);
+
+ if (res.done) return res.value;
+
+ var previousLastIndex = rx.lastIndex;
+ if (!sameValue(previousLastIndex, 0)) rx.lastIndex = 0;
+ var result = regExpExec(rx, S);
+ if (!sameValue(rx.lastIndex, previousLastIndex)) rx.lastIndex = previousLastIndex;
+ return result === null ? -1 : result.index;
+ }
+ ];
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.string.small.js":
+/*!*********************************************************!*\
+ !*** ./node_modules/core-js/modules/es.string.small.js ***!
+ \*********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var createHTML = __webpack_require__(/*! ../internals/create-html */ "./node_modules/core-js/internals/create-html.js");
+var forcedStringHTMLMethod = __webpack_require__(/*! ../internals/string-html-forced */ "./node_modules/core-js/internals/string-html-forced.js");
+
+// `String.prototype.small` method
+// https://tc39.es/ecma262/#sec-string.prototype.small
+$({ target: 'String', proto: true, forced: forcedStringHTMLMethod('small') }, {
+ small: function small() {
+ return createHTML(this, 'small', '', '');
+ }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.string.split.js":
+/*!*********************************************************!*\
+ !*** ./node_modules/core-js/modules/es.string.split.js ***!
+ \*********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var fixRegExpWellKnownSymbolLogic = __webpack_require__(/*! ../internals/fix-regexp-well-known-symbol-logic */ "./node_modules/core-js/internals/fix-regexp-well-known-symbol-logic.js");
+var isRegExp = __webpack_require__(/*! ../internals/is-regexp */ "./node_modules/core-js/internals/is-regexp.js");
+var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/core-js/internals/an-object.js");
+var requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ "./node_modules/core-js/internals/require-object-coercible.js");
+var speciesConstructor = __webpack_require__(/*! ../internals/species-constructor */ "./node_modules/core-js/internals/species-constructor.js");
+var advanceStringIndex = __webpack_require__(/*! ../internals/advance-string-index */ "./node_modules/core-js/internals/advance-string-index.js");
+var toLength = __webpack_require__(/*! ../internals/to-length */ "./node_modules/core-js/internals/to-length.js");
+var toString = __webpack_require__(/*! ../internals/to-string */ "./node_modules/core-js/internals/to-string.js");
+var getMethod = __webpack_require__(/*! ../internals/get-method */ "./node_modules/core-js/internals/get-method.js");
+var callRegExpExec = __webpack_require__(/*! ../internals/regexp-exec-abstract */ "./node_modules/core-js/internals/regexp-exec-abstract.js");
+var regexpExec = __webpack_require__(/*! ../internals/regexp-exec */ "./node_modules/core-js/internals/regexp-exec.js");
+var stickyHelpers = __webpack_require__(/*! ../internals/regexp-sticky-helpers */ "./node_modules/core-js/internals/regexp-sticky-helpers.js");
+var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js");
+
+var UNSUPPORTED_Y = stickyHelpers.UNSUPPORTED_Y;
+var arrayPush = [].push;
+var min = Math.min;
+var MAX_UINT32 = 0xFFFFFFFF;
+
+// Chrome 51 has a buggy "split" implementation when RegExp#exec !== nativeExec
+// Weex JS has frozen built-in prototypes, so use try / catch wrapper
+var SPLIT_WORKS_WITH_OVERWRITTEN_EXEC = !fails(function () {
+ // eslint-disable-next-line regexp/no-empty-group -- required for testing
+ var re = /(?:)/;
+ var originalExec = re.exec;
+ re.exec = function () { return originalExec.apply(this, arguments); };
+ var result = 'ab'.split(re);
+ return result.length !== 2 || result[0] !== 'a' || result[1] !== 'b';
+});
+
+// @@split logic
+fixRegExpWellKnownSymbolLogic('split', function (SPLIT, nativeSplit, maybeCallNative) {
+ var internalSplit;
+ if (
+ 'abbc'.split(/(b)*/)[1] == 'c' ||
+ // eslint-disable-next-line regexp/no-empty-group -- required for testing
+ 'test'.split(/(?:)/, -1).length != 4 ||
+ 'ab'.split(/(?:ab)*/).length != 2 ||
+ '.'.split(/(.?)(.?)/).length != 4 ||
+ // eslint-disable-next-line regexp/no-empty-capturing-group, regexp/no-empty-group -- required for testing
+ '.'.split(/()()/).length > 1 ||
+ ''.split(/.?/).length
+ ) {
+ // based on es5-shim implementation, need to rework it
+ internalSplit = function (separator, limit) {
+ var string = toString(requireObjectCoercible(this));
+ var lim = limit === undefined ? MAX_UINT32 : limit >>> 0;
+ if (lim === 0) return [];
+ if (separator === undefined) return [string];
+ // If `separator` is not a regex, use native split
+ if (!isRegExp(separator)) {
+ return nativeSplit.call(string, separator, lim);
+ }
+ var output = [];
+ var flags = (separator.ignoreCase ? 'i' : '') +
+ (separator.multiline ? 'm' : '') +
+ (separator.unicode ? 'u' : '') +
+ (separator.sticky ? 'y' : '');
+ var lastLastIndex = 0;
+ // Make `global` and avoid `lastIndex` issues by working with a copy
+ var separatorCopy = new RegExp(separator.source, flags + 'g');
+ var match, lastIndex, lastLength;
+ while (match = regexpExec.call(separatorCopy, string)) {
+ lastIndex = separatorCopy.lastIndex;
+ if (lastIndex > lastLastIndex) {
+ output.push(string.slice(lastLastIndex, match.index));
+ if (match.length > 1 && match.index < string.length) arrayPush.apply(output, match.slice(1));
+ lastLength = match[0].length;
+ lastLastIndex = lastIndex;
+ if (output.length >= lim) break;
+ }
+ if (separatorCopy.lastIndex === match.index) separatorCopy.lastIndex++; // Avoid an infinite loop
+ }
+ if (lastLastIndex === string.length) {
+ if (lastLength || !separatorCopy.test('')) output.push('');
+ } else output.push(string.slice(lastLastIndex));
+ return output.length > lim ? output.slice(0, lim) : output;
+ };
+ // Chakra, V8
+ } else if ('0'.split(undefined, 0).length) {
+ internalSplit = function (separator, limit) {
+ return separator === undefined && limit === 0 ? [] : nativeSplit.call(this, separator, limit);
+ };
+ } else internalSplit = nativeSplit;
+
+ return [
+ // `String.prototype.split` method
+ // https://tc39.es/ecma262/#sec-string.prototype.split
+ function split(separator, limit) {
+ var O = requireObjectCoercible(this);
+ var splitter = separator == undefined ? undefined : getMethod(separator, SPLIT);
+ return splitter
+ ? splitter.call(separator, O, limit)
+ : internalSplit.call(toString(O), separator, limit);
+ },
+ // `RegExp.prototype[@@split]` method
+ // https://tc39.es/ecma262/#sec-regexp.prototype-@@split
+ //
+ // NOTE: This cannot be properly polyfilled in engines that don't support
+ // the 'y' flag.
+ function (string, limit) {
+ var rx = anObject(this);
+ var S = toString(string);
+ var res = maybeCallNative(internalSplit, rx, S, limit, internalSplit !== nativeSplit);
+
+ if (res.done) return res.value;
+
+ var C = speciesConstructor(rx, RegExp);
+
+ var unicodeMatching = rx.unicode;
+ var flags = (rx.ignoreCase ? 'i' : '') +
+ (rx.multiline ? 'm' : '') +
+ (rx.unicode ? 'u' : '') +
+ (UNSUPPORTED_Y ? 'g' : 'y');
+
+ // ^(? + rx + ) is needed, in combination with some S slicing, to
+ // simulate the 'y' flag.
+ var splitter = new C(UNSUPPORTED_Y ? '^(?:' + rx.source + ')' : rx, flags);
+ var lim = limit === undefined ? MAX_UINT32 : limit >>> 0;
+ if (lim === 0) return [];
+ if (S.length === 0) return callRegExpExec(splitter, S) === null ? [S] : [];
+ var p = 0;
+ var q = 0;
+ var A = [];
+ while (q < S.length) {
+ splitter.lastIndex = UNSUPPORTED_Y ? 0 : q;
+ var z = callRegExpExec(splitter, UNSUPPORTED_Y ? S.slice(q) : S);
+ var e;
+ if (
+ z === null ||
+ (e = min(toLength(splitter.lastIndex + (UNSUPPORTED_Y ? q : 0)), S.length)) === p
+ ) {
+ q = advanceStringIndex(S, q, unicodeMatching);
+ } else {
+ A.push(S.slice(p, q));
+ if (A.length === lim) return A;
+ for (var i = 1; i <= z.length - 1; i++) {
+ A.push(z[i]);
+ if (A.length === lim) return A;
+ }
+ q = p = e;
+ }
+ }
+ A.push(S.slice(p));
+ return A;
+ }
+ ];
+}, !SPLIT_WORKS_WITH_OVERWRITTEN_EXEC, UNSUPPORTED_Y);
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.string.starts-with.js":
+/*!***************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.string.starts-with.js ***!
+ \***************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var getOwnPropertyDescriptor = __webpack_require__(/*! ../internals/object-get-own-property-descriptor */ "./node_modules/core-js/internals/object-get-own-property-descriptor.js").f;
+var toLength = __webpack_require__(/*! ../internals/to-length */ "./node_modules/core-js/internals/to-length.js");
+var toString = __webpack_require__(/*! ../internals/to-string */ "./node_modules/core-js/internals/to-string.js");
+var notARegExp = __webpack_require__(/*! ../internals/not-a-regexp */ "./node_modules/core-js/internals/not-a-regexp.js");
+var requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ "./node_modules/core-js/internals/require-object-coercible.js");
+var correctIsRegExpLogic = __webpack_require__(/*! ../internals/correct-is-regexp-logic */ "./node_modules/core-js/internals/correct-is-regexp-logic.js");
+var IS_PURE = __webpack_require__(/*! ../internals/is-pure */ "./node_modules/core-js/internals/is-pure.js");
+
+// eslint-disable-next-line es/no-string-prototype-startswith -- safe
+var $startsWith = ''.startsWith;
+var min = Math.min;
+
+var CORRECT_IS_REGEXP_LOGIC = correctIsRegExpLogic('startsWith');
+// https://github.com/zloirock/core-js/pull/702
+var MDN_POLYFILL_BUG = !IS_PURE && !CORRECT_IS_REGEXP_LOGIC && !!function () {
+ var descriptor = getOwnPropertyDescriptor(String.prototype, 'startsWith');
+ return descriptor && !descriptor.writable;
+}();
+
+// `String.prototype.startsWith` method
+// https://tc39.es/ecma262/#sec-string.prototype.startswith
+$({ target: 'String', proto: true, forced: !MDN_POLYFILL_BUG && !CORRECT_IS_REGEXP_LOGIC }, {
+ startsWith: function startsWith(searchString /* , position = 0 */) {
+ var that = toString(requireObjectCoercible(this));
+ notARegExp(searchString);
+ var index = toLength(min(arguments.length > 1 ? arguments[1] : undefined, that.length));
+ var search = toString(searchString);
+ return $startsWith
+ ? $startsWith.call(that, search, index)
+ : that.slice(index, index + search.length) === search;
+ }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.string.strike.js":
+/*!**********************************************************!*\
+ !*** ./node_modules/core-js/modules/es.string.strike.js ***!
+ \**********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var createHTML = __webpack_require__(/*! ../internals/create-html */ "./node_modules/core-js/internals/create-html.js");
+var forcedStringHTMLMethod = __webpack_require__(/*! ../internals/string-html-forced */ "./node_modules/core-js/internals/string-html-forced.js");
+
+// `String.prototype.strike` method
+// https://tc39.es/ecma262/#sec-string.prototype.strike
+$({ target: 'String', proto: true, forced: forcedStringHTMLMethod('strike') }, {
+ strike: function strike() {
+ return createHTML(this, 'strike', '', '');
+ }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.string.sub.js":
+/*!*******************************************************!*\
+ !*** ./node_modules/core-js/modules/es.string.sub.js ***!
+ \*******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var createHTML = __webpack_require__(/*! ../internals/create-html */ "./node_modules/core-js/internals/create-html.js");
+var forcedStringHTMLMethod = __webpack_require__(/*! ../internals/string-html-forced */ "./node_modules/core-js/internals/string-html-forced.js");
+
+// `String.prototype.sub` method
+// https://tc39.es/ecma262/#sec-string.prototype.sub
+$({ target: 'String', proto: true, forced: forcedStringHTMLMethod('sub') }, {
+ sub: function sub() {
+ return createHTML(this, 'sub', '', '');
+ }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.string.substr.js":
+/*!**********************************************************!*\
+ !*** ./node_modules/core-js/modules/es.string.substr.js ***!
+ \**********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ "./node_modules/core-js/internals/require-object-coercible.js");
+var toInteger = __webpack_require__(/*! ../internals/to-integer */ "./node_modules/core-js/internals/to-integer.js");
+var toString = __webpack_require__(/*! ../internals/to-string */ "./node_modules/core-js/internals/to-string.js");
+
+var slice = ''.slice;
+var max = Math.max;
+var min = Math.min;
+
+// eslint-disable-next-line unicorn/prefer-string-slice -- required for testing
+var FORCED = !''.substr || 'ab'.substr(-1) !== 'b';
+
+// `String.prototype.substr` method
+// https://tc39.es/ecma262/#sec-string.prototype.substr
+$({ target: 'String', proto: true, forced: FORCED }, {
+ substr: function substr(start, length) {
+ var that = toString(requireObjectCoercible(this));
+ var size = that.length;
+ var intStart = toInteger(start);
+ var intLength, intEnd;
+ if (intStart === Infinity) intStart = 0;
+ if (intStart < 0) intStart = max(size + intStart, 0);
+ intLength = length === undefined ? size : toInteger(length);
+ if (intLength <= 0 || intLength === Infinity) return '';
+ intEnd = min(intStart + intLength, size);
+ return intStart >= intEnd ? '' : slice.call(that, intStart, intEnd);
+ }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.string.sup.js":
+/*!*******************************************************!*\
+ !*** ./node_modules/core-js/modules/es.string.sup.js ***!
+ \*******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var createHTML = __webpack_require__(/*! ../internals/create-html */ "./node_modules/core-js/internals/create-html.js");
+var forcedStringHTMLMethod = __webpack_require__(/*! ../internals/string-html-forced */ "./node_modules/core-js/internals/string-html-forced.js");
+
+// `String.prototype.sup` method
+// https://tc39.es/ecma262/#sec-string.prototype.sup
+$({ target: 'String', proto: true, forced: forcedStringHTMLMethod('sup') }, {
+ sup: function sup() {
+ return createHTML(this, 'sup', '', '');
+ }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.string.trim-end.js":
+/*!************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.string.trim-end.js ***!
+ \************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var $trimEnd = __webpack_require__(/*! ../internals/string-trim */ "./node_modules/core-js/internals/string-trim.js").end;
+var forcedStringTrimMethod = __webpack_require__(/*! ../internals/string-trim-forced */ "./node_modules/core-js/internals/string-trim-forced.js");
+
+var FORCED = forcedStringTrimMethod('trimEnd');
+
+var trimEnd = FORCED ? function trimEnd() {
+ return $trimEnd(this);
+// eslint-disable-next-line es/no-string-prototype-trimstart-trimend -- safe
+} : ''.trimEnd;
+
+// `String.prototype.{ trimEnd, trimRight }` methods
+// https://tc39.es/ecma262/#sec-string.prototype.trimend
+// https://tc39.es/ecma262/#String.prototype.trimright
+$({ target: 'String', proto: true, name: 'trimEnd', forced: FORCED }, {
+ trimEnd: trimEnd,
+ trimRight: trimEnd
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.string.trim-start.js":
+/*!**************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.string.trim-start.js ***!
+ \**************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var $trimStart = __webpack_require__(/*! ../internals/string-trim */ "./node_modules/core-js/internals/string-trim.js").start;
+var forcedStringTrimMethod = __webpack_require__(/*! ../internals/string-trim-forced */ "./node_modules/core-js/internals/string-trim-forced.js");
+
+var FORCED = forcedStringTrimMethod('trimStart');
+
+var trimStart = FORCED ? function trimStart() {
+ return $trimStart(this);
+// eslint-disable-next-line es/no-string-prototype-trimstart-trimend -- safe
+} : ''.trimStart;
+
+// `String.prototype.{ trimStart, trimLeft }` methods
+// https://tc39.es/ecma262/#sec-string.prototype.trimstart
+// https://tc39.es/ecma262/#String.prototype.trimleft
+$({ target: 'String', proto: true, name: 'trimStart', forced: FORCED }, {
+ trimStart: trimStart,
+ trimLeft: trimStart
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.string.trim.js":
+/*!********************************************************!*\
+ !*** ./node_modules/core-js/modules/es.string.trim.js ***!
+ \********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var $trim = __webpack_require__(/*! ../internals/string-trim */ "./node_modules/core-js/internals/string-trim.js").trim;
+var forcedStringTrimMethod = __webpack_require__(/*! ../internals/string-trim-forced */ "./node_modules/core-js/internals/string-trim-forced.js");
+
+// `String.prototype.trim` method
+// https://tc39.es/ecma262/#sec-string.prototype.trim
+$({ target: 'String', proto: true, forced: forcedStringTrimMethod('trim') }, {
+ trim: function trim() {
+ return $trim(this);
+ }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.symbol.async-iterator.js":
+/*!******************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.symbol.async-iterator.js ***!
+ \******************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var defineWellKnownSymbol = __webpack_require__(/*! ../internals/define-well-known-symbol */ "./node_modules/core-js/internals/define-well-known-symbol.js");
+
+// `Symbol.asyncIterator` well-known symbol
+// https://tc39.es/ecma262/#sec-symbol.asynciterator
+defineWellKnownSymbol('asyncIterator');
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.symbol.description.js":
+/*!***************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.symbol.description.js ***!
+ \***************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+// `Symbol.prototype.description` getter
+// https://tc39.es/ecma262/#sec-symbol.prototype.description
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/core-js/internals/descriptors.js");
+var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js");
+var has = __webpack_require__(/*! ../internals/has */ "./node_modules/core-js/internals/has.js");
+var isCallable = __webpack_require__(/*! ../internals/is-callable */ "./node_modules/core-js/internals/is-callable.js");
+var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/core-js/internals/is-object.js");
+var defineProperty = __webpack_require__(/*! ../internals/object-define-property */ "./node_modules/core-js/internals/object-define-property.js").f;
+var copyConstructorProperties = __webpack_require__(/*! ../internals/copy-constructor-properties */ "./node_modules/core-js/internals/copy-constructor-properties.js");
+
+var NativeSymbol = global.Symbol;
+
+if (DESCRIPTORS && isCallable(NativeSymbol) && (!('description' in NativeSymbol.prototype) ||
+ // Safari 12 bug
+ NativeSymbol().description !== undefined
+)) {
+ var EmptyStringDescriptionStore = {};
+ // wrap Symbol constructor for correct work with undefined description
+ var SymbolWrapper = function Symbol() {
+ var description = arguments.length < 1 || arguments[0] === undefined ? undefined : String(arguments[0]);
+ var result = this instanceof SymbolWrapper
+ ? new NativeSymbol(description)
+ // in Edge 13, String(Symbol(undefined)) === 'Symbol(undefined)'
+ : description === undefined ? NativeSymbol() : NativeSymbol(description);
+ if (description === '') EmptyStringDescriptionStore[result] = true;
+ return result;
+ };
+ copyConstructorProperties(SymbolWrapper, NativeSymbol);
+ var symbolPrototype = SymbolWrapper.prototype = NativeSymbol.prototype;
+ symbolPrototype.constructor = SymbolWrapper;
+
+ var symbolToString = symbolPrototype.toString;
+ var nativeSymbol = String(NativeSymbol('test')) == 'Symbol(test)';
+ var regexp = /^Symbol\((.*)\)[^)]+$/;
+ defineProperty(symbolPrototype, 'description', {
+ configurable: true,
+ get: function description() {
+ var symbol = isObject(this) ? this.valueOf() : this;
+ var string = symbolToString.call(symbol);
+ if (has(EmptyStringDescriptionStore, symbol)) return '';
+ var desc = nativeSymbol ? string.slice(7, -1) : string.replace(regexp, '$1');
+ return desc === '' ? undefined : desc;
+ }
+ });
+
+ $({ global: true, forced: true }, {
+ Symbol: SymbolWrapper
+ });
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.symbol.has-instance.js":
+/*!****************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.symbol.has-instance.js ***!
+ \****************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var defineWellKnownSymbol = __webpack_require__(/*! ../internals/define-well-known-symbol */ "./node_modules/core-js/internals/define-well-known-symbol.js");
+
+// `Symbol.hasInstance` well-known symbol
+// https://tc39.es/ecma262/#sec-symbol.hasinstance
+defineWellKnownSymbol('hasInstance');
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.symbol.is-concat-spreadable.js":
+/*!************************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.symbol.is-concat-spreadable.js ***!
+ \************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var defineWellKnownSymbol = __webpack_require__(/*! ../internals/define-well-known-symbol */ "./node_modules/core-js/internals/define-well-known-symbol.js");
+
+// `Symbol.isConcatSpreadable` well-known symbol
+// https://tc39.es/ecma262/#sec-symbol.isconcatspreadable
+defineWellKnownSymbol('isConcatSpreadable');
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.symbol.iterator.js":
+/*!************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.symbol.iterator.js ***!
+ \************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var defineWellKnownSymbol = __webpack_require__(/*! ../internals/define-well-known-symbol */ "./node_modules/core-js/internals/define-well-known-symbol.js");
+
+// `Symbol.iterator` well-known symbol
+// https://tc39.es/ecma262/#sec-symbol.iterator
+defineWellKnownSymbol('iterator');
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.symbol.js":
+/*!***************************************************!*\
+ !*** ./node_modules/core-js/modules/es.symbol.js ***!
+ \***************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js");
+var getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ "./node_modules/core-js/internals/get-built-in.js");
+var IS_PURE = __webpack_require__(/*! ../internals/is-pure */ "./node_modules/core-js/internals/is-pure.js");
+var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/core-js/internals/descriptors.js");
+var NATIVE_SYMBOL = __webpack_require__(/*! ../internals/native-symbol */ "./node_modules/core-js/internals/native-symbol.js");
+var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js");
+var has = __webpack_require__(/*! ../internals/has */ "./node_modules/core-js/internals/has.js");
+var isArray = __webpack_require__(/*! ../internals/is-array */ "./node_modules/core-js/internals/is-array.js");
+var isCallable = __webpack_require__(/*! ../internals/is-callable */ "./node_modules/core-js/internals/is-callable.js");
+var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/core-js/internals/is-object.js");
+var isSymbol = __webpack_require__(/*! ../internals/is-symbol */ "./node_modules/core-js/internals/is-symbol.js");
+var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/core-js/internals/an-object.js");
+var toObject = __webpack_require__(/*! ../internals/to-object */ "./node_modules/core-js/internals/to-object.js");
+var toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ "./node_modules/core-js/internals/to-indexed-object.js");
+var toPropertyKey = __webpack_require__(/*! ../internals/to-property-key */ "./node_modules/core-js/internals/to-property-key.js");
+var $toString = __webpack_require__(/*! ../internals/to-string */ "./node_modules/core-js/internals/to-string.js");
+var createPropertyDescriptor = __webpack_require__(/*! ../internals/create-property-descriptor */ "./node_modules/core-js/internals/create-property-descriptor.js");
+var nativeObjectCreate = __webpack_require__(/*! ../internals/object-create */ "./node_modules/core-js/internals/object-create.js");
+var objectKeys = __webpack_require__(/*! ../internals/object-keys */ "./node_modules/core-js/internals/object-keys.js");
+var getOwnPropertyNamesModule = __webpack_require__(/*! ../internals/object-get-own-property-names */ "./node_modules/core-js/internals/object-get-own-property-names.js");
+var getOwnPropertyNamesExternal = __webpack_require__(/*! ../internals/object-get-own-property-names-external */ "./node_modules/core-js/internals/object-get-own-property-names-external.js");
+var getOwnPropertySymbolsModule = __webpack_require__(/*! ../internals/object-get-own-property-symbols */ "./node_modules/core-js/internals/object-get-own-property-symbols.js");
+var getOwnPropertyDescriptorModule = __webpack_require__(/*! ../internals/object-get-own-property-descriptor */ "./node_modules/core-js/internals/object-get-own-property-descriptor.js");
+var definePropertyModule = __webpack_require__(/*! ../internals/object-define-property */ "./node_modules/core-js/internals/object-define-property.js");
+var propertyIsEnumerableModule = __webpack_require__(/*! ../internals/object-property-is-enumerable */ "./node_modules/core-js/internals/object-property-is-enumerable.js");
+var redefine = __webpack_require__(/*! ../internals/redefine */ "./node_modules/core-js/internals/redefine.js");
+var shared = __webpack_require__(/*! ../internals/shared */ "./node_modules/core-js/internals/shared.js");
+var sharedKey = __webpack_require__(/*! ../internals/shared-key */ "./node_modules/core-js/internals/shared-key.js");
+var hiddenKeys = __webpack_require__(/*! ../internals/hidden-keys */ "./node_modules/core-js/internals/hidden-keys.js");
+var uid = __webpack_require__(/*! ../internals/uid */ "./node_modules/core-js/internals/uid.js");
+var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js");
+var wrappedWellKnownSymbolModule = __webpack_require__(/*! ../internals/well-known-symbol-wrapped */ "./node_modules/core-js/internals/well-known-symbol-wrapped.js");
+var defineWellKnownSymbol = __webpack_require__(/*! ../internals/define-well-known-symbol */ "./node_modules/core-js/internals/define-well-known-symbol.js");
+var setToStringTag = __webpack_require__(/*! ../internals/set-to-string-tag */ "./node_modules/core-js/internals/set-to-string-tag.js");
+var InternalStateModule = __webpack_require__(/*! ../internals/internal-state */ "./node_modules/core-js/internals/internal-state.js");
+var $forEach = __webpack_require__(/*! ../internals/array-iteration */ "./node_modules/core-js/internals/array-iteration.js").forEach;
+
+var HIDDEN = sharedKey('hidden');
+var SYMBOL = 'Symbol';
+var PROTOTYPE = 'prototype';
+var TO_PRIMITIVE = wellKnownSymbol('toPrimitive');
+var setInternalState = InternalStateModule.set;
+var getInternalState = InternalStateModule.getterFor(SYMBOL);
+var ObjectPrototype = Object[PROTOTYPE];
+var $Symbol = global.Symbol;
+var $stringify = getBuiltIn('JSON', 'stringify');
+var nativeGetOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f;
+var nativeDefineProperty = definePropertyModule.f;
+var nativeGetOwnPropertyNames = getOwnPropertyNamesExternal.f;
+var nativePropertyIsEnumerable = propertyIsEnumerableModule.f;
+var AllSymbols = shared('symbols');
+var ObjectPrototypeSymbols = shared('op-symbols');
+var StringToSymbolRegistry = shared('string-to-symbol-registry');
+var SymbolToStringRegistry = shared('symbol-to-string-registry');
+var WellKnownSymbolsStore = shared('wks');
+var QObject = global.QObject;
+// Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173
+var USE_SETTER = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild;
+
+// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687
+var setSymbolDescriptor = DESCRIPTORS && fails(function () {
+ return nativeObjectCreate(nativeDefineProperty({}, 'a', {
+ get: function () { return nativeDefineProperty(this, 'a', { value: 7 }).a; }
+ })).a != 7;
+}) ? function (O, P, Attributes) {
+ var ObjectPrototypeDescriptor = nativeGetOwnPropertyDescriptor(ObjectPrototype, P);
+ if (ObjectPrototypeDescriptor) delete ObjectPrototype[P];
+ nativeDefineProperty(O, P, Attributes);
+ if (ObjectPrototypeDescriptor && O !== ObjectPrototype) {
+ nativeDefineProperty(ObjectPrototype, P, ObjectPrototypeDescriptor);
+ }
+} : nativeDefineProperty;
+
+var wrap = function (tag, description) {
+ var symbol = AllSymbols[tag] = nativeObjectCreate($Symbol[PROTOTYPE]);
+ setInternalState(symbol, {
+ type: SYMBOL,
+ tag: tag,
+ description: description
+ });
+ if (!DESCRIPTORS) symbol.description = description;
+ return symbol;
+};
+
+var $defineProperty = function defineProperty(O, P, Attributes) {
+ if (O === ObjectPrototype) $defineProperty(ObjectPrototypeSymbols, P, Attributes);
+ anObject(O);
+ var key = toPropertyKey(P);
+ anObject(Attributes);
+ if (has(AllSymbols, key)) {
+ if (!Attributes.enumerable) {
+ if (!has(O, HIDDEN)) nativeDefineProperty(O, HIDDEN, createPropertyDescriptor(1, {}));
+ O[HIDDEN][key] = true;
+ } else {
+ if (has(O, HIDDEN) && O[HIDDEN][key]) O[HIDDEN][key] = false;
+ Attributes = nativeObjectCreate(Attributes, { enumerable: createPropertyDescriptor(0, false) });
+ } return setSymbolDescriptor(O, key, Attributes);
+ } return nativeDefineProperty(O, key, Attributes);
+};
+
+var $defineProperties = function defineProperties(O, Properties) {
+ anObject(O);
+ var properties = toIndexedObject(Properties);
+ var keys = objectKeys(properties).concat($getOwnPropertySymbols(properties));
+ $forEach(keys, function (key) {
+ if (!DESCRIPTORS || $propertyIsEnumerable.call(properties, key)) $defineProperty(O, key, properties[key]);
+ });
+ return O;
+};
+
+var $create = function create(O, Properties) {
+ return Properties === undefined ? nativeObjectCreate(O) : $defineProperties(nativeObjectCreate(O), Properties);
+};
+
+var $propertyIsEnumerable = function propertyIsEnumerable(V) {
+ var P = toPropertyKey(V);
+ var enumerable = nativePropertyIsEnumerable.call(this, P);
+ if (this === ObjectPrototype && has(AllSymbols, P) && !has(ObjectPrototypeSymbols, P)) return false;
+ return enumerable || !has(this, P) || !has(AllSymbols, P) || has(this, HIDDEN) && this[HIDDEN][P] ? enumerable : true;
+};
+
+var $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(O, P) {
+ var it = toIndexedObject(O);
+ var key = toPropertyKey(P);
+ if (it === ObjectPrototype && has(AllSymbols, key) && !has(ObjectPrototypeSymbols, key)) return;
+ var descriptor = nativeGetOwnPropertyDescriptor(it, key);
+ if (descriptor && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key])) {
+ descriptor.enumerable = true;
+ }
+ return descriptor;
+};
+
+var $getOwnPropertyNames = function getOwnPropertyNames(O) {
+ var names = nativeGetOwnPropertyNames(toIndexedObject(O));
+ var result = [];
+ $forEach(names, function (key) {
+ if (!has(AllSymbols, key) && !has(hiddenKeys, key)) result.push(key);
+ });
+ return result;
+};
+
+var $getOwnPropertySymbols = function getOwnPropertySymbols(O) {
+ var IS_OBJECT_PROTOTYPE = O === ObjectPrototype;
+ var names = nativeGetOwnPropertyNames(IS_OBJECT_PROTOTYPE ? ObjectPrototypeSymbols : toIndexedObject(O));
+ var result = [];
+ $forEach(names, function (key) {
+ if (has(AllSymbols, key) && (!IS_OBJECT_PROTOTYPE || has(ObjectPrototype, key))) {
+ result.push(AllSymbols[key]);
+ }
+ });
+ return result;
+};
+
+// `Symbol` constructor
+// https://tc39.es/ecma262/#sec-symbol-constructor
+if (!NATIVE_SYMBOL) {
+ $Symbol = function Symbol() {
+ if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor');
+ var description = !arguments.length || arguments[0] === undefined ? undefined : $toString(arguments[0]);
+ var tag = uid(description);
+ var setter = function (value) {
+ if (this === ObjectPrototype) setter.call(ObjectPrototypeSymbols, value);
+ if (has(this, HIDDEN) && has(this[HIDDEN], tag)) this[HIDDEN][tag] = false;
+ setSymbolDescriptor(this, tag, createPropertyDescriptor(1, value));
+ };
+ if (DESCRIPTORS && USE_SETTER) setSymbolDescriptor(ObjectPrototype, tag, { configurable: true, set: setter });
+ return wrap(tag, description);
+ };
+
+ redefine($Symbol[PROTOTYPE], 'toString', function toString() {
+ return getInternalState(this).tag;
+ });
+
+ redefine($Symbol, 'withoutSetter', function (description) {
+ return wrap(uid(description), description);
+ });
+
+ propertyIsEnumerableModule.f = $propertyIsEnumerable;
+ definePropertyModule.f = $defineProperty;
+ getOwnPropertyDescriptorModule.f = $getOwnPropertyDescriptor;
+ getOwnPropertyNamesModule.f = getOwnPropertyNamesExternal.f = $getOwnPropertyNames;
+ getOwnPropertySymbolsModule.f = $getOwnPropertySymbols;
+
+ wrappedWellKnownSymbolModule.f = function (name) {
+ return wrap(wellKnownSymbol(name), name);
+ };
+
+ if (DESCRIPTORS) {
+ // https://github.com/tc39/proposal-Symbol-description
+ nativeDefineProperty($Symbol[PROTOTYPE], 'description', {
+ configurable: true,
+ get: function description() {
+ return getInternalState(this).description;
+ }
+ });
+ if (!IS_PURE) {
+ redefine(ObjectPrototype, 'propertyIsEnumerable', $propertyIsEnumerable, { unsafe: true });
+ }
+ }
+}
+
+$({ global: true, wrap: true, forced: !NATIVE_SYMBOL, sham: !NATIVE_SYMBOL }, {
+ Symbol: $Symbol
+});
+
+$forEach(objectKeys(WellKnownSymbolsStore), function (name) {
+ defineWellKnownSymbol(name);
+});
+
+$({ target: SYMBOL, stat: true, forced: !NATIVE_SYMBOL }, {
+ // `Symbol.for` method
+ // https://tc39.es/ecma262/#sec-symbol.for
+ 'for': function (key) {
+ var string = $toString(key);
+ if (has(StringToSymbolRegistry, string)) return StringToSymbolRegistry[string];
+ var symbol = $Symbol(string);
+ StringToSymbolRegistry[string] = symbol;
+ SymbolToStringRegistry[symbol] = string;
+ return symbol;
+ },
+ // `Symbol.keyFor` method
+ // https://tc39.es/ecma262/#sec-symbol.keyfor
+ keyFor: function keyFor(sym) {
+ if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol');
+ if (has(SymbolToStringRegistry, sym)) return SymbolToStringRegistry[sym];
+ },
+ useSetter: function () { USE_SETTER = true; },
+ useSimple: function () { USE_SETTER = false; }
+});
+
+$({ target: 'Object', stat: true, forced: !NATIVE_SYMBOL, sham: !DESCRIPTORS }, {
+ // `Object.create` method
+ // https://tc39.es/ecma262/#sec-object.create
+ create: $create,
+ // `Object.defineProperty` method
+ // https://tc39.es/ecma262/#sec-object.defineproperty
+ defineProperty: $defineProperty,
+ // `Object.defineProperties` method
+ // https://tc39.es/ecma262/#sec-object.defineproperties
+ defineProperties: $defineProperties,
+ // `Object.getOwnPropertyDescriptor` method
+ // https://tc39.es/ecma262/#sec-object.getownpropertydescriptors
+ getOwnPropertyDescriptor: $getOwnPropertyDescriptor
+});
+
+$({ target: 'Object', stat: true, forced: !NATIVE_SYMBOL }, {
+ // `Object.getOwnPropertyNames` method
+ // https://tc39.es/ecma262/#sec-object.getownpropertynames
+ getOwnPropertyNames: $getOwnPropertyNames,
+ // `Object.getOwnPropertySymbols` method
+ // https://tc39.es/ecma262/#sec-object.getownpropertysymbols
+ getOwnPropertySymbols: $getOwnPropertySymbols
+});
+
+// Chrome 38 and 39 `Object.getOwnPropertySymbols` fails on primitives
+// https://bugs.chromium.org/p/v8/issues/detail?id=3443
+$({ target: 'Object', stat: true, forced: fails(function () { getOwnPropertySymbolsModule.f(1); }) }, {
+ getOwnPropertySymbols: function getOwnPropertySymbols(it) {
+ return getOwnPropertySymbolsModule.f(toObject(it));
+ }
+});
+
+// `JSON.stringify` method behavior with symbols
+// https://tc39.es/ecma262/#sec-json.stringify
+if ($stringify) {
+ var FORCED_JSON_STRINGIFY = !NATIVE_SYMBOL || fails(function () {
+ var symbol = $Symbol();
+ // MS Edge converts symbol values to JSON as {}
+ return $stringify([symbol]) != '[null]'
+ // WebKit converts symbol values to JSON as null
+ || $stringify({ a: symbol }) != '{}'
+ // V8 throws on boxed symbols
+ || $stringify(Object(symbol)) != '{}';
+ });
+
+ $({ target: 'JSON', stat: true, forced: FORCED_JSON_STRINGIFY }, {
+ // eslint-disable-next-line no-unused-vars -- required for `.length`
+ stringify: function stringify(it, replacer, space) {
+ var args = [it];
+ var index = 1;
+ var $replacer;
+ while (arguments.length > index) args.push(arguments[index++]);
+ $replacer = replacer;
+ if (!isObject(replacer) && it === undefined || isSymbol(it)) return; // IE8 returns string on undefined
+ if (!isArray(replacer)) replacer = function (key, value) {
+ if (isCallable($replacer)) value = $replacer.call(this, key, value);
+ if (!isSymbol(value)) return value;
+ };
+ args[1] = replacer;
+ return $stringify.apply(null, args);
+ }
+ });
+}
+
+// `Symbol.prototype[@@toPrimitive]` method
+// https://tc39.es/ecma262/#sec-symbol.prototype-@@toprimitive
+if (!$Symbol[PROTOTYPE][TO_PRIMITIVE]) {
+ var valueOf = $Symbol[PROTOTYPE].valueOf;
+ redefine($Symbol[PROTOTYPE], TO_PRIMITIVE, function () {
+ return valueOf.apply(this, arguments);
+ });
+}
+// `Symbol.prototype[@@toStringTag]` property
+// https://tc39.es/ecma262/#sec-symbol.prototype-@@tostringtag
+setToStringTag($Symbol, SYMBOL);
+
+hiddenKeys[HIDDEN] = true;
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.symbol.match-all.js":
+/*!*************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.symbol.match-all.js ***!
+ \*************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var defineWellKnownSymbol = __webpack_require__(/*! ../internals/define-well-known-symbol */ "./node_modules/core-js/internals/define-well-known-symbol.js");
+
+// `Symbol.matchAll` well-known symbol
+// https://tc39.es/ecma262/#sec-symbol.matchall
+defineWellKnownSymbol('matchAll');
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.symbol.match.js":
+/*!*********************************************************!*\
+ !*** ./node_modules/core-js/modules/es.symbol.match.js ***!
+ \*********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var defineWellKnownSymbol = __webpack_require__(/*! ../internals/define-well-known-symbol */ "./node_modules/core-js/internals/define-well-known-symbol.js");
+
+// `Symbol.match` well-known symbol
+// https://tc39.es/ecma262/#sec-symbol.match
+defineWellKnownSymbol('match');
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.symbol.replace.js":
+/*!***********************************************************!*\
+ !*** ./node_modules/core-js/modules/es.symbol.replace.js ***!
+ \***********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var defineWellKnownSymbol = __webpack_require__(/*! ../internals/define-well-known-symbol */ "./node_modules/core-js/internals/define-well-known-symbol.js");
+
+// `Symbol.replace` well-known symbol
+// https://tc39.es/ecma262/#sec-symbol.replace
+defineWellKnownSymbol('replace');
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.symbol.search.js":
+/*!**********************************************************!*\
+ !*** ./node_modules/core-js/modules/es.symbol.search.js ***!
+ \**********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var defineWellKnownSymbol = __webpack_require__(/*! ../internals/define-well-known-symbol */ "./node_modules/core-js/internals/define-well-known-symbol.js");
+
+// `Symbol.search` well-known symbol
+// https://tc39.es/ecma262/#sec-symbol.search
+defineWellKnownSymbol('search');
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.symbol.species.js":
+/*!***********************************************************!*\
+ !*** ./node_modules/core-js/modules/es.symbol.species.js ***!
+ \***********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var defineWellKnownSymbol = __webpack_require__(/*! ../internals/define-well-known-symbol */ "./node_modules/core-js/internals/define-well-known-symbol.js");
+
+// `Symbol.species` well-known symbol
+// https://tc39.es/ecma262/#sec-symbol.species
+defineWellKnownSymbol('species');
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.symbol.split.js":
+/*!*********************************************************!*\
+ !*** ./node_modules/core-js/modules/es.symbol.split.js ***!
+ \*********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var defineWellKnownSymbol = __webpack_require__(/*! ../internals/define-well-known-symbol */ "./node_modules/core-js/internals/define-well-known-symbol.js");
+
+// `Symbol.split` well-known symbol
+// https://tc39.es/ecma262/#sec-symbol.split
+defineWellKnownSymbol('split');
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.symbol.to-primitive.js":
+/*!****************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.symbol.to-primitive.js ***!
+ \****************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var defineWellKnownSymbol = __webpack_require__(/*! ../internals/define-well-known-symbol */ "./node_modules/core-js/internals/define-well-known-symbol.js");
+
+// `Symbol.toPrimitive` well-known symbol
+// https://tc39.es/ecma262/#sec-symbol.toprimitive
+defineWellKnownSymbol('toPrimitive');
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.symbol.to-string-tag.js":
+/*!*****************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.symbol.to-string-tag.js ***!
+ \*****************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var defineWellKnownSymbol = __webpack_require__(/*! ../internals/define-well-known-symbol */ "./node_modules/core-js/internals/define-well-known-symbol.js");
+
+// `Symbol.toStringTag` well-known symbol
+// https://tc39.es/ecma262/#sec-symbol.tostringtag
+defineWellKnownSymbol('toStringTag');
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.symbol.unscopables.js":
+/*!***************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.symbol.unscopables.js ***!
+ \***************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var defineWellKnownSymbol = __webpack_require__(/*! ../internals/define-well-known-symbol */ "./node_modules/core-js/internals/define-well-known-symbol.js");
+
+// `Symbol.unscopables` well-known symbol
+// https://tc39.es/ecma262/#sec-symbol.unscopables
+defineWellKnownSymbol('unscopables');
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.typed-array.at.js":
+/*!***********************************************************!*\
+ !*** ./node_modules/core-js/modules/es.typed-array.at.js ***!
+ \***********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var ArrayBufferViewCore = __webpack_require__(/*! ../internals/array-buffer-view-core */ "./node_modules/core-js/internals/array-buffer-view-core.js");
+var toLength = __webpack_require__(/*! ../internals/to-length */ "./node_modules/core-js/internals/to-length.js");
+var toInteger = __webpack_require__(/*! ../internals/to-integer */ "./node_modules/core-js/internals/to-integer.js");
+
+var aTypedArray = ArrayBufferViewCore.aTypedArray;
+var exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;
+
+// `%TypedArray%.prototype.at` method
+// https://github.com/tc39/proposal-relative-indexing-method
+exportTypedArrayMethod('at', function at(index) {
+ var O = aTypedArray(this);
+ var len = toLength(O.length);
+ var relativeIndex = toInteger(index);
+ var k = relativeIndex >= 0 ? relativeIndex : len + relativeIndex;
+ return (k < 0 || k >= len) ? undefined : O[k];
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.typed-array.copy-within.js":
+/*!********************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.typed-array.copy-within.js ***!
+ \********************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var ArrayBufferViewCore = __webpack_require__(/*! ../internals/array-buffer-view-core */ "./node_modules/core-js/internals/array-buffer-view-core.js");
+var $copyWithin = __webpack_require__(/*! ../internals/array-copy-within */ "./node_modules/core-js/internals/array-copy-within.js");
+
+var aTypedArray = ArrayBufferViewCore.aTypedArray;
+var exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;
+
+// `%TypedArray%.prototype.copyWithin` method
+// https://tc39.es/ecma262/#sec-%typedarray%.prototype.copywithin
+exportTypedArrayMethod('copyWithin', function copyWithin(target, start /* , end */) {
+ return $copyWithin.call(aTypedArray(this), target, start, arguments.length > 2 ? arguments[2] : undefined);
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.typed-array.every.js":
+/*!**************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.typed-array.every.js ***!
+ \**************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var ArrayBufferViewCore = __webpack_require__(/*! ../internals/array-buffer-view-core */ "./node_modules/core-js/internals/array-buffer-view-core.js");
+var $every = __webpack_require__(/*! ../internals/array-iteration */ "./node_modules/core-js/internals/array-iteration.js").every;
+
+var aTypedArray = ArrayBufferViewCore.aTypedArray;
+var exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;
+
+// `%TypedArray%.prototype.every` method
+// https://tc39.es/ecma262/#sec-%typedarray%.prototype.every
+exportTypedArrayMethod('every', function every(callbackfn /* , thisArg */) {
+ return $every(aTypedArray(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.typed-array.fill.js":
+/*!*************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.typed-array.fill.js ***!
+ \*************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var ArrayBufferViewCore = __webpack_require__(/*! ../internals/array-buffer-view-core */ "./node_modules/core-js/internals/array-buffer-view-core.js");
+var $fill = __webpack_require__(/*! ../internals/array-fill */ "./node_modules/core-js/internals/array-fill.js");
+
+var aTypedArray = ArrayBufferViewCore.aTypedArray;
+var exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;
+
+// `%TypedArray%.prototype.fill` method
+// https://tc39.es/ecma262/#sec-%typedarray%.prototype.fill
+// eslint-disable-next-line no-unused-vars -- required for `.length`
+exportTypedArrayMethod('fill', function fill(value /* , start, end */) {
+ return $fill.apply(aTypedArray(this), arguments);
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.typed-array.filter.js":
+/*!***************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.typed-array.filter.js ***!
+ \***************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var ArrayBufferViewCore = __webpack_require__(/*! ../internals/array-buffer-view-core */ "./node_modules/core-js/internals/array-buffer-view-core.js");
+var $filter = __webpack_require__(/*! ../internals/array-iteration */ "./node_modules/core-js/internals/array-iteration.js").filter;
+var fromSpeciesAndList = __webpack_require__(/*! ../internals/typed-array-from-species-and-list */ "./node_modules/core-js/internals/typed-array-from-species-and-list.js");
+
+var aTypedArray = ArrayBufferViewCore.aTypedArray;
+var exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;
+
+// `%TypedArray%.prototype.filter` method
+// https://tc39.es/ecma262/#sec-%typedarray%.prototype.filter
+exportTypedArrayMethod('filter', function filter(callbackfn /* , thisArg */) {
+ var list = $filter(aTypedArray(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);
+ return fromSpeciesAndList(this, list);
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.typed-array.find-index.js":
+/*!*******************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.typed-array.find-index.js ***!
+ \*******************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var ArrayBufferViewCore = __webpack_require__(/*! ../internals/array-buffer-view-core */ "./node_modules/core-js/internals/array-buffer-view-core.js");
+var $findIndex = __webpack_require__(/*! ../internals/array-iteration */ "./node_modules/core-js/internals/array-iteration.js").findIndex;
+
+var aTypedArray = ArrayBufferViewCore.aTypedArray;
+var exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;
+
+// `%TypedArray%.prototype.findIndex` method
+// https://tc39.es/ecma262/#sec-%typedarray%.prototype.findindex
+exportTypedArrayMethod('findIndex', function findIndex(predicate /* , thisArg */) {
+ return $findIndex(aTypedArray(this), predicate, arguments.length > 1 ? arguments[1] : undefined);
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.typed-array.find.js":
+/*!*************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.typed-array.find.js ***!
+ \*************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var ArrayBufferViewCore = __webpack_require__(/*! ../internals/array-buffer-view-core */ "./node_modules/core-js/internals/array-buffer-view-core.js");
+var $find = __webpack_require__(/*! ../internals/array-iteration */ "./node_modules/core-js/internals/array-iteration.js").find;
+
+var aTypedArray = ArrayBufferViewCore.aTypedArray;
+var exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;
+
+// `%TypedArray%.prototype.find` method
+// https://tc39.es/ecma262/#sec-%typedarray%.prototype.find
+exportTypedArrayMethod('find', function find(predicate /* , thisArg */) {
+ return $find(aTypedArray(this), predicate, arguments.length > 1 ? arguments[1] : undefined);
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.typed-array.float32-array.js":
+/*!**********************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.typed-array.float32-array.js ***!
+ \**********************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var createTypedArrayConstructor = __webpack_require__(/*! ../internals/typed-array-constructor */ "./node_modules/core-js/internals/typed-array-constructor.js");
+
+// `Float32Array` constructor
+// https://tc39.es/ecma262/#sec-typedarray-objects
+createTypedArrayConstructor('Float32', function (init) {
+ return function Float32Array(data, byteOffset, length) {
+ return init(this, data, byteOffset, length);
+ };
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.typed-array.float64-array.js":
+/*!**********************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.typed-array.float64-array.js ***!
+ \**********************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var createTypedArrayConstructor = __webpack_require__(/*! ../internals/typed-array-constructor */ "./node_modules/core-js/internals/typed-array-constructor.js");
+
+// `Float64Array` constructor
+// https://tc39.es/ecma262/#sec-typedarray-objects
+createTypedArrayConstructor('Float64', function (init) {
+ return function Float64Array(data, byteOffset, length) {
+ return init(this, data, byteOffset, length);
+ };
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.typed-array.for-each.js":
+/*!*****************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.typed-array.for-each.js ***!
+ \*****************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var ArrayBufferViewCore = __webpack_require__(/*! ../internals/array-buffer-view-core */ "./node_modules/core-js/internals/array-buffer-view-core.js");
+var $forEach = __webpack_require__(/*! ../internals/array-iteration */ "./node_modules/core-js/internals/array-iteration.js").forEach;
+
+var aTypedArray = ArrayBufferViewCore.aTypedArray;
+var exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;
+
+// `%TypedArray%.prototype.forEach` method
+// https://tc39.es/ecma262/#sec-%typedarray%.prototype.foreach
+exportTypedArrayMethod('forEach', function forEach(callbackfn /* , thisArg */) {
+ $forEach(aTypedArray(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.typed-array.from.js":
+/*!*************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.typed-array.from.js ***!
+ \*************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var TYPED_ARRAYS_CONSTRUCTORS_REQUIRES_WRAPPERS = __webpack_require__(/*! ../internals/typed-array-constructors-require-wrappers */ "./node_modules/core-js/internals/typed-array-constructors-require-wrappers.js");
+var exportTypedArrayStaticMethod = __webpack_require__(/*! ../internals/array-buffer-view-core */ "./node_modules/core-js/internals/array-buffer-view-core.js").exportTypedArrayStaticMethod;
+var typedArrayFrom = __webpack_require__(/*! ../internals/typed-array-from */ "./node_modules/core-js/internals/typed-array-from.js");
+
+// `%TypedArray%.from` method
+// https://tc39.es/ecma262/#sec-%typedarray%.from
+exportTypedArrayStaticMethod('from', typedArrayFrom, TYPED_ARRAYS_CONSTRUCTORS_REQUIRES_WRAPPERS);
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.typed-array.includes.js":
+/*!*****************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.typed-array.includes.js ***!
+ \*****************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var ArrayBufferViewCore = __webpack_require__(/*! ../internals/array-buffer-view-core */ "./node_modules/core-js/internals/array-buffer-view-core.js");
+var $includes = __webpack_require__(/*! ../internals/array-includes */ "./node_modules/core-js/internals/array-includes.js").includes;
+
+var aTypedArray = ArrayBufferViewCore.aTypedArray;
+var exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;
+
+// `%TypedArray%.prototype.includes` method
+// https://tc39.es/ecma262/#sec-%typedarray%.prototype.includes
+exportTypedArrayMethod('includes', function includes(searchElement /* , fromIndex */) {
+ return $includes(aTypedArray(this), searchElement, arguments.length > 1 ? arguments[1] : undefined);
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.typed-array.index-of.js":
+/*!*****************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.typed-array.index-of.js ***!
+ \*****************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var ArrayBufferViewCore = __webpack_require__(/*! ../internals/array-buffer-view-core */ "./node_modules/core-js/internals/array-buffer-view-core.js");
+var $indexOf = __webpack_require__(/*! ../internals/array-includes */ "./node_modules/core-js/internals/array-includes.js").indexOf;
+
+var aTypedArray = ArrayBufferViewCore.aTypedArray;
+var exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;
+
+// `%TypedArray%.prototype.indexOf` method
+// https://tc39.es/ecma262/#sec-%typedarray%.prototype.indexof
+exportTypedArrayMethod('indexOf', function indexOf(searchElement /* , fromIndex */) {
+ return $indexOf(aTypedArray(this), searchElement, arguments.length > 1 ? arguments[1] : undefined);
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.typed-array.int16-array.js":
+/*!********************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.typed-array.int16-array.js ***!
+ \********************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var createTypedArrayConstructor = __webpack_require__(/*! ../internals/typed-array-constructor */ "./node_modules/core-js/internals/typed-array-constructor.js");
+
+// `Int16Array` constructor
+// https://tc39.es/ecma262/#sec-typedarray-objects
+createTypedArrayConstructor('Int16', function (init) {
+ return function Int16Array(data, byteOffset, length) {
+ return init(this, data, byteOffset, length);
+ };
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.typed-array.int32-array.js":
+/*!********************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.typed-array.int32-array.js ***!
+ \********************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var createTypedArrayConstructor = __webpack_require__(/*! ../internals/typed-array-constructor */ "./node_modules/core-js/internals/typed-array-constructor.js");
+
+// `Int32Array` constructor
+// https://tc39.es/ecma262/#sec-typedarray-objects
+createTypedArrayConstructor('Int32', function (init) {
+ return function Int32Array(data, byteOffset, length) {
+ return init(this, data, byteOffset, length);
+ };
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.typed-array.int8-array.js":
+/*!*******************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.typed-array.int8-array.js ***!
+ \*******************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var createTypedArrayConstructor = __webpack_require__(/*! ../internals/typed-array-constructor */ "./node_modules/core-js/internals/typed-array-constructor.js");
+
+// `Int8Array` constructor
+// https://tc39.es/ecma262/#sec-typedarray-objects
+createTypedArrayConstructor('Int8', function (init) {
+ return function Int8Array(data, byteOffset, length) {
+ return init(this, data, byteOffset, length);
+ };
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.typed-array.iterator.js":
+/*!*****************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.typed-array.iterator.js ***!
+ \*****************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js");
+var PROPER_FUNCTION_NAME = __webpack_require__(/*! ../internals/function-name */ "./node_modules/core-js/internals/function-name.js").PROPER;
+var ArrayBufferViewCore = __webpack_require__(/*! ../internals/array-buffer-view-core */ "./node_modules/core-js/internals/array-buffer-view-core.js");
+var ArrayIterators = __webpack_require__(/*! ../modules/es.array.iterator */ "./node_modules/core-js/modules/es.array.iterator.js");
+var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js");
+
+var ITERATOR = wellKnownSymbol('iterator');
+var Uint8Array = global.Uint8Array;
+var arrayValues = ArrayIterators.values;
+var arrayKeys = ArrayIterators.keys;
+var arrayEntries = ArrayIterators.entries;
+var aTypedArray = ArrayBufferViewCore.aTypedArray;
+var exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;
+var nativeTypedArrayIterator = Uint8Array && Uint8Array.prototype[ITERATOR];
+
+var PROPER_ARRAY_VALUES_NAME = !!nativeTypedArrayIterator && nativeTypedArrayIterator.name === 'values';
+
+var typedArrayValues = function values() {
+ return arrayValues.call(aTypedArray(this));
+};
+
+// `%TypedArray%.prototype.entries` method
+// https://tc39.es/ecma262/#sec-%typedarray%.prototype.entries
+exportTypedArrayMethod('entries', function entries() {
+ return arrayEntries.call(aTypedArray(this));
+});
+// `%TypedArray%.prototype.keys` method
+// https://tc39.es/ecma262/#sec-%typedarray%.prototype.keys
+exportTypedArrayMethod('keys', function keys() {
+ return arrayKeys.call(aTypedArray(this));
+});
+// `%TypedArray%.prototype.values` method
+// https://tc39.es/ecma262/#sec-%typedarray%.prototype.values
+exportTypedArrayMethod('values', typedArrayValues, PROPER_FUNCTION_NAME && !PROPER_ARRAY_VALUES_NAME);
+// `%TypedArray%.prototype[@@iterator]` method
+// https://tc39.es/ecma262/#sec-%typedarray%.prototype-@@iterator
+exportTypedArrayMethod(ITERATOR, typedArrayValues, PROPER_FUNCTION_NAME && !PROPER_ARRAY_VALUES_NAME);
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.typed-array.join.js":
+/*!*************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.typed-array.join.js ***!
+ \*************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var ArrayBufferViewCore = __webpack_require__(/*! ../internals/array-buffer-view-core */ "./node_modules/core-js/internals/array-buffer-view-core.js");
+
+var aTypedArray = ArrayBufferViewCore.aTypedArray;
+var exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;
+var $join = [].join;
+
+// `%TypedArray%.prototype.join` method
+// https://tc39.es/ecma262/#sec-%typedarray%.prototype.join
+// eslint-disable-next-line no-unused-vars -- required for `.length`
+exportTypedArrayMethod('join', function join(separator) {
+ return $join.apply(aTypedArray(this), arguments);
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.typed-array.last-index-of.js":
+/*!**********************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.typed-array.last-index-of.js ***!
+ \**********************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var ArrayBufferViewCore = __webpack_require__(/*! ../internals/array-buffer-view-core */ "./node_modules/core-js/internals/array-buffer-view-core.js");
+var $lastIndexOf = __webpack_require__(/*! ../internals/array-last-index-of */ "./node_modules/core-js/internals/array-last-index-of.js");
+
+var aTypedArray = ArrayBufferViewCore.aTypedArray;
+var exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;
+
+// `%TypedArray%.prototype.lastIndexOf` method
+// https://tc39.es/ecma262/#sec-%typedarray%.prototype.lastindexof
+// eslint-disable-next-line no-unused-vars -- required for `.length`
+exportTypedArrayMethod('lastIndexOf', function lastIndexOf(searchElement /* , fromIndex */) {
+ return $lastIndexOf.apply(aTypedArray(this), arguments);
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.typed-array.map.js":
+/*!************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.typed-array.map.js ***!
+ \************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var ArrayBufferViewCore = __webpack_require__(/*! ../internals/array-buffer-view-core */ "./node_modules/core-js/internals/array-buffer-view-core.js");
+var $map = __webpack_require__(/*! ../internals/array-iteration */ "./node_modules/core-js/internals/array-iteration.js").map;
+var typedArraySpeciesConstructor = __webpack_require__(/*! ../internals/typed-array-species-constructor */ "./node_modules/core-js/internals/typed-array-species-constructor.js");
+
+var aTypedArray = ArrayBufferViewCore.aTypedArray;
+var exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;
+
+// `%TypedArray%.prototype.map` method
+// https://tc39.es/ecma262/#sec-%typedarray%.prototype.map
+exportTypedArrayMethod('map', function map(mapfn /* , thisArg */) {
+ return $map(aTypedArray(this), mapfn, arguments.length > 1 ? arguments[1] : undefined, function (O, length) {
+ return new (typedArraySpeciesConstructor(O))(length);
+ });
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.typed-array.of.js":
+/*!***********************************************************!*\
+ !*** ./node_modules/core-js/modules/es.typed-array.of.js ***!
+ \***********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var ArrayBufferViewCore = __webpack_require__(/*! ../internals/array-buffer-view-core */ "./node_modules/core-js/internals/array-buffer-view-core.js");
+var TYPED_ARRAYS_CONSTRUCTORS_REQUIRES_WRAPPERS = __webpack_require__(/*! ../internals/typed-array-constructors-require-wrappers */ "./node_modules/core-js/internals/typed-array-constructors-require-wrappers.js");
+
+var aTypedArrayConstructor = ArrayBufferViewCore.aTypedArrayConstructor;
+var exportTypedArrayStaticMethod = ArrayBufferViewCore.exportTypedArrayStaticMethod;
+
+// `%TypedArray%.of` method
+// https://tc39.es/ecma262/#sec-%typedarray%.of
+exportTypedArrayStaticMethod('of', function of(/* ...items */) {
+ var index = 0;
+ var length = arguments.length;
+ var result = new (aTypedArrayConstructor(this))(length);
+ while (length > index) result[index] = arguments[index++];
+ return result;
+}, TYPED_ARRAYS_CONSTRUCTORS_REQUIRES_WRAPPERS);
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.typed-array.reduce-right.js":
+/*!*********************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.typed-array.reduce-right.js ***!
+ \*********************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var ArrayBufferViewCore = __webpack_require__(/*! ../internals/array-buffer-view-core */ "./node_modules/core-js/internals/array-buffer-view-core.js");
+var $reduceRight = __webpack_require__(/*! ../internals/array-reduce */ "./node_modules/core-js/internals/array-reduce.js").right;
+
+var aTypedArray = ArrayBufferViewCore.aTypedArray;
+var exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;
+
+// `%TypedArray%.prototype.reduceRicht` method
+// https://tc39.es/ecma262/#sec-%typedarray%.prototype.reduceright
+exportTypedArrayMethod('reduceRight', function reduceRight(callbackfn /* , initialValue */) {
+ return $reduceRight(aTypedArray(this), callbackfn, arguments.length, arguments.length > 1 ? arguments[1] : undefined);
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.typed-array.reduce.js":
+/*!***************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.typed-array.reduce.js ***!
+ \***************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var ArrayBufferViewCore = __webpack_require__(/*! ../internals/array-buffer-view-core */ "./node_modules/core-js/internals/array-buffer-view-core.js");
+var $reduce = __webpack_require__(/*! ../internals/array-reduce */ "./node_modules/core-js/internals/array-reduce.js").left;
+
+var aTypedArray = ArrayBufferViewCore.aTypedArray;
+var exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;
+
+// `%TypedArray%.prototype.reduce` method
+// https://tc39.es/ecma262/#sec-%typedarray%.prototype.reduce
+exportTypedArrayMethod('reduce', function reduce(callbackfn /* , initialValue */) {
+ return $reduce(aTypedArray(this), callbackfn, arguments.length, arguments.length > 1 ? arguments[1] : undefined);
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.typed-array.reverse.js":
+/*!****************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.typed-array.reverse.js ***!
+ \****************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var ArrayBufferViewCore = __webpack_require__(/*! ../internals/array-buffer-view-core */ "./node_modules/core-js/internals/array-buffer-view-core.js");
+
+var aTypedArray = ArrayBufferViewCore.aTypedArray;
+var exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;
+var floor = Math.floor;
+
+// `%TypedArray%.prototype.reverse` method
+// https://tc39.es/ecma262/#sec-%typedarray%.prototype.reverse
+exportTypedArrayMethod('reverse', function reverse() {
+ var that = this;
+ var length = aTypedArray(that).length;
+ var middle = floor(length / 2);
+ var index = 0;
+ var value;
+ while (index < middle) {
+ value = that[index];
+ that[index++] = that[--length];
+ that[length] = value;
+ } return that;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.typed-array.set.js":
+/*!************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.typed-array.set.js ***!
+ \************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var ArrayBufferViewCore = __webpack_require__(/*! ../internals/array-buffer-view-core */ "./node_modules/core-js/internals/array-buffer-view-core.js");
+var toLength = __webpack_require__(/*! ../internals/to-length */ "./node_modules/core-js/internals/to-length.js");
+var toOffset = __webpack_require__(/*! ../internals/to-offset */ "./node_modules/core-js/internals/to-offset.js");
+var toObject = __webpack_require__(/*! ../internals/to-object */ "./node_modules/core-js/internals/to-object.js");
+var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js");
+
+var aTypedArray = ArrayBufferViewCore.aTypedArray;
+var exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;
+
+var FORCED = fails(function () {
+ // eslint-disable-next-line es/no-typed-arrays -- required for testing
+ new Int8Array(1).set({});
+});
+
+// `%TypedArray%.prototype.set` method
+// https://tc39.es/ecma262/#sec-%typedarray%.prototype.set
+exportTypedArrayMethod('set', function set(arrayLike /* , offset */) {
+ aTypedArray(this);
+ var offset = toOffset(arguments.length > 1 ? arguments[1] : undefined, 1);
+ var length = this.length;
+ var src = toObject(arrayLike);
+ var len = toLength(src.length);
+ var index = 0;
+ if (len + offset > length) throw RangeError('Wrong length');
+ while (index < len) this[offset + index] = src[index++];
+}, FORCED);
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.typed-array.slice.js":
+/*!**************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.typed-array.slice.js ***!
+ \**************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var ArrayBufferViewCore = __webpack_require__(/*! ../internals/array-buffer-view-core */ "./node_modules/core-js/internals/array-buffer-view-core.js");
+var typedArraySpeciesConstructor = __webpack_require__(/*! ../internals/typed-array-species-constructor */ "./node_modules/core-js/internals/typed-array-species-constructor.js");
+var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js");
+
+var aTypedArray = ArrayBufferViewCore.aTypedArray;
+var exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;
+var $slice = [].slice;
+
+var FORCED = fails(function () {
+ // eslint-disable-next-line es/no-typed-arrays -- required for testing
+ new Int8Array(1).slice();
+});
+
+// `%TypedArray%.prototype.slice` method
+// https://tc39.es/ecma262/#sec-%typedarray%.prototype.slice
+exportTypedArrayMethod('slice', function slice(start, end) {
+ var list = $slice.call(aTypedArray(this), start, end);
+ var C = typedArraySpeciesConstructor(this);
+ var index = 0;
+ var length = list.length;
+ var result = new C(length);
+ while (length > index) result[index] = list[index++];
+ return result;
+}, FORCED);
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.typed-array.some.js":
+/*!*************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.typed-array.some.js ***!
+ \*************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var ArrayBufferViewCore = __webpack_require__(/*! ../internals/array-buffer-view-core */ "./node_modules/core-js/internals/array-buffer-view-core.js");
+var $some = __webpack_require__(/*! ../internals/array-iteration */ "./node_modules/core-js/internals/array-iteration.js").some;
+
+var aTypedArray = ArrayBufferViewCore.aTypedArray;
+var exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;
+
+// `%TypedArray%.prototype.some` method
+// https://tc39.es/ecma262/#sec-%typedarray%.prototype.some
+exportTypedArrayMethod('some', function some(callbackfn /* , thisArg */) {
+ return $some(aTypedArray(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.typed-array.sort.js":
+/*!*************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.typed-array.sort.js ***!
+ \*************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var ArrayBufferViewCore = __webpack_require__(/*! ../internals/array-buffer-view-core */ "./node_modules/core-js/internals/array-buffer-view-core.js");
+var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js");
+var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js");
+var aCallable = __webpack_require__(/*! ../internals/a-callable */ "./node_modules/core-js/internals/a-callable.js");
+var toLength = __webpack_require__(/*! ../internals/to-length */ "./node_modules/core-js/internals/to-length.js");
+var internalSort = __webpack_require__(/*! ../internals/array-sort */ "./node_modules/core-js/internals/array-sort.js");
+var FF = __webpack_require__(/*! ../internals/engine-ff-version */ "./node_modules/core-js/internals/engine-ff-version.js");
+var IE_OR_EDGE = __webpack_require__(/*! ../internals/engine-is-ie-or-edge */ "./node_modules/core-js/internals/engine-is-ie-or-edge.js");
+var V8 = __webpack_require__(/*! ../internals/engine-v8-version */ "./node_modules/core-js/internals/engine-v8-version.js");
+var WEBKIT = __webpack_require__(/*! ../internals/engine-webkit-version */ "./node_modules/core-js/internals/engine-webkit-version.js");
+
+var aTypedArray = ArrayBufferViewCore.aTypedArray;
+var exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;
+var Uint16Array = global.Uint16Array;
+var nativeSort = Uint16Array && Uint16Array.prototype.sort;
+
+// WebKit
+var ACCEPT_INCORRECT_ARGUMENTS = !!nativeSort && !fails(function () {
+ var array = new Uint16Array(2);
+ array.sort(null);
+ array.sort({});
+});
+
+var STABLE_SORT = !!nativeSort && !fails(function () {
+ // feature detection can be too slow, so check engines versions
+ if (V8) return V8 < 74;
+ if (FF) return FF < 67;
+ if (IE_OR_EDGE) return true;
+ if (WEBKIT) return WEBKIT < 602;
+
+ var array = new Uint16Array(516);
+ var expected = Array(516);
+ var index, mod;
+
+ for (index = 0; index < 516; index++) {
+ mod = index % 4;
+ array[index] = 515 - index;
+ expected[index] = index - 2 * mod + 3;
+ }
+
+ array.sort(function (a, b) {
+ return (a / 4 | 0) - (b / 4 | 0);
+ });
+
+ for (index = 0; index < 516; index++) {
+ if (array[index] !== expected[index]) return true;
+ }
+});
+
+var getSortCompare = function (comparefn) {
+ return function (x, y) {
+ if (comparefn !== undefined) return +comparefn(x, y) || 0;
+ // eslint-disable-next-line no-self-compare -- NaN check
+ if (y !== y) return -1;
+ // eslint-disable-next-line no-self-compare -- NaN check
+ if (x !== x) return 1;
+ if (x === 0 && y === 0) return 1 / x > 0 && 1 / y < 0 ? 1 : -1;
+ return x > y;
+ };
+};
+
+// `%TypedArray%.prototype.sort` method
+// https://tc39.es/ecma262/#sec-%typedarray%.prototype.sort
+exportTypedArrayMethod('sort', function sort(comparefn) {
+ var array = this;
+ if (comparefn !== undefined) aCallable(comparefn);
+ if (STABLE_SORT) return nativeSort.call(array, comparefn);
+
+ aTypedArray(array);
+ var arrayLength = toLength(array.length);
+ var items = Array(arrayLength);
+ var index;
+
+ for (index = 0; index < arrayLength; index++) {
+ items[index] = array[index];
+ }
+
+ items = internalSort(array, getSortCompare(comparefn));
+
+ for (index = 0; index < arrayLength; index++) {
+ array[index] = items[index];
+ }
+
+ return array;
+}, !STABLE_SORT || ACCEPT_INCORRECT_ARGUMENTS);
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.typed-array.subarray.js":
+/*!*****************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.typed-array.subarray.js ***!
+ \*****************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var ArrayBufferViewCore = __webpack_require__(/*! ../internals/array-buffer-view-core */ "./node_modules/core-js/internals/array-buffer-view-core.js");
+var toLength = __webpack_require__(/*! ../internals/to-length */ "./node_modules/core-js/internals/to-length.js");
+var toAbsoluteIndex = __webpack_require__(/*! ../internals/to-absolute-index */ "./node_modules/core-js/internals/to-absolute-index.js");
+var typedArraySpeciesConstructor = __webpack_require__(/*! ../internals/typed-array-species-constructor */ "./node_modules/core-js/internals/typed-array-species-constructor.js");
+
+var aTypedArray = ArrayBufferViewCore.aTypedArray;
+var exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;
+
+// `%TypedArray%.prototype.subarray` method
+// https://tc39.es/ecma262/#sec-%typedarray%.prototype.subarray
+exportTypedArrayMethod('subarray', function subarray(begin, end) {
+ var O = aTypedArray(this);
+ var length = O.length;
+ var beginIndex = toAbsoluteIndex(begin, length);
+ var C = typedArraySpeciesConstructor(O);
+ return new C(
+ O.buffer,
+ O.byteOffset + beginIndex * O.BYTES_PER_ELEMENT,
+ toLength((end === undefined ? length : toAbsoluteIndex(end, length)) - beginIndex)
+ );
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.typed-array.to-locale-string.js":
+/*!*************************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.typed-array.to-locale-string.js ***!
+ \*************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js");
+var ArrayBufferViewCore = __webpack_require__(/*! ../internals/array-buffer-view-core */ "./node_modules/core-js/internals/array-buffer-view-core.js");
+var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js");
+
+var Int8Array = global.Int8Array;
+var aTypedArray = ArrayBufferViewCore.aTypedArray;
+var exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;
+var $toLocaleString = [].toLocaleString;
+var $slice = [].slice;
+
+// iOS Safari 6.x fails here
+var TO_LOCALE_STRING_BUG = !!Int8Array && fails(function () {
+ $toLocaleString.call(new Int8Array(1));
+});
+
+var FORCED = fails(function () {
+ return [1, 2].toLocaleString() != new Int8Array([1, 2]).toLocaleString();
+}) || !fails(function () {
+ Int8Array.prototype.toLocaleString.call([1, 2]);
+});
+
+// `%TypedArray%.prototype.toLocaleString` method
+// https://tc39.es/ecma262/#sec-%typedarray%.prototype.tolocalestring
+exportTypedArrayMethod('toLocaleString', function toLocaleString() {
+ return $toLocaleString.apply(TO_LOCALE_STRING_BUG ? $slice.call(aTypedArray(this)) : aTypedArray(this), arguments);
+}, FORCED);
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.typed-array.to-string.js":
+/*!******************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.typed-array.to-string.js ***!
+ \******************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var exportTypedArrayMethod = __webpack_require__(/*! ../internals/array-buffer-view-core */ "./node_modules/core-js/internals/array-buffer-view-core.js").exportTypedArrayMethod;
+var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js");
+var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js");
+
+var Uint8Array = global.Uint8Array;
+var Uint8ArrayPrototype = Uint8Array && Uint8Array.prototype || {};
+var arrayToString = [].toString;
+var arrayJoin = [].join;
+
+if (fails(function () { arrayToString.call({}); })) {
+ arrayToString = function toString() {
+ return arrayJoin.call(this);
+ };
+}
+
+var IS_NOT_ARRAY_METHOD = Uint8ArrayPrototype.toString != arrayToString;
+
+// `%TypedArray%.prototype.toString` method
+// https://tc39.es/ecma262/#sec-%typedarray%.prototype.tostring
+exportTypedArrayMethod('toString', arrayToString, IS_NOT_ARRAY_METHOD);
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.typed-array.uint16-array.js":
+/*!*********************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.typed-array.uint16-array.js ***!
+ \*********************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var createTypedArrayConstructor = __webpack_require__(/*! ../internals/typed-array-constructor */ "./node_modules/core-js/internals/typed-array-constructor.js");
+
+// `Uint16Array` constructor
+// https://tc39.es/ecma262/#sec-typedarray-objects
+createTypedArrayConstructor('Uint16', function (init) {
+ return function Uint16Array(data, byteOffset, length) {
+ return init(this, data, byteOffset, length);
+ };
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.typed-array.uint32-array.js":
+/*!*********************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.typed-array.uint32-array.js ***!
+ \*********************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var createTypedArrayConstructor = __webpack_require__(/*! ../internals/typed-array-constructor */ "./node_modules/core-js/internals/typed-array-constructor.js");
+
+// `Uint32Array` constructor
+// https://tc39.es/ecma262/#sec-typedarray-objects
+createTypedArrayConstructor('Uint32', function (init) {
+ return function Uint32Array(data, byteOffset, length) {
+ return init(this, data, byteOffset, length);
+ };
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.typed-array.uint8-array.js":
+/*!********************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.typed-array.uint8-array.js ***!
+ \********************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var createTypedArrayConstructor = __webpack_require__(/*! ../internals/typed-array-constructor */ "./node_modules/core-js/internals/typed-array-constructor.js");
+
+// `Uint8Array` constructor
+// https://tc39.es/ecma262/#sec-typedarray-objects
+createTypedArrayConstructor('Uint8', function (init) {
+ return function Uint8Array(data, byteOffset, length) {
+ return init(this, data, byteOffset, length);
+ };
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.typed-array.uint8-clamped-array.js":
+/*!****************************************************************************!*\
+ !*** ./node_modules/core-js/modules/es.typed-array.uint8-clamped-array.js ***!
+ \****************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var createTypedArrayConstructor = __webpack_require__(/*! ../internals/typed-array-constructor */ "./node_modules/core-js/internals/typed-array-constructor.js");
+
+// `Uint8ClampedArray` constructor
+// https://tc39.es/ecma262/#sec-typedarray-objects
+createTypedArrayConstructor('Uint8', function (init) {
+ return function Uint8ClampedArray(data, byteOffset, length) {
+ return init(this, data, byteOffset, length);
+ };
+}, true);
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.unescape.js":
+/*!*****************************************************!*\
+ !*** ./node_modules/core-js/modules/es.unescape.js ***!
+ \*****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var toString = __webpack_require__(/*! ../internals/to-string */ "./node_modules/core-js/internals/to-string.js");
+
+var fromCharCode = String.fromCharCode;
+var hex2 = /^[\da-f]{2}$/i;
+var hex4 = /^[\da-f]{4}$/i;
+
+// `unescape` method
+// https://tc39.es/ecma262/#sec-unescape-string
+$({ global: true }, {
+ unescape: function unescape(string) {
+ var str = toString(string);
+ var result = '';
+ var length = str.length;
+ var index = 0;
+ var chr, slice;
+ while (index < length) {
+ chr = str.charAt(index++);
+ if (chr === '%') {
+ if (str.charAt(index) === 'u') {
+ slice = str.slice(index + 1, index + 5);
+ if (hex4.test(slice)) {
+ result += fromCharCode(parseInt(slice, 16));
+ index += 5;
+ continue;
+ }
+ } else {
+ slice = str.slice(index, index + 2);
+ if (hex2.test(slice)) {
+ result += fromCharCode(parseInt(slice, 16));
+ index += 2;
+ continue;
+ }
+ }
+ }
+ result += chr;
+ } return result;
+ }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.weak-map.js":
+/*!*****************************************************!*\
+ !*** ./node_modules/core-js/modules/es.weak-map.js ***!
+ \*****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js");
+var redefineAll = __webpack_require__(/*! ../internals/redefine-all */ "./node_modules/core-js/internals/redefine-all.js");
+var InternalMetadataModule = __webpack_require__(/*! ../internals/internal-metadata */ "./node_modules/core-js/internals/internal-metadata.js");
+var collection = __webpack_require__(/*! ../internals/collection */ "./node_modules/core-js/internals/collection.js");
+var collectionWeak = __webpack_require__(/*! ../internals/collection-weak */ "./node_modules/core-js/internals/collection-weak.js");
+var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/core-js/internals/is-object.js");
+var enforceIternalState = __webpack_require__(/*! ../internals/internal-state */ "./node_modules/core-js/internals/internal-state.js").enforce;
+var NATIVE_WEAK_MAP = __webpack_require__(/*! ../internals/native-weak-map */ "./node_modules/core-js/internals/native-weak-map.js");
+
+var IS_IE11 = !global.ActiveXObject && 'ActiveXObject' in global;
+// eslint-disable-next-line es/no-object-isextensible -- safe
+var isExtensible = Object.isExtensible;
+var InternalWeakMap;
+
+var wrapper = function (init) {
+ return function WeakMap() {
+ return init(this, arguments.length ? arguments[0] : undefined);
+ };
+};
+
+// `WeakMap` constructor
+// https://tc39.es/ecma262/#sec-weakmap-constructor
+var $WeakMap = module.exports = collection('WeakMap', wrapper, collectionWeak);
+
+// IE11 WeakMap frozen keys fix
+// We can't use feature detection because it crash some old IE builds
+// https://github.com/zloirock/core-js/issues/485
+if (NATIVE_WEAK_MAP && IS_IE11) {
+ InternalWeakMap = collectionWeak.getConstructor(wrapper, 'WeakMap', true);
+ InternalMetadataModule.enable();
+ var WeakMapPrototype = $WeakMap.prototype;
+ var nativeDelete = WeakMapPrototype['delete'];
+ var nativeHas = WeakMapPrototype.has;
+ var nativeGet = WeakMapPrototype.get;
+ var nativeSet = WeakMapPrototype.set;
+ redefineAll(WeakMapPrototype, {
+ 'delete': function (key) {
+ if (isObject(key) && !isExtensible(key)) {
+ var state = enforceIternalState(this);
+ if (!state.frozen) state.frozen = new InternalWeakMap();
+ return nativeDelete.call(this, key) || state.frozen['delete'](key);
+ } return nativeDelete.call(this, key);
+ },
+ has: function has(key) {
+ if (isObject(key) && !isExtensible(key)) {
+ var state = enforceIternalState(this);
+ if (!state.frozen) state.frozen = new InternalWeakMap();
+ return nativeHas.call(this, key) || state.frozen.has(key);
+ } return nativeHas.call(this, key);
+ },
+ get: function get(key) {
+ if (isObject(key) && !isExtensible(key)) {
+ var state = enforceIternalState(this);
+ if (!state.frozen) state.frozen = new InternalWeakMap();
+ return nativeHas.call(this, key) ? nativeGet.call(this, key) : state.frozen.get(key);
+ } return nativeGet.call(this, key);
+ },
+ set: function set(key, value) {
+ if (isObject(key) && !isExtensible(key)) {
+ var state = enforceIternalState(this);
+ if (!state.frozen) state.frozen = new InternalWeakMap();
+ nativeHas.call(this, key) ? nativeSet.call(this, key, value) : state.frozen.set(key, value);
+ } else nativeSet.call(this, key, value);
+ return this;
+ }
+ });
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/es.weak-set.js":
+/*!*****************************************************!*\
+ !*** ./node_modules/core-js/modules/es.weak-set.js ***!
+ \*****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var collection = __webpack_require__(/*! ../internals/collection */ "./node_modules/core-js/internals/collection.js");
+var collectionWeak = __webpack_require__(/*! ../internals/collection-weak */ "./node_modules/core-js/internals/collection-weak.js");
+
+// `WeakSet` constructor
+// https://tc39.es/ecma262/#sec-weakset-constructor
+collection('WeakSet', function (init) {
+ return function WeakSet() { return init(this, arguments.length ? arguments[0] : undefined); };
+}, collectionWeak);
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/web.dom-collections.for-each.js":
+/*!**********************************************************************!*\
+ !*** ./node_modules/core-js/modules/web.dom-collections.for-each.js ***!
+ \**********************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js");
+var DOMIterables = __webpack_require__(/*! ../internals/dom-iterables */ "./node_modules/core-js/internals/dom-iterables.js");
+var DOMTokenListPrototype = __webpack_require__(/*! ../internals/dom-token-list-prototype */ "./node_modules/core-js/internals/dom-token-list-prototype.js");
+var forEach = __webpack_require__(/*! ../internals/array-for-each */ "./node_modules/core-js/internals/array-for-each.js");
+var createNonEnumerableProperty = __webpack_require__(/*! ../internals/create-non-enumerable-property */ "./node_modules/core-js/internals/create-non-enumerable-property.js");
+
+var handlePrototype = function (CollectionPrototype) {
+ // some Chrome versions have non-configurable methods on DOMTokenList
+ if (CollectionPrototype && CollectionPrototype.forEach !== forEach) try {
+ createNonEnumerableProperty(CollectionPrototype, 'forEach', forEach);
+ } catch (error) {
+ CollectionPrototype.forEach = forEach;
+ }
+};
+
+for (var COLLECTION_NAME in DOMIterables) {
+ if (DOMIterables[COLLECTION_NAME]) {
+ handlePrototype(global[COLLECTION_NAME] && global[COLLECTION_NAME].prototype);
+ }
+}
+
+handlePrototype(DOMTokenListPrototype);
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/web.dom-collections.iterator.js":
+/*!**********************************************************************!*\
+ !*** ./node_modules/core-js/modules/web.dom-collections.iterator.js ***!
+ \**********************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js");
+var DOMIterables = __webpack_require__(/*! ../internals/dom-iterables */ "./node_modules/core-js/internals/dom-iterables.js");
+var DOMTokenListPrototype = __webpack_require__(/*! ../internals/dom-token-list-prototype */ "./node_modules/core-js/internals/dom-token-list-prototype.js");
+var ArrayIteratorMethods = __webpack_require__(/*! ../modules/es.array.iterator */ "./node_modules/core-js/modules/es.array.iterator.js");
+var createNonEnumerableProperty = __webpack_require__(/*! ../internals/create-non-enumerable-property */ "./node_modules/core-js/internals/create-non-enumerable-property.js");
+var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js");
+
+var ITERATOR = wellKnownSymbol('iterator');
+var TO_STRING_TAG = wellKnownSymbol('toStringTag');
+var ArrayValues = ArrayIteratorMethods.values;
+
+var handlePrototype = function (CollectionPrototype, COLLECTION_NAME) {
+ if (CollectionPrototype) {
+ // some Chrome versions have non-configurable methods on DOMTokenList
+ if (CollectionPrototype[ITERATOR] !== ArrayValues) try {
+ createNonEnumerableProperty(CollectionPrototype, ITERATOR, ArrayValues);
+ } catch (error) {
+ CollectionPrototype[ITERATOR] = ArrayValues;
+ }
+ if (!CollectionPrototype[TO_STRING_TAG]) {
+ createNonEnumerableProperty(CollectionPrototype, TO_STRING_TAG, COLLECTION_NAME);
+ }
+ if (DOMIterables[COLLECTION_NAME]) for (var METHOD_NAME in ArrayIteratorMethods) {
+ // some Chrome versions have non-configurable methods on DOMTokenList
+ if (CollectionPrototype[METHOD_NAME] !== ArrayIteratorMethods[METHOD_NAME]) try {
+ createNonEnumerableProperty(CollectionPrototype, METHOD_NAME, ArrayIteratorMethods[METHOD_NAME]);
+ } catch (error) {
+ CollectionPrototype[METHOD_NAME] = ArrayIteratorMethods[METHOD_NAME];
+ }
+ }
+ }
+};
+
+for (var COLLECTION_NAME in DOMIterables) {
+ handlePrototype(global[COLLECTION_NAME] && global[COLLECTION_NAME].prototype, COLLECTION_NAME);
+}
+
+handlePrototype(DOMTokenListPrototype, 'DOMTokenList');
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/web.immediate.js":
+/*!*******************************************************!*\
+ !*** ./node_modules/core-js/modules/web.immediate.js ***!
+ \*******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js");
+var task = __webpack_require__(/*! ../internals/task */ "./node_modules/core-js/internals/task.js");
+
+var FORCED = !global.setImmediate || !global.clearImmediate;
+
+// http://w3c.github.io/setImmediate/
+$({ global: true, bind: true, enumerable: true, forced: FORCED }, {
+ // `setImmediate` method
+ // http://w3c.github.io/setImmediate/#si-setImmediate
+ setImmediate: task.set,
+ // `clearImmediate` method
+ // http://w3c.github.io/setImmediate/#si-clearImmediate
+ clearImmediate: task.clear
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/web.queue-microtask.js":
+/*!*************************************************************!*\
+ !*** ./node_modules/core-js/modules/web.queue-microtask.js ***!
+ \*************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js");
+var microtask = __webpack_require__(/*! ../internals/microtask */ "./node_modules/core-js/internals/microtask.js");
+var IS_NODE = __webpack_require__(/*! ../internals/engine-is-node */ "./node_modules/core-js/internals/engine-is-node.js");
+
+var process = global.process;
+
+// `queueMicrotask` method
+// https://html.spec.whatwg.org/multipage/timers-and-user-prompts.html#dom-queuemicrotask
+$({ global: true, enumerable: true, noTargetGet: true }, {
+ queueMicrotask: function queueMicrotask(fn) {
+ var domain = IS_NODE && process.domain;
+ microtask(domain ? domain.bind(fn) : fn);
+ }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/web.timers.js":
+/*!****************************************************!*\
+ !*** ./node_modules/core-js/modules/web.timers.js ***!
+ \****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js");
+var isCallable = __webpack_require__(/*! ../internals/is-callable */ "./node_modules/core-js/internals/is-callable.js");
+var userAgent = __webpack_require__(/*! ../internals/engine-user-agent */ "./node_modules/core-js/internals/engine-user-agent.js");
+
+var slice = [].slice;
+var MSIE = /MSIE .\./.test(userAgent); // <- dirty ie9- check
+
+var wrap = function (scheduler) {
+ return function (handler, timeout /* , ...arguments */) {
+ var boundArgs = arguments.length > 2;
+ var args = boundArgs ? slice.call(arguments, 2) : undefined;
+ return scheduler(boundArgs ? function () {
+ // eslint-disable-next-line no-new-func -- spec requirement
+ (isCallable(handler) ? handler : Function(handler)).apply(this, args);
+ } : handler, timeout);
+ };
+};
+
+// ie9- setTimeout & setInterval additional parameters fix
+// https://html.spec.whatwg.org/multipage/timers-and-user-prompts.html#timers
+$({ global: true, bind: true, forced: MSIE }, {
+ // `setTimeout` method
+ // https://html.spec.whatwg.org/multipage/timers-and-user-prompts.html#dom-settimeout
+ setTimeout: wrap(global.setTimeout),
+ // `setInterval` method
+ // https://html.spec.whatwg.org/multipage/timers-and-user-prompts.html#dom-setinterval
+ setInterval: wrap(global.setInterval)
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/web.url-search-params.js":
+/*!***************************************************************!*\
+ !*** ./node_modules/core-js/modules/web.url-search-params.js ***!
+ \***************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+// TODO: in core-js@4, move /modules/ dependencies to public entries for better optimization by tools like `preset-env`
+__webpack_require__(/*! ../modules/es.array.iterator */ "./node_modules/core-js/modules/es.array.iterator.js");
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ "./node_modules/core-js/internals/get-built-in.js");
+var USE_NATIVE_URL = __webpack_require__(/*! ../internals/native-url */ "./node_modules/core-js/internals/native-url.js");
+var redefine = __webpack_require__(/*! ../internals/redefine */ "./node_modules/core-js/internals/redefine.js");
+var redefineAll = __webpack_require__(/*! ../internals/redefine-all */ "./node_modules/core-js/internals/redefine-all.js");
+var setToStringTag = __webpack_require__(/*! ../internals/set-to-string-tag */ "./node_modules/core-js/internals/set-to-string-tag.js");
+var createIteratorConstructor = __webpack_require__(/*! ../internals/create-iterator-constructor */ "./node_modules/core-js/internals/create-iterator-constructor.js");
+var InternalStateModule = __webpack_require__(/*! ../internals/internal-state */ "./node_modules/core-js/internals/internal-state.js");
+var anInstance = __webpack_require__(/*! ../internals/an-instance */ "./node_modules/core-js/internals/an-instance.js");
+var isCallable = __webpack_require__(/*! ../internals/is-callable */ "./node_modules/core-js/internals/is-callable.js");
+var hasOwn = __webpack_require__(/*! ../internals/has */ "./node_modules/core-js/internals/has.js");
+var bind = __webpack_require__(/*! ../internals/function-bind-context */ "./node_modules/core-js/internals/function-bind-context.js");
+var classof = __webpack_require__(/*! ../internals/classof */ "./node_modules/core-js/internals/classof.js");
+var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/core-js/internals/an-object.js");
+var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/core-js/internals/is-object.js");
+var $toString = __webpack_require__(/*! ../internals/to-string */ "./node_modules/core-js/internals/to-string.js");
+var create = __webpack_require__(/*! ../internals/object-create */ "./node_modules/core-js/internals/object-create.js");
+var createPropertyDescriptor = __webpack_require__(/*! ../internals/create-property-descriptor */ "./node_modules/core-js/internals/create-property-descriptor.js");
+var getIterator = __webpack_require__(/*! ../internals/get-iterator */ "./node_modules/core-js/internals/get-iterator.js");
+var getIteratorMethod = __webpack_require__(/*! ../internals/get-iterator-method */ "./node_modules/core-js/internals/get-iterator-method.js");
+var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js");
+
+var nativeFetch = getBuiltIn('fetch');
+var NativeRequest = getBuiltIn('Request');
+var RequestPrototype = NativeRequest && NativeRequest.prototype;
+var Headers = getBuiltIn('Headers');
+var ITERATOR = wellKnownSymbol('iterator');
+var URL_SEARCH_PARAMS = 'URLSearchParams';
+var URL_SEARCH_PARAMS_ITERATOR = URL_SEARCH_PARAMS + 'Iterator';
+var setInternalState = InternalStateModule.set;
+var getInternalParamsState = InternalStateModule.getterFor(URL_SEARCH_PARAMS);
+var getInternalIteratorState = InternalStateModule.getterFor(URL_SEARCH_PARAMS_ITERATOR);
+
+var plus = /\+/g;
+var sequences = Array(4);
+
+var percentSequence = function (bytes) {
+ return sequences[bytes - 1] || (sequences[bytes - 1] = RegExp('((?:%[\\da-f]{2}){' + bytes + '})', 'gi'));
+};
+
+var percentDecode = function (sequence) {
+ try {
+ return decodeURIComponent(sequence);
+ } catch (error) {
+ return sequence;
+ }
+};
+
+var deserialize = function (it) {
+ var result = it.replace(plus, ' ');
+ var bytes = 4;
+ try {
+ return decodeURIComponent(result);
+ } catch (error) {
+ while (bytes) {
+ result = result.replace(percentSequence(bytes--), percentDecode);
+ }
+ return result;
+ }
+};
+
+var find = /[!'()~]|%20/g;
+
+var replace = {
+ '!': '%21',
+ "'": '%27',
+ '(': '%28',
+ ')': '%29',
+ '~': '%7E',
+ '%20': '+'
+};
+
+var replacer = function (match) {
+ return replace[match];
+};
+
+var serialize = function (it) {
+ return encodeURIComponent(it).replace(find, replacer);
+};
+
+var parseSearchParams = function (result, query) {
+ if (query) {
+ var attributes = query.split('&');
+ var index = 0;
+ var attribute, entry;
+ while (index < attributes.length) {
+ attribute = attributes[index++];
+ if (attribute.length) {
+ entry = attribute.split('=');
+ result.push({
+ key: deserialize(entry.shift()),
+ value: deserialize(entry.join('='))
+ });
+ }
+ }
+ }
+};
+
+var updateSearchParams = function (query) {
+ this.entries.length = 0;
+ parseSearchParams(this.entries, query);
+};
+
+var validateArgumentsLength = function (passed, required) {
+ if (passed < required) throw TypeError('Not enough arguments');
+};
+
+var URLSearchParamsIterator = createIteratorConstructor(function Iterator(params, kind) {
+ setInternalState(this, {
+ type: URL_SEARCH_PARAMS_ITERATOR,
+ iterator: getIterator(getInternalParamsState(params).entries),
+ kind: kind
+ });
+}, 'Iterator', function next() {
+ var state = getInternalIteratorState(this);
+ var kind = state.kind;
+ var step = state.iterator.next();
+ var entry = step.value;
+ if (!step.done) {
+ step.value = kind === 'keys' ? entry.key : kind === 'values' ? entry.value : [entry.key, entry.value];
+ } return step;
+});
+
+// `URLSearchParams` constructor
+// https://url.spec.whatwg.org/#interface-urlsearchparams
+var URLSearchParamsConstructor = function URLSearchParams(/* init */) {
+ anInstance(this, URLSearchParamsConstructor, URL_SEARCH_PARAMS);
+ var init = arguments.length > 0 ? arguments[0] : undefined;
+ var that = this;
+ var entries = [];
+ var iteratorMethod, iterator, next, step, entryIterator, entryNext, first, second, key;
+
+ setInternalState(that, {
+ type: URL_SEARCH_PARAMS,
+ entries: entries,
+ updateURL: function () { /* empty */ },
+ updateSearchParams: updateSearchParams
+ });
+
+ if (init !== undefined) {
+ if (isObject(init)) {
+ iteratorMethod = getIteratorMethod(init);
+ if (iteratorMethod) {
+ iterator = getIterator(init, iteratorMethod);
+ next = iterator.next;
+ while (!(step = next.call(iterator)).done) {
+ entryIterator = getIterator(anObject(step.value));
+ entryNext = entryIterator.next;
+ if (
+ (first = entryNext.call(entryIterator)).done ||
+ (second = entryNext.call(entryIterator)).done ||
+ !entryNext.call(entryIterator).done
+ ) throw TypeError('Expected sequence with length 2');
+ entries.push({ key: $toString(first.value), value: $toString(second.value) });
+ }
+ } else for (key in init) if (hasOwn(init, key)) entries.push({ key: key, value: $toString(init[key]) });
+ } else {
+ parseSearchParams(
+ entries,
+ typeof init === 'string' ? init.charAt(0) === '?' ? init.slice(1) : init : $toString(init)
+ );
+ }
+ }
+};
+
+var URLSearchParamsPrototype = URLSearchParamsConstructor.prototype;
+
+redefineAll(URLSearchParamsPrototype, {
+ // `URLSearchParams.prototype.append` method
+ // https://url.spec.whatwg.org/#dom-urlsearchparams-append
+ append: function append(name, value) {
+ validateArgumentsLength(arguments.length, 2);
+ var state = getInternalParamsState(this);
+ state.entries.push({ key: $toString(name), value: $toString(value) });
+ state.updateURL();
+ },
+ // `URLSearchParams.prototype.delete` method
+ // https://url.spec.whatwg.org/#dom-urlsearchparams-delete
+ 'delete': function (name) {
+ validateArgumentsLength(arguments.length, 1);
+ var state = getInternalParamsState(this);
+ var entries = state.entries;
+ var key = $toString(name);
+ var index = 0;
+ while (index < entries.length) {
+ if (entries[index].key === key) entries.splice(index, 1);
+ else index++;
+ }
+ state.updateURL();
+ },
+ // `URLSearchParams.prototype.get` method
+ // https://url.spec.whatwg.org/#dom-urlsearchparams-get
+ get: function get(name) {
+ validateArgumentsLength(arguments.length, 1);
+ var entries = getInternalParamsState(this).entries;
+ var key = $toString(name);
+ var index = 0;
+ for (; index < entries.length; index++) {
+ if (entries[index].key === key) return entries[index].value;
+ }
+ return null;
+ },
+ // `URLSearchParams.prototype.getAll` method
+ // https://url.spec.whatwg.org/#dom-urlsearchparams-getall
+ getAll: function getAll(name) {
+ validateArgumentsLength(arguments.length, 1);
+ var entries = getInternalParamsState(this).entries;
+ var key = $toString(name);
+ var result = [];
+ var index = 0;
+ for (; index < entries.length; index++) {
+ if (entries[index].key === key) result.push(entries[index].value);
+ }
+ return result;
+ },
+ // `URLSearchParams.prototype.has` method
+ // https://url.spec.whatwg.org/#dom-urlsearchparams-has
+ has: function has(name) {
+ validateArgumentsLength(arguments.length, 1);
+ var entries = getInternalParamsState(this).entries;
+ var key = $toString(name);
+ var index = 0;
+ while (index < entries.length) {
+ if (entries[index++].key === key) return true;
+ }
+ return false;
+ },
+ // `URLSearchParams.prototype.set` method
+ // https://url.spec.whatwg.org/#dom-urlsearchparams-set
+ set: function set(name, value) {
+ validateArgumentsLength(arguments.length, 1);
+ var state = getInternalParamsState(this);
+ var entries = state.entries;
+ var found = false;
+ var key = $toString(name);
+ var val = $toString(value);
+ var index = 0;
+ var entry;
+ for (; index < entries.length; index++) {
+ entry = entries[index];
+ if (entry.key === key) {
+ if (found) entries.splice(index--, 1);
+ else {
+ found = true;
+ entry.value = val;
+ }
+ }
+ }
+ if (!found) entries.push({ key: key, value: val });
+ state.updateURL();
+ },
+ // `URLSearchParams.prototype.sort` method
+ // https://url.spec.whatwg.org/#dom-urlsearchparams-sort
+ sort: function sort() {
+ var state = getInternalParamsState(this);
+ var entries = state.entries;
+ // Array#sort is not stable in some engines
+ var slice = entries.slice();
+ var entry, entriesIndex, sliceIndex;
+ entries.length = 0;
+ for (sliceIndex = 0; sliceIndex < slice.length; sliceIndex++) {
+ entry = slice[sliceIndex];
+ for (entriesIndex = 0; entriesIndex < sliceIndex; entriesIndex++) {
+ if (entries[entriesIndex].key > entry.key) {
+ entries.splice(entriesIndex, 0, entry);
+ break;
+ }
+ }
+ if (entriesIndex === sliceIndex) entries.push(entry);
+ }
+ state.updateURL();
+ },
+ // `URLSearchParams.prototype.forEach` method
+ forEach: function forEach(callback /* , thisArg */) {
+ var entries = getInternalParamsState(this).entries;
+ var boundFunction = bind(callback, arguments.length > 1 ? arguments[1] : undefined, 3);
+ var index = 0;
+ var entry;
+ while (index < entries.length) {
+ entry = entries[index++];
+ boundFunction(entry.value, entry.key, this);
+ }
+ },
+ // `URLSearchParams.prototype.keys` method
+ keys: function keys() {
+ return new URLSearchParamsIterator(this, 'keys');
+ },
+ // `URLSearchParams.prototype.values` method
+ values: function values() {
+ return new URLSearchParamsIterator(this, 'values');
+ },
+ // `URLSearchParams.prototype.entries` method
+ entries: function entries() {
+ return new URLSearchParamsIterator(this, 'entries');
+ }
+}, { enumerable: true });
+
+// `URLSearchParams.prototype[@@iterator]` method
+redefine(URLSearchParamsPrototype, ITERATOR, URLSearchParamsPrototype.entries, { name: 'entries' });
+
+// `URLSearchParams.prototype.toString` method
+// https://url.spec.whatwg.org/#urlsearchparams-stringification-behavior
+redefine(URLSearchParamsPrototype, 'toString', function toString() {
+ var entries = getInternalParamsState(this).entries;
+ var result = [];
+ var index = 0;
+ var entry;
+ while (index < entries.length) {
+ entry = entries[index++];
+ result.push(serialize(entry.key) + '=' + serialize(entry.value));
+ } return result.join('&');
+}, { enumerable: true });
+
+setToStringTag(URLSearchParamsConstructor, URL_SEARCH_PARAMS);
+
+$({ global: true, forced: !USE_NATIVE_URL }, {
+ URLSearchParams: URLSearchParamsConstructor
+});
+
+// Wrap `fetch` and `Request` for correct work with polyfilled `URLSearchParams`
+if (!USE_NATIVE_URL && isCallable(Headers)) {
+ var wrapRequestOptions = function (init) {
+ if (isObject(init)) {
+ var body = init.body;
+ var headers;
+ if (classof(body) === URL_SEARCH_PARAMS) {
+ headers = init.headers ? new Headers(init.headers) : new Headers();
+ if (!headers.has('content-type')) {
+ headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8');
+ }
+ return create(init, {
+ body: createPropertyDescriptor(0, String(body)),
+ headers: createPropertyDescriptor(0, headers)
+ });
+ }
+ } return init;
+ };
+
+ if (isCallable(nativeFetch)) {
+ $({ global: true, enumerable: true, forced: true }, {
+ fetch: function fetch(input /* , init */) {
+ return nativeFetch(input, arguments.length > 1 ? wrapRequestOptions(arguments[1]) : {});
+ }
+ });
+ }
+
+ if (isCallable(NativeRequest)) {
+ var RequestConstructor = function Request(input /* , init */) {
+ anInstance(this, RequestConstructor, 'Request');
+ return new NativeRequest(input, arguments.length > 1 ? wrapRequestOptions(arguments[1]) : {});
+ };
+
+ RequestPrototype.constructor = RequestConstructor;
+ RequestConstructor.prototype = RequestPrototype;
+
+ $({ global: true, forced: true }, {
+ Request: RequestConstructor
+ });
+ }
+}
+
+module.exports = {
+ URLSearchParams: URLSearchParamsConstructor,
+ getState: getInternalParamsState
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/web.url.js":
+/*!*************************************************!*\
+ !*** ./node_modules/core-js/modules/web.url.js ***!
+ \*************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+// TODO: in core-js@4, move /modules/ dependencies to public entries for better optimization by tools like `preset-env`
+__webpack_require__(/*! ../modules/es.string.iterator */ "./node_modules/core-js/modules/es.string.iterator.js");
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/core-js/internals/descriptors.js");
+var USE_NATIVE_URL = __webpack_require__(/*! ../internals/native-url */ "./node_modules/core-js/internals/native-url.js");
+var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js");
+var defineProperties = __webpack_require__(/*! ../internals/object-define-properties */ "./node_modules/core-js/internals/object-define-properties.js");
+var redefine = __webpack_require__(/*! ../internals/redefine */ "./node_modules/core-js/internals/redefine.js");
+var anInstance = __webpack_require__(/*! ../internals/an-instance */ "./node_modules/core-js/internals/an-instance.js");
+var has = __webpack_require__(/*! ../internals/has */ "./node_modules/core-js/internals/has.js");
+var assign = __webpack_require__(/*! ../internals/object-assign */ "./node_modules/core-js/internals/object-assign.js");
+var arrayFrom = __webpack_require__(/*! ../internals/array-from */ "./node_modules/core-js/internals/array-from.js");
+var codeAt = __webpack_require__(/*! ../internals/string-multibyte */ "./node_modules/core-js/internals/string-multibyte.js").codeAt;
+var toASCII = __webpack_require__(/*! ../internals/string-punycode-to-ascii */ "./node_modules/core-js/internals/string-punycode-to-ascii.js");
+var $toString = __webpack_require__(/*! ../internals/to-string */ "./node_modules/core-js/internals/to-string.js");
+var setToStringTag = __webpack_require__(/*! ../internals/set-to-string-tag */ "./node_modules/core-js/internals/set-to-string-tag.js");
+var URLSearchParamsModule = __webpack_require__(/*! ../modules/web.url-search-params */ "./node_modules/core-js/modules/web.url-search-params.js");
+var InternalStateModule = __webpack_require__(/*! ../internals/internal-state */ "./node_modules/core-js/internals/internal-state.js");
+
+var NativeURL = global.URL;
+var URLSearchParams = URLSearchParamsModule.URLSearchParams;
+var getInternalSearchParamsState = URLSearchParamsModule.getState;
+var setInternalState = InternalStateModule.set;
+var getInternalURLState = InternalStateModule.getterFor('URL');
+var floor = Math.floor;
+var pow = Math.pow;
+
+var INVALID_AUTHORITY = 'Invalid authority';
+var INVALID_SCHEME = 'Invalid scheme';
+var INVALID_HOST = 'Invalid host';
+var INVALID_PORT = 'Invalid port';
+
+var ALPHA = /[A-Za-z]/;
+// eslint-disable-next-line regexp/no-obscure-range -- safe
+var ALPHANUMERIC = /[\d+-.A-Za-z]/;
+var DIGIT = /\d/;
+var HEX_START = /^0x/i;
+var OCT = /^[0-7]+$/;
+var DEC = /^\d+$/;
+var HEX = /^[\dA-Fa-f]+$/;
+/* eslint-disable regexp/no-control-character -- safe */
+var FORBIDDEN_HOST_CODE_POINT = /[\0\t\n\r #%/:<>?@[\\\]^|]/;
+var FORBIDDEN_HOST_CODE_POINT_EXCLUDING_PERCENT = /[\0\t\n\r #/:<>?@[\\\]^|]/;
+var LEADING_AND_TRAILING_C0_CONTROL_OR_SPACE = /^[\u0000-\u0020]+|[\u0000-\u0020]+$/g;
+var TAB_AND_NEW_LINE = /[\t\n\r]/g;
+/* eslint-enable regexp/no-control-character -- safe */
+var EOF;
+
+var parseHost = function (url, input) {
+ var result, codePoints, index;
+ if (input.charAt(0) == '[') {
+ if (input.charAt(input.length - 1) != ']') return INVALID_HOST;
+ result = parseIPv6(input.slice(1, -1));
+ if (!result) return INVALID_HOST;
+ url.host = result;
+ // opaque host
+ } else if (!isSpecial(url)) {
+ if (FORBIDDEN_HOST_CODE_POINT_EXCLUDING_PERCENT.test(input)) return INVALID_HOST;
+ result = '';
+ codePoints = arrayFrom(input);
+ for (index = 0; index < codePoints.length; index++) {
+ result += percentEncode(codePoints[index], C0ControlPercentEncodeSet);
+ }
+ url.host = result;
+ } else {
+ input = toASCII(input);
+ if (FORBIDDEN_HOST_CODE_POINT.test(input)) return INVALID_HOST;
+ result = parseIPv4(input);
+ if (result === null) return INVALID_HOST;
+ url.host = result;
+ }
+};
+
+var parseIPv4 = function (input) {
+ var parts = input.split('.');
+ var partsLength, numbers, index, part, radix, number, ipv4;
+ if (parts.length && parts[parts.length - 1] == '') {
+ parts.pop();
+ }
+ partsLength = parts.length;
+ if (partsLength > 4) return input;
+ numbers = [];
+ for (index = 0; index < partsLength; index++) {
+ part = parts[index];
+ if (part == '') return input;
+ radix = 10;
+ if (part.length > 1 && part.charAt(0) == '0') {
+ radix = HEX_START.test(part) ? 16 : 8;
+ part = part.slice(radix == 8 ? 1 : 2);
+ }
+ if (part === '') {
+ number = 0;
+ } else {
+ if (!(radix == 10 ? DEC : radix == 8 ? OCT : HEX).test(part)) return input;
+ number = parseInt(part, radix);
+ }
+ numbers.push(number);
+ }
+ for (index = 0; index < partsLength; index++) {
+ number = numbers[index];
+ if (index == partsLength - 1) {
+ if (number >= pow(256, 5 - partsLength)) return null;
+ } else if (number > 255) return null;
+ }
+ ipv4 = numbers.pop();
+ for (index = 0; index < numbers.length; index++) {
+ ipv4 += numbers[index] * pow(256, 3 - index);
+ }
+ return ipv4;
+};
+
+// eslint-disable-next-line max-statements -- TODO
+var parseIPv6 = function (input) {
+ var address = [0, 0, 0, 0, 0, 0, 0, 0];
+ var pieceIndex = 0;
+ var compress = null;
+ var pointer = 0;
+ var value, length, numbersSeen, ipv4Piece, number, swaps, swap;
+
+ var chr = function () {
+ return input.charAt(pointer);
+ };
+
+ if (chr() == ':') {
+ if (input.charAt(1) != ':') return;
+ pointer += 2;
+ pieceIndex++;
+ compress = pieceIndex;
+ }
+ while (chr()) {
+ if (pieceIndex == 8) return;
+ if (chr() == ':') {
+ if (compress !== null) return;
+ pointer++;
+ pieceIndex++;
+ compress = pieceIndex;
+ continue;
+ }
+ value = length = 0;
+ while (length < 4 && HEX.test(chr())) {
+ value = value * 16 + parseInt(chr(), 16);
+ pointer++;
+ length++;
+ }
+ if (chr() == '.') {
+ if (length == 0) return;
+ pointer -= length;
+ if (pieceIndex > 6) return;
+ numbersSeen = 0;
+ while (chr()) {
+ ipv4Piece = null;
+ if (numbersSeen > 0) {
+ if (chr() == '.' && numbersSeen < 4) pointer++;
+ else return;
+ }
+ if (!DIGIT.test(chr())) return;
+ while (DIGIT.test(chr())) {
+ number = parseInt(chr(), 10);
+ if (ipv4Piece === null) ipv4Piece = number;
+ else if (ipv4Piece == 0) return;
+ else ipv4Piece = ipv4Piece * 10 + number;
+ if (ipv4Piece > 255) return;
+ pointer++;
+ }
+ address[pieceIndex] = address[pieceIndex] * 256 + ipv4Piece;
+ numbersSeen++;
+ if (numbersSeen == 2 || numbersSeen == 4) pieceIndex++;
+ }
+ if (numbersSeen != 4) return;
+ break;
+ } else if (chr() == ':') {
+ pointer++;
+ if (!chr()) return;
+ } else if (chr()) return;
+ address[pieceIndex++] = value;
+ }
+ if (compress !== null) {
+ swaps = pieceIndex - compress;
+ pieceIndex = 7;
+ while (pieceIndex != 0 && swaps > 0) {
+ swap = address[pieceIndex];
+ address[pieceIndex--] = address[compress + swaps - 1];
+ address[compress + --swaps] = swap;
+ }
+ } else if (pieceIndex != 8) return;
+ return address;
+};
+
+var findLongestZeroSequence = function (ipv6) {
+ var maxIndex = null;
+ var maxLength = 1;
+ var currStart = null;
+ var currLength = 0;
+ var index = 0;
+ for (; index < 8; index++) {
+ if (ipv6[index] !== 0) {
+ if (currLength > maxLength) {
+ maxIndex = currStart;
+ maxLength = currLength;
+ }
+ currStart = null;
+ currLength = 0;
+ } else {
+ if (currStart === null) currStart = index;
+ ++currLength;
+ }
+ }
+ if (currLength > maxLength) {
+ maxIndex = currStart;
+ maxLength = currLength;
+ }
+ return maxIndex;
+};
+
+var serializeHost = function (host) {
+ var result, index, compress, ignore0;
+ // ipv4
+ if (typeof host == 'number') {
+ result = [];
+ for (index = 0; index < 4; index++) {
+ result.unshift(host % 256);
+ host = floor(host / 256);
+ } return result.join('.');
+ // ipv6
+ } else if (typeof host == 'object') {
+ result = '';
+ compress = findLongestZeroSequence(host);
+ for (index = 0; index < 8; index++) {
+ if (ignore0 && host[index] === 0) continue;
+ if (ignore0) ignore0 = false;
+ if (compress === index) {
+ result += index ? ':' : '::';
+ ignore0 = true;
+ } else {
+ result += host[index].toString(16);
+ if (index < 7) result += ':';
+ }
+ }
+ return '[' + result + ']';
+ } return host;
+};
+
+var C0ControlPercentEncodeSet = {};
+var fragmentPercentEncodeSet = assign({}, C0ControlPercentEncodeSet, {
+ ' ': 1, '"': 1, '<': 1, '>': 1, '`': 1
+});
+var pathPercentEncodeSet = assign({}, fragmentPercentEncodeSet, {
+ '#': 1, '?': 1, '{': 1, '}': 1
+});
+var userinfoPercentEncodeSet = assign({}, pathPercentEncodeSet, {
+ '/': 1, ':': 1, ';': 1, '=': 1, '@': 1, '[': 1, '\\': 1, ']': 1, '^': 1, '|': 1
+});
+
+var percentEncode = function (chr, set) {
+ var code = codeAt(chr, 0);
+ return code > 0x20 && code < 0x7F && !has(set, chr) ? chr : encodeURIComponent(chr);
+};
+
+var specialSchemes = {
+ ftp: 21,
+ file: null,
+ http: 80,
+ https: 443,
+ ws: 80,
+ wss: 443
+};
+
+var isSpecial = function (url) {
+ return has(specialSchemes, url.scheme);
+};
+
+var includesCredentials = function (url) {
+ return url.username != '' || url.password != '';
+};
+
+var cannotHaveUsernamePasswordPort = function (url) {
+ return !url.host || url.cannotBeABaseURL || url.scheme == 'file';
+};
+
+var isWindowsDriveLetter = function (string, normalized) {
+ var second;
+ return string.length == 2 && ALPHA.test(string.charAt(0))
+ && ((second = string.charAt(1)) == ':' || (!normalized && second == '|'));
+};
+
+var startsWithWindowsDriveLetter = function (string) {
+ var third;
+ return string.length > 1 && isWindowsDriveLetter(string.slice(0, 2)) && (
+ string.length == 2 ||
+ ((third = string.charAt(2)) === '/' || third === '\\' || third === '?' || third === '#')
+ );
+};
+
+var shortenURLsPath = function (url) {
+ var path = url.path;
+ var pathSize = path.length;
+ if (pathSize && (url.scheme != 'file' || pathSize != 1 || !isWindowsDriveLetter(path[0], true))) {
+ path.pop();
+ }
+};
+
+var isSingleDot = function (segment) {
+ return segment === '.' || segment.toLowerCase() === '%2e';
+};
+
+var isDoubleDot = function (segment) {
+ segment = segment.toLowerCase();
+ return segment === '..' || segment === '%2e.' || segment === '.%2e' || segment === '%2e%2e';
+};
+
+// States:
+var SCHEME_START = {};
+var SCHEME = {};
+var NO_SCHEME = {};
+var SPECIAL_RELATIVE_OR_AUTHORITY = {};
+var PATH_OR_AUTHORITY = {};
+var RELATIVE = {};
+var RELATIVE_SLASH = {};
+var SPECIAL_AUTHORITY_SLASHES = {};
+var SPECIAL_AUTHORITY_IGNORE_SLASHES = {};
+var AUTHORITY = {};
+var HOST = {};
+var HOSTNAME = {};
+var PORT = {};
+var FILE = {};
+var FILE_SLASH = {};
+var FILE_HOST = {};
+var PATH_START = {};
+var PATH = {};
+var CANNOT_BE_A_BASE_URL_PATH = {};
+var QUERY = {};
+var FRAGMENT = {};
+
+// eslint-disable-next-line max-statements -- TODO
+var parseURL = function (url, input, stateOverride, base) {
+ var state = stateOverride || SCHEME_START;
+ var pointer = 0;
+ var buffer = '';
+ var seenAt = false;
+ var seenBracket = false;
+ var seenPasswordToken = false;
+ var codePoints, chr, bufferCodePoints, failure;
+
+ if (!stateOverride) {
+ url.scheme = '';
+ url.username = '';
+ url.password = '';
+ url.host = null;
+ url.port = null;
+ url.path = [];
+ url.query = null;
+ url.fragment = null;
+ url.cannotBeABaseURL = false;
+ input = input.replace(LEADING_AND_TRAILING_C0_CONTROL_OR_SPACE, '');
+ }
+
+ input = input.replace(TAB_AND_NEW_LINE, '');
+
+ codePoints = arrayFrom(input);
+
+ while (pointer <= codePoints.length) {
+ chr = codePoints[pointer];
+ switch (state) {
+ case SCHEME_START:
+ if (chr && ALPHA.test(chr)) {
+ buffer += chr.toLowerCase();
+ state = SCHEME;
+ } else if (!stateOverride) {
+ state = NO_SCHEME;
+ continue;
+ } else return INVALID_SCHEME;
+ break;
+
+ case SCHEME:
+ if (chr && (ALPHANUMERIC.test(chr) || chr == '+' || chr == '-' || chr == '.')) {
+ buffer += chr.toLowerCase();
+ } else if (chr == ':') {
+ if (stateOverride && (
+ (isSpecial(url) != has(specialSchemes, buffer)) ||
+ (buffer == 'file' && (includesCredentials(url) || url.port !== null)) ||
+ (url.scheme == 'file' && !url.host)
+ )) return;
+ url.scheme = buffer;
+ if (stateOverride) {
+ if (isSpecial(url) && specialSchemes[url.scheme] == url.port) url.port = null;
+ return;
+ }
+ buffer = '';
+ if (url.scheme == 'file') {
+ state = FILE;
+ } else if (isSpecial(url) && base && base.scheme == url.scheme) {
+ state = SPECIAL_RELATIVE_OR_AUTHORITY;
+ } else if (isSpecial(url)) {
+ state = SPECIAL_AUTHORITY_SLASHES;
+ } else if (codePoints[pointer + 1] == '/') {
+ state = PATH_OR_AUTHORITY;
+ pointer++;
+ } else {
+ url.cannotBeABaseURL = true;
+ url.path.push('');
+ state = CANNOT_BE_A_BASE_URL_PATH;
+ }
+ } else if (!stateOverride) {
+ buffer = '';
+ state = NO_SCHEME;
+ pointer = 0;
+ continue;
+ } else return INVALID_SCHEME;
+ break;
+
+ case NO_SCHEME:
+ if (!base || (base.cannotBeABaseURL && chr != '#')) return INVALID_SCHEME;
+ if (base.cannotBeABaseURL && chr == '#') {
+ url.scheme = base.scheme;
+ url.path = base.path.slice();
+ url.query = base.query;
+ url.fragment = '';
+ url.cannotBeABaseURL = true;
+ state = FRAGMENT;
+ break;
+ }
+ state = base.scheme == 'file' ? FILE : RELATIVE;
+ continue;
+
+ case SPECIAL_RELATIVE_OR_AUTHORITY:
+ if (chr == '/' && codePoints[pointer + 1] == '/') {
+ state = SPECIAL_AUTHORITY_IGNORE_SLASHES;
+ pointer++;
+ } else {
+ state = RELATIVE;
+ continue;
+ } break;
+
+ case PATH_OR_AUTHORITY:
+ if (chr == '/') {
+ state = AUTHORITY;
+ break;
+ } else {
+ state = PATH;
+ continue;
+ }
+
+ case RELATIVE:
+ url.scheme = base.scheme;
+ if (chr == EOF) {
+ url.username = base.username;
+ url.password = base.password;
+ url.host = base.host;
+ url.port = base.port;
+ url.path = base.path.slice();
+ url.query = base.query;
+ } else if (chr == '/' || (chr == '\\' && isSpecial(url))) {
+ state = RELATIVE_SLASH;
+ } else if (chr == '?') {
+ url.username = base.username;
+ url.password = base.password;
+ url.host = base.host;
+ url.port = base.port;
+ url.path = base.path.slice();
+ url.query = '';
+ state = QUERY;
+ } else if (chr == '#') {
+ url.username = base.username;
+ url.password = base.password;
+ url.host = base.host;
+ url.port = base.port;
+ url.path = base.path.slice();
+ url.query = base.query;
+ url.fragment = '';
+ state = FRAGMENT;
+ } else {
+ url.username = base.username;
+ url.password = base.password;
+ url.host = base.host;
+ url.port = base.port;
+ url.path = base.path.slice();
+ url.path.pop();
+ state = PATH;
+ continue;
+ } break;
+
+ case RELATIVE_SLASH:
+ if (isSpecial(url) && (chr == '/' || chr == '\\')) {
+ state = SPECIAL_AUTHORITY_IGNORE_SLASHES;
+ } else if (chr == '/') {
+ state = AUTHORITY;
+ } else {
+ url.username = base.username;
+ url.password = base.password;
+ url.host = base.host;
+ url.port = base.port;
+ state = PATH;
+ continue;
+ } break;
+
+ case SPECIAL_AUTHORITY_SLASHES:
+ state = SPECIAL_AUTHORITY_IGNORE_SLASHES;
+ if (chr != '/' || buffer.charAt(pointer + 1) != '/') continue;
+ pointer++;
+ break;
+
+ case SPECIAL_AUTHORITY_IGNORE_SLASHES:
+ if (chr != '/' && chr != '\\') {
+ state = AUTHORITY;
+ continue;
+ } break;
+
+ case AUTHORITY:
+ if (chr == '@') {
+ if (seenAt) buffer = '%40' + buffer;
+ seenAt = true;
+ bufferCodePoints = arrayFrom(buffer);
+ for (var i = 0; i < bufferCodePoints.length; i++) {
+ var codePoint = bufferCodePoints[i];
+ if (codePoint == ':' && !seenPasswordToken) {
+ seenPasswordToken = true;
+ continue;
+ }
+ var encodedCodePoints = percentEncode(codePoint, userinfoPercentEncodeSet);
+ if (seenPasswordToken) url.password += encodedCodePoints;
+ else url.username += encodedCodePoints;
+ }
+ buffer = '';
+ } else if (
+ chr == EOF || chr == '/' || chr == '?' || chr == '#' ||
+ (chr == '\\' && isSpecial(url))
+ ) {
+ if (seenAt && buffer == '') return INVALID_AUTHORITY;
+ pointer -= arrayFrom(buffer).length + 1;
+ buffer = '';
+ state = HOST;
+ } else buffer += chr;
+ break;
+
+ case HOST:
+ case HOSTNAME:
+ if (stateOverride && url.scheme == 'file') {
+ state = FILE_HOST;
+ continue;
+ } else if (chr == ':' && !seenBracket) {
+ if (buffer == '') return INVALID_HOST;
+ failure = parseHost(url, buffer);
+ if (failure) return failure;
+ buffer = '';
+ state = PORT;
+ if (stateOverride == HOSTNAME) return;
+ } else if (
+ chr == EOF || chr == '/' || chr == '?' || chr == '#' ||
+ (chr == '\\' && isSpecial(url))
+ ) {
+ if (isSpecial(url) && buffer == '') return INVALID_HOST;
+ if (stateOverride && buffer == '' && (includesCredentials(url) || url.port !== null)) return;
+ failure = parseHost(url, buffer);
+ if (failure) return failure;
+ buffer = '';
+ state = PATH_START;
+ if (stateOverride) return;
+ continue;
+ } else {
+ if (chr == '[') seenBracket = true;
+ else if (chr == ']') seenBracket = false;
+ buffer += chr;
+ } break;
+
+ case PORT:
+ if (DIGIT.test(chr)) {
+ buffer += chr;
+ } else if (
+ chr == EOF || chr == '/' || chr == '?' || chr == '#' ||
+ (chr == '\\' && isSpecial(url)) ||
+ stateOverride
+ ) {
+ if (buffer != '') {
+ var port = parseInt(buffer, 10);
+ if (port > 0xFFFF) return INVALID_PORT;
+ url.port = (isSpecial(url) && port === specialSchemes[url.scheme]) ? null : port;
+ buffer = '';
+ }
+ if (stateOverride) return;
+ state = PATH_START;
+ continue;
+ } else return INVALID_PORT;
+ break;
+
+ case FILE:
+ url.scheme = 'file';
+ if (chr == '/' || chr == '\\') state = FILE_SLASH;
+ else if (base && base.scheme == 'file') {
+ if (chr == EOF) {
+ url.host = base.host;
+ url.path = base.path.slice();
+ url.query = base.query;
+ } else if (chr == '?') {
+ url.host = base.host;
+ url.path = base.path.slice();
+ url.query = '';
+ state = QUERY;
+ } else if (chr == '#') {
+ url.host = base.host;
+ url.path = base.path.slice();
+ url.query = base.query;
+ url.fragment = '';
+ state = FRAGMENT;
+ } else {
+ if (!startsWithWindowsDriveLetter(codePoints.slice(pointer).join(''))) {
+ url.host = base.host;
+ url.path = base.path.slice();
+ shortenURLsPath(url);
+ }
+ state = PATH;
+ continue;
+ }
+ } else {
+ state = PATH;
+ continue;
+ } break;
+
+ case FILE_SLASH:
+ if (chr == '/' || chr == '\\') {
+ state = FILE_HOST;
+ break;
+ }
+ if (base && base.scheme == 'file' && !startsWithWindowsDriveLetter(codePoints.slice(pointer).join(''))) {
+ if (isWindowsDriveLetter(base.path[0], true)) url.path.push(base.path[0]);
+ else url.host = base.host;
+ }
+ state = PATH;
+ continue;
+
+ case FILE_HOST:
+ if (chr == EOF || chr == '/' || chr == '\\' || chr == '?' || chr == '#') {
+ if (!stateOverride && isWindowsDriveLetter(buffer)) {
+ state = PATH;
+ } else if (buffer == '') {
+ url.host = '';
+ if (stateOverride) return;
+ state = PATH_START;
+ } else {
+ failure = parseHost(url, buffer);
+ if (failure) return failure;
+ if (url.host == 'localhost') url.host = '';
+ if (stateOverride) return;
+ buffer = '';
+ state = PATH_START;
+ } continue;
+ } else buffer += chr;
+ break;
+
+ case PATH_START:
+ if (isSpecial(url)) {
+ state = PATH;
+ if (chr != '/' && chr != '\\') continue;
+ } else if (!stateOverride && chr == '?') {
+ url.query = '';
+ state = QUERY;
+ } else if (!stateOverride && chr == '#') {
+ url.fragment = '';
+ state = FRAGMENT;
+ } else if (chr != EOF) {
+ state = PATH;
+ if (chr != '/') continue;
+ } break;
+
+ case PATH:
+ if (
+ chr == EOF || chr == '/' ||
+ (chr == '\\' && isSpecial(url)) ||
+ (!stateOverride && (chr == '?' || chr == '#'))
+ ) {
+ if (isDoubleDot(buffer)) {
+ shortenURLsPath(url);
+ if (chr != '/' && !(chr == '\\' && isSpecial(url))) {
+ url.path.push('');
+ }
+ } else if (isSingleDot(buffer)) {
+ if (chr != '/' && !(chr == '\\' && isSpecial(url))) {
+ url.path.push('');
+ }
+ } else {
+ if (url.scheme == 'file' && !url.path.length && isWindowsDriveLetter(buffer)) {
+ if (url.host) url.host = '';
+ buffer = buffer.charAt(0) + ':'; // normalize windows drive letter
+ }
+ url.path.push(buffer);
+ }
+ buffer = '';
+ if (url.scheme == 'file' && (chr == EOF || chr == '?' || chr == '#')) {
+ while (url.path.length > 1 && url.path[0] === '') {
+ url.path.shift();
+ }
+ }
+ if (chr == '?') {
+ url.query = '';
+ state = QUERY;
+ } else if (chr == '#') {
+ url.fragment = '';
+ state = FRAGMENT;
+ }
+ } else {
+ buffer += percentEncode(chr, pathPercentEncodeSet);
+ } break;
+
+ case CANNOT_BE_A_BASE_URL_PATH:
+ if (chr == '?') {
+ url.query = '';
+ state = QUERY;
+ } else if (chr == '#') {
+ url.fragment = '';
+ state = FRAGMENT;
+ } else if (chr != EOF) {
+ url.path[0] += percentEncode(chr, C0ControlPercentEncodeSet);
+ } break;
+
+ case QUERY:
+ if (!stateOverride && chr == '#') {
+ url.fragment = '';
+ state = FRAGMENT;
+ } else if (chr != EOF) {
+ if (chr == "'" && isSpecial(url)) url.query += '%27';
+ else if (chr == '#') url.query += '%23';
+ else url.query += percentEncode(chr, C0ControlPercentEncodeSet);
+ } break;
+
+ case FRAGMENT:
+ if (chr != EOF) url.fragment += percentEncode(chr, fragmentPercentEncodeSet);
+ break;
+ }
+
+ pointer++;
+ }
+};
+
+// `URL` constructor
+// https://url.spec.whatwg.org/#url-class
+var URLConstructor = function URL(url /* , base */) {
+ var that = anInstance(this, URLConstructor, 'URL');
+ var base = arguments.length > 1 ? arguments[1] : undefined;
+ var urlString = $toString(url);
+ var state = setInternalState(that, { type: 'URL' });
+ var baseState, failure;
+ if (base !== undefined) {
+ if (base instanceof URLConstructor) baseState = getInternalURLState(base);
+ else {
+ failure = parseURL(baseState = {}, $toString(base));
+ if (failure) throw TypeError(failure);
+ }
+ }
+ failure = parseURL(state, urlString, null, baseState);
+ if (failure) throw TypeError(failure);
+ var searchParams = state.searchParams = new URLSearchParams();
+ var searchParamsState = getInternalSearchParamsState(searchParams);
+ searchParamsState.updateSearchParams(state.query);
+ searchParamsState.updateURL = function () {
+ state.query = String(searchParams) || null;
+ };
+ if (!DESCRIPTORS) {
+ that.href = serializeURL.call(that);
+ that.origin = getOrigin.call(that);
+ that.protocol = getProtocol.call(that);
+ that.username = getUsername.call(that);
+ that.password = getPassword.call(that);
+ that.host = getHost.call(that);
+ that.hostname = getHostname.call(that);
+ that.port = getPort.call(that);
+ that.pathname = getPathname.call(that);
+ that.search = getSearch.call(that);
+ that.searchParams = getSearchParams.call(that);
+ that.hash = getHash.call(that);
+ }
+};
+
+var URLPrototype = URLConstructor.prototype;
+
+var serializeURL = function () {
+ var url = getInternalURLState(this);
+ var scheme = url.scheme;
+ var username = url.username;
+ var password = url.password;
+ var host = url.host;
+ var port = url.port;
+ var path = url.path;
+ var query = url.query;
+ var fragment = url.fragment;
+ var output = scheme + ':';
+ if (host !== null) {
+ output += '//';
+ if (includesCredentials(url)) {
+ output += username + (password ? ':' + password : '') + '@';
+ }
+ output += serializeHost(host);
+ if (port !== null) output += ':' + port;
+ } else if (scheme == 'file') output += '//';
+ output += url.cannotBeABaseURL ? path[0] : path.length ? '/' + path.join('/') : '';
+ if (query !== null) output += '?' + query;
+ if (fragment !== null) output += '#' + fragment;
+ return output;
+};
+
+var getOrigin = function () {
+ var url = getInternalURLState(this);
+ var scheme = url.scheme;
+ var port = url.port;
+ if (scheme == 'blob') try {
+ return new URLConstructor(scheme.path[0]).origin;
+ } catch (error) {
+ return 'null';
+ }
+ if (scheme == 'file' || !isSpecial(url)) return 'null';
+ return scheme + '://' + serializeHost(url.host) + (port !== null ? ':' + port : '');
+};
+
+var getProtocol = function () {
+ return getInternalURLState(this).scheme + ':';
+};
+
+var getUsername = function () {
+ return getInternalURLState(this).username;
+};
+
+var getPassword = function () {
+ return getInternalURLState(this).password;
+};
+
+var getHost = function () {
+ var url = getInternalURLState(this);
+ var host = url.host;
+ var port = url.port;
+ return host === null ? ''
+ : port === null ? serializeHost(host)
+ : serializeHost(host) + ':' + port;
+};
+
+var getHostname = function () {
+ var host = getInternalURLState(this).host;
+ return host === null ? '' : serializeHost(host);
+};
+
+var getPort = function () {
+ var port = getInternalURLState(this).port;
+ return port === null ? '' : String(port);
+};
+
+var getPathname = function () {
+ var url = getInternalURLState(this);
+ var path = url.path;
+ return url.cannotBeABaseURL ? path[0] : path.length ? '/' + path.join('/') : '';
+};
+
+var getSearch = function () {
+ var query = getInternalURLState(this).query;
+ return query ? '?' + query : '';
+};
+
+var getSearchParams = function () {
+ return getInternalURLState(this).searchParams;
+};
+
+var getHash = function () {
+ var fragment = getInternalURLState(this).fragment;
+ return fragment ? '#' + fragment : '';
+};
+
+var accessorDescriptor = function (getter, setter) {
+ return { get: getter, set: setter, configurable: true, enumerable: true };
+};
+
+if (DESCRIPTORS) {
+ defineProperties(URLPrototype, {
+ // `URL.prototype.href` accessors pair
+ // https://url.spec.whatwg.org/#dom-url-href
+ href: accessorDescriptor(serializeURL, function (href) {
+ var url = getInternalURLState(this);
+ var urlString = $toString(href);
+ var failure = parseURL(url, urlString);
+ if (failure) throw TypeError(failure);
+ getInternalSearchParamsState(url.searchParams).updateSearchParams(url.query);
+ }),
+ // `URL.prototype.origin` getter
+ // https://url.spec.whatwg.org/#dom-url-origin
+ origin: accessorDescriptor(getOrigin),
+ // `URL.prototype.protocol` accessors pair
+ // https://url.spec.whatwg.org/#dom-url-protocol
+ protocol: accessorDescriptor(getProtocol, function (protocol) {
+ var url = getInternalURLState(this);
+ parseURL(url, $toString(protocol) + ':', SCHEME_START);
+ }),
+ // `URL.prototype.username` accessors pair
+ // https://url.spec.whatwg.org/#dom-url-username
+ username: accessorDescriptor(getUsername, function (username) {
+ var url = getInternalURLState(this);
+ var codePoints = arrayFrom($toString(username));
+ if (cannotHaveUsernamePasswordPort(url)) return;
+ url.username = '';
+ for (var i = 0; i < codePoints.length; i++) {
+ url.username += percentEncode(codePoints[i], userinfoPercentEncodeSet);
+ }
+ }),
+ // `URL.prototype.password` accessors pair
+ // https://url.spec.whatwg.org/#dom-url-password
+ password: accessorDescriptor(getPassword, function (password) {
+ var url = getInternalURLState(this);
+ var codePoints = arrayFrom($toString(password));
+ if (cannotHaveUsernamePasswordPort(url)) return;
+ url.password = '';
+ for (var i = 0; i < codePoints.length; i++) {
+ url.password += percentEncode(codePoints[i], userinfoPercentEncodeSet);
+ }
+ }),
+ // `URL.prototype.host` accessors pair
+ // https://url.spec.whatwg.org/#dom-url-host
+ host: accessorDescriptor(getHost, function (host) {
+ var url = getInternalURLState(this);
+ if (url.cannotBeABaseURL) return;
+ parseURL(url, $toString(host), HOST);
+ }),
+ // `URL.prototype.hostname` accessors pair
+ // https://url.spec.whatwg.org/#dom-url-hostname
+ hostname: accessorDescriptor(getHostname, function (hostname) {
+ var url = getInternalURLState(this);
+ if (url.cannotBeABaseURL) return;
+ parseURL(url, $toString(hostname), HOSTNAME);
+ }),
+ // `URL.prototype.port` accessors pair
+ // https://url.spec.whatwg.org/#dom-url-port
+ port: accessorDescriptor(getPort, function (port) {
+ var url = getInternalURLState(this);
+ if (cannotHaveUsernamePasswordPort(url)) return;
+ port = $toString(port);
+ if (port == '') url.port = null;
+ else parseURL(url, port, PORT);
+ }),
+ // `URL.prototype.pathname` accessors pair
+ // https://url.spec.whatwg.org/#dom-url-pathname
+ pathname: accessorDescriptor(getPathname, function (pathname) {
+ var url = getInternalURLState(this);
+ if (url.cannotBeABaseURL) return;
+ url.path = [];
+ parseURL(url, $toString(pathname), PATH_START);
+ }),
+ // `URL.prototype.search` accessors pair
+ // https://url.spec.whatwg.org/#dom-url-search
+ search: accessorDescriptor(getSearch, function (search) {
+ var url = getInternalURLState(this);
+ search = $toString(search);
+ if (search == '') {
+ url.query = null;
+ } else {
+ if ('?' == search.charAt(0)) search = search.slice(1);
+ url.query = '';
+ parseURL(url, search, QUERY);
+ }
+ getInternalSearchParamsState(url.searchParams).updateSearchParams(url.query);
+ }),
+ // `URL.prototype.searchParams` getter
+ // https://url.spec.whatwg.org/#dom-url-searchparams
+ searchParams: accessorDescriptor(getSearchParams),
+ // `URL.prototype.hash` accessors pair
+ // https://url.spec.whatwg.org/#dom-url-hash
+ hash: accessorDescriptor(getHash, function (hash) {
+ var url = getInternalURLState(this);
+ hash = $toString(hash);
+ if (hash == '') {
+ url.fragment = null;
+ return;
+ }
+ if ('#' == hash.charAt(0)) hash = hash.slice(1);
+ url.fragment = '';
+ parseURL(url, hash, FRAGMENT);
+ })
+ });
+}
+
+// `URL.prototype.toJSON` method
+// https://url.spec.whatwg.org/#dom-url-tojson
+redefine(URLPrototype, 'toJSON', function toJSON() {
+ return serializeURL.call(this);
+}, { enumerable: true });
+
+// `URL.prototype.toString` method
+// https://url.spec.whatwg.org/#URL-stringification-behavior
+redefine(URLPrototype, 'toString', function toString() {
+ return serializeURL.call(this);
+}, { enumerable: true });
+
+if (NativeURL) {
+ var nativeCreateObjectURL = NativeURL.createObjectURL;
+ var nativeRevokeObjectURL = NativeURL.revokeObjectURL;
+ // `URL.createObjectURL` method
+ // https://developer.mozilla.org/en-US/docs/Web/API/URL/createObjectURL
+ // eslint-disable-next-line no-unused-vars -- required for `.length`
+ if (nativeCreateObjectURL) redefine(URLConstructor, 'createObjectURL', function createObjectURL(blob) {
+ return nativeCreateObjectURL.apply(NativeURL, arguments);
+ });
+ // `URL.revokeObjectURL` method
+ // https://developer.mozilla.org/en-US/docs/Web/API/URL/revokeObjectURL
+ // eslint-disable-next-line no-unused-vars -- required for `.length`
+ if (nativeRevokeObjectURL) redefine(URLConstructor, 'revokeObjectURL', function revokeObjectURL(url) {
+ return nativeRevokeObjectURL.apply(NativeURL, arguments);
+ });
+}
+
+setToStringTag(URLConstructor, 'URL');
+
+$({ global: true, forced: !USE_NATIVE_URL, sham: !DESCRIPTORS }, {
+ URL: URLConstructor
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/modules/web.url.to-json.js":
+/*!*********************************************************!*\
+ !*** ./node_modules/core-js/modules/web.url.to-json.js ***!
+ \*********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
+
+// `URL.prototype.toJSON` method
+// https://url.spec.whatwg.org/#dom-url-tojson
+$({ target: 'URL', proto: true, enumerable: true }, {
+ toJSON: function toJSON() {
+ return URL.prototype.toString.call(this);
+ }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/core-js/stable/index.js":
+/*!**********************************************!*\
+ !*** ./node_modules/core-js/stable/index.js ***!
+ \**********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+__webpack_require__(/*! ../modules/es.symbol */ "./node_modules/core-js/modules/es.symbol.js");
+__webpack_require__(/*! ../modules/es.symbol.description */ "./node_modules/core-js/modules/es.symbol.description.js");
+__webpack_require__(/*! ../modules/es.symbol.async-iterator */ "./node_modules/core-js/modules/es.symbol.async-iterator.js");
+__webpack_require__(/*! ../modules/es.symbol.has-instance */ "./node_modules/core-js/modules/es.symbol.has-instance.js");
+__webpack_require__(/*! ../modules/es.symbol.is-concat-spreadable */ "./node_modules/core-js/modules/es.symbol.is-concat-spreadable.js");
+__webpack_require__(/*! ../modules/es.symbol.iterator */ "./node_modules/core-js/modules/es.symbol.iterator.js");
+__webpack_require__(/*! ../modules/es.symbol.match */ "./node_modules/core-js/modules/es.symbol.match.js");
+__webpack_require__(/*! ../modules/es.symbol.match-all */ "./node_modules/core-js/modules/es.symbol.match-all.js");
+__webpack_require__(/*! ../modules/es.symbol.replace */ "./node_modules/core-js/modules/es.symbol.replace.js");
+__webpack_require__(/*! ../modules/es.symbol.search */ "./node_modules/core-js/modules/es.symbol.search.js");
+__webpack_require__(/*! ../modules/es.symbol.species */ "./node_modules/core-js/modules/es.symbol.species.js");
+__webpack_require__(/*! ../modules/es.symbol.split */ "./node_modules/core-js/modules/es.symbol.split.js");
+__webpack_require__(/*! ../modules/es.symbol.to-primitive */ "./node_modules/core-js/modules/es.symbol.to-primitive.js");
+__webpack_require__(/*! ../modules/es.symbol.to-string-tag */ "./node_modules/core-js/modules/es.symbol.to-string-tag.js");
+__webpack_require__(/*! ../modules/es.symbol.unscopables */ "./node_modules/core-js/modules/es.symbol.unscopables.js");
+__webpack_require__(/*! ../modules/es.aggregate-error */ "./node_modules/core-js/modules/es.aggregate-error.js");
+__webpack_require__(/*! ../modules/es.array.at */ "./node_modules/core-js/modules/es.array.at.js");
+__webpack_require__(/*! ../modules/es.array.concat */ "./node_modules/core-js/modules/es.array.concat.js");
+__webpack_require__(/*! ../modules/es.array.copy-within */ "./node_modules/core-js/modules/es.array.copy-within.js");
+__webpack_require__(/*! ../modules/es.array.every */ "./node_modules/core-js/modules/es.array.every.js");
+__webpack_require__(/*! ../modules/es.array.fill */ "./node_modules/core-js/modules/es.array.fill.js");
+__webpack_require__(/*! ../modules/es.array.filter */ "./node_modules/core-js/modules/es.array.filter.js");
+__webpack_require__(/*! ../modules/es.array.find */ "./node_modules/core-js/modules/es.array.find.js");
+__webpack_require__(/*! ../modules/es.array.find-index */ "./node_modules/core-js/modules/es.array.find-index.js");
+__webpack_require__(/*! ../modules/es.array.flat */ "./node_modules/core-js/modules/es.array.flat.js");
+__webpack_require__(/*! ../modules/es.array.flat-map */ "./node_modules/core-js/modules/es.array.flat-map.js");
+__webpack_require__(/*! ../modules/es.array.for-each */ "./node_modules/core-js/modules/es.array.for-each.js");
+__webpack_require__(/*! ../modules/es.array.from */ "./node_modules/core-js/modules/es.array.from.js");
+__webpack_require__(/*! ../modules/es.array.includes */ "./node_modules/core-js/modules/es.array.includes.js");
+__webpack_require__(/*! ../modules/es.array.index-of */ "./node_modules/core-js/modules/es.array.index-of.js");
+__webpack_require__(/*! ../modules/es.array.is-array */ "./node_modules/core-js/modules/es.array.is-array.js");
+__webpack_require__(/*! ../modules/es.array.iterator */ "./node_modules/core-js/modules/es.array.iterator.js");
+__webpack_require__(/*! ../modules/es.array.join */ "./node_modules/core-js/modules/es.array.join.js");
+__webpack_require__(/*! ../modules/es.array.last-index-of */ "./node_modules/core-js/modules/es.array.last-index-of.js");
+__webpack_require__(/*! ../modules/es.array.map */ "./node_modules/core-js/modules/es.array.map.js");
+__webpack_require__(/*! ../modules/es.array.of */ "./node_modules/core-js/modules/es.array.of.js");
+__webpack_require__(/*! ../modules/es.array.reduce */ "./node_modules/core-js/modules/es.array.reduce.js");
+__webpack_require__(/*! ../modules/es.array.reduce-right */ "./node_modules/core-js/modules/es.array.reduce-right.js");
+__webpack_require__(/*! ../modules/es.array.reverse */ "./node_modules/core-js/modules/es.array.reverse.js");
+__webpack_require__(/*! ../modules/es.array.slice */ "./node_modules/core-js/modules/es.array.slice.js");
+__webpack_require__(/*! ../modules/es.array.some */ "./node_modules/core-js/modules/es.array.some.js");
+__webpack_require__(/*! ../modules/es.array.sort */ "./node_modules/core-js/modules/es.array.sort.js");
+__webpack_require__(/*! ../modules/es.array.species */ "./node_modules/core-js/modules/es.array.species.js");
+__webpack_require__(/*! ../modules/es.array.splice */ "./node_modules/core-js/modules/es.array.splice.js");
+__webpack_require__(/*! ../modules/es.array.unscopables.flat */ "./node_modules/core-js/modules/es.array.unscopables.flat.js");
+__webpack_require__(/*! ../modules/es.array.unscopables.flat-map */ "./node_modules/core-js/modules/es.array.unscopables.flat-map.js");
+__webpack_require__(/*! ../modules/es.array-buffer.constructor */ "./node_modules/core-js/modules/es.array-buffer.constructor.js");
+__webpack_require__(/*! ../modules/es.array-buffer.is-view */ "./node_modules/core-js/modules/es.array-buffer.is-view.js");
+__webpack_require__(/*! ../modules/es.array-buffer.slice */ "./node_modules/core-js/modules/es.array-buffer.slice.js");
+__webpack_require__(/*! ../modules/es.data-view */ "./node_modules/core-js/modules/es.data-view.js");
+__webpack_require__(/*! ../modules/es.date.get-year */ "./node_modules/core-js/modules/es.date.get-year.js");
+__webpack_require__(/*! ../modules/es.date.now */ "./node_modules/core-js/modules/es.date.now.js");
+__webpack_require__(/*! ../modules/es.date.set-year */ "./node_modules/core-js/modules/es.date.set-year.js");
+__webpack_require__(/*! ../modules/es.date.to-gmt-string */ "./node_modules/core-js/modules/es.date.to-gmt-string.js");
+__webpack_require__(/*! ../modules/es.date.to-iso-string */ "./node_modules/core-js/modules/es.date.to-iso-string.js");
+__webpack_require__(/*! ../modules/es.date.to-json */ "./node_modules/core-js/modules/es.date.to-json.js");
+__webpack_require__(/*! ../modules/es.date.to-primitive */ "./node_modules/core-js/modules/es.date.to-primitive.js");
+__webpack_require__(/*! ../modules/es.date.to-string */ "./node_modules/core-js/modules/es.date.to-string.js");
+__webpack_require__(/*! ../modules/es.escape */ "./node_modules/core-js/modules/es.escape.js");
+__webpack_require__(/*! ../modules/es.function.bind */ "./node_modules/core-js/modules/es.function.bind.js");
+__webpack_require__(/*! ../modules/es.function.has-instance */ "./node_modules/core-js/modules/es.function.has-instance.js");
+__webpack_require__(/*! ../modules/es.function.name */ "./node_modules/core-js/modules/es.function.name.js");
+__webpack_require__(/*! ../modules/es.global-this */ "./node_modules/core-js/modules/es.global-this.js");
+__webpack_require__(/*! ../modules/es.json.stringify */ "./node_modules/core-js/modules/es.json.stringify.js");
+__webpack_require__(/*! ../modules/es.json.to-string-tag */ "./node_modules/core-js/modules/es.json.to-string-tag.js");
+__webpack_require__(/*! ../modules/es.map */ "./node_modules/core-js/modules/es.map.js");
+__webpack_require__(/*! ../modules/es.math.acosh */ "./node_modules/core-js/modules/es.math.acosh.js");
+__webpack_require__(/*! ../modules/es.math.asinh */ "./node_modules/core-js/modules/es.math.asinh.js");
+__webpack_require__(/*! ../modules/es.math.atanh */ "./node_modules/core-js/modules/es.math.atanh.js");
+__webpack_require__(/*! ../modules/es.math.cbrt */ "./node_modules/core-js/modules/es.math.cbrt.js");
+__webpack_require__(/*! ../modules/es.math.clz32 */ "./node_modules/core-js/modules/es.math.clz32.js");
+__webpack_require__(/*! ../modules/es.math.cosh */ "./node_modules/core-js/modules/es.math.cosh.js");
+__webpack_require__(/*! ../modules/es.math.expm1 */ "./node_modules/core-js/modules/es.math.expm1.js");
+__webpack_require__(/*! ../modules/es.math.fround */ "./node_modules/core-js/modules/es.math.fround.js");
+__webpack_require__(/*! ../modules/es.math.hypot */ "./node_modules/core-js/modules/es.math.hypot.js");
+__webpack_require__(/*! ../modules/es.math.imul */ "./node_modules/core-js/modules/es.math.imul.js");
+__webpack_require__(/*! ../modules/es.math.log10 */ "./node_modules/core-js/modules/es.math.log10.js");
+__webpack_require__(/*! ../modules/es.math.log1p */ "./node_modules/core-js/modules/es.math.log1p.js");
+__webpack_require__(/*! ../modules/es.math.log2 */ "./node_modules/core-js/modules/es.math.log2.js");
+__webpack_require__(/*! ../modules/es.math.sign */ "./node_modules/core-js/modules/es.math.sign.js");
+__webpack_require__(/*! ../modules/es.math.sinh */ "./node_modules/core-js/modules/es.math.sinh.js");
+__webpack_require__(/*! ../modules/es.math.tanh */ "./node_modules/core-js/modules/es.math.tanh.js");
+__webpack_require__(/*! ../modules/es.math.to-string-tag */ "./node_modules/core-js/modules/es.math.to-string-tag.js");
+__webpack_require__(/*! ../modules/es.math.trunc */ "./node_modules/core-js/modules/es.math.trunc.js");
+__webpack_require__(/*! ../modules/es.number.constructor */ "./node_modules/core-js/modules/es.number.constructor.js");
+__webpack_require__(/*! ../modules/es.number.epsilon */ "./node_modules/core-js/modules/es.number.epsilon.js");
+__webpack_require__(/*! ../modules/es.number.is-finite */ "./node_modules/core-js/modules/es.number.is-finite.js");
+__webpack_require__(/*! ../modules/es.number.is-integer */ "./node_modules/core-js/modules/es.number.is-integer.js");
+__webpack_require__(/*! ../modules/es.number.is-nan */ "./node_modules/core-js/modules/es.number.is-nan.js");
+__webpack_require__(/*! ../modules/es.number.is-safe-integer */ "./node_modules/core-js/modules/es.number.is-safe-integer.js");
+__webpack_require__(/*! ../modules/es.number.max-safe-integer */ "./node_modules/core-js/modules/es.number.max-safe-integer.js");
+__webpack_require__(/*! ../modules/es.number.min-safe-integer */ "./node_modules/core-js/modules/es.number.min-safe-integer.js");
+__webpack_require__(/*! ../modules/es.number.parse-float */ "./node_modules/core-js/modules/es.number.parse-float.js");
+__webpack_require__(/*! ../modules/es.number.parse-int */ "./node_modules/core-js/modules/es.number.parse-int.js");
+__webpack_require__(/*! ../modules/es.number.to-fixed */ "./node_modules/core-js/modules/es.number.to-fixed.js");
+__webpack_require__(/*! ../modules/es.number.to-precision */ "./node_modules/core-js/modules/es.number.to-precision.js");
+__webpack_require__(/*! ../modules/es.object.assign */ "./node_modules/core-js/modules/es.object.assign.js");
+__webpack_require__(/*! ../modules/es.object.create */ "./node_modules/core-js/modules/es.object.create.js");
+__webpack_require__(/*! ../modules/es.object.define-getter */ "./node_modules/core-js/modules/es.object.define-getter.js");
+__webpack_require__(/*! ../modules/es.object.define-properties */ "./node_modules/core-js/modules/es.object.define-properties.js");
+__webpack_require__(/*! ../modules/es.object.define-property */ "./node_modules/core-js/modules/es.object.define-property.js");
+__webpack_require__(/*! ../modules/es.object.define-setter */ "./node_modules/core-js/modules/es.object.define-setter.js");
+__webpack_require__(/*! ../modules/es.object.entries */ "./node_modules/core-js/modules/es.object.entries.js");
+__webpack_require__(/*! ../modules/es.object.freeze */ "./node_modules/core-js/modules/es.object.freeze.js");
+__webpack_require__(/*! ../modules/es.object.from-entries */ "./node_modules/core-js/modules/es.object.from-entries.js");
+__webpack_require__(/*! ../modules/es.object.get-own-property-descriptor */ "./node_modules/core-js/modules/es.object.get-own-property-descriptor.js");
+__webpack_require__(/*! ../modules/es.object.get-own-property-descriptors */ "./node_modules/core-js/modules/es.object.get-own-property-descriptors.js");
+__webpack_require__(/*! ../modules/es.object.get-own-property-names */ "./node_modules/core-js/modules/es.object.get-own-property-names.js");
+__webpack_require__(/*! ../modules/es.object.get-prototype-of */ "./node_modules/core-js/modules/es.object.get-prototype-of.js");
+__webpack_require__(/*! ../modules/es.object.has-own */ "./node_modules/core-js/modules/es.object.has-own.js");
+__webpack_require__(/*! ../modules/es.object.is */ "./node_modules/core-js/modules/es.object.is.js");
+__webpack_require__(/*! ../modules/es.object.is-extensible */ "./node_modules/core-js/modules/es.object.is-extensible.js");
+__webpack_require__(/*! ../modules/es.object.is-frozen */ "./node_modules/core-js/modules/es.object.is-frozen.js");
+__webpack_require__(/*! ../modules/es.object.is-sealed */ "./node_modules/core-js/modules/es.object.is-sealed.js");
+__webpack_require__(/*! ../modules/es.object.keys */ "./node_modules/core-js/modules/es.object.keys.js");
+__webpack_require__(/*! ../modules/es.object.lookup-getter */ "./node_modules/core-js/modules/es.object.lookup-getter.js");
+__webpack_require__(/*! ../modules/es.object.lookup-setter */ "./node_modules/core-js/modules/es.object.lookup-setter.js");
+__webpack_require__(/*! ../modules/es.object.prevent-extensions */ "./node_modules/core-js/modules/es.object.prevent-extensions.js");
+__webpack_require__(/*! ../modules/es.object.seal */ "./node_modules/core-js/modules/es.object.seal.js");
+__webpack_require__(/*! ../modules/es.object.set-prototype-of */ "./node_modules/core-js/modules/es.object.set-prototype-of.js");
+__webpack_require__(/*! ../modules/es.object.to-string */ "./node_modules/core-js/modules/es.object.to-string.js");
+__webpack_require__(/*! ../modules/es.object.values */ "./node_modules/core-js/modules/es.object.values.js");
+__webpack_require__(/*! ../modules/es.parse-float */ "./node_modules/core-js/modules/es.parse-float.js");
+__webpack_require__(/*! ../modules/es.parse-int */ "./node_modules/core-js/modules/es.parse-int.js");
+__webpack_require__(/*! ../modules/es.promise */ "./node_modules/core-js/modules/es.promise.js");
+__webpack_require__(/*! ../modules/es.promise.all-settled */ "./node_modules/core-js/modules/es.promise.all-settled.js");
+__webpack_require__(/*! ../modules/es.promise.any */ "./node_modules/core-js/modules/es.promise.any.js");
+__webpack_require__(/*! ../modules/es.promise.finally */ "./node_modules/core-js/modules/es.promise.finally.js");
+__webpack_require__(/*! ../modules/es.reflect.apply */ "./node_modules/core-js/modules/es.reflect.apply.js");
+__webpack_require__(/*! ../modules/es.reflect.construct */ "./node_modules/core-js/modules/es.reflect.construct.js");
+__webpack_require__(/*! ../modules/es.reflect.define-property */ "./node_modules/core-js/modules/es.reflect.define-property.js");
+__webpack_require__(/*! ../modules/es.reflect.delete-property */ "./node_modules/core-js/modules/es.reflect.delete-property.js");
+__webpack_require__(/*! ../modules/es.reflect.get */ "./node_modules/core-js/modules/es.reflect.get.js");
+__webpack_require__(/*! ../modules/es.reflect.get-own-property-descriptor */ "./node_modules/core-js/modules/es.reflect.get-own-property-descriptor.js");
+__webpack_require__(/*! ../modules/es.reflect.get-prototype-of */ "./node_modules/core-js/modules/es.reflect.get-prototype-of.js");
+__webpack_require__(/*! ../modules/es.reflect.has */ "./node_modules/core-js/modules/es.reflect.has.js");
+__webpack_require__(/*! ../modules/es.reflect.is-extensible */ "./node_modules/core-js/modules/es.reflect.is-extensible.js");
+__webpack_require__(/*! ../modules/es.reflect.own-keys */ "./node_modules/core-js/modules/es.reflect.own-keys.js");
+__webpack_require__(/*! ../modules/es.reflect.prevent-extensions */ "./node_modules/core-js/modules/es.reflect.prevent-extensions.js");
+__webpack_require__(/*! ../modules/es.reflect.set */ "./node_modules/core-js/modules/es.reflect.set.js");
+__webpack_require__(/*! ../modules/es.reflect.set-prototype-of */ "./node_modules/core-js/modules/es.reflect.set-prototype-of.js");
+__webpack_require__(/*! ../modules/es.reflect.to-string-tag */ "./node_modules/core-js/modules/es.reflect.to-string-tag.js");
+__webpack_require__(/*! ../modules/es.regexp.constructor */ "./node_modules/core-js/modules/es.regexp.constructor.js");
+__webpack_require__(/*! ../modules/es.regexp.dot-all */ "./node_modules/core-js/modules/es.regexp.dot-all.js");
+__webpack_require__(/*! ../modules/es.regexp.exec */ "./node_modules/core-js/modules/es.regexp.exec.js");
+__webpack_require__(/*! ../modules/es.regexp.flags */ "./node_modules/core-js/modules/es.regexp.flags.js");
+__webpack_require__(/*! ../modules/es.regexp.sticky */ "./node_modules/core-js/modules/es.regexp.sticky.js");
+__webpack_require__(/*! ../modules/es.regexp.test */ "./node_modules/core-js/modules/es.regexp.test.js");
+__webpack_require__(/*! ../modules/es.regexp.to-string */ "./node_modules/core-js/modules/es.regexp.to-string.js");
+__webpack_require__(/*! ../modules/es.set */ "./node_modules/core-js/modules/es.set.js");
+__webpack_require__(/*! ../modules/es.string.at-alternative */ "./node_modules/core-js/modules/es.string.at-alternative.js");
+__webpack_require__(/*! ../modules/es.string.code-point-at */ "./node_modules/core-js/modules/es.string.code-point-at.js");
+__webpack_require__(/*! ../modules/es.string.ends-with */ "./node_modules/core-js/modules/es.string.ends-with.js");
+__webpack_require__(/*! ../modules/es.string.from-code-point */ "./node_modules/core-js/modules/es.string.from-code-point.js");
+__webpack_require__(/*! ../modules/es.string.includes */ "./node_modules/core-js/modules/es.string.includes.js");
+__webpack_require__(/*! ../modules/es.string.iterator */ "./node_modules/core-js/modules/es.string.iterator.js");
+__webpack_require__(/*! ../modules/es.string.match */ "./node_modules/core-js/modules/es.string.match.js");
+__webpack_require__(/*! ../modules/es.string.match-all */ "./node_modules/core-js/modules/es.string.match-all.js");
+__webpack_require__(/*! ../modules/es.string.pad-end */ "./node_modules/core-js/modules/es.string.pad-end.js");
+__webpack_require__(/*! ../modules/es.string.pad-start */ "./node_modules/core-js/modules/es.string.pad-start.js");
+__webpack_require__(/*! ../modules/es.string.raw */ "./node_modules/core-js/modules/es.string.raw.js");
+__webpack_require__(/*! ../modules/es.string.repeat */ "./node_modules/core-js/modules/es.string.repeat.js");
+__webpack_require__(/*! ../modules/es.string.replace */ "./node_modules/core-js/modules/es.string.replace.js");
+__webpack_require__(/*! ../modules/es.string.replace-all */ "./node_modules/core-js/modules/es.string.replace-all.js");
+__webpack_require__(/*! ../modules/es.string.search */ "./node_modules/core-js/modules/es.string.search.js");
+__webpack_require__(/*! ../modules/es.string.split */ "./node_modules/core-js/modules/es.string.split.js");
+__webpack_require__(/*! ../modules/es.string.starts-with */ "./node_modules/core-js/modules/es.string.starts-with.js");
+__webpack_require__(/*! ../modules/es.string.substr */ "./node_modules/core-js/modules/es.string.substr.js");
+__webpack_require__(/*! ../modules/es.string.trim */ "./node_modules/core-js/modules/es.string.trim.js");
+__webpack_require__(/*! ../modules/es.string.trim-end */ "./node_modules/core-js/modules/es.string.trim-end.js");
+__webpack_require__(/*! ../modules/es.string.trim-start */ "./node_modules/core-js/modules/es.string.trim-start.js");
+__webpack_require__(/*! ../modules/es.string.anchor */ "./node_modules/core-js/modules/es.string.anchor.js");
+__webpack_require__(/*! ../modules/es.string.big */ "./node_modules/core-js/modules/es.string.big.js");
+__webpack_require__(/*! ../modules/es.string.blink */ "./node_modules/core-js/modules/es.string.blink.js");
+__webpack_require__(/*! ../modules/es.string.bold */ "./node_modules/core-js/modules/es.string.bold.js");
+__webpack_require__(/*! ../modules/es.string.fixed */ "./node_modules/core-js/modules/es.string.fixed.js");
+__webpack_require__(/*! ../modules/es.string.fontcolor */ "./node_modules/core-js/modules/es.string.fontcolor.js");
+__webpack_require__(/*! ../modules/es.string.fontsize */ "./node_modules/core-js/modules/es.string.fontsize.js");
+__webpack_require__(/*! ../modules/es.string.italics */ "./node_modules/core-js/modules/es.string.italics.js");
+__webpack_require__(/*! ../modules/es.string.link */ "./node_modules/core-js/modules/es.string.link.js");
+__webpack_require__(/*! ../modules/es.string.small */ "./node_modules/core-js/modules/es.string.small.js");
+__webpack_require__(/*! ../modules/es.string.strike */ "./node_modules/core-js/modules/es.string.strike.js");
+__webpack_require__(/*! ../modules/es.string.sub */ "./node_modules/core-js/modules/es.string.sub.js");
+__webpack_require__(/*! ../modules/es.string.sup */ "./node_modules/core-js/modules/es.string.sup.js");
+__webpack_require__(/*! ../modules/es.typed-array.float32-array */ "./node_modules/core-js/modules/es.typed-array.float32-array.js");
+__webpack_require__(/*! ../modules/es.typed-array.float64-array */ "./node_modules/core-js/modules/es.typed-array.float64-array.js");
+__webpack_require__(/*! ../modules/es.typed-array.int8-array */ "./node_modules/core-js/modules/es.typed-array.int8-array.js");
+__webpack_require__(/*! ../modules/es.typed-array.int16-array */ "./node_modules/core-js/modules/es.typed-array.int16-array.js");
+__webpack_require__(/*! ../modules/es.typed-array.int32-array */ "./node_modules/core-js/modules/es.typed-array.int32-array.js");
+__webpack_require__(/*! ../modules/es.typed-array.uint8-array */ "./node_modules/core-js/modules/es.typed-array.uint8-array.js");
+__webpack_require__(/*! ../modules/es.typed-array.uint8-clamped-array */ "./node_modules/core-js/modules/es.typed-array.uint8-clamped-array.js");
+__webpack_require__(/*! ../modules/es.typed-array.uint16-array */ "./node_modules/core-js/modules/es.typed-array.uint16-array.js");
+__webpack_require__(/*! ../modules/es.typed-array.uint32-array */ "./node_modules/core-js/modules/es.typed-array.uint32-array.js");
+__webpack_require__(/*! ../modules/es.typed-array.at */ "./node_modules/core-js/modules/es.typed-array.at.js");
+__webpack_require__(/*! ../modules/es.typed-array.copy-within */ "./node_modules/core-js/modules/es.typed-array.copy-within.js");
+__webpack_require__(/*! ../modules/es.typed-array.every */ "./node_modules/core-js/modules/es.typed-array.every.js");
+__webpack_require__(/*! ../modules/es.typed-array.fill */ "./node_modules/core-js/modules/es.typed-array.fill.js");
+__webpack_require__(/*! ../modules/es.typed-array.filter */ "./node_modules/core-js/modules/es.typed-array.filter.js");
+__webpack_require__(/*! ../modules/es.typed-array.find */ "./node_modules/core-js/modules/es.typed-array.find.js");
+__webpack_require__(/*! ../modules/es.typed-array.find-index */ "./node_modules/core-js/modules/es.typed-array.find-index.js");
+__webpack_require__(/*! ../modules/es.typed-array.for-each */ "./node_modules/core-js/modules/es.typed-array.for-each.js");
+__webpack_require__(/*! ../modules/es.typed-array.from */ "./node_modules/core-js/modules/es.typed-array.from.js");
+__webpack_require__(/*! ../modules/es.typed-array.includes */ "./node_modules/core-js/modules/es.typed-array.includes.js");
+__webpack_require__(/*! ../modules/es.typed-array.index-of */ "./node_modules/core-js/modules/es.typed-array.index-of.js");
+__webpack_require__(/*! ../modules/es.typed-array.iterator */ "./node_modules/core-js/modules/es.typed-array.iterator.js");
+__webpack_require__(/*! ../modules/es.typed-array.join */ "./node_modules/core-js/modules/es.typed-array.join.js");
+__webpack_require__(/*! ../modules/es.typed-array.last-index-of */ "./node_modules/core-js/modules/es.typed-array.last-index-of.js");
+__webpack_require__(/*! ../modules/es.typed-array.map */ "./node_modules/core-js/modules/es.typed-array.map.js");
+__webpack_require__(/*! ../modules/es.typed-array.of */ "./node_modules/core-js/modules/es.typed-array.of.js");
+__webpack_require__(/*! ../modules/es.typed-array.reduce */ "./node_modules/core-js/modules/es.typed-array.reduce.js");
+__webpack_require__(/*! ../modules/es.typed-array.reduce-right */ "./node_modules/core-js/modules/es.typed-array.reduce-right.js");
+__webpack_require__(/*! ../modules/es.typed-array.reverse */ "./node_modules/core-js/modules/es.typed-array.reverse.js");
+__webpack_require__(/*! ../modules/es.typed-array.set */ "./node_modules/core-js/modules/es.typed-array.set.js");
+__webpack_require__(/*! ../modules/es.typed-array.slice */ "./node_modules/core-js/modules/es.typed-array.slice.js");
+__webpack_require__(/*! ../modules/es.typed-array.some */ "./node_modules/core-js/modules/es.typed-array.some.js");
+__webpack_require__(/*! ../modules/es.typed-array.sort */ "./node_modules/core-js/modules/es.typed-array.sort.js");
+__webpack_require__(/*! ../modules/es.typed-array.subarray */ "./node_modules/core-js/modules/es.typed-array.subarray.js");
+__webpack_require__(/*! ../modules/es.typed-array.to-locale-string */ "./node_modules/core-js/modules/es.typed-array.to-locale-string.js");
+__webpack_require__(/*! ../modules/es.typed-array.to-string */ "./node_modules/core-js/modules/es.typed-array.to-string.js");
+__webpack_require__(/*! ../modules/es.unescape */ "./node_modules/core-js/modules/es.unescape.js");
+__webpack_require__(/*! ../modules/es.weak-map */ "./node_modules/core-js/modules/es.weak-map.js");
+__webpack_require__(/*! ../modules/es.weak-set */ "./node_modules/core-js/modules/es.weak-set.js");
+__webpack_require__(/*! ../modules/web.dom-collections.for-each */ "./node_modules/core-js/modules/web.dom-collections.for-each.js");
+__webpack_require__(/*! ../modules/web.dom-collections.iterator */ "./node_modules/core-js/modules/web.dom-collections.iterator.js");
+__webpack_require__(/*! ../modules/web.immediate */ "./node_modules/core-js/modules/web.immediate.js");
+__webpack_require__(/*! ../modules/web.queue-microtask */ "./node_modules/core-js/modules/web.queue-microtask.js");
+__webpack_require__(/*! ../modules/web.timers */ "./node_modules/core-js/modules/web.timers.js");
+__webpack_require__(/*! ../modules/web.url */ "./node_modules/core-js/modules/web.url.js");
+__webpack_require__(/*! ../modules/web.url.to-json */ "./node_modules/core-js/modules/web.url.to-json.js");
+__webpack_require__(/*! ../modules/web.url-search-params */ "./node_modules/core-js/modules/web.url-search-params.js");
+
+module.exports = __webpack_require__(/*! ../internals/path */ "./node_modules/core-js/internals/path.js");
+
+
+/***/ }),
+
+/***/ "./node_modules/date-input-polyfill/date-input-polyfill.dist.js":
+/*!**********************************************************************!*\
+ !*** ./node_modules/date-input-polyfill/date-input-polyfill.dist.js ***!
+ \**********************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+!function(t,e){if(true)module.exports=e();else { var r, n; }}(this,function(){return function(t){function e(r){if(n[r])return n[r].exports;var o=n[r]={exports:{},id:r,loaded:!1};return t[r].call(o.exports,o,o.exports,e),o.loaded=!0,o.exports}var n={};return e.m=t,e.c=n,e.p="",e(0)}([function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{"default":t}}n(84);var o=n(41),i=r(o),a=function(){i["default"].addPickerToOtherInputs(),i["default"].supportsDateInput()||i["default"].addPickerToDateInputs()};a(),document.addEventListener("DOMContentLoaded",function(){a()}),document.querySelector("body").addEventListener("mousedown",function(){a()})},function(t,e,n){t.exports=!n(11)(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},function(t,e){var n=t.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=n)},function(t,e){var n={}.hasOwnProperty;t.exports=function(t,e){return n.call(t,e)}},function(t,e,n){var r=n(9),o=n(32),i=n(25),a=Object.defineProperty;e.f=n(1)?Object.defineProperty:function(t,e,n){if(r(t),e=i(e,!0),r(n),o)try{return a(t,e,n)}catch(u){}if("get"in n||"set"in n)throw TypeError("Accessors not supported!");return"value"in n&&(t[e]=n.value),t}},function(t,e,n){var r=n(59),o=n(16);t.exports=function(t){return r(o(t))}},function(t,e,n){var r=n(4),o=n(14);t.exports=n(1)?function(t,e,n){return r.f(t,e,o(1,n))}:function(t,e,n){return t[e]=n,t}},function(t,e,n){var r=n(23)("wks"),o=n(15),i=n(2).Symbol,a="function"==typeof i,u=t.exports=function(t){return r[t]||(r[t]=a&&i[t]||(a?i:o)("Symbol."+t))};u.store=r},function(t,e){var n=t.exports={version:"2.4.0"};"number"==typeof __e&&(__e=n)},function(t,e,n){var r=n(12);t.exports=function(t){if(!r(t))throw TypeError(t+" is not an object!");return t}},function(t,e,n){var r=n(2),o=n(8),i=n(56),a=n(6),u="prototype",s=function(t,e,n){var c,l,f,d=t&s.F,p=t&s.G,h=t&s.S,y=t&s.P,m=t&s.B,v=t&s.W,b=p?o:o[e]||(o[e]={}),g=b[u],x=p?r:h?r[e]:(r[e]||{})[u];p&&(n=e);for(c in n)l=!d&&x&&void 0!==x[c],l&&c in b||(f=l?x[c]:n[c],b[c]=p&&"function"!=typeof x[c]?n[c]:m&&l?i(f,r):v&&x[c]==f?function(t){var e=function(e,n,r){if(this instanceof t){switch(arguments.length){case 0:return new t;case 1:return new t(e);case 2:return new t(e,n)}return new t(e,n,r)}return t.apply(this,arguments)};return e[u]=t[u],e}(f):y&&"function"==typeof f?i(Function.call,f):f,y&&((b.virtual||(b.virtual={}))[c]=f,t&s.R&&g&&!g[c]&&a(g,c,f)))};s.F=1,s.G=2,s.S=4,s.P=8,s.B=16,s.W=32,s.U=64,s.R=128,t.exports=s},function(t,e){t.exports=function(t){try{return!!t()}catch(e){return!0}}},function(t,e){t.exports=function(t){return"object"==typeof t?null!==t:"function"==typeof t}},function(t,e,n){var r=n(38),o=n(17);t.exports=Object.keys||function(t){return r(t,o)}},function(t,e){t.exports=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}}},function(t,e){var n=0,r=Math.random();t.exports=function(t){return"Symbol(".concat(void 0===t?"":t,")_",(++n+r).toString(36))}},function(t,e){t.exports=function(t){if(void 0==t)throw TypeError("Can't call method on "+t);return t}},function(t,e){t.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},function(t,e){t.exports={}},function(t,e){t.exports=!0},function(t,e){e.f={}.propertyIsEnumerable},function(t,e,n){var r=n(4).f,o=n(3),i=n(7)("toStringTag");t.exports=function(t,e,n){t&&!o(t=n?t:t.prototype,i)&&r(t,i,{configurable:!0,value:e})}},function(t,e,n){var r=n(23)("keys"),o=n(15);t.exports=function(t){return r[t]||(r[t]=o(t))}},function(t,e,n){var r=n(2),o="__core-js_shared__",i=r[o]||(r[o]={});t.exports=function(t){return i[t]||(i[t]={})}},function(t,e){var n=Math.ceil,r=Math.floor;t.exports=function(t){return isNaN(t=+t)?0:(t>0?r:n)(t)}},function(t,e,n){var r=n(12);t.exports=function(t,e){if(!r(t))return t;var n,o;if(e&&"function"==typeof(n=t.toString)&&!r(o=n.call(t)))return o;if("function"==typeof(n=t.valueOf)&&!r(o=n.call(t)))return o;if(!e&&"function"==typeof(n=t.toString)&&!r(o=n.call(t)))return o;throw TypeError("Can't convert object to primitive value")}},function(t,e,n){var r=n(2),o=n(8),i=n(19),a=n(27),u=n(4).f;t.exports=function(t){var e=o.Symbol||(o.Symbol=i?{}:r.Symbol||{});"_"==t.charAt(0)||t in e||u(e,t,{value:a.f(t)})}},function(t,e,n){e.f=n(7)},function(t,e){"use strict";e.__esModule=!0,e["default"]=function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{"default":t}}e.__esModule=!0;var o=n(45),i=r(o);e["default"]=function(){function t(t,e){for(var n=0;n";for(e.style.display="none",n(58).appendChild(e),e.src="javascript:",t=e.contentWindow.document,t.open(),t.write(o+"script"+a+"document.F=Object"+o+"/script"+a),t.close(),c=t.F;r--;)delete c[s][i[r]];return c()};t.exports=Object.create||function(t,e){var n;return null!==t?(u[s]=r(t),n=new u,u[s]=null,n[a]=t):n=c(),void 0===e?n:o(n,e)}},function(t,e,n){var r=n(4),o=n(9),i=n(13);t.exports=n(1)?Object.defineProperties:function(t,e){o(t);for(var n,a=i(e),u=a.length,s=0;u>s;)r.f(t,n=a[s++],e[n]);return t}},function(t,e,n){var r=n(38),o=n(17).concat("length","prototype");e.f=Object.getOwnPropertyNames||function(t){return r(t,o)}},function(t,e){e.f=Object.getOwnPropertySymbols},function(t,e,n){var r=n(3),o=n(5),i=n(55)(!1),a=n(22)("IE_PROTO");t.exports=function(t,e){var n,u=o(t),s=0,c=[];for(n in u)n!=a&&r(u,n)&&c.push(n);for(;e.length>s;)r(u,n=e[s++])&&(~i(c,n)||c.push(n));return c}},function(t,e,n){t.exports=n(6)},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{"default":t}}function o(t,e){for(t=String(t),e=e||2;t.length0?"-":"+")+o(100*Math.floor(Math.abs(w)/60)+Math.abs(w)%60,4),S:["th","st","nd","rd"][h%10>3?0:(h%100-h%10!=10)*h%10],W:S,N:O};return s.replace(t,function(t){return t in D?D[t]:t.slice(1,t.length-1)})}}();l.masks={"default":"ddd mmm dd yyyy HH:MM:ss",shortDate:"m/d/yy",mediumDate:"mmm d, yyyy",longDate:"mmmm d, yyyy",fullDate:"dddd, mmmm d, yyyy",shortTime:"h:MM TT",mediumTime:"h:MM:ss TT",longTime:"h:MM:ss TT Z",isoDate:"yyyy-mm-dd",isoTime:"HH:MM:ss",isoDateTime:"yyyy-mm-dd'T'HH:MM:sso",isoUtcDateTime:"UTC:yyyy-mm-dd'T'HH:MM:ss'Z'",expiresHeaderFormat:"ddd, dd mmm yyyy HH:MM:ss Z"},l.i18n={dayNames:["Sun","Mon","Tue","Wed","Thu","Fri","Sat","Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],monthNames:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec","January","February","March","April","May","June","July","August","September","October","November","December"]},e["default"]=l},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{"default":t}}Object.defineProperty(e,"__esModule",{value:!0});var o=n(44),i=r(o),a=n(28),u=r(a),s=n(29),c=r(s),l=n(43),f=r(l),d=n(42),p=r(d),h=n(40),y=r(h),m=function(){function t(e){var n=this;(0,u["default"])(this,t),this.element=e,this.element.setAttribute("data-has-picker",""),this.locale=this.element.getAttribute("lang")||document.body.getAttribute("lang")||"en",this.format=this.element.getAttribute("date-format")||document.body.getAttribute("date-format")||this.element.getAttribute("data-date-format")||document.body.getAttribute("data-date-format")||"yyyy-mm-dd",this.localeText=this.getLocaleText(),(0,i["default"])(this.element,{valueAsDate:{get:function(){if(!n.element.value)return null;var t=n.format||"yyyy-mm-dd",e=n.element.value.match(/(\d+)/g),r=0,o={};return t.replace(/(yyyy|dd|mm)/g,function(t){o[t]=r++}),new Date(e[o.yyyy],e[o.mm]-1,e[o.dd])},set:function(t){n.element.value=(0,y["default"])(t,n.format)}},valueAsNumber:{get:function(){return n.element.value?n.element.valueAsDate.valueOf():NaN},set:function(t){n.element.valueAsDate=new Date(t)}}});var r=function(t){var e=n.element;e.locale=n.localeText,f["default"].attachTo(e)};this.element.addEventListener("focus",r),this.element.addEventListener("mouseup",r),this.element.addEventListener("keydown",function(t){var e=new Date;switch(t.keyCode){case 9:case 27:f["default"].hide();break;case 38:n.element.valueAsDate&&(e.setDate(n.element.valueAsDate.getDate()+1),n.element.valueAsDate=e,f["default"].pingInput());break;case 40:n.element.valueAsDate&&(e.setDate(n.element.valueAsDate.getDate()-1),n.element.valueAsDate=e,f["default"].pingInput())}f["default"].sync()}),this.element.addEventListener("keyup",function(t){f["default"].sync()})}return(0,c["default"])(t,[{key:"getLocaleText",value:function(){var t=this.locale.toLowerCase();for(var e in p["default"]){var n=e.split("_");if(n.map(function(t){return t.toLowerCase()}),~n.indexOf(t)||~n.indexOf(t.substr(0,2)))return p["default"][e]}}}],[{key:"supportsDateInput",value:function(){var t=document.createElement("input");t.setAttribute("type","date");var e="not-a-date";return t.setAttribute("value",e),!(t.value===e)}},{key:"addPickerToDateInputs",value:function(){var e=document.querySelectorAll('input[type="date"]:not([data-has-picker])'),n=e.length;if(!n)return!1;for(var r=0;r"],n=0,r=this.locale.days.length;n'+this.locale.days[n]+"");this.daysHead.innerHTML=e.join(""),t.createRangeSelect(this.month,0,11,this.locale.months)}},{key:"refreshDaysMatrix",value:function(){this.refreshLocale();for(var e=this.date.getFullYear(),n=this.date.getMonth(),r=new Date(e,n,1).getDay(),o=new Date(this.date.getFullYear(),n+1,0).getDate(),i=t.absoluteDate(this.input.valueAsDate)||!1,a=i&&e===i.getFullYear()&&n===i.getMonth(),u=[],s=0;s":"")+"\n \n "),s+1<=r)u.push(" | ");else{var c=s+1-r,l=a&&i.getDate()===c;u.push("\n "+c+"\n | ")}this.days.innerHTML=u.join("")}},{key:"pingInput",value:function(){var t=void 0,e=void 0;try{t=new Event("input"),e=new Event("change")}catch(n){t=document.createEvent("KeyboardEvent"),t.initEvent("input",!0,!1),e=document.createEvent("KeyboardEvent"),e.initEvent("change",!0,!1)}this.input.dispatchEvent(t),this.input.dispatchEvent(e)}}],[{key:"createRangeSelect",value:function(t,e,n,r){t.innerHTML="";for(var o=e;o<=n;++o){var i=document.createElement("option");t.appendChild(i);var a=r?r[o-e]:o;i.text=a,i.value=o}return t}},{key:"absoluteDate",value:function(t){return t&&new Date(t.getTime()+60*t.getTimezoneOffset()*1e3)}}]),t}();window.thePicker=new s,e["default"]=window.thePicker},function(t,e,n){t.exports={"default":n(49),__esModule:!0}},function(t,e,n){t.exports={"default":n(50),__esModule:!0}},function(t,e,n){t.exports={"default":n(51),__esModule:!0}},function(t,e,n){t.exports={"default":n(52),__esModule:!0}},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{"default":t}}e.__esModule=!0;var o=n(47),i=r(o),a=n(46),u=r(a),s="function"==typeof u["default"]&&"symbol"==typeof i["default"]?function(t){return typeof t}:function(t){return t&&"function"==typeof u["default"]&&t.constructor===u["default"]?"symbol":typeof t};e["default"]="function"==typeof u["default"]&&"symbol"===s(i["default"])?function(t){return"undefined"==typeof t?"undefined":s(t)}:function(t){return t&&"function"==typeof u["default"]&&t.constructor===u["default"]?"symbol":"undefined"==typeof t?"undefined":s(t)}},function(t,e,n){n(73);var r=n(8).Object;t.exports=function(t,e){return r.defineProperties(t,e)}},function(t,e,n){n(74);var r=n(8).Object;t.exports=function(t,e,n){return r.defineProperty(t,e,n)}},function(t,e,n){n(77),n(75),n(78),n(79),t.exports=n(8).Symbol},function(t,e,n){n(76),n(80),t.exports=n(27).f("iterator")},function(t,e){t.exports=function(t){if("function"!=typeof t)throw TypeError(t+" is not a function!");return t}},function(t,e){t.exports=function(){}},function(t,e,n){var r=n(5),o=n(70),i=n(69);t.exports=function(t){return function(e,n,a){var u,s=r(e),c=o(s.length),l=i(a,c);if(t&&n!=n){for(;c>l;)if(u=s[l++],u!=u)return!0}else for(;c>l;l++)if((t||l in s)&&s[l]===n)return t||l||0;return!t&&-1}}},function(t,e,n){var r=n(53);t.exports=function(t,e,n){if(r(t),void 0===e)return t;switch(n){case 1:return function(n){return t.call(e,n)};case 2:return function(n,r){return t.call(e,n,r)};case 3:return function(n,r,o){return t.call(e,n,r,o)}}return function(){return t.apply(e,arguments)}}},function(t,e,n){var r=n(13),o=n(37),i=n(20);t.exports=function(t){var e=r(t),n=o.f;if(n)for(var a,u=n(t),s=i.f,c=0;u.length>c;)s.call(t,a=u[c++])&&e.push(a);return e}},function(t,e,n){t.exports=n(2).document&&document.documentElement},function(t,e,n){var r=n(30);t.exports=Object("z").propertyIsEnumerable(0)?Object:function(t){return"String"==r(t)?t.split(""):Object(t)}},function(t,e,n){var r=n(30);t.exports=Array.isArray||function(t){return"Array"==r(t)}},function(t,e,n){"use strict";var r=n(34),o=n(14),i=n(21),a={};n(6)(a,n(7)("iterator"),function(){return this}),t.exports=function(t,e,n){t.prototype=r(a,{next:o(1,n)}),i(t,e+" Iterator")}},function(t,e){t.exports=function(t,e){return{value:e,done:!!t}}},function(t,e,n){var r=n(13),o=n(5);t.exports=function(t,e){for(var n,i=o(t),a=r(i),u=a.length,s=0;u>s;)if(i[n=a[s++]]===e)return n}},function(t,e,n){var r=n(15)("meta"),o=n(12),i=n(3),a=n(4).f,u=0,s=Object.isExtensible||function(){return!0},c=!n(11)(function(){return s(Object.preventExtensions({}))}),l=function(t){a(t,r,{value:{i:"O"+ ++u,w:{}}})},f=function(t,e){if(!o(t))return"symbol"==typeof t?t:("string"==typeof t?"S":"P")+t;if(!i(t,r)){if(!s(t))return"F";if(!e)return"E";l(t)}return t[r].i},d=function(t,e){if(!i(t,r)){if(!s(t))return!0;if(!e)return!1;l(t)}return t[r].w},p=function(t){return c&&h.NEED&&s(t)&&!i(t,r)&&l(t),t},h=t.exports={KEY:r,NEED:!1,fastKey:f,getWeak:d,onFreeze:p}},function(t,e,n){var r=n(20),o=n(14),i=n(5),a=n(25),u=n(3),s=n(32),c=Object.getOwnPropertyDescriptor;e.f=n(1)?c:function(t,e){if(t=i(t),e=a(e,!0),s)try{return c(t,e)}catch(n){}if(u(t,e))return o(!r.f.call(t,e),t[e])}},function(t,e,n){var r=n(5),o=n(36).f,i={}.toString,a="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],u=function(t){try{return o(t)}catch(e){return a.slice()}};t.exports.f=function(t){return a&&"[object Window]"==i.call(t)?u(t):o(r(t))}},function(t,e,n){var r=n(3),o=n(71),i=n(22)("IE_PROTO"),a=Object.prototype;t.exports=Object.getPrototypeOf||function(t){return t=o(t),r(t,i)?t[i]:"function"==typeof t.constructor&&t instanceof t.constructor?t.constructor.prototype:t instanceof Object?a:null}},function(t,e,n){var r=n(24),o=n(16);t.exports=function(t){return function(e,n){var i,a,u=String(o(e)),s=r(n),c=u.length;return s<0||s>=c?t?"":void 0:(i=u.charCodeAt(s),i<55296||i>56319||s+1===c||(a=u.charCodeAt(s+1))<56320||a>57343?t?u.charAt(s):i:t?u.slice(s,s+2):(i-55296<<10)+(a-56320)+65536)}}},function(t,e,n){var r=n(24),o=Math.max,i=Math.min;t.exports=function(t,e){return t=r(t),t<0?o(t+e,0):i(t,e)}},function(t,e,n){var r=n(24),o=Math.min;t.exports=function(t){return t>0?o(r(t),9007199254740991):0}},function(t,e,n){var r=n(16);t.exports=function(t){return Object(r(t))}},function(t,e,n){"use strict";var r=n(54),o=n(62),i=n(18),a=n(5);t.exports=n(33)(Array,"Array",function(t,e){this._t=a(t),this._i=0,this._k=e},function(){var t=this._t,e=this._k,n=this._i++;return!t||n>=t.length?(this._t=void 0,o(1)):"keys"==e?o(0,n):"values"==e?o(0,t[n]):o(0,[n,t[n]])},"values"),i.Arguments=i.Array,r("keys"),r("values"),r("entries")},function(t,e,n){var r=n(10);r(r.S+r.F*!n(1),"Object",{defineProperties:n(35)})},function(t,e,n){var r=n(10);r(r.S+r.F*!n(1),"Object",{defineProperty:n(4).f})},function(t,e){},function(t,e,n){"use strict";var r=n(68)(!0);n(33)(String,"String",function(t){this._t=String(t),this._i=0},function(){var t,e=this._t,n=this._i;return n>=e.length?{value:void 0,done:!0}:(t=r(e,n),this._i+=t.length,{value:t,done:!1})})},function(t,e,n){"use strict";var r=n(2),o=n(3),i=n(1),a=n(10),u=n(39),s=n(64).KEY,c=n(11),l=n(23),f=n(21),d=n(15),p=n(7),h=n(27),y=n(26),m=n(63),v=n(57),b=n(60),g=n(9),x=n(5),M=n(25),w=n(14),S=n(34),O=n(66),D=n(65),T=n(4),_=n(13),A=D.f,k=T.f,E=O.f,j=r.Symbol,C=r.JSON,N=C&&C.stringify,L="prototype",P=p("_hidden"),F=p("toPrimitive"),J={}.propertyIsEnumerable,H=l("symbol-registry"),I=l("symbols"),Y=l("op-symbols"),R=Object[L],z="function"==typeof j,U=r.QObject,B=!U||!U[L]||!U[L].findChild,W=i&&c(function(){return 7!=S(k({},"a",{get:function(){return k(this,"a",{value:7}).a}})).a})?function(t,e,n){var r=A(R,e);r&&delete R[e],k(t,e,n),r&&t!==R&&k(R,e,r)}:k,Z=function(t){var e=I[t]=S(j[L]);return e._k=t,e},G=z&&"symbol"==typeof j.iterator?function(t){return"symbol"==typeof t}:function(t){return t instanceof j},K=function(t,e,n){return t===R&&K(Y,e,n),g(t),e=M(e,!0),g(n),o(I,e)?(n.enumerable?(o(t,P)&&t[P][e]&&(t[P][e]=!1),n=S(n,{enumerable:w(0,!1)})):(o(t,P)||k(t,P,w(1,{})),t[P][e]=!0),W(t,e,n)):k(t,e,n)},V=function(t,e){g(t);for(var n,r=v(e=x(e)),o=0,i=r.length;i>o;)K(t,n=r[o++],e[n]);return t},q=function(t,e){return void 0===e?S(t):V(S(t),e)},Q=function(t){var e=J.call(this,t=M(t,!0));return!(this===R&&o(I,t)&&!o(Y,t))&&(!(e||!o(this,t)||!o(I,t)||o(this,P)&&this[P][t])||e)},X=function(t,e){if(t=x(t),e=M(e,!0),t!==R||!o(I,e)||o(Y,e)){var n=A(t,e);return!n||!o(I,e)||o(t,P)&&t[P][e]||(n.enumerable=!0),n}},$=function(t){for(var e,n=E(x(t)),r=[],i=0;n.length>i;)o(I,e=n[i++])||e==P||e==s||r.push(e);return r},tt=function(t){for(var e,n=t===R,r=E(n?Y:x(t)),i=[],a=0;r.length>a;)!o(I,e=r[a++])||n&&!o(R,e)||i.push(I[e]);return i};z||(j=function(){if(this instanceof j)throw TypeError("Symbol is not a constructor!");var t=d(arguments.length>0?arguments[0]:void 0),e=function(n){this===R&&e.call(Y,n),o(this,P)&&o(this[P],t)&&(this[P][t]=!1),W(this,t,w(1,n))};return i&&B&&W(R,t,{configurable:!0,set:e}),Z(t)},u(j[L],"toString",function(){return this._k}),D.f=X,T.f=K,n(36).f=O.f=$,n(20).f=Q,n(37).f=tt,i&&!n(19)&&u(R,"propertyIsEnumerable",Q,!0),h.f=function(t){return Z(p(t))}),a(a.G+a.W+a.F*!z,{Symbol:j});for(var et="hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables".split(","),nt=0;et.length>nt;)p(et[nt++]);for(var et=_(p.store),nt=0;et.length>nt;)y(et[nt++]);a(a.S+a.F*!z,"Symbol",{"for":function(t){return o(H,t+="")?H[t]:H[t]=j(t)},keyFor:function(t){if(G(t))return m(H,t);throw TypeError(t+" is not a symbol!")},useSetter:function(){B=!0},useSimple:function(){B=!1}}),a(a.S+a.F*!z,"Object",{create:q,defineProperty:K,defineProperties:V,getOwnPropertyDescriptor:X,getOwnPropertyNames:$,getOwnPropertySymbols:tt}),C&&a(a.S+a.F*(!z||c(function(){var t=j();return"[null]"!=N([t])||"{}"!=N({a:t})||"{}"!=N(Object(t))})),"JSON",{stringify:function(t){if(void 0!==t&&!G(t)){for(var e,n,r=[t],o=1;arguments.length>o;)r.push(arguments[o++]);return e=r[1],"function"==typeof e&&(n=e),!n&&b(e)||(e=function(t,e){if(n&&(e=n.call(this,t,e)),!G(e))return e}),r[1]=e,N.apply(C,r)}}}),j[L][F]||n(6)(j[L],F,j[L].valueOf),f(j,"Symbol"),f(Math,"Math",!0),f(r.JSON,"JSON",!0)},function(t,e,n){n(26)("asyncIterator")},function(t,e,n){n(26)("observable")},function(t,e,n){n(72);for(var r=n(2),o=n(6),i=n(18),a=n(7)("toStringTag"),u=["NodeList","DOMTokenList","MediaList","StyleSheetList","CSSRuleList"],s=0;s<5;s++){var c=u[s],l=r[c],f=l&&l.prototype;f&&!f[a]&&o(f,a,c),i[c]=i.Array}},function(t,e,n){e=t.exports=n(82)(),e.push([t.id,"date-input-polyfill{background:#fff;color:#000;text-shadow:none;border:0;padding:0;height:auto;width:auto;line-height:normal;font-family:sans-serif;font-size:14px;position:absolute!important;text-align:center;box-shadow:0 3px 10px 1px rgba(0,0,0,.22);cursor:default;z-index:1;border-radius:5px;-moz-border-radius:5px;-webkit-border-radius:5px;overflow:hidden;display:block}date-input-polyfill[data-open=false]{visibility:hidden;z-index:-100!important;top:0}date-input-polyfill[data-open=true]{visibility:visible}date-input-polyfill select,date-input-polyfill table,date-input-polyfill td,date-input-polyfill th{background:#fff;color:#000;text-shadow:none;border:0;padding:0;height:auto;width:auto;line-height:normal;font-family:sans-serif;font-size:14px;box-shadow:none;font-family:Lato,Helvetica,Arial,sans-serif}date-input-polyfill button,date-input-polyfill select{border:0;border-radius:0;border-bottom:1px solid #dadfe1;height:24px;vertical-align:top;-webkit-appearance:none;-moz-appearance:none}date-input-polyfill .monthSelect-wrapper{width:55%;display:inline-block}date-input-polyfill .yearSelect-wrapper{width:25%;display:inline-block}date-input-polyfill select{width:100%}date-input-polyfill select:first-of-type{border-right:1px solid #dadfe1;border-radius:5px 0 0 0;-moz-border-radius:5px 0 0 0;-webkit-border-radius:5px 0 0 0}date-input-polyfill button{width:20%;background:#dadfe1;border-radius:0 5px 0 0;-moz-border-radius:0 5px 0 0;-webkit-border-radius:0 5px 0 0}date-input-polyfill button:hover{background:#eee}date-input-polyfill table{border-collapse:separate!important;border-radius:0 0 5px 5px;-moz-border-radius:0 0 5px 5px;-webkit-border-radius:0 0 5px 5px;overflow:hidden;max-width:280px;width:280px}date-input-polyfill td,date-input-polyfill th{width:32px;padding:4px;text-align:center;box-sizing:content-box}date-input-polyfill td[data-day]{cursor:pointer}date-input-polyfill td[data-day]:hover{background:#dadfe1}date-input-polyfill [data-selected]{font-weight:700;background:#d8eaf6}",""]);
+},function(t,e){t.exports=function(){var t=[];return t.toString=function(){for(var t=[],e=0;e=0&&g.splice(e,1)}function u(t){var e=document.createElement("style");return e.type="text/css",i(t,e),e}function s(t){var e=document.createElement("link");return e.rel="stylesheet",i(t,e),e}function c(t,e){var n,r,o;if(e.singleton){var i=b++;n=v||(v=u(e)),r=l.bind(null,n,i,!1),o=l.bind(null,n,i,!0)}else t.sourceMap&&"function"==typeof URL&&"function"==typeof URL.createObjectURL&&"function"==typeof URL.revokeObjectURL&&"function"==typeof Blob&&"function"==typeof btoa?(n=s(e),r=d.bind(null,n),o=function(){a(n),n.href&&URL.revokeObjectURL(n.href)}):(n=u(e),r=f.bind(null,n),o=function(){a(n)});return r(t),function(e){if(e){if(e.css===t.css&&e.media===t.media&&e.sourceMap===t.sourceMap)return;r(t=e)}else o()}}function l(t,e,n,r){var o=n?"":r.css;if(t.styleSheet)t.styleSheet.cssText=x(e,o);else{var i=document.createTextNode(o),a=t.childNodes;a[e]&&t.removeChild(a[e]),a.length?t.insertBefore(i,a[e]):t.appendChild(i)}}function f(t,e){var n=e.css,r=e.media;if(r&&t.setAttribute("media",r),t.styleSheet)t.styleSheet.cssText=n;else{for(;t.firstChild;)t.removeChild(t.firstChild);t.appendChild(document.createTextNode(n))}}function d(t,e){var n=e.css,r=e.sourceMap;r&&(n+="\n/*# sourceMappingURL=data:application/json;base64,"+btoa(unescape(encodeURIComponent(JSON.stringify(r))))+" */");var o=new Blob([n],{type:"text/css"}),i=t.href;t.href=URL.createObjectURL(o),i&&URL.revokeObjectURL(i)}var p={},h=function(t){var e;return function(){return"undefined"==typeof e&&(e=t.apply(this,arguments)),e}},y=h(function(){return/msie [6-9]\b/.test(window.navigator.userAgent.toLowerCase())}),m=h(function(){return document.head||document.getElementsByTagName("head")[0]}),v=null,b=0,g=[];t.exports=function(t,e){e=e||{},"undefined"==typeof e.singleton&&(e.singleton=y()),"undefined"==typeof e.insertAt&&(e.insertAt="bottom");var n=o(t);return r(n,e),function(t){for(var i=[],a=0;a1||c<0||c>1?x:function(e){function f(a,b,c){return 3*a*(1-c)*(1-c)*c+3*b*(1-c)*c*c+c*c*c}if(e<=0){var g=0;return a>0?g=b/a:!b&&c>0&&(g=d/c),g*e}if(e>=1){var h=0;return c<1?h=(d-1)/(c-1):1==c&&a<1&&(h=(b-1)/(a-1)),1+h*(e-1)}for(var i=0,j=1;i=1)return 1;var d=1/a;return(c+=b*d)-c%d}}function k(a){C||(C=document.createElement("div").style),C.animationTimingFunction="",C.animationTimingFunction=a;var b=C.animationTimingFunction;if(""==b&&e())throw new TypeError(a+" is not a valid value for easing");return b}function l(a){if("linear"==a)return x;var b=E.exec(a);if(b)return i.apply(this,b.slice(1).map(Number));var c=F.exec(a);if(c)return j(Number(c[1]),A);var d=G.exec(a);return d?j(Number(d[1]),{start:y,middle:z,end:A}[d[2]]):B[a]||x}function m(a){return Math.abs(n(a)/a.playbackRate)}function n(a){return 0===a.duration||0===a.iterations?0:a.duration*a.iterations}function o(a,b,c){if(null==b)return H;var d=c.delay+a+c.endDelay;return b=Math.min(c.delay+a,d)?J:K}function p(a,b,c,d,e){switch(d){case I:return"backwards"==b||"both"==b?0:null;case K:return c-e;case J:return"forwards"==b||"both"==b?a:null;case H:return null}}function q(a,b,c,d,e){var f=e;return 0===a?b!==I&&(f+=c):f+=d/a,f}function r(a,b,c,d,e,f){var g=a===1/0?b%1:a%1;return 0!==g||c!==J||0===d||0===e&&0!==f||(g=1),g}function s(a,b,c,d){return a===J&&b===1/0?1/0:1===c?Math.floor(d)-1:Math.floor(d)}function t(a,b,c){var d=a;if("normal"!==a&&"reverse"!==a){var e=b;"alternate-reverse"===a&&(e+=1),d="normal",e!==1/0&&e%2!=0&&(d="reverse")}return"normal"===d?c:1-c}function u(a,b,c){var d=o(a,b,c),e=p(a,c.fill,b,d,c.delay);if(null===e)return null;var f=q(c.duration,d,c.iterations,e,c.iterationStart),g=r(f,c.iterationStart,d,c.iterations,e,c.duration),h=s(d,c.iterations,g,f),i=t(c.direction,h,g);return c._easingFunction(i)}var v="backwards|forwards|both|none".split("|"),w="reverse|alternate|alternate-reverse".split("|"),x=function(a){return a};d.prototype={_setMember:function(b,c){this["_"+b]=c,this._effect&&(this._effect._timingInput[b]=c,this._effect._timing=a.normalizeTimingInput(this._effect._timingInput),this._effect.activeDuration=a.calculateActiveDuration(this._effect._timing),this._effect._animation&&this._effect._animation._rebuildUnderlyingAnimation())},get playbackRate(){return this._playbackRate},set delay(a){this._setMember("delay",a)},get delay(){return this._delay},set endDelay(a){this._setMember("endDelay",a)},get endDelay(){return this._endDelay},set fill(a){this._setMember("fill",a)},get fill(){return this._fill},set iterationStart(a){if((isNaN(a)||a<0)&&e())throw new TypeError("iterationStart must be a non-negative number, received: "+a);this._setMember("iterationStart",a)},get iterationStart(){return this._iterationStart},set duration(a){if("auto"!=a&&(isNaN(a)||a<0)&&e())throw new TypeError("duration must be non-negative or auto, received: "+a);this._setMember("duration",a)},get duration(){return this._duration},set direction(a){this._setMember("direction",a)},get direction(){return this._direction},set easing(a){this._easingFunction=l(k(a)),this._setMember("easing",a)},get easing(){return this._easing},set iterations(a){if((isNaN(a)||a<0)&&e())throw new TypeError("iterations must be non-negative, received: "+a);this._setMember("iterations",a)},get iterations(){return this._iterations}};var y=1,z=.5,A=0,B={ease:i(.25,.1,.25,1),"ease-in":i(.42,0,1,1),"ease-out":i(0,0,.58,1),"ease-in-out":i(.42,0,.58,1),"step-start":j(1,y),"step-middle":j(1,z),"step-end":j(1,A)},C=null,D="\\s*(-?\\d+\\.?\\d*|-?\\.\\d+)\\s*",E=new RegExp("cubic-bezier\\("+D+","+D+","+D+","+D+"\\)"),F=/steps\(\s*(\d+)\s*\)/,G=/steps\(\s*(\d+)\s*,\s*(start|middle|end)\s*\)/,H=0,I=1,J=2,K=3;a.cloneTimingInput=c,a.makeTiming=f,a.numericTimingToObject=g,a.normalizeTimingInput=h,a.calculateActiveDuration=m,a.calculateIterationProgress=u,a.calculatePhase=o,a.normalizeEasing=k,a.parseEasingFunction=l}(a),function(a,b){function c(a,b){return a in k?k[a][b]||b:b}function d(a){return"display"===a||0===a.lastIndexOf("animation",0)||0===a.lastIndexOf("transition",0)}function e(a,b,e){if(!d(a)){var f=h[a];if(f){i.style[a]=b;for(var g in f){var j=f[g],k=i.style[j];e[j]=c(j,k)}}else e[a]=c(a,b)}}function f(a){var b=[];for(var c in a)if(!(c in["easing","offset","composite"])){var d=a[c];Array.isArray(d)||(d=[d]);for(var e,f=d.length,g=0;g1&&null==d[0].offset&&(d[0].offset=0);for(var b=0,c=d[0].offset,e=1;e1)throw new TypeError("Keyframe offsets must be between 0 and 1.")}}else if("composite"==d){if("add"==f||"accumulate"==f)throw{type:DOMException.NOT_SUPPORTED_ERR,name:"NotSupportedError",message:"add compositing is not supported"};if("replace"!=f)throw new TypeError("Invalid composite mode "+f+".")}else f="easing"==d?a.normalizeEasing(f):""+f;e(d,f,c)}return void 0==c.offset&&(c.offset=null),void 0==c.easing&&(c.easing="linear"),c}),g=!0,h=-1/0,i=0;i=0&&a.offset<=1}),g||c(),d}var h={background:["backgroundImage","backgroundPosition","backgroundSize","backgroundRepeat","backgroundAttachment","backgroundOrigin","backgroundClip","backgroundColor"],border:["borderTopColor","borderTopStyle","borderTopWidth","borderRightColor","borderRightStyle","borderRightWidth","borderBottomColor","borderBottomStyle","borderBottomWidth","borderLeftColor","borderLeftStyle","borderLeftWidth"],borderBottom:["borderBottomWidth","borderBottomStyle","borderBottomColor"],borderColor:["borderTopColor","borderRightColor","borderBottomColor","borderLeftColor"],borderLeft:["borderLeftWidth","borderLeftStyle","borderLeftColor"],borderRadius:["borderTopLeftRadius","borderTopRightRadius","borderBottomRightRadius","borderBottomLeftRadius"],borderRight:["borderRightWidth","borderRightStyle","borderRightColor"],borderTop:["borderTopWidth","borderTopStyle","borderTopColor"],borderWidth:["borderTopWidth","borderRightWidth","borderBottomWidth","borderLeftWidth"],flex:["flexGrow","flexShrink","flexBasis"],font:["fontFamily","fontSize","fontStyle","fontVariant","fontWeight","lineHeight"],margin:["marginTop","marginRight","marginBottom","marginLeft"],outline:["outlineColor","outlineStyle","outlineWidth"],padding:["paddingTop","paddingRight","paddingBottom","paddingLeft"]},i=document.createElementNS("http://www.w3.org/1999/xhtml","div"),j={thin:"1px",medium:"3px",thick:"5px"},k={borderBottomWidth:j,borderLeftWidth:j,borderRightWidth:j,borderTopWidth:j,fontSize:{"xx-small":"60%","x-small":"75%",small:"89%",medium:"100%",large:"120%","x-large":"150%","xx-large":"200%"},fontWeight:{normal:"400",bold:"700"},outlineWidth:j,textShadow:{none:"0px 0px 0px transparent"},boxShadow:{none:"0px 0px 0px 0px transparent"}};a.convertToArrayForm=f,a.normalizeKeyframes=g}(a),function(a){var b={};a.isDeprecated=function(a,c,d,e){var f=e?"are":"is",g=new Date,h=new Date(c);return h.setMonth(h.getMonth()+3),!(g=a.applyFrom&&cthis._surrogateStyle.length;)this._length--,Object.defineProperty(this,this._length,{configurable:!0,enumerable:!1,value:void 0})},_set:function(b,c){this._style[b]=c,this._isAnimatedProperty[b]=!0,this._updateSvgTransformAttr&&"transform"==a.unprefixedPropertyName(b)&&(null==this._savedTransformAttr&&(this._savedTransformAttr=this._element.getAttribute("transform")),this._element.setAttribute("transform",a.transformToSvgMatrix(c)))},_clear:function(b){this._style[b]=this._surrogateStyle[b],this._updateSvgTransformAttr&&"transform"==a.unprefixedPropertyName(b)&&(this._savedTransformAttr?this._element.setAttribute("transform",this._savedTransformAttr):this._element.removeAttribute("transform"),this._savedTransformAttr=null),delete this._isAnimatedProperty[b]}};for(var k in i)e.prototype[k]=function(a,b){return function(){var c=this._surrogateStyle[a].apply(this._surrogateStyle,arguments);return b&&(this._isAnimatedProperty[arguments[0]]||this._style[a].apply(this._style,arguments),this._updateIndices()),c}}(k,k in j);for(var l in document.documentElement.style)l in h||l in i||function(a){d(e.prototype,a,{get:function(){return this._surrogateStyle[a]},set:function(b){this._surrogateStyle[a]=b,this._updateIndices(),this._isAnimatedProperty[a]||(this._style[a]=b)}})}(l);a.apply=function(b,c,d){f(b),b.style._set(a.propertyName(c),d)},a.clear=function(b,c){b._webAnimationsPatchedStyle&&b.style._clear(a.propertyName(c))}}(b),function(a){window.Element.prototype.animate=function(b,c){var d="";return c&&c.id&&(d=c.id),a.timeline._play(a.KeyframeEffect(this,b,c,d))}}(b),function(a,b){function c(a,b,d){if("number"==typeof a&&"number"==typeof b)return a*(1-d)+b*d;if("boolean"==typeof a&&"boolean"==typeof b)return d<.5?a:b;if(a.length==b.length){for(var e=[],f=0;f0?this._totalDuration:0),this._ensureAlive())},get currentTime(){return this._idle||this._currentTimePending?null:this._currentTime},set currentTime(a){a=+a,isNaN(a)||(b.restart(),this._paused||null==this._startTime||(this._startTime=this._timeline.currentTime-a/this._playbackRate),this._currentTimePending=!1,this._currentTime!=a&&(this._idle&&(this._idle=!1,this._paused=!0),this._tickCurrentTime(a,!0),b.applyDirtiedAnimation(this)))},get startTime(){return this._startTime},set startTime(a){a=+a,isNaN(a)||this._paused||this._idle||(this._startTime=a,this._tickCurrentTime((this._timeline.currentTime-this._startTime)*this.playbackRate),b.applyDirtiedAnimation(this))},get playbackRate(){return this._playbackRate},set playbackRate(a){if(a!=this._playbackRate){var c=this.currentTime;this._playbackRate=a,this._startTime=null,"paused"!=this.playState&&"idle"!=this.playState&&(this._finishedFlag=!1,this._idle=!1,this._ensureAlive(),b.applyDirtiedAnimation(this)),null!=c&&(this.currentTime=c)}},get _isFinished(){return!this._idle&&(this._playbackRate>0&&this._currentTime>=this._totalDuration||this._playbackRate<0&&this._currentTime<=0)},get _totalDuration(){return this._effect._totalDuration},get playState(){return this._idle?"idle":null==this._startTime&&!this._paused&&0!=this.playbackRate||this._currentTimePending?"pending":this._paused?"paused":this._isFinished?"finished":"running"},_rewind:function(){if(this._playbackRate>=0)this._currentTime=0;else{if(!(this._totalDuration<1/0))throw new DOMException("Unable to rewind negative playback rate animation with infinite duration","InvalidStateError");this._currentTime=this._totalDuration}},play:function(){this._paused=!1,(this._isFinished||this._idle)&&(this._rewind(),this._startTime=null),this._finishedFlag=!1,this._idle=!1,this._ensureAlive(),b.applyDirtiedAnimation(this)},pause:function(){this._isFinished||this._paused||this._idle?this._idle&&(this._rewind(),this._idle=!1):this._currentTimePending=!0,this._startTime=null,this._paused=!0},finish:function(){this._idle||(this.currentTime=this._playbackRate>0?this._totalDuration:0,this._startTime=this._totalDuration-this.currentTime,this._currentTimePending=!1,b.applyDirtiedAnimation(this))},cancel:function(){this._inEffect&&(this._inEffect=!1,this._idle=!0,this._paused=!1,this._finishedFlag=!0,this._currentTime=0,this._startTime=null,this._effect._update(null),b.applyDirtiedAnimation(this))},reverse:function(){this.playbackRate*=-1,this.play()},addEventListener:function(a,b){"function"==typeof b&&"finish"==a&&this._finishHandlers.push(b)},removeEventListener:function(a,b){if("finish"==a){var c=this._finishHandlers.indexOf(b);c>=0&&this._finishHandlers.splice(c,1)}},_fireEvents:function(a){if(this._isFinished){if(!this._finishedFlag){var b=new d(this,this._currentTime,a),c=this._finishHandlers.concat(this.onfinish?[this.onfinish]:[]);setTimeout(function(){c.forEach(function(a){a.call(b.target,b)})},0),this._finishedFlag=!0}}else this._finishedFlag=!1},_tick:function(a,b){this._idle||this._paused||(null==this._startTime?b&&(this.startTime=a-this._currentTime/this.playbackRate):this._isFinished||this._tickCurrentTime((a-this._startTime)*this.playbackRate)),b&&(this._currentTimePending=!1,this._fireEvents(a))},get _needsTick(){return this.playState in{pending:1,running:1}||!this._finishedFlag},_targetAnimations:function(){var a=this._effect._target;return a._activeAnimations||(a._activeAnimations=[]),a._activeAnimations},_markTarget:function(){var a=this._targetAnimations();-1===a.indexOf(this)&&a.push(this)},_unmarkTarget:function(){var a=this._targetAnimations(),b=a.indexOf(this);-1!==b&&a.splice(b,1)}}}(a,b),function(a,b,c){function d(a){var b=j;j=[],a1e-4?(u=.5/Math.sqrt(w),v=[(q[2][1]-q[1][2])*u,(q[0][2]-q[2][0])*u,(q[1][0]-q[0][1])*u,.25/u]):q[0][0]>q[1][1]&&q[0][0]>q[2][2]?(u=2*Math.sqrt(1+q[0][0]-q[1][1]-q[2][2]),v=[.25*u,(q[0][1]+q[1][0])/u,(q[0][2]+q[2][0])/u,(q[2][1]-q[1][2])/u]):q[1][1]>q[2][2]?(u=2*Math.sqrt(1+q[1][1]-q[0][0]-q[2][2]),v=[(q[0][1]+q[1][0])/u,.25*u,(q[1][2]+q[2][1])/u,(q[0][2]-q[2][0])/u]):(u=2*Math.sqrt(1+q[2][2]-q[0][0]-q[1][1]),v=[(q[0][2]+q[2][0])/u,(q[1][2]+q[2][1])/u,.25*u,(q[1][0]-q[0][1])/u]),[p,r,s,v,n]}return j}();a.dot=c,a.makeMatrixDecomposition=h,a.transformListToMatrix=g}(b),function(a){function b(a,b){var c=a.exec(b);if(c)return c=a.ignoreCase?c[0].toLowerCase():c[0],[c,b.substr(c.length)]}function c(a,b){b=b.replace(/^\s*/,"");var c=a(b);if(c)return[c[0],c[1].replace(/^\s*/,"")]}function d(a,d,e){a=c.bind(null,a);for(var f=[];;){var g=a(e);if(!g)return[f,e];if(f.push(g[0]),e=g[1],!(g=b(d,e))||""==g[1])return[f,e];e=g[1]}}function e(a,b){for(var c=0,d=0;dd?c%=d:d%=c;return c=a*b/(c+d)}function g(a){return function(b){var c=a(b);return c&&(c[0]=void 0),c}}function h(a,b){return function(c){return a(c)||[b,c]}}function i(b,c){for(var d=[],e=0;e=1?b:"visible"}]}a.addPropertiesHandler(String,c,["visibility"])}(b),function(a,b){function c(a){a=a.trim(),f.fillStyle="#000",f.fillStyle=a;var b=f.fillStyle;if(f.fillStyle="#fff",f.fillStyle=a,b==f.fillStyle){f.fillRect(0,0,1,1);var c=f.getImageData(0,0,1,1).data;f.clearRect(0,0,1,1);var d=c[3]/255;return[c[0]*d,c[1]*d,c[2]*d,d]}}function d(b,c){return[b,c,function(b){function c(a){return Math.max(0,Math.min(255,a))}if(b[3])for(var d=0;d<3;d++)b[d]=Math.round(c(b[d]/b[3]));return b[3]=a.numberToString(a.clamp(0,1,b[3])),"rgba("+b.join(",")+")"}]}var e=document.createElementNS("http://www.w3.org/1999/xhtml","canvas");e.width=e.height=1;var f=e.getContext("2d");a.addPropertiesHandler(c,d,["background-color","border-bottom-color","border-left-color","border-right-color","border-top-color","color","fill","flood-color","lighting-color","outline-color","stop-color","stroke","text-decoration-color"]),a.consumeColor=a.consumeParenthesised.bind(null,c),a.mergeColors=d}(b),function(a,b){function c(a){function b(){var b=h.exec(a);g=b?b[0]:void 0}function c(){var a=Number(g);return b(),a}function d(){if("("!==g)return c();b();var a=f();return")"!==g?NaN:(b(),a)}function e(){for(var a=d();"*"===g||"/"===g;){var c=g;b();var e=d();"*"===c?a*=e:a/=e}return a}function f(){for(var a=e();"+"===g||"-"===g;){var c=g;b();var d=e();"+"===c?a+=d:a-=d}return a}var g,h=/([\+\-\w\.]+|[\(\)\*\/])/g;return b(),f()}function d(a,b){if("0"==(b=b.trim().toLowerCase())&&"px".search(a)>=0)return{px:0};if(/^[^(]*$|^calc/.test(b)){b=b.replace(/calc\(/g,"(");var d={};b=b.replace(a,function(a){return d[a]=null,"U"+a});for(var e="U("+a.source+")",f=b.replace(/[-+]?(\d*\.)?\d+([Ee][-+]?\d+)?/g,"N").replace(new RegExp("N"+e,"g"),"D").replace(/\s[+-]\s/g,"O").replace(/\s/g,""),g=[/N\*(D)/g,/(N|D)[*\/]N/g,/(N|D)O\1/g,/\((N|D)\)/g],h=0;h1?"calc("+c+")":c}]}var g="px|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc",h=d.bind(null,new RegExp(g,"g")),i=d.bind(null,new RegExp(g+"|%","g")),j=d.bind(null,/deg|rad|grad|turn/g);a.parseLength=h,a.parseLengthOrPercent=i,a.consumeLengthOrPercent=a.consumeParenthesised.bind(null,i),a.parseAngle=j,a.mergeDimensions=f;var k=a.consumeParenthesised.bind(null,h),l=a.consumeRepeated.bind(void 0,k,/^/),m=a.consumeRepeated.bind(void 0,l,/^,/);a.consumeSizePairList=m;var n=function(a){var b=m(a);if(b&&""==b[1])return b[0]},o=a.mergeNestedRepeated.bind(void 0,e," "),p=a.mergeNestedRepeated.bind(void 0,o,",");a.mergeNonNegativeSizePair=o,a.addPropertiesHandler(n,p,["background-size"]),a.addPropertiesHandler(i,e,["border-bottom-width","border-image-width","border-left-width","border-right-width","border-top-width","flex-basis","font-size","height","line-height","max-height","max-width","outline-width","width"]),a.addPropertiesHandler(i,f,["border-bottom-left-radius","border-bottom-right-radius","border-top-left-radius","border-top-right-radius","bottom","left","letter-spacing","margin-bottom","margin-left","margin-right","margin-top","min-height","min-width","outline-offset","padding-bottom","padding-left","padding-right","padding-top","perspective","right","shape-margin","stroke-dashoffset","text-indent","top","vertical-align","word-spacing"])}(b),function(a,b){function c(b){return a.consumeLengthOrPercent(b)||a.consumeToken(/^auto/,b)}function d(b){var d=a.consumeList([a.ignore(a.consumeToken.bind(null,/^rect/)),a.ignore(a.consumeToken.bind(null,/^\(/)),a.consumeRepeated.bind(null,c,/^,/),a.ignore(a.consumeToken.bind(null,/^\)/))],b);if(d&&4==d[0].length)return d[0]}function e(b,c){return"auto"==b||"auto"==c?[!0,!1,function(d){var e=d?b:c;if("auto"==e)return"auto";var f=a.mergeDimensions(e,e);return f[2](f[0])}]:a.mergeDimensions(b,c)}function f(a){return"rect("+a+")"}var g=a.mergeWrappedNestedRepeated.bind(null,f,e,", ");a.parseBox=d,a.mergeBoxes=g,a.addPropertiesHandler(d,g,["clip"])}(b),function(a,b){function c(a){return function(b){var c=0;return a.map(function(a){return a===k?b[c++]:a})}}function d(a){return a}function e(b){if("none"==(b=b.toLowerCase().trim()))return[];for(var c,d=/\s*(\w+)\(([^)]*)\)/g,e=[],f=0;c=d.exec(b);){if(c.index!=f)return;f=c.index+c[0].length;var g=c[1],h=n[g];if(!h)return;var i=c[2].split(","),j=h[0];if(j.length900||b%100!=0))return b}function c(b){return b=100*Math.round(b/100),b=a.clamp(100,900,b),400===b?"normal":700===b?"bold":String(b)}function d(a,b){return[a,b,c]}a.addPropertiesHandler(b,d,["font-weight"])}(b),function(a){function b(a){var b={};for(var c in a)b[c]=-a[c];return b}function c(b){return a.consumeToken(/^(left|center|right|top|bottom)\b/i,b)||a.consumeLengthOrPercent(b)}function d(b,d){var e=a.consumeRepeated(c,/^/,d);if(e&&""==e[1]){var f=e[0];if(f[0]=f[0]||"center",f[1]=f[1]||"center",3==b&&(f[2]=f[2]||{px:0}),f.length==b){if(/top|bottom/.test(f[0])||/left|right/.test(f[1])){var h=f[0];f[0]=f[1],f[1]=h}if(/left|right|center|Object/.test(f[0])&&/top|bottom|center|Object/.test(f[1]))return f.map(function(a){return"object"==typeof a?a:g[a]})}}}function e(d){var e=a.consumeRepeated(c,/^/,d);if(e){for(var f=e[0],h=[{"%":50},{"%":50}],i=0,j=!1,k=0;k=0&&this._cancelHandlers.splice(c,1)}else i.call(this,a,b)},f}}}(),function(a){var b=document.documentElement,c=null,d=!1;try{var e=getComputedStyle(b).getPropertyValue("opacity"),f="0"==e?"1":"0";c=b.animate({opacity:[f,f]},{duration:1}),c.currentTime=0,d=getComputedStyle(b).getPropertyValue("opacity")==f}catch(a){}finally{c&&c.cancel()}if(!d){var g=window.Element.prototype.animate;window.Element.prototype.animate=function(b,c){return window.Symbol&&Symbol.iterator&&Array.prototype.from&&b[Symbol.iterator]&&(b=Array.from(b)),Array.isArray(b)||null===b||(b=a.convertToArrayForm(b)),g.call(this,b,c)}}}(a)}();
+//# sourceMappingURL=web-animations.min.js.map
+
+/***/ }),
+
+/***/ "./node_modules/webpack/buildin/global.js":
+/*!***********************************!*\
+ !*** (webpack)/buildin/global.js ***!
+ \***********************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+var g;
+
+// This works in non-strict mode
+g = (function() {
+ return this;
+})();
+
+try {
+ // This works if eval is allowed (see CSP)
+ g = g || new Function("return this")();
+} catch (e) {
+ // This works if the window reference is available
+ if (typeof window === "object") g = window;
+}
+
+// g can still be undefined, but nothing to do about it...
+// We return undefined, instead of nothing here, so it's
+// easier to handle this case. if(!global) { ...}
+
+module.exports = g;
+
+
+/***/ }),
+
+/***/ "./node_modules/zone.js/dist/zone.js":
+/*!*******************************************!*\
+ !*** ./node_modules/zone.js/dist/zone.js ***!
+ \*******************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+/* WEBPACK VAR INJECTION */(function(global) {var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;
+/**
+ * @license Angular v12.0.0-next.0
+ * (c) 2010-2020 Google LLC. https://angular.io/
+ * License: MIT
+ */
+(function (factory) {
+ true ? !(__WEBPACK_AMD_DEFINE_FACTORY__ = (factory),
+ __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
+ (__WEBPACK_AMD_DEFINE_FACTORY__.call(exports, __webpack_require__, exports, module)) :
+ __WEBPACK_AMD_DEFINE_FACTORY__),
+ __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) :
+ undefined;
+}((function () {
+ 'use strict';
+ /**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+ var Zone$1 = (function (global) {
+ var performance = global['performance'];
+ function mark(name) {
+ performance && performance['mark'] && performance['mark'](name);
+ }
+ function performanceMeasure(name, label) {
+ performance && performance['measure'] && performance['measure'](name, label);
+ }
+ mark('Zone');
+ // Initialize before it's accessed below.
+ // __Zone_symbol_prefix global can be used to override the default zone
+ // symbol prefix with a custom one if needed.
+ var symbolPrefix = global['__Zone_symbol_prefix'] || '__zone_symbol__';
+ function __symbol__(name) {
+ return symbolPrefix + name;
+ }
+ var checkDuplicate = global[__symbol__('forceDuplicateZoneCheck')] === true;
+ if (global['Zone']) {
+ // if global['Zone'] already exists (maybe zone.js was already loaded or
+ // some other lib also registered a global object named Zone), we may need
+ // to throw an error, but sometimes user may not want this error.
+ // For example,
+ // we have two web pages, page1 includes zone.js, page2 doesn't.
+ // and the 1st time user load page1 and page2, everything work fine,
+ // but when user load page2 again, error occurs because global['Zone'] already exists.
+ // so we add a flag to let user choose whether to throw this error or not.
+ // By default, if existing Zone is from zone.js, we will not throw the error.
+ if (checkDuplicate || typeof global['Zone'].__symbol__ !== 'function') {
+ throw new Error('Zone already loaded.');
+ }
+ else {
+ return global['Zone'];
+ }
+ }
+ var Zone = /** @class */ (function () {
+ function Zone(parent, zoneSpec) {
+ this._parent = parent;
+ this._name = zoneSpec ? zoneSpec.name || 'unnamed' : '';
+ this._properties = zoneSpec && zoneSpec.properties || {};
+ this._zoneDelegate =
+ new ZoneDelegate(this, this._parent && this._parent._zoneDelegate, zoneSpec);
+ }
+ Zone.assertZonePatched = function () {
+ if (global['Promise'] !== patches['ZoneAwarePromise']) {
+ throw new Error('Zone.js has detected that ZoneAwarePromise `(window|global).Promise` ' +
+ 'has been overwritten.\n' +
+ 'Most likely cause is that a Promise polyfill has been loaded ' +
+ 'after Zone.js (Polyfilling Promise api is not necessary when zone.js is loaded. ' +
+ 'If you must load one, do so before loading zone.js.)');
+ }
+ };
+ Object.defineProperty(Zone, "root", {
+ get: function () {
+ var zone = Zone.current;
+ while (zone.parent) {
+ zone = zone.parent;
+ }
+ return zone;
+ },
+ enumerable: false,
+ configurable: true
+ });
+ Object.defineProperty(Zone, "current", {
+ get: function () {
+ return _currentZoneFrame.zone;
+ },
+ enumerable: false,
+ configurable: true
+ });
+ Object.defineProperty(Zone, "currentTask", {
+ get: function () {
+ return _currentTask;
+ },
+ enumerable: false,
+ configurable: true
+ });
+ // tslint:disable-next-line:require-internal-with-underscore
+ Zone.__load_patch = function (name, fn, ignoreDuplicate) {
+ if (ignoreDuplicate === void 0) { ignoreDuplicate = false; }
+ if (patches.hasOwnProperty(name)) {
+ // `checkDuplicate` option is defined from global variable
+ // so it works for all modules.
+ // `ignoreDuplicate` can work for the specified module
+ if (!ignoreDuplicate && checkDuplicate) {
+ throw Error('Already loaded patch: ' + name);
+ }
+ }
+ else if (!global['__Zone_disable_' + name]) {
+ var perfName = 'Zone:' + name;
+ mark(perfName);
+ patches[name] = fn(global, Zone, _api);
+ performanceMeasure(perfName, perfName);
+ }
+ };
+ Object.defineProperty(Zone.prototype, "parent", {
+ get: function () {
+ return this._parent;
+ },
+ enumerable: false,
+ configurable: true
+ });
+ Object.defineProperty(Zone.prototype, "name", {
+ get: function () {
+ return this._name;
+ },
+ enumerable: false,
+ configurable: true
+ });
+ Zone.prototype.get = function (key) {
+ var zone = this.getZoneWith(key);
+ if (zone)
+ return zone._properties[key];
+ };
+ Zone.prototype.getZoneWith = function (key) {
+ var current = this;
+ while (current) {
+ if (current._properties.hasOwnProperty(key)) {
+ return current;
+ }
+ current = current._parent;
+ }
+ return null;
+ };
+ Zone.prototype.fork = function (zoneSpec) {
+ if (!zoneSpec)
+ throw new Error('ZoneSpec required!');
+ return this._zoneDelegate.fork(this, zoneSpec);
+ };
+ Zone.prototype.wrap = function (callback, source) {
+ if (typeof callback !== 'function') {
+ throw new Error('Expecting function got: ' + callback);
+ }
+ var _callback = this._zoneDelegate.intercept(this, callback, source);
+ var zone = this;
+ return function () {
+ return zone.runGuarded(_callback, this, arguments, source);
+ };
+ };
+ Zone.prototype.run = function (callback, applyThis, applyArgs, source) {
+ _currentZoneFrame = { parent: _currentZoneFrame, zone: this };
+ try {
+ return this._zoneDelegate.invoke(this, callback, applyThis, applyArgs, source);
+ }
+ finally {
+ _currentZoneFrame = _currentZoneFrame.parent;
+ }
+ };
+ Zone.prototype.runGuarded = function (callback, applyThis, applyArgs, source) {
+ if (applyThis === void 0) { applyThis = null; }
+ _currentZoneFrame = { parent: _currentZoneFrame, zone: this };
+ try {
+ try {
+ return this._zoneDelegate.invoke(this, callback, applyThis, applyArgs, source);
+ }
+ catch (error) {
+ if (this._zoneDelegate.handleError(this, error)) {
+ throw error;
+ }
+ }
+ }
+ finally {
+ _currentZoneFrame = _currentZoneFrame.parent;
+ }
+ };
+ Zone.prototype.runTask = function (task, applyThis, applyArgs) {
+ if (task.zone != this) {
+ throw new Error('A task can only be run in the zone of creation! (Creation: ' +
+ (task.zone || NO_ZONE).name + '; Execution: ' + this.name + ')');
+ }
+ // https://github.com/angular/zone.js/issues/778, sometimes eventTask
+ // will run in notScheduled(canceled) state, we should not try to
+ // run such kind of task but just return
+ if (task.state === notScheduled && (task.type === eventTask || task.type === macroTask)) {
+ return;
+ }
+ var reEntryGuard = task.state != running;
+ reEntryGuard && task._transitionTo(running, scheduled);
+ task.runCount++;
+ var previousTask = _currentTask;
+ _currentTask = task;
+ _currentZoneFrame = { parent: _currentZoneFrame, zone: this };
+ try {
+ if (task.type == macroTask && task.data && !task.data.isPeriodic) {
+ task.cancelFn = undefined;
+ }
+ try {
+ return this._zoneDelegate.invokeTask(this, task, applyThis, applyArgs);
+ }
+ catch (error) {
+ if (this._zoneDelegate.handleError(this, error)) {
+ throw error;
+ }
+ }
+ }
+ finally {
+ // if the task's state is notScheduled or unknown, then it has already been cancelled
+ // we should not reset the state to scheduled
+ if (task.state !== notScheduled && task.state !== unknown) {
+ if (task.type == eventTask || (task.data && task.data.isPeriodic)) {
+ reEntryGuard && task._transitionTo(scheduled, running);
+ }
+ else {
+ task.runCount = 0;
+ this._updateTaskCount(task, -1);
+ reEntryGuard &&
+ task._transitionTo(notScheduled, running, notScheduled);
+ }
+ }
+ _currentZoneFrame = _currentZoneFrame.parent;
+ _currentTask = previousTask;
+ }
+ };
+ Zone.prototype.scheduleTask = function (task) {
+ if (task.zone && task.zone !== this) {
+ // check if the task was rescheduled, the newZone
+ // should not be the children of the original zone
+ var newZone = this;
+ while (newZone) {
+ if (newZone === task.zone) {
+ throw Error("can not reschedule task to " + this.name + " which is descendants of the original zone " + task.zone.name);
+ }
+ newZone = newZone.parent;
+ }
+ }
+ task._transitionTo(scheduling, notScheduled);
+ var zoneDelegates = [];
+ task._zoneDelegates = zoneDelegates;
+ task._zone = this;
+ try {
+ task = this._zoneDelegate.scheduleTask(this, task);
+ }
+ catch (err) {
+ // should set task's state to unknown when scheduleTask throw error
+ // because the err may from reschedule, so the fromState maybe notScheduled
+ task._transitionTo(unknown, scheduling, notScheduled);
+ // TODO: @JiaLiPassion, should we check the result from handleError?
+ this._zoneDelegate.handleError(this, err);
+ throw err;
+ }
+ if (task._zoneDelegates === zoneDelegates) {
+ // we have to check because internally the delegate can reschedule the task.
+ this._updateTaskCount(task, 1);
+ }
+ if (task.state == scheduling) {
+ task._transitionTo(scheduled, scheduling);
+ }
+ return task;
+ };
+ Zone.prototype.scheduleMicroTask = function (source, callback, data, customSchedule) {
+ return this.scheduleTask(new ZoneTask(microTask, source, callback, data, customSchedule, undefined));
+ };
+ Zone.prototype.scheduleMacroTask = function (source, callback, data, customSchedule, customCancel) {
+ return this.scheduleTask(new ZoneTask(macroTask, source, callback, data, customSchedule, customCancel));
+ };
+ Zone.prototype.scheduleEventTask = function (source, callback, data, customSchedule, customCancel) {
+ return this.scheduleTask(new ZoneTask(eventTask, source, callback, data, customSchedule, customCancel));
+ };
+ Zone.prototype.cancelTask = function (task) {
+ if (task.zone != this)
+ throw new Error('A task can only be cancelled in the zone of creation! (Creation: ' +
+ (task.zone || NO_ZONE).name + '; Execution: ' + this.name + ')');
+ task._transitionTo(canceling, scheduled, running);
+ try {
+ this._zoneDelegate.cancelTask(this, task);
+ }
+ catch (err) {
+ // if error occurs when cancelTask, transit the state to unknown
+ task._transitionTo(unknown, canceling);
+ this._zoneDelegate.handleError(this, err);
+ throw err;
+ }
+ this._updateTaskCount(task, -1);
+ task._transitionTo(notScheduled, canceling);
+ task.runCount = 0;
+ return task;
+ };
+ Zone.prototype._updateTaskCount = function (task, count) {
+ var zoneDelegates = task._zoneDelegates;
+ if (count == -1) {
+ task._zoneDelegates = null;
+ }
+ for (var i = 0; i < zoneDelegates.length; i++) {
+ zoneDelegates[i]._updateTaskCount(task.type, count);
+ }
+ };
+ return Zone;
+ }());
+ // tslint:disable-next-line:require-internal-with-underscore
+ Zone.__symbol__ = __symbol__;
+ var DELEGATE_ZS = {
+ name: '',
+ onHasTask: function (delegate, _, target, hasTaskState) { return delegate.hasTask(target, hasTaskState); },
+ onScheduleTask: function (delegate, _, target, task) { return delegate.scheduleTask(target, task); },
+ onInvokeTask: function (delegate, _, target, task, applyThis, applyArgs) { return delegate.invokeTask(target, task, applyThis, applyArgs); },
+ onCancelTask: function (delegate, _, target, task) { return delegate.cancelTask(target, task); }
+ };
+ var ZoneDelegate = /** @class */ (function () {
+ function ZoneDelegate(zone, parentDelegate, zoneSpec) {
+ this._taskCounts = { 'microTask': 0, 'macroTask': 0, 'eventTask': 0 };
+ this.zone = zone;
+ this._parentDelegate = parentDelegate;
+ this._forkZS = zoneSpec && (zoneSpec && zoneSpec.onFork ? zoneSpec : parentDelegate._forkZS);
+ this._forkDlgt = zoneSpec && (zoneSpec.onFork ? parentDelegate : parentDelegate._forkDlgt);
+ this._forkCurrZone =
+ zoneSpec && (zoneSpec.onFork ? this.zone : parentDelegate._forkCurrZone);
+ this._interceptZS =
+ zoneSpec && (zoneSpec.onIntercept ? zoneSpec : parentDelegate._interceptZS);
+ this._interceptDlgt =
+ zoneSpec && (zoneSpec.onIntercept ? parentDelegate : parentDelegate._interceptDlgt);
+ this._interceptCurrZone =
+ zoneSpec && (zoneSpec.onIntercept ? this.zone : parentDelegate._interceptCurrZone);
+ this._invokeZS = zoneSpec && (zoneSpec.onInvoke ? zoneSpec : parentDelegate._invokeZS);
+ this._invokeDlgt =
+ zoneSpec && (zoneSpec.onInvoke ? parentDelegate : parentDelegate._invokeDlgt);
+ this._invokeCurrZone =
+ zoneSpec && (zoneSpec.onInvoke ? this.zone : parentDelegate._invokeCurrZone);
+ this._handleErrorZS =
+ zoneSpec && (zoneSpec.onHandleError ? zoneSpec : parentDelegate._handleErrorZS);
+ this._handleErrorDlgt =
+ zoneSpec && (zoneSpec.onHandleError ? parentDelegate : parentDelegate._handleErrorDlgt);
+ this._handleErrorCurrZone =
+ zoneSpec && (zoneSpec.onHandleError ? this.zone : parentDelegate._handleErrorCurrZone);
+ this._scheduleTaskZS =
+ zoneSpec && (zoneSpec.onScheduleTask ? zoneSpec : parentDelegate._scheduleTaskZS);
+ this._scheduleTaskDlgt = zoneSpec &&
+ (zoneSpec.onScheduleTask ? parentDelegate : parentDelegate._scheduleTaskDlgt);
+ this._scheduleTaskCurrZone =
+ zoneSpec && (zoneSpec.onScheduleTask ? this.zone : parentDelegate._scheduleTaskCurrZone);
+ this._invokeTaskZS =
+ zoneSpec && (zoneSpec.onInvokeTask ? zoneSpec : parentDelegate._invokeTaskZS);
+ this._invokeTaskDlgt =
+ zoneSpec && (zoneSpec.onInvokeTask ? parentDelegate : parentDelegate._invokeTaskDlgt);
+ this._invokeTaskCurrZone =
+ zoneSpec && (zoneSpec.onInvokeTask ? this.zone : parentDelegate._invokeTaskCurrZone);
+ this._cancelTaskZS =
+ zoneSpec && (zoneSpec.onCancelTask ? zoneSpec : parentDelegate._cancelTaskZS);
+ this._cancelTaskDlgt =
+ zoneSpec && (zoneSpec.onCancelTask ? parentDelegate : parentDelegate._cancelTaskDlgt);
+ this._cancelTaskCurrZone =
+ zoneSpec && (zoneSpec.onCancelTask ? this.zone : parentDelegate._cancelTaskCurrZone);
+ this._hasTaskZS = null;
+ this._hasTaskDlgt = null;
+ this._hasTaskDlgtOwner = null;
+ this._hasTaskCurrZone = null;
+ var zoneSpecHasTask = zoneSpec && zoneSpec.onHasTask;
+ var parentHasTask = parentDelegate && parentDelegate._hasTaskZS;
+ if (zoneSpecHasTask || parentHasTask) {
+ // If we need to report hasTask, than this ZS needs to do ref counting on tasks. In such
+ // a case all task related interceptors must go through this ZD. We can't short circuit it.
+ this._hasTaskZS = zoneSpecHasTask ? zoneSpec : DELEGATE_ZS;
+ this._hasTaskDlgt = parentDelegate;
+ this._hasTaskDlgtOwner = this;
+ this._hasTaskCurrZone = zone;
+ if (!zoneSpec.onScheduleTask) {
+ this._scheduleTaskZS = DELEGATE_ZS;
+ this._scheduleTaskDlgt = parentDelegate;
+ this._scheduleTaskCurrZone = this.zone;
+ }
+ if (!zoneSpec.onInvokeTask) {
+ this._invokeTaskZS = DELEGATE_ZS;
+ this._invokeTaskDlgt = parentDelegate;
+ this._invokeTaskCurrZone = this.zone;
+ }
+ if (!zoneSpec.onCancelTask) {
+ this._cancelTaskZS = DELEGATE_ZS;
+ this._cancelTaskDlgt = parentDelegate;
+ this._cancelTaskCurrZone = this.zone;
+ }
+ }
+ }
+ ZoneDelegate.prototype.fork = function (targetZone, zoneSpec) {
+ return this._forkZS ? this._forkZS.onFork(this._forkDlgt, this.zone, targetZone, zoneSpec) :
+ new Zone(targetZone, zoneSpec);
+ };
+ ZoneDelegate.prototype.intercept = function (targetZone, callback, source) {
+ return this._interceptZS ?
+ this._interceptZS.onIntercept(this._interceptDlgt, this._interceptCurrZone, targetZone, callback, source) :
+ callback;
+ };
+ ZoneDelegate.prototype.invoke = function (targetZone, callback, applyThis, applyArgs, source) {
+ return this._invokeZS ? this._invokeZS.onInvoke(this._invokeDlgt, this._invokeCurrZone, targetZone, callback, applyThis, applyArgs, source) :
+ callback.apply(applyThis, applyArgs);
+ };
+ ZoneDelegate.prototype.handleError = function (targetZone, error) {
+ return this._handleErrorZS ?
+ this._handleErrorZS.onHandleError(this._handleErrorDlgt, this._handleErrorCurrZone, targetZone, error) :
+ true;
+ };
+ ZoneDelegate.prototype.scheduleTask = function (targetZone, task) {
+ var returnTask = task;
+ if (this._scheduleTaskZS) {
+ if (this._hasTaskZS) {
+ returnTask._zoneDelegates.push(this._hasTaskDlgtOwner);
+ }
+ // clang-format off
+ returnTask = this._scheduleTaskZS.onScheduleTask(this._scheduleTaskDlgt, this._scheduleTaskCurrZone, targetZone, task);
+ // clang-format on
+ if (!returnTask)
+ returnTask = task;
+ }
+ else {
+ if (task.scheduleFn) {
+ task.scheduleFn(task);
+ }
+ else if (task.type == microTask) {
+ scheduleMicroTask(task);
+ }
+ else {
+ throw new Error('Task is missing scheduleFn.');
+ }
+ }
+ return returnTask;
+ };
+ ZoneDelegate.prototype.invokeTask = function (targetZone, task, applyThis, applyArgs) {
+ return this._invokeTaskZS ? this._invokeTaskZS.onInvokeTask(this._invokeTaskDlgt, this._invokeTaskCurrZone, targetZone, task, applyThis, applyArgs) :
+ task.callback.apply(applyThis, applyArgs);
+ };
+ ZoneDelegate.prototype.cancelTask = function (targetZone, task) {
+ var value;
+ if (this._cancelTaskZS) {
+ value = this._cancelTaskZS.onCancelTask(this._cancelTaskDlgt, this._cancelTaskCurrZone, targetZone, task);
+ }
+ else {
+ if (!task.cancelFn) {
+ throw Error('Task is not cancelable');
+ }
+ value = task.cancelFn(task);
+ }
+ return value;
+ };
+ ZoneDelegate.prototype.hasTask = function (targetZone, isEmpty) {
+ // hasTask should not throw error so other ZoneDelegate
+ // can still trigger hasTask callback
+ try {
+ this._hasTaskZS &&
+ this._hasTaskZS.onHasTask(this._hasTaskDlgt, this._hasTaskCurrZone, targetZone, isEmpty);
+ }
+ catch (err) {
+ this.handleError(targetZone, err);
+ }
+ };
+ // tslint:disable-next-line:require-internal-with-underscore
+ ZoneDelegate.prototype._updateTaskCount = function (type, count) {
+ var counts = this._taskCounts;
+ var prev = counts[type];
+ var next = counts[type] = prev + count;
+ if (next < 0) {
+ throw new Error('More tasks executed then were scheduled.');
+ }
+ if (prev == 0 || next == 0) {
+ var isEmpty = {
+ microTask: counts['microTask'] > 0,
+ macroTask: counts['macroTask'] > 0,
+ eventTask: counts['eventTask'] > 0,
+ change: type
+ };
+ this.hasTask(this.zone, isEmpty);
+ }
+ };
+ return ZoneDelegate;
+ }());
+ var ZoneTask = /** @class */ (function () {
+ function ZoneTask(type, source, callback, options, scheduleFn, cancelFn) {
+ // tslint:disable-next-line:require-internal-with-underscore
+ this._zone = null;
+ this.runCount = 0;
+ // tslint:disable-next-line:require-internal-with-underscore
+ this._zoneDelegates = null;
+ // tslint:disable-next-line:require-internal-with-underscore
+ this._state = 'notScheduled';
+ this.type = type;
+ this.source = source;
+ this.data = options;
+ this.scheduleFn = scheduleFn;
+ this.cancelFn = cancelFn;
+ if (!callback) {
+ throw new Error('callback is not defined');
+ }
+ this.callback = callback;
+ var self = this;
+ // TODO: @JiaLiPassion options should have interface
+ if (type === eventTask && options && options.useG) {
+ this.invoke = ZoneTask.invokeTask;
+ }
+ else {
+ this.invoke = function () {
+ return ZoneTask.invokeTask.call(global, self, this, arguments);
+ };
+ }
+ }
+ ZoneTask.invokeTask = function (task, target, args) {
+ if (!task) {
+ task = this;
+ }
+ _numberOfNestedTaskFrames++;
+ try {
+ task.runCount++;
+ return task.zone.runTask(task, target, args);
+ }
+ finally {
+ if (_numberOfNestedTaskFrames == 1) {
+ drainMicroTaskQueue();
+ }
+ _numberOfNestedTaskFrames--;
+ }
+ };
+ Object.defineProperty(ZoneTask.prototype, "zone", {
+ get: function () {
+ return this._zone;
+ },
+ enumerable: false,
+ configurable: true
+ });
+ Object.defineProperty(ZoneTask.prototype, "state", {
+ get: function () {
+ return this._state;
+ },
+ enumerable: false,
+ configurable: true
+ });
+ ZoneTask.prototype.cancelScheduleRequest = function () {
+ this._transitionTo(notScheduled, scheduling);
+ };
+ // tslint:disable-next-line:require-internal-with-underscore
+ ZoneTask.prototype._transitionTo = function (toState, fromState1, fromState2) {
+ if (this._state === fromState1 || this._state === fromState2) {
+ this._state = toState;
+ if (toState == notScheduled) {
+ this._zoneDelegates = null;
+ }
+ }
+ else {
+ throw new Error(this.type + " '" + this.source + "': can not transition to '" + toState + "', expecting state '" + fromState1 + "'" + (fromState2 ? ' or \'' + fromState2 + '\'' : '') + ", was '" + this._state + "'.");
+ }
+ };
+ ZoneTask.prototype.toString = function () {
+ if (this.data && typeof this.data.handleId !== 'undefined') {
+ return this.data.handleId.toString();
+ }
+ else {
+ return Object.prototype.toString.call(this);
+ }
+ };
+ // add toJSON method to prevent cyclic error when
+ // call JSON.stringify(zoneTask)
+ ZoneTask.prototype.toJSON = function () {
+ return {
+ type: this.type,
+ state: this.state,
+ source: this.source,
+ zone: this.zone.name,
+ runCount: this.runCount
+ };
+ };
+ return ZoneTask;
+ }());
+ //////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////
+ /// MICROTASK QUEUE
+ //////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////
+ var symbolSetTimeout = __symbol__('setTimeout');
+ var symbolPromise = __symbol__('Promise');
+ var symbolThen = __symbol__('then');
+ var _microTaskQueue = [];
+ var _isDrainingMicrotaskQueue = false;
+ var nativeMicroTaskQueuePromise;
+ function scheduleMicroTask(task) {
+ // if we are not running in any task, and there has not been anything scheduled
+ // we must bootstrap the initial task creation by manually scheduling the drain
+ if (_numberOfNestedTaskFrames === 0 && _microTaskQueue.length === 0) {
+ // We are not running in Task, so we need to kickstart the microtask queue.
+ if (!nativeMicroTaskQueuePromise) {
+ if (global[symbolPromise]) {
+ nativeMicroTaskQueuePromise = global[symbolPromise].resolve(0);
+ }
+ }
+ if (nativeMicroTaskQueuePromise) {
+ var nativeThen = nativeMicroTaskQueuePromise[symbolThen];
+ if (!nativeThen) {
+ // native Promise is not patchable, we need to use `then` directly
+ // issue 1078
+ nativeThen = nativeMicroTaskQueuePromise['then'];
+ }
+ nativeThen.call(nativeMicroTaskQueuePromise, drainMicroTaskQueue);
+ }
+ else {
+ global[symbolSetTimeout](drainMicroTaskQueue, 0);
+ }
+ }
+ task && _microTaskQueue.push(task);
+ }
+ function drainMicroTaskQueue() {
+ if (!_isDrainingMicrotaskQueue) {
+ _isDrainingMicrotaskQueue = true;
+ while (_microTaskQueue.length) {
+ var queue = _microTaskQueue;
+ _microTaskQueue = [];
+ for (var i = 0; i < queue.length; i++) {
+ var task = queue[i];
+ try {
+ task.zone.runTask(task, null, null);
+ }
+ catch (error) {
+ _api.onUnhandledError(error);
+ }
+ }
+ }
+ _api.microtaskDrainDone();
+ _isDrainingMicrotaskQueue = false;
+ }
+ }
+ //////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////
+ /// BOOTSTRAP
+ //////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////
+ var NO_ZONE = { name: 'NO ZONE' };
+ var notScheduled = 'notScheduled', scheduling = 'scheduling', scheduled = 'scheduled', running = 'running', canceling = 'canceling', unknown = 'unknown';
+ var microTask = 'microTask', macroTask = 'macroTask', eventTask = 'eventTask';
+ var patches = {};
+ var _api = {
+ symbol: __symbol__,
+ currentZoneFrame: function () { return _currentZoneFrame; },
+ onUnhandledError: noop,
+ microtaskDrainDone: noop,
+ scheduleMicroTask: scheduleMicroTask,
+ showUncaughtError: function () { return !Zone[__symbol__('ignoreConsoleErrorUncaughtError')]; },
+ patchEventTarget: function () { return []; },
+ patchOnProperties: noop,
+ patchMethod: function () { return noop; },
+ bindArguments: function () { return []; },
+ patchThen: function () { return noop; },
+ patchMacroTask: function () { return noop; },
+ patchEventPrototype: function () { return noop; },
+ isIEOrEdge: function () { return false; },
+ getGlobalObjects: function () { return undefined; },
+ ObjectDefineProperty: function () { return noop; },
+ ObjectGetOwnPropertyDescriptor: function () { return undefined; },
+ ObjectCreate: function () { return undefined; },
+ ArraySlice: function () { return []; },
+ patchClass: function () { return noop; },
+ wrapWithCurrentZone: function () { return noop; },
+ filterProperties: function () { return []; },
+ attachOriginToPatched: function () { return noop; },
+ _redefineProperty: function () { return noop; },
+ patchCallbacks: function () { return noop; }
+ };
+ var _currentZoneFrame = { parent: null, zone: new Zone(null, null) };
+ var _currentTask = null;
+ var _numberOfNestedTaskFrames = 0;
+ function noop() { }
+ performanceMeasure('Zone', 'Zone');
+ return global['Zone'] = Zone;
+ })(typeof window !== 'undefined' && window || typeof self !== 'undefined' && self || global);
+ /**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+ /**
+ * Suppress closure compiler errors about unknown 'Zone' variable
+ * @fileoverview
+ * @suppress {undefinedVars,globalThis,missingRequire}
+ */
+ ///
+ // issue #989, to reduce bundle size, use short name
+ /** Object.getOwnPropertyDescriptor */
+ var ObjectGetOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;
+ /** Object.defineProperty */
+ var ObjectDefineProperty = Object.defineProperty;
+ /** Object.getPrototypeOf */
+ var ObjectGetPrototypeOf = Object.getPrototypeOf;
+ /** Object.create */
+ var ObjectCreate = Object.create;
+ /** Array.prototype.slice */
+ var ArraySlice = Array.prototype.slice;
+ /** addEventListener string const */
+ var ADD_EVENT_LISTENER_STR = 'addEventListener';
+ /** removeEventListener string const */
+ var REMOVE_EVENT_LISTENER_STR = 'removeEventListener';
+ /** zoneSymbol addEventListener */
+ var ZONE_SYMBOL_ADD_EVENT_LISTENER = Zone.__symbol__(ADD_EVENT_LISTENER_STR);
+ /** zoneSymbol removeEventListener */
+ var ZONE_SYMBOL_REMOVE_EVENT_LISTENER = Zone.__symbol__(REMOVE_EVENT_LISTENER_STR);
+ /** true string const */
+ var TRUE_STR = 'true';
+ /** false string const */
+ var FALSE_STR = 'false';
+ /** Zone symbol prefix string const. */
+ var ZONE_SYMBOL_PREFIX = Zone.__symbol__('');
+ function wrapWithCurrentZone(callback, source) {
+ return Zone.current.wrap(callback, source);
+ }
+ function scheduleMacroTaskWithCurrentZone(source, callback, data, customSchedule, customCancel) {
+ return Zone.current.scheduleMacroTask(source, callback, data, customSchedule, customCancel);
+ }
+ var zoneSymbol = Zone.__symbol__;
+ var isWindowExists = typeof window !== 'undefined';
+ var internalWindow = isWindowExists ? window : undefined;
+ var _global = isWindowExists && internalWindow || typeof self === 'object' && self || global;
+ var REMOVE_ATTRIBUTE = 'removeAttribute';
+ var NULL_ON_PROP_VALUE = [null];
+ function bindArguments(args, source) {
+ for (var i = args.length - 1; i >= 0; i--) {
+ if (typeof args[i] === 'function') {
+ args[i] = wrapWithCurrentZone(args[i], source + '_' + i);
+ }
+ }
+ return args;
+ }
+ function patchPrototype(prototype, fnNames) {
+ var source = prototype.constructor['name'];
+ var _loop_1 = function (i) {
+ var name_1 = fnNames[i];
+ var delegate = prototype[name_1];
+ if (delegate) {
+ var prototypeDesc = ObjectGetOwnPropertyDescriptor(prototype, name_1);
+ if (!isPropertyWritable(prototypeDesc)) {
+ return "continue";
+ }
+ prototype[name_1] = (function (delegate) {
+ var patched = function () {
+ return delegate.apply(this, bindArguments(arguments, source + '.' + name_1));
+ };
+ attachOriginToPatched(patched, delegate);
+ return patched;
+ })(delegate);
+ }
+ };
+ for (var i = 0; i < fnNames.length; i++) {
+ _loop_1(i);
+ }
+ }
+ function isPropertyWritable(propertyDesc) {
+ if (!propertyDesc) {
+ return true;
+ }
+ if (propertyDesc.writable === false) {
+ return false;
+ }
+ return !(typeof propertyDesc.get === 'function' && typeof propertyDesc.set === 'undefined');
+ }
+ var isWebWorker = (typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope);
+ // Make sure to access `process` through `_global` so that WebPack does not accidentally browserify
+ // this code.
+ var isNode = (!('nw' in _global) && typeof _global.process !== 'undefined' &&
+ {}.toString.call(_global.process) === '[object process]');
+ var isBrowser = !isNode && !isWebWorker && !!(isWindowExists && internalWindow['HTMLElement']);
+ // we are in electron of nw, so we are both browser and nodejs
+ // Make sure to access `process` through `_global` so that WebPack does not accidentally browserify
+ // this code.
+ var isMix = typeof _global.process !== 'undefined' &&
+ {}.toString.call(_global.process) === '[object process]' && !isWebWorker &&
+ !!(isWindowExists && internalWindow['HTMLElement']);
+ var zoneSymbolEventNames = {};
+ var wrapFn = function (event) {
+ // https://github.com/angular/zone.js/issues/911, in IE, sometimes
+ // event will be undefined, so we need to use window.event
+ event = event || _global.event;
+ if (!event) {
+ return;
+ }
+ var eventNameSymbol = zoneSymbolEventNames[event.type];
+ if (!eventNameSymbol) {
+ eventNameSymbol = zoneSymbolEventNames[event.type] = zoneSymbol('ON_PROPERTY' + event.type);
+ }
+ var target = this || event.target || _global;
+ var listener = target[eventNameSymbol];
+ var result;
+ if (isBrowser && target === internalWindow && event.type === 'error') {
+ // window.onerror have different signiture
+ // https://developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers/onerror#window.onerror
+ // and onerror callback will prevent default when callback return true
+ var errorEvent = event;
+ result = listener &&
+ listener.call(this, errorEvent.message, errorEvent.filename, errorEvent.lineno, errorEvent.colno, errorEvent.error);
+ if (result === true) {
+ event.preventDefault();
+ }
+ }
+ else {
+ result = listener && listener.apply(this, arguments);
+ if (result != undefined && !result) {
+ event.preventDefault();
+ }
+ }
+ return result;
+ };
+ function patchProperty(obj, prop, prototype) {
+ var desc = ObjectGetOwnPropertyDescriptor(obj, prop);
+ if (!desc && prototype) {
+ // when patch window object, use prototype to check prop exist or not
+ var prototypeDesc = ObjectGetOwnPropertyDescriptor(prototype, prop);
+ if (prototypeDesc) {
+ desc = { enumerable: true, configurable: true };
+ }
+ }
+ // if the descriptor not exists or is not configurable
+ // just return
+ if (!desc || !desc.configurable) {
+ return;
+ }
+ var onPropPatchedSymbol = zoneSymbol('on' + prop + 'patched');
+ if (obj.hasOwnProperty(onPropPatchedSymbol) && obj[onPropPatchedSymbol]) {
+ return;
+ }
+ // A property descriptor cannot have getter/setter and be writable
+ // deleting the writable and value properties avoids this error:
+ //
+ // TypeError: property descriptors must not specify a value or be writable when a
+ // getter or setter has been specified
+ delete desc.writable;
+ delete desc.value;
+ var originalDescGet = desc.get;
+ var originalDescSet = desc.set;
+ // substr(2) cuz 'onclick' -> 'click', etc
+ var eventName = prop.substr(2);
+ var eventNameSymbol = zoneSymbolEventNames[eventName];
+ if (!eventNameSymbol) {
+ eventNameSymbol = zoneSymbolEventNames[eventName] = zoneSymbol('ON_PROPERTY' + eventName);
+ }
+ desc.set = function (newValue) {
+ // in some of windows's onproperty callback, this is undefined
+ // so we need to check it
+ var target = this;
+ if (!target && obj === _global) {
+ target = _global;
+ }
+ if (!target) {
+ return;
+ }
+ var previousValue = target[eventNameSymbol];
+ if (previousValue) {
+ target.removeEventListener(eventName, wrapFn);
+ }
+ // issue #978, when onload handler was added before loading zone.js
+ // we should remove it with originalDescSet
+ if (originalDescSet) {
+ originalDescSet.apply(target, NULL_ON_PROP_VALUE);
+ }
+ if (typeof newValue === 'function') {
+ target[eventNameSymbol] = newValue;
+ target.addEventListener(eventName, wrapFn, false);
+ }
+ else {
+ target[eventNameSymbol] = null;
+ }
+ };
+ // The getter would return undefined for unassigned properties but the default value of an
+ // unassigned property is null
+ desc.get = function () {
+ // in some of windows's onproperty callback, this is undefined
+ // so we need to check it
+ var target = this;
+ if (!target && obj === _global) {
+ target = _global;
+ }
+ if (!target) {
+ return null;
+ }
+ var listener = target[eventNameSymbol];
+ if (listener) {
+ return listener;
+ }
+ else if (originalDescGet) {
+ // result will be null when use inline event attribute,
+ // such as
+ // because the onclick function is internal raw uncompiled handler
+ // the onclick will be evaluated when first time event was triggered or
+ // the property is accessed, https://github.com/angular/zone.js/issues/525
+ // so we should use original native get to retrieve the handler
+ var value = originalDescGet && originalDescGet.call(this);
+ if (value) {
+ desc.set.call(this, value);
+ if (typeof target[REMOVE_ATTRIBUTE] === 'function') {
+ target.removeAttribute(prop);
+ }
+ return value;
+ }
+ }
+ return null;
+ };
+ ObjectDefineProperty(obj, prop, desc);
+ obj[onPropPatchedSymbol] = true;
+ }
+ function patchOnProperties(obj, properties, prototype) {
+ if (properties) {
+ for (var i = 0; i < properties.length; i++) {
+ patchProperty(obj, 'on' + properties[i], prototype);
+ }
+ }
+ else {
+ var onProperties = [];
+ for (var prop in obj) {
+ if (prop.substr(0, 2) == 'on') {
+ onProperties.push(prop);
+ }
+ }
+ for (var j = 0; j < onProperties.length; j++) {
+ patchProperty(obj, onProperties[j], prototype);
+ }
+ }
+ }
+ var originalInstanceKey = zoneSymbol('originalInstance');
+ // wrap some native API on `window`
+ function patchClass(className) {
+ var OriginalClass = _global[className];
+ if (!OriginalClass)
+ return;
+ // keep original class in global
+ _global[zoneSymbol(className)] = OriginalClass;
+ _global[className] = function () {
+ var a = bindArguments(arguments, className);
+ switch (a.length) {
+ case 0:
+ this[originalInstanceKey] = new OriginalClass();
+ break;
+ case 1:
+ this[originalInstanceKey] = new OriginalClass(a[0]);
+ break;
+ case 2:
+ this[originalInstanceKey] = new OriginalClass(a[0], a[1]);
+ break;
+ case 3:
+ this[originalInstanceKey] = new OriginalClass(a[0], a[1], a[2]);
+ break;
+ case 4:
+ this[originalInstanceKey] = new OriginalClass(a[0], a[1], a[2], a[3]);
+ break;
+ default:
+ throw new Error('Arg list too long.');
+ }
+ };
+ // attach original delegate to patched function
+ attachOriginToPatched(_global[className], OriginalClass);
+ var instance = new OriginalClass(function () { });
+ var prop;
+ for (prop in instance) {
+ // https://bugs.webkit.org/show_bug.cgi?id=44721
+ if (className === 'XMLHttpRequest' && prop === 'responseBlob')
+ continue;
+ (function (prop) {
+ if (typeof instance[prop] === 'function') {
+ _global[className].prototype[prop] = function () {
+ return this[originalInstanceKey][prop].apply(this[originalInstanceKey], arguments);
+ };
+ }
+ else {
+ ObjectDefineProperty(_global[className].prototype, prop, {
+ set: function (fn) {
+ if (typeof fn === 'function') {
+ this[originalInstanceKey][prop] = wrapWithCurrentZone(fn, className + '.' + prop);
+ // keep callback in wrapped function so we can
+ // use it in Function.prototype.toString to return
+ // the native one.
+ attachOriginToPatched(this[originalInstanceKey][prop], fn);
+ }
+ else {
+ this[originalInstanceKey][prop] = fn;
+ }
+ },
+ get: function () {
+ return this[originalInstanceKey][prop];
+ }
+ });
+ }
+ }(prop));
+ }
+ for (prop in OriginalClass) {
+ if (prop !== 'prototype' && OriginalClass.hasOwnProperty(prop)) {
+ _global[className][prop] = OriginalClass[prop];
+ }
+ }
+ }
+ function patchMethod(target, name, patchFn) {
+ var proto = target;
+ while (proto && !proto.hasOwnProperty(name)) {
+ proto = ObjectGetPrototypeOf(proto);
+ }
+ if (!proto && target[name]) {
+ // somehow we did not find it, but we can see it. This happens on IE for Window properties.
+ proto = target;
+ }
+ var delegateName = zoneSymbol(name);
+ var delegate = null;
+ if (proto && (!(delegate = proto[delegateName]) || !proto.hasOwnProperty(delegateName))) {
+ delegate = proto[delegateName] = proto[name];
+ // check whether proto[name] is writable
+ // some property is readonly in safari, such as HtmlCanvasElement.prototype.toBlob
+ var desc = proto && ObjectGetOwnPropertyDescriptor(proto, name);
+ if (isPropertyWritable(desc)) {
+ var patchDelegate_1 = patchFn(delegate, delegateName, name);
+ proto[name] = function () {
+ return patchDelegate_1(this, arguments);
+ };
+ attachOriginToPatched(proto[name], delegate);
+ }
+ }
+ return delegate;
+ }
+ // TODO: @JiaLiPassion, support cancel task later if necessary
+ function patchMacroTask(obj, funcName, metaCreator) {
+ var setNative = null;
+ function scheduleTask(task) {
+ var data = task.data;
+ data.args[data.cbIdx] = function () {
+ task.invoke.apply(this, arguments);
+ };
+ setNative.apply(data.target, data.args);
+ return task;
+ }
+ setNative = patchMethod(obj, funcName, function (delegate) { return function (self, args) {
+ var meta = metaCreator(self, args);
+ if (meta.cbIdx >= 0 && typeof args[meta.cbIdx] === 'function') {
+ return scheduleMacroTaskWithCurrentZone(meta.name, args[meta.cbIdx], meta, scheduleTask);
+ }
+ else {
+ // cause an error by calling it directly.
+ return delegate.apply(self, args);
+ }
+ }; });
+ }
+ function attachOriginToPatched(patched, original) {
+ patched[zoneSymbol('OriginalDelegate')] = original;
+ }
+ var isDetectedIEOrEdge = false;
+ var ieOrEdge = false;
+ function isIE() {
+ try {
+ var ua = internalWindow.navigator.userAgent;
+ if (ua.indexOf('MSIE ') !== -1 || ua.indexOf('Trident/') !== -1) {
+ return true;
+ }
+ }
+ catch (error) {
+ }
+ return false;
+ }
+ function isIEOrEdge() {
+ if (isDetectedIEOrEdge) {
+ return ieOrEdge;
+ }
+ isDetectedIEOrEdge = true;
+ try {
+ var ua = internalWindow.navigator.userAgent;
+ if (ua.indexOf('MSIE ') !== -1 || ua.indexOf('Trident/') !== -1 || ua.indexOf('Edge/') !== -1) {
+ ieOrEdge = true;
+ }
+ }
+ catch (error) {
+ }
+ return ieOrEdge;
+ }
+ /**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+ Zone.__load_patch('ZoneAwarePromise', function (global, Zone, api) {
+ var ObjectGetOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;
+ var ObjectDefineProperty = Object.defineProperty;
+ function readableObjectToString(obj) {
+ if (obj && obj.toString === Object.prototype.toString) {
+ var className = obj.constructor && obj.constructor.name;
+ return (className ? className : '') + ': ' + JSON.stringify(obj);
+ }
+ return obj ? obj.toString() : Object.prototype.toString.call(obj);
+ }
+ var __symbol__ = api.symbol;
+ var _uncaughtPromiseErrors = [];
+ var isDisableWrappingUncaughtPromiseRejection = global[__symbol__('DISABLE_WRAPPING_UNCAUGHT_PROMISE_REJECTION')] === true;
+ var symbolPromise = __symbol__('Promise');
+ var symbolThen = __symbol__('then');
+ var creationTrace = '__creationTrace__';
+ api.onUnhandledError = function (e) {
+ if (api.showUncaughtError()) {
+ var rejection = e && e.rejection;
+ if (rejection) {
+ console.error('Unhandled Promise rejection:', rejection instanceof Error ? rejection.message : rejection, '; Zone:', e.zone.name, '; Task:', e.task && e.task.source, '; Value:', rejection, rejection instanceof Error ? rejection.stack : undefined);
+ }
+ else {
+ console.error(e);
+ }
+ }
+ };
+ api.microtaskDrainDone = function () {
+ var _loop_2 = function () {
+ var uncaughtPromiseError = _uncaughtPromiseErrors.shift();
+ try {
+ uncaughtPromiseError.zone.runGuarded(function () {
+ if (uncaughtPromiseError.throwOriginal) {
+ throw uncaughtPromiseError.rejection;
+ }
+ throw uncaughtPromiseError;
+ });
+ }
+ catch (error) {
+ handleUnhandledRejection(error);
+ }
+ };
+ while (_uncaughtPromiseErrors.length) {
+ _loop_2();
+ }
+ };
+ var UNHANDLED_PROMISE_REJECTION_HANDLER_SYMBOL = __symbol__('unhandledPromiseRejectionHandler');
+ function handleUnhandledRejection(e) {
+ api.onUnhandledError(e);
+ try {
+ var handler = Zone[UNHANDLED_PROMISE_REJECTION_HANDLER_SYMBOL];
+ if (typeof handler === 'function') {
+ handler.call(this, e);
+ }
+ }
+ catch (err) {
+ }
+ }
+ function isThenable(value) {
+ return value && value.then;
+ }
+ function forwardResolution(value) {
+ return value;
+ }
+ function forwardRejection(rejection) {
+ return ZoneAwarePromise.reject(rejection);
+ }
+ var symbolState = __symbol__('state');
+ var symbolValue = __symbol__('value');
+ var symbolFinally = __symbol__('finally');
+ var symbolParentPromiseValue = __symbol__('parentPromiseValue');
+ var symbolParentPromiseState = __symbol__('parentPromiseState');
+ var source = 'Promise.then';
+ var UNRESOLVED = null;
+ var RESOLVED = true;
+ var REJECTED = false;
+ var REJECTED_NO_CATCH = 0;
+ function makeResolver(promise, state) {
+ return function (v) {
+ try {
+ resolvePromise(promise, state, v);
+ }
+ catch (err) {
+ resolvePromise(promise, false, err);
+ }
+ // Do not return value or you will break the Promise spec.
+ };
+ }
+ var once = function () {
+ var wasCalled = false;
+ return function wrapper(wrappedFunction) {
+ return function () {
+ if (wasCalled) {
+ return;
+ }
+ wasCalled = true;
+ wrappedFunction.apply(null, arguments);
+ };
+ };
+ };
+ var TYPE_ERROR = 'Promise resolved with itself';
+ var CURRENT_TASK_TRACE_SYMBOL = __symbol__('currentTaskTrace');
+ // Promise Resolution
+ function resolvePromise(promise, state, value) {
+ var onceWrapper = once();
+ if (promise === value) {
+ throw new TypeError(TYPE_ERROR);
+ }
+ if (promise[symbolState] === UNRESOLVED) {
+ // should only get value.then once based on promise spec.
+ var then = null;
+ try {
+ if (typeof value === 'object' || typeof value === 'function') {
+ then = value && value.then;
+ }
+ }
+ catch (err) {
+ onceWrapper(function () {
+ resolvePromise(promise, false, err);
+ })();
+ return promise;
+ }
+ // if (value instanceof ZoneAwarePromise) {
+ if (state !== REJECTED && value instanceof ZoneAwarePromise &&
+ value.hasOwnProperty(symbolState) && value.hasOwnProperty(symbolValue) &&
+ value[symbolState] !== UNRESOLVED) {
+ clearRejectedNoCatch(value);
+ resolvePromise(promise, value[symbolState], value[symbolValue]);
+ }
+ else if (state !== REJECTED && typeof then === 'function') {
+ try {
+ then.call(value, onceWrapper(makeResolver(promise, state)), onceWrapper(makeResolver(promise, false)));
+ }
+ catch (err) {
+ onceWrapper(function () {
+ resolvePromise(promise, false, err);
+ })();
+ }
+ }
+ else {
+ promise[symbolState] = state;
+ var queue = promise[symbolValue];
+ promise[symbolValue] = value;
+ if (promise[symbolFinally] === symbolFinally) {
+ // the promise is generated by Promise.prototype.finally
+ if (state === RESOLVED) {
+ // the state is resolved, should ignore the value
+ // and use parent promise value
+ promise[symbolState] = promise[symbolParentPromiseState];
+ promise[symbolValue] = promise[symbolParentPromiseValue];
+ }
+ }
+ // record task information in value when error occurs, so we can
+ // do some additional work such as render longStackTrace
+ if (state === REJECTED && value instanceof Error) {
+ // check if longStackTraceZone is here
+ var trace = Zone.currentTask && Zone.currentTask.data &&
+ Zone.currentTask.data[creationTrace];
+ if (trace) {
+ // only keep the long stack trace into error when in longStackTraceZone
+ ObjectDefineProperty(value, CURRENT_TASK_TRACE_SYMBOL, { configurable: true, enumerable: false, writable: true, value: trace });
+ }
+ }
+ for (var i = 0; i < queue.length;) {
+ scheduleResolveOrReject(promise, queue[i++], queue[i++], queue[i++], queue[i++]);
+ }
+ if (queue.length == 0 && state == REJECTED) {
+ promise[symbolState] = REJECTED_NO_CATCH;
+ var uncaughtPromiseError = value;
+ try {
+ // Here we throws a new Error to print more readable error log
+ // and if the value is not an error, zone.js builds an `Error`
+ // Object here to attach the stack information.
+ throw new Error('Uncaught (in promise): ' + readableObjectToString(value) +
+ (value && value.stack ? '\n' + value.stack : ''));
+ }
+ catch (err) {
+ uncaughtPromiseError = err;
+ }
+ if (isDisableWrappingUncaughtPromiseRejection) {
+ // If disable wrapping uncaught promise reject
+ // use the value instead of wrapping it.
+ uncaughtPromiseError.throwOriginal = true;
+ }
+ uncaughtPromiseError.rejection = value;
+ uncaughtPromiseError.promise = promise;
+ uncaughtPromiseError.zone = Zone.current;
+ uncaughtPromiseError.task = Zone.currentTask;
+ _uncaughtPromiseErrors.push(uncaughtPromiseError);
+ api.scheduleMicroTask(); // to make sure that it is running
+ }
+ }
+ }
+ // Resolving an already resolved promise is a noop.
+ return promise;
+ }
+ var REJECTION_HANDLED_HANDLER = __symbol__('rejectionHandledHandler');
+ function clearRejectedNoCatch(promise) {
+ if (promise[symbolState] === REJECTED_NO_CATCH) {
+ // if the promise is rejected no catch status
+ // and queue.length > 0, means there is a error handler
+ // here to handle the rejected promise, we should trigger
+ // windows.rejectionhandled eventHandler or nodejs rejectionHandled
+ // eventHandler
+ try {
+ var handler = Zone[REJECTION_HANDLED_HANDLER];
+ if (handler && typeof handler === 'function') {
+ handler.call(this, { rejection: promise[symbolValue], promise: promise });
+ }
+ }
+ catch (err) {
+ }
+ promise[symbolState] = REJECTED;
+ for (var i = 0; i < _uncaughtPromiseErrors.length; i++) {
+ if (promise === _uncaughtPromiseErrors[i].promise) {
+ _uncaughtPromiseErrors.splice(i, 1);
+ }
+ }
+ }
+ }
+ function scheduleResolveOrReject(promise, zone, chainPromise, onFulfilled, onRejected) {
+ clearRejectedNoCatch(promise);
+ var promiseState = promise[symbolState];
+ var delegate = promiseState ?
+ (typeof onFulfilled === 'function') ? onFulfilled : forwardResolution :
+ (typeof onRejected === 'function') ? onRejected : forwardRejection;
+ zone.scheduleMicroTask(source, function () {
+ try {
+ var parentPromiseValue = promise[symbolValue];
+ var isFinallyPromise = !!chainPromise && symbolFinally === chainPromise[symbolFinally];
+ if (isFinallyPromise) {
+ // if the promise is generated from finally call, keep parent promise's state and value
+ chainPromise[symbolParentPromiseValue] = parentPromiseValue;
+ chainPromise[symbolParentPromiseState] = promiseState;
+ }
+ // should not pass value to finally callback
+ var value = zone.run(delegate, undefined, isFinallyPromise && delegate !== forwardRejection && delegate !== forwardResolution ?
+ [] :
+ [parentPromiseValue]);
+ resolvePromise(chainPromise, true, value);
+ }
+ catch (error) {
+ // if error occurs, should always return this error
+ resolvePromise(chainPromise, false, error);
+ }
+ }, chainPromise);
+ }
+ var ZONE_AWARE_PROMISE_TO_STRING = 'function ZoneAwarePromise() { [native code] }';
+ var noop = function () { };
+ var ZoneAwarePromise = /** @class */ (function () {
+ function ZoneAwarePromise(executor) {
+ var promise = this;
+ if (!(promise instanceof ZoneAwarePromise)) {
+ throw new Error('Must be an instanceof Promise.');
+ }
+ promise[symbolState] = UNRESOLVED;
+ promise[symbolValue] = []; // queue;
+ try {
+ executor && executor(makeResolver(promise, RESOLVED), makeResolver(promise, REJECTED));
+ }
+ catch (error) {
+ resolvePromise(promise, false, error);
+ }
+ }
+ ZoneAwarePromise.toString = function () {
+ return ZONE_AWARE_PROMISE_TO_STRING;
+ };
+ ZoneAwarePromise.resolve = function (value) {
+ return resolvePromise(new this(null), RESOLVED, value);
+ };
+ ZoneAwarePromise.reject = function (error) {
+ return resolvePromise(new this(null), REJECTED, error);
+ };
+ ZoneAwarePromise.race = function (values) {
+ var resolve;
+ var reject;
+ var promise = new this(function (res, rej) {
+ resolve = res;
+ reject = rej;
+ });
+ function onResolve(value) {
+ resolve(value);
+ }
+ function onReject(error) {
+ reject(error);
+ }
+ for (var _i = 0, values_1 = values; _i < values_1.length; _i++) {
+ var value = values_1[_i];
+ if (!isThenable(value)) {
+ value = this.resolve(value);
+ }
+ value.then(onResolve, onReject);
+ }
+ return promise;
+ };
+ ZoneAwarePromise.all = function (values) {
+ return ZoneAwarePromise.allWithCallback(values);
+ };
+ ZoneAwarePromise.allSettled = function (values) {
+ var P = this && this.prototype instanceof ZoneAwarePromise ? this : ZoneAwarePromise;
+ return P.allWithCallback(values, {
+ thenCallback: function (value) { return ({ status: 'fulfilled', value: value }); },
+ errorCallback: function (err) { return ({ status: 'rejected', reason: err }); }
+ });
+ };
+ ZoneAwarePromise.allWithCallback = function (values, callback) {
+ var resolve;
+ var reject;
+ var promise = new this(function (res, rej) {
+ resolve = res;
+ reject = rej;
+ });
+ // Start at 2 to prevent prematurely resolving if .then is called immediately.
+ var unresolvedCount = 2;
+ var valueIndex = 0;
+ var resolvedValues = [];
+ var _loop_3 = function (value) {
+ if (!isThenable(value)) {
+ value = this_1.resolve(value);
+ }
+ var curValueIndex = valueIndex;
+ try {
+ value.then(function (value) {
+ resolvedValues[curValueIndex] = callback ? callback.thenCallback(value) : value;
+ unresolvedCount--;
+ if (unresolvedCount === 0) {
+ resolve(resolvedValues);
+ }
+ }, function (err) {
+ if (!callback) {
+ reject(err);
+ }
+ else {
+ resolvedValues[curValueIndex] = callback.errorCallback(err);
+ unresolvedCount--;
+ if (unresolvedCount === 0) {
+ resolve(resolvedValues);
+ }
+ }
+ });
+ }
+ catch (thenErr) {
+ reject(thenErr);
+ }
+ unresolvedCount++;
+ valueIndex++;
+ };
+ var this_1 = this;
+ for (var _i = 0, values_2 = values; _i < values_2.length; _i++) {
+ var value = values_2[_i];
+ _loop_3(value);
+ }
+ // Make the unresolvedCount zero-based again.
+ unresolvedCount -= 2;
+ if (unresolvedCount === 0) {
+ resolve(resolvedValues);
+ }
+ return promise;
+ };
+ Object.defineProperty(ZoneAwarePromise.prototype, Symbol.toStringTag, {
+ get: function () {
+ return 'Promise';
+ },
+ enumerable: false,
+ configurable: true
+ });
+ Object.defineProperty(ZoneAwarePromise.prototype, Symbol.species, {
+ get: function () {
+ return ZoneAwarePromise;
+ },
+ enumerable: false,
+ configurable: true
+ });
+ ZoneAwarePromise.prototype.then = function (onFulfilled, onRejected) {
+ var C = this.constructor[Symbol.species];
+ if (!C || typeof C !== 'function') {
+ C = this.constructor || ZoneAwarePromise;
+ }
+ var chainPromise = new C(noop);
+ var zone = Zone.current;
+ if (this[symbolState] == UNRESOLVED) {
+ this[symbolValue].push(zone, chainPromise, onFulfilled, onRejected);
+ }
+ else {
+ scheduleResolveOrReject(this, zone, chainPromise, onFulfilled, onRejected);
+ }
+ return chainPromise;
+ };
+ ZoneAwarePromise.prototype.catch = function (onRejected) {
+ return this.then(null, onRejected);
+ };
+ ZoneAwarePromise.prototype.finally = function (onFinally) {
+ var C = this.constructor[Symbol.species];
+ if (!C || typeof C !== 'function') {
+ C = ZoneAwarePromise;
+ }
+ var chainPromise = new C(noop);
+ chainPromise[symbolFinally] = symbolFinally;
+ var zone = Zone.current;
+ if (this[symbolState] == UNRESOLVED) {
+ this[symbolValue].push(zone, chainPromise, onFinally, onFinally);
+ }
+ else {
+ scheduleResolveOrReject(this, zone, chainPromise, onFinally, onFinally);
+ }
+ return chainPromise;
+ };
+ return ZoneAwarePromise;
+ }());
+ // Protect against aggressive optimizers dropping seemingly unused properties.
+ // E.g. Closure Compiler in advanced mode.
+ ZoneAwarePromise['resolve'] = ZoneAwarePromise.resolve;
+ ZoneAwarePromise['reject'] = ZoneAwarePromise.reject;
+ ZoneAwarePromise['race'] = ZoneAwarePromise.race;
+ ZoneAwarePromise['all'] = ZoneAwarePromise.all;
+ var NativePromise = global[symbolPromise] = global['Promise'];
+ global['Promise'] = ZoneAwarePromise;
+ var symbolThenPatched = __symbol__('thenPatched');
+ function patchThen(Ctor) {
+ var proto = Ctor.prototype;
+ var prop = ObjectGetOwnPropertyDescriptor(proto, 'then');
+ if (prop && (prop.writable === false || !prop.configurable)) {
+ // check Ctor.prototype.then propertyDescriptor is writable or not
+ // in meteor env, writable is false, we should ignore such case
+ return;
+ }
+ var originalThen = proto.then;
+ // Keep a reference to the original method.
+ proto[symbolThen] = originalThen;
+ Ctor.prototype.then = function (onResolve, onReject) {
+ var _this = this;
+ var wrapped = new ZoneAwarePromise(function (resolve, reject) {
+ originalThen.call(_this, resolve, reject);
+ });
+ return wrapped.then(onResolve, onReject);
+ };
+ Ctor[symbolThenPatched] = true;
+ }
+ api.patchThen = patchThen;
+ function zoneify(fn) {
+ return function (self, args) {
+ var resultPromise = fn.apply(self, args);
+ if (resultPromise instanceof ZoneAwarePromise) {
+ return resultPromise;
+ }
+ var ctor = resultPromise.constructor;
+ if (!ctor[symbolThenPatched]) {
+ patchThen(ctor);
+ }
+ return resultPromise;
+ };
+ }
+ if (NativePromise) {
+ patchThen(NativePromise);
+ patchMethod(global, 'fetch', function (delegate) { return zoneify(delegate); });
+ }
+ // This is not part of public API, but it is useful for tests, so we expose it.
+ Promise[Zone.__symbol__('uncaughtPromiseErrors')] = _uncaughtPromiseErrors;
+ return ZoneAwarePromise;
+ });
+ /**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+ // override Function.prototype.toString to make zone.js patched function
+ // look like native function
+ Zone.__load_patch('toString', function (global) {
+ // patch Func.prototype.toString to let them look like native
+ var originalFunctionToString = Function.prototype.toString;
+ var ORIGINAL_DELEGATE_SYMBOL = zoneSymbol('OriginalDelegate');
+ var PROMISE_SYMBOL = zoneSymbol('Promise');
+ var ERROR_SYMBOL = zoneSymbol('Error');
+ var newFunctionToString = function toString() {
+ if (typeof this === 'function') {
+ var originalDelegate = this[ORIGINAL_DELEGATE_SYMBOL];
+ if (originalDelegate) {
+ if (typeof originalDelegate === 'function') {
+ return originalFunctionToString.call(originalDelegate);
+ }
+ else {
+ return Object.prototype.toString.call(originalDelegate);
+ }
+ }
+ if (this === Promise) {
+ var nativePromise = global[PROMISE_SYMBOL];
+ if (nativePromise) {
+ return originalFunctionToString.call(nativePromise);
+ }
+ }
+ if (this === Error) {
+ var nativeError = global[ERROR_SYMBOL];
+ if (nativeError) {
+ return originalFunctionToString.call(nativeError);
+ }
+ }
+ }
+ return originalFunctionToString.call(this);
+ };
+ newFunctionToString[ORIGINAL_DELEGATE_SYMBOL] = originalFunctionToString;
+ Function.prototype.toString = newFunctionToString;
+ // patch Object.prototype.toString to let them look like native
+ var originalObjectToString = Object.prototype.toString;
+ var PROMISE_OBJECT_TO_STRING = '[object Promise]';
+ Object.prototype.toString = function () {
+ if (typeof Promise === 'function' && this instanceof Promise) {
+ return PROMISE_OBJECT_TO_STRING;
+ }
+ return originalObjectToString.call(this);
+ };
+ });
+ /**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+ var passiveSupported = false;
+ if (typeof window !== 'undefined') {
+ try {
+ var options = Object.defineProperty({}, 'passive', {
+ get: function () {
+ passiveSupported = true;
+ }
+ });
+ window.addEventListener('test', options, options);
+ window.removeEventListener('test', options, options);
+ }
+ catch (err) {
+ passiveSupported = false;
+ }
+ }
+ // an identifier to tell ZoneTask do not create a new invoke closure
+ var OPTIMIZED_ZONE_EVENT_TASK_DATA = {
+ useG: true
+ };
+ var zoneSymbolEventNames$1 = {};
+ var globalSources = {};
+ var EVENT_NAME_SYMBOL_REGX = new RegExp('^' + ZONE_SYMBOL_PREFIX + '(\\w+)(true|false)$');
+ var IMMEDIATE_PROPAGATION_SYMBOL = zoneSymbol('propagationStopped');
+ function prepareEventNames(eventName, eventNameToString) {
+ var falseEventName = (eventNameToString ? eventNameToString(eventName) : eventName) + FALSE_STR;
+ var trueEventName = (eventNameToString ? eventNameToString(eventName) : eventName) + TRUE_STR;
+ var symbol = ZONE_SYMBOL_PREFIX + falseEventName;
+ var symbolCapture = ZONE_SYMBOL_PREFIX + trueEventName;
+ zoneSymbolEventNames$1[eventName] = {};
+ zoneSymbolEventNames$1[eventName][FALSE_STR] = symbol;
+ zoneSymbolEventNames$1[eventName][TRUE_STR] = symbolCapture;
+ }
+ function patchEventTarget(_global, apis, patchOptions) {
+ var ADD_EVENT_LISTENER = (patchOptions && patchOptions.add) || ADD_EVENT_LISTENER_STR;
+ var REMOVE_EVENT_LISTENER = (patchOptions && patchOptions.rm) || REMOVE_EVENT_LISTENER_STR;
+ var LISTENERS_EVENT_LISTENER = (patchOptions && patchOptions.listeners) || 'eventListeners';
+ var REMOVE_ALL_LISTENERS_EVENT_LISTENER = (patchOptions && patchOptions.rmAll) || 'removeAllListeners';
+ var zoneSymbolAddEventListener = zoneSymbol(ADD_EVENT_LISTENER);
+ var ADD_EVENT_LISTENER_SOURCE = '.' + ADD_EVENT_LISTENER + ':';
+ var PREPEND_EVENT_LISTENER = 'prependListener';
+ var PREPEND_EVENT_LISTENER_SOURCE = '.' + PREPEND_EVENT_LISTENER + ':';
+ var invokeTask = function (task, target, event) {
+ // for better performance, check isRemoved which is set
+ // by removeEventListener
+ if (task.isRemoved) {
+ return;
+ }
+ var delegate = task.callback;
+ if (typeof delegate === 'object' && delegate.handleEvent) {
+ // create the bind version of handleEvent when invoke
+ task.callback = function (event) { return delegate.handleEvent(event); };
+ task.originalDelegate = delegate;
+ }
+ // invoke static task.invoke
+ task.invoke(task, target, [event]);
+ var options = task.options;
+ if (options && typeof options === 'object' && options.once) {
+ // if options.once is true, after invoke once remove listener here
+ // only browser need to do this, nodejs eventEmitter will cal removeListener
+ // inside EventEmitter.once
+ var delegate_1 = task.originalDelegate ? task.originalDelegate : task.callback;
+ target[REMOVE_EVENT_LISTENER].call(target, event.type, delegate_1, options);
+ }
+ };
+ // global shared zoneAwareCallback to handle all event callback with capture = false
+ var globalZoneAwareCallback = function (event) {
+ // https://github.com/angular/zone.js/issues/911, in IE, sometimes
+ // event will be undefined, so we need to use window.event
+ event = event || _global.event;
+ if (!event) {
+ return;
+ }
+ // event.target is needed for Samsung TV and SourceBuffer
+ // || global is needed https://github.com/angular/zone.js/issues/190
+ var target = this || event.target || _global;
+ var tasks = target[zoneSymbolEventNames$1[event.type][FALSE_STR]];
+ if (tasks) {
+ // invoke all tasks which attached to current target with given event.type and capture = false
+ // for performance concern, if task.length === 1, just invoke
+ if (tasks.length === 1) {
+ invokeTask(tasks[0], target, event);
+ }
+ else {
+ // https://github.com/angular/zone.js/issues/836
+ // copy the tasks array before invoke, to avoid
+ // the callback will remove itself or other listener
+ var copyTasks = tasks.slice();
+ for (var i = 0; i < copyTasks.length; i++) {
+ if (event && event[IMMEDIATE_PROPAGATION_SYMBOL] === true) {
+ break;
+ }
+ invokeTask(copyTasks[i], target, event);
+ }
+ }
+ }
+ };
+ // global shared zoneAwareCallback to handle all event callback with capture = true
+ var globalZoneAwareCaptureCallback = function (event) {
+ // https://github.com/angular/zone.js/issues/911, in IE, sometimes
+ // event will be undefined, so we need to use window.event
+ event = event || _global.event;
+ if (!event) {
+ return;
+ }
+ // event.target is needed for Samsung TV and SourceBuffer
+ // || global is needed https://github.com/angular/zone.js/issues/190
+ var target = this || event.target || _global;
+ var tasks = target[zoneSymbolEventNames$1[event.type][TRUE_STR]];
+ if (tasks) {
+ // invoke all tasks which attached to current target with given event.type and capture = false
+ // for performance concern, if task.length === 1, just invoke
+ if (tasks.length === 1) {
+ invokeTask(tasks[0], target, event);
+ }
+ else {
+ // https://github.com/angular/zone.js/issues/836
+ // copy the tasks array before invoke, to avoid
+ // the callback will remove itself or other listener
+ var copyTasks = tasks.slice();
+ for (var i = 0; i < copyTasks.length; i++) {
+ if (event && event[IMMEDIATE_PROPAGATION_SYMBOL] === true) {
+ break;
+ }
+ invokeTask(copyTasks[i], target, event);
+ }
+ }
+ }
+ };
+ function patchEventTargetMethods(obj, patchOptions) {
+ if (!obj) {
+ return false;
+ }
+ var useGlobalCallback = true;
+ if (patchOptions && patchOptions.useG !== undefined) {
+ useGlobalCallback = patchOptions.useG;
+ }
+ var validateHandler = patchOptions && patchOptions.vh;
+ var checkDuplicate = true;
+ if (patchOptions && patchOptions.chkDup !== undefined) {
+ checkDuplicate = patchOptions.chkDup;
+ }
+ var returnTarget = false;
+ if (patchOptions && patchOptions.rt !== undefined) {
+ returnTarget = patchOptions.rt;
+ }
+ var proto = obj;
+ while (proto && !proto.hasOwnProperty(ADD_EVENT_LISTENER)) {
+ proto = ObjectGetPrototypeOf(proto);
+ }
+ if (!proto && obj[ADD_EVENT_LISTENER]) {
+ // somehow we did not find it, but we can see it. This happens on IE for Window properties.
+ proto = obj;
+ }
+ if (!proto) {
+ return false;
+ }
+ if (proto[zoneSymbolAddEventListener]) {
+ return false;
+ }
+ var eventNameToString = patchOptions && patchOptions.eventNameToString;
+ // a shared global taskData to pass data for scheduleEventTask
+ // so we do not need to create a new object just for pass some data
+ var taskData = {};
+ var nativeAddEventListener = proto[zoneSymbolAddEventListener] = proto[ADD_EVENT_LISTENER];
+ var nativeRemoveEventListener = proto[zoneSymbol(REMOVE_EVENT_LISTENER)] =
+ proto[REMOVE_EVENT_LISTENER];
+ var nativeListeners = proto[zoneSymbol(LISTENERS_EVENT_LISTENER)] =
+ proto[LISTENERS_EVENT_LISTENER];
+ var nativeRemoveAllListeners = proto[zoneSymbol(REMOVE_ALL_LISTENERS_EVENT_LISTENER)] =
+ proto[REMOVE_ALL_LISTENERS_EVENT_LISTENER];
+ var nativePrependEventListener;
+ if (patchOptions && patchOptions.prepend) {
+ nativePrependEventListener = proto[zoneSymbol(patchOptions.prepend)] =
+ proto[patchOptions.prepend];
+ }
+ /**
+ * This util function will build an option object with passive option
+ * to handle all possible input from the user.
+ */
+ function buildEventListenerOptions(options, passive) {
+ if (!passiveSupported && typeof options === 'object' && options) {
+ // doesn't support passive but user want to pass an object as options.
+ // this will not work on some old browser, so we just pass a boolean
+ // as useCapture parameter
+ return !!options.capture;
+ }
+ if (!passiveSupported || !passive) {
+ return options;
+ }
+ if (typeof options === 'boolean') {
+ return { capture: options, passive: true };
+ }
+ if (!options) {
+ return { passive: true };
+ }
+ if (typeof options === 'object' && options.passive !== false) {
+ return Object.assign(Object.assign({}, options), { passive: true });
+ }
+ return options;
+ }
+ var customScheduleGlobal = function (task) {
+ // if there is already a task for the eventName + capture,
+ // just return, because we use the shared globalZoneAwareCallback here.
+ if (taskData.isExisting) {
+ return;
+ }
+ return nativeAddEventListener.call(taskData.target, taskData.eventName, taskData.capture ? globalZoneAwareCaptureCallback : globalZoneAwareCallback, taskData.options);
+ };
+ var customCancelGlobal = function (task) {
+ // if task is not marked as isRemoved, this call is directly
+ // from Zone.prototype.cancelTask, we should remove the task
+ // from tasksList of target first
+ if (!task.isRemoved) {
+ var symbolEventNames = zoneSymbolEventNames$1[task.eventName];
+ var symbolEventName = void 0;
+ if (symbolEventNames) {
+ symbolEventName = symbolEventNames[task.capture ? TRUE_STR : FALSE_STR];
+ }
+ var existingTasks = symbolEventName && task.target[symbolEventName];
+ if (existingTasks) {
+ for (var i = 0; i < existingTasks.length; i++) {
+ var existingTask = existingTasks[i];
+ if (existingTask === task) {
+ existingTasks.splice(i, 1);
+ // set isRemoved to data for faster invokeTask check
+ task.isRemoved = true;
+ if (existingTasks.length === 0) {
+ // all tasks for the eventName + capture have gone,
+ // remove globalZoneAwareCallback and remove the task cache from target
+ task.allRemoved = true;
+ task.target[symbolEventName] = null;
+ }
+ break;
+ }
+ }
+ }
+ }
+ // if all tasks for the eventName + capture have gone,
+ // we will really remove the global event callback,
+ // if not, return
+ if (!task.allRemoved) {
+ return;
+ }
+ return nativeRemoveEventListener.call(task.target, task.eventName, task.capture ? globalZoneAwareCaptureCallback : globalZoneAwareCallback, task.options);
+ };
+ var customScheduleNonGlobal = function (task) {
+ return nativeAddEventListener.call(taskData.target, taskData.eventName, task.invoke, taskData.options);
+ };
+ var customSchedulePrepend = function (task) {
+ return nativePrependEventListener.call(taskData.target, taskData.eventName, task.invoke, taskData.options);
+ };
+ var customCancelNonGlobal = function (task) {
+ return nativeRemoveEventListener.call(task.target, task.eventName, task.invoke, task.options);
+ };
+ var customSchedule = useGlobalCallback ? customScheduleGlobal : customScheduleNonGlobal;
+ var customCancel = useGlobalCallback ? customCancelGlobal : customCancelNonGlobal;
+ var compareTaskCallbackVsDelegate = function (task, delegate) {
+ var typeOfDelegate = typeof delegate;
+ return (typeOfDelegate === 'function' && task.callback === delegate) ||
+ (typeOfDelegate === 'object' && task.originalDelegate === delegate);
+ };
+ var compare = (patchOptions && patchOptions.diff) ? patchOptions.diff : compareTaskCallbackVsDelegate;
+ var unpatchedEvents = Zone[zoneSymbol('UNPATCHED_EVENTS')];
+ var passiveEvents = _global[zoneSymbol('PASSIVE_EVENTS')];
+ var makeAddListener = function (nativeListener, addSource, customScheduleFn, customCancelFn, returnTarget, prepend) {
+ if (returnTarget === void 0) { returnTarget = false; }
+ if (prepend === void 0) { prepend = false; }
+ return function () {
+ var target = this || _global;
+ var eventName = arguments[0];
+ if (patchOptions && patchOptions.transferEventName) {
+ eventName = patchOptions.transferEventName(eventName);
+ }
+ var delegate = arguments[1];
+ if (!delegate) {
+ return nativeListener.apply(this, arguments);
+ }
+ if (isNode && eventName === 'uncaughtException') {
+ // don't patch uncaughtException of nodejs to prevent endless loop
+ return nativeListener.apply(this, arguments);
+ }
+ // don't create the bind delegate function for handleEvent
+ // case here to improve addEventListener performance
+ // we will create the bind delegate when invoke
+ var isHandleEvent = false;
+ if (typeof delegate !== 'function') {
+ if (!delegate.handleEvent) {
+ return nativeListener.apply(this, arguments);
+ }
+ isHandleEvent = true;
+ }
+ if (validateHandler && !validateHandler(nativeListener, delegate, target, arguments)) {
+ return;
+ }
+ var passive = passiveSupported && !!passiveEvents && passiveEvents.indexOf(eventName) !== -1;
+ var options = buildEventListenerOptions(arguments[2], passive);
+ if (unpatchedEvents) {
+ // check upatched list
+ for (var i = 0; i < unpatchedEvents.length; i++) {
+ if (eventName === unpatchedEvents[i]) {
+ if (passive) {
+ return nativeListener.call(target, eventName, delegate, options);
+ }
+ else {
+ return nativeListener.apply(this, arguments);
+ }
+ }
+ }
+ }
+ var capture = !options ? false : typeof options === 'boolean' ? true : options.capture;
+ var once = options && typeof options === 'object' ? options.once : false;
+ var zone = Zone.current;
+ var symbolEventNames = zoneSymbolEventNames$1[eventName];
+ if (!symbolEventNames) {
+ prepareEventNames(eventName, eventNameToString);
+ symbolEventNames = zoneSymbolEventNames$1[eventName];
+ }
+ var symbolEventName = symbolEventNames[capture ? TRUE_STR : FALSE_STR];
+ var existingTasks = target[symbolEventName];
+ var isExisting = false;
+ if (existingTasks) {
+ // already have task registered
+ isExisting = true;
+ if (checkDuplicate) {
+ for (var i = 0; i < existingTasks.length; i++) {
+ if (compare(existingTasks[i], delegate)) {
+ // same callback, same capture, same event name, just return
+ return;
+ }
+ }
+ }
+ }
+ else {
+ existingTasks = target[symbolEventName] = [];
+ }
+ var source;
+ var constructorName = target.constructor['name'];
+ var targetSource = globalSources[constructorName];
+ if (targetSource) {
+ source = targetSource[eventName];
+ }
+ if (!source) {
+ source = constructorName + addSource +
+ (eventNameToString ? eventNameToString(eventName) : eventName);
+ }
+ // do not create a new object as task.data to pass those things
+ // just use the global shared one
+ taskData.options = options;
+ if (once) {
+ // if addEventListener with once options, we don't pass it to
+ // native addEventListener, instead we keep the once setting
+ // and handle ourselves.
+ taskData.options.once = false;
+ }
+ taskData.target = target;
+ taskData.capture = capture;
+ taskData.eventName = eventName;
+ taskData.isExisting = isExisting;
+ var data = useGlobalCallback ? OPTIMIZED_ZONE_EVENT_TASK_DATA : undefined;
+ // keep taskData into data to allow onScheduleEventTask to access the task information
+ if (data) {
+ data.taskData = taskData;
+ }
+ var task = zone.scheduleEventTask(source, delegate, data, customScheduleFn, customCancelFn);
+ // should clear taskData.target to avoid memory leak
+ // issue, https://github.com/angular/angular/issues/20442
+ taskData.target = null;
+ // need to clear up taskData because it is a global object
+ if (data) {
+ data.taskData = null;
+ }
+ // have to save those information to task in case
+ // application may call task.zone.cancelTask() directly
+ if (once) {
+ options.once = true;
+ }
+ if (!(!passiveSupported && typeof task.options === 'boolean')) {
+ // if not support passive, and we pass an option object
+ // to addEventListener, we should save the options to task
+ task.options = options;
+ }
+ task.target = target;
+ task.capture = capture;
+ task.eventName = eventName;
+ if (isHandleEvent) {
+ // save original delegate for compare to check duplicate
+ task.originalDelegate = delegate;
+ }
+ if (!prepend) {
+ existingTasks.push(task);
+ }
+ else {
+ existingTasks.unshift(task);
+ }
+ if (returnTarget) {
+ return target;
+ }
+ };
+ };
+ proto[ADD_EVENT_LISTENER] = makeAddListener(nativeAddEventListener, ADD_EVENT_LISTENER_SOURCE, customSchedule, customCancel, returnTarget);
+ if (nativePrependEventListener) {
+ proto[PREPEND_EVENT_LISTENER] = makeAddListener(nativePrependEventListener, PREPEND_EVENT_LISTENER_SOURCE, customSchedulePrepend, customCancel, returnTarget, true);
+ }
+ proto[REMOVE_EVENT_LISTENER] = function () {
+ var target = this || _global;
+ var eventName = arguments[0];
+ if (patchOptions && patchOptions.transferEventName) {
+ eventName = patchOptions.transferEventName(eventName);
+ }
+ var options = arguments[2];
+ var capture = !options ? false : typeof options === 'boolean' ? true : options.capture;
+ var delegate = arguments[1];
+ if (!delegate) {
+ return nativeRemoveEventListener.apply(this, arguments);
+ }
+ if (validateHandler &&
+ !validateHandler(nativeRemoveEventListener, delegate, target, arguments)) {
+ return;
+ }
+ var symbolEventNames = zoneSymbolEventNames$1[eventName];
+ var symbolEventName;
+ if (symbolEventNames) {
+ symbolEventName = symbolEventNames[capture ? TRUE_STR : FALSE_STR];
+ }
+ var existingTasks = symbolEventName && target[symbolEventName];
+ if (existingTasks) {
+ for (var i = 0; i < existingTasks.length; i++) {
+ var existingTask = existingTasks[i];
+ if (compare(existingTask, delegate)) {
+ existingTasks.splice(i, 1);
+ // set isRemoved to data for faster invokeTask check
+ existingTask.isRemoved = true;
+ if (existingTasks.length === 0) {
+ // all tasks for the eventName + capture have gone,
+ // remove globalZoneAwareCallback and remove the task cache from target
+ existingTask.allRemoved = true;
+ target[symbolEventName] = null;
+ // in the target, we have an event listener which is added by on_property
+ // such as target.onclick = function() {}, so we need to clear this internal
+ // property too if all delegates all removed
+ if (typeof eventName === 'string') {
+ var onPropertySymbol = ZONE_SYMBOL_PREFIX + 'ON_PROPERTY' + eventName;
+ target[onPropertySymbol] = null;
+ }
+ }
+ existingTask.zone.cancelTask(existingTask);
+ if (returnTarget) {
+ return target;
+ }
+ return;
+ }
+ }
+ }
+ // issue 930, didn't find the event name or callback
+ // from zone kept existingTasks, the callback maybe
+ // added outside of zone, we need to call native removeEventListener
+ // to try to remove it.
+ return nativeRemoveEventListener.apply(this, arguments);
+ };
+ proto[LISTENERS_EVENT_LISTENER] = function () {
+ var target = this || _global;
+ var eventName = arguments[0];
+ if (patchOptions && patchOptions.transferEventName) {
+ eventName = patchOptions.transferEventName(eventName);
+ }
+ var listeners = [];
+ var tasks = findEventTasks(target, eventNameToString ? eventNameToString(eventName) : eventName);
+ for (var i = 0; i < tasks.length; i++) {
+ var task = tasks[i];
+ var delegate = task.originalDelegate ? task.originalDelegate : task.callback;
+ listeners.push(delegate);
+ }
+ return listeners;
+ };
+ proto[REMOVE_ALL_LISTENERS_EVENT_LISTENER] = function () {
+ var target = this || _global;
+ var eventName = arguments[0];
+ if (!eventName) {
+ var keys = Object.keys(target);
+ for (var i = 0; i < keys.length; i++) {
+ var prop = keys[i];
+ var match = EVENT_NAME_SYMBOL_REGX.exec(prop);
+ var evtName = match && match[1];
+ // in nodejs EventEmitter, removeListener event is
+ // used for monitoring the removeListener call,
+ // so just keep removeListener eventListener until
+ // all other eventListeners are removed
+ if (evtName && evtName !== 'removeListener') {
+ this[REMOVE_ALL_LISTENERS_EVENT_LISTENER].call(this, evtName);
+ }
+ }
+ // remove removeListener listener finally
+ this[REMOVE_ALL_LISTENERS_EVENT_LISTENER].call(this, 'removeListener');
+ }
+ else {
+ if (patchOptions && patchOptions.transferEventName) {
+ eventName = patchOptions.transferEventName(eventName);
+ }
+ var symbolEventNames = zoneSymbolEventNames$1[eventName];
+ if (symbolEventNames) {
+ var symbolEventName = symbolEventNames[FALSE_STR];
+ var symbolCaptureEventName = symbolEventNames[TRUE_STR];
+ var tasks = target[symbolEventName];
+ var captureTasks = target[symbolCaptureEventName];
+ if (tasks) {
+ var removeTasks = tasks.slice();
+ for (var i = 0; i < removeTasks.length; i++) {
+ var task = removeTasks[i];
+ var delegate = task.originalDelegate ? task.originalDelegate : task.callback;
+ this[REMOVE_EVENT_LISTENER].call(this, eventName, delegate, task.options);
+ }
+ }
+ if (captureTasks) {
+ var removeTasks = captureTasks.slice();
+ for (var i = 0; i < removeTasks.length; i++) {
+ var task = removeTasks[i];
+ var delegate = task.originalDelegate ? task.originalDelegate : task.callback;
+ this[REMOVE_EVENT_LISTENER].call(this, eventName, delegate, task.options);
+ }
+ }
+ }
+ }
+ if (returnTarget) {
+ return this;
+ }
+ };
+ // for native toString patch
+ attachOriginToPatched(proto[ADD_EVENT_LISTENER], nativeAddEventListener);
+ attachOriginToPatched(proto[REMOVE_EVENT_LISTENER], nativeRemoveEventListener);
+ if (nativeRemoveAllListeners) {
+ attachOriginToPatched(proto[REMOVE_ALL_LISTENERS_EVENT_LISTENER], nativeRemoveAllListeners);
+ }
+ if (nativeListeners) {
+ attachOriginToPatched(proto[LISTENERS_EVENT_LISTENER], nativeListeners);
+ }
+ return true;
+ }
+ var results = [];
+ for (var i = 0; i < apis.length; i++) {
+ results[i] = patchEventTargetMethods(apis[i], patchOptions);
+ }
+ return results;
+ }
+ function findEventTasks(target, eventName) {
+ if (!eventName) {
+ var foundTasks = [];
+ for (var prop in target) {
+ var match = EVENT_NAME_SYMBOL_REGX.exec(prop);
+ var evtName = match && match[1];
+ if (evtName && (!eventName || evtName === eventName)) {
+ var tasks = target[prop];
+ if (tasks) {
+ for (var i = 0; i < tasks.length; i++) {
+ foundTasks.push(tasks[i]);
+ }
+ }
+ }
+ }
+ return foundTasks;
+ }
+ var symbolEventName = zoneSymbolEventNames$1[eventName];
+ if (!symbolEventName) {
+ prepareEventNames(eventName);
+ symbolEventName = zoneSymbolEventNames$1[eventName];
+ }
+ var captureFalseTasks = target[symbolEventName[FALSE_STR]];
+ var captureTrueTasks = target[symbolEventName[TRUE_STR]];
+ if (!captureFalseTasks) {
+ return captureTrueTasks ? captureTrueTasks.slice() : [];
+ }
+ else {
+ return captureTrueTasks ? captureFalseTasks.concat(captureTrueTasks) :
+ captureFalseTasks.slice();
+ }
+ }
+ function patchEventPrototype(global, api) {
+ var Event = global['Event'];
+ if (Event && Event.prototype) {
+ api.patchMethod(Event.prototype, 'stopImmediatePropagation', function (delegate) { return function (self, args) {
+ self[IMMEDIATE_PROPAGATION_SYMBOL] = true;
+ // we need to call the native stopImmediatePropagation
+ // in case in some hybrid application, some part of
+ // application will be controlled by zone, some are not
+ delegate && delegate.apply(self, args);
+ }; });
+ }
+ }
+ /**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+ function patchCallbacks(api, target, targetName, method, callbacks) {
+ var symbol = Zone.__symbol__(method);
+ if (target[symbol]) {
+ return;
+ }
+ var nativeDelegate = target[symbol] = target[method];
+ target[method] = function (name, opts, options) {
+ if (opts && opts.prototype) {
+ callbacks.forEach(function (callback) {
+ var source = targetName + "." + method + "::" + callback;
+ var prototype = opts.prototype;
+ if (prototype.hasOwnProperty(callback)) {
+ var descriptor = api.ObjectGetOwnPropertyDescriptor(prototype, callback);
+ if (descriptor && descriptor.value) {
+ descriptor.value = api.wrapWithCurrentZone(descriptor.value, source);
+ api._redefineProperty(opts.prototype, callback, descriptor);
+ }
+ else if (prototype[callback]) {
+ prototype[callback] = api.wrapWithCurrentZone(prototype[callback], source);
+ }
+ }
+ else if (prototype[callback]) {
+ prototype[callback] = api.wrapWithCurrentZone(prototype[callback], source);
+ }
+ });
+ }
+ return nativeDelegate.call(target, name, opts, options);
+ };
+ api.attachOriginToPatched(target[method], nativeDelegate);
+ }
+ /**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+ var globalEventHandlersEventNames = [
+ 'abort',
+ 'animationcancel',
+ 'animationend',
+ 'animationiteration',
+ 'auxclick',
+ 'beforeinput',
+ 'blur',
+ 'cancel',
+ 'canplay',
+ 'canplaythrough',
+ 'change',
+ 'compositionstart',
+ 'compositionupdate',
+ 'compositionend',
+ 'cuechange',
+ 'click',
+ 'close',
+ 'contextmenu',
+ 'curechange',
+ 'dblclick',
+ 'drag',
+ 'dragend',
+ 'dragenter',
+ 'dragexit',
+ 'dragleave',
+ 'dragover',
+ 'drop',
+ 'durationchange',
+ 'emptied',
+ 'ended',
+ 'error',
+ 'focus',
+ 'focusin',
+ 'focusout',
+ 'gotpointercapture',
+ 'input',
+ 'invalid',
+ 'keydown',
+ 'keypress',
+ 'keyup',
+ 'load',
+ 'loadstart',
+ 'loadeddata',
+ 'loadedmetadata',
+ 'lostpointercapture',
+ 'mousedown',
+ 'mouseenter',
+ 'mouseleave',
+ 'mousemove',
+ 'mouseout',
+ 'mouseover',
+ 'mouseup',
+ 'mousewheel',
+ 'orientationchange',
+ 'pause',
+ 'play',
+ 'playing',
+ 'pointercancel',
+ 'pointerdown',
+ 'pointerenter',
+ 'pointerleave',
+ 'pointerlockchange',
+ 'mozpointerlockchange',
+ 'webkitpointerlockerchange',
+ 'pointerlockerror',
+ 'mozpointerlockerror',
+ 'webkitpointerlockerror',
+ 'pointermove',
+ 'pointout',
+ 'pointerover',
+ 'pointerup',
+ 'progress',
+ 'ratechange',
+ 'reset',
+ 'resize',
+ 'scroll',
+ 'seeked',
+ 'seeking',
+ 'select',
+ 'selectionchange',
+ 'selectstart',
+ 'show',
+ 'sort',
+ 'stalled',
+ 'submit',
+ 'suspend',
+ 'timeupdate',
+ 'volumechange',
+ 'touchcancel',
+ 'touchmove',
+ 'touchstart',
+ 'touchend',
+ 'transitioncancel',
+ 'transitionend',
+ 'waiting',
+ 'wheel'
+ ];
+ var documentEventNames = [
+ 'afterscriptexecute', 'beforescriptexecute', 'DOMContentLoaded', 'freeze', 'fullscreenchange',
+ 'mozfullscreenchange', 'webkitfullscreenchange', 'msfullscreenchange', 'fullscreenerror',
+ 'mozfullscreenerror', 'webkitfullscreenerror', 'msfullscreenerror', 'readystatechange',
+ 'visibilitychange', 'resume'
+ ];
+ var windowEventNames = [
+ 'absolutedeviceorientation',
+ 'afterinput',
+ 'afterprint',
+ 'appinstalled',
+ 'beforeinstallprompt',
+ 'beforeprint',
+ 'beforeunload',
+ 'devicelight',
+ 'devicemotion',
+ 'deviceorientation',
+ 'deviceorientationabsolute',
+ 'deviceproximity',
+ 'hashchange',
+ 'languagechange',
+ 'message',
+ 'mozbeforepaint',
+ 'offline',
+ 'online',
+ 'paint',
+ 'pageshow',
+ 'pagehide',
+ 'popstate',
+ 'rejectionhandled',
+ 'storage',
+ 'unhandledrejection',
+ 'unload',
+ 'userproximity',
+ 'vrdisplayconnected',
+ 'vrdisplaydisconnected',
+ 'vrdisplaypresentchange'
+ ];
+ var htmlElementEventNames = [
+ 'beforecopy', 'beforecut', 'beforepaste', 'copy', 'cut', 'paste', 'dragstart', 'loadend',
+ 'animationstart', 'search', 'transitionrun', 'transitionstart', 'webkitanimationend',
+ 'webkitanimationiteration', 'webkitanimationstart', 'webkittransitionend'
+ ];
+ var mediaElementEventNames = ['encrypted', 'waitingforkey', 'msneedkey', 'mozinterruptbegin', 'mozinterruptend'];
+ var ieElementEventNames = [
+ 'activate',
+ 'afterupdate',
+ 'ariarequest',
+ 'beforeactivate',
+ 'beforedeactivate',
+ 'beforeeditfocus',
+ 'beforeupdate',
+ 'cellchange',
+ 'controlselect',
+ 'dataavailable',
+ 'datasetchanged',
+ 'datasetcomplete',
+ 'errorupdate',
+ 'filterchange',
+ 'layoutcomplete',
+ 'losecapture',
+ 'move',
+ 'moveend',
+ 'movestart',
+ 'propertychange',
+ 'resizeend',
+ 'resizestart',
+ 'rowenter',
+ 'rowexit',
+ 'rowsdelete',
+ 'rowsinserted',
+ 'command',
+ 'compassneedscalibration',
+ 'deactivate',
+ 'help',
+ 'mscontentzoom',
+ 'msmanipulationstatechanged',
+ 'msgesturechange',
+ 'msgesturedoubletap',
+ 'msgestureend',
+ 'msgesturehold',
+ 'msgesturestart',
+ 'msgesturetap',
+ 'msgotpointercapture',
+ 'msinertiastart',
+ 'mslostpointercapture',
+ 'mspointercancel',
+ 'mspointerdown',
+ 'mspointerenter',
+ 'mspointerhover',
+ 'mspointerleave',
+ 'mspointermove',
+ 'mspointerout',
+ 'mspointerover',
+ 'mspointerup',
+ 'pointerout',
+ 'mssitemodejumplistitemremoved',
+ 'msthumbnailclick',
+ 'stop',
+ 'storagecommit'
+ ];
+ var webglEventNames = ['webglcontextrestored', 'webglcontextlost', 'webglcontextcreationerror'];
+ var formEventNames = ['autocomplete', 'autocompleteerror'];
+ var detailEventNames = ['toggle'];
+ var frameEventNames = ['load'];
+ var frameSetEventNames = ['blur', 'error', 'focus', 'load', 'resize', 'scroll', 'messageerror'];
+ var marqueeEventNames = ['bounce', 'finish', 'start'];
+ var XMLHttpRequestEventNames = [
+ 'loadstart', 'progress', 'abort', 'error', 'load', 'progress', 'timeout', 'loadend',
+ 'readystatechange'
+ ];
+ var IDBIndexEventNames = ['upgradeneeded', 'complete', 'abort', 'success', 'error', 'blocked', 'versionchange', 'close'];
+ var websocketEventNames = ['close', 'error', 'open', 'message'];
+ var workerEventNames = ['error', 'message'];
+ var eventNames = globalEventHandlersEventNames.concat(webglEventNames, formEventNames, detailEventNames, documentEventNames, windowEventNames, htmlElementEventNames, ieElementEventNames);
+ function filterProperties(target, onProperties, ignoreProperties) {
+ if (!ignoreProperties || ignoreProperties.length === 0) {
+ return onProperties;
+ }
+ var tip = ignoreProperties.filter(function (ip) { return ip.target === target; });
+ if (!tip || tip.length === 0) {
+ return onProperties;
+ }
+ var targetIgnoreProperties = tip[0].ignoreProperties;
+ return onProperties.filter(function (op) { return targetIgnoreProperties.indexOf(op) === -1; });
+ }
+ function patchFilteredProperties(target, onProperties, ignoreProperties, prototype) {
+ // check whether target is available, sometimes target will be undefined
+ // because different browser or some 3rd party plugin.
+ if (!target) {
+ return;
+ }
+ var filteredProperties = filterProperties(target, onProperties, ignoreProperties);
+ patchOnProperties(target, filteredProperties, prototype);
+ }
+ function propertyDescriptorPatch(api, _global) {
+ if (isNode && !isMix) {
+ return;
+ }
+ if (Zone[api.symbol('patchEvents')]) {
+ // events are already been patched by legacy patch.
+ return;
+ }
+ var supportsWebSocket = typeof WebSocket !== 'undefined';
+ var ignoreProperties = _global['__Zone_ignore_on_properties'];
+ // for browsers that we can patch the descriptor: Chrome & Firefox
+ if (isBrowser) {
+ var internalWindow_1 = window;
+ var ignoreErrorProperties = isIE() ? [{ target: internalWindow_1, ignoreProperties: ['error'] }] : [];
+ // in IE/Edge, onProp not exist in window object, but in WindowPrototype
+ // so we need to pass WindowPrototype to check onProp exist or not
+ patchFilteredProperties(internalWindow_1, eventNames.concat(['messageerror']), ignoreProperties ? ignoreProperties.concat(ignoreErrorProperties) : ignoreProperties, ObjectGetPrototypeOf(internalWindow_1));
+ patchFilteredProperties(Document.prototype, eventNames, ignoreProperties);
+ if (typeof internalWindow_1['SVGElement'] !== 'undefined') {
+ patchFilteredProperties(internalWindow_1['SVGElement'].prototype, eventNames, ignoreProperties);
+ }
+ patchFilteredProperties(Element.prototype, eventNames, ignoreProperties);
+ patchFilteredProperties(HTMLElement.prototype, eventNames, ignoreProperties);
+ patchFilteredProperties(HTMLMediaElement.prototype, mediaElementEventNames, ignoreProperties);
+ patchFilteredProperties(HTMLFrameSetElement.prototype, windowEventNames.concat(frameSetEventNames), ignoreProperties);
+ patchFilteredProperties(HTMLBodyElement.prototype, windowEventNames.concat(frameSetEventNames), ignoreProperties);
+ patchFilteredProperties(HTMLFrameElement.prototype, frameEventNames, ignoreProperties);
+ patchFilteredProperties(HTMLIFrameElement.prototype, frameEventNames, ignoreProperties);
+ var HTMLMarqueeElement_1 = internalWindow_1['HTMLMarqueeElement'];
+ if (HTMLMarqueeElement_1) {
+ patchFilteredProperties(HTMLMarqueeElement_1.prototype, marqueeEventNames, ignoreProperties);
+ }
+ var Worker_1 = internalWindow_1['Worker'];
+ if (Worker_1) {
+ patchFilteredProperties(Worker_1.prototype, workerEventNames, ignoreProperties);
+ }
+ }
+ var XMLHttpRequest = _global['XMLHttpRequest'];
+ if (XMLHttpRequest) {
+ // XMLHttpRequest is not available in ServiceWorker, so we need to check here
+ patchFilteredProperties(XMLHttpRequest.prototype, XMLHttpRequestEventNames, ignoreProperties);
+ }
+ var XMLHttpRequestEventTarget = _global['XMLHttpRequestEventTarget'];
+ if (XMLHttpRequestEventTarget) {
+ patchFilteredProperties(XMLHttpRequestEventTarget && XMLHttpRequestEventTarget.prototype, XMLHttpRequestEventNames, ignoreProperties);
+ }
+ if (typeof IDBIndex !== 'undefined') {
+ patchFilteredProperties(IDBIndex.prototype, IDBIndexEventNames, ignoreProperties);
+ patchFilteredProperties(IDBRequest.prototype, IDBIndexEventNames, ignoreProperties);
+ patchFilteredProperties(IDBOpenDBRequest.prototype, IDBIndexEventNames, ignoreProperties);
+ patchFilteredProperties(IDBDatabase.prototype, IDBIndexEventNames, ignoreProperties);
+ patchFilteredProperties(IDBTransaction.prototype, IDBIndexEventNames, ignoreProperties);
+ patchFilteredProperties(IDBCursor.prototype, IDBIndexEventNames, ignoreProperties);
+ }
+ if (supportsWebSocket) {
+ patchFilteredProperties(WebSocket.prototype, websocketEventNames, ignoreProperties);
+ }
+ }
+ /**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+ Zone.__load_patch('util', function (global, Zone, api) {
+ api.patchOnProperties = patchOnProperties;
+ api.patchMethod = patchMethod;
+ api.bindArguments = bindArguments;
+ api.patchMacroTask = patchMacroTask;
+ // In earlier version of zone.js (<0.9.0), we use env name `__zone_symbol__BLACK_LISTED_EVENTS` to
+ // define which events will not be patched by `Zone.js`.
+ // In newer version (>=0.9.0), we change the env name to `__zone_symbol__UNPATCHED_EVENTS` to keep
+ // the name consistent with angular repo.
+ // The `__zone_symbol__BLACK_LISTED_EVENTS` is deprecated, but it is still be supported for
+ // backwards compatibility.
+ var SYMBOL_BLACK_LISTED_EVENTS = Zone.__symbol__('BLACK_LISTED_EVENTS');
+ var SYMBOL_UNPATCHED_EVENTS = Zone.__symbol__('UNPATCHED_EVENTS');
+ if (global[SYMBOL_UNPATCHED_EVENTS]) {
+ global[SYMBOL_BLACK_LISTED_EVENTS] = global[SYMBOL_UNPATCHED_EVENTS];
+ }
+ if (global[SYMBOL_BLACK_LISTED_EVENTS]) {
+ Zone[SYMBOL_BLACK_LISTED_EVENTS] = Zone[SYMBOL_UNPATCHED_EVENTS] =
+ global[SYMBOL_BLACK_LISTED_EVENTS];
+ }
+ api.patchEventPrototype = patchEventPrototype;
+ api.patchEventTarget = patchEventTarget;
+ api.isIEOrEdge = isIEOrEdge;
+ api.ObjectDefineProperty = ObjectDefineProperty;
+ api.ObjectGetOwnPropertyDescriptor = ObjectGetOwnPropertyDescriptor;
+ api.ObjectCreate = ObjectCreate;
+ api.ArraySlice = ArraySlice;
+ api.patchClass = patchClass;
+ api.wrapWithCurrentZone = wrapWithCurrentZone;
+ api.filterProperties = filterProperties;
+ api.attachOriginToPatched = attachOriginToPatched;
+ api._redefineProperty = Object.defineProperty;
+ api.patchCallbacks = patchCallbacks;
+ api.getGlobalObjects = function () { return ({
+ globalSources: globalSources,
+ zoneSymbolEventNames: zoneSymbolEventNames$1,
+ eventNames: eventNames,
+ isBrowser: isBrowser,
+ isMix: isMix,
+ isNode: isNode,
+ TRUE_STR: TRUE_STR,
+ FALSE_STR: FALSE_STR,
+ ZONE_SYMBOL_PREFIX: ZONE_SYMBOL_PREFIX,
+ ADD_EVENT_LISTENER_STR: ADD_EVENT_LISTENER_STR,
+ REMOVE_EVENT_LISTENER_STR: REMOVE_EVENT_LISTENER_STR
+ }); };
+ });
+ /**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+ /*
+ * This is necessary for Chrome and Chrome mobile, to enable
+ * things like redefining `createdCallback` on an element.
+ */
+ var zoneSymbol$1;
+ var _defineProperty;
+ var _getOwnPropertyDescriptor;
+ var _create;
+ var unconfigurablesKey;
+ function propertyPatch() {
+ zoneSymbol$1 = Zone.__symbol__;
+ _defineProperty = Object[zoneSymbol$1('defineProperty')] = Object.defineProperty;
+ _getOwnPropertyDescriptor = Object[zoneSymbol$1('getOwnPropertyDescriptor')] =
+ Object.getOwnPropertyDescriptor;
+ _create = Object.create;
+ unconfigurablesKey = zoneSymbol$1('unconfigurables');
+ Object.defineProperty = function (obj, prop, desc) {
+ if (isUnconfigurable(obj, prop)) {
+ throw new TypeError('Cannot assign to read only property \'' + prop + '\' of ' + obj);
+ }
+ var originalConfigurableFlag = desc.configurable;
+ if (prop !== 'prototype') {
+ desc = rewriteDescriptor(obj, prop, desc);
+ }
+ return _tryDefineProperty(obj, prop, desc, originalConfigurableFlag);
+ };
+ Object.defineProperties = function (obj, props) {
+ Object.keys(props).forEach(function (prop) {
+ Object.defineProperty(obj, prop, props[prop]);
+ });
+ return obj;
+ };
+ Object.create = function (obj, proto) {
+ if (typeof proto === 'object' && !Object.isFrozen(proto)) {
+ Object.keys(proto).forEach(function (prop) {
+ proto[prop] = rewriteDescriptor(obj, prop, proto[prop]);
+ });
+ }
+ return _create(obj, proto);
+ };
+ Object.getOwnPropertyDescriptor = function (obj, prop) {
+ var desc = _getOwnPropertyDescriptor(obj, prop);
+ if (desc && isUnconfigurable(obj, prop)) {
+ desc.configurable = false;
+ }
+ return desc;
+ };
+ }
+ function _redefineProperty(obj, prop, desc) {
+ var originalConfigurableFlag = desc.configurable;
+ desc = rewriteDescriptor(obj, prop, desc);
+ return _tryDefineProperty(obj, prop, desc, originalConfigurableFlag);
+ }
+ function isUnconfigurable(obj, prop) {
+ return obj && obj[unconfigurablesKey] && obj[unconfigurablesKey][prop];
+ }
+ function rewriteDescriptor(obj, prop, desc) {
+ // issue-927, if the desc is frozen, don't try to change the desc
+ if (!Object.isFrozen(desc)) {
+ desc.configurable = true;
+ }
+ if (!desc.configurable) {
+ // issue-927, if the obj is frozen, don't try to set the desc to obj
+ if (!obj[unconfigurablesKey] && !Object.isFrozen(obj)) {
+ _defineProperty(obj, unconfigurablesKey, { writable: true, value: {} });
+ }
+ if (obj[unconfigurablesKey]) {
+ obj[unconfigurablesKey][prop] = true;
+ }
+ }
+ return desc;
+ }
+ function _tryDefineProperty(obj, prop, desc, originalConfigurableFlag) {
+ try {
+ return _defineProperty(obj, prop, desc);
+ }
+ catch (error) {
+ if (desc.configurable) {
+ // In case of errors, when the configurable flag was likely set by rewriteDescriptor(), let's
+ // retry with the original flag value
+ if (typeof originalConfigurableFlag == 'undefined') {
+ delete desc.configurable;
+ }
+ else {
+ desc.configurable = originalConfigurableFlag;
+ }
+ try {
+ return _defineProperty(obj, prop, desc);
+ }
+ catch (error) {
+ var swallowError = false;
+ if (prop === 'createdCallback' || prop === 'attachedCallback' ||
+ prop === 'detachedCallback' || prop === 'attributeChangedCallback') {
+ // We only swallow the error in registerElement patch
+ // this is the work around since some applications
+ // fail if we throw the error
+ swallowError = true;
+ }
+ if (!swallowError) {
+ throw error;
+ }
+ // TODO: @JiaLiPassion, Some application such as `registerElement` patch
+ // still need to swallow the error, in the future after these applications
+ // are updated, the following logic can be removed.
+ var descJson = null;
+ try {
+ descJson = JSON.stringify(desc);
+ }
+ catch (error) {
+ descJson = desc.toString();
+ }
+ console.log("Attempting to configure '" + prop + "' with descriptor '" + descJson + "' on object '" + obj + "' and got error, giving up: " + error);
+ }
+ }
+ else {
+ throw error;
+ }
+ }
+ }
+ /**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+ function eventTargetLegacyPatch(_global, api) {
+ var _a = api.getGlobalObjects(), eventNames = _a.eventNames, globalSources = _a.globalSources, zoneSymbolEventNames = _a.zoneSymbolEventNames, TRUE_STR = _a.TRUE_STR, FALSE_STR = _a.FALSE_STR, ZONE_SYMBOL_PREFIX = _a.ZONE_SYMBOL_PREFIX;
+ var WTF_ISSUE_555 = 'Anchor,Area,Audio,BR,Base,BaseFont,Body,Button,Canvas,Content,DList,Directory,Div,Embed,FieldSet,Font,Form,Frame,FrameSet,HR,Head,Heading,Html,IFrame,Image,Input,Keygen,LI,Label,Legend,Link,Map,Marquee,Media,Menu,Meta,Meter,Mod,OList,Object,OptGroup,Option,Output,Paragraph,Pre,Progress,Quote,Script,Select,Source,Span,Style,TableCaption,TableCell,TableCol,Table,TableRow,TableSection,TextArea,Title,Track,UList,Unknown,Video';
+ var NO_EVENT_TARGET = 'ApplicationCache,EventSource,FileReader,InputMethodContext,MediaController,MessagePort,Node,Performance,SVGElementInstance,SharedWorker,TextTrack,TextTrackCue,TextTrackList,WebKitNamedFlow,Window,Worker,WorkerGlobalScope,XMLHttpRequest,XMLHttpRequestEventTarget,XMLHttpRequestUpload,IDBRequest,IDBOpenDBRequest,IDBDatabase,IDBTransaction,IDBCursor,DBIndex,WebSocket'
+ .split(',');
+ var EVENT_TARGET = 'EventTarget';
+ var apis = [];
+ var isWtf = _global['wtf'];
+ var WTF_ISSUE_555_ARRAY = WTF_ISSUE_555.split(',');
+ if (isWtf) {
+ // Workaround for: https://github.com/google/tracing-framework/issues/555
+ apis = WTF_ISSUE_555_ARRAY.map(function (v) { return 'HTML' + v + 'Element'; }).concat(NO_EVENT_TARGET);
+ }
+ else if (_global[EVENT_TARGET]) {
+ apis.push(EVENT_TARGET);
+ }
+ else {
+ // Note: EventTarget is not available in all browsers,
+ // if it's not available, we instead patch the APIs in the IDL that inherit from EventTarget
+ apis = NO_EVENT_TARGET;
+ }
+ var isDisableIECheck = _global['__Zone_disable_IE_check'] || false;
+ var isEnableCrossContextCheck = _global['__Zone_enable_cross_context_check'] || false;
+ var ieOrEdge = api.isIEOrEdge();
+ var ADD_EVENT_LISTENER_SOURCE = '.addEventListener:';
+ var FUNCTION_WRAPPER = '[object FunctionWrapper]';
+ var BROWSER_TOOLS = 'function __BROWSERTOOLS_CONSOLE_SAFEFUNC() { [native code] }';
+ var pointerEventsMap = {
+ 'MSPointerCancel': 'pointercancel',
+ 'MSPointerDown': 'pointerdown',
+ 'MSPointerEnter': 'pointerenter',
+ 'MSPointerHover': 'pointerhover',
+ 'MSPointerLeave': 'pointerleave',
+ 'MSPointerMove': 'pointermove',
+ 'MSPointerOut': 'pointerout',
+ 'MSPointerOver': 'pointerover',
+ 'MSPointerUp': 'pointerup'
+ };
+ // predefine all __zone_symbol__ + eventName + true/false string
+ for (var i = 0; i < eventNames.length; i++) {
+ var eventName = eventNames[i];
+ var falseEventName = eventName + FALSE_STR;
+ var trueEventName = eventName + TRUE_STR;
+ var symbol = ZONE_SYMBOL_PREFIX + falseEventName;
+ var symbolCapture = ZONE_SYMBOL_PREFIX + trueEventName;
+ zoneSymbolEventNames[eventName] = {};
+ zoneSymbolEventNames[eventName][FALSE_STR] = symbol;
+ zoneSymbolEventNames[eventName][TRUE_STR] = symbolCapture;
+ }
+ // predefine all task.source string
+ for (var i = 0; i < WTF_ISSUE_555_ARRAY.length; i++) {
+ var target = WTF_ISSUE_555_ARRAY[i];
+ var targets = globalSources[target] = {};
+ for (var j = 0; j < eventNames.length; j++) {
+ var eventName = eventNames[j];
+ targets[eventName] = target + ADD_EVENT_LISTENER_SOURCE + eventName;
+ }
+ }
+ var checkIEAndCrossContext = function (nativeDelegate, delegate, target, args) {
+ if (!isDisableIECheck && ieOrEdge) {
+ if (isEnableCrossContextCheck) {
+ try {
+ var testString = delegate.toString();
+ if ((testString === FUNCTION_WRAPPER || testString == BROWSER_TOOLS)) {
+ nativeDelegate.apply(target, args);
+ return false;
+ }
+ }
+ catch (error) {
+ nativeDelegate.apply(target, args);
+ return false;
+ }
+ }
+ else {
+ var testString = delegate.toString();
+ if ((testString === FUNCTION_WRAPPER || testString == BROWSER_TOOLS)) {
+ nativeDelegate.apply(target, args);
+ return false;
+ }
+ }
+ }
+ else if (isEnableCrossContextCheck) {
+ try {
+ delegate.toString();
+ }
+ catch (error) {
+ nativeDelegate.apply(target, args);
+ return false;
+ }
+ }
+ return true;
+ };
+ var apiTypes = [];
+ for (var i = 0; i < apis.length; i++) {
+ var type = _global[apis[i]];
+ apiTypes.push(type && type.prototype);
+ }
+ // vh is validateHandler to check event handler
+ // is valid or not(for security check)
+ api.patchEventTarget(_global, apiTypes, {
+ vh: checkIEAndCrossContext,
+ transferEventName: function (eventName) {
+ var pointerEventName = pointerEventsMap[eventName];
+ return pointerEventName || eventName;
+ }
+ });
+ Zone[api.symbol('patchEventTarget')] = !!_global[EVENT_TARGET];
+ return true;
+ }
+ /**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+ // we have to patch the instance since the proto is non-configurable
+ function apply(api, _global) {
+ var _a = api.getGlobalObjects(), ADD_EVENT_LISTENER_STR = _a.ADD_EVENT_LISTENER_STR, REMOVE_EVENT_LISTENER_STR = _a.REMOVE_EVENT_LISTENER_STR;
+ var WS = _global.WebSocket;
+ // On Safari window.EventTarget doesn't exist so need to patch WS add/removeEventListener
+ // On older Chrome, no need since EventTarget was already patched
+ if (!_global.EventTarget) {
+ api.patchEventTarget(_global, [WS.prototype]);
+ }
+ _global.WebSocket = function (x, y) {
+ var socket = arguments.length > 1 ? new WS(x, y) : new WS(x);
+ var proxySocket;
+ var proxySocketProto;
+ // Safari 7.0 has non-configurable own 'onmessage' and friends properties on the socket instance
+ var onmessageDesc = api.ObjectGetOwnPropertyDescriptor(socket, 'onmessage');
+ if (onmessageDesc && onmessageDesc.configurable === false) {
+ proxySocket = api.ObjectCreate(socket);
+ // socket have own property descriptor 'onopen', 'onmessage', 'onclose', 'onerror'
+ // but proxySocket not, so we will keep socket as prototype and pass it to
+ // patchOnProperties method
+ proxySocketProto = socket;
+ [ADD_EVENT_LISTENER_STR, REMOVE_EVENT_LISTENER_STR, 'send', 'close'].forEach(function (propName) {
+ proxySocket[propName] = function () {
+ var args = api.ArraySlice.call(arguments);
+ if (propName === ADD_EVENT_LISTENER_STR || propName === REMOVE_EVENT_LISTENER_STR) {
+ var eventName = args.length > 0 ? args[0] : undefined;
+ if (eventName) {
+ var propertySymbol = Zone.__symbol__('ON_PROPERTY' + eventName);
+ socket[propertySymbol] = proxySocket[propertySymbol];
+ }
+ }
+ return socket[propName].apply(socket, args);
+ };
+ });
+ }
+ else {
+ // we can patch the real socket
+ proxySocket = socket;
+ }
+ api.patchOnProperties(proxySocket, ['close', 'error', 'message', 'open'], proxySocketProto);
+ return proxySocket;
+ };
+ var globalWebSocket = _global['WebSocket'];
+ for (var prop in WS) {
+ globalWebSocket[prop] = WS[prop];
+ }
+ }
+ /**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+ function propertyDescriptorLegacyPatch(api, _global) {
+ var _a = api.getGlobalObjects(), isNode = _a.isNode, isMix = _a.isMix;
+ if (isNode && !isMix) {
+ return;
+ }
+ if (!canPatchViaPropertyDescriptor(api, _global)) {
+ var supportsWebSocket = typeof WebSocket !== 'undefined';
+ // Safari, Android browsers (Jelly Bean)
+ patchViaCapturingAllTheEvents(api);
+ api.patchClass('XMLHttpRequest');
+ if (supportsWebSocket) {
+ apply(api, _global);
+ }
+ Zone[api.symbol('patchEvents')] = true;
+ }
+ }
+ function canPatchViaPropertyDescriptor(api, _global) {
+ var _a = api.getGlobalObjects(), isBrowser = _a.isBrowser, isMix = _a.isMix;
+ if ((isBrowser || isMix) &&
+ !api.ObjectGetOwnPropertyDescriptor(HTMLElement.prototype, 'onclick') &&
+ typeof Element !== 'undefined') {
+ // WebKit https://bugs.webkit.org/show_bug.cgi?id=134364
+ // IDL interface attributes are not configurable
+ var desc = api.ObjectGetOwnPropertyDescriptor(Element.prototype, 'onclick');
+ if (desc && !desc.configurable)
+ return false;
+ // try to use onclick to detect whether we can patch via propertyDescriptor
+ // because XMLHttpRequest is not available in service worker
+ if (desc) {
+ api.ObjectDefineProperty(Element.prototype, 'onclick', {
+ enumerable: true,
+ configurable: true,
+ get: function () {
+ return true;
+ }
+ });
+ var div = document.createElement('div');
+ var result = !!div.onclick;
+ api.ObjectDefineProperty(Element.prototype, 'onclick', desc);
+ return result;
+ }
+ }
+ var XMLHttpRequest = _global['XMLHttpRequest'];
+ if (!XMLHttpRequest) {
+ // XMLHttpRequest is not available in service worker
+ return false;
+ }
+ var ON_READY_STATE_CHANGE = 'onreadystatechange';
+ var XMLHttpRequestPrototype = XMLHttpRequest.prototype;
+ var xhrDesc = api.ObjectGetOwnPropertyDescriptor(XMLHttpRequestPrototype, ON_READY_STATE_CHANGE);
+ // add enumerable and configurable here because in opera
+ // by default XMLHttpRequest.prototype.onreadystatechange is undefined
+ // without adding enumerable and configurable will cause onreadystatechange
+ // non-configurable
+ // and if XMLHttpRequest.prototype.onreadystatechange is undefined,
+ // we should set a real desc instead a fake one
+ if (xhrDesc) {
+ api.ObjectDefineProperty(XMLHttpRequestPrototype, ON_READY_STATE_CHANGE, {
+ enumerable: true,
+ configurable: true,
+ get: function () {
+ return true;
+ }
+ });
+ var req = new XMLHttpRequest();
+ var result = !!req.onreadystatechange;
+ // restore original desc
+ api.ObjectDefineProperty(XMLHttpRequestPrototype, ON_READY_STATE_CHANGE, xhrDesc || {});
+ return result;
+ }
+ else {
+ var SYMBOL_FAKE_ONREADYSTATECHANGE_1 = api.symbol('fake');
+ api.ObjectDefineProperty(XMLHttpRequestPrototype, ON_READY_STATE_CHANGE, {
+ enumerable: true,
+ configurable: true,
+ get: function () {
+ return this[SYMBOL_FAKE_ONREADYSTATECHANGE_1];
+ },
+ set: function (value) {
+ this[SYMBOL_FAKE_ONREADYSTATECHANGE_1] = value;
+ }
+ });
+ var req = new XMLHttpRequest();
+ var detectFunc = function () { };
+ req.onreadystatechange = detectFunc;
+ var result = req[SYMBOL_FAKE_ONREADYSTATECHANGE_1] === detectFunc;
+ req.onreadystatechange = null;
+ return result;
+ }
+ }
+ // Whenever any eventListener fires, we check the eventListener target and all parents
+ // for `onwhatever` properties and replace them with zone-bound functions
+ // - Chrome (for now)
+ function patchViaCapturingAllTheEvents(api) {
+ var eventNames = api.getGlobalObjects().eventNames;
+ var unboundKey = api.symbol('unbound');
+ var _loop_4 = function (i) {
+ var property = eventNames[i];
+ var onproperty = 'on' + property;
+ self.addEventListener(property, function (event) {
+ var elt = event.target, bound, source;
+ if (elt) {
+ source = elt.constructor['name'] + '.' + onproperty;
+ }
+ else {
+ source = 'unknown.' + onproperty;
+ }
+ while (elt) {
+ if (elt[onproperty] && !elt[onproperty][unboundKey]) {
+ bound = api.wrapWithCurrentZone(elt[onproperty], source);
+ bound[unboundKey] = elt[onproperty];
+ elt[onproperty] = bound;
+ }
+ elt = elt.parentElement;
+ }
+ }, true);
+ };
+ for (var i = 0; i < eventNames.length; i++) {
+ _loop_4(i);
+ }
+ }
+ /**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+ function registerElementPatch(_global, api) {
+ var _a = api.getGlobalObjects(), isBrowser = _a.isBrowser, isMix = _a.isMix;
+ if ((!isBrowser && !isMix) || !('registerElement' in _global.document)) {
+ return;
+ }
+ var callbacks = ['createdCallback', 'attachedCallback', 'detachedCallback', 'attributeChangedCallback'];
+ api.patchCallbacks(api, document, 'Document', 'registerElement', callbacks);
+ }
+ /**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+ (function (_global) {
+ var symbolPrefix = _global['__Zone_symbol_prefix'] || '__zone_symbol__';
+ function __symbol__(name) {
+ return symbolPrefix + name;
+ }
+ _global[__symbol__('legacyPatch')] = function () {
+ var Zone = _global['Zone'];
+ Zone.__load_patch('defineProperty', function (global, Zone, api) {
+ api._redefineProperty = _redefineProperty;
+ propertyPatch();
+ });
+ Zone.__load_patch('registerElement', function (global, Zone, api) {
+ registerElementPatch(global, api);
+ });
+ Zone.__load_patch('EventTargetLegacy', function (global, Zone, api) {
+ eventTargetLegacyPatch(global, api);
+ propertyDescriptorLegacyPatch(api, global);
+ });
+ };
+ })(typeof window !== 'undefined' ?
+ window :
+ typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {});
+ /**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+ var taskSymbol = zoneSymbol('zoneTask');
+ function patchTimer(window, setName, cancelName, nameSuffix) {
+ var setNative = null;
+ var clearNative = null;
+ setName += nameSuffix;
+ cancelName += nameSuffix;
+ var tasksByHandleId = {};
+ function scheduleTask(task) {
+ var data = task.data;
+ data.args[0] = function () {
+ return task.invoke.apply(this, arguments);
+ };
+ data.handleId = setNative.apply(window, data.args);
+ return task;
+ }
+ function clearTask(task) {
+ return clearNative.call(window, task.data.handleId);
+ }
+ setNative =
+ patchMethod(window, setName, function (delegate) { return function (self, args) {
+ if (typeof args[0] === 'function') {
+ var options_1 = {
+ isPeriodic: nameSuffix === 'Interval',
+ delay: (nameSuffix === 'Timeout' || nameSuffix === 'Interval') ? args[1] || 0 :
+ undefined,
+ args: args
+ };
+ var callback_1 = args[0];
+ args[0] = function timer() {
+ try {
+ return callback_1.apply(this, arguments);
+ }
+ finally {
+ // issue-934, task will be cancelled
+ // even it is a periodic task such as
+ // setInterval
+ // https://github.com/angular/angular/issues/40387
+ // Cleanup tasksByHandleId should be handled before scheduleTask
+ // Since some zoneSpec may intercept and doesn't trigger
+ // scheduleFn(scheduleTask) provided here.
+ if (!(options_1.isPeriodic)) {
+ if (typeof options_1.handleId === 'number') {
+ // in non-nodejs env, we remove timerId
+ // from local cache
+ delete tasksByHandleId[options_1.handleId];
+ }
+ else if (options_1.handleId) {
+ // Node returns complex objects as handleIds
+ // we remove task reference from timer object
+ options_1.handleId[taskSymbol] = null;
+ }
+ }
+ }
+ };
+ var task = scheduleMacroTaskWithCurrentZone(setName, args[0], options_1, scheduleTask, clearTask);
+ if (!task) {
+ return task;
+ }
+ // Node.js must additionally support the ref and unref functions.
+ var handle = task.data.handleId;
+ if (typeof handle === 'number') {
+ // for non nodejs env, we save handleId: task
+ // mapping in local cache for clearTimeout
+ tasksByHandleId[handle] = task;
+ }
+ else if (handle) {
+ // for nodejs env, we save task
+ // reference in timerId Object for clearTimeout
+ handle[taskSymbol] = task;
+ }
+ // check whether handle is null, because some polyfill or browser
+ // may return undefined from setTimeout/setInterval/setImmediate/requestAnimationFrame
+ if (handle && handle.ref && handle.unref && typeof handle.ref === 'function' &&
+ typeof handle.unref === 'function') {
+ task.ref = handle.ref.bind(handle);
+ task.unref = handle.unref.bind(handle);
+ }
+ if (typeof handle === 'number' || handle) {
+ return handle;
+ }
+ return task;
+ }
+ else {
+ // cause an error by calling it directly.
+ return delegate.apply(window, args);
+ }
+ }; });
+ clearNative =
+ patchMethod(window, cancelName, function (delegate) { return function (self, args) {
+ var id = args[0];
+ var task;
+ if (typeof id === 'number') {
+ // non nodejs env.
+ task = tasksByHandleId[id];
+ }
+ else {
+ // nodejs env.
+ task = id && id[taskSymbol];
+ // other environments.
+ if (!task) {
+ task = id;
+ }
+ }
+ if (task && typeof task.type === 'string') {
+ if (task.state !== 'notScheduled' &&
+ (task.cancelFn && task.data.isPeriodic || task.runCount === 0)) {
+ if (typeof id === 'number') {
+ delete tasksByHandleId[id];
+ }
+ else if (id) {
+ id[taskSymbol] = null;
+ }
+ // Do not cancel already canceled functions
+ task.zone.cancelTask(task);
+ }
+ }
+ else {
+ // cause an error by calling it directly.
+ delegate.apply(window, args);
+ }
+ }; });
+ }
+ /**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+ function patchCustomElements(_global, api) {
+ var _a = api.getGlobalObjects(), isBrowser = _a.isBrowser, isMix = _a.isMix;
+ if ((!isBrowser && !isMix) || !_global['customElements'] || !('customElements' in _global)) {
+ return;
+ }
+ var callbacks = ['connectedCallback', 'disconnectedCallback', 'adoptedCallback', 'attributeChangedCallback'];
+ api.patchCallbacks(api, _global.customElements, 'customElements', 'define', callbacks);
+ }
+ /**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+ function eventTargetPatch(_global, api) {
+ if (Zone[api.symbol('patchEventTarget')]) {
+ // EventTarget is already patched.
+ return;
+ }
+ var _a = api.getGlobalObjects(), eventNames = _a.eventNames, zoneSymbolEventNames = _a.zoneSymbolEventNames, TRUE_STR = _a.TRUE_STR, FALSE_STR = _a.FALSE_STR, ZONE_SYMBOL_PREFIX = _a.ZONE_SYMBOL_PREFIX;
+ // predefine all __zone_symbol__ + eventName + true/false string
+ for (var i = 0; i < eventNames.length; i++) {
+ var eventName = eventNames[i];
+ var falseEventName = eventName + FALSE_STR;
+ var trueEventName = eventName + TRUE_STR;
+ var symbol = ZONE_SYMBOL_PREFIX + falseEventName;
+ var symbolCapture = ZONE_SYMBOL_PREFIX + trueEventName;
+ zoneSymbolEventNames[eventName] = {};
+ zoneSymbolEventNames[eventName][FALSE_STR] = symbol;
+ zoneSymbolEventNames[eventName][TRUE_STR] = symbolCapture;
+ }
+ var EVENT_TARGET = _global['EventTarget'];
+ if (!EVENT_TARGET || !EVENT_TARGET.prototype) {
+ return;
+ }
+ api.patchEventTarget(_global, [EVENT_TARGET && EVENT_TARGET.prototype]);
+ return true;
+ }
+ function patchEvent(global, api) {
+ api.patchEventPrototype(global, api);
+ }
+ /**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+ Zone.__load_patch('legacy', function (global) {
+ var legacyPatch = global[Zone.__symbol__('legacyPatch')];
+ if (legacyPatch) {
+ legacyPatch();
+ }
+ });
+ Zone.__load_patch('queueMicrotask', function (global, Zone, api) {
+ api.patchMethod(global, 'queueMicrotask', function (delegate) {
+ return function (self, args) {
+ Zone.current.scheduleMicroTask('queueMicrotask', args[0]);
+ };
+ });
+ });
+ Zone.__load_patch('timers', function (global) {
+ var set = 'set';
+ var clear = 'clear';
+ patchTimer(global, set, clear, 'Timeout');
+ patchTimer(global, set, clear, 'Interval');
+ patchTimer(global, set, clear, 'Immediate');
+ });
+ Zone.__load_patch('requestAnimationFrame', function (global) {
+ patchTimer(global, 'request', 'cancel', 'AnimationFrame');
+ patchTimer(global, 'mozRequest', 'mozCancel', 'AnimationFrame');
+ patchTimer(global, 'webkitRequest', 'webkitCancel', 'AnimationFrame');
+ });
+ Zone.__load_patch('blocking', function (global, Zone) {
+ var blockingMethods = ['alert', 'prompt', 'confirm'];
+ for (var i = 0; i < blockingMethods.length; i++) {
+ var name_2 = blockingMethods[i];
+ patchMethod(global, name_2, function (delegate, symbol, name) {
+ return function (s, args) {
+ return Zone.current.run(delegate, global, args, name);
+ };
+ });
+ }
+ });
+ Zone.__load_patch('EventTarget', function (global, Zone, api) {
+ patchEvent(global, api);
+ eventTargetPatch(global, api);
+ // patch XMLHttpRequestEventTarget's addEventListener/removeEventListener
+ var XMLHttpRequestEventTarget = global['XMLHttpRequestEventTarget'];
+ if (XMLHttpRequestEventTarget && XMLHttpRequestEventTarget.prototype) {
+ api.patchEventTarget(global, [XMLHttpRequestEventTarget.prototype]);
+ }
+ });
+ Zone.__load_patch('MutationObserver', function (global, Zone, api) {
+ patchClass('MutationObserver');
+ patchClass('WebKitMutationObserver');
+ });
+ Zone.__load_patch('IntersectionObserver', function (global, Zone, api) {
+ patchClass('IntersectionObserver');
+ });
+ Zone.__load_patch('FileReader', function (global, Zone, api) {
+ patchClass('FileReader');
+ });
+ Zone.__load_patch('on_property', function (global, Zone, api) {
+ propertyDescriptorPatch(api, global);
+ });
+ Zone.__load_patch('customElements', function (global, Zone, api) {
+ patchCustomElements(global, api);
+ });
+ Zone.__load_patch('XHR', function (global, Zone) {
+ // Treat XMLHttpRequest as a macrotask.
+ patchXHR(global);
+ var XHR_TASK = zoneSymbol('xhrTask');
+ var XHR_SYNC = zoneSymbol('xhrSync');
+ var XHR_LISTENER = zoneSymbol('xhrListener');
+ var XHR_SCHEDULED = zoneSymbol('xhrScheduled');
+ var XHR_URL = zoneSymbol('xhrURL');
+ var XHR_ERROR_BEFORE_SCHEDULED = zoneSymbol('xhrErrorBeforeScheduled');
+ function patchXHR(window) {
+ var XMLHttpRequest = window['XMLHttpRequest'];
+ if (!XMLHttpRequest) {
+ // XMLHttpRequest is not available in service worker
+ return;
+ }
+ var XMLHttpRequestPrototype = XMLHttpRequest.prototype;
+ function findPendingTask(target) {
+ return target[XHR_TASK];
+ }
+ var oriAddListener = XMLHttpRequestPrototype[ZONE_SYMBOL_ADD_EVENT_LISTENER];
+ var oriRemoveListener = XMLHttpRequestPrototype[ZONE_SYMBOL_REMOVE_EVENT_LISTENER];
+ if (!oriAddListener) {
+ var XMLHttpRequestEventTarget_1 = window['XMLHttpRequestEventTarget'];
+ if (XMLHttpRequestEventTarget_1) {
+ var XMLHttpRequestEventTargetPrototype = XMLHttpRequestEventTarget_1.prototype;
+ oriAddListener = XMLHttpRequestEventTargetPrototype[ZONE_SYMBOL_ADD_EVENT_LISTENER];
+ oriRemoveListener = XMLHttpRequestEventTargetPrototype[ZONE_SYMBOL_REMOVE_EVENT_LISTENER];
+ }
+ }
+ var READY_STATE_CHANGE = 'readystatechange';
+ var SCHEDULED = 'scheduled';
+ function scheduleTask(task) {
+ var data = task.data;
+ var target = data.target;
+ target[XHR_SCHEDULED] = false;
+ target[XHR_ERROR_BEFORE_SCHEDULED] = false;
+ // remove existing event listener
+ var listener = target[XHR_LISTENER];
+ if (!oriAddListener) {
+ oriAddListener = target[ZONE_SYMBOL_ADD_EVENT_LISTENER];
+ oriRemoveListener = target[ZONE_SYMBOL_REMOVE_EVENT_LISTENER];
+ }
+ if (listener) {
+ oriRemoveListener.call(target, READY_STATE_CHANGE, listener);
+ }
+ var newListener = target[XHR_LISTENER] = function () {
+ if (target.readyState === target.DONE) {
+ // sometimes on some browsers XMLHttpRequest will fire onreadystatechange with
+ // readyState=4 multiple times, so we need to check task state here
+ if (!data.aborted && target[XHR_SCHEDULED] && task.state === SCHEDULED) {
+ // check whether the xhr has registered onload listener
+ // if that is the case, the task should invoke after all
+ // onload listeners finish.
+ // Also if the request failed without response (status = 0), the load event handler
+ // will not be triggered, in that case, we should also invoke the placeholder callback
+ // to close the XMLHttpRequest::send macroTask.
+ // https://github.com/angular/angular/issues/38795
+ var loadTasks = target[Zone.__symbol__('loadfalse')];
+ if (target.status !== 0 && loadTasks && loadTasks.length > 0) {
+ var oriInvoke_1 = task.invoke;
+ task.invoke = function () {
+ // need to load the tasks again, because in other
+ // load listener, they may remove themselves
+ var loadTasks = target[Zone.__symbol__('loadfalse')];
+ for (var i = 0; i < loadTasks.length; i++) {
+ if (loadTasks[i] === task) {
+ loadTasks.splice(i, 1);
+ }
+ }
+ if (!data.aborted && task.state === SCHEDULED) {
+ oriInvoke_1.call(task);
+ }
+ };
+ loadTasks.push(task);
+ }
+ else {
+ task.invoke();
+ }
+ }
+ else if (!data.aborted && target[XHR_SCHEDULED] === false) {
+ // error occurs when xhr.send()
+ target[XHR_ERROR_BEFORE_SCHEDULED] = true;
+ }
+ }
+ };
+ oriAddListener.call(target, READY_STATE_CHANGE, newListener);
+ var storedTask = target[XHR_TASK];
+ if (!storedTask) {
+ target[XHR_TASK] = task;
+ }
+ sendNative.apply(target, data.args);
+ target[XHR_SCHEDULED] = true;
+ return task;
+ }
+ function placeholderCallback() { }
+ function clearTask(task) {
+ var data = task.data;
+ // Note - ideally, we would call data.target.removeEventListener here, but it's too late
+ // to prevent it from firing. So instead, we store info for the event listener.
+ data.aborted = true;
+ return abortNative.apply(data.target, data.args);
+ }
+ var openNative = patchMethod(XMLHttpRequestPrototype, 'open', function () { return function (self, args) {
+ self[XHR_SYNC] = args[2] == false;
+ self[XHR_URL] = args[1];
+ return openNative.apply(self, args);
+ }; });
+ var XMLHTTPREQUEST_SOURCE = 'XMLHttpRequest.send';
+ var fetchTaskAborting = zoneSymbol('fetchTaskAborting');
+ var fetchTaskScheduling = zoneSymbol('fetchTaskScheduling');
+ var sendNative = patchMethod(XMLHttpRequestPrototype, 'send', function () { return function (self, args) {
+ if (Zone.current[fetchTaskScheduling] === true) {
+ // a fetch is scheduling, so we are using xhr to polyfill fetch
+ // and because we already schedule macroTask for fetch, we should
+ // not schedule a macroTask for xhr again
+ return sendNative.apply(self, args);
+ }
+ if (self[XHR_SYNC]) {
+ // if the XHR is sync there is no task to schedule, just execute the code.
+ return sendNative.apply(self, args);
+ }
+ else {
+ var options = { target: self, url: self[XHR_URL], isPeriodic: false, args: args, aborted: false };
+ var task = scheduleMacroTaskWithCurrentZone(XMLHTTPREQUEST_SOURCE, placeholderCallback, options, scheduleTask, clearTask);
+ if (self && self[XHR_ERROR_BEFORE_SCHEDULED] === true && !options.aborted &&
+ task.state === SCHEDULED) {
+ // xhr request throw error when send
+ // we should invoke task instead of leaving a scheduled
+ // pending macroTask
+ task.invoke();
+ }
+ }
+ }; });
+ var abortNative = patchMethod(XMLHttpRequestPrototype, 'abort', function () { return function (self, args) {
+ var task = findPendingTask(self);
+ if (task && typeof task.type == 'string') {
+ // If the XHR has already completed, do nothing.
+ // If the XHR has already been aborted, do nothing.
+ // Fix #569, call abort multiple times before done will cause
+ // macroTask task count be negative number
+ if (task.cancelFn == null || (task.data && task.data.aborted)) {
+ return;
+ }
+ task.zone.cancelTask(task);
+ }
+ else if (Zone.current[fetchTaskAborting] === true) {
+ // the abort is called from fetch polyfill, we need to call native abort of XHR.
+ return abortNative.apply(self, args);
+ }
+ // Otherwise, we are trying to abort an XHR which has not yet been sent, so there is no
+ // task
+ // to cancel. Do nothing.
+ }; });
+ }
+ });
+ Zone.__load_patch('geolocation', function (global) {
+ /// GEO_LOCATION
+ if (global['navigator'] && global['navigator'].geolocation) {
+ patchPrototype(global['navigator'].geolocation, ['getCurrentPosition', 'watchPosition']);
+ }
+ });
+ Zone.__load_patch('PromiseRejectionEvent', function (global, Zone) {
+ // handle unhandled promise rejection
+ function findPromiseRejectionHandler(evtName) {
+ return function (e) {
+ var eventTasks = findEventTasks(global, evtName);
+ eventTasks.forEach(function (eventTask) {
+ // windows has added unhandledrejection event listener
+ // trigger the event listener
+ var PromiseRejectionEvent = global['PromiseRejectionEvent'];
+ if (PromiseRejectionEvent) {
+ var evt = new PromiseRejectionEvent(evtName, { promise: e.promise, reason: e.rejection });
+ eventTask.invoke(evt);
+ }
+ });
+ };
+ }
+ if (global['PromiseRejectionEvent']) {
+ Zone[zoneSymbol('unhandledPromiseRejectionHandler')] =
+ findPromiseRejectionHandler('unhandledrejection');
+ Zone[zoneSymbol('rejectionHandledHandler')] =
+ findPromiseRejectionHandler('rejectionhandled');
+ }
+ });
+})));
+
+/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js")))
+
+/***/ }),
+
+/***/ "./src/popup/polyfills.ts":
+/*!********************************!*\
+ !*** ./src/popup/polyfills.ts ***!
+ \********************************/
+/*! no exports provided */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var core_js_stable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/stable */ "./node_modules/core-js/stable/index.js");
+/* harmony import */ var core_js_stable__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_stable__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var date_input_polyfill__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! date-input-polyfill */ "./node_modules/date-input-polyfill/date-input-polyfill.dist.js");
+/* harmony import */ var date_input_polyfill__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(date_input_polyfill__WEBPACK_IMPORTED_MODULE_1__);
+/* harmony import */ var web_animations_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! web-animations-js */ "./node_modules/web-animations-js/web-animations.min.js");
+/* harmony import */ var web_animations_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(web_animations_js__WEBPACK_IMPORTED_MODULE_2__);
+/* harmony import */ var zone_js_dist_zone__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! zone.js/dist/zone */ "./node_modules/zone.js/dist/zone.js");
+/* harmony import */ var zone_js_dist_zone__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(zone_js_dist_zone__WEBPACK_IMPORTED_MODULE_3__);
+/* tslint:disable */
+
+
+
+
+/* tslint:enable */
+
+
+/***/ })
+
+/******/ });
\ No newline at end of file
diff --git a/src/iOS.Safari/Resources/popup/vendor-angular.js b/src/iOS.Safari/Resources/popup/vendor-angular.js
new file mode 100644
index 000000000..f15ec62cd
--- /dev/null
+++ b/src/iOS.Safari/Resources/popup/vendor-angular.js
@@ -0,0 +1,74620 @@
+(window["webpackJsonp"] = window["webpackJsonp"] || []).push([["popup/vendor-angular"],{
+
+/***/ "./node_modules/@angular/animations/__ivy_ngcc__/fesm2015/animations.js":
+/*!******************************************************************************!*\
+ !*** ./node_modules/@angular/animations/__ivy_ngcc__/fesm2015/animations.js ***!
+ \******************************************************************************/
+/*! exports provided: AUTO_STYLE, AnimationBuilder, AnimationFactory, NoopAnimationPlayer, animate, animateChild, animation, group, keyframes, query, sequence, stagger, state, style, transition, trigger, useAnimation, ɵAnimationGroupPlayer, ɵPRE_STYLE */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AUTO_STYLE", function() { return AUTO_STYLE; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AnimationBuilder", function() { return AnimationBuilder; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AnimationFactory", function() { return AnimationFactory; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "NoopAnimationPlayer", function() { return NoopAnimationPlayer; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "animate", function() { return animate; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "animateChild", function() { return animateChild; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "animation", function() { return animation; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "group", function() { return group; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "keyframes", function() { return keyframes; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "query", function() { return query; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sequence", function() { return sequence; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "stagger", function() { return stagger; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "state", function() { return state; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "style", function() { return style; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "transition", function() { return transition; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "trigger", function() { return trigger; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "useAnimation", function() { return useAnimation; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵAnimationGroupPlayer", function() { return AnimationGroupPlayer; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵPRE_STYLE", function() { return ɵPRE_STYLE; });
+/**
+ * @license Angular v11.2.14
+ * (c) 2010-2021 Google LLC. https://angular.io/
+ * License: MIT
+ */
+
+/**
+ * An injectable service that produces an animation sequence programmatically within an
+ * Angular component or directive.
+ * Provided by the `BrowserAnimationsModule` or `NoopAnimationsModule`.
+ *
+ * @usageNotes
+ *
+ * To use this service, add it to your component or directive as a dependency.
+ * The service is instantiated along with your component.
+ *
+ * Apps do not typically need to create their own animation players, but if you
+ * do need to, follow these steps:
+ *
+ * 1. Use the `build()` method to create a programmatic animation using the
+ * `animate()` function. The method returns an `AnimationFactory` instance.
+ *
+ * 2. Use the factory object to create an `AnimationPlayer` and attach it to a DOM element.
+ *
+ * 3. Use the player object to control the animation programmatically.
+ *
+ * For example:
+ *
+ * ```ts
+ * // import the service from BrowserAnimationsModule
+ * import {AnimationBuilder} from '@angular/animations';
+ * // require the service as a dependency
+ * class MyCmp {
+ * constructor(private _builder: AnimationBuilder) {}
+ *
+ * makeAnimation(element: any) {
+ * // first define a reusable animation
+ * const myAnimation = this._builder.build([
+ * style({ width: 0 }),
+ * animate(1000, style({ width: '100px' }))
+ * ]);
+ *
+ * // use the returned factory object to create a player
+ * const player = myAnimation.create(element);
+ *
+ * player.play();
+ * }
+ * }
+ * ```
+ *
+ * @publicApi
+ */
+class AnimationBuilder {
+}
+/**
+ * A factory object returned from the `AnimationBuilder`.`build()` method.
+ *
+ * @publicApi
+ */
+class AnimationFactory {
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * Specifies automatic styling.
+ *
+ * @publicApi
+ */
+const AUTO_STYLE = '*';
+/**
+ * Creates a named animation trigger, containing a list of `state()`
+ * and `transition()` entries to be evaluated when the expression
+ * bound to the trigger changes.
+ *
+ * @param name An identifying string.
+ * @param definitions An animation definition object, containing an array of `state()`
+ * and `transition()` declarations.
+ *
+ * @return An object that encapsulates the trigger data.
+ *
+ * @usageNotes
+ * Define an animation trigger in the `animations` section of `@Component` metadata.
+ * In the template, reference the trigger by name and bind it to a trigger expression that
+ * evaluates to a defined animation state, using the following format:
+ *
+ * `[@triggerName]="expression"`
+ *
+ * Animation trigger bindings convert all values to strings, and then match the
+ * previous and current values against any linked transitions.
+ * Booleans can be specified as `1` or `true` and `0` or `false`.
+ *
+ * ### Usage Example
+ *
+ * The following example creates an animation trigger reference based on the provided
+ * name value.
+ * The provided animation value is expected to be an array consisting of state and
+ * transition declarations.
+ *
+ * ```typescript
+ * @Component({
+ * selector: "my-component",
+ * templateUrl: "my-component-tpl.html",
+ * animations: [
+ * trigger("myAnimationTrigger", [
+ * state(...),
+ * state(...),
+ * transition(...),
+ * transition(...)
+ * ])
+ * ]
+ * })
+ * class MyComponent {
+ * myStatusExp = "something";
+ * }
+ * ```
+ *
+ * The template associated with this component makes use of the defined trigger
+ * by binding to an element within its template code.
+ *
+ * ```html
+ *
+ * ...
+ * ```
+ *
+ * ### Using an inline function
+ * The `transition` animation method also supports reading an inline function which can decide
+ * if its associated animation should be run.
+ *
+ * ```typescript
+ * // this method is run each time the `myAnimationTrigger` trigger value changes.
+ * function myInlineMatcherFn(fromState: string, toState: string, element: any, params: {[key:
+ string]: any}): boolean {
+ * // notice that `element` and `params` are also available here
+ * return toState == 'yes-please-animate';
+ * }
+ *
+ * @Component({
+ * selector: 'my-component',
+ * templateUrl: 'my-component-tpl.html',
+ * animations: [
+ * trigger('myAnimationTrigger', [
+ * transition(myInlineMatcherFn, [
+ * // the animation sequence code
+ * ]),
+ * ])
+ * ]
+ * })
+ * class MyComponent {
+ * myStatusExp = "yes-please-animate";
+ * }
+ * ```
+ *
+ * ### Disabling Animations
+ * When true, the special animation control binding `@.disabled` binding prevents
+ * all animations from rendering.
+ * Place the `@.disabled` binding on an element to disable
+ * animations on the element itself, as well as any inner animation triggers
+ * within the element.
+ *
+ * The following example shows how to use this feature:
+ *
+ * ```typescript
+ * @Component({
+ * selector: 'my-component',
+ * template: `
+ *
+ * `,
+ * animations: [
+ * trigger("childAnimation", [
+ * // ...
+ * ])
+ * ]
+ * })
+ * class MyComponent {
+ * isDisabled = true;
+ * exp = '...';
+ * }
+ * ```
+ *
+ * When `@.disabled` is true, it prevents the `@childAnimation` trigger from animating,
+ * along with any inner animations.
+ *
+ * ### Disable animations application-wide
+ * When an area of the template is set to have animations disabled,
+ * **all** inner components have their animations disabled as well.
+ * This means that you can disable all animations for an app
+ * by placing a host binding set on `@.disabled` on the topmost Angular component.
+ *
+ * ```typescript
+ * import {Component, HostBinding} from '@angular/core';
+ *
+ * @Component({
+ * selector: 'app-component',
+ * templateUrl: 'app.component.html',
+ * })
+ * class AppComponent {
+ * @HostBinding('@.disabled')
+ * public animationsDisabled = true;
+ * }
+ * ```
+ *
+ * ### Overriding disablement of inner animations
+ * Despite inner animations being disabled, a parent animation can `query()`
+ * for inner elements located in disabled areas of the template and still animate
+ * them if needed. This is also the case for when a sub animation is
+ * queried by a parent and then later animated using `animateChild()`.
+ *
+ * ### Detecting when an animation is disabled
+ * If a region of the DOM (or the entire application) has its animations disabled, the animation
+ * trigger callbacks still fire, but for zero seconds. When the callback fires, it provides
+ * an instance of an `AnimationEvent`. If animations are disabled,
+ * the `.disabled` flag on the event is true.
+ *
+ * @publicApi
+ */
+function trigger(name, definitions) {
+ return { type: 7 /* Trigger */, name, definitions, options: {} };
+}
+/**
+ * Defines an animation step that combines styling information with timing information.
+ *
+ * @param timings Sets `AnimateTimings` for the parent animation.
+ * A string in the format "duration [delay] [easing]".
+ * - Duration and delay are expressed as a number and optional time unit,
+ * such as "1s" or "10ms" for one second and 10 milliseconds, respectively.
+ * The default unit is milliseconds.
+ * - The easing value controls how the animation accelerates and decelerates
+ * during its runtime. Value is one of `ease`, `ease-in`, `ease-out`,
+ * `ease-in-out`, or a `cubic-bezier()` function call.
+ * If not supplied, no easing is applied.
+ *
+ * For example, the string "1s 100ms ease-out" specifies a duration of
+ * 1000 milliseconds, and delay of 100 ms, and the "ease-out" easing style,
+ * which decelerates near the end of the duration.
+ * @param styles Sets AnimationStyles for the parent animation.
+ * A function call to either `style()` or `keyframes()`
+ * that returns a collection of CSS style entries to be applied to the parent animation.
+ * When null, uses the styles from the destination state.
+ * This is useful when describing an animation step that will complete an animation;
+ * see "Animating to the final state" in `transitions()`.
+ * @returns An object that encapsulates the animation step.
+ *
+ * @usageNotes
+ * Call within an animation `sequence()`, `{@link animations/group group()}`, or
+ * `transition()` call to specify an animation step
+ * that applies given style data to the parent animation for a given amount of time.
+ *
+ * ### Syntax Examples
+ * **Timing examples**
+ *
+ * The following examples show various `timings` specifications.
+ * - `animate(500)` : Duration is 500 milliseconds.
+ * - `animate("1s")` : Duration is 1000 milliseconds.
+ * - `animate("100ms 0.5s")` : Duration is 100 milliseconds, delay is 500 milliseconds.
+ * - `animate("5s ease-in")` : Duration is 5000 milliseconds, easing in.
+ * - `animate("5s 10ms cubic-bezier(.17,.67,.88,.1)")` : Duration is 5000 milliseconds, delay is 10
+ * milliseconds, easing according to a bezier curve.
+ *
+ * **Style examples**
+ *
+ * The following example calls `style()` to set a single CSS style.
+ * ```typescript
+ * animate(500, style({ background: "red" }))
+ * ```
+ * The following example calls `keyframes()` to set a CSS style
+ * to different values for successive keyframes.
+ * ```typescript
+ * animate(500, keyframes(
+ * [
+ * style({ background: "blue" }),
+ * style({ background: "red" })
+ * ])
+ * ```
+ *
+ * @publicApi
+ */
+function animate(timings, styles = null) {
+ return { type: 4 /* Animate */, styles, timings };
+}
+/**
+ * @description Defines a list of animation steps to be run in parallel.
+ *
+ * @param steps An array of animation step objects.
+ * - When steps are defined by `style()` or `animate()`
+ * function calls, each call within the group is executed instantly.
+ * - To specify offset styles to be applied at a later time, define steps with
+ * `keyframes()`, or use `animate()` calls with a delay value.
+ * For example:
+ *
+ * ```typescript
+ * group([
+ * animate("1s", style({ background: "black" })),
+ * animate("2s", style({ color: "white" }))
+ * ])
+ * ```
+ *
+ * @param options An options object containing a delay and
+ * developer-defined parameters that provide styling defaults and
+ * can be overridden on invocation.
+ *
+ * @return An object that encapsulates the group data.
+ *
+ * @usageNotes
+ * Grouped animations are useful when a series of styles must be
+ * animated at different starting times and closed off at different ending times.
+ *
+ * When called within a `sequence()` or a
+ * `transition()` call, does not continue to the next
+ * instruction until all of the inner animation steps have completed.
+ *
+ * @publicApi
+ */
+function group(steps, options = null) {
+ return { type: 3 /* Group */, steps, options };
+}
+/**
+ * Defines a list of animation steps to be run sequentially, one by one.
+ *
+ * @param steps An array of animation step objects.
+ * - Steps defined by `style()` calls apply the styling data immediately.
+ * - Steps defined by `animate()` calls apply the styling data over time
+ * as specified by the timing data.
+ *
+ * ```typescript
+ * sequence([
+ * style({ opacity: 0 }),
+ * animate("1s", style({ opacity: 1 }))
+ * ])
+ * ```
+ *
+ * @param options An options object containing a delay and
+ * developer-defined parameters that provide styling defaults and
+ * can be overridden on invocation.
+ *
+ * @return An object that encapsulates the sequence data.
+ *
+ * @usageNotes
+ * When you pass an array of steps to a
+ * `transition()` call, the steps run sequentially by default.
+ * Compare this to the `{@link animations/group group()}` call, which runs animation steps in
+ *parallel.
+ *
+ * When a sequence is used within a `{@link animations/group group()}` or a `transition()` call,
+ * execution continues to the next instruction only after each of the inner animation
+ * steps have completed.
+ *
+ * @publicApi
+ **/
+function sequence(steps, options = null) {
+ return { type: 2 /* Sequence */, steps, options };
+}
+/**
+ * Declares a key/value object containing CSS properties/styles that
+ * can then be used for an animation `state`, within an animation `sequence`,
+ * or as styling data for calls to `animate()` and `keyframes()`.
+ *
+ * @param tokens A set of CSS styles or HTML styles associated with an animation state.
+ * The value can be any of the following:
+ * - A key-value style pair associating a CSS property with a value.
+ * - An array of key-value style pairs.
+ * - An asterisk (*), to use auto-styling, where styles are derived from the element
+ * being animated and applied to the animation when it starts.
+ *
+ * Auto-styling can be used to define a state that depends on layout or other
+ * environmental factors.
+ *
+ * @return An object that encapsulates the style data.
+ *
+ * @usageNotes
+ * The following examples create animation styles that collect a set of
+ * CSS property values:
+ *
+ * ```typescript
+ * // string values for CSS properties
+ * style({ background: "red", color: "blue" })
+ *
+ * // numerical pixel values
+ * style({ width: 100, height: 0 })
+ * ```
+ *
+ * The following example uses auto-styling to allow a component to animate from
+ * a height of 0 up to the height of the parent element:
+ *
+ * ```
+ * style({ height: 0 }),
+ * animate("1s", style({ height: "*" }))
+ * ```
+ *
+ * @publicApi
+ **/
+function style(tokens) {
+ return { type: 6 /* Style */, styles: tokens, offset: null };
+}
+/**
+ * Declares an animation state within a trigger attached to an element.
+ *
+ * @param name One or more names for the defined state in a comma-separated string.
+ * The following reserved state names can be supplied to define a style for specific use
+ * cases:
+ *
+ * - `void` You can associate styles with this name to be used when
+ * the element is detached from the application. For example, when an `ngIf` evaluates
+ * to false, the state of the associated element is void.
+ * - `*` (asterisk) Indicates the default state. You can associate styles with this name
+ * to be used as the fallback when the state that is being animated is not declared
+ * within the trigger.
+ *
+ * @param styles A set of CSS styles associated with this state, created using the
+ * `style()` function.
+ * This set of styles persists on the element once the state has been reached.
+ * @param options Parameters that can be passed to the state when it is invoked.
+ * 0 or more key-value pairs.
+ * @return An object that encapsulates the new state data.
+ *
+ * @usageNotes
+ * Use the `trigger()` function to register states to an animation trigger.
+ * Use the `transition()` function to animate between states.
+ * When a state is active within a component, its associated styles persist on the element,
+ * even when the animation ends.
+ *
+ * @publicApi
+ **/
+function state(name, styles, options) {
+ return { type: 0 /* State */, name, styles, options };
+}
+/**
+ * Defines a set of animation styles, associating each style with an optional `offset` value.
+ *
+ * @param steps A set of animation styles with optional offset data.
+ * The optional `offset` value for a style specifies a percentage of the total animation
+ * time at which that style is applied.
+ * @returns An object that encapsulates the keyframes data.
+ *
+ * @usageNotes
+ * Use with the `animate()` call. Instead of applying animations
+ * from the current state
+ * to the destination state, keyframes describe how each style entry is applied and at what point
+ * within the animation arc.
+ * Compare [CSS Keyframe Animations](https://www.w3schools.com/css/css3_animations.asp).
+ *
+ * ### Usage
+ *
+ * In the following example, the offset values describe
+ * when each `backgroundColor` value is applied. The color is red at the start, and changes to
+ * blue when 20% of the total time has elapsed.
+ *
+ * ```typescript
+ * // the provided offset values
+ * animate("5s", keyframes([
+ * style({ backgroundColor: "red", offset: 0 }),
+ * style({ backgroundColor: "blue", offset: 0.2 }),
+ * style({ backgroundColor: "orange", offset: 0.3 }),
+ * style({ backgroundColor: "black", offset: 1 })
+ * ]))
+ * ```
+ *
+ * If there are no `offset` values specified in the style entries, the offsets
+ * are calculated automatically.
+ *
+ * ```typescript
+ * animate("5s", keyframes([
+ * style({ backgroundColor: "red" }) // offset = 0
+ * style({ backgroundColor: "blue" }) // offset = 0.33
+ * style({ backgroundColor: "orange" }) // offset = 0.66
+ * style({ backgroundColor: "black" }) // offset = 1
+ * ]))
+ *```
+
+ * @publicApi
+ */
+function keyframes(steps) {
+ return { type: 5 /* Keyframes */, steps };
+}
+/**
+ * Declares an animation transition as a sequence of animation steps to run when a given
+ * condition is satisfied. The condition is a Boolean expression or function that compares
+ * the previous and current animation states, and returns true if this transition should occur.
+ * When the state criteria of a defined transition are met, the associated animation is
+ * triggered.
+ *
+ * @param stateChangeExpr A Boolean expression or function that compares the previous and current
+ * animation states, and returns true if this transition should occur. Note that "true" and "false"
+ * match 1 and 0, respectively. An expression is evaluated each time a state change occurs in the
+ * animation trigger element.
+ * The animation steps run when the expression evaluates to true.
+ *
+ * - A state-change string takes the form "state1 => state2", where each side is a defined animation
+ * state, or an asterix (*) to refer to a dynamic start or end state.
+ * - The expression string can contain multiple comma-separated statements;
+ * for example "state1 => state2, state3 => state4".
+ * - Special values `:enter` and `:leave` initiate a transition on the entry and exit states,
+ * equivalent to "void => *" and "* => void".
+ * - Special values `:increment` and `:decrement` initiate a transition when a numeric value has
+ * increased or decreased in value.
+ * - A function is executed each time a state change occurs in the animation trigger element.
+ * The animation steps run when the function returns true.
+ *
+ * @param steps One or more animation objects, as returned by the `animate()` or
+ * `sequence()` function, that form a transformation from one state to another.
+ * A sequence is used by default when you pass an array.
+ * @param options An options object that can contain a delay value for the start of the animation,
+ * and additional developer-defined parameters. Provided values for additional parameters are used
+ * as defaults, and override values can be passed to the caller on invocation.
+ * @returns An object that encapsulates the transition data.
+ *
+ * @usageNotes
+ * The template associated with a component binds an animation trigger to an element.
+ *
+ * ```HTML
+ *
+ * ...
+ * ```
+ *
+ * All transitions are defined within an animation trigger,
+ * along with named states that the transitions change to and from.
+ *
+ * ```typescript
+ * trigger("myAnimationTrigger", [
+ * // define states
+ * state("on", style({ background: "green" })),
+ * state("off", style({ background: "grey" })),
+ * ...]
+ * ```
+ *
+ * Note that when you call the `sequence()` function within a `{@link animations/group group()}`
+ * or a `transition()` call, execution does not continue to the next instruction
+ * until each of the inner animation steps have completed.
+ *
+ * ### Syntax examples
+ *
+ * The following examples define transitions between the two defined states (and default states),
+ * using various options:
+ *
+ * ```typescript
+ * // Transition occurs when the state value
+ * // bound to "myAnimationTrigger" changes from "on" to "off"
+ * transition("on => off", animate(500))
+ * // Run the same animation for both directions
+ * transition("on <=> off", animate(500))
+ * // Define multiple state-change pairs separated by commas
+ * transition("on => off, off => void", animate(500))
+ * ```
+ *
+ * ### Special values for state-change expressions
+ *
+ * - Catch-all state change for when an element is inserted into the page and the
+ * destination state is unknown:
+ *
+ * ```typescript
+ * transition("void => *", [
+ * style({ opacity: 0 }),
+ * animate(500)
+ * ])
+ * ```
+ *
+ * - Capture a state change between any states:
+ *
+ * `transition("* => *", animate("1s 0s"))`
+ *
+ * - Entry and exit transitions:
+ *
+ * ```typescript
+ * transition(":enter", [
+ * style({ opacity: 0 }),
+ * animate(500, style({ opacity: 1 }))
+ * ]),
+ * transition(":leave", [
+ * animate(500, style({ opacity: 0 }))
+ * ])
+ * ```
+ *
+ * - Use `:increment` and `:decrement` to initiate transitions:
+ *
+ * ```typescript
+ * transition(":increment", group([
+ * query(':enter', [
+ * style({ left: '100%' }),
+ * animate('0.5s ease-out', style('*'))
+ * ]),
+ * query(':leave', [
+ * animate('0.5s ease-out', style({ left: '-100%' }))
+ * ])
+ * ]))
+ *
+ * transition(":decrement", group([
+ * query(':enter', [
+ * style({ left: '100%' }),
+ * animate('0.5s ease-out', style('*'))
+ * ]),
+ * query(':leave', [
+ * animate('0.5s ease-out', style({ left: '-100%' }))
+ * ])
+ * ]))
+ * ```
+ *
+ * ### State-change functions
+ *
+ * Here is an example of a `fromState` specified as a state-change function that invokes an
+ * animation when true:
+ *
+ * ```typescript
+ * transition((fromState, toState) =>
+ * {
+ * return fromState == "off" && toState == "on";
+ * },
+ * animate("1s 0s"))
+ * ```
+ *
+ * ### Animating to the final state
+ *
+ * If the final step in a transition is a call to `animate()` that uses a timing value
+ * with no style data, that step is automatically considered the final animation arc,
+ * for the element to reach the final state. Angular automatically adds or removes
+ * CSS styles to ensure that the element is in the correct final state.
+ *
+ * The following example defines a transition that starts by hiding the element,
+ * then makes sure that it animates properly to whatever state is currently active for trigger:
+ *
+ * ```typescript
+ * transition("void => *", [
+ * style({ opacity: 0 }),
+ * animate(500)
+ * ])
+ * ```
+ * ### Boolean value matching
+ * If a trigger binding value is a Boolean, it can be matched using a transition expression
+ * that compares true and false or 1 and 0. For example:
+ *
+ * ```
+ * // in the template
+ * ...
+ * // in the component metadata
+ * trigger('openClose', [
+ * state('true', style({ height: '*' })),
+ * state('false', style({ height: '0px' })),
+ * transition('false <=> true', animate(500))
+ * ])
+ * ```
+ *
+ * @publicApi
+ **/
+function transition(stateChangeExpr, steps, options = null) {
+ return { type: 1 /* Transition */, expr: stateChangeExpr, animation: steps, options };
+}
+/**
+ * Produces a reusable animation that can be invoked in another animation or sequence,
+ * by calling the `useAnimation()` function.
+ *
+ * @param steps One or more animation objects, as returned by the `animate()`
+ * or `sequence()` function, that form a transformation from one state to another.
+ * A sequence is used by default when you pass an array.
+ * @param options An options object that can contain a delay value for the start of the
+ * animation, and additional developer-defined parameters.
+ * Provided values for additional parameters are used as defaults,
+ * and override values can be passed to the caller on invocation.
+ * @returns An object that encapsulates the animation data.
+ *
+ * @usageNotes
+ * The following example defines a reusable animation, providing some default parameter
+ * values.
+ *
+ * ```typescript
+ * var fadeAnimation = animation([
+ * style({ opacity: '{{ start }}' }),
+ * animate('{{ time }}',
+ * style({ opacity: '{{ end }}'}))
+ * ],
+ * { params: { time: '1000ms', start: 0, end: 1 }});
+ * ```
+ *
+ * The following invokes the defined animation with a call to `useAnimation()`,
+ * passing in override parameter values.
+ *
+ * ```js
+ * useAnimation(fadeAnimation, {
+ * params: {
+ * time: '2s',
+ * start: 1,
+ * end: 0
+ * }
+ * })
+ * ```
+ *
+ * If any of the passed-in parameter values are missing from this call,
+ * the default values are used. If one or more parameter values are missing before a step is
+ * animated, `useAnimation()` throws an error.
+ *
+ * @publicApi
+ */
+function animation(steps, options = null) {
+ return { type: 8 /* Reference */, animation: steps, options };
+}
+/**
+ * Executes a queried inner animation element within an animation sequence.
+ *
+ * @param options An options object that can contain a delay value for the start of the
+ * animation, and additional override values for developer-defined parameters.
+ * @return An object that encapsulates the child animation data.
+ *
+ * @usageNotes
+ * Each time an animation is triggered in Angular, the parent animation
+ * has priority and any child animations are blocked. In order
+ * for a child animation to run, the parent animation must query each of the elements
+ * containing child animations, and run them using this function.
+ *
+ * Note that this feature is designed to be used with `query()` and it will only work
+ * with animations that are assigned using the Angular animation library. CSS keyframes
+ * and transitions are not handled by this API.
+ *
+ * @publicApi
+ */
+function animateChild(options = null) {
+ return { type: 9 /* AnimateChild */, options };
+}
+/**
+ * Starts a reusable animation that is created using the `animation()` function.
+ *
+ * @param animation The reusable animation to start.
+ * @param options An options object that can contain a delay value for the start of
+ * the animation, and additional override values for developer-defined parameters.
+ * @return An object that contains the animation parameters.
+ *
+ * @publicApi
+ */
+function useAnimation(animation, options = null) {
+ return { type: 10 /* AnimateRef */, animation, options };
+}
+/**
+ * Finds one or more inner elements within the current element that is
+ * being animated within a sequence. Use with `animate()`.
+ *
+ * @param selector The element to query, or a set of elements that contain Angular-specific
+ * characteristics, specified with one or more of the following tokens.
+ * - `query(":enter")` or `query(":leave")` : Query for newly inserted/removed elements.
+ * - `query(":animating")` : Query all currently animating elements.
+ * - `query("@triggerName")` : Query elements that contain an animation trigger.
+ * - `query("@*")` : Query all elements that contain an animation triggers.
+ * - `query(":self")` : Include the current element into the animation sequence.
+ *
+ * @param animation One or more animation steps to apply to the queried element or elements.
+ * An array is treated as an animation sequence.
+ * @param options An options object. Use the 'limit' field to limit the total number of
+ * items to collect.
+ * @return An object that encapsulates the query data.
+ *
+ * @usageNotes
+ * Tokens can be merged into a combined query selector string. For example:
+ *
+ * ```typescript
+ * query(':self, .record:enter, .record:leave, @subTrigger', [...])
+ * ```
+ *
+ * The `query()` function collects multiple elements and works internally by using
+ * `element.querySelectorAll`. Use the `limit` field of an options object to limit
+ * the total number of items to be collected. For example:
+ *
+ * ```js
+ * query('div', [
+ * animate(...),
+ * animate(...)
+ * ], { limit: 1 })
+ * ```
+ *
+ * By default, throws an error when zero items are found. Set the
+ * `optional` flag to ignore this error. For example:
+ *
+ * ```js
+ * query('.some-element-that-may-not-be-there', [
+ * animate(...),
+ * animate(...)
+ * ], { optional: true })
+ * ```
+ *
+ * ### Usage Example
+ *
+ * The following example queries for inner elements and animates them
+ * individually using `animate()`.
+ *
+ * ```typescript
+ * @Component({
+ * selector: 'inner',
+ * template: `
+ *
+ *
Title
+ *
+ * Blah blah blah
+ *
+ *
+ * `,
+ * animations: [
+ * trigger('queryAnimation', [
+ * transition('* => goAnimate', [
+ * // hide the inner elements
+ * query('h1', style({ opacity: 0 })),
+ * query('.content', style({ opacity: 0 })),
+ *
+ * // animate the inner elements in, one by one
+ * query('h1', animate(1000, style({ opacity: 1 }))),
+ * query('.content', animate(1000, style({ opacity: 1 }))),
+ * ])
+ * ])
+ * ]
+ * })
+ * class Cmp {
+ * exp = '';
+ *
+ * goAnimate() {
+ * this.exp = 'goAnimate';
+ * }
+ * }
+ * ```
+ *
+ * @publicApi
+ */
+function query(selector, animation, options = null) {
+ return { type: 11 /* Query */, selector, animation, options };
+}
+/**
+ * Use within an animation `query()` call to issue a timing gap after
+ * each queried item is animated.
+ *
+ * @param timings A delay value.
+ * @param animation One ore more animation steps.
+ * @returns An object that encapsulates the stagger data.
+ *
+ * @usageNotes
+ * In the following example, a container element wraps a list of items stamped out
+ * by an `ngFor`. The container element contains an animation trigger that will later be set
+ * to query for each of the inner items.
+ *
+ * Each time items are added, the opacity fade-in animation runs,
+ * and each removed item is faded out.
+ * When either of these animations occur, the stagger effect is
+ * applied after each item's animation is started.
+ *
+ * ```html
+ *
+ *
+ *
+ *
+ *
+ * {{ item }}
+ *
+ *
+ * ```
+ *
+ * Here is the component code:
+ *
+ * ```typescript
+ * import {trigger, transition, style, animate, query, stagger} from '@angular/animations';
+ * @Component({
+ * templateUrl: 'list.component.html',
+ * animations: [
+ * trigger('listAnimation', [
+ * ...
+ * ])
+ * ]
+ * })
+ * class ListComponent {
+ * items = [];
+ *
+ * showItems() {
+ * this.items = [0,1,2,3,4];
+ * }
+ *
+ * hideItems() {
+ * this.items = [];
+ * }
+ *
+ * toggle() {
+ * this.items.length ? this.hideItems() : this.showItems();
+ * }
+ * }
+ * ```
+ *
+ * Here is the animation trigger code:
+ *
+ * ```typescript
+ * trigger('listAnimation', [
+ * transition('* => *', [ // each time the binding value changes
+ * query(':leave', [
+ * stagger(100, [
+ * animate('0.5s', style({ opacity: 0 }))
+ * ])
+ * ]),
+ * query(':enter', [
+ * style({ opacity: 0 }),
+ * stagger(100, [
+ * animate('0.5s', style({ opacity: 1 }))
+ * ])
+ * ])
+ * ])
+ * ])
+ * ```
+ *
+ * @publicApi
+ */
+function stagger(timings, animation) {
+ return { type: 12 /* Stagger */, timings, animation };
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+function scheduleMicroTask(cb) {
+ Promise.resolve(null).then(cb);
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * An empty programmatic controller for reusable animations.
+ * Used internally when animations are disabled, to avoid
+ * checking for the null case when an animation player is expected.
+ *
+ * @see `animate()`
+ * @see `AnimationPlayer`
+ * @see `GroupPlayer`
+ *
+ * @publicApi
+ */
+class NoopAnimationPlayer {
+ constructor(duration = 0, delay = 0) {
+ this._onDoneFns = [];
+ this._onStartFns = [];
+ this._onDestroyFns = [];
+ this._started = false;
+ this._destroyed = false;
+ this._finished = false;
+ this._position = 0;
+ this.parentPlayer = null;
+ this.totalTime = duration + delay;
+ }
+ _onFinish() {
+ if (!this._finished) {
+ this._finished = true;
+ this._onDoneFns.forEach(fn => fn());
+ this._onDoneFns = [];
+ }
+ }
+ onStart(fn) {
+ this._onStartFns.push(fn);
+ }
+ onDone(fn) {
+ this._onDoneFns.push(fn);
+ }
+ onDestroy(fn) {
+ this._onDestroyFns.push(fn);
+ }
+ hasStarted() {
+ return this._started;
+ }
+ init() { }
+ play() {
+ if (!this.hasStarted()) {
+ this._onStart();
+ this.triggerMicrotask();
+ }
+ this._started = true;
+ }
+ /** @internal */
+ triggerMicrotask() {
+ scheduleMicroTask(() => this._onFinish());
+ }
+ _onStart() {
+ this._onStartFns.forEach(fn => fn());
+ this._onStartFns = [];
+ }
+ pause() { }
+ restart() { }
+ finish() {
+ this._onFinish();
+ }
+ destroy() {
+ if (!this._destroyed) {
+ this._destroyed = true;
+ if (!this.hasStarted()) {
+ this._onStart();
+ }
+ this.finish();
+ this._onDestroyFns.forEach(fn => fn());
+ this._onDestroyFns = [];
+ }
+ }
+ reset() { }
+ setPosition(position) {
+ this._position = this.totalTime ? position * this.totalTime : 1;
+ }
+ getPosition() {
+ return this.totalTime ? this._position / this.totalTime : 1;
+ }
+ /** @internal */
+ triggerCallback(phaseName) {
+ const methods = phaseName == 'start' ? this._onStartFns : this._onDoneFns;
+ methods.forEach(fn => fn());
+ methods.length = 0;
+ }
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * A programmatic controller for a group of reusable animations.
+ * Used internally to control animations.
+ *
+ * @see `AnimationPlayer`
+ * @see `{@link animations/group group()}`
+ *
+ */
+class AnimationGroupPlayer {
+ constructor(_players) {
+ this._onDoneFns = [];
+ this._onStartFns = [];
+ this._finished = false;
+ this._started = false;
+ this._destroyed = false;
+ this._onDestroyFns = [];
+ this.parentPlayer = null;
+ this.totalTime = 0;
+ this.players = _players;
+ let doneCount = 0;
+ let destroyCount = 0;
+ let startCount = 0;
+ const total = this.players.length;
+ if (total == 0) {
+ scheduleMicroTask(() => this._onFinish());
+ }
+ else {
+ this.players.forEach(player => {
+ player.onDone(() => {
+ if (++doneCount == total) {
+ this._onFinish();
+ }
+ });
+ player.onDestroy(() => {
+ if (++destroyCount == total) {
+ this._onDestroy();
+ }
+ });
+ player.onStart(() => {
+ if (++startCount == total) {
+ this._onStart();
+ }
+ });
+ });
+ }
+ this.totalTime = this.players.reduce((time, player) => Math.max(time, player.totalTime), 0);
+ }
+ _onFinish() {
+ if (!this._finished) {
+ this._finished = true;
+ this._onDoneFns.forEach(fn => fn());
+ this._onDoneFns = [];
+ }
+ }
+ init() {
+ this.players.forEach(player => player.init());
+ }
+ onStart(fn) {
+ this._onStartFns.push(fn);
+ }
+ _onStart() {
+ if (!this.hasStarted()) {
+ this._started = true;
+ this._onStartFns.forEach(fn => fn());
+ this._onStartFns = [];
+ }
+ }
+ onDone(fn) {
+ this._onDoneFns.push(fn);
+ }
+ onDestroy(fn) {
+ this._onDestroyFns.push(fn);
+ }
+ hasStarted() {
+ return this._started;
+ }
+ play() {
+ if (!this.parentPlayer) {
+ this.init();
+ }
+ this._onStart();
+ this.players.forEach(player => player.play());
+ }
+ pause() {
+ this.players.forEach(player => player.pause());
+ }
+ restart() {
+ this.players.forEach(player => player.restart());
+ }
+ finish() {
+ this._onFinish();
+ this.players.forEach(player => player.finish());
+ }
+ destroy() {
+ this._onDestroy();
+ }
+ _onDestroy() {
+ if (!this._destroyed) {
+ this._destroyed = true;
+ this._onFinish();
+ this.players.forEach(player => player.destroy());
+ this._onDestroyFns.forEach(fn => fn());
+ this._onDestroyFns = [];
+ }
+ }
+ reset() {
+ this.players.forEach(player => player.reset());
+ this._destroyed = false;
+ this._finished = false;
+ this._started = false;
+ }
+ setPosition(p) {
+ const timeAtPosition = p * this.totalTime;
+ this.players.forEach(player => {
+ const position = player.totalTime ? Math.min(1, timeAtPosition / player.totalTime) : 1;
+ player.setPosition(position);
+ });
+ }
+ getPosition() {
+ const longestPlayer = this.players.reduce((longestSoFar, player) => {
+ const newPlayerIsLongest = longestSoFar === null || player.totalTime > longestSoFar.totalTime;
+ return newPlayerIsLongest ? player : longestSoFar;
+ }, null);
+ return longestPlayer != null ? longestPlayer.getPosition() : 0;
+ }
+ beforeDestroy() {
+ this.players.forEach(player => {
+ if (player.beforeDestroy) {
+ player.beforeDestroy();
+ }
+ });
+ }
+ /** @internal */
+ triggerCallback(phaseName) {
+ const methods = phaseName == 'start' ? this._onStartFns : this._onDoneFns;
+ methods.forEach(fn => fn());
+ methods.length = 0;
+ }
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+const ɵPRE_STYLE = '!';
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+
+/**
+ * Generated bundle index. Do not edit.
+ */
+
+
+
+//# sourceMappingURL=animations.js.map
+
+/***/ }),
+
+/***/ "./node_modules/@angular/animations/__ivy_ngcc__/fesm2015/browser.js":
+/*!***************************************************************************!*\
+ !*** ./node_modules/@angular/animations/__ivy_ngcc__/fesm2015/browser.js ***!
+ \***************************************************************************/
+/*! exports provided: AnimationDriver, ɵAnimation, ɵAnimationEngine, ɵAnimationStyleNormalizer, ɵCssKeyframesDriver, ɵCssKeyframesPlayer, ɵNoopAnimationDriver, ɵNoopAnimationStyleNormalizer, ɵWebAnimationsDriver, ɵWebAnimationsPlayer, ɵWebAnimationsStyleNormalizer, ɵallowPreviousPlayerStylesMerge, ɵangular_packages_animations_browser_browser_a, ɵcontainsElement, ɵinvokeQuery, ɵmatchesElement, ɵsupportsWebAnimations, ɵvalidateStyleProperty */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* WEBPACK VAR INJECTION */(function(process) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AnimationDriver", function() { return AnimationDriver; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵAnimation", function() { return Animation; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵAnimationEngine", function() { return AnimationEngine; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵAnimationStyleNormalizer", function() { return AnimationStyleNormalizer; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵCssKeyframesDriver", function() { return CssKeyframesDriver; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵCssKeyframesPlayer", function() { return CssKeyframesPlayer; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵNoopAnimationDriver", function() { return NoopAnimationDriver; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵNoopAnimationStyleNormalizer", function() { return NoopAnimationStyleNormalizer; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵWebAnimationsDriver", function() { return WebAnimationsDriver; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵWebAnimationsPlayer", function() { return WebAnimationsPlayer; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵWebAnimationsStyleNormalizer", function() { return WebAnimationsStyleNormalizer; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵallowPreviousPlayerStylesMerge", function() { return allowPreviousPlayerStylesMerge; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵangular_packages_animations_browser_browser_a", function() { return SpecialCasedStyles; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵcontainsElement", function() { return containsElement; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵinvokeQuery", function() { return invokeQuery; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵmatchesElement", function() { return matchesElement; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵsupportsWebAnimations", function() { return supportsWebAnimations; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵvalidateStyleProperty", function() { return validateStyleProperty; });
+/* harmony import */ var _angular_animations__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/animations */ "./node_modules/@angular/animations/__ivy_ngcc__/fesm2015/animations.js");
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/**
+ * @license Angular v11.2.14
+ * (c) 2010-2021 Google LLC. https://angular.io/
+ * License: MIT
+ */
+
+
+
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+
+function isBrowser() {
+ return (typeof window !== 'undefined' && typeof window.document !== 'undefined');
+}
+function isNode() {
+ // Checking only for `process` isn't enough to identify whether or not we're in a Node
+ // environment, because Webpack by default will polyfill the `process`. While we can discern
+ // that Webpack polyfilled it by looking at `process.browser`, it's very Webpack-specific and
+ // might not be future-proof. Instead we look at the stringified version of `process` which
+ // is `[object process]` in Node and `[object Object]` when polyfilled.
+ return typeof process !== 'undefined' && {}.toString.call(process) === '[object process]';
+}
+function optimizeGroupPlayer(players) {
+ switch (players.length) {
+ case 0:
+ return new _angular_animations__WEBPACK_IMPORTED_MODULE_0__["NoopAnimationPlayer"]();
+ case 1:
+ return players[0];
+ default:
+ return new _angular_animations__WEBPACK_IMPORTED_MODULE_0__["ɵAnimationGroupPlayer"](players);
+ }
+}
+function normalizeKeyframes(driver, normalizer, element, keyframes, preStyles = {}, postStyles = {}) {
+ const errors = [];
+ const normalizedKeyframes = [];
+ let previousOffset = -1;
+ let previousKeyframe = null;
+ keyframes.forEach(kf => {
+ const offset = kf['offset'];
+ const isSameOffset = offset == previousOffset;
+ const normalizedKeyframe = (isSameOffset && previousKeyframe) || {};
+ Object.keys(kf).forEach(prop => {
+ let normalizedProp = prop;
+ let normalizedValue = kf[prop];
+ if (prop !== 'offset') {
+ normalizedProp = normalizer.normalizePropertyName(normalizedProp, errors);
+ switch (normalizedValue) {
+ case _angular_animations__WEBPACK_IMPORTED_MODULE_0__["ɵPRE_STYLE"]:
+ normalizedValue = preStyles[prop];
+ break;
+ case _angular_animations__WEBPACK_IMPORTED_MODULE_0__["AUTO_STYLE"]:
+ normalizedValue = postStyles[prop];
+ break;
+ default:
+ normalizedValue =
+ normalizer.normalizeStyleValue(prop, normalizedProp, normalizedValue, errors);
+ break;
+ }
+ }
+ normalizedKeyframe[normalizedProp] = normalizedValue;
+ });
+ if (!isSameOffset) {
+ normalizedKeyframes.push(normalizedKeyframe);
+ }
+ previousKeyframe = normalizedKeyframe;
+ previousOffset = offset;
+ });
+ if (errors.length) {
+ const LINE_START = '\n - ';
+ throw new Error(`Unable to animate due to the following errors:${LINE_START}${errors.join(LINE_START)}`);
+ }
+ return normalizedKeyframes;
+}
+function listenOnPlayer(player, eventName, event, callback) {
+ switch (eventName) {
+ case 'start':
+ player.onStart(() => callback(event && copyAnimationEvent(event, 'start', player)));
+ break;
+ case 'done':
+ player.onDone(() => callback(event && copyAnimationEvent(event, 'done', player)));
+ break;
+ case 'destroy':
+ player.onDestroy(() => callback(event && copyAnimationEvent(event, 'destroy', player)));
+ break;
+ }
+}
+function copyAnimationEvent(e, phaseName, player) {
+ const totalTime = player.totalTime;
+ const disabled = player.disabled ? true : false;
+ const event = makeAnimationEvent(e.element, e.triggerName, e.fromState, e.toState, phaseName || e.phaseName, totalTime == undefined ? e.totalTime : totalTime, disabled);
+ const data = e['_data'];
+ if (data != null) {
+ event['_data'] = data;
+ }
+ return event;
+}
+function makeAnimationEvent(element, triggerName, fromState, toState, phaseName = '', totalTime = 0, disabled) {
+ return { element, triggerName, fromState, toState, phaseName, totalTime, disabled: !!disabled };
+}
+function getOrSetAsInMap(map, key, defaultValue) {
+ let value;
+ if (map instanceof Map) {
+ value = map.get(key);
+ if (!value) {
+ map.set(key, value = defaultValue);
+ }
+ }
+ else {
+ value = map[key];
+ if (!value) {
+ value = map[key] = defaultValue;
+ }
+ }
+ return value;
+}
+function parseTimelineCommand(command) {
+ const separatorPos = command.indexOf(':');
+ const id = command.substring(1, separatorPos);
+ const action = command.substr(separatorPos + 1);
+ return [id, action];
+}
+let _contains = (elm1, elm2) => false;
+const ɵ0 = _contains;
+let _matches = (element, selector) => false;
+const ɵ1 = _matches;
+let _query = (element, selector, multi) => {
+ return [];
+};
+const ɵ2 = _query;
+// Define utility methods for browsers and platform-server(domino) where Element
+// and utility methods exist.
+const _isNode = isNode();
+if (_isNode || typeof Element !== 'undefined') {
+ // this is well supported in all browsers
+ _contains = (elm1, elm2) => {
+ return elm1.contains(elm2);
+ };
+ _matches = (() => {
+ if (_isNode || Element.prototype.matches) {
+ return (element, selector) => element.matches(selector);
+ }
+ else {
+ const proto = Element.prototype;
+ const fn = proto.matchesSelector || proto.mozMatchesSelector || proto.msMatchesSelector ||
+ proto.oMatchesSelector || proto.webkitMatchesSelector;
+ if (fn) {
+ return (element, selector) => fn.apply(element, [selector]);
+ }
+ else {
+ return _matches;
+ }
+ }
+ })();
+ _query = (element, selector, multi) => {
+ let results = [];
+ if (multi) {
+ // DO NOT REFACTOR TO USE SPREAD SYNTAX.
+ // For element queries that return sufficiently large NodeList objects,
+ // using spread syntax to populate the results array causes a RangeError
+ // due to the call stack limit being reached. `Array.from` can not be used
+ // as well, since NodeList is not iterable in IE 11, see
+ // https://developer.mozilla.org/en-US/docs/Web/API/NodeList
+ // More info is available in #38551.
+ const elems = element.querySelectorAll(selector);
+ for (let i = 0; i < elems.length; i++) {
+ results.push(elems[i]);
+ }
+ }
+ else {
+ const elm = element.querySelector(selector);
+ if (elm) {
+ results.push(elm);
+ }
+ }
+ return results;
+ };
+}
+function containsVendorPrefix(prop) {
+ // Webkit is the only real popular vendor prefix nowadays
+ // cc: http://shouldiprefix.com/
+ return prop.substring(1, 6) == 'ebkit'; // webkit or Webkit
+}
+let _CACHED_BODY = null;
+let _IS_WEBKIT = false;
+function validateStyleProperty(prop) {
+ if (!_CACHED_BODY) {
+ _CACHED_BODY = getBodyNode() || {};
+ _IS_WEBKIT = _CACHED_BODY.style ? ('WebkitAppearance' in _CACHED_BODY.style) : false;
+ }
+ let result = true;
+ if (_CACHED_BODY.style && !containsVendorPrefix(prop)) {
+ result = prop in _CACHED_BODY.style;
+ if (!result && _IS_WEBKIT) {
+ const camelProp = 'Webkit' + prop.charAt(0).toUpperCase() + prop.substr(1);
+ result = camelProp in _CACHED_BODY.style;
+ }
+ }
+ return result;
+}
+function getBodyNode() {
+ if (typeof document != 'undefined') {
+ return document.body;
+ }
+ return null;
+}
+const matchesElement = _matches;
+const containsElement = _contains;
+const invokeQuery = _query;
+function hypenatePropsObject(object) {
+ const newObj = {};
+ Object.keys(object).forEach(prop => {
+ const newProp = prop.replace(/([a-z])([A-Z])/g, '$1-$2');
+ newObj[newProp] = object[prop];
+ });
+ return newObj;
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * @publicApi
+ */
+class NoopAnimationDriver {
+ validateStyleProperty(prop) {
+ return validateStyleProperty(prop);
+ }
+ matchesElement(element, selector) {
+ return matchesElement(element, selector);
+ }
+ containsElement(elm1, elm2) {
+ return containsElement(elm1, elm2);
+ }
+ query(element, selector, multi) {
+ return invokeQuery(element, selector, multi);
+ }
+ computeStyle(element, prop, defaultValue) {
+ return defaultValue || '';
+ }
+ animate(element, keyframes, duration, delay, easing, previousPlayers = [], scrubberAccessRequested) {
+ return new _angular_animations__WEBPACK_IMPORTED_MODULE_0__["NoopAnimationPlayer"](duration, delay);
+ }
+}
+NoopAnimationDriver.ɵfac = function NoopAnimationDriver_Factory(t) { return new (t || NoopAnimationDriver)(); };
+NoopAnimationDriver.ɵprov = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdefineInjectable"]({ token: NoopAnimationDriver, factory: NoopAnimationDriver.ɵfac });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵsetClassMetadata"](NoopAnimationDriver, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Injectable"]
+ }], null, null); })();
+/**
+ * @publicApi
+ */
+class AnimationDriver {
+}
+AnimationDriver.NOOP = new NoopAnimationDriver();
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+const ONE_SECOND = 1000;
+const SUBSTITUTION_EXPR_START = '{{';
+const SUBSTITUTION_EXPR_END = '}}';
+const ENTER_CLASSNAME = 'ng-enter';
+const LEAVE_CLASSNAME = 'ng-leave';
+const ENTER_SELECTOR = '.ng-enter';
+const LEAVE_SELECTOR = '.ng-leave';
+const NG_TRIGGER_CLASSNAME = 'ng-trigger';
+const NG_TRIGGER_SELECTOR = '.ng-trigger';
+const NG_ANIMATING_CLASSNAME = 'ng-animating';
+const NG_ANIMATING_SELECTOR = '.ng-animating';
+function resolveTimingValue(value) {
+ if (typeof value == 'number')
+ return value;
+ const matches = value.match(/^(-?[\.\d]+)(m?s)/);
+ if (!matches || matches.length < 2)
+ return 0;
+ return _convertTimeValueToMS(parseFloat(matches[1]), matches[2]);
+}
+function _convertTimeValueToMS(value, unit) {
+ switch (unit) {
+ case 's':
+ return value * ONE_SECOND;
+ default: // ms or something else
+ return value;
+ }
+}
+function resolveTiming(timings, errors, allowNegativeValues) {
+ return timings.hasOwnProperty('duration') ?
+ timings :
+ parseTimeExpression(timings, errors, allowNegativeValues);
+}
+function parseTimeExpression(exp, errors, allowNegativeValues) {
+ const regex = /^(-?[\.\d]+)(m?s)(?:\s+(-?[\.\d]+)(m?s))?(?:\s+([-a-z]+(?:\(.+?\))?))?$/i;
+ let duration;
+ let delay = 0;
+ let easing = '';
+ if (typeof exp === 'string') {
+ const matches = exp.match(regex);
+ if (matches === null) {
+ errors.push(`The provided timing value "${exp}" is invalid.`);
+ return { duration: 0, delay: 0, easing: '' };
+ }
+ duration = _convertTimeValueToMS(parseFloat(matches[1]), matches[2]);
+ const delayMatch = matches[3];
+ if (delayMatch != null) {
+ delay = _convertTimeValueToMS(parseFloat(delayMatch), matches[4]);
+ }
+ const easingVal = matches[5];
+ if (easingVal) {
+ easing = easingVal;
+ }
+ }
+ else {
+ duration = exp;
+ }
+ if (!allowNegativeValues) {
+ let containsErrors = false;
+ let startIndex = errors.length;
+ if (duration < 0) {
+ errors.push(`Duration values below 0 are not allowed for this animation step.`);
+ containsErrors = true;
+ }
+ if (delay < 0) {
+ errors.push(`Delay values below 0 are not allowed for this animation step.`);
+ containsErrors = true;
+ }
+ if (containsErrors) {
+ errors.splice(startIndex, 0, `The provided timing value "${exp}" is invalid.`);
+ }
+ }
+ return { duration, delay, easing };
+}
+function copyObj(obj, destination = {}) {
+ Object.keys(obj).forEach(prop => {
+ destination[prop] = obj[prop];
+ });
+ return destination;
+}
+function normalizeStyles(styles) {
+ const normalizedStyles = {};
+ if (Array.isArray(styles)) {
+ styles.forEach(data => copyStyles(data, false, normalizedStyles));
+ }
+ else {
+ copyStyles(styles, false, normalizedStyles);
+ }
+ return normalizedStyles;
+}
+function copyStyles(styles, readPrototype, destination = {}) {
+ if (readPrototype) {
+ // we make use of a for-in loop so that the
+ // prototypically inherited properties are
+ // revealed from the backFill map
+ for (let prop in styles) {
+ destination[prop] = styles[prop];
+ }
+ }
+ else {
+ copyObj(styles, destination);
+ }
+ return destination;
+}
+function getStyleAttributeString(element, key, value) {
+ // Return the key-value pair string to be added to the style attribute for the
+ // given CSS style key.
+ if (value) {
+ return key + ':' + value + ';';
+ }
+ else {
+ return '';
+ }
+}
+function writeStyleAttribute(element) {
+ // Read the style property of the element and manually reflect it to the
+ // style attribute. This is needed because Domino on platform-server doesn't
+ // understand the full set of allowed CSS properties and doesn't reflect some
+ // of them automatically.
+ let styleAttrValue = '';
+ for (let i = 0; i < element.style.length; i++) {
+ const key = element.style.item(i);
+ styleAttrValue += getStyleAttributeString(element, key, element.style.getPropertyValue(key));
+ }
+ for (const key in element.style) {
+ // Skip internal Domino properties that don't need to be reflected.
+ if (!element.style.hasOwnProperty(key) || key.startsWith('_')) {
+ continue;
+ }
+ const dashKey = camelCaseToDashCase(key);
+ styleAttrValue += getStyleAttributeString(element, dashKey, element.style[key]);
+ }
+ element.setAttribute('style', styleAttrValue);
+}
+function setStyles(element, styles, formerStyles) {
+ if (element['style']) {
+ Object.keys(styles).forEach(prop => {
+ const camelProp = dashCaseToCamelCase(prop);
+ if (formerStyles && !formerStyles.hasOwnProperty(prop)) {
+ formerStyles[prop] = element.style[camelProp];
+ }
+ element.style[camelProp] = styles[prop];
+ });
+ // On the server set the 'style' attribute since it's not automatically reflected.
+ if (isNode()) {
+ writeStyleAttribute(element);
+ }
+ }
+}
+function eraseStyles(element, styles) {
+ if (element['style']) {
+ Object.keys(styles).forEach(prop => {
+ const camelProp = dashCaseToCamelCase(prop);
+ element.style[camelProp] = '';
+ });
+ // On the server set the 'style' attribute since it's not automatically reflected.
+ if (isNode()) {
+ writeStyleAttribute(element);
+ }
+ }
+}
+function normalizeAnimationEntry(steps) {
+ if (Array.isArray(steps)) {
+ if (steps.length == 1)
+ return steps[0];
+ return Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["sequence"])(steps);
+ }
+ return steps;
+}
+function validateStyleParams(value, options, errors) {
+ const params = options.params || {};
+ const matches = extractStyleParams(value);
+ if (matches.length) {
+ matches.forEach(varName => {
+ if (!params.hasOwnProperty(varName)) {
+ errors.push(`Unable to resolve the local animation param ${varName} in the given list of values`);
+ }
+ });
+ }
+}
+const PARAM_REGEX = new RegExp(`${SUBSTITUTION_EXPR_START}\\s*(.+?)\\s*${SUBSTITUTION_EXPR_END}`, 'g');
+function extractStyleParams(value) {
+ let params = [];
+ if (typeof value === 'string') {
+ let match;
+ while (match = PARAM_REGEX.exec(value)) {
+ params.push(match[1]);
+ }
+ PARAM_REGEX.lastIndex = 0;
+ }
+ return params;
+}
+function interpolateParams(value, params, errors) {
+ const original = value.toString();
+ const str = original.replace(PARAM_REGEX, (_, varName) => {
+ let localVal = params[varName];
+ // this means that the value was never overridden by the data passed in by the user
+ if (!params.hasOwnProperty(varName)) {
+ errors.push(`Please provide a value for the animation param ${varName}`);
+ localVal = '';
+ }
+ return localVal.toString();
+ });
+ // we do this to assert that numeric values stay as they are
+ return str == original ? value : str;
+}
+function iteratorToArray(iterator) {
+ const arr = [];
+ let item = iterator.next();
+ while (!item.done) {
+ arr.push(item.value);
+ item = iterator.next();
+ }
+ return arr;
+}
+const DASH_CASE_REGEXP = /-+([a-z0-9])/g;
+function dashCaseToCamelCase(input) {
+ return input.replace(DASH_CASE_REGEXP, (...m) => m[1].toUpperCase());
+}
+function camelCaseToDashCase(input) {
+ return input.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase();
+}
+function allowPreviousPlayerStylesMerge(duration, delay) {
+ return duration === 0 || delay === 0;
+}
+function balancePreviousStylesIntoKeyframes(element, keyframes, previousStyles) {
+ const previousStyleProps = Object.keys(previousStyles);
+ if (previousStyleProps.length && keyframes.length) {
+ let startingKeyframe = keyframes[0];
+ let missingStyleProps = [];
+ previousStyleProps.forEach(prop => {
+ if (!startingKeyframe.hasOwnProperty(prop)) {
+ missingStyleProps.push(prop);
+ }
+ startingKeyframe[prop] = previousStyles[prop];
+ });
+ if (missingStyleProps.length) {
+ // tslint:disable-next-line
+ for (var i = 1; i < keyframes.length; i++) {
+ let kf = keyframes[i];
+ missingStyleProps.forEach(function (prop) {
+ kf[prop] = computeStyle(element, prop);
+ });
+ }
+ }
+ }
+ return keyframes;
+}
+function visitDslNode(visitor, node, context) {
+ switch (node.type) {
+ case 7 /* Trigger */:
+ return visitor.visitTrigger(node, context);
+ case 0 /* State */:
+ return visitor.visitState(node, context);
+ case 1 /* Transition */:
+ return visitor.visitTransition(node, context);
+ case 2 /* Sequence */:
+ return visitor.visitSequence(node, context);
+ case 3 /* Group */:
+ return visitor.visitGroup(node, context);
+ case 4 /* Animate */:
+ return visitor.visitAnimate(node, context);
+ case 5 /* Keyframes */:
+ return visitor.visitKeyframes(node, context);
+ case 6 /* Style */:
+ return visitor.visitStyle(node, context);
+ case 8 /* Reference */:
+ return visitor.visitReference(node, context);
+ case 9 /* AnimateChild */:
+ return visitor.visitAnimateChild(node, context);
+ case 10 /* AnimateRef */:
+ return visitor.visitAnimateRef(node, context);
+ case 11 /* Query */:
+ return visitor.visitQuery(node, context);
+ case 12 /* Stagger */:
+ return visitor.visitStagger(node, context);
+ default:
+ throw new Error(`Unable to resolve animation metadata node #${node.type}`);
+ }
+}
+function computeStyle(element, prop) {
+ return window.getComputedStyle(element)[prop];
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+const ANY_STATE = '*';
+function parseTransitionExpr(transitionValue, errors) {
+ const expressions = [];
+ if (typeof transitionValue == 'string') {
+ transitionValue.split(/\s*,\s*/).forEach(str => parseInnerTransitionStr(str, expressions, errors));
+ }
+ else {
+ expressions.push(transitionValue);
+ }
+ return expressions;
+}
+function parseInnerTransitionStr(eventStr, expressions, errors) {
+ if (eventStr[0] == ':') {
+ const result = parseAnimationAlias(eventStr, errors);
+ if (typeof result == 'function') {
+ expressions.push(result);
+ return;
+ }
+ eventStr = result;
+ }
+ const match = eventStr.match(/^(\*|[-\w]+)\s*([=-]>)\s*(\*|[-\w]+)$/);
+ if (match == null || match.length < 4) {
+ errors.push(`The provided transition expression "${eventStr}" is not supported`);
+ return expressions;
+ }
+ const fromState = match[1];
+ const separator = match[2];
+ const toState = match[3];
+ expressions.push(makeLambdaFromStates(fromState, toState));
+ const isFullAnyStateExpr = fromState == ANY_STATE && toState == ANY_STATE;
+ if (separator[0] == '<' && !isFullAnyStateExpr) {
+ expressions.push(makeLambdaFromStates(toState, fromState));
+ }
+}
+function parseAnimationAlias(alias, errors) {
+ switch (alias) {
+ case ':enter':
+ return 'void => *';
+ case ':leave':
+ return '* => void';
+ case ':increment':
+ return (fromState, toState) => parseFloat(toState) > parseFloat(fromState);
+ case ':decrement':
+ return (fromState, toState) => parseFloat(toState) < parseFloat(fromState);
+ default:
+ errors.push(`The transition alias value "${alias}" is not supported`);
+ return '* => *';
+ }
+}
+// DO NOT REFACTOR ... keep the follow set instantiations
+// with the values intact (closure compiler for some reason
+// removes follow-up lines that add the values outside of
+// the constructor...
+const TRUE_BOOLEAN_VALUES = new Set(['true', '1']);
+const FALSE_BOOLEAN_VALUES = new Set(['false', '0']);
+function makeLambdaFromStates(lhs, rhs) {
+ const LHS_MATCH_BOOLEAN = TRUE_BOOLEAN_VALUES.has(lhs) || FALSE_BOOLEAN_VALUES.has(lhs);
+ const RHS_MATCH_BOOLEAN = TRUE_BOOLEAN_VALUES.has(rhs) || FALSE_BOOLEAN_VALUES.has(rhs);
+ return (fromState, toState) => {
+ let lhsMatch = lhs == ANY_STATE || lhs == fromState;
+ let rhsMatch = rhs == ANY_STATE || rhs == toState;
+ if (!lhsMatch && LHS_MATCH_BOOLEAN && typeof fromState === 'boolean') {
+ lhsMatch = fromState ? TRUE_BOOLEAN_VALUES.has(lhs) : FALSE_BOOLEAN_VALUES.has(lhs);
+ }
+ if (!rhsMatch && RHS_MATCH_BOOLEAN && typeof toState === 'boolean') {
+ rhsMatch = toState ? TRUE_BOOLEAN_VALUES.has(rhs) : FALSE_BOOLEAN_VALUES.has(rhs);
+ }
+ return lhsMatch && rhsMatch;
+ };
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+const SELF_TOKEN = ':self';
+const SELF_TOKEN_REGEX = new RegExp(`\s*${SELF_TOKEN}\s*,?`, 'g');
+/*
+ * [Validation]
+ * The visitor code below will traverse the animation AST generated by the animation verb functions
+ * (the output is a tree of objects) and attempt to perform a series of validations on the data. The
+ * following corner-cases will be validated:
+ *
+ * 1. Overlap of animations
+ * Given that a CSS property cannot be animated in more than one place at the same time, it's
+ * important that this behavior is detected and validated. The way in which this occurs is that
+ * each time a style property is examined, a string-map containing the property will be updated with
+ * the start and end times for when the property is used within an animation step.
+ *
+ * If there are two or more parallel animations that are currently running (these are invoked by the
+ * group()) on the same element then the validator will throw an error. Since the start/end timing
+ * values are collected for each property then if the current animation step is animating the same
+ * property and its timing values fall anywhere into the window of time that the property is
+ * currently being animated within then this is what causes an error.
+ *
+ * 2. Timing values
+ * The validator will validate to see if a timing value of `duration delay easing` or
+ * `durationNumber` is valid or not.
+ *
+ * (note that upon validation the code below will replace the timing data with an object containing
+ * {duration,delay,easing}.
+ *
+ * 3. Offset Validation
+ * Each of the style() calls are allowed to have an offset value when placed inside of keyframes().
+ * Offsets within keyframes() are considered valid when:
+ *
+ * - No offsets are used at all
+ * - Each style() entry contains an offset value
+ * - Each offset is between 0 and 1
+ * - Each offset is greater to or equal than the previous one
+ *
+ * Otherwise an error will be thrown.
+ */
+function buildAnimationAst(driver, metadata, errors) {
+ return new AnimationAstBuilderVisitor(driver).build(metadata, errors);
+}
+const ROOT_SELECTOR = '';
+class AnimationAstBuilderVisitor {
+ constructor(_driver) {
+ this._driver = _driver;
+ }
+ build(metadata, errors) {
+ const context = new AnimationAstBuilderContext(errors);
+ this._resetContextStyleTimingState(context);
+ return visitDslNode(this, normalizeAnimationEntry(metadata), context);
+ }
+ _resetContextStyleTimingState(context) {
+ context.currentQuerySelector = ROOT_SELECTOR;
+ context.collectedStyles = {};
+ context.collectedStyles[ROOT_SELECTOR] = {};
+ context.currentTime = 0;
+ }
+ visitTrigger(metadata, context) {
+ let queryCount = context.queryCount = 0;
+ let depCount = context.depCount = 0;
+ const states = [];
+ const transitions = [];
+ if (metadata.name.charAt(0) == '@') {
+ context.errors.push('animation triggers cannot be prefixed with an `@` sign (e.g. trigger(\'@foo\', [...]))');
+ }
+ metadata.definitions.forEach(def => {
+ this._resetContextStyleTimingState(context);
+ if (def.type == 0 /* State */) {
+ const stateDef = def;
+ const name = stateDef.name;
+ name.toString().split(/\s*,\s*/).forEach(n => {
+ stateDef.name = n;
+ states.push(this.visitState(stateDef, context));
+ });
+ stateDef.name = name;
+ }
+ else if (def.type == 1 /* Transition */) {
+ const transition = this.visitTransition(def, context);
+ queryCount += transition.queryCount;
+ depCount += transition.depCount;
+ transitions.push(transition);
+ }
+ else {
+ context.errors.push('only state() and transition() definitions can sit inside of a trigger()');
+ }
+ });
+ return {
+ type: 7 /* Trigger */,
+ name: metadata.name,
+ states,
+ transitions,
+ queryCount,
+ depCount,
+ options: null
+ };
+ }
+ visitState(metadata, context) {
+ const styleAst = this.visitStyle(metadata.styles, context);
+ const astParams = (metadata.options && metadata.options.params) || null;
+ if (styleAst.containsDynamicStyles) {
+ const missingSubs = new Set();
+ const params = astParams || {};
+ styleAst.styles.forEach(value => {
+ if (isObject(value)) {
+ const stylesObj = value;
+ Object.keys(stylesObj).forEach(prop => {
+ extractStyleParams(stylesObj[prop]).forEach(sub => {
+ if (!params.hasOwnProperty(sub)) {
+ missingSubs.add(sub);
+ }
+ });
+ });
+ }
+ });
+ if (missingSubs.size) {
+ const missingSubsArr = iteratorToArray(missingSubs.values());
+ context.errors.push(`state("${metadata
+ .name}", ...) must define default values for all the following style substitutions: ${missingSubsArr.join(', ')}`);
+ }
+ }
+ return {
+ type: 0 /* State */,
+ name: metadata.name,
+ style: styleAst,
+ options: astParams ? { params: astParams } : null
+ };
+ }
+ visitTransition(metadata, context) {
+ context.queryCount = 0;
+ context.depCount = 0;
+ const animation = visitDslNode(this, normalizeAnimationEntry(metadata.animation), context);
+ const matchers = parseTransitionExpr(metadata.expr, context.errors);
+ return {
+ type: 1 /* Transition */,
+ matchers,
+ animation,
+ queryCount: context.queryCount,
+ depCount: context.depCount,
+ options: normalizeAnimationOptions(metadata.options)
+ };
+ }
+ visitSequence(metadata, context) {
+ return {
+ type: 2 /* Sequence */,
+ steps: metadata.steps.map(s => visitDslNode(this, s, context)),
+ options: normalizeAnimationOptions(metadata.options)
+ };
+ }
+ visitGroup(metadata, context) {
+ const currentTime = context.currentTime;
+ let furthestTime = 0;
+ const steps = metadata.steps.map(step => {
+ context.currentTime = currentTime;
+ const innerAst = visitDslNode(this, step, context);
+ furthestTime = Math.max(furthestTime, context.currentTime);
+ return innerAst;
+ });
+ context.currentTime = furthestTime;
+ return {
+ type: 3 /* Group */,
+ steps,
+ options: normalizeAnimationOptions(metadata.options)
+ };
+ }
+ visitAnimate(metadata, context) {
+ const timingAst = constructTimingAst(metadata.timings, context.errors);
+ context.currentAnimateTimings = timingAst;
+ let styleAst;
+ let styleMetadata = metadata.styles ? metadata.styles : Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["style"])({});
+ if (styleMetadata.type == 5 /* Keyframes */) {
+ styleAst = this.visitKeyframes(styleMetadata, context);
+ }
+ else {
+ let styleMetadata = metadata.styles;
+ let isEmpty = false;
+ if (!styleMetadata) {
+ isEmpty = true;
+ const newStyleData = {};
+ if (timingAst.easing) {
+ newStyleData['easing'] = timingAst.easing;
+ }
+ styleMetadata = Object(_angular_animations__WEBPACK_IMPORTED_MODULE_0__["style"])(newStyleData);
+ }
+ context.currentTime += timingAst.duration + timingAst.delay;
+ const _styleAst = this.visitStyle(styleMetadata, context);
+ _styleAst.isEmptyStep = isEmpty;
+ styleAst = _styleAst;
+ }
+ context.currentAnimateTimings = null;
+ return {
+ type: 4 /* Animate */,
+ timings: timingAst,
+ style: styleAst,
+ options: null
+ };
+ }
+ visitStyle(metadata, context) {
+ const ast = this._makeStyleAst(metadata, context);
+ this._validateStyleAst(ast, context);
+ return ast;
+ }
+ _makeStyleAst(metadata, context) {
+ const styles = [];
+ if (Array.isArray(metadata.styles)) {
+ metadata.styles.forEach(styleTuple => {
+ if (typeof styleTuple == 'string') {
+ if (styleTuple == _angular_animations__WEBPACK_IMPORTED_MODULE_0__["AUTO_STYLE"]) {
+ styles.push(styleTuple);
+ }
+ else {
+ context.errors.push(`The provided style string value ${styleTuple} is not allowed.`);
+ }
+ }
+ else {
+ styles.push(styleTuple);
+ }
+ });
+ }
+ else {
+ styles.push(metadata.styles);
+ }
+ let containsDynamicStyles = false;
+ let collectedEasing = null;
+ styles.forEach(styleData => {
+ if (isObject(styleData)) {
+ const styleMap = styleData;
+ const easing = styleMap['easing'];
+ if (easing) {
+ collectedEasing = easing;
+ delete styleMap['easing'];
+ }
+ if (!containsDynamicStyles) {
+ for (let prop in styleMap) {
+ const value = styleMap[prop];
+ if (value.toString().indexOf(SUBSTITUTION_EXPR_START) >= 0) {
+ containsDynamicStyles = true;
+ break;
+ }
+ }
+ }
+ }
+ });
+ return {
+ type: 6 /* Style */,
+ styles,
+ easing: collectedEasing,
+ offset: metadata.offset,
+ containsDynamicStyles,
+ options: null
+ };
+ }
+ _validateStyleAst(ast, context) {
+ const timings = context.currentAnimateTimings;
+ let endTime = context.currentTime;
+ let startTime = context.currentTime;
+ if (timings && startTime > 0) {
+ startTime -= timings.duration + timings.delay;
+ }
+ ast.styles.forEach(tuple => {
+ if (typeof tuple == 'string')
+ return;
+ Object.keys(tuple).forEach(prop => {
+ if (!this._driver.validateStyleProperty(prop)) {
+ context.errors.push(`The provided animation property "${prop}" is not a supported CSS property for animations`);
+ return;
+ }
+ const collectedStyles = context.collectedStyles[context.currentQuerySelector];
+ const collectedEntry = collectedStyles[prop];
+ let updateCollectedStyle = true;
+ if (collectedEntry) {
+ if (startTime != endTime && startTime >= collectedEntry.startTime &&
+ endTime <= collectedEntry.endTime) {
+ context.errors.push(`The CSS property "${prop}" that exists between the times of "${collectedEntry.startTime}ms" and "${collectedEntry
+ .endTime}ms" is also being animated in a parallel animation between the times of "${startTime}ms" and "${endTime}ms"`);
+ updateCollectedStyle = false;
+ }
+ // we always choose the smaller start time value since we
+ // want to have a record of the entire animation window where
+ // the style property is being animated in between
+ startTime = collectedEntry.startTime;
+ }
+ if (updateCollectedStyle) {
+ collectedStyles[prop] = { startTime, endTime };
+ }
+ if (context.options) {
+ validateStyleParams(tuple[prop], context.options, context.errors);
+ }
+ });
+ });
+ }
+ visitKeyframes(metadata, context) {
+ const ast = { type: 5 /* Keyframes */, styles: [], options: null };
+ if (!context.currentAnimateTimings) {
+ context.errors.push(`keyframes() must be placed inside of a call to animate()`);
+ return ast;
+ }
+ const MAX_KEYFRAME_OFFSET = 1;
+ let totalKeyframesWithOffsets = 0;
+ const offsets = [];
+ let offsetsOutOfOrder = false;
+ let keyframesOutOfRange = false;
+ let previousOffset = 0;
+ const keyframes = metadata.steps.map(styles => {
+ const style = this._makeStyleAst(styles, context);
+ let offsetVal = style.offset != null ? style.offset : consumeOffset(style.styles);
+ let offset = 0;
+ if (offsetVal != null) {
+ totalKeyframesWithOffsets++;
+ offset = style.offset = offsetVal;
+ }
+ keyframesOutOfRange = keyframesOutOfRange || offset < 0 || offset > 1;
+ offsetsOutOfOrder = offsetsOutOfOrder || offset < previousOffset;
+ previousOffset = offset;
+ offsets.push(offset);
+ return style;
+ });
+ if (keyframesOutOfRange) {
+ context.errors.push(`Please ensure that all keyframe offsets are between 0 and 1`);
+ }
+ if (offsetsOutOfOrder) {
+ context.errors.push(`Please ensure that all keyframe offsets are in order`);
+ }
+ const length = metadata.steps.length;
+ let generatedOffset = 0;
+ if (totalKeyframesWithOffsets > 0 && totalKeyframesWithOffsets < length) {
+ context.errors.push(`Not all style() steps within the declared keyframes() contain offsets`);
+ }
+ else if (totalKeyframesWithOffsets == 0) {
+ generatedOffset = MAX_KEYFRAME_OFFSET / (length - 1);
+ }
+ const limit = length - 1;
+ const currentTime = context.currentTime;
+ const currentAnimateTimings = context.currentAnimateTimings;
+ const animateDuration = currentAnimateTimings.duration;
+ keyframes.forEach((kf, i) => {
+ const offset = generatedOffset > 0 ? (i == limit ? 1 : (generatedOffset * i)) : offsets[i];
+ const durationUpToThisFrame = offset * animateDuration;
+ context.currentTime = currentTime + currentAnimateTimings.delay + durationUpToThisFrame;
+ currentAnimateTimings.duration = durationUpToThisFrame;
+ this._validateStyleAst(kf, context);
+ kf.offset = offset;
+ ast.styles.push(kf);
+ });
+ return ast;
+ }
+ visitReference(metadata, context) {
+ return {
+ type: 8 /* Reference */,
+ animation: visitDslNode(this, normalizeAnimationEntry(metadata.animation), context),
+ options: normalizeAnimationOptions(metadata.options)
+ };
+ }
+ visitAnimateChild(metadata, context) {
+ context.depCount++;
+ return {
+ type: 9 /* AnimateChild */,
+ options: normalizeAnimationOptions(metadata.options)
+ };
+ }
+ visitAnimateRef(metadata, context) {
+ return {
+ type: 10 /* AnimateRef */,
+ animation: this.visitReference(metadata.animation, context),
+ options: normalizeAnimationOptions(metadata.options)
+ };
+ }
+ visitQuery(metadata, context) {
+ const parentSelector = context.currentQuerySelector;
+ const options = (metadata.options || {});
+ context.queryCount++;
+ context.currentQuery = metadata;
+ const [selector, includeSelf] = normalizeSelector(metadata.selector);
+ context.currentQuerySelector =
+ parentSelector.length ? (parentSelector + ' ' + selector) : selector;
+ getOrSetAsInMap(context.collectedStyles, context.currentQuerySelector, {});
+ const animation = visitDslNode(this, normalizeAnimationEntry(metadata.animation), context);
+ context.currentQuery = null;
+ context.currentQuerySelector = parentSelector;
+ return {
+ type: 11 /* Query */,
+ selector,
+ limit: options.limit || 0,
+ optional: !!options.optional,
+ includeSelf,
+ animation,
+ originalSelector: metadata.selector,
+ options: normalizeAnimationOptions(metadata.options)
+ };
+ }
+ visitStagger(metadata, context) {
+ if (!context.currentQuery) {
+ context.errors.push(`stagger() can only be used inside of query()`);
+ }
+ const timings = metadata.timings === 'full' ?
+ { duration: 0, delay: 0, easing: 'full' } :
+ resolveTiming(metadata.timings, context.errors, true);
+ return {
+ type: 12 /* Stagger */,
+ animation: visitDslNode(this, normalizeAnimationEntry(metadata.animation), context),
+ timings,
+ options: null
+ };
+ }
+}
+function normalizeSelector(selector) {
+ const hasAmpersand = selector.split(/\s*,\s*/).find(token => token == SELF_TOKEN) ? true : false;
+ if (hasAmpersand) {
+ selector = selector.replace(SELF_TOKEN_REGEX, '');
+ }
+ // the :enter and :leave selectors are filled in at runtime during timeline building
+ selector = selector.replace(/@\*/g, NG_TRIGGER_SELECTOR)
+ .replace(/@\w+/g, match => NG_TRIGGER_SELECTOR + '-' + match.substr(1))
+ .replace(/:animating/g, NG_ANIMATING_SELECTOR);
+ return [selector, hasAmpersand];
+}
+function normalizeParams(obj) {
+ return obj ? copyObj(obj) : null;
+}
+class AnimationAstBuilderContext {
+ constructor(errors) {
+ this.errors = errors;
+ this.queryCount = 0;
+ this.depCount = 0;
+ this.currentTransition = null;
+ this.currentQuery = null;
+ this.currentQuerySelector = null;
+ this.currentAnimateTimings = null;
+ this.currentTime = 0;
+ this.collectedStyles = {};
+ this.options = null;
+ }
+}
+function consumeOffset(styles) {
+ if (typeof styles == 'string')
+ return null;
+ let offset = null;
+ if (Array.isArray(styles)) {
+ styles.forEach(styleTuple => {
+ if (isObject(styleTuple) && styleTuple.hasOwnProperty('offset')) {
+ const obj = styleTuple;
+ offset = parseFloat(obj['offset']);
+ delete obj['offset'];
+ }
+ });
+ }
+ else if (isObject(styles) && styles.hasOwnProperty('offset')) {
+ const obj = styles;
+ offset = parseFloat(obj['offset']);
+ delete obj['offset'];
+ }
+ return offset;
+}
+function isObject(value) {
+ return !Array.isArray(value) && typeof value == 'object';
+}
+function constructTimingAst(value, errors) {
+ let timings = null;
+ if (value.hasOwnProperty('duration')) {
+ timings = value;
+ }
+ else if (typeof value == 'number') {
+ const duration = resolveTiming(value, errors).duration;
+ return makeTimingAst(duration, 0, '');
+ }
+ const strValue = value;
+ const isDynamic = strValue.split(/\s+/).some(v => v.charAt(0) == '{' && v.charAt(1) == '{');
+ if (isDynamic) {
+ const ast = makeTimingAst(0, 0, '');
+ ast.dynamic = true;
+ ast.strValue = strValue;
+ return ast;
+ }
+ timings = timings || resolveTiming(strValue, errors);
+ return makeTimingAst(timings.duration, timings.delay, timings.easing);
+}
+function normalizeAnimationOptions(options) {
+ if (options) {
+ options = copyObj(options);
+ if (options['params']) {
+ options['params'] = normalizeParams(options['params']);
+ }
+ }
+ else {
+ options = {};
+ }
+ return options;
+}
+function makeTimingAst(duration, delay, easing) {
+ return { duration, delay, easing };
+}
+
+function createTimelineInstruction(element, keyframes, preStyleProps, postStyleProps, duration, delay, easing = null, subTimeline = false) {
+ return {
+ type: 1 /* TimelineAnimation */,
+ element,
+ keyframes,
+ preStyleProps,
+ postStyleProps,
+ duration,
+ delay,
+ totalTime: duration + delay,
+ easing,
+ subTimeline
+ };
+}
+
+class ElementInstructionMap {
+ constructor() {
+ this._map = new Map();
+ }
+ consume(element) {
+ let instructions = this._map.get(element);
+ if (instructions) {
+ this._map.delete(element);
+ }
+ else {
+ instructions = [];
+ }
+ return instructions;
+ }
+ append(element, instructions) {
+ let existingInstructions = this._map.get(element);
+ if (!existingInstructions) {
+ this._map.set(element, existingInstructions = []);
+ }
+ existingInstructions.push(...instructions);
+ }
+ has(element) {
+ return this._map.has(element);
+ }
+ clear() {
+ this._map.clear();
+ }
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+const ONE_FRAME_IN_MILLISECONDS = 1;
+const ENTER_TOKEN = ':enter';
+const ENTER_TOKEN_REGEX = new RegExp(ENTER_TOKEN, 'g');
+const LEAVE_TOKEN = ':leave';
+const LEAVE_TOKEN_REGEX = new RegExp(LEAVE_TOKEN, 'g');
+/*
+ * The code within this file aims to generate web-animations-compatible keyframes from Angular's
+ * animation DSL code.
+ *
+ * The code below will be converted from:
+ *
+ * ```
+ * sequence([
+ * style({ opacity: 0 }),
+ * animate(1000, style({ opacity: 0 }))
+ * ])
+ * ```
+ *
+ * To:
+ * ```
+ * keyframes = [{ opacity: 0, offset: 0 }, { opacity: 1, offset: 1 }]
+ * duration = 1000
+ * delay = 0
+ * easing = ''
+ * ```
+ *
+ * For this operation to cover the combination of animation verbs (style, animate, group, etc...) a
+ * combination of prototypical inheritance, AST traversal and merge-sort-like algorithms are used.
+ *
+ * [AST Traversal]
+ * Each of the animation verbs, when executed, will return an string-map object representing what
+ * type of action it is (style, animate, group, etc...) and the data associated with it. This means
+ * that when functional composition mix of these functions is evaluated (like in the example above)
+ * then it will end up producing a tree of objects representing the animation itself.
+ *
+ * When this animation object tree is processed by the visitor code below it will visit each of the
+ * verb statements within the visitor. And during each visit it will build the context of the
+ * animation keyframes by interacting with the `TimelineBuilder`.
+ *
+ * [TimelineBuilder]
+ * This class is responsible for tracking the styles and building a series of keyframe objects for a
+ * timeline between a start and end time. The builder starts off with an initial timeline and each
+ * time the AST comes across a `group()`, `keyframes()` or a combination of the two wihtin a
+ * `sequence()` then it will generate a sub timeline for each step as well as a new one after
+ * they are complete.
+ *
+ * As the AST is traversed, the timing state on each of the timelines will be incremented. If a sub
+ * timeline was created (based on one of the cases above) then the parent timeline will attempt to
+ * merge the styles used within the sub timelines into itself (only with group() this will happen).
+ * This happens with a merge operation (much like how the merge works in mergesort) and it will only
+ * copy the most recently used styles from the sub timelines into the parent timeline. This ensures
+ * that if the styles are used later on in another phase of the animation then they will be the most
+ * up-to-date values.
+ *
+ * [How Missing Styles Are Updated]
+ * Each timeline has a `backFill` property which is responsible for filling in new styles into
+ * already processed keyframes if a new style shows up later within the animation sequence.
+ *
+ * ```
+ * sequence([
+ * style({ width: 0 }),
+ * animate(1000, style({ width: 100 })),
+ * animate(1000, style({ width: 200 })),
+ * animate(1000, style({ width: 300 }))
+ * animate(1000, style({ width: 400, height: 400 })) // notice how `height` doesn't exist anywhere
+ * else
+ * ])
+ * ```
+ *
+ * What is happening here is that the `height` value is added later in the sequence, but is missing
+ * from all previous animation steps. Therefore when a keyframe is created it would also be missing
+ * from all previous keyframes up until where it is first used. For the timeline keyframe generation
+ * to properly fill in the style it will place the previous value (the value from the parent
+ * timeline) or a default value of `*` into the backFill object. Given that each of the keyframe
+ * styles are objects that prototypically inhert from the backFill object, this means that if a
+ * value is added into the backFill then it will automatically propagate any missing values to all
+ * keyframes. Therefore the missing `height` value will be properly filled into the already
+ * processed keyframes.
+ *
+ * When a sub-timeline is created it will have its own backFill property. This is done so that
+ * styles present within the sub-timeline do not accidentally seep into the previous/future timeline
+ * keyframes
+ *
+ * (For prototypically-inherited contents to be detected a `for(i in obj)` loop must be used.)
+ *
+ * [Validation]
+ * The code in this file is not responsible for validation. That functionality happens with within
+ * the `AnimationValidatorVisitor` code.
+ */
+function buildAnimationTimelines(driver, rootElement, ast, enterClassName, leaveClassName, startingStyles = {}, finalStyles = {}, options, subInstructions, errors = []) {
+ return new AnimationTimelineBuilderVisitor().buildKeyframes(driver, rootElement, ast, enterClassName, leaveClassName, startingStyles, finalStyles, options, subInstructions, errors);
+}
+class AnimationTimelineBuilderVisitor {
+ buildKeyframes(driver, rootElement, ast, enterClassName, leaveClassName, startingStyles, finalStyles, options, subInstructions, errors = []) {
+ subInstructions = subInstructions || new ElementInstructionMap();
+ const context = new AnimationTimelineContext(driver, rootElement, subInstructions, enterClassName, leaveClassName, errors, []);
+ context.options = options;
+ context.currentTimeline.setStyles([startingStyles], null, context.errors, options);
+ visitDslNode(this, ast, context);
+ // this checks to see if an actual animation happened
+ const timelines = context.timelines.filter(timeline => timeline.containsAnimation());
+ if (timelines.length && Object.keys(finalStyles).length) {
+ const tl = timelines[timelines.length - 1];
+ if (!tl.allowOnlyTimelineStyles()) {
+ tl.setStyles([finalStyles], null, context.errors, options);
+ }
+ }
+ return timelines.length ? timelines.map(timeline => timeline.buildKeyframes()) :
+ [createTimelineInstruction(rootElement, [], [], [], 0, 0, '', false)];
+ }
+ visitTrigger(ast, context) {
+ // these values are not visited in this AST
+ }
+ visitState(ast, context) {
+ // these values are not visited in this AST
+ }
+ visitTransition(ast, context) {
+ // these values are not visited in this AST
+ }
+ visitAnimateChild(ast, context) {
+ const elementInstructions = context.subInstructions.consume(context.element);
+ if (elementInstructions) {
+ const innerContext = context.createSubContext(ast.options);
+ const startTime = context.currentTimeline.currentTime;
+ const endTime = this._visitSubInstructions(elementInstructions, innerContext, innerContext.options);
+ if (startTime != endTime) {
+ // we do this on the upper context because we created a sub context for
+ // the sub child animations
+ context.transformIntoNewTimeline(endTime);
+ }
+ }
+ context.previousNode = ast;
+ }
+ visitAnimateRef(ast, context) {
+ const innerContext = context.createSubContext(ast.options);
+ innerContext.transformIntoNewTimeline();
+ this.visitReference(ast.animation, innerContext);
+ context.transformIntoNewTimeline(innerContext.currentTimeline.currentTime);
+ context.previousNode = ast;
+ }
+ _visitSubInstructions(instructions, context, options) {
+ const startTime = context.currentTimeline.currentTime;
+ let furthestTime = startTime;
+ // this is a special-case for when a user wants to skip a sub
+ // animation from being fired entirely.
+ const duration = options.duration != null ? resolveTimingValue(options.duration) : null;
+ const delay = options.delay != null ? resolveTimingValue(options.delay) : null;
+ if (duration !== 0) {
+ instructions.forEach(instruction => {
+ const instructionTimings = context.appendInstructionToTimeline(instruction, duration, delay);
+ furthestTime =
+ Math.max(furthestTime, instructionTimings.duration + instructionTimings.delay);
+ });
+ }
+ return furthestTime;
+ }
+ visitReference(ast, context) {
+ context.updateOptions(ast.options, true);
+ visitDslNode(this, ast.animation, context);
+ context.previousNode = ast;
+ }
+ visitSequence(ast, context) {
+ const subContextCount = context.subContextCount;
+ let ctx = context;
+ const options = ast.options;
+ if (options && (options.params || options.delay)) {
+ ctx = context.createSubContext(options);
+ ctx.transformIntoNewTimeline();
+ if (options.delay != null) {
+ if (ctx.previousNode.type == 6 /* Style */) {
+ ctx.currentTimeline.snapshotCurrentStyles();
+ ctx.previousNode = DEFAULT_NOOP_PREVIOUS_NODE;
+ }
+ const delay = resolveTimingValue(options.delay);
+ ctx.delayNextStep(delay);
+ }
+ }
+ if (ast.steps.length) {
+ ast.steps.forEach(s => visitDslNode(this, s, ctx));
+ // this is here just incase the inner steps only contain or end with a style() call
+ ctx.currentTimeline.applyStylesToKeyframe();
+ // this means that some animation function within the sequence
+ // ended up creating a sub timeline (which means the current
+ // timeline cannot overlap with the contents of the sequence)
+ if (ctx.subContextCount > subContextCount) {
+ ctx.transformIntoNewTimeline();
+ }
+ }
+ context.previousNode = ast;
+ }
+ visitGroup(ast, context) {
+ const innerTimelines = [];
+ let furthestTime = context.currentTimeline.currentTime;
+ const delay = ast.options && ast.options.delay ? resolveTimingValue(ast.options.delay) : 0;
+ ast.steps.forEach(s => {
+ const innerContext = context.createSubContext(ast.options);
+ if (delay) {
+ innerContext.delayNextStep(delay);
+ }
+ visitDslNode(this, s, innerContext);
+ furthestTime = Math.max(furthestTime, innerContext.currentTimeline.currentTime);
+ innerTimelines.push(innerContext.currentTimeline);
+ });
+ // this operation is run after the AST loop because otherwise
+ // if the parent timeline's collected styles were updated then
+ // it would pass in invalid data into the new-to-be forked items
+ innerTimelines.forEach(timeline => context.currentTimeline.mergeTimelineCollectedStyles(timeline));
+ context.transformIntoNewTimeline(furthestTime);
+ context.previousNode = ast;
+ }
+ _visitTiming(ast, context) {
+ if (ast.dynamic) {
+ const strValue = ast.strValue;
+ const timingValue = context.params ? interpolateParams(strValue, context.params, context.errors) : strValue;
+ return resolveTiming(timingValue, context.errors);
+ }
+ else {
+ return { duration: ast.duration, delay: ast.delay, easing: ast.easing };
+ }
+ }
+ visitAnimate(ast, context) {
+ const timings = context.currentAnimateTimings = this._visitTiming(ast.timings, context);
+ const timeline = context.currentTimeline;
+ if (timings.delay) {
+ context.incrementTime(timings.delay);
+ timeline.snapshotCurrentStyles();
+ }
+ const style = ast.style;
+ if (style.type == 5 /* Keyframes */) {
+ this.visitKeyframes(style, context);
+ }
+ else {
+ context.incrementTime(timings.duration);
+ this.visitStyle(style, context);
+ timeline.applyStylesToKeyframe();
+ }
+ context.currentAnimateTimings = null;
+ context.previousNode = ast;
+ }
+ visitStyle(ast, context) {
+ const timeline = context.currentTimeline;
+ const timings = context.currentAnimateTimings;
+ // this is a special case for when a style() call
+ // directly follows an animate() call (but not inside of an animate() call)
+ if (!timings && timeline.getCurrentStyleProperties().length) {
+ timeline.forwardFrame();
+ }
+ const easing = (timings && timings.easing) || ast.easing;
+ if (ast.isEmptyStep) {
+ timeline.applyEmptyStep(easing);
+ }
+ else {
+ timeline.setStyles(ast.styles, easing, context.errors, context.options);
+ }
+ context.previousNode = ast;
+ }
+ visitKeyframes(ast, context) {
+ const currentAnimateTimings = context.currentAnimateTimings;
+ const startTime = (context.currentTimeline).duration;
+ const duration = currentAnimateTimings.duration;
+ const innerContext = context.createSubContext();
+ const innerTimeline = innerContext.currentTimeline;
+ innerTimeline.easing = currentAnimateTimings.easing;
+ ast.styles.forEach(step => {
+ const offset = step.offset || 0;
+ innerTimeline.forwardTime(offset * duration);
+ innerTimeline.setStyles(step.styles, step.easing, context.errors, context.options);
+ innerTimeline.applyStylesToKeyframe();
+ });
+ // this will ensure that the parent timeline gets all the styles from
+ // the child even if the new timeline below is not used
+ context.currentTimeline.mergeTimelineCollectedStyles(innerTimeline);
+ // we do this because the window between this timeline and the sub timeline
+ // should ensure that the styles within are exactly the same as they were before
+ context.transformIntoNewTimeline(startTime + duration);
+ context.previousNode = ast;
+ }
+ visitQuery(ast, context) {
+ // in the event that the first step before this is a style step we need
+ // to ensure the styles are applied before the children are animated
+ const startTime = context.currentTimeline.currentTime;
+ const options = (ast.options || {});
+ const delay = options.delay ? resolveTimingValue(options.delay) : 0;
+ if (delay &&
+ (context.previousNode.type === 6 /* Style */ ||
+ (startTime == 0 && context.currentTimeline.getCurrentStyleProperties().length))) {
+ context.currentTimeline.snapshotCurrentStyles();
+ context.previousNode = DEFAULT_NOOP_PREVIOUS_NODE;
+ }
+ let furthestTime = startTime;
+ const elms = context.invokeQuery(ast.selector, ast.originalSelector, ast.limit, ast.includeSelf, options.optional ? true : false, context.errors);
+ context.currentQueryTotal = elms.length;
+ let sameElementTimeline = null;
+ elms.forEach((element, i) => {
+ context.currentQueryIndex = i;
+ const innerContext = context.createSubContext(ast.options, element);
+ if (delay) {
+ innerContext.delayNextStep(delay);
+ }
+ if (element === context.element) {
+ sameElementTimeline = innerContext.currentTimeline;
+ }
+ visitDslNode(this, ast.animation, innerContext);
+ // this is here just incase the inner steps only contain or end
+ // with a style() call (which is here to signal that this is a preparatory
+ // call to style an element before it is animated again)
+ innerContext.currentTimeline.applyStylesToKeyframe();
+ const endTime = innerContext.currentTimeline.currentTime;
+ furthestTime = Math.max(furthestTime, endTime);
+ });
+ context.currentQueryIndex = 0;
+ context.currentQueryTotal = 0;
+ context.transformIntoNewTimeline(furthestTime);
+ if (sameElementTimeline) {
+ context.currentTimeline.mergeTimelineCollectedStyles(sameElementTimeline);
+ context.currentTimeline.snapshotCurrentStyles();
+ }
+ context.previousNode = ast;
+ }
+ visitStagger(ast, context) {
+ const parentContext = context.parentContext;
+ const tl = context.currentTimeline;
+ const timings = ast.timings;
+ const duration = Math.abs(timings.duration);
+ const maxTime = duration * (context.currentQueryTotal - 1);
+ let delay = duration * context.currentQueryIndex;
+ let staggerTransformer = timings.duration < 0 ? 'reverse' : timings.easing;
+ switch (staggerTransformer) {
+ case 'reverse':
+ delay = maxTime - delay;
+ break;
+ case 'full':
+ delay = parentContext.currentStaggerTime;
+ break;
+ }
+ const timeline = context.currentTimeline;
+ if (delay) {
+ timeline.delayNextStep(delay);
+ }
+ const startingTime = timeline.currentTime;
+ visitDslNode(this, ast.animation, context);
+ context.previousNode = ast;
+ // time = duration + delay
+ // the reason why this computation is so complex is because
+ // the inner timeline may either have a delay value or a stretched
+ // keyframe depending on if a subtimeline is not used or is used.
+ parentContext.currentStaggerTime =
+ (tl.currentTime - startingTime) + (tl.startTime - parentContext.currentTimeline.startTime);
+ }
+}
+const DEFAULT_NOOP_PREVIOUS_NODE = {};
+class AnimationTimelineContext {
+ constructor(_driver, element, subInstructions, _enterClassName, _leaveClassName, errors, timelines, initialTimeline) {
+ this._driver = _driver;
+ this.element = element;
+ this.subInstructions = subInstructions;
+ this._enterClassName = _enterClassName;
+ this._leaveClassName = _leaveClassName;
+ this.errors = errors;
+ this.timelines = timelines;
+ this.parentContext = null;
+ this.currentAnimateTimings = null;
+ this.previousNode = DEFAULT_NOOP_PREVIOUS_NODE;
+ this.subContextCount = 0;
+ this.options = {};
+ this.currentQueryIndex = 0;
+ this.currentQueryTotal = 0;
+ this.currentStaggerTime = 0;
+ this.currentTimeline = initialTimeline || new TimelineBuilder(this._driver, element, 0);
+ timelines.push(this.currentTimeline);
+ }
+ get params() {
+ return this.options.params;
+ }
+ updateOptions(options, skipIfExists) {
+ if (!options)
+ return;
+ const newOptions = options;
+ let optionsToUpdate = this.options;
+ // NOTE: this will get patched up when other animation methods support duration overrides
+ if (newOptions.duration != null) {
+ optionsToUpdate.duration = resolveTimingValue(newOptions.duration);
+ }
+ if (newOptions.delay != null) {
+ optionsToUpdate.delay = resolveTimingValue(newOptions.delay);
+ }
+ const newParams = newOptions.params;
+ if (newParams) {
+ let paramsToUpdate = optionsToUpdate.params;
+ if (!paramsToUpdate) {
+ paramsToUpdate = this.options.params = {};
+ }
+ Object.keys(newParams).forEach(name => {
+ if (!skipIfExists || !paramsToUpdate.hasOwnProperty(name)) {
+ paramsToUpdate[name] = interpolateParams(newParams[name], paramsToUpdate, this.errors);
+ }
+ });
+ }
+ }
+ _copyOptions() {
+ const options = {};
+ if (this.options) {
+ const oldParams = this.options.params;
+ if (oldParams) {
+ const params = options['params'] = {};
+ Object.keys(oldParams).forEach(name => {
+ params[name] = oldParams[name];
+ });
+ }
+ }
+ return options;
+ }
+ createSubContext(options = null, element, newTime) {
+ const target = element || this.element;
+ const context = new AnimationTimelineContext(this._driver, target, this.subInstructions, this._enterClassName, this._leaveClassName, this.errors, this.timelines, this.currentTimeline.fork(target, newTime || 0));
+ context.previousNode = this.previousNode;
+ context.currentAnimateTimings = this.currentAnimateTimings;
+ context.options = this._copyOptions();
+ context.updateOptions(options);
+ context.currentQueryIndex = this.currentQueryIndex;
+ context.currentQueryTotal = this.currentQueryTotal;
+ context.parentContext = this;
+ this.subContextCount++;
+ return context;
+ }
+ transformIntoNewTimeline(newTime) {
+ this.previousNode = DEFAULT_NOOP_PREVIOUS_NODE;
+ this.currentTimeline = this.currentTimeline.fork(this.element, newTime);
+ this.timelines.push(this.currentTimeline);
+ return this.currentTimeline;
+ }
+ appendInstructionToTimeline(instruction, duration, delay) {
+ const updatedTimings = {
+ duration: duration != null ? duration : instruction.duration,
+ delay: this.currentTimeline.currentTime + (delay != null ? delay : 0) + instruction.delay,
+ easing: ''
+ };
+ const builder = new SubTimelineBuilder(this._driver, instruction.element, instruction.keyframes, instruction.preStyleProps, instruction.postStyleProps, updatedTimings, instruction.stretchStartingKeyframe);
+ this.timelines.push(builder);
+ return updatedTimings;
+ }
+ incrementTime(time) {
+ this.currentTimeline.forwardTime(this.currentTimeline.duration + time);
+ }
+ delayNextStep(delay) {
+ // negative delays are not yet supported
+ if (delay > 0) {
+ this.currentTimeline.delayNextStep(delay);
+ }
+ }
+ invokeQuery(selector, originalSelector, limit, includeSelf, optional, errors) {
+ let results = [];
+ if (includeSelf) {
+ results.push(this.element);
+ }
+ if (selector.length > 0) { // if :self is only used then the selector is empty
+ selector = selector.replace(ENTER_TOKEN_REGEX, '.' + this._enterClassName);
+ selector = selector.replace(LEAVE_TOKEN_REGEX, '.' + this._leaveClassName);
+ const multi = limit != 1;
+ let elements = this._driver.query(this.element, selector, multi);
+ if (limit !== 0) {
+ elements = limit < 0 ? elements.slice(elements.length + limit, elements.length) :
+ elements.slice(0, limit);
+ }
+ results.push(...elements);
+ }
+ if (!optional && results.length == 0) {
+ errors.push(`\`query("${originalSelector}")\` returned zero elements. (Use \`query("${originalSelector}", { optional: true })\` if you wish to allow this.)`);
+ }
+ return results;
+ }
+}
+class TimelineBuilder {
+ constructor(_driver, element, startTime, _elementTimelineStylesLookup) {
+ this._driver = _driver;
+ this.element = element;
+ this.startTime = startTime;
+ this._elementTimelineStylesLookup = _elementTimelineStylesLookup;
+ this.duration = 0;
+ this._previousKeyframe = {};
+ this._currentKeyframe = {};
+ this._keyframes = new Map();
+ this._styleSummary = {};
+ this._pendingStyles = {};
+ this._backFill = {};
+ this._currentEmptyStepKeyframe = null;
+ if (!this._elementTimelineStylesLookup) {
+ this._elementTimelineStylesLookup = new Map();
+ }
+ this._localTimelineStyles = Object.create(this._backFill, {});
+ this._globalTimelineStyles = this._elementTimelineStylesLookup.get(element);
+ if (!this._globalTimelineStyles) {
+ this._globalTimelineStyles = this._localTimelineStyles;
+ this._elementTimelineStylesLookup.set(element, this._localTimelineStyles);
+ }
+ this._loadKeyframe();
+ }
+ containsAnimation() {
+ switch (this._keyframes.size) {
+ case 0:
+ return false;
+ case 1:
+ return this.getCurrentStyleProperties().length > 0;
+ default:
+ return true;
+ }
+ }
+ getCurrentStyleProperties() {
+ return Object.keys(this._currentKeyframe);
+ }
+ get currentTime() {
+ return this.startTime + this.duration;
+ }
+ delayNextStep(delay) {
+ // in the event that a style() step is placed right before a stagger()
+ // and that style() step is the very first style() value in the animation
+ // then we need to make a copy of the keyframe [0, copy, 1] so that the delay
+ // properly applies the style() values to work with the stagger...
+ const hasPreStyleStep = this._keyframes.size == 1 && Object.keys(this._pendingStyles).length;
+ if (this.duration || hasPreStyleStep) {
+ this.forwardTime(this.currentTime + delay);
+ if (hasPreStyleStep) {
+ this.snapshotCurrentStyles();
+ }
+ }
+ else {
+ this.startTime += delay;
+ }
+ }
+ fork(element, currentTime) {
+ this.applyStylesToKeyframe();
+ return new TimelineBuilder(this._driver, element, currentTime || this.currentTime, this._elementTimelineStylesLookup);
+ }
+ _loadKeyframe() {
+ if (this._currentKeyframe) {
+ this._previousKeyframe = this._currentKeyframe;
+ }
+ this._currentKeyframe = this._keyframes.get(this.duration);
+ if (!this._currentKeyframe) {
+ this._currentKeyframe = Object.create(this._backFill, {});
+ this._keyframes.set(this.duration, this._currentKeyframe);
+ }
+ }
+ forwardFrame() {
+ this.duration += ONE_FRAME_IN_MILLISECONDS;
+ this._loadKeyframe();
+ }
+ forwardTime(time) {
+ this.applyStylesToKeyframe();
+ this.duration = time;
+ this._loadKeyframe();
+ }
+ _updateStyle(prop, value) {
+ this._localTimelineStyles[prop] = value;
+ this._globalTimelineStyles[prop] = value;
+ this._styleSummary[prop] = { time: this.currentTime, value };
+ }
+ allowOnlyTimelineStyles() {
+ return this._currentEmptyStepKeyframe !== this._currentKeyframe;
+ }
+ applyEmptyStep(easing) {
+ if (easing) {
+ this._previousKeyframe['easing'] = easing;
+ }
+ // special case for animate(duration):
+ // all missing styles are filled with a `*` value then
+ // if any destination styles are filled in later on the same
+ // keyframe then they will override the overridden styles
+ // We use `_globalTimelineStyles` here because there may be
+ // styles in previous keyframes that are not present in this timeline
+ Object.keys(this._globalTimelineStyles).forEach(prop => {
+ this._backFill[prop] = this._globalTimelineStyles[prop] || _angular_animations__WEBPACK_IMPORTED_MODULE_0__["AUTO_STYLE"];
+ this._currentKeyframe[prop] = _angular_animations__WEBPACK_IMPORTED_MODULE_0__["AUTO_STYLE"];
+ });
+ this._currentEmptyStepKeyframe = this._currentKeyframe;
+ }
+ setStyles(input, easing, errors, options) {
+ if (easing) {
+ this._previousKeyframe['easing'] = easing;
+ }
+ const params = (options && options.params) || {};
+ const styles = flattenStyles(input, this._globalTimelineStyles);
+ Object.keys(styles).forEach(prop => {
+ const val = interpolateParams(styles[prop], params, errors);
+ this._pendingStyles[prop] = val;
+ if (!this._localTimelineStyles.hasOwnProperty(prop)) {
+ this._backFill[prop] = this._globalTimelineStyles.hasOwnProperty(prop) ?
+ this._globalTimelineStyles[prop] :
+ _angular_animations__WEBPACK_IMPORTED_MODULE_0__["AUTO_STYLE"];
+ }
+ this._updateStyle(prop, val);
+ });
+ }
+ applyStylesToKeyframe() {
+ const styles = this._pendingStyles;
+ const props = Object.keys(styles);
+ if (props.length == 0)
+ return;
+ this._pendingStyles = {};
+ props.forEach(prop => {
+ const val = styles[prop];
+ this._currentKeyframe[prop] = val;
+ });
+ Object.keys(this._localTimelineStyles).forEach(prop => {
+ if (!this._currentKeyframe.hasOwnProperty(prop)) {
+ this._currentKeyframe[prop] = this._localTimelineStyles[prop];
+ }
+ });
+ }
+ snapshotCurrentStyles() {
+ Object.keys(this._localTimelineStyles).forEach(prop => {
+ const val = this._localTimelineStyles[prop];
+ this._pendingStyles[prop] = val;
+ this._updateStyle(prop, val);
+ });
+ }
+ getFinalKeyframe() {
+ return this._keyframes.get(this.duration);
+ }
+ get properties() {
+ const properties = [];
+ for (let prop in this._currentKeyframe) {
+ properties.push(prop);
+ }
+ return properties;
+ }
+ mergeTimelineCollectedStyles(timeline) {
+ Object.keys(timeline._styleSummary).forEach(prop => {
+ const details0 = this._styleSummary[prop];
+ const details1 = timeline._styleSummary[prop];
+ if (!details0 || details1.time > details0.time) {
+ this._updateStyle(prop, details1.value);
+ }
+ });
+ }
+ buildKeyframes() {
+ this.applyStylesToKeyframe();
+ const preStyleProps = new Set();
+ const postStyleProps = new Set();
+ const isEmpty = this._keyframes.size === 1 && this.duration === 0;
+ let finalKeyframes = [];
+ this._keyframes.forEach((keyframe, time) => {
+ const finalKeyframe = copyStyles(keyframe, true);
+ Object.keys(finalKeyframe).forEach(prop => {
+ const value = finalKeyframe[prop];
+ if (value == _angular_animations__WEBPACK_IMPORTED_MODULE_0__["ɵPRE_STYLE"]) {
+ preStyleProps.add(prop);
+ }
+ else if (value == _angular_animations__WEBPACK_IMPORTED_MODULE_0__["AUTO_STYLE"]) {
+ postStyleProps.add(prop);
+ }
+ });
+ if (!isEmpty) {
+ finalKeyframe['offset'] = time / this.duration;
+ }
+ finalKeyframes.push(finalKeyframe);
+ });
+ const preProps = preStyleProps.size ? iteratorToArray(preStyleProps.values()) : [];
+ const postProps = postStyleProps.size ? iteratorToArray(postStyleProps.values()) : [];
+ // special case for a 0-second animation (which is designed just to place styles onscreen)
+ if (isEmpty) {
+ const kf0 = finalKeyframes[0];
+ const kf1 = copyObj(kf0);
+ kf0['offset'] = 0;
+ kf1['offset'] = 1;
+ finalKeyframes = [kf0, kf1];
+ }
+ return createTimelineInstruction(this.element, finalKeyframes, preProps, postProps, this.duration, this.startTime, this.easing, false);
+ }
+}
+class SubTimelineBuilder extends TimelineBuilder {
+ constructor(driver, element, keyframes, preStyleProps, postStyleProps, timings, _stretchStartingKeyframe = false) {
+ super(driver, element, timings.delay);
+ this.element = element;
+ this.keyframes = keyframes;
+ this.preStyleProps = preStyleProps;
+ this.postStyleProps = postStyleProps;
+ this._stretchStartingKeyframe = _stretchStartingKeyframe;
+ this.timings = { duration: timings.duration, delay: timings.delay, easing: timings.easing };
+ }
+ containsAnimation() {
+ return this.keyframes.length > 1;
+ }
+ buildKeyframes() {
+ let keyframes = this.keyframes;
+ let { delay, duration, easing } = this.timings;
+ if (this._stretchStartingKeyframe && delay) {
+ const newKeyframes = [];
+ const totalTime = duration + delay;
+ const startingGap = delay / totalTime;
+ // the original starting keyframe now starts once the delay is done
+ const newFirstKeyframe = copyStyles(keyframes[0], false);
+ newFirstKeyframe['offset'] = 0;
+ newKeyframes.push(newFirstKeyframe);
+ const oldFirstKeyframe = copyStyles(keyframes[0], false);
+ oldFirstKeyframe['offset'] = roundOffset(startingGap);
+ newKeyframes.push(oldFirstKeyframe);
+ /*
+ When the keyframe is stretched then it means that the delay before the animation
+ starts is gone. Instead the first keyframe is placed at the start of the animation
+ and it is then copied to where it starts when the original delay is over. This basically
+ means nothing animates during that delay, but the styles are still renderered. For this
+ to work the original offset values that exist in the original keyframes must be "warped"
+ so that they can take the new keyframe + delay into account.
+
+ delay=1000, duration=1000, keyframes = 0 .5 1
+
+ turns into
+
+ delay=0, duration=2000, keyframes = 0 .33 .66 1
+ */
+ // offsets between 1 ... n -1 are all warped by the keyframe stretch
+ const limit = keyframes.length - 1;
+ for (let i = 1; i <= limit; i++) {
+ let kf = copyStyles(keyframes[i], false);
+ const oldOffset = kf['offset'];
+ const timeAtKeyframe = delay + oldOffset * duration;
+ kf['offset'] = roundOffset(timeAtKeyframe / totalTime);
+ newKeyframes.push(kf);
+ }
+ // the new starting keyframe should be added at the start
+ duration = totalTime;
+ delay = 0;
+ easing = '';
+ keyframes = newKeyframes;
+ }
+ return createTimelineInstruction(this.element, keyframes, this.preStyleProps, this.postStyleProps, duration, delay, easing, true);
+ }
+}
+function roundOffset(offset, decimalPoints = 3) {
+ const mult = Math.pow(10, decimalPoints - 1);
+ return Math.round(offset * mult) / mult;
+}
+function flattenStyles(input, allStyles) {
+ const styles = {};
+ let allProperties;
+ input.forEach(token => {
+ if (token === '*') {
+ allProperties = allProperties || Object.keys(allStyles);
+ allProperties.forEach(prop => {
+ styles[prop] = _angular_animations__WEBPACK_IMPORTED_MODULE_0__["AUTO_STYLE"];
+ });
+ }
+ else {
+ copyStyles(token, false, styles);
+ }
+ });
+ return styles;
+}
+
+class Animation {
+ constructor(_driver, input) {
+ this._driver = _driver;
+ const errors = [];
+ const ast = buildAnimationAst(_driver, input, errors);
+ if (errors.length) {
+ const errorMessage = `animation validation failed:\n${errors.join('\n')}`;
+ throw new Error(errorMessage);
+ }
+ this._animationAst = ast;
+ }
+ buildTimelines(element, startingStyles, destinationStyles, options, subInstructions) {
+ const start = Array.isArray(startingStyles) ? normalizeStyles(startingStyles) :
+ startingStyles;
+ const dest = Array.isArray(destinationStyles) ? normalizeStyles(destinationStyles) :
+ destinationStyles;
+ const errors = [];
+ subInstructions = subInstructions || new ElementInstructionMap();
+ const result = buildAnimationTimelines(this._driver, element, this._animationAst, ENTER_CLASSNAME, LEAVE_CLASSNAME, start, dest, options, subInstructions, errors);
+ if (errors.length) {
+ const errorMessage = `animation building failed:\n${errors.join('\n')}`;
+ throw new Error(errorMessage);
+ }
+ return result;
+ }
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * @publicApi
+ */
+class AnimationStyleNormalizer {
+}
+/**
+ * @publicApi
+ */
+class NoopAnimationStyleNormalizer {
+ normalizePropertyName(propertyName, errors) {
+ return propertyName;
+ }
+ normalizeStyleValue(userProvidedProperty, normalizedProperty, value, errors) {
+ return value;
+ }
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+class WebAnimationsStyleNormalizer extends AnimationStyleNormalizer {
+ normalizePropertyName(propertyName, errors) {
+ return dashCaseToCamelCase(propertyName);
+ }
+ normalizeStyleValue(userProvidedProperty, normalizedProperty, value, errors) {
+ let unit = '';
+ const strVal = value.toString().trim();
+ if (DIMENSIONAL_PROP_MAP[normalizedProperty] && value !== 0 && value !== '0') {
+ if (typeof value === 'number') {
+ unit = 'px';
+ }
+ else {
+ const valAndSuffixMatch = value.match(/^[+-]?[\d\.]+([a-z]*)$/);
+ if (valAndSuffixMatch && valAndSuffixMatch[1].length == 0) {
+ errors.push(`Please provide a CSS unit value for ${userProvidedProperty}:${value}`);
+ }
+ }
+ }
+ return strVal + unit;
+ }
+}
+const ɵ0$1 = () => makeBooleanMap('width,height,minWidth,minHeight,maxWidth,maxHeight,left,top,bottom,right,fontSize,outlineWidth,outlineOffset,paddingTop,paddingLeft,paddingBottom,paddingRight,marginTop,marginLeft,marginBottom,marginRight,borderRadius,borderWidth,borderTopWidth,borderLeftWidth,borderRightWidth,borderBottomWidth,textIndent,perspective'
+ .split(','));
+const DIMENSIONAL_PROP_MAP = (ɵ0$1)();
+function makeBooleanMap(keys) {
+ const map = {};
+ keys.forEach(key => map[key] = true);
+ return map;
+}
+
+function createTransitionInstruction(element, triggerName, fromState, toState, isRemovalTransition, fromStyles, toStyles, timelines, queriedElements, preStyleProps, postStyleProps, totalTime, errors) {
+ return {
+ type: 0 /* TransitionAnimation */,
+ element,
+ triggerName,
+ isRemovalTransition,
+ fromState,
+ fromStyles,
+ toState,
+ toStyles,
+ timelines,
+ queriedElements,
+ preStyleProps,
+ postStyleProps,
+ totalTime,
+ errors
+ };
+}
+
+const EMPTY_OBJECT = {};
+class AnimationTransitionFactory {
+ constructor(_triggerName, ast, _stateStyles) {
+ this._triggerName = _triggerName;
+ this.ast = ast;
+ this._stateStyles = _stateStyles;
+ }
+ match(currentState, nextState, element, params) {
+ return oneOrMoreTransitionsMatch(this.ast.matchers, currentState, nextState, element, params);
+ }
+ buildStyles(stateName, params, errors) {
+ const backupStateStyler = this._stateStyles['*'];
+ const stateStyler = this._stateStyles[stateName];
+ const backupStyles = backupStateStyler ? backupStateStyler.buildStyles(params, errors) : {};
+ return stateStyler ? stateStyler.buildStyles(params, errors) : backupStyles;
+ }
+ build(driver, element, currentState, nextState, enterClassName, leaveClassName, currentOptions, nextOptions, subInstructions, skipAstBuild) {
+ const errors = [];
+ const transitionAnimationParams = this.ast.options && this.ast.options.params || EMPTY_OBJECT;
+ const currentAnimationParams = currentOptions && currentOptions.params || EMPTY_OBJECT;
+ const currentStateStyles = this.buildStyles(currentState, currentAnimationParams, errors);
+ const nextAnimationParams = nextOptions && nextOptions.params || EMPTY_OBJECT;
+ const nextStateStyles = this.buildStyles(nextState, nextAnimationParams, errors);
+ const queriedElements = new Set();
+ const preStyleMap = new Map();
+ const postStyleMap = new Map();
+ const isRemoval = nextState === 'void';
+ const animationOptions = { params: Object.assign(Object.assign({}, transitionAnimationParams), nextAnimationParams) };
+ const timelines = skipAstBuild ?
+ [] :
+ buildAnimationTimelines(driver, element, this.ast.animation, enterClassName, leaveClassName, currentStateStyles, nextStateStyles, animationOptions, subInstructions, errors);
+ let totalTime = 0;
+ timelines.forEach(tl => {
+ totalTime = Math.max(tl.duration + tl.delay, totalTime);
+ });
+ if (errors.length) {
+ return createTransitionInstruction(element, this._triggerName, currentState, nextState, isRemoval, currentStateStyles, nextStateStyles, [], [], preStyleMap, postStyleMap, totalTime, errors);
+ }
+ timelines.forEach(tl => {
+ const elm = tl.element;
+ const preProps = getOrSetAsInMap(preStyleMap, elm, {});
+ tl.preStyleProps.forEach(prop => preProps[prop] = true);
+ const postProps = getOrSetAsInMap(postStyleMap, elm, {});
+ tl.postStyleProps.forEach(prop => postProps[prop] = true);
+ if (elm !== element) {
+ queriedElements.add(elm);
+ }
+ });
+ const queriedElementsList = iteratorToArray(queriedElements.values());
+ return createTransitionInstruction(element, this._triggerName, currentState, nextState, isRemoval, currentStateStyles, nextStateStyles, timelines, queriedElementsList, preStyleMap, postStyleMap, totalTime);
+ }
+}
+function oneOrMoreTransitionsMatch(matchFns, currentState, nextState, element, params) {
+ return matchFns.some(fn => fn(currentState, nextState, element, params));
+}
+class AnimationStateStyles {
+ constructor(styles, defaultParams) {
+ this.styles = styles;
+ this.defaultParams = defaultParams;
+ }
+ buildStyles(params, errors) {
+ const finalStyles = {};
+ const combinedParams = copyObj(this.defaultParams);
+ Object.keys(params).forEach(key => {
+ const value = params[key];
+ if (value != null) {
+ combinedParams[key] = value;
+ }
+ });
+ this.styles.styles.forEach(value => {
+ if (typeof value !== 'string') {
+ const styleObj = value;
+ Object.keys(styleObj).forEach(prop => {
+ let val = styleObj[prop];
+ if (val.length > 1) {
+ val = interpolateParams(val, combinedParams, errors);
+ }
+ finalStyles[prop] = val;
+ });
+ }
+ });
+ return finalStyles;
+ }
+}
+
+/**
+ * @publicApi
+ */
+function buildTrigger(name, ast) {
+ return new AnimationTrigger(name, ast);
+}
+/**
+ * @publicApi
+ */
+class AnimationTrigger {
+ constructor(name, ast) {
+ this.name = name;
+ this.ast = ast;
+ this.transitionFactories = [];
+ this.states = {};
+ ast.states.forEach(ast => {
+ const defaultParams = (ast.options && ast.options.params) || {};
+ this.states[ast.name] = new AnimationStateStyles(ast.style, defaultParams);
+ });
+ balanceProperties(this.states, 'true', '1');
+ balanceProperties(this.states, 'false', '0');
+ ast.transitions.forEach(ast => {
+ this.transitionFactories.push(new AnimationTransitionFactory(name, ast, this.states));
+ });
+ this.fallbackTransition = createFallbackTransition(name, this.states);
+ }
+ get containsQueries() {
+ return this.ast.queryCount > 0;
+ }
+ matchTransition(currentState, nextState, element, params) {
+ const entry = this.transitionFactories.find(f => f.match(currentState, nextState, element, params));
+ return entry || null;
+ }
+ matchStyles(currentState, params, errors) {
+ return this.fallbackTransition.buildStyles(currentState, params, errors);
+ }
+}
+function createFallbackTransition(triggerName, states) {
+ const matchers = [(fromState, toState) => true];
+ const animation = { type: 2 /* Sequence */, steps: [], options: null };
+ const transition = {
+ type: 1 /* Transition */,
+ animation,
+ matchers,
+ options: null,
+ queryCount: 0,
+ depCount: 0
+ };
+ return new AnimationTransitionFactory(triggerName, transition, states);
+}
+function balanceProperties(obj, key1, key2) {
+ if (obj.hasOwnProperty(key1)) {
+ if (!obj.hasOwnProperty(key2)) {
+ obj[key2] = obj[key1];
+ }
+ }
+ else if (obj.hasOwnProperty(key2)) {
+ obj[key1] = obj[key2];
+ }
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+const EMPTY_INSTRUCTION_MAP = new ElementInstructionMap();
+class TimelineAnimationEngine {
+ constructor(bodyNode, _driver, _normalizer) {
+ this.bodyNode = bodyNode;
+ this._driver = _driver;
+ this._normalizer = _normalizer;
+ this._animations = {};
+ this._playersById = {};
+ this.players = [];
+ }
+ register(id, metadata) {
+ const errors = [];
+ const ast = buildAnimationAst(this._driver, metadata, errors);
+ if (errors.length) {
+ throw new Error(`Unable to build the animation due to the following errors: ${errors.join('\n')}`);
+ }
+ else {
+ this._animations[id] = ast;
+ }
+ }
+ _buildPlayer(i, preStyles, postStyles) {
+ const element = i.element;
+ const keyframes = normalizeKeyframes(this._driver, this._normalizer, element, i.keyframes, preStyles, postStyles);
+ return this._driver.animate(element, keyframes, i.duration, i.delay, i.easing, [], true);
+ }
+ create(id, element, options = {}) {
+ const errors = [];
+ const ast = this._animations[id];
+ let instructions;
+ const autoStylesMap = new Map();
+ if (ast) {
+ instructions = buildAnimationTimelines(this._driver, element, ast, ENTER_CLASSNAME, LEAVE_CLASSNAME, {}, {}, options, EMPTY_INSTRUCTION_MAP, errors);
+ instructions.forEach(inst => {
+ const styles = getOrSetAsInMap(autoStylesMap, inst.element, {});
+ inst.postStyleProps.forEach(prop => styles[prop] = null);
+ });
+ }
+ else {
+ errors.push('The requested animation doesn\'t exist or has already been destroyed');
+ instructions = [];
+ }
+ if (errors.length) {
+ throw new Error(`Unable to create the animation due to the following errors: ${errors.join('\n')}`);
+ }
+ autoStylesMap.forEach((styles, element) => {
+ Object.keys(styles).forEach(prop => {
+ styles[prop] = this._driver.computeStyle(element, prop, _angular_animations__WEBPACK_IMPORTED_MODULE_0__["AUTO_STYLE"]);
+ });
+ });
+ const players = instructions.map(i => {
+ const styles = autoStylesMap.get(i.element);
+ return this._buildPlayer(i, {}, styles);
+ });
+ const player = optimizeGroupPlayer(players);
+ this._playersById[id] = player;
+ player.onDestroy(() => this.destroy(id));
+ this.players.push(player);
+ return player;
+ }
+ destroy(id) {
+ const player = this._getPlayer(id);
+ player.destroy();
+ delete this._playersById[id];
+ const index = this.players.indexOf(player);
+ if (index >= 0) {
+ this.players.splice(index, 1);
+ }
+ }
+ _getPlayer(id) {
+ const player = this._playersById[id];
+ if (!player) {
+ throw new Error(`Unable to find the timeline player referenced by ${id}`);
+ }
+ return player;
+ }
+ listen(id, element, eventName, callback) {
+ // triggerName, fromState, toState are all ignored for timeline animations
+ const baseEvent = makeAnimationEvent(element, '', '', '');
+ listenOnPlayer(this._getPlayer(id), eventName, baseEvent, callback);
+ return () => { };
+ }
+ command(id, element, command, args) {
+ if (command == 'register') {
+ this.register(id, args[0]);
+ return;
+ }
+ if (command == 'create') {
+ const options = (args[0] || {});
+ this.create(id, element, options);
+ return;
+ }
+ const player = this._getPlayer(id);
+ switch (command) {
+ case 'play':
+ player.play();
+ break;
+ case 'pause':
+ player.pause();
+ break;
+ case 'reset':
+ player.reset();
+ break;
+ case 'restart':
+ player.restart();
+ break;
+ case 'finish':
+ player.finish();
+ break;
+ case 'init':
+ player.init();
+ break;
+ case 'setPosition':
+ player.setPosition(parseFloat(args[0]));
+ break;
+ case 'destroy':
+ this.destroy(id);
+ break;
+ }
+ }
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+const QUEUED_CLASSNAME = 'ng-animate-queued';
+const QUEUED_SELECTOR = '.ng-animate-queued';
+const DISABLED_CLASSNAME = 'ng-animate-disabled';
+const DISABLED_SELECTOR = '.ng-animate-disabled';
+const STAR_CLASSNAME = 'ng-star-inserted';
+const STAR_SELECTOR = '.ng-star-inserted';
+const EMPTY_PLAYER_ARRAY = [];
+const NULL_REMOVAL_STATE = {
+ namespaceId: '',
+ setForRemoval: false,
+ setForMove: false,
+ hasAnimation: false,
+ removedBeforeQueried: false
+};
+const NULL_REMOVED_QUERIED_STATE = {
+ namespaceId: '',
+ setForMove: false,
+ setForRemoval: false,
+ hasAnimation: false,
+ removedBeforeQueried: true
+};
+const REMOVAL_FLAG = '__ng_removed';
+class StateValue {
+ constructor(input, namespaceId = '') {
+ this.namespaceId = namespaceId;
+ const isObj = input && input.hasOwnProperty('value');
+ const value = isObj ? input['value'] : input;
+ this.value = normalizeTriggerValue(value);
+ if (isObj) {
+ const options = copyObj(input);
+ delete options['value'];
+ this.options = options;
+ }
+ else {
+ this.options = {};
+ }
+ if (!this.options.params) {
+ this.options.params = {};
+ }
+ }
+ get params() {
+ return this.options.params;
+ }
+ absorbOptions(options) {
+ const newParams = options.params;
+ if (newParams) {
+ const oldParams = this.options.params;
+ Object.keys(newParams).forEach(prop => {
+ if (oldParams[prop] == null) {
+ oldParams[prop] = newParams[prop];
+ }
+ });
+ }
+ }
+}
+const VOID_VALUE = 'void';
+const DEFAULT_STATE_VALUE = new StateValue(VOID_VALUE);
+class AnimationTransitionNamespace {
+ constructor(id, hostElement, _engine) {
+ this.id = id;
+ this.hostElement = hostElement;
+ this._engine = _engine;
+ this.players = [];
+ this._triggers = {};
+ this._queue = [];
+ this._elementListeners = new Map();
+ this._hostClassName = 'ng-tns-' + id;
+ addClass(hostElement, this._hostClassName);
+ }
+ listen(element, name, phase, callback) {
+ if (!this._triggers.hasOwnProperty(name)) {
+ throw new Error(`Unable to listen on the animation trigger event "${phase}" because the animation trigger "${name}" doesn\'t exist!`);
+ }
+ if (phase == null || phase.length == 0) {
+ throw new Error(`Unable to listen on the animation trigger "${name}" because the provided event is undefined!`);
+ }
+ if (!isTriggerEventValid(phase)) {
+ throw new Error(`The provided animation trigger event "${phase}" for the animation trigger "${name}" is not supported!`);
+ }
+ const listeners = getOrSetAsInMap(this._elementListeners, element, []);
+ const data = { name, phase, callback };
+ listeners.push(data);
+ const triggersWithStates = getOrSetAsInMap(this._engine.statesByElement, element, {});
+ if (!triggersWithStates.hasOwnProperty(name)) {
+ addClass(element, NG_TRIGGER_CLASSNAME);
+ addClass(element, NG_TRIGGER_CLASSNAME + '-' + name);
+ triggersWithStates[name] = DEFAULT_STATE_VALUE;
+ }
+ return () => {
+ // the event listener is removed AFTER the flush has occurred such
+ // that leave animations callbacks can fire (otherwise if the node
+ // is removed in between then the listeners would be deregistered)
+ this._engine.afterFlush(() => {
+ const index = listeners.indexOf(data);
+ if (index >= 0) {
+ listeners.splice(index, 1);
+ }
+ if (!this._triggers[name]) {
+ delete triggersWithStates[name];
+ }
+ });
+ };
+ }
+ register(name, ast) {
+ if (this._triggers[name]) {
+ // throw
+ return false;
+ }
+ else {
+ this._triggers[name] = ast;
+ return true;
+ }
+ }
+ _getTrigger(name) {
+ const trigger = this._triggers[name];
+ if (!trigger) {
+ throw new Error(`The provided animation trigger "${name}" has not been registered!`);
+ }
+ return trigger;
+ }
+ trigger(element, triggerName, value, defaultToFallback = true) {
+ const trigger = this._getTrigger(triggerName);
+ const player = new TransitionAnimationPlayer(this.id, triggerName, element);
+ let triggersWithStates = this._engine.statesByElement.get(element);
+ if (!triggersWithStates) {
+ addClass(element, NG_TRIGGER_CLASSNAME);
+ addClass(element, NG_TRIGGER_CLASSNAME + '-' + triggerName);
+ this._engine.statesByElement.set(element, triggersWithStates = {});
+ }
+ let fromState = triggersWithStates[triggerName];
+ const toState = new StateValue(value, this.id);
+ const isObj = value && value.hasOwnProperty('value');
+ if (!isObj && fromState) {
+ toState.absorbOptions(fromState.options);
+ }
+ triggersWithStates[triggerName] = toState;
+ if (!fromState) {
+ fromState = DEFAULT_STATE_VALUE;
+ }
+ const isRemoval = toState.value === VOID_VALUE;
+ // normally this isn't reached by here, however, if an object expression
+ // is passed in then it may be a new object each time. Comparing the value
+ // is important since that will stay the same despite there being a new object.
+ // The removal arc here is special cased because the same element is triggered
+ // twice in the event that it contains animations on the outer/inner portions
+ // of the host container
+ if (!isRemoval && fromState.value === toState.value) {
+ // this means that despite the value not changing, some inner params
+ // have changed which means that the animation final styles need to be applied
+ if (!objEquals(fromState.params, toState.params)) {
+ const errors = [];
+ const fromStyles = trigger.matchStyles(fromState.value, fromState.params, errors);
+ const toStyles = trigger.matchStyles(toState.value, toState.params, errors);
+ if (errors.length) {
+ this._engine.reportError(errors);
+ }
+ else {
+ this._engine.afterFlush(() => {
+ eraseStyles(element, fromStyles);
+ setStyles(element, toStyles);
+ });
+ }
+ }
+ return;
+ }
+ const playersOnElement = getOrSetAsInMap(this._engine.playersByElement, element, []);
+ playersOnElement.forEach(player => {
+ // only remove the player if it is queued on the EXACT same trigger/namespace
+ // we only also deal with queued players here because if the animation has
+ // started then we want to keep the player alive until the flush happens
+ // (which is where the previousPlayers are passed into the new palyer)
+ if (player.namespaceId == this.id && player.triggerName == triggerName && player.queued) {
+ player.destroy();
+ }
+ });
+ let transition = trigger.matchTransition(fromState.value, toState.value, element, toState.params);
+ let isFallbackTransition = false;
+ if (!transition) {
+ if (!defaultToFallback)
+ return;
+ transition = trigger.fallbackTransition;
+ isFallbackTransition = true;
+ }
+ this._engine.totalQueuedPlayers++;
+ this._queue.push({ element, triggerName, transition, fromState, toState, player, isFallbackTransition });
+ if (!isFallbackTransition) {
+ addClass(element, QUEUED_CLASSNAME);
+ player.onStart(() => {
+ removeClass(element, QUEUED_CLASSNAME);
+ });
+ }
+ player.onDone(() => {
+ let index = this.players.indexOf(player);
+ if (index >= 0) {
+ this.players.splice(index, 1);
+ }
+ const players = this._engine.playersByElement.get(element);
+ if (players) {
+ let index = players.indexOf(player);
+ if (index >= 0) {
+ players.splice(index, 1);
+ }
+ }
+ });
+ this.players.push(player);
+ playersOnElement.push(player);
+ return player;
+ }
+ deregister(name) {
+ delete this._triggers[name];
+ this._engine.statesByElement.forEach((stateMap, element) => {
+ delete stateMap[name];
+ });
+ this._elementListeners.forEach((listeners, element) => {
+ this._elementListeners.set(element, listeners.filter(entry => {
+ return entry.name != name;
+ }));
+ });
+ }
+ clearElementCache(element) {
+ this._engine.statesByElement.delete(element);
+ this._elementListeners.delete(element);
+ const elementPlayers = this._engine.playersByElement.get(element);
+ if (elementPlayers) {
+ elementPlayers.forEach(player => player.destroy());
+ this._engine.playersByElement.delete(element);
+ }
+ }
+ _signalRemovalForInnerTriggers(rootElement, context) {
+ const elements = this._engine.driver.query(rootElement, NG_TRIGGER_SELECTOR, true);
+ // emulate a leave animation for all inner nodes within this node.
+ // If there are no animations found for any of the nodes then clear the cache
+ // for the element.
+ elements.forEach(elm => {
+ // this means that an inner remove() operation has already kicked off
+ // the animation on this element...
+ if (elm[REMOVAL_FLAG])
+ return;
+ const namespaces = this._engine.fetchNamespacesByElement(elm);
+ if (namespaces.size) {
+ namespaces.forEach(ns => ns.triggerLeaveAnimation(elm, context, false, true));
+ }
+ else {
+ this.clearElementCache(elm);
+ }
+ });
+ // If the child elements were removed along with the parent, their animations might not
+ // have completed. Clear all the elements from the cache so we don't end up with a memory leak.
+ this._engine.afterFlushAnimationsDone(() => elements.forEach(elm => this.clearElementCache(elm)));
+ }
+ triggerLeaveAnimation(element, context, destroyAfterComplete, defaultToFallback) {
+ const triggerStates = this._engine.statesByElement.get(element);
+ if (triggerStates) {
+ const players = [];
+ Object.keys(triggerStates).forEach(triggerName => {
+ // this check is here in the event that an element is removed
+ // twice (both on the host level and the component level)
+ if (this._triggers[triggerName]) {
+ const player = this.trigger(element, triggerName, VOID_VALUE, defaultToFallback);
+ if (player) {
+ players.push(player);
+ }
+ }
+ });
+ if (players.length) {
+ this._engine.markElementAsRemoved(this.id, element, true, context);
+ if (destroyAfterComplete) {
+ optimizeGroupPlayer(players).onDone(() => this._engine.processLeaveNode(element));
+ }
+ return true;
+ }
+ }
+ return false;
+ }
+ prepareLeaveAnimationListeners(element) {
+ const listeners = this._elementListeners.get(element);
+ const elementStates = this._engine.statesByElement.get(element);
+ // if this statement fails then it means that the element was picked up
+ // by an earlier flush (or there are no listeners at all to track the leave).
+ if (listeners && elementStates) {
+ const visitedTriggers = new Set();
+ listeners.forEach(listener => {
+ const triggerName = listener.name;
+ if (visitedTriggers.has(triggerName))
+ return;
+ visitedTriggers.add(triggerName);
+ const trigger = this._triggers[triggerName];
+ const transition = trigger.fallbackTransition;
+ const fromState = elementStates[triggerName] || DEFAULT_STATE_VALUE;
+ const toState = new StateValue(VOID_VALUE);
+ const player = new TransitionAnimationPlayer(this.id, triggerName, element);
+ this._engine.totalQueuedPlayers++;
+ this._queue.push({
+ element,
+ triggerName,
+ transition,
+ fromState,
+ toState,
+ player,
+ isFallbackTransition: true
+ });
+ });
+ }
+ }
+ removeNode(element, context) {
+ const engine = this._engine;
+ if (element.childElementCount) {
+ this._signalRemovalForInnerTriggers(element, context);
+ }
+ // this means that a * => VOID animation was detected and kicked off
+ if (this.triggerLeaveAnimation(element, context, true))
+ return;
+ // find the player that is animating and make sure that the
+ // removal is delayed until that player has completed
+ let containsPotentialParentTransition = false;
+ if (engine.totalAnimations) {
+ const currentPlayers = engine.players.length ? engine.playersByQueriedElement.get(element) : [];
+ // when this `if statement` does not continue forward it means that
+ // a previous animation query has selected the current element and
+ // is animating it. In this situation want to continue forwards and
+ // allow the element to be queued up for animation later.
+ if (currentPlayers && currentPlayers.length) {
+ containsPotentialParentTransition = true;
+ }
+ else {
+ let parent = element;
+ while (parent = parent.parentNode) {
+ const triggers = engine.statesByElement.get(parent);
+ if (triggers) {
+ containsPotentialParentTransition = true;
+ break;
+ }
+ }
+ }
+ }
+ // at this stage we know that the element will either get removed
+ // during flush or will be picked up by a parent query. Either way
+ // we need to fire the listeners for this element when it DOES get
+ // removed (once the query parent animation is done or after flush)
+ this.prepareLeaveAnimationListeners(element);
+ // whether or not a parent has an animation we need to delay the deferral of the leave
+ // operation until we have more information (which we do after flush() has been called)
+ if (containsPotentialParentTransition) {
+ engine.markElementAsRemoved(this.id, element, false, context);
+ }
+ else {
+ const removalFlag = element[REMOVAL_FLAG];
+ if (!removalFlag || removalFlag === NULL_REMOVAL_STATE) {
+ // we do this after the flush has occurred such
+ // that the callbacks can be fired
+ engine.afterFlush(() => this.clearElementCache(element));
+ engine.destroyInnerAnimations(element);
+ engine._onRemovalComplete(element, context);
+ }
+ }
+ }
+ insertNode(element, parent) {
+ addClass(element, this._hostClassName);
+ }
+ drainQueuedTransitions(microtaskId) {
+ const instructions = [];
+ this._queue.forEach(entry => {
+ const player = entry.player;
+ if (player.destroyed)
+ return;
+ const element = entry.element;
+ const listeners = this._elementListeners.get(element);
+ if (listeners) {
+ listeners.forEach((listener) => {
+ if (listener.name == entry.triggerName) {
+ const baseEvent = makeAnimationEvent(element, entry.triggerName, entry.fromState.value, entry.toState.value);
+ baseEvent['_data'] = microtaskId;
+ listenOnPlayer(entry.player, listener.phase, baseEvent, listener.callback);
+ }
+ });
+ }
+ if (player.markedForDestroy) {
+ this._engine.afterFlush(() => {
+ // now we can destroy the element properly since the event listeners have
+ // been bound to the player
+ player.destroy();
+ });
+ }
+ else {
+ instructions.push(entry);
+ }
+ });
+ this._queue = [];
+ return instructions.sort((a, b) => {
+ // if depCount == 0 them move to front
+ // otherwise if a contains b then move back
+ const d0 = a.transition.ast.depCount;
+ const d1 = b.transition.ast.depCount;
+ if (d0 == 0 || d1 == 0) {
+ return d0 - d1;
+ }
+ return this._engine.driver.containsElement(a.element, b.element) ? 1 : -1;
+ });
+ }
+ destroy(context) {
+ this.players.forEach(p => p.destroy());
+ this._signalRemovalForInnerTriggers(this.hostElement, context);
+ }
+ elementContainsData(element) {
+ let containsData = false;
+ if (this._elementListeners.has(element))
+ containsData = true;
+ containsData =
+ (this._queue.find(entry => entry.element === element) ? true : false) || containsData;
+ return containsData;
+ }
+}
+class TransitionAnimationEngine {
+ constructor(bodyNode, driver, _normalizer) {
+ this.bodyNode = bodyNode;
+ this.driver = driver;
+ this._normalizer = _normalizer;
+ this.players = [];
+ this.newHostElements = new Map();
+ this.playersByElement = new Map();
+ this.playersByQueriedElement = new Map();
+ this.statesByElement = new Map();
+ this.disabledNodes = new Set();
+ this.totalAnimations = 0;
+ this.totalQueuedPlayers = 0;
+ this._namespaceLookup = {};
+ this._namespaceList = [];
+ this._flushFns = [];
+ this._whenQuietFns = [];
+ this.namespacesByHostElement = new Map();
+ this.collectedEnterElements = [];
+ this.collectedLeaveElements = [];
+ // this method is designed to be overridden by the code that uses this engine
+ this.onRemovalComplete = (element, context) => { };
+ }
+ /** @internal */
+ _onRemovalComplete(element, context) {
+ this.onRemovalComplete(element, context);
+ }
+ get queuedPlayers() {
+ const players = [];
+ this._namespaceList.forEach(ns => {
+ ns.players.forEach(player => {
+ if (player.queued) {
+ players.push(player);
+ }
+ });
+ });
+ return players;
+ }
+ createNamespace(namespaceId, hostElement) {
+ const ns = new AnimationTransitionNamespace(namespaceId, hostElement, this);
+ if (this.bodyNode && this.driver.containsElement(this.bodyNode, hostElement)) {
+ this._balanceNamespaceList(ns, hostElement);
+ }
+ else {
+ // defer this later until flush during when the host element has
+ // been inserted so that we know exactly where to place it in
+ // the namespace list
+ this.newHostElements.set(hostElement, ns);
+ // given that this host element is apart of the animation code, it
+ // may or may not be inserted by a parent node that is of an
+ // animation renderer type. If this happens then we can still have
+ // access to this item when we query for :enter nodes. If the parent
+ // is a renderer then the set data-structure will normalize the entry
+ this.collectEnterElement(hostElement);
+ }
+ return this._namespaceLookup[namespaceId] = ns;
+ }
+ _balanceNamespaceList(ns, hostElement) {
+ const limit = this._namespaceList.length - 1;
+ if (limit >= 0) {
+ let found = false;
+ for (let i = limit; i >= 0; i--) {
+ const nextNamespace = this._namespaceList[i];
+ if (this.driver.containsElement(nextNamespace.hostElement, hostElement)) {
+ this._namespaceList.splice(i + 1, 0, ns);
+ found = true;
+ break;
+ }
+ }
+ if (!found) {
+ this._namespaceList.splice(0, 0, ns);
+ }
+ }
+ else {
+ this._namespaceList.push(ns);
+ }
+ this.namespacesByHostElement.set(hostElement, ns);
+ return ns;
+ }
+ register(namespaceId, hostElement) {
+ let ns = this._namespaceLookup[namespaceId];
+ if (!ns) {
+ ns = this.createNamespace(namespaceId, hostElement);
+ }
+ return ns;
+ }
+ registerTrigger(namespaceId, name, trigger) {
+ let ns = this._namespaceLookup[namespaceId];
+ if (ns && ns.register(name, trigger)) {
+ this.totalAnimations++;
+ }
+ }
+ destroy(namespaceId, context) {
+ if (!namespaceId)
+ return;
+ const ns = this._fetchNamespace(namespaceId);
+ this.afterFlush(() => {
+ this.namespacesByHostElement.delete(ns.hostElement);
+ delete this._namespaceLookup[namespaceId];
+ const index = this._namespaceList.indexOf(ns);
+ if (index >= 0) {
+ this._namespaceList.splice(index, 1);
+ }
+ });
+ this.afterFlushAnimationsDone(() => ns.destroy(context));
+ }
+ _fetchNamespace(id) {
+ return this._namespaceLookup[id];
+ }
+ fetchNamespacesByElement(element) {
+ // normally there should only be one namespace per element, however
+ // if @triggers are placed on both the component element and then
+ // its host element (within the component code) then there will be
+ // two namespaces returned. We use a set here to simply the dedupe
+ // of namespaces incase there are multiple triggers both the elm and host
+ const namespaces = new Set();
+ const elementStates = this.statesByElement.get(element);
+ if (elementStates) {
+ const keys = Object.keys(elementStates);
+ for (let i = 0; i < keys.length; i++) {
+ const nsId = elementStates[keys[i]].namespaceId;
+ if (nsId) {
+ const ns = this._fetchNamespace(nsId);
+ if (ns) {
+ namespaces.add(ns);
+ }
+ }
+ }
+ }
+ return namespaces;
+ }
+ trigger(namespaceId, element, name, value) {
+ if (isElementNode(element)) {
+ const ns = this._fetchNamespace(namespaceId);
+ if (ns) {
+ ns.trigger(element, name, value);
+ return true;
+ }
+ }
+ return false;
+ }
+ insertNode(namespaceId, element, parent, insertBefore) {
+ if (!isElementNode(element))
+ return;
+ // special case for when an element is removed and reinserted (move operation)
+ // when this occurs we do not want to use the element for deletion later
+ const details = element[REMOVAL_FLAG];
+ if (details && details.setForRemoval) {
+ details.setForRemoval = false;
+ details.setForMove = true;
+ const index = this.collectedLeaveElements.indexOf(element);
+ if (index >= 0) {
+ this.collectedLeaveElements.splice(index, 1);
+ }
+ }
+ // in the event that the namespaceId is blank then the caller
+ // code does not contain any animation code in it, but it is
+ // just being called so that the node is marked as being inserted
+ if (namespaceId) {
+ const ns = this._fetchNamespace(namespaceId);
+ // This if-statement is a workaround for router issue #21947.
+ // The router sometimes hits a race condition where while a route
+ // is being instantiated a new navigation arrives, triggering leave
+ // animation of DOM that has not been fully initialized, until this
+ // is resolved, we need to handle the scenario when DOM is not in a
+ // consistent state during the animation.
+ if (ns) {
+ ns.insertNode(element, parent);
+ }
+ }
+ // only *directives and host elements are inserted before
+ if (insertBefore) {
+ this.collectEnterElement(element);
+ }
+ }
+ collectEnterElement(element) {
+ this.collectedEnterElements.push(element);
+ }
+ markElementAsDisabled(element, value) {
+ if (value) {
+ if (!this.disabledNodes.has(element)) {
+ this.disabledNodes.add(element);
+ addClass(element, DISABLED_CLASSNAME);
+ }
+ }
+ else if (this.disabledNodes.has(element)) {
+ this.disabledNodes.delete(element);
+ removeClass(element, DISABLED_CLASSNAME);
+ }
+ }
+ removeNode(namespaceId, element, isHostElement, context) {
+ if (isElementNode(element)) {
+ const ns = namespaceId ? this._fetchNamespace(namespaceId) : null;
+ if (ns) {
+ ns.removeNode(element, context);
+ }
+ else {
+ this.markElementAsRemoved(namespaceId, element, false, context);
+ }
+ if (isHostElement) {
+ const hostNS = this.namespacesByHostElement.get(element);
+ if (hostNS && hostNS.id !== namespaceId) {
+ hostNS.removeNode(element, context);
+ }
+ }
+ }
+ else {
+ this._onRemovalComplete(element, context);
+ }
+ }
+ markElementAsRemoved(namespaceId, element, hasAnimation, context) {
+ this.collectedLeaveElements.push(element);
+ element[REMOVAL_FLAG] =
+ { namespaceId, setForRemoval: context, hasAnimation, removedBeforeQueried: false };
+ }
+ listen(namespaceId, element, name, phase, callback) {
+ if (isElementNode(element)) {
+ return this._fetchNamespace(namespaceId).listen(element, name, phase, callback);
+ }
+ return () => { };
+ }
+ _buildInstruction(entry, subTimelines, enterClassName, leaveClassName, skipBuildAst) {
+ return entry.transition.build(this.driver, entry.element, entry.fromState.value, entry.toState.value, enterClassName, leaveClassName, entry.fromState.options, entry.toState.options, subTimelines, skipBuildAst);
+ }
+ destroyInnerAnimations(containerElement) {
+ let elements = this.driver.query(containerElement, NG_TRIGGER_SELECTOR, true);
+ elements.forEach(element => this.destroyActiveAnimationsForElement(element));
+ if (this.playersByQueriedElement.size == 0)
+ return;
+ elements = this.driver.query(containerElement, NG_ANIMATING_SELECTOR, true);
+ elements.forEach(element => this.finishActiveQueriedAnimationOnElement(element));
+ }
+ destroyActiveAnimationsForElement(element) {
+ const players = this.playersByElement.get(element);
+ if (players) {
+ players.forEach(player => {
+ // special case for when an element is set for destruction, but hasn't started.
+ // in this situation we want to delay the destruction until the flush occurs
+ // so that any event listeners attached to the player are triggered.
+ if (player.queued) {
+ player.markedForDestroy = true;
+ }
+ else {
+ player.destroy();
+ }
+ });
+ }
+ }
+ finishActiveQueriedAnimationOnElement(element) {
+ const players = this.playersByQueriedElement.get(element);
+ if (players) {
+ players.forEach(player => player.finish());
+ }
+ }
+ whenRenderingDone() {
+ return new Promise(resolve => {
+ if (this.players.length) {
+ return optimizeGroupPlayer(this.players).onDone(() => resolve());
+ }
+ else {
+ resolve();
+ }
+ });
+ }
+ processLeaveNode(element) {
+ const details = element[REMOVAL_FLAG];
+ if (details && details.setForRemoval) {
+ // this will prevent it from removing it twice
+ element[REMOVAL_FLAG] = NULL_REMOVAL_STATE;
+ if (details.namespaceId) {
+ this.destroyInnerAnimations(element);
+ const ns = this._fetchNamespace(details.namespaceId);
+ if (ns) {
+ ns.clearElementCache(element);
+ }
+ }
+ this._onRemovalComplete(element, details.setForRemoval);
+ }
+ if (this.driver.matchesElement(element, DISABLED_SELECTOR)) {
+ this.markElementAsDisabled(element, false);
+ }
+ this.driver.query(element, DISABLED_SELECTOR, true).forEach(node => {
+ this.markElementAsDisabled(node, false);
+ });
+ }
+ flush(microtaskId = -1) {
+ let players = [];
+ if (this.newHostElements.size) {
+ this.newHostElements.forEach((ns, element) => this._balanceNamespaceList(ns, element));
+ this.newHostElements.clear();
+ }
+ if (this.totalAnimations && this.collectedEnterElements.length) {
+ for (let i = 0; i < this.collectedEnterElements.length; i++) {
+ const elm = this.collectedEnterElements[i];
+ addClass(elm, STAR_CLASSNAME);
+ }
+ }
+ if (this._namespaceList.length &&
+ (this.totalQueuedPlayers || this.collectedLeaveElements.length)) {
+ const cleanupFns = [];
+ try {
+ players = this._flushAnimations(cleanupFns, microtaskId);
+ }
+ finally {
+ for (let i = 0; i < cleanupFns.length; i++) {
+ cleanupFns[i]();
+ }
+ }
+ }
+ else {
+ for (let i = 0; i < this.collectedLeaveElements.length; i++) {
+ const element = this.collectedLeaveElements[i];
+ this.processLeaveNode(element);
+ }
+ }
+ this.totalQueuedPlayers = 0;
+ this.collectedEnterElements.length = 0;
+ this.collectedLeaveElements.length = 0;
+ this._flushFns.forEach(fn => fn());
+ this._flushFns = [];
+ if (this._whenQuietFns.length) {
+ // we move these over to a variable so that
+ // if any new callbacks are registered in another
+ // flush they do not populate the existing set
+ const quietFns = this._whenQuietFns;
+ this._whenQuietFns = [];
+ if (players.length) {
+ optimizeGroupPlayer(players).onDone(() => {
+ quietFns.forEach(fn => fn());
+ });
+ }
+ else {
+ quietFns.forEach(fn => fn());
+ }
+ }
+ }
+ reportError(errors) {
+ throw new Error(`Unable to process animations due to the following failed trigger transitions\n ${errors.join('\n')}`);
+ }
+ _flushAnimations(cleanupFns, microtaskId) {
+ const subTimelines = new ElementInstructionMap();
+ const skippedPlayers = [];
+ const skippedPlayersMap = new Map();
+ const queuedInstructions = [];
+ const queriedElements = new Map();
+ const allPreStyleElements = new Map();
+ const allPostStyleElements = new Map();
+ const disabledElementsSet = new Set();
+ this.disabledNodes.forEach(node => {
+ disabledElementsSet.add(node);
+ const nodesThatAreDisabled = this.driver.query(node, QUEUED_SELECTOR, true);
+ for (let i = 0; i < nodesThatAreDisabled.length; i++) {
+ disabledElementsSet.add(nodesThatAreDisabled[i]);
+ }
+ });
+ const bodyNode = this.bodyNode;
+ const allTriggerElements = Array.from(this.statesByElement.keys());
+ const enterNodeMap = buildRootMap(allTriggerElements, this.collectedEnterElements);
+ // this must occur before the instructions are built below such that
+ // the :enter queries match the elements (since the timeline queries
+ // are fired during instruction building).
+ const enterNodeMapIds = new Map();
+ let i = 0;
+ enterNodeMap.forEach((nodes, root) => {
+ const className = ENTER_CLASSNAME + i++;
+ enterNodeMapIds.set(root, className);
+ nodes.forEach(node => addClass(node, className));
+ });
+ const allLeaveNodes = [];
+ const mergedLeaveNodes = new Set();
+ const leaveNodesWithoutAnimations = new Set();
+ for (let i = 0; i < this.collectedLeaveElements.length; i++) {
+ const element = this.collectedLeaveElements[i];
+ const details = element[REMOVAL_FLAG];
+ if (details && details.setForRemoval) {
+ allLeaveNodes.push(element);
+ mergedLeaveNodes.add(element);
+ if (details.hasAnimation) {
+ this.driver.query(element, STAR_SELECTOR, true).forEach(elm => mergedLeaveNodes.add(elm));
+ }
+ else {
+ leaveNodesWithoutAnimations.add(element);
+ }
+ }
+ }
+ const leaveNodeMapIds = new Map();
+ const leaveNodeMap = buildRootMap(allTriggerElements, Array.from(mergedLeaveNodes));
+ leaveNodeMap.forEach((nodes, root) => {
+ const className = LEAVE_CLASSNAME + i++;
+ leaveNodeMapIds.set(root, className);
+ nodes.forEach(node => addClass(node, className));
+ });
+ cleanupFns.push(() => {
+ enterNodeMap.forEach((nodes, root) => {
+ const className = enterNodeMapIds.get(root);
+ nodes.forEach(node => removeClass(node, className));
+ });
+ leaveNodeMap.forEach((nodes, root) => {
+ const className = leaveNodeMapIds.get(root);
+ nodes.forEach(node => removeClass(node, className));
+ });
+ allLeaveNodes.forEach(element => {
+ this.processLeaveNode(element);
+ });
+ });
+ const allPlayers = [];
+ const erroneousTransitions = [];
+ for (let i = this._namespaceList.length - 1; i >= 0; i--) {
+ const ns = this._namespaceList[i];
+ ns.drainQueuedTransitions(microtaskId).forEach(entry => {
+ const player = entry.player;
+ const element = entry.element;
+ allPlayers.push(player);
+ if (this.collectedEnterElements.length) {
+ const details = element[REMOVAL_FLAG];
+ // move animations are currently not supported...
+ if (details && details.setForMove) {
+ player.destroy();
+ return;
+ }
+ }
+ const nodeIsOrphaned = !bodyNode || !this.driver.containsElement(bodyNode, element);
+ const leaveClassName = leaveNodeMapIds.get(element);
+ const enterClassName = enterNodeMapIds.get(element);
+ const instruction = this._buildInstruction(entry, subTimelines, enterClassName, leaveClassName, nodeIsOrphaned);
+ if (instruction.errors && instruction.errors.length) {
+ erroneousTransitions.push(instruction);
+ return;
+ }
+ // even though the element may not be apart of the DOM, it may
+ // still be added at a later point (due to the mechanics of content
+ // projection and/or dynamic component insertion) therefore it's
+ // important we still style the element.
+ if (nodeIsOrphaned) {
+ player.onStart(() => eraseStyles(element, instruction.fromStyles));
+ player.onDestroy(() => setStyles(element, instruction.toStyles));
+ skippedPlayers.push(player);
+ return;
+ }
+ // if a unmatched transition is queued to go then it SHOULD NOT render
+ // an animation and cancel the previously running animations.
+ if (entry.isFallbackTransition) {
+ player.onStart(() => eraseStyles(element, instruction.fromStyles));
+ player.onDestroy(() => setStyles(element, instruction.toStyles));
+ skippedPlayers.push(player);
+ return;
+ }
+ // this means that if a parent animation uses this animation as a sub trigger
+ // then it will instruct the timeline builder to not add a player delay, but
+ // instead stretch the first keyframe gap up until the animation starts. The
+ // reason this is important is to prevent extra initialization styles from being
+ // required by the user in the animation.
+ instruction.timelines.forEach(tl => tl.stretchStartingKeyframe = true);
+ subTimelines.append(element, instruction.timelines);
+ const tuple = { instruction, player, element };
+ queuedInstructions.push(tuple);
+ instruction.queriedElements.forEach(element => getOrSetAsInMap(queriedElements, element, []).push(player));
+ instruction.preStyleProps.forEach((stringMap, element) => {
+ const props = Object.keys(stringMap);
+ if (props.length) {
+ let setVal = allPreStyleElements.get(element);
+ if (!setVal) {
+ allPreStyleElements.set(element, setVal = new Set());
+ }
+ props.forEach(prop => setVal.add(prop));
+ }
+ });
+ instruction.postStyleProps.forEach((stringMap, element) => {
+ const props = Object.keys(stringMap);
+ let setVal = allPostStyleElements.get(element);
+ if (!setVal) {
+ allPostStyleElements.set(element, setVal = new Set());
+ }
+ props.forEach(prop => setVal.add(prop));
+ });
+ });
+ }
+ if (erroneousTransitions.length) {
+ const errors = [];
+ erroneousTransitions.forEach(instruction => {
+ errors.push(`@${instruction.triggerName} has failed due to:\n`);
+ instruction.errors.forEach(error => errors.push(`- ${error}\n`));
+ });
+ allPlayers.forEach(player => player.destroy());
+ this.reportError(errors);
+ }
+ const allPreviousPlayersMap = new Map();
+ // this map works to tell which element in the DOM tree is contained by
+ // which animation. Further down below this map will get populated once
+ // the players are built and in doing so it can efficiently figure out
+ // if a sub player is skipped due to a parent player having priority.
+ const animationElementMap = new Map();
+ queuedInstructions.forEach(entry => {
+ const element = entry.element;
+ if (subTimelines.has(element)) {
+ animationElementMap.set(element, element);
+ this._beforeAnimationBuild(entry.player.namespaceId, entry.instruction, allPreviousPlayersMap);
+ }
+ });
+ skippedPlayers.forEach(player => {
+ const element = player.element;
+ const previousPlayers = this._getPreviousPlayers(element, false, player.namespaceId, player.triggerName, null);
+ previousPlayers.forEach(prevPlayer => {
+ getOrSetAsInMap(allPreviousPlayersMap, element, []).push(prevPlayer);
+ prevPlayer.destroy();
+ });
+ });
+ // this is a special case for nodes that will be removed (either by)
+ // having their own leave animations or by being queried in a container
+ // that will be removed once a parent animation is complete. The idea
+ // here is that * styles must be identical to ! styles because of
+ // backwards compatibility (* is also filled in by default in many places).
+ // Otherwise * styles will return an empty value or auto since the element
+ // that is being getComputedStyle'd will not be visible (since * = destination)
+ const replaceNodes = allLeaveNodes.filter(node => {
+ return replacePostStylesAsPre(node, allPreStyleElements, allPostStyleElements);
+ });
+ // POST STAGE: fill the * styles
+ const postStylesMap = new Map();
+ const allLeaveQueriedNodes = cloakAndComputeStyles(postStylesMap, this.driver, leaveNodesWithoutAnimations, allPostStyleElements, _angular_animations__WEBPACK_IMPORTED_MODULE_0__["AUTO_STYLE"]);
+ allLeaveQueriedNodes.forEach(node => {
+ if (replacePostStylesAsPre(node, allPreStyleElements, allPostStyleElements)) {
+ replaceNodes.push(node);
+ }
+ });
+ // PRE STAGE: fill the ! styles
+ const preStylesMap = new Map();
+ enterNodeMap.forEach((nodes, root) => {
+ cloakAndComputeStyles(preStylesMap, this.driver, new Set(nodes), allPreStyleElements, _angular_animations__WEBPACK_IMPORTED_MODULE_0__["ɵPRE_STYLE"]);
+ });
+ replaceNodes.forEach(node => {
+ const post = postStylesMap.get(node);
+ const pre = preStylesMap.get(node);
+ postStylesMap.set(node, Object.assign(Object.assign({}, post), pre));
+ });
+ const rootPlayers = [];
+ const subPlayers = [];
+ const NO_PARENT_ANIMATION_ELEMENT_DETECTED = {};
+ queuedInstructions.forEach(entry => {
+ const { element, player, instruction } = entry;
+ // this means that it was never consumed by a parent animation which
+ // means that it is independent and therefore should be set for animation
+ if (subTimelines.has(element)) {
+ if (disabledElementsSet.has(element)) {
+ player.onDestroy(() => setStyles(element, instruction.toStyles));
+ player.disabled = true;
+ player.overrideTotalTime(instruction.totalTime);
+ skippedPlayers.push(player);
+ return;
+ }
+ // this will flow up the DOM and query the map to figure out
+ // if a parent animation has priority over it. In the situation
+ // that a parent is detected then it will cancel the loop. If
+ // nothing is detected, or it takes a few hops to find a parent,
+ // then it will fill in the missing nodes and signal them as having
+ // a detected parent (or a NO_PARENT value via a special constant).
+ let parentWithAnimation = NO_PARENT_ANIMATION_ELEMENT_DETECTED;
+ if (animationElementMap.size > 1) {
+ let elm = element;
+ const parentsToAdd = [];
+ while (elm = elm.parentNode) {
+ const detectedParent = animationElementMap.get(elm);
+ if (detectedParent) {
+ parentWithAnimation = detectedParent;
+ break;
+ }
+ parentsToAdd.push(elm);
+ }
+ parentsToAdd.forEach(parent => animationElementMap.set(parent, parentWithAnimation));
+ }
+ const innerPlayer = this._buildAnimation(player.namespaceId, instruction, allPreviousPlayersMap, skippedPlayersMap, preStylesMap, postStylesMap);
+ player.setRealPlayer(innerPlayer);
+ if (parentWithAnimation === NO_PARENT_ANIMATION_ELEMENT_DETECTED) {
+ rootPlayers.push(player);
+ }
+ else {
+ const parentPlayers = this.playersByElement.get(parentWithAnimation);
+ if (parentPlayers && parentPlayers.length) {
+ player.parentPlayer = optimizeGroupPlayer(parentPlayers);
+ }
+ skippedPlayers.push(player);
+ }
+ }
+ else {
+ eraseStyles(element, instruction.fromStyles);
+ player.onDestroy(() => setStyles(element, instruction.toStyles));
+ // there still might be a ancestor player animating this
+ // element therefore we will still add it as a sub player
+ // even if its animation may be disabled
+ subPlayers.push(player);
+ if (disabledElementsSet.has(element)) {
+ skippedPlayers.push(player);
+ }
+ }
+ });
+ // find all of the sub players' corresponding inner animation player
+ subPlayers.forEach(player => {
+ // even if any players are not found for a sub animation then it
+ // will still complete itself after the next tick since it's Noop
+ const playersForElement = skippedPlayersMap.get(player.element);
+ if (playersForElement && playersForElement.length) {
+ const innerPlayer = optimizeGroupPlayer(playersForElement);
+ player.setRealPlayer(innerPlayer);
+ }
+ });
+ // the reason why we don't actually play the animation is
+ // because all that a skipped player is designed to do is to
+ // fire the start/done transition callback events
+ skippedPlayers.forEach(player => {
+ if (player.parentPlayer) {
+ player.syncPlayerEvents(player.parentPlayer);
+ }
+ else {
+ player.destroy();
+ }
+ });
+ // run through all of the queued removals and see if they
+ // were picked up by a query. If not then perform the removal
+ // operation right away unless a parent animation is ongoing.
+ for (let i = 0; i < allLeaveNodes.length; i++) {
+ const element = allLeaveNodes[i];
+ const details = element[REMOVAL_FLAG];
+ removeClass(element, LEAVE_CLASSNAME);
+ // this means the element has a removal animation that is being
+ // taken care of and therefore the inner elements will hang around
+ // until that animation is over (or the parent queried animation)
+ if (details && details.hasAnimation)
+ continue;
+ let players = [];
+ // if this element is queried or if it contains queried children
+ // then we want for the element not to be removed from the page
+ // until the queried animations have finished
+ if (queriedElements.size) {
+ let queriedPlayerResults = queriedElements.get(element);
+ if (queriedPlayerResults && queriedPlayerResults.length) {
+ players.push(...queriedPlayerResults);
+ }
+ let queriedInnerElements = this.driver.query(element, NG_ANIMATING_SELECTOR, true);
+ for (let j = 0; j < queriedInnerElements.length; j++) {
+ let queriedPlayers = queriedElements.get(queriedInnerElements[j]);
+ if (queriedPlayers && queriedPlayers.length) {
+ players.push(...queriedPlayers);
+ }
+ }
+ }
+ const activePlayers = players.filter(p => !p.destroyed);
+ if (activePlayers.length) {
+ removeNodesAfterAnimationDone(this, element, activePlayers);
+ }
+ else {
+ this.processLeaveNode(element);
+ }
+ }
+ // this is required so the cleanup method doesn't remove them
+ allLeaveNodes.length = 0;
+ rootPlayers.forEach(player => {
+ this.players.push(player);
+ player.onDone(() => {
+ player.destroy();
+ const index = this.players.indexOf(player);
+ this.players.splice(index, 1);
+ });
+ player.play();
+ });
+ return rootPlayers;
+ }
+ elementContainsData(namespaceId, element) {
+ let containsData = false;
+ const details = element[REMOVAL_FLAG];
+ if (details && details.setForRemoval)
+ containsData = true;
+ if (this.playersByElement.has(element))
+ containsData = true;
+ if (this.playersByQueriedElement.has(element))
+ containsData = true;
+ if (this.statesByElement.has(element))
+ containsData = true;
+ return this._fetchNamespace(namespaceId).elementContainsData(element) || containsData;
+ }
+ afterFlush(callback) {
+ this._flushFns.push(callback);
+ }
+ afterFlushAnimationsDone(callback) {
+ this._whenQuietFns.push(callback);
+ }
+ _getPreviousPlayers(element, isQueriedElement, namespaceId, triggerName, toStateValue) {
+ let players = [];
+ if (isQueriedElement) {
+ const queriedElementPlayers = this.playersByQueriedElement.get(element);
+ if (queriedElementPlayers) {
+ players = queriedElementPlayers;
+ }
+ }
+ else {
+ const elementPlayers = this.playersByElement.get(element);
+ if (elementPlayers) {
+ const isRemovalAnimation = !toStateValue || toStateValue == VOID_VALUE;
+ elementPlayers.forEach(player => {
+ if (player.queued)
+ return;
+ if (!isRemovalAnimation && player.triggerName != triggerName)
+ return;
+ players.push(player);
+ });
+ }
+ }
+ if (namespaceId || triggerName) {
+ players = players.filter(player => {
+ if (namespaceId && namespaceId != player.namespaceId)
+ return false;
+ if (triggerName && triggerName != player.triggerName)
+ return false;
+ return true;
+ });
+ }
+ return players;
+ }
+ _beforeAnimationBuild(namespaceId, instruction, allPreviousPlayersMap) {
+ const triggerName = instruction.triggerName;
+ const rootElement = instruction.element;
+ // when a removal animation occurs, ALL previous players are collected
+ // and destroyed (even if they are outside of the current namespace)
+ const targetNameSpaceId = instruction.isRemovalTransition ? undefined : namespaceId;
+ const targetTriggerName = instruction.isRemovalTransition ? undefined : triggerName;
+ for (const timelineInstruction of instruction.timelines) {
+ const element = timelineInstruction.element;
+ const isQueriedElement = element !== rootElement;
+ const players = getOrSetAsInMap(allPreviousPlayersMap, element, []);
+ const previousPlayers = this._getPreviousPlayers(element, isQueriedElement, targetNameSpaceId, targetTriggerName, instruction.toState);
+ previousPlayers.forEach(player => {
+ const realPlayer = player.getRealPlayer();
+ if (realPlayer.beforeDestroy) {
+ realPlayer.beforeDestroy();
+ }
+ player.destroy();
+ players.push(player);
+ });
+ }
+ // this needs to be done so that the PRE/POST styles can be
+ // computed properly without interfering with the previous animation
+ eraseStyles(rootElement, instruction.fromStyles);
+ }
+ _buildAnimation(namespaceId, instruction, allPreviousPlayersMap, skippedPlayersMap, preStylesMap, postStylesMap) {
+ const triggerName = instruction.triggerName;
+ const rootElement = instruction.element;
+ // we first run this so that the previous animation player
+ // data can be passed into the successive animation players
+ const allQueriedPlayers = [];
+ const allConsumedElements = new Set();
+ const allSubElements = new Set();
+ const allNewPlayers = instruction.timelines.map(timelineInstruction => {
+ const element = timelineInstruction.element;
+ allConsumedElements.add(element);
+ // FIXME (matsko): make sure to-be-removed animations are removed properly
+ const details = element[REMOVAL_FLAG];
+ if (details && details.removedBeforeQueried)
+ return new _angular_animations__WEBPACK_IMPORTED_MODULE_0__["NoopAnimationPlayer"](timelineInstruction.duration, timelineInstruction.delay);
+ const isQueriedElement = element !== rootElement;
+ const previousPlayers = flattenGroupPlayers((allPreviousPlayersMap.get(element) || EMPTY_PLAYER_ARRAY)
+ .map(p => p.getRealPlayer()))
+ .filter(p => {
+ // the `element` is not apart of the AnimationPlayer definition, but
+ // Mock/WebAnimations
+ // use the element within their implementation. This will be added in Angular5 to
+ // AnimationPlayer
+ const pp = p;
+ return pp.element ? pp.element === element : false;
+ });
+ const preStyles = preStylesMap.get(element);
+ const postStyles = postStylesMap.get(element);
+ const keyframes = normalizeKeyframes(this.driver, this._normalizer, element, timelineInstruction.keyframes, preStyles, postStyles);
+ const player = this._buildPlayer(timelineInstruction, keyframes, previousPlayers);
+ // this means that this particular player belongs to a sub trigger. It is
+ // important that we match this player up with the corresponding (@trigger.listener)
+ if (timelineInstruction.subTimeline && skippedPlayersMap) {
+ allSubElements.add(element);
+ }
+ if (isQueriedElement) {
+ const wrappedPlayer = new TransitionAnimationPlayer(namespaceId, triggerName, element);
+ wrappedPlayer.setRealPlayer(player);
+ allQueriedPlayers.push(wrappedPlayer);
+ }
+ return player;
+ });
+ allQueriedPlayers.forEach(player => {
+ getOrSetAsInMap(this.playersByQueriedElement, player.element, []).push(player);
+ player.onDone(() => deleteOrUnsetInMap(this.playersByQueriedElement, player.element, player));
+ });
+ allConsumedElements.forEach(element => addClass(element, NG_ANIMATING_CLASSNAME));
+ const player = optimizeGroupPlayer(allNewPlayers);
+ player.onDestroy(() => {
+ allConsumedElements.forEach(element => removeClass(element, NG_ANIMATING_CLASSNAME));
+ setStyles(rootElement, instruction.toStyles);
+ });
+ // this basically makes all of the callbacks for sub element animations
+ // be dependent on the upper players for when they finish
+ allSubElements.forEach(element => {
+ getOrSetAsInMap(skippedPlayersMap, element, []).push(player);
+ });
+ return player;
+ }
+ _buildPlayer(instruction, keyframes, previousPlayers) {
+ if (keyframes.length > 0) {
+ return this.driver.animate(instruction.element, keyframes, instruction.duration, instruction.delay, instruction.easing, previousPlayers);
+ }
+ // special case for when an empty transition|definition is provided
+ // ... there is no point in rendering an empty animation
+ return new _angular_animations__WEBPACK_IMPORTED_MODULE_0__["NoopAnimationPlayer"](instruction.duration, instruction.delay);
+ }
+}
+class TransitionAnimationPlayer {
+ constructor(namespaceId, triggerName, element) {
+ this.namespaceId = namespaceId;
+ this.triggerName = triggerName;
+ this.element = element;
+ this._player = new _angular_animations__WEBPACK_IMPORTED_MODULE_0__["NoopAnimationPlayer"]();
+ this._containsRealPlayer = false;
+ this._queuedCallbacks = {};
+ this.destroyed = false;
+ this.markedForDestroy = false;
+ this.disabled = false;
+ this.queued = true;
+ this.totalTime = 0;
+ }
+ setRealPlayer(player) {
+ if (this._containsRealPlayer)
+ return;
+ this._player = player;
+ Object.keys(this._queuedCallbacks).forEach(phase => {
+ this._queuedCallbacks[phase].forEach(callback => listenOnPlayer(player, phase, undefined, callback));
+ });
+ this._queuedCallbacks = {};
+ this._containsRealPlayer = true;
+ this.overrideTotalTime(player.totalTime);
+ this.queued = false;
+ }
+ getRealPlayer() {
+ return this._player;
+ }
+ overrideTotalTime(totalTime) {
+ this.totalTime = totalTime;
+ }
+ syncPlayerEvents(player) {
+ const p = this._player;
+ if (p.triggerCallback) {
+ player.onStart(() => p.triggerCallback('start'));
+ }
+ player.onDone(() => this.finish());
+ player.onDestroy(() => this.destroy());
+ }
+ _queueEvent(name, callback) {
+ getOrSetAsInMap(this._queuedCallbacks, name, []).push(callback);
+ }
+ onDone(fn) {
+ if (this.queued) {
+ this._queueEvent('done', fn);
+ }
+ this._player.onDone(fn);
+ }
+ onStart(fn) {
+ if (this.queued) {
+ this._queueEvent('start', fn);
+ }
+ this._player.onStart(fn);
+ }
+ onDestroy(fn) {
+ if (this.queued) {
+ this._queueEvent('destroy', fn);
+ }
+ this._player.onDestroy(fn);
+ }
+ init() {
+ this._player.init();
+ }
+ hasStarted() {
+ return this.queued ? false : this._player.hasStarted();
+ }
+ play() {
+ !this.queued && this._player.play();
+ }
+ pause() {
+ !this.queued && this._player.pause();
+ }
+ restart() {
+ !this.queued && this._player.restart();
+ }
+ finish() {
+ this._player.finish();
+ }
+ destroy() {
+ this.destroyed = true;
+ this._player.destroy();
+ }
+ reset() {
+ !this.queued && this._player.reset();
+ }
+ setPosition(p) {
+ if (!this.queued) {
+ this._player.setPosition(p);
+ }
+ }
+ getPosition() {
+ return this.queued ? 0 : this._player.getPosition();
+ }
+ /** @internal */
+ triggerCallback(phaseName) {
+ const p = this._player;
+ if (p.triggerCallback) {
+ p.triggerCallback(phaseName);
+ }
+ }
+}
+function deleteOrUnsetInMap(map, key, value) {
+ let currentValues;
+ if (map instanceof Map) {
+ currentValues = map.get(key);
+ if (currentValues) {
+ if (currentValues.length) {
+ const index = currentValues.indexOf(value);
+ currentValues.splice(index, 1);
+ }
+ if (currentValues.length == 0) {
+ map.delete(key);
+ }
+ }
+ }
+ else {
+ currentValues = map[key];
+ if (currentValues) {
+ if (currentValues.length) {
+ const index = currentValues.indexOf(value);
+ currentValues.splice(index, 1);
+ }
+ if (currentValues.length == 0) {
+ delete map[key];
+ }
+ }
+ }
+ return currentValues;
+}
+function normalizeTriggerValue(value) {
+ // we use `!= null` here because it's the most simple
+ // way to test against a "falsy" value without mixing
+ // in empty strings or a zero value. DO NOT OPTIMIZE.
+ return value != null ? value : null;
+}
+function isElementNode(node) {
+ return node && node['nodeType'] === 1;
+}
+function isTriggerEventValid(eventName) {
+ return eventName == 'start' || eventName == 'done';
+}
+function cloakElement(element, value) {
+ const oldValue = element.style.display;
+ element.style.display = value != null ? value : 'none';
+ return oldValue;
+}
+function cloakAndComputeStyles(valuesMap, driver, elements, elementPropsMap, defaultStyle) {
+ const cloakVals = [];
+ elements.forEach(element => cloakVals.push(cloakElement(element)));
+ const failedElements = [];
+ elementPropsMap.forEach((props, element) => {
+ const styles = {};
+ props.forEach(prop => {
+ const value = styles[prop] = driver.computeStyle(element, prop, defaultStyle);
+ // there is no easy way to detect this because a sub element could be removed
+ // by a parent animation element being detached.
+ if (!value || value.length == 0) {
+ element[REMOVAL_FLAG] = NULL_REMOVED_QUERIED_STATE;
+ failedElements.push(element);
+ }
+ });
+ valuesMap.set(element, styles);
+ });
+ // we use a index variable here since Set.forEach(a, i) does not return
+ // an index value for the closure (but instead just the value)
+ let i = 0;
+ elements.forEach(element => cloakElement(element, cloakVals[i++]));
+ return failedElements;
+}
+/*
+Since the Angular renderer code will return a collection of inserted
+nodes in all areas of a DOM tree, it's up to this algorithm to figure
+out which nodes are roots for each animation @trigger.
+
+By placing each inserted node into a Set and traversing upwards, it
+is possible to find the @trigger elements and well any direct *star
+insertion nodes, if a @trigger root is found then the enter element
+is placed into the Map[@trigger] spot.
+ */
+function buildRootMap(roots, nodes) {
+ const rootMap = new Map();
+ roots.forEach(root => rootMap.set(root, []));
+ if (nodes.length == 0)
+ return rootMap;
+ const NULL_NODE = 1;
+ const nodeSet = new Set(nodes);
+ const localRootMap = new Map();
+ function getRoot(node) {
+ if (!node)
+ return NULL_NODE;
+ let root = localRootMap.get(node);
+ if (root)
+ return root;
+ const parent = node.parentNode;
+ if (rootMap.has(parent)) { // ngIf inside @trigger
+ root = parent;
+ }
+ else if (nodeSet.has(parent)) { // ngIf inside ngIf
+ root = NULL_NODE;
+ }
+ else { // recurse upwards
+ root = getRoot(parent);
+ }
+ localRootMap.set(node, root);
+ return root;
+ }
+ nodes.forEach(node => {
+ const root = getRoot(node);
+ if (root !== NULL_NODE) {
+ rootMap.get(root).push(node);
+ }
+ });
+ return rootMap;
+}
+const CLASSES_CACHE_KEY = '$$classes';
+function containsClass(element, className) {
+ if (element.classList) {
+ return element.classList.contains(className);
+ }
+ else {
+ const classes = element[CLASSES_CACHE_KEY];
+ return classes && classes[className];
+ }
+}
+function addClass(element, className) {
+ if (element.classList) {
+ element.classList.add(className);
+ }
+ else {
+ let classes = element[CLASSES_CACHE_KEY];
+ if (!classes) {
+ classes = element[CLASSES_CACHE_KEY] = {};
+ }
+ classes[className] = true;
+ }
+}
+function removeClass(element, className) {
+ if (element.classList) {
+ element.classList.remove(className);
+ }
+ else {
+ let classes = element[CLASSES_CACHE_KEY];
+ if (classes) {
+ delete classes[className];
+ }
+ }
+}
+function removeNodesAfterAnimationDone(engine, element, players) {
+ optimizeGroupPlayer(players).onDone(() => engine.processLeaveNode(element));
+}
+function flattenGroupPlayers(players) {
+ const finalPlayers = [];
+ _flattenGroupPlayersRecur(players, finalPlayers);
+ return finalPlayers;
+}
+function _flattenGroupPlayersRecur(players, finalPlayers) {
+ for (let i = 0; i < players.length; i++) {
+ const player = players[i];
+ if (player instanceof _angular_animations__WEBPACK_IMPORTED_MODULE_0__["ɵAnimationGroupPlayer"]) {
+ _flattenGroupPlayersRecur(player.players, finalPlayers);
+ }
+ else {
+ finalPlayers.push(player);
+ }
+ }
+}
+function objEquals(a, b) {
+ const k1 = Object.keys(a);
+ const k2 = Object.keys(b);
+ if (k1.length != k2.length)
+ return false;
+ for (let i = 0; i < k1.length; i++) {
+ const prop = k1[i];
+ if (!b.hasOwnProperty(prop) || a[prop] !== b[prop])
+ return false;
+ }
+ return true;
+}
+function replacePostStylesAsPre(element, allPreStyleElements, allPostStyleElements) {
+ const postEntry = allPostStyleElements.get(element);
+ if (!postEntry)
+ return false;
+ let preEntry = allPreStyleElements.get(element);
+ if (preEntry) {
+ postEntry.forEach(data => preEntry.add(data));
+ }
+ else {
+ allPreStyleElements.set(element, postEntry);
+ }
+ allPostStyleElements.delete(element);
+ return true;
+}
+
+class AnimationEngine {
+ constructor(bodyNode, _driver, normalizer) {
+ this.bodyNode = bodyNode;
+ this._driver = _driver;
+ this._triggerCache = {};
+ // this method is designed to be overridden by the code that uses this engine
+ this.onRemovalComplete = (element, context) => { };
+ this._transitionEngine = new TransitionAnimationEngine(bodyNode, _driver, normalizer);
+ this._timelineEngine = new TimelineAnimationEngine(bodyNode, _driver, normalizer);
+ this._transitionEngine.onRemovalComplete = (element, context) => this.onRemovalComplete(element, context);
+ }
+ registerTrigger(componentId, namespaceId, hostElement, name, metadata) {
+ const cacheKey = componentId + '-' + name;
+ let trigger = this._triggerCache[cacheKey];
+ if (!trigger) {
+ const errors = [];
+ const ast = buildAnimationAst(this._driver, metadata, errors);
+ if (errors.length) {
+ throw new Error(`The animation trigger "${name}" has failed to build due to the following errors:\n - ${errors.join('\n - ')}`);
+ }
+ trigger = buildTrigger(name, ast);
+ this._triggerCache[cacheKey] = trigger;
+ }
+ this._transitionEngine.registerTrigger(namespaceId, name, trigger);
+ }
+ register(namespaceId, hostElement) {
+ this._transitionEngine.register(namespaceId, hostElement);
+ }
+ destroy(namespaceId, context) {
+ this._transitionEngine.destroy(namespaceId, context);
+ }
+ onInsert(namespaceId, element, parent, insertBefore) {
+ this._transitionEngine.insertNode(namespaceId, element, parent, insertBefore);
+ }
+ onRemove(namespaceId, element, context, isHostElement) {
+ this._transitionEngine.removeNode(namespaceId, element, isHostElement || false, context);
+ }
+ disableAnimations(element, disable) {
+ this._transitionEngine.markElementAsDisabled(element, disable);
+ }
+ process(namespaceId, element, property, value) {
+ if (property.charAt(0) == '@') {
+ const [id, action] = parseTimelineCommand(property);
+ const args = value;
+ this._timelineEngine.command(id, element, action, args);
+ }
+ else {
+ this._transitionEngine.trigger(namespaceId, element, property, value);
+ }
+ }
+ listen(namespaceId, element, eventName, eventPhase, callback) {
+ // @@listen
+ if (eventName.charAt(0) == '@') {
+ const [id, action] = parseTimelineCommand(eventName);
+ return this._timelineEngine.listen(id, element, action, callback);
+ }
+ return this._transitionEngine.listen(namespaceId, element, eventName, eventPhase, callback);
+ }
+ flush(microtaskId = -1) {
+ this._transitionEngine.flush(microtaskId);
+ }
+ get players() {
+ return this._transitionEngine.players
+ .concat(this._timelineEngine.players);
+ }
+ whenRenderingDone() {
+ return this._transitionEngine.whenRenderingDone();
+ }
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * Returns an instance of `SpecialCasedStyles` if and when any special (non animateable) styles are
+ * detected.
+ *
+ * In CSS there exist properties that cannot be animated within a keyframe animation
+ * (whether it be via CSS keyframes or web-animations) and the animation implementation
+ * will ignore them. This function is designed to detect those special cased styles and
+ * return a container that will be executed at the start and end of the animation.
+ *
+ * @returns an instance of `SpecialCasedStyles` if any special styles are detected otherwise `null`
+ */
+function packageNonAnimatableStyles(element, styles) {
+ let startStyles = null;
+ let endStyles = null;
+ if (Array.isArray(styles) && styles.length) {
+ startStyles = filterNonAnimatableStyles(styles[0]);
+ if (styles.length > 1) {
+ endStyles = filterNonAnimatableStyles(styles[styles.length - 1]);
+ }
+ }
+ else if (styles) {
+ startStyles = filterNonAnimatableStyles(styles);
+ }
+ return (startStyles || endStyles) ? new SpecialCasedStyles(element, startStyles, endStyles) :
+ null;
+}
+/**
+ * Designed to be executed during a keyframe-based animation to apply any special-cased styles.
+ *
+ * When started (when the `start()` method is run) then the provided `startStyles`
+ * will be applied. When finished (when the `finish()` method is called) the
+ * `endStyles` will be applied as well any any starting styles. Finally when
+ * `destroy()` is called then all styles will be removed.
+ */
+class SpecialCasedStyles {
+ constructor(_element, _startStyles, _endStyles) {
+ this._element = _element;
+ this._startStyles = _startStyles;
+ this._endStyles = _endStyles;
+ this._state = 0 /* Pending */;
+ let initialStyles = SpecialCasedStyles.initialStylesByElement.get(_element);
+ if (!initialStyles) {
+ SpecialCasedStyles.initialStylesByElement.set(_element, initialStyles = {});
+ }
+ this._initialStyles = initialStyles;
+ }
+ start() {
+ if (this._state < 1 /* Started */) {
+ if (this._startStyles) {
+ setStyles(this._element, this._startStyles, this._initialStyles);
+ }
+ this._state = 1 /* Started */;
+ }
+ }
+ finish() {
+ this.start();
+ if (this._state < 2 /* Finished */) {
+ setStyles(this._element, this._initialStyles);
+ if (this._endStyles) {
+ setStyles(this._element, this._endStyles);
+ this._endStyles = null;
+ }
+ this._state = 1 /* Started */;
+ }
+ }
+ destroy() {
+ this.finish();
+ if (this._state < 3 /* Destroyed */) {
+ SpecialCasedStyles.initialStylesByElement.delete(this._element);
+ if (this._startStyles) {
+ eraseStyles(this._element, this._startStyles);
+ this._endStyles = null;
+ }
+ if (this._endStyles) {
+ eraseStyles(this._element, this._endStyles);
+ this._endStyles = null;
+ }
+ setStyles(this._element, this._initialStyles);
+ this._state = 3 /* Destroyed */;
+ }
+ }
+}
+SpecialCasedStyles.initialStylesByElement = new WeakMap();
+function filterNonAnimatableStyles(styles) {
+ let result = null;
+ const props = Object.keys(styles);
+ for (let i = 0; i < props.length; i++) {
+ const prop = props[i];
+ if (isNonAnimatableStyle(prop)) {
+ result = result || {};
+ result[prop] = styles[prop];
+ }
+ }
+ return result;
+}
+function isNonAnimatableStyle(prop) {
+ return prop === 'display' || prop === 'position';
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+const ELAPSED_TIME_MAX_DECIMAL_PLACES = 3;
+const ANIMATION_PROP = 'animation';
+const ANIMATIONEND_EVENT = 'animationend';
+const ONE_SECOND$1 = 1000;
+class ElementAnimationStyleHandler {
+ constructor(_element, _name, _duration, _delay, _easing, _fillMode, _onDoneFn) {
+ this._element = _element;
+ this._name = _name;
+ this._duration = _duration;
+ this._delay = _delay;
+ this._easing = _easing;
+ this._fillMode = _fillMode;
+ this._onDoneFn = _onDoneFn;
+ this._finished = false;
+ this._destroyed = false;
+ this._startTime = 0;
+ this._position = 0;
+ this._eventFn = (e) => this._handleCallback(e);
+ }
+ apply() {
+ applyKeyframeAnimation(this._element, `${this._duration}ms ${this._easing} ${this._delay}ms 1 normal ${this._fillMode} ${this._name}`);
+ addRemoveAnimationEvent(this._element, this._eventFn, false);
+ this._startTime = Date.now();
+ }
+ pause() {
+ playPauseAnimation(this._element, this._name, 'paused');
+ }
+ resume() {
+ playPauseAnimation(this._element, this._name, 'running');
+ }
+ setPosition(position) {
+ const index = findIndexForAnimation(this._element, this._name);
+ this._position = position * this._duration;
+ setAnimationStyle(this._element, 'Delay', `-${this._position}ms`, index);
+ }
+ getPosition() {
+ return this._position;
+ }
+ _handleCallback(event) {
+ const timestamp = event._ngTestManualTimestamp || Date.now();
+ const elapsedTime = parseFloat(event.elapsedTime.toFixed(ELAPSED_TIME_MAX_DECIMAL_PLACES)) * ONE_SECOND$1;
+ if (event.animationName == this._name &&
+ Math.max(timestamp - this._startTime, 0) >= this._delay && elapsedTime >= this._duration) {
+ this.finish();
+ }
+ }
+ finish() {
+ if (this._finished)
+ return;
+ this._finished = true;
+ this._onDoneFn();
+ addRemoveAnimationEvent(this._element, this._eventFn, true);
+ }
+ destroy() {
+ if (this._destroyed)
+ return;
+ this._destroyed = true;
+ this.finish();
+ removeKeyframeAnimation(this._element, this._name);
+ }
+}
+function playPauseAnimation(element, name, status) {
+ const index = findIndexForAnimation(element, name);
+ setAnimationStyle(element, 'PlayState', status, index);
+}
+function applyKeyframeAnimation(element, value) {
+ const anim = getAnimationStyle(element, '').trim();
+ let index = 0;
+ if (anim.length) {
+ index = countChars(anim, ',') + 1;
+ value = `${anim}, ${value}`;
+ }
+ setAnimationStyle(element, '', value);
+ return index;
+}
+function removeKeyframeAnimation(element, name) {
+ const anim = getAnimationStyle(element, '');
+ const tokens = anim.split(',');
+ const index = findMatchingTokenIndex(tokens, name);
+ if (index >= 0) {
+ tokens.splice(index, 1);
+ const newValue = tokens.join(',');
+ setAnimationStyle(element, '', newValue);
+ }
+}
+function findIndexForAnimation(element, value) {
+ const anim = getAnimationStyle(element, '');
+ if (anim.indexOf(',') > 0) {
+ const tokens = anim.split(',');
+ return findMatchingTokenIndex(tokens, value);
+ }
+ return findMatchingTokenIndex([anim], value);
+}
+function findMatchingTokenIndex(tokens, searchToken) {
+ for (let i = 0; i < tokens.length; i++) {
+ if (tokens[i].indexOf(searchToken) >= 0) {
+ return i;
+ }
+ }
+ return -1;
+}
+function addRemoveAnimationEvent(element, fn, doRemove) {
+ doRemove ? element.removeEventListener(ANIMATIONEND_EVENT, fn) :
+ element.addEventListener(ANIMATIONEND_EVENT, fn);
+}
+function setAnimationStyle(element, name, value, index) {
+ const prop = ANIMATION_PROP + name;
+ if (index != null) {
+ const oldValue = element.style[prop];
+ if (oldValue.length) {
+ const tokens = oldValue.split(',');
+ tokens[index] = value;
+ value = tokens.join(',');
+ }
+ }
+ element.style[prop] = value;
+}
+function getAnimationStyle(element, name) {
+ return element.style[ANIMATION_PROP + name] || '';
+}
+function countChars(value, char) {
+ let count = 0;
+ for (let i = 0; i < value.length; i++) {
+ const c = value.charAt(i);
+ if (c === char)
+ count++;
+ }
+ return count;
+}
+
+const DEFAULT_FILL_MODE = 'forwards';
+const DEFAULT_EASING = 'linear';
+class CssKeyframesPlayer {
+ constructor(element, keyframes, animationName, _duration, _delay, easing, _finalStyles, _specialStyles) {
+ this.element = element;
+ this.keyframes = keyframes;
+ this.animationName = animationName;
+ this._duration = _duration;
+ this._delay = _delay;
+ this._finalStyles = _finalStyles;
+ this._specialStyles = _specialStyles;
+ this._onDoneFns = [];
+ this._onStartFns = [];
+ this._onDestroyFns = [];
+ this._started = false;
+ this.currentSnapshot = {};
+ this._state = 0;
+ this.easing = easing || DEFAULT_EASING;
+ this.totalTime = _duration + _delay;
+ this._buildStyler();
+ }
+ onStart(fn) {
+ this._onStartFns.push(fn);
+ }
+ onDone(fn) {
+ this._onDoneFns.push(fn);
+ }
+ onDestroy(fn) {
+ this._onDestroyFns.push(fn);
+ }
+ destroy() {
+ this.init();
+ if (this._state >= 4 /* DESTROYED */)
+ return;
+ this._state = 4 /* DESTROYED */;
+ this._styler.destroy();
+ this._flushStartFns();
+ this._flushDoneFns();
+ if (this._specialStyles) {
+ this._specialStyles.destroy();
+ }
+ this._onDestroyFns.forEach(fn => fn());
+ this._onDestroyFns = [];
+ }
+ _flushDoneFns() {
+ this._onDoneFns.forEach(fn => fn());
+ this._onDoneFns = [];
+ }
+ _flushStartFns() {
+ this._onStartFns.forEach(fn => fn());
+ this._onStartFns = [];
+ }
+ finish() {
+ this.init();
+ if (this._state >= 3 /* FINISHED */)
+ return;
+ this._state = 3 /* FINISHED */;
+ this._styler.finish();
+ this._flushStartFns();
+ if (this._specialStyles) {
+ this._specialStyles.finish();
+ }
+ this._flushDoneFns();
+ }
+ setPosition(value) {
+ this._styler.setPosition(value);
+ }
+ getPosition() {
+ return this._styler.getPosition();
+ }
+ hasStarted() {
+ return this._state >= 2 /* STARTED */;
+ }
+ init() {
+ if (this._state >= 1 /* INITIALIZED */)
+ return;
+ this._state = 1 /* INITIALIZED */;
+ const elm = this.element;
+ this._styler.apply();
+ if (this._delay) {
+ this._styler.pause();
+ }
+ }
+ play() {
+ this.init();
+ if (!this.hasStarted()) {
+ this._flushStartFns();
+ this._state = 2 /* STARTED */;
+ if (this._specialStyles) {
+ this._specialStyles.start();
+ }
+ }
+ this._styler.resume();
+ }
+ pause() {
+ this.init();
+ this._styler.pause();
+ }
+ restart() {
+ this.reset();
+ this.play();
+ }
+ reset() {
+ this._styler.destroy();
+ this._buildStyler();
+ this._styler.apply();
+ }
+ _buildStyler() {
+ this._styler = new ElementAnimationStyleHandler(this.element, this.animationName, this._duration, this._delay, this.easing, DEFAULT_FILL_MODE, () => this.finish());
+ }
+ /** @internal */
+ triggerCallback(phaseName) {
+ const methods = phaseName == 'start' ? this._onStartFns : this._onDoneFns;
+ methods.forEach(fn => fn());
+ methods.length = 0;
+ }
+ beforeDestroy() {
+ this.init();
+ const styles = {};
+ if (this.hasStarted()) {
+ const finished = this._state >= 3 /* FINISHED */;
+ Object.keys(this._finalStyles).forEach(prop => {
+ if (prop != 'offset') {
+ styles[prop] = finished ? this._finalStyles[prop] : computeStyle(this.element, prop);
+ }
+ });
+ }
+ this.currentSnapshot = styles;
+ }
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+class DirectStylePlayer extends _angular_animations__WEBPACK_IMPORTED_MODULE_0__["NoopAnimationPlayer"] {
+ constructor(element, styles) {
+ super();
+ this.element = element;
+ this._startingStyles = {};
+ this.__initialized = false;
+ this._styles = hypenatePropsObject(styles);
+ }
+ init() {
+ if (this.__initialized || !this._startingStyles)
+ return;
+ this.__initialized = true;
+ Object.keys(this._styles).forEach(prop => {
+ this._startingStyles[prop] = this.element.style[prop];
+ });
+ super.init();
+ }
+ play() {
+ if (!this._startingStyles)
+ return;
+ this.init();
+ Object.keys(this._styles)
+ .forEach(prop => this.element.style.setProperty(prop, this._styles[prop]));
+ super.play();
+ }
+ destroy() {
+ if (!this._startingStyles)
+ return;
+ Object.keys(this._startingStyles).forEach(prop => {
+ const value = this._startingStyles[prop];
+ if (value) {
+ this.element.style.setProperty(prop, value);
+ }
+ else {
+ this.element.style.removeProperty(prop);
+ }
+ });
+ this._startingStyles = null;
+ super.destroy();
+ }
+}
+
+const KEYFRAMES_NAME_PREFIX = 'gen_css_kf_';
+const TAB_SPACE = ' ';
+class CssKeyframesDriver {
+ constructor() {
+ this._count = 0;
+ this._head = document.querySelector('head');
+ }
+ validateStyleProperty(prop) {
+ return validateStyleProperty(prop);
+ }
+ matchesElement(element, selector) {
+ return matchesElement(element, selector);
+ }
+ containsElement(elm1, elm2) {
+ return containsElement(elm1, elm2);
+ }
+ query(element, selector, multi) {
+ return invokeQuery(element, selector, multi);
+ }
+ computeStyle(element, prop, defaultValue) {
+ return window.getComputedStyle(element)[prop];
+ }
+ buildKeyframeElement(element, name, keyframes) {
+ keyframes = keyframes.map(kf => hypenatePropsObject(kf));
+ let keyframeStr = `@keyframes ${name} {\n`;
+ let tab = '';
+ keyframes.forEach(kf => {
+ tab = TAB_SPACE;
+ const offset = parseFloat(kf['offset']);
+ keyframeStr += `${tab}${offset * 100}% {\n`;
+ tab += TAB_SPACE;
+ Object.keys(kf).forEach(prop => {
+ const value = kf[prop];
+ switch (prop) {
+ case 'offset':
+ return;
+ case 'easing':
+ if (value) {
+ keyframeStr += `${tab}animation-timing-function: ${value};\n`;
+ }
+ return;
+ default:
+ keyframeStr += `${tab}${prop}: ${value};\n`;
+ return;
+ }
+ });
+ keyframeStr += `${tab}}\n`;
+ });
+ keyframeStr += `}\n`;
+ const kfElm = document.createElement('style');
+ kfElm.textContent = keyframeStr;
+ return kfElm;
+ }
+ animate(element, keyframes, duration, delay, easing, previousPlayers = [], scrubberAccessRequested) {
+ if ((typeof ngDevMode === 'undefined' || ngDevMode) && scrubberAccessRequested) {
+ notifyFaultyScrubber();
+ }
+ const previousCssKeyframePlayers = previousPlayers.filter(player => player instanceof CssKeyframesPlayer);
+ const previousStyles = {};
+ if (allowPreviousPlayerStylesMerge(duration, delay)) {
+ previousCssKeyframePlayers.forEach(player => {
+ let styles = player.currentSnapshot;
+ Object.keys(styles).forEach(prop => previousStyles[prop] = styles[prop]);
+ });
+ }
+ keyframes = balancePreviousStylesIntoKeyframes(element, keyframes, previousStyles);
+ const finalStyles = flattenKeyframesIntoStyles(keyframes);
+ // if there is no animation then there is no point in applying
+ // styles and waiting for an event to get fired. This causes lag.
+ // It's better to just directly apply the styles to the element
+ // via the direct styling animation player.
+ if (duration == 0) {
+ return new DirectStylePlayer(element, finalStyles);
+ }
+ const animationName = `${KEYFRAMES_NAME_PREFIX}${this._count++}`;
+ const kfElm = this.buildKeyframeElement(element, animationName, keyframes);
+ document.querySelector('head').appendChild(kfElm);
+ const specialStyles = packageNonAnimatableStyles(element, keyframes);
+ const player = new CssKeyframesPlayer(element, keyframes, animationName, duration, delay, easing, finalStyles, specialStyles);
+ player.onDestroy(() => removeElement(kfElm));
+ return player;
+ }
+}
+function flattenKeyframesIntoStyles(keyframes) {
+ let flatKeyframes = {};
+ if (keyframes) {
+ const kfs = Array.isArray(keyframes) ? keyframes : [keyframes];
+ kfs.forEach(kf => {
+ Object.keys(kf).forEach(prop => {
+ if (prop == 'offset' || prop == 'easing')
+ return;
+ flatKeyframes[prop] = kf[prop];
+ });
+ });
+ }
+ return flatKeyframes;
+}
+function removeElement(node) {
+ node.parentNode.removeChild(node);
+}
+let warningIssued = false;
+function notifyFaultyScrubber() {
+ if (warningIssued)
+ return;
+ console.warn('@angular/animations: please load the web-animations.js polyfill to allow programmatic access...\n', ' visit https://bit.ly/IWukam to learn more about using the web-animation-js polyfill.');
+ warningIssued = true;
+}
+
+class WebAnimationsPlayer {
+ constructor(element, keyframes, options, _specialStyles) {
+ this.element = element;
+ this.keyframes = keyframes;
+ this.options = options;
+ this._specialStyles = _specialStyles;
+ this._onDoneFns = [];
+ this._onStartFns = [];
+ this._onDestroyFns = [];
+ this._initialized = false;
+ this._finished = false;
+ this._started = false;
+ this._destroyed = false;
+ this.time = 0;
+ this.parentPlayer = null;
+ this.currentSnapshot = {};
+ this._duration = options['duration'];
+ this._delay = options['delay'] || 0;
+ this.time = this._duration + this._delay;
+ }
+ _onFinish() {
+ if (!this._finished) {
+ this._finished = true;
+ this._onDoneFns.forEach(fn => fn());
+ this._onDoneFns = [];
+ }
+ }
+ init() {
+ this._buildPlayer();
+ this._preparePlayerBeforeStart();
+ }
+ _buildPlayer() {
+ if (this._initialized)
+ return;
+ this._initialized = true;
+ const keyframes = this.keyframes;
+ this.domPlayer =
+ this._triggerWebAnimation(this.element, keyframes, this.options);
+ this._finalKeyframe = keyframes.length ? keyframes[keyframes.length - 1] : {};
+ this.domPlayer.addEventListener('finish', () => this._onFinish());
+ }
+ _preparePlayerBeforeStart() {
+ // this is required so that the player doesn't start to animate right away
+ if (this._delay) {
+ this._resetDomPlayerState();
+ }
+ else {
+ this.domPlayer.pause();
+ }
+ }
+ /** @internal */
+ _triggerWebAnimation(element, keyframes, options) {
+ // jscompiler doesn't seem to know animate is a native property because it's not fully
+ // supported yet across common browsers (we polyfill it for Edge/Safari) [CL #143630929]
+ return element['animate'](keyframes, options);
+ }
+ onStart(fn) {
+ this._onStartFns.push(fn);
+ }
+ onDone(fn) {
+ this._onDoneFns.push(fn);
+ }
+ onDestroy(fn) {
+ this._onDestroyFns.push(fn);
+ }
+ play() {
+ this._buildPlayer();
+ if (!this.hasStarted()) {
+ this._onStartFns.forEach(fn => fn());
+ this._onStartFns = [];
+ this._started = true;
+ if (this._specialStyles) {
+ this._specialStyles.start();
+ }
+ }
+ this.domPlayer.play();
+ }
+ pause() {
+ this.init();
+ this.domPlayer.pause();
+ }
+ finish() {
+ this.init();
+ if (this._specialStyles) {
+ this._specialStyles.finish();
+ }
+ this._onFinish();
+ this.domPlayer.finish();
+ }
+ reset() {
+ this._resetDomPlayerState();
+ this._destroyed = false;
+ this._finished = false;
+ this._started = false;
+ }
+ _resetDomPlayerState() {
+ if (this.domPlayer) {
+ this.domPlayer.cancel();
+ }
+ }
+ restart() {
+ this.reset();
+ this.play();
+ }
+ hasStarted() {
+ return this._started;
+ }
+ destroy() {
+ if (!this._destroyed) {
+ this._destroyed = true;
+ this._resetDomPlayerState();
+ this._onFinish();
+ if (this._specialStyles) {
+ this._specialStyles.destroy();
+ }
+ this._onDestroyFns.forEach(fn => fn());
+ this._onDestroyFns = [];
+ }
+ }
+ setPosition(p) {
+ if (this.domPlayer === undefined) {
+ this.init();
+ }
+ this.domPlayer.currentTime = p * this.time;
+ }
+ getPosition() {
+ return this.domPlayer.currentTime / this.time;
+ }
+ get totalTime() {
+ return this._delay + this._duration;
+ }
+ beforeDestroy() {
+ const styles = {};
+ if (this.hasStarted()) {
+ Object.keys(this._finalKeyframe).forEach(prop => {
+ if (prop != 'offset') {
+ styles[prop] =
+ this._finished ? this._finalKeyframe[prop] : computeStyle(this.element, prop);
+ }
+ });
+ }
+ this.currentSnapshot = styles;
+ }
+ /** @internal */
+ triggerCallback(phaseName) {
+ const methods = phaseName == 'start' ? this._onStartFns : this._onDoneFns;
+ methods.forEach(fn => fn());
+ methods.length = 0;
+ }
+}
+
+class WebAnimationsDriver {
+ constructor() {
+ this._isNativeImpl = /\{\s*\[native\s+code\]\s*\}/.test(getElementAnimateFn().toString());
+ this._cssKeyframesDriver = new CssKeyframesDriver();
+ }
+ validateStyleProperty(prop) {
+ return validateStyleProperty(prop);
+ }
+ matchesElement(element, selector) {
+ return matchesElement(element, selector);
+ }
+ containsElement(elm1, elm2) {
+ return containsElement(elm1, elm2);
+ }
+ query(element, selector, multi) {
+ return invokeQuery(element, selector, multi);
+ }
+ computeStyle(element, prop, defaultValue) {
+ return window.getComputedStyle(element)[prop];
+ }
+ overrideWebAnimationsSupport(supported) {
+ this._isNativeImpl = supported;
+ }
+ animate(element, keyframes, duration, delay, easing, previousPlayers = [], scrubberAccessRequested) {
+ const useKeyframes = !scrubberAccessRequested && !this._isNativeImpl;
+ if (useKeyframes) {
+ return this._cssKeyframesDriver.animate(element, keyframes, duration, delay, easing, previousPlayers);
+ }
+ const fill = delay == 0 ? 'both' : 'forwards';
+ const playerOptions = { duration, delay, fill };
+ // we check for this to avoid having a null|undefined value be present
+ // for the easing (which results in an error for certain browsers #9752)
+ if (easing) {
+ playerOptions['easing'] = easing;
+ }
+ const previousStyles = {};
+ const previousWebAnimationPlayers = previousPlayers.filter(player => player instanceof WebAnimationsPlayer);
+ if (allowPreviousPlayerStylesMerge(duration, delay)) {
+ previousWebAnimationPlayers.forEach(player => {
+ let styles = player.currentSnapshot;
+ Object.keys(styles).forEach(prop => previousStyles[prop] = styles[prop]);
+ });
+ }
+ keyframes = keyframes.map(styles => copyStyles(styles, false));
+ keyframes = balancePreviousStylesIntoKeyframes(element, keyframes, previousStyles);
+ const specialStyles = packageNonAnimatableStyles(element, keyframes);
+ return new WebAnimationsPlayer(element, keyframes, playerOptions, specialStyles);
+ }
+}
+function supportsWebAnimations() {
+ return typeof getElementAnimateFn() === 'function';
+}
+function getElementAnimateFn() {
+ return (isBrowser() && Element.prototype['animate']) || {};
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+
+/**
+ * Generated bundle index. Do not edit.
+ */
+
+
+
+//# sourceMappingURL=browser.js.map
+/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../../process/browser.js */ "./node_modules/process/browser.js")))
+
+/***/ }),
+
+/***/ "./node_modules/@angular/cdk/__ivy_ngcc__/fesm2015/a11y.js":
+/*!*****************************************************************!*\
+ !*** ./node_modules/@angular/cdk/__ivy_ngcc__/fesm2015/a11y.js ***!
+ \*****************************************************************/
+/*! exports provided: A11yModule, ActiveDescendantKeyManager, AriaDescriber, CDK_DESCRIBEDBY_HOST_ATTRIBUTE, CDK_DESCRIBEDBY_ID_PREFIX, CdkAriaLive, CdkMonitorFocus, CdkTrapFocus, ConfigurableFocusTrap, ConfigurableFocusTrapFactory, EventListenerFocusTrapInertStrategy, FOCUS_MONITOR_DEFAULT_OPTIONS, FOCUS_TRAP_INERT_STRATEGY, FocusKeyManager, FocusMonitor, FocusTrap, FocusTrapFactory, HighContrastModeDetector, InteractivityChecker, IsFocusableConfig, LIVE_ANNOUNCER_DEFAULT_OPTIONS, LIVE_ANNOUNCER_ELEMENT_TOKEN, LIVE_ANNOUNCER_ELEMENT_TOKEN_FACTORY, ListKeyManager, LiveAnnouncer, MESSAGES_CONTAINER_ID, TOUCH_BUFFER_MS, isFakeMousedownFromScreenReader, isFakeTouchstartFromScreenReader, ɵangular_material_src_cdk_a11y_a11y_a, ɵangular_material_src_cdk_a11y_a11y_b */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "A11yModule", function() { return A11yModule; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ActiveDescendantKeyManager", function() { return ActiveDescendantKeyManager; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AriaDescriber", function() { return AriaDescriber; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CDK_DESCRIBEDBY_HOST_ATTRIBUTE", function() { return CDK_DESCRIBEDBY_HOST_ATTRIBUTE; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CDK_DESCRIBEDBY_ID_PREFIX", function() { return CDK_DESCRIBEDBY_ID_PREFIX; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CdkAriaLive", function() { return CdkAriaLive; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CdkMonitorFocus", function() { return CdkMonitorFocus; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CdkTrapFocus", function() { return CdkTrapFocus; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ConfigurableFocusTrap", function() { return ConfigurableFocusTrap; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ConfigurableFocusTrapFactory", function() { return ConfigurableFocusTrapFactory; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "EventListenerFocusTrapInertStrategy", function() { return EventListenerFocusTrapInertStrategy; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FOCUS_MONITOR_DEFAULT_OPTIONS", function() { return FOCUS_MONITOR_DEFAULT_OPTIONS; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FOCUS_TRAP_INERT_STRATEGY", function() { return FOCUS_TRAP_INERT_STRATEGY; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FocusKeyManager", function() { return FocusKeyManager; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FocusMonitor", function() { return FocusMonitor; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FocusTrap", function() { return FocusTrap; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FocusTrapFactory", function() { return FocusTrapFactory; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "HighContrastModeDetector", function() { return HighContrastModeDetector; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "InteractivityChecker", function() { return InteractivityChecker; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "IsFocusableConfig", function() { return IsFocusableConfig; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LIVE_ANNOUNCER_DEFAULT_OPTIONS", function() { return LIVE_ANNOUNCER_DEFAULT_OPTIONS; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LIVE_ANNOUNCER_ELEMENT_TOKEN", function() { return LIVE_ANNOUNCER_ELEMENT_TOKEN; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LIVE_ANNOUNCER_ELEMENT_TOKEN_FACTORY", function() { return LIVE_ANNOUNCER_ELEMENT_TOKEN_FACTORY; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ListKeyManager", function() { return ListKeyManager; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LiveAnnouncer", function() { return LiveAnnouncer; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MESSAGES_CONTAINER_ID", function() { return MESSAGES_CONTAINER_ID; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TOUCH_BUFFER_MS", function() { return TOUCH_BUFFER_MS; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isFakeMousedownFromScreenReader", function() { return isFakeMousedownFromScreenReader; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isFakeTouchstartFromScreenReader", function() { return isFakeTouchstartFromScreenReader; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵangular_material_src_cdk_a11y_a11y_a", function() { return FocusTrapManager; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵangular_material_src_cdk_a11y_a11y_b", function() { return ConfigurableFocusTrapConfig; });
+/* harmony import */ var _angular_common__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/common */ "./node_modules/@angular/common/__ivy_ngcc__/fesm2015/common.js");
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var rxjs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! rxjs */ "./node_modules/rxjs/_esm5/index.js");
+/* harmony import */ var _angular_cdk_keycodes__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @angular/cdk/keycodes */ "./node_modules/@angular/cdk/__ivy_ngcc__/fesm2015/keycodes.js");
+/* harmony import */ var rxjs_operators__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! rxjs/operators */ "./node_modules/rxjs/_esm5/operators/index.js");
+/* harmony import */ var _angular_cdk_coercion__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @angular/cdk/coercion */ "./node_modules/@angular/cdk/fesm2015/coercion.js");
+/* harmony import */ var _angular_cdk_platform__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @angular/cdk/platform */ "./node_modules/@angular/cdk/__ivy_ngcc__/fesm2015/platform.js");
+/* harmony import */ var _angular_cdk_observers__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @angular/cdk/observers */ "./node_modules/@angular/cdk/__ivy_ngcc__/fesm2015/observers.js");
+
+
+
+
+
+
+
+
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/** IDs are delimited by an empty space, as per the spec. */
+
+
+
+const ID_DELIMITER = ' ';
+/**
+ * Adds the given ID to the specified ARIA attribute on an element.
+ * Used for attributes such as aria-labelledby, aria-owns, etc.
+ */
+function addAriaReferencedId(el, attr, id) {
+ const ids = getAriaReferenceIds(el, attr);
+ if (ids.some(existingId => existingId.trim() == id.trim())) {
+ return;
+ }
+ ids.push(id.trim());
+ el.setAttribute(attr, ids.join(ID_DELIMITER));
+}
+/**
+ * Removes the given ID from the specified ARIA attribute on an element.
+ * Used for attributes such as aria-labelledby, aria-owns, etc.
+ */
+function removeAriaReferencedId(el, attr, id) {
+ const ids = getAriaReferenceIds(el, attr);
+ const filteredIds = ids.filter(val => val != id.trim());
+ if (filteredIds.length) {
+ el.setAttribute(attr, filteredIds.join(ID_DELIMITER));
+ }
+ else {
+ el.removeAttribute(attr);
+ }
+}
+/**
+ * Gets the list of IDs referenced by the given ARIA attribute on an element.
+ * Used for attributes such as aria-labelledby, aria-owns, etc.
+ */
+function getAriaReferenceIds(el, attr) {
+ // Get string array of all individual ids (whitespace delimited) in the attribute value
+ return (el.getAttribute(attr) || '').match(/\S+/g) || [];
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/** ID used for the body container where all messages are appended. */
+const MESSAGES_CONTAINER_ID = 'cdk-describedby-message-container';
+/** ID prefix used for each created message element. */
+const CDK_DESCRIBEDBY_ID_PREFIX = 'cdk-describedby-message';
+/** Attribute given to each host element that is described by a message element. */
+const CDK_DESCRIBEDBY_HOST_ATTRIBUTE = 'cdk-describedby-host';
+/** Global incremental identifier for each registered message element. */
+let nextId = 0;
+/** Global map of all registered message elements that have been placed into the document. */
+const messageRegistry = new Map();
+/** Container for all registered messages. */
+let messagesContainer = null;
+/**
+ * Utility that creates visually hidden elements with a message content. Useful for elements that
+ * want to use aria-describedby to further describe themselves without adding additional visual
+ * content.
+ */
+class AriaDescriber {
+ constructor(_document) {
+ this._document = _document;
+ }
+ describe(hostElement, message, role) {
+ if (!this._canBeDescribed(hostElement, message)) {
+ return;
+ }
+ const key = getKey(message, role);
+ if (typeof message !== 'string') {
+ // We need to ensure that the element has an ID.
+ setMessageId(message);
+ messageRegistry.set(key, { messageElement: message, referenceCount: 0 });
+ }
+ else if (!messageRegistry.has(key)) {
+ this._createMessageElement(message, role);
+ }
+ if (!this._isElementDescribedByMessage(hostElement, key)) {
+ this._addMessageReference(hostElement, key);
+ }
+ }
+ removeDescription(hostElement, message, role) {
+ if (!message || !this._isElementNode(hostElement)) {
+ return;
+ }
+ const key = getKey(message, role);
+ if (this._isElementDescribedByMessage(hostElement, key)) {
+ this._removeMessageReference(hostElement, key);
+ }
+ // If the message is a string, it means that it's one that we created for the
+ // consumer so we can remove it safely, otherwise we should leave it in place.
+ if (typeof message === 'string') {
+ const registeredMessage = messageRegistry.get(key);
+ if (registeredMessage && registeredMessage.referenceCount === 0) {
+ this._deleteMessageElement(key);
+ }
+ }
+ if (messagesContainer && messagesContainer.childNodes.length === 0) {
+ this._deleteMessagesContainer();
+ }
+ }
+ /** Unregisters all created message elements and removes the message container. */
+ ngOnDestroy() {
+ const describedElements = this._document.querySelectorAll(`[${CDK_DESCRIBEDBY_HOST_ATTRIBUTE}]`);
+ for (let i = 0; i < describedElements.length; i++) {
+ this._removeCdkDescribedByReferenceIds(describedElements[i]);
+ describedElements[i].removeAttribute(CDK_DESCRIBEDBY_HOST_ATTRIBUTE);
+ }
+ if (messagesContainer) {
+ this._deleteMessagesContainer();
+ }
+ messageRegistry.clear();
+ }
+ /**
+ * Creates a new element in the visually hidden message container element with the message
+ * as its content and adds it to the message registry.
+ */
+ _createMessageElement(message, role) {
+ const messageElement = this._document.createElement('div');
+ setMessageId(messageElement);
+ messageElement.textContent = message;
+ if (role) {
+ messageElement.setAttribute('role', role);
+ }
+ this._createMessagesContainer();
+ messagesContainer.appendChild(messageElement);
+ messageRegistry.set(getKey(message, role), { messageElement, referenceCount: 0 });
+ }
+ /** Deletes the message element from the global messages container. */
+ _deleteMessageElement(key) {
+ const registeredMessage = messageRegistry.get(key);
+ const messageElement = registeredMessage && registeredMessage.messageElement;
+ if (messagesContainer && messageElement) {
+ messagesContainer.removeChild(messageElement);
+ }
+ messageRegistry.delete(key);
+ }
+ /** Creates the global container for all aria-describedby messages. */
+ _createMessagesContainer() {
+ if (!messagesContainer) {
+ const preExistingContainer = this._document.getElementById(MESSAGES_CONTAINER_ID);
+ // When going from the server to the client, we may end up in a situation where there's
+ // already a container on the page, but we don't have a reference to it. Clear the
+ // old container so we don't get duplicates. Doing this, instead of emptying the previous
+ // container, should be slightly faster.
+ if (preExistingContainer && preExistingContainer.parentNode) {
+ preExistingContainer.parentNode.removeChild(preExistingContainer);
+ }
+ messagesContainer = this._document.createElement('div');
+ messagesContainer.id = MESSAGES_CONTAINER_ID;
+ // We add `visibility: hidden` in order to prevent text in this container from
+ // being searchable by the browser's Ctrl + F functionality.
+ // Screen-readers will still read the description for elements with aria-describedby even
+ // when the description element is not visible.
+ messagesContainer.style.visibility = 'hidden';
+ // Even though we use `visibility: hidden`, we still apply `cdk-visually-hidden` so that
+ // the description element doesn't impact page layout.
+ messagesContainer.classList.add('cdk-visually-hidden');
+ this._document.body.appendChild(messagesContainer);
+ }
+ }
+ /** Deletes the global messages container. */
+ _deleteMessagesContainer() {
+ if (messagesContainer && messagesContainer.parentNode) {
+ messagesContainer.parentNode.removeChild(messagesContainer);
+ messagesContainer = null;
+ }
+ }
+ /** Removes all cdk-describedby messages that are hosted through the element. */
+ _removeCdkDescribedByReferenceIds(element) {
+ // Remove all aria-describedby reference IDs that are prefixed by CDK_DESCRIBEDBY_ID_PREFIX
+ const originalReferenceIds = getAriaReferenceIds(element, 'aria-describedby')
+ .filter(id => id.indexOf(CDK_DESCRIBEDBY_ID_PREFIX) != 0);
+ element.setAttribute('aria-describedby', originalReferenceIds.join(' '));
+ }
+ /**
+ * Adds a message reference to the element using aria-describedby and increments the registered
+ * message's reference count.
+ */
+ _addMessageReference(element, key) {
+ const registeredMessage = messageRegistry.get(key);
+ // Add the aria-describedby reference and set the
+ // describedby_host attribute to mark the element.
+ addAriaReferencedId(element, 'aria-describedby', registeredMessage.messageElement.id);
+ element.setAttribute(CDK_DESCRIBEDBY_HOST_ATTRIBUTE, '');
+ registeredMessage.referenceCount++;
+ }
+ /**
+ * Removes a message reference from the element using aria-describedby
+ * and decrements the registered message's reference count.
+ */
+ _removeMessageReference(element, key) {
+ const registeredMessage = messageRegistry.get(key);
+ registeredMessage.referenceCount--;
+ removeAriaReferencedId(element, 'aria-describedby', registeredMessage.messageElement.id);
+ element.removeAttribute(CDK_DESCRIBEDBY_HOST_ATTRIBUTE);
+ }
+ /** Returns true if the element has been described by the provided message ID. */
+ _isElementDescribedByMessage(element, key) {
+ const referenceIds = getAriaReferenceIds(element, 'aria-describedby');
+ const registeredMessage = messageRegistry.get(key);
+ const messageId = registeredMessage && registeredMessage.messageElement.id;
+ return !!messageId && referenceIds.indexOf(messageId) != -1;
+ }
+ /** Determines whether a message can be described on a particular element. */
+ _canBeDescribed(element, message) {
+ if (!this._isElementNode(element)) {
+ return false;
+ }
+ if (message && typeof message === 'object') {
+ // We'd have to make some assumptions about the description element's text, if the consumer
+ // passed in an element. Assume that if an element is passed in, the consumer has verified
+ // that it can be used as a description.
+ return true;
+ }
+ const trimmedMessage = message == null ? '' : `${message}`.trim();
+ const ariaLabel = element.getAttribute('aria-label');
+ // We shouldn't set descriptions if they're exactly the same as the `aria-label` of the
+ // element, because screen readers will end up reading out the same text twice in a row.
+ return trimmedMessage ? (!ariaLabel || ariaLabel.trim() !== trimmedMessage) : false;
+ }
+ /** Checks whether a node is an Element node. */
+ _isElementNode(element) {
+ return element.nodeType === this._document.ELEMENT_NODE;
+ }
+}
+AriaDescriber.ɵfac = function AriaDescriber_Factory(t) { return new (t || AriaDescriber)(_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵinject"](_angular_common__WEBPACK_IMPORTED_MODULE_0__["DOCUMENT"])); };
+AriaDescriber.ɵprov = Object(_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdefineInjectable"])({ factory: function AriaDescriber_Factory() { return new AriaDescriber(Object(_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵinject"])(_angular_common__WEBPACK_IMPORTED_MODULE_0__["DOCUMENT"])); }, token: AriaDescriber, providedIn: "root" });
+AriaDescriber.ctorParameters = () => [
+ { type: undefined, decorators: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Inject"], args: [_angular_common__WEBPACK_IMPORTED_MODULE_0__["DOCUMENT"],] }] }
+];
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵsetClassMetadata"](AriaDescriber, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Injectable"],
+ args: [{ providedIn: 'root' }]
+ }], function () { return [{ type: undefined, decorators: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Inject"],
+ args: [_angular_common__WEBPACK_IMPORTED_MODULE_0__["DOCUMENT"]]
+ }] }]; }, null); })();
+/** Gets a key that can be used to look messages up in the registry. */
+function getKey(message, role) {
+ return typeof message === 'string' ? `${role || ''}/${message}` : message;
+}
+/** Assigns a unique ID to an element, if it doesn't have one already. */
+function setMessageId(element) {
+ if (!element.id) {
+ element.id = `${CDK_DESCRIBEDBY_ID_PREFIX}-${nextId++}`;
+ }
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * This class manages keyboard events for selectable lists. If you pass it a query list
+ * of items, it will set the active item correctly when arrow events occur.
+ */
+class ListKeyManager {
+ constructor(_items) {
+ this._items = _items;
+ this._activeItemIndex = -1;
+ this._activeItem = null;
+ this._wrap = false;
+ this._letterKeyStream = new rxjs__WEBPACK_IMPORTED_MODULE_2__["Subject"]();
+ this._typeaheadSubscription = rxjs__WEBPACK_IMPORTED_MODULE_2__["Subscription"].EMPTY;
+ this._vertical = true;
+ this._allowedModifierKeys = [];
+ this._homeAndEnd = false;
+ /**
+ * Predicate function that can be used to check whether an item should be skipped
+ * by the key manager. By default, disabled items are skipped.
+ */
+ this._skipPredicateFn = (item) => item.disabled;
+ // Buffer for the letters that the user has pressed when the typeahead option is turned on.
+ this._pressedLetters = [];
+ /**
+ * Stream that emits any time the TAB key is pressed, so components can react
+ * when focus is shifted off of the list.
+ */
+ this.tabOut = new rxjs__WEBPACK_IMPORTED_MODULE_2__["Subject"]();
+ /** Stream that emits whenever the active item of the list manager changes. */
+ this.change = new rxjs__WEBPACK_IMPORTED_MODULE_2__["Subject"]();
+ // We allow for the items to be an array because, in some cases, the consumer may
+ // not have access to a QueryList of the items they want to manage (e.g. when the
+ // items aren't being collected via `ViewChildren` or `ContentChildren`).
+ if (_items instanceof _angular_core__WEBPACK_IMPORTED_MODULE_1__["QueryList"]) {
+ _items.changes.subscribe((newItems) => {
+ if (this._activeItem) {
+ const itemArray = newItems.toArray();
+ const newIndex = itemArray.indexOf(this._activeItem);
+ if (newIndex > -1 && newIndex !== this._activeItemIndex) {
+ this._activeItemIndex = newIndex;
+ }
+ }
+ });
+ }
+ }
+ /**
+ * Sets the predicate function that determines which items should be skipped by the
+ * list key manager.
+ * @param predicate Function that determines whether the given item should be skipped.
+ */
+ skipPredicate(predicate) {
+ this._skipPredicateFn = predicate;
+ return this;
+ }
+ /**
+ * Configures wrapping mode, which determines whether the active item will wrap to
+ * the other end of list when there are no more items in the given direction.
+ * @param shouldWrap Whether the list should wrap when reaching the end.
+ */
+ withWrap(shouldWrap = true) {
+ this._wrap = shouldWrap;
+ return this;
+ }
+ /**
+ * Configures whether the key manager should be able to move the selection vertically.
+ * @param enabled Whether vertical selection should be enabled.
+ */
+ withVerticalOrientation(enabled = true) {
+ this._vertical = enabled;
+ return this;
+ }
+ /**
+ * Configures the key manager to move the selection horizontally.
+ * Passing in `null` will disable horizontal movement.
+ * @param direction Direction in which the selection can be moved.
+ */
+ withHorizontalOrientation(direction) {
+ this._horizontal = direction;
+ return this;
+ }
+ /**
+ * Modifier keys which are allowed to be held down and whose default actions will be prevented
+ * as the user is pressing the arrow keys. Defaults to not allowing any modifier keys.
+ */
+ withAllowedModifierKeys(keys) {
+ this._allowedModifierKeys = keys;
+ return this;
+ }
+ /**
+ * Turns on typeahead mode which allows users to set the active item by typing.
+ * @param debounceInterval Time to wait after the last keystroke before setting the active item.
+ */
+ withTypeAhead(debounceInterval = 200) {
+ if ((typeof ngDevMode === 'undefined' || ngDevMode) && (this._items.length &&
+ this._items.some(item => typeof item.getLabel !== 'function'))) {
+ throw Error('ListKeyManager items in typeahead mode must implement the `getLabel` method.');
+ }
+ this._typeaheadSubscription.unsubscribe();
+ // Debounce the presses of non-navigational keys, collect the ones that correspond to letters
+ // and convert those letters back into a string. Afterwards find the first item that starts
+ // with that string and select it.
+ this._typeaheadSubscription = this._letterKeyStream.pipe(Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_4__["tap"])(letter => this._pressedLetters.push(letter)), Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_4__["debounceTime"])(debounceInterval), Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_4__["filter"])(() => this._pressedLetters.length > 0), Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_4__["map"])(() => this._pressedLetters.join(''))).subscribe(inputString => {
+ const items = this._getItemsArray();
+ // Start at 1 because we want to start searching at the item immediately
+ // following the current active item.
+ for (let i = 1; i < items.length + 1; i++) {
+ const index = (this._activeItemIndex + i) % items.length;
+ const item = items[index];
+ if (!this._skipPredicateFn(item) &&
+ item.getLabel().toUpperCase().trim().indexOf(inputString) === 0) {
+ this.setActiveItem(index);
+ break;
+ }
+ }
+ this._pressedLetters = [];
+ });
+ return this;
+ }
+ /**
+ * Configures the key manager to activate the first and last items
+ * respectively when the Home or End key is pressed.
+ * @param enabled Whether pressing the Home or End key activates the first/last item.
+ */
+ withHomeAndEnd(enabled = true) {
+ this._homeAndEnd = enabled;
+ return this;
+ }
+ setActiveItem(item) {
+ const previousActiveItem = this._activeItem;
+ this.updateActiveItem(item);
+ if (this._activeItem !== previousActiveItem) {
+ this.change.next(this._activeItemIndex);
+ }
+ }
+ /**
+ * Sets the active item depending on the key event passed in.
+ * @param event Keyboard event to be used for determining which element should be active.
+ */
+ onKeydown(event) {
+ const keyCode = event.keyCode;
+ const modifiers = ['altKey', 'ctrlKey', 'metaKey', 'shiftKey'];
+ const isModifierAllowed = modifiers.every(modifier => {
+ return !event[modifier] || this._allowedModifierKeys.indexOf(modifier) > -1;
+ });
+ switch (keyCode) {
+ case _angular_cdk_keycodes__WEBPACK_IMPORTED_MODULE_3__["TAB"]:
+ this.tabOut.next();
+ return;
+ case _angular_cdk_keycodes__WEBPACK_IMPORTED_MODULE_3__["DOWN_ARROW"]:
+ if (this._vertical && isModifierAllowed) {
+ this.setNextItemActive();
+ break;
+ }
+ else {
+ return;
+ }
+ case _angular_cdk_keycodes__WEBPACK_IMPORTED_MODULE_3__["UP_ARROW"]:
+ if (this._vertical && isModifierAllowed) {
+ this.setPreviousItemActive();
+ break;
+ }
+ else {
+ return;
+ }
+ case _angular_cdk_keycodes__WEBPACK_IMPORTED_MODULE_3__["RIGHT_ARROW"]:
+ if (this._horizontal && isModifierAllowed) {
+ this._horizontal === 'rtl' ? this.setPreviousItemActive() : this.setNextItemActive();
+ break;
+ }
+ else {
+ return;
+ }
+ case _angular_cdk_keycodes__WEBPACK_IMPORTED_MODULE_3__["LEFT_ARROW"]:
+ if (this._horizontal && isModifierAllowed) {
+ this._horizontal === 'rtl' ? this.setNextItemActive() : this.setPreviousItemActive();
+ break;
+ }
+ else {
+ return;
+ }
+ case _angular_cdk_keycodes__WEBPACK_IMPORTED_MODULE_3__["HOME"]:
+ if (this._homeAndEnd && isModifierAllowed) {
+ this.setFirstItemActive();
+ break;
+ }
+ else {
+ return;
+ }
+ case _angular_cdk_keycodes__WEBPACK_IMPORTED_MODULE_3__["END"]:
+ if (this._homeAndEnd && isModifierAllowed) {
+ this.setLastItemActive();
+ break;
+ }
+ else {
+ return;
+ }
+ default:
+ if (isModifierAllowed || Object(_angular_cdk_keycodes__WEBPACK_IMPORTED_MODULE_3__["hasModifierKey"])(event, 'shiftKey')) {
+ // Attempt to use the `event.key` which also maps it to the user's keyboard language,
+ // otherwise fall back to resolving alphanumeric characters via the keyCode.
+ if (event.key && event.key.length === 1) {
+ this._letterKeyStream.next(event.key.toLocaleUpperCase());
+ }
+ else if ((keyCode >= _angular_cdk_keycodes__WEBPACK_IMPORTED_MODULE_3__["A"] && keyCode <= _angular_cdk_keycodes__WEBPACK_IMPORTED_MODULE_3__["Z"]) || (keyCode >= _angular_cdk_keycodes__WEBPACK_IMPORTED_MODULE_3__["ZERO"] && keyCode <= _angular_cdk_keycodes__WEBPACK_IMPORTED_MODULE_3__["NINE"])) {
+ this._letterKeyStream.next(String.fromCharCode(keyCode));
+ }
+ }
+ // Note that we return here, in order to avoid preventing
+ // the default action of non-navigational keys.
+ return;
+ }
+ this._pressedLetters = [];
+ event.preventDefault();
+ }
+ /** Index of the currently active item. */
+ get activeItemIndex() {
+ return this._activeItemIndex;
+ }
+ /** The active item. */
+ get activeItem() {
+ return this._activeItem;
+ }
+ /** Gets whether the user is currently typing into the manager using the typeahead feature. */
+ isTyping() {
+ return this._pressedLetters.length > 0;
+ }
+ /** Sets the active item to the first enabled item in the list. */
+ setFirstItemActive() {
+ this._setActiveItemByIndex(0, 1);
+ }
+ /** Sets the active item to the last enabled item in the list. */
+ setLastItemActive() {
+ this._setActiveItemByIndex(this._items.length - 1, -1);
+ }
+ /** Sets the active item to the next enabled item in the list. */
+ setNextItemActive() {
+ this._activeItemIndex < 0 ? this.setFirstItemActive() : this._setActiveItemByDelta(1);
+ }
+ /** Sets the active item to a previous enabled item in the list. */
+ setPreviousItemActive() {
+ this._activeItemIndex < 0 && this._wrap ? this.setLastItemActive()
+ : this._setActiveItemByDelta(-1);
+ }
+ updateActiveItem(item) {
+ const itemArray = this._getItemsArray();
+ const index = typeof item === 'number' ? item : itemArray.indexOf(item);
+ const activeItem = itemArray[index];
+ // Explicitly check for `null` and `undefined` because other falsy values are valid.
+ this._activeItem = activeItem == null ? null : activeItem;
+ this._activeItemIndex = index;
+ }
+ /**
+ * This method sets the active item, given a list of items and the delta between the
+ * currently active item and the new active item. It will calculate differently
+ * depending on whether wrap mode is turned on.
+ */
+ _setActiveItemByDelta(delta) {
+ this._wrap ? this._setActiveInWrapMode(delta) : this._setActiveInDefaultMode(delta);
+ }
+ /**
+ * Sets the active item properly given "wrap" mode. In other words, it will continue to move
+ * down the list until it finds an item that is not disabled, and it will wrap if it
+ * encounters either end of the list.
+ */
+ _setActiveInWrapMode(delta) {
+ const items = this._getItemsArray();
+ for (let i = 1; i <= items.length; i++) {
+ const index = (this._activeItemIndex + (delta * i) + items.length) % items.length;
+ const item = items[index];
+ if (!this._skipPredicateFn(item)) {
+ this.setActiveItem(index);
+ return;
+ }
+ }
+ }
+ /**
+ * Sets the active item properly given the default mode. In other words, it will
+ * continue to move down the list until it finds an item that is not disabled. If
+ * it encounters either end of the list, it will stop and not wrap.
+ */
+ _setActiveInDefaultMode(delta) {
+ this._setActiveItemByIndex(this._activeItemIndex + delta, delta);
+ }
+ /**
+ * Sets the active item to the first enabled item starting at the index specified. If the
+ * item is disabled, it will move in the fallbackDelta direction until it either
+ * finds an enabled item or encounters the end of the list.
+ */
+ _setActiveItemByIndex(index, fallbackDelta) {
+ const items = this._getItemsArray();
+ if (!items[index]) {
+ return;
+ }
+ while (this._skipPredicateFn(items[index])) {
+ index += fallbackDelta;
+ if (!items[index]) {
+ return;
+ }
+ }
+ this.setActiveItem(index);
+ }
+ /** Returns the items as an array. */
+ _getItemsArray() {
+ return this._items instanceof _angular_core__WEBPACK_IMPORTED_MODULE_1__["QueryList"] ? this._items.toArray() : this._items;
+ }
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+class ActiveDescendantKeyManager extends ListKeyManager {
+ setActiveItem(index) {
+ if (this.activeItem) {
+ this.activeItem.setInactiveStyles();
+ }
+ super.setActiveItem(index);
+ if (this.activeItem) {
+ this.activeItem.setActiveStyles();
+ }
+ }
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+class FocusKeyManager extends ListKeyManager {
+ constructor() {
+ super(...arguments);
+ this._origin = 'program';
+ }
+ /**
+ * Sets the focus origin that will be passed in to the items for any subsequent `focus` calls.
+ * @param origin Focus origin to be used when focusing items.
+ */
+ setFocusOrigin(origin) {
+ this._origin = origin;
+ return this;
+ }
+ setActiveItem(item) {
+ super.setActiveItem(item);
+ if (this.activeItem) {
+ this.activeItem.focus(this._origin);
+ }
+ }
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * Configuration for the isFocusable method.
+ */
+class IsFocusableConfig {
+ constructor() {
+ /**
+ * Whether to count an element as focusable even if it is not currently visible.
+ */
+ this.ignoreVisibility = false;
+ }
+}
+// The InteractivityChecker leans heavily on the ally.js accessibility utilities.
+// Methods like `isTabbable` are only covering specific edge-cases for the browsers which are
+// supported.
+/**
+ * Utility for checking the interactivity of an element, such as whether is is focusable or
+ * tabbable.
+ */
+class InteractivityChecker {
+ constructor(_platform) {
+ this._platform = _platform;
+ }
+ /**
+ * Gets whether an element is disabled.
+ *
+ * @param element Element to be checked.
+ * @returns Whether the element is disabled.
+ */
+ isDisabled(element) {
+ // This does not capture some cases, such as a non-form control with a disabled attribute or
+ // a form control inside of a disabled form, but should capture the most common cases.
+ return element.hasAttribute('disabled');
+ }
+ /**
+ * Gets whether an element is visible for the purposes of interactivity.
+ *
+ * This will capture states like `display: none` and `visibility: hidden`, but not things like
+ * being clipped by an `overflow: hidden` parent or being outside the viewport.
+ *
+ * @returns Whether the element is visible.
+ */
+ isVisible(element) {
+ return hasGeometry(element) && getComputedStyle(element).visibility === 'visible';
+ }
+ /**
+ * Gets whether an element can be reached via Tab key.
+ * Assumes that the element has already been checked with isFocusable.
+ *
+ * @param element Element to be checked.
+ * @returns Whether the element is tabbable.
+ */
+ isTabbable(element) {
+ // Nothing is tabbable on the server 😎
+ if (!this._platform.isBrowser) {
+ return false;
+ }
+ const frameElement = getFrameElement(getWindow(element));
+ if (frameElement) {
+ // Frame elements inherit their tabindex onto all child elements.
+ if (getTabIndexValue(frameElement) === -1) {
+ return false;
+ }
+ // Browsers disable tabbing to an element inside of an invisible frame.
+ if (!this.isVisible(frameElement)) {
+ return false;
+ }
+ }
+ let nodeName = element.nodeName.toLowerCase();
+ let tabIndexValue = getTabIndexValue(element);
+ if (element.hasAttribute('contenteditable')) {
+ return tabIndexValue !== -1;
+ }
+ if (nodeName === 'iframe' || nodeName === 'object') {
+ // The frame or object's content may be tabbable depending on the content, but it's
+ // not possibly to reliably detect the content of the frames. We always consider such
+ // elements as non-tabbable.
+ return false;
+ }
+ // In iOS, the browser only considers some specific elements as tabbable.
+ if (this._platform.WEBKIT && this._platform.IOS && !isPotentiallyTabbableIOS(element)) {
+ return false;
+ }
+ if (nodeName === 'audio') {
+ // Audio elements without controls enabled are never tabbable, regardless
+ // of the tabindex attribute explicitly being set.
+ if (!element.hasAttribute('controls')) {
+ return false;
+ }
+ // Audio elements with controls are by default tabbable unless the
+ // tabindex attribute is set to `-1` explicitly.
+ return tabIndexValue !== -1;
+ }
+ if (nodeName === 'video') {
+ // For all video elements, if the tabindex attribute is set to `-1`, the video
+ // is not tabbable. Note: We cannot rely on the default `HTMLElement.tabIndex`
+ // property as that one is set to `-1` in Chrome, Edge and Safari v13.1. The
+ // tabindex attribute is the source of truth here.
+ if (tabIndexValue === -1) {
+ return false;
+ }
+ // If the tabindex is explicitly set, and not `-1` (as per check before), the
+ // video element is always tabbable (regardless of whether it has controls or not).
+ if (tabIndexValue !== null) {
+ return true;
+ }
+ // Otherwise (when no explicit tabindex is set), a video is only tabbable if it
+ // has controls enabled. Firefox is special as videos are always tabbable regardless
+ // of whether there are controls or not.
+ return this._platform.FIREFOX || element.hasAttribute('controls');
+ }
+ return element.tabIndex >= 0;
+ }
+ /**
+ * Gets whether an element can be focused by the user.
+ *
+ * @param element Element to be checked.
+ * @param config The config object with options to customize this method's behavior
+ * @returns Whether the element is focusable.
+ */
+ isFocusable(element, config) {
+ // Perform checks in order of left to most expensive.
+ // Again, naive approach that does not capture many edge cases and browser quirks.
+ return isPotentiallyFocusable(element) && !this.isDisabled(element) &&
+ ((config === null || config === void 0 ? void 0 : config.ignoreVisibility) || this.isVisible(element));
+ }
+}
+InteractivityChecker.ɵfac = function InteractivityChecker_Factory(t) { return new (t || InteractivityChecker)(_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵinject"](_angular_cdk_platform__WEBPACK_IMPORTED_MODULE_6__["Platform"])); };
+InteractivityChecker.ɵprov = Object(_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdefineInjectable"])({ factory: function InteractivityChecker_Factory() { return new InteractivityChecker(Object(_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵinject"])(_angular_cdk_platform__WEBPACK_IMPORTED_MODULE_6__["Platform"])); }, token: InteractivityChecker, providedIn: "root" });
+InteractivityChecker.ctorParameters = () => [
+ { type: _angular_cdk_platform__WEBPACK_IMPORTED_MODULE_6__["Platform"] }
+];
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵsetClassMetadata"](InteractivityChecker, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Injectable"],
+ args: [{ providedIn: 'root' }]
+ }], function () { return [{ type: _angular_cdk_platform__WEBPACK_IMPORTED_MODULE_6__["Platform"] }]; }, null); })();
+/**
+ * Returns the frame element from a window object. Since browsers like MS Edge throw errors if
+ * the frameElement property is being accessed from a different host address, this property
+ * should be accessed carefully.
+ */
+function getFrameElement(window) {
+ try {
+ return window.frameElement;
+ }
+ catch (_a) {
+ return null;
+ }
+}
+/** Checks whether the specified element has any geometry / rectangles. */
+function hasGeometry(element) {
+ // Use logic from jQuery to check for an invisible element.
+ // See https://github.com/jquery/jquery/blob/master/src/css/hiddenVisibleSelectors.js#L12
+ return !!(element.offsetWidth || element.offsetHeight ||
+ (typeof element.getClientRects === 'function' && element.getClientRects().length));
+}
+/** Gets whether an element's */
+function isNativeFormElement(element) {
+ let nodeName = element.nodeName.toLowerCase();
+ return nodeName === 'input' ||
+ nodeName === 'select' ||
+ nodeName === 'button' ||
+ nodeName === 'textarea';
+}
+/** Gets whether an element is an ``. */
+function isHiddenInput(element) {
+ return isInputElement(element) && element.type == 'hidden';
+}
+/** Gets whether an element is an anchor that has an href attribute. */
+function isAnchorWithHref(element) {
+ return isAnchorElement(element) && element.hasAttribute('href');
+}
+/** Gets whether an element is an input element. */
+function isInputElement(element) {
+ return element.nodeName.toLowerCase() == 'input';
+}
+/** Gets whether an element is an anchor element. */
+function isAnchorElement(element) {
+ return element.nodeName.toLowerCase() == 'a';
+}
+/** Gets whether an element has a valid tabindex. */
+function hasValidTabIndex(element) {
+ if (!element.hasAttribute('tabindex') || element.tabIndex === undefined) {
+ return false;
+ }
+ let tabIndex = element.getAttribute('tabindex');
+ // IE11 parses tabindex="" as the value "-32768"
+ if (tabIndex == '-32768') {
+ return false;
+ }
+ return !!(tabIndex && !isNaN(parseInt(tabIndex, 10)));
+}
+/**
+ * Returns the parsed tabindex from the element attributes instead of returning the
+ * evaluated tabindex from the browsers defaults.
+ */
+function getTabIndexValue(element) {
+ if (!hasValidTabIndex(element)) {
+ return null;
+ }
+ // See browser issue in Gecko https://bugzilla.mozilla.org/show_bug.cgi?id=1128054
+ const tabIndex = parseInt(element.getAttribute('tabindex') || '', 10);
+ return isNaN(tabIndex) ? -1 : tabIndex;
+}
+/** Checks whether the specified element is potentially tabbable on iOS */
+function isPotentiallyTabbableIOS(element) {
+ let nodeName = element.nodeName.toLowerCase();
+ let inputType = nodeName === 'input' && element.type;
+ return inputType === 'text'
+ || inputType === 'password'
+ || nodeName === 'select'
+ || nodeName === 'textarea';
+}
+/**
+ * Gets whether an element is potentially focusable without taking current visible/disabled state
+ * into account.
+ */
+function isPotentiallyFocusable(element) {
+ // Inputs are potentially focusable *unless* they're type="hidden".
+ if (isHiddenInput(element)) {
+ return false;
+ }
+ return isNativeFormElement(element) ||
+ isAnchorWithHref(element) ||
+ element.hasAttribute('contenteditable') ||
+ hasValidTabIndex(element);
+}
+/** Gets the parent window of a DOM node with regards of being inside of an iframe. */
+function getWindow(node) {
+ // ownerDocument is null if `node` itself *is* a document.
+ return node.ownerDocument && node.ownerDocument.defaultView || window;
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * Class that allows for trapping focus within a DOM element.
+ *
+ * This class currently uses a relatively simple approach to focus trapping.
+ * It assumes that the tab order is the same as DOM order, which is not necessarily true.
+ * Things like `tabIndex > 0`, flex `order`, and shadow roots can cause the two to be misaligned.
+ *
+ * @deprecated Use `ConfigurableFocusTrap` instead.
+ * @breaking-change 11.0.0
+ */
+class FocusTrap {
+ constructor(_element, _checker, _ngZone, _document, deferAnchors = false) {
+ this._element = _element;
+ this._checker = _checker;
+ this._ngZone = _ngZone;
+ this._document = _document;
+ this._hasAttached = false;
+ // Event listeners for the anchors. Need to be regular functions so that we can unbind them later.
+ this.startAnchorListener = () => this.focusLastTabbableElement();
+ this.endAnchorListener = () => this.focusFirstTabbableElement();
+ this._enabled = true;
+ if (!deferAnchors) {
+ this.attachAnchors();
+ }
+ }
+ /** Whether the focus trap is active. */
+ get enabled() { return this._enabled; }
+ set enabled(value) {
+ this._enabled = value;
+ if (this._startAnchor && this._endAnchor) {
+ this._toggleAnchorTabIndex(value, this._startAnchor);
+ this._toggleAnchorTabIndex(value, this._endAnchor);
+ }
+ }
+ /** Destroys the focus trap by cleaning up the anchors. */
+ destroy() {
+ const startAnchor = this._startAnchor;
+ const endAnchor = this._endAnchor;
+ if (startAnchor) {
+ startAnchor.removeEventListener('focus', this.startAnchorListener);
+ if (startAnchor.parentNode) {
+ startAnchor.parentNode.removeChild(startAnchor);
+ }
+ }
+ if (endAnchor) {
+ endAnchor.removeEventListener('focus', this.endAnchorListener);
+ if (endAnchor.parentNode) {
+ endAnchor.parentNode.removeChild(endAnchor);
+ }
+ }
+ this._startAnchor = this._endAnchor = null;
+ this._hasAttached = false;
+ }
+ /**
+ * Inserts the anchors into the DOM. This is usually done automatically
+ * in the constructor, but can be deferred for cases like directives with `*ngIf`.
+ * @returns Whether the focus trap managed to attach successfully. This may not be the case
+ * if the target element isn't currently in the DOM.
+ */
+ attachAnchors() {
+ // If we're not on the browser, there can be no focus to trap.
+ if (this._hasAttached) {
+ return true;
+ }
+ this._ngZone.runOutsideAngular(() => {
+ if (!this._startAnchor) {
+ this._startAnchor = this._createAnchor();
+ this._startAnchor.addEventListener('focus', this.startAnchorListener);
+ }
+ if (!this._endAnchor) {
+ this._endAnchor = this._createAnchor();
+ this._endAnchor.addEventListener('focus', this.endAnchorListener);
+ }
+ });
+ if (this._element.parentNode) {
+ this._element.parentNode.insertBefore(this._startAnchor, this._element);
+ this._element.parentNode.insertBefore(this._endAnchor, this._element.nextSibling);
+ this._hasAttached = true;
+ }
+ return this._hasAttached;
+ }
+ /**
+ * Waits for the zone to stabilize, then either focuses the first element that the
+ * user specified, or the first tabbable element.
+ * @returns Returns a promise that resolves with a boolean, depending
+ * on whether focus was moved successfully.
+ */
+ focusInitialElementWhenReady() {
+ return new Promise(resolve => {
+ this._executeOnStable(() => resolve(this.focusInitialElement()));
+ });
+ }
+ /**
+ * Waits for the zone to stabilize, then focuses
+ * the first tabbable element within the focus trap region.
+ * @returns Returns a promise that resolves with a boolean, depending
+ * on whether focus was moved successfully.
+ */
+ focusFirstTabbableElementWhenReady() {
+ return new Promise(resolve => {
+ this._executeOnStable(() => resolve(this.focusFirstTabbableElement()));
+ });
+ }
+ /**
+ * Waits for the zone to stabilize, then focuses
+ * the last tabbable element within the focus trap region.
+ * @returns Returns a promise that resolves with a boolean, depending
+ * on whether focus was moved successfully.
+ */
+ focusLastTabbableElementWhenReady() {
+ return new Promise(resolve => {
+ this._executeOnStable(() => resolve(this.focusLastTabbableElement()));
+ });
+ }
+ /**
+ * Get the specified boundary element of the trapped region.
+ * @param bound The boundary to get (start or end of trapped region).
+ * @returns The boundary element.
+ */
+ _getRegionBoundary(bound) {
+ // Contains the deprecated version of selector, for temporary backwards comparability.
+ let markers = this._element.querySelectorAll(`[cdk-focus-region-${bound}], ` +
+ `[cdkFocusRegion${bound}], ` +
+ `[cdk-focus-${bound}]`);
+ for (let i = 0; i < markers.length; i++) {
+ // @breaking-change 8.0.0
+ if (markers[i].hasAttribute(`cdk-focus-${bound}`)) {
+ console.warn(`Found use of deprecated attribute 'cdk-focus-${bound}', ` +
+ `use 'cdkFocusRegion${bound}' instead. The deprecated ` +
+ `attribute will be removed in 8.0.0.`, markers[i]);
+ }
+ else if (markers[i].hasAttribute(`cdk-focus-region-${bound}`)) {
+ console.warn(`Found use of deprecated attribute 'cdk-focus-region-${bound}', ` +
+ `use 'cdkFocusRegion${bound}' instead. The deprecated attribute ` +
+ `will be removed in 8.0.0.`, markers[i]);
+ }
+ }
+ if (bound == 'start') {
+ return markers.length ? markers[0] : this._getFirstTabbableElement(this._element);
+ }
+ return markers.length ?
+ markers[markers.length - 1] : this._getLastTabbableElement(this._element);
+ }
+ /**
+ * Focuses the element that should be focused when the focus trap is initialized.
+ * @returns Whether focus was moved successfully.
+ */
+ focusInitialElement() {
+ // Contains the deprecated version of selector, for temporary backwards comparability.
+ const redirectToElement = this._element.querySelector(`[cdk-focus-initial], ` +
+ `[cdkFocusInitial]`);
+ if (redirectToElement) {
+ // @breaking-change 8.0.0
+ if (redirectToElement.hasAttribute(`cdk-focus-initial`)) {
+ console.warn(`Found use of deprecated attribute 'cdk-focus-initial', ` +
+ `use 'cdkFocusInitial' instead. The deprecated attribute ` +
+ `will be removed in 8.0.0`, redirectToElement);
+ }
+ // Warn the consumer if the element they've pointed to
+ // isn't focusable, when not in production mode.
+ if ((typeof ngDevMode === 'undefined' || ngDevMode) &&
+ !this._checker.isFocusable(redirectToElement)) {
+ console.warn(`Element matching '[cdkFocusInitial]' is not focusable.`, redirectToElement);
+ }
+ if (!this._checker.isFocusable(redirectToElement)) {
+ const focusableChild = this._getFirstTabbableElement(redirectToElement);
+ focusableChild === null || focusableChild === void 0 ? void 0 : focusableChild.focus();
+ return !!focusableChild;
+ }
+ redirectToElement.focus();
+ return true;
+ }
+ return this.focusFirstTabbableElement();
+ }
+ /**
+ * Focuses the first tabbable element within the focus trap region.
+ * @returns Whether focus was moved successfully.
+ */
+ focusFirstTabbableElement() {
+ const redirectToElement = this._getRegionBoundary('start');
+ if (redirectToElement) {
+ redirectToElement.focus();
+ }
+ return !!redirectToElement;
+ }
+ /**
+ * Focuses the last tabbable element within the focus trap region.
+ * @returns Whether focus was moved successfully.
+ */
+ focusLastTabbableElement() {
+ const redirectToElement = this._getRegionBoundary('end');
+ if (redirectToElement) {
+ redirectToElement.focus();
+ }
+ return !!redirectToElement;
+ }
+ /**
+ * Checks whether the focus trap has successfully been attached.
+ */
+ hasAttached() {
+ return this._hasAttached;
+ }
+ /** Get the first tabbable element from a DOM subtree (inclusive). */
+ _getFirstTabbableElement(root) {
+ if (this._checker.isFocusable(root) && this._checker.isTabbable(root)) {
+ return root;
+ }
+ // Iterate in DOM order. Note that IE doesn't have `children` for SVG so we fall
+ // back to `childNodes` which includes text nodes, comments etc.
+ let children = root.children || root.childNodes;
+ for (let i = 0; i < children.length; i++) {
+ let tabbableChild = children[i].nodeType === this._document.ELEMENT_NODE ?
+ this._getFirstTabbableElement(children[i]) :
+ null;
+ if (tabbableChild) {
+ return tabbableChild;
+ }
+ }
+ return null;
+ }
+ /** Get the last tabbable element from a DOM subtree (inclusive). */
+ _getLastTabbableElement(root) {
+ if (this._checker.isFocusable(root) && this._checker.isTabbable(root)) {
+ return root;
+ }
+ // Iterate in reverse DOM order.
+ let children = root.children || root.childNodes;
+ for (let i = children.length - 1; i >= 0; i--) {
+ let tabbableChild = children[i].nodeType === this._document.ELEMENT_NODE ?
+ this._getLastTabbableElement(children[i]) :
+ null;
+ if (tabbableChild) {
+ return tabbableChild;
+ }
+ }
+ return null;
+ }
+ /** Creates an anchor element. */
+ _createAnchor() {
+ const anchor = this._document.createElement('div');
+ this._toggleAnchorTabIndex(this._enabled, anchor);
+ anchor.classList.add('cdk-visually-hidden');
+ anchor.classList.add('cdk-focus-trap-anchor');
+ anchor.setAttribute('aria-hidden', 'true');
+ return anchor;
+ }
+ /**
+ * Toggles the `tabindex` of an anchor, based on the enabled state of the focus trap.
+ * @param isEnabled Whether the focus trap is enabled.
+ * @param anchor Anchor on which to toggle the tabindex.
+ */
+ _toggleAnchorTabIndex(isEnabled, anchor) {
+ // Remove the tabindex completely, rather than setting it to -1, because if the
+ // element has a tabindex, the user might still hit it when navigating with the arrow keys.
+ isEnabled ? anchor.setAttribute('tabindex', '0') : anchor.removeAttribute('tabindex');
+ }
+ /**
+ * Toggles the`tabindex` of both anchors to either trap Tab focus or allow it to escape.
+ * @param enabled: Whether the anchors should trap Tab.
+ */
+ toggleAnchors(enabled) {
+ if (this._startAnchor && this._endAnchor) {
+ this._toggleAnchorTabIndex(enabled, this._startAnchor);
+ this._toggleAnchorTabIndex(enabled, this._endAnchor);
+ }
+ }
+ /** Executes a function when the zone is stable. */
+ _executeOnStable(fn) {
+ if (this._ngZone.isStable) {
+ fn();
+ }
+ else {
+ this._ngZone.onStable.pipe(Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_4__["take"])(1)).subscribe(fn);
+ }
+ }
+}
+/**
+ * Factory that allows easy instantiation of focus traps.
+ * @deprecated Use `ConfigurableFocusTrapFactory` instead.
+ * @breaking-change 11.0.0
+ */
+class FocusTrapFactory {
+ constructor(_checker, _ngZone, _document) {
+ this._checker = _checker;
+ this._ngZone = _ngZone;
+ this._document = _document;
+ }
+ /**
+ * Creates a focus-trapped region around the given element.
+ * @param element The element around which focus will be trapped.
+ * @param deferCaptureElements Defers the creation of focus-capturing elements to be done
+ * manually by the user.
+ * @returns The created focus trap instance.
+ */
+ create(element, deferCaptureElements = false) {
+ return new FocusTrap(element, this._checker, this._ngZone, this._document, deferCaptureElements);
+ }
+}
+FocusTrapFactory.ɵfac = function FocusTrapFactory_Factory(t) { return new (t || FocusTrapFactory)(_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵinject"](InteractivityChecker), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵinject"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["NgZone"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵinject"](_angular_common__WEBPACK_IMPORTED_MODULE_0__["DOCUMENT"])); };
+FocusTrapFactory.ɵprov = Object(_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdefineInjectable"])({ factory: function FocusTrapFactory_Factory() { return new FocusTrapFactory(Object(_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵinject"])(InteractivityChecker), Object(_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵinject"])(_angular_core__WEBPACK_IMPORTED_MODULE_1__["NgZone"]), Object(_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵinject"])(_angular_common__WEBPACK_IMPORTED_MODULE_0__["DOCUMENT"])); }, token: FocusTrapFactory, providedIn: "root" });
+FocusTrapFactory.ctorParameters = () => [
+ { type: InteractivityChecker },
+ { type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["NgZone"] },
+ { type: undefined, decorators: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Inject"], args: [_angular_common__WEBPACK_IMPORTED_MODULE_0__["DOCUMENT"],] }] }
+];
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵsetClassMetadata"](FocusTrapFactory, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Injectable"],
+ args: [{ providedIn: 'root' }]
+ }], function () { return [{ type: InteractivityChecker }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["NgZone"] }, { type: undefined, decorators: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Inject"],
+ args: [_angular_common__WEBPACK_IMPORTED_MODULE_0__["DOCUMENT"]]
+ }] }]; }, null); })();
+/** Directive for trapping focus within a region. */
+class CdkTrapFocus {
+ constructor(_elementRef, _focusTrapFactory, _document) {
+ this._elementRef = _elementRef;
+ this._focusTrapFactory = _focusTrapFactory;
+ /** Previously focused element to restore focus to upon destroy when using autoCapture. */
+ this._previouslyFocusedElement = null;
+ this._document = _document;
+ this.focusTrap = this._focusTrapFactory.create(this._elementRef.nativeElement, true);
+ }
+ /** Whether the focus trap is active. */
+ get enabled() { return this.focusTrap.enabled; }
+ set enabled(value) { this.focusTrap.enabled = Object(_angular_cdk_coercion__WEBPACK_IMPORTED_MODULE_5__["coerceBooleanProperty"])(value); }
+ /**
+ * Whether the directive should automatically move focus into the trapped region upon
+ * initialization and return focus to the previous activeElement upon destruction.
+ */
+ get autoCapture() { return this._autoCapture; }
+ set autoCapture(value) { this._autoCapture = Object(_angular_cdk_coercion__WEBPACK_IMPORTED_MODULE_5__["coerceBooleanProperty"])(value); }
+ ngOnDestroy() {
+ this.focusTrap.destroy();
+ // If we stored a previously focused element when using autoCapture, return focus to that
+ // element now that the trapped region is being destroyed.
+ if (this._previouslyFocusedElement) {
+ this._previouslyFocusedElement.focus();
+ this._previouslyFocusedElement = null;
+ }
+ }
+ ngAfterContentInit() {
+ this.focusTrap.attachAnchors();
+ if (this.autoCapture) {
+ this._captureFocus();
+ }
+ }
+ ngDoCheck() {
+ if (!this.focusTrap.hasAttached()) {
+ this.focusTrap.attachAnchors();
+ }
+ }
+ ngOnChanges(changes) {
+ const autoCaptureChange = changes['autoCapture'];
+ if (autoCaptureChange && !autoCaptureChange.firstChange && this.autoCapture &&
+ this.focusTrap.hasAttached()) {
+ this._captureFocus();
+ }
+ }
+ _captureFocus() {
+ var _a, _b;
+ // If the `activeElement` is inside a shadow root, `document.activeElement` will
+ // point to the shadow root so we have to descend into it ourselves.
+ const activeElement = (_a = this._document) === null || _a === void 0 ? void 0 : _a.activeElement;
+ this._previouslyFocusedElement =
+ ((_b = activeElement === null || activeElement === void 0 ? void 0 : activeElement.shadowRoot) === null || _b === void 0 ? void 0 : _b.activeElement) || activeElement;
+ this.focusTrap.focusInitialElementWhenReady();
+ }
+}
+CdkTrapFocus.ɵfac = function CdkTrapFocus_Factory(t) { return new (t || CdkTrapFocus)(_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ElementRef"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](FocusTrapFactory), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](_angular_common__WEBPACK_IMPORTED_MODULE_0__["DOCUMENT"])); };
+CdkTrapFocus.ɵdir = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdefineDirective"]({ type: CdkTrapFocus, selectors: [["", "cdkTrapFocus", ""]], inputs: { enabled: ["cdkTrapFocus", "enabled"], autoCapture: ["cdkTrapFocusAutoCapture", "autoCapture"] }, exportAs: ["cdkTrapFocus"], features: [_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵNgOnChangesFeature"]] });
+CdkTrapFocus.ctorParameters = () => [
+ { type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["ElementRef"] },
+ { type: FocusTrapFactory },
+ { type: undefined, decorators: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Inject"], args: [_angular_common__WEBPACK_IMPORTED_MODULE_0__["DOCUMENT"],] }] }
+];
+CdkTrapFocus.propDecorators = {
+ enabled: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Input"], args: ['cdkTrapFocus',] }],
+ autoCapture: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Input"], args: ['cdkTrapFocusAutoCapture',] }]
+};
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵsetClassMetadata"](CdkTrapFocus, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Directive"],
+ args: [{
+ selector: '[cdkTrapFocus]',
+ exportAs: 'cdkTrapFocus'
+ }]
+ }], function () { return [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["ElementRef"] }, { type: FocusTrapFactory }, { type: undefined, decorators: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Inject"],
+ args: [_angular_common__WEBPACK_IMPORTED_MODULE_0__["DOCUMENT"]]
+ }] }]; }, { enabled: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Input"],
+ args: ['cdkTrapFocus']
+ }], autoCapture: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Input"],
+ args: ['cdkTrapFocusAutoCapture']
+ }] }); })();
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * Class that allows for trapping focus within a DOM element.
+ *
+ * This class uses a strategy pattern that determines how it traps focus.
+ * See FocusTrapInertStrategy.
+ */
+class ConfigurableFocusTrap extends FocusTrap {
+ constructor(_element, _checker, _ngZone, _document, _focusTrapManager, _inertStrategy, config) {
+ super(_element, _checker, _ngZone, _document, config.defer);
+ this._focusTrapManager = _focusTrapManager;
+ this._inertStrategy = _inertStrategy;
+ this._focusTrapManager.register(this);
+ }
+ /** Whether the FocusTrap is enabled. */
+ get enabled() { return this._enabled; }
+ set enabled(value) {
+ this._enabled = value;
+ if (this._enabled) {
+ this._focusTrapManager.register(this);
+ }
+ else {
+ this._focusTrapManager.deregister(this);
+ }
+ }
+ /** Notifies the FocusTrapManager that this FocusTrap will be destroyed. */
+ destroy() {
+ this._focusTrapManager.deregister(this);
+ super.destroy();
+ }
+ /** @docs-private Implemented as part of ManagedFocusTrap. */
+ _enable() {
+ this._inertStrategy.preventFocus(this);
+ this.toggleAnchors(true);
+ }
+ /** @docs-private Implemented as part of ManagedFocusTrap. */
+ _disable() {
+ this._inertStrategy.allowFocus(this);
+ this.toggleAnchors(false);
+ }
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/** IE 11 compatible closest implementation that is able to start from non-Element Nodes. */
+function closest(element, selector) {
+ if (!(element instanceof Node)) {
+ return null;
+ }
+ let curr = element;
+ while (curr != null && !(curr instanceof Element)) {
+ curr = curr.parentNode;
+ }
+ return curr && (hasNativeClosest ?
+ curr.closest(selector) : polyfillClosest(curr, selector));
+}
+/** Polyfill for browsers without Element.closest. */
+function polyfillClosest(element, selector) {
+ let curr = element;
+ while (curr != null && !(curr instanceof Element && matches(curr, selector))) {
+ curr = curr.parentNode;
+ }
+ return (curr || null);
+}
+const hasNativeClosest = typeof Element != 'undefined' && !!Element.prototype.closest;
+/** IE 11 compatible matches implementation. */
+function matches(element, selector) {
+ return element.matches ?
+ element.matches(selector) :
+ element['msMatchesSelector'](selector);
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * Lightweight FocusTrapInertStrategy that adds a document focus event
+ * listener to redirect focus back inside the FocusTrap.
+ */
+class EventListenerFocusTrapInertStrategy {
+ constructor() {
+ /** Focus event handler. */
+ this._listener = null;
+ }
+ /** Adds a document event listener that keeps focus inside the FocusTrap. */
+ preventFocus(focusTrap) {
+ // Ensure there's only one listener per document
+ if (this._listener) {
+ focusTrap._document.removeEventListener('focus', this._listener, true);
+ }
+ this._listener = (e) => this._trapFocus(focusTrap, e);
+ focusTrap._ngZone.runOutsideAngular(() => {
+ focusTrap._document.addEventListener('focus', this._listener, true);
+ });
+ }
+ /** Removes the event listener added in preventFocus. */
+ allowFocus(focusTrap) {
+ if (!this._listener) {
+ return;
+ }
+ focusTrap._document.removeEventListener('focus', this._listener, true);
+ this._listener = null;
+ }
+ /**
+ * Refocuses the first element in the FocusTrap if the focus event target was outside
+ * the FocusTrap.
+ *
+ * This is an event listener callback. The event listener is added in runOutsideAngular,
+ * so all this code runs outside Angular as well.
+ */
+ _trapFocus(focusTrap, event) {
+ const target = event.target;
+ const focusTrapRoot = focusTrap._element;
+ // Don't refocus if target was in an overlay, because the overlay might be associated
+ // with an element inside the FocusTrap, ex. mat-select.
+ if (!focusTrapRoot.contains(target) && closest(target, 'div.cdk-overlay-pane') === null) {
+ // Some legacy FocusTrap usages have logic that focuses some element on the page
+ // just before FocusTrap is destroyed. For backwards compatibility, wait
+ // to be sure FocusTrap is still enabled before refocusing.
+ setTimeout(() => {
+ // Check whether focus wasn't put back into the focus trap while the timeout was pending.
+ if (focusTrap.enabled && !focusTrapRoot.contains(focusTrap._document.activeElement)) {
+ focusTrap.focusFirstTabbableElement();
+ }
+ });
+ }
+ }
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * Configuration for creating a ConfigurableFocusTrap.
+ */
+class ConfigurableFocusTrapConfig {
+ constructor() {
+ /**
+ * Whether to defer the creation of FocusTrap elements to be
+ * done manually by the user. Default is to create them
+ * automatically.
+ */
+ this.defer = false;
+ }
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/** The injection token used to specify the inert strategy. */
+const FOCUS_TRAP_INERT_STRATEGY = new _angular_core__WEBPACK_IMPORTED_MODULE_1__["InjectionToken"]('FOCUS_TRAP_INERT_STRATEGY');
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/** Injectable that ensures only the most recently enabled FocusTrap is active. */
+class FocusTrapManager {
+ constructor() {
+ // A stack of the FocusTraps on the page. Only the FocusTrap at the
+ // top of the stack is active.
+ this._focusTrapStack = [];
+ }
+ /**
+ * Disables the FocusTrap at the top of the stack, and then pushes
+ * the new FocusTrap onto the stack.
+ */
+ register(focusTrap) {
+ // Dedupe focusTraps that register multiple times.
+ this._focusTrapStack = this._focusTrapStack.filter((ft) => ft !== focusTrap);
+ let stack = this._focusTrapStack;
+ if (stack.length) {
+ stack[stack.length - 1]._disable();
+ }
+ stack.push(focusTrap);
+ focusTrap._enable();
+ }
+ /**
+ * Removes the FocusTrap from the stack, and activates the
+ * FocusTrap that is the new top of the stack.
+ */
+ deregister(focusTrap) {
+ focusTrap._disable();
+ const stack = this._focusTrapStack;
+ const i = stack.indexOf(focusTrap);
+ if (i !== -1) {
+ stack.splice(i, 1);
+ if (stack.length) {
+ stack[stack.length - 1]._enable();
+ }
+ }
+ }
+}
+FocusTrapManager.ɵfac = function FocusTrapManager_Factory(t) { return new (t || FocusTrapManager)(); };
+FocusTrapManager.ɵprov = Object(_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdefineInjectable"])({ factory: function FocusTrapManager_Factory() { return new FocusTrapManager(); }, token: FocusTrapManager, providedIn: "root" });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵsetClassMetadata"](FocusTrapManager, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Injectable"],
+ args: [{ providedIn: 'root' }]
+ }], function () { return []; }, null); })();
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/** Factory that allows easy instantiation of configurable focus traps. */
+class ConfigurableFocusTrapFactory {
+ constructor(_checker, _ngZone, _focusTrapManager, _document, _inertStrategy) {
+ this._checker = _checker;
+ this._ngZone = _ngZone;
+ this._focusTrapManager = _focusTrapManager;
+ this._document = _document;
+ // TODO split up the strategies into different modules, similar to DateAdapter.
+ this._inertStrategy = _inertStrategy || new EventListenerFocusTrapInertStrategy();
+ }
+ create(element, config = new ConfigurableFocusTrapConfig()) {
+ let configObject;
+ if (typeof config === 'boolean') {
+ configObject = new ConfigurableFocusTrapConfig();
+ configObject.defer = config;
+ }
+ else {
+ configObject = config;
+ }
+ return new ConfigurableFocusTrap(element, this._checker, this._ngZone, this._document, this._focusTrapManager, this._inertStrategy, configObject);
+ }
+}
+ConfigurableFocusTrapFactory.ɵfac = function ConfigurableFocusTrapFactory_Factory(t) { return new (t || ConfigurableFocusTrapFactory)(_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵinject"](InteractivityChecker), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵinject"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["NgZone"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵinject"](FocusTrapManager), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵinject"](_angular_common__WEBPACK_IMPORTED_MODULE_0__["DOCUMENT"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵinject"](FOCUS_TRAP_INERT_STRATEGY, 8)); };
+ConfigurableFocusTrapFactory.ɵprov = Object(_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdefineInjectable"])({ factory: function ConfigurableFocusTrapFactory_Factory() { return new ConfigurableFocusTrapFactory(Object(_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵinject"])(InteractivityChecker), Object(_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵinject"])(_angular_core__WEBPACK_IMPORTED_MODULE_1__["NgZone"]), Object(_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵinject"])(FocusTrapManager), Object(_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵinject"])(_angular_common__WEBPACK_IMPORTED_MODULE_0__["DOCUMENT"]), Object(_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵinject"])(FOCUS_TRAP_INERT_STRATEGY, 8)); }, token: ConfigurableFocusTrapFactory, providedIn: "root" });
+ConfigurableFocusTrapFactory.ctorParameters = () => [
+ { type: InteractivityChecker },
+ { type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["NgZone"] },
+ { type: FocusTrapManager },
+ { type: undefined, decorators: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Inject"], args: [_angular_common__WEBPACK_IMPORTED_MODULE_0__["DOCUMENT"],] }] },
+ { type: undefined, decorators: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Optional"] }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Inject"], args: [FOCUS_TRAP_INERT_STRATEGY,] }] }
+];
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵsetClassMetadata"](ConfigurableFocusTrapFactory, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Injectable"],
+ args: [{ providedIn: 'root' }]
+ }], function () { return [{ type: InteractivityChecker }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["NgZone"] }, { type: FocusTrapManager }, { type: undefined, decorators: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Inject"],
+ args: [_angular_common__WEBPACK_IMPORTED_MODULE_0__["DOCUMENT"]]
+ }] }, { type: undefined, decorators: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Optional"]
+ }, {
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Inject"],
+ args: [FOCUS_TRAP_INERT_STRATEGY]
+ }] }]; }, null); })();
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+const LIVE_ANNOUNCER_ELEMENT_TOKEN = new _angular_core__WEBPACK_IMPORTED_MODULE_1__["InjectionToken"]('liveAnnouncerElement', {
+ providedIn: 'root',
+ factory: LIVE_ANNOUNCER_ELEMENT_TOKEN_FACTORY,
+});
+/** @docs-private */
+function LIVE_ANNOUNCER_ELEMENT_TOKEN_FACTORY() {
+ return null;
+}
+/** Injection token that can be used to configure the default options for the LiveAnnouncer. */
+const LIVE_ANNOUNCER_DEFAULT_OPTIONS = new _angular_core__WEBPACK_IMPORTED_MODULE_1__["InjectionToken"]('LIVE_ANNOUNCER_DEFAULT_OPTIONS');
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+class LiveAnnouncer {
+ constructor(elementToken, _ngZone, _document, _defaultOptions) {
+ this._ngZone = _ngZone;
+ this._defaultOptions = _defaultOptions;
+ // We inject the live element and document as `any` because the constructor signature cannot
+ // reference browser globals (HTMLElement, Document) on non-browser environments, since having
+ // a class decorator causes TypeScript to preserve the constructor signature types.
+ this._document = _document;
+ this._liveElement = elementToken || this._createLiveElement();
+ }
+ announce(message, ...args) {
+ const defaultOptions = this._defaultOptions;
+ let politeness;
+ let duration;
+ if (args.length === 1 && typeof args[0] === 'number') {
+ duration = args[0];
+ }
+ else {
+ [politeness, duration] = args;
+ }
+ this.clear();
+ clearTimeout(this._previousTimeout);
+ if (!politeness) {
+ politeness =
+ (defaultOptions && defaultOptions.politeness) ? defaultOptions.politeness : 'polite';
+ }
+ if (duration == null && defaultOptions) {
+ duration = defaultOptions.duration;
+ }
+ // TODO: ensure changing the politeness works on all environments we support.
+ this._liveElement.setAttribute('aria-live', politeness);
+ // This 100ms timeout is necessary for some browser + screen-reader combinations:
+ // - Both JAWS and NVDA over IE11 will not announce anything without a non-zero timeout.
+ // - With Chrome and IE11 with NVDA or JAWS, a repeated (identical) message won't be read a
+ // second time without clearing and then using a non-zero delay.
+ // (using JAWS 17 at time of this writing).
+ return this._ngZone.runOutsideAngular(() => {
+ return new Promise(resolve => {
+ clearTimeout(this._previousTimeout);
+ this._previousTimeout = setTimeout(() => {
+ this._liveElement.textContent = message;
+ resolve();
+ if (typeof duration === 'number') {
+ this._previousTimeout = setTimeout(() => this.clear(), duration);
+ }
+ }, 100);
+ });
+ });
+ }
+ /**
+ * Clears the current text from the announcer element. Can be used to prevent
+ * screen readers from reading the text out again while the user is going
+ * through the page landmarks.
+ */
+ clear() {
+ if (this._liveElement) {
+ this._liveElement.textContent = '';
+ }
+ }
+ ngOnDestroy() {
+ clearTimeout(this._previousTimeout);
+ if (this._liveElement && this._liveElement.parentNode) {
+ this._liveElement.parentNode.removeChild(this._liveElement);
+ this._liveElement = null;
+ }
+ }
+ _createLiveElement() {
+ const elementClass = 'cdk-live-announcer-element';
+ const previousElements = this._document.getElementsByClassName(elementClass);
+ const liveEl = this._document.createElement('div');
+ // Remove any old containers. This can happen when coming in from a server-side-rendered page.
+ for (let i = 0; i < previousElements.length; i++) {
+ previousElements[i].parentNode.removeChild(previousElements[i]);
+ }
+ liveEl.classList.add(elementClass);
+ liveEl.classList.add('cdk-visually-hidden');
+ liveEl.setAttribute('aria-atomic', 'true');
+ liveEl.setAttribute('aria-live', 'polite');
+ this._document.body.appendChild(liveEl);
+ return liveEl;
+ }
+}
+LiveAnnouncer.ɵfac = function LiveAnnouncer_Factory(t) { return new (t || LiveAnnouncer)(_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵinject"](LIVE_ANNOUNCER_ELEMENT_TOKEN, 8), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵinject"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["NgZone"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵinject"](_angular_common__WEBPACK_IMPORTED_MODULE_0__["DOCUMENT"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵinject"](LIVE_ANNOUNCER_DEFAULT_OPTIONS, 8)); };
+LiveAnnouncer.ɵprov = Object(_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdefineInjectable"])({ factory: function LiveAnnouncer_Factory() { return new LiveAnnouncer(Object(_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵinject"])(LIVE_ANNOUNCER_ELEMENT_TOKEN, 8), Object(_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵinject"])(_angular_core__WEBPACK_IMPORTED_MODULE_1__["NgZone"]), Object(_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵinject"])(_angular_common__WEBPACK_IMPORTED_MODULE_0__["DOCUMENT"]), Object(_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵinject"])(LIVE_ANNOUNCER_DEFAULT_OPTIONS, 8)); }, token: LiveAnnouncer, providedIn: "root" });
+LiveAnnouncer.ctorParameters = () => [
+ { type: undefined, decorators: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Optional"] }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Inject"], args: [LIVE_ANNOUNCER_ELEMENT_TOKEN,] }] },
+ { type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["NgZone"] },
+ { type: undefined, decorators: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Inject"], args: [_angular_common__WEBPACK_IMPORTED_MODULE_0__["DOCUMENT"],] }] },
+ { type: undefined, decorators: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Optional"] }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Inject"], args: [LIVE_ANNOUNCER_DEFAULT_OPTIONS,] }] }
+];
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵsetClassMetadata"](LiveAnnouncer, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Injectable"],
+ args: [{ providedIn: 'root' }]
+ }], function () { return [{ type: undefined, decorators: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Optional"]
+ }, {
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Inject"],
+ args: [LIVE_ANNOUNCER_ELEMENT_TOKEN]
+ }] }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["NgZone"] }, { type: undefined, decorators: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Inject"],
+ args: [_angular_common__WEBPACK_IMPORTED_MODULE_0__["DOCUMENT"]]
+ }] }, { type: undefined, decorators: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Optional"]
+ }, {
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Inject"],
+ args: [LIVE_ANNOUNCER_DEFAULT_OPTIONS]
+ }] }]; }, null); })();
+/**
+ * A directive that works similarly to aria-live, but uses the LiveAnnouncer to ensure compatibility
+ * with a wider range of browsers and screen readers.
+ */
+class CdkAriaLive {
+ constructor(_elementRef, _liveAnnouncer, _contentObserver, _ngZone) {
+ this._elementRef = _elementRef;
+ this._liveAnnouncer = _liveAnnouncer;
+ this._contentObserver = _contentObserver;
+ this._ngZone = _ngZone;
+ this._politeness = 'polite';
+ }
+ /** The aria-live politeness level to use when announcing messages. */
+ get politeness() { return this._politeness; }
+ set politeness(value) {
+ this._politeness = value === 'off' || value === 'assertive' ? value : 'polite';
+ if (this._politeness === 'off') {
+ if (this._subscription) {
+ this._subscription.unsubscribe();
+ this._subscription = null;
+ }
+ }
+ else if (!this._subscription) {
+ this._subscription = this._ngZone.runOutsideAngular(() => {
+ return this._contentObserver
+ .observe(this._elementRef)
+ .subscribe(() => {
+ // Note that we use textContent here, rather than innerText, in order to avoid a reflow.
+ const elementText = this._elementRef.nativeElement.textContent;
+ // The `MutationObserver` fires also for attribute
+ // changes which we don't want to announce.
+ if (elementText !== this._previousAnnouncedText) {
+ this._liveAnnouncer.announce(elementText, this._politeness);
+ this._previousAnnouncedText = elementText;
+ }
+ });
+ });
+ }
+ }
+ ngOnDestroy() {
+ if (this._subscription) {
+ this._subscription.unsubscribe();
+ }
+ }
+}
+CdkAriaLive.ɵfac = function CdkAriaLive_Factory(t) { return new (t || CdkAriaLive)(_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ElementRef"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](LiveAnnouncer), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](_angular_cdk_observers__WEBPACK_IMPORTED_MODULE_7__["ContentObserver"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["NgZone"])); };
+CdkAriaLive.ɵdir = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdefineDirective"]({ type: CdkAriaLive, selectors: [["", "cdkAriaLive", ""]], inputs: { politeness: ["cdkAriaLive", "politeness"] }, exportAs: ["cdkAriaLive"] });
+CdkAriaLive.ctorParameters = () => [
+ { type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["ElementRef"] },
+ { type: LiveAnnouncer },
+ { type: _angular_cdk_observers__WEBPACK_IMPORTED_MODULE_7__["ContentObserver"] },
+ { type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["NgZone"] }
+];
+CdkAriaLive.propDecorators = {
+ politeness: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Input"], args: ['cdkAriaLive',] }]
+};
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵsetClassMetadata"](CdkAriaLive, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Directive"],
+ args: [{
+ selector: '[cdkAriaLive]',
+ exportAs: 'cdkAriaLive'
+ }]
+ }], function () { return [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["ElementRef"] }, { type: LiveAnnouncer }, { type: _angular_cdk_observers__WEBPACK_IMPORTED_MODULE_7__["ContentObserver"] }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["NgZone"] }]; }, { politeness: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Input"],
+ args: ['cdkAriaLive']
+ }] }); })();
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/** Gets whether an event could be a faked `mousedown` event dispatched by a screen reader. */
+function isFakeMousedownFromScreenReader(event) {
+ // We can typically distinguish between these faked mousedown events and real mousedown events
+ // using the "buttons" property. While real mousedowns will indicate the mouse button that was
+ // pressed (e.g. "1" for the left mouse button), faked mousedowns will usually set the property
+ // value to 0.
+ return event.buttons === 0;
+}
+/** Gets whether an event could be a faked `touchstart` event dispatched by a screen reader. */
+function isFakeTouchstartFromScreenReader(event) {
+ const touch = (event.touches && event.touches[0]) ||
+ (event.changedTouches && event.changedTouches[0]);
+ // A fake `touchstart` can be distinguished from a real one by looking at the `identifier`
+ // which is typically >= 0 on a real device versus -1 from a screen reader. Just to be safe,
+ // we can also look at `radiusX` and `radiusY`. This behavior was observed against a Windows 10
+ // device with a touch screen running NVDA v2020.4 and Firefox 85 or Chrome 88.
+ return !!touch && touch.identifier === -1 && (touch.radiusX == null || touch.radiusX === 1) &&
+ (touch.radiusY == null || touch.radiusY === 1);
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+// This is the value used by AngularJS Material. Through trial and error (on iPhone 6S) they found
+// that a value of around 650ms seems appropriate.
+const TOUCH_BUFFER_MS = 650;
+/** InjectionToken for FocusMonitorOptions. */
+const FOCUS_MONITOR_DEFAULT_OPTIONS = new _angular_core__WEBPACK_IMPORTED_MODULE_1__["InjectionToken"]('cdk-focus-monitor-default-options');
+/**
+ * Event listener options that enable capturing and also
+ * mark the listener as passive if the browser supports it.
+ */
+const captureEventListenerOptions = Object(_angular_cdk_platform__WEBPACK_IMPORTED_MODULE_6__["normalizePassiveListenerOptions"])({
+ passive: true,
+ capture: true
+});
+/** Monitors mouse and keyboard events to determine the cause of focus events. */
+class FocusMonitor {
+ constructor(_ngZone, _platform,
+ /** @breaking-change 11.0.0 make document required */
+ document, options) {
+ this._ngZone = _ngZone;
+ this._platform = _platform;
+ /** The focus origin that the next focus event is a result of. */
+ this._origin = null;
+ /** Whether the window has just been focused. */
+ this._windowFocused = false;
+ /** Map of elements being monitored to their info. */
+ this._elementInfo = new Map();
+ /** The number of elements currently being monitored. */
+ this._monitoredElementCount = 0;
+ /**
+ * Keeps track of the root nodes to which we've currently bound a focus/blur handler,
+ * as well as the number of monitored elements that they contain. We have to treat focus/blur
+ * handlers differently from the rest of the events, because the browser won't emit events
+ * to the document when focus moves inside of a shadow root.
+ */
+ this._rootNodeFocusListenerCount = new Map();
+ /**
+ * Event listener for `keydown` events on the document.
+ * Needs to be an arrow function in order to preserve the context when it gets bound.
+ */
+ this._documentKeydownListener = () => {
+ // On keydown record the origin and clear any touch event that may be in progress.
+ this._lastTouchTarget = null;
+ this._setOriginForCurrentEventQueue('keyboard');
+ };
+ /**
+ * Event listener for `mousedown` events on the document.
+ * Needs to be an arrow function in order to preserve the context when it gets bound.
+ */
+ this._documentMousedownListener = (event) => {
+ // On mousedown record the origin only if there is not touch
+ // target, since a mousedown can happen as a result of a touch event.
+ if (!this._lastTouchTarget) {
+ // In some cases screen readers fire fake `mousedown` events instead of `keydown`.
+ // Resolve the focus source to `keyboard` if we detect one of them.
+ const source = isFakeMousedownFromScreenReader(event) ? 'keyboard' : 'mouse';
+ this._setOriginForCurrentEventQueue(source);
+ }
+ };
+ /**
+ * Event listener for `touchstart` events on the document.
+ * Needs to be an arrow function in order to preserve the context when it gets bound.
+ */
+ this._documentTouchstartListener = (event) => {
+ // Some screen readers will fire a fake `touchstart` event if an element is activated using
+ // the keyboard while on a device with a touchsreen. Consider such events as keyboard focus.
+ if (!isFakeTouchstartFromScreenReader(event)) {
+ // When the touchstart event fires the focus event is not yet in the event queue. This means
+ // we can't rely on the trick used above (setting timeout of 1ms). Instead we wait 650ms to
+ // see if a focus happens.
+ if (this._touchTimeoutId != null) {
+ clearTimeout(this._touchTimeoutId);
+ }
+ this._lastTouchTarget = getTarget(event);
+ this._touchTimeoutId = setTimeout(() => this._lastTouchTarget = null, TOUCH_BUFFER_MS);
+ }
+ else if (!this._lastTouchTarget) {
+ this._setOriginForCurrentEventQueue('keyboard');
+ }
+ };
+ /**
+ * Event listener for `focus` events on the window.
+ * Needs to be an arrow function in order to preserve the context when it gets bound.
+ */
+ this._windowFocusListener = () => {
+ // Make a note of when the window regains focus, so we can
+ // restore the origin info for the focused element.
+ this._windowFocused = true;
+ this._windowFocusTimeoutId = setTimeout(() => this._windowFocused = false);
+ };
+ /**
+ * Event listener for `focus` and 'blur' events on the document.
+ * Needs to be an arrow function in order to preserve the context when it gets bound.
+ */
+ this._rootNodeFocusAndBlurListener = (event) => {
+ const target = getTarget(event);
+ const handler = event.type === 'focus' ? this._onFocus : this._onBlur;
+ // We need to walk up the ancestor chain in order to support `checkChildren`.
+ for (let element = target; element; element = element.parentElement) {
+ handler.call(this, event, element);
+ }
+ };
+ this._document = document;
+ this._detectionMode = (options === null || options === void 0 ? void 0 : options.detectionMode) || 0 /* IMMEDIATE */;
+ }
+ monitor(element, checkChildren = false) {
+ const nativeElement = Object(_angular_cdk_coercion__WEBPACK_IMPORTED_MODULE_5__["coerceElement"])(element);
+ // Do nothing if we're not on the browser platform or the passed in node isn't an element.
+ if (!this._platform.isBrowser || nativeElement.nodeType !== 1) {
+ return Object(rxjs__WEBPACK_IMPORTED_MODULE_2__["of"])(null);
+ }
+ // If the element is inside the shadow DOM, we need to bind our focus/blur listeners to
+ // the shadow root, rather than the `document`, because the browser won't emit focus events
+ // to the `document`, if focus is moving within the same shadow root.
+ const rootNode = Object(_angular_cdk_platform__WEBPACK_IMPORTED_MODULE_6__["_getShadowRoot"])(nativeElement) || this._getDocument();
+ const cachedInfo = this._elementInfo.get(nativeElement);
+ // Check if we're already monitoring this element.
+ if (cachedInfo) {
+ if (checkChildren) {
+ // TODO(COMP-318): this can be problematic, because it'll turn all non-checkChildren
+ // observers into ones that behave as if `checkChildren` was turned on. We need a more
+ // robust solution.
+ cachedInfo.checkChildren = true;
+ }
+ return cachedInfo.subject;
+ }
+ // Create monitored element info.
+ const info = {
+ checkChildren: checkChildren,
+ subject: new rxjs__WEBPACK_IMPORTED_MODULE_2__["Subject"](),
+ rootNode
+ };
+ this._elementInfo.set(nativeElement, info);
+ this._registerGlobalListeners(info);
+ return info.subject;
+ }
+ stopMonitoring(element) {
+ const nativeElement = Object(_angular_cdk_coercion__WEBPACK_IMPORTED_MODULE_5__["coerceElement"])(element);
+ const elementInfo = this._elementInfo.get(nativeElement);
+ if (elementInfo) {
+ elementInfo.subject.complete();
+ this._setClasses(nativeElement);
+ this._elementInfo.delete(nativeElement);
+ this._removeGlobalListeners(elementInfo);
+ }
+ }
+ focusVia(element, origin, options) {
+ const nativeElement = Object(_angular_cdk_coercion__WEBPACK_IMPORTED_MODULE_5__["coerceElement"])(element);
+ const focusedElement = this._getDocument().activeElement;
+ // If the element is focused already, calling `focus` again won't trigger the event listener
+ // which means that the focus classes won't be updated. If that's the case, update the classes
+ // directly without waiting for an event.
+ if (nativeElement === focusedElement) {
+ this._getClosestElementsInfo(nativeElement)
+ .forEach(([currentElement, info]) => this._originChanged(currentElement, origin, info));
+ }
+ else {
+ this._setOriginForCurrentEventQueue(origin);
+ // `focus` isn't available on the server
+ if (typeof nativeElement.focus === 'function') {
+ nativeElement.focus(options);
+ }
+ }
+ }
+ ngOnDestroy() {
+ this._elementInfo.forEach((_info, element) => this.stopMonitoring(element));
+ }
+ /** Access injected document if available or fallback to global document reference */
+ _getDocument() {
+ return this._document || document;
+ }
+ /** Use defaultView of injected document if available or fallback to global window reference */
+ _getWindow() {
+ const doc = this._getDocument();
+ return doc.defaultView || window;
+ }
+ _toggleClass(element, className, shouldSet) {
+ if (shouldSet) {
+ element.classList.add(className);
+ }
+ else {
+ element.classList.remove(className);
+ }
+ }
+ _getFocusOrigin(event) {
+ // If we couldn't detect a cause for the focus event, it's due to one of three reasons:
+ // 1) The window has just regained focus, in which case we want to restore the focused state of
+ // the element from before the window blurred.
+ // 2) It was caused by a touch event, in which case we mark the origin as 'touch'.
+ // 3) The element was programmatically focused, in which case we should mark the origin as
+ // 'program'.
+ if (this._origin) {
+ return this._origin;
+ }
+ if (this._windowFocused && this._lastFocusOrigin) {
+ return this._lastFocusOrigin;
+ }
+ else if (this._wasCausedByTouch(event)) {
+ return 'touch';
+ }
+ else {
+ return 'program';
+ }
+ }
+ /**
+ * Sets the focus classes on the element based on the given focus origin.
+ * @param element The element to update the classes on.
+ * @param origin The focus origin.
+ */
+ _setClasses(element, origin) {
+ this._toggleClass(element, 'cdk-focused', !!origin);
+ this._toggleClass(element, 'cdk-touch-focused', origin === 'touch');
+ this._toggleClass(element, 'cdk-keyboard-focused', origin === 'keyboard');
+ this._toggleClass(element, 'cdk-mouse-focused', origin === 'mouse');
+ this._toggleClass(element, 'cdk-program-focused', origin === 'program');
+ }
+ /**
+ * Sets the origin and schedules an async function to clear it at the end of the event queue.
+ * If the detection mode is 'eventual', the origin is never cleared.
+ * @param origin The origin to set.
+ */
+ _setOriginForCurrentEventQueue(origin) {
+ this._ngZone.runOutsideAngular(() => {
+ this._origin = origin;
+ if (this._detectionMode === 0 /* IMMEDIATE */) {
+ // Sometimes the focus origin won't be valid in Firefox because Firefox seems to focus *one*
+ // tick after the interaction event fired. To ensure the focus origin is always correct,
+ // the focus origin will be determined at the beginning of the next tick.
+ this._originTimeoutId = setTimeout(() => this._origin = null, 1);
+ }
+ });
+ }
+ /**
+ * Checks whether the given focus event was caused by a touchstart event.
+ * @param event The focus event to check.
+ * @returns Whether the event was caused by a touch.
+ */
+ _wasCausedByTouch(event) {
+ // Note(mmalerba): This implementation is not quite perfect, there is a small edge case.
+ // Consider the following dom structure:
+ //
+ //
+ //
+ // If the user touches the #child element and the #parent is programmatically focused as a
+ // result, this code will still consider it to have been caused by the touch event and will
+ // apply the cdk-touch-focused class rather than the cdk-program-focused class. This is a
+ // relatively small edge-case that can be worked around by using
+ // focusVia(parentEl, 'program') to focus the parent element.
+ //
+ // If we decide that we absolutely must handle this case correctly, we can do so by listening
+ // for the first focus event after the touchstart, and then the first blur event after that
+ // focus event. When that blur event fires we know that whatever follows is not a result of the
+ // touchstart.
+ const focusTarget = getTarget(event);
+ return this._lastTouchTarget instanceof Node && focusTarget instanceof Node &&
+ (focusTarget === this._lastTouchTarget || focusTarget.contains(this._lastTouchTarget));
+ }
+ /**
+ * Handles focus events on a registered element.
+ * @param event The focus event.
+ * @param element The monitored element.
+ */
+ _onFocus(event, element) {
+ // NOTE(mmalerba): We currently set the classes based on the focus origin of the most recent
+ // focus event affecting the monitored element. If we want to use the origin of the first event
+ // instead we should check for the cdk-focused class here and return if the element already has
+ // it. (This only matters for elements that have includesChildren = true).
+ // If we are not counting child-element-focus as focused, make sure that the event target is the
+ // monitored element itself.
+ const elementInfo = this._elementInfo.get(element);
+ if (!elementInfo || (!elementInfo.checkChildren && element !== getTarget(event))) {
+ return;
+ }
+ this._originChanged(element, this._getFocusOrigin(event), elementInfo);
+ }
+ /**
+ * Handles blur events on a registered element.
+ * @param event The blur event.
+ * @param element The monitored element.
+ */
+ _onBlur(event, element) {
+ // If we are counting child-element-focus as focused, make sure that we aren't just blurring in
+ // order to focus another child of the monitored element.
+ const elementInfo = this._elementInfo.get(element);
+ if (!elementInfo || (elementInfo.checkChildren && event.relatedTarget instanceof Node &&
+ element.contains(event.relatedTarget))) {
+ return;
+ }
+ this._setClasses(element);
+ this._emitOrigin(elementInfo.subject, null);
+ }
+ _emitOrigin(subject, origin) {
+ this._ngZone.run(() => subject.next(origin));
+ }
+ _registerGlobalListeners(elementInfo) {
+ if (!this._platform.isBrowser) {
+ return;
+ }
+ const rootNode = elementInfo.rootNode;
+ const rootNodeFocusListeners = this._rootNodeFocusListenerCount.get(rootNode) || 0;
+ if (!rootNodeFocusListeners) {
+ this._ngZone.runOutsideAngular(() => {
+ rootNode.addEventListener('focus', this._rootNodeFocusAndBlurListener, captureEventListenerOptions);
+ rootNode.addEventListener('blur', this._rootNodeFocusAndBlurListener, captureEventListenerOptions);
+ });
+ }
+ this._rootNodeFocusListenerCount.set(rootNode, rootNodeFocusListeners + 1);
+ // Register global listeners when first element is monitored.
+ if (++this._monitoredElementCount === 1) {
+ // Note: we listen to events in the capture phase so we
+ // can detect them even if the user stops propagation.
+ this._ngZone.runOutsideAngular(() => {
+ const document = this._getDocument();
+ const window = this._getWindow();
+ document.addEventListener('keydown', this._documentKeydownListener, captureEventListenerOptions);
+ document.addEventListener('mousedown', this._documentMousedownListener, captureEventListenerOptions);
+ document.addEventListener('touchstart', this._documentTouchstartListener, captureEventListenerOptions);
+ window.addEventListener('focus', this._windowFocusListener);
+ });
+ }
+ }
+ _removeGlobalListeners(elementInfo) {
+ const rootNode = elementInfo.rootNode;
+ if (this._rootNodeFocusListenerCount.has(rootNode)) {
+ const rootNodeFocusListeners = this._rootNodeFocusListenerCount.get(rootNode);
+ if (rootNodeFocusListeners > 1) {
+ this._rootNodeFocusListenerCount.set(rootNode, rootNodeFocusListeners - 1);
+ }
+ else {
+ rootNode.removeEventListener('focus', this._rootNodeFocusAndBlurListener, captureEventListenerOptions);
+ rootNode.removeEventListener('blur', this._rootNodeFocusAndBlurListener, captureEventListenerOptions);
+ this._rootNodeFocusListenerCount.delete(rootNode);
+ }
+ }
+ // Unregister global listeners when last element is unmonitored.
+ if (!--this._monitoredElementCount) {
+ const document = this._getDocument();
+ const window = this._getWindow();
+ document.removeEventListener('keydown', this._documentKeydownListener, captureEventListenerOptions);
+ document.removeEventListener('mousedown', this._documentMousedownListener, captureEventListenerOptions);
+ document.removeEventListener('touchstart', this._documentTouchstartListener, captureEventListenerOptions);
+ window.removeEventListener('focus', this._windowFocusListener);
+ // Clear timeouts for all potentially pending timeouts to prevent the leaks.
+ clearTimeout(this._windowFocusTimeoutId);
+ clearTimeout(this._touchTimeoutId);
+ clearTimeout(this._originTimeoutId);
+ }
+ }
+ /** Updates all the state on an element once its focus origin has changed. */
+ _originChanged(element, origin, elementInfo) {
+ this._setClasses(element, origin);
+ this._emitOrigin(elementInfo.subject, origin);
+ this._lastFocusOrigin = origin;
+ }
+ /**
+ * Collects the `MonitoredElementInfo` of a particular element and
+ * all of its ancestors that have enabled `checkChildren`.
+ * @param element Element from which to start the search.
+ */
+ _getClosestElementsInfo(element) {
+ const results = [];
+ this._elementInfo.forEach((info, currentElement) => {
+ if (currentElement === element || (info.checkChildren && currentElement.contains(element))) {
+ results.push([currentElement, info]);
+ }
+ });
+ return results;
+ }
+}
+FocusMonitor.ɵfac = function FocusMonitor_Factory(t) { return new (t || FocusMonitor)(_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵinject"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["NgZone"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵinject"](_angular_cdk_platform__WEBPACK_IMPORTED_MODULE_6__["Platform"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵinject"](_angular_common__WEBPACK_IMPORTED_MODULE_0__["DOCUMENT"], 8), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵinject"](FOCUS_MONITOR_DEFAULT_OPTIONS, 8)); };
+FocusMonitor.ɵprov = Object(_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdefineInjectable"])({ factory: function FocusMonitor_Factory() { return new FocusMonitor(Object(_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵinject"])(_angular_core__WEBPACK_IMPORTED_MODULE_1__["NgZone"]), Object(_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵinject"])(_angular_cdk_platform__WEBPACK_IMPORTED_MODULE_6__["Platform"]), Object(_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵinject"])(_angular_common__WEBPACK_IMPORTED_MODULE_0__["DOCUMENT"], 8), Object(_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵinject"])(FOCUS_MONITOR_DEFAULT_OPTIONS, 8)); }, token: FocusMonitor, providedIn: "root" });
+FocusMonitor.ctorParameters = () => [
+ { type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["NgZone"] },
+ { type: _angular_cdk_platform__WEBPACK_IMPORTED_MODULE_6__["Platform"] },
+ { type: undefined, decorators: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Optional"] }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Inject"], args: [_angular_common__WEBPACK_IMPORTED_MODULE_0__["DOCUMENT"],] }] },
+ { type: undefined, decorators: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Optional"] }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Inject"], args: [FOCUS_MONITOR_DEFAULT_OPTIONS,] }] }
+];
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵsetClassMetadata"](FocusMonitor, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Injectable"],
+ args: [{ providedIn: 'root' }]
+ }], function () { return [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["NgZone"] }, { type: _angular_cdk_platform__WEBPACK_IMPORTED_MODULE_6__["Platform"] }, { type: undefined, decorators: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Optional"]
+ }, {
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Inject"],
+ args: [_angular_common__WEBPACK_IMPORTED_MODULE_0__["DOCUMENT"]]
+ }] }, { type: undefined, decorators: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Optional"]
+ }, {
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Inject"],
+ args: [FOCUS_MONITOR_DEFAULT_OPTIONS]
+ }] }]; }, null); })();
+/** Gets the target of an event, accounting for Shadow DOM. */
+function getTarget(event) {
+ // If an event is bound outside the Shadow DOM, the `event.target` will
+ // point to the shadow root so we have to use `composedPath` instead.
+ return (event.composedPath ? event.composedPath()[0] : event.target);
+}
+/**
+ * Directive that determines how a particular element was focused (via keyboard, mouse, touch, or
+ * programmatically) and adds corresponding classes to the element.
+ *
+ * There are two variants of this directive:
+ * 1) cdkMonitorElementFocus: does not consider an element to be focused if one of its children is
+ * focused.
+ * 2) cdkMonitorSubtreeFocus: considers an element focused if it or any of its children are focused.
+ */
+class CdkMonitorFocus {
+ constructor(_elementRef, _focusMonitor) {
+ this._elementRef = _elementRef;
+ this._focusMonitor = _focusMonitor;
+ this.cdkFocusChange = new _angular_core__WEBPACK_IMPORTED_MODULE_1__["EventEmitter"]();
+ }
+ ngAfterViewInit() {
+ const element = this._elementRef.nativeElement;
+ this._monitorSubscription = this._focusMonitor.monitor(element, element.nodeType === 1 && element.hasAttribute('cdkMonitorSubtreeFocus'))
+ .subscribe(origin => this.cdkFocusChange.emit(origin));
+ }
+ ngOnDestroy() {
+ this._focusMonitor.stopMonitoring(this._elementRef);
+ if (this._monitorSubscription) {
+ this._monitorSubscription.unsubscribe();
+ }
+ }
+}
+CdkMonitorFocus.ɵfac = function CdkMonitorFocus_Factory(t) { return new (t || CdkMonitorFocus)(_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ElementRef"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](FocusMonitor)); };
+CdkMonitorFocus.ɵdir = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdefineDirective"]({ type: CdkMonitorFocus, selectors: [["", "cdkMonitorElementFocus", ""], ["", "cdkMonitorSubtreeFocus", ""]], outputs: { cdkFocusChange: "cdkFocusChange" } });
+CdkMonitorFocus.ctorParameters = () => [
+ { type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["ElementRef"] },
+ { type: FocusMonitor }
+];
+CdkMonitorFocus.propDecorators = {
+ cdkFocusChange: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Output"] }]
+};
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵsetClassMetadata"](CdkMonitorFocus, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Directive"],
+ args: [{
+ selector: '[cdkMonitorElementFocus], [cdkMonitorSubtreeFocus]'
+ }]
+ }], function () { return [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["ElementRef"] }, { type: FocusMonitor }]; }, { cdkFocusChange: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Output"]
+ }] }); })();
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/** CSS class applied to the document body when in black-on-white high-contrast mode. */
+const BLACK_ON_WHITE_CSS_CLASS = 'cdk-high-contrast-black-on-white';
+/** CSS class applied to the document body when in white-on-black high-contrast mode. */
+const WHITE_ON_BLACK_CSS_CLASS = 'cdk-high-contrast-white-on-black';
+/** CSS class applied to the document body when in high-contrast mode. */
+const HIGH_CONTRAST_MODE_ACTIVE_CSS_CLASS = 'cdk-high-contrast-active';
+/**
+ * Service to determine whether the browser is currently in a high-contrast-mode environment.
+ *
+ * Microsoft Windows supports an accessibility feature called "High Contrast Mode". This mode
+ * changes the appearance of all applications, including web applications, to dramatically increase
+ * contrast.
+ *
+ * IE, Edge, and Firefox currently support this mode. Chrome does not support Windows High Contrast
+ * Mode. This service does not detect high-contrast mode as added by the Chrome "High Contrast"
+ * browser extension.
+ */
+class HighContrastModeDetector {
+ constructor(_platform, document) {
+ this._platform = _platform;
+ this._document = document;
+ }
+ /** Gets the current high-contrast-mode for the page. */
+ getHighContrastMode() {
+ if (!this._platform.isBrowser) {
+ return 0 /* NONE */;
+ }
+ // Create a test element with an arbitrary background-color that is neither black nor
+ // white; high-contrast mode will coerce the color to either black or white. Also ensure that
+ // appending the test element to the DOM does not affect layout by absolutely positioning it
+ const testElement = this._document.createElement('div');
+ testElement.style.backgroundColor = 'rgb(1,2,3)';
+ testElement.style.position = 'absolute';
+ this._document.body.appendChild(testElement);
+ // Get the computed style for the background color, collapsing spaces to normalize between
+ // browsers. Once we get this color, we no longer need the test element. Access the `window`
+ // via the document so we can fake it in tests. Note that we have extra null checks, because
+ // this logic will likely run during app bootstrap and throwing can break the entire app.
+ const documentWindow = this._document.defaultView || window;
+ const computedStyle = (documentWindow && documentWindow.getComputedStyle) ?
+ documentWindow.getComputedStyle(testElement) : null;
+ const computedColor = (computedStyle && computedStyle.backgroundColor || '').replace(/ /g, '');
+ this._document.body.removeChild(testElement);
+ switch (computedColor) {
+ case 'rgb(0,0,0)': return 2 /* WHITE_ON_BLACK */;
+ case 'rgb(255,255,255)': return 1 /* BLACK_ON_WHITE */;
+ }
+ return 0 /* NONE */;
+ }
+ /** Applies CSS classes indicating high-contrast mode to document body (browser-only). */
+ _applyBodyHighContrastModeCssClasses() {
+ if (this._platform.isBrowser && this._document.body) {
+ const bodyClasses = this._document.body.classList;
+ // IE11 doesn't support `classList` operations with multiple arguments
+ bodyClasses.remove(HIGH_CONTRAST_MODE_ACTIVE_CSS_CLASS);
+ bodyClasses.remove(BLACK_ON_WHITE_CSS_CLASS);
+ bodyClasses.remove(WHITE_ON_BLACK_CSS_CLASS);
+ const mode = this.getHighContrastMode();
+ if (mode === 1 /* BLACK_ON_WHITE */) {
+ bodyClasses.add(HIGH_CONTRAST_MODE_ACTIVE_CSS_CLASS);
+ bodyClasses.add(BLACK_ON_WHITE_CSS_CLASS);
+ }
+ else if (mode === 2 /* WHITE_ON_BLACK */) {
+ bodyClasses.add(HIGH_CONTRAST_MODE_ACTIVE_CSS_CLASS);
+ bodyClasses.add(WHITE_ON_BLACK_CSS_CLASS);
+ }
+ }
+ }
+}
+HighContrastModeDetector.ɵfac = function HighContrastModeDetector_Factory(t) { return new (t || HighContrastModeDetector)(_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵinject"](_angular_cdk_platform__WEBPACK_IMPORTED_MODULE_6__["Platform"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵinject"](_angular_common__WEBPACK_IMPORTED_MODULE_0__["DOCUMENT"])); };
+HighContrastModeDetector.ɵprov = Object(_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdefineInjectable"])({ factory: function HighContrastModeDetector_Factory() { return new HighContrastModeDetector(Object(_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵinject"])(_angular_cdk_platform__WEBPACK_IMPORTED_MODULE_6__["Platform"]), Object(_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵinject"])(_angular_common__WEBPACK_IMPORTED_MODULE_0__["DOCUMENT"])); }, token: HighContrastModeDetector, providedIn: "root" });
+HighContrastModeDetector.ctorParameters = () => [
+ { type: _angular_cdk_platform__WEBPACK_IMPORTED_MODULE_6__["Platform"] },
+ { type: undefined, decorators: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Inject"], args: [_angular_common__WEBPACK_IMPORTED_MODULE_0__["DOCUMENT"],] }] }
+];
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵsetClassMetadata"](HighContrastModeDetector, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Injectable"],
+ args: [{ providedIn: 'root' }]
+ }], function () { return [{ type: _angular_cdk_platform__WEBPACK_IMPORTED_MODULE_6__["Platform"] }, { type: undefined, decorators: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Inject"],
+ args: [_angular_common__WEBPACK_IMPORTED_MODULE_0__["DOCUMENT"]]
+ }] }]; }, null); })();
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+class A11yModule {
+ constructor(highContrastModeDetector) {
+ highContrastModeDetector._applyBodyHighContrastModeCssClasses();
+ }
+}
+A11yModule.ɵfac = function A11yModule_Factory(t) { return new (t || A11yModule)(_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵinject"](HighContrastModeDetector)); };
+A11yModule.ɵmod = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdefineNgModule"]({ type: A11yModule });
+A11yModule.ɵinj = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdefineInjector"]({ imports: [[_angular_cdk_platform__WEBPACK_IMPORTED_MODULE_6__["PlatformModule"], _angular_cdk_observers__WEBPACK_IMPORTED_MODULE_7__["ObserversModule"]]] });
+A11yModule.ctorParameters = () => [
+ { type: HighContrastModeDetector }
+];
+(function () { (typeof ngJitMode === "undefined" || ngJitMode) && _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵsetNgModuleScope"](A11yModule, { declarations: function () { return [CdkAriaLive, CdkTrapFocus, CdkMonitorFocus]; }, imports: function () { return [_angular_cdk_platform__WEBPACK_IMPORTED_MODULE_6__["PlatformModule"], _angular_cdk_observers__WEBPACK_IMPORTED_MODULE_7__["ObserversModule"]]; }, exports: function () { return [CdkAriaLive, CdkTrapFocus, CdkMonitorFocus]; } }); })();
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵsetClassMetadata"](A11yModule, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["NgModule"],
+ args: [{
+ imports: [_angular_cdk_platform__WEBPACK_IMPORTED_MODULE_6__["PlatformModule"], _angular_cdk_observers__WEBPACK_IMPORTED_MODULE_7__["ObserversModule"]],
+ declarations: [CdkAriaLive, CdkTrapFocus, CdkMonitorFocus],
+ exports: [CdkAriaLive, CdkTrapFocus, CdkMonitorFocus]
+ }]
+ }], function () { return [{ type: HighContrastModeDetector }]; }, null); })();
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+
+/**
+ * Generated bundle index. Do not edit.
+ */
+
+
+
+//# sourceMappingURL=a11y.js.map
+
+/***/ }),
+
+/***/ "./node_modules/@angular/cdk/__ivy_ngcc__/fesm2015/bidi.js":
+/*!*****************************************************************!*\
+ !*** ./node_modules/@angular/cdk/__ivy_ngcc__/fesm2015/bidi.js ***!
+ \*****************************************************************/
+/*! exports provided: BidiModule, DIR_DOCUMENT, Dir, Directionality, ɵangular_material_src_cdk_bidi_bidi_a */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BidiModule", function() { return BidiModule; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "DIR_DOCUMENT", function() { return DIR_DOCUMENT; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Dir", function() { return Dir; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Directionality", function() { return Directionality; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵangular_material_src_cdk_bidi_bidi_a", function() { return DIR_DOCUMENT_FACTORY; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var _angular_common__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @angular/common */ "./node_modules/@angular/common/__ivy_ngcc__/fesm2015/common.js");
+
+
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * Injection token used to inject the document into Directionality.
+ * This is used so that the value can be faked in tests.
+ *
+ * We can't use the real document in tests because changing the real `dir` causes geometry-based
+ * tests in Safari to fail.
+ *
+ * We also can't re-provide the DOCUMENT token from platform-brower because the unit tests
+ * themselves use things like `querySelector` in test code.
+ *
+ * This token is defined in a separate file from Directionality as a workaround for
+ * https://github.com/angular/angular/issues/22559
+ *
+ * @docs-private
+ */
+
+const DIR_DOCUMENT = new _angular_core__WEBPACK_IMPORTED_MODULE_0__["InjectionToken"]('cdk-dir-doc', {
+ providedIn: 'root',
+ factory: DIR_DOCUMENT_FACTORY,
+});
+/** @docs-private */
+function DIR_DOCUMENT_FACTORY() {
+ return Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["inject"])(_angular_common__WEBPACK_IMPORTED_MODULE_1__["DOCUMENT"]);
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * The directionality (LTR / RTL) context for the application (or a subtree of it).
+ * Exposes the current direction and a stream of direction changes.
+ */
+class Directionality {
+ constructor(_document) {
+ /** The current 'ltr' or 'rtl' value. */
+ this.value = 'ltr';
+ /** Stream that emits whenever the 'ltr' / 'rtl' state changes. */
+ this.change = new _angular_core__WEBPACK_IMPORTED_MODULE_0__["EventEmitter"]();
+ if (_document) {
+ // TODO: handle 'auto' value -
+ // We still need to account for dir="auto".
+ // It looks like HTMLElemenet.dir is also "auto" when that's set to the attribute,
+ // but getComputedStyle return either "ltr" or "rtl". avoiding getComputedStyle for now
+ const bodyDir = _document.body ? _document.body.dir : null;
+ const htmlDir = _document.documentElement ? _document.documentElement.dir : null;
+ const value = bodyDir || htmlDir;
+ this.value = (value === 'ltr' || value === 'rtl') ? value : 'ltr';
+ }
+ }
+ ngOnDestroy() {
+ this.change.complete();
+ }
+}
+Directionality.ɵfac = function Directionality_Factory(t) { return new (t || Directionality)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵinject"](DIR_DOCUMENT, 8)); };
+Directionality.ɵprov = Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineInjectable"])({ factory: function Directionality_Factory() { return new Directionality(Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵinject"])(DIR_DOCUMENT, 8)); }, token: Directionality, providedIn: "root" });
+Directionality.ctorParameters = () => [
+ { type: undefined, decorators: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Optional"] }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Inject"], args: [DIR_DOCUMENT,] }] }
+];
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](Directionality, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Injectable"],
+ args: [{ providedIn: 'root' }]
+ }], function () { return [{ type: undefined, decorators: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Optional"]
+ }, {
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Inject"],
+ args: [DIR_DOCUMENT]
+ }] }]; }, null); })();
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * Directive to listen for changes of direction of part of the DOM.
+ *
+ * Provides itself as Directionality such that descendant directives only need to ever inject
+ * Directionality to get the closest direction.
+ */
+class Dir {
+ constructor() {
+ /** Normalized direction that accounts for invalid/unsupported values. */
+ this._dir = 'ltr';
+ /** Whether the `value` has been set to its initial value. */
+ this._isInitialized = false;
+ /** Event emitted when the direction changes. */
+ this.change = new _angular_core__WEBPACK_IMPORTED_MODULE_0__["EventEmitter"]();
+ }
+ /** @docs-private */
+ get dir() { return this._dir; }
+ set dir(value) {
+ const old = this._dir;
+ const normalizedValue = value ? value.toLowerCase() : value;
+ this._rawDir = value;
+ this._dir = (normalizedValue === 'ltr' || normalizedValue === 'rtl') ? normalizedValue : 'ltr';
+ if (old !== this._dir && this._isInitialized) {
+ this.change.emit(this._dir);
+ }
+ }
+ /** Current layout direction of the element. */
+ get value() { return this.dir; }
+ /** Initialize once default value has been set. */
+ ngAfterContentInit() {
+ this._isInitialized = true;
+ }
+ ngOnDestroy() {
+ this.change.complete();
+ }
+}
+Dir.ɵfac = function Dir_Factory(t) { return new (t || Dir)(); };
+Dir.ɵdir = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineDirective"]({ type: Dir, selectors: [["", "dir", ""]], hostVars: 1, hostBindings: function Dir_HostBindings(rf, ctx) { if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵattribute"]("dir", ctx._rawDir);
+ } }, inputs: { dir: "dir" }, outputs: { change: "dirChange" }, exportAs: ["dir"], features: [_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵProvidersFeature"]([{ provide: Directionality, useExisting: Dir }])] });
+Dir.propDecorators = {
+ change: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Output"], args: ['dirChange',] }],
+ dir: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"] }]
+};
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](Dir, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Directive"],
+ args: [{
+ selector: '[dir]',
+ providers: [{ provide: Directionality, useExisting: Dir }],
+ host: { '[attr.dir]': '_rawDir' },
+ exportAs: 'dir'
+ }]
+ }], function () { return []; }, { change: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Output"],
+ args: ['dirChange']
+ }], dir: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"]
+ }] }); })();
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+class BidiModule {
+}
+BidiModule.ɵfac = function BidiModule_Factory(t) { return new (t || BidiModule)(); };
+BidiModule.ɵmod = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineNgModule"]({ type: BidiModule });
+BidiModule.ɵinj = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineInjector"]({});
+(function () { (typeof ngJitMode === "undefined" || ngJitMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵsetNgModuleScope"](BidiModule, { declarations: [Dir], exports: [Dir] }); })();
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](BidiModule, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["NgModule"],
+ args: [{
+ exports: [Dir],
+ declarations: [Dir]
+ }]
+ }], null, null); })();
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+
+/**
+ * Generated bundle index. Do not edit.
+ */
+
+
+
+//# sourceMappingURL=bidi.js.map
+
+/***/ }),
+
+/***/ "./node_modules/@angular/cdk/__ivy_ngcc__/fesm2015/collections.js":
+/*!************************************************************************!*\
+ !*** ./node_modules/@angular/cdk/__ivy_ngcc__/fesm2015/collections.js ***!
+ \************************************************************************/
+/*! exports provided: ArrayDataSource, DataSource, SelectionModel, UniqueSelectionDispatcher, _DisposeViewRepeaterStrategy, _RecycleViewRepeaterStrategy, _VIEW_REPEATER_STRATEGY, getMultipleValuesInSingleSelectionError, isDataSource */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ArrayDataSource", function() { return ArrayDataSource; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "DataSource", function() { return DataSource; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SelectionModel", function() { return SelectionModel; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "UniqueSelectionDispatcher", function() { return UniqueSelectionDispatcher; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_DisposeViewRepeaterStrategy", function() { return _DisposeViewRepeaterStrategy; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_RecycleViewRepeaterStrategy", function() { return _RecycleViewRepeaterStrategy; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_VIEW_REPEATER_STRATEGY", function() { return _VIEW_REPEATER_STRATEGY; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getMultipleValuesInSingleSelectionError", function() { return getMultipleValuesInSingleSelectionError; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isDataSource", function() { return isDataSource; });
+/* harmony import */ var rxjs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! rxjs */ "./node_modules/rxjs/_esm5/index.js");
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+
+
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+
+class DataSource {
+}
+/** Checks whether an object is a data source. */
+function isDataSource(value) {
+ // Check if the value is a DataSource by observing if it has a connect function. Cannot
+ // be checked as an `instanceof DataSource` since people could create their own sources
+ // that match the interface, but don't extend DataSource.
+ return value && typeof value.connect === 'function';
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/** DataSource wrapper for a native array. */
+class ArrayDataSource extends DataSource {
+ constructor(_data) {
+ super();
+ this._data = _data;
+ }
+ connect() {
+ return Object(rxjs__WEBPACK_IMPORTED_MODULE_0__["isObservable"])(this._data) ? this._data : Object(rxjs__WEBPACK_IMPORTED_MODULE_0__["of"])(this._data);
+ }
+ disconnect() { }
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * A repeater that destroys views when they are removed from a
+ * {@link ViewContainerRef}. When new items are inserted into the container,
+ * the repeater will always construct a new embedded view for each item.
+ *
+ * @template T The type for the embedded view's $implicit property.
+ * @template R The type for the item in each IterableDiffer change record.
+ * @template C The type for the context passed to each embedded view.
+ */
+class _DisposeViewRepeaterStrategy {
+ applyChanges(changes, viewContainerRef, itemContextFactory, itemValueResolver, itemViewChanged) {
+ changes.forEachOperation((record, adjustedPreviousIndex, currentIndex) => {
+ let view;
+ let operation;
+ if (record.previousIndex == null) {
+ const insertContext = itemContextFactory(record, adjustedPreviousIndex, currentIndex);
+ view = viewContainerRef.createEmbeddedView(insertContext.templateRef, insertContext.context, insertContext.index);
+ operation = 1 /* INSERTED */;
+ }
+ else if (currentIndex == null) {
+ viewContainerRef.remove(adjustedPreviousIndex);
+ operation = 3 /* REMOVED */;
+ }
+ else {
+ view = viewContainerRef.get(adjustedPreviousIndex);
+ viewContainerRef.move(view, currentIndex);
+ operation = 2 /* MOVED */;
+ }
+ if (itemViewChanged) {
+ itemViewChanged({
+ context: view === null || view === void 0 ? void 0 : view.context,
+ operation,
+ record,
+ });
+ }
+ });
+ }
+ detach() {
+ }
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * A repeater that caches views when they are removed from a
+ * {@link ViewContainerRef}. When new items are inserted into the container,
+ * the repeater will reuse one of the cached views instead of creating a new
+ * embedded view. Recycling cached views reduces the quantity of expensive DOM
+ * inserts.
+ *
+ * @template T The type for the embedded view's $implicit property.
+ * @template R The type for the item in each IterableDiffer change record.
+ * @template C The type for the context passed to each embedded view.
+ */
+class _RecycleViewRepeaterStrategy {
+ constructor() {
+ /**
+ * The size of the cache used to store unused views.
+ * Setting the cache size to `0` will disable caching. Defaults to 20 views.
+ */
+ this.viewCacheSize = 20;
+ /**
+ * View cache that stores embedded view instances that have been previously stamped out,
+ * but don't are not currently rendered. The view repeater will reuse these views rather than
+ * creating brand new ones.
+ *
+ * TODO(michaeljamesparsons) Investigate whether using a linked list would improve performance.
+ */
+ this._viewCache = [];
+ }
+ /** Apply changes to the DOM. */
+ applyChanges(changes, viewContainerRef, itemContextFactory, itemValueResolver, itemViewChanged) {
+ // Rearrange the views to put them in the right location.
+ changes.forEachOperation((record, adjustedPreviousIndex, currentIndex) => {
+ let view;
+ let operation;
+ if (record.previousIndex == null) { // Item added.
+ const viewArgsFactory = () => itemContextFactory(record, adjustedPreviousIndex, currentIndex);
+ view = this._insertView(viewArgsFactory, currentIndex, viewContainerRef, itemValueResolver(record));
+ operation = view ? 1 /* INSERTED */ : 0 /* REPLACED */;
+ }
+ else if (currentIndex == null) { // Item removed.
+ this._detachAndCacheView(adjustedPreviousIndex, viewContainerRef);
+ operation = 3 /* REMOVED */;
+ }
+ else { // Item moved.
+ view = this._moveView(adjustedPreviousIndex, currentIndex, viewContainerRef, itemValueResolver(record));
+ operation = 2 /* MOVED */;
+ }
+ if (itemViewChanged) {
+ itemViewChanged({
+ context: view === null || view === void 0 ? void 0 : view.context,
+ operation,
+ record,
+ });
+ }
+ });
+ }
+ detach() {
+ for (const view of this._viewCache) {
+ view.destroy();
+ }
+ this._viewCache = [];
+ }
+ /**
+ * Inserts a view for a new item, either from the cache or by creating a new
+ * one. Returns `undefined` if the item was inserted into a cached view.
+ */
+ _insertView(viewArgsFactory, currentIndex, viewContainerRef, value) {
+ const cachedView = this._insertViewFromCache(currentIndex, viewContainerRef);
+ if (cachedView) {
+ cachedView.context.$implicit = value;
+ return undefined;
+ }
+ const viewArgs = viewArgsFactory();
+ return viewContainerRef.createEmbeddedView(viewArgs.templateRef, viewArgs.context, viewArgs.index);
+ }
+ /** Detaches the view at the given index and inserts into the view cache. */
+ _detachAndCacheView(index, viewContainerRef) {
+ const detachedView = viewContainerRef.detach(index);
+ this._maybeCacheView(detachedView, viewContainerRef);
+ }
+ /** Moves view at the previous index to the current index. */
+ _moveView(adjustedPreviousIndex, currentIndex, viewContainerRef, value) {
+ const view = viewContainerRef.get(adjustedPreviousIndex);
+ viewContainerRef.move(view, currentIndex);
+ view.context.$implicit = value;
+ return view;
+ }
+ /**
+ * Cache the given detached view. If the cache is full, the view will be
+ * destroyed.
+ */
+ _maybeCacheView(view, viewContainerRef) {
+ if (this._viewCache.length < this.viewCacheSize) {
+ this._viewCache.push(view);
+ }
+ else {
+ const index = viewContainerRef.indexOf(view);
+ // The host component could remove views from the container outside of
+ // the view repeater. It's unlikely this will occur, but just in case,
+ // destroy the view on its own, otherwise destroy it through the
+ // container to ensure that all the references are removed.
+ if (index === -1) {
+ view.destroy();
+ }
+ else {
+ viewContainerRef.remove(index);
+ }
+ }
+ }
+ /** Inserts a recycled view from the cache at the given index. */
+ _insertViewFromCache(index, viewContainerRef) {
+ const cachedView = this._viewCache.pop();
+ if (cachedView) {
+ viewContainerRef.insert(cachedView, index);
+ }
+ return cachedView || null;
+ }
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * Class to be used to power selecting one or more options from a list.
+ */
+class SelectionModel {
+ constructor(_multiple = false, initiallySelectedValues, _emitChanges = true) {
+ this._multiple = _multiple;
+ this._emitChanges = _emitChanges;
+ /** Currently-selected values. */
+ this._selection = new Set();
+ /** Keeps track of the deselected options that haven't been emitted by the change event. */
+ this._deselectedToEmit = [];
+ /** Keeps track of the selected options that haven't been emitted by the change event. */
+ this._selectedToEmit = [];
+ /** Event emitted when the value has changed. */
+ this.changed = new rxjs__WEBPACK_IMPORTED_MODULE_0__["Subject"]();
+ if (initiallySelectedValues && initiallySelectedValues.length) {
+ if (_multiple) {
+ initiallySelectedValues.forEach(value => this._markSelected(value));
+ }
+ else {
+ this._markSelected(initiallySelectedValues[0]);
+ }
+ // Clear the array in order to avoid firing the change event for preselected values.
+ this._selectedToEmit.length = 0;
+ }
+ }
+ /** Selected values. */
+ get selected() {
+ if (!this._selected) {
+ this._selected = Array.from(this._selection.values());
+ }
+ return this._selected;
+ }
+ /**
+ * Selects a value or an array of values.
+ */
+ select(...values) {
+ this._verifyValueAssignment(values);
+ values.forEach(value => this._markSelected(value));
+ this._emitChangeEvent();
+ }
+ /**
+ * Deselects a value or an array of values.
+ */
+ deselect(...values) {
+ this._verifyValueAssignment(values);
+ values.forEach(value => this._unmarkSelected(value));
+ this._emitChangeEvent();
+ }
+ /**
+ * Toggles a value between selected and deselected.
+ */
+ toggle(value) {
+ this.isSelected(value) ? this.deselect(value) : this.select(value);
+ }
+ /**
+ * Clears all of the selected values.
+ */
+ clear() {
+ this._unmarkAll();
+ this._emitChangeEvent();
+ }
+ /**
+ * Determines whether a value is selected.
+ */
+ isSelected(value) {
+ return this._selection.has(value);
+ }
+ /**
+ * Determines whether the model does not have a value.
+ */
+ isEmpty() {
+ return this._selection.size === 0;
+ }
+ /**
+ * Determines whether the model has a value.
+ */
+ hasValue() {
+ return !this.isEmpty();
+ }
+ /**
+ * Sorts the selected values based on a predicate function.
+ */
+ sort(predicate) {
+ if (this._multiple && this.selected) {
+ this._selected.sort(predicate);
+ }
+ }
+ /**
+ * Gets whether multiple values can be selected.
+ */
+ isMultipleSelection() {
+ return this._multiple;
+ }
+ /** Emits a change event and clears the records of selected and deselected values. */
+ _emitChangeEvent() {
+ // Clear the selected values so they can be re-cached.
+ this._selected = null;
+ if (this._selectedToEmit.length || this._deselectedToEmit.length) {
+ this.changed.next({
+ source: this,
+ added: this._selectedToEmit,
+ removed: this._deselectedToEmit
+ });
+ this._deselectedToEmit = [];
+ this._selectedToEmit = [];
+ }
+ }
+ /** Selects a value. */
+ _markSelected(value) {
+ if (!this.isSelected(value)) {
+ if (!this._multiple) {
+ this._unmarkAll();
+ }
+ this._selection.add(value);
+ if (this._emitChanges) {
+ this._selectedToEmit.push(value);
+ }
+ }
+ }
+ /** Deselects a value. */
+ _unmarkSelected(value) {
+ if (this.isSelected(value)) {
+ this._selection.delete(value);
+ if (this._emitChanges) {
+ this._deselectedToEmit.push(value);
+ }
+ }
+ }
+ /** Clears out the selected values. */
+ _unmarkAll() {
+ if (!this.isEmpty()) {
+ this._selection.forEach(value => this._unmarkSelected(value));
+ }
+ }
+ /**
+ * Verifies the value assignment and throws an error if the specified value array is
+ * including multiple values while the selection model is not supporting multiple values.
+ */
+ _verifyValueAssignment(values) {
+ if (values.length > 1 && !this._multiple && (typeof ngDevMode === 'undefined' || ngDevMode)) {
+ throw getMultipleValuesInSingleSelectionError();
+ }
+ }
+}
+/**
+ * Returns an error that reports that multiple values are passed into a selection model
+ * with a single value.
+ * @docs-private
+ */
+function getMultipleValuesInSingleSelectionError() {
+ return Error('Cannot pass multiple values into SelectionModel with single-value mode.');
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * Class to coordinate unique selection based on name.
+ * Intended to be consumed as an Angular service.
+ * This service is needed because native radio change events are only fired on the item currently
+ * being selected, and we still need to uncheck the previous selection.
+ *
+ * This service does not *store* any IDs and names because they may change at any time, so it is
+ * less error-prone if they are simply passed through when the events occur.
+ */
+class UniqueSelectionDispatcher {
+ constructor() {
+ this._listeners = [];
+ }
+ /**
+ * Notify other items that selection for the given name has been set.
+ * @param id ID of the item.
+ * @param name Name of the item.
+ */
+ notify(id, name) {
+ for (let listener of this._listeners) {
+ listener(id, name);
+ }
+ }
+ /**
+ * Listen for future changes to item selection.
+ * @return Function used to deregister listener
+ */
+ listen(listener) {
+ this._listeners.push(listener);
+ return () => {
+ this._listeners = this._listeners.filter((registered) => {
+ return listener !== registered;
+ });
+ };
+ }
+ ngOnDestroy() {
+ this._listeners = [];
+ }
+}
+UniqueSelectionDispatcher.ɵfac = function UniqueSelectionDispatcher_Factory(t) { return new (t || UniqueSelectionDispatcher)(); };
+UniqueSelectionDispatcher.ɵprov = Object(_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdefineInjectable"])({ factory: function UniqueSelectionDispatcher_Factory() { return new UniqueSelectionDispatcher(); }, token: UniqueSelectionDispatcher, providedIn: "root" });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵsetClassMetadata"](UniqueSelectionDispatcher, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Injectable"],
+ args: [{ providedIn: 'root' }]
+ }], function () { return []; }, null); })();
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * Injection token for {@link _ViewRepeater}. This token is for use by Angular Material only.
+ * @docs-private
+ */
+const _VIEW_REPEATER_STRATEGY = new _angular_core__WEBPACK_IMPORTED_MODULE_1__["InjectionToken"]('_ViewRepeater');
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+
+/**
+ * Generated bundle index. Do not edit.
+ */
+
+
+
+//# sourceMappingURL=collections.js.map
+
+/***/ }),
+
+/***/ "./node_modules/@angular/cdk/__ivy_ngcc__/fesm2015/drag-drop.js":
+/*!**********************************************************************!*\
+ !*** ./node_modules/@angular/cdk/__ivy_ngcc__/fesm2015/drag-drop.js ***!
+ \**********************************************************************/
+/*! exports provided: CDK_DRAG_CONFIG, CDK_DRAG_HANDLE, CDK_DRAG_PARENT, CDK_DRAG_PLACEHOLDER, CDK_DRAG_PREVIEW, CDK_DROP_LIST, CDK_DROP_LIST_GROUP, CdkDrag, CdkDragHandle, CdkDragPlaceholder, CdkDragPreview, CdkDropList, CdkDropListGroup, DragDrop, DragDropModule, DragDropRegistry, DragRef, DropListRef, copyArrayItem, moveItemInArray, transferArrayItem */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CDK_DRAG_CONFIG", function() { return CDK_DRAG_CONFIG; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CDK_DRAG_HANDLE", function() { return CDK_DRAG_HANDLE; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CDK_DRAG_PARENT", function() { return CDK_DRAG_PARENT; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CDK_DRAG_PLACEHOLDER", function() { return CDK_DRAG_PLACEHOLDER; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CDK_DRAG_PREVIEW", function() { return CDK_DRAG_PREVIEW; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CDK_DROP_LIST", function() { return CDK_DROP_LIST; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CDK_DROP_LIST_GROUP", function() { return CDK_DROP_LIST_GROUP; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CdkDrag", function() { return CdkDrag; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CdkDragHandle", function() { return CdkDragHandle; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CdkDragPlaceholder", function() { return CdkDragPlaceholder; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CdkDragPreview", function() { return CdkDragPreview; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CdkDropList", function() { return CdkDropList; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CdkDropListGroup", function() { return CdkDropListGroup; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "DragDrop", function() { return DragDrop; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "DragDropModule", function() { return DragDropModule; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "DragDropRegistry", function() { return DragDropRegistry; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "DragRef", function() { return DragRef; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "DropListRef", function() { return DropListRef; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "copyArrayItem", function() { return copyArrayItem; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "moveItemInArray", function() { return moveItemInArray; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "transferArrayItem", function() { return transferArrayItem; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var _angular_common__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @angular/common */ "./node_modules/@angular/common/__ivy_ngcc__/fesm2015/common.js");
+/* harmony import */ var _angular_cdk_scrolling__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @angular/cdk/scrolling */ "./node_modules/@angular/cdk/__ivy_ngcc__/fesm2015/scrolling.js");
+/* harmony import */ var _angular_cdk_platform__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @angular/cdk/platform */ "./node_modules/@angular/cdk/__ivy_ngcc__/fesm2015/platform.js");
+/* harmony import */ var _angular_cdk_coercion__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @angular/cdk/coercion */ "./node_modules/@angular/cdk/fesm2015/coercion.js");
+/* harmony import */ var rxjs__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! rxjs */ "./node_modules/rxjs/_esm5/index.js");
+/* harmony import */ var rxjs_operators__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! rxjs/operators */ "./node_modules/rxjs/_esm5/operators/index.js");
+/* harmony import */ var _angular_cdk_bidi__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @angular/cdk/bidi */ "./node_modules/@angular/cdk/__ivy_ngcc__/fesm2015/bidi.js");
+
+
+
+
+
+
+
+
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * Shallow-extends a stylesheet object with another stylesheet object.
+ * @docs-private
+ */
+
+
+
+function extendStyles(dest, source) {
+ for (let key in source) {
+ if (source.hasOwnProperty(key)) {
+ dest[key] = source[key];
+ }
+ }
+ return dest;
+}
+/**
+ * Toggles whether the native drag interactions should be enabled for an element.
+ * @param element Element on which to toggle the drag interactions.
+ * @param enable Whether the drag interactions should be enabled.
+ * @docs-private
+ */
+function toggleNativeDragInteractions(element, enable) {
+ const userSelect = enable ? '' : 'none';
+ extendStyles(element.style, {
+ touchAction: enable ? '' : 'none',
+ webkitUserDrag: enable ? '' : 'none',
+ webkitTapHighlightColor: enable ? '' : 'transparent',
+ userSelect: userSelect,
+ msUserSelect: userSelect,
+ webkitUserSelect: userSelect,
+ MozUserSelect: userSelect
+ });
+}
+/**
+ * Toggles whether an element is visible while preserving its dimensions.
+ * @param element Element whose visibility to toggle
+ * @param enable Whether the element should be visible.
+ * @docs-private
+ */
+function toggleVisibility(element, enable) {
+ const styles = element.style;
+ styles.position = enable ? '' : 'fixed';
+ styles.top = styles.opacity = enable ? '' : '0';
+ styles.left = enable ? '' : '-999em';
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/** Parses a CSS time value to milliseconds. */
+function parseCssTimeUnitsToMs(value) {
+ // Some browsers will return it in seconds, whereas others will return milliseconds.
+ const multiplier = value.toLowerCase().indexOf('ms') > -1 ? 1 : 1000;
+ return parseFloat(value) * multiplier;
+}
+/** Gets the transform transition duration, including the delay, of an element in milliseconds. */
+function getTransformTransitionDurationInMs(element) {
+ const computedStyle = getComputedStyle(element);
+ const transitionedProperties = parseCssPropertyValue(computedStyle, 'transition-property');
+ const property = transitionedProperties.find(prop => prop === 'transform' || prop === 'all');
+ // If there's no transition for `all` or `transform`, we shouldn't do anything.
+ if (!property) {
+ return 0;
+ }
+ // Get the index of the property that we're interested in and match
+ // it up to the same index in `transition-delay` and `transition-duration`.
+ const propertyIndex = transitionedProperties.indexOf(property);
+ const rawDurations = parseCssPropertyValue(computedStyle, 'transition-duration');
+ const rawDelays = parseCssPropertyValue(computedStyle, 'transition-delay');
+ return parseCssTimeUnitsToMs(rawDurations[propertyIndex]) +
+ parseCssTimeUnitsToMs(rawDelays[propertyIndex]);
+}
+/** Parses out multiple values from a computed style into an array. */
+function parseCssPropertyValue(computedStyle, name) {
+ const value = computedStyle.getPropertyValue(name);
+ return value.split(',').map(part => part.trim());
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/** Gets a mutable version of an element's bounding `ClientRect`. */
+function getMutableClientRect(element) {
+ const clientRect = element.getBoundingClientRect();
+ // We need to clone the `clientRect` here, because all the values on it are readonly
+ // and we need to be able to update them. Also we can't use a spread here, because
+ // the values on a `ClientRect` aren't own properties. See:
+ // https://developer.mozilla.org/en-US/docs/Web/API/Element/getBoundingClientRect#Notes
+ return {
+ top: clientRect.top,
+ right: clientRect.right,
+ bottom: clientRect.bottom,
+ left: clientRect.left,
+ width: clientRect.width,
+ height: clientRect.height
+ };
+}
+/**
+ * Checks whether some coordinates are within a `ClientRect`.
+ * @param clientRect ClientRect that is being checked.
+ * @param x Coordinates along the X axis.
+ * @param y Coordinates along the Y axis.
+ */
+function isInsideClientRect(clientRect, x, y) {
+ const { top, bottom, left, right } = clientRect;
+ return y >= top && y <= bottom && x >= left && x <= right;
+}
+/**
+ * Updates the top/left positions of a `ClientRect`, as well as their bottom/right counterparts.
+ * @param clientRect `ClientRect` that should be updated.
+ * @param top Amount to add to the `top` position.
+ * @param left Amount to add to the `left` position.
+ */
+function adjustClientRect(clientRect, top, left) {
+ clientRect.top += top;
+ clientRect.bottom = clientRect.top + clientRect.height;
+ clientRect.left += left;
+ clientRect.right = clientRect.left + clientRect.width;
+}
+/**
+ * Checks whether the pointer coordinates are close to a ClientRect.
+ * @param rect ClientRect to check against.
+ * @param threshold Threshold around the ClientRect.
+ * @param pointerX Coordinates along the X axis.
+ * @param pointerY Coordinates along the Y axis.
+ */
+function isPointerNearClientRect(rect, threshold, pointerX, pointerY) {
+ const { top, right, bottom, left, width, height } = rect;
+ const xThreshold = width * threshold;
+ const yThreshold = height * threshold;
+ return pointerY > top - yThreshold && pointerY < bottom + yThreshold &&
+ pointerX > left - xThreshold && pointerX < right + xThreshold;
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/** Keeps track of the scroll position and dimensions of the parents of an element. */
+class ParentPositionTracker {
+ constructor(_document, _viewportRuler) {
+ this._document = _document;
+ this._viewportRuler = _viewportRuler;
+ /** Cached positions of the scrollable parent elements. */
+ this.positions = new Map();
+ }
+ /** Clears the cached positions. */
+ clear() {
+ this.positions.clear();
+ }
+ /** Caches the positions. Should be called at the beginning of a drag sequence. */
+ cache(elements) {
+ this.clear();
+ this.positions.set(this._document, {
+ scrollPosition: this._viewportRuler.getViewportScrollPosition(),
+ });
+ elements.forEach(element => {
+ this.positions.set(element, {
+ scrollPosition: { top: element.scrollTop, left: element.scrollLeft },
+ clientRect: getMutableClientRect(element)
+ });
+ });
+ }
+ /** Handles scrolling while a drag is taking place. */
+ handleScroll(event) {
+ const target = event.target;
+ const cachedPosition = this.positions.get(target);
+ if (!cachedPosition) {
+ return null;
+ }
+ // Used when figuring out whether an element is inside the scroll parent. If the scrolled
+ // parent is the `document`, we use the `documentElement`, because IE doesn't support
+ // `contains` on the `document`.
+ const scrolledParentNode = target === this._document ? target.documentElement : target;
+ const scrollPosition = cachedPosition.scrollPosition;
+ let newTop;
+ let newLeft;
+ if (target === this._document) {
+ const viewportScrollPosition = this._viewportRuler.getViewportScrollPosition();
+ newTop = viewportScrollPosition.top;
+ newLeft = viewportScrollPosition.left;
+ }
+ else {
+ newTop = target.scrollTop;
+ newLeft = target.scrollLeft;
+ }
+ const topDifference = scrollPosition.top - newTop;
+ const leftDifference = scrollPosition.left - newLeft;
+ // Go through and update the cached positions of the scroll
+ // parents that are inside the element that was scrolled.
+ this.positions.forEach((position, node) => {
+ if (position.clientRect && target !== node && scrolledParentNode.contains(node)) {
+ adjustClientRect(position.clientRect, topDifference, leftDifference);
+ }
+ });
+ scrollPosition.top = newTop;
+ scrollPosition.left = newLeft;
+ return { top: topDifference, left: leftDifference };
+ }
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/** Creates a deep clone of an element. */
+function deepCloneNode(node) {
+ const clone = node.cloneNode(true);
+ const descendantsWithId = clone.querySelectorAll('[id]');
+ const nodeName = node.nodeName.toLowerCase();
+ // Remove the `id` to avoid having multiple elements with the same id on the page.
+ clone.removeAttribute('id');
+ for (let i = 0; i < descendantsWithId.length; i++) {
+ descendantsWithId[i].removeAttribute('id');
+ }
+ if (nodeName === 'canvas') {
+ transferCanvasData(node, clone);
+ }
+ else if (nodeName === 'input' || nodeName === 'select' || nodeName === 'textarea') {
+ transferInputData(node, clone);
+ }
+ transferData('canvas', node, clone, transferCanvasData);
+ transferData('input, textarea, select', node, clone, transferInputData);
+ return clone;
+}
+/** Matches elements between an element and its clone and allows for their data to be cloned. */
+function transferData(selector, node, clone, callback) {
+ const descendantElements = node.querySelectorAll(selector);
+ if (descendantElements.length) {
+ const cloneElements = clone.querySelectorAll(selector);
+ for (let i = 0; i < descendantElements.length; i++) {
+ callback(descendantElements[i], cloneElements[i]);
+ }
+ }
+}
+// Counter for unique cloned radio button names.
+let cloneUniqueId = 0;
+/** Transfers the data of one input element to another. */
+function transferInputData(source, clone) {
+ // Browsers throw an error when assigning the value of a file input programmatically.
+ if (clone.type !== 'file') {
+ clone.value = source.value;
+ }
+ // Radio button `name` attributes must be unique for radio button groups
+ // otherwise original radio buttons can lose their checked state
+ // once the clone is inserted in the DOM.
+ if (clone.type === 'radio' && clone.name) {
+ clone.name = `mat-clone-${clone.name}-${cloneUniqueId++}`;
+ }
+}
+/** Transfers the data of one canvas element to another. */
+function transferCanvasData(source, clone) {
+ const context = clone.getContext('2d');
+ if (context) {
+ // In some cases `drawImage` can throw (e.g. if the canvas size is 0x0).
+ // We can't do much about it so just ignore the error.
+ try {
+ context.drawImage(source, 0, 0);
+ }
+ catch (_a) { }
+ }
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/** Options that can be used to bind a passive event listener. */
+const passiveEventListenerOptions = Object(_angular_cdk_platform__WEBPACK_IMPORTED_MODULE_3__["normalizePassiveListenerOptions"])({ passive: true });
+/** Options that can be used to bind an active event listener. */
+const activeEventListenerOptions = Object(_angular_cdk_platform__WEBPACK_IMPORTED_MODULE_3__["normalizePassiveListenerOptions"])({ passive: false });
+/**
+ * Time in milliseconds for which to ignore mouse events, after
+ * receiving a touch event. Used to avoid doing double work for
+ * touch devices where the browser fires fake mouse events, in
+ * addition to touch events.
+ */
+const MOUSE_EVENT_IGNORE_TIME = 800;
+/**
+ * Reference to a draggable item. Used to manipulate or dispose of the item.
+ */
+class DragRef {
+ constructor(element, _config, _document, _ngZone, _viewportRuler, _dragDropRegistry) {
+ this._config = _config;
+ this._document = _document;
+ this._ngZone = _ngZone;
+ this._viewportRuler = _viewportRuler;
+ this._dragDropRegistry = _dragDropRegistry;
+ /**
+ * CSS `transform` applied to the element when it isn't being dragged. We need a
+ * passive transform in order for the dragged element to retain its new position
+ * after the user has stopped dragging and because we need to know the relative
+ * position in case they start dragging again. This corresponds to `element.style.transform`.
+ */
+ this._passiveTransform = { x: 0, y: 0 };
+ /** CSS `transform` that is applied to the element while it's being dragged. */
+ this._activeTransform = { x: 0, y: 0 };
+ /** Emits when the item is being moved. */
+ this._moveEvents = new rxjs__WEBPACK_IMPORTED_MODULE_5__["Subject"]();
+ /** Subscription to pointer movement events. */
+ this._pointerMoveSubscription = rxjs__WEBPACK_IMPORTED_MODULE_5__["Subscription"].EMPTY;
+ /** Subscription to the event that is dispatched when the user lifts their pointer. */
+ this._pointerUpSubscription = rxjs__WEBPACK_IMPORTED_MODULE_5__["Subscription"].EMPTY;
+ /** Subscription to the viewport being scrolled. */
+ this._scrollSubscription = rxjs__WEBPACK_IMPORTED_MODULE_5__["Subscription"].EMPTY;
+ /** Subscription to the viewport being resized. */
+ this._resizeSubscription = rxjs__WEBPACK_IMPORTED_MODULE_5__["Subscription"].EMPTY;
+ /** Cached reference to the boundary element. */
+ this._boundaryElement = null;
+ /** Whether the native dragging interactions have been enabled on the root element. */
+ this._nativeInteractionsEnabled = true;
+ /** Elements that can be used to drag the draggable item. */
+ this._handles = [];
+ /** Registered handles that are currently disabled. */
+ this._disabledHandles = new Set();
+ /** Layout direction of the item. */
+ this._direction = 'ltr';
+ /**
+ * Amount of milliseconds to wait after the user has put their
+ * pointer down before starting to drag the element.
+ */
+ this.dragStartDelay = 0;
+ this._disabled = false;
+ /** Emits as the drag sequence is being prepared. */
+ this.beforeStarted = new rxjs__WEBPACK_IMPORTED_MODULE_5__["Subject"]();
+ /** Emits when the user starts dragging the item. */
+ this.started = new rxjs__WEBPACK_IMPORTED_MODULE_5__["Subject"]();
+ /** Emits when the user has released a drag item, before any animations have started. */
+ this.released = new rxjs__WEBPACK_IMPORTED_MODULE_5__["Subject"]();
+ /** Emits when the user stops dragging an item in the container. */
+ this.ended = new rxjs__WEBPACK_IMPORTED_MODULE_5__["Subject"]();
+ /** Emits when the user has moved the item into a new container. */
+ this.entered = new rxjs__WEBPACK_IMPORTED_MODULE_5__["Subject"]();
+ /** Emits when the user removes the item its container by dragging it into another container. */
+ this.exited = new rxjs__WEBPACK_IMPORTED_MODULE_5__["Subject"]();
+ /** Emits when the user drops the item inside a container. */
+ this.dropped = new rxjs__WEBPACK_IMPORTED_MODULE_5__["Subject"]();
+ /**
+ * Emits as the user is dragging the item. Use with caution,
+ * because this event will fire for every pixel that the user has dragged.
+ */
+ this.moved = this._moveEvents;
+ /** Handler for the `mousedown`/`touchstart` events. */
+ this._pointerDown = (event) => {
+ this.beforeStarted.next();
+ // Delegate the event based on whether it started from a handle or the element itself.
+ if (this._handles.length) {
+ const targetHandle = this._handles.find(handle => {
+ const target = event.target;
+ return !!target && (target === handle || handle.contains(target));
+ });
+ if (targetHandle && !this._disabledHandles.has(targetHandle) && !this.disabled) {
+ this._initializeDragSequence(targetHandle, event);
+ }
+ }
+ else if (!this.disabled) {
+ this._initializeDragSequence(this._rootElement, event);
+ }
+ };
+ /** Handler that is invoked when the user moves their pointer after they've initiated a drag. */
+ this._pointerMove = (event) => {
+ const pointerPosition = this._getPointerPositionOnPage(event);
+ if (!this._hasStartedDragging) {
+ const distanceX = Math.abs(pointerPosition.x - this._pickupPositionOnPage.x);
+ const distanceY = Math.abs(pointerPosition.y - this._pickupPositionOnPage.y);
+ const isOverThreshold = distanceX + distanceY >= this._config.dragStartThreshold;
+ // Only start dragging after the user has moved more than the minimum distance in either
+ // direction. Note that this is preferrable over doing something like `skip(minimumDistance)`
+ // in the `pointerMove` subscription, because we're not guaranteed to have one move event
+ // per pixel of movement (e.g. if the user moves their pointer quickly).
+ if (isOverThreshold) {
+ const isDelayElapsed = Date.now() >= this._dragStartTime + this._getDragStartDelay(event);
+ const container = this._dropContainer;
+ if (!isDelayElapsed) {
+ this._endDragSequence(event);
+ return;
+ }
+ // Prevent other drag sequences from starting while something in the container is still
+ // being dragged. This can happen while we're waiting for the drop animation to finish
+ // and can cause errors, because some elements might still be moving around.
+ if (!container || (!container.isDragging() && !container.isReceiving())) {
+ // Prevent the default action as soon as the dragging sequence is considered as
+ // "started" since waiting for the next event can allow the device to begin scrolling.
+ event.preventDefault();
+ this._hasStartedDragging = true;
+ this._ngZone.run(() => this._startDragSequence(event));
+ }
+ }
+ return;
+ }
+ // We only need the preview dimensions if we have a boundary element.
+ if (this._boundaryElement) {
+ // Cache the preview element rect if we haven't cached it already or if
+ // we cached it too early before the element dimensions were computed.
+ if (!this._previewRect || (!this._previewRect.width && !this._previewRect.height)) {
+ this._previewRect = (this._preview || this._rootElement).getBoundingClientRect();
+ }
+ }
+ // We prevent the default action down here so that we know that dragging has started. This is
+ // important for touch devices where doing this too early can unnecessarily block scrolling,
+ // if there's a dragging delay.
+ event.preventDefault();
+ const constrainedPointerPosition = this._getConstrainedPointerPosition(pointerPosition);
+ this._hasMoved = true;
+ this._lastKnownPointerPosition = pointerPosition;
+ this._updatePointerDirectionDelta(constrainedPointerPosition);
+ if (this._dropContainer) {
+ this._updateActiveDropContainer(constrainedPointerPosition, pointerPosition);
+ }
+ else {
+ const activeTransform = this._activeTransform;
+ activeTransform.x =
+ constrainedPointerPosition.x - this._pickupPositionOnPage.x + this._passiveTransform.x;
+ activeTransform.y =
+ constrainedPointerPosition.y - this._pickupPositionOnPage.y + this._passiveTransform.y;
+ this._applyRootElementTransform(activeTransform.x, activeTransform.y);
+ // Apply transform as attribute if dragging and svg element to work for IE
+ if (typeof SVGElement !== 'undefined' && this._rootElement instanceof SVGElement) {
+ const appliedTransform = `translate(${activeTransform.x} ${activeTransform.y})`;
+ this._rootElement.setAttribute('transform', appliedTransform);
+ }
+ }
+ // Since this event gets fired for every pixel while dragging, we only
+ // want to fire it if the consumer opted into it. Also we have to
+ // re-enter the zone because we run all of the events on the outside.
+ if (this._moveEvents.observers.length) {
+ this._ngZone.run(() => {
+ this._moveEvents.next({
+ source: this,
+ pointerPosition: constrainedPointerPosition,
+ event,
+ distance: this._getDragDistance(constrainedPointerPosition),
+ delta: this._pointerDirectionDelta
+ });
+ });
+ }
+ };
+ /** Handler that is invoked when the user lifts their pointer up, after initiating a drag. */
+ this._pointerUp = (event) => {
+ this._endDragSequence(event);
+ };
+ this.withRootElement(element).withParent(_config.parentDragRef || null);
+ this._parentPositions = new ParentPositionTracker(_document, _viewportRuler);
+ _dragDropRegistry.registerDragItem(this);
+ }
+ /** Whether starting to drag this element is disabled. */
+ get disabled() {
+ return this._disabled || !!(this._dropContainer && this._dropContainer.disabled);
+ }
+ set disabled(value) {
+ const newValue = Object(_angular_cdk_coercion__WEBPACK_IMPORTED_MODULE_4__["coerceBooleanProperty"])(value);
+ if (newValue !== this._disabled) {
+ this._disabled = newValue;
+ this._toggleNativeDragInteractions();
+ this._handles.forEach(handle => toggleNativeDragInteractions(handle, newValue));
+ }
+ }
+ /**
+ * Returns the element that is being used as a placeholder
+ * while the current element is being dragged.
+ */
+ getPlaceholderElement() {
+ return this._placeholder;
+ }
+ /** Returns the root draggable element. */
+ getRootElement() {
+ return this._rootElement;
+ }
+ /**
+ * Gets the currently-visible element that represents the drag item.
+ * While dragging this is the placeholder, otherwise it's the root element.
+ */
+ getVisibleElement() {
+ return this.isDragging() ? this.getPlaceholderElement() : this.getRootElement();
+ }
+ /** Registers the handles that can be used to drag the element. */
+ withHandles(handles) {
+ this._handles = handles.map(handle => Object(_angular_cdk_coercion__WEBPACK_IMPORTED_MODULE_4__["coerceElement"])(handle));
+ this._handles.forEach(handle => toggleNativeDragInteractions(handle, this.disabled));
+ this._toggleNativeDragInteractions();
+ // Delete any lingering disabled handles that may have been destroyed. Note that we re-create
+ // the set, rather than iterate over it and filter out the destroyed handles, because while
+ // the ES spec allows for sets to be modified while they're being iterated over, some polyfills
+ // use an array internally which may throw an error.
+ const disabledHandles = new Set();
+ this._disabledHandles.forEach(handle => {
+ if (this._handles.indexOf(handle) > -1) {
+ disabledHandles.add(handle);
+ }
+ });
+ this._disabledHandles = disabledHandles;
+ return this;
+ }
+ /**
+ * Registers the template that should be used for the drag preview.
+ * @param template Template that from which to stamp out the preview.
+ */
+ withPreviewTemplate(template) {
+ this._previewTemplate = template;
+ return this;
+ }
+ /**
+ * Registers the template that should be used for the drag placeholder.
+ * @param template Template that from which to stamp out the placeholder.
+ */
+ withPlaceholderTemplate(template) {
+ this._placeholderTemplate = template;
+ return this;
+ }
+ /**
+ * Sets an alternate drag root element. The root element is the element that will be moved as
+ * the user is dragging. Passing an alternate root element is useful when trying to enable
+ * dragging on an element that you might not have access to.
+ */
+ withRootElement(rootElement) {
+ const element = Object(_angular_cdk_coercion__WEBPACK_IMPORTED_MODULE_4__["coerceElement"])(rootElement);
+ if (element !== this._rootElement) {
+ if (this._rootElement) {
+ this._removeRootElementListeners(this._rootElement);
+ }
+ this._ngZone.runOutsideAngular(() => {
+ element.addEventListener('mousedown', this._pointerDown, activeEventListenerOptions);
+ element.addEventListener('touchstart', this._pointerDown, passiveEventListenerOptions);
+ });
+ this._initialTransform = undefined;
+ this._rootElement = element;
+ }
+ if (typeof SVGElement !== 'undefined' && this._rootElement instanceof SVGElement) {
+ this._ownerSVGElement = this._rootElement.ownerSVGElement;
+ }
+ return this;
+ }
+ /**
+ * Element to which the draggable's position will be constrained.
+ */
+ withBoundaryElement(boundaryElement) {
+ this._boundaryElement = boundaryElement ? Object(_angular_cdk_coercion__WEBPACK_IMPORTED_MODULE_4__["coerceElement"])(boundaryElement) : null;
+ this._resizeSubscription.unsubscribe();
+ if (boundaryElement) {
+ this._resizeSubscription = this._viewportRuler
+ .change(10)
+ .subscribe(() => this._containInsideBoundaryOnResize());
+ }
+ return this;
+ }
+ /** Sets the parent ref that the ref is nested in. */
+ withParent(parent) {
+ this._parentDragRef = parent;
+ return this;
+ }
+ /** Removes the dragging functionality from the DOM element. */
+ dispose() {
+ this._removeRootElementListeners(this._rootElement);
+ // Do this check before removing from the registry since it'll
+ // stop being considered as dragged once it is removed.
+ if (this.isDragging()) {
+ // Since we move out the element to the end of the body while it's being
+ // dragged, we have to make sure that it's removed if it gets destroyed.
+ removeNode(this._rootElement);
+ }
+ removeNode(this._anchor);
+ this._destroyPreview();
+ this._destroyPlaceholder();
+ this._dragDropRegistry.removeDragItem(this);
+ this._removeSubscriptions();
+ this.beforeStarted.complete();
+ this.started.complete();
+ this.released.complete();
+ this.ended.complete();
+ this.entered.complete();
+ this.exited.complete();
+ this.dropped.complete();
+ this._moveEvents.complete();
+ this._handles = [];
+ this._disabledHandles.clear();
+ this._dropContainer = undefined;
+ this._resizeSubscription.unsubscribe();
+ this._parentPositions.clear();
+ this._boundaryElement = this._rootElement = this._ownerSVGElement = this._placeholderTemplate =
+ this._previewTemplate = this._anchor = this._parentDragRef = null;
+ }
+ /** Checks whether the element is currently being dragged. */
+ isDragging() {
+ return this._hasStartedDragging && this._dragDropRegistry.isDragging(this);
+ }
+ /** Resets a standalone drag item to its initial position. */
+ reset() {
+ this._rootElement.style.transform = this._initialTransform || '';
+ this._activeTransform = { x: 0, y: 0 };
+ this._passiveTransform = { x: 0, y: 0 };
+ }
+ /**
+ * Sets a handle as disabled. While a handle is disabled, it'll capture and interrupt dragging.
+ * @param handle Handle element that should be disabled.
+ */
+ disableHandle(handle) {
+ if (!this._disabledHandles.has(handle) && this._handles.indexOf(handle) > -1) {
+ this._disabledHandles.add(handle);
+ toggleNativeDragInteractions(handle, true);
+ }
+ }
+ /**
+ * Enables a handle, if it has been disabled.
+ * @param handle Handle element to be enabled.
+ */
+ enableHandle(handle) {
+ if (this._disabledHandles.has(handle)) {
+ this._disabledHandles.delete(handle);
+ toggleNativeDragInteractions(handle, this.disabled);
+ }
+ }
+ /** Sets the layout direction of the draggable item. */
+ withDirection(direction) {
+ this._direction = direction;
+ return this;
+ }
+ /** Sets the container that the item is part of. */
+ _withDropContainer(container) {
+ this._dropContainer = container;
+ }
+ /**
+ * Gets the current position in pixels the draggable outside of a drop container.
+ */
+ getFreeDragPosition() {
+ const position = this.isDragging() ? this._activeTransform : this._passiveTransform;
+ return { x: position.x, y: position.y };
+ }
+ /**
+ * Sets the current position in pixels the draggable outside of a drop container.
+ * @param value New position to be set.
+ */
+ setFreeDragPosition(value) {
+ this._activeTransform = { x: 0, y: 0 };
+ this._passiveTransform.x = value.x;
+ this._passiveTransform.y = value.y;
+ if (!this._dropContainer) {
+ this._applyRootElementTransform(value.x, value.y);
+ }
+ return this;
+ }
+ /** Updates the item's sort order based on the last-known pointer position. */
+ _sortFromLastPointerPosition() {
+ const position = this._lastKnownPointerPosition;
+ if (position && this._dropContainer) {
+ this._updateActiveDropContainer(this._getConstrainedPointerPosition(position), position);
+ }
+ }
+ /** Unsubscribes from the global subscriptions. */
+ _removeSubscriptions() {
+ this._pointerMoveSubscription.unsubscribe();
+ this._pointerUpSubscription.unsubscribe();
+ this._scrollSubscription.unsubscribe();
+ }
+ /** Destroys the preview element and its ViewRef. */
+ _destroyPreview() {
+ if (this._preview) {
+ removeNode(this._preview);
+ }
+ if (this._previewRef) {
+ this._previewRef.destroy();
+ }
+ this._preview = this._previewRef = null;
+ }
+ /** Destroys the placeholder element and its ViewRef. */
+ _destroyPlaceholder() {
+ if (this._placeholder) {
+ removeNode(this._placeholder);
+ }
+ if (this._placeholderRef) {
+ this._placeholderRef.destroy();
+ }
+ this._placeholder = this._placeholderRef = null;
+ }
+ /**
+ * Clears subscriptions and stops the dragging sequence.
+ * @param event Browser event object that ended the sequence.
+ */
+ _endDragSequence(event) {
+ // Note that here we use `isDragging` from the service, rather than from `this`.
+ // The difference is that the one from the service reflects whether a dragging sequence
+ // has been initiated, whereas the one on `this` includes whether the user has passed
+ // the minimum dragging threshold.
+ if (!this._dragDropRegistry.isDragging(this)) {
+ return;
+ }
+ this._removeSubscriptions();
+ this._dragDropRegistry.stopDragging(this);
+ this._toggleNativeDragInteractions();
+ if (this._handles) {
+ this._rootElement.style.webkitTapHighlightColor = this._rootElementTapHighlight;
+ }
+ if (!this._hasStartedDragging) {
+ return;
+ }
+ this.released.next({ source: this });
+ if (this._dropContainer) {
+ // Stop scrolling immediately, instead of waiting for the animation to finish.
+ this._dropContainer._stopScrolling();
+ this._animatePreviewToPlaceholder().then(() => {
+ this._cleanupDragArtifacts(event);
+ this._cleanupCachedDimensions();
+ this._dragDropRegistry.stopDragging(this);
+ });
+ }
+ else {
+ // Convert the active transform into a passive one. This means that next time
+ // the user starts dragging the item, its position will be calculated relatively
+ // to the new passive transform.
+ this._passiveTransform.x = this._activeTransform.x;
+ this._passiveTransform.y = this._activeTransform.y;
+ this._ngZone.run(() => {
+ this.ended.next({
+ source: this,
+ distance: this._getDragDistance(this._getPointerPositionOnPage(event))
+ });
+ });
+ this._cleanupCachedDimensions();
+ this._dragDropRegistry.stopDragging(this);
+ }
+ }
+ /** Starts the dragging sequence. */
+ _startDragSequence(event) {
+ if (isTouchEvent(event)) {
+ this._lastTouchEventTime = Date.now();
+ }
+ this._toggleNativeDragInteractions();
+ const dropContainer = this._dropContainer;
+ if (dropContainer) {
+ const element = this._rootElement;
+ const parent = element.parentNode;
+ const preview = this._preview = this._createPreviewElement();
+ const placeholder = this._placeholder = this._createPlaceholderElement();
+ const anchor = this._anchor = this._anchor || this._document.createComment('');
+ // Needs to happen before the root element is moved.
+ const shadowRoot = this._getShadowRoot();
+ // Insert an anchor node so that we can restore the element's position in the DOM.
+ parent.insertBefore(anchor, element);
+ // We move the element out at the end of the body and we make it hidden, because keeping it in
+ // place will throw off the consumer's `:last-child` selectors. We can't remove the element
+ // from the DOM completely, because iOS will stop firing all subsequent events in the chain.
+ toggleVisibility(element, false);
+ this._document.body.appendChild(parent.replaceChild(placeholder, element));
+ getPreviewInsertionPoint(this._document, shadowRoot).appendChild(preview);
+ this.started.next({ source: this }); // Emit before notifying the container.
+ dropContainer.start();
+ this._initialContainer = dropContainer;
+ this._initialIndex = dropContainer.getItemIndex(this);
+ }
+ else {
+ this.started.next({ source: this });
+ this._initialContainer = this._initialIndex = undefined;
+ }
+ // Important to run after we've called `start` on the parent container
+ // so that it has had time to resolve its scrollable parents.
+ this._parentPositions.cache(dropContainer ? dropContainer.getScrollableParents() : []);
+ }
+ /**
+ * Sets up the different variables and subscriptions
+ * that will be necessary for the dragging sequence.
+ * @param referenceElement Element that started the drag sequence.
+ * @param event Browser event object that started the sequence.
+ */
+ _initializeDragSequence(referenceElement, event) {
+ // Stop propagation if the item is inside another
+ // draggable so we don't start multiple drag sequences.
+ if (this._parentDragRef) {
+ event.stopPropagation();
+ }
+ const isDragging = this.isDragging();
+ const isTouchSequence = isTouchEvent(event);
+ const isAuxiliaryMouseButton = !isTouchSequence && event.button !== 0;
+ const rootElement = this._rootElement;
+ const isSyntheticEvent = !isTouchSequence && this._lastTouchEventTime &&
+ this._lastTouchEventTime + MOUSE_EVENT_IGNORE_TIME > Date.now();
+ // If the event started from an element with the native HTML drag&drop, it'll interfere
+ // with our own dragging (e.g. `img` tags do it by default). Prevent the default action
+ // to stop it from happening. Note that preventing on `dragstart` also seems to work, but
+ // it's flaky and it fails if the user drags it away quickly. Also note that we only want
+ // to do this for `mousedown` since doing the same for `touchstart` will stop any `click`
+ // events from firing on touch devices.
+ if (event.target && event.target.draggable && event.type === 'mousedown') {
+ event.preventDefault();
+ }
+ // Abort if the user is already dragging or is using a mouse button other than the primary one.
+ if (isDragging || isAuxiliaryMouseButton || isSyntheticEvent) {
+ return;
+ }
+ // If we've got handles, we need to disable the tap highlight on the entire root element,
+ // otherwise iOS will still add it, even though all the drag interactions on the handle
+ // are disabled.
+ if (this._handles.length) {
+ this._rootElementTapHighlight = rootElement.style.webkitTapHighlightColor || '';
+ rootElement.style.webkitTapHighlightColor = 'transparent';
+ }
+ this._hasStartedDragging = this._hasMoved = false;
+ // Avoid multiple subscriptions and memory leaks when multi touch
+ // (isDragging check above isn't enough because of possible temporal and/or dimensional delays)
+ this._removeSubscriptions();
+ this._pointerMoveSubscription = this._dragDropRegistry.pointerMove.subscribe(this._pointerMove);
+ this._pointerUpSubscription = this._dragDropRegistry.pointerUp.subscribe(this._pointerUp);
+ this._scrollSubscription = this._dragDropRegistry.scroll.subscribe(scrollEvent => {
+ this._updateOnScroll(scrollEvent);
+ });
+ if (this._boundaryElement) {
+ this._boundaryRect = getMutableClientRect(this._boundaryElement);
+ }
+ // If we have a custom preview we can't know ahead of time how large it'll be so we position
+ // it next to the cursor. The exception is when the consumer has opted into making the preview
+ // the same size as the root element, in which case we do know the size.
+ const previewTemplate = this._previewTemplate;
+ this._pickupPositionInElement = previewTemplate && previewTemplate.template &&
+ !previewTemplate.matchSize ? { x: 0, y: 0 } :
+ this._getPointerPositionInElement(referenceElement, event);
+ const pointerPosition = this._pickupPositionOnPage = this._lastKnownPointerPosition =
+ this._getPointerPositionOnPage(event);
+ this._pointerDirectionDelta = { x: 0, y: 0 };
+ this._pointerPositionAtLastDirectionChange = { x: pointerPosition.x, y: pointerPosition.y };
+ this._dragStartTime = Date.now();
+ this._dragDropRegistry.startDragging(this, event);
+ }
+ /** Cleans up the DOM artifacts that were added to facilitate the element being dragged. */
+ _cleanupDragArtifacts(event) {
+ // Restore the element's visibility and insert it at its old position in the DOM.
+ // It's important that we maintain the position, because moving the element around in the DOM
+ // can throw off `NgFor` which does smart diffing and re-creates elements only when necessary,
+ // while moving the existing elements in all other cases.
+ toggleVisibility(this._rootElement, true);
+ this._anchor.parentNode.replaceChild(this._rootElement, this._anchor);
+ this._destroyPreview();
+ this._destroyPlaceholder();
+ this._boundaryRect = this._previewRect = undefined;
+ // Re-enter the NgZone since we bound `document` events on the outside.
+ this._ngZone.run(() => {
+ const container = this._dropContainer;
+ const currentIndex = container.getItemIndex(this);
+ const pointerPosition = this._getPointerPositionOnPage(event);
+ const distance = this._getDragDistance(this._getPointerPositionOnPage(event));
+ const isPointerOverContainer = container._isOverContainer(pointerPosition.x, pointerPosition.y);
+ this.ended.next({ source: this, distance });
+ this.dropped.next({
+ item: this,
+ currentIndex,
+ previousIndex: this._initialIndex,
+ container: container,
+ previousContainer: this._initialContainer,
+ isPointerOverContainer,
+ distance
+ });
+ container.drop(this, currentIndex, this._initialIndex, this._initialContainer, isPointerOverContainer, distance);
+ this._dropContainer = this._initialContainer;
+ });
+ }
+ /**
+ * Updates the item's position in its drop container, or moves it
+ * into a new one, depending on its current drag position.
+ */
+ _updateActiveDropContainer({ x, y }, { x: rawX, y: rawY }) {
+ // Drop container that draggable has been moved into.
+ let newContainer = this._initialContainer._getSiblingContainerFromPosition(this, x, y);
+ // If we couldn't find a new container to move the item into, and the item has left its
+ // initial container, check whether the it's over the initial container. This handles the
+ // case where two containers are connected one way and the user tries to undo dragging an
+ // item into a new container.
+ if (!newContainer && this._dropContainer !== this._initialContainer &&
+ this._initialContainer._isOverContainer(x, y)) {
+ newContainer = this._initialContainer;
+ }
+ if (newContainer && newContainer !== this._dropContainer) {
+ this._ngZone.run(() => {
+ // Notify the old container that the item has left.
+ this.exited.next({ item: this, container: this._dropContainer });
+ this._dropContainer.exit(this);
+ // Notify the new container that the item has entered.
+ this._dropContainer = newContainer;
+ this._dropContainer.enter(this, x, y, newContainer === this._initialContainer &&
+ // If we're re-entering the initial container and sorting is disabled,
+ // put item the into its starting index to begin with.
+ newContainer.sortingDisabled ? this._initialIndex : undefined);
+ this.entered.next({
+ item: this,
+ container: newContainer,
+ currentIndex: newContainer.getItemIndex(this)
+ });
+ });
+ }
+ this._dropContainer._startScrollingIfNecessary(rawX, rawY);
+ this._dropContainer._sortItem(this, x, y, this._pointerDirectionDelta);
+ this._preview.style.transform =
+ getTransform(x - this._pickupPositionInElement.x, y - this._pickupPositionInElement.y);
+ }
+ /**
+ * Creates the element that will be rendered next to the user's pointer
+ * and will be used as a preview of the element that is being dragged.
+ */
+ _createPreviewElement() {
+ const previewConfig = this._previewTemplate;
+ const previewClass = this.previewClass;
+ const previewTemplate = previewConfig ? previewConfig.template : null;
+ let preview;
+ if (previewTemplate && previewConfig) {
+ // Measure the element before we've inserted the preview
+ // since the insertion could throw off the measurement.
+ const rootRect = previewConfig.matchSize ? this._rootElement.getBoundingClientRect() : null;
+ const viewRef = previewConfig.viewContainer.createEmbeddedView(previewTemplate, previewConfig.context);
+ viewRef.detectChanges();
+ preview = getRootNode(viewRef, this._document);
+ this._previewRef = viewRef;
+ if (previewConfig.matchSize) {
+ matchElementSize(preview, rootRect);
+ }
+ else {
+ preview.style.transform =
+ getTransform(this._pickupPositionOnPage.x, this._pickupPositionOnPage.y);
+ }
+ }
+ else {
+ const element = this._rootElement;
+ preview = deepCloneNode(element);
+ matchElementSize(preview, element.getBoundingClientRect());
+ }
+ extendStyles(preview.style, {
+ // It's important that we disable the pointer events on the preview, because
+ // it can throw off the `document.elementFromPoint` calls in the `CdkDropList`.
+ pointerEvents: 'none',
+ // We have to reset the margin, because it can throw off positioning relative to the viewport.
+ margin: '0',
+ position: 'fixed',
+ top: '0',
+ left: '0',
+ zIndex: `${this._config.zIndex || 1000}`
+ });
+ toggleNativeDragInteractions(preview, false);
+ preview.classList.add('cdk-drag-preview');
+ preview.setAttribute('dir', this._direction);
+ if (previewClass) {
+ if (Array.isArray(previewClass)) {
+ previewClass.forEach(className => preview.classList.add(className));
+ }
+ else {
+ preview.classList.add(previewClass);
+ }
+ }
+ return preview;
+ }
+ /**
+ * Animates the preview element from its current position to the location of the drop placeholder.
+ * @returns Promise that resolves when the animation completes.
+ */
+ _animatePreviewToPlaceholder() {
+ // If the user hasn't moved yet, the transitionend event won't fire.
+ if (!this._hasMoved) {
+ return Promise.resolve();
+ }
+ const placeholderRect = this._placeholder.getBoundingClientRect();
+ // Apply the class that adds a transition to the preview.
+ this._preview.classList.add('cdk-drag-animating');
+ // Move the preview to the placeholder position.
+ this._preview.style.transform = getTransform(placeholderRect.left, placeholderRect.top);
+ // If the element doesn't have a `transition`, the `transitionend` event won't fire. Since
+ // we need to trigger a style recalculation in order for the `cdk-drag-animating` class to
+ // apply its style, we take advantage of the available info to figure out whether we need to
+ // bind the event in the first place.
+ const duration = getTransformTransitionDurationInMs(this._preview);
+ if (duration === 0) {
+ return Promise.resolve();
+ }
+ return this._ngZone.runOutsideAngular(() => {
+ return new Promise(resolve => {
+ const handler = ((event) => {
+ if (!event || (event.target === this._preview && event.propertyName === 'transform')) {
+ this._preview.removeEventListener('transitionend', handler);
+ resolve();
+ clearTimeout(timeout);
+ }
+ });
+ // If a transition is short enough, the browser might not fire the `transitionend` event.
+ // Since we know how long it's supposed to take, add a timeout with a 50% buffer that'll
+ // fire if the transition hasn't completed when it was supposed to.
+ const timeout = setTimeout(handler, duration * 1.5);
+ this._preview.addEventListener('transitionend', handler);
+ });
+ });
+ }
+ /** Creates an element that will be shown instead of the current element while dragging. */
+ _createPlaceholderElement() {
+ const placeholderConfig = this._placeholderTemplate;
+ const placeholderTemplate = placeholderConfig ? placeholderConfig.template : null;
+ let placeholder;
+ if (placeholderTemplate) {
+ this._placeholderRef = placeholderConfig.viewContainer.createEmbeddedView(placeholderTemplate, placeholderConfig.context);
+ this._placeholderRef.detectChanges();
+ placeholder = getRootNode(this._placeholderRef, this._document);
+ }
+ else {
+ placeholder = deepCloneNode(this._rootElement);
+ }
+ placeholder.classList.add('cdk-drag-placeholder');
+ return placeholder;
+ }
+ /**
+ * Figures out the coordinates at which an element was picked up.
+ * @param referenceElement Element that initiated the dragging.
+ * @param event Event that initiated the dragging.
+ */
+ _getPointerPositionInElement(referenceElement, event) {
+ const elementRect = this._rootElement.getBoundingClientRect();
+ const handleElement = referenceElement === this._rootElement ? null : referenceElement;
+ const referenceRect = handleElement ? handleElement.getBoundingClientRect() : elementRect;
+ const point = isTouchEvent(event) ? event.targetTouches[0] : event;
+ const scrollPosition = this._getViewportScrollPosition();
+ const x = point.pageX - referenceRect.left - scrollPosition.left;
+ const y = point.pageY - referenceRect.top - scrollPosition.top;
+ return {
+ x: referenceRect.left - elementRect.left + x,
+ y: referenceRect.top - elementRect.top + y
+ };
+ }
+ /** Determines the point of the page that was touched by the user. */
+ _getPointerPositionOnPage(event) {
+ const scrollPosition = this._getViewportScrollPosition();
+ const point = isTouchEvent(event) ?
+ // `touches` will be empty for start/end events so we have to fall back to `changedTouches`.
+ // Also note that on real devices we're guaranteed for either `touches` or `changedTouches`
+ // to have a value, but Firefox in device emulation mode has a bug where both can be empty
+ // for `touchstart` and `touchend` so we fall back to a dummy object in order to avoid
+ // throwing an error. The value returned here will be incorrect, but since this only
+ // breaks inside a developer tool and the value is only used for secondary information,
+ // we can get away with it. See https://bugzilla.mozilla.org/show_bug.cgi?id=1615824.
+ (event.touches[0] || event.changedTouches[0] || { pageX: 0, pageY: 0 }) : event;
+ const x = point.pageX - scrollPosition.left;
+ const y = point.pageY - scrollPosition.top;
+ // if dragging SVG element, try to convert from the screen coordinate system to the SVG
+ // coordinate system
+ if (this._ownerSVGElement) {
+ const svgMatrix = this._ownerSVGElement.getScreenCTM();
+ if (svgMatrix) {
+ const svgPoint = this._ownerSVGElement.createSVGPoint();
+ svgPoint.x = x;
+ svgPoint.y = y;
+ return svgPoint.matrixTransform(svgMatrix.inverse());
+ }
+ }
+ return { x, y };
+ }
+ /** Gets the pointer position on the page, accounting for any position constraints. */
+ _getConstrainedPointerPosition(point) {
+ const dropContainerLock = this._dropContainer ? this._dropContainer.lockAxis : null;
+ let { x, y } = this.constrainPosition ? this.constrainPosition(point, this) : point;
+ if (this.lockAxis === 'x' || dropContainerLock === 'x') {
+ y = this._pickupPositionOnPage.y;
+ }
+ else if (this.lockAxis === 'y' || dropContainerLock === 'y') {
+ x = this._pickupPositionOnPage.x;
+ }
+ if (this._boundaryRect) {
+ const { x: pickupX, y: pickupY } = this._pickupPositionInElement;
+ const boundaryRect = this._boundaryRect;
+ const previewRect = this._previewRect;
+ const minY = boundaryRect.top + pickupY;
+ const maxY = boundaryRect.bottom - (previewRect.height - pickupY);
+ const minX = boundaryRect.left + pickupX;
+ const maxX = boundaryRect.right - (previewRect.width - pickupX);
+ x = clamp(x, minX, maxX);
+ y = clamp(y, minY, maxY);
+ }
+ return { x, y };
+ }
+ /** Updates the current drag delta, based on the user's current pointer position on the page. */
+ _updatePointerDirectionDelta(pointerPositionOnPage) {
+ const { x, y } = pointerPositionOnPage;
+ const delta = this._pointerDirectionDelta;
+ const positionSinceLastChange = this._pointerPositionAtLastDirectionChange;
+ // Amount of pixels the user has dragged since the last time the direction changed.
+ const changeX = Math.abs(x - positionSinceLastChange.x);
+ const changeY = Math.abs(y - positionSinceLastChange.y);
+ // Because we handle pointer events on a per-pixel basis, we don't want the delta
+ // to change for every pixel, otherwise anything that depends on it can look erratic.
+ // To make the delta more consistent, we track how much the user has moved since the last
+ // delta change and we only update it after it has reached a certain threshold.
+ if (changeX > this._config.pointerDirectionChangeThreshold) {
+ delta.x = x > positionSinceLastChange.x ? 1 : -1;
+ positionSinceLastChange.x = x;
+ }
+ if (changeY > this._config.pointerDirectionChangeThreshold) {
+ delta.y = y > positionSinceLastChange.y ? 1 : -1;
+ positionSinceLastChange.y = y;
+ }
+ return delta;
+ }
+ /** Toggles the native drag interactions, based on how many handles are registered. */
+ _toggleNativeDragInteractions() {
+ if (!this._rootElement || !this._handles) {
+ return;
+ }
+ const shouldEnable = this._handles.length > 0 || !this.isDragging();
+ if (shouldEnable !== this._nativeInteractionsEnabled) {
+ this._nativeInteractionsEnabled = shouldEnable;
+ toggleNativeDragInteractions(this._rootElement, shouldEnable);
+ }
+ }
+ /** Removes the manually-added event listeners from the root element. */
+ _removeRootElementListeners(element) {
+ element.removeEventListener('mousedown', this._pointerDown, activeEventListenerOptions);
+ element.removeEventListener('touchstart', this._pointerDown, passiveEventListenerOptions);
+ }
+ /**
+ * Applies a `transform` to the root element, taking into account any existing transforms on it.
+ * @param x New transform value along the X axis.
+ * @param y New transform value along the Y axis.
+ */
+ _applyRootElementTransform(x, y) {
+ const transform = getTransform(x, y);
+ // Cache the previous transform amount only after the first drag sequence, because
+ // we don't want our own transforms to stack on top of each other.
+ if (this._initialTransform == null) {
+ this._initialTransform = this._rootElement.style.transform || '';
+ }
+ // Preserve the previous `transform` value, if there was one. Note that we apply our own
+ // transform before the user's, because things like rotation can affect which direction
+ // the element will be translated towards.
+ this._rootElement.style.transform = this._initialTransform ?
+ transform + ' ' + this._initialTransform : transform;
+ }
+ /**
+ * Gets the distance that the user has dragged during the current drag sequence.
+ * @param currentPosition Current position of the user's pointer.
+ */
+ _getDragDistance(currentPosition) {
+ const pickupPosition = this._pickupPositionOnPage;
+ if (pickupPosition) {
+ return { x: currentPosition.x - pickupPosition.x, y: currentPosition.y - pickupPosition.y };
+ }
+ return { x: 0, y: 0 };
+ }
+ /** Cleans up any cached element dimensions that we don't need after dragging has stopped. */
+ _cleanupCachedDimensions() {
+ this._boundaryRect = this._previewRect = undefined;
+ this._parentPositions.clear();
+ }
+ /**
+ * Checks whether the element is still inside its boundary after the viewport has been resized.
+ * If not, the position is adjusted so that the element fits again.
+ */
+ _containInsideBoundaryOnResize() {
+ let { x, y } = this._passiveTransform;
+ if ((x === 0 && y === 0) || this.isDragging() || !this._boundaryElement) {
+ return;
+ }
+ const boundaryRect = this._boundaryElement.getBoundingClientRect();
+ const elementRect = this._rootElement.getBoundingClientRect();
+ // It's possible that the element got hidden away after dragging (e.g. by switching to a
+ // different tab). Don't do anything in this case so we don't clear the user's position.
+ if ((boundaryRect.width === 0 && boundaryRect.height === 0) ||
+ (elementRect.width === 0 && elementRect.height === 0)) {
+ return;
+ }
+ const leftOverflow = boundaryRect.left - elementRect.left;
+ const rightOverflow = elementRect.right - boundaryRect.right;
+ const topOverflow = boundaryRect.top - elementRect.top;
+ const bottomOverflow = elementRect.bottom - boundaryRect.bottom;
+ // If the element has become wider than the boundary, we can't
+ // do much to make it fit so we just anchor it to the left.
+ if (boundaryRect.width > elementRect.width) {
+ if (leftOverflow > 0) {
+ x += leftOverflow;
+ }
+ if (rightOverflow > 0) {
+ x -= rightOverflow;
+ }
+ }
+ else {
+ x = 0;
+ }
+ // If the element has become taller than the boundary, we can't
+ // do much to make it fit so we just anchor it to the top.
+ if (boundaryRect.height > elementRect.height) {
+ if (topOverflow > 0) {
+ y += topOverflow;
+ }
+ if (bottomOverflow > 0) {
+ y -= bottomOverflow;
+ }
+ }
+ else {
+ y = 0;
+ }
+ if (x !== this._passiveTransform.x || y !== this._passiveTransform.y) {
+ this.setFreeDragPosition({ y, x });
+ }
+ }
+ /** Gets the drag start delay, based on the event type. */
+ _getDragStartDelay(event) {
+ const value = this.dragStartDelay;
+ if (typeof value === 'number') {
+ return value;
+ }
+ else if (isTouchEvent(event)) {
+ return value.touch;
+ }
+ return value ? value.mouse : 0;
+ }
+ /** Updates the internal state of the draggable element when scrolling has occurred. */
+ _updateOnScroll(event) {
+ const scrollDifference = this._parentPositions.handleScroll(event);
+ if (scrollDifference) {
+ const target = event.target;
+ // ClientRect dimensions are based on the scroll position of the page and its parent node so
+ // we have to update the cached boundary ClientRect if the user has scrolled. Check for
+ // the `document` specifically since IE doesn't support `contains` on it.
+ if (this._boundaryRect && (target === this._document ||
+ (target !== this._boundaryElement && target.contains(this._boundaryElement)))) {
+ adjustClientRect(this._boundaryRect, scrollDifference.top, scrollDifference.left);
+ }
+ this._pickupPositionOnPage.x += scrollDifference.left;
+ this._pickupPositionOnPage.y += scrollDifference.top;
+ // If we're in free drag mode, we have to update the active transform, because
+ // it isn't relative to the viewport like the preview inside a drop list.
+ if (!this._dropContainer) {
+ this._activeTransform.x -= scrollDifference.left;
+ this._activeTransform.y -= scrollDifference.top;
+ this._applyRootElementTransform(this._activeTransform.x, this._activeTransform.y);
+ }
+ }
+ }
+ /** Gets the scroll position of the viewport. */
+ _getViewportScrollPosition() {
+ const cachedPosition = this._parentPositions.positions.get(this._document);
+ return cachedPosition ? cachedPosition.scrollPosition :
+ this._viewportRuler.getViewportScrollPosition();
+ }
+ /**
+ * Lazily resolves and returns the shadow root of the element. We do this in a function, rather
+ * than saving it in property directly on init, because we want to resolve it as late as possible
+ * in order to ensure that the element has been moved into the shadow DOM. Doing it inside the
+ * constructor might be too early if the element is inside of something like `ngFor` or `ngIf`.
+ */
+ _getShadowRoot() {
+ if (this._cachedShadowRoot === undefined) {
+ this._cachedShadowRoot = Object(_angular_cdk_platform__WEBPACK_IMPORTED_MODULE_3__["_getShadowRoot"])(this._rootElement);
+ }
+ return this._cachedShadowRoot;
+ }
+}
+/**
+ * Gets a 3d `transform` that can be applied to an element.
+ * @param x Desired position of the element along the X axis.
+ * @param y Desired position of the element along the Y axis.
+ */
+function getTransform(x, y) {
+ // Round the transforms since some browsers will
+ // blur the elements for sub-pixel transforms.
+ return `translate3d(${Math.round(x)}px, ${Math.round(y)}px, 0)`;
+}
+/** Clamps a value between a minimum and a maximum. */
+function clamp(value, min, max) {
+ return Math.max(min, Math.min(max, value));
+}
+/**
+ * Helper to remove a node from the DOM and to do all the necessary null checks.
+ * @param node Node to be removed.
+ */
+function removeNode(node) {
+ if (node && node.parentNode) {
+ node.parentNode.removeChild(node);
+ }
+}
+/** Determines whether an event is a touch event. */
+function isTouchEvent(event) {
+ // This function is called for every pixel that the user has dragged so we need it to be
+ // as fast as possible. Since we only bind mouse events and touch events, we can assume
+ // that if the event's name starts with `t`, it's a touch event.
+ return event.type[0] === 't';
+}
+/** Gets the element into which the drag preview should be inserted. */
+function getPreviewInsertionPoint(documentRef, shadowRoot) {
+ // We can't use the body if the user is in fullscreen mode,
+ // because the preview will render under the fullscreen element.
+ // TODO(crisbeto): dedupe this with the `FullscreenOverlayContainer` eventually.
+ return shadowRoot ||
+ documentRef.fullscreenElement ||
+ documentRef.webkitFullscreenElement ||
+ documentRef.mozFullScreenElement ||
+ documentRef.msFullscreenElement ||
+ documentRef.body;
+}
+/**
+ * Gets the root HTML element of an embedded view.
+ * If the root is not an HTML element it gets wrapped in one.
+ */
+function getRootNode(viewRef, _document) {
+ const rootNodes = viewRef.rootNodes;
+ if (rootNodes.length === 1 && rootNodes[0].nodeType === _document.ELEMENT_NODE) {
+ return rootNodes[0];
+ }
+ const wrapper = _document.createElement('div');
+ rootNodes.forEach(node => wrapper.appendChild(node));
+ return wrapper;
+}
+/**
+ * Matches the target element's size to the source's size.
+ * @param target Element that needs to be resized.
+ * @param sourceRect Dimensions of the source element.
+ */
+function matchElementSize(target, sourceRect) {
+ target.style.width = `${sourceRect.width}px`;
+ target.style.height = `${sourceRect.height}px`;
+ target.style.transform = getTransform(sourceRect.left, sourceRect.top);
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * Moves an item one index in an array to another.
+ * @param array Array in which to move the item.
+ * @param fromIndex Starting index of the item.
+ * @param toIndex Index to which the item should be moved.
+ */
+function moveItemInArray(array, fromIndex, toIndex) {
+ const from = clamp$1(fromIndex, array.length - 1);
+ const to = clamp$1(toIndex, array.length - 1);
+ if (from === to) {
+ return;
+ }
+ const target = array[from];
+ const delta = to < from ? -1 : 1;
+ for (let i = from; i !== to; i += delta) {
+ array[i] = array[i + delta];
+ }
+ array[to] = target;
+}
+/**
+ * Moves an item from one array to another.
+ * @param currentArray Array from which to transfer the item.
+ * @param targetArray Array into which to put the item.
+ * @param currentIndex Index of the item in its current array.
+ * @param targetIndex Index at which to insert the item.
+ */
+function transferArrayItem(currentArray, targetArray, currentIndex, targetIndex) {
+ const from = clamp$1(currentIndex, currentArray.length - 1);
+ const to = clamp$1(targetIndex, targetArray.length);
+ if (currentArray.length) {
+ targetArray.splice(to, 0, currentArray.splice(from, 1)[0]);
+ }
+}
+/**
+ * Copies an item from one array to another, leaving it in its
+ * original position in current array.
+ * @param currentArray Array from which to copy the item.
+ * @param targetArray Array into which is copy the item.
+ * @param currentIndex Index of the item in its current array.
+ * @param targetIndex Index at which to insert the item.
+ *
+ */
+function copyArrayItem(currentArray, targetArray, currentIndex, targetIndex) {
+ const to = clamp$1(targetIndex, targetArray.length);
+ if (currentArray.length) {
+ targetArray.splice(to, 0, currentArray[currentIndex]);
+ }
+}
+/** Clamps a number between zero and a maximum. */
+function clamp$1(value, max) {
+ return Math.max(0, Math.min(max, value));
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * Proximity, as a ratio to width/height, at which a
+ * dragged item will affect the drop container.
+ */
+const DROP_PROXIMITY_THRESHOLD = 0.05;
+/**
+ * Proximity, as a ratio to width/height at which to start auto-scrolling the drop list or the
+ * viewport. The value comes from trying it out manually until it feels right.
+ */
+const SCROLL_PROXIMITY_THRESHOLD = 0.05;
+/**
+ * Reference to a drop list. Used to manipulate or dispose of the container.
+ */
+class DropListRef {
+ constructor(element, _dragDropRegistry, _document, _ngZone, _viewportRuler) {
+ this._dragDropRegistry = _dragDropRegistry;
+ this._ngZone = _ngZone;
+ this._viewportRuler = _viewportRuler;
+ /** Whether starting a dragging sequence from this container is disabled. */
+ this.disabled = false;
+ /** Whether sorting items within the list is disabled. */
+ this.sortingDisabled = false;
+ /**
+ * Whether auto-scrolling the view when the user
+ * moves their pointer close to the edges is disabled.
+ */
+ this.autoScrollDisabled = false;
+ /** Number of pixels to scroll for each frame when auto-scrolling an element. */
+ this.autoScrollStep = 2;
+ /**
+ * Function that is used to determine whether an item
+ * is allowed to be moved into a drop container.
+ */
+ this.enterPredicate = () => true;
+ /** Functions that is used to determine whether an item can be sorted into a particular index. */
+ this.sortPredicate = () => true;
+ /** Emits right before dragging has started. */
+ this.beforeStarted = new rxjs__WEBPACK_IMPORTED_MODULE_5__["Subject"]();
+ /**
+ * Emits when the user has moved a new drag item into this container.
+ */
+ this.entered = new rxjs__WEBPACK_IMPORTED_MODULE_5__["Subject"]();
+ /**
+ * Emits when the user removes an item from the container
+ * by dragging it into another container.
+ */
+ this.exited = new rxjs__WEBPACK_IMPORTED_MODULE_5__["Subject"]();
+ /** Emits when the user drops an item inside the container. */
+ this.dropped = new rxjs__WEBPACK_IMPORTED_MODULE_5__["Subject"]();
+ /** Emits as the user is swapping items while actively dragging. */
+ this.sorted = new rxjs__WEBPACK_IMPORTED_MODULE_5__["Subject"]();
+ /** Whether an item in the list is being dragged. */
+ this._isDragging = false;
+ /** Cache of the dimensions of all the items inside the container. */
+ this._itemPositions = [];
+ /**
+ * Keeps track of the item that was last swapped with the dragged item, as well as what direction
+ * the pointer was moving in when the swap occured and whether the user's pointer continued to
+ * overlap with the swapped item after the swapping occurred.
+ */
+ this._previousSwap = { drag: null, delta: 0, overlaps: false };
+ /** Draggable items in the container. */
+ this._draggables = [];
+ /** Drop lists that are connected to the current one. */
+ this._siblings = [];
+ /** Direction in which the list is oriented. */
+ this._orientation = 'vertical';
+ /** Connected siblings that currently have a dragged item. */
+ this._activeSiblings = new Set();
+ /** Layout direction of the drop list. */
+ this._direction = 'ltr';
+ /** Subscription to the window being scrolled. */
+ this._viewportScrollSubscription = rxjs__WEBPACK_IMPORTED_MODULE_5__["Subscription"].EMPTY;
+ /** Vertical direction in which the list is currently scrolling. */
+ this._verticalScrollDirection = 0 /* NONE */;
+ /** Horizontal direction in which the list is currently scrolling. */
+ this._horizontalScrollDirection = 0 /* NONE */;
+ /** Used to signal to the current auto-scroll sequence when to stop. */
+ this._stopScrollTimers = new rxjs__WEBPACK_IMPORTED_MODULE_5__["Subject"]();
+ /** Shadow root of the current element. Necessary for `elementFromPoint` to resolve correctly. */
+ this._cachedShadowRoot = null;
+ /** Starts the interval that'll auto-scroll the element. */
+ this._startScrollInterval = () => {
+ this._stopScrolling();
+ Object(rxjs__WEBPACK_IMPORTED_MODULE_5__["interval"])(0, rxjs__WEBPACK_IMPORTED_MODULE_5__["animationFrameScheduler"])
+ .pipe(Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_6__["takeUntil"])(this._stopScrollTimers))
+ .subscribe(() => {
+ const node = this._scrollNode;
+ const scrollStep = this.autoScrollStep;
+ if (this._verticalScrollDirection === 1 /* UP */) {
+ incrementVerticalScroll(node, -scrollStep);
+ }
+ else if (this._verticalScrollDirection === 2 /* DOWN */) {
+ incrementVerticalScroll(node, scrollStep);
+ }
+ if (this._horizontalScrollDirection === 1 /* LEFT */) {
+ incrementHorizontalScroll(node, -scrollStep);
+ }
+ else if (this._horizontalScrollDirection === 2 /* RIGHT */) {
+ incrementHorizontalScroll(node, scrollStep);
+ }
+ });
+ };
+ this.element = Object(_angular_cdk_coercion__WEBPACK_IMPORTED_MODULE_4__["coerceElement"])(element);
+ this._document = _document;
+ this.withScrollableParents([this.element]);
+ _dragDropRegistry.registerDropContainer(this);
+ this._parentPositions = new ParentPositionTracker(_document, _viewportRuler);
+ }
+ /** Removes the drop list functionality from the DOM element. */
+ dispose() {
+ this._stopScrolling();
+ this._stopScrollTimers.complete();
+ this._viewportScrollSubscription.unsubscribe();
+ this.beforeStarted.complete();
+ this.entered.complete();
+ this.exited.complete();
+ this.dropped.complete();
+ this.sorted.complete();
+ this._activeSiblings.clear();
+ this._scrollNode = null;
+ this._parentPositions.clear();
+ this._dragDropRegistry.removeDropContainer(this);
+ }
+ /** Whether an item from this list is currently being dragged. */
+ isDragging() {
+ return this._isDragging;
+ }
+ /** Starts dragging an item. */
+ start() {
+ this._draggingStarted();
+ this._notifyReceivingSiblings();
+ }
+ /**
+ * Emits an event to indicate that the user moved an item into the container.
+ * @param item Item that was moved into the container.
+ * @param pointerX Position of the item along the X axis.
+ * @param pointerY Position of the item along the Y axis.
+ * @param index Index at which the item entered. If omitted, the container will try to figure it
+ * out automatically.
+ */
+ enter(item, pointerX, pointerY, index) {
+ this._draggingStarted();
+ // If sorting is disabled, we want the item to return to its starting
+ // position if the user is returning it to its initial container.
+ let newIndex;
+ if (index == null) {
+ newIndex = this.sortingDisabled ? this._draggables.indexOf(item) : -1;
+ if (newIndex === -1) {
+ // We use the coordinates of where the item entered the drop
+ // zone to figure out at which index it should be inserted.
+ newIndex = this._getItemIndexFromPointerPosition(item, pointerX, pointerY);
+ }
+ }
+ else {
+ newIndex = index;
+ }
+ const activeDraggables = this._activeDraggables;
+ const currentIndex = activeDraggables.indexOf(item);
+ const placeholder = item.getPlaceholderElement();
+ let newPositionReference = activeDraggables[newIndex];
+ // If the item at the new position is the same as the item that is being dragged,
+ // it means that we're trying to restore the item to its initial position. In this
+ // case we should use the next item from the list as the reference.
+ if (newPositionReference === item) {
+ newPositionReference = activeDraggables[newIndex + 1];
+ }
+ // Since the item may be in the `activeDraggables` already (e.g. if the user dragged it
+ // into another container and back again), we have to ensure that it isn't duplicated.
+ if (currentIndex > -1) {
+ activeDraggables.splice(currentIndex, 1);
+ }
+ // Don't use items that are being dragged as a reference, because
+ // their element has been moved down to the bottom of the body.
+ if (newPositionReference && !this._dragDropRegistry.isDragging(newPositionReference)) {
+ const element = newPositionReference.getRootElement();
+ element.parentElement.insertBefore(placeholder, element);
+ activeDraggables.splice(newIndex, 0, item);
+ }
+ else if (this._shouldEnterAsFirstChild(pointerX, pointerY)) {
+ const reference = activeDraggables[0].getRootElement();
+ reference.parentNode.insertBefore(placeholder, reference);
+ activeDraggables.unshift(item);
+ }
+ else {
+ Object(_angular_cdk_coercion__WEBPACK_IMPORTED_MODULE_4__["coerceElement"])(this.element).appendChild(placeholder);
+ activeDraggables.push(item);
+ }
+ // The transform needs to be cleared so it doesn't throw off the measurements.
+ placeholder.style.transform = '';
+ // Note that the positions were already cached when we called `start` above,
+ // but we need to refresh them since the amount of items has changed and also parent rects.
+ this._cacheItemPositions();
+ this._cacheParentPositions();
+ // Notify siblings at the end so that the item has been inserted into the `activeDraggables`.
+ this._notifyReceivingSiblings();
+ this.entered.next({ item, container: this, currentIndex: this.getItemIndex(item) });
+ }
+ /**
+ * Removes an item from the container after it was dragged into another container by the user.
+ * @param item Item that was dragged out.
+ */
+ exit(item) {
+ this._reset();
+ this.exited.next({ item, container: this });
+ }
+ /**
+ * Drops an item into this container.
+ * @param item Item being dropped into the container.
+ * @param currentIndex Index at which the item should be inserted.
+ * @param previousIndex Index of the item when dragging started.
+ * @param previousContainer Container from which the item got dragged in.
+ * @param isPointerOverContainer Whether the user's pointer was over the
+ * container when the item was dropped.
+ * @param distance Distance the user has dragged since the start of the dragging sequence.
+ */
+ drop(item, currentIndex, previousIndex, previousContainer, isPointerOverContainer, distance) {
+ this._reset();
+ this.dropped.next({
+ item,
+ currentIndex,
+ previousIndex,
+ container: this,
+ previousContainer,
+ isPointerOverContainer,
+ distance
+ });
+ }
+ /**
+ * Sets the draggable items that are a part of this list.
+ * @param items Items that are a part of this list.
+ */
+ withItems(items) {
+ const previousItems = this._draggables;
+ this._draggables = items;
+ items.forEach(item => item._withDropContainer(this));
+ if (this.isDragging()) {
+ const draggedItems = previousItems.filter(item => item.isDragging());
+ // If all of the items being dragged were removed
+ // from the list, abort the current drag sequence.
+ if (draggedItems.every(item => items.indexOf(item) === -1)) {
+ this._reset();
+ }
+ else {
+ this._cacheItems();
+ }
+ }
+ return this;
+ }
+ /** Sets the layout direction of the drop list. */
+ withDirection(direction) {
+ this._direction = direction;
+ return this;
+ }
+ /**
+ * Sets the containers that are connected to this one. When two or more containers are
+ * connected, the user will be allowed to transfer items between them.
+ * @param connectedTo Other containers that the current containers should be connected to.
+ */
+ connectedTo(connectedTo) {
+ this._siblings = connectedTo.slice();
+ return this;
+ }
+ /**
+ * Sets the orientation of the container.
+ * @param orientation New orientation for the container.
+ */
+ withOrientation(orientation) {
+ this._orientation = orientation;
+ return this;
+ }
+ /**
+ * Sets which parent elements are can be scrolled while the user is dragging.
+ * @param elements Elements that can be scrolled.
+ */
+ withScrollableParents(elements) {
+ const element = Object(_angular_cdk_coercion__WEBPACK_IMPORTED_MODULE_4__["coerceElement"])(this.element);
+ // We always allow the current element to be scrollable
+ // so we need to ensure that it's in the array.
+ this._scrollableElements =
+ elements.indexOf(element) === -1 ? [element, ...elements] : elements.slice();
+ return this;
+ }
+ /** Gets the scrollable parents that are registered with this drop container. */
+ getScrollableParents() {
+ return this._scrollableElements;
+ }
+ /**
+ * Figures out the index of an item in the container.
+ * @param item Item whose index should be determined.
+ */
+ getItemIndex(item) {
+ if (!this._isDragging) {
+ return this._draggables.indexOf(item);
+ }
+ // Items are sorted always by top/left in the cache, however they flow differently in RTL.
+ // The rest of the logic still stands no matter what orientation we're in, however
+ // we need to invert the array when determining the index.
+ const items = this._orientation === 'horizontal' && this._direction === 'rtl' ?
+ this._itemPositions.slice().reverse() : this._itemPositions;
+ return findIndex(items, currentItem => currentItem.drag === item);
+ }
+ /**
+ * Whether the list is able to receive the item that
+ * is currently being dragged inside a connected drop list.
+ */
+ isReceiving() {
+ return this._activeSiblings.size > 0;
+ }
+ /**
+ * Sorts an item inside the container based on its position.
+ * @param item Item to be sorted.
+ * @param pointerX Position of the item along the X axis.
+ * @param pointerY Position of the item along the Y axis.
+ * @param pointerDelta Direction in which the pointer is moving along each axis.
+ */
+ _sortItem(item, pointerX, pointerY, pointerDelta) {
+ // Don't sort the item if sorting is disabled or it's out of range.
+ if (this.sortingDisabled || !this._clientRect ||
+ !isPointerNearClientRect(this._clientRect, DROP_PROXIMITY_THRESHOLD, pointerX, pointerY)) {
+ return;
+ }
+ const siblings = this._itemPositions;
+ const newIndex = this._getItemIndexFromPointerPosition(item, pointerX, pointerY, pointerDelta);
+ if (newIndex === -1 && siblings.length > 0) {
+ return;
+ }
+ const isHorizontal = this._orientation === 'horizontal';
+ const currentIndex = findIndex(siblings, currentItem => currentItem.drag === item);
+ const siblingAtNewPosition = siblings[newIndex];
+ const currentPosition = siblings[currentIndex].clientRect;
+ const newPosition = siblingAtNewPosition.clientRect;
+ const delta = currentIndex > newIndex ? 1 : -1;
+ // How many pixels the item's placeholder should be offset.
+ const itemOffset = this._getItemOffsetPx(currentPosition, newPosition, delta);
+ // How many pixels all the other items should be offset.
+ const siblingOffset = this._getSiblingOffsetPx(currentIndex, siblings, delta);
+ // Save the previous order of the items before moving the item to its new index.
+ // We use this to check whether an item has been moved as a result of the sorting.
+ const oldOrder = siblings.slice();
+ // Shuffle the array in place.
+ moveItemInArray(siblings, currentIndex, newIndex);
+ this.sorted.next({
+ previousIndex: currentIndex,
+ currentIndex: newIndex,
+ container: this,
+ item
+ });
+ siblings.forEach((sibling, index) => {
+ // Don't do anything if the position hasn't changed.
+ if (oldOrder[index] === sibling) {
+ return;
+ }
+ const isDraggedItem = sibling.drag === item;
+ const offset = isDraggedItem ? itemOffset : siblingOffset;
+ const elementToOffset = isDraggedItem ? item.getPlaceholderElement() :
+ sibling.drag.getRootElement();
+ // Update the offset to reflect the new position.
+ sibling.offset += offset;
+ // Since we're moving the items with a `transform`, we need to adjust their cached
+ // client rects to reflect their new position, as well as swap their positions in the cache.
+ // Note that we shouldn't use `getBoundingClientRect` here to update the cache, because the
+ // elements may be mid-animation which will give us a wrong result.
+ if (isHorizontal) {
+ // Round the transforms since some browsers will
+ // blur the elements, for sub-pixel transforms.
+ elementToOffset.style.transform = `translate3d(${Math.round(sibling.offset)}px, 0, 0)`;
+ adjustClientRect(sibling.clientRect, 0, offset);
+ }
+ else {
+ elementToOffset.style.transform = `translate3d(0, ${Math.round(sibling.offset)}px, 0)`;
+ adjustClientRect(sibling.clientRect, offset, 0);
+ }
+ });
+ // Note that it's important that we do this after the client rects have been adjusted.
+ this._previousSwap.overlaps = isInsideClientRect(newPosition, pointerX, pointerY);
+ this._previousSwap.drag = siblingAtNewPosition.drag;
+ this._previousSwap.delta = isHorizontal ? pointerDelta.x : pointerDelta.y;
+ }
+ /**
+ * Checks whether the user's pointer is close to the edges of either the
+ * viewport or the drop list and starts the auto-scroll sequence.
+ * @param pointerX User's pointer position along the x axis.
+ * @param pointerY User's pointer position along the y axis.
+ */
+ _startScrollingIfNecessary(pointerX, pointerY) {
+ if (this.autoScrollDisabled) {
+ return;
+ }
+ let scrollNode;
+ let verticalScrollDirection = 0 /* NONE */;
+ let horizontalScrollDirection = 0 /* NONE */;
+ // Check whether we should start scrolling any of the parent containers.
+ this._parentPositions.positions.forEach((position, element) => {
+ // We have special handling for the `document` below. Also this would be
+ // nicer with a for...of loop, but it requires changing a compiler flag.
+ if (element === this._document || !position.clientRect || scrollNode) {
+ return;
+ }
+ if (isPointerNearClientRect(position.clientRect, DROP_PROXIMITY_THRESHOLD, pointerX, pointerY)) {
+ [verticalScrollDirection, horizontalScrollDirection] = getElementScrollDirections(element, position.clientRect, pointerX, pointerY);
+ if (verticalScrollDirection || horizontalScrollDirection) {
+ scrollNode = element;
+ }
+ }
+ });
+ // Otherwise check if we can start scrolling the viewport.
+ if (!verticalScrollDirection && !horizontalScrollDirection) {
+ const { width, height } = this._viewportRuler.getViewportSize();
+ const clientRect = { width, height, top: 0, right: width, bottom: height, left: 0 };
+ verticalScrollDirection = getVerticalScrollDirection(clientRect, pointerY);
+ horizontalScrollDirection = getHorizontalScrollDirection(clientRect, pointerX);
+ scrollNode = window;
+ }
+ if (scrollNode && (verticalScrollDirection !== this._verticalScrollDirection ||
+ horizontalScrollDirection !== this._horizontalScrollDirection ||
+ scrollNode !== this._scrollNode)) {
+ this._verticalScrollDirection = verticalScrollDirection;
+ this._horizontalScrollDirection = horizontalScrollDirection;
+ this._scrollNode = scrollNode;
+ if ((verticalScrollDirection || horizontalScrollDirection) && scrollNode) {
+ this._ngZone.runOutsideAngular(this._startScrollInterval);
+ }
+ else {
+ this._stopScrolling();
+ }
+ }
+ }
+ /** Stops any currently-running auto-scroll sequences. */
+ _stopScrolling() {
+ this._stopScrollTimers.next();
+ }
+ /** Starts the dragging sequence within the list. */
+ _draggingStarted() {
+ const styles = Object(_angular_cdk_coercion__WEBPACK_IMPORTED_MODULE_4__["coerceElement"])(this.element).style;
+ this.beforeStarted.next();
+ this._isDragging = true;
+ // We need to disable scroll snapping while the user is dragging, because it breaks automatic
+ // scrolling. The browser seems to round the value based on the snapping points which means
+ // that we can't increment/decrement the scroll position.
+ this._initialScrollSnap = styles.msScrollSnapType || styles.scrollSnapType || '';
+ styles.scrollSnapType = styles.msScrollSnapType = 'none';
+ this._cacheItems();
+ this._viewportScrollSubscription.unsubscribe();
+ this._listenToScrollEvents();
+ }
+ /** Caches the positions of the configured scrollable parents. */
+ _cacheParentPositions() {
+ const element = Object(_angular_cdk_coercion__WEBPACK_IMPORTED_MODULE_4__["coerceElement"])(this.element);
+ this._parentPositions.cache(this._scrollableElements);
+ // The list element is always in the `scrollableElements`
+ // so we can take advantage of the cached `ClientRect`.
+ this._clientRect = this._parentPositions.positions.get(element).clientRect;
+ }
+ /** Refreshes the position cache of the items and sibling containers. */
+ _cacheItemPositions() {
+ const isHorizontal = this._orientation === 'horizontal';
+ this._itemPositions = this._activeDraggables.map(drag => {
+ const elementToMeasure = drag.getVisibleElement();
+ return { drag, offset: 0, clientRect: getMutableClientRect(elementToMeasure) };
+ }).sort((a, b) => {
+ return isHorizontal ? a.clientRect.left - b.clientRect.left :
+ a.clientRect.top - b.clientRect.top;
+ });
+ }
+ /** Resets the container to its initial state. */
+ _reset() {
+ this._isDragging = false;
+ const styles = Object(_angular_cdk_coercion__WEBPACK_IMPORTED_MODULE_4__["coerceElement"])(this.element).style;
+ styles.scrollSnapType = styles.msScrollSnapType = this._initialScrollSnap;
+ // TODO(crisbeto): may have to wait for the animations to finish.
+ this._activeDraggables.forEach(item => {
+ const rootElement = item.getRootElement();
+ if (rootElement) {
+ rootElement.style.transform = '';
+ }
+ });
+ this._siblings.forEach(sibling => sibling._stopReceiving(this));
+ this._activeDraggables = [];
+ this._itemPositions = [];
+ this._previousSwap.drag = null;
+ this._previousSwap.delta = 0;
+ this._previousSwap.overlaps = false;
+ this._stopScrolling();
+ this._viewportScrollSubscription.unsubscribe();
+ this._parentPositions.clear();
+ }
+ /**
+ * Gets the offset in pixels by which the items that aren't being dragged should be moved.
+ * @param currentIndex Index of the item currently being dragged.
+ * @param siblings All of the items in the list.
+ * @param delta Direction in which the user is moving.
+ */
+ _getSiblingOffsetPx(currentIndex, siblings, delta) {
+ const isHorizontal = this._orientation === 'horizontal';
+ const currentPosition = siblings[currentIndex].clientRect;
+ const immediateSibling = siblings[currentIndex + delta * -1];
+ let siblingOffset = currentPosition[isHorizontal ? 'width' : 'height'] * delta;
+ if (immediateSibling) {
+ const start = isHorizontal ? 'left' : 'top';
+ const end = isHorizontal ? 'right' : 'bottom';
+ // Get the spacing between the start of the current item and the end of the one immediately
+ // after it in the direction in which the user is dragging, or vice versa. We add it to the
+ // offset in order to push the element to where it will be when it's inline and is influenced
+ // by the `margin` of its siblings.
+ if (delta === -1) {
+ siblingOffset -= immediateSibling.clientRect[start] - currentPosition[end];
+ }
+ else {
+ siblingOffset += currentPosition[start] - immediateSibling.clientRect[end];
+ }
+ }
+ return siblingOffset;
+ }
+ /**
+ * Gets the offset in pixels by which the item that is being dragged should be moved.
+ * @param currentPosition Current position of the item.
+ * @param newPosition Position of the item where the current item should be moved.
+ * @param delta Direction in which the user is moving.
+ */
+ _getItemOffsetPx(currentPosition, newPosition, delta) {
+ const isHorizontal = this._orientation === 'horizontal';
+ let itemOffset = isHorizontal ? newPosition.left - currentPosition.left :
+ newPosition.top - currentPosition.top;
+ // Account for differences in the item width/height.
+ if (delta === -1) {
+ itemOffset += isHorizontal ? newPosition.width - currentPosition.width :
+ newPosition.height - currentPosition.height;
+ }
+ return itemOffset;
+ }
+ /**
+ * Checks if pointer is entering in the first position
+ * @param pointerX Position of the user's pointer along the X axis.
+ * @param pointerY Position of the user's pointer along the Y axis.
+ */
+ _shouldEnterAsFirstChild(pointerX, pointerY) {
+ if (!this._activeDraggables.length) {
+ return false;
+ }
+ const itemPositions = this._itemPositions;
+ const isHorizontal = this._orientation === 'horizontal';
+ // `itemPositions` are sorted by position while `activeDraggables` are sorted by child index
+ // check if container is using some sort of "reverse" ordering (eg: flex-direction: row-reverse)
+ const reversed = itemPositions[0].drag !== this._activeDraggables[0];
+ if (reversed) {
+ const lastItemRect = itemPositions[itemPositions.length - 1].clientRect;
+ return isHorizontal ? pointerX >= lastItemRect.right : pointerY >= lastItemRect.bottom;
+ }
+ else {
+ const firstItemRect = itemPositions[0].clientRect;
+ return isHorizontal ? pointerX <= firstItemRect.left : pointerY <= firstItemRect.top;
+ }
+ }
+ /**
+ * Gets the index of an item in the drop container, based on the position of the user's pointer.
+ * @param item Item that is being sorted.
+ * @param pointerX Position of the user's pointer along the X axis.
+ * @param pointerY Position of the user's pointer along the Y axis.
+ * @param delta Direction in which the user is moving their pointer.
+ */
+ _getItemIndexFromPointerPosition(item, pointerX, pointerY, delta) {
+ const isHorizontal = this._orientation === 'horizontal';
+ const index = findIndex(this._itemPositions, ({ drag, clientRect }, _, array) => {
+ if (drag === item) {
+ // If there's only one item left in the container, it must be
+ // the dragged item itself so we use it as a reference.
+ return array.length < 2;
+ }
+ if (delta) {
+ const direction = isHorizontal ? delta.x : delta.y;
+ // If the user is still hovering over the same item as last time, their cursor hasn't left
+ // the item after we made the swap, and they didn't change the direction in which they're
+ // dragging, we don't consider it a direction swap.
+ if (drag === this._previousSwap.drag && this._previousSwap.overlaps &&
+ direction === this._previousSwap.delta) {
+ return false;
+ }
+ }
+ return isHorizontal ?
+ // Round these down since most browsers report client rects with
+ // sub-pixel precision, whereas the pointer coordinates are rounded to pixels.
+ pointerX >= Math.floor(clientRect.left) && pointerX < Math.floor(clientRect.right) :
+ pointerY >= Math.floor(clientRect.top) && pointerY < Math.floor(clientRect.bottom);
+ });
+ return (index === -1 || !this.sortPredicate(index, item, this)) ? -1 : index;
+ }
+ /** Caches the current items in the list and their positions. */
+ _cacheItems() {
+ this._activeDraggables = this._draggables.slice();
+ this._cacheItemPositions();
+ this._cacheParentPositions();
+ }
+ /**
+ * Checks whether the user's pointer is positioned over the container.
+ * @param x Pointer position along the X axis.
+ * @param y Pointer position along the Y axis.
+ */
+ _isOverContainer(x, y) {
+ return this._clientRect != null && isInsideClientRect(this._clientRect, x, y);
+ }
+ /**
+ * Figures out whether an item should be moved into a sibling
+ * drop container, based on its current position.
+ * @param item Drag item that is being moved.
+ * @param x Position of the item along the X axis.
+ * @param y Position of the item along the Y axis.
+ */
+ _getSiblingContainerFromPosition(item, x, y) {
+ return this._siblings.find(sibling => sibling._canReceive(item, x, y));
+ }
+ /**
+ * Checks whether the drop list can receive the passed-in item.
+ * @param item Item that is being dragged into the list.
+ * @param x Position of the item along the X axis.
+ * @param y Position of the item along the Y axis.
+ */
+ _canReceive(item, x, y) {
+ if (!this._clientRect || !isInsideClientRect(this._clientRect, x, y) ||
+ !this.enterPredicate(item, this)) {
+ return false;
+ }
+ const elementFromPoint = this._getShadowRoot().elementFromPoint(x, y);
+ // If there's no element at the pointer position, then
+ // the client rect is probably scrolled out of the view.
+ if (!elementFromPoint) {
+ return false;
+ }
+ const nativeElement = Object(_angular_cdk_coercion__WEBPACK_IMPORTED_MODULE_4__["coerceElement"])(this.element);
+ // The `ClientRect`, that we're using to find the container over which the user is
+ // hovering, doesn't give us any information on whether the element has been scrolled
+ // out of the view or whether it's overlapping with other containers. This means that
+ // we could end up transferring the item into a container that's invisible or is positioned
+ // below another one. We use the result from `elementFromPoint` to get the top-most element
+ // at the pointer position and to find whether it's one of the intersecting drop containers.
+ return elementFromPoint === nativeElement || nativeElement.contains(elementFromPoint);
+ }
+ /**
+ * Called by one of the connected drop lists when a dragging sequence has started.
+ * @param sibling Sibling in which dragging has started.
+ */
+ _startReceiving(sibling, items) {
+ const activeSiblings = this._activeSiblings;
+ if (!activeSiblings.has(sibling) && items.every(item => {
+ // Note that we have to add an exception to the `enterPredicate` for items that started off
+ // in this drop list. The drag ref has logic that allows an item to return to its initial
+ // container, if it has left the initial container and none of the connected containers
+ // allow it to enter. See `DragRef._updateActiveDropContainer` for more context.
+ return this.enterPredicate(item, this) || this._draggables.indexOf(item) > -1;
+ })) {
+ activeSiblings.add(sibling);
+ this._cacheParentPositions();
+ this._listenToScrollEvents();
+ }
+ }
+ /**
+ * Called by a connected drop list when dragging has stopped.
+ * @param sibling Sibling whose dragging has stopped.
+ */
+ _stopReceiving(sibling) {
+ this._activeSiblings.delete(sibling);
+ this._viewportScrollSubscription.unsubscribe();
+ }
+ /**
+ * Starts listening to scroll events on the viewport.
+ * Used for updating the internal state of the list.
+ */
+ _listenToScrollEvents() {
+ this._viewportScrollSubscription = this._dragDropRegistry.scroll.subscribe(event => {
+ if (this.isDragging()) {
+ const scrollDifference = this._parentPositions.handleScroll(event);
+ if (scrollDifference) {
+ // Since we know the amount that the user has scrolled we can shift all of the
+ // client rectangles ourselves. This is cheaper than re-measuring everything and
+ // we can avoid inconsistent behavior where we might be measuring the element before
+ // its position has changed.
+ this._itemPositions.forEach(({ clientRect }) => {
+ adjustClientRect(clientRect, scrollDifference.top, scrollDifference.left);
+ });
+ // We need two loops for this, because we want all of the cached
+ // positions to be up-to-date before we re-sort the item.
+ this._itemPositions.forEach(({ drag }) => {
+ if (this._dragDropRegistry.isDragging(drag)) {
+ // We need to re-sort the item manually, because the pointer move
+ // events won't be dispatched while the user is scrolling.
+ drag._sortFromLastPointerPosition();
+ }
+ });
+ }
+ }
+ else if (this.isReceiving()) {
+ this._cacheParentPositions();
+ }
+ });
+ }
+ /**
+ * Lazily resolves and returns the shadow root of the element. We do this in a function, rather
+ * than saving it in property directly on init, because we want to resolve it as late as possible
+ * in order to ensure that the element has been moved into the shadow DOM. Doing it inside the
+ * constructor might be too early if the element is inside of something like `ngFor` or `ngIf`.
+ */
+ _getShadowRoot() {
+ if (!this._cachedShadowRoot) {
+ const shadowRoot = Object(_angular_cdk_platform__WEBPACK_IMPORTED_MODULE_3__["_getShadowRoot"])(Object(_angular_cdk_coercion__WEBPACK_IMPORTED_MODULE_4__["coerceElement"])(this.element));
+ this._cachedShadowRoot = shadowRoot || this._document;
+ }
+ return this._cachedShadowRoot;
+ }
+ /** Notifies any siblings that may potentially receive the item. */
+ _notifyReceivingSiblings() {
+ const draggedItems = this._activeDraggables.filter(item => item.isDragging());
+ this._siblings.forEach(sibling => sibling._startReceiving(this, draggedItems));
+ }
+}
+/**
+ * Finds the index of an item that matches a predicate function. Used as an equivalent
+ * of `Array.prototype.findIndex` which isn't part of the standard Google typings.
+ * @param array Array in which to look for matches.
+ * @param predicate Function used to determine whether an item is a match.
+ */
+function findIndex(array, predicate) {
+ for (let i = 0; i < array.length; i++) {
+ if (predicate(array[i], i, array)) {
+ return i;
+ }
+ }
+ return -1;
+}
+/**
+ * Increments the vertical scroll position of a node.
+ * @param node Node whose scroll position should change.
+ * @param amount Amount of pixels that the `node` should be scrolled.
+ */
+function incrementVerticalScroll(node, amount) {
+ if (node === window) {
+ node.scrollBy(0, amount);
+ }
+ else {
+ // Ideally we could use `Element.scrollBy` here as well, but IE and Edge don't support it.
+ node.scrollTop += amount;
+ }
+}
+/**
+ * Increments the horizontal scroll position of a node.
+ * @param node Node whose scroll position should change.
+ * @param amount Amount of pixels that the `node` should be scrolled.
+ */
+function incrementHorizontalScroll(node, amount) {
+ if (node === window) {
+ node.scrollBy(amount, 0);
+ }
+ else {
+ // Ideally we could use `Element.scrollBy` here as well, but IE and Edge don't support it.
+ node.scrollLeft += amount;
+ }
+}
+/**
+ * Gets whether the vertical auto-scroll direction of a node.
+ * @param clientRect Dimensions of the node.
+ * @param pointerY Position of the user's pointer along the y axis.
+ */
+function getVerticalScrollDirection(clientRect, pointerY) {
+ const { top, bottom, height } = clientRect;
+ const yThreshold = height * SCROLL_PROXIMITY_THRESHOLD;
+ if (pointerY >= top - yThreshold && pointerY <= top + yThreshold) {
+ return 1 /* UP */;
+ }
+ else if (pointerY >= bottom - yThreshold && pointerY <= bottom + yThreshold) {
+ return 2 /* DOWN */;
+ }
+ return 0 /* NONE */;
+}
+/**
+ * Gets whether the horizontal auto-scroll direction of a node.
+ * @param clientRect Dimensions of the node.
+ * @param pointerX Position of the user's pointer along the x axis.
+ */
+function getHorizontalScrollDirection(clientRect, pointerX) {
+ const { left, right, width } = clientRect;
+ const xThreshold = width * SCROLL_PROXIMITY_THRESHOLD;
+ if (pointerX >= left - xThreshold && pointerX <= left + xThreshold) {
+ return 1 /* LEFT */;
+ }
+ else if (pointerX >= right - xThreshold && pointerX <= right + xThreshold) {
+ return 2 /* RIGHT */;
+ }
+ return 0 /* NONE */;
+}
+/**
+ * Gets the directions in which an element node should be scrolled,
+ * assuming that the user's pointer is already within it scrollable region.
+ * @param element Element for which we should calculate the scroll direction.
+ * @param clientRect Bounding client rectangle of the element.
+ * @param pointerX Position of the user's pointer along the x axis.
+ * @param pointerY Position of the user's pointer along the y axis.
+ */
+function getElementScrollDirections(element, clientRect, pointerX, pointerY) {
+ const computedVertical = getVerticalScrollDirection(clientRect, pointerY);
+ const computedHorizontal = getHorizontalScrollDirection(clientRect, pointerX);
+ let verticalScrollDirection = 0 /* NONE */;
+ let horizontalScrollDirection = 0 /* NONE */;
+ // Note that we here we do some extra checks for whether the element is actually scrollable in
+ // a certain direction and we only assign the scroll direction if it is. We do this so that we
+ // can allow other elements to be scrolled, if the current element can't be scrolled anymore.
+ // This allows us to handle cases where the scroll regions of two scrollable elements overlap.
+ if (computedVertical) {
+ const scrollTop = element.scrollTop;
+ if (computedVertical === 1 /* UP */) {
+ if (scrollTop > 0) {
+ verticalScrollDirection = 1 /* UP */;
+ }
+ }
+ else if (element.scrollHeight - scrollTop > element.clientHeight) {
+ verticalScrollDirection = 2 /* DOWN */;
+ }
+ }
+ if (computedHorizontal) {
+ const scrollLeft = element.scrollLeft;
+ if (computedHorizontal === 1 /* LEFT */) {
+ if (scrollLeft > 0) {
+ horizontalScrollDirection = 1 /* LEFT */;
+ }
+ }
+ else if (element.scrollWidth - scrollLeft > element.clientWidth) {
+ horizontalScrollDirection = 2 /* RIGHT */;
+ }
+ }
+ return [verticalScrollDirection, horizontalScrollDirection];
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/** Event options that can be used to bind an active, capturing event. */
+const activeCapturingEventOptions = Object(_angular_cdk_platform__WEBPACK_IMPORTED_MODULE_3__["normalizePassiveListenerOptions"])({
+ passive: false,
+ capture: true
+});
+/**
+ * Service that keeps track of all the drag item and drop container
+ * instances, and manages global event listeners on the `document`.
+ * @docs-private
+ */
+// Note: this class is generic, rather than referencing CdkDrag and CdkDropList directly, in order
+// to avoid circular imports. If we were to reference them here, importing the registry into the
+// classes that are registering themselves will introduce a circular import.
+class DragDropRegistry {
+ constructor(_ngZone, _document) {
+ this._ngZone = _ngZone;
+ /** Registered drop container instances. */
+ this._dropInstances = new Set();
+ /** Registered drag item instances. */
+ this._dragInstances = new Set();
+ /** Drag item instances that are currently being dragged. */
+ this._activeDragInstances = [];
+ /** Keeps track of the event listeners that we've bound to the `document`. */
+ this._globalListeners = new Map();
+ /**
+ * Predicate function to check if an item is being dragged. Moved out into a property,
+ * because it'll be called a lot and we don't want to create a new function every time.
+ */
+ this._draggingPredicate = (item) => item.isDragging();
+ /**
+ * Emits the `touchmove` or `mousemove` events that are dispatched
+ * while the user is dragging a drag item instance.
+ */
+ this.pointerMove = new rxjs__WEBPACK_IMPORTED_MODULE_5__["Subject"]();
+ /**
+ * Emits the `touchend` or `mouseup` events that are dispatched
+ * while the user is dragging a drag item instance.
+ */
+ this.pointerUp = new rxjs__WEBPACK_IMPORTED_MODULE_5__["Subject"]();
+ /** Emits when the viewport has been scrolled while the user is dragging an item. */
+ this.scroll = new rxjs__WEBPACK_IMPORTED_MODULE_5__["Subject"]();
+ /**
+ * Event listener that will prevent the default browser action while the user is dragging.
+ * @param event Event whose default action should be prevented.
+ */
+ this._preventDefaultWhileDragging = (event) => {
+ if (this._activeDragInstances.length > 0) {
+ event.preventDefault();
+ }
+ };
+ /** Event listener for `touchmove` that is bound even if no dragging is happening. */
+ this._persistentTouchmoveListener = (event) => {
+ if (this._activeDragInstances.length > 0) {
+ // Note that we only want to prevent the default action after dragging has actually started.
+ // Usually this is the same time at which the item is added to the `_activeDragInstances`,
+ // but it could be pushed back if the user has set up a drag delay or threshold.
+ if (this._activeDragInstances.some(this._draggingPredicate)) {
+ event.preventDefault();
+ }
+ this.pointerMove.next(event);
+ }
+ };
+ this._document = _document;
+ }
+ /** Adds a drop container to the registry. */
+ registerDropContainer(drop) {
+ if (!this._dropInstances.has(drop)) {
+ this._dropInstances.add(drop);
+ }
+ }
+ /** Adds a drag item instance to the registry. */
+ registerDragItem(drag) {
+ this._dragInstances.add(drag);
+ // The `touchmove` event gets bound once, ahead of time, because WebKit
+ // won't preventDefault on a dynamically-added `touchmove` listener.
+ // See https://bugs.webkit.org/show_bug.cgi?id=184250.
+ if (this._dragInstances.size === 1) {
+ this._ngZone.runOutsideAngular(() => {
+ // The event handler has to be explicitly active,
+ // because newer browsers make it passive by default.
+ this._document.addEventListener('touchmove', this._persistentTouchmoveListener, activeCapturingEventOptions);
+ });
+ }
+ }
+ /** Removes a drop container from the registry. */
+ removeDropContainer(drop) {
+ this._dropInstances.delete(drop);
+ }
+ /** Removes a drag item instance from the registry. */
+ removeDragItem(drag) {
+ this._dragInstances.delete(drag);
+ this.stopDragging(drag);
+ if (this._dragInstances.size === 0) {
+ this._document.removeEventListener('touchmove', this._persistentTouchmoveListener, activeCapturingEventOptions);
+ }
+ }
+ /**
+ * Starts the dragging sequence for a drag instance.
+ * @param drag Drag instance which is being dragged.
+ * @param event Event that initiated the dragging.
+ */
+ startDragging(drag, event) {
+ // Do not process the same drag twice to avoid memory leaks and redundant listeners
+ if (this._activeDragInstances.indexOf(drag) > -1) {
+ return;
+ }
+ this._activeDragInstances.push(drag);
+ if (this._activeDragInstances.length === 1) {
+ const isTouchEvent = event.type.startsWith('touch');
+ // We explicitly bind __active__ listeners here, because newer browsers will default to
+ // passive ones for `mousemove` and `touchmove`. The events need to be active, because we
+ // use `preventDefault` to prevent the page from scrolling while the user is dragging.
+ this._globalListeners
+ .set(isTouchEvent ? 'touchend' : 'mouseup', {
+ handler: (e) => this.pointerUp.next(e),
+ options: true
+ })
+ .set('scroll', {
+ handler: (e) => this.scroll.next(e),
+ // Use capturing so that we pick up scroll changes in any scrollable nodes that aren't
+ // the document. See https://github.com/angular/components/issues/17144.
+ options: true
+ })
+ // Preventing the default action on `mousemove` isn't enough to disable text selection
+ // on Safari so we need to prevent the selection event as well. Alternatively this can
+ // be done by setting `user-select: none` on the `body`, however it has causes a style
+ // recalculation which can be expensive on pages with a lot of elements.
+ .set('selectstart', {
+ handler: this._preventDefaultWhileDragging,
+ options: activeCapturingEventOptions
+ });
+ // We don't have to bind a move event for touch drag sequences, because
+ // we already have a persistent global one bound from `registerDragItem`.
+ if (!isTouchEvent) {
+ this._globalListeners.set('mousemove', {
+ handler: (e) => this.pointerMove.next(e),
+ options: activeCapturingEventOptions
+ });
+ }
+ this._ngZone.runOutsideAngular(() => {
+ this._globalListeners.forEach((config, name) => {
+ this._document.addEventListener(name, config.handler, config.options);
+ });
+ });
+ }
+ }
+ /** Stops dragging a drag item instance. */
+ stopDragging(drag) {
+ const index = this._activeDragInstances.indexOf(drag);
+ if (index > -1) {
+ this._activeDragInstances.splice(index, 1);
+ if (this._activeDragInstances.length === 0) {
+ this._clearGlobalListeners();
+ }
+ }
+ }
+ /** Gets whether a drag item instance is currently being dragged. */
+ isDragging(drag) {
+ return this._activeDragInstances.indexOf(drag) > -1;
+ }
+ ngOnDestroy() {
+ this._dragInstances.forEach(instance => this.removeDragItem(instance));
+ this._dropInstances.forEach(instance => this.removeDropContainer(instance));
+ this._clearGlobalListeners();
+ this.pointerMove.complete();
+ this.pointerUp.complete();
+ }
+ /** Clears out the global event listeners from the `document`. */
+ _clearGlobalListeners() {
+ this._globalListeners.forEach((config, name) => {
+ this._document.removeEventListener(name, config.handler, config.options);
+ });
+ this._globalListeners.clear();
+ }
+}
+DragDropRegistry.ɵfac = function DragDropRegistry_Factory(t) { return new (t || DragDropRegistry)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵinject"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["NgZone"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵinject"](_angular_common__WEBPACK_IMPORTED_MODULE_1__["DOCUMENT"])); };
+DragDropRegistry.ɵprov = Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineInjectable"])({ factory: function DragDropRegistry_Factory() { return new DragDropRegistry(Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵinject"])(_angular_core__WEBPACK_IMPORTED_MODULE_0__["NgZone"]), Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵinject"])(_angular_common__WEBPACK_IMPORTED_MODULE_1__["DOCUMENT"])); }, token: DragDropRegistry, providedIn: "root" });
+DragDropRegistry.ctorParameters = () => [
+ { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["NgZone"] },
+ { type: undefined, decorators: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Inject"], args: [_angular_common__WEBPACK_IMPORTED_MODULE_1__["DOCUMENT"],] }] }
+];
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](DragDropRegistry, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Injectable"],
+ args: [{ providedIn: 'root' }]
+ }], function () { return [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["NgZone"] }, { type: undefined, decorators: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Inject"],
+ args: [_angular_common__WEBPACK_IMPORTED_MODULE_1__["DOCUMENT"]]
+ }] }]; }, null); })();
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/** Default configuration to be used when creating a `DragRef`. */
+const DEFAULT_CONFIG = {
+ dragStartThreshold: 5,
+ pointerDirectionChangeThreshold: 5
+};
+/**
+ * Service that allows for drag-and-drop functionality to be attached to DOM elements.
+ */
+class DragDrop {
+ constructor(_document, _ngZone, _viewportRuler, _dragDropRegistry) {
+ this._document = _document;
+ this._ngZone = _ngZone;
+ this._viewportRuler = _viewportRuler;
+ this._dragDropRegistry = _dragDropRegistry;
+ }
+ /**
+ * Turns an element into a draggable item.
+ * @param element Element to which to attach the dragging functionality.
+ * @param config Object used to configure the dragging behavior.
+ */
+ createDrag(element, config = DEFAULT_CONFIG) {
+ return new DragRef(element, config, this._document, this._ngZone, this._viewportRuler, this._dragDropRegistry);
+ }
+ /**
+ * Turns an element into a drop list.
+ * @param element Element to which to attach the drop list functionality.
+ */
+ createDropList(element) {
+ return new DropListRef(element, this._dragDropRegistry, this._document, this._ngZone, this._viewportRuler);
+ }
+}
+DragDrop.ɵfac = function DragDrop_Factory(t) { return new (t || DragDrop)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵinject"](_angular_common__WEBPACK_IMPORTED_MODULE_1__["DOCUMENT"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵinject"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["NgZone"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵinject"](_angular_cdk_scrolling__WEBPACK_IMPORTED_MODULE_2__["ViewportRuler"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵinject"](DragDropRegistry)); };
+DragDrop.ɵprov = Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineInjectable"])({ factory: function DragDrop_Factory() { return new DragDrop(Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵinject"])(_angular_common__WEBPACK_IMPORTED_MODULE_1__["DOCUMENT"]), Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵinject"])(_angular_core__WEBPACK_IMPORTED_MODULE_0__["NgZone"]), Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵinject"])(_angular_cdk_scrolling__WEBPACK_IMPORTED_MODULE_2__["ViewportRuler"]), Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵinject"])(DragDropRegistry)); }, token: DragDrop, providedIn: "root" });
+DragDrop.ctorParameters = () => [
+ { type: undefined, decorators: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Inject"], args: [_angular_common__WEBPACK_IMPORTED_MODULE_1__["DOCUMENT"],] }] },
+ { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["NgZone"] },
+ { type: _angular_cdk_scrolling__WEBPACK_IMPORTED_MODULE_2__["ViewportRuler"] },
+ { type: DragDropRegistry }
+];
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](DragDrop, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Injectable"],
+ args: [{ providedIn: 'root' }]
+ }], function () { return [{ type: undefined, decorators: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Inject"],
+ args: [_angular_common__WEBPACK_IMPORTED_MODULE_1__["DOCUMENT"]]
+ }] }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["NgZone"] }, { type: _angular_cdk_scrolling__WEBPACK_IMPORTED_MODULE_2__["ViewportRuler"] }, { type: DragDropRegistry }]; }, null); })();
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * Injection token that can be used for a `CdkDrag` to provide itself as a parent to the
+ * drag-specific child directive (`CdkDragHandle`, `CdkDragPreview` etc.). Used primarily
+ * to avoid circular imports.
+ * @docs-private
+ */
+const CDK_DRAG_PARENT = new _angular_core__WEBPACK_IMPORTED_MODULE_0__["InjectionToken"]('CDK_DRAG_PARENT');
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * Injection token that can be used to reference instances of `CdkDropListGroup`. It serves as
+ * alternative token to the actual `CdkDropListGroup` class which could cause unnecessary
+ * retention of the class and its directive metadata.
+ */
+const CDK_DROP_LIST_GROUP = new _angular_core__WEBPACK_IMPORTED_MODULE_0__["InjectionToken"]('CdkDropListGroup');
+/**
+ * Declaratively connects sibling `cdkDropList` instances together. All of the `cdkDropList`
+ * elements that are placed inside a `cdkDropListGroup` will be connected to each other
+ * automatically. Can be used as an alternative to the `cdkDropListConnectedTo` input
+ * from `cdkDropList`.
+ */
+class CdkDropListGroup {
+ constructor() {
+ /** Drop lists registered inside the group. */
+ this._items = new Set();
+ this._disabled = false;
+ }
+ /** Whether starting a dragging sequence from inside this group is disabled. */
+ get disabled() { return this._disabled; }
+ set disabled(value) {
+ this._disabled = Object(_angular_cdk_coercion__WEBPACK_IMPORTED_MODULE_4__["coerceBooleanProperty"])(value);
+ }
+ ngOnDestroy() {
+ this._items.clear();
+ }
+}
+CdkDropListGroup.ɵfac = function CdkDropListGroup_Factory(t) { return new (t || CdkDropListGroup)(); };
+CdkDropListGroup.ɵdir = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineDirective"]({ type: CdkDropListGroup, selectors: [["", "cdkDropListGroup", ""]], inputs: { disabled: ["cdkDropListGroupDisabled", "disabled"] }, exportAs: ["cdkDropListGroup"], features: [_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵProvidersFeature"]([{ provide: CDK_DROP_LIST_GROUP, useExisting: CdkDropListGroup }])] });
+CdkDropListGroup.propDecorators = {
+ disabled: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"], args: ['cdkDropListGroupDisabled',] }]
+};
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](CdkDropListGroup, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Directive"],
+ args: [{
+ selector: '[cdkDropListGroup]',
+ exportAs: 'cdkDropListGroup',
+ providers: [{ provide: CDK_DROP_LIST_GROUP, useExisting: CdkDropListGroup }]
+ }]
+ }], function () { return []; }, { disabled: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"],
+ args: ['cdkDropListGroupDisabled']
+ }] }); })();
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * Injection token that can be used to configure the
+ * behavior of the drag&drop-related components.
+ */
+const CDK_DRAG_CONFIG = new _angular_core__WEBPACK_IMPORTED_MODULE_0__["InjectionToken"]('CDK_DRAG_CONFIG');
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * Asserts that a particular node is an element.
+ * @param node Node to be checked.
+ * @param name Name to attach to the error message.
+ */
+function assertElementNode(node, name) {
+ if (node.nodeType !== 1) {
+ throw Error(`${name} must be attached to an element node. ` +
+ `Currently attached to "${node.nodeName}".`);
+ }
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/** Counter used to generate unique ids for drop zones. */
+let _uniqueIdCounter = 0;
+/**
+ * Injection token that can be used to reference instances of `CdkDropList`. It serves as
+ * alternative token to the actual `CdkDropList` class which could cause unnecessary
+ * retention of the class and its directive metadata.
+ */
+const CDK_DROP_LIST = new _angular_core__WEBPACK_IMPORTED_MODULE_0__["InjectionToken"]('CdkDropList');
+const ɵ0 = undefined;
+/** Container that wraps a set of draggable items. */
+class CdkDropList {
+ constructor(
+ /** Element that the drop list is attached to. */
+ element, dragDrop, _changeDetectorRef, _scrollDispatcher, _dir, _group, config) {
+ this.element = element;
+ this._changeDetectorRef = _changeDetectorRef;
+ this._scrollDispatcher = _scrollDispatcher;
+ this._dir = _dir;
+ this._group = _group;
+ /** Emits when the list has been destroyed. */
+ this._destroyed = new rxjs__WEBPACK_IMPORTED_MODULE_5__["Subject"]();
+ /**
+ * Other draggable containers that this container is connected to and into which the
+ * container's items can be transferred. Can either be references to other drop containers,
+ * or their unique IDs.
+ */
+ this.connectedTo = [];
+ /**
+ * Unique ID for the drop zone. Can be used as a reference
+ * in the `connectedTo` of another `CdkDropList`.
+ */
+ this.id = `cdk-drop-list-${_uniqueIdCounter++}`;
+ /**
+ * Function that is used to determine whether an item
+ * is allowed to be moved into a drop container.
+ */
+ this.enterPredicate = () => true;
+ /** Functions that is used to determine whether an item can be sorted into a particular index. */
+ this.sortPredicate = () => true;
+ /** Emits when the user drops an item inside the container. */
+ this.dropped = new _angular_core__WEBPACK_IMPORTED_MODULE_0__["EventEmitter"]();
+ /**
+ * Emits when the user has moved a new drag item into this container.
+ */
+ this.entered = new _angular_core__WEBPACK_IMPORTED_MODULE_0__["EventEmitter"]();
+ /**
+ * Emits when the user removes an item from the container
+ * by dragging it into another container.
+ */
+ this.exited = new _angular_core__WEBPACK_IMPORTED_MODULE_0__["EventEmitter"]();
+ /** Emits as the user is swapping items while actively dragging. */
+ this.sorted = new _angular_core__WEBPACK_IMPORTED_MODULE_0__["EventEmitter"]();
+ /**
+ * Keeps track of the items that are registered with this container. Historically we used to
+ * do this with a `ContentChildren` query, however queries don't handle transplanted views very
+ * well which means that we can't handle cases like dragging the headers of a `mat-table`
+ * correctly. What we do instead is to have the items register themselves with the container
+ * and then we sort them based on their position in the DOM.
+ */
+ this._unsortedItems = new Set();
+ if (typeof ngDevMode === 'undefined' || ngDevMode) {
+ assertElementNode(element.nativeElement, 'cdkDropList');
+ }
+ this._dropListRef = dragDrop.createDropList(element);
+ this._dropListRef.data = this;
+ if (config) {
+ this._assignDefaults(config);
+ }
+ this._dropListRef.enterPredicate = (drag, drop) => {
+ return this.enterPredicate(drag.data, drop.data);
+ };
+ this._dropListRef.sortPredicate =
+ (index, drag, drop) => {
+ return this.sortPredicate(index, drag.data, drop.data);
+ };
+ this._setupInputSyncSubscription(this._dropListRef);
+ this._handleEvents(this._dropListRef);
+ CdkDropList._dropLists.push(this);
+ if (_group) {
+ _group._items.add(this);
+ }
+ }
+ /** Whether starting a dragging sequence from this container is disabled. */
+ get disabled() {
+ return this._disabled || (!!this._group && this._group.disabled);
+ }
+ set disabled(value) {
+ // Usually we sync the directive and ref state right before dragging starts, in order to have
+ // a single point of failure and to avoid having to use setters for everything. `disabled` is
+ // a special case, because it can prevent the `beforeStarted` event from firing, which can lock
+ // the user in a disabled state, so we also need to sync it as it's being set.
+ this._dropListRef.disabled = this._disabled = Object(_angular_cdk_coercion__WEBPACK_IMPORTED_MODULE_4__["coerceBooleanProperty"])(value);
+ }
+ /** Registers an items with the drop list. */
+ addItem(item) {
+ this._unsortedItems.add(item);
+ if (this._dropListRef.isDragging()) {
+ this._syncItemsWithRef();
+ }
+ }
+ /** Removes an item from the drop list. */
+ removeItem(item) {
+ this._unsortedItems.delete(item);
+ if (this._dropListRef.isDragging()) {
+ this._syncItemsWithRef();
+ }
+ }
+ /** Gets the registered items in the list, sorted by their position in the DOM. */
+ getSortedItems() {
+ return Array.from(this._unsortedItems).sort((a, b) => {
+ const documentPosition = a._dragRef.getVisibleElement().compareDocumentPosition(b._dragRef.getVisibleElement());
+ // `compareDocumentPosition` returns a bitmask so we have to use a bitwise operator.
+ // https://developer.mozilla.org/en-US/docs/Web/API/Node/compareDocumentPosition
+ // tslint:disable-next-line:no-bitwise
+ return documentPosition & Node.DOCUMENT_POSITION_FOLLOWING ? -1 : 1;
+ });
+ }
+ ngOnDestroy() {
+ const index = CdkDropList._dropLists.indexOf(this);
+ if (index > -1) {
+ CdkDropList._dropLists.splice(index, 1);
+ }
+ if (this._group) {
+ this._group._items.delete(this);
+ }
+ this._unsortedItems.clear();
+ this._dropListRef.dispose();
+ this._destroyed.next();
+ this._destroyed.complete();
+ }
+ /** Syncs the inputs of the CdkDropList with the options of the underlying DropListRef. */
+ _setupInputSyncSubscription(ref) {
+ if (this._dir) {
+ this._dir.change
+ .pipe(Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_6__["startWith"])(this._dir.value), Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_6__["takeUntil"])(this._destroyed))
+ .subscribe(value => ref.withDirection(value));
+ }
+ ref.beforeStarted.subscribe(() => {
+ const siblings = Object(_angular_cdk_coercion__WEBPACK_IMPORTED_MODULE_4__["coerceArray"])(this.connectedTo).map(drop => {
+ if (typeof drop === 'string') {
+ const correspondingDropList = CdkDropList._dropLists.find(list => list.id === drop);
+ if (!correspondingDropList && (typeof ngDevMode === 'undefined' || ngDevMode)) {
+ console.warn(`CdkDropList could not find connected drop list with id "${drop}"`);
+ }
+ return correspondingDropList;
+ }
+ return drop;
+ });
+ if (this._group) {
+ this._group._items.forEach(drop => {
+ if (siblings.indexOf(drop) === -1) {
+ siblings.push(drop);
+ }
+ });
+ }
+ // Note that we resolve the scrollable parents here so that we delay the resolution
+ // as long as possible, ensuring that the element is in its final place in the DOM.
+ if (!this._scrollableParentsResolved) {
+ const scrollableParents = this._scrollDispatcher
+ .getAncestorScrollContainers(this.element)
+ .map(scrollable => scrollable.getElementRef().nativeElement);
+ this._dropListRef.withScrollableParents(scrollableParents);
+ // Only do this once since it involves traversing the DOM and the parents
+ // shouldn't be able to change without the drop list being destroyed.
+ this._scrollableParentsResolved = true;
+ }
+ ref.disabled = this.disabled;
+ ref.lockAxis = this.lockAxis;
+ ref.sortingDisabled = Object(_angular_cdk_coercion__WEBPACK_IMPORTED_MODULE_4__["coerceBooleanProperty"])(this.sortingDisabled);
+ ref.autoScrollDisabled = Object(_angular_cdk_coercion__WEBPACK_IMPORTED_MODULE_4__["coerceBooleanProperty"])(this.autoScrollDisabled);
+ ref.autoScrollStep = Object(_angular_cdk_coercion__WEBPACK_IMPORTED_MODULE_4__["coerceNumberProperty"])(this.autoScrollStep, 2);
+ ref
+ .connectedTo(siblings.filter(drop => drop && drop !== this).map(list => list._dropListRef))
+ .withOrientation(this.orientation);
+ });
+ }
+ /** Handles events from the underlying DropListRef. */
+ _handleEvents(ref) {
+ ref.beforeStarted.subscribe(() => {
+ this._syncItemsWithRef();
+ this._changeDetectorRef.markForCheck();
+ });
+ ref.entered.subscribe(event => {
+ this.entered.emit({
+ container: this,
+ item: event.item.data,
+ currentIndex: event.currentIndex
+ });
+ });
+ ref.exited.subscribe(event => {
+ this.exited.emit({
+ container: this,
+ item: event.item.data
+ });
+ this._changeDetectorRef.markForCheck();
+ });
+ ref.sorted.subscribe(event => {
+ this.sorted.emit({
+ previousIndex: event.previousIndex,
+ currentIndex: event.currentIndex,
+ container: this,
+ item: event.item.data
+ });
+ });
+ ref.dropped.subscribe(event => {
+ this.dropped.emit({
+ previousIndex: event.previousIndex,
+ currentIndex: event.currentIndex,
+ previousContainer: event.previousContainer.data,
+ container: event.container.data,
+ item: event.item.data,
+ isPointerOverContainer: event.isPointerOverContainer,
+ distance: event.distance
+ });
+ // Mark for check since all of these events run outside of change
+ // detection and we're not guaranteed for something else to have triggered it.
+ this._changeDetectorRef.markForCheck();
+ });
+ }
+ /** Assigns the default input values based on a provided config object. */
+ _assignDefaults(config) {
+ const { lockAxis, draggingDisabled, sortingDisabled, listAutoScrollDisabled, listOrientation } = config;
+ this.disabled = draggingDisabled == null ? false : draggingDisabled;
+ this.sortingDisabled = sortingDisabled == null ? false : sortingDisabled;
+ this.autoScrollDisabled = listAutoScrollDisabled == null ? false : listAutoScrollDisabled;
+ this.orientation = listOrientation || 'vertical';
+ if (lockAxis) {
+ this.lockAxis = lockAxis;
+ }
+ }
+ /** Syncs up the registered drag items with underlying drop list ref. */
+ _syncItemsWithRef() {
+ this._dropListRef.withItems(this.getSortedItems().map(item => item._dragRef));
+ }
+}
+CdkDropList.ɵfac = function CdkDropList_Factory(t) { return new (t || CdkDropList)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ElementRef"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](DragDrop), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ChangeDetectorRef"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_cdk_scrolling__WEBPACK_IMPORTED_MODULE_2__["ScrollDispatcher"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_cdk_bidi__WEBPACK_IMPORTED_MODULE_7__["Directionality"], 8), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](CDK_DROP_LIST_GROUP, 12), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](CDK_DRAG_CONFIG, 8)); };
+CdkDropList.ɵdir = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineDirective"]({ type: CdkDropList, selectors: [["", "cdkDropList", ""], ["cdk-drop-list"]], hostAttrs: [1, "cdk-drop-list"], hostVars: 7, hostBindings: function CdkDropList_HostBindings(rf, ctx) { if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵattribute"]("id", ctx.id);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵclassProp"]("cdk-drop-list-disabled", ctx.disabled)("cdk-drop-list-dragging", ctx._dropListRef.isDragging())("cdk-drop-list-receiving", ctx._dropListRef.isReceiving());
+ } }, inputs: { connectedTo: ["cdkDropListConnectedTo", "connectedTo"], id: "id", enterPredicate: ["cdkDropListEnterPredicate", "enterPredicate"], sortPredicate: ["cdkDropListSortPredicate", "sortPredicate"], disabled: ["cdkDropListDisabled", "disabled"], sortingDisabled: ["cdkDropListSortingDisabled", "sortingDisabled"], autoScrollDisabled: ["cdkDropListAutoScrollDisabled", "autoScrollDisabled"], orientation: ["cdkDropListOrientation", "orientation"], lockAxis: ["cdkDropListLockAxis", "lockAxis"], data: ["cdkDropListData", "data"], autoScrollStep: ["cdkDropListAutoScrollStep", "autoScrollStep"] }, outputs: { dropped: "cdkDropListDropped", entered: "cdkDropListEntered", exited: "cdkDropListExited", sorted: "cdkDropListSorted" }, exportAs: ["cdkDropList"], features: [_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵProvidersFeature"]([
+ // Prevent child drop lists from picking up the same group as their parent.
+ { provide: CDK_DROP_LIST_GROUP, useValue: ɵ0 },
+ { provide: CDK_DROP_LIST, useExisting: CdkDropList },
+ ])] });
+/** Keeps track of the drop lists that are currently on the page. */
+CdkDropList._dropLists = [];
+CdkDropList.ctorParameters = () => [
+ { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["ElementRef"] },
+ { type: DragDrop },
+ { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["ChangeDetectorRef"] },
+ { type: _angular_cdk_scrolling__WEBPACK_IMPORTED_MODULE_2__["ScrollDispatcher"] },
+ { type: _angular_cdk_bidi__WEBPACK_IMPORTED_MODULE_7__["Directionality"], decorators: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Optional"] }] },
+ { type: CdkDropListGroup, decorators: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Optional"] }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Inject"], args: [CDK_DROP_LIST_GROUP,] }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["SkipSelf"] }] },
+ { type: undefined, decorators: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Optional"] }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Inject"], args: [CDK_DRAG_CONFIG,] }] }
+];
+CdkDropList.propDecorators = {
+ connectedTo: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"], args: ['cdkDropListConnectedTo',] }],
+ data: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"], args: ['cdkDropListData',] }],
+ orientation: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"], args: ['cdkDropListOrientation',] }],
+ id: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"] }],
+ lockAxis: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"], args: ['cdkDropListLockAxis',] }],
+ disabled: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"], args: ['cdkDropListDisabled',] }],
+ sortingDisabled: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"], args: ['cdkDropListSortingDisabled',] }],
+ enterPredicate: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"], args: ['cdkDropListEnterPredicate',] }],
+ sortPredicate: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"], args: ['cdkDropListSortPredicate',] }],
+ autoScrollDisabled: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"], args: ['cdkDropListAutoScrollDisabled',] }],
+ autoScrollStep: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"], args: ['cdkDropListAutoScrollStep',] }],
+ dropped: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Output"], args: ['cdkDropListDropped',] }],
+ entered: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Output"], args: ['cdkDropListEntered',] }],
+ exited: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Output"], args: ['cdkDropListExited',] }],
+ sorted: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Output"], args: ['cdkDropListSorted',] }]
+};
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](CdkDropList, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Directive"],
+ args: [{
+ selector: '[cdkDropList], cdk-drop-list',
+ exportAs: 'cdkDropList',
+ providers: [
+ // Prevent child drop lists from picking up the same group as their parent.
+ { provide: CDK_DROP_LIST_GROUP, useValue: ɵ0 },
+ { provide: CDK_DROP_LIST, useExisting: CdkDropList },
+ ],
+ host: {
+ 'class': 'cdk-drop-list',
+ '[attr.id]': 'id',
+ '[class.cdk-drop-list-disabled]': 'disabled',
+ '[class.cdk-drop-list-dragging]': '_dropListRef.isDragging()',
+ '[class.cdk-drop-list-receiving]': '_dropListRef.isReceiving()'
+ }
+ }]
+ }], function () { return [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["ElementRef"] }, { type: DragDrop }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["ChangeDetectorRef"] }, { type: _angular_cdk_scrolling__WEBPACK_IMPORTED_MODULE_2__["ScrollDispatcher"] }, { type: _angular_cdk_bidi__WEBPACK_IMPORTED_MODULE_7__["Directionality"], decorators: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Optional"]
+ }] }, { type: CdkDropListGroup, decorators: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Optional"]
+ }, {
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Inject"],
+ args: [CDK_DROP_LIST_GROUP]
+ }, {
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["SkipSelf"]
+ }] }, { type: undefined, decorators: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Optional"]
+ }, {
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Inject"],
+ args: [CDK_DRAG_CONFIG]
+ }] }]; }, { connectedTo: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"],
+ args: ['cdkDropListConnectedTo']
+ }], id: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"]
+ }], enterPredicate: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"],
+ args: ['cdkDropListEnterPredicate']
+ }], sortPredicate: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"],
+ args: ['cdkDropListSortPredicate']
+ }], dropped: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Output"],
+ args: ['cdkDropListDropped']
+ }], entered: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Output"],
+ args: ['cdkDropListEntered']
+ }], exited: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Output"],
+ args: ['cdkDropListExited']
+ }], sorted: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Output"],
+ args: ['cdkDropListSorted']
+ }], disabled: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"],
+ args: ['cdkDropListDisabled']
+ }], sortingDisabled: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"],
+ args: ['cdkDropListSortingDisabled']
+ }], autoScrollDisabled: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"],
+ args: ['cdkDropListAutoScrollDisabled']
+ }], orientation: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"],
+ args: ['cdkDropListOrientation']
+ }], lockAxis: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"],
+ args: ['cdkDropListLockAxis']
+ }], data: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"],
+ args: ['cdkDropListData']
+ }], autoScrollStep: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"],
+ args: ['cdkDropListAutoScrollStep']
+ }] }); })();
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * Injection token that can be used to reference instances of `CdkDragHandle`. It serves as
+ * alternative token to the actual `CdkDragHandle` class which could cause unnecessary
+ * retention of the class and its directive metadata.
+ */
+const CDK_DRAG_HANDLE = new _angular_core__WEBPACK_IMPORTED_MODULE_0__["InjectionToken"]('CdkDragHandle');
+/** Handle that can be used to drag a CdkDrag instance. */
+class CdkDragHandle {
+ constructor(element, parentDrag) {
+ this.element = element;
+ /** Emits when the state of the handle has changed. */
+ this._stateChanges = new rxjs__WEBPACK_IMPORTED_MODULE_5__["Subject"]();
+ this._disabled = false;
+ if (typeof ngDevMode === 'undefined' || ngDevMode) {
+ assertElementNode(element.nativeElement, 'cdkDragHandle');
+ }
+ this._parentDrag = parentDrag;
+ }
+ /** Whether starting to drag through this handle is disabled. */
+ get disabled() { return this._disabled; }
+ set disabled(value) {
+ this._disabled = Object(_angular_cdk_coercion__WEBPACK_IMPORTED_MODULE_4__["coerceBooleanProperty"])(value);
+ this._stateChanges.next(this);
+ }
+ ngOnDestroy() {
+ this._stateChanges.complete();
+ }
+}
+CdkDragHandle.ɵfac = function CdkDragHandle_Factory(t) { return new (t || CdkDragHandle)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ElementRef"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](CDK_DRAG_PARENT, 12)); };
+CdkDragHandle.ɵdir = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineDirective"]({ type: CdkDragHandle, selectors: [["", "cdkDragHandle", ""]], hostAttrs: [1, "cdk-drag-handle"], inputs: { disabled: ["cdkDragHandleDisabled", "disabled"] }, features: [_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵProvidersFeature"]([{ provide: CDK_DRAG_HANDLE, useExisting: CdkDragHandle }])] });
+CdkDragHandle.ctorParameters = () => [
+ { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["ElementRef"] },
+ { type: undefined, decorators: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Inject"], args: [CDK_DRAG_PARENT,] }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Optional"] }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["SkipSelf"] }] }
+];
+CdkDragHandle.propDecorators = {
+ disabled: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"], args: ['cdkDragHandleDisabled',] }]
+};
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](CdkDragHandle, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Directive"],
+ args: [{
+ selector: '[cdkDragHandle]',
+ host: {
+ 'class': 'cdk-drag-handle'
+ },
+ providers: [{ provide: CDK_DRAG_HANDLE, useExisting: CdkDragHandle }]
+ }]
+ }], function () { return [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["ElementRef"] }, { type: undefined, decorators: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Inject"],
+ args: [CDK_DRAG_PARENT]
+ }, {
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Optional"]
+ }, {
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["SkipSelf"]
+ }] }]; }, { disabled: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"],
+ args: ['cdkDragHandleDisabled']
+ }] }); })();
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * Injection token that can be used to reference instances of `CdkDragPlaceholder`. It serves as
+ * alternative token to the actual `CdkDragPlaceholder` class which could cause unnecessary
+ * retention of the class and its directive metadata.
+ */
+const CDK_DRAG_PLACEHOLDER = new _angular_core__WEBPACK_IMPORTED_MODULE_0__["InjectionToken"]('CdkDragPlaceholder');
+/**
+ * Element that will be used as a template for the placeholder of a CdkDrag when
+ * it is being dragged. The placeholder is displayed in place of the element being dragged.
+ */
+class CdkDragPlaceholder {
+ constructor(templateRef) {
+ this.templateRef = templateRef;
+ }
+}
+CdkDragPlaceholder.ɵfac = function CdkDragPlaceholder_Factory(t) { return new (t || CdkDragPlaceholder)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["TemplateRef"])); };
+CdkDragPlaceholder.ɵdir = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineDirective"]({ type: CdkDragPlaceholder, selectors: [["ng-template", "cdkDragPlaceholder", ""]], inputs: { data: "data" }, features: [_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵProvidersFeature"]([{ provide: CDK_DRAG_PLACEHOLDER, useExisting: CdkDragPlaceholder }])] });
+CdkDragPlaceholder.ctorParameters = () => [
+ { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["TemplateRef"] }
+];
+CdkDragPlaceholder.propDecorators = {
+ data: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"] }]
+};
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](CdkDragPlaceholder, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Directive"],
+ args: [{
+ selector: 'ng-template[cdkDragPlaceholder]',
+ providers: [{ provide: CDK_DRAG_PLACEHOLDER, useExisting: CdkDragPlaceholder }]
+ }]
+ }], function () { return [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["TemplateRef"] }]; }, { data: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"]
+ }] }); })();
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * Injection token that can be used to reference instances of `CdkDragPreview`. It serves as
+ * alternative token to the actual `CdkDragPreview` class which could cause unnecessary
+ * retention of the class and its directive metadata.
+ */
+const CDK_DRAG_PREVIEW = new _angular_core__WEBPACK_IMPORTED_MODULE_0__["InjectionToken"]('CdkDragPreview');
+/**
+ * Element that will be used as a template for the preview
+ * of a CdkDrag when it is being dragged.
+ */
+class CdkDragPreview {
+ constructor(templateRef) {
+ this.templateRef = templateRef;
+ this._matchSize = false;
+ }
+ /** Whether the preview should preserve the same size as the item that is being dragged. */
+ get matchSize() { return this._matchSize; }
+ set matchSize(value) { this._matchSize = Object(_angular_cdk_coercion__WEBPACK_IMPORTED_MODULE_4__["coerceBooleanProperty"])(value); }
+}
+CdkDragPreview.ɵfac = function CdkDragPreview_Factory(t) { return new (t || CdkDragPreview)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["TemplateRef"])); };
+CdkDragPreview.ɵdir = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineDirective"]({ type: CdkDragPreview, selectors: [["ng-template", "cdkDragPreview", ""]], inputs: { matchSize: "matchSize", data: "data" }, features: [_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵProvidersFeature"]([{ provide: CDK_DRAG_PREVIEW, useExisting: CdkDragPreview }])] });
+CdkDragPreview.ctorParameters = () => [
+ { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["TemplateRef"] }
+];
+CdkDragPreview.propDecorators = {
+ data: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"] }],
+ matchSize: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"] }]
+};
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](CdkDragPreview, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Directive"],
+ args: [{
+ selector: 'ng-template[cdkDragPreview]',
+ providers: [{ provide: CDK_DRAG_PREVIEW, useExisting: CdkDragPreview }]
+ }]
+ }], function () { return [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["TemplateRef"] }]; }, { matchSize: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"]
+ }], data: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"]
+ }] }); })();
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+const DRAG_HOST_CLASS = 'cdk-drag';
+/** Element that can be moved inside a CdkDropList container. */
+class CdkDrag {
+ constructor(
+ /** Element that the draggable is attached to. */
+ element,
+ /** Droppable container that the draggable is a part of. */
+ dropContainer,
+ /**
+ * @deprecated `_document` parameter no longer being used and will be removed.
+ * @breaking-change 12.0.0
+ */
+ _document, _ngZone, _viewContainerRef, config, _dir, dragDrop, _changeDetectorRef, _selfHandle, _parentDrag) {
+ this.element = element;
+ this.dropContainer = dropContainer;
+ this._ngZone = _ngZone;
+ this._viewContainerRef = _viewContainerRef;
+ this._dir = _dir;
+ this._changeDetectorRef = _changeDetectorRef;
+ this._selfHandle = _selfHandle;
+ this._parentDrag = _parentDrag;
+ this._destroyed = new rxjs__WEBPACK_IMPORTED_MODULE_5__["Subject"]();
+ /** Emits when the user starts dragging the item. */
+ this.started = new _angular_core__WEBPACK_IMPORTED_MODULE_0__["EventEmitter"]();
+ /** Emits when the user has released a drag item, before any animations have started. */
+ this.released = new _angular_core__WEBPACK_IMPORTED_MODULE_0__["EventEmitter"]();
+ /** Emits when the user stops dragging an item in the container. */
+ this.ended = new _angular_core__WEBPACK_IMPORTED_MODULE_0__["EventEmitter"]();
+ /** Emits when the user has moved the item into a new container. */
+ this.entered = new _angular_core__WEBPACK_IMPORTED_MODULE_0__["EventEmitter"]();
+ /** Emits when the user removes the item its container by dragging it into another container. */
+ this.exited = new _angular_core__WEBPACK_IMPORTED_MODULE_0__["EventEmitter"]();
+ /** Emits when the user drops the item inside a container. */
+ this.dropped = new _angular_core__WEBPACK_IMPORTED_MODULE_0__["EventEmitter"]();
+ /**
+ * Emits as the user is dragging the item. Use with caution,
+ * because this event will fire for every pixel that the user has dragged.
+ */
+ this.moved = new rxjs__WEBPACK_IMPORTED_MODULE_5__["Observable"]((observer) => {
+ const subscription = this._dragRef.moved.pipe(Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_6__["map"])(movedEvent => ({
+ source: this,
+ pointerPosition: movedEvent.pointerPosition,
+ event: movedEvent.event,
+ delta: movedEvent.delta,
+ distance: movedEvent.distance
+ }))).subscribe(observer);
+ return () => {
+ subscription.unsubscribe();
+ };
+ });
+ this._dragRef = dragDrop.createDrag(element, {
+ dragStartThreshold: config && config.dragStartThreshold != null ?
+ config.dragStartThreshold : 5,
+ pointerDirectionChangeThreshold: config && config.pointerDirectionChangeThreshold != null ?
+ config.pointerDirectionChangeThreshold : 5,
+ zIndex: config === null || config === void 0 ? void 0 : config.zIndex,
+ });
+ this._dragRef.data = this;
+ // We have to keep track of the drag instances in order to be able to match an element to
+ // a drag instance. We can't go through the global registry of `DragRef`, because the root
+ // element could be different.
+ CdkDrag._dragInstances.push(this);
+ if (config) {
+ this._assignDefaults(config);
+ }
+ // Note that usually the container is assigned when the drop list is picks up the item, but in
+ // some cases (mainly transplanted views with OnPush, see #18341) we may end up in a situation
+ // where there are no items on the first change detection pass, but the items get picked up as
+ // soon as the user triggers another pass by dragging. This is a problem, because the item would
+ // have to switch from standalone mode to drag mode in the middle of the dragging sequence which
+ // is too late since the two modes save different kinds of information. We work around it by
+ // assigning the drop container both from here and the list.
+ if (dropContainer) {
+ this._dragRef._withDropContainer(dropContainer._dropListRef);
+ dropContainer.addItem(this);
+ }
+ this._syncInputs(this._dragRef);
+ this._handleEvents(this._dragRef);
+ }
+ /** Whether starting to drag this element is disabled. */
+ get disabled() {
+ return this._disabled || (this.dropContainer && this.dropContainer.disabled);
+ }
+ set disabled(value) {
+ this._disabled = Object(_angular_cdk_coercion__WEBPACK_IMPORTED_MODULE_4__["coerceBooleanProperty"])(value);
+ this._dragRef.disabled = this._disabled;
+ }
+ /**
+ * Returns the element that is being used as a placeholder
+ * while the current element is being dragged.
+ */
+ getPlaceholderElement() {
+ return this._dragRef.getPlaceholderElement();
+ }
+ /** Returns the root draggable element. */
+ getRootElement() {
+ return this._dragRef.getRootElement();
+ }
+ /** Resets a standalone drag item to its initial position. */
+ reset() {
+ this._dragRef.reset();
+ }
+ /**
+ * Gets the pixel coordinates of the draggable outside of a drop container.
+ */
+ getFreeDragPosition() {
+ return this._dragRef.getFreeDragPosition();
+ }
+ ngAfterViewInit() {
+ // We need to wait for the zone to stabilize, in order for the reference
+ // element to be in the proper place in the DOM. This is mostly relevant
+ // for draggable elements inside portals since they get stamped out in
+ // their original DOM position and then they get transferred to the portal.
+ this._ngZone.onStable
+ .pipe(Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_6__["take"])(1), Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_6__["takeUntil"])(this._destroyed))
+ .subscribe(() => {
+ this._updateRootElement();
+ // Listen for any newly-added handles.
+ this._handles.changes.pipe(Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_6__["startWith"])(this._handles),
+ // Sync the new handles with the DragRef.
+ Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_6__["tap"])((handles) => {
+ const childHandleElements = handles
+ .filter(handle => handle._parentDrag === this)
+ .map(handle => handle.element);
+ // Usually handles are only allowed to be a descendant of the drag element, but if
+ // the consumer defined a different drag root, we should allow the drag element
+ // itself to be a handle too.
+ if (this._selfHandle && this.rootElementSelector) {
+ childHandleElements.push(this.element);
+ }
+ this._dragRef.withHandles(childHandleElements);
+ }),
+ // Listen if the state of any of the handles changes.
+ Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_6__["switchMap"])((handles) => {
+ return Object(rxjs__WEBPACK_IMPORTED_MODULE_5__["merge"])(...handles.map(item => {
+ return item._stateChanges.pipe(Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_6__["startWith"])(item));
+ }));
+ }), Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_6__["takeUntil"])(this._destroyed)).subscribe(handleInstance => {
+ // Enabled/disable the handle that changed in the DragRef.
+ const dragRef = this._dragRef;
+ const handle = handleInstance.element.nativeElement;
+ handleInstance.disabled ? dragRef.disableHandle(handle) : dragRef.enableHandle(handle);
+ });
+ if (this.freeDragPosition) {
+ this._dragRef.setFreeDragPosition(this.freeDragPosition);
+ }
+ });
+ }
+ ngOnChanges(changes) {
+ const rootSelectorChange = changes['rootElementSelector'];
+ const positionChange = changes['freeDragPosition'];
+ // We don't have to react to the first change since it's being
+ // handled in `ngAfterViewInit` where it needs to be deferred.
+ if (rootSelectorChange && !rootSelectorChange.firstChange) {
+ this._updateRootElement();
+ }
+ // Skip the first change since it's being handled in `ngAfterViewInit`.
+ if (positionChange && !positionChange.firstChange && this.freeDragPosition) {
+ this._dragRef.setFreeDragPosition(this.freeDragPosition);
+ }
+ }
+ ngOnDestroy() {
+ if (this.dropContainer) {
+ this.dropContainer.removeItem(this);
+ }
+ const index = CdkDrag._dragInstances.indexOf(this);
+ if (index > -1) {
+ CdkDrag._dragInstances.splice(index, 1);
+ }
+ this._destroyed.next();
+ this._destroyed.complete();
+ this._dragRef.dispose();
+ }
+ /** Syncs the root element with the `DragRef`. */
+ _updateRootElement() {
+ const element = this.element.nativeElement;
+ const rootElement = this.rootElementSelector ?
+ getClosestMatchingAncestor(element, this.rootElementSelector) : element;
+ if (rootElement && (typeof ngDevMode === 'undefined' || ngDevMode)) {
+ assertElementNode(rootElement, 'cdkDrag');
+ }
+ this._dragRef.withRootElement(rootElement || element);
+ }
+ /** Gets the boundary element, based on the `boundaryElement` value. */
+ _getBoundaryElement() {
+ const boundary = this.boundaryElement;
+ if (!boundary) {
+ return null;
+ }
+ if (typeof boundary === 'string') {
+ return getClosestMatchingAncestor(this.element.nativeElement, boundary);
+ }
+ const element = Object(_angular_cdk_coercion__WEBPACK_IMPORTED_MODULE_4__["coerceElement"])(boundary);
+ if ((typeof ngDevMode === 'undefined' || ngDevMode) &&
+ !element.contains(this.element.nativeElement)) {
+ throw Error('Draggable element is not inside of the node passed into cdkDragBoundary.');
+ }
+ return element;
+ }
+ /** Syncs the inputs of the CdkDrag with the options of the underlying DragRef. */
+ _syncInputs(ref) {
+ ref.beforeStarted.subscribe(() => {
+ if (!ref.isDragging()) {
+ const dir = this._dir;
+ const dragStartDelay = this.dragStartDelay;
+ const placeholder = this._placeholderTemplate ? {
+ template: this._placeholderTemplate.templateRef,
+ context: this._placeholderTemplate.data,
+ viewContainer: this._viewContainerRef
+ } : null;
+ const preview = this._previewTemplate ? {
+ template: this._previewTemplate.templateRef,
+ context: this._previewTemplate.data,
+ matchSize: this._previewTemplate.matchSize,
+ viewContainer: this._viewContainerRef
+ } : null;
+ ref.disabled = this.disabled;
+ ref.lockAxis = this.lockAxis;
+ ref.dragStartDelay = (typeof dragStartDelay === 'object' && dragStartDelay) ?
+ dragStartDelay : Object(_angular_cdk_coercion__WEBPACK_IMPORTED_MODULE_4__["coerceNumberProperty"])(dragStartDelay);
+ ref.constrainPosition = this.constrainPosition;
+ ref.previewClass = this.previewClass;
+ ref
+ .withBoundaryElement(this._getBoundaryElement())
+ .withPlaceholderTemplate(placeholder)
+ .withPreviewTemplate(preview);
+ if (dir) {
+ ref.withDirection(dir.value);
+ }
+ }
+ });
+ // This only needs to be resolved once.
+ ref.beforeStarted.pipe(Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_6__["take"])(1)).subscribe(() => {
+ var _a, _b;
+ // If we managed to resolve a parent through DI, use it.
+ if (this._parentDrag) {
+ ref.withParent(this._parentDrag._dragRef);
+ return;
+ }
+ // Otherwise fall back to resolving the parent by looking up the DOM. This can happen if
+ // the item was projected into another item by something like `ngTemplateOutlet`.
+ let parent = this.element.nativeElement.parentElement;
+ while (parent) {
+ // `classList` needs to be null checked, because IE doesn't have it on some elements.
+ if ((_a = parent.classList) === null || _a === void 0 ? void 0 : _a.contains(DRAG_HOST_CLASS)) {
+ ref.withParent(((_b = CdkDrag._dragInstances.find(drag => {
+ return drag.element.nativeElement === parent;
+ })) === null || _b === void 0 ? void 0 : _b._dragRef) || null);
+ break;
+ }
+ parent = parent.parentElement;
+ }
+ });
+ }
+ /** Handles the events from the underlying `DragRef`. */
+ _handleEvents(ref) {
+ ref.started.subscribe(() => {
+ this.started.emit({ source: this });
+ // Since all of these events run outside of change detection,
+ // we need to ensure that everything is marked correctly.
+ this._changeDetectorRef.markForCheck();
+ });
+ ref.released.subscribe(() => {
+ this.released.emit({ source: this });
+ });
+ ref.ended.subscribe(event => {
+ this.ended.emit({ source: this, distance: event.distance });
+ // Since all of these events run outside of change detection,
+ // we need to ensure that everything is marked correctly.
+ this._changeDetectorRef.markForCheck();
+ });
+ ref.entered.subscribe(event => {
+ this.entered.emit({
+ container: event.container.data,
+ item: this,
+ currentIndex: event.currentIndex
+ });
+ });
+ ref.exited.subscribe(event => {
+ this.exited.emit({
+ container: event.container.data,
+ item: this
+ });
+ });
+ ref.dropped.subscribe(event => {
+ this.dropped.emit({
+ previousIndex: event.previousIndex,
+ currentIndex: event.currentIndex,
+ previousContainer: event.previousContainer.data,
+ container: event.container.data,
+ isPointerOverContainer: event.isPointerOverContainer,
+ item: this,
+ distance: event.distance
+ });
+ });
+ }
+ /** Assigns the default input values based on a provided config object. */
+ _assignDefaults(config) {
+ const { lockAxis, dragStartDelay, constrainPosition, previewClass, boundaryElement, draggingDisabled, rootElementSelector } = config;
+ this.disabled = draggingDisabled == null ? false : draggingDisabled;
+ this.dragStartDelay = dragStartDelay || 0;
+ if (lockAxis) {
+ this.lockAxis = lockAxis;
+ }
+ if (constrainPosition) {
+ this.constrainPosition = constrainPosition;
+ }
+ if (previewClass) {
+ this.previewClass = previewClass;
+ }
+ if (boundaryElement) {
+ this.boundaryElement = boundaryElement;
+ }
+ if (rootElementSelector) {
+ this.rootElementSelector = rootElementSelector;
+ }
+ }
+}
+CdkDrag.ɵfac = function CdkDrag_Factory(t) { return new (t || CdkDrag)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ElementRef"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](CDK_DROP_LIST, 12), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_common__WEBPACK_IMPORTED_MODULE_1__["DOCUMENT"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["NgZone"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ViewContainerRef"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](CDK_DRAG_CONFIG, 8), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_cdk_bidi__WEBPACK_IMPORTED_MODULE_7__["Directionality"], 8), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](DragDrop), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ChangeDetectorRef"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](CDK_DRAG_HANDLE, 10), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](CDK_DRAG_PARENT, 12)); };
+CdkDrag.ɵdir = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineDirective"]({ type: CdkDrag, selectors: [["", "cdkDrag", ""]], contentQueries: function CdkDrag_ContentQueries(rf, ctx, dirIndex) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵcontentQuery"](dirIndex, CDK_DRAG_PREVIEW, 1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵcontentQuery"](dirIndex, CDK_DRAG_PLACEHOLDER, 1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵcontentQuery"](dirIndex, CDK_DRAG_HANDLE, 1);
+ } if (rf & 2) {
+ let _t;
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵqueryRefresh"](_t = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵloadQuery"]()) && (ctx._previewTemplate = _t.first);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵqueryRefresh"](_t = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵloadQuery"]()) && (ctx._placeholderTemplate = _t.first);
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵqueryRefresh"](_t = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵloadQuery"]()) && (ctx._handles = _t);
+ } }, hostAttrs: [1, "cdk-drag"], hostVars: 4, hostBindings: function CdkDrag_HostBindings(rf, ctx) { if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵclassProp"]("cdk-drag-disabled", ctx.disabled)("cdk-drag-dragging", ctx._dragRef.isDragging());
+ } }, inputs: { disabled: ["cdkDragDisabled", "disabled"], dragStartDelay: ["cdkDragStartDelay", "dragStartDelay"], lockAxis: ["cdkDragLockAxis", "lockAxis"], constrainPosition: ["cdkDragConstrainPosition", "constrainPosition"], previewClass: ["cdkDragPreviewClass", "previewClass"], boundaryElement: ["cdkDragBoundary", "boundaryElement"], rootElementSelector: ["cdkDragRootElement", "rootElementSelector"], data: ["cdkDragData", "data"], freeDragPosition: ["cdkDragFreeDragPosition", "freeDragPosition"] }, outputs: { started: "cdkDragStarted", released: "cdkDragReleased", ended: "cdkDragEnded", entered: "cdkDragEntered", exited: "cdkDragExited", dropped: "cdkDragDropped", moved: "cdkDragMoved" }, exportAs: ["cdkDrag"], features: [_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵProvidersFeature"]([{ provide: CDK_DRAG_PARENT, useExisting: CdkDrag }]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵNgOnChangesFeature"]] });
+CdkDrag._dragInstances = [];
+CdkDrag.ctorParameters = () => [
+ { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["ElementRef"] },
+ { type: undefined, decorators: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Inject"], args: [CDK_DROP_LIST,] }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Optional"] }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["SkipSelf"] }] },
+ { type: undefined, decorators: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Inject"], args: [_angular_common__WEBPACK_IMPORTED_MODULE_1__["DOCUMENT"],] }] },
+ { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["NgZone"] },
+ { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["ViewContainerRef"] },
+ { type: undefined, decorators: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Optional"] }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Inject"], args: [CDK_DRAG_CONFIG,] }] },
+ { type: _angular_cdk_bidi__WEBPACK_IMPORTED_MODULE_7__["Directionality"], decorators: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Optional"] }] },
+ { type: DragDrop },
+ { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["ChangeDetectorRef"] },
+ { type: CdkDragHandle, decorators: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Optional"] }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Self"] }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Inject"], args: [CDK_DRAG_HANDLE,] }] },
+ { type: CdkDrag, decorators: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Optional"] }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["SkipSelf"] }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Inject"], args: [CDK_DRAG_PARENT,] }] }
+];
+CdkDrag.propDecorators = {
+ _handles: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["ContentChildren"], args: [CDK_DRAG_HANDLE, { descendants: true },] }],
+ _previewTemplate: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["ContentChild"], args: [CDK_DRAG_PREVIEW,] }],
+ _placeholderTemplate: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["ContentChild"], args: [CDK_DRAG_PLACEHOLDER,] }],
+ data: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"], args: ['cdkDragData',] }],
+ lockAxis: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"], args: ['cdkDragLockAxis',] }],
+ rootElementSelector: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"], args: ['cdkDragRootElement',] }],
+ boundaryElement: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"], args: ['cdkDragBoundary',] }],
+ dragStartDelay: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"], args: ['cdkDragStartDelay',] }],
+ freeDragPosition: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"], args: ['cdkDragFreeDragPosition',] }],
+ disabled: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"], args: ['cdkDragDisabled',] }],
+ constrainPosition: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"], args: ['cdkDragConstrainPosition',] }],
+ previewClass: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"], args: ['cdkDragPreviewClass',] }],
+ started: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Output"], args: ['cdkDragStarted',] }],
+ released: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Output"], args: ['cdkDragReleased',] }],
+ ended: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Output"], args: ['cdkDragEnded',] }],
+ entered: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Output"], args: ['cdkDragEntered',] }],
+ exited: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Output"], args: ['cdkDragExited',] }],
+ dropped: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Output"], args: ['cdkDragDropped',] }],
+ moved: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Output"], args: ['cdkDragMoved',] }]
+};
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](CdkDrag, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Directive"],
+ args: [{
+ selector: '[cdkDrag]',
+ exportAs: 'cdkDrag',
+ host: {
+ 'class': DRAG_HOST_CLASS,
+ '[class.cdk-drag-disabled]': 'disabled',
+ '[class.cdk-drag-dragging]': '_dragRef.isDragging()'
+ },
+ providers: [{ provide: CDK_DRAG_PARENT, useExisting: CdkDrag }]
+ }]
+ }], function () { return [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["ElementRef"] }, { type: undefined, decorators: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Inject"],
+ args: [CDK_DROP_LIST]
+ }, {
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Optional"]
+ }, {
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["SkipSelf"]
+ }] }, { type: undefined, decorators: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Inject"],
+ args: [_angular_common__WEBPACK_IMPORTED_MODULE_1__["DOCUMENT"]]
+ }] }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["NgZone"] }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["ViewContainerRef"] }, { type: undefined, decorators: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Optional"]
+ }, {
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Inject"],
+ args: [CDK_DRAG_CONFIG]
+ }] }, { type: _angular_cdk_bidi__WEBPACK_IMPORTED_MODULE_7__["Directionality"], decorators: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Optional"]
+ }] }, { type: DragDrop }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["ChangeDetectorRef"] }, { type: CdkDragHandle, decorators: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Optional"]
+ }, {
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Self"]
+ }, {
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Inject"],
+ args: [CDK_DRAG_HANDLE]
+ }] }, { type: CdkDrag, decorators: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Optional"]
+ }, {
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["SkipSelf"]
+ }, {
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Inject"],
+ args: [CDK_DRAG_PARENT]
+ }] }]; }, { started: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Output"],
+ args: ['cdkDragStarted']
+ }], released: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Output"],
+ args: ['cdkDragReleased']
+ }], ended: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Output"],
+ args: ['cdkDragEnded']
+ }], entered: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Output"],
+ args: ['cdkDragEntered']
+ }], exited: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Output"],
+ args: ['cdkDragExited']
+ }], dropped: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Output"],
+ args: ['cdkDragDropped']
+ }], moved: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Output"],
+ args: ['cdkDragMoved']
+ }], disabled: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"],
+ args: ['cdkDragDisabled']
+ }], dragStartDelay: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"],
+ args: ['cdkDragStartDelay']
+ }], lockAxis: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"],
+ args: ['cdkDragLockAxis']
+ }], constrainPosition: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"],
+ args: ['cdkDragConstrainPosition']
+ }], previewClass: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"],
+ args: ['cdkDragPreviewClass']
+ }], boundaryElement: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"],
+ args: ['cdkDragBoundary']
+ }], rootElementSelector: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"],
+ args: ['cdkDragRootElement']
+ }], _handles: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["ContentChildren"],
+ args: [CDK_DRAG_HANDLE, { descendants: true }]
+ }], _previewTemplate: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["ContentChild"],
+ args: [CDK_DRAG_PREVIEW]
+ }], _placeholderTemplate: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["ContentChild"],
+ args: [CDK_DRAG_PLACEHOLDER]
+ }], data: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"],
+ args: ['cdkDragData']
+ }], freeDragPosition: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"],
+ args: ['cdkDragFreeDragPosition']
+ }] }); })();
+/** Gets the closest ancestor of an element that matches a selector. */
+function getClosestMatchingAncestor(element, selector) {
+ let currentElement = element.parentElement;
+ while (currentElement) {
+ // IE doesn't support `matches` so we have to fall back to `msMatchesSelector`.
+ if (currentElement.matches ? currentElement.matches(selector) :
+ currentElement.msMatchesSelector(selector)) {
+ return currentElement;
+ }
+ currentElement = currentElement.parentElement;
+ }
+ return null;
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+class DragDropModule {
+}
+DragDropModule.ɵfac = function DragDropModule_Factory(t) { return new (t || DragDropModule)(); };
+DragDropModule.ɵmod = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineNgModule"]({ type: DragDropModule });
+DragDropModule.ɵinj = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineInjector"]({ providers: [
+ DragDrop,
+ ], imports: [_angular_cdk_scrolling__WEBPACK_IMPORTED_MODULE_2__["CdkScrollableModule"]] });
+(function () { (typeof ngJitMode === "undefined" || ngJitMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵsetNgModuleScope"](DragDropModule, { declarations: function () { return [CdkDropList, CdkDropListGroup, CdkDrag, CdkDragHandle, CdkDragPreview, CdkDragPlaceholder]; }, exports: function () { return [_angular_cdk_scrolling__WEBPACK_IMPORTED_MODULE_2__["CdkScrollableModule"], CdkDropList, CdkDropListGroup, CdkDrag, CdkDragHandle, CdkDragPreview, CdkDragPlaceholder]; } }); })();
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](DragDropModule, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["NgModule"],
+ args: [{
+ declarations: [
+ CdkDropList,
+ CdkDropListGroup,
+ CdkDrag,
+ CdkDragHandle,
+ CdkDragPreview,
+ CdkDragPlaceholder,
+ ],
+ exports: [
+ _angular_cdk_scrolling__WEBPACK_IMPORTED_MODULE_2__["CdkScrollableModule"],
+ CdkDropList,
+ CdkDropListGroup,
+ CdkDrag,
+ CdkDragHandle,
+ CdkDragPreview,
+ CdkDragPlaceholder,
+ ],
+ providers: [
+ DragDrop,
+ ]
+ }]
+ }], null, null); })();
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+
+/**
+ * Generated bundle index. Do not edit.
+ */
+
+
+
+//# sourceMappingURL=drag-drop.js.map
+
+/***/ }),
+
+/***/ "./node_modules/@angular/cdk/__ivy_ngcc__/fesm2015/keycodes.js":
+/*!*********************************************************************!*\
+ !*** ./node_modules/@angular/cdk/__ivy_ngcc__/fesm2015/keycodes.js ***!
+ \*********************************************************************/
+/*! exports provided: A, ALT, APOSTROPHE, AT_SIGN, B, BACKSLASH, BACKSPACE, C, CAPS_LOCK, CLOSE_SQUARE_BRACKET, COMMA, CONTEXT_MENU, CONTROL, D, DASH, DELETE, DOWN_ARROW, E, EIGHT, END, ENTER, EQUALS, ESCAPE, F, F1, F10, F11, F12, F2, F3, F4, F5, F6, F7, F8, F9, FF_EQUALS, FF_MINUS, FF_MUTE, FF_SEMICOLON, FF_VOLUME_DOWN, FF_VOLUME_UP, FIRST_MEDIA, FIVE, FOUR, G, H, HOME, I, INSERT, J, K, L, LAST_MEDIA, LEFT_ARROW, M, MAC_ENTER, MAC_META, MAC_WK_CMD_LEFT, MAC_WK_CMD_RIGHT, META, MUTE, N, NINE, NUMPAD_DIVIDE, NUMPAD_EIGHT, NUMPAD_FIVE, NUMPAD_FOUR, NUMPAD_MINUS, NUMPAD_MULTIPLY, NUMPAD_NINE, NUMPAD_ONE, NUMPAD_PERIOD, NUMPAD_PLUS, NUMPAD_SEVEN, NUMPAD_SIX, NUMPAD_THREE, NUMPAD_TWO, NUMPAD_ZERO, NUM_CENTER, NUM_LOCK, O, ONE, OPEN_SQUARE_BRACKET, P, PAGE_DOWN, PAGE_UP, PAUSE, PERIOD, PLUS_SIGN, PRINT_SCREEN, Q, QUESTION_MARK, R, RIGHT_ARROW, S, SCROLL_LOCK, SEMICOLON, SEVEN, SHIFT, SINGLE_QUOTE, SIX, SLASH, SPACE, T, TAB, THREE, TILDE, TWO, U, UP_ARROW, V, VOLUME_DOWN, VOLUME_UP, W, X, Y, Z, ZERO, hasModifierKey */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "A", function() { return A; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ALT", function() { return ALT; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "APOSTROPHE", function() { return APOSTROPHE; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AT_SIGN", function() { return AT_SIGN; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "B", function() { return B; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BACKSLASH", function() { return BACKSLASH; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BACKSPACE", function() { return BACKSPACE; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "C", function() { return C; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CAPS_LOCK", function() { return CAPS_LOCK; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CLOSE_SQUARE_BRACKET", function() { return CLOSE_SQUARE_BRACKET; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "COMMA", function() { return COMMA; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CONTEXT_MENU", function() { return CONTEXT_MENU; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CONTROL", function() { return CONTROL; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "D", function() { return D; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "DASH", function() { return DASH; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "DELETE", function() { return DELETE; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "DOWN_ARROW", function() { return DOWN_ARROW; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "E", function() { return E; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "EIGHT", function() { return EIGHT; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "END", function() { return END; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ENTER", function() { return ENTER; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "EQUALS", function() { return EQUALS; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ESCAPE", function() { return ESCAPE; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "F", function() { return F; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "F1", function() { return F1; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "F10", function() { return F10; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "F11", function() { return F11; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "F12", function() { return F12; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "F2", function() { return F2; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "F3", function() { return F3; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "F4", function() { return F4; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "F5", function() { return F5; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "F6", function() { return F6; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "F7", function() { return F7; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "F8", function() { return F8; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "F9", function() { return F9; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FF_EQUALS", function() { return FF_EQUALS; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FF_MINUS", function() { return FF_MINUS; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FF_MUTE", function() { return FF_MUTE; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FF_SEMICOLON", function() { return FF_SEMICOLON; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FF_VOLUME_DOWN", function() { return FF_VOLUME_DOWN; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FF_VOLUME_UP", function() { return FF_VOLUME_UP; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FIRST_MEDIA", function() { return FIRST_MEDIA; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FIVE", function() { return FIVE; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FOUR", function() { return FOUR; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "G", function() { return G; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "H", function() { return H; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "HOME", function() { return HOME; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "I", function() { return I; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "INSERT", function() { return INSERT; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "J", function() { return J; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "K", function() { return K; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "L", function() { return L; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LAST_MEDIA", function() { return LAST_MEDIA; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LEFT_ARROW", function() { return LEFT_ARROW; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "M", function() { return M; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MAC_ENTER", function() { return MAC_ENTER; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MAC_META", function() { return MAC_META; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MAC_WK_CMD_LEFT", function() { return MAC_WK_CMD_LEFT; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MAC_WK_CMD_RIGHT", function() { return MAC_WK_CMD_RIGHT; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "META", function() { return META; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MUTE", function() { return MUTE; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "N", function() { return N; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "NINE", function() { return NINE; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "NUMPAD_DIVIDE", function() { return NUMPAD_DIVIDE; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "NUMPAD_EIGHT", function() { return NUMPAD_EIGHT; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "NUMPAD_FIVE", function() { return NUMPAD_FIVE; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "NUMPAD_FOUR", function() { return NUMPAD_FOUR; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "NUMPAD_MINUS", function() { return NUMPAD_MINUS; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "NUMPAD_MULTIPLY", function() { return NUMPAD_MULTIPLY; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "NUMPAD_NINE", function() { return NUMPAD_NINE; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "NUMPAD_ONE", function() { return NUMPAD_ONE; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "NUMPAD_PERIOD", function() { return NUMPAD_PERIOD; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "NUMPAD_PLUS", function() { return NUMPAD_PLUS; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "NUMPAD_SEVEN", function() { return NUMPAD_SEVEN; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "NUMPAD_SIX", function() { return NUMPAD_SIX; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "NUMPAD_THREE", function() { return NUMPAD_THREE; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "NUMPAD_TWO", function() { return NUMPAD_TWO; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "NUMPAD_ZERO", function() { return NUMPAD_ZERO; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "NUM_CENTER", function() { return NUM_CENTER; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "NUM_LOCK", function() { return NUM_LOCK; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "O", function() { return O; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ONE", function() { return ONE; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "OPEN_SQUARE_BRACKET", function() { return OPEN_SQUARE_BRACKET; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "P", function() { return P; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PAGE_DOWN", function() { return PAGE_DOWN; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PAGE_UP", function() { return PAGE_UP; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PAUSE", function() { return PAUSE; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PERIOD", function() { return PERIOD; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PLUS_SIGN", function() { return PLUS_SIGN; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PRINT_SCREEN", function() { return PRINT_SCREEN; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Q", function() { return Q; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "QUESTION_MARK", function() { return QUESTION_MARK; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "R", function() { return R; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "RIGHT_ARROW", function() { return RIGHT_ARROW; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "S", function() { return S; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SCROLL_LOCK", function() { return SCROLL_LOCK; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SEMICOLON", function() { return SEMICOLON; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SEVEN", function() { return SEVEN; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SHIFT", function() { return SHIFT; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SINGLE_QUOTE", function() { return SINGLE_QUOTE; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SIX", function() { return SIX; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SLASH", function() { return SLASH; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SPACE", function() { return SPACE; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "T", function() { return T; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TAB", function() { return TAB; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "THREE", function() { return THREE; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TILDE", function() { return TILDE; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TWO", function() { return TWO; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "U", function() { return U; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "UP_ARROW", function() { return UP_ARROW; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "V", function() { return V; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "VOLUME_DOWN", function() { return VOLUME_DOWN; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "VOLUME_UP", function() { return VOLUME_UP; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "W", function() { return W; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "X", function() { return X; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Y", function() { return Y; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Z", function() { return Z; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ZERO", function() { return ZERO; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "hasModifierKey", function() { return hasModifierKey; });
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+const MAC_ENTER = 3;
+const BACKSPACE = 8;
+const TAB = 9;
+const NUM_CENTER = 12;
+const ENTER = 13;
+const SHIFT = 16;
+const CONTROL = 17;
+const ALT = 18;
+const PAUSE = 19;
+const CAPS_LOCK = 20;
+const ESCAPE = 27;
+const SPACE = 32;
+const PAGE_UP = 33;
+const PAGE_DOWN = 34;
+const END = 35;
+const HOME = 36;
+const LEFT_ARROW = 37;
+const UP_ARROW = 38;
+const RIGHT_ARROW = 39;
+const DOWN_ARROW = 40;
+const PLUS_SIGN = 43;
+const PRINT_SCREEN = 44;
+const INSERT = 45;
+const DELETE = 46;
+const ZERO = 48;
+const ONE = 49;
+const TWO = 50;
+const THREE = 51;
+const FOUR = 52;
+const FIVE = 53;
+const SIX = 54;
+const SEVEN = 55;
+const EIGHT = 56;
+const NINE = 57;
+const FF_SEMICOLON = 59; // Firefox (Gecko) fires this for semicolon instead of 186
+const FF_EQUALS = 61; // Firefox (Gecko) fires this for equals instead of 187
+const QUESTION_MARK = 63;
+const AT_SIGN = 64;
+const A = 65;
+const B = 66;
+const C = 67;
+const D = 68;
+const E = 69;
+const F = 70;
+const G = 71;
+const H = 72;
+const I = 73;
+const J = 74;
+const K = 75;
+const L = 76;
+const M = 77;
+const N = 78;
+const O = 79;
+const P = 80;
+const Q = 81;
+const R = 82;
+const S = 83;
+const T = 84;
+const U = 85;
+const V = 86;
+const W = 87;
+const X = 88;
+const Y = 89;
+const Z = 90;
+const META = 91; // WIN_KEY_LEFT
+const MAC_WK_CMD_LEFT = 91;
+const MAC_WK_CMD_RIGHT = 93;
+const CONTEXT_MENU = 93;
+const NUMPAD_ZERO = 96;
+const NUMPAD_ONE = 97;
+const NUMPAD_TWO = 98;
+const NUMPAD_THREE = 99;
+const NUMPAD_FOUR = 100;
+const NUMPAD_FIVE = 101;
+const NUMPAD_SIX = 102;
+const NUMPAD_SEVEN = 103;
+const NUMPAD_EIGHT = 104;
+const NUMPAD_NINE = 105;
+const NUMPAD_MULTIPLY = 106;
+const NUMPAD_PLUS = 107;
+const NUMPAD_MINUS = 109;
+const NUMPAD_PERIOD = 110;
+const NUMPAD_DIVIDE = 111;
+const F1 = 112;
+const F2 = 113;
+const F3 = 114;
+const F4 = 115;
+const F5 = 116;
+const F6 = 117;
+const F7 = 118;
+const F8 = 119;
+const F9 = 120;
+const F10 = 121;
+const F11 = 122;
+const F12 = 123;
+const NUM_LOCK = 144;
+const SCROLL_LOCK = 145;
+const FIRST_MEDIA = 166;
+const FF_MINUS = 173;
+const MUTE = 173; // Firefox (Gecko) fires 181 for MUTE
+const VOLUME_DOWN = 174; // Firefox (Gecko) fires 182 for VOLUME_DOWN
+const VOLUME_UP = 175; // Firefox (Gecko) fires 183 for VOLUME_UP
+const FF_MUTE = 181;
+const FF_VOLUME_DOWN = 182;
+const LAST_MEDIA = 183;
+const FF_VOLUME_UP = 183;
+const SEMICOLON = 186; // Firefox (Gecko) fires 59 for SEMICOLON
+const EQUALS = 187; // Firefox (Gecko) fires 61 for EQUALS
+const COMMA = 188;
+const DASH = 189; // Firefox (Gecko) fires 173 for DASH/MINUS
+const PERIOD = 190;
+const SLASH = 191;
+const APOSTROPHE = 192;
+const TILDE = 192;
+const OPEN_SQUARE_BRACKET = 219;
+const BACKSLASH = 220;
+const CLOSE_SQUARE_BRACKET = 221;
+const SINGLE_QUOTE = 222;
+const MAC_META = 224;
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * Checks whether a modifier key is pressed.
+ * @param event Event to be checked.
+ */
+function hasModifierKey(event, ...modifiers) {
+ if (modifiers.length) {
+ return modifiers.some(modifier => event[modifier]);
+ }
+ return event.altKey || event.shiftKey || event.ctrlKey || event.metaKey;
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+
+/**
+ * Generated bundle index. Do not edit.
+ */
+
+
+
+//# sourceMappingURL=keycodes.js.map
+
+/***/ }),
+
+/***/ "./node_modules/@angular/cdk/__ivy_ngcc__/fesm2015/observers.js":
+/*!**********************************************************************!*\
+ !*** ./node_modules/@angular/cdk/__ivy_ngcc__/fesm2015/observers.js ***!
+ \**********************************************************************/
+/*! exports provided: CdkObserveContent, ContentObserver, MutationObserverFactory, ObserversModule */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CdkObserveContent", function() { return CdkObserveContent; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ContentObserver", function() { return ContentObserver; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MutationObserverFactory", function() { return MutationObserverFactory; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ObserversModule", function() { return ObserversModule; });
+/* harmony import */ var _angular_cdk_coercion__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/cdk/coercion */ "./node_modules/@angular/cdk/fesm2015/coercion.js");
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var rxjs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! rxjs */ "./node_modules/rxjs/_esm5/index.js");
+/* harmony import */ var rxjs_operators__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! rxjs/operators */ "./node_modules/rxjs/_esm5/operators/index.js");
+
+
+
+
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * Factory that creates a new MutationObserver and allows us to stub it out in unit tests.
+ * @docs-private
+ */
+
+class MutationObserverFactory {
+ create(callback) {
+ return typeof MutationObserver === 'undefined' ? null : new MutationObserver(callback);
+ }
+}
+MutationObserverFactory.ɵfac = function MutationObserverFactory_Factory(t) { return new (t || MutationObserverFactory)(); };
+MutationObserverFactory.ɵprov = Object(_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdefineInjectable"])({ factory: function MutationObserverFactory_Factory() { return new MutationObserverFactory(); }, token: MutationObserverFactory, providedIn: "root" });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵsetClassMetadata"](MutationObserverFactory, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Injectable"],
+ args: [{ providedIn: 'root' }]
+ }], null, null); })();
+/** An injectable service that allows watching elements for changes to their content. */
+class ContentObserver {
+ constructor(_mutationObserverFactory) {
+ this._mutationObserverFactory = _mutationObserverFactory;
+ /** Keeps track of the existing MutationObservers so they can be reused. */
+ this._observedElements = new Map();
+ }
+ ngOnDestroy() {
+ this._observedElements.forEach((_, element) => this._cleanupObserver(element));
+ }
+ observe(elementOrRef) {
+ const element = Object(_angular_cdk_coercion__WEBPACK_IMPORTED_MODULE_0__["coerceElement"])(elementOrRef);
+ return new rxjs__WEBPACK_IMPORTED_MODULE_2__["Observable"]((observer) => {
+ const stream = this._observeElement(element);
+ const subscription = stream.subscribe(observer);
+ return () => {
+ subscription.unsubscribe();
+ this._unobserveElement(element);
+ };
+ });
+ }
+ /**
+ * Observes the given element by using the existing MutationObserver if available, or creating a
+ * new one if not.
+ */
+ _observeElement(element) {
+ if (!this._observedElements.has(element)) {
+ const stream = new rxjs__WEBPACK_IMPORTED_MODULE_2__["Subject"]();
+ const observer = this._mutationObserverFactory.create(mutations => stream.next(mutations));
+ if (observer) {
+ observer.observe(element, {
+ characterData: true,
+ childList: true,
+ subtree: true
+ });
+ }
+ this._observedElements.set(element, { observer, stream, count: 1 });
+ }
+ else {
+ this._observedElements.get(element).count++;
+ }
+ return this._observedElements.get(element).stream;
+ }
+ /**
+ * Un-observes the given element and cleans up the underlying MutationObserver if nobody else is
+ * observing this element.
+ */
+ _unobserveElement(element) {
+ if (this._observedElements.has(element)) {
+ this._observedElements.get(element).count--;
+ if (!this._observedElements.get(element).count) {
+ this._cleanupObserver(element);
+ }
+ }
+ }
+ /** Clean up the underlying MutationObserver for the specified element. */
+ _cleanupObserver(element) {
+ if (this._observedElements.has(element)) {
+ const { observer, stream } = this._observedElements.get(element);
+ if (observer) {
+ observer.disconnect();
+ }
+ stream.complete();
+ this._observedElements.delete(element);
+ }
+ }
+}
+ContentObserver.ɵfac = function ContentObserver_Factory(t) { return new (t || ContentObserver)(_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵinject"](MutationObserverFactory)); };
+ContentObserver.ɵprov = Object(_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdefineInjectable"])({ factory: function ContentObserver_Factory() { return new ContentObserver(Object(_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵinject"])(MutationObserverFactory)); }, token: ContentObserver, providedIn: "root" });
+ContentObserver.ctorParameters = () => [
+ { type: MutationObserverFactory }
+];
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵsetClassMetadata"](ContentObserver, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Injectable"],
+ args: [{ providedIn: 'root' }]
+ }], function () { return [{ type: MutationObserverFactory }]; }, null); })();
+/**
+ * Directive that triggers a callback whenever the content of
+ * its associated element has changed.
+ */
+class CdkObserveContent {
+ constructor(_contentObserver, _elementRef, _ngZone) {
+ this._contentObserver = _contentObserver;
+ this._elementRef = _elementRef;
+ this._ngZone = _ngZone;
+ /** Event emitted for each change in the element's content. */
+ this.event = new _angular_core__WEBPACK_IMPORTED_MODULE_1__["EventEmitter"]();
+ this._disabled = false;
+ this._currentSubscription = null;
+ }
+ /**
+ * Whether observing content is disabled. This option can be used
+ * to disconnect the underlying MutationObserver until it is needed.
+ */
+ get disabled() { return this._disabled; }
+ set disabled(value) {
+ this._disabled = Object(_angular_cdk_coercion__WEBPACK_IMPORTED_MODULE_0__["coerceBooleanProperty"])(value);
+ this._disabled ? this._unsubscribe() : this._subscribe();
+ }
+ /** Debounce interval for emitting the changes. */
+ get debounce() { return this._debounce; }
+ set debounce(value) {
+ this._debounce = Object(_angular_cdk_coercion__WEBPACK_IMPORTED_MODULE_0__["coerceNumberProperty"])(value);
+ this._subscribe();
+ }
+ ngAfterContentInit() {
+ if (!this._currentSubscription && !this.disabled) {
+ this._subscribe();
+ }
+ }
+ ngOnDestroy() {
+ this._unsubscribe();
+ }
+ _subscribe() {
+ this._unsubscribe();
+ const stream = this._contentObserver.observe(this._elementRef);
+ // TODO(mmalerba): We shouldn't be emitting on this @Output() outside the zone.
+ // Consider brining it back inside the zone next time we're making breaking changes.
+ // Bringing it back inside can cause things like infinite change detection loops and changed
+ // after checked errors if people's code isn't handling it properly.
+ this._ngZone.runOutsideAngular(() => {
+ this._currentSubscription =
+ (this.debounce ? stream.pipe(Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_3__["debounceTime"])(this.debounce)) : stream).subscribe(this.event);
+ });
+ }
+ _unsubscribe() {
+ var _a;
+ (_a = this._currentSubscription) === null || _a === void 0 ? void 0 : _a.unsubscribe();
+ }
+}
+CdkObserveContent.ɵfac = function CdkObserveContent_Factory(t) { return new (t || CdkObserveContent)(_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](ContentObserver), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ElementRef"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["NgZone"])); };
+CdkObserveContent.ɵdir = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdefineDirective"]({ type: CdkObserveContent, selectors: [["", "cdkObserveContent", ""]], inputs: { disabled: ["cdkObserveContentDisabled", "disabled"], debounce: "debounce" }, outputs: { event: "cdkObserveContent" }, exportAs: ["cdkObserveContent"] });
+CdkObserveContent.ctorParameters = () => [
+ { type: ContentObserver },
+ { type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["ElementRef"] },
+ { type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["NgZone"] }
+];
+CdkObserveContent.propDecorators = {
+ event: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Output"], args: ['cdkObserveContent',] }],
+ disabled: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Input"], args: ['cdkObserveContentDisabled',] }],
+ debounce: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Input"] }]
+};
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵsetClassMetadata"](CdkObserveContent, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Directive"],
+ args: [{
+ selector: '[cdkObserveContent]',
+ exportAs: 'cdkObserveContent'
+ }]
+ }], function () { return [{ type: ContentObserver }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["ElementRef"] }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["NgZone"] }]; }, { event: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Output"],
+ args: ['cdkObserveContent']
+ }], disabled: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Input"],
+ args: ['cdkObserveContentDisabled']
+ }], debounce: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Input"]
+ }] }); })();
+class ObserversModule {
+}
+ObserversModule.ɵfac = function ObserversModule_Factory(t) { return new (t || ObserversModule)(); };
+ObserversModule.ɵmod = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdefineNgModule"]({ type: ObserversModule });
+ObserversModule.ɵinj = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdefineInjector"]({ providers: [MutationObserverFactory] });
+(function () { (typeof ngJitMode === "undefined" || ngJitMode) && _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵsetNgModuleScope"](ObserversModule, { declarations: [CdkObserveContent], exports: [CdkObserveContent] }); })();
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵsetClassMetadata"](ObserversModule, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["NgModule"],
+ args: [{
+ exports: [CdkObserveContent],
+ declarations: [CdkObserveContent],
+ providers: [MutationObserverFactory]
+ }]
+ }], null, null); })();
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+
+/**
+ * Generated bundle index. Do not edit.
+ */
+
+
+
+//# sourceMappingURL=observers.js.map
+
+/***/ }),
+
+/***/ "./node_modules/@angular/cdk/__ivy_ngcc__/fesm2015/platform.js":
+/*!*********************************************************************!*\
+ !*** ./node_modules/@angular/cdk/__ivy_ngcc__/fesm2015/platform.js ***!
+ \*********************************************************************/
+/*! exports provided: Platform, PlatformModule, _getShadowRoot, _supportsShadowDom, getRtlScrollAxisType, getSupportedInputTypes, normalizePassiveListenerOptions, supportsPassiveEventListeners, supportsScrollBehavior */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Platform", function() { return Platform; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PlatformModule", function() { return PlatformModule; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_getShadowRoot", function() { return _getShadowRoot; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_supportsShadowDom", function() { return _supportsShadowDom; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getRtlScrollAxisType", function() { return getRtlScrollAxisType; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getSupportedInputTypes", function() { return getSupportedInputTypes; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "normalizePassiveListenerOptions", function() { return normalizePassiveListenerOptions; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "supportsPassiveEventListeners", function() { return supportsPassiveEventListeners; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "supportsScrollBehavior", function() { return supportsScrollBehavior; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var _angular_common__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @angular/common */ "./node_modules/@angular/common/__ivy_ngcc__/fesm2015/common.js");
+
+
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+// Whether the current platform supports the V8 Break Iterator. The V8 check
+// is necessary to detect all Blink based browsers.
+
+let hasV8BreakIterator;
+// We need a try/catch around the reference to `Intl`, because accessing it in some cases can
+// cause IE to throw. These cases are tied to particular versions of Windows and can happen if
+// the consumer is providing a polyfilled `Map`. See:
+// https://github.com/Microsoft/ChakraCore/issues/3189
+// https://github.com/angular/components/issues/15687
+try {
+ hasV8BreakIterator = (typeof Intl !== 'undefined' && Intl.v8BreakIterator);
+}
+catch (_a) {
+ hasV8BreakIterator = false;
+}
+/**
+ * Service to detect the current platform by comparing the userAgent strings and
+ * checking browser-specific global properties.
+ */
+class Platform {
+ constructor(_platformId) {
+ this._platformId = _platformId;
+ // We want to use the Angular platform check because if the Document is shimmed
+ // without the navigator, the following checks will fail. This is preferred because
+ // sometimes the Document may be shimmed without the user's knowledge or intention
+ /** Whether the Angular application is being rendered in the browser. */
+ this.isBrowser = this._platformId ?
+ Object(_angular_common__WEBPACK_IMPORTED_MODULE_1__["isPlatformBrowser"])(this._platformId) : typeof document === 'object' && !!document;
+ /** Whether the current browser is Microsoft Edge. */
+ this.EDGE = this.isBrowser && /(edge)/i.test(navigator.userAgent);
+ /** Whether the current rendering engine is Microsoft Trident. */
+ this.TRIDENT = this.isBrowser && /(msie|trident)/i.test(navigator.userAgent);
+ // EdgeHTML and Trident mock Blink specific things and need to be excluded from this check.
+ /** Whether the current rendering engine is Blink. */
+ this.BLINK = this.isBrowser && (!!(window.chrome || hasV8BreakIterator) &&
+ typeof CSS !== 'undefined' && !this.EDGE && !this.TRIDENT);
+ // Webkit is part of the userAgent in EdgeHTML, Blink and Trident. Therefore we need to
+ // ensure that Webkit runs standalone and is not used as another engine's base.
+ /** Whether the current rendering engine is WebKit. */
+ this.WEBKIT = this.isBrowser &&
+ /AppleWebKit/i.test(navigator.userAgent) && !this.BLINK && !this.EDGE && !this.TRIDENT;
+ /** Whether the current platform is Apple iOS. */
+ this.IOS = this.isBrowser && /iPad|iPhone|iPod/.test(navigator.userAgent) &&
+ !('MSStream' in window);
+ // It's difficult to detect the plain Gecko engine, because most of the browsers identify
+ // them self as Gecko-like browsers and modify the userAgent's according to that.
+ // Since we only cover one explicit Firefox case, we can simply check for Firefox
+ // instead of having an unstable check for Gecko.
+ /** Whether the current browser is Firefox. */
+ this.FIREFOX = this.isBrowser && /(firefox|minefield)/i.test(navigator.userAgent);
+ /** Whether the current platform is Android. */
+ // Trident on mobile adds the android platform to the userAgent to trick detections.
+ this.ANDROID = this.isBrowser && /android/i.test(navigator.userAgent) && !this.TRIDENT;
+ // Safari browsers will include the Safari keyword in their userAgent. Some browsers may fake
+ // this and just place the Safari keyword in the userAgent. To be more safe about Safari every
+ // Safari browser should also use Webkit as its layout engine.
+ /** Whether the current browser is Safari. */
+ this.SAFARI = this.isBrowser && /safari/i.test(navigator.userAgent) && this.WEBKIT;
+ }
+}
+Platform.ɵfac = function Platform_Factory(t) { return new (t || Platform)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵinject"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["PLATFORM_ID"])); };
+Platform.ɵprov = Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineInjectable"])({ factory: function Platform_Factory() { return new Platform(Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵinject"])(_angular_core__WEBPACK_IMPORTED_MODULE_0__["PLATFORM_ID"])); }, token: Platform, providedIn: "root" });
+Platform.ctorParameters = () => [
+ { type: Object, decorators: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Inject"], args: [_angular_core__WEBPACK_IMPORTED_MODULE_0__["PLATFORM_ID"],] }] }
+];
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](Platform, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Injectable"],
+ args: [{ providedIn: 'root' }]
+ }], function () { return [{ type: Object, decorators: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Inject"],
+ args: [_angular_core__WEBPACK_IMPORTED_MODULE_0__["PLATFORM_ID"]]
+ }] }]; }, null); })();
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+class PlatformModule {
+}
+PlatformModule.ɵfac = function PlatformModule_Factory(t) { return new (t || PlatformModule)(); };
+PlatformModule.ɵmod = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineNgModule"]({ type: PlatformModule });
+PlatformModule.ɵinj = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineInjector"]({});
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](PlatformModule, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["NgModule"],
+ args: [{}]
+ }], null, null); })();
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/** Cached result Set of input types support by the current browser. */
+let supportedInputTypes;
+/** Types of `` that *might* be supported. */
+const candidateInputTypes = [
+ // `color` must come first. Chrome 56 shows a warning if we change the type to `color` after
+ // first changing it to something else:
+ // The specified value "" does not conform to the required format.
+ // The format is "#rrggbb" where rr, gg, bb are two-digit hexadecimal numbers.
+ 'color',
+ 'button',
+ 'checkbox',
+ 'date',
+ 'datetime-local',
+ 'email',
+ 'file',
+ 'hidden',
+ 'image',
+ 'month',
+ 'number',
+ 'password',
+ 'radio',
+ 'range',
+ 'reset',
+ 'search',
+ 'submit',
+ 'tel',
+ 'text',
+ 'time',
+ 'url',
+ 'week',
+];
+/** @returns The input types supported by this browser. */
+function getSupportedInputTypes() {
+ // Result is cached.
+ if (supportedInputTypes) {
+ return supportedInputTypes;
+ }
+ // We can't check if an input type is not supported until we're on the browser, so say that
+ // everything is supported when not on the browser. We don't use `Platform` here since it's
+ // just a helper function and can't inject it.
+ if (typeof document !== 'object' || !document) {
+ supportedInputTypes = new Set(candidateInputTypes);
+ return supportedInputTypes;
+ }
+ let featureTestInput = document.createElement('input');
+ supportedInputTypes = new Set(candidateInputTypes.filter(value => {
+ featureTestInput.setAttribute('type', value);
+ return featureTestInput.type === value;
+ }));
+ return supportedInputTypes;
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/** Cached result of whether the user's browser supports passive event listeners. */
+let supportsPassiveEvents;
+/**
+ * Checks whether the user's browser supports passive event listeners.
+ * See: https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md
+ */
+function supportsPassiveEventListeners() {
+ if (supportsPassiveEvents == null && typeof window !== 'undefined') {
+ try {
+ window.addEventListener('test', null, Object.defineProperty({}, 'passive', {
+ get: () => supportsPassiveEvents = true
+ }));
+ }
+ finally {
+ supportsPassiveEvents = supportsPassiveEvents || false;
+ }
+ }
+ return supportsPassiveEvents;
+}
+/**
+ * Normalizes an `AddEventListener` object to something that can be passed
+ * to `addEventListener` on any browser, no matter whether it supports the
+ * `options` parameter.
+ * @param options Object to be normalized.
+ */
+function normalizePassiveListenerOptions(options) {
+ return supportsPassiveEventListeners() ? options : !!options.capture;
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/** Cached result of the way the browser handles the horizontal scroll axis in RTL mode. */
+let rtlScrollAxisType;
+/** Cached result of the check that indicates whether the browser supports scroll behaviors. */
+let scrollBehaviorSupported;
+/** Check whether the browser supports scroll behaviors. */
+function supportsScrollBehavior() {
+ if (scrollBehaviorSupported == null) {
+ // If we're not in the browser, it can't be supported. Also check for `Element`, because
+ // some projects stub out the global `document` during SSR which can throw us off.
+ if (typeof document !== 'object' || !document || typeof Element !== 'function' || !Element) {
+ scrollBehaviorSupported = false;
+ return scrollBehaviorSupported;
+ }
+ // If the element can have a `scrollBehavior` style, we can be sure that it's supported.
+ if ('scrollBehavior' in document.documentElement.style) {
+ scrollBehaviorSupported = true;
+ }
+ else {
+ // At this point we have 3 possibilities: `scrollTo` isn't supported at all, it's
+ // supported but it doesn't handle scroll behavior, or it has been polyfilled.
+ const scrollToFunction = Element.prototype.scrollTo;
+ if (scrollToFunction) {
+ // We can detect if the function has been polyfilled by calling `toString` on it. Native
+ // functions are obfuscated using `[native code]`, whereas if it was overwritten we'd get
+ // the actual function source. Via https://davidwalsh.name/detect-native-function. Consider
+ // polyfilled functions as supporting scroll behavior.
+ scrollBehaviorSupported = !/\{\s*\[native code\]\s*\}/.test(scrollToFunction.toString());
+ }
+ else {
+ scrollBehaviorSupported = false;
+ }
+ }
+ }
+ return scrollBehaviorSupported;
+}
+/**
+ * Checks the type of RTL scroll axis used by this browser. As of time of writing, Chrome is NORMAL,
+ * Firefox & Safari are NEGATED, and IE & Edge are INVERTED.
+ */
+function getRtlScrollAxisType() {
+ // We can't check unless we're on the browser. Just assume 'normal' if we're not.
+ if (typeof document !== 'object' || !document) {
+ return 0 /* NORMAL */;
+ }
+ if (rtlScrollAxisType == null) {
+ // Create a 1px wide scrolling container and a 2px wide content element.
+ const scrollContainer = document.createElement('div');
+ const containerStyle = scrollContainer.style;
+ scrollContainer.dir = 'rtl';
+ containerStyle.width = '1px';
+ containerStyle.overflow = 'auto';
+ containerStyle.visibility = 'hidden';
+ containerStyle.pointerEvents = 'none';
+ containerStyle.position = 'absolute';
+ const content = document.createElement('div');
+ const contentStyle = content.style;
+ contentStyle.width = '2px';
+ contentStyle.height = '1px';
+ scrollContainer.appendChild(content);
+ document.body.appendChild(scrollContainer);
+ rtlScrollAxisType = 0 /* NORMAL */;
+ // The viewport starts scrolled all the way to the right in RTL mode. If we are in a NORMAL
+ // browser this would mean that the scrollLeft should be 1. If it's zero instead we know we're
+ // dealing with one of the other two types of browsers.
+ if (scrollContainer.scrollLeft === 0) {
+ // In a NEGATED browser the scrollLeft is always somewhere in [-maxScrollAmount, 0]. For an
+ // INVERTED browser it is always somewhere in [0, maxScrollAmount]. We can determine which by
+ // setting to the scrollLeft to 1. This is past the max for a NEGATED browser, so it will
+ // return 0 when we read it again.
+ scrollContainer.scrollLeft = 1;
+ rtlScrollAxisType =
+ scrollContainer.scrollLeft === 0 ? 1 /* NEGATED */ : 2 /* INVERTED */;
+ }
+ scrollContainer.parentNode.removeChild(scrollContainer);
+ }
+ return rtlScrollAxisType;
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+let shadowDomIsSupported;
+/** Checks whether the user's browser support Shadow DOM. */
+function _supportsShadowDom() {
+ if (shadowDomIsSupported == null) {
+ const head = typeof document !== 'undefined' ? document.head : null;
+ shadowDomIsSupported = !!(head && (head.createShadowRoot || head.attachShadow));
+ }
+ return shadowDomIsSupported;
+}
+/** Gets the shadow root of an element, if supported and the element is inside the Shadow DOM. */
+function _getShadowRoot(element) {
+ if (_supportsShadowDom()) {
+ const rootNode = element.getRootNode ? element.getRootNode() : null;
+ // Note that this should be caught by `_supportsShadowDom`, but some
+ // teams have been able to hit this code path on unsupported browsers.
+ if (typeof ShadowRoot !== 'undefined' && ShadowRoot && rootNode instanceof ShadowRoot) {
+ return rootNode;
+ }
+ }
+ return null;
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+
+/**
+ * Generated bundle index. Do not edit.
+ */
+
+
+
+//# sourceMappingURL=platform.js.map
+
+/***/ }),
+
+/***/ "./node_modules/@angular/cdk/__ivy_ngcc__/fesm2015/scrolling.js":
+/*!**********************************************************************!*\
+ !*** ./node_modules/@angular/cdk/__ivy_ngcc__/fesm2015/scrolling.js ***!
+ \**********************************************************************/
+/*! exports provided: CdkFixedSizeVirtualScroll, CdkScrollable, CdkScrollableModule, CdkVirtualForOf, CdkVirtualScrollViewport, DEFAULT_RESIZE_TIME, DEFAULT_SCROLL_TIME, FixedSizeVirtualScrollStrategy, ScrollDispatcher, ScrollingModule, VIRTUAL_SCROLL_STRATEGY, ViewportRuler, _fixedSizeVirtualScrollStrategyFactory */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CdkFixedSizeVirtualScroll", function() { return CdkFixedSizeVirtualScroll; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CdkScrollable", function() { return CdkScrollable; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CdkScrollableModule", function() { return CdkScrollableModule; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CdkVirtualForOf", function() { return CdkVirtualForOf; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CdkVirtualScrollViewport", function() { return CdkVirtualScrollViewport; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "DEFAULT_RESIZE_TIME", function() { return DEFAULT_RESIZE_TIME; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "DEFAULT_SCROLL_TIME", function() { return DEFAULT_SCROLL_TIME; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FixedSizeVirtualScrollStrategy", function() { return FixedSizeVirtualScrollStrategy; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ScrollDispatcher", function() { return ScrollDispatcher; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ScrollingModule", function() { return ScrollingModule; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "VIRTUAL_SCROLL_STRATEGY", function() { return VIRTUAL_SCROLL_STRATEGY; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ViewportRuler", function() { return ViewportRuler; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_fixedSizeVirtualScrollStrategyFactory", function() { return _fixedSizeVirtualScrollStrategyFactory; });
+/* harmony import */ var _angular_cdk_coercion__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/cdk/coercion */ "./node_modules/@angular/cdk/fesm2015/coercion.js");
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/* harmony import */ var rxjs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! rxjs */ "./node_modules/rxjs/_esm5/index.js");
+/* harmony import */ var rxjs_operators__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! rxjs/operators */ "./node_modules/rxjs/_esm5/operators/index.js");
+/* harmony import */ var _angular_cdk_platform__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @angular/cdk/platform */ "./node_modules/@angular/cdk/__ivy_ngcc__/fesm2015/platform.js");
+/* harmony import */ var _angular_common__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @angular/common */ "./node_modules/@angular/common/__ivy_ngcc__/fesm2015/common.js");
+/* harmony import */ var _angular_cdk_bidi__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @angular/cdk/bidi */ "./node_modules/@angular/cdk/__ivy_ngcc__/fesm2015/bidi.js");
+/* harmony import */ var _angular_cdk_collections__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @angular/cdk/collections */ "./node_modules/@angular/cdk/__ivy_ngcc__/fesm2015/collections.js");
+
+
+
+
+
+
+
+
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/** The injection token used to specify the virtual scrolling strategy. */
+
+
+
+
+
+const _c0 = ["contentWrapper"];
+const _c1 = ["*"];
+const VIRTUAL_SCROLL_STRATEGY = new _angular_core__WEBPACK_IMPORTED_MODULE_1__["InjectionToken"]('VIRTUAL_SCROLL_STRATEGY');
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/** Virtual scrolling strategy for lists with items of known fixed size. */
+class FixedSizeVirtualScrollStrategy {
+ /**
+ * @param itemSize The size of the items in the virtually scrolling list.
+ * @param minBufferPx The minimum amount of buffer (in pixels) before needing to render more
+ * @param maxBufferPx The amount of buffer (in pixels) to render when rendering more.
+ */
+ constructor(itemSize, minBufferPx, maxBufferPx) {
+ this._scrolledIndexChange = new rxjs__WEBPACK_IMPORTED_MODULE_2__["Subject"]();
+ /** @docs-private Implemented as part of VirtualScrollStrategy. */
+ this.scrolledIndexChange = this._scrolledIndexChange.pipe(Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_3__["distinctUntilChanged"])());
+ /** The attached viewport. */
+ this._viewport = null;
+ this._itemSize = itemSize;
+ this._minBufferPx = minBufferPx;
+ this._maxBufferPx = maxBufferPx;
+ }
+ /**
+ * Attaches this scroll strategy to a viewport.
+ * @param viewport The viewport to attach this strategy to.
+ */
+ attach(viewport) {
+ this._viewport = viewport;
+ this._updateTotalContentSize();
+ this._updateRenderedRange();
+ }
+ /** Detaches this scroll strategy from the currently attached viewport. */
+ detach() {
+ this._scrolledIndexChange.complete();
+ this._viewport = null;
+ }
+ /**
+ * Update the item size and buffer size.
+ * @param itemSize The size of the items in the virtually scrolling list.
+ * @param minBufferPx The minimum amount of buffer (in pixels) before needing to render more
+ * @param maxBufferPx The amount of buffer (in pixels) to render when rendering more.
+ */
+ updateItemAndBufferSize(itemSize, minBufferPx, maxBufferPx) {
+ if (maxBufferPx < minBufferPx && (typeof ngDevMode === 'undefined' || ngDevMode)) {
+ throw Error('CDK virtual scroll: maxBufferPx must be greater than or equal to minBufferPx');
+ }
+ this._itemSize = itemSize;
+ this._minBufferPx = minBufferPx;
+ this._maxBufferPx = maxBufferPx;
+ this._updateTotalContentSize();
+ this._updateRenderedRange();
+ }
+ /** @docs-private Implemented as part of VirtualScrollStrategy. */
+ onContentScrolled() {
+ this._updateRenderedRange();
+ }
+ /** @docs-private Implemented as part of VirtualScrollStrategy. */
+ onDataLengthChanged() {
+ this._updateTotalContentSize();
+ this._updateRenderedRange();
+ }
+ /** @docs-private Implemented as part of VirtualScrollStrategy. */
+ onContentRendered() { }
+ /** @docs-private Implemented as part of VirtualScrollStrategy. */
+ onRenderedOffsetChanged() { }
+ /**
+ * Scroll to the offset for the given index.
+ * @param index The index of the element to scroll to.
+ * @param behavior The ScrollBehavior to use when scrolling.
+ */
+ scrollToIndex(index, behavior) {
+ if (this._viewport) {
+ this._viewport.scrollToOffset(index * this._itemSize, behavior);
+ }
+ }
+ /** Update the viewport's total content size. */
+ _updateTotalContentSize() {
+ if (!this._viewport) {
+ return;
+ }
+ this._viewport.setTotalContentSize(this._viewport.getDataLength() * this._itemSize);
+ }
+ /** Update the viewport's rendered range. */
+ _updateRenderedRange() {
+ if (!this._viewport) {
+ return;
+ }
+ const renderedRange = this._viewport.getRenderedRange();
+ const newRange = { start: renderedRange.start, end: renderedRange.end };
+ const viewportSize = this._viewport.getViewportSize();
+ const dataLength = this._viewport.getDataLength();
+ let scrollOffset = this._viewport.measureScrollOffset();
+ // Prevent NaN as result when dividing by zero.
+ let firstVisibleIndex = (this._itemSize > 0) ? scrollOffset / this._itemSize : 0;
+ // If user scrolls to the bottom of the list and data changes to a smaller list
+ if (newRange.end > dataLength) {
+ // We have to recalculate the first visible index based on new data length and viewport size.
+ const maxVisibleItems = Math.ceil(viewportSize / this._itemSize);
+ const newVisibleIndex = Math.max(0, Math.min(firstVisibleIndex, dataLength - maxVisibleItems));
+ // If first visible index changed we must update scroll offset to handle start/end buffers
+ // Current range must also be adjusted to cover the new position (bottom of new list).
+ if (firstVisibleIndex != newVisibleIndex) {
+ firstVisibleIndex = newVisibleIndex;
+ scrollOffset = newVisibleIndex * this._itemSize;
+ newRange.start = Math.floor(firstVisibleIndex);
+ }
+ newRange.end = Math.max(0, Math.min(dataLength, newRange.start + maxVisibleItems));
+ }
+ const startBuffer = scrollOffset - newRange.start * this._itemSize;
+ if (startBuffer < this._minBufferPx && newRange.start != 0) {
+ const expandStart = Math.ceil((this._maxBufferPx - startBuffer) / this._itemSize);
+ newRange.start = Math.max(0, newRange.start - expandStart);
+ newRange.end = Math.min(dataLength, Math.ceil(firstVisibleIndex + (viewportSize + this._minBufferPx) / this._itemSize));
+ }
+ else {
+ const endBuffer = newRange.end * this._itemSize - (scrollOffset + viewportSize);
+ if (endBuffer < this._minBufferPx && newRange.end != dataLength) {
+ const expandEnd = Math.ceil((this._maxBufferPx - endBuffer) / this._itemSize);
+ if (expandEnd > 0) {
+ newRange.end = Math.min(dataLength, newRange.end + expandEnd);
+ newRange.start = Math.max(0, Math.floor(firstVisibleIndex - this._minBufferPx / this._itemSize));
+ }
+ }
+ }
+ this._viewport.setRenderedRange(newRange);
+ this._viewport.setRenderedContentOffset(this._itemSize * newRange.start);
+ this._scrolledIndexChange.next(Math.floor(firstVisibleIndex));
+ }
+}
+/**
+ * Provider factory for `FixedSizeVirtualScrollStrategy` that simply extracts the already created
+ * `FixedSizeVirtualScrollStrategy` from the given directive.
+ * @param fixedSizeDir The instance of `CdkFixedSizeVirtualScroll` to extract the
+ * `FixedSizeVirtualScrollStrategy` from.
+ */
+function _fixedSizeVirtualScrollStrategyFactory(fixedSizeDir) {
+ return fixedSizeDir._scrollStrategy;
+}
+/** A virtual scroll strategy that supports fixed-size items. */
+class CdkFixedSizeVirtualScroll {
+ constructor() {
+ this._itemSize = 20;
+ this._minBufferPx = 100;
+ this._maxBufferPx = 200;
+ /** The scroll strategy used by this directive. */
+ this._scrollStrategy = new FixedSizeVirtualScrollStrategy(this.itemSize, this.minBufferPx, this.maxBufferPx);
+ }
+ /** The size of the items in the list (in pixels). */
+ get itemSize() { return this._itemSize; }
+ set itemSize(value) { this._itemSize = Object(_angular_cdk_coercion__WEBPACK_IMPORTED_MODULE_0__["coerceNumberProperty"])(value); }
+ /**
+ * The minimum amount of buffer rendered beyond the viewport (in pixels).
+ * If the amount of buffer dips below this number, more items will be rendered. Defaults to 100px.
+ */
+ get minBufferPx() { return this._minBufferPx; }
+ set minBufferPx(value) { this._minBufferPx = Object(_angular_cdk_coercion__WEBPACK_IMPORTED_MODULE_0__["coerceNumberProperty"])(value); }
+ /**
+ * The number of pixels worth of buffer to render for when rendering new items. Defaults to 200px.
+ */
+ get maxBufferPx() { return this._maxBufferPx; }
+ set maxBufferPx(value) { this._maxBufferPx = Object(_angular_cdk_coercion__WEBPACK_IMPORTED_MODULE_0__["coerceNumberProperty"])(value); }
+ ngOnChanges() {
+ this._scrollStrategy.updateItemAndBufferSize(this.itemSize, this.minBufferPx, this.maxBufferPx);
+ }
+}
+CdkFixedSizeVirtualScroll.ɵfac = function CdkFixedSizeVirtualScroll_Factory(t) { return new (t || CdkFixedSizeVirtualScroll)(); };
+CdkFixedSizeVirtualScroll.ɵdir = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdefineDirective"]({ type: CdkFixedSizeVirtualScroll, selectors: [["cdk-virtual-scroll-viewport", "itemSize", ""]], inputs: { itemSize: "itemSize", minBufferPx: "minBufferPx", maxBufferPx: "maxBufferPx" }, features: [_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵProvidersFeature"]([{
+ provide: VIRTUAL_SCROLL_STRATEGY,
+ useFactory: _fixedSizeVirtualScrollStrategyFactory,
+ deps: [Object(_angular_core__WEBPACK_IMPORTED_MODULE_1__["forwardRef"])(() => CdkFixedSizeVirtualScroll)]
+ }]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵNgOnChangesFeature"]] });
+CdkFixedSizeVirtualScroll.propDecorators = {
+ itemSize: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Input"] }],
+ minBufferPx: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Input"] }],
+ maxBufferPx: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Input"] }]
+};
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵsetClassMetadata"](CdkFixedSizeVirtualScroll, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Directive"],
+ args: [{
+ selector: 'cdk-virtual-scroll-viewport[itemSize]',
+ providers: [{
+ provide: VIRTUAL_SCROLL_STRATEGY,
+ useFactory: _fixedSizeVirtualScrollStrategyFactory,
+ deps: [Object(_angular_core__WEBPACK_IMPORTED_MODULE_1__["forwardRef"])(() => CdkFixedSizeVirtualScroll)]
+ }]
+ }]
+ }], function () { return []; }, { itemSize: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Input"]
+ }], minBufferPx: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Input"]
+ }], maxBufferPx: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Input"]
+ }] }); })();
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/** Time in ms to throttle the scrolling events by default. */
+const DEFAULT_SCROLL_TIME = 20;
+/**
+ * Service contained all registered Scrollable references and emits an event when any one of the
+ * Scrollable references emit a scrolled event.
+ */
+class ScrollDispatcher {
+ constructor(_ngZone, _platform, document) {
+ this._ngZone = _ngZone;
+ this._platform = _platform;
+ /** Subject for notifying that a registered scrollable reference element has been scrolled. */
+ this._scrolled = new rxjs__WEBPACK_IMPORTED_MODULE_2__["Subject"]();
+ /** Keeps track of the global `scroll` and `resize` subscriptions. */
+ this._globalSubscription = null;
+ /** Keeps track of the amount of subscriptions to `scrolled`. Used for cleaning up afterwards. */
+ this._scrolledCount = 0;
+ /**
+ * Map of all the scrollable references that are registered with the service and their
+ * scroll event subscriptions.
+ */
+ this.scrollContainers = new Map();
+ this._document = document;
+ }
+ /**
+ * Registers a scrollable instance with the service and listens for its scrolled events. When the
+ * scrollable is scrolled, the service emits the event to its scrolled observable.
+ * @param scrollable Scrollable instance to be registered.
+ */
+ register(scrollable) {
+ if (!this.scrollContainers.has(scrollable)) {
+ this.scrollContainers.set(scrollable, scrollable.elementScrolled()
+ .subscribe(() => this._scrolled.next(scrollable)));
+ }
+ }
+ /**
+ * Deregisters a Scrollable reference and unsubscribes from its scroll event observable.
+ * @param scrollable Scrollable instance to be deregistered.
+ */
+ deregister(scrollable) {
+ const scrollableReference = this.scrollContainers.get(scrollable);
+ if (scrollableReference) {
+ scrollableReference.unsubscribe();
+ this.scrollContainers.delete(scrollable);
+ }
+ }
+ /**
+ * Returns an observable that emits an event whenever any of the registered Scrollable
+ * references (or window, document, or body) fire a scrolled event. Can provide a time in ms
+ * to override the default "throttle" time.
+ *
+ * **Note:** in order to avoid hitting change detection for every scroll event,
+ * all of the events emitted from this stream will be run outside the Angular zone.
+ * If you need to update any data bindings as a result of a scroll event, you have
+ * to run the callback using `NgZone.run`.
+ */
+ scrolled(auditTimeInMs = DEFAULT_SCROLL_TIME) {
+ if (!this._platform.isBrowser) {
+ return Object(rxjs__WEBPACK_IMPORTED_MODULE_2__["of"])();
+ }
+ return new rxjs__WEBPACK_IMPORTED_MODULE_2__["Observable"]((observer) => {
+ if (!this._globalSubscription) {
+ this._addGlobalListener();
+ }
+ // In the case of a 0ms delay, use an observable without auditTime
+ // since it does add a perceptible delay in processing overhead.
+ const subscription = auditTimeInMs > 0 ?
+ this._scrolled.pipe(Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_3__["auditTime"])(auditTimeInMs)).subscribe(observer) :
+ this._scrolled.subscribe(observer);
+ this._scrolledCount++;
+ return () => {
+ subscription.unsubscribe();
+ this._scrolledCount--;
+ if (!this._scrolledCount) {
+ this._removeGlobalListener();
+ }
+ };
+ });
+ }
+ ngOnDestroy() {
+ this._removeGlobalListener();
+ this.scrollContainers.forEach((_, container) => this.deregister(container));
+ this._scrolled.complete();
+ }
+ /**
+ * Returns an observable that emits whenever any of the
+ * scrollable ancestors of an element are scrolled.
+ * @param elementOrElementRef Element whose ancestors to listen for.
+ * @param auditTimeInMs Time to throttle the scroll events.
+ */
+ ancestorScrolled(elementOrElementRef, auditTimeInMs) {
+ const ancestors = this.getAncestorScrollContainers(elementOrElementRef);
+ return this.scrolled(auditTimeInMs).pipe(Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_3__["filter"])(target => {
+ return !target || ancestors.indexOf(target) > -1;
+ }));
+ }
+ /** Returns all registered Scrollables that contain the provided element. */
+ getAncestorScrollContainers(elementOrElementRef) {
+ const scrollingContainers = [];
+ this.scrollContainers.forEach((_subscription, scrollable) => {
+ if (this._scrollableContainsElement(scrollable, elementOrElementRef)) {
+ scrollingContainers.push(scrollable);
+ }
+ });
+ return scrollingContainers;
+ }
+ /** Use defaultView of injected document if available or fallback to global window reference */
+ _getWindow() {
+ return this._document.defaultView || window;
+ }
+ /** Returns true if the element is contained within the provided Scrollable. */
+ _scrollableContainsElement(scrollable, elementOrElementRef) {
+ let element = Object(_angular_cdk_coercion__WEBPACK_IMPORTED_MODULE_0__["coerceElement"])(elementOrElementRef);
+ let scrollableElement = scrollable.getElementRef().nativeElement;
+ // Traverse through the element parents until we reach null, checking if any of the elements
+ // are the scrollable's element.
+ do {
+ if (element == scrollableElement) {
+ return true;
+ }
+ } while (element = element.parentElement);
+ return false;
+ }
+ /** Sets up the global scroll listeners. */
+ _addGlobalListener() {
+ this._globalSubscription = this._ngZone.runOutsideAngular(() => {
+ const window = this._getWindow();
+ return Object(rxjs__WEBPACK_IMPORTED_MODULE_2__["fromEvent"])(window.document, 'scroll').subscribe(() => this._scrolled.next());
+ });
+ }
+ /** Cleans up the global scroll listener. */
+ _removeGlobalListener() {
+ if (this._globalSubscription) {
+ this._globalSubscription.unsubscribe();
+ this._globalSubscription = null;
+ }
+ }
+}
+ScrollDispatcher.ɵfac = function ScrollDispatcher_Factory(t) { return new (t || ScrollDispatcher)(_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵinject"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["NgZone"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵinject"](_angular_cdk_platform__WEBPACK_IMPORTED_MODULE_4__["Platform"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵinject"](_angular_common__WEBPACK_IMPORTED_MODULE_5__["DOCUMENT"], 8)); };
+ScrollDispatcher.ɵprov = Object(_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdefineInjectable"])({ factory: function ScrollDispatcher_Factory() { return new ScrollDispatcher(Object(_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵinject"])(_angular_core__WEBPACK_IMPORTED_MODULE_1__["NgZone"]), Object(_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵinject"])(_angular_cdk_platform__WEBPACK_IMPORTED_MODULE_4__["Platform"]), Object(_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵinject"])(_angular_common__WEBPACK_IMPORTED_MODULE_5__["DOCUMENT"], 8)); }, token: ScrollDispatcher, providedIn: "root" });
+ScrollDispatcher.ctorParameters = () => [
+ { type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["NgZone"] },
+ { type: _angular_cdk_platform__WEBPACK_IMPORTED_MODULE_4__["Platform"] },
+ { type: undefined, decorators: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Optional"] }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Inject"], args: [_angular_common__WEBPACK_IMPORTED_MODULE_5__["DOCUMENT"],] }] }
+];
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵsetClassMetadata"](ScrollDispatcher, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Injectable"],
+ args: [{ providedIn: 'root' }]
+ }], function () { return [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["NgZone"] }, { type: _angular_cdk_platform__WEBPACK_IMPORTED_MODULE_4__["Platform"] }, { type: undefined, decorators: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Optional"]
+ }, {
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Inject"],
+ args: [_angular_common__WEBPACK_IMPORTED_MODULE_5__["DOCUMENT"]]
+ }] }]; }, null); })();
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * Sends an event when the directive's element is scrolled. Registers itself with the
+ * ScrollDispatcher service to include itself as part of its collection of scrolling events that it
+ * can be listened to through the service.
+ */
+class CdkScrollable {
+ constructor(elementRef, scrollDispatcher, ngZone, dir) {
+ this.elementRef = elementRef;
+ this.scrollDispatcher = scrollDispatcher;
+ this.ngZone = ngZone;
+ this.dir = dir;
+ this._destroyed = new rxjs__WEBPACK_IMPORTED_MODULE_2__["Subject"]();
+ this._elementScrolled = new rxjs__WEBPACK_IMPORTED_MODULE_2__["Observable"]((observer) => this.ngZone.runOutsideAngular(() => Object(rxjs__WEBPACK_IMPORTED_MODULE_2__["fromEvent"])(this.elementRef.nativeElement, 'scroll').pipe(Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_3__["takeUntil"])(this._destroyed))
+ .subscribe(observer)));
+ }
+ ngOnInit() {
+ this.scrollDispatcher.register(this);
+ }
+ ngOnDestroy() {
+ this.scrollDispatcher.deregister(this);
+ this._destroyed.next();
+ this._destroyed.complete();
+ }
+ /** Returns observable that emits when a scroll event is fired on the host element. */
+ elementScrolled() {
+ return this._elementScrolled;
+ }
+ /** Gets the ElementRef for the viewport. */
+ getElementRef() {
+ return this.elementRef;
+ }
+ /**
+ * Scrolls to the specified offsets. This is a normalized version of the browser's native scrollTo
+ * method, since browsers are not consistent about what scrollLeft means in RTL. For this method
+ * left and right always refer to the left and right side of the scrolling container irrespective
+ * of the layout direction. start and end refer to left and right in an LTR context and vice-versa
+ * in an RTL context.
+ * @param options specified the offsets to scroll to.
+ */
+ scrollTo(options) {
+ const el = this.elementRef.nativeElement;
+ const isRtl = this.dir && this.dir.value == 'rtl';
+ // Rewrite start & end offsets as right or left offsets.
+ if (options.left == null) {
+ options.left = isRtl ? options.end : options.start;
+ }
+ if (options.right == null) {
+ options.right = isRtl ? options.start : options.end;
+ }
+ // Rewrite the bottom offset as a top offset.
+ if (options.bottom != null) {
+ options.top =
+ el.scrollHeight - el.clientHeight - options.bottom;
+ }
+ // Rewrite the right offset as a left offset.
+ if (isRtl && Object(_angular_cdk_platform__WEBPACK_IMPORTED_MODULE_4__["getRtlScrollAxisType"])() != 0 /* NORMAL */) {
+ if (options.left != null) {
+ options.right =
+ el.scrollWidth - el.clientWidth - options.left;
+ }
+ if (Object(_angular_cdk_platform__WEBPACK_IMPORTED_MODULE_4__["getRtlScrollAxisType"])() == 2 /* INVERTED */) {
+ options.left = options.right;
+ }
+ else if (Object(_angular_cdk_platform__WEBPACK_IMPORTED_MODULE_4__["getRtlScrollAxisType"])() == 1 /* NEGATED */) {
+ options.left = options.right ? -options.right : options.right;
+ }
+ }
+ else {
+ if (options.right != null) {
+ options.left =
+ el.scrollWidth - el.clientWidth - options.right;
+ }
+ }
+ this._applyScrollToOptions(options);
+ }
+ _applyScrollToOptions(options) {
+ const el = this.elementRef.nativeElement;
+ if (Object(_angular_cdk_platform__WEBPACK_IMPORTED_MODULE_4__["supportsScrollBehavior"])()) {
+ el.scrollTo(options);
+ }
+ else {
+ if (options.top != null) {
+ el.scrollTop = options.top;
+ }
+ if (options.left != null) {
+ el.scrollLeft = options.left;
+ }
+ }
+ }
+ /**
+ * Measures the scroll offset relative to the specified edge of the viewport. This method can be
+ * used instead of directly checking scrollLeft or scrollTop, since browsers are not consistent
+ * about what scrollLeft means in RTL. The values returned by this method are normalized such that
+ * left and right always refer to the left and right side of the scrolling container irrespective
+ * of the layout direction. start and end refer to left and right in an LTR context and vice-versa
+ * in an RTL context.
+ * @param from The edge to measure from.
+ */
+ measureScrollOffset(from) {
+ const LEFT = 'left';
+ const RIGHT = 'right';
+ const el = this.elementRef.nativeElement;
+ if (from == 'top') {
+ return el.scrollTop;
+ }
+ if (from == 'bottom') {
+ return el.scrollHeight - el.clientHeight - el.scrollTop;
+ }
+ // Rewrite start & end as left or right offsets.
+ const isRtl = this.dir && this.dir.value == 'rtl';
+ if (from == 'start') {
+ from = isRtl ? RIGHT : LEFT;
+ }
+ else if (from == 'end') {
+ from = isRtl ? LEFT : RIGHT;
+ }
+ if (isRtl && Object(_angular_cdk_platform__WEBPACK_IMPORTED_MODULE_4__["getRtlScrollAxisType"])() == 2 /* INVERTED */) {
+ // For INVERTED, scrollLeft is (scrollWidth - clientWidth) when scrolled all the way left and
+ // 0 when scrolled all the way right.
+ if (from == LEFT) {
+ return el.scrollWidth - el.clientWidth - el.scrollLeft;
+ }
+ else {
+ return el.scrollLeft;
+ }
+ }
+ else if (isRtl && Object(_angular_cdk_platform__WEBPACK_IMPORTED_MODULE_4__["getRtlScrollAxisType"])() == 1 /* NEGATED */) {
+ // For NEGATED, scrollLeft is -(scrollWidth - clientWidth) when scrolled all the way left and
+ // 0 when scrolled all the way right.
+ if (from == LEFT) {
+ return el.scrollLeft + el.scrollWidth - el.clientWidth;
+ }
+ else {
+ return -el.scrollLeft;
+ }
+ }
+ else {
+ // For NORMAL, as well as non-RTL contexts, scrollLeft is 0 when scrolled all the way left and
+ // (scrollWidth - clientWidth) when scrolled all the way right.
+ if (from == LEFT) {
+ return el.scrollLeft;
+ }
+ else {
+ return el.scrollWidth - el.clientWidth - el.scrollLeft;
+ }
+ }
+ }
+}
+CdkScrollable.ɵfac = function CdkScrollable_Factory(t) { return new (t || CdkScrollable)(_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ElementRef"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](ScrollDispatcher), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["NgZone"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](_angular_cdk_bidi__WEBPACK_IMPORTED_MODULE_6__["Directionality"], 8)); };
+CdkScrollable.ɵdir = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdefineDirective"]({ type: CdkScrollable, selectors: [["", "cdk-scrollable", ""], ["", "cdkScrollable", ""]] });
+CdkScrollable.ctorParameters = () => [
+ { type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["ElementRef"] },
+ { type: ScrollDispatcher },
+ { type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["NgZone"] },
+ { type: _angular_cdk_bidi__WEBPACK_IMPORTED_MODULE_6__["Directionality"], decorators: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Optional"] }] }
+];
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵsetClassMetadata"](CdkScrollable, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Directive"],
+ args: [{
+ selector: '[cdk-scrollable], [cdkScrollable]'
+ }]
+ }], function () { return [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["ElementRef"] }, { type: ScrollDispatcher }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["NgZone"] }, { type: _angular_cdk_bidi__WEBPACK_IMPORTED_MODULE_6__["Directionality"], decorators: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Optional"]
+ }] }]; }, null); })();
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/** Time in ms to throttle the resize events by default. */
+const DEFAULT_RESIZE_TIME = 20;
+/**
+ * Simple utility for getting the bounds of the browser viewport.
+ * @docs-private
+ */
+class ViewportRuler {
+ constructor(_platform, ngZone, document) {
+ this._platform = _platform;
+ /** Stream of viewport change events. */
+ this._change = new rxjs__WEBPACK_IMPORTED_MODULE_2__["Subject"]();
+ /** Event listener that will be used to handle the viewport change events. */
+ this._changeListener = (event) => {
+ this._change.next(event);
+ };
+ this._document = document;
+ ngZone.runOutsideAngular(() => {
+ if (_platform.isBrowser) {
+ const window = this._getWindow();
+ // Note that bind the events ourselves, rather than going through something like RxJS's
+ // `fromEvent` so that we can ensure that they're bound outside of the NgZone.
+ window.addEventListener('resize', this._changeListener);
+ window.addEventListener('orientationchange', this._changeListener);
+ }
+ // We don't need to keep track of the subscription,
+ // because we complete the `change` stream on destroy.
+ this.change().subscribe(() => this._updateViewportSize());
+ });
+ }
+ ngOnDestroy() {
+ if (this._platform.isBrowser) {
+ const window = this._getWindow();
+ window.removeEventListener('resize', this._changeListener);
+ window.removeEventListener('orientationchange', this._changeListener);
+ }
+ this._change.complete();
+ }
+ /** Returns the viewport's width and height. */
+ getViewportSize() {
+ if (!this._viewportSize) {
+ this._updateViewportSize();
+ }
+ const output = { width: this._viewportSize.width, height: this._viewportSize.height };
+ // If we're not on a browser, don't cache the size since it'll be mocked out anyway.
+ if (!this._platform.isBrowser) {
+ this._viewportSize = null;
+ }
+ return output;
+ }
+ /** Gets a ClientRect for the viewport's bounds. */
+ getViewportRect() {
+ // Use the document element's bounding rect rather than the window scroll properties
+ // (e.g. pageYOffset, scrollY) due to in issue in Chrome and IE where window scroll
+ // properties and client coordinates (boundingClientRect, clientX/Y, etc.) are in different
+ // conceptual viewports. Under most circumstances these viewports are equivalent, but they
+ // can disagree when the page is pinch-zoomed (on devices that support touch).
+ // See https://bugs.chromium.org/p/chromium/issues/detail?id=489206#c4
+ // We use the documentElement instead of the body because, by default (without a css reset)
+ // browsers typically give the document body an 8px margin, which is not included in
+ // getBoundingClientRect().
+ const scrollPosition = this.getViewportScrollPosition();
+ const { width, height } = this.getViewportSize();
+ return {
+ top: scrollPosition.top,
+ left: scrollPosition.left,
+ bottom: scrollPosition.top + height,
+ right: scrollPosition.left + width,
+ height,
+ width,
+ };
+ }
+ /** Gets the (top, left) scroll position of the viewport. */
+ getViewportScrollPosition() {
+ // While we can get a reference to the fake document
+ // during SSR, it doesn't have getBoundingClientRect.
+ if (!this._platform.isBrowser) {
+ return { top: 0, left: 0 };
+ }
+ // The top-left-corner of the viewport is determined by the scroll position of the document
+ // body, normally just (scrollLeft, scrollTop). However, Chrome and Firefox disagree about
+ // whether `document.body` or `document.documentElement` is the scrolled element, so reading
+ // `scrollTop` and `scrollLeft` is inconsistent. However, using the bounding rect of
+ // `document.documentElement` works consistently, where the `top` and `left` values will
+ // equal negative the scroll position.
+ const document = this._document;
+ const window = this._getWindow();
+ const documentElement = document.documentElement;
+ const documentRect = documentElement.getBoundingClientRect();
+ const top = -documentRect.top || document.body.scrollTop || window.scrollY ||
+ documentElement.scrollTop || 0;
+ const left = -documentRect.left || document.body.scrollLeft || window.scrollX ||
+ documentElement.scrollLeft || 0;
+ return { top, left };
+ }
+ /**
+ * Returns a stream that emits whenever the size of the viewport changes.
+ * @param throttleTime Time in milliseconds to throttle the stream.
+ */
+ change(throttleTime = DEFAULT_RESIZE_TIME) {
+ return throttleTime > 0 ? this._change.pipe(Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_3__["auditTime"])(throttleTime)) : this._change;
+ }
+ /** Use defaultView of injected document if available or fallback to global window reference */
+ _getWindow() {
+ return this._document.defaultView || window;
+ }
+ /** Updates the cached viewport size. */
+ _updateViewportSize() {
+ const window = this._getWindow();
+ this._viewportSize = this._platform.isBrowser ?
+ { width: window.innerWidth, height: window.innerHeight } :
+ { width: 0, height: 0 };
+ }
+}
+ViewportRuler.ɵfac = function ViewportRuler_Factory(t) { return new (t || ViewportRuler)(_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵinject"](_angular_cdk_platform__WEBPACK_IMPORTED_MODULE_4__["Platform"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵinject"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["NgZone"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵinject"](_angular_common__WEBPACK_IMPORTED_MODULE_5__["DOCUMENT"], 8)); };
+ViewportRuler.ɵprov = Object(_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdefineInjectable"])({ factory: function ViewportRuler_Factory() { return new ViewportRuler(Object(_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵinject"])(_angular_cdk_platform__WEBPACK_IMPORTED_MODULE_4__["Platform"]), Object(_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵinject"])(_angular_core__WEBPACK_IMPORTED_MODULE_1__["NgZone"]), Object(_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵinject"])(_angular_common__WEBPACK_IMPORTED_MODULE_5__["DOCUMENT"], 8)); }, token: ViewportRuler, providedIn: "root" });
+ViewportRuler.ctorParameters = () => [
+ { type: _angular_cdk_platform__WEBPACK_IMPORTED_MODULE_4__["Platform"] },
+ { type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["NgZone"] },
+ { type: undefined, decorators: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Optional"] }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Inject"], args: [_angular_common__WEBPACK_IMPORTED_MODULE_5__["DOCUMENT"],] }] }
+];
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵsetClassMetadata"](ViewportRuler, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Injectable"],
+ args: [{ providedIn: 'root' }]
+ }], function () { return [{ type: _angular_cdk_platform__WEBPACK_IMPORTED_MODULE_4__["Platform"] }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["NgZone"] }, { type: undefined, decorators: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Optional"]
+ }, {
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Inject"],
+ args: [_angular_common__WEBPACK_IMPORTED_MODULE_5__["DOCUMENT"]]
+ }] }]; }, null); })();
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/** Checks if the given ranges are equal. */
+function rangesEqual(r1, r2) {
+ return r1.start == r2.start && r1.end == r2.end;
+}
+/**
+ * Scheduler to be used for scroll events. Needs to fall back to
+ * something that doesn't rely on requestAnimationFrame on environments
+ * that don't support it (e.g. server-side rendering).
+ */
+const SCROLL_SCHEDULER = typeof requestAnimationFrame !== 'undefined' ? rxjs__WEBPACK_IMPORTED_MODULE_2__["animationFrameScheduler"] : rxjs__WEBPACK_IMPORTED_MODULE_2__["asapScheduler"];
+/** A viewport that virtualizes its scrolling with the help of `CdkVirtualForOf`. */
+class CdkVirtualScrollViewport extends CdkScrollable {
+ constructor(elementRef, _changeDetectorRef, ngZone, _scrollStrategy, dir, scrollDispatcher, viewportRuler) {
+ super(elementRef, scrollDispatcher, ngZone, dir);
+ this.elementRef = elementRef;
+ this._changeDetectorRef = _changeDetectorRef;
+ this._scrollStrategy = _scrollStrategy;
+ /** Emits when the viewport is detached from a CdkVirtualForOf. */
+ this._detachedSubject = new rxjs__WEBPACK_IMPORTED_MODULE_2__["Subject"]();
+ /** Emits when the rendered range changes. */
+ this._renderedRangeSubject = new rxjs__WEBPACK_IMPORTED_MODULE_2__["Subject"]();
+ this._orientation = 'vertical';
+ // Note: we don't use the typical EventEmitter here because we need to subscribe to the scroll
+ // strategy lazily (i.e. only if the user is actually listening to the events). We do this because
+ // depending on how the strategy calculates the scrolled index, it may come at a cost to
+ // performance.
+ /** Emits when the index of the first element visible in the viewport changes. */
+ this.scrolledIndexChange = new rxjs__WEBPACK_IMPORTED_MODULE_2__["Observable"]((observer) => this._scrollStrategy.scrolledIndexChange.subscribe(index => Promise.resolve().then(() => this.ngZone.run(() => observer.next(index)))));
+ /** A stream that emits whenever the rendered range changes. */
+ this.renderedRangeStream = this._renderedRangeSubject;
+ /**
+ * The total size of all content (in pixels), including content that is not currently rendered.
+ */
+ this._totalContentSize = 0;
+ /** A string representing the `style.width` property value to be used for the spacer element. */
+ this._totalContentWidth = '';
+ /** A string representing the `style.height` property value to be used for the spacer element. */
+ this._totalContentHeight = '';
+ /** The currently rendered range of indices. */
+ this._renderedRange = { start: 0, end: 0 };
+ /** The length of the data bound to this viewport (in number of items). */
+ this._dataLength = 0;
+ /** The size of the viewport (in pixels). */
+ this._viewportSize = 0;
+ /** The last rendered content offset that was set. */
+ this._renderedContentOffset = 0;
+ /**
+ * Whether the last rendered content offset was to the end of the content (and therefore needs to
+ * be rewritten as an offset to the start of the content).
+ */
+ this._renderedContentOffsetNeedsRewrite = false;
+ /** Whether there is a pending change detection cycle. */
+ this._isChangeDetectionPending = false;
+ /** A list of functions to run after the next change detection cycle. */
+ this._runAfterChangeDetection = [];
+ /** Subscription to changes in the viewport size. */
+ this._viewportChanges = rxjs__WEBPACK_IMPORTED_MODULE_2__["Subscription"].EMPTY;
+ if (!_scrollStrategy && (typeof ngDevMode === 'undefined' || ngDevMode)) {
+ throw Error('Error: cdk-virtual-scroll-viewport requires the "itemSize" property to be set.');
+ }
+ this._viewportChanges = viewportRuler.change().subscribe(() => {
+ this.checkViewportSize();
+ });
+ }
+ /** The direction the viewport scrolls. */
+ get orientation() {
+ return this._orientation;
+ }
+ set orientation(orientation) {
+ if (this._orientation !== orientation) {
+ this._orientation = orientation;
+ this._calculateSpacerSize();
+ }
+ }
+ ngOnInit() {
+ super.ngOnInit();
+ // It's still too early to measure the viewport at this point. Deferring with a promise allows
+ // the Viewport to be rendered with the correct size before we measure. We run this outside the
+ // zone to avoid causing more change detection cycles. We handle the change detection loop
+ // ourselves instead.
+ this.ngZone.runOutsideAngular(() => Promise.resolve().then(() => {
+ this._measureViewportSize();
+ this._scrollStrategy.attach(this);
+ this.elementScrolled()
+ .pipe(
+ // Start off with a fake scroll event so we properly detect our initial position.
+ Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_3__["startWith"])(null),
+ // Collect multiple events into one until the next animation frame. This way if
+ // there are multiple scroll events in the same frame we only need to recheck
+ // our layout once.
+ Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_3__["auditTime"])(0, SCROLL_SCHEDULER))
+ .subscribe(() => this._scrollStrategy.onContentScrolled());
+ this._markChangeDetectionNeeded();
+ }));
+ }
+ ngOnDestroy() {
+ this.detach();
+ this._scrollStrategy.detach();
+ // Complete all subjects
+ this._renderedRangeSubject.complete();
+ this._detachedSubject.complete();
+ this._viewportChanges.unsubscribe();
+ super.ngOnDestroy();
+ }
+ /** Attaches a `CdkVirtualScrollRepeater` to this viewport. */
+ attach(forOf) {
+ if (this._forOf && (typeof ngDevMode === 'undefined' || ngDevMode)) {
+ throw Error('CdkVirtualScrollViewport is already attached.');
+ }
+ // Subscribe to the data stream of the CdkVirtualForOf to keep track of when the data length
+ // changes. Run outside the zone to avoid triggering change detection, since we're managing the
+ // change detection loop ourselves.
+ this.ngZone.runOutsideAngular(() => {
+ this._forOf = forOf;
+ this._forOf.dataStream.pipe(Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_3__["takeUntil"])(this._detachedSubject)).subscribe(data => {
+ const newLength = data.length;
+ if (newLength !== this._dataLength) {
+ this._dataLength = newLength;
+ this._scrollStrategy.onDataLengthChanged();
+ }
+ this._doChangeDetection();
+ });
+ });
+ }
+ /** Detaches the current `CdkVirtualForOf`. */
+ detach() {
+ this._forOf = null;
+ this._detachedSubject.next();
+ }
+ /** Gets the length of the data bound to this viewport (in number of items). */
+ getDataLength() {
+ return this._dataLength;
+ }
+ /** Gets the size of the viewport (in pixels). */
+ getViewportSize() {
+ return this._viewportSize;
+ }
+ // TODO(mmalerba): This is technically out of sync with what's really rendered until a render
+ // cycle happens. I'm being careful to only call it after the render cycle is complete and before
+ // setting it to something else, but its error prone and should probably be split into
+ // `pendingRange` and `renderedRange`, the latter reflecting whats actually in the DOM.
+ /** Get the current rendered range of items. */
+ getRenderedRange() {
+ return this._renderedRange;
+ }
+ /**
+ * Sets the total size of all content (in pixels), including content that is not currently
+ * rendered.
+ */
+ setTotalContentSize(size) {
+ if (this._totalContentSize !== size) {
+ this._totalContentSize = size;
+ this._calculateSpacerSize();
+ this._markChangeDetectionNeeded();
+ }
+ }
+ /** Sets the currently rendered range of indices. */
+ setRenderedRange(range) {
+ if (!rangesEqual(this._renderedRange, range)) {
+ this._renderedRangeSubject.next(this._renderedRange = range);
+ this._markChangeDetectionNeeded(() => this._scrollStrategy.onContentRendered());
+ }
+ }
+ /**
+ * Gets the offset from the start of the viewport to the start of the rendered data (in pixels).
+ */
+ getOffsetToRenderedContentStart() {
+ return this._renderedContentOffsetNeedsRewrite ? null : this._renderedContentOffset;
+ }
+ /**
+ * Sets the offset from the start of the viewport to either the start or end of the rendered data
+ * (in pixels).
+ */
+ setRenderedContentOffset(offset, to = 'to-start') {
+ // For a horizontal viewport in a right-to-left language we need to translate along the x-axis
+ // in the negative direction.
+ const isRtl = this.dir && this.dir.value == 'rtl';
+ const isHorizontal = this.orientation == 'horizontal';
+ const axis = isHorizontal ? 'X' : 'Y';
+ const axisDirection = isHorizontal && isRtl ? -1 : 1;
+ let transform = `translate${axis}(${Number(axisDirection * offset)}px)`;
+ this._renderedContentOffset = offset;
+ if (to === 'to-end') {
+ transform += ` translate${axis}(-100%)`;
+ // The viewport should rewrite this as a `to-start` offset on the next render cycle. Otherwise
+ // elements will appear to expand in the wrong direction (e.g. `mat-expansion-panel` would
+ // expand upward).
+ this._renderedContentOffsetNeedsRewrite = true;
+ }
+ if (this._renderedContentTransform != transform) {
+ // We know this value is safe because we parse `offset` with `Number()` before passing it
+ // into the string.
+ this._renderedContentTransform = transform;
+ this._markChangeDetectionNeeded(() => {
+ if (this._renderedContentOffsetNeedsRewrite) {
+ this._renderedContentOffset -= this.measureRenderedContentSize();
+ this._renderedContentOffsetNeedsRewrite = false;
+ this.setRenderedContentOffset(this._renderedContentOffset);
+ }
+ else {
+ this._scrollStrategy.onRenderedOffsetChanged();
+ }
+ });
+ }
+ }
+ /**
+ * Scrolls to the given offset from the start of the viewport. Please note that this is not always
+ * the same as setting `scrollTop` or `scrollLeft`. In a horizontal viewport with right-to-left
+ * direction, this would be the equivalent of setting a fictional `scrollRight` property.
+ * @param offset The offset to scroll to.
+ * @param behavior The ScrollBehavior to use when scrolling. Default is behavior is `auto`.
+ */
+ scrollToOffset(offset, behavior = 'auto') {
+ const options = { behavior };
+ if (this.orientation === 'horizontal') {
+ options.start = offset;
+ }
+ else {
+ options.top = offset;
+ }
+ this.scrollTo(options);
+ }
+ /**
+ * Scrolls to the offset for the given index.
+ * @param index The index of the element to scroll to.
+ * @param behavior The ScrollBehavior to use when scrolling. Default is behavior is `auto`.
+ */
+ scrollToIndex(index, behavior = 'auto') {
+ this._scrollStrategy.scrollToIndex(index, behavior);
+ }
+ /**
+ * Gets the current scroll offset from the start of the viewport (in pixels).
+ * @param from The edge to measure the offset from. Defaults to 'top' in vertical mode and 'start'
+ * in horizontal mode.
+ */
+ measureScrollOffset(from) {
+ return from ?
+ super.measureScrollOffset(from) :
+ super.measureScrollOffset(this.orientation === 'horizontal' ? 'start' : 'top');
+ }
+ /** Measure the combined size of all of the rendered items. */
+ measureRenderedContentSize() {
+ const contentEl = this._contentWrapper.nativeElement;
+ return this.orientation === 'horizontal' ? contentEl.offsetWidth : contentEl.offsetHeight;
+ }
+ /**
+ * Measure the total combined size of the given range. Throws if the range includes items that are
+ * not rendered.
+ */
+ measureRangeSize(range) {
+ if (!this._forOf) {
+ return 0;
+ }
+ return this._forOf.measureRangeSize(range, this.orientation);
+ }
+ /** Update the viewport dimensions and re-render. */
+ checkViewportSize() {
+ // TODO: Cleanup later when add logic for handling content resize
+ this._measureViewportSize();
+ this._scrollStrategy.onDataLengthChanged();
+ }
+ /** Measure the viewport size. */
+ _measureViewportSize() {
+ const viewportEl = this.elementRef.nativeElement;
+ this._viewportSize = this.orientation === 'horizontal' ?
+ viewportEl.clientWidth : viewportEl.clientHeight;
+ }
+ /** Queue up change detection to run. */
+ _markChangeDetectionNeeded(runAfter) {
+ if (runAfter) {
+ this._runAfterChangeDetection.push(runAfter);
+ }
+ // Use a Promise to batch together calls to `_doChangeDetection`. This way if we set a bunch of
+ // properties sequentially we only have to run `_doChangeDetection` once at the end.
+ if (!this._isChangeDetectionPending) {
+ this._isChangeDetectionPending = true;
+ this.ngZone.runOutsideAngular(() => Promise.resolve().then(() => {
+ this._doChangeDetection();
+ }));
+ }
+ }
+ /** Run change detection. */
+ _doChangeDetection() {
+ this._isChangeDetectionPending = false;
+ // Apply the content transform. The transform can't be set via an Angular binding because
+ // bypassSecurityTrustStyle is banned in Google. However the value is safe, it's composed of
+ // string literals, a variable that can only be 'X' or 'Y', and user input that is run through
+ // the `Number` function first to coerce it to a numeric value.
+ this._contentWrapper.nativeElement.style.transform = this._renderedContentTransform;
+ // Apply changes to Angular bindings. Note: We must call `markForCheck` to run change detection
+ // from the root, since the repeated items are content projected in. Calling `detectChanges`
+ // instead does not properly check the projected content.
+ this.ngZone.run(() => this._changeDetectorRef.markForCheck());
+ const runAfterChangeDetection = this._runAfterChangeDetection;
+ this._runAfterChangeDetection = [];
+ for (const fn of runAfterChangeDetection) {
+ fn();
+ }
+ }
+ /** Calculates the `style.width` and `style.height` for the spacer element. */
+ _calculateSpacerSize() {
+ this._totalContentHeight =
+ this.orientation === 'horizontal' ? '' : `${this._totalContentSize}px`;
+ this._totalContentWidth =
+ this.orientation === 'horizontal' ? `${this._totalContentSize}px` : '';
+ }
+}
+CdkVirtualScrollViewport.ɵfac = function CdkVirtualScrollViewport_Factory(t) { return new (t || CdkVirtualScrollViewport)(_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ElementRef"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ChangeDetectorRef"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["NgZone"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](VIRTUAL_SCROLL_STRATEGY, 8), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](_angular_cdk_bidi__WEBPACK_IMPORTED_MODULE_6__["Directionality"], 8), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](ScrollDispatcher), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](ViewportRuler)); };
+CdkVirtualScrollViewport.ɵcmp = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdefineComponent"]({ type: CdkVirtualScrollViewport, selectors: [["cdk-virtual-scroll-viewport"]], viewQuery: function CdkVirtualScrollViewport_Query(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵviewQuery"](_c0, 3);
+ } if (rf & 2) {
+ let _t;
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵqueryRefresh"](_t = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵloadQuery"]()) && (ctx._contentWrapper = _t.first);
+ } }, hostAttrs: [1, "cdk-virtual-scroll-viewport"], hostVars: 4, hostBindings: function CdkVirtualScrollViewport_HostBindings(rf, ctx) { if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵclassProp"]("cdk-virtual-scroll-orientation-horizontal", ctx.orientation === "horizontal")("cdk-virtual-scroll-orientation-vertical", ctx.orientation !== "horizontal");
+ } }, inputs: { orientation: "orientation" }, outputs: { scrolledIndexChange: "scrolledIndexChange" }, features: [_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵProvidersFeature"]([{
+ provide: CdkScrollable,
+ useExisting: CdkVirtualScrollViewport
+ }]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵInheritDefinitionFeature"]], ngContentSelectors: _c1, decls: 10, vars: 4, consts: [[1, "cdk-virtual-scroll-content-wrapper"], ["contentWrapper", ""], [1, "cdk-virtual-scroll-spacer"]], template: function CdkVirtualScrollViewport_Template(rf, ctx) { if (rf & 1) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵprojectionDef"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](0, "\n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementStart"](1, "div", 0, 1);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](3, "\n ");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵprojection"](4);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](5, "\n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelementEnd"]();
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](6, "\n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](7, "\n");
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵelement"](8, "div", 2);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵtext"](9, "\n");
+ } if (rf & 2) {
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵadvance"](8);
+ _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵstyleProp"]("width", ctx._totalContentWidth)("height", ctx._totalContentHeight);
+ } }, styles: ["cdk-virtual-scroll-viewport{display:block;position:relative;overflow:auto;contain:strict;transform:translateZ(0);will-change:scroll-position;-webkit-overflow-scrolling:touch}.cdk-virtual-scroll-content-wrapper{position:absolute;top:0;left:0;contain:content}[dir=rtl] .cdk-virtual-scroll-content-wrapper{right:0;left:auto}.cdk-virtual-scroll-orientation-horizontal .cdk-virtual-scroll-content-wrapper{min-height:100%}.cdk-virtual-scroll-orientation-horizontal .cdk-virtual-scroll-content-wrapper>dl:not([cdkVirtualFor]),.cdk-virtual-scroll-orientation-horizontal .cdk-virtual-scroll-content-wrapper>ol:not([cdkVirtualFor]),.cdk-virtual-scroll-orientation-horizontal .cdk-virtual-scroll-content-wrapper>table:not([cdkVirtualFor]),.cdk-virtual-scroll-orientation-horizontal .cdk-virtual-scroll-content-wrapper>ul:not([cdkVirtualFor]){padding-left:0;padding-right:0;margin-left:0;margin-right:0;border-left-width:0;border-right-width:0;outline:none}.cdk-virtual-scroll-orientation-vertical .cdk-virtual-scroll-content-wrapper{min-width:100%}.cdk-virtual-scroll-orientation-vertical .cdk-virtual-scroll-content-wrapper>dl:not([cdkVirtualFor]),.cdk-virtual-scroll-orientation-vertical .cdk-virtual-scroll-content-wrapper>ol:not([cdkVirtualFor]),.cdk-virtual-scroll-orientation-vertical .cdk-virtual-scroll-content-wrapper>table:not([cdkVirtualFor]),.cdk-virtual-scroll-orientation-vertical .cdk-virtual-scroll-content-wrapper>ul:not([cdkVirtualFor]){padding-top:0;padding-bottom:0;margin-top:0;margin-bottom:0;border-top-width:0;border-bottom-width:0;outline:none}.cdk-virtual-scroll-spacer{position:absolute;top:0;left:0;height:1px;width:1px;transform-origin:0 0}[dir=rtl] .cdk-virtual-scroll-spacer{right:0;left:auto;transform-origin:100% 0}\n"], encapsulation: 2, changeDetection: 0 });
+CdkVirtualScrollViewport.ctorParameters = () => [
+ { type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["ElementRef"] },
+ { type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["ChangeDetectorRef"] },
+ { type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["NgZone"] },
+ { type: undefined, decorators: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Optional"] }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Inject"], args: [VIRTUAL_SCROLL_STRATEGY,] }] },
+ { type: _angular_cdk_bidi__WEBPACK_IMPORTED_MODULE_6__["Directionality"], decorators: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Optional"] }] },
+ { type: ScrollDispatcher },
+ { type: ViewportRuler }
+];
+CdkVirtualScrollViewport.propDecorators = {
+ orientation: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Input"] }],
+ scrolledIndexChange: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Output"] }],
+ _contentWrapper: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["ViewChild"], args: ['contentWrapper', { static: true },] }]
+};
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵsetClassMetadata"](CdkVirtualScrollViewport, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Component"],
+ args: [{
+ selector: 'cdk-virtual-scroll-viewport',
+ template: "\n\n \n
\n\n\n",
+ host: {
+ 'class': 'cdk-virtual-scroll-viewport',
+ '[class.cdk-virtual-scroll-orientation-horizontal]': 'orientation === "horizontal"',
+ '[class.cdk-virtual-scroll-orientation-vertical]': 'orientation !== "horizontal"'
+ },
+ encapsulation: _angular_core__WEBPACK_IMPORTED_MODULE_1__["ViewEncapsulation"].None,
+ changeDetection: _angular_core__WEBPACK_IMPORTED_MODULE_1__["ChangeDetectionStrategy"].OnPush,
+ providers: [{
+ provide: CdkScrollable,
+ useExisting: CdkVirtualScrollViewport
+ }],
+ styles: ["cdk-virtual-scroll-viewport{display:block;position:relative;overflow:auto;contain:strict;transform:translateZ(0);will-change:scroll-position;-webkit-overflow-scrolling:touch}.cdk-virtual-scroll-content-wrapper{position:absolute;top:0;left:0;contain:content}[dir=rtl] .cdk-virtual-scroll-content-wrapper{right:0;left:auto}.cdk-virtual-scroll-orientation-horizontal .cdk-virtual-scroll-content-wrapper{min-height:100%}.cdk-virtual-scroll-orientation-horizontal .cdk-virtual-scroll-content-wrapper>dl:not([cdkVirtualFor]),.cdk-virtual-scroll-orientation-horizontal .cdk-virtual-scroll-content-wrapper>ol:not([cdkVirtualFor]),.cdk-virtual-scroll-orientation-horizontal .cdk-virtual-scroll-content-wrapper>table:not([cdkVirtualFor]),.cdk-virtual-scroll-orientation-horizontal .cdk-virtual-scroll-content-wrapper>ul:not([cdkVirtualFor]){padding-left:0;padding-right:0;margin-left:0;margin-right:0;border-left-width:0;border-right-width:0;outline:none}.cdk-virtual-scroll-orientation-vertical .cdk-virtual-scroll-content-wrapper{min-width:100%}.cdk-virtual-scroll-orientation-vertical .cdk-virtual-scroll-content-wrapper>dl:not([cdkVirtualFor]),.cdk-virtual-scroll-orientation-vertical .cdk-virtual-scroll-content-wrapper>ol:not([cdkVirtualFor]),.cdk-virtual-scroll-orientation-vertical .cdk-virtual-scroll-content-wrapper>table:not([cdkVirtualFor]),.cdk-virtual-scroll-orientation-vertical .cdk-virtual-scroll-content-wrapper>ul:not([cdkVirtualFor]){padding-top:0;padding-bottom:0;margin-top:0;margin-bottom:0;border-top-width:0;border-bottom-width:0;outline:none}.cdk-virtual-scroll-spacer{position:absolute;top:0;left:0;height:1px;width:1px;transform-origin:0 0}[dir=rtl] .cdk-virtual-scroll-spacer{right:0;left:auto;transform-origin:100% 0}\n"]
+ }]
+ }], function () { return [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["ElementRef"] }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["ChangeDetectorRef"] }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["NgZone"] }, { type: undefined, decorators: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Optional"]
+ }, {
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Inject"],
+ args: [VIRTUAL_SCROLL_STRATEGY]
+ }] }, { type: _angular_cdk_bidi__WEBPACK_IMPORTED_MODULE_6__["Directionality"], decorators: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Optional"]
+ }] }, { type: ScrollDispatcher }, { type: ViewportRuler }]; }, { scrolledIndexChange: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Output"]
+ }], orientation: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Input"]
+ }], _contentWrapper: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["ViewChild"],
+ args: ['contentWrapper', { static: true }]
+ }] }); })();
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/** Helper to extract the offset of a DOM Node in a certain direction. */
+function getOffset(orientation, direction, node) {
+ const el = node;
+ if (!el.getBoundingClientRect) {
+ return 0;
+ }
+ const rect = el.getBoundingClientRect();
+ if (orientation === 'horizontal') {
+ return direction === 'start' ? rect.left : rect.right;
+ }
+ return direction === 'start' ? rect.top : rect.bottom;
+}
+/**
+ * A directive similar to `ngForOf` to be used for rendering data inside a virtual scrolling
+ * container.
+ */
+class CdkVirtualForOf {
+ constructor(
+ /** The view container to add items to. */
+ _viewContainerRef,
+ /** The template to use when stamping out new items. */
+ _template,
+ /** The set of available differs. */
+ _differs,
+ /** The strategy used to render items in the virtual scroll viewport. */
+ _viewRepeater,
+ /** The virtual scrolling viewport that these items are being rendered in. */
+ _viewport, ngZone) {
+ this._viewContainerRef = _viewContainerRef;
+ this._template = _template;
+ this._differs = _differs;
+ this._viewRepeater = _viewRepeater;
+ this._viewport = _viewport;
+ /** Emits when the rendered view of the data changes. */
+ this.viewChange = new rxjs__WEBPACK_IMPORTED_MODULE_2__["Subject"]();
+ /** Subject that emits when a new DataSource instance is given. */
+ this._dataSourceChanges = new rxjs__WEBPACK_IMPORTED_MODULE_2__["Subject"]();
+ /** Emits whenever the data in the current DataSource changes. */
+ this.dataStream = this._dataSourceChanges
+ .pipe(
+ // Start off with null `DataSource`.
+ Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_3__["startWith"])(null),
+ // Bundle up the previous and current data sources so we can work with both.
+ Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_3__["pairwise"])(),
+ // Use `_changeDataSource` to disconnect from the previous data source and connect to the
+ // new one, passing back a stream of data changes which we run through `switchMap` to give
+ // us a data stream that emits the latest data from whatever the current `DataSource` is.
+ Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_3__["switchMap"])(([prev, cur]) => this._changeDataSource(prev, cur)),
+ // Replay the last emitted data when someone subscribes.
+ Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_3__["shareReplay"])(1));
+ /** The differ used to calculate changes to the data. */
+ this._differ = null;
+ /** Whether the rendered data should be updated during the next ngDoCheck cycle. */
+ this._needsUpdate = false;
+ this._destroyed = new rxjs__WEBPACK_IMPORTED_MODULE_2__["Subject"]();
+ this.dataStream.subscribe(data => {
+ this._data = data;
+ this._onRenderedDataChange();
+ });
+ this._viewport.renderedRangeStream.pipe(Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_3__["takeUntil"])(this._destroyed)).subscribe(range => {
+ this._renderedRange = range;
+ ngZone.run(() => this.viewChange.next(this._renderedRange));
+ this._onRenderedDataChange();
+ });
+ this._viewport.attach(this);
+ }
+ /** The DataSource to display. */
+ get cdkVirtualForOf() {
+ return this._cdkVirtualForOf;
+ }
+ set cdkVirtualForOf(value) {
+ this._cdkVirtualForOf = value;
+ if (Object(_angular_cdk_collections__WEBPACK_IMPORTED_MODULE_7__["isDataSource"])(value)) {
+ this._dataSourceChanges.next(value);
+ }
+ else {
+ // If value is an an NgIterable, convert it to an array.
+ this._dataSourceChanges.next(new _angular_cdk_collections__WEBPACK_IMPORTED_MODULE_7__["ArrayDataSource"](Object(rxjs__WEBPACK_IMPORTED_MODULE_2__["isObservable"])(value) ? value : Array.from(value || [])));
+ }
+ }
+ /**
+ * The `TrackByFunction` to use for tracking changes. The `TrackByFunction` takes the index and
+ * the item and produces a value to be used as the item's identity when tracking changes.
+ */
+ get cdkVirtualForTrackBy() {
+ return this._cdkVirtualForTrackBy;
+ }
+ set cdkVirtualForTrackBy(fn) {
+ this._needsUpdate = true;
+ this._cdkVirtualForTrackBy = fn ?
+ (index, item) => fn(index + (this._renderedRange ? this._renderedRange.start : 0), item) :
+ undefined;
+ }
+ /** The template used to stamp out new elements. */
+ set cdkVirtualForTemplate(value) {
+ if (value) {
+ this._needsUpdate = true;
+ this._template = value;
+ }
+ }
+ /**
+ * The size of the cache used to store templates that are not being used for re-use later.
+ * Setting the cache size to `0` will disable caching. Defaults to 20 templates.
+ */
+ get cdkVirtualForTemplateCacheSize() {
+ return this._viewRepeater.viewCacheSize;
+ }
+ set cdkVirtualForTemplateCacheSize(size) {
+ this._viewRepeater.viewCacheSize = Object(_angular_cdk_coercion__WEBPACK_IMPORTED_MODULE_0__["coerceNumberProperty"])(size);
+ }
+ /**
+ * Measures the combined size (width for horizontal orientation, height for vertical) of all items
+ * in the specified range. Throws an error if the range includes items that are not currently
+ * rendered.
+ */
+ measureRangeSize(range, orientation) {
+ if (range.start >= range.end) {
+ return 0;
+ }
+ if ((range.start < this._renderedRange.start || range.end > this._renderedRange.end) &&
+ (typeof ngDevMode === 'undefined' || ngDevMode)) {
+ throw Error(`Error: attempted to measure an item that isn't rendered.`);
+ }
+ // The index into the list of rendered views for the first item in the range.
+ const renderedStartIndex = range.start - this._renderedRange.start;
+ // The length of the range we're measuring.
+ const rangeLen = range.end - range.start;
+ // Loop over all the views, find the first and land node and compute the size by subtracting
+ // the top of the first node from the bottom of the last one.
+ let firstNode;
+ let lastNode;
+ // Find the first node by starting from the beginning and going forwards.
+ for (let i = 0; i < rangeLen; i++) {
+ const view = this._viewContainerRef.get(i + renderedStartIndex);
+ if (view && view.rootNodes.length) {
+ firstNode = lastNode = view.rootNodes[0];
+ break;
+ }
+ }
+ // Find the last node by starting from the end and going backwards.
+ for (let i = rangeLen - 1; i > -1; i--) {
+ const view = this._viewContainerRef.get(i + renderedStartIndex);
+ if (view && view.rootNodes.length) {
+ lastNode = view.rootNodes[view.rootNodes.length - 1];
+ break;
+ }
+ }
+ return firstNode && lastNode ?
+ getOffset(orientation, 'end', lastNode) - getOffset(orientation, 'start', firstNode) : 0;
+ }
+ ngDoCheck() {
+ if (this._differ && this._needsUpdate) {
+ // TODO(mmalerba): We should differentiate needs update due to scrolling and a new portion of
+ // this list being rendered (can use simpler algorithm) vs needs update due to data actually
+ // changing (need to do this diff).
+ const changes = this._differ.diff(this._renderedItems);
+ if (!changes) {
+ this._updateContext();
+ }
+ else {
+ this._applyChanges(changes);
+ }
+ this._needsUpdate = false;
+ }
+ }
+ ngOnDestroy() {
+ this._viewport.detach();
+ this._dataSourceChanges.next(undefined);
+ this._dataSourceChanges.complete();
+ this.viewChange.complete();
+ this._destroyed.next();
+ this._destroyed.complete();
+ this._viewRepeater.detach();
+ }
+ /** React to scroll state changes in the viewport. */
+ _onRenderedDataChange() {
+ if (!this._renderedRange) {
+ return;
+ }
+ this._renderedItems = this._data.slice(this._renderedRange.start, this._renderedRange.end);
+ if (!this._differ) {
+ // Use a wrapper function for the `trackBy` so any new values are
+ // picked up automatically without having to recreate the differ.
+ this._differ = this._differs.find(this._renderedItems).create((index, item) => {
+ return this.cdkVirtualForTrackBy ? this.cdkVirtualForTrackBy(index, item) : item;
+ });
+ }
+ this._needsUpdate = true;
+ }
+ /** Swap out one `DataSource` for another. */
+ _changeDataSource(oldDs, newDs) {
+ if (oldDs) {
+ oldDs.disconnect(this);
+ }
+ this._needsUpdate = true;
+ return newDs ? newDs.connect(this) : Object(rxjs__WEBPACK_IMPORTED_MODULE_2__["of"])();
+ }
+ /** Update the `CdkVirtualForOfContext` for all views. */
+ _updateContext() {
+ const count = this._data.length;
+ let i = this._viewContainerRef.length;
+ while (i--) {
+ const view = this._viewContainerRef.get(i);
+ view.context.index = this._renderedRange.start + i;
+ view.context.count = count;
+ this._updateComputedContextProperties(view.context);
+ view.detectChanges();
+ }
+ }
+ /** Apply changes to the DOM. */
+ _applyChanges(changes) {
+ this._viewRepeater.applyChanges(changes, this._viewContainerRef, (record, _adjustedPreviousIndex, currentIndex) => this._getEmbeddedViewArgs(record, currentIndex), (record) => record.item);
+ // Update $implicit for any items that had an identity change.
+ changes.forEachIdentityChange((record) => {
+ const view = this._viewContainerRef.get(record.currentIndex);
+ view.context.$implicit = record.item;
+ });
+ // Update the context variables on all items.
+ const count = this._data.length;
+ let i = this._viewContainerRef.length;
+ while (i--) {
+ const view = this._viewContainerRef.get(i);
+ view.context.index = this._renderedRange.start + i;
+ view.context.count = count;
+ this._updateComputedContextProperties(view.context);
+ }
+ }
+ /** Update the computed properties on the `CdkVirtualForOfContext`. */
+ _updateComputedContextProperties(context) {
+ context.first = context.index === 0;
+ context.last = context.index === context.count - 1;
+ context.even = context.index % 2 === 0;
+ context.odd = !context.even;
+ }
+ _getEmbeddedViewArgs(record, index) {
+ // Note that it's important that we insert the item directly at the proper index,
+ // rather than inserting it and the moving it in place, because if there's a directive
+ // on the same node that injects the `ViewContainerRef`, Angular will insert another
+ // comment node which can throw off the move when it's being repeated for all items.
+ return {
+ templateRef: this._template,
+ context: {
+ $implicit: record.item,
+ // It's guaranteed that the iterable is not "undefined" or "null" because we only
+ // generate views for elements if the "cdkVirtualForOf" iterable has elements.
+ cdkVirtualForOf: this._cdkVirtualForOf,
+ index: -1,
+ count: -1,
+ first: false,
+ last: false,
+ odd: false,
+ even: false
+ },
+ index,
+ };
+ }
+}
+CdkVirtualForOf.ɵfac = function CdkVirtualForOf_Factory(t) { return new (t || CdkVirtualForOf)(_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["ViewContainerRef"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["TemplateRef"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["IterableDiffers"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](_angular_cdk_collections__WEBPACK_IMPORTED_MODULE_7__["_VIEW_REPEATER_STRATEGY"]), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](CdkVirtualScrollViewport, 4), _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdirectiveInject"](_angular_core__WEBPACK_IMPORTED_MODULE_1__["NgZone"])); };
+CdkVirtualForOf.ɵdir = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdefineDirective"]({ type: CdkVirtualForOf, selectors: [["", "cdkVirtualFor", "", "cdkVirtualForOf", ""]], inputs: { cdkVirtualForOf: "cdkVirtualForOf", cdkVirtualForTrackBy: "cdkVirtualForTrackBy", cdkVirtualForTemplate: "cdkVirtualForTemplate", cdkVirtualForTemplateCacheSize: "cdkVirtualForTemplateCacheSize" }, features: [_angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵProvidersFeature"]([
+ { provide: _angular_cdk_collections__WEBPACK_IMPORTED_MODULE_7__["_VIEW_REPEATER_STRATEGY"], useClass: _angular_cdk_collections__WEBPACK_IMPORTED_MODULE_7__["_RecycleViewRepeaterStrategy"] },
+ ])] });
+CdkVirtualForOf.ctorParameters = () => [
+ { type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["ViewContainerRef"] },
+ { type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["TemplateRef"] },
+ { type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["IterableDiffers"] },
+ { type: _angular_cdk_collections__WEBPACK_IMPORTED_MODULE_7__["_RecycleViewRepeaterStrategy"], decorators: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Inject"], args: [_angular_cdk_collections__WEBPACK_IMPORTED_MODULE_7__["_VIEW_REPEATER_STRATEGY"],] }] },
+ { type: CdkVirtualScrollViewport, decorators: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["SkipSelf"] }] },
+ { type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["NgZone"] }
+];
+CdkVirtualForOf.propDecorators = {
+ cdkVirtualForOf: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Input"] }],
+ cdkVirtualForTrackBy: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Input"] }],
+ cdkVirtualForTemplate: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Input"] }],
+ cdkVirtualForTemplateCacheSize: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Input"] }]
+};
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵsetClassMetadata"](CdkVirtualForOf, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Directive"],
+ args: [{
+ selector: '[cdkVirtualFor][cdkVirtualForOf]',
+ providers: [
+ { provide: _angular_cdk_collections__WEBPACK_IMPORTED_MODULE_7__["_VIEW_REPEATER_STRATEGY"], useClass: _angular_cdk_collections__WEBPACK_IMPORTED_MODULE_7__["_RecycleViewRepeaterStrategy"] },
+ ]
+ }]
+ }], function () { return [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["ViewContainerRef"] }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["TemplateRef"] }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["IterableDiffers"] }, { type: _angular_cdk_collections__WEBPACK_IMPORTED_MODULE_7__["_RecycleViewRepeaterStrategy"], decorators: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Inject"],
+ args: [_angular_cdk_collections__WEBPACK_IMPORTED_MODULE_7__["_VIEW_REPEATER_STRATEGY"]]
+ }] }, { type: CdkVirtualScrollViewport, decorators: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["SkipSelf"]
+ }] }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["NgZone"] }]; }, { cdkVirtualForOf: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Input"]
+ }], cdkVirtualForTrackBy: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Input"]
+ }], cdkVirtualForTemplate: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Input"]
+ }], cdkVirtualForTemplateCacheSize: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["Input"]
+ }] }); })();
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+class CdkScrollableModule {
+}
+CdkScrollableModule.ɵfac = function CdkScrollableModule_Factory(t) { return new (t || CdkScrollableModule)(); };
+CdkScrollableModule.ɵmod = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdefineNgModule"]({ type: CdkScrollableModule });
+CdkScrollableModule.ɵinj = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdefineInjector"]({});
+(function () { (typeof ngJitMode === "undefined" || ngJitMode) && _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵsetNgModuleScope"](CdkScrollableModule, { declarations: [CdkScrollable], exports: [CdkScrollable] }); })();
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵsetClassMetadata"](CdkScrollableModule, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["NgModule"],
+ args: [{
+ exports: [CdkScrollable],
+ declarations: [CdkScrollable]
+ }]
+ }], null, null); })();
+/**
+ * @docs-primary-export
+ */
+class ScrollingModule {
+}
+ScrollingModule.ɵfac = function ScrollingModule_Factory(t) { return new (t || ScrollingModule)(); };
+ScrollingModule.ɵmod = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdefineNgModule"]({ type: ScrollingModule });
+ScrollingModule.ɵinj = _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵdefineInjector"]({ imports: [[
+ _angular_cdk_bidi__WEBPACK_IMPORTED_MODULE_6__["BidiModule"],
+ _angular_cdk_platform__WEBPACK_IMPORTED_MODULE_4__["PlatformModule"],
+ CdkScrollableModule
+ ], _angular_cdk_bidi__WEBPACK_IMPORTED_MODULE_6__["BidiModule"], CdkScrollableModule] });
+(function () { (typeof ngJitMode === "undefined" || ngJitMode) && _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵɵsetNgModuleScope"](ScrollingModule, { declarations: function () { return [CdkFixedSizeVirtualScroll, CdkVirtualForOf, CdkVirtualScrollViewport]; }, imports: function () { return [_angular_cdk_bidi__WEBPACK_IMPORTED_MODULE_6__["BidiModule"],
+ _angular_cdk_platform__WEBPACK_IMPORTED_MODULE_4__["PlatformModule"], CdkScrollableModule]; }, exports: function () { return [_angular_cdk_bidi__WEBPACK_IMPORTED_MODULE_6__["BidiModule"], CdkScrollableModule, CdkFixedSizeVirtualScroll, CdkVirtualForOf, CdkVirtualScrollViewport]; } }); })();
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_1__["ɵsetClassMetadata"](ScrollingModule, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_1__["NgModule"],
+ args: [{
+ imports: [
+ _angular_cdk_bidi__WEBPACK_IMPORTED_MODULE_6__["BidiModule"],
+ _angular_cdk_platform__WEBPACK_IMPORTED_MODULE_4__["PlatformModule"],
+ CdkScrollableModule
+ ],
+ exports: [
+ _angular_cdk_bidi__WEBPACK_IMPORTED_MODULE_6__["BidiModule"],
+ CdkScrollableModule,
+ CdkFixedSizeVirtualScroll,
+ CdkVirtualForOf,
+ CdkVirtualScrollViewport,
+ ],
+ declarations: [
+ CdkFixedSizeVirtualScroll,
+ CdkVirtualForOf,
+ CdkVirtualScrollViewport,
+ ]
+ }]
+ }], null, null); })();
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+
+/**
+ * Generated bundle index. Do not edit.
+ */
+
+
+
+//# sourceMappingURL=scrolling.js.map
+
+/***/ }),
+
+/***/ "./node_modules/@angular/cdk/fesm2015/coercion.js":
+/*!********************************************************!*\
+ !*** ./node_modules/@angular/cdk/fesm2015/coercion.js ***!
+ \********************************************************/
+/*! exports provided: _isNumberValue, coerceArray, coerceBooleanProperty, coerceCssPixelValue, coerceElement, coerceNumberProperty, coerceStringArray */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_isNumberValue", function() { return _isNumberValue; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "coerceArray", function() { return coerceArray; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "coerceBooleanProperty", function() { return coerceBooleanProperty; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "coerceCssPixelValue", function() { return coerceCssPixelValue; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "coerceElement", function() { return coerceElement; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "coerceNumberProperty", function() { return coerceNumberProperty; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "coerceStringArray", function() { return coerceStringArray; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/** Coerces a data-bound value (typically a string) to a boolean. */
+function coerceBooleanProperty(value) {
+ return value != null && `${value}` !== 'false';
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+function coerceNumberProperty(value, fallbackValue = 0) {
+ return _isNumberValue(value) ? Number(value) : fallbackValue;
+}
+/**
+ * Whether the provided value is considered a number.
+ * @docs-private
+ */
+function _isNumberValue(value) {
+ // parseFloat(value) handles most of the cases we're interested in (it treats null, empty string,
+ // and other non-number values as NaN, where Number just uses 0) but it considers the string
+ // '123hello' to be a valid number. Therefore we also check if Number(value) is NaN.
+ return !isNaN(parseFloat(value)) && !isNaN(Number(value));
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+function coerceArray(value) {
+ return Array.isArray(value) ? value : [value];
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/** Coerces a value to a CSS pixel value. */
+function coerceCssPixelValue(value) {
+ if (value == null) {
+ return '';
+ }
+ return typeof value === 'string' ? value : `${value}px`;
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * Coerces an ElementRef or an Element into an element.
+ * Useful for APIs that can accept either a ref or the native element itself.
+ */
+function coerceElement(elementOrRef) {
+ return elementOrRef instanceof _angular_core__WEBPACK_IMPORTED_MODULE_0__["ElementRef"] ? elementOrRef.nativeElement : elementOrRef;
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * Coerces a value to an array of trimmed non-empty strings.
+ * Any input that is not an array, `null` or `undefined` will be turned into a string
+ * via `toString()` and subsequently split with the given separator.
+ * `null` and `undefined` will result in an empty array.
+ * This results in the following outcomes:
+ * - `null` -> `[]`
+ * - `[null]` -> `["null"]`
+ * - `["a", "b ", " "]` -> `["a", "b"]`
+ * - `[1, [2, 3]]` -> `["1", "2,3"]`
+ * - `[{ a: 0 }]` -> `["[object Object]"]`
+ * - `{ a: 0 }` -> `["[object", "Object]"]`
+ *
+ * Useful for defining CSS classes or table columns.
+ * @param value the value to coerce into an array of strings
+ * @param separator split-separator if value isn't an array
+ */
+function coerceStringArray(value, separator = /\s+/) {
+ const result = [];
+ if (value != null) {
+ const sourceValues = Array.isArray(value) ? value : `${value}`.split(separator);
+ for (const sourceValue of sourceValues) {
+ const trimmedString = `${sourceValue}`.trim();
+ if (trimmedString) {
+ result.push(trimmedString);
+ }
+ }
+ }
+ return result;
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+
+
+//# sourceMappingURL=coercion.js.map
+
+
+/***/ }),
+
+/***/ "./node_modules/@angular/common/__ivy_ngcc__/fesm2015/common.js":
+/*!**********************************************************************!*\
+ !*** ./node_modules/@angular/common/__ivy_ngcc__/fesm2015/common.js ***!
+ \**********************************************************************/
+/*! exports provided: APP_BASE_HREF, AsyncPipe, CommonModule, CurrencyPipe, DOCUMENT, DatePipe, DecimalPipe, FormStyle, FormatWidth, HashLocationStrategy, I18nPluralPipe, I18nSelectPipe, JsonPipe, KeyValuePipe, LOCATION_INITIALIZED, Location, LocationStrategy, LowerCasePipe, NgClass, NgComponentOutlet, NgForOf, NgForOfContext, NgIf, NgIfContext, NgLocaleLocalization, NgLocalization, NgPlural, NgPluralCase, NgStyle, NgSwitch, NgSwitchCase, NgSwitchDefault, NgTemplateOutlet, NumberFormatStyle, NumberSymbol, PathLocationStrategy, PercentPipe, PlatformLocation, Plural, SlicePipe, TitleCasePipe, TranslationWidth, UpperCasePipe, VERSION, ViewportScroller, WeekDay, formatCurrency, formatDate, formatNumber, formatPercent, getCurrencySymbol, getLocaleCurrencyCode, getLocaleCurrencyName, getLocaleCurrencySymbol, getLocaleDateFormat, getLocaleDateTimeFormat, getLocaleDayNames, getLocaleDayPeriods, getLocaleDirection, getLocaleEraNames, getLocaleExtraDayPeriodRules, getLocaleExtraDayPeriods, getLocaleFirstDayOfWeek, getLocaleId, getLocaleMonthNames, getLocaleNumberFormat, getLocaleNumberSymbol, getLocalePluralCase, getLocaleTimeFormat, getLocaleWeekEndRange, getNumberOfCurrencyDigits, isPlatformBrowser, isPlatformServer, isPlatformWorkerApp, isPlatformWorkerUi, registerLocaleData, ɵBrowserPlatformLocation, ɵDomAdapter, ɵNullViewportScroller, ɵPLATFORM_BROWSER_ID, ɵPLATFORM_SERVER_ID, ɵPLATFORM_WORKER_APP_ID, ɵPLATFORM_WORKER_UI_ID, ɵangular_packages_common_common_a, ɵangular_packages_common_common_b, ɵangular_packages_common_common_c, ɵangular_packages_common_common_d, ɵangular_packages_common_common_e, ɵangular_packages_common_common_f, ɵgetDOM, ɵparseCookieValue, ɵsetRootDomAdapter */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "APP_BASE_HREF", function() { return APP_BASE_HREF; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AsyncPipe", function() { return AsyncPipe; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CommonModule", function() { return CommonModule; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CurrencyPipe", function() { return CurrencyPipe; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "DOCUMENT", function() { return DOCUMENT; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "DatePipe", function() { return DatePipe; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "DecimalPipe", function() { return DecimalPipe; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FormStyle", function() { return FormStyle; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FormatWidth", function() { return FormatWidth; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "HashLocationStrategy", function() { return HashLocationStrategy; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "I18nPluralPipe", function() { return I18nPluralPipe; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "I18nSelectPipe", function() { return I18nSelectPipe; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "JsonPipe", function() { return JsonPipe; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "KeyValuePipe", function() { return KeyValuePipe; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LOCATION_INITIALIZED", function() { return LOCATION_INITIALIZED; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Location", function() { return Location; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LocationStrategy", function() { return LocationStrategy; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LowerCasePipe", function() { return LowerCasePipe; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "NgClass", function() { return NgClass; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "NgComponentOutlet", function() { return NgComponentOutlet; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "NgForOf", function() { return NgForOf; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "NgForOfContext", function() { return NgForOfContext; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "NgIf", function() { return NgIf; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "NgIfContext", function() { return NgIfContext; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "NgLocaleLocalization", function() { return NgLocaleLocalization; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "NgLocalization", function() { return NgLocalization; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "NgPlural", function() { return NgPlural; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "NgPluralCase", function() { return NgPluralCase; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "NgStyle", function() { return NgStyle; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "NgSwitch", function() { return NgSwitch; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "NgSwitchCase", function() { return NgSwitchCase; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "NgSwitchDefault", function() { return NgSwitchDefault; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "NgTemplateOutlet", function() { return NgTemplateOutlet; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "NumberFormatStyle", function() { return NumberFormatStyle; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "NumberSymbol", function() { return NumberSymbol; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PathLocationStrategy", function() { return PathLocationStrategy; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PercentPipe", function() { return PercentPipe; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PlatformLocation", function() { return PlatformLocation; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Plural", function() { return Plural; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SlicePipe", function() { return SlicePipe; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TitleCasePipe", function() { return TitleCasePipe; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TranslationWidth", function() { return TranslationWidth; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "UpperCasePipe", function() { return UpperCasePipe; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "VERSION", function() { return VERSION; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ViewportScroller", function() { return ViewportScroller; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "WeekDay", function() { return WeekDay; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "formatCurrency", function() { return formatCurrency; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "formatDate", function() { return formatDate; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "formatNumber", function() { return formatNumber; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "formatPercent", function() { return formatPercent; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getCurrencySymbol", function() { return getCurrencySymbol; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getLocaleCurrencyCode", function() { return getLocaleCurrencyCode; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getLocaleCurrencyName", function() { return getLocaleCurrencyName; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getLocaleCurrencySymbol", function() { return getLocaleCurrencySymbol; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getLocaleDateFormat", function() { return getLocaleDateFormat; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getLocaleDateTimeFormat", function() { return getLocaleDateTimeFormat; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getLocaleDayNames", function() { return getLocaleDayNames; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getLocaleDayPeriods", function() { return getLocaleDayPeriods; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getLocaleDirection", function() { return getLocaleDirection; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getLocaleEraNames", function() { return getLocaleEraNames; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getLocaleExtraDayPeriodRules", function() { return getLocaleExtraDayPeriodRules; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getLocaleExtraDayPeriods", function() { return getLocaleExtraDayPeriods; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getLocaleFirstDayOfWeek", function() { return getLocaleFirstDayOfWeek; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getLocaleId", function() { return getLocaleId; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getLocaleMonthNames", function() { return getLocaleMonthNames; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getLocaleNumberFormat", function() { return getLocaleNumberFormat; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getLocaleNumberSymbol", function() { return getLocaleNumberSymbol; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getLocalePluralCase", function() { return getLocalePluralCase; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getLocaleTimeFormat", function() { return getLocaleTimeFormat; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getLocaleWeekEndRange", function() { return getLocaleWeekEndRange; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getNumberOfCurrencyDigits", function() { return getNumberOfCurrencyDigits; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isPlatformBrowser", function() { return isPlatformBrowser; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isPlatformServer", function() { return isPlatformServer; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isPlatformWorkerApp", function() { return isPlatformWorkerApp; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isPlatformWorkerUi", function() { return isPlatformWorkerUi; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "registerLocaleData", function() { return registerLocaleData; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵBrowserPlatformLocation", function() { return BrowserPlatformLocation; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵDomAdapter", function() { return DomAdapter; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵNullViewportScroller", function() { return NullViewportScroller; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵPLATFORM_BROWSER_ID", function() { return PLATFORM_BROWSER_ID; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵPLATFORM_SERVER_ID", function() { return PLATFORM_SERVER_ID; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵPLATFORM_WORKER_APP_ID", function() { return PLATFORM_WORKER_APP_ID; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵPLATFORM_WORKER_UI_ID", function() { return PLATFORM_WORKER_UI_ID; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵangular_packages_common_common_a", function() { return useBrowserPlatformLocation; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵangular_packages_common_common_b", function() { return createBrowserPlatformLocation; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵangular_packages_common_common_c", function() { return createLocation; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵangular_packages_common_common_d", function() { return provideLocationStrategy; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵangular_packages_common_common_e", function() { return COMMON_DIRECTIVES; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵangular_packages_common_common_f", function() { return COMMON_PIPES; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵgetDOM", function() { return getDOM; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵparseCookieValue", function() { return parseCookieValue; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵsetRootDomAdapter", function() { return setRootDomAdapter; });
+/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js");
+/**
+ * @license Angular v11.2.14
+ * (c) 2010-2021 Google LLC. https://angular.io/
+ * License: MIT
+ */
+
+
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+
+let _DOM = null;
+function getDOM() {
+ return _DOM;
+}
+function setDOM(adapter) {
+ _DOM = adapter;
+}
+function setRootDomAdapter(adapter) {
+ if (!_DOM) {
+ _DOM = adapter;
+ }
+}
+/* tslint:disable:requireParameterType */
+/**
+ * Provides DOM operations in an environment-agnostic way.
+ *
+ * @security Tread carefully! Interacting with the DOM directly is dangerous and
+ * can introduce XSS risks.
+ */
+class DomAdapter {
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * A DI Token representing the main rendering context. In a browser this is the DOM Document.
+ *
+ * Note: Document might not be available in the Application Context when Application and Rendering
+ * Contexts are not the same (e.g. when running the application in a Web Worker).
+ *
+ * @publicApi
+ */
+const DOCUMENT = new _angular_core__WEBPACK_IMPORTED_MODULE_0__["InjectionToken"]('DocumentToken');
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * This class should not be used directly by an application developer. Instead, use
+ * {@link Location}.
+ *
+ * `PlatformLocation` encapsulates all calls to DOM APIs, which allows the Router to be
+ * platform-agnostic.
+ * This means that we can have different implementation of `PlatformLocation` for the different
+ * platforms that Angular supports. For example, `@angular/platform-browser` provides an
+ * implementation specific to the browser environment, while `@angular/platform-server` provides
+ * one suitable for use with server-side rendering.
+ *
+ * The `PlatformLocation` class is used directly by all implementations of {@link LocationStrategy}
+ * when they need to interact with the DOM APIs like pushState, popState, etc.
+ *
+ * {@link LocationStrategy} in turn is used by the {@link Location} service which is used directly
+ * by the {@link Router} in order to navigate between routes. Since all interactions between {@link
+ * Router} /
+ * {@link Location} / {@link LocationStrategy} and DOM APIs flow through the `PlatformLocation`
+ * class, they are all platform-agnostic.
+ *
+ * @publicApi
+ */
+class PlatformLocation {
+}
+PlatformLocation.ɵfac = function PlatformLocation_Factory(t) { return new (t || PlatformLocation)(); };
+PlatformLocation.ɵprov = Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineInjectable"])({ factory: useBrowserPlatformLocation, token: PlatformLocation, providedIn: "platform" });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](PlatformLocation, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Injectable"],
+ args: [{
+ providedIn: 'platform',
+ // See #23917
+ useFactory: useBrowserPlatformLocation
+ }]
+ }], null, null); })();
+function useBrowserPlatformLocation() {
+ return Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵinject"])(BrowserPlatformLocation);
+}
+/**
+ * @description
+ * Indicates when a location is initialized.
+ *
+ * @publicApi
+ */
+const LOCATION_INITIALIZED = new _angular_core__WEBPACK_IMPORTED_MODULE_0__["InjectionToken"]('Location Initialized');
+/**
+ * `PlatformLocation` encapsulates all of the direct calls to platform APIs.
+ * This class should not be used directly by an application developer. Instead, use
+ * {@link Location}.
+ */
+class BrowserPlatformLocation extends PlatformLocation {
+ constructor(_doc) {
+ super();
+ this._doc = _doc;
+ this._init();
+ }
+ // This is moved to its own method so that `MockPlatformLocationStrategy` can overwrite it
+ /** @internal */
+ _init() {
+ this.location = getDOM().getLocation();
+ this._history = getDOM().getHistory();
+ }
+ getBaseHrefFromDOM() {
+ return getDOM().getBaseHref(this._doc);
+ }
+ onPopState(fn) {
+ getDOM().getGlobalEventTarget(this._doc, 'window').addEventListener('popstate', fn, false);
+ }
+ onHashChange(fn) {
+ getDOM().getGlobalEventTarget(this._doc, 'window').addEventListener('hashchange', fn, false);
+ }
+ get href() {
+ return this.location.href;
+ }
+ get protocol() {
+ return this.location.protocol;
+ }
+ get hostname() {
+ return this.location.hostname;
+ }
+ get port() {
+ return this.location.port;
+ }
+ get pathname() {
+ return this.location.pathname;
+ }
+ get search() {
+ return this.location.search;
+ }
+ get hash() {
+ return this.location.hash;
+ }
+ set pathname(newPath) {
+ this.location.pathname = newPath;
+ }
+ pushState(state, title, url) {
+ if (supportsState()) {
+ this._history.pushState(state, title, url);
+ }
+ else {
+ this.location.hash = url;
+ }
+ }
+ replaceState(state, title, url) {
+ if (supportsState()) {
+ this._history.replaceState(state, title, url);
+ }
+ else {
+ this.location.hash = url;
+ }
+ }
+ forward() {
+ this._history.forward();
+ }
+ back() {
+ this._history.back();
+ }
+ getState() {
+ return this._history.state;
+ }
+}
+BrowserPlatformLocation.ɵfac = function BrowserPlatformLocation_Factory(t) { return new (t || BrowserPlatformLocation)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵinject"](DOCUMENT)); };
+BrowserPlatformLocation.ɵprov = Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineInjectable"])({ factory: createBrowserPlatformLocation, token: BrowserPlatformLocation, providedIn: "platform" });
+BrowserPlatformLocation.ctorParameters = () => [
+ { type: undefined, decorators: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Inject"], args: [DOCUMENT,] }] }
+];
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](BrowserPlatformLocation, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Injectable"],
+ args: [{
+ providedIn: 'platform',
+ // See #23917
+ useFactory: createBrowserPlatformLocation
+ }]
+ }], function () { return [{ type: undefined, decorators: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Inject"],
+ args: [DOCUMENT]
+ }] }]; }, null); })();
+function supportsState() {
+ return !!window.history.pushState;
+}
+function createBrowserPlatformLocation() {
+ return new BrowserPlatformLocation(Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵinject"])(DOCUMENT));
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * Joins two parts of a URL with a slash if needed.
+ *
+ * @param start URL string
+ * @param end URL string
+ *
+ *
+ * @returns The joined URL string.
+ */
+function joinWithSlash(start, end) {
+ if (start.length == 0) {
+ return end;
+ }
+ if (end.length == 0) {
+ return start;
+ }
+ let slashes = 0;
+ if (start.endsWith('/')) {
+ slashes++;
+ }
+ if (end.startsWith('/')) {
+ slashes++;
+ }
+ if (slashes == 2) {
+ return start + end.substring(1);
+ }
+ if (slashes == 1) {
+ return start + end;
+ }
+ return start + '/' + end;
+}
+/**
+ * Removes a trailing slash from a URL string if needed.
+ * Looks for the first occurrence of either `#`, `?`, or the end of the
+ * line as `/` characters and removes the trailing slash if one exists.
+ *
+ * @param url URL string.
+ *
+ * @returns The URL string, modified if needed.
+ */
+function stripTrailingSlash(url) {
+ const match = url.match(/#|\?|$/);
+ const pathEndIdx = match && match.index || url.length;
+ const droppedSlashIdx = pathEndIdx - (url[pathEndIdx - 1] === '/' ? 1 : 0);
+ return url.slice(0, droppedSlashIdx) + url.slice(pathEndIdx);
+}
+/**
+ * Normalizes URL parameters by prepending with `?` if needed.
+ *
+ * @param params String of URL parameters.
+ *
+ * @returns The normalized URL parameters string.
+ */
+function normalizeQueryParams(params) {
+ return params && params[0] !== '?' ? '?' + params : params;
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * Enables the `Location` service to read route state from the browser's URL.
+ * Angular provides two strategies:
+ * `HashLocationStrategy` and `PathLocationStrategy`.
+ *
+ * Applications should use the `Router` or `Location` services to
+ * interact with application route state.
+ *
+ * For instance, `HashLocationStrategy` produces URLs like
+ * http://example.com#/foo,
+ * and `PathLocationStrategy` produces
+ * http://example.com/foo as an equivalent URL.
+ *
+ * See these two classes for more.
+ *
+ * @publicApi
+ */
+class LocationStrategy {
+}
+LocationStrategy.ɵfac = function LocationStrategy_Factory(t) { return new (t || LocationStrategy)(); };
+LocationStrategy.ɵprov = Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineInjectable"])({ factory: provideLocationStrategy, token: LocationStrategy, providedIn: "root" });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](LocationStrategy, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Injectable"],
+ args: [{ providedIn: 'root', useFactory: provideLocationStrategy }]
+ }], null, null); })();
+function provideLocationStrategy(platformLocation) {
+ // See #23917
+ const location = Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵinject"])(DOCUMENT).location;
+ return new PathLocationStrategy(Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵinject"])(PlatformLocation), location && location.origin || '');
+}
+/**
+ * A predefined [DI token](guide/glossary#di-token) for the base href
+ * to be used with the `PathLocationStrategy`.
+ * The base href is the URL prefix that should be preserved when generating
+ * and recognizing URLs.
+ *
+ * @usageNotes
+ *
+ * The following example shows how to use this token to configure the root app injector
+ * with a base href value, so that the DI framework can supply the dependency anywhere in the app.
+ *
+ * ```typescript
+ * import {Component, NgModule} from '@angular/core';
+ * import {APP_BASE_HREF} from '@angular/common';
+ *
+ * @NgModule({
+ * providers: [{provide: APP_BASE_HREF, useValue: '/my/app'}]
+ * })
+ * class AppModule {}
+ * ```
+ *
+ * @publicApi
+ */
+const APP_BASE_HREF = new _angular_core__WEBPACK_IMPORTED_MODULE_0__["InjectionToken"]('appBaseHref');
+/**
+ * @description
+ * A {@link LocationStrategy} used to configure the {@link Location} service to
+ * represent its state in the
+ * [path](https://en.wikipedia.org/wiki/Uniform_Resource_Locator#Syntax) of the
+ * browser's URL.
+ *
+ * If you're using `PathLocationStrategy`, you must provide a {@link APP_BASE_HREF}
+ * or add a `` element to the document.
+ *
+ * For instance, if you provide an `APP_BASE_HREF` of `'/my/app/'` and call
+ * `location.go('/foo')`, the browser's URL will become
+ * `example.com/my/app/foo`. To ensure all relative URIs resolve correctly,
+ * the `` and/or `APP_BASE_HREF` should end with a `/`.
+ *
+ * Similarly, if you add `` to the document and call
+ * `location.go('/foo')`, the browser's URL will become
+ * `example.com/my/app/foo`.
+ *
+ * Note that when using `PathLocationStrategy`, neither the query nor
+ * the fragment in the `` will be preserved, as outlined
+ * by the [RFC](https://tools.ietf.org/html/rfc3986#section-5.2.2).
+ *
+ * @usageNotes
+ *
+ * ### Example
+ *
+ * {@example common/location/ts/path_location_component.ts region='LocationComponent'}
+ *
+ * @publicApi
+ */
+class PathLocationStrategy extends LocationStrategy {
+ constructor(_platformLocation, href) {
+ super();
+ this._platformLocation = _platformLocation;
+ if (href == null) {
+ href = this._platformLocation.getBaseHrefFromDOM();
+ }
+ if (href == null) {
+ throw new Error(`No base href set. Please provide a value for the APP_BASE_HREF token or add a base element to the document.`);
+ }
+ this._baseHref = href;
+ }
+ onPopState(fn) {
+ this._platformLocation.onPopState(fn);
+ this._platformLocation.onHashChange(fn);
+ }
+ getBaseHref() {
+ return this._baseHref;
+ }
+ prepareExternalUrl(internal) {
+ return joinWithSlash(this._baseHref, internal);
+ }
+ path(includeHash = false) {
+ const pathname = this._platformLocation.pathname + normalizeQueryParams(this._platformLocation.search);
+ const hash = this._platformLocation.hash;
+ return hash && includeHash ? `${pathname}${hash}` : pathname;
+ }
+ pushState(state, title, url, queryParams) {
+ const externalUrl = this.prepareExternalUrl(url + normalizeQueryParams(queryParams));
+ this._platformLocation.pushState(state, title, externalUrl);
+ }
+ replaceState(state, title, url, queryParams) {
+ const externalUrl = this.prepareExternalUrl(url + normalizeQueryParams(queryParams));
+ this._platformLocation.replaceState(state, title, externalUrl);
+ }
+ forward() {
+ this._platformLocation.forward();
+ }
+ back() {
+ this._platformLocation.back();
+ }
+}
+PathLocationStrategy.ɵfac = function PathLocationStrategy_Factory(t) { return new (t || PathLocationStrategy)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵinject"](PlatformLocation), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵinject"](APP_BASE_HREF, 8)); };
+PathLocationStrategy.ɵprov = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineInjectable"]({ token: PathLocationStrategy, factory: PathLocationStrategy.ɵfac });
+PathLocationStrategy.ctorParameters = () => [
+ { type: PlatformLocation },
+ { type: String, decorators: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Optional"] }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Inject"], args: [APP_BASE_HREF,] }] }
+];
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](PathLocationStrategy, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Injectable"]
+ }], function () { return [{ type: PlatformLocation }, { type: String, decorators: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Optional"]
+ }, {
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Inject"],
+ args: [APP_BASE_HREF]
+ }] }]; }, null); })();
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * @description
+ * A {@link LocationStrategy} used to configure the {@link Location} service to
+ * represent its state in the
+ * [hash fragment](https://en.wikipedia.org/wiki/Uniform_Resource_Locator#Syntax)
+ * of the browser's URL.
+ *
+ * For instance, if you call `location.go('/foo')`, the browser's URL will become
+ * `example.com#/foo`.
+ *
+ * @usageNotes
+ *
+ * ### Example
+ *
+ * {@example common/location/ts/hash_location_component.ts region='LocationComponent'}
+ *
+ * @publicApi
+ */
+class HashLocationStrategy extends LocationStrategy {
+ constructor(_platformLocation, _baseHref) {
+ super();
+ this._platformLocation = _platformLocation;
+ this._baseHref = '';
+ if (_baseHref != null) {
+ this._baseHref = _baseHref;
+ }
+ }
+ onPopState(fn) {
+ this._platformLocation.onPopState(fn);
+ this._platformLocation.onHashChange(fn);
+ }
+ getBaseHref() {
+ return this._baseHref;
+ }
+ path(includeHash = false) {
+ // the hash value is always prefixed with a `#`
+ // and if it is empty then it will stay empty
+ let path = this._platformLocation.hash;
+ if (path == null)
+ path = '#';
+ return path.length > 0 ? path.substring(1) : path;
+ }
+ prepareExternalUrl(internal) {
+ const url = joinWithSlash(this._baseHref, internal);
+ return url.length > 0 ? ('#' + url) : url;
+ }
+ pushState(state, title, path, queryParams) {
+ let url = this.prepareExternalUrl(path + normalizeQueryParams(queryParams));
+ if (url.length == 0) {
+ url = this._platformLocation.pathname;
+ }
+ this._platformLocation.pushState(state, title, url);
+ }
+ replaceState(state, title, path, queryParams) {
+ let url = this.prepareExternalUrl(path + normalizeQueryParams(queryParams));
+ if (url.length == 0) {
+ url = this._platformLocation.pathname;
+ }
+ this._platformLocation.replaceState(state, title, url);
+ }
+ forward() {
+ this._platformLocation.forward();
+ }
+ back() {
+ this._platformLocation.back();
+ }
+}
+HashLocationStrategy.ɵfac = function HashLocationStrategy_Factory(t) { return new (t || HashLocationStrategy)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵinject"](PlatformLocation), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵinject"](APP_BASE_HREF, 8)); };
+HashLocationStrategy.ɵprov = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineInjectable"]({ token: HashLocationStrategy, factory: HashLocationStrategy.ɵfac });
+HashLocationStrategy.ctorParameters = () => [
+ { type: PlatformLocation },
+ { type: String, decorators: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Optional"] }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Inject"], args: [APP_BASE_HREF,] }] }
+];
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](HashLocationStrategy, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Injectable"]
+ }], function () { return [{ type: PlatformLocation }, { type: String, decorators: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Optional"]
+ }, {
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Inject"],
+ args: [APP_BASE_HREF]
+ }] }]; }, null); })();
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * @description
+ *
+ * A service that applications can use to interact with a browser's URL.
+ *
+ * Depending on the `LocationStrategy` used, `Location` persists
+ * to the URL's path or the URL's hash segment.
+ *
+ * @usageNotes
+ *
+ * It's better to use the `Router#navigate` service to trigger route changes. Use
+ * `Location` only if you need to interact with or create normalized URLs outside of
+ * routing.
+ *
+ * `Location` is responsible for normalizing the URL against the application's base href.
+ * A normalized URL is absolute from the URL host, includes the application's base href, and has no
+ * trailing slash:
+ * - `/my/app/user/123` is normalized
+ * - `my/app/user/123` **is not** normalized
+ * - `/my/app/user/123/` **is not** normalized
+ *
+ * ### Example
+ *
+ *
+ *
+ * @publicApi
+ */
+class Location {
+ constructor(platformStrategy, platformLocation) {
+ /** @internal */
+ this._subject = new _angular_core__WEBPACK_IMPORTED_MODULE_0__["EventEmitter"]();
+ /** @internal */
+ this._urlChangeListeners = [];
+ this._platformStrategy = platformStrategy;
+ const browserBaseHref = this._platformStrategy.getBaseHref();
+ this._platformLocation = platformLocation;
+ this._baseHref = stripTrailingSlash(_stripIndexHtml(browserBaseHref));
+ this._platformStrategy.onPopState((ev) => {
+ this._subject.emit({
+ 'url': this.path(true),
+ 'pop': true,
+ 'state': ev.state,
+ 'type': ev.type,
+ });
+ });
+ }
+ /**
+ * Normalizes the URL path for this location.
+ *
+ * @param includeHash True to include an anchor fragment in the path.
+ *
+ * @returns The normalized URL path.
+ */
+ // TODO: vsavkin. Remove the boolean flag and always include hash once the deprecated router is
+ // removed.
+ path(includeHash = false) {
+ return this.normalize(this._platformStrategy.path(includeHash));
+ }
+ /**
+ * Reports the current state of the location history.
+ * @returns The current value of the `history.state` object.
+ */
+ getState() {
+ return this._platformLocation.getState();
+ }
+ /**
+ * Normalizes the given path and compares to the current normalized path.
+ *
+ * @param path The given URL path.
+ * @param query Query parameters.
+ *
+ * @returns True if the given URL path is equal to the current normalized path, false
+ * otherwise.
+ */
+ isCurrentPathEqualTo(path, query = '') {
+ return this.path() == this.normalize(path + normalizeQueryParams(query));
+ }
+ /**
+ * Normalizes a URL path by stripping any trailing slashes.
+ *
+ * @param url String representing a URL.
+ *
+ * @returns The normalized URL string.
+ */
+ normalize(url) {
+ return Location.stripTrailingSlash(_stripBaseHref(this._baseHref, _stripIndexHtml(url)));
+ }
+ /**
+ * Normalizes an external URL path.
+ * If the given URL doesn't begin with a leading slash (`'/'`), adds one
+ * before normalizing. Adds a hash if `HashLocationStrategy` is
+ * in use, or the `APP_BASE_HREF` if the `PathLocationStrategy` is in use.
+ *
+ * @param url String representing a URL.
+ *
+ * @returns A normalized platform-specific URL.
+ */
+ prepareExternalUrl(url) {
+ if (url && url[0] !== '/') {
+ url = '/' + url;
+ }
+ return this._platformStrategy.prepareExternalUrl(url);
+ }
+ // TODO: rename this method to pushState
+ /**
+ * Changes the browser's URL to a normalized version of a given URL, and pushes a
+ * new item onto the platform's history.
+ *
+ * @param path URL path to normalize.
+ * @param query Query parameters.
+ * @param state Location history state.
+ *
+ */
+ go(path, query = '', state = null) {
+ this._platformStrategy.pushState(state, '', path, query);
+ this._notifyUrlChangeListeners(this.prepareExternalUrl(path + normalizeQueryParams(query)), state);
+ }
+ /**
+ * Changes the browser's URL to a normalized version of the given URL, and replaces
+ * the top item on the platform's history stack.
+ *
+ * @param path URL path to normalize.
+ * @param query Query parameters.
+ * @param state Location history state.
+ */
+ replaceState(path, query = '', state = null) {
+ this._platformStrategy.replaceState(state, '', path, query);
+ this._notifyUrlChangeListeners(this.prepareExternalUrl(path + normalizeQueryParams(query)), state);
+ }
+ /**
+ * Navigates forward in the platform's history.
+ */
+ forward() {
+ this._platformStrategy.forward();
+ }
+ /**
+ * Navigates back in the platform's history.
+ */
+ back() {
+ this._platformStrategy.back();
+ }
+ /**
+ * Registers a URL change listener. Use to catch updates performed by the Angular
+ * framework that are not detectible through "popstate" or "hashchange" events.
+ *
+ * @param fn The change handler function, which take a URL and a location history state.
+ */
+ onUrlChange(fn) {
+ this._urlChangeListeners.push(fn);
+ if (!this._urlChangeSubscription) {
+ this._urlChangeSubscription = this.subscribe(v => {
+ this._notifyUrlChangeListeners(v.url, v.state);
+ });
+ }
+ }
+ /** @internal */
+ _notifyUrlChangeListeners(url = '', state) {
+ this._urlChangeListeners.forEach(fn => fn(url, state));
+ }
+ /**
+ * Subscribes to the platform's `popState` events.
+ *
+ * @param value Event that is triggered when the state history changes.
+ * @param exception The exception to throw.
+ *
+ * @returns Subscribed events.
+ */
+ subscribe(onNext, onThrow, onReturn) {
+ return this._subject.subscribe({ next: onNext, error: onThrow, complete: onReturn });
+ }
+}
+Location.ɵfac = function Location_Factory(t) { return new (t || Location)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵinject"](LocationStrategy), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵinject"](PlatformLocation)); };
+/**
+ * Normalizes URL parameters by prepending with `?` if needed.
+ *
+ * @param params String of URL parameters.
+ *
+ * @returns The normalized URL parameters string.
+ */
+Location.normalizeQueryParams = normalizeQueryParams;
+/**
+ * Joins two parts of a URL with a slash if needed.
+ *
+ * @param start URL string
+ * @param end URL string
+ *
+ *
+ * @returns The joined URL string.
+ */
+Location.joinWithSlash = joinWithSlash;
+/**
+ * Removes a trailing slash from a URL string if needed.
+ * Looks for the first occurrence of either `#`, `?`, or the end of the
+ * line as `/` characters and removes the trailing slash if one exists.
+ *
+ * @param url URL string.
+ *
+ * @returns The URL string, modified if needed.
+ */
+Location.stripTrailingSlash = stripTrailingSlash;
+Location.ɵprov = Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineInjectable"])({ factory: createLocation, token: Location, providedIn: "root" });
+Location.ctorParameters = () => [
+ { type: LocationStrategy },
+ { type: PlatformLocation }
+];
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](Location, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Injectable"],
+ args: [{
+ providedIn: 'root',
+ // See #23917
+ useFactory: createLocation
+ }]
+ }], function () { return [{ type: LocationStrategy }, { type: PlatformLocation }]; }, null); })();
+function createLocation() {
+ return new Location(Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵinject"])(LocationStrategy), Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵinject"])(PlatformLocation));
+}
+function _stripBaseHref(baseHref, url) {
+ return baseHref && url.startsWith(baseHref) ? url.substring(baseHref.length) : url;
+}
+function _stripIndexHtml(url) {
+ return url.replace(/\/index.html$/, '');
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/** @internal */
+const CURRENCIES_EN = {
+ 'ADP': [undefined, undefined, 0],
+ 'AFN': [undefined, undefined, 0],
+ 'ALL': [undefined, undefined, 0],
+ 'AMD': [undefined, undefined, 2],
+ 'AOA': [undefined, 'Kz'],
+ 'ARS': [undefined, '$'],
+ 'AUD': ['A$', '$'],
+ 'BAM': [undefined, 'KM'],
+ 'BBD': [undefined, '$'],
+ 'BDT': [undefined, '৳'],
+ 'BHD': [undefined, undefined, 3],
+ 'BIF': [undefined, undefined, 0],
+ 'BMD': [undefined, '$'],
+ 'BND': [undefined, '$'],
+ 'BOB': [undefined, 'Bs'],
+ 'BRL': ['R$'],
+ 'BSD': [undefined, '$'],
+ 'BWP': [undefined, 'P'],
+ 'BYN': [undefined, 'р.', 2],
+ 'BYR': [undefined, undefined, 0],
+ 'BZD': [undefined, '$'],
+ 'CAD': ['CA$', '$', 2],
+ 'CHF': [undefined, undefined, 2],
+ 'CLF': [undefined, undefined, 4],
+ 'CLP': [undefined, '$', 0],
+ 'CNY': ['CN¥', '¥'],
+ 'COP': [undefined, '$', 2],
+ 'CRC': [undefined, '₡', 2],
+ 'CUC': [undefined, '$'],
+ 'CUP': [undefined, '$'],
+ 'CZK': [undefined, 'Kč', 2],
+ 'DJF': [undefined, undefined, 0],
+ 'DKK': [undefined, 'kr', 2],
+ 'DOP': [undefined, '$'],
+ 'EGP': [undefined, 'E£'],
+ 'ESP': [undefined, '₧', 0],
+ 'EUR': ['€'],
+ 'FJD': [undefined, '$'],
+ 'FKP': [undefined, '£'],
+ 'GBP': ['£'],
+ 'GEL': [undefined, '₾'],
+ 'GIP': [undefined, '£'],
+ 'GNF': [undefined, 'FG', 0],
+ 'GTQ': [undefined, 'Q'],
+ 'GYD': [undefined, '$', 2],
+ 'HKD': ['HK$', '$'],
+ 'HNL': [undefined, 'L'],
+ 'HRK': [undefined, 'kn'],
+ 'HUF': [undefined, 'Ft', 2],
+ 'IDR': [undefined, 'Rp', 2],
+ 'ILS': ['₪'],
+ 'INR': ['₹'],
+ 'IQD': [undefined, undefined, 0],
+ 'IRR': [undefined, undefined, 0],
+ 'ISK': [undefined, 'kr', 0],
+ 'ITL': [undefined, undefined, 0],
+ 'JMD': [undefined, '$'],
+ 'JOD': [undefined, undefined, 3],
+ 'JPY': ['¥', undefined, 0],
+ 'KHR': [undefined, '៛'],
+ 'KMF': [undefined, 'CF', 0],
+ 'KPW': [undefined, '₩', 0],
+ 'KRW': ['₩', undefined, 0],
+ 'KWD': [undefined, undefined, 3],
+ 'KYD': [undefined, '$'],
+ 'KZT': [undefined, '₸'],
+ 'LAK': [undefined, '₭', 0],
+ 'LBP': [undefined, 'L£', 0],
+ 'LKR': [undefined, 'Rs'],
+ 'LRD': [undefined, '$'],
+ 'LTL': [undefined, 'Lt'],
+ 'LUF': [undefined, undefined, 0],
+ 'LVL': [undefined, 'Ls'],
+ 'LYD': [undefined, undefined, 3],
+ 'MGA': [undefined, 'Ar', 0],
+ 'MGF': [undefined, undefined, 0],
+ 'MMK': [undefined, 'K', 0],
+ 'MNT': [undefined, '₮', 2],
+ 'MRO': [undefined, undefined, 0],
+ 'MUR': [undefined, 'Rs', 2],
+ 'MXN': ['MX$', '$'],
+ 'MYR': [undefined, 'RM'],
+ 'NAD': [undefined, '$'],
+ 'NGN': [undefined, '₦'],
+ 'NIO': [undefined, 'C$'],
+ 'NOK': [undefined, 'kr', 2],
+ 'NPR': [undefined, 'Rs'],
+ 'NZD': ['NZ$', '$'],
+ 'OMR': [undefined, undefined, 3],
+ 'PHP': [undefined, '₱'],
+ 'PKR': [undefined, 'Rs', 2],
+ 'PLN': [undefined, 'zł'],
+ 'PYG': [undefined, '₲', 0],
+ 'RON': [undefined, 'lei'],
+ 'RSD': [undefined, undefined, 0],
+ 'RUB': [undefined, '₽'],
+ 'RUR': [undefined, 'р.'],
+ 'RWF': [undefined, 'RF', 0],
+ 'SBD': [undefined, '$'],
+ 'SEK': [undefined, 'kr', 2],
+ 'SGD': [undefined, '$'],
+ 'SHP': [undefined, '£'],
+ 'SLL': [undefined, undefined, 0],
+ 'SOS': [undefined, undefined, 0],
+ 'SRD': [undefined, '$'],
+ 'SSP': [undefined, '£'],
+ 'STD': [undefined, undefined, 0],
+ 'STN': [undefined, 'Db'],
+ 'SYP': [undefined, '£', 0],
+ 'THB': [undefined, '฿'],
+ 'TMM': [undefined, undefined, 0],
+ 'TND': [undefined, undefined, 3],
+ 'TOP': [undefined, 'T$'],
+ 'TRL': [undefined, undefined, 0],
+ 'TRY': [undefined, '₺'],
+ 'TTD': [undefined, '$'],
+ 'TWD': ['NT$', '$', 2],
+ 'TZS': [undefined, undefined, 2],
+ 'UAH': [undefined, '₴'],
+ 'UGX': [undefined, undefined, 0],
+ 'USD': ['$'],
+ 'UYI': [undefined, undefined, 0],
+ 'UYU': [undefined, '$'],
+ 'UYW': [undefined, undefined, 4],
+ 'UZS': [undefined, undefined, 2],
+ 'VEF': [undefined, 'Bs', 2],
+ 'VND': ['₫', undefined, 0],
+ 'VUV': [undefined, undefined, 0],
+ 'XAF': ['FCFA', undefined, 0],
+ 'XCD': ['EC$', '$'],
+ 'XOF': ['CFA', undefined, 0],
+ 'XPF': ['CFPF', undefined, 0],
+ 'XXX': ['¤'],
+ 'YER': [undefined, undefined, 0],
+ 'ZAR': [undefined, 'R'],
+ 'ZMK': [undefined, undefined, 0],
+ 'ZMW': [undefined, 'ZK'],
+ 'ZWD': [undefined, undefined, 0]
+};
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * Format styles that can be used to represent numbers.
+ * @see `getLocaleNumberFormat()`.
+ * @see [Internationalization (i18n) Guide](https://angular.io/guide/i18n)
+ *
+ * @publicApi
+ */
+var NumberFormatStyle;
+(function (NumberFormatStyle) {
+ NumberFormatStyle[NumberFormatStyle["Decimal"] = 0] = "Decimal";
+ NumberFormatStyle[NumberFormatStyle["Percent"] = 1] = "Percent";
+ NumberFormatStyle[NumberFormatStyle["Currency"] = 2] = "Currency";
+ NumberFormatStyle[NumberFormatStyle["Scientific"] = 3] = "Scientific";
+})(NumberFormatStyle || (NumberFormatStyle = {}));
+/**
+ * Plurality cases used for translating plurals to different languages.
+ *
+ * @see `NgPlural`
+ * @see `NgPluralCase`
+ * @see [Internationalization (i18n) Guide](https://angular.io/guide/i18n)
+ *
+ * @publicApi
+ */
+var Plural;
+(function (Plural) {
+ Plural[Plural["Zero"] = 0] = "Zero";
+ Plural[Plural["One"] = 1] = "One";
+ Plural[Plural["Two"] = 2] = "Two";
+ Plural[Plural["Few"] = 3] = "Few";
+ Plural[Plural["Many"] = 4] = "Many";
+ Plural[Plural["Other"] = 5] = "Other";
+})(Plural || (Plural = {}));
+/**
+ * Context-dependant translation forms for strings.
+ * Typically the standalone version is for the nominative form of the word,
+ * and the format version is used for the genitive case.
+ * @see [CLDR website](http://cldr.unicode.org/translation/date-time-1/date-time#TOC-Standalone-vs.-Format-Styles)
+ * @see [Internationalization (i18n) Guide](https://angular.io/guide/i18n)
+ *
+ * @publicApi
+ */
+var FormStyle;
+(function (FormStyle) {
+ FormStyle[FormStyle["Format"] = 0] = "Format";
+ FormStyle[FormStyle["Standalone"] = 1] = "Standalone";
+})(FormStyle || (FormStyle = {}));
+/**
+ * String widths available for translations.
+ * The specific character widths are locale-specific.
+ * Examples are given for the word "Sunday" in English.
+ *
+ * @publicApi
+ */
+var TranslationWidth;
+(function (TranslationWidth) {
+ /** 1 character for `en-US`. For example: 'S' */
+ TranslationWidth[TranslationWidth["Narrow"] = 0] = "Narrow";
+ /** 3 characters for `en-US`. For example: 'Sun' */
+ TranslationWidth[TranslationWidth["Abbreviated"] = 1] = "Abbreviated";
+ /** Full length for `en-US`. For example: "Sunday" */
+ TranslationWidth[TranslationWidth["Wide"] = 2] = "Wide";
+ /** 2 characters for `en-US`, For example: "Su" */
+ TranslationWidth[TranslationWidth["Short"] = 3] = "Short";
+})(TranslationWidth || (TranslationWidth = {}));
+/**
+ * String widths available for date-time formats.
+ * The specific character widths are locale-specific.
+ * Examples are given for `en-US`.
+ *
+ * @see `getLocaleDateFormat()`
+ * @see `getLocaleTimeFormat()`
+ * @see `getLocaleDateTimeFormat()`
+ * @see [Internationalization (i18n) Guide](https://angular.io/guide/i18n)
+ * @publicApi
+ */
+var FormatWidth;
+(function (FormatWidth) {
+ /**
+ * For `en-US`, 'M/d/yy, h:mm a'`
+ * (Example: `6/15/15, 9:03 AM`)
+ */
+ FormatWidth[FormatWidth["Short"] = 0] = "Short";
+ /**
+ * For `en-US`, `'MMM d, y, h:mm:ss a'`
+ * (Example: `Jun 15, 2015, 9:03:01 AM`)
+ */
+ FormatWidth[FormatWidth["Medium"] = 1] = "Medium";
+ /**
+ * For `en-US`, `'MMMM d, y, h:mm:ss a z'`
+ * (Example: `June 15, 2015 at 9:03:01 AM GMT+1`)
+ */
+ FormatWidth[FormatWidth["Long"] = 2] = "Long";
+ /**
+ * For `en-US`, `'EEEE, MMMM d, y, h:mm:ss a zzzz'`
+ * (Example: `Monday, June 15, 2015 at 9:03:01 AM GMT+01:00`)
+ */
+ FormatWidth[FormatWidth["Full"] = 3] = "Full";
+})(FormatWidth || (FormatWidth = {}));
+/**
+ * Symbols that can be used to replace placeholders in number patterns.
+ * Examples are based on `en-US` values.
+ *
+ * @see `getLocaleNumberSymbol()`
+ * @see [Internationalization (i18n) Guide](https://angular.io/guide/i18n)
+ *
+ * @publicApi
+ */
+var NumberSymbol;
+(function (NumberSymbol) {
+ /**
+ * Decimal separator.
+ * For `en-US`, the dot character.
+ * Example: 2,345`.`67
+ */
+ NumberSymbol[NumberSymbol["Decimal"] = 0] = "Decimal";
+ /**
+ * Grouping separator, typically for thousands.
+ * For `en-US`, the comma character.
+ * Example: 2`,`345.67
+ */
+ NumberSymbol[NumberSymbol["Group"] = 1] = "Group";
+ /**
+ * List-item separator.
+ * Example: "one, two, and three"
+ */
+ NumberSymbol[NumberSymbol["List"] = 2] = "List";
+ /**
+ * Sign for percentage (out of 100).
+ * Example: 23.4%
+ */
+ NumberSymbol[NumberSymbol["PercentSign"] = 3] = "PercentSign";
+ /**
+ * Sign for positive numbers.
+ * Example: +23
+ */
+ NumberSymbol[NumberSymbol["PlusSign"] = 4] = "PlusSign";
+ /**
+ * Sign for negative numbers.
+ * Example: -23
+ */
+ NumberSymbol[NumberSymbol["MinusSign"] = 5] = "MinusSign";
+ /**
+ * Computer notation for exponential value (n times a power of 10).
+ * Example: 1.2E3
+ */
+ NumberSymbol[NumberSymbol["Exponential"] = 6] = "Exponential";
+ /**
+ * Human-readable format of exponential.
+ * Example: 1.2x103
+ */
+ NumberSymbol[NumberSymbol["SuperscriptingExponent"] = 7] = "SuperscriptingExponent";
+ /**
+ * Sign for permille (out of 1000).
+ * Example: 23.4‰
+ */
+ NumberSymbol[NumberSymbol["PerMille"] = 8] = "PerMille";
+ /**
+ * Infinity, can be used with plus and minus.
+ * Example: ∞, +∞, -∞
+ */
+ NumberSymbol[NumberSymbol["Infinity"] = 9] = "Infinity";
+ /**
+ * Not a number.
+ * Example: NaN
+ */
+ NumberSymbol[NumberSymbol["NaN"] = 10] = "NaN";
+ /**
+ * Symbol used between time units.
+ * Example: 10:52
+ */
+ NumberSymbol[NumberSymbol["TimeSeparator"] = 11] = "TimeSeparator";
+ /**
+ * Decimal separator for currency values (fallback to `Decimal`).
+ * Example: $2,345.67
+ */
+ NumberSymbol[NumberSymbol["CurrencyDecimal"] = 12] = "CurrencyDecimal";
+ /**
+ * Group separator for currency values (fallback to `Group`).
+ * Example: $2,345.67
+ */
+ NumberSymbol[NumberSymbol["CurrencyGroup"] = 13] = "CurrencyGroup";
+})(NumberSymbol || (NumberSymbol = {}));
+/**
+ * The value for each day of the week, based on the `en-US` locale
+ *
+ * @publicApi
+ */
+var WeekDay;
+(function (WeekDay) {
+ WeekDay[WeekDay["Sunday"] = 0] = "Sunday";
+ WeekDay[WeekDay["Monday"] = 1] = "Monday";
+ WeekDay[WeekDay["Tuesday"] = 2] = "Tuesday";
+ WeekDay[WeekDay["Wednesday"] = 3] = "Wednesday";
+ WeekDay[WeekDay["Thursday"] = 4] = "Thursday";
+ WeekDay[WeekDay["Friday"] = 5] = "Friday";
+ WeekDay[WeekDay["Saturday"] = 6] = "Saturday";
+})(WeekDay || (WeekDay = {}));
+/**
+ * Retrieves the locale ID from the currently loaded locale.
+ * The loaded locale could be, for example, a global one rather than a regional one.
+ * @param locale A locale code, such as `fr-FR`.
+ * @returns The locale code. For example, `fr`.
+ * @see [Internationalization (i18n) Guide](https://angular.io/guide/i18n)
+ *
+ * @publicApi
+ */
+function getLocaleId(locale) {
+ return Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵfindLocaleData"])(locale)[_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵLocaleDataIndex"].LocaleId];
+}
+/**
+ * Retrieves day period strings for the given locale.
+ *
+ * @param locale A locale code for the locale format rules to use.
+ * @param formStyle The required grammatical form.
+ * @param width The required character width.
+ * @returns An array of localized period strings. For example, `[AM, PM]` for `en-US`.
+ * @see [Internationalization (i18n) Guide](https://angular.io/guide/i18n)
+ *
+ * @publicApi
+ */
+function getLocaleDayPeriods(locale, formStyle, width) {
+ const data = Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵfindLocaleData"])(locale);
+ const amPmData = [
+ data[_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵLocaleDataIndex"].DayPeriodsFormat], data[_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵLocaleDataIndex"].DayPeriodsStandalone]
+ ];
+ const amPm = getLastDefinedValue(amPmData, formStyle);
+ return getLastDefinedValue(amPm, width);
+}
+/**
+ * Retrieves days of the week for the given locale, using the Gregorian calendar.
+ *
+ * @param locale A locale code for the locale format rules to use.
+ * @param formStyle The required grammatical form.
+ * @param width The required character width.
+ * @returns An array of localized name strings.
+ * For example,`[Sunday, Monday, ... Saturday]` for `en-US`.
+ * @see [Internationalization (i18n) Guide](https://angular.io/guide/i18n)
+ *
+ * @publicApi
+ */
+function getLocaleDayNames(locale, formStyle, width) {
+ const data = Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵfindLocaleData"])(locale);
+ const daysData = [data[_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵLocaleDataIndex"].DaysFormat], data[_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵLocaleDataIndex"].DaysStandalone]];
+ const days = getLastDefinedValue(daysData, formStyle);
+ return getLastDefinedValue(days, width);
+}
+/**
+ * Retrieves months of the year for the given locale, using the Gregorian calendar.
+ *
+ * @param locale A locale code for the locale format rules to use.
+ * @param formStyle The required grammatical form.
+ * @param width The required character width.
+ * @returns An array of localized name strings.
+ * For example, `[January, February, ...]` for `en-US`.
+ * @see [Internationalization (i18n) Guide](https://angular.io/guide/i18n)
+ *
+ * @publicApi
+ */
+function getLocaleMonthNames(locale, formStyle, width) {
+ const data = Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵfindLocaleData"])(locale);
+ const monthsData = [data[_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵLocaleDataIndex"].MonthsFormat], data[_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵLocaleDataIndex"].MonthsStandalone]];
+ const months = getLastDefinedValue(monthsData, formStyle);
+ return getLastDefinedValue(months, width);
+}
+/**
+ * Retrieves Gregorian-calendar eras for the given locale.
+ * @param locale A locale code for the locale format rules to use.
+ * @param width The required character width.
+
+ * @returns An array of localized era strings.
+ * For example, `[AD, BC]` for `en-US`.
+ * @see [Internationalization (i18n) Guide](https://angular.io/guide/i18n)
+ *
+ * @publicApi
+ */
+function getLocaleEraNames(locale, width) {
+ const data = Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵfindLocaleData"])(locale);
+ const erasData = data[_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵLocaleDataIndex"].Eras];
+ return getLastDefinedValue(erasData, width);
+}
+/**
+ * Retrieves the first day of the week for the given locale.
+ *
+ * @param locale A locale code for the locale format rules to use.
+ * @returns A day index number, using the 0-based week-day index for `en-US`
+ * (Sunday = 0, Monday = 1, ...).
+ * For example, for `fr-FR`, returns 1 to indicate that the first day is Monday.
+ * @see [Internationalization (i18n) Guide](https://angular.io/guide/i18n)
+ *
+ * @publicApi
+ */
+function getLocaleFirstDayOfWeek(locale) {
+ const data = Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵfindLocaleData"])(locale);
+ return data[_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵLocaleDataIndex"].FirstDayOfWeek];
+}
+/**
+ * Range of week days that are considered the week-end for the given locale.
+ *
+ * @param locale A locale code for the locale format rules to use.
+ * @returns The range of day values, `[startDay, endDay]`.
+ * @see [Internationalization (i18n) Guide](https://angular.io/guide/i18n)
+ *
+ * @publicApi
+ */
+function getLocaleWeekEndRange(locale) {
+ const data = Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵfindLocaleData"])(locale);
+ return data[_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵLocaleDataIndex"].WeekendRange];
+}
+/**
+ * Retrieves a localized date-value formating string.
+ *
+ * @param locale A locale code for the locale format rules to use.
+ * @param width The format type.
+ * @returns The localized formating string.
+ * @see `FormatWidth`
+ * @see [Internationalization (i18n) Guide](https://angular.io/guide/i18n)
+ *
+ * @publicApi
+ */
+function getLocaleDateFormat(locale, width) {
+ const data = Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵfindLocaleData"])(locale);
+ return getLastDefinedValue(data[_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵLocaleDataIndex"].DateFormat], width);
+}
+/**
+ * Retrieves a localized time-value formatting string.
+ *
+ * @param locale A locale code for the locale format rules to use.
+ * @param width The format type.
+ * @returns The localized formatting string.
+ * @see `FormatWidth`
+ * @see [Internationalization (i18n) Guide](https://angular.io/guide/i18n)
+
+ * @publicApi
+ */
+function getLocaleTimeFormat(locale, width) {
+ const data = Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵfindLocaleData"])(locale);
+ return getLastDefinedValue(data[_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵLocaleDataIndex"].TimeFormat], width);
+}
+/**
+ * Retrieves a localized date-time formatting string.
+ *
+ * @param locale A locale code for the locale format rules to use.
+ * @param width The format type.
+ * @returns The localized formatting string.
+ * @see `FormatWidth`
+ * @see [Internationalization (i18n) Guide](https://angular.io/guide/i18n)
+ *
+ * @publicApi
+ */
+function getLocaleDateTimeFormat(locale, width) {
+ const data = Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵfindLocaleData"])(locale);
+ const dateTimeFormatData = data[_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵLocaleDataIndex"].DateTimeFormat];
+ return getLastDefinedValue(dateTimeFormatData, width);
+}
+/**
+ * Retrieves a localized number symbol that can be used to replace placeholders in number formats.
+ * @param locale The locale code.
+ * @param symbol The symbol to localize.
+ * @returns The character for the localized symbol.
+ * @see `NumberSymbol`
+ * @see [Internationalization (i18n) Guide](https://angular.io/guide/i18n)
+ *
+ * @publicApi
+ */
+function getLocaleNumberSymbol(locale, symbol) {
+ const data = Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵfindLocaleData"])(locale);
+ const res = data[_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵLocaleDataIndex"].NumberSymbols][symbol];
+ if (typeof res === 'undefined') {
+ if (symbol === NumberSymbol.CurrencyDecimal) {
+ return data[_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵLocaleDataIndex"].NumberSymbols][NumberSymbol.Decimal];
+ }
+ else if (symbol === NumberSymbol.CurrencyGroup) {
+ return data[_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵLocaleDataIndex"].NumberSymbols][NumberSymbol.Group];
+ }
+ }
+ return res;
+}
+/**
+ * Retrieves a number format for a given locale.
+ *
+ * Numbers are formatted using patterns, like `#,###.00`. For example, the pattern `#,###.00`
+ * when used to format the number 12345.678 could result in "12'345,678". That would happen if the
+ * grouping separator for your language is an apostrophe, and the decimal separator is a comma.
+ *
+ * Important: The characters `.` `,` `0` `#` (and others below) are special placeholders
+ * that stand for the decimal separator, and so on, and are NOT real characters.
+ * You must NOT "translate" the placeholders. For example, don't change `.` to `,` even though in
+ * your language the decimal point is written with a comma. The symbols should be replaced by the
+ * local equivalents, using the appropriate `NumberSymbol` for your language.
+ *
+ * Here are the special characters used in number patterns:
+ *
+ * | Symbol | Meaning |
+ * |--------|---------|
+ * | . | Replaced automatically by the character used for the decimal point. |
+ * | , | Replaced by the "grouping" (thousands) separator. |
+ * | 0 | Replaced by a digit (or zero if there aren't enough digits). |
+ * | # | Replaced by a digit (or nothing if there aren't enough). |
+ * | ¤ | Replaced by a currency symbol, such as $ or USD. |
+ * | % | Marks a percent format. The % symbol may change position, but must be retained. |
+ * | E | Marks a scientific format. The E symbol may change position, but must be retained. |
+ * | ' | Special characters used as literal characters are quoted with ASCII single quotes. |
+ *
+ * @param locale A locale code for the locale format rules to use.
+ * @param type The type of numeric value to be formatted (such as `Decimal` or `Currency`.)
+ * @returns The localized format string.
+ * @see `NumberFormatStyle`
+ * @see [CLDR website](http://cldr.unicode.org/translation/number-patterns)
+ * @see [Internationalization (i18n) Guide](https://angular.io/guide/i18n)
+ *
+ * @publicApi
+ */
+function getLocaleNumberFormat(locale, type) {
+ const data = Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵfindLocaleData"])(locale);
+ return data[_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵLocaleDataIndex"].NumberFormats][type];
+}
+/**
+ * Retrieves the symbol used to represent the currency for the main country
+ * corresponding to a given locale. For example, '$' for `en-US`.
+ *
+ * @param locale A locale code for the locale format rules to use.
+ * @returns The localized symbol character,
+ * or `null` if the main country cannot be determined.
+ * @see [Internationalization (i18n) Guide](https://angular.io/guide/i18n)
+ *
+ * @publicApi
+ */
+function getLocaleCurrencySymbol(locale) {
+ const data = Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵfindLocaleData"])(locale);
+ return data[_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵLocaleDataIndex"].CurrencySymbol] || null;
+}
+/**
+ * Retrieves the name of the currency for the main country corresponding
+ * to a given locale. For example, 'US Dollar' for `en-US`.
+ * @param locale A locale code for the locale format rules to use.
+ * @returns The currency name,
+ * or `null` if the main country cannot be determined.
+ * @see [Internationalization (i18n) Guide](https://angular.io/guide/i18n)
+ *
+ * @publicApi
+ */
+function getLocaleCurrencyName(locale) {
+ const data = Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵfindLocaleData"])(locale);
+ return data[_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵLocaleDataIndex"].CurrencyName] || null;
+}
+/**
+ * Retrieves the default currency code for the given locale.
+ *
+ * The default is defined as the first currency which is still in use.
+ *
+ * @param locale The code of the locale whose currency code we want.
+ * @returns The code of the default currency for the given locale.
+ *
+ * @publicApi
+ */
+function getLocaleCurrencyCode(locale) {
+ return Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵgetLocaleCurrencyCode"])(locale);
+}
+/**
+ * Retrieves the currency values for a given locale.
+ * @param locale A locale code for the locale format rules to use.
+ * @returns The currency values.
+ * @see [Internationalization (i18n) Guide](https://angular.io/guide/i18n)
+ */
+function getLocaleCurrencies(locale) {
+ const data = Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵfindLocaleData"])(locale);
+ return data[_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵLocaleDataIndex"].Currencies];
+}
+/**
+ * @alias core/ɵgetLocalePluralCase
+ * @publicApi
+ */
+const getLocalePluralCase = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵgetLocalePluralCase"];
+function checkFullData(data) {
+ if (!data[_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵLocaleDataIndex"].ExtraData]) {
+ throw new Error(`Missing extra locale data for the locale "${data[_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵLocaleDataIndex"]
+ .LocaleId]}". Use "registerLocaleData" to load new data. See the "I18n guide" on angular.io to know more.`);
+ }
+}
+/**
+ * Retrieves locale-specific rules used to determine which day period to use
+ * when more than one period is defined for a locale.
+ *
+ * There is a rule for each defined day period. The
+ * first rule is applied to the first day period and so on.
+ * Fall back to AM/PM when no rules are available.
+ *
+ * A rule can specify a period as time range, or as a single time value.
+ *
+ * This functionality is only available when you have loaded the full locale data.
+ * See the ["I18n guide"](guide/i18n#i18n-pipes).
+ *
+ * @param locale A locale code for the locale format rules to use.
+ * @returns The rules for the locale, a single time value or array of *from-time, to-time*,
+ * or null if no periods are available.
+ *
+ * @see `getLocaleExtraDayPeriods()`
+ * @see [Internationalization (i18n) Guide](https://angular.io/guide/i18n)
+ *
+ * @publicApi
+ */
+function getLocaleExtraDayPeriodRules(locale) {
+ const data = Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵfindLocaleData"])(locale);
+ checkFullData(data);
+ const rules = data[_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵLocaleDataIndex"].ExtraData][2 /* ExtraDayPeriodsRules */] || [];
+ return rules.map((rule) => {
+ if (typeof rule === 'string') {
+ return extractTime(rule);
+ }
+ return [extractTime(rule[0]), extractTime(rule[1])];
+ });
+}
+/**
+ * Retrieves locale-specific day periods, which indicate roughly how a day is broken up
+ * in different languages.
+ * For example, for `en-US`, periods are morning, noon, afternoon, evening, and midnight.
+ *
+ * This functionality is only available when you have loaded the full locale data.
+ * See the ["I18n guide"](guide/i18n#i18n-pipes).
+ *
+ * @param locale A locale code for the locale format rules to use.
+ * @param formStyle The required grammatical form.
+ * @param width The required character width.
+ * @returns The translated day-period strings.
+ * @see `getLocaleExtraDayPeriodRules()`
+ * @see [Internationalization (i18n) Guide](https://angular.io/guide/i18n)
+ *
+ * @publicApi
+ */
+function getLocaleExtraDayPeriods(locale, formStyle, width) {
+ const data = Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵfindLocaleData"])(locale);
+ checkFullData(data);
+ const dayPeriodsData = [
+ data[_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵLocaleDataIndex"].ExtraData][0 /* ExtraDayPeriodFormats */],
+ data[_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵLocaleDataIndex"].ExtraData][1 /* ExtraDayPeriodStandalone */]
+ ];
+ const dayPeriods = getLastDefinedValue(dayPeriodsData, formStyle) || [];
+ return getLastDefinedValue(dayPeriods, width) || [];
+}
+/**
+ * Retrieves the writing direction of a specified locale
+ * @param locale A locale code for the locale format rules to use.
+ * @publicApi
+ * @returns 'rtl' or 'ltr'
+ * @see [Internationalization (i18n) Guide](https://angular.io/guide/i18n)
+ */
+function getLocaleDirection(locale) {
+ const data = Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵfindLocaleData"])(locale);
+ return data[_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵLocaleDataIndex"].Directionality];
+}
+/**
+ * Retrieves the first value that is defined in an array, going backwards from an index position.
+ *
+ * To avoid repeating the same data (as when the "format" and "standalone" forms are the same)
+ * add the first value to the locale data arrays, and add other values only if they are different.
+ *
+ * @param data The data array to retrieve from.
+ * @param index A 0-based index into the array to start from.
+ * @returns The value immediately before the given index position.
+ * @see [Internationalization (i18n) Guide](https://angular.io/guide/i18n)
+ *
+ * @publicApi
+ */
+function getLastDefinedValue(data, index) {
+ for (let i = index; i > -1; i--) {
+ if (typeof data[i] !== 'undefined') {
+ return data[i];
+ }
+ }
+ throw new Error('Locale data API: locale data undefined');
+}
+/**
+ * Extracts the hours and minutes from a string like "15:45"
+ */
+function extractTime(time) {
+ const [h, m] = time.split(':');
+ return { hours: +h, minutes: +m };
+}
+/**
+ * Retrieves the currency symbol for a given currency code.
+ *
+ * For example, for the default `en-US` locale, the code `USD` can
+ * be represented by the narrow symbol `$` or the wide symbol `US$`.
+ *
+ * @param code The currency code.
+ * @param format The format, `wide` or `narrow`.
+ * @param locale A locale code for the locale format rules to use.
+ *
+ * @returns The symbol, or the currency code if no symbol is available.
+ * @see [Internationalization (i18n) Guide](https://angular.io/guide/i18n)
+ *
+ * @publicApi
+ */
+function getCurrencySymbol(code, format, locale = 'en') {
+ const currency = getLocaleCurrencies(locale)[code] || CURRENCIES_EN[code] || [];
+ const symbolNarrow = currency[1 /* SymbolNarrow */];
+ if (format === 'narrow' && typeof symbolNarrow === 'string') {
+ return symbolNarrow;
+ }
+ return currency[0 /* Symbol */] || code;
+}
+// Most currencies have cents, that's why the default is 2
+const DEFAULT_NB_OF_CURRENCY_DIGITS = 2;
+/**
+ * Reports the number of decimal digits for a given currency.
+ * The value depends upon the presence of cents in that particular currency.
+ *
+ * @param code The currency code.
+ * @returns The number of decimal digits, typically 0 or 2.
+ * @see [Internationalization (i18n) Guide](https://angular.io/guide/i18n)
+ *
+ * @publicApi
+ */
+function getNumberOfCurrencyDigits(code) {
+ let digits;
+ const currency = CURRENCIES_EN[code];
+ if (currency) {
+ digits = currency[2 /* NbOfDigits */];
+ }
+ return typeof digits === 'number' ? digits : DEFAULT_NB_OF_CURRENCY_DIGITS;
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+const ISO8601_DATE_REGEX = /^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d+))?)?)?(Z|([+-])(\d\d):?(\d\d))?)?$/;
+// 1 2 3 4 5 6 7 8 9 10 11
+const NAMED_FORMATS = {};
+const DATE_FORMATS_SPLIT = /((?:[^GyYMLwWdEabBhHmsSzZO']+)|(?:'(?:[^']|'')*')|(?:G{1,5}|y{1,4}|Y{1,4}|M{1,5}|L{1,5}|w{1,2}|W{1}|d{1,2}|E{1,6}|a{1,5}|b{1,5}|B{1,5}|h{1,2}|H{1,2}|m{1,2}|s{1,2}|S{1,3}|z{1,4}|Z{1,5}|O{1,4}))([\s\S]*)/;
+var ZoneWidth;
+(function (ZoneWidth) {
+ ZoneWidth[ZoneWidth["Short"] = 0] = "Short";
+ ZoneWidth[ZoneWidth["ShortGMT"] = 1] = "ShortGMT";
+ ZoneWidth[ZoneWidth["Long"] = 2] = "Long";
+ ZoneWidth[ZoneWidth["Extended"] = 3] = "Extended";
+})(ZoneWidth || (ZoneWidth = {}));
+var DateType;
+(function (DateType) {
+ DateType[DateType["FullYear"] = 0] = "FullYear";
+ DateType[DateType["Month"] = 1] = "Month";
+ DateType[DateType["Date"] = 2] = "Date";
+ DateType[DateType["Hours"] = 3] = "Hours";
+ DateType[DateType["Minutes"] = 4] = "Minutes";
+ DateType[DateType["Seconds"] = 5] = "Seconds";
+ DateType[DateType["FractionalSeconds"] = 6] = "FractionalSeconds";
+ DateType[DateType["Day"] = 7] = "Day";
+})(DateType || (DateType = {}));
+var TranslationType;
+(function (TranslationType) {
+ TranslationType[TranslationType["DayPeriods"] = 0] = "DayPeriods";
+ TranslationType[TranslationType["Days"] = 1] = "Days";
+ TranslationType[TranslationType["Months"] = 2] = "Months";
+ TranslationType[TranslationType["Eras"] = 3] = "Eras";
+})(TranslationType || (TranslationType = {}));
+/**
+ * @ngModule CommonModule
+ * @description
+ *
+ * Formats a date according to locale rules.
+ *
+ * @param value The date to format, as a Date, or a number (milliseconds since UTC epoch)
+ * or an [ISO date-time string](https://www.w3.org/TR/NOTE-datetime).
+ * @param format The date-time components to include. See `DatePipe` for details.
+ * @param locale A locale code for the locale format rules to use.
+ * @param timezone The time zone. A time zone offset from GMT (such as `'+0430'`),
+ * or a standard UTC/GMT or continental US time zone abbreviation.
+ * If not specified, uses host system settings.
+ *
+ * @returns The formatted date string.
+ *
+ * @see `DatePipe`
+ * @see [Internationalization (i18n) Guide](https://angular.io/guide/i18n)
+ *
+ * @publicApi
+ */
+function formatDate(value, format, locale, timezone) {
+ let date = toDate(value);
+ const namedFormat = getNamedFormat(locale, format);
+ format = namedFormat || format;
+ let parts = [];
+ let match;
+ while (format) {
+ match = DATE_FORMATS_SPLIT.exec(format);
+ if (match) {
+ parts = parts.concat(match.slice(1));
+ const part = parts.pop();
+ if (!part) {
+ break;
+ }
+ format = part;
+ }
+ else {
+ parts.push(format);
+ break;
+ }
+ }
+ let dateTimezoneOffset = date.getTimezoneOffset();
+ if (timezone) {
+ dateTimezoneOffset = timezoneToOffset(timezone, dateTimezoneOffset);
+ date = convertTimezoneToLocal(date, timezone, true);
+ }
+ let text = '';
+ parts.forEach(value => {
+ const dateFormatter = getDateFormatter(value);
+ text += dateFormatter ?
+ dateFormatter(date, locale, dateTimezoneOffset) :
+ value === '\'\'' ? '\'' : value.replace(/(^'|'$)/g, '').replace(/''/g, '\'');
+ });
+ return text;
+}
+/**
+ * Create a new Date object with the given date value, and the time set to midnight.
+ *
+ * We cannot use `new Date(year, month, date)` because it maps years between 0 and 99 to 1900-1999.
+ * See: https://github.com/angular/angular/issues/40377
+ *
+ * Note that this function returns a Date object whose time is midnight in the current locale's
+ * timezone. In the future we might want to change this to be midnight in UTC, but this would be a
+ * considerable breaking change.
+ */
+function createDate(year, month, date) {
+ // The `newDate` is set to midnight (UTC) on January 1st 1970.
+ // - In PST this will be December 31st 1969 at 4pm.
+ // - In GMT this will be January 1st 1970 at 1am.
+ // Note that they even have different years, dates and months!
+ const newDate = new Date(0);
+ // `setFullYear()` allows years like 0001 to be set correctly. This function does not
+ // change the internal time of the date.
+ // Consider calling `setFullYear(2019, 8, 20)` (September 20, 2019).
+ // - In PST this will now be September 20, 2019 at 4pm
+ // - In GMT this will now be September 20, 2019 at 1am
+ newDate.setFullYear(year, month, date);
+ // We want the final date to be at local midnight, so we reset the time.
+ // - In PST this will now be September 20, 2019 at 12am
+ // - In GMT this will now be September 20, 2019 at 12am
+ newDate.setHours(0, 0, 0);
+ return newDate;
+}
+function getNamedFormat(locale, format) {
+ const localeId = getLocaleId(locale);
+ NAMED_FORMATS[localeId] = NAMED_FORMATS[localeId] || {};
+ if (NAMED_FORMATS[localeId][format]) {
+ return NAMED_FORMATS[localeId][format];
+ }
+ let formatValue = '';
+ switch (format) {
+ case 'shortDate':
+ formatValue = getLocaleDateFormat(locale, FormatWidth.Short);
+ break;
+ case 'mediumDate':
+ formatValue = getLocaleDateFormat(locale, FormatWidth.Medium);
+ break;
+ case 'longDate':
+ formatValue = getLocaleDateFormat(locale, FormatWidth.Long);
+ break;
+ case 'fullDate':
+ formatValue = getLocaleDateFormat(locale, FormatWidth.Full);
+ break;
+ case 'shortTime':
+ formatValue = getLocaleTimeFormat(locale, FormatWidth.Short);
+ break;
+ case 'mediumTime':
+ formatValue = getLocaleTimeFormat(locale, FormatWidth.Medium);
+ break;
+ case 'longTime':
+ formatValue = getLocaleTimeFormat(locale, FormatWidth.Long);
+ break;
+ case 'fullTime':
+ formatValue = getLocaleTimeFormat(locale, FormatWidth.Full);
+ break;
+ case 'short':
+ const shortTime = getNamedFormat(locale, 'shortTime');
+ const shortDate = getNamedFormat(locale, 'shortDate');
+ formatValue = formatDateTime(getLocaleDateTimeFormat(locale, FormatWidth.Short), [shortTime, shortDate]);
+ break;
+ case 'medium':
+ const mediumTime = getNamedFormat(locale, 'mediumTime');
+ const mediumDate = getNamedFormat(locale, 'mediumDate');
+ formatValue = formatDateTime(getLocaleDateTimeFormat(locale, FormatWidth.Medium), [mediumTime, mediumDate]);
+ break;
+ case 'long':
+ const longTime = getNamedFormat(locale, 'longTime');
+ const longDate = getNamedFormat(locale, 'longDate');
+ formatValue =
+ formatDateTime(getLocaleDateTimeFormat(locale, FormatWidth.Long), [longTime, longDate]);
+ break;
+ case 'full':
+ const fullTime = getNamedFormat(locale, 'fullTime');
+ const fullDate = getNamedFormat(locale, 'fullDate');
+ formatValue =
+ formatDateTime(getLocaleDateTimeFormat(locale, FormatWidth.Full), [fullTime, fullDate]);
+ break;
+ }
+ if (formatValue) {
+ NAMED_FORMATS[localeId][format] = formatValue;
+ }
+ return formatValue;
+}
+function formatDateTime(str, opt_values) {
+ if (opt_values) {
+ str = str.replace(/\{([^}]+)}/g, function (match, key) {
+ return (opt_values != null && key in opt_values) ? opt_values[key] : match;
+ });
+ }
+ return str;
+}
+function padNumber(num, digits, minusSign = '-', trim, negWrap) {
+ let neg = '';
+ if (num < 0 || (negWrap && num <= 0)) {
+ if (negWrap) {
+ num = -num + 1;
+ }
+ else {
+ num = -num;
+ neg = minusSign;
+ }
+ }
+ let strNum = String(num);
+ while (strNum.length < digits) {
+ strNum = '0' + strNum;
+ }
+ if (trim) {
+ strNum = strNum.substr(strNum.length - digits);
+ }
+ return neg + strNum;
+}
+function formatFractionalSeconds(milliseconds, digits) {
+ const strMs = padNumber(milliseconds, 3);
+ return strMs.substr(0, digits);
+}
+/**
+ * Returns a date formatter that transforms a date into its locale digit representation
+ */
+function dateGetter(name, size, offset = 0, trim = false, negWrap = false) {
+ return function (date, locale) {
+ let part = getDatePart(name, date);
+ if (offset > 0 || part > -offset) {
+ part += offset;
+ }
+ if (name === DateType.Hours) {
+ if (part === 0 && offset === -12) {
+ part = 12;
+ }
+ }
+ else if (name === DateType.FractionalSeconds) {
+ return formatFractionalSeconds(part, size);
+ }
+ const localeMinus = getLocaleNumberSymbol(locale, NumberSymbol.MinusSign);
+ return padNumber(part, size, localeMinus, trim, negWrap);
+ };
+}
+function getDatePart(part, date) {
+ switch (part) {
+ case DateType.FullYear:
+ return date.getFullYear();
+ case DateType.Month:
+ return date.getMonth();
+ case DateType.Date:
+ return date.getDate();
+ case DateType.Hours:
+ return date.getHours();
+ case DateType.Minutes:
+ return date.getMinutes();
+ case DateType.Seconds:
+ return date.getSeconds();
+ case DateType.FractionalSeconds:
+ return date.getMilliseconds();
+ case DateType.Day:
+ return date.getDay();
+ default:
+ throw new Error(`Unknown DateType value "${part}".`);
+ }
+}
+/**
+ * Returns a date formatter that transforms a date into its locale string representation
+ */
+function dateStrGetter(name, width, form = FormStyle.Format, extended = false) {
+ return function (date, locale) {
+ return getDateTranslation(date, locale, name, width, form, extended);
+ };
+}
+/**
+ * Returns the locale translation of a date for a given form, type and width
+ */
+function getDateTranslation(date, locale, name, width, form, extended) {
+ switch (name) {
+ case TranslationType.Months:
+ return getLocaleMonthNames(locale, form, width)[date.getMonth()];
+ case TranslationType.Days:
+ return getLocaleDayNames(locale, form, width)[date.getDay()];
+ case TranslationType.DayPeriods:
+ const currentHours = date.getHours();
+ const currentMinutes = date.getMinutes();
+ if (extended) {
+ const rules = getLocaleExtraDayPeriodRules(locale);
+ const dayPeriods = getLocaleExtraDayPeriods(locale, form, width);
+ const index = rules.findIndex(rule => {
+ if (Array.isArray(rule)) {
+ // morning, afternoon, evening, night
+ const [from, to] = rule;
+ const afterFrom = currentHours >= from.hours && currentMinutes >= from.minutes;
+ const beforeTo = (currentHours < to.hours ||
+ (currentHours === to.hours && currentMinutes < to.minutes));
+ // We must account for normal rules that span a period during the day (e.g. 6am-9am)
+ // where `from` is less (earlier) than `to`. But also rules that span midnight (e.g.
+ // 10pm - 5am) where `from` is greater (later!) than `to`.
+ //
+ // In the first case the current time must be BOTH after `from` AND before `to`
+ // (e.g. 8am is after 6am AND before 10am).
+ //
+ // In the second case the current time must be EITHER after `from` OR before `to`
+ // (e.g. 4am is before 5am but not after 10pm; and 11pm is not before 5am but it is
+ // after 10pm).
+ if (from.hours < to.hours) {
+ if (afterFrom && beforeTo) {
+ return true;
+ }
+ }
+ else if (afterFrom || beforeTo) {
+ return true;
+ }
+ }
+ else { // noon or midnight
+ if (rule.hours === currentHours && rule.minutes === currentMinutes) {
+ return true;
+ }
+ }
+ return false;
+ });
+ if (index !== -1) {
+ return dayPeriods[index];
+ }
+ }
+ // if no rules for the day periods, we use am/pm by default
+ return getLocaleDayPeriods(locale, form, width)[currentHours < 12 ? 0 : 1];
+ case TranslationType.Eras:
+ return getLocaleEraNames(locale, width)[date.getFullYear() <= 0 ? 0 : 1];
+ default:
+ // This default case is not needed by TypeScript compiler, as the switch is exhaustive.
+ // However Closure Compiler does not understand that and reports an error in typed mode.
+ // The `throw new Error` below works around the problem, and the unexpected: never variable
+ // makes sure tsc still checks this code is unreachable.
+ const unexpected = name;
+ throw new Error(`unexpected translation type ${unexpected}`);
+ }
+}
+/**
+ * Returns a date formatter that transforms a date and an offset into a timezone with ISO8601 or
+ * GMT format depending on the width (eg: short = +0430, short:GMT = GMT+4, long = GMT+04:30,
+ * extended = +04:30)
+ */
+function timeZoneGetter(width) {
+ return function (date, locale, offset) {
+ const zone = -1 * offset;
+ const minusSign = getLocaleNumberSymbol(locale, NumberSymbol.MinusSign);
+ const hours = zone > 0 ? Math.floor(zone / 60) : Math.ceil(zone / 60);
+ switch (width) {
+ case ZoneWidth.Short:
+ return ((zone >= 0) ? '+' : '') + padNumber(hours, 2, minusSign) +
+ padNumber(Math.abs(zone % 60), 2, minusSign);
+ case ZoneWidth.ShortGMT:
+ return 'GMT' + ((zone >= 0) ? '+' : '') + padNumber(hours, 1, minusSign);
+ case ZoneWidth.Long:
+ return 'GMT' + ((zone >= 0) ? '+' : '') + padNumber(hours, 2, minusSign) + ':' +
+ padNumber(Math.abs(zone % 60), 2, minusSign);
+ case ZoneWidth.Extended:
+ if (offset === 0) {
+ return 'Z';
+ }
+ else {
+ return ((zone >= 0) ? '+' : '') + padNumber(hours, 2, minusSign) + ':' +
+ padNumber(Math.abs(zone % 60), 2, minusSign);
+ }
+ default:
+ throw new Error(`Unknown zone width "${width}"`);
+ }
+ };
+}
+const JANUARY = 0;
+const THURSDAY = 4;
+function getFirstThursdayOfYear(year) {
+ const firstDayOfYear = createDate(year, JANUARY, 1).getDay();
+ return createDate(year, 0, 1 + ((firstDayOfYear <= THURSDAY) ? THURSDAY : THURSDAY + 7) - firstDayOfYear);
+}
+function getThursdayThisWeek(datetime) {
+ return createDate(datetime.getFullYear(), datetime.getMonth(), datetime.getDate() + (THURSDAY - datetime.getDay()));
+}
+function weekGetter(size, monthBased = false) {
+ return function (date, locale) {
+ let result;
+ if (monthBased) {
+ const nbDaysBefore1stDayOfMonth = new Date(date.getFullYear(), date.getMonth(), 1).getDay() - 1;
+ const today = date.getDate();
+ result = 1 + Math.floor((today + nbDaysBefore1stDayOfMonth) / 7);
+ }
+ else {
+ const thisThurs = getThursdayThisWeek(date);
+ // Some days of a year are part of next year according to ISO 8601.
+ // Compute the firstThurs from the year of this week's Thursday
+ const firstThurs = getFirstThursdayOfYear(thisThurs.getFullYear());
+ const diff = thisThurs.getTime() - firstThurs.getTime();
+ result = 1 + Math.round(diff / 6.048e8); // 6.048e8 ms per week
+ }
+ return padNumber(result, size, getLocaleNumberSymbol(locale, NumberSymbol.MinusSign));
+ };
+}
+/**
+ * Returns a date formatter that provides the week-numbering year for the input date.
+ */
+function weekNumberingYearGetter(size, trim = false) {
+ return function (date, locale) {
+ const thisThurs = getThursdayThisWeek(date);
+ const weekNumberingYear = thisThurs.getFullYear();
+ return padNumber(weekNumberingYear, size, getLocaleNumberSymbol(locale, NumberSymbol.MinusSign), trim);
+ };
+}
+const DATE_FORMATS = {};
+// Based on CLDR formats:
+// See complete list: http://www.unicode.org/reports/tr35/tr35-dates.html#Date_Field_Symbol_Table
+// See also explanations: http://cldr.unicode.org/translation/date-time
+// TODO(ocombe): support all missing cldr formats: Y, U, Q, D, F, e, c, j, J, C, A, v, V, X, x
+function getDateFormatter(format) {
+ if (DATE_FORMATS[format]) {
+ return DATE_FORMATS[format];
+ }
+ let formatter;
+ switch (format) {
+ // Era name (AD/BC)
+ case 'G':
+ case 'GG':
+ case 'GGG':
+ formatter = dateStrGetter(TranslationType.Eras, TranslationWidth.Abbreviated);
+ break;
+ case 'GGGG':
+ formatter = dateStrGetter(TranslationType.Eras, TranslationWidth.Wide);
+ break;
+ case 'GGGGG':
+ formatter = dateStrGetter(TranslationType.Eras, TranslationWidth.Narrow);
+ break;
+ // 1 digit representation of the year, e.g. (AD 1 => 1, AD 199 => 199)
+ case 'y':
+ formatter = dateGetter(DateType.FullYear, 1, 0, false, true);
+ break;
+ // 2 digit representation of the year, padded (00-99). (e.g. AD 2001 => 01, AD 2010 => 10)
+ case 'yy':
+ formatter = dateGetter(DateType.FullYear, 2, 0, true, true);
+ break;
+ // 3 digit representation of the year, padded (000-999). (e.g. AD 2001 => 01, AD 2010 => 10)
+ case 'yyy':
+ formatter = dateGetter(DateType.FullYear, 3, 0, false, true);
+ break;
+ // 4 digit representation of the year (e.g. AD 1 => 0001, AD 2010 => 2010)
+ case 'yyyy':
+ formatter = dateGetter(DateType.FullYear, 4, 0, false, true);
+ break;
+ // 1 digit representation of the week-numbering year, e.g. (AD 1 => 1, AD 199 => 199)
+ case 'Y':
+ formatter = weekNumberingYearGetter(1);
+ break;
+ // 2 digit representation of the week-numbering year, padded (00-99). (e.g. AD 2001 => 01, AD
+ // 2010 => 10)
+ case 'YY':
+ formatter = weekNumberingYearGetter(2, true);
+ break;
+ // 3 digit representation of the week-numbering year, padded (000-999). (e.g. AD 1 => 001, AD
+ // 2010 => 2010)
+ case 'YYY':
+ formatter = weekNumberingYearGetter(3);
+ break;
+ // 4 digit representation of the week-numbering year (e.g. AD 1 => 0001, AD 2010 => 2010)
+ case 'YYYY':
+ formatter = weekNumberingYearGetter(4);
+ break;
+ // Month of the year (1-12), numeric
+ case 'M':
+ case 'L':
+ formatter = dateGetter(DateType.Month, 1, 1);
+ break;
+ case 'MM':
+ case 'LL':
+ formatter = dateGetter(DateType.Month, 2, 1);
+ break;
+ // Month of the year (January, ...), string, format
+ case 'MMM':
+ formatter = dateStrGetter(TranslationType.Months, TranslationWidth.Abbreviated);
+ break;
+ case 'MMMM':
+ formatter = dateStrGetter(TranslationType.Months, TranslationWidth.Wide);
+ break;
+ case 'MMMMM':
+ formatter = dateStrGetter(TranslationType.Months, TranslationWidth.Narrow);
+ break;
+ // Month of the year (January, ...), string, standalone
+ case 'LLL':
+ formatter =
+ dateStrGetter(TranslationType.Months, TranslationWidth.Abbreviated, FormStyle.Standalone);
+ break;
+ case 'LLLL':
+ formatter =
+ dateStrGetter(TranslationType.Months, TranslationWidth.Wide, FormStyle.Standalone);
+ break;
+ case 'LLLLL':
+ formatter =
+ dateStrGetter(TranslationType.Months, TranslationWidth.Narrow, FormStyle.Standalone);
+ break;
+ // Week of the year (1, ... 52)
+ case 'w':
+ formatter = weekGetter(1);
+ break;
+ case 'ww':
+ formatter = weekGetter(2);
+ break;
+ // Week of the month (1, ...)
+ case 'W':
+ formatter = weekGetter(1, true);
+ break;
+ // Day of the month (1-31)
+ case 'd':
+ formatter = dateGetter(DateType.Date, 1);
+ break;
+ case 'dd':
+ formatter = dateGetter(DateType.Date, 2);
+ break;
+ // Day of the Week
+ case 'E':
+ case 'EE':
+ case 'EEE':
+ formatter = dateStrGetter(TranslationType.Days, TranslationWidth.Abbreviated);
+ break;
+ case 'EEEE':
+ formatter = dateStrGetter(TranslationType.Days, TranslationWidth.Wide);
+ break;
+ case 'EEEEE':
+ formatter = dateStrGetter(TranslationType.Days, TranslationWidth.Narrow);
+ break;
+ case 'EEEEEE':
+ formatter = dateStrGetter(TranslationType.Days, TranslationWidth.Short);
+ break;
+ // Generic period of the day (am-pm)
+ case 'a':
+ case 'aa':
+ case 'aaa':
+ formatter = dateStrGetter(TranslationType.DayPeriods, TranslationWidth.Abbreviated);
+ break;
+ case 'aaaa':
+ formatter = dateStrGetter(TranslationType.DayPeriods, TranslationWidth.Wide);
+ break;
+ case 'aaaaa':
+ formatter = dateStrGetter(TranslationType.DayPeriods, TranslationWidth.Narrow);
+ break;
+ // Extended period of the day (midnight, at night, ...), standalone
+ case 'b':
+ case 'bb':
+ case 'bbb':
+ formatter = dateStrGetter(TranslationType.DayPeriods, TranslationWidth.Abbreviated, FormStyle.Standalone, true);
+ break;
+ case 'bbbb':
+ formatter = dateStrGetter(TranslationType.DayPeriods, TranslationWidth.Wide, FormStyle.Standalone, true);
+ break;
+ case 'bbbbb':
+ formatter = dateStrGetter(TranslationType.DayPeriods, TranslationWidth.Narrow, FormStyle.Standalone, true);
+ break;
+ // Extended period of the day (midnight, night, ...), standalone
+ case 'B':
+ case 'BB':
+ case 'BBB':
+ formatter = dateStrGetter(TranslationType.DayPeriods, TranslationWidth.Abbreviated, FormStyle.Format, true);
+ break;
+ case 'BBBB':
+ formatter =
+ dateStrGetter(TranslationType.DayPeriods, TranslationWidth.Wide, FormStyle.Format, true);
+ break;
+ case 'BBBBB':
+ formatter = dateStrGetter(TranslationType.DayPeriods, TranslationWidth.Narrow, FormStyle.Format, true);
+ break;
+ // Hour in AM/PM, (1-12)
+ case 'h':
+ formatter = dateGetter(DateType.Hours, 1, -12);
+ break;
+ case 'hh':
+ formatter = dateGetter(DateType.Hours, 2, -12);
+ break;
+ // Hour of the day (0-23)
+ case 'H':
+ formatter = dateGetter(DateType.Hours, 1);
+ break;
+ // Hour in day, padded (00-23)
+ case 'HH':
+ formatter = dateGetter(DateType.Hours, 2);
+ break;
+ // Minute of the hour (0-59)
+ case 'm':
+ formatter = dateGetter(DateType.Minutes, 1);
+ break;
+ case 'mm':
+ formatter = dateGetter(DateType.Minutes, 2);
+ break;
+ // Second of the minute (0-59)
+ case 's':
+ formatter = dateGetter(DateType.Seconds, 1);
+ break;
+ case 'ss':
+ formatter = dateGetter(DateType.Seconds, 2);
+ break;
+ // Fractional second
+ case 'S':
+ formatter = dateGetter(DateType.FractionalSeconds, 1);
+ break;
+ case 'SS':
+ formatter = dateGetter(DateType.FractionalSeconds, 2);
+ break;
+ case 'SSS':
+ formatter = dateGetter(DateType.FractionalSeconds, 3);
+ break;
+ // Timezone ISO8601 short format (-0430)
+ case 'Z':
+ case 'ZZ':
+ case 'ZZZ':
+ formatter = timeZoneGetter(ZoneWidth.Short);
+ break;
+ // Timezone ISO8601 extended format (-04:30)
+ case 'ZZZZZ':
+ formatter = timeZoneGetter(ZoneWidth.Extended);
+ break;
+ // Timezone GMT short format (GMT+4)
+ case 'O':
+ case 'OO':
+ case 'OOO':
+ // Should be location, but fallback to format O instead because we don't have the data yet
+ case 'z':
+ case 'zz':
+ case 'zzz':
+ formatter = timeZoneGetter(ZoneWidth.ShortGMT);
+ break;
+ // Timezone GMT long format (GMT+0430)
+ case 'OOOO':
+ case 'ZZZZ':
+ // Should be location, but fallback to format O instead because we don't have the data yet
+ case 'zzzz':
+ formatter = timeZoneGetter(ZoneWidth.Long);
+ break;
+ default:
+ return null;
+ }
+ DATE_FORMATS[format] = formatter;
+ return formatter;
+}
+function timezoneToOffset(timezone, fallback) {
+ // Support: IE 11 only, Edge 13-15+
+ // IE/Edge do not "understand" colon (`:`) in timezone
+ timezone = timezone.replace(/:/g, '');
+ const requestedTimezoneOffset = Date.parse('Jan 01, 1970 00:00:00 ' + timezone) / 60000;
+ return isNaN(requestedTimezoneOffset) ? fallback : requestedTimezoneOffset;
+}
+function addDateMinutes(date, minutes) {
+ date = new Date(date.getTime());
+ date.setMinutes(date.getMinutes() + minutes);
+ return date;
+}
+function convertTimezoneToLocal(date, timezone, reverse) {
+ const reverseValue = reverse ? -1 : 1;
+ const dateTimezoneOffset = date.getTimezoneOffset();
+ const timezoneOffset = timezoneToOffset(timezone, dateTimezoneOffset);
+ return addDateMinutes(date, reverseValue * (timezoneOffset - dateTimezoneOffset));
+}
+/**
+ * Converts a value to date.
+ *
+ * Supported input formats:
+ * - `Date`
+ * - number: timestamp
+ * - string: numeric (e.g. "1234"), ISO and date strings in a format supported by
+ * [Date.parse()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/parse).
+ * Note: ISO strings without time return a date without timeoffset.
+ *
+ * Throws if unable to convert to a date.
+ */
+function toDate(value) {
+ if (isDate(value)) {
+ return value;
+ }
+ if (typeof value === 'number' && !isNaN(value)) {
+ return new Date(value);
+ }
+ if (typeof value === 'string') {
+ value = value.trim();
+ if (/^(\d{4}(-\d{1,2}(-\d{1,2})?)?)$/.test(value)) {
+ /* For ISO Strings without time the day, month and year must be extracted from the ISO String
+ before Date creation to avoid time offset and errors in the new Date.
+ If we only replace '-' with ',' in the ISO String ("2015,01,01"), and try to create a new
+ date, some browsers (e.g. IE 9) will throw an invalid Date error.
+ If we leave the '-' ("2015-01-01") and try to create a new Date("2015-01-01") the timeoffset
+ is applied.
+ Note: ISO months are 0 for January, 1 for February, ... */
+ const [y, m = 1, d = 1] = value.split('-').map((val) => +val);
+ return createDate(y, m - 1, d);
+ }
+ const parsedNb = parseFloat(value);
+ // any string that only contains numbers, like "1234" but not like "1234hello"
+ if (!isNaN(value - parsedNb)) {
+ return new Date(parsedNb);
+ }
+ let match;
+ if (match = value.match(ISO8601_DATE_REGEX)) {
+ return isoStringToDate(match);
+ }
+ }
+ const date = new Date(value);
+ if (!isDate(date)) {
+ throw new Error(`Unable to convert "${value}" into a date`);
+ }
+ return date;
+}
+/**
+ * Converts a date in ISO8601 to a Date.
+ * Used instead of `Date.parse` because of browser discrepancies.
+ */
+function isoStringToDate(match) {
+ const date = new Date(0);
+ let tzHour = 0;
+ let tzMin = 0;
+ // match[8] means that the string contains "Z" (UTC) or a timezone like "+01:00" or "+0100"
+ const dateSetter = match[8] ? date.setUTCFullYear : date.setFullYear;
+ const timeSetter = match[8] ? date.setUTCHours : date.setHours;
+ // if there is a timezone defined like "+01:00" or "+0100"
+ if (match[9]) {
+ tzHour = Number(match[9] + match[10]);
+ tzMin = Number(match[9] + match[11]);
+ }
+ dateSetter.call(date, Number(match[1]), Number(match[2]) - 1, Number(match[3]));
+ const h = Number(match[4] || 0) - tzHour;
+ const m = Number(match[5] || 0) - tzMin;
+ const s = Number(match[6] || 0);
+ // The ECMAScript specification (https://www.ecma-international.org/ecma-262/5.1/#sec-15.9.1.11)
+ // defines that `DateTime` milliseconds should always be rounded down, so that `999.9ms`
+ // becomes `999ms`.
+ const ms = Math.floor(parseFloat('0.' + (match[7] || 0)) * 1000);
+ timeSetter.call(date, h, m, s, ms);
+ return date;
+}
+function isDate(value) {
+ return value instanceof Date && !isNaN(value.valueOf());
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+const NUMBER_FORMAT_REGEXP = /^(\d+)?\.((\d+)(-(\d+))?)?$/;
+const MAX_DIGITS = 22;
+const DECIMAL_SEP = '.';
+const ZERO_CHAR = '0';
+const PATTERN_SEP = ';';
+const GROUP_SEP = ',';
+const DIGIT_CHAR = '#';
+const CURRENCY_CHAR = '¤';
+const PERCENT_CHAR = '%';
+/**
+ * Transforms a number to a locale string based on a style and a format.
+ */
+function formatNumberToLocaleString(value, pattern, locale, groupSymbol, decimalSymbol, digitsInfo, isPercent = false) {
+ let formattedText = '';
+ let isZero = false;
+ if (!isFinite(value)) {
+ formattedText = getLocaleNumberSymbol(locale, NumberSymbol.Infinity);
+ }
+ else {
+ let parsedNumber = parseNumber(value);
+ if (isPercent) {
+ parsedNumber = toPercent(parsedNumber);
+ }
+ let minInt = pattern.minInt;
+ let minFraction = pattern.minFrac;
+ let maxFraction = pattern.maxFrac;
+ if (digitsInfo) {
+ const parts = digitsInfo.match(NUMBER_FORMAT_REGEXP);
+ if (parts === null) {
+ throw new Error(`${digitsInfo} is not a valid digit info`);
+ }
+ const minIntPart = parts[1];
+ const minFractionPart = parts[3];
+ const maxFractionPart = parts[5];
+ if (minIntPart != null) {
+ minInt = parseIntAutoRadix(minIntPart);
+ }
+ if (minFractionPart != null) {
+ minFraction = parseIntAutoRadix(minFractionPart);
+ }
+ if (maxFractionPart != null) {
+ maxFraction = parseIntAutoRadix(maxFractionPart);
+ }
+ else if (minFractionPart != null && minFraction > maxFraction) {
+ maxFraction = minFraction;
+ }
+ }
+ roundNumber(parsedNumber, minFraction, maxFraction);
+ let digits = parsedNumber.digits;
+ let integerLen = parsedNumber.integerLen;
+ const exponent = parsedNumber.exponent;
+ let decimals = [];
+ isZero = digits.every(d => !d);
+ // pad zeros for small numbers
+ for (; integerLen < minInt; integerLen++) {
+ digits.unshift(0);
+ }
+ // pad zeros for small numbers
+ for (; integerLen < 0; integerLen++) {
+ digits.unshift(0);
+ }
+ // extract decimals digits
+ if (integerLen > 0) {
+ decimals = digits.splice(integerLen, digits.length);
+ }
+ else {
+ decimals = digits;
+ digits = [0];
+ }
+ // format the integer digits with grouping separators
+ const groups = [];
+ if (digits.length >= pattern.lgSize) {
+ groups.unshift(digits.splice(-pattern.lgSize, digits.length).join(''));
+ }
+ while (digits.length > pattern.gSize) {
+ groups.unshift(digits.splice(-pattern.gSize, digits.length).join(''));
+ }
+ if (digits.length) {
+ groups.unshift(digits.join(''));
+ }
+ formattedText = groups.join(getLocaleNumberSymbol(locale, groupSymbol));
+ // append the decimal digits
+ if (decimals.length) {
+ formattedText += getLocaleNumberSymbol(locale, decimalSymbol) + decimals.join('');
+ }
+ if (exponent) {
+ formattedText += getLocaleNumberSymbol(locale, NumberSymbol.Exponential) + '+' + exponent;
+ }
+ }
+ if (value < 0 && !isZero) {
+ formattedText = pattern.negPre + formattedText + pattern.negSuf;
+ }
+ else {
+ formattedText = pattern.posPre + formattedText + pattern.posSuf;
+ }
+ return formattedText;
+}
+/**
+ * @ngModule CommonModule
+ * @description
+ *
+ * Formats a number as currency using locale rules.
+ *
+ * @param value The number to format.
+ * @param locale A locale code for the locale format rules to use.
+ * @param currency A string containing the currency symbol or its name,
+ * such as "$" or "Canadian Dollar". Used in output string, but does not affect the operation
+ * of the function.
+ * @param currencyCode The [ISO 4217](https://en.wikipedia.org/wiki/ISO_4217)
+ * currency code, such as `USD` for the US dollar and `EUR` for the euro.
+ * Used to determine the number of digits in the decimal part.
+ * @param digitsInfo Decimal representation options, specified by a string in the following format:
+ * `{minIntegerDigits}.{minFractionDigits}-{maxFractionDigits}`. See `DecimalPipe` for more details.
+ *
+ * @returns The formatted currency value.
+ *
+ * @see `formatNumber()`
+ * @see `DecimalPipe`
+ * @see [Internationalization (i18n) Guide](https://angular.io/guide/i18n)
+ *
+ * @publicApi
+ */
+function formatCurrency(value, locale, currency, currencyCode, digitsInfo) {
+ const format = getLocaleNumberFormat(locale, NumberFormatStyle.Currency);
+ const pattern = parseNumberFormat(format, getLocaleNumberSymbol(locale, NumberSymbol.MinusSign));
+ pattern.minFrac = getNumberOfCurrencyDigits(currencyCode);
+ pattern.maxFrac = pattern.minFrac;
+ const res = formatNumberToLocaleString(value, pattern, locale, NumberSymbol.CurrencyGroup, NumberSymbol.CurrencyDecimal, digitsInfo);
+ return res
+ .replace(CURRENCY_CHAR, currency)
+ // if we have 2 time the currency character, the second one is ignored
+ .replace(CURRENCY_CHAR, '')
+ // If there is a spacing between currency character and the value and
+ // the currency character is supressed by passing an empty string, the
+ // spacing character would remain as part of the string. Then we
+ // should remove it.
+ .trim();
+}
+/**
+ * @ngModule CommonModule
+ * @description
+ *
+ * Formats a number as a percentage according to locale rules.
+ *
+ * @param value The number to format.
+ * @param locale A locale code for the locale format rules to use.
+ * @param digitsInfo Decimal representation options, specified by a string in the following format:
+ * `{minIntegerDigits}.{minFractionDigits}-{maxFractionDigits}`. See `DecimalPipe` for more details.
+ *
+ * @returns The formatted percentage value.
+ *
+ * @see `formatNumber()`
+ * @see `DecimalPipe`
+ * @see [Internationalization (i18n) Guide](https://angular.io/guide/i18n)
+ * @publicApi
+ *
+ */
+function formatPercent(value, locale, digitsInfo) {
+ const format = getLocaleNumberFormat(locale, NumberFormatStyle.Percent);
+ const pattern = parseNumberFormat(format, getLocaleNumberSymbol(locale, NumberSymbol.MinusSign));
+ const res = formatNumberToLocaleString(value, pattern, locale, NumberSymbol.Group, NumberSymbol.Decimal, digitsInfo, true);
+ return res.replace(new RegExp(PERCENT_CHAR, 'g'), getLocaleNumberSymbol(locale, NumberSymbol.PercentSign));
+}
+/**
+ * @ngModule CommonModule
+ * @description
+ *
+ * Formats a number as text, with group sizing, separator, and other
+ * parameters based on the locale.
+ *
+ * @param value The number to format.
+ * @param locale A locale code for the locale format rules to use.
+ * @param digitsInfo Decimal representation options, specified by a string in the following format:
+ * `{minIntegerDigits}.{minFractionDigits}-{maxFractionDigits}`. See `DecimalPipe` for more details.
+ *
+ * @returns The formatted text string.
+ * @see [Internationalization (i18n) Guide](https://angular.io/guide/i18n)
+ *
+ * @publicApi
+ */
+function formatNumber(value, locale, digitsInfo) {
+ const format = getLocaleNumberFormat(locale, NumberFormatStyle.Decimal);
+ const pattern = parseNumberFormat(format, getLocaleNumberSymbol(locale, NumberSymbol.MinusSign));
+ return formatNumberToLocaleString(value, pattern, locale, NumberSymbol.Group, NumberSymbol.Decimal, digitsInfo);
+}
+function parseNumberFormat(format, minusSign = '-') {
+ const p = {
+ minInt: 1,
+ minFrac: 0,
+ maxFrac: 0,
+ posPre: '',
+ posSuf: '',
+ negPre: '',
+ negSuf: '',
+ gSize: 0,
+ lgSize: 0
+ };
+ const patternParts = format.split(PATTERN_SEP);
+ const positive = patternParts[0];
+ const negative = patternParts[1];
+ const positiveParts = positive.indexOf(DECIMAL_SEP) !== -1 ?
+ positive.split(DECIMAL_SEP) :
+ [
+ positive.substring(0, positive.lastIndexOf(ZERO_CHAR) + 1),
+ positive.substring(positive.lastIndexOf(ZERO_CHAR) + 1)
+ ], integer = positiveParts[0], fraction = positiveParts[1] || '';
+ p.posPre = integer.substr(0, integer.indexOf(DIGIT_CHAR));
+ for (let i = 0; i < fraction.length; i++) {
+ const ch = fraction.charAt(i);
+ if (ch === ZERO_CHAR) {
+ p.minFrac = p.maxFrac = i + 1;
+ }
+ else if (ch === DIGIT_CHAR) {
+ p.maxFrac = i + 1;
+ }
+ else {
+ p.posSuf += ch;
+ }
+ }
+ const groups = integer.split(GROUP_SEP);
+ p.gSize = groups[1] ? groups[1].length : 0;
+ p.lgSize = (groups[2] || groups[1]) ? (groups[2] || groups[1]).length : 0;
+ if (negative) {
+ const trunkLen = positive.length - p.posPre.length - p.posSuf.length, pos = negative.indexOf(DIGIT_CHAR);
+ p.negPre = negative.substr(0, pos).replace(/'/g, '');
+ p.negSuf = negative.substr(pos + trunkLen).replace(/'/g, '');
+ }
+ else {
+ p.negPre = minusSign + p.posPre;
+ p.negSuf = p.posSuf;
+ }
+ return p;
+}
+// Transforms a parsed number into a percentage by multiplying it by 100
+function toPercent(parsedNumber) {
+ // if the number is 0, don't do anything
+ if (parsedNumber.digits[0] === 0) {
+ return parsedNumber;
+ }
+ // Getting the current number of decimals
+ const fractionLen = parsedNumber.digits.length - parsedNumber.integerLen;
+ if (parsedNumber.exponent) {
+ parsedNumber.exponent += 2;
+ }
+ else {
+ if (fractionLen === 0) {
+ parsedNumber.digits.push(0, 0);
+ }
+ else if (fractionLen === 1) {
+ parsedNumber.digits.push(0);
+ }
+ parsedNumber.integerLen += 2;
+ }
+ return parsedNumber;
+}
+/**
+ * Parses a number.
+ * Significant bits of this parse algorithm came from https://github.com/MikeMcl/big.js/
+ */
+function parseNumber(num) {
+ let numStr = Math.abs(num) + '';
+ let exponent = 0, digits, integerLen;
+ let i, j, zeros;
+ // Decimal point?
+ if ((integerLen = numStr.indexOf(DECIMAL_SEP)) > -1) {
+ numStr = numStr.replace(DECIMAL_SEP, '');
+ }
+ // Exponential form?
+ if ((i = numStr.search(/e/i)) > 0) {
+ // Work out the exponent.
+ if (integerLen < 0)
+ integerLen = i;
+ integerLen += +numStr.slice(i + 1);
+ numStr = numStr.substring(0, i);
+ }
+ else if (integerLen < 0) {
+ // There was no decimal point or exponent so it is an integer.
+ integerLen = numStr.length;
+ }
+ // Count the number of leading zeros.
+ for (i = 0; numStr.charAt(i) === ZERO_CHAR; i++) { /* empty */
+ }
+ if (i === (zeros = numStr.length)) {
+ // The digits are all zero.
+ digits = [0];
+ integerLen = 1;
+ }
+ else {
+ // Count the number of trailing zeros
+ zeros--;
+ while (numStr.charAt(zeros) === ZERO_CHAR)
+ zeros--;
+ // Trailing zeros are insignificant so ignore them
+ integerLen -= i;
+ digits = [];
+ // Convert string to array of digits without leading/trailing zeros.
+ for (j = 0; i <= zeros; i++, j++) {
+ digits[j] = Number(numStr.charAt(i));
+ }
+ }
+ // If the number overflows the maximum allowed digits then use an exponent.
+ if (integerLen > MAX_DIGITS) {
+ digits = digits.splice(0, MAX_DIGITS - 1);
+ exponent = integerLen - 1;
+ integerLen = 1;
+ }
+ return { digits, exponent, integerLen };
+}
+/**
+ * Round the parsed number to the specified number of decimal places
+ * This function changes the parsedNumber in-place
+ */
+function roundNumber(parsedNumber, minFrac, maxFrac) {
+ if (minFrac > maxFrac) {
+ throw new Error(`The minimum number of digits after fraction (${minFrac}) is higher than the maximum (${maxFrac}).`);
+ }
+ let digits = parsedNumber.digits;
+ let fractionLen = digits.length - parsedNumber.integerLen;
+ const fractionSize = Math.min(Math.max(minFrac, fractionLen), maxFrac);
+ // The index of the digit to where rounding is to occur
+ let roundAt = fractionSize + parsedNumber.integerLen;
+ let digit = digits[roundAt];
+ if (roundAt > 0) {
+ // Drop fractional digits beyond `roundAt`
+ digits.splice(Math.max(parsedNumber.integerLen, roundAt));
+ // Set non-fractional digits beyond `roundAt` to 0
+ for (let j = roundAt; j < digits.length; j++) {
+ digits[j] = 0;
+ }
+ }
+ else {
+ // We rounded to zero so reset the parsedNumber
+ fractionLen = Math.max(0, fractionLen);
+ parsedNumber.integerLen = 1;
+ digits.length = Math.max(1, roundAt = fractionSize + 1);
+ digits[0] = 0;
+ for (let i = 1; i < roundAt; i++)
+ digits[i] = 0;
+ }
+ if (digit >= 5) {
+ if (roundAt - 1 < 0) {
+ for (let k = 0; k > roundAt; k--) {
+ digits.unshift(0);
+ parsedNumber.integerLen++;
+ }
+ digits.unshift(1);
+ parsedNumber.integerLen++;
+ }
+ else {
+ digits[roundAt - 1]++;
+ }
+ }
+ // Pad out with zeros to get the required fraction length
+ for (; fractionLen < Math.max(0, fractionSize); fractionLen++)
+ digits.push(0);
+ let dropTrailingZeros = fractionSize !== 0;
+ // Minimal length = nb of decimals required + current nb of integers
+ // Any number besides that is optional and can be removed if it's a trailing 0
+ const minLen = minFrac + parsedNumber.integerLen;
+ // Do any carrying, e.g. a digit was rounded up to 10
+ const carry = digits.reduceRight(function (carry, d, i, digits) {
+ d = d + carry;
+ digits[i] = d < 10 ? d : d - 10; // d % 10
+ if (dropTrailingZeros) {
+ // Do not keep meaningless fractional trailing zeros (e.g. 15.52000 --> 15.52)
+ if (digits[i] === 0 && i >= minLen) {
+ digits.pop();
+ }
+ else {
+ dropTrailingZeros = false;
+ }
+ }
+ return d >= 10 ? 1 : 0; // Math.floor(d / 10);
+ }, 0);
+ if (carry) {
+ digits.unshift(carry);
+ parsedNumber.integerLen++;
+ }
+}
+function parseIntAutoRadix(text) {
+ const result = parseInt(text);
+ if (isNaN(result)) {
+ throw new Error('Invalid integer literal when parsing ' + text);
+ }
+ return result;
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * @publicApi
+ */
+class NgLocalization {
+}
+/**
+ * Returns the plural category for a given value.
+ * - "=value" when the case exists,
+ * - the plural category otherwise
+ */
+function getPluralCategory(value, cases, ngLocalization, locale) {
+ let key = `=${value}`;
+ if (cases.indexOf(key) > -1) {
+ return key;
+ }
+ key = ngLocalization.getPluralCategory(value, locale);
+ if (cases.indexOf(key) > -1) {
+ return key;
+ }
+ if (cases.indexOf('other') > -1) {
+ return 'other';
+ }
+ throw new Error(`No plural message found for value "${value}"`);
+}
+/**
+ * Returns the plural case based on the locale
+ *
+ * @publicApi
+ */
+class NgLocaleLocalization extends NgLocalization {
+ constructor(locale) {
+ super();
+ this.locale = locale;
+ }
+ getPluralCategory(value, locale) {
+ const plural = getLocalePluralCase(locale || this.locale)(value);
+ switch (plural) {
+ case Plural.Zero:
+ return 'zero';
+ case Plural.One:
+ return 'one';
+ case Plural.Two:
+ return 'two';
+ case Plural.Few:
+ return 'few';
+ case Plural.Many:
+ return 'many';
+ default:
+ return 'other';
+ }
+ }
+}
+NgLocaleLocalization.ɵfac = function NgLocaleLocalization_Factory(t) { return new (t || NgLocaleLocalization)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵinject"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["LOCALE_ID"])); };
+NgLocaleLocalization.ɵprov = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineInjectable"]({ token: NgLocaleLocalization, factory: NgLocaleLocalization.ɵfac });
+NgLocaleLocalization.ctorParameters = () => [
+ { type: String, decorators: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Inject"], args: [_angular_core__WEBPACK_IMPORTED_MODULE_0__["LOCALE_ID"],] }] }
+];
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](NgLocaleLocalization, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Injectable"]
+ }], function () { return [{ type: String, decorators: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Inject"],
+ args: [_angular_core__WEBPACK_IMPORTED_MODULE_0__["LOCALE_ID"]]
+ }] }]; }, null); })();
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * Register global data to be used internally by Angular. See the
+ * ["I18n guide"](guide/i18n#i18n-pipes) to know how to import additional locale data.
+ *
+ * The signature registerLocaleData(data: any, extraData?: any) is deprecated since v5.1
+ *
+ * @publicApi
+ */
+function registerLocaleData(data, localeId, extraData) {
+ return Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵregisterLocaleData"])(data, localeId, extraData);
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+function parseCookieValue(cookieStr, name) {
+ name = encodeURIComponent(name);
+ for (const cookie of cookieStr.split(';')) {
+ const eqIndex = cookie.indexOf('=');
+ const [cookieName, cookieValue] = eqIndex == -1 ? [cookie, ''] : [cookie.slice(0, eqIndex), cookie.slice(eqIndex + 1)];
+ if (cookieName.trim() === name) {
+ return decodeURIComponent(cookieValue);
+ }
+ }
+ return null;
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * @ngModule CommonModule
+ *
+ * @usageNotes
+ * ```
+ * ...
+ *
+ * ...
+ *
+ * ...
+ *
+ * ...
+ *
+ * ...
+ * ```
+ *
+ * @description
+ *
+ * Adds and removes CSS classes on an HTML element.
+ *
+ * The CSS classes are updated as follows, depending on the type of the expression evaluation:
+ * - `string` - the CSS classes listed in the string (space delimited) are added,
+ * - `Array` - the CSS classes declared as Array elements are added,
+ * - `Object` - keys are CSS classes that get added when the expression given in the value
+ * evaluates to a truthy value, otherwise they are removed.
+ *
+ * @publicApi
+ */
+class NgClass {
+ constructor(_iterableDiffers, _keyValueDiffers, _ngEl, _renderer) {
+ this._iterableDiffers = _iterableDiffers;
+ this._keyValueDiffers = _keyValueDiffers;
+ this._ngEl = _ngEl;
+ this._renderer = _renderer;
+ this._iterableDiffer = null;
+ this._keyValueDiffer = null;
+ this._initialClasses = [];
+ this._rawClass = null;
+ }
+ set klass(value) {
+ this._removeClasses(this._initialClasses);
+ this._initialClasses = typeof value === 'string' ? value.split(/\s+/) : [];
+ this._applyClasses(this._initialClasses);
+ this._applyClasses(this._rawClass);
+ }
+ set ngClass(value) {
+ this._removeClasses(this._rawClass);
+ this._applyClasses(this._initialClasses);
+ this._iterableDiffer = null;
+ this._keyValueDiffer = null;
+ this._rawClass = typeof value === 'string' ? value.split(/\s+/) : value;
+ if (this._rawClass) {
+ if (Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵisListLikeIterable"])(this._rawClass)) {
+ this._iterableDiffer = this._iterableDiffers.find(this._rawClass).create();
+ }
+ else {
+ this._keyValueDiffer = this._keyValueDiffers.find(this._rawClass).create();
+ }
+ }
+ }
+ ngDoCheck() {
+ if (this._iterableDiffer) {
+ const iterableChanges = this._iterableDiffer.diff(this._rawClass);
+ if (iterableChanges) {
+ this._applyIterableChanges(iterableChanges);
+ }
+ }
+ else if (this._keyValueDiffer) {
+ const keyValueChanges = this._keyValueDiffer.diff(this._rawClass);
+ if (keyValueChanges) {
+ this._applyKeyValueChanges(keyValueChanges);
+ }
+ }
+ }
+ _applyKeyValueChanges(changes) {
+ changes.forEachAddedItem((record) => this._toggleClass(record.key, record.currentValue));
+ changes.forEachChangedItem((record) => this._toggleClass(record.key, record.currentValue));
+ changes.forEachRemovedItem((record) => {
+ if (record.previousValue) {
+ this._toggleClass(record.key, false);
+ }
+ });
+ }
+ _applyIterableChanges(changes) {
+ changes.forEachAddedItem((record) => {
+ if (typeof record.item === 'string') {
+ this._toggleClass(record.item, true);
+ }
+ else {
+ throw new Error(`NgClass can only toggle CSS classes expressed as strings, got ${Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵstringify"])(record.item)}`);
+ }
+ });
+ changes.forEachRemovedItem((record) => this._toggleClass(record.item, false));
+ }
+ /**
+ * Applies a collection of CSS classes to the DOM element.
+ *
+ * For argument of type Set and Array CSS class names contained in those collections are always
+ * added.
+ * For argument of type Map CSS class name in the map's key is toggled based on the value (added
+ * for truthy and removed for falsy).
+ */
+ _applyClasses(rawClassVal) {
+ if (rawClassVal) {
+ if (Array.isArray(rawClassVal) || rawClassVal instanceof Set) {
+ rawClassVal.forEach((klass) => this._toggleClass(klass, true));
+ }
+ else {
+ Object.keys(rawClassVal).forEach(klass => this._toggleClass(klass, !!rawClassVal[klass]));
+ }
+ }
+ }
+ /**
+ * Removes a collection of CSS classes from the DOM element. This is mostly useful for cleanup
+ * purposes.
+ */
+ _removeClasses(rawClassVal) {
+ if (rawClassVal) {
+ if (Array.isArray(rawClassVal) || rawClassVal instanceof Set) {
+ rawClassVal.forEach((klass) => this._toggleClass(klass, false));
+ }
+ else {
+ Object.keys(rawClassVal).forEach(klass => this._toggleClass(klass, false));
+ }
+ }
+ }
+ _toggleClass(klass, enabled) {
+ klass = klass.trim();
+ if (klass) {
+ klass.split(/\s+/g).forEach(klass => {
+ if (enabled) {
+ this._renderer.addClass(this._ngEl.nativeElement, klass);
+ }
+ else {
+ this._renderer.removeClass(this._ngEl.nativeElement, klass);
+ }
+ });
+ }
+ }
+}
+NgClass.ɵfac = function NgClass_Factory(t) { return new (t || NgClass)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["IterableDiffers"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["KeyValueDiffers"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ElementRef"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["Renderer2"])); };
+NgClass.ɵdir = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineDirective"]({ type: NgClass, selectors: [["", "ngClass", ""]], inputs: { klass: ["class", "klass"], ngClass: "ngClass" } });
+NgClass.ctorParameters = () => [
+ { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["IterableDiffers"] },
+ { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["KeyValueDiffers"] },
+ { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["ElementRef"] },
+ { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Renderer2"] }
+];
+NgClass.propDecorators = {
+ klass: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"], args: ['class',] }],
+ ngClass: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"], args: ['ngClass',] }]
+};
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](NgClass, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Directive"],
+ args: [{ selector: '[ngClass]' }]
+ }], function () { return [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["IterableDiffers"] }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["KeyValueDiffers"] }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["ElementRef"] }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Renderer2"] }]; }, { klass: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"],
+ args: ['class']
+ }], ngClass: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"],
+ args: ['ngClass']
+ }] }); })();
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * Instantiates a single {@link Component} type and inserts its Host View into current View.
+ * `NgComponentOutlet` provides a declarative approach for dynamic component creation.
+ *
+ * `NgComponentOutlet` requires a component type, if a falsy value is set the view will clear and
+ * any existing component will get destroyed.
+ *
+ * @usageNotes
+ *
+ * ### Fine tune control
+ *
+ * You can control the component creation process by using the following optional attributes:
+ *
+ * * `ngComponentOutletInjector`: Optional custom {@link Injector} that will be used as parent for
+ * the Component. Defaults to the injector of the current view container.
+ *
+ * * `ngComponentOutletContent`: Optional list of projectable nodes to insert into the content
+ * section of the component, if exists.
+ *
+ * * `ngComponentOutletNgModuleFactory`: Optional module factory to allow dynamically loading other
+ * module, then load a component from that module.
+ *
+ * ### Syntax
+ *
+ * Simple
+ * ```
+ *
+ * ```
+ *
+ * Customized injector/content
+ * ```
+ *
+ *
+ * ```
+ *
+ * Customized ngModuleFactory
+ * ```
+ *
+ *
+ * ```
+ *
+ * ### A simple example
+ *
+ * {@example common/ngComponentOutlet/ts/module.ts region='SimpleExample'}
+ *
+ * A more complete example with additional options:
+ *
+ * {@example common/ngComponentOutlet/ts/module.ts region='CompleteExample'}
+ *
+ * @publicApi
+ * @ngModule CommonModule
+ */
+class NgComponentOutlet {
+ constructor(_viewContainerRef) {
+ this._viewContainerRef = _viewContainerRef;
+ this._componentRef = null;
+ this._moduleRef = null;
+ }
+ ngOnChanges(changes) {
+ this._viewContainerRef.clear();
+ this._componentRef = null;
+ if (this.ngComponentOutlet) {
+ const elInjector = this.ngComponentOutletInjector || this._viewContainerRef.parentInjector;
+ if (changes['ngComponentOutletNgModuleFactory']) {
+ if (this._moduleRef)
+ this._moduleRef.destroy();
+ if (this.ngComponentOutletNgModuleFactory) {
+ const parentModule = elInjector.get(_angular_core__WEBPACK_IMPORTED_MODULE_0__["NgModuleRef"]);
+ this._moduleRef = this.ngComponentOutletNgModuleFactory.create(parentModule.injector);
+ }
+ else {
+ this._moduleRef = null;
+ }
+ }
+ const componentFactoryResolver = this._moduleRef ? this._moduleRef.componentFactoryResolver :
+ elInjector.get(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ComponentFactoryResolver"]);
+ const componentFactory = componentFactoryResolver.resolveComponentFactory(this.ngComponentOutlet);
+ this._componentRef = this._viewContainerRef.createComponent(componentFactory, this._viewContainerRef.length, elInjector, this.ngComponentOutletContent);
+ }
+ }
+ ngOnDestroy() {
+ if (this._moduleRef)
+ this._moduleRef.destroy();
+ }
+}
+NgComponentOutlet.ɵfac = function NgComponentOutlet_Factory(t) { return new (t || NgComponentOutlet)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ViewContainerRef"])); };
+NgComponentOutlet.ɵdir = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineDirective"]({ type: NgComponentOutlet, selectors: [["", "ngComponentOutlet", ""]], inputs: { ngComponentOutlet: "ngComponentOutlet", ngComponentOutletInjector: "ngComponentOutletInjector", ngComponentOutletContent: "ngComponentOutletContent", ngComponentOutletNgModuleFactory: "ngComponentOutletNgModuleFactory" }, features: [_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵNgOnChangesFeature"]] });
+NgComponentOutlet.ctorParameters = () => [
+ { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["ViewContainerRef"] }
+];
+NgComponentOutlet.propDecorators = {
+ ngComponentOutlet: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"] }],
+ ngComponentOutletInjector: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"] }],
+ ngComponentOutletContent: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"] }],
+ ngComponentOutletNgModuleFactory: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"] }]
+};
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](NgComponentOutlet, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Directive"],
+ args: [{ selector: '[ngComponentOutlet]' }]
+ }], function () { return [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["ViewContainerRef"] }]; }, { ngComponentOutlet: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"]
+ }], ngComponentOutletInjector: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"]
+ }], ngComponentOutletContent: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"]
+ }], ngComponentOutletNgModuleFactory: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"]
+ }] }); })();
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * @publicApi
+ */
+class NgForOfContext {
+ constructor($implicit, ngForOf, index, count) {
+ this.$implicit = $implicit;
+ this.ngForOf = ngForOf;
+ this.index = index;
+ this.count = count;
+ }
+ get first() {
+ return this.index === 0;
+ }
+ get last() {
+ return this.index === this.count - 1;
+ }
+ get even() {
+ return this.index % 2 === 0;
+ }
+ get odd() {
+ return !this.even;
+ }
+}
+/**
+ * A [structural directive](guide/structural-directives) that renders
+ * a template for each item in a collection.
+ * The directive is placed on an element, which becomes the parent
+ * of the cloned templates.
+ *
+ * The `ngForOf` directive is generally used in the
+ * [shorthand form](guide/structural-directives#asterisk) `*ngFor`.
+ * In this form, the template to be rendered for each iteration is the content
+ * of an anchor element containing the directive.
+ *
+ * The following example shows the shorthand syntax with some options,
+ * contained in an `` element.
+ *
+ * ```
+ * ...
+ * ```
+ *
+ * The shorthand form expands into a long form that uses the `ngForOf` selector
+ * on an `` element.
+ * The content of the `` element is the `` element that held the
+ * short-form directive.
+ *
+ * Here is the expanded version of the short-form example.
+ *
+ * ```
+ *
+ * ...
+ *
+ * ```
+ *
+ * Angular automatically expands the shorthand syntax as it compiles the template.
+ * The context for each embedded view is logically merged to the current component
+ * context according to its lexical position.
+ *
+ * When using the shorthand syntax, Angular allows only [one structural directive
+ * on an element](guide/built-in-directives#one-per-element).
+ * If you want to iterate conditionally, for example,
+ * put the `*ngIf` on a container element that wraps the `*ngFor` element.
+ * For futher discussion, see
+ * [Structural Directives](guide/built-in-directives#one-per-element).
+ *
+ * @usageNotes
+ *
+ * ### Local variables
+ *
+ * `NgForOf` provides exported values that can be aliased to local variables.
+ * For example:
+ *
+ * ```
+ *
+ * {{i}}/{{users.length}}. {{user}} default
+ *
+ * ```
+ *
+ * The following exported values can be aliased to local variables:
+ *
+ * - `$implicit: T`: The value of the individual items in the iterable (`ngForOf`).
+ * - `ngForOf: NgIterable`: The value of the iterable expression. Useful when the expression is
+ * more complex then a property access, for example when using the async pipe (`userStreams |
+ * async`).
+ * - `index: number`: The index of the current item in the iterable.
+ * - `count: number`: The length of the iterable.
+ * - `first: boolean`: True when the item is the first item in the iterable.
+ * - `last: boolean`: True when the item is the last item in the iterable.
+ * - `even: boolean`: True when the item has an even index in the iterable.
+ * - `odd: boolean`: True when the item has an odd index in the iterable.
+ *
+ * ### Change propagation
+ *
+ * When the contents of the iterator changes, `NgForOf` makes the corresponding changes to the DOM:
+ *
+ * * When an item is added, a new instance of the template is added to the DOM.
+ * * When an item is removed, its template instance is removed from the DOM.
+ * * When items are reordered, their respective templates are reordered in the DOM.
+ *
+ * Angular uses object identity to track insertions and deletions within the iterator and reproduce
+ * those changes in the DOM. This has important implications for animations and any stateful
+ * controls that are present, such as `` elements that accept user input. Inserted rows can
+ * be animated in, deleted rows can be animated out, and unchanged rows retain any unsaved state
+ * such as user input.
+ * For more on animations, see [Transitions and Triggers](guide/transition-and-triggers).
+ *
+ * The identities of elements in the iterator can change while the data does not.
+ * This can happen, for example, if the iterator is produced from an RPC to the server, and that
+ * RPC is re-run. Even if the data hasn't changed, the second response produces objects with
+ * different identities, and Angular must tear down the entire DOM and rebuild it (as if all old
+ * elements were deleted and all new elements inserted).
+ *
+ * To avoid this expensive operation, you can customize the default tracking algorithm.
+ * by supplying the `trackBy` option to `NgForOf`.
+ * `trackBy` takes a function that has two arguments: `index` and `item`.
+ * If `trackBy` is given, Angular tracks changes by the return value of the function.
+ *
+ * @see [Structural Directives](guide/structural-directives)
+ * @ngModule CommonModule
+ * @publicApi
+ */
+class NgForOf {
+ constructor(_viewContainer, _template, _differs) {
+ this._viewContainer = _viewContainer;
+ this._template = _template;
+ this._differs = _differs;
+ this._ngForOf = null;
+ this._ngForOfDirty = true;
+ this._differ = null;
+ }
+ /**
+ * The value of the iterable expression, which can be used as a
+ * [template input variable](guide/structural-directives#shorthand).
+ */
+ set ngForOf(ngForOf) {
+ this._ngForOf = ngForOf;
+ this._ngForOfDirty = true;
+ }
+ /**
+ * A function that defines how to track changes for items in the iterable.
+ *
+ * When items are added, moved, or removed in the iterable,
+ * the directive must re-render the appropriate DOM nodes.
+ * To minimize churn in the DOM, only nodes that have changed
+ * are re-rendered.
+ *
+ * By default, the change detector assumes that
+ * the object instance identifies the node in the iterable.
+ * When this function is supplied, the directive uses
+ * the result of calling this function to identify the item node,
+ * rather than the identity of the object itself.
+ *
+ * The function receives two inputs,
+ * the iteration index and the associated node data.
+ */
+ set ngForTrackBy(fn) {
+ if ((typeof ngDevMode === 'undefined' || ngDevMode) && fn != null && typeof fn !== 'function') {
+ // TODO(vicb): use a log service once there is a public one available
+ if (console && console.warn) {
+ console.warn(`trackBy must be a function, but received ${JSON.stringify(fn)}. ` +
+ `See https://angular.io/api/common/NgForOf#change-propagation for more information.`);
+ }
+ }
+ this._trackByFn = fn;
+ }
+ get ngForTrackBy() {
+ return this._trackByFn;
+ }
+ /**
+ * A reference to the template that is stamped out for each item in the iterable.
+ * @see [template reference variable](guide/template-reference-variables)
+ */
+ set ngForTemplate(value) {
+ // TODO(TS2.1): make TemplateRef>> once we move to TS v2.1
+ // The current type is too restrictive; a template that just uses index, for example,
+ // should be acceptable.
+ if (value) {
+ this._template = value;
+ }
+ }
+ /**
+ * Applies the changes when needed.
+ */
+ ngDoCheck() {
+ if (this._ngForOfDirty) {
+ this._ngForOfDirty = false;
+ // React on ngForOf changes only once all inputs have been initialized
+ const value = this._ngForOf;
+ if (!this._differ && value) {
+ try {
+ this._differ = this._differs.find(value).create(this.ngForTrackBy);
+ }
+ catch (_a) {
+ throw new Error(`Cannot find a differ supporting object '${value}' of type '${getTypeName(value)}'. NgFor only supports binding to Iterables such as Arrays.`);
+ }
+ }
+ }
+ if (this._differ) {
+ const changes = this._differ.diff(this._ngForOf);
+ if (changes)
+ this._applyChanges(changes);
+ }
+ }
+ _applyChanges(changes) {
+ const insertTuples = [];
+ changes.forEachOperation((item, adjustedPreviousIndex, currentIndex) => {
+ if (item.previousIndex == null) {
+ // NgForOf is never "null" or "undefined" here because the differ detected
+ // that a new item needs to be inserted from the iterable. This implies that
+ // there is an iterable value for "_ngForOf".
+ const view = this._viewContainer.createEmbeddedView(this._template, new NgForOfContext(null, this._ngForOf, -1, -1), currentIndex === null ? undefined : currentIndex);
+ const tuple = new RecordViewTuple(item, view);
+ insertTuples.push(tuple);
+ }
+ else if (currentIndex == null) {
+ this._viewContainer.remove(adjustedPreviousIndex === null ? undefined : adjustedPreviousIndex);
+ }
+ else if (adjustedPreviousIndex !== null) {
+ const view = this._viewContainer.get(adjustedPreviousIndex);
+ this._viewContainer.move(view, currentIndex);
+ const tuple = new RecordViewTuple(item, view);
+ insertTuples.push(tuple);
+ }
+ });
+ for (let i = 0; i < insertTuples.length; i++) {
+ this._perViewChange(insertTuples[i].view, insertTuples[i].record);
+ }
+ for (let i = 0, ilen = this._viewContainer.length; i < ilen; i++) {
+ const viewRef = this._viewContainer.get(i);
+ viewRef.context.index = i;
+ viewRef.context.count = ilen;
+ viewRef.context.ngForOf = this._ngForOf;
+ }
+ changes.forEachIdentityChange((record) => {
+ const viewRef = this._viewContainer.get(record.currentIndex);
+ viewRef.context.$implicit = record.item;
+ });
+ }
+ _perViewChange(view, record) {
+ view.context.$implicit = record.item;
+ }
+ /**
+ * Asserts the correct type of the context for the template that `NgForOf` will render.
+ *
+ * The presence of this method is a signal to the Ivy template type-check compiler that the
+ * `NgForOf` structural directive renders its template with a specific context type.
+ */
+ static ngTemplateContextGuard(dir, ctx) {
+ return true;
+ }
+}
+NgForOf.ɵfac = function NgForOf_Factory(t) { return new (t || NgForOf)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ViewContainerRef"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["TemplateRef"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["IterableDiffers"])); };
+NgForOf.ɵdir = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineDirective"]({ type: NgForOf, selectors: [["", "ngFor", "", "ngForOf", ""]], inputs: { ngForOf: "ngForOf", ngForTrackBy: "ngForTrackBy", ngForTemplate: "ngForTemplate" } });
+NgForOf.ctorParameters = () => [
+ { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["ViewContainerRef"] },
+ { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["TemplateRef"] },
+ { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["IterableDiffers"] }
+];
+NgForOf.propDecorators = {
+ ngForOf: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"] }],
+ ngForTrackBy: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"] }],
+ ngForTemplate: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"] }]
+};
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](NgForOf, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Directive"],
+ args: [{ selector: '[ngFor][ngForOf]' }]
+ }], function () { return [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["ViewContainerRef"] }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["TemplateRef"] }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["IterableDiffers"] }]; }, { ngForOf: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"]
+ }], ngForTrackBy: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"]
+ }], ngForTemplate: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"]
+ }] }); })();
+class RecordViewTuple {
+ constructor(record, view) {
+ this.record = record;
+ this.view = view;
+ }
+}
+function getTypeName(type) {
+ return type['name'] || typeof type;
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * A structural directive that conditionally includes a template based on the value of
+ * an expression coerced to Boolean.
+ * When the expression evaluates to true, Angular renders the template
+ * provided in a `then` clause, and when false or null,
+ * Angular renders the template provided in an optional `else` clause. The default
+ * template for the `else` clause is blank.
+ *
+ * A [shorthand form](guide/structural-directives#asterisk) of the directive,
+ * `*ngIf="condition"`, is generally used, provided
+ * as an attribute of the anchor element for the inserted template.
+ * Angular expands this into a more explicit version, in which the anchor element
+ * is contained in an `` element.
+ *
+ * Simple form with shorthand syntax:
+ *
+ * ```
+ * Content to render when condition is true.
+ * ```
+ *
+ * Simple form with expanded syntax:
+ *
+ * ```
+ * Content to render when condition is
+ * true.
+ * ```
+ *
+ * Form with an "else" block:
+ *
+ * ```
+ * Content to render when condition is true.
+ * Content to render when condition is false.
+ * ```
+ *
+ * Shorthand form with "then" and "else" blocks:
+ *
+ * ```
+ *
+ * Content to render when condition is true.
+ * Content to render when condition is false.
+ * ```
+ *
+ * Form with storing the value locally:
+ *
+ * ```
+ * {{value}}
+ * Content to render when value is null.
+ * ```
+ *
+ * @usageNotes
+ *
+ * The `*ngIf` directive is most commonly used to conditionally show an inline template,
+ * as seen in the following example.
+ * The default `else` template is blank.
+ *
+ * {@example common/ngIf/ts/module.ts region='NgIfSimple'}
+ *
+ * ### Showing an alternative template using `else`
+ *
+ * To display a template when `expression` evaluates to false, use an `else` template
+ * binding as shown in the following example.
+ * The `else` binding points to an `` element labeled `#elseBlock`.
+ * The template can be defined anywhere in the component view, but is typically placed right after
+ * `ngIf` for readability.
+ *
+ * {@example common/ngIf/ts/module.ts region='NgIfElse'}
+ *
+ * ### Using an external `then` template
+ *
+ * In the previous example, the then-clause template is specified inline, as the content of the
+ * tag that contains the `ngIf` directive. You can also specify a template that is defined
+ * externally, by referencing a labeled `` element. When you do this, you can
+ * change which template to use at runtime, as shown in the following example.
+ *
+ * {@example common/ngIf/ts/module.ts region='NgIfThenElse'}
+ *
+ * ### Storing a conditional result in a variable
+ *
+ * You might want to show a set of properties from the same object. If you are waiting
+ * for asynchronous data, the object can be undefined.
+ * In this case, you can use `ngIf` and store the result of the condition in a local
+ * variable as shown in the following example.
+ *
+ * {@example common/ngIf/ts/module.ts region='NgIfAs'}
+ *
+ * This code uses only one `AsyncPipe`, so only one subscription is created.
+ * The conditional statement stores the result of `userStream|async` in the local variable `user`.
+ * You can then bind the local `user` repeatedly.
+ *
+ * The conditional displays the data only if `userStream` returns a value,
+ * so you don't need to use the
+ * safe-navigation-operator (`?.`)
+ * to guard against null values when accessing properties.
+ * You can display an alternative template while waiting for the data.
+ *
+ * ### Shorthand syntax
+ *
+ * The shorthand syntax `*ngIf` expands into two separate template specifications
+ * for the "then" and "else" clauses. For example, consider the following shorthand statement,
+ * that is meant to show a loading page while waiting for data to be loaded.
+ *
+ * ```
+ *
+ * ...
+ *
+ *
+ *
+ * Loading...
+ *
+ * ```
+ *
+ * You can see that the "else" clause references the ``
+ * with the `#loading` label, and the template for the "then" clause
+ * is provided as the content of the anchor element.
+ *
+ * However, when Angular expands the shorthand syntax, it creates
+ * another `` tag, with `ngIf` and `ngIfElse` directives.
+ * The anchor element containing the template for the "then" clause becomes
+ * the content of this unlabeled `` tag.
+ *
+ * ```
+ *
+ *
+ * ...
+ *
+ *
+ *
+ *
+ * Loading...
+ *
+ * ```
+ *
+ * The presence of the implicit template object has implications for the nesting of
+ * structural directives. For more on this subject, see
+ * [Structural Directives](https://angular.io/guide/built-in-directives#one-per-element).
+ *
+ * @ngModule CommonModule
+ * @publicApi
+ */
+class NgIf {
+ constructor(_viewContainer, templateRef) {
+ this._viewContainer = _viewContainer;
+ this._context = new NgIfContext();
+ this._thenTemplateRef = null;
+ this._elseTemplateRef = null;
+ this._thenViewRef = null;
+ this._elseViewRef = null;
+ this._thenTemplateRef = templateRef;
+ }
+ /**
+ * The Boolean expression to evaluate as the condition for showing a template.
+ */
+ set ngIf(condition) {
+ this._context.$implicit = this._context.ngIf = condition;
+ this._updateView();
+ }
+ /**
+ * A template to show if the condition expression evaluates to true.
+ */
+ set ngIfThen(templateRef) {
+ assertTemplate('ngIfThen', templateRef);
+ this._thenTemplateRef = templateRef;
+ this._thenViewRef = null; // clear previous view if any.
+ this._updateView();
+ }
+ /**
+ * A template to show if the condition expression evaluates to false.
+ */
+ set ngIfElse(templateRef) {
+ assertTemplate('ngIfElse', templateRef);
+ this._elseTemplateRef = templateRef;
+ this._elseViewRef = null; // clear previous view if any.
+ this._updateView();
+ }
+ _updateView() {
+ if (this._context.$implicit) {
+ if (!this._thenViewRef) {
+ this._viewContainer.clear();
+ this._elseViewRef = null;
+ if (this._thenTemplateRef) {
+ this._thenViewRef =
+ this._viewContainer.createEmbeddedView(this._thenTemplateRef, this._context);
+ }
+ }
+ }
+ else {
+ if (!this._elseViewRef) {
+ this._viewContainer.clear();
+ this._thenViewRef = null;
+ if (this._elseTemplateRef) {
+ this._elseViewRef =
+ this._viewContainer.createEmbeddedView(this._elseTemplateRef, this._context);
+ }
+ }
+ }
+ }
+ /**
+ * Asserts the correct type of the context for the template that `NgIf` will render.
+ *
+ * The presence of this method is a signal to the Ivy template type-check compiler that the
+ * `NgIf` structural directive renders its template with a specific context type.
+ */
+ static ngTemplateContextGuard(dir, ctx) {
+ return true;
+ }
+}
+NgIf.ɵfac = function NgIf_Factory(t) { return new (t || NgIf)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ViewContainerRef"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["TemplateRef"])); };
+NgIf.ɵdir = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineDirective"]({ type: NgIf, selectors: [["", "ngIf", ""]], inputs: { ngIf: "ngIf", ngIfThen: "ngIfThen", ngIfElse: "ngIfElse" } });
+NgIf.ctorParameters = () => [
+ { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["ViewContainerRef"] },
+ { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["TemplateRef"] }
+];
+NgIf.propDecorators = {
+ ngIf: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"] }],
+ ngIfThen: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"] }],
+ ngIfElse: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"] }]
+};
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](NgIf, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Directive"],
+ args: [{ selector: '[ngIf]' }]
+ }], function () { return [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["ViewContainerRef"] }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["TemplateRef"] }]; }, { ngIf: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"]
+ }], ngIfThen: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"]
+ }], ngIfElse: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"]
+ }] }); })();
+/**
+ * @publicApi
+ */
+class NgIfContext {
+ constructor() {
+ this.$implicit = null;
+ this.ngIf = null;
+ }
+}
+function assertTemplate(property, templateRef) {
+ const isTemplateRefOrNull = !!(!templateRef || templateRef.createEmbeddedView);
+ if (!isTemplateRefOrNull) {
+ throw new Error(`${property} must be a TemplateRef, but received '${Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵstringify"])(templateRef)}'.`);
+ }
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+class SwitchView {
+ constructor(_viewContainerRef, _templateRef) {
+ this._viewContainerRef = _viewContainerRef;
+ this._templateRef = _templateRef;
+ this._created = false;
+ }
+ create() {
+ this._created = true;
+ this._viewContainerRef.createEmbeddedView(this._templateRef);
+ }
+ destroy() {
+ this._created = false;
+ this._viewContainerRef.clear();
+ }
+ enforceState(created) {
+ if (created && !this._created) {
+ this.create();
+ }
+ else if (!created && this._created) {
+ this.destroy();
+ }
+ }
+}
+/**
+ * @ngModule CommonModule
+ *
+ * @description
+ * The `[ngSwitch]` directive on a container specifies an expression to match against.
+ * The expressions to match are provided by `ngSwitchCase` directives on views within the container.
+ * - Every view that matches is rendered.
+ * - If there are no matches, a view with the `ngSwitchDefault` directive is rendered.
+ * - Elements within the `[NgSwitch]` statement but outside of any `NgSwitchCase`
+ * or `ngSwitchDefault` directive are preserved at the location.
+ *
+ * @usageNotes
+ * Define a container element for the directive, and specify the switch expression
+ * to match against as an attribute:
+ *
+ * ```
+ *
+ * ```
+ *
+ * Within the container, `*ngSwitchCase` statements specify the match expressions
+ * as attributes. Include `*ngSwitchDefault` as the final case.
+ *
+ * ```
+ *
+ * ...
+ * ...
+ * ...
+ *
+ * ```
+ *
+ * ### Usage Examples
+ *
+ * The following example shows how to use more than one case to display the same view:
+ *
+ * ```
+ *
+ *
+ * ...
+ * ...
+ * ...
+ *
+ * ...
+ *
+ * ```
+ *
+ * The following example shows how cases can be nested:
+ * ```
+ *
+ * ...
+ * ...
+ * ...
+ *
+ *
+ *
+ *
+ *
+ * ...
+ *
+ * ```
+ *
+ * @publicApi
+ * @see `NgSwitchCase`
+ * @see `NgSwitchDefault`
+ * @see [Structural Directives](guide/structural-directives)
+ *
+ */
+class NgSwitch {
+ constructor() {
+ this._defaultUsed = false;
+ this._caseCount = 0;
+ this._lastCaseCheckIndex = 0;
+ this._lastCasesMatched = false;
+ }
+ set ngSwitch(newValue) {
+ this._ngSwitch = newValue;
+ if (this._caseCount === 0) {
+ this._updateDefaultCases(true);
+ }
+ }
+ /** @internal */
+ _addCase() {
+ return this._caseCount++;
+ }
+ /** @internal */
+ _addDefault(view) {
+ if (!this._defaultViews) {
+ this._defaultViews = [];
+ }
+ this._defaultViews.push(view);
+ }
+ /** @internal */
+ _matchCase(value) {
+ const matched = value == this._ngSwitch;
+ this._lastCasesMatched = this._lastCasesMatched || matched;
+ this._lastCaseCheckIndex++;
+ if (this._lastCaseCheckIndex === this._caseCount) {
+ this._updateDefaultCases(!this._lastCasesMatched);
+ this._lastCaseCheckIndex = 0;
+ this._lastCasesMatched = false;
+ }
+ return matched;
+ }
+ _updateDefaultCases(useDefault) {
+ if (this._defaultViews && useDefault !== this._defaultUsed) {
+ this._defaultUsed = useDefault;
+ for (let i = 0; i < this._defaultViews.length; i++) {
+ const defaultView = this._defaultViews[i];
+ defaultView.enforceState(useDefault);
+ }
+ }
+ }
+}
+NgSwitch.ɵfac = function NgSwitch_Factory(t) { return new (t || NgSwitch)(); };
+NgSwitch.ɵdir = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineDirective"]({ type: NgSwitch, selectors: [["", "ngSwitch", ""]], inputs: { ngSwitch: "ngSwitch" } });
+NgSwitch.propDecorators = {
+ ngSwitch: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"] }]
+};
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](NgSwitch, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Directive"],
+ args: [{ selector: '[ngSwitch]' }]
+ }], function () { return []; }, { ngSwitch: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"]
+ }] }); })();
+/**
+ * @ngModule CommonModule
+ *
+ * @description
+ * Provides a switch case expression to match against an enclosing `ngSwitch` expression.
+ * When the expressions match, the given `NgSwitchCase` template is rendered.
+ * If multiple match expressions match the switch expression value, all of them are displayed.
+ *
+ * @usageNotes
+ *
+ * Within a switch container, `*ngSwitchCase` statements specify the match expressions
+ * as attributes. Include `*ngSwitchDefault` as the final case.
+ *
+ * ```
+ *
+ * ...
+ * ...
+ * ...
+ *
+ * ```
+ *
+ * Each switch-case statement contains an in-line HTML template or template reference
+ * that defines the subtree to be selected if the value of the match expression
+ * matches the value of the switch expression.
+ *
+ * Unlike JavaScript, which uses strict equality, Angular uses loose equality.
+ * This means that the empty string, `""` matches 0.
+ *
+ * @publicApi
+ * @see `NgSwitch`
+ * @see `NgSwitchDefault`
+ *
+ */
+class NgSwitchCase {
+ constructor(viewContainer, templateRef, ngSwitch) {
+ this.ngSwitch = ngSwitch;
+ if ((typeof ngDevMode === 'undefined' || ngDevMode) && !ngSwitch) {
+ throwNgSwitchProviderNotFoundError('ngSwitchCase', 'NgSwitchCase');
+ }
+ ngSwitch._addCase();
+ this._view = new SwitchView(viewContainer, templateRef);
+ }
+ /**
+ * Performs case matching. For internal use only.
+ */
+ ngDoCheck() {
+ this._view.enforceState(this.ngSwitch._matchCase(this.ngSwitchCase));
+ }
+}
+NgSwitchCase.ɵfac = function NgSwitchCase_Factory(t) { return new (t || NgSwitchCase)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ViewContainerRef"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["TemplateRef"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](NgSwitch, 9)); };
+NgSwitchCase.ɵdir = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineDirective"]({ type: NgSwitchCase, selectors: [["", "ngSwitchCase", ""]], inputs: { ngSwitchCase: "ngSwitchCase" } });
+NgSwitchCase.ctorParameters = () => [
+ { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["ViewContainerRef"] },
+ { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["TemplateRef"] },
+ { type: NgSwitch, decorators: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Optional"] }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Host"] }] }
+];
+NgSwitchCase.propDecorators = {
+ ngSwitchCase: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"] }]
+};
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](NgSwitchCase, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Directive"],
+ args: [{ selector: '[ngSwitchCase]' }]
+ }], function () { return [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["ViewContainerRef"] }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["TemplateRef"] }, { type: NgSwitch, decorators: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Optional"]
+ }, {
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Host"]
+ }] }]; }, { ngSwitchCase: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"]
+ }] }); })();
+/**
+ * @ngModule CommonModule
+ *
+ * @description
+ *
+ * Creates a view that is rendered when no `NgSwitchCase` expressions
+ * match the `NgSwitch` expression.
+ * This statement should be the final case in an `NgSwitch`.
+ *
+ * @publicApi
+ * @see `NgSwitch`
+ * @see `NgSwitchCase`
+ *
+ */
+class NgSwitchDefault {
+ constructor(viewContainer, templateRef, ngSwitch) {
+ if ((typeof ngDevMode === 'undefined' || ngDevMode) && !ngSwitch) {
+ throwNgSwitchProviderNotFoundError('ngSwitchDefault', 'NgSwitchDefault');
+ }
+ ngSwitch._addDefault(new SwitchView(viewContainer, templateRef));
+ }
+}
+NgSwitchDefault.ɵfac = function NgSwitchDefault_Factory(t) { return new (t || NgSwitchDefault)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ViewContainerRef"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["TemplateRef"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](NgSwitch, 9)); };
+NgSwitchDefault.ɵdir = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineDirective"]({ type: NgSwitchDefault, selectors: [["", "ngSwitchDefault", ""]] });
+NgSwitchDefault.ctorParameters = () => [
+ { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["ViewContainerRef"] },
+ { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["TemplateRef"] },
+ { type: NgSwitch, decorators: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Optional"] }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Host"] }] }
+];
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](NgSwitchDefault, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Directive"],
+ args: [{ selector: '[ngSwitchDefault]' }]
+ }], function () { return [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["ViewContainerRef"] }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["TemplateRef"] }, { type: NgSwitch, decorators: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Optional"]
+ }, {
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Host"]
+ }] }]; }, null); })();
+function throwNgSwitchProviderNotFoundError(attrName, directiveName) {
+ throw new _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵRuntimeError"]("305" /* TEMPLATE_STRUCTURE_ERROR */, `An element with the "${attrName}" attribute ` +
+ `(matching the "${directiveName}" directive) must be located inside an element with the "ngSwitch" attribute ` +
+ `(matching "NgSwitch" directive)`);
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * @ngModule CommonModule
+ *
+ * @usageNotes
+ * ```
+ *
+ * there is nothing
+ * there is one
+ * there are a few
+ *
+ * ```
+ *
+ * @description
+ *
+ * Adds / removes DOM sub-trees based on a numeric value. Tailored for pluralization.
+ *
+ * Displays DOM sub-trees that match the switch expression value, or failing that, DOM sub-trees
+ * that match the switch expression's pluralization category.
+ *
+ * To use this directive you must provide a container element that sets the `[ngPlural]` attribute
+ * to a switch expression. Inner elements with a `[ngPluralCase]` will display based on their
+ * expression:
+ * - if `[ngPluralCase]` is set to a value starting with `=`, it will only display if the value
+ * matches the switch expression exactly,
+ * - otherwise, the view will be treated as a "category match", and will only display if exact
+ * value matches aren't found and the value maps to its category for the defined locale.
+ *
+ * See http://cldr.unicode.org/index/cldr-spec/plural-rules
+ *
+ * @publicApi
+ */
+class NgPlural {
+ constructor(_localization) {
+ this._localization = _localization;
+ this._caseViews = {};
+ }
+ set ngPlural(value) {
+ this._switchValue = value;
+ this._updateView();
+ }
+ addCase(value, switchView) {
+ this._caseViews[value] = switchView;
+ }
+ _updateView() {
+ this._clearViews();
+ const cases = Object.keys(this._caseViews);
+ const key = getPluralCategory(this._switchValue, cases, this._localization);
+ this._activateView(this._caseViews[key]);
+ }
+ _clearViews() {
+ if (this._activeView)
+ this._activeView.destroy();
+ }
+ _activateView(view) {
+ if (view) {
+ this._activeView = view;
+ this._activeView.create();
+ }
+ }
+}
+NgPlural.ɵfac = function NgPlural_Factory(t) { return new (t || NgPlural)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](NgLocalization)); };
+NgPlural.ɵdir = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineDirective"]({ type: NgPlural, selectors: [["", "ngPlural", ""]], inputs: { ngPlural: "ngPlural" } });
+NgPlural.ctorParameters = () => [
+ { type: NgLocalization }
+];
+NgPlural.propDecorators = {
+ ngPlural: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"] }]
+};
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](NgPlural, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Directive"],
+ args: [{ selector: '[ngPlural]' }]
+ }], function () { return [{ type: NgLocalization }]; }, { ngPlural: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"]
+ }] }); })();
+/**
+ * @ngModule CommonModule
+ *
+ * @description
+ *
+ * Creates a view that will be added/removed from the parent {@link NgPlural} when the
+ * given expression matches the plural expression according to CLDR rules.
+ *
+ * @usageNotes
+ * ```
+ *
+ * ...
+ * ...
+ *
+ *```
+ *
+ * See {@link NgPlural} for more details and example.
+ *
+ * @publicApi
+ */
+class NgPluralCase {
+ constructor(value, template, viewContainer, ngPlural) {
+ this.value = value;
+ const isANumber = !isNaN(Number(value));
+ ngPlural.addCase(isANumber ? `=${value}` : value, new SwitchView(viewContainer, template));
+ }
+}
+NgPluralCase.ɵfac = function NgPluralCase_Factory(t) { return new (t || NgPluralCase)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵinjectAttribute"]('ngPluralCase'), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["TemplateRef"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ViewContainerRef"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](NgPlural, 1)); };
+NgPluralCase.ɵdir = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineDirective"]({ type: NgPluralCase, selectors: [["", "ngPluralCase", ""]] });
+NgPluralCase.ctorParameters = () => [
+ { type: String, decorators: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Attribute"], args: ['ngPluralCase',] }] },
+ { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["TemplateRef"] },
+ { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["ViewContainerRef"] },
+ { type: NgPlural, decorators: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Host"] }] }
+];
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](NgPluralCase, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Directive"],
+ args: [{ selector: '[ngPluralCase]' }]
+ }], function () { return [{ type: String, decorators: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Attribute"],
+ args: ['ngPluralCase']
+ }] }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["TemplateRef"] }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["ViewContainerRef"] }, { type: NgPlural, decorators: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Host"]
+ }] }]; }, null); })();
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * @ngModule CommonModule
+ *
+ * @usageNotes
+ *
+ * Set the font of the containing element to the result of an expression.
+ *
+ * ```
+ * ...
+ * ```
+ *
+ * Set the width of the containing element to a pixel value returned by an expression.
+ *
+ * ```
+ * ...
+ * ```
+ *
+ * Set a collection of style values using an expression that returns key-value pairs.
+ *
+ * ```
+ * ...
+ * ```
+ *
+ * @description
+ *
+ * An attribute directive that updates styles for the containing HTML element.
+ * Sets one or more style properties, specified as colon-separated key-value pairs.
+ * The key is a style name, with an optional `.` suffix
+ * (such as 'top.px', 'font-style.em').
+ * The value is an expression to be evaluated.
+ * The resulting non-null value, expressed in the given unit,
+ * is assigned to the given style property.
+ * If the result of evaluation is null, the corresponding style is removed.
+ *
+ * @publicApi
+ */
+class NgStyle {
+ constructor(_ngEl, _differs, _renderer) {
+ this._ngEl = _ngEl;
+ this._differs = _differs;
+ this._renderer = _renderer;
+ this._ngStyle = null;
+ this._differ = null;
+ }
+ set ngStyle(values) {
+ this._ngStyle = values;
+ if (!this._differ && values) {
+ this._differ = this._differs.find(values).create();
+ }
+ }
+ ngDoCheck() {
+ if (this._differ) {
+ const changes = this._differ.diff(this._ngStyle);
+ if (changes) {
+ this._applyChanges(changes);
+ }
+ }
+ }
+ _setStyle(nameAndUnit, value) {
+ const [name, unit] = nameAndUnit.split('.');
+ value = value != null && unit ? `${value}${unit}` : value;
+ if (value != null) {
+ this._renderer.setStyle(this._ngEl.nativeElement, name, value);
+ }
+ else {
+ this._renderer.removeStyle(this._ngEl.nativeElement, name);
+ }
+ }
+ _applyChanges(changes) {
+ changes.forEachRemovedItem((record) => this._setStyle(record.key, null));
+ changes.forEachAddedItem((record) => this._setStyle(record.key, record.currentValue));
+ changes.forEachChangedItem((record) => this._setStyle(record.key, record.currentValue));
+ }
+}
+NgStyle.ɵfac = function NgStyle_Factory(t) { return new (t || NgStyle)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ElementRef"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["KeyValueDiffers"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["Renderer2"])); };
+NgStyle.ɵdir = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineDirective"]({ type: NgStyle, selectors: [["", "ngStyle", ""]], inputs: { ngStyle: "ngStyle" } });
+NgStyle.ctorParameters = () => [
+ { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["ElementRef"] },
+ { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["KeyValueDiffers"] },
+ { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Renderer2"] }
+];
+NgStyle.propDecorators = {
+ ngStyle: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"], args: ['ngStyle',] }]
+};
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](NgStyle, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Directive"],
+ args: [{ selector: '[ngStyle]' }]
+ }], function () { return [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["ElementRef"] }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["KeyValueDiffers"] }, { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Renderer2"] }]; }, { ngStyle: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"],
+ args: ['ngStyle']
+ }] }); })();
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * @ngModule CommonModule
+ *
+ * @description
+ *
+ * Inserts an embedded view from a prepared `TemplateRef`.
+ *
+ * You can attach a context object to the `EmbeddedViewRef` by setting `[ngTemplateOutletContext]`.
+ * `[ngTemplateOutletContext]` should be an object, the object's keys will be available for binding
+ * by the local template `let` declarations.
+ *
+ * @usageNotes
+ * ```
+ *
+ * ```
+ *
+ * Using the key `$implicit` in the context object will set its value as default.
+ *
+ * ### Example
+ *
+ * {@example common/ngTemplateOutlet/ts/module.ts region='NgTemplateOutlet'}
+ *
+ * @publicApi
+ */
+class NgTemplateOutlet {
+ constructor(_viewContainerRef) {
+ this._viewContainerRef = _viewContainerRef;
+ this._viewRef = null;
+ /**
+ * A context object to attach to the {@link EmbeddedViewRef}. This should be an
+ * object, the object's keys will be available for binding by the local template `let`
+ * declarations.
+ * Using the key `$implicit` in the context object will set its value as default.
+ */
+ this.ngTemplateOutletContext = null;
+ /**
+ * A string defining the template reference and optionally the context object for the template.
+ */
+ this.ngTemplateOutlet = null;
+ }
+ ngOnChanges(changes) {
+ const recreateView = this._shouldRecreateView(changes);
+ if (recreateView) {
+ const viewContainerRef = this._viewContainerRef;
+ if (this._viewRef) {
+ viewContainerRef.remove(viewContainerRef.indexOf(this._viewRef));
+ }
+ this._viewRef = this.ngTemplateOutlet ?
+ viewContainerRef.createEmbeddedView(this.ngTemplateOutlet, this.ngTemplateOutletContext) :
+ null;
+ }
+ else if (this._viewRef && this.ngTemplateOutletContext) {
+ this._updateExistingContext(this.ngTemplateOutletContext);
+ }
+ }
+ /**
+ * We need to re-create existing embedded view if:
+ * - templateRef has changed
+ * - context has changes
+ *
+ * We mark context object as changed when the corresponding object
+ * shape changes (new properties are added or existing properties are removed).
+ * In other words we consider context with the same properties as "the same" even
+ * if object reference changes (see https://github.com/angular/angular/issues/13407).
+ */
+ _shouldRecreateView(changes) {
+ const ctxChange = changes['ngTemplateOutletContext'];
+ return !!changes['ngTemplateOutlet'] || (ctxChange && this._hasContextShapeChanged(ctxChange));
+ }
+ _hasContextShapeChanged(ctxChange) {
+ const prevCtxKeys = Object.keys(ctxChange.previousValue || {});
+ const currCtxKeys = Object.keys(ctxChange.currentValue || {});
+ if (prevCtxKeys.length === currCtxKeys.length) {
+ for (let propName of currCtxKeys) {
+ if (prevCtxKeys.indexOf(propName) === -1) {
+ return true;
+ }
+ }
+ return false;
+ }
+ return true;
+ }
+ _updateExistingContext(ctx) {
+ for (let propName of Object.keys(ctx)) {
+ this._viewRef.context[propName] = this.ngTemplateOutletContext[propName];
+ }
+ }
+}
+NgTemplateOutlet.ɵfac = function NgTemplateOutlet_Factory(t) { return new (t || NgTemplateOutlet)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["ViewContainerRef"])); };
+NgTemplateOutlet.ɵdir = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineDirective"]({ type: NgTemplateOutlet, selectors: [["", "ngTemplateOutlet", ""]], inputs: { ngTemplateOutletContext: "ngTemplateOutletContext", ngTemplateOutlet: "ngTemplateOutlet" }, features: [_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵNgOnChangesFeature"]] });
+NgTemplateOutlet.ctorParameters = () => [
+ { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["ViewContainerRef"] }
+];
+NgTemplateOutlet.propDecorators = {
+ ngTemplateOutletContext: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"] }],
+ ngTemplateOutlet: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"] }]
+};
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](NgTemplateOutlet, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Directive"],
+ args: [{ selector: '[ngTemplateOutlet]' }]
+ }], function () { return [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["ViewContainerRef"] }]; }, { ngTemplateOutletContext: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"]
+ }], ngTemplateOutlet: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"]
+ }] }); })();
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * A collection of Angular directives that are likely to be used in each and every Angular
+ * application.
+ */
+const COMMON_DIRECTIVES = [
+ NgClass,
+ NgComponentOutlet,
+ NgForOf,
+ NgIf,
+ NgTemplateOutlet,
+ NgStyle,
+ NgSwitch,
+ NgSwitchCase,
+ NgSwitchDefault,
+ NgPlural,
+ NgPluralCase,
+];
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+function invalidPipeArgumentError(type, value) {
+ return Error(`InvalidPipeArgument: '${value}' for pipe '${Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵstringify"])(type)}'`);
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+class SubscribableStrategy {
+ createSubscription(async, updateLatestValue) {
+ return async.subscribe({
+ next: updateLatestValue,
+ error: (e) => {
+ throw e;
+ }
+ });
+ }
+ dispose(subscription) {
+ subscription.unsubscribe();
+ }
+ onDestroy(subscription) {
+ subscription.unsubscribe();
+ }
+}
+class PromiseStrategy {
+ createSubscription(async, updateLatestValue) {
+ return async.then(updateLatestValue, e => {
+ throw e;
+ });
+ }
+ dispose(subscription) { }
+ onDestroy(subscription) { }
+}
+const _promiseStrategy = new PromiseStrategy();
+const _subscribableStrategy = new SubscribableStrategy();
+/**
+ * @ngModule CommonModule
+ * @description
+ *
+ * Unwraps a value from an asynchronous primitive.
+ *
+ * The `async` pipe subscribes to an `Observable` or `Promise` and returns the latest value it has
+ * emitted. When a new value is emitted, the `async` pipe marks the component to be checked for
+ * changes. When the component gets destroyed, the `async` pipe unsubscribes automatically to avoid
+ * potential memory leaks.
+ *
+ * @usageNotes
+ *
+ * ### Examples
+ *
+ * This example binds a `Promise` to the view. Clicking the `Resolve` button resolves the
+ * promise.
+ *
+ * {@example common/pipes/ts/async_pipe.ts region='AsyncPipePromise'}
+ *
+ * It's also possible to use `async` with Observables. The example below binds the `time` Observable
+ * to the view. The Observable continuously updates the view with the current time.
+ *
+ * {@example common/pipes/ts/async_pipe.ts region='AsyncPipeObservable'}
+ *
+ * @publicApi
+ */
+class AsyncPipe {
+ constructor(_ref) {
+ this._ref = _ref;
+ this._latestValue = null;
+ this._subscription = null;
+ this._obj = null;
+ this._strategy = null;
+ }
+ ngOnDestroy() {
+ if (this._subscription) {
+ this._dispose();
+ }
+ }
+ transform(obj) {
+ if (!this._obj) {
+ if (obj) {
+ this._subscribe(obj);
+ }
+ return this._latestValue;
+ }
+ if (obj !== this._obj) {
+ this._dispose();
+ return this.transform(obj);
+ }
+ return this._latestValue;
+ }
+ _subscribe(obj) {
+ this._obj = obj;
+ this._strategy = this._selectStrategy(obj);
+ this._subscription = this._strategy.createSubscription(obj, (value) => this._updateLatestValue(obj, value));
+ }
+ _selectStrategy(obj) {
+ if (Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵisPromise"])(obj)) {
+ return _promiseStrategy;
+ }
+ if (Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵisSubscribable"])(obj)) {
+ return _subscribableStrategy;
+ }
+ throw invalidPipeArgumentError(AsyncPipe, obj);
+ }
+ _dispose() {
+ this._strategy.dispose(this._subscription);
+ this._latestValue = null;
+ this._subscription = null;
+ this._obj = null;
+ }
+ _updateLatestValue(async, value) {
+ if (async === this._obj) {
+ this._latestValue = value;
+ this._ref.markForCheck();
+ }
+ }
+}
+AsyncPipe.ɵfac = function AsyncPipe_Factory(t) { return new (t || AsyncPipe)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵinjectPipeChangeDetectorRef"]()); };
+AsyncPipe.ɵpipe = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefinePipe"]({ name: "async", type: AsyncPipe, pure: false });
+AsyncPipe.ctorParameters = () => [
+ { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["ChangeDetectorRef"] }
+];
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](AsyncPipe, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Pipe"],
+ args: [{ name: 'async', pure: false }]
+ }], function () { return [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["ChangeDetectorRef"] }]; }, null); })();
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * Transforms text to all lower case.
+ *
+ * @see `UpperCasePipe`
+ * @see `TitleCasePipe`
+ * @usageNotes
+ *
+ * The following example defines a view that allows the user to enter
+ * text, and then uses the pipe to convert the input text to all lower case.
+ *
+ *
+ *
+ * @ngModule CommonModule
+ * @publicApi
+ */
+class LowerCasePipe {
+ transform(value) {
+ if (value == null)
+ return null;
+ if (typeof value !== 'string') {
+ throw invalidPipeArgumentError(LowerCasePipe, value);
+ }
+ return value.toLowerCase();
+ }
+}
+LowerCasePipe.ɵfac = function LowerCasePipe_Factory(t) { return new (t || LowerCasePipe)(); };
+LowerCasePipe.ɵpipe = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefinePipe"]({ name: "lowercase", type: LowerCasePipe, pure: true });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](LowerCasePipe, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Pipe"],
+ args: [{ name: 'lowercase' }]
+ }], null, null); })();
+//
+// Regex below matches any Unicode word and compatible with ES5. In ES2018 the same result
+// can be achieved by using /\p{L}\S*/gu and also known as Unicode Property Escapes
+// (https://2ality.com/2017/07/regexp-unicode-property-escapes.html). Since there is no
+// transpilation of this functionality down to ES5 without external tool, the only solution is
+// to use already transpiled form. Example can be found here -
+// https://mothereff.in/regexpu#input=var+regex+%3D+/%5Cp%7BL%7D/u%3B&unicodePropertyEscape=1
+//
+const unicodeWordMatch = /(?:[A-Za-z\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16F1-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312E\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEA\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF2D-\uDF40\uDF42-\uDF49\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDF00-\uDF19]|\uD806[\uDCA0-\uDCDF\uDCFF\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE83\uDE86-\uDE89\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46]|\uD808[\uDC00-\uDF99]|\uD809[\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50\uDF93-\uDF9F\uDFE0\uDFE1]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00-\uDD1E\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D])\S*/g;
+/**
+ * Transforms text to title case.
+ * Capitalizes the first letter of each word and transforms the
+ * rest of the word to lower case.
+ * Words are delimited by any whitespace character, such as a space, tab, or line-feed character.
+ *
+ * @see `LowerCasePipe`
+ * @see `UpperCasePipe`
+ *
+ * @usageNotes
+ * The following example shows the result of transforming various strings into title case.
+ *
+ *
+ *
+ * @ngModule CommonModule
+ * @publicApi
+ */
+class TitleCasePipe {
+ transform(value) {
+ if (value == null)
+ return null;
+ if (typeof value !== 'string') {
+ throw invalidPipeArgumentError(TitleCasePipe, value);
+ }
+ return value.replace(unicodeWordMatch, (txt => txt[0].toUpperCase() + txt.substr(1).toLowerCase()));
+ }
+}
+TitleCasePipe.ɵfac = function TitleCasePipe_Factory(t) { return new (t || TitleCasePipe)(); };
+TitleCasePipe.ɵpipe = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefinePipe"]({ name: "titlecase", type: TitleCasePipe, pure: true });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](TitleCasePipe, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Pipe"],
+ args: [{ name: 'titlecase' }]
+ }], null, null); })();
+/**
+ * Transforms text to all upper case.
+ * @see `LowerCasePipe`
+ * @see `TitleCasePipe`
+ *
+ * @ngModule CommonModule
+ * @publicApi
+ */
+class UpperCasePipe {
+ transform(value) {
+ if (value == null)
+ return null;
+ if (typeof value !== 'string') {
+ throw invalidPipeArgumentError(UpperCasePipe, value);
+ }
+ return value.toUpperCase();
+ }
+}
+UpperCasePipe.ɵfac = function UpperCasePipe_Factory(t) { return new (t || UpperCasePipe)(); };
+UpperCasePipe.ɵpipe = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefinePipe"]({ name: "uppercase", type: UpperCasePipe, pure: true });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](UpperCasePipe, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Pipe"],
+ args: [{ name: 'uppercase' }]
+ }], null, null); })();
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+// clang-format off
+/**
+ * @ngModule CommonModule
+ * @description
+ *
+ * Formats a date value according to locale rules.
+ *
+ * Only the `en-US` locale data comes with Angular. To localize dates
+ * in another language, you must import the corresponding locale data.
+ * See the [I18n guide](guide/i18n#i18n-pipes) for more information.
+ *
+ * @see `formatDate()`
+ *
+ *
+ * @usageNotes
+ *
+ * The result of this pipe is not reevaluated when the input is mutated. To avoid the need to
+ * reformat the date on every change-detection cycle, treat the date as an immutable object
+ * and change the reference when the pipe needs to run again.
+ *
+ * ### Pre-defined format options
+ *
+ * | Option | Equivalent to | Examples (given in `en-US` locale) |
+ * |---------------|-------------------------------------|-------------------------------------------------|
+ * | `'short'` | `'M/d/yy, h:mm a'` | `6/15/15, 9:03 AM` |
+ * | `'medium'` | `'MMM d, y, h:mm:ss a'` | `Jun 15, 2015, 9:03:01 AM` |
+ * | `'long'` | `'MMMM d, y, h:mm:ss a z'` | `June 15, 2015 at 9:03:01 AM GMT+1` |
+ * | `'full'` | `'EEEE, MMMM d, y, h:mm:ss a zzzz'` | `Monday, June 15, 2015 at 9:03:01 AM GMT+01:00` |
+ * | `'shortDate'` | `'M/d/yy'` | `6/15/15` |
+ * | `'mediumDate'`| `'MMM d, y'` | `Jun 15, 2015` |
+ * | `'longDate'` | `'MMMM d, y'` | `June 15, 2015` |
+ * | `'fullDate'` | `'EEEE, MMMM d, y'` | `Monday, June 15, 2015` |
+ * | `'shortTime'` | `'h:mm a'` | `9:03 AM` |
+ * | `'mediumTime'`| `'h:mm:ss a'` | `9:03:01 AM` |
+ * | `'longTime'` | `'h:mm:ss a z'` | `9:03:01 AM GMT+1` |
+ * | `'fullTime'` | `'h:mm:ss a zzzz'` | `9:03:01 AM GMT+01:00` |
+ *
+ * ### Custom format options
+ *
+ * You can construct a format string using symbols to specify the components
+ * of a date-time value, as described in the following table.
+ * Format details depend on the locale.
+ * Fields marked with (*) are only available in the extra data set for the given locale.
+ *
+ * | Field type | Format | Description | Example Value |
+ * |--------------------|-------------|---------------------------------------------------------------|------------------------------------------------------------|
+ * | Era | G, GG & GGG | Abbreviated | AD |
+ * | | GGGG | Wide | Anno Domini |
+ * | | GGGGG | Narrow | A |
+ * | Year | y | Numeric: minimum digits | 2, 20, 201, 2017, 20173 |
+ * | | yy | Numeric: 2 digits + zero padded | 02, 20, 01, 17, 73 |
+ * | | yyy | Numeric: 3 digits + zero padded | 002, 020, 201, 2017, 20173 |
+ * | | yyyy | Numeric: 4 digits or more + zero padded | 0002, 0020, 0201, 2017, 20173 |
+ * | Week-numbering year| Y | Numeric: minimum digits | 2, 20, 201, 2017, 20173 |
+ * | | YY | Numeric: 2 digits + zero padded | 02, 20, 01, 17, 73 |
+ * | | YYY | Numeric: 3 digits + zero padded | 002, 020, 201, 2017, 20173 |
+ * | | YYYY | Numeric: 4 digits or more + zero padded | 0002, 0020, 0201, 2017, 20173 |
+ * | Month | M | Numeric: 1 digit | 9, 12 |
+ * | | MM | Numeric: 2 digits + zero padded | 09, 12 |
+ * | | MMM | Abbreviated | Sep |
+ * | | MMMM | Wide | September |
+ * | | MMMMM | Narrow | S |
+ * | Month standalone | L | Numeric: 1 digit | 9, 12 |
+ * | | LL | Numeric: 2 digits + zero padded | 09, 12 |
+ * | | LLL | Abbreviated | Sep |
+ * | | LLLL | Wide | September |
+ * | | LLLLL | Narrow | S |
+ * | Week of year | w | Numeric: minimum digits | 1... 53 |
+ * | | ww | Numeric: 2 digits + zero padded | 01... 53 |
+ * | Week of month | W | Numeric: 1 digit | 1... 5 |
+ * | Day of month | d | Numeric: minimum digits | 1 |
+ * | | dd | Numeric: 2 digits + zero padded | 01 |
+ * | Week day | E, EE & EEE | Abbreviated | Tue |
+ * | | EEEE | Wide | Tuesday |
+ * | | EEEEE | Narrow | T |
+ * | | EEEEEE | Short | Tu |
+ * | Period | a, aa & aaa | Abbreviated | am/pm or AM/PM |
+ * | | aaaa | Wide (fallback to `a` when missing) | ante meridiem/post meridiem |
+ * | | aaaaa | Narrow | a/p |
+ * | Period* | B, BB & BBB | Abbreviated | mid. |
+ * | | BBBB | Wide | am, pm, midnight, noon, morning, afternoon, evening, night |
+ * | | BBBBB | Narrow | md |
+ * | Period standalone* | b, bb & bbb | Abbreviated | mid. |
+ * | | bbbb | Wide | am, pm, midnight, noon, morning, afternoon, evening, night |
+ * | | bbbbb | Narrow | md |
+ * | Hour 1-12 | h | Numeric: minimum digits | 1, 12 |
+ * | | hh | Numeric: 2 digits + zero padded | 01, 12 |
+ * | Hour 0-23 | H | Numeric: minimum digits | 0, 23 |
+ * | | HH | Numeric: 2 digits + zero padded | 00, 23 |
+ * | Minute | m | Numeric: minimum digits | 8, 59 |
+ * | | mm | Numeric: 2 digits + zero padded | 08, 59 |
+ * | Second | s | Numeric: minimum digits | 0... 59 |
+ * | | ss | Numeric: 2 digits + zero padded | 00... 59 |
+ * | Fractional seconds | S | Numeric: 1 digit | 0... 9 |
+ * | | SS | Numeric: 2 digits + zero padded | 00... 99 |
+ * | | SSS | Numeric: 3 digits + zero padded (= milliseconds) | 000... 999 |
+ * | Zone | z, zz & zzz | Short specific non location format (fallback to O) | GMT-8 |
+ * | | zzzz | Long specific non location format (fallback to OOOO) | GMT-08:00 |
+ * | | Z, ZZ & ZZZ | ISO8601 basic format | -0800 |
+ * | | ZZZZ | Long localized GMT format | GMT-8:00 |
+ * | | ZZZZZ | ISO8601 extended format + Z indicator for offset 0 (= XXXXX) | -08:00 |
+ * | | O, OO & OOO | Short localized GMT format | GMT-8 |
+ * | | OOOO | Long localized GMT format | GMT-08:00 |
+ *
+ *
+ * ### Format examples
+ *
+ * These examples transform a date into various formats,
+ * assuming that `dateObj` is a JavaScript `Date` object for
+ * year: 2015, month: 6, day: 15, hour: 21, minute: 43, second: 11,
+ * given in the local time for the `en-US` locale.
+ *
+ * ```
+ * {{ dateObj | date }} // output is 'Jun 15, 2015'
+ * {{ dateObj | date:'medium' }} // output is 'Jun 15, 2015, 9:43:11 PM'
+ * {{ dateObj | date:'shortTime' }} // output is '9:43 PM'
+ * {{ dateObj | date:'mm:ss' }} // output is '43:11'
+ * ```
+ *
+ * ### Usage example
+ *
+ * The following component uses a date pipe to display the current date in different formats.
+ *
+ * ```
+ * @Component({
+ * selector: 'date-pipe',
+ * template: `
+ *
Today is {{today | date}}
+ *
Or if you prefer, {{today | date:'fullDate'}}
+ *
The time is {{today | date:'h:mm a z'}}
+ *
`
+ * })
+ * // Get the current date and time as a date-time value.
+ * export class DatePipeComponent {
+ * today: number = Date.now();
+ * }
+ * ```
+ *
+ * @publicApi
+ */
+// clang-format on
+class DatePipe {
+ constructor(locale) {
+ this.locale = locale;
+ }
+ transform(value, format = 'mediumDate', timezone, locale) {
+ if (value == null || value === '' || value !== value)
+ return null;
+ try {
+ return formatDate(value, format, locale || this.locale, timezone);
+ }
+ catch (error) {
+ throw invalidPipeArgumentError(DatePipe, error.message);
+ }
+ }
+}
+DatePipe.ɵfac = function DatePipe_Factory(t) { return new (t || DatePipe)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["LOCALE_ID"])); };
+DatePipe.ɵpipe = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefinePipe"]({ name: "date", type: DatePipe, pure: true });
+DatePipe.ctorParameters = () => [
+ { type: String, decorators: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Inject"], args: [_angular_core__WEBPACK_IMPORTED_MODULE_0__["LOCALE_ID"],] }] }
+];
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](DatePipe, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Pipe"],
+ args: [{ name: 'date', pure: true }]
+ }], function () { return [{ type: String, decorators: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Inject"],
+ args: [_angular_core__WEBPACK_IMPORTED_MODULE_0__["LOCALE_ID"]]
+ }] }]; }, null); })();
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+const _INTERPOLATION_REGEXP = /#/g;
+/**
+ * @ngModule CommonModule
+ * @description
+ *
+ * Maps a value to a string that pluralizes the value according to locale rules.
+ *
+ * @usageNotes
+ *
+ * ### Example
+ *
+ * {@example common/pipes/ts/i18n_pipe.ts region='I18nPluralPipeComponent'}
+ *
+ * @publicApi
+ */
+class I18nPluralPipe {
+ constructor(_localization) {
+ this._localization = _localization;
+ }
+ /**
+ * @param value the number to be formatted
+ * @param pluralMap an object that mimics the ICU format, see
+ * http://userguide.icu-project.org/formatparse/messages.
+ * @param locale a `string` defining the locale to use (uses the current {@link LOCALE_ID} by
+ * default).
+ */
+ transform(value, pluralMap, locale) {
+ if (value == null)
+ return '';
+ if (typeof pluralMap !== 'object' || pluralMap === null) {
+ throw invalidPipeArgumentError(I18nPluralPipe, pluralMap);
+ }
+ const key = getPluralCategory(value, Object.keys(pluralMap), this._localization, locale);
+ return pluralMap[key].replace(_INTERPOLATION_REGEXP, value.toString());
+ }
+}
+I18nPluralPipe.ɵfac = function I18nPluralPipe_Factory(t) { return new (t || I18nPluralPipe)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](NgLocalization)); };
+I18nPluralPipe.ɵpipe = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefinePipe"]({ name: "i18nPlural", type: I18nPluralPipe, pure: true });
+I18nPluralPipe.ctorParameters = () => [
+ { type: NgLocalization }
+];
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](I18nPluralPipe, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Pipe"],
+ args: [{ name: 'i18nPlural', pure: true }]
+ }], function () { return [{ type: NgLocalization }]; }, null); })();
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * @ngModule CommonModule
+ * @description
+ *
+ * Generic selector that displays the string that matches the current value.
+ *
+ * If none of the keys of the `mapping` match the `value`, then the content
+ * of the `other` key is returned when present, otherwise an empty string is returned.
+ *
+ * @usageNotes
+ *
+ * ### Example
+ *
+ * {@example common/pipes/ts/i18n_pipe.ts region='I18nSelectPipeComponent'}
+ *
+ * @publicApi
+ */
+class I18nSelectPipe {
+ /**
+ * @param value a string to be internationalized.
+ * @param mapping an object that indicates the text that should be displayed
+ * for different values of the provided `value`.
+ */
+ transform(value, mapping) {
+ if (value == null)
+ return '';
+ if (typeof mapping !== 'object' || typeof value !== 'string') {
+ throw invalidPipeArgumentError(I18nSelectPipe, mapping);
+ }
+ if (mapping.hasOwnProperty(value)) {
+ return mapping[value];
+ }
+ if (mapping.hasOwnProperty('other')) {
+ return mapping['other'];
+ }
+ return '';
+ }
+}
+I18nSelectPipe.ɵfac = function I18nSelectPipe_Factory(t) { return new (t || I18nSelectPipe)(); };
+I18nSelectPipe.ɵpipe = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefinePipe"]({ name: "i18nSelect", type: I18nSelectPipe, pure: true });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](I18nSelectPipe, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Pipe"],
+ args: [{ name: 'i18nSelect', pure: true }]
+ }], null, null); })();
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * @ngModule CommonModule
+ * @description
+ *
+ * Converts a value into its JSON-format representation. Useful for debugging.
+ *
+ * @usageNotes
+ *
+ * The following component uses a JSON pipe to convert an object
+ * to JSON format, and displays the string in both formats for comparison.
+ *
+ * {@example common/pipes/ts/json_pipe.ts region='JsonPipe'}
+ *
+ * @publicApi
+ */
+class JsonPipe {
+ /**
+ * @param value A value of any type to convert into a JSON-format string.
+ */
+ transform(value) {
+ return JSON.stringify(value, null, 2);
+ }
+}
+JsonPipe.ɵfac = function JsonPipe_Factory(t) { return new (t || JsonPipe)(); };
+JsonPipe.ɵpipe = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefinePipe"]({ name: "json", type: JsonPipe, pure: false });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](JsonPipe, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Pipe"],
+ args: [{ name: 'json', pure: false }]
+ }], null, null); })();
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+function makeKeyValuePair(key, value) {
+ return { key: key, value: value };
+}
+/**
+ * @ngModule CommonModule
+ * @description
+ *
+ * Transforms Object or Map into an array of key value pairs.
+ *
+ * The output array will be ordered by keys.
+ * By default the comparator will be by Unicode point value.
+ * You can optionally pass a compareFn if your keys are complex types.
+ *
+ * @usageNotes
+ * ### Examples
+ *
+ * This examples show how an Object or a Map can be iterated by ngFor with the use of this
+ * keyvalue pipe.
+ *
+ * {@example common/pipes/ts/keyvalue_pipe.ts region='KeyValuePipe'}
+ *
+ * @publicApi
+ */
+class KeyValuePipe {
+ constructor(differs) {
+ this.differs = differs;
+ this.keyValues = [];
+ }
+ transform(input, compareFn = defaultComparator) {
+ if (!input || (!(input instanceof Map) && typeof input !== 'object')) {
+ return null;
+ }
+ if (!this.differ) {
+ // make a differ for whatever type we've been passed in
+ this.differ = this.differs.find(input).create();
+ }
+ const differChanges = this.differ.diff(input);
+ if (differChanges) {
+ this.keyValues = [];
+ differChanges.forEachItem((r) => {
+ this.keyValues.push(makeKeyValuePair(r.key, r.currentValue));
+ });
+ this.keyValues.sort(compareFn);
+ }
+ return this.keyValues;
+ }
+}
+KeyValuePipe.ɵfac = function KeyValuePipe_Factory(t) { return new (t || KeyValuePipe)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["KeyValueDiffers"])); };
+KeyValuePipe.ɵpipe = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefinePipe"]({ name: "keyvalue", type: KeyValuePipe, pure: false });
+KeyValuePipe.ctorParameters = () => [
+ { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["KeyValueDiffers"] }
+];
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](KeyValuePipe, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Pipe"],
+ args: [{ name: 'keyvalue', pure: false }]
+ }], function () { return [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["KeyValueDiffers"] }]; }, null); })();
+function defaultComparator(keyValueA, keyValueB) {
+ const a = keyValueA.key;
+ const b = keyValueB.key;
+ // if same exit with 0;
+ if (a === b)
+ return 0;
+ // make sure that undefined are at the end of the sort.
+ if (a === undefined)
+ return 1;
+ if (b === undefined)
+ return -1;
+ // make sure that nulls are at the end of the sort.
+ if (a === null)
+ return 1;
+ if (b === null)
+ return -1;
+ if (typeof a == 'string' && typeof b == 'string') {
+ return a < b ? -1 : 1;
+ }
+ if (typeof a == 'number' && typeof b == 'number') {
+ return a - b;
+ }
+ if (typeof a == 'boolean' && typeof b == 'boolean') {
+ return a < b ? -1 : 1;
+ }
+ // `a` and `b` are of different types. Compare their string values.
+ const aString = String(a);
+ const bString = String(b);
+ return aString == bString ? 0 : aString < bString ? -1 : 1;
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * @ngModule CommonModule
+ * @description
+ *
+ * Formats a value according to digit options and locale rules.
+ * Locale determines group sizing and separator,
+ * decimal point character, and other locale-specific configurations.
+ *
+ * @see `formatNumber()`
+ *
+ * @usageNotes
+ *
+ * ### digitsInfo
+ *
+ * The value's decimal representation is specified by the `digitsInfo`
+ * parameter, written in the following format:
+ *
+ * ```
+ * {minIntegerDigits}.{minFractionDigits}-{maxFractionDigits}
+ * ```
+ *
+ * - `minIntegerDigits`:
+ * The minimum number of integer digits before the decimal point.
+ * Default is 1.
+ *
+ * - `minFractionDigits`:
+ * The minimum number of digits after the decimal point.
+ * Default is 0.
+ *
+ * - `maxFractionDigits`:
+ * The maximum number of digits after the decimal point.
+ * Default is 3.
+ *
+ * If the formatted value is truncated it will be rounded using the "to-nearest" method:
+ *
+ * ```
+ * {{3.6 | number: '1.0-0'}}
+ *
+ *
+ * {{-3.6 | number:'1.0-0'}}
+ *
+ * ```
+ *
+ * ### locale
+ *
+ * `locale` will format a value according to locale rules.
+ * Locale determines group sizing and separator,
+ * decimal point character, and other locale-specific configurations.
+ *
+ * When not supplied, uses the value of `LOCALE_ID`, which is `en-US` by default.
+ *
+ * See [Setting your app locale](guide/i18n#setting-up-the-locale-of-your-app).
+ *
+ * ### Example
+ *
+ * The following code shows how the pipe transforms values
+ * according to various format specifications,
+ * where the caller's default locale is `en-US`.
+ *
+ *
+ *
+ * @publicApi
+ */
+class DecimalPipe {
+ constructor(_locale) {
+ this._locale = _locale;
+ }
+ /**
+ * @param value The value to be formatted.
+ * @param digitsInfo Sets digit and decimal representation.
+ * [See more](#digitsinfo).
+ * @param locale Specifies what locale format rules to use.
+ * [See more](#locale).
+ */
+ transform(value, digitsInfo, locale) {
+ if (!isValue(value))
+ return null;
+ locale = locale || this._locale;
+ try {
+ const num = strToNumber(value);
+ return formatNumber(num, locale, digitsInfo);
+ }
+ catch (error) {
+ throw invalidPipeArgumentError(DecimalPipe, error.message);
+ }
+ }
+}
+DecimalPipe.ɵfac = function DecimalPipe_Factory(t) { return new (t || DecimalPipe)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["LOCALE_ID"])); };
+DecimalPipe.ɵpipe = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefinePipe"]({ name: "number", type: DecimalPipe, pure: true });
+DecimalPipe.ctorParameters = () => [
+ { type: String, decorators: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Inject"], args: [_angular_core__WEBPACK_IMPORTED_MODULE_0__["LOCALE_ID"],] }] }
+];
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](DecimalPipe, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Pipe"],
+ args: [{ name: 'number' }]
+ }], function () { return [{ type: String, decorators: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Inject"],
+ args: [_angular_core__WEBPACK_IMPORTED_MODULE_0__["LOCALE_ID"]]
+ }] }]; }, null); })();
+/**
+ * @ngModule CommonModule
+ * @description
+ *
+ * Transforms a number to a percentage
+ * string, formatted according to locale rules that determine group sizing and
+ * separator, decimal-point character, and other locale-specific
+ * configurations.
+ *
+ * @see `formatPercent()`
+ *
+ * @usageNotes
+ * The following code shows how the pipe transforms numbers
+ * into text strings, according to various format specifications,
+ * where the caller's default locale is `en-US`.
+ *
+ *
+ *
+ * @publicApi
+ */
+class PercentPipe {
+ constructor(_locale) {
+ this._locale = _locale;
+ }
+ transform(value, digitsInfo, locale) {
+ if (!isValue(value))
+ return null;
+ locale = locale || this._locale;
+ try {
+ const num = strToNumber(value);
+ return formatPercent(num, locale, digitsInfo);
+ }
+ catch (error) {
+ throw invalidPipeArgumentError(PercentPipe, error.message);
+ }
+ }
+}
+PercentPipe.ɵfac = function PercentPipe_Factory(t) { return new (t || PercentPipe)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["LOCALE_ID"])); };
+PercentPipe.ɵpipe = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefinePipe"]({ name: "percent", type: PercentPipe, pure: true });
+PercentPipe.ctorParameters = () => [
+ { type: String, decorators: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Inject"], args: [_angular_core__WEBPACK_IMPORTED_MODULE_0__["LOCALE_ID"],] }] }
+];
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](PercentPipe, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Pipe"],
+ args: [{ name: 'percent' }]
+ }], function () { return [{ type: String, decorators: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Inject"],
+ args: [_angular_core__WEBPACK_IMPORTED_MODULE_0__["LOCALE_ID"]]
+ }] }]; }, null); })();
+/**
+ * @ngModule CommonModule
+ * @description
+ *
+ * Transforms a number to a currency string, formatted according to locale rules
+ * that determine group sizing and separator, decimal-point character,
+ * and other locale-specific configurations.
+ *
+ * {@a currency-code-deprecation}
+ *
+ *
+ * **Deprecation notice:**
+ *
+ * The default currency code is currently always `USD` but this is deprecated from v9.
+ *
+ * **In v11 the default currency code will be taken from the current locale identified by
+ * the `LOCALE_ID` token. See the [i18n guide](guide/i18n#setting-up-the-locale-of-your-app) for
+ * more information.**
+ *
+ * If you need the previous behavior then set it by creating a `DEFAULT_CURRENCY_CODE` provider in
+ * your application `NgModule`:
+ *
+ * ```ts
+ * {provide: DEFAULT_CURRENCY_CODE, useValue: 'USD'}
+ * ```
+ *
+ *
+ *
+ * @see `getCurrencySymbol()`
+ * @see `formatCurrency()`
+ *
+ * @usageNotes
+ * The following code shows how the pipe transforms numbers
+ * into text strings, according to various format specifications,
+ * where the caller's default locale is `en-US`.
+ *
+ *
+ *
+ * @publicApi
+ */
+class CurrencyPipe {
+ constructor(_locale, _defaultCurrencyCode = 'USD') {
+ this._locale = _locale;
+ this._defaultCurrencyCode = _defaultCurrencyCode;
+ }
+ transform(value, currencyCode, display = 'symbol', digitsInfo, locale) {
+ if (!isValue(value))
+ return null;
+ locale = locale || this._locale;
+ if (typeof display === 'boolean') {
+ if ((typeof ngDevMode === 'undefined' || ngDevMode) && console && console.warn) {
+ console.warn(`Warning: the currency pipe has been changed in Angular v5. The symbolDisplay option (third parameter) is now a string instead of a boolean. The accepted values are "code", "symbol" or "symbol-narrow".`);
+ }
+ display = display ? 'symbol' : 'code';
+ }
+ let currency = currencyCode || this._defaultCurrencyCode;
+ if (display !== 'code') {
+ if (display === 'symbol' || display === 'symbol-narrow') {
+ currency = getCurrencySymbol(currency, display === 'symbol' ? 'wide' : 'narrow', locale);
+ }
+ else {
+ currency = display;
+ }
+ }
+ try {
+ const num = strToNumber(value);
+ return formatCurrency(num, locale, currency, currencyCode, digitsInfo);
+ }
+ catch (error) {
+ throw invalidPipeArgumentError(CurrencyPipe, error.message);
+ }
+ }
+}
+CurrencyPipe.ɵfac = function CurrencyPipe_Factory(t) { return new (t || CurrencyPipe)(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["LOCALE_ID"]), _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdirectiveInject"](_angular_core__WEBPACK_IMPORTED_MODULE_0__["DEFAULT_CURRENCY_CODE"])); };
+CurrencyPipe.ɵpipe = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefinePipe"]({ name: "currency", type: CurrencyPipe, pure: true });
+CurrencyPipe.ctorParameters = () => [
+ { type: String, decorators: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Inject"], args: [_angular_core__WEBPACK_IMPORTED_MODULE_0__["LOCALE_ID"],] }] },
+ { type: String, decorators: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Inject"], args: [_angular_core__WEBPACK_IMPORTED_MODULE_0__["DEFAULT_CURRENCY_CODE"],] }] }
+];
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](CurrencyPipe, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Pipe"],
+ args: [{ name: 'currency' }]
+ }], function () { return [{ type: String, decorators: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Inject"],
+ args: [_angular_core__WEBPACK_IMPORTED_MODULE_0__["LOCALE_ID"]]
+ }] }, { type: String, decorators: [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Inject"],
+ args: [_angular_core__WEBPACK_IMPORTED_MODULE_0__["DEFAULT_CURRENCY_CODE"]]
+ }] }]; }, null); })();
+function isValue(value) {
+ return !(value == null || value === '' || value !== value);
+}
+/**
+ * Transforms a string into a number (if needed).
+ */
+function strToNumber(value) {
+ // Convert strings to numbers
+ if (typeof value === 'string' && !isNaN(Number(value) - parseFloat(value))) {
+ return Number(value);
+ }
+ if (typeof value !== 'number') {
+ throw new Error(`${value} is not a number`);
+ }
+ return value;
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * @ngModule CommonModule
+ * @description
+ *
+ * Creates a new `Array` or `String` containing a subset (slice) of the elements.
+ *
+ * @usageNotes
+ *
+ * All behavior is based on the expected behavior of the JavaScript API `Array.prototype.slice()`
+ * and `String.prototype.slice()`.
+ *
+ * When operating on an `Array`, the returned `Array` is always a copy even when all
+ * the elements are being returned.
+ *
+ * When operating on a blank value, the pipe returns the blank value.
+ *
+ * ### List Example
+ *
+ * This `ngFor` example:
+ *
+ * {@example common/pipes/ts/slice_pipe.ts region='SlicePipe_list'}
+ *
+ * produces the following:
+ *
+ * ```html
+ * b
+ * c
+ * ```
+ *
+ * ### String Examples
+ *
+ * {@example common/pipes/ts/slice_pipe.ts region='SlicePipe_string'}
+ *
+ * @publicApi
+ */
+class SlicePipe {
+ transform(value, start, end) {
+ if (value == null)
+ return null;
+ if (!this.supports(value)) {
+ throw invalidPipeArgumentError(SlicePipe, value);
+ }
+ return value.slice(start, end);
+ }
+ supports(obj) {
+ return typeof obj === 'string' || Array.isArray(obj);
+ }
+}
+SlicePipe.ɵfac = function SlicePipe_Factory(t) { return new (t || SlicePipe)(); };
+SlicePipe.ɵpipe = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefinePipe"]({ name: "slice", type: SlicePipe, pure: false });
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](SlicePipe, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Pipe"],
+ args: [{ name: 'slice', pure: false }]
+ }], null, null); })();
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * A collection of Angular pipes that are likely to be used in each and every application.
+ */
+const COMMON_PIPES = [
+ AsyncPipe,
+ UpperCasePipe,
+ LowerCasePipe,
+ JsonPipe,
+ SlicePipe,
+ DecimalPipe,
+ PercentPipe,
+ TitleCasePipe,
+ CurrencyPipe,
+ DatePipe,
+ I18nPluralPipe,
+ I18nSelectPipe,
+ KeyValuePipe,
+];
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+// Note: This does not contain the location providers,
+// as they need some platform specific implementations to work.
+/**
+ * Exports all the basic Angular directives and pipes,
+ * such as `NgIf`, `NgForOf`, `DecimalPipe`, and so on.
+ * Re-exported by `BrowserModule`, which is included automatically in the root
+ * `AppModule` when you create a new app with the CLI `new` command.
+ *
+ * * The `providers` options configure the NgModule's injector to provide
+ * localization dependencies to members.
+ * * The `exports` options make the declared directives and pipes available for import
+ * by other NgModules.
+ *
+ * @publicApi
+ */
+class CommonModule {
+}
+CommonModule.ɵfac = function CommonModule_Factory(t) { return new (t || CommonModule)(); };
+CommonModule.ɵmod = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineNgModule"]({ type: CommonModule });
+CommonModule.ɵinj = _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineInjector"]({ providers: [
+ { provide: NgLocalization, useClass: NgLocaleLocalization },
+ ] });
+(function () { (typeof ngJitMode === "undefined" || ngJitMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵsetNgModuleScope"](CommonModule, { declarations: [NgClass, NgComponentOutlet, NgForOf, NgIf, NgTemplateOutlet, NgStyle, NgSwitch, NgSwitchCase, NgSwitchDefault, NgPlural, NgPluralCase, AsyncPipe, UpperCasePipe, LowerCasePipe, JsonPipe, SlicePipe, DecimalPipe, PercentPipe, TitleCasePipe, CurrencyPipe, DatePipe, I18nPluralPipe, I18nSelectPipe, KeyValuePipe], exports: [NgClass, NgComponentOutlet, NgForOf, NgIf, NgTemplateOutlet, NgStyle, NgSwitch, NgSwitchCase, NgSwitchDefault, NgPlural, NgPluralCase, AsyncPipe, UpperCasePipe, LowerCasePipe, JsonPipe, SlicePipe, DecimalPipe, PercentPipe, TitleCasePipe, CurrencyPipe, DatePipe, I18nPluralPipe, I18nSelectPipe, KeyValuePipe] }); })();
+(function () { (typeof ngDevMode === "undefined" || ngDevMode) && _angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵsetClassMetadata"](CommonModule, [{
+ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["NgModule"],
+ args: [{
+ declarations: [COMMON_DIRECTIVES, COMMON_PIPES],
+ exports: [COMMON_DIRECTIVES, COMMON_PIPES],
+ providers: [
+ { provide: NgLocalization, useClass: NgLocaleLocalization },
+ ]
+ }]
+ }], null, null); })();
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+const PLATFORM_BROWSER_ID = 'browser';
+const PLATFORM_SERVER_ID = 'server';
+const PLATFORM_WORKER_APP_ID = 'browserWorkerApp';
+const PLATFORM_WORKER_UI_ID = 'browserWorkerUi';
+/**
+ * Returns whether a platform id represents a browser platform.
+ * @publicApi
+ */
+function isPlatformBrowser(platformId) {
+ return platformId === PLATFORM_BROWSER_ID;
+}
+/**
+ * Returns whether a platform id represents a server platform.
+ * @publicApi
+ */
+function isPlatformServer(platformId) {
+ return platformId === PLATFORM_SERVER_ID;
+}
+/**
+ * Returns whether a platform id represents a web worker app platform.
+ * @publicApi
+ */
+function isPlatformWorkerApp(platformId) {
+ return platformId === PLATFORM_WORKER_APP_ID;
+}
+/**
+ * Returns whether a platform id represents a web worker UI platform.
+ * @publicApi
+ */
+function isPlatformWorkerUi(platformId) {
+ return platformId === PLATFORM_WORKER_UI_ID;
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * @publicApi
+ */
+const VERSION = new _angular_core__WEBPACK_IMPORTED_MODULE_0__["Version"]('11.2.14');
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * Defines a scroll position manager. Implemented by `BrowserViewportScroller`.
+ *
+ * @publicApi
+ */
+class ViewportScroller {
+}
+// De-sugared tree-shakable injection
+// See #23917
+/** @nocollapse */
+ViewportScroller.ɵprov = Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵdefineInjectable"])({
+ token: ViewportScroller,
+ providedIn: 'root',
+ factory: () => new BrowserViewportScroller(Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ɵɵinject"])(DOCUMENT), window)
+});
+/**
+ * Manages the scroll position for a browser window.
+ */
+class BrowserViewportScroller {
+ constructor(document, window) {
+ this.document = document;
+ this.window = window;
+ this.offset = () => [0, 0];
+ }
+ /**
+ * Configures the top offset used when scrolling to an anchor.
+ * @param offset A position in screen coordinates (a tuple with x and y values)
+ * or a function that returns the top offset position.
+ *
+ */
+ setOffset(offset) {
+ if (Array.isArray(offset)) {
+ this.offset = () => offset;
+ }
+ else {
+ this.offset = offset;
+ }
+ }
+ /**
+ * Retrieves the current scroll position.
+ * @returns The position in screen coordinates.
+ */
+ getScrollPosition() {
+ if (this.supportsScrolling()) {
+ return [this.window.pageXOffset, this.window.pageYOffset];
+ }
+ else {
+ return [0, 0];
+ }
+ }
+ /**
+ * Sets the scroll position.
+ * @param position The new position in screen coordinates.
+ */
+ scrollToPosition(position) {
+ if (this.supportsScrolling()) {
+ this.window.scrollTo(position[0], position[1]);
+ }
+ }
+ /**
+ * Scrolls to an element and attempts to focus the element.
+ *
+ * Note that the function name here is misleading in that the target string may be an ID for a
+ * non-anchor element.
+ *
+ * @param target The ID of an element or name of the anchor.
+ *
+ * @see https://html.spec.whatwg.org/#the-indicated-part-of-the-document
+ * @see https://html.spec.whatwg.org/#scroll-to-fragid
+ */
+ scrollToAnchor(target) {
+ if (!this.supportsScrolling()) {
+ return;
+ }
+ // TODO(atscott): The correct behavior for `getElementsByName` would be to also verify that the
+ // element is an anchor. However, this could be considered a breaking change and should be
+ // done in a major version.
+ const elSelected = findAnchorFromDocument(this.document, target);
+ if (elSelected) {
+ this.scrollToElement(elSelected);
+ // After scrolling to the element, the spec dictates that we follow the focus steps for the
+ // target. Rather than following the robust steps, simply attempt focus.
+ this.attemptFocus(elSelected);
+ }
+ }
+ /**
+ * Disables automatic scroll restoration provided by the browser.
+ */
+ setHistoryScrollRestoration(scrollRestoration) {
+ if (this.supportScrollRestoration()) {
+ const history = this.window.history;
+ if (history && history.scrollRestoration) {
+ history.scrollRestoration = scrollRestoration;
+ }
+ }
+ }
+ /**
+ * Scrolls to an element using the native offset and the specified offset set on this scroller.
+ *
+ * The offset can be used when we know that there is a floating header and scrolling naively to an
+ * element (ex: `scrollIntoView`) leaves the element hidden behind the floating header.
+ */
+ scrollToElement(el) {
+ const rect = el.getBoundingClientRect();
+ const left = rect.left + this.window.pageXOffset;
+ const top = rect.top + this.window.pageYOffset;
+ const offset = this.offset();
+ this.window.scrollTo(left - offset[0], top - offset[1]);
+ }
+ /**
+ * Calls `focus` on the `focusTarget` and returns `true` if the element was focused successfully.
+ *
+ * If `false`, further steps may be necessary to determine a valid substitute to be focused
+ * instead.
+ *
+ * @see https://html.spec.whatwg.org/#get-the-focusable-area
+ * @see https://developer.mozilla.org/en-US/docs/Web/API/HTMLOrForeignElement/focus
+ * @see https://html.spec.whatwg.org/#focusable-area
+ */
+ attemptFocus(focusTarget) {
+ focusTarget.focus();
+ return this.document.activeElement === focusTarget;
+ }
+ /**
+ * We only support scroll restoration when we can get a hold of window.
+ * This means that we do not support this behavior when running in a web worker.
+ *
+ * Lifting this restriction right now would require more changes in the dom adapter.
+ * Since webworkers aren't widely used, we will lift it once RouterScroller is
+ * battle-tested.
+ */
+ supportScrollRestoration() {
+ try {
+ if (!this.supportsScrolling()) {
+ return false;
+ }
+ // The `scrollRestoration` property could be on the `history` instance or its prototype.
+ const scrollRestorationDescriptor = getScrollRestorationProperty(this.window.history) ||
+ getScrollRestorationProperty(Object.getPrototypeOf(this.window.history));
+ // We can write to the `scrollRestoration` property if it is a writable data field or it has a
+ // setter function.
+ return !!scrollRestorationDescriptor &&
+ !!(scrollRestorationDescriptor.writable || scrollRestorationDescriptor.set);
+ }
+ catch (_a) {
+ return false;
+ }
+ }
+ supportsScrolling() {
+ try {
+ return !!this.window && !!this.window.scrollTo && 'pageXOffset' in this.window;
+ }
+ catch (_a) {
+ return false;
+ }
+ }
+}
+function getScrollRestorationProperty(obj) {
+ return Object.getOwnPropertyDescriptor(obj, 'scrollRestoration');
+}
+function findAnchorFromDocument(document, target) {
+ const documentResult = document.getElementById(target) || document.getElementsByName(target)[0];
+ if (documentResult) {
+ return documentResult;
+ }
+ // `getElementById` and `getElementsByName` won't pierce through the shadow DOM so we
+ // have to traverse the DOM manually and do the lookup through the shadow roots.
+ if (typeof document.createTreeWalker === 'function' && document.body &&
+ (document.body.createShadowRoot || document.body.attachShadow)) {
+ const treeWalker = document.createTreeWalker(document.body, NodeFilter.SHOW_ELEMENT);
+ let currentNode = treeWalker.currentNode;
+ while (currentNode) {
+ const shadowRoot = currentNode.shadowRoot;
+ if (shadowRoot) {
+ // Note that `ShadowRoot` doesn't support `getElementsByName`
+ // so we have to fall back to `querySelector`.
+ const result = shadowRoot.getElementById(target) || shadowRoot.querySelector(`[name="${target}"]`);
+ if (result) {
+ return result;
+ }
+ }
+ currentNode = treeWalker.nextNode();
+ }
+ }
+ return null;
+}
+/**
+ * Provides an empty implementation of the viewport scroller.
+ */
+class NullViewportScroller {
+ /**
+ * Empty implementation
+ */
+ setOffset(offset) { }
+ /**
+ * Empty implementation
+ */
+ getScrollPosition() {
+ return [0, 0];
+ }
+ /**
+ * Empty implementation
+ */
+ scrollToPosition(position) { }
+ /**
+ * Empty implementation
+ */
+ scrollToAnchor(anchor) { }
+ /**
+ * Empty implementation
+ */
+ setHistoryScrollRestoration(scrollRestoration) { }
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+// This file only reexports content of the `src` folder. Keep it that way.
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+
+/**
+ * Generated bundle index. Do not edit.
+ */
+
+
+
+//# sourceMappingURL=common.js.map
+
+/***/ }),
+
+/***/ "./node_modules/@angular/common/locales/az.js":
+/*!****************************************************!*\
+ !*** ./node_modules/@angular/common/locales/az.js ***!
+ \****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+(function (factory) {
+ if ( true && typeof module.exports === "object") {
+ var v = factory(null, exports);
+ if (v !== undefined) module.exports = v;
+ }
+ else if (true) {
+ !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),
+ __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
+ (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),
+ __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+ }
+})(function (require, exports) {
+ "use strict";
+ Object.defineProperty(exports, "__esModule", { value: true });
+ // THIS CODE IS GENERATED - DO NOT MODIFY
+ // See angular/tools/gulp-tasks/cldr/extract.js
+ var u = undefined;
+ function plural(n) {
+ if (n === 1)
+ return 1;
+ return 5;
+ }
+ exports.default = [
+ 'az',
+ [['a', 'p'], ['AM', 'PM'], u],
+ [['AM', 'PM'], u, u],
+ [
+ ['7', '1', '2', '3', '4', '5', '6'], ['B.', 'B.e.', 'Ç.a.', 'Ç.', 'C.a.', 'C.', 'Ş.'],
+ ['bazar', 'bazar ertəsi', 'çərşənbə axşamı', 'çərşənbə', 'cümə axşamı', 'cümə', 'şənbə'],
+ ['B.', 'B.E.', 'Ç.A.', 'Ç.', 'C.A.', 'C.', 'Ş.']
+ ],
+ [
+ ['7', '1', '2', '3', '4', '5', '6'], ['B.', 'B.E.', 'Ç.A.', 'Ç.', 'C.A.', 'C.', 'Ş.'],
+ ['bazar', 'bazar ertəsi', 'çərşənbə axşamı', 'çərşənbə', 'cümə axşamı', 'cümə', 'şənbə'],
+ ['B.', 'B.E.', 'Ç.A.', 'Ç.', 'C.A.', 'C.', 'Ş.']
+ ],
+ [
+ ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],
+ ['yan', 'fev', 'mar', 'apr', 'may', 'iyn', 'iyl', 'avq', 'sen', 'okt', 'noy', 'dek'],
+ [
+ 'yanvar', 'fevral', 'mart', 'aprel', 'may', 'iyun', 'iyul', 'avqust', 'sentyabr', 'oktyabr',
+ 'noyabr', 'dekabr'
+ ]
+ ],
+ [
+ ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],
+ ['yan', 'fev', 'mar', 'apr', 'may', 'iyn', 'iyl', 'avq', 'sen', 'okt', 'noy', 'dek'],
+ [
+ 'yanvar', 'Fevral', 'mart', 'Aprel', 'May', 'İyun', 'İyul', 'Avqust', 'Sentyabr', 'Oktyabr',
+ 'Noyabr', 'dekabr'
+ ]
+ ],
+ [['e.ə.', 'y.e.'], u, ['eramızdan əvvəl', 'yeni era']],
+ 1,
+ [6, 0],
+ ['dd.MM.yy', 'd MMM y', 'd MMMM y', 'd MMMM y, EEEE'],
+ ['HH:mm', 'HH:mm:ss', 'HH:mm:ss z', 'HH:mm:ss zzzz'],
+ ['{1} {0}', u, u, u],
+ [',', '.', ';', '%', '+', '-', 'E', '×', '‰', '∞', 'NaN', ':'],
+ ['#,##0.###', '#,##0%', '#,##0.00 ¤', '#E0'],
+ 'AZN',
+ '₼',
+ 'Azərbaycan Manatı',
+ {
+ 'AZN': ['₼'],
+ 'JPY': ['JP¥', '¥'],
+ 'RON': [u, 'ley'],
+ 'SYP': [u, 'S£'],
+ 'THB': ['฿'],
+ 'TWD': ['NT$'],
+ 'USD': ['US$', '$']
+ },
+ 'ltr',
+ plural
+ ];
+});
+//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXouanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21tb24vbG9jYWxlcy9hei50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7Ozs7Ozs7Ozs7OztJQUVILHlDQUF5QztJQUN6QywrQ0FBK0M7SUFFL0MsSUFBTSxDQUFDLEdBQUcsU0FBUyxDQUFDO0lBRXBCLFNBQVMsTUFBTSxDQUFDLENBQVM7UUFDdkIsSUFBSSxDQUFDLEtBQUssQ0FBQztZQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3RCLE9BQU8sQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUVELGtCQUFlO1FBQ2IsSUFBSTtRQUNKLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzdCLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNwQjtZQUNFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUM7WUFDckYsQ0FBQyxPQUFPLEVBQUUsY0FBYyxFQUFFLGlCQUFpQixFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQztZQUN4RixDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQztTQUNqRDtRQUNEO1lBQ0UsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFB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R0FBRyxDQUFDO1NBQ3BCO1FBQ0QsS0FBSztRQUNMLE1BQU07S0FDUCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbi8vIFRISVMgQ09ERSBJUyBHRU5FUkFURUQgLSBETyBOT1QgTU9ESUZZXG4vLyBTZWUgYW5ndWxhci90b29scy9ndWxwLXRhc2tzL2NsZHIvZXh0cmFjdC5qc1xuXG5jb25zdCB1ID0gdW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBwbHVyYWwobjogbnVtYmVyKTogbnVtYmVyIHtcbiAgaWYgKG4gPT09IDEpIHJldHVybiAxO1xuICByZXR1cm4gNTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgW1xuICAnYXonLFxuICBbWydhJywgJ3AnXSwgWydBTScsICdQTSddLCB1XSxcbiAgW1snQU0nLCAnUE0nXSwgdSwgdV0sXG4gIFtcbiAgICBbJzcnLCAnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnXSwgWydCLicsICdCLmUuJywgJ8OHLmEuJywgJ8OHLicsICdDLmEuJywgJ0MuJywgJ8WeLiddLFxuICAgIFsnYmF6YXInLCAnYmF6YXIgZXJ0yZlzaScsICfDp8mZcsWfyZluYsmZIGF4xZ9hbcSxJywgJ8OnyZlyxZ/JmW5iyZknLCAnY8O8bcmZIGF4xZ9hbcSxJywgJ2PDvG3JmScsICfFn8mZbmLJmSddLFxuICAgIFsnQi4nLCAnQi5FLicsICfDhy5BLicsICfDhy4nLCAnQy5BLicsICdDLicsICfFni4nXVxuICBdLFxuICBbXG4gICAgWyc3JywgJzEnLCAnMicsICczJywgJzQnLCAnNScsICc2J10sIFsnQi4nLCAnQi5FLicsICfDhy5BLicsICfDhy4nLCAnQy5BLicsICdDLicsICfFni4nXSxcbiAgICBbJ2JhemFyJywgJ2JhemFyIGVydMmZc2knLCAnw6fJmXLFn8mZbmLJmSBheMWfYW3EsScsICfDp8mZcsWfyZluYsmZJywgJ2PDvG3JmSBheMWfYW3EsScsICdjw7xtyZknLCAnxZ/JmW5iyZknXSxcbiAgICBbJ0IuJywgJ0IuRS4nLCAnw4cuQS4nLCAnw4cuJywgJ0MuQS4nLCAnQy4nLCAnxZ4uJ11cbiAgXSxcbiAgW1xuICAgIFsnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLCAnNycsICc4JywgJzknLCAnMTAnLCAnMTEnLCAnMTInXSxcbiAgICBbJ3lhbicsICdmZXYnLCAnbWFyJywgJ2FwcicsICdtYXknLCAnaXluJywgJ2l5bCcsICdhdnEnLCAnc2VuJywgJ29rdCcsICdub3knLCAnZGVrJ10sXG4gICAgW1xuICAgICAgJ3lhbnZhcicsICdmZXZyYWwnLCAnbWFydCcsICdhcHJlbCcsICdtYXknLCAnaXl1bicsICdpeXVsJywgJ2F2cXVzdCcsICdzZW50eWFicicsICdva3R5YWJyJyxcbiAgICAgICdub3lhYnInLCAnZGVrYWJyJ1xuICAgIF1cbiAgXSxcbiAgW1xuICAgIFsnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLCAnNycsICc4JywgJzknLCAnMTAnLCAnMTEnLCAnMTInXSxcbiAgICBbJ3lhbicsICdmZXYnLCAnbWFyJywgJ2FwcicsICdtYXknLCAnaXluJywgJ2l5bCcsICdhdnEnLCAnc2VuJywgJ29rdCcsICdub3knLCAnZGVrJ10sXG4gICAgW1xuICAgICAgJ3lhbnZhcicsICdGZXZyYWwnLCAnbWFydCcsICdBcHJlbCcsICdNYXknLCAnxLB5dW4nLCAnxLB5dWwnLCAnQXZxdXN0JywgJ1NlbnR5YWJyJywgJ09rdHlhYnInLFxuICAgICAgJ05veWFicicsICdkZWthYnInXG4gICAgXVxuICBdLFxuICBbWydlLsmZLicsICd5LmUuJ10sIHUsIFsnZXJhbcSxemRhbiDJmXZ2yZlsJywgJ3llbmkgZXJhJ11dLFxuICAxLFxuICBbNiwgMF0sXG4gIFsnZGQuTU0ueXknLCAnZCBNTU0geScsICdkIE1NTU0geScsICdkIE1NTU0geSwgRUVFRSddLFxuICBbJ0hIOm1tJywgJ0hIOm1tOnNzJywgJ0hIOm1tOnNzIHonLCAnSEg6bW06c3Mgenp6eiddLFxuICBbJ3sxfSB7MH0nLCB1LCB1LCB1XSxcbiAgWycsJywgJy4nLCAnOycsICclJywgJysnLCAnLScsICdFJywgJ8OXJywgJ+KAsCcsICfiiJ4nLCAnTmFOJywgJzonXSxcbiAgWycjLCMjMC4jIyMnLCAnIywjIzAlJywgJyMsIyMwLjAwwqDCpCcsICcjRTAnXSxcbiAgJ0FaTicsXG4gICfigrwnLFxuICAnQXrJmXJiYXljYW4gTWFuYXTEsScsXG4gIHtcbiAgICAnQVpOJzogWyfigrwnXSxcbiAgICAnSlBZJzogWydKUMKlJywgJ8KlJ10sXG4gICAgJ1JPTic6IFt1LCAnbGV5J10sXG4gICAgJ1NZUCc6IFt1LCAnU8KjJ10sXG4gICAgJ1RIQic6IFsn4Li/J10sXG4gICAgJ1RXRCc6IFsnTlQkJ10sXG4gICAgJ1VTRCc6IFsnVVMkJywgJyQnXVxuICB9LFxuICAnbHRyJyxcbiAgcGx1cmFsXG5dO1xuIl19
+
+/***/ }),
+
+/***/ "./node_modules/@angular/common/locales/be.js":
+/*!****************************************************!*\
+ !*** ./node_modules/@angular/common/locales/be.js ***!
+ \****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+(function (factory) {
+ if ( true && typeof module.exports === "object") {
+ var v = factory(null, exports);
+ if (v !== undefined) module.exports = v;
+ }
+ else if (true) {
+ !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),
+ __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
+ (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),
+ __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+ }
+})(function (require, exports) {
+ "use strict";
+ Object.defineProperty(exports, "__esModule", { value: true });
+ // THIS CODE IS GENERATED - DO NOT MODIFY
+ // See angular/tools/gulp-tasks/cldr/extract.js
+ var u = undefined;
+ function plural(n) {
+ if (n % 10 === 1 && !(n % 100 === 11))
+ return 1;
+ if (n % 10 === Math.floor(n % 10) && n % 10 >= 2 && n % 10 <= 4 &&
+ !(n % 100 >= 12 && n % 100 <= 14))
+ return 3;
+ if (n % 10 === 0 || n % 10 === Math.floor(n % 10) && n % 10 >= 5 && n % 10 <= 9 ||
+ n % 100 === Math.floor(n % 100) && n % 100 >= 11 && n % 100 <= 14)
+ return 4;
+ return 5;
+ }
+ exports.default = [
+ 'be',
+ [['am', 'pm'], ['AM', 'PM'], u],
+ [['AM', 'PM'], u, u],
+ [
+ ['н', 'п', 'а', 'с', 'ч', 'п', 'с'], ['нд', 'пн', 'аў', 'ср', 'чц', 'пт', 'сб'],
+ ['нядзеля', 'панядзелак', 'аўторак', 'серада', 'чацвер', 'пятніца', 'субота'],
+ ['нд', 'пн', 'аў', 'ср', 'чц', 'пт', 'сб']
+ ],
+ u,
+ [
+ ['с', 'л', 'с', 'к', 'м', 'ч', 'л', 'ж', 'в', 'к', 'л', 'с'],
+ ['сту', 'лют', 'сак', 'кра', 'мая', 'чэр', 'ліп', 'жні', 'вер', 'кас', 'ліс', 'сне'],
+ [
+ 'студзеня', 'лютага', 'сакавіка', 'красавіка', 'мая', 'чэрвеня', 'ліпеня', 'жніўня',
+ 'верасня', 'кастрычніка', 'лістапада', 'снежня'
+ ]
+ ],
+ [
+ ['с', 'л', 'с', 'к', 'м', 'ч', 'л', 'ж', 'в', 'к', 'л', 'с'],
+ ['сту', 'лют', 'сак', 'кра', 'май', 'чэр', 'ліп', 'жні', 'вер', 'кас', 'ліс', 'сне'],
+ [
+ 'студзень', 'люты', 'сакавік', 'красавік', 'май', 'чэрвень', 'ліпень', 'жнівень', 'верасень',
+ 'кастрычнік', 'лістапад', 'снежань'
+ ]
+ ],
+ [['да н.э.', 'н.э.'], u, ['да нараджэння Хрыстова', 'ад нараджэння Хрыстова']],
+ 1,
+ [6, 0],
+ ['d.MM.yy', 'd.MM.y', 'd MMMM y \'г\'.', 'EEEE, d MMMM y \'г\'.'],
+ ['HH:mm', 'HH:mm:ss', 'HH:mm:ss z', 'HH:mm:ss, zzzz'],
+ ['{1}, {0}', u, '{1} \'у\' {0}', u],
+ [',', ' ', ';', '%', '+', '-', 'E', '×', '‰', '∞', 'NaN', ':'],
+ ['#,##0.###', '#,##0 %', '#,##0.00 ¤', '#E0'],
+ 'BYN',
+ 'Br',
+ 'беларускі рубель',
+ {
+ 'AUD': ['A$'],
+ 'BBD': [u, 'Bds$'],
+ 'BMD': [u, 'BD$'],
+ 'BRL': [u, 'R$'],
+ 'BSD': [u, 'B$'],
+ 'BYN': ['Br'],
+ 'BZD': [u, 'BZ$'],
+ 'CAD': [u, 'CA$'],
+ 'CUC': [u, 'CUC$'],
+ 'CUP': [u, '$MN'],
+ 'DOP': [u, 'RD$'],
+ 'FJD': [u, 'FJ$'],
+ 'FKP': [u, 'FK£'],
+ 'GYD': [u, 'G$'],
+ 'ISK': [u, 'Íkr'],
+ 'JMD': [u, 'J$'],
+ 'KYD': [u, 'CI$'],
+ 'LRD': [u, 'L$'],
+ 'MXN': ['MX$'],
+ 'NAD': [u, 'N$'],
+ 'NZD': [u, 'NZ$'],
+ 'RUB': ['₽', 'руб.'],
+ 'SBD': [u, 'SI$'],
+ 'SGD': [u, 'S$'],
+ 'TTD': [u, 'TT$'],
+ 'UYU': [u, '$U'],
+ 'XCD': ['EC$']
+ },
+ 'ltr',
+ plural
+ ];
+});
+//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21tb24vbG9jYWxlcy9iZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7Ozs7Ozs7Ozs7OztJQUVILHlDQUF5QztJQUN6QywrQ0FBK0M7SUFFL0MsSUFBTSxDQUFDLEdBQUcsU0FBUyxDQUFDO0lBRXBCLFNBQVMsTUFBTSxDQUFDLENBQVM7UUFDdkIsSUFBSSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsS0FBSyxFQUFFLENBQUM7WUFBRSxPQUFPLENBQUMsQ0FBQztRQUNoRCxJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDO1lBQzNELENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxJQUFJLEVBQUUsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLEVBQUUsQ0FBQztZQUNuQyxPQUFPLENBQUMsQ0FBQztRQUNYLElBQUksQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsS0FBSyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUM7WUFDM0UsQ0FBQyxHQUFHLEdBQUcsS0FBSyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLEVBQUUsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLEVBQUU7WUFDbkUsT0FBTyxDQUFDLENBQUM7UUFDWCxPQUFPLENBQUMsQ0FBQztJQUNYLENB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TCxJQUFJO1FBQ0osa0JBQWtCO1FBQ2xCO1lBQ0UsS0FBSyxFQUFFLENBQUMsSUFBSSxDQUFDO1lBQ2IsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQztZQUNsQixLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDO1lBQ2pCLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUM7WUFDaEIsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQztZQUNoQixLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUM7WUFDYixLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDO1lBQ2pCLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUM7WUFDakIsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQztZQUNsQixLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDO1lBQ2pCLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUM7WUFDakIsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQztZQUNqQixLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDO1lBQ2pCLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUM7WUFDaEIsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQztZQUNqQixLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDO1lBQ2hCLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUM7WUFDakIsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQztZQUNoQixLQUFLLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDZCxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDO1lBQ2hCLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUM7WUFDakIsS0FBSyxFQUFFLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQztZQUNwQixLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDO1lBQ2pCLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUM7WUFDaEIsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQztZQUNqQixLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDO1lBQ2hCLEtBQUssRUFBRSxDQUFDLEtBQUssQ0FBQztTQUNmO1FBQ0QsS0FBSztRQUNMLE1BQU07S0FDUCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbi8vIFRISVMgQ09ERSBJUyBHRU5FUkFURUQgLSBETyBOT1QgTU9ESUZZXG4vLyBTZWUgYW5ndWxhci90b29scy9ndWxwLXRhc2tzL2NsZHIvZXh0cmFjdC5qc1xuXG5jb25zdCB1ID0gdW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBwbHVyYWwobjogbnVtYmVyKTogbnVtYmVyIHtcbiAgaWYgKG4gJSAxMCA9PT0gMSAmJiAhKG4gJSAxMDAgPT09IDExKSkgcmV0dXJuIDE7XG4gIGlmIChuICUgMTAgPT09IE1hdGguZmxvb3IobiAlIDEwKSAmJiBuICUgMTAgPj0gMiAmJiBuICUgMTAgPD0gNCAmJlxuICAgICAgIShuICUgMTAwID49IDEyICYmIG4gJSAxMDAgPD0gMTQpKVxuICAgIHJldHVybiAzO1xuICBpZiAobiAlIDEwID09PSAwIHx8IG4gJSAxMCA9PT0gTWF0aC5mbG9vcihuICUgMTApICYmIG4gJSAxMCA+PSA1ICYmIG4gJSAxMCA8PSA5IHx8XG4gICAgICBuICUgMTAwID09PSBNYXRoLmZsb29yKG4gJSAxMDApICYmIG4gJSAxMDAgPj0gMTEgJiYgbiAlIDEwMCA8PSAxNClcbiAgICByZXR1cm4gNDtcbiAgcmV0dXJuIDU7XG59XG5cbmV4cG9ydCBkZWZhdWx0IFtcbiAgJ2JlJyxcbiAgW1snYW0nLCAncG0nXSwgWydBTScsICdQTSddLCB1XSxcbiAgW1snQU0nLCAnUE0nXSwgdSwgdV0sXG4gIFtcbiAgICBbJ9C9JywgJ9C/JywgJ9CwJywgJ9GBJywgJ9GHJywgJ9C/JywgJ9GBJ10sIFsn0L3QtCcsICfQv9C9JywgJ9Cw0Z4nLCAn0YHRgCcsICfRh9GGJywgJ9C/0YInLCAn0YHQsSddLFxuICAgIFsn0L3Rj9C00LfQtdC70Y8nLCAn0L/QsNC90Y/QtNC30LXQu9Cw0LonLCAn0LDRntGC0L7RgNCw0LonLCAn0YHQtdGA0LDQtNCwJywgJ9GH0LDRhtCy0LXRgCcsICfQv9GP0YLQvdGW0YbQsCcsICfRgdGD0LHQvtGC0LAnXSxcbiAgICBbJ9C90LQnLCAn0L/QvScsICfQsNGeJywgJ9GB0YAnLCAn0YfRhicsICfQv9GCJywgJ9GB0LEnXVxuICBdLFxuICB1LFxuICBbXG4gICAgWyfRgScsICfQuycsICfRgScsICfQuicsICfQvCcsICfRhycsICfQuycsICfQticsICfQsicsICfQuicsICfQuycsICfRgSddLFxuICAgIFsn0YHRgtGDJywgJ9C70Y7RgicsICfRgdCw0LonLCAn0LrRgNCwJywgJ9C80LDRjycsICfRh9GN0YAnLCAn0LvRltC/JywgJ9C20L3RlicsICfQstC10YAnLCAn0LrQsNGBJywgJ9C70ZbRgScsICfRgdC90LUnXSxcbiAgICBbXG4gICAgICAn0YHRgtGD0LTQt9C10L3RjycsICfQu9GO0YLQsNCz0LAnLCAn0YHQsNC60LDQstGW0LrQsCcsICfQutGA0LDRgdCw0LLRltC60LAnLCAn0LzQsNGPJywgJ9GH0Y3RgNCy0LXQvdGPJywgJ9C70ZbQv9C10L3RjycsICfQttC90ZbRntC90Y8nLFxuICAgICAgJ9Cy0LXRgNCw0YHQvdGPJywgJ9C60LDRgdGC0YDRi9GH0L3RltC60LAnLCAn0LvRltGB0YLQsNC/0LDQtNCwJywgJ9GB0L3QtdC20L3RjydcbiAgICBdXG4gIF0sXG4gIFtcbiAgICBbJ9GBJywgJ9C7JywgJ9GBJywgJ9C6JywgJ9C8JywgJ9GHJywgJ9C7JywgJ9C2JywgJ9CyJywgJ9C6JywgJ9C7JywgJ9GBJ10sXG4gICAgWyfRgdGC0YMnLCAn0LvRjtGCJywgJ9GB0LDQuicsICfQutGA0LAnLCAn0LzQsNC5JywgJ9GH0Y3RgCcsICfQu9GW0L8nLCAn0LbQvdGWJywgJ9Cy0LXRgCcsICfQutCw0YEnLCAn0LvRltGBJywgJ9GB0L3QtSddLFxuICAgIFtcbiAgICAgICfRgdGC0YPQtNC30LXQvdGMJywgJ9C70Y7RgtGLJywgJ9GB0LDQutCw0LLRltC6JywgJ9C60YDQsNGB0LDQstGW0LonLCAn0LzQsNC5JywgJ9GH0Y3RgNCy0LXQvdGMJywgJ9C70ZbQv9C10L3RjCcsICfQttC90ZbQstC10L3RjCcsICfQstC10YDQsNGB0LXQvdGMJyxcbiAgICAgICfQutCw0YHRgtGA0YvRh9C90ZbQuicsICfQu9GW0YHRgtCw0L/QsNC0JywgJ9GB0L3QtdC20LDQvdGMJ1xuICAgIF1cbiAgXSxcbiAgW1sn0LTQsCDQvS7RjS4nLCAn0L0u0Y0uJ10sIHUsIFsn0LTQsCDQvdCw0YDQsNC00LbRjdC90L3RjyDQpdGA0YvRgdGC0L7QstCwJywgJ9Cw0LQg0L3QsNGA0LDQtNC20Y3QvdC90Y8g0KXRgNGL0YHRgtC+0LLQsCddXSxcbiAgMSxcbiAgWzYsIDBdLFxuICBbJ2QuTU0ueXknLCAnZC5NTS55JywgJ2QgTU1NTSB5IFxcJ9CzXFwnLicsICdFRUVFLCBkIE1NTU0geSBcXCfQs1xcJy4nXSxcbiAgWydISDptbScsICdISDptbTpzcycsICdISDptbTpzcyB6JywgJ0hIOm1tOnNzLCB6enp6J10sXG4gIFsnezF9LCB7MH0nLCB1LCAnezF9IFxcJ9GDXFwnIHswfScsIHVdLFxuICBbJywnLCAnwqAnLCAnOycsICclJywgJysnLCAnLScsICdFJywgJ8OXJywgJ+KAsCcsICfiiJ4nLCAnTmFOJywgJzonXSxcbiAgWycjLCMjMC4jIyMnLCAnIywjIzDCoCUnLCAnIywjIzAuMDDCoMKkJywgJyNFMCddLFxuICAnQllOJyxcbiAgJ0JyJyxcbiAgJ9Cx0LXQu9Cw0YDRg9GB0LrRliDRgNGD0LHQtdC70YwnLFxuICB7XG4gICAgJ0FVRCc6IFsnQSQnXSxcbiAgICAnQkJEJzogW3UsICdCZHMkJ10sXG4gICAgJ0JNRCc6IFt1LCAnQkQkJ10sXG4gICAgJ0JSTCc6IFt1LCAnUiQnXSxcbiAgICAnQlNEJzogW3UsICdCJCddLFxuICAgICdCWU4nOiBbJ0JyJ10sXG4gICAgJ0JaRCc6IFt1LCAnQlokJ10sXG4gICAgJ0NBRCc6IFt1LCAnQ0EkJ10sXG4gICAgJ0NVQyc6IFt1LCAnQ1VDJCddLFxuICAgICdDVVAnOiBbdSwgJyRNTiddLFxuICAgICdET1AnOiBbdSwgJ1JEJCddLFxuICAgICdGSkQnOiBbdSwgJ0ZKJCddLFxuICAgICdGS1AnOiBbdSwgJ0ZLwqMnXSxcbiAgICAnR1lEJzogW3UsICdHJCddLFxuICAgICdJU0snOiBbdSwgJ8ONa3InXSxcbiAgICAnSk1EJzogW3UsICdKJCddLFxuICAgICdLWUQnOiBbdSwgJ0NJJCddLFxuICAgICdMUkQnOiBbdSwgJ0wkJ10sXG4gICAgJ01YTic6IFsnTVgkJ10sXG4gICAgJ05BRCc6IFt1LCAnTiQnXSxcbiAgICAnTlpEJzogW3UsICdOWiQnXSxcbiAgICAnUlVCJzogWyfigr0nLCAn0YDRg9CxLiddLFxuICAgICdTQkQnOiBbdSwgJ1NJJCddLFxuICAgICdTR0QnOiBbdSwgJ1MkJ10sXG4gICAgJ1RURCc6IFt1LCAnVFQkJ10sXG4gICAgJ1VZVSc6IFt1LCAnJFUnXSxcbiAgICAnWENEJzogWydFQyQnXVxuICB9LFxuICAnbHRyJyxcbiAgcGx1cmFsXG5dO1xuIl19
+
+/***/ }),
+
+/***/ "./node_modules/@angular/common/locales/bg.js":
+/*!****************************************************!*\
+ !*** ./node_modules/@angular/common/locales/bg.js ***!
+ \****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+(function (factory) {
+ if ( true && typeof module.exports === "object") {
+ var v = factory(null, exports);
+ if (v !== undefined) module.exports = v;
+ }
+ else if (true) {
+ !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),
+ __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
+ (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),
+ __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+ }
+})(function (require, exports) {
+ "use strict";
+ Object.defineProperty(exports, "__esModule", { value: true });
+ // THIS CODE IS GENERATED - DO NOT MODIFY
+ // See angular/tools/gulp-tasks/cldr/extract.js
+ var u = undefined;
+ function plural(n) {
+ if (n === 1)
+ return 1;
+ return 5;
+ }
+ exports.default = [
+ 'bg',
+ [['am', 'pm'], u, ['пр.об.', 'сл.об.']],
+ [['am', 'pm'], u, u],
+ [
+ ['н', 'п', 'в', 'с', 'ч', 'п', 'с'], ['нд', 'пн', 'вт', 'ср', 'чт', 'пт', 'сб'],
+ ['неделя', 'понеделник', 'вторник', 'сряда', 'четвъртък', 'петък', 'събота'],
+ ['нд', 'пн', 'вт', 'ср', 'чт', 'пт', 'сб']
+ ],
+ u,
+ [
+ ['я', 'ф', 'м', 'а', 'м', 'ю', 'ю', 'а', 'с', 'о', 'н', 'д'],
+ ['яну', 'фев', 'март', 'апр', 'май', 'юни', 'юли', 'авг', 'сеп', 'окт', 'ное', 'дек'],
+ [
+ 'януари', 'февруари', 'март', 'април', 'май', 'юни', 'юли', 'август', 'септември', 'октомври',
+ 'ноември', 'декември'
+ ]
+ ],
+ u,
+ [['пр.Хр.', 'сл.Хр.'], u, ['преди Христа', 'след Христа']],
+ 1,
+ [6, 0],
+ ['d.MM.yy \'г\'.', 'd.MM.y \'г\'.', 'd MMMM y \'г\'.', 'EEEE, d MMMM y \'г\'.'],
+ ['H:mm', 'H:mm:ss', 'H:mm:ss z', 'H:mm:ss zzzz'],
+ ['{1}, {0}', u, u, u],
+ [',', ' ', ';', '%', '+', '-', 'E', '×', '‰', '∞', 'NaN', ':'],
+ ['#,##0.###', '#,##0%', '0.00 ¤', '#E0'],
+ 'BGN',
+ 'лв.',
+ 'Български лев',
+ {
+ 'ARS': [],
+ 'AUD': [],
+ 'BBD': [],
+ 'BDT': [],
+ 'BGN': ['лв.'],
+ 'BMD': [],
+ 'BND': [],
+ 'BRL': [],
+ 'BSD': [],
+ 'BYN': [],
+ 'BZD': [],
+ 'CAD': [],
+ 'CLP': [],
+ 'CNY': [],
+ 'COP': [],
+ 'CRC': [],
+ 'CUP': [],
+ 'DOP': [],
+ 'FJD': [],
+ 'FKP': [],
+ 'GBP': [u, '£'],
+ 'GIP': [],
+ 'GYD': [],
+ 'HKD': [],
+ 'ILS': [],
+ 'INR': [],
+ 'JMD': [],
+ 'JPY': [u, '¥'],
+ 'KHR': [],
+ 'KRW': [],
+ 'KYD': [],
+ 'KZT': [],
+ 'LAK': [],
+ 'LRD': [],
+ 'MNT': [],
+ 'MXN': [],
+ 'NAD': [],
+ 'NGN': [],
+ 'NZD': [],
+ 'PHP': [],
+ 'PYG': [],
+ 'RON': [],
+ 'SBD': [],
+ 'SGD': [],
+ 'SRD': [],
+ 'SSP': [],
+ 'TRY': [],
+ 'TTD': [],
+ 'TWD': [],
+ 'UAH': [],
+ 'USD': ['щ.д.', '$'],
+ 'UYU': [],
+ 'VND': [],
+ 'XCD': [u, '$']
+ },
+ 'ltr',
+ plural
+ ];
+});
+//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21tb24vbG9jYWxlcy9iZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7Ozs7Ozs7Ozs7OztJQUVILHlDQUF5QztJQUN6QywrQ0FBK0M7SUFFL0MsSUFBTSxDQUFDLEdBQUcsU0FBUyxDQUFDO0lBRXBCLFNBQVMsTUFBTSxDQUFDLENBQVM7UUFDdkIsSUFBSSxDQUFDLEtBQUssQ0FBQztZQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3RCLE9BQU8sQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUVELGtCQUFlO1FBQ2IsSUFBSTtRQUNKLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3ZDLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNwQjtZQUNFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUM7WUFDL0UsQ0FBQyxRQUFRLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxRQUFRLENBQUM7WUFDNUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUM7U0FDM0M7UUFDRCxDQUFDO1FBQ0Q7WUFDRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDO1lBQzVELENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUM7WUFDckY7Z0JBQ0UsUUFBUSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsVUFBVTtnQkFDN0YsU0FBUyxFQUFFLFVBQVU7YUFDdEI7U0FDRjtRQUNELENBQUM7UUFDRCxDQUFDLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLGNBQWMsRUFBRSxhQUFhLENBQUMsQ0FBQztRQUMxRCxDQUFDO1FBQ0QsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ04sQ0FBQyxnQkFBZ0IsRUFBRSxlQUFlLEVBQUUsaUJBQWlCLEVBQUUsdUJBQXVCLENBQUM7UUFDL0UsQ0FBQyxNQUFNLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxjQUFjLENBQUM7UUFDaEQsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDckIsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQztRQUM5RCxDQUFDLFdBQVcsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLEtBQUssQ0FBQztRQUN4QyxLQUFLO1FBQ0wsS0FBSztRQUNMLGVBQWU7UUFDZjtZQUNFLEtBQUssRUFBRSxFQUFFO1lBQ1QsS0FBSyxFQUFFLEVBQUU7WUFDVCxLQUFLLEVBQUUsRUFBRTtZQUNULEtBQUssRUFBRSxFQUFFO1lBQ1QsS0FBSyxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ2QsS0FBSyxFQUFFLEVBQUU7WUFDVCxLQUFLLEVBQUUsRUFBRTtZQUNULEtBQUssRUFBRSxFQUFFO1lBQ1QsS0FBSyxFQUFFLEVBQUU7WUFDVCxLQUFLLEVBQUUsRUFBRTtZQUNULEtBQUssRUFBRSxFQUFFO1lBQ1QsS0FBSyxFQUFFLEVBQUU7WUFDVCxLQUFLLEVBQUUsRUFBRTtZQUNULEtBQUssRUFBRSxFQUFFO1lBQ1QsS0FBSyxFQUFFLEVBQUU7WUFDVCxLQUFLLEVBQUUsRUFBRTtZQUNULEtBQUssRUFBRSxFQUFFO1lBQ1QsS0FBSyxFQUFFLEVBQUU7WUFDVCxLQUFLLEVBQUUsRUFBRTtZQUNULEtBQUssRUFBRSxFQUFFO1lBQ1QsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQztZQUNmLEtBQUssRUFBRSxFQUFFO1lBQ1QsS0FBSyxFQUFFLEVBQUU7WUFDVCxLQUFLLEVBQUUsRUFBRTtZQUNULEtBQUssRUFBRSxFQUFFO1lBQ1QsS0FBSyxFQUFFLEVBQUU7WUFDVCxLQUFLLEVBQUUsRUFBRTtZQUNULEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUM7WUFDZixLQUFLLEVBQUUsRUFBRTtZQUNULEtBQUssRUFBRSxFQUFFO1lBQ1QsS0FBSyxFQUFFLEVBQUU7WUFDVCxLQUFLLEVBQUUsRUFBRTtZQUNULEtBQUssRUFBRSxFQUFFO1lBQ1QsS0FBSyxFQUFFLEVBQUU7WUFDVCxLQUFLLEVBQUUsRUFBRTtZQUNULEtBQUssRUFBRSxFQUFFO1lBQ1QsS0FBSyxFQUFFLEVBQUU7WUFDVCxLQUFLLEVBQUUsRUFBRTtZQUNULEtBQUssRUFBRSxFQUFFO1lBQ1QsS0FBSyxFQUFFLEVBQUU7WUFDVCxLQUFLLEVBQUUsRUFBRTtZQUNULEtBQUssRUFBRSxFQUFFO1lBQ1QsS0FBSyxFQUFFLEVBQUU7WUFDVCxLQUFLLEVBQUUsRUFBRTtZQUNULEtBQUssRUFBRSxFQUFFO1lBQ1QsS0FBSyxFQUFFLEVBQUU7WUFDVCxLQUFLLEVBQUUsRUFBRTtZQUNULEtBQUssRUFBRSxFQUFFO1lBQ1QsS0FBSyxFQUFFLEVBQUU7WUFDVCxLQUFLLEVBQUUsRUFBRTtZQUNULEtBQUssRUFBRSxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUM7WUFDcEIsS0FBSyxFQUFFLEVBQUU7WUFDVCxLQUFLLEVBQUUsRUFBRTtZQUNULEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUM7U0FDaEI7UUFDRCxLQUFLO1FBQ0wsTUFBTTtLQUNQLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuLy8gVEhJUyBDT0RFIElTIEdFTkVSQVRFRCAtIERPIE5PVCBNT0RJRllcbi8vIFNlZSBhbmd1bGFyL3Rvb2xzL2d1bHAtdGFza3MvY2xkci9leHRyYWN0LmpzXG5cbmNvbnN0IHUgPSB1bmRlZmluZWQ7XG5cbmZ1bmN0aW9uIHBsdXJhbChuOiBudW1iZXIpOiBudW1iZXIge1xuICBpZiAobiA9PT0gMSkgcmV0dXJuIDE7XG4gIHJldHVybiA1O1xufVxuXG5leHBvcnQgZGVmYXVsdCBbXG4gICdiZycsXG4gIFtbJ2FtJywgJ3BtJ10sIHUsIFsn0L/RgC7QvtCxLicsICfRgdC7LtC+0LEuJ11dLFxuICBbWydhbScsICdwbSddLCB1LCB1XSxcbiAgW1xuICAgIFsn0L0nLCAn0L8nLCAn0LInLCAn0YEnLCAn0YcnLCAn0L8nLCAn0YEnXSwgWyfQvdC0JywgJ9C/0L0nLCAn0LLRgicsICfRgdGAJywgJ9GH0YInLCAn0L/RgicsICfRgdCxJ10sXG4gICAgWyfQvdC10LTQtdC70Y8nLCAn0L/QvtC90LXQtNC10LvQvdC40LonLCAn0LLRgtC+0YDQvdC40LonLCAn0YHRgNGP0LTQsCcsICfRh9C10YLQstGK0YDRgtGK0LonLCAn0L/QtdGC0YrQuicsICfRgdGK0LHQvtGC0LAnXSxcbiAgICBbJ9C90LQnLCAn0L/QvScsICfQstGCJywgJ9GB0YAnLCAn0YfRgicsICfQv9GCJywgJ9GB0LEnXVxuICBdLFxuICB1LFxuICBbXG4gICAgWyfRjycsICfRhCcsICfQvCcsICfQsCcsICfQvCcsICfRjicsICfRjicsICfQsCcsICfRgScsICfQvicsICfQvScsICfQtCddLFxuICAgIFsn0Y/QvdGDJywgJ9GE0LXQsicsICfQvNCw0YDRgicsICfQsNC/0YAnLCAn0LzQsNC5JywgJ9GO0L3QuCcsICfRjtC70LgnLCAn0LDQstCzJywgJ9GB0LXQvycsICfQvtC60YInLCAn0L3QvtC1JywgJ9C00LXQuiddLFxuICAgIFtcbiAgICAgICfRj9C90YPQsNGA0LgnLCAn0YTQtdCy0YDRg9Cw0YDQuCcsICfQvNCw0YDRgicsICfQsNC/0YDQuNC7JywgJ9C80LDQuScsICfRjtC90LgnLCAn0Y7Qu9C4JywgJ9Cw0LLQs9GD0YHRgicsICfRgdC10L/RgtC10LzQstGA0LgnLCAn0L7QutGC0L7QvNCy0YDQuCcsXG4gICAgICAn0L3QvtC10LzQstGA0LgnLCAn0LTQtdC60LXQvNCy0YDQuCdcbiAgICBdXG4gIF0sXG4gIHUsXG4gIFtbJ9C/0YAu0KXRgC4nLCAn0YHQuy7QpdGALiddLCB1LCBbJ9C/0YDQtdC00Lgg0KXRgNC40YHRgtCwJywgJ9GB0LvQtdC0INCl0YDQuNGB0YLQsCddXSxcbiAgMSxcbiAgWzYsIDBdLFxuICBbJ2QuTU0ueXkgXFwn0LNcXCcuJywgJ2QuTU0ueSBcXCfQs1xcJy4nLCAnZCBNTU1NIHkgXFwn0LNcXCcuJywgJ0VFRUUsIGQgTU1NTSB5IFxcJ9CzXFwnLiddLFxuICBbJ0g6bW0nLCAnSDptbTpzcycsICdIOm1tOnNzIHonLCAnSDptbTpzcyB6enp6J10sXG4gIFsnezF9LCB7MH0nLCB1LCB1LCB1XSxcbiAgWycsJywgJ8KgJywgJzsnLCAnJScsICcrJywgJy0nLCAnRScsICfDlycsICfigLAnLCAn4oieJywgJ05hTicsICc6J10sXG4gIFsnIywjIzAuIyMjJywgJyMsIyMwJScsICcwLjAwwqDCpCcsICcjRTAnXSxcbiAgJ0JHTicsXG4gICfQu9CyLicsXG4gICfQkdGK0LvQs9Cw0YDRgdC60Lgg0LvQtdCyJyxcbiAge1xuICAgICdBUlMnOiBbXSxcbiAgICAnQVVEJzogW10sXG4gICAgJ0JCRCc6IFtdLFxuICAgICdCRFQnOiBbXSxcbiAgICAnQkdOJzogWyfQu9CyLiddLFxuICAgICdCTUQnOiBbXSxcbiAgICAnQk5EJzogW10sXG4gICAgJ0JSTCc6IFtdLFxuICAgICdCU0QnOiBbXSxcbiAgICAnQllOJzogW10sXG4gICAgJ0JaRCc6IFtdLFxuICAgICdDQUQnOiBbXSxcbiAgICAnQ0xQJzogW10sXG4gICAgJ0NOWSc6IFtdLFxuICAgICdDT1AnOiBbXSxcbiAgICAnQ1JDJzogW10sXG4gICAgJ0NVUCc6IFtdLFxuICAgICdET1AnOiBbXSxcbiAgICAnRkpEJzogW10sXG4gICAgJ0ZLUCc6IFtdLFxuICAgICdHQlAnOiBbdSwgJ8KjJ10sXG4gICAgJ0dJUCc6IFtdLFxuICAgICdHWUQnOiBbXSxcbiAgICAnSEtEJzogW10sXG4gICAgJ0lMUyc6IFtdLFxuICAgICdJTlInOiBbXSxcbiAgICAnSk1EJzogW10sXG4gICAgJ0pQWSc6IFt1LCAnwqUnXSxcbiAgICAnS0hSJzogW10sXG4gICAgJ0tSVyc6IFtdLFxuICAgICdLWUQnOiBbXSxcbiAgICAnS1pUJzogW10sXG4gICAgJ0xBSyc6IFtdLFxuICAgICdMUkQnOiBbXSxcbiAgICAnTU5UJzogW10sXG4gICAgJ01YTic6IFtdLFxuICAgICdOQUQnOiBbXSxcbiAgICAnTkdOJzogW10sXG4gICAgJ05aRCc6IFtdLFxuICAgICdQSFAnOiBbXSxcbiAgICAnUFlHJzogW10sXG4gICAgJ1JPTic6IFtdLFxuICAgICdTQkQnOiBbXSxcbiAgICAnU0dEJzogW10sXG4gICAgJ1NSRCc6IFtdLFxuICAgICdTU1AnOiBbXSxcbiAgICAnVFJZJzogW10sXG4gICAgJ1RURCc6IFtdLFxuICAgICdUV0QnOiBbXSxcbiAgICAnVUFIJzogW10sXG4gICAgJ1VTRCc6IFsn0Yku0LQuJywgJyQnXSxcbiAgICAnVVlVJzogW10sXG4gICAgJ1ZORCc6IFtdLFxuICAgICdYQ0QnOiBbdSwgJyQnXVxuICB9LFxuICAnbHRyJyxcbiAgcGx1cmFsXG5dO1xuIl19
+
+/***/ }),
+
+/***/ "./node_modules/@angular/common/locales/bn.js":
+/*!****************************************************!*\
+ !*** ./node_modules/@angular/common/locales/bn.js ***!
+ \****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+(function (factory) {
+ if ( true && typeof module.exports === "object") {
+ var v = factory(null, exports);
+ if (v !== undefined) module.exports = v;
+ }
+ else if (true) {
+ !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),
+ __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
+ (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),
+ __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+ }
+})(function (require, exports) {
+ "use strict";
+ Object.defineProperty(exports, "__esModule", { value: true });
+ // THIS CODE IS GENERATED - DO NOT MODIFY
+ // See angular/tools/gulp-tasks/cldr/extract.js
+ var u = undefined;
+ function plural(n) {
+ var i = Math.floor(Math.abs(n));
+ if (i === 0 || n === 1)
+ return 1;
+ return 5;
+ }
+ exports.default = [
+ 'bn',
+ [['AM', 'PM'], u, u],
+ u,
+ [
+ ['র', 'সো', 'ম', 'বু', 'বৃ', 'শু', 'শ'], ['রবি', 'সোম', 'মঙ্গল', 'বুধ', 'বৃহস্পতি', 'শুক্র', 'শনি'],
+ ['রবিবার', 'সোমবার', 'মঙ্গলবার', 'বুধবার', 'বৃহস্পতিবার', 'শুক্রবার', 'শনিবার'],
+ ['রঃ', 'সোঃ', 'মঃ', 'বুঃ', 'বৃঃ', 'শুঃ', 'শনি']
+ ],
+ u,
+ [
+ ['জা', 'ফে', 'মা', 'এ', 'মে', 'জুন', 'জু', 'আ', 'সে', 'অ', 'ন', 'ডি'],
+ [
+ 'জানু', 'ফেব', 'মার্চ', 'এপ্রিল', 'মে', 'জুন', 'জুলাই', 'আগস্ট', 'সেপ্টেম্বর', 'অক্টোবর', 'নভেম্বর',
+ 'ডিসেম্বর'
+ ],
+ [
+ 'জানুয়ারী', 'ফেব্রুয়ারী', 'মার্চ', 'এপ্রিল', 'মে', 'জুন', 'জুলাই', 'আগস্ট', 'সেপ্টেম্বর', 'অক্টোবর',
+ 'নভেম্বর', 'ডিসেম্বর'
+ ]
+ ],
+ [
+ ['জা', 'ফে', 'মা', 'এ', 'মে', 'জুন', 'জু', 'আ', 'সে', 'অ', 'ন', 'ডি'],
+ [
+ 'জানুয়ারী', 'ফেব্রুয়ারী', 'মার্চ', 'এপ্রিল', 'মে', 'জুন', 'জুলাই', 'আগস্ট', 'সেপ্টেম্বর', 'অক্টোবর',
+ 'নভেম্বর', 'ডিসেম্বর'
+ ],
+ u
+ ],
+ [['খ্রিস্টপূর্ব', 'খৃষ্টাব্দ'], u, ['খ্রিস্টপূর্ব', 'খ্রীষ্টাব্দ']],
+ 0,
+ [6, 0],
+ ['d/M/yy', 'd MMM, y', 'd MMMM, y', 'EEEE, d MMMM, y'],
+ ['h:mm a', 'h:mm:ss a', 'h:mm:ss a z', 'h:mm:ss a zzzz'],
+ ['{1} {0}', u, u, u],
+ ['.', ',', ';', '%', '+', '-', 'E', '×', '‰', '∞', 'NaN', ':'],
+ ['#,##,##0.###', '#,##,##0%', '#,##,##0.00¤', '#E0'],
+ 'BDT',
+ '৳',
+ 'বাংলাদেশী টাকা',
+ { 'BDT': ['৳'], 'JPY': ['JP¥', '¥'], 'THB': ['฿'], 'TWD': ['NT$'], 'USD': ['US$', '$'] },
+ 'ltr',
+ plural
+ ];
+});
+//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21tb24vbG9jYWxlcy9ibi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7Ozs7Ozs7Ozs7OztJQUVILHlDQUF5QztJQUN6QywrQ0FBK0M7SUFFL0MsSUFBTSxDQUFDLEdBQUcsU0FBUyxDQUFDO0lBRXBCLFNBQVMsTUFBTSxDQUFDLENBQVM7UUFDdkIsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO1lBQUUsT0FBTyxDQUFDLENBQUM7UUFDakMsT0FBTyxDQUFDLENBQUM7SUFDWCxDQUFDO0lBRUQsa0JBQWU7UUFDYixJQUFJO1FBQ0osQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3BCLENBQUM7UUFDRDtZQUNFLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUM7WUFDbkcsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsYUFBYSxFQUFFLFVBQVUsRUFBRSxRQUFRLENBQUM7WUFDL0UsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUM7U0FDaEQ7UUFDRCxDQUFDO1FBQ0Q7WUFDRSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDO1lBQ3JFO2dCQUNFLE1BQU0sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxTQUFTO2dCQUNuRyxVQUFVO2FBQ1g7WUFDRDtnQkFDRSxXQUFXLEVBQUUsYUFBYSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxTQUFTO2dCQUNyRyxTQUFTLEVBQUUsVUFBVTthQUN0QjtTQUNGO1FBQ0Q7WUFDRSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDO1lBQ3JFO2dCQUNFLFdBQVcsRUFBRSxhQUFhLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLFNBQVM7Z0JBQ3JHLFNBQVMsRUFBRSxVQUFVO2FBQ3RCO1lBQ0QsQ0FBQztTQUNGO1FBQ0QsQ0FBQyxDQUFDLGNBQWMsRUFBRSxXQUFXLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxjQUFjLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFDbkUsQ0FBQztRQUNELENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNOLENBQUMsUUFBUSxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsaUJBQWlCLENBQUM7UUFDdEQsQ0FBQyxRQUFRLEVBQUUsV0FBVyxFQUFFLGFBQWEsRUFBRSxnQkFBZ0IsQ0FBQztRQUN4RCxDQUFDLFNBQVMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNwQixDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDO1FBQzlELENBQUMsY0FBYyxFQUFFLFdBQVcsRUFBRSxjQUFjLEVBQUUsS0FBSyxDQUFDO1FBQ3BELEtBQUs7UUFDTCxHQUFHO1FBQ0gsZ0JBQWdCO1FBQ2hCLEVBQUMsS0FBSyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsRUFBQztRQUN0RixLQUFLO1FBQ0wsTUFBTTtLQUNQLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuLy8gVEhJUyBDT0RFIElTIEdFTkVSQVRFRCAtIERPIE5PVCBNT0RJRllcbi8vIFNlZSBhbmd1bGFyL3Rvb2xzL2d1bHAtdGFza3MvY2xkci9leHRyYWN0LmpzXG5cbmNvbnN0IHUgPSB1bmRlZmluZWQ7XG5cbmZ1bmN0aW9uIHBsdXJhbChuOiBudW1iZXIpOiBudW1iZXIge1xuICBsZXQgaSA9IE1hdGguZmxvb3IoTWF0aC5hYnMobikpO1xuICBpZiAoaSA9PT0gMCB8fCBuID09PSAxKSByZXR1cm4gMTtcbiAgcmV0dXJuIDU7XG59XG5cbmV4cG9ydCBkZWZhdWx0IFtcbiAgJ2JuJyxcbiAgW1snQU0nLCAnUE0nXSwgdSwgdV0sXG4gIHUsXG4gIFtcbiAgICBbJ+CmsCcsICfgprjgp4snLCAn4KauJywgJ+CmrOCngScsICfgpqzgp4MnLCAn4Ka24KeBJywgJ+CmtiddLCBbJ+CmsOCmrOCmvycsICfgprjgp4vgpq4nLCAn4Kau4KaZ4KeN4KaX4KayJywgJ+CmrOCngeCmpycsICfgpqzgp4Pgprngprjgp43gpqrgpqTgpr8nLCAn4Ka24KeB4KaV4KeN4KawJywgJ+CmtuCmqOCmvyddLFxuICAgIFsn4Kaw4Kas4Ka/4Kas4Ka+4KawJywgJ+CmuOCni+CmruCmrOCmvuCmsCcsICfgpq7gppngp43gppfgprLgpqzgpr7gprAnLCAn4Kas4KeB4Kan4Kas4Ka+4KawJywgJ+CmrOCng+CmueCmuOCnjeCmquCmpOCmv+CmrOCmvuCmsCcsICfgprbgp4HgppXgp43gprDgpqzgpr7gprAnLCAn4Ka24Kao4Ka/4Kas4Ka+4KawJ10sXG4gICAgWyfgprDgpoMnLCAn4Ka44KeL4KaDJywgJ+CmruCmgycsICfgpqzgp4HgpoMnLCAn4Kas4KeD4KaDJywgJ+CmtuCngeCmgycsICfgprbgpqjgpr8nXVxuICBdLFxuICB1LFxuICBbXG4gICAgWyfgppzgpr4nLCAn4Kar4KeHJywgJ+CmruCmvicsICfgpo8nLCAn4Kau4KeHJywgJ+CmnOCngeCmqCcsICfgppzgp4EnLCAn4KaGJywgJ+CmuOCnhycsICfgpoUnLCAn4KaoJywgJ+CmoeCmvyddLFxuICAgIFtcbiAgICAgICfgppzgpr7gpqjgp4EnLCAn4Kar4KeH4KasJywgJ+CmruCmvuCmsOCnjeCmmicsICfgpo/gpqrgp43gprDgpr/gprInLCAn4Kau4KeHJywgJ+CmnOCngeCmqCcsICfgppzgp4HgprLgpr7gpocnLCAn4KaG4KaX4Ka44KeN4KafJywgJ+CmuOCnh+CmquCnjeCmn+Cnh+CmruCnjeCmrOCmsCcsICfgpoXgppXgp43gpp/gp4vgpqzgprAnLCAn4Kao4Kat4KeH4Kau4KeN4Kas4KawJyxcbiAgICAgICfgpqHgpr/gprjgp4fgpq7gp43gpqzgprAnXG4gICAgXSxcbiAgICBbXG4gICAgICAn4Kac4Ka+4Kao4KeB4Kav4Ka84Ka+4Kaw4KeAJywgJ+Cmq+Cnh+CmrOCnjeCmsOCngeCmr+CmvOCmvuCmsOCngCcsICfgpq7gpr7gprDgp43gpponLCAn4KaP4Kaq4KeN4Kaw4Ka/4KayJywgJ+CmruCnhycsICfgppzgp4HgpqgnLCAn4Kac4KeB4Kay4Ka+4KaHJywgJ+CmhuCml+CmuOCnjeCmnycsICfgprjgp4fgpqrgp43gpp/gp4fgpq7gp43gpqzgprAnLCAn4KaF4KaV4KeN4Kaf4KeL4Kas4KawJyxcbiAgICAgICfgpqjgpq3gp4fgpq7gp43gpqzgprAnLCAn4Kah4Ka/4Ka44KeH4Kau4KeN4Kas4KawJ1xuICAgIF1cbiAgXSxcbiAgW1xuICAgIFsn4Kac4Ka+JywgJ+Cmq+CnhycsICfgpq7gpr4nLCAn4KaPJywgJ+CmruCnhycsICfgppzgp4HgpqgnLCAn4Kac4KeBJywgJ+CmhicsICfgprjgp4cnLCAn4KaFJywgJ+CmqCcsICfgpqHgpr8nXSxcbiAgICBbXG4gICAgICAn4Kac4Ka+4Kao4KeB4Kav4Ka84Ka+4Kaw4KeAJywgJ+Cmq+Cnh+CmrOCnjeCmsOCngeCmr+CmvOCmvuCmsOCngCcsICfgpq7gpr7gprDgp43gpponLCAn4KaP4Kaq4KeN4Kaw4Ka/4KayJywgJ+CmruCnhycsICfgppzgp4HgpqgnLCAn4Kac4KeB4Kay4Ka+4KaHJywgJ+CmhuCml+CmuOCnjeCmnycsICfgprjgp4fgpqrgp43gpp/gp4fgpq7gp43gpqzgprAnLCAn4KaF4KaV4KeN4Kaf4KeL4Kas4KawJyxcbiAgICAgICfgpqjgpq3gp4fgpq7gp43gpqzgprAnLCAn4Kah4Ka/4Ka44KeH4Kau4KeN4Kas4KawJ1xuICAgIF0sXG4gICAgdVxuICBdLFxuICBbWyfgppbgp43gprDgpr/gprjgp43gpp/gpqrgp4LgprDgp43gpqwnLCAn4KaW4KeD4Ka34KeN4Kaf4Ka+4Kas4KeN4KamJ10sIHUsIFsn4KaW4KeN4Kaw4Ka/4Ka44KeN4Kaf4Kaq4KeC4Kaw4KeN4KasJywgJ+CmluCnjeCmsOCngOCmt+CnjeCmn+CmvuCmrOCnjeCmpiddXSxcbiAgMCxcbiAgWzYsIDBdLFxuICBbJ2QvTS95eScsICdkIE1NTSwgeScsICdkIE1NTU0sIHknLCAnRUVFRSwgZCBNTU1NLCB5J10sXG4gIFsnaDptbSBhJywgJ2g6bW06c3MgYScsICdoOm1tOnNzIGEgeicsICdoOm1tOnNzIGEgenp6eiddLFxuICBbJ3sxfSB7MH0nLCB1LCB1LCB1XSxcbiAgWycuJywgJywnLCAnOycsICclJywgJysnLCAnLScsICdFJywgJ8OXJywgJ+KAsCcsICfiiJ4nLCAnTmFOJywgJzonXSxcbiAgWycjLCMjLCMjMC4jIyMnLCAnIywjIywjIzAlJywgJyMsIyMsIyMwLjAwwqQnLCAnI0UwJ10sXG4gICdCRFQnLFxuICAn4KezJyxcbiAgJ+CmrOCmvuCmguCmsuCmvuCmpuCnh+CmtuCngCDgpp/gpr7gppXgpr4nLFxuICB7J0JEVCc6IFsn4KezJ10sICdKUFknOiBbJ0pQwqUnLCAnwqUnXSwgJ1RIQic6IFsn4Li/J10sICdUV0QnOiBbJ05UJCddLCAnVVNEJzogWydVUyQnLCAnJCddfSxcbiAgJ2x0cicsXG4gIHBsdXJhbFxuXTtcbiJdfQ==
+
+/***/ }),
+
+/***/ "./node_modules/@angular/common/locales/ca.js":
+/*!****************************************************!*\
+ !*** ./node_modules/@angular/common/locales/ca.js ***!
+ \****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+(function (factory) {
+ if ( true && typeof module.exports === "object") {
+ var v = factory(null, exports);
+ if (v !== undefined) module.exports = v;
+ }
+ else if (true) {
+ !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),
+ __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
+ (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),
+ __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+ }
+})(function (require, exports) {
+ "use strict";
+ Object.defineProperty(exports, "__esModule", { value: true });
+ // THIS CODE IS GENERATED - DO NOT MODIFY
+ // See angular/tools/gulp-tasks/cldr/extract.js
+ var u = undefined;
+ function plural(n) {
+ var i = Math.floor(Math.abs(n)), v = n.toString().replace(/^[^.]*\.?/, '').length;
+ if (i === 1 && v === 0)
+ return 1;
+ return 5;
+ }
+ exports.default = [
+ 'ca',
+ [['a. m.', 'p. m.'], u, u],
+ u,
+ [
+ ['dg', 'dl', 'dt', 'dc', 'dj', 'dv', 'ds'], ['dg.', 'dl.', 'dt.', 'dc.', 'dj.', 'dv.', 'ds.'],
+ ['diumenge', 'dilluns', 'dimarts', 'dimecres', 'dijous', 'divendres', 'dissabte'],
+ ['dg.', 'dl.', 'dt.', 'dc.', 'dj.', 'dv.', 'ds.']
+ ],
+ u,
+ [
+ ['GN', 'FB', 'MÇ', 'AB', 'MG', 'JN', 'JL', 'AG', 'ST', 'OC', 'NV', 'DS'],
+ [
+ 'de gen.', 'de febr.', 'de març', 'd’abr.', 'de maig', 'de juny', 'de jul.', 'd’ag.',
+ 'de set.', 'd’oct.', 'de nov.', 'de des.'
+ ],
+ [
+ 'de gener', 'de febrer', 'de març', 'd’abril', 'de maig', 'de juny', 'de juliol', 'd’agost',
+ 'de setembre', 'd’octubre', 'de novembre', 'de desembre'
+ ]
+ ],
+ [
+ ['GN', 'FB', 'MÇ', 'AB', 'MG', 'JN', 'JL', 'AG', 'ST', 'OC', 'NV', 'DS'],
+ [
+ 'gen.', 'febr.', 'març', 'abr.', 'maig', 'juny', 'jul.', 'ag.', 'set.', 'oct.', 'nov.', 'des.'
+ ],
+ [
+ 'gener', 'febrer', 'març', 'abril', 'maig', 'juny', 'juliol', 'agost', 'setembre', 'octubre',
+ 'novembre', 'desembre'
+ ]
+ ],
+ [['aC', 'dC'], u, ['abans de Crist', 'després de Crist']],
+ 1,
+ [6, 0],
+ ['d/M/yy', 'd MMM y', 'd MMMM \'de\' y', 'EEEE, d MMMM \'de\' y'],
+ ['H:mm', 'H:mm:ss', 'H:mm:ss z', 'H:mm:ss zzzz'],
+ ['{1} {0}', '{1}, {0}', '{1} \'a\' \'les\' {0}', u],
+ [',', '.', ';', '%', '+', '-', 'E', '×', '‰', '∞', 'NaN', ':'],
+ ['#,##0.###', '#,##0%', '#,##0.00 ¤', '#E0'],
+ 'EUR',
+ '€',
+ 'euro',
+ {
+ 'AUD': ['AU$', '$'],
+ 'BRL': [u, 'R$'],
+ 'CAD': [u, '$'],
+ 'CNY': [u, '¥'],
+ 'ESP': ['₧'],
+ 'MXN': [u, '$'],
+ 'THB': ['฿'],
+ 'USD': [u, '$'],
+ 'VEF': [u, 'Bs F'],
+ 'XCD': [u, '$'],
+ 'XXX': []
+ },
+ 'ltr',
+ plural
+ ];
+});
+//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2EuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21tb24vbG9jYWxlcy9jYS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7Ozs7Ozs7Ozs7OztJQUVILHlDQUF5QztJQUN6QywrQ0FBK0M7SUFFL0MsSUFBTSxDQUFDLEdBQUcsU0FBUyxDQUFDO0lBRXBCLFNBQVMsTUFBTSxDQUFDLENBQVM7UUFDdkIsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUNsRixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7WUFBRSxPQUFPLENBQUMsQ0FBQztRQUNqQyxPQUFPLENBQUMsQ0FBQztJQUNYLENBQUM7SUFFRCxrQkFBZTtRQUNiLElBQUk7UUFDSixDQUFDLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDMUIsQ0FBQztRQUNEO1lBQ0UsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQztZQUM3RixDQUFDLFVBQVUsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLFVBQVUsQ0FBQztZQUNqRixDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxF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dCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuLy8gVEhJUyBDT0RFIElTIEdFTkVSQVRFRCAtIERPIE5PVCBNT0RJRllcbi8vIFNlZSBhbmd1bGFyL3Rvb2xzL2d1bHAtdGFza3MvY2xkci9leHRyYWN0LmpzXG5cbmNvbnN0IHUgPSB1bmRlZmluZWQ7XG5cbmZ1bmN0aW9uIHBsdXJhbChuOiBudW1iZXIpOiBudW1iZXIge1xuICBsZXQgaSA9IE1hdGguZmxvb3IoTWF0aC5hYnMobikpLCB2ID0gbi50b1N0cmluZygpLnJlcGxhY2UoL15bXi5dKlxcLj8vLCAnJykubGVuZ3RoO1xuICBpZiAoaSA9PT0gMSAmJiB2ID09PSAwKSByZXR1cm4gMTtcbiAgcmV0dXJuIDU7XG59XG5cbmV4cG9ydCBkZWZhdWx0IFtcbiAgJ2NhJyxcbiAgW1snYS7CoG0uJywgJ3AuwqBtLiddLCB1LCB1XSxcbiAgdSxcbiAgW1xuICAgIFsnZGcnLCAnZGwnLCAnZHQnLCAnZGMnLCAnZGonLCAnZHYnLCAnZHMnXSwgWydkZy4nLCAnZGwuJywgJ2R0LicsICdkYy4nLCAnZGouJywgJ2R2LicsICdkcy4nXSxcbiAgICBbJ2RpdW1lbmdlJywgJ2RpbGx1bnMnLCAnZGltYXJ0cycsICdkaW1lY3JlcycsICdkaWpvdXMnLCAnZGl2ZW5kcmVzJywgJ2Rpc3NhYnRlJ10sXG4gICAgWydkZy4nLCAnZGwuJywgJ2R0LicsICdkYy4nLCAnZGouJywgJ2R2LicsICdkcy4nXVxuICBdLFxuICB1LFxuICBbXG4gICAgWydHTicsICdGQicsICdNw4cnLCAnQUInLCAnTUcnLCAnSk4nLCAnSkwnLCAnQUcnLCAnU1QnLCAnT0MnLCAnTlYnLCAnRFMnXSxcbiAgICBbXG4gICAgICAnZGUgZ2VuLicsICdkZSBmZWJyLicsICdkZSBtYXLDpycsICdk4oCZYWJyLicsICdkZSBtYWlnJywgJ2RlIGp1bnknLCAnZGUganVsLicsICdk4oCZYWcuJyxcbiAgICAgICdkZSBzZXQuJywgJ2TigJlvY3QuJywgJ2RlIG5vdi4nLCAnZGUgZGVzLidcbiAgICBdLFxuICAgIFtcbiAgICAgICdkZSBnZW5lcicsICdkZSBmZWJyZXInLCAnZGUgbWFyw6cnLCAnZOKAmWFicmlsJywgJ2RlIG1haWcnLCAnZGUganVueScsICdkZSBqdWxpb2wnLCAnZOKAmWFnb3N0JyxcbiAgICAgICdkZSBzZXRlbWJyZScsICdk4oCZb2N0dWJyZScsICdkZSBub3ZlbWJyZScsICdkZSBkZXNlbWJyZSdcbiAgICBdXG4gIF0sXG4gIFtcbiAgICBbJ0dOJywgJ0ZCJywgJ03DhycsICdBQicsICdNRycsICdKTicsICdKTCcsICdBRycsICdTVCcsICdPQycsICdOVicsICdEUyddLFxuICAgIFtcbiAgICAgICdnZW4uJywgJ2ZlYnIuJywgJ21hcsOnJywgJ2Fici4nLCAnbWFpZycsICdqdW55JywgJ2p1bC4nLCAnYWcuJywgJ3NldC4nLCAnb2N0LicsICdub3YuJywgJ2Rlcy4nXG4gICAgXSxcbiAgICBbXG4gICAgICAnZ2VuZXInLCAnZmVicmVyJywgJ21hcsOnJywgJ2FicmlsJywgJ21haWcnLCAnanVueScsICdqdWxpb2wnLCAnYWdvc3QnLCAnc2V0ZW1icmUnLCAnb2N0dWJyZScsXG4gICAgICAnbm92ZW1icmUnLCAnZGVzZW1icmUnXG4gICAgXVxuICBdLFxuICBbWydhQycsICdkQyddLCB1LCBbJ2FiYW5zIGRlIENyaXN0JywgJ2Rlc3Byw6lzIGRlIENyaXN0J11dLFxuICAxLFxuICBbNiwgMF0sXG4gIFsnZC9NL3l5JywgJ2QgTU1NIHknLCAnZCBNTU1NIFxcJ2RlXFwnIHknLCAnRUVFRSwgZCBNTU1NIFxcJ2RlXFwnIHknXSxcbiAgWydIOm1tJywgJ0g6bW06c3MnLCAnSDptbTpzcyB6JywgJ0g6bW06c3Mgenp6eiddLFxuICBbJ3sxfSB7MH0nLCAnezF9LCB7MH0nLCAnezF9IFxcJ2FcXCcgXFwnbGVzXFwnIHswfScsIHVdLFxuICBbJywnLCAnLicsICc7JywgJyUnLCAnKycsICctJywgJ0UnLCAnw5cnLCAn4oCwJywgJ+KInicsICdOYU4nLCAnOiddLFxuICBbJyMsIyMwLiMjIycsICcjLCMjMCUnLCAnIywjIzAuMDDCoMKkJywgJyNFMCddLFxuICAnRVVSJyxcbiAgJ+KCrCcsXG4gICdldXJvJyxcbiAge1xuICAgICdBVUQnOiBbJ0FVJCcsICckJ10sXG4gICAgJ0JSTCc6IFt1LCAnUiQnXSxcbiAgICAnQ0FEJzogW3UsICckJ10sXG4gICAgJ0NOWSc6IFt1LCAnwqUnXSxcbiAgICAnRVNQJzogWyfigqcnXSxcbiAgICAnTVhOJzogW3UsICckJ10sXG4gICAgJ1RIQic6IFsn4Li/J10sXG4gICAgJ1VTRCc6IFt1LCAnJCddLFxuICAgICdWRUYnOiBbdSwgJ0JzIEYnXSxcbiAgICAnWENEJzogW3UsICckJ10sXG4gICAgJ1hYWCc6IFtdXG4gIH0sXG4gICdsdHInLFxuICBwbHVyYWxcbl07XG4iXX0=
+
+/***/ }),
+
+/***/ "./node_modules/@angular/common/locales/cs.js":
+/*!****************************************************!*\
+ !*** ./node_modules/@angular/common/locales/cs.js ***!
+ \****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+(function (factory) {
+ if ( true && typeof module.exports === "object") {
+ var v = factory(null, exports);
+ if (v !== undefined) module.exports = v;
+ }
+ else if (true) {
+ !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),
+ __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
+ (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),
+ __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+ }
+})(function (require, exports) {
+ "use strict";
+ Object.defineProperty(exports, "__esModule", { value: true });
+ // THIS CODE IS GENERATED - DO NOT MODIFY
+ // See angular/tools/gulp-tasks/cldr/extract.js
+ var u = undefined;
+ function plural(n) {
+ var i = Math.floor(Math.abs(n)), v = n.toString().replace(/^[^.]*\.?/, '').length;
+ if (i === 1 && v === 0)
+ return 1;
+ if (i === Math.floor(i) && i >= 2 && i <= 4 && v === 0)
+ return 3;
+ if (!(v === 0))
+ return 4;
+ return 5;
+ }
+ exports.default = [
+ 'cs',
+ [['dop.', 'odp.'], u, u],
+ u,
+ [
+ ['N', 'P', 'Ú', 'S', 'Č', 'P', 'S'], ['ne', 'po', 'út', 'st', 'čt', 'pá', 'so'],
+ ['neděle', 'pondělí', 'úterý', 'středa', 'čtvrtek', 'pátek', 'sobota'],
+ ['ne', 'po', 'út', 'st', 'čt', 'pá', 'so']
+ ],
+ u,
+ [
+ ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],
+ ['led', 'úno', 'bře', 'dub', 'kvě', 'čvn', 'čvc', 'srp', 'zář', 'říj', 'lis', 'pro'],
+ [
+ 'ledna', 'února', 'března', 'dubna', 'května', 'června', 'července', 'srpna', 'září', 'října',
+ 'listopadu', 'prosince'
+ ]
+ ],
+ [
+ ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],
+ ['led', 'úno', 'bře', 'dub', 'kvě', 'čvn', 'čvc', 'srp', 'zář', 'říj', 'lis', 'pro'],
+ [
+ 'leden', 'únor', 'březen', 'duben', 'květen', 'červen', 'červenec', 'srpen', 'září', 'říjen',
+ 'listopad', 'prosinec'
+ ]
+ ],
+ [['př.n.l.', 'n.l.'], ['př. n. l.', 'n. l.'], ['před naším letopočtem', 'našeho letopočtu']],
+ 1,
+ [6, 0],
+ ['dd.MM.yy', 'd. M. y', 'd. MMMM y', 'EEEE d. MMMM y'],
+ ['H:mm', 'H:mm:ss', 'H:mm:ss z', 'H:mm:ss zzzz'],
+ ['{1} {0}', u, u, u],
+ [',', ' ', ';', '%', '+', '-', 'E', '×', '‰', '∞', 'NaN', ':'],
+ ['#,##0.###', '#,##0 %', '#,##0.00 ¤', '#E0'],
+ 'CZK',
+ 'Kč',
+ 'česká koruna',
+ {
+ 'AUD': ['AU$', '$'],
+ 'CSK': ['Kčs'],
+ 'CZK': ['Kč'],
+ 'ILS': [u, '₪'],
+ 'INR': [u, '₹'],
+ 'JPY': ['JP¥', '¥'],
+ 'RON': [u, 'L'],
+ 'TWD': ['NT$'],
+ 'USD': ['US$', '$'],
+ 'VND': [u, '₫'],
+ 'XEU': ['ECU'],
+ 'XXX': []
+ },
+ 'ltr',
+ plural
+ ];
+});
+//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21tb24vbG9jYWxlcy9jcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7Ozs7Ozs7Ozs7OztJQUVILHlDQUF5QztJQUN6QywrQ0FBK0M7SUFFL0MsSUFBTSxDQUFDLEdBQUcsU0FBUyxDQUFDO0lBRXBCLFNBQVMsTUFBTSxDQUFDLENBQVM7UUFDdkIsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUNsRixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7WUFBRSxPQUFPLENBQUMsQ0FBQztRQUNqQyxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztZQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ2pFLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7WUFBRSxPQUFPLENBQUMsQ0FBQztRQUN6QixPQUFPLENBQUMsQ0FBQztJQUNYLENBQUM7SUFFRCxrQkFBZTtRQUNiLElBQUk7UUFDSixDQUFDLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDeEIsQ0FBQztRQUNEO1lBQ0UsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxF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QUUsR0FBRyxDQUFDO1lBQ2YsS0FBSyxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ2QsS0FBSyxFQUFFLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQztZQUNuQixLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDO1lBQ2YsS0FBSyxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ2QsS0FBSyxFQUFFLEVBQUU7U0FDVjtRQUNELEtBQUs7UUFDTCxNQUFNO0tBQ1AsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuXG4vLyBUSElTIENPREUgSVMgR0VORVJBVEVEIC0gRE8gTk9UIE1PRElGWVxuLy8gU2VlIGFuZ3VsYXIvdG9vbHMvZ3VscC10YXNrcy9jbGRyL2V4dHJhY3QuanNcblxuY29uc3QgdSA9IHVuZGVmaW5lZDtcblxuZnVuY3Rpb24gcGx1cmFsKG46IG51bWJlcik6IG51bWJlciB7XG4gIGxldCBpID0gTWF0aC5mbG9vcihNYXRoLmFicyhuKSksIHYgPSBuLnRvU3RyaW5nKCkucmVwbGFjZSgvXlteLl0qXFwuPy8sICcnKS5sZW5ndGg7XG4gIGlmIChpID09PSAxICYmIHYgPT09IDApIHJldHVybiAxO1xuICBpZiAoaSA9PT0gTWF0aC5mbG9vcihpKSAmJiBpID49IDIgJiYgaSA8PSA0ICYmIHYgPT09IDApIHJldHVybiAzO1xuICBpZiAoISh2ID09PSAwKSkgcmV0dXJuIDQ7XG4gIHJldHVybiA1O1xufVxuXG5leHBvcnQgZGVmYXVsdCBbXG4gICdjcycsXG4gIFtbJ2RvcC4nLCAnb2RwLiddLCB1LCB1XSxcbiAgdSxcbiAgW1xuICAgIFsnTicsICdQJywgJ8OaJywgJ1MnLCAnxIwnLCAnUCcsICdTJ10sIFsnbmUnLCAncG8nLCAnw7p0JywgJ3N0JywgJ8SNdCcsICdww6EnLCAnc28nXSxcbiAgICBbJ25lZMSbbGUnLCAncG9uZMSbbMOtJywgJ8O6dGVyw70nLCAnc3TFmWVkYScsICfEjXR2cnRlaycsICdww6F0ZWsnLCAnc29ib3RhJ10sXG4gICAgWyduZScsICdwbycsICfDunQnLCAnc3QnLCAnxI10JywgJ3DDoScsICdzbyddXG4gIF0sXG4gIHUsXG4gIFtcbiAgICBbJzEnLCAnMicsICczJywgJzQnLCAnNScsICc2JywgJzcnLCAnOCcsICc5JywgJzEwJywgJzExJywgJzEyJ10sXG4gICAgWydsZWQnLCAnw7pubycsICdixZllJywgJ2R1YicsICdrdsSbJywgJ8SNdm4nLCAnxI12YycsICdzcnAnLCAnesOhxZknLCAnxZnDrWonLCAnbGlzJywgJ3BybyddLFxuICAgIFtcbiAgICAgICdsZWRuYScsICfDum5vcmEnLCAnYsWZZXpuYScsICdkdWJuYScsICdrdsSbdG5hJywgJ8SNZXJ2bmEnLCAnxI1lcnZlbmNlJywgJ3NycG5hJywgJ3rDocWZw60nLCAnxZnDrWpuYScsXG4gICAgICAnbGlzdG9wYWR1JywgJ3Byb3NpbmNlJ1xuICAgIF1cbiAgXSxcbiAgW1xuICAgIFsnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLCAnNycsICc4JywgJzknLCAnMTAnLCAnMTEnLCAnMTInXSxcbiAgICBbJ2xlZCcsICfDum5vJywgJ2LFmWUnLCAnZHViJywgJ2t2xJsnLCAnxI12bicsICfEjXZjJywgJ3NycCcsICd6w6HFmScsICfFmcOtaicsICdsaXMnLCAncHJvJ10sXG4gICAgW1xuICAgICAgJ2xlZGVuJywgJ8O6bm9yJywgJ2LFmWV6ZW4nLCAnZHViZW4nLCAna3bEm3RlbicsICfEjWVydmVuJywgJ8SNZXJ2ZW5lYycsICdzcnBlbicsICd6w6HFmcOtJywgJ8WZw61qZW4nLFxuICAgICAgJ2xpc3RvcGFkJywgJ3Byb3NpbmVjJ1xuICAgIF1cbiAgXSxcbiAgW1sncMWZLm4ubC4nLCAnbi5sLiddLCBbJ3DFmS4gbi4gbC4nLCAnbi4gbC4nXSwgWydwxZllZCBuYcWhw61tIGxldG9wb8SNdGVtJywgJ25hxaFlaG8gbGV0b3BvxI10dSddXSxcbiAgMSxcbiAgWzYsIDBdLFxuICBbJ2RkLk1NLnl5JywgJ2QuIE0uIHknLCAnZC4gTU1NTSB5JywgJ0VFRUUgZC4gTU1NTSB5J10sXG4gIFsnSDptbScsICdIOm1tOnNzJywgJ0g6bW06c3MgeicsICdIOm1tOnNzIHp6enonXSxcbiAgWyd7MX0gezB9JywgdSwgdSwgdV0sXG4gIFsnLCcsICfCoCcsICc7JywgJyUnLCAnKycsICctJywgJ0UnLCAnw5cnLCAn4oCwJywgJ+KInicsICdOYU4nLCAnOiddLFxuICBbJyMsIyMwLiMjIycsICcjLCMjMMKgJScsICcjLCMjMC4wMMKgwqQnLCAnI0UwJ10sXG4gICdDWksnLFxuICAnS8SNJyxcbiAgJ8SNZXNrw6Ega29ydW5hJyxcbiAge1xuICAgICdBVUQnOiBbJ0FVJCcsICckJ10sXG4gICAgJ0NTSyc6IFsnS8SNcyddLFxuICAgICdDWksnOiBbJ0vEjSddLFxuICAgICdJTFMnOiBbdSwgJ+KCqiddLFxuICAgICdJTlInOiBbdSwgJ+KCuSddLFxuICAgICdKUFknOiBbJ0pQwqUnLCAnwqUnXSxcbiAgICAnUk9OJzogW3UsICdMJ10sXG4gICAgJ1RXRCc6IFsnTlQkJ10sXG4gICAgJ1VTRCc6IFsnVVMkJywgJyQnXSxcbiAgICAnVk5EJzogW3UsICfigqsnXSxcbiAgICAnWEVVJzogWydFQ1UnXSxcbiAgICAnWFhYJzogW11cbiAgfSxcbiAgJ2x0cicsXG4gIHBsdXJhbFxuXTtcbiJdfQ==
+
+/***/ }),
+
+/***/ "./node_modules/@angular/common/locales/da.js":
+/*!****************************************************!*\
+ !*** ./node_modules/@angular/common/locales/da.js ***!
+ \****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+(function (factory) {
+ if ( true && typeof module.exports === "object") {
+ var v = factory(null, exports);
+ if (v !== undefined) module.exports = v;
+ }
+ else if (true) {
+ !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),
+ __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
+ (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),
+ __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+ }
+})(function (require, exports) {
+ "use strict";
+ Object.defineProperty(exports, "__esModule", { value: true });
+ // THIS CODE IS GENERATED - DO NOT MODIFY
+ // See angular/tools/gulp-tasks/cldr/extract.js
+ var u = undefined;
+ function plural(n) {
+ var i = Math.floor(Math.abs(n)), t = parseInt(n.toString().replace(/^[^.]*\.?|0+$/g, ''), 10) || 0;
+ if (n === 1 || !(t === 0) && (i === 0 || i === 1))
+ return 1;
+ return 5;
+ }
+ exports.default = [
+ 'da',
+ [['a', 'p'], ['AM', 'PM'], u],
+ [['AM', 'PM'], u, u],
+ [
+ ['S', 'M', 'T', 'O', 'T', 'F', 'L'], ['søn.', 'man.', 'tir.', 'ons.', 'tor.', 'fre.', 'lør.'],
+ ['søndag', 'mandag', 'tirsdag', 'onsdag', 'torsdag', 'fredag', 'lørdag'],
+ ['sø', 'ma', 'ti', 'on', 'to', 'fr', 'lø']
+ ],
+ [
+ ['S', 'M', 'T', 'O', 'T', 'F', 'L'], ['søn', 'man', 'tir', 'ons', 'tor', 'fre', 'lør'],
+ ['søndag', 'mandag', 'tirsdag', 'onsdag', 'torsdag', 'fredag', 'lørdag'],
+ ['sø', 'ma', 'ti', 'on', 'to', 'fr', 'lø']
+ ],
+ [
+ ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],
+ ['jan.', 'feb.', 'mar.', 'apr.', 'maj', 'jun.', 'jul.', 'aug.', 'sep.', 'okt.', 'nov.', 'dec.'],
+ [
+ 'januar', 'februar', 'marts', 'april', 'maj', 'juni', 'juli', 'august', 'september',
+ 'oktober', 'november', 'december'
+ ]
+ ],
+ u,
+ [['fKr', 'eKr'], ['f.Kr.', 'e.Kr.'], u],
+ 1,
+ [6, 0],
+ ['dd.MM.y', 'd. MMM y', 'd. MMMM y', 'EEEE \'den\' d. MMMM y'],
+ ['HH.mm', 'HH.mm.ss', 'HH.mm.ss z', 'HH.mm.ss zzzz'],
+ ['{1} {0}', u, '{1} \'kl\'. {0}', u],
+ [',', '.', ';', '%', '+', '-', 'E', '×', '‰', '∞', 'NaN', '.'],
+ ['#,##0.###', '#,##0 %', '#,##0.00 ¤', '#E0'],
+ 'DKK',
+ 'kr.',
+ 'dansk krone',
+ {
+ 'AUD': ['AU$', '$'],
+ 'DKK': ['kr.'],
+ 'ISK': [u, 'kr.'],
+ 'JPY': ['JP¥', '¥'],
+ 'NOK': [u, 'kr.'],
+ 'RON': [u, 'L'],
+ 'SEK': [u, 'kr.'],
+ 'THB': ['฿'],
+ 'TWD': ['NT$'],
+ 'USD': ['US$', '$']
+ },
+ 'ltr',
+ plural
+ ];
+});
+//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21tb24vbG9jYWxlcy9kYS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7Ozs7Ozs7Ozs7OztJQUVILHlDQUF5QztJQUN6QywrQ0FBK0M7SUFFL0MsSUFBTSxDQUFDLEdBQUcsU0FBUyxDQUFDO0lBRXBCLFNBQVMsTUFBTSxDQUFDLENBQVM7UUFDdkIsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQzNCLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdEUsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFBRSxPQUFPLENBQUMsQ0FBQztRQUM1RCxPQUFPLENBQUMsQ0FBQztJQUNYLENBQUM7SUFFRCxrQkFBZTtRQUNiLElBQUk7UUFDSixDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM3QixDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDcEI7WUFDRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFN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QUM7U0FDcEI7UUFDRCxLQUFLO1FBQ0wsTUFBTTtLQUNQLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuLy8gVEhJUyBDT0RFIElTIEdFTkVSQVRFRCAtIERPIE5PVCBNT0RJRllcbi8vIFNlZSBhbmd1bGFyL3Rvb2xzL2d1bHAtdGFza3MvY2xkci9leHRyYWN0LmpzXG5cbmNvbnN0IHUgPSB1bmRlZmluZWQ7XG5cbmZ1bmN0aW9uIHBsdXJhbChuOiBudW1iZXIpOiBudW1iZXIge1xuICBsZXQgaSA9IE1hdGguZmxvb3IoTWF0aC5hYnMobikpLFxuICAgICAgdCA9IHBhcnNlSW50KG4udG9TdHJpbmcoKS5yZXBsYWNlKC9eW14uXSpcXC4/fDArJC9nLCAnJyksIDEwKSB8fCAwO1xuICBpZiAobiA9PT0gMSB8fCAhKHQgPT09IDApICYmIChpID09PSAwIHx8IGkgPT09IDEpKSByZXR1cm4gMTtcbiAgcmV0dXJuIDU7XG59XG5cbmV4cG9ydCBkZWZhdWx0IFtcbiAgJ2RhJyxcbiAgW1snYScsICdwJ10sIFsnQU0nLCAnUE0nXSwgdV0sXG4gIFtbJ0FNJywgJ1BNJ10sIHUsIHVdLFxuICBbXG4gICAgWydTJywgJ00nLCAnVCcsICdPJywgJ1QnLCAnRicsICdMJ10sIFsnc8O4bi4nLCAnbWFuLicsICd0aXIuJywgJ29ucy4nLCAndG9yLicsICdmcmUuJywgJ2zDuHIuJ10sXG4gICAgWydzw7huZGFnJywgJ21hbmRhZycsICd0aXJzZGFnJywgJ29uc2RhZycsICd0b3JzZGFnJywgJ2ZyZWRhZycsICdsw7hyZGFnJ10sXG4gICAgWydzw7gnLCAnbWEnLCAndGknLCAnb24nLCAndG8nLCAnZnInLCAnbMO4J11cbiAgXSxcbiAgW1xuICAgIFsnUycsICdNJywgJ1QnLCAnTycsICdUJywgJ0YnLCAnTCddLCBbJ3PDuG4nLCAnbWFuJywgJ3RpcicsICdvbnMnLCAndG9yJywgJ2ZyZScsICdsw7hyJ10sXG4gICAgWydzw7huZGFnJywgJ21hbmRhZycsICd0aXJzZGFnJywgJ29uc2RhZycsICd0b3JzZGFnJywgJ2ZyZWRhZycsICdsw7hyZGFnJ10sXG4gICAgWydzw7gnLCAnbWEnLCAndGknLCAnb24nLCAndG8nLCAnZnInLCAnbMO4J11cbiAgXSxcbiAgW1xuICAgIFsnSicsICdGJywgJ00nLCAnQScsICdNJywgJ0onLCAnSicsICdBJywgJ1MnLCAnTycsICdOJywgJ0QnXSxcbiAgICBbJ2phbi4nLCAnZmViLicsICdtYXIuJywgJ2Fwci4nLCAnbWFqJywgJ2p1bi4nLCAnanVsLicsICdhdWcuJywgJ3NlcC4nLCAnb2t0LicsICdub3YuJywgJ2RlYy4nXSxcbiAgICBbXG4gICAgICAnamFudWFyJywgJ2ZlYnJ1YXInLCAnbWFydHMnLCAnYXByaWwnLCAnbWFqJywgJ2p1bmknLCAnanVsaScsICdhdWd1c3QnLCAnc2VwdGVtYmVyJyxcbiAgICAgICdva3RvYmVyJywgJ25vdmVtYmVyJywgJ2RlY2VtYmVyJ1xuICAgIF1cbiAgXSxcbiAgdSxcbiAgW1snZktyJywgJ2VLciddLCBbJ2YuS3IuJywgJ2UuS3IuJ10sIHVdLFxuICAxLFxuICBbNiwgMF0sXG4gIFsnZGQuTU0ueScsICdkLiBNTU0geScsICdkLiBNTU1NIHknLCAnRUVFRSBcXCdkZW5cXCcgZC4gTU1NTSB5J10sXG4gIFsnSEgubW0nLCAnSEgubW0uc3MnLCAnSEgubW0uc3MgeicsICdISC5tbS5zcyB6enp6J10sXG4gIFsnezF9IHswfScsIHUsICd7MX0gXFwna2xcXCcuIHswfScsIHVdLFxuICBbJywnLCAnLicsICc7JywgJyUnLCAnKycsICctJywgJ0UnLCAnw5cnLCAn4oCwJywgJ+KInicsICdOYU4nLCAnLiddLFxuICBbJyMsIyMwLiMjIycsICcjLCMjMMKgJScsICcjLCMjMC4wMMKgwqQnLCAnI0UwJ10sXG4gICdES0snLFxuICAna3IuJyxcbiAgJ2RhbnNrIGtyb25lJyxcbiAge1xuICAgICdBVUQnOiBbJ0FVJCcsICckJ10sXG4gICAgJ0RLSyc6IFsna3IuJ10sXG4gICAgJ0lTSyc6IFt1LCAna3IuJ10sXG4gICAgJ0pQWSc6IFsnSlDCpScsICfCpSddLFxuICAgICdOT0snOiBbdSwgJ2tyLiddLFxuICAgICdST04nOiBbdSwgJ0wnXSxcbiAgICAnU0VLJzogW3UsICdrci4nXSxcbiAgICAnVEhCJzogWyfguL8nXSxcbiAgICAnVFdEJzogWydOVCQnXSxcbiAgICAnVVNEJzogWydVUyQnLCAnJCddXG4gIH0sXG4gICdsdHInLFxuICBwbHVyYWxcbl07XG4iXX0=
+
+/***/ }),
+
+/***/ "./node_modules/@angular/common/locales/de.js":
+/*!****************************************************!*\
+ !*** ./node_modules/@angular/common/locales/de.js ***!
+ \****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+(function (factory) {
+ if ( true && typeof module.exports === "object") {
+ var v = factory(null, exports);
+ if (v !== undefined) module.exports = v;
+ }
+ else if (true) {
+ !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),
+ __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
+ (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),
+ __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+ }
+})(function (require, exports) {
+ "use strict";
+ Object.defineProperty(exports, "__esModule", { value: true });
+ // THIS CODE IS GENERATED - DO NOT MODIFY
+ // See angular/tools/gulp-tasks/cldr/extract.js
+ var u = undefined;
+ function plural(n) {
+ var i = Math.floor(Math.abs(n)), v = n.toString().replace(/^[^.]*\.?/, '').length;
+ if (i === 1 && v === 0)
+ return 1;
+ return 5;
+ }
+ exports.default = [
+ 'de',
+ [['AM', 'PM'], u, u],
+ u,
+ [
+ ['S', 'M', 'D', 'M', 'D', 'F', 'S'], ['So.', 'Mo.', 'Di.', 'Mi.', 'Do.', 'Fr.', 'Sa.'],
+ ['Sonntag', 'Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag', 'Samstag'],
+ ['So.', 'Mo.', 'Di.', 'Mi.', 'Do.', 'Fr.', 'Sa.']
+ ],
+ [
+ ['S', 'M', 'D', 'M', 'D', 'F', 'S'], ['So', 'Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa'],
+ ['Sonntag', 'Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag', 'Samstag'],
+ ['So.', 'Mo.', 'Di.', 'Mi.', 'Do.', 'Fr.', 'Sa.']
+ ],
+ [
+ ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],
+ [
+ 'Jan.', 'Feb.', 'März', 'Apr.', 'Mai', 'Juni', 'Juli', 'Aug.', 'Sept.', 'Okt.', 'Nov.', 'Dez.'
+ ],
+ [
+ 'Januar', 'Februar', 'März', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober',
+ 'November', 'Dezember'
+ ]
+ ],
+ [
+ ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],
+ ['Jan', 'Feb', 'Mär', 'Apr', 'Mai', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dez'],
+ [
+ 'Januar', 'Februar', 'März', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober',
+ 'November', 'Dezember'
+ ]
+ ],
+ [['v. Chr.', 'n. Chr.'], u, u],
+ 1,
+ [6, 0],
+ ['dd.MM.yy', 'dd.MM.y', 'd. MMMM y', 'EEEE, d. MMMM y'],
+ ['HH:mm', 'HH:mm:ss', 'HH:mm:ss z', 'HH:mm:ss zzzz'],
+ ['{1}, {0}', u, '{1} \'um\' {0}', u],
+ [',', '.', ';', '%', '+', '-', 'E', '·', '‰', '∞', 'NaN', ':'],
+ ['#,##0.###', '#,##0 %', '#,##0.00 ¤', '#E0'],
+ 'EUR',
+ '€',
+ 'Euro',
+ {
+ 'ATS': ['öS'],
+ 'AUD': ['AU$', '$'],
+ 'BGM': ['BGK'],
+ 'BGO': ['BGJ'],
+ 'CUC': [u, 'Cub$'],
+ 'DEM': ['DM'],
+ 'FKP': [u, 'Fl£'],
+ 'GNF': [u, 'F.G.'],
+ 'KMF': [u, 'FC'],
+ 'RON': [u, 'L'],
+ 'RWF': [u, 'F.Rw'],
+ 'SYP': [],
+ 'THB': ['฿'],
+ 'TWD': ['NT$'],
+ 'XXX': [],
+ 'ZMW': [u, 'K']
+ },
+ 'ltr',
+ plural
+ ];
+});
+//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21tb24vbG9jYWxlcy9kZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7Ozs7Ozs7Ozs7OztJQUVILHlDQUF5QztJQUN6QywrQ0FBK0M7SUFFL0MsSUFBTSxDQUFDLEdBQUcsU0FBUyxDQUFDO0lBRXBCLFNBQVMsTUFBTSxDQUFDLENBQVM7UUFDdkIsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUNsRixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7WUFBRSxPQUFPLENBQUMsQ0FBQztRQUNqQyxPQUFPLENBQUMsQ0FBQztJQUNYLENBQUM7SUFFRCxrQkFBZTtRQUNiLElBQUk7UUFDSixDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDcEIsQ0FBQztRQUNEO1lBQ0UsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQztZQUN0RixDQUFDLFNBQVMsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLFNBQVMsQ0FBQztZQUNqRixDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxF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RSxNQUFNLENBQUM7WUFDbEIsS0FBSyxFQUFFLENBQUMsSUFBSSxDQUFDO1lBQ2IsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQztZQUNqQixLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDO1lBQ2xCLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUM7WUFDaEIsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQztZQUNmLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUM7WUFDbEIsS0FBSyxFQUFFLEVBQUU7WUFDVCxLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUM7WUFDWixLQUFLLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDZCxLQUFLLEVBQUUsRUFBRTtZQUNULEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUM7U0FDaEI7UUFDRCxLQUFLO1FBQ0wsTUFBTTtLQUNQLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuLy8gVEhJUyBDT0RFIElTIEdFTkVSQVRFRCAtIERPIE5PVCBNT0RJRllcbi8vIFNlZSBhbmd1bGFyL3Rvb2xzL2d1bHAtdGFza3MvY2xkci9leHRyYWN0LmpzXG5cbmNvbnN0IHUgPSB1bmRlZmluZWQ7XG5cbmZ1bmN0aW9uIHBsdXJhbChuOiBudW1iZXIpOiBudW1iZXIge1xuICBsZXQgaSA9IE1hdGguZmxvb3IoTWF0aC5hYnMobikpLCB2ID0gbi50b1N0cmluZygpLnJlcGxhY2UoL15bXi5dKlxcLj8vLCAnJykubGVuZ3RoO1xuICBpZiAoaSA9PT0gMSAmJiB2ID09PSAwKSByZXR1cm4gMTtcbiAgcmV0dXJuIDU7XG59XG5cbmV4cG9ydCBkZWZhdWx0IFtcbiAgJ2RlJyxcbiAgW1snQU0nLCAnUE0nXSwgdSwgdV0sXG4gIHUsXG4gIFtcbiAgICBbJ1MnLCAnTScsICdEJywgJ00nLCAnRCcsICdGJywgJ1MnXSwgWydTby4nLCAnTW8uJywgJ0RpLicsICdNaS4nLCAnRG8uJywgJ0ZyLicsICdTYS4nXSxcbiAgICBbJ1Nvbm50YWcnLCAnTW9udGFnJywgJ0RpZW5zdGFnJywgJ01pdHR3b2NoJywgJ0Rvbm5lcnN0YWcnLCAnRnJlaXRhZycsICdTYW1zdGFnJ10sXG4gICAgWydTby4nLCAnTW8uJywgJ0RpLicsICdNaS4nLCAnRG8uJywgJ0ZyLicsICdTYS4nXVxuICBdLFxuICBbXG4gICAgWydTJywgJ00nLCAnRCcsICdNJywgJ0QnLCAnRicsICdTJ10sIFsnU28nLCAnTW8nLCAnRGknLCAnTWknLCAnRG8nLCAnRnInLCAnU2EnXSxcbiAgICBbJ1Nvbm50YWcnLCAnTW9udGFnJywgJ0RpZW5zdGFnJywgJ01pdHR3b2NoJywgJ0Rvbm5lcnN0YWcnLCAnRnJlaXRhZycsICdTYW1zdGFnJ10sXG4gICAgWydTby4nLCAnTW8uJywgJ0RpLicsICdNaS4nLCAnRG8uJywgJ0ZyLicsICdTYS4nXVxuICBdLFxuICBbXG4gICAgWydKJywgJ0YnLCAnTScsICdBJywgJ00nLCAnSicsICdKJywgJ0EnLCAnUycsICdPJywgJ04nLCAnRCddLFxuICAgIFtcbiAgICAgICdKYW4uJywgJ0ZlYi4nLCAnTcOkcnonLCAnQXByLicsICdNYWknLCAnSnVuaScsICdKdWxpJywgJ0F1Zy4nLCAnU2VwdC4nLCAnT2t0LicsICdOb3YuJywgJ0Rlei4nXG4gICAgXSxcbiAgICBbXG4gICAgICAnSmFudWFyJywgJ0ZlYnJ1YXInLCAnTcOkcnonLCAnQXByaWwnLCAnTWFpJywgJ0p1bmknLCAnSnVsaScsICdBdWd1c3QnLCAnU2VwdGVtYmVyJywgJ09rdG9iZXInLFxuICAgICAgJ05vdmVtYmVyJywgJ0RlemVtYmVyJ1xuICAgIF1cbiAgXSxcbiAgW1xuICAgIFsnSicsICdGJywgJ00nLCAnQScsICdNJywgJ0onLCAnSicsICdBJywgJ1MnLCAnTycsICdOJywgJ0QnXSxcbiAgICBbJ0phbicsICdGZWInLCAnTcOkcicsICdBcHInLCAnTWFpJywgJ0p1bicsICdKdWwnLCAnQXVnJywgJ1NlcCcsICdPa3QnLCAnTm92JywgJ0RleiddLFxuICAgIFtcbiAgICAgICdKYW51YXInLCAnRmVicnVhcicsICdNw6RyeicsICdBcHJpbCcsICdNYWknLCAnSnVuaScsICdKdWxpJywgJ0F1Z3VzdCcsICdTZXB0ZW1iZXInLCAnT2t0b2JlcicsXG4gICAgICAnTm92ZW1iZXInLCAnRGV6ZW1iZXInXG4gICAgXVxuICBdLFxuICBbWyd2LiBDaHIuJywgJ24uIENoci4nXSwgdSwgdV0sXG4gIDEsXG4gIFs2LCAwXSxcbiAgWydkZC5NTS55eScsICdkZC5NTS55JywgJ2QuIE1NTU0geScsICdFRUVFLCBkLiBNTU1NIHknXSxcbiAgWydISDptbScsICdISDptbTpzcycsICdISDptbTpzcyB6JywgJ0hIOm1tOnNzIHp6enonXSxcbiAgWyd7MX0sIHswfScsIHUsICd7MX0gXFwndW1cXCcgezB9JywgdV0sXG4gIFsnLCcsICcuJywgJzsnLCAnJScsICcrJywgJy0nLCAnRScsICfCtycsICfigLAnLCAn4oieJywgJ05hTicsICc6J10sXG4gIFsnIywjIzAuIyMjJywgJyMsIyMwwqAlJywgJyMsIyMwLjAwwqDCpCcsICcjRTAnXSxcbiAgJ0VVUicsXG4gICfigqwnLFxuICAnRXVybycsXG4gIHtcbiAgICAnQVRTJzogWyfDtlMnXSxcbiAgICAnQVVEJzogWydBVSQnLCAnJCddLFxuICAgICdCR00nOiBbJ0JHSyddLFxuICAgICdCR08nOiBbJ0JHSiddLFxuICAgICdDVUMnOiBbdSwgJ0N1YiQnXSxcbiAgICAnREVNJzogWydETSddLFxuICAgICdGS1AnOiBbdSwgJ0ZswqMnXSxcbiAgICAnR05GJzogW3UsICdGLkcuJ10sXG4gICAgJ0tNRic6IFt1LCAnRkMnXSxcbiAgICAnUk9OJzogW3UsICdMJ10sXG4gICAgJ1JXRic6IFt1LCAnRi5SdyddLFxuICAgICdTWVAnOiBbXSxcbiAgICAnVEhCJzogWyfguL8nXSxcbiAgICAnVFdEJzogWydOVCQnXSxcbiAgICAnWFhYJzogW10sXG4gICAgJ1pNVyc6IFt1LCAnSyddXG4gIH0sXG4gICdsdHInLFxuICBwbHVyYWxcbl07XG4iXX0=
+
+/***/ }),
+
+/***/ "./node_modules/@angular/common/locales/el.js":
+/*!****************************************************!*\
+ !*** ./node_modules/@angular/common/locales/el.js ***!
+ \****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+(function (factory) {
+ if ( true && typeof module.exports === "object") {
+ var v = factory(null, exports);
+ if (v !== undefined) module.exports = v;
+ }
+ else if (true) {
+ !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),
+ __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
+ (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),
+ __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+ }
+})(function (require, exports) {
+ "use strict";
+ Object.defineProperty(exports, "__esModule", { value: true });
+ // THIS CODE IS GENERATED - DO NOT MODIFY
+ // See angular/tools/gulp-tasks/cldr/extract.js
+ var u = undefined;
+ function plural(n) {
+ if (n === 1)
+ return 1;
+ return 5;
+ }
+ exports.default = [
+ 'el',
+ [['πμ', 'μμ'], ['π.μ.', 'μ.μ.'], u],
+ u,
+ [
+ ['Κ', 'Δ', 'Τ', 'Τ', 'Π', 'Π', 'Σ'], ['Κυρ', 'Δευ', 'Τρί', 'Τετ', 'Πέμ', 'Παρ', 'Σάβ'],
+ ['Κυριακή', 'Δευτέρα', 'Τρίτη', 'Τετάρτη', 'Πέμπτη', 'Παρασκευή', 'Σάββατο'],
+ ['Κυ', 'Δε', 'Τρ', 'Τε', 'Πέ', 'Πα', 'Σά']
+ ],
+ u,
+ [
+ ['Ι', 'Φ', 'Μ', 'Α', 'Μ', 'Ι', 'Ι', 'Α', 'Σ', 'Ο', 'Ν', 'Δ'],
+ ['Ιαν', 'Φεβ', 'Μαρ', 'Απρ', 'Μαΐ', 'Ιουν', 'Ιουλ', 'Αυγ', 'Σεπ', 'Οκτ', 'Νοε', 'Δεκ'],
+ [
+ 'Ιανουαρίου', 'Φεβρουαρίου', 'Μαρτίου', 'Απριλίου', 'Μαΐου', 'Ιουνίου', 'Ιουλίου',
+ 'Αυγούστου', 'Σεπτεμβρίου', 'Οκτωβρίου', 'Νοεμβρίου', 'Δεκεμβρίου'
+ ]
+ ],
+ [
+ ['Ι', 'Φ', 'Μ', 'Α', 'Μ', 'Ι', 'Ι', 'Α', 'Σ', 'Ο', 'Ν', 'Δ'],
+ ['Ιαν', 'Φεβ', 'Μάρ', 'Απρ', 'Μάι', 'Ιούν', 'Ιούλ', 'Αύγ', 'Σεπ', 'Οκτ', 'Νοέ', 'Δεκ'],
+ [
+ 'Ιανουάριος', 'Φεβρουάριος', 'Μάρτιος', 'Απρίλιος', 'Μάιος', 'Ιούνιος', 'Ιούλιος',
+ 'Αύγουστος', 'Σεπτέμβριος', 'Οκτώβριος', 'Νοέμβριος', 'Δεκέμβριος'
+ ]
+ ],
+ [['π.Χ.', 'μ.Χ.'], u, ['προ Χριστού', 'μετά Χριστόν']],
+ 1,
+ [6, 0],
+ ['d/M/yy', 'd MMM y', 'd MMMM y', 'EEEE, d MMMM y'],
+ ['h:mm a', 'h:mm:ss a', 'h:mm:ss a z', 'h:mm:ss a zzzz'],
+ ['{1}, {0}', u, '{1} - {0}', u],
+ [',', '.', ';', '%', '+', '-', 'e', '×', '‰', '∞', 'NaN', ':'],
+ ['#,##0.###', '#,##0%', '#,##0.00 ¤', '#E0'],
+ 'EUR',
+ '€',
+ 'Ευρώ',
+ { 'GRD': ['Δρχ'], 'JPY': ['JP¥', '¥'], 'THB': ['฿'] },
+ 'ltr',
+ plural
+ ];
+});
+//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21tb24vbG9jYWxlcy9lbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7Ozs7Ozs7Ozs7OztJQUVILHlDQUF5QztJQUN6QywrQ0FBK0M7SUFFL0MsSUFBTSxDQUFDLEdBQUcsU0FBUyxDQUFDO0lBRXBCLFNBQVMsTUFBTSxDQUFDLENBQVM7UUFDdkIsSUFBSSxDQUFDLEtBQUssQ0FBQztZQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3RCLE9BQU8sQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUVELGtCQUFlO1FBQ2IsSUFBSTtRQUNKLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ25DLENBQUM7UUFDRDtZQUNFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUM7WUFDdEYsQ0FBQyxTQUFTLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxTQUFTLENBQUM7WUFDNUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUM7U0FDM0M7UUFDRCxDQUFDO1FBQ0Q7WUFDRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDO1lBQzVELENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUM7WUFDdEY7Z0JBQ0UsWUFBWSxFQUFFLGFBQWEsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsU0FBUztnQkFDakYsV0FBVyxFQUFFLGFBQWEsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLFlBQVk7YUFDbkU7U0FDRjtRQUNEO1lBQ0UsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQztZQUM1RCxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDO1lBQ3RGO2dCQUNFLFlBQVksRUFBRSxhQUFhLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVM7Z0JBQ2pGLFdBQVcsRUFBRSxhQUFhLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxZQUFZO2FBQ25FO1NBQ0Y7UUFDRCxDQUFDLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLGFBQWEsRUFBRSxjQUFjLENBQUMsQ0FBQztRQUN0RCxDQUFDO1FBQ0QsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ04sQ0FBQyxRQUFRLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxnQkFBZ0IsQ0FBQztRQUNuRCxDQUFDLFFBQVEsRUFBRSxXQUFXLEVBQUUsYUFBYSxFQUFFLGdCQUFnQixDQUFDO1FBQ3hELENBQUMsVUFBVSxFQUFFLENBQUMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUM7UUFDOUQsQ0FBQyxXQUFXLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxLQUFLLENBQUM7UUFDNUMsS0FBSztRQUNMLEdBQUc7UUFDSCxNQUFNO1FBQ04sRUFBQyxLQUFLLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUM7UUFDbkQsS0FBSztRQUNMLE1BQU07S0FDUCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbi8vIFRISVMgQ09ERSBJUyBHRU5FUkFURUQgLSBETyBOT1QgTU9ESUZZXG4vLyBTZWUgYW5ndWxhci90b29scy9ndWxwLXRhc2tzL2NsZHIvZXh0cmFjdC5qc1xuXG5jb25zdCB1ID0gdW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBwbHVyYWwobjogbnVtYmVyKTogbnVtYmVyIHtcbiAgaWYgKG4gPT09IDEpIHJldHVybiAxO1xuICByZXR1cm4gNTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgW1xuICAnZWwnLFxuICBbWyfPgM68JywgJ868zrwnXSwgWyfPgC7OvC4nLCAnzrwuzrwuJ10sIHVdLFxuICB1LFxuICBbXG4gICAgWyfOmicsICfOlCcsICfOpCcsICfOpCcsICfOoCcsICfOoCcsICfOoyddLCBbJ86az4XPgScsICfOlM61z4UnLCAnzqTPgc6vJywgJ86kzrXPhCcsICfOoM6tzrwnLCAnzqDOsc+BJywgJ86jzqzOsiddLFxuICAgIFsnzprPhc+BzrnOsc66zq4nLCAnzpTOtc+Fz4TOrc+BzrEnLCAnzqTPgc6vz4TOtycsICfOpM61z4TOrM+Bz4TOtycsICfOoM6tzrzPgM+EzrcnLCAnzqDOsc+BzrHPg866zrXPhc6uJywgJ86jzqzOss6yzrHPhM6/J10sXG4gICAgWyfOms+FJywgJ86UzrUnLCAnzqTPgScsICfOpM61JywgJ86gzq0nLCAnzqDOsScsICfOo86sJ11cbiAgXSxcbiAgdSxcbiAgW1xuICAgIFsnzpknLCAnzqYnLCAnzpwnLCAnzpEnLCAnzpwnLCAnzpknLCAnzpknLCAnzpEnLCAnzqMnLCAnzp8nLCAnzp0nLCAnzpQnXSxcbiAgICBbJ86ZzrHOvScsICfOps61zrInLCAnzpzOsc+BJywgJ86Rz4DPgScsICfOnM6xzpAnLCAnzpnOv8+Fzr0nLCAnzpnOv8+FzrsnLCAnzpHPhc6zJywgJ86jzrXPgCcsICfOn866z4QnLCAnzp3Ov861JywgJ86UzrXOuiddLFxuICAgIFtcbiAgICAgICfOmc6xzr3Ov8+FzrHPgc6vzr/PhScsICfOps61zrLPgc6/z4XOsc+Bzq/Ov8+FJywgJ86czrHPgc+Ezq/Ov8+FJywgJ86Rz4DPgc65zrvOr86/z4UnLCAnzpzOsc6Qzr/PhScsICfOmc6/z4XOvc6vzr/PhScsICfOmc6/z4XOu86vzr/PhScsXG4gICAgICAnzpHPhc6zzr/Pjc+Dz4TOv8+FJywgJ86jzrXPgM+EzrXOvM6yz4HOr86/z4UnLCAnzp/Ous+Ez4nOss+Bzq/Ov8+FJywgJ86dzr/Otc68zrLPgc6vzr/PhScsICfOlM61zrrOtc68zrLPgc6vzr/PhSdcbiAgICBdXG4gIF0sXG4gIFtcbiAgICBbJ86ZJywgJ86mJywgJ86cJywgJ86RJywgJ86cJywgJ86ZJywgJ86ZJywgJ86RJywgJ86jJywgJ86fJywgJ86dJywgJ86UJ10sXG4gICAgWyfOmc6xzr0nLCAnzqbOtc6yJywgJ86czqzPgScsICfOkc+Az4EnLCAnzpzOrM65JywgJ86Zzr/Pjc69JywgJ86Zzr/Pjc67JywgJ86Rz43OsycsICfOo861z4AnLCAnzp/Ous+EJywgJ86dzr/OrScsICfOlM61zronXSxcbiAgICBbXG4gICAgICAnzpnOsc69zr/Phc6sz4HOuc6/z4InLCAnzqbOtc6yz4HOv8+FzqzPgc65zr/PgicsICfOnM6sz4HPhM65zr/PgicsICfOkc+Az4HOr867zrnOv8+CJywgJ86czqzOuc6/z4InLCAnzpnOv8+Nzr3Ouc6/z4InLCAnzpnOv8+NzrvOuc6/z4InLFxuICAgICAgJ86Rz43Os86/z4XPg8+Ezr/PgicsICfOo861z4DPhM6tzrzOss+BzrnOv8+CJywgJ86fzrrPhM+OzrLPgc65zr/PgicsICfOnc6/zq3OvM6yz4HOuc6/z4InLCAnzpTOtc66zq3OvM6yz4HOuc6/z4InXG4gICAgXVxuICBdLFxuICBbWyfPgC7Opy4nLCAnzrwuzqcuJ10sIHUsIFsnz4DPgc6/IM6nz4HOuc+Dz4TOv8+NJywgJ868zrXPhM6sIM6nz4HOuc+Dz4TPjM69J11dLFxuICAxLFxuICBbNiwgMF0sXG4gIFsnZC9NL3l5JywgJ2QgTU1NIHknLCAnZCBNTU1NIHknLCAnRUVFRSwgZCBNTU1NIHknXSxcbiAgWydoOm1tIGEnLCAnaDptbTpzcyBhJywgJ2g6bW06c3MgYSB6JywgJ2g6bW06c3MgYSB6enp6J10sXG4gIFsnezF9LCB7MH0nLCB1LCAnezF9IC0gezB9JywgdV0sXG4gIFsnLCcsICcuJywgJzsnLCAnJScsICcrJywgJy0nLCAnZScsICfDlycsICfigLAnLCAn4oieJywgJ05hTicsICc6J10sXG4gIFsnIywjIzAuIyMjJywgJyMsIyMwJScsICcjLCMjMC4wMMKgwqQnLCAnI0UwJ10sXG4gICdFVVInLFxuICAn4oKsJyxcbiAgJ86Vz4XPgc+OJyxcbiAgeydHUkQnOiBbJ86Uz4HPhyddLCAnSlBZJzogWydKUMKlJywgJ8KlJ10sICdUSEInOiBbJ+C4vyddfSxcbiAgJ2x0cicsXG4gIHBsdXJhbFxuXTtcbiJdfQ==
+
+/***/ }),
+
+/***/ "./node_modules/@angular/common/locales/en-GB.js":
+/*!*******************************************************!*\
+ !*** ./node_modules/@angular/common/locales/en-GB.js ***!
+ \*******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+(function (factory) {
+ if ( true && typeof module.exports === "object") {
+ var v = factory(null, exports);
+ if (v !== undefined) module.exports = v;
+ }
+ else if (true) {
+ !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),
+ __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
+ (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),
+ __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+ }
+})(function (require, exports) {
+ "use strict";
+ Object.defineProperty(exports, "__esModule", { value: true });
+ // THIS CODE IS GENERATED - DO NOT MODIFY
+ // See angular/tools/gulp-tasks/cldr/extract.js
+ var u = undefined;
+ function plural(n) {
+ var i = Math.floor(Math.abs(n)), v = n.toString().replace(/^[^.]*\.?/, '').length;
+ if (i === 1 && v === 0)
+ return 1;
+ return 5;
+ }
+ exports.default = [
+ 'en-GB',
+ [['a', 'p'], ['am', 'pm'], u],
+ [['am', 'pm'], u, u],
+ [
+ ['S', 'M', 'T', 'W', 'T', 'F', 'S'], ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
+ ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
+ ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa']
+ ],
+ u,
+ [
+ ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],
+ ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
+ [
+ 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September',
+ 'October', 'November', 'December'
+ ]
+ ],
+ u,
+ [['B', 'A'], ['BC', 'AD'], ['Before Christ', 'Anno Domini']],
+ 1,
+ [6, 0],
+ ['dd/MM/y', 'd MMM y', 'd MMMM y', 'EEEE, d MMMM y'],
+ ['HH:mm', 'HH:mm:ss', 'HH:mm:ss z', 'HH:mm:ss zzzz'],
+ ['{1}, {0}', u, '{1} \'at\' {0}', u],
+ ['.', ',', ';', '%', '+', '-', 'E', '×', '‰', '∞', 'NaN', ':'],
+ ['#,##0.###', '#,##0%', '¤#,##0.00', '#E0'],
+ 'GBP',
+ '£',
+ 'British Pound',
+ { 'JPY': ['JP¥', '¥'], 'USD': ['US$', '$'] },
+ 'ltr',
+ plural
+ ];
+});
+//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW4tR0IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21tb24vbG9jYWxlcy9lbi1HQi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7Ozs7Ozs7Ozs7OztJQUVILHlDQUF5QztJQUN6QywrQ0FBK0M7SUFFL0MsSUFBTSxDQUFDLEdBQUcsU0FBUyxDQUFDO0lBRXBCLFNBQVMsTUFBTSxDQUFDLENBQVM7UUFDdkIsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUNsRixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7WUFBRSxPQUFPLENBQUMsQ0FBQztRQUNqQyxPQUFPLENBQUMsQ0FBQztJQUNYLENBQUM7SUFFRCxrQkFBZTtRQUNiLE9BQU87UUFDUCxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM3QixDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDcEI7WUFDRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDO1lBQ3RGLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsVUFBVSxDQUFDO1lBQzlFLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDO1NBQzNDO1FBQ0QsQ0FBQztRQUNEO1lBQ0UsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQztZQUM1RCxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDO1lBQ3BGO2dCQUNFLFNBQVMsRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsV0FBVztnQkFDckYsU0FBUyxFQUFFLFVBQVUsRUFBRSxVQUFVO2FBQ2xDO1NBQ0Y7UUFDRCxDQUFDO1FBQ0QsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLGVBQWUsRUFBRSxhQUFhLENBQUMsQ0FBQztRQUM1RCxDQUFDO1FBQ0QsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ04sQ0FBQyxTQUFTLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxnQkFBZ0IsQ0FBQztRQUNwRCxDQUFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLGVBQWUsQ0FBQztRQUNwRCxDQUFDLFVBQVUsRUFBRSxDQUFDLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDO1FBQ3BDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUM7UUFDOUQsQ0FBQyxXQUFXLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxLQUFLLENBQUM7UUFDM0MsS0FBSztRQUNMLEdBQUc7UUFDSCxlQUFlO1FBQ2YsRUFBQyxLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxFQUFDO1FBQzFDLEtBQUs7UUFDTCxNQUFNO0tBQ1AsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuXG4vLyBUSElTIENPREUgSVMgR0VORVJBVEVEIC0gRE8gTk9UIE1PRElGWVxuLy8gU2VlIGFuZ3VsYXIvdG9vbHMvZ3VscC10YXNrcy9jbGRyL2V4dHJhY3QuanNcblxuY29uc3QgdSA9IHVuZGVmaW5lZDtcblxuZnVuY3Rpb24gcGx1cmFsKG46IG51bWJlcik6IG51bWJlciB7XG4gIGxldCBpID0gTWF0aC5mbG9vcihNYXRoLmFicyhuKSksIHYgPSBuLnRvU3RyaW5nKCkucmVwbGFjZSgvXlteLl0qXFwuPy8sICcnKS5sZW5ndGg7XG4gIGlmIChpID09PSAxICYmIHYgPT09IDApIHJldHVybiAxO1xuICByZXR1cm4gNTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgW1xuICAnZW4tR0InLFxuICBbWydhJywgJ3AnXSwgWydhbScsICdwbSddLCB1XSxcbiAgW1snYW0nLCAncG0nXSwgdSwgdV0sXG4gIFtcbiAgICBbJ1MnLCAnTScsICdUJywgJ1cnLCAnVCcsICdGJywgJ1MnXSwgWydTdW4nLCAnTW9uJywgJ1R1ZScsICdXZWQnLCAnVGh1JywgJ0ZyaScsICdTYXQnXSxcbiAgICBbJ1N1bmRheScsICdNb25kYXknLCAnVHVlc2RheScsICdXZWRuZXNkYXknLCAnVGh1cnNkYXknLCAnRnJpZGF5JywgJ1NhdHVyZGF5J10sXG4gICAgWydTdScsICdNbycsICdUdScsICdXZScsICdUaCcsICdGcicsICdTYSddXG4gIF0sXG4gIHUsXG4gIFtcbiAgICBbJ0onLCAnRicsICdNJywgJ0EnLCAnTScsICdKJywgJ0onLCAnQScsICdTJywgJ08nLCAnTicsICdEJ10sXG4gICAgWydKYW4nLCAnRmViJywgJ01hcicsICdBcHInLCAnTWF5JywgJ0p1bicsICdKdWwnLCAnQXVnJywgJ1NlcCcsICdPY3QnLCAnTm92JywgJ0RlYyddLFxuICAgIFtcbiAgICAgICdKYW51YXJ5JywgJ0ZlYnJ1YXJ5JywgJ01hcmNoJywgJ0FwcmlsJywgJ01heScsICdKdW5lJywgJ0p1bHknLCAnQXVndXN0JywgJ1NlcHRlbWJlcicsXG4gICAgICAnT2N0b2JlcicsICdOb3ZlbWJlcicsICdEZWNlbWJlcidcbiAgICBdXG4gIF0sXG4gIHUsXG4gIFtbJ0InLCAnQSddLCBbJ0JDJywgJ0FEJ10sIFsnQmVmb3JlIENocmlzdCcsICdBbm5vIERvbWluaSddXSxcbiAgMSxcbiAgWzYsIDBdLFxuICBbJ2RkL01NL3knLCAnZCBNTU0geScsICdkIE1NTU0geScsICdFRUVFLCBkIE1NTU0geSddLFxuICBbJ0hIOm1tJywgJ0hIOm1tOnNzJywgJ0hIOm1tOnNzIHonLCAnSEg6bW06c3Mgenp6eiddLFxuICBbJ3sxfSwgezB9JywgdSwgJ3sxfSBcXCdhdFxcJyB7MH0nLCB1XSxcbiAgWycuJywgJywnLCAnOycsICclJywgJysnLCAnLScsICdFJywgJ8OXJywgJ+KAsCcsICfiiJ4nLCAnTmFOJywgJzonXSxcbiAgWycjLCMjMC4jIyMnLCAnIywjIzAlJywgJ8KkIywjIzAuMDAnLCAnI0UwJ10sXG4gICdHQlAnLFxuICAnwqMnLFxuICAnQnJpdGlzaCBQb3VuZCcsXG4gIHsnSlBZJzogWydKUMKlJywgJ8KlJ10sICdVU0QnOiBbJ1VTJCcsICckJ119LFxuICAnbHRyJyxcbiAgcGx1cmFsXG5dO1xuIl19
+
+/***/ }),
+
+/***/ "./node_modules/@angular/common/locales/en-IN.js":
+/*!*******************************************************!*\
+ !*** ./node_modules/@angular/common/locales/en-IN.js ***!
+ \*******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+(function (factory) {
+ if ( true && typeof module.exports === "object") {
+ var v = factory(null, exports);
+ if (v !== undefined) module.exports = v;
+ }
+ else if (true) {
+ !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),
+ __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
+ (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),
+ __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+ }
+})(function (require, exports) {
+ "use strict";
+ Object.defineProperty(exports, "__esModule", { value: true });
+ // THIS CODE IS GENERATED - DO NOT MODIFY
+ // See angular/tools/gulp-tasks/cldr/extract.js
+ var u = undefined;
+ function plural(n) {
+ var i = Math.floor(Math.abs(n)), v = n.toString().replace(/^[^.]*\.?/, '').length;
+ if (i === 1 && v === 0)
+ return 1;
+ return 5;
+ }
+ exports.default = [
+ 'en-IN',
+ [['a', 'p'], ['am', 'pm'], u],
+ [['am', 'pm'], u, u],
+ [
+ ['S', 'M', 'T', 'W', 'T', 'F', 'S'], ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
+ ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
+ ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa']
+ ],
+ u,
+ [
+ ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],
+ ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
+ [
+ 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September',
+ 'October', 'November', 'December'
+ ]
+ ],
+ u,
+ [['B', 'A'], ['BC', 'AD'], ['Before Christ', 'Anno Domini']],
+ 0,
+ [0, 0],
+ ['dd/MM/yy', 'dd-MMM-y', 'd MMMM y', 'EEEE, d MMMM, y'],
+ ['h:mm a', 'h:mm:ss a', 'h:mm:ss a z', 'h:mm:ss a zzzz'],
+ ['{1}, {0}', u, '{1} \'at\' {0}', u],
+ ['.', ',', ';', '%', '+', '-', 'E', '×', '‰', '∞', 'NaN', ':'],
+ ['#,##,##0.###', '#,##,##0%', '¤#,##,##0.00', '#E0'],
+ 'INR',
+ '₹',
+ 'Indian Rupee',
+ { 'JPY': ['JP¥', '¥'], 'USD': ['US$', '$'] },
+ 'ltr',
+ plural
+ ];
+});
+//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW4tSU4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21tb24vbG9jYWxlcy9lbi1JTi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7Ozs7Ozs7Ozs7OztJQUVILHlDQUF5QztJQUN6QywrQ0FBK0M7SUFFL0MsSUFBTSxDQUFDLEdBQUcsU0FBUyxDQUFDO0lBRXBCLFNBQVMsTUFBTSxDQUFDLENBQVM7UUFDdkIsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUNsRixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7WUFBRSxPQUFPLENBQUMsQ0FBQztRQUNqQyxPQUFPLENBQUMsQ0FBQztJQUNYLENBQUM7SUFFRCxrQkFBZTtRQUNiLE9BQU87UUFDUCxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM3QixDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDcEI7WUFDRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDO1lBQ3RGLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsVUFBVSxDQUFDO1lBQzlFLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDO1NBQzNDO1FBQ0QsQ0FBQztRQUNEO1lBQ0UsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQztZQUM1RCxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDO1lBQ3BGO2dCQUNFLFNBQVMsRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsV0FBVztnQkFDckYsU0FBUyxFQUFFLFVBQVUsRUFBRSxVQUFVO2FBQ2xDO1NBQ0Y7UUFDRCxDQUFDO1FBQ0QsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLGVBQWUsRUFBRSxhQUFhLENBQUMsQ0FBQztRQUM1RCxDQUFDO1FBQ0QsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ04sQ0FBQyxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxpQkFBaUIsQ0FBQztRQUN2RCxDQUFDLFFBQVEsRUFBRSxXQUFXLEVBQUUsYUFBYSxFQUFFLGdCQUFnQixDQUFDO1FBQ3hELENBQUMsVUFBVSxFQUFFLENBQUMsRUFBRSxnQkFBZ0IsRUFBRSxDQUFDLENBQUM7UUFDcEMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQztRQUM5RCxDQUFDLGNBQWMsRUFBRSxXQUFXLEVBQUUsY0FBYyxFQUFFLEtBQUssQ0FBQztRQUNwRCxLQUFLO1FBQ0wsR0FBRztRQUNILGNBQWM7UUFDZCxFQUFDLEtBQUssRUFBRSxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLEVBQUM7UUFDMUMsS0FBSztRQUNMLE1BQU07S0FDUCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbi8vIFRISVMgQ09ERSBJUyBHRU5FUkFURUQgLSBETyBOT1QgTU9ESUZZXG4vLyBTZWUgYW5ndWxhci90b29scy9ndWxwLXRhc2tzL2NsZHIvZXh0cmFjdC5qc1xuXG5jb25zdCB1ID0gdW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBwbHVyYWwobjogbnVtYmVyKTogbnVtYmVyIHtcbiAgbGV0IGkgPSBNYXRoLmZsb29yKE1hdGguYWJzKG4pKSwgdiA9IG4udG9TdHJpbmcoKS5yZXBsYWNlKC9eW14uXSpcXC4/LywgJycpLmxlbmd0aDtcbiAgaWYgKGkgPT09IDEgJiYgdiA9PT0gMCkgcmV0dXJuIDE7XG4gIHJldHVybiA1O1xufVxuXG5leHBvcnQgZGVmYXVsdCBbXG4gICdlbi1JTicsXG4gIFtbJ2EnLCAncCddLCBbJ2FtJywgJ3BtJ10sIHVdLFxuICBbWydhbScsICdwbSddLCB1LCB1XSxcbiAgW1xuICAgIFsnUycsICdNJywgJ1QnLCAnVycsICdUJywgJ0YnLCAnUyddLCBbJ1N1bicsICdNb24nLCAnVHVlJywgJ1dlZCcsICdUaHUnLCAnRnJpJywgJ1NhdCddLFxuICAgIFsnU3VuZGF5JywgJ01vbmRheScsICdUdWVzZGF5JywgJ1dlZG5lc2RheScsICdUaHVyc2RheScsICdGcmlkYXknLCAnU2F0dXJkYXknXSxcbiAgICBbJ1N1JywgJ01vJywgJ1R1JywgJ1dlJywgJ1RoJywgJ0ZyJywgJ1NhJ11cbiAgXSxcbiAgdSxcbiAgW1xuICAgIFsnSicsICdGJywgJ00nLCAnQScsICdNJywgJ0onLCAnSicsICdBJywgJ1MnLCAnTycsICdOJywgJ0QnXSxcbiAgICBbJ0phbicsICdGZWInLCAnTWFyJywgJ0FwcicsICdNYXknLCAnSnVuJywgJ0p1bCcsICdBdWcnLCAnU2VwJywgJ09jdCcsICdOb3YnLCAnRGVjJ10sXG4gICAgW1xuICAgICAgJ0phbnVhcnknLCAnRmVicnVhcnknLCAnTWFyY2gnLCAnQXByaWwnLCAnTWF5JywgJ0p1bmUnLCAnSnVseScsICdBdWd1c3QnLCAnU2VwdGVtYmVyJyxcbiAgICAgICdPY3RvYmVyJywgJ05vdmVtYmVyJywgJ0RlY2VtYmVyJ1xuICAgIF1cbiAgXSxcbiAgdSxcbiAgW1snQicsICdBJ10sIFsnQkMnLCAnQUQnXSwgWydCZWZvcmUgQ2hyaXN0JywgJ0Fubm8gRG9taW5pJ11dLFxuICAwLFxuICBbMCwgMF0sXG4gIFsnZGQvTU0veXknLCAnZGQtTU1NLXknLCAnZCBNTU1NIHknLCAnRUVFRSwgZCBNTU1NLCB5J10sXG4gIFsnaDptbSBhJywgJ2g6bW06c3MgYScsICdoOm1tOnNzIGEgeicsICdoOm1tOnNzIGEgenp6eiddLFxuICBbJ3sxfSwgezB9JywgdSwgJ3sxfSBcXCdhdFxcJyB7MH0nLCB1XSxcbiAgWycuJywgJywnLCAnOycsICclJywgJysnLCAnLScsICdFJywgJ8OXJywgJ+KAsCcsICfiiJ4nLCAnTmFOJywgJzonXSxcbiAgWycjLCMjLCMjMC4jIyMnLCAnIywjIywjIzAlJywgJ8KkIywjIywjIzAuMDAnLCAnI0UwJ10sXG4gICdJTlInLFxuICAn4oK5JyxcbiAgJ0luZGlhbiBSdXBlZScsXG4gIHsnSlBZJzogWydKUMKlJywgJ8KlJ10sICdVU0QnOiBbJ1VTJCcsICckJ119LFxuICAnbHRyJyxcbiAgcGx1cmFsXG5dO1xuIl19
+
+/***/ }),
+
+/***/ "./node_modules/@angular/common/locales/es.js":
+/*!****************************************************!*\
+ !*** ./node_modules/@angular/common/locales/es.js ***!
+ \****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+(function (factory) {
+ if ( true && typeof module.exports === "object") {
+ var v = factory(null, exports);
+ if (v !== undefined) module.exports = v;
+ }
+ else if (true) {
+ !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),
+ __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
+ (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),
+ __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+ }
+})(function (require, exports) {
+ "use strict";
+ Object.defineProperty(exports, "__esModule", { value: true });
+ // THIS CODE IS GENERATED - DO NOT MODIFY
+ // See angular/tools/gulp-tasks/cldr/extract.js
+ var u = undefined;
+ function plural(n) {
+ if (n === 1)
+ return 1;
+ return 5;
+ }
+ exports.default = [
+ 'es',
+ [['a. m.', 'p. m.'], u, u],
+ u,
+ [
+ ['D', 'L', 'M', 'X', 'J', 'V', 'S'], ['dom.', 'lun.', 'mar.', 'mié.', 'jue.', 'vie.', 'sáb.'],
+ ['domingo', 'lunes', 'martes', 'miércoles', 'jueves', 'viernes', 'sábado'],
+ ['DO', 'LU', 'MA', 'MI', 'JU', 'VI', 'SA']
+ ],
+ u,
+ [
+ ['E', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],
+ [
+ 'ene.', 'feb.', 'mar.', 'abr.', 'may.', 'jun.', 'jul.', 'ago.', 'sept.', 'oct.', 'nov.',
+ 'dic.'
+ ],
+ [
+ 'enero', 'febrero', 'marzo', 'abril', 'mayo', 'junio', 'julio', 'agosto', 'septiembre',
+ 'octubre', 'noviembre', 'diciembre'
+ ]
+ ],
+ u,
+ [['a. C.', 'd. C.'], u, ['antes de Cristo', 'después de Cristo']],
+ 1,
+ [6, 0],
+ ['d/M/yy', 'd MMM y', 'd \'de\' MMMM \'de\' y', 'EEEE, d \'de\' MMMM \'de\' y'],
+ ['H:mm', 'H:mm:ss', 'H:mm:ss z', 'H:mm:ss (zzzz)'],
+ ['{1} {0}', u, '{1}, {0}', u],
+ [',', '.', ';', '%', '+', '-', 'E', '×', '‰', '∞', 'NaN', ':'],
+ ['#,##0.###', '#,##0 %', '#,##0.00 ¤', '#E0'],
+ 'EUR',
+ '€',
+ 'euro',
+ {
+ 'AUD': [u, '$'],
+ 'BRL': [u, 'R$'],
+ 'CNY': [u, '¥'],
+ 'EGP': [],
+ 'ESP': ['₧'],
+ 'GBP': [u, '£'],
+ 'HKD': [u, '$'],
+ 'ILS': [u, '₪'],
+ 'INR': [u, '₹'],
+ 'JPY': [u, '¥'],
+ 'KRW': [u, '₩'],
+ 'MXN': [u, '$'],
+ 'NZD': [u, '$'],
+ 'RON': [u, 'L'],
+ 'THB': ['฿'],
+ 'TWD': [u, 'NT$'],
+ 'USD': ['US$', '$'],
+ 'XAF': [],
+ 'XCD': [u, '$'],
+ 'XOF': []
+ },
+ 'ltr',
+ plural
+ ];
+});
+//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21tb24vbG9jYWxlcy9lcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7Ozs7Ozs7Ozs7OztJQUVILHlDQUF5QztJQUN6QywrQ0FBK0M7SUFFL0MsSUFBTSxDQUFDLEdBQUcsU0FBUyxDQUFDO0lBRXBCLFNBQVMsTUFBTSxDQUFDLENBQVM7UUFDdkIsSUFBSSxDQUFDLEtBQUssQ0FBQztZQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3RCLE9BQU8sQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUVELGtCQUFlO1FBQ2IsSUFBSTtRQUNKLENBQUMsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMxQixDQUFDO1FBQ0Q7WUFDRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDO1lBQzdGLENBQUMsU0FBUyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsUUFBUSxDQUFDO1lBQzFFLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDO1NBQzNDO1FBQ0QsQ0FBQztRQUNEO1lBQ0UsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQztZQUM1RDtnQkFDRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTTtnQkFDdkYsTUFBTTthQUNQO1lBQ0Q7Z0JBQ0UsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxZQUFZO2dCQUN0RixTQUFTLEVBQUUsV0FBVyxFQUFFLFdBQVc7YUFDcEM7U0FDRjtRQUNELENBQUM7UUFDRCxDQUFDLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLGlCQUFpQixFQUFFLG1CQUFtQixDQUFDLENBQUM7UUFDakUsQ0FBQztRQUNELENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNOLENBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRSx3QkFBd0IsRUFBRSw4QkFBOEIsQ0FBQztRQUMvRSxDQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLGdCQUFnQixDQUFDO1FBQ2xELENBQUMsU0FBUyxFQUFFLENBQUMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBQzdCLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUM7UUFDOUQsQ0FBQyxXQUFXLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLENBQUM7UUFDN0MsS0FBSztRQUNMLEdBQUc7UUFDSCxNQUFNO1FBQ047WUFDRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDO1lBQ2YsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQztZQUNoQixLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDO1lBQ2YsS0FBSyxFQUFFLEVBQUU7WUFDVCxLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUM7WUFDWixLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDO1lBQ2YsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQztZQUNmLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUM7WUFDZixLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDO1lBQ2YsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQztZQUNmLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUM7WUFDZixLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDO1lBQ2YsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQztZQUNmLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUM7WUFDZixLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUM7WUFDWixLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDO1lBQ2pCLEtBQUssRUFBRSxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUM7WUFDbkIsS0FBSyxFQUFFLEVBQUU7WUFDVCxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDO1lBQ2YsS0FBSyxFQUFFLEVBQUU7U0FDVjtRQUNELEtBQUs7UUFDTCxNQUFNO0tBQ1AsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuXG4vLyBUSElTIENPREUgSVMgR0VORVJBVEVEIC0gRE8gTk9UIE1PRElGWVxuLy8gU2VlIGFuZ3VsYXIvdG9vbHMvZ3VscC10YXNrcy9jbGRyL2V4dHJhY3QuanNcblxuY29uc3QgdSA9IHVuZGVmaW5lZDtcblxuZnVuY3Rpb24gcGx1cmFsKG46IG51bWJlcik6IG51bWJlciB7XG4gIGlmIChuID09PSAxKSByZXR1cm4gMTtcbiAgcmV0dXJuIDU7XG59XG5cbmV4cG9ydCBkZWZhdWx0IFtcbiAgJ2VzJyxcbiAgW1snYS7CoG0uJywgJ3AuwqBtLiddLCB1LCB1XSxcbiAgdSxcbiAgW1xuICAgIFsnRCcsICdMJywgJ00nLCAnWCcsICdKJywgJ1YnLCAnUyddLCBbJ2RvbS4nLCAnbHVuLicsICdtYXIuJywgJ21pw6kuJywgJ2p1ZS4nLCAndmllLicsICdzw6FiLiddLFxuICAgIFsnZG9taW5nbycsICdsdW5lcycsICdtYXJ0ZXMnLCAnbWnDqXJjb2xlcycsICdqdWV2ZXMnLCAndmllcm5lcycsICdzw6FiYWRvJ10sXG4gICAgWydETycsICdMVScsICdNQScsICdNSScsICdKVScsICdWSScsICdTQSddXG4gIF0sXG4gIHUsXG4gIFtcbiAgICBbJ0UnLCAnRicsICdNJywgJ0EnLCAnTScsICdKJywgJ0onLCAnQScsICdTJywgJ08nLCAnTicsICdEJ10sXG4gICAgW1xuICAgICAgJ2VuZS4nLCAnZmViLicsICdtYXIuJywgJ2Fici4nLCAnbWF5LicsICdqdW4uJywgJ2p1bC4nLCAnYWdvLicsICdzZXB0LicsICdvY3QuJywgJ25vdi4nLFxuICAgICAgJ2RpYy4nXG4gICAgXSxcbiAgICBbXG4gICAgICAnZW5lcm8nLCAnZmVicmVybycsICdtYXJ6bycsICdhYnJpbCcsICdtYXlvJywgJ2p1bmlvJywgJ2p1bGlvJywgJ2Fnb3N0bycsICdzZXB0aWVtYnJlJyxcbiAgICAgICdvY3R1YnJlJywgJ25vdmllbWJyZScsICdkaWNpZW1icmUnXG4gICAgXVxuICBdLFxuICB1LFxuICBbWydhLiBDLicsICdkLiBDLiddLCB1LCBbJ2FudGVzIGRlIENyaXN0bycsICdkZXNwdcOpcyBkZSBDcmlzdG8nXV0sXG4gIDEsXG4gIFs2LCAwXSxcbiAgWydkL00veXknLCAnZCBNTU0geScsICdkIFxcJ2RlXFwnIE1NTU0gXFwnZGVcXCcgeScsICdFRUVFLCBkIFxcJ2RlXFwnIE1NTU0gXFwnZGVcXCcgeSddLFxuICBbJ0g6bW0nLCAnSDptbTpzcycsICdIOm1tOnNzIHonLCAnSDptbTpzcyAoenp6eiknXSxcbiAgWyd7MX0gezB9JywgdSwgJ3sxfSwgezB9JywgdV0sXG4gIFsnLCcsICcuJywgJzsnLCAnJScsICcrJywgJy0nLCAnRScsICfDlycsICfigLAnLCAn4oieJywgJ05hTicsICc6J10sXG4gIFsnIywjIzAuIyMjJywgJyMsIyMwwqAlJywgJyMsIyMwLjAwwqDCpCcsICcjRTAnXSxcbiAgJ0VVUicsXG4gICfigqwnLFxuICAnZXVybycsXG4gIHtcbiAgICAnQVVEJzogW3UsICckJ10sXG4gICAgJ0JSTCc6IFt1LCAnUiQnXSxcbiAgICAnQ05ZJzogW3UsICfCpSddLFxuICAgICdFR1AnOiBbXSxcbiAgICAnRVNQJzogWyfigqcnXSxcbiAgICAnR0JQJzogW3UsICfCoyddLFxuICAgICdIS0QnOiBbdSwgJyQnXSxcbiAgICAnSUxTJzogW3UsICfigqonXSxcbiAgICAnSU5SJzogW3UsICfigrknXSxcbiAgICAnSlBZJzogW3UsICfCpSddLFxuICAgICdLUlcnOiBbdSwgJ+KCqSddLFxuICAgICdNWE4nOiBbdSwgJyQnXSxcbiAgICAnTlpEJzogW3UsICckJ10sXG4gICAgJ1JPTic6IFt1LCAnTCddLFxuICAgICdUSEInOiBbJ+C4vyddLFxuICAgICdUV0QnOiBbdSwgJ05UJCddLFxuICAgICdVU0QnOiBbJ1VTJCcsICckJ10sXG4gICAgJ1hBRic6IFtdLFxuICAgICdYQ0QnOiBbdSwgJyQnXSxcbiAgICAnWE9GJzogW11cbiAgfSxcbiAgJ2x0cicsXG4gIHBsdXJhbFxuXTtcbiJdfQ==
+
+/***/ }),
+
+/***/ "./node_modules/@angular/common/locales/et.js":
+/*!****************************************************!*\
+ !*** ./node_modules/@angular/common/locales/et.js ***!
+ \****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+(function (factory) {
+ if ( true && typeof module.exports === "object") {
+ var v = factory(null, exports);
+ if (v !== undefined) module.exports = v;
+ }
+ else if (true) {
+ !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),
+ __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
+ (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),
+ __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+ }
+})(function (require, exports) {
+ "use strict";
+ Object.defineProperty(exports, "__esModule", { value: true });
+ // THIS CODE IS GENERATED - DO NOT MODIFY
+ // See angular/tools/gulp-tasks/cldr/extract.js
+ var u = undefined;
+ function plural(n) {
+ var i = Math.floor(Math.abs(n)), v = n.toString().replace(/^[^.]*\.?/, '').length;
+ if (i === 1 && v === 0)
+ return 1;
+ return 5;
+ }
+ exports.default = [
+ 'et',
+ [['AM', 'PM'], u, u],
+ u,
+ [
+ ['P', 'E', 'T', 'K', 'N', 'R', 'L'], u,
+ ['pühapäev', 'esmaspäev', 'teisipäev', 'kolmapäev', 'neljapäev', 'reede', 'laupäev'],
+ ['P', 'E', 'T', 'K', 'N', 'R', 'L']
+ ],
+ u,
+ [
+ ['J', 'V', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],
+ ['jaan', 'veebr', 'märts', 'apr', 'mai', 'juuni', 'juuli', 'aug', 'sept', 'okt', 'nov', 'dets'],
+ [
+ 'jaanuar', 'veebruar', 'märts', 'aprill', 'mai', 'juuni', 'juuli', 'august', 'september',
+ 'oktoober', 'november', 'detsember'
+ ]
+ ],
+ u,
+ [['eKr', 'pKr'], u, ['enne Kristust', 'pärast Kristust']],
+ 1,
+ [6, 0],
+ ['dd.MM.yy', 'd. MMM y', 'd. MMMM y', 'EEEE, d. MMMM y'],
+ ['HH:mm', 'HH:mm:ss', 'HH:mm:ss z', 'HH:mm:ss zzzz'],
+ ['{1} {0}', u, u, u],
+ [',', ' ', ';', '%', '+', '−', '×10^', '×', '‰', '∞', 'NaN', ':'],
+ ['#,##0.###', '#,##0%', '#,##0.00 ¤', '#E0'],
+ 'EUR',
+ '€',
+ 'euro',
+ { 'AUD': ['AU$', '$'], 'EEK': ['kr'], 'THB': ['฿'], 'TWD': ['NT$'] },
+ 'ltr',
+ plural
+ ];
+});
+//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21tb24vbG9jYWxlcy9ldC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7Ozs7Ozs7Ozs7OztJQUVILHlDQUF5QztJQUN6QywrQ0FBK0M7SUFFL0MsSUFBTSxDQUFDLEdBQUcsU0FBUyxDQUFDO0lBRXBCLFNBQVMsTUFBTSxDQUFDLENBQVM7UUFDdkIsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUNsRixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7WUFBRSxPQUFPLENBQUMsQ0FBQztRQUNqQyxPQUFPLENBQUMsQ0FBQztJQUNYLENBQUM7SUFFRCxrQkFBZTtRQUNiLElBQUk7UUFDSixDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDcEIsQ0FBQztRQUNEO1lBQ0UsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3RDLENBQUMsVUFBVSxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsU0FBUyxDQUFDO1lBQ3BGLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDO1NBQ3BDO1FBQ0QsQ0FBQztRQUNEO1lBQ0UsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQztZQUM1RCxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDO1lBQy9GO2dCQUNFLFNBQVMsRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsV0FBVztnQkFDeEYsVUFBVSxFQUFFLFVBQVUsRUFBRSxXQUFXO2FBQ3BDO1NBQ0Y7UUFDRCxDQUFDO1FBQ0QsQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxlQUFlLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztRQUN6RCxDQUFDO1FBQ0QsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ04sQ0FBQyxVQUFVLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxpQkFBaUIsQ0FBQztRQUN4RCxDQUFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLGVBQWUsQ0FBQztRQUNwRCxDQUFDLFNBQVMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNwQixDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDO1FBQ2pFLENBQUMsV0FBVyxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsS0FBSyxDQUFDO1FBQzVDLEtBQUs7UUFDTCxHQUFHO1FBQ0gsTUFBTTtRQUNOLEVBQUMsS0FBSyxFQUFFLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFDO1FBQ2xFLEtBQUs7UUFDTCxNQUFNO0tBQ1AsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuXG4vLyBUSElTIENPREUgSVMgR0VORVJBVEVEIC0gRE8gTk9UIE1PRElGWVxuLy8gU2VlIGFuZ3VsYXIvdG9vbHMvZ3VscC10YXNrcy9jbGRyL2V4dHJhY3QuanNcblxuY29uc3QgdSA9IHVuZGVmaW5lZDtcblxuZnVuY3Rpb24gcGx1cmFsKG46IG51bWJlcik6IG51bWJlciB7XG4gIGxldCBpID0gTWF0aC5mbG9vcihNYXRoLmFicyhuKSksIHYgPSBuLnRvU3RyaW5nKCkucmVwbGFjZSgvXlteLl0qXFwuPy8sICcnKS5sZW5ndGg7XG4gIGlmIChpID09PSAxICYmIHYgPT09IDApIHJldHVybiAxO1xuICByZXR1cm4gNTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgW1xuICAnZXQnLFxuICBbWydBTScsICdQTSddLCB1LCB1XSxcbiAgdSxcbiAgW1xuICAgIFsnUCcsICdFJywgJ1QnLCAnSycsICdOJywgJ1InLCAnTCddLCB1LFxuICAgIFsncMO8aGFww6RldicsICdlc21hc3DDpGV2JywgJ3RlaXNpcMOkZXYnLCAna29sbWFww6RldicsICduZWxqYXDDpGV2JywgJ3JlZWRlJywgJ2xhdXDDpGV2J10sXG4gICAgWydQJywgJ0UnLCAnVCcsICdLJywgJ04nLCAnUicsICdMJ11cbiAgXSxcbiAgdSxcbiAgW1xuICAgIFsnSicsICdWJywgJ00nLCAnQScsICdNJywgJ0onLCAnSicsICdBJywgJ1MnLCAnTycsICdOJywgJ0QnXSxcbiAgICBbJ2phYW4nLCAndmVlYnInLCAnbcOkcnRzJywgJ2FwcicsICdtYWknLCAnanV1bmknLCAnanV1bGknLCAnYXVnJywgJ3NlcHQnLCAnb2t0JywgJ25vdicsICdkZXRzJ10sXG4gICAgW1xuICAgICAgJ2phYW51YXInLCAndmVlYnJ1YXInLCAnbcOkcnRzJywgJ2FwcmlsbCcsICdtYWknLCAnanV1bmknLCAnanV1bGknLCAnYXVndXN0JywgJ3NlcHRlbWJlcicsXG4gICAgICAnb2t0b29iZXInLCAnbm92ZW1iZXInLCAnZGV0c2VtYmVyJ1xuICAgIF1cbiAgXSxcbiAgdSxcbiAgW1snZUtyJywgJ3BLciddLCB1LCBbJ2VubmUgS3Jpc3R1c3QnLCAncMOkcmFzdCBLcmlzdHVzdCddXSxcbiAgMSxcbiAgWzYsIDBdLFxuICBbJ2RkLk1NLnl5JywgJ2QuIE1NTSB5JywgJ2QuIE1NTU0geScsICdFRUVFLCBkLiBNTU1NIHknXSxcbiAgWydISDptbScsICdISDptbTpzcycsICdISDptbTpzcyB6JywgJ0hIOm1tOnNzIHp6enonXSxcbiAgWyd7MX0gezB9JywgdSwgdSwgdV0sXG4gIFsnLCcsICfCoCcsICc7JywgJyUnLCAnKycsICfiiJInLCAnw5cxMF4nLCAnw5cnLCAn4oCwJywgJ+KInicsICdOYU4nLCAnOiddLFxuICBbJyMsIyMwLiMjIycsICcjLCMjMCUnLCAnIywjIzAuMDDCoMKkJywgJyNFMCddLFxuICAnRVVSJyxcbiAgJ+KCrCcsXG4gICdldXJvJyxcbiAgeydBVUQnOiBbJ0FVJCcsICckJ10sICdFRUsnOiBbJ2tyJ10sICdUSEInOiBbJ+C4vyddLCAnVFdEJzogWydOVCQnXX0sXG4gICdsdHInLFxuICBwbHVyYWxcbl07XG4iXX0=
+
+/***/ }),
+
+/***/ "./node_modules/@angular/common/locales/fa.js":
+/*!****************************************************!*\
+ !*** ./node_modules/@angular/common/locales/fa.js ***!
+ \****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+(function (factory) {
+ if ( true && typeof module.exports === "object") {
+ var v = factory(null, exports);
+ if (v !== undefined) module.exports = v;
+ }
+ else if (true) {
+ !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),
+ __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
+ (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),
+ __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+ }
+})(function (require, exports) {
+ "use strict";
+ Object.defineProperty(exports, "__esModule", { value: true });
+ // THIS CODE IS GENERATED - DO NOT MODIFY
+ // See angular/tools/gulp-tasks/cldr/extract.js
+ var u = undefined;
+ function plural(n) {
+ var i = Math.floor(Math.abs(n));
+ if (i === 0 || n === 1)
+ return 1;
+ return 5;
+ }
+ exports.default = [
+ 'fa',
+ [['ق', 'ب'], ['ق.ظ.', 'ب.ظ.'], ['قبل\u200cازظهر', 'بعدازظهر']],
+ u,
+ [
+ ['ی', 'د', 'س', 'چ', 'پ', 'ج', 'ش'],
+ ['یکشنبه', 'دوشنبه', 'سه\u200cشنبه', 'چهارشنبه', 'پنجشنبه', 'جمعه', 'شنبه'], u,
+ ['۱ش', '۲ش', '۳ش', '۴ش', '۵ش', 'ج', 'ش']
+ ],
+ u,
+ [
+ ['ژ', 'ف', 'م', 'آ', 'م', 'ژ', 'ژ', 'ا', 'س', 'ا', 'ن', 'د'],
+ [
+ 'ژانویهٔ', 'فوریهٔ', 'مارس', 'آوریل', 'مهٔ', 'ژوئن', 'ژوئیهٔ', 'اوت', 'سپتامبر', 'اکتبر',
+ 'نوامبر', 'دسامبر'
+ ],
+ u
+ ],
+ [
+ ['ژ', 'ف', 'م', 'آ', 'م', 'ژ', 'ژ', 'ا', 'س', 'ا', 'ن', 'د'],
+ [
+ 'ژانویه', 'فوریه', 'مارس', 'آوریل', 'مه', 'ژوئن', 'ژوئیه', 'اوت', 'سپتامبر', 'اکتبر',
+ 'نوامبر', 'دسامبر'
+ ],
+ u
+ ],
+ [['ق', 'م'], ['ق.م.', 'م.'], ['قبل از میلاد', 'میلادی']],
+ 6,
+ [5, 5],
+ ['y/M/d', 'd MMM y', 'd MMMM y', 'EEEE d MMMM y'],
+ ['H:mm', 'H:mm:ss', 'H:mm:ss (z)', 'H:mm:ss (zzzz)'],
+ ['{1}،\u200f {0}', u, '{1}، ساعت {0}', u],
+ ['.', ',', ';', '%', '\u200e+', '\u200e−', 'E', '×', '‰', '∞', 'ناعدد', ':'],
+ ['#,##0.###', '#,##0%', '\u200e¤ #,##0.00', '#E0'],
+ 'IRR',
+ 'ریال',
+ 'ریال ایران',
+ {
+ 'AFN': ['؋'],
+ 'CAD': ['$CA', '$'],
+ 'CNY': ['¥CN', '¥'],
+ 'HKD': ['$HK', '$'],
+ 'IRR': ['ریال'],
+ 'MXN': ['$MX', '$'],
+ 'NZD': ['$NZ', '$'],
+ 'THB': ['฿'],
+ 'XCD': ['$EC', '$']
+ },
+ 'rtl',
+ plural
+ ];
+});
+//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21tb24vbG9jYWxlcy9mYS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7Ozs7Ozs7Ozs7OztJQUVILHlDQUF5QztJQUN6QywrQ0FBK0M7SUFFL0MsSUFBTSxDQUFDLEdBQUcsU0FBUyxDQUFDO0lBRXBCLFNBQVMsTUFBTSxDQUFDLENBQVM7UUFDdkIsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO1lBQUUsT0FBTyxDQUFDLENBQUM7UUFDakMsT0FBTyxDQUFDLENBQUM7SUFDWCxDQUFDO0lBRUQsa0JBQWU7UUFDYixJQUFJO1FBQ0osQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsRUFBRSxDQUFDLGdCQUFnQixFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQzlELENBQUM7UUFDRDtZQUNFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDO1lBQ25DLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUM5RSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQztTQUN6QztRQUNELENBQUM7UUFDRDtZQUNFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7WUFDNUQ7Z0JBQ0UsU0FBUyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsT0FBTztnQkFDeEYsUUFBUSxFQUFFLFFBQVE7YUFDbkI7WUFDRCxDQUFDO1NBQ0Y7UUFDRDtZQUNFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7WUFDNUQ7Z0JBQ0UsUUFBUSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsT0FBTztnQkFDcEYsUUFBUSxFQUFFLFFBQVE7YUFDbkI7WUFDRCxDQUFDO1NBQ0Y7UUFDRCxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsY0FBYyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3hELENBQUM7UUFDRCxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDTixDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLGVBQWUsQ0FBQztRQUNqRCxDQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLGdCQUFnQixDQUFDO1FBQ3BELENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxFQUFFLGVBQWUsRUFBRSxDQUFDLENBQUM7UUFDekMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLEdBQUcsQ0FBQztRQUM1RSxDQUFDLFdBQVcsRUFBRSxRQUFRLEVBQUUsa0JBQWtCLEVBQUUsS0FBSyxDQUFDO1FBQ2xELEtBQUs7UUFDTCxNQUFNO1FBQ04sWUFBWTtRQUNaO1lBQ0UsS0FBSyxFQUFFLENBQUMsR0FBRyxDQUFDO1lBQ1osS0FBSyxFQUFFLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQztZQUNuQixLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDO1lBQ25CLEtBQUssRUFBRSxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUM7WUFDbkIsS0FBSyxFQUFFLENBQUMsTUFBTSxDQUFDO1lBQ2YsS0FBSyxFQUFFLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQztZQUNuQixLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDO1lBQ25CLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQztZQUNaLEtBQUssRUFBRSxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUM7U0FDcEI7UUFDRCxLQUFLO1FBQ0wsTUFBTTtLQUNQLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuLy8gVEhJUyBDT0RFIElTIEdFTkVSQVRFRCAtIERPIE5PVCBNT0RJRllcbi8vIFNlZSBhbmd1bGFyL3Rvb2xzL2d1bHAtdGFza3MvY2xkci9leHRyYWN0LmpzXG5cbmNvbnN0IHUgPSB1bmRlZmluZWQ7XG5cbmZ1bmN0aW9uIHBsdXJhbChuOiBudW1iZXIpOiBudW1iZXIge1xuICBsZXQgaSA9IE1hdGguZmxvb3IoTWF0aC5hYnMobikpO1xuICBpZiAoaSA9PT0gMCB8fCBuID09PSAxKSByZXR1cm4gMTtcbiAgcmV0dXJuIDU7XG59XG5cbmV4cG9ydCBkZWZhdWx0IFtcbiAgJ2ZhJyxcbiAgW1sn2YInLCAn2KgnXSwgWyfZgi7YuC4nLCAn2Kgu2LguJ10sIFsn2YLYqNmEXFx1MjAwY9in2LLYuNmH2LEnLCAn2KjYudiv2KfYsti42YfYsSddXSxcbiAgdSxcbiAgW1xuICAgIFsn24wnLCAn2K8nLCAn2LMnLCAn2oYnLCAn2b4nLCAn2KwnLCAn2LQnXSxcbiAgICBbJ9uM2qnYtNmG2KjZhycsICfYr9mI2LTZhtio2YcnLCAn2LPZh1xcdTIwMGPYtNmG2KjZhycsICfahtmH2KfYsdi02YbYqNmHJywgJ9m+2YbYrNi02YbYqNmHJywgJ9is2YXYudmHJywgJ9i02YbYqNmHJ10sIHUsXG4gICAgWyfbsdi0JywgJ9uy2LQnLCAn27PYtCcsICfbtNi0JywgJ9u12LQnLCAn2KwnLCAn2LQnXVxuICBdLFxuICB1LFxuICBbXG4gICAgWyfamCcsICfZgScsICfZhScsICfYoicsICfZhScsICfamCcsICfamCcsICfYpycsICfYsycsICfYpycsICfZhicsICfYryddLFxuICAgIFtcbiAgICAgICfamNin2YbZiNuM2YfZlCcsICfZgdmI2LHbjNmH2ZQnLCAn2YXYp9ix2LMnLCAn2KLZiNix24zZhCcsICfZhdmH2ZQnLCAn2pjZiNim2YYnLCAn2pjZiNim24zZh9mUJywgJ9in2YjYqicsICfYs9m+2KrYp9mF2KjYsScsICfYp9qp2KrYqNixJyxcbiAgICAgICfZhtmI2KfZhdio2LEnLCAn2K/Ys9in2YXYqNixJ1xuICAgIF0sXG4gICAgdVxuICBdLFxuICBbXG4gICAgWyfamCcsICfZgScsICfZhScsICfYoicsICfZhScsICfamCcsICfamCcsICfYpycsICfYsycsICfYpycsICfZhicsICfYryddLFxuICAgIFtcbiAgICAgICfamNin2YbZiNuM2YcnLCAn2YHZiNix24zZhycsICfZhdin2LHYsycsICfYotmI2LHbjNmEJywgJ9mF2YcnLCAn2pjZiNim2YYnLCAn2pjZiNim24zZhycsICfYp9mI2KonLCAn2LPZvtiq2KfZhdio2LEnLCAn2Kfaqdiq2KjYsScsXG4gICAgICAn2YbZiNin2YXYqNixJywgJ9iv2LPYp9mF2KjYsSdcbiAgICBdLFxuICAgIHVcbiAgXSxcbiAgW1sn2YInLCAn2YUnXSwgWyfZgi7ZhS4nLCAn2YUuJ10sIFsn2YLYqNmEINin2LIg2YXbjNmE2KfYrycsICfZhduM2YTYp9iv24wnXV0sXG4gIDYsXG4gIFs1LCA1XSxcbiAgWyd5L00vZCcsICdkIE1NTSB5JywgJ2QgTU1NTSB5JywgJ0VFRUUgZCBNTU1NIHknXSxcbiAgWydIOm1tJywgJ0g6bW06c3MnLCAnSDptbTpzcyAoeiknLCAnSDptbTpzcyAoenp6eiknXSxcbiAgWyd7MX3YjFxcdTIwMGYgezB9JywgdSwgJ3sxfdiMINiz2KfYudiqIHswfScsIHVdLFxuICBbJy4nLCAnLCcsICc7JywgJyUnLCAnXFx1MjAwZSsnLCAnXFx1MjAwZeKIkicsICdFJywgJ8OXJywgJ+KAsCcsICfiiJ4nLCAn2YbYp9i52K/YrycsICc6J10sXG4gIFsnIywjIzAuIyMjJywgJyMsIyMwJScsICdcXHUyMDBlwqTCoCMsIyMwLjAwJywgJyNFMCddLFxuICAnSVJSJyxcbiAgJ9ix24zYp9mEJyxcbiAgJ9ix24zYp9mEINin24zYsdin2YYnLFxuICB7XG4gICAgJ0FGTic6IFsn2IsnXSxcbiAgICAnQ0FEJzogWyckQ0EnLCAnJCddLFxuICAgICdDTlknOiBbJ8KlQ04nLCAnwqUnXSxcbiAgICAnSEtEJzogWyckSEsnLCAnJCddLFxuICAgICdJUlInOiBbJ9ix24zYp9mEJ10sXG4gICAgJ01YTic6IFsnJE1YJywgJyQnXSxcbiAgICAnTlpEJzogWyckTlonLCAnJCddLFxuICAgICdUSEInOiBbJ+C4vyddLFxuICAgICdYQ0QnOiBbJyRFQycsICckJ11cbiAgfSxcbiAgJ3J0bCcsXG4gIHBsdXJhbFxuXTtcbiJdfQ==
+
+/***/ }),
+
+/***/ "./node_modules/@angular/common/locales/fi.js":
+/*!****************************************************!*\
+ !*** ./node_modules/@angular/common/locales/fi.js ***!
+ \****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+(function (factory) {
+ if ( true && typeof module.exports === "object") {
+ var v = factory(null, exports);
+ if (v !== undefined) module.exports = v;
+ }
+ else if (true) {
+ !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),
+ __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
+ (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),
+ __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+ }
+})(function (require, exports) {
+ "use strict";
+ Object.defineProperty(exports, "__esModule", { value: true });
+ // THIS CODE IS GENERATED - DO NOT MODIFY
+ // See angular/tools/gulp-tasks/cldr/extract.js
+ var u = undefined;
+ function plural(n) {
+ var i = Math.floor(Math.abs(n)), v = n.toString().replace(/^[^.]*\.?/, '').length;
+ if (i === 1 && v === 0)
+ return 1;
+ return 5;
+ }
+ exports.default = [
+ 'fi',
+ [['ap.', 'ip.'], u, u],
+ u,
+ [
+ ['S', 'M', 'T', 'K', 'T', 'P', 'L'], ['su', 'ma', 'ti', 'ke', 'to', 'pe', 'la'],
+ [
+ 'sunnuntaina', 'maanantaina', 'tiistaina', 'keskiviikkona', 'torstaina', 'perjantaina',
+ 'lauantaina'
+ ],
+ ['su', 'ma', 'ti', 'ke', 'to', 'pe', 'la']
+ ],
+ [
+ ['S', 'M', 'T', 'K', 'T', 'P', 'L'], ['su', 'ma', 'ti', 'ke', 'to', 'pe', 'la'],
+ ['sunnuntai', 'maanantai', 'tiistai', 'keskiviikko', 'torstai', 'perjantai', 'lauantai'],
+ ['su', 'ma', 'ti', 'ke', 'to', 'pe', 'la']
+ ],
+ [
+ ['T', 'H', 'M', 'H', 'T', 'K', 'H', 'E', 'S', 'L', 'M', 'J'],
+ [
+ 'tammik.', 'helmik.', 'maalisk.', 'huhtik.', 'toukok.', 'kesäk.', 'heinäk.', 'elok.',
+ 'syysk.', 'lokak.', 'marrask.', 'jouluk.'
+ ],
+ [
+ 'tammikuuta', 'helmikuuta', 'maaliskuuta', 'huhtikuuta', 'toukokuuta', 'kesäkuuta',
+ 'heinäkuuta', 'elokuuta', 'syyskuuta', 'lokakuuta', 'marraskuuta', 'joulukuuta'
+ ]
+ ],
+ [
+ ['T', 'H', 'M', 'H', 'T', 'K', 'H', 'E', 'S', 'L', 'M', 'J'],
+ [
+ 'tammi', 'helmi', 'maalis', 'huhti', 'touko', 'kesä', 'heinä', 'elo', 'syys', 'loka',
+ 'marras', 'joulu'
+ ],
+ [
+ 'tammikuu', 'helmikuu', 'maaliskuu', 'huhtikuu', 'toukokuu', 'kesäkuu', 'heinäkuu', 'elokuu',
+ 'syyskuu', 'lokakuu', 'marraskuu', 'joulukuu'
+ ]
+ ],
+ [['eKr', 'jKr'], ['eKr.', 'jKr.'], ['ennen Kristuksen syntymää', 'jälkeen Kristuksen syntymän']],
+ 1,
+ [6, 0],
+ ['d.M.y', u, 'd. MMMM y', 'cccc d. MMMM y'],
+ ['H.mm', 'H.mm.ss', 'H.mm.ss z', 'H.mm.ss zzzz'],
+ ['{1} {0}', '{1} \'klo\' {0}', u, u],
+ [',', ' ', ';', '%', '+', '−', 'E', '×', '‰', '∞', 'epäluku', '.'],
+ ['#,##0.###', '#,##0 %', '#,##0.00 ¤', '#E0'],
+ 'EUR',
+ '€',
+ 'euro',
+ {
+ 'AOA': [],
+ 'ARS': [],
+ 'AUD': [],
+ 'BAM': [],
+ 'BBD': [],
+ 'BDT': [],
+ 'BMD': [],
+ 'BND': [],
+ 'BOB': [],
+ 'BRL': [],
+ 'BSD': [],
+ 'BWP': [],
+ 'BYN': [],
+ 'BZD': [],
+ 'CAD': [],
+ 'CLP': [],
+ 'CNY': [],
+ 'COP': [],
+ 'CRC': [],
+ 'CUC': [],
+ 'CUP': [],
+ 'CZK': [],
+ 'DKK': [],
+ 'DOP': [],
+ 'EGP': [],
+ 'ESP': [],
+ 'FIM': ['mk'],
+ 'FJD': [],
+ 'FKP': [],
+ 'GEL': [],
+ 'GIP': [],
+ 'GNF': [],
+ 'GTQ': [],
+ 'GYD': [],
+ 'HKD': [],
+ 'HNL': [],
+ 'HRK': [],
+ 'HUF': [],
+ 'IDR': [],
+ 'ILS': [],
+ 'INR': [],
+ 'ISK': [],
+ 'JMD': [],
+ 'KHR': [],
+ 'KMF': [],
+ 'KPW': [],
+ 'KRW': [],
+ 'KYD': [],
+ 'KZT': [],
+ 'LAK': [],
+ 'LBP': [],
+ 'LKR': [],
+ 'LRD': [],
+ 'LTL': [],
+ 'LVL': [],
+ 'MGA': [],
+ 'MMK': [],
+ 'MNT': [],
+ 'MUR': [],
+ 'MXN': [],
+ 'MYR': [],
+ 'NAD': [],
+ 'NGN': [],
+ 'NIO': [],
+ 'NOK': [],
+ 'NPR': [],
+ 'NZD': [],
+ 'PHP': [],
+ 'PKR': [],
+ 'PLN': [],
+ 'PYG': [],
+ 'RON': [],
+ 'RUR': [],
+ 'RWF': [],
+ 'SBD': [],
+ 'SEK': [],
+ 'SGD': [],
+ 'SHP': [],
+ 'SRD': [],
+ 'SSP': [],
+ 'STN': [u, 'STD'],
+ 'SYP': [],
+ 'THB': [],
+ 'TOP': [],
+ 'TRY': [],
+ 'TTD': [],
+ 'TWD': [],
+ 'UAH': [],
+ 'UYU': [],
+ 'VEF': [],
+ 'VND': [],
+ 'XCD': [],
+ 'XPF': [],
+ 'XXX': [],
+ 'ZAR': [],
+ 'ZMW': []
+ },
+ 'ltr',
+ plural
+ ];
+});
+//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21tb24vbG9jYWxlcy9maS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7Ozs7Ozs7Ozs7OztJQUVILHlDQUF5QztJQUN6QywrQ0FBK0M7SUFFL0MsSUFBTSxDQUFDLEdBQUcsU0FBUyxDQUFDO0lBRXBCLFNBQVMsTUFBTSxDQUFDLENBQVM7UUFDdkIsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUNsRixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7WUFBRSxPQUFPLENBQUMsQ0FBQztRQUNqQyxPQUFPLENBQUMsQ0FBQztJQUNYLENBQUM7SUFFRCxrQkFBZTtRQUNiLElBQUk7UUFDSixDQUFDLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDdEIsQ0FBQztRQUNEO1lBQ0UsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQztZQUMvRTtnQkFDRSxhQUFhLEVBQUUsYUFBYSxFQUFFLFdBQVcsRUFBRSxlQUFlLEVBQUUsV0FBVyxFQUFFLGFBQWE7Z0JBQ3RGLFlBQVk7YUFDYjtZQUNELENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJ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SyxFQUFFLEVBQUU7WUFDVCxLQUFLLEVBQUUsRUFBRTtZQUNULEtBQUssRUFBRSxFQUFFO1lBQ1QsS0FBSyxFQUFFLEVBQUU7WUFDVCxLQUFLLEVBQUUsRUFBRTtZQUNULEtBQUssRUFBRSxFQUFFO1lBQ1QsS0FBSyxFQUFFLEVBQUU7WUFDVCxLQUFLLEVBQUUsRUFBRTtZQUNULEtBQUssRUFBRSxFQUFFO1lBQ1QsS0FBSyxFQUFFLEVBQUU7WUFDVCxLQUFLLEVBQUUsRUFBRTtZQUNULEtBQUssRUFBRSxFQUFFO1lBQ1QsS0FBSyxFQUFFLEVBQUU7WUFDVCxLQUFLLEVBQUUsRUFBRTtZQUNULEtBQUssRUFBRSxFQUFFO1lBQ1QsS0FBSyxFQUFFLEVBQUU7WUFDVCxLQUFLLEVBQUUsRUFBRTtZQUNULEtBQUssRUFBRSxFQUFFO1lBQ1QsS0FBSyxFQUFFLEVBQUU7WUFDVCxLQUFLLEVBQUUsRUFBRTtZQUNULEtBQUssRUFBRSxFQUFFO1lBQ1QsS0FBSyxFQUFFLENBQUMsSUFBSSxDQUFDO1lBQ2IsS0FBSyxFQUFFLEVBQUU7WUFDVCxLQUFLLEVBQUUsRUFBRTtZQUNULEtBQUssRUFBRSxFQUFFO1lBQ1QsS0FBSyxFQUFFLEVBQUU7WUFDVCxLQUFLLEVBQUUsRUFBRTtZQUNULEtBQUssRUFBRSxFQUFFO1lBQ1QsS0FBSyxFQUFFLEVBQUU7WUFDVCxLQUFLLEVBQUUsRUFBRTtZQUNULEtBQUssRUFBRSxFQUFFO1lBQ1QsS0FBSyxFQUFFLEVBQUU7WUFDVCxLQUFLLEVBQUUsRUFBRTtZQUNULEtBQUssRUFBRSxFQUFFO1lBQ1QsS0FBSyxFQUFFLEVBQUU7WUFDVCxLQUFLLEVBQUUsRUFBRTtZQUNULEtBQUssRUFBRSxFQUFFO1lBQ1QsS0FBSyxFQUFFLEVBQUU7WUFDVCxLQUFLLEVBQUUsRUFBRTtZQUNULEtBQUssRUFBRSxFQUFFO1lBQ1QsS0FBSyxFQUFFLEVBQUU7WUFDVCxLQUFLLEVBQUUsRUFBRTtZQUNULEtBQUssRUFBRSxFQUFFO1lBQ1QsS0FBSyxFQUFFLEVBQUU7WUFDVCxLQUFLLEVBQUUsRUFBRTtZQUNULEtBQUssRUFBRSxFQUFFO1lBQ1QsS0FBSyxFQUFFLEVBQUU7WUFDVCxLQUFLLEVBQUUsRUFBRTtZQUNULEtBQUssRUFBRSxFQUFFO1lBQ1QsS0FBSyxFQUFFLEVBQUU7WUFDVCxLQUFLLEVBQUUsRUFBRTtZQUNULEtBQUssRUFBRSxFQUFFO1lBQ1QsS0FBSyxFQUFFLEVBQUU7WUFDVCxLQUFLLEVBQUUsRUFBRTtZQUNULEtBQUssRUFBRSxFQUFFO1lBQ1QsS0FBSyxFQUFFLEVBQUU7WUFDVCxLQUFLLEVBQUUsRUFBRTtZQUNULEtBQUssRUFBRSxFQUFFO1lBQ1QsS0FBSyxFQUFFLEVBQUU7WUFDVCxLQUFLLEVBQUUsRUFBRTtZQUNULEtBQUssRUFBRSxFQUFFO1lBQ1QsS0FBSyxFQUFFLEVBQUU7WUFDVCxLQUFLLEVBQUUsRUFBRTtZQUNULEtBQUssRUFBRSxFQUFFO1lBQ1QsS0FBSyxFQUFFLEVBQUU7WUFDVCxLQUFLLEVBQUUsRUFBRTtZQUNULEtBQUssRUFBRSxFQUFFO1lBQ1QsS0FBSyxFQUFFLEVBQUU7WUFDVCxLQUFLLEVBQUUsRUFBRTtZQUNULEtBQUssRUFBRSxFQUFFO1lBQ1QsS0FBSyxFQUFFLEVBQUU7WUFDVCxLQUFLLEVBQUUsRUFBRTtZQUNULEtBQUssRUFBRSxFQUFFO1lBQ1QsS0FBSyxFQUFFLEVBQUU7WUFDVCxLQUFLLEVBQUUsRUFBRTtZQUNULEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUM7WUFDakIsS0FBSyxFQUFFLEVBQUU7WUFDVCxLQUFLLEVBQUUsRUFBRTtZQUNULEtBQUssRUFBRSxFQUFFO1lBQ1QsS0FBSyxFQUFFLEVBQUU7WUFDVCxLQUFLLEVBQUUsRUFBRTtZQUNULEtBQUssRUFBRSxFQUFFO1lBQ1QsS0FBSyxFQUFFLEVBQUU7WUFDVCxLQUFLLEVBQUUsRUFBRTtZQUNULEtBQUssRUFBRSxFQUFFO1lBQ1QsS0FBSyxFQUFFLEVBQUU7WUFDVCxLQUFLLEVBQUUsRUFBRTtZQUNULEtBQUssRUFBRSxFQUFFO1lBQ1QsS0FBSyxFQUFFLEVBQUU7WUFDVCxLQUFLLEVBQUUsRUFBRTtZQUNULEtBQUssRUFBRSxFQUFFO1NBQ1Y7UUFDRCxLQUFLO1FBQ0wsTUFBTTtLQUNQLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuLy8gVEhJUyBDT0RFIElTIEdFTkVSQVRFRCAtIERPIE5PVCBNT0RJRllcbi8vIFNlZSBhbmd1bGFyL3Rvb2xzL2d1bHAtdGFza3MvY2xkci9leHRyYWN0LmpzXG5cbmNvbnN0IHUgPSB1bmRlZmluZWQ7XG5cbmZ1bmN0aW9uIHBsdXJhbChuOiBudW1iZXIpOiBudW1iZXIge1xuICBsZXQgaSA9IE1hdGguZmxvb3IoTWF0aC5hYnMobikpLCB2ID0gbi50b1N0cmluZygpLnJlcGxhY2UoL15bXi5dKlxcLj8vLCAnJykubGVuZ3RoO1xuICBpZiAoaSA9PT0gMSAmJiB2ID09PSAwKSByZXR1cm4gMTtcbiAgcmV0dXJuIDU7XG59XG5cbmV4cG9ydCBkZWZhdWx0IFtcbiAgJ2ZpJyxcbiAgW1snYXAuJywgJ2lwLiddLCB1LCB1XSxcbiAgdSxcbiAgW1xuICAgIFsnUycsICdNJywgJ1QnLCAnSycsICdUJywgJ1AnLCAnTCddLCBbJ3N1JywgJ21hJywgJ3RpJywgJ2tlJywgJ3RvJywgJ3BlJywgJ2xhJ10sXG4gICAgW1xuICAgICAgJ3N1bm51bnRhaW5hJywgJ21hYW5hbnRhaW5hJywgJ3RpaXN0YWluYScsICdrZXNraXZpaWtrb25hJywgJ3RvcnN0YWluYScsICdwZXJqYW50YWluYScsXG4gICAgICAnbGF1YW50YWluYSdcbiAgICBdLFxuICAgIFsnc3UnLCAnbWEnLCAndGknLCAna2UnLCAndG8nLCAncGUnLCAnbGEnXVxuICBdLFxuICBbXG4gICAgWydTJywgJ00nLCAnVCcsICdLJywgJ1QnLCAnUCcsICdMJ10sIFsnc3UnLCAnbWEnLCAndGknLCAna2UnLCAndG8nLCAncGUnLCAnbGEnXSxcbiAgICBbJ3N1bm51bnRhaScsICdtYWFuYW50YWknLCAndGlpc3RhaScsICdrZXNraXZpaWtrbycsICd0b3JzdGFpJywgJ3BlcmphbnRhaScsICdsYXVhbnRhaSddLFxuICAgIFsnc3UnLCAnbWEnLCAndGknLCAna2UnLCAndG8nLCAncGUnLCAnbGEnXVxuICBdLFxuICBbXG4gICAgWydUJywgJ0gnLCAnTScsICdIJywgJ1QnLCAnSycsICdIJywgJ0UnLCAnUycsICdMJywgJ00nLCAnSiddLFxuICAgIFtcbiAgICAgICd0YW1taWsuJywgJ2hlbG1pay4nLCAnbWFhbGlzay4nLCAnaHVodGlrLicsICd0b3Vrb2suJywgJ2tlc8Okay4nLCAnaGVpbsOkay4nLCAnZWxvay4nLFxuICAgICAgJ3N5eXNrLicsICdsb2thay4nLCAnbWFycmFzay4nLCAnam91bHVrLidcbiAgICBdLFxuICAgIFtcbiAgICAgICd0YW1taWt1dXRhJywgJ2hlbG1pa3V1dGEnLCAnbWFhbGlza3V1dGEnLCAnaHVodGlrdXV0YScsICd0b3Vrb2t1dXRhJywgJ2tlc8Oka3V1dGEnLFxuICAgICAgJ2hlaW7DpGt1dXRhJywgJ2Vsb2t1dXRhJywgJ3N5eXNrdXV0YScsICdsb2tha3V1dGEnLCAnbWFycmFza3V1dGEnLCAnam91bHVrdXV0YSdcbiAgICBdXG4gIF0sXG4gIFtcbiAgICBbJ1QnLCAnSCcsICdNJywgJ0gnLCAnVCcsICdLJywgJ0gnLCAnRScsICdTJywgJ0wnLCAnTScsICdKJ10sXG4gICAgW1xuICAgICAgJ3RhbW1pJywgJ2hlbG1pJywgJ21hYWxpcycsICdodWh0aScsICd0b3VrbycsICdrZXPDpCcsICdoZWluw6QnLCAnZWxvJywgJ3N5eXMnLCAnbG9rYScsXG4gICAgICAnbWFycmFzJywgJ2pvdWx1J1xuICAgIF0sXG4gICAgW1xuICAgICAgJ3RhbW1pa3V1JywgJ2hlbG1pa3V1JywgJ21hYWxpc2t1dScsICdodWh0aWt1dScsICd0b3Vrb2t1dScsICdrZXPDpGt1dScsICdoZWluw6RrdXUnLCAnZWxva3V1JyxcbiAgICAgICdzeXlza3V1JywgJ2xva2FrdXUnLCAnbWFycmFza3V1JywgJ2pvdWx1a3V1J1xuICAgIF1cbiAgXSxcbiAgW1snZUtyJywgJ2pLciddLCBbJ2VLci4nLCAnaktyLiddLCBbJ2VubmVuIEtyaXN0dWtzZW4gc3ludHltw6TDpCcsICdqw6Rsa2VlbiBLcmlzdHVrc2VuIHN5bnR5bcOkbiddXSxcbiAgMSxcbiAgWzYsIDBdLFxuICBbJ2QuTS55JywgdSwgJ2QuIE1NTU0geScsICdjY2NjIGQuIE1NTU0geSddLFxuICBbJ0gubW0nLCAnSC5tbS5zcycsICdILm1tLnNzIHonLCAnSC5tbS5zcyB6enp6J10sXG4gIFsnezF9IHswfScsICd7MX0gXFwna2xvXFwnIHswfScsIHUsIHVdLFxuICBbJywnLCAnwqAnLCAnOycsICclJywgJysnLCAn4oiSJywgJ0UnLCAnw5cnLCAn4oCwJywgJ+KInicsICdlcMOkbHVrdScsICcuJ10sXG4gIFsnIywjIzAuIyMjJywgJyMsIyMwwqAlJywgJyMsIyMwLjAwwqDCpCcsICcjRTAnXSxcbiAgJ0VVUicsXG4gICfigqwnLFxuICAnZXVybycsXG4gIHtcbiAgICAnQU9BJzogW10sXG4gICAgJ0FSUyc6IFtdLFxuICAgICdBVUQnOiBbXSxcbiAgICAnQkFNJzogW10sXG4gICAgJ0JCRCc6IFtdLFxuICAgICdCRFQnOiBbXSxcbiAgICAnQk1EJzogW10sXG4gICAgJ0JORCc6IFtdLFxuICAgICdCT0InOiBbXSxcbiAgICAnQlJMJzogW10sXG4gICAgJ0JTRCc6IFtdLFxuICAgICdCV1AnOiBbXSxcbiAgICAnQllOJzogW10sXG4gICAgJ0JaRCc6IFtdLFxuICAgICdDQUQnOiBbXSxcbiAgICAnQ0xQJzogW10sXG4gICAgJ0NOWSc6IFtdLFxuICAgICdDT1AnOiBbXSxcbiAgICAnQ1JDJzogW10sXG4gICAgJ0NVQyc6IFtdLFxuICAgICdDVVAnOiBbXSxcbiAgICAnQ1pLJzogW10sXG4gICAgJ0RLSyc6IFtdLFxuICAgICdET1AnOiBbXSxcbiAgICAnRUdQJzogW10sXG4gICAgJ0VTUCc6IFtdLFxuICAgICdGSU0nOiBbJ21rJ10sXG4gICAgJ0ZKRCc6IFtdLFxuICAgICdGS1AnOiBbXSxcbiAgICAnR0VMJzogW10sXG4gICAgJ0dJUCc6IFtdLFxuICAgICdHTkYnOiBbXSxcbiAgICAnR1RRJzogW10sXG4gICAgJ0dZRCc6IFtdLFxuICAgICdIS0QnOiBbXSxcbiAgICAnSE5MJzogW10sXG4gICAgJ0hSSyc6IFtdLFxuICAgICdIVUYnOiBbXSxcbiAgICAnSURSJzogW10sXG4gICAgJ0lMUyc6IFtdLFxuICAgICdJTlInOiBbXSxcbiAgICAnSVNLJzogW10sXG4gICAgJ0pNRCc6IFtdLFxuICAgICdLSFInOiBbXSxcbiAgICAnS01GJzogW10sXG4gICAgJ0tQVyc6IFtdLFxuICAgICdLUlcnOiBbXSxcbiAgICAnS1lEJzogW10sXG4gICAgJ0taVCc6IFtdLFxuICAgICdMQUsnOiBbXSxcbiAgICAnTEJQJzogW10sXG4gICAgJ0xLUic6IFtdLFxuICAgICdMUkQnOiBbXSxcbiAgICAnTFRMJzogW10sXG4gICAgJ0xWTCc6IFtdLFxuICAgICdNR0EnOiBbXSxcbiAgICAnTU1LJzogW10sXG4gICAgJ01OVCc6IFtdLFxuICAgICdNVVInOiBbXSxcbiAgICAnTVhOJzogW10sXG4gICAgJ01ZUic6IFtdLFxuICAgICdOQUQnOiBbXSxcbiAgICAnTkdOJzogW10sXG4gICAgJ05JTyc6IFtdLFxuICAgICdOT0snOiBbXSxcbiAgICAnTlBSJzogW10sXG4gICAgJ05aRCc6IFtdLFxuICAgICdQSFAnOiBbXSxcbiAgICAnUEtSJzogW10sXG4gICAgJ1BMTic6IFtdLFxuICAgICdQWUcnOiBbXSxcbiAgICAnUk9OJzogW10sXG4gICAgJ1JVUic6IFtdLFxuICAgICdSV0YnOiBbXSxcbiAgICAnU0JEJzogW10sXG4gICAgJ1NFSyc6IFtdLFxuICAgICdTR0QnOiBbXSxcbiAgICAnU0hQJzogW10sXG4gICAgJ1NSRCc6IFtdLFxuICAgICdTU1AnOiBbXSxcbiAgICAnU1ROJzogW3UsICdTVEQnXSxcbiAgICAnU1lQJzogW10sXG4gICAgJ1RIQic6IFtdLFxuICAgICdUT1AnOiBbXSxcbiAgICAnVFJZJzogW10sXG4gICAgJ1RURCc6IFtdLFxuICAgICdUV0QnOiBbXSxcbiAgICAnVUFIJzogW10sXG4gICAgJ1VZVSc6IFtdLFxuICAgICdWRUYnOiBbXSxcbiAgICAnVk5EJzogW10sXG4gICAgJ1hDRCc6IFtdLFxuICAgICdYUEYnOiBbXSxcbiAgICAnWFhYJzogW10sXG4gICAgJ1pBUic6IFtdLFxuICAgICdaTVcnOiBbXVxuICB9LFxuICAnbHRyJyxcbiAgcGx1cmFsXG5dO1xuIl19
+
+/***/ }),
+
+/***/ "./node_modules/@angular/common/locales/fr.js":
+/*!****************************************************!*\
+ !*** ./node_modules/@angular/common/locales/fr.js ***!
+ \****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+(function (factory) {
+ if ( true && typeof module.exports === "object") {
+ var v = factory(null, exports);
+ if (v !== undefined) module.exports = v;
+ }
+ else if (true) {
+ !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),
+ __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
+ (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),
+ __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+ }
+})(function (require, exports) {
+ "use strict";
+ Object.defineProperty(exports, "__esModule", { value: true });
+ // THIS CODE IS GENERATED - DO NOT MODIFY
+ // See angular/tools/gulp-tasks/cldr/extract.js
+ var u = undefined;
+ function plural(n) {
+ var i = Math.floor(Math.abs(n));
+ if (i === 0 || i === 1)
+ return 1;
+ return 5;
+ }
+ exports.default = [
+ 'fr',
+ [['AM', 'PM'], u, u],
+ u,
+ [
+ ['D', 'L', 'M', 'M', 'J', 'V', 'S'], ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],
+ ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],
+ ['di', 'lu', 'ma', 'me', 'je', 've', 'sa']
+ ],
+ u,
+ [
+ ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],
+ [
+ 'janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.', 'nov.',
+ 'déc.'
+ ],
+ [
+ 'janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre',
+ 'octobre', 'novembre', 'décembre'
+ ]
+ ],
+ u,
+ [['av. J.-C.', 'ap. J.-C.'], u, ['avant Jésus-Christ', 'après Jésus-Christ']],
+ 1,
+ [6, 0],
+ ['dd/MM/y', 'd MMM y', 'd MMMM y', 'EEEE d MMMM y'],
+ ['HH:mm', 'HH:mm:ss', 'HH:mm:ss z', 'HH:mm:ss zzzz'],
+ ['{1} {0}', '{1} \'à\' {0}', u, u],
+ [',', '\u202f', ';', '%', '+', '-', 'E', '×', '‰', '∞', 'NaN', ':'],
+ ['#,##0.###', '#,##0 %', '#,##0.00 ¤', '#E0'],
+ 'EUR',
+ '€',
+ 'euro',
+ {
+ 'ARS': ['$AR', '$'],
+ 'AUD': ['$AU', '$'],
+ 'BEF': ['FB'],
+ 'BMD': ['$BM', '$'],
+ 'BND': ['$BN', '$'],
+ 'BZD': ['$BZ', '$'],
+ 'CAD': ['$CA', '$'],
+ 'CLP': ['$CL', '$'],
+ 'CNY': [u, '¥'],
+ 'COP': ['$CO', '$'],
+ 'CYP': ['£CY'],
+ 'EGP': [u, '£E'],
+ 'FJD': ['$FJ', '$'],
+ 'FKP': ['£FK', '£'],
+ 'FRF': ['F'],
+ 'GBP': ['£GB', '£'],
+ 'GIP': ['£GI', '£'],
+ 'HKD': [u, '$'],
+ 'IEP': ['£IE'],
+ 'ILP': ['£IL'],
+ 'ITL': ['₤IT'],
+ 'JPY': [u, '¥'],
+ 'KMF': [u, 'FC'],
+ 'LBP': ['£LB', '£L'],
+ 'MTP': ['£MT'],
+ 'MXN': ['$MX', '$'],
+ 'NAD': ['$NA', '$'],
+ 'NIO': [u, '$C'],
+ 'NZD': ['$NZ', '$'],
+ 'RHD': ['$RH'],
+ 'RON': [u, 'L'],
+ 'RWF': [u, 'FR'],
+ 'SBD': ['$SB', '$'],
+ 'SGD': ['$SG', '$'],
+ 'SRD': ['$SR', '$'],
+ 'TOP': [u, '$T'],
+ 'TTD': ['$TT', '$'],
+ 'TWD': [u, 'NT$'],
+ 'USD': ['$US', '$'],
+ 'UYU': ['$UY', '$'],
+ 'WST': ['$WS'],
+ 'XCD': [u, '$'],
+ 'XPF': ['FCFP'],
+ 'ZMW': [u, 'Kw']
+ },
+ 'ltr',
+ plural
+ ];
+});
+//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21tb24vbG9jYWxlcy9mci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7Ozs7Ozs7Ozs7OztJQUVILHlDQUF5QztJQUN6QywrQ0FBK0M7SUFFL0MsSUFBTSxDQUFDLEdBQUcsU0FBUyxDQUFDO0lBRXBCLFNBQVMsTUFBTSxDQUFDLENBQVM7UUFDdkIsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO1lBQUUsT0FBTyxDQUFDLENBQUM7UUFDakMsT0FBTyxDQUFDLENBQUM7SUFDWCxDQUFDO0lBRUQsa0JBQWU7UUFDYixJQUFJO1FBQ0osQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3BCLENBQUM7UUFDRDtZQUNFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUM7WUFDN0YsQ0FBQyxVQUFVLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxRQUFRLENBQUM7WUFDekUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUM7U0FDM0M7UUFDRCxDQUFDO1FBQ0Q7WUFDRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcs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QUssQ0FBQztZQUNkLEtBQUssRUFBRSxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUM7WUFDbkIsS0FBSyxFQUFFLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQztZQUNuQixLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDO1lBQ2hCLEtBQUssRUFBRSxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUM7WUFDbkIsS0FBSyxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ2QsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQztZQUNmLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUM7WUFDaEIsS0FBSyxFQUFFLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQztZQUNuQixLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDO1lBQ25CLEtBQUssRUFBRSxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUM7WUFDbkIsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQztZQUNoQixLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDO1lBQ25CLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUM7WUFDakIsS0FBSyxFQUFFLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQztZQUNuQixLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDO1lBQ25CLEtBQUssRUFBRSxDQUFDLEtBQUssQ0FBQztZQUNkLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUM7WUFDZixLQUFLLEVBQUUsQ0FBQyxNQUFNLENBQUM7WUFDZixLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDO1NBQ2pCO1FBQ0QsS0FBSztRQUNMLE1BQU07S0FDUCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbi8vIFRISVMgQ09ERSBJUyBHRU5FUkFURUQgLSBETyBOT1QgTU9ESUZZXG4vLyBTZWUgYW5ndWxhci90b29scy9ndWxwLXRhc2tzL2NsZHIvZXh0cmFjdC5qc1xuXG5jb25zdCB1ID0gdW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBwbHVyYWwobjogbnVtYmVyKTogbnVtYmVyIHtcbiAgbGV0IGkgPSBNYXRoLmZsb29yKE1hdGguYWJzKG4pKTtcbiAgaWYgKGkgPT09IDAgfHwgaSA9PT0gMSkgcmV0dXJuIDE7XG4gIHJldHVybiA1O1xufVxuXG5leHBvcnQgZGVmYXVsdCBbXG4gICdmcicsXG4gIFtbJ0FNJywgJ1BNJ10sIHUsIHVdLFxuICB1LFxuICBbXG4gICAgWydEJywgJ0wnLCAnTScsICdNJywgJ0onLCAnVicsICdTJ10sIFsnZGltLicsICdsdW4uJywgJ21hci4nLCAnbWVyLicsICdqZXUuJywgJ3Zlbi4nLCAnc2FtLiddLFxuICAgIFsnZGltYW5jaGUnLCAnbHVuZGknLCAnbWFyZGknLCAnbWVyY3JlZGknLCAnamV1ZGknLCAndmVuZHJlZGknLCAnc2FtZWRpJ10sXG4gICAgWydkaScsICdsdScsICdtYScsICdtZScsICdqZScsICd2ZScsICdzYSddXG4gIF0sXG4gIHUsXG4gIFtcbiAgICBbJ0onLCAnRicsICdNJywgJ0EnLCAnTScsICdKJywgJ0onLCAnQScsICdTJywgJ08nLCAnTicsICdEJ10sXG4gICAgW1xuICAgICAgJ2phbnYuJywgJ2bDqXZyLicsICdtYXJzJywgJ2F2ci4nLCAnbWFpJywgJ2p1aW4nLCAnanVpbC4nLCAnYW/Du3QnLCAnc2VwdC4nLCAnb2N0LicsICdub3YuJyxcbiAgICAgICdkw6ljLidcbiAgICBdLFxuICAgIFtcbiAgICAgICdqYW52aWVyJywgJ2bDqXZyaWVyJywgJ21hcnMnLCAnYXZyaWwnLCAnbWFpJywgJ2p1aW4nLCAnanVpbGxldCcsICdhb8O7dCcsICdzZXB0ZW1icmUnLFxuICAgICAgJ29jdG9icmUnLCAnbm92ZW1icmUnLCAnZMOpY2VtYnJlJ1xuICAgIF1cbiAgXSxcbiAgdSxcbiAgW1snYXYuIEouLUMuJywgJ2FwLiBKLi1DLiddLCB1LCBbJ2F2YW50IErDqXN1cy1DaHJpc3QnLCAnYXByw6hzIErDqXN1cy1DaHJpc3QnXV0sXG4gIDEsXG4gIFs2LCAwXSxcbiAgWydkZC9NTS95JywgJ2QgTU1NIHknLCAnZCBNTU1NIHknLCAnRUVFRSBkIE1NTU0geSddLFxuICBbJ0hIOm1tJywgJ0hIOm1tOnNzJywgJ0hIOm1tOnNzIHonLCAnSEg6bW06c3Mgenp6eiddLFxuICBbJ3sxfSB7MH0nLCAnezF9IFxcJ8OgXFwnIHswfScsIHUsIHVdLFxuICBbJywnLCAnXFx1MjAyZicsICc7JywgJyUnLCAnKycsICctJywgJ0UnLCAnw5cnLCAn4oCwJywgJ+KInicsICdOYU4nLCAnOiddLFxuICBbJyMsIyMwLiMjIycsICcjLCMjMMKgJScsICcjLCMjMC4wMMKgwqQnLCAnI0UwJ10sXG4gICdFVVInLFxuICAn4oKsJyxcbiAgJ2V1cm8nLFxuICB7XG4gICAgJ0FSUyc6IFsnJEFSJywgJyQnXSxcbiAgICAnQVVEJzogWyckQVUnLCAnJCddLFxuICAgICdCRUYnOiBbJ0ZCJ10sXG4gICAgJ0JNRCc6IFsnJEJNJywgJyQnXSxcbiAgICAnQk5EJzogWyckQk4nLCAnJCddLFxuICAgICdCWkQnOiBbJyRCWicsICckJ10sXG4gICAgJ0NBRCc6IFsnJENBJywgJyQnXSxcbiAgICAnQ0xQJzogWyckQ0wnLCAnJCddLFxuICAgICdDTlknOiBbdSwgJ8KlJ10sXG4gICAgJ0NPUCc6IFsnJENPJywgJyQnXSxcbiAgICAnQ1lQJzogWyfCo0NZJ10sXG4gICAgJ0VHUCc6IFt1LCAnwqNFJ10sXG4gICAgJ0ZKRCc6IFsnJEZKJywgJyQnXSxcbiAgICAnRktQJzogWyfCo0ZLJywgJ8KjJ10sXG4gICAgJ0ZSRic6IFsnRiddLFxuICAgICdHQlAnOiBbJ8KjR0InLCAnwqMnXSxcbiAgICAnR0lQJzogWyfCo0dJJywgJ8KjJ10sXG4gICAgJ0hLRCc6IFt1LCAnJCddLFxuICAgICdJRVAnOiBbJ8KjSUUnXSxcbiAgICAnSUxQJzogWyfCo0lMJ10sXG4gICAgJ0lUTCc6IFsn4oKkSVQnXSxcbiAgICAnSlBZJzogW3UsICfCpSddLFxuICAgICdLTUYnOiBbdSwgJ0ZDJ10sXG4gICAgJ0xCUCc6IFsnwqNMQicsICfCo0wnXSxcbiAgICAnTVRQJzogWyfCo01UJ10sXG4gICAgJ01YTic6IFsnJE1YJywgJyQnXSxcbiAgICAnTkFEJzogWyckTkEnLCAnJCddLFxuICAgICdOSU8nOiBbdSwgJyRDJ10sXG4gICAgJ05aRCc6IFsnJE5aJywgJyQnXSxcbiAgICAnUkhEJzogWyckUkgnXSxcbiAgICAnUk9OJzogW3UsICdMJ10sXG4gICAgJ1JXRic6IFt1LCAnRlInXSxcbiAgICAnU0JEJzogWyckU0InLCAnJCddLFxuICAgICdTR0QnOiBbJyRTRycsICckJ10sXG4gICAgJ1NSRCc6IFsnJFNSJywgJyQnXSxcbiAgICAnVE9QJzogW3UsICckVCddLFxuICAgICdUVEQnOiBbJyRUVCcsICckJ10sXG4gICAgJ1RXRCc6IFt1LCAnTlQkJ10sXG4gICAgJ1VTRCc6IFsnJFVTJywgJyQnXSxcbiAgICAnVVlVJzogWyckVVknLCAnJCddLFxuICAgICdXU1QnOiBbJyRXUyddLFxuICAgICdYQ0QnOiBbdSwgJyQnXSxcbiAgICAnWFBGJzogWydGQ0ZQJ10sXG4gICAgJ1pNVyc6IFt1LCAnS3cnXVxuICB9LFxuICAnbHRyJyxcbiAgcGx1cmFsXG5dO1xuIl19
+
+/***/ }),
+
+/***/ "./node_modules/@angular/common/locales/he.js":
+/*!****************************************************!*\
+ !*** ./node_modules/@angular/common/locales/he.js ***!
+ \****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+(function (factory) {
+ if ( true && typeof module.exports === "object") {
+ var v = factory(null, exports);
+ if (v !== undefined) module.exports = v;
+ }
+ else if (true) {
+ !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),
+ __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
+ (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),
+ __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+ }
+})(function (require, exports) {
+ "use strict";
+ Object.defineProperty(exports, "__esModule", { value: true });
+ // THIS CODE IS GENERATED - DO NOT MODIFY
+ // See angular/tools/gulp-tasks/cldr/extract.js
+ var u = undefined;
+ function plural(n) {
+ var i = Math.floor(Math.abs(n)), v = n.toString().replace(/^[^.]*\.?/, '').length;
+ if (i === 1 && v === 0)
+ return 1;
+ if (i === 2 && v === 0)
+ return 2;
+ if (v === 0 && !(n >= 0 && n <= 10) && n % 10 === 0)
+ return 4;
+ return 5;
+ }
+ exports.default = [
+ 'he',
+ [['לפנה״צ', 'אחה״צ'], u, u],
+ [['לפנה״צ', 'אחה״צ'], ['AM', 'PM'], u],
+ [
+ ['א׳', 'ב׳', 'ג׳', 'ד׳', 'ה׳', 'ו׳', 'ש׳'],
+ ['יום א׳', 'יום ב׳', 'יום ג׳', 'יום ד׳', 'יום ה׳', 'יום ו׳', 'שבת'],
+ ['יום ראשון', 'יום שני', 'יום שלישי', 'יום רביעי', 'יום חמישי', 'יום שישי', 'יום שבת'],
+ ['א׳', 'ב׳', 'ג׳', 'ד׳', 'ה׳', 'ו׳', 'ש׳']
+ ],
+ u,
+ [
+ ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],
+ ['ינו׳', 'פבר׳', 'מרץ', 'אפר׳', 'מאי', 'יוני', 'יולי', 'אוג׳', 'ספט׳', 'אוק׳', 'נוב׳', 'דצמ׳'],
+ [
+ 'ינואר', 'פברואר', 'מרץ', 'אפריל', 'מאי', 'יוני', 'יולי', 'אוגוסט', 'ספטמבר', 'אוקטובר',
+ 'נובמבר', 'דצמבר'
+ ]
+ ],
+ u,
+ [['לפנה״ס', 'לספירה'], u, ['לפני הספירה', 'לספירה']],
+ 0,
+ [5, 6],
+ ['d.M.y', 'd בMMM y', 'd בMMMM y', 'EEEE, d בMMMM y'],
+ ['H:mm', 'H:mm:ss', 'H:mm:ss z', 'H:mm:ss zzzz'],
+ ['{1}, {0}', u, '{1} בשעה {0}', u],
+ ['.', ',', ';', '%', '\u200e+', '\u200e-', 'E', '×', '‰', '∞', 'NaN', ':'],
+ ['#,##0.###', '#,##0%', '\u200f#,##0.00 ¤;\u200f-#,##0.00 ¤', '#E0'],
+ 'ILS',
+ '₪',
+ 'שקל חדש',
+ { 'BYN': [u, 'р'], 'CNY': ['\u200eCN¥\u200e', '¥'], 'ILP': ['ל״י'], 'THB': ['฿'], 'TWD': ['NT$'] },
+ 'rtl',
+ plural
+ ];
+});
+//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21tb24vbG9jYWxlcy9oZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7Ozs7Ozs7Ozs7OztJQUVILHlDQUF5QztJQUN6QywrQ0FBK0M7SUFFL0MsSUFBTSxDQUFDLEdBQUcsU0FBUyxDQUFDO0lBRXBCLFNBQVMsTUFBTSxDQUFDLENBQVM7UUFDdkIsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUNsRixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7WUFBRSxPQUFPLENBQUMsQ0FBQztRQUNqQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7WUFBRSxPQUFPLENBQUMsQ0FBQztRQUNqQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQztZQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzlELE9BQU8sQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUVELGtCQUFlO1FBQ2IsSUFBSTtRQUNKLENBQUMsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMzQixDQUFDLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN0QztZQUNFLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDO1lBQzFDLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsS0FBSyxDQUFDO1lBQ25FLENBQUMsV0FBVyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsU0FBUyxDQUFDO1lBQ3RGLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDO1NBQzNDO1FBQ0QsQ0FBQztRQUNEO1lBQ0UsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQztZQUMvRCxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDO1lBQzlGO2dCQUNFLE9BQU8sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFNBQVM7Z0JBQ3ZGLFFBQVEsRUFBRSxPQUFPO2FBQ2xCO1NBQ0Y7UUFDRCxDQUFDO1FBQ0QsQ0FBQyxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDcEQsQ0FBQztRQUNELENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNOLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsaUJBQWlCLENBQUM7UUFDckQsQ0FBQyxNQUFNLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxjQUFjLENBQUM7UUFDaEQsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxFQUFFLGNBQWMsRUFBRSxDQUFDLENBQUM7UUFDbEMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQztRQUMxRSxDQUFDLFdBQVcsRUFBRSxRQUFRLEVBQUUsb0NBQW9DLEVBQUUsS0FBSyxDQUFDO1FBQ3BFLEtBQUs7UUFDTCxHQUFHO1FBQ0gsU0FBUztRQUNULEVBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLGlCQUFpQixFQUFFLEdBQUcsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFDO1FBQ2hHLEtBQUs7UUFDTCxNQUFNO0tBQ1AsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuXG4vLyBUSElTIENPREUgSVMgR0VORVJBVEVEIC0gRE8gTk9UIE1PRElGWVxuLy8gU2VlIGFuZ3VsYXIvdG9vbHMvZ3VscC10YXNrcy9jbGRyL2V4dHJhY3QuanNcblxuY29uc3QgdSA9IHVuZGVmaW5lZDtcblxuZnVuY3Rpb24gcGx1cmFsKG46IG51bWJlcik6IG51bWJlciB7XG4gIGxldCBpID0gTWF0aC5mbG9vcihNYXRoLmFicyhuKSksIHYgPSBuLnRvU3RyaW5nKCkucmVwbGFjZSgvXlteLl0qXFwuPy8sICcnKS5sZW5ndGg7XG4gIGlmIChpID09PSAxICYmIHYgPT09IDApIHJldHVybiAxO1xuICBpZiAoaSA9PT0gMiAmJiB2ID09PSAwKSByZXR1cm4gMjtcbiAgaWYgKHYgPT09IDAgJiYgIShuID49IDAgJiYgbiA8PSAxMCkgJiYgbiAlIDEwID09PSAwKSByZXR1cm4gNDtcbiAgcmV0dXJuIDU7XG59XG5cbmV4cG9ydCBkZWZhdWx0IFtcbiAgJ2hlJyxcbiAgW1sn15zXpNeg15TXtNemJywgJ9eQ15fXlNe016YnXSwgdSwgdV0sXG4gIFtbJ9ec16TXoNeU17TXpicsICfXkNeX15TXtNemJ10sIFsnQU0nLCAnUE0nXSwgdV0sXG4gIFtcbiAgICBbJ9eQ17MnLCAn15HXsycsICfXktezJywgJ9eT17MnLCAn15TXsycsICfXldezJywgJ9ep17MnXSxcbiAgICBbJ9eZ15XXnSDXkNezJywgJ9eZ15XXnSDXkdezJywgJ9eZ15XXnSDXktezJywgJ9eZ15XXnSDXk9ezJywgJ9eZ15XXnSDXlNezJywgJ9eZ15XXnSDXldezJywgJ9ep15HXqiddLFxuICAgIFsn15nXldedINeo15DXqdeV158nLCAn15nXldedINep16DXmScsICfXmdeV150g16nXnNeZ16nXmScsICfXmdeV150g16jXkdeZ16LXmScsICfXmdeV150g15fXnteZ16nXmScsICfXmdeV150g16nXmdep15knLCAn15nXldedINep15HXqiddLFxuICAgIFsn15DXsycsICfXkdezJywgJ9eS17MnLCAn15PXsycsICfXlNezJywgJ9eV17MnLCAn16nXsyddXG4gIF0sXG4gIHUsXG4gIFtcbiAgICBbJzEnLCAnMicsICczJywgJzQnLCAnNScsICc2JywgJzcnLCAnOCcsICc5JywgJzEwJywgJzExJywgJzEyJ10sXG4gICAgWyfXmdeg15XXsycsICfXpNeR16jXsycsICfXnteo16UnLCAn15DXpNeo17MnLCAn157XkNeZJywgJ9eZ15XXoNeZJywgJ9eZ15XXnNeZJywgJ9eQ15XXktezJywgJ9eh16TXmNezJywgJ9eQ15XXp9ezJywgJ9eg15XXkdezJywgJ9eT16bXntezJ10sXG4gICAgW1xuICAgICAgJ9eZ16DXldeQ16gnLCAn16TXkdeo15XXkNeoJywgJ9ee16jXpScsICfXkNek16jXmdecJywgJ9ee15DXmScsICfXmdeV16DXmScsICfXmdeV15zXmScsICfXkNeV15LXldeh15gnLCAn16HXpNeY157XkdeoJywgJ9eQ15XXp9eY15XXkdeoJyxcbiAgICAgICfXoNeV15HXnteR16gnLCAn15PXptee15HXqCdcbiAgICBdXG4gIF0sXG4gIHUsXG4gIFtbJ9ec16TXoNeU17TXoScsICfXnNeh16TXmdeo15QnXSwgdSwgWyfXnNek16DXmSDXlNeh16TXmdeo15QnLCAn15zXodek15nXqNeUJ11dLFxuICAwLFxuICBbNSwgNl0sXG4gIFsnZC5NLnknLCAnZCDXkU1NTSB5JywgJ2Qg15FNTU1NIHknLCAnRUVFRSwgZCDXkU1NTU0geSddLFxuICBbJ0g6bW0nLCAnSDptbTpzcycsICdIOm1tOnNzIHonLCAnSDptbTpzcyB6enp6J10sXG4gIFsnezF9LCB7MH0nLCB1LCAnezF9INeR16nXoteUIHswfScsIHVdLFxuICBbJy4nLCAnLCcsICc7JywgJyUnLCAnXFx1MjAwZSsnLCAnXFx1MjAwZS0nLCAnRScsICfDlycsICfigLAnLCAn4oieJywgJ05hTicsICc6J10sXG4gIFsnIywjIzAuIyMjJywgJyMsIyMwJScsICdcXHUyMDBmIywjIzAuMDDCoMKkO1xcdTIwMGYtIywjIzAuMDDCoMKkJywgJyNFMCddLFxuICAnSUxTJyxcbiAgJ+KCqicsXG4gICfXqden15wg15fXk9epJyxcbiAgeydCWU4nOiBbdSwgJ9GAJ10sICdDTlknOiBbJ1xcdTIwMGVDTsKlXFx1MjAwZScsICfCpSddLCAnSUxQJzogWyfXnNe015knXSwgJ1RIQic6IFsn4Li/J10sICdUV0QnOiBbJ05UJCddfSxcbiAgJ3J0bCcsXG4gIHBsdXJhbFxuXTtcbiJdfQ==
+
+/***/ }),
+
+/***/ "./node_modules/@angular/common/locales/hr.js":
+/*!****************************************************!*\
+ !*** ./node_modules/@angular/common/locales/hr.js ***!
+ \****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+(function (factory) {
+ if ( true && typeof module.exports === "object") {
+ var v = factory(null, exports);
+ if (v !== undefined) module.exports = v;
+ }
+ else if (true) {
+ !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),
+ __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
+ (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),
+ __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+ }
+})(function (require, exports) {
+ "use strict";
+ Object.defineProperty(exports, "__esModule", { value: true });
+ // THIS CODE IS GENERATED - DO NOT MODIFY
+ // See angular/tools/gulp-tasks/cldr/extract.js
+ var u = undefined;
+ function plural(n) {
+ var i = Math.floor(Math.abs(n)), v = n.toString().replace(/^[^.]*\.?/, '').length, f = parseInt(n.toString().replace(/^[^.]*\.?/, ''), 10) || 0;
+ if (v === 0 && i % 10 === 1 && !(i % 100 === 11) || f % 10 === 1 && !(f % 100 === 11))
+ return 1;
+ if (v === 0 && i % 10 === Math.floor(i % 10) && i % 10 >= 2 && i % 10 <= 4 &&
+ !(i % 100 >= 12 && i % 100 <= 14) ||
+ f % 10 === Math.floor(f % 10) && f % 10 >= 2 && f % 10 <= 4 &&
+ !(f % 100 >= 12 && f % 100 <= 14))
+ return 3;
+ return 5;
+ }
+ exports.default = [
+ 'hr',
+ [['AM', 'PM'], u, u],
+ u,
+ [
+ ['N', 'P', 'U', 'S', 'Č', 'P', 'S'], ['ned', 'pon', 'uto', 'sri', 'čet', 'pet', 'sub'],
+ ['nedjelja', 'ponedjeljak', 'utorak', 'srijeda', 'četvrtak', 'petak', 'subota'],
+ ['ned', 'pon', 'uto', 'sri', 'čet', 'pet', 'sub']
+ ],
+ [
+ ['n', 'p', 'u', 's', 'č', 'p', 's'], ['ned', 'pon', 'uto', 'sri', 'čet', 'pet', 'sub'],
+ ['nedjelja', 'ponedjeljak', 'utorak', 'srijeda', 'četvrtak', 'petak', 'subota'],
+ ['ned', 'pon', 'uto', 'sri', 'čet', 'pet', 'sub']
+ ],
+ [
+ ['1.', '2.', '3.', '4.', '5.', '6.', '7.', '8.', '9.', '10.', '11.', '12.'],
+ ['sij', 'velj', 'ožu', 'tra', 'svi', 'lip', 'srp', 'kol', 'ruj', 'lis', 'stu', 'pro'],
+ [
+ 'siječnja', 'veljače', 'ožujka', 'travnja', 'svibnja', 'lipnja', 'srpnja', 'kolovoza',
+ 'rujna', 'listopada', 'studenoga', 'prosinca'
+ ]
+ ],
+ [
+ ['1.', '2.', '3.', '4.', '5.', '6.', '7.', '8.', '9.', '10.', '11.', '12.'],
+ ['sij', 'velj', 'ožu', 'tra', 'svi', 'lip', 'srp', 'kol', 'ruj', 'lis', 'stu', 'pro'],
+ [
+ 'siječanj', 'veljača', 'ožujak', 'travanj', 'svibanj', 'lipanj', 'srpanj', 'kolovoz', 'rujan',
+ 'listopad', 'studeni', 'prosinac'
+ ]
+ ],
+ [['pr.n.e.', 'AD'], ['pr. Kr.', 'po. Kr.'], ['prije Krista', 'poslije Krista']],
+ 1,
+ [6, 0],
+ ['dd. MM. y.', 'd. MMM y.', 'd. MMMM y.', 'EEEE, d. MMMM y.'],
+ ['HH:mm', 'HH:mm:ss', 'HH:mm:ss z', 'HH:mm:ss (zzzz)'],
+ ['{1} {0}', u, '{1} \'u\' {0}', u],
+ [',', '.', ';', '%', '+', '-', 'E', '×', '‰', '∞', 'NaN', ':'],
+ ['#,##0.###', '#,##0 %', '#,##0.00 ¤', '#E0'],
+ 'HRK',
+ 'HRK',
+ 'hrvatska kuna',
+ {
+ 'AUD': [u, '$'],
+ 'BRL': [u, 'R$'],
+ 'CAD': [u, '$'],
+ 'CNY': [u, '¥'],
+ 'EUR': [u, '€'],
+ 'GBP': [u, '£'],
+ 'HKD': [u, '$'],
+ 'ILS': [u, '₪'],
+ 'INR': [u, '₹'],
+ 'JPY': [u, '¥'],
+ 'KRW': [u, '₩'],
+ 'MXN': [u, '$'],
+ 'NZD': [u, '$'],
+ 'TWD': [u, 'NT$'],
+ 'USD': [u, '$'],
+ 'VND': [u, '₫'],
+ 'XCD': [u, '$'],
+ 'XPF': [],
+ 'XXX': []
+ },
+ 'ltr',
+ plural
+ ];
+});
+//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21tb24vbG9jYWxlcy9oci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7Ozs7Ozs7Ozs7OztJQUVILHlDQUF5QztJQUN6QywrQ0FBK0M7SUFFL0MsSUFBTSxDQUFDLEdBQUcsU0FBUyxDQUFDO0lBRXBCLFNBQVMsTUFBTSxDQUFDLENBQVM7UUFDdkIsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFDN0UsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDakUsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxLQUFLLEVBQUUsQ0FBQztZQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ2hHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQztZQUNsRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsSUFBSSxFQUFFLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxFQUFFLENBQUM7WUFDckMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUM7Z0JBQ3ZELENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxJQUFJLEVBQUUsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLEVBQUUsQ0FBQztZQUN2QyxPQUFPLENBQUMsQ0FBQztRQUNYLE9BQU8sQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUVELGtCQUFlO1FBQ2IsSUFBSTtRQUNKLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNwQixDQUFDO1FBQ0Q7WUFDRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDO1lBQ3RGLENBQUMsVUFBVSxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsUUFBUSxDQUFDO1lBQy9FLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDO1NBQ2xEO1FBQ0Q7WUFDRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDO1lBQ3RGLENBQUMsVUFBVSxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsUUFBUSxDQUFDO1lBQy9FLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDO1NBQ2xEO1FBQ0Q7WUFDRSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDO1lBQzNFLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUM7WUFDckY7Z0JBQ0UsVUFBVSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFVBQVU7Z0JBQ3JGLE9BQU8sRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLFVBQVU7YUFDOUM7U0FDRjtRQUNEO1lBQ0UsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQztZQUMzRSxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDO1lBQ3JGO2dCQUNFLFVBQVUsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsT0FBTztnQkFDN0YsVUFBVSxFQUFFLFNBQVMsRUFBRSxVQUFVO2FBQ2xDO1NBQ0Y7UUFDRCxDQUFDLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxFQUFFLENBQUMsY0FBYyxFQUFFLGdCQUFnQixDQUFDLENBQUM7UUFDL0UsQ0FBQztRQUNELENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNOLENBQUMsWUFBWSxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsa0JBQWtCLENBQUM7UUFDN0QsQ0FBQyxPQUFPLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxpQkFBaUIsQ0FBQztRQUN0RCxDQUFDLFNBQVMsRUFBRSxDQUFDLEVBQUUsZUFBZSxFQUFFLENBQUMsQ0FBQztRQUNsQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDO1FBQzlELENBQUMsV0FBVyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxDQUFDO1FBQzdDLEtBQUs7UUFDTCxLQUFLO1FBQ0wsZUFBZTtRQUNmO1lBQ0UsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQztZQUNmLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUM7WUFDaEIsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQztZQUNmLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUM7WUFDZixLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDO1lBQ2YsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQztZQUNmLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUM7WUFDZixLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDO1lBQ2YsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQztZQUNmLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUM7WUFDZixLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDO1lBQ2YsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQztZQUNmLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUM7WUFDZixLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDO1lBQ2pCLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUM7WUFDZixLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDO1lBQ2YsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQztZQUNmLEtBQUssRUFBRSxFQUFFO1lBQ1QsS0FBSyxFQUFFLEVBQUU7U0FDVjtRQUNELEtBQUs7UUFDTCxNQUFNO0tBQ1AsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuXG4vLyBUSElTIENPREUgSVMgR0VORVJBVEVEIC0gRE8gTk9UIE1PRElGWVxuLy8gU2VlIGFuZ3VsYXIvdG9vbHMvZ3VscC10YXNrcy9jbGRyL2V4dHJhY3QuanNcblxuY29uc3QgdSA9IHVuZGVmaW5lZDtcblxuZnVuY3Rpb24gcGx1cmFsKG46IG51bWJlcik6IG51bWJlciB7XG4gIGxldCBpID0gTWF0aC5mbG9vcihNYXRoLmFicyhuKSksIHYgPSBuLnRvU3RyaW5nKCkucmVwbGFjZSgvXlteLl0qXFwuPy8sICcnKS5sZW5ndGgsXG4gICAgICBmID0gcGFyc2VJbnQobi50b1N0cmluZygpLnJlcGxhY2UoL15bXi5dKlxcLj8vLCAnJyksIDEwKSB8fCAwO1xuICBpZiAodiA9PT0gMCAmJiBpICUgMTAgPT09IDEgJiYgIShpICUgMTAwID09PSAxMSkgfHwgZiAlIDEwID09PSAxICYmICEoZiAlIDEwMCA9PT0gMTEpKSByZXR1cm4gMTtcbiAgaWYgKHYgPT09IDAgJiYgaSAlIDEwID09PSBNYXRoLmZsb29yKGkgJSAxMCkgJiYgaSAlIDEwID49IDIgJiYgaSAlIDEwIDw9IDQgJiZcbiAgICAgICAgICAhKGkgJSAxMDAgPj0gMTIgJiYgaSAlIDEwMCA8PSAxNCkgfHxcbiAgICAgIGYgJSAxMCA9PT0gTWF0aC5mbG9vcihmICUgMTApICYmIGYgJSAxMCA+PSAyICYmIGYgJSAxMCA8PSA0ICYmXG4gICAgICAgICAgIShmICUgMTAwID49IDEyICYmIGYgJSAxMDAgPD0gMTQpKVxuICAgIHJldHVybiAzO1xuICByZXR1cm4gNTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgW1xuICAnaHInLFxuICBbWydBTScsICdQTSddLCB1LCB1XSxcbiAgdSxcbiAgW1xuICAgIFsnTicsICdQJywgJ1UnLCAnUycsICfEjCcsICdQJywgJ1MnXSwgWyduZWQnLCAncG9uJywgJ3V0bycsICdzcmknLCAnxI1ldCcsICdwZXQnLCAnc3ViJ10sXG4gICAgWyduZWRqZWxqYScsICdwb25lZGplbGphaycsICd1dG9yYWsnLCAnc3JpamVkYScsICfEjWV0dnJ0YWsnLCAncGV0YWsnLCAnc3Vib3RhJ10sXG4gICAgWyduZWQnLCAncG9uJywgJ3V0bycsICdzcmknLCAnxI1ldCcsICdwZXQnLCAnc3ViJ11cbiAgXSxcbiAgW1xuICAgIFsnbicsICdwJywgJ3UnLCAncycsICfEjScsICdwJywgJ3MnXSwgWyduZWQnLCAncG9uJywgJ3V0bycsICdzcmknLCAnxI1ldCcsICdwZXQnLCAnc3ViJ10sXG4gICAgWyduZWRqZWxqYScsICdwb25lZGplbGphaycsICd1dG9yYWsnLCAnc3JpamVkYScsICfEjWV0dnJ0YWsnLCAncGV0YWsnLCAnc3Vib3RhJ10sXG4gICAgWyduZWQnLCAncG9uJywgJ3V0bycsICdzcmknLCAnxI1ldCcsICdwZXQnLCAnc3ViJ11cbiAgXSxcbiAgW1xuICAgIFsnMS4nLCAnMi4nLCAnMy4nLCAnNC4nLCAnNS4nLCAnNi4nLCAnNy4nLCAnOC4nLCAnOS4nLCAnMTAuJywgJzExLicsICcxMi4nXSxcbiAgICBbJ3NpaicsICd2ZWxqJywgJ2/FvnUnLCAndHJhJywgJ3N2aScsICdsaXAnLCAnc3JwJywgJ2tvbCcsICdydWonLCAnbGlzJywgJ3N0dScsICdwcm8nXSxcbiAgICBbXG4gICAgICAnc2lqZcSNbmphJywgJ3ZlbGphxI1lJywgJ2/FvnVqa2EnLCAndHJhdm5qYScsICdzdmlibmphJywgJ2xpcG5qYScsICdzcnBuamEnLCAna29sb3ZvemEnLFxuICAgICAgJ3J1am5hJywgJ2xpc3RvcGFkYScsICdzdHVkZW5vZ2EnLCAncHJvc2luY2EnXG4gICAgXVxuICBdLFxuICBbXG4gICAgWycxLicsICcyLicsICczLicsICc0LicsICc1LicsICc2LicsICc3LicsICc4LicsICc5LicsICcxMC4nLCAnMTEuJywgJzEyLiddLFxuICAgIFsnc2lqJywgJ3ZlbGonLCAnb8W+dScsICd0cmEnLCAnc3ZpJywgJ2xpcCcsICdzcnAnLCAna29sJywgJ3J1aicsICdsaXMnLCAnc3R1JywgJ3BybyddLFxuICAgIFtcbiAgICAgICdzaWplxI1hbmonLCAndmVsamHEjWEnLCAnb8W+dWphaycsICd0cmF2YW5qJywgJ3N2aWJhbmonLCAnbGlwYW5qJywgJ3NycGFuaicsICdrb2xvdm96JywgJ3J1amFuJyxcbiAgICAgICdsaXN0b3BhZCcsICdzdHVkZW5pJywgJ3Byb3NpbmFjJ1xuICAgIF1cbiAgXSxcbiAgW1sncHIubi5lLicsICdBRCddLCBbJ3ByLiBLci4nLCAncG8uIEtyLiddLCBbJ3ByaWplIEtyaXN0YScsICdwb3NsaWplIEtyaXN0YSddXSxcbiAgMSxcbiAgWzYsIDBdLFxuICBbJ2RkLiBNTS4geS4nLCAnZC4gTU1NIHkuJywgJ2QuIE1NTU0geS4nLCAnRUVFRSwgZC4gTU1NTSB5LiddLFxuICBbJ0hIOm1tJywgJ0hIOm1tOnNzJywgJ0hIOm1tOnNzIHonLCAnSEg6bW06c3MgKHp6enopJ10sXG4gIFsnezF9IHswfScsIHUsICd7MX0gXFwndVxcJyB7MH0nLCB1XSxcbiAgWycsJywgJy4nLCAnOycsICclJywgJysnLCAnLScsICdFJywgJ8OXJywgJ+KAsCcsICfiiJ4nLCAnTmFOJywgJzonXSxcbiAgWycjLCMjMC4jIyMnLCAnIywjIzDCoCUnLCAnIywjIzAuMDDCoMKkJywgJyNFMCddLFxuICAnSFJLJyxcbiAgJ0hSSycsXG4gICdocnZhdHNrYSBrdW5hJyxcbiAge1xuICAgICdBVUQnOiBbdSwgJyQnXSxcbiAgICAnQlJMJzogW3UsICdSJCddLFxuICAgICdDQUQnOiBbdSwgJyQnXSxcbiAgICAnQ05ZJzogW3UsICfCpSddLFxuICAgICdFVVInOiBbdSwgJ+KCrCddLFxuICAgICdHQlAnOiBbdSwgJ8KjJ10sXG4gICAgJ0hLRCc6IFt1LCAnJCddLFxuICAgICdJTFMnOiBbdSwgJ+KCqiddLFxuICAgICdJTlInOiBbdSwgJ+KCuSddLFxuICAgICdKUFknOiBbdSwgJ8KlJ10sXG4gICAgJ0tSVyc6IFt1LCAn4oKpJ10sXG4gICAgJ01YTic6IFt1LCAnJCddLFxuICAgICdOWkQnOiBbdSwgJyQnXSxcbiAgICAnVFdEJzogW3UsICdOVCQnXSxcbiAgICAnVVNEJzogW3UsICckJ10sXG4gICAgJ1ZORCc6IFt1LCAn4oKrJ10sXG4gICAgJ1hDRCc6IFt1LCAnJCddLFxuICAgICdYUEYnOiBbXSxcbiAgICAnWFhYJzogW11cbiAgfSxcbiAgJ2x0cicsXG4gIHBsdXJhbFxuXTtcbiJdfQ==
+
+/***/ }),
+
+/***/ "./node_modules/@angular/common/locales/hu.js":
+/*!****************************************************!*\
+ !*** ./node_modules/@angular/common/locales/hu.js ***!
+ \****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+(function (factory) {
+ if ( true && typeof module.exports === "object") {
+ var v = factory(null, exports);
+ if (v !== undefined) module.exports = v;
+ }
+ else if (true) {
+ !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),
+ __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
+ (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),
+ __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+ }
+})(function (require, exports) {
+ "use strict";
+ Object.defineProperty(exports, "__esModule", { value: true });
+ // THIS CODE IS GENERATED - DO NOT MODIFY
+ // See angular/tools/gulp-tasks/cldr/extract.js
+ var u = undefined;
+ function plural(n) {
+ if (n === 1)
+ return 1;
+ return 5;
+ }
+ exports.default = [
+ 'hu',
+ [['de.', 'du.'], u, u],
+ u,
+ [
+ ['V', 'H', 'K', 'Sz', 'Cs', 'P', 'Sz'], ['V', 'H', 'K', 'Sze', 'Cs', 'P', 'Szo'],
+ ['vasárnap', 'hétfő', 'kedd', 'szerda', 'csütörtök', 'péntek', 'szombat'],
+ ['V', 'H', 'K', 'Sze', 'Cs', 'P', 'Szo']
+ ],
+ u,
+ [
+ ['J', 'F', 'M', 'Á', 'M', 'J', 'J', 'A', 'Sz', 'O', 'N', 'D'],
+ [
+ 'jan.', 'febr.', 'márc.', 'ápr.', 'máj.', 'jún.', 'júl.', 'aug.', 'szept.', 'okt.', 'nov.',
+ 'dec.'
+ ],
+ [
+ 'január', 'február', 'március', 'április', 'május', 'június', 'július', 'augusztus',
+ 'szeptember', 'október', 'november', 'december'
+ ]
+ ],
+ u,
+ [['ie.', 'isz.'], ['i. e.', 'i. sz.'], ['Krisztus előtt', 'időszámításunk szerint']],
+ 1,
+ [6, 0],
+ ['y. MM. dd.', 'y. MMM d.', 'y. MMMM d.', 'y. MMMM d., EEEE'],
+ ['H:mm', 'H:mm:ss', 'H:mm:ss z', 'H:mm:ss zzzz'],
+ ['{1} {0}', u, u, u],
+ [',', ' ', ';', '%', '+', '-', 'E', '×', '‰', '∞', 'NaN', ':'],
+ ['#,##0.###', '#,##0%', '#,##0.00 ¤', '#E0'],
+ 'HUF',
+ 'Ft',
+ 'magyar forint',
+ {
+ 'AUD': [u, '$'],
+ 'BRL': [u, 'R$'],
+ 'CAD': [u, '$'],
+ 'CNY': [u, '¥'],
+ 'EUR': [u, '€'],
+ 'GBP': [u, '£'],
+ 'HKD': [u, '$'],
+ 'HUF': ['Ft'],
+ 'ILS': [u, '₪'],
+ 'INR': [u, '₹'],
+ 'KRW': [u, '₩'],
+ 'MXN': [u, '$'],
+ 'NZD': [u, '$'],
+ 'TWD': [u, 'NT$'],
+ 'USD': [u, '$'],
+ 'VND': [u, '₫'],
+ 'XCD': [u, '$']
+ },
+ 'ltr',
+ plural
+ ];
+});
+//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21tb24vbG9jYWxlcy9odS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7Ozs7Ozs7Ozs7OztJQUVILHlDQUF5QztJQUN6QywrQ0FBK0M7SUFFL0MsSUFBTSxDQUFDLEdBQUcsU0FBUyxDQUFDO0lBRXBCLFNBQVMsTUFBTSxDQUFDLENBQVM7UUFDdkIsSUFBSSxDQUFDLEtBQUssQ0FBQztZQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3RCLE9BQU8sQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUVELGtCQUFlO1FBQ2IsSUFBSTtRQUNKLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN0QixDQUFDO1FBQ0Q7WUFDRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsS0FBSyxDQUFDO1lBQ2hGLENBQUMsVUFBVSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDO1lBQ3pFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsS0FBSyxDQUFDO1NBQ3pDO1FBQ0QsQ0FBQztRQUNEO1lBQ0UsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQztZQUM3RDtnQkFDRSxNQUFNLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTTtnQkFDMUYsTUFBTTthQUNQO1lBQ0Q7Z0JBQ0UsUUFBUSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFdBQVc7Z0JBQ25GLFlBQVksRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFVBQVU7YUFDaEQ7U0FDRjtRQUNELENBQUM7UUFDRCxDQUFDLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsd0JBQXdCLENBQUMsQ0FBQztRQUNwRixDQUFDO1FBQ0QsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ04sQ0FBQyxZQUFZLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxrQkFBa0IsQ0FBQztRQUM3RCxDQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLGNBQWMsQ0FBQztRQUNoRCxDQUFDLFNBQVMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNwQixDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDO1FBQzlELENBQUMsV0FBVyxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsS0FBSyxDQUFDO1FBQzVDLEtBQUs7UUFDTCxJQUFJO1FBQ0osZUFBZTtRQUNmO1lBQ0UsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQztZQUNmLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUM7WUFDaEIsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQztZQUNmLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUM7WUFDZixLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDO1lBQ2YsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQztZQUNmLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUM7WUFDZixLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUM7WUFDYixLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDO1lBQ2YsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQztZQUNmLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUM7WUFDZixLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDO1lBQ2YsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQztZQUNmLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUM7WUFDakIsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQztZQUNmLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUM7WUFDZixLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDO1NBQ2hCO1FBQ0QsS0FBSztRQUNMLE1BQU07S0FDUCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbi8vIFRISVMgQ09ERSBJUyBHRU5FUkFURUQgLSBETyBOT1QgTU9ESUZZXG4vLyBTZWUgYW5ndWxhci90b29scy9ndWxwLXRhc2tzL2NsZHIvZXh0cmFjdC5qc1xuXG5jb25zdCB1ID0gdW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBwbHVyYWwobjogbnVtYmVyKTogbnVtYmVyIHtcbiAgaWYgKG4gPT09IDEpIHJldHVybiAxO1xuICByZXR1cm4gNTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgW1xuICAnaHUnLFxuICBbWydkZS4nLCAnZHUuJ10sIHUsIHVdLFxuICB1LFxuICBbXG4gICAgWydWJywgJ0gnLCAnSycsICdTeicsICdDcycsICdQJywgJ1N6J10sIFsnVicsICdIJywgJ0snLCAnU3plJywgJ0NzJywgJ1AnLCAnU3pvJ10sXG4gICAgWyd2YXPDoXJuYXAnLCAnaMOpdGbFkScsICdrZWRkJywgJ3N6ZXJkYScsICdjc8O8dMO2cnTDtmsnLCAncMOpbnRlaycsICdzem9tYmF0J10sXG4gICAgWydWJywgJ0gnLCAnSycsICdTemUnLCAnQ3MnLCAnUCcsICdTem8nXVxuICBdLFxuICB1LFxuICBbXG4gICAgWydKJywgJ0YnLCAnTScsICfDgScsICdNJywgJ0onLCAnSicsICdBJywgJ1N6JywgJ08nLCAnTicsICdEJ10sXG4gICAgW1xuICAgICAgJ2phbi4nLCAnZmVici4nLCAnbcOhcmMuJywgJ8OhcHIuJywgJ23DoWouJywgJ2rDum4uJywgJ2rDumwuJywgJ2F1Zy4nLCAnc3plcHQuJywgJ29rdC4nLCAnbm92LicsXG4gICAgICAnZGVjLidcbiAgICBdLFxuICAgIFtcbiAgICAgICdqYW51w6FyJywgJ2ZlYnJ1w6FyJywgJ23DoXJjaXVzJywgJ8OhcHJpbGlzJywgJ23DoWp1cycsICdqw7puaXVzJywgJ2rDumxpdXMnLCAnYXVndXN6dHVzJyxcbiAgICAgICdzemVwdGVtYmVyJywgJ29rdMOzYmVyJywgJ25vdmVtYmVyJywgJ2RlY2VtYmVyJ1xuICAgIF1cbiAgXSxcbiAgdSxcbiAgW1snaWUuJywgJ2lzei4nXSwgWydpLiBlLicsICdpLiBzei4nXSwgWydLcmlzenR1cyBlbMWRdHQnLCAnaWTFkXN6w6Ftw610w6FzdW5rIHN6ZXJpbnQnXV0sXG4gIDEsXG4gIFs2LCAwXSxcbiAgWyd5LiBNTS4gZGQuJywgJ3kuIE1NTSBkLicsICd5LiBNTU1NIGQuJywgJ3kuIE1NTU0gZC4sIEVFRUUnXSxcbiAgWydIOm1tJywgJ0g6bW06c3MnLCAnSDptbTpzcyB6JywgJ0g6bW06c3Mgenp6eiddLFxuICBbJ3sxfSB7MH0nLCB1LCB1LCB1XSxcbiAgWycsJywgJ8KgJywgJzsnLCAnJScsICcrJywgJy0nLCAnRScsICfDlycsICfigLAnLCAn4oieJywgJ05hTicsICc6J10sXG4gIFsnIywjIzAuIyMjJywgJyMsIyMwJScsICcjLCMjMC4wMMKgwqQnLCAnI0UwJ10sXG4gICdIVUYnLFxuICAnRnQnLFxuICAnbWFneWFyIGZvcmludCcsXG4gIHtcbiAgICAnQVVEJzogW3UsICckJ10sXG4gICAgJ0JSTCc6IFt1LCAnUiQnXSxcbiAgICAnQ0FEJzogW3UsICckJ10sXG4gICAgJ0NOWSc6IFt1LCAnwqUnXSxcbiAgICAnRVVSJzogW3UsICfigqwnXSxcbiAgICAnR0JQJzogW3UsICfCoyddLFxuICAgICdIS0QnOiBbdSwgJyQnXSxcbiAgICAnSFVGJzogWydGdCddLFxuICAgICdJTFMnOiBbdSwgJ+KCqiddLFxuICAgICdJTlInOiBbdSwgJ+KCuSddLFxuICAgICdLUlcnOiBbdSwgJ+KCqSddLFxuICAgICdNWE4nOiBbdSwgJyQnXSxcbiAgICAnTlpEJzogW3UsICckJ10sXG4gICAgJ1RXRCc6IFt1LCAnTlQkJ10sXG4gICAgJ1VTRCc6IFt1LCAnJCddLFxuICAgICdWTkQnOiBbdSwgJ+KCqyddLFxuICAgICdYQ0QnOiBbdSwgJyQnXVxuICB9LFxuICAnbHRyJyxcbiAgcGx1cmFsXG5dO1xuIl19
+
+/***/ }),
+
+/***/ "./node_modules/@angular/common/locales/id.js":
+/*!****************************************************!*\
+ !*** ./node_modules/@angular/common/locales/id.js ***!
+ \****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+(function (factory) {
+ if ( true && typeof module.exports === "object") {
+ var v = factory(null, exports);
+ if (v !== undefined) module.exports = v;
+ }
+ else if (true) {
+ !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),
+ __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
+ (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),
+ __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+ }
+})(function (require, exports) {
+ "use strict";
+ Object.defineProperty(exports, "__esModule", { value: true });
+ // THIS CODE IS GENERATED - DO NOT MODIFY
+ // See angular/tools/gulp-tasks/cldr/extract.js
+ var u = undefined;
+ function plural(n) {
+ return 5;
+ }
+ exports.default = [
+ 'id',
+ [['AM', 'PM'], u, u],
+ u,
+ [
+ ['M', 'S', 'S', 'R', 'K', 'J', 'S'], ['Min', 'Sen', 'Sel', 'Rab', 'Kam', 'Jum', 'Sab'],
+ ['Minggu', 'Senin', 'Selasa', 'Rabu', 'Kamis', 'Jumat', 'Sabtu'],
+ ['Min', 'Sen', 'Sel', 'Rab', 'Kam', 'Jum', 'Sab']
+ ],
+ u,
+ [
+ ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],
+ ['Jan', 'Feb', 'Mar', 'Apr', 'Mei', 'Jun', 'Jul', 'Agu', 'Sep', 'Okt', 'Nov', 'Des'],
+ [
+ 'Januari', 'Februari', 'Maret', 'April', 'Mei', 'Juni', 'Juli', 'Agustus', 'September',
+ 'Oktober', 'November', 'Desember'
+ ]
+ ],
+ u,
+ [['SM', 'M'], u, ['Sebelum Masehi', 'Masehi']],
+ 0,
+ [6, 0],
+ ['dd/MM/yy', 'd MMM y', 'd MMMM y', 'EEEE, dd MMMM y'],
+ ['HH.mm', 'HH.mm.ss', 'HH.mm.ss z', 'HH.mm.ss zzzz'],
+ ['{1} {0}', u, u, u],
+ [',', '.', ';', '%', '+', '-', 'E', '×', '‰', '∞', 'NaN', '.'],
+ ['#,##0.###', '#,##0%', '¤#,##0.00', '#E0'],
+ 'IDR',
+ 'Rp',
+ 'Rupiah Indonesia',
+ {
+ 'AUD': ['AU$', '$'],
+ 'IDR': ['Rp'],
+ 'INR': ['Rs', '₹'],
+ 'JPY': ['JP¥', '¥'],
+ 'THB': ['฿'],
+ 'TWD': ['NT$'],
+ 'USD': ['US$', '$'],
+ 'XXX': []
+ },
+ 'ltr',
+ plural
+ ];
+});
+//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21tb24vbG9jYWxlcy9pZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7Ozs7Ozs7Ozs7OztJQUVILHlDQUF5QztJQUN6QywrQ0FBK0M7SUFFL0MsSUFBTSxDQUFDLEdBQUcsU0FBUyxDQUFDO0lBRXBCLFNBQVMsTUFBTSxDQUFDLENBQVM7UUFDdkIsT0FBTyxDQUFDLENBQUM7SUFDWCxDQUFDO0lBRUQsa0JBQWU7UUFDYixJQUFJO1FBQ0osQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3BCLENBQUM7UUFDRDtZQUNFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUM7WUFDdEYsQ0FBQyxRQUFRLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUM7WUFDaEUsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUM7U0FDbEQ7UUFDRCxDQUFDO1FBQ0Q7WUFDRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDO1lBQzVELENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUM7WUFDcEY7Z0JBQ0UsU0FBUyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxXQUFXO2dCQUN0RixTQUFTLEVBQUUsVUFBVSxFQUFFLFVBQVU7YUFDbEM7U0FDRjtRQUNELENBQUM7UUFDRCxDQUFDLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLGdCQUFnQixFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQzlDLENBQUM7UUFDRCxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDTixDQUFDLFVBQVUsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLGlCQUFpQixDQUFDO1FBQ3RELENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsZUFBZSxDQUFDO1FBQ3BELENBQUMsU0FBUyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3BCLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUM7UUFDOUQsQ0FBQyxXQUFXLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxLQUFLLENBQUM7UUFDM0MsS0FBSztRQUNMLElBQUk7UUFDSixrQkFBa0I7UUFDbEI7WUFDRSxLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDO1lBQ25CLEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQztZQUNiLEtBQUssRUFBRSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUM7WUFDbEIsS0FBSyxFQUFFLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQztZQUNuQixLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUM7WUFDWixLQUFLLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDZCxLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDO1lBQ25CLEtBQUssRUFBRSxFQUFFO1NBQ1Y7UUFDRCxLQUFLO1FBQ0wsTUFBTTtLQUNQLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuLy8gVEhJUyBDT0RFIElTIEdFTkVSQVRFRCAtIERPIE5PVCBNT0RJRllcbi8vIFNlZSBhbmd1bGFyL3Rvb2xzL2d1bHAtdGFza3MvY2xkci9leHRyYWN0LmpzXG5cbmNvbnN0IHUgPSB1bmRlZmluZWQ7XG5cbmZ1bmN0aW9uIHBsdXJhbChuOiBudW1iZXIpOiBudW1iZXIge1xuICByZXR1cm4gNTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgW1xuICAnaWQnLFxuICBbWydBTScsICdQTSddLCB1LCB1XSxcbiAgdSxcbiAgW1xuICAgIFsnTScsICdTJywgJ1MnLCAnUicsICdLJywgJ0onLCAnUyddLCBbJ01pbicsICdTZW4nLCAnU2VsJywgJ1JhYicsICdLYW0nLCAnSnVtJywgJ1NhYiddLFxuICAgIFsnTWluZ2d1JywgJ1NlbmluJywgJ1NlbGFzYScsICdSYWJ1JywgJ0thbWlzJywgJ0p1bWF0JywgJ1NhYnR1J10sXG4gICAgWydNaW4nLCAnU2VuJywgJ1NlbCcsICdSYWInLCAnS2FtJywgJ0p1bScsICdTYWInXVxuICBdLFxuICB1LFxuICBbXG4gICAgWydKJywgJ0YnLCAnTScsICdBJywgJ00nLCAnSicsICdKJywgJ0EnLCAnUycsICdPJywgJ04nLCAnRCddLFxuICAgIFsnSmFuJywgJ0ZlYicsICdNYXInLCAnQXByJywgJ01laScsICdKdW4nLCAnSnVsJywgJ0FndScsICdTZXAnLCAnT2t0JywgJ05vdicsICdEZXMnXSxcbiAgICBbXG4gICAgICAnSmFudWFyaScsICdGZWJydWFyaScsICdNYXJldCcsICdBcHJpbCcsICdNZWknLCAnSnVuaScsICdKdWxpJywgJ0FndXN0dXMnLCAnU2VwdGVtYmVyJyxcbiAgICAgICdPa3RvYmVyJywgJ05vdmVtYmVyJywgJ0Rlc2VtYmVyJ1xuICAgIF1cbiAgXSxcbiAgdSxcbiAgW1snU00nLCAnTSddLCB1LCBbJ1NlYmVsdW0gTWFzZWhpJywgJ01hc2VoaSddXSxcbiAgMCxcbiAgWzYsIDBdLFxuICBbJ2RkL01NL3l5JywgJ2QgTU1NIHknLCAnZCBNTU1NIHknLCAnRUVFRSwgZGQgTU1NTSB5J10sXG4gIFsnSEgubW0nLCAnSEgubW0uc3MnLCAnSEgubW0uc3MgeicsICdISC5tbS5zcyB6enp6J10sXG4gIFsnezF9IHswfScsIHUsIHUsIHVdLFxuICBbJywnLCAnLicsICc7JywgJyUnLCAnKycsICctJywgJ0UnLCAnw5cnLCAn4oCwJywgJ+KInicsICdOYU4nLCAnLiddLFxuICBbJyMsIyMwLiMjIycsICcjLCMjMCUnLCAnwqQjLCMjMC4wMCcsICcjRTAnXSxcbiAgJ0lEUicsXG4gICdScCcsXG4gICdSdXBpYWggSW5kb25lc2lhJyxcbiAge1xuICAgICdBVUQnOiBbJ0FVJCcsICckJ10sXG4gICAgJ0lEUic6IFsnUnAnXSxcbiAgICAnSU5SJzogWydScycsICfigrknXSxcbiAgICAnSlBZJzogWydKUMKlJywgJ8KlJ10sXG4gICAgJ1RIQic6IFsn4Li/J10sXG4gICAgJ1RXRCc6IFsnTlQkJ10sXG4gICAgJ1VTRCc6IFsnVVMkJywgJyQnXSxcbiAgICAnWFhYJzogW11cbiAgfSxcbiAgJ2x0cicsXG4gIHBsdXJhbFxuXTtcbiJdfQ==
+
+/***/ }),
+
+/***/ "./node_modules/@angular/common/locales/it.js":
+/*!****************************************************!*\
+ !*** ./node_modules/@angular/common/locales/it.js ***!
+ \****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+(function (factory) {
+ if ( true && typeof module.exports === "object") {
+ var v = factory(null, exports);
+ if (v !== undefined) module.exports = v;
+ }
+ else if (true) {
+ !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),
+ __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
+ (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),
+ __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+ }
+})(function (require, exports) {
+ "use strict";
+ Object.defineProperty(exports, "__esModule", { value: true });
+ // THIS CODE IS GENERATED - DO NOT MODIFY
+ // See angular/tools/gulp-tasks/cldr/extract.js
+ var u = undefined;
+ function plural(n) {
+ var i = Math.floor(Math.abs(n)), v = n.toString().replace(/^[^.]*\.?/, '').length;
+ if (i === 1 && v === 0)
+ return 1;
+ return 5;
+ }
+ exports.default = [
+ 'it',
+ [['m.', 'p.'], ['AM', 'PM'], u],
+ u,
+ [
+ ['D', 'L', 'M', 'M', 'G', 'V', 'S'], ['dom', 'lun', 'mar', 'mer', 'gio', 'ven', 'sab'],
+ ['domenica', 'lunedì', 'martedì', 'mercoledì', 'giovedì', 'venerdì', 'sabato'],
+ ['dom', 'lun', 'mar', 'mer', 'gio', 'ven', 'sab']
+ ],
+ u,
+ [
+ ['G', 'F', 'M', 'A', 'M', 'G', 'L', 'A', 'S', 'O', 'N', 'D'],
+ ['gen', 'feb', 'mar', 'apr', 'mag', 'giu', 'lug', 'ago', 'set', 'ott', 'nov', 'dic'],
+ [
+ 'gennaio', 'febbraio', 'marzo', 'aprile', 'maggio', 'giugno', 'luglio', 'agosto', 'settembre',
+ 'ottobre', 'novembre', 'dicembre'
+ ]
+ ],
+ u,
+ [['aC', 'dC'], ['a.C.', 'd.C.'], ['avanti Cristo', 'dopo Cristo']],
+ 1,
+ [6, 0],
+ ['dd/MM/yy', 'd MMM y', 'd MMMM y', 'EEEE d MMMM y'],
+ ['HH:mm', 'HH:mm:ss', 'HH:mm:ss z', 'HH:mm:ss zzzz'],
+ ['{1}, {0}', u, '{1} {0}', u],
+ [',', '.', ';', '%', '+', '-', 'E', '×', '‰', '∞', 'NaN', ':'],
+ ['#,##0.###', '#,##0%', '#,##0.00 ¤', '#E0'],
+ 'EUR',
+ '€',
+ 'euro',
+ {
+ 'BRL': [u, 'R$'],
+ 'BYN': [u, 'Br'],
+ 'EGP': [u, '£E'],
+ 'HKD': [u, '$'],
+ 'JPY': [u, '¥'],
+ 'KRW': [u, '₩'],
+ 'MXN': [u, '$'],
+ 'NOK': [u, 'NKr'],
+ 'THB': ['฿'],
+ 'TWD': [u, 'NT$'],
+ 'USD': [u, '$']
+ },
+ 'ltr',
+ plural
+ ];
+});
+//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21tb24vbG9jYWxlcy9pdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7Ozs7Ozs7Ozs7OztJQUVILHlDQUF5QztJQUN6QywrQ0FBK0M7SUFFL0MsSUFBTSxDQUFDLEdBQUcsU0FBUyxDQUFDO0lBRXBCLFNBQVMsTUFBTSxDQUFDLENBQVM7UUFDdkIsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUNsRixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7WUFBRSxPQUFPLENBQUMsQ0FBQztRQUNqQyxPQUFPLENBQUMsQ0FBQztJQUNYLENBQUM7SUFFRCxrQkFBZTtRQUNiLElBQUk7UUFDSixDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMvQixDQUFDO1FBQ0Q7WUFDRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDO1lBQ3RGLENBQUMsVUFBVSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsUUFBUSxDQUFDO1lBQzlFLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDO1NBQ2xEO1FBQ0QsQ0FBQztRQUNEO1lBQ0UsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQztZQUM1RCxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDO1lBQ3BGO2dCQUNFLFNBQVMsRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsV0FBVztnQkFDN0YsU0FBUyxFQUFFLFVBQVUsRUFBRSxVQUFVO2FBQ2xDO1NBQ0Y7UUFDRCxDQUFDO1FBQ0QsQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsRUFBRSxDQUFDLGVBQWUsRUFBRSxhQUFhLENBQUMsQ0FBQztRQUNsRSxDQUFDO1FBQ0QsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ04sQ0FBQyxVQUFVLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxlQUFlLENBQUM7UUFDcEQsQ0FBQyxPQUFPLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxlQUFlLENBQUM7UUFDcEQsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7UUFDN0IsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQztRQUM5RCxDQUFDLFdBQVcsRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLEtBQUssQ0FBQztRQUM1QyxLQUFLO1FBQ0wsR0FBRztRQUNILE1BQU07UUFDTjtZQUNFLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUM7WUFDaEIsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQztZQUNoQixLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDO1lBQ2hCLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUM7WUFDZixLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDO1lBQ2YsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQztZQUNmLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUM7WUFDZixLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDO1lBQ2pCLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQztZQUNaLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUM7WUFDakIsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQztTQUNoQjtRQUNELEtBQUs7UUFDTCxNQUFNO0tBQ1AsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuXG4vLyBUSElTIENPREUgSVMgR0VORVJBVEVEIC0gRE8gTk9UIE1PRElGWVxuLy8gU2VlIGFuZ3VsYXIvdG9vbHMvZ3VscC10YXNrcy9jbGRyL2V4dHJhY3QuanNcblxuY29uc3QgdSA9IHVuZGVmaW5lZDtcblxuZnVuY3Rpb24gcGx1cmFsKG46IG51bWJlcik6IG51bWJlciB7XG4gIGxldCBpID0gTWF0aC5mbG9vcihNYXRoLmFicyhuKSksIHYgPSBuLnRvU3RyaW5nKCkucmVwbGFjZSgvXlteLl0qXFwuPy8sICcnKS5sZW5ndGg7XG4gIGlmIChpID09PSAxICYmIHYgPT09IDApIHJldHVybiAxO1xuICByZXR1cm4gNTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgW1xuICAnaXQnLFxuICBbWydtLicsICdwLiddLCBbJ0FNJywgJ1BNJ10sIHVdLFxuICB1LFxuICBbXG4gICAgWydEJywgJ0wnLCAnTScsICdNJywgJ0cnLCAnVicsICdTJ10sIFsnZG9tJywgJ2x1bicsICdtYXInLCAnbWVyJywgJ2dpbycsICd2ZW4nLCAnc2FiJ10sXG4gICAgWydkb21lbmljYScsICdsdW5lZMOsJywgJ21hcnRlZMOsJywgJ21lcmNvbGVkw6wnLCAnZ2lvdmVkw6wnLCAndmVuZXJkw6wnLCAnc2FiYXRvJ10sXG4gICAgWydkb20nLCAnbHVuJywgJ21hcicsICdtZXInLCAnZ2lvJywgJ3ZlbicsICdzYWInXVxuICBdLFxuICB1LFxuICBbXG4gICAgWydHJywgJ0YnLCAnTScsICdBJywgJ00nLCAnRycsICdMJywgJ0EnLCAnUycsICdPJywgJ04nLCAnRCddLFxuICAgIFsnZ2VuJywgJ2ZlYicsICdtYXInLCAnYXByJywgJ21hZycsICdnaXUnLCAnbHVnJywgJ2FnbycsICdzZXQnLCAnb3R0JywgJ25vdicsICdkaWMnXSxcbiAgICBbXG4gICAgICAnZ2VubmFpbycsICdmZWJicmFpbycsICdtYXJ6bycsICdhcHJpbGUnLCAnbWFnZ2lvJywgJ2dpdWdubycsICdsdWdsaW8nLCAnYWdvc3RvJywgJ3NldHRlbWJyZScsXG4gICAgICAnb3R0b2JyZScsICdub3ZlbWJyZScsICdkaWNlbWJyZSdcbiAgICBdXG4gIF0sXG4gIHUsXG4gIFtbJ2FDJywgJ2RDJ10sIFsnYS5DLicsICdkLkMuJ10sIFsnYXZhbnRpIENyaXN0bycsICdkb3BvIENyaXN0byddXSxcbiAgMSxcbiAgWzYsIDBdLFxuICBbJ2RkL01NL3l5JywgJ2QgTU1NIHknLCAnZCBNTU1NIHknLCAnRUVFRSBkIE1NTU0geSddLFxuICBbJ0hIOm1tJywgJ0hIOm1tOnNzJywgJ0hIOm1tOnNzIHonLCAnSEg6bW06c3Mgenp6eiddLFxuICBbJ3sxfSwgezB9JywgdSwgJ3sxfSB7MH0nLCB1XSxcbiAgWycsJywgJy4nLCAnOycsICclJywgJysnLCAnLScsICdFJywgJ8OXJywgJ+KAsCcsICfiiJ4nLCAnTmFOJywgJzonXSxcbiAgWycjLCMjMC4jIyMnLCAnIywjIzAlJywgJyMsIyMwLjAwwqDCpCcsICcjRTAnXSxcbiAgJ0VVUicsXG4gICfigqwnLFxuICAnZXVybycsXG4gIHtcbiAgICAnQlJMJzogW3UsICdSJCddLFxuICAgICdCWU4nOiBbdSwgJ0JyJ10sXG4gICAgJ0VHUCc6IFt1LCAnwqNFJ10sXG4gICAgJ0hLRCc6IFt1LCAnJCddLFxuICAgICdKUFknOiBbdSwgJ8KlJ10sXG4gICAgJ0tSVyc6IFt1LCAn4oKpJ10sXG4gICAgJ01YTic6IFt1LCAnJCddLFxuICAgICdOT0snOiBbdSwgJ05LciddLFxuICAgICdUSEInOiBbJ+C4vyddLFxuICAgICdUV0QnOiBbdSwgJ05UJCddLFxuICAgICdVU0QnOiBbdSwgJyQnXVxuICB9LFxuICAnbHRyJyxcbiAgcGx1cmFsXG5dO1xuIl19
+
+/***/ }),
+
+/***/ "./node_modules/@angular/common/locales/ja.js":
+/*!****************************************************!*\
+ !*** ./node_modules/@angular/common/locales/ja.js ***!
+ \****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+(function (factory) {
+ if ( true && typeof module.exports === "object") {
+ var v = factory(null, exports);
+ if (v !== undefined) module.exports = v;
+ }
+ else if (true) {
+ !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),
+ __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
+ (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),
+ __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+ }
+})(function (require, exports) {
+ "use strict";
+ Object.defineProperty(exports, "__esModule", { value: true });
+ // THIS CODE IS GENERATED - DO NOT MODIFY
+ // See angular/tools/gulp-tasks/cldr/extract.js
+ var u = undefined;
+ function plural(n) {
+ return 5;
+ }
+ exports.default = [
+ 'ja',
+ [['午前', '午後'], u, u],
+ u,
+ [
+ ['日', '月', '火', '水', '木', '金', '土'], u,
+ ['日曜日', '月曜日', '火曜日', '水曜日', '木曜日', '金曜日', '土曜日'],
+ ['日', '月', '火', '水', '木', '金', '土']
+ ],
+ u,
+ [
+ ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],
+ ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'], u
+ ],
+ u,
+ [['BC', 'AD'], ['紀元前', '西暦'], u],
+ 0,
+ [6, 0],
+ ['y/MM/dd', u, 'y年M月d日', 'y年M月d日EEEE'],
+ ['H:mm', 'H:mm:ss', 'H:mm:ss z', 'H時mm分ss秒 zzzz'],
+ ['{1} {0}', u, u, u],
+ ['.', ',', ';', '%', '+', '-', 'E', '×', '‰', '∞', 'NaN', ':'],
+ ['#,##0.###', '#,##0%', '¤#,##0.00', '#E0'],
+ 'JPY',
+ '¥',
+ '日本円',
+ { 'CNY': ['元', '¥'], 'JPY': ['¥'], 'RON': [u, 'レイ'], 'XXX': [] },
+ 'ltr',
+ plural
+ ];
+});
+//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiamEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21tb24vbG9jYWxlcy9qYS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7Ozs7Ozs7Ozs7OztJQUVILHlDQUF5QztJQUN6QywrQ0FBK0M7SUFFL0MsSUFBTSxDQUFDLEdBQUcsU0FBUyxDQUFDO0lBRXBCLFNBQVMsTUFBTSxDQUFDLENBQVM7UUFDdkIsT0FBTyxDQUFDLENBQUM7SUFDWCxDQUFDO0lBRUQsa0JBQWU7UUFDYixJQUFJO1FBQ0osQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3BCLENBQUM7UUFDRDtZQUNFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN0QyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQztZQUNqRCxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQztTQUNwQztRQUNELENBQUM7UUFDRDtZQUNFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUM7WUFDL0QsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUM7U0FDL0U7UUFDRCxDQUFDO1FBQ0QsQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDaEMsQ0FBQztRQUNELENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNOLENBQUMsU0FBUyxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsWUFBWSxDQUFDO1FBQ3RDLENBQUMsTUFBTSxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsZUFBZSxDQUFDO1FBQ2pELENBQUMsU0FBUyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3BCLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUM7UUFDOUQsQ0FBQyxXQUFXLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxLQUFLLENBQUM7UUFDM0MsS0FBSztRQUNMLEdBQUc7UUFDSCxLQUFLO1FBQ0wsRUFBQyxLQUFLLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUM7UUFDOUQsS0FBSztRQUNMLE1BQU07S0FDUCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbi8vIFRISVMgQ09ERSBJUyBHRU5FUkFURUQgLSBETyBOT1QgTU9ESUZZXG4vLyBTZWUgYW5ndWxhci90b29scy9ndWxwLXRhc2tzL2NsZHIvZXh0cmFjdC5qc1xuXG5jb25zdCB1ID0gdW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBwbHVyYWwobjogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuIDU7XG59XG5cbmV4cG9ydCBkZWZhdWx0IFtcbiAgJ2phJyxcbiAgW1sn5Y2I5YmNJywgJ+WNiOW+jCddLCB1LCB1XSxcbiAgdSxcbiAgW1xuICAgIFsn5pelJywgJ+aciCcsICfngasnLCAn5rC0JywgJ+acqCcsICfph5EnLCAn5ZyfJ10sIHUsXG4gICAgWyfml6Xmm5zml6UnLCAn5pyI5puc5pelJywgJ+eBq+abnOaXpScsICfmsLTmm5zml6UnLCAn5pyo5puc5pelJywgJ+mHkeabnOaXpScsICflnJ/mm5zml6UnXSxcbiAgICBbJ+aXpScsICfmnIgnLCAn54GrJywgJ+awtCcsICfmnKgnLCAn6YeRJywgJ+WcnyddXG4gIF0sXG4gIHUsXG4gIFtcbiAgICBbJzEnLCAnMicsICczJywgJzQnLCAnNScsICc2JywgJzcnLCAnOCcsICc5JywgJzEwJywgJzExJywgJzEyJ10sXG4gICAgWycx5pyIJywgJzLmnIgnLCAnM+aciCcsICc05pyIJywgJzXmnIgnLCAnNuaciCcsICc35pyIJywgJzjmnIgnLCAnOeaciCcsICcxMOaciCcsICcxMeaciCcsICcxMuaciCddLCB1XG4gIF0sXG4gIHUsXG4gIFtbJ0JDJywgJ0FEJ10sIFsn57SA5YWD5YmNJywgJ+ilv+aapiddLCB1XSxcbiAgMCxcbiAgWzYsIDBdLFxuICBbJ3kvTU0vZGQnLCB1LCAneeW5tE3mnIhk5pelJywgJ3nlubRN5pyIZOaXpUVFRUUnXSxcbiAgWydIOm1tJywgJ0g6bW06c3MnLCAnSDptbTpzcyB6JywgJ0jmmYJtbeWIhnNz56eSIHp6enonXSxcbiAgWyd7MX0gezB9JywgdSwgdSwgdV0sXG4gIFsnLicsICcsJywgJzsnLCAnJScsICcrJywgJy0nLCAnRScsICfDlycsICfigLAnLCAn4oieJywgJ05hTicsICc6J10sXG4gIFsnIywjIzAuIyMjJywgJyMsIyMwJScsICfCpCMsIyMwLjAwJywgJyNFMCddLFxuICAnSlBZJyxcbiAgJ++/pScsXG4gICfml6XmnKzlhoYnLFxuICB7J0NOWSc6IFsn5YWDJywgJ++/pSddLCAnSlBZJzogWyfvv6UnXSwgJ1JPTic6IFt1LCAn44Os44KkJ10sICdYWFgnOiBbXX0sXG4gICdsdHInLFxuICBwbHVyYWxcbl07XG4iXX0=
+
+/***/ }),
+
+/***/ "./node_modules/@angular/common/locales/kn.js":
+/*!****************************************************!*\
+ !*** ./node_modules/@angular/common/locales/kn.js ***!
+ \****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+(function (factory) {
+ if ( true && typeof module.exports === "object") {
+ var v = factory(null, exports);
+ if (v !== undefined) module.exports = v;
+ }
+ else if (true) {
+ !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),
+ __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
+ (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),
+ __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+ }
+})(function (require, exports) {
+ "use strict";
+ Object.defineProperty(exports, "__esModule", { value: true });
+ // THIS CODE IS GENERATED - DO NOT MODIFY
+ // See angular/tools/gulp-tasks/cldr/extract.js
+ var u = undefined;
+ function plural(n) {
+ var i = Math.floor(Math.abs(n));
+ if (i === 0 || n === 1)
+ return 1;
+ return 5;
+ }
+ exports.default = [
+ 'kn',
+ [['ಪೂ', 'ಅ'], ['ಪೂರ್ವಾಹ್ನ', 'ಅಪರಾಹ್ನ'], u],
+ [['ಪೂರ್ವಾಹ್ನ', 'ಅಪರಾಹ್ನ'], u, u],
+ [
+ ['ಭಾ', 'ಸೋ', 'ಮಂ', 'ಬು', 'ಗು', 'ಶು', 'ಶ'], ['ಭಾನು', 'ಸೋಮ', 'ಮಂಗಳ', 'ಬುಧ', 'ಗುರು', 'ಶುಕ್ರ', 'ಶನಿ'],
+ ['ಭಾನುವಾರ', 'ಸೋಮವಾರ', 'ಮಂಗಳವಾರ', 'ಬುಧವಾರ', 'ಗುರುವಾರ', 'ಶುಕ್ರವಾರ', 'ಶನಿವಾರ'],
+ ['ಭಾನು', 'ಸೋಮ', 'ಮಂಗಳ', 'ಬುಧ', 'ಗುರು', 'ಶುಕ್ರ', 'ಶನಿ']
+ ],
+ u,
+ [
+ ['ಜ', 'ಫೆ', 'ಮಾ', 'ಏ', 'ಮೇ', 'ಜೂ', 'ಜು', 'ಆ', 'ಸೆ', 'ಅ', 'ನ', 'ಡಿ'],
+ ['ಜನವರಿ', 'ಫೆಬ್ರವರಿ', 'ಮಾರ್ಚ್', 'ಏಪ್ರಿ', 'ಮೇ', 'ಜೂನ್', 'ಜುಲೈ', 'ಆಗ', 'ಸೆಪ್ಟೆಂ', 'ಅಕ್ಟೋ', 'ನವೆಂ', 'ಡಿಸೆಂ'],
+ [
+ 'ಜನವರಿ', 'ಫೆಬ್ರವರಿ', 'ಮಾರ್ಚ್', 'ಏಪ್ರಿಲ್', 'ಮೇ', 'ಜೂನ್', 'ಜುಲೈ', 'ಆಗಸ್ಟ್', 'ಸೆಪ್ಟೆಂಬರ್', 'ಅಕ್ಟೋಬರ್', 'ನವೆಂಬರ್',
+ 'ಡಿಸೆಂಬರ್'
+ ]
+ ],
+ [
+ ['ಜ', 'ಫೆ', 'ಮಾ', 'ಏ', 'ಮೇ', 'ಜೂ', 'ಜು', 'ಆ', 'ಸೆ', 'ಅ', 'ನ', 'ಡಿ'],
+ ['ಜನ', 'ಫೆಬ್ರ', 'ಮಾರ್ಚ್', 'ಏಪ್ರಿ', 'ಮೇ', 'ಜೂನ್', 'ಜುಲೈ', 'ಆಗ', 'ಸೆಪ್ಟೆಂ', 'ಅಕ್ಟೋ', 'ನವೆಂ', 'ಡಿಸೆಂ'],
+ [
+ 'ಜನವರಿ', 'ಫೆಬ್ರವರಿ', 'ಮಾರ್ಚ್', 'ಏಪ್ರಿಲ್', 'ಮೇ', 'ಜೂನ್', 'ಜುಲೈ', 'ಆಗಸ್ಟ್', 'ಸೆಪ್ಟೆಂಬರ್', 'ಅಕ್ಟೋಬರ್', 'ನವೆಂಬರ್',
+ 'ಡಿಸೆಂಬರ್'
+ ]
+ ],
+ [['ಕ್ರಿ.ಪೂ', 'ಕ್ರಿ.ಶ'], u, ['ಕ್ರಿಸ್ತ ಪೂರ್ವ', 'ಕ್ರಿಸ್ತ ಶಕ']],
+ 0,
+ [0, 0],
+ ['d/M/yy', 'MMM d, y', 'MMMM d, y', 'EEEE, MMMM d, y'],
+ ['hh:mm a', 'hh:mm:ss a', 'hh:mm:ss a z', 'hh:mm:ss a zzzz'],
+ ['{1} {0}', u, u, u],
+ ['.', ',', ';', '%', '+', '-', 'E', '×', '‰', '∞', 'NaN', ':'],
+ ['#,##0.###', '#,##0%', '¤#,##0.00', '#E0'],
+ 'INR',
+ '₹',
+ 'ಭಾರತೀಯ ರೂಪಾಯಿ',
+ { 'JPY': ['JP¥', '¥'], 'RON': [u, 'ಲೀ'], 'THB': ['฿'], 'TWD': ['NT$'] },
+ 'ltr',
+ plural
+ ];
+});
+//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21tb24vbG9jYWxlcy9rbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7Ozs7Ozs7Ozs7OztJQUVILHlDQUF5QztJQUN6QywrQ0FBK0M7SUFFL0MsSUFBTSxDQUFDLEdBQUcsU0FBUyxDQUFDO0lBRXBCLFNBQVMsTUFBTSxDQUFDLENBQVM7UUFDdkIsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO1lBQUUsT0FBTyxDQUFDLENBQUM7UUFDakMsT0FBTyxDQUFDLENBQUM7SUFDWCxDQUFDO0lBRUQsa0JBQWU7UUFDYixJQUFJO1FBQ0osQ0FBQyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLFdBQVcsRUFBRSxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDMUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxTQUFTLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2hDO1lBQ0UsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQztZQUNqRyxDQUFDLFNBQVMsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFFBQVEsQ0FBQztZQUMzRSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQztTQUN2RDtRQUNELENBQUM7UUFDRDtZQUNFLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUM7WUFDbkUsQ0FBQyxPQUFPLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQztZQUN6RztnQkFDRSxPQUFPLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsU0FBUztnQkFDN0csVUFBVTthQUNYO1NBQ0Y7UUFDRDtZQUNFLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUM7WUFDbkUsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQztZQUNuRztnQkFDRSxPQUFPLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsU0FBUztnQkFDN0csVUFBVTthQUNYO1NBQ0Y7UUFDRCxDQUFDLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLGVBQWUsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUMzRCxDQUFDO1FBQ0QsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ04sQ0FBQyxRQUFRLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxpQkFBaUIsQ0FBQztRQUN0RCxDQUFDLFNBQVMsRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUFFLGlCQUFpQixDQUFDO1FBQzVELENBQUMsU0FBUyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3BCLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUM7UUFDOUQsQ0FBQyxXQUFXLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxLQUFLLENBQUM7UUFDM0MsS0FBSztRQUNMLEdBQUc7UUFDSCxlQUFlO1FBQ2YsRUFBQyxLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFDO1FBQ3JFLEtBQUs7UUFDTCxNQUFNO0tBQ1AsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuXG4vLyBUSElTIENPREUgSVMgR0VORVJBVEVEIC0gRE8gTk9UIE1PRElGWVxuLy8gU2VlIGFuZ3VsYXIvdG9vbHMvZ3VscC10YXNrcy9jbGRyL2V4dHJhY3QuanNcblxuY29uc3QgdSA9IHVuZGVmaW5lZDtcblxuZnVuY3Rpb24gcGx1cmFsKG46IG51bWJlcik6IG51bWJlciB7XG4gIGxldCBpID0gTWF0aC5mbG9vcihNYXRoLmFicyhuKSk7XG4gIGlmIChpID09PSAwIHx8IG4gPT09IDEpIHJldHVybiAxO1xuICByZXR1cm4gNTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgW1xuICAna24nLFxuICBbWyfgsqrgs4InLCAn4LKFJ10sIFsn4LKq4LOC4LKw4LON4LK14LK+4LK54LON4LKoJywgJ+CyheCyquCysOCyvuCyueCzjeCyqCddLCB1XSxcbiAgW1sn4LKq4LOC4LKw4LON4LK14LK+4LK54LON4LKoJywgJ+CyheCyquCysOCyvuCyueCzjeCyqCddLCB1LCB1XSxcbiAgW1xuICAgIFsn4LKt4LK+JywgJ+CyuOCziycsICfgsq7gsoInLCAn4LKs4LOBJywgJ+Cyl+CzgScsICfgsrbgs4EnLCAn4LK2J10sIFsn4LKt4LK+4LKo4LOBJywgJ+CyuOCzi+CyricsICfgsq7gsoLgspfgsrMnLCAn4LKs4LOB4LKnJywgJ+Cyl+CzgeCysOCzgScsICfgsrbgs4HgspXgs43gsrAnLCAn4LK24LKo4LK/J10sXG4gICAgWyfgsq3gsr7gsqjgs4HgsrXgsr7gsrAnLCAn4LK44LOL4LKu4LK14LK+4LKwJywgJ+CyruCyguCyl+Cys+CyteCyvuCysCcsICfgsqzgs4HgsqfgsrXgsr7gsrAnLCAn4LKX4LOB4LKw4LOB4LK14LK+4LKwJywgJ+CytuCzgeCyleCzjeCysOCyteCyvuCysCcsICfgsrbgsqjgsr/gsrXgsr7gsrAnXSxcbiAgICBbJ+CyreCyvuCyqOCzgScsICfgsrjgs4vgsq4nLCAn4LKu4LKC4LKX4LKzJywgJ+CyrOCzgeCypycsICfgspfgs4HgsrDgs4EnLCAn4LK24LOB4LKV4LON4LKwJywgJ+CytuCyqOCyvyddXG4gIF0sXG4gIHUsXG4gIFtcbiAgICBbJ+CynCcsICfgsqvgs4YnLCAn4LKu4LK+JywgJ+CyjycsICfgsq7gs4cnLCAn4LKc4LOCJywgJ+CynOCzgScsICfgsoYnLCAn4LK44LOGJywgJ+CyhScsICfgsqgnLCAn4LKh4LK/J10sXG4gICAgWyfgspzgsqjgsrXgsrDgsr8nLCAn4LKr4LOG4LKs4LON4LKw4LK14LKw4LK/JywgJ+CyruCyvuCysOCzjeCymuCzjScsICfgso/gsqrgs43gsrDgsr8nLCAn4LKu4LOHJywgJ+CynOCzguCyqOCzjScsICfgspzgs4HgsrLgs4gnLCAn4LKG4LKXJywgJ+CyuOCzhuCyquCzjeCyn+CzhuCygicsICfgsoXgspXgs43gsp/gs4snLCAn4LKo4LK14LOG4LKCJywgJ+CyoeCyv+CyuOCzhuCygiddLFxuICAgIFtcbiAgICAgICfgspzgsqjgsrXgsrDgsr8nLCAn4LKr4LOG4LKs4LON4LKw4LK14LKw4LK/JywgJ+CyruCyvuCysOCzjeCymuCzjScsICfgso/gsqrgs43gsrDgsr/gsrLgs40nLCAn4LKu4LOHJywgJ+CynOCzguCyqOCzjScsICfgspzgs4HgsrLgs4gnLCAn4LKG4LKX4LK44LON4LKf4LONJywgJ+CyuOCzhuCyquCzjeCyn+CzhuCyguCyrOCysOCzjScsICfgsoXgspXgs43gsp/gs4vgsqzgsrDgs40nLCAn4LKo4LK14LOG4LKC4LKs4LKw4LONJyxcbiAgICAgICfgsqHgsr/gsrjgs4bgsoLgsqzgsrDgs40nXG4gICAgXVxuICBdLFxuICBbXG4gICAgWyfgspwnLCAn4LKr4LOGJywgJ+CyruCyvicsICfgso8nLCAn4LKu4LOHJywgJ+CynOCzgicsICfgspzgs4EnLCAn4LKGJywgJ+CyuOCzhicsICfgsoUnLCAn4LKoJywgJ+CyoeCyvyddLFxuICAgIFsn4LKc4LKoJywgJ+Cyq+CzhuCyrOCzjeCysCcsICfgsq7gsr7gsrDgs43gsprgs40nLCAn4LKP4LKq4LON4LKw4LK/JywgJ+CyruCzhycsICfgspzgs4Lgsqjgs40nLCAn4LKc4LOB4LKy4LOIJywgJ+CyhuCylycsICfgsrjgs4bgsqrgs43gsp/gs4bgsoInLCAn4LKF4LKV4LON4LKf4LOLJywgJ+CyqOCyteCzhuCygicsICfgsqHgsr/gsrjgs4bgsoInXSxcbiAgICBbXG4gICAgICAn4LKc4LKo4LK14LKw4LK/JywgJ+Cyq+CzhuCyrOCzjeCysOCyteCysOCyvycsICfgsq7gsr7gsrDgs43gsprgs40nLCAn4LKP4LKq4LON4LKw4LK/4LKy4LONJywgJ+CyruCzhycsICfgspzgs4Lgsqjgs40nLCAn4LKc4LOB4LKy4LOIJywgJ+CyhuCyl+CyuOCzjeCyn+CzjScsICfgsrjgs4bgsqrgs43gsp/gs4bgsoLgsqzgsrDgs40nLCAn4LKF4LKV4LON4LKf4LOL4LKs4LKw4LONJywgJ+CyqOCyteCzhuCyguCyrOCysOCzjScsXG4gICAgICAn4LKh4LK/4LK44LOG4LKC4LKs4LKw4LONJ1xuICAgIF1cbiAgXSxcbiAgW1sn4LKV4LON4LKw4LK/LuCyquCzgicsICfgspXgs43gsrDgsr8u4LK2J10sIHUsIFsn4LKV4LON4LKw4LK/4LK44LON4LKkIOCyquCzguCysOCzjeCytScsICfgspXgs43gsrDgsr/gsrjgs43gsqQg4LK24LKVJ11dLFxuICAwLFxuICBbMCwgMF0sXG4gIFsnZC9NL3l5JywgJ01NTSBkLCB5JywgJ01NTU0gZCwgeScsICdFRUVFLCBNTU1NIGQsIHknXSxcbiAgWydoaDptbSBhJywgJ2hoOm1tOnNzIGEnLCAnaGg6bW06c3MgYSB6JywgJ2hoOm1tOnNzIGEgenp6eiddLFxuICBbJ3sxfSB7MH0nLCB1LCB1LCB1XSxcbiAgWycuJywgJywnLCAnOycsICclJywgJysnLCAnLScsICdFJywgJ8OXJywgJ+KAsCcsICfiiJ4nLCAnTmFOJywgJzonXSxcbiAgWycjLCMjMC4jIyMnLCAnIywjIzAlJywgJ8KkIywjIzAuMDAnLCAnI0UwJ10sXG4gICdJTlInLFxuICAn4oK5JyxcbiAgJ+CyreCyvuCysOCypOCzgOCyryDgsrDgs4Lgsqrgsr7gsq/gsr8nLFxuICB7J0pQWSc6IFsnSlDCpScsICfCpSddLCAnUk9OJzogW3UsICfgsrLgs4AnXSwgJ1RIQic6IFsn4Li/J10sICdUV0QnOiBbJ05UJCddfSxcbiAgJ2x0cicsXG4gIHBsdXJhbFxuXTtcbiJdfQ==
+
+/***/ }),
+
+/***/ "./node_modules/@angular/common/locales/ko.js":
+/*!****************************************************!*\
+ !*** ./node_modules/@angular/common/locales/ko.js ***!
+ \****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+(function (factory) {
+ if ( true && typeof module.exports === "object") {
+ var v = factory(null, exports);
+ if (v !== undefined) module.exports = v;
+ }
+ else if (true) {
+ !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),
+ __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
+ (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),
+ __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+ }
+})(function (require, exports) {
+ "use strict";
+ Object.defineProperty(exports, "__esModule", { value: true });
+ // THIS CODE IS GENERATED - DO NOT MODIFY
+ // See angular/tools/gulp-tasks/cldr/extract.js
+ var u = undefined;
+ function plural(n) {
+ return 5;
+ }
+ exports.default = [
+ 'ko',
+ [['AM', 'PM'], u, ['오전', '오후']],
+ u,
+ [
+ ['일', '월', '화', '수', '목', '금', '토'], u,
+ ['일요일', '월요일', '화요일', '수요일', '목요일', '금요일', '토요일'],
+ ['일', '월', '화', '수', '목', '금', '토']
+ ],
+ u,
+ [['1월', '2월', '3월', '4월', '5월', '6월', '7월', '8월', '9월', '10월', '11월', '12월'], u, u],
+ u,
+ [['BC', 'AD'], u, ['기원전', '서기']],
+ 0,
+ [6, 0],
+ ['yy. M. d.', 'y. M. d.', 'y년 M월 d일', 'y년 M월 d일 EEEE'],
+ ['a h:mm', 'a h:mm:ss', 'a h시 m분 s초 z', 'a h시 m분 s초 zzzz'],
+ ['{1} {0}', u, u, u],
+ ['.', ',', ';', '%', '+', '-', 'E', '×', '‰', '∞', 'NaN', ':'],
+ ['#,##0.###', '#,##0%', '¤#,##0.00', '#E0'],
+ 'KRW',
+ '₩',
+ '대한민국 원',
+ { 'AUD': ['AU$', '$'], 'JPY': ['JP¥', '¥'], 'RON': [u, 'L'], 'TWD': ['NT$'], 'USD': ['US$', '$'] },
+ 'ltr',
+ plural
+ ];
+});
+//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia28uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21tb24vbG9jYWxlcy9rby50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7Ozs7Ozs7Ozs7OztJQUVILHlDQUF5QztJQUN6QywrQ0FBK0M7SUFFL0MsSUFBTSxDQUFDLEdBQUcsU0FBUyxDQUFDO0lBRXBCLFNBQVMsTUFBTSxDQUFDLENBQVM7UUFDdkIsT0FBTyxDQUFDLENBQUM7SUFDWCxDQUFDO0lBRUQsa0JBQWU7UUFDYixJQUFJO1FBQ0osQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDL0IsQ0FBQztRQUNEO1lBQ0UsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3RDLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDO1lBQ2pELENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDO1NBQ3BDO1FBQ0QsQ0FBQztRQUNELENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDbkYsQ0FBQztRQUNELENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ2hDLENBQUM7UUFDRCxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDTixDQUFDLFdBQVcsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLGVBQWUsQ0FBQztRQUN0RCxDQUFDLFFBQVEsRUFBRSxXQUFXLEVBQUUsY0FBYyxFQUFFLGlCQUFpQixDQUFDO1FBQzFELENBQUMsU0FBUyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3BCLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUM7UUFDOUQsQ0FBQyxXQUFXLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxLQUFLLENBQUM7UUFDM0MsS0FBSztRQUNMLEdBQUc7UUFDSCxRQUFRO1FBQ1IsRUFBQyxLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLEVBQUM7UUFDaEcsS0FBSztRQUNMLE1BQU07S0FDUCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbi8vIFRISVMgQ09ERSBJUyBHRU5FUkFURUQgLSBETyBOT1QgTU9ESUZZXG4vLyBTZWUgYW5ndWxhci90b29scy9ndWxwLXRhc2tzL2NsZHIvZXh0cmFjdC5qc1xuXG5jb25zdCB1ID0gdW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBwbHVyYWwobjogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuIDU7XG59XG5cbmV4cG9ydCBkZWZhdWx0IFtcbiAgJ2tvJyxcbiAgW1snQU0nLCAnUE0nXSwgdSwgWyfsmKTsoIQnLCAn7Jik7ZuEJ11dLFxuICB1LFxuICBbXG4gICAgWyfsnbwnLCAn7JuUJywgJ+2ZlCcsICfsiJgnLCAn66qpJywgJ+q4iCcsICfthqAnXSwgdSxcbiAgICBbJ+ydvOyalOydvCcsICfsm5TsmpTsnbwnLCAn7ZmU7JqU7J28JywgJ+yImOyalOydvCcsICfrqqnsmpTsnbwnLCAn6riI7JqU7J28JywgJ+2GoOyalOydvCddLFxuICAgIFsn7J28JywgJ+yblCcsICftmZQnLCAn7IiYJywgJ+uqqScsICfquIgnLCAn7YagJ11cbiAgXSxcbiAgdSxcbiAgW1snMeyblCcsICcy7JuUJywgJzPsm5QnLCAnNOyblCcsICc17JuUJywgJzbsm5QnLCAnN+yblCcsICc47JuUJywgJznsm5QnLCAnMTDsm5QnLCAnMTHsm5QnLCAnMTLsm5QnXSwgdSwgdV0sXG4gIHUsXG4gIFtbJ0JDJywgJ0FEJ10sIHUsIFsn6riw7JuQ7KCEJywgJ+yEnOq4sCddXSxcbiAgMCxcbiAgWzYsIDBdLFxuICBbJ3l5LiBNLiBkLicsICd5LiBNLiBkLicsICd564WEIE3sm5QgZOydvCcsICd564WEIE3sm5QgZOydvCBFRUVFJ10sXG4gIFsnYSBoOm1tJywgJ2EgaDptbTpzcycsICdhIGjsi5wgbeu2hCBz7LSIIHonLCAnYSBo7IucIG3rtoQgc+y0iCB6enp6J10sXG4gIFsnezF9IHswfScsIHUsIHUsIHVdLFxuICBbJy4nLCAnLCcsICc7JywgJyUnLCAnKycsICctJywgJ0UnLCAnw5cnLCAn4oCwJywgJ+KInicsICdOYU4nLCAnOiddLFxuICBbJyMsIyMwLiMjIycsICcjLCMjMCUnLCAnwqQjLCMjMC4wMCcsICcjRTAnXSxcbiAgJ0tSVycsXG4gICfigqknLFxuICAn64yA7ZWc66+86rWtIOybkCcsXG4gIHsnQVVEJzogWydBVSQnLCAnJCddLCAnSlBZJzogWydKUMKlJywgJ8KlJ10sICdST04nOiBbdSwgJ0wnXSwgJ1RXRCc6IFsnTlQkJ10sICdVU0QnOiBbJ1VTJCcsICckJ119LFxuICAnbHRyJyxcbiAgcGx1cmFsXG5dO1xuIl19
+
+/***/ }),
+
+/***/ "./node_modules/@angular/common/locales/lv.js":
+/*!****************************************************!*\
+ !*** ./node_modules/@angular/common/locales/lv.js ***!
+ \****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+(function (factory) {
+ if ( true && typeof module.exports === "object") {
+ var v = factory(null, exports);
+ if (v !== undefined) module.exports = v;
+ }
+ else if (true) {
+ !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),
+ __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
+ (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),
+ __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+ }
+})(function (require, exports) {
+ "use strict";
+ Object.defineProperty(exports, "__esModule", { value: true });
+ // THIS CODE IS GENERATED - DO NOT MODIFY
+ // See angular/tools/gulp-tasks/cldr/extract.js
+ var u = undefined;
+ function plural(n) {
+ var v = n.toString().replace(/^[^.]*\.?/, '').length, f = parseInt(n.toString().replace(/^[^.]*\.?/, ''), 10) || 0;
+ if (n % 10 === 0 || n % 100 === Math.floor(n % 100) && n % 100 >= 11 && n % 100 <= 19 ||
+ v === 2 && f % 100 === Math.floor(f % 100) && f % 100 >= 11 && f % 100 <= 19)
+ return 0;
+ if (n % 10 === 1 && !(n % 100 === 11) || v === 2 && f % 10 === 1 && !(f % 100 === 11) ||
+ !(v === 2) && f % 10 === 1)
+ return 1;
+ return 5;
+ }
+ exports.default = [
+ 'lv',
+ [['priekšp.', 'pēcp.'], u, ['priekšpusdienā', 'pēcpusdienā']],
+ [['priekšp.', 'pēcpusd.'], u, ['priekšpusdiena', 'pēcpusdiena']],
+ [
+ ['S', 'P', 'O', 'T', 'C', 'P', 'S'],
+ ['svētd.', 'pirmd.', 'otrd.', 'trešd.', 'ceturtd.', 'piektd.', 'sestd.'],
+ ['svētdiena', 'pirmdiena', 'otrdiena', 'trešdiena', 'ceturtdiena', 'piektdiena', 'sestdiena'],
+ ['Sv', 'Pr', 'Ot', 'Tr', 'Ce', 'Pk', 'Se']
+ ],
+ [
+ ['S', 'P', 'O', 'T', 'C', 'P', 'S'],
+ ['Svētd.', 'Pirmd.', 'Otrd.', 'Trešd.', 'Ceturtd.', 'Piektd.', 'Sestd.'],
+ ['Svētdiena', 'Pirmdiena', 'Otrdiena', 'Trešdiena', 'Ceturtdiena', 'Piektdiena', 'Sestdiena'],
+ ['Sv', 'Pr', 'Ot', 'Tr', 'Ce', 'Pk', 'Se']
+ ],
+ [
+ ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],
+ [
+ 'janv.', 'febr.', 'marts', 'apr.', 'maijs', 'jūn.', 'jūl.', 'aug.', 'sept.', 'okt.', 'nov.',
+ 'dec.'
+ ],
+ [
+ 'janvāris', 'februāris', 'marts', 'aprīlis', 'maijs', 'jūnijs', 'jūlijs', 'augusts',
+ 'septembris', 'oktobris', 'novembris', 'decembris'
+ ]
+ ],
+ u,
+ [['p.m.ē.', 'm.ē.'], u, ['pirms mūsu ēras', 'mūsu ērā']],
+ 1,
+ [6, 0],
+ ['dd.MM.yy', 'y. \'gada\' d. MMM', 'y. \'gada\' d. MMMM', 'EEEE, y. \'gada\' d. MMMM'],
+ ['HH:mm', 'HH:mm:ss', 'HH:mm:ss z', 'HH:mm:ss zzzz'],
+ ['{1} {0}', u, u, u],
+ [',', ' ', ';', '%', '+', '-', 'E', '×', '‰', '∞', 'NS', ':'],
+ ['#,##0.###', '#,##0%', '#,##0.00 ¤', '#E0'],
+ 'EUR',
+ '€',
+ 'eiro',
+ { 'AUD': ['AU$', '$'], 'LVL': ['Ls'], 'THB': ['฿'], 'TWD': ['NT$'] },
+ 'ltr',
+ plural
+ ];
+});
+//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibHYuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21tb24vbG9jYWxlcy9sdi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7Ozs7Ozs7Ozs7OztJQUVILHlDQUF5QztJQUN6QywrQ0FBK0M7SUFFL0MsSUFBTSxDQUFDLEdBQUcsU0FBUyxDQUFDO0lBRXBCLFNBQVMsTUFBTSxDQUFDLENBQVM7UUFDdkIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUNoRCxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNqRSxJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxFQUFFLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxFQUFFO1lBQ2pGLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsS0FBSyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLEVBQUUsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLEVBQUU7WUFDOUUsT0FBTyxDQUFDLENBQUM7UUFDWCxJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FB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QUFHLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLENBQUM7UUFDN0QsQ0FBQyxXQUFXLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxLQUFLLENBQUM7UUFDNUMsS0FBSztRQUNMLEdBQUc7UUFDSCxNQUFNO1FBQ04sRUFBQyxLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUM7UUFDbEUsS0FBSztRQUNMLE1BQU07S0FDUCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbi8vIFRISVMgQ09ERSBJUyBHRU5FUkFURUQgLSBETyBOT1QgTU9ESUZZXG4vLyBTZWUgYW5ndWxhci90b29scy9ndWxwLXRhc2tzL2NsZHIvZXh0cmFjdC5qc1xuXG5jb25zdCB1ID0gdW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBwbHVyYWwobjogbnVtYmVyKTogbnVtYmVyIHtcbiAgbGV0IHYgPSBuLnRvU3RyaW5nKCkucmVwbGFjZSgvXlteLl0qXFwuPy8sICcnKS5sZW5ndGgsXG4gICAgICBmID0gcGFyc2VJbnQobi50b1N0cmluZygpLnJlcGxhY2UoL15bXi5dKlxcLj8vLCAnJyksIDEwKSB8fCAwO1xuICBpZiAobiAlIDEwID09PSAwIHx8IG4gJSAxMDAgPT09IE1hdGguZmxvb3IobiAlIDEwMCkgJiYgbiAlIDEwMCA+PSAxMSAmJiBuICUgMTAwIDw9IDE5IHx8XG4gICAgICB2ID09PSAyICYmIGYgJSAxMDAgPT09IE1hdGguZmxvb3IoZiAlIDEwMCkgJiYgZiAlIDEwMCA+PSAxMSAmJiBmICUgMTAwIDw9IDE5KVxuICAgIHJldHVybiAwO1xuICBpZiAobiAlIDEwID09PSAxICYmICEobiAlIDEwMCA9PT0gMTEpIHx8IHYgPT09IDIgJiYgZiAlIDEwID09PSAxICYmICEoZiAlIDEwMCA9PT0gMTEpIHx8XG4gICAgICAhKHYgPT09IDIpICYmIGYgJSAxMCA9PT0gMSlcbiAgICByZXR1cm4gMTtcbiAgcmV0dXJuIDU7XG59XG5cbmV4cG9ydCBkZWZhdWx0IFtcbiAgJ2x2JyxcbiAgW1sncHJpZWvFoXAuJywgJ3DEk2NwLiddLCB1LCBbJ3ByaWVrxaFwdXNkaWVuxIEnLCAncMSTY3B1c2RpZW7EgSddXSxcbiAgW1sncHJpZWvFoXAuJywgJ3DEk2NwdXNkLiddLCB1LCBbJ3ByaWVrxaFwdXNkaWVuYScsICdwxJNjcHVzZGllbmEnXV0sXG4gIFtcbiAgICBbJ1MnLCAnUCcsICdPJywgJ1QnLCAnQycsICdQJywgJ1MnXSxcbiAgICBbJ3N2xJN0ZC4nLCAncGlybWQuJywgJ290cmQuJywgJ3RyZcWhZC4nLCAnY2V0dXJ0ZC4nLCAncGlla3RkLicsICdzZXN0ZC4nXSxcbiAgICBbJ3N2xJN0ZGllbmEnLCAncGlybWRpZW5hJywgJ290cmRpZW5hJywgJ3RyZcWhZGllbmEnLCAnY2V0dXJ0ZGllbmEnLCAncGlla3RkaWVuYScsICdzZXN0ZGllbmEnXSxcbiAgICBbJ1N2JywgJ1ByJywgJ090JywgJ1RyJywgJ0NlJywgJ1BrJywgJ1NlJ11cbiAgXSxcbiAgW1xuICAgIFsnUycsICdQJywgJ08nLCAnVCcsICdDJywgJ1AnLCAnUyddLFxuICAgIFsnU3bEk3RkLicsICdQaXJtZC4nLCAnT3RyZC4nLCAnVHJlxaFkLicsICdDZXR1cnRkLicsICdQaWVrdGQuJywgJ1Nlc3RkLiddLFxuICAgIFsnU3bEk3RkaWVuYScsICdQaXJtZGllbmEnLCAnT3RyZGllbmEnLCAnVHJlxaFkaWVuYScsICdDZXR1cnRkaWVuYScsICdQaWVrdGRpZW5hJywgJ1Nlc3RkaWVuYSddLFxuICAgIFsnU3YnLCAnUHInLCAnT3QnLCAnVHInLCAnQ2UnLCAnUGsnLCAnU2UnXVxuICBdLFxuICBbXG4gICAgWydKJywgJ0YnLCAnTScsICdBJywgJ00nLCAnSicsICdKJywgJ0EnLCAnUycsICdPJywgJ04nLCAnRCddLFxuICAgIFtcbiAgICAgICdqYW52LicsICdmZWJyLicsICdtYXJ0cycsICdhcHIuJywgJ21haWpzJywgJ2rFq24uJywgJ2rFq2wuJywgJ2F1Zy4nLCAnc2VwdC4nLCAnb2t0LicsICdub3YuJyxcbiAgICAgICdkZWMuJ1xuICAgIF0sXG4gICAgW1xuICAgICAgJ2phbnbEgXJpcycsICdmZWJydcSBcmlzJywgJ21hcnRzJywgJ2FwcsSrbGlzJywgJ21haWpzJywgJ2rFq25panMnLCAnasWrbGlqcycsICdhdWd1c3RzJyxcbiAgICAgICdzZXB0ZW1icmlzJywgJ29rdG9icmlzJywgJ25vdmVtYnJpcycsICdkZWNlbWJyaXMnXG4gICAgXVxuICBdLFxuICB1LFxuICBbWydwLm0uxJMuJywgJ20uxJMuJ10sIHUsIFsncGlybXMgbcWrc3UgxJNyYXMnLCAnbcWrc3UgxJNyxIEnXV0sXG4gIDEsXG4gIFs2LCAwXSxcbiAgWydkZC5NTS55eScsICd5LiBcXCdnYWRhXFwnIGQuIE1NTScsICd5LiBcXCdnYWRhXFwnIGQuIE1NTU0nLCAnRUVFRSwgeS4gXFwnZ2FkYVxcJyBkLiBNTU1NJ10sXG4gIFsnSEg6bW0nLCAnSEg6bW06c3MnLCAnSEg6bW06c3MgeicsICdISDptbTpzcyB6enp6J10sXG4gIFsnezF9IHswfScsIHUsIHUsIHVdLFxuICBbJywnLCAnwqAnLCAnOycsICclJywgJysnLCAnLScsICdFJywgJ8OXJywgJ+KAsCcsICfiiJ4nLCAnTlMnLCAnOiddLFxuICBbJyMsIyMwLiMjIycsICcjLCMjMCUnLCAnIywjIzAuMDDCoMKkJywgJyNFMCddLFxuICAnRVVSJyxcbiAgJ+KCrCcsXG4gICdlaXJvJyxcbiAgeydBVUQnOiBbJ0FVJCcsICckJ10sICdMVkwnOiBbJ0xzJ10sICdUSEInOiBbJ+C4vyddLCAnVFdEJzogWydOVCQnXX0sXG4gICdsdHInLFxuICBwbHVyYWxcbl07XG4iXX0=
+
+/***/ }),
+
+/***/ "./node_modules/@angular/common/locales/ml.js":
+/*!****************************************************!*\
+ !*** ./node_modules/@angular/common/locales/ml.js ***!
+ \****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+(function (factory) {
+ if ( true && typeof module.exports === "object") {
+ var v = factory(null, exports);
+ if (v !== undefined) module.exports = v;
+ }
+ else if (true) {
+ !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),
+ __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
+ (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),
+ __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+ }
+})(function (require, exports) {
+ "use strict";
+ Object.defineProperty(exports, "__esModule", { value: true });
+ // THIS CODE IS GENERATED - DO NOT MODIFY
+ // See angular/tools/gulp-tasks/cldr/extract.js
+ var u = undefined;
+ function plural(n) {
+ if (n === 1)
+ return 1;
+ return 5;
+ }
+ exports.default = [
+ 'ml',
+ [['AM', 'PM'], u, u],
+ u,
+ [
+ ['ഞ', 'തി', 'ചൊ', 'ബു', 'വ്യാ', 'വെ', 'ശ'],
+ ['ഞായർ', 'തിങ്കൾ', 'ചൊവ്വ', 'ബുധൻ', 'വ്യാഴം', 'വെള്ളി', 'ശനി'],
+ [
+ 'ഞായറാഴ്\u200cച', 'തിങ്കളാഴ്\u200cച', 'ചൊവ്വാഴ്ച', 'ബുധനാഴ്\u200cച', 'വ്യാഴാഴ്\u200cച',
+ 'വെള്ളിയാഴ്\u200cച', 'ശനിയാഴ്\u200cച'
+ ],
+ ['ഞാ', 'തി', 'ചൊ', 'ബു', 'വ്യാ', 'വെ', 'ശ']
+ ],
+ [
+ ['ഞാ', 'തി', 'ചൊ', 'ബു', 'വ്യാ', 'വെ', 'ശ'],
+ ['ഞായർ', 'തിങ്കൾ', 'ചൊവ്വ', 'ബുധൻ', 'വ്യാഴം', 'വെള്ളി', 'ശനി'],
+ [
+ 'ഞായറാഴ്\u200cച', 'തിങ്കളാഴ്\u200cച', 'ചൊവ്വാഴ്\u200cച', 'ബുധനാഴ്\u200cച', 'വ്യാഴാഴ്\u200cച',
+ 'വെള്ളിയാഴ്\u200cച', 'ശനിയാഴ്\u200cച'
+ ],
+ ['ഞാ', 'തി', 'ചൊ', 'ബു', 'വ്യാ', 'വെ', 'ശ']
+ ],
+ [
+ ['ജ', 'ഫെ', 'മാ', 'ഏ', 'മെ', 'ജൂൺ', 'ജൂ', 'ഓ', 'സെ', 'ഒ', 'ന', 'ഡി'],
+ ['ജനു', 'ഫെബ്രു', 'മാർ', 'ഏപ്രി', 'മേയ്', 'ജൂൺ', 'ജൂലൈ', 'ഓഗ', 'സെപ്റ്റം', 'ഒക്ടോ', 'നവം', 'ഡിസം'],
+ [
+ 'ജനുവരി', 'ഫെബ്രുവരി', 'മാർച്ച്', 'ഏപ്രിൽ', 'മേയ്', 'ജൂൺ', 'ജൂലൈ', 'ഓഗസ്റ്റ്', 'സെപ്റ്റംബർ', 'ഒക്\u200cടോബർ',
+ 'നവംബർ', 'ഡിസംബർ'
+ ]
+ ],
+ u,
+ [['ക്രി.മു.', 'എഡി'], u, ['ക്രിസ്\u200cതുവിന് മുമ്പ്', 'ആന്നോ ഡൊമിനി']],
+ 0,
+ [0, 0],
+ ['d/M/yy', 'y, MMM d', 'y, MMMM d', 'y, MMMM d, EEEE'],
+ ['h:mm a', 'h:mm:ss a', 'h:mm:ss a z', 'h:mm:ss a zzzz'],
+ ['{1} {0}', u, u, u],
+ ['.', ',', ';', '%', '+', '-', 'E', '×', '‰', '∞', 'NaN', ':'],
+ ['#,##,##0.###', '#,##0%', '¤#,##0.00', '#E0'],
+ 'INR',
+ '₹',
+ 'ഇന്ത്യൻ രൂപ',
+ { 'THB': ['฿'], 'TWD': ['NT$'] },
+ 'ltr',
+ plural
+ ];
+});
+//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21tb24vbG9jYWxlcy9tbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7Ozs7Ozs7Ozs7OztJQUVILHlDQUF5QztJQUN6QywrQ0FBK0M7SUFFL0MsSUFBTSxDQUFDLEdBQUcsU0FBUyxDQUFDO0lBRXBCLFNBQVMsTUFBTSxDQUFDLENBQVM7UUFDdkIsSUFBSSxDQUFDLEtBQUssQ0FBQztZQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3RCLE9BQU8sQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUVELGtCQUFlO1FBQ2IsSUFBSTtRQUNKLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNwQixDQUFDO1FBQ0Q7WUFDRSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQztZQUMxQyxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLEtBQUssQ0FBQztZQUM5RDtnQkFDRSxnQkFBZ0IsRUFBRSxrQkFBa0IsRUFBRSxXQUFXLEVBQUUsZ0JBQWdCLEVBQUUsaUJBQWlCO2dCQUN0RixtQkFBbUIsRUFBRSxnQkFBZ0I7YUFDdEM7WUFDRCxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQztTQUM1QztRQUNEO1lBQ0UsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLENBQUM7WUFDM0MsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxLQUFLLENBQUM7WUFDOUQ7Z0JBQ0UsZ0JBQWdCLEVBQUUsa0JBQWtCLEVBQUUsaUJBQWlCLEVBQUUsZ0JBQWdCLEVBQUUsaUJBQWlCO2dCQUM1RixtQkFBbUIsRUFBRSxnQkFBZ0I7YUFDdEM7WUFDRCxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQztTQUM1QztRQUNEO1lBQ0UsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQztZQUNwRSxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDO1lBQ2xHO2dCQUNFLFFBQVEsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLGVBQWU7Z0JBQzVHLE9BQU8sRUFBRSxRQUFRO2FBQ2xCO1NBQ0Y7UUFDRCxDQUFDO1FBQ0QsQ0FBQyxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQywyQkFBMkIsRUFBRSxjQUFjLENBQUMsQ0FBQztRQUN2RSxDQUFDO1FBQ0QsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ04sQ0FBQyxRQUFRLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxpQkFBaUIsQ0FBQztRQUN0RCxDQUFDLFFBQVEsRUFBRSxXQUFXLEVBQUUsYUFBYSxFQUFFLGdCQUFnQixDQUFDO1FBQ3hELENBQUMsU0FBUyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3BCLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUM7UUFDOUQsQ0FBQyxjQUFjLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxLQUFLLENBQUM7UUFDOUMsS0FBSztRQUNMLEdBQUc7UUFDSCxhQUFhO1FBQ2IsRUFBQyxLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBQztRQUM5QixLQUFLO1FBQ0wsTUFBTTtLQUNQLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuLy8gVEhJUyBDT0RFIElTIEdFTkVSQVRFRCAtIERPIE5PVCBNT0RJRllcbi8vIFNlZSBhbmd1bGFyL3Rvb2xzL2d1bHAtdGFza3MvY2xkci9leHRyYWN0LmpzXG5cbmNvbnN0IHUgPSB1bmRlZmluZWQ7XG5cbmZ1bmN0aW9uIHBsdXJhbChuOiBudW1iZXIpOiBudW1iZXIge1xuICBpZiAobiA9PT0gMSkgcmV0dXJuIDE7XG4gIHJldHVybiA1O1xufVxuXG5leHBvcnQgZGVmYXVsdCBbXG4gICdtbCcsXG4gIFtbJ0FNJywgJ1BNJ10sIHUsIHVdLFxuICB1LFxuICBbXG4gICAgWyfgtJ4nLCAn4LSk4LS/JywgJ+C0muC1iicsICfgtKzgtYEnLCAn4LS14LWN4LSv4LS+JywgJ+C0teC1hicsICfgtLYnXSxcbiAgICBbJ+C0nuC0vuC0r+C1vCcsICfgtKTgtL/gtJngtY3gtJXgtb4nLCAn4LSa4LWK4LS14LWN4LS1JywgJ+C0rOC1geC0p+C1uycsICfgtLXgtY3gtK/gtL7gtLTgtIInLCAn4LS14LWG4LSz4LWN4LSz4LS/JywgJ+C0tuC0qOC0vyddLFxuICAgIFtcbiAgICAgICfgtJ7gtL7gtK/gtLHgtL7gtLTgtY1cXHUyMDBj4LSaJywgJ+C0pOC0v+C0meC1jeC0leC0s+C0vuC0tOC1jVxcdTIwMGPgtJonLCAn4LSa4LWK4LS14LWN4LS14LS+4LS04LWN4LSaJywgJ+C0rOC1geC0p+C0qOC0vuC0tOC1jVxcdTIwMGPgtJonLCAn4LS14LWN4LSv4LS+4LS04LS+4LS04LWNXFx1MjAwY+C0micsXG4gICAgICAn4LS14LWG4LSz4LWN4LSz4LS/4LSv4LS+4LS04LWNXFx1MjAwY+C0micsICfgtLbgtKjgtL/gtK/gtL7gtLTgtY1cXHUyMDBj4LSaJ1xuICAgIF0sXG4gICAgWyfgtJ7gtL4nLCAn4LSk4LS/JywgJ+C0muC1iicsICfgtKzgtYEnLCAn4LS14LWN4LSv4LS+JywgJ+C0teC1hicsICfgtLYnXVxuICBdLFxuICBbXG4gICAgWyfgtJ7gtL4nLCAn4LSk4LS/JywgJ+C0muC1iicsICfgtKzgtYEnLCAn4LS14LWN4LSv4LS+JywgJ+C0teC1hicsICfgtLYnXSxcbiAgICBbJ+C0nuC0vuC0r+C1vCcsICfgtKTgtL/gtJngtY3gtJXgtb4nLCAn4LSa4LWK4LS14LWN4LS1JywgJ+C0rOC1geC0p+C1uycsICfgtLXgtY3gtK/gtL7gtLTgtIInLCAn4LS14LWG4LSz4LWN4LSz4LS/JywgJ+C0tuC0qOC0vyddLFxuICAgIFtcbiAgICAgICfgtJ7gtL7gtK/gtLHgtL7gtLTgtY1cXHUyMDBj4LSaJywgJ+C0pOC0v+C0meC1jeC0leC0s+C0vuC0tOC1jVxcdTIwMGPgtJonLCAn4LSa4LWK4LS14LWN4LS14LS+4LS04LWNXFx1MjAwY+C0micsICfgtKzgtYHgtKfgtKjgtL7gtLTgtY1cXHUyMDBj4LSaJywgJ+C0teC1jeC0r+C0vuC0tOC0vuC0tOC1jVxcdTIwMGPgtJonLFxuICAgICAgJ+C0teC1huC0s+C1jeC0s+C0v+C0r+C0vuC0tOC1jVxcdTIwMGPgtJonLCAn4LS24LSo4LS/4LSv4LS+4LS04LWNXFx1MjAwY+C0midcbiAgICBdLFxuICAgIFsn4LSe4LS+JywgJ+C0pOC0vycsICfgtJrgtYonLCAn4LSs4LWBJywgJ+C0teC1jeC0r+C0vicsICfgtLXgtYYnLCAn4LS2J11cbiAgXSxcbiAgW1xuICAgIFsn4LScJywgJ+C0q+C1hicsICfgtK7gtL4nLCAn4LSPJywgJ+C0ruC1hicsICfgtJzgtYLgtbonLCAn4LSc4LWCJywgJ+C0kycsICfgtLjgtYYnLCAn4LSSJywgJ+C0qCcsICfgtKHgtL8nXSxcbiAgICBbJ+C0nOC0qOC1gScsICfgtKvgtYbgtKzgtY3gtLDgtYEnLCAn4LSu4LS+4LW8JywgJ+C0j+C0quC1jeC0sOC0vycsICfgtK7gtYfgtK/gtY0nLCAn4LSc4LWC4LW6JywgJ+C0nOC1guC0suC1iCcsICfgtJPgtJcnLCAn4LS44LWG4LSq4LWN4LSx4LWN4LSx4LSCJywgJ+C0kuC0leC1jeC0n+C1iycsICfgtKjgtLXgtIInLCAn4LSh4LS/4LS44LSCJ10sXG4gICAgW1xuICAgICAgJ+C0nOC0qOC1geC0teC0sOC0vycsICfgtKvgtYbgtKzgtY3gtLDgtYHgtLXgtLDgtL8nLCAn4LSu4LS+4LW84LSa4LWN4LSa4LWNJywgJ+C0j+C0quC1jeC0sOC0v+C1vScsICfgtK7gtYfgtK/gtY0nLCAn4LSc4LWC4LW6JywgJ+C0nOC1guC0suC1iCcsICfgtJPgtJfgtLjgtY3gtLHgtY3gtLHgtY0nLCAn4LS44LWG4LSq4LWN4LSx4LWN4LSx4LSC4LSs4LW8JywgJ+C0kuC0leC1jVxcdTIwMGPgtJ/gtYvgtKzgtbwnLFxuICAgICAgJ+C0qOC0teC0guC0rOC1vCcsICfgtKHgtL/gtLjgtILgtKzgtbwnXG4gICAgXVxuICBdLFxuICB1LFxuICBbWyfgtJXgtY3gtLDgtL8u4LSu4LWBLicsICfgtI7gtKHgtL8nXSwgdSwgWyfgtJXgtY3gtLDgtL/gtLjgtY1cXHUyMDBj4LSk4LWB4LS14LS/4LSo4LWNIOC0ruC1geC0ruC1jeC0quC1jScsICfgtIbgtKjgtY3gtKjgtYsg4LSh4LWK4LSu4LS/4LSo4LS/J11dLFxuICAwLFxuICBbMCwgMF0sXG4gIFsnZC9NL3l5JywgJ3ksIE1NTSBkJywgJ3ksIE1NTU0gZCcsICd5LCBNTU1NIGQsIEVFRUUnXSxcbiAgWydoOm1tIGEnLCAnaDptbTpzcyBhJywgJ2g6bW06c3MgYSB6JywgJ2g6bW06c3MgYSB6enp6J10sXG4gIFsnezF9IHswfScsIHUsIHUsIHVdLFxuICBbJy4nLCAnLCcsICc7JywgJyUnLCAnKycsICctJywgJ0UnLCAnw5cnLCAn4oCwJywgJ+KInicsICdOYU4nLCAnOiddLFxuICBbJyMsIyMsIyMwLiMjIycsICcjLCMjMCUnLCAnwqQjLCMjMC4wMCcsICcjRTAnXSxcbiAgJ0lOUicsXG4gICfigrknLFxuICAn4LSH4LSo4LWN4LSk4LWN4LSv4LW7IOC0sOC1guC0qicsXG4gIHsnVEhCJzogWyfguL8nXSwgJ1RXRCc6IFsnTlQkJ119LFxuICAnbHRyJyxcbiAgcGx1cmFsXG5dO1xuIl19
+
+/***/ }),
+
+/***/ "./node_modules/@angular/common/locales/nb.js":
+/*!****************************************************!*\
+ !*** ./node_modules/@angular/common/locales/nb.js ***!
+ \****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+(function (factory) {
+ if ( true && typeof module.exports === "object") {
+ var v = factory(null, exports);
+ if (v !== undefined) module.exports = v;
+ }
+ else if (true) {
+ !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),
+ __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
+ (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),
+ __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+ }
+})(function (require, exports) {
+ "use strict";
+ Object.defineProperty(exports, "__esModule", { value: true });
+ // THIS CODE IS GENERATED - DO NOT MODIFY
+ // See angular/tools/gulp-tasks/cldr/extract.js
+ var u = undefined;
+ function plural(n) {
+ if (n === 1)
+ return 1;
+ return 5;
+ }
+ exports.default = [
+ 'nb',
+ [['a', 'p'], ['a.m.', 'p.m.'], u],
+ [['a.m.', 'p.m.'], u, u],
+ [
+ ['S', 'M', 'T', 'O', 'T', 'F', 'L'], ['søn.', 'man.', 'tir.', 'ons.', 'tor.', 'fre.', 'lør.'],
+ ['søndag', 'mandag', 'tirsdag', 'onsdag', 'torsdag', 'fredag', 'lørdag'],
+ ['sø.', 'ma.', 'ti.', 'on.', 'to.', 'fr.', 'lø.']
+ ],
+ u,
+ [
+ ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],
+ ['jan.', 'feb.', 'mar.', 'apr.', 'mai', 'jun.', 'jul.', 'aug.', 'sep.', 'okt.', 'nov.', 'des.'],
+ [
+ 'januar', 'februar', 'mars', 'april', 'mai', 'juni', 'juli', 'august', 'september', 'oktober',
+ 'november', 'desember'
+ ]
+ ],
+ [
+ ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],
+ ['jan', 'feb', 'mar', 'apr', 'mai', 'jun', 'jul', 'aug', 'sep', 'okt', 'nov', 'des'],
+ [
+ 'januar', 'februar', 'mars', 'april', 'mai', 'juni', 'juli', 'august', 'september', 'oktober',
+ 'november', 'desember'
+ ]
+ ],
+ [['f.Kr.', 'e.Kr.'], u, ['før Kristus', 'etter Kristus']],
+ 1,
+ [6, 0],
+ ['dd.MM.y', 'd. MMM y', 'd. MMMM y', 'EEEE d. MMMM y'],
+ ['HH:mm', 'HH:mm:ss', 'HH:mm:ss z', 'HH:mm:ss zzzz'],
+ ['{1}, {0}', u, '{1} \'kl\'. {0}', '{1} {0}'],
+ [',', ' ', ';', '%', '+', '−', 'E', '×', '‰', '∞', 'NaN', ':'],
+ ['#,##0.###', '#,##0 %', '¤ #,##0.00', '#E0'],
+ 'NOK',
+ 'kr',
+ 'norske kroner',
+ {
+ 'AUD': [u, '$'],
+ 'BRL': [u, 'R$'],
+ 'CAD': [u, '$'],
+ 'CNY': [u, '¥'],
+ 'HKD': [u, '$'],
+ 'ILS': [u, '₪'],
+ 'INR': [u, '₹'],
+ 'JPY': [u, '¥'],
+ 'KRW': [u, '₩'],
+ 'MXN': [u, '$'],
+ 'NOK': ['kr'],
+ 'NZD': [u, '$'],
+ 'RON': [u, 'L'],
+ 'TWD': [u, 'NT$'],
+ 'USD': [u, '$'],
+ 'VND': [u, '₫'],
+ 'XAF': [],
+ 'XCD': [u, '$'],
+ 'XPF': [],
+ 'XXX': []
+ },
+ 'ltr',
+ plural
+ ];
+});
+//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21tb24vbG9jYWxlcy9uYi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7Ozs7Ozs7Ozs7OztJQUVILHlDQUF5QztJQUN6QywrQ0FBK0M7SUFFL0MsSUFBTSxDQUFDLEdBQUcsU0FBUyxDQUFDO0lBRXBCLFNBQVMsTUFBTSxDQUFDLENBQVM7UUFDdkIsSUFBSSxDQUFDLEtBQUssQ0FBQztZQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3RCLE9BQU8sQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUVELGtCQUFlO1FBQ2IsSUFBSTtRQUNKLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2pDLENBQUMsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN4QjtZQUNFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUM7WUFDN0YsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUM7WUFDeEUsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUM7U0FDbEQ7UUFDRCxDQUFDO1FBQ0Q7WUFDRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcs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QUFDLEVBQUUsR0FBRyxDQUFDO1lBQ2YsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQztZQUNmLEtBQUssRUFBRSxFQUFFO1lBQ1QsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQztZQUNmLEtBQUssRUFBRSxFQUFFO1lBQ1QsS0FBSyxFQUFFLEVBQUU7U0FDVjtRQUNELEtBQUs7UUFDTCxNQUFNO0tBQ1AsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuXG4vLyBUSElTIENPREUgSVMgR0VORVJBVEVEIC0gRE8gTk9UIE1PRElGWVxuLy8gU2VlIGFuZ3VsYXIvdG9vbHMvZ3VscC10YXNrcy9jbGRyL2V4dHJhY3QuanNcblxuY29uc3QgdSA9IHVuZGVmaW5lZDtcblxuZnVuY3Rpb24gcGx1cmFsKG46IG51bWJlcik6IG51bWJlciB7XG4gIGlmIChuID09PSAxKSByZXR1cm4gMTtcbiAgcmV0dXJuIDU7XG59XG5cbmV4cG9ydCBkZWZhdWx0IFtcbiAgJ25iJyxcbiAgW1snYScsICdwJ10sIFsnYS5tLicsICdwLm0uJ10sIHVdLFxuICBbWydhLm0uJywgJ3AubS4nXSwgdSwgdV0sXG4gIFtcbiAgICBbJ1MnLCAnTScsICdUJywgJ08nLCAnVCcsICdGJywgJ0wnXSwgWydzw7huLicsICdtYW4uJywgJ3Rpci4nLCAnb25zLicsICd0b3IuJywgJ2ZyZS4nLCAnbMO4ci4nXSxcbiAgICBbJ3PDuG5kYWcnLCAnbWFuZGFnJywgJ3RpcnNkYWcnLCAnb25zZGFnJywgJ3RvcnNkYWcnLCAnZnJlZGFnJywgJ2zDuHJkYWcnXSxcbiAgICBbJ3PDuC4nLCAnbWEuJywgJ3RpLicsICdvbi4nLCAndG8uJywgJ2ZyLicsICdsw7guJ11cbiAgXSxcbiAgdSxcbiAgW1xuICAgIFsnSicsICdGJywgJ00nLCAnQScsICdNJywgJ0onLCAnSicsICdBJywgJ1MnLCAnTycsICdOJywgJ0QnXSxcbiAgICBbJ2phbi4nLCAnZmViLicsICdtYXIuJywgJ2Fwci4nLCAnbWFpJywgJ2p1bi4nLCAnanVsLicsICdhdWcuJywgJ3NlcC4nLCAnb2t0LicsICdub3YuJywgJ2Rlcy4nXSxcbiAgICBbXG4gICAgICAnamFudWFyJywgJ2ZlYnJ1YXInLCAnbWFycycsICdhcHJpbCcsICdtYWknLCAnanVuaScsICdqdWxpJywgJ2F1Z3VzdCcsICdzZXB0ZW1iZXInLCAnb2t0b2JlcicsXG4gICAgICAnbm92ZW1iZXInLCAnZGVzZW1iZXInXG4gICAgXVxuICBdLFxuICBbXG4gICAgWydKJywgJ0YnLCAnTScsICdBJywgJ00nLCAnSicsICdKJywgJ0EnLCAnUycsICdPJywgJ04nLCAnRCddLFxuICAgIFsnamFuJywgJ2ZlYicsICdtYXInLCAnYXByJywgJ21haScsICdqdW4nLCAnanVsJywgJ2F1ZycsICdzZXAnLCAnb2t0JywgJ25vdicsICdkZXMnXSxcbiAgICBbXG4gICAgICAnamFudWFyJywgJ2ZlYnJ1YXInLCAnbWFycycsICdhcHJpbCcsICdtYWknLCAnanVuaScsICdqdWxpJywgJ2F1Z3VzdCcsICdzZXB0ZW1iZXInLCAnb2t0b2JlcicsXG4gICAgICAnbm92ZW1iZXInLCAnZGVzZW1iZXInXG4gICAgXVxuICBdLFxuICBbWydmLktyLicsICdlLktyLiddLCB1LCBbJ2bDuHIgS3Jpc3R1cycsICdldHRlciBLcmlzdHVzJ11dLFxuICAxLFxuICBbNiwgMF0sXG4gIFsnZGQuTU0ueScsICdkLiBNTU0geScsICdkLiBNTU1NIHknLCAnRUVFRSBkLiBNTU1NIHknXSxcbiAgWydISDptbScsICdISDptbTpzcycsICdISDptbTpzcyB6JywgJ0hIOm1tOnNzIHp6enonXSxcbiAgWyd7MX0sIHswfScsIHUsICd7MX0gXFwna2xcXCcuIHswfScsICd7MX0gezB9J10sXG4gIFsnLCcsICfCoCcsICc7JywgJyUnLCAnKycsICfiiJInLCAnRScsICfDlycsICfigLAnLCAn4oieJywgJ05hTicsICc6J10sXG4gIFsnIywjIzAuIyMjJywgJyMsIyMwwqAlJywgJ8KkwqAjLCMjMC4wMCcsICcjRTAnXSxcbiAgJ05PSycsXG4gICdrcicsXG4gICdub3Jza2Uga3JvbmVyJyxcbiAge1xuICAgICdBVUQnOiBbdSwgJyQnXSxcbiAgICAnQlJMJzogW3UsICdSJCddLFxuICAgICdDQUQnOiBbdSwgJyQnXSxcbiAgICAnQ05ZJzogW3UsICfCpSddLFxuICAgICdIS0QnOiBbdSwgJyQnXSxcbiAgICAnSUxTJzogW3UsICfigqonXSxcbiAgICAnSU5SJzogW3UsICfigrknXSxcbiAgICAnSlBZJzogW3UsICfCpSddLFxuICAgICdLUlcnOiBbdSwgJ+KCqSddLFxuICAgICdNWE4nOiBbdSwgJyQnXSxcbiAgICAnTk9LJzogWydrciddLFxuICAgICdOWkQnOiBbdSwgJyQnXSxcbiAgICAnUk9OJzogW3UsICdMJ10sXG4gICAgJ1RXRCc6IFt1LCAnTlQkJ10sXG4gICAgJ1VTRCc6IFt1LCAnJCddLFxuICAgICdWTkQnOiBbdSwgJ+KCqyddLFxuICAgICdYQUYnOiBbXSxcbiAgICAnWENEJzogW3UsICckJ10sXG4gICAgJ1hQRic6IFtdLFxuICAgICdYWFgnOiBbXVxuICB9LFxuICAnbHRyJyxcbiAgcGx1cmFsXG5dO1xuIl19
+
+/***/ }),
+
+/***/ "./node_modules/@angular/common/locales/nl.js":
+/*!****************************************************!*\
+ !*** ./node_modules/@angular/common/locales/nl.js ***!
+ \****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+(function (factory) {
+ if ( true && typeof module.exports === "object") {
+ var v = factory(null, exports);
+ if (v !== undefined) module.exports = v;
+ }
+ else if (true) {
+ !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),
+ __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
+ (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),
+ __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+ }
+})(function (require, exports) {
+ "use strict";
+ Object.defineProperty(exports, "__esModule", { value: true });
+ // THIS CODE IS GENERATED - DO NOT MODIFY
+ // See angular/tools/gulp-tasks/cldr/extract.js
+ var u = undefined;
+ function plural(n) {
+ var i = Math.floor(Math.abs(n)), v = n.toString().replace(/^[^.]*\.?/, '').length;
+ if (i === 1 && v === 0)
+ return 1;
+ return 5;
+ }
+ exports.default = [
+ 'nl',
+ [['a.m.', 'p.m.'], u, u],
+ u,
+ [
+ ['Z', 'M', 'D', 'W', 'D', 'V', 'Z'], ['zo', 'ma', 'di', 'wo', 'do', 'vr', 'za'],
+ ['zondag', 'maandag', 'dinsdag', 'woensdag', 'donderdag', 'vrijdag', 'zaterdag'],
+ ['zo', 'ma', 'di', 'wo', 'do', 'vr', 'za']
+ ],
+ u,
+ [
+ ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],
+ ['jan.', 'feb.', 'mrt.', 'apr.', 'mei', 'jun.', 'jul.', 'aug.', 'sep.', 'okt.', 'nov.', 'dec.'],
+ [
+ 'januari', 'februari', 'maart', 'april', 'mei', 'juni', 'juli', 'augustus', 'september',
+ 'oktober', 'november', 'december'
+ ]
+ ],
+ u,
+ [['v.C.', 'n.C.'], ['v.Chr.', 'n.Chr.'], ['voor Christus', 'na Christus']],
+ 1,
+ [6, 0],
+ ['dd-MM-y', 'd MMM y', 'd MMMM y', 'EEEE d MMMM y'],
+ ['HH:mm', 'HH:mm:ss', 'HH:mm:ss z', 'HH:mm:ss zzzz'],
+ ['{1} {0}', u, '{1} \'om\' {0}', u],
+ [',', '.', ';', '%', '+', '-', 'E', '×', '‰', '∞', 'NaN', ':'],
+ ['#,##0.###', '#,##0%', '¤ #,##0.00;¤ -#,##0.00', '#E0'],
+ 'EUR',
+ '€',
+ 'Euro',
+ {
+ 'AUD': ['AU$', '$'],
+ 'CAD': ['C$', '$'],
+ 'FJD': ['FJ$', '$'],
+ 'JPY': ['JP¥', '¥'],
+ 'SBD': ['SI$', '$'],
+ 'THB': ['฿'],
+ 'TWD': ['NT$'],
+ 'USD': ['US$', '$'],
+ 'XPF': [],
+ 'XXX': []
+ },
+ 'ltr',
+ plural
+ ];
+});
+//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21tb24vbG9jYWxlcy9ubC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7Ozs7Ozs7Ozs7OztJQUVILHlDQUF5QztJQUN6QywrQ0FBK0M7SUFFL0MsSUFBTSxDQUFDLEdBQUcsU0FBUyxDQUFDO0lBRXBCLFNBQVMsTUFBTSxDQUFDLENBQVM7UUFDdkIsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUNsRixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7WUFBRSxPQUFPLENBQUMsQ0FBQztRQUNqQyxPQUFPLENBQUMsQ0FBQztJQUNYLENBQUM7SUFFRCxrQkFBZTtRQUNiLElBQUk7UUFDSixDQUFDLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDeEIsQ0FBQztRQUNEO1lBQ0UsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQztZQUMvRSxDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLFVBQVUsQ0FBQztZQUNoRixDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQztTQUMzQztRQUNELENBQUM7UUFDRDtZQUNFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7WUFDNUQsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQztZQUMvRjtnQkFDRSxTQUFTLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFdBQVc7Z0JBQ3ZGLFNBQVMsRUFBRSxVQUFVLEVBQUUsVUFBVTthQUNsQztTQUNGO1FBQ0QsQ0FBQztRQUNELENBQUMsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLEVBQUUsQ0FBQyxlQUFlLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFDMUUsQ0FBQztRQUNELENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNOLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsZUFBZSxDQUFDO1FBQ25ELENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsZUFBZSxDQUFDO1FBQ3BELENBQUMsU0FBUyxFQUFFLENBQUMsRUFBRSxnQkFBZ0IsRUFBRSxDQUFDLENBQUM7UUFDbkMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQztRQUM5RCxDQUFDLFdBQVcsRUFBRSxRQUFRLEVBQUUsd0JBQXdCLEVBQUUsS0FBSyxDQUFDO1FBQ3hELEtBQUs7UUFDTCxHQUFHO1FBQ0gsTUFBTTtRQUNOO1lBQ0UsS0FBSyxFQUFFLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQztZQUNuQixLQUFLLEVBQUUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDO1lBQ2xCLEtBQUssRUFBRSxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUM7WUFDbkIsS0FBSyxFQUFFLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQztZQUNuQixLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDO1lBQ25CLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQztZQUNaLEtBQUssRUFBRSxDQUFDLEtBQUssQ0FBQztZQUNkLEtBQUssRUFBRSxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUM7WUFDbkIsS0FBSyxFQUFFLEVBQUU7WUFDVCxLQUFLLEVBQUUsRUFBRTtTQUNWO1FBQ0QsS0FBSztRQUNMLE1BQU07S0FDUCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbi8vIFRISVMgQ09ERSBJUyBHRU5FUkFURUQgLSBETyBOT1QgTU9ESUZZXG4vLyBTZWUgYW5ndWxhci90b29scy9ndWxwLXRhc2tzL2NsZHIvZXh0cmFjdC5qc1xuXG5jb25zdCB1ID0gdW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBwbHVyYWwobjogbnVtYmVyKTogbnVtYmVyIHtcbiAgbGV0IGkgPSBNYXRoLmZsb29yKE1hdGguYWJzKG4pKSwgdiA9IG4udG9TdHJpbmcoKS5yZXBsYWNlKC9eW14uXSpcXC4/LywgJycpLmxlbmd0aDtcbiAgaWYgKGkgPT09IDEgJiYgdiA9PT0gMCkgcmV0dXJuIDE7XG4gIHJldHVybiA1O1xufVxuXG5leHBvcnQgZGVmYXVsdCBbXG4gICdubCcsXG4gIFtbJ2EubS4nLCAncC5tLiddLCB1LCB1XSxcbiAgdSxcbiAgW1xuICAgIFsnWicsICdNJywgJ0QnLCAnVycsICdEJywgJ1YnLCAnWiddLCBbJ3pvJywgJ21hJywgJ2RpJywgJ3dvJywgJ2RvJywgJ3ZyJywgJ3phJ10sXG4gICAgWyd6b25kYWcnLCAnbWFhbmRhZycsICdkaW5zZGFnJywgJ3dvZW5zZGFnJywgJ2RvbmRlcmRhZycsICd2cmlqZGFnJywgJ3phdGVyZGFnJ10sXG4gICAgWyd6bycsICdtYScsICdkaScsICd3bycsICdkbycsICd2cicsICd6YSddXG4gIF0sXG4gIHUsXG4gIFtcbiAgICBbJ0onLCAnRicsICdNJywgJ0EnLCAnTScsICdKJywgJ0onLCAnQScsICdTJywgJ08nLCAnTicsICdEJ10sXG4gICAgWydqYW4uJywgJ2ZlYi4nLCAnbXJ0LicsICdhcHIuJywgJ21laScsICdqdW4uJywgJ2p1bC4nLCAnYXVnLicsICdzZXAuJywgJ29rdC4nLCAnbm92LicsICdkZWMuJ10sXG4gICAgW1xuICAgICAgJ2phbnVhcmknLCAnZmVicnVhcmknLCAnbWFhcnQnLCAnYXByaWwnLCAnbWVpJywgJ2p1bmknLCAnanVsaScsICdhdWd1c3R1cycsICdzZXB0ZW1iZXInLFxuICAgICAgJ29rdG9iZXInLCAnbm92ZW1iZXInLCAnZGVjZW1iZXInXG4gICAgXVxuICBdLFxuICB1LFxuICBbWyd2LkMuJywgJ24uQy4nXSwgWyd2LkNoci4nLCAnbi5DaHIuJ10sIFsndm9vciBDaHJpc3R1cycsICduYSBDaHJpc3R1cyddXSxcbiAgMSxcbiAgWzYsIDBdLFxuICBbJ2RkLU1NLXknLCAnZCBNTU0geScsICdkIE1NTU0geScsICdFRUVFIGQgTU1NTSB5J10sXG4gIFsnSEg6bW0nLCAnSEg6bW06c3MnLCAnSEg6bW06c3MgeicsICdISDptbTpzcyB6enp6J10sXG4gIFsnezF9IHswfScsIHUsICd7MX0gXFwnb21cXCcgezB9JywgdV0sXG4gIFsnLCcsICcuJywgJzsnLCAnJScsICcrJywgJy0nLCAnRScsICfDlycsICfigLAnLCAn4oieJywgJ05hTicsICc6J10sXG4gIFsnIywjIzAuIyMjJywgJyMsIyMwJScsICfCpMKgIywjIzAuMDA7wqTCoC0jLCMjMC4wMCcsICcjRTAnXSxcbiAgJ0VVUicsXG4gICfigqwnLFxuICAnRXVybycsXG4gIHtcbiAgICAnQVVEJzogWydBVSQnLCAnJCddLFxuICAgICdDQUQnOiBbJ0MkJywgJyQnXSxcbiAgICAnRkpEJzogWydGSiQnLCAnJCddLFxuICAgICdKUFknOiBbJ0pQwqUnLCAnwqUnXSxcbiAgICAnU0JEJzogWydTSSQnLCAnJCddLFxuICAgICdUSEInOiBbJ+C4vyddLFxuICAgICdUV0QnOiBbJ05UJCddLFxuICAgICdVU0QnOiBbJ1VTJCcsICckJ10sXG4gICAgJ1hQRic6IFtdLFxuICAgICdYWFgnOiBbXVxuICB9LFxuICAnbHRyJyxcbiAgcGx1cmFsXG5dO1xuIl19
+
+/***/ }),
+
+/***/ "./node_modules/@angular/common/locales/pl.js":
+/*!****************************************************!*\
+ !*** ./node_modules/@angular/common/locales/pl.js ***!
+ \****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+(function (factory) {
+ if ( true && typeof module.exports === "object") {
+ var v = factory(null, exports);
+ if (v !== undefined) module.exports = v;
+ }
+ else if (true) {
+ !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),
+ __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
+ (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),
+ __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+ }
+})(function (require, exports) {
+ "use strict";
+ Object.defineProperty(exports, "__esModule", { value: true });
+ // THIS CODE IS GENERATED - DO NOT MODIFY
+ // See angular/tools/gulp-tasks/cldr/extract.js
+ var u = undefined;
+ function plural(n) {
+ var i = Math.floor(Math.abs(n)), v = n.toString().replace(/^[^.]*\.?/, '').length;
+ if (i === 1 && v === 0)
+ return 1;
+ if (v === 0 && i % 10 === Math.floor(i % 10) && i % 10 >= 2 && i % 10 <= 4 &&
+ !(i % 100 >= 12 && i % 100 <= 14))
+ return 3;
+ if (v === 0 && !(i === 1) && i % 10 === Math.floor(i % 10) && i % 10 >= 0 && i % 10 <= 1 ||
+ v === 0 && i % 10 === Math.floor(i % 10) && i % 10 >= 5 && i % 10 <= 9 ||
+ v === 0 && i % 100 === Math.floor(i % 100) && i % 100 >= 12 && i % 100 <= 14)
+ return 4;
+ return 5;
+ }
+ exports.default = [
+ 'pl',
+ [['a', 'p'], ['AM', 'PM'], u],
+ u,
+ [
+ ['n', 'p', 'w', 'ś', 'c', 'p', 's'], ['niedz.', 'pon.', 'wt.', 'śr.', 'czw.', 'pt.', 'sob.'],
+ ['niedziela', 'poniedziałek', 'wtorek', 'środa', 'czwartek', 'piątek', 'sobota'],
+ ['nie', 'pon', 'wto', 'śro', 'czw', 'pią', 'sob']
+ ],
+ [
+ ['N', 'P', 'W', 'Ś', 'C', 'P', 'S'], ['niedz.', 'pon.', 'wt.', 'śr.', 'czw.', 'pt.', 'sob.'],
+ ['niedziela', 'poniedziałek', 'wtorek', 'środa', 'czwartek', 'piątek', 'sobota'],
+ ['nie', 'pon', 'wto', 'śro', 'czw', 'pią', 'sob']
+ ],
+ [
+ ['s', 'l', 'm', 'k', 'm', 'c', 'l', 's', 'w', 'p', 'l', 'g'],
+ ['sty', 'lut', 'mar', 'kwi', 'maj', 'cze', 'lip', 'sie', 'wrz', 'paź', 'lis', 'gru'],
+ [
+ 'stycznia', 'lutego', 'marca', 'kwietnia', 'maja', 'czerwca', 'lipca', 'sierpnia', 'września',
+ 'października', 'listopada', 'grudnia'
+ ]
+ ],
+ [
+ ['S', 'L', 'M', 'K', 'M', 'C', 'L', 'S', 'W', 'P', 'L', 'G'],
+ ['sty', 'lut', 'mar', 'kwi', 'maj', 'cze', 'lip', 'sie', 'wrz', 'paź', 'lis', 'gru'],
+ [
+ 'styczeń', 'luty', 'marzec', 'kwiecień', 'maj', 'czerwiec', 'lipiec', 'sierpień', 'wrzesień',
+ 'październik', 'listopad', 'grudzień'
+ ]
+ ],
+ [['p.n.e.', 'n.e.'], u, ['przed naszą erą', 'naszej ery']],
+ 1,
+ [6, 0],
+ ['dd.MM.y', 'd MMM y', 'd MMMM y', 'EEEE, d MMMM y'],
+ ['HH:mm', 'HH:mm:ss', 'HH:mm:ss z', 'HH:mm:ss zzzz'],
+ ['{1}, {0}', u, '{1} {0}', u],
+ [',', ' ', ';', '%', '+', '-', 'E', '×', '‰', '∞', 'NaN', ':'],
+ ['#,##0.###', '#,##0%', '#,##0.00 ¤', '#E0'],
+ 'PLN',
+ 'zł',
+ 'złoty polski',
+ {
+ 'AUD': [u, '$'],
+ 'CAD': [u, '$'],
+ 'CNY': [u, '¥'],
+ 'GBP': [u, '£'],
+ 'HKD': [u, '$'],
+ 'ILS': [u, '₪'],
+ 'INR': [u, '₹'],
+ 'JPY': [u, '¥'],
+ 'KRW': [u, '₩'],
+ 'MXN': [u, '$'],
+ 'NZD': [u, '$'],
+ 'PLN': ['zł'],
+ 'RON': [u, 'lej'],
+ 'TWD': [u, 'NT$'],
+ 'USD': [u, '$'],
+ 'VND': [u, '₫']
+ },
+ 'ltr',
+ plural
+ ];
+});
+//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21tb24vbG9jYWxlcy9wbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7Ozs7Ozs7Ozs7OztJQUVILHlDQUF5QztJQUN6QywrQ0FBK0M7SUFFL0MsSUFBTSxDQUFDLEdBQUcsU0FBUyxDQUFDO0lBRXBCLFNBQVMsTUFBTSxDQUFDLENBQVM7UUFDdkIsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUNsRixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7WUFBRSxPQUFPLENBQUMsQ0FBQztRQUNqQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsS0FBSyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUM7WUFDdEUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLElBQUksRUFBRSxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksRUFBRSxDQUFDO1lBQ25DLE9BQU8sQ0FBQyxDQUFDO1FBQ1gsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsS0FBSyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUM7WUFD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Q0FBQztZQUNmLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUM7WUFDZixLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDO1lBQ2YsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQztZQUNmLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUM7WUFDZixLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUM7WUFDYixLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDO1lBQ2pCLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUM7WUFDakIsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQztZQUNmLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUM7U0FDaEI7UUFDRCxLQUFLO1FBQ0wsTUFBTTtLQUNQLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuLy8gVEhJUyBDT0RFIElTIEdFTkVSQVRFRCAtIERPIE5PVCBNT0RJRllcbi8vIFNlZSBhbmd1bGFyL3Rvb2xzL2d1bHAtdGFza3MvY2xkci9leHRyYWN0LmpzXG5cbmNvbnN0IHUgPSB1bmRlZmluZWQ7XG5cbmZ1bmN0aW9uIHBsdXJhbChuOiBudW1iZXIpOiBudW1iZXIge1xuICBsZXQgaSA9IE1hdGguZmxvb3IoTWF0aC5hYnMobikpLCB2ID0gbi50b1N0cmluZygpLnJlcGxhY2UoL15bXi5dKlxcLj8vLCAnJykubGVuZ3RoO1xuICBpZiAoaSA9PT0gMSAmJiB2ID09PSAwKSByZXR1cm4gMTtcbiAgaWYgKHYgPT09IDAgJiYgaSAlIDEwID09PSBNYXRoLmZsb29yKGkgJSAxMCkgJiYgaSAlIDEwID49IDIgJiYgaSAlIDEwIDw9IDQgJiZcbiAgICAgICEoaSAlIDEwMCA+PSAxMiAmJiBpICUgMTAwIDw9IDE0KSlcbiAgICByZXR1cm4gMztcbiAgaWYgKHYgPT09IDAgJiYgIShpID09PSAxKSAmJiBpICUgMTAgPT09IE1hdGguZmxvb3IoaSAlIDEwKSAmJiBpICUgMTAgPj0gMCAmJiBpICUgMTAgPD0gMSB8fFxuICAgICAgdiA9PT0gMCAmJiBpICUgMTAgPT09IE1hdGguZmxvb3IoaSAlIDEwKSAmJiBpICUgMTAgPj0gNSAmJiBpICUgMTAgPD0gOSB8fFxuICAgICAgdiA9PT0gMCAmJiBpICUgMTAwID09PSBNYXRoLmZsb29yKGkgJSAxMDApICYmIGkgJSAxMDAgPj0gMTIgJiYgaSAlIDEwMCA8PSAxNClcbiAgICByZXR1cm4gNDtcbiAgcmV0dXJuIDU7XG59XG5cbmV4cG9ydCBkZWZhdWx0IFtcbiAgJ3BsJyxcbiAgW1snYScsICdwJ10sIFsnQU0nLCAnUE0nXSwgdV0sXG4gIHUsXG4gIFtcbiAgICBbJ24nLCAncCcsICd3JywgJ8WbJywgJ2MnLCAncCcsICdzJ10sIFsnbmllZHouJywgJ3Bvbi4nLCAnd3QuJywgJ8Wbci4nLCAnY3p3LicsICdwdC4nLCAnc29iLiddLFxuICAgIFsnbmllZHppZWxhJywgJ3BvbmllZHppYcWCZWsnLCAnd3RvcmVrJywgJ8Wbcm9kYScsICdjendhcnRlaycsICdwacSFdGVrJywgJ3NvYm90YSddLFxuICAgIFsnbmllJywgJ3BvbicsICd3dG8nLCAnxZtybycsICdjencnLCAncGnEhScsICdzb2InXVxuICBdLFxuICBbXG4gICAgWydOJywgJ1AnLCAnVycsICfFmicsICdDJywgJ1AnLCAnUyddLCBbJ25pZWR6LicsICdwb24uJywgJ3d0LicsICfFm3IuJywgJ2N6dy4nLCAncHQuJywgJ3NvYi4nXSxcbiAgICBbJ25pZWR6aWVsYScsICdwb25pZWR6aWHFgmVrJywgJ3d0b3JlaycsICfFm3JvZGEnLCAnY3p3YXJ0ZWsnLCAncGnEhXRlaycsICdzb2JvdGEnXSxcbiAgICBbJ25pZScsICdwb24nLCAnd3RvJywgJ8Wbcm8nLCAnY3p3JywgJ3BpxIUnLCAnc29iJ11cbiAgXSxcbiAgW1xuICAgIFsncycsICdsJywgJ20nLCAnaycsICdtJywgJ2MnLCAnbCcsICdzJywgJ3cnLCAncCcsICdsJywgJ2cnXSxcbiAgICBbJ3N0eScsICdsdXQnLCAnbWFyJywgJ2t3aScsICdtYWonLCAnY3plJywgJ2xpcCcsICdzaWUnLCAnd3J6JywgJ3BhxbonLCAnbGlzJywgJ2dydSddLFxuICAgIFtcbiAgICAgICdzdHljem5pYScsICdsdXRlZ28nLCAnbWFyY2EnLCAna3dpZXRuaWEnLCAnbWFqYScsICdjemVyd2NhJywgJ2xpcGNhJywgJ3NpZXJwbmlhJywgJ3dyemXFm25pYScsXG4gICAgICAncGHFumR6aWVybmlrYScsICdsaXN0b3BhZGEnLCAnZ3J1ZG5pYSdcbiAgICBdXG4gIF0sXG4gIFtcbiAgICBbJ1MnLCAnTCcsICdNJywgJ0snLCAnTScsICdDJywgJ0wnLCAnUycsICdXJywgJ1AnLCAnTCcsICdHJ10sXG4gICAgWydzdHknLCAnbHV0JywgJ21hcicsICdrd2knLCAnbWFqJywgJ2N6ZScsICdsaXAnLCAnc2llJywgJ3dyeicsICdwYcW6JywgJ2xpcycsICdncnUnXSxcbiAgICBbXG4gICAgICAnc3R5Y3plxYQnLCAnbHV0eScsICdtYXJ6ZWMnLCAna3dpZWNpZcWEJywgJ21haicsICdjemVyd2llYycsICdsaXBpZWMnLCAnc2llcnBpZcWEJywgJ3dyemVzaWXFhCcsXG4gICAgICAncGHFumR6aWVybmlrJywgJ2xpc3RvcGFkJywgJ2dydWR6aWXFhCdcbiAgICBdXG4gIF0sXG4gIFtbJ3Aubi5lLicsICduLmUuJ10sIHUsIFsncHJ6ZWQgbmFzesSFIGVyxIUnLCAnbmFzemVqIGVyeSddXSxcbiAgMSxcbiAgWzYsIDBdLFxuICBbJ2RkLk1NLnknLCAnZCBNTU0geScsICdkIE1NTU0geScsICdFRUVFLCBkIE1NTU0geSddLFxuICBbJ0hIOm1tJywgJ0hIOm1tOnNzJywgJ0hIOm1tOnNzIHonLCAnSEg6bW06c3Mgenp6eiddLFxuICBbJ3sxfSwgezB9JywgdSwgJ3sxfSB7MH0nLCB1XSxcbiAgWycsJywgJ8KgJywgJzsnLCAnJScsICcrJywgJy0nLCAnRScsICfDlycsICfigLAnLCAn4oieJywgJ05hTicsICc6J10sXG4gIFsnIywjIzAuIyMjJywgJyMsIyMwJScsICcjLCMjMC4wMMKgwqQnLCAnI0UwJ10sXG4gICdQTE4nLFxuICAnesWCJyxcbiAgJ3rFgm90eSBwb2xza2knLFxuICB7XG4gICAgJ0FVRCc6IFt1LCAnJCddLFxuICAgICdDQUQnOiBbdSwgJyQnXSxcbiAgICAnQ05ZJzogW3UsICfCpSddLFxuICAgICdHQlAnOiBbdSwgJ8KjJ10sXG4gICAgJ0hLRCc6IFt1LCAnJCddLFxuICAgICdJTFMnOiBbdSwgJ+KCqiddLFxuICAgICdJTlInOiBbdSwgJ+KCuSddLFxuICAgICdKUFknOiBbdSwgJ8KlJ10sXG4gICAgJ0tSVyc6IFt1LCAn4oKpJ10sXG4gICAgJ01YTic6IFt1LCAnJCddLFxuICAgICdOWkQnOiBbdSwgJyQnXSxcbiAgICAnUExOJzogWyd6xYInXSxcbiAgICAnUk9OJzogW3UsICdsZWonXSxcbiAgICAnVFdEJzogW3UsICdOVCQnXSxcbiAgICAnVVNEJzogW3UsICckJ10sXG4gICAgJ1ZORCc6IFt1LCAn4oKrJ11cbiAgfSxcbiAgJ2x0cicsXG4gIHBsdXJhbFxuXTtcbiJdfQ==
+
+/***/ }),
+
+/***/ "./node_modules/@angular/common/locales/pt-PT.js":
+/*!*******************************************************!*\
+ !*** ./node_modules/@angular/common/locales/pt-PT.js ***!
+ \*******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+(function (factory) {
+ if ( true && typeof module.exports === "object") {
+ var v = factory(null, exports);
+ if (v !== undefined) module.exports = v;
+ }
+ else if (true) {
+ !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),
+ __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
+ (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),
+ __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+ }
+})(function (require, exports) {
+ "use strict";
+ Object.defineProperty(exports, "__esModule", { value: true });
+ // THIS CODE IS GENERATED - DO NOT MODIFY
+ // See angular/tools/gulp-tasks/cldr/extract.js
+ var u = undefined;
+ function plural(n) {
+ var i = Math.floor(Math.abs(n));
+ if (i === Math.floor(i) && i >= 0 && i <= 1)
+ return 1;
+ return 5;
+ }
+ exports.default = [
+ 'pt-PT',
+ [['a.m.', 'p.m.'], u, ['da manhã', 'da tarde']],
+ [['a.m.', 'p.m.'], u, ['manhã', 'tarde']],
+ [
+ ['D', 'S', 'T', 'Q', 'Q', 'S', 'S'],
+ ['domingo', 'segunda', 'terça', 'quarta', 'quinta', 'sexta', 'sábado'],
+ [
+ 'domingo', 'segunda-feira', 'terça-feira', 'quarta-feira', 'quinta-feira', 'sexta-feira',
+ 'sábado'
+ ],
+ ['domingo', 'segunda', 'terça', 'quarta', 'quinta', 'sexta', 'sábado']
+ ],
+ u,
+ [
+ ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],
+ [
+ 'jan.', 'fev.', 'mar.', 'abr.', 'mai.', 'jun.', 'jul.', 'ago.', 'set.', 'out.', 'nov.', 'dez.'
+ ],
+ [
+ 'janeiro', 'fevereiro', 'março', 'abril', 'maio', 'junho', 'julho', 'agosto', 'setembro',
+ 'outubro', 'novembro', 'dezembro'
+ ]
+ ],
+ u,
+ [['a.C.', 'd.C.'], u, ['antes de Cristo', 'depois de Cristo']],
+ 0,
+ [6, 0],
+ ['dd/MM/yy', 'dd/MM/y', 'd \'de\' MMMM \'de\' y', 'EEEE, d \'de\' MMMM \'de\' y'],
+ ['HH:mm', 'HH:mm:ss', 'HH:mm:ss z', 'HH:mm:ss zzzz'],
+ ['{1}, {0}', u, '{1} \'às\' {0}', u],
+ [',', ' ', ';', '%', '+', '-', 'E', '×', '‰', '∞', 'NaN', ':'],
+ ['#,##0.###', '#,##0%', '#,##0.00 ¤', '#E0'],
+ 'EUR',
+ '€',
+ 'euro',
+ {
+ 'AUD': ['AU$', '$'],
+ 'JPY': ['JP¥', '¥'],
+ 'PTE': [''],
+ 'RON': [u, 'L'],
+ 'THB': ['฿'],
+ 'TWD': ['NT$'],
+ 'USD': ['US$', '$']
+ },
+ 'ltr',
+ plural
+ ];
+});
+//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHQtUFQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21tb24vbG9jYWxlcy9wdC1QVC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7Ozs7Ozs7Ozs7OztJQUVILHlDQUF5QztJQUN6QywrQ0FBK0M7SUFFL0MsSUFBTSxDQUFDLEdBQUcsU0FBUyxDQUFDO0lBRXBCLFNBQVMsTUFBTSxDQUFDLENBQVM7UUFDdkIsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEMsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQUUsT0FBTyxDQUFDLENBQUM7UUFDdEQsT0FBTyxDQUFDLENBQUM7SUFDWCxDQUFDO0lBRUQsa0JBQWU7UUFDYixPQUFPO1FBQ1AsQ0FBQyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDL0MsQ0FBQyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDekM7WUFDRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQztZQUNuQyxDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFFBQVEsQ0FBQztZQUN0RTtnQkFDRSxTQUFTLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBRSxjQUFjLEVBQUUsY0FBYyxFQUFFLGFBQWE7Z0JBQ3hGLFFBQVE7YUFDVDtZQUNELENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUSxDQUFDO1NBQ3ZFO1FBQ0QsQ0FBQztRQUNEO1lBQ0UsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQztZQUM1RDtnQkFDRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU07YUFDL0Y7WUFDRDtnQkFDRSxTQUFTLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLFVBQVU7Z0JBQ3hGLFNBQVMsRUFBRSxVQUFVLEVBQUUsVUFBVTthQUNsQztTQUNGO1FBQ0QsQ0FBQztRQUNELENBQUMsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsaUJBQWlCLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztRQUM5RCxDQUFDO1FBQ0QsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ04sQ0FBQyxVQUFVLEVBQUUsU0FBUyxFQUFFLHdCQUF3QixFQUFFLDhCQUE4QixDQUFDO1FBQ2pGLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsZUFBZSxDQUFDO1FBQ3BELENBQUMsVUFBVSxFQUFFLENBQUMsRUFBRSxnQkFBZ0IsRUFBRSxDQUFDLENBQUM7UUFDcEMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQztRQUM5RCxDQUFDLFdBQVcsRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLEtBQUssQ0FBQztRQUM1QyxLQUFLO1FBQ0wsR0FBRztRQUNILE1BQU07UUFDTjtZQUNFLEtBQUssRUFBRSxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUM7WUFDbkIsS0FBSyxFQUFFLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQztZQUNuQixLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUM7WUFDWixLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDO1lBQ2YsS0FBSyxFQUFFLENBQUMsR0FBRyxDQUFDO1lBQ1osS0FBSyxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ2QsS0FBSyxFQUFFLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQztTQUNwQjtRQUNELEtBQUs7UUFDTCxNQUFNO0tBQ1AsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuXG4vLyBUSElTIENPREUgSVMgR0VORVJBVEVEIC0gRE8gTk9UIE1PRElGWVxuLy8gU2VlIGFuZ3VsYXIvdG9vbHMvZ3VscC10YXNrcy9jbGRyL2V4dHJhY3QuanNcblxuY29uc3QgdSA9IHVuZGVmaW5lZDtcblxuZnVuY3Rpb24gcGx1cmFsKG46IG51bWJlcik6IG51bWJlciB7XG4gIGxldCBpID0gTWF0aC5mbG9vcihNYXRoLmFicyhuKSk7XG4gIGlmIChpID09PSBNYXRoLmZsb29yKGkpICYmIGkgPj0gMCAmJiBpIDw9IDEpIHJldHVybiAxO1xuICByZXR1cm4gNTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgW1xuICAncHQtUFQnLFxuICBbWydhLm0uJywgJ3AubS4nXSwgdSwgWydkYSBtYW5ow6MnLCAnZGEgdGFyZGUnXV0sXG4gIFtbJ2EubS4nLCAncC5tLiddLCB1LCBbJ21hbmjDoycsICd0YXJkZSddXSxcbiAgW1xuICAgIFsnRCcsICdTJywgJ1QnLCAnUScsICdRJywgJ1MnLCAnUyddLFxuICAgIFsnZG9taW5nbycsICdzZWd1bmRhJywgJ3RlcsOnYScsICdxdWFydGEnLCAncXVpbnRhJywgJ3NleHRhJywgJ3PDoWJhZG8nXSxcbiAgICBbXG4gICAgICAnZG9taW5nbycsICdzZWd1bmRhLWZlaXJhJywgJ3RlcsOnYS1mZWlyYScsICdxdWFydGEtZmVpcmEnLCAncXVpbnRhLWZlaXJhJywgJ3NleHRhLWZlaXJhJyxcbiAgICAgICdzw6FiYWRvJ1xuICAgIF0sXG4gICAgWydkb21pbmdvJywgJ3NlZ3VuZGEnLCAndGVyw6dhJywgJ3F1YXJ0YScsICdxdWludGEnLCAnc2V4dGEnLCAnc8OhYmFkbyddXG4gIF0sXG4gIHUsXG4gIFtcbiAgICBbJ0onLCAnRicsICdNJywgJ0EnLCAnTScsICdKJywgJ0onLCAnQScsICdTJywgJ08nLCAnTicsICdEJ10sXG4gICAgW1xuICAgICAgJ2phbi4nLCAnZmV2LicsICdtYXIuJywgJ2Fici4nLCAnbWFpLicsICdqdW4uJywgJ2p1bC4nLCAnYWdvLicsICdzZXQuJywgJ291dC4nLCAnbm92LicsICdkZXouJ1xuICAgIF0sXG4gICAgW1xuICAgICAgJ2phbmVpcm8nLCAnZmV2ZXJlaXJvJywgJ21hcsOnbycsICdhYnJpbCcsICdtYWlvJywgJ2p1bmhvJywgJ2p1bGhvJywgJ2Fnb3N0bycsICdzZXRlbWJybycsXG4gICAgICAnb3V0dWJybycsICdub3ZlbWJybycsICdkZXplbWJybydcbiAgICBdXG4gIF0sXG4gIHUsXG4gIFtbJ2EuQy4nLCAnZC5DLiddLCB1LCBbJ2FudGVzIGRlIENyaXN0bycsICdkZXBvaXMgZGUgQ3Jpc3RvJ11dLFxuICAwLFxuICBbNiwgMF0sXG4gIFsnZGQvTU0veXknLCAnZGQvTU0veScsICdkIFxcJ2RlXFwnIE1NTU0gXFwnZGVcXCcgeScsICdFRUVFLCBkIFxcJ2RlXFwnIE1NTU0gXFwnZGVcXCcgeSddLFxuICBbJ0hIOm1tJywgJ0hIOm1tOnNzJywgJ0hIOm1tOnNzIHonLCAnSEg6bW06c3Mgenp6eiddLFxuICBbJ3sxfSwgezB9JywgdSwgJ3sxfSBcXCfDoHNcXCcgezB9JywgdV0sXG4gIFsnLCcsICfCoCcsICc7JywgJyUnLCAnKycsICctJywgJ0UnLCAnw5cnLCAn4oCwJywgJ+KInicsICdOYU4nLCAnOiddLFxuICBbJyMsIyMwLiMjIycsICcjLCMjMCUnLCAnIywjIzAuMDDCoMKkJywgJyNFMCddLFxuICAnRVVSJyxcbiAgJ+KCrCcsXG4gICdldXJvJyxcbiAge1xuICAgICdBVUQnOiBbJ0FVJCcsICckJ10sXG4gICAgJ0pQWSc6IFsnSlDCpScsICfCpSddLFxuICAgICdQVEUnOiBbJ+KAiyddLFxuICAgICdST04nOiBbdSwgJ0wnXSxcbiAgICAnVEhCJzogWyfguL8nXSxcbiAgICAnVFdEJzogWydOVCQnXSxcbiAgICAnVVNEJzogWydVUyQnLCAnJCddXG4gIH0sXG4gICdsdHInLFxuICBwbHVyYWxcbl07XG4iXX0=
+
+/***/ }),
+
+/***/ "./node_modules/@angular/common/locales/pt.js":
+/*!****************************************************!*\
+ !*** ./node_modules/@angular/common/locales/pt.js ***!
+ \****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+(function (factory) {
+ if ( true && typeof module.exports === "object") {
+ var v = factory(null, exports);
+ if (v !== undefined) module.exports = v;
+ }
+ else if (true) {
+ !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),
+ __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
+ (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),
+ __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+ }
+})(function (require, exports) {
+ "use strict";
+ Object.defineProperty(exports, "__esModule", { value: true });
+ // THIS CODE IS GENERATED - DO NOT MODIFY
+ // See angular/tools/gulp-tasks/cldr/extract.js
+ var u = undefined;
+ function plural(n) {
+ var i = Math.floor(Math.abs(n));
+ if (i === Math.floor(i) && i >= 0 && i <= 1)
+ return 1;
+ return 5;
+ }
+ exports.default = [
+ 'pt',
+ [['AM', 'PM'], u, u],
+ u,
+ [
+ ['D', 'S', 'T', 'Q', 'Q', 'S', 'S'], ['dom.', 'seg.', 'ter.', 'qua.', 'qui.', 'sex.', 'sáb.'],
+ [
+ 'domingo', 'segunda-feira', 'terça-feira', 'quarta-feira', 'quinta-feira', 'sexta-feira',
+ 'sábado'
+ ],
+ ['dom.', 'seg.', 'ter.', 'qua.', 'qui.', 'sex.', 'sáb.']
+ ],
+ u,
+ [
+ ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],
+ [
+ 'jan.', 'fev.', 'mar.', 'abr.', 'mai.', 'jun.', 'jul.', 'ago.', 'set.', 'out.', 'nov.', 'dez.'
+ ],
+ [
+ 'janeiro', 'fevereiro', 'março', 'abril', 'maio', 'junho', 'julho', 'agosto', 'setembro',
+ 'outubro', 'novembro', 'dezembro'
+ ]
+ ],
+ u,
+ [['a.C.', 'd.C.'], u, ['antes de Cristo', 'depois de Cristo']],
+ 0,
+ [6, 0],
+ ['dd/MM/y', 'd \'de\' MMM \'de\' y', 'd \'de\' MMMM \'de\' y', 'EEEE, d \'de\' MMMM \'de\' y'],
+ ['HH:mm', 'HH:mm:ss', 'HH:mm:ss z', 'HH:mm:ss zzzz'],
+ ['{1} {0}', u, u, u],
+ [',', '.', ';', '%', '+', '-', 'E', '×', '‰', '∞', 'NaN', ':'],
+ ['#,##0.###', '#,##0%', '¤ #,##0.00', '#E0'],
+ 'BRL',
+ 'R$',
+ 'Real brasileiro',
+ {
+ 'AUD': ['AU$', '$'],
+ 'JPY': ['JP¥', '¥'],
+ 'PTE': ['Esc.'],
+ 'RON': [u, 'L'],
+ 'SYP': [u, 'S£'],
+ 'THB': ['฿'],
+ 'TWD': ['NT$'],
+ 'USD': ['US$', '$']
+ },
+ 'ltr',
+ plural
+ ];
+});
+//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21tb24vbG9jYWxlcy9wdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7Ozs7Ozs7Ozs7OztJQUVILHlDQUF5QztJQUN6QywrQ0FBK0M7SUFFL0MsSUFBTSxDQUFDLEdBQUcsU0FBUyxDQUFDO0lBRXBCLFNBQVMsTUFBTSxDQUFDLENBQVM7UUFDdkIsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEMsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQUUsT0FBTyxDQUFDLENBQUM7UUFDdEQsT0FBTyxDQUFDLENBQUM7SUFDWCxDQUFDO0lBRUQsa0JBQWU7UUFDYixJQUFJO1FBQ0osQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3BCLENBQUM7UUFDRDtZQUNFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUM7WUFDN0Y7Z0JBQ0UsU0FBUyxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUUsY0FBYyxFQUFFLGNBQWMsRUFBRSxhQUFhO2dCQUN4RixRQUFRO2FBQ1Q7WUFDRCxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQztTQUN6RDtRQUNELENBQUM7UUFDRDtZQUNFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7WUFDNUQ7Z0JBQ0UsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNO2FBQy9GO1lBQ0Q7Z0JBQ0UsU0FBUyxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxVQUFVO2dCQUN4RixTQUFTLEVBQUUsVUFBVSxFQUFFLFVBQVU7YUFDbEM7U0FDRjtRQUNELENBQUM7UUFDRCxDQUFDLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLGlCQUFpQixFQUFFLGtCQUFrQixDQUFDLENBQUM7UUFDOUQsQ0FBQztRQUNELENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNOLENBQUMsU0FBUyxFQUFFLHVCQUF1QixFQUFFLHdCQUF3QixFQUFFLDhCQUE4QixDQUFDO1FBQzlGLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsZUFBZSxDQUFDO1FBQ3BELENBQUMsU0FBUyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3BCLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUM7UUFDOUQsQ0FBQyxXQUFXLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxLQUFLLENBQUM7UUFDNUMsS0FBSztRQUNMLElBQUk7UUFDSixpQkFBaUI7UUFDakI7WUFDRSxLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDO1lBQ25CLEtBQUssRUFBRSxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUM7WUFDbkIsS0FBSyxFQUFFLENBQUMsTUFBTSxDQUFDO1lBQ2YsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQztZQUNmLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUM7WUFDaEIsS0FBSyxFQUFFLENBQUMsR0FBRyxDQUFDO1lBQ1osS0FBSyxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ2QsS0FBSyxFQUFFLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQztTQUNwQjtRQUNELEtBQUs7UUFDTCxNQUFNO0tBQ1AsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuXG4vLyBUSElTIENPREUgSVMgR0VORVJBVEVEIC0gRE8gTk9UIE1PRElGWVxuLy8gU2VlIGFuZ3VsYXIvdG9vbHMvZ3VscC10YXNrcy9jbGRyL2V4dHJhY3QuanNcblxuY29uc3QgdSA9IHVuZGVmaW5lZDtcblxuZnVuY3Rpb24gcGx1cmFsKG46IG51bWJlcik6IG51bWJlciB7XG4gIGxldCBpID0gTWF0aC5mbG9vcihNYXRoLmFicyhuKSk7XG4gIGlmIChpID09PSBNYXRoLmZsb29yKGkpICYmIGkgPj0gMCAmJiBpIDw9IDEpIHJldHVybiAxO1xuICByZXR1cm4gNTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgW1xuICAncHQnLFxuICBbWydBTScsICdQTSddLCB1LCB1XSxcbiAgdSxcbiAgW1xuICAgIFsnRCcsICdTJywgJ1QnLCAnUScsICdRJywgJ1MnLCAnUyddLCBbJ2RvbS4nLCAnc2VnLicsICd0ZXIuJywgJ3F1YS4nLCAncXVpLicsICdzZXguJywgJ3PDoWIuJ10sXG4gICAgW1xuICAgICAgJ2RvbWluZ28nLCAnc2VndW5kYS1mZWlyYScsICd0ZXLDp2EtZmVpcmEnLCAncXVhcnRhLWZlaXJhJywgJ3F1aW50YS1mZWlyYScsICdzZXh0YS1mZWlyYScsXG4gICAgICAnc8OhYmFkbydcbiAgICBdLFxuICAgIFsnZG9tLicsICdzZWcuJywgJ3Rlci4nLCAncXVhLicsICdxdWkuJywgJ3NleC4nLCAnc8OhYi4nXVxuICBdLFxuICB1LFxuICBbXG4gICAgWydKJywgJ0YnLCAnTScsICdBJywgJ00nLCAnSicsICdKJywgJ0EnLCAnUycsICdPJywgJ04nLCAnRCddLFxuICAgIFtcbiAgICAgICdqYW4uJywgJ2Zldi4nLCAnbWFyLicsICdhYnIuJywgJ21haS4nLCAnanVuLicsICdqdWwuJywgJ2Fnby4nLCAnc2V0LicsICdvdXQuJywgJ25vdi4nLCAnZGV6LidcbiAgICBdLFxuICAgIFtcbiAgICAgICdqYW5laXJvJywgJ2ZldmVyZWlybycsICdtYXLDp28nLCAnYWJyaWwnLCAnbWFpbycsICdqdW5obycsICdqdWxobycsICdhZ29zdG8nLCAnc2V0ZW1icm8nLFxuICAgICAgJ291dHVicm8nLCAnbm92ZW1icm8nLCAnZGV6ZW1icm8nXG4gICAgXVxuICBdLFxuICB1LFxuICBbWydhLkMuJywgJ2QuQy4nXSwgdSwgWydhbnRlcyBkZSBDcmlzdG8nLCAnZGVwb2lzIGRlIENyaXN0byddXSxcbiAgMCxcbiAgWzYsIDBdLFxuICBbJ2RkL01NL3knLCAnZCBcXCdkZVxcJyBNTU0gXFwnZGVcXCcgeScsICdkIFxcJ2RlXFwnIE1NTU0gXFwnZGVcXCcgeScsICdFRUVFLCBkIFxcJ2RlXFwnIE1NTU0gXFwnZGVcXCcgeSddLFxuICBbJ0hIOm1tJywgJ0hIOm1tOnNzJywgJ0hIOm1tOnNzIHonLCAnSEg6bW06c3Mgenp6eiddLFxuICBbJ3sxfSB7MH0nLCB1LCB1LCB1XSxcbiAgWycsJywgJy4nLCAnOycsICclJywgJysnLCAnLScsICdFJywgJ8OXJywgJ+KAsCcsICfiiJ4nLCAnTmFOJywgJzonXSxcbiAgWycjLCMjMC4jIyMnLCAnIywjIzAlJywgJ8KkwqAjLCMjMC4wMCcsICcjRTAnXSxcbiAgJ0JSTCcsXG4gICdSJCcsXG4gICdSZWFsIGJyYXNpbGVpcm8nLFxuICB7XG4gICAgJ0FVRCc6IFsnQVUkJywgJyQnXSxcbiAgICAnSlBZJzogWydKUMKlJywgJ8KlJ10sXG4gICAgJ1BURSc6IFsnRXNjLiddLFxuICAgICdST04nOiBbdSwgJ0wnXSxcbiAgICAnU1lQJzogW3UsICdTwqMnXSxcbiAgICAnVEhCJzogWyfguL8nXSxcbiAgICAnVFdEJzogWydOVCQnXSxcbiAgICAnVVNEJzogWydVUyQnLCAnJCddXG4gIH0sXG4gICdsdHInLFxuICBwbHVyYWxcbl07XG4iXX0=
+
+/***/ }),
+
+/***/ "./node_modules/@angular/common/locales/ro.js":
+/*!****************************************************!*\
+ !*** ./node_modules/@angular/common/locales/ro.js ***!
+ \****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+(function (factory) {
+ if ( true && typeof module.exports === "object") {
+ var v = factory(null, exports);
+ if (v !== undefined) module.exports = v;
+ }
+ else if (true) {
+ !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),
+ __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
+ (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),
+ __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+ }
+})(function (require, exports) {
+ "use strict";
+ Object.defineProperty(exports, "__esModule", { value: true });
+ // THIS CODE IS GENERATED - DO NOT MODIFY
+ // See angular/tools/gulp-tasks/cldr/extract.js
+ var u = undefined;
+ function plural(n) {
+ var i = Math.floor(Math.abs(n)), v = n.toString().replace(/^[^.]*\.?/, '').length;
+ if (i === 1 && v === 0)
+ return 1;
+ if (!(v === 0) || n === 0 ||
+ !(n === 1) && n % 100 === Math.floor(n % 100) && n % 100 >= 1 && n % 100 <= 19)
+ return 3;
+ return 5;
+ }
+ exports.default = [
+ 'ro',
+ [['a.m.', 'p.m.'], u, u],
+ u,
+ [
+ ['D', 'L', 'M', 'M', 'J', 'V', 'S'], ['dum.', 'lun.', 'mar.', 'mie.', 'joi', 'vin.', 'sâm.'],
+ ['duminică', 'luni', 'marți', 'miercuri', 'joi', 'vineri', 'sâmbătă'],
+ ['du.', 'lu.', 'ma.', 'mi.', 'joi', 'vi.', 'sâ.']
+ ],
+ u,
+ [
+ ['I', 'F', 'M', 'A', 'M', 'I', 'I', 'A', 'S', 'O', 'N', 'D'],
+ [
+ 'ian.', 'feb.', 'mar.', 'apr.', 'mai', 'iun.', 'iul.', 'aug.', 'sept.', 'oct.', 'nov.', 'dec.'
+ ],
+ [
+ 'ianuarie', 'februarie', 'martie', 'aprilie', 'mai', 'iunie', 'iulie', 'august', 'septembrie',
+ 'octombrie', 'noiembrie', 'decembrie'
+ ]
+ ],
+ u,
+ [['î.Hr.', 'd.Hr.'], u, ['înainte de Hristos', 'după Hristos']],
+ 1,
+ [6, 0],
+ ['dd.MM.y', 'd MMM y', 'd MMMM y', 'EEEE, d MMMM y'],
+ ['HH:mm', 'HH:mm:ss', 'HH:mm:ss z', 'HH:mm:ss zzzz'],
+ ['{1}, {0}', u, u, u],
+ [',', '.', ';', '%', '+', '-', 'E', '×', '‰', '∞', 'NaN', ':'],
+ ['#,##0.###', '#,##0 %', '#,##0.00 ¤', '#E0'],
+ 'RON',
+ 'RON',
+ 'leu românesc',
+ {
+ 'AUD': [u, '$'],
+ 'BRL': [u, 'R$'],
+ 'CAD': [u, '$'],
+ 'CNY': [u, '¥'],
+ 'EUR': [u, '€'],
+ 'GBP': [u, '£'],
+ 'HKD': [u, '$'],
+ 'ILS': [u, '₪'],
+ 'INR': [u, '₹'],
+ 'JPY': [u, '¥'],
+ 'KRW': [u, '₩'],
+ 'MXN': [u, '$'],
+ 'NZD': [u, '$'],
+ 'TWD': [u, 'NT$'],
+ 'USD': [u, '$'],
+ 'VND': [u, '₫'],
+ 'XCD': [u, '$']
+ },
+ 'ltr',
+ plural
+ ];
+});
+//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm8uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21tb24vbG9jYWxlcy9yby50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7Ozs7Ozs7Ozs7OztJQUVILHlDQUF5QztJQUN6QywrQ0FBK0M7SUFFL0MsSUFBTSxDQUFDLEdBQUcsU0FBUyxDQUFDO0lBRXBCLFNBQVMsTUFBTSxDQUFDLENBQVM7UUFDdkIsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUNsRixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7WUFBRSxPQUFPLENBQUMsQ0FBQztRQUNqQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7WUFDckIsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksRUFBRTtZQUNoRixPQUFPLENBQUMsQ0FBQztRQUNYLE9BQU8sQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUVELGtCQUFlO1FBQ2IsSUFBSTtRQUNKLENBQUMsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN4QixDQUFDO1FBQ0Q7WUFDRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxF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LENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQztZQUNmLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUM7U0FDaEI7UUFDRCxLQUFLO1FBQ0wsTUFBTTtLQUNQLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuLy8gVEhJUyBDT0RFIElTIEdFTkVSQVRFRCAtIERPIE5PVCBNT0RJRllcbi8vIFNlZSBhbmd1bGFyL3Rvb2xzL2d1bHAtdGFza3MvY2xkci9leHRyYWN0LmpzXG5cbmNvbnN0IHUgPSB1bmRlZmluZWQ7XG5cbmZ1bmN0aW9uIHBsdXJhbChuOiBudW1iZXIpOiBudW1iZXIge1xuICBsZXQgaSA9IE1hdGguZmxvb3IoTWF0aC5hYnMobikpLCB2ID0gbi50b1N0cmluZygpLnJlcGxhY2UoL15bXi5dKlxcLj8vLCAnJykubGVuZ3RoO1xuICBpZiAoaSA9PT0gMSAmJiB2ID09PSAwKSByZXR1cm4gMTtcbiAgaWYgKCEodiA9PT0gMCkgfHwgbiA9PT0gMCB8fFxuICAgICAgIShuID09PSAxKSAmJiBuICUgMTAwID09PSBNYXRoLmZsb29yKG4gJSAxMDApICYmIG4gJSAxMDAgPj0gMSAmJiBuICUgMTAwIDw9IDE5KVxuICAgIHJldHVybiAzO1xuICByZXR1cm4gNTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgW1xuICAncm8nLFxuICBbWydhLm0uJywgJ3AubS4nXSwgdSwgdV0sXG4gIHUsXG4gIFtcbiAgICBbJ0QnLCAnTCcsICdNJywgJ00nLCAnSicsICdWJywgJ1MnXSwgWydkdW0uJywgJ2x1bi4nLCAnbWFyLicsICdtaWUuJywgJ2pvaScsICd2aW4uJywgJ3PDom0uJ10sXG4gICAgWydkdW1pbmljxIMnLCAnbHVuaScsICdtYXLIm2knLCAnbWllcmN1cmknLCAnam9pJywgJ3ZpbmVyaScsICdzw6JtYsSDdMSDJ10sXG4gICAgWydkdS4nLCAnbHUuJywgJ21hLicsICdtaS4nLCAnam9pJywgJ3ZpLicsICdzw6IuJ11cbiAgXSxcbiAgdSxcbiAgW1xuICAgIFsnSScsICdGJywgJ00nLCAnQScsICdNJywgJ0knLCAnSScsICdBJywgJ1MnLCAnTycsICdOJywgJ0QnXSxcbiAgICBbXG4gICAgICAnaWFuLicsICdmZWIuJywgJ21hci4nLCAnYXByLicsICdtYWknLCAnaXVuLicsICdpdWwuJywgJ2F1Zy4nLCAnc2VwdC4nLCAnb2N0LicsICdub3YuJywgJ2RlYy4nXG4gICAgXSxcbiAgICBbXG4gICAgICAnaWFudWFyaWUnLCAnZmVicnVhcmllJywgJ21hcnRpZScsICdhcHJpbGllJywgJ21haScsICdpdW5pZScsICdpdWxpZScsICdhdWd1c3QnLCAnc2VwdGVtYnJpZScsXG4gICAgICAnb2N0b21icmllJywgJ25vaWVtYnJpZScsICdkZWNlbWJyaWUnXG4gICAgXVxuICBdLFxuICB1LFxuICBbWyfDri5Ici4nLCAnZC5Ici4nXSwgdSwgWyfDrm5haW50ZSBkZSBIcmlzdG9zJywgJ2R1cMSDIEhyaXN0b3MnXV0sXG4gIDEsXG4gIFs2LCAwXSxcbiAgWydkZC5NTS55JywgJ2QgTU1NIHknLCAnZCBNTU1NIHknLCAnRUVFRSwgZCBNTU1NIHknXSxcbiAgWydISDptbScsICdISDptbTpzcycsICdISDptbTpzcyB6JywgJ0hIOm1tOnNzIHp6enonXSxcbiAgWyd7MX0sIHswfScsIHUsIHUsIHVdLFxuICBbJywnLCAnLicsICc7JywgJyUnLCAnKycsICctJywgJ0UnLCAnw5cnLCAn4oCwJywgJ+KInicsICdOYU4nLCAnOiddLFxuICBbJyMsIyMwLiMjIycsICcjLCMjMMKgJScsICcjLCMjMC4wMMKgwqQnLCAnI0UwJ10sXG4gICdST04nLFxuICAnUk9OJyxcbiAgJ2xldSByb23Dom5lc2MnLFxuICB7XG4gICAgJ0FVRCc6IFt1LCAnJCddLFxuICAgICdCUkwnOiBbdSwgJ1IkJ10sXG4gICAgJ0NBRCc6IFt1LCAnJCddLFxuICAgICdDTlknOiBbdSwgJ8KlJ10sXG4gICAgJ0VVUic6IFt1LCAn4oKsJ10sXG4gICAgJ0dCUCc6IFt1LCAnwqMnXSxcbiAgICAnSEtEJzogW3UsICckJ10sXG4gICAgJ0lMUyc6IFt1LCAn4oKqJ10sXG4gICAgJ0lOUic6IFt1LCAn4oK5J10sXG4gICAgJ0pQWSc6IFt1LCAnwqUnXSxcbiAgICAnS1JXJzogW3UsICfigqknXSxcbiAgICAnTVhOJzogW3UsICckJ10sXG4gICAgJ05aRCc6IFt1LCAnJCddLFxuICAgICdUV0QnOiBbdSwgJ05UJCddLFxuICAgICdVU0QnOiBbdSwgJyQnXSxcbiAgICAnVk5EJzogW3UsICfigqsnXSxcbiAgICAnWENEJzogW3UsICckJ11cbiAgfSxcbiAgJ2x0cicsXG4gIHBsdXJhbFxuXTtcbiJdfQ==
+
+/***/ }),
+
+/***/ "./node_modules/@angular/common/locales/ru.js":
+/*!****************************************************!*\
+ !*** ./node_modules/@angular/common/locales/ru.js ***!
+ \****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+(function (factory) {
+ if ( true && typeof module.exports === "object") {
+ var v = factory(null, exports);
+ if (v !== undefined) module.exports = v;
+ }
+ else if (true) {
+ !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),
+ __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
+ (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),
+ __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+ }
+})(function (require, exports) {
+ "use strict";
+ Object.defineProperty(exports, "__esModule", { value: true });
+ // THIS CODE IS GENERATED - DO NOT MODIFY
+ // See angular/tools/gulp-tasks/cldr/extract.js
+ var u = undefined;
+ function plural(n) {
+ var i = Math.floor(Math.abs(n)), v = n.toString().replace(/^[^.]*\.?/, '').length;
+ if (v === 0 && i % 10 === 1 && !(i % 100 === 11))
+ return 1;
+ if (v === 0 && i % 10 === Math.floor(i % 10) && i % 10 >= 2 && i % 10 <= 4 &&
+ !(i % 100 >= 12 && i % 100 <= 14))
+ return 3;
+ if (v === 0 && i % 10 === 0 ||
+ v === 0 && i % 10 === Math.floor(i % 10) && i % 10 >= 5 && i % 10 <= 9 ||
+ v === 0 && i % 100 === Math.floor(i % 100) && i % 100 >= 11 && i % 100 <= 14)
+ return 4;
+ return 5;
+ }
+ exports.default = [
+ 'ru',
+ [['AM', 'PM'], u, u],
+ u,
+ [
+ ['вс', 'пн', 'вт', 'ср', 'чт', 'пт', 'сб'], u,
+ ['воскресенье', 'понедельник', 'вторник', 'среда', 'четверг', 'пятница', 'суббота'],
+ ['вс', 'пн', 'вт', 'ср', 'чт', 'пт', 'сб']
+ ],
+ [
+ ['В', 'П', 'В', 'С', 'Ч', 'П', 'С'], ['вс', 'пн', 'вт', 'ср', 'чт', 'пт', 'сб'],
+ ['воскресенье', 'понедельник', 'вторник', 'среда', 'четверг', 'пятница', 'суббота'],
+ ['вс', 'пн', 'вт', 'ср', 'чт', 'пт', 'сб']
+ ],
+ [
+ ['Я', 'Ф', 'М', 'А', 'М', 'И', 'И', 'А', 'С', 'О', 'Н', 'Д'],
+ [
+ 'янв.', 'февр.', 'мар.', 'апр.', 'мая', 'июн.', 'июл.', 'авг.', 'сент.', 'окт.', 'нояб.',
+ 'дек.'
+ ],
+ [
+ 'января', 'февраля', 'марта', 'апреля', 'мая', 'июня', 'июля', 'августа', 'сентября',
+ 'октября', 'ноября', 'декабря'
+ ]
+ ],
+ [
+ ['Я', 'Ф', 'М', 'А', 'М', 'И', 'И', 'А', 'С', 'О', 'Н', 'Д'],
+ [
+ 'янв.', 'февр.', 'март', 'апр.', 'май', 'июнь', 'июль', 'авг.', 'сент.', 'окт.', 'нояб.',
+ 'дек.'
+ ],
+ [
+ 'январь', 'февраль', 'март', 'апрель', 'май', 'июнь', 'июль', 'август', 'сентябрь', 'октябрь',
+ 'ноябрь', 'декабрь'
+ ]
+ ],
+ [['до н.э.', 'н.э.'], ['до н. э.', 'н. э.'], ['до Рождества Христова', 'от Рождества Христова']],
+ 1,
+ [6, 0],
+ ['dd.MM.y', 'd MMM y \'г\'.', 'd MMMM y \'г\'.', 'EEEE, d MMMM y \'г\'.'],
+ ['HH:mm', 'HH:mm:ss', 'HH:mm:ss z', 'HH:mm:ss zzzz'],
+ ['{1}, {0}', u, u, u],
+ [',', ' ', ';', '%', '+', '-', 'E', '×', '‰', '∞', 'не число', ':'],
+ ['#,##0.###', '#,##0 %', '#,##0.00 ¤', '#E0'],
+ 'RUB',
+ '₽',
+ 'российский рубль',
+ {
+ 'GEL': [u, 'ლ'],
+ 'RON': [u, 'L'],
+ 'RUB': ['₽'],
+ 'RUR': ['р.'],
+ 'THB': ['฿'],
+ 'TMT': ['ТМТ'],
+ 'TWD': ['NT$'],
+ 'UAH': ['₴'],
+ 'XXX': ['XXXX']
+ },
+ 'ltr',
+ plural
+ ];
+});
+//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21tb24vbG9jYWxlcy9ydS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7Ozs7Ozs7Ozs7OztJQUVILHlDQUF5QztJQUN6QywrQ0FBK0M7SUFFL0MsSUFBTSxDQUFDLEdBQUcsU0FBUyxDQUFDO0lBRXBCLFNBQVMsTUFBTSxDQUFDLENBQVM7UUFDdkIsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUNsRixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEtBQUssRUFBRSxDQUFDO1lBQUUsT0FBTyxDQUFDLENBQUM7UUFDM0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDO1lBQ3RFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxJQUFJLEVBQUUsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLEVBQUUsQ0FBQztZQUNuQyxPQUFPLENBQUMsQ0FBQztRQUNYLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUM7WUFDdkIsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEVB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QUFDLEVBQUUsQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLEVBQUUsQ0FBQyx1QkFBdUIsRUFBRSx1QkFBdUIsQ0FBQyxDQUFDO1FBQ2hHLENBQUM7UUFDRCxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDTixDQUFDLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRSxpQkFBaUIsRUFBRSx1QkFBdUIsQ0FBQztRQUN6RSxDQUFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLGVBQWUsQ0FBQztRQUNwRCxDQUFDLFVBQVUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNyQixDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsR0FBRyxDQUFDO1FBQ25FLENBQUMsV0FBVyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxDQUFDO1FBQzdDLEtBQUs7UUFDTCxHQUFHO1FBQ0gsa0JBQWtCO1FBQ2xCO1lBQ0UsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQztZQUNmLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUM7WUFDZixLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUM7WUFDWixLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUM7WUFDYixLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUM7WUFDWixLQUFLLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDZCxLQUFLLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDZCxLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUM7WUFDWixLQUFLLEVBQUUsQ0FBQyxNQUFNLENBQUM7U0FDaEI7UUFDRCxLQUFLO1FBQ0wsTUFBTTtLQUNQLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuLy8gVEhJUyBDT0RFIElTIEdFTkVSQVRFRCAtIERPIE5PVCBNT0RJRllcbi8vIFNlZSBhbmd1bGFyL3Rvb2xzL2d1bHAtdGFza3MvY2xkci9leHRyYWN0LmpzXG5cbmNvbnN0IHUgPSB1bmRlZmluZWQ7XG5cbmZ1bmN0aW9uIHBsdXJhbChuOiBudW1iZXIpOiBudW1iZXIge1xuICBsZXQgaSA9IE1hdGguZmxvb3IoTWF0aC5hYnMobikpLCB2ID0gbi50b1N0cmluZygpLnJlcGxhY2UoL15bXi5dKlxcLj8vLCAnJykubGVuZ3RoO1xuICBpZiAodiA9PT0gMCAmJiBpICUgMTAgPT09IDEgJiYgIShpICUgMTAwID09PSAxMSkpIHJldHVybiAxO1xuICBpZiAodiA9PT0gMCAmJiBpICUgMTAgPT09IE1hdGguZmxvb3IoaSAlIDEwKSAmJiBpICUgMTAgPj0gMiAmJiBpICUgMTAgPD0gNCAmJlxuICAgICAgIShpICUgMTAwID49IDEyICYmIGkgJSAxMDAgPD0gMTQpKVxuICAgIHJldHVybiAzO1xuICBpZiAodiA9PT0gMCAmJiBpICUgMTAgPT09IDAgfHxcbiAgICAgIHYgPT09IDAgJiYgaSAlIDEwID09PSBNYXRoLmZsb29yKGkgJSAxMCkgJiYgaSAlIDEwID49IDUgJiYgaSAlIDEwIDw9IDkgfHxcbiAgICAgIHYgPT09IDAgJiYgaSAlIDEwMCA9PT0gTWF0aC5mbG9vcihpICUgMTAwKSAmJiBpICUgMTAwID49IDExICYmIGkgJSAxMDAgPD0gMTQpXG4gICAgcmV0dXJuIDQ7XG4gIHJldHVybiA1O1xufVxuXG5leHBvcnQgZGVmYXVsdCBbXG4gICdydScsXG4gIFtbJ0FNJywgJ1BNJ10sIHUsIHVdLFxuICB1LFxuICBbXG4gICAgWyfQstGBJywgJ9C/0L0nLCAn0LLRgicsICfRgdGAJywgJ9GH0YInLCAn0L/RgicsICfRgdCxJ10sIHUsXG4gICAgWyfQstC+0YHQutGA0LXRgdC10L3RjNC1JywgJ9C/0L7QvdC10LTQtdC70YzQvdC40LonLCAn0LLRgtC+0YDQvdC40LonLCAn0YHRgNC10LTQsCcsICfRh9C10YLQstC10YDQsycsICfQv9GP0YLQvdC40YbQsCcsICfRgdGD0LHQsdC+0YLQsCddLFxuICAgIFsn0LLRgScsICfQv9C9JywgJ9Cy0YInLCAn0YHRgCcsICfRh9GCJywgJ9C/0YInLCAn0YHQsSddXG4gIF0sXG4gIFtcbiAgICBbJ9CSJywgJ9CfJywgJ9CSJywgJ9ChJywgJ9CnJywgJ9CfJywgJ9ChJ10sIFsn0LLRgScsICfQv9C9JywgJ9Cy0YInLCAn0YHRgCcsICfRh9GCJywgJ9C/0YInLCAn0YHQsSddLFxuICAgIFsn0LLQvtGB0LrRgNC10YHQtdC90YzQtScsICfQv9C+0L3QtdC00LXQu9GM0L3QuNC6JywgJ9Cy0YLQvtGA0L3QuNC6JywgJ9GB0YDQtdC00LAnLCAn0YfQtdGC0LLQtdGA0LMnLCAn0L/Rj9GC0L3QuNGG0LAnLCAn0YHRg9Cx0LHQvtGC0LAnXSxcbiAgICBbJ9Cy0YEnLCAn0L/QvScsICfQstGCJywgJ9GB0YAnLCAn0YfRgicsICfQv9GCJywgJ9GB0LEnXVxuICBdLFxuICBbXG4gICAgWyfQrycsICfQpCcsICfQnCcsICfQkCcsICfQnCcsICfQmCcsICfQmCcsICfQkCcsICfQoScsICfQnicsICfQnScsICfQlCddLFxuICAgIFtcbiAgICAgICfRj9C90LIuJywgJ9GE0LXQstGALicsICfQvNCw0YAuJywgJ9Cw0L/RgC4nLCAn0LzQsNGPJywgJ9C40Y7QvS4nLCAn0LjRjtC7LicsICfQsNCy0LMuJywgJ9GB0LXQvdGCLicsICfQvtC60YIuJywgJ9C90L7Rj9CxLicsXG4gICAgICAn0LTQtdC6LidcbiAgICBdLFxuICAgIFtcbiAgICAgICfRj9C90LLQsNGA0Y8nLCAn0YTQtdCy0YDQsNC70Y8nLCAn0LzQsNGA0YLQsCcsICfQsNC/0YDQtdC70Y8nLCAn0LzQsNGPJywgJ9C40Y7QvdGPJywgJ9C40Y7Qu9GPJywgJ9Cw0LLQs9GD0YHRgtCwJywgJ9GB0LXQvdGC0Y/QsdGA0Y8nLFxuICAgICAgJ9C+0LrRgtGP0LHRgNGPJywgJ9C90L7Rj9Cx0YDRjycsICfQtNC10LrQsNCx0YDRjydcbiAgICBdXG4gIF0sXG4gIFtcbiAgICBbJ9CvJywgJ9CkJywgJ9CcJywgJ9CQJywgJ9CcJywgJ9CYJywgJ9CYJywgJ9CQJywgJ9ChJywgJ9CeJywgJ9CdJywgJ9CUJ10sXG4gICAgW1xuICAgICAgJ9GP0L3Qsi4nLCAn0YTQtdCy0YAuJywgJ9C80LDRgNGCJywgJ9Cw0L/RgC4nLCAn0LzQsNC5JywgJ9C40Y7QvdGMJywgJ9C40Y7Qu9GMJywgJ9Cw0LLQsy4nLCAn0YHQtdC90YIuJywgJ9C+0LrRgi4nLCAn0L3QvtGP0LEuJyxcbiAgICAgICfQtNC10LouJ1xuICAgIF0sXG4gICAgW1xuICAgICAgJ9GP0L3QstCw0YDRjCcsICfRhNC10LLRgNCw0LvRjCcsICfQvNCw0YDRgicsICfQsNC/0YDQtdC70YwnLCAn0LzQsNC5JywgJ9C40Y7QvdGMJywgJ9C40Y7Qu9GMJywgJ9Cw0LLQs9GD0YHRgicsICfRgdC10L3RgtGP0LHRgNGMJywgJ9C+0LrRgtGP0LHRgNGMJyxcbiAgICAgICfQvdC+0Y/QsdGA0YwnLCAn0LTQtdC60LDQsdGA0YwnXG4gICAgXVxuICBdLFxuICBbWyfQtNC+INC9LtGNLicsICfQvS7RjS4nXSwgWyfQtNC+INC9LiDRjS4nLCAn0L0uINGNLiddLCBbJ9C00L4g0KDQvtC20LTQtdGB0YLQstCwINCl0YDQuNGB0YLQvtCy0LAnLCAn0L7RgiDQoNC+0LbQtNC10YHRgtCy0LAg0KXRgNC40YHRgtC+0LLQsCddXSxcbiAgMSxcbiAgWzYsIDBdLFxuICBbJ2RkLk1NLnknLCAnZCBNTU0geSBcXCfQs1xcJy4nLCAnZCBNTU1NIHkgXFwn0LNcXCcuJywgJ0VFRUUsIGQgTU1NTSB5IFxcJ9CzXFwnLiddLFxuICBbJ0hIOm1tJywgJ0hIOm1tOnNzJywgJ0hIOm1tOnNzIHonLCAnSEg6bW06c3Mgenp6eiddLFxuICBbJ3sxfSwgezB9JywgdSwgdSwgdV0sXG4gIFsnLCcsICfCoCcsICc7JywgJyUnLCAnKycsICctJywgJ0UnLCAnw5cnLCAn4oCwJywgJ+KInicsICfQvdC1wqDRh9C40YHQu9C+JywgJzonXSxcbiAgWycjLCMjMC4jIyMnLCAnIywjIzDCoCUnLCAnIywjIzAuMDDCoMKkJywgJyNFMCddLFxuICAnUlVCJyxcbiAgJ+KCvScsXG4gICfRgNC+0YHRgdC40LnRgdC60LjQuSDRgNGD0LHQu9GMJyxcbiAge1xuICAgICdHRUwnOiBbdSwgJ+GDmiddLFxuICAgICdST04nOiBbdSwgJ0wnXSxcbiAgICAnUlVCJzogWyfigr0nXSxcbiAgICAnUlVSJzogWyfRgC4nXSxcbiAgICAnVEhCJzogWyfguL8nXSxcbiAgICAnVE1UJzogWyfQotCc0KInXSxcbiAgICAnVFdEJzogWydOVCQnXSxcbiAgICAnVUFIJzogWyfigrQnXSxcbiAgICAnWFhYJzogWydYWFhYJ11cbiAgfSxcbiAgJ2x0cicsXG4gIHBsdXJhbFxuXTtcbiJdfQ==
+
+/***/ }),
+
+/***/ "./node_modules/@angular/common/locales/sk.js":
+/*!****************************************************!*\
+ !*** ./node_modules/@angular/common/locales/sk.js ***!
+ \****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+(function (factory) {
+ if ( true && typeof module.exports === "object") {
+ var v = factory(null, exports);
+ if (v !== undefined) module.exports = v;
+ }
+ else if (true) {
+ !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),
+ __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
+ (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),
+ __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+ }
+})(function (require, exports) {
+ "use strict";
+ Object.defineProperty(exports, "__esModule", { value: true });
+ // THIS CODE IS GENERATED - DO NOT MODIFY
+ // See angular/tools/gulp-tasks/cldr/extract.js
+ var u = undefined;
+ function plural(n) {
+ var i = Math.floor(Math.abs(n)), v = n.toString().replace(/^[^.]*\.?/, '').length;
+ if (i === 1 && v === 0)
+ return 1;
+ if (i === Math.floor(i) && i >= 2 && i <= 4 && v === 0)
+ return 3;
+ if (!(v === 0))
+ return 4;
+ return 5;
+ }
+ exports.default = [
+ 'sk',
+ [['AM', 'PM'], u, u],
+ u,
+ [
+ ['n', 'p', 'u', 's', 'š', 'p', 's'], ['ne', 'po', 'ut', 'st', 'št', 'pi', 'so'],
+ ['nedeľa', 'pondelok', 'utorok', 'streda', 'štvrtok', 'piatok', 'sobota'],
+ ['ne', 'po', 'ut', 'st', 'št', 'pi', 'so']
+ ],
+ u,
+ [
+ ['j', 'f', 'm', 'a', 'm', 'j', 'j', 'a', 's', 'o', 'n', 'd'],
+ ['jan', 'feb', 'mar', 'apr', 'máj', 'jún', 'júl', 'aug', 'sep', 'okt', 'nov', 'dec'],
+ [
+ 'januára', 'februára', 'marca', 'apríla', 'mája', 'júna', 'júla', 'augusta', 'septembra',
+ 'októbra', 'novembra', 'decembra'
+ ]
+ ],
+ [
+ ['j', 'f', 'm', 'a', 'm', 'j', 'j', 'a', 's', 'o', 'n', 'd'],
+ ['jan', 'feb', 'mar', 'apr', 'máj', 'jún', 'júl', 'aug', 'sep', 'okt', 'nov', 'dec'],
+ [
+ 'január', 'február', 'marec', 'apríl', 'máj', 'jún', 'júl', 'august', 'september', 'október',
+ 'november', 'december'
+ ]
+ ],
+ [['pred Kr.', 'po Kr.'], u, ['pred Kristom', 'po Kristovi']],
+ 1,
+ [6, 0],
+ ['d. M. y', u, 'd. MMMM y', 'EEEE d. MMMM y'],
+ ['H:mm', 'H:mm:ss', 'H:mm:ss z', 'H:mm:ss zzzz'],
+ ['{1} {0}', '{1}, {0}', u, u],
+ [',', ' ', ';', '%', '+', '-', 'e', '×', '‰', '∞', 'NaN', ':'],
+ ['#,##0.###', '#,##0 %', '#,##0.00 ¤', '#E0'],
+ 'EUR',
+ '€',
+ 'euro',
+ {
+ 'AUD': [u, '$'],
+ 'BRL': [u, 'R$'],
+ 'CAD': [u, '$'],
+ 'CNY': [u, '¥'],
+ 'GBP': [u, '£'],
+ 'HKD': [u, '$'],
+ 'ILS': ['NIS', '₪'],
+ 'INR': [u, '₹'],
+ 'JPY': [u, '¥'],
+ 'KRW': [u, '₩'],
+ 'NZD': [u, '$'],
+ 'TWD': [u, 'NT$'],
+ 'USD': [u, '$'],
+ 'VND': [u, '₫'],
+ 'XXX': []
+ },
+ 'ltr',
+ plural
+ ];
+});
+//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21tb24vbG9jYWxlcy9zay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7Ozs7Ozs7Ozs7OztJQUVILHlDQUF5QztJQUN6QywrQ0FBK0M7SUFFL0MsSUFBTSxDQUFDLEdBQUcsU0FBUyxDQUFDO0lBRXBCLFNBQVMsTUFBTSxDQUFDLENBQVM7UUFDdkIsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUNsRixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7WUFBRSxPQUFPLENBQUMsQ0FBQztRQUNqQyxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztZQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ2pFLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7WUFBRSxPQUFPLENBQUMsQ0FBQztRQUN6QixPQUFPLENBQUMsQ0FBQztJQUNYLENBQUM7SUFFRCxrQkFBZTtRQUNiLElBQUk7UUFDSixDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDcEIsQ0FBQztRQUNEO1lBQ0UsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQztZQUMvRSxDQUFDLFFBQVEsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLFFBQVEsQ0FBQztZQUN6RSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQztTQUMzQztRQUNELENBQUM7UUFDRDtZQUNFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7WUFDNUQsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQztZQUNwRjtnQkFDRSxTQUFTLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFdBQVc7Z0JBQ3hGLFNBQVMsRUFBRSxVQUFVLEVBQUUsVUFBVTthQUNsQztTQUNGO1FBQ0Q7WUFDRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDO1lBQzVELENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUM7WUFDcEY7Z0JBQ0UsUUFBUSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsU0FBUztnQkFDNUYsVUFBVSxFQUFFLFVBQVU7YUFDdkI7U0FDRjtRQUNELENBQUMsQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsY0FBYyxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQzVELENBQUM7UUFDRCxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDTixDQUFDLFNBQVMsRUFBRSxDQUFDLEVBQUUsV0FBVyxFQUFFLGdCQUFnQixDQUFDO1FBQzdDLENBQUMsTUFBTSxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsY0FBYyxDQUFDO1FBQ2hELENBQUMsU0FBUyxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzdCLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUM7UUFDOUQsQ0FBQyxXQUFXLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLENBQUM7UUFDN0MsS0FBSztRQUNMLEdBQUc7UUFDSCxNQUFNO1FBQ047WUFDRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDO1lBQ2YsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQztZQUNoQixLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDO1lBQ2YsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQztZQUNmLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUM7WUFDZixLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDO1lBQ2YsS0FBSyxFQUFFLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQztZQUNuQixLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDO1lBQ2YsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQztZQUNmLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUM7WUFDZixLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDO1lBQ2YsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQztZQUNqQixLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDO1lBQ2YsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQztZQUNmLEtBQUssRUFBRSxFQUFFO1NBQ1Y7UUFDRCxLQUFLO1FBQ0wsTUFBTTtLQUNQLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuLy8gVEhJUyBDT0RFIElTIEdFTkVSQVRFRCAtIERPIE5PVCBNT0RJRllcbi8vIFNlZSBhbmd1bGFyL3Rvb2xzL2d1bHAtdGFza3MvY2xkci9leHRyYWN0LmpzXG5cbmNvbnN0IHUgPSB1bmRlZmluZWQ7XG5cbmZ1bmN0aW9uIHBsdXJhbChuOiBudW1iZXIpOiBudW1iZXIge1xuICBsZXQgaSA9IE1hdGguZmxvb3IoTWF0aC5hYnMobikpLCB2ID0gbi50b1N0cmluZygpLnJlcGxhY2UoL15bXi5dKlxcLj8vLCAnJykubGVuZ3RoO1xuICBpZiAoaSA9PT0gMSAmJiB2ID09PSAwKSByZXR1cm4gMTtcbiAgaWYgKGkgPT09IE1hdGguZmxvb3IoaSkgJiYgaSA+PSAyICYmIGkgPD0gNCAmJiB2ID09PSAwKSByZXR1cm4gMztcbiAgaWYgKCEodiA9PT0gMCkpIHJldHVybiA0O1xuICByZXR1cm4gNTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgW1xuICAnc2snLFxuICBbWydBTScsICdQTSddLCB1LCB1XSxcbiAgdSxcbiAgW1xuICAgIFsnbicsICdwJywgJ3UnLCAncycsICfFoScsICdwJywgJ3MnXSwgWyduZScsICdwbycsICd1dCcsICdzdCcsICfFoXQnLCAncGknLCAnc28nXSxcbiAgICBbJ25lZGXEvmEnLCAncG9uZGVsb2snLCAndXRvcm9rJywgJ3N0cmVkYScsICfFoXR2cnRvaycsICdwaWF0b2snLCAnc29ib3RhJ10sXG4gICAgWyduZScsICdwbycsICd1dCcsICdzdCcsICfFoXQnLCAncGknLCAnc28nXVxuICBdLFxuICB1LFxuICBbXG4gICAgWydqJywgJ2YnLCAnbScsICdhJywgJ20nLCAnaicsICdqJywgJ2EnLCAncycsICdvJywgJ24nLCAnZCddLFxuICAgIFsnamFuJywgJ2ZlYicsICdtYXInLCAnYXByJywgJ23DoWonLCAnasO6bicsICdqw7psJywgJ2F1ZycsICdzZXAnLCAnb2t0JywgJ25vdicsICdkZWMnXSxcbiAgICBbXG4gICAgICAnamFudcOhcmEnLCAnZmVicnXDoXJhJywgJ21hcmNhJywgJ2FwcsOtbGEnLCAnbcOhamEnLCAnasO6bmEnLCAnasO6bGEnLCAnYXVndXN0YScsICdzZXB0ZW1icmEnLFxuICAgICAgJ29rdMOzYnJhJywgJ25vdmVtYnJhJywgJ2RlY2VtYnJhJ1xuICAgIF1cbiAgXSxcbiAgW1xuICAgIFsnaicsICdmJywgJ20nLCAnYScsICdtJywgJ2onLCAnaicsICdhJywgJ3MnLCAnbycsICduJywgJ2QnXSxcbiAgICBbJ2phbicsICdmZWInLCAnbWFyJywgJ2FwcicsICdtw6FqJywgJ2rDum4nLCAnasO6bCcsICdhdWcnLCAnc2VwJywgJ29rdCcsICdub3YnLCAnZGVjJ10sXG4gICAgW1xuICAgICAgJ2phbnXDoXInLCAnZmVicnXDoXInLCAnbWFyZWMnLCAnYXByw61sJywgJ23DoWonLCAnasO6bicsICdqw7psJywgJ2F1Z3VzdCcsICdzZXB0ZW1iZXInLCAnb2t0w7NiZXInLFxuICAgICAgJ25vdmVtYmVyJywgJ2RlY2VtYmVyJ1xuICAgIF1cbiAgXSxcbiAgW1sncHJlZCBLci4nLCAncG8gS3IuJ10sIHUsIFsncHJlZCBLcmlzdG9tJywgJ3BvIEtyaXN0b3ZpJ11dLFxuICAxLFxuICBbNiwgMF0sXG4gIFsnZC4gTS4geScsIHUsICdkLiBNTU1NIHknLCAnRUVFRSBkLiBNTU1NIHknXSxcbiAgWydIOm1tJywgJ0g6bW06c3MnLCAnSDptbTpzcyB6JywgJ0g6bW06c3Mgenp6eiddLFxuICBbJ3sxfSB7MH0nLCAnezF9LCB7MH0nLCB1LCB1XSxcbiAgWycsJywgJ8KgJywgJzsnLCAnJScsICcrJywgJy0nLCAnZScsICfDlycsICfigLAnLCAn4oieJywgJ05hTicsICc6J10sXG4gIFsnIywjIzAuIyMjJywgJyMsIyMwwqAlJywgJyMsIyMwLjAwwqDCpCcsICcjRTAnXSxcbiAgJ0VVUicsXG4gICfigqwnLFxuICAnZXVybycsXG4gIHtcbiAgICAnQVVEJzogW3UsICckJ10sXG4gICAgJ0JSTCc6IFt1LCAnUiQnXSxcbiAgICAnQ0FEJzogW3UsICckJ10sXG4gICAgJ0NOWSc6IFt1LCAnwqUnXSxcbiAgICAnR0JQJzogW3UsICfCoyddLFxuICAgICdIS0QnOiBbdSwgJyQnXSxcbiAgICAnSUxTJzogWydOSVMnLCAn4oKqJ10sXG4gICAgJ0lOUic6IFt1LCAn4oK5J10sXG4gICAgJ0pQWSc6IFt1LCAnwqUnXSxcbiAgICAnS1JXJzogW3UsICfigqknXSxcbiAgICAnTlpEJzogW3UsICckJ10sXG4gICAgJ1RXRCc6IFt1LCAnTlQkJ10sXG4gICAgJ1VTRCc6IFt1LCAnJCddLFxuICAgICdWTkQnOiBbdSwgJ+KCqyddLFxuICAgICdYWFgnOiBbXVxuICB9LFxuICAnbHRyJyxcbiAgcGx1cmFsXG5dO1xuIl19
+
+/***/ }),
+
+/***/ "./node_modules/@angular/common/locales/sr.js":
+/*!****************************************************!*\
+ !*** ./node_modules/@angular/common/locales/sr.js ***!
+ \****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+(function (factory) {
+ if ( true && typeof module.exports === "object") {
+ var v = factory(null, exports);
+ if (v !== undefined) module.exports = v;
+ }
+ else if (true) {
+ !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),
+ __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
+ (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),
+ __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+ }
+})(function (require, exports) {
+ "use strict";
+ Object.defineProperty(exports, "__esModule", { value: true });
+ // THIS CODE IS GENERATED - DO NOT MODIFY
+ // See angular/tools/gulp-tasks/cldr/extract.js
+ var u = undefined;
+ function plural(n) {
+ var i = Math.floor(Math.abs(n)), v = n.toString().replace(/^[^.]*\.?/, '').length, f = parseInt(n.toString().replace(/^[^.]*\.?/, ''), 10) || 0;
+ if (v === 0 && i % 10 === 1 && !(i % 100 === 11) || f % 10 === 1 && !(f % 100 === 11))
+ return 1;
+ if (v === 0 && i % 10 === Math.floor(i % 10) && i % 10 >= 2 && i % 10 <= 4 &&
+ !(i % 100 >= 12 && i % 100 <= 14) ||
+ f % 10 === Math.floor(f % 10) && f % 10 >= 2 && f % 10 <= 4 &&
+ !(f % 100 >= 12 && f % 100 <= 14))
+ return 3;
+ return 5;
+ }
+ exports.default = [
+ 'sr',
+ [['a', 'p'], ['пре подне', 'по подне'], u],
+ [['пре подне', 'по подне'], u, u],
+ [
+ ['н', 'п', 'у', 'с', 'ч', 'п', 'с'], ['нед', 'пон', 'уто', 'сре', 'чет', 'пет', 'суб'],
+ ['недеља', 'понедељак', 'уторак', 'среда', 'четвртак', 'петак', 'субота'],
+ ['не', 'по', 'ут', 'ср', 'че', 'пе', 'су']
+ ],
+ u,
+ [
+ ['ј', 'ф', 'м', 'а', 'м', 'ј', 'ј', 'а', 'с', 'о', 'н', 'д'],
+ ['јан', 'феб', 'мар', 'апр', 'мај', 'јун', 'јул', 'авг', 'сеп', 'окт', 'нов', 'дец'],
+ [
+ 'јануар', 'фебруар', 'март', 'април', 'мај', 'јун', 'јул', 'август', 'септембар', 'октобар',
+ 'новембар', 'децембар'
+ ]
+ ],
+ u,
+ [['п.н.е.', 'н.е.'], ['п. н. е.', 'н. е.'], ['пре нове ере', 'нове ере']],
+ 1,
+ [6, 0],
+ ['d.M.yy.', 'dd.MM.y.', 'dd. MMMM y.', 'EEEE, dd. MMMM y.'],
+ ['HH:mm', 'HH:mm:ss', 'HH:mm:ss z', 'HH:mm:ss zzzz'],
+ ['{1} {0}', u, u, u],
+ [',', '.', ';', '%', '+', '-', 'E', '×', '‰', '∞', 'NaN', ':'],
+ ['#,##0.###', '#,##0%', '#,##0.00 ¤', '#E0'],
+ 'RSD',
+ 'RSD',
+ 'Српски динар',
+ {
+ 'AUD': [u, '$'],
+ 'BAM': ['КМ', 'KM'],
+ 'GEL': [u, 'ლ'],
+ 'KRW': [u, '₩'],
+ 'NZD': [u, '$'],
+ 'TWD': ['NT$'],
+ 'USD': ['US$', '$'],
+ 'VND': [u, '₫']
+ },
+ 'ltr',
+ plural
+ ];
+});
+//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21tb24vbG9jYWxlcy9zci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7Ozs7Ozs7Ozs7OztJQUVILHlDQUF5QztJQUN6QywrQ0FBK0M7SUFFL0MsSUFBTSxDQUFDLEdBQUcsU0FBUyxDQUFDO0lBRXBCLFNBQVMsTUFBTSxDQUFDLENBQVM7UUFDdkIsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFDN0UsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDakUsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxLQUFLLEVBQUUsQ0FBQztZQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ2hHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQztZQUNsRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsSUFBSSxFQUFFLElBQUksQ0FB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QixLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDO1lBQ2YsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQztZQUNmLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUM7WUFDZixLQUFLLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDZCxLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDO1lBQ25CLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUM7U0FDaEI7UUFDRCxLQUFLO1FBQ0wsTUFBTTtLQUNQLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuLy8gVEhJUyBDT0RFIElTIEdFTkVSQVRFRCAtIERPIE5PVCBNT0RJRllcbi8vIFNlZSBhbmd1bGFyL3Rvb2xzL2d1bHAtdGFza3MvY2xkci9leHRyYWN0LmpzXG5cbmNvbnN0IHUgPSB1bmRlZmluZWQ7XG5cbmZ1bmN0aW9uIHBsdXJhbChuOiBudW1iZXIpOiBudW1iZXIge1xuICBsZXQgaSA9IE1hdGguZmxvb3IoTWF0aC5hYnMobikpLCB2ID0gbi50b1N0cmluZygpLnJlcGxhY2UoL15bXi5dKlxcLj8vLCAnJykubGVuZ3RoLFxuICAgICAgZiA9IHBhcnNlSW50KG4udG9TdHJpbmcoKS5yZXBsYWNlKC9eW14uXSpcXC4/LywgJycpLCAxMCkgfHwgMDtcbiAgaWYgKHYgPT09IDAgJiYgaSAlIDEwID09PSAxICYmICEoaSAlIDEwMCA9PT0gMTEpIHx8IGYgJSAxMCA9PT0gMSAmJiAhKGYgJSAxMDAgPT09IDExKSkgcmV0dXJuIDE7XG4gIGlmICh2ID09PSAwICYmIGkgJSAxMCA9PT0gTWF0aC5mbG9vcihpICUgMTApICYmIGkgJSAxMCA+PSAyICYmIGkgJSAxMCA8PSA0ICYmXG4gICAgICAgICAgIShpICUgMTAwID49IDEyICYmIGkgJSAxMDAgPD0gMTQpIHx8XG4gICAgICBmICUgMTAgPT09IE1hdGguZmxvb3IoZiAlIDEwKSAmJiBmICUgMTAgPj0gMiAmJiBmICUgMTAgPD0gNCAmJlxuICAgICAgICAgICEoZiAlIDEwMCA+PSAxMiAmJiBmICUgMTAwIDw9IDE0KSlcbiAgICByZXR1cm4gMztcbiAgcmV0dXJuIDU7XG59XG5cbmV4cG9ydCBkZWZhdWx0IFtcbiAgJ3NyJyxcbiAgW1snYScsICdwJ10sIFsn0L/RgNC1INC/0L7QtNC90LUnLCAn0L/QviDQv9C+0LTQvdC1J10sIHVdLFxuICBbWyfQv9GA0LUg0L/QvtC00L3QtScsICfQv9C+INC/0L7QtNC90LUnXSwgdSwgdV0sXG4gIFtcbiAgICBbJ9C9JywgJ9C/JywgJ9GDJywgJ9GBJywgJ9GHJywgJ9C/JywgJ9GBJ10sIFsn0L3QtdC0JywgJ9C/0L7QvScsICfRg9GC0L4nLCAn0YHRgNC1JywgJ9GH0LXRgicsICfQv9C10YInLCAn0YHRg9CxJ10sXG4gICAgWyfQvdC10LTQtdGZ0LAnLCAn0L/QvtC90LXQtNC10ZnQsNC6JywgJ9GD0YLQvtGA0LDQuicsICfRgdGA0LXQtNCwJywgJ9GH0LXRgtCy0YDRgtCw0LonLCAn0L/QtdGC0LDQuicsICfRgdGD0LHQvtGC0LAnXSxcbiAgICBbJ9C90LUnLCAn0L/QvicsICfRg9GCJywgJ9GB0YAnLCAn0YfQtScsICfQv9C1JywgJ9GB0YMnXVxuICBdLFxuICB1LFxuICBbXG4gICAgWyfRmCcsICfRhCcsICfQvCcsICfQsCcsICfQvCcsICfRmCcsICfRmCcsICfQsCcsICfRgScsICfQvicsICfQvScsICfQtCddLFxuICAgIFsn0ZjQsNC9JywgJ9GE0LXQsScsICfQvNCw0YAnLCAn0LDQv9GAJywgJ9C80LDRmCcsICfRmNGD0L0nLCAn0ZjRg9C7JywgJ9Cw0LLQsycsICfRgdC10L8nLCAn0L7QutGCJywgJ9C90L7QsicsICfQtNC10YYnXSxcbiAgICBbXG4gICAgICAn0ZjQsNC90YPQsNGAJywgJ9GE0LXQsdGA0YPQsNGAJywgJ9C80LDRgNGCJywgJ9Cw0L/RgNC40LsnLCAn0LzQsNGYJywgJ9GY0YPQvScsICfRmNGD0LsnLCAn0LDQstCz0YPRgdGCJywgJ9GB0LXQv9GC0LXQvNCx0LDRgCcsICfQvtC60YLQvtCx0LDRgCcsXG4gICAgICAn0L3QvtCy0LXQvNCx0LDRgCcsICfQtNC10YbQtdC80LHQsNGAJ1xuICAgIF1cbiAgXSxcbiAgdSxcbiAgW1sn0L8u0L0u0LUuJywgJ9C9LtC1LiddLCBbJ9C/LiDQvS4g0LUuJywgJ9C9LiDQtS4nXSwgWyfQv9GA0LUg0L3QvtCy0LUg0LXRgNC1JywgJ9C90L7QstC1INC10YDQtSddXSxcbiAgMSxcbiAgWzYsIDBdLFxuICBbJ2QuTS55eS4nLCAnZGQuTU0ueS4nLCAnZGQuIE1NTU0geS4nLCAnRUVFRSwgZGQuIE1NTU0geS4nXSxcbiAgWydISDptbScsICdISDptbTpzcycsICdISDptbTpzcyB6JywgJ0hIOm1tOnNzIHp6enonXSxcbiAgWyd7MX0gezB9JywgdSwgdSwgdV0sXG4gIFsnLCcsICcuJywgJzsnLCAnJScsICcrJywgJy0nLCAnRScsICfDlycsICfigLAnLCAn4oieJywgJ05hTicsICc6J10sXG4gIFsnIywjIzAuIyMjJywgJyMsIyMwJScsICcjLCMjMC4wMMKgwqQnLCAnI0UwJ10sXG4gICdSU0QnLFxuICAnUlNEJyxcbiAgJ9Ch0YDQv9GB0LrQuCDQtNC40L3QsNGAJyxcbiAge1xuICAgICdBVUQnOiBbdSwgJyQnXSxcbiAgICAnQkFNJzogWyfQmtCcJywgJ0tNJ10sXG4gICAgJ0dFTCc6IFt1LCAn4YOaJ10sXG4gICAgJ0tSVyc6IFt1LCAn4oKpJ10sXG4gICAgJ05aRCc6IFt1LCAnJCddLFxuICAgICdUV0QnOiBbJ05UJCddLFxuICAgICdVU0QnOiBbJ1VTJCcsICckJ10sXG4gICAgJ1ZORCc6IFt1LCAn4oKrJ11cbiAgfSxcbiAgJ2x0cicsXG4gIHBsdXJhbFxuXTtcbiJdfQ==
+
+/***/ }),
+
+/***/ "./node_modules/@angular/common/locales/sv.js":
+/*!****************************************************!*\
+ !*** ./node_modules/@angular/common/locales/sv.js ***!
+ \****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+(function (factory) {
+ if ( true && typeof module.exports === "object") {
+ var v = factory(null, exports);
+ if (v !== undefined) module.exports = v;
+ }
+ else if (true) {
+ !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),
+ __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
+ (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),
+ __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+ }
+})(function (require, exports) {
+ "use strict";
+ Object.defineProperty(exports, "__esModule", { value: true });
+ // THIS CODE IS GENERATED - DO NOT MODIFY
+ // See angular/tools/gulp-tasks/cldr/extract.js
+ var u = undefined;
+ function plural(n) {
+ var i = Math.floor(Math.abs(n)), v = n.toString().replace(/^[^.]*\.?/, '').length;
+ if (i === 1 && v === 0)
+ return 1;
+ return 5;
+ }
+ exports.default = [
+ 'sv',
+ [['fm', 'em'], u, u],
+ [['fm', 'em'], ['f.m.', 'e.m.'], ['förmiddag', 'eftermiddag']],
+ [
+ ['S', 'M', 'T', 'O', 'T', 'F', 'L'], ['sön', 'mån', 'tis', 'ons', 'tors', 'fre', 'lör'],
+ ['söndag', 'måndag', 'tisdag', 'onsdag', 'torsdag', 'fredag', 'lördag'],
+ ['sö', 'må', 'ti', 'on', 'to', 'fr', 'lö']
+ ],
+ u,
+ [
+ ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],
+ ['jan.', 'feb.', 'mars', 'apr.', 'maj', 'juni', 'juli', 'aug.', 'sep.', 'okt.', 'nov.', 'dec.'],
+ [
+ 'januari', 'februari', 'mars', 'april', 'maj', 'juni', 'juli', 'augusti', 'september',
+ 'oktober', 'november', 'december'
+ ]
+ ],
+ u,
+ [['f.Kr.', 'e.Kr.'], u, ['före Kristus', 'efter Kristus']],
+ 1,
+ [6, 0],
+ ['y-MM-dd', 'd MMM y', 'd MMMM y', 'EEEE d MMMM y'],
+ ['HH:mm', 'HH:mm:ss', 'HH:mm:ss z', '\'kl\'. HH:mm:ss zzzz'],
+ ['{1} {0}', u, u, u],
+ [',', ' ', ';', '%', '+', '−', '×10^', '×', '‰', '∞', 'NaN', ':'],
+ ['#,##0.###', '#,##0 %', '#,##0.00 ¤', '#E0'],
+ 'SEK',
+ 'kr',
+ 'svensk krona',
+ {
+ 'AUD': [u, '$'],
+ 'BBD': ['Bds$', '$'],
+ 'BMD': ['BM$', '$'],
+ 'BRL': ['BR$', 'R$'],
+ 'BSD': ['BS$', '$'],
+ 'BZD': ['BZ$', '$'],
+ 'CNY': [u, '¥'],
+ 'DKK': ['Dkr', 'kr'],
+ 'DOP': ['RD$', '$'],
+ 'EEK': ['Ekr'],
+ 'EGP': ['EG£', 'E£'],
+ 'ESP': [],
+ 'GBP': [u, '£'],
+ 'HKD': [u, '$'],
+ 'IEP': ['IE£'],
+ 'INR': [u, '₹'],
+ 'ISK': ['Ikr', 'kr'],
+ 'JMD': ['JM$', '$'],
+ 'JPY': [u, '¥'],
+ 'KRW': [u, '₩'],
+ 'NOK': ['Nkr', 'kr'],
+ 'NZD': [u, '$'],
+ 'RON': [u, 'L'],
+ 'SEK': ['kr'],
+ 'TWD': [u, 'NT$'],
+ 'USD': ['US$', '$'],
+ 'VND': [u, '₫']
+ },
+ 'ltr',
+ plural
+ ];
+});
+//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3YuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21tb24vbG9jYWxlcy9zdi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7Ozs7Ozs7Ozs7OztJQUVILHlDQUF5QztJQUN6QywrQ0FBK0M7SUFFL0MsSUFBTSxDQUFDLEdBQUcsU0FBUyxDQUFDO0lBRXBCLFNBQVMsTUFBTSxDQUFDLENBQVM7UUFDdkIsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUNsRixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7WUFBRSxPQUFPLENBQUMsQ0FBQztRQUNqQyxPQUFPLENBQUMsQ0FBQztJQUNYLENBQUM7SUFFRCxrQkFBZTtRQUNiLElBQUk7UUFDSixDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDcEIsQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsRUFBRSxDQUFDLFdBQVcsRUFBRSxhQUFhLENBQUMsQ0FBQztRQUM5RDtZQUNFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUM7WUFDdkYsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUM7WUFDdkUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUM7U0FDM0M7UUFDRCxDQUFDO1FBQ0Q7WUFDRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDO1lBQzVELENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUM7WUFDL0Y7Z0JBQ0UsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxXQUFXO2dCQUNyRixTQUFTLEVBQUUsVUFBVSxFQUFFLFVBQVU7YUFDbEM7U0FDRjtRQUNELENBQUM7UUFDRCxDQUFDLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLGNBQWMsRUFBRSxlQUFlLENBQUMsQ0FBQztRQUMxRCxDQUFDO1FBQ0QsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ04sQ0FBQyxTQUFTLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxlQUFlLENBQUM7UUFDbkQsQ0FBQyxPQUFPLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSx1QkFBdUIsQ0FBQztRQUM1RCxDQUFDLFNBQVMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNwQixDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDO1FBQ2pFLENBQUMsV0FBVyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxDQUFDO1FBQzdDLEtBQUs7UUFDTCxJQUFJO1FBQ0osY0FBYztRQUNkO1lBQ0UsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQztZQUNmLEtBQUssRUFBRSxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUM7WUFDcEIsS0FBSyxFQUFFLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQztZQUNuQixLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDO1lBQ3BCLEtBQUssRUFBRSxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUM7WUFDbkIsS0FBSyxFQUFFLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQztZQUNuQixLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDO1lBQ2YsS0FBSyxFQUFFLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQztZQUNwQixLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDO1lBQ25CLEtBQUssRUFBRSxDQUFDLEtBQUssQ0FBQztZQUNkLEtBQUssRUFBRSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUM7WUFDcEIsS0FBSyxFQUFFLEVBQUU7WUFDVCxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDO1lBQ2YsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQztZQUNmLEtBQUssRUFBRSxDQUFDLEtBQUssQ0FBQztZQUNkLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUM7WUFDZixLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDO1lBQ3BCLEtBQUssRUFBRSxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUM7WUFDbkIsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQztZQUNmLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUM7WUFDZixLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDO1lBQ3BCLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUM7WUFDZixLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDO1lBQ2YsS0FBSyxFQUFFLENBQUMsSUFBSSxDQUFDO1lBQ2IsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQztZQUNqQixLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDO1lBQ25CLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUM7U0FDaEI7UUFDRCxLQUFLO1FBQ0wsTUFBTTtLQUNQLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuLy8gVEhJUyBDT0RFIElTIEdFTkVSQVRFRCAtIERPIE5PVCBNT0RJRllcbi8vIFNlZSBhbmd1bGFyL3Rvb2xzL2d1bHAtdGFza3MvY2xkci9leHRyYWN0LmpzXG5cbmNvbnN0IHUgPSB1bmRlZmluZWQ7XG5cbmZ1bmN0aW9uIHBsdXJhbChuOiBudW1iZXIpOiBudW1iZXIge1xuICBsZXQgaSA9IE1hdGguZmxvb3IoTWF0aC5hYnMobikpLCB2ID0gbi50b1N0cmluZygpLnJlcGxhY2UoL15bXi5dKlxcLj8vLCAnJykubGVuZ3RoO1xuICBpZiAoaSA9PT0gMSAmJiB2ID09PSAwKSByZXR1cm4gMTtcbiAgcmV0dXJuIDU7XG59XG5cbmV4cG9ydCBkZWZhdWx0IFtcbiAgJ3N2JyxcbiAgW1snZm0nLCAnZW0nXSwgdSwgdV0sXG4gIFtbJ2ZtJywgJ2VtJ10sIFsnZi5tLicsICdlLm0uJ10sIFsnZsO2cm1pZGRhZycsICdlZnRlcm1pZGRhZyddXSxcbiAgW1xuICAgIFsnUycsICdNJywgJ1QnLCAnTycsICdUJywgJ0YnLCAnTCddLCBbJ3PDtm4nLCAnbcOlbicsICd0aXMnLCAnb25zJywgJ3RvcnMnLCAnZnJlJywgJ2zDtnInXSxcbiAgICBbJ3PDtm5kYWcnLCAnbcOlbmRhZycsICd0aXNkYWcnLCAnb25zZGFnJywgJ3RvcnNkYWcnLCAnZnJlZGFnJywgJ2zDtnJkYWcnXSxcbiAgICBbJ3PDticsICdtw6UnLCAndGknLCAnb24nLCAndG8nLCAnZnInLCAnbMO2J11cbiAgXSxcbiAgdSxcbiAgW1xuICAgIFsnSicsICdGJywgJ00nLCAnQScsICdNJywgJ0onLCAnSicsICdBJywgJ1MnLCAnTycsICdOJywgJ0QnXSxcbiAgICBbJ2phbi4nLCAnZmViLicsICdtYXJzJywgJ2Fwci4nLCAnbWFqJywgJ2p1bmknLCAnanVsaScsICdhdWcuJywgJ3NlcC4nLCAnb2t0LicsICdub3YuJywgJ2RlYy4nXSxcbiAgICBbXG4gICAgICAnamFudWFyaScsICdmZWJydWFyaScsICdtYXJzJywgJ2FwcmlsJywgJ21haicsICdqdW5pJywgJ2p1bGknLCAnYXVndXN0aScsICdzZXB0ZW1iZXInLFxuICAgICAgJ29rdG9iZXInLCAnbm92ZW1iZXInLCAnZGVjZW1iZXInXG4gICAgXVxuICBdLFxuICB1LFxuICBbWydmLktyLicsICdlLktyLiddLCB1LCBbJ2bDtnJlIEtyaXN0dXMnLCAnZWZ0ZXIgS3Jpc3R1cyddXSxcbiAgMSxcbiAgWzYsIDBdLFxuICBbJ3ktTU0tZGQnLCAnZCBNTU0geScsICdkIE1NTU0geScsICdFRUVFIGQgTU1NTSB5J10sXG4gIFsnSEg6bW0nLCAnSEg6bW06c3MnLCAnSEg6bW06c3MgeicsICdcXCdrbFxcJy4gSEg6bW06c3Mgenp6eiddLFxuICBbJ3sxfSB7MH0nLCB1LCB1LCB1XSxcbiAgWycsJywgJ8KgJywgJzsnLCAnJScsICcrJywgJ+KIkicsICfDlzEwXicsICfDlycsICfigLAnLCAn4oieJywgJ05hTicsICc6J10sXG4gIFsnIywjIzAuIyMjJywgJyMsIyMwwqAlJywgJyMsIyMwLjAwwqDCpCcsICcjRTAnXSxcbiAgJ1NFSycsXG4gICdrcicsXG4gICdzdmVuc2sga3JvbmEnLFxuICB7XG4gICAgJ0FVRCc6IFt1LCAnJCddLFxuICAgICdCQkQnOiBbJ0JkcyQnLCAnJCddLFxuICAgICdCTUQnOiBbJ0JNJCcsICckJ10sXG4gICAgJ0JSTCc6IFsnQlIkJywgJ1IkJ10sXG4gICAgJ0JTRCc6IFsnQlMkJywgJyQnXSxcbiAgICAnQlpEJzogWydCWiQnLCAnJCddLFxuICAgICdDTlknOiBbdSwgJ8KlJ10sXG4gICAgJ0RLSyc6IFsnRGtyJywgJ2tyJ10sXG4gICAgJ0RPUCc6IFsnUkQkJywgJyQnXSxcbiAgICAnRUVLJzogWydFa3InXSxcbiAgICAnRUdQJzogWydFR8KjJywgJ0XCoyddLFxuICAgICdFU1AnOiBbXSxcbiAgICAnR0JQJzogW3UsICfCoyddLFxuICAgICdIS0QnOiBbdSwgJyQnXSxcbiAgICAnSUVQJzogWydJRcKjJ10sXG4gICAgJ0lOUic6IFt1LCAn4oK5J10sXG4gICAgJ0lTSyc6IFsnSWtyJywgJ2tyJ10sXG4gICAgJ0pNRCc6IFsnSk0kJywgJyQnXSxcbiAgICAnSlBZJzogW3UsICfCpSddLFxuICAgICdLUlcnOiBbdSwgJ+KCqSddLFxuICAgICdOT0snOiBbJ05rcicsICdrciddLFxuICAgICdOWkQnOiBbdSwgJyQnXSxcbiAgICAnUk9OJzogW3UsICdMJ10sXG4gICAgJ1NFSyc6IFsna3InXSxcbiAgICAnVFdEJzogW3UsICdOVCQnXSxcbiAgICAnVVNEJzogWydVUyQnLCAnJCddLFxuICAgICdWTkQnOiBbdSwgJ+KCqyddXG4gIH0sXG4gICdsdHInLFxuICBwbHVyYWxcbl07XG4iXX0=
+
+/***/ }),
+
+/***/ "./node_modules/@angular/common/locales/th.js":
+/*!****************************************************!*\
+ !*** ./node_modules/@angular/common/locales/th.js ***!
+ \****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+(function (factory) {
+ if ( true && typeof module.exports === "object") {
+ var v = factory(null, exports);
+ if (v !== undefined) module.exports = v;
+ }
+ else if (true) {
+ !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),
+ __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
+ (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),
+ __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+ }
+})(function (require, exports) {
+ "use strict";
+ Object.defineProperty(exports, "__esModule", { value: true });
+ // THIS CODE IS GENERATED - DO NOT MODIFY
+ // See angular/tools/gulp-tasks/cldr/extract.js
+ var u = undefined;
+ function plural(n) {
+ return 5;
+ }
+ exports.default = [
+ 'th',
+ [['a', 'p'], ['ก่อนเที่ยง', 'หลังเที่ยง'], u],
+ [['ก่อนเที่ยง', 'หลังเที่ยง'], u, u],
+ [
+ ['อา', 'จ', 'อ', 'พ', 'พฤ', 'ศ', 'ส'], ['อา.', 'จ.', 'อ.', 'พ.', 'พฤ.', 'ศ.', 'ส.'],
+ ['วันอาทิตย์', 'วันจันทร์', 'วันอังคาร', 'วันพุธ', 'วันพฤหัสบดี', 'วันศุกร์', 'วันเสาร์'],
+ ['อา.', 'จ.', 'อ.', 'พ.', 'พฤ.', 'ศ.', 'ส.']
+ ],
+ u,
+ [
+ [
+ 'ม.ค.', 'ก.พ.', 'มี.ค.', 'เม.ย.', 'พ.ค.', 'มิ.ย.', 'ก.ค.', 'ส.ค.', 'ก.ย.', 'ต.ค.', 'พ.ย.',
+ 'ธ.ค.'
+ ],
+ u,
+ [
+ 'มกราคม', 'กุมภาพันธ์', 'มีนาคม', 'เมษายน', 'พฤษภาคม', 'มิถุนายน', 'กรกฎาคม', 'สิงหาคม', 'กันยายน',
+ 'ตุลาคม', 'พฤศจิกายน', 'ธันวาคม'
+ ]
+ ],
+ u,
+ [['ก่อน ค.ศ.', 'ค.ศ.'], u, ['ปีก่อนคริสตกาล', 'คริสต์ศักราช']],
+ 0,
+ [6, 0],
+ ['d/M/yy', 'd MMM y', 'd MMMM G y', 'EEEEที่ d MMMM G y'],
+ ['HH:mm', 'HH:mm:ss', 'H นาฬิกา mm นาที ss วินาที z', 'H นาฬิกา mm นาที ss วินาที zzzz'],
+ ['{1} {0}', u, u, u],
+ ['.', ',', ';', '%', '+', '-', 'E', '×', '‰', '∞', 'NaN', ':'],
+ ['#,##0.###', '#,##0%', '¤#,##0.00', '#E0'],
+ 'THB',
+ '฿',
+ 'บาท',
+ { 'AUD': ['AU$', '$'], 'THB': ['฿'], 'TWD': ['NT$'], 'USD': ['US$', '$'], 'XXX': [] },
+ 'ltr',
+ plural
+ ];
+});
+//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21tb24vbG9jYWxlcy90aC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7Ozs7Ozs7Ozs7OztJQUVILHlDQUF5QztJQUN6QywrQ0FBK0M7SUFFL0MsSUFBTSxDQUFDLEdBQUcsU0FBUyxDQUFDO0lBRXBCLFNBQVMsTUFBTSxDQUFDLENBQVM7UUFDdkIsT0FBTyxDQUFDLENBQUM7SUFDWCxDQUFDO0lBRUQsa0JBQWU7UUFDYixJQUFJO1FBQ0osQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLFlBQVksRUFBRSxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDN0MsQ0FBQyxDQUFDLFlBQVksRUFBRSxZQUFZLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3BDO1lBQ0UsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQztZQUNuRixDQUFDLFlBQVksRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxhQUFhLEVBQUUsVUFBVSxFQUFFLFVBQVUsQ0FBQztZQUN6RixDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQztTQUM3QztRQUNELENBQUM7UUFDRDtZQUNFO2dCQUNFLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNO2dCQUN6RixNQUFNO2FBQ1A7WUFDRCxDQUFDO1lBQ0Q7Z0JBQ0UsUUFBUSxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTO2dCQUNsRyxRQUFRLEVBQUUsV0FBVyxFQUFFLFNBQVM7YUFDakM7U0FDRjtRQUNELENBQUM7UUFDRCxDQUFDLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLGdCQUFnQixFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBQzlELENBQUM7UUFDRCxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDTixDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLG9CQUFvQixDQUFDO1FBQ3pELENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSw4QkFBOEIsRUFBRSxpQ0FBaUMsQ0FBQztRQUN4RixDQUFDLFNBQVMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNwQixDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDO1FBQzlELENBQUMsV0FBVyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsS0FBSyxDQUFDO1FBQzNDLEtBQUs7UUFDTCxHQUFHO1FBQ0gsS0FBSztRQUNMLEVBQUMsS0FBSyxFQUFFLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFDO1FBQ25GLEtBQUs7UUFDTCxNQUFNO0tBQ1AsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuXG4vLyBUSElTIENPREUgSVMgR0VORVJBVEVEIC0gRE8gTk9UIE1PRElGWVxuLy8gU2VlIGFuZ3VsYXIvdG9vbHMvZ3VscC10YXNrcy9jbGRyL2V4dHJhY3QuanNcblxuY29uc3QgdSA9IHVuZGVmaW5lZDtcblxuZnVuY3Rpb24gcGx1cmFsKG46IG51bWJlcik6IG51bWJlciB7XG4gIHJldHVybiA1O1xufVxuXG5leHBvcnQgZGVmYXVsdCBbXG4gICd0aCcsXG4gIFtbJ2EnLCAncCddLCBbJ+C4geC5iOC4reC4meC5gOC4l+C4teC5iOC4ouC4hycsICfguKvguKXguLHguIfguYDguJfguLXguYjguKLguIcnXSwgdV0sXG4gIFtbJ+C4geC5iOC4reC4meC5gOC4l+C4teC5iOC4ouC4hycsICfguKvguKXguLHguIfguYDguJfguLXguYjguKLguIcnXSwgdSwgdV0sXG4gIFtcbiAgICBbJ+C4reC4sicsICfguIgnLCAn4LitJywgJ+C4nicsICfguJ7guKQnLCAn4LioJywgJ+C4qiddLCBbJ+C4reC4si4nLCAn4LiILicsICfguK0uJywgJ+C4ni4nLCAn4Lie4LikLicsICfguKguJywgJ+C4qi4nXSxcbiAgICBbJ+C4p+C4seC4meC4reC4suC4l+C4tOC4leC4ouC5jCcsICfguKfguLHguJnguIjguLHguJnguJfguKPguYwnLCAn4Lin4Lix4LiZ4Lit4Lix4LiH4LiE4Liy4LijJywgJ+C4p+C4seC4meC4nuC4uOC4mCcsICfguKfguLHguJnguJ7guKTguKvguLHguKrguJrguJTguLUnLCAn4Lin4Lix4LiZ4Lio4Li44LiB4Lij4LmMJywgJ+C4p+C4seC4meC5gOC4quC4suC4o+C5jCddLFxuICAgIFsn4Lit4LiyLicsICfguIguJywgJ+C4rS4nLCAn4LieLicsICfguJ7guKQuJywgJ+C4qC4nLCAn4LiqLiddXG4gIF0sXG4gIHUsXG4gIFtcbiAgICBbXG4gICAgICAn4LihLuC4hC4nLCAn4LiBLuC4ni4nLCAn4Lih4Li1LuC4hC4nLCAn4LmA4LihLuC4oi4nLCAn4LieLuC4hC4nLCAn4Lih4Li0LuC4oi4nLCAn4LiBLuC4hC4nLCAn4LiqLuC4hC4nLCAn4LiBLuC4oi4nLCAn4LiVLuC4hC4nLCAn4LieLuC4oi4nLFxuICAgICAgJ+C4mC7guIQuJ1xuICAgIF0sXG4gICAgdSxcbiAgICBbXG4gICAgICAn4Lih4LiB4Lij4Liy4LiE4LihJywgJ+C4geC4uOC4oeC4oOC4suC4nuC4seC4meC4mOC5jCcsICfguKHguLXguJnguLLguITguKEnLCAn4LmA4Lih4Lip4Liy4Lii4LiZJywgJ+C4nuC4pOC4qeC4oOC4suC4hOC4oScsICfguKHguLTguJbguLjguJnguLLguKLguJknLCAn4LiB4Lij4LiB4LiO4Liy4LiE4LihJywgJ+C4quC4tOC4h+C4q+C4suC4hOC4oScsICfguIHguLHguJnguKLguLLguKLguJknLFxuICAgICAgJ+C4leC4uOC4peC4suC4hOC4oScsICfguJ7guKTguKjguIjguLTguIHguLLguKLguJknLCAn4LiY4Lix4LiZ4Lin4Liy4LiE4LihJ1xuICAgIF1cbiAgXSxcbiAgdSxcbiAgW1sn4LiB4LmI4Lit4LiZIOC4hC7guKguJywgJ+C4hC7guKguJ10sIHUsIFsn4Lib4Li14LiB4LmI4Lit4LiZ4LiE4Lij4Li04Liq4LiV4LiB4Liy4LilJywgJ+C4hOC4o+C4tOC4quC4leC5jOC4qOC4seC4geC4o+C4suC4iiddXSxcbiAgMCxcbiAgWzYsIDBdLFxuICBbJ2QvTS95eScsICdkIE1NTSB5JywgJ2QgTU1NTSBHIHknLCAnRUVFReC4l+C4teC5iCBkIE1NTU0gRyB5J10sXG4gIFsnSEg6bW0nLCAnSEg6bW06c3MnLCAnSCDguJnguLLguKzguLTguIHguLIgbW0g4LiZ4Liy4LiX4Li1IHNzIOC4p+C4tOC4meC4suC4l+C4tSB6JywgJ0gg4LiZ4Liy4Lis4Li04LiB4LiyIG1tIOC4meC4suC4l+C4tSBzcyDguKfguLTguJnguLLguJfguLUgenp6eiddLFxuICBbJ3sxfSB7MH0nLCB1LCB1LCB1XSxcbiAgWycuJywgJywnLCAnOycsICclJywgJysnLCAnLScsICdFJywgJ8OXJywgJ+KAsCcsICfiiJ4nLCAnTmFOJywgJzonXSxcbiAgWycjLCMjMC4jIyMnLCAnIywjIzAlJywgJ8KkIywjIzAuMDAnLCAnI0UwJ10sXG4gICdUSEInLFxuICAn4Li/JyxcbiAgJ+C4muC4suC4lycsXG4gIHsnQVVEJzogWydBVSQnLCAnJCddLCAnVEhCJzogWyfguL8nXSwgJ1RXRCc6IFsnTlQkJ10sICdVU0QnOiBbJ1VTJCcsICckJ10sICdYWFgnOiBbXX0sXG4gICdsdHInLFxuICBwbHVyYWxcbl07XG4iXX0=
+
+/***/ }),
+
+/***/ "./node_modules/@angular/common/locales/tr.js":
+/*!****************************************************!*\
+ !*** ./node_modules/@angular/common/locales/tr.js ***!
+ \****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+(function (factory) {
+ if ( true && typeof module.exports === "object") {
+ var v = factory(null, exports);
+ if (v !== undefined) module.exports = v;
+ }
+ else if (true) {
+ !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),
+ __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
+ (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),
+ __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+ }
+})(function (require, exports) {
+ "use strict";
+ Object.defineProperty(exports, "__esModule", { value: true });
+ // THIS CODE IS GENERATED - DO NOT MODIFY
+ // See angular/tools/gulp-tasks/cldr/extract.js
+ var u = undefined;
+ function plural(n) {
+ if (n === 1)
+ return 1;
+ return 5;
+ }
+ exports.default = [
+ 'tr',
+ [['öö', 'ös'], ['ÖÖ', 'ÖS'], u],
+ [['ÖÖ', 'ÖS'], u, u],
+ [
+ ['P', 'P', 'S', 'Ç', 'P', 'C', 'C'], ['Paz', 'Pzt', 'Sal', 'Çar', 'Per', 'Cum', 'Cmt'],
+ ['Pazar', 'Pazartesi', 'Salı', 'Çarşamba', 'Perşembe', 'Cuma', 'Cumartesi'],
+ ['Pa', 'Pt', 'Sa', 'Ça', 'Pe', 'Cu', 'Ct']
+ ],
+ u,
+ [
+ ['O', 'Ş', 'M', 'N', 'M', 'H', 'T', 'A', 'E', 'E', 'K', 'A'],
+ ['Oca', 'Şub', 'Mar', 'Nis', 'May', 'Haz', 'Tem', 'Ağu', 'Eyl', 'Eki', 'Kas', 'Ara'],
+ [
+ 'Ocak', 'Şubat', 'Mart', 'Nisan', 'Mayıs', 'Haziran', 'Temmuz', 'Ağustos', 'Eylül', 'Ekim',
+ 'Kasım', 'Aralık'
+ ]
+ ],
+ u,
+ [['MÖ', 'MS'], u, ['Milattan Önce', 'Milattan Sonra']],
+ 1,
+ [6, 0],
+ ['d.MM.y', 'd MMM y', 'd MMMM y', 'd MMMM y EEEE'],
+ ['HH:mm', 'HH:mm:ss', 'HH:mm:ss z', 'HH:mm:ss zzzz'],
+ ['{1} {0}', u, u, u],
+ [',', '.', ';', '%', '+', '-', 'E', '×', '‰', '∞', 'NaN', ':'],
+ ['#,##0.###', '%#,##0', '¤#,##0.00', '#E0'],
+ 'TRY',
+ '₺',
+ 'Türk Lirası',
+ { 'AUD': ['AU$', '$'], 'RON': [u, 'L'], 'THB': ['฿'], 'TRY': ['₺'], 'TWD': ['NT$'] },
+ 'ltr',
+ plural
+ ];
+});
+//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21tb24vbG9jYWxlcy90ci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7Ozs7Ozs7Ozs7OztJQUVILHlDQUF5QztJQUN6QywrQ0FBK0M7SUFFL0MsSUFBTSxDQUFDLEdBQUcsU0FBUyxDQUFDO0lBRXBCLFNBQVMsTUFBTSxDQUFDLENBQVM7UUFDdkIsSUFBSSxDQUFDLEtBQUssQ0FBQztZQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3RCLE9BQU8sQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUVELGtCQUFlO1FBQ2IsSUFBSTtRQUNKLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNwQjtZQUNFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUM7WUFDdEYsQ0FBQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxXQUFXLENBQUM7WUFDM0UsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUM7U0FDM0M7UUFDRCxDQUFDO1FBQ0Q7WUFDRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDO1lBQzVELENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUM7WUFDcEY7Z0JBQ0UsTUFBTSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTTtnQkFDMUYsT0FBTyxFQUFFLFFBQVE7YUFDbEI7U0FDRjtRQUNELENBQUM7UUFDRCxDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLGVBQWUsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3RELENBQUM7UUFDRCxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDTixDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLGVBQWUsQ0FBQztRQUNsRCxDQUFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLGVBQWUsQ0FBQztRQUNwRCxDQUFDLFNBQVMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNwQixDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDO1FBQzlELENBQUMsV0FBVyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsS0FBSyxDQUFDO1FBQzNDLEtBQUs7UUFDTCxHQUFHO1FBQ0gsYUFBYTtRQUNiLEVBQUMsS0FBSyxFQUFFLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBQztRQUNsRixLQUFLO1FBQ0wsTUFBTTtLQUNQLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuLy8gVEhJUyBDT0RFIElTIEdFTkVSQVRFRCAtIERPIE5PVCBNT0RJRllcbi8vIFNlZSBhbmd1bGFyL3Rvb2xzL2d1bHAtdGFza3MvY2xkci9leHRyYWN0LmpzXG5cbmNvbnN0IHUgPSB1bmRlZmluZWQ7XG5cbmZ1bmN0aW9uIHBsdXJhbChuOiBudW1iZXIpOiBudW1iZXIge1xuICBpZiAobiA9PT0gMSkgcmV0dXJuIDE7XG4gIHJldHVybiA1O1xufVxuXG5leHBvcnQgZGVmYXVsdCBbXG4gICd0cicsXG4gIFtbJ8O2w7YnLCAnw7ZzJ10sIFsnw5bDlicsICfDllMnXSwgdV0sXG4gIFtbJ8OWw5YnLCAnw5ZTJ10sIHUsIHVdLFxuICBbXG4gICAgWydQJywgJ1AnLCAnUycsICfDhycsICdQJywgJ0MnLCAnQyddLCBbJ1BheicsICdQenQnLCAnU2FsJywgJ8OHYXInLCAnUGVyJywgJ0N1bScsICdDbXQnXSxcbiAgICBbJ1BhemFyJywgJ1BhemFydGVzaScsICdTYWzEsScsICfDh2FyxZ9hbWJhJywgJ1BlcsWfZW1iZScsICdDdW1hJywgJ0N1bWFydGVzaSddLFxuICAgIFsnUGEnLCAnUHQnLCAnU2EnLCAnw4dhJywgJ1BlJywgJ0N1JywgJ0N0J11cbiAgXSxcbiAgdSxcbiAgW1xuICAgIFsnTycsICfFnicsICdNJywgJ04nLCAnTScsICdIJywgJ1QnLCAnQScsICdFJywgJ0UnLCAnSycsICdBJ10sXG4gICAgWydPY2EnLCAnxZ51YicsICdNYXInLCAnTmlzJywgJ01heScsICdIYXonLCAnVGVtJywgJ0HEn3UnLCAnRXlsJywgJ0VraScsICdLYXMnLCAnQXJhJ10sXG4gICAgW1xuICAgICAgJ09jYWsnLCAnxZ51YmF0JywgJ01hcnQnLCAnTmlzYW4nLCAnTWF5xLFzJywgJ0hhemlyYW4nLCAnVGVtbXV6JywgJ0HEn3VzdG9zJywgJ0V5bMO8bCcsICdFa2ltJyxcbiAgICAgICdLYXPEsW0nLCAnQXJhbMSxaydcbiAgICBdXG4gIF0sXG4gIHUsXG4gIFtbJ03DlicsICdNUyddLCB1LCBbJ01pbGF0dGFuIMOWbmNlJywgJ01pbGF0dGFuIFNvbnJhJ11dLFxuICAxLFxuICBbNiwgMF0sXG4gIFsnZC5NTS55JywgJ2QgTU1NIHknLCAnZCBNTU1NIHknLCAnZCBNTU1NIHkgRUVFRSddLFxuICBbJ0hIOm1tJywgJ0hIOm1tOnNzJywgJ0hIOm1tOnNzIHonLCAnSEg6bW06c3Mgenp6eiddLFxuICBbJ3sxfSB7MH0nLCB1LCB1LCB1XSxcbiAgWycsJywgJy4nLCAnOycsICclJywgJysnLCAnLScsICdFJywgJ8OXJywgJ+KAsCcsICfiiJ4nLCAnTmFOJywgJzonXSxcbiAgWycjLCMjMC4jIyMnLCAnJSMsIyMwJywgJ8KkIywjIzAuMDAnLCAnI0UwJ10sXG4gICdUUlknLFxuICAn4oK6JyxcbiAgJ1TDvHJrIExpcmFzxLEnLFxuICB7J0FVRCc6IFsnQVUkJywgJyQnXSwgJ1JPTic6IFt1LCAnTCddLCAnVEhCJzogWyfguL8nXSwgJ1RSWSc6IFsn4oK6J10sICdUV0QnOiBbJ05UJCddfSxcbiAgJ2x0cicsXG4gIHBsdXJhbFxuXTtcbiJdfQ==
+
+/***/ }),
+
+/***/ "./node_modules/@angular/common/locales/uk.js":
+/*!****************************************************!*\
+ !*** ./node_modules/@angular/common/locales/uk.js ***!
+ \****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+(function (factory) {
+ if ( true && typeof module.exports === "object") {
+ var v = factory(null, exports);
+ if (v !== undefined) module.exports = v;
+ }
+ else if (true) {
+ !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),
+ __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
+ (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),
+ __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+ }
+})(function (require, exports) {
+ "use strict";
+ Object.defineProperty(exports, "__esModule", { value: true });
+ // THIS CODE IS GENERATED - DO NOT MODIFY
+ // See angular/tools/gulp-tasks/cldr/extract.js
+ var u = undefined;
+ function plural(n) {
+ var i = Math.floor(Math.abs(n)), v = n.toString().replace(/^[^.]*\.?/, '').length;
+ if (v === 0 && i % 10 === 1 && !(i % 100 === 11))
+ return 1;
+ if (v === 0 && i % 10 === Math.floor(i % 10) && i % 10 >= 2 && i % 10 <= 4 &&
+ !(i % 100 >= 12 && i % 100 <= 14))
+ return 3;
+ if (v === 0 && i % 10 === 0 ||
+ v === 0 && i % 10 === Math.floor(i % 10) && i % 10 >= 5 && i % 10 <= 9 ||
+ v === 0 && i % 100 === Math.floor(i % 100) && i % 100 >= 11 && i % 100 <= 14)
+ return 4;
+ return 5;
+ }
+ exports.default = [
+ 'uk',
+ [['дп', 'пп'], u, u],
+ u,
+ [
+ ['Н', 'П', 'В', 'С', 'Ч', 'П', 'С'], ['нд', 'пн', 'вт', 'ср', 'чт', 'пт', 'сб'],
+ ['неділя', 'понеділок', 'вівторок', 'середа', 'четвер', 'пʼятниця', 'субота'],
+ ['нд', 'пн', 'вт', 'ср', 'чт', 'пт', 'сб']
+ ],
+ u,
+ [
+ ['с', 'л', 'б', 'к', 'т', 'ч', 'л', 'с', 'в', 'ж', 'л', 'г'],
+ [
+ 'січ.', 'лют.', 'бер.', 'квіт.', 'трав.', 'черв.', 'лип.', 'серп.', 'вер.', 'жовт.', 'лист.',
+ 'груд.'
+ ],
+ [
+ 'січня', 'лютого', 'березня', 'квітня', 'травня', 'червня', 'липня', 'серпня', 'вересня',
+ 'жовтня', 'листопада', 'грудня'
+ ]
+ ],
+ [
+ ['С', 'Л', 'Б', 'К', 'Т', 'Ч', 'Л', 'С', 'В', 'Ж', 'Л', 'Г'],
+ ['січ', 'лют', 'бер', 'кві', 'тра', 'чер', 'лип', 'сер', 'вер', 'жов', 'лис', 'гру'],
+ [
+ 'січень', 'лютий', 'березень', 'квітень', 'травень', 'червень', 'липень', 'серпень',
+ 'вересень', 'жовтень', 'листопад', 'грудень'
+ ]
+ ],
+ [['до н.е.', 'н.е.'], ['до н. е.', 'н. е.'], ['до нашої ери', 'нашої ери']],
+ 1,
+ [6, 0],
+ ['dd.MM.yy', 'd MMM y \'р\'.', 'd MMMM y \'р\'.', 'EEEE, d MMMM y \'р\'.'],
+ ['HH:mm', 'HH:mm:ss', 'HH:mm:ss z', 'HH:mm:ss zzzz'],
+ ['{1}, {0}', u, '{1} \'о\' {0}', u],
+ [',', ' ', ';', '%', '+', '-', 'Е', '×', '‰', '∞', 'NaN', ':'],
+ ['#,##0.###', '#,##0%', '#,##0.00 ¤', '#E0'],
+ 'UAH',
+ '₴',
+ 'українська гривня',
+ {
+ 'AUD': [u, '$'],
+ 'BRL': [u, 'R$'],
+ 'CAD': [u, '$'],
+ 'CNY': [u, '¥'],
+ 'EUR': [u, '€'],
+ 'GBP': [u, '£'],
+ 'HKD': [u, '$'],
+ 'ILS': [u, '₪'],
+ 'INR': [u, '₹'],
+ 'KRW': [u, '₩'],
+ 'MXN': [u, '$'],
+ 'NZD': [u, '$'],
+ 'TWD': [u, '$'],
+ 'UAH': ['₴'],
+ 'UAK': ['крб.'],
+ 'USD': [u, '$'],
+ 'VND': [u, '₫'],
+ 'XCD': [u, '$']
+ },
+ 'ltr',
+ plural
+ ];
+});
+//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidWsuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21tb24vbG9jYWxlcy91ay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7Ozs7Ozs7Ozs7OztJQUVILHlDQUF5QztJQUN6QywrQ0FBK0M7SUFFL0MsSUFBTSxDQUFDLEdBQUcsU0FBUyxDQUFDO0lBRXBCLFNBQVMsTUFBTSxDQUFDLENBQVM7UUFDdkIsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUNsRixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEtBQUssRUFBRSxDQUFDO1lBQUUsT0FBTyxDQUFDLENBQUM7UUFDM0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDO1lBQ3RFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxJQUFJLEVBQUUsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLEVBQUUsQ0FBQztZQUNuQyxPQUFPLENBQUMsQ0FBQztRQUNYLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUM7WUFDdkIsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEVB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QUUsQ0FBQyxDQUFDO1FBQ25DLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUM7UUFDOUQsQ0FBQyxXQUFXLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxLQUFLLENBQUM7UUFDNUMsS0FBSztRQUNMLEdBQUc7UUFDSCxtQkFBbUI7UUFDbkI7WUFDRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDO1lBQ2YsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQztZQUNoQixLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDO1lBQ2YsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQztZQUNmLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUM7WUFDZixLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDO1lBQ2YsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQztZQUNmLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUM7WUFDZixLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDO1lBQ2YsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQztZQUNmLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUM7WUFDZixLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDO1lBQ2YsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQztZQUNmLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQztZQUNaLEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQztZQUNmLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUM7WUFDZixLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDO1lBQ2YsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQztTQUNoQjtRQUNELEtBQUs7UUFDTCxNQUFNO0tBQ1AsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuXG4vLyBUSElTIENPREUgSVMgR0VORVJBVEVEIC0gRE8gTk9UIE1PRElGWVxuLy8gU2VlIGFuZ3VsYXIvdG9vbHMvZ3VscC10YXNrcy9jbGRyL2V4dHJhY3QuanNcblxuY29uc3QgdSA9IHVuZGVmaW5lZDtcblxuZnVuY3Rpb24gcGx1cmFsKG46IG51bWJlcik6IG51bWJlciB7XG4gIGxldCBpID0gTWF0aC5mbG9vcihNYXRoLmFicyhuKSksIHYgPSBuLnRvU3RyaW5nKCkucmVwbGFjZSgvXlteLl0qXFwuPy8sICcnKS5sZW5ndGg7XG4gIGlmICh2ID09PSAwICYmIGkgJSAxMCA9PT0gMSAmJiAhKGkgJSAxMDAgPT09IDExKSkgcmV0dXJuIDE7XG4gIGlmICh2ID09PSAwICYmIGkgJSAxMCA9PT0gTWF0aC5mbG9vcihpICUgMTApICYmIGkgJSAxMCA+PSAyICYmIGkgJSAxMCA8PSA0ICYmXG4gICAgICAhKGkgJSAxMDAgPj0gMTIgJiYgaSAlIDEwMCA8PSAxNCkpXG4gICAgcmV0dXJuIDM7XG4gIGlmICh2ID09PSAwICYmIGkgJSAxMCA9PT0gMCB8fFxuICAgICAgdiA9PT0gMCAmJiBpICUgMTAgPT09IE1hdGguZmxvb3IoaSAlIDEwKSAmJiBpICUgMTAgPj0gNSAmJiBpICUgMTAgPD0gOSB8fFxuICAgICAgdiA9PT0gMCAmJiBpICUgMTAwID09PSBNYXRoLmZsb29yKGkgJSAxMDApICYmIGkgJSAxMDAgPj0gMTEgJiYgaSAlIDEwMCA8PSAxNClcbiAgICByZXR1cm4gNDtcbiAgcmV0dXJuIDU7XG59XG5cbmV4cG9ydCBkZWZhdWx0IFtcbiAgJ3VrJyxcbiAgW1sn0LTQvycsICfQv9C/J10sIHUsIHVdLFxuICB1LFxuICBbXG4gICAgWyfQnScsICfQnycsICfQkicsICfQoScsICfQpycsICfQnycsICfQoSddLCBbJ9C90LQnLCAn0L/QvScsICfQstGCJywgJ9GB0YAnLCAn0YfRgicsICfQv9GCJywgJ9GB0LEnXSxcbiAgICBbJ9C90LXQtNGW0LvRjycsICfQv9C+0L3QtdC00ZbQu9C+0LonLCAn0LLRltCy0YLQvtGA0L7QuicsICfRgdC10YDQtdC00LAnLCAn0YfQtdGC0LLQtdGAJywgJ9C/yrzRj9GC0L3QuNGG0Y8nLCAn0YHRg9Cx0L7RgtCwJ10sXG4gICAgWyfQvdC0JywgJ9C/0L0nLCAn0LLRgicsICfRgdGAJywgJ9GH0YInLCAn0L/RgicsICfRgdCxJ11cbiAgXSxcbiAgdSxcbiAgW1xuICAgIFsn0YEnLCAn0LsnLCAn0LEnLCAn0LonLCAn0YInLCAn0YcnLCAn0LsnLCAn0YEnLCAn0LInLCAn0LYnLCAn0LsnLCAn0LMnXSxcbiAgICBbXG4gICAgICAn0YHRltGHLicsICfQu9GO0YIuJywgJ9Cx0LXRgC4nLCAn0LrQstGW0YIuJywgJ9GC0YDQsNCyLicsICfRh9C10YDQsi4nLCAn0LvQuNC/LicsICfRgdC10YDQvy4nLCAn0LLQtdGALicsICfQttC+0LLRgi4nLCAn0LvQuNGB0YIuJyxcbiAgICAgICfQs9GA0YPQtC4nXG4gICAgXSxcbiAgICBbXG4gICAgICAn0YHRltGH0L3RjycsICfQu9GO0YLQvtCz0L4nLCAn0LHQtdGA0LXQt9C90Y8nLCAn0LrQstGW0YLQvdGPJywgJ9GC0YDQsNCy0L3RjycsICfRh9C10YDQstC90Y8nLCAn0LvQuNC/0L3RjycsICfRgdC10YDQv9C90Y8nLCAn0LLQtdGA0LXRgdC90Y8nLFxuICAgICAgJ9C20L7QstGC0L3RjycsICfQu9C40YHRgtC+0L/QsNC00LAnLCAn0LPRgNGD0LTQvdGPJ1xuICAgIF1cbiAgXSxcbiAgW1xuICAgIFsn0KEnLCAn0JsnLCAn0JEnLCAn0JonLCAn0KInLCAn0KcnLCAn0JsnLCAn0KEnLCAn0JInLCAn0JYnLCAn0JsnLCAn0JMnXSxcbiAgICBbJ9GB0ZbRhycsICfQu9GO0YInLCAn0LHQtdGAJywgJ9C60LLRlicsICfRgtGA0LAnLCAn0YfQtdGAJywgJ9C70LjQvycsICfRgdC10YAnLCAn0LLQtdGAJywgJ9C20L7QsicsICfQu9C40YEnLCAn0LPRgNGDJ10sXG4gICAgW1xuICAgICAgJ9GB0ZbRh9C10L3RjCcsICfQu9GO0YLQuNC5JywgJ9Cx0LXRgNC10LfQtdC90YwnLCAn0LrQstGW0YLQtdC90YwnLCAn0YLRgNCw0LLQtdC90YwnLCAn0YfQtdGA0LLQtdC90YwnLCAn0LvQuNC/0LXQvdGMJywgJ9GB0LXRgNC/0LXQvdGMJyxcbiAgICAgICfQstC10YDQtdGB0LXQvdGMJywgJ9C20L7QstGC0LXQvdGMJywgJ9C70LjRgdGC0L7Qv9Cw0LQnLCAn0LPRgNGD0LTQtdC90YwnXG4gICAgXVxuICBdLFxuICBbWyfQtNC+INC9LtC1LicsICfQvS7QtS4nXSwgWyfQtNC+INC9LiDQtS4nLCAn0L0uINC1LiddLCBbJ9C00L4g0L3QsNGI0L7RlyDQtdGA0LgnLCAn0L3QsNGI0L7RlyDQtdGA0LgnXV0sXG4gIDEsXG4gIFs2LCAwXSxcbiAgWydkZC5NTS55eScsICdkIE1NTSB5IFxcJ9GAXFwnLicsICdkIE1NTU0geSBcXCfRgFxcJy4nLCAnRUVFRSwgZCBNTU1NIHkgXFwn0YBcXCcuJ10sXG4gIFsnSEg6bW0nLCAnSEg6bW06c3MnLCAnSEg6bW06c3MgeicsICdISDptbTpzcyB6enp6J10sXG4gIFsnezF9LCB7MH0nLCB1LCAnezF9IFxcJ9C+XFwnIHswfScsIHVdLFxuICBbJywnLCAnwqAnLCAnOycsICclJywgJysnLCAnLScsICfQlScsICfDlycsICfigLAnLCAn4oieJywgJ05hTicsICc6J10sXG4gIFsnIywjIzAuIyMjJywgJyMsIyMwJScsICcjLCMjMC4wMMKgwqQnLCAnI0UwJ10sXG4gICdVQUgnLFxuICAn4oK0JyxcbiAgJ9GD0LrRgNCw0ZfQvdGB0YzQutCwINCz0YDQuNCy0L3RjycsXG4gIHtcbiAgICAnQVVEJzogW3UsICckJ10sXG4gICAgJ0JSTCc6IFt1LCAnUiQnXSxcbiAgICAnQ0FEJzogW3UsICckJ10sXG4gICAgJ0NOWSc6IFt1LCAnwqUnXSxcbiAgICAnRVVSJzogW3UsICfigqwnXSxcbiAgICAnR0JQJzogW3UsICfCoyddLFxuICAgICdIS0QnOiBbdSwgJyQnXSxcbiAgICAnSUxTJzogW3UsICfigqonXSxcbiAgICAnSU5SJzogW3UsICfigrknXSxcbiAgICAnS1JXJzogW3UsICfigqknXSxcbiAgICAnTVhOJzogW3UsICckJ10sXG4gICAgJ05aRCc6IFt1LCAnJCddLFxuICAgICdUV0QnOiBbdSwgJyQnXSxcbiAgICAnVUFIJzogWyfigrQnXSxcbiAgICAnVUFLJzogWyfQutGA0LEuJ10sXG4gICAgJ1VTRCc6IFt1LCAnJCddLFxuICAgICdWTkQnOiBbdSwgJ+KCqyddLFxuICAgICdYQ0QnOiBbdSwgJyQnXVxuICB9LFxuICAnbHRyJyxcbiAgcGx1cmFsXG5dO1xuIl19
+
+/***/ }),
+
+/***/ "./node_modules/@angular/common/locales/vi.js":
+/*!****************************************************!*\
+ !*** ./node_modules/@angular/common/locales/vi.js ***!
+ \****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+(function (factory) {
+ if ( true && typeof module.exports === "object") {
+ var v = factory(null, exports);
+ if (v !== undefined) module.exports = v;
+ }
+ else if (true) {
+ !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),
+ __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
+ (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),
+ __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+ }
+})(function (require, exports) {
+ "use strict";
+ Object.defineProperty(exports, "__esModule", { value: true });
+ // THIS CODE IS GENERATED - DO NOT MODIFY
+ // See angular/tools/gulp-tasks/cldr/extract.js
+ var u = undefined;
+ function plural(n) {
+ return 5;
+ }
+ exports.default = [
+ 'vi',
+ [['s', 'c'], ['SA', 'CH'], u],
+ [['SA', 'CH'], u, u],
+ [
+ ['CN', 'T2', 'T3', 'T4', 'T5', 'T6', 'T7'],
+ ['CN', 'Th 2', 'Th 3', 'Th 4', 'Th 5', 'Th 6', 'Th 7'],
+ ['Chủ Nhật', 'Thứ Hai', 'Thứ Ba', 'Thứ Tư', 'Thứ Năm', 'Thứ Sáu', 'Thứ Bảy'],
+ ['CN', 'T2', 'T3', 'T4', 'T5', 'T6', 'T7']
+ ],
+ u,
+ [
+ ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],
+ [
+ 'thg 1', 'thg 2', 'thg 3', 'thg 4', 'thg 5', 'thg 6', 'thg 7', 'thg 8', 'thg 9', 'thg 10',
+ 'thg 11', 'thg 12'
+ ],
+ [
+ 'tháng 1', 'tháng 2', 'tháng 3', 'tháng 4', 'tháng 5', 'tháng 6', 'tháng 7', 'tháng 8',
+ 'tháng 9', 'tháng 10', 'tháng 11', 'tháng 12'
+ ]
+ ],
+ [
+ ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],
+ [
+ 'Thg 1', 'Thg 2', 'Thg 3', 'Thg 4', 'Thg 5', 'Thg 6', 'Thg 7', 'Thg 8', 'Thg 9', 'Thg 10',
+ 'Thg 11', 'Thg 12'
+ ],
+ [
+ 'Tháng 1', 'Tháng 2', 'Tháng 3', 'Tháng 4', 'Tháng 5', 'Tháng 6', 'Tháng 7', 'Tháng 8',
+ 'Tháng 9', 'Tháng 10', 'Tháng 11', 'Tháng 12'
+ ]
+ ],
+ [['tr. CN', 'sau CN'], ['Trước CN', 'sau CN'], u],
+ 1,
+ [6, 0],
+ ['dd/MM/y', 'd MMM, y', 'd MMMM, y', 'EEEE, d MMMM, y'],
+ ['HH:mm', 'HH:mm:ss', 'HH:mm:ss z', 'HH:mm:ss zzzz'],
+ ['{0}, {1}', u, '{0} {1}', u],
+ [',', '.', ';', '%', '+', '-', 'E', '×', '‰', '∞', 'NaN', ':'],
+ ['#,##0.###', '#,##0%', '#,##0.00 ¤', '#E0'],
+ 'VND',
+ '₫',
+ 'Đồng Việt Nam',
+ {
+ 'AUD': ['AU$', '$'],
+ 'JPY': ['JP¥', '¥'],
+ 'THB': ['฿'],
+ 'TWD': ['NT$'],
+ 'USD': ['US$', '$'],
+ 'XXX': []
+ },
+ 'ltr',
+ plural
+ ];
+});
+//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21tb24vbG9jYWxlcy92aS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7Ozs7Ozs7Ozs7OztJQUVILHlDQUF5QztJQUN6QywrQ0FBK0M7SUFFL0MsSUFBTSxDQUFDLEdBQUcsU0FBUyxDQUFDO0lBRXBCLFNBQVMsTUFBTSxDQUFDLENBQVM7UUFDdkIsT0FBTyxDQUFDLENBQUM7SUFDWCxDQUFDO0lBRUQsa0JBQWU7UUFDYixJQUFJO1FBQ0osQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDN0IsQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3BCO1lBQ0UsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUM7WUFDMUMsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUM7WUFDdEQsQ0FBQyxVQUFVLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUM7WUFDNUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUM7U0FDM0M7UUFDRCxDQUFDO1FBQ0Q7WUFDRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDO1lBQy9EO2dCQUNFLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFFBQVE7Z0JBQ3pGLFFBQVEsRUFBRSxRQUFRO2FBQ25CO1lBQ0Q7Z0JBQ0UsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVM7Z0JBQ3RGLFNBQVMsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVU7YUFDOUM7U0FDRjtRQUNEO1lBQ0UsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQztZQUMvRDtnQkFDRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxRQUFRO2dCQUN6RixRQUFRLEVBQUUsUUFBUTthQUNuQjtZQUNEO2dCQUNFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTO2dCQUN0RixTQUFTLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVO2FBQzlDO1NBQ0Y7UUFDRCxDQUFDLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxFQUFFLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNqRCxDQUFDO1FBQ0QsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ04sQ0FBQyxTQUFTLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxpQkFBaUIsQ0FBQztRQUN2RCxDQUFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLGVBQWUsQ0FBQztRQUNwRCxDQUFDLFVBQVUsRUFBRSxDQUFDLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztRQUM3QixDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDO1FBQzlELENBQUMsV0FBVyxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsS0FBSyxDQUFDO1FBQzVDLEtBQUs7UUFDTCxHQUFHO1FBQ0gsZUFBZTtRQUNmO1lBQ0UsS0FBSyxFQUFFLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQztZQUNuQixLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDO1lBQ25CLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQztZQUNaLEtBQUssRUFBRSxDQUFDLEtBQUssQ0FBQztZQUNkLEtBQUssRUFBRSxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUM7WUFDbkIsS0FBSyxFQUFFLEVBQUU7U0FDVjtRQUNELEtBQUs7UUFDTCxNQUFNO0tBQ1AsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuXG4vLyBUSElTIENPREUgSVMgR0VORVJBVEVEIC0gRE8gTk9UIE1PRElGWVxuLy8gU2VlIGFuZ3VsYXIvdG9vbHMvZ3VscC10YXNrcy9jbGRyL2V4dHJhY3QuanNcblxuY29uc3QgdSA9IHVuZGVmaW5lZDtcblxuZnVuY3Rpb24gcGx1cmFsKG46IG51bWJlcik6IG51bWJlciB7XG4gIHJldHVybiA1O1xufVxuXG5leHBvcnQgZGVmYXVsdCBbXG4gICd2aScsXG4gIFtbJ3MnLCAnYyddLCBbJ1NBJywgJ0NIJ10sIHVdLFxuICBbWydTQScsICdDSCddLCB1LCB1XSxcbiAgW1xuICAgIFsnQ04nLCAnVDInLCAnVDMnLCAnVDQnLCAnVDUnLCAnVDYnLCAnVDcnXSxcbiAgICBbJ0NOJywgJ1RoIDInLCAnVGggMycsICdUaCA0JywgJ1RoIDUnLCAnVGggNicsICdUaCA3J10sXG4gICAgWydDaOG7pyBOaOG6rXQnLCAnVGjhu6kgSGFpJywgJ1Ro4bupIEJhJywgJ1Ro4bupIFTGsCcsICdUaOG7qSBOxINtJywgJ1Ro4bupIFPDoXUnLCAnVGjhu6kgQuG6o3knXSxcbiAgICBbJ0NOJywgJ1QyJywgJ1QzJywgJ1Q0JywgJ1Q1JywgJ1Q2JywgJ1Q3J11cbiAgXSxcbiAgdSxcbiAgW1xuICAgIFsnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLCAnNycsICc4JywgJzknLCAnMTAnLCAnMTEnLCAnMTInXSxcbiAgICBbXG4gICAgICAndGhnIDEnLCAndGhnIDInLCAndGhnIDMnLCAndGhnIDQnLCAndGhnIDUnLCAndGhnIDYnLCAndGhnIDcnLCAndGhnIDgnLCAndGhnIDknLCAndGhnIDEwJyxcbiAgICAgICd0aGcgMTEnLCAndGhnIDEyJ1xuICAgIF0sXG4gICAgW1xuICAgICAgJ3Row6FuZyAxJywgJ3Row6FuZyAyJywgJ3Row6FuZyAzJywgJ3Row6FuZyA0JywgJ3Row6FuZyA1JywgJ3Row6FuZyA2JywgJ3Row6FuZyA3JywgJ3Row6FuZyA4JyxcbiAgICAgICd0aMOhbmcgOScsICd0aMOhbmcgMTAnLCAndGjDoW5nIDExJywgJ3Row6FuZyAxMidcbiAgICBdXG4gIF0sXG4gIFtcbiAgICBbJzEnLCAnMicsICczJywgJzQnLCAnNScsICc2JywgJzcnLCAnOCcsICc5JywgJzEwJywgJzExJywgJzEyJ10sXG4gICAgW1xuICAgICAgJ1RoZyAxJywgJ1RoZyAyJywgJ1RoZyAzJywgJ1RoZyA0JywgJ1RoZyA1JywgJ1RoZyA2JywgJ1RoZyA3JywgJ1RoZyA4JywgJ1RoZyA5JywgJ1RoZyAxMCcsXG4gICAgICAnVGhnIDExJywgJ1RoZyAxMidcbiAgICBdLFxuICAgIFtcbiAgICAgICdUaMOhbmcgMScsICdUaMOhbmcgMicsICdUaMOhbmcgMycsICdUaMOhbmcgNCcsICdUaMOhbmcgNScsICdUaMOhbmcgNicsICdUaMOhbmcgNycsICdUaMOhbmcgOCcsXG4gICAgICAnVGjDoW5nIDknLCAnVGjDoW5nIDEwJywgJ1Row6FuZyAxMScsICdUaMOhbmcgMTInXG4gICAgXVxuICBdLFxuICBbWyd0ci4gQ04nLCAnc2F1IENOJ10sIFsnVHLGsOG7m2MgQ04nLCAnc2F1IENOJ10sIHVdLFxuICAxLFxuICBbNiwgMF0sXG4gIFsnZGQvTU0veScsICdkIE1NTSwgeScsICdkIE1NTU0sIHknLCAnRUVFRSwgZCBNTU1NLCB5J10sXG4gIFsnSEg6bW0nLCAnSEg6bW06c3MnLCAnSEg6bW06c3MgeicsICdISDptbTpzcyB6enp6J10sXG4gIFsnezB9LCB7MX0nLCB1LCAnezB9IHsxfScsIHVdLFxuICBbJywnLCAnLicsICc7JywgJyUnLCAnKycsICctJywgJ0UnLCAnw5cnLCAn4oCwJywgJ+KInicsICdOYU4nLCAnOiddLFxuICBbJyMsIyMwLiMjIycsICcjLCMjMCUnLCAnIywjIzAuMDDCoMKkJywgJyNFMCddLFxuICAnVk5EJyxcbiAgJ+KCqycsXG4gICfEkOG7k25nIFZp4buHdCBOYW0nLFxuICB7XG4gICAgJ0FVRCc6IFsnQVUkJywgJyQnXSxcbiAgICAnSlBZJzogWydKUMKlJywgJ8KlJ10sXG4gICAgJ1RIQic6IFsn4Li/J10sXG4gICAgJ1RXRCc6IFsnTlQkJ10sXG4gICAgJ1VTRCc6IFsnVVMkJywgJyQnXSxcbiAgICAnWFhYJzogW11cbiAgfSxcbiAgJ2x0cicsXG4gIHBsdXJhbFxuXTtcbiJdfQ==
+
+/***/ }),
+
+/***/ "./node_modules/@angular/common/locales/zh-Hans.js":
+/*!*********************************************************!*\
+ !*** ./node_modules/@angular/common/locales/zh-Hans.js ***!
+ \*********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+(function (factory) {
+ if ( true && typeof module.exports === "object") {
+ var v = factory(null, exports);
+ if (v !== undefined) module.exports = v;
+ }
+ else if (true) {
+ !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),
+ __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
+ (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),
+ __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+ }
+})(function (require, exports) {
+ "use strict";
+ Object.defineProperty(exports, "__esModule", { value: true });
+ // THIS CODE IS GENERATED - DO NOT MODIFY
+ // See angular/tools/gulp-tasks/cldr/extract.js
+ var u = undefined;
+ function plural(n) {
+ return 5;
+ }
+ exports.default = [
+ 'zh-Hans',
+ [['上午', '下午'], u, u],
+ u,
+ [
+ ['日', '一', '二', '三', '四', '五', '六'],
+ ['周日', '周一', '周二', '周三', '周四', '周五', '周六'],
+ ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'],
+ ['周日', '周一', '周二', '周三', '周四', '周五', '周六']
+ ],
+ u,
+ [
+ ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],
+ ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'],
+ [
+ '一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月',
+ '十二月'
+ ]
+ ],
+ u,
+ [['公元前', '公元'], u, u],
+ 0,
+ [6, 0],
+ ['y/M/d', 'y年M月d日', u, 'y年M月d日EEEE'],
+ ['ah:mm', 'ah:mm:ss', 'z ah:mm:ss', 'zzzz ah:mm:ss'],
+ ['{1} {0}', u, u, u],
+ ['.', ',', ';', '%', '+', '-', 'E', '×', '‰', '∞', 'NaN', ':'],
+ ['#,##0.###', '#,##0%', '¤#,##0.00', '#E0'],
+ 'CNY',
+ '¥',
+ '人民币',
+ {
+ 'AUD': ['AU$', '$'],
+ 'CNY': ['¥'],
+ 'ILR': ['ILS'],
+ 'JPY': ['JP¥', '¥'],
+ 'KRW': ['₩', '₩'],
+ 'TWD': ['NT$'],
+ 'USD': ['US$', '$'],
+ 'XXX': []
+ },
+ 'ltr',
+ plural
+ ];
+});
+//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiemgtSGFucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvbW1vbi9sb2NhbGVzL3poLUhhbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HOzs7Ozs7Ozs7Ozs7SUFFSCx5Q0FBeUM7SUFDekMsK0NBQStDO0lBRS9DLElBQU0sQ0FBQyxHQUFHLFNBQVMsQ0FBQztJQUVwQixTQUFTLE1BQU0sQ0FBQyxDQUFTO1FBQ3ZCLE9BQU8sQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUVELGtCQUFlO1FBQ2IsU0FBUztRQUNULENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNwQixDQUFDO1FBQ0Q7WUFDRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQztZQUNuQyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQztZQUMxQyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQztZQUNqRCxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQztTQUMzQztRQUNELENBQUM7UUFDRDtZQUNFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUM7WUFDL0QsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQztZQUMzRTtnQkFDRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSztnQkFDakUsS0FBSzthQUNOO1NBQ0Y7UUFDRCxDQUFDO1FBQ0QsQ0FBQyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3JCLENBQUM7UUFDRCxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDTixDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLFlBQVksQ0FBQztRQUNwQyxDQUFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLGVBQWUsQ0FBQztRQUNwRCxDQUFDLFNBQVMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNwQixDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDO1FBQzlELENBQUMsV0FBVyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsS0FBSyxDQUFDO1FBQzNDLEtBQUs7UUFDTCxHQUFHO1FBQ0gsS0FBSztRQUNMO1lBQ0UsS0FBSyxFQUFFLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQztZQUNuQixLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUM7WUFDWixLQUFLLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDZCxLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDO1lBQ25CLEtBQUssRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUM7WUFDakIsS0FBSyxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ2QsS0FBSyxFQUFFLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQztZQUNuQixLQUFLLEVBQUUsRUFBRTtTQUNWO1FBQ0QsS0FBSztRQUNMLE1BQU07S0FDUCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbi8vIFRISVMgQ09ERSBJUyBHRU5FUkFURUQgLSBETyBOT1QgTU9ESUZZXG4vLyBTZWUgYW5ndWxhci90b29scy9ndWxwLXRhc2tzL2NsZHIvZXh0cmFjdC5qc1xuXG5jb25zdCB1ID0gdW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBwbHVyYWwobjogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuIDU7XG59XG5cbmV4cG9ydCBkZWZhdWx0IFtcbiAgJ3poLUhhbnMnLFxuICBbWyfkuIrljYgnLCAn5LiL5Y2IJ10sIHUsIHVdLFxuICB1LFxuICBbXG4gICAgWyfml6UnLCAn5LiAJywgJ+S6jCcsICfkuIknLCAn5ZubJywgJ+S6lCcsICflha0nXSxcbiAgICBbJ+WRqOaXpScsICflkajkuIAnLCAn5ZGo5LqMJywgJ+WRqOS4iScsICflkajlm5snLCAn5ZGo5LqUJywgJ+WRqOWFrSddLFxuICAgIFsn5pif5pyf5pelJywgJ+aYn+acn+S4gCcsICfmmJ/mnJ/kuownLCAn5pif5pyf5LiJJywgJ+aYn+acn+WbmycsICfmmJ/mnJ/kupQnLCAn5pif5pyf5YWtJ10sXG4gICAgWyflkajml6UnLCAn5ZGo5LiAJywgJ+WRqOS6jCcsICflkajkuIknLCAn5ZGo5ZubJywgJ+WRqOS6lCcsICflkajlha0nXVxuICBdLFxuICB1LFxuICBbXG4gICAgWycxJywgJzInLCAnMycsICc0JywgJzUnLCAnNicsICc3JywgJzgnLCAnOScsICcxMCcsICcxMScsICcxMiddLFxuICAgIFsnMeaciCcsICcy5pyIJywgJzPmnIgnLCAnNOaciCcsICc15pyIJywgJzbmnIgnLCAnN+aciCcsICc45pyIJywgJznmnIgnLCAnMTDmnIgnLCAnMTHmnIgnLCAnMTLmnIgnXSxcbiAgICBbXG4gICAgICAn5LiA5pyIJywgJ+S6jOaciCcsICfkuInmnIgnLCAn5Zub5pyIJywgJ+S6lOaciCcsICflha3mnIgnLCAn5LiD5pyIJywgJ+WFq+aciCcsICfkuZ3mnIgnLCAn5Y2B5pyIJywgJ+WNgeS4gOaciCcsXG4gICAgICAn5Y2B5LqM5pyIJ1xuICAgIF1cbiAgXSxcbiAgdSxcbiAgW1sn5YWs5YWD5YmNJywgJ+WFrOWFgyddLCB1LCB1XSxcbiAgMCxcbiAgWzYsIDBdLFxuICBbJ3kvTS9kJywgJ3nlubRN5pyIZOaXpScsIHUsICd55bm0TeaciGTml6VFRUVFJ10sXG4gIFsnYWg6bW0nLCAnYWg6bW06c3MnLCAneiBhaDptbTpzcycsICd6enp6IGFoOm1tOnNzJ10sXG4gIFsnezF9IHswfScsIHUsIHUsIHVdLFxuICBbJy4nLCAnLCcsICc7JywgJyUnLCAnKycsICctJywgJ0UnLCAnw5cnLCAn4oCwJywgJ+KInicsICdOYU4nLCAnOiddLFxuICBbJyMsIyMwLiMjIycsICcjLCMjMCUnLCAnwqQjLCMjMC4wMCcsICcjRTAnXSxcbiAgJ0NOWScsXG4gICfCpScsXG4gICfkurrmsJHluIEnLFxuICB7XG4gICAgJ0FVRCc6IFsnQVUkJywgJyQnXSxcbiAgICAnQ05ZJzogWyfCpSddLFxuICAgICdJTFInOiBbJ0lMUyddLFxuICAgICdKUFknOiBbJ0pQwqUnLCAnwqUnXSxcbiAgICAnS1JXJzogWyfvv6YnLCAn4oKpJ10sXG4gICAgJ1RXRCc6IFsnTlQkJ10sXG4gICAgJ1VTRCc6IFsnVVMkJywgJyQnXSxcbiAgICAnWFhYJzogW11cbiAgfSxcbiAgJ2x0cicsXG4gIHBsdXJhbFxuXTtcbiJdfQ==
+
+/***/ }),
+
+/***/ "./node_modules/@angular/common/locales/zh-Hant.js":
+/*!*********************************************************!*\
+ !*** ./node_modules/@angular/common/locales/zh-Hant.js ***!
+ \*********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+(function (factory) {
+ if ( true && typeof module.exports === "object") {
+ var v = factory(null, exports);
+ if (v !== undefined) module.exports = v;
+ }
+ else if (true) {
+ !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),
+ __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
+ (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),
+ __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+ }
+})(function (require, exports) {
+ "use strict";
+ Object.defineProperty(exports, "__esModule", { value: true });
+ // THIS CODE IS GENERATED - DO NOT MODIFY
+ // See angular/tools/gulp-tasks/cldr/extract.js
+ var u = undefined;
+ function plural(n) {
+ return 5;
+ }
+ exports.default = [
+ 'zh-Hant',
+ [['上午', '下午'], u, u],
+ u,
+ [
+ ['日', '一', '二', '三', '四', '五', '六'],
+ ['週日', '週一', '週二', '週三', '週四', '週五', '週六'],
+ ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'],
+ ['日', '一', '二', '三', '四', '五', '六']
+ ],
+ u,
+ [
+ ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],
+ ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'], u
+ ],
+ u,
+ [['西元前', '西元'], u, u],
+ 0,
+ [6, 0],
+ ['y/M/d', 'y年M月d日', u, 'y年M月d日 EEEE'],
+ ['ah:mm', 'ah:mm:ss', 'ah:mm:ss [z]', 'ah:mm:ss [zzzz]'],
+ ['{1} {0}', u, u, u],
+ ['.', ',', ';', '%', '+', '-', 'E', '×', '‰', '∞', '非數值', ':'],
+ ['#,##0.###', '#,##0%', '¤#,##0.00', '#E0'],
+ 'TWD',
+ '$',
+ '新台幣',
+ {
+ 'AUD': ['AU$', '$'],
+ 'KRW': ['₩', '₩'],
+ 'RON': [u, 'L'],
+ 'TWD': ['$'],
+ 'USD': ['US$', '$'],
+ 'XXX': []
+ },
+ 'ltr',
+ plural
+ ];
+});
+//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiemgtSGFudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvbW1vbi9sb2NhbGVzL3poLUhhbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HOzs7Ozs7Ozs7Ozs7SUFFSCx5Q0FBeUM7SUFDekMsK0NBQStDO0lBRS9DLElBQU0sQ0FBQyxHQUFHLFNBQVMsQ0FBQztJQUVwQixTQUFTLE1BQU0sQ0FBQyxDQUFTO1FBQ3ZCLE9BQU8sQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUVELGtCQUFlO1FBQ2IsU0FBUztRQUNULENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNwQixDQUFDO1FBQ0Q7WUFDRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQztZQUNuQyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQztZQUMxQyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQztZQUNqRCxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQztTQUNwQztRQUNELENBQUM7UUFDRDtZQUNFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUM7WUFDL0QsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUM7U0FDL0U7UUFDRCxDQUFDO1FBQ0QsQ0FBQyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3JCLENBQUM7UUFDRCxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDTixDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLGFBQWEsQ0FBQztRQUNyQyxDQUFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsY0FBYyxFQUFFLGlCQUFpQixDQUFDO1FBQ3hELENBQUMsU0FBUyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3BCLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUM7UUFDOUQsQ0FBQyxXQUFXLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxLQUFLLENBQUM7UUFDM0MsS0FBSztRQUNMLEdBQUc7UUFDSCxLQUFLO1FBQ0w7WUFDRSxLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDO1lBQ25CLEtBQUssRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUM7WUFDakIsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQztZQUNmLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQztZQUNaLEtBQUssRUFBRSxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUM7WUFDbkIsS0FBSyxFQUFFLEVBQUU7U0FDVjtRQUNELEtBQUs7UUFDTCxNQUFNO0tBQ1AsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuXG4vLyBUSElTIENPREUgSVMgR0VORVJBVEVEIC0gRE8gTk9UIE1PRElGWVxuLy8gU2VlIGFuZ3VsYXIvdG9vbHMvZ3VscC10YXNrcy9jbGRyL2V4dHJhY3QuanNcblxuY29uc3QgdSA9IHVuZGVmaW5lZDtcblxuZnVuY3Rpb24gcGx1cmFsKG46IG51bWJlcik6IG51bWJlciB7XG4gIHJldHVybiA1O1xufVxuXG5leHBvcnQgZGVmYXVsdCBbXG4gICd6aC1IYW50JyxcbiAgW1sn5LiK5Y2IJywgJ+S4i+WNiCddLCB1LCB1XSxcbiAgdSxcbiAgW1xuICAgIFsn5pelJywgJ+S4gCcsICfkuownLCAn5LiJJywgJ+WbmycsICfkupQnLCAn5YWtJ10sXG4gICAgWyfpgLHml6UnLCAn6YCx5LiAJywgJ+mAseS6jCcsICfpgLHkuIknLCAn6YCx5ZubJywgJ+mAseS6lCcsICfpgLHlha0nXSxcbiAgICBbJ+aYn+acn+aXpScsICfmmJ/mnJ/kuIAnLCAn5pif5pyf5LqMJywgJ+aYn+acn+S4iScsICfmmJ/mnJ/lm5snLCAn5pif5pyf5LqUJywgJ+aYn+acn+WFrSddLFxuICAgIFsn5pelJywgJ+S4gCcsICfkuownLCAn5LiJJywgJ+WbmycsICfkupQnLCAn5YWtJ11cbiAgXSxcbiAgdSxcbiAgW1xuICAgIFsnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLCAnNycsICc4JywgJzknLCAnMTAnLCAnMTEnLCAnMTInXSxcbiAgICBbJzHmnIgnLCAnMuaciCcsICcz5pyIJywgJzTmnIgnLCAnNeaciCcsICc25pyIJywgJzfmnIgnLCAnOOaciCcsICc55pyIJywgJzEw5pyIJywgJzEx5pyIJywgJzEy5pyIJ10sIHVcbiAgXSxcbiAgdSxcbiAgW1sn6KW/5YWD5YmNJywgJ+ilv+WFgyddLCB1LCB1XSxcbiAgMCxcbiAgWzYsIDBdLFxuICBbJ3kvTS9kJywgJ3nlubRN5pyIZOaXpScsIHUsICd55bm0TeaciGTml6UgRUVFRSddLFxuICBbJ2FoOm1tJywgJ2FoOm1tOnNzJywgJ2FoOm1tOnNzIFt6XScsICdhaDptbTpzcyBbenp6el0nXSxcbiAgWyd7MX0gezB9JywgdSwgdSwgdV0sXG4gIFsnLicsICcsJywgJzsnLCAnJScsICcrJywgJy0nLCAnRScsICfDlycsICfigLAnLCAn4oieJywgJ+mdnuaVuOWAvCcsICc6J10sXG4gIFsnIywjIzAuIyMjJywgJyMsIyMwJScsICfCpCMsIyMwLjAwJywgJyNFMCddLFxuICAnVFdEJyxcbiAgJyQnLFxuICAn5paw5Y+w5bmjJyxcbiAge1xuICAgICdBVUQnOiBbJ0FVJCcsICckJ10sXG4gICAgJ0tSVyc6IFsn77+mJywgJ+KCqSddLFxuICAgICdST04nOiBbdSwgJ0wnXSxcbiAgICAnVFdEJzogWyckJ10sXG4gICAgJ1VTRCc6IFsnVVMkJywgJyQnXSxcbiAgICAnWFhYJzogW11cbiAgfSxcbiAgJ2x0cicsXG4gIHBsdXJhbFxuXTtcbiJdfQ==
+
+/***/ }),
+
+/***/ "./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js":
+/*!******************************************************************!*\
+ !*** ./node_modules/@angular/core/__ivy_ngcc__/fesm2015/core.js ***!
+ \******************************************************************/
+/*! exports provided: ANALYZE_FOR_ENTRY_COMPONENTS, APP_BOOTSTRAP_LISTENER, APP_ID, APP_INITIALIZER, ApplicationInitStatus, ApplicationModule, ApplicationRef, Attribute, COMPILER_OPTIONS, CUSTOM_ELEMENTS_SCHEMA, ChangeDetectionStrategy, ChangeDetectorRef, Compiler, CompilerFactory, Component, ComponentFactory, ComponentFactoryResolver, ComponentRef, ContentChild, ContentChildren, DEFAULT_CURRENCY_CODE, DebugElement, DebugEventListener, DebugNode, DefaultIterableDiffer, Directive, ElementRef, EmbeddedViewRef, ErrorHandler, EventEmitter, Host, HostBinding, HostListener, INJECTOR, Inject, InjectFlags, Injectable, InjectionToken, Injector, Input, IterableDiffers, KeyValueDiffers, LOCALE_ID, MissingTranslationStrategy, ModuleWithComponentFactories, NO_ERRORS_SCHEMA, NgModule, NgModuleFactory, NgModuleFactoryLoader, NgModuleRef, NgProbeToken, NgZone, Optional, Output, PACKAGE_ROOT_URL, PLATFORM_ID, PLATFORM_INITIALIZER, Pipe, PlatformRef, Query, QueryList, ReflectiveInjector, ReflectiveKey, Renderer2, RendererFactory2, RendererStyleFlags2, ResolvedReflectiveFactory, Sanitizer, SecurityContext, Self, SimpleChange, SkipSelf, SystemJsNgModuleLoader, SystemJsNgModuleLoaderConfig, TRANSLATIONS, TRANSLATIONS_FORMAT, TemplateRef, Testability, TestabilityRegistry, Type, VERSION, Version, ViewChild, ViewChildren, ViewContainerRef, ViewEncapsulation, ViewRef, WrappedValue, asNativeElements, assertPlatform, createPlatform, createPlatformFactory, defineInjectable, destroyPlatform, enableProdMode, forwardRef, getDebugNode, getModuleFactory, getPlatform, inject, isDevMode, platformCore, resolveForwardRef, setTestabilityGetter, ɵ0, ɵALLOW_MULTIPLE_PLATFORMS, ɵAPP_ID_RANDOM_PROVIDER, ɵCREATE_ATTRIBUTE_DECORATOR__POST_R3__, ɵChangeDetectorStatus, ɵCodegenComponentFactoryResolver, ɵCompiler_compileModuleAndAllComponentsAsync__POST_R3__, ɵCompiler_compileModuleAndAllComponentsSync__POST_R3__, ɵCompiler_compileModuleAsync__POST_R3__, ɵCompiler_compileModuleSync__POST_R3__, ɵComponentFactory, ɵConsole, ɵDEFAULT_LOCALE_ID, ɵEMPTY_ARRAY, ɵEMPTY_MAP, ɵINJECTOR_IMPL__POST_R3__, ɵINJECTOR_SCOPE, ɵLifecycleHooksFeature, ɵLocaleDataIndex, ɵNG_COMP_DEF, ɵNG_DIR_DEF, ɵNG_ELEMENT_ID, ɵNG_INJ_DEF, ɵNG_MOD_DEF, ɵNG_PIPE_DEF, ɵNG_PROV_DEF, ɵNOT_FOUND_CHECK_ONLY_ELEMENT_INJECTOR, ɵNO_CHANGE, ɵNgModuleFactory, ɵNoopNgZone, ɵReflectionCapabilities, ɵRender3ComponentFactory, ɵRender3ComponentRef, ɵRender3NgModuleRef, ɵRuntimeError, ɵSWITCH_CHANGE_DETECTOR_REF_FACTORY__POST_R3__, ɵSWITCH_COMPILE_COMPONENT__POST_R3__, ɵSWITCH_COMPILE_DIRECTIVE__POST_R3__, ɵSWITCH_COMPILE_INJECTABLE__POST_R3__, ɵSWITCH_COMPILE_NGMODULE__POST_R3__, ɵSWITCH_COMPILE_PIPE__POST_R3__, ɵSWITCH_ELEMENT_REF_FACTORY__POST_R3__, ɵSWITCH_IVY_ENABLED__POST_R3__, ɵSWITCH_RENDERER2_FACTORY__POST_R3__, ɵSWITCH_TEMPLATE_REF_FACTORY__POST_R3__, ɵSWITCH_VIEW_CONTAINER_REF_FACTORY__POST_R3__, ɵ_sanitizeHtml, ɵ_sanitizeUrl, ɵallowSanitizationBypassAndThrow, ɵand, ɵangular_packages_core_core_a, ɵangular_packages_core_core_b, ɵangular_packages_core_core_ba, ɵangular_packages_core_core_bb, ɵangular_packages_core_core_bc, ɵangular_packages_core_core_bd, ɵangular_packages_core_core_be, ɵangular_packages_core_core_bf, ɵangular_packages_core_core_bg, ɵangular_packages_core_core_bh, ɵangular_packages_core_core_bi, ɵangular_packages_core_core_bj, ɵangular_packages_core_core_bl, ɵangular_packages_core_core_bm, ɵangular_packages_core_core_bn, ɵangular_packages_core_core_bo, ɵangular_packages_core_core_bp, ɵangular_packages_core_core_bq, ɵangular_packages_core_core_br, ɵangular_packages_core_core_bs, ɵangular_packages_core_core_bv, ɵangular_packages_core_core_bw, ɵangular_packages_core_core_bx, ɵangular_packages_core_core_bz, ɵangular_packages_core_core_c, ɵangular_packages_core_core_cb, ɵangular_packages_core_core_cc, ɵangular_packages_core_core_d, ɵangular_packages_core_core_e, ɵangular_packages_core_core_f, ɵangular_packages_core_core_g, ɵangular_packages_core_core_h, ɵangular_packages_core_core_i, ɵangular_packages_core_core_j, ɵangular_packages_core_core_k, ɵangular_packages_core_core_l, ɵangular_packages_core_core_m, ɵangular_packages_core_core_n, ɵangular_packages_core_core_o, ɵangular_packages_core_core_p, ɵangular_packages_core_core_q, ɵangular_packages_core_core_r, ɵangular_packages_core_core_s, ɵangular_packages_core_core_t, ɵangular_packages_core_core_u, ɵangular_packages_core_core_v, ɵangular_packages_core_core_w, ɵangular_packages_core_core_x, ɵangular_packages_core_core_y, ɵangular_packages_core_core_z, ɵbypassSanitizationTrustHtml, ɵbypassSanitizationTrustResourceUrl, ɵbypassSanitizationTrustScript, ɵbypassSanitizationTrustStyle, ɵbypassSanitizationTrustUrl, ɵccf, ɵclearOverrides, ɵclearResolutionOfComponentResourcesQueue, ɵcmf, ɵcompileComponent, ɵcompileDirective, ɵcompileNgModule, ɵcompileNgModuleDefs, ɵcompileNgModuleFactory__POST_R3__, ɵcompilePipe, ɵcreateInjector, ɵcrt, ɵdefaultIterableDiffers, ɵdefaultKeyValueDiffers, ɵdetectChanges, ɵdevModeEqual, ɵdid, ɵeld, ɵfindLocaleData, ɵflushModuleScopingQueueAsMuchAsPossible, ɵgetComponentViewDefinitionFactory, ɵgetDebugNodeR2, ɵgetDebugNode__POST_R3__, ɵgetDirectives, ɵgetHostElement, ɵgetInjectableDef, ɵgetLContext, ɵgetLocaleCurrencyCode, ɵgetLocalePluralCase, ɵgetModuleFactory__POST_R3__, ɵgetSanitizationBypassType, ɵglobal, ɵinitServicesIfNeeded, ɵinlineInterpolate, ɵinterpolate, ɵisBoundToModule__POST_R3__, ɵisDefaultChangeDetectionStrategy, ɵisListLikeIterable, ɵisObservable, ɵisPromise, ɵisSubscribable, ɵivyEnabled, ɵmakeDecorator, ɵmarkDirty, ɵmod, ɵmpd, ɵncd, ɵnoSideEffects, ɵnov, ɵoverrideComponentView, ɵoverrideProvider, ɵpad, ɵpatchComponentDefWithScope, ɵpid, ɵpod, ɵppd, ɵprd, ɵpublishDefaultGlobalUtils, ɵpublishGlobalUtil, ɵqud, ɵregisterLocaleData, ɵregisterModuleFactory, ɵregisterNgModuleType, ɵrenderComponent, ɵresetCompiledComponents, ɵresetJitOptions, ɵresolveComponentResources, ɵsetClassMetadata, ɵsetCurrentInjector, ɵsetDocument, ɵsetLocaleId, ɵstore, ɵstringify, ɵted, ɵtransitiveScopesFor, ɵunregisterLocaleData, ɵunv, ɵunwrapSafeValue, ɵvid, ɵwhenRendered, ɵɵCopyDefinitionFeature, ɵɵInheritDefinitionFeature, ɵɵNgOnChangesFeature, ɵɵProvidersFeature, ɵɵadvance, ɵɵattribute, ɵɵattributeInterpolate1, ɵɵattributeInterpolate2, ɵɵattributeInterpolate3, ɵɵattributeInterpolate4, ɵɵattributeInterpolate5, ɵɵattributeInterpolate6, ɵɵattributeInterpolate7, ɵɵattributeInterpolate8, ɵɵattributeInterpolateV, ɵɵclassMap, ɵɵclassMapInterpolate1, ɵɵclassMapInterpolate2, ɵɵclassMapInterpolate3, ɵɵclassMapInterpolate4, ɵɵclassMapInterpolate5, ɵɵclassMapInterpolate6, ɵɵclassMapInterpolate7, ɵɵclassMapInterpolate8, ɵɵclassMapInterpolateV, ɵɵclassProp, ɵɵcontentQuery, ɵɵdefineComponent, ɵɵdefineDirective, ɵɵdefineInjectable, ɵɵdefineInjector, ɵɵdefineNgModule, ɵɵdefinePipe, ɵɵdirectiveInject, ɵɵdisableBindings, ɵɵelement, ɵɵelementContainer, ɵɵelementContainerEnd, ɵɵelementContainerStart, ɵɵelementEnd, ɵɵelementStart, ɵɵenableBindings, ɵɵgetCurrentView, ɵɵgetInheritedFactory, ɵɵhostProperty, ɵɵi18n, ɵɵi18nApply, ɵɵi18nAttributes, ɵɵi18nEnd, ɵɵi18nExp, ɵɵi18nPostprocess, ɵɵi18nStart, ɵɵinject, ɵɵinjectAttribute, ɵɵinjectPipeChangeDetectorRef, ɵɵinvalidFactory, ɵɵinvalidFactoryDep, ɵɵlistener, ɵɵloadQuery, ɵɵnamespaceHTML, ɵɵnamespaceMathML, ɵɵnamespaceSVG, ɵɵnextContext, ɵɵngDeclareComponent, ɵɵngDeclareDirective, ɵɵngDeclarePipe, ɵɵpipe, ɵɵpipeBind1, ɵɵpipeBind2, ɵɵpipeBind3, ɵɵpipeBind4, ɵɵpipeBindV, ɵɵprojection, ɵɵprojectionDef, ɵɵproperty, ɵɵpropertyInterpolate, ɵɵpropertyInterpolate1, ɵɵpropertyInterpolate2, ɵɵpropertyInterpolate3, ɵɵpropertyInterpolate4, ɵɵpropertyInterpolate5, ɵɵpropertyInterpolate6, ɵɵpropertyInterpolate7, ɵɵpropertyInterpolate8, ɵɵpropertyInterpolateV, ɵɵpureFunction0, ɵɵpureFunction1, ɵɵpureFunction2, ɵɵpureFunction3, ɵɵpureFunction4, ɵɵpureFunction5, ɵɵpureFunction6, ɵɵpureFunction7, ɵɵpureFunction8, ɵɵpureFunctionV, ɵɵqueryRefresh, ɵɵreference, ɵɵresolveBody, ɵɵresolveDocument, ɵɵresolveWindow, ɵɵrestoreView, ɵɵsanitizeHtml, ɵɵsanitizeResourceUrl, ɵɵsanitizeScript, ɵɵsanitizeStyle, ɵɵsanitizeUrl, ɵɵsanitizeUrlOrResourceUrl, ɵɵsetComponentScope, ɵɵsetNgModuleScope, ɵɵstyleMap, ɵɵstyleMapInterpolate1, ɵɵstyleMapInterpolate2, ɵɵstyleMapInterpolate3, ɵɵstyleMapInterpolate4, ɵɵstyleMapInterpolate5, ɵɵstyleMapInterpolate6, ɵɵstyleMapInterpolate7, ɵɵstyleMapInterpolate8, ɵɵstyleMapInterpolateV, ɵɵstyleProp, ɵɵstylePropInterpolate1, ɵɵstylePropInterpolate2, ɵɵstylePropInterpolate3, ɵɵstylePropInterpolate4, ɵɵstylePropInterpolate5, ɵɵstylePropInterpolate6, ɵɵstylePropInterpolate7, ɵɵstylePropInterpolate8, ɵɵstylePropInterpolateV, ɵɵsyntheticHostListener, ɵɵsyntheticHostProperty, ɵɵtemplate, ɵɵtemplateRefExtractor, ɵɵtext, ɵɵtextInterpolate, ɵɵtextInterpolate1, ɵɵtextInterpolate2, ɵɵtextInterpolate3, ɵɵtextInterpolate4, ɵɵtextInterpolate5, ɵɵtextInterpolate6, ɵɵtextInterpolate7, ɵɵtextInterpolate8, ɵɵtextInterpolateV, ɵɵtrustConstantHtml, ɵɵtrustConstantResourceUrl, ɵɵviewQuery */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* WEBPACK VAR INJECTION */(function(global) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ANALYZE_FOR_ENTRY_COMPONENTS", function() { return ANALYZE_FOR_ENTRY_COMPONENTS; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "APP_BOOTSTRAP_LISTENER", function() { return APP_BOOTSTRAP_LISTENER; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "APP_ID", function() { return APP_ID; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "APP_INITIALIZER", function() { return APP_INITIALIZER; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ApplicationInitStatus", function() { return ApplicationInitStatus; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ApplicationModule", function() { return ApplicationModule; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ApplicationRef", function() { return ApplicationRef; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Attribute", function() { return Attribute; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "COMPILER_OPTIONS", function() { return COMPILER_OPTIONS; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CUSTOM_ELEMENTS_SCHEMA", function() { return CUSTOM_ELEMENTS_SCHEMA; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ChangeDetectionStrategy", function() { return ChangeDetectionStrategy; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ChangeDetectorRef", function() { return ChangeDetectorRef; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Compiler", function() { return Compiler; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CompilerFactory", function() { return CompilerFactory; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Component", function() { return Component; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ComponentFactory", function() { return ComponentFactory; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ComponentFactoryResolver", function() { return ComponentFactoryResolver; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ComponentRef", function() { return ComponentRef; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ContentChild", function() { return ContentChild; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ContentChildren", function() { return ContentChildren; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "DEFAULT_CURRENCY_CODE", function() { return DEFAULT_CURRENCY_CODE; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "DebugElement", function() { return DebugElement; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "DebugEventListener", function() { return DebugEventListener; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "DebugNode", function() { return DebugNode; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "DefaultIterableDiffer", function() { return DefaultIterableDiffer; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Directive", function() { return Directive; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ElementRef", function() { return ElementRef; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "EmbeddedViewRef", function() { return EmbeddedViewRef; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ErrorHandler", function() { return ErrorHandler; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "EventEmitter", function() { return EventEmitter; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Host", function() { return Host; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "HostBinding", function() { return HostBinding; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "HostListener", function() { return HostListener; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "INJECTOR", function() { return INJECTOR$1; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Inject", function() { return Inject; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "InjectFlags", function() { return InjectFlags; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Injectable", function() { return Injectable; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "InjectionToken", function() { return InjectionToken; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Injector", function() { return Injector; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Input", function() { return Input; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "IterableDiffers", function() { return IterableDiffers; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "KeyValueDiffers", function() { return KeyValueDiffers; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LOCALE_ID", function() { return LOCALE_ID$1; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MissingTranslationStrategy", function() { return MissingTranslationStrategy; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ModuleWithComponentFactories", function() { return ModuleWithComponentFactories; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "NO_ERRORS_SCHEMA", function() { return NO_ERRORS_SCHEMA; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "NgModule", function() { return NgModule; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "NgModuleFactory", function() { return NgModuleFactory; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "NgModuleFactoryLoader", function() { return NgModuleFactoryLoader; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "NgModuleRef", function() { return NgModuleRef; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "NgProbeToken", function() { return NgProbeToken; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "NgZone", function() { return NgZone; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Optional", function() { return Optional; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Output", function() { return Output; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PACKAGE_ROOT_URL", function() { return PACKAGE_ROOT_URL; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PLATFORM_ID", function() { return PLATFORM_ID; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PLATFORM_INITIALIZER", function() { return PLATFORM_INITIALIZER; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Pipe", function() { return Pipe; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PlatformRef", function() { return PlatformRef; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Query", function() { return Query; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "QueryList", function() { return QueryList; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ReflectiveInjector", function() { return ReflectiveInjector; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ReflectiveKey", function() { return ReflectiveKey; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Renderer2", function() { return Renderer2; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "RendererFactory2", function() { return RendererFactory2; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "RendererStyleFlags2", function() { return RendererStyleFlags2; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ResolvedReflectiveFactory", function() { return ResolvedReflectiveFactory; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Sanitizer", function() { return Sanitizer; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SecurityContext", function() { return SecurityContext; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Self", function() { return Self; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SimpleChange", function() { return SimpleChange; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SkipSelf", function() { return SkipSelf; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SystemJsNgModuleLoader", function() { return SystemJsNgModuleLoader; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SystemJsNgModuleLoaderConfig", function() { return SystemJsNgModuleLoaderConfig; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TRANSLATIONS", function() { return TRANSLATIONS; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TRANSLATIONS_FORMAT", function() { return TRANSLATIONS_FORMAT; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TemplateRef", function() { return TemplateRef; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Testability", function() { return Testability; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TestabilityRegistry", function() { return TestabilityRegistry; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Type", function() { return Type; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "VERSION", function() { return VERSION; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Version", function() { return Version; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ViewChild", function() { return ViewChild; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ViewChildren", function() { return ViewChildren; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ViewContainerRef", function() { return ViewContainerRef; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ViewEncapsulation", function() { return ViewEncapsulation; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ViewRef", function() { return ViewRef$1; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "WrappedValue", function() { return WrappedValue; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "asNativeElements", function() { return asNativeElements; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "assertPlatform", function() { return assertPlatform; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "createPlatform", function() { return createPlatform; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "createPlatformFactory", function() { return createPlatformFactory; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "defineInjectable", function() { return defineInjectable; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "destroyPlatform", function() { return destroyPlatform; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "enableProdMode", function() { return enableProdMode; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "forwardRef", function() { return forwardRef; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getDebugNode", function() { return getDebugNode$1; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getModuleFactory", function() { return getModuleFactory; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getPlatform", function() { return getPlatform; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "inject", function() { return inject; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isDevMode", function() { return isDevMode; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "platformCore", function() { return platformCore; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "resolveForwardRef", function() { return resolveForwardRef; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setTestabilityGetter", function() { return setTestabilityGetter; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵ0", function() { return ɵ0$3; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵALLOW_MULTIPLE_PLATFORMS", function() { return ALLOW_MULTIPLE_PLATFORMS; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵAPP_ID_RANDOM_PROVIDER", function() { return APP_ID_RANDOM_PROVIDER; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵCREATE_ATTRIBUTE_DECORATOR__POST_R3__", function() { return CREATE_ATTRIBUTE_DECORATOR__POST_R3__; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵChangeDetectorStatus", function() { return ChangeDetectorStatus; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵCodegenComponentFactoryResolver", function() { return CodegenComponentFactoryResolver; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵCompiler_compileModuleAndAllComponentsAsync__POST_R3__", function() { return Compiler_compileModuleAndAllComponentsAsync__POST_R3__; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵCompiler_compileModuleAndAllComponentsSync__POST_R3__", function() { return Compiler_compileModuleAndAllComponentsSync__POST_R3__; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵCompiler_compileModuleAsync__POST_R3__", function() { return Compiler_compileModuleAsync__POST_R3__; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵCompiler_compileModuleSync__POST_R3__", function() { return Compiler_compileModuleSync__POST_R3__; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵComponentFactory", function() { return ComponentFactory; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵConsole", function() { return Console; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵDEFAULT_LOCALE_ID", function() { return DEFAULT_LOCALE_ID; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵEMPTY_ARRAY", function() { return EMPTY_ARRAY$4; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵEMPTY_MAP", function() { return EMPTY_MAP; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵINJECTOR_IMPL__POST_R3__", function() { return INJECTOR_IMPL__POST_R3__; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵINJECTOR_SCOPE", function() { return INJECTOR_SCOPE; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵLifecycleHooksFeature", function() { return LifecycleHooksFeature; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵLocaleDataIndex", function() { return LocaleDataIndex; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵNG_COMP_DEF", function() { return NG_COMP_DEF; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵNG_DIR_DEF", function() { return NG_DIR_DEF; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵNG_ELEMENT_ID", function() { return NG_ELEMENT_ID; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵNG_INJ_DEF", function() { return NG_INJ_DEF; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵNG_MOD_DEF", function() { return NG_MOD_DEF; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵNG_PIPE_DEF", function() { return NG_PIPE_DEF; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵNG_PROV_DEF", function() { return NG_PROV_DEF; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵNOT_FOUND_CHECK_ONLY_ELEMENT_INJECTOR", function() { return NOT_FOUND_CHECK_ONLY_ELEMENT_INJECTOR; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵNO_CHANGE", function() { return NO_CHANGE; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵNgModuleFactory", function() { return NgModuleFactory$1; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵNoopNgZone", function() { return NoopNgZone; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵReflectionCapabilities", function() { return ReflectionCapabilities; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵRender3ComponentFactory", function() { return ComponentFactory$1; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵRender3ComponentRef", function() { return ComponentRef$1; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵRender3NgModuleRef", function() { return NgModuleRef$1; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵRuntimeError", function() { return RuntimeError; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵSWITCH_CHANGE_DETECTOR_REF_FACTORY__POST_R3__", function() { return SWITCH_CHANGE_DETECTOR_REF_FACTORY__POST_R3__; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵSWITCH_COMPILE_COMPONENT__POST_R3__", function() { return SWITCH_COMPILE_COMPONENT__POST_R3__; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵSWITCH_COMPILE_DIRECTIVE__POST_R3__", function() { return SWITCH_COMPILE_DIRECTIVE__POST_R3__; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵSWITCH_COMPILE_INJECTABLE__POST_R3__", function() { return SWITCH_COMPILE_INJECTABLE__POST_R3__; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵSWITCH_COMPILE_NGMODULE__POST_R3__", function() { return SWITCH_COMPILE_NGMODULE__POST_R3__; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵSWITCH_COMPILE_PIPE__POST_R3__", function() { return SWITCH_COMPILE_PIPE__POST_R3__; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵSWITCH_ELEMENT_REF_FACTORY__POST_R3__", function() { return SWITCH_ELEMENT_REF_FACTORY__POST_R3__; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵSWITCH_IVY_ENABLED__POST_R3__", function() { return SWITCH_IVY_ENABLED__POST_R3__; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵSWITCH_RENDERER2_FACTORY__POST_R3__", function() { return SWITCH_RENDERER2_FACTORY__POST_R3__; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵSWITCH_TEMPLATE_REF_FACTORY__POST_R3__", function() { return SWITCH_TEMPLATE_REF_FACTORY__POST_R3__; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵSWITCH_VIEW_CONTAINER_REF_FACTORY__POST_R3__", function() { return SWITCH_VIEW_CONTAINER_REF_FACTORY__POST_R3__; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵ_sanitizeHtml", function() { return _sanitizeHtml; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵ_sanitizeUrl", function() { return _sanitizeUrl; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵallowSanitizationBypassAndThrow", function() { return allowSanitizationBypassAndThrow; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵand", function() { return anchorDef; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵangular_packages_core_core_a", function() { return isForwardRef; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵangular_packages_core_core_b", function() { return injectInjectorOnly; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵangular_packages_core_core_ba", function() { return zoneSchedulerFactory; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵangular_packages_core_core_bb", function() { return USD_CURRENCY_CODE; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵangular_packages_core_core_bc", function() { return _def; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵangular_packages_core_core_bd", function() { return DebugContext; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵangular_packages_core_core_be", function() { return NgOnChangesFeatureImpl; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵangular_packages_core_core_bf", function() { return SCHEDULER; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵangular_packages_core_core_bg", function() { return injectAttributeImpl; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵangular_packages_core_core_bh", function() { return getLView; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵangular_packages_core_core_bi", function() { return getBindingRoot; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵangular_packages_core_core_bj", function() { return nextContextImpl; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵangular_packages_core_core_bl", function() { return pureFunction1Internal; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵangular_packages_core_core_bm", function() { return pureFunction2Internal; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵangular_packages_core_core_bn", function() { return pureFunction3Internal; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵangular_packages_core_core_bo", function() { return pureFunction4Internal; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵangular_packages_core_core_bp", function() { return pureFunctionVInternal; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵangular_packages_core_core_bq", function() { return getUrlSanitizer; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵangular_packages_core_core_br", function() { return makePropDecorator; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵangular_packages_core_core_bs", function() { return makeParamDecorator; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵangular_packages_core_core_bv", function() { return getClosureSafeProperty; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵangular_packages_core_core_bw", function() { return NullInjector; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵangular_packages_core_core_bx", function() { return getInjectImplementation; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵangular_packages_core_core_bz", function() { return getNativeByTNode; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵangular_packages_core_core_c", function() { return attachInjectFlag; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵangular_packages_core_core_cb", function() { return getRootContext; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵangular_packages_core_core_cc", function() { return i18nPostprocess; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵangular_packages_core_core_d", function() { return ReflectiveInjector_; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵangular_packages_core_core_e", function() { return ReflectiveDependency; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵangular_packages_core_core_f", function() { return resolveReflectiveProviders; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵangular_packages_core_core_g", function() { return _appIdRandomProviderFactory; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵangular_packages_core_core_h", function() { return injectRenderer2; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵangular_packages_core_core_i", function() { return injectElementRef; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵangular_packages_core_core_j", function() { return createElementRef; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵangular_packages_core_core_k", function() { return getModuleFactory__PRE_R3__; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵangular_packages_core_core_l", function() { return injectTemplateRef; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵangular_packages_core_core_m", function() { return createTemplateRef; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵangular_packages_core_core_n", function() { return injectViewContainerRef; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵangular_packages_core_core_o", function() { return DebugNode__PRE_R3__; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵangular_packages_core_core_p", function() { return DebugElement__PRE_R3__; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵangular_packages_core_core_q", function() { return getDebugNodeR2__PRE_R3__; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵangular_packages_core_core_r", function() { return injectChangeDetectorRef; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵangular_packages_core_core_s", function() { return DefaultIterableDifferFactory; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵangular_packages_core_core_t", function() { return DefaultKeyValueDifferFactory; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵangular_packages_core_core_u", function() { return defaultIterableDiffersFactory; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵangular_packages_core_core_v", function() { return defaultKeyValueDiffersFactory; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵangular_packages_core_core_w", function() { return _iterableDiffersFactory; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵangular_packages_core_core_x", function() { return _keyValueDiffersFactory; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵangular_packages_core_core_y", function() { return _localeFactory; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵangular_packages_core_core_z", function() { return APPLICATION_MODULE_PROVIDERS; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵbypassSanitizationTrustHtml", function() { return bypassSanitizationTrustHtml; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵbypassSanitizationTrustResourceUrl", function() { return bypassSanitizationTrustResourceUrl; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵbypassSanitizationTrustScript", function() { return bypassSanitizationTrustScript; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵbypassSanitizationTrustStyle", function() { return bypassSanitizationTrustStyle; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵbypassSanitizationTrustUrl", function() { return bypassSanitizationTrustUrl; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵccf", function() { return createComponentFactory; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵclearOverrides", function() { return clearOverrides; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵclearResolutionOfComponentResourcesQueue", function() { return clearResolutionOfComponentResourcesQueue; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵcmf", function() { return createNgModuleFactory; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵcompileComponent", function() { return compileComponent; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵcompileDirective", function() { return compileDirective; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵcompileNgModule", function() { return compileNgModule; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵcompileNgModuleDefs", function() { return compileNgModuleDefs; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵcompileNgModuleFactory__POST_R3__", function() { return compileNgModuleFactory__POST_R3__; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵcompilePipe", function() { return compilePipe; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵcreateInjector", function() { return createInjector; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵcrt", function() { return createRendererType2; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵdefaultIterableDiffers", function() { return defaultIterableDiffers; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵdefaultKeyValueDiffers", function() { return defaultKeyValueDiffers; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵdetectChanges", function() { return detectChanges; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵdevModeEqual", function() { return devModeEqual; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵdid", function() { return directiveDef; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵeld", function() { return elementDef; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵfindLocaleData", function() { return findLocaleData; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵflushModuleScopingQueueAsMuchAsPossible", function() { return flushModuleScopingQueueAsMuchAsPossible; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵgetComponentViewDefinitionFactory", function() { return getComponentViewDefinitionFactory; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵgetDebugNodeR2", function() { return getDebugNodeR2; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵgetDebugNode__POST_R3__", function() { return getDebugNode__POST_R3__; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵgetDirectives", function() { return getDirectives; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵgetHostElement", function() { return getHostElement; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵgetInjectableDef", function() { return getInjectableDef; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵgetLContext", function() { return getLContext; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵgetLocaleCurrencyCode", function() { return getLocaleCurrencyCode; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵgetLocalePluralCase", function() { return getLocalePluralCase; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵgetModuleFactory__POST_R3__", function() { return getModuleFactory__POST_R3__; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵgetSanitizationBypassType", function() { return getSanitizationBypassType; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵglobal", function() { return _global; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵinitServicesIfNeeded", function() { return initServicesIfNeeded; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵinlineInterpolate", function() { return inlineInterpolate; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵinterpolate", function() { return interpolate; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵisBoundToModule__POST_R3__", function() { return isBoundToModule__POST_R3__; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵisDefaultChangeDetectionStrategy", function() { return isDefaultChangeDetectionStrategy; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵisListLikeIterable", function() { return isListLikeIterable; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵisObservable", function() { return isObservable; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵisPromise", function() { return isPromise; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵisSubscribable", function() { return isSubscribable; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵivyEnabled", function() { return ivyEnabled; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵmakeDecorator", function() { return makeDecorator; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵmarkDirty", function() { return markDirty; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵmod", function() { return moduleDef; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵmpd", function() { return moduleProvideDef; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵncd", function() { return ngContentDef; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵnoSideEffects", function() { return noSideEffects; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵnov", function() { return nodeValue; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵoverrideComponentView", function() { return overrideComponentView; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵoverrideProvider", function() { return overrideProvider; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵpad", function() { return pureArrayDef; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵpatchComponentDefWithScope", function() { return patchComponentDefWithScope; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵpid", function() { return pipeDef; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵpod", function() { return pureObjectDef; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵppd", function() { return purePipeDef; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵprd", function() { return providerDef; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵpublishDefaultGlobalUtils", function() { return publishDefaultGlobalUtils; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵpublishGlobalUtil", function() { return publishGlobalUtil; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵqud", function() { return queryDef; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵregisterLocaleData", function() { return registerLocaleData; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵregisterModuleFactory", function() { return registerModuleFactory; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵregisterNgModuleType", function() { return registerNgModuleType; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵrenderComponent", function() { return renderComponent$1; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵresetCompiledComponents", function() { return resetCompiledComponents; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵresetJitOptions", function() { return resetJitOptions; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵresolveComponentResources", function() { return resolveComponentResources; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵsetClassMetadata", function() { return setClassMetadata; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵsetCurrentInjector", function() { return setCurrentInjector; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵsetDocument", function() { return setDocument; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵsetLocaleId", function() { return setLocaleId; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵstore", function() { return store; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵstringify", function() { return stringify; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵted", function() { return textDef; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵtransitiveScopesFor", function() { return transitiveScopesFor; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵunregisterLocaleData", function() { return unregisterAllLocaleData; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵunv", function() { return unwrapValue; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵunwrapSafeValue", function() { return unwrapSafeValue; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵvid", function() { return viewDef; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵwhenRendered", function() { return whenRendered; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵCopyDefinitionFeature", function() { return ɵɵCopyDefinitionFeature; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵInheritDefinitionFeature", function() { return ɵɵInheritDefinitionFeature; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵNgOnChangesFeature", function() { return ɵɵNgOnChangesFeature; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵProvidersFeature", function() { return ɵɵProvidersFeature; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵadvance", function() { return ɵɵadvance; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵattribute", function() { return ɵɵattribute; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵattributeInterpolate1", function() { return ɵɵattributeInterpolate1; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵattributeInterpolate2", function() { return ɵɵattributeInterpolate2; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵattributeInterpolate3", function() { return ɵɵattributeInterpolate3; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵattributeInterpolate4", function() { return ɵɵattributeInterpolate4; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵattributeInterpolate5", function() { return ɵɵattributeInterpolate5; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵattributeInterpolate6", function() { return ɵɵattributeInterpolate6; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵattributeInterpolate7", function() { return ɵɵattributeInterpolate7; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵattributeInterpolate8", function() { return ɵɵattributeInterpolate8; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵattributeInterpolateV", function() { return ɵɵattributeInterpolateV; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵclassMap", function() { return ɵɵclassMap; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵclassMapInterpolate1", function() { return ɵɵclassMapInterpolate1; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵclassMapInterpolate2", function() { return ɵɵclassMapInterpolate2; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵclassMapInterpolate3", function() { return ɵɵclassMapInterpolate3; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵclassMapInterpolate4", function() { return ɵɵclassMapInterpolate4; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵclassMapInterpolate5", function() { return ɵɵclassMapInterpolate5; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵclassMapInterpolate6", function() { return ɵɵclassMapInterpolate6; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵclassMapInterpolate7", function() { return ɵɵclassMapInterpolate7; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵclassMapInterpolate8", function() { return ɵɵclassMapInterpolate8; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵclassMapInterpolateV", function() { return ɵɵclassMapInterpolateV; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵclassProp", function() { return ɵɵclassProp; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵcontentQuery", function() { return ɵɵcontentQuery; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵdefineComponent", function() { return ɵɵdefineComponent; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵdefineDirective", function() { return ɵɵdefineDirective; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵdefineInjectable", function() { return ɵɵdefineInjectable; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵdefineInjector", function() { return ɵɵdefineInjector; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵdefineNgModule", function() { return ɵɵdefineNgModule; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵdefinePipe", function() { return ɵɵdefinePipe; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵdirectiveInject", function() { return ɵɵdirectiveInject; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵdisableBindings", function() { return ɵɵdisableBindings; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵelement", function() { return ɵɵelement; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵelementContainer", function() { return ɵɵelementContainer; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵelementContainerEnd", function() { return ɵɵelementContainerEnd; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵelementContainerStart", function() { return ɵɵelementContainerStart; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵelementEnd", function() { return ɵɵelementEnd; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵelementStart", function() { return ɵɵelementStart; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵenableBindings", function() { return ɵɵenableBindings; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵgetCurrentView", function() { return ɵɵgetCurrentView; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵgetInheritedFactory", function() { return ɵɵgetInheritedFactory; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵhostProperty", function() { return ɵɵhostProperty; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵi18n", function() { return ɵɵi18n; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵi18nApply", function() { return ɵɵi18nApply; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵi18nAttributes", function() { return ɵɵi18nAttributes; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵi18nEnd", function() { return ɵɵi18nEnd; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵi18nExp", function() { return ɵɵi18nExp; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵi18nPostprocess", function() { return ɵɵi18nPostprocess; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵi18nStart", function() { return ɵɵi18nStart; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵinject", function() { return ɵɵinject; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵinjectAttribute", function() { return ɵɵinjectAttribute; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵinjectPipeChangeDetectorRef", function() { return ɵɵinjectPipeChangeDetectorRef; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵinvalidFactory", function() { return ɵɵinvalidFactory; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵinvalidFactoryDep", function() { return ɵɵinvalidFactoryDep; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵlistener", function() { return ɵɵlistener; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵloadQuery", function() { return ɵɵloadQuery; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵnamespaceHTML", function() { return ɵɵnamespaceHTML; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵnamespaceMathML", function() { return ɵɵnamespaceMathML; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵnamespaceSVG", function() { return ɵɵnamespaceSVG; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵnextContext", function() { return ɵɵnextContext; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵngDeclareComponent", function() { return ɵɵngDeclareComponent; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵngDeclareDirective", function() { return ɵɵngDeclareDirective; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵngDeclarePipe", function() { return ɵɵngDeclarePipe; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵpipe", function() { return ɵɵpipe; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵpipeBind1", function() { return ɵɵpipeBind1; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵpipeBind2", function() { return ɵɵpipeBind2; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵpipeBind3", function() { return ɵɵpipeBind3; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵpipeBind4", function() { return ɵɵpipeBind4; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵpipeBindV", function() { return ɵɵpipeBindV; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵprojection", function() { return ɵɵprojection; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵprojectionDef", function() { return ɵɵprojectionDef; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵproperty", function() { return ɵɵproperty; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵpropertyInterpolate", function() { return ɵɵpropertyInterpolate; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵpropertyInterpolate1", function() { return ɵɵpropertyInterpolate1; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵpropertyInterpolate2", function() { return ɵɵpropertyInterpolate2; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵpropertyInterpolate3", function() { return ɵɵpropertyInterpolate3; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵpropertyInterpolate4", function() { return ɵɵpropertyInterpolate4; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵpropertyInterpolate5", function() { return ɵɵpropertyInterpolate5; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵpropertyInterpolate6", function() { return ɵɵpropertyInterpolate6; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵpropertyInterpolate7", function() { return ɵɵpropertyInterpolate7; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵpropertyInterpolate8", function() { return ɵɵpropertyInterpolate8; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵpropertyInterpolateV", function() { return ɵɵpropertyInterpolateV; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵpureFunction0", function() { return ɵɵpureFunction0; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵpureFunction1", function() { return ɵɵpureFunction1; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵpureFunction2", function() { return ɵɵpureFunction2; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵpureFunction3", function() { return ɵɵpureFunction3; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵpureFunction4", function() { return ɵɵpureFunction4; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵpureFunction5", function() { return ɵɵpureFunction5; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵpureFunction6", function() { return ɵɵpureFunction6; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵpureFunction7", function() { return ɵɵpureFunction7; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵpureFunction8", function() { return ɵɵpureFunction8; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵpureFunctionV", function() { return ɵɵpureFunctionV; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵqueryRefresh", function() { return ɵɵqueryRefresh; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵreference", function() { return ɵɵreference; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵresolveBody", function() { return ɵɵresolveBody; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵresolveDocument", function() { return ɵɵresolveDocument; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵresolveWindow", function() { return ɵɵresolveWindow; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵrestoreView", function() { return ɵɵrestoreView; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵsanitizeHtml", function() { return ɵɵsanitizeHtml; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵsanitizeResourceUrl", function() { return ɵɵsanitizeResourceUrl; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵsanitizeScript", function() { return ɵɵsanitizeScript; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵsanitizeStyle", function() { return ɵɵsanitizeStyle; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵsanitizeUrl", function() { return ɵɵsanitizeUrl; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵsanitizeUrlOrResourceUrl", function() { return ɵɵsanitizeUrlOrResourceUrl; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵsetComponentScope", function() { return ɵɵsetComponentScope; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵsetNgModuleScope", function() { return ɵɵsetNgModuleScope; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵstyleMap", function() { return ɵɵstyleMap; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵstyleMapInterpolate1", function() { return ɵɵstyleMapInterpolate1; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵstyleMapInterpolate2", function() { return ɵɵstyleMapInterpolate2; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵstyleMapInterpolate3", function() { return ɵɵstyleMapInterpolate3; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵstyleMapInterpolate4", function() { return ɵɵstyleMapInterpolate4; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵstyleMapInterpolate5", function() { return ɵɵstyleMapInterpolate5; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵstyleMapInterpolate6", function() { return ɵɵstyleMapInterpolate6; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵstyleMapInterpolate7", function() { return ɵɵstyleMapInterpolate7; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵstyleMapInterpolate8", function() { return ɵɵstyleMapInterpolate8; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵstyleMapInterpolateV", function() { return ɵɵstyleMapInterpolateV; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵstyleProp", function() { return ɵɵstyleProp; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵstylePropInterpolate1", function() { return ɵɵstylePropInterpolate1; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵstylePropInterpolate2", function() { return ɵɵstylePropInterpolate2; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵstylePropInterpolate3", function() { return ɵɵstylePropInterpolate3; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵstylePropInterpolate4", function() { return ɵɵstylePropInterpolate4; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵstylePropInterpolate5", function() { return ɵɵstylePropInterpolate5; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵstylePropInterpolate6", function() { return ɵɵstylePropInterpolate6; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵstylePropInterpolate7", function() { return ɵɵstylePropInterpolate7; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵstylePropInterpolate8", function() { return ɵɵstylePropInterpolate8; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵstylePropInterpolateV", function() { return ɵɵstylePropInterpolateV; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵsyntheticHostListener", function() { return ɵɵsyntheticHostListener; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵsyntheticHostProperty", function() { return ɵɵsyntheticHostProperty; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵtemplate", function() { return ɵɵtemplate; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵtemplateRefExtractor", function() { return ɵɵtemplateRefExtractor; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵtext", function() { return ɵɵtext; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵtextInterpolate", function() { return ɵɵtextInterpolate; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵtextInterpolate1", function() { return ɵɵtextInterpolate1; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵtextInterpolate2", function() { return ɵɵtextInterpolate2; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵtextInterpolate3", function() { return ɵɵtextInterpolate3; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵtextInterpolate4", function() { return ɵɵtextInterpolate4; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵtextInterpolate5", function() { return ɵɵtextInterpolate5; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵtextInterpolate6", function() { return ɵɵtextInterpolate6; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵtextInterpolate7", function() { return ɵɵtextInterpolate7; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵtextInterpolate8", function() { return ɵɵtextInterpolate8; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵtextInterpolateV", function() { return ɵɵtextInterpolateV; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵtrustConstantHtml", function() { return ɵɵtrustConstantHtml; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵtrustConstantResourceUrl", function() { return ɵɵtrustConstantResourceUrl; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵɵviewQuery", function() { return ɵɵviewQuery; });
+/* harmony import */ var rxjs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! rxjs */ "./node_modules/rxjs/_esm5/index.js");
+/* harmony import */ var rxjs_operators__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! rxjs/operators */ "./node_modules/rxjs/_esm5/operators/index.js");
+/**
+ * @license Angular v11.2.14
+ * (c) 2010-2021 Google LLC. https://angular.io/
+ * License: MIT
+ */
+
+
+
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+function getClosureSafeProperty(objWithPropertyToExtract) {
+ for (let key in objWithPropertyToExtract) {
+ if (objWithPropertyToExtract[key] === getClosureSafeProperty) {
+ return key;
+ }
+ }
+ throw Error('Could not find renamed property on target object.');
+}
+/**
+ * Sets properties on a target object from a source object, but only if
+ * the property doesn't already exist on the target object.
+ * @param target The target to set properties on
+ * @param source The source of the property keys and values to set
+ */
+function fillProperties(target, source) {
+ for (const key in source) {
+ if (source.hasOwnProperty(key) && !target.hasOwnProperty(key)) {
+ target[key] = source[key];
+ }
+ }
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+function stringify(token) {
+ if (typeof token === 'string') {
+ return token;
+ }
+ if (Array.isArray(token)) {
+ return '[' + token.map(stringify).join(', ') + ']';
+ }
+ if (token == null) {
+ return '' + token;
+ }
+ if (token.overriddenName) {
+ return `${token.overriddenName}`;
+ }
+ if (token.name) {
+ return `${token.name}`;
+ }
+ const res = token.toString();
+ if (res == null) {
+ return '' + res;
+ }
+ const newLineIndex = res.indexOf('\n');
+ return newLineIndex === -1 ? res : res.substring(0, newLineIndex);
+}
+/**
+ * Concatenates two strings with separator, allocating new strings only when necessary.
+ *
+ * @param before before string.
+ * @param separator separator string.
+ * @param after after string.
+ * @returns concatenated string.
+ */
+function concatStringsWithSpace(before, after) {
+ return (before == null || before === '') ?
+ (after === null ? '' : after) :
+ ((after == null || after === '') ? before : before + ' ' + after);
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+const __forward_ref__ = getClosureSafeProperty({ __forward_ref__: getClosureSafeProperty });
+/**
+ * Allows to refer to references which are not yet defined.
+ *
+ * For instance, `forwardRef` is used when the `token` which we need to refer to for the purposes of
+ * DI is declared, but not yet defined. It is also used when the `token` which we use when creating
+ * a query is not yet defined.
+ *
+ * @usageNotes
+ * ### Example
+ * {@example core/di/ts/forward_ref/forward_ref_spec.ts region='forward_ref'}
+ * @publicApi
+ */
+function forwardRef(forwardRefFn) {
+ forwardRefFn.__forward_ref__ = forwardRef;
+ forwardRefFn.toString = function () {
+ return stringify(this());
+ };
+ return forwardRefFn;
+}
+/**
+ * Lazily retrieves the reference value from a forwardRef.
+ *
+ * Acts as the identity function when given a non-forward-ref value.
+ *
+ * @usageNotes
+ * ### Example
+ *
+ * {@example core/di/ts/forward_ref/forward_ref_spec.ts region='resolve_forward_ref'}
+ *
+ * @see `forwardRef`
+ * @publicApi
+ */
+function resolveForwardRef(type) {
+ return isForwardRef(type) ? type() : type;
+}
+/** Checks whether a function is wrapped by a `forwardRef`. */
+function isForwardRef(fn) {
+ return typeof fn === 'function' && fn.hasOwnProperty(__forward_ref__) &&
+ fn.__forward_ref__ === forwardRef;
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+// Base URL for the error details page.
+// Keep this value in sync with a similar const in
+// `packages/compiler-cli/src/ngtsc/diagnostics/src/error_code.ts`.
+const ERROR_DETAILS_PAGE_BASE_URL = 'https://angular.io/errors';
+class RuntimeError extends Error {
+ constructor(code, message) {
+ super(formatRuntimeError(code, message));
+ this.code = code;
+ }
+}
+// Contains a set of error messages that have details guides at angular.io.
+// Full list of available error guides can be found at https://angular.io/errors
+/* tslint:disable:no-toplevel-property-access */
+const RUNTIME_ERRORS_WITH_GUIDES = new Set([
+ "100" /* EXPRESSION_CHANGED_AFTER_CHECKED */,
+ "200" /* CYCLIC_DI_DEPENDENCY */,
+ "201" /* PROVIDER_NOT_FOUND */,
+ "300" /* MULTIPLE_COMPONENTS_MATCH */,
+ "301" /* EXPORT_NOT_FOUND */,
+ "302" /* PIPE_NOT_FOUND */,
+]);
+/* tslint:enable:no-toplevel-property-access */
+/** Called to format a runtime error */
+function formatRuntimeError(code, message) {
+ const fullCode = code ? `NG0${code}: ` : '';
+ let errorMessage = `${fullCode}${message}`;
+ // Some runtime errors are still thrown without `ngDevMode` (for example
+ // `throwProviderNotFoundError`), so we add `ngDevMode` check here to avoid pulling
+ // `RUNTIME_ERRORS_WITH_GUIDES` symbol into prod bundles.
+ // TODO: revisit all instances where `RuntimeError` is thrown and see if `ngDevMode` can be added
+ // there instead to tree-shake more devmode-only code (and eventually remove `ngDevMode` check
+ // from this code).
+ if (ngDevMode && RUNTIME_ERRORS_WITH_GUIDES.has(code)) {
+ errorMessage = `${errorMessage}. Find more at ${ERROR_DETAILS_PAGE_BASE_URL}/NG0${code}`;
+ }
+ return errorMessage;
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * Used for stringify render output in Ivy.
+ * Important! This function is very performance-sensitive and we should
+ * be extra careful not to introduce megamorphic reads in it.
+ * Check `core/test/render3/perf/render_stringify` for benchmarks and alternate implementations.
+ */
+function renderStringify(value) {
+ if (typeof value === 'string')
+ return value;
+ if (value == null)
+ return '';
+ // Use `String` so that it invokes the `toString` method of the value. Note that this
+ // appears to be faster than calling `value.toString` (see `render_stringify` benchmark).
+ return String(value);
+}
+/**
+ * Used to stringify a value so that it can be displayed in an error message.
+ * Important! This function contains a megamorphic read and should only be
+ * used for error messages.
+ */
+function stringifyForError(value) {
+ if (typeof value === 'function')
+ return value.name || value.toString();
+ if (typeof value === 'object' && value != null && typeof value.type === 'function') {
+ return value.type.name || value.type.toString();
+ }
+ return renderStringify(value);
+}
+
+/** Called when directives inject each other (creating a circular dependency) */
+function throwCyclicDependencyError(token, path) {
+ const depPath = path ? `. Dependency path: ${path.join(' > ')} > ${token}` : '';
+ throw new RuntimeError("200" /* CYCLIC_DI_DEPENDENCY */, `Circular dependency in DI detected for ${token}${depPath}`);
+}
+function throwMixedMultiProviderError() {
+ throw new Error(`Cannot mix multi providers and regular providers`);
+}
+function throwInvalidProviderError(ngModuleType, providers, provider) {
+ let ngModuleDetail = '';
+ if (ngModuleType && providers) {
+ const providerDetail = providers.map(v => v == provider ? '?' + provider + '?' : '...');
+ ngModuleDetail =
+ ` - only instances of Provider and Type are allowed, got: [${providerDetail.join(', ')}]`;
+ }
+ throw new Error(`Invalid provider for the NgModule '${stringify(ngModuleType)}'` + ngModuleDetail);
+}
+/** Throws an error when a token is not found in DI. */
+function throwProviderNotFoundError(token, injectorName) {
+ const injectorDetails = injectorName ? ` in ${injectorName}` : '';
+ throw new RuntimeError("201" /* PROVIDER_NOT_FOUND */, `No provider for ${stringifyForError(token)} found${injectorDetails}`);
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+function assertNumber(actual, msg) {
+ if (!(typeof actual === 'number')) {
+ throwError(msg, typeof actual, 'number', '===');
+ }
+}
+function assertNumberInRange(actual, minInclusive, maxInclusive) {
+ assertNumber(actual, 'Expected a number');
+ assertLessThanOrEqual(actual, maxInclusive, 'Expected number to be less than or equal to');
+ assertGreaterThanOrEqual(actual, minInclusive, 'Expected number to be greater than or equal to');
+}
+function assertString(actual, msg) {
+ if (!(typeof actual === 'string')) {
+ throwError(msg, actual === null ? 'null' : typeof actual, 'string', '===');
+ }
+}
+function assertFunction(actual, msg) {
+ if (!(typeof actual === 'function')) {
+ throwError(msg, actual === null ? 'null' : typeof actual, 'function', '===');
+ }
+}
+function assertEqual(actual, expected, msg) {
+ if (!(actual == expected)) {
+ throwError(msg, actual, expected, '==');
+ }
+}
+function assertNotEqual(actual, expected, msg) {
+ if (!(actual != expected)) {
+ throwError(msg, actual, expected, '!=');
+ }
+}
+function assertSame(actual, expected, msg) {
+ if (!(actual === expected)) {
+ throwError(msg, actual, expected, '===');
+ }
+}
+function assertNotSame(actual, expected, msg) {
+ if (!(actual !== expected)) {
+ throwError(msg, actual, expected, '!==');
+ }
+}
+function assertLessThan(actual, expected, msg) {
+ if (!(actual < expected)) {
+ throwError(msg, actual, expected, '<');
+ }
+}
+function assertLessThanOrEqual(actual, expected, msg) {
+ if (!(actual <= expected)) {
+ throwError(msg, actual, expected, '<=');
+ }
+}
+function assertGreaterThan(actual, expected, msg) {
+ if (!(actual > expected)) {
+ throwError(msg, actual, expected, '>');
+ }
+}
+function assertGreaterThanOrEqual(actual, expected, msg) {
+ if (!(actual >= expected)) {
+ throwError(msg, actual, expected, '>=');
+ }
+}
+function assertNotDefined(actual, msg) {
+ if (actual != null) {
+ throwError(msg, actual, null, '==');
+ }
+}
+function assertDefined(actual, msg) {
+ if (actual == null) {
+ throwError(msg, actual, null, '!=');
+ }
+}
+function throwError(msg, actual, expected, comparison) {
+ throw new Error(`ASSERTION ERROR: ${msg}` +
+ (comparison == null ? '' : ` [Expected=> ${expected} ${comparison} ${actual} <=Actual]`));
+}
+function assertDomNode(node) {
+ // If we're in a worker, `Node` will not be defined.
+ if (!(typeof Node !== 'undefined' && node instanceof Node) &&
+ !(typeof node === 'object' && node != null &&
+ node.constructor.name === 'WebWorkerRenderNode')) {
+ throwError(`The provided value must be an instance of a DOM Node but got ${stringify(node)}`);
+ }
+}
+function assertIndexInRange(arr, index) {
+ assertDefined(arr, 'Array must be defined.');
+ const maxLen = arr.length;
+ if (index < 0 || index >= maxLen) {
+ throwError(`Index expected to be less than ${maxLen} but got ${index}`);
+ }
+}
+function assertOneOf(value, ...validValues) {
+ if (validValues.indexOf(value) !== -1)
+ return true;
+ throwError(`Expected value to be one of ${JSON.stringify(validValues)} but was ${JSON.stringify(value)}.`);
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * Construct an `InjectableDef` which defines how a token will be constructed by the DI system, and
+ * in which injectors (if any) it will be available.
+ *
+ * This should be assigned to a static `ɵprov` field on a type, which will then be an
+ * `InjectableType`.
+ *
+ * Options:
+ * * `providedIn` determines which injectors will include the injectable, by either associating it
+ * with an `@NgModule` or other `InjectorType`, or by specifying that this injectable should be
+ * provided in the `'root'` injector, which will be the application-level injector in most apps.
+ * * `factory` gives the zero argument function which will create an instance of the injectable.
+ * The factory can call `inject` to access the `Injector` and request injection of dependencies.
+ *
+ * @codeGenApi
+ * @publicApi This instruction has been emitted by ViewEngine for some time and is deployed to npm.
+ */
+function ɵɵdefineInjectable(opts) {
+ return {
+ token: opts.token,
+ providedIn: opts.providedIn || null,
+ factory: opts.factory,
+ value: undefined,
+ };
+}
+/**
+ * @deprecated in v8, delete after v10. This API should be used only by generated code, and that
+ * code should now use ɵɵdefineInjectable instead.
+ * @publicApi
+ */
+const defineInjectable = ɵɵdefineInjectable;
+/**
+ * Construct an `InjectorDef` which configures an injector.
+ *
+ * This should be assigned to a static injector def (`ɵinj`) field on a type, which will then be an
+ * `InjectorType`.
+ *
+ * Options:
+ *
+ * * `providers`: an optional array of providers to add to the injector. Each provider must
+ * either have a factory or point to a type which has a `ɵprov` static property (the
+ * type must be an `InjectableType`).
+ * * `imports`: an optional array of imports of other `InjectorType`s or `InjectorTypeWithModule`s
+ * whose providers will also be added to the injector. Locally provided types will override
+ * providers from imports.
+ *
+ * @codeGenApi
+ */
+function ɵɵdefineInjector(options) {
+ return { providers: options.providers || [], imports: options.imports || [] };
+}
+/**
+ * Read the injectable def (`ɵprov`) for `type` in a way which is immune to accidentally reading
+ * inherited value.
+ *
+ * @param type A type which may have its own (non-inherited) `ɵprov`.
+ */
+function getInjectableDef(type) {
+ return getOwnDefinition(type, NG_PROV_DEF) || getOwnDefinition(type, NG_INJECTABLE_DEF);
+}
+/**
+ * Return definition only if it is defined directly on `type` and is not inherited from a base
+ * class of `type`.
+ */
+function getOwnDefinition(type, field) {
+ return type.hasOwnProperty(field) ? type[field] : null;
+}
+/**
+ * Read the injectable def (`ɵprov`) for `type` or read the `ɵprov` from one of its ancestors.
+ *
+ * @param type A type which may have `ɵprov`, via inheritance.
+ *
+ * @deprecated Will be removed in a future version of Angular, where an error will occur in the
+ * scenario if we find the `ɵprov` on an ancestor only.
+ */
+function getInheritedInjectableDef(type) {
+ const def = type && (type[NG_PROV_DEF] || type[NG_INJECTABLE_DEF]);
+ if (def) {
+ const typeName = getTypeName(type);
+ // TODO(FW-1307): Re-add ngDevMode when closure can handle it
+ // ngDevMode &&
+ console.warn(`DEPRECATED: DI is instantiating a token "${typeName}" that inherits its @Injectable decorator but does not provide one itself.\n` +
+ `This will become an error in a future version of Angular. Please add @Injectable() to the "${typeName}" class.`);
+ return def;
+ }
+ else {
+ return null;
+ }
+}
+/** Gets the name of a type, accounting for some cross-browser differences. */
+function getTypeName(type) {
+ // `Function.prototype.name` behaves differently between IE and other browsers. In most browsers
+ // it'll always return the name of the function itself, no matter how many other functions it
+ // inherits from. On IE the function doesn't have its own `name` property, but it takes it from
+ // the lowest level in the prototype chain. E.g. if we have `class Foo extends Parent` most
+ // browsers will evaluate `Foo.name` to `Foo` while IE will return `Parent`. We work around
+ // the issue by converting the function to a string and parsing its name out that way via a regex.
+ if (type.hasOwnProperty('name')) {
+ return type.name;
+ }
+ const match = ('' + type).match(/^function\s*([^\s(]+)/);
+ return match === null ? '' : match[1];
+}
+/**
+ * Read the injector def type in a way which is immune to accidentally reading inherited value.
+ *
+ * @param type type which may have an injector def (`ɵinj`)
+ */
+function getInjectorDef(type) {
+ return type && (type.hasOwnProperty(NG_INJ_DEF) || type.hasOwnProperty(NG_INJECTOR_DEF)) ?
+ type[NG_INJ_DEF] :
+ null;
+}
+const NG_PROV_DEF = getClosureSafeProperty({ ɵprov: getClosureSafeProperty });
+const NG_INJ_DEF = getClosureSafeProperty({ ɵinj: getClosureSafeProperty });
+// We need to keep these around so we can read off old defs if new defs are unavailable
+const NG_INJECTABLE_DEF = getClosureSafeProperty({ ngInjectableDef: getClosureSafeProperty });
+const NG_INJECTOR_DEF = getClosureSafeProperty({ ngInjectorDef: getClosureSafeProperty });
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * Injection flags for DI.
+ *
+ * @publicApi
+ */
+var InjectFlags;
+(function (InjectFlags) {
+ // TODO(alxhub): make this 'const' (and remove `InternalInjectFlags` enum) when ngc no longer
+ // writes exports of it into ngfactory files.
+ /** Check self and check parent injector if needed */
+ InjectFlags[InjectFlags["Default"] = 0] = "Default";
+ /**
+ * Specifies that an injector should retrieve a dependency from any injector until reaching the
+ * host element of the current component. (Only used with Element Injector)
+ */
+ InjectFlags[InjectFlags["Host"] = 1] = "Host";
+ /** Don't ascend to ancestors of the node requesting injection. */
+ InjectFlags[InjectFlags["Self"] = 2] = "Self";
+ /** Skip the node that is requesting injection. */
+ InjectFlags[InjectFlags["SkipSelf"] = 4] = "SkipSelf";
+ /** Inject `defaultValue` instead if token not found. */
+ InjectFlags[InjectFlags["Optional"] = 8] = "Optional";
+})(InjectFlags || (InjectFlags = {}));
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * Current implementation of inject.
+ *
+ * By default, it is `injectInjectorOnly`, which makes it `Injector`-only aware. It can be changed
+ * to `directiveInject`, which brings in the `NodeInjector` system of ivy. It is designed this
+ * way for two reasons:
+ * 1. `Injector` should not depend on ivy logic.
+ * 2. To maintain tree shake-ability we don't want to bring in unnecessary code.
+ */
+let _injectImplementation;
+function getInjectImplementation() {
+ return _injectImplementation;
+}
+/**
+ * Sets the current inject implementation.
+ */
+function setInjectImplementation(impl) {
+ const previous = _injectImplementation;
+ _injectImplementation = impl;
+ return previous;
+}
+/**
+ * Injects `root` tokens in limp mode.
+ *
+ * If no injector exists, we can still inject tree-shakable providers which have `providedIn` set to
+ * `"root"`. This is known as the limp mode injection. In such case the value is stored in the
+ * `InjectableDef`.
+ */
+function injectRootLimpMode(token, notFoundValue, flags) {
+ const injectableDef = getInjectableDef(token);
+ if (injectableDef && injectableDef.providedIn == 'root') {
+ return injectableDef.value === undefined ? injectableDef.value = injectableDef.factory() :
+ injectableDef.value;
+ }
+ if (flags & InjectFlags.Optional)
+ return null;
+ if (notFoundValue !== undefined)
+ return notFoundValue;
+ throwProviderNotFoundError(stringify(token), 'Injector');
+}
+/**
+ * Assert that `_injectImplementation` is not `fn`.
+ *
+ * This is useful, to prevent infinite recursion.
+ *
+ * @param fn Function which it should not equal to
+ */
+function assertInjectImplementationNotEqual(fn) {
+ ngDevMode &&
+ assertNotEqual(_injectImplementation, fn, 'Calling ɵɵinject would cause infinite recursion');
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * Convince closure compiler that the wrapped function has no side-effects.
+ *
+ * Closure compiler always assumes that `toString` has no side-effects. We use this quirk to
+ * allow us to execute a function but have closure compiler mark the call as no-side-effects.
+ * It is important that the return value for the `noSideEffects` function be assigned
+ * to something which is retained otherwise the call to `noSideEffects` will be removed by closure
+ * compiler.
+ */
+function noSideEffects(fn) {
+ return { toString: fn }.toString();
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * The strategy that the default change detector uses to detect changes.
+ * When set, takes effect the next time change detection is triggered.
+ *
+ * @see {@link ChangeDetectorRef#usage-notes Change detection usage}
+ *
+ * @publicApi
+ */
+var ChangeDetectionStrategy;
+(function (ChangeDetectionStrategy) {
+ /**
+ * Use the `CheckOnce` strategy, meaning that automatic change detection is deactivated
+ * until reactivated by setting the strategy to `Default` (`CheckAlways`).
+ * Change detection can still be explicitly invoked.
+ * This strategy applies to all child directives and cannot be overridden.
+ */
+ ChangeDetectionStrategy[ChangeDetectionStrategy["OnPush"] = 0] = "OnPush";
+ /**
+ * Use the default `CheckAlways` strategy, in which change detection is automatic until
+ * explicitly deactivated.
+ */
+ ChangeDetectionStrategy[ChangeDetectionStrategy["Default"] = 1] = "Default";
+})(ChangeDetectionStrategy || (ChangeDetectionStrategy = {}));
+/**
+ * Defines the possible states of the default change detector.
+ * @see `ChangeDetectorRef`
+ */
+var ChangeDetectorStatus;
+(function (ChangeDetectorStatus) {
+ /**
+ * A state in which, after calling `detectChanges()`, the change detector
+ * state becomes `Checked`, and must be explicitly invoked or reactivated.
+ */
+ ChangeDetectorStatus[ChangeDetectorStatus["CheckOnce"] = 0] = "CheckOnce";
+ /**
+ * A state in which change detection is skipped until the change detector mode
+ * becomes `CheckOnce`.
+ */
+ ChangeDetectorStatus[ChangeDetectorStatus["Checked"] = 1] = "Checked";
+ /**
+ * A state in which change detection continues automatically until explicitly
+ * deactivated.
+ */
+ ChangeDetectorStatus[ChangeDetectorStatus["CheckAlways"] = 2] = "CheckAlways";
+ /**
+ * A state in which a change detector sub tree is not a part of the main tree and
+ * should be skipped.
+ */
+ ChangeDetectorStatus[ChangeDetectorStatus["Detached"] = 3] = "Detached";
+ /**
+ * Indicates that the change detector encountered an error checking a binding
+ * or calling a directive lifecycle method and is now in an inconsistent state. Change
+ * detectors in this state do not detect changes.
+ */
+ ChangeDetectorStatus[ChangeDetectorStatus["Errored"] = 4] = "Errored";
+ /**
+ * Indicates that the change detector has been destroyed.
+ */
+ ChangeDetectorStatus[ChangeDetectorStatus["Destroyed"] = 5] = "Destroyed";
+})(ChangeDetectorStatus || (ChangeDetectorStatus = {}));
+/**
+ * Reports whether a given strategy is currently the default for change detection.
+ * @param changeDetectionStrategy The strategy to check.
+ * @returns True if the given strategy is the current default, false otherwise.
+ * @see `ChangeDetectorStatus`
+ * @see `ChangeDetectorRef`
+ */
+function isDefaultChangeDetectionStrategy(changeDetectionStrategy) {
+ return changeDetectionStrategy == null ||
+ changeDetectionStrategy === ChangeDetectionStrategy.Default;
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * Defines template and style encapsulation options available for Component's {@link Component}.
+ *
+ * See {@link Component#encapsulation encapsulation}.
+ *
+ * @usageNotes
+ * ### Example
+ *
+ * {@example core/ts/metadata/encapsulation.ts region='longform'}
+ *
+ * @publicApi
+ */
+var ViewEncapsulation;
+(function (ViewEncapsulation) {
+ /**
+ * Emulate `Native` scoping of styles by adding an attribute containing surrogate id to the Host
+ * Element and pre-processing the style rules provided via {@link Component#styles styles} or
+ * {@link Component#styleUrls styleUrls}, and adding the new Host Element attribute to all
+ * selectors.
+ *
+ * This is the default option.
+ */
+ ViewEncapsulation[ViewEncapsulation["Emulated"] = 0] = "Emulated";
+ // Historically the 1 value was for `Native` encapsulation which has been removed as of v11.
+ /**
+ * Don't provide any template or style encapsulation.
+ */
+ ViewEncapsulation[ViewEncapsulation["None"] = 2] = "None";
+ /**
+ * Use Shadow DOM to encapsulate styles.
+ *
+ * For the DOM this means using modern [Shadow
+ * DOM](https://developer.mozilla.org/en-US/docs/Web/Web_Components/Using_shadow_DOM) and
+ * creating a ShadowRoot for Component's Host Element.
+ */
+ ViewEncapsulation[ViewEncapsulation["ShadowDom"] = 3] = "ShadowDom";
+})(ViewEncapsulation || (ViewEncapsulation = {}));
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+const __globalThis = typeof globalThis !== 'undefined' && globalThis;
+const __window = typeof window !== 'undefined' && window;
+const __self = typeof self !== 'undefined' && typeof WorkerGlobalScope !== 'undefined' &&
+ self instanceof WorkerGlobalScope && self;
+const __global = typeof global !== 'undefined' && global;
+// Always use __globalThis if available, which is the spec-defined global variable across all
+// environments, then fallback to __global first, because in Node tests both __global and
+// __window may be defined and _global should be __global in that case.
+const _global = __globalThis || __global || __window || __self;
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+function ngDevModeResetPerfCounters() {
+ const locationString = typeof location !== 'undefined' ? location.toString() : '';
+ const newCounters = {
+ namedConstructors: locationString.indexOf('ngDevMode=namedConstructors') != -1,
+ firstCreatePass: 0,
+ tNode: 0,
+ tView: 0,
+ rendererCreateTextNode: 0,
+ rendererSetText: 0,
+ rendererCreateElement: 0,
+ rendererAddEventListener: 0,
+ rendererSetAttribute: 0,
+ rendererRemoveAttribute: 0,
+ rendererSetProperty: 0,
+ rendererSetClassName: 0,
+ rendererAddClass: 0,
+ rendererRemoveClass: 0,
+ rendererSetStyle: 0,
+ rendererRemoveStyle: 0,
+ rendererDestroy: 0,
+ rendererDestroyNode: 0,
+ rendererMoveNode: 0,
+ rendererRemoveNode: 0,
+ rendererAppendChild: 0,
+ rendererInsertBefore: 0,
+ rendererCreateComment: 0,
+ };
+ // Make sure to refer to ngDevMode as ['ngDevMode'] for closure.
+ const allowNgDevModeTrue = locationString.indexOf('ngDevMode=false') === -1;
+ _global['ngDevMode'] = allowNgDevModeTrue && newCounters;
+ return newCounters;
+}
+/**
+ * This function checks to see if the `ngDevMode` has been set. If yes,
+ * then we honor it, otherwise we default to dev mode with additional checks.
+ *
+ * The idea is that unless we are doing production build where we explicitly
+ * set `ngDevMode == false` we should be helping the developer by providing
+ * as much early warning and errors as possible.
+ *
+ * `ɵɵdefineComponent` is guaranteed to have been called before any component template functions
+ * (and thus Ivy instructions), so a single initialization there is sufficient to ensure ngDevMode
+ * is defined for the entire instruction set.
+ *
+ * When checking `ngDevMode` on toplevel, always init it before referencing it
+ * (e.g. `((typeof ngDevMode === 'undefined' || ngDevMode) && initNgDevMode())`), otherwise you can
+ * get a `ReferenceError` like in https://github.com/angular/angular/issues/31595.
+ *
+ * Details on possible values for `ngDevMode` can be found on its docstring.
+ *
+ * NOTE:
+ * - changes to the `ngDevMode` name must be synced with `compiler-cli/src/tooling.ts`.
+ */
+function initNgDevMode() {
+ // The below checks are to ensure that calling `initNgDevMode` multiple times does not
+ // reset the counters.
+ // If the `ngDevMode` is not an object, then it means we have not created the perf counters
+ // yet.
+ if (typeof ngDevMode === 'undefined' || ngDevMode) {
+ if (typeof ngDevMode !== 'object') {
+ ngDevModeResetPerfCounters();
+ }
+ return typeof ngDevMode !== 'undefined' && !!ngDevMode;
+ }
+ return false;
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * This file contains reuseable "empty" symbols that can be used as default return values
+ * in different parts of the rendering code. Because the same symbols are returned, this
+ * allows for identity checks against these values to be consistently used by the framework
+ * code.
+ */
+const EMPTY_OBJ = {};
+const EMPTY_ARRAY = [];
+// freezing the values prevents any code from accidentally inserting new values in
+if ((typeof ngDevMode === 'undefined' || ngDevMode) && initNgDevMode()) {
+ // These property accesses can be ignored because ngDevMode will be set to false
+ // when optimizing code and the whole if statement will be dropped.
+ // tslint:disable-next-line:no-toplevel-property-access
+ Object.freeze(EMPTY_OBJ);
+ // tslint:disable-next-line:no-toplevel-property-access
+ Object.freeze(EMPTY_ARRAY);
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * This file contains reuseable "empty" symbols that can be used as default return values
+ * in different parts of the rendering code. Because the same symbols are returned, this
+ * allows for identity checks against these values to be consistently used by the framework
+ * code.
+ */
+const EMPTY_ARRAY$1 = [];
+// freezing the values prevents any code from accidentally inserting new values in
+if ((typeof ngDevMode === 'undefined' || ngDevMode) && initNgDevMode()) {
+ // These property accesses can be ignored because ngDevMode will be set to false
+ // when optimizing code and the whole if statement will be dropped.
+ // tslint:disable-next-line:no-toplevel-property-access
+ Object.freeze(EMPTY_ARRAY$1);
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+const NG_COMP_DEF = getClosureSafeProperty({ ɵcmp: getClosureSafeProperty });
+const NG_DIR_DEF = getClosureSafeProperty({ ɵdir: getClosureSafeProperty });
+const NG_PIPE_DEF = getClosureSafeProperty({ ɵpipe: getClosureSafeProperty });
+const NG_MOD_DEF = getClosureSafeProperty({ ɵmod: getClosureSafeProperty });
+const NG_LOC_ID_DEF = getClosureSafeProperty({ ɵloc: getClosureSafeProperty });
+const NG_FACTORY_DEF = getClosureSafeProperty({ ɵfac: getClosureSafeProperty });
+/**
+ * If a directive is diPublic, bloomAdd sets a property on the type with this constant as
+ * the key and the directive's unique ID as the value. This allows us to map directives to their
+ * bloom filter bit for DI.
+ */
+// TODO(misko): This is wrong. The NG_ELEMENT_ID should never be minified.
+const NG_ELEMENT_ID = getClosureSafeProperty({ __NG_ELEMENT_ID__: getClosureSafeProperty });
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+let _renderCompCount = 0;
+/**
+ * Create a component definition object.
+ *
+ *
+ * # Example
+ * ```
+ * class MyDirective {
+ * // Generated by Angular Template Compiler
+ * // [Symbol] syntax will not be supported by TypeScript until v2.7
+ * static ɵcmp = defineComponent({
+ * ...
+ * });
+ * }
+ * ```
+ * @codeGenApi
+ */
+function ɵɵdefineComponent(componentDefinition) {
+ return noSideEffects(() => {
+ // Initialize ngDevMode. This must be the first statement in ɵɵdefineComponent.
+ // See the `initNgDevMode` docstring for more information.
+ (typeof ngDevMode === 'undefined' || ngDevMode) && initNgDevMode();
+ const type = componentDefinition.type;
+ const declaredInputs = {};
+ const def = {
+ type: type,
+ providersResolver: null,
+ decls: componentDefinition.decls,
+ vars: componentDefinition.vars,
+ factory: null,
+ template: componentDefinition.template || null,
+ consts: componentDefinition.consts || null,
+ ngContentSelectors: componentDefinition.ngContentSelectors,
+ hostBindings: componentDefinition.hostBindings || null,
+ hostVars: componentDefinition.hostVars || 0,
+ hostAttrs: componentDefinition.hostAttrs || null,
+ contentQueries: componentDefinition.contentQueries || null,
+ declaredInputs: declaredInputs,
+ inputs: null,
+ outputs: null,
+ exportAs: componentDefinition.exportAs || null,
+ onPush: componentDefinition.changeDetection === ChangeDetectionStrategy.OnPush,
+ directiveDefs: null,
+ pipeDefs: null,
+ selectors: componentDefinition.selectors || EMPTY_ARRAY$1,
+ viewQuery: componentDefinition.viewQuery || null,
+ features: componentDefinition.features || null,
+ data: componentDefinition.data || {},
+ // TODO(misko): convert ViewEncapsulation into const enum so that it can be used
+ // directly in the next line. Also `None` should be 0 not 2.
+ encapsulation: componentDefinition.encapsulation || ViewEncapsulation.Emulated,
+ id: 'c',
+ styles: componentDefinition.styles || EMPTY_ARRAY$1,
+ _: null,
+ setInput: null,
+ schemas: componentDefinition.schemas || null,
+ tView: null,
+ };
+ const directiveTypes = componentDefinition.directives;
+ const feature = componentDefinition.features;
+ const pipeTypes = componentDefinition.pipes;
+ def.id += _renderCompCount++;
+ def.inputs = invertObject(componentDefinition.inputs, declaredInputs),
+ def.outputs = invertObject(componentDefinition.outputs),
+ feature && feature.forEach((fn) => fn(def));
+ def.directiveDefs = directiveTypes ?
+ () => (typeof directiveTypes === 'function' ? directiveTypes() : directiveTypes)
+ .map(extractDirectiveDef) :
+ null;
+ def.pipeDefs = pipeTypes ?
+ () => (typeof pipeTypes === 'function' ? pipeTypes() : pipeTypes).map(extractPipeDef) :
+ null;
+ return def;
+ });
+}
+/**
+ * Generated next to NgModules to monkey-patch directive and pipe references onto a component's
+ * definition, when generating a direct reference in the component file would otherwise create an
+ * import cycle.
+ *
+ * See [this explanation](https://hackmd.io/Odw80D0pR6yfsOjg_7XCJg?view) for more details.
+ *
+ * @codeGenApi
+ */
+function ɵɵsetComponentScope(type, directives, pipes) {
+ const def = type.ɵcmp;
+ def.directiveDefs = () => directives.map(extractDirectiveDef);
+ def.pipeDefs = () => pipes.map(extractPipeDef);
+}
+function extractDirectiveDef(type) {
+ const def = getComponentDef(type) || getDirectiveDef(type);
+ if (ngDevMode && !def) {
+ throw new Error(`'${type.name}' is neither 'ComponentType' or 'DirectiveType'.`);
+ }
+ return def;
+}
+function extractPipeDef(type) {
+ const def = getPipeDef(type);
+ if (ngDevMode && !def) {
+ throw new Error(`'${type.name}' is not a 'PipeType'.`);
+ }
+ return def;
+}
+const autoRegisterModuleById = {};
+/**
+ * @codeGenApi
+ */
+function ɵɵdefineNgModule(def) {
+ const res = {
+ type: def.type,
+ bootstrap: def.bootstrap || EMPTY_ARRAY$1,
+ declarations: def.declarations || EMPTY_ARRAY$1,
+ imports: def.imports || EMPTY_ARRAY$1,
+ exports: def.exports || EMPTY_ARRAY$1,
+ transitiveCompileScopes: null,
+ schemas: def.schemas || null,
+ id: def.id || null,
+ };
+ if (def.id != null) {
+ noSideEffects(() => {
+ autoRegisterModuleById[def.id] = def.type;
+ });
+ }
+ return res;
+}
+/**
+ * Adds the module metadata that is necessary to compute the module's transitive scope to an
+ * existing module definition.
+ *
+ * Scope metadata of modules is not used in production builds, so calls to this function can be
+ * marked pure to tree-shake it from the bundle, allowing for all referenced declarations
+ * to become eligible for tree-shaking as well.
+ *
+ * @codeGenApi
+ */
+function ɵɵsetNgModuleScope(type, scope) {
+ return noSideEffects(() => {
+ const ngModuleDef = getNgModuleDef(type, true);
+ ngModuleDef.declarations = scope.declarations || EMPTY_ARRAY$1;
+ ngModuleDef.imports = scope.imports || EMPTY_ARRAY$1;
+ ngModuleDef.exports = scope.exports || EMPTY_ARRAY$1;
+ });
+}
+/**
+ * Inverts an inputs or outputs lookup such that the keys, which were the
+ * minified keys, are part of the values, and the values are parsed so that
+ * the publicName of the property is the new key
+ *
+ * e.g. for
+ *
+ * ```
+ * class Comp {
+ * @Input()
+ * propName1: string;
+ *
+ * @Input('publicName2')
+ * declaredPropName2: number;
+ * }
+ * ```
+ *
+ * will be serialized as
+ *
+ * ```
+ * {
+ * propName1: 'propName1',
+ * declaredPropName2: ['publicName2', 'declaredPropName2'],
+ * }
+ * ```
+ *
+ * which is than translated by the minifier as:
+ *
+ * ```
+ * {
+ * minifiedPropName1: 'propName1',
+ * minifiedPropName2: ['publicName2', 'declaredPropName2'],
+ * }
+ * ```
+ *
+ * becomes: (public name => minifiedName)
+ *
+ * ```
+ * {
+ * 'propName1': 'minifiedPropName1',
+ * 'publicName2': 'minifiedPropName2',
+ * }
+ * ```
+ *
+ * Optionally the function can take `secondary` which will result in: (public name => declared name)
+ *
+ * ```
+ * {
+ * 'propName1': 'propName1',
+ * 'publicName2': 'declaredPropName2',
+ * }
+ * ```
+ *
+
+ */
+function invertObject(obj, secondary) {
+ if (obj == null)
+ return EMPTY_OBJ;
+ const newLookup = {};
+ for (const minifiedKey in obj) {
+ if (obj.hasOwnProperty(minifiedKey)) {
+ let publicName = obj[minifiedKey];
+ let declaredName = publicName;
+ if (Array.isArray(publicName)) {
+ declaredName = publicName[1];
+ publicName = publicName[0];
+ }
+ newLookup[publicName] = minifiedKey;
+ if (secondary) {
+ (secondary[publicName] = declaredName);
+ }
+ }
+ }
+ return newLookup;
+}
+/**
+ * Create a directive definition object.
+ *
+ * # Example
+ * ```ts
+ * class MyDirective {
+ * // Generated by Angular Template Compiler
+ * // [Symbol] syntax will not be supported by TypeScript until v2.7
+ * static ɵdir = ɵɵdefineDirective({
+ * ...
+ * });
+ * }
+ * ```
+ *
+ * @codeGenApi
+ */
+const ɵɵdefineDirective = ɵɵdefineComponent;
+/**
+ * Create a pipe definition object.
+ *
+ * # Example
+ * ```
+ * class MyPipe implements PipeTransform {
+ * // Generated by Angular Template Compiler
+ * static ɵpipe = definePipe({
+ * ...
+ * });
+ * }
+ * ```
+ * @param pipeDef Pipe definition generated by the compiler
+ *
+ * @codeGenApi
+ */
+function ɵɵdefinePipe(pipeDef) {
+ return {
+ type: pipeDef.type,
+ name: pipeDef.name,
+ factory: null,
+ pure: pipeDef.pure !== false,
+ onDestroy: pipeDef.type.prototype.ngOnDestroy || null
+ };
+}
+/**
+ * The following getter methods retrieve the definition from the type. Currently the retrieval
+ * honors inheritance, but in the future we may change the rule to require that definitions are
+ * explicit. This would require some sort of migration strategy.
+ */
+function getComponentDef(type) {
+ return type[NG_COMP_DEF] || null;
+}
+function getDirectiveDef(type) {
+ return type[NG_DIR_DEF] || null;
+}
+function getPipeDef(type) {
+ return type[NG_PIPE_DEF] || null;
+}
+function getNgModuleDef(type, throwNotFound) {
+ const ngModuleDef = type[NG_MOD_DEF] || null;
+ if (!ngModuleDef && throwNotFound === true) {
+ throw new Error(`Type ${stringify(type)} does not have 'ɵmod' property.`);
+ }
+ return ngModuleDef;
+}
+function getNgLocaleIdDef(type) {
+ return type[NG_LOC_ID_DEF] || null;
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+// Below are constants for LView indices to help us look up LView members
+// without having to remember the specific indices.
+// Uglify will inline these when minifying so there shouldn't be a cost.
+const HOST = 0;
+const TVIEW = 1;
+const FLAGS = 2;
+const PARENT = 3;
+const NEXT = 4;
+const TRANSPLANTED_VIEWS_TO_REFRESH = 5;
+const T_HOST = 6;
+const CLEANUP = 7;
+const CONTEXT = 8;
+const INJECTOR = 9;
+const RENDERER_FACTORY = 10;
+const RENDERER = 11;
+const SANITIZER = 12;
+const CHILD_HEAD = 13;
+const CHILD_TAIL = 14;
+// FIXME(misko): Investigate if the three declarations aren't all same thing.
+const DECLARATION_VIEW = 15;
+const DECLARATION_COMPONENT_VIEW = 16;
+const DECLARATION_LCONTAINER = 17;
+const PREORDER_HOOK_FLAGS = 18;
+const QUERIES = 19;
+/**
+ * Size of LView's header. Necessary to adjust for it when setting slots.
+ *
+ * IMPORTANT: `HEADER_OFFSET` should only be referred to the in the `ɵɵ*` instructions to translate
+ * instruction index into `LView` index. All other indexes should be in the `LView` index space and
+ * there should be no need to refer to `HEADER_OFFSET` anywhere else.
+ */
+const HEADER_OFFSET = 20;
+/**
+ * Converts `TViewType` into human readable text.
+ * Make sure this matches with `TViewType`
+ */
+const TViewTypeAsString = [
+ 'Root',
+ 'Component',
+ 'Embedded',
+];
+// Note: This hack is necessary so we don't erroneously get a circular dependency
+// failure based on types.
+const unusedValueExportToPlacateAjd = 1;
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * Special location which allows easy identification of type. If we have an array which was
+ * retrieved from the `LView` and that array has `true` at `TYPE` location, we know it is
+ * `LContainer`.
+ */
+const TYPE = 1;
+/**
+ * Below are constants for LContainer indices to help us look up LContainer members
+ * without having to remember the specific indices.
+ * Uglify will inline these when minifying so there shouldn't be a cost.
+ */
+/**
+ * Flag to signify that this `LContainer` may have transplanted views which need to be change
+ * detected. (see: `LView[DECLARATION_COMPONENT_VIEW])`.
+ *
+ * This flag, once set, is never unset for the `LContainer`. This means that when unset we can skip
+ * a lot of work in `refreshEmbeddedViews`. But when set we still need to verify
+ * that the `MOVED_VIEWS` are transplanted and on-push.
+ */
+const HAS_TRANSPLANTED_VIEWS = 2;
+// PARENT, NEXT, TRANSPLANTED_VIEWS_TO_REFRESH are indices 3, 4, and 5
+// As we already have these constants in LView, we don't need to re-create them.
+// T_HOST is index 6
+// We already have this constants in LView, we don't need to re-create it.
+const NATIVE = 7;
+const VIEW_REFS = 8;
+const MOVED_VIEWS = 9;
+/**
+ * Size of LContainer's header. Represents the index after which all views in the
+ * container will be inserted. We need to keep a record of current views so we know
+ * which views are already in the DOM (and don't need to be re-added) and so we can
+ * remove views from the DOM when they are no longer required.
+ */
+const CONTAINER_HEADER_OFFSET = 10;
+// Note: This hack is necessary so we don't erroneously get a circular dependency
+// failure based on types.
+const unusedValueExportToPlacateAjd$1 = 1;
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * True if `value` is `LView`.
+ * @param value wrapped value of `RNode`, `LView`, `LContainer`
+ */
+function isLView(value) {
+ return Array.isArray(value) && typeof value[TYPE] === 'object';
+}
+/**
+ * True if `value` is `LContainer`.
+ * @param value wrapped value of `RNode`, `LView`, `LContainer`
+ */
+function isLContainer(value) {
+ return Array.isArray(value) && value[TYPE] === true;
+}
+function isContentQueryHost(tNode) {
+ return (tNode.flags & 8 /* hasContentQuery */) !== 0;
+}
+function isComponentHost(tNode) {
+ return (tNode.flags & 2 /* isComponentHost */) === 2 /* isComponentHost */;
+}
+function isDirectiveHost(tNode) {
+ return (tNode.flags & 1 /* isDirectiveHost */) === 1 /* isDirectiveHost */;
+}
+function isComponentDef(def) {
+ return def.template !== null;
+}
+function isRootView(target) {
+ return (target[FLAGS] & 512 /* IsRoot */) !== 0;
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+// [Assert functions do not constraint type when they are guarded by a truthy
+// expression.](https://github.com/microsoft/TypeScript/issues/37295)
+function assertTNodeForLView(tNode, lView) {
+ assertTNodeForTView(tNode, lView[TVIEW]);
+}
+function assertTNodeForTView(tNode, tView) {
+ assertTNode(tNode);
+ tNode.hasOwnProperty('tView_') &&
+ assertEqual(tNode.tView_, tView, 'This TNode does not belong to this TView.');
+}
+function assertTNode(tNode) {
+ assertDefined(tNode, 'TNode must be defined');
+ if (!(tNode && typeof tNode === 'object' && tNode.hasOwnProperty('directiveStylingLast'))) {
+ throwError('Not of type TNode, got: ' + tNode);
+ }
+}
+function assertTIcu(tIcu) {
+ assertDefined(tIcu, 'Expected TIcu to be defined');
+ if (!(typeof tIcu.currentCaseLViewIndex === 'number')) {
+ throwError('Object is not of TIcu type.');
+ }
+}
+function assertComponentType(actual, msg = 'Type passed in is not ComponentType, it does not have \'ɵcmp\' property.') {
+ if (!getComponentDef(actual)) {
+ throwError(msg);
+ }
+}
+function assertNgModuleType(actual, msg = 'Type passed in is not NgModuleType, it does not have \'ɵmod\' property.') {
+ if (!getNgModuleDef(actual)) {
+ throwError(msg);
+ }
+}
+function assertCurrentTNodeIsParent(isParent) {
+ assertEqual(isParent, true, 'currentTNode should be a parent');
+}
+function assertHasParent(tNode) {
+ assertDefined(tNode, 'currentTNode should exist!');
+ assertDefined(tNode.parent, 'currentTNode should have a parent');
+}
+function assertDataNext(lView, index, arr) {
+ if (arr == null)
+ arr = lView;
+ assertEqual(arr.length, index, `index ${index} expected to be at the end of arr (length ${arr.length})`);
+}
+function assertLContainer(value) {
+ assertDefined(value, 'LContainer must be defined');
+ assertEqual(isLContainer(value), true, 'Expecting LContainer');
+}
+function assertLViewOrUndefined(value) {
+ value && assertEqual(isLView(value), true, 'Expecting LView or undefined or null');
+}
+function assertLView(value) {
+ assertDefined(value, 'LView must be defined');
+ assertEqual(isLView(value), true, 'Expecting LView');
+}
+function assertFirstCreatePass(tView, errMessage) {
+ assertEqual(tView.firstCreatePass, true, errMessage || 'Should only be called in first create pass.');
+}
+function assertFirstUpdatePass(tView, errMessage) {
+ assertEqual(tView.firstUpdatePass, true, errMessage || 'Should only be called in first update pass.');
+}
+/**
+ * This is a basic sanity check that an object is probably a directive def. DirectiveDef is
+ * an interface, so we can't do a direct instanceof check.
+ */
+function assertDirectiveDef(obj) {
+ if (obj.type === undefined || obj.selectors == undefined || obj.inputs === undefined) {
+ throwError(`Expected a DirectiveDef/ComponentDef and this object does not seem to have the expected shape.`);
+ }
+}
+function assertIndexInDeclRange(lView, index) {
+ const tView = lView[1];
+ assertBetween(HEADER_OFFSET, tView.bindingStartIndex, index);
+}
+function assertIndexInVarsRange(lView, index) {
+ const tView = lView[1];
+ assertBetween(tView.bindingStartIndex, tView.expandoStartIndex, index);
+}
+function assertIndexInExpandoRange(lView, index) {
+ const tView = lView[1];
+ assertBetween(tView.expandoStartIndex, lView.length, index);
+}
+function assertBetween(lower, upper, index) {
+ if (!(lower <= index && index < upper)) {
+ throwError(`Index out of range (expecting ${lower} <= ${index} < ${upper})`);
+ }
+}
+function assertProjectionSlots(lView, errMessage) {
+ assertDefined(lView[DECLARATION_COMPONENT_VIEW], 'Component views should exist.');
+ assertDefined(lView[DECLARATION_COMPONENT_VIEW][T_HOST].projection, errMessage ||
+ 'Components with projection nodes () must have projection slots defined.');
+}
+function assertParentView(lView, errMessage) {
+ assertDefined(lView, errMessage || 'Component views should always have a parent view (component\'s host view)');
+}
+/**
+ * This is a basic sanity check that the `injectorIndex` seems to point to what looks like a
+ * NodeInjector data structure.
+ *
+ * @param lView `LView` which should be checked.
+ * @param injectorIndex index into the `LView` where the `NodeInjector` is expected.
+ */
+function assertNodeInjector(lView, injectorIndex) {
+ assertIndexInExpandoRange(lView, injectorIndex);
+ assertIndexInExpandoRange(lView, injectorIndex + 8 /* PARENT */);
+ assertNumber(lView[injectorIndex + 0], 'injectorIndex should point to a bloom filter');
+ assertNumber(lView[injectorIndex + 1], 'injectorIndex should point to a bloom filter');
+ assertNumber(lView[injectorIndex + 2], 'injectorIndex should point to a bloom filter');
+ assertNumber(lView[injectorIndex + 3], 'injectorIndex should point to a bloom filter');
+ assertNumber(lView[injectorIndex + 4], 'injectorIndex should point to a bloom filter');
+ assertNumber(lView[injectorIndex + 5], 'injectorIndex should point to a bloom filter');
+ assertNumber(lView[injectorIndex + 6], 'injectorIndex should point to a bloom filter');
+ assertNumber(lView[injectorIndex + 7], 'injectorIndex should point to a bloom filter');
+ assertNumber(lView[injectorIndex + 8 /* PARENT */], 'injectorIndex should point to parent injector');
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+function getFactoryDef(type, throwNotFound) {
+ const hasFactoryDef = type.hasOwnProperty(NG_FACTORY_DEF);
+ if (!hasFactoryDef && throwNotFound === true && ngDevMode) {
+ throw new Error(`Type ${stringify(type)} does not have 'ɵfac' property.`);
+ }
+ return hasFactoryDef ? type[NG_FACTORY_DEF] : null;
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * Represents a basic change from a previous to a new value for a single
+ * property on a directive instance. Passed as a value in a
+ * {@link SimpleChanges} object to the `ngOnChanges` hook.
+ *
+ * @see `OnChanges`
+ *
+ * @publicApi
+ */
+class SimpleChange {
+ constructor(previousValue, currentValue, firstChange) {
+ this.previousValue = previousValue;
+ this.currentValue = currentValue;
+ this.firstChange = firstChange;
+ }
+ /**
+ * Check whether the new value is the first value assigned.
+ */
+ isFirstChange() {
+ return this.firstChange;
+ }
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * The NgOnChangesFeature decorates a component with support for the ngOnChanges
+ * lifecycle hook, so it should be included in any component that implements
+ * that hook.
+ *
+ * If the component or directive uses inheritance, the NgOnChangesFeature MUST
+ * be included as a feature AFTER {@link InheritDefinitionFeature}, otherwise
+ * inherited properties will not be propagated to the ngOnChanges lifecycle
+ * hook.
+ *
+ * Example usage:
+ *
+ * ```
+ * static ɵcmp = defineComponent({
+ * ...
+ * inputs: {name: 'publicName'},
+ * features: [NgOnChangesFeature]
+ * });
+ * ```
+ *
+ * @codeGenApi
+ */
+function ɵɵNgOnChangesFeature() {
+ return NgOnChangesFeatureImpl;
+}
+function NgOnChangesFeatureImpl(definition) {
+ if (definition.type.prototype.ngOnChanges) {
+ definition.setInput = ngOnChangesSetInput;
+ }
+ return rememberChangeHistoryAndInvokeOnChangesHook;
+}
+// This option ensures that the ngOnChanges lifecycle hook will be inherited
+// from superclasses (in InheritDefinitionFeature).
+/** @nocollapse */
+// tslint:disable-next-line:no-toplevel-property-access
+ɵɵNgOnChangesFeature.ngInherit = true;
+/**
+ * This is a synthetic lifecycle hook which gets inserted into `TView.preOrderHooks` to simulate
+ * `ngOnChanges`.
+ *
+ * The hook reads the `NgSimpleChangesStore` data from the component instance and if changes are
+ * found it invokes `ngOnChanges` on the component instance.
+ *
+ * @param this Component instance. Because this function gets inserted into `TView.preOrderHooks`,
+ * it is guaranteed to be called with component instance.
+ */
+function rememberChangeHistoryAndInvokeOnChangesHook() {
+ const simpleChangesStore = getSimpleChangesStore(this);
+ const current = simpleChangesStore === null || simpleChangesStore === void 0 ? void 0 : simpleChangesStore.current;
+ if (current) {
+ const previous = simpleChangesStore.previous;
+ if (previous === EMPTY_OBJ) {
+ simpleChangesStore.previous = current;
+ }
+ else {
+ // New changes are copied to the previous store, so that we don't lose history for inputs
+ // which were not changed this time
+ for (let key in current) {
+ previous[key] = current[key];
+ }
+ }
+ simpleChangesStore.current = null;
+ this.ngOnChanges(current);
+ }
+}
+function ngOnChangesSetInput(instance, value, publicName, privateName) {
+ const simpleChangesStore = getSimpleChangesStore(instance) ||
+ setSimpleChangesStore(instance, { previous: EMPTY_OBJ, current: null });
+ const current = simpleChangesStore.current || (simpleChangesStore.current = {});
+ const previous = simpleChangesStore.previous;
+ const declaredName = this.declaredInputs[publicName];
+ const previousChange = previous[declaredName];
+ current[declaredName] = new SimpleChange(previousChange && previousChange.currentValue, value, previous === EMPTY_OBJ);
+ instance[privateName] = value;
+}
+const SIMPLE_CHANGES_STORE = '__ngSimpleChanges__';
+function getSimpleChangesStore(instance) {
+ return instance[SIMPLE_CHANGES_STORE] || null;
+}
+function setSimpleChangesStore(instance, store) {
+ return instance[SIMPLE_CHANGES_STORE] = store;
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+let profilerCallback = null;
+/**
+ * Sets the callback function which will be invoked before and after performing certain actions at
+ * runtime (for example, before and after running change detection).
+ *
+ * Warning: this function is *INTERNAL* and should not be relied upon in application's code.
+ * The contract of the function might be changed in any release and/or the function can be removed
+ * completely.
+ *
+ * @param profiler function provided by the caller or null value to disable profiling.
+ */
+const setProfiler = (profiler) => {
+ profilerCallback = profiler;
+};
+/**
+ * Profiler function which wraps user code executed by the runtime.
+ *
+ * @param event ProfilerEvent corresponding to the execution context
+ * @param instance component instance
+ * @param hookOrListener lifecycle hook function or output listener. The value depends on the
+ * execution context
+ * @returns
+ */
+const profiler = function (event, instance, hookOrListener) {
+ if (profilerCallback != null /* both `null` and `undefined` */) {
+ profilerCallback(event, instance, hookOrListener);
+ }
+};
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+const SVG_NAMESPACE = 'http://www.w3.org/2000/svg';
+const MATH_ML_NAMESPACE = 'http://www.w3.org/1998/MathML/';
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * This property will be monkey-patched on elements, components and directives
+ */
+const MONKEY_PATCH_KEY_NAME = '__ngContext__';
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * Most of the use of `document` in Angular is from within the DI system so it is possible to simply
+ * inject the `DOCUMENT` token and are done.
+ *
+ * Ivy is special because it does not rely upon the DI and must get hold of the document some other
+ * way.
+ *
+ * The solution is to define `getDocument()` and `setDocument()` top-level functions for ivy.
+ * Wherever ivy needs the global document, it calls `getDocument()` instead.
+ *
+ * When running ivy outside of a browser environment, it is necessary to call `setDocument()` to
+ * tell ivy what the global `document` is.
+ *
+ * Angular does this for us in each of the standard platforms (`Browser`, `Server`, and `WebWorker`)
+ * by calling `setDocument()` when providing the `DOCUMENT` token.
+ */
+let DOCUMENT = undefined;
+/**
+ * Tell ivy what the `document` is for this platform.
+ *
+ * It is only necessary to call this if the current platform is not a browser.
+ *
+ * @param document The object representing the global `document` in this environment.
+ */
+function setDocument(document) {
+ DOCUMENT = document;
+}
+/**
+ * Access the object that represents the `document` for this platform.
+ *
+ * Ivy calls this whenever it needs to access the `document` object.
+ * For example to create the renderer or to do sanitization.
+ */
+function getDocument() {
+ if (DOCUMENT !== undefined) {
+ return DOCUMENT;
+ }
+ else if (typeof document !== 'undefined') {
+ return document;
+ }
+ // No "document" can be found. This should only happen if we are running ivy outside Angular and
+ // the current platform is not a browser. Since this is not a supported scenario at the moment
+ // this should not happen in Angular apps.
+ // Once we support running ivy outside of Angular we will need to publish `setDocument()` as a
+ // public API. Meanwhile we just return `undefined` and let the application fail.
+ return undefined;
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+// TODO: cleanup once the code is merged in angular/angular
+var RendererStyleFlags3;
+(function (RendererStyleFlags3) {
+ RendererStyleFlags3[RendererStyleFlags3["Important"] = 1] = "Important";
+ RendererStyleFlags3[RendererStyleFlags3["DashCase"] = 2] = "DashCase";
+})(RendererStyleFlags3 || (RendererStyleFlags3 = {}));
+/** Returns whether the `renderer` is a `ProceduralRenderer3` */
+function isProceduralRenderer(renderer) {
+ return !!(renderer.listen);
+}
+const ɵ0 = (hostElement, rendererType) => {
+ return getDocument();
+};
+const domRendererFactory3 = {
+ createRenderer: ɵ0
+};
+// Note: This hack is necessary so we don't erroneously get a circular dependency
+// failure based on types.
+const unusedValueExportToPlacateAjd$2 = 1;
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * For efficiency reasons we often put several different data types (`RNode`, `LView`, `LContainer`)
+ * in same location in `LView`. This is because we don't want to pre-allocate space for it
+ * because the storage is sparse. This file contains utilities for dealing with such data types.
+ *
+ * How do we know what is stored at a given location in `LView`.
+ * - `Array.isArray(value) === false` => `RNode` (The normal storage value)
+ * - `Array.isArray(value) === true` => then the `value[0]` represents the wrapped value.
+ * - `typeof value[TYPE] === 'object'` => `LView`
+ * - This happens when we have a component at a given location
+ * - `typeof value[TYPE] === true` => `LContainer`
+ * - This happens when we have `LContainer` binding at a given location.
+ *
+ *
+ * NOTE: it is assumed that `Array.isArray` and `typeof` operations are very efficient.
+ */
+/**
+ * Returns `RNode`.
+ * @param value wrapped value of `RNode`, `LView`, `LContainer`
+ */
+function unwrapRNode(value) {
+ while (Array.isArray(value)) {
+ value = value[HOST];
+ }
+ return value;
+}
+/**
+ * Returns `LView` or `null` if not found.
+ * @param value wrapped value of `RNode`, `LView`, `LContainer`
+ */
+function unwrapLView(value) {
+ while (Array.isArray(value)) {
+ // This check is same as `isLView()` but we don't call at as we don't want to call
+ // `Array.isArray()` twice and give JITer more work for inlining.
+ if (typeof value[TYPE] === 'object')
+ return value;
+ value = value[HOST];
+ }
+ return null;
+}
+/**
+ * Returns `LContainer` or `null` if not found.
+ * @param value wrapped value of `RNode`, `LView`, `LContainer`
+ */
+function unwrapLContainer(value) {
+ while (Array.isArray(value)) {
+ // This check is same as `isLContainer()` but we don't call at as we don't want to call
+ // `Array.isArray()` twice and give JITer more work for inlining.
+ if (value[TYPE] === true)
+ return value;
+ value = value[HOST];
+ }
+ return null;
+}
+/**
+ * Retrieves an element value from the provided `viewData`, by unwrapping
+ * from any containers, component views, or style contexts.
+ */
+function getNativeByIndex(index, lView) {
+ ngDevMode && assertIndexInRange(lView, index);
+ ngDevMode && assertGreaterThanOrEqual(index, HEADER_OFFSET, 'Expected to be past HEADER_OFFSET');
+ return unwrapRNode(lView[index]);
+}
+/**
+ * Retrieve an `RNode` for a given `TNode` and `LView`.
+ *
+ * This function guarantees in dev mode to retrieve a non-null `RNode`.
+ *
+ * @param tNode
+ * @param lView
+ */
+function getNativeByTNode(tNode, lView) {
+ ngDevMode && assertTNodeForLView(tNode, lView);
+ ngDevMode && assertIndexInRange(lView, tNode.index);
+ const node = unwrapRNode(lView[tNode.index]);
+ ngDevMode && !isProceduralRenderer(lView[RENDERER]) && assertDomNode(node);
+ return node;
+}
+/**
+ * Retrieve an `RNode` or `null` for a given `TNode` and `LView`.
+ *
+ * Some `TNode`s don't have associated `RNode`s. For example `Projection`
+ *
+ * @param tNode
+ * @param lView
+ */
+function getNativeByTNodeOrNull(tNode, lView) {
+ const index = tNode === null ? -1 : tNode.index;
+ if (index !== -1) {
+ ngDevMode && assertTNodeForLView(tNode, lView);
+ const node = unwrapRNode(lView[index]);
+ ngDevMode && node !== null && !isProceduralRenderer(lView[RENDERER]) && assertDomNode(node);
+ return node;
+ }
+ return null;
+}
+// fixme(misko): The return Type should be `TNode|null`
+function getTNode(tView, index) {
+ ngDevMode && assertGreaterThan(index, -1, 'wrong index for TNode');
+ ngDevMode && assertLessThan(index, tView.data.length, 'wrong index for TNode');
+ const tNode = tView.data[index];
+ ngDevMode && tNode !== null && assertTNode(tNode);
+ return tNode;
+}
+/** Retrieves a value from any `LView` or `TData`. */
+function load(view, index) {
+ ngDevMode && assertIndexInRange(view, index);
+ return view[index];
+}
+function getComponentLViewByIndex(nodeIndex, hostView) {
+ // Could be an LView or an LContainer. If LContainer, unwrap to find LView.
+ ngDevMode && assertIndexInRange(hostView, nodeIndex);
+ const slotValue = hostView[nodeIndex];
+ const lView = isLView(slotValue) ? slotValue : slotValue[HOST];
+ return lView;
+}
+/**
+ * Returns the monkey-patch value data present on the target (which could be
+ * a component, directive or a DOM node).
+ */
+function readPatchedData(target) {
+ ngDevMode && assertDefined(target, 'Target expected');
+ return target[MONKEY_PATCH_KEY_NAME] || null;
+}
+function readPatchedLView(target) {
+ const value = readPatchedData(target);
+ if (value) {
+ return Array.isArray(value) ? value : value.lView;
+ }
+ return null;
+}
+/** Checks whether a given view is in creation mode */
+function isCreationMode(view) {
+ return (view[FLAGS] & 4 /* CreationMode */) === 4 /* CreationMode */;
+}
+/**
+ * Returns a boolean for whether the view is attached to the change detection tree.
+ *
+ * Note: This determines whether a view should be checked, not whether it's inserted
+ * into a container. For that, you'll want `viewAttachedToContainer` below.
+ */
+function viewAttachedToChangeDetector(view) {
+ return (view[FLAGS] & 128 /* Attached */) === 128 /* Attached */;
+}
+/** Returns a boolean for whether the view is attached to a container. */
+function viewAttachedToContainer(view) {
+ return isLContainer(view[PARENT]);
+}
+function getConstant(consts, index) {
+ if (index === null || index === undefined)
+ return null;
+ ngDevMode && assertIndexInRange(consts, index);
+ return consts[index];
+}
+/**
+ * Resets the pre-order hook flags of the view.
+ * @param lView the LView on which the flags are reset
+ */
+function resetPreOrderHookFlags(lView) {
+ lView[PREORDER_HOOK_FLAGS] = 0;
+}
+/**
+ * Updates the `TRANSPLANTED_VIEWS_TO_REFRESH` counter on the `LContainer` as well as the parents
+ * whose
+ * 1. counter goes from 0 to 1, indicating that there is a new child that has a view to refresh
+ * or
+ * 2. counter goes from 1 to 0, indicating there are no more descendant views to refresh
+ */
+function updateTransplantedViewCount(lContainer, amount) {
+ lContainer[TRANSPLANTED_VIEWS_TO_REFRESH] += amount;
+ let viewOrContainer = lContainer;
+ let parent = lContainer[PARENT];
+ while (parent !== null &&
+ ((amount === 1 && viewOrContainer[TRANSPLANTED_VIEWS_TO_REFRESH] === 1) ||
+ (amount === -1 && viewOrContainer[TRANSPLANTED_VIEWS_TO_REFRESH] === 0))) {
+ parent[TRANSPLANTED_VIEWS_TO_REFRESH] += amount;
+ viewOrContainer = parent;
+ parent = parent[PARENT];
+ }
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+const instructionState = {
+ lFrame: createLFrame(null),
+ bindingsEnabled: true,
+ isInCheckNoChangesMode: false,
+};
+/**
+ * Returns true if the instruction state stack is empty.
+ *
+ * Intended to be called from tests only (tree shaken otherwise).
+ */
+function specOnlyIsInstructionStateEmpty() {
+ return instructionState.lFrame.parent === null;
+}
+function getElementDepthCount() {
+ return instructionState.lFrame.elementDepthCount;
+}
+function increaseElementDepthCount() {
+ instructionState.lFrame.elementDepthCount++;
+}
+function decreaseElementDepthCount() {
+ instructionState.lFrame.elementDepthCount--;
+}
+function getBindingsEnabled() {
+ return instructionState.bindingsEnabled;
+}
+/**
+ * Enables directive matching on elements.
+ *
+ * * Example:
+ * ```
+ *
+ * Should match component / directive.
+ *
+ *
+ *
+ *
+ * Should not match component / directive because we are in ngNonBindable.
+ *
+ *
+ *
+ * ```
+ *
+ * @codeGenApi
+ */
+function ɵɵenableBindings() {
+ instructionState.bindingsEnabled = true;
+}
+/**
+ * Disables directive matching on element.
+ *
+ * * Example:
+ * ```
+ *
+ * Should match component / directive.
+ *
+ *
+ *
+ *
+ * Should not match component / directive because we are in ngNonBindable.
+ *
+ *
+ *
+ * ```
+ *
+ * @codeGenApi
+ */
+function ɵɵdisableBindings() {
+ instructionState.bindingsEnabled = false;
+}
+/**
+ * Return the current `LView`.
+ */
+function getLView() {
+ return instructionState.lFrame.lView;
+}
+/**
+ * Return the current `TView`.
+ */
+function getTView() {
+ return instructionState.lFrame.tView;
+}
+/**
+ * Restores `contextViewData` to the given OpaqueViewState instance.
+ *
+ * Used in conjunction with the getCurrentView() instruction to save a snapshot
+ * of the current view and restore it when listeners are invoked. This allows
+ * walking the declaration view tree in listeners to get vars from parent views.
+ *
+ * @param viewToRestore The OpaqueViewState instance to restore.
+ *
+ * @codeGenApi
+ */
+function ɵɵrestoreView(viewToRestore) {
+ instructionState.lFrame.contextLView = viewToRestore;
+}
+function getCurrentTNode() {
+ let currentTNode = getCurrentTNodePlaceholderOk();
+ while (currentTNode !== null && currentTNode.type === 64 /* Placeholder */) {
+ currentTNode = currentTNode.parent;
+ }
+ return currentTNode;
+}
+function getCurrentTNodePlaceholderOk() {
+ return instructionState.lFrame.currentTNode;
+}
+function getCurrentParentTNode() {
+ const lFrame = instructionState.lFrame;
+ const currentTNode = lFrame.currentTNode;
+ return lFrame.isParent ? currentTNode : currentTNode.parent;
+}
+function setCurrentTNode(tNode, isParent) {
+ ngDevMode && tNode && assertTNodeForTView(tNode, instructionState.lFrame.tView);
+ const lFrame = instructionState.lFrame;
+ lFrame.currentTNode = tNode;
+ lFrame.isParent = isParent;
+}
+function isCurrentTNodeParent() {
+ return instructionState.lFrame.isParent;
+}
+function setCurrentTNodeAsNotParent() {
+ instructionState.lFrame.isParent = false;
+}
+function setCurrentTNodeAsParent() {
+ instructionState.lFrame.isParent = true;
+}
+function getContextLView() {
+ return instructionState.lFrame.contextLView;
+}
+function isInCheckNoChangesMode() {
+ // TODO(misko): remove this from the LView since it is ngDevMode=true mode only.
+ return instructionState.isInCheckNoChangesMode;
+}
+function setIsInCheckNoChangesMode(mode) {
+ instructionState.isInCheckNoChangesMode = mode;
+}
+// top level variables should not be exported for performance reasons (PERF_NOTES.md)
+function getBindingRoot() {
+ const lFrame = instructionState.lFrame;
+ let index = lFrame.bindingRootIndex;
+ if (index === -1) {
+ index = lFrame.bindingRootIndex = lFrame.tView.bindingStartIndex;
+ }
+ return index;
+}
+function getBindingIndex() {
+ return instructionState.lFrame.bindingIndex;
+}
+function setBindingIndex(value) {
+ return instructionState.lFrame.bindingIndex = value;
+}
+function nextBindingIndex() {
+ return instructionState.lFrame.bindingIndex++;
+}
+function incrementBindingIndex(count) {
+ const lFrame = instructionState.lFrame;
+ const index = lFrame.bindingIndex;
+ lFrame.bindingIndex = lFrame.bindingIndex + count;
+ return index;
+}
+function isInI18nBlock() {
+ return instructionState.lFrame.inI18n;
+}
+function setInI18nBlock(isInI18nBlock) {
+ instructionState.lFrame.inI18n = isInI18nBlock;
+}
+/**
+ * Set a new binding root index so that host template functions can execute.
+ *
+ * Bindings inside the host template are 0 index. But because we don't know ahead of time
+ * how many host bindings we have we can't pre-compute them. For this reason they are all
+ * 0 index and we just shift the root so that they match next available location in the LView.
+ *
+ * @param bindingRootIndex Root index for `hostBindings`
+ * @param currentDirectiveIndex `TData[currentDirectiveIndex]` will point to the current directive
+ * whose `hostBindings` are being processed.
+ */
+function setBindingRootForHostBindings(bindingRootIndex, currentDirectiveIndex) {
+ const lFrame = instructionState.lFrame;
+ lFrame.bindingIndex = lFrame.bindingRootIndex = bindingRootIndex;
+ setCurrentDirectiveIndex(currentDirectiveIndex);
+}
+/**
+ * When host binding is executing this points to the directive index.
+ * `TView.data[getCurrentDirectiveIndex()]` is `DirectiveDef`
+ * `LView[getCurrentDirectiveIndex()]` is directive instance.
+ */
+function getCurrentDirectiveIndex() {
+ return instructionState.lFrame.currentDirectiveIndex;
+}
+/**
+ * Sets an index of a directive whose `hostBindings` are being processed.
+ *
+ * @param currentDirectiveIndex `TData` index where current directive instance can be found.
+ */
+function setCurrentDirectiveIndex(currentDirectiveIndex) {
+ instructionState.lFrame.currentDirectiveIndex = currentDirectiveIndex;
+}
+/**
+ * Retrieve the current `DirectiveDef` which is active when `hostBindings` instruction is being
+ * executed.
+ *
+ * @param tData Current `TData` where the `DirectiveDef` will be looked up at.
+ */
+function getCurrentDirectiveDef(tData) {
+ const currentDirectiveIndex = instructionState.lFrame.currentDirectiveIndex;
+ return currentDirectiveIndex === -1 ? null : tData[currentDirectiveIndex];
+}
+function getCurrentQueryIndex() {
+ return instructionState.lFrame.currentQueryIndex;
+}
+function setCurrentQueryIndex(value) {
+ instructionState.lFrame.currentQueryIndex = value;
+}
+/**
+ * Returns a `TNode` of the location where the current `LView` is declared at.
+ *
+ * @param lView an `LView` that we want to find parent `TNode` for.
+ */
+function getDeclarationTNode(lView) {
+ const tView = lView[TVIEW];
+ // Return the declaration parent for embedded views
+ if (tView.type === 2 /* Embedded */) {
+ ngDevMode && assertDefined(tView.declTNode, 'Embedded TNodes should have declaration parents.');
+ return tView.declTNode;
+ }
+ // Components don't have `TView.declTNode` because each instance of component could be
+ // inserted in different location, hence `TView.declTNode` is meaningless.
+ // Falling back to `T_HOST` in case we cross component boundary.
+ if (tView.type === 1 /* Component */) {
+ return lView[T_HOST];
+ }
+ // Remaining TNode type is `TViewType.Root` which doesn't have a parent TNode.
+ return null;
+}
+/**
+ * This is a light weight version of the `enterView` which is needed by the DI system.
+ *
+ * @param lView `LView` location of the DI context.
+ * @param tNode `TNode` for DI context
+ * @param flags DI context flags. if `SkipSelf` flag is set than we walk up the declaration
+ * tree from `tNode` until we find parent declared `TElementNode`.
+ * @returns `true` if we have successfully entered DI associated with `tNode` (or with declared
+ * `TNode` if `flags` has `SkipSelf`). Failing to enter DI implies that no associated
+ * `NodeInjector` can be found and we should instead use `ModuleInjector`.
+ * - If `true` than this call must be fallowed by `leaveDI`
+ * - If `false` than this call failed and we should NOT call `leaveDI`
+ */
+function enterDI(lView, tNode, flags) {
+ ngDevMode && assertLViewOrUndefined(lView);
+ if (flags & InjectFlags.SkipSelf) {
+ ngDevMode && assertTNodeForTView(tNode, lView[TVIEW]);
+ let parentTNode = tNode;
+ let parentLView = lView;
+ while (true) {
+ ngDevMode && assertDefined(parentTNode, 'Parent TNode should be defined');
+ parentTNode = parentTNode.parent;
+ if (parentTNode === null && !(flags & InjectFlags.Host)) {
+ parentTNode = getDeclarationTNode(parentLView);
+ if (parentTNode === null)
+ break;
+ // In this case, a parent exists and is definitely an element. So it will definitely
+ // have an existing lView as the declaration view, which is why we can assume it's defined.
+ ngDevMode && assertDefined(parentLView, 'Parent LView should be defined');
+ parentLView = parentLView[DECLARATION_VIEW];
+ // In Ivy there are Comment nodes that correspond to ngIf and NgFor embedded directives
+ // We want to skip those and look only at Elements and ElementContainers to ensure
+ // we're looking at true parent nodes, and not content or other types.
+ if (parentTNode.type & (2 /* Element */ | 8 /* ElementContainer */)) {
+ break;
+ }
+ }
+ else {
+ break;
+ }
+ }
+ if (parentTNode === null) {
+ // If we failed to find a parent TNode this means that we should use module injector.
+ return false;
+ }
+ else {
+ tNode = parentTNode;
+ lView = parentLView;
+ }
+ }
+ ngDevMode && assertTNodeForLView(tNode, lView);
+ const lFrame = instructionState.lFrame = allocLFrame();
+ lFrame.currentTNode = tNode;
+ lFrame.lView = lView;
+ return true;
+}
+/**
+ * Swap the current lView with a new lView.
+ *
+ * For performance reasons we store the lView in the top level of the module.
+ * This way we minimize the number of properties to read. Whenever a new view
+ * is entered we have to store the lView for later, and when the view is
+ * exited the state has to be restored
+ *
+ * @param newView New lView to become active
+ * @returns the previously active lView;
+ */
+function enterView(newView) {
+ ngDevMode && assertNotEqual(newView[0], newView[1], '????');
+ ngDevMode && assertLViewOrUndefined(newView);
+ const newLFrame = allocLFrame();
+ if (ngDevMode) {
+ assertEqual(newLFrame.isParent, true, 'Expected clean LFrame');
+ assertEqual(newLFrame.lView, null, 'Expected clean LFrame');
+ assertEqual(newLFrame.tView, null, 'Expected clean LFrame');
+ assertEqual(newLFrame.selectedIndex, -1, 'Expected clean LFrame');
+ assertEqual(newLFrame.elementDepthCount, 0, 'Expected clean LFrame');
+ assertEqual(newLFrame.currentDirectiveIndex, -1, 'Expected clean LFrame');
+ assertEqual(newLFrame.currentNamespace, null, 'Expected clean LFrame');
+ assertEqual(newLFrame.bindingRootIndex, -1, 'Expected clean LFrame');
+ assertEqual(newLFrame.currentQueryIndex, 0, 'Expected clean LFrame');
+ }
+ const tView = newView[TVIEW];
+ instructionState.lFrame = newLFrame;
+ ngDevMode && tView.firstChild && assertTNodeForTView(tView.firstChild, tView);
+ newLFrame.currentTNode = tView.firstChild;
+ newLFrame.lView = newView;
+ newLFrame.tView = tView;
+ newLFrame.contextLView = newView;
+ newLFrame.bindingIndex = tView.bindingStartIndex;
+ newLFrame.inI18n = false;
+}
+/**
+ * Allocates next free LFrame. This function tries to reuse the `LFrame`s to lower memory pressure.
+ */
+function allocLFrame() {
+ const currentLFrame = instructionState.lFrame;
+ const childLFrame = currentLFrame === null ? null : currentLFrame.child;
+ const newLFrame = childLFrame === null ? createLFrame(currentLFrame) : childLFrame;
+ return newLFrame;
+}
+function createLFrame(parent) {
+ const lFrame = {
+ currentTNode: null,
+ isParent: true,
+ lView: null,
+ tView: null,
+ selectedIndex: -1,
+ contextLView: null,
+ elementDepthCount: 0,
+ currentNamespace: null,
+ currentDirectiveIndex: -1,
+ bindingRootIndex: -1,
+ bindingIndex: -1,
+ currentQueryIndex: 0,
+ parent: parent,
+ child: null,
+ inI18n: false,
+ };
+ parent !== null && (parent.child = lFrame); // link the new LFrame for reuse.
+ return lFrame;
+}
+/**
+ * A lightweight version of leave which is used with DI.
+ *
+ * This function only resets `currentTNode` and `LView` as those are the only properties
+ * used with DI (`enterDI()`).
+ *
+ * NOTE: This function is reexported as `leaveDI`. However `leaveDI` has return type of `void` where
+ * as `leaveViewLight` has `LFrame`. This is so that `leaveViewLight` can be used in `leaveView`.
+ */
+function leaveViewLight() {
+ const oldLFrame = instructionState.lFrame;
+ instructionState.lFrame = oldLFrame.parent;
+ oldLFrame.currentTNode = null;
+ oldLFrame.lView = null;
+ return oldLFrame;
+}
+/**
+ * This is a lightweight version of the `leaveView` which is needed by the DI system.
+ *
+ * NOTE: this function is an alias so that we can change the type of the function to have `void`
+ * return type.
+ */
+const leaveDI = leaveViewLight;
+/**
+ * Leave the current `LView`
+ *
+ * This pops the `LFrame` with the associated `LView` from the stack.
+ *
+ * IMPORTANT: We must zero out the `LFrame` values here otherwise they will be retained. This is
+ * because for performance reasons we don't release `LFrame` but rather keep it for next use.
+ */
+function leaveView() {
+ const oldLFrame = leaveViewLight();
+ oldLFrame.isParent = true;
+ oldLFrame.tView = null;
+ oldLFrame.selectedIndex = -1;
+ oldLFrame.contextLView = null;
+ oldLFrame.elementDepthCount = 0;
+ oldLFrame.currentDirectiveIndex = -1;
+ oldLFrame.currentNamespace = null;
+ oldLFrame.bindingRootIndex = -1;
+ oldLFrame.bindingIndex = -1;
+ oldLFrame.currentQueryIndex = 0;
+}
+function nextContextImpl(level) {
+ const contextLView = instructionState.lFrame.contextLView =
+ walkUpViews(level, instructionState.lFrame.contextLView);
+ return contextLView[CONTEXT];
+}
+function walkUpViews(nestingLevel, currentView) {
+ while (nestingLevel > 0) {
+ ngDevMode &&
+ assertDefined(currentView[DECLARATION_VIEW], 'Declaration view should be defined if nesting level is greater than 0.');
+ currentView = currentView[DECLARATION_VIEW];
+ nestingLevel--;
+ }
+ return currentView;
+}
+/**
+ * Gets the currently selected element index.
+ *
+ * Used with {@link property} instruction (and more in the future) to identify the index in the
+ * current `LView` to act on.
+ */
+function getSelectedIndex() {
+ return instructionState.lFrame.selectedIndex;
+}
+/**
+ * Sets the most recent index passed to {@link select}
+ *
+ * Used with {@link property} instruction (and more in the future) to identify the index in the
+ * current `LView` to act on.
+ *
+ * (Note that if an "exit function" was set earlier (via `setElementExitFn()`) then that will be
+ * run if and when the provided `index` value is different from the current selected index value.)
+ */
+function setSelectedIndex(index) {
+ ngDevMode && index !== -1 &&
+ assertGreaterThanOrEqual(index, HEADER_OFFSET, 'Index must be past HEADER_OFFSET (or -1).');
+ ngDevMode &&
+ assertLessThan(index, instructionState.lFrame.lView.length, 'Can\'t set index passed end of LView');
+ instructionState.lFrame.selectedIndex = index;
+}
+/**
+ * Gets the `tNode` that represents currently selected element.
+ */
+function getSelectedTNode() {
+ const lFrame = instructionState.lFrame;
+ return getTNode(lFrame.tView, lFrame.selectedIndex);
+}
+/**
+ * Sets the namespace used to create elements to `'http://www.w3.org/2000/svg'` in global state.
+ *
+ * @codeGenApi
+ */
+function ɵɵnamespaceSVG() {
+ instructionState.lFrame.currentNamespace = SVG_NAMESPACE;
+}
+/**
+ * Sets the namespace used to create elements to `'http://www.w3.org/1998/MathML/'` in global state.
+ *
+ * @codeGenApi
+ */
+function ɵɵnamespaceMathML() {
+ instructionState.lFrame.currentNamespace = MATH_ML_NAMESPACE;
+}
+/**
+ * Sets the namespace used to create elements to `null`, which forces element creation to use
+ * `createElement` rather than `createElementNS`.
+ *
+ * @codeGenApi
+ */
+function ɵɵnamespaceHTML() {
+ namespaceHTMLInternal();
+}
+/**
+ * Sets the namespace used to create elements to `null`, which forces element creation to use
+ * `createElement` rather than `createElementNS`.
+ */
+function namespaceHTMLInternal() {
+ instructionState.lFrame.currentNamespace = null;
+}
+function getNamespace() {
+ return instructionState.lFrame.currentNamespace;
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * Adds all directive lifecycle hooks from the given `DirectiveDef` to the given `TView`.
+ *
+ * Must be run *only* on the first template pass.
+ *
+ * Sets up the pre-order hooks on the provided `tView`,
+ * see {@link HookData} for details about the data structure.
+ *
+ * @param directiveIndex The index of the directive in LView
+ * @param directiveDef The definition containing the hooks to setup in tView
+ * @param tView The current TView
+ */
+function registerPreOrderHooks(directiveIndex, directiveDef, tView) {
+ ngDevMode && assertFirstCreatePass(tView);
+ const { ngOnChanges, ngOnInit, ngDoCheck } = directiveDef.type.prototype;
+ if (ngOnChanges) {
+ const wrappedOnChanges = NgOnChangesFeatureImpl(directiveDef);
+ (tView.preOrderHooks || (tView.preOrderHooks = [])).push(directiveIndex, wrappedOnChanges);
+ (tView.preOrderCheckHooks || (tView.preOrderCheckHooks = []))
+ .push(directiveIndex, wrappedOnChanges);
+ }
+ if (ngOnInit) {
+ (tView.preOrderHooks || (tView.preOrderHooks = [])).push(0 - directiveIndex, ngOnInit);
+ }
+ if (ngDoCheck) {
+ (tView.preOrderHooks || (tView.preOrderHooks = [])).push(directiveIndex, ngDoCheck);
+ (tView.preOrderCheckHooks || (tView.preOrderCheckHooks = [])).push(directiveIndex, ngDoCheck);
+ }
+}
+/**
+ *
+ * Loops through the directives on the provided `tNode` and queues hooks to be
+ * run that are not initialization hooks.
+ *
+ * Should be executed during `elementEnd()` and similar to
+ * preserve hook execution order. Content, view, and destroy hooks for projected
+ * components and directives must be called *before* their hosts.
+ *
+ * Sets up the content, view, and destroy hooks on the provided `tView`,
+ * see {@link HookData} for details about the data structure.
+ *
+ * NOTE: This does not set up `onChanges`, `onInit` or `doCheck`, those are set up
+ * separately at `elementStart`.
+ *
+ * @param tView The current TView
+ * @param tNode The TNode whose directives are to be searched for hooks to queue
+ */
+function registerPostOrderHooks(tView, tNode) {
+ ngDevMode && assertFirstCreatePass(tView);
+ // It's necessary to loop through the directives at elementEnd() (rather than processing in
+ // directiveCreate) so we can preserve the current hook order. Content, view, and destroy
+ // hooks for projected components and directives must be called *before* their hosts.
+ for (let i = tNode.directiveStart, end = tNode.directiveEnd; i < end; i++) {
+ const directiveDef = tView.data[i];
+ ngDevMode && assertDefined(directiveDef, 'Expecting DirectiveDef');
+ const lifecycleHooks = directiveDef.type.prototype;
+ const { ngAfterContentInit, ngAfterContentChecked, ngAfterViewInit, ngAfterViewChecked, ngOnDestroy } = lifecycleHooks;
+ if (ngAfterContentInit) {
+ (tView.contentHooks || (tView.contentHooks = [])).push(-i, ngAfterContentInit);
+ }
+ if (ngAfterContentChecked) {
+ (tView.contentHooks || (tView.contentHooks = [])).push(i, ngAfterContentChecked);
+ (tView.contentCheckHooks || (tView.contentCheckHooks = [])).push(i, ngAfterContentChecked);
+ }
+ if (ngAfterViewInit) {
+ (tView.viewHooks || (tView.viewHooks = [])).push(-i, ngAfterViewInit);
+ }
+ if (ngAfterViewChecked) {
+ (tView.viewHooks || (tView.viewHooks = [])).push(i, ngAfterViewChecked);
+ (tView.viewCheckHooks || (tView.viewCheckHooks = [])).push(i, ngAfterViewChecked);
+ }
+ if (ngOnDestroy != null) {
+ (tView.destroyHooks || (tView.destroyHooks = [])).push(i, ngOnDestroy);
+ }
+ }
+}
+/**
+ * Executing hooks requires complex logic as we need to deal with 2 constraints.
+ *
+ * 1. Init hooks (ngOnInit, ngAfterContentInit, ngAfterViewInit) must all be executed once and only
+ * once, across many change detection cycles. This must be true even if some hooks throw, or if
+ * some recursively trigger a change detection cycle.
+ * To solve that, it is required to track the state of the execution of these init hooks.
+ * This is done by storing and maintaining flags in the view: the {@link InitPhaseState},
+ * and the index within that phase. They can be seen as a cursor in the following structure:
+ * [[onInit1, onInit2], [afterContentInit1], [afterViewInit1, afterViewInit2, afterViewInit3]]
+ * They are are stored as flags in LView[FLAGS].
+ *
+ * 2. Pre-order hooks can be executed in batches, because of the select instruction.
+ * To be able to pause and resume their execution, we also need some state about the hook's array
+ * that is being processed:
+ * - the index of the next hook to be executed
+ * - the number of init hooks already found in the processed part of the array
+ * They are are stored as flags in LView[PREORDER_HOOK_FLAGS].
+ */
+/**
+ * Executes pre-order check hooks ( OnChanges, DoChanges) given a view where all the init hooks were
+ * executed once. This is a light version of executeInitAndCheckPreOrderHooks where we can skip read
+ * / write of the init-hooks related flags.
+ * @param lView The LView where hooks are defined
+ * @param hooks Hooks to be run
+ * @param nodeIndex 3 cases depending on the value:
+ * - undefined: all hooks from the array should be executed (post-order case)
+ * - null: execute hooks only from the saved index until the end of the array (pre-order case, when
+ * flushing the remaining hooks)
+ * - number: execute hooks only from the saved index until that node index exclusive (pre-order
+ * case, when executing select(number))
+ */
+function executeCheckHooks(lView, hooks, nodeIndex) {
+ callHooks(lView, hooks, 3 /* InitPhaseCompleted */, nodeIndex);
+}
+/**
+ * Executes post-order init and check hooks (one of AfterContentInit, AfterContentChecked,
+ * AfterViewInit, AfterViewChecked) given a view where there are pending init hooks to be executed.
+ * @param lView The LView where hooks are defined
+ * @param hooks Hooks to be run
+ * @param initPhase A phase for which hooks should be run
+ * @param nodeIndex 3 cases depending on the value:
+ * - undefined: all hooks from the array should be executed (post-order case)
+ * - null: execute hooks only from the saved index until the end of the array (pre-order case, when
+ * flushing the remaining hooks)
+ * - number: execute hooks only from the saved index until that node index exclusive (pre-order
+ * case, when executing select(number))
+ */
+function executeInitAndCheckHooks(lView, hooks, initPhase, nodeIndex) {
+ ngDevMode &&
+ assertNotEqual(initPhase, 3 /* InitPhaseCompleted */, 'Init pre-order hooks should not be called more than once');
+ if ((lView[FLAGS] & 3 /* InitPhaseStateMask */) === initPhase) {
+ callHooks(lView, hooks, initPhase, nodeIndex);
+ }
+}
+function incrementInitPhaseFlags(lView, initPhase) {
+ ngDevMode &&
+ assertNotEqual(initPhase, 3 /* InitPhaseCompleted */, 'Init hooks phase should not be incremented after all init hooks have been run.');
+ let flags = lView[FLAGS];
+ if ((flags & 3 /* InitPhaseStateMask */) === initPhase) {
+ flags &= 2047 /* IndexWithinInitPhaseReset */;
+ flags += 1 /* InitPhaseStateIncrementer */;
+ lView[FLAGS] = flags;
+ }
+}
+/**
+ * Calls lifecycle hooks with their contexts, skipping init hooks if it's not
+ * the first LView pass
+ *
+ * @param currentView The current view
+ * @param arr The array in which the hooks are found
+ * @param initPhaseState the current state of the init phase
+ * @param currentNodeIndex 3 cases depending on the value:
+ * - undefined: all hooks from the array should be executed (post-order case)
+ * - null: execute hooks only from the saved index until the end of the array (pre-order case, when
+ * flushing the remaining hooks)
+ * - number: execute hooks only from the saved index until that node index exclusive (pre-order
+ * case, when executing select(number))
+ */
+function callHooks(currentView, arr, initPhase, currentNodeIndex) {
+ ngDevMode &&
+ assertEqual(isInCheckNoChangesMode(), false, 'Hooks should never be run when in check no changes mode.');
+ const startIndex = currentNodeIndex !== undefined ?
+ (currentView[PREORDER_HOOK_FLAGS] & 65535 /* IndexOfTheNextPreOrderHookMaskMask */) :
+ 0;
+ const nodeIndexLimit = currentNodeIndex != null ? currentNodeIndex : -1;
+ const max = arr.length - 1; // Stop the loop at length - 1, because we look for the hook at i + 1
+ let lastNodeIndexFound = 0;
+ for (let i = startIndex; i < max; i++) {
+ const hook = arr[i + 1];
+ if (typeof hook === 'number') {
+ lastNodeIndexFound = arr[i];
+ if (currentNodeIndex != null && lastNodeIndexFound >= currentNodeIndex) {
+ break;
+ }
+ }
+ else {
+ const isInitHook = arr[i] < 0;
+ if (isInitHook)
+ currentView[PREORDER_HOOK_FLAGS] += 65536 /* NumberOfInitHooksCalledIncrementer */;
+ if (lastNodeIndexFound < nodeIndexLimit || nodeIndexLimit == -1) {
+ callHook(currentView, initPhase, arr, i);
+ currentView[PREORDER_HOOK_FLAGS] =
+ (currentView[PREORDER_HOOK_FLAGS] & 4294901760 /* NumberOfInitHooksCalledMask */) + i +
+ 2;
+ }
+ i++;
+ }
+ }
+}
+/**
+ * Execute one hook against the current `LView`.
+ *
+ * @param currentView The current view
+ * @param initPhaseState the current state of the init phase
+ * @param arr The array in which the hooks are found
+ * @param i The current index within the hook data array
+ */
+function callHook(currentView, initPhase, arr, i) {
+ const isInitHook = arr[i] < 0;
+ const hook = arr[i + 1];
+ const directiveIndex = isInitHook ? -arr[i] : arr[i];
+ const directive = currentView[directiveIndex];
+ if (isInitHook) {
+ const indexWithintInitPhase = currentView[FLAGS] >> 11 /* IndexWithinInitPhaseShift */;
+ // The init phase state must be always checked here as it may have been recursively updated.
+ if (indexWithintInitPhase <
+ (currentView[PREORDER_HOOK_FLAGS] >> 16 /* NumberOfInitHooksCalledShift */) &&
+ (currentView[FLAGS] & 3 /* InitPhaseStateMask */) === initPhase) {
+ currentView[FLAGS] += 2048 /* IndexWithinInitPhaseIncrementer */;
+ profiler(4 /* LifecycleHookStart */, directive, hook);
+ try {
+ hook.call(directive);
+ }
+ finally {
+ profiler(5 /* LifecycleHookEnd */, directive, hook);
+ }
+ }
+ }
+ else {
+ profiler(4 /* LifecycleHookStart */, directive, hook);
+ try {
+ hook.call(directive);
+ }
+ finally {
+ profiler(5 /* LifecycleHookEnd */, directive, hook);
+ }
+ }
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+const NO_PARENT_INJECTOR = -1;
+/**
+ * Each injector is saved in 9 contiguous slots in `LView` and 9 contiguous slots in
+ * `TView.data`. This allows us to store information about the current node's tokens (which
+ * can be shared in `TView`) as well as the tokens of its ancestor nodes (which cannot be
+ * shared, so they live in `LView`).
+ *
+ * Each of these slots (aside from the last slot) contains a bloom filter. This bloom filter
+ * determines whether a directive is available on the associated node or not. This prevents us
+ * from searching the directives array at this level unless it's probable the directive is in it.
+ *
+ * See: https://en.wikipedia.org/wiki/Bloom_filter for more about bloom filters.
+ *
+ * Because all injectors have been flattened into `LView` and `TViewData`, they cannot typed
+ * using interfaces as they were previously. The start index of each `LInjector` and `TInjector`
+ * will differ based on where it is flattened into the main array, so it's not possible to know
+ * the indices ahead of time and save their types here. The interfaces are still included here
+ * for documentation purposes.
+ *
+ * export interface LInjector extends Array {
+ *
+ * // Cumulative bloom for directive IDs 0-31 (IDs are % BLOOM_SIZE)
+ * [0]: number;
+ *
+ * // Cumulative bloom for directive IDs 32-63
+ * [1]: number;
+ *
+ * // Cumulative bloom for directive IDs 64-95
+ * [2]: number;
+ *
+ * // Cumulative bloom for directive IDs 96-127
+ * [3]: number;
+ *
+ * // Cumulative bloom for directive IDs 128-159
+ * [4]: number;
+ *
+ * // Cumulative bloom for directive IDs 160 - 191
+ * [5]: number;
+ *
+ * // Cumulative bloom for directive IDs 192 - 223
+ * [6]: number;
+ *
+ * // Cumulative bloom for directive IDs 224 - 255
+ * [7]: number;
+ *
+ * // We need to store a reference to the injector's parent so DI can keep looking up
+ * // the injector tree until it finds the dependency it's looking for.
+ * [PARENT_INJECTOR]: number;
+ * }
+ *
+ * export interface TInjector extends Array {
+ *
+ * // Shared node bloom for directive IDs 0-31 (IDs are % BLOOM_SIZE)
+ * [0]: number;
+ *
+ * // Shared node bloom for directive IDs 32-63
+ * [1]: number;
+ *
+ * // Shared node bloom for directive IDs 64-95
+ * [2]: number;
+ *
+ * // Shared node bloom for directive IDs 96-127
+ * [3]: number;
+ *
+ * // Shared node bloom for directive IDs 128-159
+ * [4]: number;
+ *
+ * // Shared node bloom for directive IDs 160 - 191
+ * [5]: number;
+ *
+ * // Shared node bloom for directive IDs 192 - 223
+ * [6]: number;
+ *
+ * // Shared node bloom for directive IDs 224 - 255
+ * [7]: number;
+ *
+ * // Necessary to find directive indices for a particular node.
+ * [TNODE]: TElementNode|TElementContainerNode|TContainerNode;
+ * }
+ */
+/**
+ * Factory for creating instances of injectors in the NodeInjector.
+ *
+ * This factory is complicated by the fact that it can resolve `multi` factories as well.
+ *
+ * NOTE: Some of the fields are optional which means that this class has two hidden classes.
+ * - One without `multi` support (most common)
+ * - One with `multi` values, (rare).
+ *
+ * Since VMs can cache up to 4 inline hidden classes this is OK.
+ *
+ * - Single factory: Only `resolving` and `factory` is defined.
+ * - `providers` factory: `componentProviders` is a number and `index = -1`.
+ * - `viewProviders` factory: `componentProviders` is a number and `index` points to `providers`.
+ */
+class NodeInjectorFactory {
+ constructor(
+ /**
+ * Factory to invoke in order to create a new instance.
+ */
+ factory,
+ /**
+ * Set to `true` if the token is declared in `viewProviders` (or if it is component).
+ */
+ isViewProvider, injectImplementation) {
+ this.factory = factory;
+ /**
+ * Marker set to true during factory invocation to see if we get into recursive loop.
+ * Recursive loop causes an error to be displayed.
+ */
+ this.resolving = false;
+ ngDevMode && assertDefined(factory, 'Factory not specified');
+ ngDevMode && assertEqual(typeof factory, 'function', 'Expected factory function.');
+ this.canSeeViewProviders = isViewProvider;
+ this.injectImpl = injectImplementation;
+ }
+}
+function isFactory(obj) {
+ return obj instanceof NodeInjectorFactory;
+}
+// Note: This hack is necessary so we don't erroneously get a circular dependency
+// failure based on types.
+const unusedValueExportToPlacateAjd$3 = 1;
+
+/**
+ * Converts `TNodeType` into human readable text.
+ * Make sure this matches with `TNodeType`
+ */
+function toTNodeTypeAsString(tNodeType) {
+ let text = '';
+ (tNodeType & 1 /* Text */) && (text += '|Text');
+ (tNodeType & 2 /* Element */) && (text += '|Element');
+ (tNodeType & 4 /* Container */) && (text += '|Container');
+ (tNodeType & 8 /* ElementContainer */) && (text += '|ElementContainer');
+ (tNodeType & 16 /* Projection */) && (text += '|Projection');
+ (tNodeType & 32 /* Icu */) && (text += '|IcuContainer');
+ (tNodeType & 64 /* Placeholder */) && (text += '|Placeholder');
+ return text.length > 0 ? text.substring(1) : text;
+}
+// Note: This hack is necessary so we don't erroneously get a circular dependency
+// failure based on types.
+const unusedValueExportToPlacateAjd$4 = 1;
+/**
+ * Returns `true` if the `TNode` has a directive which has `@Input()` for `class` binding.
+ *
+ * ```
+ *
+ * ```
+ * and
+ * ```
+ * @Directive({
+ * })
+ * class MyDirective {
+ * @Input()
+ * class: string;
+ * }
+ * ```
+ *
+ * In the above case it is necessary to write the reconciled styling information into the
+ * directive's input.
+ *
+ * @param tNode
+ */
+function hasClassInput(tNode) {
+ return (tNode.flags & 16 /* hasClassInput */) !== 0;
+}
+/**
+ * Returns `true` if the `TNode` has a directive which has `@Input()` for `style` binding.
+ *
+ * ```
+ *
+ * ```
+ * and
+ * ```
+ * @Directive({
+ * })
+ * class MyDirective {
+ * @Input()
+ * class: string;
+ * }
+ * ```
+ *
+ * In the above case it is necessary to write the reconciled styling information into the
+ * directive's input.
+ *
+ * @param tNode
+ */
+function hasStyleInput(tNode) {
+ return (tNode.flags & 32 /* hasStyleInput */) !== 0;
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+function assertTNodeType(tNode, expectedTypes, message) {
+ assertDefined(tNode, 'should be called with a TNode');
+ if ((tNode.type & expectedTypes) === 0) {
+ throwError(message ||
+ `Expected [${toTNodeTypeAsString(expectedTypes)}] but got ${toTNodeTypeAsString(tNode.type)}.`);
+ }
+}
+function assertPureTNodeType(type) {
+ if (!(type === 2 /* Element */ || //
+ type === 1 /* Text */ || //
+ type === 4 /* Container */ || //
+ type === 8 /* ElementContainer */ || //
+ type === 32 /* Icu */ || //
+ type === 16 /* Projection */ || //
+ type === 64 /* Placeholder */)) {
+ throwError(`Expected TNodeType to have only a single type selected, but got ${toTNodeTypeAsString(type)}.`);
+ }
+}
+
+/**
+ * Assigns all attribute values to the provided element via the inferred renderer.
+ *
+ * This function accepts two forms of attribute entries:
+ *
+ * default: (key, value):
+ * attrs = [key1, value1, key2, value2]
+ *
+ * namespaced: (NAMESPACE_MARKER, uri, name, value)
+ * attrs = [NAMESPACE_MARKER, uri, name, value, NAMESPACE_MARKER, uri, name, value]
+ *
+ * The `attrs` array can contain a mix of both the default and namespaced entries.
+ * The "default" values are set without a marker, but if the function comes across
+ * a marker value then it will attempt to set a namespaced value. If the marker is
+ * not of a namespaced value then the function will quit and return the index value
+ * where it stopped during the iteration of the attrs array.
+ *
+ * See [AttributeMarker] to understand what the namespace marker value is.
+ *
+ * Note that this instruction does not support assigning style and class values to
+ * an element. See `elementStart` and `elementHostAttrs` to learn how styling values
+ * are applied to an element.
+ * @param renderer The renderer to be used
+ * @param native The element that the attributes will be assigned to
+ * @param attrs The attribute array of values that will be assigned to the element
+ * @returns the index value that was last accessed in the attributes array
+ */
+function setUpAttributes(renderer, native, attrs) {
+ const isProc = isProceduralRenderer(renderer);
+ let i = 0;
+ while (i < attrs.length) {
+ const value = attrs[i];
+ if (typeof value === 'number') {
+ // only namespaces are supported. Other value types (such as style/class
+ // entries) are not supported in this function.
+ if (value !== 0 /* NamespaceURI */) {
+ break;
+ }
+ // we just landed on the marker value ... therefore
+ // we should skip to the next entry
+ i++;
+ const namespaceURI = attrs[i++];
+ const attrName = attrs[i++];
+ const attrVal = attrs[i++];
+ ngDevMode && ngDevMode.rendererSetAttribute++;
+ isProc ?
+ renderer.setAttribute(native, attrName, attrVal, namespaceURI) :
+ native.setAttributeNS(namespaceURI, attrName, attrVal);
+ }
+ else {
+ // attrName is string;
+ const attrName = value;
+ const attrVal = attrs[++i];
+ // Standard attributes
+ ngDevMode && ngDevMode.rendererSetAttribute++;
+ if (isAnimationProp(attrName)) {
+ if (isProc) {
+ renderer.setProperty(native, attrName, attrVal);
+ }
+ }
+ else {
+ isProc ?
+ renderer.setAttribute(native, attrName, attrVal) :
+ native.setAttribute(attrName, attrVal);
+ }
+ i++;
+ }
+ }
+ // another piece of code may iterate over the same attributes array. Therefore
+ // it may be helpful to return the exact spot where the attributes array exited
+ // whether by running into an unsupported marker or if all the static values were
+ // iterated over.
+ return i;
+}
+/**
+ * Test whether the given value is a marker that indicates that the following
+ * attribute values in a `TAttributes` array are only the names of attributes,
+ * and not name-value pairs.
+ * @param marker The attribute marker to test.
+ * @returns true if the marker is a "name-only" marker (e.g. `Bindings`, `Template` or `I18n`).
+ */
+function isNameOnlyAttributeMarker(marker) {
+ return marker === 3 /* Bindings */ || marker === 4 /* Template */ ||
+ marker === 6 /* I18n */;
+}
+function isAnimationProp(name) {
+ // Perf note: accessing charCodeAt to check for the first character of a string is faster as
+ // compared to accessing a character at index 0 (ex. name[0]). The main reason for this is that
+ // charCodeAt doesn't allocate memory to return a substring.
+ return name.charCodeAt(0) === 64 /* AT_SIGN */;
+}
+/**
+ * Merges `src` `TAttributes` into `dst` `TAttributes` removing any duplicates in the process.
+ *
+ * This merge function keeps the order of attrs same.
+ *
+ * @param dst Location of where the merged `TAttributes` should end up.
+ * @param src `TAttributes` which should be appended to `dst`
+ */
+function mergeHostAttrs(dst, src) {
+ if (src === null || src.length === 0) {
+ // do nothing
+ }
+ else if (dst === null || dst.length === 0) {
+ // We have source, but dst is empty, just make a copy.
+ dst = src.slice();
+ }
+ else {
+ let srcMarker = -1 /* ImplicitAttributes */;
+ for (let i = 0; i < src.length; i++) {
+ const item = src[i];
+ if (typeof item === 'number') {
+ srcMarker = item;
+ }
+ else {
+ if (srcMarker === 0 /* NamespaceURI */) {
+ // Case where we need to consume `key1`, `key2`, `value` items.
+ }
+ else if (srcMarker === -1 /* ImplicitAttributes */ ||
+ srcMarker === 2 /* Styles */) {
+ // Case where we have to consume `key1` and `value` only.
+ mergeHostAttribute(dst, srcMarker, item, null, src[++i]);
+ }
+ else {
+ // Case where we have to consume `key1` only.
+ mergeHostAttribute(dst, srcMarker, item, null, null);
+ }
+ }
+ }
+ }
+ return dst;
+}
+/**
+ * Append `key`/`value` to existing `TAttributes` taking region marker and duplicates into account.
+ *
+ * @param dst `TAttributes` to append to.
+ * @param marker Region where the `key`/`value` should be added.
+ * @param key1 Key to add to `TAttributes`
+ * @param key2 Key to add to `TAttributes` (in case of `AttributeMarker.NamespaceURI`)
+ * @param value Value to add or to overwrite to `TAttributes` Only used if `marker` is not Class.
+ */
+function mergeHostAttribute(dst, marker, key1, key2, value) {
+ let i = 0;
+ // Assume that new markers will be inserted at the end.
+ let markerInsertPosition = dst.length;
+ // scan until correct type.
+ if (marker === -1 /* ImplicitAttributes */) {
+ markerInsertPosition = -1;
+ }
+ else {
+ while (i < dst.length) {
+ const dstValue = dst[i++];
+ if (typeof dstValue === 'number') {
+ if (dstValue === marker) {
+ markerInsertPosition = -1;
+ break;
+ }
+ else if (dstValue > marker) {
+ // We need to save this as we want the markers to be inserted in specific order.
+ markerInsertPosition = i - 1;
+ break;
+ }
+ }
+ }
+ }
+ // search until you find place of insertion
+ while (i < dst.length) {
+ const item = dst[i];
+ if (typeof item === 'number') {
+ // since `i` started as the index after the marker, we did not find it if we are at the next
+ // marker
+ break;
+ }
+ else if (item === key1) {
+ // We already have same token
+ if (key2 === null) {
+ if (value !== null) {
+ dst[i + 1] = value;
+ }
+ return;
+ }
+ else if (key2 === dst[i + 1]) {
+ dst[i + 2] = value;
+ return;
+ }
+ }
+ // Increment counter.
+ i++;
+ if (key2 !== null)
+ i++;
+ if (value !== null)
+ i++;
+ }
+ // insert at location.
+ if (markerInsertPosition !== -1) {
+ dst.splice(markerInsertPosition, 0, marker);
+ i = markerInsertPosition + 1;
+ }
+ dst.splice(i++, 0, key1);
+ if (key2 !== null) {
+ dst.splice(i++, 0, key2);
+ }
+ if (value !== null) {
+ dst.splice(i++, 0, value);
+ }
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/// Parent Injector Utils ///////////////////////////////////////////////////////////////
+function hasParentInjector(parentLocation) {
+ return parentLocation !== NO_PARENT_INJECTOR;
+}
+function getParentInjectorIndex(parentLocation) {
+ ngDevMode && assertNumber(parentLocation, 'Number expected');
+ ngDevMode && assertNotEqual(parentLocation, -1, 'Not a valid state.');
+ const parentInjectorIndex = parentLocation & 32767 /* InjectorIndexMask */;
+ ngDevMode &&
+ assertGreaterThan(parentInjectorIndex, HEADER_OFFSET, 'Parent injector must be pointing past HEADER_OFFSET.');
+ return parentLocation & 32767 /* InjectorIndexMask */;
+}
+function getParentInjectorViewOffset(parentLocation) {
+ return parentLocation >> 16 /* ViewOffsetShift */;
+}
+/**
+ * Unwraps a parent injector location number to find the view offset from the current injector,
+ * then walks up the declaration view tree until the view is found that contains the parent
+ * injector.
+ *
+ * @param location The location of the parent injector, which contains the view offset
+ * @param startView The LView instance from which to start walking up the view tree
+ * @returns The LView instance that contains the parent injector
+ */
+function getParentInjectorView(location, startView) {
+ let viewOffset = getParentInjectorViewOffset(location);
+ let parentView = startView;
+ // For most cases, the parent injector can be found on the host node (e.g. for component
+ // or container), but we must keep the loop here to support the rarer case of deeply nested
+ // tags or inline views, where the parent injector might live many views
+ // above the child injector.
+ while (viewOffset > 0) {
+ parentView = parentView[DECLARATION_VIEW];
+ viewOffset--;
+ }
+ return parentView;
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * Defines if the call to `inject` should include `viewProviders` in its resolution.
+ *
+ * This is set to true when we try to instantiate a component. This value is reset in
+ * `getNodeInjectable` to a value which matches the declaration location of the token about to be
+ * instantiated. This is done so that if we are injecting a token which was declared outside of
+ * `viewProviders` we don't accidentally pull `viewProviders` in.
+ *
+ * Example:
+ *
+ * ```
+ * @Injectable()
+ * class MyService {
+ * constructor(public value: String) {}
+ * }
+ *
+ * @Component({
+ * providers: [
+ * MyService,
+ * {provide: String, value: 'providers' }
+ * ]
+ * viewProviders: [
+ * {provide: String, value: 'viewProviders'}
+ * ]
+ * })
+ * class MyComponent {
+ * constructor(myService: MyService, value: String) {
+ * // We expect that Component can see into `viewProviders`.
+ * expect(value).toEqual('viewProviders');
+ * // `MyService` was not declared in `viewProviders` hence it can't see it.
+ * expect(myService.value).toEqual('providers');
+ * }
+ * }
+ *
+ * ```
+ */
+let includeViewProviders = true;
+function setIncludeViewProviders(v) {
+ const oldValue = includeViewProviders;
+ includeViewProviders = v;
+ return oldValue;
+}
+/**
+ * The number of slots in each bloom filter (used by DI). The larger this number, the fewer
+ * directives that will share slots, and thus, the fewer false positives when checking for
+ * the existence of a directive.
+ */
+const BLOOM_SIZE = 256;
+const BLOOM_MASK = BLOOM_SIZE - 1;
+/**
+ * The number of bits that is represented by a single bloom bucket. JS bit operations are 32 bits,
+ * so each bucket represents 32 distinct tokens which accounts for log2(32) = 5 bits of a bloom hash
+ * number.
+ */
+const BLOOM_BUCKET_BITS = 5;
+/** Counter used to generate unique IDs for directives. */
+let nextNgElementId = 0;
+/**
+ * Registers this directive as present in its node's injector by flipping the directive's
+ * corresponding bit in the injector's bloom filter.
+ *
+ * @param injectorIndex The index of the node injector where this token should be registered
+ * @param tView The TView for the injector's bloom filters
+ * @param type The directive token to register
+ */
+function bloomAdd(injectorIndex, tView, type) {
+ ngDevMode && assertEqual(tView.firstCreatePass, true, 'expected firstCreatePass to be true');
+ let id;
+ if (typeof type === 'string') {
+ id = type.charCodeAt(0) || 0;
+ }
+ else if (type.hasOwnProperty(NG_ELEMENT_ID)) {
+ id = type[NG_ELEMENT_ID];
+ }
+ // Set a unique ID on the directive type, so if something tries to inject the directive,
+ // we can easily retrieve the ID and hash it into the bloom bit that should be checked.
+ if (id == null) {
+ id = type[NG_ELEMENT_ID] = nextNgElementId++;
+ }
+ // We only have BLOOM_SIZE (256) slots in our bloom filter (8 buckets * 32 bits each),
+ // so all unique IDs must be modulo-ed into a number from 0 - 255 to fit into the filter.
+ const bloomHash = id & BLOOM_MASK;
+ // Create a mask that targets the specific bit associated with the directive.
+ // JS bit operations are 32 bits, so this will be a number between 2^0 and 2^31, corresponding
+ // to bit positions 0 - 31 in a 32 bit integer.
+ const mask = 1 << bloomHash;
+ // Each bloom bucket in `tData` represents `BLOOM_BUCKET_BITS` number of bits of `bloomHash`.
+ // Any bits in `bloomHash` beyond `BLOOM_BUCKET_BITS` indicate the bucket offset that the mask
+ // should be written to.
+ tView.data[injectorIndex + (bloomHash >> BLOOM_BUCKET_BITS)] |= mask;
+}
+/**
+ * Creates (or gets an existing) injector for a given element or container.
+ *
+ * @param tNode for which an injector should be retrieved / created.
+ * @param lView View where the node is stored
+ * @returns Node injector
+ */
+function getOrCreateNodeInjectorForNode(tNode, lView) {
+ const existingInjectorIndex = getInjectorIndex(tNode, lView);
+ if (existingInjectorIndex !== -1) {
+ return existingInjectorIndex;
+ }
+ const tView = lView[TVIEW];
+ if (tView.firstCreatePass) {
+ tNode.injectorIndex = lView.length;
+ insertBloom(tView.data, tNode); // foundation for node bloom
+ insertBloom(lView, null); // foundation for cumulative bloom
+ insertBloom(tView.blueprint, null);
+ }
+ const parentLoc = getParentInjectorLocation(tNode, lView);
+ const injectorIndex = tNode.injectorIndex;
+ // If a parent injector can't be found, its location is set to -1.
+ // In that case, we don't need to set up a cumulative bloom
+ if (hasParentInjector(parentLoc)) {
+ const parentIndex = getParentInjectorIndex(parentLoc);
+ const parentLView = getParentInjectorView(parentLoc, lView);
+ const parentData = parentLView[TVIEW].data;
+ // Creates a cumulative bloom filter that merges the parent's bloom filter
+ // and its own cumulative bloom (which contains tokens for all ancestors)
+ for (let i = 0; i < 8 /* BLOOM_SIZE */; i++) {
+ lView[injectorIndex + i] = parentLView[parentIndex + i] | parentData[parentIndex + i];
+ }
+ }
+ lView[injectorIndex + 8 /* PARENT */] = parentLoc;
+ return injectorIndex;
+}
+function insertBloom(arr, footer) {
+ arr.push(0, 0, 0, 0, 0, 0, 0, 0, footer);
+}
+function getInjectorIndex(tNode, lView) {
+ if (tNode.injectorIndex === -1 ||
+ // If the injector index is the same as its parent's injector index, then the index has been
+ // copied down from the parent node. No injector has been created yet on this node.
+ (tNode.parent && tNode.parent.injectorIndex === tNode.injectorIndex) ||
+ // After the first template pass, the injector index might exist but the parent values
+ // might not have been calculated yet for this instance
+ lView[tNode.injectorIndex + 8 /* PARENT */] === null) {
+ return -1;
+ }
+ else {
+ ngDevMode && assertIndexInRange(lView, tNode.injectorIndex);
+ return tNode.injectorIndex;
+ }
+}
+/**
+ * Finds the index of the parent injector, with a view offset if applicable. Used to set the
+ * parent injector initially.
+ *
+ * @returns Returns a number that is the combination of the number of LViews that we have to go up
+ * to find the LView containing the parent inject AND the index of the injector within that LView.
+ */
+function getParentInjectorLocation(tNode, lView) {
+ if (tNode.parent && tNode.parent.injectorIndex !== -1) {
+ // If we have a parent `TNode` and there is an injector associated with it we are done, because
+ // the parent injector is within the current `LView`.
+ return tNode.parent.injectorIndex; // ViewOffset is 0
+ }
+ // When parent injector location is computed it may be outside of the current view. (ie it could
+ // be pointing to a declared parent location). This variable stores number of declaration parents
+ // we need to walk up in order to find the parent injector location.
+ let declarationViewOffset = 0;
+ let parentTNode = null;
+ let lViewCursor = lView;
+ // The parent injector is not in the current `LView`. We will have to walk the declared parent
+ // `LView` hierarchy and look for it. If we walk of the top, that means that there is no parent
+ // `NodeInjector`.
+ while (lViewCursor !== null) {
+ // First determine the `parentTNode` location. The parent pointer differs based on `TView.type`.
+ const tView = lViewCursor[TVIEW];
+ const tViewType = tView.type;
+ if (tViewType === 2 /* Embedded */) {
+ ngDevMode &&
+ assertDefined(tView.declTNode, 'Embedded TNodes should have declaration parents.');
+ parentTNode = tView.declTNode;
+ }
+ else if (tViewType === 1 /* Component */) {
+ // Components don't have `TView.declTNode` because each instance of component could be
+ // inserted in different location, hence `TView.declTNode` is meaningless.
+ parentTNode = lViewCursor[T_HOST];
+ }
+ else {
+ ngDevMode && assertEqual(tView.type, 0 /* Root */, 'Root type expected');
+ parentTNode = null;
+ }
+ if (parentTNode === null) {
+ // If we have no parent, than we are done.
+ return NO_PARENT_INJECTOR;
+ }
+ ngDevMode && parentTNode && assertTNodeForLView(parentTNode, lViewCursor[DECLARATION_VIEW]);
+ // Every iteration of the loop requires that we go to the declared parent.
+ declarationViewOffset++;
+ lViewCursor = lViewCursor[DECLARATION_VIEW];
+ if (parentTNode.injectorIndex !== -1) {
+ // We found a NodeInjector which points to something.
+ return (parentTNode.injectorIndex |
+ (declarationViewOffset << 16 /* ViewOffsetShift */));
+ }
+ }
+ return NO_PARENT_INJECTOR;
+}
+/**
+ * Makes a type or an injection token public to the DI system by adding it to an
+ * injector's bloom filter.
+ *
+ * @param di The node injector in which a directive will be added
+ * @param token The type or the injection token to be made public
+ */
+function diPublicInInjector(injectorIndex, tView, token) {
+ bloomAdd(injectorIndex, tView, token);
+}
+/**
+ * Inject static attribute value into directive constructor.
+ *
+ * This method is used with `factory` functions which are generated as part of
+ * `defineDirective` or `defineComponent`. The method retrieves the static value
+ * of an attribute. (Dynamic attributes are not supported since they are not resolved
+ * at the time of injection and can change over time.)
+ *
+ * # Example
+ * Given:
+ * ```
+ * @Component(...)
+ * class MyComponent {
+ * constructor(@Attribute('title') title: string) { ... }
+ * }
+ * ```
+ * When instantiated with
+ * ```
+ *
+ * ```
+ *
+ * Then factory method generated is:
+ * ```
+ * MyComponent.ɵcmp = defineComponent({
+ * factory: () => new MyComponent(injectAttribute('title'))
+ * ...
+ * })
+ * ```
+ *
+ * @publicApi
+ */
+function injectAttributeImpl(tNode, attrNameToInject) {
+ ngDevMode && assertTNodeType(tNode, 12 /* AnyContainer */ | 3 /* AnyRNode */);
+ ngDevMode && assertDefined(tNode, 'expecting tNode');
+ if (attrNameToInject === 'class') {
+ return tNode.classes;
+ }
+ if (attrNameToInject === 'style') {
+ return tNode.styles;
+ }
+ const attrs = tNode.attrs;
+ if (attrs) {
+ const attrsLength = attrs.length;
+ let i = 0;
+ while (i < attrsLength) {
+ const value = attrs[i];
+ // If we hit a `Bindings` or `Template` marker then we are done.
+ if (isNameOnlyAttributeMarker(value))
+ break;
+ // Skip namespaced attributes
+ if (value === 0 /* NamespaceURI */) {
+ // we skip the next two values
+ // as namespaced attributes looks like
+ // [..., AttributeMarker.NamespaceURI, 'http://someuri.com/test', 'test:exist',
+ // 'existValue', ...]
+ i = i + 2;
+ }
+ else if (typeof value === 'number') {
+ // Skip to the first value of the marked attribute.
+ i++;
+ while (i < attrsLength && typeof attrs[i] === 'string') {
+ i++;
+ }
+ }
+ else if (value === attrNameToInject) {
+ return attrs[i + 1];
+ }
+ else {
+ i = i + 2;
+ }
+ }
+ }
+ return null;
+}
+function notFoundValueOrThrow(notFoundValue, token, flags) {
+ if (flags & InjectFlags.Optional) {
+ return notFoundValue;
+ }
+ else {
+ throwProviderNotFoundError(token, 'NodeInjector');
+ }
+}
+/**
+ * Returns the value associated to the given token from the ModuleInjector or throws exception
+ *
+ * @param lView The `LView` that contains the `tNode`
+ * @param token The token to look for
+ * @param flags Injection flags
+ * @param notFoundValue The value to return when the injection flags is `InjectFlags.Optional`
+ * @returns the value from the injector or throws an exception
+ */
+function lookupTokenUsingModuleInjector(lView, token, flags, notFoundValue) {
+ if (flags & InjectFlags.Optional && notFoundValue === undefined) {
+ // This must be set or the NullInjector will throw for optional deps
+ notFoundValue = null;
+ }
+ if ((flags & (InjectFlags.Self | InjectFlags.Host)) === 0) {
+ const moduleInjector = lView[INJECTOR];
+ // switch to `injectInjectorOnly` implementation for module injector, since module injector
+ // should not have access to Component/Directive DI scope (that may happen through
+ // `directiveInject` implementation)
+ const previousInjectImplementation = setInjectImplementation(undefined);
+ try {
+ if (moduleInjector) {
+ return moduleInjector.get(token, notFoundValue, flags & InjectFlags.Optional);
+ }
+ else {
+ return injectRootLimpMode(token, notFoundValue, flags & InjectFlags.Optional);
+ }
+ }
+ finally {
+ setInjectImplementation(previousInjectImplementation);
+ }
+ }
+ return notFoundValueOrThrow(notFoundValue, token, flags);
+}
+/**
+ * Returns the value associated to the given token from the NodeInjectors => ModuleInjector.
+ *
+ * Look for the injector providing the token by walking up the node injector tree and then
+ * the module injector tree.
+ *
+ * This function patches `token` with `__NG_ELEMENT_ID__` which contains the id for the bloom
+ * filter. `-1` is reserved for injecting `Injector` (implemented by `NodeInjector`)
+ *
+ * @param tNode The Node where the search for the injector should start
+ * @param lView The `LView` that contains the `tNode`
+ * @param token The token to look for
+ * @param flags Injection flags
+ * @param notFoundValue The value to return when the injection flags is `InjectFlags.Optional`
+ * @returns the value from the injector, `null` when not found, or `notFoundValue` if provided
+ */
+function getOrCreateInjectable(tNode, lView, token, flags = InjectFlags.Default, notFoundValue) {
+ if (tNode !== null) {
+ const bloomHash = bloomHashBitOrFactory(token);
+ // If the ID stored here is a function, this is a special object like ElementRef or TemplateRef
+ // so just call the factory function to create it.
+ if (typeof bloomHash === 'function') {
+ if (!enterDI(lView, tNode, flags)) {
+ // Failed to enter DI, try module injector instead. If a token is injected with the @Host
+ // flag, the module injector is not searched for that token in Ivy.
+ return (flags & InjectFlags.Host) ?
+ notFoundValueOrThrow(notFoundValue, token, flags) :
+ lookupTokenUsingModuleInjector(lView, token, flags, notFoundValue);
+ }
+ try {
+ const value = bloomHash();
+ if (value == null && !(flags & InjectFlags.Optional)) {
+ throwProviderNotFoundError(token);
+ }
+ else {
+ return value;
+ }
+ }
+ finally {
+ leaveDI();
+ }
+ }
+ else if (typeof bloomHash === 'number') {
+ // A reference to the previous injector TView that was found while climbing the element
+ // injector tree. This is used to know if viewProviders can be accessed on the current
+ // injector.
+ let previousTView = null;
+ let injectorIndex = getInjectorIndex(tNode, lView);
+ let parentLocation = NO_PARENT_INJECTOR;
+ let hostTElementNode = flags & InjectFlags.Host ? lView[DECLARATION_COMPONENT_VIEW][T_HOST] : null;
+ // If we should skip this injector, or if there is no injector on this node, start by
+ // searching the parent injector.
+ if (injectorIndex === -1 || flags & InjectFlags.SkipSelf) {
+ parentLocation = injectorIndex === -1 ? getParentInjectorLocation(tNode, lView) :
+ lView[injectorIndex + 8 /* PARENT */];
+ if (parentLocation === NO_PARENT_INJECTOR || !shouldSearchParent(flags, false)) {
+ injectorIndex = -1;
+ }
+ else {
+ previousTView = lView[TVIEW];
+ injectorIndex = getParentInjectorIndex(parentLocation);
+ lView = getParentInjectorView(parentLocation, lView);
+ }
+ }
+ // Traverse up the injector tree until we find a potential match or until we know there
+ // *isn't* a match.
+ while (injectorIndex !== -1) {
+ ngDevMode && assertNodeInjector(lView, injectorIndex);
+ // Check the current injector. If it matches, see if it contains token.
+ const tView = lView[TVIEW];
+ ngDevMode &&
+ assertTNodeForLView(tView.data[injectorIndex + 8 /* TNODE */], lView);
+ if (bloomHasToken(bloomHash, injectorIndex, tView.data)) {
+ // At this point, we have an injector which *may* contain the token, so we step through
+ // the providers and directives associated with the injector's corresponding node to get
+ // the instance.
+ const instance = searchTokensOnInjector(injectorIndex, lView, token, previousTView, flags, hostTElementNode);
+ if (instance !== NOT_FOUND) {
+ return instance;
+ }
+ }
+ parentLocation = lView[injectorIndex + 8 /* PARENT */];
+ if (parentLocation !== NO_PARENT_INJECTOR &&
+ shouldSearchParent(flags, lView[TVIEW].data[injectorIndex + 8 /* TNODE */] === hostTElementNode) &&
+ bloomHasToken(bloomHash, injectorIndex, lView)) {
+ // The def wasn't found anywhere on this node, so it was a false positive.
+ // Traverse up the tree and continue searching.
+ previousTView = tView;
+ injectorIndex = getParentInjectorIndex(parentLocation);
+ lView = getParentInjectorView(parentLocation, lView);
+ }
+ else {
+ // If we should not search parent OR If the ancestor bloom filter value does not have the
+ // bit corresponding to the directive we can give up on traversing up to find the specific
+ // injector.
+ injectorIndex = -1;
+ }
+ }
+ }
+ }
+ return lookupTokenUsingModuleInjector(lView, token, flags, notFoundValue);
+}
+const NOT_FOUND = {};
+function createNodeInjector() {
+ return new NodeInjector(getCurrentTNode(), getLView());
+}
+function searchTokensOnInjector(injectorIndex, lView, token, previousTView, flags, hostTElementNode) {
+ const currentTView = lView[TVIEW];
+ const tNode = currentTView.data[injectorIndex + 8 /* TNODE */];
+ // First, we need to determine if view providers can be accessed by the starting element.
+ // There are two possibilities
+ const canAccessViewProviders = previousTView == null ?
+ // 1) This is the first invocation `previousTView == null` which means that we are at the
+ // `TNode` of where injector is starting to look. In such a case the only time we are allowed
+ // to look into the ViewProviders is if:
+ // - we are on a component
+ // - AND the injector set `includeViewProviders` to true (implying that the token can see
+ // ViewProviders because it is the Component or a Service which itself was declared in
+ // ViewProviders)
+ (isComponentHost(tNode) && includeViewProviders) :
+ // 2) `previousTView != null` which means that we are now walking across the parent nodes.
+ // In such a case we are only allowed to look into the ViewProviders if:
+ // - We just crossed from child View to Parent View `previousTView != currentTView`
+ // - AND the parent TNode is an Element.
+ // This means that we just came from the Component's View and therefore are allowed to see
+ // into the ViewProviders.
+ (previousTView != currentTView && ((tNode.type & 3 /* AnyRNode */) !== 0));
+ // This special case happens when there is a @host on the inject and when we are searching
+ // on the host element node.
+ const isHostSpecialCase = (flags & InjectFlags.Host) && hostTElementNode === tNode;
+ const injectableIdx = locateDirectiveOrProvider(tNode, currentTView, token, canAccessViewProviders, isHostSpecialCase);
+ if (injectableIdx !== null) {
+ return getNodeInjectable(lView, currentTView, injectableIdx, tNode);
+ }
+ else {
+ return NOT_FOUND;
+ }
+}
+/**
+ * Searches for the given token among the node's directives and providers.
+ *
+ * @param tNode TNode on which directives are present.
+ * @param tView The tView we are currently processing
+ * @param token Provider token or type of a directive to look for.
+ * @param canAccessViewProviders Whether view providers should be considered.
+ * @param isHostSpecialCase Whether the host special case applies.
+ * @returns Index of a found directive or provider, or null when none found.
+ */
+function locateDirectiveOrProvider(tNode, tView, token, canAccessViewProviders, isHostSpecialCase) {
+ const nodeProviderIndexes = tNode.providerIndexes;
+ const tInjectables = tView.data;
+ const injectablesStart = nodeProviderIndexes & 1048575 /* ProvidersStartIndexMask */;
+ const directivesStart = tNode.directiveStart;
+ const directiveEnd = tNode.directiveEnd;
+ const cptViewProvidersCount = nodeProviderIndexes >> 20 /* CptViewProvidersCountShift */;
+ const startingIndex = canAccessViewProviders ? injectablesStart : injectablesStart + cptViewProvidersCount;
+ // When the host special case applies, only the viewProviders and the component are visible
+ const endIndex = isHostSpecialCase ? injectablesStart + cptViewProvidersCount : directiveEnd;
+ for (let i = startingIndex; i < endIndex; i++) {
+ const providerTokenOrDef = tInjectables[i];
+ if (i < directivesStart && token === providerTokenOrDef ||
+ i >= directivesStart && providerTokenOrDef.type === token) {
+ return i;
+ }
+ }
+ if (isHostSpecialCase) {
+ const dirDef = tInjectables[directivesStart];
+ if (dirDef && isComponentDef(dirDef) && dirDef.type === token) {
+ return directivesStart;
+ }
+ }
+ return null;
+}
+/**
+ * Retrieve or instantiate the injectable from the `LView` at particular `index`.
+ *
+ * This function checks to see if the value has already been instantiated and if so returns the
+ * cached `injectable`. Otherwise if it detects that the value is still a factory it
+ * instantiates the `injectable` and caches the value.
+ */
+function getNodeInjectable(lView, tView, index, tNode) {
+ let value = lView[index];
+ const tData = tView.data;
+ if (isFactory(value)) {
+ const factory = value;
+ if (factory.resolving) {
+ throwCyclicDependencyError(stringifyForError(tData[index]));
+ }
+ const previousIncludeViewProviders = setIncludeViewProviders(factory.canSeeViewProviders);
+ factory.resolving = true;
+ const previousInjectImplementation = factory.injectImpl ? setInjectImplementation(factory.injectImpl) : null;
+ const success = enterDI(lView, tNode, InjectFlags.Default);
+ ngDevMode &&
+ assertEqual(success, true, 'Because flags do not contain \`SkipSelf\' we expect this to always succeed.');
+ try {
+ value = lView[index] = factory.factory(undefined, tData, lView, tNode);
+ // This code path is hit for both directives and providers.
+ // For perf reasons, we want to avoid searching for hooks on providers.
+ // It does no harm to try (the hooks just won't exist), but the extra
+ // checks are unnecessary and this is a hot path. So we check to see
+ // if the index of the dependency is in the directive range for this
+ // tNode. If it's not, we know it's a provider and skip hook registration.
+ if (tView.firstCreatePass && index >= tNode.directiveStart) {
+ ngDevMode && assertDirectiveDef(tData[index]);
+ registerPreOrderHooks(index, tData[index], tView);
+ }
+ }
+ finally {
+ previousInjectImplementation !== null &&
+ setInjectImplementation(previousInjectImplementation);
+ setIncludeViewProviders(previousIncludeViewProviders);
+ factory.resolving = false;
+ leaveDI();
+ }
+ }
+ return value;
+}
+/**
+ * Returns the bit in an injector's bloom filter that should be used to determine whether or not
+ * the directive might be provided by the injector.
+ *
+ * When a directive is public, it is added to the bloom filter and given a unique ID that can be
+ * retrieved on the Type. When the directive isn't public or the token is not a directive `null`
+ * is returned as the node injector can not possibly provide that token.
+ *
+ * @param token the injection token
+ * @returns the matching bit to check in the bloom filter or `null` if the token is not known.
+ * When the returned value is negative then it represents special values such as `Injector`.
+ */
+function bloomHashBitOrFactory(token) {
+ ngDevMode && assertDefined(token, 'token must be defined');
+ if (typeof token === 'string') {
+ return token.charCodeAt(0) || 0;
+ }
+ const tokenId =
+ // First check with `hasOwnProperty` so we don't get an inherited ID.
+ token.hasOwnProperty(NG_ELEMENT_ID) ? token[NG_ELEMENT_ID] : undefined;
+ // Negative token IDs are used for special objects such as `Injector`
+ if (typeof tokenId === 'number') {
+ if (tokenId >= 0) {
+ return tokenId & BLOOM_MASK;
+ }
+ else {
+ ngDevMode &&
+ assertEqual(tokenId, -1 /* Injector */, 'Expecting to get Special Injector Id');
+ return createNodeInjector;
+ }
+ }
+ else {
+ return tokenId;
+ }
+}
+function bloomHasToken(bloomHash, injectorIndex, injectorView) {
+ // Create a mask that targets the specific bit associated with the directive we're looking for.
+ // JS bit operations are 32 bits, so this will be a number between 2^0 and 2^31, corresponding
+ // to bit positions 0 - 31 in a 32 bit integer.
+ const mask = 1 << bloomHash;
+ // Each bloom bucket in `injectorView` represents `BLOOM_BUCKET_BITS` number of bits of
+ // `bloomHash`. Any bits in `bloomHash` beyond `BLOOM_BUCKET_BITS` indicate the bucket offset
+ // that should be used.
+ const value = injectorView[injectorIndex + (bloomHash >> BLOOM_BUCKET_BITS)];
+ // If the bloom filter value has the bit corresponding to the directive's bloomBit flipped on,
+ // this injector is a potential match.
+ return !!(value & mask);
+}
+/** Returns true if flags prevent parent injector from being searched for tokens */
+function shouldSearchParent(flags, isFirstHostTNode) {
+ return !(flags & InjectFlags.Self) && !(flags & InjectFlags.Host && isFirstHostTNode);
+}
+class NodeInjector {
+ constructor(_tNode, _lView) {
+ this._tNode = _tNode;
+ this._lView = _lView;
+ }
+ get(token, notFoundValue) {
+ return getOrCreateInjectable(this._tNode, this._lView, token, undefined, notFoundValue);
+ }
+}
+/**
+ * @codeGenApi
+ */
+function ɵɵgetInheritedFactory(type) {
+ return noSideEffects(() => {
+ const ownConstructor = type.prototype.constructor;
+ const ownFactory = ownConstructor[NG_FACTORY_DEF] || getFactoryOf(ownConstructor);
+ const objectPrototype = Object.prototype;
+ let parent = Object.getPrototypeOf(type.prototype).constructor;
+ // Go up the prototype until we hit `Object`.
+ while (parent && parent !== objectPrototype) {
+ const factory = parent[NG_FACTORY_DEF] || getFactoryOf(parent);
+ // If we hit something that has a factory and the factory isn't the same as the type,
+ // we've found the inherited factory. Note the check that the factory isn't the type's
+ // own factory is redundant in most cases, but if the user has custom decorators on the
+ // class, this lookup will start one level down in the prototype chain, causing us to
+ // find the own factory first and potentially triggering an infinite loop downstream.
+ if (factory && factory !== ownFactory) {
+ return factory;
+ }
+ parent = Object.getPrototypeOf(parent);
+ }
+ // There is no factory defined. Either this was improper usage of inheritance
+ // (no Angular decorator on the superclass) or there is no constructor at all
+ // in the inheritance chain. Since the two cases cannot be distinguished, the
+ // latter has to be assumed.
+ return t => new t();
+ });
+}
+function getFactoryOf(type) {
+ if (isForwardRef(type)) {
+ return () => {
+ const factory = getFactoryOf(resolveForwardRef(type));
+ return factory && factory();
+ };
+ }
+ return getFactoryDef(type);
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * Facade for the attribute injection from DI.
+ *
+ * @codeGenApi
+ */
+function ɵɵinjectAttribute(attrNameToInject) {
+ return injectAttributeImpl(getCurrentTNode(), attrNameToInject);
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+const ANNOTATIONS = '__annotations__';
+const PARAMETERS = '__parameters__';
+const PROP_METADATA = '__prop__metadata__';
+/**
+ * @suppress {globalThis}
+ */
+function makeDecorator(name, props, parentClass, additionalProcessing, typeFn) {
+ return noSideEffects(() => {
+ const metaCtor = makeMetadataCtor(props);
+ function DecoratorFactory(...args) {
+ if (this instanceof DecoratorFactory) {
+ metaCtor.call(this, ...args);
+ return this;
+ }
+ const annotationInstance = new DecoratorFactory(...args);
+ return function TypeDecorator(cls) {
+ if (typeFn)
+ typeFn(cls, ...args);
+ // Use of Object.defineProperty is important since it creates non-enumerable property which
+ // prevents the property is copied during subclassing.
+ const annotations = cls.hasOwnProperty(ANNOTATIONS) ?
+ cls[ANNOTATIONS] :
+ Object.defineProperty(cls, ANNOTATIONS, { value: [] })[ANNOTATIONS];
+ annotations.push(annotationInstance);
+ if (additionalProcessing)
+ additionalProcessing(cls);
+ return cls;
+ };
+ }
+ if (parentClass) {
+ DecoratorFactory.prototype = Object.create(parentClass.prototype);
+ }
+ DecoratorFactory.prototype.ngMetadataName = name;
+ DecoratorFactory.annotationCls = DecoratorFactory;
+ return DecoratorFactory;
+ });
+}
+function makeMetadataCtor(props) {
+ return function ctor(...args) {
+ if (props) {
+ const values = props(...args);
+ for (const propName in values) {
+ this[propName] = values[propName];
+ }
+ }
+ };
+}
+function makeParamDecorator(name, props, parentClass) {
+ return noSideEffects(() => {
+ const metaCtor = makeMetadataCtor(props);
+ function ParamDecoratorFactory(...args) {
+ if (this instanceof ParamDecoratorFactory) {
+ metaCtor.apply(this, args);
+ return this;
+ }
+ const annotationInstance = new ParamDecoratorFactory(...args);
+ ParamDecorator.annotation = annotationInstance;
+ return ParamDecorator;
+ function ParamDecorator(cls, unusedKey, index) {
+ // Use of Object.defineProperty is important since it creates non-enumerable property which
+ // prevents the property is copied during subclassing.
+ const parameters = cls.hasOwnProperty(PARAMETERS) ?
+ cls[PARAMETERS] :
+ Object.defineProperty(cls, PARAMETERS, { value: [] })[PARAMETERS];
+ // there might be gaps if some in between parameters do not have annotations.
+ // we pad with nulls.
+ while (parameters.length <= index) {
+ parameters.push(null);
+ }
+ (parameters[index] = parameters[index] || []).push(annotationInstance);
+ return cls;
+ }
+ }
+ if (parentClass) {
+ ParamDecoratorFactory.prototype = Object.create(parentClass.prototype);
+ }
+ ParamDecoratorFactory.prototype.ngMetadataName = name;
+ ParamDecoratorFactory.annotationCls = ParamDecoratorFactory;
+ return ParamDecoratorFactory;
+ });
+}
+function makePropDecorator(name, props, parentClass, additionalProcessing) {
+ return noSideEffects(() => {
+ const metaCtor = makeMetadataCtor(props);
+ function PropDecoratorFactory(...args) {
+ if (this instanceof PropDecoratorFactory) {
+ metaCtor.apply(this, args);
+ return this;
+ }
+ const decoratorInstance = new PropDecoratorFactory(...args);
+ function PropDecorator(target, name) {
+ const constructor = target.constructor;
+ // Use of Object.defineProperty is important because it creates a non-enumerable property
+ // which prevents the property from being copied during subclassing.
+ const meta = constructor.hasOwnProperty(PROP_METADATA) ?
+ constructor[PROP_METADATA] :
+ Object.defineProperty(constructor, PROP_METADATA, { value: {} })[PROP_METADATA];
+ meta[name] = meta.hasOwnProperty(name) && meta[name] || [];
+ meta[name].unshift(decoratorInstance);
+ if (additionalProcessing)
+ additionalProcessing(target, name, ...args);
+ }
+ return PropDecorator;
+ }
+ if (parentClass) {
+ PropDecoratorFactory.prototype = Object.create(parentClass.prototype);
+ }
+ PropDecoratorFactory.prototype.ngMetadataName = name;
+ PropDecoratorFactory.annotationCls = PropDecoratorFactory;
+ return PropDecoratorFactory;
+ });
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+function CREATE_ATTRIBUTE_DECORATOR__PRE_R3__() {
+ return makeParamDecorator('Attribute', (attributeName) => ({ attributeName }));
+}
+function CREATE_ATTRIBUTE_DECORATOR__POST_R3__() {
+ return makeParamDecorator('Attribute', (attributeName) => ({ attributeName, __NG_ELEMENT_ID__: () => ɵɵinjectAttribute(attributeName) }));
+}
+const CREATE_ATTRIBUTE_DECORATOR_IMPL = CREATE_ATTRIBUTE_DECORATOR__POST_R3__;
+/**
+ * Attribute decorator and metadata.
+ *
+ * @Annotation
+ * @publicApi
+ */
+const Attribute = CREATE_ATTRIBUTE_DECORATOR_IMPL();
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * Creates a token that can be used in a DI Provider.
+ *
+ * Use an `InjectionToken` whenever the type you are injecting is not reified (does not have a
+ * runtime representation) such as when injecting an interface, callable type, array or
+ * parameterized type.
+ *
+ * `InjectionToken` is parameterized on `T` which is the type of object which will be returned by
+ * the `Injector`. This provides additional level of type safety.
+ *
+ * ```
+ * interface MyInterface {...}
+ * var myInterface = injector.get(new InjectionToken('SomeToken'));
+ * // myInterface is inferred to be MyInterface.
+ * ```
+ *
+ * When creating an `InjectionToken`, you can optionally specify a factory function which returns
+ * (possibly by creating) a default value of the parameterized type `T`. This sets up the
+ * `InjectionToken` using this factory as a provider as if it was defined explicitly in the
+ * application's root injector. If the factory function, which takes zero arguments, needs to inject
+ * dependencies, it can do so using the `inject` function. See below for an example.
+ *
+ * Additionally, if a `factory` is specified you can also specify the `providedIn` option, which
+ * overrides the above behavior and marks the token as belonging to a particular `@NgModule`. As
+ * mentioned above, `'root'` is the default value for `providedIn`.
+ *
+ * @usageNotes
+ * ### Basic Example
+ *
+ * ### Plain InjectionToken
+ *
+ * {@example core/di/ts/injector_spec.ts region='InjectionToken'}
+ *
+ * ### Tree-shakable InjectionToken
+ *
+ * {@example core/di/ts/injector_spec.ts region='ShakableInjectionToken'}
+ *
+ *
+ * @publicApi
+ */
+class InjectionToken {
+ constructor(_desc, options) {
+ this._desc = _desc;
+ /** @internal */
+ this.ngMetadataName = 'InjectionToken';
+ this.ɵprov = undefined;
+ if (typeof options == 'number') {
+ (typeof ngDevMode === 'undefined' || ngDevMode) &&
+ assertLessThan(options, 0, 'Only negative numbers are supported here');
+ // This is a special hack to assign __NG_ELEMENT_ID__ to this instance.
+ // See `InjectorMarkers`
+ this.__NG_ELEMENT_ID__ = options;
+ }
+ else if (options !== undefined) {
+ this.ɵprov = ɵɵdefineInjectable({
+ token: this,
+ providedIn: options.providedIn || 'root',
+ factory: options.factory,
+ });
+ }
+ }
+ toString() {
+ return `InjectionToken ${this._desc}`;
+ }
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * A DI token that you can use to create a virtual [provider](guide/glossary#provider)
+ * that will populate the `entryComponents` field of components and NgModules
+ * based on its `useValue` property value.
+ * All components that are referenced in the `useValue` value (either directly
+ * or in a nested array or map) are added to the `entryComponents` property.
+ *
+ * @usageNotes
+ *
+ * The following example shows how the router can populate the `entryComponents`
+ * field of an NgModule based on a router configuration that refers
+ * to components.
+ *
+ * ```typescript
+ * // helper function inside the router
+ * function provideRoutes(routes) {
+ * return [
+ * {provide: ROUTES, useValue: routes},
+ * {provide: ANALYZE_FOR_ENTRY_COMPONENTS, useValue: routes, multi: true}
+ * ];
+ * }
+ *
+ * // user code
+ * let routes = [
+ * {path: '/root', component: RootComp},
+ * {path: '/teams', component: TeamsComp}
+ * ];
+ *
+ * @NgModule({
+ * providers: [provideRoutes(routes)]
+ * })
+ * class ModuleWithRoutes {}
+ * ```
+ *
+ * @publicApi
+ * @deprecated Since 9.0.0. With Ivy, this property is no longer necessary.
+ */
+const ANALYZE_FOR_ENTRY_COMPONENTS = new InjectionToken('AnalyzeForEntryComponents');
+// Stores the default value of `emitDistinctChangesOnly` when the `emitDistinctChangesOnly` is not
+// explicitly set. This value will be changed to `true` in v12.
+// TODO(misko): switch the default in v12 to `true`. See: packages/compiler/src/core.ts
+const emitDistinctChangesOnlyDefaultValue = false;
+/**
+ * Base class for query metadata.
+ *
+ * @see `ContentChildren`.
+ * @see `ContentChild`.
+ * @see `ViewChildren`.
+ * @see `ViewChild`.
+ *
+ * @publicApi
+ */
+class Query {
+}
+const ɵ0$1 = (selector, data = {}) => (Object.assign({ selector, first: false, isViewQuery: false, descendants: false, emitDistinctChangesOnly: emitDistinctChangesOnlyDefaultValue }, data));
+/**
+ * ContentChildren decorator and metadata.
+ *
+ *
+ * @Annotation
+ * @publicApi
+ */
+const ContentChildren = makePropDecorator('ContentChildren', ɵ0$1, Query);
+const ɵ1 = (selector, data = {}) => (Object.assign({ selector, first: true, isViewQuery: false, descendants: true }, data));
+/**
+ * ContentChild decorator and metadata.
+ *
+ *
+ * @Annotation
+ *
+ * @publicApi
+ */
+const ContentChild = makePropDecorator('ContentChild', ɵ1, Query);
+const ɵ2 = (selector, data = {}) => (Object.assign({ selector, first: false, isViewQuery: true, descendants: true, emitDistinctChangesOnly: emitDistinctChangesOnlyDefaultValue }, data));
+/**
+ * ViewChildren decorator and metadata.
+ *
+ * @Annotation
+ * @publicApi
+ */
+const ViewChildren = makePropDecorator('ViewChildren', ɵ2, Query);
+const ɵ3 = (selector, data) => (Object.assign({ selector, first: true, isViewQuery: true, descendants: true }, data));
+/**
+ * ViewChild decorator and metadata.
+ *
+ * @Annotation
+ * @publicApi
+ */
+const ViewChild = makePropDecorator('ViewChild', ɵ3, Query);
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+var R3ResolvedDependencyType;
+(function (R3ResolvedDependencyType) {
+ R3ResolvedDependencyType[R3ResolvedDependencyType["Token"] = 0] = "Token";
+ R3ResolvedDependencyType[R3ResolvedDependencyType["Attribute"] = 1] = "Attribute";
+ R3ResolvedDependencyType[R3ResolvedDependencyType["ChangeDetectorRef"] = 2] = "ChangeDetectorRef";
+ R3ResolvedDependencyType[R3ResolvedDependencyType["Invalid"] = 3] = "Invalid";
+})(R3ResolvedDependencyType || (R3ResolvedDependencyType = {}));
+var R3FactoryTarget;
+(function (R3FactoryTarget) {
+ R3FactoryTarget[R3FactoryTarget["Directive"] = 0] = "Directive";
+ R3FactoryTarget[R3FactoryTarget["Component"] = 1] = "Component";
+ R3FactoryTarget[R3FactoryTarget["Injectable"] = 2] = "Injectable";
+ R3FactoryTarget[R3FactoryTarget["Pipe"] = 3] = "Pipe";
+ R3FactoryTarget[R3FactoryTarget["NgModule"] = 4] = "NgModule";
+})(R3FactoryTarget || (R3FactoryTarget = {}));
+var ViewEncapsulation$1;
+(function (ViewEncapsulation) {
+ ViewEncapsulation[ViewEncapsulation["Emulated"] = 0] = "Emulated";
+ // Historically the 1 value was for `Native` encapsulation which has been removed as of v11.
+ ViewEncapsulation[ViewEncapsulation["None"] = 2] = "None";
+ ViewEncapsulation[ViewEncapsulation["ShadowDom"] = 3] = "ShadowDom";
+})(ViewEncapsulation$1 || (ViewEncapsulation$1 = {}));
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+function getCompilerFacade() {
+ const globalNg = _global['ng'];
+ if (!globalNg || !globalNg.ɵcompilerFacade) {
+ throw new Error(`Angular JIT compilation failed: '@angular/compiler' not loaded!\n` +
+ ` - JIT compilation is discouraged for production use-cases! Consider AOT mode instead.\n` +
+ ` - Did you bootstrap using '@angular/platform-browser-dynamic' or '@angular/platform-server'?\n` +
+ ` - Alternatively provide the compiler with 'import "@angular/compiler";' before bootstrapping.`);
+ }
+ return globalNg.ɵcompilerFacade;
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * @description
+ *
+ * Represents a type that a Component or other object is instances of.
+ *
+ * An example of a `Type` is `MyCustomComponent` class, which in JavaScript is represented by
+ * the `MyCustomComponent` constructor function.
+ *
+ * @publicApi
+ */
+const Type = Function;
+function isType(v) {
+ return typeof v === 'function';
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * Equivalent to ES6 spread, add each item to an array.
+ *
+ * @param items The items to add
+ * @param arr The array to which you want to add the items
+ */
+function addAllToArray(items, arr) {
+ for (let i = 0; i < items.length; i++) {
+ arr.push(items[i]);
+ }
+}
+/**
+ * Determines if the contents of two arrays is identical
+ *
+ * @param a first array
+ * @param b second array
+ * @param identityAccessor Optional function for extracting stable object identity from a value in
+ * the array.
+ */
+function arrayEquals(a, b, identityAccessor) {
+ if (a.length !== b.length)
+ return false;
+ for (let i = 0; i < a.length; i++) {
+ let valueA = a[i];
+ let valueB = b[i];
+ if (identityAccessor) {
+ valueA = identityAccessor(valueA);
+ valueB = identityAccessor(valueB);
+ }
+ if (valueB !== valueA) {
+ return false;
+ }
+ }
+ return true;
+}
+/**
+ * Flattens an array.
+ */
+function flatten(list, dst) {
+ if (dst === undefined)
+ dst = list;
+ for (let i = 0; i < list.length; i++) {
+ let item = list[i];
+ if (Array.isArray(item)) {
+ // we need to inline it.
+ if (dst === list) {
+ // Our assumption that the list was already flat was wrong and
+ // we need to clone flat since we need to write to it.
+ dst = list.slice(0, i);
+ }
+ flatten(item, dst);
+ }
+ else if (dst !== list) {
+ dst.push(item);
+ }
+ }
+ return dst;
+}
+function deepForEach(input, fn) {
+ input.forEach(value => Array.isArray(value) ? deepForEach(value, fn) : fn(value));
+}
+function addToArray(arr, index, value) {
+ // perf: array.push is faster than array.splice!
+ if (index >= arr.length) {
+ arr.push(value);
+ }
+ else {
+ arr.splice(index, 0, value);
+ }
+}
+function removeFromArray(arr, index) {
+ // perf: array.pop is faster than array.splice!
+ if (index >= arr.length - 1) {
+ return arr.pop();
+ }
+ else {
+ return arr.splice(index, 1)[0];
+ }
+}
+function newArray(size, value) {
+ const list = [];
+ for (let i = 0; i < size; i++) {
+ list.push(value);
+ }
+ return list;
+}
+/**
+ * Remove item from array (Same as `Array.splice()` but faster.)
+ *
+ * `Array.splice()` is not as fast because it has to allocate an array for the elements which were
+ * removed. This causes memory pressure and slows down code when most of the time we don't
+ * care about the deleted items array.
+ *
+ * https://jsperf.com/fast-array-splice (About 20x faster)
+ *
+ * @param array Array to splice
+ * @param index Index of element in array to remove.
+ * @param count Number of items to remove.
+ */
+function arraySplice(array, index, count) {
+ const length = array.length - count;
+ while (index < length) {
+ array[index] = array[index + count];
+ index++;
+ }
+ while (count--) {
+ array.pop(); // shrink the array
+ }
+}
+/**
+ * Same as `Array.splice(index, 0, value)` but faster.
+ *
+ * `Array.splice()` is not fast because it has to allocate an array for the elements which were
+ * removed. This causes memory pressure and slows down code when most of the time we don't
+ * care about the deleted items array.
+ *
+ * @param array Array to splice.
+ * @param index Index in array where the `value` should be added.
+ * @param value Value to add to array.
+ */
+function arrayInsert(array, index, value) {
+ ngDevMode && assertLessThanOrEqual(index, array.length, 'Can\'t insert past array end.');
+ let end = array.length;
+ while (end > index) {
+ const previousEnd = end - 1;
+ array[end] = array[previousEnd];
+ end = previousEnd;
+ }
+ array[index] = value;
+}
+/**
+ * Same as `Array.splice2(index, 0, value1, value2)` but faster.
+ *
+ * `Array.splice()` is not fast because it has to allocate an array for the elements which were
+ * removed. This causes memory pressure and slows down code when most of the time we don't
+ * care about the deleted items array.
+ *
+ * @param array Array to splice.
+ * @param index Index in array where the `value` should be added.
+ * @param value1 Value to add to array.
+ * @param value2 Value to add to array.
+ */
+function arrayInsert2(array, index, value1, value2) {
+ ngDevMode && assertLessThanOrEqual(index, array.length, 'Can\'t insert past array end.');
+ let end = array.length;
+ if (end == index) {
+ // inserting at the end.
+ array.push(value1, value2);
+ }
+ else if (end === 1) {
+ // corner case when we have less items in array than we have items to insert.
+ array.push(value2, array[0]);
+ array[0] = value1;
+ }
+ else {
+ end--;
+ array.push(array[end - 1], array[end]);
+ while (end > index) {
+ const previousEnd = end - 2;
+ array[end] = array[previousEnd];
+ end--;
+ }
+ array[index] = value1;
+ array[index + 1] = value2;
+ }
+}
+/**
+ * Insert a `value` into an `array` so that the array remains sorted.
+ *
+ * NOTE:
+ * - Duplicates are not allowed, and are ignored.
+ * - This uses binary search algorithm for fast inserts.
+ *
+ * @param array A sorted array to insert into.
+ * @param value The value to insert.
+ * @returns index of the inserted value.
+ */
+function arrayInsertSorted(array, value) {
+ let index = arrayIndexOfSorted(array, value);
+ if (index < 0) {
+ // if we did not find it insert it.
+ index = ~index;
+ arrayInsert(array, index, value);
+ }
+ return index;
+}
+/**
+ * Remove `value` from a sorted `array`.
+ *
+ * NOTE:
+ * - This uses binary search algorithm for fast removals.
+ *
+ * @param array A sorted array to remove from.
+ * @param value The value to remove.
+ * @returns index of the removed value.
+ * - positive index if value found and removed.
+ * - negative index if value not found. (`~index` to get the value where it should have been
+ * inserted)
+ */
+function arrayRemoveSorted(array, value) {
+ const index = arrayIndexOfSorted(array, value);
+ if (index >= 0) {
+ arraySplice(array, index, 1);
+ }
+ return index;
+}
+/**
+ * Get an index of an `value` in a sorted `array`.
+ *
+ * NOTE:
+ * - This uses binary search algorithm for fast removals.
+ *
+ * @param array A sorted array to binary search.
+ * @param value The value to look for.
+ * @returns index of the value.
+ * - positive index if value found.
+ * - negative index if value not found. (`~index` to get the value where it should have been
+ * located)
+ */
+function arrayIndexOfSorted(array, value) {
+ return _arrayIndexOfSorted(array, value, 0);
+}
+/**
+ * Set a `value` for a `key`.
+ *
+ * @param keyValueArray to modify.
+ * @param key The key to locate or create.
+ * @param value The value to set for a `key`.
+ * @returns index (always even) of where the value vas set.
+ */
+function keyValueArraySet(keyValueArray, key, value) {
+ let index = keyValueArrayIndexOf(keyValueArray, key);
+ if (index >= 0) {
+ // if we found it set it.
+ keyValueArray[index | 1] = value;
+ }
+ else {
+ index = ~index;
+ arrayInsert2(keyValueArray, index, key, value);
+ }
+ return index;
+}
+/**
+ * Retrieve a `value` for a `key` (on `undefined` if not found.)
+ *
+ * @param keyValueArray to search.
+ * @param key The key to locate.
+ * @return The `value` stored at the `key` location or `undefined if not found.
+ */
+function keyValueArrayGet(keyValueArray, key) {
+ const index = keyValueArrayIndexOf(keyValueArray, key);
+ if (index >= 0) {
+ // if we found it retrieve it.
+ return keyValueArray[index | 1];
+ }
+ return undefined;
+}
+/**
+ * Retrieve a `key` index value in the array or `-1` if not found.
+ *
+ * @param keyValueArray to search.
+ * @param key The key to locate.
+ * @returns index of where the key is (or should have been.)
+ * - positive (even) index if key found.
+ * - negative index if key not found. (`~index` (even) to get the index where it should have
+ * been inserted.)
+ */
+function keyValueArrayIndexOf(keyValueArray, key) {
+ return _arrayIndexOfSorted(keyValueArray, key, 1);
+}
+/**
+ * Delete a `key` (and `value`) from the `KeyValueArray`.
+ *
+ * @param keyValueArray to modify.
+ * @param key The key to locate or delete (if exist).
+ * @returns index of where the key was (or should have been.)
+ * - positive (even) index if key found and deleted.
+ * - negative index if key not found. (`~index` (even) to get the index where it should have
+ * been.)
+ */
+function keyValueArrayDelete(keyValueArray, key) {
+ const index = keyValueArrayIndexOf(keyValueArray, key);
+ if (index >= 0) {
+ // if we found it remove it.
+ arraySplice(keyValueArray, index, 2);
+ }
+ return index;
+}
+/**
+ * INTERNAL: Get an index of an `value` in a sorted `array` by grouping search by `shift`.
+ *
+ * NOTE:
+ * - This uses binary search algorithm for fast removals.
+ *
+ * @param array A sorted array to binary search.
+ * @param value The value to look for.
+ * @param shift grouping shift.
+ * - `0` means look at every location
+ * - `1` means only look at every other (even) location (the odd locations are to be ignored as
+ * they are values.)
+ * @returns index of the value.
+ * - positive index if value found.
+ * - negative index if value not found. (`~index` to get the value where it should have been
+ * inserted)
+ */
+function _arrayIndexOfSorted(array, value, shift) {
+ ngDevMode && assertEqual(Array.isArray(array), true, 'Expecting an array');
+ let start = 0;
+ let end = array.length >> shift;
+ while (end !== start) {
+ const middle = start + ((end - start) >> 1); // find the middle.
+ const current = array[middle << shift];
+ if (value === current) {
+ return (middle << shift);
+ }
+ else if (current > value) {
+ end = middle;
+ }
+ else {
+ start = middle + 1; // We already searched middle so make it non-inclusive by adding 1
+ }
+ }
+ return ~(end << shift);
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/*
+ * #########################
+ * Attention: These Regular expressions have to hold even if the code is minified!
+ * ##########################
+ */
+/**
+ * Regular expression that detects pass-through constructors for ES5 output. This Regex
+ * intends to capture the common delegation pattern emitted by TypeScript and Babel. Also
+ * it intends to capture the pattern where existing constructors have been downleveled from
+ * ES2015 to ES5 using TypeScript w/ downlevel iteration. e.g.
+ *
+ * ```
+ * function MyClass() {
+ * var _this = _super.apply(this, arguments) || this;
+ * ```
+ *
+ * ```
+ * function MyClass() {
+ * var _this = _super.apply(this, __spread(arguments)) || this;
+ * ```
+ *
+ * More details can be found in: https://github.com/angular/angular/issues/38453.
+ */
+const ES5_DELEGATE_CTOR = /^function\s+\S+\(\)\s*{[\s\S]+\.apply\(this,\s*(arguments|[^()]+\(arguments\))\)/;
+/** Regular expression that detects ES2015 classes which extend from other classes. */
+const ES2015_INHERITED_CLASS = /^class\s+[A-Za-z\d$_]*\s*extends\s+[^{]+{/;
+/**
+ * Regular expression that detects ES2015 classes which extend from other classes and
+ * have an explicit constructor defined.
+ */
+const ES2015_INHERITED_CLASS_WITH_CTOR = /^class\s+[A-Za-z\d$_]*\s*extends\s+[^{]+{[\s\S]*constructor\s*\(/;
+/**
+ * Regular expression that detects ES2015 classes which extend from other classes
+ * and inherit a constructor.
+ */
+const ES2015_INHERITED_CLASS_WITH_DELEGATE_CTOR = /^class\s+[A-Za-z\d$_]*\s*extends\s+[^{]+{[\s\S]*constructor\s*\(\)\s*{\s*super\(\.\.\.arguments\)/;
+/**
+ * Determine whether a stringified type is a class which delegates its constructor
+ * to its parent.
+ *
+ * This is not trivial since compiled code can actually contain a constructor function
+ * even if the original source code did not. For instance, when the child class contains
+ * an initialized instance property.
+ */
+function isDelegateCtor(typeStr) {
+ return ES5_DELEGATE_CTOR.test(typeStr) ||
+ ES2015_INHERITED_CLASS_WITH_DELEGATE_CTOR.test(typeStr) ||
+ (ES2015_INHERITED_CLASS.test(typeStr) && !ES2015_INHERITED_CLASS_WITH_CTOR.test(typeStr));
+}
+class ReflectionCapabilities {
+ constructor(reflect) {
+ this._reflect = reflect || _global['Reflect'];
+ }
+ isReflectionEnabled() {
+ return true;
+ }
+ factory(t) {
+ return (...args) => new t(...args);
+ }
+ /** @internal */
+ _zipTypesAndAnnotations(paramTypes, paramAnnotations) {
+ let result;
+ if (typeof paramTypes === 'undefined') {
+ result = newArray(paramAnnotations.length);
+ }
+ else {
+ result = newArray(paramTypes.length);
+ }
+ for (let i = 0; i < result.length; i++) {
+ // TS outputs Object for parameters without types, while Traceur omits
+ // the annotations. For now we preserve the Traceur behavior to aid
+ // migration, but this can be revisited.
+ if (typeof paramTypes === 'undefined') {
+ result[i] = [];
+ }
+ else if (paramTypes[i] && paramTypes[i] != Object) {
+ result[i] = [paramTypes[i]];
+ }
+ else {
+ result[i] = [];
+ }
+ if (paramAnnotations && paramAnnotations[i] != null) {
+ result[i] = result[i].concat(paramAnnotations[i]);
+ }
+ }
+ return result;
+ }
+ _ownParameters(type, parentCtor) {
+ const typeStr = type.toString();
+ // If we have no decorators, we only have function.length as metadata.
+ // In that case, to detect whether a child class declared an own constructor or not,
+ // we need to look inside of that constructor to check whether it is
+ // just calling the parent.
+ // This also helps to work around for https://github.com/Microsoft/TypeScript/issues/12439
+ // that sets 'design:paramtypes' to []
+ // if a class inherits from another class but has no ctor declared itself.
+ if (isDelegateCtor(typeStr)) {
+ return null;
+ }
+ // Prefer the direct API.
+ if (type.parameters && type.parameters !== parentCtor.parameters) {
+ return type.parameters;
+ }
+ // API of tsickle for lowering decorators to properties on the class.
+ const tsickleCtorParams = type.ctorParameters;
+ if (tsickleCtorParams && tsickleCtorParams !== parentCtor.ctorParameters) {
+ // Newer tsickle uses a function closure
+ // Retain the non-function case for compatibility with older tsickle
+ const ctorParameters = typeof tsickleCtorParams === 'function' ? tsickleCtorParams() : tsickleCtorParams;
+ const paramTypes = ctorParameters.map((ctorParam) => ctorParam && ctorParam.type);
+ const paramAnnotations = ctorParameters.map((ctorParam) => ctorParam && convertTsickleDecoratorIntoMetadata(ctorParam.decorators));
+ return this._zipTypesAndAnnotations(paramTypes, paramAnnotations);
+ }
+ // API for metadata created by invoking the decorators.
+ const paramAnnotations = type.hasOwnProperty(PARAMETERS) && type[PARAMETERS];
+ const paramTypes = this._reflect && this._reflect.getOwnMetadata &&
+ this._reflect.getOwnMetadata('design:paramtypes', type);
+ if (paramTypes || paramAnnotations) {
+ return this._zipTypesAndAnnotations(paramTypes, paramAnnotations);
+ }
+ // If a class has no decorators, at least create metadata
+ // based on function.length.
+ // Note: We know that this is a real constructor as we checked
+ // the content of the constructor above.
+ return newArray(type.length);
+ }
+ parameters(type) {
+ // Note: only report metadata if we have at least one class decorator
+ // to stay in sync with the static reflector.
+ if (!isType(type)) {
+ return [];
+ }
+ const parentCtor = getParentCtor(type);
+ let parameters = this._ownParameters(type, parentCtor);
+ if (!parameters && parentCtor !== Object) {
+ parameters = this.parameters(parentCtor);
+ }
+ return parameters || [];
+ }
+ _ownAnnotations(typeOrFunc, parentCtor) {
+ // Prefer the direct API.
+ if (typeOrFunc.annotations && typeOrFunc.annotations !== parentCtor.annotations) {
+ let annotations = typeOrFunc.annotations;
+ if (typeof annotations === 'function' && annotations.annotations) {
+ annotations = annotations.annotations;
+ }
+ return annotations;
+ }
+ // API of tsickle for lowering decorators to properties on the class.
+ if (typeOrFunc.decorators && typeOrFunc.decorators !== parentCtor.decorators) {
+ return convertTsickleDecoratorIntoMetadata(typeOrFunc.decorators);
+ }
+ // API for metadata created by invoking the decorators.
+ if (typeOrFunc.hasOwnProperty(ANNOTATIONS)) {
+ return typeOrFunc[ANNOTATIONS];
+ }
+ return null;
+ }
+ annotations(typeOrFunc) {
+ if (!isType(typeOrFunc)) {
+ return [];
+ }
+ const parentCtor = getParentCtor(typeOrFunc);
+ const ownAnnotations = this._ownAnnotations(typeOrFunc, parentCtor) || [];
+ const parentAnnotations = parentCtor !== Object ? this.annotations(parentCtor) : [];
+ return parentAnnotations.concat(ownAnnotations);
+ }
+ _ownPropMetadata(typeOrFunc, parentCtor) {
+ // Prefer the direct API.
+ if (typeOrFunc.propMetadata &&
+ typeOrFunc.propMetadata !== parentCtor.propMetadata) {
+ let propMetadata = typeOrFunc.propMetadata;
+ if (typeof propMetadata === 'function' && propMetadata.propMetadata) {
+ propMetadata = propMetadata.propMetadata;
+ }
+ return propMetadata;
+ }
+ // API of tsickle for lowering decorators to properties on the class.
+ if (typeOrFunc.propDecorators &&
+ typeOrFunc.propDecorators !== parentCtor.propDecorators) {
+ const propDecorators = typeOrFunc.propDecorators;
+ const propMetadata = {};
+ Object.keys(propDecorators).forEach(prop => {
+ propMetadata[prop] = convertTsickleDecoratorIntoMetadata(propDecorators[prop]);
+ });
+ return propMetadata;
+ }
+ // API for metadata created by invoking the decorators.
+ if (typeOrFunc.hasOwnProperty(PROP_METADATA)) {
+ return typeOrFunc[PROP_METADATA];
+ }
+ return null;
+ }
+ propMetadata(typeOrFunc) {
+ if (!isType(typeOrFunc)) {
+ return {};
+ }
+ const parentCtor = getParentCtor(typeOrFunc);
+ const propMetadata = {};
+ if (parentCtor !== Object) {
+ const parentPropMetadata = this.propMetadata(parentCtor);
+ Object.keys(parentPropMetadata).forEach((propName) => {
+ propMetadata[propName] = parentPropMetadata[propName];
+ });
+ }
+ const ownPropMetadata = this._ownPropMetadata(typeOrFunc, parentCtor);
+ if (ownPropMetadata) {
+ Object.keys(ownPropMetadata).forEach((propName) => {
+ const decorators = [];
+ if (propMetadata.hasOwnProperty(propName)) {
+ decorators.push(...propMetadata[propName]);
+ }
+ decorators.push(...ownPropMetadata[propName]);
+ propMetadata[propName] = decorators;
+ });
+ }
+ return propMetadata;
+ }
+ ownPropMetadata(typeOrFunc) {
+ if (!isType(typeOrFunc)) {
+ return {};
+ }
+ return this._ownPropMetadata(typeOrFunc, getParentCtor(typeOrFunc)) || {};
+ }
+ hasLifecycleHook(type, lcProperty) {
+ return type instanceof Type && lcProperty in type.prototype;
+ }
+ guards(type) {
+ return {};
+ }
+ getter(name) {
+ return new Function('o', 'return o.' + name + ';');
+ }
+ setter(name) {
+ return new Function('o', 'v', 'return o.' + name + ' = v;');
+ }
+ method(name) {
+ const functionBody = `if (!o.${name}) throw new Error('"${name}" is undefined');
+ return o.${name}.apply(o, args);`;
+ return new Function('o', 'args', functionBody);
+ }
+ // There is not a concept of import uri in Js, but this is useful in developing Dart applications.
+ importUri(type) {
+ // StaticSymbol
+ if (typeof type === 'object' && type['filePath']) {
+ return type['filePath'];
+ }
+ // Runtime type
+ return `./${stringify(type)}`;
+ }
+ resourceUri(type) {
+ return `./${stringify(type)}`;
+ }
+ resolveIdentifier(name, moduleUrl, members, runtime) {
+ return runtime;
+ }
+ resolveEnum(enumIdentifier, name) {
+ return enumIdentifier[name];
+ }
+}
+function convertTsickleDecoratorIntoMetadata(decoratorInvocations) {
+ if (!decoratorInvocations) {
+ return [];
+ }
+ return decoratorInvocations.map(decoratorInvocation => {
+ const decoratorType = decoratorInvocation.type;
+ const annotationCls = decoratorType.annotationCls;
+ const annotationArgs = decoratorInvocation.args ? decoratorInvocation.args : [];
+ return new annotationCls(...annotationArgs);
+ });
+}
+function getParentCtor(ctor) {
+ const parentProto = ctor.prototype ? Object.getPrototypeOf(ctor.prototype) : null;
+ const parentCtor = parentProto ? parentProto.constructor : null;
+ // Note: We always use `Object` as the null value
+ // to simplify checking later on.
+ return parentCtor || Object;
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+const _THROW_IF_NOT_FOUND = {};
+const THROW_IF_NOT_FOUND = _THROW_IF_NOT_FOUND;
+/*
+ * Name of a property (that we patch onto DI decorator), which is used as an annotation of which
+ * InjectFlag this decorator represents. This allows to avoid direct references to the DI decorators
+ * in the code, thus making them tree-shakable.
+ */
+const DI_DECORATOR_FLAG = '__NG_DI_FLAG__';
+const NG_TEMP_TOKEN_PATH = 'ngTempTokenPath';
+const NG_TOKEN_PATH = 'ngTokenPath';
+const NEW_LINE = /\n/gm;
+const NO_NEW_LINE = 'ɵ';
+const SOURCE = '__source';
+const ɵ0$2 = getClosureSafeProperty;
+const USE_VALUE = getClosureSafeProperty({ provide: String, useValue: ɵ0$2 });
+/**
+ * Current injector value used by `inject`.
+ * - `undefined`: it is an error to call `inject`
+ * - `null`: `inject` can be called but there is no injector (limp-mode).
+ * - Injector instance: Use the injector for resolution.
+ */
+let _currentInjector = undefined;
+function setCurrentInjector(injector) {
+ const former = _currentInjector;
+ _currentInjector = injector;
+ return former;
+}
+function injectInjectorOnly(token, flags = InjectFlags.Default) {
+ if (_currentInjector === undefined) {
+ throw new Error(`inject() must be called from an injection context`);
+ }
+ else if (_currentInjector === null) {
+ return injectRootLimpMode(token, undefined, flags);
+ }
+ else {
+ return _currentInjector.get(token, flags & InjectFlags.Optional ? null : undefined, flags);
+ }
+}
+function ɵɵinject(token, flags = InjectFlags.Default) {
+ return (getInjectImplementation() || injectInjectorOnly)(resolveForwardRef(token), flags);
+}
+/**
+ * Throws an error indicating that a factory function could not be generated by the compiler for a
+ * particular class.
+ *
+ * This instruction allows the actual error message to be optimized away when ngDevMode is turned
+ * off, saving bytes of generated code while still providing a good experience in dev mode.
+ *
+ * The name of the class is not mentioned here, but will be in the generated factory function name
+ * and thus in the stack trace.
+ *
+ * @codeGenApi
+ */
+function ɵɵinvalidFactoryDep(index) {
+ const msg = ngDevMode ?
+ `This constructor is not compatible with Angular Dependency Injection because its dependency at index ${index} of the parameter list is invalid.
+This can happen if the dependency type is a primitive like a string or if an ancestor of this class is missing an Angular decorator.
+
+Please check that 1) the type for the parameter at index ${index} is correct and 2) the correct Angular decorators are defined for this class and its ancestors.` :
+ 'invalid';
+ throw new Error(msg);
+}
+/**
+ * Injects a token from the currently active injector.
+ *
+ * Must be used in the context of a factory function such as one defined for an
+ * `InjectionToken`. Throws an error if not called from such a context.
+ *
+ * Within such a factory function, using this function to request injection of a dependency
+ * is faster and more type-safe than providing an additional array of dependencies
+ * (as has been common with `useFactory` providers).
+ *
+ * @param token The injection token for the dependency to be injected.
+ * @param flags Optional flags that control how injection is executed.
+ * The flags correspond to injection strategies that can be specified with
+ * parameter decorators `@Host`, `@Self`, `@SkipSef`, and `@Optional`.
+ * @returns the injected value if injection is successful, `null` otherwise.
+ *
+ * @usageNotes
+ *
+ * ### Example
+ *
+ * {@example core/di/ts/injector_spec.ts region='ShakableInjectionToken'}
+ *
+ * @publicApi
+ */
+const inject = ɵɵinject;
+function injectArgs(types) {
+ const args = [];
+ for (let i = 0; i < types.length; i++) {
+ const arg = resolveForwardRef(types[i]);
+ if (Array.isArray(arg)) {
+ if (arg.length === 0) {
+ throw new Error('Arguments array must have arguments.');
+ }
+ let type = undefined;
+ let flags = InjectFlags.Default;
+ for (let j = 0; j < arg.length; j++) {
+ const meta = arg[j];
+ const flag = getInjectFlag(meta);
+ if (typeof flag === 'number') {
+ // Special case when we handle @Inject decorator.
+ if (flag === -1 /* Inject */) {
+ type = meta.token;
+ }
+ else {
+ flags |= flag;
+ }
+ }
+ else {
+ type = meta;
+ }
+ }
+ args.push(ɵɵinject(type, flags));
+ }
+ else {
+ args.push(ɵɵinject(arg));
+ }
+ }
+ return args;
+}
+/**
+ * Attaches a given InjectFlag to a given decorator using monkey-patching.
+ * Since DI decorators can be used in providers `deps` array (when provider is configured using
+ * `useFactory`) without initialization (e.g. `Host`) and as an instance (e.g. `new Host()`), we
+ * attach the flag to make it available both as a static property and as a field on decorator
+ * instance.
+ *
+ * @param decorator Provided DI decorator.
+ * @param flag InjectFlag that should be applied.
+ */
+function attachInjectFlag(decorator, flag) {
+ decorator[DI_DECORATOR_FLAG] = flag;
+ decorator.prototype[DI_DECORATOR_FLAG] = flag;
+ return decorator;
+}
+/**
+ * Reads monkey-patched property that contains InjectFlag attached to a decorator.
+ *
+ * @param token Token that may contain monkey-patched DI flags property.
+ */
+function getInjectFlag(token) {
+ return token[DI_DECORATOR_FLAG];
+}
+function catchInjectorError(e, token, injectorErrorName, source) {
+ const tokenPath = e[NG_TEMP_TOKEN_PATH];
+ if (token[SOURCE]) {
+ tokenPath.unshift(token[SOURCE]);
+ }
+ e.message = formatError('\n' + e.message, tokenPath, injectorErrorName, source);
+ e[NG_TOKEN_PATH] = tokenPath;
+ e[NG_TEMP_TOKEN_PATH] = null;
+ throw e;
+}
+function formatError(text, obj, injectorErrorName, source = null) {
+ text = text && text.charAt(0) === '\n' && text.charAt(1) == NO_NEW_LINE ? text.substr(2) : text;
+ let context = stringify(obj);
+ if (Array.isArray(obj)) {
+ context = obj.map(stringify).join(' -> ');
+ }
+ else if (typeof obj === 'object') {
+ let parts = [];
+ for (let key in obj) {
+ if (obj.hasOwnProperty(key)) {
+ let value = obj[key];
+ parts.push(key + ':' + (typeof value === 'string' ? JSON.stringify(value) : stringify(value)));
+ }
+ }
+ context = `{${parts.join(', ')}}`;
+ }
+ return `${injectorErrorName}${source ? '(' + source + ')' : ''}[${context}]: ${text.replace(NEW_LINE, '\n ')}`;
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+const ɵ0$3 = (token) => ({ token });
+/**
+ * Inject decorator and metadata.
+ *
+ * @Annotation
+ * @publicApi
+ */
+const Inject = attachInjectFlag(
+// Disable tslint because `DecoratorFlags` is a const enum which gets inlined.
+// tslint:disable-next-line: no-toplevel-property-access
+makeParamDecorator('Inject', ɵ0$3), -1 /* Inject */);
+/**
+ * Optional decorator and metadata.
+ *
+ * @Annotation
+ * @publicApi
+ */
+const Optional =
+// Disable tslint because `InternalInjectFlags` is a const enum which gets inlined.
+// tslint:disable-next-line: no-toplevel-property-access
+attachInjectFlag(makeParamDecorator('Optional'), 8 /* Optional */);
+/**
+ * Self decorator and metadata.
+ *
+ * @Annotation
+ * @publicApi
+ */
+const Self =
+// Disable tslint because `InternalInjectFlags` is a const enum which gets inlined.
+// tslint:disable-next-line: no-toplevel-property-access
+attachInjectFlag(makeParamDecorator('Self'), 2 /* Self */);
+/**
+ * `SkipSelf` decorator and metadata.
+ *
+ * @Annotation
+ * @publicApi
+ */
+const SkipSelf =
+// Disable tslint because `InternalInjectFlags` is a const enum which gets inlined.
+// tslint:disable-next-line: no-toplevel-property-access
+attachInjectFlag(makeParamDecorator('SkipSelf'), 4 /* SkipSelf */);
+/**
+ * Host decorator and metadata.
+ *
+ * @Annotation
+ * @publicApi
+ */
+const Host =
+// Disable tslint because `InternalInjectFlags` is a const enum which gets inlined.
+// tslint:disable-next-line: no-toplevel-property-access
+attachInjectFlag(makeParamDecorator('Host'), 1 /* Host */);
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+let _reflect = null;
+function getReflect() {
+ return (_reflect = _reflect || new ReflectionCapabilities());
+}
+function reflectDependencies(type) {
+ return convertDependencies(getReflect().parameters(type));
+}
+function convertDependencies(deps) {
+ const compiler = getCompilerFacade();
+ return deps.map(dep => reflectDependency(compiler, dep));
+}
+function reflectDependency(compiler, dep) {
+ const meta = {
+ token: null,
+ host: false,
+ optional: false,
+ resolved: compiler.R3ResolvedDependencyType.Token,
+ self: false,
+ skipSelf: false,
+ };
+ function setTokenAndResolvedType(token) {
+ meta.resolved = compiler.R3ResolvedDependencyType.Token;
+ meta.token = token;
+ }
+ if (Array.isArray(dep) && dep.length > 0) {
+ for (let j = 0; j < dep.length; j++) {
+ const param = dep[j];
+ if (param === undefined) {
+ // param may be undefined if type of dep is not set by ngtsc
+ continue;
+ }
+ const proto = Object.getPrototypeOf(param);
+ if (param instanceof Optional || proto.ngMetadataName === 'Optional') {
+ meta.optional = true;
+ }
+ else if (param instanceof SkipSelf || proto.ngMetadataName === 'SkipSelf') {
+ meta.skipSelf = true;
+ }
+ else if (param instanceof Self || proto.ngMetadataName === 'Self') {
+ meta.self = true;
+ }
+ else if (param instanceof Host || proto.ngMetadataName === 'Host') {
+ meta.host = true;
+ }
+ else if (param instanceof Inject) {
+ meta.token = param.token;
+ }
+ else if (param instanceof Attribute) {
+ if (param.attributeName === undefined) {
+ throw new Error(`Attribute name must be defined.`);
+ }
+ meta.token = param.attributeName;
+ meta.resolved = compiler.R3ResolvedDependencyType.Attribute;
+ }
+ else if (param.__ChangeDetectorRef__ === true) {
+ meta.token = param;
+ meta.resolved = compiler.R3ResolvedDependencyType.ChangeDetectorRef;
+ }
+ else {
+ setTokenAndResolvedType(param);
+ }
+ }
+ }
+ else if (dep === undefined || (Array.isArray(dep) && dep.length === 0)) {
+ meta.token = undefined;
+ meta.resolved = R3ResolvedDependencyType.Invalid;
+ }
+ else {
+ setTokenAndResolvedType(dep);
+ }
+ return meta;
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * Used to resolve resource URLs on `@Component` when used with JIT compilation.
+ *
+ * Example:
+ * ```
+ * @Component({
+ * selector: 'my-comp',
+ * templateUrl: 'my-comp.html', // This requires asynchronous resolution
+ * })
+ * class MyComponent{
+ * }
+ *
+ * // Calling `renderComponent` will fail because `renderComponent` is a synchronous process
+ * // and `MyComponent`'s `@Component.templateUrl` needs to be resolved asynchronously.
+ *
+ * // Calling `resolveComponentResources()` will resolve `@Component.templateUrl` into
+ * // `@Component.template`, which allows `renderComponent` to proceed in a synchronous manner.
+ *
+ * // Use browser's `fetch()` function as the default resource resolution strategy.
+ * resolveComponentResources(fetch).then(() => {
+ * // After resolution all URLs have been converted into `template` strings.
+ * renderComponent(MyComponent);
+ * });
+ *
+ * ```
+ *
+ * NOTE: In AOT the resolution happens during compilation, and so there should be no need
+ * to call this method outside JIT mode.
+ *
+ * @param resourceResolver a function which is responsible for returning a `Promise` to the
+ * contents of the resolved URL. Browser's `fetch()` method is a good default implementation.
+ */
+function resolveComponentResources(resourceResolver) {
+ // Store all promises which are fetching the resources.
+ const componentResolved = [];
+ // Cache so that we don't fetch the same resource more than once.
+ const urlMap = new Map();
+ function cachedResourceResolve(url) {
+ let promise = urlMap.get(url);
+ if (!promise) {
+ const resp = resourceResolver(url);
+ urlMap.set(url, promise = resp.then(unwrapResponse));
+ }
+ return promise;
+ }
+ componentResourceResolutionQueue.forEach((component, type) => {
+ const promises = [];
+ if (component.templateUrl) {
+ promises.push(cachedResourceResolve(component.templateUrl).then((template) => {
+ component.template = template;
+ }));
+ }
+ const styleUrls = component.styleUrls;
+ const styles = component.styles || (component.styles = []);
+ const styleOffset = component.styles.length;
+ styleUrls && styleUrls.forEach((styleUrl, index) => {
+ styles.push(''); // pre-allocate array.
+ promises.push(cachedResourceResolve(styleUrl).then((style) => {
+ styles[styleOffset + index] = style;
+ styleUrls.splice(styleUrls.indexOf(styleUrl), 1);
+ if (styleUrls.length == 0) {
+ component.styleUrls = undefined;
+ }
+ }));
+ });
+ const fullyResolved = Promise.all(promises).then(() => componentDefResolved(type));
+ componentResolved.push(fullyResolved);
+ });
+ clearResolutionOfComponentResourcesQueue();
+ return Promise.all(componentResolved).then(() => undefined);
+}
+let componentResourceResolutionQueue = new Map();
+// Track when existing ɵcmp for a Type is waiting on resources.
+const componentDefPendingResolution = new Set();
+function maybeQueueResolutionOfComponentResources(type, metadata) {
+ if (componentNeedsResolution(metadata)) {
+ componentResourceResolutionQueue.set(type, metadata);
+ componentDefPendingResolution.add(type);
+ }
+}
+function isComponentDefPendingResolution(type) {
+ return componentDefPendingResolution.has(type);
+}
+function componentNeedsResolution(component) {
+ return !!((component.templateUrl && !component.hasOwnProperty('template')) ||
+ component.styleUrls && component.styleUrls.length);
+}
+function clearResolutionOfComponentResourcesQueue() {
+ const old = componentResourceResolutionQueue;
+ componentResourceResolutionQueue = new Map();
+ return old;
+}
+function restoreComponentResolutionQueue(queue) {
+ componentDefPendingResolution.clear();
+ queue.forEach((_, type) => componentDefPendingResolution.add(type));
+ componentResourceResolutionQueue = queue;
+}
+function isComponentResourceResolutionQueueEmpty() {
+ return componentResourceResolutionQueue.size === 0;
+}
+function unwrapResponse(response) {
+ return typeof response == 'string' ? response : response.text();
+}
+function componentDefResolved(type) {
+ componentDefPendingResolution.delete(type);
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * The Trusted Types policy, or null if Trusted Types are not
+ * enabled/supported, or undefined if the policy has not been created yet.
+ */
+let policy;
+/**
+ * Returns the Trusted Types policy, or null if Trusted Types are not
+ * enabled/supported. The first call to this function will create the policy.
+ */
+function getPolicy() {
+ if (policy === undefined) {
+ policy = null;
+ if (_global.trustedTypes) {
+ try {
+ policy = _global.trustedTypes.createPolicy('angular', {
+ createHTML: (s) => s,
+ createScript: (s) => s,
+ createScriptURL: (s) => s,
+ });
+ }
+ catch (_a) {
+ // trustedTypes.createPolicy throws if called with a name that is
+ // already registered, even in report-only mode. Until the API changes,
+ // catch the error not to break the applications functionally. In such
+ // cases, the code will fall back to using strings.
+ }
+ }
+ }
+ return policy;
+}
+/**
+ * Unsafely promote a string to a TrustedHTML, falling back to strings when
+ * Trusted Types are not available.
+ * @security This is a security-sensitive function; any use of this function
+ * must go through security review. In particular, it must be assured that the
+ * provided string will never cause an XSS vulnerability if used in a context
+ * that will be interpreted as HTML by a browser, e.g. when assigning to
+ * element.innerHTML.
+ */
+function trustedHTMLFromString(html) {
+ var _a;
+ return ((_a = getPolicy()) === null || _a === void 0 ? void 0 : _a.createHTML(html)) || html;
+}
+/**
+ * Unsafely promote a string to a TrustedScript, falling back to strings when
+ * Trusted Types are not available.
+ * @security In particular, it must be assured that the provided string will
+ * never cause an XSS vulnerability if used in a context that will be
+ * interpreted and executed as a script by a browser, e.g. when calling eval.
+ */
+function trustedScriptFromString(script) {
+ var _a;
+ return ((_a = getPolicy()) === null || _a === void 0 ? void 0 : _a.createScript(script)) || script;
+}
+/**
+ * Unsafely promote a string to a TrustedScriptURL, falling back to strings
+ * when Trusted Types are not available.
+ * @security This is a security-sensitive function; any use of this function
+ * must go through security review. In particular, it must be assured that the
+ * provided string will never cause an XSS vulnerability if used in a context
+ * that will cause a browser to load and execute a resource, e.g. when
+ * assigning to script.src.
+ */
+function trustedScriptURLFromString(url) {
+ var _a;
+ return ((_a = getPolicy()) === null || _a === void 0 ? void 0 : _a.createScriptURL(url)) || url;
+}
+/**
+ * Unsafely call the Function constructor with the given string arguments. It
+ * is only available in development mode, and should be stripped out of
+ * production code.
+ * @security This is a security-sensitive function; any use of this function
+ * must go through security review. In particular, it must be assured that it
+ * is only called from development code, as use in production code can lead to
+ * XSS vulnerabilities.
+ */
+function newTrustedFunctionForDev(...args) {
+ if (typeof ngDevMode === 'undefined') {
+ throw new Error('newTrustedFunctionForDev should never be called in production');
+ }
+ if (!_global.trustedTypes) {
+ // In environments that don't support Trusted Types, fall back to the most
+ // straightforward implementation:
+ return new Function(...args);
+ }
+ // Chrome currently does not support passing TrustedScript to the Function
+ // constructor. The following implements the workaround proposed on the page
+ // below, where the Chromium bug is also referenced:
+ // https://github.com/w3c/webappsec-trusted-types/wiki/Trusted-Types-for-function-constructor
+ const fnArgs = args.slice(0, -1).join(',');
+ const fnBody = args[args.length - 1];
+ const body = `(function anonymous(${fnArgs}
+) { ${fnBody}
+})`;
+ // Using eval directly confuses the compiler and prevents this module from
+ // being stripped out of JS binaries even if not used. The global['eval']
+ // indirection fixes that.
+ const fn = _global['eval'](trustedScriptFromString(body));
+ if (fn.bind === undefined) {
+ // Workaround for a browser bug that only exists in Chrome 83, where passing
+ // a TrustedScript to eval just returns the TrustedScript back without
+ // evaluating it. In that case, fall back to the most straightforward
+ // implementation:
+ return new Function(...args);
+ }
+ // To completely mimic the behavior of calling "new Function", two more
+ // things need to happen:
+ // 1. Stringifying the resulting function should return its source code
+ fn.toString = () => body;
+ // 2. When calling the resulting function, `this` should refer to `global`
+ return fn.bind(_global);
+ // When Trusted Types support in Function constructors is widely available,
+ // the implementation of this function can be simplified to:
+ // return new Function(...args.map(a => trustedScriptFromString(a)));
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * The Trusted Types policy, or null if Trusted Types are not
+ * enabled/supported, or undefined if the policy has not been created yet.
+ */
+let policy$1;
+/**
+ * Returns the Trusted Types policy, or null if Trusted Types are not
+ * enabled/supported. The first call to this function will create the policy.
+ */
+function getPolicy$1() {
+ if (policy$1 === undefined) {
+ policy$1 = null;
+ if (_global.trustedTypes) {
+ try {
+ policy$1 = _global.trustedTypes
+ .createPolicy('angular#unsafe-bypass', {
+ createHTML: (s) => s,
+ createScript: (s) => s,
+ createScriptURL: (s) => s,
+ });
+ }
+ catch (_a) {
+ // trustedTypes.createPolicy throws if called with a name that is
+ // already registered, even in report-only mode. Until the API changes,
+ // catch the error not to break the applications functionally. In such
+ // cases, the code will fall back to using strings.
+ }
+ }
+ }
+ return policy$1;
+}
+/**
+ * Unsafely promote a string to a TrustedHTML, falling back to strings when
+ * Trusted Types are not available.
+ * @security This is a security-sensitive function; any use of this function
+ * must go through security review. In particular, it must be assured that it
+ * is only passed strings that come directly from custom sanitizers or the
+ * bypassSecurityTrust* functions.
+ */
+function trustedHTMLFromStringBypass(html) {
+ var _a;
+ return ((_a = getPolicy$1()) === null || _a === void 0 ? void 0 : _a.createHTML(html)) || html;
+}
+/**
+ * Unsafely promote a string to a TrustedScript, falling back to strings when
+ * Trusted Types are not available.
+ * @security This is a security-sensitive function; any use of this function
+ * must go through security review. In particular, it must be assured that it
+ * is only passed strings that come directly from custom sanitizers or the
+ * bypassSecurityTrust* functions.
+ */
+function trustedScriptFromStringBypass(script) {
+ var _a;
+ return ((_a = getPolicy$1()) === null || _a === void 0 ? void 0 : _a.createScript(script)) || script;
+}
+/**
+ * Unsafely promote a string to a TrustedScriptURL, falling back to strings
+ * when Trusted Types are not available.
+ * @security This is a security-sensitive function; any use of this function
+ * must go through security review. In particular, it must be assured that it
+ * is only passed strings that come directly from custom sanitizers or the
+ * bypassSecurityTrust* functions.
+ */
+function trustedScriptURLFromStringBypass(url) {
+ var _a;
+ return ((_a = getPolicy$1()) === null || _a === void 0 ? void 0 : _a.createScriptURL(url)) || url;
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+class SafeValueImpl {
+ constructor(changingThisBreaksApplicationSecurity) {
+ this.changingThisBreaksApplicationSecurity = changingThisBreaksApplicationSecurity;
+ }
+ toString() {
+ return `SafeValue must use [property]=binding: ${this.changingThisBreaksApplicationSecurity}` +
+ ` (see https://g.co/ng/security#xss)`;
+ }
+}
+class SafeHtmlImpl extends SafeValueImpl {
+ getTypeName() {
+ return "HTML" /* Html */;
+ }
+}
+class SafeStyleImpl extends SafeValueImpl {
+ getTypeName() {
+ return "Style" /* Style */;
+ }
+}
+class SafeScriptImpl extends SafeValueImpl {
+ getTypeName() {
+ return "Script" /* Script */;
+ }
+}
+class SafeUrlImpl extends SafeValueImpl {
+ getTypeName() {
+ return "URL" /* Url */;
+ }
+}
+class SafeResourceUrlImpl extends SafeValueImpl {
+ getTypeName() {
+ return "ResourceURL" /* ResourceUrl */;
+ }
+}
+function unwrapSafeValue(value) {
+ return value instanceof SafeValueImpl ? value.changingThisBreaksApplicationSecurity :
+ value;
+}
+function allowSanitizationBypassAndThrow(value, type) {
+ const actualType = getSanitizationBypassType(value);
+ if (actualType != null && actualType !== type) {
+ // Allow ResourceURLs in URL contexts, they are strictly more trusted.
+ if (actualType === "ResourceURL" /* ResourceUrl */ && type === "URL" /* Url */)
+ return true;
+ throw new Error(`Required a safe ${type}, got a ${actualType} (see https://g.co/ng/security#xss)`);
+ }
+ return actualType === type;
+}
+function getSanitizationBypassType(value) {
+ return value instanceof SafeValueImpl && value.getTypeName() || null;
+}
+/**
+ * Mark `html` string as trusted.
+ *
+ * This function wraps the trusted string in `String` and brands it in a way which makes it
+ * recognizable to {@link htmlSanitizer} to be trusted implicitly.
+ *
+ * @param trustedHtml `html` string which needs to be implicitly trusted.
+ * @returns a `html` which has been branded to be implicitly trusted.
+ */
+function bypassSanitizationTrustHtml(trustedHtml) {
+ return new SafeHtmlImpl(trustedHtml);
+}
+/**
+ * Mark `style` string as trusted.
+ *
+ * This function wraps the trusted string in `String` and brands it in a way which makes it
+ * recognizable to {@link styleSanitizer} to be trusted implicitly.
+ *
+ * @param trustedStyle `style` string which needs to be implicitly trusted.
+ * @returns a `style` hich has been branded to be implicitly trusted.
+ */
+function bypassSanitizationTrustStyle(trustedStyle) {
+ return new SafeStyleImpl(trustedStyle);
+}
+/**
+ * Mark `script` string as trusted.
+ *
+ * This function wraps the trusted string in `String` and brands it in a way which makes it
+ * recognizable to {@link scriptSanitizer} to be trusted implicitly.
+ *
+ * @param trustedScript `script` string which needs to be implicitly trusted.
+ * @returns a `script` which has been branded to be implicitly trusted.
+ */
+function bypassSanitizationTrustScript(trustedScript) {
+ return new SafeScriptImpl(trustedScript);
+}
+/**
+ * Mark `url` string as trusted.
+ *
+ * This function wraps the trusted string in `String` and brands it in a way which makes it
+ * recognizable to {@link urlSanitizer} to be trusted implicitly.
+ *
+ * @param trustedUrl `url` string which needs to be implicitly trusted.
+ * @returns a `url` which has been branded to be implicitly trusted.
+ */
+function bypassSanitizationTrustUrl(trustedUrl) {
+ return new SafeUrlImpl(trustedUrl);
+}
+/**
+ * Mark `url` string as trusted.
+ *
+ * This function wraps the trusted string in `String` and brands it in a way which makes it
+ * recognizable to {@link resourceUrlSanitizer} to be trusted implicitly.
+ *
+ * @param trustedResourceUrl `url` string which needs to be implicitly trusted.
+ * @returns a `url` which has been branded to be implicitly trusted.
+ */
+function bypassSanitizationTrustResourceUrl(trustedResourceUrl) {
+ return new SafeResourceUrlImpl(trustedResourceUrl);
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * This helper is used to get hold of an inert tree of DOM elements containing dirty HTML
+ * that needs sanitizing.
+ * Depending upon browser support we use one of two strategies for doing this.
+ * Default: DOMParser strategy
+ * Fallback: InertDocument strategy
+ */
+function getInertBodyHelper(defaultDoc) {
+ const inertDocumentHelper = new InertDocumentHelper(defaultDoc);
+ return isDOMParserAvailable() ? new DOMParserHelper(inertDocumentHelper) : inertDocumentHelper;
+}
+/**
+ * Uses DOMParser to create and fill an inert body element.
+ * This is the default strategy used in browsers that support it.
+ */
+class DOMParserHelper {
+ constructor(inertDocumentHelper) {
+ this.inertDocumentHelper = inertDocumentHelper;
+ }
+ getInertBodyElement(html) {
+ // We add these extra elements to ensure that the rest of the content is parsed as expected
+ // e.g. leading whitespace is maintained and tags like `` do not get hoisted to the
+ // `` tag. Note that the `` tag is closed implicitly to prevent unclosed tags
+ // in `html` from consuming the otherwise explicit `` tag.
+ html = '' + html;
+ try {
+ const body = new window.DOMParser()
+ .parseFromString(trustedHTMLFromString(html), 'text/html')
+ .body;
+ if (body === null) {
+ // In some browsers (e.g. Mozilla/5.0 iPad AppleWebKit Mobile) the `body` property only
+ // becomes available in the following tick of the JS engine. In that case we fall back to
+ // the `inertDocumentHelper` instead.
+ return this.inertDocumentHelper.getInertBodyElement(html);
+ }
+ body.removeChild(body.firstChild);
+ return body;
+ }
+ catch (_a) {
+ return null;
+ }
+ }
+}
+/**
+ * Use an HTML5 `template` element, if supported, or an inert body element created via
+ * `createHtmlDocument` to create and fill an inert DOM element.
+ * This is the fallback strategy if the browser does not support DOMParser.
+ */
+class InertDocumentHelper {
+ constructor(defaultDoc) {
+ this.defaultDoc = defaultDoc;
+ this.inertDocument = this.defaultDoc.implementation.createHTMLDocument('sanitization-inert');
+ if (this.inertDocument.body == null) {
+ // usually there should be only one body element in the document, but IE doesn't have any, so
+ // we need to create one.
+ const inertHtml = this.inertDocument.createElement('html');
+ this.inertDocument.appendChild(inertHtml);
+ const inertBodyElement = this.inertDocument.createElement('body');
+ inertHtml.appendChild(inertBodyElement);
+ }
+ }
+ getInertBodyElement(html) {
+ // Prefer using element if supported.
+ const templateEl = this.inertDocument.createElement('template');
+ if ('content' in templateEl) {
+ templateEl.innerHTML = trustedHTMLFromString(html);
+ return templateEl;
+ }
+ // Note that previously we used to do something like `this.inertDocument.body.innerHTML = html`
+ // and we returned the inert `body` node. This was changed, because IE seems to treat setting
+ // `innerHTML` on an inserted element differently, compared to one that hasn't been inserted
+ // yet. In particular, IE appears to split some of the text into multiple text nodes rather
+ // than keeping them in a single one which ends up messing with Ivy's i18n parsing further
+ // down the line. This has been worked around by creating a new inert `body` and using it as
+ // the root node in which we insert the HTML.
+ const inertBody = this.inertDocument.createElement('body');
+ inertBody.innerHTML = trustedHTMLFromString(html);
+ // Support: IE 11 only
+ // strip custom-namespaced attributes on IE<=11
+ if (this.defaultDoc.documentMode) {
+ this.stripCustomNsAttrs(inertBody);
+ }
+ return inertBody;
+ }
+ /**
+ * When IE11 comes across an unknown namespaced attribute e.g. 'xlink:foo' it adds 'xmlns:ns1'
+ * attribute to declare ns1 namespace and prefixes the attribute with 'ns1' (e.g.
+ * 'ns1:xlink:foo').
+ *
+ * This is undesirable since we don't want to allow any of these custom attributes. This method
+ * strips them all.
+ */
+ stripCustomNsAttrs(el) {
+ const elAttrs = el.attributes;
+ // loop backwards so that we can support removals.
+ for (let i = elAttrs.length - 1; 0 < i; i--) {
+ const attrib = elAttrs.item(i);
+ const attrName = attrib.name;
+ if (attrName === 'xmlns:ns1' || attrName.indexOf('ns1:') === 0) {
+ el.removeAttribute(attrName);
+ }
+ }
+ let childNode = el.firstChild;
+ while (childNode) {
+ if (childNode.nodeType === Node.ELEMENT_NODE)
+ this.stripCustomNsAttrs(childNode);
+ childNode = childNode.nextSibling;
+ }
+ }
+}
+/**
+ * We need to determine whether the DOMParser exists in the global context and
+ * supports parsing HTML; HTML parsing support is not as wide as other formats, see
+ * https://developer.mozilla.org/en-US/docs/Web/API/DOMParser#Browser_compatibility.
+ *
+ * @suppress {uselessCode}
+ */
+function isDOMParserAvailable() {
+ try {
+ return !!new window.DOMParser().parseFromString(trustedHTMLFromString(''), 'text/html');
+ }
+ catch (_a) {
+ return false;
+ }
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * A pattern that recognizes a commonly useful subset of URLs that are safe.
+ *
+ * This regular expression matches a subset of URLs that will not cause script
+ * execution if used in URL context within a HTML document. Specifically, this
+ * regular expression matches if (comment from here on and regex copied from
+ * Soy's EscapingConventions):
+ * (1) Either an allowed protocol (http, https, mailto or ftp).
+ * (2) or no protocol. A protocol must be followed by a colon. The below
+ * allows that by allowing colons only after one of the characters [/?#].
+ * A colon after a hash (#) must be in the fragment.
+ * Otherwise, a colon after a (?) must be in a query.
+ * Otherwise, a colon after a single solidus (/) must be in a path.
+ * Otherwise, a colon after a double solidus (//) must be in the authority
+ * (before port).
+ *
+ * The pattern disallows &, used in HTML entity declarations before
+ * one of the characters in [/?#]. This disallows HTML entities used in the
+ * protocol name, which should never happen, e.g. "http" for "http".
+ * It also disallows HTML entities in the first path part of a relative path,
+ * e.g. "foo<bar/baz". Our existing escaping functions should not produce
+ * that. More importantly, it disallows masking of a colon,
+ * e.g. "javascript:...".
+ *
+ * This regular expression was taken from the Closure sanitization library.
+ */
+const SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file|sms):|[^&:/?#]*(?:[/?#]|$))/gi;
+/* A pattern that matches safe srcset values */
+const SAFE_SRCSET_PATTERN = /^(?:(?:https?|file):|[^&:/?#]*(?:[/?#]|$))/gi;
+/** A pattern that matches safe data URLs. Only matches image, video and audio types. */
+const DATA_URL_PATTERN = /^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[a-z0-9+\/]+=*$/i;
+function _sanitizeUrl(url) {
+ url = String(url);
+ if (url.match(SAFE_URL_PATTERN) || url.match(DATA_URL_PATTERN))
+ return url;
+ if (typeof ngDevMode === 'undefined' || ngDevMode) {
+ console.warn(`WARNING: sanitizing unsafe URL value ${url} (see https://g.co/ng/security#xss)`);
+ }
+ return 'unsafe:' + url;
+}
+function sanitizeSrcset(srcset) {
+ srcset = String(srcset);
+ return srcset.split(',').map((srcset) => _sanitizeUrl(srcset.trim())).join(', ');
+}
+
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+function tagSet(tags) {
+ const res = {};
+ for (const t of tags.split(','))
+ res[t] = true;
+ return res;
+}
+function merge(...sets) {
+ const res = {};
+ for (const s of sets) {
+ for (const v in s) {
+ if (s.hasOwnProperty(v))
+ res[v] = true;
+ }
+ }
+ return res;
+}
+// Good source of info about elements and attributes
+// https://html.spec.whatwg.org/#semantics
+// https://simon.html5.org/html-elements
+// Safe Void Elements - HTML5
+// https://html.spec.whatwg.org/#void-elements
+const VOID_ELEMENTS = tagSet('area,br,col,hr,img,wbr');
+// Elements that you can, intentionally, leave open (and which close themselves)
+// https://html.spec.whatwg.org/#optional-tags
+const OPTIONAL_END_TAG_BLOCK_ELEMENTS = tagSet('colgroup,dd,dt,li,p,tbody,td,tfoot,th,thead,tr');
+const OPTIONAL_END_TAG_INLINE_ELEMENTS = tagSet('rp,rt');
+const OPTIONAL_END_TAG_ELEMENTS = merge(OPTIONAL_END_TAG_INLINE_ELEMENTS, OPTIONAL_END_TAG_BLOCK_ELEMENTS);
+// Safe Block Elements - HTML5
+const BLOCK_ELEMENTS = merge(OPTIONAL_END_TAG_BLOCK_ELEMENTS, tagSet('address,article,' +
+ 'aside,blockquote,caption,center,del,details,dialog,dir,div,dl,figure,figcaption,footer,h1,h2,h3,h4,h5,' +
+ 'h6,header,hgroup,hr,ins,main,map,menu,nav,ol,pre,section,summary,table,ul'));
+// Inline Elements - HTML5
+const INLINE_ELEMENTS = merge(OPTIONAL_END_TAG_INLINE_ELEMENTS, tagSet('a,abbr,acronym,audio,b,' +
+ 'bdi,bdo,big,br,cite,code,del,dfn,em,font,i,img,ins,kbd,label,map,mark,picture,q,ruby,rp,rt,s,' +
+ 'samp,small,source,span,strike,strong,sub,sup,time,track,tt,u,var,video'));
+const VALID_ELEMENTS = merge(VOID_ELEMENTS, BLOCK_ELEMENTS, INLINE_ELEMENTS, OPTIONAL_END_TAG_ELEMENTS);
+// Attributes that have href and hence need to be sanitized
+const URI_ATTRS = tagSet('background,cite,href,itemtype,longdesc,poster,src,xlink:href');
+// Attributes that have special href set hence need to be sanitized
+const SRCSET_ATTRS = tagSet('srcset');
+const HTML_ATTRS = tagSet('abbr,accesskey,align,alt,autoplay,axis,bgcolor,border,cellpadding,cellspacing,class,clear,color,cols,colspan,' +
+ 'compact,controls,coords,datetime,default,dir,download,face,headers,height,hidden,hreflang,hspace,' +
+ 'ismap,itemscope,itemprop,kind,label,lang,language,loop,media,muted,nohref,nowrap,open,preload,rel,rev,role,rows,rowspan,rules,' +
+ 'scope,scrolling,shape,size,sizes,span,srclang,start,summary,tabindex,target,title,translate,type,usemap,' +
+ 'valign,value,vspace,width');
+// Accessibility attributes as per WAI-ARIA 1.1 (W3C Working Draft 14 December 2018)
+const ARIA_ATTRS = tagSet('aria-activedescendant,aria-atomic,aria-autocomplete,aria-busy,aria-checked,aria-colcount,aria-colindex,' +
+ 'aria-colspan,aria-controls,aria-current,aria-describedby,aria-details,aria-disabled,aria-dropeffect,' +
+ 'aria-errormessage,aria-expanded,aria-flowto,aria-grabbed,aria-haspopup,aria-hidden,aria-invalid,' +
+ 'aria-keyshortcuts,aria-label,aria-labelledby,aria-level,aria-live,aria-modal,aria-multiline,' +
+ 'aria-multiselectable,aria-orientation,aria-owns,aria-placeholder,aria-posinset,aria-pressed,aria-readonly,' +
+ 'aria-relevant,aria-required,aria-roledescription,aria-rowcount,aria-rowindex,aria-rowspan,aria-selected,' +
+ 'aria-setsize,aria-sort,aria-valuemax,aria-valuemin,aria-valuenow,aria-valuetext');
+// NB: This currently consciously doesn't support SVG. SVG sanitization has had several security
+// issues in the past, so it seems safer to leave it out if possible. If support for binding SVG via
+// innerHTML is required, SVG attributes should be added here.
+// NB: Sanitization does not allow